将编码任务委托给 Claude Code、OpenCode、iFlow 或 qodercli,通过后台进程运行。
由于 Bash 工具没有 PTY(伪终端)参数,运行交互式 CLI/TUI 工具(如 OpenCode、iFlow、qodercli 的交互模式)时,需要使用 tmux 来提供 PTY 环境。
安装 tmux:
# macOS brew install tmux # Ubuntu/Debian sudo apt install tmux # CentOS/RHEL sudo yum install tmux
根据需要安装以下一个或多个编码代理:
- Claude Code:
claudeCLI - OpenCode:
opencodeCLI - iFlow:
iflowCLI - qodercli:
qodercliCLI
对于简单的提示/对话,创建临时 git 仓库并运行:
# 创建临时工作目录 SCRATCH=$(mktemp -d) && cd $SCRATCH && git init # OpenCode 一次性任务 cd "$SCRATCH" && opencode run '你的提示词' # iFlow 一次性任务(非交互) cd "$SCRATCH" && iflow -p '你的提示词' # qodercli 一次性任务(非交互) cd "$SCRATCH" && qodercli -p '你的提示词'
为什么要 git init? 许多代理 CLI 在 git 仓库中工作效果最佳(支持 diff、patch、历史记录)。临时仓库可以保持工作干净且可复现。
对于较长的任务,在 tmux 中启动代理,然后使用 bash 运行 tmux 命令进行监控和交互:
# 1) 在目标目录启动代理(tmux 提供 PTY) tmux new-session -d -s opencode-1 "cd ~/project && opencode run '构建贪吃蛇游戏'" # 2) 监控输出(最后 50 行) tmux capture-pane -t opencode-1 -p | tail -50 # 3) 安全发送输入(文本然后回车) tmux send-keys -t opencode-1 -l -- "yes" sleep 0.1 tmux send-keys -t opencode-1 Enter # 4) 如需停止 tmux send-keys -t opencode-1 C-c # 或终止 tmux 会话 tmux kill-session -t opencode-1
OpenCode 通常是交互式的(TUI),因此在 tmux 中运行:
# 启动 TUI(默认) tmux new-session -d -s opencode-1 "cd ~/project && opencode" # 运行一次性消息 tmux new-session -d -s opencode-run-1 "cd ~/project && opencode run '添加深色模式切换'" # 指定模型 / 继续会话 tmux new-session -d -s opencode-model-1 "cd ~/project && opencode -m zai-coding-plan/glm-4.7 run '重构认证模块'" tmux new-session -d -s opencode-continue-1 "cd ~/project && opencode -c" tmux new-session -d -s opencode-session-1 "cd ~/project && opencode -s <sessionId>" # PR 工作流 tmux new-session -d -s opencode-pr-130 "cd ~/project && opencode pr 130"
Claude Code 使用 --print --permission-mode bypassPermissions 模式:
# 前台运行 cd ~/project && claude --permission-mode bypassPermissions --print '你的任务' # 后台运行 # 使用 Bash 工具的 run_in_background: true 参数
iFlow 支持交互式和非交互式两种模式:
# 一次性任务(非交互) cd ~/project && iflow -p '解释这个仓库的架构并提出 3 个重构建议' # 提示后保持交互 tmux new-session -d -s iflow-1 "cd ~/project && iflow -i '扫描仓库并识别风险模式;然后等待后续指令'" # 会话控制 / 限制 cd ~/project && iflow -c -p '总结上次发布以来的变更' cd ~/project && iflow --max-turns 25 -p '修复失败的测试'
qodercli 可以作为交互式助手或非交互式"打印后退出"模式运行:
# 交互模式 tmux new-session -d -s qoder-1 "cd ~/project && qodercli -w ~/project" # 一次性任务(非交互)— 委托任务的首选方式 # 注意:qodercli 的 -p 模式不需要 PTY,建议使用后台 bash 而非 tmux # 因为 tmux capture-pane 对 qodercli 可能返回空内容 cd ~/project && qodercli -w ~/project -p '你的任务' --max-turns 25 2>&1 | tee /tmp/qoder-task.log # 监控进度 tail -50 /tmp/qoder-task.log # 机器可读输出 cd ~/project && qodercli -p '总结 src/ 职责' -f json
处理长提示词或非 ASCII 字符:
# 1) 将提示词写入临时文件 # 2) 通过 $(cat ...) 传递 cd ~/project && qodercli -w ~/project -p "$(cat /tmp/my-prompt.txt)" --max-turns 30
# 1. 为每个问题创建 worktree git worktree add -b fix/issue-78 /tmp/issue-78 main git worktree add -b fix/issue-99 /tmp/issue-99 main # 2. 在每个 worktree 中启动代理 tmux new-session -d -s issue-78 "cd /tmp/issue-78 && pnpm install && opencode run '修复 issue #78'" tmux new-session -d -s issue-99 "cd /tmp/issue-99 && pnpm install && iflow -i '修复 issue #99'" # 3. 监控进度 tmux list-sessions tmux capture-pane -t issue-78 -p | tail -50 # 4. 修复完成后创建 PR cd /tmp/issue-78 && git push -u origin fix/issue-78 gh pr create --repo user/repo --head fix/issue-78 --title "fix: ..." --body "..." # 5. 清理 git worktree remove /tmp/issue-78 git worktree remove /tmp/issue-99
-
为每个代理选择正确的执行模式:
- OpenCode/iFlow:在 tmux 中运行以获得交互性(PTY)
- qodercli 一次性任务(
-p):优先使用直接后台 bash 配合tee记录日志 - Claude Code:优先使用
--print --permission-mode bypassPermissions(非交互)
-
尊重工具选择 - 如果用户要求使用特定代理 CLI,请使用该 CLI
-
保持耐心 - 不要因为会话"慢"就终止它
-
智能监控 - 首先使用
tmux capture-pane,如果 10 秒后返回空内容,切换到日志文件(tee输出) -
并行是允许的 - 可以为批处理工作运行多个后台会话
-
永远不要在 ~/ 目录启动代理 - 避免将内部文档纳入上下文
某些代理 CLI(特别是 qodercli)使用备用屏幕缓冲区或延迟 stdout,导致 tmux capture-pane 返回空白输出。
解决方案:使用 tee + 日志文件作为主要监控方法:
tmux new-session -d -s agent-1 "cd ~/project && agent-cli ... 2>&1 | tee /tmp/agent-task.log"
tail -50 /tmp/agent-task.log脚手架工具(create-next-app、create-vite 等)经常在新版本中添加交互提示。
解决方案:管道默认答案处理意外提示:
echo "no" | npx create-next-app@latest my-app --typescript --tailwind --eslint --app --use-npm
Bash 工具环境可能不会继承 UTF-8 区域设置。如果看到乱码,请将提示词写入临时文件并通过 $(cat /tmp/prompt.txt) 传递。
当在后台启动编码代理时,请保持用户知情:
- 启动时发送简短消息(正在运行什么 + 在哪里)
- 仅在以下情况更新:
- 里程碑完成(构建完成、测试通过)
- 代理提问 / 需要输入
- 遇到错误或需要用户操作
- 代理完成(包括变更内容 + 位置)
- 如果终止会话,立即说明原因