@kevinrabun/judges 3.49.0 → 3.51.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 +24 -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-gate.d.ts +8 -0
  6. package/dist/commands/ai-gate.d.ts.map +1 -0
  7. package/dist/commands/ai-gate.js +213 -0
  8. package/dist/commands/ai-gate.js.map +1 -0
  9. package/dist/commands/ai-output-compare.d.ts +9 -0
  10. package/dist/commands/ai-output-compare.d.ts.map +1 -0
  11. package/dist/commands/ai-output-compare.js +203 -0
  12. package/dist/commands/ai-output-compare.js.map +1 -0
  13. package/dist/commands/ai-pattern-trend.d.ts +9 -0
  14. package/dist/commands/ai-pattern-trend.d.ts.map +1 -0
  15. package/dist/commands/ai-pattern-trend.js +224 -0
  16. package/dist/commands/ai-pattern-trend.js.map +1 -0
  17. package/dist/commands/api-audit.d.ts +9 -0
  18. package/dist/commands/api-audit.d.ts.map +1 -0
  19. package/dist/commands/api-audit.js +360 -0
  20. package/dist/commands/api-audit.js.map +1 -0
  21. package/dist/commands/arch-audit.d.ts +9 -0
  22. package/dist/commands/arch-audit.d.ts.map +1 -0
  23. package/dist/commands/arch-audit.js +284 -0
  24. package/dist/commands/arch-audit.js.map +1 -0
  25. package/dist/commands/clarity-score.d.ts +9 -0
  26. package/dist/commands/clarity-score.d.ts.map +1 -0
  27. package/dist/commands/clarity-score.js +261 -0
  28. package/dist/commands/clarity-score.js.map +1 -0
  29. package/dist/commands/compliance-map.d.ts +9 -0
  30. package/dist/commands/compliance-map.d.ts.map +1 -0
  31. package/dist/commands/compliance-map.js +375 -0
  32. package/dist/commands/compliance-map.js.map +1 -0
  33. package/dist/commands/exec-report.d.ts +9 -0
  34. package/dist/commands/exec-report.d.ts.map +1 -0
  35. package/dist/commands/exec-report.js +272 -0
  36. package/dist/commands/exec-report.js.map +1 -0
  37. package/dist/commands/guided-tour.d.ts +9 -0
  38. package/dist/commands/guided-tour.d.ts.map +1 -0
  39. package/dist/commands/guided-tour.js +288 -0
  40. package/dist/commands/guided-tour.js.map +1 -0
  41. package/dist/commands/hallucination-score.d.ts +9 -0
  42. package/dist/commands/hallucination-score.d.ts.map +1 -0
  43. package/dist/commands/hallucination-score.js +317 -0
  44. package/dist/commands/hallucination-score.js.map +1 -0
  45. package/dist/commands/iac-lint.d.ts +8 -0
  46. package/dist/commands/iac-lint.d.ts.map +1 -0
  47. package/dist/commands/iac-lint.js +313 -0
  48. package/dist/commands/iac-lint.js.map +1 -0
  49. package/dist/commands/perf-compare.d.ts +9 -0
  50. package/dist/commands/perf-compare.d.ts.map +1 -0
  51. package/dist/commands/perf-compare.js +246 -0
  52. package/dist/commands/perf-compare.js.map +1 -0
  53. package/dist/commands/pii-scan.d.ts +8 -0
  54. package/dist/commands/pii-scan.d.ts.map +1 -0
  55. package/dist/commands/pii-scan.js +300 -0
  56. package/dist/commands/pii-scan.js.map +1 -0
  57. package/dist/commands/secret-scan.d.ts +8 -0
  58. package/dist/commands/secret-scan.d.ts.map +1 -0
  59. package/dist/commands/secret-scan.js +245 -0
  60. package/dist/commands/secret-scan.js.map +1 -0
  61. package/dist/commands/test-suggest.d.ts +9 -0
  62. package/dist/commands/test-suggest.d.ts.map +1 -0
  63. package/dist/commands/test-suggest.js +248 -0
  64. package/dist/commands/test-suggest.js.map +1 -0
  65. package/dist/commands/vendor-lock-detect.d.ts +8 -0
  66. package/dist/commands/vendor-lock-detect.d.ts.map +1 -0
  67. package/dist/commands/vendor-lock-detect.js +289 -0
  68. package/dist/commands/vendor-lock-detect.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,213 @@
