@herbcaudill/ralph 0.8.5 → 1.0.1

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 (302) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +26 -5
  3. package/dist/cli.js.map +1 -1
  4. package/dist/components/App.d.ts +6 -1
  5. package/dist/components/App.d.ts.map +1 -1
  6. package/dist/components/App.js +7 -3
  7. package/dist/components/App.js.map +1 -1
  8. package/dist/components/EnhancedTextInput.d.ts +8 -8
  9. package/dist/components/EnhancedTextInput.d.ts.map +1 -1
  10. package/dist/components/EnhancedTextInput.js +2 -36
  11. package/dist/components/EnhancedTextInput.js.map +1 -1
  12. package/dist/components/EnhancedTextInput.test.js +2 -10
  13. package/dist/components/EnhancedTextInput.test.js.map +1 -1
  14. package/dist/components/EventDisplay.d.ts +1 -1
  15. package/dist/components/EventDisplay.d.ts.map +1 -1
  16. package/dist/components/EventDisplay.js +3 -94
  17. package/dist/components/EventDisplay.js.map +1 -1
  18. package/dist/components/EventDisplay.replay.test.js +34 -68
  19. package/dist/components/EventDisplay.replay.test.js.map +1 -1
  20. package/dist/components/EventDisplay.test.js +30 -0
  21. package/dist/components/EventDisplay.test.js.map +1 -1
  22. package/dist/components/FullScreenLayout.d.ts +5 -4
  23. package/dist/components/FullScreenLayout.d.ts.map +1 -1
  24. package/dist/components/FullScreenLayout.js +2 -12
  25. package/dist/components/FullScreenLayout.js.map +1 -1
  26. package/dist/components/Header.d.ts +2 -1
  27. package/dist/components/Header.d.ts.map +1 -1
  28. package/dist/components/Header.js +8 -1
  29. package/dist/components/Header.js.map +1 -1
  30. package/dist/components/InitRalph.d.ts +6 -1
  31. package/dist/components/InitRalph.d.ts.map +1 -1
  32. package/dist/components/InitRalph.js +71 -89
  33. package/dist/components/InitRalph.js.map +1 -1
  34. package/dist/components/IterationRunner.d.ts +6 -13
  35. package/dist/components/IterationRunner.d.ts.map +1 -1
  36. package/dist/components/IterationRunner.js +84 -168
  37. package/dist/components/IterationRunner.js.map +1 -1
  38. package/dist/components/IterationRunner.test.d.ts +44 -0
  39. package/dist/components/IterationRunner.test.d.ts.map +1 -1
  40. package/dist/components/IterationRunner.test.js +66 -126
  41. package/dist/components/IterationRunner.test.js.map +1 -1
  42. package/dist/components/IterationRunner.types.d.ts +30 -0
  43. package/dist/components/IterationRunner.types.d.ts.map +1 -0
  44. package/dist/components/IterationRunner.types.js +2 -0
  45. package/dist/components/IterationRunner.types.js.map +1 -0
  46. package/dist/components/JsonOutput.d.ts +5 -6
  47. package/dist/components/JsonOutput.d.ts.map +1 -1
  48. package/dist/components/JsonOutput.js +57 -34
  49. package/dist/components/JsonOutput.js.map +1 -1
  50. package/dist/components/JsonOutput.test.d.ts +2 -0
  51. package/dist/components/JsonOutput.test.d.ts.map +1 -0
  52. package/dist/components/JsonOutput.test.js +39 -0
  53. package/dist/components/JsonOutput.test.js.map +1 -0
  54. package/dist/components/ReplayLog.d.ts +1 -1
  55. package/dist/components/ReplayLog.d.ts.map +1 -1
  56. package/dist/components/ReplayLog.js +9 -2
  57. package/dist/components/ReplayLog.js.map +1 -1
  58. package/dist/components/StreamingText.d.ts +4 -0
  59. package/dist/components/StreamingText.d.ts.map +1 -1
  60. package/dist/components/StreamingText.js +4 -3
  61. package/dist/components/StreamingText.js.map +1 -1
  62. package/dist/components/StreamingText.test.js +39 -0
  63. package/dist/components/StreamingText.test.js.map +1 -1
  64. package/dist/components/ToolUse.d.ts +8 -0
  65. package/dist/components/ToolUse.d.ts.map +1 -1
  66. package/dist/components/ToolUse.js +1 -0
  67. package/dist/components/ToolUse.js.map +1 -1
  68. package/dist/components/blocksToLines.d.ts +6 -0
  69. package/dist/components/blocksToLines.d.ts.map +1 -0
  70. package/dist/components/blocksToLines.js +15 -0
  71. package/dist/components/blocksToLines.js.map +1 -0
  72. package/dist/components/eventToBlocks.d.ts +7 -1
  73. package/dist/components/eventToBlocks.d.ts.map +1 -1
  74. package/dist/components/eventToBlocks.js +7 -1
  75. package/dist/components/eventToBlocks.js.map +1 -1
  76. package/dist/components/findNextWordBoundary.d.ts +10 -0
  77. package/dist/components/findNextWordBoundary.d.ts.map +1 -0
  78. package/dist/components/findNextWordBoundary.js +23 -0
  79. package/dist/components/findNextWordBoundary.js.map +1 -0
  80. package/dist/components/findPreviousWordBoundary.d.ts +10 -0
  81. package/dist/components/findPreviousWordBoundary.d.ts.map +1 -0
  82. package/dist/components/findPreviousWordBoundary.js +23 -0
  83. package/dist/components/findPreviousWordBoundary.js.map +1 -0
  84. package/dist/components/processEvents.d.ts +11 -0
  85. package/dist/components/processEvents.d.ts.map +1 -0
  86. package/dist/components/processEvents.js +87 -0
  87. package/dist/components/processEvents.js.map +1 -0
  88. package/dist/components/renderStaticItem.d.ts +7 -0
  89. package/dist/components/renderStaticItem.d.ts.map +1 -0
  90. package/dist/components/renderStaticItem.js +23 -0
  91. package/dist/components/renderStaticItem.js.map +1 -0
  92. package/dist/components/replay.d.ts +5 -0
  93. package/dist/components/replay.d.ts.map +1 -0
  94. package/dist/components/replay.js +49 -0
  95. package/dist/components/replay.js.map +1 -0
  96. package/dist/components/test-helpers/ControlledInput.d.ts +14 -0
  97. package/dist/components/test-helpers/ControlledInput.d.ts.map +1 -0
  98. package/dist/components/test-helpers/ControlledInput.js +15 -0
  99. package/dist/components/test-helpers/ControlledInput.js.map +1 -0
  100. package/dist/components/useContentHeight.d.ts +9 -0
  101. package/dist/components/useContentHeight.d.ts.map +1 -0
  102. package/dist/components/useContentHeight.js +16 -0
  103. package/dist/components/useContentHeight.js.map +1 -0
  104. package/dist/index.d.ts +1 -0
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +2 -1
  107. package/dist/index.js.map +1 -1
  108. package/dist/lib/MessageQueue.d.ts +18 -5
  109. package/dist/lib/MessageQueue.d.ts.map +1 -1
  110. package/dist/lib/MessageQueue.js +21 -14
  111. package/dist/lib/MessageQueue.js.map +1 -1
  112. package/dist/lib/StdinCommandHandler.d.ts +26 -20
  113. package/dist/lib/StdinCommandHandler.js +78 -85
  114. package/dist/lib/StdinCommandHandler.test.d.ts +2 -2
  115. package/dist/lib/StdinCommandHandler.test.js +92 -92
  116. package/dist/lib/WorktreeManager.d.ts +114 -0
  117. package/dist/lib/WorktreeManager.d.ts.map +1 -0
  118. package/dist/lib/WorktreeManager.js +350 -0
  119. package/dist/lib/WorktreeManager.js.map +1 -0
  120. package/dist/lib/WorktreeManager.test.d.ts +2 -0
  121. package/dist/lib/WorktreeManager.test.d.ts.map +1 -0
  122. package/dist/lib/WorktreeManager.test.js +261 -0
  123. package/dist/lib/WorktreeManager.test.js.map +1 -0
  124. package/dist/lib/addTodo.d.ts +5 -5
  125. package/dist/lib/addTodo.d.ts.map +1 -1
  126. package/dist/lib/addTodo.js +6 -20
  127. package/dist/lib/addTodo.js.map +1 -1
  128. package/dist/lib/beadsClient.d.ts +6 -12
  129. package/dist/lib/beadsClient.d.ts.map +1 -1
  130. package/dist/lib/beadsClient.js +3 -2
  131. package/dist/lib/beadsClient.js.map +1 -1
  132. package/dist/lib/captureBeadsSnapshot.d.ts +4 -0
  133. package/dist/lib/captureBeadsSnapshot.d.ts.map +1 -0
  134. package/dist/lib/captureBeadsSnapshot.js +24 -0
  135. package/dist/lib/captureBeadsSnapshot.js.map +1 -0
  136. package/dist/lib/captureStartupSnapshot.d.ts +10 -0
  137. package/dist/lib/captureStartupSnapshot.d.ts.map +1 -0
  138. package/dist/lib/captureStartupSnapshot.js +29 -0
  139. package/dist/lib/captureStartupSnapshot.js.map +1 -0
  140. package/dist/lib/captureTodoSnapshot.d.ts +4 -0
  141. package/dist/lib/captureTodoSnapshot.d.ts.map +1 -0
  142. package/dist/lib/captureTodoSnapshot.js +24 -0
  143. package/dist/lib/captureTodoSnapshot.js.map +1 -0
  144. package/dist/lib/copyTemplates.d.ts +22 -0
  145. package/dist/lib/copyTemplates.d.ts.map +1 -0
  146. package/dist/lib/copyTemplates.js +32 -0
  147. package/dist/lib/copyTemplates.js.map +1 -0
  148. package/dist/lib/createStdinCommandHandler.d.ts +28 -0
  149. package/dist/lib/createStdinCommandHandler.d.ts.map +1 -0
  150. package/dist/lib/createStdinCommandHandler.js +67 -0
  151. package/dist/lib/createStdinCommandHandler.js.map +1 -0
  152. package/dist/lib/createUserMessage.d.ts +6 -0
  153. package/dist/lib/createUserMessage.d.ts.map +1 -0
  154. package/dist/lib/createUserMessage.js +13 -0
  155. package/dist/lib/createUserMessage.js.map +1 -0
  156. package/dist/lib/debug.d.ts +17 -16
  157. package/dist/lib/debug.d.ts.map +1 -1
  158. package/dist/lib/debug.js +25 -15
  159. package/dist/lib/debug.js.map +1 -1
  160. package/dist/lib/findMaxLogNumber.d.ts +6 -0
  161. package/dist/lib/findMaxLogNumber.d.ts.map +1 -0
  162. package/dist/lib/findMaxLogNumber.js +26 -0
  163. package/dist/lib/findMaxLogNumber.js.map +1 -0
  164. package/dist/lib/findMaxLogNumber.test.d.ts +2 -0
  165. package/dist/lib/findMaxLogNumber.test.d.ts.map +1 -0
  166. package/dist/lib/findMaxLogNumber.test.js +39 -0
  167. package/dist/lib/findMaxLogNumber.test.js.map +1 -0
  168. package/dist/lib/formatContentBlock.d.ts +4 -8
  169. package/dist/lib/formatContentBlock.d.ts.map +1 -1
  170. package/dist/lib/formatContentBlock.js +7 -58
  171. package/dist/lib/formatContentBlock.js.map +1 -1
  172. package/dist/lib/formatIterationHeader.d.ts +5 -0
  173. package/dist/lib/formatIterationHeader.d.ts.map +1 -0
  174. package/dist/lib/formatIterationHeader.js +8 -0
  175. package/dist/lib/formatIterationHeader.js.map +1 -0
  176. package/dist/lib/formatText.d.ts +5 -0
  177. package/dist/lib/formatText.d.ts.map +1 -0
  178. package/dist/lib/formatText.js +33 -0
  179. package/dist/lib/formatText.js.map +1 -0
  180. package/dist/lib/formatToolUse.d.ts +7 -0
  181. package/dist/lib/formatToolUse.d.ts.map +1 -0
  182. package/dist/lib/formatToolUse.js +14 -0
  183. package/dist/lib/formatToolUse.js.map +1 -0
  184. package/dist/lib/formatUserMessage.d.ts +5 -0
  185. package/dist/lib/formatUserMessage.d.ts.map +1 -0
  186. package/dist/lib/formatUserMessage.js +8 -0
  187. package/dist/lib/formatUserMessage.js.map +1 -0
  188. package/dist/lib/getBaseCwd.d.ts +6 -0
  189. package/dist/lib/getBaseCwd.d.ts.map +1 -0
  190. package/dist/lib/getBaseCwd.js +6 -0
  191. package/dist/lib/getBaseCwd.js.map +1 -0
  192. package/dist/lib/getBeadsProgress.d.ts +8 -0
  193. package/dist/lib/getBeadsProgress.d.ts.map +1 -0
  194. package/dist/lib/getBeadsProgress.js +35 -0
  195. package/dist/lib/getBeadsProgress.js.map +1 -0
  196. package/dist/lib/getClaudeVersion.d.ts +4 -0
  197. package/dist/lib/getClaudeVersion.d.ts.map +1 -1
  198. package/dist/lib/getClaudeVersion.js +4 -0
  199. package/dist/lib/getClaudeVersion.js.map +1 -1
  200. package/dist/lib/getDefaultIterations.d.ts +6 -0
  201. package/dist/lib/getDefaultIterations.d.ts.map +1 -0
  202. package/dist/lib/getDefaultIterations.js +14 -0
  203. package/dist/lib/getDefaultIterations.js.map +1 -0
  204. package/dist/lib/getDefaultIterations.test.d.ts +2 -0
  205. package/dist/lib/getDefaultIterations.test.d.ts.map +1 -0
  206. package/dist/lib/getDefaultIterations.test.js +39 -0
  207. package/dist/lib/getDefaultIterations.test.js.map +1 -0
  208. package/dist/lib/getLatestLogFile.d.ts +6 -0
  209. package/dist/lib/getLatestLogFile.d.ts.map +1 -0
  210. package/dist/lib/getLatestLogFile.js +15 -0
  211. package/dist/lib/getLatestLogFile.js.map +1 -0
  212. package/dist/lib/getNextLogFile.d.ts +0 -5
  213. package/dist/lib/getNextLogFile.d.ts.map +1 -1
  214. package/dist/lib/getNextLogFile.js +2 -36
  215. package/dist/lib/getNextLogFile.js.map +1 -1
  216. package/dist/lib/getNextLogFile.test.js +2 -1
  217. package/dist/lib/getNextLogFile.test.js.map +1 -1
  218. package/dist/lib/getOpenIssueCount.d.ts +0 -5
  219. package/dist/lib/getOpenIssueCount.d.ts.map +1 -1
  220. package/dist/lib/getOpenIssueCount.js +0 -12
  221. package/dist/lib/getOpenIssueCount.js.map +1 -1
  222. package/dist/lib/getOpenIssueCount.test.js +1 -35
  223. package/dist/lib/getOpenIssueCount.test.js.map +1 -1
  224. package/dist/lib/getProgress.d.ts +6 -26
  225. package/dist/lib/getProgress.d.ts.map +1 -1
  226. package/dist/lib/getProgress.js +8 -109
  227. package/dist/lib/getProgress.js.map +1 -1
  228. package/dist/lib/getProgress.test.js +2 -1
  229. package/dist/lib/getProgress.test.js.map +1 -1
  230. package/dist/lib/getPromptContent.d.ts +8 -0
  231. package/dist/lib/getPromptContent.d.ts.map +1 -0
  232. package/dist/lib/getPromptContent.js +31 -0
  233. package/dist/lib/getPromptContent.js.map +1 -0
  234. package/dist/lib/getTerminalSize.d.ts +8 -0
  235. package/dist/lib/getTerminalSize.d.ts.map +1 -0
  236. package/dist/lib/getTerminalSize.js +10 -0
  237. package/dist/lib/getTerminalSize.js.map +1 -0
  238. package/dist/lib/getTodoProgress.d.ts +4 -0
  239. package/dist/lib/getTodoProgress.d.ts.map +1 -0
  240. package/dist/lib/getTodoProgress.js +22 -0
  241. package/dist/lib/getTodoProgress.js.map +1 -0
  242. package/dist/lib/insertTodo.d.ts +7 -0
  243. package/dist/lib/insertTodo.d.ts.map +1 -0
  244. package/dist/lib/insertTodo.js +22 -0
  245. package/dist/lib/insertTodo.js.map +1 -0
  246. package/dist/lib/outputEvent.d.ts +5 -0
  247. package/dist/lib/outputEvent.d.ts.map +1 -0
  248. package/dist/lib/outputEvent.js +7 -0
  249. package/dist/lib/outputEvent.js.map +1 -0
  250. package/dist/lib/parseStdinCommand.d.ts +25 -0
  251. package/dist/lib/parseStdinCommand.d.ts.map +1 -0
  252. package/dist/lib/parseStdinCommand.js +43 -0
  253. package/dist/lib/parseStdinCommand.js.map +1 -0
  254. package/dist/lib/parseStdinCommand.test.d.ts +2 -0
  255. package/dist/lib/parseStdinCommand.test.d.ts.map +1 -0
  256. package/dist/lib/parseStdinCommand.test.js +93 -0
  257. package/dist/lib/parseStdinCommand.test.js.map +1 -0
  258. package/dist/lib/parseTaskLifecycle.d.ts +18 -0
  259. package/dist/lib/parseTaskLifecycle.d.ts.map +1 -0
  260. package/dist/lib/parseTaskLifecycle.js +30 -0
  261. package/dist/lib/parseTaskLifecycle.js.map +1 -0
  262. package/dist/lib/parseTaskLifecycle.test.d.ts +2 -0
  263. package/dist/lib/parseTaskLifecycle.test.d.ts.map +1 -0
  264. package/dist/lib/parseTaskLifecycle.test.js +122 -0
  265. package/dist/lib/parseTaskLifecycle.test.js.map +1 -0
  266. package/dist/lib/parseWorktreeFromBranch.d.ts +13 -0
  267. package/dist/lib/parseWorktreeFromBranch.d.ts.map +1 -0
  268. package/dist/lib/parseWorktreeFromBranch.js +19 -0
  269. package/dist/lib/parseWorktreeFromBranch.js.map +1 -0
  270. package/dist/lib/processEvents.d.ts +12 -0
  271. package/dist/lib/processEvents.d.ts.map +1 -0
  272. package/dist/lib/processEvents.js +113 -0
  273. package/dist/lib/processEvents.js.map +1 -0
  274. package/dist/lib/rel.d.ts +7 -1
  275. package/dist/lib/rel.d.ts.map +1 -1
  276. package/dist/lib/rel.js +13 -4
  277. package/dist/lib/rel.js.map +1 -1
  278. package/dist/lib/rel.test.js +16 -1
  279. package/dist/lib/rel.test.js.map +1 -1
  280. package/dist/lib/sdkMessageToEvent.d.ts +6 -0
  281. package/dist/lib/sdkMessageToEvent.d.ts.map +1 -0
  282. package/dist/lib/sdkMessageToEvent.js +12 -0
  283. package/dist/lib/sdkMessageToEvent.js.map +1 -0
  284. package/dist/lib/shortenTempPaths.d.ts +7 -1
  285. package/dist/lib/shortenTempPaths.d.ts.map +1 -1
  286. package/dist/lib/shortenTempPaths.js +7 -2
  287. package/dist/lib/shortenTempPaths.js.map +1 -1
  288. package/dist/lib/types.d.ts +19 -0
  289. package/dist/lib/types.d.ts.map +1 -0
  290. package/dist/lib/types.js +2 -0
  291. package/dist/lib/types.js.map +1 -0
  292. package/dist/lib/useTerminalSize.d.ts +3 -2
  293. package/dist/lib/useTerminalSize.d.ts.map +1 -1
  294. package/dist/lib/useTerminalSize.js +4 -6
  295. package/dist/lib/useTerminalSize.js.map +1 -1
  296. package/package.json +4 -3
  297. package/templates/core-prompt.md +77 -0
  298. package/templates/skills/manage-tasks/SKILL.md +113 -0
  299. package/templates/workflow.md +46 -0
  300. package/templates/prompt-beads.md +0 -44
  301. package/templates/prompt-todos.md +0 -17
  302. package/templates/todo.md +0 -9
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Parse instance name and ID from a worktree branch name.
3
+ *
4
+ * Expected format: {name}-{id}
5
+ * The last dash separates name from ID.
6
+ */
7
+ export declare function parseWorktreeFromBranch(
8
+ /** Branch name without the "ralph/" prefix */
9
+ branchParts: string): {
10
+ instanceName: string;
11
+ instanceId: string;
12
+ } | null;
13
+ //# sourceMappingURL=parseWorktreeFromBranch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseWorktreeFromBranch.d.ts","sourceRoot":"","sources":["../../src/lib/parseWorktreeFromBranch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,uBAAuB;AACrC,8CAA8C;AAC9C,WAAW,EAAE,MAAM,GAClB;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASrD"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Parse instance name and ID from a worktree branch name.
3
+ *
4
+ * Expected format: {name}-{id}
5
+ * The last dash separates name from ID.
6
+ */
7
+ export function parseWorktreeFromBranch(
8
+ /** Branch name without the "ralph/" prefix */
9
+ branchParts) {
10
+ // Parse {name}-{id} from branch name
11
+ const lastDash = branchParts.lastIndexOf("-");
12
+ if (lastDash > 0) {
13
+ const instanceName = branchParts.slice(0, lastDash);
14
+ const instanceId = branchParts.slice(lastDash + 1);
15
+ return { instanceName, instanceId };
16
+ }
17
+ return null;
18
+ }
19
+ //# sourceMappingURL=parseWorktreeFromBranch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseWorktreeFromBranch.js","sourceRoot":"","sources":["../../src/lib/parseWorktreeFromBranch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB;AACrC,8CAA8C;AAC9C,WAAmB;IAEnB,qCAAqC;IACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAC7C,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;QACnD,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;QAClD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAA;IACrC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type ContentBlock } from "../components/eventToBlocks.js";
2
+ /**
3
+ * Process raw events into content blocks.
4
+ *
5
+ * With includePartialMessages: true, we receive multiple snapshots of the same message
6
+ * as it builds up. Each snapshot may contain different parts of the message content,
7
+ * so we need to merge them and deduplicate.
8
+ */
9
+ export declare const processEvents: (
10
+ /** Array of raw event objects from the SDK */
11
+ events: Array<Record<string, unknown>>) => ContentBlock[];
12
+ //# sourceMappingURL=processEvents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processEvents.d.ts","sourceRoot":"","sources":["../../src/lib/processEvents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAEjF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;AACxB,8CAA8C;AAC9C,QAAQ,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KACrC,YAAY,EA6Gd,CAAA"}
@@ -0,0 +1,113 @@
1
+ import { eventToBlocks } from "../components/eventToBlocks.js";
2
+ /**
3
+ * Process raw events into content blocks.
4
+ *
5
+ * With includePartialMessages: true, we receive multiple snapshots of the same message
6
+ * as it builds up. Each snapshot may contain different parts of the message content,
7
+ * so we need to merge them and deduplicate.
8
+ */
9
+ export const processEvents = (
10
+ /** Array of raw event objects from the SDK */
11
+ events) => {
12
+ const blocks = [];
13
+ // First pass: collect all assistant message content and track message order
14
+ const assistantEvents = events.filter(event => event.type === "assistant");
15
+ // Collect all content blocks from all snapshots of the same message
16
+ const messageMap = new Map();
17
+ for (const event of assistantEvents) {
18
+ const message = event.message;
19
+ const messageId = message?.id;
20
+ const content = message?.content;
21
+ if (messageId && content) {
22
+ if (!messageMap.has(messageId)) {
23
+ messageMap.set(messageId, []);
24
+ }
25
+ messageMap.get(messageId).push(...content);
26
+ }
27
+ }
28
+ // Create merged events with deduplicated content
29
+ const mergedEvents = Array.from(messageMap.entries()).map(([messageId, allContent]) => {
30
+ // Deduplicate content blocks by their ID (for tool_use) or text (for text blocks)
31
+ const seenBlocks = new Set();
32
+ const uniqueContent = [];
33
+ for (const block of allContent) {
34
+ const blockType = block.type;
35
+ let blockKey;
36
+ if (blockType === "tool_use") {
37
+ // Tool use blocks are unique by their ID
38
+ blockKey = `tool:${block.id}`;
39
+ }
40
+ else if (blockType === "text") {
41
+ // For text blocks, check if this is a prefix of or prefixed by existing text
42
+ // This handles incremental text updates where each snapshot has more content
43
+ const text = block.text;
44
+ let isDuplicate = false;
45
+ for (const seenKey of seenBlocks) {
46
+ if (seenKey.startsWith("text:")) {
47
+ const seenText = seenKey.substring(5);
48
+ // If existing text starts with this text, or this text starts with existing,
49
+ // keep only the longer one
50
+ if (seenText.startsWith(text)) {
51
+ // Existing is longer, this is a duplicate
52
+ isDuplicate = true;
53
+ break;
54
+ }
55
+ else if (text.startsWith(seenText)) {
56
+ // This is longer, remove the old one and add this
57
+ seenBlocks.delete(seenKey);
58
+ // Also remove from uniqueContent
59
+ const idx = uniqueContent.findIndex(b => b.type === "text" && b.text === seenText);
60
+ if (idx >= 0)
61
+ uniqueContent.splice(idx, 1);
62
+ break;
63
+ }
64
+ }
65
+ }
66
+ if (isDuplicate)
67
+ continue;
68
+ blockKey = `text:${text}`;
69
+ }
70
+ else {
71
+ blockKey = JSON.stringify(block);
72
+ }
73
+ if (!seenBlocks.has(blockKey)) {
74
+ seenBlocks.add(blockKey);
75
+ uniqueContent.push(block);
76
+ }
77
+ }
78
+ return {
79
+ type: "assistant",
80
+ message: {
81
+ id: messageId,
82
+ content: uniqueContent,
83
+ },
84
+ };
85
+ });
86
+ const assistantBlocks = mergedEvents.flatMap(event => eventToBlocks(event));
87
+ // Second pass: process events in order, including user messages
88
+ // Track which user messages and assistant messages we've already seen
89
+ const processedUserIds = new Set();
90
+ const processedAssistantIds = new Set();
91
+ for (const event of events) {
92
+ if (event.type === "user") {
93
+ const message = event.message;
94
+ const messageId = message?.id ?? `user-${Date.now()}`;
95
+ if (!processedUserIds.has(messageId)) {
96
+ processedUserIds.add(messageId);
97
+ blocks.push(...eventToBlocks(event));
98
+ }
99
+ }
100
+ else if (event.type === "assistant") {
101
+ const message = event.message;
102
+ const messageId = message?.id;
103
+ if (messageId && !processedAssistantIds.has(messageId)) {
104
+ processedAssistantIds.add(messageId);
105
+ // Find the merged version of this message
106
+ const merged = assistantBlocks.filter(b => b.id.startsWith(messageId));
107
+ blocks.push(...merged);
108
+ }
109
+ }
110
+ }
111
+ return blocks;
112
+ };
113
+ //# sourceMappingURL=processEvents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processEvents.js","sourceRoot":"","sources":["../../src/lib/processEvents.ts"],"names":[],"mappings":"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"}
package/dist/lib/rel.d.ts CHANGED
@@ -1,2 +1,8 @@
1
- export declare const rel: (path: string) => string;
1
+ /**
2
+ * Convert an absolute path to a relative path from the base working directory.
3
+ * For temp files, returns just the filename. Leaves relative paths unchanged.
4
+ */
5
+ export declare const rel: (
6
+ /** The path to convert */
7
+ path: string) => string;
2
8
  //# sourceMappingURL=rel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rel.d.ts","sourceRoot":"","sources":["../../src/lib/rel.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,GAAG,GAAI,MAAM,MAAM,WAM/B,CAAA"}
