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.
Files changed (186) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +159 -0
  3. package/dist/cli.d.ts +24 -0
  4. package/dist/cli.js +344 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/config.d.ts +14 -0
  7. package/dist/commands/config.js +65 -0
  8. package/dist/commands/config.js.map +1 -0
  9. package/dist/commands/context.d.ts +12 -0
  10. package/dist/commands/context.js +176 -0
  11. package/dist/commands/context.js.map +1 -0
  12. package/dist/commands/doctor.d.ts +16 -0
  13. package/dist/commands/doctor.js +54 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/index.d.ts +13 -0
  16. package/dist/commands/index.js +70 -0
  17. package/dist/commands/index.js.map +1 -0
  18. package/dist/commands/init.d.ts +15 -0
  19. package/dist/commands/init.js +46 -0
  20. package/dist/commands/init.js.map +1 -0
  21. package/dist/commands/plan.d.ts +17 -0
  22. package/dist/commands/plan.js +170 -0
  23. package/dist/commands/plan.js.map +1 -0
  24. package/dist/commands/resume.d.ts +17 -0
  25. package/dist/commands/resume.js +75 -0
  26. package/dist/commands/resume.js.map +1 -0
  27. package/dist/commands/review.d.ts +17 -0
  28. package/dist/commands/review.js +67 -0
  29. package/dist/commands/review.js.map +1 -0
  30. package/dist/commands/run.d.ts +24 -0
  31. package/dist/commands/run.js +65 -0
  32. package/dist/commands/run.js.map +1 -0
  33. package/dist/commands/step.d.ts +44 -0
  34. package/dist/commands/step.js +50 -0
  35. package/dist/commands/step.js.map +1 -0
  36. package/dist/commands/summarize.d.ts +17 -0
  37. package/dist/commands/summarize.js +276 -0
  38. package/dist/commands/summarize.js.map +1 -0
  39. package/dist/commands/task.d.ts +13 -0
  40. package/dist/commands/task.js +53 -0
  41. package/dist/commands/task.js.map +1 -0
  42. package/dist/core/activePointer.d.ts +28 -0
  43. package/dist/core/activePointer.js +84 -0
  44. package/dist/core/activePointer.js.map +1 -0
  45. package/dist/core/approval.d.ts +12 -0
  46. package/dist/core/approval.js +34 -0
  47. package/dist/core/approval.js.map +1 -0
  48. package/dist/core/configManager.d.ts +32 -0
  49. package/dist/core/configManager.js +177 -0
  50. package/dist/core/configManager.js.map +1 -0
  51. package/dist/core/contextBuilder.d.ts +40 -0
  52. package/dist/core/contextBuilder.js +406 -0
  53. package/dist/core/contextBuilder.js.map +1 -0
  54. package/dist/core/memoryLoader.d.ts +4 -0
  55. package/dist/core/memoryLoader.js +35 -0
  56. package/dist/core/memoryLoader.js.map +1 -0
  57. package/dist/core/memoryManager.d.ts +41 -0
  58. package/dist/core/memoryManager.js +181 -0
  59. package/dist/core/memoryManager.js.map +1 -0
  60. package/dist/core/memoryPolicy.d.ts +23 -0
  61. package/dist/core/memoryPolicy.js +73 -0
  62. package/dist/core/memoryPolicy.js.map +1 -0
  63. package/dist/core/modelClient.d.ts +37 -0
  64. package/dist/core/modelClient.js +160 -0
  65. package/dist/core/modelClient.js.map +1 -0
  66. package/dist/core/patchManager.d.ts +89 -0
  67. package/dist/core/patchManager.js +801 -0
  68. package/dist/core/patchManager.js.map +1 -0
  69. package/dist/core/plannerJson.d.ts +23 -0
  70. package/dist/core/plannerJson.js +118 -0
  71. package/dist/core/plannerJson.js.map +1 -0
  72. package/dist/core/promptManager.d.ts +16 -0
  73. package/dist/core/promptManager.js +35 -0
  74. package/dist/core/promptManager.js.map +1 -0
  75. package/dist/core/prompts.d.ts +8 -0
  76. package/dist/core/prompts.js +18 -0
  77. package/dist/core/prompts.js.map +1 -0
  78. package/dist/core/repoIndexer.d.ts +21 -0
  79. package/dist/core/repoIndexer.js +557 -0
  80. package/dist/core/repoIndexer.js.map +1 -0
  81. package/dist/core/reviewEngine.d.ts +53 -0
  82. package/dist/core/reviewEngine.js +229 -0
  83. package/dist/core/reviewEngine.js.map +1 -0
  84. package/dist/core/runLoop.d.ts +26 -0
  85. package/dist/core/runLoop.js +103 -0
  86. package/dist/core/runLoop.js.map +1 -0
  87. package/dist/core/runStep.d.ts +42 -0
  88. package/dist/core/runStep.js +586 -0
  89. package/dist/core/runStep.js.map +1 -0
  90. package/dist/core/safetyManager.d.ts +7 -0
  91. package/dist/core/safetyManager.js +202 -0
  92. package/dist/core/safetyManager.js.map +1 -0
  93. package/dist/core/sessionManager.d.ts +35 -0
  94. package/dist/core/sessionManager.js +265 -0
  95. package/dist/core/sessionManager.js.map +1 -0
  96. package/dist/core/stopConditions.d.ts +24 -0
  97. package/dist/core/stopConditions.js +18 -0
  98. package/dist/core/stopConditions.js.map +1 -0
  99. package/dist/core/taskManager.d.ts +26 -0
  100. package/dist/core/taskManager.js +312 -0
  101. package/dist/core/taskManager.js.map +1 -0
  102. package/dist/core/testRunner.d.ts +27 -0
  103. package/dist/core/testRunner.js +71 -0
  104. package/dist/core/testRunner.js.map +1 -0
  105. package/dist/prompts/coder.d.ts +3 -0
  106. package/dist/prompts/coder.js +46 -0
  107. package/dist/prompts/coder.js.map +1 -0
  108. package/dist/prompts/planner.d.ts +3 -0
  109. package/dist/prompts/planner.js +44 -0
  110. package/dist/prompts/planner.js.map +1 -0
  111. package/dist/prompts/reviewer.d.ts +3 -0
  112. package/dist/prompts/reviewer.js +41 -0
  113. package/dist/prompts/reviewer.js.map +1 -0
  114. package/dist/prompts/summarizer.d.ts +3 -0
  115. package/dist/prompts/summarizer.js +65 -0
  116. package/dist/prompts/summarizer.js.map +1 -0
  117. package/dist/prompts/testFixer.d.ts +3 -0
  118. package/dist/prompts/testFixer.js +33 -0
  119. package/dist/prompts/testFixer.js.map +1 -0
  120. package/dist/repl/approver.d.ts +15 -0
  121. package/dist/repl/approver.js +21 -0
  122. package/dist/repl/approver.js.map +1 -0
  123. package/dist/repl/dispatch.d.ts +48 -0
  124. package/dist/repl/dispatch.js +164 -0
  125. package/dist/repl/dispatch.js.map +1 -0
  126. package/dist/repl/loop.d.ts +14 -0
  127. package/dist/repl/loop.js +124 -0
  128. package/dist/repl/loop.js.map +1 -0
  129. package/dist/repl/tokenize.d.ts +13 -0
  130. package/dist/repl/tokenize.js +56 -0
  131. package/dist/repl/tokenize.js.map +1 -0
  132. package/dist/templates/memory.d.ts +13 -0
  133. package/dist/templates/memory.js +32 -0
  134. package/dist/templates/memory.js.map +1 -0
  135. package/dist/types/config.d.ts +235 -0
  136. package/dist/types/config.js +66 -0
  137. package/dist/types/config.js.map +1 -0
  138. package/dist/types/context.d.ts +78 -0
  139. package/dist/types/context.js +141 -0
  140. package/dist/types/context.js.map +1 -0
  141. package/dist/types/index.d.ts +117 -0
  142. package/dist/types/index.js +24 -0
  143. package/dist/types/index.js.map +1 -0
  144. package/dist/types/model.d.ts +35 -0
  145. package/dist/types/model.js +16 -0
  146. package/dist/types/model.js.map +1 -0
  147. package/dist/types/patch.d.ts +38 -0
  148. package/dist/types/patch.js +11 -0
  149. package/dist/types/patch.js.map +1 -0
  150. package/dist/types/plan.d.ts +86 -0
  151. package/dist/types/plan.js +27 -0
  152. package/dist/types/plan.js.map +1 -0
  153. package/dist/types/review.d.ts +33 -0
  154. package/dist/types/review.js +24 -0
  155. package/dist/types/review.js.map +1 -0
  156. package/dist/types/run.d.ts +34 -0
  157. package/dist/types/run.js +2 -0
  158. package/dist/types/run.js.map +1 -0
  159. package/dist/types/session.d.ts +21 -0
  160. package/dist/types/session.js +2 -0
  161. package/dist/types/session.js.map +1 -0
  162. package/dist/types/summary.d.ts +65 -0
  163. package/dist/types/summary.js +26 -0
  164. package/dist/types/summary.js.map +1 -0
  165. package/dist/types/task.d.ts +31 -0
  166. package/dist/types/task.js +10 -0
  167. package/dist/types/task.js.map +1 -0
  168. package/dist/types/test.d.ts +16 -0
  169. package/dist/types/test.js +2 -0
  170. package/dist/types/test.js.map +1 -0
  171. package/dist/utils/fs.d.ts +13 -0
  172. package/dist/utils/fs.js +65 -0
  173. package/dist/utils/fs.js.map +1 -0
  174. package/dist/utils/gitRoot.d.ts +5 -0
  175. package/dist/utils/gitRoot.js +21 -0
  176. package/dist/utils/gitRoot.js.map +1 -0
  177. package/dist/utils/logger.d.ts +15 -0
  178. package/dist/utils/logger.js +60 -0
  179. package/dist/utils/logger.js.map +1 -0
  180. package/dist/utils/paths.d.ts +13 -0
  181. package/dist/utils/paths.js +24 -0
  182. package/dist/utils/paths.js.map +1 -0
  183. package/dist/utils/tokenEstimate.d.ts +5 -0
  184. package/dist/utils/tokenEstimate.js +8 -0
  185. package/dist/utils/tokenEstimate.js.map +1 -0
  186. 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;