@kevinrabun/judges 3.50.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 +12 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +56 -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/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/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/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,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clarity score — measure code readability and self-documentation
|
|
3
|
+
* specifically for AI-generated code. Flags "correct but cryptic"
|
|
4
|
+
* patterns that need documentation investment.
|
|
5
|
+
*
|
|
6
|
+
* All analysis local.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync, readdirSync } from "fs";
|
|
9
|
+
import { join, extname } from "path";
|
|
10
|
+
// ─── Analysers ──────────────────────────────────────────────────────────────
|
|
11
|
+
function analyzeClarity(content) {
|
|
12
|
+
const lines = content.split("\n");
|
|
13
|
+
const nonEmpty = lines.filter((l) => l.trim().length > 0);
|
|
14
|
+
const metrics = [];
|
|
15
|
+
const suggestions = [];
|
|
16
|
+
// 1. Naming quality
|
|
17
|
+
const identifiers = content.match(/(?:const|let|var|function)\s+(\w+)/g) || [];
|
|
18
|
+
const shortNames = identifiers.filter((id) => {
|
|
19
|
+
const name = id.replace(/^(?:const|let|var|function)\s+/, "");
|
|
20
|
+
return name.length <= 2 && !["i", "j", "k", "x", "y", "id"].includes(name);
|
|
21
|
+
});
|
|
22
|
+
const namingScore = identifiers.length > 0 ? Math.max(0, 100 - (shortNames.length / identifiers.length) * 200) : 100;
|
|
23
|
+
metrics.push({ id: "naming", label: "Naming Quality", score: Math.round(namingScore), weight: 25 });
|
|
24
|
+
if (namingScore < 60)
|
|
25
|
+
suggestions.push("Use descriptive variable names — single-letter names reduce readability");
|
|
26
|
+
// 2. Comment coverage
|
|
27
|
+
const commentLines = lines.filter((l) => /^\s*(?:\/\/|\/?\*|#)/.test(l)).length;
|
|
28
|
+
const commentRatio = nonEmpty.length > 0 ? commentLines / nonEmpty.length : 0;
|
|
29
|
+
const commentScore = commentRatio >= 0.15 ? 100 : commentRatio >= 0.08 ? 70 : commentRatio >= 0.03 ? 40 : 10;
|
|
30
|
+
metrics.push({
|
|
31
|
+
id: "comments",
|
|
32
|
+
label: "Comment Coverage",
|
|
33
|
+
score: commentScore,
|
|
34
|
+
weight: 20,
|
|
35
|
+
detail: `${Math.round(commentRatio * 100)}% of lines`,
|
|
36
|
+
});
|
|
37
|
+
if (commentScore < 50)
|
|
38
|
+
suggestions.push("Add comments explaining the 'why' — not the 'what'");
|
|
39
|
+
// 3. Function length
|
|
40
|
+
const fnBodies = [];
|
|
41
|
+
let braceDepth = 0;
|
|
42
|
+
let fnStart = -1;
|
|
43
|
+
for (let i = 0; i < lines.length; i++) {
|
|
44
|
+
if (/\bfunction\b|=>\s*{/.test(lines[i]) && fnStart === -1)
|
|
45
|
+
fnStart = i;
|
|
46
|
+
braceDepth += (lines[i].match(/{/g) || []).length;
|
|
47
|
+
braceDepth -= (lines[i].match(/}/g) || []).length;
|
|
48
|
+
if (fnStart >= 0 && braceDepth <= 0) {
|
|
49
|
+
fnBodies.push(i - fnStart + 1);
|
|
50
|
+
fnStart = -1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const avgFnLength = fnBodies.length > 0 ? fnBodies.reduce((a, b) => a + b, 0) / fnBodies.length : 0;
|
|
54
|
+
const fnLengthScore = avgFnLength <= 15 ? 100 : avgFnLength <= 30 ? 70 : avgFnLength <= 50 ? 40 : 10;
|
|
55
|
+
metrics.push({
|
|
56
|
+
id: "function-length",
|
|
57
|
+
label: "Function Length",
|
|
58
|
+
score: fnLengthScore,
|
|
59
|
+
weight: 15,
|
|
60
|
+
detail: `avg ${Math.round(avgFnLength)} lines`,
|
|
61
|
+
});
|
|
62
|
+
if (fnLengthScore < 50)
|
|
63
|
+
suggestions.push("Break long functions into smaller, focused functions");
|
|
64
|
+
// 4. Line complexity
|
|
65
|
+
const longLines = nonEmpty.filter((l) => l.length > 100).length;
|
|
66
|
+
const longLineRatio = nonEmpty.length > 0 ? longLines / nonEmpty.length : 0;
|
|
67
|
+
const lineComplexityScore = longLineRatio <= 0.05 ? 100 : longLineRatio <= 0.15 ? 70 : longLineRatio <= 0.3 ? 40 : 10;
|
|
68
|
+
metrics.push({
|
|
69
|
+
id: "line-length",
|
|
70
|
+
label: "Line Length",
|
|
71
|
+
score: lineComplexityScore,
|
|
72
|
+
weight: 10,
|
|
73
|
+
detail: `${longLines} lines > 100 chars`,
|
|
74
|
+
});
|
|
75
|
+
if (lineComplexityScore < 50)
|
|
76
|
+
suggestions.push("Break long lines for readability");
|
|
77
|
+
// 5. Nesting depth
|
|
78
|
+
let maxNesting = 0;
|
|
79
|
+
let currentNesting = 0;
|
|
80
|
+
for (const line of lines) {
|
|
81
|
+
currentNesting += (line.match(/{/g) || []).length;
|
|
82
|
+
maxNesting = Math.max(maxNesting, currentNesting);
|
|
83
|
+
currentNesting -= (line.match(/}/g) || []).length;
|
|
84
|
+
}
|
|
85
|
+
const nestingScore = maxNesting <= 3 ? 100 : maxNesting <= 5 ? 70 : maxNesting <= 7 ? 40 : 10;
|
|
86
|
+
metrics.push({
|
|
87
|
+
id: "nesting",
|
|
88
|
+
label: "Nesting Depth",
|
|
89
|
+
score: nestingScore,
|
|
90
|
+
weight: 15,
|
|
91
|
+
detail: `max ${maxNesting} levels`,
|
|
92
|
+
});
|
|
93
|
+
if (nestingScore < 50)
|
|
94
|
+
suggestions.push("Reduce nesting depth with early returns and guard clauses");
|
|
95
|
+
// 6. Magic numbers/strings
|
|
96
|
+
const magicNumbers = content.match(/(?<!\w)\d{3,}(?!\w)/g) || [];
|
|
97
|
+
const inlineStrings = content.match(/["'][^"']{20,}["']/g) || [];
|
|
98
|
+
const magicCount = magicNumbers.length + inlineStrings.length;
|
|
99
|
+
const magicScore = magicCount <= 2 ? 100 : magicCount <= 5 ? 70 : magicCount <= 10 ? 40 : 10;
|
|
100
|
+
metrics.push({
|
|
101
|
+
id: "magic-values",
|
|
102
|
+
label: "Named Constants",
|
|
103
|
+
score: magicScore,
|
|
104
|
+
weight: 10,
|
|
105
|
+
detail: `${magicCount} magic values`,
|
|
106
|
+
});
|
|
107
|
+
if (magicScore < 50)
|
|
108
|
+
suggestions.push("Extract magic numbers and long strings into named constants");
|
|
109
|
+
// 7. Consistent style
|
|
110
|
+
const semicolons = (content.match(/;\s*$/gm) || []).length;
|
|
111
|
+
const noSemicolons = nonEmpty.length - semicolons;
|
|
112
|
+
const semiRatio = nonEmpty.length > 0 ? Math.max(semicolons, noSemicolons) / nonEmpty.length : 1;
|
|
113
|
+
const styleScore = semiRatio >= 0.8 ? 100 : semiRatio >= 0.6 ? 60 : 30;
|
|
114
|
+
metrics.push({ id: "style-consistency", label: "Style Consistency", score: styleScore, weight: 5 });
|
|
115
|
+
if (styleScore < 60)
|
|
116
|
+
suggestions.push("Use consistent code style (semicolons, quotes, indentation)");
|
|
117
|
+
return { metrics, suggestions };
|
|
118
|
+
}
|
|
119
|
+
function computeOverallScore(metrics) {
|
|
120
|
+
const totalWeight = metrics.reduce((sum, m) => sum + m.weight, 0);
|
|
121
|
+
const weighted = metrics.reduce((sum, m) => sum + m.score * m.weight, 0);
|
|
122
|
+
return totalWeight > 0 ? Math.round(weighted / totalWeight) : 0;
|
|
123
|
+
}
|
|
124
|
+
function grade(score) {
|
|
125
|
+
if (score >= 90)
|
|
126
|
+
return "A";
|
|
127
|
+
if (score >= 80)
|
|
128
|
+
return "B";
|
|
129
|
+
if (score >= 70)
|
|
130
|
+
return "C";
|
|
131
|
+
if (score >= 60)
|
|
132
|
+
return "D";
|
|
133
|
+
return "F";
|
|
134
|
+
}
|
|
135
|
+
// ─── Scanner ────────────────────────────────────────────────────────────────
|
|
136
|
+
const SKIP = new Set(["node_modules", ".git", "dist", "build", "coverage"]);
|
|
137
|
+
const EXTS = new Set([".ts", ".js", ".py", ".java", ".cs", ".go", ".rb", ".php", ".rs"]);
|
|
138
|
+
function collectFiles(dir) {
|
|
139
|
+
const result = [];
|
|
140
|
+
function walk(d) {
|
|
141
|
+
let entries;
|
|
142
|
+
try {
|
|
143
|
+
entries = readdirSync(d);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
for (const name of entries) {
|
|
149
|
+
if (SKIP.has(name) || name.startsWith("."))
|
|
150
|
+
continue;
|
|
151
|
+
const full = join(d, name);
|
|
152
|
+
try {
|
|
153
|
+
const sub = readdirSync(full);
|
|
154
|
+
void sub;
|
|
155
|
+
walk(full);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
if (EXTS.has(extname(name).toLowerCase()))
|
|
159
|
+
result.push(full);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
walk(dir);
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
167
|
+
export function runClarityScore(argv) {
|
|
168
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
169
|
+
console.log(`
|
|
170
|
+
judges clarity-score — Measure code readability and self-documentation
|
|
171
|
+
|
|
172
|
+
Usage:
|
|
173
|
+
judges clarity-score <file-or-dir>
|
|
174
|
+
judges clarity-score src/ --min-grade C
|
|
175
|
+
|
|
176
|
+
Options:
|
|
177
|
+
--min-grade <A-F> Only show files at or below this grade
|
|
178
|
+
--format json JSON output
|
|
179
|
+
--help, -h Show this help
|
|
180
|
+
|
|
181
|
+
Metrics:
|
|
182
|
+
• Naming quality (descriptive vs. short names)
|
|
183
|
+
• Comment coverage (ratio of comment lines)
|
|
184
|
+
• Function length (average lines per function)
|
|
185
|
+
• Line length (lines exceeding 100 characters)
|
|
186
|
+
• Nesting depth (maximum brace depth)
|
|
187
|
+
• Named constants (magic numbers/strings)
|
|
188
|
+
• Style consistency (semicolon/formatting uniformity)
|
|
189
|
+
`);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
193
|
+
const minGrade = argv.find((_a, i) => argv[i - 1] === "--min-grade");
|
|
194
|
+
const target = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--")) || ".";
|
|
195
|
+
if (!existsSync(target)) {
|
|
196
|
+
console.error(` Path not found: ${target}`);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
let files;
|
|
200
|
+
try {
|
|
201
|
+
readdirSync(target);
|
|
202
|
+
files = collectFiles(target);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
files = [target];
|
|
206
|
+
}
|
|
207
|
+
const results = [];
|
|
208
|
+
for (const f of files) {
|
|
209
|
+
let content;
|
|
210
|
+
try {
|
|
211
|
+
content = readFileSync(f, "utf-8");
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
const { metrics, suggestions } = analyzeClarity(content);
|
|
217
|
+
const overall = computeOverallScore(metrics);
|
|
218
|
+
results.push({ file: f, overallScore: overall, grade: grade(overall), metrics, suggestions });
|
|
219
|
+
}
|
|
220
|
+
let filtered = results;
|
|
221
|
+
if (minGrade) {
|
|
222
|
+
const gradeOrder = ["A", "B", "C", "D", "F"];
|
|
223
|
+
const minIdx = gradeOrder.indexOf(minGrade.toUpperCase());
|
|
224
|
+
if (minIdx >= 0)
|
|
225
|
+
filtered = results.filter((r) => gradeOrder.indexOf(r.grade) >= minIdx);
|
|
226
|
+
}
|
|
227
|
+
filtered.sort((a, b) => a.overallScore - b.overallScore);
|
|
228
|
+
if (format === "json") {
|
|
229
|
+
console.log(JSON.stringify({ files: filtered, scannedFiles: files.length, timestamp: new Date().toISOString() }, null, 2));
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
const avgScore = results.length > 0 ? Math.round(results.reduce((s, r) => s + r.overallScore, 0) / results.length) : 0;
|
|
233
|
+
console.log(`\n Clarity Score — ${files.length} files`);
|
|
234
|
+
console.log(` Average: ${avgScore}/100 (${grade(avgScore)})\n ──────────────────────────`);
|
|
235
|
+
if (filtered.length === 0) {
|
|
236
|
+
console.log(` ✅ All files meet clarity threshold\n`);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
for (const r of filtered.slice(0, 20)) {
|
|
240
|
+
const icon = r.grade === "A" ? "🟢" : r.grade === "B" ? "🟢" : r.grade === "C" ? "🟡" : r.grade === "D" ? "🟠" : "🔴";
|
|
241
|
+
console.log(`\n ${icon} ${r.file} — ${r.overallScore}/100 (${r.grade})`);
|
|
242
|
+
for (const m of r.metrics) {
|
|
243
|
+
const mIcon = m.score >= 70 ? "✓" : m.score >= 40 ? "~" : "✗";
|
|
244
|
+
console.log(` ${mIcon} ${m.label.padEnd(20)} ${String(m.score).padEnd(4)} ${m.detail || ""}`);
|
|
245
|
+
}
|
|
246
|
+
if (r.suggestions.length > 0) {
|
|
247
|
+
console.log(` Suggestions:`);
|
|
248
|
+
for (const s of r.suggestions)
|
|
249
|
+
console.log(` → ${s}`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (filtered.length > 20)
|
|
253
|
+
console.log(` ... and ${filtered.length - 20} more files`);
|
|
254
|
+
// Grade distribution
|
|
255
|
+
const dist = { A: 0, B: 0, C: 0, D: 0, F: 0 };
|
|
256
|
+
for (const r of results)
|
|
257
|
+
dist[r.grade]++;
|
|
258
|
+
console.log(`\n Distribution: A:${dist.A} B:${dist.B} C:${dist.C} D:${dist.D} F:${dist.F}\n`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=clarity-score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clarity-score.js","sourceRoot":"","sources":["../../src/commands/clarity-score.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hallucination score — assign a hallucination risk score (0–100)
|
|
3
|
+
* to AI-generated code based on detected patterns: generic naming,
|
|
4
|
+
* suspicious imports, implausible logic, unverified API usage.
|
|
5
|
+
*
|
|
6
|
+
* All analysis local.
|
|
7
|
+
*/
|
|
8
|
+
export declare function runHallucinationScore(argv: string[]): void;
|
|
9
|
+
//# sourceMappingURL=hallucination-score.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hallucination-score.d.ts","sourceRoot":"","sources":["../../src/commands/hallucination-score.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA8PH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmG1D"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hallucination score — assign a hallucination risk score (0–100)
|
|
3
|
+
* to AI-generated code based on detected patterns: generic naming,
|
|
4
|
+
* suspicious imports, implausible logic, unverified API usage.
|
|
5
|
+
*
|
|
6
|
+
* All analysis local.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync, readdirSync } from "fs";
|
|
9
|
+
import { join, extname } from "path";
|
|
10
|
+
// ─── Detectors ──────────────────────────────────────────────────────────────
|
|
11
|
+
function detectHallucinationSignals(content, lines) {
|
|
12
|
+
const signals = [];
|
|
13
|
+
// 1. Non-existent or suspicious imports
|
|
14
|
+
const importLines = lines
|
|
15
|
+
.map((l, i) => ({ line: i + 1, text: l }))
|
|
16
|
+
.filter((l) => /\bimport\s|require\s*\(/.test(l.text));
|
|
17
|
+
for (const imp of importLines) {
|
|
18
|
+
// Suspicious package names (very generic or implausible)
|
|
19
|
+
if (/["'](?:utils|helpers|common|shared|lib|core|base)["']/.test(imp.text) && !/from\s*["']\./.test(imp.text)) {
|
|
20
|
+
signals.push({
|
|
21
|
+
id: "suspicious-import",
|
|
22
|
+
description: "Generic import name — may reference non-existent package",
|
|
23
|
+
weight: 15,
|
|
24
|
+
line: imp.line,
|
|
25
|
+
evidence: imp.text.trim(),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
// Version-specific imports (hallucinated API paths)
|
|
29
|
+
if (/["'][^"']+\/v\d+\/[^"']+["']/.test(imp.text)) {
|
|
30
|
+
signals.push({
|
|
31
|
+
id: "versioned-import-path",
|
|
32
|
+
description: "Version-specific import path — verify API exists",
|
|
33
|
+
weight: 10,
|
|
34
|
+
line: imp.line,
|
|
35
|
+
evidence: imp.text.trim(),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// 2. Generic/placeholder variable names
|
|
40
|
+
let genericNames = 0;
|
|
41
|
+
for (let i = 0; i < lines.length; i++) {
|
|
42
|
+
if (/\b(?:const|let|var)\s+(?:data|result|value|item|thing|stuff|temp|tmp|foo|bar|baz|x|y|z)\s*[=:]/.test(lines[i])) {
|
|
43
|
+
genericNames++;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (genericNames > 3) {
|
|
47
|
+
signals.push({
|
|
48
|
+
id: "generic-naming",
|
|
49
|
+
description: `${genericNames} generic variable names — AI may have generated placeholder code`,
|
|
50
|
+
weight: 10,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
// 3. TODO/FIXME comments left by AI
|
|
54
|
+
let todoCount = 0;
|
|
55
|
+
for (let i = 0; i < lines.length; i++) {
|
|
56
|
+
if (/\/\/\s*(?:TODO|FIXME|HACK|XXX|PLACEHOLDER)/i.test(lines[i])) {
|
|
57
|
+
todoCount++;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (todoCount > 2) {
|
|
61
|
+
signals.push({
|
|
62
|
+
id: "excessive-todos",
|
|
63
|
+
description: `${todoCount} TODO/FIXME comments — AI left implementation gaps`,
|
|
64
|
+
weight: 20,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
// 4. Unreachable or dead code patterns
|
|
68
|
+
for (let i = 0; i < lines.length; i++) {
|
|
69
|
+
if (/\breturn\b/.test(lines[i]) &&
|
|
70
|
+
i + 1 < lines.length &&
|
|
71
|
+
/^\s*\S/.test(lines[i + 1]) &&
|
|
72
|
+
!/^\s*[}\])]/.test(lines[i + 1]) &&
|
|
73
|
+
!/^\s*(?:case|default|\/\/|\/?\*)/.test(lines[i + 1])) {
|
|
74
|
+
signals.push({
|
|
75
|
+
id: "dead-code",
|
|
76
|
+
description: "Code after return statement — likely hallucinated",
|
|
77
|
+
weight: 15,
|
|
78
|
+
line: i + 2,
|
|
79
|
+
evidence: lines[i + 1].trim().substring(0, 60),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// 5. Contradictory logic
|
|
84
|
+
for (let i = 0; i < lines.length; i++) {
|
|
85
|
+
if (/if\s*\(\s*true\s*\)|if\s*\(\s*false\s*\)/.test(lines[i])) {
|
|
86
|
+
signals.push({
|
|
87
|
+
id: "tautology",
|
|
88
|
+
description: "Tautological condition (always true/false)",
|
|
89
|
+
weight: 20,
|
|
90
|
+
line: i + 1,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (/=\s*null.*\.\w+|=\s*undefined.*\.\w+/.test(lines[i])) {
|
|
94
|
+
signals.push({
|
|
95
|
+
id: "null-access",
|
|
96
|
+
description: "Property access on value just assigned null/undefined",
|
|
97
|
+
weight: 25,
|
|
98
|
+
line: i + 1,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// 6. Copy-paste artifacts
|
|
103
|
+
const lineSet = new Map();
|
|
104
|
+
for (let i = 0; i < lines.length; i++) {
|
|
105
|
+
const trimmed = lines[i].trim();
|
|
106
|
+
if (trimmed.length > 20) {
|
|
107
|
+
if (!lineSet.has(trimmed))
|
|
108
|
+
lineSet.set(trimmed, []);
|
|
109
|
+
lineSet.get(trimmed).push(i + 1);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
let duplicateBlocks = 0;
|
|
113
|
+
for (const [, lineNums] of lineSet) {
|
|
114
|
+
if (lineNums.length >= 3)
|
|
115
|
+
duplicateBlocks++;
|
|
116
|
+
}
|
|
117
|
+
if (duplicateBlocks > 2) {
|
|
118
|
+
signals.push({
|
|
119
|
+
id: "copy-paste-artifact",
|
|
120
|
+
description: `${duplicateBlocks} repeated code blocks — AI may have duplicated patterns`,
|
|
121
|
+
weight: 15,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// 7. Magic numbers/strings
|
|
125
|
+
let magicCount = 0;
|
|
126
|
+
for (let i = 0; i < lines.length; i++) {
|
|
127
|
+
if (/\b(?:0x[0-9a-f]{4,}|\d{5,})\b/i.test(lines[i]) && !/\bconst\b/.test(lines[i]) && !/\/\//.test(lines[i])) {
|
|
128
|
+
magicCount++;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (magicCount > 3) {
|
|
132
|
+
signals.push({
|
|
133
|
+
id: "magic-numbers",
|
|
134
|
+
description: `${magicCount} unexplained magic numbers — AI may have hallucinated constants`,
|
|
135
|
+
weight: 10,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// 8. Inconsistent error handling
|
|
139
|
+
const tryCatchCount = (content.match(/\btry\s*{/g) || []).length;
|
|
140
|
+
const catchCount = (content.match(/\bcatch\s*\(/g) || []).length;
|
|
141
|
+
const emptyHandlers = (content.match(/catch\s*\([^)]*\)\s*{\s*}/g) || []).length;
|
|
142
|
+
if (emptyHandlers > 0) {
|
|
143
|
+
signals.push({
|
|
144
|
+
id: "empty-catch",
|
|
145
|
+
description: `${emptyHandlers} empty catch block(s) — errors silently swallowed`,
|
|
146
|
+
weight: 15,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
if (tryCatchCount > 0 && catchCount < tryCatchCount) {
|
|
150
|
+
signals.push({
|
|
151
|
+
id: "unmatched-try",
|
|
152
|
+
description: "More try blocks than catch blocks — incomplete error handling",
|
|
153
|
+
weight: 10,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
// 9. Commented-out code (AI artifact)
|
|
157
|
+
let commentedCode = 0;
|
|
158
|
+
for (let i = 0; i < lines.length; i++) {
|
|
159
|
+
if (/^\s*\/\/\s*(?:const|let|var|function|class|import|return|if|for|while)\b/.test(lines[i])) {
|
|
160
|
+
commentedCode++;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (commentedCode > 3) {
|
|
164
|
+
signals.push({
|
|
165
|
+
id: "commented-code",
|
|
166
|
+
description: `${commentedCode} lines of commented-out code — AI left alternative implementations`,
|
|
167
|
+
weight: 10,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// 10. Functions with no implementation
|
|
171
|
+
for (let i = 0; i < lines.length; i++) {
|
|
172
|
+
if (/\bfunction\s+\w+\s*\([^)]*\)\s*{\s*}/.test(lines[i]) || /=>\s*{\s*}/.test(lines[i])) {
|
|
173
|
+
signals.push({
|
|
174
|
+
id: "empty-function",
|
|
175
|
+
description: "Empty function body — stub not implemented",
|
|
176
|
+
weight: 20,
|
|
177
|
+
line: i + 1,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return signals;
|
|
182
|
+
}
|
|
183
|
+
// ─── Scanner ────────────────────────────────────────────────────────────────
|
|
184
|
+
const SKIP = new Set(["node_modules", ".git", "dist", "build", "coverage"]);
|
|
185
|
+
const EXTS = new Set([".ts", ".js", ".py", ".java", ".cs", ".go", ".rb", ".php", ".rs", ".swift", ".kt"]);
|
|
186
|
+
function collectFiles(dir) {
|
|
187
|
+
const result = [];
|
|
188
|
+
function walk(d) {
|
|
189
|
+
let entries;
|
|
190
|
+
try {
|
|
191
|
+
entries = readdirSync(d);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
for (const name of entries) {
|
|
197
|
+
if (SKIP.has(name) || name.startsWith("."))
|
|
198
|
+
continue;
|
|
199
|
+
const full = join(d, name);
|
|
200
|
+
try {
|
|
201
|
+
const sub = readdirSync(full);
|
|
202
|
+
void sub;
|
|
203
|
+
walk(full);
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
if (EXTS.has(extname(name).toLowerCase()))
|
|
207
|
+
result.push(full);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
walk(dir);
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
function computeScore(signals) {
|
|
215
|
+
const raw = signals.reduce((sum, s) => sum + s.weight, 0);
|
|
216
|
+
return Math.min(100, raw);
|
|
217
|
+
}
|
|
218
|
+
function riskLevel(score) {
|
|
219
|
+
if (score >= 70)
|
|
220
|
+
return "critical";
|
|
221
|
+
if (score >= 45)
|
|
222
|
+
return "high";
|
|
223
|
+
if (score >= 20)
|
|
224
|
+
return "medium";
|
|
225
|
+
return "low";
|
|
226
|
+
}
|
|
227
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
228
|
+
export function runHallucinationScore(argv) {
|
|
229
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
230
|
+
console.log(`
|
|
231
|
+
judges hallucination-score — Assess hallucination risk in AI-generated code
|
|
232
|
+
|
|
233
|
+
Usage:
|
|
234
|
+
judges hallucination-score <file-or-dir>
|
|
235
|
+
judges hallucination-score src/ --min-risk medium
|
|
236
|
+
|
|
237
|
+
Options:
|
|
238
|
+
--min-risk <level> Only show files at or above this risk (low, medium, high, critical)
|
|
239
|
+
--format json JSON output
|
|
240
|
+
--help, -h Show this help
|
|
241
|
+
|
|
242
|
+
Signals detected:
|
|
243
|
+
• Suspicious/non-existent imports
|
|
244
|
+
• Generic placeholder naming
|
|
245
|
+
• Excessive TODO/FIXME comments
|
|
246
|
+
• Dead code after return statements
|
|
247
|
+
• Tautological conditions
|
|
248
|
+
• Copy-paste artifacts
|
|
249
|
+
• Magic numbers
|
|
250
|
+
• Empty catch blocks
|
|
251
|
+
• Commented-out code
|
|
252
|
+
• Empty function stubs
|
|
253
|
+
`);
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
257
|
+
const minRisk = argv.find((_a, i) => argv[i - 1] === "--min-risk");
|
|
258
|
+
const target = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--")) || ".";
|
|
259
|
+
if (!existsSync(target)) {
|
|
260
|
+
console.error(` Path not found: ${target}`);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
let files;
|
|
264
|
+
try {
|
|
265
|
+
readdirSync(target);
|
|
266
|
+
files = collectFiles(target);
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
files = [target];
|
|
270
|
+
}
|
|
271
|
+
const scored = [];
|
|
272
|
+
for (const f of files) {
|
|
273
|
+
let content;
|
|
274
|
+
try {
|
|
275
|
+
content = readFileSync(f, "utf-8");
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
const lines = content.split("\n");
|
|
281
|
+
const signals = detectHallucinationSignals(content, lines);
|
|
282
|
+
const score = computeScore(signals);
|
|
283
|
+
scored.push({ file: f, score, riskLevel: riskLevel(score), signals });
|
|
284
|
+
}
|
|
285
|
+
let filtered = scored;
|
|
286
|
+
if (minRisk) {
|
|
287
|
+
const order = ["low", "medium", "high", "critical"];
|
|
288
|
+
const minIdx = order.indexOf(minRisk);
|
|
289
|
+
if (minIdx >= 0)
|
|
290
|
+
filtered = scored.filter((s) => order.indexOf(s.riskLevel) >= minIdx);
|
|
291
|
+
}
|
|
292
|
+
filtered.sort((a, b) => b.score - a.score);
|
|
293
|
+
if (format === "json") {
|
|
294
|
+
console.log(JSON.stringify({ files: filtered, scannedFiles: files.length, timestamp: new Date().toISOString() }, null, 2));
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
console.log(`\n Hallucination Risk Assessment — ${files.length} files`);
|
|
298
|
+
console.log(` ──────────────────────────`);
|
|
299
|
+
if (filtered.length === 0) {
|
|
300
|
+
console.log(` ✅ No hallucination risks above threshold\n`);
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
for (const f of filtered.slice(0, 20)) {
|
|
304
|
+
const icon = f.riskLevel === "critical" ? "🔴" : f.riskLevel === "high" ? "🟠" : f.riskLevel === "medium" ? "🟡" : "🟢";
|
|
305
|
+
console.log(`\n ${icon} ${f.file} — Score: ${f.score}/100 (${f.riskLevel})`);
|
|
306
|
+
for (const s of f.signals) {
|
|
307
|
+
console.log(` • ${s.description}${s.line ? ` (line ${s.line})` : ""}`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if (filtered.length > 20)
|
|
311
|
+
console.log(` ... and ${filtered.length - 20} more files`);
|
|
312
|
+
const avgScore = Math.round(filtered.reduce((sum, f) => sum + f.score, 0) / filtered.length);
|
|
313
|
+
console.log(`\n Average risk score: ${avgScore}/100`);
|
|
314
|
+
console.log(` Critical: ${filtered.filter((f) => f.riskLevel === "critical").length} | High: ${filtered.filter((f) => f.riskLevel === "high").length} | Medium: ${filtered.filter((f) => f.riskLevel === "medium").length} | Low: ${filtered.filter((f) => f.riskLevel === "low").length}\n`);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=hallucination-score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hallucination-score.js","sourceRoot":"","sources":["../../src/commands/hallucination-score.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test suggest — analyze AI-generated code and suggest specific
|
|
3
|
+
* test scenarios (edge cases, error paths, boundary conditions)
|
|
4
|
+
* that the code likely missed.
|
|
5
|
+
*
|
|
6
|
+
* All analysis local.
|
|
7
|
+
*/
|
|
8
|
+
export declare function runTestSuggest(argv: string[]): void;
|
|
9
|
+
//# sourceMappingURL=test-suggest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-suggest.d.ts","sourceRoot":"","sources":["../../src/commands/test-suggest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0MH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8FnD"}
|