@cisco_open/linting-orchestrator 1.0.0-rc.4
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/LICENSE +201 -0
- package/NOTICE +5 -0
- package/README.md +43 -0
- package/build/cli/api-client.d.ts +170 -0
- package/build/cli/api-client.d.ts.map +1 -0
- package/build/cli/api-client.js +284 -0
- package/build/cli/api-client.js.map +1 -0
- package/build/cli/commands/agents.d.ts +7 -0
- package/build/cli/commands/agents.d.ts.map +1 -0
- package/build/cli/commands/agents.js +694 -0
- package/build/cli/commands/agents.js.map +1 -0
- package/build/cli/commands/completion.d.ts +9 -0
- package/build/cli/commands/completion.d.ts.map +1 -0
- package/build/cli/commands/completion.js +177 -0
- package/build/cli/commands/completion.js.map +1 -0
- package/build/cli/commands/config.d.ts +10 -0
- package/build/cli/commands/config.d.ts.map +1 -0
- package/build/cli/commands/config.js +284 -0
- package/build/cli/commands/config.js.map +1 -0
- package/build/cli/commands/health.d.ts +11 -0
- package/build/cli/commands/health.d.ts.map +1 -0
- package/build/cli/commands/health.js +38 -0
- package/build/cli/commands/health.js.map +1 -0
- package/build/cli/commands/help.d.ts +6 -0
- package/build/cli/commands/help.d.ts.map +1 -0
- package/build/cli/commands/help.js +20 -0
- package/build/cli/commands/help.js.map +1 -0
- package/build/cli/commands/history.d.ts +11 -0
- package/build/cli/commands/history.d.ts.map +1 -0
- package/build/cli/commands/history.js +50 -0
- package/build/cli/commands/history.js.map +1 -0
- package/build/cli/commands/jobs.d.ts +12 -0
- package/build/cli/commands/jobs.d.ts.map +1 -0
- package/build/cli/commands/jobs.js +84 -0
- package/build/cli/commands/jobs.js.map +1 -0
- package/build/cli/commands/lint.d.ts +15 -0
- package/build/cli/commands/lint.d.ts.map +1 -0
- package/build/cli/commands/lint.js +384 -0
- package/build/cli/commands/lint.js.map +1 -0
- package/build/cli/commands/ps.d.ts +8 -0
- package/build/cli/commands/ps.d.ts.map +1 -0
- package/build/cli/commands/ps.js +74 -0
- package/build/cli/commands/ps.js.map +1 -0
- package/build/cli/commands/reproduce.d.ts +9 -0
- package/build/cli/commands/reproduce.d.ts.map +1 -0
- package/build/cli/commands/reproduce.js +31 -0
- package/build/cli/commands/reproduce.js.map +1 -0
- package/build/cli/commands/reset.d.ts +5 -0
- package/build/cli/commands/reset.d.ts.map +1 -0
- package/build/cli/commands/reset.js +13 -0
- package/build/cli/commands/reset.js.map +1 -0
- package/build/cli/commands/results.d.ts +13 -0
- package/build/cli/commands/results.d.ts.map +1 -0
- package/build/cli/commands/results.js +129 -0
- package/build/cli/commands/results.js.map +1 -0
- package/build/cli/commands/rulesets/check.d.ts +12 -0
- package/build/cli/commands/rulesets/check.d.ts.map +1 -0
- package/build/cli/commands/rulesets/check.js +226 -0
- package/build/cli/commands/rulesets/check.js.map +1 -0
- package/build/cli/commands/rulesets/index.d.ts +5 -0
- package/build/cli/commands/rulesets/index.d.ts.map +1 -0
- package/build/cli/commands/rulesets/index.js +6 -0
- package/build/cli/commands/rulesets/index.js.map +1 -0
- package/build/cli/commands/rulesets/view.d.ts +16 -0
- package/build/cli/commands/rulesets/view.d.ts.map +1 -0
- package/build/cli/commands/rulesets/view.js +100 -0
- package/build/cli/commands/rulesets/view.js.map +1 -0
- package/build/cli/commands/start.d.ts +16 -0
- package/build/cli/commands/start.d.ts.map +1 -0
- package/build/cli/commands/start.js +167 -0
- package/build/cli/commands/start.js.map +1 -0
- package/build/cli/commands/status.d.ts +9 -0
- package/build/cli/commands/status.d.ts.map +1 -0
- package/build/cli/commands/status.js +46 -0
- package/build/cli/commands/status.js.map +1 -0
- package/build/cli/commands/stop.d.ts +11 -0
- package/build/cli/commands/stop.d.ts.map +1 -0
- package/build/cli/commands/stop.js +78 -0
- package/build/cli/commands/stop.js.map +1 -0
- package/build/cli/config-manager.d.ts +134 -0
- package/build/cli/config-manager.d.ts.map +1 -0
- package/build/cli/config-manager.js +288 -0
- package/build/cli/config-manager.js.map +1 -0
- package/build/cli/formatters.d.ts +62 -0
- package/build/cli/formatters.d.ts.map +1 -0
- package/build/cli/formatters.js +715 -0
- package/build/cli/formatters.js.map +1 -0
- package/build/cli/history-manager.d.ts +97 -0
- package/build/cli/history-manager.d.ts.map +1 -0
- package/build/cli/history-manager.js +201 -0
- package/build/cli/history-manager.js.map +1 -0
- package/build/cli/index.d.ts +16 -0
- package/build/cli/index.d.ts.map +1 -0
- package/build/cli/index.js +335 -0
- package/build/cli/index.js.map +1 -0
- package/build/cli/list-rulesets.d.ts +15 -0
- package/build/cli/list-rulesets.d.ts.map +1 -0
- package/build/cli/list-rulesets.js +193 -0
- package/build/cli/list-rulesets.js.map +1 -0
- package/build/cli/utils/connection-error.d.ts +9 -0
- package/build/cli/utils/connection-error.d.ts.map +1 -0
- package/build/cli/utils/connection-error.js +30 -0
- package/build/cli/utils/connection-error.js.map +1 -0
- package/build/cli/utils/embedded-server.d.ts +21 -0
- package/build/cli/utils/embedded-server.d.ts.map +1 -0
- package/build/cli/utils/embedded-server.js +61 -0
- package/build/cli/utils/embedded-server.js.map +1 -0
- package/build/cli/utils/mode-validator.d.ts +13 -0
- package/build/cli/utils/mode-validator.d.ts.map +1 -0
- package/build/cli/utils/mode-validator.js +31 -0
- package/build/cli/utils/mode-validator.js.map +1 -0
- package/build/cli/utils/port-checker.d.ts +20 -0
- package/build/cli/utils/port-checker.d.ts.map +1 -0
- package/build/cli/utils/port-checker.js +49 -0
- package/build/cli/utils/port-checker.js.map +1 -0
- package/build/config.d.ts +57 -0
- package/build/config.d.ts.map +1 -0
- package/build/config.js +527 -0
- package/build/config.js.map +1 -0
- package/build/document-accessor.d.ts +79 -0
- package/build/document-accessor.d.ts.map +1 -0
- package/build/document-accessor.js +148 -0
- package/build/document-accessor.js.map +1 -0
- package/build/formatters/reproduce-markdown.d.ts +14 -0
- package/build/formatters/reproduce-markdown.d.ts.map +1 -0
- package/build/formatters/reproduce-markdown.js +182 -0
- package/build/formatters/reproduce-markdown.js.map +1 -0
- package/build/formatters/sarif-builder.d.ts +86 -0
- package/build/formatters/sarif-builder.d.ts.map +1 -0
- package/build/formatters/sarif-builder.js +276 -0
- package/build/formatters/sarif-builder.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +174 -0
- package/build/index.js.map +1 -0
- package/build/logger.d.ts +38 -0
- package/build/logger.d.ts.map +1 -0
- package/build/logger.js +105 -0
- package/build/logger.js.map +1 -0
- package/build/mock-server.d.ts +2 -0
- package/build/mock-server.d.ts.map +1 -0
- package/build/mock-server.js +290 -0
- package/build/mock-server.js.map +1 -0
- package/build/orchestrator.d.ts +149 -0
- package/build/orchestrator.d.ts.map +1 -0
- package/build/orchestrator.js +874 -0
- package/build/orchestrator.js.map +1 -0
- package/build/ruleset-loader.d.ts +79 -0
- package/build/ruleset-loader.d.ts.map +1 -0
- package/build/ruleset-loader.js +514 -0
- package/build/ruleset-loader.js.map +1 -0
- package/build/schemas.d.ts +2568 -0
- package/build/schemas.d.ts.map +1 -0
- package/build/schemas.js +674 -0
- package/build/schemas.js.map +1 -0
- package/build/server.d.ts +39 -0
- package/build/server.d.ts.map +1 -0
- package/build/server.js +834 -0
- package/build/server.js.map +1 -0
- package/build/storage/memory-storage.d.ts +190 -0
- package/build/storage/memory-storage.d.ts.map +1 -0
- package/build/storage/memory-storage.js +629 -0
- package/build/storage/memory-storage.js.map +1 -0
- package/build/storage/redis-storage.d.ts +134 -0
- package/build/storage/redis-storage.d.ts.map +1 -0
- package/build/storage/redis-storage.js +236 -0
- package/build/storage/redis-storage.js.map +1 -0
- package/build/storage/storage-adapter.d.ts +189 -0
- package/build/storage/storage-adapter.d.ts.map +1 -0
- package/build/storage/storage-adapter.js +36 -0
- package/build/storage/storage-adapter.js.map +1 -0
- package/build/types.d.ts +981 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +5 -0
- package/build/types.js.map +1 -0
- package/build/utils/version.d.ts +40 -0
- package/build/utils/version.d.ts.map +1 -0
- package/build/utils/version.js +94 -0
- package/build/utils/version.js.map +1 -0
- package/build/validation.d.ts +95 -0
- package/build/validation.d.ts.map +1 -0
- package/build/validation.js +150 -0
- package/build/validation.js.map +1 -0
- package/build/worker-pool.d.ts +137 -0
- package/build/worker-pool.d.ts.map +1 -0
- package/build/worker-pool.js +549 -0
- package/build/worker-pool.js.map +1 -0
- package/build/worker.d.ts +2 -0
- package/build/worker.d.ts.map +1 -0
- package/build/worker.js +427 -0
- package/build/worker.js.map +1 -0
- package/package.json +110 -0
- package/rulesets/CHANGELOG.md +25 -0
- package/rulesets/config/rulesets.yaml +96 -0
- package/rulesets/sources/README.md +47 -0
- package/rulesets/sources/example/oas-recommended/v1.0.0/ruleset.yaml +6 -0
- package/rulesets/sources/example/oas-recommended/v2.0.0/ruleset.yaml +14 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reproduce.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/reproduce.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB9F"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reproduce command - Generate Spectral CLI reproduction instructions for a lint job
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import { SpectifyAPIClient, ConnectionError } from '../api-client.js';
|
|
7
|
+
export async function reproduceCommand(jobId, options) {
|
|
8
|
+
const client = new SpectifyAPIClient(options.apiUrl);
|
|
9
|
+
const spinner = ora('Generating reproduction instructions...').start();
|
|
10
|
+
try {
|
|
11
|
+
const markdown = await client.getReproductionInstructions(jobId);
|
|
12
|
+
spinner.succeed('Reproduction instructions generated');
|
|
13
|
+
if (options.output) {
|
|
14
|
+
const fs = await import('fs/promises');
|
|
15
|
+
await fs.writeFile(options.output, markdown, 'utf-8');
|
|
16
|
+
console.log(chalk.green(`\n✓ Reproduction instructions saved to ${options.output}`));
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
console.log('');
|
|
20
|
+
console.log(markdown);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (error instanceof ConnectionError)
|
|
25
|
+
throw error;
|
|
26
|
+
spinner.fail('Failed to generate reproduction instructions');
|
|
27
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=reproduce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reproduce.js","sourceRoot":"","sources":["../../../src/cli/commands/reproduce.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAOtE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAa,EAAE,OAAyB;IAC7E,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAErD,MAAM,OAAO,GAAG,GAAG,CAAC,yCAAyC,CAAC,CAAC,KAAK,EAAE,CAAC;IACvE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;QACjE,OAAO,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;QAEvD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACvC,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0CAA0C,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACvF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,eAAe;YAAE,MAAM,KAAK,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/reset.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CASlD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reset command - Reset terminal colors and formatting
|
|
3
|
+
*/
|
|
4
|
+
export async function resetCommand() {
|
|
5
|
+
// Output ANSI reset sequence to clear all formatting
|
|
6
|
+
process.stdout.write('\x1b[0m\n');
|
|
7
|
+
console.log('Terminal colors reset.');
|
|
8
|
+
console.log('\nAlternatively, you can use these standard commands:');
|
|
9
|
+
console.log(' reset - Full terminal reset');
|
|
10
|
+
console.log(' tput reset - Reset terminal using terminfo');
|
|
11
|
+
console.log(' stty sane - Reset terminal settings');
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=reset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset.js","sourceRoot":"","sources":["../../../src/cli/commands/reset.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,qDAAqD;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAElC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Results command - View detailed lint results
|
|
3
|
+
*/
|
|
4
|
+
export interface ResultsOptions {
|
|
5
|
+
apiUrl?: string;
|
|
6
|
+
rule?: string;
|
|
7
|
+
severity?: string;
|
|
8
|
+
format?: 'text' | 'json' | 'sarif';
|
|
9
|
+
output?: string;
|
|
10
|
+
json?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function resultsCommand(jobId: string, options: ResultsOptions): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=results.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/results.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA2H1F"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Results command - View detailed lint results
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import { SpectifyAPIClient, ConnectionError } from '../api-client.js';
|
|
7
|
+
import { HistoryManager } from '../history-manager.js';
|
|
8
|
+
import { formatSummary, formatIssuesTable, formatRuleSummaryTable, formatRuleDetailView } from '../formatters.js';
|
|
9
|
+
export async function resultsCommand(jobId, options) {
|
|
10
|
+
try {
|
|
11
|
+
const client = new SpectifyAPIClient(options.apiUrl);
|
|
12
|
+
// Handle SARIF report generation
|
|
13
|
+
if (options.output || options.format === 'sarif') {
|
|
14
|
+
const spinner = ora('Generating SARIF report...').start();
|
|
15
|
+
try {
|
|
16
|
+
const sarif = await client.generateReport(jobId, 'sarif');
|
|
17
|
+
spinner.succeed('SARIF report generated');
|
|
18
|
+
if (options.output) {
|
|
19
|
+
// Write to file
|
|
20
|
+
const fs = await import('fs/promises');
|
|
21
|
+
await fs.writeFile(options.output, JSON.stringify(sarif, null, 2), 'utf-8');
|
|
22
|
+
console.log(chalk.green(`\n✓ SARIF report saved to ${options.output}`));
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
// Output to stdout
|
|
26
|
+
console.log(JSON.stringify(sarif, null, 2));
|
|
27
|
+
}
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (error instanceof ConnectionError)
|
|
32
|
+
throw error;
|
|
33
|
+
spinner.fail('Failed to generate report');
|
|
34
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Try history first for faster access
|
|
39
|
+
const historyManager = new HistoryManager();
|
|
40
|
+
const historyEntry = await historyManager.getById(jobId);
|
|
41
|
+
// Fetch results from API
|
|
42
|
+
const spinner = ora('Fetching results...').start();
|
|
43
|
+
let results;
|
|
44
|
+
try {
|
|
45
|
+
results = await client.getJobResults(jobId);
|
|
46
|
+
spinner.succeed('Results retrieved');
|
|
47
|
+
// --json: output raw API response and exit
|
|
48
|
+
if (options.json) {
|
|
49
|
+
console.log(JSON.stringify(results, null, 2));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (error instanceof ConnectionError)
|
|
55
|
+
throw error;
|
|
56
|
+
spinner.fail('Failed to get results');
|
|
57
|
+
// If API fails, check if we have it in history
|
|
58
|
+
if (historyEntry) {
|
|
59
|
+
console.log(chalk.yellow('Using cached results from history'));
|
|
60
|
+
console.log(chalk.dim(`File: ${historyEntry.filePath}`));
|
|
61
|
+
console.log(chalk.dim(`Ruleset: ${historyEntry.rulesetName} v${historyEntry.rulesetVersion}`));
|
|
62
|
+
console.log(chalk.dim(`Timestamp: ${new Date(historyEntry.timestamp).toLocaleString()}\n`));
|
|
63
|
+
console.log(chalk.yellow('Summary from history:'));
|
|
64
|
+
console.log(`Total Issues: ${historyEntry.summary.totalIssues}`);
|
|
65
|
+
console.log(` Errors: ${historyEntry.summary.errorCount}`);
|
|
66
|
+
console.log(` Warnings: ${historyEntry.summary.warningCount}`);
|
|
67
|
+
console.log(` Info: ${historyEntry.summary.infoCount}`);
|
|
68
|
+
console.log(` Hints: ${historyEntry.summary.hintCount}\n`);
|
|
69
|
+
console.log(chalk.dim('Note: Detailed results not available. Run lint again to see full details.'));
|
|
70
|
+
process.exit(0);
|
|
71
|
+
}
|
|
72
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
// Filter results
|
|
76
|
+
let filteredIssues = results.results || [];
|
|
77
|
+
if (options.rule) {
|
|
78
|
+
filteredIssues = filteredIssues.filter(issue => issue.ruleId === options.rule || issue.code === options.rule);
|
|
79
|
+
}
|
|
80
|
+
if (options.severity) {
|
|
81
|
+
const severityMap = {
|
|
82
|
+
error: 0,
|
|
83
|
+
warning: 1,
|
|
84
|
+
info: 2,
|
|
85
|
+
hint: 3,
|
|
86
|
+
};
|
|
87
|
+
const severityLevel = severityMap[options.severity.toLowerCase()];
|
|
88
|
+
if (severityLevel !== undefined) {
|
|
89
|
+
filteredIssues = filteredIssues.filter(issue => issue.severity === severityLevel);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Display results
|
|
93
|
+
if (options.format === 'json') {
|
|
94
|
+
console.log(JSON.stringify({
|
|
95
|
+
...results,
|
|
96
|
+
results: filteredIssues,
|
|
97
|
+
}, null, 2));
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Gray out summary when showing rule details
|
|
101
|
+
console.log(formatSummary(results, options.rule ? true : false));
|
|
102
|
+
if (filteredIssues.length > 0) {
|
|
103
|
+
if (options.rule) {
|
|
104
|
+
// Rule detail view: show issues for specific rule without repetition
|
|
105
|
+
console.log(chalk.bold(`Filtered results (${filteredIssues.length} of ${results.results.length}):\n`));
|
|
106
|
+
console.log(formatRuleDetailView(filteredIssues));
|
|
107
|
+
}
|
|
108
|
+
else if (options.severity) {
|
|
109
|
+
// Severity filter: show detailed issues table
|
|
110
|
+
console.log(chalk.dim(`Filtered results (${filteredIssues.length} of ${results.results.length}):\n`));
|
|
111
|
+
console.log(formatIssuesTable(filteredIssues));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// Summary view: show issues grouped by rule
|
|
115
|
+
console.log(chalk.bold('\nIssues by Rule:\n'));
|
|
116
|
+
console.log(formatRuleSummaryTable(filteredIssues));
|
|
117
|
+
console.log(chalk.dim(`\nTo see detailed issues for a specific rule, use: ${chalk.cyan('spectify results <jobId> --rule <ruleName>')}\n`));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else if (options.rule || options.severity) {
|
|
121
|
+
console.log(chalk.yellow('No issues match the specified filters.\n'));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=results.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"results.js","sourceRoot":"","sources":["../../../src/cli/commands/results.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface CheckRulesetsOptions {
|
|
2
|
+
/** Restrict the check to a single ruleset by name. */
|
|
3
|
+
name?: string;
|
|
4
|
+
/** Restrict the check to a single version. Requires --name. */
|
|
5
|
+
version?: string;
|
|
6
|
+
/** Override the catalogue directory (otherwise: SPECTIFYD_RULESETS_DIR or config default). */
|
|
7
|
+
rulesetsDirectory?: string;
|
|
8
|
+
/** Output format. */
|
|
9
|
+
format?: 'text' | 'json';
|
|
10
|
+
}
|
|
11
|
+
export declare function checkRulesetsCommand(options: CheckRulesetsOptions): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/rulesets/check.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,oBAAoB;IACjC,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8FAA8F;IAC9F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAmED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6HvF"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// Copyright 2026 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
//
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
/**
|
|
5
|
+
* `spectify rulesets check` — load-only validation of a ruleset catalogue.
|
|
6
|
+
*
|
|
7
|
+
* Runs entirely in-process: no embedded server is started, no worker threads
|
|
8
|
+
* are spawned. For each `{ruleset, version}` selected, the command:
|
|
9
|
+
*
|
|
10
|
+
* 1. Reads the catalogue's `config/rulesets.yaml` (same code path as
|
|
11
|
+
* `spectifyd` startup).
|
|
12
|
+
* 2. Resolves the version's entrypoint (or built-in token for embedded
|
|
13
|
+
* origins).
|
|
14
|
+
* 3. Hands the entrypoint to Spectral's ruleset bundler (the exact same
|
|
15
|
+
* call the worker pool makes when it instantiates a worker).
|
|
16
|
+
* 4. Reports success (with the rule count) or failure (with the bundler
|
|
17
|
+
* error and an optional hint).
|
|
18
|
+
*
|
|
19
|
+
* Selection rules:
|
|
20
|
+
* - no flags → every ruleset, every configured version
|
|
21
|
+
* - --name N → every configured version of N
|
|
22
|
+
* - --name N --version V → just that one entry
|
|
23
|
+
* - --version V without --name → error
|
|
24
|
+
*
|
|
25
|
+
* Exit codes:
|
|
26
|
+
* 0 every selected ruleset loaded successfully
|
|
27
|
+
* 1 at least one selected ruleset failed to load
|
|
28
|
+
* 2 the catalogue itself could not be read (bad path, malformed YAML)
|
|
29
|
+
*/
|
|
30
|
+
import * as path from 'path';
|
|
31
|
+
import * as fs from 'fs/promises';
|
|
32
|
+
import chalk from 'chalk';
|
|
33
|
+
import { loadConfig } from '../../../config.js';
|
|
34
|
+
import { RulesetLoader } from '../../../ruleset-loader.js';
|
|
35
|
+
/**
|
|
36
|
+
* Heuristics that turn known load-failure messages into actionable hints.
|
|
37
|
+
* The original error is always preserved; the hint is purely advisory.
|
|
38
|
+
*/
|
|
39
|
+
function inferHint(message) {
|
|
40
|
+
// .ts entrypoint without a build step
|
|
41
|
+
if (/\.ts:/.test(message) && /Unexpected token/.test(message)) {
|
|
42
|
+
return 'Entrypoint points to a .ts file. The source tree probably needs to be built. Run `bash scripts/install.sh` (which builds JS sources after `npm install`).';
|
|
43
|
+
}
|
|
44
|
+
// CommonJS exports in a file Spectral's bundler is trying to parse as ESM.
|
|
45
|
+
// Spectral's bundler expects rulesets to be authored as ESM (or YAML);
|
|
46
|
+
// CJS build outputs from Babel / `tsc --module commonjs` will hit this.
|
|
47
|
+
if (/exports is not defined/.test(message) || /module is not defined/.test(message)) {
|
|
48
|
+
return 'Entrypoint appears to be a CommonJS module. Either rebuild the source repo as ESM (`--module esnext` or similar) so its dist is ESM, OR add `loader: native` to this version in `config/rulesets.yaml` to load it via Node\'s built-in `await import()` (which handles CJS transparently).';
|
|
49
|
+
}
|
|
50
|
+
// Sibling module not found — typically a missing build output
|
|
51
|
+
if (/Could not resolve '\.\//.test(message)) {
|
|
52
|
+
return 'A sibling module could not be resolved. The source tree may not be built. Run `bash scripts/install.sh`.';
|
|
53
|
+
}
|
|
54
|
+
// Missing npm dep
|
|
55
|
+
if (/Cannot find module/.test(message)) {
|
|
56
|
+
return 'An npm dependency is missing. Run `bash scripts/install.sh` in this catalogue.';
|
|
57
|
+
}
|
|
58
|
+
// Entrypoint path does not exist on disk
|
|
59
|
+
if (/Ruleset file not found/.test(message)) {
|
|
60
|
+
return 'The configured entrypoint does not exist on disk. Check `entrypoint` / `sourceVersion` in `config/rulesets.yaml`, then re-run `bash scripts/vendor.sh`.';
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Resolve the catalogue directory. Precedence:
|
|
66
|
+
* 1. --rulesets-directory CLI flag
|
|
67
|
+
* 2. SPECTIFYD_RULESETS_DIR env var (applied by loadConfig)
|
|
68
|
+
* 3. The orchestrator's bundled default
|
|
69
|
+
*/
|
|
70
|
+
async function resolveRulesetsDirectory(override) {
|
|
71
|
+
if (override) {
|
|
72
|
+
return path.resolve(override);
|
|
73
|
+
}
|
|
74
|
+
const config = await loadConfig();
|
|
75
|
+
return config.rulesets.directory;
|
|
76
|
+
}
|
|
77
|
+
export async function checkRulesetsCommand(options) {
|
|
78
|
+
if (options.version && !options.name) {
|
|
79
|
+
console.error(chalk.red('Error: --version requires --name (cannot select a version across all rulesets).'));
|
|
80
|
+
process.exit(2);
|
|
81
|
+
}
|
|
82
|
+
const rulesetsDir = await resolveRulesetsDirectory(options.rulesetsDirectory);
|
|
83
|
+
const configPath = path.join(rulesetsDir, 'config', 'rulesets.yaml');
|
|
84
|
+
// Confirm the catalogue exists before instantiating the loader so we can
|
|
85
|
+
// emit a clean error rather than a stack trace.
|
|
86
|
+
try {
|
|
87
|
+
await fs.access(configPath);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
console.error(chalk.red(`Error: ruleset catalogue not found at ${configPath}`));
|
|
91
|
+
console.error(chalk.dim('Set --rulesets-directory or SPECTIFYD_RULESETS_DIR to a directory that contains config/rulesets.yaml.'));
|
|
92
|
+
process.exit(2);
|
|
93
|
+
}
|
|
94
|
+
const loader = new RulesetLoader({
|
|
95
|
+
configPath,
|
|
96
|
+
sourcesBasePath: path.join(rulesetsDir, 'sources'),
|
|
97
|
+
// Caching would silently mask repeated failures across versions, and
|
|
98
|
+
// it has no benefit for a one-shot check.
|
|
99
|
+
enableCache: false,
|
|
100
|
+
});
|
|
101
|
+
try {
|
|
102
|
+
await loader.initialize();
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.error(chalk.red(`Error: failed to read ruleset catalogue at ${configPath}`));
|
|
106
|
+
console.error(chalk.red(` ${error instanceof Error ? error.message : String(error)}`));
|
|
107
|
+
process.exit(2);
|
|
108
|
+
}
|
|
109
|
+
// Build the (ruleset, version) work list.
|
|
110
|
+
const all = loader.listRulesets();
|
|
111
|
+
let targets = [];
|
|
112
|
+
if (options.name) {
|
|
113
|
+
const entry = all.find(r => r.name === options.name);
|
|
114
|
+
if (!entry) {
|
|
115
|
+
console.error(chalk.red(`Error: ruleset '${options.name}' is not configured in ${configPath}.`));
|
|
116
|
+
console.error(chalk.dim(`Available: ${all.map(r => r.name).join(', ')}`));
|
|
117
|
+
process.exit(2);
|
|
118
|
+
}
|
|
119
|
+
const versions = options.version ? [options.version] : entry.versions;
|
|
120
|
+
if (options.version && !entry.versions.includes(options.version)) {
|
|
121
|
+
console.error(chalk.red(`Error: ruleset '${options.name}' has no version '${options.version}'.`));
|
|
122
|
+
console.error(chalk.dim(`Available versions: ${entry.versions.join(', ')}`));
|
|
123
|
+
process.exit(2);
|
|
124
|
+
}
|
|
125
|
+
targets = versions.map(v => ({ name: entry.name, origin: entry.origin, version: v }));
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
for (const r of all) {
|
|
129
|
+
for (const v of r.versions) {
|
|
130
|
+
targets.push({ name: r.name, origin: r.origin, version: v });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const format = options.format ?? 'text';
|
|
135
|
+
if (format === 'text') {
|
|
136
|
+
console.log('');
|
|
137
|
+
console.log(`Checking ${targets.length} ruleset version${targets.length === 1 ? '' : 's'} in ${configPath}`);
|
|
138
|
+
console.log('');
|
|
139
|
+
}
|
|
140
|
+
const results = [];
|
|
141
|
+
for (const target of targets) {
|
|
142
|
+
const startedAt = Date.now();
|
|
143
|
+
let result;
|
|
144
|
+
try {
|
|
145
|
+
const loaded = await loader.loadVersion(target.name, target.version);
|
|
146
|
+
result = {
|
|
147
|
+
name: target.name,
|
|
148
|
+
version: target.version,
|
|
149
|
+
origin: target.origin,
|
|
150
|
+
status: 'ok',
|
|
151
|
+
durationMs: Date.now() - startedAt,
|
|
152
|
+
ruleCount: loaded.rules.length,
|
|
153
|
+
error: null,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
158
|
+
const hint = inferHint(message);
|
|
159
|
+
result = {
|
|
160
|
+
name: target.name,
|
|
161
|
+
version: target.version,
|
|
162
|
+
origin: target.origin,
|
|
163
|
+
status: 'failed',
|
|
164
|
+
durationMs: Date.now() - startedAt,
|
|
165
|
+
ruleCount: null,
|
|
166
|
+
error: { message, ...(hint ? { hint } : {}) },
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (format === 'text') {
|
|
170
|
+
printResultLine(result);
|
|
171
|
+
}
|
|
172
|
+
results.push(result);
|
|
173
|
+
}
|
|
174
|
+
const okCount = results.filter(r => r.status === 'ok').length;
|
|
175
|
+
const failedCount = results.length - okCount;
|
|
176
|
+
if (format === 'json') {
|
|
177
|
+
const report = {
|
|
178
|
+
configPath,
|
|
179
|
+
summary: { total: results.length, ok: okCount, failed: failedCount },
|
|
180
|
+
results,
|
|
181
|
+
};
|
|
182
|
+
console.log(JSON.stringify(report, null, 2));
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
console.log('');
|
|
186
|
+
if (failedCount === 0) {
|
|
187
|
+
console.log(chalk.green(`Summary: ${okCount} ok, ${failedCount} failed`));
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
console.log(chalk.red(`Summary: ${okCount} ok, ${failedCount} failed`));
|
|
191
|
+
}
|
|
192
|
+
console.log('');
|
|
193
|
+
}
|
|
194
|
+
process.exit(failedCount === 0 ? 0 : 1);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* One-line-per-ruleset text formatter. Failed entries get the error message
|
|
198
|
+
* (and hint) indented below.
|
|
199
|
+
*/
|
|
200
|
+
function printResultLine(r) {
|
|
201
|
+
// 36-char label so the status column lines up. Names are short
|
|
202
|
+
// (kebab-case identifiers); long ones wrap rather than corrupting layout.
|
|
203
|
+
const label = `${r.name}@${r.version}`.padEnd(36);
|
|
204
|
+
const origin = `(${r.origin})`.padEnd(11);
|
|
205
|
+
const duration = `${r.durationMs}ms`.padStart(6);
|
|
206
|
+
if (r.status === 'ok') {
|
|
207
|
+
const rules = r.ruleCount !== null ? `${String(r.ruleCount).padStart(4)} rules` : ' ';
|
|
208
|
+
console.log(` ${chalk.green('✅')} ${label} ${chalk.dim(origin)} ${rules} ${chalk.dim(duration)}`);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
console.log(` ${chalk.red('❌')} ${label} ${chalk.dim(origin)} ${chalk.red('FAILED'.padStart(10))} ${chalk.dim(duration)}`);
|
|
212
|
+
if (r.error) {
|
|
213
|
+
const indent = ' ';
|
|
214
|
+
for (const line of r.error.message.split('\n')) {
|
|
215
|
+
console.log(`${indent}${chalk.red(line)}`);
|
|
216
|
+
}
|
|
217
|
+
if (r.error.hint) {
|
|
218
|
+
const hintLines = r.error.hint.split('\n');
|
|
219
|
+
console.log(` ${chalk.yellow('→ Hint:')} ${hintLines[0]}`);
|
|
220
|
+
for (const line of hintLines.slice(1)) {
|
|
221
|
+
console.log(`${indent}${chalk.yellow(line)}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../../src/cli/commands/rulesets/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/rulesets/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/rulesets/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,sCAAsC;AAEtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `spectify rulesets view` - List available rulesets or view details of one.
|
|
3
|
+
*
|
|
4
|
+
* This command goes through the HTTP API (auto-starting an embedded
|
|
5
|
+
* orchestrator when needed) so that what is displayed matches what a remote
|
|
6
|
+
* client would see. For an in-process load-only validation that does not
|
|
7
|
+
* spin up a server, see `check.ts`.
|
|
8
|
+
*/
|
|
9
|
+
export interface ViewRulesetsOptions {
|
|
10
|
+
apiUrl?: string;
|
|
11
|
+
format?: 'table' | 'json';
|
|
12
|
+
name?: string;
|
|
13
|
+
version?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function viewRulesetsCommand(options: ViewRulesetsOptions): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/rulesets/view.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsFrF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `spectify rulesets view` - List available rulesets or view details of one.
|
|
3
|
+
*
|
|
4
|
+
* This command goes through the HTTP API (auto-starting an embedded
|
|
5
|
+
* orchestrator when needed) so that what is displayed matches what a remote
|
|
6
|
+
* client would see. For an in-process load-only validation that does not
|
|
7
|
+
* spin up a server, see `check.ts`.
|
|
8
|
+
*/
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import ora from 'ora';
|
|
11
|
+
import Table from 'cli-table3';
|
|
12
|
+
import { SpectifyAPIClient } from '../../api-client.js';
|
|
13
|
+
import { formatRulesetsTable, formatSeverity } from '../../formatters.js';
|
|
14
|
+
import { maybeStartEmbeddedServer, getApiUrl } from '../../utils/embedded-server.js';
|
|
15
|
+
import { handleCommandError } from '../../utils/connection-error.js';
|
|
16
|
+
export async function viewRulesetsCommand(options) {
|
|
17
|
+
// Auto-start embedded server if needed
|
|
18
|
+
const shutdownServer = await maybeStartEmbeddedServer(options.apiUrl);
|
|
19
|
+
let spinner;
|
|
20
|
+
try {
|
|
21
|
+
const apiUrl = await getApiUrl(options.apiUrl);
|
|
22
|
+
const client = new SpectifyAPIClient(apiUrl);
|
|
23
|
+
// If name is provided, show details for that ruleset
|
|
24
|
+
if (options.name) {
|
|
25
|
+
spinner = ora(`Fetching details for ruleset '${options.name}'...`).start();
|
|
26
|
+
const details = await client.getRulesetDetails(options.name, options.version);
|
|
27
|
+
spinner.succeed(`Found ruleset '${options.name}'`);
|
|
28
|
+
spinner = undefined;
|
|
29
|
+
if (options.format === 'json') {
|
|
30
|
+
console.log(JSON.stringify(details, null, 2));
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// Format as human-readable text
|
|
34
|
+
console.log('');
|
|
35
|
+
console.log(chalk.bold.cyan(`${details.displayName} (${details.name})`));
|
|
36
|
+
console.log(chalk.dim('─'.repeat(60)));
|
|
37
|
+
console.log(`Version: ${details.version}`);
|
|
38
|
+
console.log(`Category: ${details.category}`);
|
|
39
|
+
console.log(`Rules: ${details.ruleCount}`);
|
|
40
|
+
if (details.releaseDate) {
|
|
41
|
+
console.log(`Released: ${details.releaseDate}`);
|
|
42
|
+
}
|
|
43
|
+
if (details.tags && details.tags.length > 0) {
|
|
44
|
+
console.log(`Tags: ${details.tags.join(', ')}`);
|
|
45
|
+
}
|
|
46
|
+
console.log('');
|
|
47
|
+
console.log(chalk.bold('Description:'));
|
|
48
|
+
console.log(details.description);
|
|
49
|
+
console.log('');
|
|
50
|
+
// Display rules in a table
|
|
51
|
+
console.log(chalk.bold('Rules:'));
|
|
52
|
+
const table = new Table({
|
|
53
|
+
head: [
|
|
54
|
+
chalk.bold('#'),
|
|
55
|
+
chalk.bold('Rule Name'),
|
|
56
|
+
chalk.bold('Severity'),
|
|
57
|
+
chalk.bold('Description'),
|
|
58
|
+
],
|
|
59
|
+
colWidths: [5, 40, 12, 50],
|
|
60
|
+
wordWrap: true,
|
|
61
|
+
});
|
|
62
|
+
details.rules.forEach((rule, index) => {
|
|
63
|
+
table.push([
|
|
64
|
+
String(index + 1),
|
|
65
|
+
chalk.cyan(rule.name),
|
|
66
|
+
formatSeverity(rule.severity),
|
|
67
|
+
rule.description || rule.message || '-',
|
|
68
|
+
]);
|
|
69
|
+
});
|
|
70
|
+
console.log(table.toString());
|
|
71
|
+
console.log('');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// List all rulesets
|
|
76
|
+
spinner = ora('Fetching rulesets...').start();
|
|
77
|
+
const rulesets = await client.getRulesets();
|
|
78
|
+
spinner.succeed(`Found ${rulesets.length} rulesets`);
|
|
79
|
+
spinner = undefined;
|
|
80
|
+
if (options.format === 'json') {
|
|
81
|
+
console.log(JSON.stringify(rulesets, null, 2));
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
console.log(chalk.bold('\nAvailable Rulesets\n'));
|
|
85
|
+
console.log(formatRulesetsTable(rulesets));
|
|
86
|
+
console.log(chalk.dim('Use `spectify rulesets <name>` to view detailed rules\n'));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
await handleCommandError(error);
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
// Shutdown embedded server if we started it
|
|
95
|
+
if (shutdownServer) {
|
|
96
|
+
await shutdownServer();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../../../src/cli/commands/rulesets/view.ts"],"names":[],"mappings":"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"}
|