@herbcaudill/ralph 0.2.0 → 0.4.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 (175) hide show
  1. package/bin/ralph.js +1 -1
  2. package/dist/cli.d.ts +2 -19
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +30 -65
  5. package/dist/cli.js.map +1 -1
  6. package/dist/components/App.d.ts +10 -0
  7. package/dist/components/App.d.ts.map +1 -0
  8. package/dist/components/App.js +16 -0
  9. package/dist/components/App.js.map +1 -0
  10. package/dist/components/EventDisplay.d.ts +7 -0
  11. package/dist/components/EventDisplay.d.ts.map +1 -0
  12. package/dist/components/EventDisplay.js +64 -0
  13. package/dist/components/EventDisplay.js.map +1 -0
  14. package/dist/components/EventDisplay.replay.test.d.ts +2 -0
  15. package/dist/components/EventDisplay.replay.test.d.ts.map +1 -0
  16. package/dist/components/EventDisplay.replay.test.js +403 -0
  17. package/dist/components/EventDisplay.replay.test.js.map +1 -0
  18. package/dist/components/EventDisplay.test.d.ts +2 -0
  19. package/dist/components/EventDisplay.test.d.ts.map +1 -0
  20. package/dist/components/EventDisplay.test.js +223 -0
  21. package/dist/components/EventDisplay.test.js.map +1 -0
  22. package/dist/components/Header.d.ts +8 -0
  23. package/dist/components/Header.d.ts.map +1 -0
  24. package/dist/components/Header.js +15 -0
  25. package/dist/components/Header.js.map +1 -0
  26. package/dist/components/Header.test.d.ts +2 -0
  27. package/dist/components/Header.test.d.ts.map +1 -0
  28. package/dist/components/Header.test.js +27 -0
  29. package/dist/components/Header.test.js.map +1 -0
  30. package/dist/components/InitRalph.d.ts +3 -0
  31. package/dist/components/InitRalph.d.ts.map +1 -0
  32. package/dist/components/InitRalph.js +100 -0
  33. package/dist/components/InitRalph.js.map +1 -0
  34. package/dist/components/IterationRunner.d.ts +7 -0
  35. package/dist/components/IterationRunner.d.ts.map +1 -0
  36. package/dist/components/IterationRunner.js +286 -0
  37. package/dist/components/IterationRunner.js.map +1 -0
  38. package/dist/components/IterationRunner.test.d.ts +2 -0
  39. package/dist/components/IterationRunner.test.d.ts.map +1 -0
  40. package/dist/components/IterationRunner.test.js +109 -0
  41. package/dist/components/IterationRunner.test.js.map +1 -0
  42. package/dist/components/ReplayLog.d.ts +7 -0
  43. package/dist/components/ReplayLog.d.ts.map +1 -0
  44. package/dist/components/ReplayLog.js +51 -0
  45. package/dist/components/ReplayLog.js.map +1 -0
  46. package/dist/components/StreamingText.d.ts +7 -0
  47. package/dist/components/StreamingText.d.ts.map +1 -0
  48. package/dist/components/StreamingText.js +36 -0
  49. package/dist/components/StreamingText.js.map +1 -0
  50. package/dist/components/StreamingText.test.d.ts +2 -0
  51. package/dist/components/StreamingText.test.d.ts.map +1 -0
  52. package/dist/components/StreamingText.test.js +86 -0
  53. package/dist/components/StreamingText.test.js.map +1 -0
  54. package/dist/components/ToolUse.d.ts +8 -0
  55. package/dist/components/ToolUse.d.ts.map +1 -0
  56. package/dist/components/ToolUse.js +10 -0
  57. package/dist/components/ToolUse.js.map +1 -0
  58. package/dist/components/ToolUse.test.d.ts +2 -0
  59. package/dist/components/ToolUse.test.d.ts.map +1 -0
  60. package/dist/components/ToolUse.test.js +43 -0
  61. package/dist/components/ToolUse.test.js.map +1 -0
  62. package/dist/components/eventToBlocks.d.ts +12 -0
  63. package/dist/components/eventToBlocks.d.ts.map +1 -0
  64. package/dist/components/eventToBlocks.js +142 -0
  65. package/dist/components/eventToBlocks.js.map +1 -0
  66. package/dist/components/eventToBlocks.test.d.ts +2 -0
  67. package/dist/components/eventToBlocks.test.d.ts.map +1 -0
  68. package/dist/components/eventToBlocks.test.js +412 -0
  69. package/dist/components/eventToBlocks.test.js.map +1 -0
  70. package/dist/index.d.ts +1 -0
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +3 -21
  73. package/dist/index.js.map +1 -1
  74. package/dist/lib/cleanupAllWorktrees.d.ts +5 -0
  75. package/dist/lib/cleanupAllWorktrees.d.ts.map +1 -0
  76. package/dist/lib/cleanupAllWorktrees.js +25 -0
  77. package/dist/lib/cleanupAllWorktrees.js.map +1 -0
  78. package/dist/lib/cleanupWorktree.d.ts +6 -0
  79. package/dist/lib/cleanupWorktree.d.ts.map +1 -0
  80. package/dist/lib/cleanupWorktree.js +33 -0
  81. package/dist/lib/cleanupWorktree.js.map +1 -0
  82. package/dist/lib/copyRalphFilesFromWorktree.d.ts +5 -0
  83. package/dist/lib/copyRalphFilesFromWorktree.d.ts.map +1 -0
  84. package/dist/lib/copyRalphFilesFromWorktree.js +19 -0
  85. package/dist/lib/copyRalphFilesFromWorktree.js.map +1 -0
  86. package/dist/lib/copyRalphFilesToWorktree.d.ts +5 -0
  87. package/dist/lib/copyRalphFilesToWorktree.d.ts.map +1 -0
  88. package/dist/lib/copyRalphFilesToWorktree.js +21 -0
  89. package/dist/lib/copyRalphFilesToWorktree.js.map +1 -0
  90. package/dist/lib/createWorktree.d.ts +6 -0
  91. package/dist/lib/createWorktree.d.ts.map +1 -0
  92. package/dist/lib/createWorktree.js +34 -0
  93. package/dist/lib/createWorktree.js.map +1 -0
  94. package/dist/lib/getClaudeVersion.d.ts +2 -0
  95. package/dist/lib/getClaudeVersion.d.ts.map +1 -0
  96. package/dist/lib/getClaudeVersion.js +17 -0
  97. package/dist/lib/getClaudeVersion.js.map +1 -0
  98. package/dist/lib/getClaudeVersion.test.d.ts +2 -0
  99. package/dist/lib/getClaudeVersion.test.d.ts.map +1 -0
  100. package/dist/lib/getClaudeVersion.test.js +39 -0
  101. package/dist/lib/getClaudeVersion.test.js.map +1 -0
  102. package/dist/lib/getGitRoot.d.ts +5 -0
  103. package/dist/lib/getGitRoot.d.ts.map +1 -0
  104. package/dist/lib/getGitRoot.js +18 -0
  105. package/dist/lib/getGitRoot.js.map +1 -0
  106. package/dist/lib/installDependencies.d.ts +5 -0
  107. package/dist/lib/installDependencies.d.ts.map +1 -0
  108. package/dist/lib/installDependencies.js +23 -0
  109. package/dist/lib/installDependencies.js.map +1 -0
  110. package/dist/lib/installDependencies.test.d.ts +2 -0
  111. package/dist/lib/installDependencies.test.d.ts.map +1 -0
  112. package/dist/lib/installDependencies.test.js +37 -0
  113. package/dist/lib/installDependencies.test.js.map +1 -0
  114. package/dist/lib/mergeWorktreeToMain.d.ts +6 -0
  115. package/dist/lib/mergeWorktreeToMain.d.ts.map +1 -0
  116. package/dist/lib/mergeWorktreeToMain.js +44 -0
  117. package/dist/lib/mergeWorktreeToMain.js.map +1 -0
  118. package/dist/lib/popStash.d.ts +5 -0
  119. package/dist/lib/popStash.d.ts.map +1 -0
  120. package/dist/lib/popStash.js +17 -0
  121. package/dist/lib/popStash.js.map +1 -0
  122. package/dist/lib/rel.test.d.ts +2 -0
  123. package/dist/lib/rel.test.d.ts.map +1 -0
  124. package/dist/lib/rel.test.js +36 -0
  125. package/dist/lib/rel.test.js.map +1 -0
  126. package/dist/lib/replayLog.d.ts.map +1 -1
  127. package/dist/lib/replayLog.js +20 -6
  128. package/dist/lib/replayLog.js.map +1 -1
  129. package/dist/lib/runIteration.d.ts.map +1 -1
  130. package/dist/lib/runIteration.js +18 -8
  131. package/dist/lib/runIteration.js.map +1 -1
  132. package/dist/lib/shortenTempPaths.test.d.ts +2 -0
  133. package/dist/lib/shortenTempPaths.test.d.ts.map +1 -0
  134. package/dist/lib/shortenTempPaths.test.js +46 -0
  135. package/dist/lib/shortenTempPaths.test.js.map +1 -0
  136. package/dist/lib/signalHandler.d.ts +3 -0
  137. package/dist/lib/signalHandler.d.ts.map +1 -0
  138. package/dist/lib/signalHandler.js +23 -0
  139. package/dist/lib/signalHandler.js.map +1 -0
  140. package/dist/lib/stashChanges.d.ts +6 -0
  141. package/dist/lib/stashChanges.d.ts.map +1 -0
  142. package/dist/lib/stashChanges.js +27 -0
  143. package/dist/lib/stashChanges.js.map +1 -0
  144. package/dist/lib/types.d.ts +8 -0
  145. package/dist/lib/types.d.ts.map +1 -0
  146. package/dist/lib/types.js +5 -0
  147. package/dist/lib/types.js.map +1 -0
  148. package/dist/lib/worktree.d.ts +43 -0
  149. package/dist/lib/worktree.d.ts.map +1 -0
  150. package/dist/lib/worktree.js +210 -0
  151. package/dist/lib/worktree.js.map +1 -0
  152. package/dist/ui/EventProcessor.d.ts +11 -0
  153. package/dist/ui/EventProcessor.d.ts.map +1 -0
  154. package/dist/ui/EventProcessor.js +95 -0
  155. package/dist/ui/EventProcessor.js.map +1 -0
  156. package/dist/ui/IterationApp.d.ts +10 -0
  157. package/dist/ui/IterationApp.d.ts.map +1 -0
  158. package/dist/ui/IterationApp.js +21 -0
  159. package/dist/ui/IterationApp.js.map +1 -0
  160. package/dist/ui/IterationUI.d.ts +13 -0
  161. package/dist/ui/IterationUI.d.ts.map +1 -0
  162. package/dist/ui/IterationUI.js +19 -0
  163. package/dist/ui/IterationUI.js.map +1 -0
  164. package/dist/ui/TextDisplay.d.ts +7 -0
  165. package/dist/ui/TextDisplay.d.ts.map +1 -0
  166. package/dist/ui/TextDisplay.js +41 -0
  167. package/dist/ui/TextDisplay.js.map +1 -0
  168. package/dist/ui/ToolUseDisplay.d.ts +10 -0
  169. package/dist/ui/ToolUseDisplay.d.ts.map +1 -0
  170. package/dist/ui/ToolUseDisplay.js +10 -0
  171. package/dist/ui/ToolUseDisplay.js.map +1 -0
  172. package/package.json +23 -4
  173. package/templates/progress.md +1 -1
  174. package/templates/prompt.md +11 -1
  175. package/templates/todo.md +0 -1
