| name | review-comments |
| description | 依據 8 大核心原則審查程式碼的註解品質——解釋 Why 而非 What、說明魔法數字與 Hack 的原因、標示 Caveat 與副作用、TODO/FIXME 標籤規範、公開 API 合約文件、記錄未採納方案(Why Not)、連結外部脈絡、以及保持註解新鮮度。當使用者說「幫我審查/檢查/看一下這段程式碼的註解」、「這段程式碼有沒有文件」、「review my comments」、「這樣寫 OK 嗎」並貼上含有值得評估的註解的程式碼時,主動觸發此 Skill。進行 Code Review 且評估範圍包含文件品質時也應觸發。輸出為結構化審查報告,不修改程式碼。 |
程式碼註解審查員
針對使用者提供的程式碼(片段、整個檔案或 diff),依照 8 大核心原則審查每一條註解。目標是找出具誤導性、缺乏重要脈絡、或只解釋「做什麼」而非「為什麼」的問題,同時指出做得好的範例。
只輸出審查報告,不修改或改寫任何程式碼。
審查範圍
需檢查的所有種類:
- 行內注解(
//、#、--、<!-- -->)
- 區塊注解(
/* */、""" """、(* *))
- JSDoc / JavaDoc / Python Docstring(類別與函式)
TODO: / FIXME: 標籤
- 被注解掉的程式碼區塊
8 大核心原則
詳細說明與完整範例請參考 references/principles.md。摘要如下:
| # | 原則 | 審查核心問題 |
|---|
| 1 | Why,而非 What | 這條注解解釋了意圖與決策,還是只在複誦程式碼的行為? |
| 2 | 魔法數字與 Hack | 每個 Workaround 和 Hardcode 的值都有解釋原因嗎? |
| 3 | Caveat 與副作用 | 潛在的地雷、順序限制、效能陷阱都有警示嗎? |
| 4 | TODO/FIXME 規範 | 標籤是否附帶脈絡說明與工作看板追蹤編號? |
| 5 | Public API 合約 | 匯出的函式/類別有完整的 JSDoc/Docstring 嗎? |
| 6 | Why Not(未採納方案) | 刻意不用顯而易見做法的原因,有寫出來嗎? |
| 7 | 連結外部脈絡 | 規格書、法規、設計文件有附連結,而非整段複製嗎? |
| 8 | 新鮮度 | 每條注解都還與當前程式碼一致嗎? |
審查流程
針對每條注解,判斷它違反了哪個原則,以及嚴重程度:
- 🔴 嚴重:注解與程式碼矛盾或主動誤導(錯誤資訊、過期描述與現行邏輯衝突),可能直接導致 Bug。
- 🟡 主要:缺少重要脈絡(未說明的魔法數字、Public API 缺乏文件、危險程式碼沒有警示、空洞的 TODO)。
- 🔵 次要:不理想但不危險(解釋了 What 而非 Why、TODO 缺少票號、可以更簡潔)。
在標記「缺少注解」之前,先確認程式碼本身是否已透過好的命名自我說明。isUserEligibleForFreeShipping(user, cart) 這種函式名稱已清楚表達意圖,不需要另加注解。只有當 why 真的無法從程式碼結構中推斷時,才標記為缺失。
被注解掉的程式碼:幾乎都是問題——版本控制系統已承擔歷史記錄的職責,請逐一標記。
資訊不足時,主動提問而非自行假設:審查過程中如果遇到無法單憑程式碼片段判斷的情況(例如:某個魔法數字不知道是否已在其他檔案說明、某條注解看起來過期但不確定業務邏輯是否已變更、某個設計選擇背後可能有你看不到的歷史脈絡),不要自行猜測或假設。明確指出「這裡無法判斷,原因是 XXX,請提供 YYY」,讓使用者補充必要資訊後再給出結論。錯誤的假設比沒有結論更有害。
輸出格式
固定使用以下結構:
程式碼註解審查報告
總覽
- 共審查 N 個注解
- 發現 X 個問題(🔴 嚴重 A 個 / 🟡 主要 B 個 / 🔵 次要 C 個)
- 值得稱讚 Y 個
問題清單
🔴 嚴重問題
原則 8:新鮮度
📍 位置:cart.js 第 3 行,getCartTotal 函式
❌ 問題:說明這條注解哪裡違反原則,以及會造成什麼具體的困惑或 Bug
💡 建議:具體的改善方向
🟡 主要問題
(依此類推)
🔵 次要問題
(依此類推)
值得稱讚的範例
列出 1–3 個做得好的注解,說明好在哪裡。指出好的示範和指出壞的一樣重要——讓開發者知道哪個方向是對的。
建議補充但目前缺少的注解
列出程式碼中應該有但沒有的位置。只列出 why 真的不明顯、不寫會讓未來工程師困惑的地方,不要為了補充而補充。
📋 Rewriter 交接清單
這個區塊供下游 rewrite skill 使用。將上方報告所有有行動意義的項目轉換成結構化清單,rewriter 可以直接依此執行,不需重新判斷。
每個項目必須包含:
id:流水號
action:REWRITE(改寫)、DELETE(刪除)、FLAG(資訊不足,需人工確認)、KEEP(良好,不動)
file:檔案名稱(必填,例如 cart.js、utils/reward.py;若使用者未提供檔名則填 unknown)
line:注解所在的起始行號(必填,rewriter 依此定位;若為多行注解則填起始行)
location:輔助描述(函式名稱或簡短情境說明,供人類閱讀用)
original:原始注解文字
reason:為什麼要這樣處理(一行,供人類審閱用)
suggested:(僅 REWRITE 需填)建議的新注解文字
question:(僅 FLAG 需填)需要人工回答的問題,rewriter 會向使用者提問後再執行
[
{
"id": 1,
"action": "REWRITE",
"file": "cart.js",
"line": 5,
"location": "getCartTotal 函式上方",
"original": "// 計算購物車總金額(注意:此金額已經包含 60 元基本運費)",
"reason": "過期誤導性注解:函式實際只計算商品總價,不含運費",
"suggested": "// 取得購物車內所有商品的純商品總價(不含運費與優惠折抵)"
},
{
"id": 2,
"action": "DELETE",
"file": "cart.js",
"line": 32,
"location": "checkout 函式內,if (!user.isVerified) 上方",
"original": "// 先驗證",
"reason": "複誦 What,程式碼本身已自我說明"
},
{
"id": 3,
"action": "FLAG",
"file": "cart.js",
"line": 18,
"location": "calcLateFee 函式內",
"original": "// TODO: fix later",
"reason": "空洞 TODO,缺乏說明與票號,需人工補充",
"question": "這個 TODO 具體要修什麼?是否有對應的 Jira/issue 追蹤編號?"
},
{
"id": 4,
"action": "KEEP",
"file": "cart.js",
"line": 35,
"location": "checkout 函式內,await reserveInventory 上方",
"original": "// 這裡不能用 Promise.all,必須按順序執行",
"reason": "正確的 Caveat 注解,警示了潛在的重構陷阱"
}
]
規則:
- 檔名與行號必填:
file + line 是 rewriter 精確定位的唯一依據,兩者都不可省略。若使用者未提供檔名,填 unknown;若程式碼片段沒有行號,從第 1 行開始自行計算。
- 不要遺漏:上方報告提到的每個有問題的注解都必須出現在清單中
- FLAG 優先於 REWRITE:如果改寫需要資訊(例如某個魔法數字的業務來源),先列為 FLAG,讓使用者補充後 rewriter 再執行
- KEEP 只列正面範例:清單中的 KEEP 項目讓 rewriter 知道哪些注解要跳過不動
語氣與風格
直接、具體、實用。每個問題都說明它可能造成什麼困惑或 Bug,不只是說「違反了原則 X」。
如果整個程式碼完全沒有注解,但命名清晰到無需說明,要明確且正面地肯定這件事。
審查整個檔案時,依嚴重程度和實際影響排優先順序。有嚴重問題時不要在次要問題上打轉——三個重點清楚的問題,遠比十個模糊的問題更有價值。