@kevinrabun/judges 3.56.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 (38) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +56 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/cache-audit.d.ts +5 -0
  6. package/dist/commands/cache-audit.d.ts.map +1 -0
  7. package/dist/commands/cache-audit.js +220 -0
  8. package/dist/commands/cache-audit.js.map +1 -0
  9. package/dist/commands/comment-drift.d.ts +5 -0
  10. package/dist/commands/comment-drift.d.ts.map +1 -0
  11. package/dist/commands/comment-drift.js +229 -0
  12. package/dist/commands/comment-drift.js.map +1 -0
  13. package/dist/commands/error-ux.d.ts +5 -0
  14. package/dist/commands/error-ux.d.ts.map +1 -0
  15. package/dist/commands/error-ux.js +253 -0
  16. package/dist/commands/error-ux.js.map +1 -0
  17. package/dist/commands/event-leak.d.ts +5 -0
  18. package/dist/commands/event-leak.d.ts.map +1 -0
  19. package/dist/commands/event-leak.js +263 -0
  20. package/dist/commands/event-leak.js.map +1 -0
  21. package/dist/commands/idempotency-audit.d.ts +5 -0
  22. package/dist/commands/idempotency-audit.d.ts.map +1 -0
  23. package/dist/commands/idempotency-audit.js +223 -0
  24. package/dist/commands/idempotency-audit.js.map +1 -0
  25. package/dist/commands/privilege-path.d.ts +5 -0
  26. package/dist/commands/privilege-path.d.ts.map +1 -0
  27. package/dist/commands/privilege-path.js +234 -0
  28. package/dist/commands/privilege-path.js.map +1 -0
  29. package/dist/commands/timeout-audit.d.ts +5 -0
  30. package/dist/commands/timeout-audit.d.ts.map +1 -0
  31. package/dist/commands/timeout-audit.js +211 -0
  32. package/dist/commands/timeout-audit.js.map +1 -0
  33. package/dist/commands/type-boundary.d.ts +5 -0
  34. package/dist/commands/type-boundary.d.ts.map +1 -0
  35. package/dist/commands/type-boundary.js +236 -0
  36. package/dist/commands/type-boundary.js.map +1 -0
  37. package/package.json +1 -1
  38. 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
