插件
用插件为 ocra 扩展代码托管平台、运行时、审查员、规则、工具和事件监听。
ocra 里的一切都是插件:本地 Git 和 GitHub 适配器、OpenCode 运行时、correctness、security、performance、docs 和 agents-md 五个审查员,以及会话记录,都是内置插件。你写的插件使用的是同一套接口。
编写插件
插件是一个模块,以 default(或 plugin)导出一个对象:
// tools/ocra-team-rules.mjs
export default {
name: "team-rules",
configure(ctx) {
ctx.registerRules([
{
path: "services/**",
rule: `Owned by ${ctx.settings.team}: check idempotency keys on every write.`,
},
]);
},
};在 .ocra/config.json 里注册:
{
"plugins": ["./tools/ocra-team-rules.mjs"],
"pluginSettings": { "team-rules": { "team": "payments" } }
}插件从仓库自己的依赖(按包名)或文件路径加载,路径相对仓库根目录解析(也可以指向仓库之外:配置由你自己信任)。插件会执行代码,所以只在本地审查时从仓库自己的配置加载;审查 PR 时或使用 --no-repo-config 时都不会加载。
生命周期
| 阶段 | 执行方式 | 失败时 |
|---|---|---|
bootstrap(ctx) | 所有插件并发执行 | 只打印警告,审查继续 |
configure(ctx) | 按加载顺序执行 | 审查停止,并指出是哪个插件 |
postConfigure(ctx) | 所有注册完成后并发执行 | 审查停止 |
bootstrap 适合做失败了也无妨的事,比如拉取远程设置。
插件可以注册什么
| 方法 | 提供的能力 |
|---|---|
registerVcs(name, factory) | 代码托管平台适配器 |
registerRuntime(name, factory) | agent 运行时 |
registerReviewer(definition) | 有自己提示词和模型层级的审查员 |
registerRules(rules) | 按路径生效的审查规则 |
registerTool(tool) | 审查员可以调用的工具,输入用 Zod schema 定义 |
onEvent(listener) | 审查过程中每个事件的监听器(遥测、通知)。监听器抛出异常时会被停用,并给出一次警告,审查继续进行 |
运行时工厂会收到模型链、环境变量、声明的供应商,配置了的话还有 sampling(temperature、seed);运行时用自己的 sampling 属性说明它实际发送什么,并在 notApplied 里列出没法传下去的设置。没有这个属性的运行时会被报告为一项都没应用。任务的 spec 带有它的审查员要求的推理强度 effort;补全请求带有 agent(计划调用对应的审查员,或 verifier、judge、helper)和 effort;没有配置推理强度时两者都不存在。会发送推理强度的运行时实现 appliedTo(agent),返回这个 agent 的每次调用是否都发送了它,以及 notApplied:这些调用没有发送的采样设置。没有实现它的运行时会被报告为不发送推理强度,运行会给出一次警告。
每个插件只能拿到自己的设置(ctx.settings),并由可选的 settingsSchema 校验。同一个名字重复注册、使用保留的工具名,或在 configure 阶段之后再注册,都会报错并指出是哪个插件。
安全
插件会执行代码,只从你信任的仓库加载插件;审查别人的分支时,请使用 ocra review --no-repo-config,它会忽略仓库的配置和插件。在 CI 中,配置应当从受保护的 base 分支读取,绝不能从被审查的 PR 里读取。