@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.
- package/LICENSE +201 -0
- package/NOTICE +5 -0
- package/README.md +43 -0
- package/build/cli/api-client.d.ts +170 -0
- package/build/cli/api-client.d.ts.map +1 -0
- package/build/cli/api-client.js +284 -0
- package/build/cli/api-client.js.map +1 -0
- package/build/cli/commands/agents.d.ts +7 -0
- package/build/cli/commands/agents.d.ts.map +1 -0
- package/build/cli/commands/agents.js +694 -0
- package/build/cli/commands/agents.js.map +1 -0
- package/build/cli/commands/completion.d.ts +9 -0
- package/build/cli/commands/completion.d.ts.map +1 -0
- package/build/cli/commands/completion.js +177 -0
- package/build/cli/commands/completion.js.map +1 -0
- package/build/cli/commands/config.d.ts +10 -0
- package/build/cli/commands/config.d.ts.map +1 -0
- package/build/cli/commands/config.js +284 -0
- package/build/cli/commands/config.js.map +1 -0
- package/build/cli/commands/health.d.ts +11 -0
- package/build/cli/commands/health.d.ts.map +1 -0
- package/build/cli/commands/health.js +38 -0
- package/build/cli/commands/health.js.map +1 -0
- package/build/cli/commands/help.d.ts +6 -0
- package/build/cli/commands/help.d.ts.map +1 -0
- package/build/cli/commands/help.js +20 -0
- package/build/cli/commands/help.js.map +1 -0
- package/build/cli/commands/history.d.ts +11 -0
- package/build/cli/commands/history.d.ts.map +1 -0
- package/build/cli/commands/history.js +50 -0
- package/build/cli/commands/history.js.map +1 -0
- package/build/cli/commands/jobs.d.ts +12 -0
- package/build/cli/commands/jobs.d.ts.map +1 -0
- package/build/cli/commands/jobs.js +84 -0
- package/build/cli/commands/jobs.js.map +1 -0
- package/build/cli/commands/lint.d.ts +15 -0
- package/build/cli/commands/lint.d.ts.map +1 -0
- package/build/cli/commands/lint.js +384 -0
- package/build/cli/commands/lint.js.map +1 -0
- package/build/cli/commands/ps.d.ts +8 -0
- package/build/cli/commands/ps.d.ts.map +1 -0
- package/build/cli/commands/ps.js +74 -0
- package/build/cli/commands/ps.js.map +1 -0
- package/build/cli/commands/reproduce.d.ts +9 -0
- package/build/cli/commands/reproduce.d.ts.map +1 -0
- package/build/cli/commands/reproduce.js +31 -0
- package/build/cli/commands/reproduce.js.map +1 -0
- package/build/cli/commands/reset.d.ts +5 -0
- package/build/cli/commands/reset.d.ts.map +1 -0
- package/build/cli/commands/reset.js +13 -0
- package/build/cli/commands/reset.js.map +1 -0
- package/build/cli/commands/results.d.ts +13 -0
- package/build/cli/commands/results.d.ts.map +1 -0
- package/build/cli/commands/results.js +129 -0
- package/build/cli/commands/results.js.map +1 -0
- package/build/cli/commands/rulesets/check.d.ts +12 -0
- package/build/cli/commands/rulesets/check.d.ts.map +1 -0
- package/build/cli/commands/rulesets/check.js +226 -0
- package/build/cli/commands/rulesets/check.js.map +1 -0
- package/build/cli/commands/rulesets/index.d.ts +5 -0
- package/build/cli/commands/rulesets/index.d.ts.map +1 -0
- package/build/cli/commands/rulesets/index.js +6 -0
- package/build/cli/commands/rulesets/index.js.map +1 -0
- package/build/cli/commands/rulesets/view.d.ts +16 -0
- package/build/cli/commands/rulesets/view.d.ts.map +1 -0
- package/build/cli/commands/rulesets/view.js +100 -0
- package/build/cli/commands/rulesets/view.js.map +1 -0
- package/build/cli/commands/start.d.ts +16 -0
- package/build/cli/commands/start.d.ts.map +1 -0
- package/build/cli/commands/start.js +167 -0
- package/build/cli/commands/start.js.map +1 -0
- package/build/cli/commands/status.d.ts +9 -0
- package/build/cli/commands/status.d.ts.map +1 -0
- package/build/cli/commands/status.js +46 -0
- package/build/cli/commands/status.js.map +1 -0
- package/build/cli/commands/stop.d.ts +11 -0
- package/build/cli/commands/stop.d.ts.map +1 -0
- package/build/cli/commands/stop.js +78 -0
- package/build/cli/commands/stop.js.map +1 -0
- package/build/cli/config-manager.d.ts +134 -0
- package/build/cli/config-manager.d.ts.map +1 -0
- package/build/cli/config-manager.js +288 -0
- package/build/cli/config-manager.js.map +1 -0
- package/build/cli/formatters.d.ts +62 -0
- package/build/cli/formatters.d.ts.map +1 -0
- package/build/cli/formatters.js +715 -0
- package/build/cli/formatters.js.map +1 -0
- package/build/cli/history-manager.d.ts +97 -0
- package/build/cli/history-manager.d.ts.map +1 -0
- package/build/cli/history-manager.js +201 -0
- package/build/cli/history-manager.js.map +1 -0
- package/build/cli/index.d.ts +16 -0
- package/build/cli/index.d.ts.map +1 -0
- package/build/cli/index.js +335 -0
- package/build/cli/index.js.map +1 -0
- package/build/cli/list-rulesets.d.ts +15 -0
- package/build/cli/list-rulesets.d.ts.map +1 -0
- package/build/cli/list-rulesets.js +193 -0
- package/build/cli/list-rulesets.js.map +1 -0
- package/build/cli/utils/connection-error.d.ts +9 -0
- package/build/cli/utils/connection-error.d.ts.map +1 -0
- package/build/cli/utils/connection-error.js +30 -0
- package/build/cli/utils/connection-error.js.map +1 -0
- package/build/cli/utils/embedded-server.d.ts +21 -0
- package/build/cli/utils/embedded-server.d.ts.map +1 -0
- package/build/cli/utils/embedded-server.js +61 -0
- package/build/cli/utils/embedded-server.js.map +1 -0
- package/build/cli/utils/mode-validator.d.ts +13 -0
- package/build/cli/utils/mode-validator.d.ts.map +1 -0
- package/build/cli/utils/mode-validator.js +31 -0
- package/build/cli/utils/mode-validator.js.map +1 -0
- package/build/cli/utils/port-checker.d.ts +20 -0
- package/build/cli/utils/port-checker.d.ts.map +1 -0
- package/build/cli/utils/port-checker.js +49 -0
- package/build/cli/utils/port-checker.js.map +1 -0
- package/build/config.d.ts +57 -0
- package/build/config.d.ts.map +1 -0
- package/build/config.js +527 -0
- package/build/config.js.map +1 -0
- package/build/document-accessor.d.ts +79 -0
- package/build/document-accessor.d.ts.map +1 -0
- package/build/document-accessor.js +148 -0
- package/build/document-accessor.js.map +1 -0
- package/build/formatters/reproduce-markdown.d.ts +14 -0
- package/build/formatters/reproduce-markdown.d.ts.map +1 -0
- package/build/formatters/reproduce-markdown.js +182 -0
- package/build/formatters/reproduce-markdown.js.map +1 -0
- package/build/formatters/sarif-builder.d.ts +86 -0
- package/build/formatters/sarif-builder.d.ts.map +1 -0
- package/build/formatters/sarif-builder.js +276 -0
- package/build/formatters/sarif-builder.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +174 -0
- package/build/index.js.map +1 -0
- package/build/logger.d.ts +38 -0
- package/build/logger.d.ts.map +1 -0
- package/build/logger.js +105 -0
- package/build/logger.js.map +1 -0
- package/build/mock-server.d.ts +2 -0
- package/build/mock-server.d.ts.map +1 -0
- package/build/mock-server.js +290 -0
- package/build/mock-server.js.map +1 -0
- package/build/orchestrator.d.ts +149 -0
- package/build/orchestrator.d.ts.map +1 -0
- package/build/orchestrator.js +874 -0
- package/build/orchestrator.js.map +1 -0
- package/build/ruleset-loader.d.ts +79 -0
- package/build/ruleset-loader.d.ts.map +1 -0
- package/build/ruleset-loader.js +514 -0
- package/build/ruleset-loader.js.map +1 -0
- package/build/schemas.d.ts +2568 -0
- package/build/schemas.d.ts.map +1 -0
- package/build/schemas.js +674 -0
- package/build/schemas.js.map +1 -0
- package/build/server.d.ts +39 -0
- package/build/server.d.ts.map +1 -0
- package/build/server.js +834 -0
- package/build/server.js.map +1 -0
- package/build/storage/memory-storage.d.ts +190 -0
- package/build/storage/memory-storage.d.ts.map +1 -0
- package/build/storage/memory-storage.js +629 -0
- package/build/storage/memory-storage.js.map +1 -0
- package/build/storage/redis-storage.d.ts +134 -0
- package/build/storage/redis-storage.d.ts.map +1 -0
- package/build/storage/redis-storage.js +236 -0
- package/build/storage/redis-storage.js.map +1 -0
- package/build/storage/storage-adapter.d.ts +189 -0
- package/build/storage/storage-adapter.d.ts.map +1 -0
- package/build/storage/storage-adapter.js +36 -0
- package/build/storage/storage-adapter.js.map +1 -0
- package/build/types.d.ts +981 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +5 -0
- package/build/types.js.map +1 -0
- package/build/utils/version.d.ts +40 -0
- package/build/utils/version.d.ts.map +1 -0
- package/build/utils/version.js +94 -0
- package/build/utils/version.js.map +1 -0
- package/build/validation.d.ts +95 -0
- package/build/validation.d.ts.map +1 -0
- package/build/validation.js +150 -0
- package/build/validation.js.map +1 -0
- package/build/worker-pool.d.ts +137 -0
- package/build/worker-pool.d.ts.map +1 -0
- package/build/worker-pool.js +549 -0
- package/build/worker-pool.js.map +1 -0
- package/build/worker.d.ts +2 -0
- package/build/worker.d.ts.map +1 -0
- package/build/worker.js +427 -0
- package/build/worker.js.map +1 -0
- package/package.json +110 -0
- package/rulesets/CHANGELOG.md +25 -0
- package/rulesets/config/rulesets.yaml +96 -0
- package/rulesets/sources/README.md +47 -0
- package/rulesets/sources/example/oas-recommended/v1.0.0/ruleset.yaml +6 -0
- 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":"AAAA,wDAAwD;AACxD,EAAE;AACF,sCAAsC;AAEtC;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AAyBxB;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACnB,MAAM,CAAyB;IAEvC,YAAY,MAA8B;QACxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,eAAe,CAAC,UAAkB;QAChC,4DAA4D;QAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,GAAG,UAAU,OAAO,CAAC,CAAC;IAC3E,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAAC,UAAkB;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,mBAAmB,CAAC,UAAkB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,OAAO;gBACL,UAAU;gBACV,QAAQ;gBACR,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,UAAU,EAAE,KAAK,CAAC,KAAK;aACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,UAAU;gBACV,QAAQ;gBACR,MAAM,EAAE,KAAK;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,YAAY,CAAC,UAAkB;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,2BAA2B,UAAU,SAAS,QAAQ,KACpD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,qBAAqB;QACzB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAE3D,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CACb,2CAA2C,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAC3E,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,oCAAoC,IAAI,CAAC,MAAM,CAAC,iBAAiB,KAC/D,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC9D,OAAO,KAAK;iBACT,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;iBACtC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,CAAC,MAAM,CAAC,iBAAiB,KAC1D,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QAKjB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7C,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACvD,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAClB,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO;YACL,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,SAAS;YACT,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;SACzC,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -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"}
|