claude-crap 0.3.7 → 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.
Files changed (82) hide show
  1. package/README.md +25 -0
  2. package/dist/adapters/common.d.ts +1 -1
  3. package/dist/adapters/common.d.ts.map +1 -1
  4. package/dist/adapters/common.js +1 -1
  5. package/dist/adapters/common.js.map +1 -1
  6. package/dist/adapters/dart-analyzer.d.ts +41 -0
  7. package/dist/adapters/dart-analyzer.d.ts.map +1 -0
  8. package/dist/adapters/dart-analyzer.js +120 -0
  9. package/dist/adapters/dart-analyzer.js.map +1 -0
  10. package/dist/adapters/index.d.ts +1 -0
  11. package/dist/adapters/index.d.ts.map +1 -1
  12. package/dist/adapters/index.js +4 -0
  13. package/dist/adapters/index.js.map +1 -1
  14. package/dist/crap-config.d.ts +2 -0
  15. package/dist/crap-config.d.ts.map +1 -1
  16. package/dist/crap-config.js +36 -28
  17. package/dist/crap-config.js.map +1 -1
  18. package/dist/dashboard/file-detail.d.ts.map +1 -1
  19. package/dist/dashboard/file-detail.js.map +1 -1
  20. package/dist/dashboard/server.d.ts +2 -0
  21. package/dist/dashboard/server.d.ts.map +1 -1
  22. package/dist/dashboard/server.js +7 -12
  23. package/dist/dashboard/server.js.map +1 -1
  24. package/dist/index.js +17 -2
  25. package/dist/index.js.map +1 -1
  26. package/dist/metrics/workspace-walker.d.ts +4 -1
  27. package/dist/metrics/workspace-walker.d.ts.map +1 -1
  28. package/dist/metrics/workspace-walker.js +12 -28
  29. package/dist/metrics/workspace-walker.js.map +1 -1
  30. package/dist/scanner/auto-scan.d.ts +1 -0
  31. package/dist/scanner/auto-scan.d.ts.map +1 -1
  32. package/dist/scanner/auto-scan.js +14 -5
  33. package/dist/scanner/auto-scan.js.map +1 -1
  34. package/dist/scanner/bootstrap.d.ts +1 -1
  35. package/dist/scanner/bootstrap.d.ts.map +1 -1
  36. package/dist/scanner/bootstrap.js +9 -0
  37. package/dist/scanner/bootstrap.js.map +1 -1
  38. package/dist/scanner/complexity-scanner.d.ts +2 -0
  39. package/dist/scanner/complexity-scanner.d.ts.map +1 -1
  40. package/dist/scanner/complexity-scanner.js +11 -26
  41. package/dist/scanner/complexity-scanner.js.map +1 -1
  42. package/dist/scanner/detector.d.ts +24 -4
  43. package/dist/scanner/detector.d.ts.map +1 -1
  44. package/dist/scanner/detector.js +105 -10
  45. package/dist/scanner/detector.js.map +1 -1
  46. package/dist/scanner/runner.d.ts +4 -1
  47. package/dist/scanner/runner.d.ts.map +1 -1
  48. package/dist/scanner/runner.js +12 -3
  49. package/dist/scanner/runner.js.map +1 -1
  50. package/dist/schemas/tool-schemas.d.ts +1 -1
  51. package/dist/schemas/tool-schemas.js +1 -1
  52. package/dist/schemas/tool-schemas.js.map +1 -1
  53. package/dist/shared/exclusions.d.ts +53 -0
  54. package/dist/shared/exclusions.d.ts.map +1 -0
  55. package/dist/shared/exclusions.js +126 -0
  56. package/dist/shared/exclusions.js.map +1 -0
  57. package/package.json +3 -1
  58. package/plugin/.claude-plugin/plugin.json +1 -1
  59. package/plugin/bundle/mcp-server.mjs +393 -141
  60. package/plugin/bundle/mcp-server.mjs.map +4 -4
  61. package/plugin/package-lock.json +15 -2
  62. package/plugin/package.json +2 -1
  63. package/scripts/bundle-plugin.mjs +2 -1
  64. package/src/adapters/common.ts +1 -1
  65. package/src/adapters/dart-analyzer.ts +161 -0
  66. package/src/adapters/index.ts +4 -0
  67. package/src/crap-config.ts +55 -18
  68. package/src/dashboard/file-detail.ts +0 -2
  69. package/src/dashboard/server.ts +9 -10
  70. package/src/index.ts +17 -2
  71. package/src/metrics/workspace-walker.ts +15 -27
  72. package/src/scanner/auto-scan.ts +17 -6
  73. package/src/scanner/bootstrap.ts +11 -0
  74. package/src/scanner/complexity-scanner.ts +15 -26
  75. package/src/scanner/detector.ts +114 -10
  76. package/src/scanner/runner.ts +12 -2
  77. package/src/schemas/tool-schemas.ts +1 -1
  78. package/src/shared/exclusions.ts +156 -0
  79. package/src/tests/adapters/dispatch.test.ts +2 -2
  80. package/src/tests/auto-scan.test.ts +2 -2
  81. package/src/tests/exclusions.test.ts +117 -0
  82. package/src/tests/scanner-detector.test.ts +31 -11
