rafcode 1.0.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 (370) hide show
  1. package/.claude/settings.local.json +32 -0
  2. package/CLAUDE.md +187 -0
  3. package/LICENSE +21 -0
  4. package/RAF/001-raf-task-improvements/input.md +9 -0
  5. package/RAF/001-raf-task-improvements/outcomes/001-add-decisions-folder.md +21 -0
  6. package/RAF/001-raf-task-improvements/outcomes/002-fix-write-error-on-shutdown.md +22 -0
  7. package/RAF/001-raf-task-improvements/outcomes/003-stash-changes-on-failure.md +34 -0
  8. package/RAF/001-raf-task-improvements/outcomes/004-add-project-name-to-commits.md +28 -0
  9. package/RAF/001-raf-task-improvements/outcomes/005-add-running-time-display.md +36 -0
  10. package/RAF/001-raf-task-improvements/outcomes/006-add-task-name-to-logs.md +22 -0
  11. package/RAF/001-raf-task-improvements/outcomes/007-show-model-at-task-start.md +52 -0
  12. package/RAF/001-raf-task-improvements/outcomes/009-remove-editor-placeholder-text.md +20 -0
  13. package/RAF/001-raf-task-improvements/outcomes/SUMMARY.md +83 -0
  14. package/RAF/001-raf-task-improvements/plans/001-add-decisions-folder.md +38 -0
  15. package/RAF/001-raf-task-improvements/plans/002-fix-write-error-on-shutdown.md +33 -0
  16. package/RAF/001-raf-task-improvements/plans/003-stash-changes-on-failure.md +37 -0
  17. package/RAF/001-raf-task-improvements/plans/004-add-project-name-to-commits.md +34 -0
  18. package/RAF/001-raf-task-improvements/plans/005-add-running-time-display.md +39 -0
  19. package/RAF/001-raf-task-improvements/plans/006-add-task-name-to-logs.md +37 -0
  20. package/RAF/001-raf-task-improvements/plans/009-remove-editor-placeholder-text.md +34 -0
  21. package/RAF/002-raf-task-improvements-execution/decisions/DECISIONS.md +13 -0
  22. package/RAF/002-raf-task-improvements-execution/input.md +3 -0
  23. package/RAF/002-raf-task-improvements-execution/outcomes/001-commit-show-model-at-task-start.md +17 -0
  24. package/RAF/002-raf-task-improvements-execution/outcomes/002-delete-skipped-plan.md +23 -0
  25. package/RAF/002-raf-task-improvements-execution/outcomes/SUMMARY.md +32 -0
  26. package/RAF/002-raf-task-improvements-execution/plans/001-commit-show-model-at-task-start.md +37 -0
  27. package/RAF/002-raf-task-improvements-execution/plans/002-delete-skipped-plan.md +23 -0
  28. package/RAF/003-multi-project-execution/decisions/DECISIONS.md +68 -0
  29. package/RAF/003-multi-project-execution/input.md +6 -0
  30. package/RAF/003-multi-project-execution/outcomes/001-remove-state-json.md +52 -0
  31. package/RAF/003-multi-project-execution/outcomes/002-update-raf-status.md +50 -0
  32. package/RAF/003-multi-project-execution/outcomes/003-simplify-git-logic.md +35 -0
  33. package/RAF/003-multi-project-execution/outcomes/004-auto-commit-planning.md +43 -0
  34. package/RAF/003-multi-project-execution/outcomes/005-rerun-failed-tasks.md +43 -0
  35. package/RAF/003-multi-project-execution/outcomes/006-multi-project-execution.md +42 -0
  36. package/RAF/003-multi-project-execution/outcomes/007-verify-timeout.md +54 -0
  37. package/RAF/003-multi-project-execution/outcomes/008-move-decisions-file.md +38 -0
  38. package/RAF/003-multi-project-execution/outcomes/SUMMARY.md +79 -0
  39. package/RAF/003-multi-project-execution/plans/001-remove-state-json.md +71 -0
  40. package/RAF/003-multi-project-execution/plans/002-update-raf-status.md +65 -0
  41. package/RAF/003-multi-project-execution/plans/003-simplify-git-logic.md +74 -0
  42. package/RAF/003-multi-project-execution/plans/004-auto-commit-planning.md +57 -0
  43. package/RAF/003-multi-project-execution/plans/005-rerun-failed-tasks.md +69 -0
  44. package/RAF/003-multi-project-execution/plans/006-multi-project-execution.md +81 -0
  45. package/RAF/003-multi-project-execution/plans/007-verify-timeout.md +63 -0
  46. package/RAF/003-multi-project-execution/plans/008-move-decisions-file.md +78 -0
  47. package/RAF/004-task-naming-optimization/decisions.md +22 -0
  48. package/RAF/004-task-naming-optimization/input.md +6 -0
  49. package/RAF/004-task-naming-optimization/outcomes/001-remove-summary-file.md +17 -0
  50. package/RAF/004-task-naming-optimization/outcomes/002-base36-project-numbering.md +32 -0
  51. package/RAF/004-task-naming-optimization/outcomes/003-improve-haiku-prompt.md +20 -0
  52. package/RAF/004-task-naming-optimization/outcomes/SUMMARY.md +28 -0
  53. package/RAF/004-task-naming-optimization/plans/001-remove-summary-file.md +34 -0
  54. package/RAF/004-task-naming-optimization/plans/002-base36-project-numbering.md +56 -0
  55. package/RAF/004-task-naming-optimization/plans/003-improve-haiku-prompt.md +50 -0
  56. package/RAF/005-task-naming-improvements/decisions.md +60 -0
  57. package/RAF/005-task-naming-improvements/input.md +2 -0
  58. package/RAF/005-task-naming-improvements/outcomes/001-enhance-identifier-resolution.md +42 -0
  59. package/RAF/005-task-naming-improvements/outcomes/002-add-identifier-support-to-status.md +38 -0
  60. package/RAF/005-task-naming-improvements/outcomes/003-update-do-for-full-folder-names.md +44 -0
  61. package/RAF/005-task-naming-improvements/outcomes/004-implement-amend-flag-for-plan.md +55 -0
  62. package/RAF/005-task-naming-improvements/outcomes/005-commit-outcomes-on-complete.md +47 -0
  63. package/RAF/005-task-naming-improvements/outcomes/006-update-execution-prompt-commit-schema.md +40 -0
  64. package/RAF/005-task-naming-improvements/outcomes/007-allow-pending-task-amendments.md +38 -0
  65. package/RAF/005-task-naming-improvements/outcomes/008-fix-timeout-label.md +24 -0
  66. package/RAF/005-task-naming-improvements/plans/001-enhance-identifier-resolution.md +46 -0
  67. package/RAF/005-task-naming-improvements/plans/002-add-identifier-support-to-status.md +36 -0
  68. package/RAF/005-task-naming-improvements/plans/003-update-do-for-full-folder-names.md +38 -0
  69. package/RAF/005-task-naming-improvements/plans/004-implement-amend-flag-for-plan.md +67 -0
  70. package/RAF/005-task-naming-improvements/plans/005-commit-outcomes-on-complete.md +86 -0
  71. package/RAF/005-task-naming-improvements/plans/006-update-execution-prompt-commit-schema.md +60 -0
  72. package/RAF/005-task-naming-improvements/plans/007-allow-pending-task-amendments.md +60 -0
  73. package/RAF/005-task-naming-improvements/plans/008-fix-timeout-label.md +31 -0
  74. package/RAF/006-fix-double-summary-headers/decisions.md +28 -0
  75. package/RAF/006-fix-double-summary-headers/input.md +3 -0
  76. package/RAF/006-fix-double-summary-headers/outcomes/001-fix-double-summary-headers.md +29 -0
  77. package/RAF/006-fix-double-summary-headers/outcomes/002-update-readme-for-npm.md +31 -0
  78. package/RAF/006-fix-double-summary-headers/outcomes/003-npm-publish-instructions.md +30 -0
  79. package/RAF/006-fix-double-summary-headers/outcomes/004-flexible-project-lookup.md +47 -0
  80. package/RAF/006-fix-double-summary-headers/plans/001-fix-double-summary-headers.md +42 -0
  81. package/RAF/006-fix-double-summary-headers/plans/002-update-readme-for-npm.md +44 -0
  82. package/RAF/006-fix-double-summary-headers/plans/003-npm-publish-instructions.md +45 -0
  83. package/RAF/006-fix-double-summary-headers/plans/004-flexible-project-lookup.md +40 -0
  84. package/RAF/007-improve-outcome-format/decisions.md +28 -0
  85. package/RAF/007-improve-outcome-format/input.md +2 -0
  86. package/RAF/007-improve-outcome-format/outcomes/001-update-execution-prompt.md +10 -0
  87. package/RAF/007-improve-outcome-format/outcomes/002-update-state-derivation.md +17 -0
  88. package/RAF/007-improve-outcome-format/outcomes/003-update-do-command-outcome-handling.md +16 -0
  89. package/RAF/007-improve-outcome-format/outcomes/004-implement-failure-analysis.md +16 -0
  90. package/RAF/007-improve-outcome-format/outcomes/005-update-documentation.md +15 -0
  91. package/RAF/007-improve-outcome-format/plans/001-update-execution-prompt.md +36 -0
  92. package/RAF/007-improve-outcome-format/plans/002-update-state-derivation.md +35 -0
  93. package/RAF/007-improve-outcome-format/plans/003-update-do-command-outcome-handling.md +37 -0
  94. package/RAF/007-improve-outcome-format/plans/004-implement-failure-analysis.md +44 -0
  95. package/RAF/007-improve-outcome-format/plans/005-update-documentation.md +33 -0
  96. package/RAF/008-beautiful-do/decisions.md +31 -0
  97. package/RAF/008-beautiful-do/input.md +1 -0
  98. package/RAF/008-beautiful-do/outcomes/001-terminal-symbols.md +55 -0
  99. package/RAF/008-beautiful-do/outcomes/002-refactor-do-output.md +95 -0
  100. package/RAF/008-beautiful-do/outcomes/003-refactor-status-output.md +71 -0
  101. package/RAF/008-beautiful-do/outcomes/004-simplify-logger.md +53 -0
  102. package/RAF/008-beautiful-do/outcomes/005-add-tests.md +41 -0
  103. package/RAF/008-beautiful-do/plans/001-terminal-symbols.md +41 -0
  104. package/RAF/008-beautiful-do/plans/002-refactor-do-output.md +44 -0
  105. package/RAF/008-beautiful-do/plans/003-refactor-status-output.md +37 -0
  106. package/RAF/008-beautiful-do/plans/004-simplify-logger.md +32 -0
  107. package/RAF/008-beautiful-do/plans/005-add-tests.md +40 -0
  108. package/RAF/009-system-promt-ammend/decisions.md +13 -0
  109. package/RAF/009-system-promt-ammend/input.md +9 -0
  110. package/RAF/009-system-promt-ammend/outcomes/001-model-override.md +79 -0
  111. package/RAF/009-system-promt-ammend/outcomes/002-system-prompt-append.md +51 -0
  112. package/RAF/009-system-promt-ammend/outcomes/003-retry-context.md +60 -0
  113. package/RAF/009-system-promt-ammend/plans/001-model-override.md +61 -0
  114. package/RAF/009-system-promt-ammend/plans/002-system-prompt-append.md +56 -0
  115. package/RAF/009-system-promt-ammend/plans/003-retry-context.md +76 -0
  116. package/RAF/010-outcome-marker-fallback/decisions.md +19 -0
  117. package/RAF/010-outcome-marker-fallback/input.md +1 -0
  118. package/RAF/010-outcome-marker-fallback/outcomes/001-outcome-file-marker-fallback.md +35 -0
  119. package/RAF/010-outcome-marker-fallback/outcomes/002-creative-project-naming.md +47 -0
  120. package/RAF/010-outcome-marker-fallback/plans/001-outcome-file-marker-fallback.md +58 -0
  121. package/RAF/010-outcome-marker-fallback/plans/002-creative-project-naming.md +68 -0
  122. package/RAF/011-do-task-in-commit/decisions.md +22 -0
  123. package/RAF/011-do-task-in-commit/input.md +1 -0
  124. package/RAF/011-do-task-in-commit/outcomes/001-update-execution-prompt.md +54 -0
  125. package/RAF/011-do-task-in-commit/outcomes/002-update-tests.md +61 -0
  126. package/RAF/011-do-task-in-commit/outcomes/003-update-documentation.md +51 -0
  127. package/RAF/011-do-task-in-commit/plans/001-update-execution-prompt.md +46 -0
  128. package/RAF/011-do-task-in-commit/plans/002-update-tests.md +51 -0
  129. package/RAF/011-do-task-in-commit/plans/003-update-documentation.md +45 -0
  130. package/RAF/012-name-picker-buffet/decisions.md +40 -0
  131. package/RAF/012-name-picker-buffet/input.md +6 -0
  132. package/RAF/012-name-picker-buffet/outcomes/001-name-picker-for-raf-plan.md +49 -0
  133. package/RAF/012-name-picker-buffet/outcomes/002-interactive-project-picker-for-raf-do.md +49 -0
  134. package/RAF/012-name-picker-buffet/outcomes/003-raf-status-truncation.md +55 -0
  135. package/RAF/012-name-picker-buffet/outcomes/004-failure-reason-details.md +65 -0
  136. package/RAF/012-name-picker-buffet/outcomes/005-remove-raf-commits.md +57 -0
  137. package/RAF/012-name-picker-buffet/outcomes/006-update-execution-prompt-for-commits.md +47 -0
  138. package/RAF/012-name-picker-buffet/outcomes/007-fix-plan-mode-user-prompt.md +83 -0
  139. package/RAF/012-name-picker-buffet/outcomes/008-add-auto-flag-for-plan-mode.md +77 -0
  140. package/RAF/012-name-picker-buffet/plans/001-name-picker-for-raf-plan.md +47 -0
  141. package/RAF/012-name-picker-buffet/plans/002-interactive-project-picker-for-raf-do.md +43 -0
  142. package/RAF/012-name-picker-buffet/plans/003-raf-status-truncation.md +36 -0
  143. package/RAF/012-name-picker-buffet/plans/004-failure-reason-details.md +46 -0
  144. package/RAF/012-name-picker-buffet/plans/005-remove-raf-commits.md +42 -0
  145. package/RAF/012-name-picker-buffet/plans/006-update-execution-prompt-for-commits.md +47 -0
  146. package/RAF/012-name-picker-buffet/plans/007-fix-plan-mode-user-prompt.md +55 -0
  147. package/RAF/012-name-picker-buffet/plans/008-add-auto-flag-for-plan-mode.md +49 -0
  148. package/RAF/013-dependencies-watchdog/decisions.md +37 -0
  149. package/RAF/013-dependencies-watchdog/input.md +1 -0
  150. package/RAF/013-dependencies-watchdog/outcomes/001-define-dependency-syntax.md +56 -0
  151. package/RAF/013-dependencies-watchdog/outcomes/002-update-planning-prompts.md +60 -0
  152. package/RAF/013-dependencies-watchdog/outcomes/003-parse-dependencies-update-state.md +81 -0
  153. package/RAF/013-dependencies-watchdog/outcomes/004-implement-dependency-checking-in-do.md +116 -0
  154. package/RAF/013-dependencies-watchdog/outcomes/005-update-execution-prompts.md +75 -0
  155. package/RAF/013-dependencies-watchdog/outcomes/006-add-tests.md +100 -0
  156. package/RAF/013-dependencies-watchdog/outcomes/007-add-act-alias.md +46 -0
  157. package/RAF/013-dependencies-watchdog/outcomes/008-add-exit-message.md +52 -0
  158. package/RAF/013-dependencies-watchdog/plans/001-define-dependency-syntax.md +32 -0
  159. package/RAF/013-dependencies-watchdog/plans/002-update-planning-prompts.md +38 -0
  160. package/RAF/013-dependencies-watchdog/plans/003-parse-dependencies-update-state.md +46 -0
  161. package/RAF/013-dependencies-watchdog/plans/004-implement-dependency-checking-in-do.md +48 -0
  162. package/RAF/013-dependencies-watchdog/plans/005-update-execution-prompts.md +44 -0
  163. package/RAF/013-dependencies-watchdog/plans/006-add-tests.md +54 -0
  164. package/RAF/013-dependencies-watchdog/plans/007-add-act-alias.md +26 -0
  165. package/RAF/013-dependencies-watchdog/plans/008-add-exit-message.md +31 -0
  166. package/RAF/014-watchdog/decisions.md +16 -0
  167. package/RAF/014-watchdog/input.md +2 -0
  168. package/RAF/014-watchdog/outcomes/001-amend-flag-position.md +50 -0
  169. package/RAF/014-watchdog/outcomes/002-details-only-on-failure.md +58 -0
  170. package/RAF/014-watchdog/plans/001-amend-flag-position.md +34 -0
  171. package/RAF/014-watchdog/plans/002-details-only-on-failure.md +46 -0
  172. package/RAF/015-name-lottery/decisions.md +14 -0
  173. package/RAF/015-name-lottery/input.md +3 -0
  174. package/RAF/015-name-lottery/outcomes/001-auto-pick-project-name.md +31 -0
  175. package/RAF/015-name-lottery/outcomes/002-mention-plan-files-in-commit.md +23 -0
  176. package/RAF/015-name-lottery/outcomes/003-fix-input-md-in-amend-flow.md +44 -0
  177. package/RAF/015-name-lottery/plans/001-auto-pick-project-name.md +38 -0
  178. package/RAF/015-name-lottery/plans/002-mention-plan-files-in-commit.md +32 -0
  179. package/RAF/015-name-lottery/plans/003-fix-input-md-in-amend-flow.md +44 -0
  180. package/README.md +116 -0
  181. package/dist/commands/do.d.ts +12 -0
  182. package/dist/commands/do.d.ts.map +1 -0
  183. package/dist/commands/do.js +684 -0
  184. package/dist/commands/do.js.map +1 -0
  185. package/dist/commands/plan.d.ts +3 -0
  186. package/dist/commands/plan.d.ts.map +1 -0
  187. package/dist/commands/plan.js +345 -0
  188. package/dist/commands/plan.js.map +1 -0
  189. package/dist/commands/status.d.ts +3 -0
  190. package/dist/commands/status.d.ts.map +1 -0
  191. package/dist/commands/status.js +117 -0
  192. package/dist/commands/status.js.map +1 -0
  193. package/dist/core/claude-runner.d.ts +78 -0
  194. package/dist/core/claude-runner.d.ts.map +1 -0
  195. package/dist/core/claude-runner.js +297 -0
  196. package/dist/core/claude-runner.js.map +1 -0
  197. package/dist/core/editor.d.ts +10 -0
  198. package/dist/core/editor.d.ts.map +1 -0
  199. package/dist/core/editor.js +77 -0
  200. package/dist/core/editor.js.map +1 -0
  201. package/dist/core/failure-analyzer.d.ts +28 -0
  202. package/dist/core/failure-analyzer.d.ts.map +1 -0
  203. package/dist/core/failure-analyzer.js +305 -0
  204. package/dist/core/failure-analyzer.js.map +1 -0
  205. package/dist/core/git.d.ts +42 -0
  206. package/dist/core/git.d.ts.map +1 -0
  207. package/dist/core/git.js +148 -0
  208. package/dist/core/git.js.map +1 -0
  209. package/dist/core/project-manager.d.ts +72 -0
  210. package/dist/core/project-manager.d.ts.map +1 -0
  211. package/dist/core/project-manager.js +193 -0
  212. package/dist/core/project-manager.js.map +1 -0
  213. package/dist/core/retry-handler.d.ts +19 -0
  214. package/dist/core/retry-handler.d.ts.map +1 -0
  215. package/dist/core/retry-handler.js +51 -0
  216. package/dist/core/retry-handler.js.map +1 -0
  217. package/dist/core/shutdown-handler.d.ts +30 -0
  218. package/dist/core/shutdown-handler.d.ts.map +1 -0
  219. package/dist/core/shutdown-handler.js +79 -0
  220. package/dist/core/shutdown-handler.js.map +1 -0
  221. package/dist/core/state-derivation.d.ts +82 -0
  222. package/dist/core/state-derivation.d.ts.map +1 -0
  223. package/dist/core/state-derivation.js +271 -0
  224. package/dist/core/state-derivation.js.map +1 -0
  225. package/dist/core/state-manager.d.ts +54 -0
  226. package/dist/core/state-manager.d.ts.map +1 -0
  227. package/dist/core/state-manager.js +198 -0
  228. package/dist/core/state-manager.js.map +1 -0
  229. package/dist/index.d.ts +3 -0
  230. package/dist/index.d.ts.map +1 -0
  231. package/dist/index.js +16 -0
  232. package/dist/index.js.map +1 -0
  233. package/dist/parsers/output-parser.d.ts +19 -0
  234. package/dist/parsers/output-parser.d.ts.map +1 -0
  235. package/dist/parsers/output-parser.js +137 -0
  236. package/dist/parsers/output-parser.js.map +1 -0
  237. package/dist/prompts/amend.d.ts +20 -0
  238. package/dist/prompts/amend.d.ts.map +1 -0
  239. package/dist/prompts/amend.js +166 -0
  240. package/dist/prompts/amend.js.map +1 -0
  241. package/dist/prompts/execution.d.ts +30 -0
  242. package/dist/prompts/execution.d.ts.map +1 -0
  243. package/dist/prompts/execution.js +179 -0
  244. package/dist/prompts/execution.js.map +1 -0
  245. package/dist/prompts/planning.d.ts +15 -0
  246. package/dist/prompts/planning.d.ts.map +1 -0
  247. package/dist/prompts/planning.js +163 -0
  248. package/dist/prompts/planning.js.map +1 -0
  249. package/dist/types/config.d.ts +26 -0
  250. package/dist/types/config.d.ts.map +1 -0
  251. package/dist/types/config.js +7 -0
  252. package/dist/types/config.js.map +1 -0
  253. package/dist/types/state.d.ts +33 -0
  254. package/dist/types/state.d.ts.map +1 -0
  255. package/dist/types/state.js +28 -0
  256. package/dist/types/state.js.map +1 -0
  257. package/dist/ui/name-picker-subprocess.d.ts +11 -0
  258. package/dist/ui/name-picker-subprocess.d.ts.map +1 -0
  259. package/dist/ui/name-picker-subprocess.js +83 -0
  260. package/dist/ui/name-picker-subprocess.js.map +1 -0
  261. package/dist/ui/name-picker.d.ts +19 -0
  262. package/dist/ui/name-picker.d.ts.map +1 -0
  263. package/dist/ui/name-picker.js +173 -0
  264. package/dist/ui/name-picker.js.map +1 -0
  265. package/dist/ui/project-picker.d.ts +27 -0
  266. package/dist/ui/project-picker.d.ts.map +1 -0
  267. package/dist/ui/project-picker.js +58 -0
  268. package/dist/ui/project-picker.js.map +1 -0
  269. package/dist/utils/config.d.ts +24 -0
  270. package/dist/utils/config.d.ts.map +1 -0
  271. package/dist/utils/config.js +63 -0
  272. package/dist/utils/config.js.map +1 -0
  273. package/dist/utils/logger.d.ts +32 -0
  274. package/dist/utils/logger.d.ts.map +1 -0
  275. package/dist/utils/logger.js +60 -0
  276. package/dist/utils/logger.js.map +1 -0
  277. package/dist/utils/name-generator.d.ts +20 -0
  278. package/dist/utils/name-generator.d.ts.map +1 -0
  279. package/dist/utils/name-generator.js +183 -0
  280. package/dist/utils/name-generator.js.map +1 -0
  281. package/dist/utils/paths.d.ts +132 -0
  282. package/dist/utils/paths.d.ts.map +1 -0
  283. package/dist/utils/paths.js +412 -0
  284. package/dist/utils/paths.js.map +1 -0
  285. package/dist/utils/status-line.d.ts +14 -0
  286. package/dist/utils/status-line.d.ts.map +1 -0
  287. package/dist/utils/status-line.js +36 -0
  288. package/dist/utils/status-line.js.map +1 -0
  289. package/dist/utils/terminal-symbols.d.ts +50 -0
  290. package/dist/utils/terminal-symbols.d.ts.map +1 -0
  291. package/dist/utils/terminal-symbols.js +97 -0
  292. package/dist/utils/terminal-symbols.js.map +1 -0
  293. package/dist/utils/timer.d.ts +17 -0
  294. package/dist/utils/timer.d.ts.map +1 -0
  295. package/dist/utils/timer.js +56 -0
  296. package/dist/utils/timer.js.map +1 -0
  297. package/dist/utils/validation.d.ts +17 -0
  298. package/dist/utils/validation.d.ts.map +1 -0
  299. package/dist/utils/validation.js +106 -0
  300. package/dist/utils/validation.js.map +1 -0
  301. package/dist/utils/version.d.ts +2 -0
  302. package/dist/utils/version.d.ts.map +1 -0
  303. package/dist/utils/version.js +12 -0
  304. package/dist/utils/version.js.map +1 -0
  305. package/jest.config.ts +30 -0
  306. package/package.json +55 -0
  307. package/src/commands/do.ts +829 -0
  308. package/src/commands/plan.ts +422 -0
  309. package/src/commands/status.ts +146 -0
  310. package/src/core/claude-runner.ts +374 -0
  311. package/src/core/editor.ts +85 -0
  312. package/src/core/failure-analyzer.ts +372 -0
  313. package/src/core/git.ts +166 -0
  314. package/src/core/project-manager.ts +243 -0
  315. package/src/core/retry-handler.ts +72 -0
  316. package/src/core/shutdown-handler.ts +93 -0
  317. package/src/core/state-derivation.ts +343 -0
  318. package/src/index.ts +20 -0
  319. package/src/parsers/output-parser.ts +164 -0
  320. package/src/prompts/amend.ts +194 -0
  321. package/src/prompts/execution.ts +223 -0
  322. package/src/prompts/planning.ts +175 -0
  323. package/src/types/config.ts +35 -0
  324. package/src/ui/name-picker-subprocess.ts +96 -0
  325. package/src/ui/name-picker.ts +198 -0
  326. package/src/ui/project-picker.ts +80 -0
  327. package/src/utils/config.ts +69 -0
  328. package/src/utils/logger.ts +81 -0
  329. package/src/utils/name-generator.ts +211 -0
  330. package/src/utils/paths.ts +497 -0
  331. package/src/utils/status-line.ts +45 -0
  332. package/src/utils/terminal-symbols.ts +124 -0
  333. package/src/utils/timer.ts +64 -0
  334. package/src/utils/validation.ts +132 -0
  335. package/src/utils/version.ts +12 -0
  336. package/tests/unit/claude-runner-interactive.test.ts +343 -0
  337. package/tests/unit/claude-runner.test.ts +629 -0
  338. package/tests/unit/command-output.test.ts +295 -0
  339. package/tests/unit/config.test.ts +72 -0
  340. package/tests/unit/dependency-integration.test.ts +559 -0
  341. package/tests/unit/do-blocked-tasks.test.ts +323 -0
  342. package/tests/unit/do-command.test.ts +198 -0
  343. package/tests/unit/do-multiproject.test.ts +270 -0
  344. package/tests/unit/do-rerun.test.ts +270 -0
  345. package/tests/unit/execution-prompt.test.ts +406 -0
  346. package/tests/unit/failure-analyzer.test.ts +276 -0
  347. package/tests/unit/failure-history.test.ts +143 -0
  348. package/tests/unit/git-stash.test.ts +138 -0
  349. package/tests/unit/git.test.ts +80 -0
  350. package/tests/unit/logger.test.ts +132 -0
  351. package/tests/unit/name-generator.test.ts +283 -0
  352. package/tests/unit/name-picker.test.ts +179 -0
  353. package/tests/unit/outcome-content.test.ts +166 -0
  354. package/tests/unit/output-parser.test.ts +178 -0
  355. package/tests/unit/paths.test.ts +741 -0
  356. package/tests/unit/plan-command-amend-flag.test.ts +115 -0
  357. package/tests/unit/plan-command-amend-input.test.ts +156 -0
  358. package/tests/unit/plan-command-auto-flag.test.ts +112 -0
  359. package/tests/unit/plan-command.test.ts +580 -0
  360. package/tests/unit/planning-prompt.test.ts +137 -0
  361. package/tests/unit/project-manager.test.ts +265 -0
  362. package/tests/unit/project-picker.test.ts +338 -0
  363. package/tests/unit/retry-handler.test.ts +89 -0
  364. package/tests/unit/state-derivation.test.ts +714 -0
  365. package/tests/unit/status-command.test.ts +271 -0
  366. package/tests/unit/status-line.test.ts +92 -0
  367. package/tests/unit/terminal-symbols.test.ts +214 -0
  368. package/tests/unit/timer.test.ts +102 -0
  369. package/tests/unit/validation.test.ts +118 -0
  370. package/tsconfig.json +26 -0
