@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.
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/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-correlate.d.ts +5 -0
  10. package/dist/commands/finding-correlate.d.ts.map +1 -0
  11. package/dist/commands/finding-correlate.js +89 -0
  12. package/dist/commands/finding-correlate.js.map +1 -0
  13. package/dist/commands/finding-dedup-cross-file.d.ts +5 -0
  14. package/dist/commands/finding-dedup-cross-file.d.ts.map +1 -0
  15. package/dist/commands/finding-dedup-cross-file.js +96 -0
  16. package/dist/commands/finding-dedup-cross-file.js.map +1 -0
  17. package/dist/commands/finding-dependency-check.d.ts +5 -0
  18. package/dist/commands/finding-dependency-check.d.ts.map +1 -0
  19. package/dist/commands/finding-dependency-check.js +120 -0
  20. package/dist/commands/finding-dependency-check.js.map +1 -0
  21. package/dist/commands/finding-impact-score.d.ts +5 -0
  22. package/dist/commands/finding-impact-score.d.ts.map +1 -0
  23. package/dist/commands/finding-impact-score.js +124 -0
  24. package/dist/commands/finding-impact-score.js.map +1 -0
  25. package/dist/commands/finding-root-cause.d.ts +5 -0
  26. package/dist/commands/finding-root-cause.d.ts.map +1 -0
  27. package/dist/commands/finding-root-cause.js +185 -0
  28. package/dist/commands/finding-root-cause.js.map +1 -0
  29. package/dist/commands/finding-severity-histogram.d.ts +5 -0
  30. package/dist/commands/finding-severity-histogram.d.ts.map +1 -0
  31. package/dist/commands/finding-severity-histogram.js +67 -0
  32. package/dist/commands/finding-severity-histogram.js.map +1 -0
  33. package/dist/commands/finding-suppress-pattern.d.ts +5 -0
  34. package/dist/commands/finding-suppress-pattern.d.ts.map +1 -0
  35. package/dist/commands/finding-suppress-pattern.js +149 -0
  36. package/dist/commands/finding-suppress-pattern.js.map +1 -0
  37. package/dist/commands/review-auto-merge.d.ts +5 -0
  38. package/dist/commands/review-auto-merge.d.ts.map +1 -0
  39. package/dist/commands/review-auto-merge.js +176 -0
  40. package/dist/commands/review-auto-merge.js.map +1 -0
  41. package/dist/commands/review-cache-clear.d.ts +5 -0
  42. package/dist/commands/review-cache-clear.d.ts.map +1 -0
  43. package/dist/commands/review-cache-clear.js +161 -0
  44. package/dist/commands/review-cache-clear.js.map +1 -0
  45. package/dist/commands/review-compliance-check.d.ts +5 -0
  46. package/dist/commands/review-compliance-check.d.ts.map +1 -0
  47. package/dist/commands/review-compliance-check.js +203 -0
  48. package/dist/commands/review-compliance-check.js.map +1 -0
  49. package/dist/commands/review-dry-run.d.ts +5 -0
  50. package/dist/commands/review-dry-run.d.ts.map +1 -0
  51. package/dist/commands/review-dry-run.js +121 -0
  52. package/dist/commands/review-dry-run.js.map +1 -0
  53. package/dist/commands/review-file-filter.d.ts +5 -0
  54. package/dist/commands/review-file-filter.d.ts.map +1 -0
  55. package/dist/commands/review-file-filter.js +122 -0
  56. package/dist/commands/review-file-filter.js.map +1 -0
  57. package/dist/commands/review-incremental.d.ts +5 -0
  58. package/dist/commands/review-incremental.d.ts.map +1 -0
  59. package/dist/commands/review-incremental.js +129 -0
  60. package/dist/commands/review-incremental.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-progress-bar.d.ts +5 -0
  66. package/dist/commands/review-progress-bar.d.ts.map +1 -0
  67. package/dist/commands/review-progress-bar.js +158 -0
  68. package/dist/commands/review-progress-bar.js.map +1 -0
  69. package/package.json +1 -1
  70. 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":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-correlate — Correlate related findings across files.
3
+ */
4
+ export declare function runFindingCorrelate(argv: string[]): void;
5
+ //# sourceMappingURL=finding-correlate.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * Finding-dedup-cross-file — Deduplicate findings across multiple result files.
3
+ */
4
+ export declare function runFindingDedupCrossFile(argv: string[]): void;
5
+ //# sourceMappingURL=finding-dedup-cross-file.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * Finding-dependency-check — Check findings related to dependency vulnerabilities.
3
+ */
4
+ export declare function runFindingDependencyCheck(argv: string[]): void;
5
+ //# sourceMappingURL=finding-dependency-check.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * Finding-impact-score — Score findings by estimated impact.
3
+ */
4
+ export declare function runFindingImpactScore(argv: string[]): void;
5
+ //# sourceMappingURL=finding-impact-score.d.ts.map
@@ -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"}