@kevinrabun/judges 3.59.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 (70) hide show
  1. package/CHANGELOG.md +19 -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/adoption-track.d.ts +5 -0
  6. package/dist/commands/adoption-track.d.ts.map +1 -0
  7. package/dist/commands/adoption-track.js +247 -0
  8. package/dist/commands/adoption-track.js.map +1 -0
  9. package/dist/commands/ai-provenance.d.ts +5 -0
  10. package/dist/commands/ai-provenance.d.ts.map +1 -0
  11. package/dist/commands/ai-provenance.js +248 -0
  12. package/dist/commands/ai-provenance.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/context-blind.d.ts +5 -0
  18. package/dist/commands/context-blind.d.ts.map +1 -0
  19. package/dist/commands/context-blind.js +273 -0
  20. package/dist/commands/context-blind.js.map +1 -0
  21. package/dist/commands/evidence-chain.d.ts +5 -0
  22. package/dist/commands/evidence-chain.d.ts.map +1 -0
  23. package/dist/commands/evidence-chain.js +310 -0
  24. package/dist/commands/evidence-chain.js.map +1 -0
  25. package/dist/commands/finding-budget.d.ts +5 -0
  26. package/dist/commands/finding-budget.d.ts.map +1 -0
  27. package/dist/commands/finding-budget.js +233 -0
  28. package/dist/commands/finding-budget.js.map +1 -0
  29. package/dist/commands/hallucination-detect.d.ts +5 -0
  30. package/dist/commands/hallucination-detect.d.ts.map +1 -0
  31. package/dist/commands/hallucination-detect.js +351 -0
  32. package/dist/commands/hallucination-detect.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/over-abstraction.d.ts +5 -0
  38. package/dist/commands/over-abstraction.d.ts.map +1 -0
  39. package/dist/commands/over-abstraction.js +308 -0
  40. package/dist/commands/over-abstraction.js.map +1 -0
  41. package/dist/commands/quick-check.d.ts +5 -0
  42. package/dist/commands/quick-check.d.ts.map +1 -0
  43. package/dist/commands/quick-check.js +174 -0
  44. package/dist/commands/quick-check.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-digest.d.ts +5 -0
  50. package/dist/commands/review-digest.d.ts.map +1 -0
  51. package/dist/commands/review-digest.js +266 -0
  52. package/dist/commands/review-digest.js.map +1 -0
  53. package/dist/commands/review-handoff.d.ts +5 -0
  54. package/dist/commands/review-handoff.d.ts.map +1 -0
  55. package/dist/commands/review-handoff.js +209 -0
  56. package/dist/commands/review-handoff.js.map +1 -0
  57. package/dist/commands/review-receipt.d.ts +5 -0
  58. package/dist/commands/review-receipt.d.ts.map +1 -0
  59. package/dist/commands/review-receipt.js +221 -0
  60. package/dist/commands/review-receipt.js.map +1 -0
  61. package/dist/commands/security-theater.d.ts +5 -0
  62. package/dist/commands/security-theater.d.ts.map +1 -0
  63. package/dist/commands/security-theater.js +279 -0
  64. package/dist/commands/security-theater.js.map +1 -0
  65. package/dist/commands/stale-pattern.d.ts +5 -0
  66. package/dist/commands/stale-pattern.d.ts.map +1 -0
  67. package/dist/commands/stale-pattern.js +294 -0
  68. package/dist/commands/stale-pattern.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Adoption-track — measure team-level Judges adoption metrics from local data.
