@memberjunction/cli 6.1.4 → 6.2.0-edge.1

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 (235) hide show
  1. package/README.md +18 -7
  2. package/dist/baseline/cli-helpers.d.ts +4 -0
  3. package/dist/baseline/cli-helpers.d.ts.map +1 -1
  4. package/dist/baseline/cli-helpers.js +18 -10
  5. package/dist/baseline/cli-helpers.js.map +1 -1
  6. package/dist/baseline/comparator.d.ts +5 -3
  7. package/dist/baseline/comparator.d.ts.map +1 -1
  8. package/dist/baseline/comparator.js +142 -138
  9. package/dist/baseline/comparator.js.map +1 -1
  10. package/dist/baseline/connection.d.ts +8 -6
  11. package/dist/baseline/connection.d.ts.map +1 -1
  12. package/dist/baseline/connection.js +16 -12
  13. package/dist/baseline/connection.js.map +1 -1
  14. package/dist/baseline/data-dumper.d.ts +7 -3
  15. package/dist/baseline/data-dumper.d.ts.map +1 -1
  16. package/dist/baseline/data-dumper.js +33 -25
  17. package/dist/baseline/data-dumper.js.map +1 -1
  18. package/dist/baseline/emitter.d.ts +5 -3
  19. package/dist/baseline/emitter.d.ts.map +1 -1
  20. package/dist/baseline/emitter.js +114 -110
  21. package/dist/baseline/emitter.js.map +1 -1
  22. package/dist/baseline/index.d.ts +7 -7
  23. package/dist/baseline/index.d.ts.map +1 -1
  24. package/dist/baseline/index.js +7 -7
  25. package/dist/baseline/index.js.map +1 -1
  26. package/dist/baseline/introspector-mssql.d.ts +2 -0
  27. package/dist/baseline/introspector-mssql.d.ts.map +1 -1
  28. package/dist/baseline/introspector-mssql.js +68 -64
  29. package/dist/baseline/introspector-mssql.js.map +1 -1
  30. package/dist/baseline/introspector-postgres.d.ts +2 -0
  31. package/dist/baseline/introspector-postgres.d.ts.map +1 -1
  32. package/dist/baseline/introspector-postgres.js +34 -30
  33. package/dist/baseline/introspector-postgres.js.map +1 -1
  34. package/dist/baseline/report.d.ts +4 -0
  35. package/dist/baseline/report.d.ts.map +1 -1
  36. package/dist/baseline/report.js +25 -17
  37. package/dist/baseline/report.js.map +1 -1
  38. package/dist/baseline/types.d.ts +71 -71
  39. package/dist/baseline/util.d.ts +54 -6
  40. package/dist/baseline/util.d.ts.map +1 -1
  41. package/dist/baseline/util.js +112 -36
  42. package/dist/baseline/util.js.map +1 -1
  43. package/dist/commands/agent/init.d.ts +23 -0
  44. package/dist/commands/agent/init.d.ts.map +1 -0
  45. package/dist/commands/agent/init.js +222 -0
  46. package/dist/commands/agent/init.js.map +1 -0
  47. package/dist/commands/ai/actions/list.js +7 -7
  48. package/dist/commands/ai/actions/run.js +7 -7
  49. package/dist/commands/ai/agents/list.js +7 -7
  50. package/dist/commands/ai/agents/run.js +9 -9
  51. package/dist/commands/ai/audit/agent-run.js +7 -7
  52. package/dist/commands/ai/prompts/run.js +7 -7
  53. package/dist/commands/app/check-updates.js +5 -5
  54. package/dist/commands/app/disable.js +2 -2
  55. package/dist/commands/app/enable.js +2 -2
  56. package/dist/commands/app/info.js +2 -2
  57. package/dist/commands/app/install.js +2 -2
  58. package/dist/commands/app/list.js +2 -2
  59. package/dist/commands/app/remove.js +4 -4
  60. package/dist/commands/app/upgrade.js +2 -2
  61. package/dist/commands/artifacts/reclassify.js +2 -2
  62. package/dist/commands/baseline/build.js +31 -31
  63. package/dist/commands/baseline/build.js.map +1 -1
  64. package/dist/commands/baseline/compare.js +36 -36
  65. package/dist/commands/baseline/roundtrip.js +56 -54
  66. package/dist/commands/baseline/roundtrip.js.map +1 -1
  67. package/dist/commands/bundle/index.js +4 -4
  68. package/dist/commands/clean/index.js +3 -3
  69. package/dist/commands/codegen/manifest.d.ts +2 -0
  70. package/dist/commands/codegen/manifest.d.ts.map +1 -1
  71. package/dist/commands/codegen/manifest.js +8 -4
  72. package/dist/commands/codegen/manifest.js.map +1 -1
  73. package/dist/commands/dev/workspace/index.d.ts +2 -0
  74. package/dist/commands/dev/workspace/index.d.ts.map +1 -1
  75. package/dist/commands/dev/workspace/index.js +8 -4
  76. package/dist/commands/dev/workspace/index.js.map +1 -1
  77. package/dist/commands/doctor/index.d.ts +6 -4
  78. package/dist/commands/doctor/index.d.ts.map +1 -1
  79. package/dist/commands/doctor/index.js +43 -18
  80. package/dist/commands/doctor/index.js.map +1 -1
  81. package/dist/commands/install/claude.d.ts +2 -0
  82. package/dist/commands/install/claude.d.ts.map +1 -1
  83. package/dist/commands/install/claude.js +11 -7
  84. package/dist/commands/install/claude.js.map +1 -1
  85. package/dist/commands/install/index.js +3 -3
  86. package/dist/commands/migrate/convert.d.ts +21 -0
  87. package/dist/commands/migrate/convert.d.ts.map +1 -1
  88. package/dist/commands/migrate/convert.js +22 -6
  89. package/dist/commands/migrate/convert.js.map +1 -1
  90. package/dist/commands/migrate/create.js +2 -2
  91. package/dist/commands/migrate/index.js +16 -16
  92. package/dist/commands/sync/file-reset.js +2 -2
  93. package/dist/commands/sync/init.js +3 -3
  94. package/dist/commands/test/compare.js +6 -6
  95. package/dist/commands/test/history.js +6 -6
  96. package/dist/commands/test/list.js +6 -6
  97. package/dist/commands/test/regression/build.js +5 -5
  98. package/dist/commands/test/regression/compare.js +3 -3
  99. package/dist/commands/test/regression/down.js +4 -4
  100. package/dist/commands/test/regression/export.js +4 -4
  101. package/dist/commands/test/regression/gen-forms.js +3 -3
  102. package/dist/commands/test/regression/remote.js +10 -10
  103. package/dist/commands/test/regression/up.js +6 -6
  104. package/dist/commands/test/run.js +6 -6
  105. package/dist/commands/test/scripts.d.ts +13 -0
  106. package/dist/commands/test/scripts.d.ts.map +1 -0
  107. package/dist/commands/test/scripts.js +50 -0
  108. package/dist/commands/test/scripts.js.map +1 -0
  109. package/dist/commands/test/suite.js +6 -6
  110. package/dist/commands/test/validate.js +6 -6
  111. package/dist/commands/translate-sql/index.js +25 -25
  112. package/dist/commands/update/claude.js +7 -7
  113. package/dist/commands/usage.js +4 -4
  114. package/dist/config.d.ts +175 -1
  115. package/dist/config.d.ts.map +1 -1
  116. package/dist/config.js +23 -9
  117. package/dist/config.js.map +1 -1
  118. package/dist/hooks/postrun.js +2 -2
  119. package/dist/hooks/prerun.js +2 -2
  120. package/dist/hooks/prerun.js.map +1 -1
  121. package/dist/init-templates/citizen-builder/.agents/skills/new-agent/SKILL.md +66 -0
  122. package/dist/init-templates/citizen-builder/.agents/skills/package-agent/SKILL.md +69 -0
  123. package/dist/init-templates/citizen-builder/.agents/skills/test-agent/SKILL.md +61 -0
  124. package/dist/init-templates/citizen-builder/.claude/skills/new-agent/SKILL.md +66 -0
  125. package/dist/init-templates/citizen-builder/.claude/skills/package-agent/SKILL.md +69 -0
  126. package/dist/init-templates/citizen-builder/.claude/skills/test-agent/SKILL.md +61 -0
  127. package/dist/init-templates/citizen-builder/.env.example +30 -0
  128. package/dist/init-templates/citizen-builder/AGENTS.md +331 -0
  129. package/dist/init-templates/citizen-builder/README.md +259 -0
  130. package/dist/init-templates/citizen-builder/docker/Dockerfile +16 -0
  131. package/dist/init-templates/citizen-builder/docker-compose.yml +59 -0
  132. package/dist/init-templates/citizen-builder/docs/ENTERPRISE_ORG_SETUP.md +73 -0
  133. package/dist/init-templates/citizen-builder/docs/PROMOTION_GUIDE.md +70 -0
  134. package/dist/init-templates/citizen-builder/metadata/.mj-sync.json +7 -0
  135. package/dist/init-templates/citizen-builder/metadata/agents/.customer-insight-agent.json +55 -0
  136. package/dist/init-templates/citizen-builder/metadata/agents/.mj-sync.json +45 -0
  137. package/dist/init-templates/citizen-builder/metadata/prompts/.customer-insight-prompt.json +15 -0
  138. package/dist/init-templates/citizen-builder/metadata/prompts/.mj-sync.json +45 -0
  139. package/dist/init-templates/citizen-builder/metadata/prompts/templates/customer-insight.template.md +18 -0
  140. package/dist/init-templates/citizen-builder/scripts/bootstrap.sh +47 -0
  141. package/dist/init-templates/citizen-builder/scripts/docker-entrypoint.sh +184 -0
  142. package/dist/init-templates/citizen-builder/scripts/generate-capabilities.sh +74 -0
  143. package/dist/init-templates/citizen-builder/scripts/query-run-history.sh +34 -0
  144. package/dist/init-templates/citizen-builder/scripts/sync-metadata.sh +14 -0
  145. package/dist/init-templates/remote-mj/README.md +4 -4
  146. package/dist/lib/claude-pack/ManagedBlockEditor.d.ts +6 -0
  147. package/dist/lib/claude-pack/ManagedBlockEditor.d.ts.map +1 -1
  148. package/dist/lib/claude-pack/ManagedBlockEditor.js +18 -6
  149. package/dist/lib/claude-pack/ManagedBlockEditor.js.map +1 -1
  150. package/dist/lib/claude-pack/PackFetcher.d.ts +8 -3
  151. package/dist/lib/claude-pack/PackFetcher.d.ts.map +1 -1
  152. package/dist/lib/claude-pack/PackFetcher.js +26 -18
  153. package/dist/lib/claude-pack/PackFetcher.js.map +1 -1
  154. package/dist/lib/claude-pack/PackInstaller.d.ts +6 -2
  155. package/dist/lib/claude-pack/PackInstaller.d.ts.map +1 -1
  156. package/dist/lib/claude-pack/PackInstaller.js +19 -13
  157. package/dist/lib/claude-pack/PackInstaller.js.map +1 -1
  158. package/dist/lib/claude-pack/PackMerger.d.ts +8 -0
  159. package/dist/lib/claude-pack/PackMerger.d.ts.map +1 -1
  160. package/dist/lib/claude-pack/PackMerger.js +63 -57
  161. package/dist/lib/claude-pack/PackMerger.js.map +1 -1
  162. package/dist/lib/claude-pack/PackOutputFormatter.d.ts +4 -0
  163. package/dist/lib/claude-pack/PackOutputFormatter.d.ts.map +1 -1
  164. package/dist/lib/claude-pack/PackOutputFormatter.js +10 -2
  165. package/dist/lib/claude-pack/PackOutputFormatter.js.map +1 -1
  166. package/dist/lib/claude-pack/PackPaths.d.ts +12 -0
  167. package/dist/lib/claude-pack/PackPaths.d.ts.map +1 -1
  168. package/dist/lib/claude-pack/PackPaths.js +31 -7
  169. package/dist/lib/claude-pack/PackPaths.js.map +1 -1
  170. package/dist/lib/claude-pack/PackTypes.d.ts +18 -14
  171. package/dist/lib/claude-pack/PackTypes.d.ts.map +1 -1
  172. package/dist/lib/claude-pack/PackTypes.js +11 -3
  173. package/dist/lib/claude-pack/PackTypes.js.map +1 -1
  174. package/dist/lib/claude-pack/SettingsMerger.d.ts +10 -0
  175. package/dist/lib/claude-pack/SettingsMerger.d.ts.map +1 -1
  176. package/dist/lib/claude-pack/SettingsMerger.js +36 -16
  177. package/dist/lib/claude-pack/SettingsMerger.js.map +1 -1
  178. package/dist/lib/cli-plugins.d.ts +2 -0
  179. package/dist/lib/cli-plugins.d.ts.map +1 -1
  180. package/dist/lib/cli-plugins.js +8 -4
  181. package/dist/lib/cli-plugins.js.map +1 -1
  182. package/dist/lib/db-preflight.d.ts +2 -0
  183. package/dist/lib/db-preflight.d.ts.map +1 -1
  184. package/dist/lib/db-preflight.js +12 -8
  185. package/dist/lib/db-preflight.js.map +1 -1
  186. package/dist/lib/db-version.d.ts +2 -0
  187. package/dist/lib/db-version.d.ts.map +1 -1
  188. package/dist/lib/db-version.js +5 -1
  189. package/dist/lib/db-version.js.map +1 -1
  190. package/dist/lib/derived-usage.d.ts +14 -8
  191. package/dist/lib/derived-usage.d.ts.map +1 -1
  192. package/dist/lib/derived-usage.js +30 -18
  193. package/dist/lib/derived-usage.js.map +1 -1
  194. package/dist/lib/domain-profiles.d.ts +4 -2
  195. package/dist/lib/domain-profiles.d.ts.map +1 -1
  196. package/dist/lib/domain-profiles.js +53 -49
  197. package/dist/lib/domain-profiles.js.map +1 -1
  198. package/dist/lib/domain-usage-command.js +4 -4
  199. package/dist/lib/dynamic-packages.d.ts +4 -2
  200. package/dist/lib/dynamic-packages.d.ts.map +1 -1
  201. package/dist/lib/dynamic-packages.js +9 -5
  202. package/dist/lib/dynamic-packages.js.map +1 -1
  203. package/dist/lib/format-compat.d.ts +9 -7
  204. package/dist/lib/format-compat.d.ts.map +1 -1
  205. package/dist/lib/format-compat.js +12 -8
  206. package/dist/lib/format-compat.js.map +1 -1
  207. package/dist/lib/interactive-guard.d.ts +16 -0
  208. package/dist/lib/interactive-guard.d.ts.map +1 -1
  209. package/dist/lib/interactive-guard.js +18 -6
  210. package/dist/lib/interactive-guard.js.map +1 -1
  211. package/dist/lib/migration-fetch.d.ts +16 -4
  212. package/dist/lib/migration-fetch.d.ts.map +1 -1
  213. package/dist/lib/migration-fetch.js +30 -18
  214. package/dist/lib/migration-fetch.js.map +1 -1
  215. package/dist/lib/regression/docker-helpers.d.ts +24 -0
  216. package/dist/lib/regression/docker-helpers.d.ts.map +1 -1
  217. package/dist/lib/regression/docker-helpers.js +46 -10
  218. package/dist/lib/regression/docker-helpers.js.map +1 -1
  219. package/dist/lib/usage-render.d.ts +6 -0
  220. package/dist/lib/usage-render.d.ts.map +1 -1
  221. package/dist/lib/usage-render.js +15 -3
  222. package/dist/lib/usage-render.js.map +1 -1
  223. package/dist/translate-sql/groundTruth.d.ts +3 -3
  224. package/dist/translate-sql/groundTruth.js +40 -40
  225. package/dist/translate-sql/reportGenerator.d.ts +7 -7
  226. package/dist/translate-sql/reportGenerator.js +18 -18
  227. package/dist/translate-sql/ruleTranslator.d.ts +3 -3
  228. package/dist/translate-sql/ruleTranslator.js +8 -8
  229. package/dist/translate-sql/ruleTranslator.js.map +1 -1
  230. package/dist/utils/open-app-context.d.ts +21 -0
  231. package/dist/utils/open-app-context.d.ts.map +1 -1
  232. package/dist/utils/open-app-context.js +26 -10
  233. package/dist/utils/open-app-context.js.map +1 -1
  234. package/oclif.manifest.json +1216 -1058
  235. package/package.json +22 -22
