@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,148 @@
1
+ // Copyright 2026 Cisco Systems, Inc. and its affiliates
2
+ //
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ /**
5
+ * DocumentAccessor - Filesystem access to MCP document store
6
+ *
7
+ * Provides minimal filesystem wrapper to access OpenAPI documents
8
+ * stored by the MCP OpenAPI Analysis server. Uses direct filesystem
9
+ * access for performance (zero-copy architecture).
10
+ *
11
+ * Design: Workers receive file paths, not document content, to avoid
12
+ * expensive serialization across thread boundaries.
13
+ */
14
+ import { promises as fs } from 'fs';
15
+ import path from 'path';
16
+ /**
17
+ * DocumentAccessor - Direct filesystem access to MCP document store
18
+ */
19
+ export class DocumentAccessor {
20
+ config;
21
+ constructor(config) {
22
+ this.config = config;
23
+ }
24
+ /**
25
+ * Get absolute file path for a document ID
26
+ *
27
+ * @param documentId - Document UUID from MCP server
28
+ * @returns Absolute path to document JSON file
29
+ */
30
+ getDocumentPath(documentId) {
31
+ // MCP server stores documents as: uploads/{documentId}.json
32
+ return path.resolve(this.config.documentStorePath, `${documentId}.json`);
33
+ }
34
+ /**
35
+ * Check if document exists in filesystem
36
+ *
37
+ * @param documentId - Document UUID
38
+ * @returns True if file exists
39
+ */
40
+ async documentExists(documentId) {
41
+ const filePath = this.getDocumentPath(documentId);
42
+ try {
43
+ await fs.access(filePath);
44
+ return true;
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ }
50
+ /**
51
+ * Get metadata about a document without loading content
52
+ *
53
+ * @param documentId - Document UUID
54
+ * @returns Document metadata including file stats
55
+ */
56
+ async getDocumentMetadata(documentId) {
57
+ const filePath = this.getDocumentPath(documentId);
58
+ try {
59
+ const stats = await fs.stat(filePath);
60
+ return {
61
+ documentId,
62
+ filePath,
63
+ exists: true,
64
+ size: stats.size,
65
+ createdAt: stats.birthtime,
66
+ modifiedAt: stats.mtime,
67
+ };
68
+ }
69
+ catch (error) {
70
+ return {
71
+ documentId,
72
+ filePath,
73
+ exists: false,
74
+ };
75
+ }
76
+ }
77
+ /**
78
+ * Load document content from filesystem
79
+ *
80
+ * NOTE: Workers should use this directly in their threads to avoid
81
+ * passing large document content across thread boundaries.
82
+ *
83
+ * @param documentId - Document UUID
84
+ * @returns Parsed OpenAPI document
85
+ */
86
+ async loadDocument(documentId) {
87
+ const filePath = this.getDocumentPath(documentId);
88
+ try {
89
+ const content = await fs.readFile(filePath, 'utf-8');
90
+ return JSON.parse(content);
91
+ }
92
+ catch (error) {
93
+ throw new Error(`Failed to load document ${documentId} from ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
94
+ }
95
+ }
96
+ /**
97
+ * Validate document store accessibility
98
+ *
99
+ * @throws {Error} If document store directory is not accessible
100
+ */
101
+ async validateDocumentStore() {
102
+ try {
103
+ await fs.access(this.config.documentStorePath);
104
+ const stats = await fs.stat(this.config.documentStorePath);
105
+ if (!stats.isDirectory()) {
106
+ throw new Error(`Document store path is not a directory: ${this.config.documentStorePath}`);
107
+ }
108
+ }
109
+ catch (error) {
110
+ throw new Error(`Document store not accessible at ${this.config.documentStorePath}: ${error instanceof Error ? error.message : String(error)}`);
111
+ }
112
+ }
113
+ /**
114
+ * List all documents in the store
115
+ *
116
+ * @returns Array of document IDs (without .json extension)
117
+ */
118
+ async listDocuments() {
119
+ try {
120
+ const files = await fs.readdir(this.config.documentStorePath);
121
+ return files
122
+ .filter(file => file.endsWith('.json'))
123
+ .map(file => file.replace('.json', ''));
124
+ }
125
+ catch (error) {
126
+ throw new Error(`Failed to list documents in ${this.config.documentStorePath}: ${error instanceof Error ? error.message : String(error)}`);
127
+ }
128
+ }
129
+ /**
130
+ * Get document store statistics
131
+ */
132
+ async getStoreStats() {
133
+ const documents = await this.listDocuments();
134
+ let totalSize = 0;
135
+ for (const docId of documents) {
136
+ const metadata = await this.getDocumentMetadata(docId);
137
+ if (metadata.size) {
138
+ totalSize += metadata.size;
139
+ }
140
+ }
141
+ return {
142
+ documentCount: documents.length,
143
+ totalSize,
144
+ storePath: this.config.documentStorePath,
145
+ };
146
+ }
147
+ }
148
+ //# sourceMappingURL=document-accessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-accessor.js","sourceRoot":"","sources":["../src/document-accessor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Reproduction Markdown Generator
3
+ *
4
+ * Generates step-by-step Markdown instructions for reproducing an orchestrator
5
+ * lint job using only the native Spectral CLI.
6
+ */
7
+ import type { LintJobResult, RulesetSourceMetadata } from '../types.js';
8
+ /**
9
+ * Generate Markdown reproduction instructions for a completed lint job.
10
+ *
11
+ * Pure function — no I/O, no side effects.
12
+ */
13
+ export declare function generateReproductionMarkdown(jobResult: LintJobResult, sourceMetadata: RulesetSourceMetadata): string;
14
+ //# sourceMappingURL=reproduce-markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reproduce-markdown.d.ts","sourceRoot":"","sources":["../../src/formatters/reproduce-markdown.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAiB,MAAM,aAAa,CAAC;AAiGvF;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,aAAa,EACxB,cAAc,EAAE,qBAAqB,GACpC,MAAM,CA0FR"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Reproduction Markdown Generator
3
+ *
4
+ * Generates step-by-step Markdown instructions for reproducing an orchestrator
5
+ * lint job using only the native Spectral CLI.
6
+ */
7
+ /**
8
+ * Determine the git checkout target from the source version.
9
+ * Date-based versions (e.g., "2025-11-19") → "main" (no tag exists).
10
+ * Semver-like versions → use as tag (e.g., "v1.1.0" or "1.1.0").
11
+ */
12
+ function getCheckoutTarget(sourceVersion) {
13
+ // Date pattern: YYYY-MM-DD (with optional suffix)
14
+ if (/^\d{4}-\d{2}-\d{2}/.test(sourceVersion)) {
15
+ return { ref: 'main', isDateBased: true };
16
+ }
17
+ // Assume semver — prefix with "v" if not already present
18
+ const ref = sourceVersion.startsWith('v') ? sourceVersion : `v${sourceVersion}`;
19
+ return { ref, isDateBased: false };
20
+ }
21
+ /**
22
+ * Extract the repository name from its URL.
23
+ * "https://github.com/CiscoDevNet/api-insights-openapi-rulesets" → "api-insights-openapi-rulesets"
24
+ */
25
+ function getRepoName(repositoryUrl) {
26
+ const cleaned = repositoryUrl.replace(/\/+$/, '').replace(/\.git$/, '');
27
+ return cleaned.split('/').pop() || 'ruleset';
28
+ }
29
+ /**
30
+ * Generate the rule overrides section of the Markdown, including:
31
+ * - Summary table of overrides
32
+ * - YAML wrapper ruleset example
33
+ * - JS wrapper fallback note
34
+ */
35
+ function generateOverridesSection(ruleOverrides, entrypoint) {
36
+ const entries = Object.entries(ruleOverrides);
37
+ if (entries.length === 0)
38
+ return '';
39
+ // Build overrides table
40
+ const tableRows = entries.map(([rule, severity]) => {
41
+ const effect = severity === 'off'
42
+ ? 'Rule excluded from results'
43
+ : `Severity changed to ${severity}`;
44
+ return `| \`${rule}\` | \`${severity}\` | ${effect} |`;
45
+ });
46
+ // Build YAML rules block for wrapper
47
+ const yamlRules = entries
48
+ .map(([rule, severity]) => ` ${rule}: "${severity}"`)
49
+ .join('\n');
50
+ // Build JS rules object for fallback
51
+ const jsRules = entries
52
+ .map(([rule, severity]) => ` '${rule}': '${severity}'`)
53
+ .join(',\n');
54
+ return `
55
+ ## Step 3: Configure Rule Overrides
56
+
57
+ The original lint run applied the following rule overrides:
58
+
59
+ | Rule | Override | Effect |
60
+ |------|----------|--------|
61
+ ${tableRows.join('\n')}
62
+
63
+ To reproduce the same behavior with Spectral, create a **wrapper ruleset** that extends the original and adds an [overrides section](https://docs.stoplight.io/docs/spectral/293426e270fac-overrides).
64
+
65
+ Save the following as \`spectify-overrides.yaml\` in the same directory as the cloned ruleset:
66
+
67
+ \`\`\`yaml
68
+ extends:
69
+ - ./${entrypoint}
70
+ overrides:
71
+ - files:
72
+ - "**"
73
+ rules:
74
+ ${yamlRules}
75
+ \`\`\`
76
+
77
+ > **Note:** This is provided as an example. You can also add the \`overrides\` section directly to \`${entrypoint}\` instead of creating a wrapper file.
78
+
79
+ > **Troubleshooting:** If overrides don't take effect (rare edge case with deeply nested \`extends\` chains), use a JavaScript wrapper instead:
80
+ > \`\`\`js
81
+ > // spectify-overrides.mjs
82
+ > export default {
83
+ > extends: ['./${entrypoint}'],
84
+ > overrides: [
85
+ > {
86
+ > files: ['**'],
87
+ > rules: {
88
+ ${jsRules}
89
+ > }
90
+ > }
91
+ > ]
92
+ > };
93
+ > \`\`\`
94
+ `;
95
+ }
96
+ /**
97
+ * Generate Markdown reproduction instructions for a completed lint job.
98
+ *
99
+ * Pure function — no I/O, no side effects.
100
+ */
101
+ export function generateReproductionMarkdown(jobResult, sourceMetadata) {
102
+ const repoName = getRepoName(sourceMetadata.repositoryUrl);
103
+ const { ref, isDateBased } = getCheckoutTarget(sourceMetadata.sourceVersion);
104
+ const hasOverrides = jobResult.ruleOverrides && Object.keys(jobResult.ruleOverrides).length > 0;
105
+ const rulesetFile = hasOverrides ? 'spectify-overrides.yaml' : sourceMetadata.entrypoint;
106
+ const overrideCount = hasOverrides ? Object.keys(jobResult.ruleOverrides).length : 0;
107
+ // Step numbering shifts when overrides are present
108
+ const runStepNumber = hasOverrides ? 4 : 3;
109
+ const lines = [];
110
+ // ── Header ──
111
+ lines.push(`# Spectral Reproduction: ${sourceMetadata.displayName}`);
112
+ lines.push('');
113
+ // ── Job Information ──
114
+ lines.push('## Job Information');
115
+ lines.push('');
116
+ lines.push('| Field | Value |');
117
+ lines.push('|-------|-------|');
118
+ lines.push(`| Job ID | \`${jobResult.jobId}\` |`);
119
+ lines.push(`| Ruleset | ${sourceMetadata.rulesetName} (${sourceMetadata.displayName}) |`);
120
+ lines.push(`| Version | ${sourceMetadata.version} |`);
121
+ lines.push(`| Document ID | \`${jobResult.documentId}\` |`);
122
+ lines.push(`| Timestamp | ${jobResult.timestamp instanceof Date ? jobResult.timestamp.toISOString() : jobResult.timestamp} |`);
123
+ if (hasOverrides) {
124
+ lines.push(`| Rule Overrides | ${overrideCount} rule${overrideCount !== 1 ? 's' : ''} modified (see below) |`);
125
+ }
126
+ lines.push('');
127
+ // ── Prerequisites ──
128
+ lines.push('## Prerequisites');
129
+ lines.push('');
130
+ lines.push('```bash');
131
+ lines.push('# Install Spectral CLI (if not already installed)');
132
+ lines.push('npm install -g @stoplight/spectral-cli');
133
+ lines.push('');
134
+ lines.push('# Verify installation');
135
+ lines.push('spectral --version');
136
+ lines.push('```');
137
+ lines.push('');
138
+ // ── Step 1: Clone ──
139
+ lines.push('## Step 1: Clone the Ruleset');
140
+ lines.push('');
141
+ lines.push('```bash');
142
+ lines.push(`git clone ${sourceMetadata.repositoryUrl}`);
143
+ lines.push(`cd ${repoName}`);
144
+ if (isDateBased) {
145
+ lines.push(`# Source is a snapshot from ${sourceMetadata.sourceVersion} — using main branch`);
146
+ lines.push(`git checkout ${ref}`);
147
+ }
148
+ else {
149
+ lines.push(`git checkout ${ref}`);
150
+ }
151
+ lines.push('```');
152
+ lines.push('');
153
+ // ── Step 2: Install Dependencies ──
154
+ if (sourceMetadata.hasPackageJson) {
155
+ lines.push('## Step 2: Install Dependencies');
156
+ lines.push('');
157
+ lines.push('```bash');
158
+ lines.push('npm install');
159
+ lines.push('```');
160
+ lines.push('');
161
+ }
162
+ // ── Step 3 (optional): Rule Overrides ──
163
+ if (hasOverrides) {
164
+ lines.push(generateOverridesSection(jobResult.ruleOverrides, sourceMetadata.entrypoint));
165
+ }
166
+ // ── Run Spectral ──
167
+ lines.push(`## Step ${runStepNumber}: Run Spectral`);
168
+ lines.push('');
169
+ lines.push('```bash');
170
+ lines.push(`spectral lint <your-document.yaml> --ruleset ${rulesetFile}`);
171
+ lines.push('```');
172
+ lines.push('');
173
+ lines.push('Replace `<your-document.yaml>` with the path to your OpenAPI document.');
174
+ lines.push('');
175
+ // ── Footer ──
176
+ lines.push('---');
177
+ lines.push('');
178
+ lines.push(`*Generated by the linting orchestrator — reproduced from job \`${jobResult.jobId}\`*`);
179
+ lines.push('');
180
+ return lines.join('\n');
181
+ }
182
+ //# sourceMappingURL=reproduce-markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reproduce-markdown.js","sourceRoot":"","sources":["../../src/formatters/reproduce-markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
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 type { LintJobResult, SarifReport, ReportGenerationOptions } from '../types.js';
10
+ /**
11
+ * SarifBuilder - Converts lint results to SARIF 2.1.0 format
12
+ */
13
+ export declare class SarifBuilder {
14
+ /**
15
+ * Build a complete SARIF report from lint job result
16
+ */
17
+ buildSarif(result: LintJobResult, options?: ReportGenerationOptions): SarifReport;
18
+ /**
19
+ * Build a SARIF run from lint result
20
+ */
21
+ private buildRun;
22
+ /**
23
+ * Build tool metadata
24
+ */
25
+ private buildTool;
26
+ /**
27
+ * Build rule catalog from lint issues
28
+ * Creates unique rule entries from all issues
29
+ */
30
+ private buildRules;
31
+ /**
32
+ * Extract short description from message (first sentence or up to 80 chars)
33
+ */
34
+ private extractShortDescription;
35
+ /**
36
+ * Build help URI for a rule
37
+ */
38
+ private buildHelpUri;
39
+ /**
40
+ * Extract category from issue (if available in path or code)
41
+ */
42
+ private extractCategory;
43
+ /**
44
+ * Extract tags from issue
45
+ */
46
+ private extractTags;
47
+ /**
48
+ * Map severity to SARIF level
49
+ */
50
+ private mapSeverityToSarifLevel;
51
+ /**
52
+ * Build artifact metadata (document being analyzed)
53
+ */
54
+ private buildArtifacts;
55
+ /**
56
+ * Build SARIF results from lint issues
57
+ */
58
+ private buildResults;
59
+ /**
60
+ * Build a single SARIF result from a lint issue
61
+ */
62
+ private buildResult;
63
+ /**
64
+ * Build locations for an issue
65
+ */
66
+ private buildLocations;
67
+ /**
68
+ * Build region (line/column range) for an issue
69
+ */
70
+ private buildRegion;
71
+ /**
72
+ * Generate fingerprints for deduplication
73
+ * Uses primaryLocationLineHash scheme (path + line + rule)
74
+ */
75
+ private generateFingerprints;
76
+ /**
77
+ * Build primary location hash for fingerprinting
78
+ * Format: hash(documentId + path + line + ruleId)
79
+ */
80
+ private buildPrimaryLocationHash;
81
+ /**
82
+ * Build run properties (orchestrator-specific metadata)
83
+ */
84
+ private buildRunProperties;
85
+ }
86
+ //# sourceMappingURL=sarif-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarif-builder.d.ts","sourceRoot":"","sources":["../../src/formatters/sarif-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACV,aAAa,EAEb,WAAW,EASX,uBAAuB,EACxB,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,WAAW;IAQjF;;OAEG;IACH,OAAO,CAAC,QAAQ;IAShB;;OAEG;IACH,OAAO,CAAC,SAAS;IAcjB;;;OAGG;IACH,OAAO,CAAC,UAAU;IA4BlB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAe/B;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAgBnB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAe/B;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,OAAO,CAAC,WAAW;IA0BnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,WAAW;IAqBnB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAYhC;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAqB3B"}