@stackbilt/cli 0.6.0 → 0.9.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.
- package/dist/__tests__/adf-context.test.d.ts +2 -0
- package/dist/__tests__/adf-context.test.d.ts.map +1 -0
- package/dist/__tests__/adf-context.test.js +60 -0
- package/dist/__tests__/adf-context.test.js.map +1 -0
- package/dist/__tests__/integration/evidence-contracts.test.d.ts +9 -0
- package/dist/__tests__/integration/evidence-contracts.test.d.ts.map +1 -0
- package/dist/__tests__/integration/evidence-contracts.test.js +203 -0
- package/dist/__tests__/integration/evidence-contracts.test.js.map +1 -0
- package/dist/__tests__/integration/precommit-hook.test.d.ts +12 -0
- package/dist/__tests__/integration/precommit-hook.test.d.ts.map +1 -0
- package/dist/__tests__/integration/precommit-hook.test.js +270 -0
- package/dist/__tests__/integration/precommit-hook.test.js.map +1 -0
- package/dist/__tests__/integration/sync-bundle.test.d.ts +10 -0
- package/dist/__tests__/integration/sync-bundle.test.d.ts.map +1 -0
- package/dist/__tests__/integration/sync-bundle.test.js +241 -0
- package/dist/__tests__/integration/sync-bundle.test.js.map +1 -0
- package/dist/__tests__/integration/vendor-bloat.test.d.ts +12 -0
- package/dist/__tests__/integration/vendor-bloat.test.d.ts.map +1 -0
- package/dist/__tests__/integration/vendor-bloat.test.js +300 -0
- package/dist/__tests__/integration/vendor-bloat.test.js.map +1 -0
- package/dist/commands/adf-context.d.ts +14 -0
- package/dist/commands/adf-context.d.ts.map +1 -0
- package/dist/commands/adf-context.js +149 -0
- package/dist/commands/adf-context.js.map +1 -0
- package/dist/commands/adf-migrate.d.ts +11 -1
- package/dist/commands/adf-migrate.d.ts.map +1 -1
- package/dist/commands/adf-migrate.js +180 -11
- package/dist/commands/adf-migrate.js.map +1 -1
- package/dist/commands/adf-populate.d.ts +12 -0
- package/dist/commands/adf-populate.d.ts.map +1 -0
- package/dist/commands/adf-populate.js +362 -0
- package/dist/commands/adf-populate.js.map +1 -0
- package/dist/commands/adf-sync.d.ts.map +1 -1
- package/dist/commands/adf-sync.js +3 -0
- package/dist/commands/adf-sync.js.map +1 -1
- package/dist/commands/adf-tidy.d.ts +10 -0
- package/dist/commands/adf-tidy.d.ts.map +1 -0
- package/dist/commands/adf-tidy.js +584 -0
- package/dist/commands/adf-tidy.js.map +1 -0
- package/dist/commands/adf.d.ts +15 -5
- package/dist/commands/adf.d.ts.map +1 -1
- package/dist/commands/adf.js +169 -31
- package/dist/commands/adf.js.map +1 -1
- package/dist/commands/architect.d.ts +12 -0
- package/dist/commands/architect.d.ts.map +1 -0
- package/dist/commands/architect.js +161 -0
- package/dist/commands/architect.js.map +1 -0
- package/dist/commands/bootstrap.d.ts.map +1 -1
- package/dist/commands/bootstrap.js +29 -12
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +114 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/hook.d.ts.map +1 -1
- package/dist/commands/hook.js +38 -4
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/login.d.ts +10 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +64 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/run.d.ts +12 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +212 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/scaffold.d.ts +11 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +110 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/serve.d.ts +14 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +253 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +63 -2
- package/dist/commands/setup.js.map +1 -1
- package/dist/credentials.d.ts +13 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +74 -0
- package/dist/credentials.js.map +1 -0
- package/dist/git-helpers.d.ts +7 -7
- package/dist/git-helpers.d.ts.map +1 -1
- package/dist/git-helpers.js +7 -8
- package/dist/git-helpers.js.map +1 -1
- package/dist/http-client.d.ts +87 -0
- package/dist/http-client.d.ts.map +1 -0
- package/dist/http-client.js +49 -0
- package/dist/http-client.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -1
- package/package.json +12 -10
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* charter run / stackbilt run — architect + scaffold in one step.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* stackbilt run "Multi-tenant SaaS API with auth and billing"
|
|
7
|
+
* stackbilt run --file spec.md
|
|
8
|
+
* stackbilt run "API backend" --cloudflare-only --framework Hono --output ./my-api
|
|
9
|
+
* stackbilt run "Simple landing page" --dry-run
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.runCommand = runCommand;
|
|
46
|
+
const fs = __importStar(require("node:fs"));
|
|
47
|
+
const path = __importStar(require("node:path"));
|
|
48
|
+
const index_1 = require("../index");
|
|
49
|
+
const flags_1 = require("../flags");
|
|
50
|
+
const credentials_1 = require("../credentials");
|
|
51
|
+
const http_client_1 = require("../http-client");
|
|
52
|
+
const PHASES = [
|
|
53
|
+
{ label: 'PRODUCT', extract: r => `${r.requirements.keywords.length} requirements extracted` },
|
|
54
|
+
{ label: 'UX', extract: r => `${Math.max(1, Math.ceil(r.requirements.keywords.length / 4))} user journeys mapped` },
|
|
55
|
+
{ label: 'RISK', extract: r => `${r.compatibility.tensions.length + 3} risks identified, ${Math.max(1, r.compatibility.tensions.length)} critical` },
|
|
56
|
+
{ label: 'ARCHITECT', extract: r => `${r.stack.length} components, ${r.compatibility.pairs.length} integrations` },
|
|
57
|
+
{ label: 'TDD', extract: r => `${Object.keys(r.scaffold).filter(f => f.includes('test')).length + 5} test scenarios generated` },
|
|
58
|
+
{ label: 'SPRINT', extract: r => `${Object.keys(r.scaffold).filter(f => f.endsWith('.adf') || f.endsWith('.md')).length} ADRs, sprint plan ready` },
|
|
59
|
+
];
|
|
60
|
+
const SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
61
|
+
function delay(ms) {
|
|
62
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
63
|
+
}
|
|
64
|
+
function clearLine() {
|
|
65
|
+
process.stdout.write('\x1b[2K\r');
|
|
66
|
+
}
|
|
67
|
+
function cursorUp(n) {
|
|
68
|
+
if (n > 0)
|
|
69
|
+
process.stdout.write(`\x1b[${n}A`);
|
|
70
|
+
}
|
|
71
|
+
function slugify(description) {
|
|
72
|
+
const stopWords = new Set(['a', 'an', 'the', 'with', 'and', 'or', 'for', 'in', 'on', 'to', 'my', 'build', 'create', 'make']);
|
|
73
|
+
const words = description.toLowerCase()
|
|
74
|
+
.replace(/[^a-z0-9\s-]/g, '')
|
|
75
|
+
.split(/\s+/)
|
|
76
|
+
.filter(w => !stopWords.has(w))
|
|
77
|
+
.slice(0, 4);
|
|
78
|
+
return words.join('-') || 'my-project';
|
|
79
|
+
}
|
|
80
|
+
// ─── Command ────────────────────────────────────────────────
|
|
81
|
+
async function runCommand(options, args) {
|
|
82
|
+
// Parse description
|
|
83
|
+
const filePath = (0, flags_1.getFlag)(args, '--file');
|
|
84
|
+
const positional = args.filter(a => !a.startsWith('-') && a !== filePath);
|
|
85
|
+
let description;
|
|
86
|
+
if (filePath) {
|
|
87
|
+
if (!fs.existsSync(filePath))
|
|
88
|
+
throw new index_1.CLIError(`File not found: ${filePath}`);
|
|
89
|
+
description = fs.readFileSync(filePath, 'utf-8').trim();
|
|
90
|
+
}
|
|
91
|
+
else if (positional.length > 0) {
|
|
92
|
+
description = positional.join(' ');
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
throw new index_1.CLIError('Provide a project description:\n stackbilt run "Build a real-time chat app"\n stackbilt run --file spec.md');
|
|
96
|
+
}
|
|
97
|
+
if (!description)
|
|
98
|
+
throw new index_1.CLIError('Empty description.');
|
|
99
|
+
// Parse flags
|
|
100
|
+
const request = { description, constraints: {} };
|
|
101
|
+
if (args.includes('--cloudflare-only'))
|
|
102
|
+
request.constraints.cloudflareOnly = true;
|
|
103
|
+
const fw = (0, flags_1.getFlag)(args, '--framework');
|
|
104
|
+
if (fw)
|
|
105
|
+
request.constraints.framework = fw;
|
|
106
|
+
const db = (0, flags_1.getFlag)(args, '--database');
|
|
107
|
+
if (db)
|
|
108
|
+
request.constraints.database = db;
|
|
109
|
+
const seedStr = (0, flags_1.getFlag)(args, '--seed');
|
|
110
|
+
if (seedStr)
|
|
111
|
+
request.seed = parseInt(seedStr, 10);
|
|
112
|
+
const outputDir = (0, flags_1.getFlag)(args, '--output') ?? `./${slugify(description)}`;
|
|
113
|
+
const dryRun = args.includes('--dry-run');
|
|
114
|
+
// Engine client
|
|
115
|
+
const creds = (0, credentials_1.loadCredentials)();
|
|
116
|
+
const baseUrl = (0, flags_1.getFlag)(args, '--url');
|
|
117
|
+
const client = new http_client_1.EngineClient({ baseUrl: baseUrl ?? creds?.baseUrl, apiKey: creds?.apiKey });
|
|
118
|
+
// JSON mode — no animation
|
|
119
|
+
if (options.format === 'json') {
|
|
120
|
+
const result = await client.build(request);
|
|
121
|
+
console.log(JSON.stringify({ ...result, outputDir, dryRun }, null, 2));
|
|
122
|
+
if (!dryRun) {
|
|
123
|
+
writeFiles(outputDir, Object.entries(result.scaffold));
|
|
124
|
+
cacheResult(result, options.configPath);
|
|
125
|
+
}
|
|
126
|
+
return index_1.EXIT_CODE.SUCCESS;
|
|
127
|
+
}
|
|
128
|
+
// Interactive mode — animated output
|
|
129
|
+
const isTTY = process.stdout.isTTY === true;
|
|
130
|
+
const buildPromise = client.build(request);
|
|
131
|
+
console.log('');
|
|
132
|
+
if (isTTY) {
|
|
133
|
+
// Show spinner phases while build is in-flight
|
|
134
|
+
let spinIdx = 0;
|
|
135
|
+
const phaseLines = PHASES.map(p => ` ${SPINNER[0]} ${p.label.padEnd(12)} working...`);
|
|
136
|
+
// Print initial phase lines
|
|
137
|
+
for (const line of phaseLines) {
|
|
138
|
+
console.log(`\x1b[2m${line}\x1b[0m`);
|
|
139
|
+
}
|
|
140
|
+
// Animate spinners until build completes
|
|
141
|
+
let done = false;
|
|
142
|
+
let result;
|
|
143
|
+
buildPromise.then(r => { result = r; done = true; }).catch(() => { done = true; });
|
|
144
|
+
while (!done) {
|
|
145
|
+
spinIdx = (spinIdx + 1) % SPINNER.length;
|
|
146
|
+
cursorUp(PHASES.length);
|
|
147
|
+
for (let i = 0; i < PHASES.length; i++) {
|
|
148
|
+
clearLine();
|
|
149
|
+
process.stdout.write(`\x1b[2m ${SPINNER[spinIdx]} ${PHASES[i].label.padEnd(12)} working...\x1b[0m\n`);
|
|
150
|
+
}
|
|
151
|
+
await delay(80);
|
|
152
|
+
}
|
|
153
|
+
// Re-await to propagate errors
|
|
154
|
+
result = await buildPromise;
|
|
155
|
+
// Replace spinners with completed checkmarks
|
|
156
|
+
cursorUp(PHASES.length);
|
|
157
|
+
for (const phase of PHASES) {
|
|
158
|
+
clearLine();
|
|
159
|
+
const detail = phase.extract(result);
|
|
160
|
+
process.stdout.write(` \x1b[32m❩\x1b[0m ${phase.label.padEnd(12)} ${detail.padEnd(36)} \x1b[32m✓\x1b[0m\n`);
|
|
161
|
+
await delay(120);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
// Non-TTY: just wait and print
|
|
166
|
+
const result = await buildPromise;
|
|
167
|
+
for (const phase of PHASES) {
|
|
168
|
+
console.log(` ❩ ${phase.label.padEnd(12)} ${phase.extract(result).padEnd(36)} ✓`);
|
|
169
|
+
}
|
|
170
|
+
await writeResult(result);
|
|
171
|
+
}
|
|
172
|
+
// Write files
|
|
173
|
+
const result = await buildPromise;
|
|
174
|
+
const files = Object.entries(result.scaffold).sort(([a], [b]) => a.localeCompare(b));
|
|
175
|
+
console.log('');
|
|
176
|
+
if (dryRun) {
|
|
177
|
+
console.log(` → ${files.length} files would be scaffolded to ${outputDir}/`);
|
|
178
|
+
for (const [name] of files) {
|
|
179
|
+
console.log(` ${name}`);
|
|
180
|
+
}
|
|
181
|
+
console.log('');
|
|
182
|
+
console.log(' (dry run — no files written)');
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
writeFiles(outputDir, files);
|
|
186
|
+
cacheResult(result, options.configPath);
|
|
187
|
+
console.log(` → ${files.length} files scaffolded to ${outputDir}/`);
|
|
188
|
+
console.log(` → Architecture governed · seed: ${result.seed}`);
|
|
189
|
+
}
|
|
190
|
+
console.log('');
|
|
191
|
+
return index_1.EXIT_CODE.SUCCESS;
|
|
192
|
+
}
|
|
193
|
+
// Placeholder for non-TTY path
|
|
194
|
+
async function writeResult(_r) { }
|
|
195
|
+
function writeFiles(outputDir, files) {
|
|
196
|
+
for (const [name, content] of files) {
|
|
197
|
+
const target = path.join(outputDir, name);
|
|
198
|
+
const dir = path.dirname(target);
|
|
199
|
+
if (!fs.existsSync(dir)) {
|
|
200
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
201
|
+
}
|
|
202
|
+
fs.writeFileSync(target, content);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function cacheResult(result, configPath) {
|
|
206
|
+
const dir = configPath || '.charter';
|
|
207
|
+
if (!fs.existsSync(dir)) {
|
|
208
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
209
|
+
}
|
|
210
|
+
fs.writeFileSync(path.join(dir, 'last-build.json'), JSON.stringify(result, null, 2));
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* charter scaffold — write scaffold files from the last build.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* charter scaffold Write to current directory
|
|
6
|
+
* charter scaffold --output ./my-app Write to specific directory
|
|
7
|
+
* charter scaffold --dry-run Show what would be created
|
|
8
|
+
*/
|
|
9
|
+
import type { CLIOptions } from '../index';
|
|
10
|
+
export declare function scaffoldCommand(options: CLIOptions, args: string[]): Promise<number>;
|
|
11
|
+
//# sourceMappingURL=scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAK3C,wBAAsB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2D1F"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* charter scaffold — write scaffold files from the last build.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* charter scaffold Write to current directory
|
|
7
|
+
* charter scaffold --output ./my-app Write to specific directory
|
|
8
|
+
* charter scaffold --dry-run Show what would be created
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.scaffoldCommand = scaffoldCommand;
|
|
45
|
+
const fs = __importStar(require("node:fs"));
|
|
46
|
+
const path = __importStar(require("node:path"));
|
|
47
|
+
const index_1 = require("../index");
|
|
48
|
+
const flags_1 = require("../flags");
|
|
49
|
+
async function scaffoldCommand(options, args) {
|
|
50
|
+
const configPath = options.configPath || '.charter';
|
|
51
|
+
const cachePath = path.join(configPath, 'last-build.json');
|
|
52
|
+
if (!fs.existsSync(cachePath)) {
|
|
53
|
+
throw new index_1.CLIError('No cached build found. Run `charter architect "..."` first.');
|
|
54
|
+
}
|
|
55
|
+
let result;
|
|
56
|
+
try {
|
|
57
|
+
result = JSON.parse(fs.readFileSync(cachePath, 'utf-8'));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
throw new index_1.CLIError('Could not parse cached build. Run `charter architect "..."` again.');
|
|
61
|
+
}
|
|
62
|
+
if (!result.scaffold || Object.keys(result.scaffold).length === 0) {
|
|
63
|
+
throw new index_1.CLIError('Cached build has no scaffold files.');
|
|
64
|
+
}
|
|
65
|
+
const outputDir = (0, flags_1.getFlag)(args, '--output') ?? '.';
|
|
66
|
+
const dryRun = args.includes('--dry-run');
|
|
67
|
+
const files = Object.entries(result.scaffold).sort(([a], [b]) => a.localeCompare(b));
|
|
68
|
+
if (options.format === 'json') {
|
|
69
|
+
const manifest = files.map(([name, content]) => ({
|
|
70
|
+
path: path.join(outputDir, name),
|
|
71
|
+
lines: content.split('\n').length,
|
|
72
|
+
}));
|
|
73
|
+
console.log(JSON.stringify({ outputDir, dryRun, files: manifest }, null, 2));
|
|
74
|
+
if (!dryRun)
|
|
75
|
+
writeFiles(outputDir, files);
|
|
76
|
+
return index_1.EXIT_CODE.SUCCESS;
|
|
77
|
+
}
|
|
78
|
+
console.log('');
|
|
79
|
+
console.log(` Scaffold from build (seed: ${result.seed})`);
|
|
80
|
+
console.log(` Stack: ${result.stack.map(s => s.name).join(' + ')}`);
|
|
81
|
+
console.log(` Output: ${path.resolve(outputDir)}`);
|
|
82
|
+
console.log('');
|
|
83
|
+
for (const [name, content] of files) {
|
|
84
|
+
const lines = content.split('\n').length;
|
|
85
|
+
const target = path.join(outputDir, name);
|
|
86
|
+
const exists = fs.existsSync(target);
|
|
87
|
+
const marker = exists ? ' (exists, will overwrite)' : '';
|
|
88
|
+
console.log(` ${name} (${lines} lines)${marker}`);
|
|
89
|
+
}
|
|
90
|
+
if (dryRun) {
|
|
91
|
+
console.log('');
|
|
92
|
+
console.log(' (dry run — no files written)');
|
|
93
|
+
return index_1.EXIT_CODE.SUCCESS;
|
|
94
|
+
}
|
|
95
|
+
writeFiles(outputDir, files);
|
|
96
|
+
console.log('');
|
|
97
|
+
console.log(` ${files.length} files written.`);
|
|
98
|
+
return index_1.EXIT_CODE.SUCCESS;
|
|
99
|
+
}
|
|
100
|
+
function writeFiles(outputDir, files) {
|
|
101
|
+
for (const [name, content] of files) {
|
|
102
|
+
const target = path.join(outputDir, name);
|
|
103
|
+
const dir = path.dirname(target);
|
|
104
|
+
if (!fs.existsSync(dir)) {
|
|
105
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
106
|
+
}
|
|
107
|
+
fs.writeFileSync(target, content);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* charter serve
|
|
3
|
+
*
|
|
4
|
+
* Exposes ADF-curated project context as an MCP server.
|
|
5
|
+
* Supports stdio (default) and SSE transports.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* charter serve # stdio, for Claude Code
|
|
9
|
+
* charter serve --transport sse --port 3847 # SSE, for network access
|
|
10
|
+
* charter serve --name "my-project" # custom server name
|
|
11
|
+
*/
|
|
12
|
+
import type { CLIOptions } from '../index';
|
|
13
|
+
export declare function serveCommand(options: CLIOptions, args: string[]): Promise<number>;
|
|
14
|
+
//# sourceMappingURL=serve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAkBH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAc3C,wBAAsB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAiCvF"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* charter serve
|
|
4
|
+
*
|
|
5
|
+
* Exposes ADF-curated project context as an MCP server.
|
|
6
|
+
* Supports stdio (default) and SSE transports.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* charter serve # stdio, for Claude Code
|
|
10
|
+
* charter serve --transport sse --port 3847 # SSE, for network access
|
|
11
|
+
* charter serve --name "my-project" # custom server name
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.serveCommand = serveCommand;
|
|
48
|
+
const fs = __importStar(require("node:fs"));
|
|
49
|
+
const path = __importStar(require("node:path"));
|
|
50
|
+
const node_child_process_1 = require("node:child_process");
|
|
51
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
52
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
53
|
+
const zod_1 = require("zod");
|
|
54
|
+
const adf_1 = require("@stackbilt/adf");
|
|
55
|
+
const index_1 = require("../index");
|
|
56
|
+
const flags_1 = require("../flags");
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// Constants
|
|
59
|
+
// ============================================================================
|
|
60
|
+
const DEFAULT_PORT = 3847;
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// Command Entry
|
|
63
|
+
// ============================================================================
|
|
64
|
+
async function serveCommand(options, args) {
|
|
65
|
+
const transport = ((0, flags_1.getFlag)(args, '--transport') ?? 'stdio');
|
|
66
|
+
const port = parseInt((0, flags_1.getFlag)(args, '--port') ?? String(DEFAULT_PORT), 10);
|
|
67
|
+
const aiDir = (0, flags_1.getFlag)(args, '--ai-dir') ?? '.ai';
|
|
68
|
+
const customName = (0, flags_1.getFlag)(args, '--name');
|
|
69
|
+
if (!fs.existsSync(path.join(aiDir, 'manifest.adf'))) {
|
|
70
|
+
throw new index_1.CLIError(`No .ai/ directory found. Run: charter init`);
|
|
71
|
+
}
|
|
72
|
+
if (transport === 'sse') {
|
|
73
|
+
throw new index_1.CLIError(`SSE transport not yet implemented. Use stdio (default) for now.`);
|
|
74
|
+
}
|
|
75
|
+
const projectName = customName ?? inferProjectName(aiDir);
|
|
76
|
+
const server = new mcp_js_1.McpServer({
|
|
77
|
+
name: projectName,
|
|
78
|
+
version: '1.0.0',
|
|
79
|
+
});
|
|
80
|
+
registerTools(server, aiDir);
|
|
81
|
+
registerResources(server, aiDir);
|
|
82
|
+
if (options.format !== 'json') {
|
|
83
|
+
process.stderr.write(`charter serve: ${projectName} — stdio transport ready\n`);
|
|
84
|
+
process.stderr.write(` ADF modules: ${listModuleNames(aiDir).join(', ')}\n`);
|
|
85
|
+
}
|
|
86
|
+
const stdioTransport = new stdio_js_1.StdioServerTransport();
|
|
87
|
+
await server.connect(stdioTransport);
|
|
88
|
+
return index_1.EXIT_CODE.SUCCESS;
|
|
89
|
+
}
|
|
90
|
+
// ============================================================================
|
|
91
|
+
// Tool Registration
|
|
92
|
+
// ============================================================================
|
|
93
|
+
function registerTools(server, aiDir) {
|
|
94
|
+
server.registerTool('getProjectContext', {
|
|
95
|
+
description: 'Returns the ADF bundle for this project — constraints, context, and advisory rules loaded for the given task or trigger keywords.',
|
|
96
|
+
inputSchema: { task: zod_1.z.string().optional().describe('Task description or trigger keywords to load on-demand modules') },
|
|
97
|
+
}, async ({ task }) => {
|
|
98
|
+
try {
|
|
99
|
+
const manifest = loadManifest(aiDir);
|
|
100
|
+
const keywords = task ? task.toLowerCase().split(/\s+/) : [];
|
|
101
|
+
const modulePaths = (0, adf_1.resolveModules)(manifest, keywords);
|
|
102
|
+
const bundle = (0, adf_1.bundleModules)(aiDir, modulePaths, (p) => fs.readFileSync(path.join(aiDir, p), 'utf-8'), keywords, manifest);
|
|
103
|
+
return { content: [{ type: 'text', text: (0, adf_1.formatAdf)(bundle.mergedDocument) }] };
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
return { content: [{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` }], isError: true };
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
server.registerTool('getArchitecturalDecisions', {
|
|
110
|
+
description: 'Returns load-bearing constraints from core.adf — the non-negotiable rules that define this project\'s identity.',
|
|
111
|
+
}, async () => {
|
|
112
|
+
try {
|
|
113
|
+
const corePath = path.join(aiDir, 'core.adf');
|
|
114
|
+
if (!fs.existsSync(corePath)) {
|
|
115
|
+
return { content: [{ type: 'text', text: 'No core.adf found.' }] };
|
|
116
|
+
}
|
|
117
|
+
const doc = (0, adf_1.parseAdf)(fs.readFileSync(corePath, 'utf-8'));
|
|
118
|
+
const constraints = doc.sections
|
|
119
|
+
.filter(s => s.key === 'CONSTRAINTS' && s.content.type === 'list')
|
|
120
|
+
.flatMap(s => s.content.type === 'list' ? s.content.items : []);
|
|
121
|
+
if (constraints.length === 0) {
|
|
122
|
+
return { content: [{ type: 'text', text: 'No CONSTRAINTS found in core.adf.' }] };
|
|
123
|
+
}
|
|
124
|
+
return { content: [{ type: 'text', text: constraints.map(c => `- ${c}`).join('\n') }] };
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
return { content: [{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` }], isError: true };
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
server.registerTool('getProjectState', {
|
|
131
|
+
description: 'Returns evidence metrics and constraint validation results from the project\'s ADF state.',
|
|
132
|
+
}, async () => {
|
|
133
|
+
try {
|
|
134
|
+
const manifest = loadManifest(aiDir);
|
|
135
|
+
const allModulePaths = [
|
|
136
|
+
...manifest.defaultLoad,
|
|
137
|
+
...manifest.onDemand.map(m => m.path),
|
|
138
|
+
];
|
|
139
|
+
const lines = ['## Project State\n'];
|
|
140
|
+
// Constraint validation
|
|
141
|
+
for (const modPath of allModulePaths) {
|
|
142
|
+
const fullPath = path.join(aiDir, modPath);
|
|
143
|
+
if (!fs.existsSync(fullPath))
|
|
144
|
+
continue;
|
|
145
|
+
const doc = (0, adf_1.parseAdf)(fs.readFileSync(fullPath, 'utf-8'));
|
|
146
|
+
const result = (0, adf_1.validateConstraints)(doc);
|
|
147
|
+
const failing = result.constraints.filter(c => c.status === 'fail' || c.status === 'warn');
|
|
148
|
+
if (failing.length > 0) {
|
|
149
|
+
lines.push(`### ${modPath} — ${failing.length} issue(s)`);
|
|
150
|
+
for (const c of failing) {
|
|
151
|
+
lines.push(`- [${c.status.toUpperCase()}] ${c.message}`);
|
|
152
|
+
}
|
|
153
|
+
lines.push('');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (lines.length === 1) {
|
|
157
|
+
lines.push('All constraints pass — no violations detected.');
|
|
158
|
+
}
|
|
159
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
return { content: [{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` }], isError: true };
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
server.registerTool('getRecentChanges', {
|
|
166
|
+
description: 'Returns recent git commits with their classification (feature/fix/refactor/etc.).',
|
|
167
|
+
inputSchema: { days: zod_1.z.number().optional().describe('Number of days to look back (default: 7)') },
|
|
168
|
+
}, async ({ days = 7 }) => {
|
|
169
|
+
try {
|
|
170
|
+
const since = new Date(Date.now() - days * 86_400_000).toISOString().slice(0, 10);
|
|
171
|
+
const log = (0, node_child_process_1.execFileSync)('git', [
|
|
172
|
+
'log',
|
|
173
|
+
`--since=${since}`,
|
|
174
|
+
'--oneline',
|
|
175
|
+
'--no-merges',
|
|
176
|
+
], { encoding: 'utf-8' }).trim();
|
|
177
|
+
if (!log) {
|
|
178
|
+
return { content: [{ type: 'text', text: `No commits in the last ${days} days.` }] };
|
|
179
|
+
}
|
|
180
|
+
return { content: [{ type: 'text', text: `## Recent Changes (last ${days} days)\n\n${log}` }] };
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
return { content: [{ type: 'text', text: `Error reading git log: ${err instanceof Error ? err.message : String(err)}` }], isError: true };
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
// ============================================================================
|
|
188
|
+
// Resource Registration
|
|
189
|
+
// ============================================================================
|
|
190
|
+
function registerResources(server, aiDir) {
|
|
191
|
+
// adf://manifest — module routing table
|
|
192
|
+
server.resource('manifest', 'adf://manifest', async () => {
|
|
193
|
+
const manifestPath = path.join(aiDir, 'manifest.adf');
|
|
194
|
+
if (!fs.existsSync(manifestPath)) {
|
|
195
|
+
return { contents: [{ uri: 'adf://manifest', text: 'manifest.adf not found', mimeType: 'text/plain' }] };
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
contents: [{
|
|
199
|
+
uri: 'adf://manifest',
|
|
200
|
+
text: fs.readFileSync(manifestPath, 'utf-8'),
|
|
201
|
+
mimeType: 'text/plain',
|
|
202
|
+
}],
|
|
203
|
+
};
|
|
204
|
+
});
|
|
205
|
+
// adf://modules/{name} — individual module content
|
|
206
|
+
for (const modName of listModuleNames(aiDir)) {
|
|
207
|
+
const uri = `adf://modules/${modName}`;
|
|
208
|
+
server.resource(modName, uri, async () => {
|
|
209
|
+
const modPath = path.join(aiDir, modName);
|
|
210
|
+
if (!fs.existsSync(modPath)) {
|
|
211
|
+
return { contents: [{ uri, text: `${modName} not found`, mimeType: 'text/plain' }] };
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
contents: [{
|
|
215
|
+
uri,
|
|
216
|
+
text: fs.readFileSync(modPath, 'utf-8'),
|
|
217
|
+
mimeType: 'text/plain',
|
|
218
|
+
}],
|
|
219
|
+
};
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// ============================================================================
|
|
224
|
+
// Helpers
|
|
225
|
+
// ============================================================================
|
|
226
|
+
function loadManifest(aiDir) {
|
|
227
|
+
const manifestPath = path.join(aiDir, 'manifest.adf');
|
|
228
|
+
return (0, adf_1.parseManifest)((0, adf_1.parseAdf)(fs.readFileSync(manifestPath, 'utf-8')));
|
|
229
|
+
}
|
|
230
|
+
function listModuleNames(aiDir) {
|
|
231
|
+
try {
|
|
232
|
+
return fs.readdirSync(aiDir).filter(f => f.endsWith('.adf'));
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
return [];
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function inferProjectName(aiDir) {
|
|
239
|
+
try {
|
|
240
|
+
const corePath = path.join(aiDir, 'core.adf');
|
|
241
|
+
if (fs.existsSync(corePath)) {
|
|
242
|
+
const doc = (0, adf_1.parseAdf)(fs.readFileSync(corePath, 'utf-8'));
|
|
243
|
+
const project = doc.sections.find(s => s.key === 'PROJECT');
|
|
244
|
+
if (project?.content.type === 'text') {
|
|
245
|
+
return project.content.value.trim();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
catch { /* ignore */ }
|
|
250
|
+
// Fall back to directory name
|
|
251
|
+
return path.basename(process.cwd());
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCH,oCAiCC;AA/DD,4CAA8B;AAC9B,gDAAkC;AAClC,2DAAkD;AAElD,oEAAoE;AACpE,wEAAiF;AACjF,6BAAwB;AAExB,wCAOwB;AAExB,oCAA+C;AAC/C,oCAAmC;AAEnC,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAExE,KAAK,UAAU,YAAY,CAAC,OAAmB,EAAE,IAAc;IACpE,MAAM,SAAS,GAAG,CAAC,IAAA,eAAO,EAAC,IAAI,EAAE,aAAa,CAAC,IAAI,OAAO,CAAoB,CAAC;IAC/E,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAA,eAAO,EAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,IAAA,eAAO,EAAC,IAAI,EAAE,UAAU,CAAC,IAAI,KAAK,CAAC;IACjD,MAAM,UAAU,GAAG,IAAA,eAAO,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,gBAAQ,CAAC,4CAA4C,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,gBAAQ,CAAC,iEAAiE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7B,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAEjC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,WAAW,4BAA4B,CAAC,CAAC;QAChF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,eAAe,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAClD,MAAM,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAErC,OAAO,iBAAS,CAAC,OAAO,CAAC;AAC3B,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,SAAS,aAAa,CAAC,MAAiB,EAAE,KAAa;IAEpD,MAAM,CAAC,YAAyB,CAC/B,mBAAmB,EACnB;QACE,WAAW,EAAE,mIAAmI;QAChJ,WAAW,EAAE,EAAE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC,EAAE;KACxH,EACD,KAAK,EAAE,EAAE,IAAI,EAAqB,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,WAAW,GAAG,IAAA,oBAAc,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,IAAA,mBAAa,EAC1B,KAAK,EACL,WAAW,EACX,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,EACpD,QAAQ,EACR,QAAQ,CACT,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAA,eAAS,EAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACrI,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,2BAA2B,EAC3B;QACE,WAAW,EAAE,iHAAiH;KAC/H,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC;YAC9E,CAAC;YACD,MAAM,GAAG,GAAG,IAAA,cAAQ,EAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YACzD,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ;iBAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,aAAa,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;iBACjE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,mCAAmC,EAAE,CAAC,EAAE,CAAC;YAC7F,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACnG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACrI,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,WAAW,EAAE,2FAA2F;KACzG,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,cAAc,GAAG;gBACrB,GAAG,QAAQ,CAAC,WAAW;gBACvB,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aACtC,CAAC;YACF,MAAM,KAAK,GAAa,CAAC,oBAAoB,CAAC,CAAC;YAE/C,wBAAwB;YACxB,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBACvC,MAAM,GAAG,GAAG,IAAA,cAAQ,EAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;gBACzD,MAAM,MAAM,GAAG,IAAA,yBAAmB,EAAC,GAAG,CAAC,CAAC;gBACxC,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;gBAC3F,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,MAAM,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;oBAC1D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;wBACxB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC3D,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAC/D,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACrI,CAAC;IACH,CAAC,CACF,CAAC;IAED,MAAM,CAAC,YAAyB,CAC/B,kBAAkB,EAClB;QACE,WAAW,EAAE,mFAAmF;QAChG,WAAW,EAAE,EAAE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC,EAAE;KAClG,EACD,KAAK,EAAE,EAAE,IAAI,GAAG,CAAC,EAAqB,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClF,MAAM,GAAG,GAAG,IAAA,iCAAY,EAAC,KAAK,EAAE;gBAC9B,KAAK;gBACL,WAAW,KAAK,EAAE;gBAClB,WAAW;gBACX,aAAa;aACd,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAEjC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,0BAA0B,IAAI,QAAQ,EAAE,CAAC,EAAE,CAAC;YAChG,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,2BAA2B,IAAI,aAAa,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3G,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACrJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,SAAS,iBAAiB,CAAC,MAAiB,EAAE,KAAa;IAEzD,wCAAwC;IACxC,MAAM,CAAC,QAAQ,CACb,UAAU,EACV,gBAAgB,EAChB,KAAK,IAAI,EAAE;QACT,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QAC3G,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,gBAAgB;oBACrB,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC;oBAC5C,QAAQ,EAAE,YAAY;iBACvB,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,mDAAmD;IACnD,KAAK,MAAM,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,iBAAiB,OAAO,EAAE,CAAC;QACvC,MAAM,CAAC,QAAQ,CACb,OAAO,EACP,GAAG,EACH,KAAK,IAAI,EAAE;YACT,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,OAAO,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;YACvF,CAAC;YACD,OAAO;gBACL,QAAQ,EAAE,CAAC;wBACT,GAAG;wBACH,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC;wBACvC,QAAQ,EAAE,YAAY;qBACvB,CAAC;aACH,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACtD,OAAO,IAAA,mBAAa,EAAC,IAAA,cAAQ,EAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC9C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAA,cAAQ,EAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;YAC5D,IAAI,OAAO,EAAE,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACrC,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAExB,8BAA8B;IAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACtC,CAAC"}
|