@kevinrabun/judges 3.47.0 → 3.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +112 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/audit-trail.d.ts +18 -0
  6. package/dist/commands/audit-trail.d.ts.map +1 -0
  7. package/dist/commands/audit-trail.js +155 -0
  8. package/dist/commands/audit-trail.js.map +1 -0
  9. package/dist/commands/auto-fix.d.ts +18 -0
  10. package/dist/commands/auto-fix.d.ts.map +1 -0
  11. package/dist/commands/auto-fix.js +241 -0
  12. package/dist/commands/auto-fix.js.map +1 -0
  13. package/dist/commands/dep-correlate.d.ts +9 -0
  14. package/dist/commands/dep-correlate.d.ts.map +1 -0
  15. package/dist/commands/dep-correlate.js +208 -0
  16. package/dist/commands/dep-correlate.js.map +1 -0
  17. package/dist/commands/doc-gen.d.ts +8 -0
  18. package/dist/commands/doc-gen.d.ts.map +1 -0
  19. package/dist/commands/doc-gen.js +209 -0
  20. package/dist/commands/doc-gen.js.map +1 -0
  21. package/dist/commands/incident-response.d.ts +8 -0
  22. package/dist/commands/incident-response.d.ts.map +1 -0
  23. package/dist/commands/incident-response.js +255 -0
  24. package/dist/commands/incident-response.js.map +1 -0
  25. package/dist/commands/judge-author.d.ts +8 -0
  26. package/dist/commands/judge-author.d.ts.map +1 -0
  27. package/dist/commands/judge-author.js +261 -0
  28. package/dist/commands/judge-author.js.map +1 -0
  29. package/dist/commands/learning-path.d.ts +9 -0
  30. package/dist/commands/learning-path.d.ts.map +1 -0
  31. package/dist/commands/learning-path.js +326 -0
  32. package/dist/commands/learning-path.js.map +1 -0
  33. package/dist/commands/license-scan.d.ts +9 -0
  34. package/dist/commands/license-scan.d.ts.map +1 -0
  35. package/dist/commands/license-scan.js +180 -0
  36. package/dist/commands/license-scan.js.map +1 -0
  37. package/dist/commands/org-policy.d.ts +8 -0
  38. package/dist/commands/org-policy.d.ts.map +1 -0
  39. package/dist/commands/org-policy.js +208 -0
  40. package/dist/commands/org-policy.js.map +1 -0
  41. package/dist/commands/pattern-registry.d.ts +23 -0
  42. package/dist/commands/pattern-registry.d.ts.map +1 -0
  43. package/dist/commands/pattern-registry.js +227 -0
  44. package/dist/commands/pattern-registry.js.map +1 -0
  45. package/dist/commands/perf-hotspot.d.ts +8 -0
  46. package/dist/commands/perf-hotspot.d.ts.map +1 -0
  47. package/dist/commands/perf-hotspot.js +274 -0
  48. package/dist/commands/perf-hotspot.js.map +1 -0
  49. package/dist/commands/predict.d.ts +8 -0
  50. package/dist/commands/predict.d.ts.map +1 -0
  51. package/dist/commands/predict.js +219 -0
  52. package/dist/commands/predict.js.map +1 -0
  53. package/dist/commands/risk-heatmap.d.ts +8 -0
  54. package/dist/commands/risk-heatmap.d.ts.map +1 -0
  55. package/dist/commands/risk-heatmap.js +224 -0
  56. package/dist/commands/risk-heatmap.js.map +1 -0
  57. package/dist/commands/sbom-export.d.ts +8 -0
  58. package/dist/commands/sbom-export.d.ts.map +1 -0
  59. package/dist/commands/sbom-export.js +162 -0
  60. package/dist/commands/sbom-export.js.map +1 -0
  61. package/dist/commands/security-maturity.d.ts +8 -0
  62. package/dist/commands/security-maturity.d.ts.map +1 -0
  63. package/dist/commands/security-maturity.js +313 -0
  64. package/dist/commands/security-maturity.js.map +1 -0
  65. package/dist/commands/test-correlate.d.ts +8 -0
  66. package/dist/commands/test-correlate.d.ts.map +1 -0
  67. package/dist/commands/test-correlate.js +222 -0
  68. package/dist/commands/test-correlate.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sbom-export.js","sourceRoot":"","sources":["../../src/commands/sbom-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Security maturity — assesses organization's security posture
