@memberjunction/cli 5.41.0 → 5.42.0

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 (104) hide show
  1. package/dist/commands/bundle/index.d.ts +1 -0
  2. package/dist/commands/bundle/index.d.ts.map +1 -1
  3. package/dist/commands/bundle/index.js +7 -1
  4. package/dist/commands/bundle/index.js.map +1 -1
  5. package/dist/commands/codegen/index.d.ts +6 -16
  6. package/dist/commands/codegen/index.d.ts.map +1 -1
  7. package/dist/commands/codegen/index.js +6 -90
  8. package/dist/commands/codegen/index.js.map +1 -1
  9. package/dist/commands/codegen/usage.d.ts +7 -0
  10. package/dist/commands/codegen/usage.d.ts.map +1 -0
  11. package/dist/commands/codegen/usage.js +10 -0
  12. package/dist/commands/codegen/usage.js.map +1 -0
  13. package/dist/commands/install/claude.d.ts +35 -0
  14. package/dist/commands/install/claude.d.ts.map +1 -0
  15. package/dist/commands/install/claude.js +108 -0
  16. package/dist/commands/install/claude.js.map +1 -0
  17. package/dist/commands/install/index.d.ts +1 -0
  18. package/dist/commands/install/index.d.ts.map +1 -1
  19. package/dist/commands/install/index.js +4 -0
  20. package/dist/commands/install/index.js.map +1 -1
  21. package/dist/commands/migrate/convert.d.ts +59 -12
  22. package/dist/commands/migrate/convert.d.ts.map +1 -1
  23. package/dist/commands/migrate/convert.js +294 -21
  24. package/dist/commands/migrate/convert.js.map +1 -1
  25. package/dist/commands/migrate/rebake.d.ts +41 -0
  26. package/dist/commands/migrate/rebake.d.ts.map +1 -0
  27. package/dist/commands/migrate/rebake.js +193 -0
  28. package/dist/commands/migrate/rebake.js.map +1 -0
  29. package/dist/commands/plugin/add.d.ts +18 -0
  30. package/dist/commands/plugin/add.d.ts.map +1 -0
  31. package/dist/commands/plugin/add.js +53 -0
  32. package/dist/commands/plugin/add.js.map +1 -0
  33. package/dist/commands/sync/pull.d.ts +6 -26
  34. package/dist/commands/sync/pull.d.ts.map +1 -1
  35. package/dist/commands/sync/pull.js +6 -281
  36. package/dist/commands/sync/pull.js.map +1 -1
  37. package/dist/commands/sync/push.d.ts +8 -19
  38. package/dist/commands/sync/push.d.ts.map +1 -1
  39. package/dist/commands/sync/push.js +8 -328
  40. package/dist/commands/sync/push.js.map +1 -1
  41. package/dist/commands/sync/usage.d.ts +7 -0
  42. package/dist/commands/sync/usage.d.ts.map +1 -0
  43. package/dist/commands/sync/usage.js +10 -0
  44. package/dist/commands/sync/usage.js.map +1 -0
  45. package/dist/commands/update/claude.d.ts +37 -0
  46. package/dist/commands/update/claude.d.ts.map +1 -0
  47. package/dist/commands/update/claude.js +90 -0
  48. package/dist/commands/update/claude.js.map +1 -0
  49. package/dist/commands/usage.d.ts +17 -0
  50. package/dist/commands/usage.d.ts.map +1 -0
  51. package/dist/commands/usage.js +29 -0
  52. package/dist/commands/usage.js.map +1 -0
  53. package/dist/hooks/prerun.d.ts.map +1 -1
  54. package/dist/hooks/prerun.js +49 -8
  55. package/dist/hooks/prerun.js.map +1 -1
  56. package/dist/lib/claude-pack/ManagedBlockEditor.d.ts +40 -0
  57. package/dist/lib/claude-pack/ManagedBlockEditor.d.ts.map +1 -0
  58. package/dist/lib/claude-pack/ManagedBlockEditor.js +127 -0
  59. package/dist/lib/claude-pack/ManagedBlockEditor.js.map +1 -0
  60. package/dist/lib/claude-pack/PackFetcher.d.ts +86 -0
  61. package/dist/lib/claude-pack/PackFetcher.d.ts.map +1 -0
  62. package/dist/lib/claude-pack/PackFetcher.js +163 -0
  63. package/dist/lib/claude-pack/PackFetcher.js.map +1 -0
  64. package/dist/lib/claude-pack/PackInstaller.d.ts +62 -0
  65. package/dist/lib/claude-pack/PackInstaller.d.ts.map +1 -0
  66. package/dist/lib/claude-pack/PackInstaller.js +197 -0
  67. package/dist/lib/claude-pack/PackInstaller.js.map +1 -0
  68. package/dist/lib/claude-pack/PackMerger.d.ts +61 -0
  69. package/dist/lib/claude-pack/PackMerger.d.ts.map +1 -0
  70. package/dist/lib/claude-pack/PackMerger.js +315 -0
  71. package/dist/lib/claude-pack/PackMerger.js.map +1 -0
  72. package/dist/lib/claude-pack/PackOutputFormatter.d.ts +29 -0
  73. package/dist/lib/claude-pack/PackOutputFormatter.d.ts.map +1 -0
  74. package/dist/lib/claude-pack/PackOutputFormatter.js +82 -0
  75. package/dist/lib/claude-pack/PackOutputFormatter.js.map +1 -0
  76. package/dist/lib/claude-pack/PackPaths.d.ts +80 -0
  77. package/dist/lib/claude-pack/PackPaths.d.ts.map +1 -0
  78. package/dist/lib/claude-pack/PackPaths.js +182 -0
  79. package/dist/lib/claude-pack/PackPaths.js.map +1 -0
  80. package/dist/lib/claude-pack/PackTypes.d.ts +124 -0
  81. package/dist/lib/claude-pack/PackTypes.d.ts.map +1 -0
  82. package/dist/lib/claude-pack/PackTypes.js +32 -0
  83. package/dist/lib/claude-pack/PackTypes.js.map +1 -0
  84. package/dist/lib/claude-pack/SettingsMerger.d.ts +47 -0
  85. package/dist/lib/claude-pack/SettingsMerger.d.ts.map +1 -0
  86. package/dist/lib/claude-pack/SettingsMerger.js +163 -0
  87. package/dist/lib/claude-pack/SettingsMerger.js.map +1 -0
  88. package/dist/lib/cli-plugins.d.ts +16 -0
  89. package/dist/lib/cli-plugins.d.ts.map +1 -0
  90. package/dist/lib/cli-plugins.js +26 -0
  91. package/dist/lib/cli-plugins.js.map +1 -0
  92. package/dist/lib/domain-usage-command.d.ts +16 -0
  93. package/dist/lib/domain-usage-command.d.ts.map +1 -0
  94. package/dist/lib/domain-usage-command.js +23 -0
  95. package/dist/lib/domain-usage-command.js.map +1 -0
  96. package/dist/lib/usage-render.d.ts +14 -0
  97. package/dist/lib/usage-render.d.ts.map +1 -0
  98. package/dist/lib/usage-render.js +64 -0
  99. package/dist/lib/usage-render.js.map +1 -0
  100. package/dist/light-commands.d.ts.map +1 -1
  101. package/dist/light-commands.js +11 -0
  102. package/dist/light-commands.js.map +1 -1
  103. package/oclif.manifest.json +815 -135
  104. package/package.json +17 -15
