项目文件夹

文件
2026-07-13 21:36:33 +08:00

122 行
4.1 KiB
Markdown

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
---
name: tmux
description: 通过发送按键和抓取窗格输出来远程控制 tmux 会话,用于交互式 CLI。
metadata: {"nanobot":{"emoji":"🧵","os":["darwin","linux"],"requires":{"bins":["tmux"]}}}
---
# tmux 技能
仅当你需要交互式 TTY 时才使用 tmux。对于长期运行的非交互式任务,优先使用 exec 后台模式。
## 快速开始(独立 socket,exec 工具)
```bash
SOCKET_DIR="${NANOBOT_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/nanobot-tmux-sockets}"
mkdir -p "$SOCKET_DIR"
SOCKET="$SOCKET_DIR/nanobot.sock"
SESSION=nanobot-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 约定
- 使用 `NANOBOT_TMUX_SOCKET_DIR` 环境变量。
- 默认 socket 路径:`"$NANOBOT_TMUX_SOCKET_DIR/nanobot.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`(使用 `NANOBOT_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`(非基础 REPL 会破坏 send-keys 流程)。
## Windows / WSL
- tmux 在 macOS/Linux 上受支持。在 Windows 上,请使用 WSL 并在 WSL 内安装 tmux。
- 本技能限定在 `darwin`/`linux` 系统上运行,并且要求 `tmux` 在 PATH 中可用。
## 编排编码 AgentCodex、Claude Code
tmux 擅长并行运行多个编码 agent:
```bash
SOCKET="${TMPDIR:-/tmp}/codex-army.sock"
# 创建多个会话
for i in 1 2 3 4 5; do
tmux -S "$SOCKET" new-session -d -s "agent-$i"
done
# 在不同工作目录中启动 agent
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
# 轮询完成状态(检查提示符是否返回)
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
# 获取已完成会话的完整输出
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)