@kevinrabun/judges 3.58.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.
Files changed (38) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +56 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/api-misuse.d.ts +5 -0
  6. package/dist/commands/api-misuse.d.ts.map +1 -0
  7. package/dist/commands/api-misuse.js +261 -0
  8. package/dist/commands/api-misuse.js.map +1 -0
  9. package/dist/commands/completion-audit.d.ts +5 -0
  10. package/dist/commands/completion-audit.d.ts.map +1 -0
  11. package/dist/commands/completion-audit.js +297 -0
  12. package/dist/commands/completion-audit.js.map +1 -0
  13. package/dist/commands/cross-file-consistency.d.ts +5 -0
  14. package/dist/commands/cross-file-consistency.d.ts.map +1 -0
  15. package/dist/commands/cross-file-consistency.js +255 -0
  16. package/dist/commands/cross-file-consistency.js.map +1 -0
  17. package/dist/commands/example-leak.d.ts +5 -0
  18. package/dist/commands/example-leak.d.ts.map +1 -0
  19. package/dist/commands/example-leak.js +233 -0
  20. package/dist/commands/example-leak.js.map +1 -0
  21. package/dist/commands/logic-lint.d.ts +5 -0
  22. package/dist/commands/logic-lint.d.ts.map +1 -0
  23. package/dist/commands/logic-lint.js +256 -0
  24. package/dist/commands/logic-lint.js.map +1 -0
  25. package/dist/commands/phantom-import.d.ts +5 -0
  26. package/dist/commands/phantom-import.d.ts.map +1 -0
  27. package/dist/commands/phantom-import.js +261 -0
  28. package/dist/commands/phantom-import.js.map +1 -0
  29. package/dist/commands/review-focus.d.ts +5 -0
  30. package/dist/commands/review-focus.d.ts.map +1 -0
  31. package/dist/commands/review-focus.js +197 -0
  32. package/dist/commands/review-focus.js.map +1 -0
  33. package/dist/commands/spec-conform.d.ts +5 -0
  34. package/dist/commands/spec-conform.d.ts.map +1 -0
  35. package/dist/commands/spec-conform.js +305 -0
  36. package/dist/commands/spec-conform.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Review focus — prioritize review attention for AI-generated changes.
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", ".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
+ // ─── Risk Analysis ──────────────────────────────────────────────────────────
41
+ function analyzeFileRisk(filepath) {
42
+ let content;
43
+ try {
44
+ content = readFileSync(filepath, "utf-8");
45
+ }
46
+ catch {
47
+ return { file: filepath, priority: "low", score: 0, reasons: ["Could not read file"] };
48
+ }
49
+ const reasons = [];
50
+ let riskScore = 0;
51
+ const fname = basename(filepath).toLowerCase();
52
+ // Security-sensitive patterns
53
+ if (/(?:auth|login|session|token|jwt|oauth|password|credential|secret|crypto|encrypt|decrypt|hash)/i.test(fname)) {
54
+ riskScore += 30;
55
+ reasons.push("Security-sensitive filename");
56
+ }
57
+ if (/(?:sql|exec|spawn|eval|innerHTML|dangerouslySetInnerHTML)/.test(content)) {
58
+ riskScore += 25;
59
+ reasons.push("Contains dangerous operations (sql/exec/eval/innerHTML)");
60
+ }
61
+ // Data mutation
62
+ if (/(?:DELETE|INSERT|UPDATE|DROP|TRUNCATE)\s/i.test(content)) {
63
+ riskScore += 20;
64
+ reasons.push("Contains data mutation SQL statements");
65
+ }
66
+ // Payment/financial
67
+ if (/(?:payment|billing|invoice|charge|refund|stripe|paypal|transaction)/i.test(content)) {
68
+ riskScore += 25;
69
+ reasons.push("Payment/financial logic");
70
+ }
71
+ // External API calls
72
+ const apiCallCount = (content.match(/(?:fetch|axios|http\.(?:get|post|put|delete)|request\()/g) || []).length;
73
+ if (apiCallCount > 0) {
74
+ riskScore += apiCallCount * 5;
75
+ reasons.push(`${apiCallCount} external API calls`);
76
+ }
77
+ // Complexity indicators
78
+ const lines = content.split("\n");
79
+ const lineCount = lines.length;
80
+ if (lineCount > 300) {
81
+ riskScore += 10;
82
+ reasons.push(`Large file (${lineCount} lines)`);
83
+ }
84
+ // Deep nesting
85
+ let maxDepth = 0;
86
+ let depth = 0;
87
+ for (const line of lines) {
88
+ for (const ch of line) {
89
+ if (ch === "{")
90
+ depth++;
91
+ if (ch === "}")
92
+ depth--;
93
+ if (depth > maxDepth)
94
+ maxDepth = depth;
95
+ }
96
+ }
97
+ if (maxDepth > 5) {
98
+ riskScore += 10;
99
+ reasons.push(`Deep nesting (${maxDepth} levels)`);
100
+ }
101
+ // Error handling density
102
+ const tryCatchCount = (content.match(/try\s*\{/g) || []).length;
103
+ const funcCount = (content.match(/(?:function|=>)\s*[({]/g) || []).length;
104
+ if (funcCount > 3 && tryCatchCount < funcCount * 0.2) {
105
+ riskScore += 5;
106
+ reasons.push("Low error handling coverage");
107
+ }
108
+ // State management
109
+ if (/(?:useState|useReducer|createStore|createSlice|vuex|pinia)/i.test(content)) {
110
+ riskScore += 10;
111
+ reasons.push("Contains state management logic");
112
+ }
113
+ // Database operations
114
+ if (/(?:prisma|sequelize|typeorm|mongoose|knex|drizzle|\.query\(|\.execute\()/i.test(content)) {
115
+ riskScore += 15;
116
+ reasons.push("Database operations");
117
+ }
118
+ // Middleware / interceptors
119
+ if (/(?:middleware|interceptor|guard|pipe|filter)/i.test(fname)) {
120
+ riskScore += 15;
121
+ reasons.push("Middleware/interceptor (cross-cutting concern)");
122
+ }
123
+ // Route definitions
124
+ const routeCount = (content.match(/\.(get|post|put|patch|delete|use)\s*\(\s*['"]?\//g) || []).length;
125
+ if (routeCount > 0) {
126
+ riskScore += routeCount * 3;
127
+ reasons.push(`${routeCount} route definitions`);
128
+ }
129
+ // Configuration / environment
130
+ if (/(?:config|env|settings|options)/i.test(fname)) {
131
+ riskScore += 10;
132
+ reasons.push("Configuration file");
133
+ }
134
+ const priority = riskScore >= 50 ? "critical" : riskScore >= 30 ? "high" : riskScore >= 15 ? "medium" : "low";
135
+ return { file: filepath, priority, score: Math.min(100, riskScore), reasons };
136
+ }
137
+ // ─── CLI ────────────────────────────────────────────────────────────────────
138
+ export function runReviewFocus(argv) {
139
+ if (argv.includes("--help") || argv.includes("-h")) {
140
+ console.log(`
141
+ judges review-focus — Prioritize review attention for AI-generated changes
142
+
143
+ Usage:
144
+ judges review-focus [dir]
145
+ judges review-focus src/ --format json
146
+
147
+ Options:
148
+ [dir] Directory to scan (default: .)
149
+ --format json JSON output
150
+ --top N Show only top N files (default: 15)
151
+ --help, -h Show this help
152
+
153
+ Risk signals: security-sensitive files, dangerous operations, data mutation,
154
+ payment logic, external APIs, deep nesting, state management, database ops,
155
+ middleware, route definitions, configuration.
156
+ `);
157
+ return;
158
+ }
159
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
160
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
161
+ const topN = parseInt(argv.find((_a, i) => argv[i - 1] === "--top") || "15", 10);
162
+ const files = collectFiles(dir);
163
+ const allItems = files
164
+ .map((f) => analyzeFileRisk(f))
165
+ .filter((i) => i.score > 0)
166
+ .sort((a, b) => b.score - a.score);
167
+ if (format === "json") {
168
+ console.log(JSON.stringify({
169
+ items: allItems.slice(0, topN),
170
+ totalFiles: files.length,
171
+ scoredFiles: allItems.length,
172
+ timestamp: new Date().toISOString(),
173
+ }, null, 2));
174
+ }
175
+ else {
176
+ console.log(`\n Review Focus — Top ${Math.min(topN, allItems.length)} of ${files.length} files\n ─────────────────────────────`);
177
+ if (allItems.length === 0) {
178
+ console.log(" No high-risk files detected.\n");
179
+ return;
180
+ }
181
+ for (const item of allItems.slice(0, topN)) {
182
+ const icon = item.priority === "critical"
183
+ ? "🔴"
184
+ : item.priority === "high"
185
+ ? "🟠"
186
+ : item.priority === "medium"
187
+ ? "🟡"
188
+ : "🔵";
189
+ console.log(` ${icon} [${item.score}] ${item.file}`);
190
+ console.log(` ${item.reasons.join(" | ")}`);
191
+ }
192
+ const critCount = allItems.filter((i) => i.priority === "critical").length;
193
+ const highCount = allItems.filter((i) => i.priority === "high").length;
194
+ console.log(`\n Critical: ${critCount} | High: ${highCount} | Total scored: ${allItems.length}/${files.length}\n`);
195
+ }
196
+ }
197
+ //# sourceMappingURL=review-focus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-focus.js","sourceRoot":"","sources":["../../src/commands/review-focus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Spec conform — check code conformance to project conventions and style patterns.
3
+ */
4
+ export declare function runSpecConform(argv: string[]): void;
5
+ //# sourceMappingURL=spec-conform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-conform.d.ts","sourceRoot":"","sources":["../../src/commands/spec-conform.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6RH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkEnD"}
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Spec conform — check code conformance to project conventions and style patterns.
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 detectConventions(dir, files) {
41
+ const conv = {
42
+ useSemicolons: null,
43
+ quoteStyle: null,
44
+ indentStyle: null,
45
+ indentSize: null,
46
+ namingStyle: null,
47
+ hasEslint: false,
48
+ hasPrettier: false,
49
+ hasEditorConfig: false,
50
+ fileNamingPattern: null,
51
+ };
52
+ // Check for config files
53
+ try {
54
+ const entries = readdirSync(dir);
55
+ conv.hasEslint = entries.some((e) => /^\.?eslint/.test(e));
56
+ conv.hasPrettier = entries.some((e) => /^\.?prettier/.test(e));
57
+ conv.hasEditorConfig = entries.includes(".editorconfig");
58
+ }
59
+ catch {
60
+ /* skip */
61
+ }
62
+ // Analyze existing file conventions from first 20 files
63
+ let semiCount = 0;
64
+ let noSemiCount = 0;
65
+ let singleQuote = 0;
66
+ let doubleQuote = 0;
67
+ let tabIndent = 0;
68
+ let spaceIndent = 0;
69
+ const indentSizes = [];
70
+ let camelCount = 0;
71
+ let snakeCount = 0;
72
+ const sampleFiles = files.slice(0, 20);
73
+ for (const filepath of sampleFiles) {
74
+ let content;
75
+ try {
76
+ content = readFileSync(filepath, "utf-8");
77
+ }
78
+ catch {
79
+ continue;
80
+ }
81
+ const fileLines = content.split("\n");
82
+ for (const line of fileLines.slice(0, 50)) {
83
+ // Semicolons
84
+ if (/;\s*$/.test(line.trim()) && !/\/\/|\/\*|\*/.test(line.trim().slice(0, 2)))
85
+ semiCount++;
86
+ if (/[^;{}\s]\s*$/.test(line.trim()) && line.trim().length > 5 && !/\/\/|\/\*|\*|=>/.test(line.trim()))
87
+ noSemiCount++;
88
+ // Quotes
89
+ const singles = (line.match(/'/g) || []).length;
90
+ const doubles = (line.match(/"/g) || []).length;
91
+ singleQuote += singles;
92
+ doubleQuote += doubles;
93
+ // Indentation
94
+ const indent = line.match(/^(\s+)/);
95
+ if (indent) {
96
+ if (indent[1].includes("\t"))
97
+ tabIndent++;
98
+ else {
99
+ spaceIndent++;
100
+ indentSizes.push(indent[1].length);
101
+ }
102
+ }
103
+ }
104
+ // Variable naming
105
+ const varDecls = content.match(/(?:const|let|var)\s+([a-z]\w+)/g) || [];
106
+ for (const decl of varDecls) {
107
+ const name = decl.split(/\s+/)[1];
108
+ if (name.includes("_"))
109
+ snakeCount++;
110
+ else
111
+ camelCount++;
112
+ }
113
+ }
114
+ conv.useSemicolons = semiCount > noSemiCount * 2 ? true : noSemiCount > semiCount * 2 ? false : null;
115
+ conv.quoteStyle = singleQuote > doubleQuote * 1.5 ? "single" : doubleQuote > singleQuote * 1.5 ? "double" : null;
116
+ conv.indentStyle = tabIndent > spaceIndent ? "tabs" : spaceIndent > tabIndent ? "spaces" : null;
117
+ if (indentSizes.length > 0) {
118
+ const mode = indentSizes.sort((a, b) => a - b)[Math.floor(indentSizes.length / 2)];
119
+ conv.indentSize = mode <= 4 ? mode : null;
120
+ }
121
+ conv.namingStyle = camelCount > snakeCount * 2 ? "camelCase" : snakeCount > camelCount * 2 ? "snake_case" : null;
122
+ // File naming pattern
123
+ const fileNames = files.map((f) => basename(f, extname(f)));
124
+ const kebab = fileNames.filter((n) => /^[a-z][a-z0-9-]*$/.test(n)).length;
125
+ const camel = fileNames.filter((n) => /^[a-z][a-zA-Z0-9]*$/.test(n) && /[A-Z]/.test(n)).length;
126
+ const pascal = fileNames.filter((n) => /^[A-Z][a-zA-Z0-9]*$/.test(n)).length;
127
+ const snake = fileNames.filter((n) => /^[a-z][a-z0-9_]*$/.test(n) && n.includes("_")).length;
128
+ const counts = [
129
+ { style: "kebab-case", count: kebab },
130
+ { style: "camelCase", count: camel },
131
+ { style: "PascalCase", count: pascal },
132
+ { style: "snake_case", count: snake },
133
+ ].sort((a, b) => b.count - a.count);
134
+ if (counts[0].count > files.length * 0.5)
135
+ conv.fileNamingPattern = counts[0].style;
136
+ return conv;
137
+ }
138
+ // ─── Analysis ───────────────────────────────────────────────────────────────
139
+ function analyzeFile(filepath, conv) {
140
+ const issues = [];
141
+ let content;
142
+ try {
143
+ content = readFileSync(filepath, "utf-8");
144
+ }
145
+ catch {
146
+ return issues;
147
+ }
148
+ const lines = content.split("\n");
149
+ const fname = basename(filepath, extname(filepath));
150
+ // File naming convention
151
+ if (conv.fileNamingPattern === "kebab-case" && !/^[a-z][a-z0-9.-]*$/.test(fname) && !fname.startsWith("_")) {
152
+ issues.push({
153
+ file: filepath,
154
+ line: 1,
155
+ issue: "File name breaks project convention",
156
+ severity: "low",
157
+ detail: `Project uses kebab-case filenames but this file is named \`${fname}\``,
158
+ });
159
+ }
160
+ if (conv.fileNamingPattern === "PascalCase" && !/^[A-Z]/.test(fname)) {
161
+ issues.push({
162
+ file: filepath,
163
+ line: 1,
164
+ issue: "File name breaks project convention",
165
+ severity: "low",
166
+ detail: `Project uses PascalCase filenames but this file is named \`${fname}\``,
167
+ });
168
+ }
169
+ for (let i = 0; i < lines.length; i++) {
170
+ const line = lines[i];
171
+ const trimmed = line.trim();
172
+ // Semicolon consistency
173
+ if (conv.useSemicolons === true && /[a-zA-Z0-9)\]'"]\s*$/.test(trimmed) && trimmed.length > 10) {
174
+ if (!/^\s*(?:\/\/|\/\*|\*|import|export|if|else|for|while|do|switch|try|catch|finally|class|interface|type|enum|function|=>|\{|\}|\(|\)|,)/.test(trimmed)) {
175
+ issues.push({
176
+ file: filepath,
177
+ line: i + 1,
178
+ issue: "Missing semicolon (project uses semicolons)",
179
+ severity: "low",
180
+ detail: "Line ends without semicolon — inconsistent with project style",
181
+ });
182
+ }
183
+ }
184
+ // Quote style consistency
185
+ if (conv.quoteStyle === "single" && /"[^"]*"/.test(trimmed) && !/import\s/.test(trimmed)) {
186
+ if (!trimmed.includes("'") && !trimmed.includes("`") && !/console\.|require|JSON/.test(trimmed)) {
187
+ // Only flag if it's clearly a string, not a JSON key or HTML attribute
188
+ const dqCount = (trimmed.match(/"/g) || []).length;
189
+ if (dqCount === 2) {
190
+ issues.push({
191
+ file: filepath,
192
+ line: i + 1,
193
+ issue: "Double quotes (project uses single)",
194
+ severity: "low",
195
+ detail: "Project convention is single quotes — AI generated double-quoted string",
196
+ });
197
+ }
198
+ }
199
+ }
200
+ // Variable naming convention
201
+ if (conv.namingStyle === "camelCase") {
202
+ const snakeMatch = trimmed.match(/(?:const|let|var)\s+([a-z]+_[a-z_]+)/);
203
+ if (snakeMatch) {
204
+ issues.push({
205
+ file: filepath,
206
+ line: i + 1,
207
+ issue: "snake_case variable in camelCase project",
208
+ severity: "medium",
209
+ detail: `\`${snakeMatch[1]}\` uses snake_case — project convention is camelCase`,
210
+ });
211
+ }
212
+ }
213
+ if (conv.namingStyle === "snake_case") {
214
+ const camelMatch = trimmed.match(/(?:const|let|var)\s+([a-z]+[A-Z]\w+)/);
215
+ if (camelMatch) {
216
+ issues.push({
217
+ file: filepath,
218
+ line: i + 1,
219
+ issue: "camelCase variable in snake_case project",
220
+ severity: "medium",
221
+ detail: `\`${camelMatch[1]}\` uses camelCase — project convention is snake_case`,
222
+ });
223
+ }
224
+ }
225
+ // Mixed indentation
226
+ if (conv.indentStyle === "spaces" && /^\t/.test(line)) {
227
+ issues.push({
228
+ file: filepath,
229
+ line: i + 1,
230
+ issue: "Tab indentation in spaces-only project",
231
+ severity: "low",
232
+ detail: "Project uses spaces for indentation — AI generated tab-indented code",
233
+ });
234
+ }
235
+ if (conv.indentStyle === "tabs" && /^ {2,}/.test(line) && !/^\s*\*/.test(line)) {
236
+ issues.push({
237
+ file: filepath,
238
+ line: i + 1,
239
+ issue: "Space indentation in tabs-only project",
240
+ severity: "low",
241
+ detail: "Project uses tabs for indentation — AI generated space-indented code",
242
+ });
243
+ }
244
+ }
245
+ return issues;
246
+ }
247
+ // ─── CLI ────────────────────────────────────────────────────────────────────
248
+ export function runSpecConform(argv) {
249
+ if (argv.includes("--help") || argv.includes("-h")) {
250
+ console.log(`
251
+ judges spec-conform — Check code conformance to project conventions
252
+
253
+ Usage:
254
+ judges spec-conform [dir]
255
+ judges spec-conform src/ --format json
256
+
257
+ Options:
258
+ [dir] Directory to scan (default: .)
259
+ --format json JSON output
260
+ --help, -h Show this help
261
+
262
+ Auto-detects: semicolon usage, quote style, indentation, variable naming, file naming.
263
+ Flags AI-generated code that breaks detected project conventions.
264
+ `);
265
+ return;
266
+ }
267
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
268
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
269
+ const files = collectFiles(dir);
270
+ const conv = detectConventions(dir, files);
271
+ const allIssues = [];
272
+ for (const f of files)
273
+ allIssues.push(...analyzeFile(f, conv));
274
+ const highCount = allIssues.filter((i) => i.severity === "high").length;
275
+ const medCount = allIssues.filter((i) => i.severity === "medium").length;
276
+ const score = Math.max(0, 100 - highCount * 10 - medCount * 4 - allIssues.filter((i) => i.severity === "low").length);
277
+ if (format === "json") {
278
+ console.log(JSON.stringify({
279
+ conventions: conv,
280
+ issues: allIssues,
281
+ score,
282
+ summary: { high: highCount, medium: medCount, total: allIssues.length },
283
+ timestamp: new Date().toISOString(),
284
+ }, null, 2));
285
+ }
286
+ else {
287
+ const badge = score >= 80 ? "✅ CONFORMING" : score >= 50 ? "⚠️ DRIFTING" : "❌ NONCONFORMING";
288
+ console.log(`\n Spec Conform: ${badge} (${score}/100)\n ─────────────────────────────`);
289
+ console.log(` Detected: semis=${conv.useSemicolons ?? "?"} quotes=${conv.quoteStyle ?? "?"} indent=${conv.indentStyle ?? "?"}(${conv.indentSize ?? "?"}) naming=${conv.namingStyle ?? "?"} files=${conv.fileNamingPattern ?? "?"}`);
290
+ if (allIssues.length === 0) {
291
+ console.log(" No convention violations detected.\n");
292
+ return;
293
+ }
294
+ for (const issue of allIssues.slice(0, 25)) {
295
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
296
+ console.log(` ${icon} ${issue.issue}`);
297
+ console.log(` ${issue.file}:${issue.line}`);
298
+ console.log(` ${issue.detail}`);
299
+ }
300
+ if (allIssues.length > 25)
301
+ console.log(` ... and ${allIssues.length - 25} more`);
302
+ console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
303
+ }
304
+ }
305
+ //# sourceMappingURL=spec-conform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-conform.js","sourceRoot":"","sources":["../../src/commands/spec-conform.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevinrabun/judges",
3
- "version": "3.58.0",
3
+ "version": "3.59.0",
4
4
  "description": "45 specialized judges that evaluate AI-generated code for security, cost, and quality.",
5
5
  "mcpName": "io.github.KevinRabun/judges",
6
6
  "type": "module",
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/kevinrabun/judges",
8
8
  "source": "github"
9
9
  },
10
- "version": "3.58.0",
10
+ "version": "3.59.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.58.0",
15
+ "version": "3.59.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }