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,297 @@
1
+ import * as pty from 'node-pty';
2
+ import { execSync, spawn } from 'node:child_process';
3
+ import { logger } from '../utils/logger.js';
4
+ function getClaudePath() {
5
+ try {
6
+ return execSync('which claude', { encoding: 'utf-8' }).trim();
7
+ }
8
+ catch {
9
+ throw new Error('Claude CLI not found. Please ensure it is installed and in your PATH.');
10
+ }
11
+ }
12
+ const CONTEXT_OVERFLOW_PATTERNS = [
13
+ /context length exceeded/i,
14
+ /token limit/i,
15
+ /maximum context/i,
16
+ /context window/i,
17
+ ];
18
+ export class ClaudeRunner {
19
+ activeProcess = null;
20
+ killed = false;
21
+ model;
22
+ constructor(config = {}) {
23
+ this.model = config.model ?? 'opus';
24
+ }
25
+ /**
26
+ * Run Claude interactively with stdin/stdout passthrough.
27
+ * Used for planning phase where user interaction is needed.
28
+ *
29
+ * @param systemPrompt - Instructions appended to Claude's system prompt via --append-system-prompt
30
+ * @param userMessage - User message passed as positional argument to trigger Claude to start
31
+ * @param options - Runner options (cwd, dangerouslySkipPermissions)
32
+ */
33
+ async runInteractive(systemPrompt, userMessage, options = {}) {
34
+ const { cwd = process.cwd(), dangerouslySkipPermissions = false } = options;
35
+ return new Promise((resolve) => {
36
+ const args = ['--model', this.model];
37
+ // Add --dangerously-skip-permissions if requested (for --auto mode)
38
+ if (dangerouslySkipPermissions) {
39
+ args.push('--dangerously-skip-permissions');
40
+ }
41
+ // System instructions via --append-system-prompt
42
+ args.push('--append-system-prompt', systemPrompt);
43
+ // User message as positional argument - Claude starts immediately
44
+ args.push(userMessage);
45
+ logger.debug(`Starting interactive Claude session with model: ${this.model}`);
46
+ this.activeProcess = pty.spawn(getClaudePath(), args, {
47
+ name: 'xterm-256color',
48
+ cols: process.stdout.columns ?? 80,
49
+ rows: process.stdout.rows ?? 24,
50
+ cwd,
51
+ env: process.env,
52
+ });
53
+ // Set raw mode to pass through all input
54
+ if (process.stdin.isTTY) {
55
+ process.stdin.setRawMode(true);
56
+ }
57
+ process.stdin.resume();
58
+ // Pipe input to Claude
59
+ const onData = (data) => {
60
+ if (this.activeProcess && !this.killed) {
61
+ this.activeProcess.write(data.toString());
62
+ }
63
+ };
64
+ process.stdin.on('data', onData);
65
+ // Pipe output to stdout
66
+ this.activeProcess.onData((data) => {
67
+ process.stdout.write(data);
68
+ });
69
+ this.activeProcess.onExit(({ exitCode }) => {
70
+ // Cleanup
71
+ process.stdin.off('data', onData);
72
+ if (process.stdin.isTTY) {
73
+ process.stdin.setRawMode(false);
74
+ }
75
+ process.stdin.pause();
76
+ this.activeProcess = null;
77
+ if (this.killed) {
78
+ resolve(130); // SIGINT exit code
79
+ }
80
+ else {
81
+ resolve(exitCode);
82
+ }
83
+ });
84
+ });
85
+ }
86
+ /**
87
+ * Run Claude non-interactively and collect output.
88
+ * Used for execution phase where we parse the results.
89
+ * Uses child_process.spawn with -p flag for prompt (like ralphy).
90
+ *
91
+ * TIMEOUT BEHAVIOR:
92
+ * - The timeout is applied per individual call to this method
93
+ * - Each call gets a fresh timeout - elapsed time is NOT shared between calls
94
+ * - When used with retries (in do.ts), each retry attempt gets its own fresh timeout
95
+ * - Timeout includes all time Claude is running, including context building
96
+ * - Default timeout is 60 minutes if not specified
97
+ */
98
+ async run(prompt, options = {}) {
99
+ const { timeout = 60, cwd = process.cwd() } = options;
100
+ // Ensure timeout is a positive number, fallback to 60 minutes
101
+ const validatedTimeout = Number(timeout) > 0 ? Number(timeout) : 60;
102
+ const timeoutMs = validatedTimeout * 60 * 1000;
103
+ return new Promise((resolve) => {
104
+ let output = '';
105
+ let stderr = '';
106
+ let timedOut = false;
107
+ let contextOverflow = false;
108
+ const claudePath = getClaudePath();
109
+ logger.debug(`Starting Claude execution session with model: ${this.model}`);
110
+ logger.debug(`Claude path: ${claudePath}`);
111
+ // Use --append-system-prompt to add RAF instructions to system prompt
112
+ // This gives RAF instructions stronger precedence than passing as user message
113
+ // --dangerously-skip-permissions bypasses interactive prompts
114
+ // -p enables print mode (non-interactive)
115
+ const proc = spawn(claudePath, [
116
+ '--dangerously-skip-permissions',
117
+ '--model',
118
+ this.model,
119
+ '--append-system-prompt',
120
+ prompt,
121
+ '-p',
122
+ 'Execute the task as described in the system prompt.',
123
+ ], {
124
+ cwd,
125
+ env: process.env,
126
+ stdio: ['ignore', 'pipe', 'pipe'], // no stdin needed
127
+ });
128
+ // Track this process
129
+ this.activeProcess = proc;
130
+ // Set up timeout
131
+ const timeoutHandle = setTimeout(() => {
132
+ timedOut = true;
133
+ logger.warn('Claude session timed out');
134
+ proc.kill('SIGTERM');
135
+ }, timeoutMs);
136
+ // Collect stdout
137
+ proc.stdout.on('data', (data) => {
138
+ const text = data.toString();
139
+ output += text;
140
+ // Check for context overflow
141
+ for (const pattern of CONTEXT_OVERFLOW_PATTERNS) {
142
+ if (pattern.test(text)) {
143
+ contextOverflow = true;
144
+ logger.warn('Context overflow detected');
145
+ proc.kill('SIGTERM');
146
+ break;
147
+ }
148
+ }
149
+ });
150
+ // Collect stderr
151
+ proc.stderr.on('data', (data) => {
152
+ stderr += data.toString();
153
+ });
154
+ proc.on('close', (exitCode) => {
155
+ clearTimeout(timeoutHandle);
156
+ this.activeProcess = null;
157
+ if (stderr) {
158
+ logger.debug(`Claude stderr: ${stderr}`);
159
+ }
160
+ resolve({
161
+ output,
162
+ exitCode: exitCode ?? (this.killed ? 130 : 1),
163
+ timedOut,
164
+ contextOverflow,
165
+ });
166
+ });
167
+ });
168
+ }
169
+ /**
170
+ * Run Claude non-interactively with verbose output to stdout.
171
+ * Uses child_process.spawn with -p flag for prompt (like ralphy).
172
+ *
173
+ * TIMEOUT BEHAVIOR:
174
+ * - The timeout is applied per individual call to this method
175
+ * - Each call gets a fresh timeout - elapsed time is NOT shared between calls
176
+ * - When used with retries (in do.ts), each retry attempt gets its own fresh timeout
177
+ * - Timeout includes all time Claude is running, including context building
178
+ * - Default timeout is 60 minutes if not specified
179
+ */
180
+ async runVerbose(prompt, options = {}) {
181
+ const { timeout = 60, cwd = process.cwd() } = options;
182
+ // Ensure timeout is a positive number, fallback to 60 minutes
183
+ const validatedTimeout = Number(timeout) > 0 ? Number(timeout) : 60;
184
+ const timeoutMs = validatedTimeout * 60 * 1000;
185
+ return new Promise((resolve) => {
186
+ let output = '';
187
+ let stderr = '';
188
+ let timedOut = false;
189
+ let contextOverflow = false;
190
+ const claudePath = getClaudePath();
191
+ logger.debug(`Starting Claude execution session (verbose) with model: ${this.model}`);
192
+ logger.debug(`Prompt length: ${prompt.length}, timeout: ${timeoutMs}ms, cwd: ${cwd}`);
193
+ logger.debug(`Claude path: ${claudePath}`);
194
+ logger.debug('Spawning process...');
195
+ // Use --append-system-prompt to add RAF instructions to system prompt
196
+ // This gives RAF instructions stronger precedence than passing as user message
197
+ // --dangerously-skip-permissions bypasses interactive prompts
198
+ // -p enables print mode (non-interactive)
199
+ const proc = spawn(claudePath, [
200
+ '--dangerously-skip-permissions',
201
+ '--model',
202
+ this.model,
203
+ '--append-system-prompt',
204
+ prompt,
205
+ '-p',
206
+ 'Execute the task as described in the system prompt.',
207
+ ], {
208
+ cwd,
209
+ env: process.env,
210
+ stdio: ['ignore', 'pipe', 'pipe'], // no stdin needed
211
+ });
212
+ // Track this process
213
+ this.activeProcess = proc;
214
+ logger.debug('Process spawned');
215
+ // Set up timeout
216
+ const timeoutHandle = setTimeout(() => {
217
+ timedOut = true;
218
+ logger.warn('Claude session timed out');
219
+ proc.kill('SIGTERM');
220
+ }, timeoutMs);
221
+ // Collect and display stdout
222
+ let dataReceived = false;
223
+ proc.stdout.on('data', (data) => {
224
+ if (!dataReceived) {
225
+ logger.debug('First data chunk received');
226
+ dataReceived = true;
227
+ }
228
+ const text = data.toString();
229
+ output += text;
230
+ process.stdout.write(text);
231
+ // Check for context overflow
232
+ for (const pattern of CONTEXT_OVERFLOW_PATTERNS) {
233
+ if (pattern.test(text)) {
234
+ contextOverflow = true;
235
+ logger.warn('Context overflow detected');
236
+ proc.kill('SIGTERM');
237
+ break;
238
+ }
239
+ }
240
+ });
241
+ // Collect stderr
242
+ proc.stderr.on('data', (data) => {
243
+ stderr += data.toString();
244
+ });
245
+ proc.on('close', (exitCode) => {
246
+ clearTimeout(timeoutHandle);
247
+ this.activeProcess = null;
248
+ logger.debug(`Claude exited with code ${exitCode}, output length: ${output.length}, timedOut: ${timedOut}, contextOverflow: ${contextOverflow}`);
249
+ if (stderr) {
250
+ logger.debug(`Claude stderr: ${stderr}`);
251
+ }
252
+ resolve({
253
+ output,
254
+ exitCode: exitCode ?? (this.killed ? 130 : 1),
255
+ timedOut,
256
+ contextOverflow,
257
+ });
258
+ });
259
+ });
260
+ }
261
+ /**
262
+ * Kill the active Claude process gracefully.
263
+ */
264
+ kill() {
265
+ if (this.activeProcess) {
266
+ this.killed = true;
267
+ // Send Ctrl+C first for graceful shutdown (only for PTY processes)
268
+ // ChildProcess from spawn() doesn't have write(), only PTY does
269
+ try {
270
+ if (typeof this.activeProcess.write === 'function') {
271
+ this.activeProcess.write('\x03');
272
+ }
273
+ }
274
+ catch {
275
+ // Ignore write errors - process may already be closing
276
+ }
277
+ // Force kill after 5 seconds if still running
278
+ setTimeout(() => {
279
+ if (this.activeProcess) {
280
+ try {
281
+ this.activeProcess.kill();
282
+ }
283
+ catch {
284
+ // Ignore kill errors - process may already be dead
285
+ }
286
+ }
287
+ }, 5000);
288
+ }
289
+ }
290
+ /**
291
+ * Check if a process is currently running.
292
+ */
293
+ isRunning() {
294
+ return this.activeProcess !== null;
295
+ }
296
+ }
297
+ //# sourceMappingURL=claude-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-runner.js","sourceRoot":"","sources":["../../src/core/claude-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Open the user's preferred editor and return the content they wrote.
3
+ */
4
+ export declare function openEditor(initialContent?: string): Promise<string>;
5
+ /**
6
+ * Returns initial content for the project description editor.
7
+ * Opens with an empty file for a clean user experience.
8
+ */
9
+ export declare function getInputTemplate(): string;
10
+ //# sourceMappingURL=editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/core/editor.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,wBAAsB,UAAU,CAAC,cAAc,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA+C7E;AAaD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
@@ -0,0 +1,77 @@
1
+ import { spawn } from 'node:child_process';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import * as os from 'node:os';
5
+ import { getEditor } from '../utils/config.js';
6
+ import { logger } from '../utils/logger.js';
7
+ /**
8
+ * Escape a file path for shell usage.
9
+ */
10
+ function escapeShellPath(filePath) {
11
+ // Use single quotes and escape any existing single quotes
12
+ return `'${filePath.replace(/'/g, "'\\''")}'`;
13
+ }
14
+ /**
15
+ * Open the user's preferred editor and return the content they wrote.
16
+ */
17
+ export async function openEditor(initialContent = '') {
18
+ const editor = getEditor();
19
+ const tempDir = os.tmpdir();
20
+ const tempFile = path.join(tempDir, `raf-input-${Date.now()}.md`);
21
+ // Write initial content if any
22
+ fs.writeFileSync(tempFile, initialContent);
23
+ // Build shell command with properly escaped file path
24
+ // This handles editors like "code --wait" or "vim" uniformly
25
+ const shellCommand = `${editor} ${escapeShellPath(tempFile)}`;
26
+ logger.debug(`Opening editor: ${shellCommand}`);
27
+ return new Promise((resolve, reject) => {
28
+ // Use shell: true with the full command as a single string
29
+ // This correctly handles editors with arguments (e.g., "code --wait")
30
+ const editorProcess = spawn(shellCommand, [], {
31
+ stdio: 'inherit',
32
+ shell: true,
33
+ });
34
+ editorProcess.on('error', (error) => {
35
+ cleanupTempFile(tempFile);
36
+ reject(new Error(`Failed to open editor: ${error.message}`));
37
+ });
38
+ editorProcess.on('exit', (code) => {
39
+ // Read the file content regardless of exit code
40
+ // Many editors (vim included) may exit with non-zero for various benign reasons
41
+ try {
42
+ const content = fs.readFileSync(tempFile, 'utf-8');
43
+ cleanupTempFile(tempFile);
44
+ // Only treat as error if file is empty/unchanged AND exit code is non-zero
45
+ // This distinguishes between "user cancelled" and "editor failed"
46
+ if (code !== 0 && content === initialContent) {
47
+ reject(new Error(`Editor exited with code ${code}`));
48
+ return;
49
+ }
50
+ resolve(content);
51
+ }
52
+ catch (error) {
53
+ cleanupTempFile(tempFile);
54
+ reject(new Error(`Failed to read editor content: ${error}`));
55
+ }
56
+ });
57
+ });
58
+ }
59
+ /**
60
+ * Safely remove temp file, ignoring errors if file doesn't exist.
61
+ */
62
+ function cleanupTempFile(filePath) {
63
+ try {
64
+ fs.unlinkSync(filePath);
65
+ }
66
+ catch {
67
+ // Ignore errors - file may already be deleted
68
+ }
69
+ }
70
+ /**
71
+ * Returns initial content for the project description editor.
72
+ * Opens with an empty file for a clean user experience.
73
+ */
74
+ export function getInputTemplate() {
75
+ return '';
76
+ }
77
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/core/editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;GAEG;AACH,SAAS,eAAe,CAAC,QAAgB;IACvC,0DAA0D;IAC1D,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,iBAAyB,EAAE;IAC1D,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAElE,+BAA+B;IAC/B,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAE3C,sDAAsD;IACtD,6DAA6D;IAC7D,MAAM,YAAY,GAAG,GAAG,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC9D,MAAM,CAAC,KAAK,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;IAEhD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,2DAA2D;QAC3D,sEAAsE;QACtE,MAAM,aAAa,GAAG,KAAK,CAAC,YAAY,EAAE,EAAE,EAAE;YAC5C,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAClC,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAChC,gDAAgD;YAChD,gFAAgF;YAChF,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACnD,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAE1B,2EAA2E;gBAC3E,kEAAkE;gBAClE,IAAI,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;oBAC7C,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,CAAC;oBACrD,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,QAAgB;IACvC,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Failure types that can be detected programmatically without using the API.
3
+ */
4
+ export type ProgrammaticFailureType = 'api_error' | 'rate_limit' | 'timeout' | 'context_overflow';
5
+ /**
6
+ * Result of analyzing task failure.
7
+ */
8
+ export interface FailureAnalysisResult {
9
+ failureReason: string;
10
+ analysis: string;
11
+ suggestedFix: string;
12
+ relevantOutput: string;
13
+ }
14
+ /**
15
+ * Detect if the failure is a known programmatic failure type.
16
+ * Returns null if the failure type requires AI analysis.
17
+ */
18
+ export declare function detectProgrammaticFailure(output: string, failureReason: string): ProgrammaticFailureType | null;
19
+ /**
20
+ * Generate a programmatic failure report for known failure types.
21
+ */
22
+ export declare function generateProgrammaticReport(failureType: ProgrammaticFailureType, _failureReason: string, output: string): string;
23
+ /**
24
+ * Analyze a failure using Claude (Sonnet/Haiku) and generate a structured report.
25
+ * Uses a fast model for cost efficiency.
26
+ */
27
+ export declare function analyzeFailure(output: string, failureReason: string, taskId: string, timeoutMs?: number): Promise<string>;
28
+ //# sourceMappingURL=failure-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure-analyzer.d.ts","sourceRoot":"","sources":["../../src/core/failure-analyzer.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAC/B,WAAW,GACX,YAAY,GACZ,SAAS,GACT,kBAAkB,CAAC;AAEvB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAoCD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACpB,uBAAuB,GAAG,IAAI,CA8BhC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,uBAAuB,EACpC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,GACb,MAAM,CAsFR;AAiCD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,MAAc,GACxB,OAAO,CAAC,MAAM,CAAC,CA8BjB"}