@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,15 @@
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ import BigText from "ink-big-text";
4
+ import Gradient from "ink-gradient";
5
+ export const Header = ({ claudeVersion, ralphVersion }) => {
6
+ return (React.createElement(Box, { flexDirection: "column", marginBottom: 1, borderStyle: "single", padding: 1, alignItems: "center" },
7
+ React.createElement(Gradient, { colors: ["#30A6E4", "#EBC635"] },
8
+ React.createElement(BigText, { text: "Ralph", font: "tiny" })),
9
+ React.createElement(Text, { dimColor: true },
10
+ "@herbcaudill/ralph v",
11
+ ralphVersion,
12
+ " \u2022 Claude Code v",
13
+ claudeVersion)));
14
+ };
15
+ //# sourceMappingURL=Header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,QAAQ,MAAM,cAAc,CAAA;AAEnC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EAAE,aAAa,EAAE,YAAY,EAAS,EAAE,EAAE;IAC/D,OAAO,CACL,oBAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,YAAY,EAAE,CAAC,EACf,WAAW,EAAC,QAAQ,EACpB,OAAO,EAAE,CAAC,EACV,UAAU,EAAC,QAAQ;QAEnB,oBAAC,QAAQ,IAAC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;YACtC,oBAAC,OAAO,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,MAAM,GAAG,CAC3B;QACX,oBAAC,IAAI,IAAC,QAAQ;;YACS,YAAY;;YAAkB,aAAa,CAC3D,CACH,CACP,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Header.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.test.d.ts","sourceRoot":"","sources":["../../src/components/Header.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import React from "react";
2
+ import { describe, it, expect } from "vitest";
3
+ import { render } from "ink-testing-library";
4
+ import { Header } from "./Header.js";
5
+ describe("Header", () => {
6
+ it("renders the title", () => {
7
+ const { lastFrame } = render(React.createElement(Header, { claudeVersion: "1.0.0", ralphVersion: "0.2.0" }));
8
+ const output = lastFrame();
9
+ // BigText renders ASCII art with ANSI codes
10
+ // Check for box-drawing characters or unicode that appear in the art
11
+ expect(output?.length).toBeGreaterThan(0);
12
+ expect(output).toContain("Claude Code");
13
+ });
14
+ it("displays both version numbers on the same line", () => {
15
+ const { lastFrame } = render(React.createElement(Header, { claudeVersion: "2.5.3", ralphVersion: "0.2.0" }));
16
+ const output = lastFrame();
17
+ expect(output).toContain("@herbcaudill/ralph v0.2.0");
18
+ expect(output).toContain("Claude Code v2.5.3");
19
+ expect(output).toContain("•");
20
+ });
21
+ it("displays versions with correct formatting", () => {
22
+ const { lastFrame } = render(React.createElement(Header, { claudeVersion: "1.0.0", ralphVersion: "0.1.0" }));
23
+ const output = lastFrame();
24
+ expect(output).toContain("@herbcaudill/ralph v0.1.0 • Claude Code v1.0.0");
25
+ });
26
+ });
27
+ //# sourceMappingURL=Header.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.test.js","sourceRoot":"","sources":["../../src/components/Header.test.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,MAAM,IAAC,aAAa,EAAC,OAAO,EAAC,YAAY,EAAC,OAAO,GAAG,CAAC,CAAA;QACnF,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,4CAA4C;QAC5C,qEAAqE;QACrE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,MAAM,IAAC,aAAa,EAAC,OAAO,EAAC,YAAY,EAAC,OAAO,GAAG,CAAC,CAAA;QACnF,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAA;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,MAAM,IAAC,aAAa,EAAC,OAAO,EAAC,YAAY,EAAC,OAAO,GAAG,CAAC,CAAA;QACnF,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gDAAgD,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ export declare const InitRalph: () => React.JSX.Element;
3
+ //# sourceMappingURL=InitRalph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InitRalph.d.ts","sourceRoot":"","sources":["../../src/components/InitRalph.tsx"],"names":[],"mappings":"AACA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAOlD,eAAO,MAAM,SAAS,yBA+GrB,CAAA"}
@@ -0,0 +1,100 @@
1
+ import { Text, Box } from "ink";
2
+ import React, { useEffect, useState } from "react";
3
+ import { existsSync, mkdirSync, copyFileSync } from "fs";
4
+ import { join, dirname } from "path";
5
+ import { fileURLToPath } from "url";
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ export const InitRalph = () => {
8
+ const [status, setStatus] = useState("checking");
9
+ const [createdFiles, setCreatedFiles] = useState([]);
10
+ const [errors, setErrors] = useState([]);
11
+ useEffect(() => {
12
+ const initialize = async () => {
13
+ const ralphDir = join(process.cwd(), ".ralph");
14
+ const templatesDir = join(__dirname, "..", "..", "templates");
15
+ const templates = ["prompt.md", "todo.md", "progress.md"];
16
+ // Check if .ralph exists and all files are present
17
+ if (existsSync(ralphDir)) {
18
+ const allFilesExist = templates.every(template => existsSync(join(ralphDir, template)));
19
+ if (allFilesExist) {
20
+ setStatus("exists");
21
+ return;
22
+ }
23
+ // If not all files exist, continue to create missing ones
24
+ }
25
+ setStatus("creating");
26
+ try {
27
+ mkdirSync(ralphDir, { recursive: true });
28
+ const created = [];
29
+ const failed = [];
30
+ for (const template of templates) {
31
+ const src = join(templatesDir, template);
32
+ const dest = join(ralphDir, template);
33
+ // Only copy if the destination doesn't exist
34
+ if (!existsSync(dest)) {
35
+ if (existsSync(src)) {
36
+ copyFileSync(src, dest);
37
+ created.push(template);
38
+ }
39
+ else {
40
+ failed.push(`Template not found: ${template}`);
41
+ }
42
+ }
43
+ }
44
+ setCreatedFiles(created);
45
+ setErrors(failed);
46
+ setStatus("done");
47
+ // Exit after a brief delay so user can see success message
48
+ setTimeout(() => process.exit(0), 100);
49
+ }
50
+ catch (error) {
51
+ setErrors([`Failed to initialize: ${error}`]);
52
+ setStatus("done");
53
+ setTimeout(() => process.exit(1), 100);
54
+ }
55
+ };
56
+ initialize();
57
+ }, []);
58
+ if (status === "checking") {
59
+ return React.createElement(Text, null, "Checking .ralph directory...");
60
+ }
61
+ if (status === "exists") {
62
+ return (React.createElement(Box, { flexDirection: "column" },
63
+ React.createElement(Text, { color: "yellow" }, "\u26A0\uFE0F .ralph directory already exists"),
64
+ React.createElement(Text, { dimColor: true }, "To reinitialize, remove the directory first: rm -rf .ralph")));
65
+ }
66
+ if (status === "creating") {
67
+ return React.createElement(Text, { color: "cyan" }, "Initializing ralph...");
68
+ }
69
+ return (React.createElement(Box, { flexDirection: "column" },
70
+ createdFiles.map(file => (React.createElement(Text, { key: file },
71
+ React.createElement(Text, { color: "green" }, "\u2713"),
72
+ " Created ",
73
+ React.createElement(Text, { dimColor: true },
74
+ ".ralph/",
75
+ file)))),
76
+ errors.map((error, i) => (React.createElement(Text, { key: i },
77
+ React.createElement(Text, { color: "red" }, "\u2717"),
78
+ " ",
79
+ error))),
80
+ errors.length === 0 && (React.createElement(React.Fragment, null,
81
+ React.createElement(Text, { color: "green" },
82
+ "\n",
83
+ "\u2713 Ralph initialized successfully!"),
84
+ React.createElement(Text, { bold: true },
85
+ "\n",
86
+ "Before running ralph, you need to:"),
87
+ React.createElement(Text, null,
88
+ React.createElement(Text, { color: "cyan" }, " 1. Edit .ralph/prompt.md"),
89
+ React.createElement(Text, { dimColor: true }, " - Add your project context and workflow instructions")),
90
+ React.createElement(Text, null,
91
+ React.createElement(Text, { color: "cyan" }, " 2. Edit .ralph/todo.md"),
92
+ React.createElement(Text, { dimColor: true }, " - Add the tasks you want Ralph to work on")),
93
+ React.createElement(Text, null,
94
+ React.createElement(Text, { bold: true },
95
+ "\n",
96
+ "Then run: "),
97
+ React.createElement(Text, { color: "cyan" }, "ralph"),
98
+ "\n")))));
99
+ };
100
+ //# sourceMappingURL=InitRalph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InitRalph.js","sourceRoot":"","sources":["../../src/components/InitRalph.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ export declare const IterationRunner: ({ totalIterations }: Props) => React.JSX.Element;
3
+ type Props = {
4
+ totalIterations: number;
5
+ };
6
+ export {};
7
+ //# sourceMappingURL=IterationRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IterationRunner.d.ts","sourceRoot":"","sources":["../../src/components/IterationRunner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAA;AA6B1D,eAAO,MAAM,eAAe,GAAI,qBAAqB,KAAK,sBAuTzD,CAAA;AAED,KAAK,KAAK,GAAG;IACX,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA"}
@@ -0,0 +1,286 @@
1
+ import React, { useState, useEffect, useRef } from "react";
2
+ import { Box, Text, useApp } from "ink";
3
+ import SelectInput from "ink-select-input";
4
+ import { execSync } from "child_process";
5
+ import { execa } from "execa";
6
+ import { appendFileSync, mkdirSync, existsSync } from "fs";
7
+ import { join } from "path";
8
+ import { EventDisplay } from "./EventDisplay.js";
9
+ import { getGitRoot } from "../lib/getGitRoot.js";
10
+ import { stashChanges } from "../lib/stashChanges.js";
11
+ import { popStash } from "../lib/popStash.js";
12
+ import { createWorktree } from "../lib/createWorktree.js";
13
+ import { copyRalphFilesToWorktree } from "../lib/copyRalphFilesToWorktree.js";
14
+ import { copyRalphFilesFromWorktree } from "../lib/copyRalphFilesFromWorktree.js";
15
+ import { mergeWorktreeToMain } from "../lib/mergeWorktreeToMain.js";
16
+ import { cleanupWorktree } from "../lib/cleanupWorktree.js";
17
+ import { installDependencies } from "../lib/installDependencies.js";
18
+ import { registerCleanup, unregisterCleanup } from "../lib/signalHandler.js";
19
+ const repoRoot = process.cwd();
20
+ const ralphDir = join(repoRoot, ".ralph");
21
+ const checkRequiredFiles = () => {
22
+ const requiredFiles = ["prompt.md", "todo.md", "progress.md"];
23
+ const missing = requiredFiles.filter(file => !existsSync(join(ralphDir, file)));
24
+ return { missing, exists: missing.length === 0 };
25
+ };
26
+ export const IterationRunner = ({ totalIterations }) => {
27
+ const { exit } = useApp();
28
+ const [currentIteration, setCurrentIteration] = useState(1);
29
+ const [events, setEvents] = useState([]);
30
+ const [output, setOutput] = useState("");
31
+ const [error, setError] = useState();
32
+ const [needsInit, setNeedsInit] = useState(null);
33
+ const [initializing, setInitializing] = useState(false);
34
+ // Use refs for worktree/stash state to avoid triggering effect re-runs
35
+ const currentWorktreeRef = useRef(null);
36
+ const hasStashedChangesRef = useRef(false);
37
+ const childProcessRef = useRef(null);
38
+ // Only use input handling if stdin supports raw mode
39
+ const stdinSupportsRawMode = process.stdin.isTTY === true;
40
+ // Cleanup function for worktrees and stash
41
+ const cleanup = () => {
42
+ try {
43
+ if (currentWorktreeRef.current) {
44
+ const gitRoot = getGitRoot(repoRoot);
45
+ cleanupWorktree(gitRoot, currentWorktreeRef.current);
46
+ currentWorktreeRef.current = null;
47
+ }
48
+ if (hasStashedChangesRef.current) {
49
+ const gitRoot = getGitRoot(repoRoot);
50
+ popStash(gitRoot);
51
+ hasStashedChangesRef.current = false;
52
+ }
53
+ }
54
+ catch (err) {
55
+ console.error(`Cleanup error: ${err}`);
56
+ }
57
+ };
58
+ // Register cleanup for SIGINT/SIGTERM (Ctrl+C)
59
+ useEffect(() => {
60
+ registerCleanup(async () => {
61
+ const child = childProcessRef.current;
62
+ if (child) {
63
+ child.kill("SIGTERM");
64
+ await child; // Wait for process to actually terminate
65
+ childProcessRef.current = null;
66
+ }
67
+ cleanup();
68
+ });
69
+ return () => {
70
+ unregisterCleanup();
71
+ };
72
+ }, []);
73
+ const handleInitSelection = (item) => {
74
+ if (item.value === "yes") {
75
+ setInitializing(true);
76
+ try {
77
+ // Run ralph init in a separate process
78
+ execSync("pnpm ralph init", { stdio: "inherit" });
79
+ setTimeout(() => {
80
+ exit();
81
+ process.exit(0);
82
+ }, 100);
83
+ }
84
+ catch (err) {
85
+ setError(`Failed to initialize: ${err instanceof Error ? err.message : String(err)}`);
86
+ setTimeout(() => {
87
+ exit();
88
+ process.exit(1);
89
+ }, 100);
90
+ }
91
+ }
92
+ else {
93
+ setTimeout(() => {
94
+ exit();
95
+ process.exit(1);
96
+ }, 100);
97
+ }
98
+ };
99
+ useEffect(() => {
100
+ if (currentIteration > totalIterations) {
101
+ // Clean up and exit
102
+ cleanup();
103
+ exit();
104
+ return;
105
+ }
106
+ // Check if required files exist
107
+ const { missing, exists } = checkRequiredFiles();
108
+ if (!exists) {
109
+ setNeedsInit(missing);
110
+ // If stdin doesn't support raw mode, exit after showing the message
111
+ if (!stdinSupportsRawMode) {
112
+ setTimeout(() => {
113
+ exit();
114
+ process.exit(1);
115
+ }, 100);
116
+ }
117
+ return;
118
+ }
119
+ let worktree = null;
120
+ try {
121
+ const gitRoot = getGitRoot(repoRoot);
122
+ // Stash changes before first iteration
123
+ if (currentIteration === 1) {
124
+ const hasChanges = stashChanges(gitRoot);
125
+ hasStashedChangesRef.current = hasChanges;
126
+ }
127
+ // Create worktree for this iteration
128
+ worktree = createWorktree(gitRoot);
129
+ currentWorktreeRef.current = worktree;
130
+ // Copy .ralph files to worktree
131
+ copyRalphFilesToWorktree(gitRoot, worktree.path);
132
+ // Install dependencies if package.json exists
133
+ installDependencies(worktree.path);
134
+ // Clear events for this iteration
135
+ setEvents([]);
136
+ setOutput("");
137
+ // Ensure .ralph directory exists in worktree
138
+ const worktreeRalphDir = join(worktree.path, ".ralph");
139
+ mkdirSync(worktreeRalphDir, { recursive: true });
140
+ const child = execa("claude", [
141
+ "--permission-mode",
142
+ "bypassPermissions",
143
+ "-p",
144
+ "@.ralph/prompt.md",
145
+ "@.ralph/todo.md",
146
+ "@.ralph/progress.md",
147
+ "--output-format",
148
+ "stream-json",
149
+ "--include-partial-messages",
150
+ "--verbose",
151
+ ], {
152
+ cwd: worktree.path,
153
+ stdin: "inherit",
154
+ stdout: "pipe",
155
+ stderr: "inherit",
156
+ reject: false, // Don't throw on non-zero exit
157
+ detached: true, // Run in new process group to prevent SIGINT propagation
158
+ });
159
+ childProcessRef.current = child;
160
+ let fullOutput = "";
161
+ const worktreeLogFile = join(worktree.path, ".ralph", "events.log");
162
+ // Handle streaming stdout
163
+ child.stdout?.on("data", (data) => {
164
+ const chunk = data.toString();
165
+ for (const line of chunk.split("\n")) {
166
+ if (!line.trim())
167
+ continue;
168
+ try {
169
+ const event = JSON.parse(line);
170
+ appendFileSync(worktreeLogFile, JSON.stringify(event, null, 2) + "\n\n");
171
+ setEvents(prev => [...prev, event]);
172
+ }
173
+ catch {
174
+ // Incomplete JSON line, ignore
175
+ }
176
+ }
177
+ fullOutput += chunk;
178
+ setOutput(fullOutput);
179
+ });
180
+ // Handle process completion
181
+ child.then(result => {
182
+ childProcessRef.current = null;
183
+ const gitRoot = getGitRoot(repoRoot);
184
+ // Handle error exit (but not if terminated by signal during cleanup)
185
+ if (result.exitCode !== 0 && !result.isTerminated) {
186
+ setError(`Claude exited with code ${result.exitCode}${result.signal ? ` (signal: ${result.signal})` : ""}\n\nLast 2000 chars:\n${fullOutput.slice(-2000)}`);
187
+ cleanupWorktree(gitRoot, worktree);
188
+ currentWorktreeRef.current = null;
189
+ setTimeout(() => {
190
+ cleanup();
191
+ exit();
192
+ process.exit(1);
193
+ }, 100);
194
+ return;
195
+ }
196
+ // If terminated during cleanup, don't proceed
197
+ if (result.isTerminated) {
198
+ return;
199
+ }
200
+ // Merge worktree changes back to main
201
+ try {
202
+ copyRalphFilesFromWorktree(gitRoot, worktree.path);
203
+ mergeWorktreeToMain(gitRoot, worktree);
204
+ cleanupWorktree(gitRoot, worktree);
205
+ currentWorktreeRef.current = null;
206
+ }
207
+ catch (err) {
208
+ setError(`Failed to merge worktree: ${err}`);
209
+ cleanupWorktree(gitRoot, worktree);
210
+ currentWorktreeRef.current = null;
211
+ setTimeout(() => {
212
+ cleanup();
213
+ exit();
214
+ process.exit(1);
215
+ }, 100);
216
+ return;
217
+ }
218
+ // Check if complete
219
+ if (fullOutput.includes("<promise>COMPLETE</promise>")) {
220
+ cleanup();
221
+ exit();
222
+ process.exit(0);
223
+ return;
224
+ }
225
+ // Move to next iteration
226
+ setTimeout(() => setCurrentIteration(i => i + 1), 500);
227
+ });
228
+ return () => {
229
+ child.kill();
230
+ childProcessRef.current = null;
231
+ };
232
+ }
233
+ catch (err) {
234
+ setError(`Failed to set up worktree: ${err}`);
235
+ if (worktree) {
236
+ try {
237
+ const gitRoot = getGitRoot(repoRoot);
238
+ cleanupWorktree(gitRoot, worktree);
239
+ currentWorktreeRef.current = null;
240
+ }
241
+ catch {
242
+ // Ignore cleanup errors
243
+ }
244
+ }
245
+ setTimeout(() => {
246
+ cleanup();
247
+ exit();
248
+ process.exit(1);
249
+ }, 100);
250
+ }
251
+ }, [currentIteration, totalIterations, exit]);
252
+ if (needsInit) {
253
+ if (initializing) {
254
+ return (React.createElement(Box, { flexDirection: "column", paddingY: 1 },
255
+ React.createElement(Text, { color: "cyan" }, "Initializing ralph...")));
256
+ }
257
+ return (React.createElement(Box, { flexDirection: "column", paddingY: 1 },
258
+ React.createElement(Text, { color: "yellow" }, "Missing required files in .ralph directory:"),
259
+ React.createElement(Box, { flexDirection: "column", paddingLeft: 2, paddingY: 1 }, needsInit.map(file => (React.createElement(Text, { key: file, dimColor: true },
260
+ "\u2022 ",
261
+ file)))),
262
+ React.createElement(Box, { marginTop: 1 }, stdinSupportsRawMode ?
263
+ React.createElement(React.Fragment, null,
264
+ React.createElement(Text, null, "Initialize now?"),
265
+ React.createElement(Box, { marginTop: 1 },
266
+ React.createElement(SelectInput, { items: [
267
+ { label: "Yes, initialize the project", value: "yes" },
268
+ { label: "No, exit", value: "no" },
269
+ ], onSelect: handleInitSelection })))
270
+ : React.createElement(Text, null,
271
+ "Run ",
272
+ React.createElement(Text, { color: "cyan" }, "ralph init"),
273
+ " to initialize the project."))));
274
+ }
275
+ if (error) {
276
+ return (React.createElement(Box, { flexDirection: "column" },
277
+ React.createElement(Text, { color: "red" }, error)));
278
+ }
279
+ return (React.createElement(Box, { flexDirection: "column" },
280
+ React.createElement(Box, { borderStyle: "round", borderColor: "cyan", paddingX: 1, marginTop: 1, marginBottom: 1 },
281
+ React.createElement(Text, { color: "cyan" },
282
+ "Iteration ",
283
+ currentIteration)),
284
+ React.createElement(EventDisplay, { events: events })));
285
+ };
286
+ //# sourceMappingURL=IterationRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IterationRunner.js","sourceRoot":"","sources":["../../src/components/IterationRunner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAC1D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AACvC,OAAO,WAAW,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,KAAK,EAAsB,MAAM,OAAO,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAA;AAC7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAA;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAE5E,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;AAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;AAEzC,MAAM,kBAAkB,GAAG,GAA2C,EAAE;IACtE,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;IAC7D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;IAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAA;AAClD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAE,eAAe,EAAS,EAAE,EAAE;IAC5D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAA;IACzB,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC3D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAiC,EAAE,CAAC,CAAA;IACxE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACxC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAU,CAAA;IAC5C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAkB,IAAI,CAAC,CAAA;IACjE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEvD,uEAAuE;IACvE,MAAM,kBAAkB,GAAG,MAAM,CAAsB,IAAI,CAAC,CAAA;IAC5D,MAAM,oBAAoB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC1C,MAAM,eAAe,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAA;IAE1D,qDAAqD;IACrD,MAAM,oBAAoB,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAA;IAEzD,2CAA2C;IAC3C,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,IAAI,CAAC;YACH,IAAI,kBAAkB,CAAC,OAAO,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;gBACpC,eAAe,CAAC,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAA;gBACpD,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAA;YACnC,CAAC;YACD,IAAI,oBAAoB,CAAC,OAAO,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;gBACpC,QAAQ,CAAC,OAAO,CAAC,CAAA;gBACjB,oBAAoB,CAAC,OAAO,GAAG,KAAK,CAAA;YACtC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAA;QACxC,CAAC;IACH,CAAC,CAAA;IAED,+CAA+C;IAC/C,SAAS,CAAC,GAAG,EAAE;QACb,eAAe,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAA;YACrC,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBACrB,MAAM,KAAK,CAAA,CAAC,yCAAyC;gBACrD,eAAe,CAAC,OAAO,GAAG,IAAI,CAAA;YAChC,CAAC;YACD,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE;YACV,iBAAiB,EAAE,CAAA;QACrB,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,mBAAmB,GAAG,CAAC,IAAuB,EAAE,EAAE;QACtD,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACzB,eAAe,CAAC,IAAI,CAAC,CAAA;YACrB,IAAI,CAAC;gBACH,uCAAuC;gBACvC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;gBACjD,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,EAAE,CAAA;oBACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,CAAC,EAAE,GAAG,CAAC,CAAA;YACT,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBACrF,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,EAAE,CAAA;oBACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,CAAC,EAAE,GAAG,CAAC,CAAA;YACT,CAAC;QACH,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,EAAE,CAAA;gBACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC,EAAE,GAAG,CAAC,CAAA;QACT,CAAC;IACH,CAAC,CAAA;IAED,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,gBAAgB,GAAG,eAAe,EAAE,CAAC;YACvC,oBAAoB;YACpB,OAAO,EAAE,CAAA;YACT,IAAI,EAAE,CAAA;YACN,OAAM;QACR,CAAC;QAED,gCAAgC;QAChC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAA;QAChD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,YAAY,CAAC,OAAO,CAAC,CAAA;YACrB,oEAAoE;YACpE,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,EAAE,CAAA;oBACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,CAAC,EAAE,GAAG,CAAC,CAAA;YACT,CAAC;YACD,OAAM;QACR,CAAC;QAED,IAAI,QAAQ,GAAwB,IAAI,CAAA;QAExC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;YAEpC,uCAAuC;YACvC,IAAI,gBAAgB,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;gBACxC,oBAAoB,CAAC,OAAO,GAAG,UAAU,CAAA;YAC3C,CAAC;YAED,qCAAqC;YACrC,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;YAClC,kBAAkB,CAAC,OAAO,GAAG,QAAQ,CAAA;YAErC,gCAAgC;YAChC,wBAAwB,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;YAEhD,8CAA8C;YAC9C,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;YAElC,kCAAkC;YAClC,SAAS,CAAC,EAAE,CAAC,CAAA;YACb,SAAS,CAAC,EAAE,CAAC,CAAA;YAEb,6CAA6C;YAC7C,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YACtD,SAAS,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAEhD,MAAM,KAAK,GAAG,KAAK,CACjB,QAAQ,EACR;gBACE,mBAAmB;gBACnB,mBAAmB;gBACnB,IAAI;gBACJ,mBAAmB;gBACnB,iBAAiB;gBACjB,qBAAqB;gBACrB,iBAAiB;gBACjB,aAAa;gBACb,4BAA4B;gBAC5B,WAAW;aACZ,EACD;gBACE,GAAG,EAAE,QAAQ,CAAC,IAAI;gBAClB,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,KAAK,EAAE,+BAA+B;gBAC9C,QAAQ,EAAE,IAAI,EAAE,yDAAyD;aAC1E,CACF,CAAA;YACD,eAAe,CAAC,OAAO,GAAG,KAAK,CAAA;YAE/B,IAAI,UAAU,GAAG,EAAE,CAAA;YACnB,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAA;YAEnE,0BAA0B;YAC1B,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACxC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;gBAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;wBAAE,SAAQ;oBAC1B,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;wBAC9B,cAAc,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAA;wBACxE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;oBACrC,CAAC;oBAAC,MAAM,CAAC;wBACP,+BAA+B;oBACjC,CAAC;gBACH,CAAC;gBACD,UAAU,IAAI,KAAK,CAAA;gBACnB,SAAS,CAAC,UAAU,CAAC,CAAA;YACvB,CAAC,CAAC,CAAA;YAEF,4BAA4B;YAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;gBAClB,eAAe,CAAC,OAAO,GAAG,IAAI,CAAA;gBAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;gBAEpC,qEAAqE;gBACrE,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;oBAClD,QAAQ,CACN,2BAA2B,MAAM,CAAC,QAAQ,GACxC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAClD,yBAAyB,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CACnD,CAAA;oBACD,eAAe,CAAC,OAAO,EAAE,QAAS,CAAC,CAAA;oBACnC,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAA;oBACjC,UAAU,CAAC,GAAG,EAAE;wBACd,OAAO,EAAE,CAAA;wBACT,IAAI,EAAE,CAAA;wBACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBACjB,CAAC,EAAE,GAAG,CAAC,CAAA;oBACP,OAAM;gBACR,CAAC;gBAED,8CAA8C;gBAC9C,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;oBACxB,OAAM;gBACR,CAAC;gBAED,sCAAsC;gBACtC,IAAI,CAAC;oBACH,0BAA0B,CAAC,OAAO,EAAE,QAAS,CAAC,IAAI,CAAC,CAAA;oBACnD,mBAAmB,CAAC,OAAO,EAAE,QAAS,CAAC,CAAA;oBACvC,eAAe,CAAC,OAAO,EAAE,QAAS,CAAC,CAAA;oBACnC,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAA;gBACnC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,QAAQ,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAA;oBAC5C,eAAe,CAAC,OAAO,EAAE,QAAS,CAAC,CAAA;oBACnC,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAA;oBACjC,UAAU,CAAC,GAAG,EAAE;wBACd,OAAO,EAAE,CAAA;wBACT,IAAI,EAAE,CAAA;wBACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBACjB,CAAC,EAAE,GAAG,CAAC,CAAA;oBACP,OAAM;gBACR,CAAC;gBAED,oBAAoB;gBACpB,IAAI,UAAU,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC;oBACvD,OAAO,EAAE,CAAA;oBACT,IAAI,EAAE,CAAA;oBACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBACf,OAAM;gBACR,CAAC;gBAED,yBAAyB;gBACzB,UAAU,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACxD,CAAC,CAAC,CAAA;YAEF,OAAO,GAAG,EAAE;gBACV,KAAK,CAAC,IAAI,EAAE,CAAA;gBACZ,eAAe,CAAC,OAAO,GAAG,IAAI,CAAA;YAChC,CAAC,CAAA;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAA;YAC7C,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;oBACpC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;oBAClC,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAA;gBACnC,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;gBAC1B,CAAC;YACH,CAAC;YACD,UAAU,CAAC,GAAG,EAAE;gBACd,OAAO,EAAE,CAAA;gBACT,IAAI,EAAE,CAAA;gBACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC,EAAE,GAAG,CAAC,CAAA;QACT,CAAC;IACH,CAAC,EAAE,CAAC,gBAAgB,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC,CAAA;IAE7C,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC;gBACrC,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,4BAA6B,CAC3C,CACP,CAAA;QACH,CAAC;QAED,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC;YACrC,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,kDAAmD;YACvE,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IACpD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CACrB,oBAAC,IAAI,IAAC,GAAG,EAAE,IAAI,EAAE,QAAQ;;gBACpB,IAAI,CACF,CACR,CAAC,CACE;YACN,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC,IACd,oBAAoB,CAAC,CAAC;gBACrB;oBACE,oBAAC,IAAI,0BAAuB;oBAC5B,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC;wBACf,oBAAC,WAAW,IACV,KAAK,EAAE;gCACL,EAAE,KAAK,EAAE,6BAA6B,EAAE,KAAK,EAAE,KAAK,EAAE;gCACtD,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE;6BACnC,EACD,QAAQ,EAAE,mBAAmB,GAC7B,CACE,CACL;gBACL,CAAC,CAAC,oBAAC,IAAI;;oBACC,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,iBAAkB;kDACnC,CAEL,CACF,CACP,CAAA;IACH,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;YACzB,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK,IAAE,KAAK,CAAQ,CAC5B,CACP,CAAA;IACH,CAAC;IAED,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACzB,oBAAC,GAAG,IAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;YACpF,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;;gBAAY,gBAAgB,CAAQ,CAClD;QACN,oBAAC,YAAY,IAAC,MAAM,EAAE,MAAM,GAAI,CAC5B,CACP,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IterationRunner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IterationRunner.test.d.ts","sourceRoot":"","sources":["../../src/components/IterationRunner.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,109 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { existsSync } from "fs";
3
+ // Note: Full integration testing of IterationRunner would require:
4
+ // 1. Mocking child_process.spawn to simulate Claude CLI
5
+ // 2. Mocking file system operations
6
+ // 3. Testing React component rendering with ink-testing-library
7
+ //
8
+ // These tests focus on the checkRequiredFiles logic which is the
9
+ // most testable pure function in the module.
10
+ // We'll test the logic by importing and mocking fs
11
+ vi.mock("fs", () => ({
12
+ existsSync: vi.fn(),
13
+ appendFileSync: vi.fn(),
14
+ writeFileSync: vi.fn(),
15
+ mkdirSync: vi.fn(),
16
+ }));
17
+ describe("IterationRunner file checking", () => {
18
+ beforeEach(() => {
19
+ vi.clearAllMocks();
20
+ });
21
+ afterEach(() => {
22
+ vi.restoreAllMocks();
23
+ });
24
+ it("detects all files exist", () => {
25
+ const mockExistsSync = existsSync;
26
+ mockExistsSync.mockReturnValue(true);
27
+ // Simulate the logic from checkRequiredFiles
28
+ const requiredFiles = ["prompt.md", "todo.md", "progress.md"];
29
+ const missing = requiredFiles.filter(file => !existsSync(file));
30
+ const exists = missing.length === 0;
31
+ expect(exists).toBe(true);
32
+ expect(missing).toEqual([]);
33
+ });
34
+ it("detects missing prompt.md", () => {
35
+ const mockExistsSync = existsSync;
36
+ mockExistsSync.mockImplementation((path) => {
37
+ return !path.includes("prompt.md");
38
+ });
39
+ const requiredFiles = ["prompt.md", "todo.md", "progress.md"];
40
+ const missing = requiredFiles.filter(file => !existsSync(file));
41
+ const exists = missing.length === 0;
42
+ expect(exists).toBe(false);
43
+ expect(missing).toContain("prompt.md");
44
+ });
45
+ it("detects multiple missing files", () => {
46
+ const mockExistsSync = existsSync;
47
+ mockExistsSync.mockReturnValue(false);
48
+ const requiredFiles = ["prompt.md", "todo.md", "progress.md"];
49
+ const missing = requiredFiles.filter(file => !existsSync(file));
50
+ const exists = missing.length === 0;
51
+ expect(exists).toBe(false);
52
+ expect(missing).toEqual(["prompt.md", "todo.md", "progress.md"]);
53
+ });
54
+ it("detects only todo.md exists", () => {
55
+ const mockExistsSync = existsSync;
56
+ mockExistsSync.mockImplementation((path) => {
57
+ return path.includes("todo.md");
58
+ });
59
+ const requiredFiles = ["prompt.md", "todo.md", "progress.md"];
60
+ const missing = requiredFiles.filter(file => !existsSync(file));
61
+ const exists = missing.length === 0;
62
+ expect(exists).toBe(false);
63
+ expect(missing).toEqual(["prompt.md", "progress.md"]);
64
+ expect(missing).not.toContain("todo.md");
65
+ });
66
+ });
67
+ // Note: For comprehensive integration tests, you would want to:
68
+ //
69
+ // 1. Test child process spawning:
70
+ // - Mock spawn() to return a fake ChildProcess
71
+ // - Emit data events to simulate Claude output
72
+ // - Test JSON parsing of events
73
+ // - Test COMPLETE promise detection
74
+ // - Test exit code handling
75
+ //
76
+ // 2. Test file operations:
77
+ // - Mock appendFileSync/writeFileSync
78
+ // - Verify events are logged correctly
79
+ // - Test log file creation
80
+ //
81
+ // 3. Test React rendering:
82
+ // - Use ink-testing-library to render component
83
+ // - Test initialization prompts
84
+ // - Test error display
85
+ // - Test iteration counter
86
+ //
87
+ // Example structure for a full integration test:
88
+ //
89
+ // import { render } from 'ink-testing-library'
90
+ // import { EventEmitter } from 'events'
91
+ //
92
+ // vi.mock('child_process', () => ({
93
+ // spawn: vi.fn(() => {
94
+ // const mockProcess = new EventEmitter()
95
+ // mockProcess.stdout = new EventEmitter()
96
+ // mockProcess.kill = vi.fn()
97
+ // return mockProcess
98
+ // })
99
+ // }))
100
+ //
101
+ // it('parses streaming JSON events', () => {
102
+ // const { lastFrame } = render(<IterationRunner totalIterations={1} />)
103
+ // const mockChild = getLastSpawnedProcess()
104
+ //
105
+ // mockChild.stdout.emit('data', Buffer.from('{"type":"assistant"}\n'))
106
+ //
107
+ // expect(lastFrame()).toContain('expected output')
108
+ // })
109
+ //# sourceMappingURL=IterationRunner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IterationRunner.test.js","sourceRoot":"","sources":["../../src/components/IterationRunner.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ export declare const ReplayLog: ({ filePath }: Props) => React.JSX.Element;
3
+ type Props = {
4
+ filePath: string;
5
+ };
6
+ export {};
7
+ //# sourceMappingURL=ReplayLog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReplayLog.d.ts","sourceRoot":"","sources":["../../src/components/ReplayLog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAKlD,eAAO,MAAM,SAAS,GAAI,cAAc,KAAK,sBAsD5C,CAAA;AAED,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA"}