@kevinrabun/judges 3.49.0 → 3.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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/ai-gate.d.ts +8 -0
  6. package/dist/commands/ai-gate.d.ts.map +1 -0
  7. package/dist/commands/ai-gate.js +213 -0
  8. package/dist/commands/ai-gate.js.map +1 -0
  9. package/dist/commands/ai-output-compare.d.ts +9 -0
  10. package/dist/commands/ai-output-compare.d.ts.map +1 -0
  11. package/dist/commands/ai-output-compare.js +203 -0
  12. package/dist/commands/ai-output-compare.js.map +1 -0
  13. package/dist/commands/ai-pattern-trend.d.ts +9 -0
  14. package/dist/commands/ai-pattern-trend.d.ts.map +1 -0
  15. package/dist/commands/ai-pattern-trend.js +224 -0
  16. package/dist/commands/ai-pattern-trend.js.map +1 -0
  17. package/dist/commands/api-audit.d.ts +9 -0
  18. package/dist/commands/api-audit.d.ts.map +1 -0
  19. package/dist/commands/api-audit.js +360 -0
  20. package/dist/commands/api-audit.js.map +1 -0
  21. package/dist/commands/arch-audit.d.ts +9 -0
  22. package/dist/commands/arch-audit.d.ts.map +1 -0
  23. package/dist/commands/arch-audit.js +284 -0
  24. package/dist/commands/arch-audit.js.map +1 -0
  25. package/dist/commands/clarity-score.d.ts +9 -0
  26. package/dist/commands/clarity-score.d.ts.map +1 -0
  27. package/dist/commands/clarity-score.js +261 -0
  28. package/dist/commands/clarity-score.js.map +1 -0
  29. package/dist/commands/compliance-map.d.ts +9 -0
  30. package/dist/commands/compliance-map.d.ts.map +1 -0
  31. package/dist/commands/compliance-map.js +375 -0
  32. package/dist/commands/compliance-map.js.map +1 -0
  33. package/dist/commands/exec-report.d.ts +9 -0
  34. package/dist/commands/exec-report.d.ts.map +1 -0
  35. package/dist/commands/exec-report.js +272 -0
  36. package/dist/commands/exec-report.js.map +1 -0
  37. package/dist/commands/guided-tour.d.ts +9 -0
  38. package/dist/commands/guided-tour.d.ts.map +1 -0
  39. package/dist/commands/guided-tour.js +288 -0
  40. package/dist/commands/guided-tour.js.map +1 -0
  41. package/dist/commands/hallucination-score.d.ts +9 -0
  42. package/dist/commands/hallucination-score.d.ts.map +1 -0
  43. package/dist/commands/hallucination-score.js +317 -0
  44. package/dist/commands/hallucination-score.js.map +1 -0
  45. package/dist/commands/iac-lint.d.ts +8 -0
  46. package/dist/commands/iac-lint.d.ts.map +1 -0
  47. package/dist/commands/iac-lint.js +313 -0
  48. package/dist/commands/iac-lint.js.map +1 -0
  49. package/dist/commands/perf-compare.d.ts +9 -0
  50. package/dist/commands/perf-compare.d.ts.map +1 -0
  51. package/dist/commands/perf-compare.js +246 -0
  52. package/dist/commands/perf-compare.js.map +1 -0
  53. package/dist/commands/pii-scan.d.ts +8 -0
  54. package/dist/commands/pii-scan.d.ts.map +1 -0
  55. package/dist/commands/pii-scan.js +300 -0
  56. package/dist/commands/pii-scan.js.map +1 -0
  57. package/dist/commands/secret-scan.d.ts +8 -0
  58. package/dist/commands/secret-scan.d.ts.map +1 -0
  59. package/dist/commands/secret-scan.js +245 -0
  60. package/dist/commands/secret-scan.js.map +1 -0
  61. package/dist/commands/test-suggest.d.ts +9 -0
  62. package/dist/commands/test-suggest.d.ts.map +1 -0
  63. package/dist/commands/test-suggest.js +248 -0
  64. package/dist/commands/test-suggest.js.map +1 -0
  65. package/dist/commands/vendor-lock-detect.d.ts +8 -0
  66. package/dist/commands/vendor-lock-detect.d.ts.map +1 -0
  67. package/dist/commands/vendor-lock-detect.js +289 -0
  68. package/dist/commands/vendor-lock-detect.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Architecture audit — evaluate architectural implications of
