@kevinrabun/judges 3.55.0 → 3.57.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/api-versioning-audit.d.ts +6 -0
  6. package/dist/commands/api-versioning-audit.d.ts.map +1 -0
  7. package/dist/commands/api-versioning-audit.js +234 -0
  8. package/dist/commands/api-versioning-audit.js.map +1 -0
  9. package/dist/commands/boundary-enforce.d.ts +6 -0
  10. package/dist/commands/boundary-enforce.d.ts.map +1 -0
  11. package/dist/commands/boundary-enforce.js +256 -0
  12. package/dist/commands/boundary-enforce.js.map +1 -0
  13. package/dist/commands/cache-audit.d.ts +5 -0
  14. package/dist/commands/cache-audit.d.ts.map +1 -0
  15. package/dist/commands/cache-audit.js +220 -0
  16. package/dist/commands/cache-audit.js.map +1 -0
  17. package/dist/commands/comment-drift.d.ts +5 -0
  18. package/dist/commands/comment-drift.d.ts.map +1 -0
  19. package/dist/commands/comment-drift.js +229 -0
  20. package/dist/commands/comment-drift.js.map +1 -0
  21. package/dist/commands/error-taxonomy.d.ts +6 -0
  22. package/dist/commands/error-taxonomy.d.ts.map +1 -0
  23. package/dist/commands/error-taxonomy.js +227 -0
  24. package/dist/commands/error-taxonomy.js.map +1 -0
  25. package/dist/commands/error-ux.d.ts +5 -0
  26. package/dist/commands/error-ux.d.ts.map +1 -0
  27. package/dist/commands/error-ux.js +253 -0
  28. package/dist/commands/error-ux.js.map +1 -0
  29. package/dist/commands/event-leak.d.ts +5 -0
  30. package/dist/commands/event-leak.d.ts.map +1 -0
  31. package/dist/commands/event-leak.js +263 -0
  32. package/dist/commands/event-leak.js.map +1 -0
  33. package/dist/commands/idempotency-audit.d.ts +5 -0
  34. package/dist/commands/idempotency-audit.d.ts.map +1 -0
  35. package/dist/commands/idempotency-audit.js +223 -0
  36. package/dist/commands/idempotency-audit.js.map +1 -0
  37. package/dist/commands/log-quality.d.ts +6 -0
  38. package/dist/commands/log-quality.d.ts.map +1 -0
  39. package/dist/commands/log-quality.js +212 -0
  40. package/dist/commands/log-quality.js.map +1 -0
  41. package/dist/commands/null-safety-audit.d.ts +6 -0
  42. package/dist/commands/null-safety-audit.d.ts.map +1 -0
  43. package/dist/commands/null-safety-audit.js +222 -0
  44. package/dist/commands/null-safety-audit.js.map +1 -0
  45. package/dist/commands/ownership-map.d.ts +6 -0
  46. package/dist/commands/ownership-map.d.ts.map +1 -0
  47. package/dist/commands/ownership-map.js +229 -0
  48. package/dist/commands/ownership-map.js.map +1 -0
  49. package/dist/commands/privilege-path.d.ts +5 -0
  50. package/dist/commands/privilege-path.d.ts.map +1 -0
  51. package/dist/commands/privilege-path.js +234 -0
  52. package/dist/commands/privilege-path.js.map +1 -0
  53. package/dist/commands/retry-pattern-audit.d.ts +6 -0
  54. package/dist/commands/retry-pattern-audit.d.ts.map +1 -0
  55. package/dist/commands/retry-pattern-audit.js +216 -0
  56. package/dist/commands/retry-pattern-audit.js.map +1 -0
  57. package/dist/commands/test-isolation.d.ts +6 -0
  58. package/dist/commands/test-isolation.d.ts.map +1 -0
  59. package/dist/commands/test-isolation.js +235 -0
  60. package/dist/commands/test-isolation.js.map +1 -0
  61. package/dist/commands/timeout-audit.d.ts +5 -0
  62. package/dist/commands/timeout-audit.d.ts.map +1 -0
  63. package/dist/commands/timeout-audit.js +211 -0
  64. package/dist/commands/timeout-audit.js.map +1 -0
  65. package/dist/commands/type-boundary.d.ts +5 -0
  66. package/dist/commands/type-boundary.d.ts.map +1 -0
  67. package/dist/commands/type-boundary.js +236 -0
  68. package/dist/commands/type-boundary.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Cache audit — audit cache invalidation correctness, TTL consistency, and stampede risk.
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"]);
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
+ const fullText = content;
52
+ // Detect cache set without TTL
53
+ for (let i = 0; i < lines.length; i++) {
54
+ const line = lines[i];
55
+ // Redis/Memcached set without expiry
56
+ if (/\.set\s*\(/.test(line) && /cache|redis|memcache/i.test(fullText)) {
57
+ const block = lines.slice(i, Math.min(i + 3, lines.length)).join("\n");
58
+ if (!/ttl|expire|ex\b|px\b|maxAge|max_age|EX|PX/i.test(block) && /cache/i.test(line)) {
59
+ issues.push({
60
+ file: filepath,
61
+ line: i + 1,
62
+ issue: "Cache set without TTL",
63
+ severity: "high",
64
+ detail: "Cache entry has no expiration — data will grow unbounded and may serve stale results",
65
+ });
66
+ }
67
+ }
68
+ // Map/Object used as cache without size limit
69
+ if (/new Map\(\)|:\s*Record<|:\s*\{[^}]*\}\s*=\s*\{\}/.test(line) && /cache/i.test(line)) {
70
+ const fileBlock = lines.slice(i, Math.min(i + 20, lines.length)).join("\n");
71
+ if (!/\.delete|\.clear|maxSize|max_size|evict|LRU|lru/i.test(fileBlock)) {
72
+ issues.push({
73
+ file: filepath,
74
+ line: i + 1,
75
+ issue: "In-memory cache without eviction",
76
+ severity: "medium",
77
+ detail: "Cache grows unbounded — add size limit or LRU eviction to prevent memory leaks",
78
+ });
79
+ }
80
+ }
81
+ // Cache read without miss handler (dogpile/stampede risk)
82
+ if (/\.get\s*\(/.test(line) && /cache/i.test(line)) {
83
+ const block = lines.slice(i, Math.min(i + 10, lines.length)).join("\n");
84
+ if (/if\s*\(!?\s*\w+\)|=== null|=== undefined|!result/.test(block)) {
85
+ if (!/lock|mutex|singleflight|coalesce|dedupe/i.test(block)) {
86
+ issues.push({
87
+ file: filepath,
88
+ line: i + 1,
89
+ issue: "Cache miss without stampede protection",
90
+ severity: "medium",
91
+ detail: "Concurrent cache misses can trigger thundering herd — add lock or singleflight",
92
+ });
93
+ }
94
+ }
95
+ }
96
+ // Mutation without cache invalidation
97
+ if (/\.(?:update|insert|delete|remove|save|create|destroy|put|patch)\s*\(/.test(line)) {
98
+ if (/(?:db|model|repository|store|dao|prisma|sequelize|knex)/i.test(line)) {
99
+ const afterBlock = lines.slice(i, Math.min(i + 8, lines.length)).join("\n");
100
+ if (/cache/i.test(fullText) &&
101
+ !/cache\.(?:del|delete|invalidate|clear|remove|bust|evict|set)/i.test(afterBlock)) {
102
+ issues.push({
103
+ file: filepath,
104
+ line: i + 1,
105
+ issue: "Data mutation without cache invalidation",
106
+ severity: "high",
107
+ detail: "Write operation not followed by cache invalidation — clients may read stale data",
108
+ });
109
+ }
110
+ }
111
+ }
112
+ // TTL inconsistency (different TTL for same logical data)
113
+ if (/ttl|expire|maxAge|max_age/i.test(line)) {
114
+ const ttlMatch = line.match(/(?:ttl|expire|maxAge|max_age)\s*[:=]\s*(\d+)/i);
115
+ if (ttlMatch) {
116
+ const val = parseInt(ttlMatch[1], 10);
117
+ if (val < 5) {
118
+ issues.push({
119
+ file: filepath,
120
+ line: i + 1,
121
+ issue: "Suspiciously short TTL",
122
+ severity: "low",
123
+ detail: `TTL = ${val} — extremely short TTL negates caching benefit and adds overhead`,
124
+ });
125
+ }
126
+ if (val > 86400000) {
127
+ issues.push({
128
+ file: filepath,
129
+ line: i + 1,
130
+ issue: "Excessively long TTL",
131
+ severity: "medium",
132
+ detail: `TTL = ${Math.round(val / 3600000)}h — very long TTL increases stale-data risk`,
133
+ });
134
+ }
135
+ }
136
+ }
137
+ // Cache key construction without version/namespace
138
+ if (/cacheKey|cache_key/i.test(line)) {
139
+ if (!/version|v\d+|namespace|prefix/i.test(line)) {
140
+ issues.push({
141
+ file: filepath,
142
+ line: i + 1,
143
+ issue: "Cache key without versioning",
144
+ severity: "low",
145
+ detail: "Cache key has no version prefix — schema changes may cause deserialization failures",
146
+ });
147
+ }
148
+ }
149
+ // localStorage/sessionStorage without error handling
150
+ if (/localStorage|sessionStorage/.test(line)) {
151
+ const block = lines.slice(Math.max(0, i - 2), Math.min(i + 2, lines.length)).join("\n");
152
+ if (!/try|catch/.test(block)) {
153
+ issues.push({
154
+ file: filepath,
155
+ line: i + 1,
156
+ issue: "Web storage access without error handling",
157
+ severity: "medium",
158
+ detail: "localStorage/sessionStorage can throw in private browsing or when storage quota is exceeded",
159
+ });
160
+ }
161
+ }
162
+ }
163
+ return issues;
164
+ }
165
+ // ─── CLI ────────────────────────────────────────────────────────────────────
166
+ export function runCacheAudit(argv) {
167
+ if (argv.includes("--help") || argv.includes("-h")) {
168
+ console.log(`
169
+ judges cache-audit — Audit cache invalidation, TTL, and stampede risk
170
+
171
+ Usage:
172
+ judges cache-audit [dir]
173
+ judges cache-audit src/ --format json
174
+
175
+ Options:
176
+ [dir] Directory to scan (default: .)
177
+ --format json JSON output
178
+ --help, -h Show this help
179
+
180
+ Checks: missing TTL, unbounded in-memory cache, stampede risk, stale-after-write,
181
+ suspicious TTL values, unversioned cache keys, web storage error handling.
182
+ `);
183
+ return;
184
+ }
185
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
186
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
187
+ const files = collectFiles(dir);
188
+ const allIssues = [];
189
+ for (const f of files)
190
+ allIssues.push(...analyzeFile(f));
191
+ const highCount = allIssues.filter((i) => i.severity === "high").length;
192
+ const medCount = allIssues.filter((i) => i.severity === "medium").length;
193
+ const score = Math.max(0, 100 - highCount * 10 - medCount * 4);
194
+ if (format === "json") {
195
+ console.log(JSON.stringify({
196
+ issues: allIssues,
197
+ score,
198
+ summary: { high: highCount, medium: medCount, total: allIssues.length },
199
+ timestamp: new Date().toISOString(),
200
+ }, null, 2));
201
+ }
202
+ else {
203
+ const badge = score >= 80 ? "✅ SOUND" : score >= 50 ? "⚠️ RISKY" : "❌ BROKEN";
204
+ console.log(`\n Cache Health: ${badge} (${score}/100)\n ─────────────────────────────`);
205
+ if (allIssues.length === 0) {
206
+ console.log(" No cache issues detected.\n");
207
+ return;
208
+ }
209
+ for (const issue of allIssues.slice(0, 25)) {
210
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
211
+ console.log(` ${icon} ${issue.issue}`);
212
+ console.log(` ${issue.file}:${issue.line}`);
213
+ console.log(` ${issue.detail}`);
214
+ }
215
+ if (allIssues.length > 25)
216
+ console.log(` ... and ${allIssues.length - 25} more`);
217
+ console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
218
+ }
219
+ }
220
+ //# sourceMappingURL=cache-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-audit.js","sourceRoot":"","sources":["../../src/commands/cache-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Comment drift — detect stale, misleading, or contradictory inline comments.
3
+ */
4
+ export declare function runCommentDrift(argv: string[]): void;
5
+ //# sourceMappingURL=comment-drift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-drift.d.ts","sourceRoot":"","sources":["../../src/commands/comment-drift.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+LH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+DpD"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Comment drift — detect stale, misleading, or contradictory inline comments.
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"]);
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
+ for (let i = 0; i < lines.length; i++) {
52
+ const line = lines[i];
53
+ const commentMatch = line.match(/\/\/\s*(.+)|#\s*(.+)/);
54
+ if (!commentMatch)
55
+ continue;
56
+ const comment = (commentMatch[1] || commentMatch[2] || "").trim();
57
+ if (!comment || comment.length < 5)
58
+ continue;
59
+ // TODO/FIXME/HACK without ticket reference
60
+ if (/\b(?:TODO|FIXME|HACK|XXX|TEMP)\b/i.test(comment)) {
61
+ if (!/[A-Z]+-\d+|#\d+|https?:\/\//i.test(comment)) {
62
+ issues.push({
63
+ file: filepath,
64
+ line: i + 1,
65
+ issue: "TODO/FIXME without ticket reference",
66
+ severity: "medium",
67
+ detail: `"${comment.slice(0, 60)}" — link to issue tracker for accountability`,
68
+ });
69
+ }
70
+ }
71
+ // Comment says "returns X" but function returns different
72
+ if (/returns?\s+(?:true|false|null|undefined|void|nothing|string|number|array)/i.test(comment)) {
73
+ const nextLines = lines.slice(i + 1, Math.min(i + 10, lines.length)).join("\n");
74
+ const returnMatch = comment.match(/returns?\s+(true|false|null|undefined|void|nothing)/i);
75
+ if (returnMatch) {
76
+ const stated = returnMatch[1].toLowerCase();
77
+ if (stated === "true" && /return\s+false/i.test(nextLines)) {
78
+ issues.push({
79
+ file: filepath,
80
+ line: i + 1,
81
+ issue: "Comment contradicts return value",
82
+ severity: "high",
83
+ detail: `Comment says "returns true" but code returns false`,
84
+ });
85
+ }
86
+ if (stated === "false" && /return\s+true/i.test(nextLines)) {
87
+ issues.push({
88
+ file: filepath,
89
+ line: i + 1,
90
+ issue: "Comment contradicts return value",
91
+ severity: "high",
92
+ detail: `Comment says "returns false" but code returns true`,
93
+ });
94
+ }
95
+ }
96
+ }
97
+ // Comment references variable name not in nearby code
98
+ const varRefs = comment.match(/`(\w+)`/g);
99
+ if (varRefs) {
100
+ const contextBlock = lines.slice(Math.max(0, i - 3), Math.min(i + 5, lines.length)).join("\n");
101
+ for (const ref of varRefs) {
102
+ const name = ref.replace(/`/g, "");
103
+ if (name.length > 2 &&
104
+ !contextBlock.includes(name) &&
105
+ !/(?:true|false|null|undefined|string|number|boolean)/i.test(name)) {
106
+ issues.push({
107
+ file: filepath,
108
+ line: i + 1,
109
+ issue: "Comment references renamed/deleted variable",
110
+ severity: "high",
111
+ detail: `\`${name}\` mentioned in comment but not found in surrounding code`,
112
+ });
113
+ }
114
+ }
115
+ }
116
+ // Commented-out code (heuristic: looks like code, not English)
117
+ if (/^\s*\/\/\s*(?:const|let|var|function|if|for|while|return|import|export)\s+/.test(line)) {
118
+ issues.push({
119
+ file: filepath,
120
+ line: i + 1,
121
+ issue: "Commented-out code",
122
+ severity: "low",
123
+ detail: "Remove dead code — use version control to preserve history",
124
+ });
125
+ }
126
+ // Obvious/tautological comments
127
+ if (/\/\/\s*(?:increment|add one|set|assign|declare|initialize|create|return)/i.test(line)) {
128
+ const codePart = line.replace(/\/\/.*/, "").trim();
129
+ if (codePart) {
130
+ const commentLower = comment.toLowerCase();
131
+ // "increment i" on line "i++"
132
+ if (/\+\+|i\s*\+=\s*1/.test(codePart) && /increment/i.test(commentLower)) {
133
+ issues.push({
134
+ file: filepath,
135
+ line: i + 1,
136
+ issue: "Tautological comment",
137
+ severity: "low",
138
+ detail: "Comment restates the obvious — add 'why' not 'what'",
139
+ });
140
+ }
141
+ // "return result" on line "return result"
142
+ if (/^return\s+\w+/.test(codePart) && /^return\s/i.test(commentLower)) {
143
+ issues.push({
144
+ file: filepath,
145
+ line: i + 1,
146
+ issue: "Tautological comment",
147
+ severity: "low",
148
+ detail: "Comment restates the code — add context about why",
149
+ });
150
+ }
151
+ }
152
+ }
153
+ // Outdated parameter names in JSDoc-style comments
154
+ if (/\*\s*@param\s+\{?\w*\}?\s+(\w+)/.test(line)) {
155
+ const paramName = line.match(/@param\s+(?:\{[^}]*\}\s+)?(\w+)/)?.[1];
156
+ if (paramName) {
157
+ // Look for the function definition nearby
158
+ const funcBlock = lines.slice(Math.max(0, i - 5), Math.min(i + 15, lines.length)).join("\n");
159
+ const funcMatch = funcBlock.match(/(?:function|=>|\()\s*\(([^)]*)\)/);
160
+ if (funcMatch && !funcMatch[1].includes(paramName)) {
161
+ issues.push({
162
+ file: filepath,
163
+ line: i + 1,
164
+ issue: "@param references unknown parameter",
165
+ severity: "high",
166
+ detail: `@param ${paramName} not found in function signature — was it renamed?`,
167
+ });
168
+ }
169
+ }
170
+ }
171
+ }
172
+ return issues;
173
+ }
174
+ // ─── CLI ────────────────────────────────────────────────────────────────────
175
+ export function runCommentDrift(argv) {
176
+ if (argv.includes("--help") || argv.includes("-h")) {
177
+ console.log(`
178
+ judges comment-drift — Detect stale, misleading, or contradictory comments
179
+
180
+ Usage:
181
+ judges comment-drift [dir]
182
+ judges comment-drift src/ --format json
183
+
184
+ Options:
185
+ [dir] Directory to scan (default: .)
186
+ --format json JSON output
187
+ --help, -h Show this help
188
+
189
+ Checks: TODO without tickets, contradictory return comments, renamed variable references,
190
+ commented-out code, tautological comments, outdated @param names.
191
+ `);
192
+ return;
193
+ }
194
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
195
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
196
+ const files = collectFiles(dir);
197
+ const allIssues = [];
198
+ for (const f of files)
199
+ allIssues.push(...analyzeFile(f));
200
+ const highCount = allIssues.filter((i) => i.severity === "high").length;
201
+ const medCount = allIssues.filter((i) => i.severity === "medium").length;
202
+ const score = Math.max(0, 100 - highCount * 8 - medCount * 3);
203
+ if (format === "json") {
204
+ console.log(JSON.stringify({
205
+ issues: allIssues,
206
+ score,
207
+ summary: { high: highCount, medium: medCount, total: allIssues.length },
208
+ timestamp: new Date().toISOString(),
209
+ }, null, 2));
210
+ }
211
+ else {
212
+ const badge = score >= 80 ? "✅ FRESH" : score >= 50 ? "⚠️ DRIFTED" : "❌ STALE";
213
+ console.log(`\n Comment Quality: ${badge} (${score}/100)\n ─────────────────────────────`);
214
+ if (allIssues.length === 0) {
215
+ console.log(" No comment drift detected.\n");
216
+ return;
217
+ }
218
+ for (const issue of allIssues.slice(0, 25)) {
219
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
220
+ console.log(` ${icon} ${issue.issue}`);
221
+ console.log(` ${issue.file}:${issue.line}`);
222
+ console.log(` ${issue.detail}`);
223
+ }
224
+ if (allIssues.length > 25)
225
+ console.log(` ... and ${allIssues.length - 25} more`);
226
+ console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
227
+ }
228
+ }
229
+ //# sourceMappingURL=comment-drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-drift.js","sourceRoot":"","sources":["../../src/commands/comment-drift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Error taxonomy — classify and standardize error codes, messages, and
3
+ * hierarchies across a codebase.
4
+ */
5
+ export declare function runErrorTaxonomy(argv: string[]): void;
6
+ //# sourceMappingURL=error-taxonomy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-taxonomy.d.ts","sourceRoot":"","sources":["../../src/commands/error-taxonomy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqMH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyErD"}