flanders 0.0.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,696 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Implement = void 0;
4
+ const ClaudeSession_1 = require("../ClaudeSession");
5
+ const fsUtils_1 = require("../fsUtils");
6
+ const Git_1 = require("../Git");
7
+ const PlanFile_1 = require("../PlanFile");
8
+ const prompts_1 = require("../prompts");
9
+ const ScriptRunner_1 = require("../ScriptRunner");
10
+ const BottomBlock_1 = require("../ui/BottomBlock");
11
+ const formatters_1 = require("../ui/formatters");
12
+ const Workspace_1 = require("../Workspace");
13
+ const MAX_ITER = 5;
14
+ class LineBufferedBlock {
15
+ _block;
16
+ _stdoutBuf = "";
17
+ _stderrBuf = "";
18
+ constructor(_block) {
19
+ this._block = _block;
20
+ }
21
+ write(text) {
22
+ this._stdoutBuf += text;
23
+ const idx = this._stdoutBuf.lastIndexOf("\n");
24
+ if (idx !== -1) {
25
+ this._block.writeAbove(this._stdoutBuf.slice(0, idx + 1));
26
+ this._stdoutBuf = this._stdoutBuf.slice(idx + 1);
27
+ }
28
+ }
29
+ writeError(text) {
30
+ this._stderrBuf += text;
31
+ const idx = this._stderrBuf.lastIndexOf("\n");
32
+ if (idx !== -1) {
33
+ this._block.writeAbove(this._stderrBuf.slice(0, idx + 1));
34
+ this._stderrBuf = this._stderrBuf.slice(idx + 1);
35
+ }
36
+ }
37
+ flush() {
38
+ if (this._stdoutBuf) {
39
+ this._block.writeAbove(this._stdoutBuf);
40
+ this._stdoutBuf = "";
41
+ }
42
+ if (this._stderrBuf) {
43
+ this._block.writeAbove(this._stderrBuf);
44
+ this._stderrBuf = "";
45
+ }
46
+ }
47
+ }
48
+ class Implement {
49
+ _options;
50
+ _contexts;
51
+ _disposed = false;
52
+ _contractList = [];
53
+ _ruleList = [];
54
+ _workspace = null;
55
+ _block = null;
56
+ _buffered;
57
+ _currentWorkerSessionId = null;
58
+ _currentPrepSessionId = null;
59
+ _activeSession = null;
60
+ _activeScript = null;
61
+ _currentIndexLabel = "";
62
+ _currentIteration = 0;
63
+ _currentTask = null;
64
+ _taskStartedAt = 0;
65
+ _taskRateLimitMs = 0;
66
+ _taskRateLimitStartedAt = null;
67
+ _taskTokens = { it: 0, ot: 0 };
68
+ _runPromise;
69
+ constructor(rawArgs, _options, _contexts) {
70
+ this._options = _options;
71
+ this._contexts = _contexts;
72
+ this._runPromise = this._run(rawArgs);
73
+ this._runPromise.catch(() => { });
74
+ }
75
+ result() {
76
+ return this._runPromise;
77
+ }
78
+ async _run(rawArgs) {
79
+ const block = new BottomBlock_1.BottomBlock({
80
+ write: text => this._contexts.output.write(text),
81
+ columns: () => this._contexts.output.columns(),
82
+ onResize: listener => this._contexts.output.onResize(listener)
83
+ }, this._contexts.time);
84
+ this._block = block;
85
+ block.mount();
86
+ this._buffered = new LineBufferedBlock(block);
87
+ try {
88
+ const positional = [];
89
+ let noGitFlag = false;
90
+ for (const arg of rawArgs) {
91
+ if (arg === "--no-git") {
92
+ noGitFlag = true;
93
+ }
94
+ else if (arg.startsWith("-")) {
95
+ this._buffered.writeError(`Unknown flag: ${arg}\n`);
96
+ this._finalizeBlock("Failed");
97
+ return 1;
98
+ }
99
+ else {
100
+ positional.push(arg);
101
+ }
102
+ }
103
+ const planPath = await this._selectPlan(positional);
104
+ if (this._disposed) {
105
+ this._finalizeBlock("Interrupted");
106
+ return 1;
107
+ }
108
+ if (!planPath) {
109
+ this._finalizeBlock("Failed");
110
+ return 1;
111
+ }
112
+ const plan = await PlanFile_1.PlanFile.load(planPath, this._contexts.fs);
113
+ const initialParse = plan.parse();
114
+ if (initialParse.malformed.length > 0) {
115
+ this._buffered.writeError(`Plan ${planPath} contains malformed checkbox lines:\n`);
116
+ for (const m of initialParse.malformed) {
117
+ this._buffered.writeError(` line ${m.line}: ${m.raw}\n`);
118
+ }
119
+ this._finalizeBlock("Failed");
120
+ return 1;
121
+ }
122
+ if (initialParse.tasks.length === 0) {
123
+ this._buffered.writeError(`Plan ${planPath} has no task lines.\n`);
124
+ this._finalizeBlock("Failed");
125
+ return 1;
126
+ }
127
+ const totalTasks = initialParse.tasks.length;
128
+ const planTotals = plan.planTotals();
129
+ if (initialParse.tasks.every(t => t.done)) {
130
+ this._block.setHeader({ indexLabel: `${totalTasks}/${totalTasks}` });
131
+ this._block.setMetrics({ plan: { tokens: planTotals.it + planTotals.ot, seconds: planTotals.t } });
132
+ this._buffered.write("tasks completed\n");
133
+ this._finalizeBlock("Done");
134
+ return 0;
135
+ }
136
+ this._block.setHeader({ indexLabel: `0/${totalTasks}` });
137
+ this._block.setMetrics({ plan: { tokens: planTotals.it + planTotals.ot, seconds: planTotals.t } });
138
+ let gitActive = false;
139
+ if (!noGitFlag) {
140
+ if (await (0, Git_1.isGitAvailable)(this._contexts.script, this._contexts.time)) {
141
+ gitActive = await (0, Git_1.isInsideWorkTree)(this._contexts.script, this._contexts.time, this._options.projectRoot);
142
+ }
143
+ }
144
+ if (gitActive) {
145
+ const pending = await (0, Git_1.countPendingChangesExcept)(this._contexts.script, this._contexts.time, this._options.projectRoot, planPath);
146
+ if (pending > 0) {
147
+ this._buffered.writeError("Working tree has uncommitted changes. Please commit or stash them before re-running.\n");
148
+ this._finalizeBlock("Failed");
149
+ return 1;
150
+ }
151
+ }
152
+ const contractFiles = await (0, fsUtils_1.listFilesRecursive)(this._contexts.fs, (0, fsUtils_1.joinPath)(this._options.projectRoot, "contracts"));
153
+ this._contractList = contractFiles.map(f => `contracts/${f}`);
154
+ const ruleFiles = await (0, fsUtils_1.listFilesRecursive)(this._contexts.fs, (0, fsUtils_1.joinPath)(this._options.projectRoot, "rules"));
155
+ this._ruleList = ruleFiles.map(f => `rules/${f}`);
156
+ this._workspace = new Workspace_1.Workspace(this._contexts.fs, this._contexts.platform);
157
+ const wsPaths = await this._workspace.setup();
158
+ await this._detectBuildAndTest(wsPaths);
159
+ if (this._disposed) {
160
+ this._finalizeBlock("Interrupted");
161
+ return 1;
162
+ }
163
+ for (;;) {
164
+ if (this._disposed) {
165
+ this._finalizeBlock("Interrupted");
166
+ return 1;
167
+ }
168
+ const open = plan.nextOpenTask();
169
+ if (!open) {
170
+ break;
171
+ }
172
+ const refreshed = plan.parse();
173
+ const completedSoFar = refreshed.tasks.filter(t => t.done).length;
174
+ const indexLabel = `${completedSoFar + 1}/${totalTasks}`;
175
+ const taskOk = await this._runTask(plan, open, wsPaths, indexLabel, completedSoFar, gitActive);
176
+ if (this._disposed) {
177
+ this._finalizeBlock("Interrupted");
178
+ return 1;
179
+ }
180
+ if (!taskOk) {
181
+ this._finalizeBlock("Hard stop");
182
+ return 1;
183
+ }
184
+ }
185
+ this._buffered.write("all tasks completed\n");
186
+ this._finalizeBlock("Done");
187
+ return 0;
188
+ }
189
+ catch (e) {
190
+ if (!this._disposed) {
191
+ this._buffered.writeError(`${e instanceof Error ? e.message : String(e)}\n`);
192
+ }
193
+ this._finalizeBlock(this._disposed ? "Interrupted" : "Failed");
194
+ return 1;
195
+ }
196
+ }
197
+ async _selectPlan(rawArgs) {
198
+ const plansFolder = (0, fsUtils_1.joinPath)(this._options.projectRoot, "plans");
199
+ if (rawArgs.length > 0) {
200
+ const arg = rawArgs.length === 1 ? rawArgs[0] : rawArgs.join(" ");
201
+ const direct = arg;
202
+ if (await this._contexts.fs.exists(direct)) {
203
+ return direct;
204
+ }
205
+ const inFolder = (0, fsUtils_1.joinPath)(plansFolder, arg);
206
+ if (await this._contexts.fs.exists(inFolder)) {
207
+ return inFolder;
208
+ }
209
+ this._buffered.writeError(`Plan file not found: ${arg}\n`);
210
+ return null;
211
+ }
212
+ const files = await (0, fsUtils_1.listFilesRecursive)(this._contexts.fs, plansFolder);
213
+ if (files.length === 0) {
214
+ this._buffered.writeError(`No plan files found in ${plansFolder}.\n`);
215
+ return null;
216
+ }
217
+ if (files.length === 1) {
218
+ return (0, fsUtils_1.joinPath)(plansFolder, files[0]);
219
+ }
220
+ return await this._promptPlanChoice(plansFolder, files);
221
+ }
222
+ _askOutput() {
223
+ return {
224
+ write: text => this._buffered.write(text),
225
+ writeError: text => this._buffered.writeError(text),
226
+ columns: () => this._contexts.output.columns(),
227
+ rows: () => this._contexts.output.rows(),
228
+ onResize: listener => this._contexts.output.onResize(listener)
229
+ };
230
+ }
231
+ async _promptPlanChoice(plansFolder, files) {
232
+ const askOutput = this._askOutput();
233
+ for (;;) {
234
+ if (this._disposed) {
235
+ return null;
236
+ }
237
+ const [answer] = await this._contexts.ask.askChoices([{
238
+ header: "Plan file",
239
+ question: `Multiple plans found in ${plansFolder}. Which one do you want to implement?`,
240
+ options: files.map(f => ({ label: f })),
241
+ multiSelect: false
242
+ }], askOutput);
243
+ if (this._disposed) {
244
+ return null;
245
+ }
246
+ if (answer && answer.picked.length > 0) {
247
+ return (0, fsUtils_1.joinPath)(plansFolder, answer.picked[0].label);
248
+ }
249
+ this._buffered.writeError("Please pick one of the listed plans by its number.\n");
250
+ }
251
+ }
252
+ async _detectBuildAndTest(ws) {
253
+ const prompt = prompts_1.prompts.detectBuildAndTest
254
+ .split("<BUILD_SCRIPT_PATH>").join(ws.buildScript)
255
+ .split("<TEST_SCRIPT_PATH>").join(ws.testScript)
256
+ .split("<RULE_LIST>").join(this._formatPathList(this._ruleList));
257
+ await this._runClaude(prompt);
258
+ }
259
+ _setActivity(activity) {
260
+ if (!this._currentTask)
261
+ return;
262
+ this._block.setHeader({
263
+ indexLabel: this._currentIndexLabel,
264
+ iteration: this._currentIteration,
265
+ activity,
266
+ taskNumber: this._currentTask.taskNumber || undefined,
267
+ title: this._currentTask.title
268
+ });
269
+ }
270
+ _activeSeconds() {
271
+ return Math.max(0, Math.floor((this._contexts.time.now() - this._taskStartedAt - this._taskRateLimitMs) / 1000));
272
+ }
273
+ async _persistMetrics(plan, line) {
274
+ try {
275
+ await plan.updateMetrics(line, { it: this._taskTokens.it, ot: this._taskTokens.ot, t: this._activeSeconds() });
276
+ }
277
+ catch (e) {
278
+ this._buffered.writeError(`metrics persist failed: ${this._stringifyError(e)}\n`);
279
+ }
280
+ }
281
+ _updateMetrics(plan) {
282
+ if (!this._currentTask || this._taskRateLimitStartedAt !== null)
283
+ return;
284
+ const planTotals = plan.planTotals();
285
+ this._block.setMetrics({
286
+ task: { tokens: this._taskTokens.it + this._taskTokens.ot, seconds: this._activeSeconds() },
287
+ plan: { tokens: planTotals.it + planTotals.ot, seconds: planTotals.t }
288
+ });
289
+ }
290
+ async _runTask(plan, task, ws, indexLabel, taskIndex, gitActive) {
291
+ this._currentTask = task;
292
+ this._currentIndexLabel = indexLabel;
293
+ this._currentWorkerSessionId = null;
294
+ this._currentPrepSessionId = null;
295
+ this._taskStartedAt = this._contexts.time.now();
296
+ this._taskRateLimitMs = 0;
297
+ this._taskRateLimitStartedAt = null;
298
+ this._taskTokens = { it: 0, ot: 0 };
299
+ this._updateMetrics(plan);
300
+ const prepOk = await this._prepStage(plan, task, ws, taskIndex);
301
+ if (this._disposed) {
302
+ return false;
303
+ }
304
+ if (!prepOk) {
305
+ return false;
306
+ }
307
+ let iteration = 0;
308
+ for (;;) {
309
+ iteration++;
310
+ this._currentIteration = iteration;
311
+ if (iteration > MAX_ITER) {
312
+ this._workspace.preserveOnDispose();
313
+ this._buffered.writeError(`Hard stop: task at line ${task.line} ("${task.title}") exceeded ${MAX_ITER} iterations. Inspect logs at ${ws.root}.\n`);
314
+ return false;
315
+ }
316
+ if (this._disposed) {
317
+ return false;
318
+ }
319
+ this._setActivity("implementing");
320
+ const workerOk = await this._workerStage(plan, task, ws, iteration);
321
+ if (this._disposed) {
322
+ return false;
323
+ }
324
+ if (!workerOk) {
325
+ continue;
326
+ }
327
+ this._setActivity("building");
328
+ const buildOk = await this._buildStage(plan, task.line, ws, iteration);
329
+ if (this._disposed) {
330
+ return false;
331
+ }
332
+ if (!buildOk) {
333
+ continue;
334
+ }
335
+ this._setActivity("testing");
336
+ const testOk = await this._testStage(plan, task.line, ws, iteration);
337
+ if (this._disposed) {
338
+ return false;
339
+ }
340
+ if (!testOk) {
341
+ continue;
342
+ }
343
+ this._setActivity("reviewing");
344
+ const reviewOk = await this._reviewerStage(plan, task, ws, iteration);
345
+ if (this._disposed) {
346
+ return false;
347
+ }
348
+ if (!reviewOk) {
349
+ continue;
350
+ }
351
+ await plan.markDone(task.line, { it: this._taskTokens.it, ot: this._taskTokens.ot, t: this._activeSeconds() });
352
+ if (gitActive) {
353
+ const commitMessage = task.taskNumber ? `${task.taskNumber} ${task.title}` : task.title;
354
+ const gitOutput = {
355
+ write: text => this._buffered.write(text),
356
+ writeError: text => this._buffered.writeError(text),
357
+ columns: () => this._contexts.output.columns(),
358
+ rows: () => this._contexts.output.rows(),
359
+ onResize: listener => this._contexts.output.onResize(listener)
360
+ };
361
+ const addResult = await (0, Git_1.addAll)(this._contexts.script, this._contexts.time, gitOutput, this._options.projectRoot);
362
+ if (addResult.code !== 0) {
363
+ await this._writeErrorLog(ws, `git add -A failed (exit ${addResult.code})\n--- stdout ---\n${addResult.stdout}\n--- stderr ---\n${addResult.stderr}`);
364
+ await plan.markOpen(task.line, { it: this._taskTokens.it, ot: this._taskTokens.ot, t: this._activeSeconds() });
365
+ continue;
366
+ }
367
+ const commitResult = await (0, Git_1.commit)(this._contexts.script, this._contexts.time, gitOutput, this._options.projectRoot, commitMessage);
368
+ if (commitResult.code !== 0) {
369
+ await this._writeErrorLog(ws, `git commit failed (exit ${commitResult.code})\n--- stdout ---\n${commitResult.stdout}\n--- stderr ---\n${commitResult.stderr}`);
370
+ await plan.markOpen(task.line, { it: this._taskTokens.it, ot: this._taskTokens.ot, t: this._activeSeconds() });
371
+ continue;
372
+ }
373
+ }
374
+ const planTotals = plan.planTotals();
375
+ const snapshot = (0, formatters_1.formatSnapshotBlock)(indexLabel, iteration, task.taskNumber || undefined, task.title, this._taskTokens.it + this._taskTokens.ot, this._activeSeconds(), planTotals.it + planTotals.ot, planTotals.t, this._contexts.output.columns());
376
+ this._block.writeAbove(snapshot);
377
+ this._updateMetrics(plan);
378
+ return true;
379
+ }
380
+ }
381
+ async _prepStage(plan, task, ws, taskIndex) {
382
+ const prompt = prompts_1.prompts.prep
383
+ .split("<PLAN_PATH>").join(plan.path)
384
+ .split("<TASK_LINE>").join(String(task.line))
385
+ .split("<TASK_TITLE>").join(task.title)
386
+ .split("<CONTRACT_LIST>").join(this._formatPathList(this._contractList))
387
+ .split("<RULE_LIST>").join(this._formatPathList(this._ruleList));
388
+ try {
389
+ const { result, capturedOutput } = await this._runClaude(prompt);
390
+ this._taskTokens.it += result.inputTokens;
391
+ this._taskTokens.ot += result.outputTokens;
392
+ await this._persistMetrics(plan, task.line);
393
+ this._updateMetrics(plan);
394
+ await this._writeLog(ws.prepLog(taskIndex), capturedOutput);
395
+ if (result.sessionId === null) {
396
+ this._workspace.preserveOnDispose();
397
+ await this._writeErrorLog(ws, `prep returned no session id for task at line ${task.line} ("${task.title}")`);
398
+ this._buffered.writeError(`Hard stop: prep for task at line ${task.line} ("${task.title}") returned no session id. Inspect logs at ${ws.root}.\n`);
399
+ return false;
400
+ }
401
+ this._currentPrepSessionId = result.sessionId;
402
+ return true;
403
+ }
404
+ catch (e) {
405
+ await this._persistMetrics(plan, task.line);
406
+ this._updateMetrics(plan);
407
+ this._workspace.preserveOnDispose();
408
+ await this._writeErrorLog(ws, `prep stage failed: ${this._stringifyError(e)}`);
409
+ this._buffered.writeError(`Hard stop: prep for task at line ${task.line} ("${task.title}") failed. Inspect logs at ${ws.root}.\n`);
410
+ return false;
411
+ }
412
+ }
413
+ async _workerStage(plan, task, ws, iteration) {
414
+ let prompt = prompts_1.prompts.worker
415
+ .split("<PLAN_PATH>").join(plan.path)
416
+ .split("<TASK_LINE>").join(String(task.line))
417
+ .split("<TASK_TITLE>").join(task.title)
418
+ .split("<BUILD_SCRIPT_PATH>").join(ws.buildScript)
419
+ .split("<TEST_SCRIPT_PATH>").join(ws.testScript)
420
+ .split("<CONTRACT_LIST>").join(this._formatPathList(this._contractList))
421
+ .split("<RULE_LIST>").join(this._formatPathList(this._ruleList));
422
+ if (iteration > 1) {
423
+ const briefing = prompts_1.prompts.previousIterationBriefing
424
+ .split("<ITERATION>").join(String(iteration))
425
+ .split("<ERROR_LOG_PATH>").join(ws.errorLog);
426
+ prompt = `${prompt}\n\n${briefing}`;
427
+ }
428
+ if (iteration === 1 && this._currentPrepSessionId === null) {
429
+ throw new Error(`Worker iteration 1 for task at line ${task.line} ("${task.title}") requires a prep session id but none was captured`);
430
+ }
431
+ try {
432
+ const { result, capturedOutput } = iteration === 1
433
+ ? await this._runClaude(prompt, null, this._currentPrepSessionId)
434
+ : await this._runClaude(prompt, this._currentWorkerSessionId);
435
+ if (result.sessionId !== null) {
436
+ this._currentWorkerSessionId = result.sessionId;
437
+ }
438
+ this._taskTokens.it += result.inputTokens;
439
+ this._taskTokens.ot += result.outputTokens;
440
+ await this._persistMetrics(plan, task.line);
441
+ this._updateMetrics(plan);
442
+ await this._writeLog(ws.workerLog(iteration), capturedOutput);
443
+ return true;
444
+ }
445
+ catch (e) {
446
+ await this._persistMetrics(plan, task.line);
447
+ this._updateMetrics(plan);
448
+ await this._writeErrorLog(ws, `worker stage failed: ${this._stringifyError(e)}`);
449
+ return false;
450
+ }
451
+ }
452
+ async _buildStage(plan, taskLine, ws, iteration) {
453
+ if (!(await (0, fsUtils_1.isNonEmptyFile)(this._contexts.fs, ws.buildScript))) {
454
+ return true;
455
+ }
456
+ const result = await this._runScript(ws.buildScript);
457
+ if (result === null) {
458
+ return false;
459
+ }
460
+ await this._persistMetrics(plan, taskLine);
461
+ this._updateMetrics(plan);
462
+ await this._writeLog(ws.buildLog(iteration), `--- stdout ---\n${result.stdout}\n--- stderr ---\n${result.stderr}`);
463
+ if (result.code !== 0) {
464
+ await this._writeErrorLog(ws, `build stage failed (exit ${result.code})\n--- stdout ---\n${result.stdout}\n--- stderr ---\n${result.stderr}`);
465
+ return false;
466
+ }
467
+ return true;
468
+ }
469
+ async _testStage(plan, taskLine, ws, iteration) {
470
+ if (!(await (0, fsUtils_1.isNonEmptyFile)(this._contexts.fs, ws.testScript))) {
471
+ return true;
472
+ }
473
+ const result = await this._runScript(ws.testScript);
474
+ if (result === null) {
475
+ return false;
476
+ }
477
+ await this._persistMetrics(plan, taskLine);
478
+ this._updateMetrics(plan);
479
+ await this._writeLog(ws.testLog(iteration), `--- stdout ---\n${result.stdout}\n--- stderr ---\n${result.stderr}`);
480
+ if (result.code !== 0) {
481
+ await this._writeErrorLog(ws, `test stage failed (exit ${result.code})\n--- stdout ---\n${result.stdout}\n--- stderr ---\n${result.stderr}`);
482
+ return false;
483
+ }
484
+ return true;
485
+ }
486
+ async _reviewerStage(plan, task, ws, iteration) {
487
+ if (this._currentPrepSessionId === null) {
488
+ throw new Error(`Reviewer for task at line ${task.line} ("${task.title}") requires a prep session id but none was captured`);
489
+ }
490
+ const prompt = prompts_1.prompts.reviewer
491
+ .split("<PLAN_PATH>").join(plan.path)
492
+ .split("<TASK_LINE>").join(String(task.line))
493
+ .split("<TASK_TITLE>").join(task.title)
494
+ .split("<CONTRACT_LIST>").join(this._formatPathList(this._contractList))
495
+ .split("<RULE_LIST>").join(this._formatPathList(this._ruleList));
496
+ try {
497
+ const { result, capturedOutput } = await this._runClaude(prompt, null, this._currentPrepSessionId);
498
+ this._taskTokens.it += result.inputTokens;
499
+ this._taskTokens.ot += result.outputTokens;
500
+ await this._persistMetrics(plan, task.line);
501
+ this._updateMetrics(plan);
502
+ const verdict = this._parseReviewVerdict(result.text);
503
+ await this._writeLog(ws.reviewerLog(iteration), verdict.pass
504
+ ? `${capturedOutput}\n\nVerdict: PASS`
505
+ : `${capturedOutput}\n\nVerdict: FAIL ${verdict.reason}`);
506
+ if (verdict.pass) {
507
+ return true;
508
+ }
509
+ await this._writeErrorLog(ws, `reviewer rejected: ${verdict.reason}`);
510
+ return false;
511
+ }
512
+ catch (e) {
513
+ await this._persistMetrics(plan, task.line);
514
+ this._updateMetrics(plan);
515
+ await this._writeErrorLog(ws, `reviewer stage failed: ${this._stringifyError(e)}`);
516
+ return false;
517
+ }
518
+ }
519
+ _parseReviewVerdict(text) {
520
+ const trimmed = text.trim();
521
+ const lines = trimmed.split(/\r?\n/);
522
+ for (let i = lines.length - 1; i >= 0; i--) {
523
+ const line = lines[i].trim();
524
+ if (!line) {
525
+ continue;
526
+ }
527
+ if (/^pass$/i.test(line)) {
528
+ return { pass: true, reason: "" };
529
+ }
530
+ const failMatch = /^fail\b\s*(.*)$/i.exec(line);
531
+ if (failMatch) {
532
+ return { pass: false, reason: failMatch[1].trim() };
533
+ }
534
+ break;
535
+ }
536
+ return { pass: false, reason: `unrecognized reviewer verdict: ${trimmed}` };
537
+ }
538
+ _formatPathList(items) {
539
+ if (items.length === 0) {
540
+ return "(none)";
541
+ }
542
+ return items.join("\n");
543
+ }
544
+ async _runClaude(prompt, initialSessionId, forkFromSessionId) {
545
+ if (this._disposed) {
546
+ throw new Error("Implement disposed");
547
+ }
548
+ let capturedOutput = "";
549
+ const capturingOutput = {
550
+ write: (text) => {
551
+ capturedOutput += text;
552
+ this._buffered.write(text);
553
+ },
554
+ writeError: (text) => {
555
+ capturedOutput += text;
556
+ this._buffered.writeError(text);
557
+ },
558
+ columns: () => this._contexts.output.columns(),
559
+ rows: () => this._contexts.output.rows(),
560
+ onResize: listener => this._contexts.output.onResize(listener)
561
+ };
562
+ const session = new ClaudeSession_1.ClaudeSession({
563
+ prompt,
564
+ cwd: this._options.projectRoot,
565
+ ...(initialSessionId != null ? { initialSessionId } : null),
566
+ ...(forkFromSessionId != null ? { forkFromSessionId } : null),
567
+ onLongWaitStart: (kind, endTimeMs) => {
568
+ if (this._disposed)
569
+ return;
570
+ if (this._currentTask !== null) {
571
+ this._taskRateLimitStartedAt = this._contexts.time.now();
572
+ }
573
+ this._block.setFooter({ kind: "waiting", waitKind: kind, endTime: endTimeMs });
574
+ },
575
+ onLongWaitEnd: () => {
576
+ if (this._taskRateLimitStartedAt !== null) {
577
+ this._taskRateLimitMs += this._contexts.time.now() - this._taskRateLimitStartedAt;
578
+ this._taskRateLimitStartedAt = null;
579
+ }
580
+ if (this._disposed)
581
+ return;
582
+ this._block.setFooter({ kind: "working" });
583
+ }
584
+ }, {
585
+ claude: this._contexts.claude,
586
+ time: this._contexts.time,
587
+ output: capturingOutput,
588
+ ask: this._contexts.ask
589
+ });
590
+ const running = { session };
591
+ this._activeSession = running;
592
+ try {
593
+ const result = await session.run();
594
+ return { result, capturedOutput };
595
+ }
596
+ finally {
597
+ if (this._activeSession === running) {
598
+ this._activeSession = null;
599
+ }
600
+ await session.dispose();
601
+ }
602
+ }
603
+ async _runScript(scriptPath) {
604
+ if (this._disposed) {
605
+ return null;
606
+ }
607
+ const isBat = scriptPath.toLowerCase().endsWith(".bat");
608
+ const command = isBat ? "cmd.exe" : "sh";
609
+ const args = isBat ? ["/c", scriptPath] : [scriptPath];
610
+ const script = new ScriptRunner_1.ScriptRunner({
611
+ command,
612
+ args,
613
+ cwd: this._options.projectRoot,
614
+ onStdout: chunk => this._buffered.write(chunk),
615
+ onStderr: chunk => this._buffered.writeError(chunk)
616
+ }, this._contexts.script, this._contexts.time);
617
+ const running = { script };
618
+ this._activeScript = running;
619
+ try {
620
+ return await script.result();
621
+ }
622
+ catch (e) {
623
+ this._buffered.writeError(`${this._stringifyError(e)}\n`);
624
+ return { code: -1, stdout: "", stderr: this._stringifyError(e) };
625
+ }
626
+ finally {
627
+ if (this._activeScript === running) {
628
+ this._activeScript = null;
629
+ }
630
+ await script.dispose();
631
+ }
632
+ }
633
+ async _writeLog(path, content) {
634
+ try {
635
+ await this._contexts.fs.writeFile(path, content);
636
+ }
637
+ catch {
638
+ }
639
+ }
640
+ async _writeErrorLog(ws, content) {
641
+ await this._writeLog(ws.errorLog, content);
642
+ }
643
+ _stringifyError(e) {
644
+ if (e instanceof Error) {
645
+ return e.stack ?? e.message;
646
+ }
647
+ return String(e);
648
+ }
649
+ _finalizeBlock(label) {
650
+ if (!this._block || this._block.isFinalized())
651
+ return;
652
+ this._buffered.flush();
653
+ this._block.finalize(label);
654
+ }
655
+ async dispose() {
656
+ if (this._disposed) {
657
+ try {
658
+ await this._runPromise;
659
+ }
660
+ catch {
661
+ }
662
+ return;
663
+ }
664
+ this._disposed = true;
665
+ const activeSession = this._activeSession?.session;
666
+ const activeScript = this._activeScript?.script;
667
+ this._activeSession = null;
668
+ this._activeScript = null;
669
+ const closers = [];
670
+ if (activeSession) {
671
+ closers.push(activeSession.dispose());
672
+ }
673
+ if (activeScript) {
674
+ closers.push(activeScript.dispose());
675
+ }
676
+ await Promise.allSettled(closers);
677
+ try {
678
+ await this._runPromise;
679
+ }
680
+ catch {
681
+ }
682
+ if (this._block) {
683
+ this._finalizeBlock("Interrupted");
684
+ const block = this._block;
685
+ this._block = null;
686
+ block.dispose();
687
+ }
688
+ if (this._workspace) {
689
+ const ws = this._workspace;
690
+ this._workspace = null;
691
+ await ws.dispose();
692
+ }
693
+ }
694
+ }
695
+ exports.Implement = Implement;
696
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1wbGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL0ltcGxlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxvREFBaUQ7QUFFakQsd0NBQTBFO0FBQzFFLGdDQUFxRztBQUNyRywwQ0FBaUQ7QUFDakQsd0NBQW1EO0FBQ25ELGtEQUErQztBQUMvQyxtREFBZ0Q7QUFFaEQsaURBQXVEO0FBQ3ZELDRDQUEwRTtBQUkxRSxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFbkIsTUFBTSxpQkFBaUI7SUFHQztJQUZaLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDaEIsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN4QixZQUFvQixNQUFrQjtRQUFsQixXQUFNLEdBQU4sTUFBTSxDQUFZO0lBQUcsQ0FBQztJQUMxQyxLQUFLLENBQUMsSUFBVztRQUNiLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNMLENBQUM7SUFDRCxVQUFVLENBQUMsSUFBVztRQUNsQixJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQztRQUN4QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxJQUFJ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