rafcode 3.0.0 → 3.8.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 (235) hide show
  1. package/.claude/settings.local.json +3 -1
  2. package/CLAUDE.md +0 -1
  3. package/RAF/38-dual-wielder/decisions.md +9 -0
  4. package/RAF/38-dual-wielder/input.md +6 -1
  5. package/RAF/38-dual-wielder/outcomes/8-e2e-test-codex-provider.md +139 -0
  6. package/RAF/38-dual-wielder/plans/8-e2e-test-codex-provider.md +95 -0
  7. package/RAF/39-pathless-rover/decisions.md +16 -0
  8. package/RAF/39-pathless-rover/input.md +2 -0
  9. package/RAF/39-pathless-rover/outcomes/1-fix-codex-stream-renderer.md +21 -0
  10. package/RAF/39-pathless-rover/outcomes/2-wire-provider-flag.md +28 -0
  11. package/RAF/39-pathless-rover/outcomes/3-remove-worktree-flag-do.md +41 -0
  12. package/RAF/39-pathless-rover/outcomes/4-remove-worktree-flag-plan-amend.md +30 -0
  13. package/RAF/39-pathless-rover/outcomes/5-update-prompts-and-docs.md +26 -0
  14. package/RAF/39-pathless-rover/plans/1-fix-codex-stream-renderer.md +43 -0
  15. package/RAF/39-pathless-rover/plans/2-wire-provider-flag.md +48 -0
  16. package/RAF/39-pathless-rover/plans/3-remove-worktree-flag-do.md +41 -0
  17. package/RAF/39-pathless-rover/plans/4-remove-worktree-flag-plan-amend.md +43 -0
  18. package/RAF/39-pathless-rover/plans/5-update-prompts-and-docs.md +31 -0
  19. package/RAF/40-numeric-order-fix/decisions.md +7 -0
  20. package/RAF/40-numeric-order-fix/input.md +19 -0
  21. package/RAF/40-numeric-order-fix/outcomes/1-fix-numeric-sort-order.md +18 -0
  22. package/RAF/40-numeric-order-fix/outcomes/2-add-npm-keywords.md +10 -0
  23. package/RAF/40-numeric-order-fix/plans/1-fix-numeric-sort-order.md +48 -0
  24. package/RAF/40-numeric-order-fix/plans/2-add-npm-keywords.md +23 -0
  25. package/RAF/41-echo-chamber/decisions.md +13 -0
  26. package/RAF/41-echo-chamber/input.md +4 -0
  27. package/RAF/41-echo-chamber/outcomes/1-update-codex-model-defaults.md +24 -0
  28. package/RAF/41-echo-chamber/outcomes/2-e2e-test-codex-provider.md +74 -0
  29. package/RAF/41-echo-chamber/plans/1-update-codex-model-defaults.md +28 -0
  30. package/RAF/41-echo-chamber/plans/2-e2e-test-codex-provider.md +103 -0
  31. package/RAF/42-patch-parade/decisions.md +29 -0
  32. package/RAF/42-patch-parade/input.md +9 -0
  33. package/RAF/42-patch-parade/outcomes/1-fix-codex-model-resolution.md +36 -0
  34. package/RAF/42-patch-parade/outcomes/2-fix-provider-aware-name-generation.md +31 -0
  35. package/RAF/42-patch-parade/outcomes/3-fix-codex-error-event-rendering.md +32 -0
  36. package/RAF/42-patch-parade/outcomes/4-update-cli-help-docs.md +28 -0
  37. package/RAF/42-patch-parade/outcomes/5-update-default-codex-models-to-gpt-5-4.md +33 -0
  38. package/RAF/42-patch-parade/outcomes/6-unify-model-config-schema.md +89 -0
  39. package/RAF/42-patch-parade/plans/1-fix-codex-model-resolution.md +35 -0
  40. package/RAF/42-patch-parade/plans/2-fix-provider-aware-name-generation.md +38 -0
  41. package/RAF/42-patch-parade/plans/3-fix-codex-error-event-rendering.md +32 -0
  42. package/RAF/42-patch-parade/plans/4-update-cli-help-docs.md +31 -0
  43. package/RAF/42-patch-parade/plans/5-update-default-codex-models-to-gpt-5-4.md +35 -0
  44. package/RAF/42-patch-parade/plans/6-unify-model-config-schema.md +46 -0
  45. package/RAF/43-swiss-army/decisions.md +34 -0
  46. package/RAF/43-swiss-army/input.md +7 -0
  47. package/RAF/43-swiss-army/outcomes/1-fix-model-validation.md +21 -0
  48. package/RAF/43-swiss-army/outcomes/2-update-commit-format.md +31 -0
  49. package/RAF/43-swiss-army/outcomes/3-wire-reasoning-effort.md +28 -0
  50. package/RAF/43-swiss-army/outcomes/4-remove-provider-flag.md +27 -0
  51. package/RAF/43-swiss-army/outcomes/5-config-wizard-validation.md +23 -0
  52. package/RAF/43-swiss-army/outcomes/6-add-fast-mode.md +32 -0
  53. package/RAF/43-swiss-army/outcomes/7-config-preset.md +31 -0
  54. package/RAF/43-swiss-army/plans/1-fix-model-validation.md +38 -0
  55. package/RAF/43-swiss-army/plans/2-update-commit-format.md +46 -0
  56. package/RAF/43-swiss-army/plans/3-wire-reasoning-effort.md +39 -0
  57. package/RAF/43-swiss-army/plans/4-remove-provider-flag.md +43 -0
  58. package/RAF/43-swiss-army/plans/5-config-wizard-validation.md +42 -0
  59. package/RAF/43-swiss-army/plans/6-add-fast-mode.md +46 -0
  60. package/RAF/43-swiss-army/plans/7-config-preset.md +51 -0
  61. package/RAF/44-config-api-change/decisions.md +22 -0
  62. package/RAF/44-config-api-change/input.md +5 -0
  63. package/RAF/44-config-api-change/outcomes/1-restructure-config-subcommands.md +19 -0
  64. package/RAF/44-config-api-change/outcomes/2-move-preset-under-config.md +17 -0
  65. package/RAF/44-config-api-change/outcomes/3-update-existing-tests-for-config-api.md +14 -0
  66. package/RAF/44-config-api-change/outcomes/4-update-config-command-docs.md +11 -0
  67. package/RAF/44-config-api-change/outcomes/5-fix-codex-name-generation.md +18 -0
  68. package/RAF/44-config-api-change/plans/1-restructure-config-subcommands.md +37 -0
  69. package/RAF/44-config-api-change/plans/2-move-preset-under-config.md +38 -0
  70. package/RAF/44-config-api-change/plans/3-update-existing-tests-for-config-api.md +38 -0
  71. package/RAF/44-config-api-change/plans/4-update-config-command-docs.md +36 -0
  72. package/RAF/44-config-api-change/plans/5-fix-codex-name-generation.md +49 -0
  73. package/RAF/45-signal-cairn/decisions.md +7 -0
  74. package/RAF/45-signal-cairn/input.md +2 -0
  75. package/RAF/45-signal-cairn/outcomes/1-rename-provider-to-harness.md +19 -0
  76. package/RAF/45-signal-cairn/outcomes/2-normalize-model-display-names.md +18 -0
  77. package/RAF/45-signal-cairn/plans/1-rename-provider-to-harness.md +40 -0
  78. package/RAF/45-signal-cairn/plans/2-normalize-model-display-names.md +41 -0
  79. package/RAF/45-signal-lantern/decisions.md +10 -0
  80. package/RAF/45-signal-lantern/input.md +2 -0
  81. package/RAF/45-signal-lantern/outcomes/1-add-effort-and-fast-to-do-model-display.md +15 -0
  82. package/RAF/45-signal-lantern/outcomes/2-capture-codex-post-run-token-usage.md +15 -0
  83. package/RAF/45-signal-lantern/outcomes/3-show-codex-token-summaries-without-fake-cost.md +14 -0
  84. package/RAF/45-signal-lantern/plans/1-add-effort-and-fast-to-do-model-display.md +38 -0
  85. package/RAF/45-signal-lantern/plans/2-capture-codex-post-run-token-usage.md +37 -0
  86. package/RAF/45-signal-lantern/plans/3-show-codex-token-summaries-without-fake-cost.md +40 -0
  87. package/RAF/46-lantern-arc/decisions.md +19 -0
  88. package/RAF/46-lantern-arc/input.md +6 -0
  89. package/RAF/46-lantern-arc/outcomes/1-remove-spark-alias.md +16 -0
  90. package/RAF/46-lantern-arc/outcomes/2-clean-up-worktree-plan-command.md +30 -0
  91. package/RAF/46-lantern-arc/outcomes/3-fix-token-usage-accumulation.md +32 -0
  92. package/RAF/46-lantern-arc/outcomes/4-display-effort-in-compact-mode.md +22 -0
  93. package/RAF/46-lantern-arc/outcomes/5-codex-fast-mode-research.md +38 -0
  94. package/RAF/46-lantern-arc/outcomes/6-optimize-llm-prompts.md +39 -0
  95. package/RAF/46-lantern-arc/plans/1-remove-spark-alias.md +38 -0
  96. package/RAF/46-lantern-arc/plans/2-clean-up-worktree-plan-command.md +33 -0
  97. package/RAF/46-lantern-arc/plans/3-fix-token-usage-accumulation.md +33 -0
  98. package/RAF/46-lantern-arc/plans/4-display-effort-in-compact-mode.md +28 -0
  99. package/RAF/46-lantern-arc/plans/5-codex-fast-mode-research.md +34 -0
  100. package/RAF/46-lantern-arc/plans/6-optimize-llm-prompts.md +48 -0
  101. package/RAF/47-signal-trim/decisions.md +13 -0
  102. package/RAF/47-signal-trim/input.md +2 -0
  103. package/RAF/47-signal-trim/plans/1-remove-cache-from-status.md +73 -0
  104. package/README.md +50 -63
  105. package/dist/commands/config.d.ts.map +1 -1
  106. package/dist/commands/config.js +47 -49
  107. package/dist/commands/config.js.map +1 -1
  108. package/dist/commands/do.d.ts +2 -0
  109. package/dist/commands/do.d.ts.map +1 -1
  110. package/dist/commands/do.js +91 -230
  111. package/dist/commands/do.js.map +1 -1
  112. package/dist/commands/plan.d.ts.map +1 -1
  113. package/dist/commands/plan.js +54 -259
  114. package/dist/commands/plan.js.map +1 -1
  115. package/dist/commands/preset.d.ts +3 -0
  116. package/dist/commands/preset.d.ts.map +1 -0
  117. package/dist/commands/preset.js +158 -0
  118. package/dist/commands/preset.js.map +1 -0
  119. package/dist/core/claude-runner.d.ts +2 -0
  120. package/dist/core/claude-runner.d.ts.map +1 -1
  121. package/dist/core/claude-runner.js +36 -12
  122. package/dist/core/claude-runner.js.map +1 -1
  123. package/dist/core/codex-runner.d.ts +1 -0
  124. package/dist/core/codex-runner.d.ts.map +1 -1
  125. package/dist/core/codex-runner.js +26 -7
  126. package/dist/core/codex-runner.js.map +1 -1
  127. package/dist/core/failure-analyzer.js +2 -1
  128. package/dist/core/failure-analyzer.js.map +1 -1
  129. package/dist/core/git.d.ts +2 -2
  130. package/dist/core/git.d.ts.map +1 -1
  131. package/dist/core/git.js +53 -3
  132. package/dist/core/git.js.map +1 -1
  133. package/dist/core/project-manager.d.ts.map +1 -1
  134. package/dist/core/project-manager.js +2 -2
  135. package/dist/core/project-manager.js.map +1 -1
  136. package/dist/core/pull-request.js +5 -5
  137. package/dist/core/pull-request.js.map +1 -1
  138. package/dist/core/runner-factory.d.ts +4 -4
  139. package/dist/core/runner-factory.d.ts.map +1 -1
  140. package/dist/core/runner-factory.js +8 -8
  141. package/dist/core/runner-factory.js.map +1 -1
  142. package/dist/core/runner-interface.d.ts +1 -1
  143. package/dist/core/runner-types.d.ts +17 -4
  144. package/dist/core/runner-types.d.ts.map +1 -1
  145. package/dist/core/state-derivation.js +3 -3
  146. package/dist/core/state-derivation.js.map +1 -1
  147. package/dist/parsers/codex-stream-renderer.d.ts +28 -4
  148. package/dist/parsers/codex-stream-renderer.d.ts.map +1 -1
  149. package/dist/parsers/codex-stream-renderer.js +110 -0
  150. package/dist/parsers/codex-stream-renderer.js.map +1 -1
  151. package/dist/prompts/amend.d.ts +0 -1
  152. package/dist/prompts/amend.d.ts.map +1 -1
  153. package/dist/prompts/amend.js +31 -104
  154. package/dist/prompts/amend.js.map +1 -1
  155. package/dist/prompts/execution.d.ts.map +1 -1
  156. package/dist/prompts/execution.js +17 -34
  157. package/dist/prompts/execution.js.map +1 -1
  158. package/dist/prompts/planning.d.ts.map +1 -1
  159. package/dist/prompts/planning.js +23 -123
  160. package/dist/prompts/planning.js.map +1 -1
  161. package/dist/types/config.d.ts +33 -32
  162. package/dist/types/config.d.ts.map +1 -1
  163. package/dist/types/config.js +14 -28
  164. package/dist/types/config.js.map +1 -1
  165. package/dist/utils/config.d.ts +36 -16
  166. package/dist/utils/config.d.ts.map +1 -1
  167. package/dist/utils/config.js +209 -104
  168. package/dist/utils/config.js.map +1 -1
  169. package/dist/utils/name-generator.d.ts.map +1 -1
  170. package/dist/utils/name-generator.js +25 -12
  171. package/dist/utils/name-generator.js.map +1 -1
  172. package/dist/utils/paths.d.ts +5 -0
  173. package/dist/utils/paths.d.ts.map +1 -1
  174. package/dist/utils/paths.js +9 -0
  175. package/dist/utils/paths.js.map +1 -1
  176. package/dist/utils/terminal-symbols.d.ts +15 -2
  177. package/dist/utils/terminal-symbols.d.ts.map +1 -1
  178. package/dist/utils/terminal-symbols.js +36 -4
  179. package/dist/utils/terminal-symbols.js.map +1 -1
  180. package/dist/utils/token-tracker.d.ts +6 -1
  181. package/dist/utils/token-tracker.d.ts.map +1 -1
  182. package/dist/utils/token-tracker.js +84 -51
  183. package/dist/utils/token-tracker.js.map +1 -1
  184. package/dist/utils/validation.d.ts +1 -2
  185. package/dist/utils/validation.d.ts.map +1 -1
  186. package/dist/utils/validation.js +4 -25
  187. package/dist/utils/validation.js.map +1 -1
  188. package/package.json +7 -2
  189. package/src/commands/config.ts +60 -63
  190. package/src/commands/do.ts +96 -262
  191. package/src/commands/plan.ts +55 -279
  192. package/src/commands/preset.ts +186 -0
  193. package/src/core/claude-runner.ts +45 -5
  194. package/src/core/codex-runner.ts +32 -7
  195. package/src/core/failure-analyzer.ts +2 -1
  196. package/src/core/git.ts +57 -3
  197. package/src/core/project-manager.ts +2 -1
  198. package/src/core/pull-request.ts +5 -5
  199. package/src/core/runner-factory.ts +9 -9
  200. package/src/core/runner-interface.ts +1 -1
  201. package/src/core/runner-types.ts +17 -4
  202. package/src/core/state-derivation.ts +3 -3
  203. package/src/parsers/codex-stream-renderer.ts +149 -4
  204. package/src/prompts/amend.ts +30 -105
  205. package/src/prompts/config-docs.md +206 -62
  206. package/src/prompts/execution.ts +17 -34
  207. package/src/prompts/planning.ts +23 -124
  208. package/src/types/config.ts +47 -59
  209. package/src/utils/config.ts +248 -115
  210. package/src/utils/name-generator.ts +29 -13
  211. package/src/utils/paths.ts +10 -0
  212. package/src/utils/terminal-symbols.ts +46 -6
  213. package/src/utils/token-tracker.ts +96 -57
  214. package/src/utils/validation.ts +5 -30
  215. package/tests/unit/amend-prompt.test.ts +3 -2
  216. package/tests/unit/claude-runner-interactive.test.ts +21 -3
  217. package/tests/unit/claude-runner.test.ts +39 -0
  218. package/tests/unit/codex-runner.test.ts +163 -0
  219. package/tests/unit/codex-stream-renderer.test.ts +127 -0
  220. package/tests/unit/command-output.test.ts +57 -0
  221. package/tests/unit/commit-planning-artifacts-worktree.test.ts +24 -7
  222. package/tests/unit/commit-planning-artifacts.test.ts +26 -4
  223. package/tests/unit/config-command.test.ts +215 -303
  224. package/tests/unit/config.test.ts +319 -235
  225. package/tests/unit/dependency-integration.test.ts +27 -1
  226. package/tests/unit/do-model-display.test.ts +35 -0
  227. package/tests/unit/execution-prompt.test.ts +49 -19
  228. package/tests/unit/name-generator.test.ts +82 -12
  229. package/tests/unit/plan-command-auto-flag.test.ts +7 -10
  230. package/tests/unit/plan-command.test.ts +14 -17
  231. package/tests/unit/planning-prompt.test.ts +9 -8
  232. package/tests/unit/terminal-symbols.test.ts +94 -3
  233. package/tests/unit/token-tracker.test.ts +180 -1
  234. package/tests/unit/validation.test.ts +9 -41
  235. package/tests/unit/worktree-flag-override.test.ts +0 -186
