Implements an autonomous respawn loop that keeps Claude Code productive: - Detects idle state by monitoring PTY for prompt character + timeout - Sends configurable update prompt when idle (default: "update all the docs and CLAUDE.md") - Executes /clear and /init to reset session - Cycles automatically New features: - RespawnController class with state machine (watching → update → clear → init) - REST API endpoints for respawn control (/api/sessions/:id/respawn/*) - Web UI controls: toggle, prompt config, idle timeout settings - SSE events for real-time respawn status updates - Full CLAUDE.md template with Ralph Loop instructions Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
5.2 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
Claudeman is a Claude Code session manager with a web interface and autonomous Ralph Loop. It spawns Claude CLI processes via PTY, streams output in real-time via SSE, and supports scheduled/timed runs.
Tech Stack: TypeScript, Node.js, Fastify, Server-Sent Events, node-pty
Commands
# Development
npm run build # Compile TypeScript + copy static files to dist/web/
npm run dev # Run with tsx (no build needed)
# Production
npm link # Make 'claudeman' globally available
claudeman web # Start web interface on port 3000
claudeman web -p 8080 # Custom port
# CLI examples
claudeman status # Overall status
claudeman session start --dir /path # Start Claude session
claudeman task add "Fix bug" --priority 5 # Add task to queue
claudeman ralph start --min-hours 4 # Start autonomous loop
Architecture
Core Data Flow
- Session (
src/session.ts) spawns Claude CLI vianode-ptywith--dangerously-skip-permissions - PTY output is buffered and parsed for JSON messages (types:
system,assistant,result) - WebServer (
src/web/server.ts) broadcasts events to connected SSE clients - State persists to
~/.claudeman/state.jsonvia StateStore
Key Components
- Session: Wraps
claude -p --output-format stream-jsonas PTY subprocess. Emitsoutput,terminal,message,completion,exitevents. - WebServer: Fastify server exposing REST API + SSE endpoint at
/api/events. Manages ScheduledRuns (timed loops that repeatedly run prompts). - RespawnController: Manages automatic respawning of interactive Claude sessions. Detects idle state → sends update prompt →
/clear→/init→ repeats. - RalphLoop: Autonomous controller that assigns tasks to idle sessions and detects completion via
<promise>PHRASE</promise>markers. - TaskQueue: Priority-based queue with dependency support.
REST API Endpoints
GET /api/status # Full state (sessions + scheduled + respawn)
GET /api/sessions # List all sessions
POST /api/sessions # Create session { workingDir }
POST /api/sessions/:id/run # Run prompt { prompt }
POST /api/sessions/:id/input # Send input to interactive session
POST /api/sessions/:id/interactive-respawn # Start interactive + respawn
# Respawn control
GET /api/sessions/:id/respawn # Get respawn status
POST /api/sessions/:id/respawn/start # Start respawn controller
POST /api/sessions/:id/respawn/stop # Stop respawn controller
PUT /api/sessions/:id/respawn/config # Update respawn config
GET /api/scheduled # List scheduled runs
POST /api/scheduled # Create { prompt, workingDir, durationMinutes }
POST /api/cases # Create case directory with CLAUDE.md template
SSE Events
Events broadcast to /api/events clients:
session:output,session:terminal,session:messagesession:completion,session:exit,session:working,session:idlescheduled:created,scheduled:updated,scheduled:log,scheduled:completedrespawn:started,respawn:stopped,respawn:stateChangedrespawn:cycleStarted,respawn:cycleCompleted,respawn:stepSent,respawn:stepCompleted,respawn:log
Code Patterns
Claude Message Parsing
Claude CLI outputs newline-delimited JSON. Strip ANSI codes before parsing:
const cleanLine = line.replace(/\x1b\[[0-9;]*m/g, '');
const msg = JSON.parse(cleanLine) as ClaudeMessage;
// msg.type: 'system' | 'assistant' | 'result'
// msg.message?.content: Array<{ type: 'text', text: string }>
// msg.total_cost_usd: number (on result messages)
Idle Detection
Session detects idle state by watching for prompt character (❯ or \u276f) and waiting 2 seconds without activity.
Respawn Controller State Machine
RespawnController (src/respawn-controller.ts) cycles through states to keep Claude productive:
WATCHING → SENDING_UPDATE → WAITING_UPDATE → SENDING_CLEAR → WAITING_CLEAR → SENDING_INIT → WAITING_INIT → WATCHING
Default sequence:
- Detect idle (5s timeout after prompt with no activity)
- Send:
update all the docs and CLAUDE.md - Wait for completion (detects prompt after work stops)
- Send:
/clear - Send:
/init - Return to watching
Configuration options (RespawnConfig):
idleTimeoutMs: How long to wait after prompt (default: 5000)updatePrompt: Custom prompt to send (default: "update all the docs and CLAUDE.md")interStepDelayMs: Delay between steps (default: 1000)enabled: Toggle respawn on/off
Template Generation
src/templates/claude-md.ts generates CLAUDE.md files for new cases via the /api/cases endpoint.
Session Log
| Date | Tasks Completed | Files Changed | Notes |
|---|---|---|---|
| 2026-01-18 | Initial implementation | All files | Core CLI + web interface |
| 2026-01-18 | Add web interface | src/web/* | Fastify + SSE + responsive UI |
| 2026-01-18 | Add RespawnController | src/respawn-controller.ts, src/web/server.ts, src/types.ts | Auto-respawn loop with state machine |