@@ -0,0 +1,305 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { execSync } from 'node:child_process';
3
+ /**
4
+ * Patterns for detecting programmatic failure types.
5
+ */
6
+ const API_ERROR_PATTERNS = [
7
+ /api error/i,
8
+ /internal server error/i,
9
+ /service unavailable/i,
10
+ /bad gateway/i,
11
+ /500\s+(internal\s+)?server\s+error/i,
12
+ /502\s+bad\s+gateway/i,
13
+ /503\s+service\s+unavailable/i,
14
+ /504\s+gateway\s+timeout/i,
15
+ /APIError/i,
16
+ /API request failed/i,
17
+ ];
18
+ const RATE_LIMIT_PATTERNS = [
19
+ /rate limit/i,
20
+ /too many requests/i,
21
+ /429\s+too\s+many\s+requests/i,
22
+ /quota exceeded/i,
23
+ /request limit/i,
24
+ /throttl/i,
25
+ ];
26
+ const CONTEXT_OVERFLOW_PATTERNS = [
27
+ /context length exceeded/i,
28
+ /token limit/i,
29
+ /maximum context/i,
30
+ /context window/i,
31
+ /too many tokens/i,
32
+ /max.*tokens/i,
33
+ ];
34
+ /**
35
+ * Detect if the failure is a known programmatic failure type.
36
+ * Returns null if the failure type requires AI analysis.
37
+ */
38
+ export function detectProgrammaticFailure(output, failureReason) {
39
+ const combined = `${output}\n${failureReason}`;
40
+ // Check for context overflow
41
+ for (const pattern of CONTEXT_OVERFLOW_PATTERNS) {
42
+ if (pattern.test(combined)) {
43
+ return 'context_overflow';
44
+ }
45
+ }
46
+ // Check for rate limiting
47
+ for (const pattern of RATE_LIMIT_PATTERNS) {
48
+ if (pattern.test(combined)) {
49
+ return 'rate_limit';
50
+ }
51
+ }
52
+ // Check for API errors
53
+ for (const pattern of API_ERROR_PATTERNS) {
54
+ if (pattern.test(combined)) {
55
+ return 'api_error';
56
+ }
57
+ }
58
+ // Check for timeout (usually passed in failureReason)
59
+ if (/timeout|timed out/i.test(failureReason)) {
60
+ return 'timeout';
61
+ }
62
+ return null;
63
+ }
64
+ /**
65
+ * Generate a programmatic failure report for known failure types.
66
+ */
67
+ export function generateProgrammaticReport(failureType, _failureReason, output) {
68
+ const relevantOutput = extractRelevantOutput(output, 50);
69
+ switch (failureType) {
70
+ case 'api_error':
71
+ return `## Failure Reason
72
+ API error occurred during task execution.
73
+
74
+ ## Analysis
75
+ The Claude API returned an error response. This is typically a temporary issue with the API service.
76
+
77
+ ## Suggested Fix
78
+ - Wait a few minutes and retry the task
79
+ - Check the Anthropic status page for any ongoing incidents
80
+ - If the issue persists, try running with a smaller context
81
+
82
+ ## Relevant Output
83
+ \`\`\`
84
+ ${relevantOutput}
85
+ \`\`\`
86
+
87
+ <promise>FAILED</promise>`;
88
+ case 'rate_limit':
89
+ return `## Failure Reason
90
+ Rate limit exceeded during task execution.
91
+
92
+ ## Analysis
93
+ The API rate limit was reached. This typically happens when too many requests are made in a short period.
94
+
95
+ ## Suggested Fix
96
+ - Wait 1-2 minutes before retrying
97
+ - If using parallel execution, reduce concurrency
98
+ - Consider upgrading your API tier for higher limits
99
+
100
+ ## Relevant Output
101
+ \`\`\`
102
+ ${relevantOutput}
103
+ \`\`\`
104
+
105
+ <promise>FAILED</promise>`;
106
+ case 'timeout':
107
+ return `## Failure Reason
108
+ Task execution timed out.
109
+
110
+ ## Analysis
111
+ The task took longer than the configured timeout to complete. This could indicate:
112
+ - The task is too complex or large for a single execution
113
+ - Claude is stuck or making slow progress
114
+ - Network issues causing delays
115
+
116
+ ## Suggested Fix
117
+ - Increase the timeout with \`--timeout <minutes>\`
118
+ - Break the task into smaller subtasks
119
+ - Check the logs for what Claude was doing before timeout
120
+
121
+ ## Relevant Output
122
+ \`\`\`
123
+ ${relevantOutput}
124
+ \`\`\`
125
+
126
+ <promise>FAILED</promise>`;
127
+ case 'context_overflow':
128
+ return `## Failure Reason
129
+ Context window exceeded during task execution.
130
+
131
+ ## Analysis
132
+ The conversation context grew too large for Claude to process. This typically happens when:
133
+ - Too much code or output was included in the context
134
+ - The task involves very large files
135
+ - Multiple previous outcomes created a large context
136
+
137
+ ## Suggested Fix
138
+ - Break the task into smaller, independent subtasks
139
+ - Reduce the amount of context passed to Claude
140
+ - Consider processing files in chunks
141
+
142
+ ## Relevant Output
143
+ \`\`\`
144
+ ${relevantOutput}
145
+ \`\`\`
146
+
147
+ <promise>FAILED</promise>`;
148
+ }
149
+ }
150
+ /**
151
+ * Extract the most relevant portion of output for the failure report.
152
+ */
153
+ function extractRelevantOutput(output, maxLines) {
154
+ // Remove ANSI codes
155
+ const cleanOutput = output.replace(/\x1b\[[0-9;]*m/g, '');
156
+ // Split into lines
157
+ const lines = cleanOutput.split('\n');
158
+ // If output is small enough, return all of it
159
+ if (lines.length <= maxLines) {
160
+ return cleanOutput.trim();
161
+ }
162
+ // Otherwise, take the last N lines (most relevant for failures)
163
+ const lastLines = lines.slice(-maxLines);
164
+ return `...(truncated)\n${lastLines.join('\n').trim()}`;
165
+ }
166
+ /**
167
+ * Get the path to Claude CLI.
168
+ */
169
+ function getClaudePath() {
170
+ try {
171
+ return execSync('which claude', { encoding: 'utf-8' }).trim();
172
+ }
173
+ catch {
174
+ throw new Error('Claude CLI not found. Please ensure it is installed and in your PATH.');
175
+ }
176
+ }
177
+ /**
178
+ * Analyze a failure using Claude (Sonnet/Haiku) and generate a structured report.
179
+ * Uses a fast model for cost efficiency.
180
+ */
181
+ export async function analyzeFailure(output, failureReason, taskId, timeoutMs = 60000) {
182
+ // First check for programmatic failures
183
+ const programmaticType = detectProgrammaticFailure(output, failureReason);
184
+ if (programmaticType) {
185
+ return generateProgrammaticReport(programmaticType, failureReason, output);
186
+ }
187
+ // For other failures, use Claude to analyze
188
+ try {
189
+ const analysisResult = await callClaudeForAnalysis(output, failureReason, taskId, timeoutMs);
190
+ return analysisResult;
191
+ }
192
+ catch (error) {
193
+ // If analysis fails, generate a basic fallback report
194
+ const relevantOutput = extractRelevantOutput(output, 50);
195
+ return `## Failure Reason
196
+ ${failureReason}
197
+
198
+ ## Analysis
199
+ Unable to perform automated analysis: ${error instanceof Error ? error.message : String(error)}
200
+
201
+ ## Suggested Fix
202
+ Review the relevant output below and the task logs for more details.
203
+
204
+ ## Relevant Output
205
+ \`\`\`
206
+ ${relevantOutput}
207
+ \`\`\`
208
+
209
+ <promise>FAILED</promise>`;
210
+ }
211
+ }
212
+ /**
213
+ * Call Claude CLI to analyze the failure.
214
+ * Uses the print mode with a concise prompt.
215
+ */
216
+ async function callClaudeForAnalysis(output, failureReason, taskId, timeoutMs) {
217
+ const relevantOutput = extractRelevantOutput(output, 100);
218
+ const prompt = `Analyze this failed task execution and generate a brief failure report.
219
+
220
+ Task ID: ${taskId}
221
+ Initial Failure Reason: ${failureReason}
222
+
223
+ Execution Output (last 100 lines):
224
+ \`\`\`
225
+ ${relevantOutput}
226
+ \`\`\`
227
+
228
+ Respond with ONLY a markdown report in this exact format:
229
+
230
+ ## Failure Reason
231
+ [One-line description of what went wrong]
232
+
233
+ ## Analysis
234
+ [2-3 sentences explaining why the failure occurred]
235
+
236
+ ## Suggested Fix
237
+ [1-3 bullet points with actionable steps to resolve]
238
+
239
+ ## Relevant Output
240
+ \`\`\`
241
+ [Key error messages or output that shows the failure]
242
+ \`\`\`
243
+
244
+ <promise>FAILED</promise>`;
245
+ return new Promise((resolve, reject) => {
246
+ let analysisOutput = '';
247
+ let stderr = '';
248
+ const claudePath = getClaudePath();
249
+ // Use haiku model for fast, cost-effective analysis
250
+ const proc = spawn(claudePath, [
251
+ '--model', 'haiku',
252
+ '--dangerously-skip-permissions',
253
+ '-p',
254
+ prompt,
255
+ ], {
256
+ env: process.env,
257
+ stdio: ['ignore', 'pipe', 'pipe'],
258
+ });
259
+ const timeout = setTimeout(() => {
260
+ proc.kill('SIGTERM');
261
+ reject(new Error('Analysis timed out'));
262
+ }, timeoutMs);
263
+ proc.stdout.on('data', (data) => {
264
+ analysisOutput += data.toString();
265
+ });
266
+ proc.stderr.on('data', (data) => {
267
+ stderr += data.toString();
268
+ });
269
+ proc.on('close', (exitCode) => {
270
+ clearTimeout(timeout);
271
+ if (exitCode !== 0) {
272
+ reject(new Error(`Analysis failed with exit code ${exitCode}: ${stderr}`));
273
+ return;
274
+ }
275
+ // Validate the output has the expected structure
276
+ if (!analysisOutput.includes('## Failure Reason') ||
277
+ !analysisOutput.includes('<promise>FAILED</promise>')) {
278
+ // If the output doesn't have the expected structure, wrap it
279
+ const fixedOutput = `## Failure Reason
280
+ ${failureReason}
281
+
282
+ ## Analysis
283
+ ${analysisOutput.trim()}
284
+
285
+ ## Suggested Fix
286
+ Review the task logs for more details.
287
+
288
+ ## Relevant Output
289
+ \`\`\`
290
+ ${extractRelevantOutput(output, 30)}
291
+ \`\`\`
292
+
293
+ <promise>FAILED</promise>`;
294
+ resolve(fixedOutput);
295
+ return;
296
+ }
297
+ resolve(analysisOutput.trim());
298
+ });
299
+ proc.on('error', (error) => {
300
+ clearTimeout(timeout);
301
+ reject(error);
302
+ });
303
+ });
304
+ }
305
+ //# sourceMappingURL=failure-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure-analyzer.js","sourceRoot":"","sources":["../../src/core/failure-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAqB9C;;GAEG;AACH,MAAM,kBAAkB,GAAG;IACzB,YAAY;IACZ,wBAAwB;IACxB,sBAAsB;IACtB,cAAc;IACd,qCAAqC;IACrC,sBAAsB;IACtB,8BAA8B;IAC9B,0BAA0B;IAC1B,WAAW;IACX,qBAAqB;CACtB,CAAC;AAEF,MAAM,mBAAmB,GAAG;IAC1B,aAAa;IACb,oBAAoB;IACpB,8BAA8B;IAC9B,iBAAiB;IACjB,gBAAgB;IAChB,UAAU;CACX,CAAC;AAEF,MAAM,yBAAyB,GAAG;IAChC,0BAA0B;IAC1B,cAAc;IACd,kBAAkB;IAClB,iBAAiB;IACjB,kBAAkB;IAClB,cAAc;CACf,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAc,EACd,aAAqB;IAErB,MAAM,QAAQ,GAAG,GAAG,MAAM,KAAK,aAAa,EAAE,CAAC;IAE/C,6BAA6B;IAC7B,KAAK,MAAM,OAAO,IAAI,yBAAyB,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,OAAO,kBAAkB,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,IAAI,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,WAAoC,EACpC,cAAsB,EACtB,MAAc;IAEd,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEzD,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,WAAW;YACd,OAAO;;;;;;;;;;;;;EAaX,cAAc;;;0BAGU,CAAC;QAEvB,KAAK,YAAY;YACf,OAAO;;;;;;;;;;;;;EAaX,cAAc;;;0BAGU,CAAC;QAEvB,KAAK,SAAS;YACZ,OAAO;;;;;;;;;;;;;;;;EAgBX,cAAc;;;0BAGU,CAAC;QAEvB,KAAK,kBAAkB;YACrB,OAAO;;;;;;;;;;;;;;;;EAgBX,cAAc;;;0BAGU,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,MAAc,EAAE,QAAgB;IAC7D,oBAAoB;IACpB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAE1D,mBAAmB;IACnB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEtC,8CAA8C;IAC9C,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC7B,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,gEAAgE;IAChE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,mBAAmB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,aAAqB,EACrB,MAAc,EACd,YAAoB,KAAK;IAEzB,wCAAwC;IACxC,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1E,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,0BAA0B,CAAC,gBAAgB,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAC7E,CAAC;IAED,4CAA4C;IAC5C,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC7F,OAAO,cAAc,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sDAAsD;QACtD,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACzD,OAAO;EACT,aAAa;;;wCAGyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;;;;;;EAO5F,cAAc;;;0BAGU,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,qBAAqB,CAClC,MAAc,EACd,aAAqB,EACrB,MAAc,EACd,SAAiB;IAEjB,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAG;;WAEN,MAAM;0BACS,aAAa;;;;EAIrC,cAAc;;;;;;;;;;;;;;;;;;;0BAmBU,CAAC;IAEzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QAEnC,oDAAoD;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,EAAE;YAC7B,SAAS,EAAE,OAAO;YAClB,gCAAgC;YAChC,IAAI;YACJ,MAAM;SACP,EAAE;YACD,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrB,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC1C,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,cAAc,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC5B,YAAY,CAAC,OAAO,CAAC,CAAC;YAEtB,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,QAAQ,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC3E,OAAO;YACT,CAAC;YAED,iDAAiD;YACjD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBAC7C,CAAC,cAAc,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EAAE,CAAC;gBAC1D,6DAA6D;gBAC7D,MAAM,WAAW,GAAG;EAC1B,aAAa;;;EAGb,cAAc,CAAC,IAAI,EAAE;;;;;;;EAOrB,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC;;;0BAGT,CAAC;gBACnB,OAAO,CAAC,WAAW,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACzB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,42 @@
1
+ export interface GitStatus {
2
+ isRepo: boolean;
3
+ hasChanges: boolean;
4
+ branch: string | null;
5
+ }
6
+ /**
7
+ * Check if we're in a git repository.
8
+ */
9
+ export declare function isGitRepo(): boolean;
10
+ /**
11
+ * Get current git status.
12
+ */
13
+ export declare function getGitStatus(): GitStatus;
14
+ /**
15
+ * Check if there are uncommitted changes.
16
+ */
17
+ export declare function hasUncommittedChanges(): boolean;
18
+ /**
19
+ * Parse git status --porcelain output into a list of file paths.
20
+ * Format: XY filename (where X is index status, Y is working tree status)
21
+ * Examples:
22
+ * M file.txt - modified, staged
23
+ * MM file.txt - modified, staged, then modified again
24
+ * M file.txt - modified, not staged
25
+ * A file.txt - added
26
+ * D file.txt - deleted
27
+ * ?? file.txt - untracked
28
+ * R old -> new - renamed
29
+ */
30
+ export declare function parseGitStatus(output: string): string[];
31
+ /**
32
+ * Get list of currently changed files (both staged and unstaged).
33
+ * Returns empty array if not in a git repo.
34
+ */
35
+ export declare function getChangedFiles(): string[];
36
+ /**
37
+ * Stash uncommitted changes with a descriptive name.
38
+ * @param name - Name for the stash (e.g., "raf-001-task-3-failed")
39
+ * @returns true if stash was created, false otherwise
40
+ */
41
+ export declare function stashChanges(name: string): boolean;
42
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAOnC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CA6BxC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAO/C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAyCvD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAW1C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAqBlD"}
@@ -0,0 +1,148 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { logger } from '../utils/logger.js';
3
+ /**
4
+ * Check if we're in a git repository.
5
+ */
6
+ export function isGitRepo() {
7
+ try {
8
+ execSync('git rev-parse --is-inside-work-tree', { encoding: 'utf-8', stdio: 'pipe' });
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ /**
16
+ * Get current git status.
17
+ */
18
+ export function getGitStatus() {
19
+ const status = {
20
+ isRepo: false,
21
+ hasChanges: false,
22
+ branch: null,
23
+ };
24
+ try {
25
+ execSync('git rev-parse --is-inside-work-tree', { encoding: 'utf-8', stdio: 'pipe' });
26
+ status.isRepo = true;
27
+ }
28
+ catch {
29
+ return status;
30
+ }
31
+ try {
32
+ const branchOutput = execSync('git branch --show-current', { encoding: 'utf-8', stdio: 'pipe' });
33
+ status.branch = branchOutput.trim() || null;
34
+ }
35
+ catch {
36
+ // Might be in detached HEAD state
37
+ }
38
+ try {
39
+ const statusOutput = execSync('git status --porcelain', { encoding: 'utf-8', stdio: 'pipe' });
40
+ status.hasChanges = statusOutput.trim().length > 0;
41
+ }
42
+ catch {
43
+ // Ignore errors
44
+ }
45
+ return status;
46
+ }
47
+ /**
48
+ * Check if there are uncommitted changes.
49
+ */
50
+ export function hasUncommittedChanges() {
51
+ try {
52
+ const status = execSync('git status --porcelain', { encoding: 'utf-8', stdio: 'pipe' });
53
+ return status.trim().length > 0;
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ }
59
+ /**
60
+ * Parse git status --porcelain output into a list of file paths.
61
+ * Format: XY filename (where X is index status, Y is working tree status)
62
+ * Examples:
63
+ * M file.txt - modified, staged
64
+ * MM file.txt - modified, staged, then modified again
65
+ * M file.txt - modified, not staged
66
+ * A file.txt - added
67
+ * D file.txt - deleted
68
+ * ?? file.txt - untracked
69
+ * R old -> new - renamed
70
+ */
71
+ export function parseGitStatus(output) {
72
+ if (!output.trim()) {
73
+ return [];
74
+ }
75
+ const files = [];
76
+ // Don't trim the entire output - leading spaces are significant in git porcelain format
77
+ // Only split by newlines, then handle each line
78
+ const lines = output.split('\n');
79
+ for (const line of lines) {
80
+ if (!line || line.length < 3)
81
+ continue;
82
+ // The filename starts at position 3 (after XY and space)
83
+ let filePath = line.slice(3);
84
+ // Handle renamed files: "R old -> new" or "R old -> new"
85
+ if (line[0] === 'R' || line[1] === 'R') {
86
+ const arrowIndex = filePath.indexOf(' -> ');
87
+ if (arrowIndex !== -1) {
88
+ filePath = filePath.slice(arrowIndex + 4);
89
+ }
90
+ }
91
+ // Handle copied files similarly
92
+ if (line[0] === 'C' || line[1] === 'C') {
93
+ const arrowIndex = filePath.indexOf(' -> ');
94
+ if (arrowIndex !== -1) {
95
+ filePath = filePath.slice(arrowIndex + 4);
96
+ }
97
+ }
98
+ // Handle quoted paths (git escapes special characters)
99
+ if (filePath.startsWith('"') && filePath.endsWith('"')) {
100
+ filePath = filePath.slice(1, -1);
101
+ }
102
+ files.push(filePath);
103
+ }
104
+ return files;
105
+ }
106
+ /**
107
+ * Get list of currently changed files (both staged and unstaged).
108
+ * Returns empty array if not in a git repo.
109
+ */
110
+ export function getChangedFiles() {
111
+ if (!isGitRepo()) {
112
+ return [];
113
+ }
114
+ try {
115
+ const output = execSync('git status --porcelain', { encoding: 'utf-8', stdio: 'pipe' });
116
+ return parseGitStatus(output);
117
+ }
118
+ catch {
119
+ return [];
120
+ }
121
+ }
122
+ /**
123
+ * Stash uncommitted changes with a descriptive name.
124
+ * @param name - Name for the stash (e.g., "raf-001-task-3-failed")
125
+ * @returns true if stash was created, false otherwise
126
+ */
127
+ export function stashChanges(name) {
128
+ if (!isGitRepo()) {
129
+ logger.warn('Not in a git repository, skipping stash');
130
+ return false;
131
+ }
132
+ if (!hasUncommittedChanges()) {
133
+ logger.debug('No uncommitted changes to stash');
134
+ return false;
135
+ }
136
+ try {
137
+ execSync(`git stash push -m "${name.replace(/"/g, '\\"')}"`, {
138
+ encoding: 'utf-8',
139
+ stdio: 'pipe',
140
+ });
141
+ return true;
142
+ }
143
+ catch (error) {
144
+ logger.error(`Failed to stash changes: ${error}`);
145
+ return false;
146
+ }
147
+ }
148
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ export interface ProjectInfo {
2
+ number: number;
3
+ name: string;
4
+ path: string;
5
+ taskCount?: number;
6
+ completedCount?: number;
7
+ failedCount?: number;
8
+ }
9
+ export declare class ProjectManager {
10
+ private rafDir;
11
+ constructor();
12
+ /**
13
+ * Create a new project folder with initial structure.
14
+ * Returns the project path.
15
+ */
16
+ createProject(projectName: string): string;
17
+ /**
18
+ * Find an existing project by name.
19
+ */
20
+ findProject(projectName: string): string | null;
21
+ /**
22
+ * List all projects with derived state information.
23
+ */
24
+ listProjects(): ProjectInfo[];
25
+ /**
26
+ * Save user input to input.md.
27
+ */
28
+ saveInput(projectPath: string, content: string): void;
29
+ /**
30
+ * Read user input from input.md.
31
+ */
32
+ readInput(projectPath: string): string;
33
+ /**
34
+ * Save an outcome file for a completed task.
35
+ */
36
+ saveOutcome(projectPath: string, taskId: string, content: string): void;
37
+ /**
38
+ * Read all outcomes for context.
39
+ */
40
+ readOutcomes(projectPath: string): Array<{
41
+ taskId: string;
42
+ content: string;
43
+ }>;
44
+ /**
45
+ * Save a log file to the project's logs directory.
46
+ */
47
+ saveLog(projectPath: string, taskId: string, content: string): void;
48
+ /**
49
+ * Read a plan file.
50
+ */
51
+ readPlan(projectPath: string, planFile: string): string;
52
+ /**
53
+ * Get absolute path to a plan file.
54
+ */
55
+ getPlanPath(projectPath: string, planFile: string): string;
56
+ /**
57
+ * Ensure logs directory exists in project folder.
58
+ */
59
+ ensureLogsDir(projectPath: string): void;
60
+ /**
61
+ * Check if a project folder is empty (contains no plan files).
62
+ * Returns true if the folder has no plan files, false otherwise.
63
+ */
64
+ isProjectFolderEmpty(projectPath: string): boolean;
65
+ /**
66
+ * Clean up an empty project folder.
67
+ * Only removes the folder if it contains no plan files.
68
+ * This is idempotent - safe to call multiple times.
69
+ */
70
+ cleanupEmptyProject(projectPath: string): void;
71
+ }
72
+ //# sourceMappingURL=project-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-manager.d.ts","sourceRoot":"","sources":["../../src/core/project-manager.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;;IAMvB;;;OAGG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAqB1C;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI/C;;OAEG;IACH,YAAY,IAAI,WAAW,EAAE;IAyB7B;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAMrD;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAQtC;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAiBvE;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAoB7E;;OAEG;IACH,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAUnE;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAQvD;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI1D;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAOxC;;;OAGG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAiBlD;;;;OAIG;IACH,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;CAkB/C"}