Instead of parsing terminal output for <spawn1337> tags, spawn capabilities
are now exposed as native MCP tools that Claude Code can call directly.
The MCP server (stdio transport) proxies requests to the existing REST API.
- Add src/mcp-server.ts with 6 tools: spawn_agent, list_agents,
get_agent_status, get_agent_result, send_agent_message, cancel_agent
- Remove src/spawn-detector.ts and all references in session.ts/server.ts
- Add CLAUDEMAN_API_URL env var propagation to sessions and screens
- Write .mcp.json to case directories during creation
- Remove spawn1337 tag documentation from case-template.md
- Add claudeman-mcp bin entry to package.json
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
New sessions had no awareness of the spawn1337 agent protocol because
the case-template.md (copied as CLAUDE.md into every new case) was
missing the documentation. Added full spawn protocol reference including
tag syntax, task spec format, monitoring commands, and resource limits.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The w1/w2/s1/s2 session counter was scanning all sessions regardless
of case name, causing cross-case number inflation. Now only counts
sessions belonging to the same case when determining the next number.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Ralph tracker no longer auto-enables on pattern detection. It must be
explicitly enabled per-session (via API) or globally via the new
`ralphEnabled` AppConfig setting. Adds GET/PUT /api/config endpoints
for runtime configuration. Spawn agent ralph enable is unchanged.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When Claude enters plan mode or asks a question (AskUserQuestion), output
stops without a completion message. The new autoAcceptPrompts feature
detects this state and sends Enter after a configurable delay (default 8s)
to accept the plan or select the default option, keeping Claude working
autonomously.
Enabled by default. Adds UI checkbox in the respawn config panel.
Safety: only fires once per silence period, requires prior output,
and won't fire during active respawn cycles.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replaces the ~400-line inline template string in claude-md.ts with a
file read from src/templates/case-template.md. Removes the hardcoded
/home/arkon/default/CLAUDE.md path from server.ts. The build script
now copies the template to dist/templates/ for production use.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The RalphTracker now recognizes Format 5 - the checkmark-based output
that Claude Code's TodoWrite tool produces:
- "✔ Task #N created: <content>" → creates todo
- "✔ #N <content>" → registers task summary
- "✔ Task #N updated: status → in progress/completed" → updates status
Previously only detected markdown checkboxes, icon indicators, and
native ☐/☒/◐ format, missing the primary output format used by
Claude Code CLI sessions.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
state.json is now the primary source for session recovery, but
screens.json is used as a fallback for respawn config since it was
the proven working path before. This provides double-redundancy:
both files would need to be lost for respawn state to disappear.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
cleanupSession() always called store.removeSession() which deleted the
session from state.json. On server stop, cleanupSession(id, false) was
called for all sessions - preserving screens but deleting their saved
state. On next restart, state.json was empty so nothing was restored.
Now only removes from state.json when killScreen=true (user explicitly
deleting a session), preserving state for recovery on restart.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
All session settings (auto-compact, auto-clear, ralph, respawn) are now
restored from state.json on server restart. Previously settings were
split across state.json, screens.json, and state-inner.json which was
fragile. state-inner.json is kept as a fallback for ralph state only.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
persistSessionState was called before the respawn controller was restored,
so respawnEnabled was always saved as false during recovery. Moved the
persist call to after all restorations (auto-compact, auto-clear, ralph,
respawn) are applied.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Session recovery from screens created fresh Session objects with default
values, losing the auto-compact and auto-clear settings that were saved
to state.json. Now reads them back during recovery.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The modal was reading from non-existent nested paths (session.autoClear?.autoCompact?)
instead of the flat properties from toState() (session.autoCompactEnabled, etc.).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The respawn controller's enabled/disabled state was not being saved,
so CLI status couldn't show whether respawn was active.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add GET /api/sessions/:id/respawn/config endpoint for reading saved config
- PUT /api/sessions/:id/respawn/config now works without running controller
(saves pre-config to screens.json for when respawn starts)
- Respawn start/enable merges pre-saved config from screens.json
- Frontend auto-saves respawn config, auto-compact, auto-clear on field change
- Frontend loads saved config when opening session options modal
- Updated CLAUDE.md with state persistence docs, new API endpoint,
SessionState fields table, state lifecycle, and session setting guide
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The web server now persists all per-session settings (name, mode,
auto-compact, auto-clear, respawn config, ralph state, tokens, cost)
to state.json so the CLI status/session commands can display them.
Also removes unused pendingStepConfirm property from respawn controller.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add step confirmation timer for waiting_update, waiting_init, waiting_kickstart states
- After detecting completion in waiting states, wait for completionConfirmMs silence
- Prevents sending next command before Claude finishes processing current one
- Cancel step confirmation when working patterns detected
- Update CLAUDE.md with step confirmation documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update idle detection from legacy '↵ send' to completion message pattern
("for Xm Xs" time patterns like "Worked for 2m 46s")
- Add confirming_idle state for false positive prevention
- Add completionConfirmMs (5s) and noOutputTimeoutMs (30s) config options
- Add multi-layer detection with confidence scoring (0-100%)
- Fix null pointer error in extractTokenCount with guard clause
- Fix respawn controller not stopping on session cleanup (broadcast respawn:stopped)
- Update tests to use new completion message patterns
- Add detection status UI display (confidence level, waiting state)
- Update CLAUDE.md with new detection documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
SSE Client Management:
- Add periodic health check (30s) to detect dead SSE connections
- Clean up clients with destroyed/non-writable sockets
- Clear all SSE clients on server stop
Session Lifecycle:
- Add _isStopped flag to prevent new timers after session stops
- Check flag in auto-compact/clear callbacks to avoid timer races
- Check flag in line buffer flush timer creation
Server Shutdown:
- Add _isStopping flag to prevent timer creation during shutdown
- Skip batch timer creation in terminal/output/task/state handlers
- Clear SSE health check timer on stop
Ralph Tracker:
- Call clearDebounceTimers() in clear() method (was missing)
- Add MAX_COMPLETION_PHRASE_ENTRIES (50) to trim phrase map
- Add MAX_LINE_BUFFER_SIZE (64KB) to prevent unbounded growth
- Trim line buffer when exceeding max size
Task Tracker:
- Add timestamp to pending tool uses for age-based cleanup
- Add PENDING_TOOL_USE_MAX_AGE_MS (1 hour) expiry
- Add MAX_PENDING_TOOL_USES (100) limit
- Clean up old entries on new tool use
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Reduce buffer limits (terminal: 5MB→2MB, text: 2MB→1MB) to decrease
render payload
- Add chunkedTerminalWrite() that writes in 64KB chunks via
requestAnimationFrame to avoid UI jank
- Add tail mode to /api/sessions/:id/terminal endpoint (?tail=256KB)
for faster initial load on tab switch
- Show truncation indicator when earlier output is cut
- Update CLAUDE.md with new buffer limits and performance notes
Fixes jittery behavior when switching tabs with large (2MB+) buffers.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rename inner-loop-tracker.ts → ralph-tracker.ts throughout codebase
- Add ralph-config.ts for parsing .claude/ralph-loop.local.md config
- Standardize API error responses using createErrorResponse()
- Add input validation for auto-compact/auto-clear thresholds
- Update UI labels to "Ralph / Todo Tracker" consistently
- Add 46 integration tests for Ralph tracking functionality
- Update test badge to 438 total tests
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Extract <promise>PHRASE</promise> from CLAUDE.md on session start
- Configure inner loop tracker before first broadcast so UI shows phrase immediately
- More lenient bare phrase detection (triggers when loop is active)
- Auto-detect on session restoration from screens
- Add logging for auto-detection debugging
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add PersistedRespawnConfig type and respawnConfig field to ScreenSession
- Add innerLoopEnabled field to ScreenSession for Ralph Wiggum tracking
- Add updateRespawnConfig, clearRespawnConfig, updateInnerLoopEnabled methods to ScreenManager
- Save respawn config when enabled/updated via API endpoints
- Save inner loop enabled state when changed via API
- Restore respawn controllers and inner loop state on server startup
This ensures respawn continues working after claudeman restarts.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
After sending /clear, if no prompt indicator is detected within 10 seconds,
proceed to send /init anyway. This fixes respawn getting stuck when Claude
doesn't show the expected prompt characters after /clear completes.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add validation for input parameter in /input endpoint
- Add validation for cols/rows as positive integers in /resize endpoint
- Use standardized error responses with ApiErrorCode
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add isError() type guard to check if value is Error instance
- Add getErrorMessage() utility for safe error message extraction
in catch blocks (handles TypeScript 4.4+ unknown error type)
- Replace all (err as Error).message patterns with getErrorMessage(err)
across server.ts, cli.ts, ralph-loop.ts, and screen-manager.ts
- Follows TypeScript best practice of treating caught errors as unknown
This improves code safety by properly handling the case where caught
values may not be Error instances (e.g., thrown strings or objects).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Save selected case to settings when changed, created, or linked.
Automatically restore last used case on page load.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add disableAutoEnable mechanism to InnerLoopTracker that prevents
pattern-based activation when the user has explicitly disabled the
Ralph tracker in settings.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add tabbed "Add Case" modal with "Create New" and "Link Existing" tabs
- Add POST /api/cases/link endpoint to register existing folders
- Store linked cases in ~/.claudeman/linked-cases.json
- Update GET /api/cases to include linked cases
- Add instance count controls (+/-) for Run Shell button
- Update welcome message to explain instance count selector
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add instance count controls (+/- buttons) for Run Shell
- Update runShell() to support launching multiple shell sessions
- Update welcome message to explain persistent GNU Screen sessions
- Add "Instance count" tooltips to both Claude and Shell controls
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add tabbed interface to App Settings modal (Display, Claude CLI, Paths)
- Add modal-lg class for wider settings modal (520px)
- Remove "(will be created)" text from empty case display
- Make Run Claude button text bolder (font-weight: 700)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add getFullScreenId() to get PID.screenName format for unambiguous attach
- Update DirectAttach.ts and index.tsx to use full screen IDs
- Remove TUI documentation from README (still in development)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add killAllScreensAndClaude() function to useSessionManager
- Kills all tracked sessions, orphan claudeman screens, and Claude CLI processes
- Press 'D' (Shift+d) in sessions view to trigger
- Update HelpOverlay with new shortcut documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add state store flush on shutdown to prevent data loss from debounced saves
- Add error handling in session exit handler to ensure cleanup always runs
- Add 5s timeout to all TUI execSync calls to prevent hangs
- Cache screen -ls output with 100ms TTL (90% reduction in execSync calls)
- Add token pre-check to skip expensive regex when "token" not in data
Based on findings from security, performance, and reliability analysis.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
TUI now checks if web server is running on startup and offers to start
it in the background. Added new CLI options: --with-web (auto-start),
--no-web (skip check), -p (port).
TUI feature parity with web interface:
- Shell mode: press 'h' in cases view to start bash instead of Claude
- Multi-start: press 'm' to start 1-20 sessions at once
- Respawn toggle: Ctrl+R to enable/disable respawn on Claude sessions
- Session rename: API support via useSessionManager hook
Security fixes from previous analysis:
- Command injection prevention in screen-manager.ts
- Path traversal protection in server.ts
- Input validation for shell-interpolated values
Also fixes memory leak in session.ts (timer tracking) and flaky test
timeout in session-cleanup.test.ts.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add @fileoverview documentation to:
- src/index.ts - CLI entry point
- src/cli.ts - Command definitions
- src/templates/claude-md.ts - Template generation with function docs
- src/web/server.ts - Web server and API
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add method-level documentation to all public methods
- Document save behavior (debounced vs immediate)
- Document inner state methods for Ralph Loop tracking
- Improve code readability with clear comments
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Comprehensive documentation for RalphLoop:
- Module-level description explaining the loop concept
- Event interface documentation
- Options interface with descriptions
- Class-level lifecycle description
- Method documentation for public API
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Documentation for Task model:
- Module-level description
- CreateTaskOptions interface
- Class description with lifecycle
- Key method documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Comprehensive documentation for TaskQueue:
- Module-level description
- Event interface documentation
- Class-level description
- Method-level comments for all public methods
- Singleton accessor documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Handle SIGINT/SIGTERM signals properly
- Unmount Ink app before exit
- Restore cursor visibility and clear screen on exit
- Use try/finally to ensure cleanup runs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- inner-loop-tracker.ts: Comment out unused COMPLETION_SIGNAL_PATTERN, use _id
- session.ts: Remove unused execSync import and timeout constants
- task-tracker.ts: Use _context for unused parameter
- server.ts: Remove unused FastifyRequest import
All files now pass --noUnusedLocals --noUnusedParameters check.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove unused imports (Text, execSync, writeFileSync, React)
- Move n/r/q key handlers from App.tsx to StartScreen component
- Mark unused onClose prop in HelpOverlay with underscore prefix
- Consolidate keyboard handling in components that display the controls
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Improves documentation across all TUI files:
- App.tsx: Main component with keyboard shortcuts reference
- index.tsx: Entry point with usage examples
- useSessionManager.ts: Hook with detailed API documentation
- All components: Props, returns, and behavior descriptions
- Helper functions: Parameter and return type documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Poll session API every 2 seconds for respawn status
- Display respawn state and cycle count in StatusBar
- Show respawn status in magenta to match web UI
- Format state (underscores to spaces) for readability
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Poll inner loop state from state-inner.json every 500ms
- Display RalphPanel when loop is enabled and has data
- Auto-adjust terminal height when panel is shown
- Add innerLoopState and innerTodos to session manager hook
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>