@kevinrabun/judges 3.54.0 → 3.55.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/build-optimize.d.ts +7 -0
  6. package/dist/commands/build-optimize.d.ts.map +1 -0
  7. package/dist/commands/build-optimize.js +257 -0
  8. package/dist/commands/build-optimize.js.map +1 -0
  9. package/dist/commands/commit-hygiene.d.ts +6 -0
  10. package/dist/commands/commit-hygiene.d.ts.map +1 -0
  11. package/dist/commands/commit-hygiene.js +176 -0
  12. package/dist/commands/commit-hygiene.js.map +1 -0
  13. package/dist/commands/deploy-readiness.d.ts +6 -0
  14. package/dist/commands/deploy-readiness.d.ts.map +1 -0
  15. package/dist/commands/deploy-readiness.js +212 -0
  16. package/dist/commands/deploy-readiness.js.map +1 -0
  17. package/dist/commands/migration-safety.d.ts +6 -0
  18. package/dist/commands/migration-safety.d.ts.map +1 -0
  19. package/dist/commands/migration-safety.js +257 -0
  20. package/dist/commands/migration-safety.js.map +1 -0
  21. package/dist/commands/observability-gap.d.ts +6 -0
  22. package/dist/commands/observability-gap.d.ts.map +1 -0
  23. package/dist/commands/observability-gap.js +212 -0
  24. package/dist/commands/observability-gap.js.map +1 -0
  25. package/dist/commands/rollback-safety.d.ts +5 -0
  26. package/dist/commands/rollback-safety.d.ts.map +1 -0
  27. package/dist/commands/rollback-safety.js +192 -0
  28. package/dist/commands/rollback-safety.js.map +1 -0
  29. package/dist/commands/secret-age.d.ts +6 -0
  30. package/dist/commands/secret-age.d.ts.map +1 -0
  31. package/dist/commands/secret-age.js +215 -0
  32. package/dist/commands/secret-age.js.map +1 -0
  33. package/dist/commands/test-quality.d.ts +6 -0
  34. package/dist/commands/test-quality.d.ts.map +1 -0
  35. package/dist/commands/test-quality.js +161 -0
  36. package/dist/commands/test-quality.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Build optimize — detect build-time inefficiencies in AI-generated code:
