🤖 Generated with assistance of [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2.3 KiB
2.3 KiB
src/hooks/ralph-loop/ — Self-Referential Dev Loop
Generated: 2026-02-19
OVERVIEW
14 files (~1687 LOC). The ralphLoop Session Tier hook — powers the /ralph-loop command. Iterates a development loop until the agent emits <promise>DONE</promise> or max iterations reached.
LOOP LIFECYCLE
/ralph-loop → startLoop(sessionID, prompt, options)
→ loopState.startLoop() → persists state to .sisyphus/ralph-loop.local.md
→ session.idle events → createRalphLoopEventHandler()
→ completionPromiseDetector: scan output for <promise>DONE</promise>
→ if not done: inject continuation prompt → loop
→ if done or maxIterations: cancelLoop()
KEY FILES
| File | Purpose |
|---|---|
ralph-loop-hook.ts |
createRalphLoopHook() — composes controller + recovery + event handler |
ralph-loop-event-handler.ts |
createRalphLoopEventHandler() — handles session.idle, drives loop |
loop-state-controller.ts |
State CRUD: startLoop, cancelLoop, getState, persist to disk |
loop-session-recovery.ts |
Recover from crashed/interrupted loop sessions |
completion-promise-detector.ts |
Scan session transcript for <promise>DONE</promise> |
continuation-prompt-builder.ts |
Build continuation message for next iteration |
continuation-prompt-injector.ts |
Inject built prompt into active session |
storage.ts |
Read/write .sisyphus/ralph-loop.local.md state file |
message-storage-directory.ts |
Temp dir for prompt injection |
with-timeout.ts |
API call wrapper with timeout (default 5000ms) |
types.ts |
RalphLoopState, RalphLoopOptions, loop iteration types |
STATE FILE
.sisyphus/ralph-loop.local.md (gitignored)
→ sessionID, prompt, iteration count, maxIterations, completionPromise, ultrawork flag
OPTIONS
startLoop(sessionID, prompt, {
maxIterations?: number // Default from config (default: 100)
completionPromise?: string // Custom "done" signal (default: "<promise>DONE</promise>")
ultrawork?: boolean // Enable ultrawork mode for iterations
})
EXPORTED INTERFACE
interface RalphLoopHook {
event: (input) => Promise<void> // session.idle handler
startLoop: (sessionID, prompt, options?) => boolean
cancelLoop: (sessionID) => boolean
getState: () => RalphLoopState | null
}