mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-12 07:20:45 +00:00
* feat(skills): add 'Use when / Don't use when' blocks to skill descriptions Based on OpenAI's Shell + Skills + Compaction best practices article. Key changes: - Added clear routing logic to skill descriptions - Added negative examples to prevent misfires - Added templates/examples to github skill - Included Blake's specific setup notes for openhue Skills updated: - apple-reminders: Clarify vs Clawdbot cron - github: Clarify vs local git operations - imsg: Clarify vs other messaging channels - openhue: Add device inventory, room layout - tmux: Clarify vs exec tool - weather: Add location defaults, format codes Reference: https://developers.openai.com/blog/skills-shell-tips * fix(skills): restore metadata and generic CLI examples --------- Co-authored-by: Peter Steinberger <steipete@gmail.com>
154 lines
3.4 KiB
Markdown
154 lines
3.4 KiB
Markdown
---
|
||
name: tmux
|
||
description: Remote-control tmux sessions for interactive CLIs by sending keystrokes and scraping pane output.
|
||
metadata:
|
||
{ "openclaw": { "emoji": "🧵", "os": ["darwin", "linux"], "requires": { "bins": ["tmux"] } } }
|
||
---
|
||
|
||
# tmux Session Control
|
||
|
||
Control tmux sessions by sending keystrokes and reading output. Essential for managing Claude Code sessions.
|
||
|
||
## 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
|
||
|
||
```bash
|
||
tmux list-sessions
|
||
tmux ls
|
||
```
|
||
|
||
### Capture Output
|
||
|
||
```bash
|
||
# Last 20 lines of pane
|
||
tmux capture-pane -t shared -p | tail -20
|
||
|
||
# Entire scrollback
|
||
tmux capture-pane -t shared -p -S -
|
||
|
||
# Specific pane in window
|
||
tmux capture-pane -t shared:0.0 -p
|
||
```
|
||
|
||
### Send Keys
|
||
|
||
```bash
|
||
# Send text (doesn't press Enter)
|
||
tmux send-keys -t shared "hello"
|
||
|
||
# Send text + Enter
|
||
tmux send-keys -t shared "y" Enter
|
||
|
||
# Send special keys
|
||
tmux send-keys -t shared Enter
|
||
tmux send-keys -t shared Escape
|
||
tmux send-keys -t shared C-c # Ctrl+C
|
||
tmux send-keys -t shared C-d # Ctrl+D (EOF)
|
||
tmux send-keys -t shared C-z # Ctrl+Z (suspend)
|
||
```
|
||
|
||
### Window/Pane Navigation
|
||
|
||
```bash
|
||
# Select window
|
||
tmux select-window -t shared:0
|
||
|
||
# Select pane
|
||
tmux select-pane -t shared:0.1
|
||
|
||
# List windows
|
||
tmux list-windows -t shared
|
||
```
|
||
|
||
### Session Management
|
||
|
||
```bash
|
||
# Create new session
|
||
tmux new-session -d -s newsession
|
||
|
||
# Kill session
|
||
tmux kill-session -t sessionname
|
||
|
||
# Rename session
|
||
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:
|
||
|
||
```bash
|
||
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
|
||
|
||
```bash
|
||
# Look for prompts
|
||
tmux capture-pane -t worker-3 -p | tail -10 | grep -E "❯|Yes.*No|proceed|permission"
|
||
```
|
||
|
||
### Approve Claude Code Prompt
|
||
|
||
```bash
|
||
# Send 'y' and Enter
|
||
tmux send-keys -t worker-3 'y' Enter
|
||
|
||
# Or select numbered option
|
||
tmux send-keys -t worker-3 '2' Enter
|
||
```
|
||
|
||
### Check All Sessions Status
|
||
|
||
```bash
|
||
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
|
||
|
||
```bash
|
||
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
|