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.
- package/lib/Claude.d.ts +129 -0
- package/lib/Claude.js +390 -0
- package/lib/ClaudeSession.d.ts +34 -0
- package/lib/ClaudeSession.js +293 -0
- package/lib/Flanders.d.ts +21 -0
- package/lib/Flanders.js +64 -0
- package/lib/Git.d.ts +12 -0
- package/lib/Git.js +128 -0
- package/lib/PlanFile.d.ts +38 -0
- package/lib/PlanFile.js +167 -0
- package/lib/ScriptRunner.d.ts +26 -0
- package/lib/ScriptRunner.js +109 -0
- package/lib/Workspace.d.ts +32 -0
- package/lib/Workspace.js +78 -0
- package/lib/cli.d.ts +2 -0
- package/lib/cli.js +328 -0
- package/lib/commands/Implement.d.ts +64 -0
- package/lib/commands/Implement.js +696 -0
- package/lib/commands/Install.d.ts +20 -0
- package/lib/commands/Install.js +126 -0
- package/lib/contexts.d.ts +77 -0
- package/lib/contexts.js +3 -0
- package/lib/fsUtils.d.ts +5 -0
- package/lib/fsUtils.js +51 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +6 -0
- package/lib/prompts.d.ts +18 -0
- package/lib/prompts.js +222 -0
- package/lib/skills.d.ts +3 -0
- package/lib/skills.js +207 -0
- package/lib/ui/BottomBlock.d.ts +70 -0
- package/lib/ui/BottomBlock.js +193 -0
- package/lib/ui/formatters.d.ts +29 -0
- package/lib/ui/formatters.js +222 -0
- package/lib/wait.d.ts +2 -0
- package/lib/wait.js +36 -0
- package/package.json +41 -0
|
@@ -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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
|