@kevinrabun/judges 3.56.0 → 3.58.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/assertion-density.d.ts +5 -0
  6. package/dist/commands/assertion-density.d.ts.map +1 -0
  7. package/dist/commands/assertion-density.js +264 -0
  8. package/dist/commands/assertion-density.js.map +1 -0
  9. package/dist/commands/async-safety.d.ts +5 -0
  10. package/dist/commands/async-safety.d.ts.map +1 -0
  11. package/dist/commands/async-safety.js +267 -0
  12. package/dist/commands/async-safety.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/clone-detect.d.ts +5 -0
  18. package/dist/commands/clone-detect.d.ts.map +1 -0
  19. package/dist/commands/clone-detect.js +233 -0
  20. package/dist/commands/clone-detect.js.map +1 -0
  21. package/dist/commands/comment-drift.d.ts +5 -0
  22. package/dist/commands/comment-drift.d.ts.map +1 -0
  23. package/dist/commands/comment-drift.js +229 -0
  24. package/dist/commands/comment-drift.js.map +1 -0
  25. package/dist/commands/contract-verify.d.ts +5 -0
  26. package/dist/commands/contract-verify.d.ts.map +1 -0
  27. package/dist/commands/contract-verify.js +317 -0
  28. package/dist/commands/contract-verify.js.map +1 -0
  29. package/dist/commands/dead-code-detect.d.ts +5 -0
  30. package/dist/commands/dead-code-detect.d.ts.map +1 -0
  31. package/dist/commands/dead-code-detect.js +256 -0
  32. package/dist/commands/dead-code-detect.js.map +1 -0
  33. package/dist/commands/encoding-safety.d.ts +5 -0
  34. package/dist/commands/encoding-safety.d.ts.map +1 -0
  35. package/dist/commands/encoding-safety.js +276 -0
  36. package/dist/commands/encoding-safety.js.map +1 -0
  37. package/dist/commands/error-ux.d.ts +5 -0
  38. package/dist/commands/error-ux.d.ts.map +1 -0
  39. package/dist/commands/error-ux.js +253 -0
  40. package/dist/commands/error-ux.js.map +1 -0
  41. package/dist/commands/event-leak.d.ts +5 -0
  42. package/dist/commands/event-leak.d.ts.map +1 -0
  43. package/dist/commands/event-leak.js +263 -0
  44. package/dist/commands/event-leak.js.map +1 -0
  45. package/dist/commands/idempotency-audit.d.ts +5 -0
  46. package/dist/commands/idempotency-audit.d.ts.map +1 -0
  47. package/dist/commands/idempotency-audit.js +223 -0
  48. package/dist/commands/idempotency-audit.js.map +1 -0
  49. package/dist/commands/input-guard.d.ts +5 -0
  50. package/dist/commands/input-guard.d.ts.map +1 -0
  51. package/dist/commands/input-guard.js +256 -0
  52. package/dist/commands/input-guard.js.map +1 -0
  53. package/dist/commands/privilege-path.d.ts +5 -0
  54. package/dist/commands/privilege-path.d.ts.map +1 -0
  55. package/dist/commands/privilege-path.js +234 -0
  56. package/dist/commands/privilege-path.js.map +1 -0
  57. package/dist/commands/state-integrity.d.ts +5 -0
  58. package/dist/commands/state-integrity.d.ts.map +1 -0
  59. package/dist/commands/state-integrity.js +284 -0
  60. package/dist/commands/state-integrity.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,223 @@
