omnilane 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,317 @@
1
+ <div align="center">
2
+
3
+ # omnilane
4
+
5
+ ### 一张路由表,四个执行框架通用。
6
+
7
+ *让主循环不再猜要用哪个模型。*<br/>
8
+ 每个子任务都派给真正最擅长它的模型——横跨<br/>
9
+ **Claude Code · Codex · Grok Build · Antigravity**,直接用你已经在付的订阅。
10
+
11
+ <img src="docs/hero.zh-CN.png" alt="omnilane 把每个子任务派给 Claude Code、Codex、Grok、Antigravity 中最擅长的模型" width="820"/>
12
+
13
+ [![ci](https://github.com/Seraphim0916/omnilane/actions/workflows/ci.yml/badge.svg)](https://github.com/Seraphim0916/omnilane/actions/workflows/ci.yml)
14
+ [![license](https://img.shields.io/github/license/Seraphim0916/omnilane)](LICENSE)
15
+ [![version](https://img.shields.io/github/v/tag/Seraphim0916/omnilane?label=version)](https://github.com/Seraphim0916/omnilane/tags)
16
+
17
+ [English](README.md) · [繁體中文](README.zh-TW.md) · **简体中文** · [日本語](README.ja.md) · [한국어](README.ko.md)
18
+
19
+ </div>
20
+
21
+ ---
22
+
23
+ ## v0.7.0 新功能
24
+
25
+ - **先预览再派工** — `--dry-run` 打印完整解析后的派工计划(vendor、模型、
26
+ 模式、超时、副作用判定),不调用模型、不创建作业状态。
27
+ - **版本化 JSON 自动化** — `--list`/`--explain`/`--validate` 与
28
+ `jobs list|status|result|stats` 都提供 `--json` 信封;另有只读 `jobs wait`、
29
+ `jobs audit`,以及带可复现 manifest 的离线 `omnilane release-audit` 发布审计。
30
+ - **本地作业一条龙** — `jobs tail` 查看实时输出、`jobs retry` 以 fail-closed
31
+ 方式重派已完成作业、`prune --older-than` 按时间清理,`--help` 覆盖所有命令。
32
+ - **安装与补全更安全** — `install.sh --check`/`--dry-run` 只读报告漂移,
33
+ `omnilane completion bash|zsh` 提供安全的 tab 补全,并修复五个 macOS 自带
34
+ Bash 3.2 崩溃。
35
+
36
+ ## v0.6.0 新功能
37
+
38
+ - **离线理解并验证路由** — 使用 `--explain` 查看每个备用候选,或使用
39
+ `--validate` 检查完整生效路由表;都不会调用模型或创建作业状态。
40
+ - **用机器可读数据观察本地状态** — `jobs.sh stats` 提供有界统计,
41
+ `omnilane doctor --json` 提供健康检查,同时不会泄漏任务或结果正文。
42
+ - **在 Live Board 比较两条作业** — 将一条已加载作业固定为仅存在于内存中的
43
+ 参考快照,并排比较模型路径与公开结果。
44
+ - **让锁恢复更安静** — 所有者文件在检查与读取之间消失时,不再泄漏容易误判的
45
+ 缺失文件诊断,同时保持 fail-closed。
46
+
47
+ ## v0.5.1 新功能
48
+
49
+ - **在非 Git 目录使用 Codex work** — 普通文件夹仍完整支持;Omnilane 不要求,
50
+ 也绝不会自动执行 `git init`。
51
+ - **干净停止非 Git 卡死** — 未设置整体上限时,解析后的单次看门狗会自动成为
52
+ 进程组保险丝,同时保留手动 timeout 的优先级和退出码语义。
53
+ - **让版本显示可信** — `VERSION` 现在统一提供给 `omnilane --version` 和两份
54
+ plugin manifest,CI 会检查变更记录和五种语言 README 是否一致。
55
+
56
+ ## ⚡ 60 秒上手
57
+
58
+ ```bash
59
+ git clone https://github.com/Seraphim0916/omnilane && cd omnilane
60
+ ./install.sh # 检测你的 CLI、接好技能、说你的语言
61
+ omnilane route hardest-coding "修掉间歇失败的 auth token 刷新测试"
62
+ omnilane ui start # 可选:在浏览器实时查看派发
63
+ ```
64
+
65
+ ## 🧭 工作原理
66
+
67
+ omnilane 让**任何**一个 agentic CLI 的主循环把子任务分类到通道(lane),
68
+ 再以无头方式把每条通道派发给该项工作最强的厂商 CLI,直接沿用你已有的订阅登录:
69
+
70
+ ```mermaid
71
+ flowchart LR
72
+ M["主循环<br/><i>你在用的任一 CLI</i>"] --> T{{"routing.yaml<br/>一张共用路由表"}}
73
+ T -->|hardest-coding| C1["Codex — GPT-5.6 Sol"]
74
+ T -->|bulk-mechanical| C2["Codex — GPT-5.6 Terra"]
75
+ T -->|taste-final| C3["Claude — Opus 4.8"]
76
+ T -->|long-context| C4["Gemini — 3.1 Pro"]
77
+ T -->|live-search| C5["Grok — 4.5"]
78
+ T -->|"arbitrate(可选)"| C6["vote — 1-4 模型评审团"]
79
+ ```
80
+
81
+ - **`routing.yaml`** — 通道 → 厂商+模型+推理档位。一个文件,四个执行框架共用。
82
+ - **候选链** — 一条通道可以列多个候选(`codex … | claude … | off`),
83
+ 派发时自动采用本机**实际安装了**的第一个厂商 CLI。只订一、两家也能用同一张表。
84
+ - **`scripts/dispatch.sh [--vendor V] <通道> "<任务>"`** — 查表后以无头方式
85
+ 调用对应厂商的 CLI。`--vendor` 会锁定指定厂商,不做降级。
86
+ - **`skills/omnilane/SKILL.md`** — 一份技能四个框架都能加载:
87
+ 先认出自己是哪个模型,自己通道的活自己干,其余派出去。
88
+
89
+ <div align="center">
90
+
91
+ | | | |
92
+ |:---:|:---:|:---:|
93
+ | 🧭 **一张表**<br/>四个执行框架共用 | 🪂 **候选链**<br/>自动降级到你装了的 CLI | 🗳️ **意见评审团**<br/>重大决定多模型投票 |
94
+ | 🔒 **安全机制**<br/>排队锁 · 看门狗 · 禁嵌套 | 🌏 **五种语言**<br/>安装器说你的母语 | ↩️ **完全可逆**<br/>`--uninstall` 一键还原 |
95
+
96
+ </div>
97
+
98
+ ## 🛤️ 通道一览(默认值;实际生效值运行 `scripts/dispatch.sh --list` 查看)
99
+
100
+ | 通道 | 首选模型 | 备选模型 | 用途 |
101
+ |---|---|---|---|
102
+ | 🔥 hardest-coding | GPT-5.6 Sol (xhigh) | Claude Opus 4.8 (high) | 最难的实现、深度调试、正确性攸关的修改 |
103
+ | 🏗️ bulk-mechanical | GPT-5.6 Terra (max) | Claude Sonnet 5 (high) | 重构、迁移、测试、大面积扫描——机械耐力活 |
104
+ | 🧹 triage | GPT-5.6 Luna (medium) | Gemini 3.5 Flash (Low) | 高量初筛、第一轮过滤 |
105
+ | ⚖️ hard-judgment | GPT-5.6 Sol (max) | Claude Opus 4.8 (high) | 架构仲裁、深度推理、第二意见 |
106
+ | ✒️ taste-final | Claude Opus 4.8 (high) | GPT-5.6 Sol (max) | 对外文字、prompt 与文档打磨、风格终审 |
107
+ | 💬 consult | 明确指定的厂商/模型 | —(不降级) | 自然语言直接咨询;必须保留 `--vendor` |
108
+ | 🎨 ui-draft | GPT-5.6 Sol (xhigh) | Claude Opus 4.8 (high) | 有设计规范/参考图时的 UI 出稿;开放式视觉品味交给 taste-final |
109
+ | 📚 long-context | Gemini 3.1 Pro (High) | Claude Opus 4.8 (high) | 百万 token 长文整合——仅限分析,不派 agentic 长链 |
110
+ | ⚡ fast-agentic | Gemini 3.5 Flash (High) | GPT-5.6 Luna (high) | 快速多步骤 agentic 循环、多模态检查 |
111
+ | 📡 live-search | Grok 4.5 | —(off) | 实时 X/网络搜索与社群脉络 |
112
+ | 🚰 coding-overflow | Grok 4.5 | —(off) | Codex 额度吃紧时的中量级编码溢流道;事实性声明须另行查证 |
113
+ | 🗳️ arbitrate | off(可选评审团) | — | 内置意见评审团,重大决定用——默认关闭,要用在 `routing.local.yaml` 打开;每评审每轮烧一次额度 |
114
+
115
+ **备选模型**是候选链的下一位——首选那家的厂商 CLI 没装时,派发就降到它。
116
+
117
+ > **Claude Fable 5 去哪了?** 默认表刻意不放:Claude 顶级档通常就是*主循环本人*,
118
+ > 不是被派发的工人,且定价高于 Opus。设置菜单的模型清单里有它——
119
+ > 不同意就自己路由过去(例如在 `routing.local.yaml` 写
120
+ > `taste-final: claude claude-fable-5 high`)。
121
+
122
+ ### 自然语言咨询
123
+
124
+ 通过 `omnilane` 技能或 `/route`,你可以直接说: **“请 Opus 挑战这个架构。”**
125
+ 自然语言由 Agent Skill 判断,不是在 `dispatch.sh` 里做自由文本 shell 解析。
126
+
127
+ - 只问“哪个模型适合”时,回答匹配通道当前第一个可用模型,不发出模型调用。
128
+ - 只指定厂商名时,使用该厂商在 `consult` 通道中配置的候选模型。
129
+ - 指定标准模型别名(例如 Opus)时,会锁定技能表中的确切模型家族。明确目标
130
+ 不存在或 CLI 不可用时会清楚失败,不会暗中更换厂商或模型家族。
131
+
132
+ <details>
133
+ <summary><b>👉 哪些通道你自己跑?选你的主控模型</b></summary>
134
+
135
+ <br/>
136
+
137
+ 上面那张表跟厂商无关——一条通道的*最佳*模型不会因为谁在主控而改变。会变的是
138
+ 你哪些通道**自己做**(你本来就是那个模型,省一次调用)、哪些**派出去**。你 CLI 里
139
+ 的 `omnilane` 技能会自动套对的那一行,这里是给人看的版本。
140
+
141
+ - **Claude Code · Fable 5** — 自己做:hard-judgment、taste-final、最吃正确性的硬修。派出去:机械编码量 → Codex、长文 → Gemini、实时搜索 → Grok。
142
+ - **Claude Code · Opus 4.8** — 自己做:taste-final。hard-judgment 派给 Codex Sol(智力分高于 Opus)、所有编码走 Codex 通道、长文 → Gemini、实时搜索 → Grok。
143
+ - **Codex · Sol** — 自己做:hardest-coding、hard-judgment、ui-draft。派出去:taste-final → Claude、长文 → Gemini、实时搜索 → Grok、粗活 → Codex Terra。
144
+ - **Codex · Terra** — 自己做:bulk-mechanical。真正最硬的往上升给 Sol;taste → Claude、长文 → Gemini、实时搜索 → Grok。
145
+ - **Grok Build · Grok 4.5** — 自己做:live-search、coding-overflow(中量级编码)。所有硬活派给 Codex/Claude/Gemini——先验每个 API 签名与引用事实。
146
+ - **Antigravity · Gemini** — 自己做:long-context(3.1 Pro)、fast-agentic(Flash)。编码/判断/文字派给 Codex/Claude;实时搜索 → Grok。3.1 Pro 绝不接 agentic 工具长链。
147
+
148
+ </details>
149
+
150
+ ## 🖥️ Live Board
151
+
152
+ 每一次派发——无论前台还是 `--background`——都是落盘的一条 job。Live Board
153
+ 是架在这个 job 存储之上、可选且只读的本地工作台:每个模型被问了什么、答了
154
+ 什么、怎么路由、是否还在运行,一眼看完。
155
+
156
+ <div align="center">
157
+
158
+ <img src="docs/live-board.png" alt="Omnilane Live Board 桌面版——左侧为作业列表,右侧为选定作业的任务、公开结果与模型路径" width="820"/>
159
+
160
+ <img src="docs/live-board-mobile.png" alt="Omnilane Live Board 手机版——可搜索的作业列表与状态筛选" width="280"/>
161
+
162
+ </div>
163
+
164
+ ```bash
165
+ omnilane ui start # 启动或复用服务器,输出通过认证的网址
166
+ omnilane ui status # 查看本地服务器状态
167
+ omnilane ui url # 输出当前通过认证的网址
168
+ omnilane ui stop # 正常停止
169
+ ```
170
+
171
+ 桌面版的作业列表与详情区域可分别滚动;手机版使用列表/详情切换,支持返回键与
172
+ Esc。服务器发送事件(SSE)会实时更新,又不会重建当前聚焦的作业行;短暂断线时
173
+ 保留最后画面并自动重连。可将任意已加载作业固定为参考,再选择另一条作业,并排
174
+ 比较模型路径和公开结果;参考快照只留在浏览器内存中,关闭页面即消失。服务只绑定
175
+ `127.0.0.1`、使用随机令牌保护、全程只读。界面只显示 `task.txt` 和公开的
176
+ `out.txt`,不会显示工作端或厂商原始日志。
177
+
178
+ 核心路由不需要 Python;只有这个界面需要 Python 3.9 或更高版本。
179
+
180
+ ## 📦 安装
181
+
182
+ 前置需求:想路由到的厂商 CLI(`codex`、`claude`、`grok`、`agy`)已登录且在
183
+ `PATH` 上——**有几家装几家就好**,缺的通道会自动降级。
184
+
185
+ 最快:`./install.sh` — 自动检测本机的 CLI、接好技能、列出其余的插件安装命令、
186
+ 打印这台机器的生效路由表,最后询问是否进入交互设置菜单(`--uninstall` 可逆)。
187
+ 安装界面依系统语言自动切换(英/繁中/简中/日/韩,可用 `OMNILANE_LANG=zh-CN`
188
+ 强制)。另提供可选的各 CLI **常驻路由提示**:在各 CLI 指令文件末尾加一段带
189
+ 标记、可逆的区块(`~/.claude/CLAUDE.md`、`~/.codex/AGENTS.md`、
190
+ `~/.grok/Agents.md`、`~/.gemini/GEMINI.md`——路径可能随 CLI 版本不同);
191
+ 非交互安装可带 `OMNILANE_HOOKS=all|none|claude,codex`。手动接线:
192
+
193
+ `./install.sh --check` 可只读检查漂移;安装或 `--uninstall` 加上
194
+ `--dry-run`,可先预览每个由这份 checkout 拥有的文件动作。
195
+ 要回滚安装器拥有的链接与标记提示,执行 `./install.sh --uninstall`。
196
+
197
+ - **Claude Code**:以插件安装(附 `/route`、`/route-jobs` 命令),
198
+ 或把 `skills/omnilane` 放进 `~/.claude/skills/`。
199
+ - **Codex**:把 `skills/omnilane` 放进或链接到 `~/.codex/skills/`。
200
+ - **Grok Build**:`grok plugin install <本仓库路径> --trust`
201
+ - **Antigravity**:`agy plugin install <本仓库路径>`(先用
202
+ `agy plugin validate` 检查)
203
+
204
+ ## ⚙️ 自定义设置
205
+
206
+ 三层,全部可选:
207
+
208
+ 1. **交互菜单** — `scripts/configure.sh` 列出可配置的通道,让你逐条选
209
+ 厂商 → 模型 → 推理档位(有建议清单,也可自由输入未来的新模型名),
210
+ 写进 `~/.omnilane/routing.local.yaml`。多厂商 `consult` 会被刻意跳过,
211
+ 如需修改请手动编辑。`install.sh` 装完会主动询问。
212
+ 2. **`~/.omnilane/routing.local.yaml`** — 手改覆盖文件,格式同 `routing.yaml`,
213
+ 本机优先。参考 `routing.local.yaml.example`。
214
+ 3. **`~/.omnilane/local.sh`** — 机器专属的可执行文件路径、代理、认证包装;
215
+ 每个执行器都会加载,永不进版本控制。参考 `local.sh.example`。
216
+
217
+ 随时检查结果:
218
+
219
+ ```
220
+ scripts/dispatch.sh --list # 生效表,标出候选链降级与关闭的通道
221
+ ```
222
+
223
+ ## 📖 命令参考
224
+
225
+ ```
226
+ eval "$(omnilane completion bash)" # 在当前 Bash 启用补全
227
+ source <(omnilane completion zsh) # 在当前 Zsh 启用补全
228
+ omnilane release-audit [--target 版本] [--json] # 离线、只读的发布闸门
229
+ omnilane ui start # 启动或复用本地 Live UI,输出链接
230
+ omnilane ui status # 查看 Live UI 是否正在运行
231
+ omnilane ui url # 输出当前通过认证的本地链接
232
+ omnilane ui stop # 停止 Live UI
233
+ omnilane doctor [--json] # 只读检查路由与本地运行环境
234
+ dispatch.sh [--background] [--dry-run] [--mode advise|work] [--workdir 目录]
235
+ [--vendor V] [--model M] [--effort E] [--timeout SEC] [--job-timeout SEC]
236
+ 通道 "任务" # "-" 表示从 stdin 读任务
237
+ dispatch.sh [--json] --list [--json]
238
+ dispatch.sh [--json] --explain 通道 [--json] # 离线逐候选解释路由决策
239
+ dispatch.sh [--json] --validate [--json] # 离线检查生效路由,不调用模型
240
+ jobs.sh [--json] {list | status 作业ID | result 作业ID} # JSON 结果只回元数据,不回正文
241
+ jobs.sh wait 作业ID [--timeout N] # 作业退出码;124 超时;125 工作进程消失
242
+ jobs.sh [--json] stats [--last N] # 本机成功率与路由汇总
243
+ jobs.sh audit [--last N] [--json] # 只读检查作业完整性与隐私
244
+ jobs.sh prune [--keep N] [--apply] # 默认仅预览;只清理已完成作业
245
+ configure.sh # 交互通道菜单
246
+ ```
247
+
248
+ 退出码:`2` 用法错误(包括厂商值无效,或指定厂商不在该通道)、`3` 通道已关闭、
249
+ `4` 候选链没有可用 CLI,或指定厂商已配置但其 CLI 不可用、
250
+ `5` 第一轮成功评审太少、`6` 第二轮没有任何反驳成功、`86` 拒绝嵌套派发、
251
+ `87` 等锁超时、`124` 整体任务超时;
252
+ 其余直接透传工作端自己的退出码。
253
+
254
+ ## 🎭 模式
255
+
256
+ - **advise(默认)** — 只读工作端。Codex 跑只读沙箱;Claude 只给
257
+ Read/Glob/Grep;Grok 跑 plan 模式。适合审查、提问、第二意见。
258
+ - **work** — 允许改文件,仅限你指定的 `--workdir`。Codex 给
259
+ workspace-write 沙箱;Claude 自动接受编辑;Gemini 跑 accept-edits 模式。
260
+
261
+ ## 🔒 内置安全机制
262
+
263
+ - **禁止嵌套派发** — 工作端不得再往外派(`OMNILANE_DEPTH` 守卫,退出码 86),
264
+ 杜绝 AI 叫 AI 的额度连环烧。
265
+ - **Codex 排队锁** — 同一目标目录的 codex 派发自动串行化(锁以规范化后的
266
+ workdir 为键);崩溃残留的锁以所有者 PID 检测后安全接管。
267
+ - **看门狗** — 每个工作端跑在 `timeout`/`gtimeout` 之下,两者皆无时退到
268
+ perl-alarm 后备(原生 macOS 就是这种情况),卡死的 CLI 不会挂一整晚。
269
+ 上限作用于**每次 CLI 调用**,优先级从高到低:`--timeout SECONDS` > 单通道
270
+ `OMNILANE_TIMEOUT_<LANE>`(通道名大写、`-` 换成 `_`,如
271
+ `OMNILANE_TIMEOUT_HARD_JUDGMENT`) > 全局 `OMNILANE_TIMEOUT`(默认 600 秒)。
272
+ 它是单次调用的防卡死看门狗,不是整个任务的时间预算:会重试的 vendor(grok)
273
+ 或 vote 面板(评审 × 轮次)会发起多次调用,总耗时可能是该值的数倍。
274
+ - **整体任务保险丝** — 可选的 `--job-timeout SECONDS` 用同一个进程组监工,
275
+ 一次覆盖等锁、重试、所有评审和轮次。优先级为参数 >
276
+ `OMNILANE_JOB_TIMEOUT_<LANE>` > `OMNILANE_JOB_TIMEOUT` > 关闭;唯一的自动例外
277
+ 是 Codex 在 Git worktree 外执行 `work` 时,若未设置整体上限,就沿用解析后的
278
+ 单次调用看门狗作为整体保险丝,上限为监工支持的 999999999 秒。到期会清理
279
+ 受监工的进程组并返回 124。这个自动保险丝需要内置的 Perl 监工;若环境
280
+ 无法使用,派发会警告但仍通过原有单次调用看门狗路径执行非 Git 工作;若连
281
+ 单次看门狗工具都没有,该路径会另外警告。
282
+ 完整深度代码审查建议从 2–4 小时
283
+ (7200–14400 秒)起步,单次调用看门狗可先设 30 分钟;这些只是建议值,
284
+ 不会写死为默认值。
285
+ - **后台作业生命周期** — `--background` 的工作端跑在自己的 process group,
286
+ 调用端退出也不受影响;被杀会落盘退出码,`jobs.sh status` 会报 `dead`
287
+ 而不是永远显示 `running`。
288
+ - **任务载荷上限** — 过大的任务文本自动头尾截断,防止撑爆工作端上下文。
289
+
290
+ ## 📊 默认值与数据来源
291
+
292
+ 默认通道配置依据 Artificial Analysis 2026-07 快照(已对 AA 站上原始记录与
293
+ 各厂官方定价页交叉核对)加上公开对比评测;这些是意见不是定律——
294
+ 设置菜单和 `routing.local.yaml` 就是让你不同意用的。评审团(arbitrate)
295
+ 默认关闭;要用就在 `routing.local.yaml` 写
296
+ `arbitrate: vote codex,claude,grok -`(从四家里任选 1-4 个评审),
297
+ 或改用 `exec` 厂商指向你自己的多模型审查闸脚本。
298
+
299
+ ## ⚠️ 已知限制
300
+
301
+ - **Antigravity 的 print 模式工具调用在现行 CLI 版本不稳定**(可能被拒或
302
+ 返回无效参数)。long-context 通道的设计本来就是"把内容贴进任务"的长文
303
+ 整合,不受影响;要*读取仓库*的咨询请用 claude/codex 候选。
304
+ - **Grok 没有推理档位开关**;effort 字段仅为接口一致而保留,实际忽略。
305
+ - **非 Git 的 Codex work 仍受支持。** 部分 Codex CLI 版本可能在 Git worktree
306
+ 外卡住,因此上面的自动保险丝会限制这个场景并清理受监工的进程组。Omnilane
307
+ 不会自动执行 `git init`,也不要求用户创建仓库。
308
+
309
+ ## 🌱 状态
310
+
311
+ v0.5.1 让 Codex `work` 在非 Git 目录仍可使用,同时以进程组清理限制卡死,
312
+ 并同步所有公开版本来源。它延续 v0.5.0 对安装器、派发生命周期、作业存储、
313
+ 整体截止时间、诊断和发布 CI 的强化。Grok/Antigravity 命令壳行为仍可能随
314
+ CLI 版本变动。欢迎提交 issue 与 PR。
315
+
316
+ 项目文档:[贡献指南](CONTRIBUTING.md) · [安全政策](SECURITY.md) ·
317
+ [变更记录](CHANGELOG.md)
@@ -0,0 +1,327 @@
1
+ <div align="center">
2
+
3
+ # omnilane
4
+
5
+ ### 一張路由表,四個執行框架通用。
6
+
7
+ *讓主迴圈不再猜要用哪個模型。*<br/>
8
+ 每個子任務都派給真正最擅長它的模型——橫跨<br/>
9
+ **Claude Code · Codex · Grok Build · Antigravity**,直接用你已經在付的訂閱。
10
+
11
+ <img src="docs/hero.zh-TW.png" alt="omnilane 把每個子任務派給 Claude Code、Codex、Grok、Antigravity 中最擅長的模型" width="820"/>
12
+
13
+ [![ci](https://github.com/Seraphim0916/omnilane/actions/workflows/ci.yml/badge.svg)](https://github.com/Seraphim0916/omnilane/actions/workflows/ci.yml)
14
+ [![license](https://img.shields.io/github/license/Seraphim0916/omnilane)](LICENSE)
15
+ [![version](https://img.shields.io/github/v/tag/Seraphim0916/omnilane?label=version)](https://github.com/Seraphim0916/omnilane/tags)
16
+
17
+ [English](README.md) · **繁體中文** · [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [한국어](README.ko.md)
18
+
19
+ </div>
20
+
21
+ ---
22
+
23
+ ## v0.7.0 新功能
24
+
25
+ - **先預覽再派工** — `--dry-run` 印出完整解析後的派工計畫(vendor、模型、
26
+ 模式、逾時、副作用判定),不呼叫模型、不建立工作狀態。
27
+ - **版本化 JSON 自動化** — `--list`/`--explain`/`--validate` 與
28
+ `jobs list|status|result|stats` 都有 `--json` 信封;另有唯讀 `jobs wait`、
29
+ `jobs audit`,以及帶可重現 manifest 的離線 `omnilane release-audit` 發佈稽核。
30
+ - **本機工作一條龍** — `jobs tail` 窺看即時輸出、`jobs retry` 以 fail-closed
31
+ 方式重派已完成工作、`prune --older-than` 依時間清理,`--help` 覆蓋所有指令。
32
+ - **安裝與補全更安全** — `install.sh --check`/`--dry-run` 唯讀回報漂移,
33
+ `omnilane completion bash|zsh` 提供安全的 tab 補全,並修復五個 macOS 原生
34
+ Bash 3.2 崩潰。
35
+
36
+ ## v0.6.0 新功能
37
+
38
+ - **離線看懂並驗證路由** — 用 `--explain` 查看每個備援候選,或用
39
+ `--validate` 檢查完整生效路由表;都不會呼叫模型或建立工作狀態。
40
+ - **用機器可讀資料觀察本機狀態** — `jobs.sh stats` 提供有界統計,
41
+ `omnilane doctor --json` 提供健康檢查,又不會洩漏任務或結果正文。
42
+ - **在 Live Board 比較兩筆工作** — 把一筆已載入工作釘成只存在記憶體的
43
+ 參考快照,並排比較模型路徑與公開結果。
44
+ - **讓鎖恢復更安靜** — 擁有者檔案在檢查與讀取間消失時,不再洩漏容易誤判的
45
+ 缺檔診斷,同時維持 fail-closed。
46
+
47
+ ## v0.5.1 新功能
48
+
49
+ - **在非 Git 目錄使用 Codex work** — 一般資料夾仍完整支援;Omnilane 不要求、
50
+ 也絕不會自動執行 `git init`。
51
+ - **乾淨停止非 Git 卡死** — 未設定整體上限時,解析後的單次看門狗會自動成為
52
+ 程序群組保險絲,同時保留手動 timeout 的優先序與退出碼語意。
53
+ - **讓版本顯示可信** — `VERSION` 現在統一供應 `omnilane --version` 與兩份
54
+ plugin manifest,CI 會檢查變更紀錄和五語 README 是否一致。
55
+
56
+ ## ⚡ 60 秒上手
57
+
58
+ ```bash
59
+ git clone https://github.com/Seraphim0916/omnilane && cd omnilane
60
+ ./install.sh # 偵測你的 CLI、接好技能、說你的語言
61
+ omnilane route hardest-coding "修掉會間歇失敗的 auth token 更新測試"
62
+ omnilane ui start # 選配:在瀏覽器即時看派工
63
+ ```
64
+
65
+ ## 🧭 運作方式
66
+
67
+ omnilane 讓**任何**一個 agentic CLI 的主迴圈把子任務分類到通道(lane),
68
+ 再以無頭方式把每條通道派工給該項工作最強的廠商 CLI,直接沿用你既有的訂閱登入:
69
+
70
+ ```mermaid
71
+ flowchart LR
72
+ M["主迴圈<br/><i>你在用的任一 CLI</i>"] --> T{{"routing.yaml<br/>一張共用路由表"}}
73
+ T -->|hardest-coding| C1["Codex — GPT-5.6 Sol"]
74
+ T -->|bulk-mechanical| C2["Codex — GPT-5.6 Terra"]
75
+ T -->|taste-final| C3["Claude — Opus 4.8"]
76
+ T -->|long-context| C4["Gemini — 3.1 Pro"]
77
+ T -->|live-search| C5["Grok — 4.5"]
78
+ T -->|"arbitrate(選配)"| C6["vote — 1-4 模型評審團"]
79
+ ```
80
+
81
+ - **`routing.yaml`** — 通道 → 廠商+模型+推理檔位。一個檔案,四個執行框架共用。
82
+ - **候選鏈** — 一條通道可以列多個候選(`codex … | claude … | off`),
83
+ 派工時自動採用本機**實際裝了**的第一個廠商 CLI。只訂一、兩家也能用同一張表。
84
+ - **`scripts/dispatch.sh [--vendor V] <通道> "<任務>"`** — 查表後以無頭方式
85
+ 呼叫對應廠商的 CLI。`--vendor` 會鎖定點名廠商,不做降級。
86
+ - **`skills/omnilane/SKILL.md`** — 一份技能四個框架都能載入:
87
+ 先認出自己是哪個模型,自己通道的活自己做,其餘派出去。
88
+
89
+ <div align="center">
90
+
91
+ | | | |
92
+ |:---:|:---:|:---:|
93
+ | 🧭 **一張表**<br/>四個執行框架共用 | 🪂 **候選鏈**<br/>自動降級到你有裝的 CLI | 🗳️ **意見評審團**<br/>重大決定多模型投票 |
94
+ | 🔒 **安全機制**<br/>排隊鎖 · 看門狗 · 禁巢狀 | 🌏 **五種語言**<br/>安裝器說你的母語 | ↩️ **完全可逆**<br/>`--uninstall` 一鍵還原 |
95
+
96
+ </div>
97
+
98
+ ## 🛤️ 通道一覽(預設值;實際生效值跑 `scripts/dispatch.sh --list` 看)
99
+
100
+ | 通道 | 首選模型 | 備選模型 | 用途 |
101
+ |---|---|---|---|
102
+ | 🔥 hardest-coding | GPT-5.6 Sol (xhigh) | Claude Opus 4.8 (high) | 最難的實作、深度除錯、正確性攸關的修改 |
103
+ | 🏗️ bulk-mechanical | GPT-5.6 Terra (max) | Claude Sonnet 5 (high) | 重構、搬遷、測試、大面積掃描——機械耐力活 |
104
+ | 🧹 triage | GPT-5.6 Luna (medium) | Gemini 3.5 Flash (Low) | 高量初篩、第一輪過濾 |
105
+ | ⚖️ hard-judgment | GPT-5.6 Sol (max) | Claude Opus 4.8 (high) | 架構仲裁、深度推理、第二意見 |
106
+ | ✒️ taste-final | Claude Opus 4.8 (high) | GPT-5.6 Sol (max) | 對外文字、prompt 與文件打磨、風格終審 |
107
+ | 💬 consult | 明確點名的廠商/模型 | —(不降級) | 自然語言直接諮詢;必須保留 `--vendor` |
108
+ | 🎨 ui-draft | GPT-5.6 Sol (xhigh) | Claude Opus 4.8 (high) | 有設計規範/參考圖時的 UI 出稿;開放式視覺品味交給 taste-final |
109
+ | 📚 long-context | Gemini 3.1 Pro (High) | Claude Opus 4.8 (high) | 百萬 token 長文整合——僅限分析,不派 agentic 長鏈 |
110
+ | ⚡ fast-agentic | Gemini 3.5 Flash (High) | GPT-5.6 Luna (high) | 快速多步驟 agentic 迴圈、多模態檢查 |
111
+ | 📡 live-search | Grok 4.5 | —(off) | 即時 X/網路搜尋與社群脈絡 |
112
+ | 🚰 coding-overflow | Grok 4.5 | —(off) | Codex 額度吃緊時的中量級編碼溢流道;事實性宣稱須另行查證 |
113
+ | 🗳️ arbitrate | off(選配評審團) | — | 內建意見評審團,重大決定用——預設關閉,要用在 `routing.local.yaml` 開;每評審每輪燒一次額度 |
114
+
115
+ **備選模型**是候選鏈的下一位——首選那家的廠商 CLI 沒裝時,派工就降到它。
116
+
117
+ > **Claude Fable 5 去哪了?** 預設表刻意不放:Claude 頂級檔通常就是*主迴圈本人*,
118
+ > 不是被派發的工人,而且定價高於 Opus。設定選單的模型清單有列它——
119
+ > 不同意就自己路由過去(例如在 `routing.local.yaml` 寫
120
+ > `taste-final: claude claude-fable-5 high`)。
121
+
122
+ ### 自然語言諮詢
123
+
124
+ 透過 `omnilane` 技能或 `/route`,你可以直接說: **「請 Opus 挑戰這個架構。」**
125
+ 自然語言是由 Agent Skill 判讀,不是在 `dispatch.sh` 裡做自由文字 shell 解析。
126
+
127
+ - 只問「哪個模型適合」時,回答相符通道目前第一個可用模型,不發出模型呼叫。
128
+ - 只點廠商名時,使用該廠商在 `consult` 通道裡設定的候選模型。
129
+ - 點標準模型別名(例如 Opus)時,會鎖定技能表裡的確切模型家族。明確目標
130
+ 不存在或 CLI 不可用時會清楚失敗,不會暗中換廠商或模型家族。
131
+
132
+ <details>
133
+ <summary><b>👉 哪些通道你自己跑?選你的主控模型</b></summary>
134
+
135
+ <br/>
136
+
137
+ 上面那張表跟廠商無關——一條通道的*最佳*模型不會因為誰在主控而改變。會變的是
138
+ 你哪些通道**自己做**(你本來就是那個模型,省一次呼叫)、哪些**派出去**。你 CLI 裡
139
+ 的 `omnilane` 技能會自動套對的那一列,這裡是給人看的版本。
140
+
141
+ - **Claude Code · Fable 5** — 自己做:hard-judgment、taste-final、最吃正確性的硬修。派出去:機械編碼量 → Codex、長文 → Gemini、即時搜尋 → Grok。
142
+ - **Claude Code · Opus 4.8** — 自己做:taste-final。hard-judgment 派給 Codex Sol(智力分高於 Opus)、所有編碼走 Codex 通道、長文 → Gemini、即時搜尋 → Grok。
143
+ - **Codex · Sol** — 自己做:hardest-coding、hard-judgment、ui-draft。派出去:taste-final → Claude、長文 → Gemini、即時搜尋 → Grok、粗活 → Codex Terra。
144
+ - **Codex · Terra** — 自己做:bulk-mechanical。真正最硬的往上升給 Sol;taste → Claude、長文 → Gemini、即時搜尋 → Grok。
145
+ - **Grok Build · Grok 4.5** — 自己做:live-search、coding-overflow(中量級編碼)。所有硬活派給 Codex/Claude/Gemini——先驗每個 API 簽章與引用事實。
146
+ - **Antigravity · Gemini** — 自己做:long-context(3.1 Pro)、fast-agentic(Flash)。編碼/判斷/文字派給 Codex/Claude;即時搜尋 → Grok。3.1 Pro 絕不接 agentic 工具長鏈。
147
+
148
+ </details>
149
+
150
+ ## 🖥️ Live Board
151
+
152
+ 每一次派工——不論前景或 `--background`——都是落盤的一筆 job。Live Board
153
+ 是架在這個 job 儲存上、選配且唯讀的本機工作台:每個模型被問了什麼、答了
154
+ 什麼、怎麼路由、是否還在執行,一眼看完。
155
+
156
+ <div align="center">
157
+
158
+ <img src="docs/live-board.png" alt="Omnilane Live Board 桌面版——左側為工作清單,右側為選定工作的任務、公開結果與模型路徑" width="820"/>
159
+
160
+ <img src="docs/live-board-mobile.png" alt="Omnilane Live Board 手機版——可搜尋的工作清單與狀態篩選" width="280"/>
161
+
162
+ </div>
163
+
164
+ ```bash
165
+ omnilane ui start # 啟動或沿用伺服器,印出通過驗證的網址
166
+ omnilane ui status # 查看本機伺服器狀態
167
+ omnilane ui url # 印出目前通過驗證的網址
168
+ omnilane ui stop # 正常停止
169
+ ```
170
+
171
+ 桌機版的工作清單與詳細內容可各自捲動;手機版使用清單/詳細內容切換,支援返回
172
+ 鍵與 Esc。伺服器傳送事件(SSE)會即時更新,又不會重建目前聚焦的工作列;短暫
173
+ 斷線時保留最後畫面並自動重連。可把任何已載入的工作釘成參考,再選另一筆工作,
174
+ 並排比較模型路徑與公開結果;參考快照只留在瀏覽器記憶體,關頁即消失。服務只綁
175
+ `127.0.0.1`、用隨機 token 保護、全程唯讀。畫面只顯示 `task.txt` 與公開的
176
+ `out.txt`,不顯示工作端或廠商原始 log。
177
+
178
+ 核心路由不需要 Python;只有這個介面需要 Python 3.9 以上。
179
+
180
+ ## 📦 安裝
181
+
182
+ 前置需求:想路由到的廠商 CLI(`codex`、`claude`、`grok`、`agy`)已登入且在
183
+ `PATH` 上——**有幾家裝幾家就好**,缺的通道會自動降級。
184
+
185
+ 最快:`./install.sh` — 自動偵測本機的 CLI、接好技能、列出其餘的外掛安裝指令、
186
+ 印出這台機器的生效路由表,最後問你要不要進入互動設定選單(`--uninstall` 可逆)。
187
+ 安裝介面依系統語言自動切換(英/繁中/簡中/日/韓,可用 `OMNILANE_LANG=zh-TW`
188
+ 強制)。另提供選配的各 CLI **常駐路由提示**:在各 CLI 指令檔尾端加一段有
189
+ 標記、可逆的區塊(`~/.claude/CLAUDE.md`、`~/.codex/AGENTS.md`、
190
+ `~/.grok/Agents.md`、`~/.gemini/GEMINI.md`——路徑可能隨 CLI 版本不同),
191
+ 讓主迴圈記得查路由表;非互動安裝可帶 `OMNILANE_HOOKS=all|none|claude,codex`。
192
+ `./install.sh --check` 可唯讀檢查漂移;安裝或 `--uninstall` 加上
193
+ `--dry-run`,可先預覽每個由這份 checkout 擁有的檔案動作。
194
+ 手動接線:
195
+
196
+ 要回滾安裝器擁有的連結與標記提示,執行 `./install.sh --uninstall`。
197
+
198
+ - **Claude Code**:以外掛安裝(附 `/route`、`/route-jobs` 指令),
199
+ 或把 `skills/omnilane` 放進 `~/.claude/skills/`。
200
+ - **Codex**:把 `skills/omnilane` 放進或連結到 `~/.codex/skills/`。
201
+ - **Grok Build**:`grok plugin install <本 repo 路徑> --trust`
202
+ - **Antigravity**:`agy plugin install <本 repo 路徑>`(先用
203
+ `agy plugin validate` 檢查)
204
+
205
+ ## ⚙️ 自訂設定
206
+
207
+ 三層,全部選用:
208
+
209
+ 1. **互動選單** — `scripts/configure.sh` 列出可設定的通道,讓你逐條選
210
+ 廠商 → 模型 → 推理檔位(有建議清單,也可自由輸入未來的新模型名),
211
+ 寫進 `~/.omnilane/routing.local.yaml`。多廠商 `consult` 會刻意略過,
212
+ 要改請手動編輯。`install.sh` 裝完會主動問要不要跑。
213
+ 2. **`~/.omnilane/routing.local.yaml`** — 手改覆寫檔,格式同 `routing.yaml`,
214
+ 本機優先。參考 `routing.local.yaml.example`。
215
+ 3. **`~/.omnilane/local.sh`** — 機器專屬的執行檔路徑、proxy、認證包裝;
216
+ 每個執行器都會載入,永不進版控。參考 `local.sh.example`。
217
+
218
+ 隨時檢查結果:
219
+
220
+ ```
221
+ scripts/dispatch.sh --list # 生效表,標出候選鏈降級與關閉的通道
222
+ ```
223
+
224
+ ## 📖 指令參考
225
+
226
+ ```
227
+ omnilane list | route … | jobs … | configure # 全域指令,任何目錄都能用
228
+ # (install.sh 會連結進 ~/.local/bin)
229
+ eval "$(omnilane completion bash)" # 在目前 Bash 啟用補全
230
+ source <(omnilane completion zsh) # 在目前 Zsh 啟用補全
231
+ omnilane ui start # 啟動或沿用本機 Live UI,印出網址
232
+ omnilane ui status # 查看 Live UI 是否運作中
233
+ omnilane ui url # 印出目前通過驗證的本機網址
234
+ omnilane ui stop # 停止 Live UI
235
+ omnilane doctor [--json] # 唯讀檢查路由與本機執行環境
236
+ dispatch.sh [--background] [--dry-run] [--mode advise|work] [--workdir 目錄]
237
+ [--vendor V] [--model M] [--effort E] [--timeout SEC] [--job-timeout SEC]
238
+ 通道 "任務" # "-" 表示從 stdin 讀任務
239
+ dispatch.sh [--json] --list [--json]
240
+ dispatch.sh [--json] --explain 通道 [--json] # 離線逐候選解釋路由決策
241
+ dispatch.sh [--json] --validate [--json] # 離線檢查生效路由,不呼叫模型
242
+ jobs.sh [--json] {list | status 工作ID | result 工作ID} # JSON 結果只回中繼資料,不回本文
243
+ jobs.sh wait 工作ID [--timeout N] # 工作結束碼;124 逾時;125 工作者消失
244
+ jobs.sh [--json] stats [--last N] # 本機成功率與路由彙整
245
+ jobs.sh audit [--last N] [--json] # 唯讀檢查工作完整性與隱私
246
+ jobs.sh prune [--keep N] [--apply] # 預設只預覽;只清理已完成工作
247
+ omnilane release-audit [--target 版本] [--json] # 離線、唯讀的發布閘門
248
+ configure.sh # 互動通道選單
249
+ ```
250
+
251
+ **重大決定可以開評審團,不是問一個人。**`arbitrate` 通道**預設關閉**——
252
+ 評審團每評審每輪燒一次額度,所以做成選配。要用就在 `routing.local.yaml`
253
+ 寫 `arbitrate: vote codex,claude,grok -`,或跑設定選單,從
254
+ codex/claude/grok/gemini 自選 1-4 個評審。開了之後,同一個問題丟給每個
255
+ 評審,意見並排回來,由發問的主控模型當主席下裁決。檔位欄填 `2` 開辯論輪
256
+ ——每個評審看完整個評審團的意見,只針對分歧互駁。進階使用者可用
257
+ `exec` 廠商換成自己的閘門:`arbitrate: exec /路徑/腳本 -`,腳本收
258
+ `MODE WORKDIR EFFORT PROMPT_FILE OUTPUT_FILE`、把裁決寫進 `OUTPUT_FILE`
259
+ (見 `scripts/runners/run-exec.sh`)。
260
+
261
+ 退出碼:`2` 用法錯誤(包含廠商值不合法,或指定廠商不在該通道)、`3` 通道已關閉、
262
+ `4` 候選鏈沒有可用 CLI,或指定廠商已設定但其 CLI 不可用、
263
+ `5` 第一輪成功評審太少、`6` 第二輪沒有任何反駁成功、`86` 拒絕巢狀派工、
264
+ `87` 等鎖逾時、`124` 整體任務逾時;
265
+ 其餘直接透傳工作端自己的退出碼。
266
+
267
+ ## 🎭 模式
268
+
269
+ - **advise(預設)** — 唯讀工作端。Codex 跑唯讀沙箱;Claude 只給
270
+ Read/Glob/Grep;Grok 跑 plan 模式。適合審查、提問、第二意見。
271
+ - **work** — 允許改檔案,僅限你指定的 `--workdir`。Codex 給
272
+ workspace-write 沙箱;Claude 自動接受編輯;Gemini 跑 accept-edits 模式。
273
+
274
+ ## 🔒 內建安全機制
275
+
276
+ - **禁止巢狀派工** — 工作端不得再往外派(`OMNILANE_DEPTH` 守衛,退出碼 86),
277
+ 杜絕 AI 叫 AI 的額度連環燒。
278
+ - **Codex 排隊鎖** — 同一目標目錄的 codex 派工自動序列化(鎖以正規化後的
279
+ workdir 為鍵);崩潰殘留的鎖以擁有者 PID 偵測後安全接管。
280
+ - **看門狗** — 每個工作端跑在 `timeout`/`gtimeout` 之下,兩者皆無時退到
281
+ perl-alarm 後備(原生 macOS 就是這情況),卡死的 CLI 不會掛整晚。
282
+ 上限作用於**每次 CLI 呼叫**,優先序由高到低:`--timeout SECONDS` > 單一通道
283
+ `OMNILANE_TIMEOUT_<LANE>`(通道名大寫、`-` 換成 `_`,如
284
+ `OMNILANE_TIMEOUT_HARD_JUDGMENT`) > 全域 `OMNILANE_TIMEOUT`(預設 600 秒)。
285
+ 它是單次呼叫的防卡死看門狗,不是整個任務的時間預算:會重試的 vendor(grok)
286
+ 或 vote 面板(評審 × 輪次)會發起多次呼叫,總耗時可能是該值的數倍。
287
+ - **整體任務保險絲** — 選配的 `--job-timeout SECONDS` 用同一個程序群組監工,
288
+ 一次涵蓋等鎖、重試、所有評審與輪次。優先序為旗標 >
289
+ `OMNILANE_JOB_TIMEOUT_<LANE>` > `OMNILANE_JOB_TIMEOUT` > 關閉;唯一的自動例外
290
+ 是 Codex 在 Git worktree 外執行 `work` 時,若未設定整體上限,就沿用解析後的
291
+ 單次呼叫看門狗作為整體保險絲,上限為監工支援的 999999999 秒。到期會清掉
292
+ 受監工的程序群組並回傳 124。這個自動保險絲需要內附的 Perl 監工;若環境
293
+ 無法使用,派工會警告但仍透過原有單次呼叫看門狗路徑執行非 Git 工作;若連
294
+ 單次看門狗工具都沒有,該路徑會另外警告。
295
+ 像 fubon-autotrade 規模的完整深度審查,建議先從
296
+ 2–4 小時(7200–14400 秒)起跳,單次呼叫看門狗可先設 30 分鐘;這只是建議值,
297
+ 不會寫死成預設。
298
+ - **背景工作生命週期** — `--background` 的工作端跑在自己的 process group,
299
+ 呼叫端退出也不受影響;被殺會落盤退出碼,`jobs.sh status` 會報 `dead`
300
+ 而不是永遠顯示 `running`。
301
+ - **任務酬載上限** — 過大的任務文字自動頭尾截斷,防止撐爆工作端脈絡。
302
+
303
+ ## 📊 預設值與資料來源
304
+
305
+ 預設通道配置依據 Artificial Analysis 2026-07 快照(已對 AA 站上原始紀錄與
306
+ 各廠官方定價頁交叉核對)加上公開對比評測;這些是意見不是定律——
307
+ 設定選單和 `routing.local.yaml` 就是讓你不同意用的。
308
+
309
+ ## ⚠️ 已知限制
310
+
311
+ - **Antigravity 的 print 模式工具呼叫在現行 CLI 版本不穩定**(可能被拒或
312
+ 回無效引數)。long-context 通道的設計本來就是「把內容貼進任務」的長文
313
+ 整合,不受影響;要*讀取 repo* 的諮詢請用 claude/codex 候選。
314
+ - **Grok 沒有推理檔位開關**;effort 欄位僅為介面一致而保留,實際忽略。
315
+ - **非 Git 的 Codex work 仍受支援。** 部分 Codex CLI 版本可能在 Git worktree
316
+ 外卡住,因此上面的自動保險絲會限制這個情境並清掉受監工的程序群組。Omnilane
317
+ 不會自動執行 `git init`,也不要求使用者建立 repo。
318
+
319
+ ## 🌱 狀態
320
+
321
+ v0.5.1 讓 Codex `work` 在非 Git 目錄仍可使用,同時以程序群組清理限制卡死,
322
+ 並同步所有公開版本來源。它延續 v0.5.0 對安裝器、派工生命週期、job 儲存、
323
+ 整體截止時間、診斷與發布 CI 的強化。Grok/Antigravity 指令殼行為仍可能隨
324
+ CLI 版本變動。歡迎回報 issue 與 PR。
325
+
326
+ 專案文件:[貢獻指南](CONTRIBUTING.md) · [安全政策](SECURITY.md) ·
327
+ [變更紀錄](CHANGELOG.md)