OneCatchOne app, catch everything
跑在你自己机器上 · 数据在 ~/.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
工作区 / 实现 → 审查 loop
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 改的就是远端那个文件。

OneCatch 的输入框,运行 Modu Code、工作区访问权限,下方项目芯片标着 code / 远端 FS。
输入框里跑的是本地的 Modu Code,它作用的工作区标着 远端 FS。
内嵌终端连到 ityike@192.168.5.x,显示远端机器的硬件信息:一台跑 Linux 的 Mac Pro。
下面这个终端在远端。图里这台是装了 Linux 的旧 Mac Pro —— 上面没有 agent,也不需要有。

一个工作台

五个 Agent CLI,读法只有一种

Codex 走 app-server 的 JSON-RPC,Claude Code 走 --output-format stream-json, Pi 吐 JSONL,Grok 走 Agent Client Protocol —— 没有两个是一样的。 OneCatch 把它们全部归一成同一组事件。

输入框的 Agent 菜单,列出 Codex、Claude Code、Modu Code、Pi、Grok Build,下方是已保存的工作流。
Agent 和工作流在同一个菜单里选,按任务来。工作流里的每一步还可以各自再指定。

每个 Agent 有自己的版本和开关

每个 harness 从 PATH 上探测,各自报自己的版本,可以单独关掉而不动别的。 Modu Code 是以原生 Go SDK 嵌进来的,不另起子进程。

模型和推理档位按步骤配,不是按应用配

一个步骤可以指定自己的 runtime、模型、reasoning effort 和 service tier,没指定的走全局默认。 实现用贵模型、审查用便宜模型,是改配置,不是改代码。

OneCatch 设置的 Harness 一节:Codex、Claude Code、Modu Code、Pi、Grok Build,各自带探测到的版本和开关。
探测到的版本、每个 harness 各自的开关,以及每种 runtime 能做什么、不能做什么。

工作流

是循环就写成 loop,会分叉就写成 DAG

实现 → 审查 → 返工 是个循环:每一步声明它可能输出哪些信号,以及每个信号跳到哪一步。 活儿会分叉的时候写成 DAG —— 并行的节点,最后汇到一处。

DAG 编辑器:两个并行根节点,一个跑 codex 一个跑 claude,都指向第三个等待两个依赖的节点。
两个根节点在不同 Agent 上并行跑,汇总节点等两个依赖都完成。每个节点各自带 runtime、沙箱档位和 worker。

停得下来,也接得回去

跑的过程中可以排队追加指令,也可以打断当前这一轮直接插话。暂停之后按 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

免费开源。选你的平台 —— 每个构建都出自同一个仓库。

macOS 需要 macOS 13 Ventura 以上。 Apple 芯片 .dmg
Windows Windows 10 和 11,x64。无边框标题栏,原生菜单栏。 安装包 .exe
Linux x64。同一个构建,两种打包方式。 Debian/Ubuntu .deb 免安装 .AppImage
Android ARM64。需配对运行 OneCatch 的电脑。测试签名版本升级时可能需要卸载重装并重新配对。 下载 .apk

发布于 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 两个构建目标。