@@ -1,23 +1,38 @@
1
1
  import { Command, Flags } from '@oclif/core';
2
+ import fs from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { convertFile, getRulesForDialects, createConversionStats, deduplicateEntityFieldSequences, convertMigration, IncrementalBaker, } from '@memberjunction/sql-converter';
6
+ import { MJPostgresTranspiler } from '@memberjunction/sqlglot-ts';
2
7
  /**
3
8
  * CLI command to discover and convert T-SQL migrations to PostgreSQL.
4
9
  *
5
10
  * Scans the SQL Server migrations directory, identifies files that don't
6
11
  * have a corresponding .pg.sql counterpart in the PG migrations directory,
7
- * and converts them using the BatchConverter pipeline.
12
+ * and converts them.
13
+ *
14
+ * Two strategies:
15
+ * - `--split` (split-and-regenerate, the standard path): classify content by the
16
+ * generator that produced it, transpile only hand-written DDL via the AST dialect
17
+ * (sqlglot `mj_postgres.py`), drop CodeGen objects (regenerated by `mj codegen`)
18
+ * and mj-sync metadata (re-seeded by `mj sync push`), and surface every gap loudly.
19
+ * Requires Python 3 with sqlglot (`pip install sqlglot`; set MJ_SQLGLOT_PYTHON if
20
+ * not `python3` on PATH).
21
+ * - default (legacy): the regex-based BatchConverter rule pipeline, which converts
22
+ * everything including appended CodeGen output. Retained for compatibility.
8
23
  *
9
24
  * Usage:
10
- * mj migrate convert # Convert all unconverted migrations
11
- * mj migrate convert --file V20260401__foo.sql # Convert a specific file
12
- * mj migrate convert --dry-run # Show what would be converted
13
- * mj migrate convert --verbose # Show per-statement progress
25
+ * mj migrate convert --split # Standard split-and-regenerate conversion
26
+ * mj migrate convert --split --file V20260401__foo.sql
27
+ * mj migrate convert --split --dry-run
28
+ * mj migrate convert # Legacy regex pipeline
14
29
  */
