tryassay 0.14.0 → 0.15.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/api/server.js +7 -0
- package/dist/api/server.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/create.d.ts +2 -0
- package/dist/commands/create.js +32 -0
- package/dist/commands/create.js.map +1 -1
- package/dist/runtime/app-create-orchestrator.d.ts +17 -0
- package/dist/runtime/app-create-orchestrator.js +216 -15
- package/dist/runtime/app-create-orchestrator.js.map +1 -1
- package/dist/runtime/build-verifier.d.ts +32 -0
- package/dist/runtime/build-verifier.js +508 -0
- package/dist/runtime/build-verifier.js.map +1 -0
- package/dist/runtime/types.d.ts +46 -0
- package/package.json +1 -1
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Build Verifier — Build-Test-Repair loop for generated apps
|
|
3
|
+
// Runs npm install, npm run build, starts dev server, health checks.
|
|
4
|
+
// On failure, feeds errors to CodeAgent for repair, then retries.
|
|
5
|
+
// ============================================================
|
|
6
|
+
import { exec, spawn } from 'node:child_process';
|
|
7
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
8
|
+
import { join, dirname } from 'node:path';
|
|
9
|
+
import { randomUUID } from 'node:crypto';
|
|
10
|
+
import { CodeAgent } from './agents/code-agent.js';
|
|
11
|
+
import { MessageBus } from './message-bus.js';
|
|
12
|
+
// ── Build Verifier ───────────────────────────────────────────
|
|
13
|
+
export class BuildVerifier {
|
|
14
|
+
projectPath;
|
|
15
|
+
options;
|
|
16
|
+
constructor(projectPath, options) {
|
|
17
|
+
this.projectPath = projectPath;
|
|
18
|
+
this.options = {
|
|
19
|
+
maxRepairAttempts: options.maxRepairAttempts,
|
|
20
|
+
installTimeoutMs: options.installTimeoutMs ?? 120_000,
|
|
21
|
+
buildTimeoutMs: options.buildTimeoutMs ?? 120_000,
|
|
22
|
+
startStabilityMs: options.startStabilityMs ?? 15_000,
|
|
23
|
+
healthCheckTimeoutMs: options.healthCheckTimeoutMs ?? 10_000,
|
|
24
|
+
healthCheckRetries: options.healthCheckRetries ?? 3,
|
|
25
|
+
codeModel: options.codeModel,
|
|
26
|
+
onReconcileDeps: options.onReconcileDeps,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** Run the full build-test-repair loop. */
|
|
30
|
+
async verify() {
|
|
31
|
+
const loopStart = Date.now();
|
|
32
|
+
const repairAttempts = [];
|
|
33
|
+
let lastInstall = null;
|
|
34
|
+
let lastBuild = null;
|
|
35
|
+
let lastStart = null;
|
|
36
|
+
let lastHealthCheck = null;
|
|
37
|
+
let allErrors = [];
|
|
38
|
+
for (let attempt = 0; attempt <= this.options.maxRepairAttempts; attempt++) {
|
|
39
|
+
allErrors = [];
|
|
40
|
+
// Step 1: npm install
|
|
41
|
+
lastInstall = await this.runInstall();
|
|
42
|
+
if (lastInstall.status === 'fail' || lastInstall.status === 'timeout') {
|
|
43
|
+
allErrors.push(...this.parseErrors(lastInstall.stderr + '\n' + lastInstall.stdout));
|
|
44
|
+
if (allErrors.length === 0) {
|
|
45
|
+
allErrors.push({ file: 'package.json', line: null, message: lastInstall.stderr.slice(0, 500) || 'npm install failed', category: 'dependency_error' });
|
|
46
|
+
}
|
|
47
|
+
if (attempt < this.options.maxRepairAttempts) {
|
|
48
|
+
const repairResult = await this.runRepair(attempt + 1, allErrors);
|
|
49
|
+
repairAttempts.push(repairResult);
|
|
50
|
+
if (!repairResult.repairSucceeded)
|
|
51
|
+
continue;
|
|
52
|
+
continue; // Retry from install
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
// Step 2: npm run build
|
|
57
|
+
lastBuild = await this.runBuild();
|
|
58
|
+
if (lastBuild.status === 'fail' || lastBuild.status === 'timeout') {
|
|
59
|
+
allErrors.push(...this.parseErrors(lastBuild.stderr + '\n' + lastBuild.stdout));
|
|
60
|
+
if (allErrors.length === 0) {
|
|
61
|
+
allErrors.push({ file: 'unknown', line: null, message: lastBuild.stderr.slice(0, 500) || 'Build failed', category: 'other' });
|
|
62
|
+
}
|
|
63
|
+
if (attempt < this.options.maxRepairAttempts) {
|
|
64
|
+
const repairResult = await this.runRepair(attempt + 1, allErrors);
|
|
65
|
+
repairAttempts.push(repairResult);
|
|
66
|
+
continue; // Retry from install
|
|
67
|
+
}
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
// Step 3: Start dev server and check stability
|
|
71
|
+
lastStart = await this.runStart();
|
|
72
|
+
if (lastStart.status === 'fail' || lastStart.status === 'timeout') {
|
|
73
|
+
allErrors.push(...this.parseErrors(lastStart.stderr + '\n' + lastStart.stdout));
|
|
74
|
+
if (allErrors.length === 0) {
|
|
75
|
+
allErrors.push({ file: 'unknown', line: null, message: lastStart.stderr.slice(0, 500) || 'Dev server failed to start', category: 'runtime_error' });
|
|
76
|
+
}
|
|
77
|
+
if (attempt < this.options.maxRepairAttempts) {
|
|
78
|
+
const repairResult = await this.runRepair(attempt + 1, allErrors);
|
|
79
|
+
repairAttempts.push(repairResult);
|
|
80
|
+
continue; // Retry from install
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
// Step 4: Health check
|
|
85
|
+
const port = this.detectPort();
|
|
86
|
+
lastHealthCheck = await this.runHealthCheck(port);
|
|
87
|
+
// If all steps pass, we're done
|
|
88
|
+
if (lastInstall.status === 'pass' && lastBuild.status === 'pass') {
|
|
89
|
+
const status = repairAttempts.length > 0 ? 'repaired' : 'pass';
|
|
90
|
+
return {
|
|
91
|
+
status,
|
|
92
|
+
install: lastInstall,
|
|
93
|
+
build: lastBuild,
|
|
94
|
+
start: lastStart,
|
|
95
|
+
healthCheck: lastHealthCheck,
|
|
96
|
+
repairAttempts,
|
|
97
|
+
finalErrors: [],
|
|
98
|
+
totalDurationMs: Date.now() - loopStart,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Max attempts exhausted or unrecoverable failure
|
|
103
|
+
return {
|
|
104
|
+
status: 'fail',
|
|
105
|
+
install: lastInstall,
|
|
106
|
+
build: lastBuild,
|
|
107
|
+
start: lastStart,
|
|
108
|
+
healthCheck: lastHealthCheck,
|
|
109
|
+
repairAttempts,
|
|
110
|
+
finalErrors: allErrors,
|
|
111
|
+
totalDurationMs: Date.now() - loopStart,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// ── Build Steps ────────────────────────────────────────────
|
|
115
|
+
async runInstall() {
|
|
116
|
+
const start = Date.now();
|
|
117
|
+
const result = await this.execCommand('npm install', this.options.installTimeoutMs);
|
|
118
|
+
return {
|
|
119
|
+
step: 'install',
|
|
120
|
+
status: this.resultStatus(result),
|
|
121
|
+
command: 'npm install',
|
|
122
|
+
stdout: result.stdout.slice(0, 5000),
|
|
123
|
+
stderr: result.stderr.slice(0, 5000),
|
|
124
|
+
durationMs: Date.now() - start,
|
|
125
|
+
exitCode: result.exitCode,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
async runBuild() {
|
|
129
|
+
const start = Date.now();
|
|
130
|
+
// Check if build script exists
|
|
131
|
+
const hasBuild = await this.hasPkgScript('build');
|
|
132
|
+
if (!hasBuild) {
|
|
133
|
+
return {
|
|
134
|
+
step: 'build',
|
|
135
|
+
status: 'skip',
|
|
136
|
+
command: 'npm run build',
|
|
137
|
+
stdout: 'No build script in package.json',
|
|
138
|
+
stderr: '',
|
|
139
|
+
durationMs: 0,
|
|
140
|
+
exitCode: null,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
const result = await this.execCommand('npm run build', this.options.buildTimeoutMs);
|
|
144
|
+
return {
|
|
145
|
+
step: 'build',
|
|
146
|
+
status: this.resultStatus(result),
|
|
147
|
+
command: 'npm run build',
|
|
148
|
+
stdout: result.stdout.slice(0, 5000),
|
|
149
|
+
stderr: result.stderr.slice(0, 5000),
|
|
150
|
+
durationMs: Date.now() - start,
|
|
151
|
+
exitCode: result.exitCode,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
async runStart() {
|
|
155
|
+
const start = Date.now();
|
|
156
|
+
const hasDev = await this.hasPkgScript('dev');
|
|
157
|
+
const hasStart = await this.hasPkgScript('start');
|
|
158
|
+
const script = hasDev ? 'dev' : hasStart ? 'start' : null;
|
|
159
|
+
if (!script) {
|
|
160
|
+
return {
|
|
161
|
+
step: 'start',
|
|
162
|
+
status: 'skip',
|
|
163
|
+
command: 'npm run dev',
|
|
164
|
+
stdout: 'No dev or start script in package.json',
|
|
165
|
+
stderr: '',
|
|
166
|
+
durationMs: 0,
|
|
167
|
+
exitCode: null,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
// Spawn the dev server and wait for stability
|
|
171
|
+
let serverProcess = null;
|
|
172
|
+
let stdout = '';
|
|
173
|
+
let stderr = '';
|
|
174
|
+
try {
|
|
175
|
+
serverProcess = spawn('npm', ['run', script], {
|
|
176
|
+
cwd: this.projectPath,
|
|
177
|
+
env: { ...process.env, NODE_ENV: 'development', BROWSER: 'none' },
|
|
178
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
179
|
+
detached: true,
|
|
180
|
+
});
|
|
181
|
+
serverProcess.stdout?.on('data', (data) => { stdout += data.toString(); });
|
|
182
|
+
serverProcess.stderr?.on('data', (data) => { stderr += data.toString(); });
|
|
183
|
+
// Wait for "Ready" indicator or stability period
|
|
184
|
+
const stable = await this.waitForReady(serverProcess, stdout, () => stdout, this.options.startStabilityMs);
|
|
185
|
+
return {
|
|
186
|
+
step: 'start',
|
|
187
|
+
status: stable ? 'pass' : 'fail',
|
|
188
|
+
command: `npm run ${script}`,
|
|
189
|
+
stdout: stdout.slice(0, 5000),
|
|
190
|
+
stderr: stderr.slice(0, 5000),
|
|
191
|
+
durationMs: Date.now() - start,
|
|
192
|
+
exitCode: stable ? 0 : 1,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
return {
|
|
197
|
+
step: 'start',
|
|
198
|
+
status: 'fail',
|
|
199
|
+
command: `npm run ${script}`,
|
|
200
|
+
stdout: stdout.slice(0, 5000),
|
|
201
|
+
stderr: (stderr + '\n' + (err instanceof Error ? err.message : String(err))).slice(0, 5000),
|
|
202
|
+
durationMs: Date.now() - start,
|
|
203
|
+
exitCode: 1,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
// Kill the dev server process tree
|
|
208
|
+
if (serverProcess?.pid) {
|
|
209
|
+
try {
|
|
210
|
+
process.kill(-serverProcess.pid, 'SIGTERM');
|
|
211
|
+
}
|
|
212
|
+
catch { /* already dead */ }
|
|
213
|
+
// Force kill after 2s
|
|
214
|
+
setTimeout(() => {
|
|
215
|
+
try {
|
|
216
|
+
process.kill(-serverProcess.pid, 'SIGKILL');
|
|
217
|
+
}
|
|
218
|
+
catch { /* already dead */ }
|
|
219
|
+
}, 2000);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async runHealthCheck(port) {
|
|
224
|
+
const start = Date.now();
|
|
225
|
+
for (let retry = 0; retry < this.options.healthCheckRetries; retry++) {
|
|
226
|
+
try {
|
|
227
|
+
const controller = new AbortController();
|
|
228
|
+
const timeout = setTimeout(() => controller.abort(), this.options.healthCheckTimeoutMs);
|
|
229
|
+
const response = await fetch(`http://localhost:${port}/`, {
|
|
230
|
+
signal: controller.signal,
|
|
231
|
+
});
|
|
232
|
+
clearTimeout(timeout);
|
|
233
|
+
if (response.ok || response.status < 500) {
|
|
234
|
+
return {
|
|
235
|
+
step: 'health_check',
|
|
236
|
+
status: 'pass',
|
|
237
|
+
command: `GET http://localhost:${port}/`,
|
|
238
|
+
stdout: `HTTP ${response.status} ${response.statusText}`,
|
|
239
|
+
stderr: '',
|
|
240
|
+
durationMs: Date.now() - start,
|
|
241
|
+
exitCode: 0,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
// Retry after delay
|
|
247
|
+
if (retry < this.options.healthCheckRetries - 1) {
|
|
248
|
+
await this.sleep(2000);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return {
|
|
253
|
+
step: 'health_check',
|
|
254
|
+
status: 'fail',
|
|
255
|
+
command: `GET http://localhost:${port}/`,
|
|
256
|
+
stdout: '',
|
|
257
|
+
stderr: `Health check failed after ${this.options.healthCheckRetries} retries`,
|
|
258
|
+
durationMs: Date.now() - start,
|
|
259
|
+
exitCode: 1,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
// ── Error Parsing ──────────────────────────────────────────
|
|
263
|
+
parseErrors(output) {
|
|
264
|
+
const errors = [];
|
|
265
|
+
const lines = output.split('\n');
|
|
266
|
+
for (const line of lines) {
|
|
267
|
+
// TypeScript errors: file(line,col): error TS####: message
|
|
268
|
+
const tsMatch = line.match(/^(.+?)\((\d+),\d+\):\s*error\s+TS\d+:\s*(.+)$/);
|
|
269
|
+
if (tsMatch) {
|
|
270
|
+
errors.push({ file: tsMatch[1], line: parseInt(tsMatch[2], 10), message: tsMatch[3], category: 'type_error' });
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
// TypeScript errors (alternative format): file:line:col - error TS####: message
|
|
274
|
+
const tsMatch2 = line.match(/^(.+?):(\d+):\d+\s*-\s*error\s+TS\d+:\s*(.+)$/);
|
|
275
|
+
if (tsMatch2) {
|
|
276
|
+
errors.push({ file: tsMatch2[1], line: parseInt(tsMatch2[2], 10), message: tsMatch2[3], category: 'type_error' });
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
// Next.js / Webpack module not found
|
|
280
|
+
const moduleMatch = line.match(/Module not found:\s*(?:Can't resolve|Error:\s*Can't resolve)\s*'([^']+)'/);
|
|
281
|
+
if (moduleMatch) {
|
|
282
|
+
errors.push({ file: 'package.json', line: null, message: `Module not found: '${moduleMatch[1]}'`, category: 'module_not_found' });
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
// SyntaxError
|
|
286
|
+
const syntaxMatch = line.match(/SyntaxError:\s*(.+)/);
|
|
287
|
+
if (syntaxMatch) {
|
|
288
|
+
errors.push({ file: 'unknown', line: null, message: syntaxMatch[1], category: 'syntax_error' });
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
// npm ERR! with dependency info
|
|
292
|
+
const npmErrMatch = line.match(/npm ERR!\s+(.+)/);
|
|
293
|
+
if (npmErrMatch && (line.includes('peer dep') || line.includes('ERESOLVE') || line.includes('could not resolve'))) {
|
|
294
|
+
errors.push({ file: 'package.json', line: null, message: npmErrMatch[1], category: 'dependency_error' });
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
// Generic Error:
|
|
298
|
+
const errorMatch = line.match(/^Error:\s*(.+)/);
|
|
299
|
+
if (errorMatch) {
|
|
300
|
+
errors.push({ file: 'unknown', line: null, message: errorMatch[1], category: 'other' });
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
// Deduplicate by message
|
|
305
|
+
const seen = new Set();
|
|
306
|
+
return errors.filter(e => {
|
|
307
|
+
const key = `${e.file}:${e.line}:${e.message}`;
|
|
308
|
+
if (seen.has(key))
|
|
309
|
+
return false;
|
|
310
|
+
seen.add(key);
|
|
311
|
+
return true;
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
// ── Repair via CodeAgent ───────────────────────────────────
|
|
315
|
+
async runRepair(attempt, errors) {
|
|
316
|
+
const repairStart = Date.now();
|
|
317
|
+
const filesModified = [];
|
|
318
|
+
// Group errors by file
|
|
319
|
+
const errorsByFile = new Map();
|
|
320
|
+
for (const error of errors) {
|
|
321
|
+
const existing = errorsByFile.get(error.file) ?? [];
|
|
322
|
+
existing.push(error);
|
|
323
|
+
errorsByFile.set(error.file, existing);
|
|
324
|
+
}
|
|
325
|
+
// Read failing file contents
|
|
326
|
+
const fileContents = [];
|
|
327
|
+
for (const [filePath, fileErrors] of errorsByFile) {
|
|
328
|
+
if (filePath === 'unknown' || filePath === 'package.json') {
|
|
329
|
+
fileContents.push({ path: filePath, content: '', errors: fileErrors });
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
try {
|
|
333
|
+
const absPath = filePath.startsWith('/') ? filePath : join(this.projectPath, filePath);
|
|
334
|
+
const content = await readFile(absPath, 'utf-8');
|
|
335
|
+
fileContents.push({ path: filePath, content, errors: fileErrors });
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
fileContents.push({ path: filePath, content: '(file not readable)', errors: fileErrors });
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// Build the repair goal
|
|
342
|
+
const errorSummary = fileContents.map(fc => {
|
|
343
|
+
const errLines = fc.errors.map(e => ` - ${e.category}: ${e.message}${e.line ? ` (line ${e.line})` : ''}`).join('\n');
|
|
344
|
+
return `File: ${fc.path}\nErrors:\n${errLines}\n${fc.content ? `Current content:\n\`\`\`\n${fc.content.slice(0, 3000)}\n\`\`\`` : ''}`;
|
|
345
|
+
}).join('\n\n---\n\n');
|
|
346
|
+
// Also read package.json for context
|
|
347
|
+
let pkgJson = '';
|
|
348
|
+
try {
|
|
349
|
+
pkgJson = await readFile(join(this.projectPath, 'package.json'), 'utf-8');
|
|
350
|
+
}
|
|
351
|
+
catch { /* no package.json */ }
|
|
352
|
+
const repairGoal = `Fix these build errors in a generated application. Return corrected files.
|
|
353
|
+
|
|
354
|
+
Attempt ${attempt} of ${this.options.maxRepairAttempts}.
|
|
355
|
+
|
|
356
|
+
Build errors found:
|
|
357
|
+
${errorSummary}
|
|
358
|
+
|
|
359
|
+
${pkgJson ? `package.json:\n\`\`\`json\n${pkgJson.slice(0, 2000)}\n\`\`\`` : ''}
|
|
360
|
+
|
|
361
|
+
Fix ALL errors. If a module is not found, either fix the import or add the dependency. If there are type errors, fix the types. Return the complete corrected file contents.`;
|
|
362
|
+
const messageBus = new MessageBus();
|
|
363
|
+
const codeAgent = new CodeAgent(messageBus, { model: this.options.codeModel });
|
|
364
|
+
try {
|
|
365
|
+
const result = await codeAgent.executeTask({
|
|
366
|
+
taskId: `repair-${attempt}-${randomUUID().slice(0, 8)}`,
|
|
367
|
+
goal: repairGoal,
|
|
368
|
+
constraints: ['Fix build errors only — do not add new features or refactor working code.'],
|
|
369
|
+
dependencies: [],
|
|
370
|
+
contextRefs: [],
|
|
371
|
+
});
|
|
372
|
+
if (result.status === 'failed') {
|
|
373
|
+
return {
|
|
374
|
+
attempt,
|
|
375
|
+
errors,
|
|
376
|
+
filesModified: [],
|
|
377
|
+
repairSucceeded: false,
|
|
378
|
+
durationMs: Date.now() - repairStart,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
// Write repaired files to disk
|
|
382
|
+
let touchedPackageJson = false;
|
|
383
|
+
for (const artifact of result.artifacts) {
|
|
384
|
+
if (!artifact.path)
|
|
385
|
+
continue;
|
|
386
|
+
const absPath = join(this.projectPath, artifact.path);
|
|
387
|
+
try {
|
|
388
|
+
await mkdir(dirname(absPath), { recursive: true });
|
|
389
|
+
await writeFile(absPath, artifact.content, 'utf-8');
|
|
390
|
+
filesModified.push(artifact.path);
|
|
391
|
+
if (artifact.path === 'package.json' || artifact.path.endsWith('/package.json')) {
|
|
392
|
+
touchedPackageJson = true;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
catch {
|
|
396
|
+
// Best-effort write
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
// Re-reconcile deps if package.json was touched
|
|
400
|
+
if (touchedPackageJson && this.options.onReconcileDeps) {
|
|
401
|
+
await this.options.onReconcileDeps();
|
|
402
|
+
}
|
|
403
|
+
return {
|
|
404
|
+
attempt,
|
|
405
|
+
errors,
|
|
406
|
+
filesModified,
|
|
407
|
+
repairSucceeded: filesModified.length > 0,
|
|
408
|
+
durationMs: Date.now() - repairStart,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
catch {
|
|
412
|
+
return {
|
|
413
|
+
attempt,
|
|
414
|
+
errors,
|
|
415
|
+
filesModified: [],
|
|
416
|
+
repairSucceeded: false,
|
|
417
|
+
durationMs: Date.now() - repairStart,
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
// ── Process Helpers ────────────────────────────────────────
|
|
422
|
+
execCommand(command, timeoutMs) {
|
|
423
|
+
return new Promise((resolve) => {
|
|
424
|
+
exec(command, {
|
|
425
|
+
cwd: this.projectPath,
|
|
426
|
+
timeout: timeoutMs,
|
|
427
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB
|
|
428
|
+
env: { ...process.env, NODE_ENV: 'development', CI: 'true' },
|
|
429
|
+
}, (error, stdout, stderr) => {
|
|
430
|
+
const timedOut = error?.killed === true;
|
|
431
|
+
resolve({
|
|
432
|
+
stdout: stdout ?? '',
|
|
433
|
+
stderr: stderr ?? '',
|
|
434
|
+
exitCode: timedOut ? null : (error?.code !== undefined ? (typeof error.code === 'number' ? error.code : 1) : 0),
|
|
435
|
+
timedOut,
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
waitForReady(proc, _initialStdout, getStdout, stabilityMs) {
|
|
441
|
+
return new Promise((resolve) => {
|
|
442
|
+
const readyPatterns = [
|
|
443
|
+
/ready/i,
|
|
444
|
+
/started.*on/i,
|
|
445
|
+
/listening.*on/i,
|
|
446
|
+
/compiled.*successfully/i,
|
|
447
|
+
/Local:\s+http/i,
|
|
448
|
+
];
|
|
449
|
+
let resolved = false;
|
|
450
|
+
const done = (result) => {
|
|
451
|
+
if (!resolved) {
|
|
452
|
+
resolved = true;
|
|
453
|
+
resolve(result);
|
|
454
|
+
}
|
|
455
|
+
};
|
|
456
|
+
// Check for ready pattern in output
|
|
457
|
+
const checkInterval = setInterval(() => {
|
|
458
|
+
const output = getStdout();
|
|
459
|
+
if (readyPatterns.some(p => p.test(output))) {
|
|
460
|
+
clearInterval(checkInterval);
|
|
461
|
+
clearTimeout(stabilityTimeout);
|
|
462
|
+
done(true);
|
|
463
|
+
}
|
|
464
|
+
}, 500);
|
|
465
|
+
// Timeout: if no ready pattern found, consider it a failure
|
|
466
|
+
const stabilityTimeout = setTimeout(() => {
|
|
467
|
+
clearInterval(checkInterval);
|
|
468
|
+
// If process is still running, it might be okay (just no ready message)
|
|
469
|
+
done(!proc.killed && proc.exitCode === null);
|
|
470
|
+
}, stabilityMs);
|
|
471
|
+
// Process exit = failure
|
|
472
|
+
proc.on('exit', (code) => {
|
|
473
|
+
clearInterval(checkInterval);
|
|
474
|
+
clearTimeout(stabilityTimeout);
|
|
475
|
+
done(code === 0);
|
|
476
|
+
});
|
|
477
|
+
proc.on('error', () => {
|
|
478
|
+
clearInterval(checkInterval);
|
|
479
|
+
clearTimeout(stabilityTimeout);
|
|
480
|
+
done(false);
|
|
481
|
+
});
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
resultStatus(result) {
|
|
485
|
+
if (result.timedOut)
|
|
486
|
+
return 'timeout';
|
|
487
|
+
if (result.exitCode === 0)
|
|
488
|
+
return 'pass';
|
|
489
|
+
return 'fail';
|
|
490
|
+
}
|
|
491
|
+
async hasPkgScript(name) {
|
|
492
|
+
try {
|
|
493
|
+
const pkg = JSON.parse(await readFile(join(this.projectPath, 'package.json'), 'utf-8'));
|
|
494
|
+
return typeof pkg.scripts?.[name] === 'string';
|
|
495
|
+
}
|
|
496
|
+
catch {
|
|
497
|
+
return false;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
detectPort() {
|
|
501
|
+
// Default Next.js port
|
|
502
|
+
return 3000;
|
|
503
|
+
}
|
|
504
|
+
sleep(ms) {
|
|
505
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
//# sourceMappingURL=build-verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-verifier.js","sourceRoot":"","sources":["../../src/runtime/build-verifier.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/types.d.ts
CHANGED
|
@@ -1359,6 +1359,15 @@ export type AppCreatePhase = {
|
|
|
1359
1359
|
readonly waveIndex: number;
|
|
1360
1360
|
readonly totalWaves: number;
|
|
1361
1361
|
readonly featureIds: readonly string[];
|
|
1362
|
+
} | {
|
|
1363
|
+
readonly phase: 'build_verifying';
|
|
1364
|
+
readonly attempt: number;
|
|
1365
|
+
readonly maxAttempts: number;
|
|
1366
|
+
} | {
|
|
1367
|
+
readonly phase: 'build_repairing';
|
|
1368
|
+
readonly attempt: number;
|
|
1369
|
+
readonly maxAttempts: number;
|
|
1370
|
+
readonly errorCount: number;
|
|
1362
1371
|
} | {
|
|
1363
1372
|
readonly phase: 'cross_verifying';
|
|
1364
1373
|
} | {
|
|
@@ -1382,6 +1391,7 @@ export interface AppCreateResult {
|
|
|
1382
1391
|
readonly projectPath: string;
|
|
1383
1392
|
readonly plan: ArchitecturePlan | null;
|
|
1384
1393
|
readonly featureResults: readonly FeatureBuildResult[];
|
|
1394
|
+
readonly buildVerification: BuildVerificationResult | null;
|
|
1385
1395
|
readonly crossVerification: CrossFeatureVerification | null;
|
|
1386
1396
|
readonly totalDurationMs: number;
|
|
1387
1397
|
readonly auditTrail: readonly AuditEntry[];
|
|
@@ -1411,6 +1421,40 @@ export interface CrossFeatureCheck {
|
|
|
1411
1421
|
readonly verdict: 'PASS' | 'FAIL';
|
|
1412
1422
|
readonly evidence: string;
|
|
1413
1423
|
}
|
|
1424
|
+
export type BuildStepStatus = 'pass' | 'fail' | 'skip' | 'timeout';
|
|
1425
|
+
export interface BuildStepResult {
|
|
1426
|
+
readonly step: 'install' | 'build' | 'start' | 'health_check';
|
|
1427
|
+
readonly status: BuildStepStatus;
|
|
1428
|
+
readonly command: string;
|
|
1429
|
+
readonly stdout: string;
|
|
1430
|
+
readonly stderr: string;
|
|
1431
|
+
readonly durationMs: number;
|
|
1432
|
+
readonly exitCode: number | null;
|
|
1433
|
+
}
|
|
1434
|
+
export type BuildErrorCategory = 'type_error' | 'module_not_found' | 'syntax_error' | 'runtime_error' | 'dependency_error' | 'other';
|
|
1435
|
+
export interface BuildError {
|
|
1436
|
+
readonly file: string;
|
|
1437
|
+
readonly line: number | null;
|
|
1438
|
+
readonly message: string;
|
|
1439
|
+
readonly category: BuildErrorCategory;
|
|
1440
|
+
}
|
|
1441
|
+
export interface BuildRepairAttempt {
|
|
1442
|
+
readonly attempt: number;
|
|
1443
|
+
readonly errors: readonly BuildError[];
|
|
1444
|
+
readonly filesModified: readonly string[];
|
|
1445
|
+
readonly repairSucceeded: boolean;
|
|
1446
|
+
readonly durationMs: number;
|
|
1447
|
+
}
|
|
1448
|
+
export interface BuildVerificationResult {
|
|
1449
|
+
readonly status: 'pass' | 'fail' | 'repaired' | 'skipped';
|
|
1450
|
+
readonly install: BuildStepResult | null;
|
|
1451
|
+
readonly build: BuildStepResult | null;
|
|
1452
|
+
readonly start: BuildStepResult | null;
|
|
1453
|
+
readonly healthCheck: BuildStepResult | null;
|
|
1454
|
+
readonly repairAttempts: readonly BuildRepairAttempt[];
|
|
1455
|
+
readonly finalErrors: readonly BuildError[];
|
|
1456
|
+
readonly totalDurationMs: number;
|
|
1457
|
+
}
|
|
1414
1458
|
export interface AppCreateOptions {
|
|
1415
1459
|
readonly outputPath: string;
|
|
1416
1460
|
readonly models?: Partial<Record<AgentSpecialization, string>>;
|
|
@@ -1420,4 +1464,6 @@ export interface AppCreateOptions {
|
|
|
1420
1464
|
readonly sequential?: boolean;
|
|
1421
1465
|
readonly noDirectMode?: boolean;
|
|
1422
1466
|
readonly fullVerification?: boolean;
|
|
1467
|
+
readonly maxBuildRepairAttempts?: number;
|
|
1468
|
+
readonly skipBuildVerification?: boolean;
|
|
1423
1469
|
}
|