@kevinrabun/judges 3.60.0 → 3.61.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 (38) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +56 -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/blame-review.d.ts +5 -0
  10. package/dist/commands/blame-review.d.ts.map +1 -0
  11. package/dist/commands/blame-review.js +270 -0
  12. package/dist/commands/blame-review.js.map +1 -0
  13. package/dist/commands/evidence-chain.d.ts +5 -0
  14. package/dist/commands/evidence-chain.d.ts.map +1 -0
  15. package/dist/commands/evidence-chain.js +310 -0
  16. package/dist/commands/evidence-chain.js.map +1 -0
  17. package/dist/commands/merge-verdict.d.ts +5 -0
  18. package/dist/commands/merge-verdict.d.ts.map +1 -0
  19. package/dist/commands/merge-verdict.js +288 -0
  20. package/dist/commands/merge-verdict.js.map +1 -0
  21. package/dist/commands/quick-check.d.ts +5 -0
  22. package/dist/commands/quick-check.d.ts.map +1 -0
  23. package/dist/commands/quick-check.js +174 -0
  24. package/dist/commands/quick-check.js.map +1 -0
  25. package/dist/commands/review-contract.d.ts +5 -0
  26. package/dist/commands/review-contract.d.ts.map +1 -0
  27. package/dist/commands/review-contract.js +200 -0
  28. package/dist/commands/review-contract.js.map +1 -0
  29. package/dist/commands/review-handoff.d.ts +5 -0
  30. package/dist/commands/review-handoff.d.ts.map +1 -0
  31. package/dist/commands/review-handoff.js +209 -0
  32. package/dist/commands/review-handoff.js.map +1 -0
  33. package/dist/commands/review-receipt.d.ts +5 -0
  34. package/dist/commands/review-receipt.d.ts.map +1 -0
  35. package/dist/commands/review-receipt.js +221 -0
  36. package/dist/commands/review-receipt.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,248 @@
