@kevinrabun/judges 3.60.0 → 3.62.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 +14 -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/ai-provenance.d.ts +5 -0
- package/dist/commands/ai-provenance.d.ts.map +1 -0
- package/dist/commands/ai-provenance.js +248 -0
- package/dist/commands/ai-provenance.js.map +1 -0
- package/dist/commands/batch-review.d.ts +5 -0
- package/dist/commands/batch-review.d.ts.map +1 -0
- package/dist/commands/batch-review.js +181 -0
- package/dist/commands/batch-review.js.map +1 -0
- package/dist/commands/blame-review.d.ts +5 -0
- package/dist/commands/blame-review.d.ts.map +1 -0
- package/dist/commands/blame-review.js +270 -0
- package/dist/commands/blame-review.js.map +1 -0
- package/dist/commands/custom-rule.d.ts +5 -0
- package/dist/commands/custom-rule.d.ts.map +1 -0
- package/dist/commands/custom-rule.js +211 -0
- package/dist/commands/custom-rule.js.map +1 -0
- package/dist/commands/diff-review.d.ts +5 -0
- package/dist/commands/diff-review.d.ts.map +1 -0
- package/dist/commands/diff-review.js +191 -0
- package/dist/commands/diff-review.js.map +1 -0
- package/dist/commands/evidence-chain.d.ts +5 -0
- package/dist/commands/evidence-chain.d.ts.map +1 -0
- package/dist/commands/evidence-chain.js +310 -0
- package/dist/commands/evidence-chain.js.map +1 -0
- package/dist/commands/focus-area.d.ts +6 -0
- package/dist/commands/focus-area.d.ts.map +1 -0
- package/dist/commands/focus-area.js +193 -0
- package/dist/commands/focus-area.js.map +1 -0
- package/dist/commands/merge-verdict.d.ts +5 -0
- package/dist/commands/merge-verdict.d.ts.map +1 -0
- package/dist/commands/merge-verdict.js +288 -0
- package/dist/commands/merge-verdict.js.map +1 -0
- package/dist/commands/quick-check.d.ts +5 -0
- package/dist/commands/quick-check.d.ts.map +1 -0
- package/dist/commands/quick-check.js +174 -0
- package/dist/commands/quick-check.js.map +1 -0
- package/dist/commands/review-compare.d.ts +5 -0
- package/dist/commands/review-compare.d.ts.map +1 -0
- package/dist/commands/review-compare.js +201 -0
- package/dist/commands/review-compare.js.map +1 -0
- package/dist/commands/review-contract.d.ts +5 -0
- package/dist/commands/review-contract.d.ts.map +1 -0
- package/dist/commands/review-contract.js +200 -0
- package/dist/commands/review-contract.js.map +1 -0
- package/dist/commands/review-explain.d.ts +6 -0
- package/dist/commands/review-explain.d.ts.map +1 -0
- package/dist/commands/review-explain.js +195 -0
- package/dist/commands/review-explain.js.map +1 -0
- package/dist/commands/review-gate.d.ts +5 -0
- package/dist/commands/review-gate.d.ts.map +1 -0
- package/dist/commands/review-gate.js +213 -0
- package/dist/commands/review-gate.js.map +1 -0
- package/dist/commands/review-handoff.d.ts +5 -0
- package/dist/commands/review-handoff.d.ts.map +1 -0
- package/dist/commands/review-handoff.js +209 -0
- package/dist/commands/review-handoff.js.map +1 -0
- package/dist/commands/review-receipt.d.ts +5 -0
- package/dist/commands/review-receipt.d.ts.map +1 -0
- package/dist/commands/review-receipt.js +221 -0
- package/dist/commands/review-receipt.js.map +1 -0
- package/dist/commands/severity-tune.d.ts +5 -0
- package/dist/commands/severity-tune.d.ts.map +1 -0
- package/dist/commands/severity-tune.js +209 -0
- package/dist/commands/severity-tune.js.map +1 -0
- package/dist/commands/trend-report.d.ts +5 -0
- package/dist/commands/trend-report.d.ts.map +1 -0
- package/dist/commands/trend-report.js +149 -0
- package/dist/commands/trend-report.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff-review — Review only changed lines in a diff/patch rather than full files.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync } from "fs";
|
|
5
|
+
import { execSync } from "child_process";
|
|
6
|
+
// ─── Patterns ──────────────────────────────────────────────────────────────
|
|
7
|
+
const DIFF_PATTERNS = [
|
|
8
|
+
{
|
|
9
|
+
name: "hardcoded-secret",
|
|
10
|
+
severity: "critical",
|
|
11
|
+
regex: /(?:password|secret|api_key|token)\s*[:=]\s*["'][^"']{8,}/i,
|
|
12
|
+
},
|
|
13
|
+
{ name: "eval-usage", severity: "critical", regex: /\beval\s*\(/ },
|
|
14
|
+
{ name: "sql-concat", severity: "critical", regex: /(?:query|execute)\s*\(\s*["'`].*\+/ },
|
|
15
|
+
{ name: "xss-risk", severity: "high", regex: /innerHTML\s*=|document\.write\s*\(/ },
|
|
16
|
+
{ name: "command-injection", severity: "critical", regex: /exec(?:Sync)?\s*\(\s*`[^`]*\$\{/ },
|
|
17
|
+
{ name: "empty-catch", severity: "medium", regex: /catch\s*\([^)]*\)\s*\{\s*\}/ },
|
|
18
|
+
{ name: "any-type", severity: "medium", regex: /:\s*any\b/ },
|
|
19
|
+
{ name: "unsafe-regex", severity: "high", regex: /new\s+RegExp\s*\([^)]*\+/ },
|
|
20
|
+
{ name: "missing-await", severity: "high", regex: /(?:return|=)\s+(?!await\b)[a-zA-Z]+\.(then|catch)\s*\(/ },
|
|
21
|
+
{ name: "deprecated-api", severity: "medium", regex: /new\s+Buffer\s*\(|\.substr\s*\(/ },
|
|
22
|
+
{ name: "console-log", severity: "low", regex: /console\.log\s*\(/ },
|
|
23
|
+
{ name: "todo-fixme", severity: "low", regex: /\/\/\s*(?:TODO|FIXME|HACK)\b/i },
|
|
24
|
+
];
|
|
25
|
+
// ─── Diff parsing ──────────────────────────────────────────────────────────
|
|
26
|
+
function parseDiff(diffText) {
|
|
27
|
+
const hunks = [];
|
|
28
|
+
const lines = diffText.split("\n");
|
|
29
|
+
let currentFile = "";
|
|
30
|
+
let hunkStart = 0;
|
|
31
|
+
let hunkLines = [];
|
|
32
|
+
let lineNum = 0;
|
|
33
|
+
for (const line of lines) {
|
|
34
|
+
// Detect file header
|
|
35
|
+
const fileMatch = /^\+\+\+\s+b\/(.+)/.exec(line);
|
|
36
|
+
if (fileMatch) {
|
|
37
|
+
currentFile = fileMatch[1];
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
// Detect hunk header
|
|
41
|
+
const hunkMatch = /^@@\s+-\d+(?:,\d+)?\s+\+(\d+)(?:,(\d+))?\s+@@/.exec(line);
|
|
42
|
+
if (hunkMatch) {
|
|
43
|
+
// Save previous hunk
|
|
44
|
+
if (hunkLines.length > 0 && currentFile) {
|
|
45
|
+
hunks.push({
|
|
46
|
+
file: currentFile,
|
|
47
|
+
startLine: hunkStart,
|
|
48
|
+
lineCount: hunkLines.length,
|
|
49
|
+
content: hunkLines.join("\n"),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
hunkStart = parseInt(hunkMatch[1], 10);
|
|
53
|
+
lineNum = hunkStart;
|
|
54
|
+
hunkLines = [];
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// Only analyze added lines (starting with +)
|
|
58
|
+
if (line.startsWith("+") && !line.startsWith("+++")) {
|
|
59
|
+
hunkLines.push(`${lineNum}:${line.slice(1)}`);
|
|
60
|
+
lineNum++;
|
|
61
|
+
}
|
|
62
|
+
else if (!line.startsWith("-")) {
|
|
63
|
+
lineNum++;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Save last hunk
|
|
67
|
+
if (hunkLines.length > 0 && currentFile) {
|
|
68
|
+
hunks.push({ file: currentFile, startLine: hunkStart, lineCount: hunkLines.length, content: hunkLines.join("\n") });
|
|
69
|
+
}
|
|
70
|
+
return hunks;
|
|
71
|
+
}
|
|
72
|
+
function analyzeHunks(hunks) {
|
|
73
|
+
const findings = [];
|
|
74
|
+
let totalLines = 0;
|
|
75
|
+
for (const hunk of hunks) {
|
|
76
|
+
const lines = hunk.content.split("\n");
|
|
77
|
+
totalLines += lines.length;
|
|
78
|
+
for (const line of lines) {
|
|
79
|
+
const lineMatch = /^(\d+):(.*)/.exec(line);
|
|
80
|
+
if (!lineMatch)
|
|
81
|
+
continue;
|
|
82
|
+
const lineNum = parseInt(lineMatch[1], 10);
|
|
83
|
+
const lineContent = lineMatch[2];
|
|
84
|
+
for (const pat of DIFF_PATTERNS) {
|
|
85
|
+
if (pat.regex.test(lineContent)) {
|
|
86
|
+
findings.push({
|
|
87
|
+
pattern: pat.name,
|
|
88
|
+
severity: pat.severity,
|
|
89
|
+
file: hunk.file,
|
|
90
|
+
line: lineNum,
|
|
91
|
+
content: lineContent.trim(),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const counts = { critical: 0, high: 0, medium: 0, low: 0, total: findings.length };
|
|
98
|
+
for (const f of findings) {
|
|
99
|
+
if (f.severity === "critical")
|
|
100
|
+
counts.critical++;
|
|
101
|
+
else if (f.severity === "high")
|
|
102
|
+
counts.high++;
|
|
103
|
+
else if (f.severity === "medium")
|
|
104
|
+
counts.medium++;
|
|
105
|
+
else
|
|
106
|
+
counts.low++;
|
|
107
|
+
}
|
|
108
|
+
return { hunksAnalyzed: hunks.length, linesAnalyzed: totalLines, findings, counts };
|
|
109
|
+
}
|
|
110
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
111
|
+
export function runDiffReview(argv) {
|
|
112
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
113
|
+
console.log(`
|
|
114
|
+
judges diff-review — Review only changed lines in a diff
|
|
115
|
+
|
|
116
|
+
Usage:
|
|
117
|
+
judges diff-review Review staged changes (git diff --cached)
|
|
118
|
+
judges diff-review --base main Review changes vs a branch
|
|
119
|
+
judges diff-review --file patch.diff Review a diff file
|
|
120
|
+
judges diff-review --format json JSON output
|
|
121
|
+
|
|
122
|
+
Options:
|
|
123
|
+
--base <ref> Compare against branch/commit (default: staged changes)
|
|
124
|
+
--file <path> Read diff from a file instead of git
|
|
125
|
+
--format json JSON output
|
|
126
|
+
--help, -h Show this help
|
|
127
|
+
|
|
128
|
+
Focuses review effort on only the changed lines, providing faster and
|
|
129
|
+
more relevant feedback for pull requests and commits.
|
|
130
|
+
`);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
134
|
+
const base = argv.find((_a, i) => argv[i - 1] === "--base");
|
|
135
|
+
const diffFile = argv.find((_a, i) => argv[i - 1] === "--file");
|
|
136
|
+
let diffText;
|
|
137
|
+
if (diffFile) {
|
|
138
|
+
try {
|
|
139
|
+
diffText = readFileSync(diffFile, "utf-8");
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
console.error(`Error: Cannot read diff file '${diffFile}'.`);
|
|
143
|
+
process.exitCode = 1;
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
try {
|
|
149
|
+
const gitCmd = base ? `git diff ${base}...HEAD` : "git diff --cached";
|
|
150
|
+
diffText = execSync(gitCmd, {
|
|
151
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
152
|
+
timeout: 15000,
|
|
153
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
154
|
+
}).toString();
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
console.error("Error: Failed to get git diff. Are you in a git repository?");
|
|
158
|
+
process.exitCode = 1;
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (!diffText.trim()) {
|
|
163
|
+
console.log("No changes to review.");
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const hunks = parseDiff(diffText);
|
|
167
|
+
const result = analyzeHunks(hunks);
|
|
168
|
+
if (format === "json") {
|
|
169
|
+
console.log(JSON.stringify(result, null, 2));
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
console.log(`\n Diff Review\n ─────────────────────────────`);
|
|
173
|
+
console.log(` Hunks analyzed: ${result.hunksAnalyzed}`);
|
|
174
|
+
console.log(` Lines analyzed: ${result.linesAnalyzed}`);
|
|
175
|
+
console.log(` Findings: ${result.counts.total} (C:${result.counts.critical} H:${result.counts.high} M:${result.counts.medium} L:${result.counts.low})`);
|
|
176
|
+
if (result.findings.length > 0) {
|
|
177
|
+
console.log("\n Findings in changed code:");
|
|
178
|
+
for (const f of result.findings.slice(0, 30)) {
|
|
179
|
+
const sevIcon = f.severity === "critical" ? "🔴" : f.severity === "high" ? "🟠" : f.severity === "medium" ? "🟡" : "🔵";
|
|
180
|
+
console.log(` ${sevIcon} [${f.severity}] ${f.pattern} — ${f.file}:${f.line}`);
|
|
181
|
+
}
|
|
182
|
+
if (result.findings.length > 30) {
|
|
183
|
+
console.log(` ... and ${result.findings.length - 30} more`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
console.log("\n ✅ No issues found in changed code.");
|
|
188
|
+
}
|
|
189
|
+
console.log();
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=diff-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-review.js","sourceRoot":"","sources":["../../src/commands/diff-review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-chain.d.ts","sourceRoot":"","sources":["../../src/commands/evidence-chain.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqRH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA2ErD"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence-chain — traversable reasoning chain showing exactly why each finding was raised.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, readdirSync, statSync } from "fs";
|
|
5
|
+
import { join, extname, relative } from "path";
|
|
6
|
+
// ─── File Collection ────────────────────────────────────────────────────────
|
|
7
|
+
const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".py", ".java", ".go", ".cs"]);
|
|
8
|
+
function collectFiles(dir, max = 300) {
|
|
9
|
+
const files = [];
|
|
10
|
+
function walk(d) {
|
|
11
|
+
if (files.length >= max)
|
|
12
|
+
return;
|
|
13
|
+
let entries;
|
|
14
|
+
try {
|
|
15
|
+
entries = readdirSync(d);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
for (const e of entries) {
|
|
21
|
+
if (files.length >= max)
|
|
22
|
+
return;
|
|
23
|
+
if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build")
|
|
24
|
+
continue;
|
|
25
|
+
const full = join(d, e);
|
|
26
|
+
try {
|
|
27
|
+
if (statSync(full).isDirectory())
|
|
28
|
+
walk(full);
|
|
29
|
+
else if (CODE_EXTS.has(extname(full)))
|
|
30
|
+
files.push(full);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
/* skip */
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
walk(dir);
|
|
38
|
+
return files;
|
|
39
|
+
}
|
|
40
|
+
const KNOWN_PATTERNS = [
|
|
41
|
+
{
|
|
42
|
+
id: "EC-INJECT-01",
|
|
43
|
+
regex: /\beval\s*\(/,
|
|
44
|
+
title: "eval() code injection",
|
|
45
|
+
severity: "critical",
|
|
46
|
+
chain: [
|
|
47
|
+
{ action: "Pattern match", detail: "Regex /\\beval\\s*\\(/ matched source line", result: "eval() call detected" },
|
|
48
|
+
{
|
|
49
|
+
action: "Context analysis",
|
|
50
|
+
detail: "Checked if input is user-controlled or static",
|
|
51
|
+
result: "Input source may be dynamic",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
action: "Scope check",
|
|
55
|
+
detail: "Verified eval is in application code, not test/build",
|
|
56
|
+
result: "Found in application scope",
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
action: "Vulnerability classification",
|
|
60
|
+
detail: "CWE-94 (Code Injection), OWASP A03:2021",
|
|
61
|
+
result: "Critical — arbitrary code execution",
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: "EC-SECRET-01",
|
|
67
|
+
regex: /(?:password|secret|api[_-]?key)\s*[:=]\s*['"][^'"]{4,}['"]/,
|
|
68
|
+
title: "Hardcoded credential",
|
|
69
|
+
severity: "critical",
|
|
70
|
+
chain: [
|
|
71
|
+
{
|
|
72
|
+
action: "Pattern match",
|
|
73
|
+
detail: "Credential-like assignment detected",
|
|
74
|
+
result: "Value assigned to sensitive-named variable",
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
action: "Value analysis",
|
|
78
|
+
detail: "Checked if value is placeholder (test, example, TODO)",
|
|
79
|
+
result: "Value appears to be a real credential",
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
action: "Scope check",
|
|
83
|
+
detail: "Verified location is not test fixture or example file",
|
|
84
|
+
result: "Found in application code",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
action: "Vulnerability classification",
|
|
88
|
+
detail: "CWE-798 (Hardcoded Credentials), OWASP A07:2021",
|
|
89
|
+
result: "Critical — credential exposure in source",
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: "EC-XSS-01",
|
|
95
|
+
regex: /\.innerHTML\s*=/,
|
|
96
|
+
title: "XSS via innerHTML",
|
|
97
|
+
severity: "high",
|
|
98
|
+
chain: [
|
|
99
|
+
{
|
|
100
|
+
action: "Pattern match",
|
|
101
|
+
detail: "innerHTML assignment detected",
|
|
102
|
+
result: "DOM manipulation without sanitization",
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
action: "Input trace",
|
|
106
|
+
detail: "Checked if assigned value originates from user input",
|
|
107
|
+
result: "Input source requires manual verification",
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
action: "Sanitization check",
|
|
111
|
+
detail: "Searched for DOMPurify, sanitize-html, or encoding calls",
|
|
112
|
+
result: "No sanitization found in scope",
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
action: "Vulnerability classification",
|
|
116
|
+
detail: "CWE-79 (Cross-site Scripting), OWASP A03:2021",
|
|
117
|
+
result: "High — potential stored/reflected XSS",
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: "EC-SQLI-01",
|
|
123
|
+
regex: /(?:query|execute)\s*\([^)]*\+\s*(?:req|input|user|param)/,
|
|
124
|
+
title: "SQL injection via concatenation",
|
|
125
|
+
severity: "critical",
|
|
126
|
+
chain: [
|
|
127
|
+
{
|
|
128
|
+
action: "Pattern match",
|
|
129
|
+
detail: "String concatenation in SQL query detected",
|
|
130
|
+
result: "User input concatenated into query string",
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
action: "Parameterization check",
|
|
134
|
+
detail: "Looked for prepared statements or parameterized queries",
|
|
135
|
+
result: "No parameterization found",
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
action: "Input validation check",
|
|
139
|
+
detail: "Searched for input sanitization before query",
|
|
140
|
+
result: "No validation at call site",
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
action: "Vulnerability classification",
|
|
144
|
+
detail: "CWE-89 (SQL Injection), OWASP A03:2021",
|
|
145
|
+
result: "Critical — full database compromise possible",
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
id: "EC-ERR-01",
|
|
151
|
+
regex: /catch\s*\(\s*\w*\s*\)\s*\{\s*\}/,
|
|
152
|
+
title: "Empty catch block",
|
|
153
|
+
severity: "medium",
|
|
154
|
+
chain: [
|
|
155
|
+
{
|
|
156
|
+
action: "Pattern match",
|
|
157
|
+
detail: "Empty catch block detected via regex",
|
|
158
|
+
result: "Exception caught and silently discarded",
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
action: "Context analysis",
|
|
162
|
+
detail: "Checked surrounding code for error handling",
|
|
163
|
+
result: "No logging, rethrow, or fallback in catch",
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
action: "Impact assessment",
|
|
167
|
+
detail: "Silent error swallowing can mask bugs and security issues",
|
|
168
|
+
result: "Medium — errors hidden from monitoring",
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
id: "EC-DEPR-01",
|
|
174
|
+
regex: /new\s+Buffer\s*\(/,
|
|
175
|
+
title: "Deprecated new Buffer()",
|
|
176
|
+
severity: "high",
|
|
177
|
+
chain: [
|
|
178
|
+
{ action: "Pattern match", detail: "new Buffer() constructor detected", result: "Deprecated API usage found" },
|
|
179
|
+
{
|
|
180
|
+
action: "Security analysis",
|
|
181
|
+
detail: "new Buffer(n) may expose uninitialized memory",
|
|
182
|
+
result: "Potential information leak",
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
action: "Modern alternative",
|
|
186
|
+
detail: "Buffer.from(), Buffer.alloc(), Buffer.allocUnsafe()",
|
|
187
|
+
result: "High — use safe Buffer APIs",
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
},
|
|
191
|
+
];
|
|
192
|
+
// ─── Analysis ───────────────────────────────────────────────────────────────
|
|
193
|
+
function analyzeFile(filepath, baseDir) {
|
|
194
|
+
const results = [];
|
|
195
|
+
let content;
|
|
196
|
+
try {
|
|
197
|
+
content = readFileSync(filepath, "utf-8");
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return results;
|
|
201
|
+
}
|
|
202
|
+
const lines = content.split("\n");
|
|
203
|
+
const rel = relative(baseDir, filepath);
|
|
204
|
+
for (let i = 0; i < lines.length; i++) {
|
|
205
|
+
const line = lines[i];
|
|
206
|
+
const trimmed = line.trim();
|
|
207
|
+
if (trimmed.startsWith("//") || trimmed.startsWith("*") || trimmed.startsWith("/*"))
|
|
208
|
+
continue;
|
|
209
|
+
for (const pattern of KNOWN_PATTERNS) {
|
|
210
|
+
if (pattern.regex.test(line)) {
|
|
211
|
+
// Count similar patterns across file
|
|
212
|
+
let similarCount = 0;
|
|
213
|
+
for (let j = 0; j < lines.length; j++) {
|
|
214
|
+
if (j !== i && pattern.regex.test(lines[j]))
|
|
215
|
+
similarCount++;
|
|
216
|
+
}
|
|
217
|
+
const contextStart = Math.max(0, i - 2);
|
|
218
|
+
const contextEnd = Math.min(lines.length, i + 3);
|
|
219
|
+
const codeContext = lines.slice(contextStart, contextEnd).join("\n");
|
|
220
|
+
const chain = pattern.chain.map((c, idx) => ({
|
|
221
|
+
step: idx + 1,
|
|
222
|
+
action: c.action,
|
|
223
|
+
detail: c.detail,
|
|
224
|
+
result: c.result,
|
|
225
|
+
}));
|
|
226
|
+
results.push({
|
|
227
|
+
findingId: `${pattern.id}@${rel}:${i + 1}`,
|
|
228
|
+
file: rel,
|
|
229
|
+
line: i + 1,
|
|
230
|
+
title: pattern.title,
|
|
231
|
+
severity: pattern.severity,
|
|
232
|
+
chain,
|
|
233
|
+
codeContext,
|
|
234
|
+
similarPatterns: similarCount,
|
|
235
|
+
confidenceScore: Math.min(95, 70 + chain.length * 5 + (similarCount > 0 ? 5 : 0)),
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return results;
|
|
241
|
+
}
|
|
242
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
243
|
+
export function runEvidenceChain(argv) {
|
|
244
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
245
|
+
console.log(`
|
|
246
|
+
judges evidence-chain — Traversable reasoning chain for findings
|
|
247
|
+
|
|
248
|
+
Usage:
|
|
249
|
+
judges evidence-chain [dir]
|
|
250
|
+
judges evidence-chain src/ --format json
|
|
251
|
+
judges evidence-chain src/ --finding EC-INJECT-01
|
|
252
|
+
|
|
253
|
+
Options:
|
|
254
|
+
[dir] Directory to scan (default: .)
|
|
255
|
+
--finding <id> Filter to specific finding ID
|
|
256
|
+
--format json JSON output
|
|
257
|
+
--help, -h Show this help
|
|
258
|
+
|
|
259
|
+
For any finding, produces: pattern matched → context analyzed →
|
|
260
|
+
confidence calibrated → CWE/OWASP classification → final reasoning.
|
|
261
|
+
`);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
265
|
+
const findingFilter = argv.find((_a, i) => argv[i - 1] === "--finding");
|
|
266
|
+
const dir = argv.find((a) => !a.startsWith("-") &&
|
|
267
|
+
argv.indexOf(a) > 0 &&
|
|
268
|
+
argv[argv.indexOf(a) - 1] !== "--format" &&
|
|
269
|
+
argv[argv.indexOf(a) - 1] !== "--finding") || ".";
|
|
270
|
+
const files = collectFiles(dir);
|
|
271
|
+
let allResults = [];
|
|
272
|
+
for (const f of files)
|
|
273
|
+
allResults.push(...analyzeFile(f, dir));
|
|
274
|
+
if (findingFilter) {
|
|
275
|
+
allResults = allResults.filter((r) => r.findingId.includes(findingFilter));
|
|
276
|
+
}
|
|
277
|
+
if (format === "json") {
|
|
278
|
+
console.log(JSON.stringify({ results: allResults, count: allResults.length, timestamp: new Date().toISOString() }, null, 2));
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
console.log(`\n Evidence Chain: ${allResults.length} finding(s)\n ─────────────────────────────`);
|
|
282
|
+
if (allResults.length === 0) {
|
|
283
|
+
console.log(" No findings to trace.\n");
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
for (const result of allResults.slice(0, 10)) {
|
|
287
|
+
const icon = result.severity === "critical"
|
|
288
|
+
? "🔴"
|
|
289
|
+
: result.severity === "high"
|
|
290
|
+
? "🟠"
|
|
291
|
+
: result.severity === "medium"
|
|
292
|
+
? "🟡"
|
|
293
|
+
: "🔵";
|
|
294
|
+
console.log(`\n ${icon} ${result.title} [${result.findingId}]`);
|
|
295
|
+
console.log(` ${result.file}:${result.line} (confidence: ${result.confidenceScore}%)`);
|
|
296
|
+
console.log(` Reasoning chain:`);
|
|
297
|
+
for (const step of result.chain) {
|
|
298
|
+
console.log(` ${step.step}. ${step.action}: ${step.detail}`);
|
|
299
|
+
console.log(` → ${step.result}`);
|
|
300
|
+
}
|
|
301
|
+
if (result.similarPatterns > 0) {
|
|
302
|
+
console.log(` ℹ️ ${result.similarPatterns} similar pattern(s) found in same file`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
if (allResults.length > 10)
|
|
306
|
+
console.log(`\n ... and ${allResults.length - 10} more findings`);
|
|
307
|
+
console.log();
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=evidence-chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-chain.js","sourceRoot":"","sources":["../../src/commands/evidence-chain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-area.d.ts","sourceRoot":"","sources":["../../src/commands/focus-area.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsKH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoEjD"}
|