~/.onecatch
你装的那些 Agent,一个应用全接住。
OneCatch 在本地驱动 Codex、Claude Code、Modu、Pi、Grok —— 五个 CLI,一套事件格式。 把它们编成 loop 或 DAG;也可以让它们去改一台远端机器上的文件,而那台机器不用装 agent, 甚至不用能上网。
v0.4.0 免费开源 · macOS、Windows、Linux、Android · 或者自己从源码编译
驱动你已经装好的 Agent CLI
Codex
Claude Code
Modu Code- Pi
- Grok Build
startedcodex · thread 019f4b11 workspace-writereasoning先读现有的中断实现,再动状态tool_userg "ResumeSessionID" internal/tool_result4 matchesfile_changeM internal/usecase/execution/worker.gousagein 18.2k · out 1.4kresultsucceeded · 42s────────────────────────────────────────────startedclaude · session 45db32aa read-onlyreasoning检查恢复路径会不会重复追加同一批事件tool_usego test ./internal/usecase/...tool_resultok 6 packagesresultneeds_work → 回到第 1 步,实现
五个 runtime,一种事件格式。你在界面上读到的、写进 run log 的、决定工作流下一步走向的,是同一份数据。
最要紧的那个
Agent 跑在这边,文件在那边。
Remote FS 工作区维持一条常驻的 SSH/SFTP 连接,把每一条命令、每一次文件操作作用到远端目录上。 Agent 进程、模型凭据、推理过程,全部留在你本机。
远端只需要一个 sshd。不装 agent,不配 API key,不需要模型访问权限 —— 也不需要它自己能上网。一台根本连不到任何 LLM 的机器,照样是你本地 Agent 能干活的机器。
不拷到本地,也不挂载。文件不会落进某个本地工作副本,没有 FUSE 挂载可以坏。 Agent 改的就是远端那个文件。
一个工作台
五个 Agent CLI,读法只有一种
Codex 走 app-server 的 JSON-RPC,Claude Code 走 --output-format stream-json,
Pi 吐 JSONL,Grok 走 Agent Client Protocol —— 没有两个是一样的。
OneCatch 把它们全部归一成同一组事件。
每个 Agent 有自己的版本和开关
每个 harness 从 PATH 上探测,各自报自己的版本,可以单独关掉而不动别的。
Modu Code 是以原生 Go SDK 嵌进来的,不另起子进程。
模型和推理档位按步骤配,不是按应用配
一个步骤可以指定自己的 runtime、模型、reasoning effort 和 service tier,没指定的走全局默认。 实现用贵模型、审查用便宜模型,是改配置,不是改代码。
工作流
是循环就写成 loop,会分叉就写成 DAG
实现 → 审查 → 返工 是个循环:每一步声明它可能输出哪些信号,以及每个信号跳到哪一步。 活儿会分叉的时候写成 DAG —— 并行的节点,最后汇到一处。
停得下来,也接得回去
跑的过程中可以排队追加指令,也可以打断当前这一轮直接插话。暂停之后按 session ID 恢复
—— Claude Code 是 --resume,Codex 是 thread/resume ——
事件继续追加到同一条 run log,不会另起一条。
权限写在每一步上,不是一个全局开关
read-only、workspace-write、full 是每个步骤各自的属性。
实现那一步可写、审查那一步只读,是最常见的配法。full 要过一次二次确认,
而且不允许跑在远端 worker 上。
写错的 loop 会自己停
默认最多流转 20 次,连续失败到阈值也停。DAG 保存前会检查环、未知依赖和并行写冲突。 所以一个绕不出去的循环撞的是上限,不是你一整晚的 token。
数据就是你磁盘上的文件
JSON / JSONL 存在 ~/.onecatch,每次运行的事件流在 ~/.onecatch/runs/。
可以 grep,可以进 git,可以直接删。没有账号,没有遥测,没有一个云端服务夹在你和 Agent 中间。
下载
拿到 OneCatch
免费开源。选你的平台 —— 每个构建都出自同一个仓库。
发布于 2026-09-30 · 全部版本 · 每个文件旁边都有对应的 .sha256
Intel 芯片的 Mac 没有构建 —— 那种机器请从源码编译。
桌面版先要有什么。PATH 上至少有一个 agent CLI —— Codex、Claude Code、Modu、Pi
或 Grok —— 并且已经登录好。OneCatch 是去启动这些二进制,不转发你的请求,所以它拿不到你的 key。
没有账号,也没有配置服务器。第一次启动会创建 ~/.onecatch,
除了应用本身,安装痕迹就这些。
从源码
或者自己编
$ git clone git@github.com:openmodu/onecatch.git $ cd onecatch $ go tool wails3 task deps # 按 lockfile 装 Go 和 JS 依赖 $ go tool wails3 task build:desktop # 输出桌面构建
需要 Go 和 Node,版本以仓库里的 go.mod 和 frontend/package.json 为准。
开发环境是 go tool wails3 task dev:desktop。
不做什么
这些事 OneCatch 不打算做
不托管代码,也不替你跑 Agent。它驱动的是你本机上已经装好的 CLI,用的是那些 CLI 自己的登录和 API key。OneCatch 不转发你的请求,也就拿不到你的 key。
不做账号和云同步。换一台机器就是换一份 ~/.onecatch,同步得你自己想办法。这是本地优先的代价,写在这里而不是等你装完才发现。
仓库里的市场、登录、计费代码不是产品。那是早期探索留下的,当历史参考保着,不约束现在的本地编排实现。
问题
你大概会问的几件事
远端机器需要能上网吗?
不需要,这正是 Remote FS 的意义。Agent 进程、模型凭据、每一次发往模型服务的请求,全在你本机;走 SSH/SFTP 过去的只有文件读写和 shell 命令。一台在隔离网里、或者干脆没有任何路由能到 LLM 的机器,照样是你本地 Agent 能干活的机器。它要的只有 sshd 和一个账号 —— 不装 agent CLI,不装 OneCatch,不要 key。
它能驱动哪些 Agent?
Codex、Claude Code、Modu Code、Pi、Grok Build。每个都从 PATH 上探测,各自报版本,可以单独开关。Modu Code 是以原生 Go SDK 嵌进来的,不另起子进程。一个工作流里可以混着用 —— 一个负责实现,另一个负责审查。
和自己开几个终端跑 CLI 有什么区别?
区别在「跑完之后」。终端里 Agent 停下来,你得自己判断这轮结果算不算过、要不要返工、返工时把哪些上下文再喂一遍。OneCatch 把这个判断写成步骤的输出信号和跳转表,所以「审查没过就回到实现」是它自己完成的。附带的好处是每一轮的事件、token、改了哪些文件都落在同一条 run log 上,不用回滚终端 scrollback 找。
要额外配 API key 吗?
不要。OneCatch 起的是你机器上那些 agent 可执行文件,认证走它们自己那一套。请求不经过 OneCatch —— 所以它既拿不到你的 key,也没法替你计费。
Remote FS 工作区和远端 worker 有什么区别?
Remote FS 把 Agent 留在本地,只把文件和 shell 操作发到远端,远端什么都不用装。远端 worker 正相反:Agent 本身就跑在那台机器上,所以那台机器需要有 CLI、有凭据、能访问模型。worker 适合你自己掌控的高配构建机;除此之外都更适合 Remote FS,而且 full 权限的步骤永远不允许跑在 worker 上。
我的数据会被传到哪里去吗?
不会。没有账号系统,没有遥测,没有 OneCatch 的服务端。任务、运行记录、事件流都是 ~/.onecatch 下的 JSON / JSONL 文件。Agent 本身当然要连它自己的模型服务,那部分和你直接用 CLI 时完全一样。
支持哪些平台?
macOS 是 Apple 芯片,Windows 和 Linux 是 x64,Linux 提供 .deb 和 AppImage 两种包。Android 是 ARM64 APK,需要配对运行 OneCatch 的电脑;Agent CLI 在电脑上运行。Intel 芯片的 Mac 暂时没有构建,但可以自己从源码编译。独立的远端 worker 有 macOS 和 Linux 两个构建目标。

