Agent Orchestrator Cockpit
Cmux

Drives cmux as an agent cockpit to boot, race, and monitor visible agent teams. Mac-only.
---
name: CMUX
version: 1.0.5
description: "Drives cmux as an agent cockpit to boot, race, and monitor visible agent teams. Mac-only. USE WHEN cmux, agent cockpit, boot an agent team, orchestrate agents, three-tier orchestration, agent race, needle-in-haystack hotfix, agent fleet, 2x2 fleet, watch/monitor my agents, scale compute to scale impact, send a prompt to a running agent, multiplexer, terminal cockpit, orchestrator lead worker. NOT FOR one-shot in-harness subagents with no terminal to watch (use Agent/Workflow), the Pulse dashboard itself (cmux feeds it, use Pulse), browser deploy-verification (use Interceptor), or Linux/Windows (cmux is Mac-only — use tmux)."
---
# CMUX
Make cmux the cockpit for every agent — LifeOS's own and your hands-on coding teams. One command boots a named, color-identified workspace of agents you can *see, prompt, and steer*, because an agent you can't see is an agent you can't improve. {{DA_NAME}} drives them through cmux's real send/read/open-close loop; a poll-based monitor speaks up when they finish.
Everything routes through one wrapper: `bun ~/.claude/skills/CMUX/Tools/cmux.ts <subcommand>`. It auto-launches the cmux app — but cmux's socket is **default-deny**, so driving it needs auth (see the first Gotcha).
> **Status (2026-07-07):** built and offline-verified — wrapper is type-clean (`tsc`/`bun build`), `voice` works live, public-clean grep passes, Kitty hooks untouched. **Live-driving (boot-team/race/fleet/monitor) is UNPROVEN** — it needs the socket-auth handshake, which has not yet executed. To prove it: run the wrapper *inside a cmux surface* (inherits auth), or set a cmux Settings socket password → `CMUX_SOCKET_PASSWORD`. **Security note:** a socket password lets any local process holding it drive your whole agent fleet — set it deliberately and never commit it to a public file.
## Workflow Routing
| Trigger | Workflow |
|---------|----------|Overview
Make cmux the cockpit for every agent — LifeOS's own and your hands-on coding teams. One command boots a named, color-identified workspace of agents you can see, prompt, and steer, because an agent you can't see is an agent you can't improve. {{DA_NAME}} drives them through cmux's real send/read/open-close loop; a poll-based monitor speaks up when they finish.
Manual install (npx, ZIP)
npx skills add danielmiessler/LifeOS --skill CMUX -g -a claude-codenpx degit danielmiessler/LifeOS/LifeOS/install/skills/CMUX#main ~/.claude/skills/cmuxConnects with Agent Alley MCP · agentalley.io/mcp
Files included
SKILL.md6.8 KB
Read SKILL.md here
Show the full text72 lines
CMUX
Make cmux the cockpit for every agent — LifeOS's own and your hands-on coding teams. One command boots a named, color-identified workspace of agents you can see, prompt, and steer, because an agent you can't see is an agent you can't improve. {{DA_NAME}} drives them through cmux's real send/read/open-close loop; a poll-based monitor speaks up when they finish.
Everything routes through one wrapper: bun ~/.claude/skills/CMUX/Tools/cmux.ts <subcommand>. It auto-launches the cmux app — but cmux's socket is default-deny, so driving it needs auth (see the first Gotcha).
Status (2026-07-07): built and offline-verified — wrapper is type-clean (
tsc/bun build),voiceworks live, public-clean grep passes, Kitty hooks untouched. Live-driving (boot-team/race/fleet/monitor) is UNPROVEN — it needs the socket-auth handshake, which has not yet executed. To prove it: run the wrapper inside a cmux surface (inherits auth), or set a cmux Settings socket password →CMUX_SOCKET_PASSWORD. Security note: a socket password lets any local process holding it drive your whole agent fleet — set it deliberately and never commit it to a public file.
Workflow Routing
| Trigger | Workflow |
|---|---|
| "boot a team", "3-tier team", "orchestrator/lead/workers" | Workflows/BootTeam.md |
| "race agents", "hotfix race", "throw N agents at this", "needle in a haystack" | Workflows/AgentRace.md |
| "fleet", "2x2 fleet", "named teams", "the remote fleet", "mini-fleet" | Workflows/Fleet.md |
| "watch/monitor my agents", "tell me when they're done", "observe to improve" | Workflows/Monitor.md |
Quick Reference
CT=~/.claude/skills/CMUX/Tools/cmux.ts
bun $CT ping # ensure cmux is up (auto-launches)
bun $CT boot-team --name debug --tiers orchestrator,lead,worker,worker
bun $CT race --feature login-500 --agents 4 # first-to-solve wins
bun $CT fleet --name alpha --grid 2x2 --cmds "claude;codex;claude;bun test --watch"
bun $CT mini-fleet # SSH panes from USER fleet.json
bun $CT send --surface workspace:1/surface:2 "run the tests" --enter
bun $CT read --surface workspace:1/surface:2 --lines 40
bun $CT monitor --workspace workspace:1 # poll + {{DA_NAME}} voice on done
bun $CT flash --workspace workspace:1 # visual attention
The loop that makes it work: send (type a prompt) → send-key Enter (submit — --enter does both) → read (see the result) → close-surface (tear down). That send/read/open-close cycle is the whole programmatic-access story; the recipes are just it, composed.
What stays underneath (not replaced): Pulse (localhost:31337) is still the dashboard, {{DA_NAME}} voice still fires via /notify, the Algorithm/ISA/memory/model-routing are untouched. cmux replaces the terminal-watching layer, not the system. See DESIGN.md for the full feature map and the staged Kitty→cmux migration.
Gotchas
sendtypes but does not submit. cmuxsendputs text in the surface; it does not press Enter. Always use--enter(or a followsend-key Enter) when you mean to run the prompt, thenreadto confirm it actually ran. Asendwith no Enter that claims "the agent is working" is a false done-claim.- The socket is default-DENY — this is the #1 gotcha. Even while the app runs, an outside process gets
Access denied — only processes started inside cmux can connect. Two ways through: (a) run the orchestrator inside a cmux surface — it inherits auth via a taggedCMUX_SOCKET_PATHenv, no password; or (b) set a socket password in cmux Settings and export it asCMUX_SOCKET_PASSWORD(the wrapper passes--password). The socket also only exists while the app runs (cmux.sockabsent when closed). Pick (a) for agent-driven work, (b) for external scripting. - cmux is push-native — prefer hooks over polling. Launch Claude agents with
cmux claude-teamsand cmux auto-injects Claude Code lifecycle hooks (SessionStart/Stop/Notification/UserPromptSubmit/... → cmux claude-hook <event>), so agents report their own status. Also available: tmux-styleset-hook <event> <cmd>, a blockingwait-for -S <name>,pipe-pane --command, and OSC9/99/777escapes.monitor'ssurface-health+read-screenpoll is the FALLBACK for non-Claude agents, not the primary path. - Sidebar metadata is a no-auth Pulse bridge.
report_meta/report_meta_block/set-status/set-progress/logwrite agent status/progress into the workspace sidebar and persist to the session JSON at~/Library/Application Support/cmux/session-*.json— which is readable without the socket. LifeOS reads that file to mirror cmux agent state into Pulse without touching the auth wall. - Mac-only. cmux is a macOS app. The remote fleet still runs LifeOS, but cmux drives it via local SSH panes, not by running cmux on the minis. No Linux/WSL — that path is tmux.
- Refs are positional and can shift.
workspace:1/surface:2indexes move as you open/close things. For anything long-lived, resolve UUIDs (--id-format uuids) fromtreeand hold those. - Public skill — private specifics live in USER config. The remote fleet's hosts come from
~/.claude/LIFEOS/USER/CUSTOMIZATIONS/SKILLS/CMUX/fleet.json({"hosts":[{"name","ssh"}]}), never from this skill's files. The socket password comes fromCMUX_SOCKET_PASSWORD.
Examples
Boot a debugging team and drive the lead:
User: "boot a cmux team to chase the flaky test"
→ bun $CT boot-team --name flaky --tiers orchestrator,lead,worker,worker
→ bun $CT send --surface <lead-ref> "find why auth.test.ts flakes; delegate repro to a worker" --enter
→ bun $CT monitor --workspace <ws> # {{DA_NAME}} voice when the lead reports back
Race a production hotfix:
User: "prod login is 500ing — race it"
→ bun $CT race --feature login-500 --agents 4
→ (four agents attack the same repo; first with a root cause wins)
→ bun $CT read --surface <winner> ; close the losers
Full reference for the migration and feature map: DESIGN.md.
| 1 | |
| 2 | name CMUX |
| 3 | version 1.0.5 |
| 4 | description "Drives cmux as an agent cockpit to boot, race, and monitor visible agent teams. Mac-only. USE WHEN cmux, agent cockpit, boot an agent team, orchestrate agents, three-tier orchestration, agent race, needle-in-haystack hotfix, agent fleet, 2x2 fleet, watch/monitor my agents, scale compute to scale impact, send a prompt to a running agent, multiplexer, terminal cockpit, orchestrator lead worker. NOT FOR one-shot in-harness subagents with no terminal to watch (use Agent/Workflow), the Pulse dashboard itself (cmux feeds it, use Pulse), browser deploy-verification (use Interceptor), or Linux/Windows (cmux is Mac-only — use tmux)." |
| 5 | |
| 6 | |
| 7 | # CMUX |
| 8 | |
| 9 | Make cmux the cockpit for every agent — LifeOS's own and your hands-on coding teams. One command boots a named, color-identified workspace of agents you can *see, prompt, and steer*, because an agent you can't see is an agent you can't improve. {{DA_NAME}} drives them through cmux's real send/read/open-close loop; a poll-based monitor speaks up when they finish. |
| 10 | |
| 11 | Everything routes through one wrapper: `bun ~/.claude/skills/CMUX/Tools/cmux.ts <subcommand>`. It auto-launches the cmux app — but cmux's socket is **default-deny**, so driving it needs auth (see the first Gotcha). |
| 12 | |
| 13 | > **Status (2026-07-07):** built and offline-verified — wrapper is type-clean (`tsc`/`bun build`), `voice` works live, public-clean grep passes, Kitty hooks untouched. **Live-driving (boot-team/race/fleet/monitor) is UNPROVEN** — it needs the socket-auth handshake, which has not yet executed. To prove it: run the wrapper *inside a cmux surface* (inherits auth), or set a cmux Settings socket password → `CMUX_SOCKET_PASSWORD`. **Security note:** a socket password lets any local process holding it drive your whole agent fleet — set it deliberately and never commit it to a public file. |
| 14 | |
| 15 | ## Workflow Routing |
| 16 | |
| 17 | | Trigger | Workflow | |
| 18 | |---------|----------| |
| 19 | | "boot a team", "3-tier team", "orchestrator/lead/workers" | `Workflows/BootTeam.md` | |
| 20 | | "race agents", "hotfix race", "throw N agents at this", "needle in a haystack" | `Workflows/AgentRace.md` | |
| 21 | | "fleet", "2x2 fleet", "named teams", "the remote fleet", "mini-fleet" | `Workflows/Fleet.md` | |
| 22 | | "watch/monitor my agents", "tell me when they're done", "observe to improve" | `Workflows/Monitor.md` | |
| 23 | |
| 24 | ## Quick Reference |
| 25 | |
| 26 | |
| 27 | CT=~/.claude/skills/CMUX/Tools/cmux.ts |
| 28 | bun $CT ping # ensure cmux is up (auto-launches) |
| 29 | bun $CT boot-team --name debug --tiers orchestrator,lead,worker,worker |
| 30 | bun $CT race --feature login-500 --agents 4 # first-to-solve wins |
| 31 | bun $CT fleet --name alpha --grid 2x2 --cmds "claude;codex;claude;bun test --watch" |
| 32 | bun $CT mini-fleet # SSH panes from USER fleet.json |
| 33 | bun $CT send --surface workspace:1/surface:2 "run the tests" --enter |
| 34 | bun $CT read --surface workspace:1/surface:2 --lines 40 |
| 35 | bun $CT monitor --workspace workspace:1 # poll + {{DA_NAME}} voice on done |
| 36 | bun $CT flash --workspace workspace:1 # visual attention |
| 37 | |
| 38 | |
| 39 | **The loop that makes it work:** `send` (type a prompt) → `send-key Enter` (submit — `--enter` does both) → `read` (see the result) → `close-surface` (tear down). That send/read/open-close cycle is the whole programmatic-access story; the recipes are just it, composed. |
| 40 | |
| 41 | **What stays underneath (not replaced):** Pulse (localhost:31337) is still the dashboard, {{DA_NAME}} voice still fires via `/notify`, the Algorithm/ISA/memory/model-routing are untouched. cmux replaces the *terminal-watching layer*, not the system. See `DESIGN.md` for the full feature map and the staged Kitty→cmux migration. |
| 42 | |
| 43 | ## Gotchas |
| 44 | |
| 45 | **`send` types but does not submit.** cmux `send` puts text in the surface; it does not press Enter. Always use `--enter` (or a follow `send-key Enter`) when you mean to run the prompt, then `read` to confirm it actually ran. A `send` with no Enter that claims "the agent is working" is a false done-claim. |
| 46 | **The socket is default-DENY — this is the #1 gotcha.** Even while the app runs, an outside process gets `Access denied — only processes started inside cmux can connect`. Two ways through: (a) **run the orchestrator inside a cmux surface** — it inherits auth via a tagged `CMUX_SOCKET_PATH` env, no password; or (b) set a **socket password** in cmux Settings and export it as `CMUX_SOCKET_PASSWORD` (the wrapper passes `--password`). The socket also only exists while the app runs (`cmux.sock` absent when closed). Pick (a) for agent-driven work, (b) for external scripting. |
| 47 | **cmux is push-native — prefer hooks over polling.** Launch Claude agents with `cmux claude-teams` and cmux auto-injects Claude Code lifecycle hooks (`SessionStart/Stop/Notification/UserPromptSubmit/... → cmux claude-hook <event>`), so agents report their own status. Also available: tmux-style `set-hook <event> <cmd>`, a blocking `wait-for -S <name>`, `pipe-pane --command`, and OSC `9/99/777` escapes. `monitor`'s `surface-health` + `read-screen` poll is the FALLBACK for non-Claude agents, not the primary path. |
| 48 | **Sidebar metadata is a no-auth Pulse bridge.** `report_meta` / `report_meta_block` / `set-status` / `set-progress` / `log` write agent status/progress into the workspace sidebar and persist to the session JSON at `~/Library/Application Support/cmux/session-*.json` — which is **readable without the socket**. LifeOS reads that file to mirror cmux agent state into Pulse without touching the auth wall. |
| 49 | **Mac-only.** cmux is a macOS app. The remote fleet still runs LifeOS, but cmux drives it via local SSH panes, not by running cmux on the minis. No Linux/WSL — that path is tmux. |
| 50 | **Refs are positional and can shift.** `workspace:1/surface:2` indexes move as you open/close things. For anything long-lived, resolve UUIDs (`--id-format uuids`) from `tree` and hold those. |
| 51 | **Public skill — private specifics live in USER config.** The remote fleet's hosts come from `~/.claude/LIFEOS/USER/CUSTOMIZATIONS/SKILLS/CMUX/fleet.json` (`{"hosts":[{"name","ssh"}]}`), never from this skill's files. The socket password comes from `CMUX_SOCKET_PASSWORD`. |
| 52 | |
| 53 | ## Examples |
| 54 | |
| 55 | **Boot a debugging team and drive the lead:** |
| 56 | |
| 57 | User: "boot a cmux team to chase the flaky test" |
| 58 | → bun $CT boot-team --name flaky --tiers orchestrator,lead,worker,worker |
| 59 | → bun $CT send --surface <lead-ref> "find why auth.test.ts flakes; delegate repro to a worker" --enter |
| 60 | → bun $CT monitor --workspace <ws> # {{DA_NAME}} voice when the lead reports back |
| 61 | |
| 62 | |
| 63 | **Race a production hotfix:** |
| 64 | |
| 65 | User: "prod login is 500ing — race it" |
| 66 | → bun $CT race --feature login-500 --agents 4 |
| 67 | → (four agents attack the same repo; first with a root cause wins) |
| 68 | → bun $CT read --surface <winner> ; close the losers |
| 69 | |
| 70 | |
| 71 | **Full reference for the migration and feature map:** `DESIGN.md`. |
| 72 |
Details
- Version
- 1.0.5
- License
- MIT
- Stars on the repo
- ★ 19,269
- Checked
- Source
- danielmiessler/LifeOS ↗
- Creator
- danielmiessler · 63 listings
Similar skills
See all →
SkillBrowser Testing Suite
AgentEverything MCP
AgentWeb Content Fetcher
AgentFilesystem Operations
SkillLibrary Reference Tool
SkillChrome DevTools DebuggerMore from danielmiessler
SkillScope Oscillation Analyzer
SkillAphorism Library Manager
SkillSocial Platform Scraper
SkillVisual Content Generator
SkillArXiv Paper Finder
SkillFiller Removal Audio Editor