code-review
npx skills add https://github.com/cityfish91159/maihouses --skill code-review
Agent 安装分布
Skill 文档
ä»£ç¢¼å¯©æ¥ Skill
â ååï¼ä¸æ¯ã徿¸ å®ãï¼æ¯ãéè¡è³ªçããæå´èæ¨æºï¼åæ¸å¯çºè² ã
ä½¿ç¨ææ©
- 任忍è¨å®æå
- PR åä½µå
- ç¨æ¶è¦æ± review æ
è©åæ¨æºï¼å¯çºè² åï¼å´èçï¼
é è¨æ£åå¶ï¼æ²èæèææ²åé¡å°±æ£åã
åºç¤åï¼100 åï¼éé æ£åï¼ç¡ä¸é
| é¡å¥ | æ£åé ç® | æ£å |
|---|---|---|
| åºç¤æª¢æ¥å¤±æ | ||
| typecheck 失æï¼æ¯åé¯èª¤ï¼ | -20 | |
| lint é¯èª¤ï¼æ¯åé¯èª¤ï¼ | -10 | |
| lint è¦åï¼æ¯åè¦åï¼ | -5 | |
| 測試失æï¼æ¯å失æï¼ | -30 | |
ä½¿ç¨ anyï¼æ¯èï¼ |
-15 | |
ä½¿ç¨ @ts-ignoreï¼æ¯èï¼ |
-20 | |
ä½¿ç¨ as unknown asï¼æ¯èï¼ |
-15 | |
| ç忏¬è©¦å¤±æ | ||
| Log ç¡ä¸ä¸æ | -10 | |
| ææè³ææ´©æ¼ (Log) | -50 | |
| N+1 æ¥è©¢ | -30 | |
| 夿¥é©å¯«å ¥ç¡ Transaction | -40 | |
| å·¢çæ·±åº¦ > 3 | -10 | |
| æ²å¼ç¨éæ±æä»¶èææå | -20 | |
| æ¶æ§éè¦ | ||
| UI ç´æ¥å¼å« DB (Logic in UI) | -30 | |
| ç¹é Service Layer | -30 | |
| God Function (è·è²¬ä¸æ¸ ) | -20 | |
| 測試å質差 | ||
| 測試實ä½ç´°ç¯èéè¡çº | -20 | |
| Mock æ¿«ç¨ (æ²æ¸¬å°æ±è¥¿) | -20 | |
| æ·è¨ç¡æ (e.g. expect(true).toBe(true)) | -20 | |
| 忍¡å¼ (Anti-Patterns) | ||
| æ®å±ä»£ç¢¼ (註解æç代碼å¡) | -10 | |
| é度è¨è¨ (YAGNI) | -10 | |
| éè¤é 輪å (æªä½¿ç¨ç¾æ helper) | -10 | |
| è´å½ç¼ºé· | ||
| å®å ¨æ¼æ´ï¼SQLæ³¨å ¥ãXSSï¼ | -50 |
…ï¼çç¥ä¸éå §å®¹ï¼ä¿æåæ Step 7ï¼…
7.4 æ¡é辯è·ï¼Anti-Lazinessï¼
- æ»ææ¸¬è©¦ï¼åªè¦è½æ³å°ä¸ç¨®è®éæ®µä»£ç¢¼å´©æ½°çæ¹æ³ï¼å°±å¿ é æåºã
- èæå¼·å¶ï¼å¿ é å¼ç¨éæ±æä»¶çå ·é«æ®µè½èæä»£ç¢¼æåï¼æ²å¼ç¨æ£ 20 åã
Step 8ï¼æ¶æ§è忍¡å¼æª¢æ¥ï¼Architecture Guardrailsï¼
鲿¢ä»£ç¢¼è çï¼å¾æºé æä½çè¨è¨ï¼
8.1 æ¶æ§é²è·
- Logic/UI åé¢ï¼
- â å¨
.tsxä¸ç´æ¥å¯« SQL/Supabase query -> æ£ 30 å - â
å¿
é å°è£å¨
src/services/æapi/
- â å¨
- å層ååï¼
- â å端跳é BFF/API ç´æ¥æè³æåº«ï¼é¤éç¹å® RLS å ´æ¯ï¼ -> æ£ 30 å
- â God Functionï¼ä¸å彿¸åé©è+DB+éç¥+è¨ç®ï¼ -> æ£ 20 åï¼ææåï¼
8.2 測試å質審è¨ï¼Test Semantic Auditï¼
- æææ¸¬è©¦ï¼
- â
expect(true).toBe(true)æåªæ¸¬toBeDefined()-> æ£ 20 å - â æ¸¬è©¦å 滿 mockï¼æ ¹æ¬æ²æ¸¬å°é輯 -> æ£ 20 å
- â
- è¡çºé©èï¼
- â æ¸¬è©¦å¯¦ä½ç´°ç¯ï¼å¦
toHaveBeenCalledWithå §é¨ç§æå½æ¸ï¼ -> æ£ 20 å
- â æ¸¬è©¦å¯¦ä½ç´°ç¯ï¼å¦
8.3 æçµå模å¼ï¼Anti-Patternsï¼
- æ®å±ä»£ç¢¼ (Zombie Code)ï¼
- â æäº¤å å«å¤§æ®µè¢«è¨»è§£æç代碼 -> æ£ 10 å
- éè¤é 輪åï¼
- â å°æ¡å·²æ
formatDateå»èªå·±é寫 -> æ£ 10 å
- â å°æ¡å·²æ
- é度è¨è¨ (YAGNI)ï¼
- â 寫äºãæªä¾å¯è½æç¨å°ãä½ç¾å¨æ²ç¨ç忏/彿¸ -> æ£ 10 å
審æ¥å ±åæ ¼å¼ï¼å¿ é 輸åºï¼
| | 硬編碼å¯é°/Token | -50 | | | è³æéºå¤±é¢¨éªï¼äºåä¸å®æ´ï¼ | -40 | | | ç«¶æ æ¢ä»¶ | -40 | | | 彿¸å稱è實ä½ä¸ç¬¦ | -30 | | å´éç¼ºé· | | | | | æªèç Supabase/API error | -20 | | | éç弿ªèçï¼null/undefinedï¼ | -15 | | | 空é£åæªèç | -15 | | | é±å¼åè¨æªé©è | -15 | | ä¸çç¼ºé· | | | | | é¯èª¤è¨æ¯é¡¯ç¤ºæè¡ç´°ç¯çµ¦ç¨æ¶ | -10 | | | ç¼ºå° console.error æ¥èª | -10 | | | éè¡æ¸åæªæ½æå¸¸æ¸ | -5 | | | 彿¸è¶ é 50 è¡ | -5 | | | è¤éé輯ç¡è¨»è§£ | -5 | | è¼å¾®ç¼ºé· | | | | | å½å䏿¸ æ¥ | -3 | | | 坿½æ helper 使²æ½ | -3 | | | æªä½¿ç¨ç import/è®æ¸ | -2 |
忏çç´
| 忏 | çç´ | çµè« |
|---|---|---|
| 90-100 | ð¢ åªç§ | å¯åä½µ |
| 80-89 | ð¡ è¯å¥½ | ä¿®æ£å¾å¯åä½µ |
| 60-79 | ð éæ¹é² | å¿ é ä¿®æ£ |
| 0-59 | ð´ ä¸åæ ¼ | é寫 |
| <0 | â ç½é£ | æçµï¼éå´è æª¢è¨ |
Step 1ï¼çè§£æå
å°æ¯å彿¸/APIï¼åçï¼
| åé¡ | ä½ ççæ¡ |
|---|---|
| éæ®µä»£ç¢¼è¦è§£æ±ºä»éº¼åé¡ï¼ | |
| å°æå·¥å®çåªåéæ±ï¼ | |
| å®å¨ç³»çµ±ä¸æ®æ¼ä»éº¼è§è²ï¼ |
妿çä¸åºä¾ï¼å è®éæ±æä»¶ã
Step 2ï¼è¿½è¹¤è³ææµ
輸å
¥ä¾æº â [éæ®µä»£ç¢¼] â 輸åºå»å
â â â
å¯è½çå¼ï¼ å¦ä½è½æï¼ 誰使ç¨ï¼
檢æ¥ï¼
- è¼¸å ¥å¯è½æ¯ null/undefined åï¼
- è¼¸å ¥å¯è½æ¯ç©ºé£ååï¼
- è¼¸å ¥å¯è½è¶ åºé æç¯ååï¼
Step 3ï¼è³ªçåè¨
ååºææé±å¼åè¨ï¼éä¸é©èï¼
| åè¨ | æç«åï¼ | ä¸æç«æææ¨£ï¼ |
|---|---|---|
| è³æåº«ä¸å®æååæ | ||
| é£åä¸å®æå ç´ | ||
| ç¨æ¶ä¸å®å·²ç»å ¥ | ||
| ID ä¸å®åå¨ |
Step 4ï¼æ¨¡æ¬æ¥µç«¯
4.1 éçå¼
| è¼¸å ¥ | é æ | 實é | æèçï¼ |
|---|---|---|---|
| null | â /â | ||
| undefined | â /â | ||
| “” | â /â | ||
| [] | â /â | ||
| è² æ¸ | â /â |
4.2 ä½µç¼
å
©åè«æ±åæå¼å«ï¼æç¼çä»éº¼ï¼
4.3 ä¸é失æ
å·è¡å°ç¬¬ N è¡å¤±æï¼ç³»çµ±çæ
æå£æåï¼
Step 5ï¼å稱 vs 實ä½å°ç §
æè§£å½æ¸å稱ï¼éä¸é©èï¼
| åç¨±çæ®µ | æ¿è«¾ | 坦使åå°ï¼ |
|---|---|---|
| â /â | ||
| â /â | ||
| â /â |
ä»»ä½ â ç´æ¥ -30 åã
Step 6ï¼æª¢æ¥å¯ç¶è·æ§
| åé¡ | çæ¡ |
|---|---|
| å åæå¾æäººç徿åï¼ | |
| ææ²æéè¡æ¸åéè¦æ½æå¸¸æ¸ï¼ | |
| ææ²æè¤éé輯éè¦å è¨»è§£ï¼ | |
| æ¹åé裡æå½±é¿åªäºå°æ¹ï¼ | |
| ææ²æéè¤ä»£ç¢¼å¯ä»¥æ½æ helperï¼ |
Step 7ï¼çç¢ç°å¢ç忏¬è©¦ï¼Survival Testï¼
ç¨æå´èçæ¨æºæª¢è¦é段代碼å¨çç¢ç°å¢ç表ç¾ï¼
7.1 å¯è§æ¸¬æ§ï¼Observabilityï¼
- Log æä¸ä¸æåï¼
- â
console.error('Failed')-> æ£ 10 å - â
console.error('Failed', { caseId, error })
- â
- ææè³ææ´©æ¼ï¼
- â
console.log(userObject)-> æ£ 50 å - â å°åº password / token / secret -> æ£ 50 å
- â
7.2 äºå宿´æ§ï¼Data Integrityï¼
- 夿¥é©å¯«å
¥æç¨ Transaction åï¼
- â
await A; await B;(ä¸é失æè³ææä¸ä¸è´) -> æ£ 40 å - â ä½¿ç¨ Supabase RPC æå®ä¸ååæä½
- â
7.3 æè½å°é·
- N+1 æ¥è©¢ï¼
- â
items.map(async item => await db.get(item.id))-> æ£ 30 å - â
db.in('id', ids)
- â
- è¤é度ç¸å½ï¼
- â å·¢çæ·±åº¦ > 3 層 (
if { for { if { ... } } }) -> æ£ 10 å
- â å·¢çæ·±åº¦ > 3 層 (
7.4 æ¡é辯è·ï¼Anti-Lazinessï¼
- æ»ææ¸¬è©¦ï¼åªè¦è½æ³å°ä¸ç¨®è®éæ®µä»£ç¢¼å´©æ½°çæ¹æ³ï¼å°±å¿ é æåºã
- èæå¼·å¶ï¼å¿ é å¼ç¨éæ±æä»¶çå ·é«æ®µè½èæä»£ç¢¼æåï¼æ²å¼ç¨æ£ 20 åã
審æ¥å ±åæ ¼å¼ï¼å¿ é 輸åºï¼
# 代碼審æ¥å ±å
## è©åï¼XX/100 ð¢/ð¡/ð /ð´/â
## å¯©æ¥æªæ¡
- `path/to/file.ts`
## åºç¤æª¢æ¥
- typecheck: â
/â (X é¯èª¤)
- lint: â
/â (X é¯èª¤, X è¦å)
- test: â
/â (X 失æ)
- any 使ç¨: X è
- @ts-ignore: X è
## æ£åæç´°
| æ£å | åå | ä½ç½® |
| -------- | -------- | ---- |
| -XX | [åå ] | L123 |
| -XX | [åå ] | L456 |
| **總è¨** | **-XXX** | |
## å顿¸
å®
### â è´å½
1. ...
### � å´é
1. ...
### ð¡ 建è°
1. ...
## çµè«
[è½ä¸è½åä½µï¼çºä»éº¼]
å·è¡åå
- â å¿ é è·å®å ¨é¨æµç¨ï¼å³ä½¿åºç¤æª¢æ¥å¤±æ
- â å¿ é ååºææåé¡ï¼ä¸å¯éºæ¼
- â å¿ é 給åºç¸½åï¼è®ç¨æ¶ç¥é鿬¡å¯¦ä½å¹¾å
- â åé¡åå¨å°è©±æ¡ï¼ä¸è¦äºæ¹ææ°å¢æªæ¡
- â æ¯ä¸æ¥é©é½è¦å¨å°è©±æ¡ä¸å³æåç¾ï¼ä¸å¯é±ç
- â Agent é£å¯©æ ¸é½å·æ¶å¹«æè¨å¨ç¬¬ä¸è¡ï¼è¥æªéµå®ä¸è¿°ååï¼å¿ é å¨å ±åéé èªææé²ã
ð å¼·å¶æ«åæ©å¶ (Mandatory Checkpoints)
çºäºç¢ºä¿å¯©æ¥å質ï¼Agent å¿
é å¨ä»¥ä¸éæ®µçµææå¼å« notify_user æ«åå·è¡ï¼çå¾
ç¨æ¶ç¢ºèªï¼
Checkpoint Aï¼åºç¤æª¢æ¥çµæå¾
- åä½ï¼åå ±åºç¤æª¢æ¥ï¼Lint/Test/Typecheckï¼çå·è¡çµæèç®åæ£åã
- ç®çï¼è®ç¨æ¶æ±ºå®å¨åºç¤è¨æ½ä¸ç©©å®çæ æ³ä¸ï¼æ¯å¦ä»è¦é²è¡æ·±åº¦å¯©æ¥ã
Checkpoint Bï¼é輯èåè¨åæå¾ (Step 4 çµæ)
- åä½ï¼åå ± Step 1~4 çåæçµæï¼æåãåè¨ãéçæ¨¡æ¬ï¼ã
- ç®çï¼ç¢ºèª Agent å°ä»£ç¢¼æåççè§£æ£ç¢ºï¼ç³¾æ£é¯èª¤çåè¨ã
Checkpoint Cï¼ç¼ç¾è´å½å顿 (FATAL Trigger)
- æ¢ä»¶ï¼éæ¯ä¸æ¬¡æ§ç觸ç¼ãåªè¦å¯©æ¥éç¨ä¸ç¼ç¾ä»»ä½ -50 å çé ç®ï¼å¦ SQL æ³¨å ¥ãåè³æ´©æ¼ï¼ã
- åä½ï¼ç«å³æ«åï¼ä¸ç¨çå°æå¾ã
- ç®çï¼è´å½é¯èª¤å¯è½å°è´å¾çºå¯©æ¥ç¡æç¾©ï¼åªå 修復ã
ç¦æ¢äºé
- â æ²è·åºç¤æª¢æ¥å°±éå§å¯©æ¥
- â ç¼ç¾åé¡ä½ç¥éä¸å ±å
- â è·³éä»»ä½ Step
- â ä¸çµ¦åæ¸
- â 忏èé«ï¼æ²èæå°±çµ¦é«åï¼
- â ç¨ãæè©²æ²åé¡ãç¶çµè«
- â åªå ±åé¨ååé¡