@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":"history.js","sourceRoot":"","sources":["../../../src/cli/commands/history.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAStD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC1D,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;QAE5C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,gBAAgB;YAChB,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,sBAAsB;QACtB,IAAI,OAAO,CAAC;QACZ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8BAA8B,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;gBAC1E,OAAO;YACT,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAChE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iCAAiC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;gBAChF,OAAO;YACT,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YAClC,OAAO,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAC;YACvF,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;IACtF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Jobs command - List recent lint jobs
3
+ */
4
+ export interface JobsOptions {
5
+ status?: string;
6
+ ruleset?: string;
7
+ limit?: number;
8
+ detailed?: boolean;
9
+ json?: boolean;
10
+ }
11
+ export declare function jobsCommand(options: JobsOptions): Promise<void>;
12
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/jobs.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiFrE"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Jobs command - List recent lint jobs
3
+ */
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { SpectifyAPIClient, ConnectionError } from '../api-client.js';
7
+ import { formatJobsTable } from '../formatters.js';
8
+ import { getConfigManager } from '../config-manager.js';
9
+ import { getApiUrl } from '../utils/embedded-server.js';
10
+ export async function jobsCommand(options) {
11
+ try {
12
+ // Check if in embedded mode - jobs command requires standalone/companion
13
+ const configManager = getConfigManager();
14
+ const config = await configManager.get();
15
+ if (config.defaultMode === 'embedded') {
16
+ console.log(chalk.yellow('āš ļø Jobs listing requires standalone or companion mode\n'));
17
+ console.log(chalk.dim('Embedded mode does not persist jobs across commands.'));
18
+ console.log(chalk.dim('Switch to standalone mode for job history:\n'));
19
+ console.log(chalk.bold(' spectify config set mode standalone'));
20
+ console.log(chalk.bold(' spectifyd # Start daemon in separate terminal\n'));
21
+ console.log(chalk.dim('Then use "spectify jobs" to list jobs.\n'));
22
+ process.exit(1);
23
+ }
24
+ // Get API URL based on configured mode
25
+ const apiUrl = await getApiUrl();
26
+ const client = new SpectifyAPIClient(apiUrl);
27
+ // Build query parameters
28
+ const queryParams = {};
29
+ if (options.status) {
30
+ queryParams.status = options.status;
31
+ }
32
+ if (options.ruleset) {
33
+ queryParams.rulesetName = options.ruleset;
34
+ }
35
+ if (options.limit) {
36
+ queryParams.limit = options.limit.toString();
37
+ }
38
+ else {
39
+ queryParams.limit = '20'; // Default limit
40
+ }
41
+ queryParams.sortBy = 'timestamp';
42
+ queryParams.sortOrder = 'desc';
43
+ // Fetch jobs
44
+ const spinner = ora('Fetching jobs...').start();
45
+ let response;
46
+ try {
47
+ if (options.detailed) {
48
+ response = await client.listJobsDetailed(queryParams);
49
+ }
50
+ else {
51
+ response = await client.listJobs(queryParams);
52
+ }
53
+ spinner.succeed('Jobs retrieved');
54
+ }
55
+ catch (error) {
56
+ if (error instanceof ConnectionError)
57
+ throw error;
58
+ process.exit(1);
59
+ }
60
+ // Display results
61
+ if (options.json) {
62
+ console.log(JSON.stringify(response, null, 2));
63
+ return;
64
+ }
65
+ if (response.jobs.length === 0) {
66
+ console.log(chalk.dim('\nNo jobs found.\n'));
67
+ console.log(chalk.dim('Run `spectify lint <file>` to analyze an OpenAPI document.\n'));
68
+ return;
69
+ }
70
+ console.log(chalk.bold(`\nLint Jobs (${response.jobs.length} of ${response.pagination.total})\n`));
71
+ console.log(formatJobsTable(response.jobs, options.detailed || false));
72
+ // Show pagination info if there are more results
73
+ if (response.pagination.hasMore) {
74
+ const currentEnd = response.pagination.offset + response.jobs.length;
75
+ console.log(chalk.dim(`\nShowing ${response.jobs.length} jobs (${response.pagination.offset + 1}-${currentEnd} of ${response.pagination.total})`));
76
+ console.log(chalk.dim('Use --limit option to show more results.\n'));
77
+ }
78
+ console.log(chalk.dim(`Use 'spectify results <jobId>' to view detailed results\n`));
79
+ }
80
+ catch (error) {
81
+ throw error;
82
+ }
83
+ }
84
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../../src/cli/commands/jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Lint command - Submit documents for linting
3
+ */
4
+ export interface LintOptions {
5
+ ruleset?: string;
6
+ version?: string;
7
+ apiUrl?: string;
8
+ noCache?: boolean;
9
+ showAll?: boolean;
10
+ override?: string[];
11
+ /** Progress display interval in seconds (default: 5). Only applies to multi-ruleset runs. */
12
+ pollInterval?: number;
13
+ }
14
+ export declare function lintCommand(filePath: string, options: LintOptions): Promise<void>;
15
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/lint.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,6FAA6F;IAC7F,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuYvF"}
@@ -0,0 +1,384 @@
1
+ /**
2
+ * Lint command - Submit documents for linting
3
+ */
4
+ import fs from 'fs/promises';
5
+ import path from 'path';
6
+ import chalk from 'chalk';
7
+ import ora from 'ora';
8
+ import { SpectifyAPIClient } from '../api-client.js';
9
+ import { HistoryManager } from '../history-manager.js';
10
+ import { formatSummary, formatIssuesTable } from '../formatters.js';
11
+ import { maybeStartEmbeddedServer, getApiUrl } from '../utils/embedded-server.js';
12
+ export async function lintCommand(filePath, options) {
13
+ // Auto-start embedded server if needed (BEFORE getting API URL)
14
+ const shutdownServer = await maybeStartEmbeddedServer(options.apiUrl);
15
+ let exitCode = 0; // Track exit code to return after cleanup
16
+ try {
17
+ // Resolve file path
18
+ const resolvedPath = path.resolve(filePath);
19
+ // Read and validate file
20
+ const spinner = ora('Reading document...').start();
21
+ let content;
22
+ try {
23
+ content = await fs.readFile(resolvedPath, 'utf-8');
24
+ }
25
+ catch (error) {
26
+ spinner.fail(`File not found: ${filePath}`);
27
+ exitCode = 1;
28
+ return;
29
+ }
30
+ // Parse to validate the document is YAML or JSON
31
+ try {
32
+ if (filePath.endsWith('.yaml') || filePath.endsWith('.yml')) {
33
+ const yaml = await import('yaml');
34
+ yaml.parse(content);
35
+ }
36
+ else {
37
+ JSON.parse(content);
38
+ }
39
+ }
40
+ catch (error) {
41
+ spinner.fail('Invalid document format (only YAML and JSON are supported');
42
+ console.error(chalk.red(`Parse error: ${error instanceof Error ? error.message : String(error)}`));
43
+ exitCode = 1;
44
+ return;
45
+ }
46
+ spinner.succeed('Document loaded successfully');
47
+ // Create API client with correct URL for current mode (AFTER server is started)
48
+ const apiUrl = await getApiUrl(options.apiUrl);
49
+ const client = new SpectifyAPIClient(apiUrl);
50
+ // Upload document first (standalone mode)
51
+ const uploadSpinner = ora('Uploading document...').start();
52
+ let documentId;
53
+ try {
54
+ const format = (filePath.endsWith('.yaml') || filePath.endsWith('.yml')) ? 'yaml' : 'json';
55
+ const uploadResponse = await client.uploadDocument({
56
+ content,
57
+ format,
58
+ metadata: {
59
+ fileName: path.basename(resolvedPath),
60
+ source: 'cli'
61
+ }
62
+ });
63
+ documentId = uploadResponse.documentId;
64
+ uploadSpinner.succeed(`Document uploaded: ${chalk.dim(documentId.slice(0, 12))}...`);
65
+ }
66
+ catch (error) {
67
+ uploadSpinner.fail('Failed to upload document');
68
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
69
+ exitCode = 1;
70
+ return;
71
+ }
72
+ // Determine rulesets to run
73
+ let rulesetNames;
74
+ if (options.ruleset) {
75
+ // Parse comma-separated rulesets
76
+ rulesetNames = options.ruleset.split(',').map(r => r.trim()).filter(r => r.length > 0);
77
+ if (rulesetNames.length === 0) {
78
+ console.error(chalk.red('Invalid ruleset specification'));
79
+ exitCode = 1;
80
+ return;
81
+ }
82
+ }
83
+ else {
84
+ // TODO: Get default rulesets from CLI config (profiles)
85
+ // For now, fetch all available rulesets from server
86
+ try {
87
+ const catalog = await client.getRulesets();
88
+ rulesetNames = catalog.map(r => r.name);
89
+ console.log(chalk.dim(`Running all available rulesets: ${rulesetNames.join(', ')}`));
90
+ }
91
+ catch (error) {
92
+ console.error(chalk.red('Failed to fetch rulesets from server'));
93
+ exitCode = 1;
94
+ return;
95
+ }
96
+ }
97
+ const rulesetVersion = options.version;
98
+ // Parse --override flag into ruleOverrides map
99
+ // Supports both repeated flags (--override a=off --override b=warn) and comma-separated (--override a=off,b=warn)
100
+ let ruleOverrides;
101
+ if (options.override && options.override.length > 0) {
102
+ ruleOverrides = {};
103
+ const validSeverities = new Set(['off', 'error', 'warn', 'info', 'hint']);
104
+ // Flatten: each array element may itself be comma-separated
105
+ const entries = options.override.flatMap(o => o.split(','));
106
+ for (const entry of entries) {
107
+ const trimmed = entry.trim();
108
+ if (!trimmed)
109
+ continue;
110
+ const eqIdx = trimmed.indexOf('=');
111
+ if (eqIdx === -1) {
112
+ // No '=' means disable (off)
113
+ ruleOverrides[trimmed] = 'off';
114
+ }
115
+ else {
116
+ const ruleId = trimmed.slice(0, eqIdx).trim();
117
+ const severity = trimmed.slice(eqIdx + 1).trim().toLowerCase();
118
+ if (!ruleId) {
119
+ console.error(chalk.red(`Invalid override: empty rule ID in "${trimmed}"`));
120
+ exitCode = 1;
121
+ return;
122
+ }
123
+ if (!validSeverities.has(severity)) {
124
+ console.error(chalk.red(`Invalid severity "${severity}" for rule "${ruleId}". Valid: off, error, warn, info, hint`));
125
+ exitCode = 1;
126
+ return;
127
+ }
128
+ ruleOverrides[ruleId] = severity;
129
+ }
130
+ }
131
+ if (Object.keys(ruleOverrides).length === 0) {
132
+ ruleOverrides = undefined;
133
+ }
134
+ }
135
+ // Submit lint jobs sequentially (one per ruleset)
136
+ console.log();
137
+ console.log(chalk.bold(`Submitting ${rulesetNames.length} lint job(s)...`));
138
+ const jobIds = [];
139
+ const jobDetails = [];
140
+ for (const rulesetName of rulesetNames) {
141
+ try {
142
+ const response = await client.submitLint({
143
+ documentId,
144
+ rulesetName,
145
+ rulesetVersion,
146
+ ruleOverrides,
147
+ });
148
+ jobIds.push(response.jobId);
149
+ jobDetails.push({ jobId: response.jobId, ruleset: rulesetName });
150
+ // Show minimal progress
151
+ console.log(chalk.green('āœ“') + ` ${rulesetName}: ${chalk.dim(response.jobId)}`);
152
+ }
153
+ catch (error) {
154
+ console.log(chalk.red('āœ—') + ` ${rulesetName}: ${chalk.red('Failed')}`);
155
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
156
+ exitCode = 1;
157
+ return;
158
+ }
159
+ }
160
+ console.log();
161
+ console.log(chalk.bold.green('āœ“ All jobs submitted successfully'));
162
+ console.log();
163
+ console.log(chalk.dim('To view results, use:'));
164
+ for (const { jobId, ruleset } of jobDetails) {
165
+ console.log(chalk.dim(` spectify results ${jobId}`) + chalk.dim.gray(` # ${ruleset}`));
166
+ }
167
+ // For single ruleset, show results immediately
168
+ if (jobIds.length === 1) {
169
+ console.log();
170
+ const pollSpinner = ora('Analyzing document...').start();
171
+ try {
172
+ await client.pollJobUntilComplete(jobIds[0], {
173
+ interval: 1000,
174
+ timeout: 300000,
175
+ onProgress: (status) => {
176
+ if (status.progress) {
177
+ const percent = Math.round((status.progress.completed / status.progress.total) * 100);
178
+ pollSpinner.text = `Analyzing document... ${percent}%`;
179
+ if (status.progress.currentRule) {
180
+ pollSpinner.text += ` (${status.progress.currentRule})`;
181
+ }
182
+ }
183
+ },
184
+ });
185
+ pollSpinner.succeed('Analysis complete');
186
+ }
187
+ catch (error) {
188
+ pollSpinner.fail('Analysis failed');
189
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
190
+ exitCode = 1;
191
+ return;
192
+ }
193
+ // Get and display results
194
+ const results = await client.getJobResults(jobIds[0]);
195
+ // Save to history
196
+ try {
197
+ const historyManager = new HistoryManager();
198
+ const entry = HistoryManager.createEntry(results, resolvedPath);
199
+ const serverUrl = client.getServerUrl();
200
+ const sessionId = client.getSessionId() || 'unknown';
201
+ await historyManager.addEntry(entry, serverUrl, sessionId);
202
+ }
203
+ catch (error) {
204
+ // Non-fatal: continue even if history save fails
205
+ console.warn(chalk.yellow('Warning: Failed to save to history'));
206
+ }
207
+ // Display results
208
+ console.log(formatSummary(results));
209
+ // Display issues
210
+ if (results.results && results.results.length > 0) {
211
+ const issueLimit = options.showAll ? undefined : 20;
212
+ console.log(formatIssuesTable(results.results, issueLimit));
213
+ }
214
+ // Exit with appropriate code
215
+ if (results.summary.errorCount > 0) {
216
+ exitCode = 1;
217
+ }
218
+ }
219
+ else {
220
+ // Multiple rulesets - wait for all jobs to complete and save consolidated results to history
221
+ console.log();
222
+ const pollSpinner = ora('Waiting for all jobs to complete...').start();
223
+ // Track per-job statuses for progress display
224
+ const TERMINAL_STATUSES = new Set(['completed', 'completed_with_errors', 'failed', 'timeout']);
225
+ const jobStatuses = new Map();
226
+ const progressIntervalMs = (options.pollInterval ?? 5) * 1000;
227
+ const pollTimeoutMs = 300000;
228
+ const pollStartTime = Date.now();
229
+ let lastProgressTime = pollStartTime;
230
+ try {
231
+ // Poll all jobs, showing progress at configurable intervals
232
+ while (true) {
233
+ const pending = jobDetails.filter(j => !TERMINAL_STATUSES.has(jobStatuses.get(j.jobId) ?? ''));
234
+ if (pending.length === 0)
235
+ break;
236
+ if (Date.now() - pollStartTime > pollTimeoutMs) {
237
+ throw new Error(`Timeout: ${pending.map(j => j.ruleset).join(', ')} still pending after ${pollTimeoutMs / 60000} minutes`);
238
+ }
239
+ // Poll each pending job
240
+ for (const { jobId } of pending) {
241
+ try {
242
+ const status = await client.getJobStatus(jobId);
243
+ jobStatuses.set(jobId, status.status);
244
+ }
245
+ catch {
246
+ // will retry next cycle
247
+ }
248
+ }
249
+ const doneCount = jobDetails.filter(j => TERMINAL_STATUSES.has(jobStatuses.get(j.jobId) ?? '')).length;
250
+ pollSpinner.text = `Waiting for all jobs to complete... [${doneCount}/${jobDetails.length}]`;
251
+ if (doneCount === jobDetails.length)
252
+ break;
253
+ // Show detailed progress at configurable intervals
254
+ const now = Date.now();
255
+ if (now - lastProgressTime >= progressIntervalMs) {
256
+ lastProgressTime = now;
257
+ const elapsed = Math.round((now - pollStartTime) / 1000);
258
+ pollSpinner.stop();
259
+ console.log(chalk.dim(`[${elapsed}s] ${doneCount}/${jobDetails.length} jobs done:`));
260
+ for (const { jobId, ruleset } of jobDetails) {
261
+ const status = jobStatuses.get(jobId) ?? 'queued';
262
+ const isDone = TERMINAL_STATUSES.has(status);
263
+ const icon = isDone ? chalk.green('āœ“') : chalk.yellow('⋯');
264
+ console.log(` ${icon} ${chalk.cyan(ruleset)} ${chalk.dim(`(${status})`)}`);
265
+ }
266
+ pollSpinner.start(`Waiting for all jobs to complete... [${doneCount}/${jobDetails.length}]`);
267
+ }
268
+ await new Promise(resolve => setTimeout(resolve, 2000));
269
+ }
270
+ pollSpinner.succeed('All analyses complete');
271
+ // Warn about any jobs that completed with errors (rule execution failures)
272
+ for (const { jobId, ruleset } of jobDetails) {
273
+ if (jobStatuses.get(jobId) === 'completed_with_errors') {
274
+ console.warn(chalk.yellow(` āš ļø ${ruleset}: some rules failed to execute (see server logs for details)`));
275
+ }
276
+ }
277
+ // Fetch results and save to history
278
+ const historyManager = new HistoryManager();
279
+ const serverUrl = client.getServerUrl();
280
+ const sessionId = client.getSessionId() || 'unknown';
281
+ for (const { jobId, ruleset } of jobDetails) {
282
+ try {
283
+ const results = await client.getJobResults(jobId);
284
+ const entry = HistoryManager.createEntry(results, resolvedPath);
285
+ await historyManager.addEntry(entry, serverUrl, sessionId);
286
+ }
287
+ catch (error) {
288
+ // If individual result fetch fails, save minimal entry
289
+ console.warn(chalk.yellow(`Warning: Failed to fetch results for ${ruleset}`));
290
+ await historyManager.addEntry({
291
+ jobId,
292
+ documentId,
293
+ filePath: resolvedPath,
294
+ rulesetName: ruleset,
295
+ rulesetVersion: 'unknown',
296
+ status: 'failed',
297
+ summary: {
298
+ totalIssues: 0,
299
+ errorCount: 0,
300
+ warningCount: 0,
301
+ infoCount: 0,
302
+ hintCount: 0,
303
+ },
304
+ }, serverUrl, sessionId);
305
+ }
306
+ }
307
+ // Show summary of all results
308
+ console.log();
309
+ console.log(chalk.bold('Summary of all rulesets:'));
310
+ let totalErrors = 0;
311
+ let totalWarnings = 0;
312
+ for (const { jobId, ruleset } of jobDetails) {
313
+ try {
314
+ const results = await client.getJobResults(jobId);
315
+ const { errorCount, warningCount } = results.summary;
316
+ totalErrors += errorCount;
317
+ totalWarnings += warningCount;
318
+ const status = errorCount === 0 && warningCount === 0
319
+ ? chalk.green('āœ“ No issues')
320
+ : `${chalk.red(`${errorCount}E`)} ${chalk.yellow(`${warningCount}W`)}`;
321
+ console.log(` ${chalk.cyan(ruleset)}: ${status}`);
322
+ }
323
+ catch (error) {
324
+ console.log(` ${chalk.cyan(ruleset)}: ${chalk.red('Failed')}`);
325
+ }
326
+ }
327
+ console.log();
328
+ console.log(chalk.bold(`Total: ${chalk.red(`${totalErrors} errors`)}, ${chalk.yellow(`${totalWarnings} warnings`)}`));
329
+ // Exit with appropriate code if any errors found
330
+ if (totalErrors > 0) {
331
+ exitCode = 1;
332
+ }
333
+ }
334
+ catch (error) {
335
+ pollSpinner.fail('Analysis failed');
336
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
337
+ // Still try to save history entries even if polling failed
338
+ try {
339
+ const historyManager = new HistoryManager();
340
+ const serverUrl = client.getServerUrl();
341
+ const sessionId = client.getSessionId() || 'unknown';
342
+ for (const { jobId, ruleset } of jobDetails) {
343
+ const status = await client.getJobStatus(jobId);
344
+ await historyManager.addEntry({
345
+ jobId,
346
+ documentId,
347
+ filePath: resolvedPath,
348
+ rulesetName: ruleset,
349
+ rulesetVersion: 'unknown',
350
+ status: status.status === 'completed' ? 'completed' : 'failed',
351
+ summary: {
352
+ totalIssues: 0,
353
+ errorCount: 0,
354
+ warningCount: 0,
355
+ infoCount: 0,
356
+ hintCount: 0,
357
+ },
358
+ }, serverUrl, sessionId);
359
+ }
360
+ }
361
+ catch (historyError) {
362
+ // Non-fatal: continue even if history save fails
363
+ console.warn(chalk.yellow('Warning: Failed to save to history'));
364
+ }
365
+ exitCode = 1;
366
+ }
367
+ }
368
+ }
369
+ catch (error) {
370
+ console.error(chalk.red('Unexpected error:'), error);
371
+ exitCode = 1;
372
+ }
373
+ finally {
374
+ // Shutdown embedded server if we started it
375
+ if (shutdownServer) {
376
+ await shutdownServer();
377
+ }
378
+ // Exit with tracked code
379
+ if (exitCode !== 0) {
380
+ process.exit(exitCode);
381
+ }
382
+ }
383
+ }
384
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../../src/cli/commands/lint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * PS Command - List running orchestrator processes
3
+ */
4
+ export interface PsOptions {
5
+ format?: 'table' | 'json';
6
+ }
7
+ export declare function psCommand(options?: PsOptions): Promise<void>;
8
+ //# sourceMappingURL=ps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ps.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ps.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC3B;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,SAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDtE"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * PS Command - List running orchestrator processes
3
+ */
4
+ import chalk from 'chalk';
5
+ import Table from 'cli-table3';
6
+ import { getConfigManager } from '../config-manager.js';
7
+ export async function psCommand(options = {}) {
8
+ const configManager = getConfigManager();
9
+ try {
10
+ const processes = await configManager.getAllProcesses();
11
+ if (options.format === 'json') {
12
+ console.log(JSON.stringify(processes, null, 2));
13
+ return;
14
+ }
15
+ // Table format
16
+ if (processes.length === 0) {
17
+ console.log(chalk.yellow('\nšŸ“‹ No orchestrator processes running\n'));
18
+ console.log(chalk.dim(' Start a process: spectify start --daemon\n'));
19
+ return;
20
+ }
21
+ console.log(chalk.bold('\nšŸ“‹ Running orchestrator processes\n'));
22
+ const table = new Table({
23
+ head: ['Mode', 'PID', 'Port', 'Started', 'Uptime'],
24
+ style: {
25
+ head: ['cyan'],
26
+ },
27
+ });
28
+ for (const proc of processes) {
29
+ const uptime = formatUptime(Date.now() - new Date(proc.startedAt).getTime());
30
+ const startedAt = new Date(proc.startedAt).toLocaleString();
31
+ table.push([
32
+ proc.mode,
33
+ proc.pid.toString(),
34
+ proc.port.toString(),
35
+ startedAt,
36
+ uptime,
37
+ ]);
38
+ }
39
+ console.log(table.toString());
40
+ console.log();
41
+ // Show helpful commands
42
+ console.log(chalk.dim('Commands:'));
43
+ console.log(chalk.dim(' spectify stop --mode <mode> Stop by mode'));
44
+ console.log(chalk.dim(' spectify stop --port <port> Stop by port'));
45
+ console.log(chalk.dim(' spectify stop --all Stop all'));
46
+ console.log();
47
+ }
48
+ catch (error) {
49
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
50
+ process.exit(1);
51
+ }
52
+ }
53
+ /**
54
+ * Format uptime in human-readable format
55
+ */
56
+ function formatUptime(milliseconds) {
57
+ const seconds = Math.floor(milliseconds / 1000);
58
+ const minutes = Math.floor(seconds / 60);
59
+ const hours = Math.floor(minutes / 60);
60
+ const days = Math.floor(hours / 24);
61
+ if (days > 0) {
62
+ return `${days}d ${hours % 24}h`;
63
+ }
64
+ else if (hours > 0) {
65
+ return `${hours}h ${minutes % 60}m`;
66
+ }
67
+ else if (minutes > 0) {
68
+ return `${minutes}m ${seconds % 60}s`;
69
+ }
70
+ else {
71
+ return `${seconds}s`;
72
+ }
73
+ }
74
+ //# sourceMappingURL=ps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ps.js","sourceRoot":"","sources":["../../../src/cli/commands/ps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Reproduce command - Generate Spectral CLI reproduction instructions for a lint job
3
+ */
4
+ export interface ReproduceOptions {
5
+ apiUrl?: string;
6
+ output?: string;
7
+ }
8
+ export declare function reproduceCommand(jobId: string, options: ReproduceOptions): Promise<void>;
9
+ //# sourceMappingURL=reproduce.d.ts.map