@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.
Files changed (74) hide show
  1. package/CHANGELOG.md +14 -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/ai-provenance.d.ts +5 -0
  6. package/dist/commands/ai-provenance.d.ts.map +1 -0
  7. package/dist/commands/ai-provenance.js +248 -0
  8. package/dist/commands/ai-provenance.js.map +1 -0
  9. package/dist/commands/batch-review.d.ts +5 -0
  10. package/dist/commands/batch-review.d.ts.map +1 -0
  11. package/dist/commands/batch-review.js +181 -0
  12. package/dist/commands/batch-review.js.map +1 -0
  13. package/dist/commands/blame-review.d.ts +5 -0
  14. package/dist/commands/blame-review.d.ts.map +1 -0
  15. package/dist/commands/blame-review.js +270 -0
  16. package/dist/commands/blame-review.js.map +1 -0
  17. package/dist/commands/custom-rule.d.ts +5 -0
  18. package/dist/commands/custom-rule.d.ts.map +1 -0
  19. package/dist/commands/custom-rule.js +211 -0
  20. package/dist/commands/custom-rule.js.map +1 -0
  21. package/dist/commands/diff-review.d.ts +5 -0
  22. package/dist/commands/diff-review.d.ts.map +1 -0
  23. package/dist/commands/diff-review.js +191 -0
  24. package/dist/commands/diff-review.js.map +1 -0
  25. package/dist/commands/evidence-chain.d.ts +5 -0
  26. package/dist/commands/evidence-chain.d.ts.map +1 -0
  27. package/dist/commands/evidence-chain.js +310 -0
  28. package/dist/commands/evidence-chain.js.map +1 -0
  29. package/dist/commands/focus-area.d.ts +6 -0
  30. package/dist/commands/focus-area.d.ts.map +1 -0
  31. package/dist/commands/focus-area.js +193 -0
  32. package/dist/commands/focus-area.js.map +1 -0
  33. package/dist/commands/merge-verdict.d.ts +5 -0
  34. package/dist/commands/merge-verdict.d.ts.map +1 -0
  35. package/dist/commands/merge-verdict.js +288 -0
  36. package/dist/commands/merge-verdict.js.map +1 -0
  37. package/dist/commands/quick-check.d.ts +5 -0
  38. package/dist/commands/quick-check.d.ts.map +1 -0
  39. package/dist/commands/quick-check.js +174 -0
  40. package/dist/commands/quick-check.js.map +1 -0
  41. package/dist/commands/review-compare.d.ts +5 -0
  42. package/dist/commands/review-compare.d.ts.map +1 -0
  43. package/dist/commands/review-compare.js +201 -0
  44. package/dist/commands/review-compare.js.map +1 -0
  45. package/dist/commands/review-contract.d.ts +5 -0
  46. package/dist/commands/review-contract.d.ts.map +1 -0
  47. package/dist/commands/review-contract.js +200 -0
  48. package/dist/commands/review-contract.js.map +1 -0
  49. package/dist/commands/review-explain.d.ts +6 -0
  50. package/dist/commands/review-explain.d.ts.map +1 -0
  51. package/dist/commands/review-explain.js +195 -0
  52. package/dist/commands/review-explain.js.map +1 -0
  53. package/dist/commands/review-gate.d.ts +5 -0
  54. package/dist/commands/review-gate.d.ts.map +1 -0
  55. package/dist/commands/review-gate.js +213 -0
  56. package/dist/commands/review-gate.js.map +1 -0
  57. package/dist/commands/review-handoff.d.ts +5 -0
  58. package/dist/commands/review-handoff.d.ts.map +1 -0
  59. package/dist/commands/review-handoff.js +209 -0
  60. package/dist/commands/review-handoff.js.map +1 -0
  61. package/dist/commands/review-receipt.d.ts +5 -0
  62. package/dist/commands/review-receipt.d.ts.map +1 -0
  63. package/dist/commands/review-receipt.js +221 -0
  64. package/dist/commands/review-receipt.js.map +1 -0
  65. package/dist/commands/severity-tune.d.ts +5 -0
  66. package/dist/commands/severity-tune.d.ts.map +1 -0
  67. package/dist/commands/severity-tune.js +209 -0
  68. package/dist/commands/severity-tune.js.map +1 -0
  69. package/dist/commands/trend-report.d.ts +5 -0
  70. package/dist/commands/trend-report.d.ts.map +1 -0
  71. package/dist/commands/trend-report.js +149 -0
  72. package/dist/commands/trend-report.js.map +1 -0
  73. package/package.json +1 -1
  74. 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,5 @@
1
+ /**
2
+ * Evidence-chain — traversable reasoning chain showing exactly why each finding was raised.
3
+ */
4
+ export declare function runEvidenceChain(argv: string[]): void;
5
+ //# sourceMappingURL=evidence-chain.d.ts.map
@@ -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,6 @@
1
+ /**
2
+ * Focus-area — Identify high-risk areas that need the most review attention
3
+ * based on code complexity and pattern density.
4
+ */
5
+ export declare function runFocusArea(argv: string[]): void;
6
+ //# sourceMappingURL=focus-area.d.ts.map
@@ -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"}