3
+ */
4
+ import { readFileSync, readdirSync, statSync, existsSync } 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 = 500) {
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
+ function analyzeConfig(dir) {
41
+ const configPaths = [
42
+ join(dir, ".judgesrc"),
43
+ join(dir, ".judgesrc.json"),
44
+ join(dir, "judgesrc.json"),
45
+ join(dir, ".judges.json"),
46
+ ];
47
+ for (const p of configPaths) {
48
+ if (existsSync(p)) {
49
+ try {
50
+ const raw = readFileSync(p, "utf-8");
51
+ const config = JSON.parse(raw);
52
+ let completeness = 20; // Base for having a config at all
53
+ if (config.preset)
54
+ completeness += 15;
55
+ if (config.minSeverity)
56
+ completeness += 10;
57
+ if (config.judges && Object.keys(config.judges).length > 0)
58
+ completeness += 20;
59
+ if (config.disabledRules && config.disabledRules.length > 0)
60
+ completeness += 10;
61
+ if (config.ruleOverrides && Object.keys(config.ruleOverrides).length > 0)
62
+ completeness += 15;
63
+ if (config.disabledJudges && config.disabledJudges.length > 0)
64
+ completeness += 10;
65
+ return { config, completeness: Math.min(100, completeness) };
66
+ }
67
+ catch {
68
+ /* malformed config */
69
+ }
70
+ }
71
+ }
72
+ // Check package.json for judges config
73
+ const pkgPath = join(dir, "package.json");
74
+ if (existsSync(pkgPath)) {
75
+ try {
76
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
77
+ if (pkg.judges || pkg.judgesConfig) {
78
+ return { config: (pkg.judges || pkg.judgesConfig), completeness: 30 };
79
+ }
80
+ }
81
+ catch {
82
+ /* skip */
83
+ }
84
+ }
85
+ return { config: null, completeness: 0 };
86
+ }
87
+ // ─── Suppression tracking ───────────────────────────────────────────────────
88
+ function countSuppressions(files) {
89
+ let total = 0;
90
+ const categories = new Map();
91
+ for (const f of files) {
92
+ let content;
93
+ try {
94
+ content = readFileSync(f, "utf-8");
95
+ }
96
+ catch {
97
+ continue;
98
+ }
99
+ const suppressions = content.match(/judges-disable|judges-ignore|judges-suppress|noinspection|@suppress/gi) || [];
100
+ total += suppressions.length;
101
+ // Categorize by nearby judge name
102
+ const lines = content.split("\n");
103
+ for (let i = 0; i < lines.length; i++) {
104
+ if (/judges-disable|judges-ignore|judges-suppress/i.test(lines[i])) {
105
+ const ruleMatch = lines[i].match(/(?:judges-(?:disable|ignore|suppress))\s+(\S+)/i);
106
+ const cat = ruleMatch ? ruleMatch[1] : "unspecified";
107
+ categories.set(cat, (categories.get(cat) || 0) + 1);
108
+ }
109
+ }
110
+ }
111
+ return { total, categories };
112
+ }
113
+ // ─── Cold spots (directories with no judges integration) ────────────────────
114
+ function findColdSpots(dir, files) {
115
+ const dirCounts = new Map();
116
+ const dirFiles = new Map();
117
+ for (const f of files) {
118
+ const rel = relative(dir, f);
119
+ const parts = rel.split(/[/\\]/);
120
+ if (parts.length > 1) {
121
+ const topDir = parts[0];
122
+ dirFiles.set(topDir, (dirFiles.get(topDir) || 0) + 1);
123
+ }
124
+ }
125
+ // Directories with code but no suppression comments → likely not being reviewed
126
+ for (const f of files) {
127
+ let content;
128
+ try {
129
+ content = readFileSync(f, "utf-8");
130
+ }
131
+ catch {
132
+ continue;
133
+ }
134
+ const rel = relative(dir, f);
135
+ const parts = rel.split(/[/\\]/);
136
+ if (parts.length > 1) {
137
+ const topDir = parts[0];
138
+ if (/judges-|@judges|judges\.config/i.test(content)) {
139
+ dirCounts.set(topDir, (dirCounts.get(topDir) || 0) + 1);
140
+ }
141
+ }
142
+ }
143
+ // Directories with files but zero judges references
144
+ const coldSpots = [];
145
+ for (const [d, count] of dirFiles) {
146
+ if (count >= 3 && !dirCounts.has(d)) {
147
+ coldSpots.push(d);
148
+ }
149
+ }
150
+ return coldSpots;
151
+ }
152
+ // ─── CLI ────────────────────────────────────────────────────────────────────
153
+ export function runAdoptionTrack(argv) {
154
+ if (argv.includes("--help") || argv.includes("-h")) {
155
+ console.log(`
156
+ judges adoption-track — Measure team-level Judges adoption metrics
157
+
158
+ Usage:
159
+ judges adoption-track [dir]
160
+ judges adoption-track --format json
161
+
162
+ Options:
163
+ [dir] Directory to scan (default: .)
164
+ --format json JSON output
165
+ --help, -h Show this help
166
+
167
+ Measures: config completeness, suppression rate, rule override count,
168
+ cold spots (directories with code but no review engagement),
169
+ adoption health score.
170
+
171
+ Note: All metrics are computed from local files only — no data is sent
172
+ or stored externally.
173
+ `);
174
+ return;
175
+ }
176
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
177
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
178
+ const files = collectFiles(dir);
179
+ const { config, completeness } = analyzeConfig(dir);
180
+ const { total: suppressionTotal, categories: suppressionCats } = countSuppressions(files);
181
+ const coldSpots = findColdSpots(dir, files);
182
+ const suppressionRate = files.length > 0 ? Math.round((suppressionTotal / files.length) * 100) : 0;
183
+ const ruleOverrideCount = config?.ruleOverrides ? Object.keys(config.ruleOverrides).length : 0;
184
+ const disabledCount = config?.disabledJudges?.length || 0;
185
+ // Estimate active vs total judges (heuristic)
186
+ const totalJudgeCount = 60; // Approximate total available judges
187
+ const activeJudgeCount = totalJudgeCount - disabledCount;
188
+ const coverageEstimate = files.length > 0 ? Math.round((activeJudgeCount / totalJudgeCount) * 100) : 0;
189
+ // Health score
190
+ let healthScore = 0;
191
+ healthScore += completeness * 0.3; // Config completeness weight
192
+ healthScore += coverageEstimate * 0.3; // Coverage weight
193
+ healthScore += Math.max(0, 100 - suppressionRate * 2) * 0.2; // Low suppression is good
194
+ healthScore += Math.max(0, 100 - coldSpots.length * 15) * 0.2; // Few cold spots is good
195
+ healthScore = Math.round(Math.min(100, Math.max(0, healthScore)));
196
+ const metrics = {
197
+ configCompleteness: completeness,
198
+ coverageEstimate,
199
+ suppressionRate,
200
+ ruleOverrideCount,
201
+ activeJudgeCount,
202
+ totalJudgeCount,
203
+ coldSpots,
204
+ healthScore,
205
+ };
206
+ if (format === "json") {
207
+ console.log(JSON.stringify({
208
+ metrics,
209
+ suppressionCategories: Object.fromEntries(suppressionCats),
210
+ filesScanned: files.length,
211
+ timestamp: new Date().toISOString(),
212
+ }, null, 2));
213
+ }
214
+ else {
215
+ const badge = healthScore >= 80 ? "✅ HIGH ADOPTION" : healthScore >= 50 ? "⚠️ PARTIAL ADOPTION" : "❌ LOW ADOPTION";
216
+ console.log(`\n Adoption Track: ${badge} (${healthScore}/100)\n ─────────────────────────────`);
217
+ console.log(` Files scanned: ${files.length}`);
218
+ console.log(` Config completeness: ${completeness}%${config ? "" : " (no config found)"}`);
219
+ console.log(` Judge coverage: ${coverageEstimate}% (${activeJudgeCount}/${totalJudgeCount} judges active)`);
220
+ console.log(` Suppression rate: ${suppressionRate}% (${suppressionTotal} suppressions)`);
221
+ console.log(` Rule overrides: ${ruleOverrideCount}`);
222
+ if (suppressionCats.size > 0) {
223
+ console.log(`\n Suppressed categories:`);
224
+ for (const [cat, count] of [...suppressionCats.entries()].sort((a, b) => b[1] - a[1]).slice(0, 10)) {
225
+ console.log(` ${cat}: ${count}`);
226
+ }
227
+ }
228
+ if (coldSpots.length > 0) {
229
+ console.log(`\n Cold spots (low/no engagement):`);
230
+ for (const spot of coldSpots.slice(0, 10))
231
+ console.log(` 📁 ${spot}/`);
232
+ }
233
+ console.log(`\n Recommendations:`);
234
+ if (completeness < 50)
235
+ console.log(` → Create or improve .judgesrc configuration`);
236
+ if (disabledCount > 10)
237
+ console.log(` → Review disabled judges — ${disabledCount} disabled may be excessive`);
238
+ if (suppressionRate > 20)
239
+ console.log(` → High suppression rate (${suppressionRate}%) — review if suppressions are justified`);
240
+ if (coldSpots.length > 0)
241
+ console.log(` → Engage cold-spot directories: ${coldSpots.slice(0, 3).join(", ")}`);
242
+ if (healthScore >= 80)
243
+ console.log(` → Adoption is healthy — maintain current practices`);
244
+ console.log();
245
+ }
246
+ }
247
+ //# sourceMappingURL=adoption-track.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adoption-track.js","sourceRoot":"","sources":["../../src/commands/adoption-track.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * AI-provenance — detect and annotate which code regions were AI-generated.
3
+ */
4
+ export declare function runAiProvenance(argv: string[]): void;
5
+ //# sourceMappingURL=ai-provenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-provenance.d.ts","sourceRoot":"","sources":["../../src/commands/ai-provenance.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgNH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAwFpD"}
@@ -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"}