Help us improve
Share bugs, ideas, or general feedback.
Share bugs, ideas, or general feedback.
Share bugs, ideas, or general feedback.
By excitedjs
Multi-repo Claude Code orchestrator. Run one dispatcher session in the parent of your repos; spawn, message, and wait on tmux teammates across them — all from one place.
npx claudepluginhub excitedjs/claudemux --plugin claudemuxManage dispatcher-style coordination across sibling git repos from a parent workspace. Use when the user asks to spawn, dispatch, message, resume, inspect, compact, or kill Claude/Codex teammates; run one-shot Codex pool work with tm ask; coordinate work across sibling repos; check teammate state; or query teammate history. Also use when the user names dispatcher concepts such as "send out a teammate / spin up a teammate / dispatch a task / check what X is doing / multi-repo / dispatcher".
Periodic self-review of the dispatcher's own conversation history. Surfaces uncaptured corrections, recurring foot-guns, and drifted conventions, and promotes each finding into the right carrier (CLAUDE.md, project memory, or local dispatcher notes). Trigger when the user asks to "复盘 / 自我反省 / 派活流程审查 / review dispatcher / optimize dispatcher / let dispatcher self-reflect / /claudemux:optimize", or when a scheduled cron callback fires the periodic review.
Matches all tools
Hooks run on every tool call, not just specific ones
Share bugs, ideas, or general feedback.
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge.
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge.
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
Multi-model consensus engine integrating OpenAI Codex CLI, Gemini CLI, and Claude CLI for collaborative code review and problem-solving.
Memory compression system for Claude Code - persist context across sessions
Ultra-compressed communication mode. Cuts ~75% of tokens while keeping full technical accuracy by speaking like a caveman.
Comprehensive UI/UX design plugin for mobile (iOS, Android, React Native) and web applications with design systems, accessibility, and modern patterns
Standalone image generation plugin using Nano Banana MCP server. Generates and edits images, icons, diagrams, patterns, and visual assets via Gemini image models. No Gemini CLI dependency required.
Write feature specs, plan roadmaps, and synthesize user research faster. Keep stakeholders updated and stay ahead of the competitive landscape.
Feishu (飞书) channel for Claude Code — bridge Feishu messages into a running Claude Code session over a long-lived WebSocket connection, with built-in access control.
English · 简体中文
claude+tmux. One dispatcher Claude Code session talks to you. One teammate Claude Code per repo runs in its owntmuxsession. You orchestrate the fleet in plain language.
Worktree default + name decoupling (1.0 cut).
tm spawn <path>now takes a filesystem path; the teammate name is a flat identifier (--name, or auto<basename>-<rand4>). Every other verb takes that name. Teammates run inside a git worktree at<path>/.claude/worktrees/<name>/by default;--no-worktreeopts out. Pre-upgrade teammates must betm kill-ed and respawned (schema 1 → 2; no silent migration)..worktreeincludefor the Codex path is a TODO — copy.envetc. into the Codex worktree by hand for now. See.agents/decisions/worktree-default-and-name-repo-decoupling.mdfor the why.
flowchart TB
user(["You<br/>(terminal · web · mobile)"])
subgraph dispatcher_dir["dispatcher directory · the parent of your repos"]
dispatcher["dispatcher<br/>(claude in tmux, talks to you)"]
repoA[("repo-a/")]
repoB[("repo-b/")]
repoC[("repo-c/")]
end
subgraph teammates["teammates · one tmux session per repo"]
tA["teammate-repo-a<br/>(claude in repo-a/)"]
tB["teammate-repo-b<br/>(claude in repo-b/)"]
end
user <-->|chat| dispatcher
user -.->|optional: direct drive<br/>via Remote Control| tA
dispatcher -->|tm spawn / send / wait| tA
dispatcher -->|tm spawn / send / wait| tB
tA -.cwd.-> repoA
tB -.cwd.-> repoB
Every teammate is a real claude REPL with a Remote Control URL. Open the
URL in a browser or the mobile app and you're talking to that teammate
directly — no terminal needed.
Enable Remote Control in whichever scope you want:
tm spawn <path> --remote-control turns it on for
just that teammate; --no-remote-control keeps claudemux from enabling it
(it does not suppress a user-global remoteControlAtStartup, which claude
still honors — see below). Set CLAUDEMUX_REMOTE_CONTROL=1 in the
dispatcher's .claude/settings.json env block to make it the default for
every tm spawn. This keeps the dispatcher and any unrelated claude
sessions off Remote Control — a per-spawn flag always overrides the config
(precedence: explicit flag > config > off)./claudemux:setup can flip on Claude Code's
user-global remoteControlAtStartup, so every claude session — dispatcher
and teammates alike — registers a URL the moment it starts.In any Claude Code session:
/plugin marketplace add excitedjs/claudemux
/plugin install claudemux@claudemux
/reload-plugins
Then cd to the parent of your sibling repos and start the dispatcher:
cd ~/path/to/your/dev-dir
claude
In the REPL:
/claudemux:setup
/claudemux:setup also seeds a .workspace/ directory in your dispatcher dir holding three personalization files (persona.md, user-profile.md, principles.md) that get imported into every dispatcher session, plus notes/ and artifacts/ for long-term notes and dispatcher-generated intermediate output. The setup walks you through filling them in; you can skip and edit later. See .workspace/README.md in your dispatcher dir after setup for full layout.
Talk in plain language — the dispatcher skill picks up the intent:
派一个 teammate 去 repo-a 跑测试
看看 repo-b 现在在干啥
让 repo-a 跑 lint,同时让 repo-b 升级 react 到 19
Or call tm directly:
tm spawn repo-a --name testbot --prompt 'run yarn test in unit-test' # atomic: spawn + send + wait + print
tm send testbot --prompt 'now lint' # sync send: returns the reply on stdout
tm states # fleet snapshot
tm kill testbot # done
The first positional is a <path> (here repo-a, a sibling of the
dispatcher). The teammate identifier is whatever you pass via --name,
or — when you omit --name — the auto-generated <basename>-<rand4>
that spawn prints on stderr (spawned: repo-a-7d3a). Every other verb
takes that flat identifier.
tm scripttm is on PATH inside any Claude Code session. To use it from a regular
terminal, see Outside Claude Code.