@kevinrabun/judges 3.79.0 → 3.81.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +119 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-autofix-preview.d.ts +5 -0
  6. package/dist/commands/finding-autofix-preview.d.ts.map +1 -0
  7. package/dist/commands/finding-autofix-preview.js +87 -0
  8. package/dist/commands/finding-autofix-preview.js.map +1 -0
  9. package/dist/commands/finding-context-expand.d.ts +5 -0
  10. package/dist/commands/finding-context-expand.d.ts.map +1 -0
  11. package/dist/commands/finding-context-expand.js +103 -0
  12. package/dist/commands/finding-context-expand.js.map +1 -0
  13. package/dist/commands/finding-cwe-map.d.ts +5 -0
  14. package/dist/commands/finding-cwe-map.d.ts.map +1 -0
  15. package/dist/commands/finding-cwe-map.js +134 -0
  16. package/dist/commands/finding-cwe-map.js.map +1 -0
  17. package/dist/commands/finding-false-neg-check.d.ts +9 -0
  18. package/dist/commands/finding-false-neg-check.d.ts.map +1 -0
  19. package/dist/commands/finding-false-neg-check.js +140 -0
  20. package/dist/commands/finding-false-neg-check.js.map +1 -0
  21. package/dist/commands/finding-merge-results.d.ts +5 -0
  22. package/dist/commands/finding-merge-results.d.ts.map +1 -0
  23. package/dist/commands/finding-merge-results.js +111 -0
  24. package/dist/commands/finding-merge-results.js.map +1 -0
  25. package/dist/commands/finding-pattern-match.d.ts +5 -0
  26. package/dist/commands/finding-pattern-match.d.ts.map +1 -0
  27. package/dist/commands/finding-pattern-match.js +166 -0
  28. package/dist/commands/finding-pattern-match.js.map +1 -0
  29. package/dist/commands/finding-risk-matrix.d.ts +5 -0
  30. package/dist/commands/finding-risk-matrix.d.ts.map +1 -0
  31. package/dist/commands/finding-risk-matrix.js +127 -0
  32. package/dist/commands/finding-risk-matrix.js.map +1 -0
  33. package/dist/commands/finding-severity-trend.d.ts +5 -0
  34. package/dist/commands/finding-severity-trend.d.ts.map +1 -0
  35. package/dist/commands/finding-severity-trend.js +128 -0
  36. package/dist/commands/finding-severity-trend.js.map +1 -0
  37. package/dist/commands/review-batch-files.d.ts +5 -0
  38. package/dist/commands/review-batch-files.d.ts.map +1 -0
  39. package/dist/commands/review-batch-files.js +83 -0
  40. package/dist/commands/review-batch-files.js.map +1 -0
  41. package/dist/commands/review-blame-map.d.ts +5 -0
  42. package/dist/commands/review-blame-map.d.ts.map +1 -0
  43. package/dist/commands/review-blame-map.js +101 -0
  44. package/dist/commands/review-blame-map.js.map +1 -0
  45. package/dist/commands/review-config-diff.d.ts +5 -0
  46. package/dist/commands/review-config-diff.d.ts.map +1 -0
  47. package/dist/commands/review-config-diff.js +109 -0
  48. package/dist/commands/review-config-diff.js.map +1 -0
  49. package/dist/commands/review-dependency-graph.d.ts +5 -0
  50. package/dist/commands/review-dependency-graph.d.ts.map +1 -0
  51. package/dist/commands/review-dependency-graph.js +95 -0
  52. package/dist/commands/review-dependency-graph.js.map +1 -0
  53. package/dist/commands/review-diff-stats.d.ts +5 -0
  54. package/dist/commands/review-diff-stats.d.ts.map +1 -0
  55. package/dist/commands/review-diff-stats.js +91 -0
  56. package/dist/commands/review-diff-stats.js.map +1 -0
  57. package/dist/commands/review-exclude-vendor.d.ts +5 -0
  58. package/dist/commands/review-exclude-vendor.d.ts.map +1 -0
  59. package/dist/commands/review-exclude-vendor.js +159 -0
  60. package/dist/commands/review-exclude-vendor.js.map +1 -0
  61. package/dist/commands/review-file-stats.d.ts +5 -0
  62. package/dist/commands/review-file-stats.d.ts.map +1 -0
  63. package/dist/commands/review-file-stats.js +131 -0
  64. package/dist/commands/review-file-stats.js.map +1 -0
  65. package/dist/commands/review-output-format.d.ts +5 -0
  66. package/dist/commands/review-output-format.d.ts.map +1 -0
  67. package/dist/commands/review-output-format.js +145 -0
  68. package/dist/commands/review-output-format.js.map +1 -0
  69. package/dist/commands/review-rule-filter.d.ts +5 -0
  70. package/dist/commands/review-rule-filter.d.ts.map +1 -0
  71. package/dist/commands/review-rule-filter.js +117 -0
  72. package/dist/commands/review-rule-filter.js.map +1 -0
  73. package/package.json +1 -1
  74. package/server.json +2 -2
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Finding-autofix-preview — Preview auto-fix patches before applying them.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runFindingAutofixPreview(argv) {
7
+ if (argv.includes("--help") || argv.includes("-h") || argv.length === 0) {
8
+ console.log(`
9
+ judges finding-autofix-preview — Preview auto-fix patches
10
+
11
+ Usage:
12
+ judges finding-autofix-preview --file <results.json> [options]
13
+
14
+ Options:
15
+ --file <path> Result file (required)
16
+ --rule <ruleId> Preview fixes for specific rule only
17
+ --format json JSON output
18
+ --help, -h Show this help
19
+
20
+ Shows patch previews for findings that have auto-fix suggestions.
21
+ `);
22
+ return;
23
+ }
24
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
25
+ if (!file) {
26
+ console.error("Error: --file required");
27
+ process.exitCode = 1;
28
+ return;
29
+ }
30
+ if (!existsSync(file)) {
31
+ console.error(`Error: file not found: ${file}`);
32
+ process.exitCode = 1;
33
+ return;
34
+ }
35
+ const rule = argv.find((_a, i) => argv[i - 1] === "--rule");
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
+ let findings = verdict.findings || [];
47
+ if (rule)
48
+ findings = findings.filter((f) => f.ruleId === rule);
49
+ const fixable = findings.filter((f) => (f.patch !== undefined && f.patch !== null) || f.suggestedFix);
50
+ if (format === "json") {
51
+ const previews = fixable.map((f) => ({
52
+ ruleId: f.ruleId,
53
+ title: f.title,
54
+ severity: f.severity,
55
+ hasPatch: f.patch !== undefined && f.patch !== null,
56
+ hasSuggestedFix: !!f.suggestedFix,
57
+ patch: f.patch !== undefined && f.patch !== null ? String(f.patch) : null,
58
+ suggestedFix: f.suggestedFix || null,
59
+ }));
60
+ console.log(JSON.stringify({ total: findings.length, fixable: fixable.length, previews }, null, 2));
61
+ return;
62
+ }
63
+ console.log(`\nAuto-Fix Preview:`);
64
+ console.log("═".repeat(70));
65
+ console.log(` ${fixable.length} of ${findings.length} findings have auto-fix suggestions`);
66
+ console.log("─".repeat(70));
67
+ for (const f of fixable.slice(0, 15)) {
68
+ console.log(`\n ${f.ruleId} [${(f.severity || "medium").toUpperCase()}]`);
69
+ console.log(` ${f.title}`);
70
+ if (f.patch !== undefined && f.patch !== null) {
71
+ const patchStr = String(f.patch);
72
+ const lines = patchStr.split("\n").slice(0, 8);
73
+ console.log(` Patch:`);
74
+ for (const l of lines)
75
+ console.log(` ${l}`);
76
+ if (patchStr.split("\n").length > 8)
77
+ console.log(` ... (truncated)`);
78
+ }
79
+ if (f.suggestedFix) {
80
+ console.log(` Suggested: ${f.suggestedFix}`);
81
+ }
82
+ }
83
+ if (fixable.length > 15)
84
+ console.log(`\n ... and ${fixable.length - 15} more fixable findings`);
85
+ console.log("\n" + "═".repeat(70));
86
+ }
87
+ //# sourceMappingURL=finding-autofix-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-autofix-preview.js","sourceRoot":"","sources":["../../src/commands/finding-autofix-preview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-context-expand — Expand finding context with surrounding source code.
3
+ */
4
+ export declare function runFindingContextExpand(argv: string[]): void;
5
+ //# sourceMappingURL=finding-context-expand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-context-expand.d.ts","sourceRoot":"","sources":["../../src/commands/finding-context-expand.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmH5D"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Finding-context-expand — Expand finding context with surrounding source code.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runFindingContextExpand(argv) {
7
+ if (argv.includes("--help") || argv.includes("-h") || argv.length === 0) {
8
+ console.log(`
9
+ judges finding-context-expand — Expand finding context
10
+
11
+ Usage:
12
+ judges finding-context-expand --file <results.json> --source <path> [options]
13
+
14
+ Options:
15
+ --file <path> Result file (required)
16
+ --source <path> Source file to read context from (required)
17
+ --lines <n> Lines of context above/below (default: 5)
18
+ --rule <ruleId> Filter to specific rule
19
+ --format json JSON output
20
+ --help, -h Show this help
21
+
22
+ Shows findings with expanded source code context.
23
+ `);
24
+ return;
25
+ }
26
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
27
+ const source = argv.find((_a, i) => argv[i - 1] === "--source");
28
+ const linesStr = argv.find((_a, i) => argv[i - 1] === "--lines");
29
+ const rule = argv.find((_a, i) => argv[i - 1] === "--rule");
30
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
31
+ const contextLines = linesStr ? parseInt(linesStr, 10) : 5;
32
+ if (!file) {
33
+ console.error("Error: --file required");
34
+ process.exitCode = 1;
35
+ return;
36
+ }
37
+ if (!source) {
38
+ console.error("Error: --source required");
39
+ process.exitCode = 1;
40
+ return;
41
+ }
42
+ if (!existsSync(file)) {
43
+ console.error(`Error: file not found: ${file}`);
44
+ process.exitCode = 1;
45
+ return;
46
+ }
47
+ if (!existsSync(source)) {
48
+ console.error(`Error: source not found: ${source}`);
49
+ process.exitCode = 1;
50
+ return;
51
+ }
52
+ let verdict;
53
+ try {
54
+ verdict = JSON.parse(readFileSync(file, "utf-8"));
55
+ }
56
+ catch {
57
+ console.error("Error: could not parse file");
58
+ process.exitCode = 1;
59
+ return;
60
+ }
61
+ const sourceLines = readFileSync(source, "utf-8").split("\n");
62
+ let findings = verdict.findings || [];
63
+ if (rule)
64
+ findings = findings.filter((f) => f.ruleId === rule);
65
+ const withLines = findings.filter((f) => f.lineNumbers !== undefined && f.lineNumbers !== null && f.lineNumbers.length > 0);
66
+ const expanded = [];
67
+ for (const f of withLines) {
68
+ const fLines = f.lineNumbers || [];
69
+ const ctx = [];
70
+ for (const ln of fLines) {
71
+ const start = Math.max(0, ln - contextLines - 1);
72
+ const end = Math.min(sourceLines.length, ln + contextLines);
73
+ for (let i = start; i < end; i++) {
74
+ if (!ctx.some((c) => c.lineNum === i + 1)) {
75
+ ctx.push({ lineNum: i + 1, content: sourceLines[i] || "", isFinding: fLines.includes(i + 1) });
76
+ }
77
+ }
78
+ }
79
+ ctx.sort((a, b) => a.lineNum - b.lineNum);
80
+ expanded.push({ ruleId: f.ruleId, title: f.title, severity: f.severity, context: ctx });
81
+ }
82
+ if (format === "json") {
83
+ console.log(JSON.stringify({ total: findings.length, expanded: expanded.length, findings: expanded }, null, 2));
84
+ return;
85
+ }
86
+ console.log(`\nExpanded Context:`);
87
+ console.log("═".repeat(70));
88
+ console.log(` ${expanded.length} findings with line context from ${source}`);
89
+ console.log("─".repeat(70));
90
+ for (const e of expanded.slice(0, 10)) {
91
+ console.log(`\n ${e.ruleId} [${(e.severity || "medium").toUpperCase()}]`);
92
+ console.log(` ${e.title}`);
93
+ console.log("");
94
+ for (const c of e.context) {
95
+ const marker = c.isFinding ? ">>>" : " ";
96
+ console.log(` ${marker} ${String(c.lineNum).padStart(4)} │ ${c.content}`);
97
+ }
98
+ }
99
+ if (expanded.length > 10)
100
+ console.log(`\n ... and ${expanded.length - 10} more`);
101
+ console.log("\n" + "═".repeat(70));
102
+ }
103
+ //# sourceMappingURL=finding-context-expand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-context-expand.js","sourceRoot":"","sources":["../../src/commands/finding-context-expand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-cwe-map — Map findings to CWE (Common Weakness Enumeration) identifiers.
3
+ */
4
+ export declare function runFindingCweMap(argv: string[]): void;
5
+ //# sourceMappingURL=finding-cwe-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-cwe-map.d.ts","sourceRoot":"","sources":["../../src/commands/finding-cwe-map.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwDH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+FrD"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Finding-cwe-map — Map findings to CWE (Common Weakness Enumeration) identifiers.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CWE Mapping ───────────────────────────────────────────────────────────
6
+ const KEYWORD_CWE_MAP = {
7
+ injection: [
8
+ { cwe: "CWE-89", name: "SQL Injection" },
9
+ { cwe: "CWE-78", name: "OS Command Injection" },
10
+ ],
11
+ "sql injection": [{ cwe: "CWE-89", name: "SQL Injection" }],
12
+ xss: [{ cwe: "CWE-79", name: "Cross-site Scripting" }],
13
+ "cross-site scripting": [{ cwe: "CWE-79", name: "Cross-site Scripting" }],
14
+ csrf: [{ cwe: "CWE-352", name: "Cross-Site Request Forgery" }],
15
+ "path traversal": [{ cwe: "CWE-22", name: "Path Traversal" }],
16
+ "buffer overflow": [{ cwe: "CWE-120", name: "Buffer Copy without Checking Size" }],
17
+ authentication: [{ cwe: "CWE-287", name: "Improper Authentication" }],
18
+ authorization: [{ cwe: "CWE-862", name: "Missing Authorization" }],
19
+ hardcoded: [{ cwe: "CWE-798", name: "Use of Hard-coded Credentials" }],
20
+ credential: [{ cwe: "CWE-798", name: "Use of Hard-coded Credentials" }],
21
+ password: [{ cwe: "CWE-521", name: "Weak Password Requirements" }],
22
+ deserialization: [{ cwe: "CWE-502", name: "Deserialization of Untrusted Data" }],
23
+ ssrf: [{ cwe: "CWE-918", name: "Server-Side Request Forgery" }],
24
+ "race condition": [{ cwe: "CWE-362", name: "Race Condition" }],
25
+ "null pointer": [{ cwe: "CWE-476", name: "NULL Pointer Dereference" }],
26
+ "memory leak": [{ cwe: "CWE-401", name: "Missing Release of Memory" }],
27
+ "information disclosure": [{ cwe: "CWE-200", name: "Exposure of Sensitive Information" }],
28
+ cryptographic: [{ cwe: "CWE-327", name: "Use of a Broken Crypto Algorithm" }],
29
+ encryption: [{ cwe: "CWE-326", name: "Inadequate Encryption Strength" }],
30
+ "open redirect": [{ cwe: "CWE-601", name: "URL Redirection to Untrusted Site" }],
31
+ xml: [{ cwe: "CWE-611", name: "Improper Restriction of XML External Entity" }],
32
+ privilege: [{ cwe: "CWE-269", name: "Improper Privilege Management" }],
33
+ };
34
+ function mapFindingToCwe(finding) {
35
+ const text = `${finding.ruleId || ""} ${finding.title || ""} ${finding.description || ""}`.toLowerCase();
36
+ const matches = [];
37
+ const seen = new Set();
38
+ for (const [keyword, cwes] of Object.entries(KEYWORD_CWE_MAP)) {
39
+ if (text.includes(keyword)) {
40
+ for (const c of cwes) {
41
+ if (!seen.has(c.cwe)) {
42
+ seen.add(c.cwe);
43
+ matches.push(c);
44
+ }
45
+ }
46
+ }
47
+ }
48
+ return matches;
49
+ }
50
+ // ─── CLI ────────────────────────────────────────────────────────────────────
51
+ export function runFindingCweMap(argv) {
52
+ if (argv.includes("--help") || argv.includes("-h") || argv.length === 0) {
53
+ console.log(`
54
+ judges finding-cwe-map — Map findings to CWE identifiers
55
+
56
+ Usage:
57
+ judges finding-cwe-map --file <results.json> [options]
58
+
59
+ Options:
60
+ --file <path> Result file (required)
61
+ --cwe <id> Filter to specific CWE (e.g., CWE-89)
62
+ --format json JSON output
63
+ --help, -h Show this help
64
+
65
+ Maps security findings to their corresponding CWE identifiers.
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 cweFilter = argv.find((_a, i) => argv[i - 1] === "--cwe");
81
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
82
+ let verdict;
83
+ try {
84
+ verdict = JSON.parse(readFileSync(file, "utf-8"));
85
+ }
86
+ catch {
87
+ console.error("Error: could not parse file");
88
+ process.exitCode = 1;
89
+ return;
90
+ }
91
+ const findings = verdict.findings || [];
92
+ let mapped = findings.map((f) => ({ ...f, cwes: mapFindingToCwe(f) }));
93
+ if (cweFilter) {
94
+ mapped = mapped.filter((f) => f.cwes.some((c) => c.cwe === cweFilter));
95
+ }
96
+ const withCwe = mapped.filter((f) => f.cwes.length > 0);
97
+ // CWE frequency
98
+ const cweFreq = new Map();
99
+ for (const f of withCwe) {
100
+ for (const c of f.cwes) {
101
+ const existing = cweFreq.get(c.cwe);
102
+ if (existing)
103
+ existing.count++;
104
+ else
105
+ cweFreq.set(c.cwe, { name: c.name, count: 1 });
106
+ }
107
+ }
108
+ if (format === "json") {
109
+ console.log(JSON.stringify({
110
+ total: findings.length,
111
+ mapped: withCwe.length,
112
+ cweSummary: [...cweFreq.entries()].map(([cwe, info]) => ({ cwe, name: info.name, count: info.count })),
113
+ findings: mapped,
114
+ }, null, 2));
115
+ return;
116
+ }
117
+ console.log(`\nCWE Mapping:`);
118
+ console.log("═".repeat(70));
119
+ console.log(` ${withCwe.length} of ${findings.length} findings mapped to CWE identifiers`);
120
+ console.log("─".repeat(70));
121
+ console.log("\n CWE Summary:");
122
+ for (const [cwe, info] of [...cweFreq.entries()].sort((a, b) => b[1].count - a[1].count)) {
123
+ console.log(` ${cwe.padEnd(12)} ${info.name.padEnd(40)} x${info.count}`);
124
+ }
125
+ console.log("\n Mapped Findings:");
126
+ for (const f of withCwe.slice(0, 15)) {
127
+ const cweStr = f.cwes.map((c) => c.cwe).join(", ");
128
+ console.log(` ${(f.ruleId || "unknown").padEnd(22)} → ${cweStr}`);
129
+ }
130
+ if (withCwe.length > 15)
131
+ console.log(` ... and ${withCwe.length - 15} more`);
132
+ console.log("═".repeat(70));
133
+ }
134
+ //# sourceMappingURL=finding-cwe-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-cwe-map.js","sourceRoot":"","sources":["../../src/commands/finding-cwe-map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Finding-false-neg-check — Check for potential false negatives.
3
+ *
4
+ * Analyzes code for common vulnerability patterns that may have been
5
+ * missed by the current judge panel. Uses keyword heuristics to flag
6
+ * lines that warrant manual review.
7
+ */
8
+ export declare function runFindingFalseNegCheck(argv: string[]): void;
9
+ //# sourceMappingURL=finding-false-neg-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-false-neg-check.d.ts","sourceRoot":"","sources":["../../src/commands/finding-false-neg-check.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA+EH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkF5D"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Finding-false-neg-check — Check for potential false negatives.
3
+ *
4
+ * Analyzes code for common vulnerability patterns that may have been
5
+ * missed by the current judge panel. Uses keyword heuristics to flag
6
+ * lines that warrant manual review.
7
+ */
8
+ import { readFileSync, existsSync } from "fs";
9
+ // ─── Patterns ───────────────────────────────────────────────────────────────
10
+ const SUSPICIOUS_PATTERNS = [
11
+ { regex: /eval\s*\(/, category: "injection", reason: "Dynamic code evaluation" },
12
+ { regex: /innerHTML\s*=/, category: "xss", reason: "Direct innerHTML assignment" },
13
+ { regex: /dangerouslySetInnerHTML/, category: "xss", reason: "React dangerous HTML" },
14
+ { regex: /document\.write\s*\(/, category: "xss", reason: "Document write usage" },
15
+ { regex: /exec\s*\(/, category: "command-injection", reason: "Command execution" },
16
+ { regex: /child_process/, category: "command-injection", reason: "Child process usage" },
17
+ { regex: /SELECT\s.*FROM\s.*WHERE/i, category: "sql-injection", reason: "Raw SQL query" },
18
+ { regex: /password\s*[:=]\s*['"]/, category: "hardcoded-secret", reason: "Hardcoded password" },
19
+ { regex: /api[_-]?key\s*[:=]\s*['"]/, category: "hardcoded-secret", reason: "Hardcoded API key" },
20
+ { regex: /secret\s*[:=]\s*['"]/, category: "hardcoded-secret", reason: "Hardcoded secret" },
21
+ { regex: /Math\.random\s*\(/, category: "weak-crypto", reason: "Math.random for security" },
22
+ { regex: /createHash\s*\(\s*['"]md5['"]/, category: "weak-crypto", reason: "MD5 hash usage" },
23
+ { regex: /createHash\s*\(\s*['"]sha1['"]/, category: "weak-crypto", reason: "SHA1 hash usage" },
24
+ {
25
+ regex: /disable.*ssl|verify\s*=\s*false|rejectUnauthorized.*false/i,
26
+ category: "tls",
27
+ reason: "TLS verification disabled",
28
+ },
29
+ { regex: /cors\(\s*\)/, category: "cors", reason: "Permissive CORS" },
30
+ { regex: /chmod\s+777/, category: "permissions", reason: "World-writable permissions" },
31
+ { regex: /TODO.*security|FIXME.*vuln|HACK.*auth/i, category: "todo", reason: "Security-related TODO" },
32
+ { regex: /console\.(log|debug)\s*\(.*password/i, category: "logging", reason: "Password in logs" },
33
+ ];
34
+ // ─── Helpers ────────────────────────────────────────────────────────────────
35
+ function scanFile(filePath) {
36
+ const content = readFileSync(filePath, "utf-8");
37
+ const lines = content.split("\n");
38
+ const candidates = [];
39
+ for (let i = 0; i < lines.length; i++) {
40
+ const line = lines[i];
41
+ for (const pat of SUSPICIOUS_PATTERNS) {
42
+ if (pat.regex.test(line)) {
43
+ candidates.push({
44
+ lineNumber: i + 1,
45
+ lineContent: line.trim().slice(0, 120),
46
+ pattern: pat.regex.source,
47
+ category: pat.category,
48
+ reason: pat.reason,
49
+ });
50
+ }
51
+ }
52
+ }
53
+ return candidates;
54
+ }
55
+ function crossCheckVerdict(candidates, verdict) {
56
+ // Filter out candidates that already have findings for the same line/category
57
+ const coveredLines = new Set();
58
+ for (const f of verdict.findings) {
59
+ if (f.lineNumbers) {
60
+ for (const ln of f.lineNumbers)
61
+ coveredLines.add(ln);
62
+ }
63
+ }
64
+ return candidates.filter((c) => !coveredLines.has(c.lineNumber));
65
+ }
66
+ // ─── CLI ────────────────────────────────────────────────────────────────────
67
+ export function runFindingFalseNegCheck(argv) {
68
+ const fileIdx = argv.indexOf("--file");
69
+ const verdictIdx = argv.indexOf("--verdict");
70
+ const formatIdx = argv.indexOf("--format");
71
+ const categoryIdx = argv.indexOf("--category");
72
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
73
+ const verdictPath = verdictIdx >= 0 ? argv[verdictIdx + 1] : undefined;
74
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
75
+ const filterCategory = categoryIdx >= 0 ? argv[categoryIdx + 1] : undefined;
76
+ if (argv.includes("--help") || argv.includes("-h")) {
77
+ console.log(`
78
+ judges finding-false-neg-check — Check for potential false negatives
79
+
80
+ Usage:
81
+ judges finding-false-neg-check --file <source> [--verdict <verdict.json>]
82
+ [--format table|json] [--category <cat>]
83
+
84
+ Options:
85
+ --file <path> Source file to scan for suspicious patterns (required)
86
+ --verdict <path> Verdict JSON to cross-check (optional)
87
+ --format <fmt> Output format: table (default), json
88
+ --category <cat> Filter by category (injection, xss, hardcoded-secret, etc.)
89
+ --help, -h Show this help
90
+ `);
91
+ return;
92
+ }
93
+ if (!filePath) {
94
+ console.error("Error: --file required");
95
+ process.exitCode = 1;
96
+ return;
97
+ }
98
+ if (!existsSync(filePath)) {
99
+ console.error(`Error: file not found: ${filePath}`);
100
+ process.exitCode = 1;
101
+ return;
102
+ }
103
+ let candidates = scanFile(filePath);
104
+ if (verdictPath && existsSync(verdictPath)) {
105
+ try {
106
+ const verdict = JSON.parse(readFileSync(verdictPath, "utf-8"));
107
+ candidates = crossCheckVerdict(candidates, verdict);
108
+ }
109
+ catch {
110
+ /* skip cross-check */
111
+ }
112
+ }
113
+ if (filterCategory) {
114
+ candidates = candidates.filter((c) => c.category === filterCategory);
115
+ }
116
+ if (format === "json") {
117
+ console.log(JSON.stringify(candidates, null, 2));
118
+ return;
119
+ }
120
+ if (candidates.length === 0) {
121
+ console.log("No potential false negatives detected.");
122
+ return;
123
+ }
124
+ console.log(`\nPotential False Negatives in ${filePath}`);
125
+ console.log("═".repeat(70));
126
+ console.log(`${"Line".padEnd(7)} ${"Category".padEnd(20)} Reason`);
127
+ console.log("─".repeat(70));
128
+ for (const c of candidates) {
129
+ console.log(`${String(c.lineNumber).padEnd(7)} ${c.category.padEnd(20)} ${c.reason}`);
130
+ console.log(` ${c.lineContent}`);
131
+ }
132
+ console.log("─".repeat(70));
133
+ const categories = new Map();
134
+ for (const c of candidates) {
135
+ categories.set(c.category, (categories.get(c.category) || 0) + 1);
136
+ }
137
+ console.log(`${candidates.length} suspicious patterns found across ${categories.size} categories`);
138
+ console.log("═".repeat(70));
139
+ }
140
+ //# sourceMappingURL=finding-false-neg-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-false-neg-check.js","sourceRoot":"","sources":["../../src/commands/finding-false-neg-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-merge-results — Merge findings from multiple review result files.
3
+ */
4
+ export declare function runFindingMergeResults(argv: string[]): void;
5
+ //# sourceMappingURL=finding-merge-results.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-merge-results.d.ts","sourceRoot":"","sources":["../../src/commands/finding-merge-results.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8H3D"}