claude-crap 0.3.1 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -0
- package/README.md +1 -1
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +59 -5
- package/dist/dashboard/server.js.map +1 -1
- package/dist/scanner/auto-scan.d.ts.map +1 -1
- package/dist/scanner/auto-scan.js +24 -0
- package/dist/scanner/auto-scan.js.map +1 -1
- package/dist/scanner/bootstrap.d.ts.map +1 -1
- package/dist/scanner/bootstrap.js +59 -22
- package/dist/scanner/bootstrap.js.map +1 -1
- package/dist/scanner/runner.d.ts.map +1 -1
- package/dist/scanner/runner.js +7 -2
- package/dist/scanner/runner.js.map +1 -1
- package/package.json +6 -2
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.mcp.json +1 -1
- package/plugin/bundle/launcher.mjs +112 -0
- package/plugin/bundle/mcp-server.mjs +126 -24
- package/plugin/bundle/mcp-server.mjs.map +4 -4
- package/plugin/eslint.config.mjs +15 -0
- package/plugin/launcher.mjs +112 -0
- package/plugin/package-lock.json +2714 -0
- package/plugin/package.json +5 -1
- package/scripts/bundle-plugin.mjs +30 -0
- package/src/dashboard/server.ts +75 -5
- package/src/scanner/auto-scan.ts +28 -0
- package/src/scanner/bootstrap.ts +67 -24
- package/src/scanner/runner.ts +8 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,58 @@ 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.4] - 2026-04-12
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **Out-of-the-box MCP server startup** — added `launcher.mjs` bootstrap
|
|
13
|
+
wrapper that auto-installs runtime dependencies on first run. Fresh
|
|
14
|
+
git-based installs no longer fail with `ERR_MODULE_NOT_FOUND`.
|
|
15
|
+
- **Dashboard port conflict across sessions** — when port 5117 is
|
|
16
|
+
occupied by a stale process, the dashboard now probes up to 4
|
|
17
|
+
consecutive fallback ports (5118–5121) before giving up.
|
|
18
|
+
- **Deterministic installs** — `plugin/package-lock.json` is now
|
|
19
|
+
generated during `build:plugin` so all users resolve identical
|
|
20
|
+
dependency versions.
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
|
|
24
|
+
- MCP server entry point in `.mcp.json` changed from `mcp-server.mjs`
|
|
25
|
+
to `launcher.mjs` (the launcher dynamically imports `mcp-server.mjs`
|
|
26
|
+
after ensuring dependencies exist).
|
|
27
|
+
|
|
28
|
+
## [0.3.3] - 2026-04-12
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
|
|
32
|
+
- **npm OIDC Trusted Publishing** — upgrade npm to >= 11.5.1 before
|
|
33
|
+
publishing. GitHub Actions runners ship an older npm that doesn't
|
|
34
|
+
support OIDC token exchange, causing E404 on PUT.
|
|
35
|
+
|
|
36
|
+
## [0.3.2] - 2026-04-12
|
|
37
|
+
|
|
38
|
+
### Fixed
|
|
39
|
+
|
|
40
|
+
- **Dashboard 404 on root route** — the Vue SPA now loads on `GET /`
|
|
41
|
+
via explicit route handler. Removed `decorateReply: false` from
|
|
42
|
+
fastify-static registration which was preventing `sendFile`.
|
|
43
|
+
Updated health endpoint version to `0.3.2`.
|
|
44
|
+
- **Bootstrap creates ESLint config when missing** — if ESLint is in
|
|
45
|
+
`package.json` but has no `eslint.config.mjs`, bootstrap now
|
|
46
|
+
creates the config instead of short-circuiting. Skips `npm install`
|
|
47
|
+
when ESLint is already a dependency.
|
|
48
|
+
- **Runner detects ESLint fatal errors** — ESLint crash (no config)
|
|
49
|
+
is now treated as failure, not as "0 findings".
|
|
50
|
+
- **Auto-scan triggers bootstrap for config-less ESLint** — when
|
|
51
|
+
ESLint is detected via `package.json` but has no config file,
|
|
52
|
+
auto-scan calls bootstrap to create one before scanning.
|
|
53
|
+
- **Improved ESLint ignore patterns** — generated `eslint.config.mjs`
|
|
54
|
+
now ignores `**/bundle/`, `**/vendor/`, and `**/*.min.js` to avoid
|
|
55
|
+
flagging build artifacts.
|
|
56
|
+
- **npm Trusted Publishing (OIDC)** — release workflow uses OpenID
|
|
57
|
+
Connect provenance instead of `NPM_TOKEN` secret. No more 90-day
|
|
58
|
+
token rotation.
|
|
59
|
+
|
|
8
60
|
## [0.3.1] - 2026-04-12
|
|
9
61
|
|
|
10
62
|
### Fixed
|
package/README.md
CHANGED
|
@@ -81,7 +81,7 @@ task close — no further setup required.
|
|
|
81
81
|
> **Two install channels are live:**
|
|
82
82
|
>
|
|
83
83
|
> - **npm** — `npx claude-crap install` (direct, works anywhere `npx` does)
|
|
84
|
-
> - **Claude Code marketplace** — `/plugin marketplace add https://github.com/ahernandez-developer/claude-crap` followed by `/plugin install claude-crap@herz`. Claude Code resolves the marketplace entry's `source` to `claude-crap@0.
|
|
84
|
+
> - **Claude Code marketplace** — `/plugin marketplace add https://github.com/ahernandez-developer/claude-crap` followed by `/plugin install claude-crap@herz`. Claude Code resolves the marketplace entry's `source` to `claude-crap@0.3.4` on the npm registry, so both routes unpack the **same tarball** and get the same SHA.
|
|
85
85
|
|
|
86
86
|
### Marketplace cache troubleshooting
|
|
87
87
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AASH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,2EAA2E;IAC3E,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;IACxD,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAwE7F"}
|
package/dist/dashboard/server.js
CHANGED
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
* @module dashboard/server
|
|
25
25
|
*/
|
|
26
26
|
import { promises as fs } from "node:fs";
|
|
27
|
+
import { createServer as createTcpServer } from "node:net";
|
|
27
28
|
import { dirname, resolve } from "node:path";
|
|
28
29
|
import { fileURLToPath } from "node:url";
|
|
29
30
|
import Fastify from "fastify";
|
|
@@ -50,12 +51,11 @@ export async function startDashboard(options) {
|
|
|
50
51
|
await fastify.register(fastifyStatic, {
|
|
51
52
|
root: publicRoot,
|
|
52
53
|
prefix: "/",
|
|
53
|
-
decorateReply: false,
|
|
54
54
|
});
|
|
55
55
|
// ------------------------------------------------------------------
|
|
56
56
|
// /api/health — liveness probe
|
|
57
57
|
// ------------------------------------------------------------------
|
|
58
|
-
fastify.get("/api/health", async () => ({ status: "ok", server: "claude-crap", version: "0.
|
|
58
|
+
fastify.get("/api/health", async () => ({ status: "ok", server: "claude-crap", version: "0.3.4" }));
|
|
59
59
|
// ------------------------------------------------------------------
|
|
60
60
|
// /api/score — live project score
|
|
61
61
|
// ------------------------------------------------------------------
|
|
@@ -69,10 +69,25 @@ export async function startDashboard(options) {
|
|
|
69
69
|
// ------------------------------------------------------------------
|
|
70
70
|
fastify.get("/api/sarif", async () => sarifStore.toSarifDocument());
|
|
71
71
|
// ------------------------------------------------------------------
|
|
72
|
-
// / —
|
|
72
|
+
// / — explicit SPA fallback for index.html
|
|
73
73
|
// ------------------------------------------------------------------
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
// @fastify/static sometimes doesn't serve index.html on GET / when
|
|
75
|
+
// API routes are registered on the same prefix. Explicit fallback
|
|
76
|
+
// ensures the dashboard always loads.
|
|
77
|
+
fastify.get("/", async (_request, reply) => {
|
|
78
|
+
return reply.sendFile("index.html");
|
|
79
|
+
});
|
|
80
|
+
// Find a free port. The configured port is tried first, then up to
|
|
81
|
+
// MAX_PORT_RETRIES consecutive neighbors. This handles the common
|
|
82
|
+
// case where a previous Claude Code session left a stale MCP server
|
|
83
|
+
// process holding the default port.
|
|
84
|
+
const MAX_PORT_RETRIES = 4;
|
|
85
|
+
const boundPort = await findFreePort(config.dashboardPort, MAX_PORT_RETRIES, logger);
|
|
86
|
+
await fastify.listen({ port: boundPort, host: "127.0.0.1" });
|
|
87
|
+
const url = `http://127.0.0.1:${boundPort}`;
|
|
88
|
+
if (boundPort !== config.dashboardPort) {
|
|
89
|
+
logger.warn({ url, configuredPort: config.dashboardPort, actualPort: boundPort }, "claude-crap dashboard bound to fallback port (configured port was in use)");
|
|
90
|
+
}
|
|
76
91
|
logger.info({ url, publicRoot }, "claude-crap dashboard listening");
|
|
77
92
|
return {
|
|
78
93
|
url,
|
|
@@ -129,6 +144,45 @@ function urlOf(fastify, config) {
|
|
|
129
144
|
}
|
|
130
145
|
return `http://127.0.0.1:${config.dashboardPort}`;
|
|
131
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* Probe a sequence of TCP ports starting at `startPort` and return the
|
|
149
|
+
* first one that is free. Uses a raw `net.createServer()` probe that
|
|
150
|
+
* opens and immediately closes to avoid interfering with Fastify's own
|
|
151
|
+
* listen lifecycle (Fastify instances cannot re-listen after close).
|
|
152
|
+
*
|
|
153
|
+
* @param startPort The preferred port.
|
|
154
|
+
* @param maxRetries How many consecutive ports to try after the first.
|
|
155
|
+
* @param logger Pino logger for diagnostics.
|
|
156
|
+
* @returns The first free port found.
|
|
157
|
+
* @throws When all candidate ports are occupied.
|
|
158
|
+
*/
|
|
159
|
+
async function findFreePort(startPort, maxRetries, logger) {
|
|
160
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
161
|
+
const candidatePort = startPort + attempt;
|
|
162
|
+
const isFree = await new Promise((resolvePromise) => {
|
|
163
|
+
const probe = createTcpServer();
|
|
164
|
+
probe.once("error", (err) => {
|
|
165
|
+
if (err.code === "EADDRINUSE") {
|
|
166
|
+
resolvePromise(false);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
// Unexpected error (permission denied, etc.) — treat as unavailable.
|
|
170
|
+
resolvePromise(false);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
probe.listen({ port: candidatePort, host: "127.0.0.1" }, () => {
|
|
174
|
+
probe.close(() => resolvePromise(true));
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
if (isFree)
|
|
178
|
+
return candidatePort;
|
|
179
|
+
if (attempt < maxRetries) {
|
|
180
|
+
logger.info({ port: candidatePort, nextPort: candidatePort + 1 }, "dashboard port in use, trying next");
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// All ports exhausted — throw so startDashboard rejects gracefully.
|
|
184
|
+
throw new Error(`[claude-crap] dashboard: all ports ${startPort}–${startPort + maxRetries} are in use`);
|
|
185
|
+
}
|
|
132
186
|
/**
|
|
133
187
|
* Wrap {@link computeProjectScore} so the dashboard endpoint can call
|
|
134
188
|
* it with the live store and provide consistent location metadata.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,OAAiC,MAAM,SAAS,CAAC;AACxD,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EACL,mBAAmB,GAGpB,MAAM,qBAAqB,CAAC;AAiC7B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA8B;IACjE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEvE,oEAAoE;IACpE,qEAAqE;IACrE,qEAAqE;IACrE,kEAAkE;IAClE,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAoB,OAAO,CAAC;QACvC,MAAM,EAAE,KAAK,EAAE,uDAAuD;QACtE,qBAAqB,EAAE,IAAI;KAC5B,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE;QACpC,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,GAAG;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-scan.d.ts","sourceRoot":"","sources":["../../src/scanner/auto-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"auto-scan.d.ts","sourceRoot":"","sources":["../../src/scanner/auto-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,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,CA+JzB"}
|
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
*
|
|
19
19
|
* @module scanner/auto-scan
|
|
20
20
|
*/
|
|
21
|
+
import { existsSync } from "node:fs";
|
|
22
|
+
import { join } from "node:path";
|
|
21
23
|
import { detectScanners } from "./detector.js";
|
|
22
24
|
import { runScanner } from "./runner.js";
|
|
23
25
|
import { bootstrapScanner } from "./bootstrap.js";
|
|
@@ -59,6 +61,28 @@ export async function autoScan(workspaceRoot, sarifStore, logger) {
|
|
|
59
61
|
detected: detected.map((d) => `${d.scanner}:${d.available}`),
|
|
60
62
|
available: available.length,
|
|
61
63
|
}, "auto-scan: detection complete");
|
|
64
|
+
// If ESLint is detected (e.g. in package.json) but has no config file,
|
|
65
|
+
// bootstrap will create one before we try to scan.
|
|
66
|
+
const eslintConfigFiles = [
|
|
67
|
+
"eslint.config.js", "eslint.config.mjs", "eslint.config.cjs",
|
|
68
|
+
"eslint.config.ts", "eslint.config.mts", "eslint.config.cts",
|
|
69
|
+
".eslintrc.js", ".eslintrc.cjs", ".eslintrc.yaml",
|
|
70
|
+
".eslintrc.yml", ".eslintrc.json",
|
|
71
|
+
];
|
|
72
|
+
const eslintDetected = available.some((d) => d.scanner === "eslint");
|
|
73
|
+
const hasEslintConfig = eslintConfigFiles.some((f) => existsSync(join(workspaceRoot, f)));
|
|
74
|
+
if (eslintDetected && !hasEslintConfig) {
|
|
75
|
+
logger.info("auto-scan: ESLint detected but no config — running bootstrap");
|
|
76
|
+
try {
|
|
77
|
+
const bootstrapResult = await bootstrapScanner(workspaceRoot, sarifStore, logger);
|
|
78
|
+
if (bootstrapResult.autoScanResult) {
|
|
79
|
+
return bootstrapResult.autoScanResult;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
logger.warn({ err: err.message }, "auto-scan: bootstrap config creation failed");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
62
86
|
if (available.length === 0) {
|
|
63
87
|
// No scanners configured — try to bootstrap one automatically.
|
|
64
88
|
logger.info("auto-scan: no scanners found, attempting bootstrap");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-scan.js","sourceRoot":"","sources":["../../src/scanner/auto-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"auto-scan.js","sourceRoot":"","sources":["../../src/scanner/auto-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,CA+BpE;AAID;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,
|
|
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,CAsClE;AAuHD;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CA2I1B"}
|
|
@@ -81,7 +81,14 @@ export default tseslint.config(
|
|
|
81
81
|
js.configs.recommended,
|
|
82
82
|
...tseslint.configs.recommended,
|
|
83
83
|
{
|
|
84
|
-
ignores: [
|
|
84
|
+
ignores: [
|
|
85
|
+
"dist/",
|
|
86
|
+
"node_modules/",
|
|
87
|
+
"coverage/",
|
|
88
|
+
"**/bundle/",
|
|
89
|
+
"**/vendor/",
|
|
90
|
+
"**/*.min.js",
|
|
91
|
+
],
|
|
85
92
|
},
|
|
86
93
|
);
|
|
87
94
|
`;
|
|
@@ -91,7 +98,14 @@ export default tseslint.config(
|
|
|
91
98
|
export default [
|
|
92
99
|
js.configs.recommended,
|
|
93
100
|
{
|
|
94
|
-
ignores: [
|
|
101
|
+
ignores: [
|
|
102
|
+
"dist/",
|
|
103
|
+
"node_modules/",
|
|
104
|
+
"coverage/",
|
|
105
|
+
"**/bundle/",
|
|
106
|
+
"**/vendor/",
|
|
107
|
+
"**/*.min.js",
|
|
108
|
+
],
|
|
95
109
|
},
|
|
96
110
|
];
|
|
97
111
|
`;
|
|
@@ -199,7 +213,11 @@ export async function bootstrapScanner(workspaceRoot, sarifStore, logger) {
|
|
|
199
213
|
// 1. Check existing scanners
|
|
200
214
|
const detections = await detectScanners(workspaceRoot);
|
|
201
215
|
const available = detections.filter((d) => d.available);
|
|
202
|
-
if
|
|
216
|
+
// A scanner is truly "configured" only if it also has a config
|
|
217
|
+
// file. ESLint in package.json without eslint.config.mjs will crash.
|
|
218
|
+
const eslintNeedsConfig = available.some((d) => d.scanner === "eslint")
|
|
219
|
+
&& !detections.some((d) => d.scanner === "eslint" && d.configPath);
|
|
220
|
+
if (available.length > 0 && !eslintNeedsConfig) {
|
|
203
221
|
const existingScanners = available.map((d) => d.scanner);
|
|
204
222
|
logger.info({ existingScanners }, "bootstrap: scanner(s) already configured — skipping");
|
|
205
223
|
return {
|
|
@@ -217,19 +235,31 @@ export async function bootstrapScanner(workspaceRoot, sarifStore, logger) {
|
|
|
217
235
|
const recommendation = getRecommendation(projectType);
|
|
218
236
|
const steps = [];
|
|
219
237
|
logger.info({ projectType, scanner: recommendation.scanner }, "bootstrap: detected project type");
|
|
220
|
-
// 3. Install scanner
|
|
238
|
+
// 3. Install scanner (skip npm install if already in package.json)
|
|
221
239
|
if (recommendation.canAutoInstall) {
|
|
222
|
-
// JS/TS: auto-install ESLint
|
|
223
240
|
const isTypeScript = projectType === "typescript";
|
|
224
|
-
const
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
241
|
+
const eslintAlreadyInstalled = available.some((d) => d.scanner === "eslint");
|
|
242
|
+
if (!eslintAlreadyInstalled) {
|
|
243
|
+
const packages = isTypeScript
|
|
244
|
+
? ["eslint", "@eslint/js", "typescript-eslint"]
|
|
245
|
+
: ["eslint", "@eslint/js"];
|
|
246
|
+
const installStep = await npmInstall(workspaceRoot, packages);
|
|
247
|
+
steps.push(installStep);
|
|
248
|
+
if (!installStep.success) {
|
|
249
|
+
// npm install failed — skip config creation, fall through to result
|
|
250
|
+
return buildResult(projectType, steps, null);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
steps.push({
|
|
255
|
+
action: "npm install eslint",
|
|
256
|
+
success: true,
|
|
257
|
+
detail: "eslint already in package.json — skipped install",
|
|
258
|
+
});
|
|
232
259
|
}
|
|
260
|
+
// Always create config if missing
|
|
261
|
+
const configStep = writeEslintConfigFile(workspaceRoot, isTypeScript);
|
|
262
|
+
steps.push(configStep);
|
|
233
263
|
}
|
|
234
264
|
else {
|
|
235
265
|
// Python / Java / C# / Unknown: return instructions
|
|
@@ -298,20 +328,27 @@ export async function bootstrapScanner(workspaceRoot, sarifStore, logger) {
|
|
|
298
328
|
}
|
|
299
329
|
}
|
|
300
330
|
// 5. Build result
|
|
331
|
+
return buildResult(projectType, steps, autoScanResult, recommendation);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Build a BootstrapResult from the collected steps and optional scan result.
|
|
335
|
+
*/
|
|
336
|
+
function buildResult(projectType, steps, autoScanResult, recommendation) {
|
|
337
|
+
const success = steps.every((s) => s.success);
|
|
301
338
|
const findings = autoScanResult?.totalFindings ?? 0;
|
|
302
|
-
const
|
|
339
|
+
const scanner = recommendation?.scanner ?? "unknown";
|
|
303
340
|
let summary;
|
|
304
|
-
if (
|
|
305
|
-
summary = `
|
|
341
|
+
if (success && autoScanResult) {
|
|
342
|
+
summary = `Configured ${scanner} for ${projectType} project. Scan found ${findings} finding(s).`;
|
|
306
343
|
}
|
|
307
|
-
else if (
|
|
308
|
-
summary = `
|
|
344
|
+
else if (success && recommendation && !recommendation.canAutoInstall) {
|
|
345
|
+
summary = `Detected ${projectType} project. Install ${scanner} manually: ${recommendation.installInstructions}`;
|
|
309
346
|
}
|
|
310
|
-
else if (
|
|
311
|
-
summary = `
|
|
347
|
+
else if (success) {
|
|
348
|
+
summary = `Configured ${scanner} for ${projectType} project.`;
|
|
312
349
|
}
|
|
313
350
|
else {
|
|
314
|
-
summary = `Failed to
|
|
351
|
+
summary = `Failed to configure ${scanner}. Check the error details in the steps.`;
|
|
315
352
|
}
|
|
316
353
|
return {
|
|
317
354
|
projectType,
|
|
@@ -319,7 +356,7 @@ export async function bootstrapScanner(workspaceRoot, sarifStore, logger) {
|
|
|
319
356
|
existingScanners: [],
|
|
320
357
|
steps,
|
|
321
358
|
autoScanResult,
|
|
322
|
-
success
|
|
359
|
+
success,
|
|
323
360
|
summary,
|
|
324
361
|
};
|
|
325
362
|
}
|
|
@@ -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;AAiDzC,sEAAsE;AAEtE;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAAqB;IACrD,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;IAEpE,+CAA+C;IAC/C,IAAI,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACxB,IAAI,GAAG,CAAC,eAAe,CAAC;YAAE,OAAO,YAAY,CAAC;QAC9C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,mBAAmB;IACnB,IAAI,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACxE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,iBAAiB;IACjB,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACrE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,eAAe;IACf,IAAI,GAAG,CAAC,uBAAuB,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;QAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACrE,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,sEAAsE;AAEtE;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,YAAqB;IACxD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/scanner/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,CAgChB;AAID;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,YAAY,EACrB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,gBAAgB,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,CAgChB;AAID;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,YAAY,EACrB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,gBAAgB,CAAC,CA0G3B;AAGD,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,CAAC"}
|
package/dist/scanner/runner.js
CHANGED
|
@@ -74,8 +74,13 @@ export function runScanner(scanner, workspaceRoot) {
|
|
|
74
74
|
}, (err, stdout, stderr) => {
|
|
75
75
|
const durationMs = Date.now() - start;
|
|
76
76
|
// For scanners where non-zero exit means "findings exist",
|
|
77
|
-
// we still have valid output in stdout.
|
|
78
|
-
|
|
77
|
+
// we still have valid output in stdout. But if the scanner
|
|
78
|
+
// crashed (e.g. ESLint with no config file), treat it as a
|
|
79
|
+
// real failure even when nonZeroIsNormal is set.
|
|
80
|
+
const isFatalError = cmd.nonZeroIsNormal
|
|
81
|
+
&& err
|
|
82
|
+
&& (!stdout?.trim() || stderr?.includes("Oops!") || stderr?.includes("couldn't find"));
|
|
83
|
+
if (err && (!cmd.nonZeroIsNormal || isFatalError)) {
|
|
79
84
|
// Stryker: check if the output file was written despite the error
|
|
80
85
|
if (cmd.outputFile && existsSync(cmd.outputFile)) {
|
|
81
86
|
try {
|
|
@@ -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;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CACxB,OAAqB,EACrB,aAAqB;IAErB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAEtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,QAAQ,CACN,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,IAAI,EACR;YACE,GAAG,EAAE,aAAa;YAClB,OAAO,EAAE,GAAG,CAAC,SAAS;YACtB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,iDAAiD;YAC9E,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,0BAA0B;SACtE,EACD,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACtB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAEtC,2DAA2D;YAC3D,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/scanner/runner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-crap",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.4",
|
|
4
4
|
"description": "Deterministic QA plugin for Claude Code — CRAP index, Technical Debt Ratio, tree-sitter AST, SARIF 2.1.0, hooks, and a local Vue dashboard.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude-code",
|
|
@@ -128,10 +128,14 @@
|
|
|
128
128
|
"web-tree-sitter": "^0.24.4"
|
|
129
129
|
},
|
|
130
130
|
"devDependencies": {
|
|
131
|
+
"@eslint/js": "^10.0.1",
|
|
131
132
|
"@types/node": "^22.10.2",
|
|
132
133
|
"esbuild": "^0.28.0",
|
|
134
|
+
"eslint": "^10.2.0",
|
|
135
|
+
"globals": "^17.5.0",
|
|
133
136
|
"np": "^11.0.2",
|
|
134
137
|
"tsx": "^4.19.2",
|
|
135
|
-
"typescript": "^5.7.2"
|
|
138
|
+
"typescript": "^5.7.2",
|
|
139
|
+
"typescript-eslint": "^8.58.1"
|
|
136
140
|
}
|
|
137
141
|
}
|
|
@@ -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.4",
|
|
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",
|