tryassay 0.14.0 → 0.15.1

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.
@@ -0,0 +1,571 @@
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
+ framework;
16
+ options;
17
+ constructor(projectPath, options) {
18
+ this.projectPath = projectPath;
19
+ this.framework = (options.framework ?? 'next.js').toLowerCase();
20
+ this.options = {
21
+ maxRepairAttempts: options.maxRepairAttempts,
22
+ installTimeoutMs: options.installTimeoutMs ?? 120_000,
23
+ buildTimeoutMs: options.buildTimeoutMs ?? 120_000,
24
+ startStabilityMs: options.startStabilityMs ?? 15_000,
25
+ healthCheckTimeoutMs: options.healthCheckTimeoutMs ?? 10_000,
26
+ healthCheckRetries: options.healthCheckRetries ?? 3,
27
+ codeModel: options.codeModel,
28
+ onReconcileDeps: options.onReconcileDeps,
29
+ };
30
+ }
31
+ /** Run the full build-test-repair loop. */
32
+ async verify() {
33
+ const loopStart = Date.now();
34
+ const repairAttempts = [];
35
+ let lastInstall = null;
36
+ let lastBuild = null;
37
+ let lastStart = null;
38
+ let lastHealthCheck = null;
39
+ let allErrors = [];
40
+ for (let attempt = 0; attempt <= this.options.maxRepairAttempts; attempt++) {
41
+ allErrors = [];
42
+ // Step 1: npm install
43
+ lastInstall = await this.runInstall();
44
+ if (lastInstall.status === 'fail' || lastInstall.status === 'timeout') {
45
+ allErrors.push(...this.parseErrors(lastInstall.stderr + '\n' + lastInstall.stdout));
46
+ if (allErrors.length === 0) {
47
+ allErrors.push({ file: 'package.json', line: null, message: lastInstall.stderr.slice(0, 500) || 'npm install failed', category: 'dependency_error' });
48
+ }
49
+ if (attempt < this.options.maxRepairAttempts) {
50
+ const repairResult = await this.runRepair(attempt + 1, allErrors);
51
+ repairAttempts.push(repairResult);
52
+ if (!repairResult.repairSucceeded)
53
+ continue;
54
+ continue; // Retry from install
55
+ }
56
+ break;
57
+ }
58
+ // Step 2: npm run build
59
+ lastBuild = await this.runBuild();
60
+ if (lastBuild.status === 'fail' || lastBuild.status === 'timeout') {
61
+ allErrors.push(...this.parseErrors(lastBuild.stderr + '\n' + lastBuild.stdout));
62
+ if (allErrors.length === 0) {
63
+ allErrors.push({ file: 'unknown', line: null, message: lastBuild.stderr.slice(0, 500) || 'Build failed', category: 'other' });
64
+ }
65
+ if (attempt < this.options.maxRepairAttempts) {
66
+ const repairResult = await this.runRepair(attempt + 1, allErrors);
67
+ repairAttempts.push(repairResult);
68
+ continue; // Retry from install
69
+ }
70
+ break;
71
+ }
72
+ // Step 3: Start dev server and check stability
73
+ lastStart = await this.runStart();
74
+ if (lastStart.status === 'fail' || lastStart.status === 'timeout') {
75
+ allErrors.push(...this.parseErrors(lastStart.stderr + '\n' + lastStart.stdout));
76
+ if (allErrors.length === 0) {
77
+ allErrors.push({ file: 'unknown', line: null, message: lastStart.stderr.slice(0, 500) || 'Dev server failed to start', category: 'runtime_error' });
78
+ }
79
+ if (attempt < this.options.maxRepairAttempts) {
80
+ const repairResult = await this.runRepair(attempt + 1, allErrors);
81
+ repairAttempts.push(repairResult);
82
+ continue; // Retry from install
83
+ }
84
+ break;
85
+ }
86
+ // Step 4: Health check
87
+ const port = this.detectPort();
88
+ lastHealthCheck = await this.runHealthCheck(port);
89
+ // If all steps pass, we're done
90
+ if (lastInstall.status === 'pass' && lastBuild.status === 'pass') {
91
+ const status = repairAttempts.length > 0 ? 'repaired' : 'pass';
92
+ return {
93
+ status,
94
+ install: lastInstall,
95
+ build: lastBuild,
96
+ start: lastStart,
97
+ healthCheck: lastHealthCheck,
98
+ repairAttempts,
99
+ finalErrors: [],
100
+ totalDurationMs: Date.now() - loopStart,
101
+ };
102
+ }
103
+ }
104
+ // Max attempts exhausted or unrecoverable failure
105
+ return {
106
+ status: 'fail',
107
+ install: lastInstall,
108
+ build: lastBuild,
109
+ start: lastStart,
110
+ healthCheck: lastHealthCheck,
111
+ repairAttempts,
112
+ finalErrors: allErrors,
113
+ totalDurationMs: Date.now() - loopStart,
114
+ };
115
+ }
116
+ // ── Build Steps ────────────────────────────────────────────
117
+ async runInstall() {
118
+ const start = Date.now();
119
+ const result = await this.execCommand('npm install', this.options.installTimeoutMs);
120
+ return {
121
+ step: 'install',
122
+ status: this.resultStatus(result),
123
+ command: 'npm install',
124
+ stdout: result.stdout.slice(0, 5000),
125
+ stderr: result.stderr.slice(0, 5000),
126
+ durationMs: Date.now() - start,
127
+ exitCode: result.exitCode,
128
+ };
129
+ }
130
+ async runBuild() {
131
+ const start = Date.now();
132
+ // Check if build script exists
133
+ const hasBuild = await this.hasPkgScript('build');
134
+ if (!hasBuild) {
135
+ return {
136
+ step: 'build',
137
+ status: 'skip',
138
+ command: 'npm run build',
139
+ stdout: 'No build script in package.json',
140
+ stderr: '',
141
+ durationMs: 0,
142
+ exitCode: null,
143
+ };
144
+ }
145
+ const result = await this.execCommand('npm run build', this.options.buildTimeoutMs);
146
+ return {
147
+ step: 'build',
148
+ status: this.resultStatus(result),
149
+ command: 'npm run build',
150
+ stdout: result.stdout.slice(0, 5000),
151
+ stderr: result.stderr.slice(0, 5000),
152
+ durationMs: Date.now() - start,
153
+ exitCode: result.exitCode,
154
+ };
155
+ }
156
+ async runStart() {
157
+ // For Electron apps, skip HTTP server spawn — run TypeScript compile check instead
158
+ if (this.framework.includes('electron')) {
159
+ return this.runElectronCompileCheck();
160
+ }
161
+ const start = Date.now();
162
+ const hasDev = await this.hasPkgScript('dev');
163
+ const hasStart = await this.hasPkgScript('start');
164
+ const script = hasDev ? 'dev' : hasStart ? 'start' : null;
165
+ if (!script) {
166
+ return {
167
+ step: 'start',
168
+ status: 'skip',
169
+ command: 'npm run dev',
170
+ stdout: 'No dev or start script in package.json',
171
+ stderr: '',
172
+ durationMs: 0,
173
+ exitCode: null,
174
+ };
175
+ }
176
+ // Spawn the dev server and wait for stability
177
+ let serverProcess = null;
178
+ let stdout = '';
179
+ let stderr = '';
180
+ try {
181
+ serverProcess = spawn('npm', ['run', script], {
182
+ cwd: this.projectPath,
183
+ env: { ...process.env, NODE_ENV: 'development', BROWSER: 'none' },
184
+ stdio: ['ignore', 'pipe', 'pipe'],
185
+ detached: true,
186
+ });
187
+ serverProcess.stdout?.on('data', (data) => { stdout += data.toString(); });
188
+ serverProcess.stderr?.on('data', (data) => { stderr += data.toString(); });
189
+ // Wait for "Ready" indicator or stability period
190
+ const stable = await this.waitForReady(serverProcess, stdout, () => stdout, this.options.startStabilityMs);
191
+ return {
192
+ step: 'start',
193
+ status: stable ? 'pass' : 'fail',
194
+ command: `npm run ${script}`,
195
+ stdout: stdout.slice(0, 5000),
196
+ stderr: stderr.slice(0, 5000),
197
+ durationMs: Date.now() - start,
198
+ exitCode: stable ? 0 : 1,
199
+ };
200
+ }
201
+ catch (err) {
202
+ return {
203
+ step: 'start',
204
+ status: 'fail',
205
+ command: `npm run ${script}`,
206
+ stdout: stdout.slice(0, 5000),
207
+ stderr: (stderr + '\n' + (err instanceof Error ? err.message : String(err))).slice(0, 5000),
208
+ durationMs: Date.now() - start,
209
+ exitCode: 1,
210
+ };
211
+ }
212
+ finally {
213
+ // Kill the dev server process tree
214
+ if (serverProcess?.pid) {
215
+ try {
216
+ process.kill(-serverProcess.pid, 'SIGTERM');
217
+ }
218
+ catch { /* already dead */ }
219
+ // Force kill after 2s
220
+ setTimeout(() => {
221
+ try {
222
+ process.kill(-serverProcess.pid, 'SIGKILL');
223
+ }
224
+ catch { /* already dead */ }
225
+ }, 2000);
226
+ }
227
+ }
228
+ }
229
+ /** Electron compile check — runs `npx tsc --noEmit` on the main process TypeScript. */
230
+ async runElectronCompileCheck() {
231
+ const start = Date.now();
232
+ const result = await this.execCommand('npx tsc --noEmit', this.options.buildTimeoutMs);
233
+ return {
234
+ step: 'start',
235
+ status: this.resultStatus(result),
236
+ command: 'npx tsc --noEmit',
237
+ stdout: result.stdout.slice(0, 5000),
238
+ stderr: result.stderr.slice(0, 5000),
239
+ durationMs: Date.now() - start,
240
+ exitCode: result.exitCode,
241
+ };
242
+ }
243
+ async runHealthCheck(port) {
244
+ // For Electron apps, check that build outputs exist instead of HTTP fetch
245
+ if (this.framework.includes('electron')) {
246
+ return this.runElectronOutputCheck();
247
+ }
248
+ const start = Date.now();
249
+ for (let retry = 0; retry < this.options.healthCheckRetries; retry++) {
250
+ try {
251
+ const controller = new AbortController();
252
+ const timeout = setTimeout(() => controller.abort(), this.options.healthCheckTimeoutMs);
253
+ const response = await fetch(`http://localhost:${port}/`, {
254
+ signal: controller.signal,
255
+ });
256
+ clearTimeout(timeout);
257
+ if (response.ok || response.status < 500) {
258
+ return {
259
+ step: 'health_check',
260
+ status: 'pass',
261
+ command: `GET http://localhost:${port}/`,
262
+ stdout: `HTTP ${response.status} ${response.statusText}`,
263
+ stderr: '',
264
+ durationMs: Date.now() - start,
265
+ exitCode: 0,
266
+ };
267
+ }
268
+ }
269
+ catch {
270
+ // Retry after delay
271
+ if (retry < this.options.healthCheckRetries - 1) {
272
+ await this.sleep(2000);
273
+ }
274
+ }
275
+ }
276
+ return {
277
+ step: 'health_check',
278
+ status: 'fail',
279
+ command: `GET http://localhost:${port}/`,
280
+ stdout: '',
281
+ stderr: `Health check failed after ${this.options.healthCheckRetries} retries`,
282
+ durationMs: Date.now() - start,
283
+ exitCode: 1,
284
+ };
285
+ }
286
+ /** Electron output check — verify that dist/ or out/ build outputs exist. */
287
+ async runElectronOutputCheck() {
288
+ const start = Date.now();
289
+ const candidates = ['dist', 'out', 'build'];
290
+ const found = [];
291
+ for (const dir of candidates) {
292
+ try {
293
+ const { readdir: rd } = await import('node:fs/promises');
294
+ const entries = await rd(join(this.projectPath, dir));
295
+ if (entries.length > 0)
296
+ found.push(dir);
297
+ }
298
+ catch {
299
+ // Directory doesn't exist
300
+ }
301
+ }
302
+ if (found.length > 0) {
303
+ return {
304
+ step: 'health_check',
305
+ status: 'pass',
306
+ command: 'check build output directories',
307
+ stdout: `Build outputs found in: ${found.join(', ')}`,
308
+ stderr: '',
309
+ durationMs: Date.now() - start,
310
+ exitCode: 0,
311
+ };
312
+ }
313
+ // If no build output dirs found but build passed, that's still OK for Electron
314
+ // (electron-vite may output differently)
315
+ return {
316
+ step: 'health_check',
317
+ status: 'skip',
318
+ command: 'check build output directories',
319
+ stdout: 'No dist/out/build directory found — skipping output check for Electron',
320
+ stderr: '',
321
+ durationMs: Date.now() - start,
322
+ exitCode: null,
323
+ };
324
+ }
325
+ // ── Error Parsing ──────────────────────────────────────────
326
+ parseErrors(output) {
327
+ const errors = [];
328
+ const lines = output.split('\n');
329
+ for (const line of lines) {
330
+ // TypeScript errors: file(line,col): error TS####: message
331
+ const tsMatch = line.match(/^(.+?)\((\d+),\d+\):\s*error\s+TS\d+:\s*(.+)$/);
332
+ if (tsMatch) {
333
+ errors.push({ file: tsMatch[1], line: parseInt(tsMatch[2], 10), message: tsMatch[3], category: 'type_error' });
334
+ continue;
335
+ }
336
+ // TypeScript errors (alternative format): file:line:col - error TS####: message
337
+ const tsMatch2 = line.match(/^(.+?):(\d+):\d+\s*-\s*error\s+TS\d+:\s*(.+)$/);
338
+ if (tsMatch2) {
339
+ errors.push({ file: tsMatch2[1], line: parseInt(tsMatch2[2], 10), message: tsMatch2[3], category: 'type_error' });
340
+ continue;
341
+ }
342
+ // Next.js / Webpack module not found
343
+ const moduleMatch = line.match(/Module not found:\s*(?:Can't resolve|Error:\s*Can't resolve)\s*'([^']+)'/);
344
+ if (moduleMatch) {
345
+ errors.push({ file: 'package.json', line: null, message: `Module not found: '${moduleMatch[1]}'`, category: 'module_not_found' });
346
+ continue;
347
+ }
348
+ // SyntaxError
349
+ const syntaxMatch = line.match(/SyntaxError:\s*(.+)/);
350
+ if (syntaxMatch) {
351
+ errors.push({ file: 'unknown', line: null, message: syntaxMatch[1], category: 'syntax_error' });
352
+ continue;
353
+ }
354
+ // npm ERR! with dependency info
355
+ const npmErrMatch = line.match(/npm ERR!\s+(.+)/);
356
+ if (npmErrMatch && (line.includes('peer dep') || line.includes('ERESOLVE') || line.includes('could not resolve'))) {
357
+ errors.push({ file: 'package.json', line: null, message: npmErrMatch[1], category: 'dependency_error' });
358
+ continue;
359
+ }
360
+ // Generic Error:
361
+ const errorMatch = line.match(/^Error:\s*(.+)/);
362
+ if (errorMatch) {
363
+ errors.push({ file: 'unknown', line: null, message: errorMatch[1], category: 'other' });
364
+ continue;
365
+ }
366
+ }
367
+ // Deduplicate by message
368
+ const seen = new Set();
369
+ return errors.filter(e => {
370
+ const key = `${e.file}:${e.line}:${e.message}`;
371
+ if (seen.has(key))
372
+ return false;
373
+ seen.add(key);
374
+ return true;
375
+ });
376
+ }
377
+ // ── Repair via CodeAgent ───────────────────────────────────
378
+ async runRepair(attempt, errors) {
379
+ const repairStart = Date.now();
380
+ const filesModified = [];
381
+ // Group errors by file
382
+ const errorsByFile = new Map();
383
+ for (const error of errors) {
384
+ const existing = errorsByFile.get(error.file) ?? [];
385
+ existing.push(error);
386
+ errorsByFile.set(error.file, existing);
387
+ }
388
+ // Read failing file contents
389
+ const fileContents = [];
390
+ for (const [filePath, fileErrors] of errorsByFile) {
391
+ if (filePath === 'unknown' || filePath === 'package.json') {
392
+ fileContents.push({ path: filePath, content: '', errors: fileErrors });
393
+ continue;
394
+ }
395
+ try {
396
+ const absPath = filePath.startsWith('/') ? filePath : join(this.projectPath, filePath);
397
+ const content = await readFile(absPath, 'utf-8');
398
+ fileContents.push({ path: filePath, content, errors: fileErrors });
399
+ }
400
+ catch {
401
+ fileContents.push({ path: filePath, content: '(file not readable)', errors: fileErrors });
402
+ }
403
+ }
404
+ // Build the repair goal
405
+ const errorSummary = fileContents.map(fc => {
406
+ const errLines = fc.errors.map(e => ` - ${e.category}: ${e.message}${e.line ? ` (line ${e.line})` : ''}`).join('\n');
407
+ return `File: ${fc.path}\nErrors:\n${errLines}\n${fc.content ? `Current content:\n\`\`\`\n${fc.content.slice(0, 3000)}\n\`\`\`` : ''}`;
408
+ }).join('\n\n---\n\n');
409
+ // Also read package.json for context
410
+ let pkgJson = '';
411
+ try {
412
+ pkgJson = await readFile(join(this.projectPath, 'package.json'), 'utf-8');
413
+ }
414
+ catch { /* no package.json */ }
415
+ const repairGoal = `Fix these build errors in a generated application. Return corrected files.
416
+
417
+ Attempt ${attempt} of ${this.options.maxRepairAttempts}.
418
+
419
+ Build errors found:
420
+ ${errorSummary}
421
+
422
+ ${pkgJson ? `package.json:\n\`\`\`json\n${pkgJson.slice(0, 2000)}\n\`\`\`` : ''}
423
+
424
+ 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.`;
425
+ const messageBus = new MessageBus();
426
+ const codeAgent = new CodeAgent(messageBus, { model: this.options.codeModel });
427
+ try {
428
+ const result = await codeAgent.executeTask({
429
+ taskId: `repair-${attempt}-${randomUUID().slice(0, 8)}`,
430
+ goal: repairGoal,
431
+ constraints: ['Fix build errors only — do not add new features or refactor working code.'],
432
+ dependencies: [],
433
+ contextRefs: [],
434
+ });
435
+ if (result.status === 'failed') {
436
+ return {
437
+ attempt,
438
+ errors,
439
+ filesModified: [],
440
+ repairSucceeded: false,
441
+ durationMs: Date.now() - repairStart,
442
+ };
443
+ }
444
+ // Write repaired files to disk
445
+ let touchedPackageJson = false;
446
+ for (const artifact of result.artifacts) {
447
+ if (!artifact.path)
448
+ continue;
449
+ const absPath = join(this.projectPath, artifact.path);
450
+ try {
451
+ await mkdir(dirname(absPath), { recursive: true });
452
+ await writeFile(absPath, artifact.content, 'utf-8');
453
+ filesModified.push(artifact.path);
454
+ if (artifact.path === 'package.json' || artifact.path.endsWith('/package.json')) {
455
+ touchedPackageJson = true;
456
+ }
457
+ }
458
+ catch {
459
+ // Best-effort write
460
+ }
461
+ }
462
+ // Re-reconcile deps if package.json was touched
463
+ if (touchedPackageJson && this.options.onReconcileDeps) {
464
+ await this.options.onReconcileDeps();
465
+ }
466
+ return {
467
+ attempt,
468
+ errors,
469
+ filesModified,
470
+ repairSucceeded: filesModified.length > 0,
471
+ durationMs: Date.now() - repairStart,
472
+ };
473
+ }
474
+ catch {
475
+ return {
476
+ attempt,
477
+ errors,
478
+ filesModified: [],
479
+ repairSucceeded: false,
480
+ durationMs: Date.now() - repairStart,
481
+ };
482
+ }
483
+ }
484
+ // ── Process Helpers ────────────────────────────────────────
485
+ execCommand(command, timeoutMs) {
486
+ return new Promise((resolve) => {
487
+ exec(command, {
488
+ cwd: this.projectPath,
489
+ timeout: timeoutMs,
490
+ maxBuffer: 10 * 1024 * 1024, // 10MB
491
+ env: { ...process.env, NODE_ENV: 'development', CI: 'true' },
492
+ }, (error, stdout, stderr) => {
493
+ const timedOut = error?.killed === true;
494
+ resolve({
495
+ stdout: stdout ?? '',
496
+ stderr: stderr ?? '',
497
+ exitCode: timedOut ? null : (error?.code !== undefined ? (typeof error.code === 'number' ? error.code : 1) : 0),
498
+ timedOut,
499
+ });
500
+ });
501
+ });
502
+ }
503
+ waitForReady(proc, _initialStdout, getStdout, stabilityMs) {
504
+ return new Promise((resolve) => {
505
+ const readyPatterns = [
506
+ /ready/i,
507
+ /started.*on/i,
508
+ /listening.*on/i,
509
+ /compiled.*successfully/i,
510
+ /Local:\s+http/i,
511
+ ];
512
+ let resolved = false;
513
+ const done = (result) => {
514
+ if (!resolved) {
515
+ resolved = true;
516
+ resolve(result);
517
+ }
518
+ };
519
+ // Check for ready pattern in output
520
+ const checkInterval = setInterval(() => {
521
+ const output = getStdout();
522
+ if (readyPatterns.some(p => p.test(output))) {
523
+ clearInterval(checkInterval);
524
+ clearTimeout(stabilityTimeout);
525
+ done(true);
526
+ }
527
+ }, 500);
528
+ // Timeout: if no ready pattern found, consider it a failure
529
+ const stabilityTimeout = setTimeout(() => {
530
+ clearInterval(checkInterval);
531
+ // If process is still running, it might be okay (just no ready message)
532
+ done(!proc.killed && proc.exitCode === null);
533
+ }, stabilityMs);
534
+ // Process exit = failure
535
+ proc.on('exit', (code) => {
536
+ clearInterval(checkInterval);
537
+ clearTimeout(stabilityTimeout);
538
+ done(code === 0);
539
+ });
540
+ proc.on('error', () => {
541
+ clearInterval(checkInterval);
542
+ clearTimeout(stabilityTimeout);
543
+ done(false);
544
+ });
545
+ });
546
+ }
547
+ resultStatus(result) {
548
+ if (result.timedOut)
549
+ return 'timeout';
550
+ if (result.exitCode === 0)
551
+ return 'pass';
552
+ return 'fail';
553
+ }
554
+ async hasPkgScript(name) {
555
+ try {
556
+ const pkg = JSON.parse(await readFile(join(this.projectPath, 'package.json'), 'utf-8'));
557
+ return typeof pkg.scripts?.[name] === 'string';
558
+ }
559
+ catch {
560
+ return false;
561
+ }
562
+ }
563
+ detectPort() {
564
+ // Default Next.js port
565
+ return 3000;
566
+ }
567
+ sleep(ms) {
568
+ return new Promise(resolve => setTimeout(resolve, ms));
569
+ }
570
+ }
571
+ //# 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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"}