ワンクリックで
tmux
Remote control tmux sessions for interactive CLIs (python, gdb, etc.) by sending keystrokes and scraping pane output.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Remote control tmux sessions for interactive CLIs (python, gdb, etc.) by sending keystrokes and scraping pane output.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Run a safe Grok Build code review of a branch or explicitly requested local changes. Use when an external Grok review is requested for correctness, architecture, maintainability, regressions, or missing tests; the workflow invokes Grok's native /review skill, preserves durable artifacts, and never edits or publishes changes.
Run Fable, Grok, and Thermo-Nuclear code reviews concurrently against one validated, immutable Git scope, while preserving separate outputs and reporting partial failures. Use when the user explicitly asks for a parallel, three-reviewer, multi-model, or strongest available code review of a PR, branch, commit range, or comparison with main.
Use zmx for durable, long-running processes that must persist beyond the current agent session, such as an app server the user will test later.
Fetch CI build results and diagnose failures. Auto-detects provider from project files or URLs. Supports GitHub Actions, Buildkite, and CircleCI.
You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.
Use when you have a written implementation plan to execute
| name | tmux |
| description | Remote control tmux sessions for interactive CLIs (python, gdb, etc.) by sending keystrokes and scraping pane output. |
| license | Vibecoded |
Use tmux as a programmable terminal multiplexer for interactive work. Works on Linux and macOS with stock tmux. Prefer the active tmux server so the user's existing sessions and config are visible; only create a private fallback socket when no active server exists.
# Prefer the actively running/default tmux server. If none exists, create an
# agent-owned socket so interactive work still has a server to attach to.
if tmux has-session 2>/dev/null; then
TMUX_CMD=(tmux)
TMUX_LABEL="active tmux server"
else
RUNTIME_DIR="${XDG_RUNTIME_DIR:-${TMPDIR:-/tmp}}"
SOCKET_DIR="${TMUX_FALLBACK_SOCKET_DIR:-$RUNTIME_DIR/agent-tmux-sockets-$(id -u)}"
mkdir -p -m 700 "$SOCKET_DIR"
chmod 700 "$SOCKET_DIR"
SOCKET="$SOCKET_DIR/agent.sock"
TMUX_CMD=(tmux -S "$SOCKET")
TMUX_LABEL="fallback socket $SOCKET"
fi
SESSION="agent-python-$(date -u +%Y%m%dT%H%M%SZ)" # slug-like names; avoid spaces
"${TMUX_CMD[@]}" new -d -s "$SESSION" -n shell
"${TMUX_CMD[@]}" send-keys -t "$SESSION":0.0 -- 'PYTHON_BASIC_REPL=1 python3 -q' Enter
"${TMUX_CMD[@]}" capture-pane -p -J -t "$SESSION":0.0 -S -200 # watch output
"${TMUX_CMD[@]}" kill-session -t "$SESSION" # clean up
After starting a session ALWAYS tell the user how to monitor the session by giving them a command to copy paste. Use plain tmux ... commands when TMUX_LABEL is active tmux server; use tmux -S "$SOCKET" ... commands when running on the fallback socket.
Active server example:
To monitor this session yourself:
tmux attach -t agent-lldb
Or to capture the output once:
tmux capture-pane -p -J -t agent-lldb:0.0 -S -200
Fallback socket example:
To monitor this session yourself:
tmux -S "$SOCKET" attach -t agent-lldb
Or to capture the output once:
tmux -S "$SOCKET" capture-pane -p -J -t agent-lldb:0.0 -S -200
This must ALWAYS be printed right after a session was started and once again at the end of the tool loop. But the earlier you send it, the happier the user will be.
tmux commands: tmux has-session, tmux new, tmux send-keys, tmux capture-pane, etc.tmux has-session fails, create a fallback socket under TMUX_FALLBACK_SOCKET_DIR (defaults to ${XDG_RUNTIME_DIR:-${TMPDIR:-/tmp}}/agent-tmux-sockets-$(id -u)) and use tmux -S "$SOCKET" consistently for that session.SOCKET="$SOCKET_DIR/agent.sock" after computing SOCKET_DIR as shown in the quickstart.TMUX_CMD=(tmux) or TMUX_CMD=(tmux -S "$SOCKET"), then invoke it as "${TMUX_CMD[@]}" ... to avoid accidentally switching servers. Do not name this variable TMUX; tmux uses $TMUX internally.{session}:{window}.{pane}, defaults to :0.0 if omitted. Keep names short and prefixed with agent- (e.g., agent-py, agent-gdb). Add a timestamp or task suffix before creating a session, or check has-session -t, to avoid colliding with an existing session on the active server.TMUX_CMD command consistently to stay on either the active server or the fallback socket. If you need user config, the active server path already uses it; for fallback sockets, avoid -f /dev/null unless you specifically need a clean config."${TMUX_CMD[@]}" list-sessions, "${TMUX_CMD[@]}" list-panes -a../scripts/find-sessions.sh; add -q partial-name to filter../scripts/find-sessions.sh -S "$SOCKET"../scripts/find-sessions.sh --all (uses TMUX_FALLBACK_SOCKET_DIR or ${TMPDIR:-/tmp}/agent-tmux-sockets)."${TMUX_CMD[@]}" send-keys -t target -l -- "$cmd"."${TMUX_CMD[@]}" send-keys -t target -- $'python3 -m http.server 8000'."${TMUX_CMD[@]}" send-keys -t target C-c, C-d, C-z, Escape, etc."${TMUX_CMD[@]}" capture-pane -p -J -t target -S -200.tmux wait-for (which does not watch pane output). The helper uses the active/default tmux server; if you are on the fallback socket, pass -S "$SOCKET"."${TMUX_CMD[@]}" attach -t "$SESSION"; detach with Ctrl+b d.Some special rules for processes:
PYTHON_BASIC_REPL=1 environment variable. This is very important as the non-basic console interferes with your send-keys../scripts/wait-for-text.sh -t "$SESSION":0.0 -p '^>>>' -T 15 -l 4000
./scripts/wait-for-text.sh -S "$SOCKET" -t "$SESSION":0.0 -p '^>>>' -T 15 -l 4000
"Type quit to exit", "Program exited", etc.) before proceeding."${TMUX_CMD[@]}" send-keys -- 'PYTHON_BASIC_REPL=1 python3 -q' Enter; wait for ^>>>; send code with -l; interrupt with C-c."${TMUX_CMD[@]}" send-keys -- 'gdb --quiet ./a.out' Enter; disable paging "${TMUX_CMD[@]}" send-keys -- 'set pagination off' Enter; break with C-c; issue bt, info locals, etc.; exit via quit then confirm y."${TMUX_CMD[@]}" kill-session -t "$SESSION"."${TMUX_CMD[@]}" list-sessions -F '#{session_name}' | rg '^agent-' | while IFS= read -r session; do
"${TMUX_CMD[@]}" kill-session -t "$session"
done
tmux -S "$SOCKET" kill-server. Never run kill-server against the active/default server../scripts/wait-for-text.sh polls a pane for a regex (or fixed string) with a timeout. Works on Linux/macOS with bash + tmux + rg.
./scripts/wait-for-text.sh [-S socket-path] -t session:0.0 -p 'pattern' [-F] [-T 20] [-i 0.5] [-l 2000]
-S/--socket-path fallback tmux socket path (optional; omit for the active/default server)-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 from the pane (integer, default 1000)