What · 是什么
custom(--rule) > project(.opencodereview/rule.json) > global(~/.opencodereview/rule.json) > system(内嵌),doublestar glob 匹配
四层规则链,优先级:custom(--rule 旗标)> project(<repo>/.opencodereview/rule.json)> global(~/.opencodereview/rule.json)> system(内嵌 system_rules.json + rule_docs/ 44 个语言规则 md)
首匹配优先:规则命中时按层序取最上层匹配
文件匹配支持 doublestar glob(** 递归匹配任意层目录)+ 花括号 {a,b} 展开
merge_system_rule 选项控制是否合并系统内置规则
规则值可引用 .md/.txt 文件路径作为内容源;相对路径机制防目录穿越
CanonicalConfig() 生成 rule_config_sha256 规则指纹;内置 10+ 语言规则集(Java/TS/Go/Python/Kotlin/Rust/C++/C)及 NPE、线程安全、XSS、SQL 注入专项规则
Why · 为什么
原理 · Principle
分层治理:个人/团队/仓库/内置四层隔离,不同范围各自演进不互相污染
多语言与专项安全规则开箱即用,无需从零编写
glob 语法贴近开发者习惯(gitignore 风格),可精确圈定审查文件范围
How · 怎么做
项目级:仓库根建 .opencodereview/rule.json 定义规则
全局级:~/.opencodereview/rule.json 供所有项目共享
临时级:ocr review --rule <自定义规则文件路径>
文件匹配:glob 支持 **(如 **/src/**/*.java)与 {a,b}(如 *.{ts,tsx})
规则内容外置:rule 值指向 .md/.txt 路径(仅相对路径,防目录穿越)
系统规则控制:merge_system_rule 决定是否合并内置规则
验证指纹:CanonicalConfig() 输出的 rule_config_sha256 用于确认规则集版本与缓存一致性
案例 · Cases
| 代表性案例 |
|---|
| 团队统一规范:global 层放团队通用规则,项目层放仓库特有规则 |
| 专项安全审查:启用 NPE/线程安全/XSS/SQL 注入专项规则集 |
| 按语言分流:Java 规则匹配 **/*.java,TS 规则匹配 **/*.{ts,tsx} |
| 长规则文本外置:写入 .md 文件,rule.json 只引用路径 |
反模式 · Anti-patterns
- glob 写错导致规则静默失效:用 * 而非 ** 时匹配不到多层目录下的文件
- 误改 ~/.opencodereview/rule.json 以为是项目配置:实际影响本机所有项目
- 关闭 merge_system_rule 后安全专项规则(NPE/XSS 等)全部消失
- 规则值引用绝对路径或越级相对路径造成目录穿越风险:必须只用受限相对路径
- 多层同名规则并存时靠首匹配优先裁决:理解错层序会得到预期外的审查行为
正反实例论证 · Evidence
正例 · Pro
保留系统规则并叠加项目层规则
{ "merge_system_rule": true}# <repo>/.opencodereview/rule.json 追加仓库规则# 优先级:custom(--rule) > project > global > system,首匹配优先merge_system_rule: true 使系统内置 10+ 语言规则集(Java/TS/Go/Python/Kotlin/Rust/C++/C)及 NPE、线程安全、XSS、SQL 注入专项规则保持生效,项目层只按需追加。
反例 · Con
关闭 merge_system_rule 导致安全规则全失效
{ "merge_system_rule": false}系统内嵌 system_rules.json 与 rule_docs/44 个语言规则 md 全部不再参与,NPE/XSS/SQL 注入等专项审查静默消失。
正例 · Pro
doublestar glob 精确圈定文件范围
"**/src/**/*.java" # ** 递归匹配任意层目录"**/*.{ts,tsx}" # {a,b} 花括号展开规则匹配支持 ** 递归与花括号展开,按仓库目录结构与语言精确圈定审查范围,与 gitignore 风格一致。
反例 · Con
用 * 代替 ** 导致规则静默失效
"*/*.java"* 只匹配单层目录,src/main/java 等多层目录下的 Java 文件全部不命中,规则看似配置了却不生效,且无任何报错提示。
正例 · Pro
长规则内容外置 .md/.txt 文件
# rule.json 中规则值引用外部文件(仅相对路径)"rules/java-npe.md"规则值可引用 .md/.txt 文件路径作为内容源,长文本不塞进 JSON;相对路径机制同时防目录穿越。
反例 · Con
规则引用绝对路径或越级相对路径
"/etc/rules/x.md""../../outside.md"绝对路径或越级相对路径构成目录穿越风险,应只用受限相对路径引用规则文件。