M1 已发布 · 本地运行 · Apache-2.0

先读懂代码, 再开口的代码审查。

ocra 把一次改动拆成几个聚焦的审查任务。每个 agent 只能读你的仓库,必须引用它说的那段代码,还要交代自己查过什么。多数时候你会收到几条意见,有时一条也没有,这也是正常结果。

Node 22+,支持 OpenCode 能用的任何模型

示例输出
$ ocra review --from main
[ocra] 4 file(s) selected, 1 excluded · risk tier: lite
[ocra] 2 review task(s) (grouped)
[ocra] correctness-1 gemini-3.5-flash: 5 tool calls, $0.0081
[ocra] correctness-2 completed in 7.4s · 0 finding(s)
 
src/auth/session.ts
critical L42 Every session is treated as expired
isExpired() compares expiresAt in seconds with Date.now() in
milliseconds, so users are logged out right after signing in.
Suggestion: return session.expiresAt * 1000 < Date.now();
 
1 finding(s) (1 critical) · 21,406 in / 402 out · $0.0143

运行 ocra review 时发生了什么

不能出错的步骤,都是普通的、有测试的代码。只有需要判断的地方才交给模型。

模型

Review

agent 通过三个工具读取被审查的那个版本,用引用代码的方式报告问题。它没有 shell,不能写文件,最多执行 20 步。

代码模型规划中

刻意做出的几个取舍

每一条都有代价,我们认为值得。

  1. 01

    行号从来不由模型决定。

    模型不擅长行号,却很擅长引用。所以让它引用,由 ocra 去找行号。

  2. 02

    审查员被明确告知哪些别管。

    代码风格、没有依据的推测、缺少测试、没改动的代码,每个提示词里都排除在外。意见变少了,但没有变弱。

  3. 03

    没有任何东西拥有写权限。

    agent 能读文件、读 diff、搜索代码。编辑、shell 和网络工具全部关闭。

  4. 04

    你本机的东西不进提示词。

    在发出第一个请求之前,本机的 OpenCode 配置、已安装的 skill 和指令文件都会被关掉。

  5. 05

    每次调用都有账单。

    输入、输出、推理和缓存 token,以及花费,按每次模型调用和每次运行分别列出。

  6. 06

    一个模型倒下,下一个接手。

    给每个层级配一串模型。遇到过载或额度用完就换下一个;反复失败的模型在本次运行里会被跳过。

一条意见长什么样

信息刚好够你在几秒内决定修还是忽略。

src/auth/session.ts · L422critical
41 export function isExpired(session: Session) {
42 + return session.expiresAt < Date.now(); 1
43 }

Every session is treated as expired

expiresAt is stored in seconds but compared with Date.now() in milliseconds, so every session counts as expired and users are logged out right after signing in.

Evidence: token.ts:18 sets expiresAt = Math.floor(Date.now() / 1000) + ttl3

+ return session.expiresAt * 1000 < Date.now();4
  1. 1agent 引用的那一行
  2. 2ocra 定位到的位置
  3. 3agent 用工具查证过的事实
  4. 4有必要时,最小的修复

把团队规范写成插件

Git 适配器、OpenCode 运行时和目前唯一的审查员本身也是插件。你写的插件用的是同一套接口:注册规则、审查员、工具或事件监听,并拿到只属于自己的设置。

  • 三个生命周期钩子,按固定顺序执行
  • 每个插件的设置单独校验
  • 注册冲突或越界注册时报错,并指出是哪个插件
插件指南
// tools/ocra-team-rules.mjs
export default {
  name: "team-rules",
  configure(ctx) {
    ctx.registerRules([{
      path: "services/**",
      rule: `${ctx.settings.team}: require idempotency keys`,
    }]);
  },
};

目前进展

  1. M1本地审查CLI、文件选择、分组、行号定位、correctness 审查员、OpenCode 运行时、插件、评测工具。已发布
  2. M2更多审查员安全与性能审查员、逐条核查、最终裁决、按风险分派。下一步
  3. M3GitHubPR 行内评论和增量复审。规划中
  4. M4加固熔断器、远程配置、审查记忆,以及追求召回率的 --ultra 模式。规划中

拿一个你熟悉的仓库试试

它可以在你本机的任何 Git 仓库上运行。模型供应商能看到的,只有被审查的改动和 agent 打开过的文件。

阅读快速上手
git clone https://github.com/jma49/Open-CR-Agent.git
cd Open-CR-Agent && npm install && npm run build
npm link --workspace @open-cr-agent/cli
export GEMINI_API_KEY=...
cd your-repository && ocra review