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,295 @@
1
+ import { jest } from '@jest/globals';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import * as os from 'node:os';
5
+ import {
6
+ SYMBOLS,
7
+ formatTaskProgress,
8
+ formatProjectHeader,
9
+ formatSummary,
10
+ formatProgressBar,
11
+ TaskStatus,
12
+ } from '../../src/utils/terminal-symbols.js';
13
+ import { logger } from '../../src/utils/logger.js';
14
+
15
+ /**
16
+ * Integration tests verifying that do/status commands produce expected output format.
17
+ * These tests verify the integration between command output and terminal-symbols formatters.
18
+ */
19
+ describe('Command Output Integration', () => {
20
+ let consoleLogSpy: ReturnType<typeof jest.spyOn>;
21
+ let consoleWarnSpy: ReturnType<typeof jest.spyOn>;
22
+ let consoleErrorSpy: ReturnType<typeof jest.spyOn>;
23
+
24
+ beforeEach(() => {
25
+ consoleLogSpy = jest.spyOn(console, 'log').mockImplementation(() => {});
26
+ consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {});
27
+ consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
28
+ logger.configure({ verbose: false, debug: false });
29
+ });
30
+
31
+ afterEach(() => {
32
+ consoleLogSpy.mockRestore();
33
+ consoleWarnSpy.mockRestore();
34
+ consoleErrorSpy.mockRestore();
35
+ });
36
+
37
+ describe('Do Command Output Format', () => {
38
+ describe('project header', () => {
39
+ it('should use formatProjectHeader for project display', () => {
40
+ const projectName = 'my-feature';
41
+ const taskCount = 3;
42
+ const expected = formatProjectHeader(projectName, taskCount);
43
+
44
+ logger.info(expected);
45
+
46
+ expect(consoleLogSpy).toHaveBeenCalledWith(`▶ ${projectName} (${taskCount} tasks)`);
47
+ });
48
+
49
+ it('should show singular "task" for single task project', () => {
50
+ const output = formatProjectHeader('single-task-project', 1);
51
+ logger.info(output);
52
+
53
+ expect(consoleLogSpy).toHaveBeenCalledWith('▶ single-task-project (1 task)');
54
+ });
55
+ });
56
+
57
+ describe('task progress output', () => {
58
+ it('should show running task with elapsed time during execution', () => {
59
+ const output = formatTaskProgress(1, 3, 'running', 'auth-login', 45000);
60
+ logger.info(output);
61
+
62
+ expect(consoleLogSpy).toHaveBeenCalledWith('● auth-login 45s');
63
+ });
64
+
65
+ it('should show completed task with elapsed time', () => {
66
+ const output = formatTaskProgress(2, 3, 'completed', 'setup-db', 123000);
67
+ logger.info(output);
68
+
69
+ expect(consoleLogSpy).toHaveBeenCalledWith('✓ setup-db 2m 3s');
70
+ });
71
+
72
+ it('should show failed task with elapsed time', () => {
73
+ const output = formatTaskProgress(3, 3, 'failed', 'deploy', 300000);
74
+ logger.info(output);
75
+
76
+ expect(consoleLogSpy).toHaveBeenCalledWith('✗ deploy 5m 0s');
77
+ });
78
+
79
+ it('should show pending task with fraction', () => {
80
+ const output = formatTaskProgress(2, 5, 'pending', 'cleanup');
81
+ logger.info(output);
82
+
83
+ expect(consoleLogSpy).toHaveBeenCalledWith('○ cleanup 2/5');
84
+ });
85
+ });
86
+
87
+ describe('summary output', () => {
88
+ it('should show success summary with elapsed time when all tasks complete', () => {
89
+ const output = formatSummary(5, 0, 0, 754000);
90
+ logger.info(output);
91
+
92
+ expect(consoleLogSpy).toHaveBeenCalledWith('✓ 5/5 completed in 12m 34s');
93
+ });
94
+
95
+ it('should show success summary without time when time not provided', () => {
96
+ const output = formatSummary(5, 0, 0);
97
+ logger.info(output);
98
+
99
+ expect(consoleLogSpy).toHaveBeenCalledWith('✓ 5/5 completed');
100
+ });
101
+
102
+ it('should show failure summary with failed count', () => {
103
+ const output = formatSummary(3, 2, 0);
104
+ logger.info(output);
105
+
106
+ expect(consoleLogSpy).toHaveBeenCalledWith('✗ 3/5 (2 failed)');
107
+ });
108
+
109
+ it('should show single failure grammar', () => {
110
+ const output = formatSummary(4, 1, 0);
111
+ logger.info(output);
112
+
113
+ expect(consoleLogSpy).toHaveBeenCalledWith('✗ 4/5 (1 failed)');
114
+ });
115
+
116
+ it('should show pending as success (not completed yet)', () => {
117
+ const output = formatSummary(3, 0, 2);
118
+ logger.info(output);
119
+
120
+ expect(consoleLogSpy).toHaveBeenCalledWith('✓ 3/5 completed');
121
+ });
122
+
123
+ it('should show no tasks message for empty project', () => {
124
+ const output = formatSummary(0, 0, 0);
125
+ logger.info(output);
126
+
127
+ expect(consoleLogSpy).toHaveBeenCalledWith('○ no tasks');
128
+ });
129
+ });
130
+
131
+ describe('multi-project summary', () => {
132
+ it('should show success symbol for completed project', () => {
133
+ const symbol = SYMBOLS.completed;
134
+ const projectName = 'feature-a';
135
+ logger.info(`${symbol} ${projectName}`);
136
+
137
+ expect(consoleLogSpy).toHaveBeenCalledWith('✓ feature-a');
138
+ });
139
+
140
+ it('should show failure symbol for failed project', () => {
141
+ const symbol = SYMBOLS.failed;
142
+ const projectName = 'feature-b';
143
+ logger.info(`${symbol} ${projectName}`);
144
+
145
+ expect(consoleLogSpy).toHaveBeenCalledWith('✗ feature-b');
146
+ });
147
+ });
148
+ });
149
+
150
+ describe('Status Command Output Format', () => {
151
+ describe('project status display', () => {
152
+ it('should use project symbol for project name', () => {
153
+ const projectName = 'my-project';
154
+ logger.info(`${SYMBOLS.project} ${projectName}`);
155
+
156
+ expect(consoleLogSpy).toHaveBeenCalledWith('▶ my-project');
157
+ });
158
+
159
+ it('should show progress bar with count', () => {
160
+ const tasks: TaskStatus[] = ['completed', 'completed', 'pending', 'pending', 'pending'];
161
+ const progressBar = formatProgressBar(tasks);
162
+ const counts = '(2/5)';
163
+
164
+ logger.info(`${progressBar} ${counts}`);
165
+
166
+ expect(consoleLogSpy).toHaveBeenCalledWith('✓✓○○○ (2/5)');
167
+ });
168
+ });
169
+
170
+ describe('progress bar formats', () => {
171
+ it('should show all completed tasks', () => {
172
+ const tasks: TaskStatus[] = ['completed', 'completed', 'completed'];
173
+ const output = formatProgressBar(tasks);
174
+ logger.info(output);
175
+
176
+ expect(consoleLogSpy).toHaveBeenCalledWith('✓✓✓');
177
+ });
178
+
179
+ it('should show mixed task states', () => {
180
+ const tasks: TaskStatus[] = ['completed', 'failed', 'running', 'pending'];
181
+ const output = formatProgressBar(tasks);
182
+ logger.info(output);
183
+
184
+ expect(consoleLogSpy).toHaveBeenCalledWith('✓✗●○');
185
+ });
186
+
187
+ it('should show all pending tasks', () => {
188
+ const tasks: TaskStatus[] = ['pending', 'pending', 'pending'];
189
+ const output = formatProgressBar(tasks);
190
+ logger.info(output);
191
+
192
+ expect(consoleLogSpy).toHaveBeenCalledWith('○○○');
193
+ });
194
+
195
+ it('should handle single running task', () => {
196
+ const tasks: TaskStatus[] = ['running'];
197
+ const output = formatProgressBar(tasks);
198
+ logger.info(output);
199
+
200
+ expect(consoleLogSpy).toHaveBeenCalledWith('●');
201
+ });
202
+ });
203
+
204
+ describe('project list display', () => {
205
+ it('should format project list with progress bars', () => {
206
+ // Simulates: "001 my-project ✓✓●○○ (2/5)"
207
+ const projectNumber = '001';
208
+ const projectName = 'my-project';
209
+ const tasks: TaskStatus[] = ['completed', 'completed', 'running', 'pending', 'pending'];
210
+ const progressBar = formatProgressBar(tasks);
211
+ const counts = '(2/5)';
212
+
213
+ const output = `${projectNumber} ${projectName} ${progressBar} ${counts}`;
214
+ logger.info(output);
215
+
216
+ expect(consoleLogSpy).toHaveBeenCalledWith('001 my-project ✓✓●○○ (2/5)');
217
+ });
218
+
219
+ it('should format completed project in list', () => {
220
+ const projectNumber = '002';
221
+ const projectName = 'done-project';
222
+ const tasks: TaskStatus[] = ['completed', 'completed', 'completed'];
223
+ const progressBar = formatProgressBar(tasks);
224
+ const counts = '(3/3)';
225
+
226
+ const output = `${projectNumber} ${projectName} ${progressBar} ${counts}`;
227
+ logger.info(output);
228
+
229
+ expect(consoleLogSpy).toHaveBeenCalledWith('002 done-project ✓✓✓ (3/3)');
230
+ });
231
+
232
+ it('should format project with failures in list', () => {
233
+ const projectNumber = '003';
234
+ const projectName = 'has-failures';
235
+ const tasks: TaskStatus[] = ['completed', 'failed', 'pending'];
236
+ const progressBar = formatProgressBar(tasks);
237
+ const counts = '(1/3)';
238
+
239
+ const output = `${projectNumber} ${projectName} ${progressBar} ${counts}`;
240
+ logger.info(output);
241
+
242
+ expect(consoleLogSpy).toHaveBeenCalledWith('003 has-failures ✓✗○ (1/3)');
243
+ });
244
+ });
245
+ });
246
+
247
+ describe('Symbol Consistency', () => {
248
+ it('should use consistent symbols across all output', () => {
249
+ // Verify all symbols are correctly defined
250
+ expect(SYMBOLS.running).toBe('●');
251
+ expect(SYMBOLS.completed).toBe('✓');
252
+ expect(SYMBOLS.failed).toBe('✗');
253
+ expect(SYMBOLS.pending).toBe('○');
254
+ expect(SYMBOLS.project).toBe('▶');
255
+ });
256
+
257
+ it('should use same symbols in logger success/error', () => {
258
+ logger.success('Task done');
259
+ logger.error('Task failed');
260
+
261
+ expect(consoleLogSpy).toHaveBeenCalledWith('✓ Task done');
262
+ expect(consoleErrorSpy).toHaveBeenCalledWith('✗ Task failed');
263
+ });
264
+ });
265
+
266
+ describe('Edge Cases in Output', () => {
267
+ it('should handle empty project name gracefully', () => {
268
+ const output = formatProjectHeader('', 5);
269
+ expect(output).toBe('▶ project (5 tasks)');
270
+ });
271
+
272
+ it('should handle zero tasks in header', () => {
273
+ const output = formatProjectHeader('empty-project', 0);
274
+ expect(output).toBe('▶ empty-project (0 tasks)');
275
+ });
276
+
277
+ it('should handle very long task name with truncation', () => {
278
+ const longName = 'this-is-a-very-long-task-name-that-should-be-truncated-for-display';
279
+ const output = formatTaskProgress(1, 1, 'running', longName, 1000);
280
+
281
+ expect(output).toContain('…');
282
+ expect(output.length).toBeLessThan(60);
283
+ });
284
+
285
+ it('should handle empty progress bar', () => {
286
+ const output = formatProgressBar([]);
287
+ expect(output).toBe('');
288
+ });
289
+
290
+ it('should handle zero elapsed time', () => {
291
+ const output = formatTaskProgress(1, 1, 'running', 'test', 0);
292
+ expect(output).toBe('● test 0s');
293
+ });
294
+ });
295
+ });
@@ -0,0 +1,72 @@
1
+ import { jest } from '@jest/globals';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import * as os from 'node:os';
5
+ import { getClaudeModel, getClaudeSettingsPath } from '../../src/utils/config.js';
6
+
7
+ describe('Config', () => {
8
+ describe('getClaudeSettingsPath', () => {
9
+ it('should return path in home directory', () => {
10
+ const settingsPath = getClaudeSettingsPath();
11
+ expect(settingsPath).toBe(path.join(os.homedir(), '.claude', 'settings.json'));
12
+ });
13
+ });
14
+
15
+ describe('getClaudeModel', () => {
16
+ let tempDir: string;
17
+
18
+ beforeEach(() => {
19
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'raf-config-test-'));
20
+ });
21
+
22
+ afterEach(() => {
23
+ fs.rmSync(tempDir, { recursive: true, force: true });
24
+ });
25
+
26
+ it('should return model name from Claude settings', () => {
27
+ const settingsPath = path.join(tempDir, 'settings.json');
28
+ fs.writeFileSync(settingsPath, JSON.stringify({ model: 'opus' }));
29
+
30
+ const result = getClaudeModel(settingsPath);
31
+ expect(result).toBe('opus');
32
+ });
33
+
34
+ it('should return full model name if specified', () => {
35
+ const settingsPath = path.join(tempDir, 'settings.json');
36
+ fs.writeFileSync(settingsPath, JSON.stringify({ model: 'claude-sonnet-4-20250514' }));
37
+
38
+ const result = getClaudeModel(settingsPath);
39
+ expect(result).toBe('claude-sonnet-4-20250514');
40
+ });
41
+
42
+ it('should return null if settings file does not exist', () => {
43
+ const settingsPath = path.join(tempDir, 'nonexistent.json');
44
+
45
+ const result = getClaudeModel(settingsPath);
46
+ expect(result).toBeNull();
47
+ });
48
+
49
+ it('should return null if model is not specified in settings', () => {
50
+ const settingsPath = path.join(tempDir, 'settings.json');
51
+ fs.writeFileSync(settingsPath, JSON.stringify({ permissions: {} }));
52
+
53
+ const result = getClaudeModel(settingsPath);
54
+ expect(result).toBeNull();
55
+ });
56
+
57
+ it('should return null if settings file is invalid JSON', () => {
58
+ const settingsPath = path.join(tempDir, 'settings.json');
59
+ fs.writeFileSync(settingsPath, 'invalid json');
60
+
61
+ const result = getClaudeModel(settingsPath);
62
+ expect(result).toBeNull();
63
+ });
64
+
65
+ it('should use default settings path when not provided', () => {
66
+ // This tests the default path behavior - the actual file may or may not exist
67
+ const result = getClaudeModel();
68
+ // Just verify it doesn't throw and returns string or null
69
+ expect(result === null || typeof result === 'string').toBe(true);
70
+ });
71
+ });
72
+ });