@kevinrabun/judges 3.58.0 → 3.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +112 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/adoption-track.d.ts +5 -0
  6. package/dist/commands/adoption-track.d.ts.map +1 -0
  7. package/dist/commands/adoption-track.js +247 -0
  8. package/dist/commands/adoption-track.js.map +1 -0
  9. package/dist/commands/api-misuse.d.ts +5 -0
  10. package/dist/commands/api-misuse.d.ts.map +1 -0
  11. package/dist/commands/api-misuse.js +261 -0
  12. package/dist/commands/api-misuse.js.map +1 -0
  13. package/dist/commands/completion-audit.d.ts +5 -0
  14. package/dist/commands/completion-audit.d.ts.map +1 -0
  15. package/dist/commands/completion-audit.js +297 -0
  16. package/dist/commands/completion-audit.js.map +1 -0
  17. package/dist/commands/context-blind.d.ts +5 -0
  18. package/dist/commands/context-blind.d.ts.map +1 -0
  19. package/dist/commands/context-blind.js +273 -0
  20. package/dist/commands/context-blind.js.map +1 -0
  21. package/dist/commands/cross-file-consistency.d.ts +5 -0
  22. package/dist/commands/cross-file-consistency.d.ts.map +1 -0
  23. package/dist/commands/cross-file-consistency.js +255 -0
  24. package/dist/commands/cross-file-consistency.js.map +1 -0
  25. package/dist/commands/example-leak.d.ts +5 -0
  26. package/dist/commands/example-leak.d.ts.map +1 -0
  27. package/dist/commands/example-leak.js +233 -0
  28. package/dist/commands/example-leak.js.map +1 -0
  29. package/dist/commands/finding-budget.d.ts +5 -0
  30. package/dist/commands/finding-budget.d.ts.map +1 -0
  31. package/dist/commands/finding-budget.js +233 -0
  32. package/dist/commands/finding-budget.js.map +1 -0
  33. package/dist/commands/hallucination-detect.d.ts +5 -0
  34. package/dist/commands/hallucination-detect.d.ts.map +1 -0
  35. package/dist/commands/hallucination-detect.js +351 -0
  36. package/dist/commands/hallucination-detect.js.map +1 -0
  37. package/dist/commands/logic-lint.d.ts +5 -0
  38. package/dist/commands/logic-lint.d.ts.map +1 -0
  39. package/dist/commands/logic-lint.js +256 -0
  40. package/dist/commands/logic-lint.js.map +1 -0
  41. package/dist/commands/over-abstraction.d.ts +5 -0
  42. package/dist/commands/over-abstraction.d.ts.map +1 -0
  43. package/dist/commands/over-abstraction.js +308 -0
  44. package/dist/commands/over-abstraction.js.map +1 -0
  45. package/dist/commands/phantom-import.d.ts +5 -0
  46. package/dist/commands/phantom-import.d.ts.map +1 -0
  47. package/dist/commands/phantom-import.js +261 -0
  48. package/dist/commands/phantom-import.js.map +1 -0
  49. package/dist/commands/review-digest.d.ts +5 -0
  50. package/dist/commands/review-digest.d.ts.map +1 -0
  51. package/dist/commands/review-digest.js +266 -0
  52. package/dist/commands/review-digest.js.map +1 -0
  53. package/dist/commands/review-focus.d.ts +5 -0
  54. package/dist/commands/review-focus.d.ts.map +1 -0
  55. package/dist/commands/review-focus.js +197 -0
  56. package/dist/commands/review-focus.js.map +1 -0
  57. package/dist/commands/security-theater.d.ts +5 -0
  58. package/dist/commands/security-theater.d.ts.map +1 -0
  59. package/dist/commands/security-theater.js +279 -0
  60. package/dist/commands/security-theater.js.map +1 -0
  61. package/dist/commands/spec-conform.d.ts +5 -0
  62. package/dist/commands/spec-conform.d.ts.map +1 -0
  63. package/dist/commands/spec-conform.js +305 -0
  64. package/dist/commands/spec-conform.js.map +1 -0
  65. package/dist/commands/stale-pattern.d.ts +5 -0
  66. package/dist/commands/stale-pattern.d.ts.map +1 -0
  67. package/dist/commands/stale-pattern.js +294 -0
  68. package/dist/commands/stale-pattern.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,297 @@
