rafcode 1.3.2 → 2.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 (417) hide show
  1. package/.claude/settings.local.json +3 -1
  2. package/CLAUDE.md +118 -22
  3. package/RAF/aaaacu-worktree-weaver/decisions.md +88 -0
  4. package/RAF/aaaacu-worktree-weaver/input.md +27 -0
  5. package/RAF/aaaacu-worktree-weaver/outcomes/01-git-worktree-utilities.md +41 -0
  6. package/RAF/aaaacu-worktree-weaver/outcomes/02-worktree-plan-command.md +44 -0
  7. package/RAF/aaaacu-worktree-weaver/outcomes/03-worktree-do-command.md +58 -0
  8. package/RAF/aaaacu-worktree-weaver/outcomes/04-auto-merge-and-cleanup.md +40 -0
  9. package/RAF/aaaacu-worktree-weaver/outcomes/05-worktree-tests.md +43 -0
  10. package/RAF/aaaacu-worktree-weaver/outcomes/06-update-documentation.md +33 -0
  11. package/RAF/aaaacu-worktree-weaver/plans/01-git-worktree-utilities.md +51 -0
  12. package/RAF/aaaacu-worktree-weaver/plans/02-worktree-plan-command.md +93 -0
  13. package/RAF/aaaacu-worktree-weaver/plans/03-worktree-do-command.md +81 -0
  14. package/RAF/aaaacu-worktree-weaver/plans/04-auto-merge-and-cleanup.md +51 -0
  15. package/RAF/aaaacu-worktree-weaver/plans/05-worktree-tests.md +52 -0
  16. package/RAF/aaaacu-worktree-weaver/plans/06-update-documentation.md +55 -0
  17. package/RAF/aaaacv-trim-the-fat/decisions.md +34 -0
  18. package/RAF/aaaacv-trim-the-fat/input.md +5 -0
  19. package/RAF/aaaacv-trim-the-fat/outcomes/01-add-worktree-support-to-status.md +43 -0
  20. package/RAF/aaaacv-trim-the-fat/outcomes/02-remove-multi-project-from-do.md +50 -0
  21. package/RAF/aaaacv-trim-the-fat/outcomes/03-commit-artifacts-on-amend.md +35 -0
  22. package/RAF/aaaacv-trim-the-fat/outcomes/04-worktree-aware-exit-messages.md +36 -0
  23. package/RAF/aaaacv-trim-the-fat/plans/01-add-worktree-support-to-status.md +43 -0
  24. package/RAF/aaaacv-trim-the-fat/plans/02-remove-multi-project-from-do.md +44 -0
  25. package/RAF/aaaacv-trim-the-fat/plans/03-commit-artifacts-on-amend.md +38 -0
  26. package/RAF/aaaacv-trim-the-fat/plans/04-worktree-aware-exit-messages.md +38 -0
  27. package/RAF/aaaacw-prune-cycle/decisions.md +25 -0
  28. package/RAF/aaaacw-prune-cycle/input.md +5 -0
  29. package/RAF/aaaacw-prune-cycle/outcomes/01-create-worktree-from-branch.md +32 -0
  30. package/RAF/aaaacw-prune-cycle/outcomes/02-cleanup-worktree-on-success.md +33 -0
  31. package/RAF/aaaacw-prune-cycle/outcomes/03-amend-recreate-worktree.md +40 -0
  32. package/RAF/aaaacw-prune-cycle/plans/01-create-worktree-from-branch.md +31 -0
  33. package/RAF/aaaacw-prune-cycle/plans/02-cleanup-worktree-on-success.md +38 -0
  34. package/RAF/aaaacw-prune-cycle/plans/03-amend-recreate-worktree.md +50 -0
  35. package/RAF/aaaacx-epoch-shift/decisions.md +25 -0
  36. package/RAF/aaaacx-epoch-shift/input.md +1 -0
  37. package/RAF/aaaacx-epoch-shift/outcomes/01-epoch-id-generation.md +34 -0
  38. package/RAF/aaaacx-epoch-shift/outcomes/02-update-pattern-matching.md +32 -0
  39. package/RAF/aaaacx-epoch-shift/outcomes/03-update-tests.md +59 -0
  40. package/RAF/aaaacx-epoch-shift/outcomes/04-update-documentation.md +30 -0
  41. package/RAF/aaaacx-epoch-shift/plans/01-epoch-id-generation.md +40 -0
  42. package/RAF/aaaacx-epoch-shift/plans/02-update-pattern-matching.md +60 -0
  43. package/RAF/aaaacx-epoch-shift/plans/03-update-tests.md +48 -0
  44. package/RAF/aaaacx-epoch-shift/plans/04-update-documentation.md +44 -0
  45. package/RAF/ahmpro-merge-guardian/decisions.md +25 -0
  46. package/RAF/ahmpro-merge-guardian/input.md +4 -0
  47. package/RAF/ahmpro-merge-guardian/outcomes/001-fix-amend-worktree-commit.md +45 -0
  48. package/RAF/ahmpro-merge-guardian/outcomes/002-base36-task-ids.md +55 -0
  49. package/RAF/ahmpro-merge-guardian/outcomes/003-worktree-pr-creation.md +41 -0
  50. package/RAF/ahmpro-merge-guardian/outcomes/004-post-execution-picker.md +53 -0
  51. package/RAF/ahmpro-merge-guardian/plans/001-fix-amend-worktree-commit.md +39 -0
  52. package/RAF/ahmpro-merge-guardian/plans/002-base36-task-ids.md +43 -0
  53. package/RAF/ahmpro-merge-guardian/plans/003-worktree-pr-creation.md +43 -0
  54. package/RAF/ahmpro-merge-guardian/plans/004-post-execution-picker.md +51 -0
  55. package/RAF/ahnbcu-letterjam/decisions.md +13 -0
  56. package/RAF/ahnbcu-letterjam/input.md +3 -0
  57. package/RAF/ahnbcu-letterjam/outcomes/01-base26-encoding.md +42 -0
  58. package/RAF/ahnbcu-letterjam/outcomes/02-update-tests.md +38 -0
  59. package/RAF/ahnbcu-letterjam/outcomes/03-migrate-command.md +51 -0
  60. package/RAF/ahnbcu-letterjam/outcomes/04-update-documentation.md +29 -0
  61. package/RAF/ahnbcu-letterjam/plans/01-base26-encoding.md +36 -0
  62. package/RAF/ahnbcu-letterjam/plans/02-update-tests.md +37 -0
  63. package/RAF/ahnbcu-letterjam/plans/03-migrate-command.md +49 -0
  64. package/RAF/ahnbcu-letterjam/plans/04-update-documentation.md +39 -0
  65. package/RAF/ahnwrk-worktree-weaver/decisions.md +19 -0
  66. package/RAF/ahnwrk-worktree-weaver/input.md +4 -0
  67. package/RAF/ahnwrk-worktree-weaver/outcomes/01-remove-co-authored-by.md +20 -0
  68. package/RAF/ahnwrk-worktree-weaver/outcomes/02-update-task-status-format.md +21 -0
  69. package/RAF/ahnwrk-worktree-weaver/outcomes/03-worktree-auto-discovery.md +34 -0
  70. package/RAF/ahnwrk-worktree-weaver/outcomes/04-fix-pr-description.md +30 -0
  71. package/RAF/ahnwrk-worktree-weaver/plans/01-remove-co-authored-by.md +26 -0
  72. package/RAF/ahnwrk-worktree-weaver/plans/02-update-task-status-format.md +27 -0
  73. package/RAF/ahnwrk-worktree-weaver/plans/03-worktree-auto-discovery.md +37 -0
  74. package/RAF/ahnwrk-worktree-weaver/plans/04-fix-pr-description.md +50 -0
  75. package/RAF/ahrren-turbo-finder/decisions.md +19 -0
  76. package/RAF/ahrren-turbo-finder/input.md +2 -0
  77. package/RAF/ahrren-turbo-finder/outcomes/01-worktree-auto-detect.md +40 -0
  78. package/RAF/ahrren-turbo-finder/outcomes/02-medium-effort-do.md +34 -0
  79. package/RAF/ahrren-turbo-finder/plans/01-worktree-auto-detect.md +44 -0
  80. package/RAF/ahrren-turbo-finder/plans/02-medium-effort-do.md +39 -0
  81. package/RAF/ahrtxf-session-sentinel/decisions.md +19 -0
  82. package/RAF/ahrtxf-session-sentinel/input.md +1 -0
  83. package/RAF/ahrtxf-session-sentinel/outcomes/01-capture-session-id.md +37 -0
  84. package/RAF/ahrtxf-session-sentinel/outcomes/02-resume-flag.md +45 -0
  85. package/RAF/ahrtxf-session-sentinel/plans/01-capture-session-id.md +41 -0
  86. package/RAF/ahrtxf-session-sentinel/plans/02-resume-flag.md +51 -0
  87. package/README.md +56 -10
  88. package/dist/commands/do.d.ts +15 -0
  89. package/dist/commands/do.d.ts.map +1 -1
  90. package/dist/commands/do.js +431 -129
  91. package/dist/commands/do.js.map +1 -1
  92. package/dist/commands/migrate.d.ts +14 -0
  93. package/dist/commands/migrate.d.ts.map +1 -0
  94. package/dist/commands/migrate.js +228 -0
  95. package/dist/commands/migrate.js.map +1 -0
  96. package/dist/commands/plan.d.ts.map +1 -1
  97. package/dist/commands/plan.js +237 -40
  98. package/dist/commands/plan.js.map +1 -1
  99. package/dist/commands/status.d.ts.map +1 -1
  100. package/dist/commands/status.js +221 -47
  101. package/dist/commands/status.js.map +1 -1
  102. package/dist/core/claude-runner.d.ts +21 -2
  103. package/dist/core/claude-runner.d.ts.map +1 -1
  104. package/dist/core/claude-runner.js +199 -29
  105. package/dist/core/claude-runner.js.map +1 -1
  106. package/dist/core/git.d.ts +15 -6
  107. package/dist/core/git.d.ts.map +1 -1
  108. package/dist/core/git.js +53 -20
  109. package/dist/core/git.js.map +1 -1
  110. package/dist/core/project-manager.d.ts.map +1 -1
  111. package/dist/core/project-manager.js +2 -2
  112. package/dist/core/project-manager.js.map +1 -1
  113. package/dist/core/pull-request.d.ts +84 -0
  114. package/dist/core/pull-request.d.ts.map +1 -0
  115. package/dist/core/pull-request.js +414 -0
  116. package/dist/core/pull-request.js.map +1 -0
  117. package/dist/core/shutdown-handler.d.ts.map +1 -1
  118. package/dist/core/shutdown-handler.js +4 -0
  119. package/dist/core/shutdown-handler.js.map +1 -1
  120. package/dist/core/state-derivation.d.ts +3 -3
  121. package/dist/core/state-derivation.d.ts.map +1 -1
  122. package/dist/core/state-derivation.js +18 -14
  123. package/dist/core/state-derivation.js.map +1 -1
  124. package/dist/core/worktree.d.ts +138 -0
  125. package/dist/core/worktree.d.ts.map +1 -0
  126. package/dist/core/worktree.js +383 -0
  127. package/dist/core/worktree.js.map +1 -0
  128. package/dist/index.js +2 -0
  129. package/dist/index.js.map +1 -1
  130. package/dist/parsers/stream-renderer.d.ts +3 -0
  131. package/dist/parsers/stream-renderer.d.ts.map +1 -1
  132. package/dist/parsers/stream-renderer.js +1 -1
  133. package/dist/parsers/stream-renderer.js.map +1 -1
  134. package/dist/prompts/amend.d.ts +1 -0
  135. package/dist/prompts/amend.d.ts.map +1 -1
  136. package/dist/prompts/amend.js +14 -10
  137. package/dist/prompts/amend.js.map +1 -1
  138. package/dist/prompts/execution.d.ts.map +1 -1
  139. package/dist/prompts/execution.js +4 -2
  140. package/dist/prompts/execution.js.map +1 -1
  141. package/dist/prompts/planning.d.ts +1 -0
  142. package/dist/prompts/planning.d.ts.map +1 -1
  143. package/dist/prompts/planning.js +9 -8
  144. package/dist/prompts/planning.js.map +1 -1
  145. package/dist/types/config.d.ts +6 -0
  146. package/dist/types/config.d.ts.map +1 -1
  147. package/dist/ui/project-picker.d.ts +34 -3
  148. package/dist/ui/project-picker.d.ts.map +1 -1
  149. package/dist/ui/project-picker.js +78 -10
  150. package/dist/ui/project-picker.js.map +1 -1
  151. package/dist/utils/paths.d.ts +38 -43
  152. package/dist/utils/paths.d.ts.map +1 -1
  153. package/dist/utils/paths.js +123 -193
  154. package/dist/utils/paths.js.map +1 -1
  155. package/dist/utils/terminal-symbols.d.ts +2 -2
  156. package/dist/utils/terminal-symbols.js +3 -3
  157. package/dist/utils/terminal-symbols.js.map +1 -1
  158. package/dist/utils/validation.d.ts.map +1 -1
  159. package/dist/utils/validation.js +2 -8
  160. package/dist/utils/validation.js.map +1 -1
  161. package/package.json +1 -1
  162. package/src/commands/do.ts +505 -139
  163. package/src/commands/migrate.ts +269 -0
  164. package/src/commands/plan.ts +264 -40
  165. package/src/commands/status.ts +252 -45
  166. package/src/core/claude-runner.ts +246 -33
  167. package/src/core/git.ts +57 -21
  168. package/src/core/project-manager.ts +2 -1
  169. package/src/core/pull-request.ts +480 -0
  170. package/src/core/shutdown-handler.ts +5 -0
  171. package/src/core/state-derivation.ts +18 -14
  172. package/src/core/worktree.ts +434 -0
  173. package/src/index.ts +2 -0
  174. package/src/parsers/stream-renderer.ts +4 -1
  175. package/src/prompts/amend.ts +15 -9
  176. package/src/prompts/execution.ts +4 -2
  177. package/src/prompts/planning.ts +10 -8
  178. package/src/types/config.ts +7 -0
  179. package/src/ui/project-picker.ts +110 -10
  180. package/src/utils/paths.ts +129 -214
  181. package/src/utils/terminal-symbols.ts +3 -3
  182. package/src/utils/validation.ts +2 -9
  183. package/tests/unit/amend-prompt.test.ts +85 -0
  184. package/tests/unit/claude-runner-interactive.test.ts +24 -0
  185. package/tests/unit/claude-runner.test.ts +518 -64
  186. package/tests/unit/commit-planning-artifacts-worktree.test.ts +327 -0
  187. package/tests/unit/commit-planning-artifacts.test.ts +303 -35
  188. package/tests/unit/dependency-integration.test.ts +95 -95
  189. package/tests/unit/do-blocked-tasks.test.ts +53 -53
  190. package/tests/unit/do-command.test.ts +39 -132
  191. package/tests/unit/do-rerun.test.ts +65 -65
  192. package/tests/unit/do-worktree-cleanup.test.ts +151 -0
  193. package/tests/unit/execution-prompt.test.ts +71 -60
  194. package/tests/unit/failure-history.test.ts +19 -19
  195. package/tests/unit/git-commit-helpers.test.ts +5 -5
  196. package/tests/unit/git-stash.test.ts +4 -4
  197. package/tests/unit/migrate-command.test.ts +197 -0
  198. package/tests/unit/outcome-content.test.ts +20 -20
  199. package/tests/unit/paths.test.ts +269 -467
  200. package/tests/unit/plan-amend-worktree-recreate.test.ts +246 -0
  201. package/tests/unit/plan-command.test.ts +103 -103
  202. package/tests/unit/planning-prompt.test.ts +41 -4
  203. package/tests/unit/post-execution-picker.test.ts +252 -0
  204. package/tests/unit/project-manager.test.ts +20 -8
  205. package/tests/unit/project-picker.test.ts +425 -42
  206. package/tests/unit/pull-request.test.ts +852 -0
  207. package/tests/unit/state-derivation.test.ts +138 -137
  208. package/tests/unit/status-command.test.ts +344 -76
  209. package/tests/unit/stream-renderer.test.ts +30 -0
  210. package/tests/unit/terminal-symbols.test.ts +4 -4
  211. package/tests/unit/worktree-integration.test.ts +405 -0
  212. package/tests/unit/worktree.test.ts +625 -0
  213. package/tests/unit/do-multiproject.test.ts +0 -270
  214. /package/RAF/{001-raf-task-improvements → aaaaab-raf-task-improvements}/input.md +0 -0
  215. /package/RAF/{001-raf-task-improvements/outcomes/001-add-decisions-folder.md → aaaaab-raf-task-improvements/outcomes/01-add-decisions-folder.md} +0 -0
  216. /package/RAF/{001-raf-task-improvements/outcomes/002-fix-write-error-on-shutdown.md → aaaaab-raf-task-improvements/outcomes/02-fix-write-error-on-shutdown.md} +0 -0
  217. /package/RAF/{001-raf-task-improvements/outcomes/003-stash-changes-on-failure.md → aaaaab-raf-task-improvements/outcomes/03-stash-changes-on-failure.md} +0 -0
  218. /package/RAF/{001-raf-task-improvements/outcomes/004-add-project-name-to-commits.md → aaaaab-raf-task-improvements/outcomes/04-add-project-name-to-commits.md} +0 -0
  219. /package/RAF/{001-raf-task-improvements/outcomes/005-add-running-time-display.md → aaaaab-raf-task-improvements/outcomes/05-add-running-time-display.md} +0 -0
  220. /package/RAF/{001-raf-task-improvements/outcomes/006-add-task-name-to-logs.md → aaaaab-raf-task-improvements/outcomes/06-add-task-name-to-logs.md} +0 -0
  221. /package/RAF/{001-raf-task-improvements/outcomes/007-show-model-at-task-start.md → aaaaab-raf-task-improvements/outcomes/07-show-model-at-task-start.md} +0 -0
  222. /package/RAF/{001-raf-task-improvements/outcomes/009-remove-editor-placeholder-text.md → aaaaab-raf-task-improvements/outcomes/09-remove-editor-placeholder-text.md} +0 -0
  223. /package/RAF/{001-raf-task-improvements → aaaaab-raf-task-improvements}/outcomes/SUMMARY.md +0 -0
  224. /package/RAF/{001-raf-task-improvements/plans/001-add-decisions-folder.md → aaaaab-raf-task-improvements/plans/01-add-decisions-folder.md} +0 -0
  225. /package/RAF/{001-raf-task-improvements/plans/002-fix-write-error-on-shutdown.md → aaaaab-raf-task-improvements/plans/02-fix-write-error-on-shutdown.md} +0 -0
  226. /package/RAF/{001-raf-task-improvements/plans/003-stash-changes-on-failure.md → aaaaab-raf-task-improvements/plans/03-stash-changes-on-failure.md} +0 -0
  227. /package/RAF/{001-raf-task-improvements/plans/004-add-project-name-to-commits.md → aaaaab-raf-task-improvements/plans/04-add-project-name-to-commits.md} +0 -0
  228. /package/RAF/{001-raf-task-improvements/plans/005-add-running-time-display.md → aaaaab-raf-task-improvements/plans/05-add-running-time-display.md} +0 -0
  229. /package/RAF/{001-raf-task-improvements/plans/006-add-task-name-to-logs.md → aaaaab-raf-task-improvements/plans/06-add-task-name-to-logs.md} +0 -0
  230. /package/RAF/{001-raf-task-improvements/plans/009-remove-editor-placeholder-text.md → aaaaab-raf-task-improvements/plans/09-remove-editor-placeholder-text.md} +0 -0
  231. /package/RAF/{002-raf-task-improvements-execution → aaaaac-raf-task-improvements-execution}/decisions/DECISIONS.md +0 -0
  232. /package/RAF/{002-raf-task-improvements-execution → aaaaac-raf-task-improvements-execution}/input.md +0 -0
  233. /package/RAF/{002-raf-task-improvements-execution/outcomes/001-commit-show-model-at-task-start.md → aaaaac-raf-task-improvements-execution/outcomes/01-commit-show-model-at-task-start.md} +0 -0
  234. /package/RAF/{002-raf-task-improvements-execution/outcomes/002-delete-skipped-plan.md → aaaaac-raf-task-improvements-execution/outcomes/02-delete-skipped-plan.md} +0 -0
  235. /package/RAF/{002-raf-task-improvements-execution → aaaaac-raf-task-improvements-execution}/outcomes/SUMMARY.md +0 -0
  236. /package/RAF/{002-raf-task-improvements-execution/plans/001-commit-show-model-at-task-start.md → aaaaac-raf-task-improvements-execution/plans/01-commit-show-model-at-task-start.md} +0 -0
  237. /package/RAF/{002-raf-task-improvements-execution/plans/002-delete-skipped-plan.md → aaaaac-raf-task-improvements-execution/plans/02-delete-skipped-plan.md} +0 -0
  238. /package/RAF/{003-multi-project-execution → aaaaad-multi-project-execution}/decisions/DECISIONS.md +0 -0
  239. /package/RAF/{003-multi-project-execution → aaaaad-multi-project-execution}/input.md +0 -0
  240. /package/RAF/{003-multi-project-execution/outcomes/001-remove-state-json.md → aaaaad-multi-project-execution/outcomes/01-remove-state-json.md} +0 -0
  241. /package/RAF/{003-multi-project-execution/outcomes/002-update-raf-status.md → aaaaad-multi-project-execution/outcomes/02-update-raf-status.md} +0 -0
  242. /package/RAF/{003-multi-project-execution/outcomes/003-simplify-git-logic.md → aaaaad-multi-project-execution/outcomes/03-simplify-git-logic.md} +0 -0
  243. /package/RAF/{003-multi-project-execution/outcomes/004-auto-commit-planning.md → aaaaad-multi-project-execution/outcomes/04-auto-commit-planning.md} +0 -0
  244. /package/RAF/{003-multi-project-execution/outcomes/005-rerun-failed-tasks.md → aaaaad-multi-project-execution/outcomes/05-rerun-failed-tasks.md} +0 -0
  245. /package/RAF/{003-multi-project-execution/outcomes/006-multi-project-execution.md → aaaaad-multi-project-execution/outcomes/06-multi-project-execution.md} +0 -0
  246. /package/RAF/{003-multi-project-execution/outcomes/007-verify-timeout.md → aaaaad-multi-project-execution/outcomes/07-verify-timeout.md} +0 -0
  247. /package/RAF/{003-multi-project-execution/outcomes/008-move-decisions-file.md → aaaaad-multi-project-execution/outcomes/08-move-decisions-file.md} +0 -0
  248. /package/RAF/{003-multi-project-execution → aaaaad-multi-project-execution}/outcomes/SUMMARY.md +0 -0
  249. /package/RAF/{003-multi-project-execution/plans/001-remove-state-json.md → aaaaad-multi-project-execution/plans/01-remove-state-json.md} +0 -0
  250. /package/RAF/{003-multi-project-execution/plans/002-update-raf-status.md → aaaaad-multi-project-execution/plans/02-update-raf-status.md} +0 -0
  251. /package/RAF/{003-multi-project-execution/plans/003-simplify-git-logic.md → aaaaad-multi-project-execution/plans/03-simplify-git-logic.md} +0 -0
  252. /package/RAF/{003-multi-project-execution/plans/004-auto-commit-planning.md → aaaaad-multi-project-execution/plans/04-auto-commit-planning.md} +0 -0
  253. /package/RAF/{003-multi-project-execution/plans/005-rerun-failed-tasks.md → aaaaad-multi-project-execution/plans/05-rerun-failed-tasks.md} +0 -0
  254. /package/RAF/{003-multi-project-execution/plans/006-multi-project-execution.md → aaaaad-multi-project-execution/plans/06-multi-project-execution.md} +0 -0
  255. /package/RAF/{003-multi-project-execution/plans/007-verify-timeout.md → aaaaad-multi-project-execution/plans/07-verify-timeout.md} +0 -0
  256. /package/RAF/{003-multi-project-execution/plans/008-move-decisions-file.md → aaaaad-multi-project-execution/plans/08-move-decisions-file.md} +0 -0
  257. /package/RAF/{004-task-naming-optimization → aaaaae-task-naming-optimization}/decisions.md +0 -0
  258. /package/RAF/{004-task-naming-optimization → aaaaae-task-naming-optimization}/input.md +0 -0
  259. /package/RAF/{004-task-naming-optimization/outcomes/001-remove-summary-file.md → aaaaae-task-naming-optimization/outcomes/01-remove-summary-file.md} +0 -0
  260. /package/RAF/{004-task-naming-optimization/outcomes/002-base36-project-numbering.md → aaaaae-task-naming-optimization/outcomes/02-base36-project-numbering.md} +0 -0
  261. /package/RAF/{004-task-naming-optimization/outcomes/003-improve-haiku-prompt.md → aaaaae-task-naming-optimization/outcomes/03-improve-haiku-prompt.md} +0 -0
  262. /package/RAF/{004-task-naming-optimization → aaaaae-task-naming-optimization}/outcomes/SUMMARY.md +0 -0
  263. /package/RAF/{004-task-naming-optimization/plans/001-remove-summary-file.md → aaaaae-task-naming-optimization/plans/01-remove-summary-file.md} +0 -0
  264. /package/RAF/{004-task-naming-optimization/plans/002-base36-project-numbering.md → aaaaae-task-naming-optimization/plans/02-base36-project-numbering.md} +0 -0
  265. /package/RAF/{004-task-naming-optimization/plans/003-improve-haiku-prompt.md → aaaaae-task-naming-optimization/plans/03-improve-haiku-prompt.md} +0 -0
  266. /package/RAF/{005-task-naming-improvements → aaaaaf-task-naming-improvements}/decisions.md +0 -0
  267. /package/RAF/{005-task-naming-improvements → aaaaaf-task-naming-improvements}/input.md +0 -0
  268. /package/RAF/{005-task-naming-improvements/outcomes/001-enhance-identifier-resolution.md → aaaaaf-task-naming-improvements/outcomes/01-enhance-identifier-resolution.md} +0 -0
  269. /package/RAF/{005-task-naming-improvements/outcomes/002-add-identifier-support-to-status.md → aaaaaf-task-naming-improvements/outcomes/02-add-identifier-support-to-status.md} +0 -0
  270. /package/RAF/{005-task-naming-improvements/outcomes/003-update-do-for-full-folder-names.md → aaaaaf-task-naming-improvements/outcomes/03-update-do-for-full-folder-names.md} +0 -0
  271. /package/RAF/{005-task-naming-improvements/outcomes/004-implement-amend-flag-for-plan.md → aaaaaf-task-naming-improvements/outcomes/04-implement-amend-flag-for-plan.md} +0 -0
  272. /package/RAF/{005-task-naming-improvements/outcomes/005-commit-outcomes-on-complete.md → aaaaaf-task-naming-improvements/outcomes/05-commit-outcomes-on-complete.md} +0 -0
  273. /package/RAF/{005-task-naming-improvements/outcomes/006-update-execution-prompt-commit-schema.md → aaaaaf-task-naming-improvements/outcomes/06-update-execution-prompt-commit-schema.md} +0 -0
  274. /package/RAF/{005-task-naming-improvements/outcomes/007-allow-pending-task-amendments.md → aaaaaf-task-naming-improvements/outcomes/07-allow-pending-task-amendments.md} +0 -0
  275. /package/RAF/{005-task-naming-improvements/outcomes/008-fix-timeout-label.md → aaaaaf-task-naming-improvements/outcomes/08-fix-timeout-label.md} +0 -0
  276. /package/RAF/{005-task-naming-improvements/plans/001-enhance-identifier-resolution.md → aaaaaf-task-naming-improvements/plans/01-enhance-identifier-resolution.md} +0 -0
  277. /package/RAF/{005-task-naming-improvements/plans/002-add-identifier-support-to-status.md → aaaaaf-task-naming-improvements/plans/02-add-identifier-support-to-status.md} +0 -0
  278. /package/RAF/{005-task-naming-improvements/plans/003-update-do-for-full-folder-names.md → aaaaaf-task-naming-improvements/plans/03-update-do-for-full-folder-names.md} +0 -0
  279. /package/RAF/{005-task-naming-improvements/plans/004-implement-amend-flag-for-plan.md → aaaaaf-task-naming-improvements/plans/04-implement-amend-flag-for-plan.md} +0 -0
  280. /package/RAF/{005-task-naming-improvements/plans/005-commit-outcomes-on-complete.md → aaaaaf-task-naming-improvements/plans/05-commit-outcomes-on-complete.md} +0 -0
  281. /package/RAF/{005-task-naming-improvements/plans/006-update-execution-prompt-commit-schema.md → aaaaaf-task-naming-improvements/plans/06-update-execution-prompt-commit-schema.md} +0 -0
  282. /package/RAF/{005-task-naming-improvements/plans/007-allow-pending-task-amendments.md → aaaaaf-task-naming-improvements/plans/07-allow-pending-task-amendments.md} +0 -0
  283. /package/RAF/{005-task-naming-improvements/plans/008-fix-timeout-label.md → aaaaaf-task-naming-improvements/plans/08-fix-timeout-label.md} +0 -0
  284. /package/RAF/{006-fix-double-summary-headers → aaaaag-fix-double-summary-headers}/decisions.md +0 -0
  285. /package/RAF/{006-fix-double-summary-headers → aaaaag-fix-double-summary-headers}/input.md +0 -0
  286. /package/RAF/{006-fix-double-summary-headers/outcomes/001-fix-double-summary-headers.md → aaaaag-fix-double-summary-headers/outcomes/01-fix-double-summary-headers.md} +0 -0
  287. /package/RAF/{006-fix-double-summary-headers/outcomes/002-update-readme-for-npm.md → aaaaag-fix-double-summary-headers/outcomes/02-update-readme-for-npm.md} +0 -0
  288. /package/RAF/{006-fix-double-summary-headers/outcomes/003-npm-publish-instructions.md → aaaaag-fix-double-summary-headers/outcomes/03-npm-publish-instructions.md} +0 -0
  289. /package/RAF/{006-fix-double-summary-headers/outcomes/004-flexible-project-lookup.md → aaaaag-fix-double-summary-headers/outcomes/04-flexible-project-lookup.md} +0 -0
  290. /package/RAF/{006-fix-double-summary-headers/plans/001-fix-double-summary-headers.md → aaaaag-fix-double-summary-headers/plans/01-fix-double-summary-headers.md} +0 -0
  291. /package/RAF/{006-fix-double-summary-headers/plans/002-update-readme-for-npm.md → aaaaag-fix-double-summary-headers/plans/02-update-readme-for-npm.md} +0 -0
  292. /package/RAF/{006-fix-double-summary-headers/plans/003-npm-publish-instructions.md → aaaaag-fix-double-summary-headers/plans/03-npm-publish-instructions.md} +0 -0
  293. /package/RAF/{006-fix-double-summary-headers/plans/004-flexible-project-lookup.md → aaaaag-fix-double-summary-headers/plans/04-flexible-project-lookup.md} +0 -0
  294. /package/RAF/{007-improve-outcome-format → aaaaah-improve-outcome-format}/decisions.md +0 -0
  295. /package/RAF/{007-improve-outcome-format → aaaaah-improve-outcome-format}/input.md +0 -0
  296. /package/RAF/{007-improve-outcome-format/outcomes/001-update-execution-prompt.md → aaaaah-improve-outcome-format/outcomes/01-update-execution-prompt.md} +0 -0
  297. /package/RAF/{007-improve-outcome-format/outcomes/002-update-state-derivation.md → aaaaah-improve-outcome-format/outcomes/02-update-state-derivation.md} +0 -0
  298. /package/RAF/{007-improve-outcome-format/outcomes/003-update-do-command-outcome-handling.md → aaaaah-improve-outcome-format/outcomes/03-update-do-command-outcome-handling.md} +0 -0
  299. /package/RAF/{007-improve-outcome-format/outcomes/004-implement-failure-analysis.md → aaaaah-improve-outcome-format/outcomes/04-implement-failure-analysis.md} +0 -0
  300. /package/RAF/{007-improve-outcome-format/outcomes/005-update-documentation.md → aaaaah-improve-outcome-format/outcomes/05-update-documentation.md} +0 -0
  301. /package/RAF/{007-improve-outcome-format/plans/001-update-execution-prompt.md → aaaaah-improve-outcome-format/plans/01-update-execution-prompt.md} +0 -0
  302. /package/RAF/{007-improve-outcome-format/plans/002-update-state-derivation.md → aaaaah-improve-outcome-format/plans/02-update-state-derivation.md} +0 -0
  303. /package/RAF/{007-improve-outcome-format/plans/003-update-do-command-outcome-handling.md → aaaaah-improve-outcome-format/plans/03-update-do-command-outcome-handling.md} +0 -0
  304. /package/RAF/{007-improve-outcome-format/plans/004-implement-failure-analysis.md → aaaaah-improve-outcome-format/plans/04-implement-failure-analysis.md} +0 -0
  305. /package/RAF/{007-improve-outcome-format/plans/005-update-documentation.md → aaaaah-improve-outcome-format/plans/05-update-documentation.md} +0 -0
  306. /package/RAF/{008-beautiful-do → aaaaai-beautiful-do}/decisions.md +0 -0
  307. /package/RAF/{008-beautiful-do → aaaaai-beautiful-do}/input.md +0 -0
  308. /package/RAF/{008-beautiful-do/outcomes/001-terminal-symbols.md → aaaaai-beautiful-do/outcomes/01-terminal-symbols.md} +0 -0
  309. /package/RAF/{008-beautiful-do/outcomes/002-refactor-do-output.md → aaaaai-beautiful-do/outcomes/02-refactor-do-output.md} +0 -0
  310. /package/RAF/{008-beautiful-do/outcomes/003-refactor-status-output.md → aaaaai-beautiful-do/outcomes/03-refactor-status-output.md} +0 -0
  311. /package/RAF/{008-beautiful-do/outcomes/004-simplify-logger.md → aaaaai-beautiful-do/outcomes/04-simplify-logger.md} +0 -0
  312. /package/RAF/{008-beautiful-do/outcomes/005-add-tests.md → aaaaai-beautiful-do/outcomes/05-add-tests.md} +0 -0
  313. /package/RAF/{008-beautiful-do/plans/001-terminal-symbols.md → aaaaai-beautiful-do/plans/01-terminal-symbols.md} +0 -0
  314. /package/RAF/{008-beautiful-do/plans/002-refactor-do-output.md → aaaaai-beautiful-do/plans/02-refactor-do-output.md} +0 -0
  315. /package/RAF/{008-beautiful-do/plans/003-refactor-status-output.md → aaaaai-beautiful-do/plans/03-refactor-status-output.md} +0 -0
  316. /package/RAF/{008-beautiful-do/plans/004-simplify-logger.md → aaaaai-beautiful-do/plans/04-simplify-logger.md} +0 -0
  317. /package/RAF/{008-beautiful-do/plans/005-add-tests.md → aaaaai-beautiful-do/plans/05-add-tests.md} +0 -0
  318. /package/RAF/{009-system-promt-ammend → aaaaaj-system-promt-ammend}/decisions.md +0 -0
  319. /package/RAF/{009-system-promt-ammend → aaaaaj-system-promt-ammend}/input.md +0 -0
  320. /package/RAF/{009-system-promt-ammend/outcomes/001-model-override.md → aaaaaj-system-promt-ammend/outcomes/01-model-override.md} +0 -0
  321. /package/RAF/{009-system-promt-ammend/outcomes/002-system-prompt-append.md → aaaaaj-system-promt-ammend/outcomes/02-system-prompt-append.md} +0 -0
  322. /package/RAF/{009-system-promt-ammend/outcomes/003-retry-context.md → aaaaaj-system-promt-ammend/outcomes/03-retry-context.md} +0 -0
  323. /package/RAF/{009-system-promt-ammend/plans/001-model-override.md → aaaaaj-system-promt-ammend/plans/01-model-override.md} +0 -0
  324. /package/RAF/{009-system-promt-ammend/plans/002-system-prompt-append.md → aaaaaj-system-promt-ammend/plans/02-system-prompt-append.md} +0 -0
  325. /package/RAF/{009-system-promt-ammend/plans/003-retry-context.md → aaaaaj-system-promt-ammend/plans/03-retry-context.md} +0 -0
  326. /package/RAF/{010-outcome-marker-fallback → aaaabk-outcome-marker-fallback}/decisions.md +0 -0
  327. /package/RAF/{010-outcome-marker-fallback → aaaabk-outcome-marker-fallback}/input.md +0 -0
  328. /package/RAF/{010-outcome-marker-fallback/outcomes/001-outcome-file-marker-fallback.md → aaaabk-outcome-marker-fallback/outcomes/01-outcome-file-marker-fallback.md} +0 -0
  329. /package/RAF/{010-outcome-marker-fallback/outcomes/002-creative-project-naming.md → aaaabk-outcome-marker-fallback/outcomes/02-creative-project-naming.md} +0 -0
  330. /package/RAF/{010-outcome-marker-fallback/plans/001-outcome-file-marker-fallback.md → aaaabk-outcome-marker-fallback/plans/01-outcome-file-marker-fallback.md} +0 -0
  331. /package/RAF/{010-outcome-marker-fallback/plans/002-creative-project-naming.md → aaaabk-outcome-marker-fallback/plans/02-creative-project-naming.md} +0 -0
  332. /package/RAF/{011-do-task-in-commit → aaaabl-do-task-in-commit}/decisions.md +0 -0
  333. /package/RAF/{011-do-task-in-commit → aaaabl-do-task-in-commit}/input.md +0 -0
  334. /package/RAF/{011-do-task-in-commit/outcomes/001-update-execution-prompt.md → aaaabl-do-task-in-commit/outcomes/01-update-execution-prompt.md} +0 -0
  335. /package/RAF/{011-do-task-in-commit/outcomes/002-update-tests.md → aaaabl-do-task-in-commit/outcomes/02-update-tests.md} +0 -0
  336. /package/RAF/{011-do-task-in-commit/outcomes/003-update-documentation.md → aaaabl-do-task-in-commit/outcomes/03-update-documentation.md} +0 -0
  337. /package/RAF/{011-do-task-in-commit/plans/001-update-execution-prompt.md → aaaabl-do-task-in-commit/plans/01-update-execution-prompt.md} +0 -0
  338. /package/RAF/{011-do-task-in-commit/plans/002-update-tests.md → aaaabl-do-task-in-commit/plans/02-update-tests.md} +0 -0
  339. /package/RAF/{011-do-task-in-commit/plans/003-update-documentation.md → aaaabl-do-task-in-commit/plans/03-update-documentation.md} +0 -0
  340. /package/RAF/{012-name-picker-buffet → aaaabm-name-picker-buffet}/decisions.md +0 -0
  341. /package/RAF/{012-name-picker-buffet → aaaabm-name-picker-buffet}/input.md +0 -0
  342. /package/RAF/{012-name-picker-buffet/outcomes/001-name-picker-for-raf-plan.md → aaaabm-name-picker-buffet/outcomes/01-name-picker-for-raf-plan.md} +0 -0
  343. /package/RAF/{012-name-picker-buffet/outcomes/002-interactive-project-picker-for-raf-do.md → aaaabm-name-picker-buffet/outcomes/02-interactive-project-picker-for-raf-do.md} +0 -0
  344. /package/RAF/{012-name-picker-buffet/outcomes/003-raf-status-truncation.md → aaaabm-name-picker-buffet/outcomes/03-raf-status-truncation.md} +0 -0
  345. /package/RAF/{012-name-picker-buffet/outcomes/004-failure-reason-details.md → aaaabm-name-picker-buffet/outcomes/04-failure-reason-details.md} +0 -0
  346. /package/RAF/{012-name-picker-buffet/outcomes/005-remove-raf-commits.md → aaaabm-name-picker-buffet/outcomes/05-remove-raf-commits.md} +0 -0
  347. /package/RAF/{012-name-picker-buffet/outcomes/006-update-execution-prompt-for-commits.md → aaaabm-name-picker-buffet/outcomes/06-update-execution-prompt-for-commits.md} +0 -0
  348. /package/RAF/{012-name-picker-buffet/outcomes/007-fix-plan-mode-user-prompt.md → aaaabm-name-picker-buffet/outcomes/07-fix-plan-mode-user-prompt.md} +0 -0
  349. /package/RAF/{012-name-picker-buffet/outcomes/008-add-auto-flag-for-plan-mode.md → aaaabm-name-picker-buffet/outcomes/08-add-auto-flag-for-plan-mode.md} +0 -0
  350. /package/RAF/{012-name-picker-buffet/plans/001-name-picker-for-raf-plan.md → aaaabm-name-picker-buffet/plans/01-name-picker-for-raf-plan.md} +0 -0
  351. /package/RAF/{012-name-picker-buffet/plans/002-interactive-project-picker-for-raf-do.md → aaaabm-name-picker-buffet/plans/02-interactive-project-picker-for-raf-do.md} +0 -0
  352. /package/RAF/{012-name-picker-buffet/plans/003-raf-status-truncation.md → aaaabm-name-picker-buffet/plans/03-raf-status-truncation.md} +0 -0
  353. /package/RAF/{012-name-picker-buffet/plans/004-failure-reason-details.md → aaaabm-name-picker-buffet/plans/04-failure-reason-details.md} +0 -0
  354. /package/RAF/{012-name-picker-buffet/plans/005-remove-raf-commits.md → aaaabm-name-picker-buffet/plans/05-remove-raf-commits.md} +0 -0
  355. /package/RAF/{012-name-picker-buffet/plans/006-update-execution-prompt-for-commits.md → aaaabm-name-picker-buffet/plans/06-update-execution-prompt-for-commits.md} +0 -0
  356. /package/RAF/{012-name-picker-buffet/plans/007-fix-plan-mode-user-prompt.md → aaaabm-name-picker-buffet/plans/07-fix-plan-mode-user-prompt.md} +0 -0
  357. /package/RAF/{012-name-picker-buffet/plans/008-add-auto-flag-for-plan-mode.md → aaaabm-name-picker-buffet/plans/08-add-auto-flag-for-plan-mode.md} +0 -0
  358. /package/RAF/{013-dependencies-watchdog → aaaabn-dependencies-watchdog}/decisions.md +0 -0
  359. /package/RAF/{013-dependencies-watchdog → aaaabn-dependencies-watchdog}/input.md +0 -0
  360. /package/RAF/{013-dependencies-watchdog/outcomes/001-define-dependency-syntax.md → aaaabn-dependencies-watchdog/outcomes/01-define-dependency-syntax.md} +0 -0
  361. /package/RAF/{013-dependencies-watchdog/outcomes/002-update-planning-prompts.md → aaaabn-dependencies-watchdog/outcomes/02-update-planning-prompts.md} +0 -0
  362. /package/RAF/{013-dependencies-watchdog/outcomes/003-parse-dependencies-update-state.md → aaaabn-dependencies-watchdog/outcomes/03-parse-dependencies-update-state.md} +0 -0
  363. /package/RAF/{013-dependencies-watchdog/outcomes/004-implement-dependency-checking-in-do.md → aaaabn-dependencies-watchdog/outcomes/04-implement-dependency-checking-in-do.md} +0 -0
  364. /package/RAF/{013-dependencies-watchdog/outcomes/005-update-execution-prompts.md → aaaabn-dependencies-watchdog/outcomes/05-update-execution-prompts.md} +0 -0
  365. /package/RAF/{013-dependencies-watchdog/outcomes/006-add-tests.md → aaaabn-dependencies-watchdog/outcomes/06-add-tests.md} +0 -0
  366. /package/RAF/{013-dependencies-watchdog/outcomes/007-add-act-alias.md → aaaabn-dependencies-watchdog/outcomes/07-add-act-alias.md} +0 -0
  367. /package/RAF/{013-dependencies-watchdog/outcomes/008-add-exit-message.md → aaaabn-dependencies-watchdog/outcomes/08-add-exit-message.md} +0 -0
  368. /package/RAF/{013-dependencies-watchdog/plans/001-define-dependency-syntax.md → aaaabn-dependencies-watchdog/plans/01-define-dependency-syntax.md} +0 -0
  369. /package/RAF/{013-dependencies-watchdog/plans/002-update-planning-prompts.md → aaaabn-dependencies-watchdog/plans/02-update-planning-prompts.md} +0 -0
  370. /package/RAF/{013-dependencies-watchdog/plans/003-parse-dependencies-update-state.md → aaaabn-dependencies-watchdog/plans/03-parse-dependencies-update-state.md} +0 -0
  371. /package/RAF/{013-dependencies-watchdog/plans/004-implement-dependency-checking-in-do.md → aaaabn-dependencies-watchdog/plans/04-implement-dependency-checking-in-do.md} +0 -0
  372. /package/RAF/{013-dependencies-watchdog/plans/005-update-execution-prompts.md → aaaabn-dependencies-watchdog/plans/05-update-execution-prompts.md} +0 -0
  373. /package/RAF/{013-dependencies-watchdog/plans/006-add-tests.md → aaaabn-dependencies-watchdog/plans/06-add-tests.md} +0 -0
  374. /package/RAF/{013-dependencies-watchdog/plans/007-add-act-alias.md → aaaabn-dependencies-watchdog/plans/07-add-act-alias.md} +0 -0
  375. /package/RAF/{013-dependencies-watchdog/plans/008-add-exit-message.md → aaaabn-dependencies-watchdog/plans/08-add-exit-message.md} +0 -0
  376. /package/RAF/{014-watchdog → aaaabo-watchdog}/decisions.md +0 -0
  377. /package/RAF/{014-watchdog → aaaabo-watchdog}/input.md +0 -0
  378. /package/RAF/{014-watchdog/outcomes/001-amend-flag-position.md → aaaabo-watchdog/outcomes/01-amend-flag-position.md} +0 -0
  379. /package/RAF/{014-watchdog/outcomes/002-details-only-on-failure.md → aaaabo-watchdog/outcomes/02-details-only-on-failure.md} +0 -0
  380. /package/RAF/{014-watchdog/plans/001-amend-flag-position.md → aaaabo-watchdog/plans/01-amend-flag-position.md} +0 -0
  381. /package/RAF/{014-watchdog/plans/002-details-only-on-failure.md → aaaabo-watchdog/plans/02-details-only-on-failure.md} +0 -0
  382. /package/RAF/{015-name-lottery → aaaabp-name-lottery}/decisions.md +0 -0
  383. /package/RAF/{015-name-lottery → aaaabp-name-lottery}/input.md +0 -0
  384. /package/RAF/{015-name-lottery/outcomes/001-auto-pick-project-name.md → aaaabp-name-lottery/outcomes/01-auto-pick-project-name.md} +0 -0
  385. /package/RAF/{015-name-lottery/outcomes/002-mention-plan-files-in-commit.md → aaaabp-name-lottery/outcomes/02-mention-plan-files-in-commit.md} +0 -0
  386. /package/RAF/{015-name-lottery/outcomes/003-fix-input-md-in-amend-flow.md → aaaabp-name-lottery/outcomes/03-fix-input-md-in-amend-flow.md} +0 -0
  387. /package/RAF/{015-name-lottery/plans/001-auto-pick-project-name.md → aaaabp-name-lottery/plans/01-auto-pick-project-name.md} +0 -0
  388. /package/RAF/{015-name-lottery/plans/002-mention-plan-files-in-commit.md → aaaabp-name-lottery/plans/02-mention-plan-files-in-commit.md} +0 -0
  389. /package/RAF/{015-name-lottery/plans/003-fix-input-md-in-amend-flow.md → aaaabp-name-lottery/plans/03-fix-input-md-in-amend-flow.md} +0 -0
  390. /package/RAF/{016-planning-scalpel → aaaabq-planning-scalpel}/decisions.md +0 -0
  391. /package/RAF/{016-planning-scalpel → aaaabq-planning-scalpel}/input.md +0 -0
  392. /package/RAF/{016-planning-scalpel/outcomes/001-update-git-commit-instructions.md → aaaabq-planning-scalpel/outcomes/01-update-git-commit-instructions.md} +0 -0
  393. /package/RAF/{016-planning-scalpel/plans/001-update-git-commit-instructions.md → aaaabq-planning-scalpel/plans/01-update-git-commit-instructions.md} +0 -0
  394. /package/RAF/{017-decision-vault → aaaabr-decision-vault}/decisions.md +0 -0
  395. /package/RAF/{017-decision-vault → aaaabr-decision-vault}/input.md +0 -0
  396. /package/RAF/{017-decision-vault/outcomes/001-create-git-commit-utility.md → aaaabr-decision-vault/outcomes/01-create-git-commit-utility.md} +0 -0
  397. /package/RAF/{017-decision-vault/outcomes/002-integrate-commit-into-plan.md → aaaabr-decision-vault/outcomes/02-integrate-commit-into-plan.md} +0 -0
  398. /package/RAF/{017-decision-vault/outcomes/003-add-tests-for-planning-commit.md → aaaabr-decision-vault/outcomes/03-add-tests-for-planning-commit.md} +0 -0
  399. /package/RAF/{017-decision-vault/plans/001-create-git-commit-utility.md → aaaabr-decision-vault/plans/01-create-git-commit-utility.md} +0 -0
  400. /package/RAF/{017-decision-vault/plans/002-integrate-commit-into-plan.md → aaaabr-decision-vault/plans/02-integrate-commit-into-plan.md} +0 -0
  401. /package/RAF/{017-decision-vault/plans/003-add-tests-for-planning-commit.md → aaaabr-decision-vault/plans/03-add-tests-for-planning-commit.md} +0 -0
  402. /package/RAF/{018-workflow-forge → aaaabs-workflow-forge}/decisions.md +0 -0
  403. /package/RAF/{018-workflow-forge → aaaabs-workflow-forge}/input.md +0 -0
  404. /package/RAF/{018-workflow-forge/outcomes/001-add-task-number-progress.md → aaaabs-workflow-forge/outcomes/01-add-task-number-progress.md} +0 -0
  405. /package/RAF/{018-workflow-forge/outcomes/002-update-plan-do-prompts.md → aaaabs-workflow-forge/outcomes/02-update-plan-do-prompts.md} +0 -0
  406. /package/RAF/{018-workflow-forge/plans/001-add-task-number-progress.md → aaaabs-workflow-forge/plans/01-add-task-number-progress.md} +0 -0
  407. /package/RAF/{018-workflow-forge/plans/002-update-plan-do-prompts.md → aaaabs-workflow-forge/plans/02-update-plan-do-prompts.md} +0 -0
  408. /package/RAF/{019-verbose-chronicle → aaaabt-verbose-chronicle}/decisions.md +0 -0
  409. /package/RAF/{019-verbose-chronicle → aaaabt-verbose-chronicle}/input.md +0 -0
  410. /package/RAF/{019-verbose-chronicle/outcomes/001-amend-iteration-references.md → aaaabt-verbose-chronicle/outcomes/01-amend-iteration-references.md} +0 -0
  411. /package/RAF/{019-verbose-chronicle/outcomes/002-verbose-task-name-display.md → aaaabt-verbose-chronicle/outcomes/02-verbose-task-name-display.md} +0 -0
  412. /package/RAF/{019-verbose-chronicle/outcomes/003-verbose-streaming-fix.md → aaaabt-verbose-chronicle/outcomes/03-verbose-streaming-fix.md} +0 -0
  413. /package/RAF/{019-verbose-chronicle/outcomes/004-commit-verification-before-halt.md → aaaabt-verbose-chronicle/outcomes/04-commit-verification-before-halt.md} +0 -0
  414. /package/RAF/{019-verbose-chronicle/plans/001-amend-iteration-references.md → aaaabt-verbose-chronicle/plans/01-amend-iteration-references.md} +0 -0
  415. /package/RAF/{019-verbose-chronicle/plans/002-verbose-task-name-display.md → aaaabt-verbose-chronicle/plans/02-verbose-task-name-display.md} +0 -0
  416. /package/RAF/{019-verbose-chronicle/plans/003-verbose-streaming-fix.md → aaaabt-verbose-chronicle/plans/03-verbose-streaming-fix.md} +0 -0
  417. /package/RAF/{019-verbose-chronicle/plans/004-commit-verification-before-halt.md → aaaabt-verbose-chronicle/plans/04-commit-verification-before-halt.md} +0 -0
