ClawSkills logoClawSkills

Tmux

通过发送击键和抓取窗格输出来远程控制 tmux 会话以用于交互式 CLI。

介绍

# tmux Skill (Clawdbot)

仅在需要交互式 TTY 时使用 tmux。对于长时间运行的非交互式任务,首选 bash 后台模式。

## 快速入门(独立 socket,bash 工具)

```bash SOCKET_DIR="${CLAWDBOT_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/clawdbot-tmux-sockets}" mkdir -p "$SOCKET_DIR" SOCKET="$SOCKET_DIR/clawdbot.sock" SESSION=clawdbot-python

tmux -S "$SOCKET" new -d -s "$SESSION" -n shell tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- 'PYTHON_BASIC_REPL=1 python3 -q' Enter tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200 ```

启动会话后,始终打印监控命令:

``` To monitor: tmux -S "$SOCKET" attach -t "$SESSION" tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200 ```

## Socket 约定

- 使用 `CLAWDBOT_TMUX_SOCKET_DIR`(默认 `${TMPDIR:-/tmp}/clawdbot-tmux-sockets`)。 - 默认 socket 路径:`"$CLAWDBOT_TMUX_SOCKET_DIR/clawdbot.sock"`。

## 定位窗格与命名

- 目标格式:`session:window.pane`(默认为 `:0.0`)。 - 保持名称简短;避免使用空格。 - 检查:`tmux -S "$SOCKET" list-sessions`,`tmux -S "$SOCKET" list-panes -a`。

## 查找会话

- 列出 socket 上的会话:`{baseDir}/scripts/find-sessions.sh -S "$SOCKET"`。 - 扫描所有 socket:`{baseDir}/scripts/find-sessions.sh --all`(使用 `CLAWDBOT_TMUX_SOCKET_DIR`)。

## 安全发送输入

- 优先使用字面发送:`tmux -S "$SOCKET" send-keys -t target -l -- "$cmd"`。 - 控制键:`tmux -S "$SOCKET" send-keys -t target C-c`。

## 监控输出

- 捕获最近的历史记录:`tmux -S "$SOCKET" capture-pane -p -J -t target -S -200`。 - 等待提示符:`{baseDir}/scripts/wait-for-text.sh -t session:0.0 -p 'pattern'`。 - 可以连接;使用 `Ctrl+b d` 分离。

## 生成进程

- 对于 Python REPL,请设置 `PYTHON_BASIC_REPL=1`(非 basic REPL 会破坏 send-keys 流程)。

## Windows / WSL

- tmux 支持 macOS/Linux。在 Windows 上,请使用 WSL 并在 WSL 内安装 tmux。 - 此技能限制在 `darwin`/`linux` 平台,且需要 PATH 中有 `tmux`。

## 编排代码代理(Codex, Claude Code)

tmux 非常擅长并行运行多个代码代理:

```bash SOCKET="${TMPDIR:-/tmp}/codex-army.sock"

# Create multiple sessions for i in 1 2 3 4 5; do tmux -S "$SOCKET" new-session -d -s "agent-$i" done

# Launch agents in different workdirs tmux -S "$SOCKET" send-keys -t agent-1 "cd /tmp/project1 && codex --yolo 'Fix bug X'" Enter tmux -S "$SOCKET" send-keys -t agent-2 "cd /tmp/project2 && codex --yolo 'Fix bug Y'" Enter

# Poll for completion (check if prompt returned) for sess in agent-1 agent-2; do if tmux -S "$SOCKET" capture-pane -p -t "$sess" -S -3 | grep -q "❯"; then echo "$sess: DONE" else echo "$sess: Running..." fi done

# Get full output from completed session tmux -S "$SOCKET" capture-pane -p -t agent-1 -S -500 ```

**提示:** - 使用独立的 git worktree 进行并行修复(避免分支冲突) - 在全新克隆中运行 codex 之前先执行 `pnpm install` - 检查 shell 提示符(`❯` 或 `$`)以检测完成状态 - Codex 需要 `--yolo` 或 `--full-auto` 才能进行非交互式修复

## 清理

- 终止会话:`tmux -S "$SOCKET" kill-session -t "$SESSION"`。 - 终止 socket 上的所有会话:`tmux -S "$SOCKET" list-sessions -F '#{session_name}' | xargs -r -n1 tmux -S "$SOCKET" kill-session -t`。 - 移除私有 socket 上的所有内容:`tmux -S "$SOCKET" kill-server`。

## 辅助工具:wait-for-text.sh

`{baseDir}/scripts/wait-for-text.sh` 轮询窗格中的正则表达式(或固定字符串),并带有超时。

```bash {baseDir}/scripts/wait-for-text.sh -t session:0.0 -p 'pattern' [-F] [-T 20] [-i 0.5] [-l 2000] ```

- `-t`/`--target` 窗格目标(必需) - `-p`/`--pattern` 要匹配的正则表达式(必需);添加 `-F` 表示固定字符串 - `-T` 超时秒数(整数,默认 15) - `-i` 轮询间隔秒数(默认 0.5) - `-l` 搜索的历史行数(整数,默认 1000)

更多产品