@@ -90,24 +90,34 @@ describe("detectScanners", () => {
90
90
  }
91
91
  });
92
92
 
93
- it("detects eslint from package.json devDependencies", async () => {
93
+ it("detects eslint from package.json — not installed vs installed", async () => {
94
94
  const dir = makeTmpDir();
95
95
  try {
96
96
  writeFileSync(
97
97
  join(dir, "package.json"),
98
98
  JSON.stringify({ devDependencies: { eslint: "^9.0.0" } }),
99
99
  );
100
+ // Without node_modules/.bin/eslint — declared but not installed
100
101
  const results = await detectScanners(dir);
101
102
  const eslint = results.find((r) => r.scanner === "eslint");
102
103
  assert.ok(eslint);
103
- assert.equal(eslint.available, true);
104
- assert.ok(eslint.reason.includes("package.json"));
104
+ assert.equal(eslint.available, false);
105
+ assert.ok(eslint.reason.includes("not installed"));
106
+
107
+ // With binary present — installed
108
+ mkdirSync(join(dir, "node_modules", ".bin"), { recursive: true });
109
+ writeFileSync(join(dir, "node_modules", ".bin", "eslint"), "");
110
+ const results2 = await detectScanners(dir);
111
+ const eslint2 = results2.find((r) => r.scanner === "eslint");
112
+ assert.ok(eslint2);
113
+ assert.equal(eslint2.available, true);
114
+ assert.ok(eslint2.reason.includes("installed"));
105
115
  } finally {
106
116
  rmSync(dir, { recursive: true, force: true });
107
117
  }
108
118
  });
109
119
 
110
- it("detects stryker from package.json @stryker-mutator/core", async () => {
120
+ it("detects stryker from package.json — not installed vs installed", async () => {
111
121
  const dir = makeTmpDir();
112
122
  try {
113
123
  writeFileSync(
@@ -116,11 +126,21 @@ describe("detectScanners", () => {
116
126
  devDependencies: { "@stryker-mutator/core": "^7.0.0" },
117
127
  }),
118
128
  );
129
+ // Without binary — declared but not installed
119
130
  const results = await detectScanners(dir);
120
131
  const stryker = results.find((r) => r.scanner === "stryker");
121
132
  assert.ok(stryker);
122
- assert.equal(stryker.available, true);
123
- assert.ok(stryker.reason.includes("package.json"));
133
+ assert.equal(stryker.available, false);
134
+ assert.ok(stryker.reason.includes("not installed"));
135
+
136
+ // With binary present — installed
137
+ mkdirSync(join(dir, "node_modules", ".bin"), { recursive: true });
138
+ writeFileSync(join(dir, "node_modules", ".bin", "stryker"), "");
139
+ const results2 = await detectScanners(dir);
140
+ const stryker2 = results2.find((r) => r.scanner === "stryker");
141
+ assert.ok(stryker2);
142
+ assert.equal(stryker2.available, true);
143
+ assert.ok(stryker2.reason.includes("installed"));
124
144
  } finally {
125
145
  rmSync(dir, { recursive: true, force: true });
126
146
  }
@@ -133,9 +153,9 @@ describe("detectScanners", () => {
133
153
  // Config and package.json probes will all fail.
134
154
  // Binary probe results depend on the host — don't assert on those,
135
155
  // but do assert the structure is correct.
136
- assert.equal(results.length, 4);
156
+ assert.equal(results.length, 5);
137
157
  for (const r of results) {
138
- assert.ok(["eslint", "semgrep", "bandit", "stryker"].includes(r.scanner));
158
+ assert.ok(["eslint", "semgrep", "bandit", "stryker", "dart_analyze"].includes(r.scanner));
139
159
  assert.equal(typeof r.available, "boolean");
140
160
  assert.equal(typeof r.reason, "string");
141
161
  }
@@ -150,7 +170,7 @@ describe("detectScanners", () => {
150
170
  writeFileSync(join(dir, "package.json"), "not json at all");
151
171
  // Should not throw — just skip the package.json probe
152
172
  const results = await detectScanners(dir);
153
- assert.equal(results.length, 4);
173
+ assert.equal(results.length, 5);
154
174
  } finally {
155
175
  rmSync(dir, { recursive: true, force: true });
156
176
  }
@@ -172,10 +192,10 @@ describe("detectScanners", () => {
172
192
  }
173
193
  });
174
194
 
175
- it("SCANNER_SIGNALS covers all four scanners", () => {
195
+ it("SCANNER_SIGNALS covers all supported scanners", () => {
176
196
  assert.deepEqual(
177
197
  Object.keys(SCANNER_SIGNALS).sort(),
178
- ["bandit", "eslint", "semgrep", "stryker"],
198
+ ["bandit", "dart_analyze", "eslint", "semgrep", "stryker"],
179
199
  );
180
200
  });
181
201
  });