English | 简体中文
Important
已归档,不再维护。
维护成本一直不值得。本地代理编排器必须跟上它所驱动的每一个 agent CLI,而这些 CLI 一直在变:命令行参数、认证方式、输出格式、会话语义。跟上这些变化的成本, 远超编排本身带来的价值。
这部分工作现在以 oh-my-pi(pi / omp)
插件的形式存在。它本身已经管理了 agent 的生命周期、工具接口和会话模型。为一个
有人维护的框架写插件,比自己维护一个框架轻松得多。
代码保留供参考。此后的 Rust 重写版本在 v4-final 标签。
Choir 是一个用 MoonBit 编写的本地代理编排器。一个昂贵的模型担任团队负责人(TL,Claude);更便宜的代理作为叶子(leaf)运行(默认 Codex,也可选 Gemini、Moon Pilot 或 Cursor)。每个叶子在自己的 git worktree 中工作,并向 TL 的分支提交 PR。内置的 poller 自动处理 Copilot review,把 GitHub review 和 CI 反馈路由到对应面板,并在 PR 获批时通知 TL。核心循环是 scaffold、fork、converge:TL 提交共享类型,派生一波并行叶子,逐个合并已批准的 PR,然后再派生下一波或向上提交自己的 PR。
flowchart TD
init(["choir init"]) --> srv["Server:常驻 UDS 守护进程"]
srv --> tl{{"TL:Claude(团队负责人)"}}
tl -. "可选,多波次" .-> spec["/crystallize 然后 /decompose<br/>feature/<slug> 分支"]
spec -.-> tl
tl -->|"1. scaffold 提交(共享类型)"| fork["fork_wave"]
fork --> la["叶子 A:独立 git worktree"]
fork --> lb["叶子 B:独立 git worktree"]
la -->|"file_pr"| pr["PR 到父分支"]
lb -->|"file_pr"| pr
pr <--> gh[("GitHub:review / CI")]
subgraph optional["可选:Copilot 自动 review"]
copilot["Copilot review"]
end
gh <-.-> copilot
gh --> poller["Poller"]
poller -->|"review / CI 反馈到对应面板"| la
poller -->|"review / CI 反馈到对应面板"| lb
poller -->|"已批准 + 快照"| tl
tl ==>|"逐个合并已批准的 PR"| converge{{"converge(收敛)"}}
converge -->|"WaveComplete:下一波"| fork
converge -->|"完成"| up["向上提交自己的 PR"]
tl -. "fork_wave role=tl" .-> subtl[["子 TL:相同循环"]]
subtl -->|"PR 到 TL 分支"| tl
style optional stroke-dasharray: 5 5
# 前置依赖:git、gh、zellij 0.44+、bd(Beads),以及你要用的代理 CLI
# (claude、codex、gemini、moon、agent)。Nix dev shell 提供开源依赖。
moon build --target native --release # 构建
choir init # 拉起服务端 + TL 会话choir claude [--lean] # 在运行中的服务端上重启 TL 面板(--lean:不加默认系统提示)
choir init --recreate # 重启服务端 + TL,保留恢复状态
choir stop [--purge] # 关闭(--purge 同时删除 worktree + 状态)MIT 许可证。架构参考了 exomonad。