Commit Graph
335 Commits
Author SHA1 Message Date
arkonandClaude Opus 4.5 c6b16bf815 fix: subagent title extraction race condition
- Add 100ms debounce for new file detection to allow content to be written
- Add subagent:updated event for retroactive description updates
- Extract description in processEntry when first user message is processed
- Add extractDescriptionFromFile helper with retry in file change handler
- Update SubagentTranscriptEntry.content type to support string | array
- Add test coverage for subagent:updated event

Fixes 43% failure rate where subagents displayed raw IDs instead of descriptions
due to race condition when files were discovered before first line was written.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 19:49:58 +01:00
arkonandClaude Opus 4.5 87bdd9376c ui: make Subagents panel detachable and position on right side
- Move Subagents panel to right side (same as Monitor)
- Add detach/float functionality with drag support
- Add resize handle for detached mode
- Clean up duplicate CSS
- Bump version to 0.1358

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 18:33:43 +01:00
arkonandClaude Opus 4.5 0d22d19645 docs: improve CLAUDE.md structure and discoverability
- Move COM shorthand to prominent position after safety warning
- Add version sync note (must match package.json)
- Consolidate Key Files into 4 logical categories
- Clarify next available test port (3128)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 18:09:25 +01:00
arkonandClaude Opus 4.5 8094a756c6 feat: smart title extraction for subagent descriptions
- Condenses long prompts to ~45 chars while preserving meaning
- Removes filler words (the, a, please, I need you to, etc.)
- Cuts at natural boundaries (colons, dashes, commas)
- Falls back to word-boundary truncation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 17:56:31 +01:00
arkonandClaude Opus 4.5 953d9845ca fix: subagent description extraction for JSONL format
The JSONL files have message.content as a direct string, not an array
of content blocks. Now handles both formats correctly.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 17:51:59 +01:00
arkonandClaude Opus 4.5 74bcede607 ui: add double-click to open subagent tracking window
Double-click on subagent items in the Subagents tab to open
the floating tracking window. Includes tooltip hint.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 17:47:44 +01:00
arkonandClaude Opus 4.5 cec9608b66 ui: improve subagent window titles and readability
- Extract better titles from task description (first line/sentence)
- Make subagent window text white for better readability
- Expand monitor panel to 700px when subagents tab is active
- Add smooth width transition when switching tabs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 17:40:28 +01:00
arkonandClaude Opus 4.5 4c34966827 ui: hide case folder display from bottom toolbar
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 09:11:48 +01:00
arkonandClaude Opus 4.5 437322fb80 docs: document test cleanup patterns and known issues in CLAUDE.md
Added documentation about test cleanup patterns, known issues with
session/case cleanup in specific test files, and manual cleanup commands
for orphaned test resources.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 09:08:57 +01:00
arkonandClaude Opus 4.5 9d42ff5bb6 fix: sticky scroll on tab switch - keep terminal at bottom after new output
Add isTerminalAtBottom() helper and modify batchTerminalWrite() to implement
sticky scroll behavior. When SSE terminal data arrives after tab switch,
terminal now stays scrolled to Claude input if user was already at bottom.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 08:30:42 +01:00
arkonandClaude Opus 4.5 fc97f6a41a refactor: extract AI checker base class + fix persistence + dedupe restoration
- Add AiCheckerBase abstract class to eliminate ~700 lines of duplication
  between AiIdleChecker and AiPlanChecker
- Fix missing persistence fields (completionConfirmMs, noOutputTimeoutMs)
  that caused custom timing values to be lost on server restart
- Extract restoreRespawnController() helper to dedupe session restoration
  logic between state.json and screens.json paths

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 08:25:51 +01:00
arkonandClaude Opus 4.5 3455b27f6f fix: respawn disabled state not persisted across server restarts
When /respawn/stop was called, the controller was stopped but remained
in the respawnControllers map. This caused persistSessionState() to
still read config.enabled=true and save respawnEnabled=true to state.json.

On server restart, the respawn controller would be re-enabled because
state.json had respawnEnabled=true.

