
tmux
by XuNeo
SKILL.md
name: tmux description: "Remote control tmux sessions for interactive CLIs (python, gdb, etc.) by sending keystrokes and scraping pane output." license: Vibecoded
tmux Skill
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.
Quickstart (use current tmux server)
SESSION=python-debug # descriptive names; avoid spaces
tmux new -d -s "$SESSION"
tmux send-keys -t "$SESSION".1 -- 'python3 -q' Enter
tmux capture-pane -p -J -t "$SESSION".1 -S -200 # watch output
tmux kill-session -t "$SESSION" # clean up
If not running inside tmux (no $TMUX env var), use an isolated socket:
SOCKET_DIR=${TMPDIR:-/tmp}/claude-tmux-sockets
mkdir -p "$SOCKET_DIR"
SOCKET="$SOCKET_DIR/claude.sock"
SESSION=python-debug
tmux -S "$SOCKET" new -d -s "$SESSION"
tmux -S "$SOCKET" send-keys -t "$SESSION".1 -- 'python3 -q' Enter
tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION".1 -S -200
tmux -S "$SOCKET" kill-session -t "$SESSION"
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 attach -t python-debug
Or to capture the output once:
tmux capture-pane -p -J -t python-debug.1 -S -200
If using an isolated socket (not in tmux), include -S "$SOCKET":
To monitor this session yourself:
tmux -S "$SOCKET" attach -t python-debug
Or to capture the output once:
tmux -S "$SOCKET" capture-pane -p -J -t python-debug.1 -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.
Socket convention
- Preferred: When running inside tmux (check
$TMUXenv var), use the current tmux server without-Sflag. - Fallback: If not in tmux, agents MUST place tmux sockets under
CLAUDE_TMUX_SOCKET_DIR(defaults to${TMPDIR:-/tmp}/claude-tmux-sockets) and usetmux -S "$SOCKET"so we can enumerate/clean them. Create the dir first:mkdir -p "$CLAUDE_TMUX_SOCKET_DIR". - Default socket path to use unless you must isolate further:
SOCKET="$CLAUDE_TMUX_SOCKET_DIR/claude.sock".
Targeting panes and naming
- Target format:
{session}.{pane}, defaults to{session}.1if omitted. Use descriptive names (e.g.,python-debug,gdb-session,build-test). - Session naming convention: Use descriptive names that indicate the tool and purpose:
python-debug- Python REPL for debugging/calculationsgdb-session- GDB debugger for C/C++/embedded debuggingbuild-test- Build process or test runnershell-work- General shell session for file operations
- Creating new panes:
tmux split-window -h -t "$SESSION"creates a new pane (pane 2). Always target the specific pane when sending commands:tmux send-keys -t "$SESSION".2 -- 'command' Enter - Use
-S "$SOCKET"consistently to stay on the private socket path. If you need user config, drop-f /dev/null; otherwise-f /dev/nullgives a clean config. - Inspect:
tmux -S "$SOCKET" list-sessions,tmux -S "$SOCKET" list-panes -a.
Finding sessions
- List sessions on your active socket with metadata:
./scripts/find-sessions.sh -S "$SOCKET"; add-q partial-nameto filter. - Scan all sockets under the shared directory:
./scripts/find-sessions.sh --all(usesCLAUDE_TMUX_SOCKET_DIRor${TMPDIR:-/tmp}/claude-tmux-sockets).
Sending input safely
- To send a command with Enter (newline):
tmux ... send-keys -t target -- 'your command' Enter- The
--separates command from keys, andEntersends a newline (not literal text) - Always use single quotes around the command to prevent shell expansion and URL truncation
- The
- To send literal text without interpretation:
tmux ... send-keys -t target -l -- 'literal text'- Use
-lflag to send text exactly as-is, useful for special characters
- Use
- To send text with embedded newline:
tmux ... send-keys -t target -l -- $'text\nwith\nnewlines'- Use ANSI-C quoting with
-lfor embedded newlines
- Use ANSI-C quoting with
- To send control keys:
tmux ... send-keys -t target C-c,C-d,C-z,Escape, etc.
Watching output
- Capture recent history (joined lines to avoid wrapping artifacts):
tmux -L "$SOCKET" capture-pane -p -J -t target -S -200. - For continuous monitoring, poll with the helper script (below) instead of
tmux wait-for(which does not watch pane output). - You can also temporarily attach to observe:
tmux -L "$SOCKET" attach -t "$SESSION"; detach withCtrl+b d. - When giving instructions to a user, explicitly print a copy/paste monitor command alongside the action don't assume they remembered the command.
Spawning Processes
Some special rules for processes:
- when asked to debug, use lldb by default
- when starting a python interactive shell, always set the
PYTHON_BASIC_REPL=1environment variable. This is very important as the non-basic console interferes with your send-keys.
Synchronizing / waiting for prompts
- Use timed polling to avoid races with interactive tools. Example: wait for a Python prompt before sending code:
./scripts/wait-for-text.sh -t "$SESSION" -p '^>>>' -T 15 -l 4000 - For long-running commands, poll for completion text (
"Type quit to exit","Program exited", etc.) before proceeding.
Interactive tool recipes
- Python REPL:
tmux ... send-keys -t "$SESSION".1 -- 'python3 -q' Enter; wait for^>>>; send code with-t "$SESSION".1 -- 'code' Enter; interrupt withC-c. Always withPYTHON_BASIC_REPL. - gdb:
tmux ... send-keys -t "$SESSION".1 -- 'gdb --quiet ./a.out' Enter; disable pagingtmux ... send-keys -t "$SESSION".1 -- 'set pagination off' Enter; break withC-c; issuebt,info locals, etc.; exit viaquitthen confirmy. - Other TTY apps (ipdb, psql, mysql, node, bash): same pattern—start the program, poll for its prompt, then send command with
-t "$SESSION".1 -- 'command' Enter.
Cleanup
- Kill a session when done:
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
./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 -p 'pattern' [-F] [-T 20] [-i 0.5] [-l 2000]
-t/--targetpane target (required, format:{session}.{pane})-p/--patternregex to match (required); add-Ffor fixed string-Ttimeout seconds (integer, default 15)-ipoll interval seconds (default 0.5)-lhistory lines to search from the pane (integer, default 1000)- Exits 0 on first match, 1 on timeout. On failure prints the last captured text to stderr to aid debugging.
Score
Total Score
Based on repository quality metrics
SKILL.mdファイルが含まれている
ライセンスが設定されている
100文字以上の説明がある
GitHub Stars 100以上
3ヶ月以内に更新がある
10回以上フォークされている
オープンIssueが50未満
プログラミング言語が設定されている
1つ以上のタグが設定されている
Reviews
Reviews coming soon