@memberjunction/cli 6.1.0-edge.3 → 6.1.0-edge.5

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 (210) hide show
  1. package/README.md +81 -0
  2. package/dist/commands/ai/actions/list.d.ts +2 -1
  3. package/dist/commands/ai/actions/list.d.ts.map +1 -1
  4. package/dist/commands/ai/actions/list.js +12 -3
  5. package/dist/commands/ai/actions/list.js.map +1 -1
  6. package/dist/commands/ai/actions/run.d.ts +7 -6
  7. package/dist/commands/ai/actions/run.d.ts.map +1 -1
  8. package/dist/commands/ai/actions/run.js +15 -16
  9. package/dist/commands/ai/actions/run.js.map +1 -1
  10. package/dist/commands/ai/agents/list.d.ts +2 -1
  11. package/dist/commands/ai/agents/list.d.ts.map +1 -1
  12. package/dist/commands/ai/agents/list.js +12 -3
  13. package/dist/commands/ai/agents/list.js.map +1 -1
  14. package/dist/commands/ai/agents/run.d.ts +7 -6
  15. package/dist/commands/ai/agents/run.d.ts.map +1 -1
  16. package/dist/commands/ai/agents/run.js +27 -5
  17. package/dist/commands/ai/agents/run.js.map +1 -1
  18. package/dist/commands/ai/audit/agent-run.d.ts +15 -14
  19. package/dist/commands/ai/audit/agent-run.d.ts.map +1 -1
  20. package/dist/commands/ai/audit/agent-run.js +18 -6
  21. package/dist/commands/ai/audit/agent-run.js.map +1 -1
  22. package/dist/commands/ai/prompts/run.d.ts +10 -9
  23. package/dist/commands/ai/prompts/run.d.ts.map +1 -1
  24. package/dist/commands/ai/prompts/run.js +12 -3
  25. package/dist/commands/ai/prompts/run.js.map +1 -1
  26. package/dist/commands/ai/usage.d.ts +7 -0
  27. package/dist/commands/ai/usage.d.ts.map +1 -0
  28. package/dist/commands/ai/usage.js +10 -0
  29. package/dist/commands/ai/usage.js.map +1 -0
  30. package/dist/commands/app/check-updates.d.ts.map +1 -1
  31. package/dist/commands/app/check-updates.js +55 -17
  32. package/dist/commands/app/check-updates.js.map +1 -1
  33. package/dist/commands/app/remove.d.ts.map +1 -1
  34. package/dist/commands/app/remove.js +12 -4
  35. package/dist/commands/app/remove.js.map +1 -1
  36. package/dist/commands/app/usage.d.ts +7 -0
  37. package/dist/commands/app/usage.d.ts.map +1 -0
  38. package/dist/commands/app/usage.js +10 -0
  39. package/dist/commands/app/usage.js.map +1 -0
  40. package/dist/commands/artifacts/usage.d.ts +7 -0
  41. package/dist/commands/artifacts/usage.d.ts.map +1 -0
  42. package/dist/commands/artifacts/usage.js +10 -0
  43. package/dist/commands/artifacts/usage.js.map +1 -0
  44. package/dist/commands/baseline/usage.d.ts +7 -0
  45. package/dist/commands/baseline/usage.d.ts.map +1 -0
  46. package/dist/commands/baseline/usage.js +10 -0
  47. package/dist/commands/baseline/usage.js.map +1 -0
  48. package/dist/commands/bump/usage.d.ts +7 -0
  49. package/dist/commands/bump/usage.d.ts.map +1 -0
  50. package/dist/commands/bump/usage.js +10 -0
  51. package/dist/commands/bump/usage.js.map +1 -0
  52. package/dist/commands/bundle/usage.d.ts +7 -0
  53. package/dist/commands/bundle/usage.d.ts.map +1 -0
  54. package/dist/commands/bundle/usage.js +10 -0
  55. package/dist/commands/bundle/usage.js.map +1 -0
  56. package/dist/commands/clean/usage.d.ts +7 -0
  57. package/dist/commands/clean/usage.d.ts.map +1 -0
  58. package/dist/commands/clean/usage.js +10 -0
  59. package/dist/commands/clean/usage.js.map +1 -0
  60. package/dist/commands/dbdoc/usage.d.ts +7 -0
  61. package/dist/commands/dbdoc/usage.d.ts.map +1 -0
  62. package/dist/commands/dbdoc/usage.js +10 -0
  63. package/dist/commands/dbdoc/usage.js.map +1 -0
  64. package/dist/commands/dev/workspace/index.d.ts.map +1 -1
  65. package/dist/commands/dev/workspace/index.js +7 -2
  66. package/dist/commands/dev/workspace/index.js.map +1 -1
  67. package/dist/commands/doctor/usage.d.ts +7 -0
  68. package/dist/commands/doctor/usage.d.ts.map +1 -0
  69. package/dist/commands/doctor/usage.js +10 -0
  70. package/dist/commands/doctor/usage.js.map +1 -0
  71. package/dist/commands/install/index.d.ts +20 -0
  72. package/dist/commands/install/index.d.ts.map +1 -1
  73. package/dist/commands/install/index.js +80 -10
  74. package/dist/commands/install/index.js.map +1 -1
  75. package/dist/commands/install/usage.d.ts +7 -0
  76. package/dist/commands/install/usage.d.ts.map +1 -0
  77. package/dist/commands/install/usage.js +10 -0
  78. package/dist/commands/install/usage.js.map +1 -0
  79. package/dist/commands/migrate/convert.d.ts +26 -0
  80. package/dist/commands/migrate/convert.d.ts.map +1 -1
  81. package/dist/commands/migrate/convert.js +115 -13
  82. package/dist/commands/migrate/convert.js.map +1 -1
  83. package/dist/commands/migrate/index.d.ts +9 -0
  84. package/dist/commands/migrate/index.d.ts.map +1 -1
  85. package/dist/commands/migrate/index.js +41 -1
  86. package/dist/commands/migrate/index.js.map +1 -1
  87. package/dist/commands/migrate/rebake.d.ts +1 -0
  88. package/dist/commands/migrate/rebake.d.ts.map +1 -1
  89. package/dist/commands/migrate/rebake.js +16 -6
  90. package/dist/commands/migrate/rebake.js.map +1 -1
  91. package/dist/commands/migrate/usage.d.ts +7 -0
  92. package/dist/commands/migrate/usage.d.ts.map +1 -0
  93. package/dist/commands/migrate/usage.js +10 -0
  94. package/dist/commands/migrate/usage.js.map +1 -0
  95. package/dist/commands/plugin/usage.d.ts +7 -0
  96. package/dist/commands/plugin/usage.d.ts.map +1 -0
  97. package/dist/commands/plugin/usage.js +10 -0
  98. package/dist/commands/plugin/usage.js.map +1 -0
  99. package/dist/commands/querygen/usage.d.ts +7 -0
  100. package/dist/commands/querygen/usage.d.ts.map +1 -0
  101. package/dist/commands/querygen/usage.js +10 -0
  102. package/dist/commands/querygen/usage.js.map +1 -0
  103. package/dist/commands/sql-audit/usage.d.ts +7 -0
  104. package/dist/commands/sql-audit/usage.d.ts.map +1 -0
  105. package/dist/commands/sql-audit/usage.js +10 -0
  106. package/dist/commands/sql-audit/usage.js.map +1 -0
  107. package/dist/commands/sql-convert/usage.d.ts +7 -0
  108. package/dist/commands/sql-convert/usage.d.ts.map +1 -0
  109. package/dist/commands/sql-convert/usage.js +10 -0
  110. package/dist/commands/sql-convert/usage.js.map +1 -0
  111. package/dist/commands/standards/usage.d.ts +7 -0
  112. package/dist/commands/standards/usage.d.ts.map +1 -0
  113. package/dist/commands/standards/usage.js +10 -0
  114. package/dist/commands/standards/usage.js.map +1 -0
  115. package/dist/commands/sync/file-reset.d.ts +6 -6
  116. package/dist/commands/sync/file-reset.d.ts.map +1 -1
  117. package/dist/commands/sync/file-reset.js +151 -127
  118. package/dist/commands/sync/file-reset.js.map +1 -1
  119. package/dist/commands/sync/init.d.ts +10 -1
  120. package/dist/commands/sync/init.d.ts.map +1 -1
  121. package/dist/commands/sync/init.js +127 -78
  122. package/dist/commands/sync/init.js.map +1 -1
  123. package/dist/commands/test/compare.d.ts +11 -11
  124. package/dist/commands/test/compare.d.ts.map +1 -1
  125. package/dist/commands/test/compare.js +8 -7
  126. package/dist/commands/test/compare.js.map +1 -1
  127. package/dist/commands/test/history.d.ts +7 -7
  128. package/dist/commands/test/history.d.ts.map +1 -1
  129. package/dist/commands/test/history.js +8 -7
  130. package/dist/commands/test/history.js.map +1 -1
  131. package/dist/commands/test/list.d.ts +8 -8
  132. package/dist/commands/test/list.d.ts.map +1 -1
  133. package/dist/commands/test/list.js +8 -7
  134. package/dist/commands/test/list.js.map +1 -1
  135. package/dist/commands/test/regression/compare.d.ts.map +1 -1
  136. package/dist/commands/test/regression/compare.js +5 -7
  137. package/dist/commands/test/regression/compare.js.map +1 -1
  138. package/dist/commands/test/run.d.ts +9 -9
  139. package/dist/commands/test/run.d.ts.map +1 -1
  140. package/dist/commands/test/run.js +8 -7
  141. package/dist/commands/test/run.js.map +1 -1
  142. package/dist/commands/test/suite.d.ts +11 -11
  143. package/dist/commands/test/suite.d.ts.map +1 -1
  144. package/dist/commands/test/suite.js +8 -7
  145. package/dist/commands/test/suite.js.map +1 -1
  146. package/dist/commands/test/usage.d.ts +7 -0
  147. package/dist/commands/test/usage.d.ts.map +1 -0
  148. package/dist/commands/test/usage.js +10 -0
  149. package/dist/commands/test/usage.js.map +1 -0
  150. package/dist/commands/test/validate.d.ts +7 -7
  151. package/dist/commands/test/validate.d.ts.map +1 -1
  152. package/dist/commands/test/validate.js +8 -7
  153. package/dist/commands/test/validate.js.map +1 -1
  154. package/dist/commands/translate-sql/usage.d.ts +7 -0
  155. package/dist/commands/translate-sql/usage.d.ts.map +1 -0
  156. package/dist/commands/translate-sql/usage.js +10 -0
  157. package/dist/commands/translate-sql/usage.js.map +1 -0
  158. package/dist/commands/update/usage.d.ts +7 -0
  159. package/dist/commands/update/usage.d.ts.map +1 -0
  160. package/dist/commands/update/usage.js +10 -0
  161. package/dist/commands/update/usage.js.map +1 -0
  162. package/dist/commands/usage.d.ts.map +1 -1
  163. package/dist/commands/usage.js +9 -4
  164. package/dist/commands/usage.js.map +1 -1
  165. package/dist/hooks/prerun.d.ts.map +1 -1
  166. package/dist/hooks/prerun.js +63 -30
  167. package/dist/hooks/prerun.js.map +1 -1
  168. package/dist/lib/cli-plugins.d.ts +8 -1
  169. package/dist/lib/cli-plugins.d.ts.map +1 -1
  170. package/dist/lib/cli-plugins.js +17 -1
  171. package/dist/lib/cli-plugins.js.map +1 -1
  172. package/dist/lib/derived-usage.d.ts +68 -0
  173. package/dist/lib/derived-usage.d.ts.map +1 -0
  174. package/dist/lib/derived-usage.js +121 -0
  175. package/dist/lib/derived-usage.js.map +1 -0
  176. package/dist/lib/domain-profiles.d.ts +42 -0
  177. package/dist/lib/domain-profiles.d.ts.map +1 -0
  178. package/dist/lib/domain-profiles.js +118 -0
  179. package/dist/lib/domain-profiles.js.map +1 -0
  180. package/dist/lib/domain-usage-command.d.ts.map +1 -1
  181. package/dist/lib/domain-usage-command.js +9 -4
  182. package/dist/lib/domain-usage-command.js.map +1 -1
  183. package/dist/lib/format-compat.d.ts +68 -0
  184. package/dist/lib/format-compat.d.ts.map +1 -0
  185. package/dist/lib/format-compat.js +111 -0
  186. package/dist/lib/format-compat.js.map +1 -0
  187. package/dist/lib/interactive-guard.d.ts +56 -0
  188. package/dist/lib/interactive-guard.d.ts.map +1 -0
  189. package/dist/lib/interactive-guard.js +60 -0
  190. package/dist/lib/interactive-guard.js.map +1 -0
  191. package/dist/lib/legacy-install.d.ts.map +1 -1
  192. package/dist/lib/legacy-install.js +4 -0
  193. package/dist/lib/legacy-install.js.map +1 -1
  194. package/dist/lib/usage-render.d.ts +2 -2
  195. package/dist/lib/usage-render.d.ts.map +1 -1
  196. package/dist/lib/usage-render.js +2 -1
  197. package/dist/lib/usage-render.js.map +1 -1
  198. package/dist/light-commands.d.ts.map +1 -1
  199. package/dist/light-commands.js +43 -0
  200. package/dist/light-commands.js.map +1 -1
  201. package/dist/utils/open-app-context.d.ts +24 -0
  202. package/dist/utils/open-app-context.d.ts.map +1 -1
  203. package/dist/utils/open-app-context.js +21 -6
  204. package/dist/utils/open-app-context.js.map +1 -1
  205. package/dist/utils/update-check.d.ts +86 -0
  206. package/dist/utils/update-check.d.ts.map +1 -0
  207. package/dist/utils/update-check.js +98 -0
  208. package/dist/utils/update-check.js.map +1 -0
  209. package/oclif.manifest.json +4099 -3239
  210. package/package.json +21 -21