@@ -9,21 +9,44 @@
9
9
  * - TodoList: Task tracking (skipped)
10
10
  */
11
11
 
12
+ import type { UsageData } from '../types/config.js';
12
13
  import type { RenderResult } from './stream-renderer.js';
13
14
 
14
15
  export interface CodexEvent {
15
16
  type: string;
16
- /** AgentMessage fields */
17
+ id?: string;
18
+ model?: string;
19
+ /** Claude flat-format fields (AgentMessage) */
17
20
  content?: string;
18
- /** CommandExecution fields */
21
+ /** Claude flat-format fields (CommandExecution) */
19
22
  command?: string;
20
23
  exit_code?: number;
21
- /** FileChange fields */
24
+ /** Claude flat-format fields (FileChange) */
22
25
  file_path?: string;
23
26
  change_kind?: string;
24
- /** McpToolCall fields */
27
+ /** Claude flat-format fields (McpToolCall) */
25
28
  tool_name?: string;
26
29
  server_name?: string;
30
+ /** Real Codex nested item (for item.completed / item.started) */
31
+ item?: {
32
+ type: string;
33
+ text?: string;
34
+ command?: string;
35
+ exit_code?: number;
36
+ path?: string;
37
+ change_kind?: string;
38
+ message?: string;
39
+ };
40
+ /** Error message (for error / turn.failed events) */
41
+ message?: string;
42
+ /** Nested error object (for turn.failed events) */
43
+ error?: { message?: string };
44
+ /** Usage data (for turn.completed events) */
45
+ usage?: {
46
+ input_tokens?: number;
47
+ output_tokens?: number;
48
+ total_tokens?: number;
49
+ };
27
50
  }
