[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-openclaw-openclaw-skills-tmux":3},{"error":4,"detail":5,"metadata":36,"markdownContent":37,"rawMarkdown":33},false,{"repo_full_name":6,"owner":7,"repo_name":7,"repo_forks":8,"skill_path":9,"repo_stars":10,"name":11,"category_id":12,"description":13,"file_tree":14,"skill_md_content":33,"skill_id":34,"skill_key":35},"openclaw/openclaw","openclaw",64359,"skills/tmux",330752,"tmux",6,"Remote-control tmux sessions for interactive CLIs by sending keystrokes and scraping pane output.",[15,20],{"name":16,"path":17,"size":18,"type":19},"SKILL.md","skills/tmux/SKILL.md",3485,"file",{"name":21,"path":22,"type":23,"children":24},"scripts","skills/tmux/scripts","folder",[25,29],{"name":26,"path":27,"size":28,"type":19},"find-sessions.sh","skills/tmux/scripts/find-sessions.sh",2945,{"name":30,"path":31,"size":32,"type":19},"wait-for-text.sh","skills/tmux/scripts/wait-for-text.sh",2139,"---\nname: tmux\ndescription: Remote-control tmux sessions for interactive CLIs by sending keystrokes and scraping pane output.\nmetadata:\n  { \"openclaw\": { \"emoji\": \"🧵\", \"os\": [\"darwin\", \"linux\"], \"requires\": { \"bins\": [\"tmux\"] } } }\n---\n\n# tmux Session Control\n\nControl tmux sessions by sending keystrokes and reading output. Essential for managing Claude Code sessions.\n\n## When to Use\n\n✅ **USE this skill when:**\n\n- Monitoring Claude/Codex sessions in tmux\n- Sending input to interactive terminal applications\n- Scraping output from long-running processes in tmux\n- Navigating tmux panes/windows programmatically\n- Checking on background work in existing sessions\n\n## When NOT to Use\n\n❌ **DON'T use this skill when:**\n\n- Running one-off shell commands → use `exec` tool directly\n- Starting new background processes → use `exec` with `background:true`\n- Non-interactive scripts → use `exec` tool\n- The process isn't in tmux\n- You need to create a new tmux session → use `exec` with `tmux new-session`\n\n## Example Sessions\n\n| Session                 | Purpose                     |\n| ----------------------- | --------------------------- |\n| `shared`                | Primary interactive session |\n| `worker-2` - `worker-8` | Parallel worker sessions    |\n\n## Common Commands\n\n### List Sessions\n\n```bash\ntmux list-sessions\ntmux ls\n```\n\n### Capture Output\n\n```bash\n# Last 20 lines of pane\ntmux capture-pane -t shared -p | tail -20\n\n# Entire scrollback\ntmux capture-pane -t shared -p -S -\n\n# Specific pane in window\ntmux capture-pane -t shared:0.0 -p\n```\n\n### Send Keys\n\n```bash\n# Send text (doesn't press Enter)\ntmux send-keys -t shared \"hello\"\n\n# Send text + Enter\ntmux send-keys -t shared \"y\" Enter\n\n# Send special keys\ntmux send-keys -t shared Enter\ntmux send-keys -t shared Escape\ntmux send-keys -t shared C-c          # Ctrl+C\ntmux send-keys -t shared C-d          # Ctrl+D (EOF)\ntmux send-keys -t shared C-z          # Ctrl+Z (suspend)\n```\n\n### Window/Pane Navigation\n\n```bash\n# Select window\ntmux select-window -t shared:0\n\n# Select pane\ntmux select-pane -t shared:0.1\n\n# List windows\ntmux list-windows -t shared\n```\n\n### Session Management\n\n```bash\n# Create new session\ntmux new-session -d -s newsession\n\n# Kill session\ntmux kill-session -t sessionname\n\n# Rename session\ntmux rename-session -t old new\n```\n\n## Sending Input Safely\n\nFor interactive TUIs (Claude Code, Codex, etc.), split text and Enter into separate sends to avoid paste/multiline edge cases:\n\n```bash\ntmux send-keys -t shared -l -- \"Please apply the patch in src/foo.ts\"\nsleep 0.1\ntmux send-keys -t shared Enter\n```\n\n## Claude Code Session Patterns\n\n### Check if Session Needs Input\n\n```bash\n# Look for prompts\ntmux capture-pane -t worker-3 -p | tail -10 | grep -E \"❯|Yes.*No|proceed|permission\"\n```\n\n### Approve Claude Code Prompt\n\n```bash\n# Send 'y' and Enter\ntmux send-keys -t worker-3 'y' Enter\n\n# Or select numbered option\ntmux send-keys -t worker-3 '2' Enter\n```\n\n### Check All Sessions Status\n\n```bash\nfor s in shared worker-2 worker-3 worker-4 worker-5 worker-6 worker-7 worker-8; do\n  echo \"=== $s ===\"\n  tmux capture-pane -t $s -p 2>/dev/null | tail -5\ndone\n```\n\n### Send Task to Session\n\n```bash\ntmux send-keys -t worker-4 \"Fix the bug in auth.js\" Enter\n```\n\n## Notes\n\n- Use `capture-pane -p` to print to stdout (essential for scripting)\n- `-S -` captures entire scrollback history\n- Target format: `session:window.pane` (e.g., `shared:0.0`)\n- Sessions persist across SSH disconnects\n","90d9af73-5a14-526c-b49a-a9a2845898ae","openclaw-openclaw-skills-tmux",{"name":11,"description":13},"\u003Ch1>tmux Session Control\u003C/h1>\n\u003Cp>Control tmux sessions by sending keystrokes and reading output. Essential for managing Claude Code sessions.\u003C/p>\n\u003Ch2>When to Use\u003C/h2>\n\u003Cp>✅ \u003Cstrong>USE this skill when:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Monitoring Claude/Codex sessions in tmux\u003C/li>\n\u003Cli>Sending input to interactive terminal applications\u003C/li>\n\u003Cli>Scraping output from long-running processes in tmux\u003C/li>\n\u003Cli>Navigating tmux panes/windows programmatically\u003C/li>\n\u003Cli>Checking on background work in existing sessions\u003C/li>\n\u003C/ul>\n\u003Ch2>When NOT to Use\u003C/h2>\n\u003Cp>❌ \u003Cstrong>DON&#39;T use this skill when:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Running one-off shell commands → use \u003Ccode>exec\u003C/code> tool directly\u003C/li>\n\u003Cli>Starting new background processes → use \u003Ccode>exec\u003C/code> with \u003Ccode>background:true\u003C/code>\u003C/li>\n\u003Cli>Non-interactive scripts → use \u003Ccode>exec\u003C/code> tool\u003C/li>\n\u003Cli>The process isn&#39;t in tmux\u003C/li>\n\u003Cli>You need to create a new tmux session → use \u003Ccode>exec\u003C/code> with \u003Ccode>tmux new-session\u003C/code>\u003C/li>\n\u003C/ul>\n\u003Ch2>Example Sessions\u003C/h2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Session\u003C/th>\n\u003Cth>Purpose\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>shared\u003C/code>\u003C/td>\n\u003Ctd>Primary interactive session\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>worker-2\u003C/code> - \u003Ccode>worker-8\u003C/code>\u003C/td>\n\u003Ctd>Parallel worker sessions\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Ch2>Common Commands\u003C/h2>\n\u003Ch3>List Sessions\u003C/h3>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">bash\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-bash\">tmux list-sessions\ntmux \u003Cspan class=\"hljs-built_in\">ls\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003Ch3>Capture Output\u003C/h3>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">bash\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-comment\"># Last 20 lines of pane\u003C/span>\ntmux capture-pane -t shared -p | \u003Cspan class=\"hljs-built_in\">tail\u003C/span> -20\n\n\u003Cspan class=\"hljs-comment\"># Entire scrollback\u003C/span>\ntmux capture-pane -t shared -p -S -\n\n\u003Cspan class=\"hljs-comment\"># Specific pane in window\u003C/span>\ntmux capture-pane -t shared:0.0 -p\u003C/code>\u003C/pre>\u003C/div>\u003Ch3>Send Keys\u003C/h3>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">bash\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-comment\"># Send text (doesn&#x27;t press Enter)\u003C/span>\ntmux send-keys -t shared \u003Cspan class=\"hljs-string\">&quot;hello&quot;\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Send text + Enter\u003C/span>\ntmux send-keys -t shared \u003Cspan class=\"hljs-string\">&quot;y&quot;\u003C/span> Enter\n\n\u003Cspan class=\"hljs-comment\"># Send special keys\u003C/span>\ntmux send-keys -t shared Enter\ntmux send-keys -t shared Escape\ntmux send-keys -t shared C-c          \u003Cspan class=\"hljs-comment\"># Ctrl+C\u003C/span>\ntmux send-keys -t shared C-d          \u003Cspan class=\"hljs-comment\"># Ctrl+D (EOF)\u003C/span>\ntmux send-keys -t shared C-z          \u003Cspan class=\"hljs-comment\"># Ctrl+Z (suspend)\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003Ch3>Window/Pane Navigation\u003C/h3>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">bash\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-comment\"># Select window\u003C/span>\ntmux select-window -t shared:0\n\n\u003Cspan class=\"hljs-comment\"># Select pane\u003C/span>\ntmux select-pane -t shared:0.1\n\n\u003Cspan class=\"hljs-comment\"># List windows\u003C/span>\ntmux list-windows -t shared\u003C/code>\u003C/pre>\u003C/div>\u003Ch3>Session Management\u003C/h3>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">bash\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-comment\"># Create new session\u003C/span>\ntmux new-session -d -s newsession\n\n\u003Cspan class=\"hljs-comment\"># Kill session\u003C/span>\ntmux kill-session -t sessionname\n\n\u003Cspan class=\"hljs-comment\"># Rename session\u003C/span>\ntmux rename-session -t old new\u003C/code>\u003C/pre>\u003C/div>\u003Ch2>Sending Input Safely\u003C/h2>\n\u003Cp>For interactive TUIs (Claude Code, Codex, etc.), split text and Enter into separate sends to avoid paste/multiline edge cases:\u003C/p>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">bash\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-bash\">tmux send-keys -t shared -l -- \u003Cspan class=\"hljs-string\">&quot;Please apply the patch in src/foo.ts&quot;\u003C/span>\n\u003Cspan class=\"hljs-built_in\">sleep\u003C/span> 0.1\ntmux send-keys -t shared Enter\u003C/code>\u003C/pre>\u003C/div>\u003Ch2>Claude Code Session Patterns\u003C/h2>\n\u003Ch3>Check if Session Needs Input\u003C/h3>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">bash\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-comment\"># Look for prompts\u003C/span>\ntmux capture-pane -t worker-3 -p | \u003Cspan class=\"hljs-built_in\">tail\u003C/span> -10 | grep -E \u003Cspan class=\"hljs-string\">&quot;❯|Yes.*No|proceed|permission&quot;\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003Ch3>Approve Claude Code Prompt\u003C/h3>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">bash\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-comment\"># Send &#x27;y&#x27; and Enter\u003C/span>\ntmux send-keys -t worker-3 \u003Cspan class=\"hljs-string\">&#x27;y&#x27;\u003C/span> Enter\n\n\u003Cspan class=\"hljs-comment\"># Or select numbered option\u003C/span>\ntmux send-keys -t worker-3 \u003Cspan class=\"hljs-string\">&#x27;2&#x27;\u003C/span> Enter\u003C/code>\u003C/pre>\u003C/div>\u003Ch3>Check All Sessions Status\u003C/h3>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">bash\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-keyword\">for\u003C/span> s \u003Cspan class=\"hljs-keyword\">in\u003C/span> shared worker-2 worker-3 worker-4 worker-5 worker-6 worker-7 worker-8; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n  \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;=== \u003Cspan class=\"hljs-variable\">$s\u003C/span> ===&quot;\u003C/span>\n  tmux capture-pane -t \u003Cspan class=\"hljs-variable\">$s\u003C/span> -p 2&gt;/dev/null | \u003Cspan class=\"hljs-built_in\">tail\u003C/span> -5\n\u003Cspan class=\"hljs-keyword\">done\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003Ch3>Send Task to Session\u003C/h3>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">bash\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-bash\">tmux send-keys -t worker-4 \u003Cspan class=\"hljs-string\">&quot;Fix the bug in auth.js&quot;\u003C/span> Enter\u003C/code>\u003C/pre>\u003C/div>\u003Ch2>Notes\u003C/h2>\n\u003Cul>\n\u003Cli>Use \u003Ccode>capture-pane -p\u003C/code> to print to stdout (essential for scripting)\u003C/li>\n\u003Cli>\u003Ccode>-S -\u003C/code> captures entire scrollback history\u003C/li>\n\u003Cli>Target format: \u003Ccode>session:window.pane\u003C/code> (e.g., \u003Ccode>shared:0.0\u003C/code>)\u003C/li>\n\u003Cli>Sessions persist across SSH disconnects\u003C/li>\n\u003C/ul>\n"]