@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,16 @@
1
+ /**
2
+ * Start Command - Launch orchestrator server
3
+ */
4
+ import { SpectifyMode } from '../config-manager.js';
5
+ export interface StartOptions {
6
+ mode?: SpectifyMode;
7
+ config?: string;
8
+ port?: number;
9
+ host?: string;
10
+ documentStore?: string;
11
+ dev?: boolean;
12
+ interactive?: boolean;
13
+ daemon?: boolean;
14
+ }
15
+ export declare function startCommand(options?: StartOptions): Promise<void>;
16
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAoB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAMtE,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqL5E"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Start Command - Launch orchestrator server
3
+ */
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import inquirer from 'inquirer';
7
+ import { getConfigManager } from '../config-manager.js';
8
+ import { isPortAvailable, findAvailablePort } from '../utils/port-checker.js';
9
+ import { startServer } from '../../server.js';
10
+ import { createEmbeddedModeConfig, createStandaloneModeConfig, createCompanionModeConfig } from '../../config.js';
11
+ export async function startCommand(options = {}) {
12
+ const configManager = getConfigManager();
13
+ const config = await configManager.get();
14
+ console.log(chalk.bold.blue('\n🚀 Linting Orchestrator — Quality Assurance for API specifications\n'));
15
+ // Determine mode (embedded, standalone, or companion)
16
+ const mode = options.mode || config.defaultMode || 'embedded';
17
+ let targetPort = options.port || config.ports[mode] || 3003;
18
+ console.log(chalk.cyan('Mode:'), mode);
19
+ console.log(chalk.cyan('Configured Port:'), targetPort);
20
+ // Check if port is available
21
+ const portAvailable = await isPortAvailable(targetPort);
22
+ if (!portAvailable) {
23
+ console.log(chalk.yellow(`\n⚠️ Port ${targetPort} is already in use\n`));
24
+ // Find next available port
25
+ const suggestedPort = await findAvailablePort(targetPort + 1);
26
+ if (options.interactive !== false) {
27
+ // Interactive mode
28
+ const { action } = await inquirer.prompt([
29
+ {
30
+ type: 'list',
31
+ name: 'action',
32
+ message: 'What would you like to do?',
33
+ choices: [
34
+ {
35
+ name: `Use different port (suggested: ${suggestedPort || 'scan...'})`,
36
+ value: 'different',
37
+ },
38
+ {
39
+ name: 'Cancel',
40
+ value: 'cancel',
41
+ },
42
+ ],
43
+ },
44
+ ]);
45
+ if (action === 'cancel') {
46
+ console.log(chalk.dim('Cancelled'));
47
+ process.exit(0);
48
+ }
49
+ // Ask for port
50
+ const { newPort } = await inquirer.prompt([
51
+ {
52
+ type: 'number',
53
+ name: 'newPort',
54
+ message: 'Enter port number:',
55
+ default: suggestedPort || targetPort + 1,
56
+ validate: async (input) => {
57
+ const num = parseInt(String(input), 10);
58
+ if (isNaN(num) || num < 1 || num > 65535) {
59
+ return 'Port must be between 1 and 65535';
60
+ }
61
+ const available = await isPortAvailable(num);
62
+ if (!available) {
63
+ return `Port ${num} is also in use`;
64
+ }
65
+ return true;
66
+ },
67
+ },
68
+ ]);
69
+ targetPort = newPort;
70
+ // Ask if config should be updated
71
+ const { updateConfig } = await inquirer.prompt([
72
+ {
73
+ type: 'confirm',
74
+ name: 'updateConfig',
75
+ message: `Update default ${mode} port to ${targetPort}?`,
76
+ default: false,
77
+ },
78
+ ]);
79
+ if (updateConfig) {
80
+ await configManager.setPort(mode, targetPort);
81
+ console.log(chalk.green(`✅ Configuration updated\n`));
82
+ }
83
+ }
84
+ else {
85
+ // Non-interactive: fail with suggestion
86
+ console.error(chalk.red(`Error: Port ${targetPort} is already in use`));
87
+ console.log(chalk.yellow(`\nSuggestion: Use a different port:`));
88
+ console.log(chalk.dim(` spectify start --mode ${mode} --port ${suggestedPort || targetPort + 1}\n`));
89
+ process.exit(1);
90
+ }
91
+ }
92
+ // Update last used
93
+ await configManager.setLastUsed(mode, targetPort);
94
+ // Build configuration based on mode
95
+ let serverConfig;
96
+ if (mode === 'embedded') {
97
+ serverConfig = createEmbeddedModeConfig();
98
+ }
99
+ else if (mode === 'companion') {
100
+ serverConfig = createCompanionModeConfig();
101
+ }
102
+ else {
103
+ serverConfig = createStandaloneModeConfig();
104
+ }
105
+ // Apply CLI option overrides
106
+ serverConfig.server = {
107
+ port: targetPort,
108
+ host: options.host || '0.0.0.0',
109
+ maxDocumentSizeMB: serverConfig.server.maxDocumentSizeMB // Preserve config value
110
+ };
111
+ if (options.documentStore && serverConfig.documentStore) {
112
+ serverConfig.documentStore = {
113
+ ...serverConfig.documentStore,
114
+ baseDir: options.documentStore,
115
+ type: serverConfig.documentStore.type // Preserve type
116
+ };
117
+ }
118
+ // Display configuration
119
+ console.log(chalk.dim(`\n Port: ${targetPort}`));
120
+ console.log(chalk.dim(` Host: ${serverConfig.server.host}`));
121
+ console.log(chalk.dim(` Document Store: ${serverConfig.documentStore?.baseDir}`));
122
+ if (options.config) {
123
+ console.log(chalk.dim(` Config: ${options.config}`));
124
+ }
125
+ console.log();
126
+ // Start the server (embedded in-process)
127
+ const spinner = ora('Starting the Orchestrator service...').start();
128
+ try {
129
+ // Import and start server directly (no spawning!)
130
+ const instance = await startServer(serverConfig);
131
+ spinner.succeed('Server started successfully!');
132
+ // Register the process for tracking
133
+ await configManager.registerProcess(mode, process.pid, targetPort);
134
+ // Display quick start info
135
+ console.log(chalk.bold('\n✨ Quick Start:\n'));
136
+ console.log(chalk.yellow(' Check health:'));
137
+ console.log(chalk.gray(` curl http://localhost:${targetPort}/health | jq\n`));
138
+ console.log(chalk.yellow(' List available rulesets:'));
139
+ console.log(chalk.gray(` curl http://localhost:${targetPort}/rulesets | jq\n`));
140
+ console.log(chalk.yellow(' Lint a document:'));
141
+ console.log(chalk.gray(` spectify lint openapi.yaml\n`));
142
+ console.log(chalk.gray(' Press Ctrl+C to stop the server\n'));
143
+ // Setup graceful shutdown
144
+ const shutdown = async (signal) => {
145
+ console.log(chalk.yellow(`\n\nReceived ${signal}, shutting down...`));
146
+ try {
147
+ // Unregister process before shutdown
148
+ await configManager.unregisterProcess(mode);
149
+ await instance.shutdown();
150
+ console.log(chalk.green('✅ Server stopped'));
151
+ process.exit(0);
152
+ }
153
+ catch (error) {
154
+ console.error(chalk.red('Error during shutdown:'), error);
155
+ process.exit(1);
156
+ }
157
+ };
158
+ process.on('SIGINT', () => shutdown('SIGINT'));
159
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
160
+ }
161
+ catch (error) {
162
+ spinner.fail('Failed to start server');
163
+ console.error(chalk.red('\nError:'), error instanceof Error ? error.message : String(error));
164
+ process.exit(1);
165
+ }
166
+ }
167
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Status command - Check job status
3
+ */
4
+ export interface StatusOptions {
5
+ apiUrl?: string;
6
+ watch?: boolean;
7
+ }
8
+ export declare function statusCommand(jobId: string, options: StatusOptions): Promise<void>;
9
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCxF"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Status command - Check job status
3
+ */
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { SpectifyAPIClient } from '../api-client.js';
7
+ import { formatJobStatus } from '../formatters.js';
8
+ export async function statusCommand(jobId, options) {
9
+ try {
10
+ const client = new SpectifyAPIClient(options.apiUrl);
11
+ if (options.watch) {
12
+ // Watch mode: poll until completion
13
+ const spinner = ora('Checking status...').start();
14
+ await client.pollJobUntilComplete(jobId, {
15
+ interval: 2000,
16
+ onProgress: (status) => {
17
+ spinner.stop();
18
+ console.clear();
19
+ console.log(formatJobStatus(status));
20
+ if (status.status === 'running' || status.status === 'queued') {
21
+ spinner.start('Waiting for completion...');
22
+ }
23
+ },
24
+ });
25
+ spinner.succeed('Job completed');
26
+ console.log(chalk.green('\n✓ Job completed. Use `spectify results <jobId>` to view results.\n'));
27
+ }
28
+ else {
29
+ // Single check
30
+ const spinner = ora('Checking status...').start();
31
+ const status = await client.getJobStatus(jobId);
32
+ spinner.stop();
33
+ console.log(formatJobStatus(status));
34
+ if (status.status === 'completed') {
35
+ console.log(chalk.dim('Use `spectify results <jobId>` to view results.\n'));
36
+ }
37
+ else if (status.status === 'running' || status.status === 'queued') {
38
+ console.log(chalk.dim('Use `spectify status <jobId> --watch` to wait for completion.\n'));
39
+ }
40
+ }
41
+ }
42
+ catch (error) {
43
+ throw error;
44
+ }
45
+ }
46
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAOnD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa,EAAE,OAAsB;IACvE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAErD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,oCAAoC;YACpC,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;YAElD,MAAM,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE;gBACvC,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE;oBACrB,OAAO,CAAC,IAAI,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;oBAErC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;wBAC9D,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;YAEH,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC,CAAC;QACnG,CAAC;aAAM,CAAC;YACN,eAAe;YACf,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;YAErC,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;YAC9E,CAAC;iBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Stop Command - Stop running orchestrator processes
3
+ */
4
+ import { SpectifyMode } from '../config-manager.js';
5
+ export interface StopOptions {
6
+ mode?: SpectifyMode;
7
+ port?: number;
8
+ all?: boolean;
9
+ }
10
+ export declare function stopCommand(options?: StopOptions): Promise<void>;
11
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAoB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkF1E"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Stop Command - Stop running orchestrator processes
3
+ */
4
+ import chalk from 'chalk';
5
+ import { getConfigManager } from '../config-manager.js';
6
+ export async function stopCommand(options = {}) {
7
+ const configManager = getConfigManager();
8
+ try {
9
+ if (options.all) {
10
+ // Stop all running processes
11
+ const processes = await configManager.getAllProcesses();
12
+ if (processes.length === 0) {
13
+ console.log(chalk.yellow('No orchestrator processes running'));
14
+ return;
15
+ }
16
+ console.log(chalk.bold(`\n🛑 Stopping ${processes.length} orchestrator process(es)...\n`));
17
+ for (const proc of processes) {
18
+ try {
19
+ process.kill(proc.pid, 'SIGTERM');
20
+ await configManager.unregisterProcess(proc.mode);
21
+ console.log(chalk.green(`✅ Stopped ${proc.mode} (PID ${proc.pid}, port ${proc.port})`));
22
+ }
23
+ catch (error) {
24
+ console.log(chalk.red(`❌ Failed to stop ${proc.mode} (PID ${proc.pid}): ${error instanceof Error ? error.message : String(error)}`));
25
+ }
26
+ }
27
+ console.log();
28
+ return;
29
+ }
30
+ if (options.port) {
31
+ // Stop by port
32
+ const proc = await configManager.getProcessByPort(options.port);
33
+ if (!proc) {
34
+ console.log(chalk.yellow(`No orchestrator process found running on port ${options.port}`));
35
+ process.exit(1);
36
+ }
37
+ console.log(chalk.bold(`\n🛑 Stopping orchestrator on port ${options.port}...\n`));
38
+ try {
39
+ process.kill(proc.pid, 'SIGTERM');
40
+ await configManager.unregisterProcess(proc.mode);
41
+ console.log(chalk.green(`✅ Stopped ${proc.mode} (PID ${proc.pid})`));
42
+ }
43
+ catch (error) {
44
+ console.log(chalk.red(`❌ Failed to stop process: ${error instanceof Error ? error.message : String(error)}`));
45
+ process.exit(1);
46
+ }
47
+ console.log();
48
+ return;
49
+ }
50
+ // Stop by mode (default)
51
+ const config = await configManager.get();
52
+ const targetMode = options.mode || config.defaultMode;
53
+ const proc = await configManager.getProcess(targetMode);
54
+ if (!proc) {
55
+ console.log(chalk.yellow(`No orchestrator process running in ${targetMode} mode`));
56
+ console.log(chalk.dim(`\n Configured port: ${config.ports[targetMode]}`));
57
+ console.log(chalk.dim(' Check running processes: spectify ps\n'));
58
+ process.exit(1);
59
+ }
60
+ console.log(chalk.bold(`\n🛑 Stopping orchestrator (${targetMode} mode)...\n`));
61
+ try {
62
+ process.kill(proc.pid, 'SIGTERM');
63
+ await configManager.unregisterProcess(targetMode);
64
+ console.log(chalk.green(`✅ Stopped successfully`));
65
+ console.log(chalk.dim(` PID: ${proc.pid}`));
66
+ console.log(chalk.dim(` Port: ${proc.port}\n`));
67
+ }
68
+ catch (error) {
69
+ console.log(chalk.red(`❌ Failed to stop process: ${error instanceof Error ? error.message : String(error)}`));
70
+ process.exit(1);
71
+ }
72
+ }
73
+ catch (error) {
74
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
75
+ process.exit(1);
76
+ }
77
+ }
78
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Config Manager - Manages CLI configuration in ~/.spectify/config.json
3
+ */
4
+ export type SpectifyMode = 'standalone' | 'embedded' | 'companion';
5
+ export interface SpectifyConfig {
6
+ defaultMode: SpectifyMode;
7
+ ports: {
8
+ standalone: number;
9
+ embedded: number;
10
+ companion: number;
11
+ };
12
+ /**
13
+ * Optional URL override for standalone and companion modes.
14
+ * When set, this URL is used instead of http://localhost:<port>.
15
+ * Useful for connecting to a remote spectifyd (e.g. a Docker container).
16
+ * Takes lower precedence than the SPECTIFYD_URL environment variable.
17
+ */
18
+ url?: string;
19
+ lastUsed?: {
20
+ mode: SpectifyMode;
21
+ port: number;
22
+ };
23
+ }
24
+ export interface RunningProcess {
25
+ pid: number;
26
+ port: number;
27
+ mode: SpectifyMode;
28
+ startedAt: string;
29
+ }
30
+ export interface ProcessRegistry {
31
+ [mode: string]: RunningProcess | null;
32
+ }
33
+ export declare class ConfigManager {
34
+ private configDir;
35
+ private configPath;
36
+ private processesPath;
37
+ private config;
38
+ constructor();
39
+ /**
40
+ * Ensure config directory exists
41
+ */
42
+ private ensureConfigDir;
43
+ /**
44
+ * Load config from disk, create if doesn't exist
45
+ */
46
+ load(): Promise<SpectifyConfig>;
47
+ /**
48
+ * Save config to disk
49
+ */
50
+ save(): Promise<void>;
51
+ /**
52
+ * Get current config (loads if not cached)
53
+ */
54
+ get(): Promise<SpectifyConfig>;
55
+ /**
56
+ * Update default mode
57
+ */
58
+ setDefaultMode(mode: SpectifyMode): Promise<void>;
59
+ /**
60
+ * Update port for a mode
61
+ */
62
+ setPort(mode: SpectifyMode, port: number): Promise<void>;
63
+ /**
64
+ * Update last used settings
65
+ */
66
+ setLastUsed(mode: SpectifyMode, port: number): Promise<void>;
67
+ /**
68
+ * Get port for a specific mode
69
+ */
70
+ getPort(mode: SpectifyMode): Promise<number>;
71
+ /**
72
+ * Get API URL for the given (or default) mode.
73
+ *
74
+ * Resolution order:
75
+ * 1. SPECTIFYD_URL env var (session override, highest priority)
76
+ * 2. config.url (persistent override via `spectify config set url <url>`)
77
+ * 3. http://localhost:<port> (default)
78
+ *
79
+ * The URL override is intentionally ignored for `embedded` mode because
80
+ * embedded mode manages a local process — it must always bind to localhost.
81
+ */
82
+ getApiUrl(mode?: SpectifyMode): Promise<string>;
83
+ /**
84
+ * Set (or clear) the persistent URL override.
85
+ * Pass undefined to remove the override and revert to localhost:<port>.
86
+ */
87
+ setUrl(url: string | undefined): Promise<void>;
88
+ /**
89
+ * Reset config to defaults
90
+ */
91
+ reset(): Promise<void>;
92
+ /**
93
+ * Get config file path
94
+ */
95
+ getConfigPath(): string;
96
+ /**
97
+ * Check if config file exists
98
+ */
99
+ exists(): Promise<boolean>;
100
+ /**
101
+ * Load process registry
102
+ */
103
+ private loadProcesses;
104
+ /**
105
+ * Save process registry
106
+ */
107
+ private saveProcesses;
108
+ /**
109
+ * Register a running process
110
+ */
111
+ registerProcess(mode: SpectifyMode, pid: number, port: number): Promise<void>;
112
+ /**
113
+ * Unregister a process
114
+ */
115
+ unregisterProcess(mode: SpectifyMode): Promise<void>;
116
+ /**
117
+ * Get running process for a mode
118
+ */
119
+ getProcess(mode: SpectifyMode): Promise<RunningProcess | null>;
120
+ /**
121
+ * Get all running processes
122
+ */
123
+ getAllProcesses(): Promise<RunningProcess[]>;
124
+ /**
125
+ * Check if a process is running
126
+ */
127
+ private isProcessRunning;
128
+ /**
129
+ * Find process by port
130
+ */
131
+ getProcessByPort(port: number): Promise<RunningProcess | null>;
132
+ }
133
+ export declare function getConfigManager(): ConfigManager;
134
+ //# sourceMappingURL=config-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/cli/config-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,WAAW,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,YAAY,CAAC;IAC1B,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,YAAY,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAC;CACvC;AAWD,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAA+B;;IAQ7C;;OAEG;YACW,eAAe;IAQ7B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC;IA6BrC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC;IAIpC;;OAEG;IACG,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvD;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9D;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlE;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlD;;;;;;;;;;OAUG;IACG,SAAS,CAAC,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBrD;;;OAGG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAahC;;OAEG;YACW,aAAa;IAS3B;;OAEG;YACW,aAAa;IAS3B;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWnF;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1D;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAkBpE;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAgBlD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAWrE;AAKD,wBAAgB,gBAAgB,IAAI,aAAa,CAKhD"}