ワンクリックで
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 職業分類に基づく
Manage and configure Omarchy Linux systems. Use when user asks about Omarchy, Hyprland, themes, keybindings, system config, or any omarchy-* commands.
Use when building or modifying Datastar-powered UI — SSE streams, templ components, form handlers, signals, morph patterns, loading indicators. Enforces the Tao of Datastar (backend is source of truth, CQRS, fat morph, signals sparingly). Use for any work touching .templ files, SSE handlers, or Datastar attributes.
Create or fix static HTML slide decks powered by Datastar signals. Use when asked to make "datastar slides", "HTML slide deck", "slide deck with Datastar buttons", "arrow-key slides", or fix broken Datastar slide navigation. Covers v1 colon attribute syntax, local UI signals, keyboard handlers, dot indicators, and compact slide layout.
Address GitHub PR review comments in pi. Use when asked to handle PR comments, respond to review feedback, fix review comments, reply to GitHub PR comments, or work through unresolved review threads. Fetches comments with gh, batches triage with the user, applies fixes on the correct branch, and replies on GitHub using pi's /answer flow.
Research Codebase
Build and customize pi itself (not end-user task execution). Use when asked to create or modify pi config, extensions, AGENTS.md behavior, skills/prompts/themes loading, package wiring, or integration surfaces for external tools/services.
| name | tmux |
| description | Remote control tmux sessions for interactive CLIs (python, gdb, etc.) by sending keystrokes and scraping pane output. |
| license | Vibecoded |
| references | ["https://github.com/mitsuhiko/agent-stuff/tree/main/skills/tmux"] |
Use tmux as a programmable terminal multiplexer for interactive work. Works on Linux and macOS with stock tmux; avoid custom config by using a private socket.
SOCKET_DIR=${TMPDIR:-/tmp}/pi-tmux-sockets # well-known dir for all agent sockets
mkdir -p "$SOCKET_DIR"
SOCKET="$SOCKET_DIR/pi.sock" # keep agent sessions separate from personal tmux
SESSION=pi-python # slug-like names; avoid spaces
tmux -S "$SOCKET" new -d -s "$SESSION" -n shell
tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- 'python3 -q' Enter
tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200 # watch output
tmux -S "$SOCKET" 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:
To monitor this session yourself:
tmux -S "$SOCKET" attach -t pi-lldb
Or to capture the output once:
tmux -S "$SOCKET" capture-pane -p -J -t pi-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.
PI_TMUX_SOCKET_DIR (defaults to ${TMPDIR:-/tmp}/pi-tmux-sockets) and use tmux -S "$SOCKET" so we can enumerate/clean them. Create the dir first: mkdir -p "$PI_TMUX_SOCKET_DIR".SOCKET="$PI_TMUX_SOCKET_DIR/pi.sock".When running inside a cmux workspace, the user already has a tmux session
(named cmux-{workspace_id}). $TMUX will be set.
For user-visible work (dev servers, test runners, build watchers), create windows/panes in the user's existing session:
tmux new-window -n "dev-server" -c "/path/to/project"
tmux send-keys -t "dev-server" 'npm run dev' Enter
tmux capture-pane -p -J -t "dev-server" -S -200
For isolated agent work (REPL exploration, experiments the user didn't ask to see), use the private socket as described below.
Rule: If the user asked you to run something, put it in their session. If you need to explore interactively as part of your own reasoning, use the private socket.
{session}:{window}.{pane}, defaults to :0.0 if omitted. Keep names short (e.g., pi-py, pi-gdb).-S "$SOCKET" consistently to stay on the private socket path. If you need user config, drop -f /dev/null; otherwise -f /dev/null gives a clean config.tmux -S "$SOCKET" list-sessions, tmux -S "$SOCKET" list-panes -a../scripts/find-sessions.sh -S "$SOCKET"; add -q partial-name to filter../scripts/find-sessions.sh --all (uses PI_TMUX_SOCKET_DIR or ${TMPDIR:-/tmp}/pi-tmux-sockets).tmux -L "$SOCKET" send-keys -t target -l -- "$cmd"tmux ... send-keys -t target -- $'python3 -m http.server 8000'.tmux ... send-keys -t target C-c, C-d, C-z, Escape, etc.tmux -L "$SOCKET" capture-pane -p -J -t target -S -200.tmux wait-for (which does not watch pane output).tmux -L "$SOCKET" 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
"Type quit to exit", "Program exited", etc.) before proceeding.tmux ... send-keys -- 'python3 -q' Enter; wait for ^>>>; send code with -l; interrupt with C-c. Always with PYTHON_BASIC_REPL.tmux ... send-keys -- 'gdb --quiet ./a.out' Enter; disable paging tmux ... send-keys -- 'set pagination off' Enter; break with C-c; issue bt, info locals, etc.; exit via quit then confirm y.tmux -S "$SOCKET" kill-session -t "$SESSION".tmux -S "$SOCKET" list-sessions -F '#{session_name}' | xargs -r -n1 tmux -S "$SOCKET" kill-session -t.tmux -S "$SOCKET" kill-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 + grep.
./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 from the pane (integer, default 1000)