1
+ /**
2
+ * AI gate — pre-commit/pre-PR guard that blocks AI-generated code
3
+ * below a confidence threshold, routing it to human reviewers.
4
+ *
5
+ * All analysis local.
6
+ */
7
+ import { existsSync, readFileSync, readdirSync, mkdirSync, writeFileSync } from "fs";
8
+ import { join, extname } from "path";
9
+ const AI_SIGNALS = [
10
+ {
11
+ name: "AI-generated comment",
12
+ weight: 20,
13
+ detect: (c) => /(?:generated\s+(?:by|with)\s+(?:ai|gpt|copilot|claude|chatgpt|llm)|ai[- ]generated|auto[- ]generated)/i.test(c),
14
+ },
15
+ {
16
+ name: "Boilerplate comment structure",
17
+ weight: 10,
18
+ detect: (_c, lines) => lines.filter((l) => /^\s*\*\s+@(?:param|returns|throws|example)\b/.test(l)).length > 5,
19
+ },
20
+ {
21
+ name: "Uniform code style",
22
+ weight: 5,
23
+ detect: (_c, lines) => {
24
+ const indents = lines.filter((l) => l.trim().length > 0).map((l) => l.match(/^(\s*)/)?.[1].length || 0);
25
+ const uniq = new Set(indents.filter((i) => i > 0));
26
+ return uniq.size <= 2 && lines.length > 20;
27
+ },
28
+ },
29
+ {
30
+ name: "Excessive inline comments",
31
+ weight: 10,
32
+ detect: (_c, lines) => {
33
+ const inlineComments = lines.filter((l) => /\S.*\/\/\s*\w/.test(l));
34
+ return inlineComments.length > lines.length * 0.3;
35
+ },
36
+ },
37
+ {
38
+ name: "TODO/placeholder left by AI",
39
+ weight: 15,
40
+ detect: (c) => (c.match(/\/\/\s*TODO|\/\/\s*FIXME|\/\/\s*PLACEHOLDER/gi) || []).length > 2,
41
+ },
42
+ {
43
+ name: "Generic example patterns",
44
+ weight: 10,
45
+ detect: (c) => /\bexample\.com\b|\blorem\s+ipsum\b|\bfoo\b.*\bbar\b/i.test(c),
46
+ },
47
+ {
48
+ name: "Hallucination indicators",
49
+ weight: 15,
50
+ detect: (c) => {
51
+ const emptyFns = (c.match(/\bfunction\s+\w+\s*\([^)]*\)\s*{\s*}/g) || []).length;
52
+ const emptyArrows = (c.match(/=>\s*{\s*}/g) || []).length;
53
+ return emptyFns + emptyArrows > 2;
54
+ },
55
+ },
56
+ {
57
+ name: "Unusually consistent naming",
58
+ weight: 5,
59
+ detect: (c) => {
60
+ const vars = c.match(/(?:const|let|var)\s+(\w+)/g) || [];
61
+ if (vars.length < 5)
62
+ return false;
63
+ const camel = vars.filter((v) => /[a-z][A-Z]/.test(v)).length;
64
+ return camel / vars.length > 0.9;
65
+ },
66
+ },
67
+ ];
68
+ function assessFile(filePath) {
69
+ const content = readFileSync(filePath, "utf-8");
70
+ const lines = content.split("\n");
71
+ const triggered = [];
72
+ let aiScore = 0;
73
+ for (const signal of AI_SIGNALS) {
74
+ if (signal.detect(content, lines)) {
75
+ triggered.push(signal.name);
76
+ aiScore += signal.weight;
77
+ }
78
+ }
79
+ const aiLikelihood = Math.min(100, aiScore);
80
+ const confidence = Math.max(0, 100 - aiLikelihood);
81
+ return { file: filePath, confidence, aiLikelihood, blocked: false, reasons: triggered };
82
+ }
83
+ // ─── Scanner ────────────────────────────────────────────────────────────────
84
+ const SKIP = new Set(["node_modules", ".git", "dist", "build", "coverage"]);
85
+ const EXTS = new Set([".ts", ".js", ".py", ".java", ".cs", ".go", ".rb", ".php", ".rs"]);
86
+ function collectFiles(dir) {
87
+ const result = [];
88
+ function walk(d) {
89
+ let entries;
90
+ try {
91
+ entries = readdirSync(d);
92
+ }
93
+ catch {
94
+ return;
95
+ }
96
+ for (const name of entries) {
97
+ if (SKIP.has(name) || name.startsWith("."))
98
+ continue;
99
+ const full = join(d, name);
100
+ try {
101
+ const sub = readdirSync(full);
102
+ void sub;
103
+ walk(full);
104
+ }
105
+ catch {
106
+ if (EXTS.has(extname(name).toLowerCase()))
107
+ result.push(full);
108
+ }
109
+ }
110
+ }
111
+ walk(dir);
112
+ return result;
113
+ }
114
+ // ─── CLI ────────────────────────────────────────────────────────────────────
115
+ export function runAiGate(argv) {
116
+ if (argv.includes("--help") || argv.includes("-h")) {
117
+ console.log(`
118
+ judges ai-gate — Pre-merge guard for AI-generated code
119
+
120
+ Usage:
121
+ judges ai-gate <file-or-dir>
122
+ judges ai-gate src/ --threshold 40
123
+ judges ai-gate . --block --format json
124
+
125
+ Options:
126
+ --threshold <n> Block files with AI-likelihood above this score (default: 60)
127
+ --block Exit with code 1 when any file is blocked
128
+ --report <file> Save gate report to file
129
+ --format json JSON output
130
+ --help, -h Show this help
131
+
132
+ Uses heuristic signals: AI-generated comments, boilerplate patterns,
133
+ hallucination indicators, and naming consistency analysis.
134
+ `);
135
+ return;
136
+ }
137
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
138
+ const thresholdStr = argv.find((_a, i) => argv[i - 1] === "--threshold");
139
+ const threshold = thresholdStr ? parseInt(thresholdStr) : 60;
140
+ const shouldBlock = argv.includes("--block");
141
+ const reportFile = argv.find((_a, i) => argv[i - 1] === "--report");
142
+ const target = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--")) || ".";
143
+ if (!existsSync(target)) {
144
+ console.error(` Path not found: ${target}`);
145
+ return;
146
+ }
147
+ let files;
148
+ try {
149
+ readdirSync(target);
150
+ files = collectFiles(target);
151
+ }
152
+ catch {
153
+ files = [target];
154
+ }
155
+ const results = [];
156
+ for (const f of files) {
157
+ const result = assessFile(f);
158
+ result.blocked = result.aiLikelihood >= threshold;
159
+ results.push(result);
160
+ }
161
+ const blocked = results.filter((r) => r.blocked);
162
+ const passed = results.filter((r) => !r.blocked);
163
+ const report = {
164
+ results,
165
+ summary: {
166
+ total: results.length,
167
+ blocked: blocked.length,
168
+ passed: passed.length,
169
+ threshold,
170
+ gateStatus: blocked.length > 0 ? "FAILED" : "PASSED",
171
+ },
172
+ timestamp: new Date().toISOString(),
173
+ };
174
+ if (reportFile) {
175
+ const dir = join(".", ".judges-ai-gate");
176
+ if (!existsSync(dir))
177
+ mkdirSync(dir, { recursive: true });
178
+ writeFileSync(join(dir, reportFile), JSON.stringify(report, null, 2));
179
+ console.log(` Report saved to .judges-ai-gate/${reportFile}`);
180
+ }
181
+ if (format === "json") {
182
+ console.log(JSON.stringify(report, null, 2));
183
+ }
184
+ else {
185
+ console.log(`\n AI Gate — ${results.length} files checked (threshold: ${threshold}%)`);
186
+ console.log(` Status: ${report.summary.gateStatus}`);
187
+ console.log(` ──────────────────────────`);
188
+ if (blocked.length > 0) {
189
+ console.log(`\n ❌ BLOCKED (${blocked.length})`);
190
+ for (const r of blocked) {
191
+ console.log(` ${r.file} — AI likelihood: ${r.aiLikelihood}% | Confidence: ${r.confidence}%`);
192
+ for (const reason of r.reasons) {
193
+ console.log(` • ${reason}`);
194
+ }
195
+ }
196
+ }
197
+ if (passed.length > 0 && passed.some((r) => r.reasons.length > 0)) {
198
+ console.log(`\n ⚠️ PASSED WITH WARNINGS (${passed.filter((r) => r.reasons.length > 0).length})`);
199
+ for (const r of passed.filter((r) => r.reasons.length > 0)) {
200
+ console.log(` ${r.file} — AI likelihood: ${r.aiLikelihood}%`);
201
+ }
202
+ }
203
+ const clean = passed.filter((r) => r.reasons.length === 0);
204
+ if (clean.length > 0) {
205
+ console.log(`\n ✅ CLEAN (${clean.length} files)`);
206
+ }
207
+ console.log("");
208
+ }
209
+ if (shouldBlock && blocked.length > 0) {
210
+ process.exitCode = 1;
211
+ }
212
+ }
213
+ //# sourceMappingURL=ai-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-gate.js","sourceRoot":"","sources":["../../src/commands/ai-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * AI output compare — compare code generated by multiple AI models
3
+ * from the same prompt to identify divergence, inconsistencies,
4
+ * and model-specific patterns.
5
+ *
6
+ * All analysis local.
7
+ */
8
+ export declare function runAiOutputCompare(argv: string[]): void;
9
+ //# sourceMappingURL=ai-output-compare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-output-compare.d.ts","sourceRoot":"","sources":["../../src/commands/ai-output-compare.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmKH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoFvD"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * AI output compare — compare code generated by multiple AI models
3
+ * from the same prompt to identify divergence, inconsistencies,
4
+ * and model-specific patterns.
5
+ *
6
+ * All analysis local.
7
+ */
8
+ import { existsSync, readFileSync } from "fs";
9
+ // ─── Analysis ───────────────────────────────────────────────────────────────
10
+ function analyzeFile(filePath) {
11
+ const content = readFileSync(filePath, "utf-8");
12
+ const lines = content.split("\n");
13
+ const functionCount = (content.match(/\b(?:function\s+\w+|(?:const|let|var)\s+\w+\s*=\s*(?:async\s+)?(?:\([^)]*\)\s*=>|function))/g) || []).length;
14
+ const importCount = (content.match(/\b(?:import\s|require\s*\()/g) || []).length;
15
+ const commentLines = lines.filter((l) => /^\s*(?:\/\/|\/?\*|#)/.test(l)).length;
16
+ const commentRatio = lines.length > 0 ? Math.round((commentLines / lines.length) * 100) : 0;
17
+ // Cyclomatic complexity estimate
18
+ let complexity = 1;
19
+ for (const line of lines) {
20
+ if (/\b(?:if|else\s+if|switch|case|for|while|catch|&&|\|\||\?)\b/.test(line))
21
+ complexity++;
22
+ }
23
+ // Detect patterns
24
+ const patterns = [];
25
+ if (/\bclass\s+\w+/.test(content))
26
+ patterns.push("OOP");
27
+ if (/=>\s*{|=>\s*\w/.test(content))
28
+ patterns.push("functional");
29
+ if (/\basync\b/.test(content))
30
+ patterns.push("async");
31
+ if (/\btry\s*{/.test(content))
32
+ patterns.push("error-handling");
33
+ if (/\bdescribe\s*\(|\bit\s*\(|\btest\s*\(/.test(content))
34
+ patterns.push("test-code");
35
+ if (/(?:express|fastify|koa|hapi)\b/.test(content))
36
+ patterns.push("web-framework");
37
+ if (/\binterface\s|\btype\s/.test(content))
38
+ patterns.push("typed");
39
+ return {
40
+ file: filePath,
41
+ lineCount: lines.length,
42
+ functionCount,
43
+ importCount,
44
+ commentRatio,
45
+ complexity,
46
+ patterns,
47
+ };
48
+ }
49
+ function findDivergences(analyses) {
50
+ const divergences = [];
51
+ if (analyses.length < 2)
52
+ return divergences;
53
+ // Line count divergence
54
+ const lineCounts = analyses.map((a) => a.lineCount);
55
+ const maxLines = Math.max(...lineCounts);
56
+ const minLines = Math.min(...lineCounts);
57
+ if (maxLines > 0 && (maxLines - minLines) / maxLines > 0.3) {
58
+ divergences.push({
59
+ type: "size-divergence",
60
+ severity: "medium",
61
+ detail: `Line count varies significantly: ${minLines}–${maxLines} (${Math.round(((maxLines - minLines) / maxLines) * 100)}% spread)`,
62
+ files: analyses.map((a) => a.file),
63
+ });
64
+ }
65
+ // Complexity divergence
66
+ const complexities = analyses.map((a) => a.complexity);
67
+ const maxComp = Math.max(...complexities);
68
+ const minComp = Math.min(...complexities);
69
+ if (maxComp > minComp * 2) {
70
+ divergences.push({
71
+ type: "complexity-divergence",
72
+ severity: "high",
73
+ detail: `Cyclomatic complexity varies: ${minComp}–${maxComp} — models disagree on solution complexity`,
74
+ files: analyses.map((a) => a.file),
75
+ });
76
+ }
77
+ // Pattern divergence
78
+ const allPatterns = new Set(analyses.flatMap((a) => a.patterns));
79
+ for (const pattern of allPatterns) {
80
+ const hasPattern = analyses.filter((a) => a.patterns.includes(pattern));
81
+ const missingPattern = analyses.filter((a) => !a.patterns.includes(pattern));
82
+ if (hasPattern.length > 0 && missingPattern.length > 0) {
83
+ divergences.push({
84
+ type: "pattern-divergence",
85
+ severity: pattern === "error-handling" ? "high" : "low",
86
+ detail: `Pattern "${pattern}" present in ${hasPattern.length}/${analyses.length} outputs`,
87
+ files: missingPattern.map((a) => a.file),
88
+ });
89
+ }
90
+ }
91
+ // Import divergence
92
+ const importCounts = analyses.map((a) => a.importCount);
93
+ const maxImports = Math.max(...importCounts);
94
+ const minImports = Math.min(...importCounts);
95
+ if (maxImports > minImports + 3) {
96
+ divergences.push({
97
+ type: "dependency-divergence",
98
+ severity: "medium",
99
+ detail: `Import count varies: ${minImports}–${maxImports} — models chose different dependencies`,
100
+ files: analyses.map((a) => a.file),
101
+ });
102
+ }
103
+ // Comment ratio divergence
104
+ const commentRatios = analyses.map((a) => a.commentRatio);
105
+ const maxComment = Math.max(...commentRatios);
106
+ const minComment = Math.min(...commentRatios);
107
+ if (maxComment - minComment > 20) {
108
+ divergences.push({
109
+ type: "documentation-divergence",
110
+ severity: "low",
111
+ detail: `Comment ratio varies: ${minComment}%–${maxComment}% — inconsistent documentation level`,
112
+ files: analyses.map((a) => a.file),
113
+ });
114
+ }
115
+ // Function count divergence
116
+ const fnCounts = analyses.map((a) => a.functionCount);
117
+ const maxFn = Math.max(...fnCounts);
118
+ const minFn = Math.min(...fnCounts);
119
+ if (maxFn > 0 && maxFn > minFn * 2) {
120
+ divergences.push({
121
+ type: "decomposition-divergence",
122
+ severity: "medium",
123
+ detail: `Function count varies: ${minFn}–${maxFn} — models decompose differently`,
124
+ files: analyses.map((a) => a.file),
125
+ });
126
+ }
127
+ return divergences;
128
+ }
129
+ // ─── CLI ────────────────────────────────────────────────────────────────────
130
+ export function runAiOutputCompare(argv) {
131
+ if (argv.includes("--help") || argv.includes("-h")) {
132
+ console.log(`
133
+ judges ai-output-compare — Compare outputs from multiple AI models
134
+
135
+ Usage:
136
+ judges ai-output-compare <file1> <file2> [file3...]
137
+ judges ai-output-compare copilot.ts claude.ts chatgpt.ts --format json
138
+
139
+ Options:
140
+ --format json JSON output
141
+ --help, -h Show this help
142
+
143
+ Compare code generated by different AI models for the same prompt.
144
+ Identifies divergences in complexity, patterns, structure, and dependencies.
145
+ High-divergence areas indicate model disagreement = higher risk.
146
+ `);
147
+ return;
148
+ }
149
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
150
+ const files = argv.filter((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--"));
151
+ if (files.length < 2) {
152
+ console.error(" Provide at least 2 files to compare (e.g., copilot.ts claude.ts)");
153
+ return;
154
+ }
155
+ for (const f of files) {
156
+ if (!existsSync(f)) {
157
+ console.error(` File not found: ${f}`);
158
+ return;
159
+ }
160
+ }
161
+ const analyses = files.map((f) => analyzeFile(f));
162
+ const divergences = findDivergences(analyses);
163
+ // Structural similarity score
164
+ const totalChecks = 6;
165
+ const divergentChecks = new Set(divergences.map((d) => d.type)).size;
166
+ const similarity = Math.round(((totalChecks - divergentChecks) / totalChecks) * 100);
167
+ const highRisk = divergences.filter((d) => d.severity === "high").length;
168
+ let recommendation = "Outputs are highly consistent — any version is acceptable.";
169
+ if (highRisk > 0)
170
+ recommendation = "Significant divergences detected — manual review required before selecting.";
171
+ else if (divergences.length > 2)
172
+ recommendation = "Moderate divergences — prefer the version with best error handling and documentation.";
173
+ const result = {
174
+ files: analyses,
175
+ divergences,
176
+ summary: { totalDivergences: divergences.length, highRisk, structuralSimilarity: similarity, recommendation },
177
+ };
178
+ if (format === "json") {
179
+ console.log(JSON.stringify(result, null, 2));
180
+ }
181
+ else {
182
+ console.log(`\n AI Output Comparison — ${files.length} files`);
183
+ console.log(` Structural Similarity: ${similarity}%\n ──────────────────────────`);
184
+ console.log(`\n ${"File".padEnd(30)} ${"Lines".padEnd(8)} ${"Funcs".padEnd(8)} ${"Complex".padEnd(8)} ${"Comments".padEnd(10)} Patterns`);
185
+ console.log(` ${"─".repeat(80)}`);
186
+ for (const a of analyses) {
187
+ console.log(` ${a.file.substring(0, 28).padEnd(30)} ${String(a.lineCount).padEnd(8)} ${String(a.functionCount).padEnd(8)} ${String(a.complexity).padEnd(8)} ${(a.commentRatio + "%").padEnd(10)} ${a.patterns.join(", ")}`);
188
+ }
189
+ if (divergences.length > 0) {
190
+ console.log(`\n Divergences (${divergences.length})`);
191
+ for (const d of divergences) {
192
+ const icon = d.severity === "high" ? "🔴" : d.severity === "medium" ? "🟡" : "🟢";
193
+ console.log(` ${icon} [${d.severity.toUpperCase()}] ${d.type}`);
194
+ console.log(` ${d.detail}`);
195
+ }
196
+ }
197
+ else {
198
+ console.log(`\n ✅ No significant divergences detected`);
199
+ }
200
+ console.log(`\n Recommendation: ${recommendation}\n`);
201
+ }
202
+ }
203
+ //# sourceMappingURL=ai-output-compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-output-compare.js","sourceRoot":"","sources":["../../src/commands/ai-output-compare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * AI pattern trend — track how AI-generated code patterns evolve
3
+ * over time in a codebase. Detect drift in hallucination signals,
4
+ * code quality, and AI reliance.
5
+ *
6
+ * All data local (.judges-ai-trend/).
7
+ */
8
+ export declare function runAiPatternTrend(argv: string[]): void;
9
+ //# sourceMappingURL=ai-pattern-trend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-pattern-trend.d.ts","sourceRoot":"","sources":["../../src/commands/ai-pattern-trend.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqJH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmHtD"}