Skip to content

Latest commit

 

History

History
187 lines (144 loc) · 4.67 KB

File metadata and controls

187 lines (144 loc) · 4.67 KB

Development Log

Project Timeline

Phase Status Description
Phase 1 Complete Core infrastructure & libraries
Phase 2 Complete Running daemon & management
Phase 3 Complete Claude Code integration
Phase 4 In Progress Polish & refinement

Phase 1: Core Infrastructure

Goal: Build rock-solid foundation with well-tested primitives.

Libraries Implemented:

  • pkg/config - Path configuration and directory management
  • internal/daemon - PID file management
  • internal/state - JSON state persistence with atomic saves
  • internal/tmux - tmux session/window management
  • internal/worktree - Git worktree operations
  • internal/messages - Message filesystem operations
  • internal/socket - Unix socket client/server
  • internal/logging - Structured logging
  • internal/cli - Command routing framework

Testing:

  • 67 tests passing
  • Real tmux integration tests (creates actual sessions)
  • Real git worktree tests (creates actual repos)
  • Symlink-aware path resolution for macOS compatibility

Key Commits:

  • a5a4b43 - Add development log
  • e399ff4 - Add config package
  • 94fef7e - Add daemon PID management
  • e05ff0c - Add state management
  • a80e8ed - Add tmux library
  • 0479613 - Add worktree library
  • a942fc7 - Add message operations
  • 6d79399 - Add socket and logging
  • 69f2b5b - Add CLI framework
  • d66fa65 - Add comprehensive unit tests

Phase 2: Daemon & Management

Goal: Fully functional daemon with repo/worker management (plain shells before Claude).

Daemon Features:

  • Main loop with context cancellation
  • Socket server for CLI communication
  • Health check loop (every 2 minutes)
  • Message router loop (every 2 minutes)
  • Wake/nudge loop (every 2 minutes)
  • State persistence and recovery
  • Graceful shutdown

Commands Implemented:

  • multiclaude start/stop/status/logs - Daemon control
  • multiclaude repo init <github-url> - Repository initialization
  • multiclaude worker create <task> - Worker creation
  • multiclaude worker list/rm - Worker management
  • multiclaude repo list - List tracked repos
  • multiclaude message send/list/read/ack - Messaging
  • multiclaude agent complete - Signal completion

Testing:

  • 73+ unit tests passing
  • 2 comprehensive e2e integration tests
  • Real tmux and git operations tested

Phase 3: Claude Integration

Goal: Replace plain shells with autonomous Claude Code instances.

Features Implemented:

  • Claude startup in tmux with UUID session IDs
  • Role-specific prompts (supervisor, worker, merge-queue)
  • Embedded markdown prompts via //go:embed
  • Custom prompt loading from .multiclaude/ directory
  • Hooks configuration support
  • PID tracking and health monitoring
  • Autonomous operation (--dangerously-skip-permissions)
  • Initial task messages to workers

Key Commits:

  • f76458d - Add prompts package
  • ef4755e - Add Claude startup integration
  • 7549680 - Add hooks configuration
  • 8e10cb2 - Add stop-all command
  • 75f5701 - Fix UUID v4 format
  • d7b5846 - Add skip-permissions flag
  • 694f659 - Convert to embedded markdown prompts
  • e40594d - Add PID tracking
  • 33bf5f3 - Mark Phase 3 complete
  • 50536a5 - Fix critical bugs and improve agent communication

Phase 4: Polish & Refinement

Status: In Progress

Planned:

  • Enhanced error messages
  • Better attach command with read-only mode
  • Rich list commands with status info
  • Edge case handling
  • Performance optimization
  • GitHub auth verification

Architecture Decisions

Why tmux?

  • Human observable at all times
  • Standard tool, no new UIs to learn
  • Detachable sessions survive disconnects
  • Easy to attach for debugging

Why git worktrees?

  • True isolation between agents
  • No branch switching conflicts
  • Clean cleanup via git worktree remove
  • Standard git, no special tooling

Why filesystem messages?

  • Simple to debug (just cat the files)
  • No database dependencies
  • Easy to inspect and modify
  • Survives daemon restarts

Why single daemon?

  • Single source of truth for state
  • Centralized coordination
  • Simple CLI communication via socket
  • Easy to reason about

Test Commands

# Run all tests
go test ./...

# Run with verbose output
go test ./... -v

# Run specific package
go test ./internal/daemon -v
go test ./internal/tmux -v

# Build
go build ./cmd/multiclaude

Useful Debug Commands

# Check daemon status
multiclaude daemon status

# View daemon logs
tail -f ~/.multiclaude/daemon.log

# List tmux sessions
tmux list-sessions

# Attach to repo session
tmux attach -t mc-<repo>

# Check state file
cat ~/.multiclaude/state.json | jq

# List messages for an agent
ls ~/.multiclaude/messages/<repo>/<agent>/