Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
db09b64
feat: Add version flag and command (#13)
aronchick Jan 20, 2026
5d11b1e
feat: Add semver format and JSON output to version command
aronchick Jan 22, 2026
1bcc816
Merge pull request #221 from aronchick/upstream-contrib/version-command
dlorenc Jan 22, 2026
d2cae33
fix: Improve robustness of state and worktree packages
Jan 22, 2026
7d5ac9a
docs: Improve public pkg documentation and test coverage
Jan 22, 2026
57aafac
refactor: CLI package code quality improvements
Jan 22, 2026
f61e510
refactor: Consolidate agent startup logic and add daemon tests
Jan 22, 2026
130b08c
Merge pull request #226 from dlorenc/multiclaude/kind-penguin
dlorenc Jan 22, 2026
910c451
Merge pull request #227 from dlorenc/multiclaude/witty-lion
dlorenc Jan 22, 2026
0b03fd6
Merge pull request #228 from dlorenc/multiclaude/happy-platypus
dlorenc Jan 22, 2026
59759ec
Merge pull request #229 from dlorenc/multiclaude/jolly-elephant
dlorenc Jan 22, 2026
f27c6c1
refactor: Apply code formatting and extract duplicated directory remo…
aronchick Jan 22, 2026
aedc2c7
ci: Add gofmt check to CI workflow (#232)
dlorenc Jan 22, 2026
52060ce
feat: Add agent-templates directory and copy on init (#236)
dlorenc Jan 23, 2026
7546490
feat: Add agent definition infrastructure for issue #233 (#237)
dlorenc Jan 23, 2026
08c8b17
feat: Add supervisor orchestration for agent definitions (issue #233 …
dlorenc Jan 23, 2026
16193f3
refactor: Address PR #238 review suggestions (#239)
dlorenc Jan 23, 2026
e9c22a4
feat: Complete configurable agents implementation (issue #233 PR 4) (…
dlorenc Jan 23, 2026
0372314
refactor: Extract branch cleanup helper to eliminate duplication (#240)
aronchick Jan 23, 2026
3840947
refactor: Use standard repo resolution in addWorkspace (#242)
aronchick Jan 23, 2026
b237e00
test: Improve test coverage across multiple packages (#241)
aronchick Jan 23, 2026
3e45b6e
fix: Correct LoadCustomPrompt filename for merge-queue and add tests …
dlorenc Jan 23, 2026
9b2a5fd
refactor: Extract atomic write helper to eliminate duplication in sta…
aronchick Jan 23, 2026
0740f37
refactor: Consolidate AgentType definitions and deprecate old prompt …
dlorenc Jan 23, 2026
916bea1
docs: Comprehensive documentation for configurable agents feature (#247)
dlorenc Jan 23, 2026
fc6dc2e
ci: Install Claude CLI before E2E tests (#251)
dlorenc Jan 23, 2026
8805e4f
test: Add comprehensive tests for DeleteRemoteBranch function (#249)
aronchick Jan 23, 2026
365d677
test: Add skip condition to TestRestoreDeadAgentsIncludesWorkspace fo…
dlorenc Jan 23, 2026
f320ea7
fix: Skip claude binary startup in daemon during test mode (#254)
dlorenc Jan 23, 2026
3bcee72
fix: Skip claude binary startup in daemon during test mode (#252)
dlorenc Jan 23, 2026
e249aeb
test: Add skip condition to TestHealthCheckCleansUpMarkedAgents for C…
dlorenc Jan 23, 2026
55f8e20
test: Add skip conditions to all tmux-dependent tests for CI compatib…
aronchick Jan 23, 2026
1fc3753
refactor: Eliminate code duplication and fix staticcheck issues (#250)
aronchick Jan 23, 2026
486d95e
fix: Make restore dead agents tests work without tmux (#248)
dlorenc Jan 23, 2026
ca0fd92
test: Add tests for CLI repo management and helper functions (#258)
aronchick Jan 23, 2026
6523ad4
refactor: Add helper methods to reduce code duplication (#257)
aronchick Jan 23, 2026
80eaaf6
ci: Enable TMUX_TESTS=1 for unit tests in CI (#260)
dlorenc Jan 23, 2026
a0468e7
fix: Skip session-creating tmux tests gracefully in headless CI (#265)
dlorenc Jan 23, 2026
e03c437
test: Add comprehensive tests to improve coverage (#269)
dlorenc Jan 23, 2026
35485af
refactor: Extract helper methods to reduce code duplication (#268)
dlorenc Jan 23, 2026
7b75bfa
test: Add createTestSessionOrSkip helper for resilient CI tests (#270)
dlorenc Jan 23, 2026
7e131fd
docs: Add comprehensive extensibility documentation for downstream pr…
aronchick Jan 23, 2026
cab120c
feat: Implement fork-aware workflow with pr-shepherd agent (#267)
Jan 23, 2026
10fc240
fix: Apply gofmt formatting
Jan 23, 2026
6159499
feat: Complete fork-aware workflow features for PR #274
Jan 23, 2026
e394224
Merge pull request #275 from dlorenc/multiclaude/kind-bear
dlorenc Jan 23, 2026
c4cafae
refactor(fork): simplify API and improve test coverage
Jan 23, 2026
f73609f
Merge pull request #276 from dlorenc/multiclaude/happy-penguin
dlorenc Jan 23, 2026
40aa120
fix: Handle existing local branch in --push-to flag
Jan 23, 2026
2779536
Merge pull request #279 from dlorenc/multiclaude/cool-raccoon
dlorenc Jan 23, 2026
ed68d29
refactor(cli): make 'start' an alias for 'daemon start'
Jan 23, 2026
eef1e91
refactor(cli): move message commands from 'agent' to 'message' noun g…
Jan 23, 2026
ad13dda
fix(test): update E2E test for CLI message command restructure
Jan 23, 2026
d95fe40
refactor(cli): rename 'work' command to 'worker' with create subcomma…
Jan 23, 2026
82200b4
refactor(cli): move init, list, history under 'repo' noun group (#234)
Jan 23, 2026
e71cc11
refactor(cli): move 'attach' under 'agent' noun group (#234)
Jan 23, 2026
c10f135
Merge pull request #277 from dlorenc/multiclaude/witty-penguin
dlorenc Jan 23, 2026
15b130f
Merge pull request #273 from aronchick/upstream/extensibility-docs
dlorenc Jan 23, 2026
0dcd835
docs: comprehensive documentation audit and fixes
Jan 24, 2026
eb4c406
Merge pull request #286 from dlorenc/work/silly-tiger
dlorenc Jan 24, 2026
e0cbd3b
refactor: reduce code duplication in worktree and fix unused variable…
dlorenc Jan 24, 2026
42b3f78
test: improve coverage for state and daemon packages (#288)
dlorenc Jan 24, 2026
3758cdd
docs: fix documentation accuracy issues across codebase (#291)
dlorenc Jan 24, 2026
b2921b2
docs: add test architecture review report (#293)
dlorenc Jan 24, 2026
e05be49
docs: regenerate directory structure documentation (#292)
dlorenc Jan 24, 2026
3b85381
docs: overhaul README with punchy intro and move detailed docs (#295)
dlorenc Jan 24, 2026
777ad3f
docs: fix incorrect line number reference in SOCKET_API.md (#296)
dlorenc Jan 24, 2026
6b204ef
refactor: extract ParseTrackMode function to reduce code duplication …
dlorenc Jan 24, 2026
1133b7f
ci: add golangci-lint v2.8.0 to CI pipeline (#298)
dlorenc Jan 24, 2026
b8a7c0c
test: add coverage tests for daemon, fork, and worktree packages (#299)
dlorenc Jan 24, 2026
6af72ef
fix: use unused addCommitToRemote function in test (#300)
dlorenc Jan 24, 2026
26ac32b
refactor: dramatically reduce agent prompt verbosity (72% smaller) (#…
dlorenc Jan 24, 2026
0875103
docs: remove dead docs and simplify extensibility section (#303)
dlorenc Jan 24, 2026
f26e68d
fix: append custom agent definitions to base templates (#328)
dlorenc Jan 28, 2026
19d4421
chore: remove unused yaml.v3 dependency (#318)
aronchick Jan 28, 2026
64fe398
fix: add validation checks to repo init and support dots in GitHub UR…
aronchick Jan 28, 2026
35a6dea
fix: add auto-repair for state inconsistencies in init and workspace …
aronchick Jan 28, 2026
91891e5
feat: add OpenSpec proposal for repo lifecycle management (#317)
aronchick Jan 28, 2026
b212dbc
feat: add multiclaude refresh command for on-demand worktree sync (#314)
aronchick Jan 28, 2026
9112b94
fix(fork): isolate tests from global git config (#310)
aronchick Jan 28, 2026
ab8e2a2
feat: add repo hibernate command to archive and stop work (#315)
aronchick Jan 28, 2026
de5449a
feat: add multiclaude status command for system overview (#316)
aronchick Jan 28, 2026
ff1ab5c
feat: Add environment hygiene and feature integration guidance to wor…
aronchick Jan 28, 2026
3c6b2d7
feat: Add CI guard rails for local validation (#218)
aronchick Jan 28, 2026
f2820ea
test: add daemon handler tests for improved coverage (#330)
dlorenc Jan 28, 2026
9a91824
refactor: add socket response helpers and argument extractors (#331)
dlorenc Jan 28, 2026
dfad1a5
feat: Add task management support and diagnostics endpoint (#313)
aronchick Jan 28, 2026
f2ab71a
fix(cli): generate new session ID in `multiclaude claude` when no his…
aronchick Jan 29, 2026
c75f643
feat: Add --json flag for LLM-friendly CLI help output
aronchick Jan 29, 2026
8f9708c
fix: detect running Claude before restarting to prevent session ID co…
aronchick Jan 27, 2026
b50f723
fix: lowercase error messages to satisfy staticcheck ST1005
aronchick Jan 29, 2026
89bb78b
feat: improve error messages with structured errors and suggestions
aronchick Jan 29, 2026
b2aa96a
fix: Clean up acknowledged messages in message routing loop
aronchick Jan 31, 2026
2b9ddc9
Merge PR #342: Clean up acknowledged messages in message routing loop
whitmo Feb 28, 2026
aae14e4
Merge PR #334: Generate new session ID when no history exists
whitmo Feb 28, 2026
8edbec0
Merge PR #336: Detect running Claude before restart + lowercase errors
whitmo Feb 28, 2026
a03d3ea
Merge PR #340: Structured error constructors with suggestions
whitmo Feb 28, 2026
e8c8bb2
Merge PR #335: Add --json flag for LLM-friendly CLI help output
whitmo Feb 28, 2026
9246299
test: Add comprehensive tests for PRs #334, #335, #336, #340, #342
whitmo Feb 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,24 @@ jobs:
- name: Build
run: go build -v ./...

lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.25'
cache: true

- name: Run golangci-lint
uses: golangci/golangci-lint-action@v7
with:
version: v2.8.0

unit-tests:
name: Unit Tests
runs-on: ubuntu-latest
Expand All @@ -40,6 +58,8 @@ jobs:
run: sudo apt-get update && sudo apt-get install -y tmux

- name: Run unit tests with coverage
env:
TMUX_TESTS: "1"
run: |
go test -coverprofile=coverage.out -covermode=atomic ./internal/... ./pkg/...
go tool cover -func=coverage.out
Expand Down Expand Up @@ -69,6 +89,8 @@ jobs:
run: sudo apt-get update && sudo apt-get install -y tmux

- name: Check coverage thresholds
env:
TMUX_TESTS: "1"
run: |
go test -coverprofile=coverage.out -covermode=atomic ./internal/... ./pkg/...

Expand Down Expand Up @@ -113,6 +135,14 @@ jobs:
git config --global user.email "ci@github.com"
git config --global user.name "GitHub CI"

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Install Claude CLI
run: npm install -g @anthropic-ai/claude-code

- name: Run e2e tests
run: go test -v ./test/...

Expand Down
100 changes: 100 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
version: "2"

linters:
default: standard
enable:
- gocritic
- misspell
settings:
errcheck:
# Don't check type assertions (too noisy for map access patterns)
check-type-assertions: false
# Exclude common patterns where ignoring errors is acceptable
exclude-functions:
# File operations that are safe to ignore in defer
- (io.Closer).Close
- (*os.File).Close
- (net.Conn).Close
- (net.Listener).Close
- (*net.UnixConn).Close
- (*net.UnixListener).Close
# Exec commands in cleanup contexts
- (*os/exec.Cmd).Run
# Printf-like functions where errors are typically ignored
- (*github.com/fatih/color.Color).Printf
- (*github.com/fatih/color.Color).Print
- fmt.Printf
- fmt.Println
- fmt.Print
- fmt.Scanln
- fmt.Sscanf
# JSON encoding where error handling is optional
- (*encoding/json.Encoder).Encode
# OS operations that are best-effort cleanup
- os.Remove
- os.RemoveAll
- os.Setenv
- os.Unsetenv
- os.Chdir
- os.Chmod
- os.MkdirAll
- os.WriteFile
# Daemon/server stop operations in cleanup
- (*github.com/dlorenc/multiclaude/internal/daemon.Daemon).Stop
- (*github.com/dlorenc/multiclaude/internal/daemon.Daemon).Start
# Tmux cleanup operations
- (*github.com/dlorenc/multiclaude/pkg/tmux.Client).KillSession
- (*github.com/dlorenc/multiclaude/pkg/tmux.Client).KillWindow
- (*github.com/dlorenc/multiclaude/pkg/tmux.Client).SendKeysLiteral
# State operations that are often best-effort
- (*github.com/dlorenc/multiclaude/internal/state.State).AddRepo
- (*github.com/dlorenc/multiclaude/internal/state.State).AddAgent
- (*github.com/dlorenc/multiclaude/internal/state.State).RemoveAgent
- (*github.com/dlorenc/multiclaude/internal/state.State).UpdateAgent
- (*github.com/dlorenc/multiclaude/internal/state.State).ClearAllAgents
- (*github.com/dlorenc/multiclaude/internal/state.State).Save
- (*github.com/dlorenc/multiclaude/internal/state.State).SetCurrentRepo
# Worktree removal in cleanup
- (*github.com/dlorenc/multiclaude/internal/worktree.Manager).Remove
# CLI operations in tests
- (*github.com/dlorenc/multiclaude/internal/cli.CLI).Execute
- (*github.com/dlorenc/multiclaude/internal/cli.CLI).showVersion
- (*github.com/dlorenc/multiclaude/internal/cli.CLI).showHelp
# Socket server cleanup
- (*github.com/dlorenc/multiclaude/internal/socket.Server).Stop
- (*github.com/dlorenc/multiclaude/internal/socket.Server).Serve
# Logger cleanup
- (*github.com/dlorenc/multiclaude/internal/logging.Logger).Close
gocritic:
disabled-checks:
# Allow if-else chains for simple conditions
- ifElseChain
# Allow deprecation comments in various formats
- deprecatedComment
# Allow else { if } patterns in some cases
- elseif
staticcheck:
checks:
- all
# Disable strict style checks
- -ST1000 # Package comments - not critical for internal packages
- -ST1020 # Method comment form - too strict
- -ST1021 # Type comment form - too strict
- -ST1022 # Const comment form - too strict
- -QF1003 # Don't require tagged switch
- -SA9003 # Empty branches are intentional for error handling
- -QF1012 # Allow WriteString with fmt.Sprintf (more readable)

formatters:
enable:
- gofmt

issues:
# Show all issues from a linter
max-issues-per-linter: 0
# Show all issues with the same text
max-same-issues: 0

run:
timeout: 5m
tests: true
4 changes: 2 additions & 2 deletions .multiclaude/REVIEWER.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ After every 4-5 PRs have been merged, spawn the following maintenance agents:
Spawn a worker to look for opportunities to refactor and simplify the codebase:

```bash
multiclaude work "Review the codebase for refactoring opportunities: look for duplicated code, overly complex functions, unused code, and areas that could be simplified. Create a PR with any improvements found. Focus on small, safe changes that improve readability and maintainability without changing behavior."
multiclaude worker create "Review the codebase for refactoring opportunities: look for duplicated code, overly complex functions, unused code, and areas that could be simplified. Create a PR with any improvements found. Focus on small, safe changes that improve readability and maintainability without changing behavior."
```

**Focus areas:**
Expand All @@ -24,7 +24,7 @@ multiclaude work "Review the codebase for refactoring opportunities: look for du
Spawn a worker to check test coverage and fill gaps:

```bash
multiclaude work "Analyze test coverage across the codebase. Run 'go test -coverprofile=coverage.out ./...' to identify packages with low coverage. Add tests for uncovered or under-tested code paths, prioritizing critical business logic and error handling. Create a PR with the new tests."
multiclaude worker create "Analyze test coverage across the codebase. Run 'go test -coverprofile=coverage.out ./...' to identify packages with low coverage. Add tests for uncovered or under-tested code paths, prioritizing critical business logic and error handling. Create a PR with the new tests."
```

**Focus areas:**
Expand Down
53 changes: 40 additions & 13 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -281,22 +281,49 @@ The CLI handles user commands and communicates with the daemon.
**Command Tree:**
```
multiclaude
├── start # Start daemon
├── start # Start daemon (alias for daemon start)
├── stop-all [--clean] # Stop everything
├── init <url> # Initialize repo
├── list # List repos
├── work <task> # Create worker
├── repo
│ ├── init <url> # Initialize repo
│ ├── list # List repos
│ ├── rm <name> # Remove repo
│ ├── use <name> # Set default repo
│ ├── current # Show default repo
│ ├── unset # Clear default repo
│ └── history # Show task history
├── worker
│ ├── create <task> # Create worker
│ ├── list # List workers
│ └── rm <name> # Remove worker
├── workspace
│ ├── add <name> # Add workspace
│ ├── list # List workspaces
│ ├── connect <name> # Connect to workspace
│ └── rm <name> # Remove workspace
├── agent
│ ├── send-message <to> <msg>
│ ├── list-messages
│ ├── read-message <id>
│ ├── ack-message <id>
│ └── complete
├── attach <name> # Attach to tmux window
│ ├── attach <name> # Attach to tmux window
│ ├── complete # Signal completion
│ ├── restart <name> # Restart crashed agent
│ ├── send-message # (alias for message send)
│ ├── list-messages # (alias for message list)
│ ├── read-message # (alias for message read)
│ └── ack-message # (alias for message ack)
├── message
│ ├── send <to> <msg> # Send message
│ ├── list # List messages
│ ├── read <id> # Read message
│ └── ack <id> # Acknowledge message
├── agents
│ ├── list # List agent definitions
│ ├── spawn # Spawn from prompt file
│ └── reset # Reset to defaults
├── cleanup [--dry-run] # Clean orphaned resources
├── repair # Fix state
├── review <pr-url> # Spawn review agent
├── config # View/modify repo config
├── logs # View agent logs
├── bug # Generate diagnostic report
├── version # Show version
└── daemon
├── start
├── stop
Expand All @@ -309,7 +336,7 @@ multiclaude
### Repository Initialization

```
User: multiclaude init https://github.com/org/repo
User: multiclaude repo init https://github.com/org/repo

CLI Daemon System
│ │ │
Expand Down Expand Up @@ -339,7 +366,7 @@ CLI Daemon System
### Worker Creation

```
User: multiclaude work "Add unit tests"
User: multiclaude worker create "Add unit tests"

CLI Daemon System
│ │ │
Expand All @@ -360,7 +387,7 @@ CLI Daemon System
### Message Delivery

```
Agent A: multiclaude agent send-message agent-b "Hello"
Agent A: multiclaude message send agent-b "Hello"

CLI Daemon System
│ │ │
Expand Down
Loading