@kevinrabun/judges 3.54.0 → 3.56.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/build-optimize.d.ts +7 -0
  14. package/dist/commands/build-optimize.d.ts.map +1 -0
  15. package/dist/commands/build-optimize.js +257 -0
  16. package/dist/commands/build-optimize.js.map +1 -0
  17. package/dist/commands/commit-hygiene.d.ts +6 -0
  18. package/dist/commands/commit-hygiene.d.ts.map +1 -0
  19. package/dist/commands/commit-hygiene.js +176 -0
  20. package/dist/commands/commit-hygiene.js.map +1 -0
  21. package/dist/commands/deploy-readiness.d.ts +6 -0
  22. package/dist/commands/deploy-readiness.d.ts.map +1 -0
  23. package/dist/commands/deploy-readiness.js +212 -0
  24. package/dist/commands/deploy-readiness.js.map +1 -0
  25. package/dist/commands/error-taxonomy.d.ts +6 -0
  26. package/dist/commands/error-taxonomy.d.ts.map +1 -0
  27. package/dist/commands/error-taxonomy.js +227 -0
  28. package/dist/commands/error-taxonomy.js.map +1 -0
  29. package/dist/commands/log-quality.d.ts +6 -0
  30. package/dist/commands/log-quality.d.ts.map +1 -0
  31. package/dist/commands/log-quality.js +212 -0
  32. package/dist/commands/log-quality.js.map +1 -0
  33. package/dist/commands/migration-safety.d.ts +6 -0
  34. package/dist/commands/migration-safety.d.ts.map +1 -0
  35. package/dist/commands/migration-safety.js +257 -0
  36. package/dist/commands/migration-safety.js.map +1 -0
  37. package/dist/commands/null-safety-audit.d.ts +6 -0
  38. package/dist/commands/null-safety-audit.d.ts.map +1 -0
  39. package/dist/commands/null-safety-audit.js +222 -0
  40. package/dist/commands/null-safety-audit.js.map +1 -0
  41. package/dist/commands/observability-gap.d.ts +6 -0
  42. package/dist/commands/observability-gap.d.ts.map +1 -0
  43. package/dist/commands/observability-gap.js +212 -0
  44. package/dist/commands/observability-gap.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/retry-pattern-audit.d.ts +6 -0
  50. package/dist/commands/retry-pattern-audit.d.ts.map +1 -0
  51. package/dist/commands/retry-pattern-audit.js +216 -0
  52. package/dist/commands/retry-pattern-audit.js.map +1 -0
  53. package/dist/commands/rollback-safety.d.ts +5 -0
  54. package/dist/commands/rollback-safety.d.ts.map +1 -0
  55. package/dist/commands/rollback-safety.js +192 -0
  56. package/dist/commands/rollback-safety.js.map +1 -0
  57. package/dist/commands/secret-age.d.ts +6 -0
  58. package/dist/commands/secret-age.d.ts.map +1 -0
  59. package/dist/commands/secret-age.js +215 -0
  60. package/dist/commands/secret-age.js.map +1 -0
  61. package/dist/commands/test-isolation.d.ts +6 -0
  62. package/dist/commands/test-isolation.d.ts.map +1 -0
  63. package/dist/commands/test-isolation.js +235 -0
  64. package/dist/commands/test-isolation.js.map +1 -0
  65. package/dist/commands/test-quality.d.ts +6 -0
  66. package/dist/commands/test-quality.d.ts.map +1 -0
  67. package/dist/commands/test-quality.js +161 -0
  68. package/dist/commands/test-quality.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Deploy readiness — pre-deployment checklist that validates
