- 人工智能
- AI Agent
- 多智能体
- Agent 编排
- 代码智能体
- CLI
【免费下载链接】openrig
Build your own network of agents from Claude Code, Codex and Pi: persistent teams with roles, shared context and owned work.
OpenRig 的rig terminal命令族可以把一个 rig、pod、mission、slice 或手工保存的视图,变成一组实时可交互的 agent 终端瓦片;瓦片渲染到哪一层,由 provider 决定——herdr 是默认且受证明门(proof-gated)约束的 provider,cmux 则是 best-effort 的备选 provider。本文以 openrig-cmux 技能文档 为主线,讲清 cmux 作为 provider 的地位、三个动词的完整用法、honest-partial 结果读取、只读与安全护栏,并结合 CLI 命令实现 与 cmux provider 适配器 给出源码级佐证,读完后可在不破坏 daemon 会话的前提下,把任意 OpenRig 视图安全地开到 cmux 里。
cmux 在 OpenRig 视图体系中的定位:best-effort provider
先建立一个核心心智模型:OpenRig 决定"哪些"agent 组成一个视图,provider 负责把像素渲染出来。同一套rig terminal表面、同一组 agent、同一套语义可以在 herdr 和 cmux 之间自由携带——视图是provider-agnostic的,一个保存的视图可以在任意一个 provider 中打开。
cmux 与 herdr 的地位差异是理解这个技能的关键:
- herdr 是默认 provider,且是 proof-gated 的;cmux 是 best-effort——它跑在同一个
rig terminal <provider>+ web-launcher 邻域上,但"cmux 没开出来"不构成一次 slice 失败。只有在明确想要 cmux 时才使用它;否则默认走 herdr(不带--provider的rig terminal open <view>)。 - 文档元数据中该技能标记为
stage: candidate,与 openrig-herdr 互为 sibling skill;cmux 技能本身也声明是 clean-room 撰写的,但 cmux 作为 OpenRig 自有的 shipped provider 集成,没有 herdr 那样的 AGPL arm's-length 约束——针对 herdr 的"绝不链接/内嵌/插件化"的 clean-room 护栏不适用于 cmux。
源码层面这个"best-effort"不是修辞。CmuxProviderAdapter 的文件头注释写明:cmux 在部分渲染时保持 best-effort / non-gating——某个 cmux 开不出来的页面会被诚实地降级(命名,绝不静默丢弃);而完全没有连接 cmux 表面时,返回诚实的拒绝(cmux_unavailable),与 herdr 的 socket 门和 rig-cmux 路由的 503 语义对齐。另一个值得注意的事实:cmux 表面永远是本地的(cmux 运行在操作者自己的机器上),所以 cmux 级别的降级会打上local这个 host 哨兵值。
命令表面:三个动词,--provider cmux
cmux 表面与 herdr 完全相同,就是rig terminal的三个动词加--provider cmux:
rig terminal open <view> --provider cmux [--json] # 把视图打开到 cmux(不带 flag 时默认 herdr) rig terminal views [--json] # 同一套视图库,provider-agnostic rig terminal status --provider cmux [--json] # cmux 的存活/健康状态<view>的解析规则与 herdr 完全一致,按序解析为以下五类之一:
| 视图形式 | 含义 |
|---|---|
| rig 名称 | 该 rig 内所有存活 agent,自动排版 |
pod:<rig>/<podNamespace> | rig 清单按 pod 过滤后的全部存活 agent |
mission:<id> | 正在该 mission 上工作的 agent(打开时从拓扑实时派生) |
slice:<id> | 正在该 slice 上工作的 agent(实时派生) |
| 保存视图名 | 用户手工定义的分组(见下文 Saved views) |
这一解析规则在 CLI 命令定义 的头部注释中得到印证:<view>在 daemon 端解析,open的结果是唯一共享的{ opened, absent, degraded }分区,在 CLI 侧与路由 JSON 中逐字节一致。
从 open 子命令的实现 还能看到一个与 cmux 直接相关的行为细节:--window(或省略--provider的默认路径)会请求在桌面打开新终端窗口,而显式传入 provider(herdr/cmux)时是复用其现有工作区、不打开新窗口;--window路径内部甚至明确禁止 cmux——terminal-window.ts 中有校验:"--window supports herdr or tmux. Use cmux without --window."。也就是说,cmux 的使用方式就是直接rig terminal open <view> --provider cmux,让 daemon 渲染进已经运行的 cmux 工作区。
诚实读取结果:opened / absent / degraded 三分区
这是整个技能最重要的行为契约。打开视图的结果是一个分区:每个 seat 恰好落入一个桶,且每个桶都被命名:
- opened—— 现在正作为瓦片显示的存活 agent;
- absent—— 视图内当前不存活的 seat:被命名并跳过,绝不静默丢弃。一个只打开了部分 seat 的视图是成功的(部分性被披露),退出码为0;只有没有任何瓦片打开的视图才退出非零;
- degraded—— 结构性无法铺瓦片的 agent,连同原因命名。v1 的典型情形:注册在 HTTP 通道上的 host 没有 ssh 路径,其瓦片无法组成——读取结果就是
"host <id> is http-registered; tiles need ssh",然后跳过而不是丢弃。
退出语义在 CLI 头注释中有逐字对应:"带命名的部分打开 = 带披露的成功 → exit 0;零瓦片打开 → 非零"。程序化消费时读--json输出按分区分支判断,退出码本身只能告诉你"打开了点什么(0)vs 什么都没打开(非零)"。
cmux 适配器忠实地执行同一契约:CmuxProviderAdapter.openView 会原样转发视图合成器(view composer)产出的absent/degraded分类,再叠加 cmux 自身的本地降级;如果视图一个可铺瓦片的页面都没有,则不产生任何 cmux 工作区副作用就返回。
从 openrig-herdr 原样继承的语义
cmux 文档明确声明:以下所有行为与 herdr 完全相同,细节见 openrig-herdr 技能:
- Honest-partial / honest-degrade—— opened / absent / degraded 各自命名;部分打开退出 0,零瓦片退出非零;http-registered host 的 agent 带原因降级,绝不静默消失。
- 只读策略—— rig 视图或
pod:视图是交互式的;mission:/slice:视图天生只读(read-only by construction);保存视图按成员逐个设置(readOnly)。只读瓦片是tmux attach -r(客户端readonly=1),按键输入在物理上无法送达 agent。 - 舰队安全护栏—— 瓦片是 daemon 拥有会话的一个视图(嵌套
tmux attach):绝不 move/join/kill/re-parent daemon 拥有的 pane;关闭一个瓦片只是 detach 一个客户端,会话本身不受影响;绝不在生产环境对运行中的 seat 现场翻转 tmux 选项(先在隔离环境证明)。 - 滚动与复制开箱即用—— 依赖 daemon 的终端默认值(启动时按会话设置的 scroll 选项 + tmux 服务器的剪贴板默认值);已经在跑的 seat 在下一次自然重启后拾取滚轮滚动。
- 限制如实声明—— 瓦片 chrome v1 只是一个普通标签;重复/多视图成员要求同尺寸 pane(不同尺寸的重复 pane 存在 tmux 多客户端的固有 resize 不匹配,这是文档化而非待修复的问题)。
cmux 适配器对"逐字节执行 paneCommand"的承诺在源码注释中同样明确:每个 pane 运行的是 composer 给出的paneCommand原样(包括只读的-r、ssh 包裹、引号保留),遵守 terminal-provider.ts 定义的 provider 契约;布局上一个网格页对应一个 cmux 工作区,通过自带的 CmuxLayoutService 的 split/grid 机制驱动,绝不一个 seat 开一个窗口。
cmux 特有行为
除继承语义外,cmux 有三条自己的注意点:
- 每 agent 的 open-or-focus—— cmux 自带的集成是"节点没开就开、已开就聚焦";当一个 seat 已经在 cmux 中铺好瓦片时,再次打开得到的是聚焦而非重复瓦片。这与 herdr 路径的复用逻辑(复用已有工作区/tab,且保留旧工作区内容)在效果上对应。
- shipped 的 "Launch in cmux" 入口被保留(字节兼容),并泛化进了 provider + view picker;从 web launcher 打开 cmux 仍然可用。对应的 rig 作用域路由见 rig-cmux.ts。
- 没有 AGPL arm's-length 顾虑—— 与 herdr 不同,cmux 是 OpenRig 自己的 shipped provider 集成,herdr 适用的 clean-room/绝不内嵌护栏不是 cmux 的约束(该技能文档本身仍是 clean-room 撰写的)。
另外,rig terminal status --provider cmux的健康读取最终落在 CmuxProviderAdapter.liveness:cmux 适配器不可用时返回alive: false并带 detail"cmux is not connected",配合--json可以程序化判断"best-effort 的 best-effort 到底在不在"。
Saved views:手工编写terminal-views.yaml,provider 无关
保存视图是手工编写在terminal-views.yaml中的(v1 没有 save/write 动词),并且是provider-agnostic的。用rig terminal open <id> --provider cmux即可在任何保存视图上重新打开 cmux。派生视图(rig、pod:<rig>/<pod>、mission:<id>、slice:<id>)是实时计算的,永不写入该文件。
文件本身存放在 OpenRig home 根目录下,原子写入(tmp + rename)、字节稳定。Schema(字段名与顺序必须严格一致,可选字段缺失时省略,绝不写null):
version: 1 views: - id: my-view-id # 必填 — `rig terminal open <id>` 接受的 id name: Human Name # 必填 members: - seat: pod-member@rig # 必填 — 规范化的会话名 label: agent . slice # 可选 — pane 标签 host: some-host-id # 可选 — 结构化 host id(绝不是 `member@rig@host` 字符串); # 本地省略。ssh 注册的 host 可铺瓦片; # http 注册的 host 诚实降级(命名 + 跳过,带原因) tmuxSession: sessname # 可选 — 默认取 `seat` readOnly: true # 可选 — 省略 = 交互;true = `tmux attach -r`一个按请求组装保存视图的 agent,写这份 YAML然后打开该 id:rig terminal open my-view-id(要 cmux 就加--provider cmux)。同一份视图库在 herdr 或 cmux 中都能打开。
本地 cmux 设置的读取与修正
CLI 侧还有一个与 cmux 相关的细节:cmux-config.ts 负责读取与修正~/.config/cmux/settings.json中的automation.socketControlMode。默认值是cmuxOnly(CMUX_DEFAULT_SOCKET_CONTROL_MODE);解析逻辑对 JSONC 容忍尾逗号与注释,解析失败时返回默认模式并附带格式化的解析错误;off与cmuxOnly被标记为与 socket 控制不兼容的模式(CMUX_INCOMPATIBLE_MODES),upsertCmuxSocketControlMode则以最小 diff 的方式(jsonc-parser 的 modify/applyEdits)把目标模式写回去,保证已有配置不被无谓重排。如果你在排查"cmux 连不上 / status 报 not connected"时,这一层本地设置的兼容性是第一个值得核对的点。
实践要点速查
- 默认不加
--provider走 herdr;只在明确需要 cmux 时才--provider cmux,且 cmux 路径不与--window组合。 - 部分打开是成功:退出码 0 + JSON 中的
absent/degraded命名分区才是完整信息;零瓦片才非零。 mission:/slice:视图天生只读,这是构造而非约定;保存视图的只读粒度是 per-member。- 瓦片是 daemon 会话的嵌套 attach 视图:只 detach、不动 pane、不现场翻转运行中 seat 的 tmux 选项。
- 保存视图手工写
terminal-views.yaml,字段名与顺序严格照 schema;派生视图永不落盘。 - cmux 表面永远本地:cmux 级降级的 host 字段是
local哨兵;cmux 未连接时得到的是诚实拒绝(cmux_unavailable语义)而非静默失败。
以上行为均可在仓库中逐一核对:命令面与退出语义见 terminal.ts,窗口/provider 校验见 terminal-window.ts,cmux 渲染契约见 cmux-provider-adapter.ts,完整视图模型与 schema 细节见 openrig-herdr/SKILL.md。
- 人工智能
- AI Agent
- 多智能体
- Agent 编排
- 代码智能体
- CLI
【免费下载链接】openrig
Build your own network of agents from Claude Code, Codex and Pi: persistent teams with roles, shared context and owned work.
相关推荐
openrig-cmux 实战指南:用 `rig terminal --provider cmux` 把 Rig、Pod、Mission、Slice 铺成可交互 Agent 瓦片
openrig cmux 实战指南:用 rig terminal provider cmux 把 Rig、Pod、Mission、Slice 铺成可交互 Age
人工智能AI Agent多智能体Agent 编排代码智能体CLIOpenRig 启动快乐路径指南:从 Explorer 打开 demo rig 到一键拉起 orch1.lead 的 CMUX 终端
OpenRig 启动快乐路径指南:从 Explorer 打开 demo rig 到一键拉起 orch1.lead 的 CMUX 终端 本篇指南围绕 OpenRi
人工智能AI Agent多智能体Agent 编排代码智能体CLIOpenRig herdr 终端墙实战:用 `rig terminal` 把 Rig / Mission / Slice 变成实时交互式 Agent 磁贴
OpenRig herdr 终端墙实战:用 rig terminal 把 Rig / Mission / Slice 变成实时交互式 Agent 磁贴 导读 本
人工智能AI Agent多智能体Agent 编排代码智能体CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考