@@ -0,0 +1,34 @@
1
+ import { execSync } from "child_process";
2
+ import { mkdirSync } from "fs";
3
+ import { tmpdir } from "os";
4
+ import { join } from "path";
5
+ import { randomUUID } from "crypto";
6
+ import { execOptions } from "./types.js";
7
+ /**
8
+ * Create a new git worktree for an iteration
9
+ */
10
+ export function createWorktree(repoRoot) {
11
+ const guid = randomUUID();
12
+ const shortId = guid.slice(-6);
13
+ const branch = `ralph-${shortId}`;
14
+ const worktreesDir = join(tmpdir(), "ralph-worktrees");
15
+ const worktreePath = join(worktreesDir, shortId);
16
+ try {
17
+ // Ensure worktrees directory exists
18
+ mkdirSync(worktreesDir, { recursive: true });
19
+ // Create worktree with new branch from current HEAD
20
+ execSync(`git worktree add -b ${branch} "${worktreePath}"`, {
21
+ ...execOptions,
22
+ cwd: repoRoot,
23
+ });
24
+ return {
25
+ path: worktreePath,
26
+ branch,
27
+ guid,
28
+ };
29
+ }
30
+ catch (error) {
31
+ throw new Error(`Failed to create worktree: ${error}`);
32
+ }
33
+ }
34
+ //# sourceMappingURL=createWorktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createWorktree.js","sourceRoot":"","sources":["../../src/lib/createWorktree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAgB,WAAW,EAAE,MAAM,YAAY,CAAA;AAEtD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,IAAI,GAAG,UAAU,EAAE,CAAA;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,MAAM,MAAM,GAAG,SAAS,OAAO,EAAE,CAAA;IACjC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAA;IACtD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IAEhD,IAAI,CAAC;QACH,oCAAoC;QACpC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAE5C,oDAAoD;QACpD,QAAQ,CAAC,uBAAuB,MAAM,KAAK,YAAY,GAAG,EAAE;YAC1D,GAAG,WAAW;YACd,GAAG,EAAE,QAAQ;SACd,CAAC,CAAA;QAEF,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,MAAM;YACN,IAAI;SACL,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAA;IACxD,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const getClaudeVersion: () => string;
2
+ //# sourceMappingURL=getClaudeVersion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getClaudeVersion.d.ts","sourceRoot":"","sources":["../../src/lib/getClaudeVersion.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,QAAO,MAcnC,CAAA"}
@@ -0,0 +1,17 @@
1
+ import { execSync } from "child_process";
2
+ export const getClaudeVersion = () => {
3
+ try {
4
+ const output = execSync("claude --version", {
5
+ encoding: "utf-8",
6
+ stdio: ["pipe", "pipe", "pipe"],
7
+ }).trim();
8
+ // Output format: "2.1.5 (Claude Code)"
9
+ // Extract the version number
10
+ const match = output.match(/^([\d.]+)/);
11
+ return match ? match[1] : "unknown";
12
+ }
13
+ catch {
14
+ return "unknown";
15
+ }
16
+ };
17
+ //# sourceMappingURL=getClaudeVersion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getClaudeVersion.js","sourceRoot":"","sources":["../../src/lib/getClaudeVersion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAW,EAAE;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,kBAAkB,EAAE;YAC1C,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,IAAI,EAAE,CAAA;QAET,uCAAuC;QACvC,6BAA6B;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QACvC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=getClaudeVersion.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getClaudeVersion.test.d.ts","sourceRoot":"","sources":["../../src/lib/getClaudeVersion.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { execSync } from "child_process";
3
+ import { getClaudeVersion } from "./getClaudeVersion.js";
4
+ vi.mock("child_process");
5
+ describe("getClaudeVersion", () => {
6
+ beforeEach(() => {
7
+ vi.resetAllMocks();
8
+ });
9
+ afterEach(() => {
10
+ vi.restoreAllMocks();
11
+ });
12
+ it("should extract version from standard output", () => {
13
+ vi.mocked(execSync).mockReturnValue("2.1.5 (Claude Code)\n");
14
+ expect(getClaudeVersion()).toBe("2.1.5");
15
+ });
16
+ it("should handle version without Claude Code suffix", () => {
17
+ vi.mocked(execSync).mockReturnValue("1.0.0\n");
18
+ expect(getClaudeVersion()).toBe("1.0.0");
19
+ });
20
+ it("should extract version with extra whitespace", () => {
21
+ vi.mocked(execSync).mockReturnValue(" 3.2.1 (Claude Code) \n");
22
+ expect(getClaudeVersion()).toBe("3.2.1");
23
+ });
24
+ it("should return unknown if claude command fails", () => {
25
+ vi.mocked(execSync).mockImplementation(() => {
26
+ throw new Error("Command not found");
27
+ });
28
+ expect(getClaudeVersion()).toBe("unknown");
29
+ });
30
+ it("should return unknown if output format is unexpected", () => {
31
+ vi.mocked(execSync).mockReturnValue("Invalid output format");
32
+ expect(getClaudeVersion()).toBe("unknown");
33
+ });
34
+ it("should handle empty output", () => {
35
+ vi.mocked(execSync).mockReturnValue("");
36
+ expect(getClaudeVersion()).toBe("unknown");
37
+ });
38
+ });
39
+ //# sourceMappingURL=getClaudeVersion.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getClaudeVersion.test.js","sourceRoot":"","sources":["../../src/lib/getClaudeVersion.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;AAExB,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAA;IACpB,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,uBAAuB,CAAC,CAAA;QAC5D,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;QAC9C,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,2BAA2B,CAAC,CAAA;QAChE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAC1C,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,uBAAuB,CAAC,CAAA;QAC5D,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;QACvC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Get the root directory of the git repository
3
+ */
4
+ export declare function getGitRoot(cwd: string): string;
5
+ //# sourceMappingURL=getGitRoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getGitRoot.d.ts","sourceRoot":"","sources":["../../src/lib/getGitRoot.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAU9C"}
@@ -0,0 +1,18 @@
1
+ import { execSync } from "child_process";
2
+ import { execOptions } from "./types.js";
3
+ /**
4
+ * Get the root directory of the git repository
5
+ */
6
+ export function getGitRoot(cwd) {
7
+ try {
8
+ const root = execSync("git rev-parse --show-toplevel", {
9
+ ...execOptions,
10
+ cwd,
11
+ });
12
+ return root.toString().trim();
13
+ }
14
+ catch (error) {
15
+ throw new Error("Not in a git repository");
16
+ }
17
+ }
18
+ //# sourceMappingURL=getGitRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getGitRoot.js","sourceRoot":"","sources":["../../src/lib/getGitRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,+BAA+B,EAAE;YACrD,GAAG,WAAW;YACd,GAAG;SACJ,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Install dependencies in a worktree if package.json exists
3
+ */
4
+ export declare function installDependencies(worktreePath: string): void;
5
+ //# sourceMappingURL=installDependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installDependencies.d.ts","sourceRoot":"","sources":["../../src/lib/installDependencies.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAe9D"}
@@ -0,0 +1,23 @@
1
+ import { execSync } from "child_process";
2
+ import { existsSync } from "fs";
3
+ import { join } from "path";
4
+ import { execOptions } from "./types.js";
5
+ /**
6
+ * Install dependencies in a worktree if package.json exists
7
+ */
8
+ export function installDependencies(worktreePath) {
9
+ const packageJsonPath = join(worktreePath, "package.json");
10
+ if (!existsSync(packageJsonPath)) {
11
+ return;
12
+ }
13
+ try {
14
+ execSync("pnpm install", {
15
+ ...execOptions,
16
+ cwd: worktreePath,
17
+ });
18
+ }
19
+ catch (error) {
20
+ throw new Error(`Failed to install dependencies: ${error}`);
21
+ }
22
+ }
23
+ //# sourceMappingURL=installDependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installDependencies.js","sourceRoot":"","sources":["../../src/lib/installDependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAAoB;IACtD,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAA;IAE1D,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,OAAM;IACR,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,CAAC,cAAc,EAAE;YACvB,GAAG,WAAW;YACd,GAAG,EAAE,YAAY;SAClB,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAA;IAC7D,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=installDependencies.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installDependencies.test.d.ts","sourceRoot":"","sources":["../../src/lib/installDependencies.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { installDependencies } from "./installDependencies.js";
3
+ import { execSync } from "child_process";
4
+ import { existsSync } from "fs";
5
+ vi.mock("child_process", () => ({
6
+ execSync: vi.fn(),
7
+ }));
8
+ vi.mock("fs", () => ({
9
+ existsSync: vi.fn(),
10
+ }));
11
+ describe("installDependencies", () => {
12
+ beforeEach(() => {
13
+ vi.clearAllMocks();
14
+ });
15
+ it("runs pnpm install when package.json exists", () => {
16
+ vi.mocked(existsSync).mockReturnValue(true);
17
+ installDependencies("/tmp/worktree");
18
+ expect(execSync).toHaveBeenCalledWith("pnpm install", {
19
+ encoding: "utf-8",
20
+ stdio: "pipe",
21
+ cwd: "/tmp/worktree",
22
+ });
23
+ });
24
+ it("does nothing when package.json does not exist", () => {
25
+ vi.mocked(existsSync).mockReturnValue(false);
26
+ installDependencies("/tmp/worktree");
27
+ expect(execSync).not.toHaveBeenCalled();
28
+ });
29
+ it("throws error when pnpm install fails", () => {
30
+ vi.mocked(existsSync).mockReturnValue(true);
31
+ vi.mocked(execSync).mockImplementation(() => {
32
+ throw new Error("pnpm not found");
33
+ });
34
+ expect(() => installDependencies("/tmp/worktree")).toThrow("Failed to install dependencies: Error: pnpm not found");
35
+ });
36
+ });
37
+ //# sourceMappingURL=installDependencies.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installDependencies.test.js","sourceRoot":"","sources":["../../src/lib/installDependencies.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAE/B,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;CAClB,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACnB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;CACpB,CAAC,CAAC,CAAA;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAA;IACpB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAE3C,mBAAmB,CAAC,eAAe,CAAC,CAAA;QAEpC,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,cAAc,EAAE;YACpD,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;YACb,GAAG,EAAE,eAAe;SACrB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;QAE5C,mBAAmB,CAAC,eAAe,CAAC,CAAA;QAEpC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAC3C,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAC1C,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CACxD,uDAAuD,CACxD,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { WorktreeInfo } from "./types.js";
2
+ /**
3
+ * Merge worktree changes back to main branch and commit
4
+ */
5
+ export declare function mergeWorktreeToMain(repoRoot: string, worktree: WorktreeInfo): void;
6
+ //# sourceMappingURL=mergeWorktreeToMain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeWorktreeToMain.d.ts","sourceRoot":"","sources":["../../src/lib/mergeWorktreeToMain.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAe,MAAM,YAAY,CAAA;AAEtD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAyClF"}
@@ -0,0 +1,44 @@
1
+ import { execSync } from "child_process";
2
+ import { execOptions } from "./types.js";
3
+ /**
4
+ * Merge worktree changes back to main branch and commit
5
+ */
6
+ export function mergeWorktreeToMain(repoRoot, worktree) {
7
+ try {
8
+ // First, ensure all changes in worktree are committed
9
+ // (Claude should have done this, but let's be safe)
10
+ const status = execSync("git status --porcelain", {
11
+ ...execOptions,
12
+ cwd: worktree.path,
13
+ });
14
+ if (status.toString().trim()) {
15
+ // There are uncommitted changes - commit them
16
+ execSync("git add -A", {
17
+ ...execOptions,
18
+ cwd: worktree.path,
19
+ });
20
+ execSync(`git commit -m "Ralph iteration ${worktree.guid}: auto-commit remaining changes"`, {
21
+ ...execOptions,
22
+ cwd: worktree.path,
23
+ });
24
+ }
25
+ // Get current branch in main repo
26
+ const currentBranch = execSync("git branch --show-current", {
27
+ ...execOptions,
28
+ cwd: repoRoot,
29
+ })
30
+ .toString()
31
+ .trim();
32
+ // Merge the worktree branch into current branch
33
+ execSync(`git merge --no-ff ${worktree.branch} -m "Merge iteration ${worktree.guid}"`, {
34
+ ...execOptions,
35
+ cwd: repoRoot,
36
+ });
37
+ }
38
+ catch (error) {
39
+ // If merge fails, it might be due to conflicts
40
+ throw new Error(`Failed to merge worktree to main: ${error}\n\n` +
41
+ `You may need to resolve conflicts manually in the main repository.`);
42
+ }
43
+ }
44
+ //# sourceMappingURL=mergeWorktreeToMain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeWorktreeToMain.js","sourceRoot":"","sources":["../../src/lib/mergeWorktreeToMain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAgB,WAAW,EAAE,MAAM,YAAY,CAAA;AAEtD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,QAAsB;IAC1E,IAAI,CAAC;QACH,sDAAsD;QACtD,oDAAoD;QACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,wBAAwB,EAAE;YAChD,GAAG,WAAW;YACd,GAAG,EAAE,QAAQ,CAAC,IAAI;SACnB,CAAC,CAAA;QAEF,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7B,8CAA8C;YAC9C,QAAQ,CAAC,YAAY,EAAE;gBACrB,GAAG,WAAW;gBACd,GAAG,EAAE,QAAQ,CAAC,IAAI;aACnB,CAAC,CAAA;YACF,QAAQ,CAAC,kCAAkC,QAAQ,CAAC,IAAI,kCAAkC,EAAE;gBAC1F,GAAG,WAAW;gBACd,GAAG,EAAE,QAAQ,CAAC,IAAI;aACnB,CAAC,CAAA;QACJ,CAAC;QAED,kCAAkC;QAClC,MAAM,aAAa,GAAG,QAAQ,CAAC,2BAA2B,EAAE;YAC1D,GAAG,WAAW;YACd,GAAG,EAAE,QAAQ;SACd,CAAC;aACC,QAAQ,EAAE;aACV,IAAI,EAAE,CAAA;QAET,gDAAgD;QAChD,QAAQ,CAAC,qBAAqB,QAAQ,CAAC,MAAM,wBAAwB,QAAQ,CAAC,IAAI,GAAG,EAAE;YACrF,GAAG,WAAW;YACd,GAAG,EAAE,QAAQ;SACd,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,+CAA+C;QAC/C,MAAM,IAAI,KAAK,CACb,qCAAqC,KAAK,MAAM;YAC9C,oEAAoE,CACvE,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Pop the most recent stash
3
+ */
4
+ export declare function popStash(repoRoot: string): void;
5
+ //# sourceMappingURL=popStash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popStash.d.ts","sourceRoot":"","sources":["../../src/lib/popStash.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAS/C"}
@@ -0,0 +1,17 @@
1
+ import { execSync } from "child_process";
2
+ import { execOptions } from "./types.js";
3
+ /**
4
+ * Pop the most recent stash
5
+ */
6
+ export function popStash(repoRoot) {
7
+ try {
8
+ execSync("git stash pop", {
9
+ ...execOptions,
10
+ cwd: repoRoot,
11
+ });
12
+ }
13
+ catch (error) {
14
+ throw new Error(`Failed to pop stash: ${error}`);
15
+ }
16
+ }
17
+ //# sourceMappingURL=popStash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popStash.js","sourceRoot":"","sources":["../../src/lib/popStash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,IAAI,CAAC;QACH,QAAQ,CAAC,eAAe,EAAE;YACxB,GAAG,WAAW;YACd,GAAG,EAAE,QAAQ;SACd,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAA;IAClD,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rel.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rel.test.d.ts","sourceRoot":"","sources":["../../src/lib/rel.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { rel } from "./rel.js";
3
+ describe("rel", () => {
4
+ it("converts absolute path to relative path", () => {
5
+ const absolutePath = `${process.cwd()}/src/lib/rel.ts`;
6
+ const result = rel(absolutePath);
7
+ expect(result).toBe("src/lib/rel.ts");
8
+ });
9
+ it("returns just filename for /var/folders/ temp paths", () => {
10
+ const tempPath = "/var/folders/xy/abc123/T/temp-file.txt";
11
+ const result = rel(tempPath);
12
+ expect(result).toBe("temp-file.txt");
13
+ });
14
+ it("returns just filename for /tmp/ paths", () => {
15
+ const tmpPath = "/tmp/some-temp-file.json";
16
+ const result = rel(tmpPath);
17
+ expect(result).toBe("some-temp-file.json");
18
+ });
19
+ it("returns original path if already relative", () => {
20
+ const relativePath = "src/lib/rel.ts";
21
+ const result = rel(relativePath);
22
+ expect(result).toBe(relativePath);
23
+ });
24
+ it("handles path outside current directory", () => {
25
+ const outsidePath = "/completely/different/path/file.ts";
26
+ const result = rel(outsidePath);
27
+ // Should return relative path from cwd (will have ../.. etc)
28
+ expect(result).toContain("file.ts");
29
+ });
30
+ it("handles root directory path", () => {
31
+ const rootPath = "/";
32
+ const result = rel(rootPath);
33
+ expect(result).toBeTruthy();
34
+ });
35
+ });
36
+ //# sourceMappingURL=rel.test.js.map
@@ -0,0 +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 +1 @@
1
- {"version":3,"file":"replayLog.d.ts","sourceRoot":"","sources":["../../src/lib/replayLog.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,SAiBzC,CAAA"}
1
+ {"version":3,"file":"replayLog.d.ts","sourceRoot":"","sources":["../../src/lib/replayLog.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,SAkCzC,CAAA"}
@@ -1,21 +1,35 @@
1
- import chalk from "chalk";
2
1
  import { readFileSync } from "fs";
3
- import { processEvent } from "./processEvent.js";
2
+ import { render } from "ink";
3
+ import React from "react";
4
+ import { IterationApp } from "../ui/IterationApp.js";
4
5
  export const replayLog = (filePath) => {
5
- console.log(chalk.cyan(`Replaying: ${filePath}`));
6
- console.log(chalk.dim("─".repeat(40)) + "\n");
7
6
  const content = readFileSync(filePath, "utf-8");
8
7
  // Log file contains pretty-printed JSON objects separated by blank lines
9
8
  const eventStrings = content.split(/\n\n+/).filter(s => s.trim());
9
+ let processor = null;
10
+ // Render Ink UI
11
+ const { unmount } = render(React.createElement(IterationApp, {
12
+ iteration: 0,
13
+ totalIterations: 0,
14
+ onProcessEvent: (p) => {
15
+ processor = p;
16
+ },
17
+ }));
18
+ // Process all events
10
19
  for (const eventStr of eventStrings) {
11
20
  try {
12
21
  const event = JSON.parse(eventStr);
13
- processEvent(event);
22
+ if (processor) {
23
+ processor.processEvent(event);
24
+ }
14
25
  }
15
26
  catch {
16
27
  // Skip malformed entries
17
28
  }
18
29
  }
19
- console.log("\n");
30
+ // Wait a bit to let the UI render before unmounting
31
+ setTimeout(() => {
32
+ unmount();
33
+ }, 100);
20
34
  };
21
35
  //# sourceMappingURL=replayLog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"replayLog.js","sourceRoot":"","sources":["../../src/lib/replayLog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,EAAE;IAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAA;IACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IAE7C,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC/C,yEAAyE;IACzE,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAEjE,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YAClC,YAAY,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACnB,CAAC,CAAA"}
1
+ {"version":3,"file":"replayLog.js","sourceRoot":"","sources":["../../src/lib/replayLog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAGpD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,EAAE;IAC5C,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC/C,yEAAyE;IACzE,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAEjE,IAAI,SAAS,GAA0B,IAAI,CAAA;IAE3C,gBAAgB;IAChB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CACxB,KAAK,CAAC,aAAa,CAAC,YAAY,EAAE;QAChC,SAAS,EAAE,CAAC;QACZ,eAAe,EAAE,CAAC;QAClB,cAAc,EAAE,CAAC,CAAiB,EAAE,EAAE;YACpC,SAAS,GAAG,CAAC,CAAA;QACf,CAAC;KACF,CAAC,CACH,CAAA;IAED,qBAAqB;IACrB,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YAClC,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,EAAE,CAAA;IACX,CAAC,EAAE,GAAG,CAAC,CAAA;AACT,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"runIteration.d.ts","sourceRoot":"","sources":["../../src/lib/runIteration.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,EAAE,YAAY,MAAM,SAyFzD,CAAA"}
1
+ {"version":3,"file":"runIteration.d.ts","sourceRoot":"","sources":["../../src/lib/runIteration.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,EAAE,YAAY,MAAM,SAuGzD,CAAA"}
@@ -2,18 +2,26 @@ import chalk from "chalk";
2
2
  import { spawn } from "child_process";
3
3
  import { appendFileSync, writeFileSync } from "fs";
4
4
  import { join } from "path";
5
- import { processEvent } from "./processEvent.js";
6
- import { flushLine, resetTextState } from "./textFormatting.js";
5
+ import { render } from "ink";
6
+ import React from "react";
7
+ import { IterationApp } from "../ui/IterationApp.js";
7
8
  const logFile = join(process.cwd(), ".ralph", "events.log");
8
9
  export const runIteration = (i, iterations) => {
9
10
  if (i > iterations) {
10
11
  console.log(chalk.green(`Completed ${iterations} iterations.`));
11
12
  return;
12
13
  }
13
- console.log(chalk.cyan(`Iteration ${i}`));
14
- console.log(chalk.dim("─".repeat(40)) + "\n");
15
14
  // Clear log file at start of each iteration
16
15
  writeFileSync(logFile, "");
16
+ let processor = null;
17
+ // Render Ink UI
18
+ const { unmount } = render(React.createElement(IterationApp, {
19
+ iteration: i,
20
+ totalIterations: iterations,
21
+ onProcessEvent: (p) => {
22
+ processor = p;
23
+ },
24
+ }));
17
25
  const child = spawn("claude", [
18
26
  "--permission-mode",
19
27
  "bypassPermissions",
@@ -33,6 +41,8 @@ export const runIteration = (i, iterations) => {
33
41
  if (!stdoutEnded || !closeInfo)
34
42
  return;
35
43
  const { code, signal } = closeInfo;
44
+ // Unmount Ink UI
45
+ unmount();
36
46
  if (code !== 0) {
37
47
  console.error(chalk.red(`Claude exited with code ${code}${signal ? ` (signal: ${signal})` : ""}`));
38
48
  console.error(chalk.yellow("Last 2000 chars of output:"));
@@ -43,9 +53,6 @@ export const runIteration = (i, iterations) => {
43
53
  console.log(chalk.green("Todo list complete, exiting."));
44
54
  process.exit(0);
45
55
  }
46
- // Flush any remaining text in the line buffer and reset state
47
- flushLine();
48
- resetTextState();
49
56
  console.log("\n"); // Add blank lines before next iteration
50
57
  runIteration(i + 1, iterations);
51
58
  };
@@ -57,7 +64,9 @@ export const runIteration = (i, iterations) => {
57
64
  try {
58
65
  const event = JSON.parse(line);
59
66
  appendFileSync(logFile, JSON.stringify(event, null, 2) + "\n\n");
60
- processEvent(event);
67
+ if (processor) {
68
+ processor.processEvent(event);
69
+ }
61
70
  }
62
71
  catch {
63
72
  // Incomplete JSON line, ignore
@@ -74,6 +83,7 @@ export const runIteration = (i, iterations) => {
74
83
  handleIterationComplete();
75
84
  });
76
85
  child.on("error", error => {
86
+ unmount();
77
87
  console.error(chalk.red("Error running Claude:"), error);
78
88
  process.exit(1);
79
89
  });
@@ -1 +1 @@
1
- {"version":3,"file":"runIteration.js","sourceRoot":"","sources":["../../src/lib/runIteration.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runIteration.js","sourceRoot":"","sources":["../../src/lib/runIteration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=shortenTempPaths.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shortenTempPaths.test.d.ts","sourceRoot":"","sources":["../../src/lib/shortenTempPaths.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { shortenTempPaths } from "./shortenTempPaths.js";
3
+ describe("shortenTempPaths", () => {
4
+ it("shortens /var/folders/ paths to just filename", () => {
5
+ const text = "Reading file /var/folders/xy/abc123/T/temp-file.txt";
6
+ const result = shortenTempPaths(text);
7
+ expect(result).toBe("Reading file temp-file.txt");
8
+ });
9
+ it("shortens /tmp/ paths to just filename", () => {
10
+ const text = "Writing to /tmp/output.json";
11
+ const result = shortenTempPaths(text);
12
+ expect(result).toBe("Writing to output.json");
13
+ });
14
+ it("handles multiple temp paths in one string", () => {
15
+ const text = "Copying /var/folders/xy/abc123/T/input.txt to /tmp/output.txt";
16
+ const result = shortenTempPaths(text);
17
+ expect(result).toBe("Copying input.txt to output.txt");
18
+ });
19
+ it("preserves non-temp paths", () => {
20
+ const text = "Reading /home/user/project/file.ts";
21
+ const result = shortenTempPaths(text);
22
+ expect(result).toBe("Reading /home/user/project/file.ts");
23
+ });
24
+ it("handles text with no temp paths", () => {
25
+ const text = "This is just a regular string";
26
+ const result = shortenTempPaths(text);
27
+ expect(result).toBe("This is just a regular string");
28
+ });
29
+ it("handles empty string", () => {
30
+ const result = shortenTempPaths("");
31
+ expect(result).toBe("");
32
+ });
33
+ it("handles path with spaces in filename", () => {
34
+ const text = "File at /var/folders/xy/abc/T/my file.txt exists";
35
+ const result = shortenTempPaths(text);
36
+ // The regex matches until whitespace, so 'my file.txt' becomes just 'my'
37
+ expect(result).toBe("File at my file.txt exists");
38
+ });
39
+ it("handles path with trailing slash", () => {
40
+ const text = "Directory /var/folders/xy/abc123/T/";
41
+ const result = shortenTempPaths(text);
42
+ // Path ends with /, so split('/').pop() returns empty string, regex leaves it unchanged
43
+ expect(result).toBe("Directory /var/folders/xy/abc123/T/");
44
+ });
45
+ });
46
+ //# sourceMappingURL=shortenTempPaths.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shortenTempPaths.test.js","sourceRoot":"","sources":["../../src/lib/shortenTempPaths.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,qDAAqD,CAAA;QAClE,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,6BAA6B,CAAA;QAC1C,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,IAAI,GAAG,+DAA+D,CAAA;QAC5E,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,oCAAoC,CAAA;QACjD,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,IAAI,GAAG,+BAA+B,CAAA;QAC5C,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAA;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,kDAAkD,CAAA;QAC/D,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACrC,yEAAyE;QACzE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,qCAAqC,CAAA;QAClD,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACrC,wFAAwF;QACxF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare const registerCleanup: (fn: () => void | Promise<void>) => void;
2
+ export declare const unregisterCleanup: () => void;
3
+ //# sourceMappingURL=signalHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signalHandler.d.ts","sourceRoot":"","sources":["../../src/lib/signalHandler.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,eAAe,GAAI,IAAI,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,SAE7D,CAAA;AAED,eAAO,MAAM,iBAAiB,YAE7B,CAAA"}