@kevinrabun/judges 3.48.0 → 3.50.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/api-audit.d.ts +9 -0
  6. package/dist/commands/api-audit.d.ts.map +1 -0
  7. package/dist/commands/api-audit.js +360 -0
  8. package/dist/commands/api-audit.js.map +1 -0
  9. package/dist/commands/compliance-map.d.ts +9 -0
  10. package/dist/commands/compliance-map.d.ts.map +1 -0
  11. package/dist/commands/compliance-map.js +375 -0
  12. package/dist/commands/compliance-map.js.map +1 -0
  13. package/dist/commands/exec-report.d.ts +9 -0
  14. package/dist/commands/exec-report.d.ts.map +1 -0
  15. package/dist/commands/exec-report.js +272 -0
  16. package/dist/commands/exec-report.js.map +1 -0
  17. package/dist/commands/guided-tour.d.ts +9 -0
  18. package/dist/commands/guided-tour.d.ts.map +1 -0
  19. package/dist/commands/guided-tour.js +288 -0
  20. package/dist/commands/guided-tour.js.map +1 -0
  21. package/dist/commands/iac-lint.d.ts +8 -0
  22. package/dist/commands/iac-lint.d.ts.map +1 -0
  23. package/dist/commands/iac-lint.js +313 -0
  24. package/dist/commands/iac-lint.js.map +1 -0
  25. package/dist/commands/incident-response.d.ts +8 -0
  26. package/dist/commands/incident-response.d.ts.map +1 -0
  27. package/dist/commands/incident-response.js +255 -0
  28. package/dist/commands/incident-response.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/perf-compare.d.ts +9 -0
  42. package/dist/commands/perf-compare.d.ts.map +1 -0
  43. package/dist/commands/perf-compare.js +246 -0
  44. package/dist/commands/perf-compare.js.map +1 -0
  45. package/dist/commands/pii-scan.d.ts +8 -0
  46. package/dist/commands/pii-scan.d.ts.map +1 -0
  47. package/dist/commands/pii-scan.js +300 -0
  48. package/dist/commands/pii-scan.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/secret-scan.d.ts +8 -0
  62. package/dist/commands/secret-scan.d.ts.map +1 -0
  63. package/dist/commands/secret-scan.js +245 -0
  64. package/dist/commands/secret-scan.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,224 @@
