@kevinrabun/judges 3.76.0 → 3.78.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 +24 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +112 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/finding-auto-label.d.ts +5 -0
- package/dist/commands/finding-auto-label.d.ts.map +1 -0
- package/dist/commands/finding-auto-label.js +221 -0
- package/dist/commands/finding-auto-label.js.map +1 -0
- package/dist/commands/finding-correlate.d.ts +5 -0
- package/dist/commands/finding-correlate.d.ts.map +1 -0
- package/dist/commands/finding-correlate.js +89 -0
- package/dist/commands/finding-correlate.js.map +1 -0
- package/dist/commands/finding-dedup-cross-file.d.ts +5 -0
- package/dist/commands/finding-dedup-cross-file.d.ts.map +1 -0
- package/dist/commands/finding-dedup-cross-file.js +96 -0
- package/dist/commands/finding-dedup-cross-file.js.map +1 -0
- package/dist/commands/finding-dependency-check.d.ts +5 -0
- package/dist/commands/finding-dependency-check.d.ts.map +1 -0
- package/dist/commands/finding-dependency-check.js +120 -0
- package/dist/commands/finding-dependency-check.js.map +1 -0
- package/dist/commands/finding-impact-score.d.ts +5 -0
- package/dist/commands/finding-impact-score.d.ts.map +1 -0
- package/dist/commands/finding-impact-score.js +124 -0
- package/dist/commands/finding-impact-score.js.map +1 -0
- package/dist/commands/finding-root-cause.d.ts +5 -0
- package/dist/commands/finding-root-cause.d.ts.map +1 -0
- package/dist/commands/finding-root-cause.js +185 -0
- package/dist/commands/finding-root-cause.js.map +1 -0
- package/dist/commands/finding-severity-histogram.d.ts +5 -0
- package/dist/commands/finding-severity-histogram.d.ts.map +1 -0
- package/dist/commands/finding-severity-histogram.js +67 -0
- package/dist/commands/finding-severity-histogram.js.map +1 -0
- package/dist/commands/finding-suppress-pattern.d.ts +5 -0
- package/dist/commands/finding-suppress-pattern.d.ts.map +1 -0
- package/dist/commands/finding-suppress-pattern.js +149 -0
- package/dist/commands/finding-suppress-pattern.js.map +1 -0
- package/dist/commands/review-auto-merge.d.ts +5 -0
- package/dist/commands/review-auto-merge.d.ts.map +1 -0
- package/dist/commands/review-auto-merge.js +176 -0
- package/dist/commands/review-auto-merge.js.map +1 -0
- package/dist/commands/review-cache-clear.d.ts +5 -0
- package/dist/commands/review-cache-clear.d.ts.map +1 -0
- package/dist/commands/review-cache-clear.js +161 -0
- package/dist/commands/review-cache-clear.js.map +1 -0
- package/dist/commands/review-compliance-check.d.ts +5 -0
- package/dist/commands/review-compliance-check.d.ts.map +1 -0
- package/dist/commands/review-compliance-check.js +203 -0
- package/dist/commands/review-compliance-check.js.map +1 -0
- package/dist/commands/review-dry-run.d.ts +5 -0
- package/dist/commands/review-dry-run.d.ts.map +1 -0
- package/dist/commands/review-dry-run.js +121 -0
- package/dist/commands/review-dry-run.js.map +1 -0
- package/dist/commands/review-file-filter.d.ts +5 -0
- package/dist/commands/review-file-filter.d.ts.map +1 -0
- package/dist/commands/review-file-filter.js +122 -0
- package/dist/commands/review-file-filter.js.map +1 -0
- package/dist/commands/review-incremental.d.ts +5 -0
- package/dist/commands/review-incremental.d.ts.map +1 -0
- package/dist/commands/review-incremental.js +129 -0
- package/dist/commands/review-incremental.js.map +1 -0
- package/dist/commands/review-plugin-manage.d.ts +5 -0
- package/dist/commands/review-plugin-manage.d.ts.map +1 -0
- package/dist/commands/review-plugin-manage.js +138 -0
- package/dist/commands/review-plugin-manage.js.map +1 -0
- package/dist/commands/review-progress-bar.d.ts +5 -0
- package/dist/commands/review-progress-bar.d.ts.map +1 -0
- package/dist/commands/review-progress-bar.js +158 -0
- package/dist/commands/review-progress-bar.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding-auto-label — Automatically label findings based on content analysis.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, existsSync, writeFileSync, mkdirSync } from "fs";
|
|
5
|
+
import { dirname, join } from "path";
|
|
6
|
+
const BUILTIN_RULES = [
|
|
7
|
+
{
|
|
8
|
+
label: "security",
|
|
9
|
+
keywords: ["injection", "xss", "csrf", "auth", "vuln", "password", "secret", "token", "credential", "ssrf"],
|
|
10
|
+
rulePatterns: ["SEC-", "VULN-", "AUTH-", "CRYPTO-"],
|
|
11
|
+
severities: [],
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
label: "performance",
|
|
15
|
+
keywords: ["performance", "n+1", "slow", "bottleneck", "memory leak", "cache", "latency", "optimization"],
|
|
16
|
+
rulePatterns: ["PERF-"],
|
|
17
|
+
severities: [],
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
label: "quality",
|
|
21
|
+
keywords: ["code smell", "duplication", "complexity", "maintainability", "readability", "dead code"],
|
|
22
|
+
rulePatterns: ["QUAL-", "SMELL-"],
|
|
23
|
+
severities: [],
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
label: "bug",
|
|
27
|
+
keywords: ["null pointer", "undefined", "type error", "race condition", "deadlock", "off-by-one", "boundary"],
|
|
28
|
+
rulePatterns: ["BUG-", "ERR-"],
|
|
29
|
+
severities: ["critical", "high"],
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
label: "style",
|
|
33
|
+
keywords: ["naming", "formatting", "convention", "whitespace", "indentation", "lint"],
|
|
34
|
+
rulePatterns: ["STYLE-", "FMT-"],
|
|
35
|
+
severities: [],
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
label: "documentation",
|
|
39
|
+
keywords: ["missing doc", "jsdoc", "comment", "readme", "documentation"],
|
|
40
|
+
rulePatterns: ["DOC-"],
|
|
41
|
+
severities: [],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
label: "dependency",
|
|
45
|
+
keywords: ["dependency", "outdated", "vulnerable package", "npm", "import", "require"],
|
|
46
|
+
rulePatterns: ["DEP-"],
|
|
47
|
+
severities: [],
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
51
|
+
function customRulesFile() {
|
|
52
|
+
return join(process.cwd(), ".judges", "auto-label-rules.json");
|
|
53
|
+
}
|
|
54
|
+
function loadCustomRules() {
|
|
55
|
+
const f = customRulesFile();
|
|
56
|
+
if (!existsSync(f))
|
|
57
|
+
return [];
|
|
58
|
+
try {
|
|
59
|
+
return JSON.parse(readFileSync(f, "utf-8"));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function saveCustomRules(rules) {
|
|
66
|
+
const f = customRulesFile();
|
|
67
|
+
const d = dirname(f);
|
|
68
|
+
if (!existsSync(d))
|
|
69
|
+
mkdirSync(d, { recursive: true });
|
|
70
|
+
writeFileSync(f, JSON.stringify(rules, null, 2));
|
|
71
|
+
}
|
|
72
|
+
function applyLabels(finding, rules) {
|
|
73
|
+
const labels = [];
|
|
74
|
+
const text = `${finding.ruleId || ""} ${finding.title || ""} ${finding.description || ""}`.toLowerCase();
|
|
75
|
+
for (const rule of rules) {
|
|
76
|
+
let matched = false;
|
|
77
|
+
// Keyword match
|
|
78
|
+
if (rule.keywords.some((kw) => text.includes(kw.toLowerCase())))
|
|
79
|
+
matched = true;
|
|
80
|
+
// RuleId pattern match
|
|
81
|
+
if (!matched && finding.ruleId && rule.rulePatterns.some((p) => finding.ruleId.startsWith(p)))
|
|
82
|
+
matched = true;
|
|
83
|
+
// Severity match
|
|
84
|
+
if (!matched && rule.severities.length > 0 && finding.severity && rule.severities.includes(finding.severity))
|
|
85
|
+
matched = true;
|
|
86
|
+
if (matched)
|
|
87
|
+
labels.push(rule.label);
|
|
88
|
+
}
|
|
89
|
+
return [...new Set(labels)];
|
|
90
|
+
}
|
|
91
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
92
|
+
export function runFindingAutoLabel(argv) {
|
|
93
|
+
const sub = argv[0];
|
|
94
|
+
if (!sub || sub === "--help" || sub === "-h") {
|
|
95
|
+
console.log(`
|
|
96
|
+
judges finding-auto-label — Auto-label findings based on content
|
|
97
|
+
|
|
98
|
+
Usage:
|
|
99
|
+
judges finding-auto-label apply --file <results.json> [--format json]
|
|
100
|
+
judges finding-auto-label rules [list | add | remove]
|
|
101
|
+
judges finding-auto-label test --text <text>
|
|
102
|
+
|
|
103
|
+
Subcommands:
|
|
104
|
+
apply Apply labels to findings in a result file
|
|
105
|
+
rules list List all label rules (builtin + custom)
|
|
106
|
+
rules add Add a custom rule: --label <l> --keywords <k1,k2>
|
|
107
|
+
rules remove Remove custom rule: --label <l>
|
|
108
|
+
test Test which labels match a text string
|
|
109
|
+
|
|
110
|
+
Options:
|
|
111
|
+
--file <path> Result file (apply subcommand)
|
|
112
|
+
--label <name> Label name
|
|
113
|
+
--keywords <list> Comma-separated keywords for matching
|
|
114
|
+
--text <text> Text to test labeling on
|
|
115
|
+
--format json JSON output
|
|
116
|
+
--help, -h Show this help
|
|
117
|
+
`);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const args = argv.slice(1);
|
|
121
|
+
const allRules = [...BUILTIN_RULES, ...loadCustomRules()];
|
|
122
|
+
if (sub === "apply") {
|
|
123
|
+
const file = args.find((_a, i) => args[i - 1] === "--file");
|
|
124
|
+
const format = args.find((_a, i) => args[i - 1] === "--format") || "text";
|
|
125
|
+
if (!file) {
|
|
126
|
+
console.error("Error: --file required");
|
|
127
|
+
process.exitCode = 1;
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (!existsSync(file)) {
|
|
131
|
+
console.error(`Error: file not found: ${file}`);
|
|
132
|
+
process.exitCode = 1;
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
let verdict;
|
|
136
|
+
try {
|
|
137
|
+
verdict = JSON.parse(readFileSync(file, "utf-8"));
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
console.error("Error: could not parse file");
|
|
141
|
+
process.exitCode = 1;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const findings = verdict.findings || [];
|
|
145
|
+
const labeled = findings.map((f) => ({ ...f, autoLabels: applyLabels(f, allRules) }));
|
|
146
|
+
const withLabels = labeled.filter((f) => f.autoLabels.length > 0);
|
|
147
|
+
if (format === "json") {
|
|
148
|
+
console.log(JSON.stringify({ total: findings.length, labeled: withLabels.length, findings: labeled }, null, 2));
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
console.log(`\nAuto-Label Results:`);
|
|
152
|
+
console.log("═".repeat(70));
|
|
153
|
+
console.log(` Total findings: ${findings.length}`);
|
|
154
|
+
console.log(` Labeled: ${withLabels.length}`);
|
|
155
|
+
console.log("─".repeat(70));
|
|
156
|
+
for (const f of labeled.slice(0, 25)) {
|
|
157
|
+
const tags = f.autoLabels.length > 0 ? f.autoLabels.map((l) => `[${l}]`).join(" ") : "[unclassified]";
|
|
158
|
+
console.log(` ${(f.ruleId || "unknown").padEnd(25)} ${tags}`);
|
|
159
|
+
}
|
|
160
|
+
if (labeled.length > 25)
|
|
161
|
+
console.log(` ... and ${labeled.length - 25} more`);
|
|
162
|
+
console.log("═".repeat(70));
|
|
163
|
+
}
|
|
164
|
+
else if (sub === "rules") {
|
|
165
|
+
const action = args[0] || "list";
|
|
166
|
+
if (action === "list") {
|
|
167
|
+
console.log("\nLabel Rules:");
|
|
168
|
+
console.log("═".repeat(60));
|
|
169
|
+
for (const r of allRules) {
|
|
170
|
+
const src = BUILTIN_RULES.includes(r) ? "builtin" : "custom";
|
|
171
|
+
console.log(` ${r.label.padEnd(18)} [${src}] keywords: ${r.keywords.slice(0, 4).join(", ")}${r.keywords.length > 4 ? "..." : ""}`);
|
|
172
|
+
}
|
|
173
|
+
console.log("═".repeat(60));
|
|
174
|
+
}
|
|
175
|
+
else if (action === "add") {
|
|
176
|
+
const label = args.find((_a, i) => args[i - 1] === "--label");
|
|
177
|
+
const kwStr = args.find((_a, i) => args[i - 1] === "--keywords");
|
|
178
|
+
if (!label || !kwStr) {
|
|
179
|
+
console.error("Error: --label and --keywords required");
|
|
180
|
+
process.exitCode = 1;
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const customs = loadCustomRules();
|
|
184
|
+
customs.push({ label, keywords: kwStr.split(",").map((k) => k.trim()), rulePatterns: [], severities: [] });
|
|
185
|
+
saveCustomRules(customs);
|
|
186
|
+
console.log(`Added custom rule: ${label}`);
|
|
187
|
+
}
|
|
188
|
+
else if (action === "remove") {
|
|
189
|
+
const label = args.find((_a, i) => args[i - 1] === "--label");
|
|
190
|
+
if (!label) {
|
|
191
|
+
console.error("Error: --label required");
|
|
192
|
+
process.exitCode = 1;
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const customs = loadCustomRules().filter((r) => r.label !== label);
|
|
196
|
+
saveCustomRules(customs);
|
|
197
|
+
console.log(`Removed custom rule: ${label}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else if (sub === "test") {
|
|
201
|
+
const text = args.find((_a, i) => args[i - 1] === "--text");
|
|
202
|
+
if (!text) {
|
|
203
|
+
console.error("Error: --text required");
|
|
204
|
+
process.exitCode = 1;
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const fake = { ruleId: "", severity: "medium", title: text, description: text, recommendation: "" };
|
|
208
|
+
const labels = applyLabels(fake, allRules);
|
|
209
|
+
if (labels.length > 0) {
|
|
210
|
+
console.log(`Labels matched: ${labels.join(", ")}`);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
console.log("No labels matched.");
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
console.error(`Unknown subcommand: ${sub}. Use --help for usage.`);
|
|
218
|
+
process.exitCode = 1;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=finding-auto-label.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-auto-label.js","sourceRoot":"","sources":["../../src/commands/finding-auto-label.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAWrC,MAAM,aAAa,GAAgB;IACjC;QACE,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC;QAC3G,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC;QACnD,UAAU,EAAE,EAAE;KACf;IACD;QACE,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC;QACzG,YAAY,EAAE,CAAC,OAAO,CAAC;QACvB,UAAU,EAAE,EAAE;KACf;IACD;QACE,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,CAAC;QACpG,YAAY,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;QACjC,UAAU,EAAE,EAAE;KACf;IACD;QACE,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC;QAC7G,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;QAC9B,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC;KACjC;IACD;QACE,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC;QACrF,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;QAChC,UAAU,EAAE,EAAE;KACf;IACD;QACE,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,CAAC;QACxE,YAAY,EAAE,CAAC,MAAM,CAAC;QACtB,UAAU,EAAE,EAAE;KACf;IACD;QACE,KAAK,EAAE,YAAY;QACnB,QAAQ,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC;QACtF,YAAY,EAAE,CAAC,MAAM,CAAC;QACtB,UAAU,EAAE,EAAE;KACf;CACF,CAAC;AAEF,+EAA+E;AAE/E,SAAS,eAAe;IACtB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,uBAAuB,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC;IAC5B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAkB;IACzC,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC;IAC5B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,WAAW,CAAC,OAAgB,EAAE,KAAkB;IACvD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,IAAI,OAAO,CAAC,KAAK,IAAI,EAAE,IAAI,OAAO,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC;IAEzG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,gBAAgB;QAChB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YAAE,OAAO,GAAG,IAAI,CAAC;QAChF,uBAAuB;QACvB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,GAAG,IAAI,CAAC;QAC9G,iBAAiB;QACjB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC1G,OAAO,GAAG,IAAI,CAAC;QACjB,IAAI,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,mBAAmB,CAAC,IAAc;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpB,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;CAsBf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,QAAQ,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,eAAe,EAAE,CAAC,CAAC;IAE1D,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QAC5E,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;QAC1F,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,OAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC7C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACtF,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAElE,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAChH,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAE5B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;YACtG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;SAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;QACjC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC7D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,gBAAgB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CACxH,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;YAC9E,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC;YACjF,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;gBACrB,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBACxD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3G,eAAe,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;YAC9E,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBACzC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;YACnE,eAAe,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAY,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;QAC7G,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,yBAAyB,CAAC,CAAC;QACnE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-correlate.d.ts","sourceRoot":"","sources":["../../src/commands/finding-correlate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsFxD"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding-correlate — Correlate related findings across files.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, existsSync } from "fs";
|
|
5
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
6
|
+
export function runFindingCorrelate(argv) {
|
|
7
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
8
|
+
console.log(`
|
|
9
|
+
judges finding-correlate — Correlate related findings across files
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
judges finding-correlate --file <results> [options]
|
|
13
|
+
|
|
14
|
+
Options:
|
|
15
|
+
--file <path> Results file with findings (required)
|
|
16
|
+
--group-by <field> Group by: rule, severity, title (default: rule)
|
|
17
|
+
--min-count <n> Minimum group size to show (default: 2)
|
|
18
|
+
--format json JSON output
|
|
19
|
+
--help, -h Show this help
|
|
20
|
+
|
|
21
|
+
Groups related findings to identify patterns and systemic issues.
|
|
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 groupBy = argv.find((_a, i) => argv[i - 1] === "--group-by") || "rule";
|
|
37
|
+
const minCount = parseInt(argv.find((_a, i) => argv[i - 1] === "--min-count") || "2", 10);
|
|
38
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
39
|
+
let findings;
|
|
40
|
+
try {
|
|
41
|
+
const data = JSON.parse(readFileSync(file, "utf-8"));
|
|
42
|
+
findings = Array.isArray(data) ? data : data.findings || [];
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
console.error("Error: could not parse results file");
|
|
46
|
+
process.exitCode = 1;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Group findings
|
|
50
|
+
const groups = new Map();
|
|
51
|
+
for (const f of findings) {
|
|
52
|
+
let key;
|
|
53
|
+
if (groupBy === "severity")
|
|
54
|
+
key = (f.severity || "medium").toLowerCase();
|
|
55
|
+
else if (groupBy === "title")
|
|
56
|
+
key = f.title || "unknown";
|
|
57
|
+
else
|
|
58
|
+
key = f.ruleId || "unknown";
|
|
59
|
+
if (!groups.has(key)) {
|
|
60
|
+
groups.set(key, { ruleId: key, severity: f.severity || "medium", count: 0, findings: [] });
|
|
61
|
+
}
|
|
62
|
+
const g = groups.get(key);
|
|
63
|
+
g.count++;
|
|
64
|
+
g.findings.push({ title: f.title || "", lineNumbers: f.lineNumbers || [] });
|
|
65
|
+
}
|
|
66
|
+
const sorted = [...groups.values()].filter((g) => g.count >= minCount).sort((a, b) => b.count - a.count);
|
|
67
|
+
if (sorted.length === 0) {
|
|
68
|
+
console.log("No correlated groups found (try lowering --min-count).");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (format === "json") {
|
|
72
|
+
console.log(JSON.stringify(sorted, null, 2));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
console.log(`\nCorrelated Findings (grouped by ${groupBy}, min ${minCount}):`);
|
|
76
|
+
console.log("═".repeat(65));
|
|
77
|
+
for (const g of sorted) {
|
|
78
|
+
console.log(`\n [${g.severity.toUpperCase()}] ${g.ruleId} — ${g.count} occurrences`);
|
|
79
|
+
for (const f of g.findings.slice(0, 5)) {
|
|
80
|
+
const lines = f.lineNumbers.length > 0 ? ` (L${f.lineNumbers.join(",")})` : "";
|
|
81
|
+
console.log(` • ${f.title}${lines}`);
|
|
82
|
+
}
|
|
83
|
+
if (g.findings.length > 5)
|
|
84
|
+
console.log(` ... and ${g.findings.length - 5} more`);
|
|
85
|
+
}
|
|
86
|
+
console.log("\n" + "═".repeat(65));
|
|
87
|
+
console.log(` ${sorted.length} groups, ${sorted.reduce((s, g) => s + g.count, 0)} total findings`);
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=finding-correlate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-correlate.js","sourceRoot":"","sources":["../../src/commands/finding-correlate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-dedup-cross-file.d.ts","sourceRoot":"","sources":["../../src/commands/finding-dedup-cross-file.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmG7D"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding-dedup-cross-file — Deduplicate findings across multiple result files.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, existsSync } from "fs";
|
|
5
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
6
|
+
export function runFindingDedupCrossFile(argv) {
|
|
7
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
8
|
+
console.log(`
|
|
9
|
+
judges finding-dedup-cross-file — Deduplicate findings across result files
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
judges finding-dedup-cross-file --files <f1,f2,...> [options]
|
|
13
|
+
|
|
14
|
+
Options:
|
|
15
|
+
--files <list> Comma-separated result files (required)
|
|
16
|
+
--key <field> Dedup key: ruleId, title, ruleId+title (default: ruleId)
|
|
17
|
+
--format json JSON output
|
|
18
|
+
--help, -h Show this help
|
|
19
|
+
|
|
20
|
+
Merges and deduplicates findings from multiple review runs.
|
|
21
|
+
`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const filesStr = argv.find((_a, i) => argv[i - 1] === "--files");
|
|
25
|
+
if (!filesStr) {
|
|
26
|
+
console.error("Error: --files required");
|
|
27
|
+
process.exitCode = 1;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const files = filesStr
|
|
31
|
+
.split(",")
|
|
32
|
+
.map((f) => f.trim())
|
|
33
|
+
.filter(Boolean);
|
|
34
|
+
const key = argv.find((_a, i) => argv[i - 1] === "--key") || "ruleId";
|
|
35
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
36
|
+
const allFindings = [];
|
|
37
|
+
for (const file of files) {
|
|
38
|
+
if (!existsSync(file)) {
|
|
39
|
+
console.error(`Warning: file not found: ${file}`);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const data = JSON.parse(readFileSync(file, "utf-8"));
|
|
44
|
+
const findings = Array.isArray(data) ? data : data.findings || [];
|
|
45
|
+
for (const f of findings) {
|
|
46
|
+
allFindings.push({ ...f, source: file });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
console.error(`Warning: could not parse: ${file}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Deduplicate
|
|
54
|
+
const groups = new Map();
|
|
55
|
+
for (const f of allFindings) {
|
|
56
|
+
let dedupKey;
|
|
57
|
+
if (key === "title")
|
|
58
|
+
dedupKey = f.title || "unknown";
|
|
59
|
+
else if (key === "ruleId+title")
|
|
60
|
+
dedupKey = `${f.ruleId || ""}:${f.title || ""}`;
|
|
61
|
+
else
|
|
62
|
+
dedupKey = f.ruleId || "unknown";
|
|
63
|
+
if (!groups.has(dedupKey)) {
|
|
64
|
+
groups.set(dedupKey, {
|
|
65
|
+
ruleId: f.ruleId || "unknown",
|
|
66
|
+
title: f.title || "",
|
|
67
|
+
severity: f.severity || "medium",
|
|
68
|
+
occurrences: 0,
|
|
69
|
+
sources: [],
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
const g = groups.get(dedupKey);
|
|
73
|
+
g.occurrences++;
|
|
74
|
+
if (!g.sources.includes(f.source))
|
|
75
|
+
g.sources.push(f.source);
|
|
76
|
+
}
|
|
77
|
+
const deduped = [...groups.values()].sort((a, b) => b.occurrences - a.occurrences);
|
|
78
|
+
const duplicatesRemoved = allFindings.length - deduped.length;
|
|
79
|
+
if (format === "json") {
|
|
80
|
+
console.log(JSON.stringify({ totalInput: allFindings.length, uniqueFindings: deduped.length, duplicatesRemoved, findings: deduped }, null, 2));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
console.log(`\nCross-File Deduplication:`);
|
|
84
|
+
console.log("═".repeat(65));
|
|
85
|
+
console.log(` Input: ${allFindings.length} findings from ${files.length} files`);
|
|
86
|
+
console.log(` Unique: ${deduped.length} (${duplicatesRemoved} duplicates removed)`);
|
|
87
|
+
console.log("─".repeat(65));
|
|
88
|
+
for (const d of deduped.slice(0, 20)) {
|
|
89
|
+
const srcCount = d.sources.length > 1 ? ` (${d.sources.length} files)` : "";
|
|
90
|
+
console.log(` ${d.ruleId.padEnd(25)} x${d.occurrences}${srcCount} [${d.severity.toUpperCase()}]`);
|
|
91
|
+
}
|
|
92
|
+
if (deduped.length > 20)
|
|
93
|
+
console.log(` ... and ${deduped.length - 20} more`);
|
|
94
|
+
console.log("═".repeat(65));
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=finding-dedup-cross-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-dedup-cross-file.js","sourceRoot":"","sources":["../../src/commands/finding-dedup-cross-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-dependency-check.d.ts","sourceRoot":"","sources":["../../src/commands/finding-dependency-check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgI9D"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding-dependency-check — Check findings related to dependency vulnerabilities.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, existsSync } from "fs";
|
|
5
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
6
|
+
export function runFindingDependencyCheck(argv) {
|
|
7
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
8
|
+
console.log(`
|
|
9
|
+
judges finding-dependency-check — Analyze dependency-related findings
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
judges finding-dependency-check --file <results> [options]
|
|
13
|
+
judges finding-dependency-check scan --lockfile <path>
|
|
14
|
+
|
|
15
|
+
Options:
|
|
16
|
+
--file <path> Results file with findings
|
|
17
|
+
--lockfile <path> package-lock.json or similar
|
|
18
|
+
--min-severity <s> Filter by minimum severity
|
|
19
|
+
--format json JSON output
|
|
20
|
+
--help, -h Show this help
|
|
21
|
+
|
|
22
|
+
Identifies findings related to dependency vulnerabilities.
|
|
23
|
+
`);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
27
|
+
const subcommand = argv.find((a) => a === "scan");
|
|
28
|
+
if (subcommand === "scan") {
|
|
29
|
+
const lockfile = argv.find((_a, i) => argv[i - 1] === "--lockfile") || "package-lock.json";
|
|
30
|
+
if (!existsSync(lockfile)) {
|
|
31
|
+
console.error(`Error: lockfile not found: ${lockfile}`);
|
|
32
|
+
process.exitCode = 1;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
let lockData;
|
|
36
|
+
try {
|
|
37
|
+
lockData = JSON.parse(readFileSync(lockfile, "utf-8"));
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
console.error("Error: could not parse lockfile");
|
|
41
|
+
process.exitCode = 1;
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const deps = lockData.dependencies || {};
|
|
45
|
+
const depCount = Object.keys(deps).length;
|
|
46
|
+
const pkgs = lockData.packages || {};
|
|
47
|
+
const pkgCount = Object.keys(pkgs).length;
|
|
48
|
+
if (format === "json") {
|
|
49
|
+
console.log(JSON.stringify({ lockfile, dependencies: depCount, packages: pkgCount }, null, 2));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
console.log(`\nDependency Scan: ${lockfile}`);
|
|
53
|
+
console.log("═".repeat(45));
|
|
54
|
+
console.log(` Dependencies: ${depCount}`);
|
|
55
|
+
console.log(` Packages: ${pkgCount}`);
|
|
56
|
+
console.log("═".repeat(45));
|
|
57
|
+
console.log(" Use 'judges eval' with dependency judges for full vulnerability analysis.");
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Analyze findings for dependency-related issues
|
|
61
|
+
const file = argv.find((_a, i) => argv[i - 1] === "--file");
|
|
62
|
+
if (!file) {
|
|
63
|
+
console.error("Error: --file or scan subcommand required");
|
|
64
|
+
process.exitCode = 1;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (!existsSync(file)) {
|
|
68
|
+
console.error(`Error: file not found: ${file}`);
|
|
69
|
+
process.exitCode = 1;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const minSeverity = argv.find((_a, i) => argv[i - 1] === "--min-severity");
|
|
73
|
+
const sevOrder = { critical: 4, high: 3, medium: 2, low: 1, info: 0 };
|
|
74
|
+
let findings;
|
|
75
|
+
try {
|
|
76
|
+
const data = JSON.parse(readFileSync(file, "utf-8"));
|
|
77
|
+
findings = Array.isArray(data) ? data : data.findings || [];
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
console.error("Error: could not parse results file");
|
|
81
|
+
process.exitCode = 1;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// Filter for dependency-related findings
|
|
85
|
+
const depKeywords = [
|
|
86
|
+
"dependency",
|
|
87
|
+
"package",
|
|
88
|
+
"module",
|
|
89
|
+
"import",
|
|
90
|
+
"require",
|
|
91
|
+
"version",
|
|
92
|
+
"cve",
|
|
93
|
+
"vulnerability",
|
|
94
|
+
"outdated",
|
|
95
|
+
"deprecated",
|
|
96
|
+
];
|
|
97
|
+
let depFindings = findings.filter((f) => {
|
|
98
|
+
const text = `${f.ruleId || ""} ${f.title || ""} ${f.description || ""}`.toLowerCase();
|
|
99
|
+
return depKeywords.some((k) => text.includes(k));
|
|
100
|
+
});
|
|
101
|
+
if (minSeverity) {
|
|
102
|
+
const minLevel = sevOrder[minSeverity.toLowerCase()] || 0;
|
|
103
|
+
depFindings = depFindings.filter((f) => (sevOrder[(f.severity || "medium").toLowerCase()] || 0) >= minLevel);
|
|
104
|
+
}
|
|
105
|
+
if (depFindings.length === 0) {
|
|
106
|
+
console.log("No dependency-related findings.");
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (format === "json") {
|
|
110
|
+
console.log(JSON.stringify(depFindings, null, 2));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
console.log(`\nDependency-Related Findings (${depFindings.length}):`);
|
|
114
|
+
console.log("═".repeat(65));
|
|
115
|
+
for (const f of depFindings) {
|
|
116
|
+
console.log(` [${(f.severity || "medium").toUpperCase()}] ${f.ruleId || "?"}: ${f.title || ""}`);
|
|
117
|
+
}
|
|
118
|
+
console.log("═".repeat(65));
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=finding-dependency-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-dependency-check.js","sourceRoot":"","sources":["../../src/commands/finding-dependency-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-impact-score.d.ts","sourceRoot":"","sources":["../../src/commands/finding-impact-score.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8EH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoF1D"}
|