localptp 0.1.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/LICENSE +23 -0
- package/README.md +159 -0
- package/dist/cli.d.ts +24 -0
- package/dist/cli.js +344 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.d.ts +14 -0
- package/dist/commands/config.js +65 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/context.d.ts +12 -0
- package/dist/commands/context.js +176 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/doctor.d.ts +16 -0
- package/dist/commands/doctor.js +54 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/index.d.ts +13 -0
- package/dist/commands/index.js +70 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +15 -0
- package/dist/commands/init.js +46 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/plan.d.ts +17 -0
- package/dist/commands/plan.js +170 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/resume.d.ts +17 -0
- package/dist/commands/resume.js +75 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/review.d.ts +17 -0
- package/dist/commands/review.js +67 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +24 -0
- package/dist/commands/run.js +65 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/step.d.ts +44 -0
- package/dist/commands/step.js +50 -0
- package/dist/commands/step.js.map +1 -0
- package/dist/commands/summarize.d.ts +17 -0
- package/dist/commands/summarize.js +276 -0
- package/dist/commands/summarize.js.map +1 -0
- package/dist/commands/task.d.ts +13 -0
- package/dist/commands/task.js +53 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/core/activePointer.d.ts +28 -0
- package/dist/core/activePointer.js +84 -0
- package/dist/core/activePointer.js.map +1 -0
- package/dist/core/approval.d.ts +12 -0
- package/dist/core/approval.js +34 -0
- package/dist/core/approval.js.map +1 -0
- package/dist/core/configManager.d.ts +32 -0
- package/dist/core/configManager.js +177 -0
- package/dist/core/configManager.js.map +1 -0
- package/dist/core/contextBuilder.d.ts +40 -0
- package/dist/core/contextBuilder.js +406 -0
- package/dist/core/contextBuilder.js.map +1 -0
- package/dist/core/memoryLoader.d.ts +4 -0
- package/dist/core/memoryLoader.js +35 -0
- package/dist/core/memoryLoader.js.map +1 -0
- package/dist/core/memoryManager.d.ts +41 -0
- package/dist/core/memoryManager.js +181 -0
- package/dist/core/memoryManager.js.map +1 -0
- package/dist/core/memoryPolicy.d.ts +23 -0
- package/dist/core/memoryPolicy.js +73 -0
- package/dist/core/memoryPolicy.js.map +1 -0
- package/dist/core/modelClient.d.ts +37 -0
- package/dist/core/modelClient.js +160 -0
- package/dist/core/modelClient.js.map +1 -0
- package/dist/core/patchManager.d.ts +89 -0
- package/dist/core/patchManager.js +801 -0
- package/dist/core/patchManager.js.map +1 -0
- package/dist/core/plannerJson.d.ts +23 -0
- package/dist/core/plannerJson.js +118 -0
- package/dist/core/plannerJson.js.map +1 -0
- package/dist/core/promptManager.d.ts +16 -0
- package/dist/core/promptManager.js +35 -0
- package/dist/core/promptManager.js.map +1 -0
- package/dist/core/prompts.d.ts +8 -0
- package/dist/core/prompts.js +18 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/repoIndexer.d.ts +21 -0
- package/dist/core/repoIndexer.js +557 -0
- package/dist/core/repoIndexer.js.map +1 -0
- package/dist/core/reviewEngine.d.ts +53 -0
- package/dist/core/reviewEngine.js +229 -0
- package/dist/core/reviewEngine.js.map +1 -0
- package/dist/core/runLoop.d.ts +26 -0
- package/dist/core/runLoop.js +103 -0
- package/dist/core/runLoop.js.map +1 -0
- package/dist/core/runStep.d.ts +42 -0
- package/dist/core/runStep.js +586 -0
- package/dist/core/runStep.js.map +1 -0
- package/dist/core/safetyManager.d.ts +7 -0
- package/dist/core/safetyManager.js +202 -0
- package/dist/core/safetyManager.js.map +1 -0
- package/dist/core/sessionManager.d.ts +35 -0
- package/dist/core/sessionManager.js +265 -0
- package/dist/core/sessionManager.js.map +1 -0
- package/dist/core/stopConditions.d.ts +24 -0
- package/dist/core/stopConditions.js +18 -0
- package/dist/core/stopConditions.js.map +1 -0
- package/dist/core/taskManager.d.ts +26 -0
- package/dist/core/taskManager.js +312 -0
- package/dist/core/taskManager.js.map +1 -0
- package/dist/core/testRunner.d.ts +27 -0
- package/dist/core/testRunner.js +71 -0
- package/dist/core/testRunner.js.map +1 -0
- package/dist/prompts/coder.d.ts +3 -0
- package/dist/prompts/coder.js +46 -0
- package/dist/prompts/coder.js.map +1 -0
- package/dist/prompts/planner.d.ts +3 -0
- package/dist/prompts/planner.js +44 -0
- package/dist/prompts/planner.js.map +1 -0
- package/dist/prompts/reviewer.d.ts +3 -0
- package/dist/prompts/reviewer.js +41 -0
- package/dist/prompts/reviewer.js.map +1 -0
- package/dist/prompts/summarizer.d.ts +3 -0
- package/dist/prompts/summarizer.js +65 -0
- package/dist/prompts/summarizer.js.map +1 -0
- package/dist/prompts/testFixer.d.ts +3 -0
- package/dist/prompts/testFixer.js +33 -0
- package/dist/prompts/testFixer.js.map +1 -0
- package/dist/repl/approver.d.ts +15 -0
- package/dist/repl/approver.js +21 -0
- package/dist/repl/approver.js.map +1 -0
- package/dist/repl/dispatch.d.ts +48 -0
- package/dist/repl/dispatch.js +164 -0
- package/dist/repl/dispatch.js.map +1 -0
- package/dist/repl/loop.d.ts +14 -0
- package/dist/repl/loop.js +124 -0
- package/dist/repl/loop.js.map +1 -0
- package/dist/repl/tokenize.d.ts +13 -0
- package/dist/repl/tokenize.js +56 -0
- package/dist/repl/tokenize.js.map +1 -0
- package/dist/templates/memory.d.ts +13 -0
- package/dist/templates/memory.js +32 -0
- package/dist/templates/memory.js.map +1 -0
- package/dist/types/config.d.ts +235 -0
- package/dist/types/config.js +66 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/context.d.ts +78 -0
- package/dist/types/context.js +141 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/index.d.ts +117 -0
- package/dist/types/index.js +24 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/model.d.ts +35 -0
- package/dist/types/model.js +16 -0
- package/dist/types/model.js.map +1 -0
- package/dist/types/patch.d.ts +38 -0
- package/dist/types/patch.js +11 -0
- package/dist/types/patch.js.map +1 -0
- package/dist/types/plan.d.ts +86 -0
- package/dist/types/plan.js +27 -0
- package/dist/types/plan.js.map +1 -0
- package/dist/types/review.d.ts +33 -0
- package/dist/types/review.js +24 -0
- package/dist/types/review.js.map +1 -0
- package/dist/types/run.d.ts +34 -0
- package/dist/types/run.js +2 -0
- package/dist/types/run.js.map +1 -0
- package/dist/types/session.d.ts +21 -0
- package/dist/types/session.js +2 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/summary.d.ts +65 -0
- package/dist/types/summary.js +26 -0
- package/dist/types/summary.js.map +1 -0
- package/dist/types/task.d.ts +31 -0
- package/dist/types/task.js +10 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/test.d.ts +16 -0
- package/dist/types/test.js +2 -0
- package/dist/types/test.js.map +1 -0
- package/dist/utils/fs.d.ts +13 -0
- package/dist/utils/fs.js +65 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/gitRoot.d.ts +5 -0
- package/dist/utils/gitRoot.js +21 -0
- package/dist/utils/gitRoot.js.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.js +60 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +13 -0
- package/dist/utils/paths.js +24 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/tokenEstimate.d.ts +5 -0
- package/dist/utils/tokenEstimate.js +8 -0
- package/dist/utils/tokenEstimate.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `runStep` core (HLD-SRD §3.10, §3.11, §3.13; 0001_06).
|
|
3
|
+
*
|
|
4
|
+
* The single, callable step state machine shared by the `step` command (one
|
|
5
|
+
* shot) and the `run` loop (looped). Extracted from 0001_05's `step` command so
|
|
6
|
+
* one-shot and looped execution share IDENTICAL behavior — the highest-stakes
|
|
7
|
+
* code (patch application) lives in exactly one place.
|
|
8
|
+
*
|
|
9
|
+
* The side-effect ordering is the safety contract: NO write happens before the
|
|
10
|
+
* apply step, and the apply step is reached only after every safety gate and
|
|
11
|
+
* every approval pass.
|
|
12
|
+
*
|
|
13
|
+
* 1. resolve config + active task/session; pick the next pending subtask
|
|
14
|
+
* (none → done, exit 0, nothing applied).
|
|
15
|
+
* 2. buildContext({ role: 'coder', … }).
|
|
16
|
+
* 3. modelClient.complete(coder prompt). A §12 ModelClientError propagates
|
|
17
|
+
* unchanged; nothing has been written.
|
|
18
|
+
* 4. needs_context → print files+reason, stop, nothing applied.
|
|
19
|
+
* 5. extractUnifiedDiff → null → §12.3 stop (throws, nothing applied).
|
|
20
|
+
* 6. parsePatch + validate → refuse → throws.
|
|
21
|
+
* 7. safetyManager.evaluate → refuse → throws.
|
|
22
|
+
* 8. assertWorkingTreeSafe → mid-merge → throws.
|
|
23
|
+
* 9. git apply --check (git repos only) → fail → throws.
|
|
24
|
+
* 10. display the diff.
|
|
25
|
+
* 11. risky/delete confirmations → deny → skip+stop, nothing applied.
|
|
26
|
+
* 12. standard approval → deny → stop, nothing applied.
|
|
27
|
+
* 13. apply — FIRST write.
|
|
28
|
+
* 14. savePatch.
|
|
29
|
+
* 15. run tests, then the bounded TEST-FIX LOOP (0001_06): while a test fails
|
|
30
|
+
* and attempts < max, ask the test-fixer for a minimal patch and apply it
|
|
31
|
+
* through the SAME safety + approval + apply + savePatch path, re-running
|
|
32
|
+
* tests each time. Each fix patch is saved as `<subtask>_fix-N.patch`.
|
|
33
|
+
* A fix-loop refusal sets a structured stopReason rather than throwing —
|
|
34
|
+
* the patch is already applied, so the run loop wants a clean stop.
|
|
35
|
+
* 16. update the session + mark the subtask done.
|
|
36
|
+
*
|
|
37
|
+
* Initial-patch refusals still THROW (preserving the 0001_05 `step` behavior);
|
|
38
|
+
* the `run` loop catches them and maps them to stop reasons. Fix-loop refusals
|
|
39
|
+
* carry a `stopReason` on the returned outcome instead.
|
|
40
|
+
*/
|
|
41
|
+
import { promises as fs } from "node:fs";
|
|
42
|
+
import path from "node:path";
|
|
43
|
+
import { detectGitRoot } from "../utils/gitRoot.js";
|
|
44
|
+
import { layout } from "../utils/paths.js";
|
|
45
|
+
import { readIfExists } from "../utils/fs.js";
|
|
46
|
+
import { ConfigManager } from "./configManager.js";
|
|
47
|
+
import { loadMemoryFiles } from "./memoryLoader.js";
|
|
48
|
+
import { buildContext } from "./contextBuilder.js";
|
|
49
|
+
import { resolveActive } from "./activePointer.js";
|
|
50
|
+
import { parseTask, setSubtasks, serializeTask } from "./taskManager.js";
|
|
51
|
+
import { loadSession, updateSession } from "./sessionManager.js";
|
|
52
|
+
import { getPrompt } from "./promptManager.js";
|
|
53
|
+
import { LmStudioClient } from "./modelClient.js";
|
|
54
|
+
import { extractUnifiedDiff, parsePatch, validate, apply, savePatch, assertWorkingTreeSafe, gitApplyCheck, PatchValidationError, PatchApplyError, WorkingTreeUnsafeError, } from "./patchManager.js";
|
|
55
|
+
import { evaluate } from "./safetyManager.js";
|
|
56
|
+
import { runTests, splitCommand, formatTestResult } from "./testRunner.js";
|
|
57
|
+
import { ttyApprove } from "./approval.js";
|
|
58
|
+
import { parseActiveTask, parseActiveSession } from "../types/context.js";
|
|
59
|
+
import { repoIndexSchema } from "../types/index.js";
|
|
60
|
+
/** A command error that carries an exit code (preserves 0001_05 `step` behavior). */
|
|
61
|
+
export class CommandError extends Error {
|
|
62
|
+
exitCode;
|
|
63
|
+
constructor(message, exitCode = 1) {
|
|
64
|
+
super(message);
|
|
65
|
+
this.name = "CommandError";
|
|
66
|
+
this.exitCode = exitCode;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function defaultClientFactory(config) {
|
|
70
|
+
return new LmStudioClient({
|
|
71
|
+
baseUrl: config.model.baseUrl,
|
|
72
|
+
model: config.model.model,
|
|
73
|
+
apiKey: config.model.apiKey,
|
|
74
|
+
temperature: config.model.temperature,
|
|
75
|
+
timeoutMs: config.model.timeoutMs,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const EMPTY_INDEX = {
|
|
79
|
+
generatedAt: "",
|
|
80
|
+
root: "",
|
|
81
|
+
files: [],
|
|
82
|
+
};
|
|
83
|
+
async function loadIndex(orchestratorDir) {
|
|
84
|
+
const raw = await readIfExists(path.join(orchestratorDir, "index.json"));
|
|
85
|
+
if (raw === undefined)
|
|
86
|
+
return EMPTY_INDEX;
|
|
87
|
+
try {
|
|
88
|
+
const parsed = repoIndexSchema.safeParse(JSON.parse(raw));
|
|
89
|
+
return parsed.success ? parsed.data : EMPTY_INDEX;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return EMPTY_INDEX;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async function loadFileContents(root, index) {
|
|
96
|
+
const out = {};
|
|
97
|
+
for (const f of index.files) {
|
|
98
|
+
const rel = f.path.replace(/\\/g, "/");
|
|
99
|
+
try {
|
|
100
|
+
out[rel] = await fs.readFile(path.join(root, rel), "utf8");
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Omit unreadable/deleted files.
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Detect a `needs_context` response. Tolerant of fences/prose: scans for a JSON
|
|
110
|
+
* object carrying `"status":"needs_context"` and parses it. Returns the request
|
|
111
|
+
* (files + reason), or undefined when the response is not a needs_context.
|
|
112
|
+
*/
|
|
113
|
+
export function parseNeedsContext(raw) {
|
|
114
|
+
if (!/"status"\s*:\s*"needs_context"/.test(raw))
|
|
115
|
+
return undefined;
|
|
116
|
+
// Scan EVERY balanced top-level object (string/escape aware) and return the
|
|
117
|
+
// first one whose status is needs_context. Scanning only the first `{` breaks
|
|
118
|
+
// when prose before the JSON contains a brace (e.g. "analysis {note}. {…}").
|
|
119
|
+
for (let start = raw.indexOf("{"); start !== -1; start = raw.indexOf("{", start + 1)) {
|
|
120
|
+
let depth = 0;
|
|
121
|
+
let inString = false;
|
|
122
|
+
let escaped = false;
|
|
123
|
+
let end = -1;
|
|
124
|
+
for (let i = start; i < raw.length; i++) {
|
|
125
|
+
const ch = raw[i];
|
|
126
|
+
if (inString) {
|
|
127
|
+
if (escaped)
|
|
128
|
+
escaped = false;
|
|
129
|
+
else if (ch === "\\")
|
|
130
|
+
escaped = true;
|
|
131
|
+
else if (ch === '"')
|
|
132
|
+
inString = false;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (ch === '"')
|
|
136
|
+
inString = true;
|
|
137
|
+
else if (ch === "{")
|
|
138
|
+
depth += 1;
|
|
139
|
+
else if (ch === "}") {
|
|
140
|
+
depth -= 1;
|
|
141
|
+
if (depth === 0) {
|
|
142
|
+
end = i + 1;
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (end === -1)
|
|
148
|
+
continue; // unbalanced from THIS `{` — try the next one
|
|
149
|
+
try {
|
|
150
|
+
const obj = JSON.parse(raw.slice(start, end));
|
|
151
|
+
if (obj.status === "needs_context") {
|
|
152
|
+
const files = Array.isArray(obj.files)
|
|
153
|
+
? obj.files.filter((f) => typeof f === "string")
|
|
154
|
+
: [];
|
|
155
|
+
const reason = typeof obj.reason === "string" ? obj.reason : "";
|
|
156
|
+
return { files, reason };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Not valid JSON at this `{` (e.g. prose braces) — try the next object.
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
/** The confirmation prompt text for a needsConfirm kind. */
|
|
166
|
+
function confirmPrompt(kind, plan) {
|
|
167
|
+
if (kind === "risky-path") {
|
|
168
|
+
return ("WARNING: this patch touches a configured risky path " +
|
|
169
|
+
`(${plan.touchedFiles.join(", ")}). Apply anyway?`);
|
|
170
|
+
}
|
|
171
|
+
return `WARNING: this patch DELETES ${plan.deletes.join(", ")}. Apply anyway?`;
|
|
172
|
+
}
|
|
173
|
+
/** Render the diff for display (the `step` command prints it before approval). */
|
|
174
|
+
function displayDiff(diff) {
|
|
175
|
+
process.stdout.write(diff.endsWith("\n") ? diff : diff + "\n");
|
|
176
|
+
}
|
|
177
|
+
/** Build the configured test commands as arg-array tuples (skips blanks). */
|
|
178
|
+
function configuredTestCommands(config) {
|
|
179
|
+
const out = [];
|
|
180
|
+
for (const raw of [
|
|
181
|
+
config.commands.typecheck,
|
|
182
|
+
config.commands.lint,
|
|
183
|
+
config.commands.test,
|
|
184
|
+
config.commands.build,
|
|
185
|
+
]) {
|
|
186
|
+
const cmd = splitCommand(raw);
|
|
187
|
+
if (cmd)
|
|
188
|
+
out.push(cmd);
|
|
189
|
+
}
|
|
190
|
+
return out;
|
|
191
|
+
}
|
|
192
|
+
/** Any failing test in the set? */
|
|
193
|
+
function hasFailure(results) {
|
|
194
|
+
return results.some((r) => r.exitCode !== 0);
|
|
195
|
+
}
|
|
196
|
+
/** Print a test-results block (the `✓`/`✗` line plus captured output on fail). */
|
|
197
|
+
function printTestResults(results) {
|
|
198
|
+
for (const r of results) {
|
|
199
|
+
process.stdout.write(formatTestResult(r) + "\n");
|
|
200
|
+
if (r.exitCode !== 0) {
|
|
201
|
+
const out = r.stdout.trimEnd();
|
|
202
|
+
const errOut = r.stderr.trimEnd();
|
|
203
|
+
if (out.length > 0)
|
|
204
|
+
process.stdout.write(out + "\n");
|
|
205
|
+
if (errOut.length > 0)
|
|
206
|
+
process.stderr.write(errOut + "\n");
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/** A compact failure excerpt fed to the test-fixer (capped to avoid bloat). */
|
|
211
|
+
function failureExcerpt(results) {
|
|
212
|
+
const MAX = 4000;
|
|
213
|
+
const blocks = [];
|
|
214
|
+
for (const r of results) {
|
|
215
|
+
if (r.exitCode === 0)
|
|
216
|
+
continue;
|
|
217
|
+
const body = [r.stdout.trimEnd(), r.stderr.trimEnd()].filter((s) => s.length > 0).join("\n");
|
|
218
|
+
blocks.push(`$ ${r.command} (exit ${r.exitCode})\n${body}`);
|
|
219
|
+
}
|
|
220
|
+
const joined = blocks.join("\n\n");
|
|
221
|
+
return joined.length > MAX ? joined.slice(0, MAX) + "\n… [truncated]" : joined;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* The bounded test-fix loop (HLD-SRD §3.11). On a test failure, while
|
|
225
|
+
* `attempts < max`, ask the test-fixer for a minimal patch and apply it through
|
|
226
|
+
* the SAME safety + approval + apply + savePatch path, re-running tests each
|
|
227
|
+
* time. Each fix patch is saved as `<subtaskId>_fix-N.patch`.
|
|
228
|
+
*
|
|
229
|
+
* Returns the final test results, the number of fix attempts made, and an
|
|
230
|
+
* optional `stopReason` set when a fix attempt was refused (unparseable diff,
|
|
231
|
+
* safety verdict, or approval denied). A `repeated-failure` is NOT set here —
|
|
232
|
+
* the caller derives it from the final results + attempts so the
|
|
233
|
+
* `max_failed_fix_attempts = 0` boundary (zero attempts, still failing) is
|
|
234
|
+
* handled uniformly.
|
|
235
|
+
*/
|
|
236
|
+
async function runFixLoop(args) {
|
|
237
|
+
const max = args.config.safety.maxFailedFixAttempts;
|
|
238
|
+
let results = args.initialResults;
|
|
239
|
+
let fixAttempts = 0;
|
|
240
|
+
const fixer = getPrompt("test-fixer");
|
|
241
|
+
while (hasFailure(results) && fixAttempts < max) {
|
|
242
|
+
fixAttempts += 1;
|
|
243
|
+
process.stdout.write(`\nTests failed — attempting fix ${fixAttempts}/${max}…\n`);
|
|
244
|
+
// Build the test-fixer prompt from the CURRENT working tree plus the
|
|
245
|
+
// failure excerpt (the contents reflect the already-applied patches).
|
|
246
|
+
const fixerUser = (await args.buildFixerUserPrompt()) +
|
|
247
|
+
`\n\n## Test failure\n\n${failureExcerpt(results)}`;
|
|
248
|
+
const response = await args.client.complete({
|
|
249
|
+
role: "test-fixer",
|
|
250
|
+
systemPrompt: fixer.system,
|
|
251
|
+
userPrompt: fixer.renderUser(fixerUser),
|
|
252
|
+
});
|
|
253
|
+
// Extract the fix diff. Unparseable → stop the loop with a named reason
|
|
254
|
+
// (nothing half-applied — we have not touched the tree this iteration).
|
|
255
|
+
const diff = extractUnifiedDiff(response.content);
|
|
256
|
+
if (diff === null) {
|
|
257
|
+
process.stdout.write("The test-fixer did not return a valid unified diff. Stopping the fix loop.\n");
|
|
258
|
+
return { results, fixAttempts: fixAttempts - 1, stopReason: "unparseable-output" };
|
|
259
|
+
}
|
|
260
|
+
let plan;
|
|
261
|
+
try {
|
|
262
|
+
plan = parsePatch(diff);
|
|
263
|
+
await validate(plan, args.config, args.root);
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
if (err instanceof PatchValidationError || err instanceof PatchApplyError) {
|
|
267
|
+
process.stdout.write("The test-fixer patch is invalid. Stopping the fix loop. " + err.message + "\n");
|
|
268
|
+
return { results, fixAttempts: fixAttempts - 1, stopReason: "patch-invalid" };
|
|
269
|
+
}
|
|
270
|
+
throw err;
|
|
271
|
+
}
|
|
272
|
+
// Same safety evaluation as a normal patch.
|
|
273
|
+
const verdict = evaluate(plan, args.config, args.root);
|
|
274
|
+
if (verdict.decision === "refuse") {
|
|
275
|
+
process.stdout.write(`Refusing the test-fixer patch: ${verdict.reasons.join(" ")} Stopping the fix loop.\n`);
|
|
276
|
+
return { results, fixAttempts: fixAttempts - 1, stopReason: safetyRefusalReason(verdict.reasons) };
|
|
277
|
+
}
|
|
278
|
+
// Working-tree-safe + pre-flight check (git repos).
|
|
279
|
+
try {
|
|
280
|
+
await assertWorkingTreeSafe(args.root);
|
|
281
|
+
}
|
|
282
|
+
catch (err) {
|
|
283
|
+
if (err instanceof WorkingTreeUnsafeError) {
|
|
284
|
+
return { results, fixAttempts: fixAttempts - 1, stopReason: "unsafe-tree" };
|
|
285
|
+
}
|
|
286
|
+
throw err;
|
|
287
|
+
}
|
|
288
|
+
const git = await detectGitRoot(args.root);
|
|
289
|
+
if (git.isRepo) {
|
|
290
|
+
try {
|
|
291
|
+
await gitApplyCheck(plan, args.root);
|
|
292
|
+
}
|
|
293
|
+
catch (err) {
|
|
294
|
+
if (err instanceof PatchApplyError) {
|
|
295
|
+
process.stdout.write("The test-fixer patch does not apply cleanly. Stopping the fix loop.\n");
|
|
296
|
+
return { results, fixAttempts: fixAttempts - 1, stopReason: "patch-invalid" };
|
|
297
|
+
}
|
|
298
|
+
throw err;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
displayDiff(diff);
|
|
302
|
+
// Risky/delete confirmations — always prompted, even when requireApproval
|
|
303
|
+
// is false. The SAME gate a normal patch passes through.
|
|
304
|
+
let denied = false;
|
|
305
|
+
for (const kind of verdict.needsConfirm) {
|
|
306
|
+
const ok = await args.approve(confirmPrompt(kind, plan));
|
|
307
|
+
if (!ok) {
|
|
308
|
+
denied = true;
|
|
309
|
+
break;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
if (!denied && args.config.safety.requireApproval && verdict.needsConfirm.length === 0) {
|
|
313
|
+
denied = !(await args.approve("Apply this fix patch?"));
|
|
314
|
+
}
|
|
315
|
+
if (denied) {
|
|
316
|
+
process.stdout.write("Fix not applied: approval denied. Stopping the fix loop.\n");
|
|
317
|
+
return { results, fixAttempts: fixAttempts - 1, stopReason: "approval-denied" };
|
|
318
|
+
}
|
|
319
|
+
// Apply + save the fix patch (as `<subtaskId>_fix-N.patch`).
|
|
320
|
+
await apply(plan, args.root);
|
|
321
|
+
try {
|
|
322
|
+
await savePatch(diff, `${args.subtaskId}_fix-${fixAttempts}`, args.orchestratorDir, {
|
|
323
|
+
now: args.now,
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
catch (err) {
|
|
327
|
+
process.stderr.write("WARNING: the fix patch was applied but its artifact could not be saved: " +
|
|
328
|
+
(err instanceof Error ? err.message : String(err)) +
|
|
329
|
+
"\n");
|
|
330
|
+
}
|
|
331
|
+
// Re-run tests.
|
|
332
|
+
results = await runTests(args.commands, { cwd: args.root });
|
|
333
|
+
printTestResults(results);
|
|
334
|
+
}
|
|
335
|
+
return { results, fixAttempts };
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Map a safety refusal's reasons to the matching stop reason. A risky-path
|
|
339
|
+
* refusal does not actually `refuse` (it is a confirmation), so the refusal set
|
|
340
|
+
* here is binary/escape/ignored/file-cap; the file-cap (broad rewrite) maps to
|
|
341
|
+
* `broad-rewrite-requested`, an unsafe tree to `unsafe-tree`, everything else to
|
|
342
|
+
* the generic `risky-change`.
|
|
343
|
+
*/
|
|
344
|
+
function safetyRefusalReason(reasons) {
|
|
345
|
+
const joined = reasons.join(" ").toLowerCase();
|
|
346
|
+
if (joined.includes("too many changed files"))
|
|
347
|
+
return "broad-rewrite-requested";
|
|
348
|
+
return "risky-change";
|
|
349
|
+
}
|
|
350
|
+
export async function runStep(deps) {
|
|
351
|
+
const approve = deps.approve ?? ttyApprove;
|
|
352
|
+
const git = await detectGitRoot(deps.cwd);
|
|
353
|
+
const root = git.root ?? deps.cwd;
|
|
354
|
+
const l = layout(root);
|
|
355
|
+
// 1. Resolve the active task/session.
|
|
356
|
+
const active = await resolveActive(l.orchestratorDir);
|
|
357
|
+
if (active.kind === "none") {
|
|
358
|
+
throw new CommandError('No active task. Create one first with `localptp task "…"`.');
|
|
359
|
+
}
|
|
360
|
+
if (active.kind === "missing-target") {
|
|
361
|
+
throw new CommandError(`The active pointer references a missing file: ${active.missing.join(", ")}. ` +
|
|
362
|
+
'Create a new task with `localptp task "…"` or pick another with `localptp resume`.');
|
|
363
|
+
}
|
|
364
|
+
const { taskPath, sessionPath } = active.pointer;
|
|
365
|
+
const config = await new ConfigManager(l.configFile).load();
|
|
366
|
+
const task = await parseTask(taskPath);
|
|
367
|
+
const session = await loadSession(sessionPath);
|
|
368
|
+
// Pick the next pending subtask (none → done, exit 0, nothing applied).
|
|
369
|
+
const subtask = task.subtasks.find((s) => s.status === "pending");
|
|
370
|
+
if (subtask === undefined) {
|
|
371
|
+
process.stdout.write("No pending subtasks — the task has nothing left to do. Run `localptp plan` to add more.\n");
|
|
372
|
+
return {
|
|
373
|
+
subtaskId: null,
|
|
374
|
+
applied: false,
|
|
375
|
+
done: true,
|
|
376
|
+
testResults: [],
|
|
377
|
+
fixAttempts: 0,
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
// 2. Build the coder context.
|
|
381
|
+
const index = await loadIndex(l.orchestratorDir);
|
|
382
|
+
const memory = await loadMemoryFiles(root);
|
|
383
|
+
const fileContents = await loadFileContents(root, index);
|
|
384
|
+
const pkg = buildContext({
|
|
385
|
+
role: "coder",
|
|
386
|
+
config,
|
|
387
|
+
index,
|
|
388
|
+
memory,
|
|
389
|
+
task: parseActiveTask(task.raw),
|
|
390
|
+
session: parseActiveSession(session.raw),
|
|
391
|
+
fileContents,
|
|
392
|
+
});
|
|
393
|
+
// 3. Call the model. A §12 ModelClientError propagates unchanged.
|
|
394
|
+
const client = (deps.clientFactory ?? defaultClientFactory)(config);
|
|
395
|
+
const coder = getPrompt("coder");
|
|
396
|
+
const response = await client.complete({
|
|
397
|
+
role: "coder",
|
|
398
|
+
systemPrompt: coder.system,
|
|
399
|
+
userPrompt: coder.renderUser(pkg.userPrompt),
|
|
400
|
+
});
|
|
401
|
+
// 4. needs_context → print + stop, nothing applied.
|
|
402
|
+
const needs = parseNeedsContext(response.content);
|
|
403
|
+
if (needs !== undefined) {
|
|
404
|
+
process.stdout.write(`The model needs more context before it can patch:\n` +
|
|
405
|
+
` reason: ${needs.reason}\n` +
|
|
406
|
+
(needs.files.length > 0 ? ` files: ${needs.files.join(", ")}\n` : "") +
|
|
407
|
+
"Nothing was applied.\n");
|
|
408
|
+
return {
|
|
409
|
+
subtaskId: subtask.id,
|
|
410
|
+
applied: false,
|
|
411
|
+
done: false,
|
|
412
|
+
needsContext: needs,
|
|
413
|
+
// Stop the `run` loop with a meaningful reason: nothing changed, so a
|
|
414
|
+
// re-run would produce the same needs_context and spin to the iteration
|
|
415
|
+
// cap. `step` reads `needsContext` (not `stopReason`), so its output is
|
|
416
|
+
// unchanged.
|
|
417
|
+
stopReason: "needs-context",
|
|
418
|
+
testResults: [],
|
|
419
|
+
fixAttempts: 0,
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
// 5. Extract the unified diff. null → §12.3 stop, nothing applied.
|
|
423
|
+
const diff = extractUnifiedDiff(response.content);
|
|
424
|
+
if (diff === null) {
|
|
425
|
+
throw new CommandError("The model did not return a valid unified diff (§12.3). Nothing was applied. " +
|
|
426
|
+
"Try `localptp step` again or narrow the subtask.");
|
|
427
|
+
}
|
|
428
|
+
// 6. Parse + validate.
|
|
429
|
+
const plan = parsePatch(diff);
|
|
430
|
+
await validate(plan, config, root);
|
|
431
|
+
// 7. Pure safety evaluation.
|
|
432
|
+
const verdict = evaluate(plan, config, root);
|
|
433
|
+
if (verdict.decision === "refuse") {
|
|
434
|
+
throw new CommandError(`Refusing to apply: ${verdict.reasons.join(" ")}`);
|
|
435
|
+
}
|
|
436
|
+
// 8. Working-tree-safe.
|
|
437
|
+
await assertWorkingTreeSafe(root);
|
|
438
|
+
// 9. Pre-flight `git apply --check` BEFORE displaying/prompting.
|
|
439
|
+
if (git.isRepo) {
|
|
440
|
+
await gitApplyCheck(plan, root);
|
|
441
|
+
}
|
|
442
|
+
// 10. Display the diff.
|
|
443
|
+
displayDiff(diff);
|
|
444
|
+
// 11. Risky/delete confirmations — always prompted. Deny → skip + stop.
|
|
445
|
+
for (const kind of verdict.needsConfirm) {
|
|
446
|
+
const ok = await approve(confirmPrompt(kind, plan));
|
|
447
|
+
if (!ok) {
|
|
448
|
+
process.stdout.write("Skipped: confirmation denied. Nothing was applied.\n");
|
|
449
|
+
return {
|
|
450
|
+
subtaskId: subtask.id,
|
|
451
|
+
applied: false,
|
|
452
|
+
done: false,
|
|
453
|
+
stopReason: "approval-denied",
|
|
454
|
+
testResults: [],
|
|
455
|
+
fixAttempts: 0,
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
// 12. Standard approval — unless requireApproval is false AND no confirmations.
|
|
460
|
+
if (config.safety.requireApproval && verdict.needsConfirm.length === 0) {
|
|
461
|
+
const ok = await approve("Apply this patch?");
|
|
462
|
+
if (!ok) {
|
|
463
|
+
process.stdout.write("Not applied: approval denied. Nothing was changed.\n");
|
|
464
|
+
return {
|
|
465
|
+
subtaskId: subtask.id,
|
|
466
|
+
applied: false,
|
|
467
|
+
done: false,
|
|
468
|
+
stopReason: "approval-denied",
|
|
469
|
+
testResults: [],
|
|
470
|
+
fixAttempts: 0,
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
// 13. Apply — the FIRST write.
|
|
475
|
+
await apply(plan, root);
|
|
476
|
+
// 14. Save the patch artifact.
|
|
477
|
+
let patchPath;
|
|
478
|
+
try {
|
|
479
|
+
patchPath = await savePatch(diff, subtask.id, l.orchestratorDir, {
|
|
480
|
+
now: deps.now,
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
catch (err) {
|
|
484
|
+
process.stderr.write("WARNING: the patch was applied but the patch artifact could not be saved: " +
|
|
485
|
+
(err instanceof Error ? err.message : String(err)) +
|
|
486
|
+
"\n");
|
|
487
|
+
}
|
|
488
|
+
// 15. Run configured tests, then the bounded test-fix loop (0001_06).
|
|
489
|
+
const commands = configuredTestCommands(config);
|
|
490
|
+
let testResults = await runTests(commands, { cwd: root });
|
|
491
|
+
printTestResults(testResults);
|
|
492
|
+
let fixAttempts = 0;
|
|
493
|
+
let stopReason;
|
|
494
|
+
if (hasFailure(testResults)) {
|
|
495
|
+
const fixed = await runFixLoop({
|
|
496
|
+
initialResults: testResults,
|
|
497
|
+
commands,
|
|
498
|
+
config,
|
|
499
|
+
root,
|
|
500
|
+
orchestratorDir: l.orchestratorDir,
|
|
501
|
+
subtaskId: subtask.id,
|
|
502
|
+
client,
|
|
503
|
+
approve,
|
|
504
|
+
now: deps.now,
|
|
505
|
+
// Rebuild a fresh test-fixer context each attempt from the CURRENT
|
|
506
|
+
// working tree so the fixer never sees stale, pre-patch file contents.
|
|
507
|
+
buildFixerUserPrompt: async () => {
|
|
508
|
+
const freshContents = await loadFileContents(root, index);
|
|
509
|
+
const fixerPkg = buildContext({
|
|
510
|
+
role: "test-fixer",
|
|
511
|
+
config,
|
|
512
|
+
index,
|
|
513
|
+
memory,
|
|
514
|
+
task: parseActiveTask(task.raw),
|
|
515
|
+
session: parseActiveSession(session.raw),
|
|
516
|
+
fileContents: freshContents,
|
|
517
|
+
});
|
|
518
|
+
return fixerPkg.userPrompt;
|
|
519
|
+
},
|
|
520
|
+
});
|
|
521
|
+
testResults = fixed.results;
|
|
522
|
+
fixAttempts = fixed.fixAttempts;
|
|
523
|
+
stopReason = fixed.stopReason;
|
|
524
|
+
// Tests still failing after exhausting the attempt budget → repeated-failure.
|
|
525
|
+
if (stopReason === undefined &&
|
|
526
|
+
hasFailure(testResults) &&
|
|
527
|
+
fixAttempts >= config.safety.maxFailedFixAttempts) {
|
|
528
|
+
stopReason = "repeated-failure";
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
// 16. Update the session + mark the subtask done.
|
|
532
|
+
await recordOutcome({
|
|
533
|
+
taskPath,
|
|
534
|
+
session,
|
|
535
|
+
subtask,
|
|
536
|
+
plan,
|
|
537
|
+
patchPath,
|
|
538
|
+
testResults,
|
|
539
|
+
task,
|
|
540
|
+
now: deps.now,
|
|
541
|
+
});
|
|
542
|
+
return {
|
|
543
|
+
subtaskId: subtask.id,
|
|
544
|
+
applied: true,
|
|
545
|
+
done: false,
|
|
546
|
+
patchPath,
|
|
547
|
+
testResults,
|
|
548
|
+
fixAttempts,
|
|
549
|
+
...(stopReason !== undefined ? { stopReason } : {}),
|
|
550
|
+
};
|
|
551
|
+
}
|
|
552
|
+
/** Persist the step outcome — task first (mark subtask done), then session. */
|
|
553
|
+
async function recordOutcome(o) {
|
|
554
|
+
const updatedSubtasks = o.task.subtasks.map((s) => s.id === o.subtask.id ? { ...s, status: "done" } : s);
|
|
555
|
+
const editedTask = setSubtasks(o.task, updatedSubtasks);
|
|
556
|
+
await fs.writeFile(editedTask.path, serializeTask(editedTask), "utf8");
|
|
557
|
+
const changeLines = o.plan.touchedFiles.map((f) => {
|
|
558
|
+
const op = o.plan.adds.includes(f)
|
|
559
|
+
? "add"
|
|
560
|
+
: o.plan.deletes.includes(f)
|
|
561
|
+
? "delete"
|
|
562
|
+
: "modify";
|
|
563
|
+
return `- ${f} (${op})`;
|
|
564
|
+
});
|
|
565
|
+
const testLines = o.testResults.map((r) => `- ${r.exitCode === 0 ? "PASS" : "FAIL"} ${r.command} (exit ${r.exitCode})`);
|
|
566
|
+
const anyFail = o.testResults.some((r) => r.exitCode !== 0);
|
|
567
|
+
const next = o.task.subtasks.find((s) => s.id !== o.subtask.id && s.status === "pending");
|
|
568
|
+
const nextStep = next
|
|
569
|
+
? `${next.id}: ${next.title}`
|
|
570
|
+
: "All subtasks complete. Run `localptp summarize` (0001_07) or close the task.";
|
|
571
|
+
const currentState = `Applied ${o.subtask.id} (${o.subtask.title}).\n\n` +
|
|
572
|
+
`Changes:\n${changeLines.join("\n") || "- (none)"}\n` +
|
|
573
|
+
(o.patchPath ? `\nPatch artifact: ${o.patchPath}\n` : "") +
|
|
574
|
+
(testLines.length > 0
|
|
575
|
+
? `\nTests:\n${testLines.join("\n")}${anyFail ? "\n(One or more tests FAILED — patch not rolled back; Git is the manual rollback.)" : ""}\n`
|
|
576
|
+
: "");
|
|
577
|
+
const risks = anyFail
|
|
578
|
+
? ["Tests failed after applying the patch; the change was not rolled back."]
|
|
579
|
+
: [];
|
|
580
|
+
await updateSession(o.session, {
|
|
581
|
+
currentState,
|
|
582
|
+
nextStep,
|
|
583
|
+
...(risks.length > 0 ? { risks } : {}),
|
|
584
|
+
}, { now: o.now });
|
|
585
|
+
}
|
|
586
|
+
//# sourceMappingURL=runStep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runStep.js","sourceRoot":"","sources":["../../src/core/runStep.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AppConfig } from "../types/config.js";
|
|
2
|
+
import type { PatchPlan, SafetyVerdict } from "../types/patch.js";
|
|
3
|
+
/**
|
|
4
|
+
* Evaluate a parsed plan against the safety config. Pure — `root` is accepted
|
|
5
|
+
* for parity with the wider seam but not dereferenced (no fs/git here).
|
|
6
|
+
*/
|
|
7
|
+
export declare function evaluate(plan: PatchPlan, config: AppConfig, _root: string): SafetyVerdict;
|