@kevinrabun/judges 3.57.0 → 3.59.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-misuse.d.ts +5 -0
  6. package/dist/commands/api-misuse.d.ts.map +1 -0
  7. package/dist/commands/api-misuse.js +261 -0
  8. package/dist/commands/api-misuse.js.map +1 -0
  9. package/dist/commands/assertion-density.d.ts +5 -0
  10. package/dist/commands/assertion-density.d.ts.map +1 -0
  11. package/dist/commands/assertion-density.js +264 -0
  12. package/dist/commands/assertion-density.js.map +1 -0
  13. package/dist/commands/async-safety.d.ts +5 -0
  14. package/dist/commands/async-safety.d.ts.map +1 -0
  15. package/dist/commands/async-safety.js +267 -0
  16. package/dist/commands/async-safety.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/completion-audit.d.ts +5 -0
  22. package/dist/commands/completion-audit.d.ts.map +1 -0
  23. package/dist/commands/completion-audit.js +297 -0
  24. package/dist/commands/completion-audit.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/cross-file-consistency.d.ts +5 -0
  30. package/dist/commands/cross-file-consistency.d.ts.map +1 -0
  31. package/dist/commands/cross-file-consistency.js +255 -0
  32. package/dist/commands/cross-file-consistency.js.map +1 -0
  33. package/dist/commands/dead-code-detect.d.ts +5 -0
  34. package/dist/commands/dead-code-detect.d.ts.map +1 -0
  35. package/dist/commands/dead-code-detect.js +256 -0
  36. package/dist/commands/dead-code-detect.js.map +1 -0
  37. package/dist/commands/encoding-safety.d.ts +5 -0
  38. package/dist/commands/encoding-safety.d.ts.map +1 -0
  39. package/dist/commands/encoding-safety.js +276 -0
  40. package/dist/commands/encoding-safety.js.map +1 -0
  41. package/dist/commands/example-leak.d.ts +5 -0
  42. package/dist/commands/example-leak.d.ts.map +1 -0
  43. package/dist/commands/example-leak.js +233 -0
  44. package/dist/commands/example-leak.js.map +1 -0
  45. package/dist/commands/input-guard.d.ts +5 -0
  46. package/dist/commands/input-guard.d.ts.map +1 -0
  47. package/dist/commands/input-guard.js +256 -0
  48. package/dist/commands/input-guard.js.map +1 -0
  49. package/dist/commands/logic-lint.d.ts +5 -0
  50. package/dist/commands/logic-lint.d.ts.map +1 -0
  51. package/dist/commands/logic-lint.js +256 -0
  52. package/dist/commands/logic-lint.js.map +1 -0
  53. package/dist/commands/phantom-import.d.ts +5 -0
  54. package/dist/commands/phantom-import.d.ts.map +1 -0
  55. package/dist/commands/phantom-import.js +261 -0
  56. package/dist/commands/phantom-import.js.map +1 -0
  57. package/dist/commands/review-focus.d.ts +5 -0
  58. package/dist/commands/review-focus.d.ts.map +1 -0
  59. package/dist/commands/review-focus.js +197 -0
  60. package/dist/commands/review-focus.js.map +1 -0
  61. package/dist/commands/spec-conform.d.ts +5 -0
  62. package/dist/commands/spec-conform.d.ts.map +1 -0
  63. package/dist/commands/spec-conform.js +305 -0
  64. package/dist/commands/spec-conform.js.map +1 -0
  65. package/dist/commands/state-integrity.d.ts +5 -0
  66. package/dist/commands/state-integrity.d.ts.map +1 -0
  67. package/dist/commands/state-integrity.js +284 -0
  68. package/dist/commands/state-integrity.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Encoding safety — detect encoding mismatches, unsafe deserialization, and injection risks.
