@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,276 @@
1
+ /**
2
+ * SARIF 2.1.0 Builder
3
+ *
4
+ * Transforms LintJobResult into SARIF (Static Analysis Results Interchange Format)
5
+ * Spec: https://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html
6
+ *
7
+ * @module formatters/sarif-builder
8
+ */
9
+ import crypto from 'crypto';
10
+ /**
11
+ * SarifBuilder - Converts lint results to SARIF 2.1.0 format
12
+ */
13
+ export class SarifBuilder {
14
+ /**
15
+ * Build a complete SARIF report from lint job result
16
+ */
17
+ buildSarif(result, options) {
18
+ return {
19
+ $schema: 'https://json.schemastore.org/sarif-2.1.0.json',
20
+ version: '2.1.0',
21
+ runs: [this.buildRun(result, options)],
22
+ };
23
+ }
24
+ /**
25
+ * Build a SARIF run from lint result
26
+ */
27
+ buildRun(result, options) {
28
+ return {
29
+ tool: this.buildTool(result),
30
+ artifacts: this.buildArtifacts(result),
31
+ results: this.buildResults(result, options),
32
+ properties: this.buildRunProperties(result),
33
+ };
34
+ }
35
+ /**
36
+ * Build tool metadata
37
+ */
38
+ buildTool(result) {
39
+ // Use a simple version string or parse from result
40
+ const version = '0.7.0'; // Updated when server version changes
41
+ return {
42
+ driver: {
43
+ name: 'cisco-linting-orchestrator',
44
+ version: version,
45
+ informationUri: 'https://github.com/cisco-open/linting-orchestrator',
46
+ rules: this.buildRules(result),
47
+ },
48
+ };
49
+ }
50
+ /**
51
+ * Build rule catalog from lint issues
52
+ * Creates unique rule entries from all issues
53
+ */
54
+ buildRules(result) {
55
+ const rulesMap = new Map();
56
+ for (const issue of result.results) {
57
+ if (!rulesMap.has(issue.code)) {
58
+ rulesMap.set(issue.code, {
59
+ id: issue.code,
60
+ shortDescription: {
61
+ text: this.extractShortDescription(issue.message),
62
+ },
63
+ fullDescription: {
64
+ text: issue.message,
65
+ },
66
+ defaultConfiguration: {
67
+ level: this.mapSeverityToSarifLevel(issue.severity),
68
+ },
69
+ helpUri: this.buildHelpUri(result, issue),
70
+ properties: {
71
+ category: this.extractCategory(issue),
72
+ tags: this.extractTags(issue),
73
+ },
74
+ });
75
+ }
76
+ }
77
+ return Array.from(rulesMap.values());
78
+ }
79
+ /**
80
+ * Extract short description from message (first sentence or up to 80 chars)
81
+ */
82
+ extractShortDescription(message) {
83
+ // Try to find first sentence
84
+ const firstSentence = message.match(/^[^.!?]+[.!?]/);
85
+ if (firstSentence) {
86
+ return firstSentence[0];
87
+ }
88
+ // Fallback: truncate at 80 chars
89
+ if (message.length > 80) {
90
+ return message.substring(0, 77) + '...';
91
+ }
92
+ return message;
93
+ }
94
+ /**
95
+ * Build help URI for a rule
96
+ */
97
+ buildHelpUri(result, issue) {
98
+ // For PubHub ruleset, use PubHub docs
99
+ if (result.rulesetName === 'pubhub') {
100
+ return `https://pubhub.cisco.com/docs/spectify/rules/${issue.code}`;
101
+ }
102
+ // Generic orchestrator docs
103
+ return `https://github.com/cisco-open/spectify/docs/rules/${issue.code}`;
104
+ }
105
+ /**
106
+ * Extract category from issue (if available in path or code)
107
+ */
108
+ extractCategory(issue) {
109
+ // Try to extract from code (e.g., "devx-publishing-001" → "publishing")
110
+ const categoryMatch = issue.code.match(/^[a-z]+-([a-z]+)-/);
111
+ if (categoryMatch) {
112
+ return categoryMatch[1];
113
+ }
114
+ return 'general';
115
+ }
116
+ /**
117
+ * Extract tags from issue
118
+ */
119
+ extractTags(issue) {
120
+ const tags = [];
121
+ // Add severity as tag (map number to string)
122
+ const severityNames = ['error', 'warning', 'info', 'hint'];
123
+ tags.push(severityNames[issue.severity] || 'warning');
124
+ // Add category
125
+ const category = this.extractCategory(issue);
126
+ if (category !== 'general') {
127
+ tags.push(category);
128
+ }
129
+ return tags;
130
+ }
131
+ /**
132
+ * Map severity to SARIF level
133
+ */
134
+ mapSeverityToSarifLevel(severity) {
135
+ // 0=error, 1=warn, 2=info, 3=hint
136
+ switch (severity) {
137
+ case 0:
138
+ return 'error';
139
+ case 1:
140
+ return 'warning';
141
+ case 2:
142
+ case 3:
143
+ return 'note';
144
+ default:
145
+ return 'warning';
146
+ }
147
+ }
148
+ /**
149
+ * Build artifact metadata (document being analyzed)
150
+ */
151
+ buildArtifacts(result) {
152
+ return [
153
+ {
154
+ location: {
155
+ uri: `file://${result.documentId}`,
156
+ },
157
+ properties: {
158
+ documentId: result.documentId,
159
+ documentName: result.documentId, // Could be enriched with actual name
160
+ },
161
+ },
162
+ ];
163
+ }
164
+ /**
165
+ * Build SARIF results from lint issues
166
+ */
167
+ buildResults(result, options) {
168
+ return result.results.map((issue) => this.buildResult(result, issue, options));
169
+ }
170
+ /**
171
+ * Build a single SARIF result from a lint issue
172
+ */
173
+ buildResult(result, issue, options) {
174
+ // Map numeric severity to string for properties
175
+ const severityNames = ['error', 'warning', 'info', 'hint'];
176
+ const severityString = severityNames[issue.severity] || 'warning';
177
+ return {
178
+ ruleId: issue.code,
179
+ level: this.mapSeverityToSarifLevel(issue.severity),
180
+ message: {
181
+ text: issue.message,
182
+ },
183
+ locations: this.buildLocations(result, issue, options),
184
+ fingerprints: this.generateFingerprints(result, issue),
185
+ properties: {
186
+ severity: severityString,
187
+ path: issue.path,
188
+ rulesetName: result.rulesetName,
189
+ rulesetVersion: result.rulesetVersion,
190
+ },
191
+ };
192
+ }
193
+ /**
194
+ * Build locations for an issue
195
+ */
196
+ buildLocations(result, issue, options) {
197
+ const location = {
198
+ physicalLocation: {
199
+ artifactLocation: {
200
+ uri: `file://${result.documentId}`,
201
+ },
202
+ region: this.buildRegion(issue, options),
203
+ },
204
+ };
205
+ return [location];
206
+ }
207
+ /**
208
+ * Build region (line/column range) for an issue
209
+ */
210
+ buildRegion(issue, _options) {
211
+ if (!issue.range) {
212
+ return undefined;
213
+ }
214
+ const region = {
215
+ startLine: issue.range.start.line,
216
+ startColumn: issue.range.start.character,
217
+ };
218
+ if (issue.range.end) {
219
+ region.endLine = issue.range.end.line;
220
+ region.endColumn = issue.range.end.character;
221
+ }
222
+ // Note: the orchestrator's LintIssue doesn't have snippet field currently
223
+ // This can be added in future if needed
224
+ return region;
225
+ }
226
+ /**
227
+ * Generate fingerprints for deduplication
228
+ * Uses primaryLocationLineHash scheme (path + line + rule)
229
+ */
230
+ generateFingerprints(result, issue) {
231
+ const fingerprints = {};
232
+ // Primary location line hash (standard scheme)
233
+ const primaryLocation = this.buildPrimaryLocationHash(result, issue);
234
+ fingerprints.primaryLocationLineHash = primaryLocation;
235
+ return fingerprints;
236
+ }
237
+ /**
238
+ * Build primary location hash for fingerprinting
239
+ * Format: hash(documentId + path + line + ruleId)
240
+ */
241
+ buildPrimaryLocationHash(result, issue) {
242
+ const components = [
243
+ result.documentId,
244
+ issue.path.map(String).join('/'),
245
+ issue.range?.start.line ?? 0,
246
+ issue.code,
247
+ ];
248
+ const input = components.join(':');
249
+ return crypto.createHash('sha256').update(input).digest('hex').substring(0, 16);
250
+ }
251
+ /**
252
+ * Build run properties (orchestrator-specific metadata)
253
+ */
254
+ buildRunProperties(result) {
255
+ return {
256
+ spectify: {
257
+ jobId: result.jobId,
258
+ documentId: result.documentId,
259
+ rulesetName: result.rulesetName,
260
+ rulesetVersion: result.rulesetVersion,
261
+ executionTime: result.totalExecutionTime,
262
+ timestamp: result.timestamp.toISOString(),
263
+ summary: {
264
+ totalIssues: result.summary.totalIssues,
265
+ bySeverity: {
266
+ error: result.summary.errorCount,
267
+ warning: result.summary.warningCount,
268
+ info: result.summary.infoCount,
269
+ hint: result.summary.hintCount,
270
+ },
271
+ },
272
+ },
273
+ };
274
+ }
275
+ }
276
+ //# sourceMappingURL=sarif-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarif-builder.js","sourceRoot":"","sources":["../../src/formatters/sarif-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/build/index.js ADDED
@@ -0,0 +1,174 @@
1
+ #!/usr/bin/env node
2
+ // Copyright 2026 Cisco Systems, Inc. and its affiliates
3
+ //
4
+ // SPDX-License-Identifier: Apache-2.0
5
+ /**
6
+ * Orchestrator server CLI
7
+ *
8
+ * Primary entrypoint for running orchestrator as a server.
9
+ * Supports two modes:
10
+ * - standalone: Independent server with own document store (~/.spectify/uploads)
11
+ * - companion: Integrates with MCP, requires --document-store path
12
+ *
13
+ * Used when running:
14
+ * - `npm start`
15
+ * - `node build/index.js`
16
+ * - `spectifyd` (global binary)
17
+ *
18
+ * @module index
19
+ */
20
+ import { Command } from 'commander';
21
+ import { startServer } from './server.js';
22
+ import { API_VERSION } from './utils/version.js';
23
+ import { createStandaloneModeConfig, createCompanionModeConfig, spectifyHome } from './config.js';
24
+ import * as path from 'path';
25
+ import chalk from 'chalk';
26
+ const program = new Command();
27
+ program
28
+ .name('spectifyd')
29
+ .description('Linting orchestrator daemon (spectifyd)')
30
+ .option('-p, --port <port>', 'server port (local: 3003, passthrough: 3004)', (val) => parseInt(val, 10))
31
+ .option('-H, --host <host>', 'server host', '0.0.0.0')
32
+ .option('-d, --store-directory <path>', 'directory where documents are stored')
33
+ .option('-t, --store-type <type>', 'document store type: local or passthrough', 'local')
34
+ .option('-r, --rulesets-directory <path>', 'directory containing rulesets (or set SPECTIFYD_RULESETS_DIR)')
35
+ .option('--max-workers <count>', 'maximum total workers', (val) => parseInt(val, 10))
36
+ .option('--log-level <level>', 'log level: error, warn, info, debug, trace', 'info')
37
+ .version(API_VERSION, '-V, --version', 'output the API server version')
38
+ .helpOption('-h, --help', 'display help for command')
39
+ .addHelpText('after', `
40
+ Examples:
41
+ ${chalk.cyan('Standalone')} (local document storage, default):
42
+ $ spectifyd
43
+ $ spectifyd --store-type local --store-directory $HOME/.spectify/uploads
44
+
45
+ ${chalk.cyan('Companion')} (passthrough store of an MCP server):
46
+ $ spectifyd --store-type passthrough --store-directory /path/to/mcp/documents
47
+ `);
48
+ program.parse(process.argv);
49
+ const options = program.opts();
50
+ /**
51
+ * Main function - starts server with graceful shutdown
52
+ */
53
+ async function main() {
54
+ try {
55
+ // Validate store type
56
+ const storeType = options.storeType;
57
+ if (storeType !== 'local' && storeType !== 'passthrough') {
58
+ console.error(chalk.red(`Error: Invalid store type '${storeType}'. Must be 'local' or 'passthrough'`));
59
+ process.exit(1);
60
+ }
61
+ // Determine port (default based on store type)
62
+ const defaultPort = storeType === 'passthrough' ? 3004 : 3003;
63
+ const port = options.port || parseInt(process.env.SPECTIFYD_PORT || '', 10) || defaultPort;
64
+ // Determine store directory
65
+ let storeDirectory;
66
+ if (storeType === 'passthrough') {
67
+ // Passthrough: require explicit directory
68
+ storeDirectory = options.storeDirectory || process.env.SPECTIFYD_DOCUMENT_STORE_DIR || '';
69
+ if (!storeDirectory) {
70
+ console.error(chalk.red('\nError: --store-directory is required for passthrough type'));
71
+ console.log(chalk.yellow('\nPassthrough storage integrates with external systems like MCP.'));
72
+ console.log(chalk.yellow('You must specify the path to the external document directory:\n'));
73
+ console.log(chalk.gray(' spectifyd --store-type passthrough --store-directory /path/to/documents\n'));
74
+ process.exit(1);
75
+ }
76
+ }
77
+ else {
78
+ // Local: default to $SPECTIFY_HOME/uploads
79
+ const defaultDir = path.join(spectifyHome(), 'uploads');
80
+ storeDirectory = options.storeDirectory || process.env.SPECTIFYD_DOCUMENT_STORE_DIR || defaultDir;
81
+ }
82
+ // Build configuration (use companion/standalone configs for convenience)
83
+ let config;
84
+ if (storeType === 'passthrough') {
85
+ config = createCompanionModeConfig();
86
+ }
87
+ else {
88
+ config = createStandaloneModeConfig();
89
+ }
90
+ // Apply CLI overrides
91
+ config.server.port = port;
92
+ config.server.host = options.host || config.server.host;
93
+ if (config.documentStore) {
94
+ config.documentStore.baseDir = storeDirectory;
95
+ config.documentStore.type = storeType;
96
+ }
97
+ const rulesetsDir = options.rulesetsDirectory || process.env.SPECTIFYD_RULESETS_DIR;
98
+ if (rulesetsDir) {
99
+ config.rulesets.directory = rulesetsDir;
100
+ }
101
+ if (options.logLevel) {
102
+ config.logging.level = options.logLevel;
103
+ }
104
+ if (options.maxWorkers) {
105
+ config.workerPool.totalMaxWorkers = options.maxWorkers;
106
+ }
107
+ // Validate Report Service availability (if enabled and required)
108
+ if (config.reportService?.enabled && config.reportService?.stopIfUnavailable) {
109
+ try {
110
+ console.log(chalk.gray('Checking Report Service availability...'));
111
+ const response = await fetch(`${config.reportService.url}/health`, {
112
+ method: 'GET',
113
+ signal: AbortSignal.timeout(5000) // 5 second timeout
114
+ });
115
+ if (!response.ok) {
116
+ throw new Error(`Report Service returned status ${response.status}`);
117
+ }
118
+ console.log(chalk.green('✓ Report Service available'));
119
+ }
120
+ catch (error) {
121
+ const mode = storeType === 'passthrough' ? 'Companion' : 'Standalone';
122
+ console.error(chalk.red(`\nError: ${mode} mode requires Report Service to be running.`));
123
+ console.error(chalk.yellow('\nReport Service is not available at:'), config.reportService.url);
124
+ console.error(chalk.yellow('\nPlease start the Report Service:'));
125
+ console.error(chalk.gray(' spectifyr'));
126
+ console.error(chalk.yellow('\nOr disable report integration in .env:'));
127
+ console.error(chalk.gray(' SPECTIFYD_REPORTS_ENABLED=false\n'));
128
+ process.exit(1);
129
+ }
130
+ }
131
+ else if (config.reportService?.enabled && !config.reportService?.stopIfUnavailable) {
132
+ // Light mode: just log warning if unavailable
133
+ try {
134
+ const response = await fetch(`${config.reportService.url}/health`, {
135
+ method: 'GET',
136
+ signal: AbortSignal.timeout(2000) // Shorter timeout for non-critical check
137
+ });
138
+ if (response.ok) {
139
+ console.log(chalk.green('✓ Report Service available'));
140
+ }
141
+ else {
142
+ console.log(chalk.yellow('⚠ Report Service unavailable - notifications will be queued'));
143
+ }
144
+ }
145
+ catch {
146
+ console.log(chalk.yellow('⚠ Report Service unavailable - notifications will be queued'));
147
+ }
148
+ }
149
+ // Start server
150
+ const instance = await startServer(config);
151
+ // Setup graceful shutdown handlers
152
+ const shutdownHandler = async (signal) => {
153
+ console.log(chalk.yellow(`\n\nReceived ${signal}, shutting down gracefully...`));
154
+ try {
155
+ await instance.shutdown();
156
+ console.log(chalk.green('✅ Server stopped'));
157
+ process.exit(0);
158
+ }
159
+ catch (error) {
160
+ console.error(chalk.red('Error during shutdown:'), error);
161
+ process.exit(1);
162
+ }
163
+ };
164
+ process.on('SIGINT', () => shutdownHandler('SIGINT'));
165
+ process.on('SIGTERM', () => shutdownHandler('SIGTERM'));
166
+ }
167
+ catch (error) {
168
+ console.error(chalk.red('Fatal error:'), error instanceof Error ? error.message : String(error));
169
+ process.exit(1);
170
+ }
171
+ }
172
+ // Start the server
173
+ main();
174
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
2
+ export interface LogContext {
3
+ correlationId?: string;
4
+ jobId?: string;
5
+ documentId?: string;
6
+ rulesetName?: string;
7
+ workerId?: string;
8
+ [key: string]: any;
9
+ }
10
+ export interface LogEntry {
11
+ timestamp: string;
12
+ level: LogLevel;
13
+ message: string;
14
+ context?: LogContext;
15
+ error?: {
16
+ message: string;
17
+ stack?: string;
18
+ code?: string;
19
+ };
20
+ }
21
+ declare class Logger {
22
+ private level;
23
+ private format;
24
+ configure(level: LogLevel, format?: 'json' | 'text'): void;
25
+ private shouldLog;
26
+ private formatLog;
27
+ private log;
28
+ debug(message: string, context?: LogContext): void;
29
+ info(message: string, context?: LogContext): void;
30
+ warn(message: string, context?: LogContext, error?: Error): void;
31
+ error(message: string, context?: LogContext, error?: Error): void;
32
+ }
33
+ export declare const logger: Logger;
34
+ export declare function generateCorrelationId(): string;
35
+ export declare function createRequestContext(correlationId?: string): LogContext;
36
+ export declare function withContext(baseContext: LogContext, additionalContext: Partial<LogContext>): LogContext;
37
+ export {};
38
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,UAAU;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,cAAM,MAAM;IACV,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,MAAM,CAA2B;IAEzC,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAE,MAAM,GAAG,MAAe;IAK3D,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,SAAS;IA8BjB,OAAO,CAAC,GAAG;IA+BX,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU;IAI3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU;IAI1C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,KAAK;IAIzD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,KAAK;CAG3D;AAGD,eAAO,MAAM,MAAM,QAAe,CAAC;AAMnC,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,oBAAoB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,UAAU,CAIvE;AAMD,wBAAgB,WAAW,CAAC,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAEvG"}
@@ -0,0 +1,105 @@
1
+ // Copyright 2026 Cisco Systems, Inc. and its affiliates
2
+ //
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ /**
5
+ * Structured Logging with Correlation IDs
6
+ *
7
+ * Provides consistent logging format with request correlation
8
+ */
9
+ import { randomUUID } from 'crypto';
10
+ class Logger {
11
+ level = 'info';
12
+ format = 'json';
13
+ configure(level, format = 'json') {
14
+ this.level = level;
15
+ this.format = format;
16
+ }
17
+ shouldLog(level) {
18
+ const levels = ['debug', 'info', 'warn', 'error'];
19
+ return levels.indexOf(level) >= levels.indexOf(this.level);
20
+ }
21
+ formatLog(entry) {
22
+ if (this.format === 'json') {
23
+ return JSON.stringify(entry);
24
+ }
25
+ // Text format
26
+ const timestamp = entry.timestamp;
27
+ const level = entry.level.toUpperCase().padEnd(5);
28
+ const correlationId = entry.context?.correlationId
29
+ ? `[${entry.context.correlationId.substring(0, 8)}]`
30
+ : '';
31
+ let message = `${timestamp} ${level} ${correlationId} ${entry.message}`;
32
+ if (entry.context && Object.keys(entry.context).length > 1) {
33
+ const ctx = { ...entry.context };
34
+ delete ctx.correlationId;
35
+ message += ` ${JSON.stringify(ctx)}`;
36
+ }
37
+ if (entry.error) {
38
+ message += `\n Error: ${entry.error.message}`;
39
+ if (entry.error.stack) {
40
+ message += `\n${entry.error.stack}`;
41
+ }
42
+ }
43
+ return message;
44
+ }
45
+ log(level, message, context, error) {
46
+ if (!this.shouldLog(level)) {
47
+ return;
48
+ }
49
+ const entry = {
50
+ timestamp: new Date().toISOString(),
51
+ level,
52
+ message,
53
+ context
54
+ };
55
+ if (error) {
56
+ entry.error = {
57
+ message: error.message,
58
+ stack: error.stack,
59
+ code: error.code
60
+ };
61
+ }
62
+ const formatted = this.formatLog(entry);
63
+ if (level === 'error') {
64
+ console.error(formatted);
65
+ }
66
+ else if (level === 'warn') {
67
+ console.warn(formatted);
68
+ }
69
+ else {
70
+ console.log(formatted);
71
+ }
72
+ }
73
+ debug(message, context) {
74
+ this.log('debug', message, context);
75
+ }
76
+ info(message, context) {
77
+ this.log('info', message, context);
78
+ }
79
+ warn(message, context, error) {
80
+ this.log('warn', message, context, error);
81
+ }
82
+ error(message, context, error) {
83
+ this.log('error', message, context, error);
84
+ }
85
+ }
86
+ // Singleton instance
87
+ export const logger = new Logger();
88
+ // ============================================
89
+ // Correlation ID Management
90
+ // ============================================
91
+ export function generateCorrelationId() {
92
+ return randomUUID();
93
+ }
94
+ export function createRequestContext(correlationId) {
95
+ return {
96
+ correlationId: correlationId || generateCorrelationId()
97
+ };
98
+ }
99
+ // ============================================
100
+ // Helper Functions
101
+ // ============================================
102
+ export function withContext(baseContext, additionalContext) {
103
+ return { ...baseContext, ...additionalContext };
104
+ }
105
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mock-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-server.d.ts","sourceRoot":"","sources":["../src/mock-server.ts"],"names":[],"mappings":""}