@@ -0,0 +1,10 @@
1
+ import { DomainUsageCommand } from '../../lib/domain-usage-command.js';
2
+ /** Tier-2 usage for the `doctor` domain (`mj doctor usage`). */
3
+ export default class DoctorUsage extends DomainUsageCommand {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.Domain = 'doctor';
7
+ }
8
+ static { this.description = 'Show usage, flags, examples, and runtime hints for every `mj doctor` command.'; }
9
+ }
10
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/commands/doctor/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,gEAAgE;AAChE,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,kBAAkB;IAA3D;;QAEY,WAAM,GAAG,QAAQ,CAAC;IAC9B,CAAC;aAFQ,gBAAW,GAAG,+EAA+E,AAAlF,CAAmF"}
@@ -21,6 +21,26 @@ export default class Install extends Command {
21
21
  run(): Promise<void>;
22
22
  private runEngineInstall;
23
23
  private wireEventHandlers;
24
+ /**
25
+ * Fails before the first byte is written when this run will be asked questions it
26
+ * cannot answer.
27
+ *
28
+ * Deliberately conservative: it only refuses the combination that is *guaranteed* to
29
+ * dead-end — no terminal to prompt on and no `--yes` to skip the prompts. A terminal
30
+ * run is untouched, and `--yes` is untouched, so nothing that works today starts
31
+ * failing.
32
+ */
33
+ private requireAnswerableInstall;
34
+ /**
35
+ * Terminates the install with a clean, actionable message when a prompt cannot be
36
+ * answered.
37
+ *
38
+ * `this.error()` throws, and there is no oclif frame above an emitter callback to
39
+ * catch it — so this writes the message itself and exits. An abrupt exit is the right
40
+ * trade here: the alternative is an engine blocked forever on an answer that will
41
+ * never come.
42
+ */
43
+ private abortOnPromptFailure;
24
44
  private handlePromptEvent;
25
45
  private renderHeader;
26
46
  private renderDryRun;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/install/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAe7C,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,WAAW,SAAkD;IAEpE,MAAM,CAAC,QAAQ,WAKb;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;MAiDV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAeZ,gBAAgB;IAqD9B,OAAO,CAAC,iBAAiB;YA0CX,iBAAiB;IA0C/B,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,YAAY;IA0CpB,OAAO,CAAC,cAAc;CAQvB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/install/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAqB7C,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,WAAW,SAAkD;IAEpE,MAAM,CAAC,QAAQ,WAKb;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;MAiDV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAuBZ,gBAAgB;IAmE9B,OAAO,CAAC,iBAAiB;IAwDzB;;;;;;;;OAQG;IACH,OAAO,CAAC,wBAAwB;IAahC;;;;;;;;OAQG;IACH,OAAO,CAAC,oBAAoB;YAOd,iBAAiB;IAiD/B,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,YAAY;IA0CpB,OAAO,CAAC,cAAc;CAQvB"}
@@ -3,6 +3,7 @@ import { Command, Flags } from '@oclif/core';
3
3
  import chalk from 'chalk';
4
4
  import { InstallerEngine, } from '@memberjunction/installer';
5
5
  import { LegacyInstaller } from '../../lib/legacy-install.js';
6
+ import { NonInteractiveError, failOnNonInteractive, requireInteractive, withNonInteractiveHandling, } from '../../lib/interactive-guard.js';
6
7
  export default class Install extends Command {
7
8
  static { this.description = 'Install MemberJunction from a GitHub release'; }
8
9
  static { this.examples = [
@@ -63,11 +64,16 @@ export default class Install extends Command {
63
64
  }; }
64
65
  async run() {
65
66
  const { flags } = await this.parse(Install);
66
- if (flags.legacy) {
67
- const legacy = new LegacyInstaller(this, flags.verbose ?? false);
68
- return legacy.Run();
69
- }
70
- return this.runEngineInstall(flags);
67
+ return withNonInteractiveHandling(this, async () => {
68
+ if (flags.legacy) {
69
+ // The legacy installer is a two-dozen-question wizard with no flag equivalents,
70
+ // so it is interactive by nature — refuse it up front rather than at question 1.
71
+ requireInteractive('The legacy interactive installer', 'Re-run at an interactive terminal, or drop --legacy to use the engine installer (which accepts --config).');
72
+ const legacy = new LegacyInstaller(this, flags.verbose ?? false);
73
+ return legacy.Run();
74
+ }
75
+ return this.runEngineInstall(flags);
76
+ });
71
77
  }
72
78
  // ---------------------------------------------------------------------------
73
79
  // Engine-based install
@@ -75,7 +81,8 @@ export default class Install extends Command {
75
81
  async runEngineInstall(flags) {
76
82
  const engine = new InstallerEngine();
77
83
  const fast = flags.fast ?? false;
78
- this.wireEventHandlers(engine, flags.verbose ?? false);
84
+ const yes = flags.yes ?? false;
85
+ this.wireEventHandlers(engine, flags.verbose ?? false, yes);
79
86
  const plan = await engine.CreatePlan({
80
87
  Tag: flags.tag,
81
88
  Dir: flags.dir,
@@ -88,6 +95,18 @@ export default class Install extends Command {
88
95
  this.renderDryRun(plan);
89
96
  return;
90
97
  }
98
+ // Preflight, deliberately placed here: CreatePlan is pure and --dry-run has already
99
+ // returned, so nothing has touched disk yet, and a dry run stays usable headlessly.
100
+ //
101
+ // The engine asks its questions from inside the phases — the version picker and the
102
+ // not-empty-directory confirmation both live in Scaffold — so a guard that only
103
+ // fires when a prompt is emitted fires AFTER files have been written. Refusing here
104
+ // instead leaves the target directory untouched.
105
+ //
106
+ // --yes is the condition because it is what the engine itself keys on: every prompt
107
+ // in the installer is short-circuited by it. --config alone is not enough — it can
108
+ // supply configure-phase values but does not suppress the scaffold-phase questions.
109
+ this.requireAnswerableInstall(yes);
91
110
  this.renderHeader();
92
111
  const result = await engine.Run(plan, {
93
112
  Yes: flags.yes,
@@ -103,10 +122,24 @@ export default class Install extends Command {
103
122
  // ---------------------------------------------------------------------------
104
123
  // Event wiring — bridges engine events to CLI output + inquirer prompts
105
124
  // ---------------------------------------------------------------------------
106
- wireEventHandlers(engine, verbose) {
107
- engine.On('prompt', (event) => {
108
- this.handlePromptEvent(event);
109
- });
125
+ wireEventHandlers(engine, verbose, yes) {
126
+ // Under --yes the engine installs its own catch-all prompt listener that resolves
127
+ // anything unexpected with its default — the safety net that keeps Docker and CI
128
+ // runs from hanging. Registering an interactive bridge alongside it would make the
129
+ // two fight: ours runs first, refuses (no terminal), and exits(1) before the net
130
+ // can answer, turning a working headless install into a hard failure. So under
131
+ // --yes we simply don't bridge, and the engine's net owns every prompt.
132
+ if (!yes) {
133
+ engine.On('prompt', (event) => {
134
+ // The emitter neither awaits nor catches this promise, so a rejection escaping
135
+ // here becomes an unhandled rejection — Node prints a stack trace and kills the
136
+ // process, which is exactly the opposite of the actionable error the guard inside
137
+ // handlePromptEvent is meant to produce. Catch it at the boundary. (Rejecting
138
+ // also means the event is never Resolve()d, so the engine would otherwise sit
139
+ // waiting on an answer that can never arrive.)
140
+ void this.handlePromptEvent(event).catch((e) => this.abortOnPromptFailure(e));
141
+ });
142
+ }
110
143
  engine.On('phase:start', (event) => {
111
144
  this.log(chalk.cyan(`\u25b8 ${event.Description}`));
112
145
  });
@@ -140,7 +173,44 @@ export default class Install extends Command {
140
173
  }
141
174
  });
142
175
  }
176
+ /**
177
+ * Fails before the first byte is written when this run will be asked questions it
178
+ * cannot answer.
179
+ *
180
+ * Deliberately conservative: it only refuses the combination that is *guaranteed* to
181
+ * dead-end — no terminal to prompt on and no `--yes` to skip the prompts. A terminal
182
+ * run is untouched, and `--yes` is untouched, so nothing that works today starts
183
+ * failing.
184
+ */
185
+ requireAnswerableInstall(yes) {
186
+ if (yes)
187
+ return;
188
+ try {
189
+ requireInteractive('Answers to the installer\'s setup questions (version, target directory, configuration)', 'Pass --yes to accept defaults and install the latest version unattended, adding --tag and --config to pin the version and supply settings.');
190
+ }
191
+ catch (error) {
192
+ failOnNonInteractive(this, error);
193
+ }
194
+ }
195
+ /**
196
+ * Terminates the install with a clean, actionable message when a prompt cannot be
197
+ * answered.
198
+ *
199
+ * `this.error()` throws, and there is no oclif frame above an emitter callback to
200
+ * catch it — so this writes the message itself and exits. An abrupt exit is the right
201
+ * trade here: the alternative is an engine blocked forever on an answer that will
202
+ * never come.
203
+ */
204
+ abortOnPromptFailure(error) {
205
+ const message = error instanceof Error ? error.message : String(error);
206
+ const suggestion = error instanceof NonInteractiveError ? `\nTry this: ${error.suggestion}` : '';
207
+ process.stderr.write(`${chalk.red('Error:')} ${message}${suggestion}\n`);
208
+ process.exit(1);
209
+ }
143
210
  async handlePromptEvent(event) {
211
+ // Every branch below blocks on stdin. Refuse up front when this run may not prompt,
212
+ // so the caller gets an actionable error instead of a process that never returns.
213
+ requireInteractive(`An answer to "${event.Message}"`, 'Re-run at an interactive terminal, or supply the value through mj.config.cjs / the command\'s flags.');
144
214
  let answer;
145
215
  switch (event.PromptType) {
146
216
  case 'select':
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/install/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/install/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { DomainUsageCommand } from '../../lib/domain-usage-command.js';
2
+ /** Tier-2 usage for the `install` domain (`mj install usage`). */
3
+ export default class InstallUsage extends DomainUsageCommand {
4
+ static description: string;
5
+ protected Domain: string;
6
+ }
7
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/commands/install/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,kEAAkE;AAClE,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,kBAAkB;IAC1D,MAAM,CAAC,WAAW,SAAoF;IACtG,SAAS,CAAC,MAAM,SAAa;CAC9B"}
@@ -0,0 +1,10 @@
1
+ import { DomainUsageCommand } from '../../lib/domain-usage-command.js';
2
+ /** Tier-2 usage for the `install` domain (`mj install usage`). */
3
+ export default class InstallUsage extends DomainUsageCommand {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.Domain = 'install';
7
+ }
8
+ static { this.description = 'Show usage, flags, examples, and runtime hints for every `mj install` command.'; }
9
+ }
10
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/commands/install/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,kEAAkE;AAClE,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,kBAAkB;IAA5D;;QAEY,WAAM,GAAG,SAAS,CAAC;IAC/B,CAAC;aAFQ,gBAAW,GAAG,gFAAgF,AAAnF,CAAoF"}
@@ -44,6 +44,31 @@ export declare function decideConvertWrite(result: Pick<ConvertedShape, 'status'
44
44
  * "preserved DDL below" banner over nothing.
45
45
  */
46
46
  export declare function buildConversionFailureArtifact(sourceFile: string, message: string, preservedBody: string): string;
47
+ /**
48
+ * Decide whether a legacy (non---split) convert run fails, and with what message (issue #3857).
49
+ * Pure — no I/O — so the exit policy is unit-testable apart from the oclif command.
50
+ *
51
+ * A GAP is a marker comment the converter wrote into the output where it knowingly could not
52
+ * produce SQL (`-- Could not parse: @RoleID …`). Unlike an ERROR — a throw the converter caught —
53
+ * a gap leaves the batch counted as converted, so before this gate the legacy path reported
54
+ * `Files: 1 (1 OK, 0 errors)` and exited 0 over a file PostgreSQL rejects, and nothing short of
55
+ * applying it to a real PG database caught it.
56
+ *
57
+ * Errors always fail. Gaps fail too, unless the caller explicitly accepts them with --allow-gaps
58
+ * (which until now had effect only on the --split path).
59
+ */
60
+ export declare function decideLegacyConvertExit(args: {
61
+ errorCount: number;
62
+ gapCount: number;
63
+ gapFileCount: number;
64
+ allowGaps: boolean;
65
+ }): {
66
+ fail: true;
67
+ message: string;
68
+ } | {
69
+ fail: false;
70
+ message: null;
71
+ };
47
72
  /**
48
73
  * CLI command to discover and convert T-SQL migrations to PostgreSQL.
49
74
  *
@@ -75,6 +100,7 @@ export default class MigrateConvert extends Command {
75
100
  'output-dir': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
76
101
  file: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
77
102
  schema: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
103
+ 'core-schema': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
78
104
  'dry-run': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
79
105
  'no-header': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
80
106
  verbose: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAa7C,OAAO,KAAK,EAIV,yBAAyB,EACzB,oBAAoB,EAErB,MAAM,+BAA+B,CAAC;AAMvC;;;;;GAKG;AACH,KAAK,cAAc,GAAG,IAAI,CAAC,yBAAyB,EAAE,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,gBAAgB,CAAC,GAAG;IAC3G,IAAI,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;CAC9D,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAIhC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC,EAC7D,WAAW,EAAE,OAAO,GACnB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,gBAAgB,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAKlE;AAED;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAUjH;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IACjD,MAAM,CAAC,WAAW,SAA4C;IAE9D,MAAM,CAAC,QAAQ,WAMb;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;MAmDV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA2H1B;;;;;;;;;;;OAWG;YACW,QAAQ;IA6KtB;;;;;;OAMG;YACW,eAAe;IAoC7B;;;;;;;;;OASG;YACW,UAAU;IAsDxB,+EAA+E;IAC/E,OAAO,CAAC,iBAAiB;IAwCzB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,mBAAmB;IA6C3B,OAAO,CAAC,UAAU;CAmBnB"}
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAa7C,OAAO,KAAK,EAIV,yBAAyB,EACzB,oBAAoB,EAErB,MAAM,+BAA+B,CAAC;AAYvC;;;;;GAKG;AACH,KAAK,cAAc,GAAG,IAAI,CAAC,yBAAyB,EAAE,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,gBAAgB,CAAC,GAAG;IAC3G,IAAI,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;CAC9D,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAIhC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC,EAC7D,WAAW,EAAE,OAAO,GACnB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,gBAAgB,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAKlE;AAED;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAUjH;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,CAcnE;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IACjD,MAAM,CAAC,WAAW,SAA4C;IAE9D,MAAM,CAAC,QAAQ,WAMb;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;MAyDV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAgJ1B;;;;;;;;;;;OAWG;YACW,QAAQ;IAkLtB;;;;;;OAMG;YACW,eAAe;IAoC7B;;;;;;;;;OASG;YACW,UAAU;IA6FxB,+EAA+E;IAC/E,OAAO,CAAC,iBAAiB;IAwCzB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,mBAAmB;IA6C3B,OAAO,CAAC,UAAU;CAqBnB"}
@@ -4,6 +4,11 @@ import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { convertFile, getRulesForDialects, createConversionStats, deduplicateEntityFieldSequences, convertMigration, IncrementalBaker, BakeApplyError, } from '@memberjunction/sql-converter';
6
6
  import { MJPostgresTranspiler } from '@memberjunction/sqlglot-ts';
7
+ /**
8
+ * MJ core's schema — where the boolean columns an Open App migration seeds (EntityField.AllowsNull
9
+ * and friends) actually live. The app's own schema is read from `--schema`.
10
+ */
11
+ const MJ_CORE_SCHEMA = '__mj';
7
12
  /**
8
13
  * Decide how to write and gate one per-migration conversion result (issue #3252 Phase 4d).
9
14
  * Pure — no I/O — so the write/halt policy is unit-testable apart from the oclif command.
@@ -51,6 +56,36 @@ export function buildConversionFailureArtifact(sourceFile, message, preservedBod
51
56
  `-- The transpiled DDL below is PRESERVED for hand-finishing; complete it, then rename to .pg.sql.\n\n` +
52
57
  `${preserved}\n`);
53
58
  }
59
+ /**
60
+ * Decide whether a legacy (non---split) convert run fails, and with what message (issue #3857).
61
+ * Pure — no I/O — so the exit policy is unit-testable apart from the oclif command.
62
+ *
63
+ * A GAP is a marker comment the converter wrote into the output where it knowingly could not
64
+ * produce SQL (`-- Could not parse: @RoleID …`). Unlike an ERROR — a throw the converter caught —
65
+ * a gap leaves the batch counted as converted, so before this gate the legacy path reported
66
+ * `Files: 1 (1 OK, 0 errors)` and exited 0 over a file PostgreSQL rejects, and nothing short of
67
+ * applying it to a real PG database caught it.
68
+ *
69
+ * Errors always fail. Gaps fail too, unless the caller explicitly accepts them with --allow-gaps
70
+ * (which until now had effect only on the --split path).
71
+ */
72
+ export function decideLegacyConvertExit(args) {
73
+ const reasons = [];
74
+ if (args.errorCount > 0)
75
+ reasons.push(`errors in ${args.errorCount} file(s)`);
76
+ const gapsFail = args.gapCount > 0 && !args.allowGaps;
77
+ if (gapsFail)
78
+ reasons.push(`${args.gapCount} conversion gap(s) in ${args.gapFileCount} file(s)`);
79
+ if (reasons.length === 0)
80
+ return { fail: false, message: null };
81
+ const advice = gapsFail
82
+ ? ' A gap is a marker comment (e.g. "-- Could not parse: …") left where the converter could not ' +
83
+ 'produce SQL — PostgreSQL will reject the output. Resolve the gaps (rewrite the source migration ' +
84
+ 'declaratively, hand-author the PG form, or fix the converter rule), or pass --allow-gaps to ' +
85
+ 'accept them for now.'
86
+ : '';
87
+ return { fail: true, message: `Conversion completed with ${reasons.join(' and ')}.${advice}` };
88
+ }
54
89
  /**
55
90
  * CLI command to discover and convert T-SQL migrations to PostgreSQL.
56
91
  *
@@ -99,6 +134,10 @@ export default class MigrateConvert extends Command {
99
134
  description: 'Target schema name',
100
135
  default: '__mj',
101
136
  }),
137
+ 'core-schema': Flags.string({
138
+ description: "MJ core schema substituted for ${mjSchema} (default __mj). Distinct from --schema, which is the app's OWN schema: an Open App migration references core as ${mjSchema} and itself as ${flyway:defaultSchema}, and for every app those differ.",
139
+ default: '__mj',
140
+ }),
102
141
  'dry-run': Flags.boolean({
103
142
  description: 'Show what would be converted without writing files',
104
143
  default: false,
@@ -119,8 +158,9 @@ export default class MigrateConvert extends Command {
119
158
  default: false,
120
159
  }),
121
160
  'allow-gaps': Flags.boolean({
122
- description: 'With --split: exit 0 even when migrations have conversion gaps (hand-authoring needed ' +
123
- 'or unhandled statements). Gaps are still embedded as comments and listed in the summary.',
161
+ description: 'Exit 0 even when migrations have conversion gaps — with --split: hand-authoring needed or ' +
162
+ 'unhandled statements; on the legacy path: "-- Could not parse" / "-- ERROR converting batch" ' +
163
+ 'markers in the output. Gaps are still embedded as comments and listed in the summary.',
124
164
  default: false,
125
165
  }),
126
166
  'bake-codegen': Flags.boolean({
@@ -181,6 +221,7 @@ export default class MigrateConvert extends Command {
181
221
  // Convert each file
182
222
  let successCount = 0;
183
223
  let errorCount = 0;
224
+ const gapFiles = [];
184
225
  const totalStats = createConversionStats();
185
226
  for (const migration of unconverted) {
186
227
  this.log(`Converting: ${migration.SourceFile}`);
@@ -205,7 +246,16 @@ export default class MigrateConvert extends Command {
205
246
  this.logToStderr(` ${err.substring(0, 200)}`);
206
247
  }
207
248
  }
208
- else {
249
+ // Gaps are listed the same way errors are — the whole point of issue #3857 is that a file
250
+ // the converter knowingly could not finish must not be reported as "OK".
251
+ if (result.Stats.Gaps > 0) {
252
+ gapFiles.push(migration.SourceFile);
253
+ this.logToStderr(` GAPS: ${result.Stats.Gaps} unconverted statement(s) in ${migration.SourceFile}`);
254
+ for (const gap of result.Stats.GapBatches) {
255
+ this.logToStderr(` ${gap.substring(0, 200)}`);
256
+ }
257
+ }
258
+ if (result.Stats.Errors === 0 && result.Stats.Gaps === 0) {
209
259
  successCount++;
210
260
  this.log(` OK (${result.Stats.Converted} batches, ${result.Stats.TotalBatches - result.Stats.Converted} skipped)`);
211
261
  }
@@ -213,8 +263,8 @@ export default class MigrateConvert extends Command {
213
263
  // Print summary
214
264
  this.log('');
215
265
  this.log('=== Conversion Summary ===');
216
- this.log(` Files: ${unconverted.length} (${successCount} OK, ${errorCount} errors)`);
217
- this.log(` Batches: ${totalStats.TotalBatches} total, ${totalStats.Converted} converted, ${totalStats.Skipped} skipped, ${totalStats.Errors} errors`);
266
+ this.log(` Files: ${unconverted.length} (${successCount} OK, ${errorCount} errors, ${gapFiles.length} with gaps)`);
267
+ this.log(` Batches: ${totalStats.TotalBatches} total, ${totalStats.Converted} converted, ${totalStats.Skipped} skipped, ${totalStats.Errors} errors, ${totalStats.Gaps} gaps`);
218
268
  this.log(` Tables: ${totalStats.TablesCreated}`);
219
269
  this.log(` Views: ${totalStats.ViewsCreated}`);
220
270
  this.log(` Procedures: ${totalStats.ProceduresConverted}`);
@@ -223,9 +273,6 @@ export default class MigrateConvert extends Command {
223
273
  this.log(` Indexes: ${totalStats.IndexesCreated}`);
224
274
  this.log(` Inserts: ${totalStats.InsertsConverted}`);
225
275
  this.log(` Grants: ${totalStats.GrantsConverted}`);
226
- if (errorCount > 0) {
227
- this.error(`Conversion completed with errors in ${errorCount} file(s)`);
228
- }
229
276
  // Post-conversion: deduplicate EntityField Sequence values across files
230
277
  // to prevent UQ_EntityField_EntityID_Sequence violations on PG
231
278
  this.log('\nRunning EntityField Sequence deduplication...');
@@ -239,6 +286,19 @@ export default class MigrateConvert extends Command {
239
286
  else {
240
287
  this.log(` No collisions found (${dedupResult.totalInserts} EntityField INSERTs scanned).`);
241
288
  }
289
+ // Gate LAST, after the sequence dedup fixup. `this.error` throws, and the files are already
290
+ // written: gating before the fixup would leave every output un-deduped, and a re-run skips
291
+ // them (they now have a .pg.sql counterpart), so the fixup would never get another chance.
292
+ // Errors gate here as they always did; gaps now gate too unless --allow-gaps (issue #3857).
293
+ const exit = decideLegacyConvertExit({
294
+ errorCount,
295
+ gapCount: totalStats.Gaps,
296
+ gapFileCount: gapFiles.length,
297
+ allowGaps: flags['allow-gaps'],
298
+ });
299
+ if (exit.fail) {
300
+ this.error(exit.message);
301
+ }
242
302
  }
243
303
  /**
244
304
  * Split-and-regenerate conversion (the standard path). Classification routes
@@ -268,10 +328,15 @@ export default class MigrateConvert extends Command {
268
328
  // Select the per-migration conversion: inline-baking (live DB, CodeGen baked natively) or
269
329
  // the default transpile-only path (CodeGen regenerated by `mj codegen` at deploy).
270
330
  const bakeCodegen = flags['bake-codegen'];
271
- const baker = bakeCodegen ? await this.buildBaker(transpiler, flags.schema) : null;
331
+ const baker = bakeCodegen ? await this.buildBaker(transpiler, flags.schema, flags['core-schema']) : null;
272
332
  const convertOne = (sql, fileName) => baker
273
333
  ? baker.bakeMigration(sql, fileName)
274
- : convertMigration(sql, fileName, { schema: flags.schema, includeHeader: !flags['no-header'], transpiler });
334
+ : convertMigration(sql, fileName, {
335
+ schema: flags.schema,
336
+ coreSchema: flags['core-schema'],
337
+ includeHeader: !flags['no-header'],
338
+ transpiler,
339
+ });
275
340
  if (bakeCodegen)
276
341
  this.log(`\nInline CodeGen baking ENABLED — bringing the working DB forward as each migration bakes.`);
277
342
  const converted = [];
@@ -429,7 +494,7 @@ export default class MigrateConvert extends Command {
429
494
  if (latestBaseline) {
430
495
  try {
431
496
  const cols = await probe.collectBitColumns(fs.readFileSync(path.join(sourceDir, latestBaseline), 'utf8'));
432
- bitColumns.push(...new Set(cols));
497
+ bitColumns.push(...cols);
433
498
  }
434
499
  catch (err) {
435
500
  // A baseline that fails bit-column collection degrades 1/0→TRUE/FALSE
@@ -449,7 +514,7 @@ export default class MigrateConvert extends Command {
449
514
  * codegen-lib + core are declared MJCLI deps) to keep a plain `convert --split` light. The
450
515
  * matching `import type` at the top is erased at runtime, so it does not defeat the deferral.
451
516
  */
452
- async buildBaker(transpiler, schema) {
517
+ async buildBaker(transpiler, schema, coreSchema) {
453
518
  const { RunCodeGenBase, SQLCodeGenBase, initializeConfig, dbPlatform, configInfo } = await import('@memberjunction/codegen-lib');
454
519
  if (dbPlatform() !== 'postgresql') {
455
520
  this.error('--bake-codegen requires DB_PLATFORM=postgresql with PG_* connection env (the working DB CodeGen objects are captured from).');
@@ -463,6 +528,41 @@ export default class MigrateConvert extends Command {
463
528
  this.error(`--bake-codegen could not connect/load metadata from the working PG database: ${err instanceof Error ? err.message : String(err)}. ` +
464
529
  'Seed the working DB to the baseline (its __mj views + metadata must exist) before baking.');
465
530
  }
531
+ // Seed the BIT/BOOLEAN registry from the LIVE catalog (issue #3839).
532
+ //
533
+ // buildTranspiler() collects BIT columns from the migration set's own baseline, which declares
534
+ // the app's tables and never MJ core's. A migration that seeds `__mj.EntityField` therefore had
535
+ // no type information for AllowsNull / IsVirtual / IsPrimaryKey, so BIT 0/1 reached a
536
+ // PostgreSQL BOOLEAN column and the apply failed with
537
+ // column "AllowsNull" is of type boolean but expression is of type integer
538
+ // which — because the bake applies as it advances — halted the whole chain.
539
+ //
540
+ // The working database is authoritative and version-correct, which a checked-in column map is
541
+ // not: the copies in the bizapps repos are generated against core 5.37 and already miss columns
542
+ // that exist in 6.x. Failure to read the catalog degrades coercion rather than stopping the
543
+ // run, so it warns loudly instead of aborting.
544
+ try {
545
+ // `CodeGenConnection.query` takes SQL only — no parameter array — so the two schema names are
546
+ // inlined as literals. They are configuration identifiers rather than user input, and are
547
+ // escaped by doubling any single quote so a schema name cannot terminate the literal.
548
+ const schemaList = [MJ_CORE_SCHEMA, schema].map((n) => `'${n.replaceAll("'", "''")}'`).join(', ');
549
+ const { recordset } = await ds.connection.query(`SELECT table_name, column_name
550
+ FROM information_schema.columns
551
+ WHERE data_type = 'boolean' AND table_schema IN (${schemaList})`);
552
+ // The dialect's registry keys are LOWERCASED [table, column] pairs.
553
+ const catalogBitCols = recordset.map((r) => [
554
+ String(r.table_name).toLowerCase(),
555
+ String(r.column_name).toLowerCase(),
556
+ ]);
557
+ transpiler.addExtraBitColumns(catalogBitCols);
558
+ if (catalogBitCols.length === 0) {
559
+ this.warn('No boolean columns found in the working database — bit/boolean coercion will rely on the baseline registry alone.');
560
+ }
561
+ }
562
+ catch (err) {
563
+ this.warn(`Could not read boolean columns from the working database (${err instanceof Error ? err.message : String(err)}). ` +
564
+ 'Seed INSERT/UPDATE values targeting core boolean columns may not be coerced.');
565
+ }
466
566
  const sqlGen = new SQLCodeGenBase();
467
567
  const db = {
468
568
  apply: async (sql) => {
@@ -497,7 +597,7 @@ export default class MigrateConvert extends Command {
497
597
  .map((e) => e.Name);
498
598
  },
499
599
  };
500
- return new IncrementalBaker({ transpiler, db, schema });
600
+ return new IncrementalBaker({ transpiler, db, schema, coreSchema });
501
601
  }
502
602
  /** Print the split-and-regenerate run summary and the mandatory next steps. */
503
603
  printSplitSummary(converted, regenReseed, needsHand, withUnhandled, dryRun, bakeCodegen = false) {
@@ -592,8 +692,10 @@ export default class MigrateConvert extends Command {
592
692
  target.FKConstraints += source.FKConstraints;
593
693
  target.CheckConstraints += source.CheckConstraints;
594
694
  target.CommentsConverted += source.CommentsConverted;
695
+ target.Gaps += source.Gaps;
595
696
  target.ErrorBatches.push(...source.ErrorBatches);
596
697
  target.SkippedBatches.push(...source.SkippedBatches);
698
+ target.GapBatches.push(...source.GapBatches);
597
699
  }
598
700
  }
599
701
  //# sourceMappingURL=convert.js.map