用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/megalithic/dotfiles --skill tmux命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Manage MCP server configurations — add, remove, list, inspect, troubleshoot. Use when asked to "add mcp server", "remove mcp", "list mcp servers", "mcp status", "configure mcp", "troubleshoot mcp", or any MCP server management task.
Use the running kitty app plus tmux to run real end-to-end pinvim rewrite tests across Nvim, Pi, pimux, sockets, manifests, registry state, and nested sessions. Use when testing or manually verifying pinvim, :PiPanel, :PiSplit, gps/gpa, /pinvim-health, /pinvim-doctor, editor-service, registry fast path, dirty-buffer safety, or nested Pi safety.
Manage, query, enter, and remove Git worktrees with Worktrunk through the local `wt` wrapper and mise project templates. First verify `wt` can reach Worktrunk. If unavailable, use preserved legacy git-worktree workflow.
正在显示 SKILL.md
| name | tmux |
| description | Remote control tmux sessions for interactive CLIs (python, gdb, etc.) by sending keystrokes and scraping pane output. |
| license | Vibecoded |
| script | scripts/wait-for-text.sh |
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.
Script location: ~/.dotfiles/mise/config/pi-coding-agent/agent/skills/tmux/scripts/
Never kill or disrupt the pane running pi. Before killing, resizing, or replacing ANY pane:
Identify your own pane: Run tmux display-message -p '#{pane_id}' to get the pane pi is running in. Store this — never kill it.
Verify target pane before kill: Before kill-pane -t X, confirm X is not your own pane ID.
Verify target pane before send-keys: Before sending keys to ANY pane, verify the expected process is actually running there:
# Check what's running in target pane
tmux display-message -t "$TARGET" -p '#{pane_current_command}'
# Or capture last few lines to confirm the right prompt/app
tmux capture-pane -p -t "$TARGET" -S -5
Never send keys blindly. If the expected app (python, gdb, w3m, etc.) is NOT in the target pane, STOP and re-discover the correct pane.
Never assume pane layout persists. Panes can be rearranged, closed by user, or swapped. Always re-verify before interacting.
Verification pattern (use before every send-keys or kill-pane):
# Get my pane (pi's pane) — do this once at start
MY_PANE=$(tmux display-message -p '#{pane_id}')
# Before interacting with a target
TARGET_CMD=$(tmux display-message -t "$TARGET" -p '#{pane_current_command}' 2>&1)
if [ $? -ne 0 ]; then
echo "Target pane $TARGET does not exist"
elif [ "$TARGET" = "$MY_PANE" ]; then
echo "ABORT: target is pi's own pane"
else
echo "Target running: $TARGET_CMD"
fi
SOCKET_DIR=${TMPDIR:-/tmp}/claude-tmux-sockets # well-known dir for all agent sockets
mkdir -p "$SOCKET_DIR"
SOCKET="$SOCKET_DIR/claude.sock" # keep agent sessions separate from your personal tmux
SESSION=claude-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 claude-lldb
Or to capture the output once:
tmux -S "$SOCKET" capture-pane -p -J -t claude-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.
CLAUDE_TMUX_SOCKET_DIR (defaults to ${TMPDIR:-/tmp}/claude-tmux-sockets) and use tmux -S "$SOCKET" so we can enumerate/clean them. Create the dir first: mkdir -p "$CLAUDE_TMUX_SOCKET_DIR".SOCKET="$CLAUDE_TMUX_SOCKET_DIR/claude.sock".{session}:{window}.{pane}, defaults to :0.0 if omitted. Keep names short (e.g., claude-py, claude-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.~/.dotfiles/mise/config/pi-coding-agent/agent/skills/tmux/scripts/find-sessions.sh -S "$SOCKET"; add -q partial-name to filter.~/.dotfiles/mise/config/pi-coding-agent/agent/skills/tmux/scripts/find-sessions.sh --all (uses CLAUDE_TMUX_SOCKET_DIR or ${TMPDIR:-/tmp}/claude-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.Use timed polling to avoid races with interactive tools. Example: wait for a Python prompt before sending code:
~/.dotfiles/mise/config/pi-coding-agent/agent/skills/tmux/scripts/wait-for-text.sh -t "$SESSION":0.0 -p '^>>>' -T 15 -l 4000
For long-running commands, poll for completion text ("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.~/.dotfiles/mise/config/pi-coding-agent/agent/skills/tmux/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.
~/.dotfiles/mise/config/pi-coding-agent/agent/skills/tmux/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)