3
+ * maturity level based on Judges usage and finding data.
4
+ *
5
+ * All analysis from local files — no external data.
6
+ */
7
+ export declare function runSecurityMaturity(argv: string[]): void;
8
+ //# sourceMappingURL=security-maturity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-maturity.d.ts","sourceRoot":"","sources":["../../src/commands/security-maturity.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4PH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqFxD"}
@@ -0,0 +1,313 @@
1
+ /**
2
+ * Security maturity — assesses organization's security posture
3
+ * maturity level based on Judges usage and finding data.
4
+ *
5
+ * All analysis from local files — no external data.
6
+ */
7
+ import { existsSync, readFileSync } from "fs";
8
+ import { join } from "path";
9
+ const MATURITY_LABELS = ["Initial", "Developing", "Defined", "Managed", "Optimizing"];
10
+ // ─── Core ───────────────────────────────────────────────────────────────────
11
+ function fileExists(path) {
12
+ return existsSync(path);
13
+ }
14
+ function loadJsonSafe(path, fallback) {
15
+ if (!existsSync(path))
16
+ return fallback;
17
+ try {
18
+ return JSON.parse(readFileSync(path, "utf-8"));
19
+ }
20
+ catch {
21
+ return fallback;
22
+ }
23
+ }
24
+ function assessMaturity() {
25
+ const dimensions = [];
26
+ // 1. Scanning adoption
27
+ {
28
+ let level = 1;
29
+ const evidence = [];
30
+ const nextSteps = [];
31
+ if (fileExists(".judgesrc")) {
32
+ level = 2;
33
+ evidence.push(".judgesrc configured");
34
+ }
35
+ if (fileExists(".judges-scores")) {
36
+ level = 3;
37
+ evidence.push("Developer scoring active");
38
+ }
39
+ if (fileExists(join(".judges-leaderboard", "leaderboard.json"))) {
40
+ level = 4;
41
+ evidence.push("Team leaderboard active");
42
+ }
43
+ if (fileExists(join(".judges-quality-gate", "policy.json"))) {
44
+ level = 5;
45
+ evidence.push("Quality gate policy set");
46
+ }
47
+ if (level < 2)
48
+ nextSteps.push("Configure .judgesrc with team presets");
49
+ if (level < 3)
50
+ nextSteps.push("Enable developer scoring with `judges dev-score`");
51
+ if (level < 4)
52
+ nextSteps.push("Set up team leaderboard with `judges team-leaderboard`");
53
+ if (level < 5)
54
+ nextSteps.push("Configure quality gate policy with `judges pr-quality-gate --set-policy`");
55
+ dimensions.push({
56
+ name: "Scanning Adoption",
57
+ level,
58
+ maxLevel: 5,
59
+ description: "How widely Judges is used across the team",
60
+ evidence,
61
+ nextSteps,
62
+ });
63
+ }
64
+ // 2. Finding management
65
+ {
66
+ let level = 1;
67
+ const evidence = [];
68
+ const nextSteps = [];
69
+ if (fileExists(".judges-suppressions.json")) {
70
+ level = 2;
71
+ evidence.push("Suppressions configured");
72
+ }
73
+ if (fileExists(join(".judges-audit-trail", "trail.json"))) {
74
+ level = 3;
75
+ evidence.push("Audit trail active");
76
+ }
77
+ if (fileExists(".judges-votes.json")) {
78
+ level = 4;
79
+ evidence.push("Consensus voting enabled");
80
+ }
81
+ if (fileExists(join(".judges-auto-fix", "fix-history.json"))) {
82
+ level = 5;
83
+ evidence.push("Auto-fix suggestions used");
84
+ }
85
+ if (level < 2)
86
+ nextSteps.push("Configure finding suppressions with `judges suppress`");
87
+ if (level < 3)
88
+ nextSteps.push("Enable audit trail with `judges audit-trail`");
89
+ if (level < 4)
90
+ nextSteps.push("Set up consensus voting with `judges vote`");
91
+ if (level < 5)
92
+ nextSteps.push("Use auto-fix suggestions with `judges auto-fix`");
93
+ dimensions.push({
94
+ name: "Finding Management",
95
+ level,
96
+ maxLevel: 5,
97
+ description: "How findings are triaged, tracked, and resolved",
98
+ evidence,
99
+ nextSteps,
100
+ });
101
+ }
102
+ // 3. Compliance & governance
103
+ {
104
+ let level = 1;
105
+ const evidence = [];
106
+ const nextSteps = [];
107
+ if (fileExists(join(".judges-reg-watch", "watch.json")) || fileExists(".judges-reg-watch.json")) {
108
+ level = 2;
109
+ evidence.push("Regulatory watch configured");
110
+ }
111
+ if (fileExists(".judges-policy-audit.json")) {
112
+ level = 3;
113
+ evidence.push("Policy audit active");
114
+ }
115
+ if (fileExists(join(".judges-audit-bundle", "manifest.json"))) {
116
+ level = 4;
117
+ evidence.push("Audit bundles generated");
118
+ }
119
+ const costData = loadJsonSafe(join(".judges-cost-forecast", "history.json"), {
120
+ snapshots: [],
121
+ });
122
+ if (costData.snapshots.length > 0) {
123
+ level = 5;
124
+ evidence.push("Cost forecasting active");
125
+ }
126
+ if (level < 2)
127
+ nextSteps.push("Set up regulatory watch with `judges reg-watch`");
128
+ if (level < 3)
129
+ nextSteps.push("Run policy audit with `judges policy-audit`");
130
+ if (level < 4)
131
+ nextSteps.push("Generate audit bundles with `judges audit-bundle`");
132
+ if (level < 5)
133
+ nextSteps.push("Track costs with `judges cost-forecast`");
134
+ dimensions.push({
135
+ name: "Compliance & Governance",
136
+ level,
137
+ maxLevel: 5,
138
+ description: "Regulatory compliance and audit readiness",
139
+ evidence,
140
+ nextSteps,
141
+ });
142
+ }
143
+ // 4. Team collaboration
144
+ {
145
+ let level = 1;
146
+ const evidence = [];
147
+ const nextSteps = [];
148
+ if (fileExists(".judges-correlations.json")) {
149
+ level = 2;
150
+ evidence.push("Finding correlation active");
151
+ }
152
+ if (fileExists(".judges-digest.json")) {
153
+ level = 3;
154
+ evidence.push("Digest reports active");
155
+ }
156
+ if (fileExists(join(".judges-shared-rules"))) {
157
+ level = 4;
158
+ evidence.push("Rule sharing enabled");
159
+ }
160
+ if (fileExists(join(".judges-patterns"))) {
161
+ level = 5;
162
+ evidence.push("Pattern registry active");
163
+ }
164
+ if (level < 2)
165
+ nextSteps.push("Enable correlation with `judges correlate`");
166
+ if (level < 3)
167
+ nextSteps.push("Set up digests with `judges digest`");
168
+ if (level < 4)
169
+ nextSteps.push("Share rules with `judges rule-share`");
170
+ if (level < 5)
171
+ nextSteps.push("Build pattern registry with `judges pattern-registry`");
172
+ dimensions.push({
173
+ name: "Team Collaboration",
174
+ level,
175
+ maxLevel: 5,
176
+ description: "Knowledge sharing and team review processes",
177
+ evidence,
178
+ nextSteps,
179
+ });
180
+ }
181
+ // 5. AI-specific readiness
182
+ {
183
+ let level = 1;
184
+ const evidence = [];
185
+ const nextSteps = [];
186
+ if (fileExists(".judges-model-risk.json")) {
187
+ level = 2;
188
+ evidence.push("Model risk profiling active");
189
+ }
190
+ if (fileExists(join(".judges-model-trust", "trust-history.json"))) {
191
+ level = 3;
192
+ evidence.push("AI model trust scoring active");
193
+ }
194
+ if (fileExists(join(".judges-prompt-audit", "audit-history.json"))) {
195
+ level = 4;
196
+ evidence.push("Prompt injection auditing active");
197
+ }
198
+ if (fileExists(join(".judges-learn"))) {
199
+ level = 5;
200
+ evidence.push("Developer learning paths active");
201
+ }
202
+ if (level < 2)
203
+ nextSteps.push("Profile AI model risks with `judges model-risk`");
204
+ if (level < 3)
205
+ nextSteps.push("Score AI model trust with `judges ai-model-trust`");
206
+ if (level < 4)
207
+ nextSteps.push("Audit for prompt injection with `judges ai-prompt-audit`");
208
+ if (level < 5)
209
+ nextSteps.push("Set up learning paths with `judges learn`");
210
+ dimensions.push({
211
+ name: "AI Readiness",
212
+ level,
213
+ maxLevel: 5,
214
+ description: "AI-specific code review maturity",
215
+ evidence,
216
+ nextSteps,
217
+ });
218
+ }
219
+ // Overall
220
+ const avgLevel = Math.round(dimensions.reduce((s, d) => s + d.level, 0) / dimensions.length);
221
+ const score = Math.round((dimensions.reduce((s, d) => s + d.level, 0) / (dimensions.length * 5)) * 100);
222
+ return {
223
+ overallLevel: avgLevel,
224
+ overallLabel: MATURITY_LABELS[avgLevel - 1] || "Unknown",
225
+ dimensions,
226
+ score,
227
+ timestamp: new Date().toISOString(),
228
+ };
229
+ }
230
+ // ─── CLI ────────────────────────────────────────────────────────────────────
231
+ export function runSecurityMaturity(argv) {
232
+ if (argv.includes("--help") || argv.includes("-h")) {
233
+ console.log(`
234
+ judges security-maturity — Security posture maturity assessment
235
+
236
+ Usage:
237
+ judges security-maturity
238
+ judges security-maturity --dimension "Scanning Adoption"
239
+ judges security-maturity --roadmap
240
+
241
+ Options:
242
+ --dimension <name> Show details for a specific dimension
243
+ --roadmap Show prioritized improvement roadmap
244
+ --format json JSON output
245
+ --help, -h Show this help
246
+ `);
247
+ return;
248
+ }
249
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
250
+ const assessment = assessMaturity();
251
+ // Single dimension
252
+ const dimName = argv.find((_a, i) => argv[i - 1] === "--dimension");
253
+ if (dimName) {
254
+ const dim = assessment.dimensions.find((d) => d.name.toLowerCase().includes(dimName.toLowerCase()));
255
+ if (!dim) {
256
+ console.error(` Dimension not found. Available: ${assessment.dimensions.map((d) => d.name).join(", ")}`);
257
+ return;
258
+ }
259
+ if (format === "json") {
260
+ console.log(JSON.stringify(dim, null, 2));
261
+ }
262
+ else {
263
+ console.log(`\n ${dim.name} — Level ${dim.level}/${dim.maxLevel} (${MATURITY_LABELS[dim.level - 1]})`);
264
+ console.log(` ──────────────────────────`);
265
+ console.log(` ${dim.description}`);
266
+ if (dim.evidence.length) {
267
+ console.log(`\n Evidence:`);
268
+ for (const e of dim.evidence)
269
+ console.log(` ✅ ${e}`);
270
+ }
271
+ if (dim.nextSteps.length) {
272
+ console.log(`\n Next steps:`);
273
+ for (const s of dim.nextSteps)
274
+ console.log(` → ${s}`);
275
+ }
276
+ console.log("");
277
+ }
278
+ return;
279
+ }
280
+ // Roadmap
281
+ if (argv.includes("--roadmap")) {
282
+ const allSteps = assessment.dimensions
283
+ .sort((a, b) => a.level - b.level)
284
+ .flatMap((d) => d.nextSteps.map((s) => ({ dimension: d.name, level: d.level, step: s })));
285
+ if (format === "json") {
286
+ console.log(JSON.stringify(allSteps, null, 2));
287
+ }
288
+ else {
289
+ console.log(`\n Security Maturity Roadmap\n ──────────────────────────`);
290
+ console.log(` Current: Level ${assessment.overallLevel} (${assessment.overallLabel}) — ${assessment.score}/100\n`);
291
+ for (const s of allSteps) {
292
+ console.log(` [L${s.level}] ${s.dimension.padEnd(25)} → ${s.step}`);
293
+ }
294
+ console.log("");
295
+ }
296
+ return;
297
+ }
298
+ // Full assessment
299
+ if (format === "json") {
300
+ console.log(JSON.stringify(assessment, null, 2));
301
+ }
302
+ else {
303
+ console.log(`\n Security Maturity Assessment`);
304
+ console.log(` Overall: Level ${assessment.overallLevel}/5 (${assessment.overallLabel}) — Score: ${assessment.score}/100`);
305
+ console.log(` ──────────────────────────`);
306
+ for (const d of assessment.dimensions) {
307
+ const bar = "█".repeat(d.level) + "░".repeat(d.maxLevel - d.level);
308
+ console.log(` ${d.name.padEnd(25)} ${bar} ${d.level}/${d.maxLevel} (${MATURITY_LABELS[d.level - 1]})`);
309
+ }
310
+ console.log(`\n Run --roadmap to see improvement steps\n`);
311
+ }
312
+ }
313
+ //# sourceMappingURL=security-maturity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-maturity.js","sourceRoot":"","sources":["../../src/commands/security-maturity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Test correlate — ingests test coverage data and cross-references
3
+ * with security findings to prioritize high-risk untested areas.
4
+ *
5
+ * All data from local coverage files.
6
+ */
7
+ export declare function runTestCorrelate(argv: string[]): void;
8
+ //# sourceMappingURL=test-correlate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-correlate.d.ts","sourceRoot":"","sources":["../../src/commands/test-correlate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsLH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6ErD"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Test correlate — ingests test coverage data and cross-references
3
+ * with security findings to prioritize high-risk untested areas.
4
+ *
5
+ * All data from local coverage files.
6
+ */
7
+ import { existsSync, readFileSync, mkdirSync, writeFileSync } from "fs";
8
+ import { join } from "path";
9
+ // ─── Coverage parsers ───────────────────────────────────────────────────────
10
+ function parseLcov(content) {
11
+ const entries = [];
12
+ let currentFile = "";
13
+ let linesFound = 0;
14
+ let linesHit = 0;
15
+ for (const line of content.split("\n")) {
16
+ if (line.startsWith("SF:")) {
17
+ currentFile = line.substring(3).trim();
18
+ linesFound = 0;
19
+ linesHit = 0;
20
+ }
21
+ else if (line.startsWith("LF:")) {
22
+ linesFound = parseInt(line.substring(3), 10);
23
+ }
24
+ else if (line.startsWith("LH:")) {
25
+ linesHit = parseInt(line.substring(3), 10);
26
+ }
27
+ else if (line === "end_of_record" && currentFile) {
28
+ entries.push({
29
+ file: currentFile,
30
+ lines: {
31
+ covered: linesHit,
32
+ total: linesFound,
33
+ percentage: linesFound > 0 ? Math.round((linesHit / linesFound) * 100) : 0,
34
+ },
35
+ });
36
+ currentFile = "";
37
+ }
38
+ }
39
+ return entries;
40
+ }
41
+ function parseIstanbul(content) {
42
+ try {
43
+ const data = JSON.parse(content);
44
+ const entries = [];
45
+ for (const [file, info] of Object.entries(data)) {
46
+ const cov = info;
47
+ if (cov.s) {
48
+ const stmts = Object.values(cov.s);
49
+ const total = stmts.length;
50
+ const covered = stmts.filter((v) => v > 0).length;
51
+ entries.push({
52
+ file,
53
+ lines: { covered, total, percentage: total > 0 ? Math.round((covered / total) * 100) : 0 },
54
+ });
55
+ }
56
+ }
57
+ return entries;
58
+ }
59
+ catch {
60
+ return [];
61
+ }
62
+ }
63
+ function loadCoverage() {
64
+ const lcovPaths = ["coverage/lcov.info", "lcov.info"];
65
+ for (const p of lcovPaths) {
66
+ if (existsSync(p))
67
+ return parseLcov(readFileSync(p, "utf-8"));
68
+ }
69
+ const istanbulPaths = ["coverage/coverage-final.json", ".nyc_output/coverage-final.json"];
70
+ for (const p of istanbulPaths) {
71
+ if (existsSync(p))
72
+ return parseIstanbul(readFileSync(p, "utf-8"));
73
+ }
74
+ // Cobertura XML — simplified check
75
+ if (existsSync("coverage/cobertura-coverage.xml") || existsSync("coverage.xml")) {
76
+ const p = existsSync("coverage/cobertura-coverage.xml") ? "coverage/cobertura-coverage.xml" : "coverage.xml";
77
+ const content = readFileSync(p, "utf-8");
78
+ const entries = [];
79
+ const fileRegex = /filename="([^"]+)"/g;
80
+ const rateRegex = /line-rate="([\d.]+)"/g;
81
+ let fileMatch;
82
+ let rateMatch;
83
+ while ((fileMatch = fileRegex.exec(content)) && (rateMatch = rateRegex.exec(content))) {
84
+ entries.push({
85
+ file: fileMatch[1],
86
+ lines: { covered: 0, total: 0, percentage: Math.round(parseFloat(rateMatch[1]) * 100) },
87
+ });
88
+ }
89
+ return entries;
90
+ }
91
+ return [];
92
+ }
93
+ function loadFindings() {
94
+ const paths = [".judges-findings.json", "judges-report.json"];
95
+ for (const p of paths) {
96
+ if (!existsSync(p))
97
+ continue;
98
+ try {
99
+ const data = JSON.parse(readFileSync(p, "utf-8"));
100
+ if (Array.isArray(data))
101
+ return data;
102
+ if (data.findings)
103
+ return data.findings;
104
+ }
105
+ catch {
106
+ /* skip */
107
+ }
108
+ }
109
+ return [];
110
+ }
111
+ // ─── Correlation ────────────────────────────────────────────────────────────
112
+ function correlate(coverage, findings) {
113
+ const coverageMap = new Map();
114
+ for (const c of coverage)
115
+ coverageMap.set(c.file, c);
116
+ const findingsByFile = new Map();
117
+ for (const f of findings) {
118
+ const key = f.file || "unknown";
119
+ if (!findingsByFile.has(key))
120
+ findingsByFile.set(key, []);
121
+ findingsByFile.get(key).push(f);
122
+ }
123
+ const correlations = [];
124
+ for (const [file, fileFindings] of findingsByFile) {
125
+ const cov = coverageMap.get(file);
126
+ const covPct = cov ? cov.lines.percentage : 0;
127
+ const sevWeights = { critical: 10, high: 7, medium: 4, low: 1 };
128
+ const riskScore = fileFindings.reduce((s, f) => s + (sevWeights[f.severity] || 2), 0);
129
+ const combinedRisk = riskScore * (1 + (100 - covPct) / 100);
130
+ let riskCategory = "low";
131
+ if (combinedRisk > 30)
132
+ riskCategory = "critical";
133
+ else if (combinedRisk > 15)
134
+ riskCategory = "high";
135
+ else if (combinedRisk > 7)
136
+ riskCategory = "medium";
137
+ correlations.push({
138
+ file,
139
+ coveragePercent: covPct,
140
+ findingCount: fileFindings.length,
141
+ riskCategory,
142
+ findings: fileFindings,
143
+ });
144
+ }
145
+ return correlations.sort((a, b) => {
146
+ const order = { critical: 0, high: 1, medium: 2, low: 3 };
147
+ return (order[a.riskCategory] || 4) - (order[b.riskCategory] || 4);
148
+ });
149
+ }
150
+ // ─── CLI ────────────────────────────────────────────────────────────────────
151
+ const STORE = ".judges-test-correlate";
152
+ export function runTestCorrelate(argv) {
153
+ if (argv.includes("--help") || argv.includes("-h")) {
154
+ console.log(`
155
+ judges test-correlate — Cross-reference test coverage with findings
156
+
157
+ Usage:
158
+ judges test-correlate
159
+ judges test-correlate --risk critical,high
160
+ judges test-correlate --save
161
+
162
+ Options:
163
+ --risk <levels> Filter by risk category (comma-separated)
164
+ --save Save report to ${STORE}/
165
+ --format json JSON output
166
+ --help, -h Show this help
167
+
168
+ Supports: lcov.info, coverage-final.json (Istanbul), cobertura XML
169
+ `);
170
+ return;
171
+ }
172
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
173
+ const coverage = loadCoverage();
174
+ const findings = loadFindings();
175
+ if (coverage.length === 0) {
176
+ console.log(" No coverage data found. Run tests with coverage first.");
177
+ console.log(" Supported formats: lcov.info, coverage-final.json, cobertura XML");
178
+ return;
179
+ }
180
+ let correlations = correlate(coverage, findings);
181
+ const riskFilter = argv.find((_a, i) => argv[i - 1] === "--risk");
182
+ if (riskFilter) {
183
+ const allowed = riskFilter.split(",");
184
+ correlations = correlations.filter((c) => allowed.includes(c.riskCategory));
185
+ }
186
+ const avgCov = coverage.length > 0 ? Math.round(coverage.reduce((s, c) => s + c.lines.percentage, 0) / coverage.length) : 0;
187
+ const report = {
188
+ correlations,
189
+ totalFiles: coverage.length,
190
+ untestedFilesWithFindings: correlations.filter((c) => c.coveragePercent === 0).length,
191
+ avgCoverage: avgCov,
192
+ timestamp: new Date().toISOString(),
193
+ };
194
+ if (argv.includes("--save")) {
195
+ if (!existsSync(STORE))
196
+ mkdirSync(STORE, { recursive: true });
197
+ writeFileSync(join(STORE, "correlation-report.json"), JSON.stringify(report, null, 2));
198
+ console.log(` Saved to ${STORE}/correlation-report.json`);
199
+ }
200
+ if (format === "json") {
201
+ console.log(JSON.stringify(report, null, 2));
202
+ }
203
+ else {
204
+ console.log(`\n Test-Finding Correlation`);
205
+ console.log(` Files: ${report.totalFiles} Avg Coverage: ${report.avgCoverage}%`);
206
+ console.log(` Untested files with findings: ${report.untestedFilesWithFindings}`);
207
+ console.log(` ──────────────────────────`);
208
+ if (correlations.length === 0) {
209
+ console.log(` ✅ No finding-coverage correlations\n`);
210
+ return;
211
+ }
212
+ for (const c of correlations.slice(0, 20)) {
213
+ const covBar = c.coveragePercent > 0 ? `${c.coveragePercent}%` : "0% ⚠️";
214
+ console.log(` [${c.riskCategory.toUpperCase().padEnd(8)}] ${c.file}`);
215
+ console.log(` Coverage: ${covBar} Findings: ${c.findingCount}`);
216
+ }
217
+ if (correlations.length > 20)
218
+ console.log(` ... and ${correlations.length - 20} more`);
219
+ console.log("");
220
+ }
221
+ }
222
+ //# sourceMappingURL=test-correlate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-correlate.js","sourceRoot":"","sources":["../../src/commands/test-correlate.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevinrabun/judges",
3
- "version": "3.47.0",
3
+ "version": "3.49.0",
4
4
  "description": "45 specialized judges that evaluate AI-generated code for security, cost, and quality.",
5
5
  "mcpName": "io.github.KevinRabun/judges",
6
6
  "type": "module",
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/kevinrabun/judges",
8
8
  "source": "github"
9
9
  },
10
- "version": "3.47.0",
10
+ "version": "3.49.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.47.0",
15
+ "version": "3.49.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }