@herbcaudill/ralph 0.6.5 → 0.7.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.
- package/README.md +13 -100
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +21 -7
- package/dist/cli.js.map +1 -1
- package/dist/components/App.d.ts +2 -1
- package/dist/components/App.d.ts.map +1 -1
- package/dist/components/App.js +5 -1
- package/dist/components/App.js.map +1 -1
- package/dist/components/InitRalph.js +5 -5
- package/dist/components/InitRalph.js.map +1 -1
- package/dist/components/IterationRunner.d.ts +1 -1
- package/dist/components/IterationRunner.d.ts.map +1 -1
- package/dist/components/IterationRunner.js +212 -56
- package/dist/components/IterationRunner.js.map +1 -1
- package/dist/components/IterationRunner.test.js +2 -2
- package/dist/components/IterationRunner.test.js.map +1 -1
- package/dist/components/JsonOutput.d.ts +14 -0
- package/dist/components/JsonOutput.d.ts.map +1 -0
- package/dist/components/JsonOutput.js +246 -0
- package/dist/components/JsonOutput.js.map +1 -0
- package/dist/components/ProgressBar.d.ts +7 -5
- package/dist/components/ProgressBar.d.ts.map +1 -1
- package/dist/components/ProgressBar.js +7 -5
- package/dist/components/ProgressBar.js.map +1 -1
- package/dist/components/ProgressBar.test.js +24 -11
- package/dist/components/ProgressBar.test.js.map +1 -1
- package/dist/lib/MessageQueue.d.ts +2 -0
- package/dist/lib/MessageQueue.d.ts.map +1 -1
- package/dist/lib/MessageQueue.js +35 -2
- package/dist/lib/MessageQueue.js.map +1 -1
- package/dist/lib/MessageQueue.test.js +146 -0
- package/dist/lib/MessageQueue.test.js.map +1 -1
- package/dist/lib/StdinCommandHandler.d.ts +42 -0
- package/dist/lib/StdinCommandHandler.d.ts.map +1 -0
- package/dist/lib/StdinCommandHandler.js +102 -0
- package/dist/lib/StdinCommandHandler.js.map +1 -0
- package/dist/lib/StdinCommandHandler.test.d.ts +2 -0
- package/dist/lib/StdinCommandHandler.test.d.ts.map +1 -0
- package/dist/lib/StdinCommandHandler.test.js +93 -0
- package/dist/lib/StdinCommandHandler.test.js.map +1 -0
- package/dist/lib/debug.d.ts +18 -0
- package/dist/lib/debug.d.ts.map +1 -0
- package/dist/lib/debug.js +44 -0
- package/dist/lib/debug.js.map +1 -0
- package/dist/lib/formatContentBlock.js +1 -1
- package/dist/lib/formatContentBlock.js.map +1 -1
- package/dist/lib/getNextLogFile.d.ts +12 -0
- package/dist/lib/getNextLogFile.d.ts.map +1 -0
- package/dist/lib/getNextLogFile.js +52 -0
- package/dist/lib/getNextLogFile.js.map +1 -0
- package/dist/lib/getNextLogFile.test.d.ts +2 -0
- package/dist/lib/getNextLogFile.test.d.ts.map +1 -0
- package/dist/lib/getNextLogFile.test.js +65 -0
- package/dist/lib/getNextLogFile.test.js.map +1 -0
- package/dist/lib/getOpenIssueCount.d.ts +11 -0
- package/dist/lib/getOpenIssueCount.d.ts.map +1 -0
- package/dist/lib/getOpenIssueCount.js +31 -0
- package/dist/lib/getOpenIssueCount.js.map +1 -0
- package/dist/lib/getOpenIssueCount.test.d.ts +2 -0
- package/dist/lib/getOpenIssueCount.test.d.ts.map +1 -0
- package/dist/lib/getOpenIssueCount.test.js +65 -0
- package/dist/lib/getOpenIssueCount.test.js.map +1 -0
- package/dist/lib/getProgress.d.ts +22 -6
- package/dist/lib/getProgress.d.ts.map +1 -1
- package/dist/lib/getProgress.js +69 -23
- package/dist/lib/getProgress.js.map +1 -1
- package/dist/lib/getProgress.test.js +68 -34
- package/dist/lib/getProgress.test.js.map +1 -1
- package/package.json +1 -1
- package/templates/prompt-beads.md +5 -5
- package/dist/lib/cleanupAllWorktrees.d.ts +0 -5
- package/dist/lib/cleanupAllWorktrees.d.ts.map +0 -1
- package/dist/lib/cleanupAllWorktrees.js +0 -23
- package/dist/lib/cleanupAllWorktrees.js.map +0 -1
- package/dist/lib/cleanupWorktree.d.ts +0 -6
- package/dist/lib/cleanupWorktree.d.ts.map +0 -1
- package/dist/lib/cleanupWorktree.js +0 -33
- package/dist/lib/cleanupWorktree.js.map +0 -1
- package/dist/lib/copyRalphFilesFromWorktree.d.ts +0 -5
- package/dist/lib/copyRalphFilesFromWorktree.d.ts.map +0 -1
- package/dist/lib/copyRalphFilesFromWorktree.js +0 -19
- package/dist/lib/copyRalphFilesFromWorktree.js.map +0 -1
- package/dist/lib/copyRalphFilesToWorktree.d.ts +0 -5
- package/dist/lib/copyRalphFilesToWorktree.d.ts.map +0 -1
- package/dist/lib/copyRalphFilesToWorktree.js +0 -21
- package/dist/lib/copyRalphFilesToWorktree.js.map +0 -1
- package/dist/lib/createWorktree.d.ts +0 -6
- package/dist/lib/createWorktree.d.ts.map +0 -1
- package/dist/lib/createWorktree.js +0 -33
- package/dist/lib/createWorktree.js.map +0 -1
- package/dist/lib/getGitRoot.d.ts +0 -5
- package/dist/lib/getGitRoot.d.ts.map +0 -1
- package/dist/lib/getGitRoot.js +0 -18
- package/dist/lib/getGitRoot.js.map +0 -1
- package/dist/lib/installDependencies.d.ts +0 -5
- package/dist/lib/installDependencies.d.ts.map +0 -1
- package/dist/lib/installDependencies.js +0 -23
- package/dist/lib/installDependencies.js.map +0 -1
- package/dist/lib/installDependencies.test.d.ts +0 -2
- package/dist/lib/installDependencies.test.d.ts.map +0 -1
- package/dist/lib/installDependencies.test.js +0 -37
- package/dist/lib/installDependencies.test.js.map +0 -1
- package/dist/lib/mergeWorktreeToMain.d.ts +0 -6
- package/dist/lib/mergeWorktreeToMain.d.ts.map +0 -1
- package/dist/lib/mergeWorktreeToMain.js +0 -54
- package/dist/lib/mergeWorktreeToMain.js.map +0 -1
- package/dist/lib/outputState.d.ts +0 -5
- package/dist/lib/outputState.d.ts.map +0 -1
- package/dist/lib/outputState.js +0 -6
- package/dist/lib/outputState.js.map +0 -1
- package/dist/lib/popStash.d.ts +0 -5
- package/dist/lib/popStash.d.ts.map +0 -1
- package/dist/lib/popStash.js +0 -17
- package/dist/lib/popStash.js.map +0 -1
- package/dist/lib/processEvent.d.ts +0 -2
- package/dist/lib/processEvent.d.ts.map +0 -1
- package/dist/lib/processEvent.js +0 -100
- package/dist/lib/processEvent.js.map +0 -1
- package/dist/lib/replayLog.d.ts +0 -2
- package/dist/lib/replayLog.d.ts.map +0 -1
- package/dist/lib/replayLog.js +0 -35
- package/dist/lib/replayLog.js.map +0 -1
- package/dist/lib/resolveConflicts.d.ts +0 -6
- package/dist/lib/resolveConflicts.d.ts.map +0 -1
- package/dist/lib/resolveConflicts.js +0 -76
- package/dist/lib/resolveConflicts.js.map +0 -1
- package/dist/lib/runIteration.d.ts +0 -2
- package/dist/lib/runIteration.d.ts.map +0 -1
- package/dist/lib/runIteration.js +0 -91
- package/dist/lib/runIteration.js.map +0 -1
- package/dist/lib/showToolUse.d.ts +0 -2
- package/dist/lib/showToolUse.d.ts.map +0 -1
- package/dist/lib/showToolUse.js +0 -17
- package/dist/lib/showToolUse.js.map +0 -1
- package/dist/lib/signalHandler.d.ts +0 -3
- package/dist/lib/signalHandler.d.ts.map +0 -1
- package/dist/lib/signalHandler.js +0 -23
- package/dist/lib/signalHandler.js.map +0 -1
- package/dist/lib/stashChanges.d.ts +0 -6
- package/dist/lib/stashChanges.d.ts.map +0 -1
- package/dist/lib/stashChanges.js +0 -27
- package/dist/lib/stashChanges.js.map +0 -1
- package/dist/lib/textFormatting.d.ts +0 -4
- package/dist/lib/textFormatting.d.ts.map +0 -1
- package/dist/lib/textFormatting.js +0 -94
- package/dist/lib/textFormatting.js.map +0 -1
- package/dist/lib/types.d.ts +0 -13
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/types.js +0 -15
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/worktree.d.ts +0 -43
- package/dist/lib/worktree.d.ts.map +0 -1
- package/dist/lib/worktree.js +0 -210
- package/dist/lib/worktree.js.map +0 -1
- package/dist/ui/EventProcessor.d.ts +0 -11
- package/dist/ui/EventProcessor.d.ts.map +0 -1
- package/dist/ui/EventProcessor.js +0 -95
- package/dist/ui/EventProcessor.js.map +0 -1
- package/dist/ui/IterationApp.d.ts +0 -10
- package/dist/ui/IterationApp.d.ts.map +0 -1
- package/dist/ui/IterationApp.js +0 -21
- package/dist/ui/IterationApp.js.map +0 -1
- package/dist/ui/IterationUI.d.ts +0 -13
- package/dist/ui/IterationUI.d.ts.map +0 -1
- package/dist/ui/IterationUI.js +0 -19
- package/dist/ui/IterationUI.js.map +0 -1
- package/dist/ui/TextDisplay.d.ts +0 -7
- package/dist/ui/TextDisplay.d.ts.map +0 -1
- package/dist/ui/TextDisplay.js +0 -41
- package/dist/ui/TextDisplay.js.map +0 -1
- package/dist/ui/ToolUseDisplay.d.ts +0 -10
- package/dist/ui/ToolUseDisplay.d.ts.map +0 -1
- package/dist/ui/ToolUseDisplay.js +0 -10
- package/dist/ui/ToolUseDisplay.js.map +0 -1
- /package/templates/{prompt.md → prompt-todos.md} +0 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import React, { useState, useEffect, useRef } from "react";
|
|
2
|
+
import { useApp, Text } from "ink";
|
|
3
|
+
import { writeFileSync, readFileSync, existsSync } from "fs";
|
|
4
|
+
import { join, dirname, basename } from "path";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
8
|
+
import { MessageQueue, createUserMessage } from "../lib/MessageQueue.js";
|
|
9
|
+
import { getProgress, captureStartupSnapshot } from "../lib/getProgress.js";
|
|
10
|
+
import { createDebugLogger } from "../lib/debug.js";
|
|
11
|
+
import { getNextLogFile } from "../lib/getNextLogFile.js";
|
|
12
|
+
import { createStdinCommandHandler } from "../lib/StdinCommandHandler.js";
|
|
13
|
+
const log = createDebugLogger("iteration");
|
|
14
|
+
const ralphDir = join(process.cwd(), ".ralph");
|
|
15
|
+
const promptFile = join(ralphDir, "prompt.md");
|
|
16
|
+
const todoFile = join(ralphDir, "todo.md");
|
|
17
|
+
const beadsDir = join(process.cwd(), ".beads");
|
|
18
|
+
const templatesDir = join(__dirname, "..", "..", "templates");
|
|
19
|
+
const repoName = basename(process.cwd());
|
|
20
|
+
/**
|
|
21
|
+
* Get the prompt content, falling back to templates if .ralph/prompt.md doesn't exist.
|
|
22
|
+
* Uses the appropriate template based on the project setup:
|
|
23
|
+
* - If .beads directory exists OR no .ralph/todo.md: use prompt-beads.md
|
|
24
|
+
* - If .ralph/todo.md exists: use prompt-todos.md (todo-based workflow)
|
|
25
|
+
*/
|
|
26
|
+
export const getPromptContent = () => {
|
|
27
|
+
// First, try to read from .ralph/prompt.md
|
|
28
|
+
if (existsSync(promptFile)) {
|
|
29
|
+
return readFileSync(promptFile, "utf-8");
|
|
30
|
+
}
|
|
31
|
+
// Fall back to templates based on project setup
|
|
32
|
+
const useBeadsTemplate = existsSync(beadsDir) || !existsSync(todoFile);
|
|
33
|
+
const templateFile = useBeadsTemplate ? "prompt-beads.md" : "prompt-todos.md";
|
|
34
|
+
const templatePath = join(templatesDir, templateFile);
|
|
35
|
+
if (existsSync(templatePath)) {
|
|
36
|
+
return readFileSync(templatePath, "utf-8");
|
|
37
|
+
}
|
|
38
|
+
// Last resort: return a minimal prompt
|
|
39
|
+
return "Work on the highest-priority task.";
|
|
40
|
+
};
|
|
41
|
+
// Output an event as newline-delimited JSON to stdout
|
|
42
|
+
const outputEvent = (event) => {
|
|
43
|
+
process.stdout.write(JSON.stringify(event) + "\n");
|
|
44
|
+
};
|
|
45
|
+
export const JsonOutput = ({ totalIterations }) => {
|
|
46
|
+
const { exit } = useApp();
|
|
47
|
+
const [currentIteration, setCurrentIteration] = useState(1);
|
|
48
|
+
const [error, setError] = useState();
|
|
49
|
+
const [isRunning, setIsRunning] = useState(false);
|
|
50
|
+
const [startupSnapshot] = useState(() => captureStartupSnapshot());
|
|
51
|
+
const messageQueueRef = useRef(null);
|
|
52
|
+
// Log file path for this run (set once at startup, persisted across iterations)
|
|
53
|
+
const logFileRef = useRef(null);
|
|
54
|
+
const [stopAfterCurrent, setStopAfterCurrent] = useState(false); // Stop gracefully after current iteration
|
|
55
|
+
const stopAfterCurrentRef = useRef(false); // Ref to access in async callbacks
|
|
56
|
+
const [isPaused, setIsPaused] = useState(false); // Pause after current iteration completes
|
|
57
|
+
const isPausedRef = useRef(false); // Ref to access in async callbacks
|
|
58
|
+
const stdinCleanupRef = useRef(null);
|
|
59
|
+
// Keep stopAfterCurrent ref in sync with state
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
stopAfterCurrentRef.current = stopAfterCurrent;
|
|
62
|
+
}, [stopAfterCurrent]);
|
|
63
|
+
// Keep isPaused ref in sync with state
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
isPausedRef.current = isPaused;
|
|
66
|
+
}, [isPaused]);
|
|
67
|
+
// Set up stdin command handler for receiving commands via piped input
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
const cleanup = createStdinCommandHandler(() => ({
|
|
70
|
+
messageQueue: messageQueueRef.current,
|
|
71
|
+
onStop: () => {
|
|
72
|
+
setStopAfterCurrent(true);
|
|
73
|
+
outputEvent({ type: "ralph_stop_requested" });
|
|
74
|
+
},
|
|
75
|
+
onPause: () => {
|
|
76
|
+
setIsPaused(true);
|
|
77
|
+
outputEvent({ type: "ralph_pause_requested" });
|
|
78
|
+
},
|
|
79
|
+
onResume: () => {
|
|
80
|
+
const wasPaused = isPausedRef.current;
|
|
81
|
+
setIsPaused(false);
|
|
82
|
+
outputEvent({ type: "ralph_resumed" });
|
|
83
|
+
// If we were paused between iterations, trigger the next iteration
|
|
84
|
+
if (wasPaused && !isRunning) {
|
|
85
|
+
setTimeout(() => setCurrentIteration(i => i + 1), 100);
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
onMessage: (text) => {
|
|
89
|
+
// Output event showing we received a message command
|
|
90
|
+
outputEvent({
|
|
91
|
+
type: "ralph_message_received",
|
|
92
|
+
text: text.slice(0, 100) + (text.length > 100 ? "..." : ""),
|
|
93
|
+
});
|
|
94
|
+
},
|
|
95
|
+
}));
|
|
96
|
+
stdinCleanupRef.current = cleanup;
|
|
97
|
+
return () => {
|
|
98
|
+
cleanup();
|
|
99
|
+
stdinCleanupRef.current = null;
|
|
100
|
+
};
|
|
101
|
+
}, []);
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
if (currentIteration > totalIterations) {
|
|
104
|
+
outputEvent({ type: "ralph_exit", reason: "max_iterations" });
|
|
105
|
+
exit();
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// Check if there are any tasks available before starting a round
|
|
109
|
+
const currentProgress = startupSnapshot ?
|
|
110
|
+
getProgress(startupSnapshot.initialCount, startupSnapshot.timestamp)
|
|
111
|
+
: { type: "none", completed: 0, total: 0 };
|
|
112
|
+
// All tasks are complete when completed equals total
|
|
113
|
+
if (currentProgress.completed >= currentProgress.total && currentProgress.type !== "none") {
|
|
114
|
+
outputEvent({ type: "ralph_exit", reason: "all_tasks_complete" });
|
|
115
|
+
exit();
|
|
116
|
+
process.exit(0);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
// Get or create the log file path for this run
|
|
120
|
+
// Only create a new sequential log file on the first iteration
|
|
121
|
+
if (!logFileRef.current) {
|
|
122
|
+
logFileRef.current = getNextLogFile();
|
|
123
|
+
writeFileSync(logFileRef.current, "");
|
|
124
|
+
}
|
|
125
|
+
// Read prompt (from .ralph/prompt.md or falling back to templates)
|
|
126
|
+
const promptContent = getPromptContent();
|
|
127
|
+
const todoExists = existsSync(todoFile);
|
|
128
|
+
const todoContent = todoExists ? readFileSync(todoFile, "utf-8") : "";
|
|
129
|
+
const fullPrompt = todoContent ? `${promptContent}\n\n## Current Todo List\n\n${todoContent}` : promptContent;
|
|
130
|
+
const abortController = new AbortController();
|
|
131
|
+
setIsRunning(true);
|
|
132
|
+
// Output iteration start event
|
|
133
|
+
outputEvent({
|
|
134
|
+
type: "ralph_iteration_start",
|
|
135
|
+
iteration: currentIteration,
|
|
136
|
+
totalIterations,
|
|
137
|
+
repo: repoName,
|
|
138
|
+
});
|
|
139
|
+
// Create a message queue for this iteration
|
|
140
|
+
const messageQueue = new MessageQueue();
|
|
141
|
+
messageQueueRef.current = messageQueue;
|
|
142
|
+
// Push the initial prompt as the first message
|
|
143
|
+
messageQueue.push(createUserMessage(fullPrompt));
|
|
144
|
+
const runQuery = async () => {
|
|
145
|
+
let finalResult = "";
|
|
146
|
+
log(`Starting iteration ${currentIteration}`);
|
|
147
|
+
try {
|
|
148
|
+
log(`Beginning query() loop`);
|
|
149
|
+
for await (const message of query({
|
|
150
|
+
prompt: messageQueue,
|
|
151
|
+
options: {
|
|
152
|
+
abortController,
|
|
153
|
+
permissionMode: "bypassPermissions",
|
|
154
|
+
allowDangerouslySkipPermissions: true,
|
|
155
|
+
includePartialMessages: false, // Only complete messages for JSON output
|
|
156
|
+
env: {
|
|
157
|
+
...process.env,
|
|
158
|
+
// Disable LSP plugins to avoid crashes when TypeScript LSP server errors
|
|
159
|
+
ENABLE_LSP_TOOL: "0",
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
})) {
|
|
163
|
+
log(`Received message type: ${message.type}`);
|
|
164
|
+
// Output the raw SDK message as JSON
|
|
165
|
+
outputEvent(message);
|
|
166
|
+
// Capture the final result message
|
|
167
|
+
if (message.type === "result" &&
|
|
168
|
+
"result" in message &&
|
|
169
|
+
typeof message.result === "string") {
|
|
170
|
+
log(`Received result message`);
|
|
171
|
+
finalResult = message.result;
|
|
172
|
+
// Close the message queue immediately when we get the result.
|
|
173
|
+
log(`Closing message queue on result`);
|
|
174
|
+
messageQueue.close();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
log(`query() loop completed normally`);
|
|
178
|
+
setIsRunning(false);
|
|
179
|
+
log(`Ensuring message queue is closed`);
|
|
180
|
+
messageQueue.close();
|
|
181
|
+
messageQueueRef.current = null;
|
|
182
|
+
// Output iteration end event
|
|
183
|
+
outputEvent({
|
|
184
|
+
type: "ralph_iteration_end",
|
|
185
|
+
iteration: currentIteration,
|
|
186
|
+
});
|
|
187
|
+
// Check for stop-after-current request
|
|
188
|
+
if (stopAfterCurrentRef.current) {
|
|
189
|
+
log(`Stop after current requested - exiting gracefully`);
|
|
190
|
+
outputEvent({ type: "ralph_exit", reason: "stop_requested" });
|
|
191
|
+
exit();
|
|
192
|
+
process.exit(0);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// Check for completion
|
|
196
|
+
if (finalResult.includes("<promise>COMPLETE</promise>")) {
|
|
197
|
+
outputEvent({ type: "ralph_exit", reason: "task_complete" });
|
|
198
|
+
exit();
|
|
199
|
+
process.exit(0);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
// Check for pause request - if paused, we wait for resume via stdin
|
|
203
|
+
if (isPausedRef.current) {
|
|
204
|
+
log(`Paused after iteration ${currentIteration}`);
|
|
205
|
+
outputEvent({ type: "ralph_paused", iteration: currentIteration });
|
|
206
|
+
// Don't move to next iteration - the resume handler will trigger it
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
// Move to next iteration
|
|
210
|
+
setTimeout(() => setCurrentIteration(i => i + 1), 500);
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
log(`query() loop error: ${err instanceof Error ? err.message : String(err)}`);
|
|
214
|
+
setIsRunning(false);
|
|
215
|
+
log(`Closing message queue after error`);
|
|
216
|
+
messageQueue.close();
|
|
217
|
+
messageQueueRef.current = null;
|
|
218
|
+
if (abortController.signal.aborted) {
|
|
219
|
+
log(`Abort signal detected`);
|
|
220
|
+
return; // Intentionally aborted
|
|
221
|
+
}
|
|
222
|
+
const errorMsg = `Error running Claude: ${err instanceof Error ? err.message : String(err)}`;
|
|
223
|
+
setError(errorMsg);
|
|
224
|
+
outputEvent({ type: "ralph_error", error: errorMsg });
|
|
225
|
+
setTimeout(() => {
|
|
226
|
+
exit();
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}, 100);
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
runQuery();
|
|
232
|
+
return () => {
|
|
233
|
+
log(`Cleanup: aborting and closing queue for iteration ${currentIteration}`);
|
|
234
|
+
abortController.abort();
|
|
235
|
+
messageQueue.close();
|
|
236
|
+
messageQueueRef.current = null;
|
|
237
|
+
};
|
|
238
|
+
}, [currentIteration, totalIterations, exit, startupSnapshot]);
|
|
239
|
+
// In JSON mode, we output to stdout, so no visual rendering needed
|
|
240
|
+
// Just return an empty component (Ink requires something to render)
|
|
241
|
+
if (error) {
|
|
242
|
+
return React.createElement(Text, null, "");
|
|
243
|
+
}
|
|
244
|
+
return React.createElement(Text, null, "");
|
|
245
|
+
};
|
|
246
|
+
//# sourceMappingURL=JsonOutput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonOutput.js","sourceRoot":"","sources":["../../src/components/JsonOutput.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
/**
|
|
3
3
|
* A simple progress bar component using Unicode block characters.
|
|
4
|
-
* Shows completion progress:
|
|
4
|
+
* Shows completion progress: completed / total
|
|
5
5
|
*/
|
|
6
|
-
export declare const ProgressBar: ({
|
|
6
|
+
export declare const ProgressBar: ({ completed, total, width, repoName }: Props) => React.JSX.Element | null;
|
|
7
7
|
type Props = {
|
|
8
|
-
/** Number of items
|
|
9
|
-
|
|
10
|
-
/** Total number of items
|
|
8
|
+
/** Number of items completed (closed issues or checked tasks) */
|
|
9
|
+
completed: number;
|
|
10
|
+
/** Total number of items seen since startup */
|
|
11
11
|
total: number;
|
|
12
12
|
/** Width of the progress bar in characters (default: 12) */
|
|
13
13
|
width?: number;
|
|
14
|
+
/** Repository name to display before the progress bar */
|
|
15
|
+
repoName?: string;
|
|
14
16
|
};
|
|
15
17
|
export {};
|
|
16
18
|
//# sourceMappingURL=ProgressBar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProgressBar.d.ts","sourceRoot":"","sources":["../../src/components/ProgressBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,
|
|
1
|
+
{"version":3,"file":"ProgressBar.d.ts","sourceRoot":"","sources":["../../src/components/ProgressBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,uCAA4C,KAAK,6BA6B5E,CAAA;AAED,KAAK,KAAK,GAAG;IACX,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAA;IACjB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAA;IACb,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA"}
|
|
@@ -2,20 +2,22 @@ import React from "react";
|
|
|
2
2
|
import { Text } from "ink";
|
|
3
3
|
/**
|
|
4
4
|
* A simple progress bar component using Unicode block characters.
|
|
5
|
-
* Shows completion progress:
|
|
5
|
+
* Shows completion progress: completed / total
|
|
6
6
|
*/
|
|
7
|
-
export const ProgressBar = ({
|
|
7
|
+
export const ProgressBar = ({ completed, total, width = 12, repoName }) => {
|
|
8
8
|
if (total === 0) {
|
|
9
9
|
return null;
|
|
10
10
|
}
|
|
11
|
-
// Progress is how much is done:
|
|
12
|
-
const progress = Math.min(1, Math.max(0,
|
|
11
|
+
// Progress is how much is done: completed / total
|
|
12
|
+
const progress = Math.min(1, Math.max(0, completed / total));
|
|
13
13
|
const filledWidth = Math.round(progress * width);
|
|
14
14
|
const emptyWidth = width - filledWidth;
|
|
15
15
|
const filled = "▰".repeat(filledWidth);
|
|
16
16
|
const empty = "▱".repeat(emptyWidth);
|
|
17
|
-
const completed = total - remaining;
|
|
18
17
|
return (React.createElement(Text, null,
|
|
18
|
+
repoName && (React.createElement(React.Fragment, null,
|
|
19
|
+
React.createElement(Text, { color: "cyan" }, repoName),
|
|
20
|
+
React.createElement(Text, { dimColor: true }, " \u2502 "))),
|
|
19
21
|
React.createElement(Text, { color: "yellow" }, filled),
|
|
20
22
|
React.createElement(Text, { dimColor: true }, empty),
|
|
21
23
|
React.createElement(Text, { dimColor: true },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProgressBar.js","sourceRoot":"","sources":["../../src/components/ProgressBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAE1B;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAS,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"ProgressBar.js","sourceRoot":"","sources":["../../src/components/ProgressBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAE1B;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,QAAQ,EAAS,EAAE,EAAE;IAC/E,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,kDAAkD;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC,CAAA;IAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAA;IAChD,MAAM,UAAU,GAAG,KAAK,GAAG,WAAW,CAAA;IAEtC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IACtC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAEpC,OAAO,CACL,oBAAC,IAAI;QACF,QAAQ,IAAI,CACX;YACE,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,IAAE,QAAQ,CAAQ;YACpC,oBAAC,IAAI,IAAC,QAAQ,qBAAW,CACxB,CACJ;QACD,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,IAAE,MAAM,CAAQ;QACpC,oBAAC,IAAI,IAAC,QAAQ,UAAE,KAAK,CAAQ;QAC7B,oBAAC,IAAI,IAAC,QAAQ;YACX,GAAG;YACH,SAAS;;YAAG,KAAK;YAAE,GAAG,CAClB,CACF,CACR,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -4,39 +4,52 @@ import { render } from "ink-testing-library";
|
|
|
4
4
|
import { ProgressBar } from "./ProgressBar.js";
|
|
5
5
|
describe("ProgressBar", () => {
|
|
6
6
|
it("renders nothing when total is 0", () => {
|
|
7
|
-
const { lastFrame } = render(React.createElement(ProgressBar, {
|
|
7
|
+
const { lastFrame } = render(React.createElement(ProgressBar, { completed: 0, total: 0 }));
|
|
8
8
|
expect(lastFrame()).toBe("");
|
|
9
9
|
});
|
|
10
|
-
it("shows empty bar when
|
|
11
|
-
const { lastFrame } = render(React.createElement(ProgressBar, {
|
|
10
|
+
it("shows empty bar when no tasks completed", () => {
|
|
11
|
+
const { lastFrame } = render(React.createElement(ProgressBar, { completed: 0, total: 10, width: 10 }));
|
|
12
12
|
const output = lastFrame();
|
|
13
13
|
expect(output).toContain("▱▱▱▱▱▱▱▱▱▱");
|
|
14
14
|
expect(output).toContain("0/10");
|
|
15
15
|
});
|
|
16
|
-
it("shows full bar when
|
|
17
|
-
const { lastFrame } = render(React.createElement(ProgressBar, {
|
|
16
|
+
it("shows full bar when all tasks completed", () => {
|
|
17
|
+
const { lastFrame } = render(React.createElement(ProgressBar, { completed: 10, total: 10, width: 10 }));
|
|
18
18
|
const output = lastFrame();
|
|
19
19
|
expect(output).toContain("▰▰▰▰▰▰▰▰▰▰");
|
|
20
20
|
expect(output).toContain("10/10");
|
|
21
21
|
});
|
|
22
|
-
it("shows half bar when half
|
|
23
|
-
const { lastFrame } = render(React.createElement(ProgressBar, {
|
|
22
|
+
it("shows half bar when half completed", () => {
|
|
23
|
+
const { lastFrame } = render(React.createElement(ProgressBar, { completed: 5, total: 10, width: 10 }));
|
|
24
24
|
const output = lastFrame();
|
|
25
25
|
expect(output).toContain("▰▰▰▰▰");
|
|
26
26
|
expect(output).toContain("▱▱▱▱▱");
|
|
27
27
|
expect(output).toContain("5/10");
|
|
28
28
|
});
|
|
29
29
|
it("respects custom width", () => {
|
|
30
|
-
const { lastFrame } = render(React.createElement(ProgressBar, {
|
|
30
|
+
const { lastFrame } = render(React.createElement(ProgressBar, { completed: 10, total: 10, width: 5 }));
|
|
31
31
|
const output = lastFrame();
|
|
32
32
|
// Should have 5 filled blocks
|
|
33
33
|
expect(output).toMatch(/▰{5}/);
|
|
34
34
|
});
|
|
35
35
|
it("clamps progress to 0-100%", () => {
|
|
36
|
-
// More
|
|
37
|
-
const { lastFrame } = render(React.createElement(ProgressBar, {
|
|
36
|
+
// More completed than total (shouldn't happen, but handle gracefully)
|
|
37
|
+
const { lastFrame } = render(React.createElement(ProgressBar, { completed: 15, total: 10, width: 10 }));
|
|
38
38
|
const output = lastFrame();
|
|
39
|
-
expect(output).toContain("
|
|
39
|
+
expect(output).toContain("▰▰▰▰▰▰▰▰▰▰");
|
|
40
|
+
});
|
|
41
|
+
it("displays repo name when provided", () => {
|
|
42
|
+
const { lastFrame } = render(React.createElement(ProgressBar, { completed: 5, total: 10, width: 10, repoName: "my-repo" }));
|
|
43
|
+
const output = lastFrame();
|
|
44
|
+
expect(output).toContain("my-repo");
|
|
45
|
+
expect(output).toContain("│");
|
|
46
|
+
expect(output).toContain("5/10");
|
|
47
|
+
});
|
|
48
|
+
it("does not display repo name when not provided", () => {
|
|
49
|
+
const { lastFrame } = render(React.createElement(ProgressBar, { completed: 5, total: 10, width: 10 }));
|
|
50
|
+
const output = lastFrame();
|
|
51
|
+
expect(output).not.toContain("│");
|
|
52
|
+
expect(output).toContain("5/10");
|
|
40
53
|
});
|
|
41
54
|
});
|
|
42
55
|
//# sourceMappingURL=ProgressBar.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProgressBar.test.js","sourceRoot":"","sources":["../../src/components/ProgressBar.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,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAI,CAAC,CAAA;QACrE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"ProgressBar.test.js","sourceRoot":"","sources":["../../src/components/ProgressBar.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,8 +7,10 @@ export declare class MessageQueue implements AsyncIterable<SDKUserMessage> {
|
|
|
7
7
|
private queue;
|
|
8
8
|
private resolvers;
|
|
9
9
|
private closed;
|
|
10
|
+
private nextCallCount;
|
|
10
11
|
push(message: SDKUserMessage): void;
|
|
11
12
|
close(): void;
|
|
13
|
+
private getMessagePreview;
|
|
12
14
|
[Symbol.asyncIterator](): AsyncIterator<SDKUserMessage>;
|
|
13
15
|
}
|
|
14
16
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageQueue.d.ts","sourceRoot":"","sources":["../../src/lib/MessageQueue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"MessageQueue.d.ts","sourceRoot":"","sources":["../../src/lib/MessageQueue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAKpE;;;GAGG;AACH,qBAAa,YAAa,YAAW,aAAa,CAAC,cAAc,CAAC;IAChE,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,SAAS,CAA8D;IAC/E,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,aAAa,CAAI;IAEzB,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAmBnC,KAAK,IAAI,IAAI;IAgBb,OAAO,CAAC,iBAAiB;IAYzB,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,cAAc,CAAC;CAwBxD;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,cAQ/C,CAAA"}
|
package/dist/lib/MessageQueue.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { createDebugLogger } from "./debug.js";
|
|
2
|
+
const log = createDebugLogger("messagequeue");
|
|
1
3
|
/**
|
|
2
4
|
* A message queue that can be used as an async iterable for the SDK's streamInput.
|
|
3
5
|
* Allows pushing messages dynamically while iterating.
|
|
@@ -6,34 +8,65 @@ export class MessageQueue {
|
|
|
6
8
|
queue = [];
|
|
7
9
|
resolvers = [];
|
|
8
10
|
closed = false;
|
|
11
|
+
nextCallCount = 0;
|
|
9
12
|
push(message) {
|
|
10
|
-
|
|
13
|
+
const messagePreview = this.getMessagePreview(message);
|
|
14
|
+
log(`push() called with message: ${messagePreview}`);
|
|
15
|
+
if (this.closed) {
|
|
16
|
+
log(`push() ignored - queue is closed`);
|
|
11
17
|
return;
|
|
18
|
+
}
|
|
12
19
|
if (this.resolvers.length > 0) {
|
|
13
20
|
const resolve = this.resolvers.shift();
|
|
21
|
+
log(`push() resolving pending next() call (${this.resolvers.length} resolvers remaining)`);
|
|
14
22
|
resolve({ value: message, done: false });
|
|
15
23
|
}
|
|
16
24
|
else {
|
|
17
25
|
this.queue.push(message);
|
|
26
|
+
log(`push() added to queue (queue length: ${this.queue.length})`);
|
|
18
27
|
}
|
|
19
28
|
}
|
|
20
29
|
close() {
|
|
30
|
+
if (this.closed) {
|
|
31
|
+
log(`close() called but already closed - no-op`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
log(`close() called - resolving ${this.resolvers.length} pending resolvers`);
|
|
21
35
|
this.closed = true;
|
|
22
36
|
// Resolve any pending iterators
|
|
23
37
|
for (const resolve of this.resolvers) {
|
|
38
|
+
log(`close() resolving pending resolver with done=true`);
|
|
24
39
|
resolve({ value: undefined, done: true });
|
|
25
40
|
}
|
|
26
41
|
this.resolvers = [];
|
|
42
|
+
log(`close() complete`);
|
|
43
|
+
}
|
|
44
|
+
getMessagePreview(message) {
|
|
45
|
+
const content = message.message?.content;
|
|
46
|
+
if (Array.isArray(content) && content.length > 0) {
|
|
47
|
+
const firstBlock = content[0];
|
|
48
|
+
if ("text" in firstBlock && typeof firstBlock.text === "string") {
|
|
49
|
+
const text = firstBlock.text.slice(0, 50);
|
|
50
|
+
return text.length < firstBlock.text.length ? `"${text}..."` : `"${text}"`;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return `[${message.type} message]`;
|
|
27
54
|
}
|
|
28
55
|
[Symbol.asyncIterator]() {
|
|
29
56
|
return {
|
|
30
57
|
next: () => {
|
|
58
|
+
this.nextCallCount++;
|
|
59
|
+
const callId = this.nextCallCount;
|
|
31
60
|
if (this.queue.length > 0) {
|
|
32
|
-
|
|
61
|
+
const message = this.queue.shift();
|
|
62
|
+
log(`next() #${callId}: returning queued message (${this.queue.length} remaining)`);
|
|
63
|
+
return Promise.resolve({ value: message, done: false });
|
|
33
64
|
}
|
|
34
65
|
if (this.closed) {
|
|
66
|
+
log(`next() #${callId}: queue closed, returning done=true`);
|
|
35
67
|
return Promise.resolve({ value: undefined, done: true });
|
|
36
68
|
}
|
|
69
|
+
log(`next() #${callId}: queue empty, creating pending resolver (${this.resolvers.length + 1} total)`);
|
|
37
70
|
return new Promise(resolve => {
|
|
38
71
|
this.resolvers.push(resolve);
|
|
39
72
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageQueue.js","sourceRoot":"","sources":["../../src/lib/MessageQueue.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MessageQueue.js","sourceRoot":"","sources":["../../src/lib/MessageQueue.ts"],"names":[],"mappings":"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"}
|