@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.
- package/README.md +18 -7
- package/dist/baseline/cli-helpers.d.ts +4 -0
- package/dist/baseline/cli-helpers.d.ts.map +1 -1
- package/dist/baseline/cli-helpers.js +18 -10
- package/dist/baseline/cli-helpers.js.map +1 -1
- package/dist/baseline/comparator.d.ts +5 -3
- package/dist/baseline/comparator.d.ts.map +1 -1
- package/dist/baseline/comparator.js +142 -138
- package/dist/baseline/comparator.js.map +1 -1
- package/dist/baseline/connection.d.ts +8 -6
- package/dist/baseline/connection.d.ts.map +1 -1
- package/dist/baseline/connection.js +16 -12
- package/dist/baseline/connection.js.map +1 -1
- package/dist/baseline/data-dumper.d.ts +7 -3
- package/dist/baseline/data-dumper.d.ts.map +1 -1
- package/dist/baseline/data-dumper.js +33 -25
- package/dist/baseline/data-dumper.js.map +1 -1
- package/dist/baseline/emitter.d.ts +5 -3
- package/dist/baseline/emitter.d.ts.map +1 -1
- package/dist/baseline/emitter.js +114 -110
- package/dist/baseline/emitter.js.map +1 -1
- package/dist/baseline/index.d.ts +7 -7
- package/dist/baseline/index.d.ts.map +1 -1
- package/dist/baseline/index.js +7 -7
- package/dist/baseline/index.js.map +1 -1
- package/dist/baseline/introspector-mssql.d.ts +2 -0
- package/dist/baseline/introspector-mssql.d.ts.map +1 -1
- package/dist/baseline/introspector-mssql.js +68 -64
- package/dist/baseline/introspector-mssql.js.map +1 -1
- package/dist/baseline/introspector-postgres.d.ts +2 -0
- package/dist/baseline/introspector-postgres.d.ts.map +1 -1
- package/dist/baseline/introspector-postgres.js +34 -30
- package/dist/baseline/introspector-postgres.js.map +1 -1
- package/dist/baseline/report.d.ts +4 -0
- package/dist/baseline/report.d.ts.map +1 -1
- package/dist/baseline/report.js +25 -17
- package/dist/baseline/report.js.map +1 -1
- package/dist/baseline/types.d.ts +71 -71
- package/dist/baseline/util.d.ts +54 -6
- package/dist/baseline/util.d.ts.map +1 -1
- package/dist/baseline/util.js +112 -36
- package/dist/baseline/util.js.map +1 -1
- package/dist/commands/agent/init.d.ts +23 -0
- package/dist/commands/agent/init.d.ts.map +1 -0
- package/dist/commands/agent/init.js +222 -0
- package/dist/commands/agent/init.js.map +1 -0
- package/dist/commands/ai/actions/list.js +7 -7
- package/dist/commands/ai/actions/run.js +7 -7
- package/dist/commands/ai/agents/list.js +7 -7
- package/dist/commands/ai/agents/run.js +9 -9
- package/dist/commands/ai/audit/agent-run.js +7 -7
- package/dist/commands/ai/prompts/run.js +7 -7
- package/dist/commands/app/check-updates.js +5 -5
- package/dist/commands/app/disable.js +2 -2
- package/dist/commands/app/enable.js +2 -2
- package/dist/commands/app/info.js +2 -2
- package/dist/commands/app/install.js +2 -2
- package/dist/commands/app/list.js +2 -2
- package/dist/commands/app/remove.js +4 -4
- package/dist/commands/app/upgrade.js +2 -2
- package/dist/commands/artifacts/reclassify.js +2 -2
- package/dist/commands/baseline/build.js +31 -31
- package/dist/commands/baseline/build.js.map +1 -1
- package/dist/commands/baseline/compare.js +36 -36
- package/dist/commands/baseline/roundtrip.js +56 -54
- package/dist/commands/baseline/roundtrip.js.map +1 -1
- package/dist/commands/bundle/index.js +4 -4
- package/dist/commands/clean/index.js +3 -3
- package/dist/commands/codegen/manifest.d.ts +2 -0
- package/dist/commands/codegen/manifest.d.ts.map +1 -1
- package/dist/commands/codegen/manifest.js +8 -4
- package/dist/commands/codegen/manifest.js.map +1 -1
- package/dist/commands/dev/workspace/index.d.ts +2 -0
- package/dist/commands/dev/workspace/index.d.ts.map +1 -1
- package/dist/commands/dev/workspace/index.js +8 -4
- package/dist/commands/dev/workspace/index.js.map +1 -1
- package/dist/commands/doctor/index.d.ts +6 -4
- package/dist/commands/doctor/index.d.ts.map +1 -1
- package/dist/commands/doctor/index.js +43 -18
- package/dist/commands/doctor/index.js.map +1 -1
- package/dist/commands/install/claude.d.ts +2 -0
- package/dist/commands/install/claude.d.ts.map +1 -1
- package/dist/commands/install/claude.js +11 -7
- package/dist/commands/install/claude.js.map +1 -1
- package/dist/commands/install/index.js +3 -3
- package/dist/commands/migrate/convert.d.ts +21 -0
- package/dist/commands/migrate/convert.d.ts.map +1 -1
- package/dist/commands/migrate/convert.js +22 -6
- package/dist/commands/migrate/convert.js.map +1 -1
- package/dist/commands/migrate/create.js +2 -2
- package/dist/commands/migrate/index.js +16 -16
- package/dist/commands/sync/file-reset.js +2 -2
- package/dist/commands/sync/init.js +3 -3
- package/dist/commands/test/compare.js +6 -6
- package/dist/commands/test/history.js +6 -6
- package/dist/commands/test/list.js +6 -6
- package/dist/commands/test/regression/build.js +5 -5
- package/dist/commands/test/regression/compare.js +3 -3
- package/dist/commands/test/regression/down.js +4 -4
- package/dist/commands/test/regression/export.js +4 -4
- package/dist/commands/test/regression/gen-forms.js +3 -3
- package/dist/commands/test/regression/remote.js +10 -10
- package/dist/commands/test/regression/up.js +6 -6
- package/dist/commands/test/run.js +6 -6
- package/dist/commands/test/scripts.d.ts +13 -0
- package/dist/commands/test/scripts.d.ts.map +1 -0
- package/dist/commands/test/scripts.js +50 -0
- package/dist/commands/test/scripts.js.map +1 -0
- package/dist/commands/test/suite.js +6 -6
- package/dist/commands/test/validate.js +6 -6
- package/dist/commands/translate-sql/index.js +25 -25
- package/dist/commands/update/claude.js +7 -7
- package/dist/commands/usage.js +4 -4
- package/dist/config.d.ts +175 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +23 -9
- package/dist/config.js.map +1 -1
- package/dist/hooks/postrun.js +2 -2
- package/dist/hooks/prerun.js +2 -2
- package/dist/hooks/prerun.js.map +1 -1
- package/dist/init-templates/citizen-builder/.agents/skills/new-agent/SKILL.md +66 -0
- package/dist/init-templates/citizen-builder/.agents/skills/package-agent/SKILL.md +69 -0
- package/dist/init-templates/citizen-builder/.agents/skills/test-agent/SKILL.md +61 -0
- package/dist/init-templates/citizen-builder/.claude/skills/new-agent/SKILL.md +66 -0
- package/dist/init-templates/citizen-builder/.claude/skills/package-agent/SKILL.md +69 -0
- package/dist/init-templates/citizen-builder/.claude/skills/test-agent/SKILL.md +61 -0
- package/dist/init-templates/citizen-builder/.env.example +30 -0
- package/dist/init-templates/citizen-builder/AGENTS.md +331 -0
- package/dist/init-templates/citizen-builder/README.md +259 -0
- package/dist/init-templates/citizen-builder/docker/Dockerfile +16 -0
- package/dist/init-templates/citizen-builder/docker-compose.yml +59 -0
- package/dist/init-templates/citizen-builder/docs/ENTERPRISE_ORG_SETUP.md +73 -0
- package/dist/init-templates/citizen-builder/docs/PROMOTION_GUIDE.md +70 -0
- package/dist/init-templates/citizen-builder/metadata/.mj-sync.json +7 -0
- package/dist/init-templates/citizen-builder/metadata/agents/.customer-insight-agent.json +55 -0
- package/dist/init-templates/citizen-builder/metadata/agents/.mj-sync.json +45 -0
- package/dist/init-templates/citizen-builder/metadata/prompts/.customer-insight-prompt.json +15 -0
- package/dist/init-templates/citizen-builder/metadata/prompts/.mj-sync.json +45 -0
- package/dist/init-templates/citizen-builder/metadata/prompts/templates/customer-insight.template.md +18 -0
- package/dist/init-templates/citizen-builder/scripts/bootstrap.sh +47 -0
- package/dist/init-templates/citizen-builder/scripts/docker-entrypoint.sh +184 -0
- package/dist/init-templates/citizen-builder/scripts/generate-capabilities.sh +74 -0
- package/dist/init-templates/citizen-builder/scripts/query-run-history.sh +34 -0
- package/dist/init-templates/citizen-builder/scripts/sync-metadata.sh +14 -0
- package/dist/init-templates/remote-mj/README.md +4 -4
- package/dist/lib/claude-pack/ManagedBlockEditor.d.ts +6 -0
- package/dist/lib/claude-pack/ManagedBlockEditor.d.ts.map +1 -1
- package/dist/lib/claude-pack/ManagedBlockEditor.js +18 -6
- package/dist/lib/claude-pack/ManagedBlockEditor.js.map +1 -1
- package/dist/lib/claude-pack/PackFetcher.d.ts +8 -3
- package/dist/lib/claude-pack/PackFetcher.d.ts.map +1 -1
- package/dist/lib/claude-pack/PackFetcher.js +26 -18
- package/dist/lib/claude-pack/PackFetcher.js.map +1 -1
- package/dist/lib/claude-pack/PackInstaller.d.ts +6 -2
- package/dist/lib/claude-pack/PackInstaller.d.ts.map +1 -1
- package/dist/lib/claude-pack/PackInstaller.js +19 -13
- package/dist/lib/claude-pack/PackInstaller.js.map +1 -1
- package/dist/lib/claude-pack/PackMerger.d.ts +8 -0
- package/dist/lib/claude-pack/PackMerger.d.ts.map +1 -1
- package/dist/lib/claude-pack/PackMerger.js +63 -57
- package/dist/lib/claude-pack/PackMerger.js.map +1 -1
- package/dist/lib/claude-pack/PackOutputFormatter.d.ts +4 -0
- package/dist/lib/claude-pack/PackOutputFormatter.d.ts.map +1 -1
- package/dist/lib/claude-pack/PackOutputFormatter.js +10 -2
- package/dist/lib/claude-pack/PackOutputFormatter.js.map +1 -1
- package/dist/lib/claude-pack/PackPaths.d.ts +12 -0
- package/dist/lib/claude-pack/PackPaths.d.ts.map +1 -1
- package/dist/lib/claude-pack/PackPaths.js +31 -7
- package/dist/lib/claude-pack/PackPaths.js.map +1 -1
- package/dist/lib/claude-pack/PackTypes.d.ts +18 -14
- package/dist/lib/claude-pack/PackTypes.d.ts.map +1 -1
- package/dist/lib/claude-pack/PackTypes.js +11 -3
- package/dist/lib/claude-pack/PackTypes.js.map +1 -1
- package/dist/lib/claude-pack/SettingsMerger.d.ts +10 -0
- package/dist/lib/claude-pack/SettingsMerger.d.ts.map +1 -1
- package/dist/lib/claude-pack/SettingsMerger.js +36 -16
- package/dist/lib/claude-pack/SettingsMerger.js.map +1 -1
- package/dist/lib/cli-plugins.d.ts +2 -0
- package/dist/lib/cli-plugins.d.ts.map +1 -1
- package/dist/lib/cli-plugins.js +8 -4
- package/dist/lib/cli-plugins.js.map +1 -1
- package/dist/lib/db-preflight.d.ts +2 -0
- package/dist/lib/db-preflight.d.ts.map +1 -1
- package/dist/lib/db-preflight.js +12 -8
- package/dist/lib/db-preflight.js.map +1 -1
- package/dist/lib/db-version.d.ts +2 -0
- package/dist/lib/db-version.d.ts.map +1 -1
- package/dist/lib/db-version.js +5 -1
- package/dist/lib/db-version.js.map +1 -1
- package/dist/lib/derived-usage.d.ts +14 -8
- package/dist/lib/derived-usage.d.ts.map +1 -1
- package/dist/lib/derived-usage.js +30 -18
- package/dist/lib/derived-usage.js.map +1 -1
- package/dist/lib/domain-profiles.d.ts +4 -2
- package/dist/lib/domain-profiles.d.ts.map +1 -1
- package/dist/lib/domain-profiles.js +53 -49
- package/dist/lib/domain-profiles.js.map +1 -1
- package/dist/lib/domain-usage-command.js +4 -4
- package/dist/lib/dynamic-packages.d.ts +4 -2
- package/dist/lib/dynamic-packages.d.ts.map +1 -1
- package/dist/lib/dynamic-packages.js +9 -5
- package/dist/lib/dynamic-packages.js.map +1 -1
- package/dist/lib/format-compat.d.ts +9 -7
- package/dist/lib/format-compat.d.ts.map +1 -1
- package/dist/lib/format-compat.js +12 -8
- package/dist/lib/format-compat.js.map +1 -1
- package/dist/lib/interactive-guard.d.ts +16 -0
- package/dist/lib/interactive-guard.d.ts.map +1 -1
- package/dist/lib/interactive-guard.js +18 -6
- package/dist/lib/interactive-guard.js.map +1 -1
- package/dist/lib/migration-fetch.d.ts +16 -4
- package/dist/lib/migration-fetch.d.ts.map +1 -1
- package/dist/lib/migration-fetch.js +30 -18
- package/dist/lib/migration-fetch.js.map +1 -1
- package/dist/lib/regression/docker-helpers.d.ts +24 -0
- package/dist/lib/regression/docker-helpers.d.ts.map +1 -1
- package/dist/lib/regression/docker-helpers.js +46 -10
- package/dist/lib/regression/docker-helpers.js.map +1 -1
- package/dist/lib/usage-render.d.ts +6 -0
- package/dist/lib/usage-render.d.ts.map +1 -1
- package/dist/lib/usage-render.js +15 -3
- package/dist/lib/usage-render.js.map +1 -1
- package/dist/translate-sql/groundTruth.d.ts +3 -3
- package/dist/translate-sql/groundTruth.js +40 -40
- package/dist/translate-sql/reportGenerator.d.ts +7 -7
- package/dist/translate-sql/reportGenerator.js +18 -18
- package/dist/translate-sql/ruleTranslator.d.ts +3 -3
- package/dist/translate-sql/ruleTranslator.js +8 -8
- package/dist/translate-sql/ruleTranslator.js.map +1 -1
- package/dist/utils/open-app-context.d.ts +21 -0
- package/dist/utils/open-app-context.d.ts.map +1 -1
- package/dist/utils/open-app-context.js +26 -10
- package/dist/utils/open-app-context.js.map +1 -1
- package/oclif.manifest.json +1216 -1058
- 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,
|
|
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
|
|
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 ?? (
|
|
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,
|
|
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:
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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,
|
|
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:
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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,
|
|
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:
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
|
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 =
|
|
43
|
-
const code = await
|
|
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 {
|
|
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 =
|
|
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
|
|
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 {
|
|
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
|
-
|
|
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 =
|
|
21
|
+
const composeArgs = DockerComposeArgs(undefined, ['--profile', '*', 'down']);
|
|
22
22
|
if (!flags['keep-volumes'])
|
|
23
23
|
composeArgs.push('-v');
|
|
24
|
-
const code = await
|
|
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,
|
|
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 (
|
|
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
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
|
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,
|
|
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 (
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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,
|
|
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 (
|
|
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 =
|
|
66
|
+
const composeArgs = DockerComposeArgs('full', ['up'], overlays);
|
|
67
67
|
if (flags.detach)
|
|
68
68
|
composeArgs.push('-d');
|
|
69
|
-
const code = await
|
|
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 =
|
|
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
|
|
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,
|
|
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:
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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,
|
|
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:
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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,
|
|
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:
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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.
|
|
91
|
-
this.log(translated.
|
|
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
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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.
|
|
161
|
-
const ruleBased = reportItems.filter(i => i.
|
|
162
|
-
const flagged = reportItems.filter(i => i.
|
|
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}`);
|