@@ -3,7 +3,7 @@ import path from 'node:path';
3
3
  import { Command, Flags } from '@oclif/core';
4
4
  import { input, select } from '@inquirer/prompts';
5
5
  import ora from 'ora-classic';
6
- import { NonInteractiveError, isInteractiveRun, resolveOrPrompt, withNonInteractiveHandling, } from '../../lib/interactive-guard.js';
6
+ import { NonInteractiveError, IsInteractiveRun, resolveOrPrompt, WithNonInteractiveHandling, } from '../../lib/interactive-guard.js';
7
7
  export default class Init extends Command {
8
8
  static { this.description = `Initialize a directory for metadata synchronization.
9
9
 
@@ -35,7 +35,7 @@ pass --setup-entity (and --entity/--dir when setting up "other").`; }
35
35
  }; }
36
36
  async run() {
37
37
  const { flags } = await this.parse(Init);
38
- await withNonInteractiveHandling(this, async () => {
38
+ await WithNonInteractiveHandling(this, async () => {
39
39
  const { InitService } = await import('@memberjunction/metadata-sync');
40
40
  const spinner = ora();
41
41
  try {
@@ -92,7 +92,7 @@ pass --setup-entity (and --entity/--dir when setting up "other").`; }
92
92
  options.dirName = await resolveOrPrompt({
93
93
  // A directory name always has a sane default derived from the entity, so
94
94
  // headless runs fall back to it rather than failing.
95
- flagValue: flags.dir ?? (isInteractiveRun() ? undefined : defaultDir),
95
+ flagValue: flags.dir ?? (IsInteractiveRun() ? undefined : defaultDir),
96
96
  what: 'A directory name',
97
97
  suggestion: `Pass --dir ${defaultDir}.`,
98
98
  prompt: () => input({ message: 'Enter the directory name:', default: defaultDir }),
@@ -1,5 +1,5 @@
1
1
  import { Command, Flags, Args } from '@oclif/core';
2
- import { TEST_FORMAT_FLAG, TEST_FORMAT_MAP, resolveLegacyFormat } from '../../lib/format-compat.js';
2
+ import { TEST_FORMAT_FLAG, TEST_FORMAT_MAP, ResolveLegacyFormat } from '../../lib/format-compat.js';
3
3
  export default class TestCompare extends Command {
4
4
  static { this.description = 'Compare test runs for regression detection'; }
5
5
  static { this.examples = [
@@ -73,11 +73,11 @@ export default class TestCompare extends Command {
73
73
  diffOnly: flags['diff-only'],
74
74
  latest: flags.latest,
75
75
  fromJson: flags['from-json'],
76
- format: resolveLegacyFormat({
77
- format: flags.format,
78
- legacy: 'console',
79
- legacyDefault: 'console',
80
- map: TEST_FORMAT_MAP,
76
+ format: ResolveLegacyFormat({
77
+ Format: flags.format,
78
+ Legacy: 'console',
79
+ LegacyDefault: 'console',
80
+ Map: TEST_FORMAT_MAP,
81
81
  }),
82
82
  output: flags.output,
83
83
  verbose: flags.verbose,
@@ -1,5 +1,5 @@
1
1
  import { Command, Flags } from '@oclif/core';
2
- import { TEST_FORMAT_FLAG, TEST_FORMAT_MAP, resolveLegacyFormat } from '../../lib/format-compat.js';
2
+ import { TEST_FORMAT_FLAG, TEST_FORMAT_MAP, ResolveLegacyFormat } from '../../lib/format-compat.js';
3
3
  export default class TestHistory extends Command {
4
4
  static { this.description = 'View test execution history'; }
5
5
  static { this.examples = [
@@ -47,11 +47,11 @@ export default class TestHistory extends Command {
47
47
  recent: flags.recent,
48
48
  from: flags.from,
49
49
  status: flags.status,
50
- format: resolveLegacyFormat({
51
- format: flags.format,
52
- legacy: 'console',
53
- legacyDefault: 'console',
54
- map: TEST_FORMAT_MAP,
50
+ format: ResolveLegacyFormat({
51
+ Format: flags.format,
52
+ Legacy: 'console',
53
+ LegacyDefault: 'console',
54
+ Map: TEST_FORMAT_MAP,
55
55
  }),
56
56
  output: flags.output,
57
57
  verbose: flags.verbose,
@@ -1,5 +1,5 @@
1
1
  import { Command, Flags } from '@oclif/core';
2
- import { TEST_FORMAT_FLAG, TEST_FORMAT_MAP, resolveLegacyFormat } from '../../lib/format-compat.js';
2
+ import { TEST_FORMAT_FLAG, TEST_FORMAT_MAP, ResolveLegacyFormat } from '../../lib/format-compat.js';
3
3
  export default class TestList extends Command {
4
4
  static { this.description = 'List available tests, suites, and types'; }
5
5
  static { this.examples = [
@@ -54,11 +54,11 @@ export default class TestList extends Command {
54
54
  type: flags.type,
55
55
  tag: flags.tag,
56
56
  status: flags.status,
57
- format: resolveLegacyFormat({
58
- format: flags.format,
59
- legacy: 'console',
60
- legacyDefault: 'console',
61
- map: TEST_FORMAT_MAP,
57
+ format: ResolveLegacyFormat({
58
+ Format: flags.format,
59
+ Legacy: 'console',
60
+ LegacyDefault: 'console',
61
+ Map: TEST_FORMAT_MAP,
62
62
  }),
63
63
  output: flags.output,
64
64
  verbose: flags.verbose,
@@ -1,7 +1,7 @@
1
1
  import { Args, Command, Flags } from '@oclif/core';
2
2
  import { existsSync } from 'node:fs';
3
3
  import path from 'node:path';
4
- import { dockerComposeArgs, GEN_FORMS_SCRIPT, requireMonorepoRoot, spawnInherit, } from '../../../lib/regression/docker-helpers.js';
4
+ import { DockerComposeArgs, GEN_FORMS_SCRIPT, RequireMonorepoRoot, SpawnInherit, } from '../../../lib/regression/docker-helpers.js';
5
5
  const GENERATED_FORMS_DIR = 'docker/regression/.docker-generated/MJExplorer-forms/Entities';
6
6
  export default class TestRegressionBuild extends Command {
7
7
  static { this.description = 'Build Docker images for the regression stack. On first run (or whenever ' +
@@ -29,18 +29,18 @@ export default class TestRegressionBuild extends Command {
29
29
  }; }
30
30
  async run() {
31
31
  const { argv, flags } = await this.parse(TestRegressionBuild);
32
- requireMonorepoRoot();
32
+ RequireMonorepoRoot();
33
33
  if (!flags['skip-gen-forms'] && !existsSync(path.resolve(GENERATED_FORMS_DIR))) {
34
34
  this.log('▶ .docker-generated/ is empty — running `gen-forms` first (one-time, ~5 min)...');
35
- const genCode = await spawnInherit('bash', [GEN_FORMS_SCRIPT]);
35
+ const genCode = await SpawnInherit('bash', [GEN_FORMS_SCRIPT]);
36
36
  if (genCode !== 0)
37
37
  this.exit(genCode);
38
38
  }
39
39
  // Pass-through any positional service names so users can rebuild a
40
40
  // single image (e.g. `mj test regression build mjexplorer`).
41
41
  const services = argv.filter(Boolean);
42
- const composeArgs = dockerComposeArgs('full', ['build', ...services]);
43
- const code = await spawnInherit('docker', composeArgs);
42
+ const composeArgs = DockerComposeArgs('full', ['build', ...services]);
43
+ const code = await SpawnInherit('docker', composeArgs);
44
44
  if (code !== 0)
45
45
  this.exit(code);
46
46
  }
@@ -1,5 +1,5 @@
1
1
  import { Command, Flags } from '@oclif/core';
2
- import { isInsideMonorepo, spawnInherit } from '../../../lib/regression/docker-helpers.js';
2
+ import { IsInsideMonorepo, SpawnInherit } from '../../../lib/regression/docker-helpers.js';
3
3
  import { TEST_FORMAT_FLAG } from '../../../lib/format-compat.js';
4
4
  const REGRESSION_RESULTS_DIR = 'docker/regression/test-results';
5
5
  const EXTERNAL_RESULTS_DIR = 'test-results';
@@ -35,7 +35,7 @@ export default class TestRegressionCompare extends Command {
35
35
  const { flags } = await this.parse(TestRegressionCompare);
36
36
  // Results live under docker/regression/test-results in the monorepo, or
37
37
  // ./test-results when running externally (where remote/up wrote them).
38
- const resultsDir = isInsideMonorepo() ? REGRESSION_RESULTS_DIR : EXTERNAL_RESULTS_DIR;
38
+ const resultsDir = IsInsideMonorepo() ? REGRESSION_RESULTS_DIR : EXTERNAL_RESULTS_DIR;
39
39
  // --tag flips us to DB mode (results.json doesn't carry Tags), so drop
40
40
  // --from-json when the user asks for tag filtering.
41
41
  const args = ['test', 'compare'];
@@ -56,7 +56,7 @@ export default class TestRegressionCompare extends Command {
56
56
  args.push('--verbose');
57
57
  // Re-invoke the same `mj` binary. argv[1] is the entry script path.
58
58
  const mjBin = process.argv[1] ?? 'mj';
59
- const code = await spawnInherit(process.execPath, [mjBin, ...args]);
59
+ const code = await SpawnInherit(process.execPath, [mjBin, ...args]);
60
60
  if (code !== 0)
61
61
  this.exit(code);
62
62
  }
@@ -1,5 +1,5 @@
1
1
  import { Command, Flags } from '@oclif/core';
2
- import { dockerComposeArgs, requireMonorepoRoot, spawnInherit, } from '../../../lib/regression/docker-helpers.js';
2
+ import { DockerComposeArgs, RequireMonorepoRoot, SpawnInherit, } from '../../../lib/regression/docker-helpers.js';
3
3
  export default class TestRegressionDown extends Command {
4
4
  static { this.description = 'Stop the regression stack and wipe DB volumes (docker compose down -v).'; }
5
5
  static { this.examples = [
@@ -14,14 +14,14 @@ export default class TestRegressionDown extends Command {
14
14
  }; }
15
15
  async run() {
16
16
  const { flags } = await this.parse(TestRegressionDown);
17
- requireMonorepoRoot();
17
+ RequireMonorepoRoot();
18
18
  // Use `--profile *` so compose tears down services in every profile,
19
19
  // not just the active one. Otherwise `down` leaves orphan containers
20
20
  // from a profile we haven't named.
21
- const composeArgs = dockerComposeArgs(undefined, ['--profile', '*', 'down']);
21
+ const composeArgs = DockerComposeArgs(undefined, ['--profile', '*', 'down']);
22
22
  if (!flags['keep-volumes'])
23
23
  composeArgs.push('-v');
24
- const code = await spawnInherit('docker', composeArgs);
24
+ const code = await SpawnInherit('docker', composeArgs);
25
25
  if (code !== 0)
26
26
  this.exit(code);
27
27
  }
@@ -1,7 +1,7 @@
1
1
  import { Command, Flags } from '@oclif/core';
2
2
  import { existsSync } from 'node:fs';
3
3
  import path from 'node:path';
4
- import { AGENTIC_TEST_RUNNER_IMAGE, dockerRunArgs, INLINE_REPORT_SCRIPT, isInsideMonorepo, RESULTS_DIR, spawnInherit, } from '../../../lib/regression/docker-helpers.js';
4
+ import { AGENTIC_TEST_RUNNER_IMAGE, DockerRunArgs, INLINE_REPORT_SCRIPT, IsInsideMonorepo, RESULTS_DIR, SpawnInherit, } from '../../../lib/regression/docker-helpers.js';
5
5
  export default class TestRegressionExport extends Command {
6
6
  static { this.description = 'Export a regression run\'s HTML report as a single self-contained file ' +
7
7
  '(screenshots inlined as base64), producing report.standalone.html. ' +
@@ -22,7 +22,7 @@ export default class TestRegressionExport extends Command {
22
22
  }; }
23
23
  async run() {
24
24
  const { flags } = await this.parse(TestRegressionExport);
25
- if (isInsideMonorepo()) {
25
+ if (IsInsideMonorepo()) {
26
26
  // On-disk inline-report.cjs against docker/regression/test-results.
27
27
  if (!existsSync(INLINE_REPORT_SCRIPT))
28
28
  this.error(`✗ Exporter missing: ${INLINE_REPORT_SCRIPT}`);
@@ -35,7 +35,7 @@ export default class TestRegressionExport extends Command {
35
35
  this.error(`✗ Run directory not found: ${runDir}`);
36
36
  args.push(runDir);
37
37
  }
38
- const code = await spawnInherit(process.execPath, args);
38
+ const code = await SpawnInherit(process.execPath, args);
39
39
  if (code !== 0)
40
40
  this.exit(code);
41
41
  return;
@@ -48,7 +48,7 @@ export default class TestRegressionExport extends Command {
48
48
  this.error(`✗ No ./test-results directory found to export from.`);
49
49
  const runArg = flags.run ? `/app/test-results/${path.basename(flags.run)}` : '/app/test-results/latest';
50
50
  this.log(`▶ docker run ${image} export ${runArg}`);
51
- const code = await spawnInherit('docker', dockerRunArgs(image, ['export', runArg], { mounts: [[resultsDir, '/app/test-results']] }));
51
+ const code = await SpawnInherit('docker', DockerRunArgs(image, ['export', runArg], { mounts: [[resultsDir, '/app/test-results']] }));
52
52
  if (code !== 0)
53
53
  this.exit(code);
54
54
  }
@@ -1,16 +1,16 @@
1
1
  import { Command } from '@oclif/core';
2
2
  import { existsSync } from 'node:fs';
3
- import { GEN_FORMS_SCRIPT, requireMonorepoRoot, spawnInherit, } from '../../../lib/regression/docker-helpers.js';
3
+ import { GEN_FORMS_SCRIPT, RequireMonorepoRoot, SpawnInherit, } from '../../../lib/regression/docker-helpers.js';
4
4
  export default class TestRegressionGenForms extends Command {
5
5
  static { this.description = 'Regenerate Angular entity forms used by the regression MJExplorer image. ' +
6
6
  'Slow (~5 min) — only required after schema or codegen changes.'; }
7
7
  static { this.examples = ['<%= config.bin %> <%= command.id %>']; }
8
8
  async run() {
9
- requireMonorepoRoot();
9
+ RequireMonorepoRoot();
10
10
  if (!existsSync(GEN_FORMS_SCRIPT)) {
11
11
  this.error(`✗ ${GEN_FORMS_SCRIPT} not found. Verify the docker/regression/ directory is intact.`);
12
12
  }
13
- const code = await spawnInherit('bash', [GEN_FORMS_SCRIPT]);
13
+ const code = await SpawnInherit('bash', [GEN_FORMS_SCRIPT]);
14
14
  if (code !== 0)
15
15
  this.exit(code);
16
16
  }
@@ -1,7 +1,7 @@
1
1
  import { Command, Flags } from '@oclif/core';
2
2
  import { existsSync } from 'node:fs';
3
3
  import path from 'node:path';
4
- import { AGENTIC_TEST_RUNNER_IMAGE, dockerComposeArgs, dockerRunArgs, isInsideMonorepo, LOAD_TARGET_SCRIPT, resolveStandaloneCompose, resolveTargetPath, spawnCapture, spawnInherit, STANDALONE_COMPOSE, } from '../../../lib/regression/docker-helpers.js';
4
+ import { AGENTIC_TEST_RUNNER_IMAGE, DockerComposeArgs, DockerRunArgs, IsInsideMonorepo, LOAD_TARGET_SCRIPT, ResolveStandaloneCompose, ResolveTargetPath, SpawnCapture, SpawnInherit, STANDALONE_COMPOSE, } from '../../../lib/regression/docker-helpers.js';
5
5
  export default class TestRegressionRemote extends Command {
6
6
  static { this.description = 'Run the regression suite against a remote URL (Mode B/C/D). Inside the MJ ' +
7
7
  'monorepo it drives the local compose stack; outside it runs the published ' +
@@ -40,7 +40,7 @@ export default class TestRegressionRemote extends Command {
40
40
  }; }
41
41
  async run() {
42
42
  const { flags } = await this.parse(TestRegressionRemote);
43
- if (isInsideMonorepo()) {
43
+ if (IsInsideMonorepo()) {
44
44
  await this.runInMonorepo(flags);
45
45
  }
46
46
  else {
@@ -51,11 +51,11 @@ export default class TestRegressionRemote extends Command {
51
51
  async runInMonorepo(flags) {
52
52
  if (!existsSync(LOAD_TARGET_SCRIPT))
53
53
  this.error(`✗ Loader missing: ${LOAD_TARGET_SCRIPT}`);
54
- const targetPath = resolveTargetPath(flags.target);
54
+ const targetPath = ResolveTargetPath(flags.target);
55
55
  if (!existsSync(targetPath))
56
56
  this.error(`✗ Target profile not found: ${targetPath}`);
57
57
  this.log(`▶ Loading target profile: ${targetPath}`);
58
- const loaded = await spawnCapture(process.execPath, [LOAD_TARGET_SCRIPT, '--format=json', targetPath]);
58
+ const loaded = await SpawnCapture(process.execPath, [LOAD_TARGET_SCRIPT, '--format=json', targetPath]);
59
59
  if (loaded.code !== 0)
60
60
  this.error(`✗ Target profile loader failed (exit ${loaded.code})`);
61
61
  let envFromProfile;
@@ -76,11 +76,11 @@ export default class TestRegressionRemote extends Command {
76
76
  });
77
77
  if (overlays.length > 0)
78
78
  this.log(` Overlays: ${overlays.join(', ')}`);
79
- const composeArgs = dockerComposeArgs(composeProfile, ['up'], overlays);
79
+ const composeArgs = DockerComposeArgs(composeProfile, ['up'], overlays);
80
80
  if (flags.detach)
81
81
  composeArgs.push('-d');
82
82
  this.log(`▶ docker compose --profile ${composeProfile} up`);
83
- const code = await spawnInherit('docker', composeArgs, { env: childEnv });
83
+ const code = await SpawnInherit('docker', composeArgs, { env: childEnv });
84
84
  if (code !== 0)
85
85
  this.exit(code);
86
86
  }
@@ -90,7 +90,7 @@ export default class TestRegressionRemote extends Command {
90
90
  * with the bundled standalone compose + the user's app overlay.
91
91
  */
92
92
  async runExternal(flags) {
93
- const targetPath = resolveTargetPath(flags.target);
93
+ const targetPath = ResolveTargetPath(flags.target);
94
94
  if (!existsSync(targetPath)) {
95
95
  this.error(`✗ Target profile not found: ${targetPath}\n Outside the monorepo, pass a path (e.g. --target=./my-suite/target.json).`);
96
96
  }
@@ -106,7 +106,7 @@ export default class TestRegressionRemote extends Command {
106
106
  });
107
107
  if (overlays.length > 0) {
108
108
  // Mode D — boot the app overlay alongside the runner via the standalone compose.
109
- const standalone = resolveStandaloneCompose(STANDALONE_COMPOSE);
109
+ const standalone = ResolveStandaloneCompose(STANDALONE_COMPOSE);
110
110
  if (!existsSync(standalone)) {
111
111
  this.error(`✗ Standalone compose not found (${standalone}). Reinstall @memberjunction/cli or run from the monorepo.`);
112
112
  }
@@ -122,14 +122,14 @@ export default class TestRegressionRemote extends Command {
122
122
  args.push('-f', o);
123
123
  args.push('up', '--abort-on-container-exit', '--exit-code-from', 'test-runner');
124
124
  this.log(`▶ docker compose (standalone + ${overlays.length} overlay) — image ${image}`);
125
- const code = await spawnInherit('docker', args, { env: childEnv });
125
+ const code = await SpawnInherit('docker', args, { env: childEnv });
126
126
  if (code !== 0)
127
127
  this.exit(code);
128
128
  return;
129
129
  }
130
130
  // Mode B/C — single `docker run` against the published image.
131
131
  this.log(`▶ docker run ${image} run --target=/work/${targetFile}`);
132
- const code = await spawnInherit('docker', dockerRunArgs(image, ['run', `--target=/work/${targetFile}`], {
132
+ const code = await SpawnInherit('docker', DockerRunArgs(image, ['run', `--target=/work/${targetFile}`], {
133
133
  mounts: [[targetDir, '/work'], [resultsDir, '/app/test-results']],
134
134
  envFile,
135
135
  }));
@@ -1,7 +1,7 @@
1
1
  import { Command, Flags } from '@oclif/core';
2
2
  import { existsSync, statSync } from 'node:fs';
3
3
  import path from 'node:path';
4
- import { AGENTIC_TEST_RUNNER_IMAGE, BACPAC_OVERLAY, BACPAC_STANDALONE_COMPOSE, dockerComposeArgs, isInsideMonorepo, resolveStandaloneCompose, spawnInherit, } from '../../../lib/regression/docker-helpers.js';
4
+ import { AGENTIC_TEST_RUNNER_IMAGE, BACPAC_OVERLAY, BACPAC_STANDALONE_COMPOSE, DockerComposeArgs, IsInsideMonorepo, ResolveStandaloneCompose, SpawnInherit, } from '../../../lib/regression/docker-helpers.js';
5
5
  export default class TestRegressionUp extends Command {
6
6
  static { this.description = 'Run the self-contained MJ regression stack (Mode A). With --bacpac, the DB is imported ' +
7
7
  'from a .bacpac. Inside the monorepo this builds from source; outside, --bacpac runs the ' +
@@ -30,7 +30,7 @@ export default class TestRegressionUp extends Command {
30
30
  if ((flags['bacpac-no-upgrade'] || flags.metadata) && !flags.bacpac) {
31
31
  this.error('--bacpac-no-upgrade and --metadata require --bacpac.');
32
32
  }
33
- if (isInsideMonorepo()) {
33
+ if (IsInsideMonorepo()) {
34
34
  await this.runInMonorepo(flags);
35
35
  }
36
36
  else {
@@ -63,10 +63,10 @@ export default class TestRegressionUp extends Command {
63
63
  childEnv.TEST_SUITE_NAME = flags.suite;
64
64
  this.log(` Suite: ${flags.suite}`);
65
65
  }
66
- const composeArgs = dockerComposeArgs('full', ['up'], overlays);
66
+ const composeArgs = DockerComposeArgs('full', ['up'], overlays);
67
67
  if (flags.detach)
68
68
  composeArgs.push('-d');
69
- const code = await spawnInherit('docker', composeArgs, { env: childEnv });
69
+ const code = await SpawnInherit('docker', composeArgs, { env: childEnv });
70
70
  if (code !== 0)
71
71
  this.exit(code);
72
72
  }
@@ -85,7 +85,7 @@ export default class TestRegressionUp extends Command {
85
85
  const metaAbs = path.resolve(flags.metadata);
86
86
  if (!existsSync(metaAbs) || !statSync(metaAbs).isDirectory())
87
87
  this.error(`✗ --metadata directory not found: ${metaAbs}`);
88
- const compose = resolveStandaloneCompose(BACPAC_STANDALONE_COMPOSE);
88
+ const compose = ResolveStandaloneCompose(BACPAC_STANDALONE_COMPOSE);
89
89
  if (!existsSync(compose))
90
90
  this.error(`✗ Standalone bacpac compose not found (${compose}). Reinstall @memberjunction/cli.`);
91
91
  const childEnv = {
@@ -103,7 +103,7 @@ export default class TestRegressionUp extends Command {
103
103
  this.warn('External bacpac requires the `memberjunction/explorer` image (a published-Explorer prerequisite ' +
104
104
  'that is a separate workstream). If it cannot be pulled, the explorer service will fail to start.');
105
105
  this.log(`▶ docker compose (bacpac-standalone) — bacpac=${abs} upgrade=${childEnv.BACPAC_UPGRADE}`);
106
- const code = await spawnInherit('docker', ['compose', '-f', compose, 'up', '--abort-on-container-exit', '--exit-code-from', 'test-runner'], { env: childEnv });
106
+ const code = await SpawnInherit('docker', ['compose', '-f', compose, 'up', '--abort-on-container-exit', '--exit-code-from', 'test-runner'], { env: childEnv });
107
107
  if (code !== 0)
108
108
  this.exit(code);
109
109
  }
@@ -1,5 +1,5 @@
1
1
  import { Command, Flags, Args } from '@oclif/core';
2
- import { TEST_FORMAT_FLAG, TEST_FORMAT_MAP, resolveLegacyFormat } from '../../lib/format-compat.js';
2
+ import { TEST_FORMAT_FLAG, TEST_FORMAT_MAP, ResolveLegacyFormat } from '../../lib/format-compat.js';
3
3
  export default class TestRun extends Command {
4
4
  static { this.description = 'Execute a single test by ID or name'; }
5
5
  static { this.examples = [
@@ -59,11 +59,11 @@ export default class TestRun extends Command {
59
59
  await runCommand.execute(args.testId, {
60
60
  name: flags.name,
61
61
  environment: flags.environment,
62
- format: resolveLegacyFormat({
63
- format: flags.format,
64
- legacy: 'console',
65
- legacyDefault: 'console',
66
- map: TEST_FORMAT_MAP,
62
+ format: ResolveLegacyFormat({
63
+ Format: flags.format,
64
+ Legacy: 'console',
65
+ LegacyDefault: 'console',
66
+ Map: TEST_FORMAT_MAP,
67
67
  }),
68
68
  output: flags.output,
69
69
  dryRun: flags['dry-run'],
@@ -0,0 +1,13 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class TestScripts extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ test: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
7
+ promote: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
8
+ discard: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
9
+ yes: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
10
+ };
11
+ run(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=scripts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts.d.ts","sourceRoot":"","sources":["../../../src/commands/test/scripts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;IAC9C,MAAM,CAAC,WAAW,SAGkE;IAEpF,MAAM,CAAC,QAAQ,WAMb;IAEF,MAAM,CAAC,KAAK;;;;;MAmBV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB3B"}
@@ -0,0 +1,50 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ export default class TestScripts extends Command {
3
+ static { this.description = 'Review and promote recorded replay scripts. A run that re-derives a test which already had a ' +
4
+ 'script stores the new one as pending rather than replacing what replay uses, so a UI change ' +
5
+ 'never rewrites the suite unnoticed. This is where you see the drift and decide.'; }
6
+ static { this.examples = [
7
+ '<%= config.bin %> <%= command.id %>',
8
+ '<%= config.bin %> <%= command.id %> --test "T042 - Filter Grid"',
9
+ '<%= config.bin %> <%= command.id %> --promote --test "T042 - Filter Grid"',
10
+ '<%= config.bin %> <%= command.id %> --promote --yes',
11
+ '<%= config.bin %> <%= command.id %> --discard --test "T042 - Filter Grid"',
12
+ ]; }
13
+ static { this.flags = {
14
+ test: Flags.string({
15
+ description: 'Limit to one test, by name or ID',
16
+ }),
17
+ promote: Flags.boolean({
18
+ description: 'Promote the pending script(s) into the slot replay uses',
19
+ default: false,
20
+ exclusive: ['discard'],
21
+ }),
22
+ discard: Flags.boolean({
23
+ description: 'Drop the pending script(s), keeping the promoted one',
24
+ default: false,
25
+ exclusive: ['promote'],
26
+ }),
27
+ yes: Flags.boolean({
28
+ char: 'y',
29
+ description: 'Confirm a bulk --promote/--discard that was not narrowed with --test',
30
+ default: false,
31
+ }),
32
+ }; }
33
+ async run() {
34
+ const { flags } = await this.parse(TestScripts);
35
+ const { ScriptsCommand } = await import('@memberjunction/testing-cli');
36
+ try {
37
+ const scriptsCommand = new ScriptsCommand();
38
+ await scriptsCommand.execute({
39
+ test: flags.test,
40
+ promote: flags.promote,
41
+ discard: flags.discard,
42
+ yes: flags.yes,
43
+ });
44
+ }
45
+ catch (error) {
46
+ this.error(error);
47
+ }
48
+ }
49
+ }
50
+ //# sourceMappingURL=scripts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../../src/commands/test/scripts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;aACvC,gBAAW,GAChB,+FAA+F;QAC/F,8FAA8F;QAC9F,iFAAiF,CAAC;aAE7E,aAAQ,GAAG;QAChB,qCAAqC;QACrC,iEAAiE;QACjE,2EAA2E;QAC3E,qDAAqD;QACrD,2EAA2E;KAC5E,CAAC;aAEK,UAAK,GAAG;QACb,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,kCAAkC;SAChD,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;YACrB,WAAW,EAAE,yDAAyD;YACtE,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,CAAC,SAAS,CAAC;SACvB,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;YACrB,WAAW,EAAE,sDAAsD;YACnE,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,CAAC,SAAS,CAAC;SACvB,CAAC;QACF,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC;YACjB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,sEAAsE;YACnF,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAEvE,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;YAC5C,MAAM,cAAc,CAAC,OAAO,CAAC;gBAC3B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,GAAG,EAAE,KAAK,CAAC,GAAG;aACf,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,KAAc,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { Command, Flags, Args } from '@oclif/core';
2
- import { TEST_FORMAT_FLAG, TEST_FORMAT_MAP, resolveLegacyFormat } from '../../lib/format-compat.js';
2
+ import { TEST_FORMAT_FLAG, TEST_FORMAT_MAP, ResolveLegacyFormat } from '../../lib/format-compat.js';
3
3
  export default class TestSuite extends Command {
4
4
  static { this.description = 'Execute a test suite'; }
5
5
  static { this.examples = [
@@ -66,11 +66,11 @@ export default class TestSuite extends Command {
66
66
  const suiteCommand = new SuiteCommand();
67
67
  await suiteCommand.execute(args.suiteId, {
68
68
  name: flags.name,
69
- format: resolveLegacyFormat({
70
- format: flags.format,
71
- legacy: 'console',
72
- legacyDefault: 'console',
73
- map: TEST_FORMAT_MAP,
69
+ format: ResolveLegacyFormat({
70
+ Format: flags.format,
71
+ Legacy: 'console',
72
+ LegacyDefault: 'console',
73
+ Map: TEST_FORMAT_MAP,
74
74
  }),
75
75
  output: flags.output,
76
76
  verbose: flags.verbose,
@@ -1,5 +1,5 @@
1
1
  import { Command, Flags, Args } from '@oclif/core';
2
- import { TEST_FORMAT_FLAG, TEST_FORMAT_MAP, resolveLegacyFormat } from '../../lib/format-compat.js';
2
+ import { TEST_FORMAT_FLAG, TEST_FORMAT_MAP, ResolveLegacyFormat } from '../../lib/format-compat.js';
3
3
  export default class TestValidate extends Command {
4
4
  static { this.description = 'Validate test definitions without executing'; }
5
5
  static { this.examples = [
@@ -51,11 +51,11 @@ export default class TestValidate extends Command {
51
51
  all: flags.all,
52
52
  type: flags.type,
53
53
  saveReport: flags['save-report'],
54
- format: resolveLegacyFormat({
55
- format: flags.format,
56
- legacy: 'console',
57
- legacyDefault: 'console',
58
- map: TEST_FORMAT_MAP,
54
+ format: ResolveLegacyFormat({
55
+ Format: flags.format,
56
+ Legacy: 'console',
57
+ LegacyDefault: 'console',
58
+ Map: TEST_FORMAT_MAP,
59
59
  }),
60
60
  output: flags.output,
61
61
  verbose: flags.verbose,
@@ -87,8 +87,8 @@ export default class TranslateSQL extends Command {
87
87
  }
88
88
  if (result.classification === 'rule-based') {
89
89
  const translated = RuleBasedTranslate(sql, from, to);
90
- this.log(`\nRule-based translation (${translated.appliedRules.join(', ')}):`);
91
- this.log(translated.translatedSQL);
90
+ this.log(`\nRule-based translation (${translated.AppliedRules.join(', ')}):`);
91
+ this.log(translated.TranslatedSQL);
92
92
  return;
93
93
  }
94
94
  // LLM-needed
@@ -123,43 +123,43 @@ export default class TranslateSQL extends Command {
123
123
  const classResult = classified[i];
124
124
  if (classResult.classification === 'standard') {
125
125
  reportItems.push({
126
- source: item.label,
127
- originalSQL: item.sql,
128
- classification: 'standard',
129
- translatedSQL: null,
130
- method: 'skipped',
131
- markers: classResult.markers,
126
+ Source: item.label,
127
+ OriginalSQL: item.sql,
128
+ Classification: 'standard',
129
+ TranslatedSQL: null,
130
+ Method: 'skipped',
131
+ Markers: classResult.markers,
132
132
  });
133
133
  continue;
134
134
  }
135
135
  if (classResult.classification === 'rule-based') {
136
136
  const translated = RuleBasedTranslate(item.sql, from, to);
137
137
  reportItems.push({
138
- source: item.label,
139
- originalSQL: item.sql,
140
- classification: 'rule-based',
141
- translatedSQL: translated.translatedSQL,
142
- method: 'rule-based',
143
- markers: classResult.markers,
144
- note: `Rules: ${translated.appliedRules.join(', ')}`,
138
+ Source: item.label,
139
+ OriginalSQL: item.sql,
140
+ Classification: 'rule-based',
141
+ TranslatedSQL: translated.TranslatedSQL,
142
+ Method: 'rule-based',
143
+ Markers: classResult.markers,
144
+ Note: `Rules: ${translated.AppliedRules.join(', ')}`,
145
145
  });
146
146
  continue;
147
147
  }
148
148
  // LLM-needed — flag for review
149
149
  reportItems.push({
150
- source: item.label,
151
- originalSQL: item.sql,
152
- classification: 'llm-needed',
153
- translatedSQL: null,
154
- method: 'flagged',
155
- markers: classResult.markers,
156
- note: 'Requires LLM translation — configure AI provider and re-run.',
150
+ Source: item.label,
151
+ OriginalSQL: item.sql,
152
+ Classification: 'llm-needed',
153
+ TranslatedSQL: null,
154
+ Method: 'flagged',
155
+ Markers: classResult.markers,
156
+ Note: 'Requires LLM translation — configure AI provider and re-run.',
157
157
  });
158
158
  }
159
159
  // Print summary
160
- const standard = reportItems.filter(i => i.classification === 'standard').length;
161
- const ruleBased = reportItems.filter(i => i.method === 'rule-based').length;
162
- const flagged = reportItems.filter(i => i.method === 'flagged').length;
160
+ const standard = reportItems.filter(i => i.Classification === 'standard').length;
161
+ const ruleBased = reportItems.filter(i => i.Method === 'rule-based').length;
162
+ const flagged = reportItems.filter(i => i.Method === 'flagged').length;
163
163
  this.log(`\nResults:`);
164
164
  this.log(` Total fragments: ${reportItems.length}`);
165
165
  this.log(` Standard SQL (no translation): ${standard}`);