@kevinrabun/judges 3.77.0 → 3.79.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 (74) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +119 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-auto-label.d.ts +5 -0
  6. package/dist/commands/finding-auto-label.d.ts.map +1 -0
  7. package/dist/commands/finding-auto-label.js +221 -0
  8. package/dist/commands/finding-auto-label.js.map +1 -0
  9. package/dist/commands/finding-dedup-cross-file.d.ts +5 -0
  10. package/dist/commands/finding-dedup-cross-file.d.ts.map +1 -0
  11. package/dist/commands/finding-dedup-cross-file.js +96 -0
  12. package/dist/commands/finding-dedup-cross-file.js.map +1 -0
  13. package/dist/commands/finding-dependency-check.d.ts +5 -0
  14. package/dist/commands/finding-dependency-check.d.ts.map +1 -0
  15. package/dist/commands/finding-dependency-check.js +120 -0
  16. package/dist/commands/finding-dependency-check.js.map +1 -0
  17. package/dist/commands/finding-diff-highlight.d.ts +5 -0
  18. package/dist/commands/finding-diff-highlight.d.ts.map +1 -0
  19. package/dist/commands/finding-diff-highlight.js +108 -0
  20. package/dist/commands/finding-diff-highlight.js.map +1 -0
  21. package/dist/commands/finding-fix-verify.d.ts +5 -0
  22. package/dist/commands/finding-fix-verify.d.ts.map +1 -0
  23. package/dist/commands/finding-fix-verify.js +199 -0
  24. package/dist/commands/finding-fix-verify.js.map +1 -0
  25. package/dist/commands/finding-group-by.d.ts +5 -0
  26. package/dist/commands/finding-group-by.d.ts.map +1 -0
  27. package/dist/commands/finding-group-by.js +87 -0
  28. package/dist/commands/finding-group-by.js.map +1 -0
  29. package/dist/commands/finding-prioritize.d.ts +5 -0
  30. package/dist/commands/finding-prioritize.d.ts.map +1 -0
  31. package/dist/commands/finding-prioritize.js +120 -0
  32. package/dist/commands/finding-prioritize.js.map +1 -0
  33. package/dist/commands/finding-severity-histogram.d.ts +5 -0
  34. package/dist/commands/finding-severity-histogram.d.ts.map +1 -0
  35. package/dist/commands/finding-severity-histogram.js +67 -0
  36. package/dist/commands/finding-severity-histogram.js.map +1 -0
  37. package/dist/commands/finding-trace.d.ts +5 -0
  38. package/dist/commands/finding-trace.d.ts.map +1 -0
  39. package/dist/commands/finding-trace.js +119 -0
  40. package/dist/commands/finding-trace.js.map +1 -0
  41. package/dist/commands/review-annotation.d.ts +5 -0
  42. package/dist/commands/review-annotation.d.ts.map +1 -0
  43. package/dist/commands/review-annotation.js +134 -0
  44. package/dist/commands/review-annotation.js.map +1 -0
  45. package/dist/commands/review-custom-judge.d.ts +5 -0
  46. package/dist/commands/review-custom-judge.d.ts.map +1 -0
  47. package/dist/commands/review-custom-judge.js +183 -0
  48. package/dist/commands/review-custom-judge.js.map +1 -0
  49. package/dist/commands/review-file-filter.d.ts +5 -0
  50. package/dist/commands/review-file-filter.d.ts.map +1 -0
  51. package/dist/commands/review-file-filter.js +122 -0
  52. package/dist/commands/review-file-filter.js.map +1 -0
  53. package/dist/commands/review-incremental.d.ts +5 -0
  54. package/dist/commands/review-incremental.d.ts.map +1 -0
  55. package/dist/commands/review-incremental.js +129 -0
  56. package/dist/commands/review-incremental.js.map +1 -0
  57. package/dist/commands/review-multi-repo.d.ts +5 -0
  58. package/dist/commands/review-multi-repo.d.ts.map +1 -0
  59. package/dist/commands/review-multi-repo.js +146 -0
  60. package/dist/commands/review-multi-repo.js.map +1 -0
  61. package/dist/commands/review-plugin-manage.d.ts +5 -0
  62. package/dist/commands/review-plugin-manage.d.ts.map +1 -0
  63. package/dist/commands/review-plugin-manage.js +138 -0
  64. package/dist/commands/review-plugin-manage.js.map +1 -0
  65. package/dist/commands/review-preset-save.d.ts +5 -0
  66. package/dist/commands/review-preset-save.d.ts.map +1 -0
  67. package/dist/commands/review-preset-save.js +160 -0
  68. package/dist/commands/review-preset-save.js.map +1 -0
  69. package/dist/commands/review-progress-bar.d.ts +5 -0
  70. package/dist/commands/review-progress-bar.d.ts.map +1 -0
  71. package/dist/commands/review-progress-bar.js +158 -0
  72. package/dist/commands/review-progress-bar.js.map +1 -0
  73. package/package.json +1 -1
  74. package/server.json +2 -2
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Finding-fix-verify — Verify that applied fixes actually resolve findings.
3
+ */
4
+ import { readFileSync, existsSync, writeFileSync, mkdirSync } from "fs";
5
+ import { dirname, join } from "path";
6
+ // ─── CLI ────────────────────────────────────────────────────────────────────
7
+ export function runFindingFixVerify(argv) {
8
+ const sub = argv[0];
9
+ if (!sub || sub === "--help" || sub === "-h") {
10
+ console.log(`
11
+ judges finding-fix-verify — Verify fixes resolve findings
12
+
13
+ Usage:
14
+ judges finding-fix-verify compare --before <f1> --after <f2> [--format json]
15
+ judges finding-fix-verify check --file <results.json> --rule <ruleId>
16
+ judges finding-fix-verify history [--format json]
17
+
18
+ Subcommands:
19
+ compare Compare before/after results to verify fixes
20
+ check Check if a specific rule's findings are resolved
21
+ history Show verification history
22
+
23
+ Options:
24
+ --before <path> Result file before fixes
25
+ --after <path> Result file after fixes
26
+ --file <path> Result file to check
27
+ --rule <ruleId> Specific rule to verify
28
+ --format json JSON output
29
+ --help, -h Show this help
30
+ `);
31
+ return;
32
+ }
33
+ const args = argv.slice(1);
34
+ if (sub === "compare") {
35
+ const before = args.find((_a, i) => args[i - 1] === "--before");
36
+ const after = args.find((_a, i) => args[i - 1] === "--after");
37
+ const format = args.find((_a, i) => args[i - 1] === "--format") || "text";
38
+ if (!before || !after) {
39
+ console.error("Error: --before and --after required");
40
+ process.exitCode = 1;
41
+ return;
42
+ }
43
+ if (!existsSync(before)) {
44
+ console.error(`Error: file not found: ${before}`);
45
+ process.exitCode = 1;
46
+ return;
47
+ }
48
+ if (!existsSync(after)) {
49
+ console.error(`Error: file not found: ${after}`);
50
+ process.exitCode = 1;
51
+ return;
52
+ }
53
+ let vBefore;
54
+ let vAfter;
55
+ try {
56
+ vBefore = JSON.parse(readFileSync(before, "utf-8"));
57
+ }
58
+ catch {
59
+ console.error("Error: could not parse before file");
60
+ process.exitCode = 1;
61
+ return;
62
+ }
63
+ try {
64
+ vAfter = JSON.parse(readFileSync(after, "utf-8"));
65
+ }
66
+ catch {
67
+ console.error("Error: could not parse after file");
68
+ process.exitCode = 1;
69
+ return;
70
+ }
71
+ const beforeRules = new Set((vBefore.findings || []).map((f) => f.ruleId));
72
+ const afterRules = new Set((vAfter.findings || []).map((f) => f.ruleId));
73
+ const records = [];
74
+ const now = new Date().toISOString();
75
+ for (const f of vBefore.findings || []) {
76
+ if (!afterRules.has(f.ruleId)) {
77
+ records.push({ ruleId: f.ruleId, title: f.title, status: "resolved", verifiedAt: now });
78
+ }
79
+ else {
80
+ records.push({ ruleId: f.ruleId, title: f.title, status: "unresolved", verifiedAt: now });
81
+ }
82
+ }
83
+ for (const f of vAfter.findings || []) {
84
+ if (!beforeRules.has(f.ruleId)) {
85
+ records.push({ ruleId: f.ruleId, title: f.title, status: "new", verifiedAt: now });
86
+ }
87
+ }
88
+ // Save history
89
+ const histFile = join(process.cwd(), ".judges", "fix-verify-history.json");
90
+ const hd = dirname(histFile);
91
+ if (!existsSync(hd))
92
+ mkdirSync(hd, { recursive: true });
93
+ const existing = existsSync(histFile)
94
+ ? (() => {
95
+ try {
96
+ return JSON.parse(readFileSync(histFile, "utf-8"));
97
+ }
98
+ catch {
99
+ return [];
100
+ }
101
+ })()
102
+ : [];
103
+ const history = [...existing, ...records];
104
+ writeFileSync(histFile, JSON.stringify(history.slice(-500), null, 2));
105
+ const resolved = records.filter((r) => r.status === "resolved");
106
+ const unresolved = records.filter((r) => r.status === "unresolved");
107
+ const newFindings = records.filter((r) => r.status === "new");
108
+ if (format === "json") {
109
+ console.log(JSON.stringify({ resolved: resolved.length, unresolved: unresolved.length, new: newFindings.length, records }, null, 2));
110
+ return;
111
+ }
112
+ console.log(`\nFix Verification:`);
113
+ console.log("═".repeat(65));
114
+ console.log(` ✓ Resolved: ${resolved.length}`);
115
+ console.log(` ✗ Unresolved: ${unresolved.length}`);
116
+ console.log(` ★ New: ${newFindings.length}`);
117
+ console.log("─".repeat(65));
118
+ if (resolved.length > 0) {
119
+ console.log("\n Resolved:");
120
+ for (const r of resolved.slice(0, 10))
121
+ console.log(` ✓ ${r.ruleId} — ${r.title}`);
122
+ }
123
+ if (unresolved.length > 0) {
124
+ console.log("\n Still Open:");
125
+ for (const r of unresolved.slice(0, 10))
126
+ console.log(` ✗ ${r.ruleId} — ${r.title}`);
127
+ }
128
+ if (newFindings.length > 0) {
129
+ console.log("\n New (regressions?):");
130
+ for (const r of newFindings.slice(0, 10))
131
+ console.log(` ★ ${r.ruleId} — ${r.title}`);
132
+ }
133
+ console.log("═".repeat(65));
134
+ }
135
+ else if (sub === "check") {
136
+ const file = args.find((_a, i) => args[i - 1] === "--file");
137
+ const rule = args.find((_a, i) => args[i - 1] === "--rule");
138
+ if (!file || !rule) {
139
+ console.error("Error: --file and --rule required");
140
+ process.exitCode = 1;
141
+ return;
142
+ }
143
+ if (!existsSync(file)) {
144
+ console.error(`Error: file not found: ${file}`);
145
+ process.exitCode = 1;
146
+ return;
147
+ }
148
+ let verdict;
149
+ try {
150
+ verdict = JSON.parse(readFileSync(file, "utf-8"));
151
+ }
152
+ catch {
153
+ console.error("Error: could not parse file");
154
+ process.exitCode = 1;
155
+ return;
156
+ }
157
+ const matches = (verdict.findings || []).filter((f) => f.ruleId === rule);
158
+ if (matches.length === 0) {
159
+ console.log(`✓ Rule "${rule}" has no findings — fix verified!`);
160
+ }
161
+ else {
162
+ console.log(`✗ Rule "${rule}" still has ${matches.length} finding(s):`);
163
+ for (const m of matches.slice(0, 5))
164
+ console.log(` - ${m.title} [${m.severity}]`);
165
+ }
166
+ }
167
+ else if (sub === "history") {
168
+ const format = args.find((_a, i) => args[i - 1] === "--format") || "text";
169
+ const histFile = join(process.cwd(), ".judges", "fix-verify-history.json");
170
+ if (!existsSync(histFile)) {
171
+ console.log("No verification history found.");
172
+ return;
173
+ }
174
+ let history;
175
+ try {
176
+ history = JSON.parse(readFileSync(histFile, "utf-8"));
177
+ }
178
+ catch {
179
+ console.log("Could not parse history.");
180
+ return;
181
+ }
182
+ if (format === "json") {
183
+ console.log(JSON.stringify(history, null, 2));
184
+ return;
185
+ }
186
+ console.log(`\nVerification History: ${history.length} records`);
187
+ console.log("═".repeat(55));
188
+ for (const h of history.slice(-15)) {
189
+ const icon = h.status === "resolved" ? "✓" : h.status === "new" ? "★" : "✗";
190
+ console.log(` ${icon} ${h.ruleId.padEnd(22)} ${h.status.padEnd(12)} ${h.verifiedAt.slice(0, 10)}`);
191
+ }
192
+ console.log("═".repeat(55));
193
+ }
194
+ else {
195
+ console.error(`Unknown subcommand: ${sub}. Use --help for usage.`);
196
+ process.exitCode = 1;
197
+ }
198
+ }
199
+ //# sourceMappingURL=finding-fix-verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-fix-verify.js","sourceRoot":"","sources":["../../src/commands/finding-fix-verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-group-by — Group findings by a specified field for better organization.
3
+ */
4
+ export declare function runFindingGroupBy(argv: string[]): void;
5
+ //# sourceMappingURL=finding-group-by.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-group-by.d.ts","sourceRoot":"","sources":["../../src/commands/finding-group-by.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAwFtD"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Finding-group-by — Group findings by a specified field for better organization.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runFindingGroupBy(argv) {
7
+ if (argv.includes("--help") || argv.includes("-h") || argv.length === 0) {
8
+ console.log(`
9
+ judges finding-group-by — Group findings by a field
10
+
11
+ Usage:
12
+ judges finding-group-by --file <results.json> [options]
13
+
14
+ Options:
15
+ --file <path> Result file to analyze (required)
16
+ --by <field> Group by: severity, ruleId, confidence, category (default: severity)
17
+ --sort count|name Sort groups by count or name (default: count)
18
+ --format json JSON output
19
+ --help, -h Show this help
20
+ `);
21
+ return;
22
+ }
23
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
24
+ if (!file) {
25
+ console.error("Error: --file required");
26
+ process.exitCode = 1;
27
+ return;
28
+ }
29
+ if (!existsSync(file)) {
30
+ console.error(`Error: file not found: ${file}`);
31
+ process.exitCode = 1;
32
+ return;
33
+ }
34
+ const by = argv.find((_a, i) => argv[i - 1] === "--by") || "severity";
35
+ const sort = argv.find((_a, i) => argv[i - 1] === "--sort") || "count";
36
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
37
+ let verdict;
38
+ try {
39
+ verdict = JSON.parse(readFileSync(file, "utf-8"));
40
+ }
41
+ catch {
42
+ console.error("Error: could not parse file");
43
+ process.exitCode = 1;
44
+ return;
45
+ }
46
+ const findings = verdict.findings || [];
47
+ const groups = new Map();
48
+ for (const f of findings) {
49
+ let key;
50
+ if (by === "ruleId")
51
+ key = f.ruleId || "unknown";
52
+ else if (by === "confidence")
53
+ key = f.confidence !== undefined && f.confidence !== null ? String(f.confidence) : "unset";
54
+ else if (by === "category")
55
+ key = f.ruleId ? f.ruleId.split("-")[0] : "unknown";
56
+ else
57
+ key = f.severity || "unknown";
58
+ if (!groups.has(key))
59
+ groups.set(key, []);
60
+ groups.get(key).push(f);
61
+ }
62
+ const sorted = [...groups.entries()];
63
+ if (sort === "name")
64
+ sorted.sort((a, b) => a[0].localeCompare(b[0]));
65
+ else
66
+ sorted.sort((a, b) => b[1].length - a[1].length);
67
+ if (format === "json") {
68
+ const result = sorted.map(([key, items]) => ({ group: key, count: items.length, findings: items }));
69
+ console.log(JSON.stringify({ totalFindings: findings.length, groupCount: sorted.length, groupBy: by, groups: result }, null, 2));
70
+ return;
71
+ }
72
+ console.log(`\nFindings Grouped by ${by}:`);
73
+ console.log("═".repeat(65));
74
+ console.log(` Total: ${findings.length} findings in ${sorted.length} groups`);
75
+ console.log("─".repeat(65));
76
+ for (const [key, items] of sorted) {
77
+ const bar = "█".repeat(Math.min(items.length, 30));
78
+ console.log(` ${key.padEnd(20)} ${String(items.length).padStart(4)} ${bar}`);
79
+ for (const f of items.slice(0, 3)) {
80
+ console.log(` └─ ${f.title || f.ruleId || "untitled"}`);
81
+ }
82
+ if (items.length > 3)
83
+ console.log(` └─ ... and ${items.length - 3} more`);
84
+ }
85
+ console.log("═".repeat(65));
86
+ }
87
+ //# sourceMappingURL=finding-group-by.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-group-by.js","sourceRoot":"","sources":["../../src/commands/finding-group-by.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-prioritize — Prioritize findings by estimated business impact.
3
+ */
4
+ export declare function runFindingPrioritize(argv: string[]): void;
5
+ //# sourceMappingURL=finding-prioritize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-prioritize.d.ts","sourceRoot":"","sources":["../../src/commands/finding-prioritize.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyDH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+EzD"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Finding-prioritize — Prioritize findings by estimated business impact.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── Scoring ────────────────────────────────────────────────────────────────
6
+ const SEVERITY_WEIGHTS = {
7
+ critical: 10,
8
+ high: 7,
9
+ medium: 4,
10
+ low: 2,
11
+ info: 1,
12
+ };
13
+ const IMPACT_KEYWORDS = {
14
+ "data loss": 10,
15
+ injection: 9,
16
+ authentication: 9,
17
+ authorization: 8,
18
+ credential: 9,
19
+ "remote code": 10,
20
+ "denial of service": 7,
21
+ "memory leak": 6,
22
+ "race condition": 7,
23
+ "privilege escalation": 9,
24
+ "information disclosure": 6,
25
+ "cross-site": 8,
26
+ deserialization: 8,
27
+ "path traversal": 7,
28
+ "buffer overflow": 9,
29
+ ssrf: 8,
30
+ performance: 3,
31
+ style: 1,
32
+ naming: 1,
33
+ formatting: 1,
34
+ };
35
+ function computePriority(finding) {
36
+ let score = SEVERITY_WEIGHTS[finding.severity] || 4;
37
+ // Boost by keyword matches
38
+ const text = `${finding.title || ""} ${finding.description || ""}`.toLowerCase();
39
+ for (const [kw, weight] of Object.entries(IMPACT_KEYWORDS)) {
40
+ if (text.includes(kw))
41
+ score += weight;
42
+ }
43
+ // Confidence boost
44
+ if (finding.confidence !== undefined && finding.confidence !== null) {
45
+ score += finding.confidence * 2;
46
+ }
47
+ return Math.round(score * 10) / 10;
48
+ }
49
+ // ─── CLI ────────────────────────────────────────────────────────────────────
50
+ export function runFindingPrioritize(argv) {
51
+ if (argv.includes("--help") || argv.includes("-h") || argv.length === 0) {
52
+ console.log(`
53
+ judges finding-prioritize — Prioritize findings by business impact
54
+
55
+ Usage:
56
+ judges finding-prioritize --file <results.json> [options]
57
+
58
+ Options:
59
+ --file <path> Result file (required)
60
+ --top <n> Show only top N findings (default: all)
61
+ --min-score <n> Minimum priority score to include (default: 0)
62
+ --format json JSON output
63
+ --help, -h Show this help
64
+
65
+ Computes priority scores based on severity, keywords, and confidence.
66
+ `);
67
+ return;
68
+ }
69
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
70
+ if (!file) {
71
+ console.error("Error: --file required");
72
+ process.exitCode = 1;
73
+ return;
74
+ }
75
+ if (!existsSync(file)) {
76
+ console.error(`Error: file not found: ${file}`);
77
+ process.exitCode = 1;
78
+ return;
79
+ }
80
+ const topStr = argv.find((_a, i) => argv[i - 1] === "--top");
81
+ const minStr = argv.find((_a, i) => argv[i - 1] === "--min-score");
82
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
83
+ let verdict;
84
+ try {
85
+ verdict = JSON.parse(readFileSync(file, "utf-8"));
86
+ }
87
+ catch {
88
+ console.error("Error: could not parse file");
89
+ process.exitCode = 1;
90
+ return;
91
+ }
92
+ const findings = verdict.findings || [];
93
+ let scored = findings.map((f) => ({ ...f, priorityScore: computePriority(f) }));
94
+ scored.sort((a, b) => b.priorityScore - a.priorityScore);
95
+ if (minStr) {
96
+ const min = parseFloat(minStr);
97
+ scored = scored.filter((s) => s.priorityScore >= min);
98
+ }
99
+ const top = topStr ? parseInt(topStr, 10) : scored.length;
100
+ const display = scored.slice(0, top);
101
+ if (format === "json") {
102
+ console.log(JSON.stringify({ totalFindings: findings.length, prioritized: display.length, findings: display }, null, 2));
103
+ return;
104
+ }
105
+ console.log(`\nPrioritized Findings:`);
106
+ console.log("═".repeat(70));
107
+ console.log(` ${display.length} findings ranked by priority score`);
108
+ console.log("─".repeat(70));
109
+ for (let i = 0; i < display.length && i < 25; i++) {
110
+ const f = display[i];
111
+ const rank = String(i + 1).padStart(3);
112
+ const score = String(f.priorityScore).padStart(5);
113
+ console.log(` ${rank}. [${score}] ${(f.severity || "medium").toUpperCase().padEnd(9)} ${f.ruleId || "unknown"}`);
114
+ console.log(` ${f.title || "Untitled"}`);
115
+ }
116
+ if (display.length > 25)
117
+ console.log(`\n ... and ${display.length - 25} more`);
118
+ console.log("═".repeat(70));
119
+ }
120
+ //# sourceMappingURL=finding-prioritize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-prioritize.js","sourceRoot":"","sources":["../../src/commands/finding-prioritize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-severity-histogram — Visualize finding severity distribution.
3
+ */
4
+ export declare function runFindingSeverityHistogram(argv: string[]): void;
5
+ //# sourceMappingURL=finding-severity-histogram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-severity-histogram.d.ts","sourceRoot":"","sources":["../../src/commands/finding-severity-histogram.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoEhE"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Finding-severity-histogram — Visualize finding severity distribution.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runFindingSeverityHistogram(argv) {
7
+ if (argv.includes("--help") || argv.includes("-h")) {
8
+ console.log(`
9
+ judges finding-severity-histogram — Visualize severity distribution
10
+
11
+ Usage:
12
+ judges finding-severity-histogram --file <results> [options]
13
+
14
+ Options:
15
+ --file <path> Results file with findings (required)
16
+ --width <n> Bar width in characters (default: 40)
17
+ --format json JSON output
18
+ --help, -h Show this help
19
+ `);
20
+ return;
21
+ }
22
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
23
+ if (!file) {
24
+ console.error("Error: --file required");
25
+ process.exitCode = 1;
26
+ return;
27
+ }
28
+ if (!existsSync(file)) {
29
+ console.error(`Error: file not found: ${file}`);
30
+ process.exitCode = 1;
31
+ return;
32
+ }
33
+ const barWidth = parseInt(argv.find((_a, i) => argv[i - 1] === "--width") || "40", 10);
34
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
35
+ let findings;
36
+ try {
37
+ const data = JSON.parse(readFileSync(file, "utf-8"));
38
+ findings = Array.isArray(data) ? data : data.findings || [];
39
+ }
40
+ catch {
41
+ console.error("Error: could not parse results file");
42
+ process.exitCode = 1;
43
+ return;
44
+ }
45
+ const counts = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
46
+ for (const f of findings) {
47
+ const sev = (f.severity || "medium").toLowerCase();
48
+ counts[sev] = (counts[sev] || 0) + 1;
49
+ }
50
+ const maxCount = Math.max(...Object.values(counts), 1);
51
+ if (format === "json") {
52
+ console.log(JSON.stringify({ total: findings.length, distribution: counts }, null, 2));
53
+ return;
54
+ }
55
+ console.log(`\nSeverity Histogram (${findings.length} findings):`);
56
+ console.log("═".repeat(barWidth + 25));
57
+ const order = ["critical", "high", "medium", "low", "info"];
58
+ for (const sev of order) {
59
+ const count = counts[sev] || 0;
60
+ const barLen = Math.round((count / maxCount) * barWidth);
61
+ const bar = "#".repeat(barLen);
62
+ const pct = findings.length > 0 ? ((count / findings.length) * 100).toFixed(1) : "0.0";
63
+ console.log(` ${sev.padEnd(10)} ${bar.padEnd(barWidth)} ${String(count).padStart(5)} (${pct}%)`);
64
+ }
65
+ console.log("═".repeat(barWidth + 25));
66
+ }
67
+ //# sourceMappingURL=finding-severity-histogram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-severity-histogram.js","sourceRoot":"","sources":["../../src/commands/finding-severity-histogram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-trace — Trace findings to their origin commit.
3
+ */
4
+ export declare function runFindingTrace(argv: string[]): void;
5
+ //# sourceMappingURL=finding-trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-trace.d.ts","sourceRoot":"","sources":["../../src/commands/finding-trace.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8HpD"}