15
30
  export default class MigrateConvert extends Command {
16
- static { this.description = 'Convert T-SQL migrations to PostgreSQL using the BatchConverter pipeline'; }
31
+ static { this.description = 'Convert T-SQL migrations to PostgreSQL'; }
17
32
  static { this.examples = [
18
- '<%= config.bin %> migrate convert',
19
- '<%= config.bin %> migrate convert --dry-run',
20
- '<%= config.bin %> migrate convert --file V202604060452__v5.24.x__KnowledgeHub.sql',
33
+ '<%= config.bin %> migrate convert --split',
34
+ '<%= config.bin %> migrate convert --split --dry-run',
35
+ '<%= config.bin %> migrate convert --split --file V202604060452__v5.24.x__KnowledgeHub.sql',
21
36
  '<%= config.bin %> migrate convert --source-dir ./migrations/v5 --output-dir ./migrations-pg/v5',
22
37
  '<%= config.bin %> migrate convert --verbose',
23
38
  ]; }
@@ -50,12 +65,38 @@ export default class MigrateConvert extends Command {
50
65
  description: 'Show per-statement progress',
51
66
  default: false,
52
67
  }),
68
+ split: Flags.boolean({
69
+ description: 'Split-and-regenerate (the standard path): transpile only hand-written DDL via the AST ' +
70
+ 'dialect; CodeGen objects are regenerated by `mj codegen` and mj-sync metadata re-seeded ' +
71
+ 'by `mj sync push`; every conversion gap is surfaced and fails the run unless --allow-gaps.',
72
+ default: false,
73
+ }),
74
+ 'allow-gaps': Flags.boolean({
75
+ description: 'With --split: exit 0 even when migrations have conversion gaps (hand-authoring needed ' +
76
+ 'or unhandled statements). Gaps are still embedded as comments and listed in the summary.',
77
+ default: false,
78
+ }),
79
+ 'bake-codegen': Flags.boolean({
80
+ description: 'With --split: bake native PG CodeGen objects inline per migration (Path C), so the set ' +
81
+ 'deploys with `mj migrate` alone — no `mj codegen` step. Requires a LIVE working PG database ' +
82
+ '(DB_PLATFORM=postgresql + PG_* env, same as `mj codegen`) seeded to the state just BEFORE ' +
83
+ 'the migrations being converted (typically the latest baseline); the converter brings it ' +
84
+ 'forward in committed order as it bakes. Not compatible with --dry-run.',
85
+ default: false,
86
+ }),
53
87
  }; }
