cmd/opencodereview/review_cmd.go(17,035 bytes)review_cmd.go 定義 ocr review 命令。它把 CLI 旗標裝進 reviewOptions 結構,然後組裝出評審所需的全部元件:Git 模式驗證、MCP clients、工具 registry、規則 resolver——最後呼叫 agent.New(...).Run() 執行。想理解 OCR 的「執行」就從這裡切入。
reviewOptions 是旗標的資料容器(--from/--to/--commit/--preview/--format/--audience…)。reviewModeFromOptions 回傳模式字串:有 commit 是 commit 模式、有 from/to 是 range、都不是是 workspace——這決定 diff provider 的 Mode 列舉。
validateReviewRefs 檢查旗標組合的合法性(commit 與 from/to 不可混用)。requireGitRepo 用 git 檢查確認目前目錄是工作樹——失敗會印出 FAQ 裡的 not a git repository。resolveRepoDir 把相對路徑轉絕對。
讀 ~/.opencodereview/config.json 的 mcp_servers 鍵,對每個 server 建立 *mcp.Client(見 internal/mcp)。這些 client 的工具會註冊進工具 registry,供評審 agent 呼叫——把外部 MCP server 的能力併入評審。
建立 tool.Registry(見 internal/tool),註冊 code_comment、file_read、file_find、file_read_diff、code_search 的 provider,並把 MCP client 的動態工具也註冊進去。最後 Freeze() 鎖定。comment collector 與 file reader 是這些 provider 依賴的共用元件。
這是 review 命令的骨幹:
llm.ResolveEndpoint,見 internal/llm)。agent.Args(template、tools、rules resolver、diff provider…)。agent.New(args).Run(ctx)——跑完整管線(見 internal/agent)。--format/--audience 渲染 text 或 JSON。session_id 回傳給 resume)。--preview 的實作:載入 diff → 跑五重門過濾 → 印出每個檔被保留/排除的原因。這是「不花 token 除錯過濾」的關鍵功能(見 評審規則)。
buildToolRegistry 如何把內建 + MCP 工具合流、以及 preview 為何不花 token。下一步:internal/agent/agent.go(管線核心)。