Back to Skills
    ๐Ÿฆž

    tmux

    Remote-control tmux sessions for interactive CLIs by sending keystrokes

    By @steipete
    View on GitHub
    SKILL.md
    ---
    name: tmux
    description: Remote-control tmux sessions for interactive CLIs by sending keystrokes and scraping pane output.
    metadata: {"clawdbot":{"emoji":"๐Ÿงต","os":["darwin","linux"],"requires":{"bins":["tmux"]}}}
    ---
    
    # tmux Skill (Clawdbot)
    
    Use tmux only when you need an interactive TTY. Prefer bash background mode for long-running, non-interactive tasks.
    
    ## Quickstart (isolated socket, bash tool)
    
    ```bash
    SOCKET_DIR="${CLAWDBOT_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/clawdbot-tmux-sockets}"
    mkdir -p "$SOCKET_DIR"
    SOCKET="$SOCKET_DIR/clawdbot.sock"
    SESSION=clawdbot-python
    
    tmux -S "$SOCKET" new -d -s "$SESSION" -n shell
    tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- 'PYTHON_BASIC_REPL=1 python3 -q' Enter
    tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200
    ```
    
    After starting a session, always print monitor commands:
    
    ```
    To monitor:
      tmux -S "$SOCKET" attach -t "$SESSION"
      tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200
    ```
    
    ## Socket convention
    
    - Use `CLAWDBOT_TMUX_SOCKET_DIR` (default `${TMPDIR:-/tmp}/clawdbot-tmux-sockets`).
    - Default socket path: `"$CLAWDBOT_TMUX_SOCKET_DIR/clawdbot.sock"`.
    
    ## Targeting panes and naming
    
    - Target format: `session:window.pane` (defaults to `:0.0`).
    - Keep names short; avoid spaces.
    - Inspect: `tmux -S "$SOCKET" list-sessions`, `tmux -S "$SOCKET" list-panes -a`.
    
    ## Finding sessions
    
    - List sessions on your socket: `{baseDir}/scripts/find-sessions.sh -S "$SOCKET"`.
    - Scan all sockets: `{baseDir}/scripts/find-sessions.sh --all` (uses `CLAWDBOT_TMUX_SOCKET_DIR`).
    
    ## Sending input safely
    
    - Prefer literal sends: `tmux -S "$SOCKET" send-keys -t target -l -- "$cmd"`.
    - Control keys: `tmux -S "$SOCKET" send-keys -t target C-c`.
    
    ## Watching output
    
    - Capture recent history: `tmux -S "$SOCKET" capture-pane -p -J -t target -S -200`.
    - Wait for prompts: `{baseDir}/scripts/wait-for-text.sh -t session:0.0 -p 'pattern'`.
    - Attaching is OK; detach with `Ctrl+b d`.
    
    ## Spawning processes
    
    - For python REPLs, set `PYTHON_BASIC_REPL=1` (non-basic REPL breaks send-keys flows).
    
    ## Windows / WSL
    
    - tmux is supported on macOS/Linux. On Windows, use WSL and install tmux inside WSL.
    - This skill is gated to `darwin`/`linux` and requires `tmux` on PATH.
    
    ## Orchestrating Coding Agents (Codex, Claude Code)
    
    tmux excels at running multiple coding agents in parallel:
    
    ```bash
    SOCKET="${TMPDIR:-/tmp}/codex-army.sock"
    
    # Create multiple sessions
    for i in 1 2 3 4 5; do
      tmux -S "$SOCKET" new-session -d -s "agent-$i"
    done
    
    # Launch agents in different workdirs
    tmux -S "$SOCKET" send-keys -t agent-1 "cd /tmp/project1 && codex --yolo 'Fix bug X'" Enter
    tmux -S "$SOCKET" send-keys -t agent-2 "cd /tmp/project2 && codex --yolo 'Fix bug Y'" Enter
    
    # Poll for completion (check if prompt returned)
    for sess in agent-1 agent-2; do
      if tmux -S "$SOCKET" capture-pane -p -t "$sess" -S -3 | grep -q "โฏ"; then
        echo "$sess: DONE"
      else
        echo "$sess: Running..."
      fi
    done
    
    # Get full output from completed session
    tmux -S "$SOCKET" capture-pane -p -t agent-1 -S -500
    ```
    
    **Tips:**
    - Use separate git worktrees for parallel fixes (no branch conflicts)
    - `pnpm install` first before running codex in fresh clones
    - Check for shell prompt (`โฏ` or `
    
      
        
        
        
        OpenClaw Resources Directory โ€“ Skills, Tools, Plugins & Guides | The Claw Guy
        
        
        
        
        
        
        
        
    
        
        
        
        
    
        
        
        
        
        
      
      
    
    
      
        ) to detect completion
    - Codex needs `--yolo` or `--full-auto` for non-interactive fixes
    
    ## Cleanup
    
    - Kill a session: `tmux -S "$SOCKET" kill-session -t "$SESSION"`.
    - Kill all sessions on a socket: `tmux -S "$SOCKET" list-sessions -F '#{session_name}' | xargs -r -n1 tmux -S "$SOCKET" kill-session -t`.
    - Remove everything on the private socket: `tmux -S "$SOCKET" kill-server`.
    
    ## Helper: wait-for-text.sh
    
    `{baseDir}/scripts/wait-for-text.sh` polls a pane for a regex (or fixed string) with a timeout.
    
    ```bash
    {baseDir}/scripts/wait-for-text.sh -t session:0.0 -p 'pattern' [-F] [-T 20] [-i 0.5] [-l 2000]
    ```
    
    - `-t`/`--target` pane target (required)
    - `-p`/`--pattern` regex to match (required); add `-F` for fixed string
    - `-T` timeout seconds (integer, default 15)
    - `-i` poll interval seconds (default 0.5)
    - `-l` history lines to search (integer, default 1000)
    ) to detect completion\n- Codex needs `--yolo` or `--full-auto` for non-interactive fixes\n\n## Cleanup\n\n- Kill a session: `tmux -S \"$SOCKET\" kill-session -t \"$SESSION\"`.\n- Kill all sessions on a socket: `tmux -S \"$SOCKET\" list-sessions -F '#{session_name}' | xargs -r -n1 tmux -S \"$SOCKET\" kill-session -t`.\n- Remove everything on the private socket: `tmux -S \"$SOCKET\" kill-server`.\n\n## Helper: wait-for-text.sh\n\n`{baseDir}/scripts/wait-for-text.sh` polls a pane for a regex (or fixed string) with a timeout.\n\n```bash\n{baseDir}/scripts/wait-for-text.sh -t session:0.0 -p 'pattern' [-F] [-T 20] [-i 0.5] [-l 2000]\n```\n\n- `-t`/`--target` pane target (required)\n- `-p`/`--pattern` regex to match (required); add `-F` for fixed string\n- `-T` timeout seconds (integer, default 15)\n- `-i` poll interval seconds (default 0.5)\n- `-l` history lines to search (integer, default 1000)","Plugin_Install_Column":"","Plugin_Config_Column":"","Plugin_Readme_Column":""},"similar":[{"slug":"eachlabs-product-visuals-h5400c","category":"DevTools","URL":"https://openclawdir.com/skills/eachlabs-product-visuals-h5400c","Type":"Skill","Title":"eachlabs-product-visuals","Description":"Generate e-commerce product photography and videos.","GitHub_Link":"https://github.com/eftalyurtseven"},{"slug":"bidclub-ec13gg","category":"DevTools","URL":"https://openclawdir.com/skills/bidclub-ec13gg","Type":"Skill","Title":"bidclub","Description":"Post investment ideas to the AI-native investment community.","GitHub_Link":"https://github.com/jasonfdg"},{"slug":"avatar-video-messages-k0dhm6","category":"DevTools","URL":"https://openclawdir.com/skills/avatar-video-messages-k0dhm6","Type":"Skill","Title":"avatar-video-messages","Description":"Generate and send video messages","GitHub_Link":"https://github.com/thewulf7"},{"slug":"apple-hig-lbg7lk","category":"DevTools","URL":"https://openclawdir.com/skills/apple-hig-lbg7lk","Type":"Skill","Title":"apple-hig","Description":"Expert guide for designing iOS, macOS, watchOS, tvOS, and visionOS apps.","GitHub_Link":"https://github.com/kdbhalala"}]}