3
+ */
4
+ import { readFileSync, readdirSync, statSync } from "fs";
5
+ import { join, extname } from "path";
6
+ // ─── File Collection ────────────────────────────────────────────────────────
7
+ const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".py", ".java", ".go", ".rs"]);
8
+ function collectFiles(dir, max = 300) {
9
+ const files = [];
10
+ function walk(d) {
11
+ if (files.length >= max)
12
+ return;
13
+ let entries;
14
+ try {
15
+ entries = readdirSync(d);
16
+ }
17
+ catch {
18
+ return;
19
+ }
20
+ for (const e of entries) {
21
+ if (files.length >= max)
22
+ return;
23
+ if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build")
24
+ continue;
25
+ const full = join(d, e);
26
+ try {
27
+ if (statSync(full).isDirectory())
28
+ walk(full);
29
+ else if (CODE_EXTS.has(extname(full)))
30
+ files.push(full);
31
+ }
32
+ catch {
33
+ /* skip */
34
+ }
35
+ }
36
+ }
37
+ walk(dir);
38
+ return files;
39
+ }
40
+ // ─── Analysis ───────────────────────────────────────────────────────────────
41
+ function analyzeFile(filepath) {
42
+ const issues = [];
43
+ let content;
44
+ try {
45
+ content = readFileSync(filepath, "utf-8");
46
+ }
47
+ catch {
48
+ return issues;
49
+ }
50
+ const lines = content.split("\n");
51
+ for (let i = 0; i < lines.length; i++) {
52
+ const line = lines[i];
53
+ // eval() on dynamic input
54
+ if (/\beval\s*\(/.test(line)) {
55
+ if (!/eslint-disable|\/\/\s*safe|test|spec|fixture/i.test(line) && !/test|spec|fixture/i.test(filepath)) {
56
+ issues.push({
57
+ file: filepath,
58
+ line: i + 1,
59
+ issue: "eval() usage",
60
+ severity: "high",
61
+ detail: "eval() executes arbitrary code — use JSON.parse, Function(), or AST-based alternatives",
62
+ });
63
+ }
64
+ }
65
+ // Python pickle.loads / marshal.loads
66
+ if (/pickle\.loads?\s*\(|marshal\.loads?\s*\(|yaml\.load\s*\(/i.test(line)) {
67
+ const block = lines.slice(i, Math.min(i + 3, lines.length)).join("\n");
68
+ if (!/safe_load|SafeLoader/i.test(block)) {
69
+ issues.push({
70
+ file: filepath,
71
+ line: i + 1,
72
+ issue: "Unsafe deserialization",
73
+ severity: "high",
74
+ detail: "pickle/marshal/yaml.load can execute arbitrary code — use safe alternatives",
75
+ });
76
+ }
77
+ }
78
+ // Template literal interpolation into structured formats
79
+ if (/`[^`]*\$\{/.test(line)) {
80
+ if (/SELECT|INSERT|UPDATE|DELETE|FROM|WHERE/i.test(line)) {
81
+ issues.push({
82
+ file: filepath,
83
+ line: i + 1,
84
+ issue: "SQL interpolation via template literal",
85
+ severity: "high",
86
+ detail: "Variable interpolated into SQL string — use parameterized queries",
87
+ });
88
+ }
89
+ if (/<\w+[^>]*>/.test(line) && /\$\{/.test(line)) {
90
+ if (!/sanitize|escape|encode|DOMPurify|xss/i.test(line)) {
91
+ issues.push({
92
+ file: filepath,
93
+ line: i + 1,
94
+ issue: "HTML interpolation without escaping",
95
+ severity: "high",
96
+ detail: "Variable interpolated into HTML — sanitize to prevent XSS",
97
+ });
98
+ }
99
+ }
100
+ }
101
+ // String concatenation into XML/JSON
102
+ if (/['"]<\?xml|['"]<\w+/.test(line) && /\+\s*\w+/.test(line)) {
103
+ issues.push({
104
+ file: filepath,
105
+ line: i + 1,
106
+ issue: "String concatenation into XML",
107
+ severity: "medium",
108
+ detail: "Building XML via string concatenation — use a builder/serializer to prevent injection",
109
+ });
110
+ }
111
+ // Base64 decode without validation
112
+ if (/atob\s*\(|Buffer\.from\s*\([^,]+,\s*['"]base64['"]|base64\.b64decode/i.test(line)) {
113
+ const block = lines.slice(i, Math.min(i + 5, lines.length)).join("\n");
114
+ if (!/try|catch|validate|verify|check|schema/i.test(block)) {
115
+ issues.push({
116
+ file: filepath,
117
+ line: i + 1,
118
+ issue: "Base64 decode without validation",
119
+ severity: "medium",
120
+ detail: "Decoding Base64 without try/catch — malformed input causes runtime errors",
121
+ });
122
+ }
123
+ }
124
+ // Mixed encoding (readFile without specifying encoding)
125
+ if (/readFile(?:Sync)?\s*\(\s*\w+\s*\)/.test(line)) {
126
+ if (!/utf-8|utf8|encoding|binary|buffer/i.test(line)) {
127
+ issues.push({
128
+ file: filepath,
129
+ line: i + 1,
130
+ issue: "File read without encoding specification",
131
+ severity: "low",
132
+ detail: "readFile without encoding returns Buffer — specify 'utf-8' for text processing",
133
+ });
134
+ }
135
+ }
136
+ // URL encoding/decoding asymmetry
137
+ if (/encodeURI\s*\(/.test(line) && !line.includes("encodeURIComponent")) {
138
+ issues.push({
139
+ file: filepath,
140
+ line: i + 1,
141
+ issue: "encodeURI vs encodeURIComponent",
142
+ severity: "medium",
143
+ detail: "encodeURI doesn't encode /:@!$&'()*+,;= — use encodeURIComponent for query values",
144
+ });
145
+ }
146
+ // JSON.stringify in URL without encoding
147
+ if (/JSON\.stringify/.test(line) && /url|href|src|query|param/i.test(line)) {
148
+ if (!/encodeURI|encodeURIComponent|URLSearchParams/i.test(line)) {
149
+ issues.push({
150
+ file: filepath,
151
+ line: i + 1,
152
+ issue: "JSON in URL without encoding",
153
+ severity: "medium",
154
+ detail: "JSON placed in URL without encoding — special characters will break the URL",
155
+ });
156
+ }
157
+ }
158
+ // innerHTML / dangerouslySetInnerHTML
159
+ if (/\.innerHTML\s*=|dangerouslySetInnerHTML/i.test(line)) {
160
+ const block = lines.slice(Math.max(0, i - 2), Math.min(i + 2, lines.length)).join("\n");
161
+ if (!/sanitize|DOMPurify|escape|encode|trusted|xss/i.test(block)) {
162
+ issues.push({
163
+ file: filepath,
164
+ line: i + 1,
165
+ issue: "innerHTML without sanitization",
166
+ severity: "high",
167
+ detail: "Setting innerHTML without sanitization — XSS vulnerability",
168
+ });
169
+ }
170
+ }
171
+ // document.write
172
+ if (/document\.write\s*\(/.test(line)) {
173
+ issues.push({
174
+ file: filepath,
175
+ line: i + 1,
176
+ issue: "document.write usage",
177
+ severity: "medium",
178
+ detail: "document.write can be exploited for DOM-based XSS — use DOM APIs instead",
179
+ });
180
+ }
181
+ // RegExp constructor with unsanitized input
182
+ if (/new\s+RegExp\s*\(\s*\w+/.test(line)) {
183
+ if (!/escape|sanitize|quote|literal/i.test(line)) {
184
+ issues.push({
185
+ file: filepath,
186
+ line: i + 1,
187
+ issue: "RegExp from variable without escaping",
188
+ severity: "medium",
189
+ detail: "Dynamic RegExp without escaping special characters — ReDoS or unexpected matching risk",
190
+ });
191
+ }
192
+ }
193
+ // Deserialization: BinaryFormatter, ObjectInputStream
194
+ if (/BinaryFormatter|ObjectInputStream|Serializable.*readObject|unserialize\s*\(/i.test(line)) {
195
+ issues.push({
196
+ file: filepath,
197
+ line: i + 1,
198
+ issue: "Unsafe binary deserialization",
199
+ severity: "high",
200
+ detail: "Binary deserialization of untrusted data can execute arbitrary code",
201
+ });
202
+ }
203
+ // Content-Type mismatch
204
+ if (/setHeader\s*\(\s*['"]Content-Type['"]\s*,/.test(line)) {
205
+ if (/text\/plain/i.test(line)) {
206
+ const block = lines.slice(i, Math.min(i + 5, lines.length)).join("\n");
207
+ if (/JSON\.stringify|\.json\s*\(/.test(block)) {
208
+ issues.push({
209
+ file: filepath,
210
+ line: i + 1,
211
+ issue: "Content-Type mismatch",
212
+ severity: "medium",
213
+ detail: "Content-Type set to text/plain but sending JSON — clients may misinterpret the response",
214
+ });
215
+ }
216
+ }
217
+ }
218
+ }
219
+ return issues;
220
+ }
221
+ // ─── CLI ────────────────────────────────────────────────────────────────────
222
+ export function runEncodingSafety(argv) {
223
+ if (argv.includes("--help") || argv.includes("-h")) {
224
+ console.log(`
225
+ judges encoding-safety — Detect encoding mismatches, injection, and unsafe deserialization
226
+
227
+ Usage:
228
+ judges encoding-safety [dir]
229
+ judges encoding-safety src/ --format json
230
+
231
+ Options:
232
+ [dir] Directory to scan (default: .)
233
+ --format json JSON output
234
+ --help, -h Show this help
235
+
236
+ Checks: eval(), unsafe deserialization (pickle, marshal, yaml.load), SQL/HTML/XML interpolation,
237
+ Base64 validation, encoding asymmetry, innerHTML XSS, RegExp injection, Content-Type mismatch.
238
+ `);
239
+ return;
240
+ }
241
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
242
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
243
+ const files = collectFiles(dir);
244
+ const allIssues = [];
245
+ for (const f of files)
246
+ allIssues.push(...analyzeFile(f));
247
+ const highCount = allIssues.filter((i) => i.severity === "high").length;
248
+ const medCount = allIssues.filter((i) => i.severity === "medium").length;
249
+ const score = Math.max(0, 100 - highCount * 10 - medCount * 4);
250
+ if (format === "json") {
251
+ console.log(JSON.stringify({
252
+ issues: allIssues,
253
+ score,
254
+ summary: { high: highCount, medium: medCount, total: allIssues.length },
255
+ timestamp: new Date().toISOString(),
256
+ }, null, 2));
257
+ }
258
+ else {
259
+ const badge = score >= 80 ? "✅ SAFE" : score >= 50 ? "⚠️ RISKY" : "❌ DANGEROUS";
260
+ console.log(`\n Encoding Safety: ${badge} (${score}/100)\n ─────────────────────────────`);
261
+ if (allIssues.length === 0) {
262
+ console.log(" No encoding safety issues detected.\n");
263
+ return;
264
+ }
265
+ for (const issue of allIssues.slice(0, 25)) {
266
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
267
+ console.log(` ${icon} ${issue.issue}`);
268
+ console.log(` ${issue.file}:${issue.line}`);
269
+ console.log(` ${issue.detail}`);
270
+ }
271
+ if (allIssues.length > 25)
272
+ console.log(` ... and ${allIssues.length - 25} more`);
273
+ console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
274
+ }
275
+ }
276
+ //# sourceMappingURL=encoding-safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding-safety.js","sourceRoot":"","sources":["../../src/commands/encoding-safety.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Example leak — detect AI-copied example/placeholder code left in production.
3
+ */
4
+ export declare function runExampleLeak(argv: string[]): void;
5
+ //# sourceMappingURL=example-leak.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example-leak.d.ts","sourceRoot":"","sources":["../../src/commands/example-leak.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6MH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4DnD"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * Example leak — detect AI-copied example/placeholder code left in production.
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", ".cs", ".rb"]);
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
+ const PLACEHOLDER_URLS = [
42
+ /https?:\/\/(?:example\.com|localhost:\d+|127\.0\.0\.1:\d+|httpbin\.org|jsonplaceholder\.typicode\.com|reqres\.in|api\.example)/i,
43
+ ];
44
+ const PLACEHOLDER_SECRETS = [
45
+ /['"](?:sk-[a-zA-Z0-9]{20,}|your[-_]?api[-_]?key|REPLACE[-_]?ME|changeme|password123|secret123|test[-_]?secret|my[-_]?secret|dummy[-_]?key|placeholder)['"]/,
46
+ ];
47
+ const EXAMPLE_NAMES = [
48
+ /(?:class|function|const|let|var)\s+(?:MyApp|MyComponent|Example\w*|Demo\w*|HelloWorld|SampleApp|TestApp|FooBar|Foo|Bar|Baz|Qux)\b/,
49
+ ];
50
+ const EXAMPLE_DATA = [
51
+ /['"](?:John Doe|Jane Doe|john@example\.com|jane@example\.com|foo@bar\.com|test@test\.com|user@example\.com|123 Main St|Acme Corp|Lorem ipsum|Alice|Bob)['"]/i,
52
+ ];
53
+ const TUTORIAL_MARKERS = [
54
+ /\/\/\s*(?:Step \d|TODO:?\s*replace|FIXME:?\s*placeholder|HACK:?\s*example|NOTE:?\s*this is (?:a |an )?(?:example|demo|sample|placeholder))/i,
55
+ /#\s*(?:Step \d|TODO:?\s*replace|FIXME:?\s*placeholder)/i,
56
+ ];
57
+ const HARDCODED_PORTS = [/(?:PORT|port)\s*[:=]\s*(?:3000|8080|8000|5000|4200|9090)\b/];
58
+ function analyzeFile(filepath) {
59
+ const issues = [];
60
+ let content;
61
+ try {
62
+ content = readFileSync(filepath, "utf-8");
63
+ }
64
+ catch {
65
+ return issues;
66
+ }
67
+ // Skip test/fixture/example files
68
+ if (/(?:test|spec|fixture|example|demo|sample|mock|stub|__test__|__spec__)/i.test(filepath))
69
+ return issues;
70
+ const lines = content.split("\n");
71
+ for (let i = 0; i < lines.length; i++) {
72
+ const line = lines[i];
73
+ // Placeholder URLs
74
+ for (const pattern of PLACEHOLDER_URLS) {
75
+ if (pattern.test(line)) {
76
+ const url = line.match(pattern)?.[0];
77
+ issues.push({
78
+ file: filepath,
79
+ line: i + 1,
80
+ issue: "Placeholder URL in non-test code",
81
+ severity: "high",
82
+ detail: `\`${url}\` is an example/localhost URL — replace with actual endpoint`,
83
+ });
84
+ break;
85
+ }
86
+ }
87
+ // Placeholder secrets
88
+ for (const pattern of PLACEHOLDER_SECRETS) {
89
+ if (pattern.test(line)) {
90
+ issues.push({
91
+ file: filepath,
92
+ line: i + 1,
93
+ issue: "Placeholder secret/key value",
94
+ severity: "high",
95
+ detail: "Example API key or placeholder secret found — replace with env variable or secret manager",
96
+ });
97
+ break;
98
+ }
99
+ }
100
+ // Example class/function names
101
+ for (const pattern of EXAMPLE_NAMES) {
102
+ if (pattern.test(line)) {
103
+ const name = line.match(/(?:class|function|const|let|var)\s+((?:Example|Demo|HelloWorld|Sample|Test|FooBar|Foo|Bar|Baz|Qux)\w*)/)?.[1];
104
+ if (name) {
105
+ issues.push({
106
+ file: filepath,
107
+ line: i + 1,
108
+ issue: "Example/placeholder name in production",
109
+ severity: "medium",
110
+ detail: `\`${name}\` looks like tutorial code — rename to something domain-specific`,
111
+ });
112
+ }
113
+ break;
114
+ }
115
+ }
116
+ // Example data
117
+ for (const pattern of EXAMPLE_DATA) {
118
+ if (pattern.test(line)) {
119
+ issues.push({
120
+ file: filepath,
121
+ line: i + 1,
122
+ issue: "Example data in non-test code",
123
+ severity: "medium",
124
+ detail: "Placeholder data (John Doe, example.com, etc.) left in production code",
125
+ });
126
+ break;
127
+ }
128
+ }
129
+ // Tutorial markers
130
+ for (const pattern of TUTORIAL_MARKERS) {
131
+ if (pattern.test(line)) {
132
+ issues.push({
133
+ file: filepath,
134
+ line: i + 1,
135
+ issue: "Tutorial comment marker",
136
+ severity: "low",
137
+ detail: "Comment from tutorial/example code — indicates AI-copied scaffold",
138
+ });
139
+ break;
140
+ }
141
+ }
142
+ // Hardcoded ports
143
+ for (const pattern of HARDCODED_PORTS) {
144
+ if (pattern.test(line) && !/process\.env|ENV|config/i.test(line)) {
145
+ issues.push({
146
+ file: filepath,
147
+ line: i + 1,
148
+ issue: "Hardcoded default port",
149
+ severity: "low",
150
+ detail: "Port hardcoded to common default — should come from config or env",
151
+ });
152
+ break;
153
+ }
154
+ }
155
+ // console.log with example text
156
+ if (/console\.log\s*\(\s*['"](?:Hello|Hi|Welcome|It works|Success|TODO|Test)\b/.test(line)) {
157
+ issues.push({
158
+ file: filepath,
159
+ line: i + 1,
160
+ issue: "Example console.log",
161
+ severity: "low",
162
+ detail: "Generic log message from tutorial — remove or replace with structured logging",
163
+ });
164
+ }
165
+ // Empty function bodies that look like stubs
166
+ if (/(?:function|=>)\s*\{[\s]*\}/.test(line) && !/test|spec|mock|stub|noop|placeholder/i.test(line)) {
167
+ issues.push({
168
+ file: filepath,
169
+ line: i + 1,
170
+ issue: "Empty function stub",
171
+ severity: "medium",
172
+ detail: "Function with empty body — may be unfinished AI-generated scaffold",
173
+ });
174
+ }
175
+ }
176
+ return issues;
177
+ }
178
+ // ─── CLI ────────────────────────────────────────────────────────────────────
179
+ export function runExampleLeak(argv) {
180
+ if (argv.includes("--help") || argv.includes("-h")) {
181
+ console.log(`
182
+ judges example-leak — Detect AI-copied example/placeholder code left in production
183
+
184
+ Usage:
185
+ judges example-leak [dir]
186
+ judges example-leak src/ --format json
187
+
188
+ Options:
189
+ [dir] Directory to scan (default: .)
190
+ --format json JSON output
191
+ --help, -h Show this help
192
+
193
+ Checks: placeholder URLs, example API keys, tutorial names, example data (John Doe, Lorem ipsum),
194
+ tutorial comments, hardcoded ports, example console.log messages, empty function stubs.
195
+ `);
196
+ return;
197
+ }
198
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
199
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
200
+ const files = collectFiles(dir);
201
+ const allIssues = [];
202
+ for (const f of files)
203
+ allIssues.push(...analyzeFile(f));
204
+ const highCount = allIssues.filter((i) => i.severity === "high").length;
205
+ const medCount = allIssues.filter((i) => i.severity === "medium").length;
206
+ const score = Math.max(0, 100 - highCount * 12 - medCount * 4);
207
+ if (format === "json") {
208
+ console.log(JSON.stringify({
209
+ issues: allIssues,
210
+ score,
211
+ summary: { high: highCount, medium: medCount, total: allIssues.length },
212
+ timestamp: new Date().toISOString(),
213
+ }, null, 2));
214
+ }
215
+ else {
216
+ const badge = score >= 80 ? "✅ CLEAN" : score >= 50 ? "⚠️ LEAKING" : "❌ EXAMPLE CODE";
217
+ console.log(`\n Example Leak: ${badge} (${score}/100)\n ─────────────────────────────`);
218
+ if (allIssues.length === 0) {
219
+ console.log(" No example/placeholder code detected.\n");
220
+ return;
221
+ }
222
+ for (const issue of allIssues.slice(0, 25)) {
223
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
224
+ console.log(` ${icon} ${issue.issue}`);
225
+ console.log(` ${issue.file}:${issue.line}`);
226
+ console.log(` ${issue.detail}`);
227
+ }
228
+ if (allIssues.length > 25)
229
+ console.log(` ... and ${allIssues.length - 25} more`);
230
+ console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
231
+ }
232
+ }
233
+ //# sourceMappingURL=example-leak.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example-leak.js","sourceRoot":"","sources":["../../src/commands/example-leak.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"}