54
88
  async run() {
55
89
  const { flags } = await this.parse(MigrateConvert);
56
- const fs = await import('node:fs');
57
- const path = await import('node:path');
58
- const { convertFile, getRulesForDialects, createConversionStats, deduplicateEntityFieldSequences } = await import('@memberjunction/sql-converter');
90
+ if (flags['bake-codegen']) {
91
+ if (!flags.split)
92
+ this.error('--bake-codegen requires --split.');
93
+ if (flags['dry-run'])
94
+ this.error('--bake-codegen mutates a live working DB and is incompatible with --dry-run.');
95
+ }
96
+ if (flags.split) {
97
+ await this.runSplit(flags);
98
+ return;
99
+ }
59
100
  const sourceDir = path.resolve(flags['source-dir']);
60
101
  const outputDir = path.resolve(flags['output-dir']);
61
102
  // Verify directories exist
@@ -72,7 +113,7 @@ export default class MigrateConvert extends Command {
72
113
  this.error('No conversion rules found for tsql -> postgres');
73
114
  }
74
115
  // Discover migrations
75
- const unconverted = this.discoverUnconverted(sourceDir, outputDir, flags.file, fs, path);
116
+ const unconverted = this.discoverUnconverted(sourceDir, outputDir, flags.file);
76
117
  if (unconverted.length === 0) {
77
118
  this.log('All migrations are already converted. Nothing to do.');
78
119
  return;
@@ -149,20 +190,252 @@ export default class MigrateConvert extends Command {
149
190
  }
150
191
  }
151
192
  /**
152
- * Discovers T-SQL migrations that don't have a corresponding PG counterpart.
193
+ * Split-and-regenerate conversion (the standard path). Classification routes
194
+ * content by the generator that produced it; the AST dialect transpiles what's
195
+ * kept. Contract: nothing is dropped silently —
196
+ * - needs-hand migrations are written as `<name>.pg.sql.needs-hand` (NOT a
197
+ * discoverable `.pg.sql`, so the migration stays visibly unconverted until a
198
+ * human finishes it) and fail the run;
199
+ * - statements the dialect couldn't emit are embedded as gap comments in the
200
+ * output, listed in the summary, and fail the run unless --allow-gaps.
153
201
  *
154
- * A T-SQL file like `V202604060452__v5.24.x__Foo.sql` maps to:
155
- * - `V202604060452__v5.24.x__Foo.pg.sql` in the output directory
202
+ * See plans/pg-migration-architecture/SPLIT_AND_REGENERATE_PROPOSAL.md.
203
+ */
204
+ async runSplit(flags) {
205
+ const sourceDir = path.resolve(flags['source-dir']);
206
+ const outputDir = path.resolve(flags['output-dir']);
207
+ if (!fs.existsSync(sourceDir))
208
+ this.error(`Source directory not found: ${sourceDir}`);
209
+ if (!fs.existsSync(outputDir))
210
+ fs.mkdirSync(outputDir, { recursive: true });
211
+ const unconverted = this.discoverUnconverted(sourceDir, outputDir, flags.file);
212
+ if (unconverted.length === 0) {
213
+ this.log('All migrations are already converted. Nothing to do.');
214
+ return;
215
+ }
216
+ const transpiler = await this.buildTranspiler(sourceDir);
217
+ // Select the per-migration conversion: inline-baking (live DB, CodeGen baked natively) or
218
+ // the default transpile-only path (CodeGen regenerated by `mj codegen` at deploy).
219
+ const bakeCodegen = flags['bake-codegen'];
220
+ const baker = bakeCodegen ? await this.buildBaker(transpiler, flags.schema) : null;
221
+ const convertOne = (sql, fileName) => baker
222
+ ? baker.bakeMigration(sql, fileName)
223
+ : convertMigration(sql, fileName, { schema: flags.schema, includeHeader: !flags['no-header'], transpiler });
224
+ if (bakeCodegen)
225
+ this.log(`\nInline CodeGen baking ENABLED — bringing the working DB forward as each migration bakes.`);
226
+ const converted = [];
227
+ const regenReseed = [];
228
+ const needsHand = [];
229
+ const withUnhandled = [];
230
+ const gapReport = [];
231
+ for (const m of unconverted) {
232
+ const sql = fs.readFileSync(path.join(sourceDir, m.SourceFile), 'utf8');
233
+ let result;
234
+ try {
235
+ result = await convertOne(sql, m.SourceFile);
236
+ }
237
+ catch (err) {
238
+ this.error(`Conversion failed for ${m.SourceFile}: ${err instanceof Error ? err.message : String(err)}`);
239
+ }
240
+ // A needs-hand migration is NEVER written as a discoverable .pg.sql — that
241
+ // would mark it converted forever and let Flyway apply an incomplete file.
242
+ // The .needs-hand artifact carries the transpiled DDL + gap comments for the
243
+ // human (or LLM last-mile pass) to finish, then rename to .pg.sql.
244
+ const isNeedsHand = result.status === 'needs-hand-authoring';
245
+ const outName = isNeedsHand ? `${m.OutputFile}.needs-hand` : m.OutputFile;
246
+ const outPath = path.join(outputDir, outName);
247
+ if (!flags['dry-run']) {
248
+ if (isNeedsHand && fs.existsSync(outPath)) {
249
+ // Someone may be mid-edit on the artifact — never clobber it on a re-run.
250
+ this.warn(`${outName} already exists — not overwritten (delete it to regenerate).`);
251
+ }
252
+ else {
253
+ fs.writeFileSync(outPath, result.pgSQL);
254
+ }
255
+ }
256
+ if (result.status === 'needs-hand-authoring') {
257
+ needsHand.push({ file: m.SourceFile, routines: result.handProcedural });
258
+ }
259
+ else if (result.status === 'reseed-or-regen-only') {
260
+ regenReseed.push(m.SourceFile);
261
+ }
262
+ else {
263
+ converted.push(m.SourceFile);
264
+ }
265
+ if (result.unhandled.length > 0) {
266
+ withUnhandled.push({ file: m.SourceFile, count: result.unhandled.length });
267
+ }
268
+ if (result.status === 'needs-hand-authoring' || result.unhandled.length > 0) {
269
+ gapReport.push({
270
+ sourceFile: m.SourceFile,
271
+ outputFile: outName,
272
+ status: result.status,
273
+ handProcedural: result.handProcedural,
274
+ unhandled: result.unhandled,
275
+ });
276
+ }
277
+ }
278
+ // The consolidated gap artifact — everything a build engineer (or an LLM pass they
279
+ // drive) needs to finish the conversion, in one machine-readable file.
280
+ if (!flags['dry-run']) {
281
+ const reportPath = path.join(outputDir, 'conversion-gaps.report.json');
282
+ if (gapReport.length > 0) {
283
+ fs.writeFileSync(reportPath, JSON.stringify({ generatedAt: new Date().toISOString(), sourceDir, gaps: gapReport }, null, 2));
284
+ this.log(`\nGap report written: ${reportPath}`);
285
+ }
286
+ else if (fs.existsSync(reportPath)) {
287
+ fs.unlinkSync(reportPath); // clean run — stale report would misreport state
288
+ }
289
+ }
290
+ this.printSplitSummary(converted, regenReseed, needsHand, withUnhandled, flags['dry-run'], bakeCodegen);
291
+ const gapCount = needsHand.length + withUnhandled.length;
292
+ if (gapCount > 0 && !flags['allow-gaps']) {
293
+ // In bake mode the working DB pools are open; this.error → oclif force-exits anyway.
294
+ this.error(`${needsHand.length} migration(s) need hand-authoring and ${withUnhandled.length} have ` +
295
+ 'unhandled statements. Resolve the gaps (conversion-gaps.report.json + comments in the ' +
296
+ 'output files), or pass --allow-gaps to accept them for now.');
297
+ }
298
+ // setupDataSource() opened pg pools that keep the event loop alive, and CodeGenConnection
299
+ // exposes no close(). Mirror the `mj codegen` command (runCodeGen.ts) and exit explicitly so
300
+ // the CLI terminates after a clean bake.
301
+ if (bakeCodegen)
302
+ process.exit(0);
303
+ }
304
+ /**
305
+ * Construct the AST transpiler with the cross-file BIT/BOOLEAN column registry
306
+ * collected from the baselines (they declare the core tables, e.g. User.IsActive),
307
+ * so per-file transpiles can coerce 1/0 → TRUE/FALSE in seed INSERTs that target
308
+ * tables defined outside the migration being converted. Fails fast with install
309
+ * guidance when Python/sqlglot is unavailable.
310
+ */
311
+ async buildTranspiler(sourceDir) {
312
+ const probe = new MJPostgresTranspiler();
313
+ try {
314
+ await probe.preflight();
315
+ }
316
+ catch (err) {
317
+ this.error(err instanceof Error ? err.message : String(err));
318
+ }
319
+ const baselines = fs
320
+ .readdirSync(sourceDir)
321
+ .filter((f) => /^B\d.*\.sql$/.test(f) && !f.endsWith('.pg.sql') && !f.endsWith('.pg-only.sql'))
322
+ .sort();
323
+ const bitColumns = [];
324
+ for (const b of baselines) {
325
+ try {
326
+ const cols = await probe.collectBitColumns(fs.readFileSync(path.join(sourceDir, b), 'utf8'));
327
+ bitColumns.push(...cols);
328
+ }
329
+ catch (err) {
330
+ // A baseline that fails bit-column collection degrades 1/0→TRUE/FALSE
331
+ // coercion for tables it declares — warn loudly, don't proceed silently.
332
+ this.warn(`Bit-column collection failed for ${b}: ${err instanceof Error ? err.message : String(err)}`);
333
+ }
334
+ }
335
+ return new MJPostgresTranspiler({ extraBitColumns: bitColumns });
336
+ }
337
+ /**
338
+ * Build the inline-baking driver: connect to the live working PG database (the same
339
+ * config/env `mj codegen` uses) and wire its apply / metadata-refresh / per-entity capture
340
+ * into an IncrementalBaker.
156
341
  *
157
- * Baseline files (`B*__Baseline.sql`) ARE included they convert through the
158
- * same rule pipeline as versioned migrations whenever they lack a `.pg.sql`
159
- * (or `.pg-only.sql`) counterpart. Only already-converted outputs (`.pg.sql` /
160
- * `.pg-only.sql`) are excluded from the source scan.
342
+ * The codegen engine + data-provider stack is heavy and only this opt-in path needs it, so
343
+ * the value graph is loaded with a dynamic import here (Rule 8 case 3 — bundle-size deferral;
344
+ * codegen-lib + core are declared MJCLI deps) to keep a plain `convert --split` light. The
345
+ * matching `import type` at the top is erased at runtime, so it does not defeat the deferral.
161
346
  */
162
- discoverUnconverted(sourceDir, outputDir, specificFile, fs, path) {
347
+ async buildBaker(transpiler, schema) {
348
+ const { RunCodeGenBase, SQLCodeGenBase, initializeConfig, dbPlatform } = await import('@memberjunction/codegen-lib');
349
+ if (dbPlatform() !== 'postgresql') {
350
+ this.error('--bake-codegen requires DB_PLATFORM=postgresql with PG_* connection env (the working DB CodeGen objects are captured from).');
351
+ }
352
+ initializeConfig(process.cwd());
353
+ let ds;
354
+ try {
355
+ ds = await new RunCodeGenBase().setupDataSource();
356
+ }
357
+ catch (err) {
358
+ this.error(`--bake-codegen could not connect/load metadata from the working PG database: ${err instanceof Error ? err.message : String(err)}. ` +
359
+ 'Seed the working DB to the baseline (its __mj views + metadata must exist) before baking.');
360
+ }
361
+ const sqlGen = new SQLCodeGenBase();
362
+ const db = {
363
+ apply: async (sql) => {
364
+ await ds.connection.query(sql);
365
+ },
366
+ refreshMetadata: async () => {
367
+ await ds.provider.Refresh();
368
+ },
369
+ captureEntity: async (name) => {
370
+ const entity = ds.provider.EntityByName(name);
371
+ if (!entity)
372
+ throw new Error(`--bake-codegen: entity not found in working-DB metadata: ${name}`);
373
+ const r = await sqlGen.generateSingleEntitySQLToSeparateFiles({
374
+ pool: ds.connection,
375
+ entity,
376
+ directory: os.tmpdir(), // inert — writeFiles is false
377
+ onlyPermissions: false,
378
+ writeFiles: false,
379
+ skipExecution: false, // execute → keep the working DB current for later migrations
380
+ });
381
+ return { sql: r.sql ?? '', permissionsSQL: r.permissionsSQL ?? '' };
382
+ },
383
+ };
384
+ return new IncrementalBaker({ transpiler, db, schema });
385
+ }
386
+ /** Print the split-and-regenerate run summary and the mandatory next steps. */
387
+ printSplitSummary(converted, regenReseed, needsHand, withUnhandled, dryRun, bakeCodegen = false) {
388
+ this.log(`\n=== Split-and-Regenerate Summary${bakeCodegen ? ' (inline CodeGen baking)' : ''} ===`);
389
+ this.log(` transpiled (DDL): ${converted.length}`);
390
+ const regenNote = bakeCodegen ? 'CodeGen baked inline; metadata via mj sync push' : 'handled by mj codegen + mj sync push';
391
+ this.log(` regen/reseed only: ${regenReseed.length} (${regenNote})`);
392
+ this.log(` needs hand-authoring: ${needsHand.length}`);
393
+ this.log(` with unhandled stmts: ${withUnhandled.length}`);
394
+ if (dryRun)
395
+ this.log(' (dry run — no files written)');
396
+ if (needsHand.length > 0) {
397
+ this.logToStderr('\n ⚠ Hand-written procedural SQL — written as .needs-hand files; finish and rename to .pg.sql:');
398
+ for (const h of needsHand)
399
+ this.logToStderr(` ${h.file} — ${h.routines.slice(0, 5).join(', ')}`);
400
+ }
401
+ if (withUnhandled.length > 0) {
402
+ this.logToStderr('\n ⚠ Statements the AST transpiler could not emit (embedded as comments in the output):');
403
+ for (const u of withUnhandled)
404
+ this.logToStderr(` ${u.file} — ${u.count} statement(s)`);
405
+ }
406
+ this.log('\nNext steps to complete the PG migration set (run against a fresh PG database):');
407
+ if (bakeCodegen) {
408
+ this.log(' 1. resolve any gaps above (hand-author or LLM last-mile, then rename .needs-hand)');
409
+ this.log(' 2. mj migrate # apply DDL + inline-baked CodeGen objects (no codegen step)');
410
+ this.log(' 3. mj sync push # re-seed mj-sync metadata');
411
+ this.log(' 4. schema/row-count diff vs a fresh SQL Server build to confirm parity');
412
+ }
413
+ else {
414
+ this.log(' 1. resolve any gaps above (hand-author or LLM last-mile, then rename .needs-hand)');
415
+ this.log(' 2. mj migrate # apply the transpiled DDL (.pg.sql)');
416
+ this.log(' 3. mj codegen # regenerate CodeGen SQL objects natively (DB_PLATFORM=postgresql)');
417
+ this.log(' 4. mj sync push # re-seed mj-sync metadata');
418
+ this.log(' 5. schema/row-count diff vs a fresh SQL Server build to confirm parity');
419
+ }
420
+ }
421
+ /**
422
+ * Discovers T-SQL migrations that don't have a corresponding PG counterpart.
423
+ *
424
+ * A T-SQL file like `V202604060452__v5.24.x__Foo.sql` maps to
425
+ * `V202604060452__v5.24.x__Foo.pg.sql` in the output directory; a `.pg-only.sql`
426
+ * variant also counts as a counterpart (manual PG-specific override). Counterpart
427
+ * presence is the only filter — baselines (B__) convert like any other file when
428
+ * their `.pg.sql` is missing (statement-mode classification handles them).
429
+ * `.needs-hand` artifacts are deliberately NOT counterparts: a migration stays
430
+ * unconverted until its gaps are resolved and the file is renamed to `.pg.sql`.
431
+ */
432
+ discoverUnconverted(sourceDir, outputDir, specificFile) {
163
433
  const sourceFiles = fs.readdirSync(sourceDir)
164
434
  .filter((f) => f.endsWith('.sql') && !f.endsWith('.pg.sql') && !f.endsWith('.pg-only.sql'))
165
435
  .sort();
436
+ if (specificFile && !sourceFiles.includes(specificFile)) {
437
+ this.error(`--file ${specificFile} not found in ${sourceDir}`);
438
+ }
166
439
  const outputFiles = new Set(fs.readdirSync(outputDir)
167
440
  .filter((f) => f.endsWith('.pg.sql') || f.endsWith('.pg-only.sql')));
168
441
  const unconverted = [];
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/commands/migrate/convert.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/commands/migrate/convert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { Command } from '@oclif/core';
2
+ /**
3
+ * Re-bake the post-baseline PG migration set with INLINE NATIVE CodeGen (Path C), so the set
4
+ * deploys with `mj migrate` alone — no `mj codegen` step.
5
+ *
6
+ * Unlike `convert --bake-codegen` (which bakes UNCONVERTED migrations forward), `rebake` re-bakes
7
+ * migrations that already have a committed `.pg.sql`: it advances a live working DB by applying
8
+ * each migration's known-good committed file in order (which keeps dependent views consistent and
9
+ * registers new entities), then captures native CodeGen read-only and writes the baked file. A
10
+ * migration with a transpile gap (unhandled statement / hand-procedural) keeps its committed file.
11
+ *
12
+ * Requires a LIVE working PG database (DB_PLATFORM=postgresql + PG_* env, as `mj codegen`) seeded
13
+ * to the latest baseline; the command brings it forward as it re-bakes.
14
+ */
15
+ export default class MigrateRebake extends Command {
16
+ static description: string;
17
+ static examples: string[];
18
+ static flags: {
19
+ 'source-dir': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
20
+ 'output-dir': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
21
+ schema: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
22
+ 'baseline-floor': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
23
+ 'dry-run': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
24
+ };
25
+ run(): Promise<void>;
26
+ /** Highest `B<version>__...` baseline in the output dir → its version key is the floor. */
27
+ private latestBaselineFloor;
28
+ /** SS V-migrations whose version key sorts strictly after the floor (committed order). */
29
+ private postBaselineMigrations;
30
+ /** Committed PG counterpart: `.pg.sql` preferred, else a hand-authored `.pg-only.sql`. */
31
+ private committedCounterpart;
32
+ /** AST transpiler with the cross-file BIT-column registry from the baselines (see convert.ts). */
33
+ private buildTranspiler;
34
+ /**
35
+ * Wire the working-DB capabilities to a live PG connection. The codegen engine is loaded with a
36
+ * dynamic import (Rule 8 case 3 — heavy module, opt-in path only); the matching `import type` is
37
+ * erased at runtime so it does not defeat the deferral.
38
+ */
39
+ private buildBaker;
40
+ }
41
+ //# sourceMappingURL=rebake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebake.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/rebake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAU7C;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,OAAO;IAChD,MAAM,CAAC,WAAW,SAA2E;IAE7F,MAAM,CAAC,QAAQ,WAGb;IAEF,MAAM,CAAC,KAAK;;;;;;MAMV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAsE1B,2FAA2F;IAC3F,OAAO,CAAC,mBAAmB;IAM3B,0FAA0F;IAC1F,OAAO,CAAC,sBAAsB;IAU9B,0FAA0F;IAC1F,OAAO,CAAC,oBAAoB;IAO5B,kGAAkG;YACpF,eAAe;IAmB7B;;;;OAIG;YACW,UAAU;CA4CzB"}