claude-crap 0.3.6 → 0.3.8
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/README.md +25 -0
- 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/index.d.ts +1 -0
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +4 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/crap-config.d.ts +2 -0
- package/dist/crap-config.d.ts.map +1 -1
- package/dist/crap-config.js +36 -28
- package/dist/crap-config.js.map +1 -1
- package/dist/dashboard/file-detail.d.ts +77 -0
- package/dist/dashboard/file-detail.d.ts.map +1 -0
- package/dist/dashboard/file-detail.js +120 -0
- package/dist/dashboard/file-detail.js.map +1 -0
- package/dist/dashboard/server.d.ts +5 -0
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +103 -1
- package/dist/dashboard/server.js.map +1 -1
- package/dist/index.js +36 -4
- 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/scanner/auto-scan.d.ts +9 -1
- package/dist/scanner/auto-scan.d.ts.map +1 -1
- package/dist/scanner/auto-scan.js +27 -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 +9 -0
- package/dist/scanner/bootstrap.js.map +1 -1
- package/dist/scanner/complexity-scanner.d.ts +56 -0
- package/dist/scanner/complexity-scanner.d.ts.map +1 -0
- package/dist/scanner/complexity-scanner.js +161 -0
- package/dist/scanner/complexity-scanner.js.map +1 -0
- package/dist/scanner/detector.d.ts +24 -4
- package/dist/scanner/detector.d.ts.map +1 -1
- package/dist/scanner/detector.js +105 -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 +12 -3
- package/dist/scanner/runner.js.map +1 -1
- package/dist/schemas/tool-schemas.d.ts +1 -1
- package/dist/schemas/tool-schemas.js +1 -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/bundle/dashboard/public/index.html +432 -12
- package/plugin/bundle/mcp-server.mjs +747 -137
- 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/index.ts +4 -0
- package/src/crap-config.ts +55 -18
- package/src/dashboard/file-detail.ts +195 -0
- package/src/dashboard/public/index.html +432 -12
- package/src/dashboard/server.ts +140 -1
- package/src/index.ts +37 -4
- package/src/metrics/workspace-walker.ts +15 -27
- package/src/scanner/auto-scan.ts +41 -4
- package/src/scanner/bootstrap.ts +11 -0
- package/src/scanner/complexity-scanner.ts +222 -0
- package/src/scanner/detector.ts +114 -10
- package/src/scanner/runner.ts +12 -2
- package/src/schemas/tool-schemas.ts +1 -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/complexity-scanner.test.ts +263 -0
- package/src/tests/exclusions.test.ts +117 -0
- package/src/tests/file-detail-api.test.ts +258 -0
- package/src/tests/scanner-detector.test.ts +31 -11
|
@@ -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;AA8HD;;;;;;;;;;;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 ───────────────────────────────────────
|
|
@@ -188,6 +191,12 @@ function getRecommendation(projectType) {
|
|
|
188
191
|
canAutoInstall: false,
|
|
189
192
|
installInstructions: "brew install semgrep (or: pip install semgrep, pipx install semgrep)",
|
|
190
193
|
};
|
|
194
|
+
case "dart":
|
|
195
|
+
return {
|
|
196
|
+
scanner: "dart_analyze",
|
|
197
|
+
canAutoInstall: false,
|
|
198
|
+
installInstructions: "Install the Dart SDK: https://dart.dev/get-dart (or Flutter SDK which includes Dart)",
|
|
199
|
+
};
|
|
191
200
|
case "unknown":
|
|
192
201
|
return {
|
|
193
202
|
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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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cyclomatic complexity scanner.
|
|
3
|
+
*
|
|
4
|
+
* Walks the workspace, analyzes each supported source file with
|
|
5
|
+
* tree-sitter, and emits SARIF findings for functions whose cyclomatic
|
|
6
|
+
* complexity exceeds the configured threshold (`cyclomaticMax`).
|
|
7
|
+
*
|
|
8
|
+
* This scanner is an internal analyzer — it is NOT a "known scanner"
|
|
9
|
+
* in the `KnownScanner` union (eslint/semgrep/bandit/stryker). It
|
|
10
|
+
* bypasses the adapter pipeline and writes SARIF directly via
|
|
11
|
+
* `wrapResultsInSarif()` from the common adapter helpers.
|
|
12
|
+
*
|
|
13
|
+
* Severity mapping:
|
|
14
|
+
* - `warning` — CC > threshold but < 2× threshold
|
|
15
|
+
* - `error` — CC >= 2× threshold (aligns with CRAP index hard block at CC >= 30)
|
|
16
|
+
*
|
|
17
|
+
* @module scanner/complexity-scanner
|
|
18
|
+
*/
|
|
19
|
+
import type { Logger } from "pino";
|
|
20
|
+
import { TreeSitterEngine } from "../ast/tree-sitter-engine.js";
|
|
21
|
+
import type { SarifStore } from "../sarif/sarif-store.js";
|
|
22
|
+
/** Result of a complexity scan run. */
|
|
23
|
+
export interface ComplexityScanResult {
|
|
24
|
+
/** Number of source files successfully analyzed. */
|
|
25
|
+
readonly filesScanned: number;
|
|
26
|
+
/** Total number of functions found across all files. */
|
|
27
|
+
readonly functionsAnalyzed: number;
|
|
28
|
+
/** Number of functions that exceeded the threshold. */
|
|
29
|
+
readonly violations: number;
|
|
30
|
+
/** Wall-clock time for the entire scan. */
|
|
31
|
+
readonly durationMs: number;
|
|
32
|
+
}
|
|
33
|
+
/** Configuration accepted by the scanner. */
|
|
34
|
+
export interface ComplexityScanConfig {
|
|
35
|
+
/** Maximum cyclomatic complexity allowed per function. */
|
|
36
|
+
readonly cyclomaticMax: number;
|
|
37
|
+
/** User-defined exclusion patterns from .claude-crap.json. */
|
|
38
|
+
readonly exclude?: ReadonlyArray<string>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Scan a workspace for cyclomatic complexity violations.
|
|
42
|
+
*
|
|
43
|
+
* Walks the directory tree, analyzes each source file with the
|
|
44
|
+
* tree-sitter engine, and emits SARIF findings for functions above
|
|
45
|
+
* the configured threshold. Findings are ingested into the provided
|
|
46
|
+
* `SarifStore` and persisted to disk.
|
|
47
|
+
*
|
|
48
|
+
* @param workspaceRoot Absolute path to the workspace root.
|
|
49
|
+
* @param engine Initialized tree-sitter engine instance.
|
|
50
|
+
* @param sarifStore Live SARIF store to ingest findings into.
|
|
51
|
+
* @param config Scanner configuration (threshold).
|
|
52
|
+
* @param logger Pino logger for progress and error reporting.
|
|
53
|
+
* @returns Summary of what was scanned and found.
|
|
54
|
+
*/
|
|
55
|
+
export declare function scanComplexity(workspaceRoot: string, engine: TreeSitterEngine, sarifStore: SarifStore, config: ComplexityScanConfig, logger: Logger): Promise<ComplexityScanResult>;
|
|
56
|
+
//# sourceMappingURL=complexity-scanner.d.ts.map
|
|
@@ -0,0 +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;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"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cyclomatic complexity scanner.
|
|
3
|
+
*
|
|
4
|
+
* Walks the workspace, analyzes each supported source file with
|
|
5
|
+
* tree-sitter, and emits SARIF findings for functions whose cyclomatic
|
|
6
|
+
* complexity exceeds the configured threshold (`cyclomaticMax`).
|
|
7
|
+
*
|
|
8
|
+
* This scanner is an internal analyzer — it is NOT a "known scanner"
|
|
9
|
+
* in the `KnownScanner` union (eslint/semgrep/bandit/stryker). It
|
|
10
|
+
* bypasses the adapter pipeline and writes SARIF directly via
|
|
11
|
+
* `wrapResultsInSarif()` from the common adapter helpers.
|
|
12
|
+
*
|
|
13
|
+
* Severity mapping:
|
|
14
|
+
* - `warning` — CC > threshold but < 2× threshold
|
|
15
|
+
* - `error` — CC >= 2× threshold (aligns with CRAP index hard block at CC >= 30)
|
|
16
|
+
*
|
|
17
|
+
* @module scanner/complexity-scanner
|
|
18
|
+
*/
|
|
19
|
+
import { promises as fs } from "node:fs";
|
|
20
|
+
import { join, relative } from "node:path";
|
|
21
|
+
import { detectLanguageFromPath } from "../ast/language-config.js";
|
|
22
|
+
import { wrapResultsInSarif, estimateEffortMinutes } from "../adapters/common.js";
|
|
23
|
+
import { createExclusionFilter } from "../shared/exclusions.js";
|
|
24
|
+
// Directory exclusions are now centralized in src/shared/exclusions.ts.
|
|
25
|
+
/** Hard cap on files to prevent unbounded analysis. */
|
|
26
|
+
const MAX_FILES = 20_000;
|
|
27
|
+
/** SARIF rule ID for cyclomatic complexity violations. */
|
|
28
|
+
const RULE_ID = "complexity/cyclomatic-max";
|
|
29
|
+
/** Source tool identifier used in SARIF properties. */
|
|
30
|
+
const SOURCE_TOOL = "complexity";
|
|
31
|
+
// ── Scanner ───────────────────────────────────────────────────────
|
|
32
|
+
/**
|
|
33
|
+
* Scan a workspace for cyclomatic complexity violations.
|
|
34
|
+
*
|
|
35
|
+
* Walks the directory tree, analyzes each source file with the
|
|
36
|
+
* tree-sitter engine, and emits SARIF findings for functions above
|
|
37
|
+
* the configured threshold. Findings are ingested into the provided
|
|
38
|
+
* `SarifStore` and persisted to disk.
|
|
39
|
+
*
|
|
40
|
+
* @param workspaceRoot Absolute path to the workspace root.
|
|
41
|
+
* @param engine Initialized tree-sitter engine instance.
|
|
42
|
+
* @param sarifStore Live SARIF store to ingest findings into.
|
|
43
|
+
* @param config Scanner configuration (threshold).
|
|
44
|
+
* @param logger Pino logger for progress and error reporting.
|
|
45
|
+
* @returns Summary of what was scanned and found.
|
|
46
|
+
*/
|
|
47
|
+
export async function scanComplexity(workspaceRoot, engine, sarifStore, config, logger) {
|
|
48
|
+
const start = Date.now();
|
|
49
|
+
const threshold = config.cyclomaticMax;
|
|
50
|
+
const errorThreshold = threshold * 2;
|
|
51
|
+
// 1. Collect supported source files
|
|
52
|
+
const filter = createExclusionFilter(config.exclude);
|
|
53
|
+
const files = await collectSourceFiles(workspaceRoot, filter);
|
|
54
|
+
logger.info({ fileCount: files.length, threshold }, "complexity-scanner: starting analysis");
|
|
55
|
+
// 2. Analyze each file and collect violations
|
|
56
|
+
const sarifResults = [];
|
|
57
|
+
let filesScanned = 0;
|
|
58
|
+
let functionsAnalyzed = 0;
|
|
59
|
+
let violations = 0;
|
|
60
|
+
for (const filePath of files) {
|
|
61
|
+
const language = detectLanguageFromPath(filePath);
|
|
62
|
+
if (!language)
|
|
63
|
+
continue;
|
|
64
|
+
try {
|
|
65
|
+
const metrics = await engine.analyzeFile({ filePath, language });
|
|
66
|
+
filesScanned += 1;
|
|
67
|
+
functionsAnalyzed += metrics.functions.length;
|
|
68
|
+
for (const fn of metrics.functions) {
|
|
69
|
+
if (fn.cyclomaticComplexity <= threshold)
|
|
70
|
+
continue;
|
|
71
|
+
const level = fn.cyclomaticComplexity >= errorThreshold ? "error" : "warning";
|
|
72
|
+
const relPath = relative(workspaceRoot, filePath);
|
|
73
|
+
sarifResults.push({
|
|
74
|
+
ruleId: RULE_ID,
|
|
75
|
+
level,
|
|
76
|
+
message: {
|
|
77
|
+
text: `Function '${fn.name}' has cyclomatic complexity ${fn.cyclomaticComplexity} (threshold: ${threshold})`,
|
|
78
|
+
},
|
|
79
|
+
locations: [
|
|
80
|
+
{
|
|
81
|
+
physicalLocation: {
|
|
82
|
+
artifactLocation: { uri: relPath },
|
|
83
|
+
region: {
|
|
84
|
+
startLine: fn.startLine,
|
|
85
|
+
startColumn: 1,
|
|
86
|
+
endLine: fn.endLine,
|
|
87
|
+
endColumn: 1,
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
properties: {
|
|
93
|
+
sourceTool: SOURCE_TOOL,
|
|
94
|
+
effortMinutes: estimateEffortMinutes(level),
|
|
95
|
+
cyclomaticComplexity: fn.cyclomaticComplexity,
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
violations += 1;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
logger.warn({ filePath, err: err.message }, "complexity-scanner: failed to analyze file, skipping");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// 3. Ingest findings into the SARIF store
|
|
106
|
+
if (sarifResults.length > 0) {
|
|
107
|
+
const document = wrapResultsInSarif(SOURCE_TOOL, "0.1.0", sarifResults);
|
|
108
|
+
sarifStore.ingestRun(document, SOURCE_TOOL);
|
|
109
|
+
await sarifStore.persist();
|
|
110
|
+
}
|
|
111
|
+
const durationMs = Date.now() - start;
|
|
112
|
+
logger.info({ filesScanned, functionsAnalyzed, violations, durationMs }, "complexity-scanner: analysis complete");
|
|
113
|
+
return { filesScanned, functionsAnalyzed, violations, durationMs };
|
|
114
|
+
}
|
|
115
|
+
// ── File walker ───────────────────────────────────────────────────
|
|
116
|
+
/**
|
|
117
|
+
* Collect source files from the workspace that the tree-sitter engine
|
|
118
|
+
* can analyze. Uses the shared exclusion filter for directory and file
|
|
119
|
+
* filtering. Only returns files whose extension maps to a supported language.
|
|
120
|
+
*/
|
|
121
|
+
async function collectSourceFiles(workspaceRoot, filter) {
|
|
122
|
+
const files = [];
|
|
123
|
+
let truncated = false;
|
|
124
|
+
async function walk(dir) {
|
|
125
|
+
if (truncated)
|
|
126
|
+
return;
|
|
127
|
+
let entries;
|
|
128
|
+
try {
|
|
129
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
for (const entry of entries) {
|
|
135
|
+
if (truncated)
|
|
136
|
+
return;
|
|
137
|
+
const full = join(dir, entry.name);
|
|
138
|
+
if (entry.isDirectory()) {
|
|
139
|
+
if (filter.shouldSkipDir(entry.name))
|
|
140
|
+
continue;
|
|
141
|
+
await walk(full);
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
if (!entry.isFile())
|
|
145
|
+
continue;
|
|
146
|
+
if (!detectLanguageFromPath(entry.name))
|
|
147
|
+
continue;
|
|
148
|
+
const relPath = relative(workspaceRoot, full);
|
|
149
|
+
if (filter.shouldSkipFile(relPath, entry.name))
|
|
150
|
+
continue;
|
|
151
|
+
files.push(full);
|
|
152
|
+
if (files.length >= MAX_FILES) {
|
|
153
|
+
truncated = true;
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
await walk(workspaceRoot);
|
|
159
|
+
return files;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=complexity-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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,CAwDzD,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,14 @@ 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
|
+
},
|
|
70
78
|
};
|
|
71
79
|
// ── Probes ──────────────────────────────────────────────────────────
|
|
72
80
|
/**
|
|
@@ -121,15 +129,15 @@ function probeBinary(binaryName) {
|
|
|
121
129
|
}
|
|
122
130
|
// ── Public API ──────────────────────────────────────────────────────
|
|
123
131
|
/**
|
|
124
|
-
* Detect which
|
|
125
|
-
*
|
|
126
|
-
*
|
|
132
|
+
* Detect which supported scanners are available in the given workspace.
|
|
133
|
+
* Probes config files, package.json, and binary availability in order,
|
|
134
|
+
* short-circuiting on first match.
|
|
127
135
|
*
|
|
128
136
|
* @param workspaceRoot Absolute path to the project root.
|
|
129
137
|
* @returns One {@link ScannerDetection} per known scanner.
|
|
130
138
|
*/
|
|
131
139
|
export async function detectScanners(workspaceRoot) {
|
|
132
|
-
const scanners = ["eslint", "semgrep", "bandit", "stryker"];
|
|
140
|
+
const scanners = ["eslint", "semgrep", "bandit", "stryker", "dart_analyze"];
|
|
133
141
|
const results = await Promise.all(scanners.map(async (scanner) => {
|
|
134
142
|
// 1. Config file probe (fastest)
|
|
135
143
|
const configProbe = probeConfigFiles(workspaceRoot, scanner);
|
|
@@ -141,12 +149,18 @@ export async function detectScanners(workspaceRoot) {
|
|
|
141
149
|
configPath: configProbe.path,
|
|
142
150
|
};
|
|
143
151
|
}
|
|
144
|
-
// 2. Package.json probe
|
|
152
|
+
// 2. Package.json probe — declared in deps/devDeps, but is it
|
|
153
|
+
// actually installed? Check node_modules/.bin/ for the binary.
|
|
145
154
|
if (probePackageJson(workspaceRoot, scanner)) {
|
|
155
|
+
const binName = SCANNER_SIGNALS[scanner].binaryNames[0];
|
|
156
|
+
const binPath = binName ? join(workspaceRoot, "node_modules", ".bin", binName) : null;
|
|
157
|
+
const installed = binPath !== null && existsSync(binPath);
|
|
146
158
|
return {
|
|
147
159
|
scanner,
|
|
148
|
-
available:
|
|
149
|
-
reason:
|
|
160
|
+
available: installed,
|
|
161
|
+
reason: installed
|
|
162
|
+
? "found in package.json and installed"
|
|
163
|
+
: `found in package.json but not installed (run \`npm install\`)`,
|
|
150
164
|
};
|
|
151
165
|
}
|
|
152
166
|
// 3. Binary probe (slowest)
|
|
@@ -168,6 +182,87 @@ export async function detectScanners(workspaceRoot) {
|
|
|
168
182
|
}));
|
|
169
183
|
return results;
|
|
170
184
|
}
|
|
185
|
+
// ── Monorepo subdirectory probing ────────────────────────────────
|
|
186
|
+
/**
|
|
187
|
+
* Common monorepo directory names that may contain workspace
|
|
188
|
+
* subdirectories. Checked one level deep only.
|
|
189
|
+
*/
|
|
190
|
+
const MONOREPO_DIRS = ["apps", "packages", "libs", "modules", "services"];
|
|
191
|
+
/**
|
|
192
|
+
* Detect scanners in monorepo subdirectories. Probes first-level
|
|
193
|
+
* children of common monorepo directories (apps/, packages/, etc.)
|
|
194
|
+
* and npm workspaces for scanner config files. Returns detections
|
|
195
|
+
* with a `workingDir` pointing to the subdirectory.
|
|
196
|
+
*
|
|
197
|
+
* This catches e.g. `apps/mobile/pubspec.yaml` in a polyglot monorepo
|
|
198
|
+
* where the root-level detector only finds ESLint.
|
|
199
|
+
*
|
|
200
|
+
* @param workspaceRoot Absolute path to the project root.
|
|
201
|
+
* @returns Additional detections from subdirectories (may be empty).
|
|
202
|
+
*/
|
|
203
|
+
export async function detectMonorepoScanners(workspaceRoot) {
|
|
204
|
+
const subdirs = new Set();
|
|
205
|
+
// 1. Read npm workspaces from package.json
|
|
206
|
+
try {
|
|
207
|
+
const pkgPath = join(workspaceRoot, "package.json");
|
|
208
|
+
const raw = readFileSync(pkgPath, "utf-8");
|
|
209
|
+
const pkg = JSON.parse(raw);
|
|
210
|
+
if (Array.isArray(pkg.workspaces)) {
|
|
211
|
+
for (const ws of pkg.workspaces) {
|
|
212
|
+
if (typeof ws === "string" && !ws.includes("*")) {
|
|
213
|
+
const full = resolve(workspaceRoot, ws);
|
|
214
|
+
if (existsSync(full))
|
|
215
|
+
subdirs.add(full);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// No package.json or not parseable — continue
|
|
222
|
+
}
|
|
223
|
+
// 2. Scan common monorepo directories one level deep
|
|
224
|
+
for (const dir of MONOREPO_DIRS) {
|
|
225
|
+
const full = join(workspaceRoot, dir);
|
|
226
|
+
try {
|
|
227
|
+
const entries = readdirSync(full, { withFileTypes: true });
|
|
228
|
+
for (const entry of entries) {
|
|
229
|
+
if (entry.isDirectory() && !entry.name.startsWith(".")) {
|
|
230
|
+
subdirs.add(join(full, entry.name));
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
// Directory doesn't exist — skip
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (subdirs.size === 0)
|
|
239
|
+
return [];
|
|
240
|
+
// 3. Probe each subdirectory for scanner config files
|
|
241
|
+
const detections = [];
|
|
242
|
+
const scanners = ["eslint", "semgrep", "bandit", "stryker", "dart_analyze"];
|
|
243
|
+
for (const subdir of subdirs) {
|
|
244
|
+
for (const scanner of scanners) {
|
|
245
|
+
const configProbe = probeConfigFiles(subdir, scanner);
|
|
246
|
+
if (!configProbe.found)
|
|
247
|
+
continue;
|
|
248
|
+
// For dart_analyze, also verify the binary is on PATH
|
|
249
|
+
if (scanner === "dart_analyze") {
|
|
250
|
+
const hasBinary = await probeBinary("dart");
|
|
251
|
+
if (!hasBinary)
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
const relDir = subdir.replace(workspaceRoot + "/", "");
|
|
255
|
+
detections.push({
|
|
256
|
+
scanner,
|
|
257
|
+
available: true,
|
|
258
|
+
reason: `config file found in ${relDir}/`,
|
|
259
|
+
...(configProbe.path ? { configPath: configProbe.path } : {}),
|
|
260
|
+
workingDir: subdir,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return detections;
|
|
265
|
+
}
|
|
171
266
|
// Exported for testing
|
|
172
|
-
export { SCANNER_SIGNALS };
|
|
267
|
+
export { SCANNER_SIGNALS, MONOREPO_DIRS };
|
|
173
268
|
//# 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,CAuChB;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,13 @@ 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
|
+
};
|
|
55
62
|
}
|
|
56
63
|
}
|
|
57
64
|
// ── Public API ──────────────────────────────────────────────────────
|
|
@@ -60,14 +67,16 @@ function getScannerCommand(scanner, workspaceRoot) {
|
|
|
60
67
|
*
|
|
61
68
|
* @param scanner Which scanner to run.
|
|
62
69
|
* @param workspaceRoot Absolute path to the project root (used as cwd).
|
|
70
|
+
* @param options Optional overrides.
|
|
63
71
|
* @returns A {@link ScannerRunResult} with stdout or file output.
|
|
64
72
|
*/
|
|
65
|
-
export function runScanner(scanner, workspaceRoot) {
|
|
73
|
+
export function runScanner(scanner, workspaceRoot, options) {
|
|
66
74
|
const start = Date.now();
|
|
67
|
-
const
|
|
75
|
+
const cwd = options?.workingDir ?? workspaceRoot;
|
|
76
|
+
const cmd = getScannerCommand(scanner, cwd);
|
|
68
77
|
return new Promise((resolve) => {
|
|
69
78
|
execFile(cmd.command, cmd.args, {
|
|
70
|
-
cwd
|
|
79
|
+
cwd,
|
|
71
80
|
timeout: cmd.timeoutMs,
|
|
72
81
|
maxBuffer: 50 * 1024 * 1024, // 50 MB — large codebases produce verbose output
|
|
73
82
|
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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"}
|
|
@@ -160,7 +160,7 @@ export declare const ingestScannerOutputSchema: {
|
|
|
160
160
|
readonly properties: {
|
|
161
161
|
readonly scanner: {
|
|
162
162
|
readonly type: "string";
|
|
163
|
-
readonly enum: readonly ["semgrep", "eslint", "bandit", "stryker"];
|
|
163
|
+
readonly enum: readonly ["semgrep", "eslint", "bandit", "stryker", "dart_analyze"];
|
|
164
164
|
readonly description: "Identifier of the producing scanner.";
|
|
165
165
|
};
|
|
166
166
|
readonly rawOutput: {
|