claude-crap 0.3.7 → 0.4.0
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/CHANGELOG.md +33 -0
- package/README.md +74 -7
- package/dist/adapters/common.d.ts +1 -1
- package/dist/adapters/common.d.ts.map +1 -1
- package/dist/adapters/common.js +1 -1
- package/dist/adapters/common.js.map +1 -1
- package/dist/adapters/dart-analyzer.d.ts +41 -0
- package/dist/adapters/dart-analyzer.d.ts.map +1 -0
- package/dist/adapters/dart-analyzer.js +120 -0
- package/dist/adapters/dart-analyzer.js.map +1 -0
- package/dist/adapters/dotnet-format.d.ts +35 -0
- package/dist/adapters/dotnet-format.d.ts.map +1 -0
- package/dist/adapters/dotnet-format.js +96 -0
- package/dist/adapters/dotnet-format.js.map +1 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/crap-config.d.ts +4 -0
- package/dist/crap-config.d.ts.map +1 -1
- package/dist/crap-config.js +51 -28
- package/dist/crap-config.js.map +1 -1
- package/dist/dashboard/file-detail.d.ts.map +1 -1
- package/dist/dashboard/file-detail.js.map +1 -1
- package/dist/dashboard/server.d.ts +2 -0
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +7 -12
- package/dist/dashboard/server.js.map +1 -1
- package/dist/index.js +89 -5
- package/dist/index.js.map +1 -1
- package/dist/metrics/workspace-walker.d.ts +4 -1
- package/dist/metrics/workspace-walker.d.ts.map +1 -1
- package/dist/metrics/workspace-walker.js +12 -28
- package/dist/metrics/workspace-walker.js.map +1 -1
- package/dist/monorepo/project-map.d.ts +112 -0
- package/dist/monorepo/project-map.d.ts.map +1 -0
- package/dist/monorepo/project-map.js +384 -0
- package/dist/monorepo/project-map.js.map +1 -0
- package/dist/scanner/auto-scan.d.ts +1 -0
- package/dist/scanner/auto-scan.d.ts.map +1 -1
- package/dist/scanner/auto-scan.js +14 -5
- package/dist/scanner/auto-scan.js.map +1 -1
- package/dist/scanner/bootstrap.d.ts +1 -1
- package/dist/scanner/bootstrap.d.ts.map +1 -1
- package/dist/scanner/bootstrap.js +15 -1
- package/dist/scanner/bootstrap.js.map +1 -1
- package/dist/scanner/complexity-scanner.d.ts +2 -0
- package/dist/scanner/complexity-scanner.d.ts.map +1 -1
- package/dist/scanner/complexity-scanner.js +11 -26
- package/dist/scanner/complexity-scanner.js.map +1 -1
- package/dist/scanner/detector.d.ts +24 -4
- package/dist/scanner/detector.d.ts.map +1 -1
- package/dist/scanner/detector.js +110 -10
- package/dist/scanner/detector.js.map +1 -1
- package/dist/scanner/runner.d.ts +4 -1
- package/dist/scanner/runner.d.ts.map +1 -1
- package/dist/scanner/runner.js +25 -3
- package/dist/scanner/runner.js.map +1 -1
- package/dist/schemas/tool-schemas.d.ts +16 -1
- package/dist/schemas/tool-schemas.d.ts.map +1 -1
- package/dist/schemas/tool-schemas.js +16 -1
- package/dist/schemas/tool-schemas.js.map +1 -1
- package/dist/shared/exclusions.d.ts +53 -0
- package/dist/shared/exclusions.d.ts.map +1 -0
- package/dist/shared/exclusions.js +126 -0
- package/dist/shared/exclusions.js.map +1 -0
- package/package.json +3 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +37 -0
- package/plugin/bundle/mcp-server.mjs +762 -144
- package/plugin/bundle/mcp-server.mjs.map +4 -4
- package/plugin/package-lock.json +15 -2
- package/plugin/package.json +2 -1
- package/scripts/bundle-plugin.mjs +2 -1
- package/src/adapters/common.ts +1 -1
- package/src/adapters/dart-analyzer.ts +161 -0
- package/src/adapters/dotnet-format.ts +125 -0
- package/src/adapters/index.ts +8 -0
- package/src/crap-config.ts +78 -18
- package/src/dashboard/file-detail.ts +0 -2
- package/src/dashboard/server.ts +9 -10
- package/src/index.ts +103 -5
- package/src/metrics/workspace-walker.ts +15 -27
- package/src/monorepo/project-map.ts +476 -0
- package/src/scanner/auto-scan.ts +17 -6
- package/src/scanner/bootstrap.ts +18 -1
- package/src/scanner/complexity-scanner.ts +15 -26
- package/src/scanner/detector.ts +119 -10
- package/src/scanner/runner.ts +25 -2
- package/src/schemas/tool-schemas.ts +17 -1
- package/src/shared/exclusions.ts +156 -0
- package/src/tests/adapters/dispatch.test.ts +2 -2
- package/src/tests/auto-scan.test.ts +2 -2
- package/src/tests/boot-monorepo.test.ts +804 -0
- package/src/tests/boot-scanner-detection.test.ts +692 -0
- package/src/tests/boot-single-project.test.ts +780 -0
- package/src/tests/exclusions.test.ts +117 -0
- package/src/tests/integration/mcp-server.integration.test.ts +2 -1
- package/src/tests/project-map.test.ts +302 -0
- package/src/tests/scanner-detector.test.ts +31 -11
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import { existsSync } from "node:fs";
|
|
22
22
|
import { join } from "node:path";
|
|
23
|
-
import { detectScanners } from "./detector.js";
|
|
23
|
+
import { detectScanners, detectMonorepoScanners } from "./detector.js";
|
|
24
24
|
import { runScanner } from "./runner.js";
|
|
25
25
|
import { bootstrapScanner } from "./bootstrap.js";
|
|
26
26
|
import { scanComplexity } from "./complexity-scanner.js";
|
|
@@ -55,11 +55,20 @@ function ingestScannerRun(scanner, rawOutput, sarifStore) {
|
|
|
55
55
|
*/
|
|
56
56
|
export async function autoScan(workspaceRoot, sarifStore, logger, options) {
|
|
57
57
|
const start = Date.now();
|
|
58
|
-
// 1. Detect available scanners
|
|
58
|
+
// 1. Detect available scanners (root + monorepo subdirs)
|
|
59
59
|
const detected = await detectScanners(workspaceRoot);
|
|
60
|
+
const monorepoDetected = await detectMonorepoScanners(workspaceRoot);
|
|
61
|
+
// Merge monorepo detections — skip duplicates (same scanner already found at root)
|
|
62
|
+
const rootScannerSet = new Set(detected.filter((d) => d.available).map((d) => d.scanner));
|
|
63
|
+
for (const md of monorepoDetected) {
|
|
64
|
+
if (!rootScannerSet.has(md.scanner)) {
|
|
65
|
+
detected.push(md);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
60
68
|
const available = detected.filter((d) => d.available);
|
|
61
69
|
logger.info({
|
|
62
70
|
detected: detected.map((d) => `${d.scanner}:${d.available}`),
|
|
71
|
+
monorepo: monorepoDetected.length,
|
|
63
72
|
available: available.length,
|
|
64
73
|
}, "auto-scan: detection complete");
|
|
65
74
|
// If ESLint is detected (e.g. in package.json) but has no config file,
|
|
@@ -103,8 +112,8 @@ export async function autoScan(workspaceRoot, sarifStore, logger, options) {
|
|
|
103
112
|
totalDurationMs: Date.now() - start,
|
|
104
113
|
};
|
|
105
114
|
}
|
|
106
|
-
// 2. Run all available scanners in parallel
|
|
107
|
-
const runResults = await Promise.allSettled(available.map((d) => runScanner(d.scanner, workspaceRoot)));
|
|
115
|
+
// 2. Run all available scanners in parallel (each from its detected workingDir)
|
|
116
|
+
const runResults = await Promise.allSettled(available.map((d) => runScanner(d.scanner, workspaceRoot, d.workingDir ? { workingDir: d.workingDir } : undefined)));
|
|
108
117
|
// 3. Ingest results
|
|
109
118
|
const results = [];
|
|
110
119
|
let totalFindings = 0;
|
|
@@ -169,7 +178,7 @@ export async function autoScan(workspaceRoot, sarifStore, logger, options) {
|
|
|
169
178
|
let complexityScan;
|
|
170
179
|
if (options?.engine) {
|
|
171
180
|
try {
|
|
172
|
-
complexityScan = await scanComplexity(workspaceRoot, options.engine, sarifStore, { cyclomaticMax: options.cyclomaticMax ?? 15 }, logger);
|
|
181
|
+
complexityScan = await scanComplexity(workspaceRoot, options.engine, sarifStore, { cyclomaticMax: options.cyclomaticMax ?? 15, ...(options.exclude ? { exclude: options.exclude } : {}) }, logger);
|
|
173
182
|
totalFindings += complexityScan.violations;
|
|
174
183
|
}
|
|
175
184
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-scan.js","sourceRoot":"","sources":["../../src/scanner/auto-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,cAAc,EAAyB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-scan.js","sourceRoot":"","sources":["../../src/scanner/auto-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,7 +27,7 @@ import type { SarifStore } from "../sarif/sarif-store.js";
|
|
|
27
27
|
/**
|
|
28
28
|
* Detected project type, aligned with tree-sitter supported languages.
|
|
29
29
|
*/
|
|
30
|
-
export type ProjectType = "javascript" | "typescript" | "python" | "java" | "csharp" | "unknown";
|
|
30
|
+
export type ProjectType = "javascript" | "typescript" | "python" | "java" | "csharp" | "dart" | "unknown";
|
|
31
31
|
/**
|
|
32
32
|
* A single step in the bootstrap process.
|
|
33
33
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/scanner/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAKnC,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAI1D;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,YAAY,GACZ,YAAY,GACZ,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,SAAS,CAAC;AAEd;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,WAAW,EAAE,WAAW,CAAC;IACzB,0EAA0E;IAC1E,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qDAAqD;IACrD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kEAAkE;IAClE,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,iEAAiE;IACjE,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/scanner/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAKnC,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAI1D;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,YAAY,GACZ,YAAY,GACZ,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,MAAM,GACN,SAAS,CAAC;AAEd;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,WAAW,EAAE,WAAW,CAAC;IACzB,0EAA0E;IAC1E,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qDAAqD;IACrD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kEAAkE;IAClE,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,iEAAiE;IACjE,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,CAkCpE;AAID;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,CAsClE;AAoID;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CA2I1B"}
|
|
@@ -63,6 +63,9 @@ export function detectProjectType(workspaceRoot) {
|
|
|
63
63
|
catch {
|
|
64
64
|
// readdirSync can fail on permissions — fall through
|
|
65
65
|
}
|
|
66
|
+
// Dart / Flutter detection
|
|
67
|
+
if (has("pubspec.yaml"))
|
|
68
|
+
return "dart";
|
|
66
69
|
return "unknown";
|
|
67
70
|
}
|
|
68
71
|
// ── ESLint config generation ───────────────────────────────────────
|
|
@@ -182,12 +185,23 @@ function getRecommendation(projectType) {
|
|
|
182
185
|
installInstructions: "pip install bandit (or: pipx install bandit, poetry add --group dev bandit)",
|
|
183
186
|
};
|
|
184
187
|
case "java":
|
|
185
|
-
case "csharp":
|
|
186
188
|
return {
|
|
187
189
|
scanner: "semgrep",
|
|
188
190
|
canAutoInstall: false,
|
|
189
191
|
installInstructions: "brew install semgrep (or: pip install semgrep, pipx install semgrep)",
|
|
190
192
|
};
|
|
193
|
+
case "csharp":
|
|
194
|
+
return {
|
|
195
|
+
scanner: "dotnet_format",
|
|
196
|
+
canAutoInstall: false,
|
|
197
|
+
installInstructions: "Install the .NET SDK: https://dotnet.microsoft.com/download",
|
|
198
|
+
};
|
|
199
|
+
case "dart":
|
|
200
|
+
return {
|
|
201
|
+
scanner: "dart_analyze",
|
|
202
|
+
canAutoInstall: false,
|
|
203
|
+
installInstructions: "Install the Dart SDK: https://dart.dev/get-dart (or Flutter SDK which includes Dart)",
|
|
204
|
+
};
|
|
191
205
|
case "unknown":
|
|
192
206
|
return {
|
|
193
207
|
scanner: "semgrep",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/scanner/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/scanner/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,8 @@ export interface ComplexityScanResult {
|
|
|
34
34
|
export interface ComplexityScanConfig {
|
|
35
35
|
/** Maximum cyclomatic complexity allowed per function. */
|
|
36
36
|
readonly cyclomaticMax: number;
|
|
37
|
+
/** User-defined exclusion patterns from .claude-crap.json. */
|
|
38
|
+
readonly exclude?: ReadonlyArray<string>;
|
|
37
39
|
}
|
|
38
40
|
/**
|
|
39
41
|
* Scan a workspace for cyclomatic complexity violations.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"complexity-scanner.d.ts","sourceRoot":"","sources":["../../src/scanner/complexity-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"complexity-scanner.d.ts","sourceRoot":"","sources":["../../src/scanner/complexity-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAIhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAgB1D,uCAAuC;AACvC,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,wDAAwD;IACxD,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,uDAAuD;IACvD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,6CAA6C;AAC7C,MAAM,WAAW,oBAAoB;IACnC,0DAA0D;IAC1D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC1C;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC,CAyF/B"}
|
|
@@ -20,24 +20,8 @@ import { promises as fs } from "node:fs";
|
|
|
20
20
|
import { join, relative } from "node:path";
|
|
21
21
|
import { detectLanguageFromPath } from "../ast/language-config.js";
|
|
22
22
|
import { wrapResultsInSarif, estimateEffortMinutes } from "../adapters/common.js";
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const SKIP_DIRS = new Set([
|
|
26
|
-
"node_modules",
|
|
27
|
-
".git",
|
|
28
|
-
"dist",
|
|
29
|
-
"build",
|
|
30
|
-
"out",
|
|
31
|
-
"target",
|
|
32
|
-
".venv",
|
|
33
|
-
"venv",
|
|
34
|
-
"__pycache__",
|
|
35
|
-
".cache",
|
|
36
|
-
".next",
|
|
37
|
-
".nuxt",
|
|
38
|
-
".claude-crap",
|
|
39
|
-
".codesight",
|
|
40
|
-
]);
|
|
23
|
+
import { createExclusionFilter } from "../shared/exclusions.js";
|
|
24
|
+
// Directory exclusions are now centralized in src/shared/exclusions.ts.
|
|
41
25
|
/** Hard cap on files to prevent unbounded analysis. */
|
|
42
26
|
const MAX_FILES = 20_000;
|
|
43
27
|
/** SARIF rule ID for cyclomatic complexity violations. */
|
|
@@ -65,7 +49,8 @@ export async function scanComplexity(workspaceRoot, engine, sarifStore, config,
|
|
|
65
49
|
const threshold = config.cyclomaticMax;
|
|
66
50
|
const errorThreshold = threshold * 2;
|
|
67
51
|
// 1. Collect supported source files
|
|
68
|
-
const
|
|
52
|
+
const filter = createExclusionFilter(config.exclude);
|
|
53
|
+
const files = await collectSourceFiles(workspaceRoot, filter);
|
|
69
54
|
logger.info({ fileCount: files.length, threshold }, "complexity-scanner: starting analysis");
|
|
70
55
|
// 2. Analyze each file and collect violations
|
|
71
56
|
const sarifResults = [];
|
|
@@ -130,10 +115,10 @@ export async function scanComplexity(workspaceRoot, engine, sarifStore, config,
|
|
|
130
115
|
// ── File walker ───────────────────────────────────────────────────
|
|
131
116
|
/**
|
|
132
117
|
* Collect source files from the workspace that the tree-sitter engine
|
|
133
|
-
* can analyze.
|
|
134
|
-
* Only returns files whose extension maps to a supported language.
|
|
118
|
+
* can analyze. Uses the shared exclusion filter for directory and file
|
|
119
|
+
* filtering. Only returns files whose extension maps to a supported language.
|
|
135
120
|
*/
|
|
136
|
-
async function collectSourceFiles(workspaceRoot) {
|
|
121
|
+
async function collectSourceFiles(workspaceRoot, filter) {
|
|
137
122
|
const files = [];
|
|
138
123
|
let truncated = false;
|
|
139
124
|
async function walk(dir) {
|
|
@@ -149,20 +134,20 @@ async function collectSourceFiles(workspaceRoot) {
|
|
|
149
134
|
for (const entry of entries) {
|
|
150
135
|
if (truncated)
|
|
151
136
|
return;
|
|
152
|
-
if (entry.name.startsWith(".") && entry.name !== ".claude-plugin")
|
|
153
|
-
continue;
|
|
154
137
|
const full = join(dir, entry.name);
|
|
155
138
|
if (entry.isDirectory()) {
|
|
156
|
-
if (
|
|
139
|
+
if (filter.shouldSkipDir(entry.name))
|
|
157
140
|
continue;
|
|
158
141
|
await walk(full);
|
|
159
142
|
continue;
|
|
160
143
|
}
|
|
161
144
|
if (!entry.isFile())
|
|
162
145
|
continue;
|
|
163
|
-
// Only include files the tree-sitter engine can parse
|
|
164
146
|
if (!detectLanguageFromPath(entry.name))
|
|
165
147
|
continue;
|
|
148
|
+
const relPath = relative(workspaceRoot, full);
|
|
149
|
+
if (filter.shouldSkipFile(relPath, entry.name))
|
|
150
|
+
continue;
|
|
166
151
|
files.push(full);
|
|
167
152
|
if (files.length >= MAX_FILES) {
|
|
168
153
|
truncated = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"complexity-scanner.js","sourceRoot":"","sources":["../../src/scanner/complexity-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAI3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"complexity-scanner.js","sourceRoot":"","sources":["../../src/scanner/complexity-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,8 @@ export interface ScannerDetection {
|
|
|
29
29
|
reason: string;
|
|
30
30
|
/** Path to the config file that triggered detection, if any. */
|
|
31
31
|
configPath?: string;
|
|
32
|
+
/** Working directory to run the scanner from (defaults to workspace root). */
|
|
33
|
+
workingDir?: string;
|
|
32
34
|
}
|
|
33
35
|
/**
|
|
34
36
|
* Config file globs and package.json keys per scanner. Order matters:
|
|
@@ -41,13 +43,31 @@ interface ScannerSignals {
|
|
|
41
43
|
}
|
|
42
44
|
declare const SCANNER_SIGNALS: Record<KnownScanner, ScannerSignals>;
|
|
43
45
|
/**
|
|
44
|
-
* Detect which
|
|
45
|
-
*
|
|
46
|
-
*
|
|
46
|
+
* Detect which supported scanners are available in the given workspace.
|
|
47
|
+
* Probes config files, package.json, and binary availability in order,
|
|
48
|
+
* short-circuiting on first match.
|
|
47
49
|
*
|
|
48
50
|
* @param workspaceRoot Absolute path to the project root.
|
|
49
51
|
* @returns One {@link ScannerDetection} per known scanner.
|
|
50
52
|
*/
|
|
51
53
|
export declare function detectScanners(workspaceRoot: string): Promise<ScannerDetection[]>;
|
|
52
|
-
|
|
54
|
+
/**
|
|
55
|
+
* Common monorepo directory names that may contain workspace
|
|
56
|
+
* subdirectories. Checked one level deep only.
|
|
57
|
+
*/
|
|
58
|
+
declare const MONOREPO_DIRS: string[];
|
|
59
|
+
/**
|
|
60
|
+
* Detect scanners in monorepo subdirectories. Probes first-level
|
|
61
|
+
* children of common monorepo directories (apps/, packages/, etc.)
|
|
62
|
+
* and npm workspaces for scanner config files. Returns detections
|
|
63
|
+
* with a `workingDir` pointing to the subdirectory.
|
|
64
|
+
*
|
|
65
|
+
* This catches e.g. `apps/mobile/pubspec.yaml` in a polyglot monorepo
|
|
66
|
+
* where the root-level detector only finds ESLint.
|
|
67
|
+
*
|
|
68
|
+
* @param workspaceRoot Absolute path to the project root.
|
|
69
|
+
* @returns Additional detections from subdirectories (may be empty).
|
|
70
|
+
*/
|
|
71
|
+
export declare function detectMonorepoScanners(workspaceRoot: string): Promise<ScannerDetection[]>;
|
|
72
|
+
export { SCANNER_SIGNALS, MONOREPO_DIRS };
|
|
53
73
|
//# sourceMappingURL=detector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/scanner/detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,OAAO,EAAE,YAAY,CAAC;IACtB,4DAA4D;IAC5D,SAAS,EAAE,OAAO,CAAC;IACnB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID;;;GAGG;AACH,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,QAAA,MAAM,eAAe,EAAE,MAAM,CAAC,YAAY,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/scanner/detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,OAAO,EAAE,YAAY,CAAC;IACtB,4DAA4D;IAC5D,SAAS,EAAE,OAAO,CAAC;IACnB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID;;;GAGG;AACH,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,QAAA,MAAM,eAAe,EAAE,MAAM,CAAC,YAAY,EAAE,cAAc,CA6DzD,CAAC;AAgEF;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoD7B;AAID;;;GAGG;AACH,QAAA,MAAM,aAAa,UAAsD,CAAC;AAE1E;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAC1C,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAgE7B;AAGD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/scanner/detector.js
CHANGED
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
*
|
|
17
17
|
* @module scanner/detector
|
|
18
18
|
*/
|
|
19
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
20
|
-
import { join } from "node:path";
|
|
19
|
+
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
20
|
+
import { join, resolve } from "node:path";
|
|
21
21
|
import { execFile } from "node:child_process";
|
|
22
22
|
const SCANNER_SIGNALS = {
|
|
23
23
|
eslint: {
|
|
@@ -67,6 +67,19 @@ const SCANNER_SIGNALS = {
|
|
|
67
67
|
packageJsonKeys: ["@stryker-mutator/core"],
|
|
68
68
|
binaryNames: ["stryker"],
|
|
69
69
|
},
|
|
70
|
+
dart_analyze: {
|
|
71
|
+
configFiles: [
|
|
72
|
+
"analysis_options.yaml",
|
|
73
|
+
"pubspec.yaml",
|
|
74
|
+
],
|
|
75
|
+
packageJsonKeys: [],
|
|
76
|
+
binaryNames: ["dart"],
|
|
77
|
+
},
|
|
78
|
+
dotnet_format: {
|
|
79
|
+
configFiles: [],
|
|
80
|
+
packageJsonKeys: [],
|
|
81
|
+
binaryNames: ["dotnet"],
|
|
82
|
+
},
|
|
70
83
|
};
|
|
71
84
|
// ── Probes ──────────────────────────────────────────────────────────
|
|
72
85
|
/**
|
|
@@ -121,15 +134,15 @@ function probeBinary(binaryName) {
|
|
|
121
134
|
}
|
|
122
135
|
// ── Public API ──────────────────────────────────────────────────────
|
|
123
136
|
/**
|
|
124
|
-
* Detect which
|
|
125
|
-
*
|
|
126
|
-
*
|
|
137
|
+
* Detect which supported scanners are available in the given workspace.
|
|
138
|
+
* Probes config files, package.json, and binary availability in order,
|
|
139
|
+
* short-circuiting on first match.
|
|
127
140
|
*
|
|
128
141
|
* @param workspaceRoot Absolute path to the project root.
|
|
129
142
|
* @returns One {@link ScannerDetection} per known scanner.
|
|
130
143
|
*/
|
|
131
144
|
export async function detectScanners(workspaceRoot) {
|
|
132
|
-
const scanners = ["eslint", "semgrep", "bandit", "stryker"];
|
|
145
|
+
const scanners = ["eslint", "semgrep", "bandit", "stryker", "dart_analyze", "dotnet_format"];
|
|
133
146
|
const results = await Promise.all(scanners.map(async (scanner) => {
|
|
134
147
|
// 1. Config file probe (fastest)
|
|
135
148
|
const configProbe = probeConfigFiles(workspaceRoot, scanner);
|
|
@@ -141,12 +154,18 @@ export async function detectScanners(workspaceRoot) {
|
|
|
141
154
|
configPath: configProbe.path,
|
|
142
155
|
};
|
|
143
156
|
}
|
|
144
|
-
// 2. Package.json probe
|
|
157
|
+
// 2. Package.json probe — declared in deps/devDeps, but is it
|
|
158
|
+
// actually installed? Check node_modules/.bin/ for the binary.
|
|
145
159
|
if (probePackageJson(workspaceRoot, scanner)) {
|
|
160
|
+
const binName = SCANNER_SIGNALS[scanner].binaryNames[0];
|
|
161
|
+
const binPath = binName ? join(workspaceRoot, "node_modules", ".bin", binName) : null;
|
|
162
|
+
const installed = binPath !== null && existsSync(binPath);
|
|
146
163
|
return {
|
|
147
164
|
scanner,
|
|
148
|
-
available:
|
|
149
|
-
reason:
|
|
165
|
+
available: installed,
|
|
166
|
+
reason: installed
|
|
167
|
+
? "found in package.json and installed"
|
|
168
|
+
: `found in package.json but not installed (run \`npm install\`)`,
|
|
150
169
|
};
|
|
151
170
|
}
|
|
152
171
|
// 3. Binary probe (slowest)
|
|
@@ -168,6 +187,87 @@ export async function detectScanners(workspaceRoot) {
|
|
|
168
187
|
}));
|
|
169
188
|
return results;
|
|
170
189
|
}
|
|
190
|
+
// ── Monorepo subdirectory probing ────────────────────────────────
|
|
191
|
+
/**
|
|
192
|
+
* Common monorepo directory names that may contain workspace
|
|
193
|
+
* subdirectories. Checked one level deep only.
|
|
194
|
+
*/
|
|
195
|
+
const MONOREPO_DIRS = ["apps", "packages", "libs", "modules", "services"];
|
|
196
|
+
/**
|
|
197
|
+
* Detect scanners in monorepo subdirectories. Probes first-level
|
|
198
|
+
* children of common monorepo directories (apps/, packages/, etc.)
|
|
199
|
+
* and npm workspaces for scanner config files. Returns detections
|
|
200
|
+
* with a `workingDir` pointing to the subdirectory.
|
|
201
|
+
*
|
|
202
|
+
* This catches e.g. `apps/mobile/pubspec.yaml` in a polyglot monorepo
|
|
203
|
+
* where the root-level detector only finds ESLint.
|
|
204
|
+
*
|
|
205
|
+
* @param workspaceRoot Absolute path to the project root.
|
|
206
|
+
* @returns Additional detections from subdirectories (may be empty).
|
|
207
|
+
*/
|
|
208
|
+
export async function detectMonorepoScanners(workspaceRoot) {
|
|
209
|
+
const subdirs = new Set();
|
|
210
|
+
// 1. Read npm workspaces from package.json
|
|
211
|
+
try {
|
|
212
|
+
const pkgPath = join(workspaceRoot, "package.json");
|
|
213
|
+
const raw = readFileSync(pkgPath, "utf-8");
|
|
214
|
+
const pkg = JSON.parse(raw);
|
|
215
|
+
if (Array.isArray(pkg.workspaces)) {
|
|
216
|
+
for (const ws of pkg.workspaces) {
|
|
217
|
+
if (typeof ws === "string" && !ws.includes("*")) {
|
|
218
|
+
const full = resolve(workspaceRoot, ws);
|
|
219
|
+
if (existsSync(full))
|
|
220
|
+
subdirs.add(full);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
// No package.json or not parseable — continue
|
|
227
|
+
}
|
|
228
|
+
// 2. Scan common monorepo directories one level deep
|
|
229
|
+
for (const dir of MONOREPO_DIRS) {
|
|
230
|
+
const full = join(workspaceRoot, dir);
|
|
231
|
+
try {
|
|
232
|
+
const entries = readdirSync(full, { withFileTypes: true });
|
|
233
|
+
for (const entry of entries) {
|
|
234
|
+
if (entry.isDirectory() && !entry.name.startsWith(".")) {
|
|
235
|
+
subdirs.add(join(full, entry.name));
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
// Directory doesn't exist — skip
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (subdirs.size === 0)
|
|
244
|
+
return [];
|
|
245
|
+
// 3. Probe each subdirectory for scanner config files
|
|
246
|
+
const detections = [];
|
|
247
|
+
const scanners = ["eslint", "semgrep", "bandit", "stryker", "dart_analyze", "dotnet_format"];
|
|
248
|
+
for (const subdir of subdirs) {
|
|
249
|
+
for (const scanner of scanners) {
|
|
250
|
+
const configProbe = probeConfigFiles(subdir, scanner);
|
|
251
|
+
if (!configProbe.found)
|
|
252
|
+
continue;
|
|
253
|
+
// For dart_analyze, also verify the binary is on PATH
|
|
254
|
+
if (scanner === "dart_analyze") {
|
|
255
|
+
const hasBinary = await probeBinary("dart");
|
|
256
|
+
if (!hasBinary)
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
const relDir = subdir.replace(workspaceRoot + "/", "");
|
|
260
|
+
detections.push({
|
|
261
|
+
scanner,
|
|
262
|
+
available: true,
|
|
263
|
+
reason: `config file found in ${relDir}/`,
|
|
264
|
+
...(configProbe.path ? { configPath: configProbe.path } : {}),
|
|
265
|
+
workingDir: subdir,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return detections;
|
|
270
|
+
}
|
|
171
271
|
// Exported for testing
|
|
172
|
-
export { SCANNER_SIGNALS };
|
|
272
|
+
export { SCANNER_SIGNALS, MONOREPO_DIRS };
|
|
173
273
|
//# sourceMappingURL=detector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/scanner/detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/scanner/detector.ts"],"names":[],"mappings":"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"}
|
package/dist/scanner/runner.d.ts
CHANGED
|
@@ -52,8 +52,11 @@ declare function getScannerCommand(scanner: KnownScanner, workspaceRoot: string)
|
|
|
52
52
|
*
|
|
53
53
|
* @param scanner Which scanner to run.
|
|
54
54
|
* @param workspaceRoot Absolute path to the project root (used as cwd).
|
|
55
|
+
* @param options Optional overrides.
|
|
55
56
|
* @returns A {@link ScannerRunResult} with stdout or file output.
|
|
56
57
|
*/
|
|
57
|
-
export declare function runScanner(scanner: KnownScanner, workspaceRoot: string
|
|
58
|
+
export declare function runScanner(scanner: KnownScanner, workspaceRoot: string, options?: {
|
|
59
|
+
workingDir?: string;
|
|
60
|
+
}): Promise<ScannerRunResult>;
|
|
58
61
|
export { getScannerCommand, type ScannerCommand };
|
|
59
62
|
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/scanner/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,OAAO,EAAE,YAAY,CAAC;IACtB,iEAAiE;IACjE,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,UAAU,cAAc;IACtB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,eAAe,EAAE,OAAO,CAAC;IACzB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,iBAAS,iBAAiB,CACxB,OAAO,EAAE,YAAY,EACrB,aAAa,EAAE,MAAM,GACpB,cAAc,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/scanner/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,OAAO,EAAE,YAAY,CAAC;IACtB,iEAAiE;IACjE,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,UAAU,cAAc;IACtB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,eAAe,EAAE,OAAO,CAAC;IACzB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,iBAAS,iBAAiB,CACxB,OAAO,EAAE,YAAY,EACrB,aAAa,EAAE,MAAM,GACpB,cAAc,CAoDhB;AAID;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,YAAY,EACrB,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChC,OAAO,CAAC,gBAAgB,CAAC,CA2G3B;AAGD,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,CAAC"}
|
package/dist/scanner/runner.js
CHANGED
|
@@ -52,6 +52,26 @@ function getScannerCommand(scanner, workspaceRoot) {
|
|
|
52
52
|
nonZeroIsNormal: false,
|
|
53
53
|
outputFile: join(workspaceRoot, "reports", "mutation", "mutation.json"),
|
|
54
54
|
};
|
|
55
|
+
case "dart_analyze":
|
|
56
|
+
return {
|
|
57
|
+
command: "dart",
|
|
58
|
+
args: ["analyze", "--format=json", "."],
|
|
59
|
+
timeoutMs: 120_000,
|
|
60
|
+
nonZeroIsNormal: true, // exits 3 when findings exist
|
|
61
|
+
};
|
|
62
|
+
case "dotnet_format":
|
|
63
|
+
return {
|
|
64
|
+
command: "dotnet",
|
|
65
|
+
args: [
|
|
66
|
+
"format",
|
|
67
|
+
"--verify-no-changes",
|
|
68
|
+
"--report",
|
|
69
|
+
join(workspaceRoot, ".claude-crap", "dotnet-report.json"),
|
|
70
|
+
],
|
|
71
|
+
timeoutMs: 120_000,
|
|
72
|
+
nonZeroIsNormal: true,
|
|
73
|
+
outputFile: join(workspaceRoot, ".claude-crap", "dotnet-report.json"),
|
|
74
|
+
};
|
|
55
75
|
}
|
|
56
76
|
}
|
|
57
77
|
// ── Public API ──────────────────────────────────────────────────────
|
|
@@ -60,14 +80,16 @@ function getScannerCommand(scanner, workspaceRoot) {
|
|
|
60
80
|
*
|
|
61
81
|
* @param scanner Which scanner to run.
|
|
62
82
|
* @param workspaceRoot Absolute path to the project root (used as cwd).
|
|
83
|
+
* @param options Optional overrides.
|
|
63
84
|
* @returns A {@link ScannerRunResult} with stdout or file output.
|
|
64
85
|
*/
|
|
65
|
-
export function runScanner(scanner, workspaceRoot) {
|
|
86
|
+
export function runScanner(scanner, workspaceRoot, options) {
|
|
66
87
|
const start = Date.now();
|
|
67
|
-
const
|
|
88
|
+
const cwd = options?.workingDir ?? workspaceRoot;
|
|
89
|
+
const cmd = getScannerCommand(scanner, cwd);
|
|
68
90
|
return new Promise((resolve) => {
|
|
69
91
|
execFile(cmd.command, cmd.args, {
|
|
70
|
-
cwd
|
|
92
|
+
cwd,
|
|
71
93
|
timeout: cmd.timeoutMs,
|
|
72
94
|
maxBuffer: 50 * 1024 * 1024, // 50 MB — large codebases produce verbose output
|
|
73
95
|
env: { ...process.env, FORCE_COLOR: "0" }, // suppress ANSI in output
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/scanner/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAoCjC,SAAS,iBAAiB,CACxB,OAAqB,EACrB,aAAqB;IAErB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC;gBACnC,SAAS,EAAE,OAAO;gBAClB,eAAe,EAAE,IAAI;aACtB,CAAC;QACJ,KAAK,SAAS;YACZ,OAAO;gBACL,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC;gBACjC,SAAS,EAAE,OAAO;gBAClB,eAAe,EAAE,KAAK;aACvB,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,OAAO,EAAE,QAAQ;gBACjB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;gBACrC,SAAS,EAAE,OAAO;gBAClB,eAAe,EAAE,IAAI;aACtB,CAAC;QACJ,KAAK,SAAS;YACZ,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC;gBACxB,SAAS,EAAE,OAAO;gBAClB,eAAe,EAAE,KAAK;gBACtB,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC;aACxE,CAAC;IACN,CAAC;AACH,CAAC;AAED,uEAAuE;AAEvE
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/scanner/runner.ts"],"names":[],"mappings":"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"}
|