@herbcaudill/ralph 1.0.1 → 1.0.2
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/dist/index.js +2401 -6
- package/dist/index.js.map +1 -1
- package/package.json +9 -8
- package/templates/core-prompt.md +3 -3
- package/templates/workflow.md +1 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -102
- package/dist/cli.js.map +0 -1
- package/dist/components/App.d.ts +0 -17
- package/dist/components/App.d.ts.map +0 -1
- package/dist/components/App.js +0 -18
- package/dist/components/App.js.map +0 -1
- package/dist/components/EnhancedTextInput.d.ts +0 -22
- package/dist/components/EnhancedTextInput.d.ts.map +0 -1
- package/dist/components/EnhancedTextInput.js +0 -130
- package/dist/components/EnhancedTextInput.js.map +0 -1
- package/dist/components/EnhancedTextInput.test.d.ts +0 -2
- package/dist/components/EnhancedTextInput.test.d.ts.map +0 -1
- package/dist/components/EnhancedTextInput.test.js +0 -99
- package/dist/components/EnhancedTextInput.test.js.map +0 -1
- package/dist/components/EventDisplay.d.ts +0 -14
- package/dist/components/EventDisplay.d.ts.map +0 -1
- package/dist/components/EventDisplay.js +0 -91
- package/dist/components/EventDisplay.js.map +0 -1
- package/dist/components/EventDisplay.replay.test.d.ts +0 -2
- package/dist/components/EventDisplay.replay.test.d.ts.map +0 -1
- package/dist/components/EventDisplay.replay.test.js +0 -379
- package/dist/components/EventDisplay.replay.test.js.map +0 -1
- package/dist/components/EventDisplay.test.d.ts +0 -2
- package/dist/components/EventDisplay.test.d.ts.map +0 -1
- package/dist/components/EventDisplay.test.js +0 -349
- package/dist/components/EventDisplay.test.js.map +0 -1
- package/dist/components/FullScreenLayout.d.ts +0 -15
- package/dist/components/FullScreenLayout.d.ts.map +0 -1
- package/dist/components/FullScreenLayout.js +0 -20
- package/dist/components/FullScreenLayout.js.map +0 -1
- package/dist/components/Header.d.ts +0 -10
- package/dist/components/Header.d.ts.map +0 -1
- package/dist/components/Header.js +0 -22
- package/dist/components/Header.js.map +0 -1
- package/dist/components/Header.test.d.ts +0 -2
- package/dist/components/Header.test.d.ts.map +0 -1
- package/dist/components/Header.test.js +0 -27
- package/dist/components/Header.test.js.map +0 -1
- package/dist/components/InitRalph.d.ts +0 -8
- package/dist/components/InitRalph.d.ts.map +0 -1
- package/dist/components/InitRalph.js +0 -136
- package/dist/components/InitRalph.js.map +0 -1
- package/dist/components/IterationRunner.d.ts +0 -10
- package/dist/components/IterationRunner.d.ts.map +0 -1
- package/dist/components/IterationRunner.js +0 -536
- package/dist/components/IterationRunner.js.map +0 -1
- package/dist/components/IterationRunner.test.d.ts +0 -46
- package/dist/components/IterationRunner.test.d.ts.map +0 -1
- package/dist/components/IterationRunner.test.js +0 -69
- package/dist/components/IterationRunner.test.js.map +0 -1
- package/dist/components/IterationRunner.types.d.ts +0 -30
- package/dist/components/IterationRunner.types.d.ts.map +0 -1
- package/dist/components/IterationRunner.types.js +0 -2
- package/dist/components/IterationRunner.types.js.map +0 -1
- package/dist/components/JsonOutput.d.ts +0 -13
- package/dist/components/JsonOutput.d.ts.map +0 -1
- package/dist/components/JsonOutput.js +0 -269
- package/dist/components/JsonOutput.js.map +0 -1
- package/dist/components/JsonOutput.test.d.ts +0 -2
- package/dist/components/JsonOutput.test.d.ts.map +0 -1
- package/dist/components/JsonOutput.test.js +0 -39
- package/dist/components/JsonOutput.test.js.map +0 -1
- package/dist/components/ProgressBar.d.ts +0 -18
- package/dist/components/ProgressBar.d.ts.map +0 -1
- package/dist/components/ProgressBar.js +0 -30
- package/dist/components/ProgressBar.js.map +0 -1
- package/dist/components/ProgressBar.test.d.ts +0 -2
- package/dist/components/ProgressBar.test.d.ts.map +0 -1
- package/dist/components/ProgressBar.test.js +0 -55
- package/dist/components/ProgressBar.test.js.map +0 -1
- package/dist/components/ReplayLog.d.ts +0 -7
- package/dist/components/ReplayLog.d.ts.map +0 -1
- package/dist/components/ReplayLog.js +0 -57
- package/dist/components/ReplayLog.js.map +0 -1
- package/dist/components/StreamingText.d.ts +0 -11
- package/dist/components/StreamingText.d.ts.map +0 -1
- package/dist/components/StreamingText.js +0 -37
- package/dist/components/StreamingText.js.map +0 -1
- package/dist/components/StreamingText.test.d.ts +0 -2
- package/dist/components/StreamingText.test.d.ts.map +0 -1
- package/dist/components/StreamingText.test.js +0 -125
- package/dist/components/StreamingText.test.js.map +0 -1
- package/dist/components/ToolUse.d.ts +0 -16
- package/dist/components/ToolUse.d.ts.map +0 -1
- package/dist/components/ToolUse.js +0 -11
- package/dist/components/ToolUse.js.map +0 -1
- package/dist/components/ToolUse.test.d.ts +0 -2
- package/dist/components/ToolUse.test.d.ts.map +0 -1
- package/dist/components/ToolUse.test.js +0 -43
- package/dist/components/ToolUse.test.js.map +0 -1
- package/dist/components/blocksToLines.d.ts +0 -6
- package/dist/components/blocksToLines.d.ts.map +0 -1
- package/dist/components/blocksToLines.js +0 -15
- package/dist/components/blocksToLines.js.map +0 -1
- package/dist/components/eventToBlocks.d.ts +0 -22
- package/dist/components/eventToBlocks.d.ts.map +0 -1
- package/dist/components/eventToBlocks.js +0 -166
- package/dist/components/eventToBlocks.js.map +0 -1
- package/dist/components/eventToBlocks.test.d.ts +0 -2
- package/dist/components/eventToBlocks.test.d.ts.map +0 -1
- package/dist/components/eventToBlocks.test.js +0 -466
- package/dist/components/eventToBlocks.test.js.map +0 -1
- package/dist/components/findNextWordBoundary.d.ts +0 -10
- package/dist/components/findNextWordBoundary.d.ts.map +0 -1
- package/dist/components/findNextWordBoundary.js +0 -23
- package/dist/components/findNextWordBoundary.js.map +0 -1
- package/dist/components/findPreviousWordBoundary.d.ts +0 -10
- package/dist/components/findPreviousWordBoundary.d.ts.map +0 -1
- package/dist/components/findPreviousWordBoundary.js +0 -23
- package/dist/components/findPreviousWordBoundary.js.map +0 -1
- package/dist/components/processEvents.d.ts +0 -11
- package/dist/components/processEvents.d.ts.map +0 -1
- package/dist/components/processEvents.js +0 -87
- package/dist/components/processEvents.js.map +0 -1
- package/dist/components/renderStaticItem.d.ts +0 -7
- package/dist/components/renderStaticItem.d.ts.map +0 -1
- package/dist/components/renderStaticItem.js +0 -23
- package/dist/components/renderStaticItem.js.map +0 -1
- package/dist/components/replay.d.ts +0 -5
- package/dist/components/replay.d.ts.map +0 -1
- package/dist/components/replay.js +0 -49
- package/dist/components/replay.js.map +0 -1
- package/dist/components/test-helpers/ControlledInput.d.ts +0 -14
- package/dist/components/test-helpers/ControlledInput.d.ts.map +0 -1
- package/dist/components/test-helpers/ControlledInput.js +0 -15
- package/dist/components/test-helpers/ControlledInput.js.map +0 -1
- package/dist/components/useContentHeight.d.ts +0 -9
- package/dist/components/useContentHeight.d.ts.map +0 -1
- package/dist/components/useContentHeight.js +0 -16
- package/dist/components/useContentHeight.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/lib/MessageQueue.d.ts +0 -33
- package/dist/lib/MessageQueue.d.ts.map +0 -1
- package/dist/lib/MessageQueue.js +0 -96
- package/dist/lib/MessageQueue.js.map +0 -1
- package/dist/lib/MessageQueue.test.d.ts +0 -2
- package/dist/lib/MessageQueue.test.d.ts.map +0 -1
- package/dist/lib/MessageQueue.test.js +0 -224
- package/dist/lib/MessageQueue.test.js.map +0 -1
- package/dist/lib/StdinCommandHandler.d.ts +0 -48
- package/dist/lib/StdinCommandHandler.d.ts.map +0 -1
- package/dist/lib/StdinCommandHandler.js +0 -95
- package/dist/lib/StdinCommandHandler.js.map +0 -1
- package/dist/lib/StdinCommandHandler.test.d.ts +0 -2
- package/dist/lib/StdinCommandHandler.test.d.ts.map +0 -1
- package/dist/lib/StdinCommandHandler.test.js +0 -93
- package/dist/lib/StdinCommandHandler.test.js.map +0 -1
- package/dist/lib/WorktreeManager.d.ts +0 -114
- package/dist/lib/WorktreeManager.d.ts.map +0 -1
- package/dist/lib/WorktreeManager.js +0 -350
- package/dist/lib/WorktreeManager.js.map +0 -1
- package/dist/lib/WorktreeManager.test.d.ts +0 -2
- package/dist/lib/WorktreeManager.test.d.ts.map +0 -1
- package/dist/lib/WorktreeManager.test.js +0 -261
- package/dist/lib/WorktreeManager.test.js.map +0 -1
- package/dist/lib/addTodo.d.ts +0 -11
- package/dist/lib/addTodo.d.ts.map +0 -1
- package/dist/lib/addTodo.js +0 -51
- package/dist/lib/addTodo.js.map +0 -1
- package/dist/lib/beadsClient.d.ts +0 -46
- package/dist/lib/beadsClient.d.ts.map +0 -1
- package/dist/lib/beadsClient.js +0 -172
- package/dist/lib/beadsClient.js.map +0 -1
- package/dist/lib/captureBeadsSnapshot.d.ts +0 -4
- package/dist/lib/captureBeadsSnapshot.d.ts.map +0 -1
- package/dist/lib/captureBeadsSnapshot.js +0 -24
- package/dist/lib/captureBeadsSnapshot.js.map +0 -1
- package/dist/lib/captureStartupSnapshot.d.ts +0 -10
- package/dist/lib/captureStartupSnapshot.d.ts.map +0 -1
- package/dist/lib/captureStartupSnapshot.js +0 -29
- package/dist/lib/captureStartupSnapshot.js.map +0 -1
- package/dist/lib/captureTodoSnapshot.d.ts +0 -4
- package/dist/lib/captureTodoSnapshot.d.ts.map +0 -1
- package/dist/lib/captureTodoSnapshot.js +0 -24
- package/dist/lib/captureTodoSnapshot.js.map +0 -1
- package/dist/lib/copyTemplates.d.ts +0 -22
- package/dist/lib/copyTemplates.d.ts.map +0 -1
- package/dist/lib/copyTemplates.js +0 -32
- package/dist/lib/copyTemplates.js.map +0 -1
- package/dist/lib/createStdinCommandHandler.d.ts +0 -28
- package/dist/lib/createStdinCommandHandler.d.ts.map +0 -1
- package/dist/lib/createStdinCommandHandler.js +0 -67
- package/dist/lib/createStdinCommandHandler.js.map +0 -1
- package/dist/lib/createUserMessage.d.ts +0 -6
- package/dist/lib/createUserMessage.d.ts.map +0 -1
- package/dist/lib/createUserMessage.js +0 -13
- package/dist/lib/createUserMessage.js.map +0 -1
- package/dist/lib/debug.d.ts +0 -19
- package/dist/lib/debug.d.ts.map +0 -1
- package/dist/lib/debug.js +0 -54
- package/dist/lib/debug.js.map +0 -1
- package/dist/lib/findMaxLogNumber.d.ts +0 -6
- package/dist/lib/findMaxLogNumber.d.ts.map +0 -1
- package/dist/lib/findMaxLogNumber.js +0 -26
- package/dist/lib/findMaxLogNumber.js.map +0 -1
- package/dist/lib/findMaxLogNumber.test.d.ts +0 -2
- package/dist/lib/findMaxLogNumber.test.d.ts.map +0 -1
- package/dist/lib/findMaxLogNumber.test.js +0 -39
- package/dist/lib/findMaxLogNumber.test.js.map +0 -1
- package/dist/lib/formatContentBlock.d.ts +0 -6
- package/dist/lib/formatContentBlock.d.ts.map +0 -1
- package/dist/lib/formatContentBlock.js +0 -18
- package/dist/lib/formatContentBlock.js.map +0 -1
- package/dist/lib/formatIterationHeader.d.ts +0 -5
- package/dist/lib/formatIterationHeader.d.ts.map +0 -1
- package/dist/lib/formatIterationHeader.js +0 -8
- package/dist/lib/formatIterationHeader.js.map +0 -1
- package/dist/lib/formatText.d.ts +0 -5
- package/dist/lib/formatText.d.ts.map +0 -1
- package/dist/lib/formatText.js +0 -33
- package/dist/lib/formatText.js.map +0 -1
- package/dist/lib/formatToolUse.d.ts +0 -7
- package/dist/lib/formatToolUse.d.ts.map +0 -1
- package/dist/lib/formatToolUse.js +0 -14
- package/dist/lib/formatToolUse.js.map +0 -1
- package/dist/lib/formatUserMessage.d.ts +0 -5
- package/dist/lib/formatUserMessage.d.ts.map +0 -1
- package/dist/lib/formatUserMessage.js +0 -8
- package/dist/lib/formatUserMessage.js.map +0 -1
- package/dist/lib/getBaseCwd.d.ts +0 -6
- package/dist/lib/getBaseCwd.d.ts.map +0 -1
- package/dist/lib/getBaseCwd.js +0 -6
- package/dist/lib/getBaseCwd.js.map +0 -1
- package/dist/lib/getBeadsProgress.d.ts +0 -8
- package/dist/lib/getBeadsProgress.d.ts.map +0 -1
- package/dist/lib/getBeadsProgress.js +0 -35
- package/dist/lib/getBeadsProgress.js.map +0 -1
- package/dist/lib/getClaudeVersion.d.ts +0 -6
- package/dist/lib/getClaudeVersion.d.ts.map +0 -1
- package/dist/lib/getClaudeVersion.js +0 -21
- package/dist/lib/getClaudeVersion.js.map +0 -1
- package/dist/lib/getClaudeVersion.test.d.ts +0 -2
- package/dist/lib/getClaudeVersion.test.d.ts.map +0 -1
- package/dist/lib/getClaudeVersion.test.js +0 -39
- package/dist/lib/getClaudeVersion.test.js.map +0 -1
- package/dist/lib/getDefaultIterations.d.ts +0 -6
- package/dist/lib/getDefaultIterations.d.ts.map +0 -1
- package/dist/lib/getDefaultIterations.js +0 -14
- package/dist/lib/getDefaultIterations.js.map +0 -1
- package/dist/lib/getDefaultIterations.test.d.ts +0 -2
- package/dist/lib/getDefaultIterations.test.d.ts.map +0 -1
- package/dist/lib/getDefaultIterations.test.js +0 -39
- package/dist/lib/getDefaultIterations.test.js.map +0 -1
- package/dist/lib/getLatestLogFile.d.ts +0 -6
- package/dist/lib/getLatestLogFile.d.ts.map +0 -1
- package/dist/lib/getLatestLogFile.js +0 -15
- package/dist/lib/getLatestLogFile.js.map +0 -1
- package/dist/lib/getNextLogFile.d.ts +0 -7
- package/dist/lib/getNextLogFile.d.ts.map +0 -1
- package/dist/lib/getNextLogFile.js +0 -18
- package/dist/lib/getNextLogFile.js.map +0 -1
- package/dist/lib/getNextLogFile.test.d.ts +0 -2
- package/dist/lib/getNextLogFile.test.d.ts.map +0 -1
- package/dist/lib/getNextLogFile.test.js +0 -66
- package/dist/lib/getNextLogFile.test.js.map +0 -1
- package/dist/lib/getOpenIssueCount.d.ts +0 -6
- package/dist/lib/getOpenIssueCount.d.ts.map +0 -1
- package/dist/lib/getOpenIssueCount.js +0 -19
- package/dist/lib/getOpenIssueCount.js.map +0 -1
- package/dist/lib/getOpenIssueCount.test.d.ts +0 -2
- package/dist/lib/getOpenIssueCount.test.d.ts.map +0 -1
- package/dist/lib/getOpenIssueCount.test.js +0 -31
- package/dist/lib/getOpenIssueCount.test.js.map +0 -1
- package/dist/lib/getProgress.d.ts +0 -14
- package/dist/lib/getProgress.d.ts.map +0 -1
- package/dist/lib/getProgress.js +0 -30
- package/dist/lib/getProgress.js.map +0 -1
- package/dist/lib/getProgress.test.d.ts +0 -2
- package/dist/lib/getProgress.test.d.ts.map +0 -1
- package/dist/lib/getProgress.test.js +0 -218
- package/dist/lib/getProgress.test.js.map +0 -1
- package/dist/lib/getPromptContent.d.ts +0 -8
- package/dist/lib/getPromptContent.d.ts.map +0 -1
- package/dist/lib/getPromptContent.js +0 -31
- package/dist/lib/getPromptContent.js.map +0 -1
- package/dist/lib/getTerminalSize.d.ts +0 -8
- package/dist/lib/getTerminalSize.d.ts.map +0 -1
- package/dist/lib/getTerminalSize.js +0 -10
- package/dist/lib/getTerminalSize.js.map +0 -1
- package/dist/lib/getTodoProgress.d.ts +0 -4
- package/dist/lib/getTodoProgress.d.ts.map +0 -1
- package/dist/lib/getTodoProgress.js +0 -22
- package/dist/lib/getTodoProgress.js.map +0 -1
- package/dist/lib/insertTodo.d.ts +0 -7
- package/dist/lib/insertTodo.d.ts.map +0 -1
- package/dist/lib/insertTodo.js +0 -22
- package/dist/lib/insertTodo.js.map +0 -1
- package/dist/lib/outputEvent.d.ts +0 -5
- package/dist/lib/outputEvent.d.ts.map +0 -1
- package/dist/lib/outputEvent.js +0 -7
- package/dist/lib/outputEvent.js.map +0 -1
- package/dist/lib/parseStdinCommand.d.ts +0 -25
- package/dist/lib/parseStdinCommand.d.ts.map +0 -1
- package/dist/lib/parseStdinCommand.js +0 -43
- package/dist/lib/parseStdinCommand.js.map +0 -1
- package/dist/lib/parseStdinCommand.test.d.ts +0 -2
- package/dist/lib/parseStdinCommand.test.d.ts.map +0 -1
- package/dist/lib/parseStdinCommand.test.js +0 -93
- package/dist/lib/parseStdinCommand.test.js.map +0 -1
- package/dist/lib/parseTaskLifecycle.d.ts +0 -18
- package/dist/lib/parseTaskLifecycle.d.ts.map +0 -1
- package/dist/lib/parseTaskLifecycle.js +0 -30
- package/dist/lib/parseTaskLifecycle.js.map +0 -1
- package/dist/lib/parseTaskLifecycle.test.d.ts +0 -2
- package/dist/lib/parseTaskLifecycle.test.d.ts.map +0 -1
- package/dist/lib/parseTaskLifecycle.test.js +0 -122
- package/dist/lib/parseTaskLifecycle.test.js.map +0 -1
- package/dist/lib/parseWorktreeFromBranch.d.ts +0 -13
- package/dist/lib/parseWorktreeFromBranch.d.ts.map +0 -1
- package/dist/lib/parseWorktreeFromBranch.js +0 -19
- package/dist/lib/parseWorktreeFromBranch.js.map +0 -1
- package/dist/lib/processEvents.d.ts +0 -12
- package/dist/lib/processEvents.d.ts.map +0 -1
- package/dist/lib/processEvents.js +0 -113
- package/dist/lib/processEvents.js.map +0 -1
- package/dist/lib/rel.d.ts +0 -8
- package/dist/lib/rel.d.ts.map +0 -1
- package/dist/lib/rel.js +0 -19
- package/dist/lib/rel.js.map +0 -1
- package/dist/lib/rel.test.d.ts +0 -2
- package/dist/lib/rel.test.d.ts.map +0 -1
- package/dist/lib/rel.test.js +0 -51
- package/dist/lib/rel.test.js.map +0 -1
- package/dist/lib/sdkMessageToEvent.d.ts +0 -6
- package/dist/lib/sdkMessageToEvent.d.ts.map +0 -1
- package/dist/lib/sdkMessageToEvent.js +0 -12
- package/dist/lib/sdkMessageToEvent.js.map +0 -1
- package/dist/lib/shortenTempPaths.d.ts +0 -8
- package/dist/lib/shortenTempPaths.d.ts.map +0 -1
- package/dist/lib/shortenTempPaths.js +0 -12
- package/dist/lib/shortenTempPaths.js.map +0 -1
- package/dist/lib/shortenTempPaths.test.d.ts +0 -2
- package/dist/lib/shortenTempPaths.test.d.ts.map +0 -1
- package/dist/lib/shortenTempPaths.test.js +0 -46
- package/dist/lib/shortenTempPaths.test.js.map +0 -1
- package/dist/lib/types.d.ts +0 -19
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/types.js +0 -2
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/useTerminalSize.d.ts +0 -6
- package/dist/lib/useTerminalSize.d.ts.map +0 -1
- package/dist/lib/useTerminalSize.js +0 -19
- package/dist/lib/useTerminalSize.js.map +0 -1
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { MessageQueue, createUserMessage } from "./MessageQueue.js";
|
|
3
|
-
describe("MessageQueue", () => {
|
|
4
|
-
it("should yield messages that were pushed before iteration started", async () => {
|
|
5
|
-
const queue = new MessageQueue();
|
|
6
|
-
const msg1 = createUserMessage("hello");
|
|
7
|
-
const msg2 = createUserMessage("world");
|
|
8
|
-
queue.push(msg1);
|
|
9
|
-
queue.push(msg2);
|
|
10
|
-
queue.close();
|
|
11
|
-
const messages = [];
|
|
12
|
-
for await (const msg of queue) {
|
|
13
|
-
messages.push(msg);
|
|
14
|
-
}
|
|
15
|
-
expect(messages).toEqual([msg1, msg2]);
|
|
16
|
-
});
|
|
17
|
-
it("should yield messages pushed during iteration", async () => {
|
|
18
|
-
const queue = new MessageQueue();
|
|
19
|
-
const msg1 = createUserMessage("first");
|
|
20
|
-
const msg2 = createUserMessage("second");
|
|
21
|
-
// Start iteration
|
|
22
|
-
const iterator = queue[Symbol.asyncIterator]();
|
|
23
|
-
// Push first message while waiting
|
|
24
|
-
const promise1 = iterator.next();
|
|
25
|
-
queue.push(msg1);
|
|
26
|
-
const result1 = await promise1;
|
|
27
|
-
expect(result1.value).toEqual(msg1);
|
|
28
|
-
expect(result1.done).toBe(false);
|
|
29
|
-
// Push second message
|
|
30
|
-
const promise2 = iterator.next();
|
|
31
|
-
queue.push(msg2);
|
|
32
|
-
const result2 = await promise2;
|
|
33
|
-
expect(result2.value).toEqual(msg2);
|
|
34
|
-
expect(result2.done).toBe(false);
|
|
35
|
-
// Close and verify done
|
|
36
|
-
queue.close();
|
|
37
|
-
const result3 = await iterator.next();
|
|
38
|
-
expect(result3.done).toBe(true);
|
|
39
|
-
});
|
|
40
|
-
it("should not yield messages after close", async () => {
|
|
41
|
-
const queue = new MessageQueue();
|
|
42
|
-
const msg = createUserMessage("test");
|
|
43
|
-
queue.push(msg);
|
|
44
|
-
queue.close();
|
|
45
|
-
// Pushing after close should be ignored
|
|
46
|
-
queue.push(createUserMessage("ignored"));
|
|
47
|
-
const messages = [];
|
|
48
|
-
for await (const m of queue) {
|
|
49
|
-
messages.push(m);
|
|
50
|
-
}
|
|
51
|
-
expect(messages).toEqual([msg]);
|
|
52
|
-
});
|
|
53
|
-
it("should resolve pending iterators when closed", async () => {
|
|
54
|
-
const queue = new MessageQueue();
|
|
55
|
-
// Start waiting for a message that will never come
|
|
56
|
-
const iterator = queue[Symbol.asyncIterator]();
|
|
57
|
-
const promise = iterator.next();
|
|
58
|
-
// Close should resolve the pending promise
|
|
59
|
-
queue.close();
|
|
60
|
-
const result = await promise;
|
|
61
|
-
expect(result.done).toBe(true);
|
|
62
|
-
});
|
|
63
|
-
it("should be idempotent when close() is called multiple times", async () => {
|
|
64
|
-
const queue = new MessageQueue();
|
|
65
|
-
const msg = createUserMessage("test");
|
|
66
|
-
queue.push(msg);
|
|
67
|
-
const iterator = queue[Symbol.asyncIterator]();
|
|
68
|
-
const result1 = await iterator.next();
|
|
69
|
-
expect(result1.value).toEqual(msg);
|
|
70
|
-
// Close multiple times - should not throw or cause issues
|
|
71
|
-
queue.close();
|
|
72
|
-
queue.close();
|
|
73
|
-
queue.close();
|
|
74
|
-
// Iterator should still work correctly
|
|
75
|
-
const result2 = await iterator.next();
|
|
76
|
-
expect(result2.done).toBe(true);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
describe("createUserMessage", () => {
|
|
80
|
-
it("should create a valid SDK user message", () => {
|
|
81
|
-
const message = createUserMessage("Hello Claude!");
|
|
82
|
-
expect(message).toEqual({
|
|
83
|
-
type: "user",
|
|
84
|
-
session_id: "",
|
|
85
|
-
message: {
|
|
86
|
-
role: "user",
|
|
87
|
-
content: [{ type: "text", text: "Hello Claude!" }],
|
|
88
|
-
},
|
|
89
|
-
parent_tool_use_id: null,
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
describe("MessageQueue hang scenarios", () => {
|
|
94
|
-
/**
|
|
95
|
-
* This test documents the hang behavior that can occur when:
|
|
96
|
-
* 1. The SDK iterates the MessageQueue via streamInput()
|
|
97
|
-
* 2. The MessageQueue is empty and not closed
|
|
98
|
-
* 3. The SDK calls next() expecting more messages
|
|
99
|
-
*
|
|
100
|
-
* In this case, next() returns a Promise that never resolves
|
|
101
|
-
* until close() is called. If close() is only called after the
|
|
102
|
-
* SDK iteration completes, we have a deadlock.
|
|
103
|
-
*/
|
|
104
|
-
it("should hang if next() is called on empty unclosed queue", async () => {
|
|
105
|
-
const queue = new MessageQueue();
|
|
106
|
-
const msg = createUserMessage("test");
|
|
107
|
-
queue.push(msg);
|
|
108
|
-
const iterator = queue[Symbol.asyncIterator]();
|
|
109
|
-
// First next() returns the queued message
|
|
110
|
-
const result1 = await iterator.next();
|
|
111
|
-
expect(result1.done).toBe(false);
|
|
112
|
-
expect(result1.value).toEqual(msg);
|
|
113
|
-
// Second next() on empty queue - this will hang until close() is called
|
|
114
|
-
// Use a timeout to demonstrate the hang behavior
|
|
115
|
-
const nextPromise = iterator.next();
|
|
116
|
-
let resolved = false;
|
|
117
|
-
nextPromise.then(() => {
|
|
118
|
-
resolved = true;
|
|
119
|
-
});
|
|
120
|
-
// Wait a bit - the promise should NOT resolve
|
|
121
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
122
|
-
expect(resolved).toBe(false);
|
|
123
|
-
// Now close the queue - this should resolve the pending promise
|
|
124
|
-
queue.close();
|
|
125
|
-
// Wait for the promise to resolve
|
|
126
|
-
const result2 = await nextPromise;
|
|
127
|
-
expect(result2.done).toBe(true);
|
|
128
|
-
expect(resolved).toBe(true);
|
|
129
|
-
});
|
|
130
|
-
it("should allow timeout-based iteration completion", async () => {
|
|
131
|
-
const queue = new MessageQueue();
|
|
132
|
-
const msg = createUserMessage("test");
|
|
133
|
-
queue.push(msg);
|
|
134
|
-
// Use Promise.race to implement timeout behavior
|
|
135
|
-
const iterator = queue[Symbol.asyncIterator]();
|
|
136
|
-
const result1 = await iterator.next();
|
|
137
|
-
expect(result1.value).toEqual(msg);
|
|
138
|
-
// Create a "timeout" mechanism
|
|
139
|
-
const timeoutPromise = new Promise(resolve => setTimeout(() => resolve({ done: true, value: undefined }), 100));
|
|
140
|
-
// Race between next message and timeout
|
|
141
|
-
const result = await Promise.race([iterator.next(), timeoutPromise]);
|
|
142
|
-
expect(result.done).toBe(true);
|
|
143
|
-
// Clean up
|
|
144
|
-
queue.close();
|
|
145
|
-
});
|
|
146
|
-
it("should close queue when abort signal is triggered", async () => {
|
|
147
|
-
const queue = new MessageQueue();
|
|
148
|
-
const msg = createUserMessage("test");
|
|
149
|
-
queue.push(msg);
|
|
150
|
-
const abortController = new AbortController();
|
|
151
|
-
// Set up abort listener to close queue
|
|
152
|
-
abortController.signal.addEventListener("abort", () => {
|
|
153
|
-
queue.close();
|
|
154
|
-
});
|
|
155
|
-
const iterator = queue[Symbol.asyncIterator]();
|
|
156
|
-
// Get the first message
|
|
157
|
-
const result1 = await iterator.next();
|
|
158
|
-
expect(result1.value).toEqual(msg);
|
|
159
|
-
// Start waiting for next (which would hang)
|
|
160
|
-
const nextPromise = iterator.next();
|
|
161
|
-
let resolved = false;
|
|
162
|
-
nextPromise.then(() => {
|
|
163
|
-
resolved = true;
|
|
164
|
-
});
|
|
165
|
-
// Abort should close the queue and resolve pending iterators
|
|
166
|
-
abortController.abort();
|
|
167
|
-
const result2 = await nextPromise;
|
|
168
|
-
expect(result2.done).toBe(true);
|
|
169
|
-
expect(resolved).toBe(true);
|
|
170
|
-
});
|
|
171
|
-
it("should work with AbortSignal.timeout pattern", async () => {
|
|
172
|
-
const queue = new MessageQueue();
|
|
173
|
-
const msg = createUserMessage("test");
|
|
174
|
-
queue.push(msg);
|
|
175
|
-
// Create an abort signal that times out after 50ms
|
|
176
|
-
const signal = AbortSignal.timeout(50);
|
|
177
|
-
// Set up abort listener to close queue
|
|
178
|
-
signal.addEventListener("abort", () => {
|
|
179
|
-
queue.close();
|
|
180
|
-
});
|
|
181
|
-
const iterator = queue[Symbol.asyncIterator]();
|
|
182
|
-
// Get the first message
|
|
183
|
-
const result1 = await iterator.next();
|
|
184
|
-
expect(result1.value).toEqual(msg);
|
|
185
|
-
// Start waiting for next (which would hang without timeout)
|
|
186
|
-
const result2 = await iterator.next();
|
|
187
|
-
// The timeout should have triggered, closing the queue
|
|
188
|
-
expect(result2.done).toBe(true);
|
|
189
|
-
});
|
|
190
|
-
it("should handle multiple pending resolvers with abort", async () => {
|
|
191
|
-
const queue = new MessageQueue();
|
|
192
|
-
const abortController = new AbortController();
|
|
193
|
-
abortController.signal.addEventListener("abort", () => {
|
|
194
|
-
queue.close();
|
|
195
|
-
});
|
|
196
|
-
const iterator = queue[Symbol.asyncIterator]();
|
|
197
|
-
// Start multiple pending next() calls
|
|
198
|
-
const promise1 = iterator.next();
|
|
199
|
-
const promise2 = iterator.next();
|
|
200
|
-
const promise3 = iterator.next();
|
|
201
|
-
// All should be pending
|
|
202
|
-
let resolved1 = false, resolved2 = false, resolved3 = false;
|
|
203
|
-
promise1.then(() => {
|
|
204
|
-
resolved1 = true;
|
|
205
|
-
});
|
|
206
|
-
promise2.then(() => {
|
|
207
|
-
resolved2 = true;
|
|
208
|
-
});
|
|
209
|
-
promise3.then(() => {
|
|
210
|
-
resolved3 = true;
|
|
211
|
-
});
|
|
212
|
-
await new Promise(resolve => setTimeout(resolve, 10));
|
|
213
|
-
expect(resolved1).toBe(false);
|
|
214
|
-
expect(resolved2).toBe(false);
|
|
215
|
-
expect(resolved3).toBe(false);
|
|
216
|
-
// Abort should resolve all pending promises
|
|
217
|
-
abortController.abort();
|
|
218
|
-
const [result1, result2, result3] = await Promise.all([promise1, promise2, promise3]);
|
|
219
|
-
expect(result1.done).toBe(true);
|
|
220
|
-
expect(result2.done).toBe(true);
|
|
221
|
-
expect(result3.done).toBe(true);
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
//# sourceMappingURL=MessageQueue.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MessageQueue.test.js","sourceRoot":"","sources":["../../src/lib/MessageQueue.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { MessageQueue } from "./MessageQueue.js"
|
|
2
|
-
/**
|
|
3
|
-
* Stdin command types:
|
|
4
|
-
* - {"type": "message", "text": "..."} - Send a message to Claude
|
|
5
|
-
* - {"type": "stop"} - Request graceful stop after current iteration
|
|
6
|
-
* - {"type": "pause"} - Pause after current iteration completes
|
|
7
|
-
* - {"type": "resume"} - Resume from paused state
|
|
8
|
-
*/
|
|
9
|
-
export type StdinCommand =
|
|
10
|
-
| {
|
|
11
|
-
type: "message"
|
|
12
|
-
text: string
|
|
13
|
-
}
|
|
14
|
-
| {
|
|
15
|
-
type: "stop"
|
|
16
|
-
}
|
|
17
|
-
| {
|
|
18
|
-
type: "pause"
|
|
19
|
-
}
|
|
20
|
-
| {
|
|
21
|
-
type: "resume"
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Parse a JSON string into a StdinCommand.
|
|
25
|
-
* Returns null if parsing fails or the command is invalid.
|
|
26
|
-
*/
|
|
27
|
-
export declare const parseStdinCommand: (line: string) => StdinCommand | null
|
|
28
|
-
export type StdinCommandHandlerOptions = {
|
|
29
|
-
messageQueue: MessageQueue | null
|
|
30
|
-
onStop: () => void
|
|
31
|
-
onPause?: () => void
|
|
32
|
-
onResume?: () => void
|
|
33
|
-
onMessage?: (text: string) => void
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Creates a stdin command handler that reads JSON commands from stdin.
|
|
37
|
-
* Returns a cleanup function to stop reading.
|
|
38
|
-
*
|
|
39
|
-
* Commands:
|
|
40
|
-
* - {"type": "message", "text": "..."} - Send a message to Claude
|
|
41
|
-
* - {"type": "stop"} - Request graceful stop after current iteration
|
|
42
|
-
* - {"type": "pause"} - Pause after current iteration completes
|
|
43
|
-
* - {"type": "resume"} - Resume from paused state
|
|
44
|
-
*/
|
|
45
|
-
export declare const createStdinCommandHandler: (
|
|
46
|
-
getOptions: () => StdinCommandHandlerOptions,
|
|
47
|
-
) => () => void
|
|
48
|
-
//# sourceMappingURL=StdinCommandHandler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StdinCommandHandler.d.ts","sourceRoot":"","sources":["../../src/lib/StdinCommandHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAqB,MAAM,mBAAmB,CAAA;AAKnE;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAA;AAEtB;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,YAAY,GAAG,IAsC/D,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAA;IACjC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,GACpC,YAAY,MAAM,0BAA0B,KAC3C,CAAC,MAAM,IAAI,CAkDb,CAAA"}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { createDebugLogger } from "./debug.js"
|
|
2
|
-
import { createUserMessage } from "./MessageQueue.js"
|
|
3
|
-
import { createInterface } from "readline"
|
|
4
|
-
const log = createDebugLogger("stdin-command")
|
|
5
|
-
/**
|
|
6
|
-
* Parse a JSON string into a StdinCommand.
|
|
7
|
-
* Returns null if parsing fails or the command is invalid.
|
|
8
|
-
*/
|
|
9
|
-
export const parseStdinCommand = line => {
|
|
10
|
-
const trimmed = line.trim()
|
|
11
|
-
if (!trimmed) return null
|
|
12
|
-
try {
|
|
13
|
-
const parsed = JSON.parse(trimmed)
|
|
14
|
-
if (typeof parsed !== "object" || parsed === null) {
|
|
15
|
-
log(`Invalid command - not an object: ${trimmed}`)
|
|
16
|
-
return null
|
|
17
|
-
}
|
|
18
|
-
if (parsed.type === "message") {
|
|
19
|
-
if (typeof parsed.text !== "string") {
|
|
20
|
-
log(`Invalid message command - missing or invalid text: ${trimmed}`)
|
|
21
|
-
return null
|
|
22
|
-
}
|
|
23
|
-
return { type: "message", text: parsed.text }
|
|
24
|
-
}
|
|
25
|
-
if (parsed.type === "stop") {
|
|
26
|
-
return { type: "stop" }
|
|
27
|
-
}
|
|
28
|
-
if (parsed.type === "pause") {
|
|
29
|
-
return { type: "pause" }
|
|
30
|
-
}
|
|
31
|
-
if (parsed.type === "resume") {
|
|
32
|
-
return { type: "resume" }
|
|
33
|
-
}
|
|
34
|
-
log(`Unknown command type: ${parsed.type}`)
|
|
35
|
-
return null
|
|
36
|
-
} catch (err) {
|
|
37
|
-
log(`Failed to parse command: ${err instanceof Error ? err.message : String(err)}`)
|
|
38
|
-
return null
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Creates a stdin command handler that reads JSON commands from stdin.
|
|
43
|
-
* Returns a cleanup function to stop reading.
|
|
44
|
-
*
|
|
45
|
-
* Commands:
|
|
46
|
-
* - {"type": "message", "text": "..."} - Send a message to Claude
|
|
47
|
-
* - {"type": "stop"} - Request graceful stop after current iteration
|
|
48
|
-
* - {"type": "pause"} - Pause after current iteration completes
|
|
49
|
-
* - {"type": "resume"} - Resume from paused state
|
|
50
|
-
*/
|
|
51
|
-
export const createStdinCommandHandler = getOptions => {
|
|
52
|
-
// Don't set up stdin handler if stdin is a TTY (interactive mode handles input differently)
|
|
53
|
-
// This handler is for piped input in JSON mode
|
|
54
|
-
if (process.stdin.isTTY) {
|
|
55
|
-
log(`stdin is TTY - skipping stdin command handler`)
|
|
56
|
-
return () => {}
|
|
57
|
-
}
|
|
58
|
-
log(`Setting up stdin command handler`)
|
|
59
|
-
const rl = createInterface({
|
|
60
|
-
input: process.stdin,
|
|
61
|
-
terminal: false,
|
|
62
|
-
})
|
|
63
|
-
const lineHandler = line => {
|
|
64
|
-
const command = parseStdinCommand(line)
|
|
65
|
-
if (!command) return
|
|
66
|
-
const options = getOptions()
|
|
67
|
-
log(`Received command: ${command.type}`)
|
|
68
|
-
if (command.type === "message") {
|
|
69
|
-
if (options.messageQueue) {
|
|
70
|
-
const userMessage = createUserMessage(command.text)
|
|
71
|
-
options.messageQueue.push(userMessage)
|
|
72
|
-
log(`Pushed message to queue: ${command.text.slice(0, 50)}...`)
|
|
73
|
-
options.onMessage?.(command.text)
|
|
74
|
-
} else {
|
|
75
|
-
log(`Cannot send message - no active message queue`)
|
|
76
|
-
}
|
|
77
|
-
} else if (command.type === "stop") {
|
|
78
|
-
log(`Stop command received`)
|
|
79
|
-
options.onStop()
|
|
80
|
-
} else if (command.type === "pause") {
|
|
81
|
-
log(`Pause command received`)
|
|
82
|
-
options.onPause?.()
|
|
83
|
-
} else if (command.type === "resume") {
|
|
84
|
-
log(`Resume command received`)
|
|
85
|
-
options.onResume?.()
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
rl.on("line", lineHandler)
|
|
89
|
-
return () => {
|
|
90
|
-
log(`Cleaning up stdin command handler`)
|
|
91
|
-
rl.off("line", lineHandler)
|
|
92
|
-
rl.close()
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
//# sourceMappingURL=StdinCommandHandler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StdinCommandHandler.js","sourceRoot":"","sources":["../../src/lib/StdinCommandHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StdinCommandHandler.test.d.ts","sourceRoot":"","sources":["../../src/lib/StdinCommandHandler.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest"
|
|
2
|
-
import { parseStdinCommand } from "./StdinCommandHandler.js"
|
|
3
|
-
describe("parseStdinCommand", () => {
|
|
4
|
-
describe("message command", () => {
|
|
5
|
-
it("parses valid message command", () => {
|
|
6
|
-
const result = parseStdinCommand('{"type": "message", "text": "hello world"}')
|
|
7
|
-
expect(result).toEqual({ type: "message", text: "hello world" })
|
|
8
|
-
})
|
|
9
|
-
it("handles message with special characters", () => {
|
|
10
|
-
const result = parseStdinCommand('{"type": "message", "text": "line1\\nline2"}')
|
|
11
|
-
expect(result).toEqual({ type: "message", text: "line1\nline2" })
|
|
12
|
-
})
|
|
13
|
-
it("handles empty message text", () => {
|
|
14
|
-
const result = parseStdinCommand('{"type": "message", "text": ""}')
|
|
15
|
-
expect(result).toEqual({ type: "message", text: "" })
|
|
16
|
-
})
|
|
17
|
-
it("returns null for message without text field", () => {
|
|
18
|
-
const result = parseStdinCommand('{"type": "message"}')
|
|
19
|
-
expect(result).toBeNull()
|
|
20
|
-
})
|
|
21
|
-
it("returns null for message with non-string text", () => {
|
|
22
|
-
const result = parseStdinCommand('{"type": "message", "text": 123}')
|
|
23
|
-
expect(result).toBeNull()
|
|
24
|
-
})
|
|
25
|
-
})
|
|
26
|
-
describe("stop command", () => {
|
|
27
|
-
it("parses valid stop command", () => {
|
|
28
|
-
const result = parseStdinCommand('{"type": "stop"}')
|
|
29
|
-
expect(result).toEqual({ type: "stop" })
|
|
30
|
-
})
|
|
31
|
-
it("ignores extra fields on stop command", () => {
|
|
32
|
-
const result = parseStdinCommand('{"type": "stop", "extra": "ignored"}')
|
|
33
|
-
expect(result).toEqual({ type: "stop" })
|
|
34
|
-
})
|
|
35
|
-
})
|
|
36
|
-
describe("pause command", () => {
|
|
37
|
-
it("parses valid pause command", () => {
|
|
38
|
-
const result = parseStdinCommand('{"type": "pause"}')
|
|
39
|
-
expect(result).toEqual({ type: "pause" })
|
|
40
|
-
})
|
|
41
|
-
it("ignores extra fields on pause command", () => {
|
|
42
|
-
const result = parseStdinCommand('{"type": "pause", "extra": "ignored"}')
|
|
43
|
-
expect(result).toEqual({ type: "pause" })
|
|
44
|
-
})
|
|
45
|
-
})
|
|
46
|
-
describe("resume command", () => {
|
|
47
|
-
it("parses valid resume command", () => {
|
|
48
|
-
const result = parseStdinCommand('{"type": "resume"}')
|
|
49
|
-
expect(result).toEqual({ type: "resume" })
|
|
50
|
-
})
|
|
51
|
-
it("ignores extra fields on resume command", () => {
|
|
52
|
-
const result = parseStdinCommand('{"type": "resume", "extra": "ignored"}')
|
|
53
|
-
expect(result).toEqual({ type: "resume" })
|
|
54
|
-
})
|
|
55
|
-
})
|
|
56
|
-
describe("invalid input", () => {
|
|
57
|
-
it("returns null for empty string", () => {
|
|
58
|
-
const result = parseStdinCommand("")
|
|
59
|
-
expect(result).toBeNull()
|
|
60
|
-
})
|
|
61
|
-
it("returns null for whitespace only", () => {
|
|
62
|
-
const result = parseStdinCommand(" \n\t ")
|
|
63
|
-
expect(result).toBeNull()
|
|
64
|
-
})
|
|
65
|
-
it("returns null for invalid JSON", () => {
|
|
66
|
-
const result = parseStdinCommand("not json")
|
|
67
|
-
expect(result).toBeNull()
|
|
68
|
-
})
|
|
69
|
-
it("returns null for array instead of object", () => {
|
|
70
|
-
const result = parseStdinCommand('["type", "message"]')
|
|
71
|
-
expect(result).toBeNull()
|
|
72
|
-
})
|
|
73
|
-
it("returns null for null", () => {
|
|
74
|
-
const result = parseStdinCommand("null")
|
|
75
|
-
expect(result).toBeNull()
|
|
76
|
-
})
|
|
77
|
-
it("returns null for primitive value", () => {
|
|
78
|
-
const result = parseStdinCommand("123")
|
|
79
|
-
expect(result).toBeNull()
|
|
80
|
-
})
|
|
81
|
-
it("returns null for unknown command type", () => {
|
|
82
|
-
const result = parseStdinCommand('{"type": "unknown"}')
|
|
83
|
-
expect(result).toBeNull()
|
|
84
|
-
})
|
|
85
|
-
})
|
|
86
|
-
describe("whitespace handling", () => {
|
|
87
|
-
it("trims leading/trailing whitespace", () => {
|
|
88
|
-
const result = parseStdinCommand(' {"type": "stop"} ')
|
|
89
|
-
expect(result).toEqual({ type: "stop" })
|
|
90
|
-
})
|
|
91
|
-
})
|
|
92
|
-
})
|
|
93
|
-
//# sourceMappingURL=StdinCommandHandler.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StdinCommandHandler.test.js","sourceRoot":"","sources":["../../src/lib/StdinCommandHandler.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Manages git worktrees for concurrent Ralph instances.
|
|
3
|
-
*
|
|
4
|
-
* Each Ralph instance gets its own worktree in a sibling folder,
|
|
5
|
-
* allowing parallel work without conflicts:
|
|
6
|
-
*
|
|
7
|
-
* ```
|
|
8
|
-
* project/ # Main worktree (main branch)
|
|
9
|
-
* project-worktrees/ # Sibling folder
|
|
10
|
-
* alice-abc123/ # Alice's worktree (branch: ralph/alice-abc123)
|
|
11
|
-
* bob-def456/ # Bob's worktree (branch: ralph/bob-def456)
|
|
12
|
-
* ```
|
|
13
|
-
*/
|
|
14
|
-
export declare class WorktreeManager {
|
|
15
|
-
private mainWorkspacePath;
|
|
16
|
-
private worktreesBasePath;
|
|
17
|
-
constructor(mainWorkspacePath: string);
|
|
18
|
-
/**
|
|
19
|
-
* Get the path to the worktrees base directory.
|
|
20
|
-
*/
|
|
21
|
-
getWorktreesBasePath(): string;
|
|
22
|
-
/**
|
|
23
|
-
* Get the path for a specific instance's worktree.
|
|
24
|
-
*/
|
|
25
|
-
getWorktreePath(instanceId: string, instanceName: string): string;
|
|
26
|
-
/**
|
|
27
|
-
* Get the branch name for a specific instance.
|
|
28
|
-
*/
|
|
29
|
-
getBranchName(instanceId: string, instanceName: string): string;
|
|
30
|
-
/**
|
|
31
|
-
* Create a new worktree for an instance.
|
|
32
|
-
*/
|
|
33
|
-
create(
|
|
34
|
-
/** Instance ID and name */
|
|
35
|
-
options: CreateWorktreeOptions): Promise<WorktreeInfo>;
|
|
36
|
-
/**
|
|
37
|
-
* Merge the worktree branch back to main.
|
|
38
|
-
*/
|
|
39
|
-
merge(
|
|
40
|
-
/** The instance ID */
|
|
41
|
-
instanceId: string,
|
|
42
|
-
/** The instance name */
|
|
43
|
-
instanceName: string): Promise<MergeResult>;
|
|
44
|
-
/**
|
|
45
|
-
* Rebase the worktree branch on top of main.
|
|
46
|
-
*/
|
|
47
|
-
rebase(
|
|
48
|
-
/** The instance ID */
|
|
49
|
-
instanceId: string,
|
|
50
|
-
/** The instance name */
|
|
51
|
-
instanceName: string): Promise<MergeResult>;
|
|
52
|
-
/**
|
|
53
|
-
* Remove a worktree and optionally delete its branch.
|
|
54
|
-
*/
|
|
55
|
-
remove(
|
|
56
|
-
/** The instance ID */
|
|
57
|
-
instanceId: string,
|
|
58
|
-
/** The instance name */
|
|
59
|
-
instanceName: string,
|
|
60
|
-
/** Whether to delete the branch (default: true) */
|
|
61
|
-
deleteBranch?: boolean): Promise<void>;
|
|
62
|
-
/**
|
|
63
|
-
* List all worktrees managed by this WorktreeManager.
|
|
64
|
-
*/
|
|
65
|
-
list(): Promise<WorktreeInfo[]>;
|
|
66
|
-
/**
|
|
67
|
-
* Check if a worktree exists for an instance.
|
|
68
|
-
*/
|
|
69
|
-
exists(
|
|
70
|
-
/** The instance ID */
|
|
71
|
-
instanceId: string,
|
|
72
|
-
/** The instance name */
|
|
73
|
-
instanceName: string): Promise<boolean>;
|
|
74
|
-
/**
|
|
75
|
-
* Prune worktrees that no longer exist on disk.
|
|
76
|
-
*/
|
|
77
|
-
prune(): Promise<void>;
|
|
78
|
-
/**
|
|
79
|
-
* Add a worktree to the list if it's a valid ralph worktree.
|
|
80
|
-
*/
|
|
81
|
-
private addWorktreeIfValid;
|
|
82
|
-
/**
|
|
83
|
-
* Get the main branch name (main or master).
|
|
84
|
-
*/
|
|
85
|
-
private getMainBranch;
|
|
86
|
-
/**
|
|
87
|
-
* Ensure the worktrees base directory exists.
|
|
88
|
-
*/
|
|
89
|
-
private ensureWorktreesDirectory;
|
|
90
|
-
/**
|
|
91
|
-
* Execute a git command in the main workspace.
|
|
92
|
-
*/
|
|
93
|
-
private git;
|
|
94
|
-
/**
|
|
95
|
-
* Execute a git command in a specific directory.
|
|
96
|
-
*/
|
|
97
|
-
private gitInDir;
|
|
98
|
-
}
|
|
99
|
-
export interface WorktreeInfo {
|
|
100
|
-
path: string;
|
|
101
|
-
branch: string;
|
|
102
|
-
instanceId: string;
|
|
103
|
-
instanceName: string;
|
|
104
|
-
}
|
|
105
|
-
export interface CreateWorktreeOptions {
|
|
106
|
-
instanceId: string;
|
|
107
|
-
instanceName: string;
|
|
108
|
-
}
|
|
109
|
-
export interface MergeResult {
|
|
110
|
-
success: boolean;
|
|
111
|
-
hadConflicts: boolean;
|
|
112
|
-
message: string;
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=WorktreeManager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorktreeManager.d.ts","sourceRoot":"","sources":["../../src/lib/WorktreeManager.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;GAYG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,iBAAiB,CAAQ;gBAErB,iBAAiB,EAAE,MAAM;IAOrC;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAI9B;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAIjE;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAI/D;;OAEG;IACG,MAAM;IACV,2BAA2B;IAC3B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC;IAuBxB;;OAEG;IACG,KAAK;IACT,sBAAsB;IACtB,UAAU,EAAE,MAAM;IAClB,wBAAwB;IACxB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,WAAW,CAAC;IA0CvB;;OAEG;IACG,MAAM;IACV,sBAAsB;IACtB,UAAU,EAAE,MAAM;IAClB,wBAAwB;IACxB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,WAAW,CAAC;IA+CvB;;OAEG;IACG,MAAM;IACV,sBAAsB;IACtB,UAAU,EAAE,MAAM;IAClB,wBAAwB;IACxB,YAAY,EAAE,MAAM;IACpB,mDAAmD;IACnD,YAAY,UAAO,GAClB,OAAO,CAAC,IAAI,CAAC;IAoChB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IA4BrC;;OAEG;IACG,MAAM;IACV,sBAAsB;IACtB,UAAU,EAAE,MAAM;IAClB,wBAAwB;IACxB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,CAAC;IAUnB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;OAEG;YACW,aAAa;IAgB3B;;OAEG;YACW,wBAAwB;IAStC;;OAEG;IACH,OAAO,CAAC,GAAG;IAIX;;OAEG;IACH,OAAO,CAAC,QAAQ;CAwCjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,OAAO,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;CAChB"}
|