@herbcaudill/ralph 0.2.0 → 0.3.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 +285 -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 +19 -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":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AACxD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AAEnC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAEzD,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE;IAC5B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA8C,UAAU,CAAC,CAAA;IAC7F,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAA;IAC9D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAA;IAElD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAA;YAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;YAC7D,MAAM,SAAS,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;YAEzD,mDAAmD;YACnD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;gBAEvF,IAAI,aAAa,EAAE,CAAC;oBAClB,SAAS,CAAC,QAAQ,CAAC,CAAA;oBACnB,OAAM;gBACR,CAAC;gBACD,0DAA0D;YAC5D,CAAC;YAED,SAAS,CAAC,UAAU,CAAC,CAAA;YAErB,IAAI,CAAC;gBACH,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;gBAExC,MAAM,OAAO,GAAa,EAAE,CAAA;gBAC5B,MAAM,MAAM,GAAa,EAAE,CAAA;gBAE3B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;oBACxC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;oBAErC,6CAA6C;oBAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;wBACtB,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;4BACpB,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;4BACvB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;wBACxB,CAAC;6BAAM,CAAC;4BACN,MAAM,CAAC,IAAI,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAA;wBAChD,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,eAAe,CAAC,OAAO,CAAC,CAAA;gBACxB,SAAS,CAAC,MAAM,CAAC,CAAA;gBACjB,SAAS,CAAC,MAAM,CAAC,CAAA;gBAEjB,2DAA2D;gBAC3D,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,CAAC,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC,CAAA;gBAC7C,SAAS,CAAC,MAAM,CAAC,CAAA;gBACjB,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACxC,CAAC;QACH,CAAC,CAAA;QAED,UAAU,EAAE,CAAA;IACd,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,OAAO,oBAAC,IAAI,uCAAoC,CAAA;IAClD,CAAC;IAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;YACzB,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,mDAA0C;YAC9D,oBAAC,IAAI,IAAC,QAAQ,uEAAkE,CAC5E,CACP,CAAA;IACH,CAAC;IAED,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,OAAO,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,4BAA6B,CAAA;IACxD,CAAC;IAED,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACxB,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CACxB,oBAAC,IAAI,IAAC,GAAG,EAAE,IAAI;YACb,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,aAAS;;YAAS,oBAAC,IAAI,IAAC,QAAQ;;gBAAS,IAAI,CAAQ,CACnE,CACR,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,oBAAC,IAAI,IAAC,GAAG,EAAE,CAAC;YACV,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK,aAAS;;YAAE,KAAK,CAC5B,CACR,CAAC;QACD,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CACtB;YACE,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO;gBAAE,IAAI;yDAAyC;YAClE,oBAAC,IAAI,IAAC,IAAI;gBAAE,IAAI;qDAA0C;YAC1D,oBAAC,IAAI;gBACH,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,gCAAiC;gBACnD,oBAAC,IAAI,IAAC,QAAQ,kEAA6D,CACtE;YACP,oBAAC,IAAI;gBACH,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,8BAA+B;gBACjD,oBAAC,IAAI,IAAC,QAAQ,uDAAkD,CAC3D;YACP,oBAAC,IAAI;gBACH,oBAAC,IAAI,IAAC,IAAI;oBAAE,IAAI;iCAAkB;gBAClC,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAa;gBAC9B,IAAI,CACA,CACN,CACJ,CACG,CACP,CAAA;AACH,CAAC,CAAA"}
@@ -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,sBAsTzD,CAAA;AAED,KAAK,KAAK,GAAG;IACX,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA"}
@@ -0,0 +1,285 @@
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
+ });
158
+ childProcessRef.current = child;
159
+ let fullOutput = "";
160
+ const worktreeLogFile = join(worktree.path, ".ralph", "events.log");
161
+ // Handle streaming stdout
162
+ child.stdout?.on("data", (data) => {
163
+ const chunk = data.toString();
164
+ for (const line of chunk.split("\n")) {
165
+ if (!line.trim())
166
+ continue;
167
+ try {
168
+ const event = JSON.parse(line);
169
+ appendFileSync(worktreeLogFile, JSON.stringify(event, null, 2) + "\n\n");
170
+ setEvents(prev => [...prev, event]);
171
+ }
172
+ catch {
173
+ // Incomplete JSON line, ignore
174
+ }
175
+ }
176
+ fullOutput += chunk;
177
+ setOutput(fullOutput);
178
+ });
179
+ // Handle process completion
180
+ child.then(result => {
181
+ childProcessRef.current = null;
182
+ const gitRoot = getGitRoot(repoRoot);
183
+ // Handle error exit (but not if terminated by signal during cleanup)
184
+ if (result.exitCode !== 0 && !result.isTerminated) {
185
+ setError(`Claude exited with code ${result.exitCode}${result.signal ? ` (signal: ${result.signal})` : ""}\n\nLast 2000 chars:\n${fullOutput.slice(-2000)}`);
186
+ cleanupWorktree(gitRoot, worktree);
187
+ currentWorktreeRef.current = null;
188
+ setTimeout(() => {
189
+ cleanup();
190
+ exit();
191
+ process.exit(1);
192
+ }, 100);
193
+ return;
194
+ }
195
+ // If terminated during cleanup, don't proceed
196
+ if (result.isTerminated) {
197
+ return;
198
+ }
199
+ // Merge worktree changes back to main
200
+ try {
201
+ copyRalphFilesFromWorktree(gitRoot, worktree.path);
202
+ mergeWorktreeToMain(gitRoot, worktree);
203
+ cleanupWorktree(gitRoot, worktree);
204
+ currentWorktreeRef.current = null;
205
+ }
206
+ catch (err) {
207
+ setError(`Failed to merge worktree: ${err}`);
208
+ cleanupWorktree(gitRoot, worktree);
209
+ currentWorktreeRef.current = null;
210
+ setTimeout(() => {
211
+ cleanup();
212
+ exit();
213
+ process.exit(1);
214
+ }, 100);
215
+ return;
216
+ }
217
+ // Check if complete
218
+ if (fullOutput.includes("<promise>COMPLETE</promise>")) {
219
+ cleanup();
220
+ exit();
221
+ process.exit(0);
222
+ return;
223
+ }
224
+ // Move to next iteration
225
+ setTimeout(() => setCurrentIteration(i => i + 1), 500);
226
+ });
227
+ return () => {
228
+ child.kill();
229
+ childProcessRef.current = null;
230
+ };
231
+ }
232
+ catch (err) {
233
+ setError(`Failed to set up worktree: ${err}`);
234
+ if (worktree) {
235
+ try {
236
+ const gitRoot = getGitRoot(repoRoot);
237
+ cleanupWorktree(gitRoot, worktree);
238
+ currentWorktreeRef.current = null;
239
+ }
240
+ catch {
241
+ // Ignore cleanup errors
242
+ }
243
+ }
244
+ setTimeout(() => {
245
+ cleanup();
246
+ exit();
247
+ process.exit(1);
248
+ }, 100);
249
+ }
250
+ }, [currentIteration, totalIterations, exit]);
251
+ if (needsInit) {
252
+ if (initializing) {
253
+ return (React.createElement(Box, { flexDirection: "column", paddingY: 1 },
254
+ React.createElement(Text, { color: "cyan" }, "Initializing ralph...")));
255
+ }
256
+ return (React.createElement(Box, { flexDirection: "column", paddingY: 1 },
257
+ React.createElement(Text, { color: "yellow" }, "Missing required files in .ralph directory:"),
258
+ React.createElement(Box, { flexDirection: "column", paddingLeft: 2, paddingY: 1 }, needsInit.map(file => (React.createElement(Text, { key: file, dimColor: true },
259
+ "\u2022 ",
260
+ file)))),
261
+ React.createElement(Box, { marginTop: 1 }, stdinSupportsRawMode ?
262
+ React.createElement(React.Fragment, null,
263
+ React.createElement(Text, null, "Initialize now?"),
264
+ React.createElement(Box, { marginTop: 1 },
265
+ React.createElement(SelectInput, { items: [
266
+ { label: "Yes, initialize the project", value: "yes" },
267
+ { label: "No, exit", value: "no" },
268
+ ], onSelect: handleInitSelection })))
269
+ : React.createElement(Text, null,
270
+ "Run ",
271
+ React.createElement(Text, { color: "cyan" }, "ralph init"),
272
+ " to initialize the project."))));
273
+ }
274
+ if (error) {
275
+ return (React.createElement(Box, { flexDirection: "column" },
276
+ React.createElement(Text, { color: "red" }, error)));
277
+ }
278
+ return (React.createElement(Box, { flexDirection: "column" },
279
+ React.createElement(Box, { borderStyle: "round", borderColor: "cyan", paddingX: 1, marginTop: 1, marginBottom: 1 },
280
+ React.createElement(Text, { color: "cyan" },
281
+ "Iteration ",
282
+ currentIteration)),
283
+ React.createElement(EventDisplay, { events: events })));
284
+ };
285
+ //# sourceMappingURL=IterationRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IterationRunner.js","sourceRoot":"","sources":["../../src/components/IterationRunner.tsx"],"names":[],"mappings":"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"}
@@ -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"}