@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.
Files changed (197) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/README.md +43 -0
  4. package/build/cli/api-client.d.ts +170 -0
  5. package/build/cli/api-client.d.ts.map +1 -0
  6. package/build/cli/api-client.js +284 -0
  7. package/build/cli/api-client.js.map +1 -0
  8. package/build/cli/commands/agents.d.ts +7 -0
  9. package/build/cli/commands/agents.d.ts.map +1 -0
  10. package/build/cli/commands/agents.js +694 -0
  11. package/build/cli/commands/agents.js.map +1 -0
  12. package/build/cli/commands/completion.d.ts +9 -0
  13. package/build/cli/commands/completion.d.ts.map +1 -0
  14. package/build/cli/commands/completion.js +177 -0
  15. package/build/cli/commands/completion.js.map +1 -0
  16. package/build/cli/commands/config.d.ts +10 -0
  17. package/build/cli/commands/config.d.ts.map +1 -0
  18. package/build/cli/commands/config.js +284 -0
  19. package/build/cli/commands/config.js.map +1 -0
  20. package/build/cli/commands/health.d.ts +11 -0
  21. package/build/cli/commands/health.d.ts.map +1 -0
  22. package/build/cli/commands/health.js +38 -0
  23. package/build/cli/commands/health.js.map +1 -0
  24. package/build/cli/commands/help.d.ts +6 -0
  25. package/build/cli/commands/help.d.ts.map +1 -0
  26. package/build/cli/commands/help.js +20 -0
  27. package/build/cli/commands/help.js.map +1 -0
  28. package/build/cli/commands/history.d.ts +11 -0
  29. package/build/cli/commands/history.d.ts.map +1 -0
  30. package/build/cli/commands/history.js +50 -0
  31. package/build/cli/commands/history.js.map +1 -0
  32. package/build/cli/commands/jobs.d.ts +12 -0
  33. package/build/cli/commands/jobs.d.ts.map +1 -0
  34. package/build/cli/commands/jobs.js +84 -0
  35. package/build/cli/commands/jobs.js.map +1 -0
  36. package/build/cli/commands/lint.d.ts +15 -0
  37. package/build/cli/commands/lint.d.ts.map +1 -0
  38. package/build/cli/commands/lint.js +384 -0
  39. package/build/cli/commands/lint.js.map +1 -0
  40. package/build/cli/commands/ps.d.ts +8 -0
  41. package/build/cli/commands/ps.d.ts.map +1 -0
  42. package/build/cli/commands/ps.js +74 -0
  43. package/build/cli/commands/ps.js.map +1 -0
  44. package/build/cli/commands/reproduce.d.ts +9 -0
  45. package/build/cli/commands/reproduce.d.ts.map +1 -0
  46. package/build/cli/commands/reproduce.js +31 -0
  47. package/build/cli/commands/reproduce.js.map +1 -0
  48. package/build/cli/commands/reset.d.ts +5 -0
  49. package/build/cli/commands/reset.d.ts.map +1 -0
  50. package/build/cli/commands/reset.js +13 -0
  51. package/build/cli/commands/reset.js.map +1 -0
  52. package/build/cli/commands/results.d.ts +13 -0
  53. package/build/cli/commands/results.d.ts.map +1 -0
  54. package/build/cli/commands/results.js +129 -0
  55. package/build/cli/commands/results.js.map +1 -0
  56. package/build/cli/commands/rulesets/check.d.ts +12 -0
  57. package/build/cli/commands/rulesets/check.d.ts.map +1 -0
  58. package/build/cli/commands/rulesets/check.js +226 -0
  59. package/build/cli/commands/rulesets/check.js.map +1 -0
  60. package/build/cli/commands/rulesets/index.d.ts +5 -0
  61. package/build/cli/commands/rulesets/index.d.ts.map +1 -0
  62. package/build/cli/commands/rulesets/index.js +6 -0
  63. package/build/cli/commands/rulesets/index.js.map +1 -0
  64. package/build/cli/commands/rulesets/view.d.ts +16 -0
  65. package/build/cli/commands/rulesets/view.d.ts.map +1 -0
  66. package/build/cli/commands/rulesets/view.js +100 -0
  67. package/build/cli/commands/rulesets/view.js.map +1 -0
  68. package/build/cli/commands/start.d.ts +16 -0
  69. package/build/cli/commands/start.d.ts.map +1 -0
  70. package/build/cli/commands/start.js +167 -0
  71. package/build/cli/commands/start.js.map +1 -0
  72. package/build/cli/commands/status.d.ts +9 -0
  73. package/build/cli/commands/status.d.ts.map +1 -0
  74. package/build/cli/commands/status.js +46 -0
  75. package/build/cli/commands/status.js.map +1 -0
  76. package/build/cli/commands/stop.d.ts +11 -0
  77. package/build/cli/commands/stop.d.ts.map +1 -0
  78. package/build/cli/commands/stop.js +78 -0
  79. package/build/cli/commands/stop.js.map +1 -0
  80. package/build/cli/config-manager.d.ts +134 -0
  81. package/build/cli/config-manager.d.ts.map +1 -0
  82. package/build/cli/config-manager.js +288 -0
  83. package/build/cli/config-manager.js.map +1 -0
  84. package/build/cli/formatters.d.ts +62 -0
  85. package/build/cli/formatters.d.ts.map +1 -0
  86. package/build/cli/formatters.js +715 -0
  87. package/build/cli/formatters.js.map +1 -0
  88. package/build/cli/history-manager.d.ts +97 -0
  89. package/build/cli/history-manager.d.ts.map +1 -0
  90. package/build/cli/history-manager.js +201 -0
  91. package/build/cli/history-manager.js.map +1 -0
  92. package/build/cli/index.d.ts +16 -0
  93. package/build/cli/index.d.ts.map +1 -0
  94. package/build/cli/index.js +335 -0
  95. package/build/cli/index.js.map +1 -0
  96. package/build/cli/list-rulesets.d.ts +15 -0
  97. package/build/cli/list-rulesets.d.ts.map +1 -0
  98. package/build/cli/list-rulesets.js +193 -0
  99. package/build/cli/list-rulesets.js.map +1 -0
  100. package/build/cli/utils/connection-error.d.ts +9 -0
  101. package/build/cli/utils/connection-error.d.ts.map +1 -0
  102. package/build/cli/utils/connection-error.js +30 -0
  103. package/build/cli/utils/connection-error.js.map +1 -0
  104. package/build/cli/utils/embedded-server.d.ts +21 -0
  105. package/build/cli/utils/embedded-server.d.ts.map +1 -0
  106. package/build/cli/utils/embedded-server.js +61 -0
  107. package/build/cli/utils/embedded-server.js.map +1 -0
  108. package/build/cli/utils/mode-validator.d.ts +13 -0
  109. package/build/cli/utils/mode-validator.d.ts.map +1 -0
  110. package/build/cli/utils/mode-validator.js +31 -0
  111. package/build/cli/utils/mode-validator.js.map +1 -0
  112. package/build/cli/utils/port-checker.d.ts +20 -0
  113. package/build/cli/utils/port-checker.d.ts.map +1 -0
  114. package/build/cli/utils/port-checker.js +49 -0
  115. package/build/cli/utils/port-checker.js.map +1 -0
  116. package/build/config.d.ts +57 -0
  117. package/build/config.d.ts.map +1 -0
  118. package/build/config.js +527 -0
  119. package/build/config.js.map +1 -0
  120. package/build/document-accessor.d.ts +79 -0
  121. package/build/document-accessor.d.ts.map +1 -0
  122. package/build/document-accessor.js +148 -0
  123. package/build/document-accessor.js.map +1 -0
  124. package/build/formatters/reproduce-markdown.d.ts +14 -0
  125. package/build/formatters/reproduce-markdown.d.ts.map +1 -0
  126. package/build/formatters/reproduce-markdown.js +182 -0
  127. package/build/formatters/reproduce-markdown.js.map +1 -0
  128. package/build/formatters/sarif-builder.d.ts +86 -0
  129. package/build/formatters/sarif-builder.d.ts.map +1 -0
  130. package/build/formatters/sarif-builder.js +276 -0
  131. package/build/formatters/sarif-builder.js.map +1 -0
  132. package/build/index.d.ts +3 -0
  133. package/build/index.d.ts.map +1 -0
  134. package/build/index.js +174 -0
  135. package/build/index.js.map +1 -0
  136. package/build/logger.d.ts +38 -0
  137. package/build/logger.d.ts.map +1 -0
  138. package/build/logger.js +105 -0
  139. package/build/logger.js.map +1 -0
  140. package/build/mock-server.d.ts +2 -0
  141. package/build/mock-server.d.ts.map +1 -0
  142. package/build/mock-server.js +290 -0
  143. package/build/mock-server.js.map +1 -0
  144. package/build/orchestrator.d.ts +149 -0
  145. package/build/orchestrator.d.ts.map +1 -0
  146. package/build/orchestrator.js +874 -0
  147. package/build/orchestrator.js.map +1 -0
  148. package/build/ruleset-loader.d.ts +79 -0
  149. package/build/ruleset-loader.d.ts.map +1 -0
  150. package/build/ruleset-loader.js +514 -0
  151. package/build/ruleset-loader.js.map +1 -0
  152. package/build/schemas.d.ts +2568 -0
  153. package/build/schemas.d.ts.map +1 -0
  154. package/build/schemas.js +674 -0
  155. package/build/schemas.js.map +1 -0
  156. package/build/server.d.ts +39 -0
  157. package/build/server.d.ts.map +1 -0
  158. package/build/server.js +834 -0
  159. package/build/server.js.map +1 -0
  160. package/build/storage/memory-storage.d.ts +190 -0
  161. package/build/storage/memory-storage.d.ts.map +1 -0
  162. package/build/storage/memory-storage.js +629 -0
  163. package/build/storage/memory-storage.js.map +1 -0
  164. package/build/storage/redis-storage.d.ts +134 -0
  165. package/build/storage/redis-storage.d.ts.map +1 -0
  166. package/build/storage/redis-storage.js +236 -0
  167. package/build/storage/redis-storage.js.map +1 -0
  168. package/build/storage/storage-adapter.d.ts +189 -0
  169. package/build/storage/storage-adapter.d.ts.map +1 -0
  170. package/build/storage/storage-adapter.js +36 -0
  171. package/build/storage/storage-adapter.js.map +1 -0
  172. package/build/types.d.ts +981 -0
  173. package/build/types.d.ts.map +1 -0
  174. package/build/types.js +5 -0
  175. package/build/types.js.map +1 -0
  176. package/build/utils/version.d.ts +40 -0
  177. package/build/utils/version.d.ts.map +1 -0
  178. package/build/utils/version.js +94 -0
  179. package/build/utils/version.js.map +1 -0
  180. package/build/validation.d.ts +95 -0
  181. package/build/validation.d.ts.map +1 -0
  182. package/build/validation.js +150 -0
  183. package/build/validation.js.map +1 -0
  184. package/build/worker-pool.d.ts +137 -0
  185. package/build/worker-pool.d.ts.map +1 -0
  186. package/build/worker-pool.js +549 -0
  187. package/build/worker-pool.js.map +1 -0
  188. package/build/worker.d.ts +2 -0
  189. package/build/worker.d.ts.map +1 -0
  190. package/build/worker.js +427 -0
  191. package/build/worker.js.map +1 -0
  192. package/package.json +110 -0
  193. package/rulesets/CHANGELOG.md +25 -0
  194. package/rulesets/config/rulesets.yaml +96 -0
  195. package/rulesets/sources/README.md +47 -0
  196. package/rulesets/sources/example/oas-recommended/v1.0.0/ruleset.yaml +6 -0
  197. 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,5 @@
1
+ /**
2
+ * Reset command - Reset terminal colors and formatting
3
+ */
4
+ export declare function resetCommand(): Promise<void>;
5
+ //# sourceMappingURL=reset.d.ts.map
@@ -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,5 @@
1
+ export { viewRulesetsCommand } from './view.js';
2
+ export type { ViewRulesetsOptions } from './view.js';
3
+ export { checkRulesetsCommand } from './check.js';
4
+ export type { CheckRulesetsOptions } from './check.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,6 @@
1
+ // Copyright 2026 Cisco Systems, Inc. and its affiliates
2
+ //
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ export { viewRulesetsCommand } from './view.js';
5
+ export { checkRulesetsCommand } from './check.js';
6
+ //# sourceMappingURL=index.js.map
@@ -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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"}