1
+ /**
2
+ * Idempotency audit — verify retried/webhook operations are safely idempotent.
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
+ const isRetryContext = /retry|webhook|queue|worker|consumer|handler|idempoten/i.test(fullText);
53
+ for (let i = 0; i < lines.length; i++) {
54
+ const line = lines[i];
55
+ // INSERT without ON CONFLICT / upsert in retry context
56
+ if (/INSERT\s+INTO/i.test(line) && isRetryContext) {
57
+ const block = lines.slice(i, Math.min(i + 3, lines.length)).join("\n");
58
+ if (!/ON\s+CONFLICT|ON\s+DUPLICATE|UPSERT|IF\s+NOT\s+EXISTS|MERGE/i.test(block)) {
59
+ issues.push({
60
+ file: filepath,
61
+ line: i + 1,
62
+ issue: "INSERT without conflict handling in retry path",
63
+ severity: "high",
64
+ detail: "Retry can cause duplicate rows — use INSERT ... ON CONFLICT or UPSERT",
65
+ });
66
+ }
67
+ }
68
+ // Auto-increment counter mutation in handler
69
+ if (/\+\+|\+=\s*1|\.increment|\.incr\b/i.test(line)) {
70
+ if (/handler|webhook|consumer|worker|queue|retry/i.test(fullText)) {
71
+ const block = lines.slice(Math.max(0, i - 5), Math.min(i + 5, lines.length)).join("\n");
72
+ if (!/idempotency|dedup|idempotent|already.*processed/i.test(block)) {
73
+ issues.push({
74
+ file: filepath,
75
+ line: i + 1,
76
+ issue: "Counter increment in retry-able path",
77
+ severity: "high",
78
+ detail: "Counter mutation is not idempotent — repeated execution will over-count",
79
+ });
80
+ }
81
+ }
82
+ }
83
+ // Email/SMS/notification send without dedup
84
+ if (/sendEmail|sendSMS|sendNotification|notify|\.send\s*\(/i.test(line)) {
85
+ if (isRetryContext) {
86
+ const block = lines.slice(Math.max(0, i - 8), Math.min(i + 5, lines.length)).join("\n");
87
+ if (!/idempotency|dedup|already.*sent|sentIds|processed/i.test(block)) {
88
+ issues.push({
89
+ file: filepath,
90
+ line: i + 1,
91
+ issue: "Notification send without dedup in retry path",
92
+ severity: "high",
93
+ detail: "Retry will send duplicate notifications — track sent IDs or use idempotency key",
94
+ });
95
+ }
96
+ }
97
+ }
98
+ // Payment/charge without idempotency key
99
+ if (/charge|payment|transfer|payout|refund/i.test(line) && /\.(?:create|post|execute)\s*\(/i.test(line)) {
100
+ const block = lines.slice(i, Math.min(i + 5, lines.length)).join("\n");
101
+ if (!/idempotency|idempotent|dedup|Idempotency-Key/i.test(block)) {
102
+ issues.push({
103
+ file: filepath,
104
+ line: i + 1,
105
+ issue: "Financial operation without idempotency key",
106
+ severity: "high",
107
+ detail: "Payment operation lacks idempotency key — retry can cause double-charge",
108
+ });
109
+ }
110
+ }
111
+ // Webhook handler without idempotency check
112
+ if (/webhook|eventHandler|onEvent|handleEvent/i.test(line) && /function|=>|async/.test(line)) {
113
+ const funcBlock = lines.slice(i, Math.min(i + 20, lines.length)).join("\n");
114
+ if (!/idempotency|dedup|already.*processed|processedIds|eventId/i.test(funcBlock)) {
115
+ issues.push({
116
+ file: filepath,
117
+ line: i + 1,
118
+ issue: "Webhook handler without idempotency guard",
119
+ severity: "medium",
120
+ detail: "Webhook providers may deliver events multiple times — check for prior processing",
121
+ });
122
+ }
123
+ }
124
+ // Queue consumer ACK before processing completes
125
+ if (/\.ack\s*\(|\.acknowledge/i.test(line)) {
126
+ const beforeBlock = lines.slice(Math.max(0, i - 3), i + 1).join("\n");
127
+ if (!/await|then|\.catch|try/i.test(beforeBlock)) {
128
+ issues.push({
129
+ file: filepath,
130
+ line: i + 1,
131
+ issue: "Queue ACK before processing completion",
132
+ severity: "high",
133
+ detail: "Acknowledging message before processing finishes — crash loses the message",
134
+ });
135
+ }
136
+ }
137
+ // File write without atomic rename pattern
138
+ if (/writeFileSync|writeFile\s*\(|fs\.write/i.test(line)) {
139
+ if (isRetryContext) {
140
+ const block = lines.slice(i, Math.min(i + 5, lines.length)).join("\n");
141
+ if (!/rename|\.tmp|\.temp|atomic|swap/i.test(block)) {
142
+ issues.push({
143
+ file: filepath,
144
+ line: i + 1,
145
+ issue: "File write without atomic rename",
146
+ severity: "low",
147
+ detail: "Non-atomic write in retry path — crash during write corrupts the file",
148
+ });
149
+ }
150
+ }
151
+ }
152
+ // DELETE without WHERE in retry context
153
+ if (/DELETE\s+FROM/i.test(line) && isRetryContext) {
154
+ const block = lines.slice(i, Math.min(i + 3, lines.length)).join("\n");
155
+ if (!/WHERE/i.test(block)) {
156
+ issues.push({
157
+ file: filepath,
158
+ line: i + 1,
159
+ issue: "DELETE without WHERE in retry path",
160
+ severity: "high",
161
+ detail: "Unbounded DELETE is dangerous in retry context — could wipe entire table",
162
+ });
163
+ }
164
+ }
165
+ }
166
+ return issues;
167
+ }
168
+ // ─── CLI ────────────────────────────────────────────────────────────────────
169
+ export function runIdempotencyAudit(argv) {
170
+ if (argv.includes("--help") || argv.includes("-h")) {
171
+ console.log(`
172
+ judges idempotency-audit — Verify retry/webhook operations are safely idempotent
173
+
174
+ Usage:
175
+ judges idempotency-audit [dir]
176
+ judges idempotency-audit src/ --format json
177
+
178
+ Options:
179
+ [dir] Directory to scan (default: .)
180
+ --format json JSON output
181
+ --help, -h Show this help
182
+
183
+ Checks: INSERT without conflict handling, counter mutation in retries, notification dedup,
184
+ payment idempotency keys, webhook handler guards, queue ACK ordering, atomic file writes.
185
+ `);
186
+ return;
187
+ }
188
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
189
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
190
+ const files = collectFiles(dir);
191
+ const allIssues = [];
192
+ for (const f of files)
193
+ allIssues.push(...analyzeFile(f));
194
+ const highCount = allIssues.filter((i) => i.severity === "high").length;
195
+ const medCount = allIssues.filter((i) => i.severity === "medium").length;
196
+ const score = Math.max(0, 100 - highCount * 10 - medCount * 4);
197
+ if (format === "json") {
198
+ console.log(JSON.stringify({
199
+ issues: allIssues,
200
+ score,
201
+ summary: { high: highCount, medium: medCount, total: allIssues.length },
202
+ timestamp: new Date().toISOString(),
203
+ }, null, 2));
204
+ }
205
+ else {
206
+ const badge = score >= 80 ? "✅ SAFE" : score >= 50 ? "⚠️ RISKY" : "❌ UNSAFE";
207
+ console.log(`\n Idempotency: ${badge} (${score}/100)\n ─────────────────────────────`);
208
+ if (allIssues.length === 0) {
209
+ console.log(" No idempotency issues detected.\n");
210
+ return;
211
+ }
212
+ for (const issue of allIssues.slice(0, 25)) {
213
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
214
+ console.log(` ${icon} ${issue.issue}`);
215
+ console.log(` ${issue.file}:${issue.line}`);
216
+ console.log(` ${issue.detail}`);
217
+ }
218
+ if (allIssues.length > 25)
219
+ console.log(` ... and ${allIssues.length - 25} more`);
220
+ console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
221
+ }
222
+ }
223
+ //# sourceMappingURL=idempotency-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency-audit.js","sourceRoot":"","sources":["../../src/commands/idempotency-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Input guard — verify all system entry points have proper input validation.
3
+ */
4
+ export declare function runInputGuard(argv: string[]): void;
5
+ //# sourceMappingURL=input-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-guard.d.ts","sourceRoot":"","sources":["../../src/commands/input-guard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwOH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+DlD"}
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Input guard — verify all system entry points have proper input validation.
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"]);
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
+ for (let i = 0; i < lines.length; i++) {
53
+ const line = lines[i];
54
+ // Route handler without validation
55
+ if (/(?:router|app)\.\s*(?:get|post|put|delete|patch)\s*\(\s*['"]/.test(line)) {
56
+ const handlerBlock = lines.slice(i, Math.min(i + 20, lines.length)).join("\n");
57
+ if (/req\.body|req\.params|req\.query/i.test(handlerBlock)) {
58
+ if (!/zod|joi|yup|ajv|class-validator|validate|schema|express-validator|celebrate|superstruct/i.test(handlerBlock)) {
59
+ issues.push({
60
+ file: filepath,
61
+ line: i + 1,
62
+ issue: "Route handler without input validation",
63
+ severity: "high",
64
+ detail: "Request body/params/query used without validation library — vulnerable to injection and type confusion",
65
+ });
66
+ }
67
+ }
68
+ }
69
+ // Direct req.body property access without checking
70
+ if (/req\.body\.(\w+)/.test(line) || /request\.body\.(\w+)/.test(line)) {
71
+ const prop = line.match(/(?:req|request)\.body\.(\w+)/)?.[1];
72
+ const block = lines.slice(Math.max(0, i - 3), Math.min(i + 3, lines.length)).join("\n");
73
+ if (!/typeof|instanceof|validate|schema|zod|joi|if\s*\(|assert|guard|check/i.test(block)) {
74
+ issues.push({
75
+ file: filepath,
76
+ line: i + 1,
77
+ issue: "Direct request body access without type check",
78
+ severity: "medium",
79
+ detail: `\`req.body.${prop}\` accessed without type validation — may be undefined, wrong type, or malicious`,
80
+ });
81
+ }
82
+ }
83
+ // SQL query with string interpolation
84
+ if (/`[^`]*\$\{.*req\.|`[^`]*\$\{.*params\.|`[^`]*\$\{.*query\./i.test(line)) {
85
+ if (/SELECT|INSERT|UPDATE|DELETE|FROM|WHERE/i.test(line)) {
86
+ issues.push({
87
+ file: filepath,
88
+ line: i + 1,
89
+ issue: "SQL query with string interpolation from user input",
90
+ severity: "high",
91
+ detail: "User input interpolated into SQL — use parameterized queries to prevent SQL injection",
92
+ });
93
+ }
94
+ }
95
+ // Command injection risk
96
+ if (/exec\s*\(|execSync\s*\(|spawn\s*\(|child_process/i.test(line)) {
97
+ if (/req\.|params\.|query\.|body\.|user.*input|args\[/i.test(line)) {
98
+ issues.push({
99
+ file: filepath,
100
+ line: i + 1,
101
+ issue: "User input in shell command",
102
+ severity: "high",
103
+ detail: "User-supplied data passed to shell execution — command injection risk",
104
+ });
105
+ }
106
+ }
107
+ // Missing Content-Type check on POST/PUT
108
+ if (/(?:app|router)\.\s*(?:post|put|patch)\s*\(/.test(line)) {
109
+ const handlerBlock = lines.slice(i, Math.min(i + 15, lines.length)).join("\n");
110
+ if (/req\.body/i.test(handlerBlock) &&
111
+ !/content-type|bodyParser|express\.json|express\.urlencoded|multer/i.test(fullText)) {
112
+ issues.push({
113
+ file: filepath,
114
+ line: i + 1,
115
+ issue: "POST handler without body parser",
116
+ severity: "medium",
117
+ detail: "Handler reads req.body but no body parser middleware detected — body may be undefined",
118
+ });
119
+ }
120
+ }
121
+ // GraphQL resolver without input validation
122
+ if (/(?:resolve|resolver)\s*[:(]/.test(line) && /graphql|gql|typeDefs|schema/i.test(fullText)) {
123
+ const block = lines.slice(i, Math.min(i + 15, lines.length)).join("\n");
124
+ if (/args\.\w+|input\.\w+/i.test(block) && !/validate|schema|zod|joi|check|guard|assert/i.test(block)) {
125
+ issues.push({
126
+ file: filepath,
127
+ line: i + 1,
128
+ issue: "GraphQL resolver without input validation",
129
+ severity: "medium",
130
+ detail: "Resolver uses args/input without validation — GraphQL types alone don't prevent malicious values",
131
+ });
132
+ }
133
+ }
134
+ // File upload without size/type check
135
+ if (/multer|upload|req\.file|req\.files/i.test(line)) {
136
+ const block = lines.slice(i, Math.min(i + 10, lines.length)).join("\n");
137
+ if (!/limits|fileSize|maxSize|fileFilter|mimetype|accept/i.test(block)) {
138
+ issues.push({
139
+ file: filepath,
140
+ line: i + 1,
141
+ issue: "File upload without size/type restrictions",
142
+ severity: "high",
143
+ detail: "File upload handler lacks size limits or type filtering — DoS and malicious upload risk",
144
+ });
145
+ }
146
+ }
147
+ // parseInt/Number without bounds check
148
+ if (/parseInt\s*\(\s*(?:req|params|query|body)\.|Number\s*\(\s*(?:req|params|query|body)\./i.test(line)) {
149
+ const block = lines.slice(i, Math.min(i + 5, lines.length)).join("\n");
150
+ if (!/isNaN|isFinite|Math\.min|Math\.max|clamp|>=|<=|>|</i.test(block)) {
151
+ issues.push({
152
+ file: filepath,
153
+ line: i + 1,
154
+ issue: "Numeric input without bounds check",
155
+ severity: "medium",
156
+ detail: "User input parsed to number without NaN or range check — can cause unexpected behavior",
157
+ });
158
+ }
159
+ }
160
+ // Regex from user input (ReDoS risk)
161
+ if (/new RegExp\s*\(\s*(?:req|params|query|body|input|user)/i.test(line)) {
162
+ issues.push({
163
+ file: filepath,
164
+ line: i + 1,
165
+ issue: "Regex from user input",
166
+ severity: "high",
167
+ detail: "User-supplied value used as regex pattern — ReDoS (Regular Expression Denial of Service) risk",
168
+ });
169
+ }
170
+ // URL/redirect without validation
171
+ if (/(?:redirect|location)\s*[:=]\s*(?:req|params|query|body)\./i.test(line) ||
172
+ /res\.redirect\s*\(\s*(?:req|params)/i.test(line)) {
173
+ const block = lines.slice(i, Math.min(i + 5, lines.length)).join("\n");
174
+ if (!/whitelist|allowedUrls|allowedDomains|startsWith|URL\(|validateUrl|safeRedirect/i.test(block)) {
175
+ issues.push({
176
+ file: filepath,
177
+ line: i + 1,
178
+ issue: "Open redirect from user input",
179
+ severity: "high",
180
+ detail: "Redirect URL from user input without domain validation — open redirect vulnerability",
181
+ });
182
+ }
183
+ }
184
+ // Array length from user input
185
+ if (/\.length\s*[<>=].*(?:req|params|query|limit|offset|page)/i.test(line) ||
186
+ /(?:limit|offset|page|size)\s*=.*(?:req|params|query)/i.test(line)) {
187
+ const block = lines.slice(i, Math.min(i + 5, lines.length)).join("\n");
188
+ if (!/Math\.min|clamp|MAX_|LIMIT|maxResults|<=\s*\d+/i.test(block)) {
189
+ issues.push({
190
+ file: filepath,
191
+ line: i + 1,
192
+ issue: "Unbounded pagination parameter",
193
+ severity: "medium",
194
+ detail: "Pagination parameter from user input without upper bound — can request excessive data",
195
+ });
196
+ }
197
+ }
198
+ }
199
+ return issues;
200
+ }
201
+ // ─── CLI ────────────────────────────────────────────────────────────────────
202
+ export function runInputGuard(argv) {
203
+ if (argv.includes("--help") || argv.includes("-h")) {
204
+ console.log(`
205
+ judges input-guard — Verify entry points have proper input validation
206
+
207
+ Usage:
208
+ judges input-guard [dir]
209
+ judges input-guard src/ --format json
210
+
211
+ Options:
212
+ [dir] Directory to scan (default: .)
213
+ --format json JSON output
214
+ --help, -h Show this help
215
+
216
+ Checks: route handlers without validation, SQL injection, command injection, missing body parsers,
217
+ file upload limits, numeric bounds, ReDoS from user regex, open redirects, unbounded pagination.
218
+ `);
219
+ return;
220
+ }
221
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
222
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
223
+ const files = collectFiles(dir);
224
+ const allIssues = [];
225
+ for (const f of files)
226
+ allIssues.push(...analyzeFile(f));
227
+ const highCount = allIssues.filter((i) => i.severity === "high").length;
228
+ const medCount = allIssues.filter((i) => i.severity === "medium").length;
229
+ const score = Math.max(0, 100 - highCount * 10 - medCount * 4);
230
+ if (format === "json") {
231
+ console.log(JSON.stringify({
232
+ issues: allIssues,
233
+ score,
234
+ summary: { high: highCount, medium: medCount, total: allIssues.length },
235
+ timestamp: new Date().toISOString(),
236
+ }, null, 2));
237
+ }
238
+ else {
239
+ const badge = score >= 80 ? "✅ GUARDED" : score >= 50 ? "⚠️ POROUS" : "❌ EXPOSED";
240
+ console.log(`\n Input Safety: ${badge} (${score}/100)\n ─────────────────────────────`);
241
+ if (allIssues.length === 0) {
242
+ console.log(" No input validation issues detected.\n");
243
+ return;
244
+ }
245
+ for (const issue of allIssues.slice(0, 25)) {
246
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
247
+ console.log(` ${icon} ${issue.issue}`);
248
+ console.log(` ${issue.file}:${issue.line}`);
249
+ console.log(` ${issue.detail}`);
250
+ }
251
+ if (allIssues.length > 25)
252
+ console.log(` ... and ${allIssues.length - 25} more`);
253
+ console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
254
+ }
255
+ }
256
+ //# sourceMappingURL=input-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-guard.js","sourceRoot":"","sources":["../../src/commands/input-guard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAYrC,+EAA+E;AAE/E,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAEjF,SAAS,YAAY,CAAC,GAAW,EAAE,GAAG,GAAG,GAAG;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,SAAS,IAAI,CAAC,CAAS;QACrB,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;YAAE,OAAO;QAChC,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,CAAC,CAAwB,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;gBAAE,OAAO;YAChC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,cAAc,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,OAAO;gBAAE,SAAS;YACzF,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC;gBACH,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;oBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;qBACxC,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+EAA+E;AAE/E,SAAS,WAAW,CAAC,QAAgB;IACnC,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC;IAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtB,mCAAmC;QACnC,IAAI,8DAA8D,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9E,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/E,IAAI,mCAAmC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC3D,IACE,CAAC,0FAA0F,CAAC,IAAI,CAAC,YAAY,CAAC,EAC9G,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,GAAG,CAAC;wBACX,KAAK,EAAE,wCAAwC;wBAC/C,QAAQ,EAAE,MAAM;wBAChB,MAAM,EACJ,wGAAwG;qBAC3G,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,mDAAmD;QACnD,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxF,IAAI,CAAC,uEAAuE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzF,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,KAAK,EAAE,+CAA+C;oBACtD,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,cAAc,IAAI,kFAAkF;iBAC7G,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,IAAI,6DAA6D,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7E,IAAI,yCAAyC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzD,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,KAAK,EAAE,qDAAqD;oBAC5D,QAAQ,EAAE,MAAM;oBAChB,MAAM,EAAE,uFAAuF;iBAChG,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,IAAI,mDAAmD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnE,IAAI,mDAAmD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnE,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,KAAK,EAAE,6BAA6B;oBACpC,QAAQ,EAAE,MAAM;oBAChB,MAAM,EAAE,uEAAuE;iBAChF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,IAAI,4CAA4C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/E,IACE,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;gBAC/B,CAAC,mEAAmE,CAAC,IAAI,CAAC,QAAQ,CAAC,EACnF,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,KAAK,EAAE,kCAAkC;oBACzC,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,uFAAuF;iBAChG,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,IAAI,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9F,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxE,IAAI,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtG,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,KAAK,EAAE,2CAA2C;oBAClD,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,kGAAkG;iBAC3G,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,IAAI,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxE,IAAI,CAAC,qDAAqD,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvE,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,KAAK,EAAE,4CAA4C;oBACnD,QAAQ,EAAE,MAAM;oBAChB,MAAM,EAAE,yFAAyF;iBAClG,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,uCAAuC;QACvC,IAAI,wFAAwF,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxG,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvE,IAAI,CAAC,qDAAqD,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvE,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,KAAK,EAAE,oCAAoC;oBAC3C,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,wFAAwF;iBACjG,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,IAAI,yDAAyD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzE,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,GAAG,CAAC;gBACX,KAAK,EAAE,uBAAuB;gBAC9B,QAAQ,EAAE,MAAM;gBAChB,MAAM,EAAE,+FAA+F;aACxG,CAAC,CAAC;QACL,CAAC;QAED,kCAAkC;QAClC,IACE,6DAA6D,CAAC,IAAI,CAAC,IAAI,CAAC;YACxE,sCAAsC,CAAC,IAAI,CAAC,IAAI,CAAC,EACjD,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvE,IAAI,CAAC,iFAAiF,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnG,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,KAAK,EAAE,+BAA+B;oBACtC,QAAQ,EAAE,MAAM;oBAChB,MAAM,EAAE,sFAAsF;iBAC/F,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,IACE,2DAA2D,CAAC,IAAI,CAAC,IAAI,CAAC;YACtE,uDAAuD,CAAC,IAAI,CAAC,IAAI,CAAC,EAClE,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvE,IAAI,CAAC,iDAAiD,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnE,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,KAAK,EAAE,gCAAgC;oBACvC,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,uFAAuF;iBAChG,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;CAcf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,MAAM,CAAC;IAC1F,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;IAE/E,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,SAAS,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzD,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,SAAS,GAAG,EAAE,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;IAE/D,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;YACE,MAAM,EAAE,SAAS;YACjB,KAAK;YACL,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE;YACvE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,KAAK,KAAK,wCAAwC,CAAC,CAAC;QAE1F,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,SAAS,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;QAEpF,OAAO,CAAC,GAAG,CAAC,gBAAgB,SAAS,CAAC,MAAM,YAAY,SAAS,cAAc,QAAQ,aAAa,KAAK,QAAQ,CAAC,CAAC;IACrH,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Privilege path — model authorization flows to find privilege-escalation paths.
3
+ */
4
+ export declare function runPrivilegePath(argv: string[]): void;
5
+ //# sourceMappingURL=privilege-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privilege-path.d.ts","sourceRoot":"","sources":["../../src/commands/privilege-path.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgNH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+DrD"}