@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,224 @@
1
+ /**
2
+ * AI pattern trend — track how AI-generated code patterns evolve
3
+ * over time in a codebase. Detect drift in hallucination signals,
4
+ * code quality, and AI reliance.
5
+ *
6
+ * All data local (.judges-ai-trend/).
7
+ */
8
+ import { existsSync, readFileSync, readdirSync, mkdirSync, writeFileSync } from "fs";
9
+ import { join, extname } from "path";
10
+ // ─── Metric collection ──────────────────────────────────────────────────────
11
+ const SKIP = new Set(["node_modules", ".git", "dist", "build", "coverage"]);
12
+ const EXTS = new Set([".ts", ".js", ".py", ".java", ".cs", ".go", ".rb", ".php", ".rs"]);
13
+ function collectFiles(dir) {
14
+ const result = [];
15
+ function walk(d) {
16
+ let entries;
17
+ try {
18
+ entries = readdirSync(d);
19
+ }
20
+ catch {
21
+ return;
22
+ }
23
+ for (const name of entries) {
24
+ if (SKIP.has(name) || name.startsWith("."))
25
+ continue;
26
+ const full = join(d, name);
27
+ try {
28
+ const sub = readdirSync(full);
29
+ void sub;
30
+ walk(full);
31
+ }
32
+ catch {
33
+ if (EXTS.has(extname(name).toLowerCase()))
34
+ result.push(full);
35
+ }
36
+ }
37
+ }
38
+ walk(dir);
39
+ return result;
40
+ }
41
+ function collectMetrics(dir) {
42
+ const files = collectFiles(dir);
43
+ let totalComplexity = 0;
44
+ let totalTodos = 0;
45
+ let totalEmptyFns = 0;
46
+ let totalDuplicates = 0;
47
+ let totalCommentLines = 0;
48
+ let totalLines = 0;
49
+ let totalGenericNames = 0;
50
+ let totalTryCatch = 0;
51
+ let totalFunctions = 0;
52
+ let aiIndicators = 0;
53
+ for (const f of files) {
54
+ let content;
55
+ try {
56
+ content = readFileSync(f, "utf-8");
57
+ }
58
+ catch {
59
+ continue;
60
+ }
61
+ const lines = content.split("\n");
62
+ totalLines += lines.length;
63
+ // Complexity
64
+ let complexity = 1;
65
+ for (const line of lines) {
66
+ if (/\b(?:if|else\s+if|for|while|switch|catch|&&|\|\|)\b/.test(line))
67
+ complexity++;
68
+ }
69
+ totalComplexity += complexity;
70
+ // TODOs
71
+ totalTodos += (content.match(/\/\/\s*(?:TODO|FIXME|HACK|PLACEHOLDER)/gi) || []).length;
72
+ // Empty functions
73
+ totalEmptyFns += (content.match(/\bfunction\s+\w+\s*\([^)]*\)\s*{\s*}|=>\s*{\s*}/g) || []).length;
74
+ // Duplicates
75
+ const lineSet = new Map();
76
+ for (const line of lines) {
77
+ const trimmed = line.trim();
78
+ if (trimmed.length > 20)
79
+ lineSet.set(trimmed, (lineSet.get(trimmed) || 0) + 1);
80
+ }
81
+ for (const [, count] of lineSet) {
82
+ if (count >= 3)
83
+ totalDuplicates++;
84
+ }
85
+ // Comments
86
+ totalCommentLines += lines.filter((l) => /^\s*(?:\/\/|\/?\*|#)/.test(l)).length;
87
+ // Generic names
88
+ totalGenericNames += (content.match(/(?:const|let|var)\s+(?:data|result|value|item|temp|tmp)\s*[=:]/g) || [])
89
+ .length;
90
+ // Error handling
91
+ totalTryCatch += (content.match(/\btry\s*{/g) || []).length;
92
+ totalFunctions += (content.match(/\bfunction\b|=>/g) || []).length;
93
+ // AI indicators
94
+ if (/generated\s+(?:by|with)\s+(?:ai|gpt|copilot|claude)/i.test(content))
95
+ aiIndicators++;
96
+ }
97
+ return {
98
+ totalFiles: files.length,
99
+ aiIndicatorCount: aiIndicators,
100
+ avgComplexity: files.length > 0 ? Math.round(totalComplexity / files.length) : 0,
101
+ todoCount: totalTodos,
102
+ emptyFunctionCount: totalEmptyFns,
103
+ duplicateBlockCount: totalDuplicates,
104
+ commentRatio: totalLines > 0 ? Math.round((totalCommentLines / totalLines) * 100) : 0,
105
+ genericNamingCount: totalGenericNames,
106
+ errorHandlingRatio: totalFunctions > 0 ? Math.round((totalTryCatch / totalFunctions) * 100) : 0,
107
+ };
108
+ }
109
+ // ─── Storage ────────────────────────────────────────────────────────────────
110
+ const TREND_DIR = join(".", ".judges-ai-trend");
111
+ function loadHistory() {
112
+ const histFile = join(TREND_DIR, "history.json");
113
+ if (!existsSync(histFile))
114
+ return [];
115
+ try {
116
+ return JSON.parse(readFileSync(histFile, "utf-8"));
117
+ }
118
+ catch {
119
+ return [];
120
+ }
121
+ }
122
+ function saveHistory(history) {
123
+ if (!existsSync(TREND_DIR))
124
+ mkdirSync(TREND_DIR, { recursive: true });
125
+ writeFileSync(join(TREND_DIR, "history.json"), JSON.stringify(history, null, 2));
126
+ }
127
+ // ─── CLI ────────────────────────────────────────────────────────────────────
128
+ export function runAiPatternTrend(argv) {
129
+ if (argv.includes("--help") || argv.includes("-h")) {
130
+ console.log(`
131
+ judges ai-pattern-trend — Track AI-generated code pattern evolution
132
+
133
+ Usage:
134
+ judges ai-pattern-trend [dir] Capture snapshot and show trend
135
+ judges ai-pattern-trend --capture Capture current metrics only
136
+ judges ai-pattern-trend --show Show historical trend
137
+ judges ai-pattern-trend --reset Clear trend history
138
+
139
+ Options:
140
+ --capture Capture a new snapshot without showing history
141
+ --show Show trend without capturing
142
+ --reset Clear all trend data
143
+ --last <n> Show last N snapshots (default: 10)
144
+ --format json JSON output
145
+ --help, -h Show this help
146
+
147
+ Tracks: AI indicators, complexity, TODOs, empty functions,
148
+ duplicates, comment ratio, generic naming, error handling.
149
+ `);
150
+ return;
151
+ }
152
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
153
+ if (argv.includes("--reset")) {
154
+ saveHistory([]);
155
+ console.log(" Trend history cleared.");
156
+ return;
157
+ }
158
+ const target = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--")) || ".";
159
+ const showOnly = argv.includes("--show");
160
+ const captureOnly = argv.includes("--capture");
161
+ const lastN = parseInt(argv.find((_a, i) => argv[i - 1] === "--last") || "10");
162
+ const history = loadHistory();
163
+ // Capture snapshot
164
+ if (!showOnly) {
165
+ if (!existsSync(target)) {
166
+ console.error(` Path not found: ${target}`);
167
+ return;
168
+ }
169
+ const metrics = collectMetrics(target);
170
+ const snapshot = { timestamp: new Date().toISOString(), metrics };
171
+ history.push(snapshot);
172
+ saveHistory(history);
173
+ if (captureOnly) {
174
+ console.log(` ✅ Snapshot captured (${metrics.totalFiles} files)`);
175
+ return;
176
+ }
177
+ }
178
+ // Show trend
179
+ const recent = history.slice(-lastN);
180
+ if (format === "json") {
181
+ console.log(JSON.stringify({ snapshots: recent, totalSnapshots: history.length, timestamp: new Date().toISOString() }, null, 2));
182
+ return;
183
+ }
184
+ console.log(`\n AI Pattern Trend — ${history.length} snapshots\n ──────────────────────────`);
185
+ if (recent.length === 0) {
186
+ console.log(` No data yet. Run: judges ai-pattern-trend <dir>\n`);
187
+ return;
188
+ }
189
+ // Metric headers
190
+ const metricKeys = [
191
+ { key: "totalFiles", label: "Files", higherIsWorse: false },
192
+ { key: "aiIndicatorCount", label: "AI Markers", higherIsWorse: true },
193
+ { key: "avgComplexity", label: "Avg Complex", higherIsWorse: true },
194
+ { key: "todoCount", label: "TODOs", higherIsWorse: true },
195
+ { key: "emptyFunctionCount", label: "Empty Fns", higherIsWorse: true },
196
+ { key: "genericNamingCount", label: "Gen Names", higherIsWorse: true },
197
+ { key: "commentRatio", label: "Comment %", higherIsWorse: false },
198
+ { key: "errorHandlingRatio", label: "ErrHandl %", higherIsWorse: false },
199
+ ];
200
+ console.log(`\n ${"Date".padEnd(12)} ${metricKeys.map((m) => m.label.padEnd(12)).join("")}`);
201
+ console.log(` ${"─".repeat(12 + metricKeys.length * 12)}`);
202
+ for (const snap of recent) {
203
+ const date = new Date(snap.timestamp).toLocaleDateString("en-US", { month: "short", day: "numeric" });
204
+ const vals = metricKeys.map((m) => String(snap.metrics[m.key]).padEnd(12)).join("");
205
+ console.log(` ${date.padEnd(12)} ${vals}`);
206
+ }
207
+ // Trend arrows
208
+ if (recent.length >= 2) {
209
+ const first = recent[0].metrics;
210
+ const last = recent[recent.length - 1].metrics;
211
+ console.log(`\n Trends:`);
212
+ for (const m of metricKeys) {
213
+ const delta = last[m.key] - first[m.key];
214
+ if (delta === 0)
215
+ continue;
216
+ const direction = delta > 0 ? "↑" : "↓";
217
+ const good = delta > 0 !== m.higherIsWorse;
218
+ const icon = good ? "✅" : "⚠️";
219
+ console.log(` ${icon} ${m.label}: ${direction} ${Math.abs(delta)} (${first[m.key]} → ${last[m.key]})`);
220
+ }
221
+ }
222
+ console.log("");
223
+ }
224
+ //# sourceMappingURL=ai-pattern-trend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-pattern-trend.js","sourceRoot":"","sources":["../../src/commands/ai-pattern-trend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * API audit — security audit for REST/GraphQL API endpoints.
3
+ * Detects missing rate limiting, CORS misconfig, unauthenticated routes,
4
+ * input validation gaps, and overly permissive responses.
5
+ *
6
+ * All analysis local.
7
+ */
8
+ export declare function runApiAudit(argv: string[]): void;
9
+ //# sourceMappingURL=api-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-audit.d.ts","sourceRoot":"","sources":["../../src/commands/api-audit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAySH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmHhD"}
@@ -0,0 +1,360 @@
1
+ /**
2
+ * API audit — security audit for REST/GraphQL API endpoints.
3
+ * Detects missing rate limiting, CORS misconfig, unauthenticated routes,
4
+ * input validation gaps, and overly permissive responses.
5
+ *
6
+ * All analysis local.
7
+ */
8
+ import { existsSync, readFileSync, readdirSync } from "fs";
9
+ import { join, extname } from "path";
10
+ // ─── Framework detectors ────────────────────────────────────────────────────
11
+ const FRAMEWORK_DETECTORS = [
12
+ {
13
+ name: "express",
14
+ routePattern: /(?:app|router)\.(get|post|put|patch|delete|all|use)\s*\(\s*["'`]([^"'`]+)["'`]/gi,
15
+ extractEndpoint: (m) => ({ method: m[1].toUpperCase(), path: m[2] }),
16
+ },
17
+ {
18
+ name: "fastify",
19
+ routePattern: /(?:fastify|server|app)\.(get|post|put|patch|delete)\s*\(\s*["'`]([^"'`]+)["'`]/gi,
20
+ extractEndpoint: (m) => ({ method: m[1].toUpperCase(), path: m[2] }),
21
+ },
22
+ {
23
+ name: "flask",
24
+ routePattern: /@(?:app|blueprint)\.route\s*\(\s*["']([^"']+)["'](?:.*methods\s*=\s*\[([^\]]+)\])?/gi,
25
+ extractEndpoint: (m) => ({ method: m[2] ? m[2].replace(/['"]/g, "") : "GET", path: m[1] }),
26
+ },
27
+ {
28
+ name: "spring",
29
+ routePattern: /@(?:Get|Post|Put|Patch|Delete|Request)Mapping\s*\(\s*(?:value\s*=\s*)?["']([^"']+)["']/gi,
30
+ extractEndpoint: (m) => {
31
+ const methodMatch = m[0].match(/@(Get|Post|Put|Patch|Delete|Request)Mapping/i);
32
+ return { method: methodMatch ? methodMatch[1].toUpperCase() : "ANY", path: m[1] };
33
+ },
34
+ },
35
+ {
36
+ name: "django",
37
+ routePattern: /path\s*\(\s*["']([^"']+)["']/gi,
38
+ extractEndpoint: (m) => ({ method: "ANY", path: m[1] }),
39
+ },
40
+ ];
41
+ const API_RULES = [
42
+ {
43
+ id: "no-rate-limiting",
44
+ severity: "high",
45
+ check: (content, _lines, endpoints) => {
46
+ if (endpoints.length === 0)
47
+ return [];
48
+ const hasRateLimit = /(?:rate[-_]?limit|rateLimit|throttle|express-rate-limit|@nestjs\/throttler|slowDown)/i.test(content);
49
+ if (!hasRateLimit) {
50
+ return [
51
+ {
52
+ file: "",
53
+ line: 1,
54
+ ruleId: "no-rate-limiting",
55
+ severity: "high",
56
+ message: "No rate limiting detected — API vulnerable to abuse",
57
+ recommendation: "Add rate limiting middleware (e.g., express-rate-limit)",
58
+ },
59
+ ];
60
+ }
61
+ return [];
62
+ },
63
+ },
64
+ {
65
+ id: "cors-wildcard",
66
+ severity: "high",
67
+ check: (_content, lines) => {
68
+ const issues = [];
69
+ for (let i = 0; i < lines.length; i++) {
70
+ if (/cors\s*\(\s*\)|origin:\s*['"]?\*['"]?|Access-Control-Allow-Origin.*\*/i.test(lines[i])) {
71
+ issues.push({
72
+ file: "",
73
+ line: i + 1,
74
+ ruleId: "cors-wildcard",
75
+ severity: "high",
76
+ message: "CORS allows all origins (wildcard *)",
77
+ recommendation: "Restrict CORS to specific trusted domains",
78
+ });
79
+ }
80
+ }
81
+ return issues;
82
+ },
83
+ },
84
+ {
85
+ id: "unauthenticated-endpoint",
86
+ severity: "medium",
87
+ check: (content, lines, endpoints) => {
88
+ if (endpoints.length === 0)
89
+ return [];
90
+ const hasAuthMiddleware = /(?:passport|jwt|auth(?:enticate|orize)|bearer|keycloak|oauth|session)/i.test(content);
91
+ if (!hasAuthMiddleware) {
92
+ return [
93
+ {
94
+ file: "",
95
+ line: 1,
96
+ ruleId: "unauthenticated-endpoint",
97
+ severity: "medium",
98
+ message: `${endpoints.length} endpoints found with no authentication middleware detected`,
99
+ recommendation: "Add authentication middleware (JWT, session, OAuth)",
100
+ },
101
+ ];
102
+ }
103
+ // Check individual routes missing auth
104
+ const issues = [];
105
+ for (const ep of endpoints) {
106
+ const lineContent = lines[ep.line - 1] || "";
107
+ const nextContent = lines[ep.line] || "";
108
+ if (!/auth|protect|guard|session/i.test(lineContent) && !/auth|protect|guard|session/i.test(nextContent)) {
109
+ if (!/health|ping|status|public|login|register|signup|webhook|callback/i.test(ep.path)) {
110
+ issues.push({
111
+ file: ep.file,
112
+ line: ep.line,
113
+ ruleId: "unauthenticated-endpoint",
114
+ severity: "medium",
115
+ message: `Endpoint ${ep.method} ${ep.path} may lack authentication`,
116
+ recommendation: "Add authentication middleware to this route",
117
+ endpoint: `${ep.method} ${ep.path}`,
118
+ });
119
+ }
120
+ }
121
+ }
122
+ return issues;
123
+ },
124
+ },
125
+ {
126
+ id: "no-input-validation",
127
+ severity: "high",
128
+ check: (content, _lines, endpoints) => {
129
+ if (endpoints.length === 0)
130
+ return [];
131
+ const hasValidation = /(?:joi|yup|zod|celebrate|express-validator|class-validator|@IsString|@IsNumber|validation)/i.test(content);
132
+ if (!hasValidation) {
133
+ return [
134
+ {
135
+ file: "",
136
+ line: 1,
137
+ ruleId: "no-input-validation",
138
+ severity: "high",
139
+ message: "No input validation library detected — vulnerable to injection",
140
+ recommendation: "Use a validation library (Zod, Joi, express-validator)",
141
+ },
142
+ ];
143
+ }
144
+ return [];
145
+ },
146
+ },
147
+ {
148
+ id: "sensitive-data-response",
149
+ severity: "high",
150
+ check: (_content, lines) => {
151
+ const issues = [];
152
+ for (let i = 0; i < lines.length; i++) {
153
+ if (/(?:res\.json|res\.send|response\.json|jsonify)\s*\(.*(?:password|secret|token|ssn|credit_?card)/i.test(lines[i])) {
154
+ issues.push({
155
+ file: "",
156
+ line: i + 1,
157
+ ruleId: "sensitive-data-response",
158
+ severity: "high",
159
+ message: "Potentially sensitive data in API response",
160
+ recommendation: "Sanitize response objects — remove sensitive fields before sending",
161
+ });
162
+ }
163
+ }
164
+ return issues;
165
+ },
166
+ },
167
+ {
168
+ id: "helmet-missing",
169
+ severity: "medium",
170
+ check: (content, _lines, endpoints) => {
171
+ if (endpoints.length === 0)
172
+ return [];
173
+ const isExpress = /require\s*\(\s*["']express["']\)|from\s+["']express["']/i.test(content);
174
+ if (isExpress && !/helmet/i.test(content)) {
175
+ return [
176
+ {
177
+ file: "",
178
+ line: 1,
179
+ ruleId: "helmet-missing",
180
+ severity: "medium",
181
+ message: "Express app without Helmet — missing security headers",
182
+ recommendation: "Add helmet middleware for security headers",
183
+ },
184
+ ];
185
+ }
186
+ return [];
187
+ },
188
+ },
189
+ {
190
+ id: "sql-in-route",
191
+ severity: "critical",
192
+ check: (_content, lines) => {
193
+ const issues = [];
194
+ for (let i = 0; i < lines.length; i++) {
195
+ if (/(?:query|execute)\s*\(\s*[`"']?\s*(?:SELECT|INSERT|UPDATE|DELETE).*\$\{|(?:req\.(?:body|params|query))/i.test(lines[i])) {
196
+ issues.push({
197
+ file: "",
198
+ line: i + 1,
199
+ ruleId: "sql-in-route",
200
+ severity: "critical",
201
+ message: "Potential SQL injection — user input in query string",
202
+ recommendation: "Use parameterized queries or an ORM",
203
+ });
204
+ }
205
+ }
206
+ return issues;
207
+ },
208
+ },
209
+ ];
210
+ // ─── Scanner ────────────────────────────────────────────────────────────────
211
+ const SKIP_DIRS = new Set(["node_modules", ".git", "dist", "build", "coverage"]);
212
+ const CODE_EXTS = new Set([".ts", ".js", ".py", ".java", ".cs", ".go", ".rb", ".php"]);
213
+ function collectFiles(dir) {
214
+ const result = [];
215
+ function walk(d) {
216
+ let entries;
217
+ try {
218
+ entries = readdirSync(d);
219
+ }
220
+ catch {
221
+ return;
222
+ }
223
+ for (const name of entries) {
224
+ if (SKIP_DIRS.has(name) || name.startsWith("."))
225
+ continue;
226
+ const full = join(d, name);
227
+ try {
228
+ const sub = readdirSync(full);
229
+ void sub;
230
+ walk(full);
231
+ }
232
+ catch {
233
+ if (CODE_EXTS.has(extname(name).toLowerCase()))
234
+ result.push(full);
235
+ }
236
+ }
237
+ }
238
+ walk(dir);
239
+ return result;
240
+ }
241
+ function extractEndpoints(filePath, content) {
242
+ const endpoints = [];
243
+ const lines = content.split("\n");
244
+ for (const detector of FRAMEWORK_DETECTORS) {
245
+ detector.routePattern.lastIndex = 0;
246
+ let m;
247
+ while ((m = detector.routePattern.exec(content)) !== null) {
248
+ const ep = detector.extractEndpoint(m);
249
+ const offset = content.substring(0, m.index).split("\n").length;
250
+ endpoints.push({ file: filePath, line: offset, method: ep.method, path: ep.path, framework: detector.name });
251
+ }
252
+ void lines;
253
+ }
254
+ return endpoints;
255
+ }
256
+ // ─── CLI ────────────────────────────────────────────────────────────────────
257
+ export function runApiAudit(argv) {
258
+ if (argv.includes("--help") || argv.includes("-h")) {
259
+ console.log(`
260
+ judges api-audit — Security audit for REST/GraphQL API endpoints
261
+
262
+ Usage:
263
+ judges api-audit [dir]
264
+ judges api-audit src/ --severity critical,high
265
+
266
+ Options:
267
+ --severity <levels> Filter by severity (comma-separated)
268
+ --endpoints List discovered API endpoints only
269
+ --rules List all API audit rules
270
+ --format json JSON output
271
+ --help, -h Show this help
272
+
273
+ Frameworks: Express, Fastify, Flask, Spring, Django
274
+ `);
275
+ return;
276
+ }
277
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
278
+ if (argv.includes("--rules")) {
279
+ const rules = API_RULES.map(({ check: _c, ...rest }) => rest);
280
+ if (format === "json") {
281
+ console.log(JSON.stringify(rules, null, 2));
282
+ }
283
+ else {
284
+ console.log(`\n API Audit Rules (${rules.length})\n ──────────────────────────`);
285
+ for (const r of rules)
286
+ console.log(` [${r.severity.toUpperCase().padEnd(8)}] ${r.id}`);
287
+ console.log("");
288
+ }
289
+ return;
290
+ }
291
+ const target = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--")) || ".";
292
+ const sevFilter = argv.find((_a, i) => argv[i - 1] === "--severity");
293
+ if (!existsSync(target)) {
294
+ console.error(` Path not found: ${target}`);
295
+ return;
296
+ }
297
+ const files = collectFiles(target);
298
+ const allEndpoints = [];
299
+ let allIssues = [];
300
+ for (const file of files) {
301
+ let content;
302
+ try {
303
+ content = readFileSync(file, "utf-8");
304
+ }
305
+ catch {
306
+ continue;
307
+ }
308
+ const endpoints = extractEndpoints(file, content);
309
+ allEndpoints.push(...endpoints);
310
+ const lines = content.split("\n");
311
+ for (const rule of API_RULES) {
312
+ const issues = rule.check(content, lines, endpoints);
313
+ for (const issue of issues) {
314
+ issue.file = issue.file || file;
315
+ allIssues.push(issue);
316
+ }
317
+ }
318
+ }
319
+ if (argv.includes("--endpoints")) {
320
+ if (format === "json") {
321
+ console.log(JSON.stringify(allEndpoints, null, 2));
322
+ }
323
+ else {
324
+ console.log(`\n Discovered API Endpoints (${allEndpoints.length})\n ──────────────────────────`);
325
+ for (const ep of allEndpoints) {
326
+ console.log(` ${ep.method.padEnd(7)} ${ep.path.padEnd(30)} [${ep.framework}] ${ep.file}:${ep.line}`);
327
+ }
328
+ console.log("");
329
+ }
330
+ return;
331
+ }
332
+ if (sevFilter) {
333
+ const allowed = sevFilter.split(",");
334
+ allIssues = allIssues.filter((i) => allowed.includes(i.severity));
335
+ }
336
+ if (format === "json") {
337
+ console.log(JSON.stringify({ endpoints: allEndpoints, issues: allIssues, scannedFiles: files.length, timestamp: new Date().toISOString() }, null, 2));
338
+ }
339
+ else {
340
+ console.log(`\n API Security Audit — ${files.length} files scanned`);
341
+ console.log(` Endpoints: ${allEndpoints.length} | Issues: ${allIssues.length}\n ──────────────────────────`);
342
+ if (allIssues.length === 0) {
343
+ console.log(` ✅ No API security issues detected\n`);
344
+ return;
345
+ }
346
+ for (const sev of ["critical", "high", "medium", "low"]) {
347
+ const items = allIssues.filter((i) => i.severity === sev);
348
+ if (items.length === 0)
349
+ continue;
350
+ console.log(`\n ${sev.toUpperCase()} (${items.length})`);
351
+ for (const issue of items) {
352
+ console.log(` ${issue.file}:${issue.line} — ${issue.ruleId}`);
353
+ console.log(` ${issue.message}`);
354
+ console.log(` → ${issue.recommendation}`);
355
+ }
356
+ }
357
+ console.log("");
358
+ }
359
+ }
360
+ //# sourceMappingURL=api-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-audit.js","sourceRoot":"","sources":["../../src/commands/api-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
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
+ export declare function runArchAudit(argv: string[]): void;
9
+ //# sourceMappingURL=arch-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arch-audit.d.ts","sourceRoot":"","sources":["../../src/commands/arch-audit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA+MH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiHjD"}