@kevinrabun/judges 3.57.0 → 3.59.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/api-misuse.d.ts +5 -0
- package/dist/commands/api-misuse.d.ts.map +1 -0
- package/dist/commands/api-misuse.js +261 -0
- package/dist/commands/api-misuse.js.map +1 -0
- package/dist/commands/assertion-density.d.ts +5 -0
- package/dist/commands/assertion-density.d.ts.map +1 -0
- package/dist/commands/assertion-density.js +264 -0
- package/dist/commands/assertion-density.js.map +1 -0
- package/dist/commands/async-safety.d.ts +5 -0
- package/dist/commands/async-safety.d.ts.map +1 -0
- package/dist/commands/async-safety.js +267 -0
- package/dist/commands/async-safety.js.map +1 -0
- package/dist/commands/clone-detect.d.ts +5 -0
- package/dist/commands/clone-detect.d.ts.map +1 -0
- package/dist/commands/clone-detect.js +233 -0
- package/dist/commands/clone-detect.js.map +1 -0
- package/dist/commands/completion-audit.d.ts +5 -0
- package/dist/commands/completion-audit.d.ts.map +1 -0
- package/dist/commands/completion-audit.js +297 -0
- package/dist/commands/completion-audit.js.map +1 -0
- package/dist/commands/contract-verify.d.ts +5 -0
- package/dist/commands/contract-verify.d.ts.map +1 -0
- package/dist/commands/contract-verify.js +317 -0
- package/dist/commands/contract-verify.js.map +1 -0
- package/dist/commands/cross-file-consistency.d.ts +5 -0
- package/dist/commands/cross-file-consistency.d.ts.map +1 -0
- package/dist/commands/cross-file-consistency.js +255 -0
- package/dist/commands/cross-file-consistency.js.map +1 -0
- package/dist/commands/dead-code-detect.d.ts +5 -0
- package/dist/commands/dead-code-detect.d.ts.map +1 -0
- package/dist/commands/dead-code-detect.js +256 -0
- package/dist/commands/dead-code-detect.js.map +1 -0
- package/dist/commands/encoding-safety.d.ts +5 -0
- package/dist/commands/encoding-safety.d.ts.map +1 -0
- package/dist/commands/encoding-safety.js +276 -0
- package/dist/commands/encoding-safety.js.map +1 -0
- package/dist/commands/example-leak.d.ts +5 -0
- package/dist/commands/example-leak.d.ts.map +1 -0
- package/dist/commands/example-leak.js +233 -0
- package/dist/commands/example-leak.js.map +1 -0
- package/dist/commands/input-guard.d.ts +5 -0
- package/dist/commands/input-guard.d.ts.map +1 -0
- package/dist/commands/input-guard.js +256 -0
- package/dist/commands/input-guard.js.map +1 -0
- package/dist/commands/logic-lint.d.ts +5 -0
- package/dist/commands/logic-lint.d.ts.map +1 -0
- package/dist/commands/logic-lint.js +256 -0
- package/dist/commands/logic-lint.js.map +1 -0
- package/dist/commands/phantom-import.d.ts +5 -0
- package/dist/commands/phantom-import.d.ts.map +1 -0
- package/dist/commands/phantom-import.js +261 -0
- package/dist/commands/phantom-import.js.map +1 -0
- package/dist/commands/review-focus.d.ts +5 -0
- package/dist/commands/review-focus.d.ts.map +1 -0
- package/dist/commands/review-focus.js +197 -0
- package/dist/commands/review-focus.js.map +1 -0
- package/dist/commands/spec-conform.d.ts +5 -0
- package/dist/commands/spec-conform.d.ts.map +1 -0
- package/dist/commands/spec-conform.js +305 -0
- package/dist/commands/spec-conform.js.map +1 -0
- package/dist/commands/state-integrity.d.ts +5 -0
- package/dist/commands/state-integrity.d.ts.map +1 -0
- package/dist/commands/state-integrity.js +284 -0
- package/dist/commands/state-integrity.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-file-consistency.d.ts","sourceRoot":"","sources":["../../src/commands/cross-file-consistency.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyOH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8D5D"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-file consistency — verify naming and pattern consistency across files.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, readdirSync, statSync } from "fs";
|
|
5
|
+
import { join, extname, basename } from "path";
|
|
6
|
+
// ─── File Collection ────────────────────────────────────────────────────────
|
|
7
|
+
const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx"]);
|
|
8
|
+
function collectFiles(dir, max = 300) {
|
|
9
|
+
const files = [];
|
|
10
|
+
function walk(d) {
|
|
11
|
+
if (files.length >= max)
|
|
12
|
+
return;
|
|
13
|
+
let entries;
|
|
14
|
+
try {
|
|
15
|
+
entries = readdirSync(d);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
for (const e of entries) {
|
|
21
|
+
if (files.length >= max)
|
|
22
|
+
return;
|
|
23
|
+
if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build")
|
|
24
|
+
continue;
|
|
25
|
+
const full = join(d, e);
|
|
26
|
+
try {
|
|
27
|
+
if (statSync(full).isDirectory())
|
|
28
|
+
walk(full);
|
|
29
|
+
else if (CODE_EXTS.has(extname(full)))
|
|
30
|
+
files.push(full);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
/* skip */
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
walk(dir);
|
|
38
|
+
return files;
|
|
39
|
+
}
|
|
40
|
+
function analyzeConsistency(files) {
|
|
41
|
+
const issues = [];
|
|
42
|
+
// Collect cross-file data
|
|
43
|
+
const allFunctions = [];
|
|
44
|
+
const errorPatterns = [];
|
|
45
|
+
const importStyles = new Map();
|
|
46
|
+
const returnPatterns = new Map();
|
|
47
|
+
const logStyles = [];
|
|
48
|
+
for (const filepath of files) {
|
|
49
|
+
let content;
|
|
50
|
+
try {
|
|
51
|
+
content = readFileSync(filepath, "utf-8");
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const lines = content.split("\n");
|
|
57
|
+
const fname = basename(filepath);
|
|
58
|
+
for (let i = 0; i < lines.length; i++) {
|
|
59
|
+
const line = lines[i];
|
|
60
|
+
const trimmed = line.trim();
|
|
61
|
+
// Collect function signatures
|
|
62
|
+
const funcMatch = trimmed.match(/(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*\(([^)]*)\)/);
|
|
63
|
+
if (funcMatch) {
|
|
64
|
+
allFunctions.push({ name: funcMatch[1], params: funcMatch[2], file: filepath, line: i + 1 });
|
|
65
|
+
}
|
|
66
|
+
// Collect error handling patterns
|
|
67
|
+
if (/catch\s*\(/.test(trimmed)) {
|
|
68
|
+
const block = lines.slice(i, Math.min(i + 5, lines.length)).join("\n");
|
|
69
|
+
if (/console\.error/.test(block))
|
|
70
|
+
errorPatterns.push({ pattern: "console.error", file: filepath, line: i + 1 });
|
|
71
|
+
else if (/logger\.error/.test(block))
|
|
72
|
+
errorPatterns.push({ pattern: "logger.error", file: filepath, line: i + 1 });
|
|
73
|
+
else if (/throw/.test(block))
|
|
74
|
+
errorPatterns.push({ pattern: "rethrow", file: filepath, line: i + 1 });
|
|
75
|
+
else if (/return/.test(block))
|
|
76
|
+
errorPatterns.push({ pattern: "return-on-error", file: filepath, line: i + 1 });
|
|
77
|
+
}
|
|
78
|
+
// Collect import styles for same module
|
|
79
|
+
const importMatch = trimmed.match(/import\s+(?:(\w+)|(\{[^}]+\}))\s+from\s+['"]([^'"]+)['"]/);
|
|
80
|
+
if (importMatch) {
|
|
81
|
+
const mod = importMatch[3];
|
|
82
|
+
const entry = importStyles.get(mod) || { default: 0, named: 0, file: filepath, line: i + 1 };
|
|
83
|
+
if (importMatch[1])
|
|
84
|
+
entry.default++;
|
|
85
|
+
if (importMatch[2])
|
|
86
|
+
entry.named++;
|
|
87
|
+
importStyles.set(mod, entry);
|
|
88
|
+
}
|
|
89
|
+
// Collect logging styles
|
|
90
|
+
if (/console\.(log|warn|error|info|debug)\s*\(/.test(trimmed)) {
|
|
91
|
+
logStyles.push({ style: "console", file: filepath, line: i + 1 });
|
|
92
|
+
}
|
|
93
|
+
else if (/logger\.(log|warn|error|info|debug)\s*\(/.test(trimmed)) {
|
|
94
|
+
logStyles.push({ style: "logger", file: filepath, line: i + 1 });
|
|
95
|
+
}
|
|
96
|
+
// Collect return type patterns for similar functions
|
|
97
|
+
const retMatch = trimmed.match(/(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*\([^)]*\)\s*:\s*([\w<>[\]| ]+)/);
|
|
98
|
+
if (retMatch) {
|
|
99
|
+
const prefix = retMatch[1].replace(/\d+$/, "").replace(/[A-Z][a-z]+$/, "");
|
|
100
|
+
if (prefix.length > 2) {
|
|
101
|
+
const entry = returnPatterns.get(prefix) || { patterns: new Set(), files: [] };
|
|
102
|
+
entry.patterns.add(retMatch[2].trim());
|
|
103
|
+
entry.files.push(`${fname}:${i + 1}`);
|
|
104
|
+
returnPatterns.set(prefix, entry);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Detect inconsistencies
|
|
110
|
+
// 1. Similar function names with inconsistent patterns
|
|
111
|
+
const nameGroups = new Map();
|
|
112
|
+
for (const func of allFunctions) {
|
|
113
|
+
const prefix = func.name
|
|
114
|
+
.replace(/\d+$/, "")
|
|
115
|
+
.replace(/[A-Z][a-z]+$/, "")
|
|
116
|
+
.toLowerCase();
|
|
117
|
+
if (prefix.length > 3) {
|
|
118
|
+
const group = nameGroups.get(prefix) || [];
|
|
119
|
+
group.push(func);
|
|
120
|
+
nameGroups.set(prefix, group);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
for (const [_prefix, group] of nameGroups) {
|
|
124
|
+
if (group.length >= 2) {
|
|
125
|
+
const paramCounts = new Set(group.map((f) => f.params.split(",").filter((p) => p.trim()).length));
|
|
126
|
+
if (paramCounts.size > 1 && group.length <= 5) {
|
|
127
|
+
const first = group[0];
|
|
128
|
+
issues.push({
|
|
129
|
+
file: first.file,
|
|
130
|
+
line: first.line,
|
|
131
|
+
issue: "Inconsistent parameter count across similar functions",
|
|
132
|
+
severity: "medium",
|
|
133
|
+
detail: `Functions with similar names have different parameter counts: ${group.map((f) => `${f.name}(${f.params.split(",").filter((p) => p.trim()).length} params)`).join(", ")}`,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// 2. Mixed error handling patterns
|
|
139
|
+
if (errorPatterns.length > 3) {
|
|
140
|
+
const patternCounts = new Map();
|
|
141
|
+
for (const ep of errorPatterns)
|
|
142
|
+
patternCounts.set(ep.pattern, (patternCounts.get(ep.pattern) || 0) + 1);
|
|
143
|
+
if (patternCounts.size > 2) {
|
|
144
|
+
const minority = [...patternCounts.entries()].sort((a, b) => a[1] - b[1])[0];
|
|
145
|
+
const sample = errorPatterns.find((ep) => ep.pattern === minority[0]);
|
|
146
|
+
if (sample) {
|
|
147
|
+
issues.push({
|
|
148
|
+
file: sample.file,
|
|
149
|
+
line: sample.line,
|
|
150
|
+
issue: "Inconsistent error handling pattern",
|
|
151
|
+
severity: "medium",
|
|
152
|
+
detail: `Project uses ${patternCounts.size} different error handling patterns — \`${minority[0]}\` is used least (${minority[1]}×)`,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// 3. Mixed import styles for same module
|
|
158
|
+
for (const [mod, styles] of importStyles) {
|
|
159
|
+
if (styles.default > 0 && styles.named > 0) {
|
|
160
|
+
issues.push({
|
|
161
|
+
file: styles.file,
|
|
162
|
+
line: styles.line,
|
|
163
|
+
issue: "Mixed import style for same module",
|
|
164
|
+
severity: "low",
|
|
165
|
+
detail: `\`${mod}\` imported both as default (${styles.default}×) and named (${styles.named}×) — AI may have used wrong import style`,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// 4. Mixed logging styles
|
|
170
|
+
if (logStyles.length > 5) {
|
|
171
|
+
const consoleCount = logStyles.filter((l) => l.style === "console").length;
|
|
172
|
+
const loggerCount = logStyles.filter((l) => l.style === "logger").length;
|
|
173
|
+
if (consoleCount > 0 && loggerCount > 0) {
|
|
174
|
+
const minority = consoleCount < loggerCount
|
|
175
|
+
? logStyles.find((l) => l.style === "console")
|
|
176
|
+
: logStyles.find((l) => l.style === "logger");
|
|
177
|
+
if (minority) {
|
|
178
|
+
issues.push({
|
|
179
|
+
file: minority.file,
|
|
180
|
+
line: minority.line,
|
|
181
|
+
issue: "Mixed logging approach",
|
|
182
|
+
severity: "low",
|
|
183
|
+
detail: `Project uses both console.* (${consoleCount}×) and logger.* (${loggerCount}×) — standardize on one`,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// 5. Similar functions with inconsistent return types
|
|
189
|
+
for (const [_prefix, ret] of returnPatterns) {
|
|
190
|
+
if (ret.patterns.size > 1 && ret.files.length > 1) {
|
|
191
|
+
issues.push({
|
|
192
|
+
file: ret.files[0].split(":")[0],
|
|
193
|
+
line: 1,
|
|
194
|
+
issue: "Inconsistent return types for similar functions",
|
|
195
|
+
severity: "low",
|
|
196
|
+
detail: `Functions in the same family return different types: ${[...ret.patterns].join(", ")}`,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return issues;
|
|
201
|
+
}
|
|
202
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
203
|
+
export function runCrossFileConsistency(argv) {
|
|
204
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
205
|
+
console.log(`
|
|
206
|
+
judges cross-file-consistency — Verify naming and pattern consistency across files
|
|
207
|
+
|
|
208
|
+
Usage:
|
|
209
|
+
judges cross-file-consistency [dir]
|
|
210
|
+
judges cross-file-consistency src/ --format json
|
|
211
|
+
|
|
212
|
+
Options:
|
|
213
|
+
[dir] Directory to scan (default: .)
|
|
214
|
+
--format json JSON output
|
|
215
|
+
--help, -h Show this help
|
|
216
|
+
|
|
217
|
+
Checks: inconsistent parameter counts, mixed error handling, mixed import styles,
|
|
218
|
+
mixed logging approaches, inconsistent return types for similar functions.
|
|
219
|
+
`);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
223
|
+
const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
|
|
224
|
+
const files = collectFiles(dir);
|
|
225
|
+
const allIssues = analyzeConsistency(files);
|
|
226
|
+
const highCount = allIssues.filter((i) => i.severity === "high").length;
|
|
227
|
+
const medCount = allIssues.filter((i) => i.severity === "medium").length;
|
|
228
|
+
const score = Math.max(0, 100 - highCount * 10 - medCount * 5 - allIssues.filter((i) => i.severity === "low").length * 2);
|
|
229
|
+
if (format === "json") {
|
|
230
|
+
console.log(JSON.stringify({
|
|
231
|
+
issues: allIssues,
|
|
232
|
+
score,
|
|
233
|
+
summary: { high: highCount, medium: medCount, total: allIssues.length },
|
|
234
|
+
timestamp: new Date().toISOString(),
|
|
235
|
+
}, null, 2));
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
const badge = score >= 80 ? "✅ CONSISTENT" : score >= 50 ? "⚠️ MIXED" : "❌ INCONSISTENT";
|
|
239
|
+
console.log(`\n Cross-File Consistency: ${badge} (${score}/100)\n ─────────────────────────────`);
|
|
240
|
+
if (allIssues.length === 0) {
|
|
241
|
+
console.log(" No cross-file inconsistencies detected.\n");
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
for (const issue of allIssues.slice(0, 25)) {
|
|
245
|
+
const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
|
|
246
|
+
console.log(` ${icon} ${issue.issue}`);
|
|
247
|
+
console.log(` ${issue.file}:${issue.line}`);
|
|
248
|
+
console.log(` ${issue.detail}`);
|
|
249
|
+
}
|
|
250
|
+
if (allIssues.length > 25)
|
|
251
|
+
console.log(` ... and ${allIssues.length - 25} more`);
|
|
252
|
+
console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=cross-file-consistency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-file-consistency.js","sourceRoot":"","sources":["../../src/commands/cross-file-consistency.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dead-code-detect.d.ts","sourceRoot":"","sources":["../../src/commands/dead-code-detect.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoNH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAwEtD"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dead code detect — identify unreachable code, unused exports, and orphaned functions.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, readdirSync, statSync } from "fs";
|
|
5
|
+
import { join, extname, relative } from "path";
|
|
6
|
+
// ─── File Collection ────────────────────────────────────────────────────────
|
|
7
|
+
const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx"]);
|
|
8
|
+
function collectFiles(dir, max = 500) {
|
|
9
|
+
const files = [];
|
|
10
|
+
function walk(d) {
|
|
11
|
+
if (files.length >= max)
|
|
12
|
+
return;
|
|
13
|
+
let entries;
|
|
14
|
+
try {
|
|
15
|
+
entries = readdirSync(d);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
for (const e of entries) {
|
|
21
|
+
if (files.length >= max)
|
|
22
|
+
return;
|
|
23
|
+
if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build")
|
|
24
|
+
continue;
|
|
25
|
+
const full = join(d, e);
|
|
26
|
+
try {
|
|
27
|
+
if (statSync(full).isDirectory())
|
|
28
|
+
walk(full);
|
|
29
|
+
else if (CODE_EXTS.has(extname(full)))
|
|
30
|
+
files.push(full);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
/* skip */
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
walk(dir);
|
|
38
|
+
return files;
|
|
39
|
+
}
|
|
40
|
+
// ─── Analysis ───────────────────────────────────────────────────────────────
|
|
41
|
+
function analyzeFile(filepath, allContents) {
|
|
42
|
+
const issues = [];
|
|
43
|
+
const content = allContents.get(filepath);
|
|
44
|
+
if (!content)
|
|
45
|
+
return issues;
|
|
46
|
+
const lines = content.split("\n");
|
|
47
|
+
// Collect exported symbols from this file
|
|
48
|
+
const exports = [];
|
|
49
|
+
for (let i = 0; i < lines.length; i++) {
|
|
50
|
+
const line = lines[i];
|
|
51
|
+
const exportMatch = line.match(/export\s+(?:function|const|let|class|enum|type|interface)\s+(\w+)/);
|
|
52
|
+
if (exportMatch)
|
|
53
|
+
exports.push({ name: exportMatch[1], line: i + 1 });
|
|
54
|
+
const namedExport = line.match(/export\s+\{\s*([^}]+)\s*\}/);
|
|
55
|
+
if (namedExport) {
|
|
56
|
+
for (const name of namedExport[1].split(",").map((s) => s.trim().split(/\s+as\s+/)[0])) {
|
|
57
|
+
if (name)
|
|
58
|
+
exports.push({ name, line: i + 1 });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Check if exported symbols are imported anywhere else
|
|
63
|
+
const relPath = relative(".", filepath)
|
|
64
|
+
.replace(/\\/g, "/")
|
|
65
|
+
.replace(/\.\w+$/, "");
|
|
66
|
+
for (const exp of exports) {
|
|
67
|
+
let foundImport = false;
|
|
68
|
+
for (const [otherPath, otherContent] of allContents) {
|
|
69
|
+
if (otherPath === filepath)
|
|
70
|
+
continue;
|
|
71
|
+
if (otherContent.includes(exp.name) && (otherContent.includes(relPath) || otherContent.includes(exp.name))) {
|
|
72
|
+
const importPattern = new RegExp(`import\\s+.*\\b${exp.name}\\b.*from`);
|
|
73
|
+
if (importPattern.test(otherContent) || new RegExp(`require\\(.*\\).*${exp.name}`).test(otherContent)) {
|
|
74
|
+
foundImport = true;
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (!foundImport && !/index\.\w+$/.test(filepath) && !/default|main|cli|app|server/i.test(exp.name)) {
|
|
80
|
+
issues.push({
|
|
81
|
+
file: filepath,
|
|
82
|
+
line: exp.line,
|
|
83
|
+
issue: "Exported symbol never imported",
|
|
84
|
+
severity: "medium",
|
|
85
|
+
detail: `\`${exp.name}\` is exported but not imported by any other file — possible dead export`,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
for (let i = 0; i < lines.length; i++) {
|
|
90
|
+
const line = lines[i];
|
|
91
|
+
// Unreachable code after return/throw/continue/break
|
|
92
|
+
if (/^\s*(?:return\b|throw\b|continue\b|break\b)/.test(line) && !/\/\/|\/\*/.test(line)) {
|
|
93
|
+
const nextLine = lines[i + 1];
|
|
94
|
+
if (nextLine &&
|
|
95
|
+
/^\s+\S/.test(nextLine) &&
|
|
96
|
+
!/^\s*\}/.test(nextLine) &&
|
|
97
|
+
!/^\s*case\b/.test(nextLine) &&
|
|
98
|
+
!/^\s*(?:catch|finally|else)/.test(nextLine)) {
|
|
99
|
+
issues.push({
|
|
100
|
+
file: filepath,
|
|
101
|
+
line: i + 2,
|
|
102
|
+
issue: "Unreachable code after return/throw",
|
|
103
|
+
severity: "high",
|
|
104
|
+
detail: "Code after unconditional return/throw/break/continue will never execute",
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Variables assigned but never read
|
|
109
|
+
if (/(?:const|let|var)\s+(\w+)\s*=/.test(line) && !/export/.test(line)) {
|
|
110
|
+
const varMatch = line.match(/(?:const|let|var)\s+(\w+)\s*=/);
|
|
111
|
+
if (varMatch) {
|
|
112
|
+
const varName = varMatch[1];
|
|
113
|
+
if (varName.length > 1 && !varName.startsWith("_")) {
|
|
114
|
+
const restOfFile = lines.slice(i + 1).join("\n");
|
|
115
|
+
const usagePattern = new RegExp(`\\b${varName}\\b`);
|
|
116
|
+
if (!usagePattern.test(restOfFile)) {
|
|
117
|
+
issues.push({
|
|
118
|
+
file: filepath,
|
|
119
|
+
line: i + 1,
|
|
120
|
+
issue: "Variable assigned but never used",
|
|
121
|
+
severity: "low",
|
|
122
|
+
detail: `\`${varName}\` is assigned but never referenced afterward — remove or prefix with _`,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Dead else after exhaustive conditions
|
|
129
|
+
if (/^\s*else\s*\{/.test(line)) {
|
|
130
|
+
const prevBlock = lines.slice(Math.max(0, i - 5), i).join("\n");
|
|
131
|
+
if (/return\s+(?:true|false);\s*\}\s*$/.test(prevBlock.trim())) {
|
|
132
|
+
// Check if the if condition is exhaustive
|
|
133
|
+
if (/if\s*\(\s*typeof\s+\w+\s*===/.test(prevBlock)) {
|
|
134
|
+
issues.push({
|
|
135
|
+
file: filepath,
|
|
136
|
+
line: i + 1,
|
|
137
|
+
issue: "Possibly dead else branch",
|
|
138
|
+
severity: "low",
|
|
139
|
+
detail: "Else branch after exhaustive type check — may be unreachable",
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Empty function bodies
|
|
145
|
+
if (/(?:function|=>)\s*\{?\s*\}/.test(line) &&
|
|
146
|
+
!/interface|type|abstract|declare|override|stub|mock|noop|placeholder/i.test(line)) {
|
|
147
|
+
if (!/test|spec|fixture/i.test(filepath)) {
|
|
148
|
+
issues.push({
|
|
149
|
+
file: filepath,
|
|
150
|
+
line: i + 1,
|
|
151
|
+
issue: "Empty function body",
|
|
152
|
+
severity: "low",
|
|
153
|
+
detail: "Function with no implementation — intentional stub or dead code?",
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Condition that is always true or false
|
|
158
|
+
if (/if\s*\(\s*(?:true|false|1|0)\s*\)/.test(line)) {
|
|
159
|
+
issues.push({
|
|
160
|
+
file: filepath,
|
|
161
|
+
line: i + 1,
|
|
162
|
+
issue: "Constant condition",
|
|
163
|
+
severity: "medium",
|
|
164
|
+
detail: "Condition is always true/false — dead branch or debugging artifact left in code",
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
// Unused function parameters (non-callback, non-interface)
|
|
168
|
+
if (/function\s+\w+\s*\(([^)]+)\)/.test(line) && !/interface|type|abstract|declare|override/i.test(line)) {
|
|
169
|
+
const params = line.match(/function\s+\w+\s*\(([^)]+)\)/)?.[1];
|
|
170
|
+
if (params) {
|
|
171
|
+
const paramNames = params
|
|
172
|
+
.split(",")
|
|
173
|
+
.map((p) => p.trim().split(/[=:]/)[0].trim())
|
|
174
|
+
.filter((p) => p && !p.startsWith("_") && !p.startsWith("..."));
|
|
175
|
+
const funcBody = lines.slice(i + 1, Math.min(i + 40, lines.length)).join("\n");
|
|
176
|
+
for (const p of paramNames) {
|
|
177
|
+
if (p.length > 1 && !new RegExp(`\\b${p}\\b`).test(funcBody)) {
|
|
178
|
+
issues.push({
|
|
179
|
+
file: filepath,
|
|
180
|
+
line: i + 1,
|
|
181
|
+
issue: "Unused function parameter",
|
|
182
|
+
severity: "low",
|
|
183
|
+
detail: `Parameter \`${p}\` is declared but never used in function body — remove or prefix with _`,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return issues;
|
|
191
|
+
}
|
|
192
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
193
|
+
export function runDeadCodeDetect(argv) {
|
|
194
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
195
|
+
console.log(`
|
|
196
|
+
judges dead-code-detect — Identify unreachable code, unused exports, and orphaned functions
|
|
197
|
+
|
|
198
|
+
Usage:
|
|
199
|
+
judges dead-code-detect [dir]
|
|
200
|
+
judges dead-code-detect src/ --format json
|
|
201
|
+
|
|
202
|
+
Options:
|
|
203
|
+
[dir] Directory to scan (default: .)
|
|
204
|
+
--format json JSON output
|
|
205
|
+
--help, -h Show this help
|
|
206
|
+
|
|
207
|
+
Checks: unreachable code after return/throw, unused exports, assigned-but-never-read variables,
|
|
208
|
+
dead else branches, empty functions, constant conditions, unused parameters.
|
|
209
|
+
`);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
213
|
+
const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
|
|
214
|
+
const files = collectFiles(dir);
|
|
215
|
+
const allContents = new Map();
|
|
216
|
+
for (const f of files) {
|
|
217
|
+
try {
|
|
218
|
+
allContents.set(f, readFileSync(f, "utf-8"));
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
/* skip */
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const allIssues = [];
|
|
225
|
+
for (const f of files)
|
|
226
|
+
allIssues.push(...analyzeFile(f, allContents));
|
|
227
|
+
const highCount = allIssues.filter((i) => i.severity === "high").length;
|
|
228
|
+
const medCount = allIssues.filter((i) => i.severity === "medium").length;
|
|
229
|
+
const score = Math.max(0, 100 - highCount * 8 - medCount * 3);
|
|
230
|
+
if (format === "json") {
|
|
231
|
+
console.log(JSON.stringify({
|
|
232
|
+
issues: allIssues,
|
|
233
|
+
score,
|
|
234
|
+
summary: { high: highCount, medium: medCount, total: allIssues.length },
|
|
235
|
+
timestamp: new Date().toISOString(),
|
|
236
|
+
}, null, 2));
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
const badge = score >= 80 ? "✅ CLEAN" : score >= 50 ? "⚠️ CLUTTERED" : "❌ BLOATED";
|
|
240
|
+
console.log(`\n Dead Code: ${badge} (${score}/100)\n ─────────────────────────────`);
|
|
241
|
+
if (allIssues.length === 0) {
|
|
242
|
+
console.log(" No dead code detected.\n");
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
for (const issue of allIssues.slice(0, 25)) {
|
|
246
|
+
const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
|
|
247
|
+
console.log(` ${icon} ${issue.issue}`);
|
|
248
|
+
console.log(` ${issue.file}:${issue.line}`);
|
|
249
|
+
console.log(` ${issue.detail}`);
|
|
250
|
+
}
|
|
251
|
+
if (allIssues.length > 25)
|
|
252
|
+
console.log(` ... and ${allIssues.length - 25} more`);
|
|
253
|
+
console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=dead-code-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dead-code-detect.js","sourceRoot":"","sources":["../../src/commands/dead-code-detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding-safety.d.ts","sourceRoot":"","sources":["../../src/commands/encoding-safety.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqPH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+DtD"}
|