con un clic
tmux
// Remote control tmux sessions for interactive CLIs (dev servers, node, gdb, etc.) by sending keystrokes and scraping pane output.
// Remote control tmux sessions for interactive CLIs (dev servers, node, gdb, etc.) by sending keystrokes and scraping pane output.
Find deepening opportunities in a codebase, informed by the domain language in CONTEXT.md and the decisions in docs/adr/. Use when the user wants to improve architecture, find refactoring opportunities, consolidate tightly-coupled modules, or make a codebase more testable and AI-navigable.
Sync Matt Pocock's skills from upstream (github.com/mattpocock/skills), apply pi-specific patches that replace Claude Code sub-agent references, and flag new skills or unpatched patterns. Use when user says "sync skills", "update pocock skills", or "check for skill updates".
Break a plan, spec, or PRD into independently-grabbable issues on the project issue tracker using tracer-bullet vertical slices. Use when user wants to convert a plan into issues, create implementation tickets, or break down work into issues.
Turn the current conversation context into a PRD and publish it to the project issue tracker. Use when user wants to create a PRD from the current context.
Generate hierarchical AGENTS.md files for a codebase. Root + complexity-scored subdirectories. Use when user says "init deep", "generate AGENTS.md", "document this repo", wants to create or regenerate project knowledge files, or mentions "knowledge base".
Sets up an `## Agent skills` block in AGENTS.md (or CLAUDE.md) and `docs/agents/` so the engineering skills know this repo's issue tracker (GitHub or local markdown), triage label vocabulary, and domain doc layout. Run before first use of `to-issues`, `to-prd`, `triage`, `diagnose`, `tdd`, `improve-codebase-architecture`, or `zoom-out` ā or if those skills appear to be missing context about the issue tracker, triage labels, or domain docs.
| name | tmux |
| description | Remote control tmux sessions for interactive CLIs (dev servers, node, gdb, etc.) by sending keystrokes and scraping pane output. |
| license | Vibecoded |
Source: https://github.com/mitsuhiko/agent-stuff/blob/main/skills/tmux/SKILL.md
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 your personal tmux
SESSION=app-name-command # slug-like names; avoid spaces
tmux -S "$SOCKET" new -d -s "$SESSION" -n shell
TARGET=$(tmux -S "$SOCKET" list-panes -t "$SESSION" -F '#S:#I.#P' | head -n1)
tmux -S "$SOCKET" send-keys -t "$TARGET" -- 'pnpm run dev' Enter
tmux -S "$SOCKET" capture-pane -p -J -t "$TARGET" -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:
TARGET=$(tmux -S "$SOCKET" list-panes -t pi-lldb -F '#S:#I.#P' | head -n1)
tmux -S "$SOCKET" capture-pane -p -J -t "$TARGET" -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".base-index/pane-base-index) stay in effect even if the user's config is different now.-f /dev/null only when you explicitly want stock tmux behavior.PI_TMUX_SOCKET_DIR name is preserved for upstream compatibility; using it from Pi is fine.{session}:{window}.{pane}. Examples like :0.0 and :1.1 are both valid depending on tmux server options.TARGET=$(tmux -S "$SOCKET" list-panes -t "$SESSION" -F '#S:#I.#P' | head -n1).base-index and pane-base-index, but only for freshly started servers. Reused sockets may still be using older/default numbering.-S "$SOCKET" consistently to stay on the private socket path.tmux -S "$SOCKET" list-sessions, tmux -S "$SOCKET" list-panes -a, tmux -S "$SOCKET" show-options -g | rg '^base-index', tmux -S "$SOCKET" show-window-options -g | rg '^pane-base-index'../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 -S "$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 -S "$SOCKET" capture-pane -p -J -t target -S -200.tmux wait-for (which does not watch pane output).tmux -S "$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.TARGET=$(tmux -S "$SOCKET" list-panes -t "$SESSION" -F '#S:#I.#P' | head -n1)
./scripts/wait-for-text.sh -S "$SOCKET" -t "$TARGET" -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 [-L socket-name|-S socket-path] -t session:window.pane -p 'pattern' [-F] [-T 20] [-i 0.5] [-l 2000]
-L/--socket tmux socket name passed to tmux -L-S/--socket-path tmux socket path passed to tmux -S-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)