1
+ /**
2
+ * Completion audit — verify AI-generated code is complete and not truncated.
3
+ */
4
+ import { readFileSync, readdirSync, statSync } from "fs";
5
+ import { join, extname } from "path";
6
+ // ─── File Collection ────────────────────────────────────────────────────────
7
+ const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".py", ".java", ".go", ".rs", ".cs"]);
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
+ // ─── Analysis ───────────────────────────────────────────────────────────────
41
+ function analyzeFile(filepath) {
42
+ const issues = [];
43
+ let content;
44
+ try {
45
+ content = readFileSync(filepath, "utf-8");
46
+ }
47
+ catch {
48
+ return issues;
49
+ }
50
+ const lines = content.split("\n");
51
+ // Check bracket balance (unmatched braces, parens, brackets)
52
+ let braces = 0;
53
+ let parens = 0;
54
+ let brackets = 0;
55
+ let inString = false;
56
+ let stringChar = "";
57
+ for (let i = 0; i < content.length; i++) {
58
+ const ch = content[i];
59
+ const prev = i > 0 ? content[i - 1] : "";
60
+ if (inString) {
61
+ if (ch === stringChar && prev !== "\\")
62
+ inString = false;
63
+ continue;
64
+ }
65
+ if (ch === '"' || ch === "'" || ch === "`") {
66
+ inString = true;
67
+ stringChar = ch;
68
+ continue;
69
+ }
70
+ if (ch === "/" && (content[i + 1] === "/" || content[i + 1] === "*")) {
71
+ if (content[i + 1] === "/") {
72
+ while (i < content.length && content[i] !== "\n")
73
+ i++;
74
+ }
75
+ else {
76
+ i += 2;
77
+ while (i < content.length - 1 && !(content[i] === "*" && content[i + 1] === "/"))
78
+ i++;
79
+ i++;
80
+ }
81
+ continue;
82
+ }
83
+ if (ch === "{")
84
+ braces++;
85
+ if (ch === "}")
86
+ braces--;
87
+ if (ch === "(")
88
+ parens++;
89
+ if (ch === ")")
90
+ parens--;
91
+ if (ch === "[")
92
+ brackets++;
93
+ if (ch === "]")
94
+ brackets--;
95
+ }
96
+ if (braces > 0) {
97
+ issues.push({
98
+ file: filepath,
99
+ line: lines.length,
100
+ issue: "Unmatched opening brace(s)",
101
+ severity: "high",
102
+ detail: `${braces} unclosed \`{\` — code may be truncated mid-block`,
103
+ });
104
+ }
105
+ if (parens > 0) {
106
+ issues.push({
107
+ file: filepath,
108
+ line: lines.length,
109
+ issue: "Unmatched opening parenthesis",
110
+ severity: "high",
111
+ detail: `${parens} unclosed \`(\` — function call or expression may be incomplete`,
112
+ });
113
+ }
114
+ if (brackets > 0) {
115
+ issues.push({
116
+ file: filepath,
117
+ line: lines.length,
118
+ issue: "Unmatched opening bracket",
119
+ severity: "high",
120
+ detail: `${brackets} unclosed \`[\` — array literal may be truncated`,
121
+ });
122
+ }
123
+ for (let i = 0; i < lines.length; i++) {
124
+ const line = lines[i];
125
+ const trimmed = line.trim();
126
+ // "... rest of implementation" style truncation markers
127
+ if (/\/\/\s*\.{3}\s*(?:rest|remaining|more|other|additional|etc|and so on|similar|same as|continue|implement)/i.test(trimmed)) {
128
+ issues.push({
129
+ file: filepath,
130
+ line: i + 1,
131
+ issue: "Truncation marker comment",
132
+ severity: "high",
133
+ detail: 'AI left a "... rest" placeholder — code is incomplete',
134
+ });
135
+ }
136
+ // TODO/FIXME indicating incomplete implementation
137
+ if (/(?:\/\/|#)\s*TODO:?\s*(?:implement|add|finish|complete|fill|write|handle)/i.test(trimmed)) {
138
+ issues.push({
139
+ file: filepath,
140
+ line: i + 1,
141
+ issue: "TODO indicates unfinished implementation",
142
+ severity: "medium",
143
+ detail: "TODO comment suggests code needs additional implementation",
144
+ });
145
+ }
146
+ // throw new Error("not implemented")
147
+ if (/throw\s+new\s+Error\s*\(\s*['"](?:not implemented|todo|fixme|implement me|unimplemented|stub)/i.test(trimmed)) {
148
+ issues.push({
149
+ file: filepath,
150
+ line: i + 1,
151
+ issue: "Not-implemented error thrown",
152
+ severity: "high",
153
+ detail: "Function throws 'not implemented' — AI left a stub that will crash at runtime",
154
+ });
155
+ }
156
+ // pass/NotImplementedError (Python)
157
+ if (/raise\s+NotImplementedError/.test(trimmed)) {
158
+ issues.push({
159
+ file: filepath,
160
+ line: i + 1,
161
+ issue: "NotImplementedError raised",
162
+ severity: "high",
163
+ detail: "Python function raises NotImplementedError — implementation is missing",
164
+ });
165
+ }
166
+ // Empty function/method bodies
167
+ if (/(?:function|def|fn)\s+\w+/.test(trimmed)) {
168
+ const block = lines
169
+ .slice(i + 1, Math.min(i + 4, lines.length))
170
+ .join("\n")
171
+ .trim();
172
+ if (/^(?:\{[\s]*\}|pass\s*$)/.test(block)) {
173
+ issues.push({
174
+ file: filepath,
175
+ line: i + 1,
176
+ issue: "Empty function body",
177
+ severity: "medium",
178
+ detail: "Function declared but body is empty — may be unfinished stub",
179
+ });
180
+ }
181
+ }
182
+ // Ellipsis in code (not in strings or comments)
183
+ if (/^\s*\.{3}\s*$/.test(trimmed) && !/['"]/.test(line)) {
184
+ issues.push({
185
+ file: filepath,
186
+ line: i + 1,
187
+ issue: "Ellipsis placeholder",
188
+ severity: "high",
189
+ detail: "Bare `...` on its own line — indicates truncated AI output",
190
+ });
191
+ }
192
+ // Comment indicating AI truncation
193
+ if (/\/\*\s*\.\.\.\s*\*\//.test(trimmed) || /\/\/\s*\.\.\.\s*$/.test(trimmed)) {
194
+ issues.push({
195
+ file: filepath,
196
+ line: i + 1,
197
+ issue: "Ellipsis comment",
198
+ severity: "medium",
199
+ detail: "Comment with just `...` — AI may have truncated output here",
200
+ });
201
+ }
202
+ // "your code here" / "add your logic"
203
+ if (/(?:your|add|put|insert|write)\s+(?:code|logic|implementation|handling)\s+here/i.test(trimmed)) {
204
+ issues.push({
205
+ file: filepath,
206
+ line: i + 1,
207
+ issue: "Placeholder instruction comment",
208
+ severity: "high",
209
+ detail: 'AI left a "your code here" placeholder — implementation required',
210
+ });
211
+ }
212
+ // Interface/type with no usage
213
+ if (/(?:interface|type)\s+(\w+)\s*[={<]/.test(trimmed)) {
214
+ const typeName = trimmed.match(/(?:interface|type)\s+(\w+)/)?.[1];
215
+ if (typeName) {
216
+ const usageCount = (content.match(new RegExp(`\\b${typeName}\\b`, "g")) || []).length;
217
+ if (usageCount <= 1 && !/export/.test(trimmed)) {
218
+ issues.push({
219
+ file: filepath,
220
+ line: i + 1,
221
+ issue: "Declared type never used",
222
+ severity: "low",
223
+ detail: `\`${typeName}\` declared but never referenced — may be leftover scaffold`,
224
+ });
225
+ }
226
+ }
227
+ }
228
+ }
229
+ // File ends abruptly (last non-empty line is not a closing bracket/brace)
230
+ const lastNonEmpty = lines.filter((l) => l.trim()).pop() || "";
231
+ if (lastNonEmpty.trim() && !/^[}\])]|^$|^\/\/|^\*\/|^#/.test(lastNonEmpty.trim()) && braces !== 0) {
232
+ issues.push({
233
+ file: filepath,
234
+ line: lines.length,
235
+ issue: "File may end abruptly",
236
+ severity: "medium",
237
+ detail: "File ends with unclosed blocks — output may have been truncated",
238
+ });
239
+ }
240
+ return issues;
241
+ }
242
+ // ─── CLI ────────────────────────────────────────────────────────────────────
243
+ export function runCompletionAudit(argv) {
244
+ if (argv.includes("--help") || argv.includes("-h")) {
245
+ console.log(`
246
+ judges completion-audit — Verify AI-generated code is complete and not truncated
247
+
248
+ Usage:
249
+ judges completion-audit [dir]
250
+ judges completion-audit src/ --format json
251
+
252
+ Options:
253
+ [dir] Directory to scan (default: .)
254
+ --format json JSON output
255
+ --help, -h Show this help
256
+
257
+ Checks: unmatched brackets/braces, truncation markers, TODO stubs, NotImplementedError,
258
+ empty function bodies, ellipsis placeholders, "your code here" comments, unused types.
259
+ `);
260
+ return;
261
+ }
262
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
263
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
264
+ const files = collectFiles(dir);
265
+ const allIssues = [];
266
+ for (const f of files)
267
+ allIssues.push(...analyzeFile(f));
268
+ const highCount = allIssues.filter((i) => i.severity === "high").length;
269
+ const medCount = allIssues.filter((i) => i.severity === "medium").length;
270
+ const score = Math.max(0, 100 - highCount * 15 - medCount * 5);
271
+ if (format === "json") {
272
+ console.log(JSON.stringify({
273
+ issues: allIssues,
274
+ score,
275
+ summary: { high: highCount, medium: medCount, total: allIssues.length },
276
+ timestamp: new Date().toISOString(),
277
+ }, null, 2));
278
+ }
279
+ else {
280
+ const badge = score >= 80 ? "✅ COMPLETE" : score >= 50 ? "⚠️ GAPS" : "❌ INCOMPLETE";
281
+ console.log(`\n Completion Audit: ${badge} (${score}/100)\n ─────────────────────────────`);
282
+ if (allIssues.length === 0) {
283
+ console.log(" No completeness issues detected.\n");
284
+ return;
285
+ }
286
+ for (const issue of allIssues.slice(0, 25)) {
287
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
288
+ console.log(` ${icon} ${issue.issue}`);
289
+ console.log(` ${issue.file}:${issue.line}`);
290
+ console.log(` ${issue.detail}`);
291
+ }
292
+ if (allIssues.length > 25)
293
+ console.log(` ... and ${allIssues.length - 25} more`);
294
+ console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
295
+ }
296
+ }
297
+ //# sourceMappingURL=completion-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-audit.js","sourceRoot":"","sources":["../../src/commands/completion-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Context blind — flag when AI reinvents utilities already present in the codebase.
3
+ */
4
+ export declare function runContextBlind(argv: string[]): void;
5
+ //# sourceMappingURL=context-blind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-blind.d.ts","sourceRoot":"","sources":["../../src/commands/context-blind.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmOH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoEpD"}
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Context blind — flag when AI reinvents utilities already present in the codebase.
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 buildProjectInventory(files) {
41
+ const assets = [];
42
+ for (const filepath of files) {
43
+ let content;
44
+ try {
45
+ content = readFileSync(filepath, "utf-8");
46
+ }
47
+ catch {
48
+ continue;
49
+ }
50
+ const lines = content.split("\n");
51
+ for (let i = 0; i < lines.length; i++) {
52
+ const line = lines[i];
53
+ // Exported functions
54
+ const funcMatch = line.match(/export\s+(?:async\s+)?function\s+(\w+)/);
55
+ if (funcMatch) {
56
+ const name = funcMatch[1];
57
+ let category = "general";
58
+ if (/format|stringify|serialize|render|display/i.test(name))
59
+ category = "formatting";
60
+ else if (/validate|check|verify|assert|is[A-Z]/i.test(name))
61
+ category = "validation";
62
+ else if (/parse|deserialize|decode|extract/i.test(name))
63
+ category = "parsing";
64
+ else if (/log|error|warn|debug|trace|info/i.test(name))
65
+ category = "logging";
66
+ else if (/fetch|request|get|post|put|delete|api|http/i.test(name))
67
+ category = "http";
68
+ else if (/config|setting|option|env/i.test(name))
69
+ category = "config";
70
+ else if (/hash|encrypt|decrypt|sign|token|auth/i.test(name))
71
+ category = "security";
72
+ else if (/sort|filter|map|reduce|transform|convert/i.test(name))
73
+ category = "data-transform";
74
+ else if (/path|file|dir|folder|read|write/i.test(name))
75
+ category = "filesystem";
76
+ else if (/date|time|duration|format.*date|parse.*date/i.test(name))
77
+ category = "datetime";
78
+ assets.push({ name, type: "function", file: filepath, line: i + 1, category });
79
+ }
80
+ // Exported classes
81
+ const classMatch = line.match(/export\s+class\s+(\w+)/);
82
+ if (classMatch) {
83
+ const name = classMatch[1];
84
+ let category = "general";
85
+ if (/Error|Exception/i.test(name))
86
+ category = "error";
87
+ else if (/Logger|Log/i.test(name))
88
+ category = "logging";
89
+ else if (/Client|Service|Api/i.test(name))
90
+ category = "http";
91
+ else if (/Config|Settings/i.test(name))
92
+ category = "config";
93
+ else if (/Cache/i.test(name))
94
+ category = "cache";
95
+ else if (/Validator/i.test(name))
96
+ category = "validation";
97
+ assets.push({ name, type: "class", file: filepath, line: i + 1, category });
98
+ }
99
+ // Exported consts (utility objects, instances)
100
+ const constMatch = line.match(/export\s+const\s+(\w+)/);
101
+ if (constMatch) {
102
+ assets.push({ name: constMatch[1], type: "const", file: filepath, line: i + 1, category: "general" });
103
+ }
104
+ }
105
+ }
106
+ return assets;
107
+ }
108
+ function analyzeFile(filepath, inventory) {
109
+ const issues = [];
110
+ let content;
111
+ try {
112
+ content = readFileSync(filepath, "utf-8");
113
+ }
114
+ catch {
115
+ return issues;
116
+ }
117
+ const lines = content.split("\n");
118
+ const _fname = basename(filepath);
119
+ for (let i = 0; i < lines.length; i++) {
120
+ const line = lines[i];
121
+ // New function that duplicates an existing exported function's purpose
122
+ const newFuncMatch = line.match(/(?:function|const)\s+(\w+)\s*(?:=\s*(?:async\s*)?\(|\()/);
123
+ if (newFuncMatch && !line.includes("export")) {
124
+ const name = newFuncMatch[1];
125
+ // Check if a similarly-named exported function exists elsewhere
126
+ for (const asset of inventory) {
127
+ if (asset.file === filepath)
128
+ continue;
129
+ if (asset.name.toLowerCase() === name.toLowerCase() && asset.type === "function") {
130
+ issues.push({
131
+ file: filepath,
132
+ line: i + 1,
133
+ issue: "Reinvents existing project function",
134
+ severity: "high",
135
+ detail: `\`${name}\` already exported from \`${basename(asset.file)}:${asset.line}\` — reuse instead of reimplementing`,
136
+ });
137
+ break;
138
+ }
139
+ }
140
+ }
141
+ // Hand-rolled validation when project has validators
142
+ const hasValidators = inventory.some((a) => a.category === "validation");
143
+ if (hasValidators && /(?:if\s*\(\s*typeof\s+\w+\s*!==?\s*['"]|if\s*\(\s*!\w+\s*\|\|\s*typeof)/.test(line)) {
144
+ const block = lines.slice(i, Math.min(i + 5, lines.length)).join("\n");
145
+ const typeChecks = (block.match(/typeof\s+\w+/g) || []).length;
146
+ if (typeChecks >= 3) {
147
+ const validator = inventory.find((a) => a.category === "validation");
148
+ issues.push({
149
+ file: filepath,
150
+ line: i + 1,
151
+ issue: "Hand-rolled validation (project has validators)",
152
+ severity: "medium",
153
+ detail: `${typeChecks} inline type checks — project has validation utilities (e.g., \`${validator?.name}\` in ${validator ? basename(validator.file) : "?"})`,
154
+ });
155
+ }
156
+ }
157
+ // Custom error class when project has error hierarchy
158
+ if (/class\s+\w*Error\s+extends\s+Error/.test(line) && !line.includes("export")) {
159
+ const existingErrors = inventory.filter((a) => a.category === "error");
160
+ if (existingErrors.length > 0) {
161
+ issues.push({
162
+ file: filepath,
163
+ line: i + 1,
164
+ issue: "New error class (project has error hierarchy)",
165
+ severity: "medium",
166
+ detail: `Project already has ${existingErrors.length} error class(es) — extend existing hierarchy instead`,
167
+ });
168
+ }
169
+ }
170
+ // New HTTP client setup when project has one
171
+ if (/(?:axios\.create|new\s+(?:HttpClient|FetchClient)|createHttpClient)/i.test(line)) {
172
+ const existingClients = inventory.filter((a) => a.category === "http" && a.type === "class");
173
+ if (existingClients.length > 0) {
174
+ issues.push({
175
+ file: filepath,
176
+ line: i + 1,
177
+ issue: "New HTTP client (project has one)",
178
+ severity: "medium",
179
+ detail: `Project already has HTTP client(s) (e.g., \`${existingClients[0].name}\`) — reuse the configured instance`,
180
+ });
181
+ }
182
+ }
183
+ // New logger setup when project has one
184
+ if (/(?:new\s+Logger|createLogger|winston\.create|pino\()/i.test(line)) {
185
+ const existingLoggers = inventory.filter((a) => a.category === "logging");
186
+ if (existingLoggers.length > 0) {
187
+ issues.push({
188
+ file: filepath,
189
+ line: i + 1,
190
+ issue: "New logger (project has logging utility)",
191
+ severity: "medium",
192
+ detail: `Project already has logging (e.g., \`${existingLoggers[0].name}\`) — reuse instead of creating another`,
193
+ });
194
+ }
195
+ }
196
+ // Config loading when project has config module
197
+ if (/(?:dotenv\.config|process\.env\.\w+.*process\.env\.\w+.*process\.env)/i.test(line)) {
198
+ const existingConfig = inventory.filter((a) => a.category === "config");
199
+ if (existingConfig.length > 0) {
200
+ issues.push({
201
+ file: filepath,
202
+ line: i + 1,
203
+ issue: "Direct env access (project has config module)",
204
+ severity: "low",
205
+ detail: `Project has config utilities (e.g., \`${existingConfig[0].name}\`) — use centralized config instead of direct env access`,
206
+ });
207
+ }
208
+ }
209
+ }
210
+ return issues;
211
+ }
212
+ // ─── CLI ────────────────────────────────────────────────────────────────────
213
+ export function runContextBlind(argv) {
214
+ if (argv.includes("--help") || argv.includes("-h")) {
215
+ console.log(`
216
+ judges context-blind — Flag AI code that reinvents existing project utilities
217
+
218
+ Usage:
219
+ judges context-blind [dir]
220
+ judges context-blind src/ --format json
221
+
222
+ Options:
223
+ [dir] Directory to scan (default: .)
224
+ --format json JSON output
225
+ --help, -h Show this help
226
+
227
+ Checks: duplicate function names, hand-rolled validation, redundant error classes,
228
+ new HTTP clients, new loggers, direct env access when project has config module.
229
+ `);
230
+ return;
231
+ }
232
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
233
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
234
+ const files = collectFiles(dir);
235
+ const inventory = buildProjectInventory(files);
236
+ const allIssues = [];
237
+ for (const f of files)
238
+ allIssues.push(...analyzeFile(f, inventory));
239
+ const highCount = allIssues.filter((i) => i.severity === "high").length;
240
+ const medCount = allIssues.filter((i) => i.severity === "medium").length;
241
+ const score = Math.max(0, 100 - highCount * 10 - medCount * 5);
242
+ if (format === "json") {
243
+ console.log(JSON.stringify({
244
+ issues: allIssues,
245
+ score,
246
+ inventory: {
247
+ functions: inventory.filter((a) => a.type === "function").length,
248
+ classes: inventory.filter((a) => a.type === "class").length,
249
+ },
250
+ summary: { high: highCount, medium: medCount, total: allIssues.length },
251
+ timestamp: new Date().toISOString(),
252
+ }, null, 2));
253
+ }
254
+ else {
255
+ const badge = score >= 80 ? "✅ CONTEXT-AWARE" : score >= 50 ? "⚠️ BLIND SPOTS" : "❌ REINVENTING";
256
+ console.log(`\n Context Blind: ${badge} (${score}/100)\n ─────────────────────────────`);
257
+ console.log(` Project inventory: ${inventory.filter((a) => a.type === "function").length} functions, ${inventory.filter((a) => a.type === "class").length} classes`);
258
+ if (allIssues.length === 0) {
259
+ console.log(" No reinvention detected.\n");
260
+ return;
261
+ }
262
+ for (const issue of allIssues.slice(0, 25)) {
263
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
264
+ console.log(` ${icon} ${issue.issue}`);
265
+ console.log(` ${issue.file}:${issue.line}`);
266
+ console.log(` ${issue.detail}`);
267
+ }
268
+ if (allIssues.length > 25)
269
+ console.log(` ... and ${allIssues.length - 25} more`);
270
+ console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
271
+ }
272
+ }
273
+ //# sourceMappingURL=context-blind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-blind.js","sourceRoot":"","sources":["../../src/commands/context-blind.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Cross-file consistency — verify naming and pattern consistency across files.
3
+ */
4
+ export declare function runCrossFileConsistency(argv: string[]): void;
5
+ //# sourceMappingURL=cross-file-consistency.d.ts.map
@@ -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"}