Fix: Remove controller from map and clear any timed respawn when
/respawn/stop is called, so persistSessionState() correctly sets
respawnEnabled=false.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 08:01:57 +01:00
arkonandClaude Opus 4.5 044021953a docs: add ai-plan-checker, test utilities, and update respawn state machine
- Add ai-plan-checker.ts to CLAUDE.md Key Files table
- Document test utilities (MockSession, MockAiIdleChecker, MockAiPlanChecker)
- Update port allocation (3127 reserved for respawn-integration)
- Add ai_checking state to respawn state diagram
- Document AI Plan Checker in respawn-state-machine.md
- Add references to test documentation files

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 07:57:12 +01:00
arkonandClaude Opus 4.5 eb98caa812 fix: use temp file for plan checker prompt to avoid E2BIG + fix cancel race condition
The ai-plan-checker.ts was passing the prompt directly as a shell argument,
which can cause E2BIG errors when the terminal buffer is large (8KB+).
This fix applies the same temp file approach already used in ai-idle-checker.ts:
- Write prompt to a temp file instead of passing as shell argument
- Pipe the file to claude via stdin: `cat prompt.txt | claude -p ...`
- Clean up prompt file after check completes

Also fixes a race condition in the cancel() method of both AI checkers where
the poll timer could fire between setting checkCancelled and clearing timers.
Now timers are cleared before resolving the promise to prevent this race.

Includes test utilities and analysis documents for the respawn controller
created by other agents:
- test/respawn-test-utils.ts - MockSession, MockAiIdleChecker utilities
- test/respawn-analysis.md - Code analysis and issue identification
- test/respawn-scenarios.md - Test scenario documentation
- test/respawn-test-plan.md - Testing architecture documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 07:52:40 +01:00
arkonandClaude Opus 4.5 4d1da8bb71 fix: persist respawn config across server restarts
- persistSessionState() now saves respawnEnabled based on config.enabled
  (user intent) instead of controller.state (running state)
- cleanupSession() saves respawn config BEFORE removing controller
- AiIdleChecker and AiPlanChecker constructors filter undefined values
  to prevent overwriting defaults (fixes "timed out after undefinedms")
- updateConfig() methods also filter undefined values

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 07:42:05 +01:00
arkonandClaude Opus 4.5 8c17c54a3a fix: prevent undefined config values from overwriting AI checker defaults
When respawn config objects had explicit undefined values for fields like
aiIdleCheckTimeoutMs, the spread operator would overwrite defaults with
undefined, causing "AI check timed out after undefinedms" errors.

- Add default fallbacks when saving pre-config in server.ts
- Filter out undefined values before spreading in RespawnController
- Add tests verifying undefined filtering works correctly

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 07:28:30 +01:00
arkonandClaude Opus 4.5 e56c8626e4 feat: persistent token tracking with global stats aggregation
- Add restoreTokens() method to Session class for recovery after restart
- Add GlobalStats type for cumulative usage tracking across all sessions
- Accumulate tokens from deleted sessions into global stats
- Track lifetime session count with incrementSessionsCreated()
- Add /api/stats endpoint for global stats
- Include globalStats in /api/status response
- Frontend shows aggregate tokens + cost in header
- Fix respawn controller config to filter undefined values
- Add 7 new tests for global stats functionality (v0.1343)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 07:26:49 +01:00
arkonandClaude Opus 4.5 0aca55b099 fix: use temp file for AI check prompt to avoid E2BIG spawn error
The AI idle checker was passing the prompt (including up to 16KB of terminal
buffer) as a command-line argument to bash -c, which exceeded the Linux
argument size limit causing "spawn E2BIG" errors.

Now writes the prompt to a temp file and pipes it to claude via stdin,
avoiding the argument size limit entirely. Temp file is cleaned up both
in the normal case (by the shell command) and on cancellation/timeout.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 06:54:56 +01:00
arkonandClaude Opus 4.5 706392d264 fix: prevent respawn cycle after plan mode auto-accept + enhance action log UI
- Add state check in startPlanCheck() to prevent Enter if state changed
- sendAutoAcceptEnter() now cancels pending AI idle checks and resets state
- Log auto-accept as [command] type for visibility in action log
- Highlight command entries with blue background in action log
- Show action log row when there are actions (not just timers)
- Increase action log height and opacity for better visibility

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 06:46:20 +01:00
arkonandClaude Opus 4.5 eef6c0690e docs: COM always bumps version in both files (v0.1340)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 05:54:54 +01:00
arkonandClaude Opus 4.5 6e8878b398 chore: bump package.json version to 0.1339
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 05:53:56 +01:00
arkonandClaude Opus 4.5 0f9caa9d29 feat: improve respawn display readability and AI check info (v0.1338)
- State label now white on green pill for better visibility
- AI check shows detailed status with color-coded badges:
  - Blue: Analyzing terminal output
  - Green: Idle confirmed
  - Yellow: Working detected
  - Gray: Disabled
