@kevinrabun/judges 3.51.0 → 3.53.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/chat-notify.d.ts +9 -0
- package/dist/commands/chat-notify.d.ts.map +1 -0
- package/dist/commands/chat-notify.js +259 -0
- package/dist/commands/chat-notify.js.map +1 -0
- package/dist/commands/code-similarity.d.ts +9 -0
- package/dist/commands/code-similarity.d.ts.map +1 -0
- package/dist/commands/code-similarity.js +232 -0
- package/dist/commands/code-similarity.js.map +1 -0
- package/dist/commands/compliance-weight.d.ts +9 -0
- package/dist/commands/compliance-weight.d.ts.map +1 -0
- package/dist/commands/compliance-weight.js +273 -0
- package/dist/commands/compliance-weight.js.map +1 -0
- package/dist/commands/cross-pr-regression.d.ts +9 -0
- package/dist/commands/cross-pr-regression.d.ts.map +1 -0
- package/dist/commands/cross-pr-regression.js +298 -0
- package/dist/commands/cross-pr-regression.js.map +1 -0
- package/dist/commands/design-audit.d.ts +9 -0
- package/dist/commands/design-audit.d.ts.map +1 -0
- package/dist/commands/design-audit.js +302 -0
- package/dist/commands/design-audit.js.map +1 -0
- package/dist/commands/doc-drift.d.ts +9 -0
- package/dist/commands/doc-drift.d.ts.map +1 -0
- package/dist/commands/doc-drift.js +259 -0
- package/dist/commands/doc-drift.js.map +1 -0
- package/dist/commands/exception-consistency.d.ts +7 -0
- package/dist/commands/exception-consistency.d.ts.map +1 -0
- package/dist/commands/exception-consistency.js +193 -0
- package/dist/commands/exception-consistency.js.map +1 -0
- package/dist/commands/impact-scan.d.ts +9 -0
- package/dist/commands/impact-scan.d.ts.map +1 -0
- package/dist/commands/impact-scan.js +282 -0
- package/dist/commands/impact-scan.js.map +1 -0
- package/dist/commands/judge-learn.d.ts +9 -0
- package/dist/commands/judge-learn.d.ts.map +1 -0
- package/dist/commands/judge-learn.js +218 -0
- package/dist/commands/judge-learn.js.map +1 -0
- package/dist/commands/model-report.d.ts +9 -0
- package/dist/commands/model-report.d.ts.map +1 -0
- package/dist/commands/model-report.js +195 -0
- package/dist/commands/model-report.js.map +1 -0
- package/dist/commands/refactor-safety.d.ts +9 -0
- package/dist/commands/refactor-safety.d.ts.map +1 -0
- package/dist/commands/refactor-safety.js +274 -0
- package/dist/commands/refactor-safety.js.map +1 -0
- package/dist/commands/remediation-lib.d.ts +9 -0
- package/dist/commands/remediation-lib.d.ts.map +1 -0
- package/dist/commands/remediation-lib.js +266 -0
- package/dist/commands/remediation-lib.js.map +1 -0
- package/dist/commands/resource-cleanup.d.ts +7 -0
- package/dist/commands/resource-cleanup.d.ts.map +1 -0
- package/dist/commands/resource-cleanup.js +236 -0
- package/dist/commands/resource-cleanup.js.map +1 -0
- package/dist/commands/team-trust.d.ts +8 -0
- package/dist/commands/team-trust.d.ts.map +1 -0
- package/dist/commands/team-trust.js +175 -0
- package/dist/commands/team-trust.js.map +1 -0
- package/dist/commands/trust-adaptive.d.ts +9 -0
- package/dist/commands/trust-adaptive.d.ts.map +1 -0
- package/dist/commands/trust-adaptive.js +194 -0
- package/dist/commands/trust-adaptive.js.map +1 -0
- package/dist/commands/watch-judge.d.ts +8 -0
- package/dist/commands/watch-judge.d.ts.map +1 -0
- package/dist/commands/watch-judge.js +180 -0
- package/dist/commands/watch-judge.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design audit — detect AI-generated code that breaks project
|
|
3
|
+
* conventions, introduces unnecessary abstractions, or creates
|
|
4
|
+
* architectural deviation from the baseline.
|
|
5
|
+
*
|
|
6
|
+
* All analysis local.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync, readdirSync } from "fs";
|
|
9
|
+
import { join, extname, relative } from "path";
|
|
10
|
+
// ─── Analysers ──────────────────────────────────────────────────────────────
|
|
11
|
+
function analyzeDesignCoherence(content, _filePath, baselinePatterns) {
|
|
12
|
+
const lines = content.split("\n");
|
|
13
|
+
const metrics = [];
|
|
14
|
+
const issues = [];
|
|
15
|
+
// 1. Convention adherence — does file follow project patterns?
|
|
16
|
+
const usesProjectImportStyle = baselinePatterns.importStyle === "named" ? /import\s*{/.test(content) : /import\s+\w+\s+from/.test(content);
|
|
17
|
+
const conventionScore = usesProjectImportStyle ? 80 : 40;
|
|
18
|
+
metrics.push({ id: "convention", label: "Convention Adherence", score: conventionScore, weight: 20 });
|
|
19
|
+
if (conventionScore < 60)
|
|
20
|
+
issues.push({
|
|
21
|
+
id: "import-style",
|
|
22
|
+
label: "Import Style Deviation",
|
|
23
|
+
severity: "low",
|
|
24
|
+
detail: "Import style differs from project convention",
|
|
25
|
+
});
|
|
26
|
+
// 2. Unnecessary abstraction
|
|
27
|
+
const classCount = (content.match(/\bclass\s+\w+/g) || []).length;
|
|
28
|
+
const interfaceCount = (content.match(/\binterface\s+\w+/g) || []).length;
|
|
29
|
+
const abstractCount = (content.match(/\babstract\s+class/g) || []).length;
|
|
30
|
+
const singleMethodClasses = (content.match(/class\s+\w+[\s\S]*?{[\s\S]*?(\w+\s*\([\s\S]*?\)[\s\S]*?{[\s\S]*?})[\s\S]*?}/g) || []).length;
|
|
31
|
+
const overAbstraction = abstractCount > 1 || (classCount > 0 && singleMethodClasses === classCount);
|
|
32
|
+
const abstractionScore = overAbstraction ? 30 : classCount + interfaceCount > 8 ? 50 : 100;
|
|
33
|
+
metrics.push({
|
|
34
|
+
id: "abstraction",
|
|
35
|
+
label: "Abstraction Level",
|
|
36
|
+
score: abstractionScore,
|
|
37
|
+
weight: 20,
|
|
38
|
+
detail: `${classCount} classes, ${interfaceCount} interfaces, ${abstractCount} abstract`,
|
|
39
|
+
});
|
|
40
|
+
if (overAbstraction) {
|
|
41
|
+
issues.push({
|
|
42
|
+
id: "over-abstraction",
|
|
43
|
+
label: "Over-Abstraction",
|
|
44
|
+
severity: "medium",
|
|
45
|
+
detail: "Excessive abstraction layers — AI often creates unnecessary wrappers",
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// 3. Orphaned dependencies
|
|
49
|
+
const imports = content.match(/import\s+(?:{[^}]+}|\w+)\s+from\s+["']([^"']+)["']/g) || [];
|
|
50
|
+
const unusedImportCount = imports.filter((imp) => {
|
|
51
|
+
const names = imp
|
|
52
|
+
.match(/import\s+{([^}]+)}/)?.[1]
|
|
53
|
+
?.split(",")
|
|
54
|
+
.map((s) => s
|
|
55
|
+
.trim()
|
|
56
|
+
.split(/\s+as\s+/)
|
|
57
|
+
.pop()
|
|
58
|
+
?.trim()) || [];
|
|
59
|
+
const defaultName = imp.match(/import\s+(\w+)\s+from/)?.[1];
|
|
60
|
+
const allNames = [...names, defaultName].filter(Boolean);
|
|
61
|
+
const afterImport = content.slice(content.indexOf(imp) + imp.length);
|
|
62
|
+
return allNames.some((n) => !new RegExp(`\\b${n}\\b`).test(afterImport));
|
|
63
|
+
}).length;
|
|
64
|
+
const orphanScore = unusedImportCount === 0 ? 100 : unusedImportCount <= 2 ? 60 : 30;
|
|
65
|
+
metrics.push({
|
|
66
|
+
id: "orphaned-deps",
|
|
67
|
+
label: "Dependency Hygiene",
|
|
68
|
+
score: orphanScore,
|
|
69
|
+
weight: 15,
|
|
70
|
+
detail: `${unusedImportCount} potentially unused imports`,
|
|
71
|
+
});
|
|
72
|
+
if (unusedImportCount > 0) {
|
|
73
|
+
issues.push({
|
|
74
|
+
id: "unused-imports",
|
|
75
|
+
label: "Orphaned Imports",
|
|
76
|
+
severity: "low",
|
|
77
|
+
detail: `${unusedImportCount} import(s) may be unused — common AI-generation artifact`,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// 4. Pattern consistency
|
|
81
|
+
const usesCallbacks = /\bcallback\b|\.then\(|function\s*\(err/.test(content);
|
|
82
|
+
const usesAsync = /\basync\b.*\bawait\b/s.test(content);
|
|
83
|
+
const usesPromise = /new\s+Promise/.test(content);
|
|
84
|
+
const asyncPatterns = [usesCallbacks, usesAsync, usesPromise].filter(Boolean).length;
|
|
85
|
+
const patternScore = asyncPatterns <= 1 ? 100 : asyncPatterns === 2 ? 60 : 30;
|
|
86
|
+
metrics.push({ id: "pattern-consistency", label: "Pattern Consistency", score: patternScore, weight: 15 });
|
|
87
|
+
if (asyncPatterns > 1) {
|
|
88
|
+
issues.push({
|
|
89
|
+
id: "mixed-async",
|
|
90
|
+
label: "Mixed Async Patterns",
|
|
91
|
+
severity: "medium",
|
|
92
|
+
detail: "Mixes callbacks, async/await, and/or raw Promises — pick one style",
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// 5. Error handling consistency
|
|
96
|
+
const tryCatchCount = (content.match(/\btry\s*{/g) || []).length;
|
|
97
|
+
const catchSuppressCount = (content.match(/catch\s*\([^)]*\)\s*{\s*}/g) || []).length;
|
|
98
|
+
const throwCount = (content.match(/\bthrow\s+/g) || []).length;
|
|
99
|
+
const errorScore = catchSuppressCount === 0 ? 100 : catchSuppressCount <= 1 ? 70 : 30;
|
|
100
|
+
metrics.push({
|
|
101
|
+
id: "error-handling",
|
|
102
|
+
label: "Error Handling",
|
|
103
|
+
score: errorScore,
|
|
104
|
+
weight: 15,
|
|
105
|
+
detail: `${tryCatchCount} try/catch, ${catchSuppressCount} suppressed, ${throwCount} throws`,
|
|
106
|
+
});
|
|
107
|
+
if (catchSuppressCount > 0) {
|
|
108
|
+
issues.push({
|
|
109
|
+
id: "suppressed-errors",
|
|
110
|
+
label: "Suppressed Errors",
|
|
111
|
+
severity: "high",
|
|
112
|
+
detail: `${catchSuppressCount} empty catch block(s) — errors silently swallowed`,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
// 6. Naming coherence
|
|
116
|
+
const camelCase = (content.match(/\b[a-z][a-zA-Z0-9]*[A-Z][a-zA-Z0-9]*/g) || []).length;
|
|
117
|
+
const snakeCase = (content.match(/\b[a-z]+_[a-z]+/g) || []).length;
|
|
118
|
+
const mixedNaming = camelCase > 0 && snakeCase > 0;
|
|
119
|
+
const namingScore = mixedNaming ? (Math.abs(camelCase - snakeCase) > 5 ? 50 : 30) : 100;
|
|
120
|
+
metrics.push({ id: "naming-coherence", label: "Naming Coherence", score: namingScore, weight: 15 });
|
|
121
|
+
if (mixedNaming) {
|
|
122
|
+
issues.push({
|
|
123
|
+
id: "mixed-naming",
|
|
124
|
+
label: "Mixed Naming Convention",
|
|
125
|
+
severity: "low",
|
|
126
|
+
detail: `${camelCase} camelCase + ${snakeCase} snake_case identifiers`,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
void lines;
|
|
130
|
+
return { metrics, issues };
|
|
131
|
+
}
|
|
132
|
+
function detectBaseline(files) {
|
|
133
|
+
let namedCount = 0;
|
|
134
|
+
let defaultCount = 0;
|
|
135
|
+
let totalLength = 0;
|
|
136
|
+
let asyncCount = 0;
|
|
137
|
+
let callbackCount = 0;
|
|
138
|
+
for (const f of files.slice(0, 20)) {
|
|
139
|
+
try {
|
|
140
|
+
const content = readFileSync(f, "utf-8");
|
|
141
|
+
totalLength += content.split("\n").length;
|
|
142
|
+
namedCount += (content.match(/import\s*{/g) || []).length;
|
|
143
|
+
defaultCount += (content.match(/import\s+\w+\s+from/g) || []).length;
|
|
144
|
+
if (/\basync\b/.test(content))
|
|
145
|
+
asyncCount++;
|
|
146
|
+
if (/\.then\(/.test(content))
|
|
147
|
+
callbackCount++;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
/* skip */
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
importStyle: namedCount >= defaultCount ? "named" : "default",
|
|
155
|
+
avgFileLength: files.length > 0 ? Math.round(totalLength / Math.min(files.length, 20)) : 0,
|
|
156
|
+
primaryAsyncPattern: asyncCount >= callbackCount ? "async/await" : "callbacks",
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
// ─── Scanner ────────────────────────────────────────────────────────────────
|
|
160
|
+
const SKIP = new Set(["node_modules", ".git", "dist", "build", "coverage"]);
|
|
161
|
+
const EXTS = new Set([".ts", ".js", ".py", ".java", ".cs", ".go", ".rb", ".php", ".rs"]);
|
|
162
|
+
function collectFiles(dir) {
|
|
163
|
+
const result = [];
|
|
164
|
+
function walk(d) {
|
|
165
|
+
let entries;
|
|
166
|
+
try {
|
|
167
|
+
entries = readdirSync(d);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
for (const name of entries) {
|
|
173
|
+
if (SKIP.has(name) || name.startsWith("."))
|
|
174
|
+
continue;
|
|
175
|
+
const full = join(d, name);
|
|
176
|
+
try {
|
|
177
|
+
const sub = readdirSync(full);
|
|
178
|
+
void sub;
|
|
179
|
+
walk(full);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
if (EXTS.has(extname(name).toLowerCase()))
|
|
183
|
+
result.push(full);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
walk(dir);
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
function gradeFor(score) {
|
|
191
|
+
if (score >= 90)
|
|
192
|
+
return "A";
|
|
193
|
+
if (score >= 80)
|
|
194
|
+
return "B";
|
|
195
|
+
if (score >= 70)
|
|
196
|
+
return "C";
|
|
197
|
+
if (score >= 60)
|
|
198
|
+
return "D";
|
|
199
|
+
return "F";
|
|
200
|
+
}
|
|
201
|
+
function computeOverall(metrics) {
|
|
202
|
+
const totalWeight = metrics.reduce((s, m) => s + m.weight, 0);
|
|
203
|
+
const weighted = metrics.reduce((s, m) => s + m.score * m.weight, 0);
|
|
204
|
+
return totalWeight > 0 ? Math.round(weighted / totalWeight) : 0;
|
|
205
|
+
}
|
|
206
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
207
|
+
export function runDesignAudit(argv) {
|
|
208
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
209
|
+
console.log(`
|
|
210
|
+
judges design-audit — Detect code that breaks project conventions
|
|
211
|
+
|
|
212
|
+
Usage:
|
|
213
|
+
judges design-audit <file-or-dir>
|
|
214
|
+
judges design-audit src/ --min-grade C
|
|
215
|
+
|
|
216
|
+
Options:
|
|
217
|
+
--min-grade <A-F> Only show files at or below this grade
|
|
218
|
+
--format json JSON output
|
|
219
|
+
--help, -h Show this help
|
|
220
|
+
|
|
221
|
+
Checks:
|
|
222
|
+
• Convention adherence (import style, project patterns)
|
|
223
|
+
• Abstraction level (over-engineering, unnecessary wrappers)
|
|
224
|
+
• Dependency hygiene (orphaned/unused imports)
|
|
225
|
+
• Pattern consistency (mixed async styles)
|
|
226
|
+
• Error handling (suppressed errors, empty catch blocks)
|
|
227
|
+
• Naming coherence (mixed camelCase/snake_case)
|
|
228
|
+
`);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
232
|
+
const minGrade = argv.find((_a, i) => argv[i - 1] === "--min-grade");
|
|
233
|
+
const target = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--")) || ".";
|
|
234
|
+
if (!existsSync(target)) {
|
|
235
|
+
console.error(` Path not found: ${target}`);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
let files;
|
|
239
|
+
try {
|
|
240
|
+
readdirSync(target);
|
|
241
|
+
files = collectFiles(target);
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
files = [target];
|
|
245
|
+
}
|
|
246
|
+
const baseline = detectBaseline(files);
|
|
247
|
+
const results = [];
|
|
248
|
+
for (const f of files) {
|
|
249
|
+
let content;
|
|
250
|
+
try {
|
|
251
|
+
content = readFileSync(f, "utf-8");
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
const { metrics, issues } = analyzeDesignCoherence(content, f, baseline);
|
|
257
|
+
const overall = computeOverall(metrics);
|
|
258
|
+
results.push({ file: relative(target, f) || f, overallScore: overall, grade: gradeFor(overall), metrics, issues });
|
|
259
|
+
}
|
|
260
|
+
let filtered = results;
|
|
261
|
+
if (minGrade) {
|
|
262
|
+
const gradeOrder = ["A", "B", "C", "D", "F"];
|
|
263
|
+
const minIdx = gradeOrder.indexOf(minGrade.toUpperCase());
|
|
264
|
+
if (minIdx >= 0)
|
|
265
|
+
filtered = results.filter((r) => gradeOrder.indexOf(r.grade) >= minIdx);
|
|
266
|
+
}
|
|
267
|
+
filtered.sort((a, b) => a.overallScore - b.overallScore);
|
|
268
|
+
if (format === "json") {
|
|
269
|
+
console.log(JSON.stringify({ files: filtered, baseline, scannedFiles: files.length, timestamp: new Date().toISOString() }, null, 2));
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
const avgScore = results.length > 0 ? Math.round(results.reduce((s, r) => s + r.overallScore, 0) / results.length) : 0;
|
|
273
|
+
console.log(`\n Design Coherence Audit — ${files.length} files`);
|
|
274
|
+
console.log(` Average: ${avgScore}/100 (${gradeFor(avgScore)})`);
|
|
275
|
+
console.log(` Baseline: ${baseline.importStyle} imports, ${baseline.primaryAsyncPattern}, ~${baseline.avgFileLength} lines/file\n ──────────────────────────`);
|
|
276
|
+
if (filtered.length === 0) {
|
|
277
|
+
console.log(` ✅ All files meet design coherence threshold\n`);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
for (const r of filtered.slice(0, 20)) {
|
|
281
|
+
const icon = r.grade === "A" || r.grade === "B" ? "🟢" : r.grade === "C" ? "🟡" : r.grade === "D" ? "🟠" : "🔴";
|
|
282
|
+
console.log(`\n ${icon} ${r.file} — ${r.overallScore}/100 (${r.grade})`);
|
|
283
|
+
for (const m of r.metrics) {
|
|
284
|
+
const mIcon = m.score >= 70 ? "✓" : m.score >= 40 ? "~" : "✗";
|
|
285
|
+
console.log(` ${mIcon} ${m.label.padEnd(24)} ${String(m.score).padEnd(4)} ${m.detail || ""}`);
|
|
286
|
+
}
|
|
287
|
+
if (r.issues.length > 0) {
|
|
288
|
+
for (const iss of r.issues) {
|
|
289
|
+
const sev = iss.severity === "high" ? "🔴" : iss.severity === "medium" ? "🟠" : "🟡";
|
|
290
|
+
console.log(` ${sev} ${iss.detail}`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (filtered.length > 20)
|
|
295
|
+
console.log(` ... and ${filtered.length - 20} more files`);
|
|
296
|
+
const dist = { A: 0, B: 0, C: 0, D: 0, F: 0 };
|
|
297
|
+
for (const r of results)
|
|
298
|
+
dist[r.grade]++;
|
|
299
|
+
console.log(`\n Distribution: A:${dist.A} B:${dist.B} C:${dist.C} D:${dist.D} F:${dist.F}\n`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=design-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-audit.js","sourceRoot":"","sources":["../../src/commands/design-audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doc drift — detect when inline comments, docstrings, and type
|
|
3
|
+
* annotations contradict the actual code behavior. A critical
|
|
4
|
+
* AI-generation problem where docs are written separately.
|
|
5
|
+
*
|
|
6
|
+
* All analysis local.
|
|
7
|
+
*/
|
|
8
|
+
export declare function runDocDrift(argv: string[]): void;
|
|
9
|
+
//# sourceMappingURL=doc-drift.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-drift.d.ts","sourceRoot":"","sources":["../../src/commands/doc-drift.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuMH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyFhD"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doc drift — detect when inline comments, docstrings, and type
|
|
3
|
+
* annotations contradict the actual code behavior. A critical
|
|
4
|
+
* AI-generation problem where docs are written separately.
|
|
5
|
+
*
|
|
6
|
+
* All analysis local.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync, readdirSync } from "fs";
|
|
9
|
+
import { join, extname, relative } from "path";
|
|
10
|
+
// ─── Analysis ───────────────────────────────────────────────────────────────
|
|
11
|
+
function analyzeDrift(content) {
|
|
12
|
+
const lines = content.split("\n");
|
|
13
|
+
const issues = [];
|
|
14
|
+
for (let i = 0; i < lines.length; i++) {
|
|
15
|
+
const line = lines[i];
|
|
16
|
+
const nextLine = lines[i + 1] || "";
|
|
17
|
+
// 1. JSDoc @param mismatch
|
|
18
|
+
const paramMatch = line.match(/@param\s+(?:{[^}]+}\s+)?(\w+)/);
|
|
19
|
+
if (paramMatch) {
|
|
20
|
+
const paramName = paramMatch[1];
|
|
21
|
+
// Look ahead for function signature
|
|
22
|
+
for (let j = i + 1; j < Math.min(i + 5, lines.length); j++) {
|
|
23
|
+
const fnMatch = lines[j].match(/(?:function\s+\w+|(?:const|let)\s+\w+\s*=\s*(?:async\s*)?\(|^\s*(?:async\s*)?\()\s*([^)]*)\)/);
|
|
24
|
+
if (fnMatch) {
|
|
25
|
+
const params = fnMatch[1];
|
|
26
|
+
if (params && !params.includes(paramName)) {
|
|
27
|
+
issues.push({
|
|
28
|
+
line: i + 1,
|
|
29
|
+
type: "param-mismatch",
|
|
30
|
+
severity: "high",
|
|
31
|
+
detail: `@param "${paramName}" not found in function signature`,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// 2. @returns but function has no return
|
|
39
|
+
if (/@returns?\s/.test(line)) {
|
|
40
|
+
let fnBodyStart = -1;
|
|
41
|
+
for (let j = i + 1; j < Math.min(i + 5, lines.length); j++) {
|
|
42
|
+
if (/{\s*$/.test(lines[j])) {
|
|
43
|
+
fnBodyStart = j;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (fnBodyStart >= 0) {
|
|
48
|
+
let depth = 0;
|
|
49
|
+
let hasReturn = false;
|
|
50
|
+
for (let j = fnBodyStart; j < lines.length; j++) {
|
|
51
|
+
depth += (lines[j].match(/{/g) || []).length;
|
|
52
|
+
depth -= (lines[j].match(/}/g) || []).length;
|
|
53
|
+
if (/\breturn\s+\S/.test(lines[j]))
|
|
54
|
+
hasReturn = true;
|
|
55
|
+
if (depth <= 0)
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
if (!hasReturn) {
|
|
59
|
+
issues.push({
|
|
60
|
+
line: i + 1,
|
|
61
|
+
type: "return-mismatch",
|
|
62
|
+
severity: "high",
|
|
63
|
+
detail: "@returns documented but function has no return value",
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// 3. Comment references wrong function/variable name
|
|
69
|
+
const commentMatch = line.match(/\/\/\s*(?:calls?|uses?|invokes?|sets?|gets?)\s+(\w+)/i);
|
|
70
|
+
if (commentMatch) {
|
|
71
|
+
const refName = commentMatch[1];
|
|
72
|
+
if (refName.length > 2 &&
|
|
73
|
+
!content.includes(`function ${refName}`) &&
|
|
74
|
+
!content.includes(`const ${refName}`) &&
|
|
75
|
+
!content.includes(`let ${refName}`) &&
|
|
76
|
+
!content.includes(`.${refName}`)) {
|
|
77
|
+
issues.push({
|
|
78
|
+
line: i + 1,
|
|
79
|
+
type: "wrong-name",
|
|
80
|
+
severity: "medium",
|
|
81
|
+
detail: `Comment references "${refName}" which doesn't exist in this file`,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// 4. Comment says "returns X" but next line does something else
|
|
86
|
+
const returnsComment = line.match(/\/\/\s*returns?\s+(true|false|null|undefined|void|nothing|\d+|an?\s+\w+)/i);
|
|
87
|
+
if (returnsComment && /\breturn\b/.test(nextLine)) {
|
|
88
|
+
const claimed = returnsComment[1].toLowerCase();
|
|
89
|
+
if (claimed === "true" && !nextLine.includes("true")) {
|
|
90
|
+
issues.push({
|
|
91
|
+
line: i + 1,
|
|
92
|
+
type: "stale-comment",
|
|
93
|
+
severity: "medium",
|
|
94
|
+
detail: `Comment says "returns true" but return statement differs`,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
else if (claimed === "false" && !nextLine.includes("false")) {
|
|
98
|
+
issues.push({
|
|
99
|
+
line: i + 1,
|
|
100
|
+
type: "stale-comment",
|
|
101
|
+
severity: "medium",
|
|
102
|
+
detail: `Comment says "returns false" but return statement differs`,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
else if (claimed === "null" && !nextLine.includes("null")) {
|
|
106
|
+
issues.push({
|
|
107
|
+
line: i + 1,
|
|
108
|
+
type: "stale-comment",
|
|
109
|
+
severity: "medium",
|
|
110
|
+
detail: `Comment says "returns null" but return statement differs`,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// 5. Dead documentation — comment block before deleted/empty code
|
|
115
|
+
if (/\/\*\*/.test(line) && !line.includes("*/")) {
|
|
116
|
+
let endComment = -1;
|
|
117
|
+
for (let j = i + 1; j < Math.min(i + 20, lines.length); j++) {
|
|
118
|
+
if (/\*\//.test(lines[j])) {
|
|
119
|
+
endComment = j;
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (endComment >= 0) {
|
|
124
|
+
const afterDoc = lines[endComment + 1]?.trim() || "";
|
|
125
|
+
if (afterDoc === "" || afterDoc === "}" || afterDoc === ");") {
|
|
126
|
+
issues.push({
|
|
127
|
+
line: i + 1,
|
|
128
|
+
type: "dead-doc",
|
|
129
|
+
severity: "low",
|
|
130
|
+
detail: "Documentation block with no code following it",
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// 6. TODO in documentation
|
|
136
|
+
if (/\/\*\*[\s\S]*TODO|@todo/i.test(line) || (/^\s*\*/.test(line) && /TODO/i.test(line))) {
|
|
137
|
+
issues.push({
|
|
138
|
+
line: i + 1,
|
|
139
|
+
type: "todo-doc",
|
|
140
|
+
severity: "low",
|
|
141
|
+
detail: "TODO found in documentation — may indicate incomplete AI-generated docs",
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return issues;
|
|
146
|
+
}
|
|
147
|
+
// ─── Scanner ────────────────────────────────────────────────────────────────
|
|
148
|
+
const SKIP = new Set(["node_modules", ".git", "dist", "build", "coverage"]);
|
|
149
|
+
const EXTS = new Set([".ts", ".js", ".py", ".java", ".cs", ".go", ".rb", ".php", ".rs"]);
|
|
150
|
+
function collectFiles(dir) {
|
|
151
|
+
const result = [];
|
|
152
|
+
function walk(d) {
|
|
153
|
+
let entries;
|
|
154
|
+
try {
|
|
155
|
+
entries = readdirSync(d);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
for (const name of entries) {
|
|
161
|
+
if (SKIP.has(name) || name.startsWith("."))
|
|
162
|
+
continue;
|
|
163
|
+
const full = join(d, name);
|
|
164
|
+
try {
|
|
165
|
+
const sub = readdirSync(full);
|
|
166
|
+
void sub;
|
|
167
|
+
walk(full);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
if (EXTS.has(extname(name).toLowerCase()))
|
|
171
|
+
result.push(full);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
walk(dir);
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
179
|
+
export function runDocDrift(argv) {
|
|
180
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
181
|
+
console.log(`
|
|
182
|
+
judges doc-drift — Detect documentation-to-code drift
|
|
183
|
+
|
|
184
|
+
Usage:
|
|
185
|
+
judges doc-drift <file-or-dir>
|
|
186
|
+
judges doc-drift src/ --min-issues 1
|
|
187
|
+
|
|
188
|
+
Options:
|
|
189
|
+
--min-issues <n> Only show files with at least N issues (default: 1)
|
|
190
|
+
--format json JSON output
|
|
191
|
+
--help, -h Show this help
|
|
192
|
+
|
|
193
|
+
Checks:
|
|
194
|
+
• @param name mismatches with function signature
|
|
195
|
+
• @returns documented but no return statement
|
|
196
|
+
• Comments referencing nonexistent identifiers
|
|
197
|
+
• Stale return value comments
|
|
198
|
+
• Dead documentation blocks
|
|
199
|
+
• TODO in documentation
|
|
200
|
+
`);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
204
|
+
const minIssues = parseInt(argv.find((_a, i) => argv[i - 1] === "--min-issues") || "1");
|
|
205
|
+
const target = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--")) || ".";
|
|
206
|
+
if (!existsSync(target)) {
|
|
207
|
+
console.error(` Path not found: ${target}`);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
let files;
|
|
211
|
+
try {
|
|
212
|
+
readdirSync(target);
|
|
213
|
+
files = collectFiles(target);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
files = [target];
|
|
217
|
+
}
|
|
218
|
+
const results = [];
|
|
219
|
+
for (const f of files) {
|
|
220
|
+
let content;
|
|
221
|
+
try {
|
|
222
|
+
content = readFileSync(f, "utf-8");
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
const issues = analyzeDrift(content);
|
|
228
|
+
const driftScore = Math.max(0, 100 -
|
|
229
|
+
issues.filter((i) => i.severity === "high").length * 20 -
|
|
230
|
+
issues.filter((i) => i.severity === "medium").length * 10 -
|
|
231
|
+
issues.filter((i) => i.severity === "low").length * 3);
|
|
232
|
+
results.push({ file: relative(target, f) || f, issues, driftScore });
|
|
233
|
+
}
|
|
234
|
+
const filtered = results.filter((r) => r.issues.length >= minIssues);
|
|
235
|
+
filtered.sort((a, b) => a.driftScore - b.driftScore);
|
|
236
|
+
if (format === "json") {
|
|
237
|
+
console.log(JSON.stringify({ files: filtered, scannedFiles: files.length, timestamp: new Date().toISOString() }, null, 2));
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
const totalIssues = results.reduce((s, r) => s + r.issues.length, 0);
|
|
241
|
+
console.log(`\n Doc Drift — ${files.length} files, ${totalIssues} issues\n ──────────────────────────`);
|
|
242
|
+
if (filtered.length === 0) {
|
|
243
|
+
console.log(` ✅ No documentation drift detected\n`);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
for (const r of filtered.slice(0, 20)) {
|
|
247
|
+
const icon = r.driftScore >= 80 ? "🟢" : r.driftScore >= 50 ? "🟡" : "🔴";
|
|
248
|
+
console.log(`\n ${icon} ${r.file} — ${r.driftScore}/100 (${r.issues.length} issues)`);
|
|
249
|
+
for (const iss of r.issues) {
|
|
250
|
+
const sev = iss.severity === "high" ? "🔴" : iss.severity === "medium" ? "🟠" : "🟡";
|
|
251
|
+
console.log(` ${sev} L${iss.line}: ${iss.detail}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (filtered.length > 20)
|
|
255
|
+
console.log(` ... and ${filtered.length - 20} more files`);
|
|
256
|
+
console.log("");
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=doc-drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-drift.js","sourceRoot":"","sources":["../../src/commands/doc-drift.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exception consistency — detect inconsistent exception handling
|
|
3
|
+
* patterns within a codebase: thrown-but-uncaught, asymmetric
|
|
4
|
+
* try/catch/finally, unhandled promise rejections, mixed strategies.
|
|
5
|
+
*/
|
|
6
|
+
export declare function runExceptionConsistency(argv: string[]): void;
|
|
7
|
+
//# sourceMappingURL=exception-consistency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exception-consistency.d.ts","sourceRoot":"","sources":["../../src/commands/exception-consistency.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmJH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsE5D"}
|