Skip to content

/tmux

Remote-control tmux sessions for interactive CLIs by sending keystrokes and scraping pane output.

From plugin
openviking
41k14 skills

Claude Code

$ npx -y skills add volcengine/openviking --skill tmux --agent claude-code

SKILL.md

tmux.SKILL.md
name: tmux
description: Remote-control tmux sessions for interactive CLIs by sending keystrokes and scraping pane output.
metadata: {"vikingbot":{"emoji":"🧵","os":["darwin","linux"],"requires":{"bins":["tmux"]}}}

tmux Skill

Use tmux only when you need an interactive TTY. Prefer exec background mode for long-running, non-interactive tasks.

Quickstart (isolated socket, exec tool)

SOCKET_DIR="${NANOBOT_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/vikingbot-tmux-sockets}"
mkdir -p "$SOCKET_DIR"
SOCKET="$SOCKET_DIR/vikingbot.sock"
SESSION=vikingbot-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 `NANOBOT_TMUX_SOCKET_DIR` environment variable.
  • Default socket path: `"$NANOBOT_TMUX_SOCKET_DIR/vikingbot.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 `NANOBOT_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:

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 `$`) 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.

{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)
Read more
@volcengine
Ships withopenviking

Self-evolving Context Database for AI Agents. Unify Agent Memory, Knowledge RAG and Skills.

Stars on GitHub

Momentum

stars in total
41.2k
Star history of volcengine/openviking on GitHub, a chart by star-history.com

Other skills on openviking.

openviking-memory
Auto-invoked

openviking-memory

Recall and persist long-term memory through the OpenViking MCP tools. Use at the start of any substantive task (coding,…

openviking-skills
Auto-invoked

openviking-skills

Find, use, create, install, share, update, and migrate agent skills stored in OpenViking (viking://~/skills and…

ov-experience-memory
Auto-invoked

ov-experience-memory

Retrieve and apply OpenViking Experience memories through the Agent runtime's generic OpenViking search and read tools. Use…

ov-kanban
Auto-invoked

ov-kanban

Work through tasks on a kanban board stored in OpenViking (viking://agent/kanban/<board>/, one markdown file per task). Use when…

ov-memory-troubleshoot
Auto-invoked

ov-memory-troubleshoot

Diagnose OpenViking memory issues by tracing backward from a memory file to its archive memory_diff.json and, when needed,…

ov-resources
Auto-invoked

ov-resources

Search and read documents, repos, URLs, and other resources stored in OpenViking under viking://resources/. Use whenever the user…

More skills from other plugins.

agent-cost-report

agent-cost-report

Believable agent cost report for any period, default the last 7 full days PT, not counting today. Measured tokens from Claude…

@thedotmack@thedotmackInstall Skill
bot-handoff

bot-handoff

Keep a durable record of work passed between Bots in the shared Hindsight memory bank. Use when handing work to another Bot, when…

@vectorize-io@vectorize-ioInstall Skill
mempalace

mempalace

Install, configure, and operate MemPalace, including a private local palace, a shared-brain hub, or a client joining an existing…

mempalace12d60k
@mempalace@mempalaceInstall Skill
mempalace

mempalace

Install, configure, and operate MemPalace, including a private local palace, a shared-brain hub, or a client joining an existing…

mempalace12d60k
@milla-jovovich@milla-jovovichInstall Skill

Questions about tmux.

Which coding agents can use tmux?
tmux installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.