3
+ * unused imports defeating tree-shaking, duplicated polyfills, dynamic require(),
4
+ * oversized inlined assets, and circular dependency chains.
5
+ */
6
+ import { readFileSync, readdirSync, statSync } from "fs";
7
+ import { join, extname } from "path";
8
+ // ─── File Collection ────────────────────────────────────────────────────────
9
+ const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"]);
10
+ function collectFiles(dir, max = 300) {
11
+ const files = [];
12
+ function walk(d) {
13
+ if (files.length >= max)
14
+ return;
15
+ let entries;
16
+ try {
17
+ entries = readdirSync(d);
18
+ }
19
+ catch {
20
+ return;
21
+ }
22
+ for (const e of entries) {
23
+ if (files.length >= max)
24
+ return;
25
+ if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build" || e === "coverage")
26
+ continue;
27
+ const full = join(d, e);
28
+ try {
29
+ if (statSync(full).isDirectory())
30
+ walk(full);
31
+ else if (CODE_EXTS.has(extname(full)))
32
+ files.push(full);
33
+ }
34
+ catch {
35
+ /* skip */
36
+ }
37
+ }
38
+ }
39
+ walk(dir);
40
+ return files;
41
+ }
42
+ // ─── Analysis ───────────────────────────────────────────────────────────────
43
+ function analyzeFile(filepath) {
44
+ const issues = [];
45
+ let content;
46
+ try {
47
+ content = readFileSync(filepath, "utf-8");
48
+ }
49
+ catch {
50
+ return issues;
51
+ }
52
+ const lines = content.split("\n");
53
+ for (let i = 0; i < lines.length; i++) {
54
+ const line = lines[i];
55
+ // Dynamic require()
56
+ if (/\brequire\s*\(\s*[^'"`]/.test(line) && !/\/\//.test(line.split("require")[0])) {
57
+ issues.push({
58
+ file: filepath,
59
+ line: i + 1,
60
+ issue: "Dynamic require()",
61
+ severity: "high",
62
+ suggestion: "Use static imports for tree-shaking",
63
+ });
64
+ }
65
+ // Barrel re-exports importing everything
66
+ if (/export\s*\*\s*from/.test(line)) {
67
+ issues.push({
68
+ file: filepath,
69
+ line: i + 1,
70
+ issue: "Barrel re-export",
71
+ severity: "medium",
72
+ suggestion: "Named exports enable better tree-shaking",
73
+ });
74
+ }
75
+ // Large base64 inlined data
76
+ const b64Match = line.match(/['"`]data:[^;]+;base64,([A-Za-z0-9+/=]{500,})/);
77
+ if (b64Match) {
78
+ issues.push({
79
+ file: filepath,
80
+ line: i + 1,
81
+ issue: "Large inlined base64 asset",
82
+ severity: "high",
83
+ suggestion: "Move to external file and reference by URL",
84
+ });
85
+ }
86
+ // Duplicated polyfills
87
+ if (/import.*(?:core-js|regenerator-runtime|@babel\/polyfill|tslib)/.test(line)) {
88
+ issues.push({
89
+ file: filepath,
90
+ line: i + 1,
91
+ issue: "Polyfill import in source",
92
+ severity: "medium",
93
+ suggestion: "Configure polyfills in bundler config, not per-file",
94
+ });
95
+ }
96
+ // JSON imports without tree-shaking
97
+ if (/require\s*\(\s*['"].*\.json['"]\s*\)/.test(line) && !/\.\/package\.json/.test(line)) {
98
+ issues.push({
99
+ file: filepath,
100
+ line: i + 1,
101
+ issue: "JSON require at top level",
102
+ severity: "low",
103
+ suggestion: "Use import assertions or load at runtime if large",
104
+ });
105
+ }
106
+ }
107
+ // Detect unused imports (simple heuristic)
108
+ const importRegex = /import\s+\{([^}]+)\}\s+from/g;
109
+ let match;
110
+ while ((match = importRegex.exec(content)) !== null) {
111
+ const names = match[1]
112
+ .split(",")
113
+ .map((n) => n
114
+ .trim()
115
+ .split(/\s+as\s+/)
116
+ .pop()
117
+ .trim())
118
+ .filter(Boolean);
119
+ for (const name of names) {
120
+ if (name.startsWith("type "))
121
+ continue;
122
+ const cleanName = name.replace(/^type\s+/, "");
123
+ // Count occurrences beyond the import line itself
124
+ const useCount = content.split(cleanName).length - 1;
125
+ if (useCount <= 1) {
126
+ issues.push({
127
+ file: filepath,
128
+ line: 1,
129
+ issue: `Potentially unused import: ${cleanName}`,
130
+ severity: "medium",
131
+ suggestion: "Remove unused imports to reduce bundle size",
132
+ });
133
+ }
134
+ }
135
+ }
136
+ return issues;
137
+ }
138
+ // ─── Circular Dependency Detection ──────────────────────────────────────────
139
+ function buildImportGraph(files) {
140
+ const graph = new Map();
141
+ for (const f of files) {
142
+ let content;
143
+ try {
144
+ content = readFileSync(f, "utf-8");
145
+ }
146
+ catch {
147
+ continue;
148
+ }
149
+ const deps = [];
150
+ const importPattern = /(?:import|from)\s+['"]([^'"]+)['"]/g;
151
+ let m;
152
+ while ((m = importPattern.exec(content)) !== null) {
153
+ if (m[1].startsWith(".")) {
154
+ const resolved = join(f, "..", m[1]).replace(/\\/g, "/");
155
+ deps.push(resolved);
156
+ }
157
+ }
158
+ graph.set(f.replace(/\\/g, "/"), deps);
159
+ }
160
+ return graph;
161
+ }
162
+ function findCycles(graph) {
163
+ const cycles = [];
164
+ const visited = new Set();
165
+ const stack = new Set();
166
+ function dfs(node, path) {
167
+ if (stack.has(node)) {
168
+ const cycleStart = path.indexOf(node);
169
+ if (cycleStart >= 0)
170
+ cycles.push(path.slice(cycleStart).concat(node));
171
+ return;
172
+ }
173
+ if (visited.has(node))
174
+ return;
175
+ visited.add(node);
176
+ stack.add(node);
177
+ const deps = graph.get(node) || [];
178
+ for (const dep of deps) {
179
+ // Resolve extension-less imports
180
+ const candidates = [dep, `${dep}.ts`, `${dep}.js`, `${dep}/index.ts`, `${dep}/index.js`];
181
+ for (const c of candidates) {
182
+ if (graph.has(c)) {
183
+ dfs(c, [...path, node]);
184
+ break;
185
+ }
186
+ }
187
+ }
188
+ stack.delete(node);
189
+ }
190
+ for (const node of graph.keys())
191
+ dfs(node, []);
192
+ return cycles.slice(0, 10); // Cap cycles reported
193
+ }
194
+ // ─── CLI ────────────────────────────────────────────────────────────────────
195
+ export function runBuildOptimize(argv) {
196
+ if (argv.includes("--help") || argv.includes("-h")) {
197
+ console.log(`
198
+ judges build-optimize — Detect build-time inefficiencies
199
+
200
+ Usage:
201
+ judges build-optimize [dir]
202
+ judges build-optimize src/ --format json
203
+
204
+ Options:
205
+ [dir] Directory to scan (default: .)
206
+ --format json JSON output
207
+ --help, -h Show this help
208
+
209
+ Detects: dynamic require(), barrel re-exports, inlined assets, polyfill imports,
210
+ unused imports, circular dependencies.
211
+ `);
212
+ return;
213
+ }
214
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
215
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
216
+ const files = collectFiles(dir);
217
+ const allIssues = [];
218
+ for (const f of files)
219
+ allIssues.push(...analyzeFile(f));
220
+ const graph = buildImportGraph(files);
221
+ const cycles = findCycles(graph);
222
+ const highCount = allIssues.filter((i) => i.severity === "high").length;
223
+ const medCount = allIssues.filter((i) => i.severity === "medium").length;
224
+ const score = Math.max(0, 100 - highCount * 10 - medCount * 3 - cycles.length * 15);
225
+ if (format === "json") {
226
+ console.log(JSON.stringify({
227
+ issues: allIssues,
228
+ cycles,
229
+ score,
230
+ summary: { files: files.length, issues: allIssues.length, circularDeps: cycles.length },
231
+ timestamp: new Date().toISOString(),
232
+ }, null, 2));
233
+ }
234
+ else {
235
+ const badge = score >= 80 ? "✅ OPTIMIZED" : score >= 50 ? "⚠️ NEEDS WORK" : "❌ BLOATED";
236
+ console.log(`\n Build Optimization: ${badge} (${score}/100)\n ──────────────────────────────`);
237
+ if (allIssues.length > 0) {
238
+ console.log("\n Issues:");
239
+ for (const issue of allIssues.slice(0, 30)) {
240
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
241
+ console.log(` ${icon} ${issue.issue}`);
242
+ console.log(` ${issue.file}:${issue.line}`);
243
+ console.log(` → ${issue.suggestion}`);
244
+ }
245
+ if (allIssues.length > 30)
246
+ console.log(` ... and ${allIssues.length - 30} more`);
247
+ }
248
+ if (cycles.length > 0) {
249
+ console.log("\n Circular Dependencies:");
250
+ for (const cycle of cycles) {
251
+ console.log(` 🔄 ${cycle.map((c) => c.split("/").pop()).join(" → ")}`);
252
+ }
253
+ }
254
+ console.log(`\n Score: ${score}/100 | Issues: ${allIssues.length} | Circular deps: ${cycles.length}\n`);
255
+ }
256
+ }
257
+ //# sourceMappingURL=build-optimize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-optimize.js","sourceRoot":"","sources":["../../src/commands/build-optimize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Commit hygiene — audit commit messages and diff structure for
3
+ * AI-generated code submission quality.
4
+ */
5
+ export declare function runCommitHygiene(argv: string[]): void;
6
+ //# sourceMappingURL=commit-hygiene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-hygiene.d.ts","sourceRoot":"","sources":["../../src/commands/commit-hygiene.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyJH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyDrD"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Commit hygiene — audit commit messages and diff structure for
3
+ * AI-generated code submission quality.
4
+ */
5
+ import { execSync } from "child_process";
6
+ // ─── Patterns ───────────────────────────────────────────────────────────────
7
+ const VAGUE_MESSAGES = [
8
+ /^update(d)?\s*(code|files?|stuff)?$/i,
9
+ /^fix(ed)?\s*(it|bug|stuff|things?)?$/i,
10
+ /^changes?$/i,
11
+ /^wip$/i,
12
+ /^misc$/i,
13
+ /^\.+$/,
14
+ /^temp$/i,
15
+ /^asdf/i,
16
+ /^test$/i,
17
+ ];
18
+ const CONVENTIONAL_REGEX = /^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?!?:\s/;
19
+ // ─── Analysis ───────────────────────────────────────────────────────────────
20
+ function getCommits(count) {
21
+ try {
22
+ const log = execSync(`git log --oneline -${count} --format="%H|%s"`, { encoding: "utf-8", timeout: 10000 });
23
+ const commits = [];
24
+ for (const line of log.trim().split("\n")) {
25
+ if (!line)
26
+ continue;
27
+ const [hash, ...msgParts] = line.split("|");
28
+ const message = msgParts.join("|");
29
+ let files = 0, insertions = 0, deletions = 0;
30
+ try {
31
+ const stat = execSync(`git diff --shortstat ${hash}^ ${hash}`, { encoding: "utf-8", timeout: 5000 });
32
+ const fm = stat.match(/(\d+)\s+files?\s+changed/);
33
+ const im = stat.match(/(\d+)\s+insertions?/);
34
+ const dm = stat.match(/(\d+)\s+deletions?/);
35
+ if (fm)
36
+ files = parseInt(fm[1]);
37
+ if (im)
38
+ insertions = parseInt(im[1]);
39
+ if (dm)
40
+ deletions = parseInt(dm[1]);
41
+ }
42
+ catch {
43
+ /* first commit or error */
44
+ }
45
+ commits.push({ hash: hash.substring(0, 8), message, files, insertions, deletions });
46
+ }
47
+ return commits;
48
+ }
49
+ catch {
50
+ return [];
51
+ }
52
+ }
53
+ function analyzeCommits(commits, requireConventional) {
54
+ const issues = [];
55
+ for (const c of commits) {
56
+ // Vague message check
57
+ if (VAGUE_MESSAGES.some((r) => r.test(c.message.trim()))) {
58
+ issues.push({
59
+ hash: c.hash,
60
+ message: c.message,
61
+ kind: "vague-message",
62
+ detail: "Commit message is too vague — describe what and why",
63
+ severity: "medium",
64
+ });
65
+ }
66
+ // Conventional commit check
67
+ if (requireConventional && !CONVENTIONAL_REGEX.test(c.message)) {
68
+ issues.push({
69
+ hash: c.hash,
70
+ message: c.message,
71
+ kind: "non-conventional",
72
+ detail: "Missing conventional commit prefix (feat:, fix:, etc.)",
73
+ severity: "low",
74
+ });
75
+ }
76
+ // Message length
77
+ if (c.message.length < 10) {
78
+ issues.push({
79
+ hash: c.hash,
80
+ message: c.message,
81
+ kind: "short-message",
82
+ detail: `Message only ${c.message.length} chars — too short to be descriptive`,
83
+ severity: "low",
84
+ });
85
+ }
86
+ if (c.message.length > 100) {
87
+ issues.push({
88
+ hash: c.hash,
89
+ message: c.message,
90
+ kind: "long-subject",
91
+ detail: `Subject line is ${c.message.length} chars — keep under 72`,
92
+ severity: "low",
93
+ });
94
+ }
95
+ // Oversized diff
96
+ if (c.files > 20) {
97
+ issues.push({
98
+ hash: c.hash,
99
+ message: c.message,
100
+ kind: "oversized-diff",
101
+ detail: `${c.files} files changed — consider splitting into atomic commits`,
102
+ severity: "high",
103
+ });
104
+ }
105
+ if (c.insertions + c.deletions > 1000) {
106
+ issues.push({
107
+ hash: c.hash,
108
+ message: c.message,
109
+ kind: "massive-change",
110
+ detail: `${c.insertions}+ / ${c.deletions}- lines — too large for effective review`,
111
+ severity: "high",
112
+ });
113
+ }
114
+ // Merge commit detection (simple)
115
+ if (/^Merge\s+(branch|pull)/i.test(c.message)) {
116
+ // Not an issue per se, but track for stats
117
+ }
118
+ }
119
+ return issues.sort((a, b) => {
120
+ const sev = { high: 3, medium: 2, low: 1 };
121
+ return sev[b.severity] - sev[a.severity];
122
+ });
123
+ }
124
+ // ─── CLI ────────────────────────────────────────────────────────────────────
125
+ export function runCommitHygiene(argv) {
126
+ if (argv.includes("--help") || argv.includes("-h")) {
127
+ console.log(`
128
+ judges commit-hygiene — Audit commit message and diff quality
129
+
130
+ Usage:
131
+ judges commit-hygiene
132
+ judges commit-hygiene --count 50
133
+ judges commit-hygiene --conventional
134
+ judges commit-hygiene --format json
135
+
136
+ Options:
137
+ --count <n> Number of recent commits to analyze (default: 20)
138
+ --conventional Require conventional commit format
139
+ --format json JSON output
140
+ --help, -h Show this help
141
+ `);
142
+ return;
143
+ }
144
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
145
+ const count = parseInt(argv.find((_a, i) => argv[i - 1] === "--count") || "20");
146
+ const requireConventional = argv.includes("--conventional");
147
+ const commits = getCommits(count);
148
+ if (commits.length === 0) {
149
+ console.log(" No commits found. Ensure you're in a git repository.");
150
+ return;
151
+ }
152
+ const issues = analyzeCommits(commits, requireConventional);
153
+ if (format === "json") {
154
+ console.log(JSON.stringify({ commits: commits.length, issues, timestamp: new Date().toISOString() }, null, 2));
155
+ }
156
+ else {
157
+ console.log(`\n Commit Hygiene — ${commits.length} commits analyzed, ${issues.length} issue(s)\n ──────────────────────────`);
158
+ if (issues.length === 0) {
159
+ console.log(" ✅ All commits look clean");
160
+ }
161
+ else {
162
+ for (const issue of issues.slice(0, 30)) {
163
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "⚪";
164
+ console.log(` ${icon} ${issue.hash} "${issue.message.substring(0, 50)}"`);
165
+ console.log(` ${issue.detail}`);
166
+ }
167
+ if (issues.length > 30)
168
+ console.log(`\n ... and ${issues.length - 30} more`);
169
+ }
170
+ // Summary stats
171
+ const avgSize = commits.reduce((s, c) => s + c.insertions + c.deletions, 0) / commits.length;
172
+ console.log(`\n Avg change size: ${Math.round(avgSize)} lines/commit`);
173
+ console.log(` Issues: ${issues.filter((i) => i.severity === "high").length} high, ${issues.filter((i) => i.severity === "medium").length} medium, ${issues.filter((i) => i.severity === "low").length} low\n`);
174
+ }
175
+ }
176
+ //# sourceMappingURL=commit-hygiene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-hygiene.js","sourceRoot":"","sources":["../../src/commands/commit-hygiene.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAYzC,+EAA+E;AAE/E,MAAM,cAAc,GAAG;IACrB,sCAAsC;IACtC,uCAAuC;IACvC,aAAa;IACb,QAAQ;IACR,SAAS;IACT,OAAO;IACP,SAAS;IACT,QAAQ;IACR,SAAS;CACV,CAAC;AAEF,MAAM,kBAAkB,GAAG,+EAA+E,CAAC;AAE3G,+EAA+E;AAE/E,SAAS,UAAU,CACjB,KAAa;IAEb,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,sBAAsB,KAAK,mBAAmB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5G,MAAM,OAAO,GAAmG,EAAE,CAAC;QAEnH,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,MAAM,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,KAAK,GAAG,CAAC,EACX,UAAU,GAAG,CAAC,EACd,SAAS,GAAG,CAAC,CAAC;YAEhB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,QAAQ,CAAC,wBAAwB,IAAI,KAAK,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrG,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBAClD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBAC5C,IAAI,EAAE;oBAAE,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,EAAE;oBAAE,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrC,IAAI,EAAE;oBAAE,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;QACtF,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,OAAuG,EACvG,mBAA4B;IAE5B,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,sBAAsB;QACtB,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE,qDAAqD;gBAC7D,QAAQ,EAAE,QAAQ;aACnB,CAAC,CAAC;QACL,CAAC;QAED,4BAA4B;QAC5B,IAAI,mBAAmB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,wDAAwD;gBAChE,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;QACL,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE,gBAAgB,CAAC,CAAC,OAAO,CAAC,MAAM,sCAAsC;gBAC9E,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,mBAAmB,CAAC,CAAC,OAAO,CAAC,MAAM,wBAAwB;gBACnE,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;QACL,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,yDAAyD;gBAC3E,QAAQ,EAAE,MAAM;aACjB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,OAAO,CAAC,CAAC,SAAS,0CAA0C;gBACnF,QAAQ,EAAE,MAAM;aACjB,CAAC,CAAC;QACL,CAAC;QAED,kCAAkC;QAClC,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,2CAA2C;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,GAAG,GAA2B,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QACnE,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,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,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC;IAChG,MAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAE5D,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAE5D,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACjH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,wBAAwB,OAAO,CAAC,MAAM,sBAAsB,MAAM,CAAC,MAAM,yCAAyC,CACnH,CAAC;QAEF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBACxC,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,GAAG,CAAC;gBACzF,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBAC7E,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE;gBAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;QAClF,CAAC;QAED,gBAAgB;QAChB,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7F,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CACT,eAAe,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,UAAU,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,YAAY,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,QAAQ,CACrM,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Deploy readiness — pre-deployment checklist that validates
3
+ * AI-generated code is production-ready.
4
+ */
5
+ export declare function runDeployReadiness(argv: string[]): void;
6
+ //# sourceMappingURL=deploy-readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-readiness.d.ts","sourceRoot":"","sources":["../../src/commands/deploy-readiness.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4LH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsDvD"}