@metaobjectsdev/cli 1.0.8 → 1.0.9-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/src/commands/eject.d.ts.map +1 -1
  2. package/dist/src/commands/eject.js +22 -4
  3. package/dist/src/commands/eject.js.map +1 -1
  4. package/dist/src/commands/init.d.ts.map +1 -1
  5. package/dist/src/commands/init.js +0 -3
  6. package/dist/src/commands/init.js.map +1 -1
  7. package/dist/src/commands/migrate.d.ts +1 -1
  8. package/dist/src/commands/migrate.d.ts.map +1 -1
  9. package/dist/src/commands/migrate.js +35 -22
  10. package/dist/src/commands/migrate.js.map +1 -1
  11. package/dist/src/commands/verify.d.ts +12 -0
  12. package/dist/src/commands/verify.d.ts.map +1 -1
  13. package/dist/src/commands/verify.js +102 -20
  14. package/dist/src/commands/verify.js.map +1 -1
  15. package/dist/src/index.d.ts.map +1 -1
  16. package/dist/src/index.js +5 -2
  17. package/dist/src/index.js.map +1 -1
  18. package/dist/src/lib/advisory.d.ts +19 -0
  19. package/dist/src/lib/advisory.d.ts.map +1 -1
  20. package/dist/src/lib/advisory.js +27 -0
  21. package/dist/src/lib/advisory.js.map +1 -1
  22. package/dist/src/lib/allow.d.ts +21 -1
  23. package/dist/src/lib/allow.d.ts.map +1 -1
  24. package/dist/src/lib/allow.js +62 -1
  25. package/dist/src/lib/allow.js.map +1 -1
  26. package/dist/src/lib/catalog-listing.d.ts +2 -0
  27. package/dist/src/lib/catalog-listing.d.ts.map +1 -1
  28. package/dist/src/lib/catalog-listing.js +7 -0
  29. package/dist/src/lib/catalog-listing.js.map +1 -1
  30. package/dist/src/lib/file-provider.d.ts +12 -0
  31. package/dist/src/lib/file-provider.d.ts.map +1 -1
  32. package/dist/src/lib/file-provider.js +26 -1
  33. package/dist/src/lib/file-provider.js.map +1 -1
  34. package/dist/src/lib/fk-index-advisory.d.ts +17 -0
  35. package/dist/src/lib/fk-index-advisory.d.ts.map +1 -0
  36. package/dist/src/lib/fk-index-advisory.js +77 -0
  37. package/dist/src/lib/fk-index-advisory.js.map +1 -0
  38. package/dist/src/lib/output.d.ts +9 -0
  39. package/dist/src/lib/output.d.ts.map +1 -1
  40. package/dist/src/lib/output.js +17 -3
  41. package/dist/src/lib/output.js.map +1 -1
  42. package/dist/src/lib/referential-action-advisory.d.ts +14 -0
  43. package/dist/src/lib/referential-action-advisory.d.ts.map +1 -0
  44. package/dist/src/lib/referential-action-advisory.js +38 -0
  45. package/dist/src/lib/referential-action-advisory.js.map +1 -0
  46. package/package.json +10 -10
  47. package/src/commands/eject.ts +25 -4
  48. package/src/commands/init.ts +0 -3
  49. package/src/commands/migrate.ts +32 -24
  50. package/src/commands/verify.ts +108 -18
  51. package/src/index.ts +5 -2
  52. package/src/lib/advisory.ts +33 -0
  53. package/src/lib/allow.ts +66 -2
  54. package/src/lib/catalog-listing.ts +7 -0
  55. package/src/lib/file-provider.ts +27 -1
  56. package/src/lib/fk-index-advisory.ts +112 -0
  57. package/src/lib/output.ts +25 -3
  58. package/src/lib/referential-action-advisory.ts +58 -0
@@ -1 +1 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/lib/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/lib/output.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@
4
4
  // (NEW MERGED CONFLICT UNCHANGED REFUSED) otherwise. Per SP5 §5.1.
5
5
  import { toonEncode } from "./format.js";
6
6
  import { skippedSection } from "./advisory.js";