1
+ /**
2
+ * Risk heatmap — generates a file/directory risk heatmap
3
+ * combining finding density, severity, and test coverage.
4
+ *
5
+ * All data from local files.
6
+ */
7
+ import { existsSync, readFileSync, readdirSync, mkdirSync, writeFileSync } from "fs";
8
+ import { join, dirname, relative } from "path";
9
+ // ─── Data Loading ───────────────────────────────────────────────────────────
10
+ function loadFindings() {
11
+ const paths = [".judges-findings.json", "judges-report.json"];
12
+ for (const p of paths) {
13
+ if (!existsSync(p))
14
+ continue;
15
+ try {
16
+ const data = JSON.parse(readFileSync(p, "utf-8"));
17
+ if (Array.isArray(data))
18
+ return data;
19
+ if (data.findings)
20
+ return data.findings;
21
+ }
22
+ catch {
23
+ /* skip */
24
+ }
25
+ }
26
+ return [];
27
+ }
28
+ function getProjectFiles(dir, maxFiles) {
29
+ const result = [];
30
+ const skipDirs = new Set(["node_modules", ".git", "dist", "build", "coverage", ".next", "__pycache__"]);
31
+ function walk(d) {
32
+ if (result.length >= maxFiles)
33
+ return;
34
+ let names;
35
+ try {
36
+ names = readdirSync(d);
37
+ }
38
+ catch {
39
+ return;
40
+ }
41
+ for (const name of names) {
42
+ if (result.length >= maxFiles)
43
+ return;
44
+ if (skipDirs.has(name))
45
+ continue;
46
+ const full = join(d, name);
47
+ try {
48
+ const sub = readdirSync(full);
49
+ void sub;
50
+ walk(full);
51
+ }
52
+ catch {
53
+ result.push(relative(dir, full));
54
+ }
55
+ }
56
+ }
57
+ walk(dir);
58
+ return result;
59
+ }
60
+ // ─── Heatmap ────────────────────────────────────────────────────────────────
61
+ function buildHeatmap(findings) {
62
+ const fileMap = new Map();
63
+ for (const f of findings) {
64
+ const file = f.file || "unknown";
65
+ if (!fileMap.has(file))
66
+ fileMap.set(file, { findings: 0, critical: 0, high: 0 });
67
+ const entry = fileMap.get(file);
68
+ entry.findings++;
69
+ if (f.severity === "critical")
70
+ entry.critical++;
71
+ if (f.severity === "high")
72
+ entry.high++;
73
+ }
74
+ // Also aggregate by directory
75
+ const dirMap = new Map();
76
+ for (const [file, data] of fileMap) {
77
+ const dir = dirname(file);
78
+ if (!dirMap.has(dir))
79
+ dirMap.set(dir, { findings: 0, critical: 0, high: 0 });
80
+ const entry = dirMap.get(dir);
81
+ entry.findings += data.findings;
82
+ entry.critical += data.critical;
83
+ entry.high += data.high;
84
+ }
85
+ const entries = [];
86
+ for (const [path, data] of [...fileMap, ...dirMap]) {
87
+ const riskScore = data.critical * 10 + data.high * 5 + (data.findings - data.critical - data.high) * 2;
88
+ let riskLevel = "clean";
89
+ if (riskScore > 30)
90
+ riskLevel = "critical";
91
+ else if (riskScore > 15)
92
+ riskLevel = "high";
93
+ else if (riskScore > 5)
94
+ riskLevel = "medium";
95
+ else if (riskScore > 0)
96
+ riskLevel = "low";
97
+ entries.push({
98
+ path,
99
+ findingCount: data.findings,
100
+ criticalCount: data.critical,
101
+ highCount: data.high,
102
+ riskScore,
103
+ riskLevel,
104
+ });
105
+ }
106
+ return entries.sort((a, b) => b.riskScore - a.riskScore);
107
+ }
108
+ function renderHeatmapHtml(entries) {
109
+ const rows = entries
110
+ .slice(0, 50)
111
+ .map((e) => {
112
+ const color = e.riskLevel === "critical"
113
+ ? "#dc3545"
114
+ : e.riskLevel === "high"
115
+ ? "#fd7e14"
116
+ : e.riskLevel === "medium"
117
+ ? "#ffc107"
118
+ : e.riskLevel === "low"
119
+ ? "#28a745"
120
+ : "#6c757d";
121
+ return `<tr><td>${e.path}</td><td style="background:${color};color:white;text-align:center">${e.riskScore}</td><td>${e.findingCount}</td><td>${e.criticalCount}</td><td>${e.highCount}</td></tr>`;
122
+ })
123
+ .join("\n");
124
+ return `<!DOCTYPE html>
125
+ <html><head><title>Risk Heatmap</title>
126
+ <style>body{font-family:system-ui;margin:2rem}table{border-collapse:collapse;width:100%}th,td{padding:8px 12px;border:1px solid #ddd;text-align:left}th{background:#f5f5f5}tr:hover{background:#f0f0f0}</style>
127
+ </head><body>
128
+ <h1>Risk Heatmap</h1>
129
+ <p>Generated: ${new Date().toISOString()}</p>
130
+ <table><thead><tr><th>Path</th><th>Risk Score</th><th>Findings</th><th>Critical</th><th>High</th></tr></thead>
131
+ <tbody>${rows}</tbody></table>
132
+ </body></html>`;
133
+ }
134
+ // ─── CLI ────────────────────────────────────────────────────────────────────
135
+ const STORE = ".judges-risk-heatmap";
136
+ export function runRiskHeatmap(argv) {
137
+ if (argv.includes("--help") || argv.includes("-h")) {
138
+ console.log(`
139
+ judges risk-heatmap — File/directory risk visualization
140
+
141
+ Usage:
142
+ judges risk-heatmap
143
+ judges risk-heatmap --risk critical,high
144
+ judges risk-heatmap --html
145
+ judges risk-heatmap --dirs-only
146
+
147
+ Options:
148
+ --risk <levels> Filter by risk level (comma-separated)
149
+ --html Generate HTML heatmap report
150
+ --dirs-only Show directory-level aggregation only
151
+ --top <n> Show top N riskiest entries
152
+ --save Save report to ${STORE}/
153
+ --format json JSON output
154
+ --help, -h Show this help
155
+ `);
156
+ return;
157
+ }
158
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
159
+ const findings = loadFindings();
160
+ if (findings.length === 0) {
161
+ console.log(" No findings data found. Run a scan first to populate findings.");
162
+ return;
163
+ }
164
+ let entries = buildHeatmap(findings);
165
+ // Filters
166
+ if (argv.includes("--dirs-only")) {
167
+ entries = entries.filter((e) => !e.path.includes(".") || e.path === ".");
168
+ }
169
+ const riskFilter = argv.find((_a, i) => argv[i - 1] === "--risk");
170
+ if (riskFilter) {
171
+ const allowed = riskFilter.split(",");
172
+ entries = entries.filter((e) => allowed.includes(e.riskLevel));
173
+ }
174
+ const topN = argv.find((_a, i) => argv[i - 1] === "--top");
175
+ if (topN)
176
+ entries = entries.slice(0, parseInt(topN, 10));
177
+ const totalFindings = findings.length;
178
+ const hotspots = entries.filter((e) => e.riskLevel === "critical").map((e) => e.path);
179
+ const _projectFiles = getProjectFiles(".", 1000);
180
+ const report = {
181
+ entries,
182
+ totalFiles: entries.length,
183
+ totalFindings,
184
+ hotspots,
185
+ timestamp: new Date().toISOString(),
186
+ };
187
+ // HTML output
188
+ if (argv.includes("--html")) {
189
+ if (!existsSync(STORE))
190
+ mkdirSync(STORE, { recursive: true });
191
+ const html = renderHeatmapHtml(entries);
192
+ const htmlPath = join(STORE, "heatmap.html");
193
+ writeFileSync(htmlPath, html);
194
+ console.log(` HTML heatmap saved to ${htmlPath}`);
195
+ return;
196
+ }
197
+ // Save
198
+ if (argv.includes("--save")) {
199
+ if (!existsSync(STORE))
200
+ mkdirSync(STORE, { recursive: true });
201
+ writeFileSync(join(STORE, "heatmap.json"), JSON.stringify(report, null, 2));
202
+ console.log(` Report saved to ${STORE}/heatmap.json`);
203
+ }
204
+ if (format === "json") {
205
+ console.log(JSON.stringify(report, null, 2));
206
+ }
207
+ else {
208
+ console.log(`\n Risk Heatmap — ${totalFindings} findings across ${entries.length} locations`);
209
+ console.log(` ──────────────────────────`);
210
+ if (hotspots.length > 0) {
211
+ console.log(`\n 🔥 Critical hotspots: ${hotspots.slice(0, 5).join(", ")}`);
212
+ }
213
+ console.log("");
214
+ for (const e of entries.slice(0, 25)) {
215
+ const bar = "█".repeat(Math.min(e.riskScore, 20));
216
+ const label = e.riskLevel.toUpperCase().padEnd(8);
217
+ console.log(` [${label}] ${e.path.padEnd(40)} ${bar} ${e.riskScore} (${e.findingCount} findings)`);
218
+ }
219
+ if (entries.length > 25)
220
+ console.log(` ... and ${entries.length - 25} more`);
221
+ console.log("");
222
+ }
223
+ }
224
+ //# sourceMappingURL=risk-heatmap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-heatmap.js","sourceRoot":"","sources":["../../src/commands/risk-heatmap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAqB/C,+EAA+E;AAE/E,SAAS,YAAY;IACnB,MAAM,KAAK,GAAG,CAAC,uBAAuB,EAAE,oBAAoB,CAAC,CAAC;IAC9D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,SAAS;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YAClD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACrC,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,eAAe,CAAC,GAAW,EAAE,QAAgB;IACpD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAExG,SAAS,IAAI,CAAC,CAAS;QACrB,IAAI,MAAM,CAAC,MAAM,IAAI,QAAQ;YAAE,OAAO;QACtC,IAAI,KAAe,CAAC;QACpB,IAAI,CAAC;YACH,KAAK,GAAG,WAAW,CAAC,CAAC,CAAwB,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,MAAM,CAAC,MAAM,IAAI,QAAQ;gBAAE,OAAO;YACtC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC9B,KAAK,GAAG,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAE/E,SAAS,YAAY,CAAC,QAAoD;IACxE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgE,CAAC;IAExF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACjF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QACjC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,IAAI,CAAC,CAAC,QAAQ,KAAK,UAAU;YAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;QAChD,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM;YAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,8BAA8B;IAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAgE,CAAC;IACvF,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QAC/B,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAChC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAChC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,MAAM,OAAO,GAAgB,EAAE,CAAC;IAEhC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvG,IAAI,SAAS,GAA2B,OAAO,CAAC;QAChD,IAAI,SAAS,GAAG,EAAE;YAAE,SAAS,GAAG,UAAU,CAAC;aACtC,IAAI,SAAS,GAAG,EAAE;YAAE,SAAS,GAAG,MAAM,CAAC;aACvC,IAAI,SAAS,GAAG,CAAC;YAAE,SAAS,GAAG,QAAQ,CAAC;aACxC,IAAI,SAAS,GAAG,CAAC;YAAE,SAAS,GAAG,KAAK,CAAC;QAE1C,OAAO,CAAC,IAAI,CAAC;YACX,IAAI;YACJ,YAAY,EAAE,IAAI,CAAC,QAAQ;YAC3B,aAAa,EAAE,IAAI,CAAC,QAAQ;YAC5B,SAAS,EAAE,IAAI,CAAC,IAAI;YACpB,SAAS;YACT,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAoB;IAC7C,MAAM,IAAI,GAAG,OAAO;SACjB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,KAAK,GACT,CAAC,CAAC,SAAS,KAAK,UAAU;YACxB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM;gBACtB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ;oBACxB,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK;wBACrB,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,SAAS,CAAC;QACtB,OAAO,WAAW,CAAC,CAAC,IAAI,8BAA8B,KAAK,mCAAmC,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,YAAY,YAAY,CAAC,CAAC,aAAa,YAAY,CAAC,CAAC,SAAS,YAAY,CAAC;IACpM,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;;;gBAKO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;SAE/B,IAAI;eACE,CAAC;AAChB,CAAC;AAED,+EAA+E;AAE/E,MAAM,KAAK,GAAG,sBAAsB,CAAC;AAErC,MAAM,UAAU,cAAc,CAAC,IAAc;IAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;yCAcyB,KAAK;;;CAG7C,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,MAAM,CAAC;IAC1F,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAEhC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IAED,IAAI,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAErC,UAAU;IACV,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;IAClF,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;IAC3E,IAAI,IAAI;QAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAEzD,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtF,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAEjD,MAAM,MAAM,GAAkB;QAC5B,OAAO;QACP,UAAU,EAAE,OAAO,CAAC,MAAM;QAC1B,aAAa;QACb,QAAQ;QACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,cAAc;IACd,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAC7C,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,OAAO;IACP,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,eAAe,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,aAAa,oBAAoB,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;QAC/F,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAE5C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,6BAA6B,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,YAAY,YAAY,CAAC,CAAC;QACxG,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * SBOM export — generates Software Bill of Materials in
3
+ * CycloneDX-compatible JSON from project manifests.
4
+ *
5
+ * All data from local project files.
6
+ */
7
+ export declare function runSbomExport(argv: string[]): void;
8
+ //# sourceMappingURL=sbom-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sbom-export.d.ts","sourceRoot":"","sources":["../../src/commands/sbom-export.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyIH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkDlD"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * SBOM export — generates Software Bill of Materials in
3
+ * CycloneDX-compatible JSON from project manifests.
4
+ *
5
+ * All data from local project files.
6
+ */
7
+ import { existsSync, readFileSync, mkdirSync, writeFileSync } from "fs";
8
+ import { join, basename } from "path";
9
+ // ─── Parsers ────────────────────────────────────────────────────────────────
10
+ function parsePackageJson() {
11
+ if (!existsSync("package.json"))
12
+ return [];
13
+ try {
14
+ const pkg = JSON.parse(readFileSync("package.json", "utf-8"));
15
+ const components = [];
16
+ for (const [name, ver] of Object.entries(pkg.dependencies || {})) {
17
+ components.push({
18
+ type: "library",
19
+ name,
20
+ version: String(ver).replace(/^[\^~>=<]+/, ""),
21
+ purl: `pkg:npm/${name.replace("/", "%2F")}@${String(ver).replace(/^[\^~>=<]+/, "")}`,
22
+ scope: "required",
23
+ licenses: [],
24
+ });
25
+ }
26
+ for (const [name, ver] of Object.entries(pkg.devDependencies || {})) {
27
+ components.push({
28
+ type: "library",
29
+ name,
30
+ version: String(ver).replace(/^[\^~>=<]+/, ""),
31
+ purl: `pkg:npm/${name.replace("/", "%2F")}@${String(ver).replace(/^[\^~>=<]+/, "")}`,
32
+ scope: "optional",
33
+ licenses: [],
34
+ });
35
+ }
36
+ return components;
37
+ }
38
+ catch {
39
+ return [];
40
+ }
41
+ }
42
+ function parseRequirements() {
43
+ if (!existsSync("requirements.txt"))
44
+ return [];
45
+ try {
46
+ const lines = readFileSync("requirements.txt", "utf-8").split("\n");
47
+ const components = [];
48
+ for (const line of lines) {
49
+ const match = /^([a-zA-Z0-9_-]+)==(.+)/.exec(line.trim());
50
+ if (match) {
51
+ components.push({
52
+ type: "library",
53
+ name: match[1],
54
+ version: match[2],
55
+ purl: `pkg:pypi/${match[1]}@${match[2]}`,
56
+ scope: "required",
57
+ licenses: [],
58
+ });
59
+ }
60
+ }
61
+ return components;
62
+ }
63
+ catch {
64
+ return [];
65
+ }
66
+ }
67
+ function parseGoMod() {
68
+ if (!existsSync("go.mod"))
69
+ return [];
70
+ try {
71
+ const lines = readFileSync("go.mod", "utf-8").split("\n");
72
+ const components = [];
73
+ for (const line of lines) {
74
+ const match = /^\s+([\w./\-@]+)\s+(v[\d.]+)/.exec(line);
75
+ if (match) {
76
+ components.push({
77
+ type: "library",
78
+ name: match[1],
79
+ version: match[2],
80
+ purl: `pkg:golang/${match[1]}@${match[2]}`,
81
+ scope: "required",
82
+ licenses: [],
83
+ });
84
+ }
85
+ }
86
+ return components;
87
+ }
88
+ catch {
89
+ return [];
90
+ }
91
+ }
92
+ function buildSbom() {
93
+ const projectName = existsSync("package.json")
94
+ ? JSON.parse(readFileSync("package.json", "utf-8")).name || basename(process.cwd())
95
+ : basename(process.cwd());
96
+ const projectVersion = existsSync("package.json")
97
+ ? JSON.parse(readFileSync("package.json", "utf-8")).version || "0.0.0"
98
+ : "0.0.0";
99
+ const components = [...parsePackageJson(), ...parseRequirements(), ...parseGoMod()];
100
+ return {
101
+ bomFormat: "CycloneDX",
102
+ specVersion: "1.5",
103
+ version: 1,
104
+ metadata: {
105
+ timestamp: new Date().toISOString(),
106
+ component: { type: "application", name: projectName, version: projectVersion },
107
+ tools: [{ name: "@kevinrabun/judges", version: "3.48.0" }],
108
+ },
109
+ components,
110
+ };
111
+ }
112
+ // ─── CLI ────────────────────────────────────────────────────────────────────
113
+ const STORE = ".judges-sbom";
114
+ export function runSbomExport(argv) {
115
+ if (argv.includes("--help") || argv.includes("-h")) {
116
+ console.log(`
117
+ judges sbom-export — Generate Software Bill of Materials
118
+
119
+ Usage:
120
+ judges sbom-export
121
+ judges sbom-export --save
122
+ judges sbom-export --summary
123
+
124
+ Options:
125
+ --save Save SBOM to ${STORE}/sbom.json
126
+ --summary Show component summary only
127
+ --format json JSON output (default for SBOM)
128
+ --help, -h Show this help
129
+
130
+ Supports: package.json, requirements.txt, go.mod
131
+ `);
132
+ return;
133
+ }
134
+ const sbom = buildSbom();
135
+ if (argv.includes("--save")) {
136
+ if (!existsSync(STORE))
137
+ mkdirSync(STORE, { recursive: true });
138
+ writeFileSync(join(STORE, "sbom.json"), JSON.stringify(sbom, null, 2));
139
+ console.log(` SBOM saved to ${STORE}/sbom.json (${sbom.components.length} components)`);
140
+ return;
141
+ }
142
+ if (argv.includes("--summary")) {
143
+ const required = sbom.components.filter((c) => c.scope === "required").length;
144
+ const optional = sbom.components.filter((c) => c.scope === "optional").length;
145
+ const types = new Map();
146
+ for (const c of sbom.components) {
147
+ const ecosystem = c.purl.split(":")[1]?.split("/")[0] || "unknown";
148
+ types.set(ecosystem, (types.get(ecosystem) || 0) + 1);
149
+ }
150
+ console.log(`\n SBOM Summary — ${sbom.metadata.component.name}@${sbom.metadata.component.version}`);
151
+ console.log(` ──────────────────────────`);
152
+ console.log(` Total components: ${sbom.components.length}`);
153
+ console.log(` Required: ${required} Optional: ${optional}`);
154
+ for (const [eco, count] of types)
155
+ console.log(` ${eco}: ${count}`);
156
+ console.log(`\n Run --save to export full CycloneDX SBOM\n`);
157
+ return;
158
+ }
159
+ // Default: print full SBOM
160
+ console.log(JSON.stringify(sbom, null, 2));
161
+ }
162
+ //# sourceMappingURL=sbom-export.js.map
@@ -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
+ * Secret scan — entropy-based and regex-based secret detection
3
+ * in source files. Optimized for CI gates and pre-commit hooks.
4
+ *
5
+ * All analysis local — no external services.
6
+ */
7
+ export declare function runSecretScan(argv: string[]): void;
8
+ //# sourceMappingURL=secret-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-scan.d.ts","sourceRoot":"","sources":["../../src/commands/secret-scan.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsMH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmFlD"}