claude-crap 0.3.0 → 0.3.1
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 +13 -0
- package/dist/scanner/auto-scan.d.ts.map +1 -1
- package/dist/scanner/auto-scan.js +12 -0
- 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 +52 -4
- package/dist/scanner/bootstrap.js.map +1 -1
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/bundle/mcp-server.mjs +172 -116
- package/plugin/bundle/mcp-server.mjs.map +4 -4
- package/plugin/package.json +1 -1
- package/src/scanner/auto-scan.ts +15 -0
- package/src/scanner/bootstrap.ts +56 -4
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,19 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.3.1] - 2026-04-12
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **auto-scan now calls bootstrap when no scanners found** — the
|
|
13
|
+
boot-time auto-scan and `auto_scan` MCP tool now automatically
|
|
14
|
+
trigger `bootstrapScanner` when no scanners are detected, making
|
|
15
|
+
the entire flow zero-config. Previously users had to call
|
|
16
|
+
`bootstrap_scanner` manually.
|
|
17
|
+
- **`.github/workflows/auto-tag.yml`** — automatically creates a
|
|
18
|
+
version tag when `package.json` changes on main, triggering the
|
|
19
|
+
release pipeline without manual tagging.
|
|
20
|
+
|
|
8
21
|
## [0.3.0] - 2026-04-12
|
|
9
22
|
|
|
10
23
|
Scanner bootstrapping and automated releases. Projects with no
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-scan.d.ts","sourceRoot":"","sources":["../../src/scanner/auto-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-scan.d.ts","sourceRoot":"","sources":["../../src/scanner/auto-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtE,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAI1D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,sEAAsE;IACtE,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,eAAe,EAAE,MAAM,CAAC;CACzB;AA4BD;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAC5B,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,CAAC,CAqIzB"}
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import { detectScanners } from "./detector.js";
|
|
22
22
|
import { runScanner } from "./runner.js";
|
|
23
|
+
import { bootstrapScanner } from "./bootstrap.js";
|
|
23
24
|
import { adaptScannerOutput } from "../adapters/index.js";
|
|
24
25
|
// ── Orchestrator ───────────────────────────────────────────────────
|
|
25
26
|
/**
|
|
@@ -59,6 +60,17 @@ export async function autoScan(workspaceRoot, sarifStore, logger) {
|
|
|
59
60
|
available: available.length,
|
|
60
61
|
}, "auto-scan: detection complete");
|
|
61
62
|
if (available.length === 0) {
|
|
63
|
+
// No scanners configured — try to bootstrap one automatically.
|
|
64
|
+
logger.info("auto-scan: no scanners found, attempting bootstrap");
|
|
65
|
+
try {
|
|
66
|
+
const bootstrapResult = await bootstrapScanner(workspaceRoot, sarifStore, logger);
|
|
67
|
+
if (bootstrapResult.autoScanResult) {
|
|
68
|
+
return bootstrapResult.autoScanResult;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
logger.warn({ err: err.message }, "auto-scan: bootstrap failed — continuing with empty results");
|
|
73
|
+
}
|
|
62
74
|
return {
|
|
63
75
|
detected,
|
|
64
76
|
results: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-scan.js","sourceRoot":"","sources":["../../src/scanner/auto-scan.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auto-scan.js","sourceRoot":"","sources":["../../src/scanner/auto-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
* @module scanner/bootstrap
|
|
23
23
|
*/
|
|
24
24
|
import type { Logger } from "pino";
|
|
25
|
-
import {
|
|
25
|
+
import type { AutoScanResult } from "./auto-scan.js";
|
|
26
26
|
import type { SarifStore } from "../sarif/sarif-store.js";
|
|
27
27
|
/**
|
|
28
28
|
* Detected project type, aligned with tree-sitter supported languages.
|
|
@@ -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;
|
|
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,CA+BpE;AAID;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,CAwBlE;AAuHD;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CAiJ1B"}
|
|
@@ -24,8 +24,9 @@
|
|
|
24
24
|
import { existsSync, writeFileSync, readdirSync } from "node:fs";
|
|
25
25
|
import { join } from "node:path";
|
|
26
26
|
import { execFile } from "node:child_process";
|
|
27
|
+
import { adaptScannerOutput } from "../adapters/index.js";
|
|
27
28
|
import { detectScanners } from "./detector.js";
|
|
28
|
-
import {
|
|
29
|
+
import { runScanner } from "./runner.js";
|
|
29
30
|
// ── Project type detection ─────────────────────────────────────────
|
|
30
31
|
/**
|
|
31
32
|
* Detect the project type from workspace signals.
|
|
@@ -238,15 +239,62 @@ export async function bootstrapScanner(workspaceRoot, sarifStore, logger) {
|
|
|
238
239
|
detail: recommendation.installInstructions,
|
|
239
240
|
});
|
|
240
241
|
}
|
|
241
|
-
// 4. Run
|
|
242
|
+
// 4. Run scanner directly if installation succeeded (inline scan
|
|
243
|
+
// to avoid circular dependency — autoScan calls bootstrapScanner)
|
|
242
244
|
const installSucceeded = steps.every((s) => s.success);
|
|
243
245
|
let autoScanResult = null;
|
|
244
246
|
if (installSucceeded && recommendation.canAutoInstall) {
|
|
245
247
|
try {
|
|
246
|
-
|
|
248
|
+
const scanStart = Date.now();
|
|
249
|
+
const postDetections = await detectScanners(workspaceRoot);
|
|
250
|
+
const postAvailable = postDetections.filter((d) => d.available);
|
|
251
|
+
const scanResults = [];
|
|
252
|
+
let scanFindings = 0;
|
|
253
|
+
const settled = await Promise.allSettled(postAvailable.map((d) => runScanner(d.scanner, workspaceRoot)));
|
|
254
|
+
for (let i = 0; i < postAvailable.length; i++) {
|
|
255
|
+
const det = postAvailable[i];
|
|
256
|
+
const res = settled[i];
|
|
257
|
+
if (res.status === "rejected" || !res.value.success) {
|
|
258
|
+
scanResults.push({
|
|
259
|
+
scanner: det.scanner,
|
|
260
|
+
success: false,
|
|
261
|
+
findingsIngested: 0,
|
|
262
|
+
durationMs: res.status === "fulfilled" ? res.value.durationMs : 0,
|
|
263
|
+
error: res.status === "rejected"
|
|
264
|
+
? String(res.reason)
|
|
265
|
+
: res.value.error ?? "unknown error",
|
|
266
|
+
});
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
const runResult = res.value;
|
|
270
|
+
let parsed;
|
|
271
|
+
try {
|
|
272
|
+
parsed = JSON.parse(runResult.rawOutput);
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
parsed = runResult.rawOutput;
|
|
276
|
+
}
|
|
277
|
+
const adapted = adaptScannerOutput(runResult.scanner, parsed);
|
|
278
|
+
const stats = sarifStore.ingestRun(adapted.document, adapted.sourceTool);
|
|
279
|
+
scanFindings += stats.accepted;
|
|
280
|
+
scanResults.push({
|
|
281
|
+
scanner: runResult.scanner,
|
|
282
|
+
success: true,
|
|
283
|
+
findingsIngested: stats.accepted,
|
|
284
|
+
durationMs: runResult.durationMs,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
if (scanFindings > 0)
|
|
288
|
+
await sarifStore.persist();
|
|
289
|
+
autoScanResult = {
|
|
290
|
+
detected: postDetections,
|
|
291
|
+
results: scanResults,
|
|
292
|
+
totalFindings: scanFindings,
|
|
293
|
+
totalDurationMs: Date.now() - scanStart,
|
|
294
|
+
};
|
|
247
295
|
}
|
|
248
296
|
catch (err) {
|
|
249
|
-
logger.warn({ err: err.message }, "bootstrap:
|
|
297
|
+
logger.warn({ err: err.message }, "bootstrap: scan after install failed");
|
|
250
298
|
}
|
|
251
299
|
}
|
|
252
300
|
// 5. Build result
|
|
@@ -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,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/scanner/bootstrap.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://code.claude.com/schemas/plugin.json",
|
|
3
3
|
"name": "claude-crap",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.1",
|
|
5
5
|
"description": "Deterministic Quality Assurance plugin for Claude Code. Wraps every Write / Edit / Bash tool call with a PreToolUse gatekeeper, a PostToolUse verifier, and a Stop quality gate backed by CRAP index, Technical Debt Ratio, tree-sitter AST metrics, and SARIF 2.1.0 reports. Forbids the agent from writing functional code before a test safety net exists.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Alan Hernandez",
|
|
@@ -8340,120 +8340,6 @@ function runScanner(scanner, workspaceRoot) {
|
|
|
8340
8340
|
});
|
|
8341
8341
|
}
|
|
8342
8342
|
|
|
8343
|
-
// src/scanner/auto-scan.ts
|
|
8344
|
-
function ingestScannerRun(scanner, rawOutput, sarifStore) {
|
|
8345
|
-
let parsed;
|
|
8346
|
-
try {
|
|
8347
|
-
parsed = JSON.parse(rawOutput);
|
|
8348
|
-
} catch {
|
|
8349
|
-
parsed = rawOutput;
|
|
8350
|
-
}
|
|
8351
|
-
const adapted = adaptScannerOutput(scanner, parsed);
|
|
8352
|
-
const stats = sarifStore.ingestRun(adapted.document, adapted.sourceTool);
|
|
8353
|
-
return { accepted: stats.accepted };
|
|
8354
|
-
}
|
|
8355
|
-
async function autoScan(workspaceRoot, sarifStore, logger2) {
|
|
8356
|
-
const start = Date.now();
|
|
8357
|
-
const detected = await detectScanners(workspaceRoot);
|
|
8358
|
-
const available = detected.filter((d) => d.available);
|
|
8359
|
-
logger2.info(
|
|
8360
|
-
{
|
|
8361
|
-
detected: detected.map((d) => `${d.scanner}:${d.available}`),
|
|
8362
|
-
available: available.length
|
|
8363
|
-
},
|
|
8364
|
-
"auto-scan: detection complete"
|
|
8365
|
-
);
|
|
8366
|
-
if (available.length === 0) {
|
|
8367
|
-
return {
|
|
8368
|
-
detected,
|
|
8369
|
-
results: [],
|
|
8370
|
-
totalFindings: 0,
|
|
8371
|
-
totalDurationMs: Date.now() - start
|
|
8372
|
-
};
|
|
8373
|
-
}
|
|
8374
|
-
const runResults = await Promise.allSettled(
|
|
8375
|
-
available.map((d) => runScanner(d.scanner, workspaceRoot))
|
|
8376
|
-
);
|
|
8377
|
-
const results = [];
|
|
8378
|
-
let totalFindings = 0;
|
|
8379
|
-
let persistNeeded = false;
|
|
8380
|
-
for (let i = 0; i < available.length; i++) {
|
|
8381
|
-
const detection = available[i];
|
|
8382
|
-
const settled = runResults[i];
|
|
8383
|
-
if (settled.status === "rejected") {
|
|
8384
|
-
const error = String(settled.reason);
|
|
8385
|
-
logger2.warn(
|
|
8386
|
-
{ scanner: detection.scanner, error },
|
|
8387
|
-
"auto-scan: scanner execution rejected"
|
|
8388
|
-
);
|
|
8389
|
-
results.push({
|
|
8390
|
-
scanner: detection.scanner,
|
|
8391
|
-
success: false,
|
|
8392
|
-
findingsIngested: 0,
|
|
8393
|
-
durationMs: 0,
|
|
8394
|
-
error
|
|
8395
|
-
});
|
|
8396
|
-
continue;
|
|
8397
|
-
}
|
|
8398
|
-
const runResult = settled.value;
|
|
8399
|
-
if (!runResult.success) {
|
|
8400
|
-
logger2.warn(
|
|
8401
|
-
{ scanner: runResult.scanner, error: runResult.error },
|
|
8402
|
-
"auto-scan: scanner returned failure"
|
|
8403
|
-
);
|
|
8404
|
-
results.push({
|
|
8405
|
-
scanner: runResult.scanner,
|
|
8406
|
-
success: false,
|
|
8407
|
-
findingsIngested: 0,
|
|
8408
|
-
durationMs: runResult.durationMs,
|
|
8409
|
-
error: runResult.error ?? "unknown error"
|
|
8410
|
-
});
|
|
8411
|
-
continue;
|
|
8412
|
-
}
|
|
8413
|
-
try {
|
|
8414
|
-
const { accepted } = ingestScannerRun(
|
|
8415
|
-
runResult.scanner,
|
|
8416
|
-
runResult.rawOutput,
|
|
8417
|
-
sarifStore
|
|
8418
|
-
);
|
|
8419
|
-
totalFindings += accepted;
|
|
8420
|
-
persistNeeded = true;
|
|
8421
|
-
logger2.info(
|
|
8422
|
-
{ scanner: runResult.scanner, accepted, durationMs: runResult.durationMs },
|
|
8423
|
-
"auto-scan: scanner ingested"
|
|
8424
|
-
);
|
|
8425
|
-
results.push({
|
|
8426
|
-
scanner: runResult.scanner,
|
|
8427
|
-
success: true,
|
|
8428
|
-
findingsIngested: accepted,
|
|
8429
|
-
durationMs: runResult.durationMs
|
|
8430
|
-
});
|
|
8431
|
-
} catch (err) {
|
|
8432
|
-
const error = err.message;
|
|
8433
|
-
logger2.warn(
|
|
8434
|
-
{ scanner: runResult.scanner, error },
|
|
8435
|
-
"auto-scan: adapter/ingestion failed"
|
|
8436
|
-
);
|
|
8437
|
-
results.push({
|
|
8438
|
-
scanner: runResult.scanner,
|
|
8439
|
-
success: false,
|
|
8440
|
-
findingsIngested: 0,
|
|
8441
|
-
durationMs: runResult.durationMs,
|
|
8442
|
-
error
|
|
8443
|
-
});
|
|
8444
|
-
}
|
|
8445
|
-
}
|
|
8446
|
-
if (persistNeeded) {
|
|
8447
|
-
await sarifStore.persist();
|
|
8448
|
-
}
|
|
8449
|
-
return {
|
|
8450
|
-
detected,
|
|
8451
|
-
results,
|
|
8452
|
-
totalFindings,
|
|
8453
|
-
totalDurationMs: Date.now() - start
|
|
8454
|
-
};
|
|
8455
|
-
}
|
|
8456
|
-
|
|
8457
8343
|
// src/scanner/bootstrap.ts
|
|
8458
8344
|
import { existsSync as existsSync3, writeFileSync, readdirSync } from "node:fs";
|
|
8459
8345
|
import { join as join8 } from "node:path";
|
|
@@ -8632,11 +8518,55 @@ async function bootstrapScanner(workspaceRoot, sarifStore, logger2) {
|
|
|
8632
8518
|
let autoScanResult = null;
|
|
8633
8519
|
if (installSucceeded && recommendation.canAutoInstall) {
|
|
8634
8520
|
try {
|
|
8635
|
-
|
|
8521
|
+
const scanStart = Date.now();
|
|
8522
|
+
const postDetections = await detectScanners(workspaceRoot);
|
|
8523
|
+
const postAvailable = postDetections.filter((d) => d.available);
|
|
8524
|
+
const scanResults = [];
|
|
8525
|
+
let scanFindings = 0;
|
|
8526
|
+
const settled = await Promise.allSettled(
|
|
8527
|
+
postAvailable.map((d) => runScanner(d.scanner, workspaceRoot))
|
|
8528
|
+
);
|
|
8529
|
+
for (let i = 0; i < postAvailable.length; i++) {
|
|
8530
|
+
const det = postAvailable[i];
|
|
8531
|
+
const res = settled[i];
|
|
8532
|
+
if (res.status === "rejected" || !res.value.success) {
|
|
8533
|
+
scanResults.push({
|
|
8534
|
+
scanner: det.scanner,
|
|
8535
|
+
success: false,
|
|
8536
|
+
findingsIngested: 0,
|
|
8537
|
+
durationMs: res.status === "fulfilled" ? res.value.durationMs : 0,
|
|
8538
|
+
error: res.status === "rejected" ? String(res.reason) : res.value.error ?? "unknown error"
|
|
8539
|
+
});
|
|
8540
|
+
continue;
|
|
8541
|
+
}
|
|
8542
|
+
const runResult = res.value;
|
|
8543
|
+
let parsed;
|
|
8544
|
+
try {
|
|
8545
|
+
parsed = JSON.parse(runResult.rawOutput);
|
|
8546
|
+
} catch {
|
|
8547
|
+
parsed = runResult.rawOutput;
|
|
8548
|
+
}
|
|
8549
|
+
const adapted = adaptScannerOutput(runResult.scanner, parsed);
|
|
8550
|
+
const stats = sarifStore.ingestRun(adapted.document, adapted.sourceTool);
|
|
8551
|
+
scanFindings += stats.accepted;
|
|
8552
|
+
scanResults.push({
|
|
8553
|
+
scanner: runResult.scanner,
|
|
8554
|
+
success: true,
|
|
8555
|
+
findingsIngested: stats.accepted,
|
|
8556
|
+
durationMs: runResult.durationMs
|
|
8557
|
+
});
|
|
8558
|
+
}
|
|
8559
|
+
if (scanFindings > 0) await sarifStore.persist();
|
|
8560
|
+
autoScanResult = {
|
|
8561
|
+
detected: postDetections,
|
|
8562
|
+
results: scanResults,
|
|
8563
|
+
totalFindings: scanFindings,
|
|
8564
|
+
totalDurationMs: Date.now() - scanStart
|
|
8565
|
+
};
|
|
8636
8566
|
} catch (err) {
|
|
8637
8567
|
logger2.warn(
|
|
8638
8568
|
{ err: err.message },
|
|
8639
|
-
"bootstrap:
|
|
8569
|
+
"bootstrap: scan after install failed"
|
|
8640
8570
|
);
|
|
8641
8571
|
}
|
|
8642
8572
|
}
|
|
@@ -8663,6 +8593,132 @@ async function bootstrapScanner(workspaceRoot, sarifStore, logger2) {
|
|
|
8663
8593
|
};
|
|
8664
8594
|
}
|
|
8665
8595
|
|
|
8596
|
+
// src/scanner/auto-scan.ts
|
|
8597
|
+
function ingestScannerRun(scanner, rawOutput, sarifStore) {
|
|
8598
|
+
let parsed;
|
|
8599
|
+
try {
|
|
8600
|
+
parsed = JSON.parse(rawOutput);
|
|
8601
|
+
} catch {
|
|
8602
|
+
parsed = rawOutput;
|
|
8603
|
+
}
|
|
8604
|
+
const adapted = adaptScannerOutput(scanner, parsed);
|
|
8605
|
+
const stats = sarifStore.ingestRun(adapted.document, adapted.sourceTool);
|
|
8606
|
+
return { accepted: stats.accepted };
|
|
8607
|
+
}
|
|
8608
|
+
async function autoScan(workspaceRoot, sarifStore, logger2) {
|
|
8609
|
+
const start = Date.now();
|
|
8610
|
+
const detected = await detectScanners(workspaceRoot);
|
|
8611
|
+
const available = detected.filter((d) => d.available);
|
|
8612
|
+
logger2.info(
|
|
8613
|
+
{
|
|
8614
|
+
detected: detected.map((d) => `${d.scanner}:${d.available}`),
|
|
8615
|
+
available: available.length
|
|
8616
|
+
},
|
|
8617
|
+
"auto-scan: detection complete"
|
|
8618
|
+
);
|
|
8619
|
+
if (available.length === 0) {
|
|
8620
|
+
logger2.info("auto-scan: no scanners found, attempting bootstrap");
|
|
8621
|
+
try {
|
|
8622
|
+
const bootstrapResult = await bootstrapScanner(workspaceRoot, sarifStore, logger2);
|
|
8623
|
+
if (bootstrapResult.autoScanResult) {
|
|
8624
|
+
return bootstrapResult.autoScanResult;
|
|
8625
|
+
}
|
|
8626
|
+
} catch (err) {
|
|
8627
|
+
logger2.warn(
|
|
8628
|
+
{ err: err.message },
|
|
8629
|
+
"auto-scan: bootstrap failed \u2014 continuing with empty results"
|
|
8630
|
+
);
|
|
8631
|
+
}
|
|
8632
|
+
return {
|
|
8633
|
+
detected,
|
|
8634
|
+
results: [],
|
|
8635
|
+
totalFindings: 0,
|
|
8636
|
+
totalDurationMs: Date.now() - start
|
|
8637
|
+
};
|
|
8638
|
+
}
|
|
8639
|
+
const runResults = await Promise.allSettled(
|
|
8640
|
+
available.map((d) => runScanner(d.scanner, workspaceRoot))
|
|
8641
|
+
);
|
|
8642
|
+
const results = [];
|
|
8643
|
+
let totalFindings = 0;
|
|
8644
|
+
let persistNeeded = false;
|
|
8645
|
+
for (let i = 0; i < available.length; i++) {
|
|
8646
|
+
const detection = available[i];
|
|
8647
|
+
const settled = runResults[i];
|
|
8648
|
+
if (settled.status === "rejected") {
|
|
8649
|
+
const error = String(settled.reason);
|
|
8650
|
+
logger2.warn(
|
|
8651
|
+
{ scanner: detection.scanner, error },
|
|
8652
|
+
"auto-scan: scanner execution rejected"
|
|
8653
|
+
);
|
|
8654
|
+
results.push({
|
|
8655
|
+
scanner: detection.scanner,
|
|
8656
|
+
success: false,
|
|
8657
|
+
findingsIngested: 0,
|
|
8658
|
+
durationMs: 0,
|
|
8659
|
+
error
|
|
8660
|
+
});
|
|
8661
|
+
continue;
|
|
8662
|
+
}
|
|
8663
|
+
const runResult = settled.value;
|
|
8664
|
+
if (!runResult.success) {
|
|
8665
|
+
logger2.warn(
|
|
8666
|
+
{ scanner: runResult.scanner, error: runResult.error },
|
|
8667
|
+
"auto-scan: scanner returned failure"
|
|
8668
|
+
);
|
|
8669
|
+
results.push({
|
|
8670
|
+
scanner: runResult.scanner,
|
|
8671
|
+
success: false,
|
|
8672
|
+
findingsIngested: 0,
|
|
8673
|
+
durationMs: runResult.durationMs,
|
|
8674
|
+
error: runResult.error ?? "unknown error"
|
|
8675
|
+
});
|
|
8676
|
+
continue;
|
|
8677
|
+
}
|
|
8678
|
+
try {
|
|
8679
|
+
const { accepted } = ingestScannerRun(
|
|
8680
|
+
runResult.scanner,
|
|
8681
|
+
runResult.rawOutput,
|
|
8682
|
+
sarifStore
|
|
8683
|
+
);
|
|
8684
|
+
totalFindings += accepted;
|
|
8685
|
+
persistNeeded = true;
|
|
8686
|
+
logger2.info(
|
|
8687
|
+
{ scanner: runResult.scanner, accepted, durationMs: runResult.durationMs },
|
|
8688
|
+
"auto-scan: scanner ingested"
|
|
8689
|
+
);
|
|
8690
|
+
results.push({
|
|
8691
|
+
scanner: runResult.scanner,
|
|
8692
|
+
success: true,
|
|
8693
|
+
findingsIngested: accepted,
|
|
8694
|
+
durationMs: runResult.durationMs
|
|
8695
|
+
});
|
|
8696
|
+
} catch (err) {
|
|
8697
|
+
const error = err.message;
|
|
8698
|
+
logger2.warn(
|
|
8699
|
+
{ scanner: runResult.scanner, error },
|
|
8700
|
+
"auto-scan: adapter/ingestion failed"
|
|
8701
|
+
);
|
|
8702
|
+
results.push({
|
|
8703
|
+
scanner: runResult.scanner,
|
|
8704
|
+
success: false,
|
|
8705
|
+
findingsIngested: 0,
|
|
8706
|
+
durationMs: runResult.durationMs,
|
|
8707
|
+
error
|
|
8708
|
+
});
|
|
8709
|
+
}
|
|
8710
|
+
}
|
|
8711
|
+
if (persistNeeded) {
|
|
8712
|
+
await sarifStore.persist();
|
|
8713
|
+
}
|
|
8714
|
+
return {
|
|
8715
|
+
detected,
|
|
8716
|
+
results,
|
|
8717
|
+
totalFindings,
|
|
8718
|
+
totalDurationMs: Date.now() - start
|
|
8719
|
+
};
|
|
8720
|
+
}
|
|
8721
|
+
|
|
8666
8722
|
// src/schemas/tool-schemas.ts
|
|
8667
8723
|
var computeCrapSchema = {
|
|
8668
8724
|
type: "object",
|