1
+ {"version":3,"file":"rel.d.ts","sourceRoot":"","sources":["../../src/lib/rel.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,eAAO,MAAM,GAAG;AACd,0BAA0B;AAC1B,MAAM,MAAM,WAUb,CAAA"}
package/dist/lib/rel.js CHANGED
@@ -1,10 +1,19 @@
1
- import { relative } from "path";
2
- const cwd = process.cwd();
3
- export const rel = (path) => {
1
+ import { isAbsolute, relative } from "path";
2
+ import { getBaseCwd } from "./getBaseCwd.js";
3
+ /**
4
+ * Convert an absolute path to a relative path from the base working directory.
5
+ * For temp files, returns just the filename. Leaves relative paths unchanged.
6
+ */
7
+ export const rel = (
8
+ /** The path to convert */
9
+ path) => {
10
+ if (!isAbsolute(path)) {
11
+ return path;
12
+ }
4
13
  // For temp files, just show the filename
5
14
  if (path.includes("/var/folders/") || path.includes("/tmp/")) {
6
15
  return path.split("/").pop() || path;
7
16
  }
8
- return relative(cwd, path) || path;
17
+ return relative(getBaseCwd(), path) || path;
9
18
  };
10
19
  //# sourceMappingURL=rel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rel.js","sourceRoot":"","sources":["../../src/lib/rel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAE/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;AAEzB,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE;IAClC,yCAAyC;IACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAA;IACtC,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,CAAA;AACpC,CAAC,CAAA"}
1
+ {"version":3,"file":"rel.js","sourceRoot":"","sources":["../../src/lib/rel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C;;;GAGG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG;AACjB,0BAA0B;AAC1B,IAAY,EACZ,EAAE;IACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,yCAAyC;IACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAA;IACtC,CAAC;IACD,OAAO,QAAQ,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,CAAA;AAC7C,CAAC,CAAA"}
@@ -1,5 +1,14 @@
1
- import { describe, it, expect } from "vitest";
1
+ import { describe, it, expect, afterEach } from "vitest";
2
2
  import { rel } from "./rel.js";
3
+ const originalCwd = process.env.RALPH_CWD;
4
+ afterEach(() => {
5
+ if (originalCwd === undefined) {
6
+ delete process.env.RALPH_CWD;
7
+ }
8
+ else {
9
+ process.env.RALPH_CWD = originalCwd;
10
+ }
11
+ });
3
12
  describe("rel", () => {
4
13
  it("converts absolute path to relative path", () => {
5
14
  const absolutePath = `${process.cwd()}/src/lib/rel.ts`;
@@ -21,6 +30,12 @@ describe("rel", () => {
21
30
  const result = rel(relativePath);
22
31
  expect(result).toBe(relativePath);
23
32
  });
33
+ it("uses RALPH_CWD when set", () => {
34
+ process.env.RALPH_CWD = "/Users/example/ralph";
35
+ const absolutePath = "/Users/example/ralph/src/lib/rel.ts";
36
+ const result = rel(absolutePath);
37
+ expect(result).toBe("src/lib/rel.ts");
38
+ });
24
39
  it("handles path outside current directory", () => {
25
40
  const outsidePath = "/completely/different/path/file.ts";
26
41
  const result = rel(outsidePath);
@@ -1 +1 @@
1
- {"version":3,"file":"rel.test.js","sourceRoot":"","sources":["../../src/lib/rel.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAE9B,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;IACnB,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,YAAY,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAA;QACtD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,QAAQ,GAAG,wCAAwC,CAAA;QACzD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG,0BAA0B,CAAA;QAC1C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAA;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,YAAY,GAAG,gBAAgB,CAAA;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,WAAW,GAAG,oCAAoC,CAAA;QACxD,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,CAAA;QAC/B,6DAA6D;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,QAAQ,GAAG,GAAG,CAAA;QACpB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAA;IAC7B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"rel.test.js","sourceRoot":"","sources":["../../src/lib/rel.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACxD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAE9B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAA;AAEzC,SAAS,CAAC,GAAG,EAAE;IACb,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAA;IAC9B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,WAAW,CAAA;IACrC,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;IACnB,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,YAAY,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAA;QACtD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,QAAQ,GAAG,wCAAwC,CAAA;QACzD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG,0BAA0B,CAAA;QAC1C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAA;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,YAAY,GAAG,gBAAgB,CAAA;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,sBAAsB,CAAA;QAC9C,MAAM,YAAY,GAAG,qCAAqC,CAAA;QAC1D,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,WAAW,GAAG,oCAAoC,CAAA;QACxD,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,CAAA;QAC/B,6DAA6D;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,QAAQ,GAAG,GAAG,CAAA;QACpB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAA;IAC7B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { type SDKMessage } from "@anthropic-ai/claude-agent-sdk";
2
+ /** Convert SDK message to event format for display. */
3
+ export declare const sdkMessageToEvent: (
4
+ /** The SDK message to convert */
5
+ message: SDKMessage) => Record<string, unknown> | null;
6
+ //# sourceMappingURL=sdkMessageToEvent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkMessageToEvent.d.ts","sourceRoot":"","sources":["../../src/lib/sdkMessageToEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAEhE,wDAAwD;AACxD,eAAO,MAAM,iBAAiB;AAC5B,iCAAiC;AACjC,SAAS,UAAU,KAClB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAO5B,CAAA"}
@@ -0,0 +1,12 @@
1
+ /** Convert SDK message to event format for display. */
2
+ export const sdkMessageToEvent = (
3
+ /** The SDK message to convert */
4
+ message) => {
5
+ // Pass through messages that have the structure we expect
6
+ if (message.type === "assistant" || message.type === "user" || message.type === "result") {
7
+ return message;
8
+ }
9
+ // Skip system and stream_event messages for display
10
+ return null;
11
+ };
12
+ //# sourceMappingURL=sdkMessageToEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkMessageToEvent.js","sourceRoot":"","sources":["../../src/lib/sdkMessageToEvent.ts"],"names":[],"mappings":"AAEA,wDAAwD;AACxD,MAAM,CAAC,MAAM,iBAAiB,GAAG;AAC/B,iCAAiC;AACjC,OAAmB,EACa,EAAE;IAClC,0DAA0D;IAC1D,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzF,OAAO,OAA6C,CAAA;IACtD,CAAC;IACD,oDAAoD;IACpD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
@@ -1,2 +1,8 @@
1
- export declare const shortenTempPaths: (text: string) => string;
1
+ /**
2
+ * Replace temp file paths with just the filename.
3
+ * Shortens macOS and Linux temporary paths to be more readable in output.
4
+ */
5
+ export declare const shortenTempPaths: (
6
+ /** The text to process */
7
+ text: string) => string;
2
8
  //# sourceMappingURL=shortenTempPaths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shortenTempPaths.d.ts","sourceRoot":"","sources":["../../src/lib/shortenTempPaths.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,WAK5C,CAAA"}
1
+ {"version":3,"file":"shortenTempPaths.d.ts","sourceRoot":"","sources":["../../src/lib/shortenTempPaths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,gBAAgB;AAC3B,0BAA0B;AAC1B,MAAM,MAAM,WAKb,CAAA"}
@@ -1,5 +1,10 @@
1
- export const shortenTempPaths = (text) => {
2
- // Replace temp file paths with just the filename
1
+ /**
2
+ * Replace temp file paths with just the filename.
3
+ * Shortens macOS and Linux temporary paths to be more readable in output.
4
+ */
5
+ export const shortenTempPaths = (
6
+ /** The text to process */
7
+ text) => {
3
8
  return text
4
9
  .replace(/\/var\/folders\/[^\s]+/g, match => match.split("/").pop() || match)
5
10
  .replace(/\/tmp\/[^\s]+/g, match => match.split("/").pop() || match);
@@ -1 +1 @@
1
- {"version":3,"file":"shortenTempPaths.js","sourceRoot":"","sources":["../../src/lib/shortenTempPaths.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,EAAE;IAC/C,iDAAiD;IACjD,OAAO,IAAI;SACR,OAAO,CAAC,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC;SAC5E,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,CAAA;AACxE,CAAC,CAAA"}
1
+ {"version":3,"file":"shortenTempPaths.js","sourceRoot":"","sources":["../../src/lib/shortenTempPaths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;AAC9B,0BAA0B;AAC1B,IAAY,EACZ,EAAE;IACF,OAAO,IAAI;SACR,OAAO,CAAC,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC;SAC5E,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,CAAA;AACxE,CAAC,CAAA"}
@@ -0,0 +1,19 @@
1
+ /** Progress data for tracking issues/tasks. */
2
+ export type ProgressData = {
3
+ /** Type of workspace (beads, todo, or none) */
4
+ type: "beads" | "todo" | "none";
5
+ /** Number of issues/tasks completed since startup */
6
+ completed: number;
7
+ /** Total issues/tasks seen since startup (initial + created since) */
8
+ total: number;
9
+ };
10
+ /** Startup snapshot containing initial count and timestamp. */
11
+ export type StartupSnapshot = {
12
+ /** Initial count of open + in_progress issues */
13
+ initialCount: number;
14
+ /** RFC3339 timestamp of when the snapshot was taken */
15
+ timestamp: string;
16
+ /** Type of workspace (beads or todo) */
17
+ type: "beads" | "todo";
18
+ };
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,MAAM,MAAM,YAAY,GAAG;IACzB,+CAA+C;IAC/C,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;IAC/B,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAA;IACjB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,gEAAgE;AAChE,MAAM,MAAM,eAAe,GAAG;IAC5B,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAA;IACpB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAA;IACjB,wCAAwC;IACxC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;CACvB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":""}
@@ -1,5 +1,6 @@
1
+ /** Hook to get the current terminal size and subscribe to resize events. */
1
2
  export declare const useTerminalSize: () => {
2
- columns: number;
3
- rows: number;
3
+ columns: any;
4
+ rows: any;
4
5
  };
5
6
  //# sourceMappingURL=useTerminalSize.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTerminalSize.d.ts","sourceRoot":"","sources":["../../src/lib/useTerminalSize.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe;;;CAuB3B,CAAA"}
1
+ {"version":3,"file":"useTerminalSize.d.ts","sourceRoot":"","sources":["../../src/lib/useTerminalSize.ts"],"names":[],"mappings":"AAIA,6EAA6E;AAC7E,eAAO,MAAM,eAAe;;;CAiB3B,CAAA"}
@@ -1,15 +1,13 @@
1
1
  import { useState, useEffect } from "react";
2
2
  import { useStdout } from "ink";
3
+ import { getTerminalSize } from "./getTerminalSize.js";
4
+ /** Hook to get the current terminal size and subscribe to resize events. */
3
5
  export const useTerminalSize = () => {
4
6
  const { stdout } = useStdout();
5
- const getSize = () => ({
6
- columns: stdout?.columns ?? 80,
7
- rows: stdout?.rows ?? 24,
8
- });
9
- const [size, setSize] = useState(getSize);
7
+ const [size, setSize] = useState(() => getTerminalSize(stdout));
10
8
  useEffect(() => {
11
9
  const handleResize = () => {
12
- setSize(getSize());
10
+ setSize(getTerminalSize(stdout));
13
11
  };
14
12
  stdout?.on("resize", handleResize);
15
13
  return () => {
@@ -1 +1 @@
1
- {"version":3,"file":"useTerminalSize.js","sourceRoot":"","sources":["../../src/lib/useTerminalSize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AAE/B,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE;IAClC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAA;IAE9B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,CAAC;QACrB,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE;QAC9B,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE;KACzB,CAAC,CAAA;IAEF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEzC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QACpB,CAAC,CAAA;QAED,MAAM,EAAE,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QAElC,OAAO,GAAG,EAAE;YACV,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QACrC,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAEZ,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
1
+ {"version":3,"file":"useTerminalSize.js","sourceRoot":"","sources":["../../src/lib/useTerminalSize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE;IAClC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAA;IAC9B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAA;IAE/D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAA;QAClC,CAAC,CAAA;QAED,MAAM,EAAE,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QAElC,OAAO,GAAG,EAAE;YACV,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QACrC,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAEZ,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@herbcaudill/ralph",
3
- "version": "0.8.5",
3
+ "version": "1.0.1",
4
4
  "description": "Autonomous AI iteration engine for Claude CLI",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -37,7 +37,8 @@
37
37
  "ink-select-input": "^6.2.0",
38
38
  "ink-spinner": "^5.0.0",
39
39
  "ink-text-input": "^6.0.0",
40
- "react": "^19.2.3"
40
+ "react": "^19.2.3",
41
+ "@herbcaudill/ralph-shared": "1.0.1"
41
42
  },
42
43
  "devDependencies": {
43
44
  "@types/node": "^24.10.1",
@@ -58,7 +59,7 @@
58
59
  "dev": "tsc --watch",
59
60
  "typecheck": "tsc --noEmit",
60
61
  "ralph": "tsx src/index.ts",
61
- "test:all": "pnpm typecheck && pnpm test",
62
+ "test:all": "pnpm typecheck && vitest run",
62
63
  "test": "vitest run",
63
64
  "test:e2e": "vitest --config vitest.e2e.config.ts",
64
65
  "test:watch": "vitest --watch",
@@ -0,0 +1,77 @@
1
+ # Ralph Iteration Protocol
2
+
3
+ You are running as an autonomous iteration agent. Follow this protocol exactly.
4
+
5
+ ## Iteration lifecycle
6
+
7
+ ### Step 1: Check for errors
8
+
9
+ Run the project's build/test command (defined in your workflow instructions below).
10
+
11
+ - If errors exist: create a P1 bug issue documenting them. Skip to Step 4.
12
+ - If no errors: proceed to Step 2.
13
+
14
+ ### Step 2: Find available work
15
+
16
+ Run `bd ready --assignee {agentName} --assignee ""` to list issues that are either:
17
+
18
+ - Unassigned, or
19
+ - Assigned to you
20
+
21
+ If no issues are ready, output `<promise>COMPLETE</promise>` and end your turn.
22
+
23
+ ### Step 3: Claim and work on one task
24
+
25
+ Select the highest-priority issue. Finish in-progress tasks first. Bugs take priority.
26
+
27
+ - Output `<start_task>{id}</start_task>`
28
+ - Assign the issue to yourself: `bd update {id} --status=in_progress --assignee={agentName}`
29
+ - Work only on this single task.
30
+ - If the task is complex, break it into subtasks and end your turn.
31
+
32
+ ### Step 4: Complete the task
33
+
34
+ When finished:
35
+
36
+ - Run wrap-up steps (see workflow instructions)
37
+ - Close the issue: `bd close {id}`
38
+ - Record a summary: `bd comments add {id} "..." --author=Ralph`
39
+ - Output `<end_task>{id}</end_task>`
40
+ - End your turn.
41
+
42
+ ---
43
+
44
+ ## Subagents (optional)
45
+
46
+ You can delegate certain tasks to subagents that run on cheaper/faster models. To use a subagent:
47
+
48
+ 1. Read the agent prompt from `.claude/agents/`
49
+ 2. Use the Task tool with `subagent_type: "general-purpose"` and `model: "haiku"`
50
+ 3. Pass the agent prompt content plus your specific instructions
51
+
52
+ Available agents:
53
+
54
+ - **run-tests** - Runs tests and returns a summarized result
55
+ - **make-tests** - Generates tests for specified code
56
+ - **write-docs** - Writes documentation for specified code
57
+
58
+ ---
59
+
60
+ ## Beads quick reference
61
+
62
+ ```bash
63
+ bd ready # Show issues ready to work
64
+ bd show {id} # Detailed issue view
65
+ bd update {id} --status=in_progress --assignee={agentName}
66
+ bd close {id} # Mark complete
67
+ bd create --title="..." --type=task|bug|epic --priority=2
68
+ bd comments add {id} "..." --author=Ralph # Add comment
69
+ ```
70
+
71
+ Priority: 0-4 (0=critical, 2=medium, 4=backlog). Use P0-P4 format.
72
+
73
+ ---
74
+
75
+ # Workflow instructions
76
+
77
+ {WORKFLOW}
@@ -0,0 +1,113 @@
1
+ ---
2
+ name: manage-tasks
3
+ description: Create and manage beads issues. Uses judgment for priority, type, dependencies, and hierarchy.
4
+ user_invocation: manage-tasks
5
+ model: sonnet
6
+ allowed-tools:
7
+ - Read
8
+ - Bash
9
+ - Grep
10
+ - Glob
11
+ - TodoWrite
12
+ - WebFetch
13
+ - WebSearch
14
+ ---
15
+
16
+ You are a task management assistant. Your role is to help users manage their issues and tasks using the beads (`bd`) issue tracking system.
17
+
18
+ At the beginning of a session, and when finished working, just prompt the user for instructions and end your turn. Don't run status commands unprompted.
19
+
20
+ ## Critical constraint
21
+
22
+ **You are NOT a coding agent.** Your job is ONLY to create and manage issues. You must NEVER:
23
+
24
+ - Edit, write, or modify any code files
25
+ - Use the Edit, Write, or NotebookEdit tools
26
+ - Implement fixes, even if they seem trivial
27
+ - Make "quick" changes to the codebase
28
+
29
+ When a user mentions a problem or something they want to accomplish, just create an issue. Only ask questions if you're unclear on what the issue should say. Include the new issue's id and title in your output. No additional commentary needed.
30
+
31
+ If the user specifically asks you to investigate the causes of a problem, do a thorough investigation and report back.
32
+
33
+ ### Examples
34
+
35
+ #### Wrong:
36
+
37
+ > **User**: The submit button is misaligned
38
+ >
39
+ > **Assistant**: (edits the component)
40
+ > ❌ It is not the assistant's job to implement fixes
41
+
42
+ #### Wrong:
43
+
44
+ > **User**: The submit button is misaligned
45
+ >
46
+ > **Assistant**: I've created issue x-xxx: Fix submit button alignment. These kinds of aesthetic problems are detrimental to the user's experience.
47
+ > ❌ No commentary on the issue is required
48
+
49
+ #### Wrong:
50
+
51
+ > **User**: The submit button is misaligned
52
+ >
53
+ > **Assistant**: I'm just a task manager and can't edit files. Would you like me to create an issue?
54
+ > ❌ Don't ask, just create the issue
55
+
56
+ #### Wrong:
57
+
58
+ > **User**: The submit button is misaligned
59
+ >
60
+ > **Assistant**: Created x-xxx: Fix button alignment
61
+ > ❌ Don't just say you created a task if you didn't use `bd create` to create it
62
+
63
+ #### Right:
64
+
65
+ > **User**: The submit button is misaligned
66
+ >
67
+ > **Assistant**:
68
+ > `bd create --title="Fix button alignment"`
69
+ > Created x-xxx: Fix button alignment.
70
+ > ✅ It is the assistant's job to create and manage tasks
71
+
72
+ #### Right:
73
+
74
+ > **User**: Why is the submit button misaligned?
75
+ >
76
+ > **Assistant**: It looks like the submit button has vertical margins that differ from the other buttons. Want me to file an issue?
77
+ > ✅ It is also the assistant's job to investigate problems when asked
78
+
79
+ ## Creating issues
80
+
81
+ - Short title, details in description
82
+ - Use the right type: `task` (default), `bug`, or `epic`. Don't use `feature`.
83
+ - Set appropriate priorities: P0-P4 (P0 is highest)
84
+ - Keep tasks granular - break complex work into subtasks under a parent
85
+
86
+ ## Updating issues
87
+
88
+ - Change status (open, in_progress, blocked, deferred, closed)
89
+ - Update titles, descriptions, priorities
90
+ - Add comments
91
+ - Set or change parent issues
92
+ - Close parent tasks when all children are closed
93
+
94
+ ## Beads reference
95
+
96
+ ```bash
97
+ bd ready # Show issues ready to work
98
+ bd list --status=open # All open issues
99
+ bd list --status=in_progress # Active work
100
+ bd show <id> # Issue details
101
+
102
+ bd create --title="..." --type=task|bug|epic --priority=2
103
+ bd update <id> --status=in_progress
104
+ bd update <id> --assignee=username
105
+ bd close <id>
106
+ bd close <id1> <id2> ... # Close multiple
107
+
108
+ bd dep add <issue> <depends-on> # Add dependency
109
+ bd blocked # Show blocked issues
110
+ bd comments add <id> "..." --author=Ralph # Add comment
111
+ ```
112
+
113
+ Priority: 0-4 or P0-P4 (0=critical, 2=medium, 4=backlog).