Offline PostgreSQL index migration review with explicit execution context
moon add cn-xjr/migration_lens@0.1.0git clone https://github.com/cn-xjr/MigrationLens.git
cd MigrationLens
moon update
moon run cmd/main -- fixtures/postgres-migrations-concurrent.sql separatemoon run cmd/main -- fixtures/batch-indexes.sql simple --json
moon run cmd/main -- fixtures/river-006-bulk-unique.sql separate
moon run scripts/e2e.mbtx wasm///|
test "quickstart distinguishes runner dispatch" {
let sql = "SET lock_timeout=100; CREATE INDEX CONCURRENTLY orders_idx ON orders(id);"
let separate = @migration_lens.review_sql(
sql,
execution=SeparateStatements,
max_lock_timeout_ms=100,
)
let whole_file = @migration_lens.review_sql(
sql,
execution=SimpleQuery,
max_lock_timeout_ms=100,
)
assert_eq(separate.exit_code(), 0)
assert_eq(whole_file.exit_code(), 1)
assert_eq(whole_file.diagnostics[0].code, "ML101")
}///|
test "quickstart restores a batch and gates new findings" {
let batch = @migration_lens.review_migrations(
[
@migration_lens.Migration::new(
"migrations/001.sql",
"DROP INDEX old_idx;",
execution=SeparateStatements,
),
][:],
)
let restored = @migration_lens.BatchReport::parse_json(
batch.to_json().stringify(),
).unwrap()
assert_eq(batch.exit_code(), 1)
assert_eq(
@migration_lens.compare_batches(batch, restored).unwrap().exit_code(),
0,
)
assert_true(restored.to_sarif() is Ok(_))
}| Area | Implemented workflow |
|---|---|
| Index rollout | CREATE/DROP INDEX, single-index REINDEX, rename and SET TABLESPACE |
| Execution state | Explicit/simple-query transactions, chaining, savepoints, rollback and release |
| Lock waiting | Session/local lock_timeout, resets, caller entry facts and maximum policy |
| Maintenance | Explicit table locks, ANALYZE, VACUUM, CLUSTER and materialized-view refresh |
| Staged constraints | Foreign keys with NOT VALID, validation, UNIQUE/PRIMARY KEY USING INDEX, SET NOT NULL |
| Tool integration | Text, v1/v2 JSON archives, SARIF 2.1.0, batch review and trusted baseline comparison |
| Entry point | Task |
|---|---|
| cmd/main | Review a UTF-8 SQL file with explicit execution mode |
| cmd/ci | Save full artifacts, check provenance and apply an optional baseline gate |
| cmd/batch | Review a strict JSON manifest with independent per-file context |
| cmd/report, cmd/report_batch | Restore saved archives and render text/JSON/SARIF |
| cmd/compare, cmd/compare_batch | Compare trusted complete baseline/current archives |
moon fmt --check
moon info
git diff --exit-code -- pkg.generated.mbti cmd docs/pkg.generated.mbti
moon check --target all --deny-warn
moon test --target wasm --deny-warn
moon test --target wasm-gc --deny-warn
moon test --target js --deny-warn
moon test --target native --deny-warnpub struct ArchiveDelta {
baseline : ReviewArchive
current : ReviewArchive
files : Array[FileDelta]
}test {
let original = @migration_lens.review_migrations(
[][:],
initial_lock_timeout_ms=100,
)
let loaded = @migration_lens.BatchReport::parse_json(
original.to_json().stringify(),
).unwrap()
assert_eq(loaded.to_json(), original.to_json())
}pub struct FileDelta {
baseline_index : Int?
current_index : Int?
introduced : Array[Diagnostic]
resolved : Array[Diagnostic]
retained : Int
}pub(all) struct Migration {
path : String
source : String
execution : Execution
initial_transaction : Bool
require_lock_timeout : Bool
max_lock_timeout_ms : Int?
}pub(all) struct Report {
source : String
statements : Int
complete : Bool
diagnostics : Array[Diagnostic]
} derive(Eq, Debug)pub struct ReportDelta {
baseline : Report
current : Report
introduced : Array[Diagnostic]
resolved : Array[Diagnostic]
retained : Int
}fn ReviewArchive::review(project : String, inputs : ArrayView[Migration], initial_lock_timeout_ms? : Int) -> Result[ReviewArchive, String]pub struct ReviewOrigin {
project : String
tool_version : String
rules_version : String
database : String
}fn compare_archives(baseline : ReviewArchive, current : ReviewArchive) -> Result[ArchiveDelta, String]test {
let inputs = [
@migration_lens.Migration::new(
"a.sql",
"DROP INDEX a;",
execution=SeparateStatements,
),
]
let batch = @migration_lens.review_migrations(inputs[:])
let delta = @migration_lens.compare_batches(batch, batch).unwrap()
assert_eq(delta.files[0].retained, 1)
assert_eq(delta.exit_code(), 0)
}test {
let before = @migration_lens.review_sql(
"DROP INDEX a;",
execution=SeparateStatements,
)
let after = @migration_lens.review_sql(
"-- shifted\nDROP INDEX a;",
execution=SeparateStatements,
)
let delta = @migration_lens.compare_reports(before, after).unwrap()
assert_eq(delta.retained, 1)
assert_eq(delta.exit_code(), 0)
}Install
Download zipOffline PostgreSQL index migration review with explicit execution context