28
51
 
29
52
  function truncate(text: string, maxLen: number): string {
@@ -65,6 +88,23 @@ export function renderCodexStreamEvent(line: string): RenderResult {
65
88
  // Skip todo list events - minimal noise
66
89
  return { display: '', textContent: '' };
67
90
 
91
+ // Real Codex CLI event types (nested format)
92
+ case 'item.completed':
93
+ return renderItemCompleted(event);
94
+
95
+ case 'item.started':
96
+ // Skip started events — we render on completion
97
+ return { display: '', textContent: '' };
98
+
99
+ case 'turn.completed':
100
+ return renderTurnCompleted(event);
101
+
102
+ case 'error':
103
+ return renderError(event);
104
+
105
+ case 'turn.failed':
106
+ return renderTurnFailed(event);
107
+
68
108
  default:
69
109
  // Skip unknown event types gracefully
70
110
  return { display: '', textContent: '' };
@@ -106,3 +146,108 @@ function renderMcpToolCall(event: CodexEvent): RenderResult {
106
146
  textContent: '',
107
147
  };
108
148
  }
149
+
150
+ // --- Real Codex CLI event handlers (nested format) ---
151
+
152
+ function renderItemCompleted(event: CodexEvent): RenderResult {
153
+ const item = event.item;
154
+ if (!item) return { display: '', textContent: '' };
155
+
156
+ switch (item.type) {
157
+ case 'agent_message': {
158
+ const text = item.text ?? '';
159
+ return {
160
+ display: text ? text + '\n' : '',
161
+ textContent: text,
162
+ };
163
+ }
164
+ case 'command_execution': {
165
+ const cmd = item.command ?? '';
166
+ const exitCode = item.exit_code ?? 0;
167
+ const status = exitCode === 0 ? '✓' : `✗ exit ${exitCode}`;
168
+ return {
169
+ display: ` → Running: ${truncate(cmd, 120)} [${status}]\n`,
170
+ textContent: '',
171
+ };
172
+ }
173
+ case 'file_change': {
174
+ const filePath = item.path ?? 'unknown';
175
+ const kind = item.change_kind ?? 'modified';
176
+ return {
177
+ display: ` → File ${kind}: ${filePath}\n`,
178
+ textContent: '',
179
+ };
180
+ }
181
+ case 'error': {
182
+ const msg = item.message ?? 'Unknown error';
183
+ return {
184
+ display: ` ✗ Error: ${msg}\n`,
185
+ textContent: msg,
186
+ };
187
+ }
188
+ default:
189
+ return { display: '', textContent: '' };
190
+ }
191
+ }
192
+
193
+ function renderTurnCompleted(event: CodexEvent): RenderResult {
194
+ const usageData = extractUsageData(event);
195
+
196
+ if (event.usage) {
197
+ const { input_tokens, output_tokens } = event.usage;
198
+ const parts: string[] = [];
199
+ if (input_tokens !== undefined) parts.push(`in: ${input_tokens}`);
200
+ if (output_tokens !== undefined) parts.push(`out: ${output_tokens}`);
201
+ if (parts.length > 0) {
202
+ return {
203
+ display: ` → Usage: ${parts.join(', ')}\n`,
204
+ textContent: '',
205
+ usageData,
206
+ };
207
+ }
208
+ }
209
+ return { display: '', textContent: '', usageData };
210
+ }
211
+
212
+ function extractUsageData(event: CodexEvent): UsageData | undefined {
213
+ if (!event.usage) {
214
+ return undefined;
215
+ }
216
+
217
+ const modelId = event.model ?? 'codex';
218
+ const inputTokens = event.usage.input_tokens ?? 0;
219
+ const outputTokens = event.usage.output_tokens ?? 0;
220
+
221
+ return {
222
+ inputTokens,
223
+ outputTokens,
224
+ cacheReadInputTokens: 0,
225
+ cacheCreationInputTokens: 0,
226
+ modelUsage: {
227
+ [modelId]: {
228
+ inputTokens,
229
+ outputTokens,
230
+ cacheReadInputTokens: 0,
231
+ cacheCreationInputTokens: 0,
232
+ costUsd: null,
233
+ },
234
+ },
235
+ totalCostUsd: null,
236
+ };
237
+ }
238
+
239
+ function renderError(event: CodexEvent): RenderResult {
240
+ const msg = event.message ?? 'Unknown error';
241
+ return {
242
+ display: ` ✗ Error: ${msg}\n`,
243
+ textContent: msg,
244
+ };
245
+ }
246
+
247
+ function renderTurnFailed(event: CodexEvent): RenderResult {
248
+ const msg = event.error?.message ?? event.message ?? 'Turn failed';
249
+ return {
250
+ display: ` ✗ Failed: ${msg}\n`,
251
+ textContent: msg,
252
+ };
253
+ }
@@ -6,7 +6,6 @@ export interface AmendPromptParams {
6
6
  existingTasks: Array<DerivedTask & { taskName: string }>;
7
7
  nextTaskNumber: number;
8
8
  newTaskDescription: string;
9
- worktreeMode?: boolean;
10
9
  }
11
10
 
12
11
  export interface AmendPromptResult {
@@ -25,9 +24,7 @@ export function getAmendPrompt(params: AmendPromptParams): AmendPromptResult {
25
24
  existingTasks,
26
25
  nextTaskNumber,
27
26
  newTaskDescription,
28
- worktreeMode,
29
27
  } = params;
30
- const worktreeFlag = worktreeMode ? ' --worktree' : '';
31
28
 
32
29
  const existingTasksSummary = existingTasks
33
30
  .map((task) => {
@@ -59,15 +56,14 @@ export function getAmendPrompt(params: AmendPromptParams): AmendPromptResult {
59
56
  ? modifiableTasks.map((t) => `- Task ${t.id}: ${t.taskName}`).join('\n')
60
57
  : '(none)';
61
58
 
62
- const systemPrompt = `You are a project planning assistant for RAF (Ralph's Automation Framework). Your task is to ADD NEW TASKS or MODIFY PENDING tasks in an existing project.
59
+ const systemPrompt = `You are a project planning assistant for RAF (Ralph's Automation Framework). Add new tasks or modify pending tasks in an existing project.
63
60
 
64
- ## IMPORTANT: Amendment Mode
61
+ ## Amendment Mode
65
62
 
66
- You are in AMENDMENT MODE. This means:
67
- - You MAY modify [MODIFIABLE] tasks (pending/failed) if the user requests changes
68
- - NEVER modify [PROTECTED] tasks (completed) - their outcomes depend on the original plan
69
- - DO NOT renumber existing tasks
70
- - You can create NEW tasks starting from number ${encodeTaskId(nextTaskNumber)}
63
+ - [PROTECTED] tasks (completed): NEVER modify — their outcomes depend on the original plan
64
+ - [MODIFIABLE] tasks (pending/failed): MAY modify if the user requests changes
65
+ - Do NOT renumber existing tasks
66
+ - New tasks start from number ${encodeTaskId(nextTaskNumber)}
71
67
 
72
68
  ## Project Location
73
69
 
@@ -75,54 +71,30 @@ Project folder: ${projectPath}
75
71
 
76
72
  ## Existing Tasks
77
73
 
78
- The following tasks already exist in this project:
79
-
80
74
  ${existingTasksSummary}
81
75
 
82
- ### Protected Tasks (COMPLETED - cannot be modified)
76
+ ### Protected (COMPLETED)
83
77
  ${protectedTasksList}
84
78
 
85
- ### Modifiable Tasks (PENDING/FAILED - can be modified if requested)
79
+ ### Modifiable (PENDING/FAILED)
86
80
  ${modifiableTasksList}
87
81
 
88
82
  ## Instructions
89
83
 
90
84
  ### Step 1: Read Context
91
85
 
92
- First, read the original project description from:
93
- - ${projectPath}/input.md
94
-
95
- And review existing decisions from:
96
- - ${projectPath}/decisions.md (if it exists)
86
+ Read the original project description (\`${projectPath}/input.md\`) and existing decisions (\`${projectPath}/decisions.md\`, if it exists).
97
87
 
98
88
  ### Step 2: Analyze New Requirements
99
89
 
100
- Read the user's description of new tasks and identify what needs to be added. Consider:
101
- - How the new tasks relate to existing ones
102
- - Dependencies on completed tasks (check the ## Dependencies section in existing plan files)
103
- - Whether new tasks should reference existing task outcomes
104
-
105
- **Identifying Follow-up Tasks**: When a new task is a follow-up, fix, or iteration of a previously completed task, you MUST reference the previous task's outcome in the new plan's Context section. This gives the executing agent full context about what was done before.
106
-
107
- Use this format in the Context section:
90
+ Consider how new tasks relate to existing ones and their dependencies. For follow-up/fix tasks, reference the previous task's outcome in the Context section:
108
91
  \`This is a follow-up to task NN. See outcome: {projectPath}/outcomes/NN-task-name.md\`
109
92
 
110
- The outcome file paths for completed tasks are listed above in the Existing Tasks section.
111
-
112
93
  ### Step 3: Interview the User
113
94
 
114
- For EACH new task you identify, use the AskUserQuestion tool to gather:
115
- - Specific requirements and constraints
116
- - Technology preferences
117
- - Any existing code or patterns to follow
118
- - Edge cases to handle
119
-
120
- ### Step 3.5: Record Decisions
95
+ For EACH new task, use AskUserQuestion to gather specific requirements, technology preferences, existing patterns, and edge cases.
121
96
 
122
- After EACH interview question is answered, append the Q&A pair to the existing decisions file:
123
- - ${projectPath}/decisions.md
124
-
125
- Use this format:
97
+ After EACH answer, append the Q&A to \`${projectPath}/decisions.md\`:
126
98
  \`\`\`markdown
127
99
  ## [Question asked]
128
100
  [User's answer]
@@ -130,12 +102,9 @@ Use this format:
130
102
 
131
103
  ### Step 4: Create New Plan Files
132
104
 
133
- After interviewing the user about all NEW tasks, create plan files starting from the next available number:
134
- - ${projectPath}/plans/${encodeTaskId(nextTaskNumber)}-task-name.md
135
- - ${projectPath}/plans/${encodeTaskId(nextTaskNumber + 1)}-task-name.md
136
- - etc.
105
+ Create plan files starting from \`${projectPath}/plans/${encodeTaskId(nextTaskNumber)}-task-name.md\`. Use kebab-case names.
137
106
 
138
- Each plan file MUST have Obsidian-style frontmatter at the top, before the \`# Task:\` heading. The frontmatter uses standard YAML format with opening and closing \`---\` delimiters:
107
+ Each plan file MUST have this structure:
139
108
 
140
109
  \`\`\`markdown
141
110
  ---
@@ -144,95 +113,51 @@ effort: medium
144
113
  # Task: [Task Name]
145
114
 
146
115
  ## Objective
147
- [Clear, one-sentence description of what this task accomplishes]
116
+ [Clear, one-sentence description]
148
117
 
149
118
  ## Context
150
- [Why this task is needed, how it fits into the larger project]
151
- [Reference relevant existing tasks if applicable]
152
- [For follow-up/fix tasks: "This is a follow-up to task NN. See outcome: {projectPath}/outcomes/NN-task-name.md"]
119
+ [Why this task is needed, relation to existing tasks]
120
+ [For follow-ups: "This is a follow-up to task NN. See outcome: {projectPath}/outcomes/NN-task-name.md"]
153
121
 
154
122
  ## Dependencies
155
- [Optional section - omit if task has no dependencies]
156
- [Comma-separated list of task IDs this task depends on, e.g., "1, 2"]
157
- [If a dependency fails, this task will be automatically blocked]
123
+ [Optional omit if none. Comma-separated task IDs, e.g., "1, 2"]
158
124
 
159
125
  ## Requirements
160
- [Specific requirements gathered from the user interview]
161
126
  - Requirement 1
162
127
  - Requirement 2
163
- - ...
164
128
 
165
129
  ## Implementation Steps
166
130
  1. [Step 1]
167
131
  2. [Step 2]
168
- 3. [Step 3]
169
- ...
170
132
 
171
133
  ## Acceptance Criteria
172
134
  - [ ] Criterion 1
173
135
  - [ ] Criterion 2
174
- - [ ] All tests pass
175
136
 
176
137
  ## Notes
177
- [Any additional context, warnings, or considerations]
178
- [Reference to existing task outcomes if relevant]
179
- \`\`\`
180
-
181
- ### Frontmatter Requirements
182
-
183
- The \`effort\` field is REQUIRED in every plan file. It indicates task complexity and determines which model will execute the task:
184
- - \`effort: low\` — Trivial/mechanical changes, simple one-file edits, config changes
185
- - \`effort: medium\` — Well-scoped feature work, bug fixes with clear plans, multi-file changes following existing patterns
186
- - \`effort: high\` — Architectural changes, complex logic, tasks requiring deep codebase understanding
187
-
188
- Optionally, you can add an explicit \`model\` field to override the effort-based model selection:
189
- \`\`\`markdown
190
- ---
191
- effort: medium
192
- model: opus
193
- ---
194
- # Task: ...
138
+ [Additional context, warnings, references to existing task outcomes]
195
139
  \`\`\`
196
140
 
197
- This is rarely needed — prefer using the \`effort\` label so the user's config controls the actual model used.
141
+ **Frontmatter fields:**
142
+ - \`effort\` (REQUIRED): \`low\` (trivial/mechanical), \`medium\` (well-scoped feature work), \`high\` (architectural/complex)
143
+ - \`model\` (optional): Override effort-based model selection. Rarely needed.
198
144
 
199
145
  ### Step 5: Confirm Completion
200
146
 
201
- After creating all new plan files:
202
- 1. Provide a summary of:
203
- - The new tasks you've created, including the effort level for each task. Example format:
204
- - Task 2: add-caching (effort: medium)
205
- - Task 3: update-docs (effort: low)
206
- - How they relate to existing tasks
207
- - Total task count in the project
208
- 2. Display this exit message to the user:
147
+ Summarize new tasks with effort levels, their relation to existing tasks, and total task count. Then display:
209
148
 
210
149
  \`\`\`
211
150
  Planning complete! To exit this session and run your tasks:
212
151
  1. Press Ctrl-C twice to exit
213
- 2. Then run: raf do <project>${worktreeFlag}
152
+ 2. Then run: raf do <project>
214
153
  \`\`\`
215
154
 
216
- ## Important Rules
217
-
218
- 1. NEVER modify COMPLETED task plans - they are [PROTECTED] because their outcomes depend on the original plan
219
- 2. You MAY modify non-completed task plans (pending/failed) if the user requests changes - they are [MODIFIABLE]
220
- 3. ALWAYS interview the user before creating or modifying plans
221
- 4. New tasks start from number ${encodeTaskId(nextTaskNumber)}
222
- 5. Use descriptive, kebab-case names for plan files
223
- 6. Each plan should be self-contained with all context needed
224
- 7. Specify task dependencies using the ## Dependencies section with task IDs only (e.g., "1, 2")
225
- 8. Tasks without dependencies should omit the Dependencies section entirely
226
- 9. Be specific - vague plans lead to poor execution
227
- 10. ALWAYS include the \`effort\` frontmatter field in every plan file — assess each task's complexity
228
-
229
- ## Plan Output Style
230
-
231
- Plans can include whatever level of detail you deem helpful for the executing agent. Use your judgment:
232
- - Include implementation details when they clarify the approach
233
- - Code snippets are acceptable when they help illustrate a specific pattern
234
- - File paths are helpful when referencing existing project files, patterns, or directories
235
- - Focus on clarity — the goal is for the executing agent to understand what needs to be done`;
155
+ ## Rules
156
+
157
+ - Always interview the user before creating or modifying plans
158
+ - Each plan must be self-contained with all context needed
159
+ - Be specific vague plans lead to poor execution
160
+ - Include implementation details, code snippets, and file paths when they clarify the approach`;
236
161
 
237
162
  const userMessage = `I want to add the following new tasks to this project:
238
163