3
+ * AI-generated code is production-ready.
4
+ */
5
+ import { readFileSync, readdirSync, statSync, existsSync } from "fs";
6
+ import { join, extname } from "path";
7
+ // ─── File Collection ────────────────────────────────────────────────────────
8
+ const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".py", ".java", ".go", ".rs"]);
9
+ function collectFiles(dir, max = 300) {
10
+ const files = [];
11
+ function walk(d) {
12
+ if (files.length >= max)
13
+ return;
14
+ let entries;
15
+ try {
16
+ entries = readdirSync(d);
17
+ }
18
+ catch {
19
+ return;
20
+ }
21
+ for (const e of entries) {
22
+ if (files.length >= max)
23
+ return;
24
+ if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build")
25
+ continue;
26
+ const full = join(d, e);
27
+ try {
28
+ if (statSync(full).isDirectory())
29
+ walk(full);
30
+ else if (CODE_EXTS.has(extname(full)))
31
+ files.push(full);
32
+ }
33
+ catch {
34
+ /* skip */
35
+ }
36
+ }
37
+ }
38
+ walk(dir);
39
+ return files;
40
+ }
41
+ function allContent(files) {
42
+ return files
43
+ .map((f) => {
44
+ try {
45
+ return readFileSync(f, "utf-8");
46
+ }
47
+ catch {
48
+ return "";
49
+ }
50
+ })
51
+ .join("\n");
52
+ }
53
+ // ─── Checks ─────────────────────────────────────────────────────────────────
54
+ function runChecks(dir) {
55
+ const checks = [];
56
+ const files = collectFiles(dir);
57
+ const content = allContent(files);
58
+ // Health check endpoint
59
+ const hasHealthCheck = /\/(health|healthz|readyz|livez|status)\b/.test(content);
60
+ checks.push({
61
+ name: "Health check endpoint",
62
+ status: hasHealthCheck ? "pass" : "fail",
63
+ detail: hasHealthCheck ? "Health check endpoint found" : "No /health or /healthz endpoint detected",
64
+ category: "availability",
65
+ });
66
+ // Graceful shutdown
67
+ const hasGraceful = /process\.on\s*\(\s*['"]SIG(TERM|INT)['"]|graceful.?shutdown|server\.close/i.test(content);
68
+ checks.push({
69
+ name: "Graceful shutdown handler",
70
+ status: hasGraceful ? "pass" : "warn",
71
+ detail: hasGraceful ? "SIGTERM/SIGINT handler found" : "No graceful shutdown handler — may lose in-flight requests",
72
+ category: "availability",
73
+ });
74
+ // Environment variable validation
75
+ const envRefs = (content.match(/process\.env\.\w+|os\.environ|System\.getenv/g) || []).length;
76
+ const envValidation = /process\.env\.\w+\s*\|\||required|assert.*env|validateEnv|env\.parse/i.test(content);
77
+ checks.push({
78
+ name: "Environment variable validation",
79
+ status: envRefs > 0 && envValidation ? "pass" : envRefs > 0 ? "warn" : "pass",
80
+ detail: envRefs > 0
81
+ ? envValidation
82
+ ? `${envRefs} env vars with validation`
83
+ : `${envRefs} env vars but no validation at startup`
84
+ : "No environment variables detected",
85
+ category: "configuration",
86
+ });
87
+ // Rate limiting
88
+ const hasRateLimit = /rate.?limit|throttle|express-rate-limit|fastify-rate-limit|@nestjs\/throttler/i.test(content);
89
+ checks.push({
90
+ name: "Rate limiting",
91
+ status: hasRateLimit ? "pass" : "warn",
92
+ detail: hasRateLimit ? "Rate limiting configured" : "No rate limiting detected — vulnerable to abuse",
93
+ category: "security",
94
+ });
95
+ // CORS configuration
96
+ const hasCors = /cors\(|Access-Control-Allow-Origin|@CrossOrigin/i.test(content);
97
+ const permissiveCors = /cors\(\s*\)|Allow-Origin.*\*/i.test(content);
98
+ checks.push({
99
+ name: "CORS configuration",
100
+ status: hasCors && !permissiveCors ? "pass" : permissiveCors ? "warn" : hasCors ? "pass" : "pass",
101
+ detail: permissiveCors
102
+ ? "CORS is permissive (allow-all) — restrict origins in production"
103
+ : hasCors
104
+ ? "CORS configured"
105
+ : "No CORS detected (may be OK for backend-only services)",
106
+ category: "security",
107
+ });
108
+ // Error handling
109
+ const hasGlobalErrorHandler = /app\.use\s*\(\s*\(err|@ExceptionHandler|exception_handler|error_handler/i.test(content);
110
+ checks.push({
111
+ name: "Global error handler",
112
+ status: hasGlobalErrorHandler ? "pass" : "warn",
113
+ detail: hasGlobalErrorHandler
114
+ ? "Global error handler found"
115
+ : "No global error handler — uncaught errors may leak stack traces",
116
+ category: "reliability",
117
+ });
118
+ // Logging
119
+ const hasStructuredLogging = /winston|pino|bunyan|log4j|logging\.getLogger|slog\.|zerolog/i.test(content);
120
+ const consoleLogCount = (content.match(/console\.(log|debug)\s*\(/g) || []).length;
121
+ checks.push({
122
+ name: "Structured logging",
123
+ status: hasStructuredLogging ? "pass" : consoleLogCount > 10 ? "warn" : "pass",
124
+ detail: hasStructuredLogging
125
+ ? "Structured logging framework detected"
126
+ : `${consoleLogCount} console.log calls — use a logging framework in production`,
127
+ category: "observability",
128
+ });
129
+ // Connection pool limits
130
+ const hasPool = /pool|createPool|connectionLimit|maxConnections|max_connections/i.test(content);
131
+ checks.push({
132
+ name: "Connection pool limits",
133
+ status: hasPool ? "pass" : "pass",
134
+ detail: hasPool ? "Connection pooling configured" : "No explicit connection pool detected (may be OK)",
135
+ category: "performance",
136
+ });
137
+ // Dockerfile / container
138
+ const hasDockerfile = existsSync(join(dir, "Dockerfile")) || existsSync(join(dir, "docker-compose.yml"));
139
+ const hasK8sProbes = /readinessProbe|livenessProbe|startupProbe/i.test(content);
140
+ if (hasDockerfile) {
141
+ checks.push({
142
+ name: "Container probes",
143
+ status: hasK8sProbes ? "pass" : "warn",
144
+ detail: hasK8sProbes ? "K8s readiness/liveness probes configured" : "Dockerfile found but no K8s probes detected",
145
+ category: "deployment",
146
+ });
147
+ }
148
+ // HTTPS
149
+ const hasInsecureHttp = /['"]http:\/\/(?!localhost|127\.0\.0\.1)/i.test(content);
150
+ checks.push({
151
+ name: "HTTPS enforcement",
152
+ status: hasInsecureHttp ? "warn" : "pass",
153
+ detail: hasInsecureHttp ? "Insecure HTTP URLs detected — use HTTPS" : "No insecure HTTP URLs found",
154
+ category: "security",
155
+ });
156
+ // Timeout configuration
157
+ const hasTimeouts = /timeout|connectTimeout|socketTimeout|requestTimeout/i.test(content);
158
+ checks.push({
159
+ name: "Request timeouts",
160
+ status: hasTimeouts ? "pass" : "warn",
161
+ detail: hasTimeouts ? "Timeout configuration found" : "No explicit timeouts — requests may hang indefinitely",
162
+ category: "reliability",
163
+ });
164
+ return checks;
165
+ }
166
+ // ─── CLI ────────────────────────────────────────────────────────────────────
167
+ export function runDeployReadiness(argv) {
168
+ if (argv.includes("--help") || argv.includes("-h")) {
169
+ console.log(`
170
+ judges deploy-readiness — Pre-deployment production readiness checklist
171
+
172
+ Usage:
173
+ judges deploy-readiness [dir]
174
+ judges deploy-readiness src/ --format json
175
+
176
+ Options:
177
+ [dir] Directory to scan (default: .)
178
+ --format json JSON output
179
+ --help, -h Show this help
180
+
181
+ Checks: health endpoints, graceful shutdown, env validation, rate limiting,
182
+ CORS, error handling, logging, connection pools, container probes, HTTPS, timeouts
183
+ `);
184
+ return;
185
+ }
186
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
187
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
188
+ const checks = runChecks(dir);
189
+ const passCount = checks.filter((c) => c.status === "pass").length;
190
+ const warnCount = checks.filter((c) => c.status === "warn").length;
191
+ const failCount = checks.filter((c) => c.status === "fail").length;
192
+ const score = Math.round((passCount / checks.length) * 100);
193
+ if (format === "json") {
194
+ console.log(JSON.stringify({
195
+ checks,
196
+ score,
197
+ summary: { pass: passCount, warn: warnCount, fail: failCount },
198
+ timestamp: new Date().toISOString(),
199
+ }, null, 2));
200
+ }
201
+ else {
202
+ const badge = failCount > 0 ? "❌ NOT READY" : warnCount > 2 ? "⚠️ REVIEW" : "✅ READY";
203
+ console.log(`\n Deploy Readiness: ${badge} (${score}%)\n ──────────────────────────`);
204
+ for (const check of checks) {
205
+ const icon = check.status === "pass" ? "✅" : check.status === "warn" ? "⚠️" : "❌";
206
+ console.log(` ${icon} ${check.name}`);
207
+ console.log(` ${check.detail}`);
208
+ }
209
+ console.log(`\n Score: ${score}% | Pass: ${passCount} | Warn: ${warnCount} | Fail: ${failCount}\n`);
210
+ }
211
+ }
212
+ //# sourceMappingURL=deploy-readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-readiness.js","sourceRoot":"","sources":["../../src/commands/deploy-readiness.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"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Error taxonomy — classify and standardize error codes, messages, and
3
+ * hierarchies across a codebase.
4
+ */
5
+ import { readFileSync, readdirSync, statSync } from "fs";
6
+ import { join, extname } from "path";
7
+ // ─── File Collection ────────────────────────────────────────────────────────
8
+ const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".py", ".java", ".go", ".rs"]);
9
+ function collectFiles(dir, max = 300) {
10
+ const files = [];
11
+ function walk(d) {
12
+ if (files.length >= max)
13
+ return;
14
+ let entries;
15
+ try {
16
+ entries = readdirSync(d);
17
+ }
18
+ catch {
19
+ return;
20
+ }
21
+ for (const e of entries) {
22
+ if (files.length >= max)
23
+ return;
24
+ if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build")
25
+ continue;
26
+ const full = join(d, e);
27
+ try {
28
+ if (statSync(full).isDirectory())
29
+ walk(full);
30
+ else if (CODE_EXTS.has(extname(full)))
31
+ files.push(full);
32
+ }
33
+ catch {
34
+ /* skip */
35
+ }
36
+ }
37
+ }
38
+ walk(dir);
39
+ return files;
40
+ }
41
+ // ─── Extraction ─────────────────────────────────────────────────────────────
42
+ function extractErrors(filepath) {
43
+ const errors = [];
44
+ let content;
45
+ try {
46
+ content = readFileSync(filepath, "utf-8");
47
+ }
48
+ catch {
49
+ return errors;
50
+ }
51
+ const lines = content.split("\n");
52
+ for (let i = 0; i < lines.length; i++) {
53
+ const line = lines[i];
54
+ // Error class definitions
55
+ const classMatch = line.match(/class\s+(\w*Error\w*)\s+extends/);
56
+ if (classMatch) {
57
+ errors.push({ file: filepath, line: i + 1, code: classMatch[1], message: "", kind: "class" });
58
+ }
59
+ // Error code constants
60
+ const constMatch = line.match(/(?:const|export\s+const|static\s+readonly)\s+(\w*(?:ERR|ERROR|CODE)\w*)\s*[:=]\s*['"]([^'"]+)['"]/i);
61
+ if (constMatch) {
62
+ errors.push({ file: filepath, line: i + 1, code: constMatch[1], message: constMatch[2], kind: "constant" });
63
+ }
64
+ // throw new Error
65
+ const throwMatch = line.match(/throw\s+new\s+(\w*Error)\s*\(\s*['"`]([^'"`]{3,}?)['"`]/);
66
+ if (throwMatch) {
67
+ errors.push({ file: filepath, line: i + 1, code: throwMatch[1], message: throwMatch[2], kind: "throw" });
68
+ }
69
+ // HTTP status codes in responses
70
+ const statusMatch = line.match(/(?:status|statusCode|res\.status)\s*[:=(]\s*(\d{3})/);
71
+ if (statusMatch) {
72
+ const msgMatch = line.match(/(?:message|msg|error)\s*[:=]\s*['"`]([^'"`]+)['"`]/);
73
+ errors.push({
74
+ file: filepath,
75
+ line: i + 1,
76
+ code: `HTTP_${statusMatch[1]}`,
77
+ message: msgMatch?.[1] || "",
78
+ kind: "status",
79
+ });
80
+ }
81
+ }
82
+ return errors;
83
+ }
84
+ // ─── Analysis ───────────────────────────────────────────────────────────────
85
+ function analyzeErrors(allErrors) {
86
+ const issues = [];
87
+ // Duplicate error messages
88
+ const msgMap = new Map();
89
+ for (const e of allErrors) {
90
+ if (e.message) {
91
+ const key = e.message.toLowerCase().trim();
92
+ if (!msgMap.has(key))
93
+ msgMap.set(key, []);
94
+ msgMap.get(key).push(e);
95
+ }
96
+ }
97
+ const dupes = [...msgMap.entries()].filter(([, v]) => v.length > 1);
98
+ if (dupes.length > 0) {
99
+ issues.push({
100
+ issue: `${dupes.length} duplicate error message(s)`,
101
+ severity: "medium",
102
+ detail: "Same message thrown from multiple places — consolidate into error constants",
103
+ examples: dupes.slice(0, 5).map(([msg, defs]) => `"${msg}" in ${defs.length} places`),
104
+ });
105
+ }
106
+ // Inconsistent naming
107
+ const errorClasses = allErrors.filter((e) => e.kind === "class").map((e) => e.code);
108
+ const mixedCase = errorClasses.filter((c) => /Error$/i.test(c) && !/Error$/.test(c));
109
+ if (mixedCase.length > 0) {
110
+ issues.push({
111
+ issue: "Inconsistent error class naming",
112
+ severity: "low",
113
+ detail: "Some error classes don't follow PascalCase + Error suffix convention",
114
+ examples: mixedCase.slice(0, 5),
115
+ });
116
+ }
117
+ // Bare Error throws (no custom class)
118
+ const bareThrows = allErrors.filter((e) => e.kind === "throw" && e.code === "Error");
119
+ if (bareThrows.length > 5) {
120
+ issues.push({
121
+ issue: `${bareThrows.length} bare Error throws`,
122
+ severity: "high",
123
+ detail: "Throwing plain Error makes catch handling harder — use typed error classes",
124
+ examples: bareThrows.slice(0, 5).map((e) => `${e.file}:${e.line} — "${e.message.slice(0, 50)}"`),
125
+ });
126
+ }
127
+ // Missing error codes
128
+ const constants = allErrors.filter((e) => e.kind === "constant");
129
+ const throws = allErrors.filter((e) => e.kind === "throw");
130
+ if (throws.length > 10 && constants.length === 0) {
131
+ issues.push({
132
+ issue: "No error code constants",
133
+ severity: "high",
134
+ detail: "Define error codes for machine-readable error handling (e.g., ERR_AUTH_FAILED)",
135
+ examples: throws.slice(0, 3).map((t) => `${t.file}:${t.line}`),
136
+ });
137
+ }
138
+ // Inconsistent HTTP status usage
139
+ const statusDefs = allErrors.filter((e) => e.kind === "status");
140
+ const statusCodes = new Map();
141
+ for (const s of statusDefs) {
142
+ statusCodes.set(s.code, (statusCodes.get(s.code) || 0) + 1);
143
+ }
144
+ const overusedStatuses = [...statusCodes.entries()].filter(([, count]) => count > 10);
145
+ if (overusedStatuses.length > 0) {
146
+ issues.push({
147
+ issue: "HTTP status code overuse",
148
+ severity: "medium",
149
+ detail: "Same status code used extensively — consider more specific error responses",
150
+ examples: overusedStatuses.map(([code, count]) => `${code} used ${count} times`),
151
+ });
152
+ }
153
+ // Generic messages
154
+ const genericMsgs = allErrors.filter((e) => e.message && /^(error|something went wrong|unknown error|internal error|failed)$/i.test(e.message.trim()));
155
+ if (genericMsgs.length > 0) {
156
+ issues.push({
157
+ issue: `${genericMsgs.length} generic error message(s)`,
158
+ severity: "high",
159
+ detail: "Vague error messages impede debugging — include context (what failed, why, and what to try)",
160
+ examples: genericMsgs.slice(0, 5).map((e) => `${e.file}:${e.line} — "${e.message}"`),
161
+ });
162
+ }
163
+ return issues;
164
+ }
165
+ // ─── CLI ────────────────────────────────────────────────────────────────────
166
+ export function runErrorTaxonomy(argv) {
167
+ if (argv.includes("--help") || argv.includes("-h")) {
168
+ console.log(`
169
+ judges error-taxonomy — Classify and standardize error codes and messages
170
+
171
+ Usage:
172
+ judges error-taxonomy [dir]
173
+ judges error-taxonomy 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: duplicate messages, inconsistent naming, bare Error throws, missing error codes,
181
+ generic messages, HTTP status overuse.
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 allErrors = [];
189
+ for (const f of files)
190
+ allErrors.push(...extractErrors(f));
191
+ const issues = analyzeErrors(allErrors);
192
+ const highCount = issues.filter((i) => i.severity === "high").length;
193
+ const score = Math.max(0, 100 - highCount * 15 - issues.length * 5);
194
+ if (format === "json") {
195
+ console.log(JSON.stringify({
196
+ errors: allErrors.length,
197
+ issues,
198
+ score,
199
+ summary: {
200
+ classes: allErrors.filter((e) => e.kind === "class").length,
201
+ constants: allErrors.filter((e) => e.kind === "constant").length,
202
+ throws: allErrors.filter((e) => e.kind === "throw").length,
203
+ issues: issues.length,
204
+ },
205
+ timestamp: new Date().toISOString(),
206
+ }, null, 2));
207
+ }
208
+ else {
209
+ const badge = score >= 80 ? "✅ CONSISTENT" : score >= 50 ? "⚠️ INCONSISTENT" : "❌ CHAOTIC";
210
+ console.log(`\n Error Taxonomy: ${badge} (${score}/100)\n ─────────────────────────────`);
211
+ console.log(` Error definitions: ${allErrors.length} | Classes: ${allErrors.filter((e) => e.kind === "class").length} | Constants: ${allErrors.filter((e) => e.kind === "constant").length} | Throws: ${allErrors.filter((e) => e.kind === "throw").length}\n`);
212
+ if (issues.length === 0) {
213
+ console.log(" No taxonomy issues detected.\n");
214
+ return;
215
+ }
216
+ for (const issue of issues) {
217
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
218
+ console.log(` ${icon} ${issue.issue}`);
219
+ console.log(` ${issue.detail}`);
220
+ for (const ex of issue.examples) {
221
+ console.log(` • ${ex}`);
222
+ }
223
+ }
224
+ console.log(`\n Score: ${score}/100\n`);
225
+ }
226
+ }
227
+ //# sourceMappingURL=error-taxonomy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-taxonomy.js","sourceRoot":"","sources":["../../src/commands/error-taxonomy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Log quality — assess logging hygiene: structured format consistency,
3
+ * PII leaks, level correctness, and coverage gaps.
4
+ */
5
+ export declare function runLogQuality(argv: string[]): void;
6
+ //# sourceMappingURL=log-quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-quality.d.ts","sourceRoot":"","sources":["../../src/commands/log-quality.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA+KH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+DlD"}