({ claudeCommand, model, cwd, mode, contextFile, contextText, tier, maxRetries })
| 1361 | } |
| 1362 | |
| 1363 | async function runL3Build({ claudeCommand, model, cwd, mode, contextFile, contextText, tier, maxRetries }) { |
| 1364 | const basePrompt = buildL3BuildPrompt(mode, contextFile, contextText, tier); |
| 1365 | let totalUsage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 }; |
| 1366 | let totalDurationMs = 0; |
| 1367 | let totalCostUsd = 0; |
| 1368 | let lastResult = null; |
| 1369 | let testResult = null; |
| 1370 | |
| 1371 | for (let attempt = 1; attempt <= maxRetries; attempt++) { |
| 1372 | const prompt = attempt === 1 ? basePrompt : buildRetryPrompt(basePrompt, testResult); |
| 1373 | const args = buildClaudeArgs({ cwd, model }); |
| 1374 | const { stdout, stderr, exitCode } = await spawnCapture(claudeCommand, args, { |
| 1375 | cwd, |
| 1376 | input: prompt, |
| 1377 | timeoutMs: CLAUDE_TIMEOUT_MS, |
| 1378 | allowFailure: true, |
| 1379 | }); |
| 1380 | const parsed = parseClaudeJson(stdout); |
| 1381 | lastResult = { ...parsed, stdout, stderr, exitCode }; |
| 1382 | |
| 1383 | totalUsage.inputTokens += parsed.usage.inputTokens; |
| 1384 | totalUsage.outputTokens += parsed.usage.outputTokens; |
| 1385 | totalUsage.totalTokens += parsed.usage.totalTokens; |
| 1386 | totalDurationMs += parsed.durationMs; |
| 1387 | totalCostUsd += parsed.costUsd; |
| 1388 | |
| 1389 | testResult = await runTests(cwd); |
| 1390 | if (testResult.testsTotal > 0 && testResult.testsPassed === testResult.testsTotal) { |
| 1391 | return { |
| 1392 | usage: totalUsage, |
| 1393 | attempts: attempt, |
| 1394 | testResult, |
| 1395 | completed: true, |
| 1396 | durationMs: totalDurationMs, |
| 1397 | costUsd: totalCostUsd, |
| 1398 | lastResult, |
| 1399 | }; |
| 1400 | } |
| 1401 | } |
| 1402 | |
| 1403 | return { |
| 1404 | usage: totalUsage, |
| 1405 | attempts: maxRetries, |
| 1406 | testResult, |
| 1407 | completed: false, |
| 1408 | durationMs: totalDurationMs, |
| 1409 | costUsd: totalCostUsd, |
| 1410 | lastResult, |
| 1411 | }; |
| 1412 | } |
| 1413 | |
| 1414 | /** |
| 1415 | * L3 Full Workflow: Design → Handoff → Build. |
no test coverage detected