@kevinrabun/judges 3.78.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.
- package/CHANGELOG.md +13 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +63 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/finding-diff-highlight.d.ts +5 -0
- package/dist/commands/finding-diff-highlight.d.ts.map +1 -0
- package/dist/commands/finding-diff-highlight.js +108 -0
- package/dist/commands/finding-diff-highlight.js.map +1 -0
- package/dist/commands/finding-fix-verify.d.ts +5 -0
- package/dist/commands/finding-fix-verify.d.ts.map +1 -0
- package/dist/commands/finding-fix-verify.js +199 -0
- package/dist/commands/finding-fix-verify.js.map +1 -0
- package/dist/commands/finding-group-by.d.ts +5 -0
- package/dist/commands/finding-group-by.d.ts.map +1 -0
- package/dist/commands/finding-group-by.js +87 -0
- package/dist/commands/finding-group-by.js.map +1 -0
- package/dist/commands/finding-prioritize.d.ts +5 -0
- package/dist/commands/finding-prioritize.d.ts.map +1 -0
- package/dist/commands/finding-prioritize.js +120 -0
- package/dist/commands/finding-prioritize.js.map +1 -0
- package/dist/commands/finding-trace.d.ts +5 -0
- package/dist/commands/finding-trace.d.ts.map +1 -0
- package/dist/commands/finding-trace.js +119 -0
- package/dist/commands/finding-trace.js.map +1 -0
- package/dist/commands/review-annotation.d.ts +5 -0
- package/dist/commands/review-annotation.d.ts.map +1 -0
- package/dist/commands/review-annotation.js +134 -0
- package/dist/commands/review-annotation.js.map +1 -0
- package/dist/commands/review-custom-judge.d.ts +5 -0
- package/dist/commands/review-custom-judge.d.ts.map +1 -0
- package/dist/commands/review-custom-judge.js +183 -0
- package/dist/commands/review-custom-judge.js.map +1 -0
- package/dist/commands/review-multi-repo.d.ts +5 -0
- package/dist/commands/review-multi-repo.d.ts.map +1 -0
- package/dist/commands/review-multi-repo.js +146 -0
- package/dist/commands/review-multi-repo.js.map +1 -0
- package/dist/commands/review-preset-save.d.ts +5 -0
- package/dist/commands/review-preset-save.d.ts.map +1 -0
- package/dist/commands/review-preset-save.js +160 -0
- package/dist/commands/review-preset-save.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding-diff-highlight — Highlight diff regions related to findings.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, existsSync } from "fs";
|
|
5
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
6
|
+
export function runFindingDiffHighlight(argv) {
|
|
7
|
+
if (argv.includes("--help") || argv.includes("-h") || argv.length === 0) {
|
|
8
|
+
console.log(`
|
|
9
|
+
judges finding-diff-highlight — Highlight findings in diff context
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
judges finding-diff-highlight --file <results.json> [options]
|
|
13
|
+
|
|
14
|
+
Options:
|
|
15
|
+
--file <path> Result file (required)
|
|
16
|
+
--diff <path> Diff file to annotate (optional — uses inline if omitted)
|
|
17
|
+
--context <n> Lines of context around findings (default: 3)
|
|
18
|
+
--format json JSON output
|
|
19
|
+
--help, -h Show this help
|
|
20
|
+
|
|
21
|
+
Shows findings alongside the code sections they reference.
|
|
22
|
+
`);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const file = argv.find((_a, i) => argv[i - 1] === "--file");
|
|
26
|
+
if (!file) {
|
|
27
|
+
console.error("Error: --file required");
|
|
28
|
+
process.exitCode = 1;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (!existsSync(file)) {
|
|
32
|
+
console.error(`Error: file not found: ${file}`);
|
|
33
|
+
process.exitCode = 1;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const diffPath = argv.find((_a, i) => argv[i - 1] === "--diff");
|
|
37
|
+
const contextStr = argv.find((_a, i) => argv[i - 1] === "--context");
|
|
38
|
+
const contextLines = contextStr ? parseInt(contextStr, 10) : 3;
|
|
39
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
40
|
+
let verdict;
|
|
41
|
+
try {
|
|
42
|
+
verdict = JSON.parse(readFileSync(file, "utf-8"));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
console.error("Error: could not parse file");
|
|
46
|
+
process.exitCode = 1;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const findings = verdict.findings || [];
|
|
50
|
+
const withLines = findings.filter((f) => f.lineNumbers !== undefined && f.lineNumbers !== null && f.lineNumbers.length > 0);
|
|
51
|
+
// Load diff if provided
|
|
52
|
+
let diffLines = [];
|
|
53
|
+
if (diffPath && existsSync(diffPath)) {
|
|
54
|
+
diffLines = readFileSync(diffPath, "utf-8").split("\n");
|
|
55
|
+
}
|
|
56
|
+
const highlights = [];
|
|
57
|
+
for (const f of withLines) {
|
|
58
|
+
const fLines = f.lineNumbers || [];
|
|
59
|
+
const ctx = [];
|
|
60
|
+
if (diffLines.length > 0) {
|
|
61
|
+
for (const ln of fLines) {
|
|
62
|
+
const start = Math.max(0, ln - contextLines - 1);
|
|
63
|
+
const end = Math.min(diffLines.length, ln + contextLines);
|
|
64
|
+
for (let i = start; i < end; i++) {
|
|
65
|
+
if (!ctx.some((c) => c.lineNum === i + 1)) {
|
|
66
|
+
ctx.push({ lineNum: i + 1, content: diffLines[i] || "", isFinding: fLines.includes(i + 1) });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
ctx.sort((a, b) => a.lineNum - b.lineNum);
|
|
71
|
+
}
|
|
72
|
+
highlights.push({ finding: f, lines: fLines, context: ctx });
|
|
73
|
+
}
|
|
74
|
+
if (format === "json") {
|
|
75
|
+
console.log(JSON.stringify({
|
|
76
|
+
totalFindings: findings.length,
|
|
77
|
+
withLineNumbers: withLines.length,
|
|
78
|
+
highlights: highlights.map((h) => ({
|
|
79
|
+
ruleId: h.finding.ruleId,
|
|
80
|
+
title: h.finding.title,
|
|
81
|
+
severity: h.finding.severity,
|
|
82
|
+
lines: h.lines,
|
|
83
|
+
context: h.context,
|
|
84
|
+
})),
|
|
85
|
+
}, null, 2));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
console.log(`\nDiff Highlights:`);
|
|
89
|
+
console.log("═".repeat(70));
|
|
90
|
+
console.log(` ${withLines.length} findings with line references (${findings.length} total)`);
|
|
91
|
+
console.log("─".repeat(70));
|
|
92
|
+
for (const h of highlights.slice(0, 15)) {
|
|
93
|
+
console.log(`\n ⚠ ${h.finding.ruleId || "unknown"} [${(h.finding.severity || "medium").toUpperCase()}]`);
|
|
94
|
+
console.log(` ${h.finding.title || "Untitled finding"}`);
|
|
95
|
+
console.log(` Lines: ${h.lines.join(", ")}`);
|
|
96
|
+
if (h.context.length > 0) {
|
|
97
|
+
console.log("");
|
|
98
|
+
for (const c of h.context) {
|
|
99
|
+
const marker = c.isFinding ? ">>>" : " ";
|
|
100
|
+
console.log(` ${marker} ${String(c.lineNum).padStart(4)} │ ${c.content}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (highlights.length > 15)
|
|
105
|
+
console.log(`\n ... and ${highlights.length - 15} more findings`);
|
|
106
|
+
console.log("\n" + "═".repeat(70));
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=finding-diff-highlight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-diff-highlight.js","sourceRoot":"","sources":["../../src/commands/finding-diff-highlight.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-fix-verify.d.ts","sourceRoot":"","sources":["../../src/commands/finding-fix-verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsMxD"}
|
|
@@ -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 @@
|
|
|
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":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAE9C,+EAA+E;AAE/E,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;CAYf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;IAC5E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC;IACtF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,OAAO,CAAC;IACvF,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;IAE1F,IAAI,OAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE5C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,GAAW,CAAC;QAChB,IAAI,EAAE,KAAK,QAAQ;YAAE,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC;aAC5C,IAAI,EAAE,KAAK,YAAY;YAC1B,GAAG,GAAG,CAAC,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;aACxF,IAAI,EAAE,KAAK,UAAU;YAAE,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;;YAC3E,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC;QAEnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACrC,IAAI,IAAI,KAAK,MAAM;QAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;QAChE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAEtD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ,EAAE,aAAa,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAC1F,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,MAAM,gBAAgB,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAC/E,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -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 @@
|
|
|
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"}
|