@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,233 @@
1
+ /**
2
+ * Clone detect — find duplicated logic blocks that should be extracted into shared functions.
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
+ // ─── Normalization ──────────────────────────────────────────────────────────
41
+ function normalize(line) {
42
+ return line
43
+ .trim()
44
+ .replace(/\/\/.*/, "") // strip comments
45
+ .replace(/\/\*.*?\*\//g, "") // strip inline comments
46
+ .replace(/['"][^'"]*['"]/g, "S") // normalize strings
47
+ .replace(/\b\d+\b/g, "N") // normalize numbers
48
+ .replace(/\b[a-z]\w{0,2}\b/gi, "V") // normalize short variable names
49
+ .replace(/\s+/g, " ") // collapse whitespace
50
+ .trim();
51
+ }
52
+ function extractBlocks(filepath, content, blockSize) {
53
+ const lines = content.split("\n");
54
+ const blocks = [];
55
+ for (let i = 0; i <= lines.length - blockSize; i++) {
56
+ const raw = lines.slice(i, i + blockSize);
57
+ const normalized = raw
58
+ .map(normalize)
59
+ .filter((l) => l.length > 3)
60
+ .join("|");
61
+ if (normalized.length > 20) {
62
+ blocks.push({ file: filepath, startLine: i + 1, normalized, raw: raw.join("\n") });
63
+ }
64
+ }
65
+ return blocks;
66
+ }
67
+ function detectClones(files, blockSize = 5, minSimilarity = 0.85) {
68
+ const issues = [];
69
+ const allBlocks = [];
70
+ for (const f of files) {
71
+ let content;
72
+ try {
73
+ content = readFileSync(f, "utf-8");
74
+ }
75
+ catch {
76
+ continue;
77
+ }
78
+ allBlocks.push(...extractBlocks(f, content, blockSize));
79
+ }
80
+ // Group by normalized form
81
+ const groups = new Map();
82
+ for (const block of allBlocks) {
83
+ const existing = groups.get(block.normalized);
84
+ if (existing) {
85
+ existing.push(block);
86
+ }
87
+ else {
88
+ groups.set(block.normalized, [block]);
89
+ }
90
+ }
91
+ const reported = new Set();
92
+ for (const [_norm, blocks] of groups) {
93
+ if (blocks.length < 2)
94
+ continue;
95
+ // Deduplicate overlapping blocks in same file
96
+ const unique = [];
97
+ for (const b of blocks) {
98
+ const isDuplicate = unique.some((u) => u.file === b.file && Math.abs(u.startLine - b.startLine) < blockSize);
99
+ if (!isDuplicate)
100
+ unique.push(b);
101
+ }
102
+ if (unique.length < 2)
103
+ continue;
104
+ // Report clones
105
+ for (let j = 1; j < unique.length && j < 3; j++) {
106
+ const key = `${unique[0].file}:${unique[0].startLine}-${unique[j].file}:${unique[j].startLine}`;
107
+ if (reported.has(key))
108
+ continue;
109
+ reported.add(key);
110
+ const sameFile = unique[0].file === unique[j].file;
111
+ const severity = unique.length > 3 ? "high" : unique.length > 2 ? "medium" : "low";
112
+ issues.push({
113
+ file: unique[0].file,
114
+ line: unique[0].startLine,
115
+ issue: sameFile ? "Intra-file code clone" : "Cross-file code clone",
116
+ severity,
117
+ detail: `${blockSize}-line block duplicated${sameFile ? ` at line ${unique[j].startLine}` : ` in ${unique[j].file}:${unique[j].startLine}`} — extract to shared function (${unique.length} copies total)`,
118
+ });
119
+ }
120
+ }
121
+ // Also check for near-identical functions using a simpler heuristic
122
+ for (const f of files) {
123
+ let content;
124
+ try {
125
+ content = readFileSync(f, "utf-8");
126
+ }
127
+ catch {
128
+ continue;
129
+ }
130
+ const lines = content.split("\n");
131
+ const functions = [];
132
+ for (let i = 0; i < lines.length; i++) {
133
+ const funcMatch = lines[i].match(/(?:function\s+(\w+)|(?:const|let)\s+(\w+)\s*=\s*(?:async\s*)?\()/);
134
+ if (funcMatch) {
135
+ const name = funcMatch[1] || funcMatch[2];
136
+ let depth = 0;
137
+ let end = i;
138
+ for (let j = i; j < Math.min(i + 50, lines.length); j++) {
139
+ for (const ch of lines[j]) {
140
+ if (ch === "{")
141
+ depth++;
142
+ if (ch === "}")
143
+ depth--;
144
+ }
145
+ if (depth <= 0 && j > i) {
146
+ end = j;
147
+ break;
148
+ }
149
+ }
150
+ const body = lines
151
+ .slice(i, end + 1)
152
+ .map(normalize)
153
+ .join("|");
154
+ if (body.length > 30)
155
+ functions.push({ name, line: i + 1, body });
156
+ }
157
+ }
158
+ // Compare functions within same file
159
+ for (let a = 0; a < functions.length; a++) {
160
+ for (let b = a + 1; b < functions.length; b++) {
161
+ if (functions[a].body === functions[b].body && functions[a].body.length > 50) {
162
+ const key = `func:${f}:${functions[a].line}-${functions[b].line}`;
163
+ if (!reported.has(key)) {
164
+ reported.add(key);
165
+ issues.push({
166
+ file: f,
167
+ line: functions[a].line,
168
+ issue: "Duplicate functions",
169
+ severity: "medium",
170
+ detail: `\`${functions[a].name}\` and \`${functions[b].name}\` (line ${functions[b].line}) have identical logic — extract shared implementation`,
171
+ });
172
+ }
173
+ }
174
+ }
175
+ }
176
+ }
177
+ // Limit results
178
+ void minSimilarity;
179
+ return issues.slice(0, 50);
180
+ }
181
+ // ─── CLI ────────────────────────────────────────────────────────────────────
182
+ export function runCloneDetect(argv) {
183
+ if (argv.includes("--help") || argv.includes("-h")) {
184
+ console.log(`
185
+ judges clone-detect — Find duplicated logic blocks that should be shared functions
186
+
187
+ Usage:
188
+ judges clone-detect [dir]
189
+ judges clone-detect src/ --format json
190
+
191
+ Options:
192
+ [dir] Directory to scan (default: .)
193
+ --format json JSON output
194
+ --help, -h Show this help
195
+
196
+ Checks: intra-file code clones, cross-file clones, duplicate functions with renamed variables.
197
+ `);
198
+ return;
199
+ }
200
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
201
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
202
+ const files = collectFiles(dir);
203
+ const allIssues = detectClones(files);
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 * 8 - medCount * 3);
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 ? "✅ DRY" : score >= 50 ? "⚠️ REPETITIVE" : "❌ DUPLICATED";
217
+ console.log(`\n Code Clones: ${badge} (${score}/100)\n ─────────────────────────────`);
218
+ if (allIssues.length === 0) {
219
+ console.log(" No code clones 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=clone-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone-detect.js","sourceRoot":"","sources":["../../src/commands/clone-detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Contract verify — check that API implementations match declared contracts (OpenAPI, GraphQL, protobuf).
3
+ */
4
+ export declare function runContractVerify(argv: string[]): void;
5
+ //# sourceMappingURL=contract-verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-verify.d.ts","sourceRoot":"","sources":["../../src/commands/contract-verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6QH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiFtD"}
@@ -0,0 +1,317 @@
1
+ /**
2
+ * Contract verify — check that API implementations match declared contracts (OpenAPI, GraphQL, protobuf).
3
+ */
4
+ import { readFileSync, readdirSync, statSync, existsSync } 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)) || /\.(json|ya?ml|graphql|gql|proto)$/.test(full))
30
+ files.push(full);
31
+ }
32
+ catch {
33
+ /* skip */
34
+ }
35
+ }
36
+ }
37
+ walk(dir);
38
+ return files;
39
+ }
40
+ // ─── OpenAPI Analysis ───────────────────────────────────────────────────────
41
+ function findOpenApiSpecs(dir) {
42
+ const specs = [];
43
+ const candidates = [
44
+ "openapi.json",
45
+ "openapi.yaml",
46
+ "openapi.yml",
47
+ "swagger.json",
48
+ "swagger.yaml",
49
+ "swagger.yml",
50
+ "api-spec.json",
51
+ "api-spec.yaml",
52
+ ];
53
+ for (const name of candidates) {
54
+ const p = join(dir, name);
55
+ if (existsSync(p))
56
+ specs.push(p);
57
+ }
58
+ // Also check docs/ and api/ subdirectories
59
+ for (const sub of ["docs", "api", "spec", "specs"]) {
60
+ const subDir = join(dir, sub);
61
+ if (existsSync(subDir)) {
62
+ for (const name of candidates) {
63
+ const p = join(subDir, name);
64
+ if (existsSync(p))
65
+ specs.push(p);
66
+ }
67
+ }
68
+ }
69
+ return specs;
70
+ }
71
+ function extractOpenApiPaths(specContent) {
72
+ const routes = [];
73
+ try {
74
+ const spec = JSON.parse(specContent);
75
+ const paths = spec.paths || {};
76
+ for (const [path, methods] of Object.entries(paths)) {
77
+ if (typeof methods !== "object" || methods === null)
78
+ continue;
79
+ for (const [method, detail] of Object.entries(methods)) {
80
+ if (["get", "post", "put", "delete", "patch"].includes(method)) {
81
+ const responses = detail && typeof detail === "object" && "responses" in detail
82
+ ? Object.keys(detail.responses)
83
+ : [];
84
+ routes.push({ method: method.toUpperCase(), path, responses });
85
+ }
86
+ }
87
+ }
88
+ }
89
+ catch {
90
+ /* not valid JSON spec */
91
+ }
92
+ return routes;
93
+ }
94
+ // ─── Implementation Analysis ────────────────────────────────────────────────
95
+ function analyzeContractDrift(files, specRoutes) {
96
+ const issues = [];
97
+ const implementedRoutes = new Set();
98
+ // Find implemented routes in code
99
+ for (const filepath of files) {
100
+ let content;
101
+ try {
102
+ content = readFileSync(filepath, "utf-8");
103
+ }
104
+ catch {
105
+ continue;
106
+ }
107
+ if (!/\.(?:ts|tsx|js|jsx|py|java|go)$/.test(filepath))
108
+ continue;
109
+ const lines = content.split("\n");
110
+ for (let i = 0; i < lines.length; i++) {
111
+ const line = lines[i];
112
+ const routeMatch = line.match(/(?:router|app)\.\s*(get|post|put|delete|patch)\s*\(\s*['"]([^'"]+)['"]/i);
113
+ if (routeMatch) {
114
+ const method = routeMatch[1].toUpperCase();
115
+ const path = routeMatch[2];
116
+ implementedRoutes.add(`${method} ${path}`);
117
+ // Check response status codes used
118
+ const handlerBlock = lines.slice(i, Math.min(i + 30, lines.length)).join("\n");
119
+ const usedStatuses = [...handlerBlock.matchAll(/\.status\s*\(\s*(\d+)\s*\)/g)].map((m) => m[1]);
120
+ // Compare with spec
121
+ const specRoute = specRoutes.find((r) => r.method === method && normalizePath(r.path) === normalizePath(path));
122
+ if (specRoute) {
123
+ for (const status of usedStatuses) {
124
+ if (!specRoute.responses.includes(status)) {
125
+ issues.push({
126
+ file: filepath,
127
+ line: i + 1,
128
+ issue: "Undocumented response status",
129
+ severity: "medium",
130
+ detail: `${method} ${path} returns status ${status} but spec only declares ${specRoute.responses.join(", ")}`,
131
+ });
132
+ }
133
+ }
134
+ }
135
+ }
136
+ // Response shape mismatch (heuristic: returning fields not in type)
137
+ if (/res\.(?:json|send)\s*\(\s*\{/.test(line)) {
138
+ const block = lines.slice(i, Math.min(i + 10, lines.length)).join("\n");
139
+ // Check for ad-hoc response properties that suggest undocumented fields
140
+ if (/password|secret|token|internal|debug|_\w+:/.test(block)) {
141
+ issues.push({
142
+ file: filepath,
143
+ line: i + 1,
144
+ issue: "Potentially sensitive field in response",
145
+ severity: "high",
146
+ detail: "Response object may include sensitive or internal-only fields not in API contract",
147
+ });
148
+ }
149
+ }
150
+ }
151
+ }
152
+ // Find spec routes not implemented
153
+ for (const route of specRoutes) {
154
+ const key = `${route.method} ${route.path}`;
155
+ const _normalizedKey = `${route.method} ${normalizePath(route.path)}`;
156
+ let found = false;
157
+ for (const impl of implementedRoutes) {
158
+ if (impl === key || normalizePath(impl.split(" ")[1]) === normalizePath(route.path)) {
159
+ found = true;
160
+ break;
161
+ }
162
+ }
163
+ if (!found) {
164
+ issues.push({
165
+ file: "api-spec",
166
+ line: 0,
167
+ issue: "Spec route not implemented",
168
+ severity: "high",
169
+ detail: `${route.method} ${route.path} declared in OpenAPI spec but no matching handler found in code`,
170
+ });
171
+ }
172
+ }
173
+ return issues;
174
+ }
175
+ function normalizePath(path) {
176
+ return path.replace(/\{[^}]+\}/g, ":param").replace(/\/+$/, "");
177
+ }
178
+ // ─── General Contract Checks ────────────────────────────────────────────────
179
+ function analyzeGeneralContracts(files) {
180
+ const issues = [];
181
+ for (const filepath of files) {
182
+ let content;
183
+ try {
184
+ content = readFileSync(filepath, "utf-8");
185
+ }
186
+ catch {
187
+ continue;
188
+ }
189
+ if (!/\.(?:ts|tsx|js|jsx)$/.test(filepath))
190
+ continue;
191
+ const lines = content.split("\n");
192
+ for (let i = 0; i < lines.length; i++) {
193
+ const line = lines[i];
194
+ // Interface/type declared but response doesn't match
195
+ if (/interface\s+(\w+Response|.*Response)\s*\{/.test(line)) {
196
+ const ifaceName = line.match(/interface\s+(\w+)/)?.[1];
197
+ if (ifaceName && !content.includes(`as ${ifaceName}`) && !content.includes(`: ${ifaceName}`)) {
198
+ issues.push({
199
+ file: filepath,
200
+ line: i + 1,
201
+ issue: "Response type declared but not enforced",
202
+ severity: "medium",
203
+ detail: `\`${ifaceName}\` defined but never used as type constraint — response shape is unverified`,
204
+ });
205
+ }
206
+ }
207
+ // API version in URL doesn't match spec version
208
+ if (/['"]\/api\/v(\d+)/.test(line)) {
209
+ const version = line.match(/\/api\/v(\d+)/)?.[1];
210
+ if (version) {
211
+ const otherVersions = content.match(/\/api\/v(\d+)/g);
212
+ if (otherVersions) {
213
+ const versions = new Set(otherVersions.map((v) => v.match(/v(\d+)/)?.[1]));
214
+ if (versions.size > 1) {
215
+ issues.push({
216
+ file: filepath,
217
+ line: i + 1,
218
+ issue: "Mixed API versions in same file",
219
+ severity: "medium",
220
+ detail: `Multiple API versions found (${[...versions].join(", ")}) — may indicate incomplete migration`,
221
+ });
222
+ }
223
+ }
224
+ }
225
+ }
226
+ // Endpoint returns different shape based on condition
227
+ if (/res\.(?:json|send)\s*\(/.test(line)) {
228
+ const funcBlock = lines.slice(Math.max(0, i - 20), Math.min(i + 5, lines.length)).join("\n");
229
+ const jsonCalls = (funcBlock.match(/res\.(?:json|send)\s*\(/g) || []).length;
230
+ if (jsonCalls > 2) {
231
+ issues.push({
232
+ file: filepath,
233
+ line: i + 1,
234
+ issue: "Multiple response shapes in single handler",
235
+ severity: "low",
236
+ detail: `Handler has ${jsonCalls} different response points — clients may receive inconsistent shapes`,
237
+ });
238
+ }
239
+ }
240
+ }
241
+ }
242
+ return issues;
243
+ }
244
+ // ─── CLI ────────────────────────────────────────────────────────────────────
245
+ export function runContractVerify(argv) {
246
+ if (argv.includes("--help") || argv.includes("-h")) {
247
+ console.log(`
248
+ judges contract-verify — Check API implementations match declared contracts
249
+
250
+ Usage:
251
+ judges contract-verify [dir]
252
+ judges contract-verify src/ --format json
253
+
254
+ Options:
255
+ [dir] Directory to scan (default: .)
256
+ --format json JSON output
257
+ --help, -h Show this help
258
+
259
+ Checks: spec routes not implemented, undocumented response statuses, sensitive fields in responses,
260
+ unenforced response types, mixed API versions, inconsistent response shapes.
261
+ `);
262
+ return;
263
+ }
264
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
265
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
266
+ const files = collectFiles(dir);
267
+ // Find OpenAPI specs
268
+ const specFiles = findOpenApiSpecs(dir);
269
+ let specRoutes = [];
270
+ for (const s of specFiles) {
271
+ try {
272
+ const specContent = readFileSync(s, "utf-8");
273
+ specRoutes = specRoutes.concat(extractOpenApiPaths(specContent));
274
+ }
275
+ catch {
276
+ /* skip */
277
+ }
278
+ }
279
+ const allIssues = [];
280
+ if (specRoutes.length > 0) {
281
+ allIssues.push(...analyzeContractDrift(files, specRoutes));
282
+ }
283
+ allIssues.push(...analyzeGeneralContracts(files));
284
+ const highCount = allIssues.filter((i) => i.severity === "high").length;
285
+ const medCount = allIssues.filter((i) => i.severity === "medium").length;
286
+ const score = Math.max(0, 100 - highCount * 10 - medCount * 4);
287
+ if (format === "json") {
288
+ console.log(JSON.stringify({
289
+ issues: allIssues,
290
+ score,
291
+ summary: { high: highCount, medium: medCount, total: allIssues.length, specRoutes: specRoutes.length },
292
+ timestamp: new Date().toISOString(),
293
+ }, null, 2));
294
+ }
295
+ else {
296
+ const badge = score >= 80 ? "✅ ALIGNED" : score >= 50 ? "⚠️ DRIFTED" : "❌ MISMATCHED";
297
+ console.log(`\n Contract Alignment: ${badge} (${score}/100)\n ─────────────────────────────`);
298
+ if (specRoutes.length > 0)
299
+ console.log(` OpenAPI spec: ${specRoutes.length} routes found`);
300
+ else
301
+ console.log(" No OpenAPI spec found — running general contract checks only");
302
+ if (allIssues.length === 0) {
303
+ console.log(" No contract issues detected.\n");
304
+ return;
305
+ }
306
+ for (const issue of allIssues.slice(0, 25)) {
307
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
308
+ console.log(` ${icon} ${issue.issue}`);
309
+ console.log(` ${issue.file}:${issue.line}`);
310
+ console.log(` ${issue.detail}`);
311
+ }
312
+ if (allIssues.length > 25)
313
+ console.log(` ... and ${allIssues.length - 25} more`);
314
+ console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
315
+ }
316
+ }
317
+ //# sourceMappingURL=contract-verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-verify.js","sourceRoot":"","sources":["../../src/commands/contract-verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACrE,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,IAAI,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5G,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,gBAAgB,CAAC,GAAW;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG;QACjB,cAAc;QACd,cAAc;QACd,aAAa;QACb,cAAc;QACd,cAAc;QACd,aAAa;QACb,eAAe;QACf,eAAe;KAChB,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,UAAU,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,2CAA2C;IAC3C,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9B,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC7B,IAAI,UAAU,CAAC,CAAC,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,WAAmB;IAC9C,MAAM,MAAM,GAA4D,EAAE,CAAC;IAC3E,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;gBAAE,SAAS;YAC9D,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAkC,CAAC,EAAE,CAAC;gBAClF,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC/D,MAAM,SAAS,GACb,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,WAAW,IAAI,MAAM;wBAC3D,CAAC,CAAC,MAAM,CAAC,IAAI,CAAE,MAAiD,CAAC,SAAS,CAAC;wBAC3E,CAAC,CAAC,EAAE,CAAC;oBACT,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAE/E,SAAS,oBAAoB,CAC3B,KAAe,EACf,UAAmE;IAEnE,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE5C,kCAAkC;IAClC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,iCAAiC,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,SAAS;QAEhE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,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,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC;YACzG,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC3B,iBAAiB,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;gBAE3C,mCAAmC;gBACnC,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;gBAC/E,MAAM,YAAY,GAAG,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEhG,oBAAoB;gBACpB,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC/G,IAAI,SAAS,EAAE,CAAC;oBACd,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;wBAClC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;4BAC1C,MAAM,CAAC,IAAI,CAAC;gCACV,IAAI,EAAE,QAAQ;gCACd,IAAI,EAAE,CAAC,GAAG,CAAC;gCACX,KAAK,EAAE,8BAA8B;gCACrC,QAAQ,EAAE,QAAQ;gCAClB,MAAM,EAAE,GAAG,MAAM,IAAI,IAAI,mBAAmB,MAAM,2BAA2B,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;6BAC9G,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,oEAAoE;YACpE,IAAI,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9C,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;gBACxE,wEAAwE;gBACxE,IAAI,4CAA4C,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7D,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,GAAG,CAAC;wBACX,KAAK,EAAE,yCAAyC;wBAChD,QAAQ,EAAE,MAAM;wBAChB,MAAM,EAAE,mFAAmF;qBAC5F,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,cAAc,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAAC;YACrC,IAAI,IAAI,KAAK,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpF,KAAK,GAAG,IAAI,CAAC;gBACb,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,4BAA4B;gBACnC,QAAQ,EAAE,MAAM;gBAChB,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,iEAAiE;aACvG,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,+EAA+E;AAE/E,SAAS,uBAAuB,CAAC,KAAe;IAC9C,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,SAAS;QAErD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,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;YAEtB,qDAAqD;YACrD,IAAI,2CAA2C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACvD,IAAI,SAAS,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,SAAS,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC,EAAE,CAAC;oBAC7F,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,GAAG,CAAC;wBACX,KAAK,EAAE,yCAAyC;wBAChD,QAAQ,EAAE,QAAQ;wBAClB,MAAM,EAAE,KAAK,SAAS,6EAA6E;qBACpG,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,gDAAgD;YAChD,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACjD,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;oBACtD,IAAI,aAAa,EAAE,CAAC;wBAClB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC3E,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;4BACtB,MAAM,CAAC,IAAI,CAAC;gCACV,IAAI,EAAE,QAAQ;gCACd,IAAI,EAAE,CAAC,GAAG,CAAC;gCACX,KAAK,EAAE,iCAAiC;gCACxC,QAAQ,EAAE,QAAQ;gCAClB,MAAM,EAAE,gCAAgC,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,uCAAuC;6BACxG,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,sDAAsD;YACtD,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7F,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,0BAA0B,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBAC7E,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;oBAClB,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,GAAG,CAAC;wBACX,KAAK,EAAE,4CAA4C;wBACnD,QAAQ,EAAE,KAAK;wBACf,MAAM,EAAE,eAAe,SAAS,sEAAsE;qBACvG,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;IAEhC,qBAAqB;IACrB,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,UAAU,GAA4D,EAAE,CAAC;IAC7E,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC7C,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAoB,EAAE,CAAC;IACtC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,SAAS,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC;IAElD,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,UAAU,EAAE,UAAU,CAAC,MAAM,EAAE;YACtG,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,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,KAAK,KAAK,wCAAwC,CAAC,CAAC;QAChG,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,UAAU,CAAC,MAAM,eAAe,CAAC,CAAC;;YACzF,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;QAErF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,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
+ * Dead code detect — identify unreachable code, unused exports, and orphaned functions.
3
+ */
4
+ export declare function runDeadCodeDetect(argv: string[]): void;
5
+ //# sourceMappingURL=dead-code-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dead-code-detect.d.ts","sourceRoot":"","sources":["../../src/commands/dead-code-detect.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoNH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAwEtD"}