@herbcaudill/ralph 0.8.5 → 1.0.1
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/cli.d.ts.map +1 -1
- package/dist/cli.js +26 -5
- package/dist/cli.js.map +1 -1
- package/dist/components/App.d.ts +6 -1
- package/dist/components/App.d.ts.map +1 -1
- package/dist/components/App.js +7 -3
- package/dist/components/App.js.map +1 -1
- package/dist/components/EnhancedTextInput.d.ts +8 -8
- package/dist/components/EnhancedTextInput.d.ts.map +1 -1
- package/dist/components/EnhancedTextInput.js +2 -36
- package/dist/components/EnhancedTextInput.js.map +1 -1
- package/dist/components/EnhancedTextInput.test.js +2 -10
- package/dist/components/EnhancedTextInput.test.js.map +1 -1
- package/dist/components/EventDisplay.d.ts +1 -1
- package/dist/components/EventDisplay.d.ts.map +1 -1
- package/dist/components/EventDisplay.js +3 -94
- package/dist/components/EventDisplay.js.map +1 -1
- package/dist/components/EventDisplay.replay.test.js +34 -68
- package/dist/components/EventDisplay.replay.test.js.map +1 -1
- package/dist/components/EventDisplay.test.js +30 -0
- package/dist/components/EventDisplay.test.js.map +1 -1
- package/dist/components/FullScreenLayout.d.ts +5 -4
- package/dist/components/FullScreenLayout.d.ts.map +1 -1
- package/dist/components/FullScreenLayout.js +2 -12
- package/dist/components/FullScreenLayout.js.map +1 -1
- package/dist/components/Header.d.ts +2 -1
- package/dist/components/Header.d.ts.map +1 -1
- package/dist/components/Header.js +8 -1
- package/dist/components/Header.js.map +1 -1
- package/dist/components/InitRalph.d.ts +6 -1
- package/dist/components/InitRalph.d.ts.map +1 -1
- package/dist/components/InitRalph.js +71 -89
- package/dist/components/InitRalph.js.map +1 -1
- package/dist/components/IterationRunner.d.ts +6 -13
- package/dist/components/IterationRunner.d.ts.map +1 -1
- package/dist/components/IterationRunner.js +84 -168
- package/dist/components/IterationRunner.js.map +1 -1
- package/dist/components/IterationRunner.test.d.ts +44 -0
- package/dist/components/IterationRunner.test.d.ts.map +1 -1
- package/dist/components/IterationRunner.test.js +66 -126
- package/dist/components/IterationRunner.test.js.map +1 -1
- package/dist/components/IterationRunner.types.d.ts +30 -0
- package/dist/components/IterationRunner.types.d.ts.map +1 -0
- package/dist/components/IterationRunner.types.js +2 -0
- package/dist/components/IterationRunner.types.js.map +1 -0
- package/dist/components/JsonOutput.d.ts +5 -6
- package/dist/components/JsonOutput.d.ts.map +1 -1
- package/dist/components/JsonOutput.js +57 -34
- package/dist/components/JsonOutput.js.map +1 -1
- package/dist/components/JsonOutput.test.d.ts +2 -0
- package/dist/components/JsonOutput.test.d.ts.map +1 -0
- package/dist/components/JsonOutput.test.js +39 -0
- package/dist/components/JsonOutput.test.js.map +1 -0
- package/dist/components/ReplayLog.d.ts +1 -1
- package/dist/components/ReplayLog.d.ts.map +1 -1
- package/dist/components/ReplayLog.js +9 -2
- package/dist/components/ReplayLog.js.map +1 -1
- package/dist/components/StreamingText.d.ts +4 -0
- package/dist/components/StreamingText.d.ts.map +1 -1
- package/dist/components/StreamingText.js +4 -3
- package/dist/components/StreamingText.js.map +1 -1
- package/dist/components/StreamingText.test.js +39 -0
- package/dist/components/StreamingText.test.js.map +1 -1
- package/dist/components/ToolUse.d.ts +8 -0
- package/dist/components/ToolUse.d.ts.map +1 -1
- package/dist/components/ToolUse.js +1 -0
- package/dist/components/ToolUse.js.map +1 -1
- package/dist/components/blocksToLines.d.ts +6 -0
- package/dist/components/blocksToLines.d.ts.map +1 -0
- package/dist/components/blocksToLines.js +15 -0
- package/dist/components/blocksToLines.js.map +1 -0
- package/dist/components/eventToBlocks.d.ts +7 -1
- package/dist/components/eventToBlocks.d.ts.map +1 -1
- package/dist/components/eventToBlocks.js +7 -1
- package/dist/components/eventToBlocks.js.map +1 -1
- package/dist/components/findNextWordBoundary.d.ts +10 -0
- package/dist/components/findNextWordBoundary.d.ts.map +1 -0
- package/dist/components/findNextWordBoundary.js +23 -0
- package/dist/components/findNextWordBoundary.js.map +1 -0
- package/dist/components/findPreviousWordBoundary.d.ts +10 -0
- package/dist/components/findPreviousWordBoundary.d.ts.map +1 -0
- package/dist/components/findPreviousWordBoundary.js +23 -0
- package/dist/components/findPreviousWordBoundary.js.map +1 -0
- package/dist/components/processEvents.d.ts +11 -0
- package/dist/components/processEvents.d.ts.map +1 -0
- package/dist/components/processEvents.js +87 -0
- package/dist/components/processEvents.js.map +1 -0
- package/dist/components/renderStaticItem.d.ts +7 -0
- package/dist/components/renderStaticItem.d.ts.map +1 -0
- package/dist/components/renderStaticItem.js +23 -0
- package/dist/components/renderStaticItem.js.map +1 -0
- package/dist/components/replay.d.ts +5 -0
- package/dist/components/replay.d.ts.map +1 -0
- package/dist/components/replay.js +49 -0
- package/dist/components/replay.js.map +1 -0
- package/dist/components/test-helpers/ControlledInput.d.ts +14 -0
- package/dist/components/test-helpers/ControlledInput.d.ts.map +1 -0
- package/dist/components/test-helpers/ControlledInput.js +15 -0
- package/dist/components/test-helpers/ControlledInput.js.map +1 -0
- package/dist/components/useContentHeight.d.ts +9 -0
- package/dist/components/useContentHeight.d.ts.map +1 -0
- package/dist/components/useContentHeight.js +16 -0
- package/dist/components/useContentHeight.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/MessageQueue.d.ts +18 -5
- package/dist/lib/MessageQueue.d.ts.map +1 -1
- package/dist/lib/MessageQueue.js +21 -14
- package/dist/lib/MessageQueue.js.map +1 -1
- package/dist/lib/StdinCommandHandler.d.ts +26 -20
- package/dist/lib/StdinCommandHandler.js +78 -85
- package/dist/lib/StdinCommandHandler.test.d.ts +2 -2
- package/dist/lib/StdinCommandHandler.test.js +92 -92
- package/dist/lib/WorktreeManager.d.ts +114 -0
- package/dist/lib/WorktreeManager.d.ts.map +1 -0
- package/dist/lib/WorktreeManager.js +350 -0
- package/dist/lib/WorktreeManager.js.map +1 -0
- package/dist/lib/WorktreeManager.test.d.ts +2 -0
- package/dist/lib/WorktreeManager.test.d.ts.map +1 -0
- package/dist/lib/WorktreeManager.test.js +261 -0
- package/dist/lib/WorktreeManager.test.js.map +1 -0
- package/dist/lib/addTodo.d.ts +5 -5
- package/dist/lib/addTodo.d.ts.map +1 -1
- package/dist/lib/addTodo.js +6 -20
- package/dist/lib/addTodo.js.map +1 -1
- package/dist/lib/beadsClient.d.ts +6 -12
- package/dist/lib/beadsClient.d.ts.map +1 -1
- package/dist/lib/beadsClient.js +3 -2
- package/dist/lib/beadsClient.js.map +1 -1
- package/dist/lib/captureBeadsSnapshot.d.ts +4 -0
- package/dist/lib/captureBeadsSnapshot.d.ts.map +1 -0
- package/dist/lib/captureBeadsSnapshot.js +24 -0
- package/dist/lib/captureBeadsSnapshot.js.map +1 -0
- package/dist/lib/captureStartupSnapshot.d.ts +10 -0
- package/dist/lib/captureStartupSnapshot.d.ts.map +1 -0
- package/dist/lib/captureStartupSnapshot.js +29 -0
- package/dist/lib/captureStartupSnapshot.js.map +1 -0
- package/dist/lib/captureTodoSnapshot.d.ts +4 -0
- package/dist/lib/captureTodoSnapshot.d.ts.map +1 -0
- package/dist/lib/captureTodoSnapshot.js +24 -0
- package/dist/lib/captureTodoSnapshot.js.map +1 -0
- package/dist/lib/copyTemplates.d.ts +22 -0
- package/dist/lib/copyTemplates.d.ts.map +1 -0
- package/dist/lib/copyTemplates.js +32 -0
- package/dist/lib/copyTemplates.js.map +1 -0
- package/dist/lib/createStdinCommandHandler.d.ts +28 -0
- package/dist/lib/createStdinCommandHandler.d.ts.map +1 -0
- package/dist/lib/createStdinCommandHandler.js +67 -0
- package/dist/lib/createStdinCommandHandler.js.map +1 -0
- package/dist/lib/createUserMessage.d.ts +6 -0
- package/dist/lib/createUserMessage.d.ts.map +1 -0
- package/dist/lib/createUserMessage.js +13 -0
- package/dist/lib/createUserMessage.js.map +1 -0
- package/dist/lib/debug.d.ts +17 -16
- package/dist/lib/debug.d.ts.map +1 -1
- package/dist/lib/debug.js +25 -15
- package/dist/lib/debug.js.map +1 -1
- package/dist/lib/findMaxLogNumber.d.ts +6 -0
- package/dist/lib/findMaxLogNumber.d.ts.map +1 -0
- package/dist/lib/findMaxLogNumber.js +26 -0
- package/dist/lib/findMaxLogNumber.js.map +1 -0
- package/dist/lib/findMaxLogNumber.test.d.ts +2 -0
- package/dist/lib/findMaxLogNumber.test.d.ts.map +1 -0
- package/dist/lib/findMaxLogNumber.test.js +39 -0
- package/dist/lib/findMaxLogNumber.test.js.map +1 -0
- package/dist/lib/formatContentBlock.d.ts +4 -8
- package/dist/lib/formatContentBlock.d.ts.map +1 -1
- package/dist/lib/formatContentBlock.js +7 -58
- package/dist/lib/formatContentBlock.js.map +1 -1
- package/dist/lib/formatIterationHeader.d.ts +5 -0
- package/dist/lib/formatIterationHeader.d.ts.map +1 -0
- package/dist/lib/formatIterationHeader.js +8 -0
- package/dist/lib/formatIterationHeader.js.map +1 -0
- package/dist/lib/formatText.d.ts +5 -0
- package/dist/lib/formatText.d.ts.map +1 -0
- package/dist/lib/formatText.js +33 -0
- package/dist/lib/formatText.js.map +1 -0
- package/dist/lib/formatToolUse.d.ts +7 -0
- package/dist/lib/formatToolUse.d.ts.map +1 -0
- package/dist/lib/formatToolUse.js +14 -0
- package/dist/lib/formatToolUse.js.map +1 -0
- package/dist/lib/formatUserMessage.d.ts +5 -0
- package/dist/lib/formatUserMessage.d.ts.map +1 -0
- package/dist/lib/formatUserMessage.js +8 -0
- package/dist/lib/formatUserMessage.js.map +1 -0
- package/dist/lib/getBaseCwd.d.ts +6 -0
- package/dist/lib/getBaseCwd.d.ts.map +1 -0
- package/dist/lib/getBaseCwd.js +6 -0
- package/dist/lib/getBaseCwd.js.map +1 -0
- package/dist/lib/getBeadsProgress.d.ts +8 -0
- package/dist/lib/getBeadsProgress.d.ts.map +1 -0
- package/dist/lib/getBeadsProgress.js +35 -0
- package/dist/lib/getBeadsProgress.js.map +1 -0
- package/dist/lib/getClaudeVersion.d.ts +4 -0
- package/dist/lib/getClaudeVersion.d.ts.map +1 -1
- package/dist/lib/getClaudeVersion.js +4 -0
- package/dist/lib/getClaudeVersion.js.map +1 -1
- package/dist/lib/getDefaultIterations.d.ts +6 -0
- package/dist/lib/getDefaultIterations.d.ts.map +1 -0
- package/dist/lib/getDefaultIterations.js +14 -0
- package/dist/lib/getDefaultIterations.js.map +1 -0
- package/dist/lib/getDefaultIterations.test.d.ts +2 -0
- package/dist/lib/getDefaultIterations.test.d.ts.map +1 -0
- package/dist/lib/getDefaultIterations.test.js +39 -0
- package/dist/lib/getDefaultIterations.test.js.map +1 -0
- package/dist/lib/getLatestLogFile.d.ts +6 -0
- package/dist/lib/getLatestLogFile.d.ts.map +1 -0
- package/dist/lib/getLatestLogFile.js +15 -0
- package/dist/lib/getLatestLogFile.js.map +1 -0
- package/dist/lib/getNextLogFile.d.ts +0 -5
- package/dist/lib/getNextLogFile.d.ts.map +1 -1
- package/dist/lib/getNextLogFile.js +2 -36
- package/dist/lib/getNextLogFile.js.map +1 -1
- package/dist/lib/getNextLogFile.test.js +2 -1
- package/dist/lib/getNextLogFile.test.js.map +1 -1
- package/dist/lib/getOpenIssueCount.d.ts +0 -5
- package/dist/lib/getOpenIssueCount.d.ts.map +1 -1
- package/dist/lib/getOpenIssueCount.js +0 -12
- package/dist/lib/getOpenIssueCount.js.map +1 -1
- package/dist/lib/getOpenIssueCount.test.js +1 -35
- package/dist/lib/getOpenIssueCount.test.js.map +1 -1
- package/dist/lib/getProgress.d.ts +6 -26
- package/dist/lib/getProgress.d.ts.map +1 -1
- package/dist/lib/getProgress.js +8 -109
- package/dist/lib/getProgress.js.map +1 -1
- package/dist/lib/getProgress.test.js +2 -1
- package/dist/lib/getProgress.test.js.map +1 -1
- package/dist/lib/getPromptContent.d.ts +8 -0
- package/dist/lib/getPromptContent.d.ts.map +1 -0
- package/dist/lib/getPromptContent.js +31 -0
- package/dist/lib/getPromptContent.js.map +1 -0
- package/dist/lib/getTerminalSize.d.ts +8 -0
- package/dist/lib/getTerminalSize.d.ts.map +1 -0
- package/dist/lib/getTerminalSize.js +10 -0
- package/dist/lib/getTerminalSize.js.map +1 -0
- package/dist/lib/getTodoProgress.d.ts +4 -0
- package/dist/lib/getTodoProgress.d.ts.map +1 -0
- package/dist/lib/getTodoProgress.js +22 -0
- package/dist/lib/getTodoProgress.js.map +1 -0
- package/dist/lib/insertTodo.d.ts +7 -0
- package/dist/lib/insertTodo.d.ts.map +1 -0
- package/dist/lib/insertTodo.js +22 -0
- package/dist/lib/insertTodo.js.map +1 -0
- package/dist/lib/outputEvent.d.ts +5 -0
- package/dist/lib/outputEvent.d.ts.map +1 -0
- package/dist/lib/outputEvent.js +7 -0
- package/dist/lib/outputEvent.js.map +1 -0
- package/dist/lib/parseStdinCommand.d.ts +25 -0
- package/dist/lib/parseStdinCommand.d.ts.map +1 -0
- package/dist/lib/parseStdinCommand.js +43 -0
- package/dist/lib/parseStdinCommand.js.map +1 -0
- package/dist/lib/parseStdinCommand.test.d.ts +2 -0
- package/dist/lib/parseStdinCommand.test.d.ts.map +1 -0
- package/dist/lib/parseStdinCommand.test.js +93 -0
- package/dist/lib/parseStdinCommand.test.js.map +1 -0
- package/dist/lib/parseTaskLifecycle.d.ts +18 -0
- package/dist/lib/parseTaskLifecycle.d.ts.map +1 -0
- package/dist/lib/parseTaskLifecycle.js +30 -0
- package/dist/lib/parseTaskLifecycle.js.map +1 -0
- package/dist/lib/parseTaskLifecycle.test.d.ts +2 -0
- package/dist/lib/parseTaskLifecycle.test.d.ts.map +1 -0
- package/dist/lib/parseTaskLifecycle.test.js +122 -0
- package/dist/lib/parseTaskLifecycle.test.js.map +1 -0
- package/dist/lib/parseWorktreeFromBranch.d.ts +13 -0
- package/dist/lib/parseWorktreeFromBranch.d.ts.map +1 -0
- package/dist/lib/parseWorktreeFromBranch.js +19 -0
- package/dist/lib/parseWorktreeFromBranch.js.map +1 -0
- package/dist/lib/processEvents.d.ts +12 -0
- package/dist/lib/processEvents.d.ts.map +1 -0
- package/dist/lib/processEvents.js +113 -0
- package/dist/lib/processEvents.js.map +1 -0
- package/dist/lib/rel.d.ts +7 -1
- package/dist/lib/rel.d.ts.map +1 -1
- package/dist/lib/rel.js +13 -4
- package/dist/lib/rel.js.map +1 -1
- package/dist/lib/rel.test.js +16 -1
- package/dist/lib/rel.test.js.map +1 -1
- package/dist/lib/sdkMessageToEvent.d.ts +6 -0
- package/dist/lib/sdkMessageToEvent.d.ts.map +1 -0
- package/dist/lib/sdkMessageToEvent.js +12 -0
- package/dist/lib/sdkMessageToEvent.js.map +1 -0
- package/dist/lib/shortenTempPaths.d.ts +7 -1
- package/dist/lib/shortenTempPaths.d.ts.map +1 -1
- package/dist/lib/shortenTempPaths.js +7 -2
- package/dist/lib/shortenTempPaths.js.map +1 -1
- package/dist/lib/types.d.ts +19 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/useTerminalSize.d.ts +3 -2
- package/dist/lib/useTerminalSize.d.ts.map +1 -1
- package/dist/lib/useTerminalSize.js +4 -6
- package/dist/lib/useTerminalSize.js.map +1 -1
- package/package.json +4 -3
- package/templates/core-prompt.md +77 -0
- package/templates/skills/manage-tasks/SKILL.md +113 -0
- package/templates/workflow.md +46 -0
- package/templates/prompt-beads.md +0 -44
- package/templates/prompt-todos.md +0 -17
- package/templates/todo.md +0 -9
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse instance name and ID from a worktree branch name.
|
|
3
|
+
*
|
|
4
|
+
* Expected format: {name}-{id}
|
|
5
|
+
* The last dash separates name from ID.
|
|
6
|
+
*/
|
|
7
|
+
export declare function parseWorktreeFromBranch(
|
|
8
|
+
/** Branch name without the "ralph/" prefix */
|
|
9
|
+
branchParts: string): {
|
|
10
|
+
instanceName: string;
|
|
11
|
+
instanceId: string;
|
|
12
|
+
} | null;
|
|
13
|
+
//# sourceMappingURL=parseWorktreeFromBranch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseWorktreeFromBranch.d.ts","sourceRoot":"","sources":["../../src/lib/parseWorktreeFromBranch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,uBAAuB;AACrC,8CAA8C;AAC9C,WAAW,EAAE,MAAM,GAClB;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASrD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse instance name and ID from a worktree branch name.
|
|
3
|
+
*
|
|
4
|
+
* Expected format: {name}-{id}
|
|
5
|
+
* The last dash separates name from ID.
|
|
6
|
+
*/
|
|
7
|
+
export function parseWorktreeFromBranch(
|
|
8
|
+
/** Branch name without the "ralph/" prefix */
|
|
9
|
+
branchParts) {
|
|
10
|
+
// Parse {name}-{id} from branch name
|
|
11
|
+
const lastDash = branchParts.lastIndexOf("-");
|
|
12
|
+
if (lastDash > 0) {
|
|
13
|
+
const instanceName = branchParts.slice(0, lastDash);
|
|
14
|
+
const instanceId = branchParts.slice(lastDash + 1);
|
|
15
|
+
return { instanceName, instanceId };
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=parseWorktreeFromBranch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseWorktreeFromBranch.js","sourceRoot":"","sources":["../../src/lib/parseWorktreeFromBranch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB;AACrC,8CAA8C;AAC9C,WAAmB;IAEnB,qCAAqC;IACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAC7C,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;QACnD,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;QAClD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAA;IACrC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ContentBlock } from "../components/eventToBlocks.js";
|
|
2
|
+
/**
|
|
3
|
+
* Process raw events into content blocks.
|
|
4
|
+
*
|
|
5
|
+
* With includePartialMessages: true, we receive multiple snapshots of the same message
|
|
6
|
+
* as it builds up. Each snapshot may contain different parts of the message content,
|
|
7
|
+
* so we need to merge them and deduplicate.
|
|
8
|
+
*/
|
|
9
|
+
export declare const processEvents: (
|
|
10
|
+
/** Array of raw event objects from the SDK */
|
|
11
|
+
events: Array<Record<string, unknown>>) => ContentBlock[];
|
|
12
|
+
//# sourceMappingURL=processEvents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processEvents.d.ts","sourceRoot":"","sources":["../../src/lib/processEvents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAEjF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;AACxB,8CAA8C;AAC9C,QAAQ,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KACrC,YAAY,EA6Gd,CAAA"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { eventToBlocks } from "../components/eventToBlocks.js";
|
|
2
|
+
/**
|
|
3
|
+
* Process raw events into content blocks.
|
|
4
|
+
*
|
|
5
|
+
* With includePartialMessages: true, we receive multiple snapshots of the same message
|
|
6
|
+
* as it builds up. Each snapshot may contain different parts of the message content,
|
|
7
|
+
* so we need to merge them and deduplicate.
|
|
8
|
+
*/
|
|
9
|
+
export const processEvents = (
|
|
10
|
+
/** Array of raw event objects from the SDK */
|
|
11
|
+
events) => {
|
|
12
|
+
const blocks = [];
|
|
13
|
+
// First pass: collect all assistant message content and track message order
|
|
14
|
+
const assistantEvents = events.filter(event => event.type === "assistant");
|
|
15
|
+
// Collect all content blocks from all snapshots of the same message
|
|
16
|
+
const messageMap = new Map();
|
|
17
|
+
for (const event of assistantEvents) {
|
|
18
|
+
const message = event.message;
|
|
19
|
+
const messageId = message?.id;
|
|
20
|
+
const content = message?.content;
|
|
21
|
+
if (messageId && content) {
|
|
22
|
+
if (!messageMap.has(messageId)) {
|
|
23
|
+
messageMap.set(messageId, []);
|
|
24
|
+
}
|
|
25
|
+
messageMap.get(messageId).push(...content);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Create merged events with deduplicated content
|
|
29
|
+
const mergedEvents = Array.from(messageMap.entries()).map(([messageId, allContent]) => {
|
|
30
|
+
// Deduplicate content blocks by their ID (for tool_use) or text (for text blocks)
|
|
31
|
+
const seenBlocks = new Set();
|
|
32
|
+
const uniqueContent = [];
|
|
33
|
+
for (const block of allContent) {
|
|
34
|
+
const blockType = block.type;
|
|
35
|
+
let blockKey;
|
|
36
|
+
if (blockType === "tool_use") {
|
|
37
|
+
// Tool use blocks are unique by their ID
|
|
38
|
+
blockKey = `tool:${block.id}`;
|
|
39
|
+
}
|
|
40
|
+
else if (blockType === "text") {
|
|
41
|
+
// For text blocks, check if this is a prefix of or prefixed by existing text
|
|
42
|
+
// This handles incremental text updates where each snapshot has more content
|
|
43
|
+
const text = block.text;
|
|
44
|
+
let isDuplicate = false;
|
|
45
|
+
for (const seenKey of seenBlocks) {
|
|
46
|
+
if (seenKey.startsWith("text:")) {
|
|
47
|
+
const seenText = seenKey.substring(5);
|
|
48
|
+
// If existing text starts with this text, or this text starts with existing,
|
|
49
|
+
// keep only the longer one
|
|
50
|
+
if (seenText.startsWith(text)) {
|
|
51
|
+
// Existing is longer, this is a duplicate
|
|
52
|
+
isDuplicate = true;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
else if (text.startsWith(seenText)) {
|
|
56
|
+
// This is longer, remove the old one and add this
|
|
57
|
+
seenBlocks.delete(seenKey);
|
|
58
|
+
// Also remove from uniqueContent
|
|
59
|
+
const idx = uniqueContent.findIndex(b => b.type === "text" && b.text === seenText);
|
|
60
|
+
if (idx >= 0)
|
|
61
|
+
uniqueContent.splice(idx, 1);
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (isDuplicate)
|
|
67
|
+
continue;
|
|
68
|
+
blockKey = `text:${text}`;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
blockKey = JSON.stringify(block);
|
|
72
|
+
}
|
|
73
|
+
if (!seenBlocks.has(blockKey)) {
|
|
74
|
+
seenBlocks.add(blockKey);
|
|
75
|
+
uniqueContent.push(block);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
type: "assistant",
|
|
80
|
+
message: {
|
|
81
|
+
id: messageId,
|
|
82
|
+
content: uniqueContent,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
const assistantBlocks = mergedEvents.flatMap(event => eventToBlocks(event));
|
|
87
|
+
// Second pass: process events in order, including user messages
|
|
88
|
+
// Track which user messages and assistant messages we've already seen
|
|
89
|
+
const processedUserIds = new Set();
|
|
90
|
+
const processedAssistantIds = new Set();
|
|
91
|
+
for (const event of events) {
|
|
92
|
+
if (event.type === "user") {
|
|
93
|
+
const message = event.message;
|
|
94
|
+
const messageId = message?.id ?? `user-${Date.now()}`;
|
|
95
|
+
if (!processedUserIds.has(messageId)) {
|
|
96
|
+
processedUserIds.add(messageId);
|
|
97
|
+
blocks.push(...eventToBlocks(event));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else if (event.type === "assistant") {
|
|
101
|
+
const message = event.message;
|
|
102
|
+
const messageId = message?.id;
|
|
103
|
+
if (messageId && !processedAssistantIds.has(messageId)) {
|
|
104
|
+
processedAssistantIds.add(messageId);
|
|
105
|
+
// Find the merged version of this message
|
|
106
|
+
const merged = assistantBlocks.filter(b => b.id.startsWith(messageId));
|
|
107
|
+
blocks.push(...merged);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return blocks;
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=processEvents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processEvents.js","sourceRoot":"","sources":["../../src/lib/processEvents.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/rel.d.ts
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Convert an absolute path to a relative path from the base working directory.
|
|
3
|
+
* For temp files, returns just the filename. Leaves relative paths unchanged.
|
|
4
|
+
*/
|
|
5
|
+
export declare const rel: (
|
|
6
|
+
/** The path to convert */
|
|
7
|
+
path: string) => string;
|
|
2
8
|
//# sourceMappingURL=rel.d.ts.map
|
package/dist/lib/rel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rel.d.ts","sourceRoot":"","sources":["../../src/lib/rel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rel.d.ts","sourceRoot":"","sources":["../../src/lib/rel.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,eAAO,MAAM,GAAG;AACd,0BAA0B;AAC1B,MAAM,MAAM,WAUb,CAAA"}
|
package/dist/lib/rel.js
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
|
-
import { relative } from "path";
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { isAbsolute, relative } from "path";
|
|
2
|
+
import { getBaseCwd } from "./getBaseCwd.js";
|
|
3
|
+
/**
|
|
4
|
+
* Convert an absolute path to a relative path from the base working directory.
|
|
5
|
+
* For temp files, returns just the filename. Leaves relative paths unchanged.
|
|
6
|
+
*/
|
|
7
|
+
export const rel = (
|
|
8
|
+
/** The path to convert */
|
|
9
|
+
path) => {
|
|
10
|
+
if (!isAbsolute(path)) {
|
|
11
|
+
return path;
|
|
12
|
+
}
|
|
4
13
|
// For temp files, just show the filename
|
|
5
14
|
if (path.includes("/var/folders/") || path.includes("/tmp/")) {
|
|
6
15
|
return path.split("/").pop() || path;
|
|
7
16
|
}
|
|
8
|
-
return relative(
|
|
17
|
+
return relative(getBaseCwd(), path) || path;
|
|
9
18
|
};
|
|
10
19
|
//# sourceMappingURL=rel.js.map
|
package/dist/lib/rel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rel.js","sourceRoot":"","sources":["../../src/lib/rel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"rel.js","sourceRoot":"","sources":["../../src/lib/rel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C;;;GAGG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG;AACjB,0BAA0B;AAC1B,IAAY,EACZ,EAAE;IACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,yCAAyC;IACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAA;IACtC,CAAC;IACD,OAAO,QAAQ,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,CAAA;AAC7C,CAAC,CAAA"}
|
package/dist/lib/rel.test.js
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
1
|
+
import { describe, it, expect, afterEach } from "vitest";
|
|
2
2
|
import { rel } from "./rel.js";
|
|
3
|
+
const originalCwd = process.env.RALPH_CWD;
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
if (originalCwd === undefined) {
|
|
6
|
+
delete process.env.RALPH_CWD;
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
process.env.RALPH_CWD = originalCwd;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
3
12
|
describe("rel", () => {
|
|
4
13
|
it("converts absolute path to relative path", () => {
|
|
5
14
|
const absolutePath = `${process.cwd()}/src/lib/rel.ts`;
|
|
@@ -21,6 +30,12 @@ describe("rel", () => {
|
|
|
21
30
|
const result = rel(relativePath);
|
|
22
31
|
expect(result).toBe(relativePath);
|
|
23
32
|
});
|
|
33
|
+
it("uses RALPH_CWD when set", () => {
|
|
34
|
+
process.env.RALPH_CWD = "/Users/example/ralph";
|
|
35
|
+
const absolutePath = "/Users/example/ralph/src/lib/rel.ts";
|
|
36
|
+
const result = rel(absolutePath);
|
|
37
|
+
expect(result).toBe("src/lib/rel.ts");
|
|
38
|
+
});
|
|
24
39
|
it("handles path outside current directory", () => {
|
|
25
40
|
const outsidePath = "/completely/different/path/file.ts";
|
|
26
41
|
const result = rel(outsidePath);
|
package/dist/lib/rel.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rel.test.js","sourceRoot":"","sources":["../../src/lib/rel.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"rel.test.js","sourceRoot":"","sources":["../../src/lib/rel.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACxD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAE9B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAA;AAEzC,SAAS,CAAC,GAAG,EAAE;IACb,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAA;IAC9B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,WAAW,CAAA;IACrC,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;IACnB,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,YAAY,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAA;QACtD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,QAAQ,GAAG,wCAAwC,CAAA;QACzD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG,0BAA0B,CAAA;QAC1C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAA;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,YAAY,GAAG,gBAAgB,CAAA;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,sBAAsB,CAAA;QAC9C,MAAM,YAAY,GAAG,qCAAqC,CAAA;QAC1D,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,WAAW,GAAG,oCAAoC,CAAA;QACxD,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,CAAA;QAC/B,6DAA6D;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,QAAQ,GAAG,GAAG,CAAA;QACpB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAA;IAC7B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type SDKMessage } from "@anthropic-ai/claude-agent-sdk";
|
|
2
|
+
/** Convert SDK message to event format for display. */
|
|
3
|
+
export declare const sdkMessageToEvent: (
|
|
4
|
+
/** The SDK message to convert */
|
|
5
|
+
message: SDKMessage) => Record<string, unknown> | null;
|
|
6
|
+
//# sourceMappingURL=sdkMessageToEvent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdkMessageToEvent.d.ts","sourceRoot":"","sources":["../../src/lib/sdkMessageToEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAEhE,wDAAwD;AACxD,eAAO,MAAM,iBAAiB;AAC5B,iCAAiC;AACjC,SAAS,UAAU,KAClB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAO5B,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Convert SDK message to event format for display. */
|
|
2
|
+
export const sdkMessageToEvent = (
|
|
3
|
+
/** The SDK message to convert */
|
|
4
|
+
message) => {
|
|
5
|
+
// Pass through messages that have the structure we expect
|
|
6
|
+
if (message.type === "assistant" || message.type === "user" || message.type === "result") {
|
|
7
|
+
return message;
|
|
8
|
+
}
|
|
9
|
+
// Skip system and stream_event messages for display
|
|
10
|
+
return null;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=sdkMessageToEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdkMessageToEvent.js","sourceRoot":"","sources":["../../src/lib/sdkMessageToEvent.ts"],"names":[],"mappings":"AAEA,wDAAwD;AACxD,MAAM,CAAC,MAAM,iBAAiB,GAAG;AAC/B,iCAAiC;AACjC,OAAmB,EACa,EAAE;IAClC,0DAA0D;IAC1D,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzF,OAAO,OAA6C,CAAA;IACtD,CAAC;IACD,oDAAoD;IACpD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
|
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Replace temp file paths with just the filename.
|
|
3
|
+
* Shortens macOS and Linux temporary paths to be more readable in output.
|
|
4
|
+
*/
|
|
5
|
+
export declare const shortenTempPaths: (
|
|
6
|
+
/** The text to process */
|
|
7
|
+
text: string) => string;
|
|
2
8
|
//# sourceMappingURL=shortenTempPaths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shortenTempPaths.d.ts","sourceRoot":"","sources":["../../src/lib/shortenTempPaths.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"shortenTempPaths.d.ts","sourceRoot":"","sources":["../../src/lib/shortenTempPaths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,gBAAgB;AAC3B,0BAA0B;AAC1B,MAAM,MAAM,WAKb,CAAA"}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Replace temp file paths with just the filename.
|
|
3
|
+
* Shortens macOS and Linux temporary paths to be more readable in output.
|
|
4
|
+
*/
|
|
5
|
+
export const shortenTempPaths = (
|
|
6
|
+
/** The text to process */
|
|
7
|
+
text) => {
|
|
3
8
|
return text
|
|
4
9
|
.replace(/\/var\/folders\/[^\s]+/g, match => match.split("/").pop() || match)
|
|
5
10
|
.replace(/\/tmp\/[^\s]+/g, match => match.split("/").pop() || match);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shortenTempPaths.js","sourceRoot":"","sources":["../../src/lib/shortenTempPaths.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,
|
|
1
|
+
{"version":3,"file":"shortenTempPaths.js","sourceRoot":"","sources":["../../src/lib/shortenTempPaths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;AAC9B,0BAA0B;AAC1B,IAAY,EACZ,EAAE;IACF,OAAO,IAAI;SACR,OAAO,CAAC,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC;SAC5E,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,CAAA;AACxE,CAAC,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Progress data for tracking issues/tasks. */
|
|
2
|
+
export type ProgressData = {
|
|
3
|
+
/** Type of workspace (beads, todo, or none) */
|
|
4
|
+
type: "beads" | "todo" | "none";
|
|
5
|
+
/** Number of issues/tasks completed since startup */
|
|
6
|
+
completed: number;
|
|
7
|
+
/** Total issues/tasks seen since startup (initial + created since) */
|
|
8
|
+
total: number;
|
|
9
|
+
};
|
|
10
|
+
/** Startup snapshot containing initial count and timestamp. */
|
|
11
|
+
export type StartupSnapshot = {
|
|
12
|
+
/** Initial count of open + in_progress issues */
|
|
13
|
+
initialCount: number;
|
|
14
|
+
/** RFC3339 timestamp of when the snapshot was taken */
|
|
15
|
+
timestamp: string;
|
|
16
|
+
/** Type of workspace (beads or todo) */
|
|
17
|
+
type: "beads" | "todo";
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,MAAM,MAAM,YAAY,GAAG;IACzB,+CAA+C;IAC/C,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;IAC/B,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAA;IACjB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,gEAAgE;AAChE,MAAM,MAAM,eAAe,GAAG;IAC5B,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAA;IACpB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAA;IACjB,wCAAwC;IACxC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;CACvB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTerminalSize.d.ts","sourceRoot":"","sources":["../../src/lib/useTerminalSize.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useTerminalSize.d.ts","sourceRoot":"","sources":["../../src/lib/useTerminalSize.ts"],"names":[],"mappings":"AAIA,6EAA6E;AAC7E,eAAO,MAAM,eAAe;;;CAiB3B,CAAA"}
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { useState, useEffect } from "react";
|
|
2
2
|
import { useStdout } from "ink";
|
|
3
|
+
import { getTerminalSize } from "./getTerminalSize.js";
|
|
4
|
+
/** Hook to get the current terminal size and subscribe to resize events. */
|
|
3
5
|
export const useTerminalSize = () => {
|
|
4
6
|
const { stdout } = useStdout();
|
|
5
|
-
const
|
|
6
|
-
columns: stdout?.columns ?? 80,
|
|
7
|
-
rows: stdout?.rows ?? 24,
|
|
8
|
-
});
|
|
9
|
-
const [size, setSize] = useState(getSize);
|
|
7
|
+
const [size, setSize] = useState(() => getTerminalSize(stdout));
|
|
10
8
|
useEffect(() => {
|
|
11
9
|
const handleResize = () => {
|
|
12
|
-
setSize(
|
|
10
|
+
setSize(getTerminalSize(stdout));
|
|
13
11
|
};
|
|
14
12
|
stdout?.on("resize", handleResize);
|
|
15
13
|
return () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTerminalSize.js","sourceRoot":"","sources":["../../src/lib/useTerminalSize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"useTerminalSize.js","sourceRoot":"","sources":["../../src/lib/useTerminalSize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE;IAClC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAA;IAC9B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAA;IAE/D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAA;QAClC,CAAC,CAAA;QAED,MAAM,EAAE,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QAElC,OAAO,GAAG,EAAE;YACV,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QACrC,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAEZ,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@herbcaudill/ralph",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Autonomous AI iteration engine for Claude CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -37,7 +37,8 @@
|
|
|
37
37
|
"ink-select-input": "^6.2.0",
|
|
38
38
|
"ink-spinner": "^5.0.0",
|
|
39
39
|
"ink-text-input": "^6.0.0",
|
|
40
|
-
"react": "^19.2.3"
|
|
40
|
+
"react": "^19.2.3",
|
|
41
|
+
"@herbcaudill/ralph-shared": "1.0.1"
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|
|
43
44
|
"@types/node": "^24.10.1",
|
|
@@ -58,7 +59,7 @@
|
|
|
58
59
|
"dev": "tsc --watch",
|
|
59
60
|
"typecheck": "tsc --noEmit",
|
|
60
61
|
"ralph": "tsx src/index.ts",
|
|
61
|
-
"test:all": "pnpm typecheck &&
|
|
62
|
+
"test:all": "pnpm typecheck && vitest run",
|
|
62
63
|
"test": "vitest run",
|
|
63
64
|
"test:e2e": "vitest --config vitest.e2e.config.ts",
|
|
64
65
|
"test:watch": "vitest --watch",
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Ralph Iteration Protocol
|
|
2
|
+
|
|
3
|
+
You are running as an autonomous iteration agent. Follow this protocol exactly.
|
|
4
|
+
|
|
5
|
+
## Iteration lifecycle
|
|
6
|
+
|
|
7
|
+
### Step 1: Check for errors
|
|
8
|
+
|
|
9
|
+
Run the project's build/test command (defined in your workflow instructions below).
|
|
10
|
+
|
|
11
|
+
- If errors exist: create a P1 bug issue documenting them. Skip to Step 4.
|
|
12
|
+
- If no errors: proceed to Step 2.
|
|
13
|
+
|
|
14
|
+
### Step 2: Find available work
|
|
15
|
+
|
|
16
|
+
Run `bd ready --assignee {agentName} --assignee ""` to list issues that are either:
|
|
17
|
+
|
|
18
|
+
- Unassigned, or
|
|
19
|
+
- Assigned to you
|
|
20
|
+
|
|
21
|
+
If no issues are ready, output `<promise>COMPLETE</promise>` and end your turn.
|
|
22
|
+
|
|
23
|
+
### Step 3: Claim and work on one task
|
|
24
|
+
|
|
25
|
+
Select the highest-priority issue. Finish in-progress tasks first. Bugs take priority.
|
|
26
|
+
|
|
27
|
+
- Output `<start_task>{id}</start_task>`
|
|
28
|
+
- Assign the issue to yourself: `bd update {id} --status=in_progress --assignee={agentName}`
|
|
29
|
+
- Work only on this single task.
|
|
30
|
+
- If the task is complex, break it into subtasks and end your turn.
|
|
31
|
+
|
|
32
|
+
### Step 4: Complete the task
|
|
33
|
+
|
|
34
|
+
When finished:
|
|
35
|
+
|
|
36
|
+
- Run wrap-up steps (see workflow instructions)
|
|
37
|
+
- Close the issue: `bd close {id}`
|
|
38
|
+
- Record a summary: `bd comments add {id} "..." --author=Ralph`
|
|
39
|
+
- Output `<end_task>{id}</end_task>`
|
|
40
|
+
- End your turn.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Subagents (optional)
|
|
45
|
+
|
|
46
|
+
You can delegate certain tasks to subagents that run on cheaper/faster models. To use a subagent:
|
|
47
|
+
|
|
48
|
+
1. Read the agent prompt from `.claude/agents/`
|
|
49
|
+
2. Use the Task tool with `subagent_type: "general-purpose"` and `model: "haiku"`
|
|
50
|
+
3. Pass the agent prompt content plus your specific instructions
|
|
51
|
+
|
|
52
|
+
Available agents:
|
|
53
|
+
|
|
54
|
+
- **run-tests** - Runs tests and returns a summarized result
|
|
55
|
+
- **make-tests** - Generates tests for specified code
|
|
56
|
+
- **write-docs** - Writes documentation for specified code
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Beads quick reference
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
bd ready # Show issues ready to work
|
|
64
|
+
bd show {id} # Detailed issue view
|
|
65
|
+
bd update {id} --status=in_progress --assignee={agentName}
|
|
66
|
+
bd close {id} # Mark complete
|
|
67
|
+
bd create --title="..." --type=task|bug|epic --priority=2
|
|
68
|
+
bd comments add {id} "..." --author=Ralph # Add comment
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Priority: 0-4 (0=critical, 2=medium, 4=backlog). Use P0-P4 format.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
# Workflow instructions
|
|
76
|
+
|
|
77
|
+
{WORKFLOW}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: manage-tasks
|
|
3
|
+
description: Create and manage beads issues. Uses judgment for priority, type, dependencies, and hierarchy.
|
|
4
|
+
user_invocation: manage-tasks
|
|
5
|
+
model: sonnet
|
|
6
|
+
allowed-tools:
|
|
7
|
+
- Read
|
|
8
|
+
- Bash
|
|
9
|
+
- Grep
|
|
10
|
+
- Glob
|
|
11
|
+
- TodoWrite
|
|
12
|
+
- WebFetch
|
|
13
|
+
- WebSearch
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
You are a task management assistant. Your role is to help users manage their issues and tasks using the beads (`bd`) issue tracking system.
|
|
17
|
+
|
|
18
|
+
At the beginning of a session, and when finished working, just prompt the user for instructions and end your turn. Don't run status commands unprompted.
|
|
19
|
+
|
|
20
|
+
## Critical constraint
|
|
21
|
+
|
|
22
|
+
**You are NOT a coding agent.** Your job is ONLY to create and manage issues. You must NEVER:
|
|
23
|
+
|
|
24
|
+
- Edit, write, or modify any code files
|
|
25
|
+
- Use the Edit, Write, or NotebookEdit tools
|
|
26
|
+
- Implement fixes, even if they seem trivial
|
|
27
|
+
- Make "quick" changes to the codebase
|
|
28
|
+
|
|
29
|
+
When a user mentions a problem or something they want to accomplish, just create an issue. Only ask questions if you're unclear on what the issue should say. Include the new issue's id and title in your output. No additional commentary needed.
|
|
30
|
+
|
|
31
|
+
If the user specifically asks you to investigate the causes of a problem, do a thorough investigation and report back.
|
|
32
|
+
|
|
33
|
+
### Examples
|
|
34
|
+
|
|
35
|
+
#### Wrong:
|
|
36
|
+
|
|
37
|
+
> **User**: The submit button is misaligned
|
|
38
|
+
>
|
|
39
|
+
> **Assistant**: (edits the component)
|
|
40
|
+
> ❌ It is not the assistant's job to implement fixes
|
|
41
|
+
|
|
42
|
+
#### Wrong:
|
|
43
|
+
|
|
44
|
+
> **User**: The submit button is misaligned
|
|
45
|
+
>
|
|
46
|
+
> **Assistant**: I've created issue x-xxx: Fix submit button alignment. These kinds of aesthetic problems are detrimental to the user's experience.
|
|
47
|
+
> ❌ No commentary on the issue is required
|
|
48
|
+
|
|
49
|
+
#### Wrong:
|
|
50
|
+
|
|
51
|
+
> **User**: The submit button is misaligned
|
|
52
|
+
>
|
|
53
|
+
> **Assistant**: I'm just a task manager and can't edit files. Would you like me to create an issue?
|
|
54
|
+
> ❌ Don't ask, just create the issue
|
|
55
|
+
|
|
56
|
+
#### Wrong:
|
|
57
|
+
|
|
58
|
+
> **User**: The submit button is misaligned
|
|
59
|
+
>
|
|
60
|
+
> **Assistant**: Created x-xxx: Fix button alignment
|
|
61
|
+
> ❌ Don't just say you created a task if you didn't use `bd create` to create it
|
|
62
|
+
|
|
63
|
+
#### Right:
|
|
64
|
+
|
|
65
|
+
> **User**: The submit button is misaligned
|
|
66
|
+
>
|
|
67
|
+
> **Assistant**:
|
|
68
|
+
> `bd create --title="Fix button alignment"`
|
|
69
|
+
> Created x-xxx: Fix button alignment.
|
|
70
|
+
> ✅ It is the assistant's job to create and manage tasks
|
|
71
|
+
|
|
72
|
+
#### Right:
|
|
73
|
+
|
|
74
|
+
> **User**: Why is the submit button misaligned?
|
|
75
|
+
>
|
|
76
|
+
> **Assistant**: It looks like the submit button has vertical margins that differ from the other buttons. Want me to file an issue?
|
|
77
|
+
> ✅ It is also the assistant's job to investigate problems when asked
|
|
78
|
+
|
|
79
|
+
## Creating issues
|
|
80
|
+
|
|
81
|
+
- Short title, details in description
|
|
82
|
+
- Use the right type: `task` (default), `bug`, or `epic`. Don't use `feature`.
|
|
83
|
+
- Set appropriate priorities: P0-P4 (P0 is highest)
|
|
84
|
+
- Keep tasks granular - break complex work into subtasks under a parent
|
|
85
|
+
|
|
86
|
+
## Updating issues
|
|
87
|
+
|
|
88
|
+
- Change status (open, in_progress, blocked, deferred, closed)
|
|
89
|
+
- Update titles, descriptions, priorities
|
|
90
|
+
- Add comments
|
|
91
|
+
- Set or change parent issues
|
|
92
|
+
- Close parent tasks when all children are closed
|
|
93
|
+
|
|
94
|
+
## Beads reference
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
bd ready # Show issues ready to work
|
|
98
|
+
bd list --status=open # All open issues
|
|
99
|
+
bd list --status=in_progress # Active work
|
|
100
|
+
bd show <id> # Issue details
|
|
101
|
+
|
|
102
|
+
bd create --title="..." --type=task|bug|epic --priority=2
|
|
103
|
+
bd update <id> --status=in_progress
|
|
104
|
+
bd update <id> --assignee=username
|
|
105
|
+
bd close <id>
|
|
106
|
+
bd close <id1> <id2> ... # Close multiple
|
|
107
|
+
|
|
108
|
+
bd dep add <issue> <depends-on> # Add dependency
|
|
109
|
+
bd blocked # Show blocked issues
|
|
110
|
+
bd comments add <id> "..." --author=Ralph # Add comment
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Priority: 0-4 or P0-P4 (0=critical, 2=medium, 4=backlog).
|