Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

模型: openai/gpt-5.4
生成日期: 2026-04-01
书名: Claude Code VS OpenCode:架构、设计与未来
章节: 第4章 — 工具系统设计
Token用量: 约 13,500 input + 2,400 output

4.3 工具权限与安全

工具系统一旦连接文件系统、Shell 与网络,安全问题就不再是附属议题,而是主架构的一部分。OpenCode、Claude Code 与 OMO 在这一点上采取了三条不同路线:规则匹配、模式治理、执行链守卫。

OpenCode 的权限系统位于 packages/opencode/src/permission/next.ts,核心是 allow / deny / ask 三态模型。它并不追求复杂的智能判断,而是采用 pattern matching rule engine:一条规则由 permissionpatternaction 组成,执行时对 permission 与目标模式同时做 wildcard match,并采用“最后匹配优先”。这意味着 OpenCode 把安全问题建模成“能力名 × 资源模式”的笛卡尔积判断,例如 read + /path/*bash + npm install *。这种设计非常工程化,也非常透明:用户能读懂规则,系统也容易解释自己为什么询问或拒绝。

尤其在 Bash 权限上,OpenCode 还通过命令前缀提取来缩小授权粒度。它不是简单地把整条 Shell 命令当成一个黑盒,而是解析出关键 command prefix,再判断例如 git checkoutnpm installdocker run 这样的模式是否被允许。这背后的思想是 capability narrowing:尽量只授予完成当前任务所需的最小能力,而不是一次性放开整个 Shell。

Claude Code 的安全架构则更接近商业产品。它在 src/types/permissions.tssrc/utils/permissions/* 中构建出一个 4+1 模式系统:对用户而言,通常可理解为 defaultplanacceptEditsbypassPermissions 四种主模式;代码里还存在 dontAsk 与内部 auto 模式。default 倾向于逐项确认,plan 先规划后执行,acceptEdits 自动接受一定范围内的编辑,bypassPermissions 则接近全面放行。真正有意思的是它没有止步于静态规则,而是接入了 ML classifier,对 Bash/PowerShell 等高风险操作进行自动分类。

这里的 classifier 可以理解为一种“权限路由模型”:它不直接帮用户写代码,而是判断某次工具调用是否足够安全,能否跳过人工确认。按照 Anthropic 对外材料中的总结,这套机制配合 sandboxing 能显著减少权限提示,常被概括为约 84% 的 permission reduction。这个数字背后不是单一算法奇迹,而是多层机制叠加:安全工具白名单、工作区内编辑快速放行、危险脚本模式识别、连续拒绝后的降级回退,以及 OS 级 sandbox。也就是说,Claude Code 的关键创新不是“少弹窗”,而是“让多数低风险操作从一开始就不需要弹窗”。

OMO 的路径又不同。它继承 OpenCode 的底层权限框架,但在 src/plugin/tool-execute-before.tssrc/plugin/tool-execute-after.tssrc/plugin/hooks/create-tool-guard-hooks.ts 中加入大量守卫钩子。最值得注意的是 file guard 一类钩子,例如写入已有文件保护、question label truncation、规则注入、注释检查、任务响应校验等。也就是说,OMO 不是只在“要不要执行”这一层做决策,而是在执行前后持续加工工具调用,把安全控制分散到 pipeline 的多个节点。

这种 hook-based safety 很像编译器中的 pass pipeline。所谓 hook,在这里可以衍生解释为“附着在主执行流上的可插拔拦截点”:主流程不必重写,只需在关键节点插入额外检查、修正或审计逻辑。其好处是组合性强,坏处是系统会更复杂,调试链路也更长。

综合来看,OpenCode 代表“显式规则安全”,Claude Code 代表“模式+分类器+沙箱安全”,OMO 代表“规则基座之上的编排式安全”。前者透明,后者省心,第三者灵活。三种路线都在回答同一个问题:如何在不摧毁自动化体验的前提下,把 Agent 的真实世界操作约束在可接受的风险半径之内。这也是为什么现代编码智能体的安全设计,已经不只是 permissions UI,而是 tool architecture 本身。