@@ -45,11 +45,17 @@ export interface ClaudeRunnerOptions {
45
45
  commitContext?: {
46
46
  /** HEAD commit hash recorded before task execution began. */
47
47
  preExecutionHead: string;
48
- /** Expected commit message prefix (e.g., "RAF[005:001]"). */
48
+ /** Expected commit message prefix (e.g., "RAF[005:01]"). */
49
49
  expectedPrefix: string;
50
50
  /** Path to the outcome file that should be committed. */
51
51
  outcomeFilePath: string;
52
52
  };
53
+ /**
54
+ * Claude Code reasoning effort level.
55
+ * Sets CLAUDE_CODE_EFFORT_LEVEL env var for the spawned process.
56
+ * Only applied in non-interactive modes (run, runVerbose).
57
+ */
58
+ effortLevel?: 'low' | 'medium' | 'high';
53
59
  }
54
60
 
55
61
  export interface ClaudeRunnerConfig {
@@ -65,6 +71,7 @@ export interface RunResult {
65
71
  exitCode: number;
66
72
  timedOut: boolean;
67
73
  contextOverflow: boolean;
74
+ sessionId?: string;
68
75
  }
69
76
 
70
77
  const CONTEXT_OVERFLOW_PATTERNS = [
@@ -104,7 +111,7 @@ export const OUTCOME_POLL_INTERVAL_MS = 5_000;
104
111
  export interface CommitContext {
105
112
  /** HEAD commit hash recorded before task execution began. */
106
113
  preExecutionHead: string;
107
- /** Expected commit message prefix (e.g., "RAF[005:001]"). */
114
+ /** Expected commit message prefix (e.g., "RAF[005:01]"). */
108
115
  expectedPrefix: string;
109
116
  /** Path to the outcome file that should be committed. */
110
117
  outcomeFilePath: string;
@@ -252,11 +259,20 @@ export class ClaudeRunner {
252
259
  private activeProcess: pty.IPty | null = null;
253
260
  private killed = false;
254
261
  private model: string;
262
+ private _sessionId: string | undefined;
255
263
 
256
264
  constructor(config: ClaudeRunnerConfig = {}) {
257
265
  this.model = config.model ?? 'opus';
258
266
  }
259
267
 
268
+ /**
269
+ * Get the session ID captured from the most recent Claude session.
270
+ * Available after the system.init event is received during run() or runVerbose().
271
+ */
272
+ get sessionId(): string | undefined {
273
+ return this._sessionId;
274
+ }
275
+
260
276
  /**
261
277
  * Run Claude interactively with stdin/stdout passthrough.
262
278
  * Used for planning phase where user interaction is needed.
@@ -367,7 +383,7 @@ export class ClaudeRunner {
367
383
  * - Default timeout is 60 minutes if not specified
368
384
  */
369
385
  async run(prompt: string, options: ClaudeRunnerOptions = {}): Promise<RunResult> {
370
- const { timeout = 60, cwd = process.cwd(), outcomeFilePath, commitContext } = options;
386
+ const { timeout = 60, cwd = process.cwd(), outcomeFilePath, commitContext, effortLevel } = options;
371
387
  // Ensure timeout is a positive number, fallback to 60 minutes
372
388
  const validatedTimeout = Number(timeout) > 0 ? Number(timeout) : 60;
373
389
  const timeoutMs = validatedTimeout * 60 * 1000;
@@ -377,14 +393,20 @@ export class ClaudeRunner {
377
393
  let stderr = '';
378
394
  let timedOut = false;
379
395
  let contextOverflow = false;
396
+ let sessionId: string | undefined;
380
397
 
381
398
  const claudePath = getClaudePath();
382
399
 
383
400
  logger.debug(`Starting Claude execution session with model: ${this.model}`);
384
401
  logger.debug(`Claude path: ${claudePath}`);
385
402
 
386
- // Use --append-system-prompt to add RAF instructions to system prompt
387
- // This gives RAF instructions stronger precedence than passing as user message
403
+ // Build env, optionally injecting effort level
404
+ const env = effortLevel
405
+ ? { ...process.env, CLAUDE_CODE_EFFORT_LEVEL: effortLevel }
406
+ : process.env;
407
+
408
+ // Use --output-format stream-json to get structured events including session_id.
409
+ // Unlike runVerbose(), output is parsed silently without writing to stdout.
388
410
  // --dangerously-skip-permissions bypasses interactive prompts
389
411
  // -p enables print mode (non-interactive)
390
412
  const proc = spawn(claudePath, [
@@ -393,11 +415,14 @@ export class ClaudeRunner {
393
415
  this.model,
394
416
  '--append-system-prompt',
395
417
  prompt,
418
+ '--output-format',
419
+ 'stream-json',
420
+ '--verbose',
396
421
  '-p',
397
422
  'Execute the task as described in the system prompt.',
398
423
  ], {
399
424
  cwd,
400
- env: process.env,
425
+ env,
401
426
  stdio: ['ignore', 'pipe', 'pipe'], // no stdin needed
402
427
  });
403
428
 
@@ -408,6 +433,9 @@ export class ClaudeRunner {
408
433
  const timeoutHandle = setTimeout(() => {
409
434
  timedOut = true;
410
435
  logger.warn('Claude session timed out');
436
+ if (sessionId) {
437
+ logger.info(`Session ID: ${sessionId}`);
438
+ }
411
439
  proc.kill('SIGTERM');
412
440
  }, timeoutMs);
413
441
 
@@ -418,22 +446,47 @@ export class ClaudeRunner {
418
446
  commitContext,
419
447
  );
420
448
 
421
- // Collect stdout
449
+ // Buffer for incomplete NDJSON lines (data chunks may split across line boundaries)
450
+ let lineBuffer = '';
451
+
452
+ // Collect stdout - parse NDJSON silently (no display output)
422
453
  proc.stdout.on('data', (data) => {
423
- const text = data.toString();
424
- output += text;
425
-
426
- // Check for completion marker to start grace period
427
- completionDetector.checkOutput(output);
428
-
429
- // Check for context overflow
430
- for (const pattern of CONTEXT_OVERFLOW_PATTERNS) {
431
- if (pattern.test(text)) {
432
- contextOverflow = true;
433
- logger.warn('Context overflow detected');
434
- proc.kill('SIGTERM');
435
- break;
454
+ lineBuffer += data.toString();
455
+
456
+ // Process complete lines from the NDJSON stream
457
+ let newlineIndex: number;
458
+ while ((newlineIndex = lineBuffer.indexOf('\n')) !== -1) {
459
+ const line = lineBuffer.substring(0, newlineIndex);
460
+ lineBuffer = lineBuffer.substring(newlineIndex + 1);
461
+
462
+ const result = renderStreamEvent(line);
463
+
464
+ if (result.sessionId && !sessionId) {
465
+ sessionId = result.sessionId;
466
+ this._sessionId = sessionId;
436
467
  }
468
+
469
+ if (result.textContent) {
470
+ output += result.textContent;
471
+
472
+ // Check for completion marker to start grace period
473
+ completionDetector.checkOutput(output);
474
+
475
+ // Check for context overflow
476
+ for (const pattern of CONTEXT_OVERFLOW_PATTERNS) {
477
+ if (pattern.test(result.textContent)) {
478
+ contextOverflow = true;
479
+ logger.warn('Context overflow detected');
480
+ if (sessionId) {
481
+ logger.info(`Session ID: ${sessionId}`);
482
+ }
483
+ proc.kill('SIGTERM');
484
+ break;
485
+ }
486
+ }
487
+ }
488
+
489
+ // Silently discard display output (unlike runVerbose)
437
490
  }
438
491
  });
439
492
 
@@ -443,6 +496,17 @@ export class ClaudeRunner {
443
496
  });
444
497
 
445
498
  proc.on('close', (exitCode) => {
499
+ // Process any remaining data in the line buffer
500
+ if (lineBuffer.trim()) {
501
+ const result = renderStreamEvent(lineBuffer);
502
+ if (result.sessionId && !sessionId) {
503
+ sessionId = result.sessionId;
504
+ }
505
+ if (result.textContent) {
506
+ output += result.textContent;
507
+ }
508
+ }
509
+
446
510
  clearTimeout(timeoutHandle);
447
511
  completionDetector.cleanup();
448
512
  this.activeProcess = null;
@@ -456,6 +520,7 @@ export class ClaudeRunner {
456
520
  exitCode: exitCode ?? (this.killed ? 130 : 1),
457
521
  timedOut,
458
522
  contextOverflow,
523
+ sessionId,
459
524
  });
460
525
  });
461
526
  });
@@ -474,7 +539,7 @@ export class ClaudeRunner {
474
539
  * - Default timeout is 60 minutes if not specified
475
540
  */
476
541
  async runVerbose(prompt: string, options: ClaudeRunnerOptions = {}): Promise<RunResult> {
477
- const { timeout = 60, cwd = process.cwd(), outcomeFilePath, commitContext } = options;
542
+ const { timeout = 60, cwd = process.cwd(), outcomeFilePath, commitContext, effortLevel } = options;
478
543
  // Ensure timeout is a positive number, fallback to 60 minutes
479
544
  const validatedTimeout = Number(timeout) > 0 ? Number(timeout) : 60;
480
545
  const timeoutMs = validatedTimeout * 60 * 1000;
@@ -484,6 +549,7 @@ export class ClaudeRunner {
484
549
  let stderr = '';
485
550
  let timedOut = false;
486
551
  let contextOverflow = false;
552
+ let sessionId: string | undefined;
487
553
 
488
554
  const claudePath = getClaudePath();
489
555
 
@@ -491,6 +557,11 @@ export class ClaudeRunner {
491
557
  logger.debug(`Prompt length: ${prompt.length}, timeout: ${timeoutMs}ms, cwd: ${cwd}`);
492
558
  logger.debug(`Claude path: ${claudePath}`);
493
559
 
560
+ // Build env, optionally injecting effort level
561
+ const env = effortLevel
562
+ ? { ...process.env, CLAUDE_CODE_EFFORT_LEVEL: effortLevel }
563
+ : process.env;
564
+
494
565
  logger.debug('Spawning process...');
495
566
  // Use --output-format stream-json --verbose to get real-time streaming events
496
567
  // including tool calls, file operations, and intermediate output.
@@ -509,7 +580,7 @@ export class ClaudeRunner {
509
580
  'Execute the task as described in the system prompt.',
510
581
  ], {
511
582
  cwd,
512
- env: process.env,
583
+ env,
513
584
  stdio: ['ignore', 'pipe', 'pipe'], // no stdin needed
514
585
  });
515
586
 
@@ -521,6 +592,9 @@ export class ClaudeRunner {
521
592
  const timeoutHandle = setTimeout(() => {
522
593
  timedOut = true;
523
594
  logger.warn('Claude session timed out');
595
+ if (sessionId) {
596
+ logger.info(`Session ID: ${sessionId}`);
597
+ }
524
598
  proc.kill('SIGTERM');
525
599
  }, timeoutMs);
526
600
 
@@ -549,27 +623,35 @@ export class ClaudeRunner {
549
623
  const line = lineBuffer.substring(0, newlineIndex);
550
624
  lineBuffer = lineBuffer.substring(newlineIndex + 1);
551
625
 
552
- const { display, textContent } = renderStreamEvent(line);
626
+ const result = renderStreamEvent(line);
627
+
628
+ if (result.sessionId && !sessionId) {
629
+ sessionId = result.sessionId;
630
+ this._sessionId = sessionId;
631
+ }
553
632
 
554
- if (textContent) {
555
- output += textContent;
633
+ if (result.textContent) {
634
+ output += result.textContent;
556
635
 
557
636
  // Check for completion marker to start grace period
558
637
  completionDetector.checkOutput(output);
559
638
 
560
639
  // Check for context overflow
561
640
  for (const pattern of CONTEXT_OVERFLOW_PATTERNS) {
562
- if (pattern.test(textContent)) {
641
+ if (pattern.test(result.textContent)) {
563
642
  contextOverflow = true;
564
643
  logger.warn('Context overflow detected');
644
+ if (sessionId) {
645
+ logger.info(`Session ID: ${sessionId}`);
646
+ }
565
647
  proc.kill('SIGTERM');
566
648
  break;
567
649
  }
568
650
  }
569
651
  }
570
652
 
571
- if (display) {
572
- process.stdout.write(display);
653
+ if (result.display) {
654
+ process.stdout.write(result.display);
573
655
  }
574
656
  }
575
657
  });
@@ -582,12 +664,15 @@ export class ClaudeRunner {
582
664
  proc.on('close', (exitCode) => {
583
665
  // Process any remaining data in the line buffer
584
666
  if (lineBuffer.trim()) {
585
- const { display, textContent } = renderStreamEvent(lineBuffer);
586
- if (textContent) {
587
- output += textContent;
667
+ const result = renderStreamEvent(lineBuffer);
668
+ if (result.sessionId && !sessionId) {
669
+ sessionId = result.sessionId;
588
670
  }
589
- if (display) {
590
- process.stdout.write(display);
671
+ if (result.textContent) {
672
+ output += result.textContent;
673
+ }
674
+ if (result.display) {
675
+ process.stdout.write(result.display);
591
676
  }
592
677
  }
593
678
 
@@ -605,6 +690,134 @@ export class ClaudeRunner {
605
690
  exitCode: exitCode ?? (this.killed ? 130 : 1),
606
691
  timedOut,
607
692
  contextOverflow,
693
+ sessionId,
694
+ });
695
+ });
696
+ });
697
+ }
698
+
699
+ /**
700
+ * Resume an interrupted Claude session by session ID.
701
+ * Spawns Claude with --resume flag only — no prompt, model, or system prompt flags.
702
+ * Uses stream-json output format for session ID extraction and completion detection.
703
+ */
704
+ async runResume(sessionId: string, options: ClaudeRunnerOptions = {}): Promise<RunResult> {
705
+ const { timeout = 60, cwd = process.cwd(), outcomeFilePath, commitContext, effortLevel } = options;
706
+ const validatedTimeout = Number(timeout) > 0 ? Number(timeout) : 60;
707
+ const timeoutMs = validatedTimeout * 60 * 1000;
708
+
709
+ return new Promise((resolve) => {
710
+ let output = '';
711
+ let stderr = '';
712
+ let timedOut = false;
713
+ let contextOverflow = false;
714
+ let newSessionId: string | undefined;
715
+
716
+ const claudePath = getClaudePath();
717
+
718
+ logger.debug(`Resuming Claude session: ${sessionId}`);
719
+
720
+ const env = effortLevel
721
+ ? { ...process.env, CLAUDE_CODE_EFFORT_LEVEL: effortLevel }
722
+ : process.env;
723
+
724
+ // Resume with minimal flags: --resume, --dangerously-skip-permissions, --output-format stream-json --verbose
725
+ // Do NOT pass --model, --append-system-prompt, or -p — Claude restores these from the session
726
+ const proc = spawn(claudePath, [
727
+ '--resume',
728
+ sessionId,
729
+ '--dangerously-skip-permissions',
730
+ '--output-format',
731
+ 'stream-json',
732
+ '--verbose',
733
+ ], {
734
+ cwd,
735
+ env,
736
+ stdio: ['ignore', 'pipe', 'pipe'],
737
+ });
738
+
739
+ this.activeProcess = proc as any;
740
+
741
+ const timeoutHandle = setTimeout(() => {
742
+ timedOut = true;
743
+ logger.warn('Resumed Claude session timed out');
744
+ if (newSessionId) {
745
+ logger.info(`Session ID: ${newSessionId}`);
746
+ }
747
+ proc.kill('SIGTERM');
748
+ }, timeoutMs);
749
+
750
+ const completionDetector = createCompletionDetector(
751
+ () => proc.kill('SIGTERM'),
752
+ outcomeFilePath,
753
+ commitContext,
754
+ );
755
+
756
+ let lineBuffer = '';
757
+
758
+ proc.stdout.on('data', (data) => {
759
+ lineBuffer += data.toString();
760
+
761
+ let newlineIndex: number;
762
+ while ((newlineIndex = lineBuffer.indexOf('\n')) !== -1) {
763
+ const line = lineBuffer.substring(0, newlineIndex);
764
+ lineBuffer = lineBuffer.substring(newlineIndex + 1);
765
+
766
+ const result = renderStreamEvent(line);
767
+
768
+ if (result.sessionId && !newSessionId) {
769
+ newSessionId = result.sessionId;
770
+ this._sessionId = newSessionId;
771
+ }
772
+
773
+ if (result.textContent) {
774
+ output += result.textContent;
775
+ completionDetector.checkOutput(output);
776
+
777
+ for (const pattern of CONTEXT_OVERFLOW_PATTERNS) {
778
+ if (pattern.test(result.textContent)) {
779
+ contextOverflow = true;
780
+ logger.warn('Context overflow detected');
781
+ if (newSessionId) {
782
+ logger.info(`Session ID: ${newSessionId}`);
783
+ }
784
+ proc.kill('SIGTERM');
785
+ break;
786
+ }
787
+ }
788
+ }
789
+ }
790
+ });
791
+
792
+ proc.stderr.on('data', (data) => {
793
+ stderr += data.toString();
794
+ });
795
+
796
+ proc.on('close', (exitCode) => {
797
+ if (lineBuffer.trim()) {
798
+ const result = renderStreamEvent(lineBuffer);
799
+ if (result.sessionId && !newSessionId) {
800
+ newSessionId = result.sessionId;
801
+ }
802
+ if (result.textContent) {
803
+ output += result.textContent;
804
+ }
805
+ }
806
+
807
+ clearTimeout(timeoutHandle);
808
+ completionDetector.cleanup();
809
+ this.activeProcess = null;
810
+
811
+ if (stderr) {
812
+ logger.debug(`Claude stderr: ${stderr}`);
813
+ }
814
+
815
+ resolve({
816
+ output,
817
+ exitCode: exitCode ?? (this.killed ? 130 : 1),
818
+ timedOut,
819
+ contextOverflow,
820
+ sessionId: newSessionId,
608
821
  });
609
822
  });
610
823
  });
package/src/core/git.ts CHANGED
@@ -12,9 +12,9 @@ export interface GitStatus {
12
12
  /**
13
13
  * Check if we're in a git repository.
14
14
  */
15
- export function isGitRepo(): boolean {
15
+ export function isGitRepo(cwd?: string): boolean {
16
16
  try {
17
- execSync('git rev-parse --is-inside-work-tree', { encoding: 'utf-8', stdio: 'pipe' });
17
+ execSync('git rev-parse --is-inside-work-tree', { encoding: 'utf-8', stdio: 'pipe', ...(cwd ? { cwd } : {}) });
18
18
  return true;
19
19
  } catch {
20
20
  return false;
@@ -58,9 +58,9 @@ export function getGitStatus(): GitStatus {
58
58
  /**
59
59
  * Check if there are uncommitted changes.
60
60
  */
61
- export function hasUncommittedChanges(): boolean {
61
+ export function hasUncommittedChanges(cwd?: string): boolean {
62
62
  try {
63
- const status = execSync('git status --porcelain', { encoding: 'utf-8', stdio: 'pipe' });
63
+ const status = execSync('git status --porcelain', { encoding: 'utf-8', stdio: 'pipe', ...(cwd ? { cwd } : {}) });
64
64
  return status.trim().length > 0;
65
65
  } catch {
66
66
  return false;
@@ -141,16 +141,16 @@ export function getChangedFiles(): string[] {
141
141
 
142
142
  /**
143
143
  * Stash uncommitted changes with a descriptive name.
144
- * @param name - Name for the stash (e.g., "raf-001-task-3-failed")
144
+ * @param name - Name for the stash (e.g., "raf-001-task-03-failed")
145
145
  * @returns true if stash was created, false otherwise
146
146
  */
147
- export function stashChanges(name: string): boolean {
148
- if (!isGitRepo()) {
147
+ export function stashChanges(name: string, cwd?: string): boolean {
148
+ if (!isGitRepo(cwd)) {
149
149
  logger.warn('Not in a git repository, skipping stash');
150
150
  return false;
151
151
  }
152
152
 
153
- if (!hasUncommittedChanges()) {
153
+ if (!hasUncommittedChanges(cwd)) {
154
154
  logger.debug('No uncommitted changes to stash');
155
155
  return false;
156
156
  }
@@ -159,6 +159,7 @@ export function stashChanges(name: string): boolean {
159
159
  execSync(`git stash push -m "${name.replace(/"/g, '\\"')}"`, {
160
160
  encoding: 'utf-8',
161
161
  stdio: 'pipe',
162
+ ...(cwd ? { cwd } : {}),
162
163
  });
163
164
  return true;
164
165
  } catch (error) {
@@ -171,9 +172,9 @@ export function stashChanges(name: string): boolean {
171
172
  * Get the current HEAD commit hash.
172
173
  * Returns null if not in a git repo or HEAD doesn't exist.
173
174
  */
174
- export function getHeadCommitHash(): string | null {
175
+ export function getHeadCommitHash(cwd?: string): string | null {
175
176
  try {
176
- return execSync('git rev-parse HEAD', { encoding: 'utf-8', stdio: 'pipe' }).trim() || null;
177
+ return execSync('git rev-parse HEAD', { encoding: 'utf-8', stdio: 'pipe', ...(cwd ? { cwd } : {}) }).trim() || null;
177
178
  } catch {
178
179
  return null;
179
180
  }
@@ -214,13 +215,20 @@ export function isFileCommittedInHead(filePath: string): boolean {
214
215
  /**
215
216
  * Commit planning artifacts (input.md and decisions.md) for a project.
216
217
  * Uses commit message format: RAF[NNN] Plan: project-name
218
+ * For amendments: RAF[NNN] Amend: project-name
217
219
  *
218
220
  * @param projectPath - Full path to the project folder (e.g., /path/to/RAF/017-decision-vault)
221
+ * @param options - Optional settings
222
+ * @param options.cwd - Working directory for git commands (worktree support)
223
+ * @param options.additionalFiles - Extra file paths to stage (e.g., plan files for amend)
224
+ * @param options.isAmend - Use "Amend:" prefix instead of "Plan:" in commit message
219
225
  * @returns Promise that resolves when commit is complete (or fails silently)
220
226
  */
221
- export async function commitPlanningArtifacts(projectPath: string): Promise<void> {
227
+ export async function commitPlanningArtifacts(projectPath: string, options?: { cwd?: string; additionalFiles?: string[]; isAmend?: boolean }): Promise<void> {
228
+ const execCwd = options?.cwd;
229
+
222
230
  // Check if we're in a git repository
223
- if (!isGitRepo()) {
231
+ if (!isGitRepo(execCwd)) {
224
232
  logger.warn('Not in a git repository, skipping planning artifacts commit');
225
233
  return;
226
234
  }
@@ -234,25 +242,52 @@ export async function commitPlanningArtifacts(projectPath: string): Promise<void
234
242
  return;
235
243
  }
236
244
 
237
- // Build file paths relative to the project folder
245
+ // Build absolute file paths
238
246
  const inputFile = path.join(projectPath, 'input.md');
239
247
  const decisionsFile = path.join(projectPath, 'decisions.md');
240
248
 
241
249
  // Build commit message
242
- const commitMessage = `RAF[${projectNumber}] Plan: ${projectName}`;
250
+ const prefix = options?.isAmend ? 'Amend' : 'Plan';
251
+ const commitMessage = `RAF[${projectNumber}] ${prefix}: ${projectName}`;
252
+
253
+ // Build list of files to stage (absolute paths)
254
+ const absoluteFiles = [inputFile, decisionsFile, ...(options?.additionalFiles ?? [])];
255
+
256
+ // Convert to relative paths when cwd is provided (worktree mode).
257
+ // Git resolves paths relative to the working directory. Using relative paths
258
+ // avoids issues with symlink resolution (e.g., /tmp → /private/tmp on macOS)
259
+ // that can cause absolute paths to not match git's internal worktree paths.
260
+ const filesToStage = execCwd
261
+ ? absoluteFiles.map(f => path.relative(execCwd, f))
262
+ : absoluteFiles;
263
+
264
+ // Stage each file individually so one missing file doesn't block the others
265
+ let stagedCount = 0;
266
+ for (const file of filesToStage) {
267
+ try {
268
+ execSync(`git add -- "${file}"`, {
269
+ encoding: 'utf-8',
270
+ stdio: 'pipe',
271
+ ...(execCwd ? { cwd: execCwd } : {}),
272
+ });
273
+ stagedCount++;
274
+ } catch (error) {
275
+ const msg = error instanceof Error ? error.message : String(error);
276
+ logger.warn(`Failed to stage ${file}: ${msg}`);
277
+ }
278
+ }
243
279
 
244
- try {
245
- // Stage only the specific files (input.md and decisions.md)
246
- // Use --force to add even if in .gitignore, and -- to handle paths with special chars
247
- execSync(`git add -- "${inputFile}" "${decisionsFile}"`, {
248
- encoding: 'utf-8',
249
- stdio: 'pipe',
250
- });
280
+ if (stagedCount === 0) {
281
+ logger.debug('No files were staged for planning artifacts commit');
282
+ return;
283
+ }
251
284
 
285
+ try {
252
286
  // Check if there's anything staged to commit
253
287
  const stagedStatus = execSync('git diff --cached --name-only', {
254
288
  encoding: 'utf-8',
255
289
  stdio: 'pipe',
290
+ ...(execCwd ? { cwd: execCwd } : {}),
256
291
  }).trim();
257
292
 
258
293
  if (!stagedStatus) {
@@ -264,6 +299,7 @@ export async function commitPlanningArtifacts(projectPath: string): Promise<void
264
299
  execSync(`git commit -m "${commitMessage.replace(/"/g, '\\"')}"`, {
265
300
  encoding: 'utf-8',
266
301
  stdio: 'pipe',
302
+ ...(execCwd ? { cwd: execCwd } : {}),
267
303
  });
268
304
 
269
305
  logger.debug(`Committed planning artifacts: ${commitMessage}`);
@@ -11,6 +11,7 @@ import {
11
11
  getDecisionsPath,
12
12
  getInputPath,
13
13
  listProjects,
14
+ TASK_ID_PATTERN,
14
15
  } from '../utils/paths.js';
15
16
  import { sanitizeProjectName } from '../utils/validation.js';
16
17
  import { logger } from '../utils/logger.js';
@@ -145,7 +146,7 @@ export class ProjectManager {
145
146
  const files = fs.readdirSync(outcomesDir).filter((f) => f.endsWith('.md')).sort();
146
147
 
147
148
  for (const file of files) {
148
- const match = file.match(/^(\d{2,3})-/);
149
+ const match = file.match(new RegExp(`^(${TASK_ID_PATTERN})-`));
149
150
  if (match && match[1]) {
150
151
  const content = fs.readFileSync(path.join(outcomesDir, file), 'utf-8');
151
152
  outcomes.push({ taskId: match[1], content });