1
+ /**
2
+ * AI-provenance — detect and annotate which code regions were AI-generated.
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", ".rs", ".rb"]);
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 AI_SIGNALS = [
41
+ // Explicit AI markers
42
+ {
43
+ regex: /(?:Generated|Created|Written)\s+(?:by|with|using)\s+(?:Copilot|ChatGPT|GPT-4|Claude|Gemini|Cursor|Codewhisperer|AI|LLM)/i,
44
+ signal: "AI attribution comment",
45
+ source: "comment-declared",
46
+ weight: 90,
47
+ },
48
+ {
49
+ regex: /(?:copilot|ai-generated|machine-generated|auto-generated)/i,
50
+ signal: "AI tag/marker",
51
+ source: "metadata-tag",
52
+ weight: 85,
53
+ },
54
+ {
55
+ regex: /@(?:generated|auto-generated|ai-generated)/,
56
+ signal: "Generated annotation",
57
+ source: "annotation",
58
+ weight: 80,
59
+ },
60
+ // Common AI code patterns
61
+ {
62
+ regex: /\/\/\s*(?:TODO|FIXME):\s*(?:implement|add|replace|update)\s+(?:this|here|the)/i,
63
+ signal: "Generic placeholder TODO",
64
+ source: "pattern-heuristic",
65
+ weight: 30,
66
+ },
67
+ {
68
+ regex: /\/\/\s*(?:This|The)\s+(?:function|method|class|module)\s+(?:is|does|handles|provides)/i,
69
+ signal: "Overly explanatory inline comment",
70
+ source: "style-heuristic",
71
+ weight: 25,
72
+ },
73
+ {
74
+ regex: /\/\*\*\s*\n\s*\*\s+(?:This|The)\s+(?:function|method|class)\s+/m,
75
+ signal: "Verbose JSDoc with article start",
76
+ source: "style-heuristic",
77
+ weight: 20,
78
+ },
79
+ // Structural patterns typical of AI
80
+ {
81
+ regex: /try\s*\{[^}]*\}\s*catch\s*\(\s*(?:error|err|e)\s*\)\s*\{\s*console\.(?:error|log)\s*\(\s*['"](?:Error|Failed|An error)/i,
82
+ signal: "Template error handling",
83
+ source: "pattern-heuristic",
84
+ weight: 25,
85
+ },
86
+ {
87
+ regex: /if\s*\(!.*\)\s*\{\s*throw\s+new\s+Error\s*\(\s*['"].*is required['"]\s*\)/i,
88
+ signal: "Template validation pattern",
89
+ source: "pattern-heuristic",
90
+ weight: 20,
91
+ },
92
+ { regex: /(?:Example|Usage|How to use):/i, signal: "Example-style comments", source: "style-heuristic", weight: 15 },
93
+ ];
94
+ // ─── Analysis ───────────────────────────────────────────────────────────────
95
+ function analyzeFile(filepath, baseDir) {
96
+ const regions = [];
97
+ let content;
98
+ try {
99
+ content = readFileSync(filepath, "utf-8");
100
+ }
101
+ catch {
102
+ return regions;
103
+ }
104
+ const lines = content.split("\n");
105
+ const rel = relative(baseDir, filepath);
106
+ // Track signal hits per line
107
+ const lineSignals = [];
108
+ for (let i = 0; i < lines.length; i++) {
109
+ const line = lines[i];
110
+ const hits = [];
111
+ for (const sig of AI_SIGNALS) {
112
+ if (sig.regex.test(line)) {
113
+ hits.push({ signal: sig.signal, source: sig.source, weight: sig.weight });
114
+ }
115
+ }
116
+ lineSignals.push({
117
+ signals: hits.map((h) => h.signal),
118
+ source: hits.length > 0 ? hits[0].source : "",
119
+ weight: hits.reduce((sum, h) => sum + h.weight, 0),
120
+ });
121
+ }
122
+ // Merge adjacent high-signal lines into regions
123
+ let regionStart = -1;
124
+ let regionWeight = 0;
125
+ let regionSignals = [];
126
+ let regionSource = "";
127
+ for (let i = 0; i <= lines.length; i++) {
128
+ const ls = i < lines.length ? lineSignals[i] : { signals: [], source: "", weight: 0 };
129
+ if (ls.weight > 0) {
130
+ if (regionStart === -1) {
131
+ regionStart = i;
132
+ regionWeight = 0;
133
+ regionSignals = [];
134
+ regionSource = ls.source;
135
+ }
136
+ regionWeight += ls.weight;
137
+ for (const s of ls.signals) {
138
+ if (!regionSignals.includes(s))
139
+ regionSignals.push(s);
140
+ }
141
+ if (ls.source && !regionSource)
142
+ regionSource = ls.source;
143
+ }
144
+ else if (regionStart !== -1) {
145
+ // Gap — check if we should merge (gap of 1-3 lines)
146
+ const lookAhead = lineSignals.slice(i, Math.min(i + 4, lines.length));
147
+ const hasMore = lookAhead.some((la) => la.weight > 0);
148
+ if (!hasMore || i - regionStart > 50) {
149
+ // Close region
150
+ const confidence = Math.min(95, Math.round((regionWeight / Math.max(1, i - regionStart)) * 2));
151
+ if (confidence >= 15) {
152
+ regions.push({
153
+ file: rel,
154
+ lineStart: regionStart + 1,
155
+ lineEnd: i,
156
+ confidence,
157
+ signals: regionSignals,
158
+ probableSource: regionSource || "unknown",
159
+ });
160
+ }
161
+ regionStart = -1;
162
+ regionSignals = [];
163
+ regionSource = "";
164
+ }
165
+ }
166
+ }
167
+ return regions;
168
+ }
169
+ // ─── CLI ────────────────────────────────────────────────────────────────────
170
+ export function runAiProvenance(argv) {
171
+ if (argv.includes("--help") || argv.includes("-h")) {
172
+ console.log(`
173
+ judges ai-provenance — Detect and annotate AI-generated code regions
174
+
175
+ Usage:
176
+ judges ai-provenance [dir]
177
+ judges ai-provenance src/ --format json
178
+
179
+ Options:
180
+ [dir] Directory to scan (default: .)
181
+ --min-confidence <n> Minimum confidence % to report (default: 20)
182
+ --format json JSON output
183
+ --help, -h Show this help
184
+
185
+ Identifies AI-generated code regions using: attribution comments,
186
+ metadata tags, coding style heuristics, structural patterns, and
187
+ template signatures. Outputs provenance annotations for compliance.
188
+
189
+ Note: All analysis is local — no data is sent externally.
190
+ `);
191
+ return;
192
+ }
193
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
194
+ const minConfStr = argv.find((_a, i) => argv[i - 1] === "--min-confidence");
195
+ const minConfidence = minConfStr ? parseInt(minConfStr, 10) : 20;
196
+ const dir = argv.find((a) => !a.startsWith("-") &&
197
+ argv.indexOf(a) > 0 &&
198
+ argv[argv.indexOf(a) - 1] !== "--format" &&
199
+ argv[argv.indexOf(a) - 1] !== "--min-confidence") || ".";
200
+ const files = collectFiles(dir);
201
+ const allRegions = [];
202
+ let totalLines = 0;
203
+ for (const f of files) {
204
+ try {
205
+ const content = readFileSync(f, "utf-8");
206
+ totalLines += content.split("\n").length;
207
+ }
208
+ catch {
209
+ /* skip */
210
+ }
211
+ allRegions.push(...analyzeFile(f, dir));
212
+ }
213
+ const filtered = allRegions.filter((r) => r.confidence >= minConfidence);
214
+ const aiLines = filtered.reduce((sum, r) => sum + (r.lineEnd - r.lineStart + 1), 0);
215
+ const filesWithAi = new Set(filtered.map((r) => r.file)).size;
216
+ const aiPct = totalLines > 0 ? Math.round((aiLines / totalLines) * 1000) / 10 : 0;
217
+ const report = {
218
+ totalFiles: files.length,
219
+ filesWithAiCode: filesWithAi,
220
+ aiRegions: filtered,
221
+ aiLinePercentage: aiPct,
222
+ totalLines,
223
+ aiLines,
224
+ };
225
+ if (format === "json") {
226
+ console.log(JSON.stringify({ ...report, timestamp: new Date().toISOString() }, null, 2));
227
+ }
228
+ else {
229
+ console.log(`\n AI Provenance Report\n ─────────────────────────────`);
230
+ console.log(` Files scanned: ${report.totalFiles}`);
231
+ console.log(` Files with AI code: ${report.filesWithAiCode}`);
232
+ console.log(` AI-attributed lines: ${report.aiLines}/${report.totalLines} (${report.aiLinePercentage}%)\n`);
233
+ if (filtered.length === 0) {
234
+ console.log(" No AI-generated code regions detected.\n");
235
+ return;
236
+ }
237
+ for (const region of filtered.slice(0, 20)) {
238
+ const confIcon = region.confidence >= 70 ? "🔴" : region.confidence >= 40 ? "🟡" : "🔵";
239
+ console.log(` ${confIcon} ${region.file}:${region.lineStart}-${region.lineEnd} (${region.confidence}% confidence)`);
240
+ console.log(` Source: ${region.probableSource}`);
241
+ console.log(` Signals: ${region.signals.join(", ")}`);
242
+ }
243
+ if (filtered.length > 20)
244
+ console.log(`\n ... and ${filtered.length - 20} more regions`);
245
+ console.log();
246
+ }
247
+ }
248
+ //# sourceMappingURL=ai-provenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-provenance.js","sourceRoot":"","sources":["../../src/commands/ai-provenance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Blame-review — git-blame integrated historical finding attribution.
3
+ */
4
+ export declare function runBlameReview(argv: string[]): void;
5
+ //# sourceMappingURL=blame-review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blame-review.d.ts","sourceRoot":"","sources":["../../src/commands/blame-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4OH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4FnD"}
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Blame-review — git-blame integrated historical finding attribution.
3
+ */
4
+ import { execSync } from "child_process";
5
+ import { readFileSync, readdirSync, statSync } from "fs";
6
+ import { join, extname } from "path";
7
+ // ─── Known patterns to detect ──────────────────────────────────────────────
8
+ const PATTERNS = [
9
+ {
10
+ name: "hardcoded-secret",
11
+ severity: "critical",
12
+ regex: /(?:password|secret|api_key|token)\s*[:=]\s*["'][^"']{8,}/i,
13
+ },
14
+ { name: "eval-usage", severity: "critical", regex: /\beval\s*\(/ },
15
+ { name: "sql-concat", severity: "critical", regex: /(?:query|execute)\s*\(\s*["'`].*\+/ },
16
+ { name: "empty-catch", severity: "medium", regex: /catch\s*\([^)]*\)\s*\{\s*\}/ },
17
+ { name: "console-log", severity: "low", regex: /console\.log\s*\(/ },
18
+ { name: "todo-fixme", severity: "low", regex: /\/\/\s*(?:TODO|FIXME|HACK|XXX)\b/i },
19
+ { name: "any-type", severity: "medium", regex: /:\s*any\b/ },
20
+ { name: "deprecated-api", severity: "medium", regex: /new\s+Buffer\s*\(|\.substr\s*\(|\.addListener\s*\(/i },
21
+ { name: "unsafe-regex", severity: "high", regex: /new\s+RegExp\s*\([^)]*\+/ },
22
+ { name: "missing-await", severity: "high", regex: /(?:return|=)\s+(?!await\b)[a-zA-Z]+\.(then|catch)\s*\(/ },
23
+ ];
24
+ // ─── Helpers ────────────────────────────────────────────────────────────────
25
+ function isGitRepo() {
26
+ try {
27
+ execSync("git rev-parse --is-inside-work-tree", { stdio: "pipe", timeout: 5000 });
28
+ return true;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ function gitBlameFile(filePath, since) {
35
+ try {
36
+ const sinceArg = since ? ` --since="${since}"` : "";
37
+ const out = execSync(`git blame --line-porcelain${sinceArg} -- "${filePath}"`, {
38
+ stdio: ["pipe", "pipe", "pipe"],
39
+ timeout: 15000,
40
+ maxBuffer: 10 * 1024 * 1024,
41
+ }).toString();
42
+ const entries = [];
43
+ const lines = out.split("\n");
44
+ let commit = "";
45
+ let author = "";
46
+ let date = "";
47
+ let lineNum = 0;
48
+ for (const line of lines) {
49
+ const commitMatch = /^([0-9a-f]{40})\s+\d+\s+(\d+)/.exec(line);
50
+ if (commitMatch) {
51
+ commit = commitMatch[1];
52
+ lineNum = parseInt(commitMatch[2], 10);
53
+ continue;
54
+ }
55
+ if (line.startsWith("author ")) {
56
+ author = line.slice(7);
57
+ continue;
58
+ }
59
+ if (line.startsWith("author-time ")) {
60
+ const ts = parseInt(line.slice(12), 10);
61
+ date = new Date(ts * 1000).toISOString().slice(0, 10);
62
+ continue;
63
+ }
64
+ if (line.startsWith("\t")) {
65
+ entries.push({
66
+ commit: commit.slice(0, 8),
67
+ author,
68
+ date,
69
+ lineNumber: lineNum,
70
+ content: line.slice(1),
71
+ });
72
+ }
73
+ }
74
+ return entries;
75
+ }
76
+ catch {
77
+ return [];
78
+ }
79
+ }
80
+ function collectSourceFiles(dir) {
81
+ const exts = new Set([".ts", ".js", ".tsx", ".jsx", ".py", ".java", ".go", ".rs", ".cs", ".rb", ".php"]);
82
+ const files = [];
83
+ const skipDirs = new Set(["node_modules", ".git", "dist", "build", "coverage", ".next"]);
84
+ function walk(d) {
85
+ let entries;
86
+ try {
87
+ entries = readdirSync(d);
88
+ }
89
+ catch {
90
+ return;
91
+ }
92
+ for (const name of entries) {
93
+ if (skipDirs.has(name))
94
+ continue;
95
+ const full = join(d, name);
96
+ try {
97
+ const st = statSync(full);
98
+ if (st.isDirectory())
99
+ walk(full);
100
+ else if (exts.has(extname(name)))
101
+ files.push(full);
102
+ }
103
+ catch {
104
+ // skip inaccessible
105
+ }
106
+ }
107
+ }
108
+ walk(dir);
109
+ return files;
110
+ }
111
+ function daysBetween(dateStr) {
112
+ const then = new Date(dateStr).getTime();
113
+ const now = Date.now();
114
+ return Math.floor((now - then) / (1000 * 60 * 60 * 24));
115
+ }
116
+ // ─── Core analysis ─────────────────────────────────────────────────────────
117
+ function analyzeBlame(files, since, authorFilter) {
118
+ const attributions = [];
119
+ for (const filePath of files) {
120
+ let content;
121
+ try {
122
+ content = readFileSync(filePath, "utf-8");
123
+ }
124
+ catch {
125
+ continue;
126
+ }
127
+ const fileLines = content.split("\n");
128
+ // Quick pattern scan first
129
+ const lineHits = [];
130
+ for (let i = 0; i < fileLines.length; i++) {
131
+ for (const pat of PATTERNS) {
132
+ if (pat.regex.test(fileLines[i])) {
133
+ lineHits.push({ line: i + 1, pattern: pat.name, severity: pat.severity });
134
+ }
135
+ }
136
+ }
137
+ if (lineHits.length === 0)
138
+ continue;
139
+ // Get blame data
140
+ const blameEntries = gitBlameFile(filePath, since);
141
+ const blameByLine = new Map();
142
+ for (const entry of blameEntries) {
143
+ blameByLine.set(entry.lineNumber, entry);
144
+ }
145
+ for (const hit of lineHits) {
146
+ const blame = blameByLine.get(hit.line);
147
+ if (!blame)
148
+ continue;
149
+ if (authorFilter && blame.author !== authorFilter)
150
+ continue;
151
+ attributions.push({
152
+ finding: hit.pattern,
153
+ severity: hit.severity,
154
+ introducedBy: blame.commit,
155
+ author: blame.author,
156
+ date: blame.date,
157
+ lineNumber: hit.line,
158
+ ageInDays: daysBetween(blame.date),
159
+ });
160
+ }
161
+ }
162
+ // Build author summaries
163
+ const authorMap = new Map();
164
+ for (const attr of attributions) {
165
+ let summary = authorMap.get(attr.author);
166
+ if (!summary) {
167
+ summary = { author: attr.author, totalFindings: 0, critical: 0, high: 0, medium: 0, low: 0 };
168
+ authorMap.set(attr.author, summary);
169
+ }
170
+ summary.totalFindings++;
171
+ if (attr.severity === "critical")
172
+ summary.critical++;
173
+ else if (attr.severity === "high")
174
+ summary.high++;
175
+ else if (attr.severity === "medium")
176
+ summary.medium++;
177
+ else
178
+ summary.low++;
179
+ }
180
+ const sorted = [...attributions].sort((a, b) => b.ageInDays - a.ageInDays);
181
+ const totalAge = attributions.reduce((sum, a) => sum + a.ageInDays, 0);
182
+ return {
183
+ totalFindings: attributions.length,
184
+ attributions,
185
+ authorSummaries: [...authorMap.values()].sort((a, b) => b.totalFindings - a.totalFindings),
186
+ oldestFinding: sorted.length > 0 ? sorted[0] : null,
187
+ newestFinding: sorted.length > 0 ? sorted[sorted.length - 1] : null,
188
+ averageAgeDays: attributions.length > 0 ? Math.round(totalAge / attributions.length) : 0,
189
+ };
190
+ }
191
+ // ─── CLI ────────────────────────────────────────────────────────────────────
192
+ export function runBlameReview(argv) {
193
+ if (argv.includes("--help") || argv.includes("-h")) {
194
+ console.log(`
195
+ judges blame-review — Git-blame integrated finding attribution
196
+
197
+ Usage:
198
+ judges blame-review [dir] Analyze current directory
199
+ judges blame-review --since "3 months" Sprint-scoped analysis
200
+ judges blame-review --author "Jane" Author-focused coaching
201
+ judges blame-review --format json JSON output
202
+
203
+ Options:
204
+ [dir] Target directory (default: .)
205
+ --since <period> Only consider commits since period
206
+ --author <name> Filter to specific author
207
+ --format json JSON output
208
+ --help, -h Show this help
209
+
210
+ Attributes findings to the commits and authors that introduced them.
211
+ Shows tech debt accrual timeline and author coaching summaries.
212
+ `);
213
+ return;
214
+ }
215
+ if (!isGitRepo()) {
216
+ console.error("Error: Not inside a git repository.");
217
+ process.exitCode = 1;
218
+ return;
219
+ }
220
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
221
+ const since = argv.find((_a, i) => argv[i - 1] === "--since");
222
+ const authorFilter = argv.find((_a, i) => argv[i - 1] === "--author");
223
+ const dir = argv.find((a) => !a.startsWith("-") &&
224
+ argv.indexOf(a) > 0 &&
225
+ argv[argv.indexOf(a) - 1] !== "--format" &&
226
+ argv[argv.indexOf(a) - 1] !== "--since" &&
227
+ argv[argv.indexOf(a) - 1] !== "--author") || ".";
228
+ const files = collectSourceFiles(dir);
229
+ if (files.length === 0) {
230
+ console.log("No source files found.");
231
+ return;
232
+ }
233
+ const report = analyzeBlame(files, since, authorFilter);
234
+ if (format === "json") {
235
+ console.log(JSON.stringify(report, null, 2));
236
+ return;
237
+ }
238
+ console.log(`\n Blame Review\n ─────────────────────────────`);
239
+ console.log(` Files scanned: ${files.length}`);
240
+ console.log(` Findings attributed: ${report.totalFindings}`);
241
+ console.log(` Average age: ${report.averageAgeDays} days`);
242
+ if (report.oldestFinding) {
243
+ console.log(`\n Oldest finding:`);
244
+ console.log(` ${report.oldestFinding.finding} (${report.oldestFinding.severity}) — ${report.oldestFinding.date} by ${report.oldestFinding.author} (${report.oldestFinding.ageInDays} days)`);
245
+ }
246
+ if (report.newestFinding) {
247
+ console.log(`\n Newest finding:`);
248
+ console.log(` ${report.newestFinding.finding} (${report.newestFinding.severity}) — ${report.newestFinding.date} by ${report.newestFinding.author} (${report.newestFinding.ageInDays} days)`);
249
+ }
250
+ if (report.authorSummaries.length > 0) {
251
+ console.log(`\n Author Attribution:`);
252
+ for (const author of report.authorSummaries) {
253
+ const breakdown = [];
254
+ if (author.critical > 0)
255
+ breakdown.push(`${author.critical} critical`);
256
+ if (author.high > 0)
257
+ breakdown.push(`${author.high} high`);
258
+ if (author.medium > 0)
259
+ breakdown.push(`${author.medium} medium`);
260
+ if (author.low > 0)
261
+ breakdown.push(`${author.low} low`);
262
+ console.log(` ${author.author}: ${author.totalFindings} findings (${breakdown.join(", ")})`);
263
+ }
264
+ }
265
+ if (report.totalFindings === 0) {
266
+ console.log("\n ✅ No pattern-based findings detected in scanned files.");
267
+ }
268
+ console.log();
269
+ }
270
+ //# sourceMappingURL=blame-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blame-review.js","sourceRoot":"","sources":["../../src/commands/blame-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"}