| name | tmux |
| description | Remote-control tmux sessions for interactive CLIs by sending keystrokes and scraping pane output. |
tmux Session Control
Control tmux sessions by sending keystrokes and reading output. Essential for managing Claude Code sessions.
Environment Check (MUST run first)
Before any tmux operation, verify the OS and binary availability:
#!/bin/bash
OS=$(uname -s)
MISSING=()
if [ "$OS" != "Darwin" ] && [ "$OS" != "Linux" ]; then
echo "OS_UNSUPPORTED: $OS (tmux requires macOS or Linux)"
exit 0
fi
if ! command -v tmux &>/dev/null; then
MISSING+=("tmux")
fi
if [ ${#MISSING[@]} -eq 0 ]; then
echo "ENV_OK"
else
echo "ENV_MISSING: ${MISSING[*]}"
fi
If ENV_OK: proceed with the tmux operation.
If OS_UNSUPPORTED: tell the user this skill requires macOS or Linux. Ask if they want to try an alternative approach (e.g., using screen on their platform, or running commands directly).
If ENV_MISSING: tell the user tmux is not installed. Ask if they want to install it:
brew install tmux
sudo apt install tmux
sudo dnf install tmux
Do NOT install automatically — always get user confirmation first.
When to Use
✅ USE this skill when:
- Monitoring Claude/Codex sessions in tmux
- Sending input to interactive terminal applications
- Scraping output from long-running processes in tmux
- Navigating tmux panes/windows programmatically
- Checking on background work in existing sessions
When NOT to Use
❌ DON'T use this skill when:
- Running one-off shell commands → use
exec tool directly
- Starting new background processes → use
exec with background:true
- Non-interactive scripts → use
exec tool
- The process isn't in tmux
- You need to create a new tmux session → use
exec with tmux new-session
Example Sessions
| Session | Purpose |
|---|
shared | Primary interactive session |
worker-2 - worker-8 | Parallel worker sessions |
Common Commands
List Sessions
tmux list-sessions
tmux ls
Capture Output
tmux capture-pane -t shared -p | tail -20
tmux capture-pane -t shared -p -S -
tmux capture-pane -t shared:0.0 -p
Send Keys
tmux send-keys -t shared "hello"
tmux send-keys -t shared "y" Enter
tmux send-keys -t shared Enter
tmux send-keys -t shared Escape
tmux send-keys -t shared C-c
tmux send-keys -t shared C-d
tmux send-keys -t shared C-z
Window/Pane Navigation
tmux select-window -t shared:0
tmux select-pane -t shared:0.1
tmux list-windows -t shared
Session Management
tmux new-session -d -s newsession
tmux kill-session -t sessionname
tmux rename-session -t old new
Sending Input Safely
For interactive TUIs (Claude Code, Codex, etc.), split text and Enter into separate sends to avoid paste/multiline edge cases:
tmux send-keys -t shared -l -- "Please apply the patch in src/foo.ts"
sleep 0.1
tmux send-keys -t shared Enter
Claude Code Session Patterns
Check if Session Needs Input
tmux capture-pane -t worker-3 -p | tail -10 | grep -E "❯|Yes.*No|proceed|permission"
Approve Claude Code Prompt
tmux send-keys -t worker-3 'y' Enter
tmux send-keys -t worker-3 '2' Enter
Check All Sessions Status
for s in shared worker-2 worker-3 worker-4 worker-5 worker-6 worker-7 worker-8; do
echo "=== $s ==="
tmux capture-pane -t $s -p 2>/dev/null | tail -5
done
Send Task to Session
tmux send-keys -t worker-4 "Fix the bug in auth.js" Enter
Notes
- Use
capture-pane -p to print to stdout (essential for scripting)
-S - captures entire scrollback history
- Target format:
session:window.pane (e.g., shared:0.0)
- Sessions persist across SSH disconnects