@kevinrabun/judges 3.57.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 (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/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/clone-detect.d.ts +5 -0
  14. package/dist/commands/clone-detect.d.ts.map +1 -0
  15. package/dist/commands/clone-detect.js +233 -0
  16. package/dist/commands/clone-detect.js.map +1 -0
  17. package/dist/commands/contract-verify.d.ts +5 -0
  18. package/dist/commands/contract-verify.d.ts.map +1 -0
  19. package/dist/commands/contract-verify.js +317 -0
  20. package/dist/commands/contract-verify.js.map +1 -0
  21. package/dist/commands/dead-code-detect.d.ts +5 -0
  22. package/dist/commands/dead-code-detect.d.ts.map +1 -0
  23. package/dist/commands/dead-code-detect.js +256 -0
  24. package/dist/commands/dead-code-detect.js.map +1 -0
  25. package/dist/commands/encoding-safety.d.ts +5 -0
  26. package/dist/commands/encoding-safety.d.ts.map +1 -0
  27. package/dist/commands/encoding-safety.js +276 -0
  28. package/dist/commands/encoding-safety.js.map +1 -0
  29. package/dist/commands/input-guard.d.ts +5 -0
  30. package/dist/commands/input-guard.d.ts.map +1 -0
  31. package/dist/commands/input-guard.js +256 -0
  32. package/dist/commands/input-guard.js.map +1 -0
  33. package/dist/commands/state-integrity.d.ts +5 -0
  34. package/dist/commands/state-integrity.d.ts.map +1 -0
  35. package/dist/commands/state-integrity.js +284 -0
  36. package/dist/commands/state-integrity.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -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
+ * State integrity — validate state machine correctness, unreachable states, and missing transitions.
3
+ */
4
+ export declare function runStateIntegrity(argv: string[]): void;
5
+ //# sourceMappingURL=state-integrity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-integrity.d.ts","sourceRoot":"","sources":["../../src/commands/state-integrity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuPH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+DtD"}
@@ -0,0 +1,284 @@
1
+ /**
2
+ * State integrity — validate state machine correctness, unreachable states, and missing transitions.
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"]);
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 enum/union type definitions for states
53
+ const stateEnums = new Map();
54
+ for (let i = 0; i < lines.length; i++) {
55
+ const line = lines[i];
56
+ const enumMatch = line.match(/enum\s+(\w*(?:State|Status|Phase|Stage|Mode)\w*)\s*\{/i);
57
+ if (enumMatch) {
58
+ const enumName = enumMatch[1];
59
+ let depth = 0;
60
+ let enumEnd = i;
61
+ for (let j = i; j < Math.min(i + 30, lines.length); j++) {
62
+ for (const ch of lines[j]) {
63
+ if (ch === "{")
64
+ depth++;
65
+ if (ch === "}")
66
+ depth--;
67
+ }
68
+ if (depth <= 0 && j > i) {
69
+ enumEnd = j;
70
+ break;
71
+ }
72
+ }
73
+ const enumBody = lines.slice(i + 1, enumEnd).join("\n");
74
+ const values = [...enumBody.matchAll(/(\w+)\s*[=,]/g)].map((m) => m[1]);
75
+ if (values.length > 0)
76
+ stateEnums.set(enumName, { values, line: i + 1 });
77
+ }
78
+ // Also detect string union types for state
79
+ const unionMatch = line.match(/type\s+(\w*(?:State|Status|Phase|Stage|Mode)\w*)\s*=\s*(.+)/i);
80
+ if (unionMatch) {
81
+ const typeName = unionMatch[1];
82
+ const rest = unionMatch[2] + (lines[i + 1] || "");
83
+ const values = [...rest.matchAll(/['"](\w+)['"]/g)].map((m) => m[1]);
84
+ if (values.length > 1)
85
+ stateEnums.set(typeName, { values, line: i + 1 });
86
+ }
87
+ }
88
+ // Check if all enum values are handled in switch statements
89
+ for (const [enumName, { values }] of stateEnums) {
90
+ for (let i = 0; i < lines.length; i++) {
91
+ const line = lines[i];
92
+ if (/switch\s*\(/.test(line) &&
93
+ new RegExp(enumName, "i").test(lines.slice(Math.max(0, i - 3), i + 1).join("\n"))) {
94
+ let depth = 0;
95
+ let switchEnd = i;
96
+ let started = false;
97
+ for (let j = i; j < Math.min(i + 60, lines.length); j++) {
98
+ for (const ch of lines[j]) {
99
+ if (ch === "{") {
100
+ depth++;
101
+ started = true;
102
+ }
103
+ if (ch === "}")
104
+ depth--;
105
+ }
106
+ if (started && depth <= 0) {
107
+ switchEnd = j;
108
+ break;
109
+ }
110
+ }
111
+ const switchBody = lines.slice(i, switchEnd + 1).join("\n");
112
+ const unhandled = values.filter((v) => !switchBody.includes(v));
113
+ if (unhandled.length > 0 && !/default\s*:/.test(switchBody)) {
114
+ issues.push({
115
+ file: filepath,
116
+ line: i + 1,
117
+ issue: "Incomplete state handling",
118
+ severity: "high",
119
+ detail: `Switch on ${enumName} missing: ${unhandled.join(", ")} — and no default case`,
120
+ });
121
+ }
122
+ }
123
+ }
124
+ }
125
+ for (let i = 0; i < lines.length; i++) {
126
+ const line = lines[i];
127
+ // Impossible state combinations (boolean flags)
128
+ if (/(?:loading|isLoading)\s*[:=]\s*true/.test(line)) {
129
+ const block = lines.slice(i, Math.min(i + 5, lines.length)).join("\n");
130
+ if (/(?:error|isError|hasError)\s*[:=]\s*true/.test(block)) {
131
+ issues.push({
132
+ file: filepath,
133
+ line: i + 1,
134
+ issue: "Impossible state: loading + error simultaneously",
135
+ severity: "medium",
136
+ detail: "Setting loading and error to true at the same time — use state machine to prevent impossible combinations",
137
+ });
138
+ }
139
+ }
140
+ // Direct state mutation without transition validation
141
+ if (/\.(?:state|status|phase)\s*=\s*['"](\w+)['"]/.test(line)) {
142
+ const newState = line.match(/\.(?:state|status|phase)\s*=\s*['"](\w+)['"]/)?.[1];
143
+ const block = lines.slice(Math.max(0, i - 5), i + 1).join("\n");
144
+ if (!/if\s*\(|switch\s*\(|transition|canTransition|validate|guard|allowed/i.test(block)) {
145
+ issues.push({
146
+ file: filepath,
147
+ line: i + 1,
148
+ issue: "State mutation without transition guard",
149
+ severity: "medium",
150
+ detail: `Setting state to '${newState}' without validating transition — any state can be set from any other`,
151
+ });
152
+ }
153
+ }
154
+ // useState with multiple related booleans (React)
155
+ if (/useState\s*<?\s*boolean\s*>?\s*\(\s*(?:true|false)\s*\)/.test(line)) {
156
+ const block = lines.slice(i, Math.min(i + 8, lines.length)).join("\n");
157
+ const boolStateCount = (block.match(/useState\s*<?\s*boolean/g) || []).length;
158
+ if (boolStateCount >= 3) {
159
+ issues.push({
160
+ file: filepath,
161
+ line: i + 1,
162
+ issue: "Too many boolean state variables",
163
+ severity: "medium",
164
+ detail: `${boolStateCount} boolean useState calls in proximity — use discriminated union or state machine to prevent impossible states`,
165
+ });
166
+ }
167
+ }
168
+ // Redux/Vuex: reducer with incomplete action handling
169
+ if (/(?:createSlice|createReducer|reducer)\s*[(:]/.test(line)) {
170
+ const block = lines.slice(i, Math.min(i + 40, lines.length)).join("\n");
171
+ if (!/default\s*:|exhaustive|never/i.test(block)) {
172
+ const caseCount = (block.match(/case\s+['"]?\w+['"]?\s*:|(\w+)\s*(?::\s*\(|:\s*\{)/g) || []).length;
173
+ if (caseCount > 0 && caseCount < 3) {
174
+ issues.push({
175
+ file: filepath,
176
+ line: i + 1,
177
+ issue: "Reducer with few cases and no default",
178
+ severity: "low",
179
+ detail: "Reducer handles few actions — ensure all action types are covered",
180
+ });
181
+ }
182
+ }
183
+ }
184
+ // State variable set to invalid value (magic string)
185
+ if (/(?:state|status|phase|stage|mode)\s*[:=]\s*['"](\w+)['"]/.test(line)) {
186
+ const value = line.match(/(?:state|status|phase|stage|mode)\s*[:=]\s*['"](\w+)['"]/)?.[1];
187
+ if (value) {
188
+ // Check if this value is defined in any state enum or type
189
+ let isDefined = false;
190
+ for (const [_name, { values }] of stateEnums) {
191
+ if (values.includes(value)) {
192
+ isDefined = true;
193
+ break;
194
+ }
195
+ }
196
+ // Check if value is used as a type somewhere
197
+ if (!isDefined && fullText.includes(`'${value}'`) && !/test|spec|fixture/i.test(filepath)) {
198
+ const occurrences = (fullText.match(new RegExp(`['"]${value}['"]`, "g")) || []).length;
199
+ if (occurrences === 1) {
200
+ issues.push({
201
+ file: filepath,
202
+ line: i + 1,
203
+ issue: "State value used only once",
204
+ severity: "low",
205
+ detail: `State '${value}' appears only once — may be an orphaned or transitional state`,
206
+ });
207
+ }
208
+ }
209
+ }
210
+ }
211
+ // Missing error state in async flow
212
+ if (/async\s+(?:function|=>)/.test(line) && /state|status|phase/i.test(fullText)) {
213
+ const block = lines.slice(i, Math.min(i + 30, lines.length)).join("\n");
214
+ if (/loading|pending|fetching/i.test(block)) {
215
+ if (!/error|failed|rejected|catch/i.test(block)) {
216
+ issues.push({
217
+ file: filepath,
218
+ line: i + 1,
219
+ issue: "Async flow missing error state",
220
+ severity: "medium",
221
+ detail: "Async operation sets loading state but has no error state — failures leave UI in loading",
222
+ });
223
+ }
224
+ }
225
+ }
226
+ }
227
+ return issues;
228
+ }
229
+ // ─── CLI ────────────────────────────────────────────────────────────────────
230
+ export function runStateIntegrity(argv) {
231
+ if (argv.includes("--help") || argv.includes("-h")) {
232
+ console.log(`
233
+ judges state-integrity — Validate state machine correctness and impossible states
234
+
235
+ Usage:
236
+ judges state-integrity [dir]
237
+ judges state-integrity src/ --format json
238
+
239
+ Options:
240
+ [dir] Directory to scan (default: .)
241
+ --format json JSON output
242
+ --help, -h Show this help
243
+
244
+ Checks: incomplete enum handling, impossible boolean combinations, state mutation without guards,
245
+ excessive boolean state, missing error states in async flows, orphaned state values.
246
+ `);
247
+ return;
248
+ }
249
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
250
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
251
+ const files = collectFiles(dir);
252
+ const allIssues = [];
253
+ for (const f of files)
254
+ allIssues.push(...analyzeFile(f));
255
+ const highCount = allIssues.filter((i) => i.severity === "high").length;
256
+ const medCount = allIssues.filter((i) => i.severity === "medium").length;
257
+ const score = Math.max(0, 100 - highCount * 10 - medCount * 4);
258
+ if (format === "json") {
259
+ console.log(JSON.stringify({
260
+ issues: allIssues,
261
+ score,
262
+ summary: { high: highCount, medium: medCount, total: allIssues.length },
263
+ timestamp: new Date().toISOString(),
264
+ }, null, 2));
265
+ }
266
+ else {
267
+ const badge = score >= 80 ? "✅ SOUND" : score >= 50 ? "⚠️ FRAGILE" : "❌ BROKEN";
268
+ console.log(`\n State Integrity: ${badge} (${score}/100)\n ─────────────────────────────`);
269
+ if (allIssues.length === 0) {
270
+ console.log(" No state integrity issues detected.\n");
271
+ return;
272
+ }
273
+ for (const issue of allIssues.slice(0, 25)) {
274
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
275
+ console.log(` ${icon} ${issue.issue}`);
276
+ console.log(` ${issue.file}:${issue.line}`);
277
+ console.log(` ${issue.detail}`);
278
+ }
279
+ if (allIssues.length > 25)
280
+ console.log(` ... and ${allIssues.length - 25} more`);
281
+ console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
282
+ }
283
+ }
284
+ //# sourceMappingURL=state-integrity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-integrity.js","sourceRoot":"","sources":["../../src/commands/state-integrity.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,CAAC,CAAC,CAAC;AAE1D,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,GAAiB,EAAE,CAAC;IAChC,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,gDAAgD;IAChD,MAAM,UAAU,GAAG,IAAI,GAAG,EAA8C,CAAC;IACzE,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;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACvF,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxD,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1B,IAAI,EAAE,KAAK,GAAG;wBAAE,KAAK,EAAE,CAAC;oBACxB,IAAI,EAAE,KAAK,GAAG;wBAAE,KAAK,EAAE,CAAC;gBAC1B,CAAC;gBACD,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxB,OAAO,GAAG,CAAC,CAAC;oBACZ,MAAM;gBACR,CAAC;YACH,CAAC;YACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,2CAA2C;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC9F,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,KAAK,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;QAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IACE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;gBACxB,IAAI,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EACjF,CAAC;gBACD,IAAI,KAAK,GAAG,CAAC,CAAC;gBACd,IAAI,SAAS,GAAG,CAAC,CAAC;gBAClB,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACxD,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC1B,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;4BACf,KAAK,EAAE,CAAC;4BACR,OAAO,GAAG,IAAI,CAAC;wBACjB,CAAC;wBACD,IAAI,EAAE,KAAK,GAAG;4BAAE,KAAK,EAAE,CAAC;oBAC1B,CAAC;oBACD,IAAI,OAAO,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;wBAC1B,SAAS,GAAG,CAAC,CAAC;wBACd,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5D,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,GAAG,CAAC;wBACX,KAAK,EAAE,2BAA2B;wBAClC,QAAQ,EAAE,MAAM;wBAChB,MAAM,EAAE,aAAa,QAAQ,aAAa,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB;qBACvF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,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,gDAAgD;QAChD,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,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvE,IAAI,0CAA0C,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3D,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,KAAK,EAAE,kDAAkD;oBACzD,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EACJ,2GAA2G;iBAC9G,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,IAAI,8CAA8C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACjF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChE,IAAI,CAAC,sEAAsE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxF,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,KAAK,EAAE,yCAAyC;oBAChD,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,qBAAqB,QAAQ,uEAAuE;iBAC7G,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,kDAAkD;QAClD,IAAI,yDAAyD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzE,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,MAAM,cAAc,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAC9E,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;gBACxB,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,GAAG,cAAc,8GAA8G;iBACxI,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,IAAI,8CAA8C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9D,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,+BAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qDAAqD,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBACpG,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;oBACnC,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,GAAG,CAAC;wBACX,KAAK,EAAE,uCAAuC;wBAC9C,QAAQ,EAAE,KAAK;wBACf,MAAM,EAAE,mEAAmE;qBAC5E,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,IAAI,0DAA0D,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,0DAA0D,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1F,IAAI,KAAK,EAAE,CAAC;gBACV,2DAA2D;gBAC3D,IAAI,SAAS,GAAG,KAAK,CAAC;gBACtB,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;oBAC7C,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC3B,SAAS,GAAG,IAAI,CAAC;wBACjB,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,6CAA6C;gBAC7C,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1F,MAAM,WAAW,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;oBACvF,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;wBACtB,MAAM,CAAC,IAAI,CAAC;4BACV,IAAI,EAAE,QAAQ;4BACd,IAAI,EAAE,CAAC,GAAG,CAAC;4BACX,KAAK,EAAE,4BAA4B;4BACnC,QAAQ,EAAE,KAAK;4BACf,MAAM,EAAE,UAAU,KAAK,gEAAgE;yBACxF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjF,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,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBAChD,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,GAAG,CAAC;wBACX,KAAK,EAAE,gCAAgC;wBACvC,QAAQ,EAAE,QAAQ;wBAClB,MAAM,EAAE,0FAA0F;qBACnG,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,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,GAAiB,EAAE,CAAC;IACnC,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,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,KAAK,KAAK,wCAAwC,CAAC,CAAC;QAE7F,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;YACzD,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevinrabun/judges",
3
- "version": "3.57.0",
3
+ "version": "3.58.0",
4
4
  "description": "45 specialized judges that evaluate AI-generated code for security, cost, and quality.",
5
5
  "mcpName": "io.github.KevinRabun/judges",
6
6
  "type": "module",
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/kevinrabun/judges",
8
8
  "source": "github"
9
9
  },
10
- "version": "3.57.0",
10
+ "version": "3.58.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.57.0",
15
+ "version": "3.58.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }