원클릭으로
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)