Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Work inside the current cmux workspace and terminal. Use for cmux workspace, current workspace, caller surface, panes, surfaces, socket targeting, and non-interfering cmux automation.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | -12% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 67% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 70% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 32% | 0% |
Scope work to the cmux workspace that invoked the agent.
Scope actions to the current caller workspace unless the user explicitly asks for another workspace, another window, or global state. Do not assume the visually focused workspace is the right target: an agent can run in one workspace while the user looks at another.
bashprintf 'workspace=%s\nsurface=%s\nsocket=%s\n' \ "${CMUX_WORKSPACE_ID:-}" "${CMUX_SURFACE_ID:-}" "${CMUX_SOCKET_PATH:-}" cmux identify --json
CMUX_WORKSPACE_ID is the default workspace anchor and CMUX_SURFACE_ID the default caller terminal anchor. If they are missing, fall back to cmux identify --json and say explicitly that you are using the currently focused context.
Treat layout and focus as separate concerns. select-workspace, focus-pane, focus-panel, and focus-changing tab-action verbs are user-affecting actions, like clicks. Never call them speculatively, even inside the caller's own workspace, since the user may be looking elsewhere.
Build layout additively in one shot, using commands that create a pane already populated with the right surface:
bashcmux new-pane --workspace "${CMUX_WORKSPACE_ID}" --type browser --direction right --url "http://127.0.0.1:8765" cmux new-pane --workspace "${CMUX_WORKSPACE_ID}" --type terminal --direction down
Avoid create-then-move-then-focus chains. Pass --focus false wherever the verb supports it (move-surface --focus false preserves the user's attention; more commands may grow the flag, see https://github.com/manaflow-ai/cmux/issues/1418 and https://github.com/manaflow-ai/cmux/issues/2820). If a layout command rejects a valid surface: or pane: ref, report the bug and stop rather than working around it by focusing.
For auxiliary output (preview apps, TUIs, logs, one-off shells, browser checks), reuse one helper pane to the right of the caller terminal. Inspect first with cmux identify --json, cmux list-panes, and cmux list-pane-surfaces, then:
bash cmux new-surface --workspace "${CMUX_WORKSPACE_ID:-}" --pane pane:<helper> --type terminal --focus false
bash cmux new-pane --workspace "${CMUX_WORKSPACE_ID:-}" --type terminal --direction right --focus false
Send commands to the new or reused surface by explicit surface ref. Repeated "open it" requests create tabs inside the existing right helper pane, not more splits.
The surface that invoked the agent is the safest anchor for relative operations.
bashcmux send "npm test\n" # focused terminal in caller workspace cmux send --surface "${CMUX_SURFACE_ID:-}" "git status\n" # exact caller surface cmux send-key --surface "${CMUX_SURFACE_ID:-}" enter
Do not send keystrokes, close surfaces, or change focus in another workspace unless the user named that target.
bashcmux move-surface --surface "${CMUX_SURFACE_ID}" --before surface:3 # also --after, --index cmux move-surface --surface surface:240 --pane pane:172 --focus false cmux drag-surface-to-split --surface surface:240 down
Known papercut: drag-surface-to-split routes through V1 and resolves the workspace via UI focus, so it fails with ERROR: Surface not found when the caller's workspace is not the visually focused one (https://github.com/manaflow-ai/cmux/issues/1901, related https://github.com/manaflow-ai/cmux/issues/3189). Until that lands, build layout additively. Never call focus-pane or focus-panel to recover from a failed move; report the failure and stop.
Attach status, progress, and logs to the current workspace so the sidebar reflects this task.
bashcmux set-status build "running" --workspace "${CMUX_WORKSPACE_ID:-}" --color "#ff9500" cmux set-progress 0.4 --label "Building" --workspace "${CMUX_WORKSPACE_ID:-}" cmux log --workspace "${CMUX_WORKSPACE_ID:-}" --level info -- "Started build" cmux sidebar-state --workspace "${CMUX_WORKSPACE_ID:-}" --json
For cmux app/runtime changes in a cmux source checkout, use a tagged reload from the active worktree. It creates an isolated app name, bundle ID, debug socket, and DerivedData path. Never build or launch untagged cmux DEV.
bash./scripts/reload.sh --tag <short-tag> CMUX_SOCKET_PATH=/tmp/cmux-debug-<short-tag>.sock cmux identify --json
Use the socket path cmux provided before any default: SOCK="${CMUX_SOCKET_PATH:-/tmp/cmux.sock}". Socket access can be off, restricted to cmux-spawned processes, or open to all local processes. If a command cannot connect, inspect cmux capabilities --json and cmux ping before changing settings.
--workspace and --surface flags for mutating actions even when env vars are set, so automation is auditable.focus-pane, focus-panel, select-workspace, or focus-changing tab-action verbs unless the user explicitly asked.--focus false on move-surface and any creation verb that supports it.new-pane --type ... --url ..., not create-then-move-then-focus.Other measured skills in the registry, with their headline benchmark lift.