@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.
- package/CHANGELOG.md +24 -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-gate.d.ts +8 -0
- package/dist/commands/ai-gate.d.ts.map +1 -0
- package/dist/commands/ai-gate.js +213 -0
- package/dist/commands/ai-gate.js.map +1 -0
- package/dist/commands/ai-output-compare.d.ts +9 -0
- package/dist/commands/ai-output-compare.d.ts.map +1 -0
- package/dist/commands/ai-output-compare.js +203 -0
- package/dist/commands/ai-output-compare.js.map +1 -0
- package/dist/commands/ai-pattern-trend.d.ts +9 -0
- package/dist/commands/ai-pattern-trend.d.ts.map +1 -0
- package/dist/commands/ai-pattern-trend.js +224 -0
- package/dist/commands/ai-pattern-trend.js.map +1 -0
- package/dist/commands/api-audit.d.ts +9 -0
- package/dist/commands/api-audit.d.ts.map +1 -0
- package/dist/commands/api-audit.js +360 -0
- package/dist/commands/api-audit.js.map +1 -0
- package/dist/commands/arch-audit.d.ts +9 -0
- package/dist/commands/arch-audit.d.ts.map +1 -0
- package/dist/commands/arch-audit.js +284 -0
- package/dist/commands/arch-audit.js.map +1 -0
- package/dist/commands/clarity-score.d.ts +9 -0
- package/dist/commands/clarity-score.d.ts.map +1 -0
- package/dist/commands/clarity-score.js +261 -0
- package/dist/commands/clarity-score.js.map +1 -0
- package/dist/commands/compliance-map.d.ts +9 -0
- package/dist/commands/compliance-map.d.ts.map +1 -0
- package/dist/commands/compliance-map.js +375 -0
- package/dist/commands/compliance-map.js.map +1 -0
- package/dist/commands/exec-report.d.ts +9 -0
- package/dist/commands/exec-report.d.ts.map +1 -0
- package/dist/commands/exec-report.js +272 -0
- package/dist/commands/exec-report.js.map +1 -0
- package/dist/commands/guided-tour.d.ts +9 -0
- package/dist/commands/guided-tour.d.ts.map +1 -0
- package/dist/commands/guided-tour.js +288 -0
- package/dist/commands/guided-tour.js.map +1 -0
- package/dist/commands/hallucination-score.d.ts +9 -0
- package/dist/commands/hallucination-score.d.ts.map +1 -0
- package/dist/commands/hallucination-score.js +317 -0
- package/dist/commands/hallucination-score.js.map +1 -0
- package/dist/commands/iac-lint.d.ts +8 -0
- package/dist/commands/iac-lint.d.ts.map +1 -0
- package/dist/commands/iac-lint.js +313 -0
- package/dist/commands/iac-lint.js.map +1 -0
- package/dist/commands/perf-compare.d.ts +9 -0
- package/dist/commands/perf-compare.d.ts.map +1 -0
- package/dist/commands/perf-compare.js +246 -0
- package/dist/commands/perf-compare.js.map +1 -0
- package/dist/commands/pii-scan.d.ts +8 -0
- package/dist/commands/pii-scan.d.ts.map +1 -0
- package/dist/commands/pii-scan.js +300 -0
- package/dist/commands/pii-scan.js.map +1 -0
- package/dist/commands/secret-scan.d.ts +8 -0
- package/dist/commands/secret-scan.d.ts.map +1 -0
- package/dist/commands/secret-scan.js +245 -0
- package/dist/commands/secret-scan.js.map +1 -0
- package/dist/commands/test-suggest.d.ts +9 -0
- package/dist/commands/test-suggest.d.ts.map +1 -0
- package/dist/commands/test-suggest.js +248 -0
- package/dist/commands/test-suggest.js.map +1 -0
- package/dist/commands/vendor-lock-detect.d.ts +8 -0
- package/dist/commands/vendor-lock-detect.d.ts.map +1 -0
- package/dist/commands/vendor-lock-detect.js +289 -0
- package/dist/commands/vendor-lock-detect.js.map +1 -0
- package/package.json +1 -1
- 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"}
|