掃描程式碼品質
擔任資深程式碼審查團隊的編排者。你不需要親自閱讀每個檔案——你負責界定工作範圍,將其分配給專門的審查者(每個品質層面一個),然後將其發現透過一個較便宜的檢查器進行路由,該檢查器會驗證並排序每個發現。你將篩選後的結果彙整成一份具證據支援的報告。
將審查拆分開來,可以讓每個審查者專注於單一透鏡(因此可以深入分析,而不是同時瀏覽六個問題),平行執行這些透鏡,並且只將昂貴的模型用於發現問題——而驗證具體主張並為其優先級評分這種機械性工作,完全在小而快的模型能力範圍內,因此在那裡執行。
平行化是一種最佳化,並非必要條件。 如果此代理可以分發子代理,則為每個審查者和每個檢查器分配一個子代理;這能實現真正的隔離並加快執行速度。如果無法做到,則自行依序處理相同的清單——一次一個類別,在開始下一個類別之前將每個類別的發現寫入檔案,然後對收集到的發現進行一次獨立的驗證。絕不能省略任何類別,也絕不能將發現和檢查階段合併為一次讀取:檢查存在的意義就是對引用的程式碼進行獨立的審視。
使用時機
- 程式碼審查或品質稽核
- 技術債評估或重構準備
- 入職審查以了解程式碼庫健康狀況
- 發布前的程式碼異味檢測
選項
從呼叫中讀取這些選項(例如 --find-model <中階模型> --check-model <便宜模型> --depth thorough src/)。如果省略,則使用預設值,並在報告頂部說明已解析的值。
| 選項 | 預設值 | 意義 |
|---|---|---|
--find-model | 中階模型:一個強大的通用模型,非最大可用模型 | 用於每個層面審查者(發現階段)的模型。 |
--check-model | 最便宜的模型:最小、最快的可用模型 | 用於驗證和排序階段(檢查階段)的模型。 |
--depth | thorough | quick = 僅頂部發現(每個審查者最多傳回其最強的 8 個),一批檢查器;thorough = 完整目錄,每個發現逐一驗證。 |
--focus | 所有類別 | 以逗號分隔的類別子集,使用檢測類別清單中的名稱或技術棧套件表中的透鏡 ID(swift-concurrency、react-core……),大小寫不敏感——僅執行這些審查者。不符合任何內容的名稱會報告為錯誤,而不是掃描結果為空。 |
--stack | 自動檢測 | 強制(--stack swift-ios、--stack react,以逗號分隔)或停用(--stack none)技術棧套件。 |
| 目標路徑 | 儲存庫根目錄 | 位置引數:要掃描的目錄/檔案。 |
--exclude | vendor、generated、build 輸出、lockfiles | 要跳過的路徑。 |
模型值會原樣傳遞給此代理公開的任何模型選擇器——一個別名或完整的模型 ID,以它接受的為準。如果未公開任何選擇器,則忽略這兩個標誌並在報告的設定行中說明;階段仍會執行,只是都在同一個模型上。編排者本身始終在 session 模型上執行。
模型層級比名稱更重要:發現結構性問題需要推理,而檢查一個具體的主張是否與引用的程式碼一致則不需要。將兩者都發送給同一個大型模型會浪費大部分執行成本在較便宜的一半工作上。
架構
編排者 (此 session)
│ 1. 界定範圍 + 建立共用的上下文簡報
├──► 發現階段(平行,模型 = --find-model)────────────────┐
│ 審查者:架構一致性 │
│ 審查者:設計原則遵循度 │ 每個在範圍內
│ 審查者:無效程式碼與未使用成品 │ 的類別一個
│ 審查者:適當複雜度 │ 子代理
│ 審查者:程式碼清晰度 │
│ 審查者:狀態管理 │
│ 審查者:每個相符套件的技術棧透鏡各一個 │
│ 2. 收集原始發現,分配穩定的 ID ◄───┘
├──► 檢查階段(平行,模型 = --check-model)────────────────┐
│ 檢查器:重新讀取引用的程式碼,確認/反駁, │ 驗證 + 排序
│ 套用反駁信號,評分優先級 │ 每個發現
│ 3. 保留已確認的發現,按優先級排序 ◄───┘
└──► 4. 綜合報告
工作流程
-
界定範圍。 解析目標路徑;從設定檔和目錄結構中識別語言、框架、分層和專案慣例。套用排除規則。將其一次捕獲為簡短的上下文簡報(語言、框架、目標路徑、排除規則、顯著的分層)——你將把相同的簡報提供給每個發現子代理,這樣它們就不需要重新推導。
針對技術棧套件表檢測技術棧。當某套件的檢測訊號在目標路徑中成立,而不僅僅是在儲存庫中的某處時,該套件才會啟用。在簡報中記錄哪些套件相符以及它們的規則所依賴的工具鏈事實,針對每個目標,當目標之間不同時給予記錄(語言版本和模式、預設隔離、最低作業系統版本、UI 框架):規則依目標套用,而一個儲存庫經常混合一個應用程式目標與不同設定的擴展和套件。沒有套件相符 → 僅使用通用類別;在設定行中說明。
-
發現階段——為每個在範圍內的類別分派一個審查子代理,全部在一個平行批次中,每個使用
model = --find-model。類別是六個通用類別加上每個相符套件的每個透鏡。為每個子代理提供:上下文簡報、其單一類別的名稱、要讀取的參考檔案和區段(通用類別:其對應的references/generic.md區段;技術棧透鏡:其整個套件檔案),以及下面的發現輸出合約。使用下一節中的提示模板。一個審查者如果範圍太廣且淺薄,就違背了目的——每個審查者只負責一個透鏡。在相符技術棧上的通用審查者也套用該套件的慣用語法:SwiftUI 中的「上帝物件」是一個佔滿螢幕的視圖模型,而不是一個有 20 個方法的類別。告知它們哪個套件相符;它們可以閱讀它,但只報告自己的類別。
重疊。 一個缺陷,一個發現:透鏡經常看到相同的程式碼——共享的可變狀態既是「Swift 並發」又是「狀態管理」;伺服器資料透過 Effect 複製到
useState既是react-core又是react-architecture。當技術棧透鏡的規則之一命名了該結構時,它會勝過通用類別;在兩個技術棧透鏡之間,其規則關於根本原因的那個獲勝(快取,而不是從中複製的 Effect)。在收集階段,合併位置重疊且其模式命名了相同機制的發現,保留擁有者的發現,並將其他的列在其下。 -
收集。 收集每個審查者的 JSON 輸出,連接起來,並為每個發現分配一個穩定的
id(例如arch-1、complexity-3)。丟棄完全重複的項目(相同位置 + 模式),並根據上述規則合併重疊。 -
檢查階段——使用
model = --check-model驗證並排序每個發現。使用下面的檢查提示模板平行分派檢查子代理。每個檢查器獨立重新讀取引用的程式碼,並判斷該發現是否真實,套用反駁信號,調整嚴重性,並分配一個 0–100 的優先級分數。在thorough深度下,為每個發現(或一個小批次)提供自己的檢查器,以實現真正的獨立驗證;在quick深度下,將一個類別的所有發現批次處理到一個檢查器中。丟棄refuted(已反駁)的發現(將其顯示在「已考慮但未標記」中);保留confirmed(已確認)的並標記uncertain(不確定)。 -
報告。 按
priority_score降序排序(相同分數時按嚴重性打破平手)來排序倖存的發現。輸出下面的報告結構。以已解析的設定(目標、深度、焦點、發現模型、檢查模型)開頭,以便執行可重現。
發現子代理——提示模板
填入佔位符並使用 model = --find-model 分派,每個類別一個:
你是一位資深程式碼審查者,正在審查一個品質層面的程式碼:{CATEGORY_NAME}。忽略所有其他層面——其他審查者會負責那些。
上下文簡報:{languages, frameworks, target paths, exclusions, layering notes}
閱讀 {{CATEGORY_NAME} 區段,位於
{abs path to references/generic.md}| 整個{abs path to the pack file}} 以取得此層面的檢測訊號、閾值和重構配方。使用它們——不要依賴記憶。每個套件規則的 Since 指名了所需版本。如果專案版本較舊,則該規則的修復可能不存在於該版本:當問題本身存在於該版本時報告缺陷,提供適用於該版本的重構,並僅將較新的修復作為升級路徑提及。當規則的主體在該版本上不存在時(一個 API、一個路由器、一個編譯器),完全捨棄該規則。僅掃描目標路徑。對於每個具有具體證據(檔案路徑、符號、指標/計數或特定結構)的問題,發出一個發現。如果你無法指出證據,就不要發出——沒有根據的標記會浪費審查者的時間。尊重專案現有的慣例;重構方向必須是非破壞性的且保持行為不變。
僅傳回一個 JSON 陣列(無散文),每個元素具有以下欄位: `{