CLI Reference
Every tmux-ide command — the current surface, straight from tmux-ide --help
CLI reference
Every command accepts --json for structured output. Run tmux-ide --help for
the built-in version of this list.
Sessions
| Command | Description |
|---|---|
tmux-ide | Launch .tmux-ide/workspace.yml or compatible ide.yml, or open the home cockpit if there is none |
tmux-ide <path> | Launch from a specific directory (cockpit if no config is found) |
tmux-ide init [--template <name>] | Scaffold .tmux-ide/workspace.yml (auto-detects stack) |
tmux-ide stop | Kill the current IDE session |
tmux-ide restart | Stop and relaunch the session |
tmux-ide attach | Reattach to a running session |
tmux-ide ls | List all tmux sessions |
tmux-ide status [--json] | Show session status |
The dock
| Command | Description |
|---|---|
tmux-ide adopt <session> | Add the live status bar (dock) to a session |
tmux-ide adopt --all | Adopt every live (non-internal) session |
tmux-ide unadopt <session> | Remove the status bar |
tmux-ide team [--json] | TUI over all sessions (--json prints fleet state) |
tmux-ide switcher | Compact session picker (prefix j / ⌥p) |
tmux-ide cheatsheet | Print the key cheat sheet (prefix k / ⌥k) |
tmux-ide menu [--client N] | Open the actions menu (prefix u / ⌥m / right-click) |
tmux-ide popup <widget> | Open a widget panel (explorer / changes / config) |
tmux-ide sidebar-toggle [--session S] | Toggle the nav column (prefix b / ⌥b) |
Agent status
| Command | Description |
|---|---|
tmux-ide integration install claude | Authoritative agent status via Claude Code hooks |
tmux-ide agent explain <pane> [--json] | Debug how a pane's agent state is detected |
tmux-ide events [--follow] [--json] | Stream agent-status transitions (needs an adopted session) |
tmux-ide wait agent-status <session> --status <s> [--timeout <ms>] | Block until a session reaches a status (exit 0 match / 1 timeout) |
tmux-ide wait output <pane|session> --match <regex> [--timeout <ms>] | Block until a pane's output matches a regex |
See Agent detection and Notifications & events.
Restore
| Command | Description |
|---|---|
tmux-ide restore [--dry-run] [--run-commands] [--resume-agents] [--json] | Rebuild the fleet from the last snapshot after a tmux crash |
--resume-agents revives Claude conversations via claude --resume. See
Restore & resume.
Worktrees
| Command | Description |
|---|---|
tmux-ide worktree create <branch> [--from <ref>] [--dir <path>] [--no-session] | Add a git worktree (new branch) + open a session in it |
tmux-ide worktree open <branch> | Open (or switch to) the session for an existing worktree |
tmux-ide worktree list [--json] | List worktrees joined with their session status |
tmux-ide worktree remove <branch> [--force] | Kill the worktree's session + remove the worktree |
See Worktrees.
Config & inspection
| Command | Description |
|---|---|
tmux-ide inspect [--json] | Show effective config and runtime state |
tmux-ide doctor | Check system requirements |
tmux-ide validate [--json] | Validate the resolved project config |
tmux-ide detect [--json] | Detect project stack |
tmux-ide detect --write | Detect and write .tmux-ide/workspace.yml |
tmux-ide migrate --dry-run [--json] | Preview ide.yml to .tmux-ide/workspace.yml migration |
tmux-ide migrate --write [--json] | Create .tmux-ide/workspace.yml from ide.yml |
tmux-ide config [--json] | Dump config as JSON |
tmux-ide config set <path> <value> | Set a config value by dot path |
tmux-ide config add-pane --row <N> --title <T> [--command <C>] | Add a pane |
tmux-ide config remove-pane --row <N> --pane <M> | Remove a pane |
tmux-ide config add-row [--size <percent>] | Add a row |
Setup & settings
| Command | Description |
|---|---|
tmux-ide setup | Interactive TUI setup wizard |
tmux-ide setup --edit | Open the config tree editor |
tmux-ide settings | Interactive TUI config manager |
Pane messaging
| Command | Description |
|---|---|
tmux-ide send <target> <message> | Send a message to a pane |
tmux-ide send --to <name> <message> | Target by name, title, role, or ID |
tmux-ide send <target> --no-enter <msg> | Send text without pressing Enter |
send also reads from stdin: echo "msg" | tmux-ide send <target>.
Server
| Command | Description |
|---|---|
tmux-ide --headless [--port N] | Own the canonical daemon in this foreground process |
tmux-ide command-center [--port N] | Start the legacy command-center HTTP API |
tmux-ide server [--port N] | Start the legacy HTTP + PTY WebSocket server |
Native and desktop handoff
--headless is the config-free daemon entry point for the native app and other
process hosts. Launch the installed executable directly with an argv array:
executable: /resolved/path/to/tmux-ide
argv: ["--headless"]Resolve executable to the installed root package's tmux-ide bin (not a
workspace source file or the private @tmux-ide/daemon package). Pass every
argument as its own argv element. Use an existing directory as the child working
directory, inherit HOME unless you deliberately isolate daemon state, and
retain the returned child PID. Stdio may be piped or redirected to null, but do
not wrap the invocation in a shell, append &/nohup, or add a second
daemonizer. Readiness is established by the probes below, not by the spawn call
returning and not by parsing stdout.
tmux-ide --headless stays in the foreground; the spawned process is the daemon
owner even when the host detaches its stdio. It does not open a TUI, launch a
tmux workspace, require a project config, install anything, or inherit
remote-access authentication. --port N is optional; omitting it selects a free
loopback port. Treat a non-zero child exit before readiness as launch failure and
surface its stderr/structured error to the user.
The owner first atomically acquires a process-lifetime claim, then publishes this versioned discovery shape with owner-only permissions. The claim spans record inspection, socket binding, publication, and the daemon's full lifetime; concurrent cold-start losers wait for and reuse the winner instead of binding or publishing another daemon:
{
"pid": 4312,
"port": 4010,
"protocolVersion": 1,
"productVersion": "2.8.0",
"instanceId": "9bcf33b0-c837-4a94-b5e8-c0977f54464f",
"startedAt": "2026-07-21T00:00:00.000Z",
"bindHostname": "127.0.0.1",
"authToken": null
}Startup is ready only when all checks succeed:
~/.tmux-ide/daemon.jsonexists (or the directory selected byTMUX_IDE_DAEMON_INFO_DIR) and names the child PID and port.- The unauthenticated
GET /identityresponse exactly matches the record'spid,protocolVersion,instanceId, andstartedAt. This binds the endpoint before the host sends any credential.productVersionis reported as a diagnostic and may differ when the wire protocol remains compatible. GET /healthsucceeds and reports the compatible daemon wire protocol and its diagnosticproductVersion./healthzreports that same value.
Construct probe URLs with a URL API or bracket an IPv6 literal ([::1]); never
interpolate an unbracketed IPv6 hostname into http://host:port.
A second tmux-ide --headless never takes over a healthy daemon. If its wire
protocol is compatible, the second process reports already-running and exits
zero; a product-version difference is diagnostic only. An incompatible wire
protocol or disagreement between discovery and health exits non-zero so the host
can ask the user to restart or upgrade. Only a dead PID is stale state and may be
removed. A live PID whose health endpoint is unavailable still owns the slot:
the contender exits non-zero without clearing the record or starting another
daemon.
Publication is create-if-absent and cleanup is generation-safe: an owner removes
only the record carrying its own instanceId. It never deletes a record that a
concurrent process replaced while cleanup was in progress.
An existing record that is protocol-less, malformed, oversized, symlinked, owned by another user, or not owner-only is invalid, not missing. Do not delete it or start another owner. The CLI only removes a securely read invalid record when its positive recorded PID is explicitly proven dead; otherwise the host should ask the user to inspect or remove the record after verifying the owner process.
Send SIGINT or SIGTERM to stop the owner. The daemon shutdown action follows
the same idempotent path. Both close HTTP/WebSocket/PTY resources, remove the
canonical record, and let the owner exit zero; a cleanup failure exits non-zero.
Flags
| Flag | Description |
|---|---|
--json | Output as JSON (all commands) |
--headless | Run only the canonical daemon in this process |
--template <name> | Use a specific template for init |
--write | Write detected config to .tmux-ide/workspace.yml |
--verbose | Log all tmux commands (or set TMUX_IDE_DEBUG=1) |
Key discovery
Once a session is adopted, the whole UI is a keystroke or two away. Each surface
has a prefix twin (prefix then a letter) that works under every keyboard
protocol, plus an ⌥ fast-path when your terminal allows it — lead with the
prefix.
| Surface | Prefix (always works) | Alt fast-path |
|---|---|---|
| Home cockpit from anywhere | prefix h | ⌥h |
| Switch session | prefix j | ⌥p |
| Cheat sheet (all keys) | prefix k | ⌥k |
| Actions menu (or right-click) | prefix u | ⌥m |
| Sidebar | prefix b | ⌥b |
| File / changes / config panels | prefix e g v | ⌥e ⌥g ⌥, |
Rebind any of them in ~/.tmux-ide/config.json (keys.*) — the prefix twin
follows the fast-path key. See Theming & config.