cmd/opencodereview/review_cmd.go — review 命令

參數解析、MCP client 初始化、工具 registry 組裝、執行
檔案:cmd/opencodereview/review_cmd.go(17,035 bytes)

大方向

review_cmd.go 定義 ocr review 命令。它把 CLI 旗標裝進 reviewOptions 結構,然後組裝出評審所需的全部元件:Git 模式驗證、MCP clients、工具 registry、規則 resolver——最後呼叫 agent.New(...).Run() 執行。想理解 OCR 的「執行」就從這裡切入。


1. 選項與模式

reviewOptions 結構 · reviewModeFromOptions() review_cmd.go收集 CLI 旗標;判別 workspace / commit / range 三種模式。

reviewOptions 是旗標的資料容器(--from/--to/--commit/--preview/--format/--audience…)。reviewModeFromOptions 回傳模式字串:有 commit 是 commit 模式、有 from/to 是 range、都不是是 workspace——這決定 diff provider 的 Mode 列舉。

validateReviewRefs() · requireGitRepo() · resolveRepoDir() review_cmd.go模式互斥檢查、確認是 Git repo、解析 repo 路徑。

validateReviewRefs 檢查旗標組合的合法性(commit 與 from/to 不可混用)。requireGitRepo 用 git 檢查確認目前目錄是工作樹——失敗會印出 FAQ 裡的 not a git repositoryresolveRepoDir 把相對路徑轉絕對。

2. 元件組裝

initMCPClients() review_cmd.go依 config 的 mcp_servers 建立 MCP client 清單。

~/.opencodereview/config.jsonmcp_servers 鍵,對每個 server 建立 *mcp.Client(見 internal/mcp)。這些 client 的工具會註冊進工具 registry,供評審 agent 呼叫——把外部 MCP server 的能力併入評審。

buildToolRegistry() review_cmd.go把 6 個內建工具 + MCP 工具註冊成 tool.Registry。

建立 tool.Registry(見 internal/tool),註冊 code_commentfile_readfile_findfile_read_diffcode_search 的 provider,並把 MCP client 的動態工具也註冊進去。最後 Freeze() 鎖定。comment collector 與 file reader 是這些 provider 依賴的共用元件。

3. 執行

executeReview(opts) review_cmd.go解析端點、建立 Agent、跑 Run、渲染輸出、處理 resume。

這是 review 命令的骨幹:

  1. 解析 LLM 端點(llm.ResolveEndpoint,見 internal/llm)。
  2. agent.Args(template、tools、rules resolver、diff provider…)。
  3. agent.New(args).Run(ctx)——跑完整管線(見 internal/agent)。
  4. --format/--audience 渲染 text 或 JSON。
  5. 儲存 session(session_id 回傳給 resume)。
runPreview() review_cmd.go跑過濾管線但不呼叫 LLM,印出檔案清單與排除原因。

--preview 的實作:載入 diff → 跑五重門過濾 → 印出每個檔被保留/排除的原因。這是「不花 token 除錯過濾」的關鍵功能(見 評審規則)。

看完這頁你應該能說出:review 命令的組裝順序(選項 → 驗證 → MCP → registry → Agent)、buildToolRegistry 如何把內建 + MCP 工具合流、以及 preview 為何不花 token。

下一步:internal/agent/agent.go(管線核心)。