對每個檔案路徑,依序嘗試各層;第一個匹配的模式生效。
| 優先級 | 來源 | 路徑 | 說明 |
|---|---|---|---|
| 1(最高) | --rule 參數 | 使用者指定 | CLI 覆蓋;只要提供就生效 |
| 2 | 專案配置 | <repoDir>/.opencodereview/rule.json | 專案級——可安全提交 |
| 3 | 全域配置 | ~/.opencodereview/rule.json | 使用者級偏好 |
| 4(最低) | 系統內建 | 內嵌 system_rules.json | 永遠存在,涵蓋常見語言 |
{
"include": ["src/**/*.{ts,tsx}", "src/**/*.go"],
"exclude": ["**/*.test.ts", "**/generated/**"],
"rules": [
{ "path": "src/api/**/*.go", "rule": "All exported handlers must validate request bodies before use." },
{ "path": "**/*mapper*.xml", "rule": "Check SQL for injection risks, parameter errors, and missing closing tags." }
]
}
include——glob 模式,繞過內建預設排除(測試檔排除)。它不是白名單。exclude——OCR 不審的檔。過濾中優先級最高。rules——{path, rule} 條目,按宣告順序求值。第一個匹配決定發給模型的 prompt。| 語法 | 含義 |
|---|---|
* | 匹配除 / 外任意字元 |
** | 跨目錄邊界(src/**/*.go 覆蓋任意深度) |
{a,b,c} | 花括號展開(*.{ts,tsx}) |
? / [abc] | 單字元 / 字元類 |
模式匹配不區分大小寫(路徑先小寫化)。不確定時用 ocr rules check <path> 確認。
對每個 diff,OCR 依序問:
**/*_test.go…)?排除。全部通過才發給 LLM。用 ocr review --preview 可不花 token 印出過濾結果。
**/*_test.go **/*.test.{js,jsx,ts,tsx}
**/src/test/**/*.java **/__tests__/**
**/*_test.py **/*_spec.rb
**/*Test.java **/*_test.rs
過濾決定某檔會審後,OCR 依序試 --rule → 專案 rule.json → 全域 rule.json → 系統內建。解析出的規則正文成為 plan 與 main task prompt 的 {{system_rule}}。
$ ocr rules check src/main/java/com/example/UserService.java
File: src/main/java/com/example/UserService.java
Source: System built-in
Pattern: **/*.java
Rule:
────────────────────────
…java.md 內容…
────────────────────────
{
"rules": [
{ "path": "src/api/**/*.go", "rule": "Every public handler must `defer tx.Rollback()` immediately after starting a transaction." },
{ "path": "**/*mapper*.xml", "rule": "Check SQL for injection risks, missing parameter binding, and unclosed XML tags." }
]
}
{ "include": ["src/**/*.{ts,tsx,js,jsx}"], "exclude": ["**/*.gen.ts", "**/generated/**"] }
ocr review --rule ./.review-rules-only-for-this-pr.json
四層不是任意順序——它們有明確的覆蓋邏輯:
--rule(CLI)→ 臨時覆蓋,不改配置.opencodereview/rule.json → 團隊共識,可提交~/.opencodereview/rule.json → 個人偏好「首條匹配生效」意味著更具體的規則要放前面。
這是最多人誤解的:include 不是「只審這些檔」——它是「這些檔繞過後面兩門排除」。五重門的第三門 user_include 命中後立即保留,跳過 unsupported_ext 和 default_path。這就是為什麼你可以用 include 強制保留測試檔。
「規則沒觸發?」→ 跑 ocr rules check <path>。它顯示:① 匹配的層(CLI/專案/全域/內建)→ ② glob 模式 → ③ 規則正文。如果層不對(應該匹配專案但匹配了內建),多半是宣告順序問題——把更具體的規則前移。
Step 1 — 建立專案級規則檔
cat > .opencodereview/rule.json << 'EOF'
{
"include": ["src/**/*.go"],
"exclude": ["**/*_test.go"],
"rules": [
{ "path": "src/api/**/*.go", "rule": "Check for missing error handling after db.Begin()." }
]
}
EOF
Step 2 — 確認規則是否匹配
ocr rules check src/api/handler.go
Step 3 — 跑 preview 看過濾結果
ocr review --preview
Step 4 — 真正跑評審
ocr review
預期產出
File: src/api/handler.go
Source: Project .opencodereview/rule.json
Pattern: src/api/**/*.go
Rule:
────────────────────────
Check for missing error handling after db.Begin().
────────────────────────
| 錯誤訊息 | 診斷 | 修復 |
|---|---|---|
規則沒觸發 | glob 模式不匹配或宣告順序不對 | 跑 ocr rules check |
我的檔案沒被評審 | 被五重門過濾 | 跑 ocr review --preview 看排除原因 |
include 是繞過機制而非白名單、五重門各擋什麼、以及如何用 ocr rules check 除錯「規則沒觸發」。