@erode-app/cli 0.6.0-beta.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.
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +55 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/analyze.d.ts +3 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +58 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +85 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/components.d.ts +3 -0
- package/dist/commands/components.d.ts.map +1 -0
- package/dist/commands/components.js +29 -0
- package/dist/commands/components.js.map +1 -0
- package/dist/commands/connections.d.ts +3 -0
- package/dist/commands/connections.d.ts.map +1 -0
- package/dist/commands/connections.js +34 -0
- package/dist/commands/connections.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +39 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/console-progress.d.ts +11 -0
- package/dist/console-progress.d.ts.map +1 -0
- package/dist/console-progress.js +23 -0
- package/dist/console-progress.js.map +1 -0
- package/dist/utils/cli-helpers.d.ts +21 -0
- package/dist/utils/cli-helpers.d.ts.map +1 -0
- package/dist/utils/cli-helpers.js +206 -0
- package/dist/utils/cli-helpers.js.map +1 -0
- package/dist/utils/command-schemas.d.ts +66 -0
- package/dist/utils/command-schemas.d.ts.map +1 -0
- package/dist/utils/command-schemas.js +57 -0
- package/dist/utils/command-schemas.js.map +1 -0
- package/dist/utils/error-handler.d.ts +15 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +168 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/package.json +55 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { readFileSync } from 'fs';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { dirname, join } from 'path';
|
|
6
|
+
import { Logger } from './utils/cli-helpers.js';
|
|
7
|
+
import { createComponentsCommand } from './commands/components.js';
|
|
8
|
+
import { createConnectionsCommand } from './commands/connections.js';
|
|
9
|
+
import { createAnalyzeCommand } from './commands/analyze.js';
|
|
10
|
+
import { createCheckCommand } from './commands/check.js';
|
|
11
|
+
import { createValidateCommand } from './commands/validate.js';
|
|
12
|
+
import { PackageJsonSchema, validate } from '@erode-app/core';
|
|
13
|
+
function setupSignalHandlers() {
|
|
14
|
+
const handleShutdown = (signal) => {
|
|
15
|
+
Logger.warn(`${signal} received, stopping cleanly...`);
|
|
16
|
+
process.exit(0);
|
|
17
|
+
};
|
|
18
|
+
process.on('SIGINT', () => handleShutdown('SIGINT'));
|
|
19
|
+
process.on('SIGTERM', () => handleShutdown('SIGTERM'));
|
|
20
|
+
process.on('uncaughtException', (error) => {
|
|
21
|
+
Logger.fail('Unhandled exception caught:');
|
|
22
|
+
console.error(error);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
});
|
|
25
|
+
process.on('unhandledRejection', (reason, promise) => {
|
|
26
|
+
Logger.fail('Rejected promise detected:');
|
|
27
|
+
console.error('Promise:', promise);
|
|
28
|
+
console.error('Reason:', reason);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
33
|
+
const __dirname = dirname(__filename);
|
|
34
|
+
// Read the CLI package's own version
|
|
35
|
+
const packageJson = validate(PackageJsonSchema, JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8')), 'PackageJson');
|
|
36
|
+
const version = packageJson.version;
|
|
37
|
+
setupSignalHandlers();
|
|
38
|
+
const program = new Command();
|
|
39
|
+
program
|
|
40
|
+
.name('Erode')
|
|
41
|
+
.description('Detect architectural drift in software projects')
|
|
42
|
+
.version(version);
|
|
43
|
+
program.addCommand(createComponentsCommand());
|
|
44
|
+
program.addCommand(createConnectionsCommand());
|
|
45
|
+
program.addCommand(createAnalyzeCommand());
|
|
46
|
+
program.addCommand(createCheckCommand());
|
|
47
|
+
program.addCommand(createValidateCommand());
|
|
48
|
+
program.configureHelp({
|
|
49
|
+
subcommandTerm: (cmd) => cmd.name() + (cmd.alias() ? `|${cmd.alias()}` : ''),
|
|
50
|
+
});
|
|
51
|
+
program.action(() => {
|
|
52
|
+
program.help();
|
|
53
|
+
});
|
|
54
|
+
program.parse();
|
|
55
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,oBAAoB,IAAI,OAAO,CAuD9C"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { runAnalyze, validate, ErodeError, ErrorCode, CONFIG } from '@erode-app/core';
|
|
3
|
+
import { ErrorHandler } from '../utils/error-handler.js';
|
|
4
|
+
import { AnalyzeOptionsSchema } from '../utils/command-schemas.js';
|
|
5
|
+
import { OutputFormatter } from '../utils/cli-helpers.js';
|
|
6
|
+
import { ConsoleProgress } from '../console-progress.js';
|
|
7
|
+
export function createAnalyzeCommand() {
|
|
8
|
+
return new Command('analyze')
|
|
9
|
+
.description('Inspect a pull request for architectural deviations')
|
|
10
|
+
.argument('[model-path]', 'Local directory or path within --model-repo containing model files')
|
|
11
|
+
.requiredOption('--url <url>', 'Pull request or merge request URL to inspect')
|
|
12
|
+
.option('--model-format <format>', 'Format of the architecture model', 'likec4')
|
|
13
|
+
.option('--output-file <path>', 'Save structured JSON results to a file')
|
|
14
|
+
.option('--format <format>', 'Result format (console, json)', 'console')
|
|
15
|
+
.option('--open-pr', 'Open a pull request with model changes')
|
|
16
|
+
.option('--model-repo <repo>', 'Repository URL or owner/repo containing the architecture model')
|
|
17
|
+
.option('--model-ref <ref>', 'Branch or tag to clone from --model-repo')
|
|
18
|
+
.option('--patch-local', 'Patch the architecture model in-place')
|
|
19
|
+
.option('--dry-run', 'Preview results without creating a PR')
|
|
20
|
+
.option('--draft', 'Mark the generated pull request as draft', true)
|
|
21
|
+
.option('--skip-file-filtering', 'Bypass file filters and inspect every changed file')
|
|
22
|
+
.option('--comment', 'Publish findings as a comment on the PR')
|
|
23
|
+
.option('--github-actions', 'Emit GitHub Actions outputs and step summary')
|
|
24
|
+
.option('--fail-on-violations', 'Return a non-zero exit code if violations exist')
|
|
25
|
+
.action(async (modelPath, options) => {
|
|
26
|
+
const validated = validate(AnalyzeOptionsSchema, options, 'command options');
|
|
27
|
+
const resolvedModelPath = modelPath ?? CONFIG.adapter.modelPath;
|
|
28
|
+
if (!resolvedModelPath) {
|
|
29
|
+
throw new ErodeError('Provide <model-path> or set adapter.modelPath in .eroderc.json', ErrorCode.INPUT_INVALID);
|
|
30
|
+
}
|
|
31
|
+
const progress = validated.format === 'json' ? undefined : new ConsoleProgress();
|
|
32
|
+
try {
|
|
33
|
+
const result = await runAnalyze({
|
|
34
|
+
modelPath: resolvedModelPath,
|
|
35
|
+
...validated,
|
|
36
|
+
modelRepo: validated.modelRepo ?? CONFIG.adapter.modelRepo,
|
|
37
|
+
modelRef: validated.modelRef ?? CONFIG.adapter.modelRef,
|
|
38
|
+
}, progress);
|
|
39
|
+
if (validated.format === 'json') {
|
|
40
|
+
if (result.structured) {
|
|
41
|
+
console.log(OutputFormatter.format(result.structured, 'json'));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
if (result.structured) {
|
|
46
|
+
console.log(OutputFormatter.formatConsole(result.structured));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (validated.failOnViolations && result.hasViolations) {
|
|
50
|
+
process.exitCode = 1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
ErrorHandler.handleCliError(error);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,wBAAgB,kBAAkB,IAAI,OAAO,CA6F5C"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
import { runCheck, generateGitDiff, parseRepoFromRemote, normaliseToHttps, validate, ErodeError, ErrorCode, CONFIG, } from '@erode-app/core';
|
|
4
|
+
import { ErrorHandler } from '../utils/error-handler.js';
|
|
5
|
+
import { CheckOptionsSchema } from '../utils/command-schemas.js';
|
|
6
|
+
import { OutputFormatter } from '../utils/cli-helpers.js';
|
|
7
|
+
import { ConsoleProgress } from '../console-progress.js';
|
|
8
|
+
export function createCheckCommand() {
|
|
9
|
+
return new Command('check')
|
|
10
|
+
.description('Check local changes for architectural drift before pushing')
|
|
11
|
+
.argument('[model-path]', 'Directory containing the architecture model files')
|
|
12
|
+
.option('--repo <url>', 'Repository URL (auto-detected from git remote if omitted)')
|
|
13
|
+
.option('--model-format <format>', 'Format of the architecture model', 'likec4')
|
|
14
|
+
.option('--staged', 'Only check staged changes')
|
|
15
|
+
.option('--branch <branch>', 'Compare against a branch (e.g. main)')
|
|
16
|
+
.option('--component <id>', 'Component ID to analyse (skips auto-selection)')
|
|
17
|
+
.option('--format <format>', 'Output format (console, json)', 'console')
|
|
18
|
+
.option('--fail-on-violations', 'Exit with code 1 when violations are found')
|
|
19
|
+
.option('--skip-file-filtering', 'Bypass .erodeignore file patterns')
|
|
20
|
+
.action(async (modelPath, options) => {
|
|
21
|
+
const resolvedModelPath = modelPath ?? CONFIG.adapter.modelPath;
|
|
22
|
+
if (!resolvedModelPath) {
|
|
23
|
+
throw new ErodeError('Provide <model-path> or set adapter.modelPath in .eroderc.json', ErrorCode.INPUT_INVALID);
|
|
24
|
+
}
|
|
25
|
+
const validated = validate(CheckOptionsSchema, options, 'command options');
|
|
26
|
+
const progress = validated.format === 'json' ? undefined : new ConsoleProgress();
|
|
27
|
+
try {
|
|
28
|
+
// ── Resolve repository URL ───────────────────────────────────────
|
|
29
|
+
let repoUrl = validated.repo;
|
|
30
|
+
if (!repoUrl) {
|
|
31
|
+
let remote;
|
|
32
|
+
try {
|
|
33
|
+
remote = execSync('git remote get-url origin', { encoding: 'utf-8' }).trim();
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
throw new ErodeError('Could not detect repository URL from git remote', ErrorCode.INPUT_INVALID, 'Could not detect the repository URL. Make sure you are inside a git repository with an "origin" remote, or use --repo to specify the URL explicitly.');
|
|
37
|
+
}
|
|
38
|
+
repoUrl = normaliseToHttps(remote);
|
|
39
|
+
progress?.info(`Detected repository: ${repoUrl}`);
|
|
40
|
+
}
|
|
41
|
+
const { owner, repo } = parseRepoFromRemote(repoUrl);
|
|
42
|
+
// ── Generate diff ────────────────────────────────────────────────
|
|
43
|
+
const diffResult = generateGitDiff({
|
|
44
|
+
staged: validated.staged,
|
|
45
|
+
branch: validated.branch,
|
|
46
|
+
});
|
|
47
|
+
if (!diffResult.diff) {
|
|
48
|
+
progress?.succeed('No changes to check');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
progress?.info(`Checking ${String(diffResult.stats.filesChanged)} file(s), ` +
|
|
52
|
+
`+${String(diffResult.stats.additions)} -${String(diffResult.stats.deletions)}`);
|
|
53
|
+
// ── Run check pipeline ───────────────────────────────────────────
|
|
54
|
+
const result = await runCheck({
|
|
55
|
+
modelPath: resolvedModelPath,
|
|
56
|
+
diff: diffResult.diff,
|
|
57
|
+
repo: repoUrl,
|
|
58
|
+
repoOwner: owner,
|
|
59
|
+
repoName: repo,
|
|
60
|
+
modelFormat: validated.modelFormat,
|
|
61
|
+
componentId: validated.component,
|
|
62
|
+
format: validated.format,
|
|
63
|
+
files: diffResult.files,
|
|
64
|
+
stats: diffResult.stats,
|
|
65
|
+
skipFileFiltering: validated.skipFileFiltering,
|
|
66
|
+
}, progress);
|
|
67
|
+
// ── Output ───────────────────────────────────────────────────────
|
|
68
|
+
if (validated.format === 'json') {
|
|
69
|
+
if (result.structured) {
|
|
70
|
+
console.log(OutputFormatter.format(result.structured, 'json'));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else if (result.structured) {
|
|
74
|
+
console.log(OutputFormatter.formatConsole(result.structured));
|
|
75
|
+
}
|
|
76
|
+
if (validated.failOnViolations && result.hasViolations) {
|
|
77
|
+
process.exitCode = 1;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
ErrorHandler.handleCliError(error);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/commands/components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,uBAAuB,IAAI,OAAO,CA2BjD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { runComponents, validate, ErodeError, ErrorCode, CONFIG } from '@erode-app/core';
|
|
3
|
+
import { ErrorHandler } from '../utils/error-handler.js';
|
|
4
|
+
import { ComponentsOptionsSchema } from '../utils/command-schemas.js';
|
|
5
|
+
import { OutputFormatter } from '../utils/cli-helpers.js';
|
|
6
|
+
import { ConsoleProgress } from '../console-progress.js';
|
|
7
|
+
export function createComponentsCommand() {
|
|
8
|
+
return new Command('components')
|
|
9
|
+
.description('Display all components in the architecture model')
|
|
10
|
+
.argument('[model-path]', 'Directory containing architecture model files')
|
|
11
|
+
.option('--model-format <format>', 'Format of the architecture model', 'likec4')
|
|
12
|
+
.option('--format <format>', 'Result format (table, json, yaml)', 'table')
|
|
13
|
+
.action(async (modelPath, options) => {
|
|
14
|
+
const resolvedModelPath = modelPath ?? CONFIG.adapter.modelPath;
|
|
15
|
+
if (!resolvedModelPath) {
|
|
16
|
+
throw new ErodeError('Provide <model-path> or set adapter.modelPath in .eroderc.json', ErrorCode.INPUT_INVALID);
|
|
17
|
+
}
|
|
18
|
+
const validated = validate(ComponentsOptionsSchema, options, 'command options');
|
|
19
|
+
const progress = validated.format === 'json' ? undefined : new ConsoleProgress();
|
|
20
|
+
try {
|
|
21
|
+
const components = await runComponents({ modelPath: resolvedModelPath, modelFormat: validated.modelFormat }, progress);
|
|
22
|
+
console.log(OutputFormatter.format(components, validated.format));
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
ErrorHandler.handleCliError(error);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/commands/components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,UAAU,uBAAuB;IACrC,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;SAC7B,WAAW,CAAC,kDAAkD,CAAC;SAC/D,QAAQ,CAAC,cAAc,EAAE,+CAA+C,CAAC;SACzE,MAAM,CAAC,yBAAyB,EAAE,kCAAkC,EAAE,QAAQ,CAAC;SAC/E,MAAM,CAAC,mBAAmB,EAAE,mCAAmC,EAAE,OAAO,CAAC;SACzE,MAAM,CAAC,KAAK,EAAE,SAA6B,EAAE,OAAgB,EAAE,EAAE;QAChE,MAAM,iBAAiB,GAAG,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;QAChE,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,MAAM,IAAI,UAAU,CAClB,gEAAgE,EAChE,SAAS,CAAC,aAAa,CACxB,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ,CAAC,uBAAuB,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAChF,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC;QAEjF,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,aAAa,CACpC,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,EACpE,QAAQ,CACT,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connections.d.ts","sourceRoot":"","sources":["../../src/commands/connections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,wBAAwB,IAAI,OAAO,CAgClD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { runConnections, validate, ErodeError, ErrorCode, CONFIG } from '@erode-app/core';
|
|
3
|
+
import { ErrorHandler } from '../utils/error-handler.js';
|
|
4
|
+
import { ConnectionsOptionsSchema } from '../utils/command-schemas.js';
|
|
5
|
+
import { OutputFormatter } from '../utils/cli-helpers.js';
|
|
6
|
+
import { ConsoleProgress } from '../console-progress.js';
|
|
7
|
+
export function createConnectionsCommand() {
|
|
8
|
+
return new Command('connections')
|
|
9
|
+
.description('Display component relationships from the architecture model')
|
|
10
|
+
.argument('[model-path]', 'Directory containing architecture model files')
|
|
11
|
+
.option('--model-format <format>', 'Format of the architecture model', 'likec4')
|
|
12
|
+
.requiredOption('--repo <url>', 'GitHub or GitLab repository URL')
|
|
13
|
+
.option('--output <format>', 'Result format (console, json)', 'console')
|
|
14
|
+
.action(async (modelPath, options) => {
|
|
15
|
+
const resolvedModelPath = modelPath ?? CONFIG.adapter.modelPath;
|
|
16
|
+
if (!resolvedModelPath) {
|
|
17
|
+
throw new ErodeError('Provide <model-path> or set adapter.modelPath in .eroderc.json', ErrorCode.INPUT_INVALID);
|
|
18
|
+
}
|
|
19
|
+
const validated = validate(ConnectionsOptionsSchema, options, 'command options');
|
|
20
|
+
const progress = validated.output === 'json' ? undefined : new ConsoleProgress();
|
|
21
|
+
try {
|
|
22
|
+
const connections = await runConnections({
|
|
23
|
+
modelPath: resolvedModelPath,
|
|
24
|
+
modelFormat: validated.modelFormat,
|
|
25
|
+
repo: validated.repo,
|
|
26
|
+
}, progress);
|
|
27
|
+
console.log(OutputFormatter.format(connections, validated.output));
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
ErrorHandler.handleCliError(error);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=connections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connections.js","sourceRoot":"","sources":["../../src/commands/connections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;SAC9B,WAAW,CAAC,6DAA6D,CAAC;SAC1E,QAAQ,CAAC,cAAc,EAAE,+CAA+C,CAAC;SACzE,MAAM,CAAC,yBAAyB,EAAE,kCAAkC,EAAE,QAAQ,CAAC;SAC/E,cAAc,CAAC,cAAc,EAAE,iCAAiC,CAAC;SACjE,MAAM,CAAC,mBAAmB,EAAE,+BAA+B,EAAE,SAAS,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,SAA6B,EAAE,OAAgB,EAAE,EAAE;QAChE,MAAM,iBAAiB,GAAG,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;QAChE,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,MAAM,IAAI,UAAU,CAClB,gEAAgE,EAChE,SAAS,CAAC,aAAa,CACxB,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ,CAAC,wBAAwB,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC;QAEjF,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,cAAc,CACtC;gBACE,SAAS,EAAE,iBAAiB;gBAC5B,WAAW,EAAE,SAAS,CAAC,WAAW;gBAClC,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB,EACD,QAAQ,CACT,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,IAAI,OAAO,CAqC/C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { runValidate, validate, ErodeError, ErrorCode, CONFIG } from '@erode-app/core';
|
|
3
|
+
import { ErrorHandler } from '../utils/error-handler.js';
|
|
4
|
+
import { ValidateOptionsSchema } from '../utils/command-schemas.js';
|
|
5
|
+
import { OutputFormatter } from '../utils/cli-helpers.js';
|
|
6
|
+
import { ConsoleProgress } from '../console-progress.js';
|
|
7
|
+
export function createValidateCommand() {
|
|
8
|
+
return new Command('validate')
|
|
9
|
+
.description('Verify every component in the model is linked to a repository')
|
|
10
|
+
.argument('[model-path]', 'Directory containing architecture model files')
|
|
11
|
+
.option('--model-format <format>', 'Format of the architecture model', 'likec4')
|
|
12
|
+
.option('--format <format>', 'Result format (table, json)', 'table')
|
|
13
|
+
.action(async (modelPath, options) => {
|
|
14
|
+
const resolvedModelPath = modelPath ?? CONFIG.adapter.modelPath;
|
|
15
|
+
if (!resolvedModelPath) {
|
|
16
|
+
throw new ErodeError('Provide <model-path> or set adapter.modelPath in .eroderc.json', ErrorCode.INPUT_INVALID);
|
|
17
|
+
}
|
|
18
|
+
const validated = validate(ValidateOptionsSchema, options, 'command options');
|
|
19
|
+
const progress = validated.format === 'json' ? undefined : new ConsoleProgress();
|
|
20
|
+
try {
|
|
21
|
+
const result = await runValidate({ modelPath: resolvedModelPath, modelFormat: validated.modelFormat }, progress);
|
|
22
|
+
const data = {
|
|
23
|
+
modelVersion: result.versionCheck,
|
|
24
|
+
total: result.total,
|
|
25
|
+
linked: result.linked,
|
|
26
|
+
unlinked: result.unlinked,
|
|
27
|
+
components: result.components,
|
|
28
|
+
};
|
|
29
|
+
console.log(OutputFormatter.format(data, validated.format));
|
|
30
|
+
if (result.hasIssues) {
|
|
31
|
+
process.exitCode = 1;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
ErrorHandler.handleCliError(error);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;SAC3B,WAAW,CAAC,+DAA+D,CAAC;SAC5E,QAAQ,CAAC,cAAc,EAAE,+CAA+C,CAAC;SACzE,MAAM,CAAC,yBAAyB,EAAE,kCAAkC,EAAE,QAAQ,CAAC;SAC/E,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,EAAE,OAAO,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,SAA6B,EAAE,OAAgB,EAAE,EAAE;QAChE,MAAM,iBAAiB,GAAG,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;QAChE,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,MAAM,IAAI,UAAU,CAClB,gEAAgE,EAChE,SAAS,CAAC,aAAa,CACxB,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ,CAAC,qBAAqB,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAC9E,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC;QAEjF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,EACpE,QAAQ,CACT,CAAC;YACF,MAAM,IAAI,GAAG;gBACX,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ProgressReporter } from '@erode-app/core';
|
|
2
|
+
/** Console-based progress reporter that writes to stderr. */
|
|
3
|
+
export declare class ConsoleProgress implements ProgressReporter {
|
|
4
|
+
section(title: string): void;
|
|
5
|
+
start(message: string): void;
|
|
6
|
+
succeed(message: string): void;
|
|
7
|
+
fail(message: string): void;
|
|
8
|
+
warn(message: string): void;
|
|
9
|
+
info(message: string): void;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=console-progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-progress.d.ts","sourceRoot":"","sources":["../src/console-progress.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,6DAA6D;AAC7D,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAG5B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
/** Console-based progress reporter that writes to stderr. */
|
|
3
|
+
export class ConsoleProgress {
|
|
4
|
+
section(title) {
|
|
5
|
+
process.stderr.write(`\n${chalk.bold(title)}\n`);
|
|
6
|
+
}
|
|
7
|
+
start(message) {
|
|
8
|
+
process.stderr.write(`${chalk.dim('...')} ${message}\n`);
|
|
9
|
+
}
|
|
10
|
+
succeed(message) {
|
|
11
|
+
process.stderr.write(`${chalk.green('✓')} ${message}\n`);
|
|
12
|
+
}
|
|
13
|
+
fail(message) {
|
|
14
|
+
process.stderr.write(`${chalk.red('✗')} ${message}\n`);
|
|
15
|
+
}
|
|
16
|
+
warn(message) {
|
|
17
|
+
process.stderr.write(`${chalk.yellow('⚠')} ${message}\n`);
|
|
18
|
+
}
|
|
19
|
+
info(message) {
|
|
20
|
+
process.stderr.write(`${chalk.blue('ℹ')} ${message}\n`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=console-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-progress.js","sourceRoot":"","sources":["../src/console-progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,6DAA6D;AAC7D,MAAM,OAAO,eAAe;IAC1B,OAAO,CAAC,KAAa;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;IAC1D,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { OutputFormat } from './command-schemas.js';
|
|
2
|
+
export declare const Logger: {
|
|
3
|
+
readonly fail: (message: string) => void;
|
|
4
|
+
readonly warn: (message: string) => void;
|
|
5
|
+
readonly info: (message: string) => void;
|
|
6
|
+
readonly success: (message: string) => void;
|
|
7
|
+
};
|
|
8
|
+
interface TableColumn {
|
|
9
|
+
key: string;
|
|
10
|
+
header: string;
|
|
11
|
+
width?: number;
|
|
12
|
+
align?: 'left' | 'right' | 'center';
|
|
13
|
+
}
|
|
14
|
+
export declare const OutputFormatter: {
|
|
15
|
+
readonly format: (data: unknown, format: OutputFormat) => string;
|
|
16
|
+
readonly formatTable: (data: object[], columns?: TableColumn[]) => string;
|
|
17
|
+
readonly formatObject: (data: object, indent?: number) => string;
|
|
18
|
+
readonly formatConsole: (data: unknown) => string;
|
|
19
|
+
};
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=cli-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/cli-helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,eAAO,MAAM,MAAM;6BACH,MAAM,KAAG,IAAI;6BAGb,MAAM,KAAG,IAAI;6BAGb,MAAM,KAAG,IAAI;gCAGV,MAAM,KAAG,IAAI;CAGtB,CAAC;AACX,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;CACrC;AAqED,eAAO,MAAM,eAAe;4BACb,OAAO,UAAU,YAAY,KAAG,MAAM;iCAqBjC,MAAM,EAAE,YAAY,WAAW,EAAE,KAAG,MAAM;kCAoEzC,MAAM,sBAAe,MAAM;mCAY1B,OAAO,KAAG,MAAM;CAyB5B,CAAC"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export const Logger = {
|
|
3
|
+
fail(message) {
|
|
4
|
+
console.error(chalk.red(`❌ ${message}`));
|
|
5
|
+
},
|
|
6
|
+
warn(message) {
|
|
7
|
+
console.warn(chalk.yellow(`⚠️ ${message}`));
|
|
8
|
+
},
|
|
9
|
+
info(message) {
|
|
10
|
+
console.log(chalk.blue(`ℹ️ ${message}`));
|
|
11
|
+
},
|
|
12
|
+
success(message) {
|
|
13
|
+
console.log(chalk.green(`✓ ${message}`));
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
function isPlainObject(value) {
|
|
17
|
+
return (typeof value === 'object' &&
|
|
18
|
+
value !== null &&
|
|
19
|
+
!Array.isArray(value) &&
|
|
20
|
+
Object.getPrototypeOf(value) === Object.prototype);
|
|
21
|
+
}
|
|
22
|
+
function isNonArrayObject(value) {
|
|
23
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
24
|
+
}
|
|
25
|
+
function formatValue(value, indent = 0) {
|
|
26
|
+
if (value === null)
|
|
27
|
+
return chalk.gray('null');
|
|
28
|
+
if (value === undefined)
|
|
29
|
+
return chalk.gray('undefined');
|
|
30
|
+
if (typeof value === 'boolean')
|
|
31
|
+
return chalk.blue(String(value));
|
|
32
|
+
if (typeof value === 'number')
|
|
33
|
+
return chalk.magenta(String(value));
|
|
34
|
+
if (typeof value === 'string')
|
|
35
|
+
return value;
|
|
36
|
+
if (Array.isArray(value)) {
|
|
37
|
+
if (value.length === 0)
|
|
38
|
+
return '[]';
|
|
39
|
+
const spaces = ' '.repeat(indent + 1);
|
|
40
|
+
const items = value
|
|
41
|
+
.map((item) => {
|
|
42
|
+
if (isNonArrayObject(item)) {
|
|
43
|
+
const formatted = OutputFormatter.formatObject(item, indent + 1);
|
|
44
|
+
return `${spaces}- ${formatted.replace(/^\s+/, '')}`;
|
|
45
|
+
}
|
|
46
|
+
return `${spaces}- ${formatValue(item, indent + 1)}`;
|
|
47
|
+
})
|
|
48
|
+
.join('\n');
|
|
49
|
+
return `\n${items}`;
|
|
50
|
+
}
|
|
51
|
+
if (isNonArrayObject(value)) {
|
|
52
|
+
return `\n${OutputFormatter.formatObject(value, indent + 1)}`;
|
|
53
|
+
}
|
|
54
|
+
return '[unknown value]';
|
|
55
|
+
}
|
|
56
|
+
function toYaml(data, indent = 0) {
|
|
57
|
+
const spaces = ' '.repeat(indent);
|
|
58
|
+
if (Array.isArray(data)) {
|
|
59
|
+
if (data.length === 0)
|
|
60
|
+
return '[]';
|
|
61
|
+
return data.map((item) => `${spaces}- ${toYaml(item, indent + 1).trim()}`).join('\n');
|
|
62
|
+
}
|
|
63
|
+
if (typeof data === 'object' && data !== null) {
|
|
64
|
+
const entries = Object.entries(data);
|
|
65
|
+
if (entries.length === 0)
|
|
66
|
+
return '{}';
|
|
67
|
+
return entries
|
|
68
|
+
.map(([key, value]) => {
|
|
69
|
+
const yamlValue = toYaml(value, indent + 1);
|
|
70
|
+
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
71
|
+
return `${spaces}${key}:\n${yamlValue}`;
|
|
72
|
+
}
|
|
73
|
+
return `${spaces}${key}: ${yamlValue.trim()}`;
|
|
74
|
+
})
|
|
75
|
+
.join('\n');
|
|
76
|
+
}
|
|
77
|
+
if (typeof data === 'string') {
|
|
78
|
+
if (data.includes('\n') || data.includes(':') || data.includes('-')) {
|
|
79
|
+
return JSON.stringify(data);
|
|
80
|
+
}
|
|
81
|
+
return data;
|
|
82
|
+
}
|
|
83
|
+
return String(data);
|
|
84
|
+
}
|
|
85
|
+
export const OutputFormatter = {
|
|
86
|
+
format(data, format) {
|
|
87
|
+
switch (format) {
|
|
88
|
+
case 'json':
|
|
89
|
+
return JSON.stringify(data, null, 2);
|
|
90
|
+
case 'yaml':
|
|
91
|
+
return toYaml(data);
|
|
92
|
+
case 'table':
|
|
93
|
+
if (Array.isArray(data)) {
|
|
94
|
+
return OutputFormatter.formatTable(data.filter((item) => typeof item === 'object' && item !== null));
|
|
95
|
+
}
|
|
96
|
+
if (typeof data === 'object' && data !== null) {
|
|
97
|
+
return OutputFormatter.formatObject(data);
|
|
98
|
+
}
|
|
99
|
+
return String(data);
|
|
100
|
+
case 'console':
|
|
101
|
+
default:
|
|
102
|
+
return OutputFormatter.formatConsole(data);
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
formatTable(data, columns) {
|
|
106
|
+
const firstRow = data[0];
|
|
107
|
+
if (!firstRow) {
|
|
108
|
+
return chalk.gray('Nothing to show');
|
|
109
|
+
}
|
|
110
|
+
const MAX_COLUMN_WIDTH = 50;
|
|
111
|
+
const autoColumns = columns ??
|
|
112
|
+
Object.keys(firstRow).map((key) => ({
|
|
113
|
+
key,
|
|
114
|
+
header: key.charAt(0).toUpperCase() + key.slice(1).replace(/_/g, ' '),
|
|
115
|
+
}));
|
|
116
|
+
const widths = autoColumns.map((col) => {
|
|
117
|
+
const headerWidth = col.header.length;
|
|
118
|
+
const dataWidth = Math.max(...data.map((row) => {
|
|
119
|
+
if (!Object.prototype.hasOwnProperty.call(row, col.key)) {
|
|
120
|
+
return 0;
|
|
121
|
+
}
|
|
122
|
+
const value = Reflect.get(row, col.key);
|
|
123
|
+
if (value == null)
|
|
124
|
+
return 0;
|
|
125
|
+
if (typeof value === 'string' ||
|
|
126
|
+
typeof value === 'number' ||
|
|
127
|
+
typeof value === 'boolean') {
|
|
128
|
+
return String(value).length;
|
|
129
|
+
}
|
|
130
|
+
if (Array.isArray(value)) {
|
|
131
|
+
return value.length === 0 ? 0 : value.join(', ').length;
|
|
132
|
+
}
|
|
133
|
+
return '[object]'.length;
|
|
134
|
+
}));
|
|
135
|
+
return Math.min(Math.max(headerWidth, dataWidth, col.width ?? 0), MAX_COLUMN_WIDTH);
|
|
136
|
+
});
|
|
137
|
+
const header = autoColumns.map((col, i) => col.header.padEnd(widths[i] ?? 0)).join(' | ');
|
|
138
|
+
const separator = widths.map((width) => '-'.repeat(width)).join('-+-');
|
|
139
|
+
const rows = data.map((row) => autoColumns
|
|
140
|
+
.map((col, i) => {
|
|
141
|
+
if (!Object.prototype.hasOwnProperty.call(row, col.key)) {
|
|
142
|
+
return ''.padEnd(widths[i] ?? 0);
|
|
143
|
+
}
|
|
144
|
+
const cellValue = Reflect.get(row, col.key);
|
|
145
|
+
let value;
|
|
146
|
+
if (cellValue == null) {
|
|
147
|
+
value = '';
|
|
148
|
+
}
|
|
149
|
+
else if (typeof cellValue === 'string' ||
|
|
150
|
+
typeof cellValue === 'number' ||
|
|
151
|
+
typeof cellValue === 'boolean') {
|
|
152
|
+
value = String(cellValue);
|
|
153
|
+
}
|
|
154
|
+
else if (Array.isArray(cellValue)) {
|
|
155
|
+
value = cellValue.length === 0 ? '' : cellValue.join(', ');
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
value = '[object]';
|
|
159
|
+
}
|
|
160
|
+
if (value.length > MAX_COLUMN_WIDTH) {
|
|
161
|
+
value = value.substring(0, MAX_COLUMN_WIDTH - 3) + '...';
|
|
162
|
+
}
|
|
163
|
+
return value.padEnd(widths[i] ?? 0);
|
|
164
|
+
})
|
|
165
|
+
.join(' | '));
|
|
166
|
+
return [chalk.bold(header), chalk.gray(separator), ...rows].join('\n');
|
|
167
|
+
},
|
|
168
|
+
formatObject(data, indent = 0) {
|
|
169
|
+
const entries = Object.entries(data);
|
|
170
|
+
const maxKeyLength = Math.max(...entries.map(([key]) => key.length));
|
|
171
|
+
const spaces = ' '.repeat(indent);
|
|
172
|
+
return entries
|
|
173
|
+
.map(([key, value]) => {
|
|
174
|
+
const formattedKey = chalk.bold(key.padEnd(maxKeyLength));
|
|
175
|
+
const formattedValue = formatValue(value, indent);
|
|
176
|
+
return `${spaces}${formattedKey}: ${formattedValue}`;
|
|
177
|
+
})
|
|
178
|
+
.join('\n');
|
|
179
|
+
},
|
|
180
|
+
formatConsole(data) {
|
|
181
|
+
if (Array.isArray(data)) {
|
|
182
|
+
return data
|
|
183
|
+
.map((item, index) => {
|
|
184
|
+
let formatted;
|
|
185
|
+
if (isPlainObject(item)) {
|
|
186
|
+
formatted = OutputFormatter.formatObject(item);
|
|
187
|
+
}
|
|
188
|
+
else if (typeof item === 'string' ||
|
|
189
|
+
typeof item === 'number' ||
|
|
190
|
+
typeof item === 'boolean') {
|
|
191
|
+
formatted = String(item);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
formatted = '[unknown value]';
|
|
195
|
+
}
|
|
196
|
+
return `${chalk.cyan(`[${String(index + 1)}]`)} ${formatted}`;
|
|
197
|
+
})
|
|
198
|
+
.join('\n\n');
|
|
199
|
+
}
|
|
200
|
+
if (typeof data === 'object' && data !== null) {
|
|
201
|
+
return OutputFormatter.formatObject(data);
|
|
202
|
+
}
|
|
203
|
+
return String(data);
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
//# sourceMappingURL=cli-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-helpers.js","sourceRoot":"","sources":["../../src/utils/cli-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
declare const OutputFormatSchema: z.ZodEnum<{
|
|
3
|
+
table: "table";
|
|
4
|
+
json: "json";
|
|
5
|
+
yaml: "yaml";
|
|
6
|
+
console: "console";
|
|
7
|
+
}>;
|
|
8
|
+
export type OutputFormat = z.infer<typeof OutputFormatSchema>;
|
|
9
|
+
export declare const AnalyzeOptionsSchema: z.ZodObject<{
|
|
10
|
+
url: z.ZodURL;
|
|
11
|
+
modelFormat: z.ZodDefault<z.ZodString>;
|
|
12
|
+
outputFile: z.ZodOptional<z.ZodString>;
|
|
13
|
+
format: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
14
|
+
json: "json";
|
|
15
|
+
console: "console";
|
|
16
|
+
}>>>;
|
|
17
|
+
openPr: z.ZodOptional<z.ZodBoolean>;
|
|
18
|
+
modelRepo: z.ZodOptional<z.ZodString>;
|
|
19
|
+
modelRef: z.ZodOptional<z.ZodString>;
|
|
20
|
+
patchLocal: z.ZodOptional<z.ZodBoolean>;
|
|
21
|
+
dryRun: z.ZodOptional<z.ZodBoolean>;
|
|
22
|
+
draft: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>, z.ZodTransform<boolean, string | boolean>>, z.ZodBoolean>>>;
|
|
23
|
+
skipFileFiltering: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
24
|
+
comment: z.ZodOptional<z.ZodBoolean>;
|
|
25
|
+
githubActions: z.ZodOptional<z.ZodBoolean>;
|
|
26
|
+
failOnViolations: z.ZodOptional<z.ZodBoolean>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
export declare const ComponentsOptionsSchema: z.ZodObject<{
|
|
29
|
+
modelFormat: z.ZodDefault<z.ZodString>;
|
|
30
|
+
format: z.ZodDefault<z.ZodEnum<{
|
|
31
|
+
table: "table";
|
|
32
|
+
json: "json";
|
|
33
|
+
yaml: "yaml";
|
|
34
|
+
console: "console";
|
|
35
|
+
}>>;
|
|
36
|
+
}, z.core.$strip>;
|
|
37
|
+
export declare const ValidateOptionsSchema: z.ZodObject<{
|
|
38
|
+
modelFormat: z.ZodDefault<z.ZodString>;
|
|
39
|
+
format: z.ZodDefault<z.ZodEnum<{
|
|
40
|
+
table: "table";
|
|
41
|
+
json: "json";
|
|
42
|
+
}>>;
|
|
43
|
+
}, z.core.$strip>;
|
|
44
|
+
export declare const ConnectionsOptionsSchema: z.ZodObject<{
|
|
45
|
+
modelFormat: z.ZodDefault<z.ZodString>;
|
|
46
|
+
repo: z.ZodString;
|
|
47
|
+
output: z.ZodDefault<z.ZodEnum<{
|
|
48
|
+
json: "json";
|
|
49
|
+
console: "console";
|
|
50
|
+
}>>;
|
|
51
|
+
}, z.core.$strip>;
|
|
52
|
+
export declare const CheckOptionsSchema: z.ZodObject<{
|
|
53
|
+
repo: z.ZodOptional<z.ZodURL>;
|
|
54
|
+
modelFormat: z.ZodDefault<z.ZodString>;
|
|
55
|
+
staged: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
56
|
+
branch: z.ZodOptional<z.ZodString>;
|
|
57
|
+
component: z.ZodOptional<z.ZodString>;
|
|
58
|
+
format: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
59
|
+
json: "json";
|
|
60
|
+
console: "console";
|
|
61
|
+
}>>>;
|
|
62
|
+
failOnViolations: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
63
|
+
skipFileFiltering: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
64
|
+
}, z.core.$strip>;
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=command-schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-schemas.d.ts","sourceRoot":"","sources":["../../src/utils/command-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,QAAA,MAAM,kBAAkB;;;;;EAA+C,CAAC;AACxE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAY9D,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;iBAe/B,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;iBAGlC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;iBAGhC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;iBAInC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;iBAS7B,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const RepositoryUrlSchema = z
|
|
3
|
+
.string()
|
|
4
|
+
.regex(/^https?:\/\/(github\.com\/[^/]+\/[^/]+|gitlab\.com\/.+\/[^/]+)\/?$/, 'Provide a valid GitHub or GitLab repository URL');
|
|
5
|
+
const OutputFormatSchema = z.enum(['table', 'json', 'yaml', 'console']);
|
|
6
|
+
const BooleanStringSchema = z
|
|
7
|
+
.union([z.boolean(), z.string()])
|
|
8
|
+
.transform((val) => {
|
|
9
|
+
if (typeof val === 'boolean')
|
|
10
|
+
return val;
|
|
11
|
+
if (val === 'true')
|
|
12
|
+
return true;
|
|
13
|
+
if (val === 'false')
|
|
14
|
+
return false;
|
|
15
|
+
return val === 'true';
|
|
16
|
+
})
|
|
17
|
+
.pipe(z.boolean());
|
|
18
|
+
export const AnalyzeOptionsSchema = z.object({
|
|
19
|
+
url: z.url(),
|
|
20
|
+
modelFormat: z.string().default('likec4'),
|
|
21
|
+
outputFile: z.string().optional(),
|
|
22
|
+
format: z.enum(['console', 'json']).optional().default('console'),
|
|
23
|
+
openPr: z.boolean().optional(),
|
|
24
|
+
modelRepo: z.string().optional(),
|
|
25
|
+
modelRef: z.string().optional(),
|
|
26
|
+
patchLocal: z.boolean().optional(),
|
|
27
|
+
dryRun: z.boolean().optional(),
|
|
28
|
+
draft: BooleanStringSchema.optional().default(true),
|
|
29
|
+
skipFileFiltering: z.boolean().optional().default(false),
|
|
30
|
+
comment: z.boolean().optional(),
|
|
31
|
+
githubActions: z.boolean().optional(),
|
|
32
|
+
failOnViolations: z.boolean().optional(),
|
|
33
|
+
});
|
|
34
|
+
export const ComponentsOptionsSchema = z.object({
|
|
35
|
+
modelFormat: z.string().default('likec4'),
|
|
36
|
+
format: OutputFormatSchema.default('table'),
|
|
37
|
+
});
|
|
38
|
+
export const ValidateOptionsSchema = z.object({
|
|
39
|
+
modelFormat: z.string().default('likec4'),
|
|
40
|
+
format: z.enum(['table', 'json']).default('table'),
|
|
41
|
+
});
|
|
42
|
+
export const ConnectionsOptionsSchema = z.object({
|
|
43
|
+
modelFormat: z.string().default('likec4'),
|
|
44
|
+
repo: RepositoryUrlSchema,
|
|
45
|
+
output: z.enum(['console', 'json']).default('console'),
|
|
46
|
+
});
|
|
47
|
+
export const CheckOptionsSchema = z.object({
|
|
48
|
+
repo: z.url().optional(),
|
|
49
|
+
modelFormat: z.string().default('likec4'),
|
|
50
|
+
staged: z.boolean().optional().default(false),
|
|
51
|
+
branch: z.string().optional(),
|
|
52
|
+
component: z.string().optional(),
|
|
53
|
+
format: z.enum(['console', 'json']).optional().default('console'),
|
|
54
|
+
failOnViolations: z.boolean().optional().default(false),
|
|
55
|
+
skipFileFiltering: z.boolean().optional().default(false),
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=command-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-schemas.js","sourceRoot":"","sources":["../../src/utils/command-schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
interface RetryOptions {
|
|
2
|
+
maxAttempts: number;
|
|
3
|
+
baseDelay: number;
|
|
4
|
+
maxDelay: number;
|
|
5
|
+
exponentialBackoff: boolean;
|
|
6
|
+
shouldRetry?: (error: unknown) => boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare const ErrorHandler: {
|
|
9
|
+
readonly formatError: (error: unknown) => void;
|
|
10
|
+
readonly withRetry: <T>(operation: () => Promise<T>, options?: Partial<RetryOptions>) => Promise<T>;
|
|
11
|
+
readonly getExitCode: (error: unknown) => number;
|
|
12
|
+
readonly handleCliError: (error: unknown) => never;
|
|
13
|
+
};
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":"AAGA,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAC3C;AAkFD,eAAO,MAAM,YAAY;kCACJ,OAAO,KAAG,IAAI;yBAyBjB,CAAC,aAAa,MAAM,OAAO,CAAC,CAAC,CAAC,YAAW,OAAO,CAAC,YAAY,CAAC,KAAQ,OAAO,CAAC,CAAC,CAAC;kCA0B7E,OAAO,KAAG,MAAM;qCA4Bb,OAAO,KAAG,KAAK;CAK7B,CAAC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { ErodeError, AdapterError, ErrorCode, ENV_VAR_NAMES, RC_FILENAME } from '@erode-app/core';
|
|
2
|
+
import { Logger } from './cli-helpers.js';
|
|
3
|
+
const DEFAULT_RETRY_OPTIONS = {
|
|
4
|
+
maxAttempts: 3,
|
|
5
|
+
baseDelay: 1000,
|
|
6
|
+
maxDelay: 10000,
|
|
7
|
+
exponentialBackoff: true,
|
|
8
|
+
};
|
|
9
|
+
function provideSuggestions(error) {
|
|
10
|
+
const suggestions = {
|
|
11
|
+
[ErrorCode.AUTH_KEY_MISSING]: [
|
|
12
|
+
`Provide an AI provider key: ${ENV_VAR_NAMES.anthropicApiKey}, ${ENV_VAR_NAMES.geminiApiKey}, or ${ENV_VAR_NAMES.openaiApiKey}`,
|
|
13
|
+
`Store the key in your environment or ${RC_FILENAME}`,
|
|
14
|
+
'Obtain an Anthropic key at https://console.anthropic.com/',
|
|
15
|
+
'Obtain a Gemini key at https://aistudio.google.com/apikey',
|
|
16
|
+
'Obtain an OpenAI key at https://platform.openai.com/',
|
|
17
|
+
],
|
|
18
|
+
[ErrorCode.PROVIDER_SAFETY_BLOCK]: [
|
|
19
|
+
'Content was rejected by the AI provider safety filters',
|
|
20
|
+
'Try simplifying or rewording the input',
|
|
21
|
+
'Check the content for sensitive material',
|
|
22
|
+
],
|
|
23
|
+
[ErrorCode.AUTH_PLATFORM_FAILURE]: [
|
|
24
|
+
`Confirm your ${ENV_VAR_NAMES.githubToken} or ${ENV_VAR_NAMES.gitlabToken} is still valid`,
|
|
25
|
+
'Verify the token has the required repository permissions',
|
|
26
|
+
'Consider generating a new access token',
|
|
27
|
+
],
|
|
28
|
+
[ErrorCode.IO_FILE_NOT_FOUND]: [
|
|
29
|
+
'Double-check the file path',
|
|
30
|
+
'Confirm file permissions allow reading',
|
|
31
|
+
'Make sure you are in the right directory',
|
|
32
|
+
],
|
|
33
|
+
[ErrorCode.IO_DIR_NOT_FOUND]: [
|
|
34
|
+
'Confirm the directory path is valid',
|
|
35
|
+
'Ensure the model workspace is properly configured',
|
|
36
|
+
],
|
|
37
|
+
[ErrorCode.NET_ERROR]: [
|
|
38
|
+
'Verify your network connection',
|
|
39
|
+
'Review firewall rules',
|
|
40
|
+
'Retry after a short wait',
|
|
41
|
+
],
|
|
42
|
+
[ErrorCode.PROVIDER_RATE_LIMITED]: [
|
|
43
|
+
'Pause for a few minutes, then retry',
|
|
44
|
+
'Upgrading your API tier may help',
|
|
45
|
+
],
|
|
46
|
+
[ErrorCode.PLATFORM_INVALID_URL]: [
|
|
47
|
+
'Verify the URL matches: https://github.com/owner/repo/commit/sha',
|
|
48
|
+
'Confirm the repository and commit are accessible',
|
|
49
|
+
],
|
|
50
|
+
[ErrorCode.MODEL_NOT_INITIALIZED]: [
|
|
51
|
+
'Call loadFromPath() before querying the model',
|
|
52
|
+
'This is a bug — the adapter was accessed prior to initialization',
|
|
53
|
+
],
|
|
54
|
+
[ErrorCode.PROVIDER_CONTEXT_OVERFLOW]: [
|
|
55
|
+
'The changeset is too large for analysis',
|
|
56
|
+
'Try with a smaller set of changes',
|
|
57
|
+
'Consider splitting the changes into smaller PRs',
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
let errorSuggestions = suggestions[error.code];
|
|
61
|
+
if (error instanceof AdapterError && error.suggestions && error.suggestions.length > 0) {
|
|
62
|
+
errorSuggestions = error.suggestions;
|
|
63
|
+
}
|
|
64
|
+
if (errorSuggestions && errorSuggestions.length > 0) {
|
|
65
|
+
console.error('\n💡 Hints:');
|
|
66
|
+
errorSuggestions.forEach((suggestion) => {
|
|
67
|
+
Logger.info(`• ${suggestion}`);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const SENSITIVE_PATTERNS = ['token', 'key', 'secret', 'password', 'credential', 'auth', 'bearer'];
|
|
72
|
+
function isSensitiveKey(key) {
|
|
73
|
+
const lower = key.toLowerCase();
|
|
74
|
+
return SENSITIVE_PATTERNS.some((p) => lower.includes(p));
|
|
75
|
+
}
|
|
76
|
+
function redactSensitiveValue(value) {
|
|
77
|
+
return value.replace(/\b(https?):\/\/[^@\s]+@/gi, '$1://***@');
|
|
78
|
+
}
|
|
79
|
+
export const ErrorHandler = {
|
|
80
|
+
formatError(error) {
|
|
81
|
+
if (error instanceof ErodeError) {
|
|
82
|
+
Logger.fail(error.userMessage);
|
|
83
|
+
if (Object.keys(error.context).length > 0) {
|
|
84
|
+
console.error(' Extra details:');
|
|
85
|
+
for (const [key, value] of Object.entries(error.context)) {
|
|
86
|
+
if (value !== undefined && value !== null) {
|
|
87
|
+
if (isSensitiveKey(key)) {
|
|
88
|
+
console.error(` ${key}: ***REDACTED***`);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
const display = typeof value === 'string' ? redactSensitiveValue(value) : String(value);
|
|
92
|
+
console.error(` ${key}: ${display}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
console.error(` Code: ${error.code}`);
|
|
98
|
+
provideSuggestions(error);
|
|
99
|
+
}
|
|
100
|
+
else if (error instanceof Error) {
|
|
101
|
+
Logger.fail(error.message);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
Logger.fail(`Something went wrong unexpectedly: ${String(error)}`);
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
async withRetry(operation, options = {}) {
|
|
108
|
+
const config = { ...DEFAULT_RETRY_OPTIONS, ...options };
|
|
109
|
+
let lastError;
|
|
110
|
+
for (let attempt = 1; attempt <= config.maxAttempts; attempt++) {
|
|
111
|
+
try {
|
|
112
|
+
return await operation();
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
lastError = error;
|
|
116
|
+
if (config.shouldRetry && !config.shouldRetry(error)) {
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
if (!config.shouldRetry && error instanceof ErodeError && !error.recoverable) {
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
122
|
+
if (attempt === config.maxAttempts) {
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
const delay = config.exponentialBackoff
|
|
126
|
+
? Math.min(config.baseDelay * Math.pow(2, attempt - 1), config.maxDelay)
|
|
127
|
+
: config.baseDelay;
|
|
128
|
+
Logger.warn(`Try ${String(attempt)} failed, retrying in ${String(delay)}ms...`);
|
|
129
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
throw lastError;
|
|
133
|
+
},
|
|
134
|
+
getExitCode(error) {
|
|
135
|
+
if (error instanceof ErodeError) {
|
|
136
|
+
switch (error.code) {
|
|
137
|
+
case ErrorCode.INPUT_CHANGE_TOO_LARGE:
|
|
138
|
+
return 0;
|
|
139
|
+
case ErrorCode.CONFIG_MISSING:
|
|
140
|
+
case ErrorCode.CONFIG_INVALID:
|
|
141
|
+
case ErrorCode.AUTH_KEY_MISSING:
|
|
142
|
+
case ErrorCode.INPUT_INVALID:
|
|
143
|
+
return 2;
|
|
144
|
+
case ErrorCode.IO_FILE_NOT_FOUND:
|
|
145
|
+
case ErrorCode.IO_DIR_NOT_FOUND:
|
|
146
|
+
case ErrorCode.IO_PERMISSION_DENIED:
|
|
147
|
+
return 3;
|
|
148
|
+
case ErrorCode.NET_ERROR:
|
|
149
|
+
case ErrorCode.PROVIDER_ERROR:
|
|
150
|
+
case ErrorCode.PROVIDER_TIMEOUT:
|
|
151
|
+
case ErrorCode.PROVIDER_RATE_LIMITED:
|
|
152
|
+
return 4;
|
|
153
|
+
case ErrorCode.AUTH_PLATFORM_FAILURE:
|
|
154
|
+
case ErrorCode.PLATFORM_REPO_NOT_FOUND:
|
|
155
|
+
return 5;
|
|
156
|
+
default:
|
|
157
|
+
return 1;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return 1;
|
|
161
|
+
},
|
|
162
|
+
handleCliError(error) {
|
|
163
|
+
ErrorHandler.formatError(error);
|
|
164
|
+
const exitCode = ErrorHandler.getExitCode(error);
|
|
165
|
+
process.exit(exitCode);
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@erode-app/cli",
|
|
3
|
+
"version": "0.6.0-beta.0",
|
|
4
|
+
"description": "Interactive CLI for erode architecture drift detection",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/cli.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"erode": "./dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"!dist/**/__tests__"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"typecheck": "tsc --noEmit",
|
|
17
|
+
"lint": "eslint . --report-unused-disable-directives --max-warnings 0",
|
|
18
|
+
"lint:fix": "eslint . --report-unused-disable-directives --max-warnings 0 --fix",
|
|
19
|
+
"format": "prettier --write .",
|
|
20
|
+
"format:check": "prettier --check .",
|
|
21
|
+
"clean": "rimraf dist",
|
|
22
|
+
"prebuild": "npm run clean",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"test:watch": "vitest",
|
|
25
|
+
"check:ci": "concurrently --group \"npm:lint\" \"npm:typecheck\" \"npm:format:check\" \"npm:build\""
|
|
26
|
+
},
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "https://github.com/erode-app/erode.git",
|
|
30
|
+
"directory": "packages/cli"
|
|
31
|
+
},
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@erode-app/core": "0.6.0-beta.0",
|
|
35
|
+
"chalk": "^5.3.0",
|
|
36
|
+
"commander": "^14.0.2",
|
|
37
|
+
"zod": "^4.1.13"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@erode-app/eslint-config": "*",
|
|
41
|
+
"@types/node": "^24.11.0",
|
|
42
|
+
"concurrently": "^9.2.1",
|
|
43
|
+
"eslint": "^10.0.2",
|
|
44
|
+
"prettier": "^3.7.3",
|
|
45
|
+
"rimraf": "^6.1.2",
|
|
46
|
+
"typescript": "^5.9.3",
|
|
47
|
+
"vitest": "^4.0.14"
|
|
48
|
+
},
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public"
|
|
51
|
+
},
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=24.0.0"
|
|
54
|
+
}
|
|
55
|
+
}
|