ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

PicoClaw 的 tmux Skill 实战:用 keystroke 远程操控交互式终端与并行编排 Coding Agent

PicoClaw 的 tmux Skill 实战:用 keystroke 远程操控交互式终端与并行编排 Coding Agent 人工智能AI 应用AI Agent交互助手工具调用MCP ClientsAgent 记忆【免费下载链接】picoclawTiny, Fast, and Deployable anywhere — automate the mundane, unleash your creativity项目地址https://gitcode.com/gh_mirrors/pi/picoclaw点击查看免费下载导读本文基于 PicoClaw 仓库内置技能 workspace/skills/tmux/SKILL.md 展开讲解如何让 AI Agent 通过 tmux 的隔离 socket 远程控制交互式命令行程序——发送按键keystroke、抓取窗格输出pane scraping、等待特定文本出现并在多个会话中并行编排 Codex、Claude Code 等编码 Agent。读完本文你将掌握一套可复制的 tmux 会话管理规范、两个开箱即用的辅助脚本find-sessions.sh与wait-for-text.sh的参数用法以及 Agent 在交互式 TTY 与后台任务之间的正确取舍。技能定位与使用原则tmux技能是 PicoClaw workspace 中面向交互式终端控制的专项技能。其 frontmatter 定义了触发条件name: tmux description: Remote-control tmux sessions for interactive CLIs by sending keystrokes and scraping pane output. metadata: {nanobot:{emoji:,os:[darwin,linux],requires:{bins:[tmux]}}}两个关键约束平台门槛该技能仅在darwinmacOS与linux上生效且要求tmux命令在 PATH 中可用。使用边界技能明确建议——只有在需要交互式 TTY 时才使用 tmux对于长时运行、非交互的任务优先使用exec工具的后台模式exec background mode。这避免了为简单的后台命令引入不必要的终端状态机。从 PicoClaw 的技能加载机制看见 pkg/skills/loader.go技能存放在workspace/skills/skill-name/SKILL.md加载顺序为 workspace global builtin且名称必须匹配^[a-zA-Z0-9](-[a-zA-Z0-9])*$并携带非空description——本技能的tmux名称与描述均符合加载器校验规则。快速上手隔离 socket 启动会话技能给出的核心模式是每个 Agent 使用独立的私有 socket避免与用户日常 tmux 会话互相干扰。最小启动流程SOCKET_DIR${NANOBOT_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/nanobot-tmux-sockets} mkdir -p $SOCKET_DIR SOCKET$SOCKET_DIR/nanobot.sock SESSIONnanobot-python tmux -S $SOCKET new -d -s $SESSION -n shell tmux -S $SOCKET send-keys -t $SESSION:0.0 -- PYTHON_BASIC_REPL1 python3 -q Enter tmux -S $SOCKET capture-pane -p -J -t $SESSION:0.0 -S -200命令拆解参数含义-S $SOCKET指定私有的 socket 路径所有后续 tmux 命令都必须携带new -d以 detached 方式新建会话后台运行不占用终端-s $SESSION会话名称-n shell窗口window名称send-keys ... Enter向指定窗格发送按键序列并以回车结束capture-pane -p -J抓取窗格内容打印到 stdout-J负责把被折行的长行重新拼接为逻辑行-S -200从历史回溯 200 行抓取输出会话启动后技能要求 Agent 主动打印监视命令方便人类随时接管To monitor: tmux -S $SOCKET attach -t $SESSION tmux -S $SOCKET capture-pane -p -J -t $SESSION:0.0 -S -200这样既保证了自动化流程的独立性也保留了人工介入检查的通道。Socket 约定环境变量与默认路径技能确立了统一的 socket 约定让同一台机器上的不同 Agent/技能之间可以互相发现使用环境变量NANOBOT_TMUX_SOCKET_DIR指定 socket 目录未设置时回退到${TMPDIR:-/tmp}/nanobot-tmux-sockets默认 socket 路径为$NANOBOT_TMUX_SOCKET_DIR/nanobot.sock。这个回退链同样体现在配套脚本中见 find-sessions.shsocket_dir${NANOBOT_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/nanobot-tmux-sockets}。保持这一约定--all批量扫描、跨会话查找等功能才能开箱即用。定位窗格与命名规范tmux 的定位语法是session:window.pane例如nanobot-python:0.0表示nanobot-python会话、第 0 个窗口、第 0 个窗格。技能给出的命名约束名称尽量短避免空格空格在 send-keys 与目标解析中容易引入歧义目标格式缺省窗口/窗格时默认:0.0。检查当前状态tmux -S $SOCKET list-sessions tmux -S $SOCKET list-panes -alist-panes -a会跨所有会话列出窗格适合在 Agent 忘记自己创建了哪些窗格时快速盘点。查找会话find-sessions.sh 脚本技能指向的find-sessions.sh提供了两类查找能力完整实现见 workspace/skills/tmux/scripts/find-sessions.sh# 查找当前 socket 上的会话 {baseDir}/scripts/find-sessions.sh -S $SOCKET # 扫描 NANOBOT_TMUX_SOCKET_DIR 下所有 socket {baseDir}/scripts/find-sessions.sh --all在仓库中{baseDir}即workspace/skills/tmux完整路径为 workspace/skills/tmux/scripts/find-sessions.sh。脚本完整参数表参数别名作用-L--socket按 socket 名称查找透传给tmux -L-S--socket-path按 socket 路径查找透传给tmux -S-A--all扫描NANOBOT_TMUX_SOCKET_DIR下所有 socket-q--query按会话名称做大小写不敏感子串过滤-h--help打印帮助实现细节值得注意参数互斥校验--all不能与-L/-S同时使用-L与-S也不能并存冲突时报错退出L36-L44前置检查tmux 不在 PATH 时直接报错退出L46-L49会话元信息通过list-sessions -F #{session_name}\t#{session_attached}\t#{session_created_string}一次性取回名称、是否被 attach、创建时间并格式化为- name (attached|detached, started ...)输出--all扫描仅遍历目录下的 socket 文件-S判断普通文件跳过对每个 socket 分别列出会话任何 socket 失败只记录退出码而不会中断整体扫描。发送输入的安全姿势技能明确推荐优先使用字面量发送避免 shell 再次解析# 字面量发送整段字符串作为原始按键序列不做 shell 解释 tmux -S $SOCKET send-keys -t target -l -- $cmd # 控制键Ctrl-C 中断当前程序 tmux -S $SOCKET send-keys -t target C-c-l表示 literal 模式--之后的内容不会被当作 tmux 自身的按键语法解析是注入复杂命令时的推荐形态控制键如C-c、C-d、Enter则直接以 tmux 按键名形式发送用于中断、EOF 或确认输入。这套组合让 Agent 既能安全地注入完整命令文本又能像真人一样发送组合键。观察输出capture-pane 与 wait-for-text.sh抓取最近历史输出tmux -S $SOCKET capture-pane -p -J -t target -S -200-p输出到 stdout管道友好-J拼接折行保证抓到的内容与屏幕逻辑行一致-S -200抓取末尾 200 行历史足以覆盖一次命令的完整回显。当需要等待某个提示符/关键字出现后再继续时使用配套脚本 wait-for-text.sh{baseDir}/scripts/wait-for-text.sh -t session:0.0 -p pattern [-F] [-T 20] [-i 0.5] [-l 2000]完整参数表仓库内脚本自带 usage参数别名默认值说明-t--target必填tmux 目标session:window.pane-p--pattern必填要匹配的正则加-F则按固定字符串匹配grep -F-T--timeout15超时秒数整数-i--interval0.5轮询间隔秒-l--lines1000每次抓取并检索的历史行数整数脚本核心逻辑workspace/skills/tmux/scripts/wait-for-text.sh用date %s计算截止时间deadline start timeout循环内执行tmux capture-pane -p -J -t $target -S -${lines}对抓取文本执行grep -E或-F固定串匹配命中立即exit 0超时则打印超时信息并把最后lines行窗口内容回显到 stderr 后exit 1每轮之间sleep $interval控制轮询频率。这是 Agent 实现发命令 → 等提示符 → 再发下一条交互循环的关键构件。另外注意脚本允许tmux attach人工接管分离用Ctrlb d即可不会影响自动化流程。启动交互式进程的注意事项技能以 Python REPL 为例给出了一条重要经验PYTHON_BASIC_REPL1 python3 -q原因在于Python 的 non-basic REPL如python3 -q默认的增强交互模式会破坏send-keys注入按键的流程例如括号补全、多行粘贴处理等行为差异PYTHON_BASIC_REPL1强制启用基础 REPL保证逐键发送的稳定回显。这是任何通过 keystroke 驱动交互式解释器场景都应当遵循的通用经验优先选用行为确定、回显可预测的交互模式。Windows / WSL 支持tmux 原生支持 macOS/LinuxWindows 下需使用 WSL并在 WSL 内部安装 tmux技能 frontmatter 已把os限制为darwin/linux并声明requires.bins: [tmux]因此 Agent 在 Windows 原生环境不会错误触发本技能。编排编码 AgentCodex、Claude Code 并行军阵tmux 技能的高阶用法是并行运行多个编码 Agent每个 Agent 一个独立会话互不干扰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工程要点技能 Tips 原文继承并行修复多个问题时为每个项目使用独立的 git worktree避免分支冲突在全新 clone 上运行 codex 之前先执行pnpm install避免首次运行卡在依赖安装通过检查 shell 提示符❯或$判断命令是否执行完毕——提示符回归意味着上一个命令已结束Codex 需要--yolo或--full-auto才能进行非交互式修复否则会等待人工确认。这里的轮询完成模式与wait-for-text.sh的思路完全一致实际落地时可以直接替换为wait-for-text.sh -t agent-N -p ❯以获得超时保护。清理终止会话的三种粒度# 终止单个会话 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-serverkill-session只清理会话socket 与 tmux server 仍存活kill-server是清场操作会终止该 socket 上的 tmux 服务端并删除 socket 文件适合任务结束时一次性回收使用xargs -r避免空输入时报错无会话时不执行任何 kill。与 PicoClaw 技能系统的结合本技能以workspace/skills/tmux/SKILL.md的形式随仓库分发。当 PicoClaw 运行时pkg/skills/loader.go 会按 workspace → global → builtin 的顺序扫描技能目录读取 frontmatter 的name与description并注入 Agent 上下文见BuildSkillsSummary生成的skills清单。这意味着技能被加载后Agent 能看到本技能的全部命令规范与脚本路径从而按规范远程操控 tmux技能内引用的{baseDir}/scripts/...对应仓库内 workspace/skills/tmux/scripts/find-sessions.sh 与 workspace/skills/tmux/scripts/wait-for-text.sh 两个可执行脚本二者均以#!/usr/bin/env bashset -euo pipefail编写可直接作为独立 CLI 使用。小结Agent 控制 tmux 的操作清单将本文要点收敛为一张速查清单判断场景需要交互式 TTY → 用 tmux长时非交互任务 → 用exec后台模式隔离 socket优先设置NANOBOT_TMUX_SOCKET_DIR默认路径为${TMPDIR:-/tmp}/nanobot-tmux-sockets/nanobot.sock启动tmux -S $SOCKET new -d -s name -n shell启动后打印监视命令注入输入默认send-keys -t target -l -- $cmd控制键用C-c等 tmux 按键名观察输出capture-pane -p -J -t target -S -200抓历史wait-for-text.sh等提示符并行编排每 Agent 一个会话 独立 worktree靠提示符❯/$轮询完成态清理单会话kill-session整站kill-server。这套规范既适合 PicoClaw Agent 在本地自主完成任务也能被人类随时attach接管是AI 与人工协作操控终端的实用落地模板。赞分享人工智能AI 应用AI Agent交互助手工具调用MCP ClientsAgent 记忆【免费下载链接】picoclawTiny, Fast, and Deployable anywhere — automate the mundane, unleash your creativity项目地址https://gitcode.com/gh_mirrors/pi/picoclaw点击查看免费下载相关推荐在 nanobot 中用 tmux Skill 远程操控交互式终端会话管理、安全输入与多 Agent 并行编排实战在 nanobot 中用 tmux Skill 远程操控交互式终端会话管理、安全输入与多 Agent 并行编排实战 导读 本篇文章基于 nanobot 内置的人工智能AI AgentAgent 框架多智能体工具调用MCP Clients交互助手后端任务调度Orca 并行编排 AI Coding Agent用 Git Worktree、终端与 CLI 管理一支 Agent 舰队Orca 并行编排 AI Coding Agent用 Git Worktree、终端与 CLI 管理一支 Agent 舰队 Orca 是一个面向并行开发pa人工智能AI 应用AI Agent代码智能体Agent 编排开发工具桌面应用OmX Team Skill 实战指南基于 tmux 的持久化多 Agent 团队编排OmX Team Skill 实战指南基于 tmux 的持久化多 Agent 团队编排 本文以 OmXOh My codeX仓库中的 Team Skill人工智能AI AgentAgent 编排Agent 工作流CLI开发工具AI 技能上一篇终极指南5分钟快速上手Citra 3DS模拟器免费重温经典游戏下一篇WeChatMsg实现微信聊天记录本地化存储与智能分析的技术方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表