- Shows time since last check when recent (<2min)
- Bump version to 0.1338

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 05:00:43 +01:00
arkonandClaude Opus 4.5 ee6b6596d6 feat: add version display in toolbar (v0.1337)
- Display version number in center of bottom toolbar
- Load version from package.json via server's /api/status
- Version shown on initial load and SSE reconnect

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 04:04:24 +01:00
arkonandClaude Opus 4.5 99919d6dfb feat: replace SpawnDetector with MCP server for spawn1337 protocol
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>
2026-01-23 23:16:21 +01:00
arkonandClaude Opus 4.5 8ff480f9e9 fix: preserve execute permission on dist/index.js during build
Add chmod +x after tsc compilation to prevent "Permission denied" errors
when running claudeman via npm link symlink.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 19:41:43 +01:00
arkonandClaude Opus 4.5 afaa1d3adb refactor: move default CLAUDE.md template to bundled case-template.md
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>
2026-01-22 22:43:09 +01:00
arkonandClaude Opus 4.5 ed67aa25b5 fix: update repository URLs in package.json
Replace placeholder yourusername with actual Ark0N repository.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 15:19:33 +01:00
arkonandClaude Opus 4.5 95da584762 chore: add npm publishing metadata to package.json
- Add repository, bugs, homepage URLs
- Add files array for npm publish

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:58:50 +01:00
arkonandClaude Opus 4.5 c00ce747c1 chore: add npm script for TUI command
Adds 'npm run tui' as shorthand for 'tsx src/index.ts tui'

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:40:34 +01:00
arkonandClaude Opus 4.5 84dab25f38 feat(tui): add terminal user interface with Ink
Add a full TUI for Claudeman using Ink (React for CLI):
- StartScreen: Shows existing sessions from screens.json
- TabBar: Session tabs with status indicators
- TerminalView: PTY output display with scrolling
- StatusBar: Session info and keyboard shortcuts
- HelpOverlay: Full keyboard shortcut reference

Features:
- Session discovery from ~/.claudeman/screens.json
- Tab navigation (Ctrl+Tab, Ctrl+1-9)
- Create new sessions (connects to web API)
- Kill sessions via screen commands
- Keyboard-driven navigation

Usage: claudeman tui

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:19:02 +01:00
arkonandClaude Opus 4.5 a21f0646e0 chore: improve package.json for npm publishing
- Update description to be more compelling
- Add comprehensive keywords for discoverability
- Add typecheck script for CI/CD

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 05:15:38 +01:00
arkonandClaude Opus 4.5 bf41dab827 feat: UI improvements and E2E testing with agent-browser
- Move font controls (A+/A-) to left of connection status
- Redesign tab count with stepper buttons (−/number/+)
- Remove respawn panel, integrate settings into session options modal
- Fix Monitor panel SSE handler (wrong element ID)
- Add screen wrapping support to Session class
- Add E2E testing skill using agent-browser
- Document testing approach in README.md and CLAUDE.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 03:40:57 +01:00
arkonandClaude Opus 4.5 5b1941330b chore: add vitest for testing
- Add vitest as dev dependency
- Add test script to package.json

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 21:37:29 +01:00
arkonandClaude Opus 4.5 c4aae98a01 feat: add web interface with real-time streaming and timed runs
- Add Fastify-based web server with SSE for real-time updates
- Create responsive dark-themed UI with:
  - Prompt input with directory and duration options
  - Live countdown timer for timed runs
  - Real-time output streaming
  - Collapsible sessions panel
  - Cost and task tracking
- Support timed runs that repeat prompts for specified duration
- Add /api endpoints for sessions, scheduled runs, and status
- Update Session class to parse Claude CLI JSON output
- Add 'claudeman web' command to start the interface

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 05:14:34 +01:00
arkonandClaude Opus 4.5 e1bb800473 feat: implement Claudeman - Claude session manager with Ralph Loop
Claudeman manages multiple Claude CLI sessions as subprocesses with:
- Session management (start/stop/list/logs)
- Priority-based task queue with dependency support
- Ralph Loop for autonomous task assignment and completion detection
- Time-aware loops for extended work sessions
- JSON file persistence to ~/.claudeman/state.json

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 04:50:46 +01:00