3
+ * AI-generated code: coupling, separation of concerns, dependency
4
+ * injection, testability, scalability.
5
+ *
6
+ * All analysis local.
7
+ */
8
+ import { existsSync, readFileSync, readdirSync } from "fs";
9
+ import { join, extname, relative } from "path";
10
+ // ─── Analysers ──────────────────────────────────────────────────────────────
11
+ function analyzeArchitecture(content, filePath) {
12
+ const lines = content.split("\n");
13
+ const metrics = [];
14
+ const issues = [];
15
+ // 1. Coupling — count imports / dependencies
16
+ const importLines = lines.filter((l) => /^\s*import\s/.test(l) || /require\s*\(/.test(l));
17
+ const importCount = importLines.length;
18
+ const couplingScore = importCount <= 5 ? 100 : importCount <= 10 ? 75 : importCount <= 20 ? 50 : importCount <= 30 ? 25 : 10;
19
+ metrics.push({
20
+ id: "coupling",
21
+ label: "Loose Coupling",
22
+ score: couplingScore,
23
+ weight: 20,
24
+ detail: `${importCount} imports`,
25
+ });
26
+ if (importCount > 15) {
27
+ issues.push({
28
+ id: "high-coupling",
29
+ label: "High Coupling",
30
+ severity: "high",
31
+ detail: `${importCount} imports — consider splitting this module`,
32
+ });
33
+ }
34
+ // 2. Separation of concerns — detect mixed responsibilities
35
+ const hasDom = /document\.|querySelector|innerHTML|addEventListener/.test(content);
36
+ const hasDB = /createConnection|query\(|findOne|findMany|prisma\.|mongoose\.|sequelize/.test(content);
37
+ const hasHTTP = /fetch\(|axios\.|http\.|https\.|request\(/.test(content);
38
+ const hasFS = /readFileSync|writeFileSync|createReadStream|createWriteStream/.test(content);
39
+ const concernCount = [hasDom, hasDB, hasHTTP, hasFS].filter(Boolean).length;
40
+ const socScore = concernCount <= 1 ? 100 : concernCount === 2 ? 60 : 30;
41
+ metrics.push({
42
+ id: "soc",
43
+ label: "Separation of Concerns",
44
+ score: socScore,
45
+ weight: 20,
46
+ detail: `${concernCount} concern(s) detected`,
47
+ });
48
+ if (concernCount > 1) {
49
+ const mixed = [hasDom && "DOM", hasDB && "Database", hasHTTP && "HTTP", hasFS && "File I/O"]
50
+ .filter(Boolean)
51
+ .join(", ");
52
+ issues.push({ id: "mixed-concerns", label: "Mixed Concerns", severity: "medium", detail: `File mixes: ${mixed}` });
53
+ }
54
+ // 3. Dependency injection / hardcoded dependencies
55
+ const hardcodedNew = (content.match(/new\s+\w+\(/g) || []).length;
56
+ const hasConstructorInjection = /constructor\s*\([^)]*\b(?:private|public|readonly)\b/.test(content);
57
+ const hasParameterInjection = /function\s+\w+\s*\([^)]*:\s*\w+Interface\b/.test(content) || /\w+:\s*\w+Service\b/.test(content);
58
+ const diScore = hardcodedNew <= 2 || hasConstructorInjection || hasParameterInjection ? 100 : hardcodedNew <= 5 ? 60 : 30;
59
+ metrics.push({
60
+ id: "dependency-injection",
61
+ label: "Dependency Injection",
62
+ score: diScore,
63
+ weight: 15,
64
+ detail: `${hardcodedNew} direct instantiations`,
65
+ });
66
+ if (hardcodedNew > 5 && !hasConstructorInjection) {
67
+ issues.push({
68
+ id: "no-di",
69
+ label: "No Dependency Injection",
70
+ severity: "medium",
71
+ detail: `${hardcodedNew} hardcoded instantiations without constructor injection`,
72
+ });
73
+ }
74
+ // 4. Testability
75
+ const exportCount = (content.match(/\bexport\s+(?:function|class|const|interface|type|enum)\b/g) || []).length;
76
+ const hasDefault = /\bexport\s+default\b/.test(content);
77
+ const hasGlobalState = /\blet\s+\w+\s*=/.test(content) && !/\bfunction\b/.test(content.split(/\blet\b/)[0] || "");
78
+ const sideEffects = (content.match(/console\.\w+|process\.exit|process\.env/g) || []).length;
79
+ const testabilityScore = (exportCount > 0 || hasDefault ? 30 : 0) +
80
+ (hasGlobalState ? 0 : 25) +
81
+ (hardcodedNew <= 3 ? 25 : 0) +
82
+ (sideEffects <= 3 ? 20 : sideEffects <= 8 ? 10 : 0);
83
+ metrics.push({ id: "testability", label: "Testability", score: Math.min(100, testabilityScore), weight: 15 });
84
+ if (testabilityScore < 50) {
85
+ issues.push({
86
+ id: "low-testability",
87
+ label: "Low Testability",
88
+ severity: "medium",
89
+ detail: "Module has global state, side effects, or no exports — hard to unit-test",
90
+ });
91
+ }
92
+ // 5. Single Responsibility — file length & export count
93
+ const fileLength = lines.length;
94
+ const srScore = fileLength <= 200 ? 100 : fileLength <= 400 ? 70 : fileLength <= 600 ? 40 : 10;
95
+ metrics.push({
96
+ id: "srp",
97
+ label: "Single Responsibility",
98
+ score: srScore,
99
+ weight: 15,
100
+ detail: `${fileLength} lines, ${exportCount} exports`,
101
+ });
102
+ if (fileLength > 400) {
103
+ issues.push({
104
+ id: "large-file",
105
+ label: "Large File",
106
+ severity: "low",
107
+ detail: `${fileLength} lines — consider splitting into focused modules`,
108
+ });
109
+ }
110
+ // 6. Scalability patterns
111
+ const hasAsync = /\basync\b/.test(content);
112
+ const hasErrorHandling = /\btry\s*{/.test(content) || /\.catch\(/.test(content);
113
+ const hasStreaming = /\bStream\b|createReadStream|pipeline\(/.test(content);
114
+ const _hasPooling = /pool\.|Pool\(|createPool/.test(content);
115
+ let scalabilityScore = 50;
116
+ if (hasAsync)
117
+ scalabilityScore += 20;
118
+ if (hasErrorHandling)
119
+ scalabilityScore += 15;
120
+ if (hasStreaming)
121
+ scalabilityScore += 15;
122
+ metrics.push({
123
+ id: "scalability",
124
+ label: "Scalability Patterns",
125
+ score: Math.min(100, scalabilityScore),
126
+ weight: 15,
127
+ });
128
+ void filePath;
129
+ return { metrics, issues };
130
+ }
131
+ function computeOverallScore(metrics) {
132
+ const totalWeight = metrics.reduce((sum, m) => sum + m.weight, 0);
133
+ const weighted = metrics.reduce((sum, m) => sum + m.score * m.weight, 0);
134
+ return totalWeight > 0 ? Math.round(weighted / totalWeight) : 0;
135
+ }
136
+ function gradeFor(score) {
137
+ if (score >= 90)
138
+ return "A";
139
+ if (score >= 80)
140
+ return "B";
141
+ if (score >= 70)
142
+ return "C";
143
+ if (score >= 60)
144
+ return "D";
145
+ return "F";
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 runArchAudit(argv) {
180
+ if (argv.includes("--help") || argv.includes("-h")) {
181
+ console.log(`
182
+ judges arch-audit — Evaluate architectural quality of code
183
+
184
+ Usage:
185
+ judges arch-audit <file-or-dir>
186
+ judges arch-audit src/ --min-grade C
187
+
188
+ Options:
189
+ --min-grade <A-F> Only show files at or below this grade
190
+ --format json JSON output
191
+ --help, -h Show this help
192
+
193
+ Metrics:
194
+ • Loose Coupling (import count)
195
+ • Separation of Concerns (DOM/DB/HTTP/FS mixing)
196
+ • Dependency Injection (hardcoded vs. injected)
197
+ • Testability (exports, global state, side effects)
198
+ • Single Responsibility (file size, export count)
199
+ • Scalability Patterns (async, error handling, streaming)
200
+ `);
201
+ return;
202
+ }
203
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
204
+ const minGrade = argv.find((_a, i) => argv[i - 1] === "--min-grade");
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 { metrics, issues } = analyzeArchitecture(content, f);
228
+ const overall = computeOverallScore(metrics);
229
+ results.push({ file: relative(target, f) || f, overallScore: overall, grade: gradeFor(overall), metrics, issues });
230
+ }
231
+ let filtered = results;
232
+ if (minGrade) {
233
+ const gradeOrder = ["A", "B", "C", "D", "F"];
234
+ const minIdx = gradeOrder.indexOf(minGrade.toUpperCase());
235
+ if (minIdx >= 0)
236
+ filtered = results.filter((r) => gradeOrder.indexOf(r.grade) >= minIdx);
237
+ }
238
+ filtered.sort((a, b) => a.overallScore - b.overallScore);
239
+ if (format === "json") {
240
+ console.log(JSON.stringify({ files: filtered, scannedFiles: files.length, timestamp: new Date().toISOString() }, null, 2));
241
+ }
242
+ else {
243
+ const avgScore = results.length > 0 ? Math.round(results.reduce((s, r) => s + r.overallScore, 0) / results.length) : 0;
244
+ console.log(`\n Architecture Audit — ${files.length} files`);
245
+ console.log(` Average: ${avgScore}/100 (${gradeFor(avgScore)})\n ──────────────────────────`);
246
+ if (filtered.length === 0) {
247
+ console.log(` ✅ All files meet architecture threshold\n`);
248
+ return;
249
+ }
250
+ for (const r of filtered.slice(0, 20)) {
251
+ const icon = r.grade === "A" || r.grade === "B" ? "🟢" : r.grade === "C" ? "🟡" : r.grade === "D" ? "🟠" : "🔴";
252
+ console.log(`\n ${icon} ${r.file} — ${r.overallScore}/100 (${r.grade})`);
253
+ for (const m of r.metrics) {
254
+ const mIcon = m.score >= 70 ? "✓" : m.score >= 40 ? "~" : "✗";
255
+ console.log(` ${mIcon} ${m.label.padEnd(24)} ${String(m.score).padEnd(4)} ${m.detail || ""}`);
256
+ }
257
+ if (r.issues.length > 0) {
258
+ console.log(` Issues:`);
259
+ for (const issue of r.issues) {
260
+ const sev = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟠" : "🟡";
261
+ console.log(` ${sev} ${issue.label}: ${issue.detail}`);
262
+ }
263
+ }
264
+ }
265
+ if (filtered.length > 20)
266
+ console.log(` ... and ${filtered.length - 20} more files`);
267
+ // Grade distribution
268
+ const dist = { A: 0, B: 0, C: 0, D: 0, F: 0 };
269
+ for (const r of results)
270
+ dist[r.grade]++;
271
+ console.log(`\n Distribution: A:${dist.A} B:${dist.B} C:${dist.C} D:${dist.D} F:${dist.F}`);
272
+ // Top issues
273
+ const allIssues = results.flatMap((r) => r.issues.map((iss) => ({ file: r.file, ...iss })));
274
+ const highIssues = allIssues.filter((i) => i.severity === "high");
275
+ if (highIssues.length > 0) {
276
+ console.log(`\n ⚠ ${highIssues.length} high-severity architecture issue(s):`);
277
+ for (const iss of highIssues.slice(0, 10)) {
278
+ console.log(` ${iss.file}: ${iss.detail}`);
279
+ }
280
+ }
281
+ console.log("");
282
+ }
283
+ }
284
+ //# sourceMappingURL=arch-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arch-audit.js","sourceRoot":"","sources":["../../src/commands/arch-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Clarity score — measure code readability and self-documentation
3
+ * specifically for AI-generated code. Flags "correct but cryptic"
4
+ * patterns that need documentation investment.
5
+ *
6
+ * All analysis local.
7
+ */
8
+ export declare function runClarityScore(argv: string[]): void;
9
+ //# sourceMappingURL=clarity-score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clarity-score.d.ts","sourceRoot":"","sources":["../../src/commands/clarity-score.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoLH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqGpD"}
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Clarity score — measure code readability and self-documentation
3
+ * specifically for AI-generated code. Flags "correct but cryptic"
4
+ * patterns that need documentation investment.
5
+ *
6
+ * All analysis local.
7
+ */
8
+ import { existsSync, readFileSync, readdirSync } from "fs";
9
+ import { join, extname } from "path";
10
+ // ─── Analysers ──────────────────────────────────────────────────────────────
11
+ function analyzeClarity(content) {
12
+ const lines = content.split("\n");
13
+ const nonEmpty = lines.filter((l) => l.trim().length > 0);
14
+ const metrics = [];
15
+ const suggestions = [];
16
+ // 1. Naming quality
17
+ const identifiers = content.match(/(?:const|let|var|function)\s+(\w+)/g) || [];
18
+ const shortNames = identifiers.filter((id) => {
19
+ const name = id.replace(/^(?:const|let|var|function)\s+/, "");
20
+ return name.length <= 2 && !["i", "j", "k", "x", "y", "id"].includes(name);
21
+ });
22
+ const namingScore = identifiers.length > 0 ? Math.max(0, 100 - (shortNames.length / identifiers.length) * 200) : 100;
23
+ metrics.push({ id: "naming", label: "Naming Quality", score: Math.round(namingScore), weight: 25 });
24
+ if (namingScore < 60)
25
+ suggestions.push("Use descriptive variable names — single-letter names reduce readability");
26
+ // 2. Comment coverage
27
+ const commentLines = lines.filter((l) => /^\s*(?:\/\/|\/?\*|#)/.test(l)).length;
28
+ const commentRatio = nonEmpty.length > 0 ? commentLines / nonEmpty.length : 0;
29
+ const commentScore = commentRatio >= 0.15 ? 100 : commentRatio >= 0.08 ? 70 : commentRatio >= 0.03 ? 40 : 10;
30
+ metrics.push({
31
+ id: "comments",
32
+ label: "Comment Coverage",
33
+ score: commentScore,
34
+ weight: 20,
35
+ detail: `${Math.round(commentRatio * 100)}% of lines`,
36
+ });
37
+ if (commentScore < 50)
38
+ suggestions.push("Add comments explaining the 'why' — not the 'what'");
39
+ // 3. Function length
40
+ const fnBodies = [];
41
+ let braceDepth = 0;
42
+ let fnStart = -1;
43
+ for (let i = 0; i < lines.length; i++) {
44
+ if (/\bfunction\b|=>\s*{/.test(lines[i]) && fnStart === -1)
45
+ fnStart = i;
46
+ braceDepth += (lines[i].match(/{/g) || []).length;
47
+ braceDepth -= (lines[i].match(/}/g) || []).length;
48
+ if (fnStart >= 0 && braceDepth <= 0) {
49
+ fnBodies.push(i - fnStart + 1);
50
+ fnStart = -1;
51
+ }
52
+ }
53
+ const avgFnLength = fnBodies.length > 0 ? fnBodies.reduce((a, b) => a + b, 0) / fnBodies.length : 0;
54
+ const fnLengthScore = avgFnLength <= 15 ? 100 : avgFnLength <= 30 ? 70 : avgFnLength <= 50 ? 40 : 10;
55
+ metrics.push({
56
+ id: "function-length",
57
+ label: "Function Length",
58
+ score: fnLengthScore,
59
+ weight: 15,
60
+ detail: `avg ${Math.round(avgFnLength)} lines`,
61
+ });
62
+ if (fnLengthScore < 50)
63
+ suggestions.push("Break long functions into smaller, focused functions");
64
+ // 4. Line complexity
65
+ const longLines = nonEmpty.filter((l) => l.length > 100).length;
66
+ const longLineRatio = nonEmpty.length > 0 ? longLines / nonEmpty.length : 0;
67
+ const lineComplexityScore = longLineRatio <= 0.05 ? 100 : longLineRatio <= 0.15 ? 70 : longLineRatio <= 0.3 ? 40 : 10;
68
+ metrics.push({
69
+ id: "line-length",
70
+ label: "Line Length",
71
+ score: lineComplexityScore,
72
+ weight: 10,
73
+ detail: `${longLines} lines > 100 chars`,
74
+ });
75
+ if (lineComplexityScore < 50)
76
+ suggestions.push("Break long lines for readability");
77
+ // 5. Nesting depth
78
+ let maxNesting = 0;
79
+ let currentNesting = 0;
80
+ for (const line of lines) {
81
+ currentNesting += (line.match(/{/g) || []).length;
82
+ maxNesting = Math.max(maxNesting, currentNesting);
83
+ currentNesting -= (line.match(/}/g) || []).length;
84
+ }
85
+ const nestingScore = maxNesting <= 3 ? 100 : maxNesting <= 5 ? 70 : maxNesting <= 7 ? 40 : 10;
86
+ metrics.push({
87
+ id: "nesting",
88
+ label: "Nesting Depth",
89
+ score: nestingScore,
90
+ weight: 15,
91
+ detail: `max ${maxNesting} levels`,
92
+ });
93
+ if (nestingScore < 50)
94
+ suggestions.push("Reduce nesting depth with early returns and guard clauses");
95
+ // 6. Magic numbers/strings
96
+ const magicNumbers = content.match(/(?<!\w)\d{3,}(?!\w)/g) || [];
97
+ const inlineStrings = content.match(/["'][^"']{20,}["']/g) || [];
98
+ const magicCount = magicNumbers.length + inlineStrings.length;
99
+ const magicScore = magicCount <= 2 ? 100 : magicCount <= 5 ? 70 : magicCount <= 10 ? 40 : 10;
100
+ metrics.push({
101
+ id: "magic-values",
102
+ label: "Named Constants",
103
+ score: magicScore,
104
+ weight: 10,
105
+ detail: `${magicCount} magic values`,
106
+ });
107
+ if (magicScore < 50)
108
+ suggestions.push("Extract magic numbers and long strings into named constants");
109
+ // 7. Consistent style
110
+ const semicolons = (content.match(/;\s*$/gm) || []).length;
111
+ const noSemicolons = nonEmpty.length - semicolons;
112
+ const semiRatio = nonEmpty.length > 0 ? Math.max(semicolons, noSemicolons) / nonEmpty.length : 1;
113
+ const styleScore = semiRatio >= 0.8 ? 100 : semiRatio >= 0.6 ? 60 : 30;
114
+ metrics.push({ id: "style-consistency", label: "Style Consistency", score: styleScore, weight: 5 });
115
+ if (styleScore < 60)
116
+ suggestions.push("Use consistent code style (semicolons, quotes, indentation)");
117
+ return { metrics, suggestions };
118
+ }
119
+ function computeOverallScore(metrics) {
120
+ const totalWeight = metrics.reduce((sum, m) => sum + m.weight, 0);
121
+ const weighted = metrics.reduce((sum, m) => sum + m.score * m.weight, 0);
122
+ return totalWeight > 0 ? Math.round(weighted / totalWeight) : 0;
123
+ }
124
+ function grade(score) {
125
+ if (score >= 90)
126
+ return "A";
127
+ if (score >= 80)
128
+ return "B";
129
+ if (score >= 70)
130
+ return "C";
131
+ if (score >= 60)
132
+ return "D";
133
+ return "F";
134
+ }
135
+ // ─── Scanner ────────────────────────────────────────────────────────────────
136
+ const SKIP = new Set(["node_modules", ".git", "dist", "build", "coverage"]);
137
+ const EXTS = new Set([".ts", ".js", ".py", ".java", ".cs", ".go", ".rb", ".php", ".rs"]);
138
+ function collectFiles(dir) {
139
+ const result = [];
140
+ function walk(d) {
141
+ let entries;
142
+ try {
143
+ entries = readdirSync(d);
144
+ }
145
+ catch {
146
+ return;
147
+ }
148
+ for (const name of entries) {
149
+ if (SKIP.has(name) || name.startsWith("."))
150
+ continue;
151
+ const full = join(d, name);
152
+ try {
153
+ const sub = readdirSync(full);
154
+ void sub;
155
+ walk(full);
156
+ }
157
+ catch {
158
+ if (EXTS.has(extname(name).toLowerCase()))
159
+ result.push(full);
160
+ }
161
+ }
162
+ }
163
+ walk(dir);
164
+ return result;
165
+ }
166
+ // ─── CLI ────────────────────────────────────────────────────────────────────
167
+ export function runClarityScore(argv) {
168
+ if (argv.includes("--help") || argv.includes("-h")) {
169
+ console.log(`
170
+ judges clarity-score — Measure code readability and self-documentation
171
+
172
+ Usage:
173
+ judges clarity-score <file-or-dir>
174
+ judges clarity-score src/ --min-grade C
175
+
176
+ Options:
177
+ --min-grade <A-F> Only show files at or below this grade
178
+ --format json JSON output
179
+ --help, -h Show this help
180
+
181
+ Metrics:
182
+ • Naming quality (descriptive vs. short names)
183
+ • Comment coverage (ratio of comment lines)
184
+ • Function length (average lines per function)
185
+ • Line length (lines exceeding 100 characters)
186
+ • Nesting depth (maximum brace depth)
187
+ • Named constants (magic numbers/strings)
188
+ • Style consistency (semicolon/formatting uniformity)
189
+ `);
190
+ return;
191
+ }
192
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
193
+ const minGrade = argv.find((_a, i) => argv[i - 1] === "--min-grade");
194
+ const target = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--")) || ".";
195
+ if (!existsSync(target)) {
196
+ console.error(` Path not found: ${target}`);
197
+ return;
198
+ }
199
+ let files;
200
+ try {
201
+ readdirSync(target);
202
+ files = collectFiles(target);
203
+ }
204
+ catch {
205
+ files = [target];
206
+ }
207
+ const results = [];
208
+ for (const f of files) {
209
+ let content;
210
+ try {
211
+ content = readFileSync(f, "utf-8");
212
+ }
213
+ catch {
214
+ continue;
215
+ }
216
+ const { metrics, suggestions } = analyzeClarity(content);
217
+ const overall = computeOverallScore(metrics);
218
+ results.push({ file: f, overallScore: overall, grade: grade(overall), metrics, suggestions });
219
+ }
220
+ let filtered = results;
221
+ if (minGrade) {
222
+ const gradeOrder = ["A", "B", "C", "D", "F"];
223
+ const minIdx = gradeOrder.indexOf(minGrade.toUpperCase());
224
+ if (minIdx >= 0)
225
+ filtered = results.filter((r) => gradeOrder.indexOf(r.grade) >= minIdx);
226
+ }
227
+ filtered.sort((a, b) => a.overallScore - b.overallScore);
228
+ if (format === "json") {
229
+ console.log(JSON.stringify({ files: filtered, scannedFiles: files.length, timestamp: new Date().toISOString() }, null, 2));
230
+ }
231
+ else {
232
+ const avgScore = results.length > 0 ? Math.round(results.reduce((s, r) => s + r.overallScore, 0) / results.length) : 0;
233
+ console.log(`\n Clarity Score — ${files.length} files`);
234
+ console.log(` Average: ${avgScore}/100 (${grade(avgScore)})\n ──────────────────────────`);
235
+ if (filtered.length === 0) {
236
+ console.log(` ✅ All files meet clarity threshold\n`);
237
+ return;
238
+ }
239
+ for (const r of filtered.slice(0, 20)) {
240
+ const icon = r.grade === "A" ? "🟢" : r.grade === "B" ? "🟢" : r.grade === "C" ? "🟡" : r.grade === "D" ? "🟠" : "🔴";
241
+ console.log(`\n ${icon} ${r.file} — ${r.overallScore}/100 (${r.grade})`);
242
+ for (const m of r.metrics) {
243
+ const mIcon = m.score >= 70 ? "✓" : m.score >= 40 ? "~" : "✗";
244
+ console.log(` ${mIcon} ${m.label.padEnd(20)} ${String(m.score).padEnd(4)} ${m.detail || ""}`);
245
+ }
246
+ if (r.suggestions.length > 0) {
247
+ console.log(` Suggestions:`);
248
+ for (const s of r.suggestions)
249
+ console.log(` → ${s}`);
250
+ }
251
+ }
252
+ if (filtered.length > 20)
253
+ console.log(` ... and ${filtered.length - 20} more files`);
254
+ // Grade distribution
255
+ const dist = { A: 0, B: 0, C: 0, D: 0, F: 0 };
256
+ for (const r of results)
257
+ dist[r.grade]++;
258
+ console.log(`\n Distribution: A:${dist.A} B:${dist.B} C:${dist.C} D:${dist.D} F:${dist.F}\n`);
259
+ }
260
+ }
261
+ //# sourceMappingURL=clarity-score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clarity-score.js","sourceRoot":"","sources":["../../src/commands/clarity-score.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Compliance map — map findings to multiple compliance frameworks
3
+ * (HIPAA, SOC2, PCI-DSS, ISO 27001, NIST 800-53).
4
+ *
5
+ * Produces a unified cross-walk matrix with gap analysis.
6
+ * All analysis local — no data leaves the machine.
7
+ */
8
+ export declare function runComplianceMap(argv: string[]): void;
9
+ //# sourceMappingURL=compliance-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-map.d.ts","sourceRoot":"","sources":["../../src/commands/compliance-map.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA+RH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0IrD"}