7
+ import { blockedHintLines } from "./allow.js";
7
8
  const GEN_GLYPHS = {
8
9
  new: "✓",
9
10
  overwrite: "↻",
@@ -88,9 +89,16 @@ export function formatMigrateResult(result, _opts) {
88
89
  lines.push(` Changes: ${summary}`, "");
89
90
  }
90
91
  if (result.blocked.length > 0) {
91
- lines.push(" Blocked (re-run with --allow):");
92
+ const anyRename = result.blocked.some((b) => b.renameFlag !== undefined);
93
+ lines.push(anyRename ? " Blocked (re-run with the flag shown):" : " Blocked (re-run with --allow):");
92
94
  for (const b of result.blocked) {
93
- lines.push(` ${b.kind} ${b.description} (--allow ${b.allowFlag})`);
95
+ if (b.renameFlag === undefined) {
96
+ lines.push(` ${b.kind} ${b.description} (--allow ${b.allowFlag})`);
97
+ }
98
+ else {
99
+ for (const l of blockedHintLines(b))
100
+ lines.push(` ${l}`);
101
+ }
94
102
  }
95
103
  lines.push("");
96
104
  }
@@ -194,8 +202,14 @@ export function migrateResultToData(result) {
194
202
  let help;
195
203
  if (isBlocked) {
196
204
  summary = `${changeSummary}; not applied`;
205
+ // A rename-pairable drop leads: its `--allow` would delete the data the rename keeps.
206
+ const renames = result.blocked.filter((b) => b.renameFlag !== undefined);
207
+ const others = result.blocked.filter((b) => b.renameFlag === undefined);
197
208
  help = [
198
- ...result.blocked.map((b) => `re-run with --allow ${b.allowFlag} to apply: ${b.description}`),
209
+ ...renames.map((b) => `if ${b.description} was renamed to ${b.renameTo ?? "the added column"}, re-run with ${b.renameFlag} to keep its data` +
210
+ `${b.shapeChange !== undefined ? ` (its ${b.shapeChange} also changes: rename first, reshape in a second migration)` : ""}` +
211
+ `; --allow ${b.allowFlag} instead DELETES the column and all its data`),
212
+ ...others.map((b) => `re-run with --allow ${b.allowFlag} to apply: ${b.description}`),
199
213
  ...result.ambiguous.map((a) => `re-run with --on-ambiguous to resolve: ${a.hint}`),
200
214
  ];
201
215
  }
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/lib/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/lib/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { MetaData } from "@metaobjectsdev/metadata";
2
+ export interface ReferentialActionConflictFinding {
3
+ /** The metadata file declaring the FK-owning entity ("" when the loader recorded none). */
4
+ file: string;
5
+ /** `<entity FQN>.<reference name>` — the FK, which is where the fix is declared. */
6
+ construct: string;
7
+ message: string;
8
+ }
9
+ export interface ReferentialActionConflictOptions {
10
+ /** Skip an entity by FQN — imported (dependency) metadata is not the adopter's to fix. */
11
+ skip?: (fqn: string) => boolean;
12
+ }
13
+ export declare function scanForReferentialActionConflicts(root: MetaData, opts?: ReferentialActionConflictOptions): ReferentialActionConflictFinding[];
14
+ //# sourceMappingURL=referential-action-advisory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"referential-action-advisory.d.ts","sourceRoot":"","sources":["../../../src/lib/referential-action-advisory.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAOzD,MAAM,WAAW,gCAAgC;IAC/C,2FAA2F;IAC3F,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gCAAgC;IAC/C,0FAA0F;IAC1F,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACjC;AAED,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,QAAQ,EACd,IAAI,GAAE,gCAAqC,GAC1C,gCAAgC,EAAE,CAkBpC"}
@@ -0,0 +1,38 @@
1
+ // Two relationships over one foreign key that disagree on its referential action.
2
+ //
3
+ // A 1:N may be declared on either side — the parent (`Author` composition `books`) or the
4
+ // FK-owning child (`Book` association `author`) — and each side's subtype implies an
5
+ // ON DELETE default (composition → cascade, association → restrict). When BOTH are
6
+ // declared and disagree, the documented precedence (ADR-0047) lets the FK-owning side
7
+ // govern, so the parent's relationship has no effect on the constraint. That is a
8
+ // defensible rule and a silent one: an adopter declared a composition, read "cascade" in
9
+ // the docs, and got ON DELETE RESTRICT and a 409 with nothing saying why.
10
+ //
11
+ // Advisory, never a gate: changing the precedence would change the DDL of every model
12
+ // that relies on it. This names each such key, the action that governs, and the two
13
+ // one-line ways to say which one the author means. Read off the SAME walk that emits the
14
+ // FK (`buildExpectedSchema`'s `onReferentialActionConflict`), so it can only ever name a
15
+ // constraint migrate actually writes. `meta verify` lists them; `meta migrate` warns.
16
+ import { buildExpectedSchema, describeReferentialActionConflict, } from "@metaobjectsdev/migrate-ts";
17
+ export function scanForReferentialActionConflicts(root, opts = {}) {
18
+ const conflicts = [];
19
+ buildExpectedSchema(root, { onReferentialActionConflict: (c) => conflicts.push(c) });
20
+ const out = [];
21
+ const seen = new Set();
22
+ for (const c of conflicts) {
23
+ const fqn = c.entity.resolutionKey();
24
+ if (opts.skip?.(fqn) === true)
25
+ continue;
26
+ const construct = `${fqn}.${c.ref.name}`;
27
+ if (seen.has(construct))
28
+ continue;
29
+ seen.add(construct);
30
+ const files = "files" in c.entity.source ? c.entity.source.files : [];
31
+ // A node a shipped library contributed is the library's design, not the adopter's.
32
+ if (files.some((f) => f.startsWith("library:")))
33
+ continue;
34
+ out.push({ file: files[0] ?? "", construct, message: describeReferentialActionConflict(c) });
35
+ }
36
+ return out;
37
+ }
38
+ //# sourceMappingURL=referential-action-advisory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"referential-action-advisory.js","sourceRoot":"","sources":["../../../src/lib/referential-action-advisory.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,EAAE;AACF,0FAA0F;AAC1F,qFAAqF;AACrF,mFAAmF;AACnF,sFAAsF;AACtF,kFAAkF;AAClF,yFAAyF;AACzF,0EAA0E;AAC1E,EAAE;AACF,sFAAsF;AACtF,oFAAoF;AACpF,yFAAyF;AACzF,yFAAyF;AACzF,sFAAsF;AAGtF,OAAO,EACL,mBAAmB,EACnB,iCAAiC,GAElC,MAAM,4BAA4B,CAAC;AAepC,MAAM,UAAU,iCAAiC,CAC/C,IAAc,EACd,OAAyC,EAAE;IAE3C,MAAM,SAAS,GAAgC,EAAE,CAAC;IAClD,mBAAmB,CAAC,IAAI,EAAE,EAAE,2BAA2B,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAErF,MAAM,GAAG,GAAuC,EAAE,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI;YAAE,SAAS;QACxC,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,SAAS;QAClC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpB,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,mFAAmF;QACnF,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAAE,SAAS;QAC1D,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,iCAAiC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metaobjectsdev/cli",
3
- "version": "1.0.8",
3
+ "version": "1.0.9-rc.2",
4
4
  "description": "CLI for MetaObjects: scaffold, codegen, migrate, and drift-detection commands.",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -51,15 +51,15 @@
51
51
  "@biomejs/js-api": "^0.7.0",
52
52
  "@biomejs/wasm-nodejs": "^1.9.4",
53
53
  "@libsql/kysely-libsql": "^0.4.0",
54
- "@metaobjectsdev/codegen-ts": "1.0.8",
55
- "@metaobjectsdev/codegen-ts-react": "1.0.8",
56
- "@metaobjectsdev/codegen-ts-tanstack": "1.0.8",
57
- "@metaobjectsdev/docs-site": "1.0.8",
58
- "@metaobjectsdev/metadata": "1.0.8",
59
- "@metaobjectsdev/migrate-ts": "1.0.8",
60
- "@metaobjectsdev/render": "1.0.8",
61
- "@metaobjectsdev/runtime-ts": "1.0.8",
62
- "@metaobjectsdev/sdk": "1.0.8",
54
+ "@metaobjectsdev/codegen-ts": "1.0.9-rc.2",
55
+ "@metaobjectsdev/codegen-ts-react": "1.0.9-rc.2",
56
+ "@metaobjectsdev/codegen-ts-tanstack": "1.0.9-rc.2",
57
+ "@metaobjectsdev/docs-site": "1.0.9-rc.2",
58
+ "@metaobjectsdev/metadata": "1.0.9-rc.2",
59
+ "@metaobjectsdev/migrate-ts": "1.0.9-rc.2",
60
+ "@metaobjectsdev/render": "1.0.9-rc.2",
61
+ "@metaobjectsdev/runtime-ts": "1.0.9-rc.2",
62
+ "@metaobjectsdev/sdk": "1.0.9-rc.2",
63
63
  "@toon-format/toon": "^2.3.0",
64
64
  "jiti": "^2.4.0"
65
65
  },
@@ -24,7 +24,7 @@ import { parseEjectArgs } from "../lib/args.js";
24
24
  import { log } from "../lib/log.js";
25
25
  import { declaredDependencyNames, readPackageManifest } from "../lib/package-manifest.js";
26
26
  import { compareOwnedCopy, type OwnedComparison } from "../lib/owned-copy.js";
27
- import { composeCatalog } from "../lib/catalog.js";
27
+ import { composeCatalog, packageOf } from "../lib/catalog.js";
28
28
  import { installSetFor, type InstallSet } from "../lib/install-set.js";
29
29
  import { emitStructured, type OutputFormat } from "../lib/format.js";
30
30
  import {
@@ -55,9 +55,11 @@ interface TemplateSource {
55
55
  // runtime by selecting this entry via `names.includes(name)`. Reading from the root
56
56
  // deletes that machinery without weakening anything: membership is still checked, once,
57
57
  // where the untrusted value enters.
58
+ const CORE_CODEGEN_PACKAGE = "@metaobjectsdev/codegen-ts";
59
+
58
60
  const SOURCES: TemplateSource[] = [
59
61
  {
60
- packageName: "@metaobjectsdev/codegen-ts",
62
+ packageName: CORE_CODEGEN_PACKAGE,
61
63
  names: coreTpl.REFERENCE_GENERATOR_NAMES,
62
64
  root: coreTpl.resolveReferenceRoot,
63
65
  },
@@ -417,6 +419,13 @@ function reportLibrary(result: LibraryEjectResult): void {
417
419
  * already-copied half as "preserved" and the adopter cannot tell what happened.
418
420
  * Returns the unknown names, or an empty array.
419
421
  */
422
+ /** Where a package-only generator's factory is imported from. The core package serves
423
+ * its generator factories from the `/generators` subpath; the UI packages from the root. */
424
+ function packageFactoryPath(name: string): string {
425
+ const pkg = packageOf(name) ?? "";
426
+ return pkg === CORE_CODEGEN_PACKAGE ? `${pkg}/generators` : pkg;
427
+ }
428
+
420
429
  function unknownNames(names: readonly string[]): string[] {
421
430
  return names.filter((n) => resolveSource(n) === undefined && !isLibraryName(n));
422
431
  }
@@ -535,7 +544,19 @@ export async function ejectCommand(
535
544
  }
536
545
 
537
546
  // All-or-nothing on the names, BEFORE any write — see unknownNames().
538
- const unknown = unknownNames(flags.names);
547
+ const unmatched = unknownNames(flags.names);
548
+ // A catalog entry with no reference template is PACKAGE-ONLY, not a typo — say so,
549
+ // and say where it is imported from instead.
550
+ const packageOnly = unmatched.filter((n) => packageOf(n) !== undefined);
551
+ const unknown = unmatched.filter((n) => packageOf(n) === undefined);
552
+ if (packageOnly.length > 0) {
553
+ log.error(
554
+ `package-only generator(s): ${packageOnly.map((n) => `${n} (${packageFactoryPath(n)})`).join(", ")}. ` +
555
+ "No reference template ships for them, so they cannot be ejected: import the factory " +
556
+ "from the package named beside each one and wire it in `generators: [...]`. " +
557
+ "Nothing was ejected.",
558
+ );
559
+ }
539
560
  if (unknown.length > 0) {
540
561
  log.error(
541
562
  `unknown name(s): ${unknown.join(", ")}. Nothing was ejected. ` +
@@ -543,8 +564,8 @@ export async function ejectCommand(
543
564
  `Shipped libraries: ${ejectableLibraryNames().join(", ")}. ` +
544
565
  "Run `meta eject --list` to see them grouped.",
545
566
  );
546
- return 2;
547
567
  }
568
+ if (unmatched.length > 0) return 2;
548
569
 
549
570
  const catalog = composeCatalog();
550
571
  const rows: EjectedRow[] = [];
@@ -148,9 +148,6 @@ Next steps:
148
148
  4. meta gen # generate from exactly what you wired
149
149
  5. meta docs # neutral model + API docs (on by default)
150
150
  6. Create your tables: meta migrate --from-db --db file:dev.sqlite --dialect sqlite --slug init --apply
151
-
152
- Ship in later sub-projects: meta ingest (propose entities from existing code),
153
- meta serve (local viewer), meta install-hooks (MCP server + Claude Code hooks).
154
151
  `;
155
152
 
156
153
  export interface InitOptions {
@@ -16,7 +16,6 @@ import { loadMemoryOptionsFrom, loadMetaobjectsConfig, resolveGenConfigDir } fro
16
16
  import { collectionLoadOptions } from "../lib/collection-load-options.js";
17
17
  import { exclusionNotes, importedOption, migrateScopeMismatch } from "../lib/migrate-scope.js";
18
18
  import {
19
- allowOptionFor,
20
19
  isBlockedChangesError,
21
20
  isPrimaryKeyChangeError,
22
21
  isDeclaredRenameError,
@@ -35,7 +34,6 @@ import {
35
34
  readSnapshot,
36
35
  writeSnapshot,
37
36
  qualifiedDbName,
38
- type BlockedChangesError,
39
37
  renderD1,
40
38
  writeMigrationD1,
41
39
  writeMigrationFlyway,
@@ -62,8 +60,10 @@ import {
62
60
  type WranglerRunner,
63
61
  } from "../lib/wrangler.js";
64
62
  import { buildProjectionViews } from "@metaobjectsdev/codegen-ts";
65
- import { ALLOW_TOKEN_MAP, tokensToAllowOptions, describeChange } from "../lib/allow.js";
63
+ import { tokensToAllowOptions, blockedEntriesFor, blockedHintLines } from "../lib/allow.js";
66
64
  import { reportLoadError } from "../lib/load-error.js";
65
+ import { scanForReferentialActionConflicts } from "../lib/referential-action-advisory.js";
66
+ import type { MetaData } from "@metaobjectsdev/metadata";
67
67
 
68
68
  /**
69
69
  * Print a load failure with everything the loader's ADR-0009 envelope carried — the stable
@@ -108,6 +108,9 @@ MIGRATE FLAGS:
108
108
  drop-check,drop-view,drop-view-cascade,
109
109
  adopt-view,nullable-to-not-null,drop-identity-default,
110
110
  drop-unmanaged
111
+ drop-column DELETES the column and every value in it. If
112
+ the column was RENAMED, use --rename-column instead: it
113
+ keeps the data.
111
114
  drop-unmanaged permits dropping a table/view the committed
112
115
  snapshot never contained — one this toolchain never managed.
113
116
  Without it that drop is refused, because the migration it
@@ -235,6 +238,22 @@ function logOutOfScope(
235
238
  }
236
239
  }
237
240
 
241
+ /**
242
+ * Warn about each foreign key whose two sides declare relationships that disagree on its
243
+ * referential action — the parent's is overridden, and the DDL this run writes carries the
244
+ * child's. Advisory: it never changes the exit code, and a scan that throws is dropped
245
+ * (the schema build itself reports anything wrong with the model).
246
+ */
247
+ function warnReferentialActionConflicts(metadata: MetaData, collection: Collection): void {
248
+ let findings;
249
+ try {
250
+ findings = scanForReferentialActionConflicts(metadata, { skip: collection.imported });
251
+ } catch {
252
+ return;
253
+ }
254
+ for (const f of findings) log.warn(`migrate: ${f.message}`);
255
+ }
256
+
238
257
  function emitStructuredError(error: string, hint: string, fmt: OutputFormat): void {
239
258
  const payload = { error, hint };
240
259
  if (fmt === "json") {
@@ -436,21 +455,10 @@ async function snapshotAbsentDrops(changes: Change[], snapPath: string): Promise
436
455
  return absent;
437
456
  }
438
457
 
439
- /** The `--allow` token that unblocks `c`. migrate-ts picks the permission by what blocked the
440
- * change (a type change can be blocked by the auto-sequence default it carries), so this only
441
- * maps that permission back to its CLI token. */
442
- function allowFlagFor(c: Change): string {
443
- const option = allowOptionFor(c);
444
- const token = Object.keys(ALLOW_TOKEN_MAP).find((t) => ALLOW_TOKEN_MAP[t] === option);
445
- return token ?? c.kind;
446
- }
447
-
448
- function blockedToEntries(err: BlockedChangesError): BlockedEntry[] {
449
- return err.blocked.map((c) => ({
450
- kind: c.kind,
451
- description: describeChange(c),
452
- allowFlag: allowFlagFor(c),
453
- }));
458
+ /** Report blocked changes on stderr, one hint per change, rename-first (see `blockedHintLines`). */
459
+ function logBlocked(entries: readonly BlockedEntry[]): void {
460
+ log.error(`migrate: ${entries.length} destructive change(s) blocked; nothing written`);
461
+ for (const e of entries) for (const l of blockedHintLines(e)) log.error(`migrate: ${l}`);
454
462
  }
455
463
 
456
464
  function ambiguousToEntries(amb: AmbiguousChange[]): AmbiguousEntry[] {
@@ -695,6 +703,7 @@ export async function migrateCommand(
695
703
  reportLoadError(log, "failed to load metadata", err);
696
704
  return 2;
697
705
  }
706
+ warnReferentialActionConflicts(metadata, collection);
698
707
 
699
708
  let kysely;
700
709
  try {
@@ -873,7 +882,7 @@ export async function migrateCommand(
873
882
  });
874
883
  } catch (err) {
875
884
  if (isBlockedChangesError(err)) {
876
- blocked = blockedToEntries(err);
885
+ blocked = blockedEntriesFor(err.blocked, diffResult.changes);
877
886
  exitCode = 1;
878
887
  } else {
879
888
  throw err;
@@ -1269,6 +1278,7 @@ export async function runOfflineGenerate(
1269
1278
  reportLoadError(log, "migrate: failed to load metadata", err);
1270
1279
  return 2;
1271
1280
  }
1281
+ warnReferentialActionConflicts(metadata, collection);
1272
1282
 
1273
1283
  const offlineDialect = config.dialect;
1274
1284
  const offlineViews = buildProjectionViews(metadata, { dialect: offlineDialect, columnNamingStrategy: offlineStrategy });
@@ -1351,7 +1361,7 @@ export async function runOfflineGenerate(
1351
1361
  logOutOfScope(plan.outOfScope, plan.importedOutOfScope ?? [], fmt);
1352
1362
 
1353
1363
  if (diffResult.blocked.length > 0) {
1354
- log.error(`migrate: ${diffResult.blocked.length} destructive change(s) blocked; re-run with --allow <tokens>`);
1364
+ logBlocked(blockedEntriesFor(diffResult.blocked, diffResult.changes));
1355
1365
  return 1;
1356
1366
  }
1357
1367
  if (diffResult.changes.length === 0) {
@@ -1537,6 +1547,7 @@ async function runD1Migrate(
1537
1547
  reportLoadError(log, "migrate: failed to load metadata", err);
1538
1548
  return 2;
1539
1549
  }
1550
+ warnReferentialActionConflicts(metadata, collection);
1540
1551
 
1541
1552
  // 4. Build expected schema + introspect actual.
1542
1553
  let columnNamingStrategy: "snake_case" | "literal" | "kebab-case" = "snake_case";
@@ -1631,10 +1642,7 @@ async function runD1Migrate(
1631
1642
  emitResult = renderD1(diffResult.changes, expected, actual.meta, actual);
1632
1643
  } catch (err) {
1633
1644
  if (isBlockedChangesError(err)) {
1634
- const entries = blockedToEntries(err);
1635
- for (const e of entries) {
1636
- log.error(`migrate: blocked '${e.kind}' on ${e.description} (allow with --allow ${e.allowFlag})`);
1637
- }
1645
+ logBlocked(blockedEntriesFor(err.blocked, diffResult.changes));
1638
1646
  return 1;
1639
1647
  }
1640
1648
  throw err;
@@ -7,7 +7,7 @@
7
7
  // silently break a prompt" guarantee, enforced at the last fixed point before
8
8
  // the text ships. Required-slot misses are warnings (don't fail the build).
9
9
 
10
- import { join, resolve as resolvePath } from "node:path";
10
+ import { join, relative, resolve as resolvePath } from "node:path";
11
11
  import { parseVerifyArgs, type MigrateFlags } from "../lib/args.js";
12
12
  import { log } from "../lib/log.js";
13
13
  import { emitStructured, type OutputFormat } from "../lib/format.js";
@@ -15,15 +15,19 @@ import {
15
15
  antiPatternRows, missingBaseUrlRows, removedPropRows, ranSection, skippedSection, warnCapped,
16
16
  type AdvisoryDiagnosticRow, type AdvisoryFindingRow, type AdvisorySection,
17
17
  libraryPrefixRows,
18
+ unindexedFkRows,
19
+ referentialActionConflictRows,
18
20
  } from "../lib/advisory.js";
19
21
  import { scanForUnprovenancedLibraryPrefix } from "../lib/library-prefix-advisory.js";
22
+ import { scanForUnindexedForeignKeys, type UnindexedFkFinding } from "../lib/fk-index-advisory.js";
23
+ import { scanForReferentialActionConflicts, type ReferentialActionConflictFinding } from "../lib/referential-action-advisory.js";
20
24
  import { warnIfAgentContextStale } from "../lib/agent-context-staleness.js";
21
25
  import { warnIfManifestIgnored } from "../lib/manifest-ignored-check.js";
22
26
  import { scanSourceForAntiPatterns } from "../lib/anti-patterns.js";
23
27
  import { scanForMissingBaseUrl, type BaseUrlFinding } from "../lib/base-url-advisory.js";
24
28
  import { scanForRemovedProps, type RemovedPropFinding } from "../lib/removed-prop-advisory.js";
25
29
  import { replayRemedy } from "../lib/replay-remedy.js";
26
- import { FileProvider } from "../lib/file-provider.js";
30
+ import { FileProvider, mustacheTagLine } from "../lib/file-provider.js";
27
31
  import { derivePayloadFieldTree } from "../lib/payload-field-tree.js";
28
32
  import { loadMemoryOptionsFrom, loadMetaobjectsConfig, resolveGenCollection, resolveGenConfigDir } from "../lib/load-metaobjects-config.js";
29
33
  import { collectionLoadOptions } from "../lib/collection-load-options.js";
@@ -396,22 +400,33 @@ export async function verifyCommand(
396
400
  replayExit,
397
401
  );
398
402
 
403
+ const gates: VerifyGateRow[] = [
404
+ { gate: "templates", ran: runTemplates, ok: templateExit === 0 },
405
+ // The schema gate decides internally whether it is selected (--db, or
406
+ // --dialect d1), so "ran" is read off the same signals rather than
407
+ // restated: a payload that claims a gate ran when it did not is the
408
+ // failure mode this whole change exists to remove.
409
+ { gate: "schema", ran: ranSchemaGate, ok: schemaExit === 0 },
410
+ { gate: "codegen", ran: runCodegen, ok: codegenExit === 0 },
411
+ { gate: "docs", ran: runDocs, ok: docsExit === 0 },
412
+ { gate: "deps", ran: runDeps, ok: depsExit === 0 },
413
+ { gate: "requirements", ran: true, ok: requirementExit === 0 },
414
+ { gate: "replay", ran: flags.replay || flags.replaySnapshot, ok: replayExit === 0 },
415
+ ];
416
+
417
+ // Naming a gate runs ONLY the gates named (ADR-0021 D2), so `verify --codegen --db <url>`
418
+ // exits 0 without ever looking at the prompt templates. A green partial run must not read
419
+ // as a full one: say which gates did not run and how to select each. A bare `verify` has
420
+ // already said so in its default note above.
421
+ if (flags.anyExplicit) {
422
+ const note = notRunNote(gates);
423
+ if (note !== undefined) say(note);
424
+ }
425
+
399
426
  if (structured) {
400
427
  emitStructured(
401
428
  buildVerifyPayload({
402
- gates: [
403
- { gate: "templates", ran: runTemplates, ok: templateExit === 0 },
404
- // The schema gate decides internally whether it is selected (--db, or
405
- // --dialect d1), so "ran" is read off the same signals rather than
406
- // restated: a payload that claims a gate ran when it did not is the
407
- // failure mode this whole change exists to remove.
408
- { gate: "schema", ran: ranSchemaGate, ok: schemaExit === 0 },
409
- { gate: "codegen", ran: runCodegen, ok: codegenExit === 0 },
410
- { gate: "docs", ran: runDocs, ok: docsExit === 0 },
411
- { gate: "deps", ran: runDeps, ok: depsExit === 0 },
412
- { gate: "requirements", ran: true, ok: requirementExit === 0 },
413
- { gate: "replay", ran: flags.replay || flags.replaySnapshot, ok: replayExit === 0 },
414
- ],
429
+ gates,
415
430
  exitCode,
416
431
  requirements: requirementSection,
417
432
  requirementCounts,
@@ -839,11 +854,39 @@ export async function verifyCommand(
839
854
  // Same discipline as its siblings: an advisory scan never breaks verify.
840
855
  }
841
856
 
857
+ // Foreign keys migrate emits with no index on the referencing columns. Advisory: an
858
+ // automatic index would propose a migration to every existing adopter, so this names
859
+ // each one and says how to declare it (`index.lookup`) instead. Read off the SAME
860
+ // expected schema `meta migrate` builds, so "covered" means covered in its DDL.
861
+ let unindexedFks: UnindexedFkFinding[] = [];
862
+ try {
863
+ unindexedFks = scanForUnindexedForeignKeys(root, {
864
+ dialect: flags.dialect ?? forgeConfig?.dialect ?? "postgres",
865
+ columnNamingStrategy: forgeConfig?.columnNamingStrategy ?? "snake_case",
866
+ skip: collection.imported,
867
+ });
868
+ } catch {
869
+ // Same discipline as its siblings: an advisory scan never breaks verify. A model the
870
+ // schema builder refuses is migrate's to report, with its own message.
871
+ }
872
+
873
+ // Relationships on both sides of one FK that disagree on its ON DELETE / ON UPDATE:
874
+ // the FK-owning side governs, so the parent's (typically a composition meant to
875
+ // cascade) silently has no effect. Same discipline as its siblings.
876
+ let actionConflicts: ReferentialActionConflictFinding[] = [];
877
+ try {
878
+ actionConflicts = scanForReferentialActionConflicts(root, { skip: collection.imported });
879
+ } catch {
880
+ // advisory only — a model the schema builder refuses is migrate's to report.
881
+ }
882
+
842
883
  antiPatternSection = ranSection([
843
884
  ...antiPatternRows(findings),
844
885
  ...missingBaseUrlRows(baseUrl),
845
886
  ...removedPropRows(removedProps),
846
887
  ...libraryPrefixRows(libraryPrefix),
888
+ ...unindexedFkRows(unindexedFks),
889
+ ...referentialActionConflictRows(actionConflicts),
847
890
  ]);
848
891
  if (findings.length > 0) {
849
892
  log.warn(
@@ -866,6 +909,20 @@ export async function verifyCommand(
866
909
  );
867
910
  warnCapped(removedProps.map((f) => ` ${f.message}`), flags.limit, { structured });
868
911
  }
912
+ if (unindexedFks.length > 0) {
913
+ log.warn(
914
+ `meta verify — ${unindexedFks.length} foreign key(s) with no index on the referencing ` +
915
+ `column(s) (advisory — does not fail the build):`,
916
+ );
917
+ warnCapped(unindexedFks.map((f) => ` ${f.message}`), flags.limit, { structured });
918
+ }
919
+ if (actionConflicts.length > 0) {
920
+ log.warn(
921
+ `meta verify — ${actionConflicts.length} foreign key(s) whose two sides declare relationships ` +
922
+ `that disagree on its referential action (advisory — does not fail the build):`,
923
+ );
924
+ warnCapped(actionConflicts.map((f) => ` ${f.message}`), flags.limit, { structured });
925
+ }
869
926
  if (libraryPrefix.length > 0) {
870
927
  log.warn(
871
928
  `meta verify — ${libraryPrefix.length} node(s) declared under "metaobjects::" with ` +
@@ -987,12 +1044,22 @@ export async function verifyCommand(
987
1044
  }
988
1045
  const drift = verify(text, fieldTree, { provider, requiredSlots, requiredTags });
989
1046
  anyBodyChecked = true;
1047
+ // WHERE to look. The {code, path} diagnostic is pinned by the cross-port verify
1048
+ // corpus, so the location is added here, in the display only: the body's file
1049
+ // (project-relative) and the line the variable's tag first appears on, when the
1050
+ // tag is in this body rather than a partial.
1051
+ const bodyFile = provider.pathOf(ref);
1052
+ const where = (varPath: string): string => {
1053
+ if (bodyFile === undefined) return "";
1054
+ const line = mustacheTagLine(text, varPath);
1055
+ return ` (${relative(projectRoot, bodyFile)}${line !== undefined ? `:${line}` : ""})`;
1056
+ };
990
1057
  for (const e of drift) {
991
1058
  if (e.code === ERR_REQUIRED_SLOT_UNUSED) {
992
- log.warn(`[${tmpl.name}] (${label}) ${e.code}: ${e.path}`);
1059
+ log.warn(`[${tmpl.name}] (${label}) ${e.code}: ${e.path}${where(e.path)}`);
993
1060
  warnCount++;
994
1061
  } else {
995
- log.error(`[${tmpl.name}] (${label}) ${e.code}: ${e.path}`);
1062
+ log.error(`[${tmpl.name}] (${label}) ${e.code}: ${e.path}${where(e.path)}`);
996
1063
  errorCount++;
997
1064
  anyErrorHere = true;
998
1065
  }
@@ -1587,7 +1654,6 @@ const DRIFT_PRESENTATION: Record<Change["kind"], { glyph: string; noun: string }
1587
1654
  function summarizeDrift(changes: Change[]): string[] {
1588
1655
  return changes.map((c) => {
1589
1656
  const p = DRIFT_PRESENTATION[c.kind];
1590
- if (p === undefined) return JSON.stringify(c);
1591
1657
  return `${p.glyph} ${p.noun} ${describeChange(c)}`;
1592
1658
  });
1593
1659
  }
@@ -1617,6 +1683,30 @@ interface VerifyGateRow {
1617
1683
  ok: boolean;
1618
1684
  }
1619
1685
 
1686
+ /** The flag that selects each gate, for the "not run" note. `requirements` always runs. */
1687
+ const GATE_SELECTOR: Record<string, string> = {
1688
+ templates: "--templates",
1689
+ schema: "--db <url>",
1690
+ codegen: "--codegen",
1691
+ docs: "--docs",
1692
+ deps: "--deps",
1693
+ replay: "--replay",
1694
+ };
1695
+
1696
+ /**
1697
+ * One line naming every gate this run did NOT run, each with the flag that selects it —
1698
+ * undefined when every gate ran. Exported for its test.
1699
+ */
1700
+ export function notRunNote(gates: readonly VerifyGateRow[]): string | undefined {
1701
+ const skipped = gates.filter((g) => !g.ran);
1702
+ if (skipped.length === 0) return undefined;
1703
+ const named = skipped.map((g) => {
1704
+ const flag = GATE_SELECTOR[g.gate];
1705
+ return flag !== undefined ? `${g.gate} (${flag})` : g.gate;
1706
+ });
1707
+ return `meta verify — not run: ${named.join(", ")}`;
1708
+ }
1709
+
1620
1710
  /**
1621
1711
  * Format one `Diagnostic` as a printed TEXT line. Named `formatDiagnostic`, not
1622
1712
  * `fmt`: `fmt` is this command's OUTPUT FORMAT parameter, and a shadow of it