+ * 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"}
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Privilege path — model authorization flows to find privilege-escalation paths.
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 route/endpoint definitions
53
+ const isRouteFile = /(?:router|app)\.\s*(?:get|post|put|delete|patch|all)\s*\(|@(?:GET|POST|PUT|DELETE|PATCH|Controller|RequestMapping)/i.test(fullText);
54
+ for (let i = 0; i < lines.length; i++) {
55
+ const line = lines[i];
56
+ // Route without auth middleware
57
+ if (/(?:router|app)\.\s*(?:get|post|put|delete|patch)\s*\(\s*['"]([^'"]+)['"]/.test(line)) {
58
+ const routeMatch = line.match(/(?:router|app)\.\s*(?:get|post|put|delete|patch)\s*\(\s*['"]([^'"]+)['"]/);
59
+ if (routeMatch) {
60
+ const route = routeMatch[1];
61
+ const block = lines.slice(i, Math.min(i + 3, lines.length)).join("\n");
62
+ // Skip public routes
63
+ if (!/(?:health|status|ping|public|login|register|signup|webhook|callback)/i.test(route)) {
64
+ if (!/auth|authenticate|authorize|requireAuth|isAuthenticated|passport|guard|protect|jwt|token|session/i.test(block)) {
65
+ issues.push({
66
+ file: filepath,
67
+ line: i + 1,
68
+ issue: "Route without authentication middleware",
69
+ severity: "high",
70
+ detail: `${route} — no auth middleware detected; endpoint may be publicly accessible`,
71
+ });
72
+ }
73
+ }
74
+ }
75
+ }
76
+ // IDOR: user ID from request used directly in query
77
+ if (/(?:req\.params|req\.query|req\.body|request\.\w+)\.\s*(?:id|userId|user_id)/i.test(line)) {
78
+ const block = lines.slice(i, Math.min(i + 8, lines.length)).join("\n");
79
+ if (/(?:findById|findOne|where|SELECT|DELETE|UPDATE)\s*\(/i.test(block)) {
80
+ if (!/req\.user|currentUser|session\.user|token\.sub|auth\.user/i.test(block)) {
81
+ issues.push({
82
+ file: filepath,
83
+ line: i + 1,
84
+ issue: "Potential IDOR — user ID from request without ownership check",
85
+ severity: "high",
86
+ detail: "User-supplied ID used in query without verifying ownership — attacker can access other users' data",
87
+ });
88
+ }
89
+ }
90
+ }
91
+ // Role check using string comparison (fragile)
92
+ if (/role\s*===?\s*['"]admin['"]|role\s*===?\s*['"]superadmin['"]/i.test(line)) {
93
+ if (!/enum|const\s+ROLES|Role\./i.test(fullText)) {
94
+ issues.push({
95
+ file: filepath,
96
+ line: i + 1,
97
+ issue: "Role check with magic string",
98
+ severity: "medium",
99
+ detail: "Role comparison uses magic string — use enum/constant to prevent typo-based bypass",
100
+ });
101
+ }
102
+ }
103
+ // Privilege escalation: self-assign role
104
+ if (/role|isAdmin|is_admin|permissions/i.test(line) && /req\.body|request\.body/i.test(line)) {
105
+ issues.push({
106
+ file: filepath,
107
+ line: i + 1,
108
+ issue: "Role/permission from user input",
109
+ severity: "high",
110
+ detail: "Role or permission value taken from request body — user can self-escalate privileges",
111
+ });
112
+ }
113
+ // Missing authorization on destructive operations
114
+ if (/\.(?:delete|destroy|remove|drop|truncate)\s*\(/i.test(line) && isRouteFile) {
115
+ const contextBlock = lines.slice(Math.max(0, i - 10), i + 1).join("\n");
116
+ if (!/authorize|permission|role|isAdmin|canDelete|allowed/i.test(contextBlock)) {
117
+ issues.push({
118
+ file: filepath,
119
+ line: i + 1,
120
+ issue: "Destructive operation without authorization check",
121
+ severity: "high",
122
+ detail: "Delete/destroy called without prior authorization — any authenticated user may execute it",
123
+ });
124
+ }
125
+ }
126
+ // JWT token without signature verification
127
+ if (/jwt\.decode\s*\(/.test(line)) {
128
+ if (!/jwt\.verify|jsonwebtoken.*verify/i.test(fullText)) {
129
+ issues.push({
130
+ file: filepath,
131
+ line: i + 1,
132
+ issue: "JWT decoded without verification",
133
+ severity: "high",
134
+ detail: "jwt.decode() does NOT verify signature — use jwt.verify() to prevent token forgery",
135
+ });
136
+ }
137
+ }
138
+ // Hardcoded secrets/tokens in auth logic
139
+ if (/(?:secret|password|token|apiKey|api_key)\s*[:=]\s*['"][^'"]{8,}['"]/i.test(line)) {
140
+ if (!/test|spec|mock|fixture|example|sample/i.test(filepath)) {
141
+ issues.push({
142
+ file: filepath,
143
+ line: i + 1,
144
+ issue: "Hardcoded credential in auth logic",
145
+ severity: "high",
146
+ detail: "Secret/token hardcoded in source — extract to environment variable or secret manager",
147
+ });
148
+ }
149
+ }
150
+ // Session fixation: session ID not regenerated after login
151
+ if (/login|authenticate|signIn/i.test(line) && /function|=>|async/.test(line)) {
152
+ const funcBlock = lines.slice(i, Math.min(i + 30, lines.length)).join("\n");
153
+ if (/session/i.test(funcBlock) && !/regenerate|destroy.*session|req\.session\s*=\s*null/i.test(funcBlock)) {
154
+ issues.push({
155
+ file: filepath,
156
+ line: i + 1,
157
+ issue: "Session not regenerated after login",
158
+ severity: "medium",
159
+ detail: "Session ID persists across auth boundary — regenerate to prevent session fixation",
160
+ });
161
+ }
162
+ }
163
+ // CORS: wildcard origin with credentials
164
+ if (/origin\s*:\s*['"]\*['"]|origin\s*:\s*true/.test(line)) {
165
+ const block = lines.slice(i, Math.min(i + 5, lines.length)).join("\n");
166
+ if (/credentials\s*:\s*true/i.test(block)) {
167
+ issues.push({
168
+ file: filepath,
169
+ line: i + 1,
170
+ issue: "CORS wildcard with credentials",
171
+ severity: "high",
172
+ detail: "Wildcard origin with credentials allows any site to make authenticated requests",
173
+ });
174
+ }
175
+ }
176
+ }
177
+ return issues;
178
+ }
179
+ // ─── CLI ────────────────────────────────────────────────────────────────────
180
+ export function runPrivilegePath(argv) {
181
+ if (argv.includes("--help") || argv.includes("-h")) {
182
+ console.log(`
183
+ judges privilege-path — Model authorization flows to find escalation paths
184
+
185
+ Usage:
186
+ judges privilege-path [dir]
187
+ judges privilege-path src/ --format json
188
+
189
+ Options:
190
+ [dir] Directory to scan (default: .)
191
+ --format json JSON output
192
+ --help, -h Show this help
193
+
194
+ Checks: routes without auth, IDOR patterns, magic-string role checks, self-assigned roles,
195
+ unprotected destructive ops, JWT decode without verify, hardcoded secrets, session fixation, CORS.
196
+ `);
197
+ return;
198
+ }
199
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
200
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
201
+ const files = collectFiles(dir);
202
+ const allIssues = [];
203
+ for (const f of files)
204
+ allIssues.push(...analyzeFile(f));
205
+ const highCount = allIssues.filter((i) => i.severity === "high").length;
206
+ const medCount = allIssues.filter((i) => i.severity === "medium").length;
207
+ const score = Math.max(0, 100 - highCount * 10 - medCount * 4);
208
+ if (format === "json") {
209
+ console.log(JSON.stringify({
210
+ issues: allIssues,
211
+ score,
212
+ summary: { high: highCount, medium: medCount, total: allIssues.length },
213
+ timestamp: new Date().toISOString(),
214
+ }, null, 2));
215
+ }
216
+ else {
217
+ const badge = score >= 80 ? "✅ SECURE" : score >= 50 ? "⚠️ GAPS" : "❌ EXPOSED";
218
+ console.log(`\n Privilege Safety: ${badge} (${score}/100)\n ─────────────────────────────`);
219
+ if (allIssues.length === 0) {
220
+ console.log(" No privilege escalation paths detected.\n");
221
+ return;
222
+ }
223
+ for (const issue of allIssues.slice(0, 25)) {
224
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
225
+ console.log(` ${icon} ${issue.issue}`);
226
+ console.log(` ${issue.file}:${issue.line}`);
227
+ console.log(` ${issue.detail}`);
228
+ }
229
+ if (allIssues.length > 25)
230
+ console.log(` ... and ${allIssues.length - 25} more`);
231
+ console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
232
+ }
233
+ }
234
+ //# sourceMappingURL=privilege-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privilege-path.js","sourceRoot":"","sources":["../../src/commands/privilege-path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Timeout audit — trace timeout and deadline settings through call chains.
3
+ */
4
+ export declare function runTimeoutAudit(argv: string[]): void;
5
+ //# sourceMappingURL=timeout-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout-audit.d.ts","sourceRoot":"","sources":["../../src/commands/timeout-audit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgLH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+DpD"}