| name | review-pr |
| description | Comprehensive PR review with parallel multi-agent analysis, optional inline comment posting |
| disable-model-invocation | true |
Review PR
GitHub PR ã«å¯ŸããŠäžèšããšãŒãžã§ã³ãäžèЧãã®ã¬ãã¥ã¢ãŒã trigger ã«åŸã£ãŠäžŠåèµ·åããçµ±åãµããªãŒãæç€ºãããæ¿èªãããã° Pending Review ãšããŠã€ã³ã©ã€ã³ã³ã¡ã³ããæçš¿ããã
åŒæ°è§£æ â å·®åååŸ â ããªã¬ãŒè©äŸ¡ â ãšãŒãžã§ã³ã䞊å â ææã®éçŽ â çµ±åãµããªãŒ â ç¢ºèª â Pending Review æçš¿
ãšãŒãžã§ã³ãäžèЧ
ãã©ã®ãšãŒãžã§ã³ããã©ã®æ¡ä»¶ã§èµ·åããããã®å¯äžã®æåšã芳ç¹ã远å ã»å»æ¢ãããšãã¯ãã®è¡šã«è¡ãè¶³ã/æ¶ãã ããskill æ¬æã®ä»ã®ç®æã«ã¯ãšãŒãžã§ã³ãåã»ããªã¬ãŒæ¡ä»¶ãããŒãã³ãŒãããªãã
| ãšãŒãžã§ã³ãå | trigger | äžæ¬¡è²¬ä»» |
|---|
code-reviewer | always | å質ã»èšèšã»å¯èªæ§ã»ããã©ãŒãã³ã¹ã»ãã¹ã |
security-reviewer | always | ã»ãã¥ãªãã£èåŒ±æ§ (OWASP Top 10 çãXSS / SQL injection çã®äžæ¬¡è²¬ä»»ã¯ãã) |
typescript-reviewer | extensions=.ts, .tsx, .js, .jsx, .mjs, .cjs | åå®å
šæ§ã»éåæã»JS/TS ã€ãã£ãªã (any ã®æ¿«çšçã®äžæ¬¡è²¬ä»»ã¯ãã) |
postgres-reviewer | always | Postgres èšèšã»ã¯ãšãªã»ã€ã³ããã¯ã¹ã»RLSã»æ¥ç¶ç®¡ç (ç SQL / ORM DML / Markdown DB 仿§ãDB ã«é¢ããèšè¿°ããªããã°å³çµäº) |
trigger åã®å€:
always â ç¡æ¡ä»¶ã§èµ·å
paths=<glob...> (çç¥å¯ã§ ; exclude_paths=<glob...>) â paths ã®ãããããå·®åãã¡ã€ã«ã«ãããããexclude_paths ã«ãããããªããšãèµ·å
extensions=<.ext...> â å·®åãã¡ã€ã«ã®æ¡åŒµåã®ããããã該åœãããšãèµ·å
æ°ãã芳ç¹ã®è¿œå = æ¢åãšãŒãžã§ã³ã (äŸ: @.claude/agents/code-reviewer.md) ãææ¬ã« .claude/agents/<芳ç¹>-reviewer.md ãäœãããã®è¡šã« 1 è¡è¿œå ããã
åŒæ°
$ARGUMENTS
åªå
é :
- PRçªå· (
^\d+$ / ^#\d+$): gh pr diff <çªå·>
- PR URL (
github.com ãå«ã): URL ããçªå·æœåº â gh pr diff
- åŒæ°ãªã:
gh pr view --json number --jq '.number' ã§çŸãã©ã³ãããèªåæ€åº
æé
Phase 1: æ
å ±åé
gh pr view <number> --json number,title,body,baseRefName,headRefName,files
gh pr diff <number>
gh repo view --json nameWithOwner --jq '.nameWithOwner'
gh api repos/{owner}/{repo}/pulls/{number}/comments
gh api repos/{owner}/{repo}/pulls/{number}/reviews
å·®åã空ãªããã¬ãã¥ãŒå¯Ÿè±¡ã®å·®åããããŸããããšå ±åããŠçµäºããã
.files[].path ãæ§ãã (Phase 2 ã®ããªã¬ãŒè©äŸ¡ã§äœ¿ã)ã
絶察è¡çªå·ã®åãæ¹
å reviewer agent ã¯ææããšã« å
ãã¡ã€ã«ã®çµ¶å¯Ÿè¡çªå· (= Phase 5 ã®ã€ã³ã©ã€ã³æçš¿ã«äœ¿ã line) ãè¿ãå¿
èŠããããdiff ã ãããã¯ãã³ã¯ãããã®çžå¯Ÿäœçœ®ããåãããªãã®ã§ãagent ã以äžãçµã¿åããã:
- 远å /倿Žè¡ (
side: RIGHT): ãã³ã¯ããã @@ -X,Y +A,B @@ ã® A ãèµ·ç¹ã«ããã³ã¯å
ã®ã³ã³ããã¹ãè¡ ( éå§) ãšè¿œå è¡ (+ éå§) ã 1 ã€ã«ãŠã³ãããããšã« 1 ãã€å ç®ãããåé€è¡ (- éå§) ã¯ã«ãŠã³ãããªã
- åé€è¡ (
side: LEFT): åãèŠé ã§ X ãèµ·ç¹ã«ãã³ã³ããã¹ãè¡ãšåé€è¡ãã«ãŠã³ããã远å è¡ã¯ã«ãŠã³ãããªã
- åããªãã±ãŒã¹: ãã³ã¯ã倧ããããŠèµ·ç¹ã確å®ã§ããªããšãããçæã³ãŒãçã§è¡çªå·èªäœãäžå®å®ãªãšãã¯ã
line ã®ä»£ããã« <颿°å> ãã©ãŒã«ããã¯ã§è¿ã (éçŽåŽã§ã€ã³ã©ã€ã³æçš¿å¯Ÿè±¡ããé€å€ããã)
skill ã agent prompt ã« diff å
šæãæž¡ãéã¯ãäžèšã®æ°ãæ¹ãåçŸã§ãããã gh pr diff <number> ã®çåºå (ãã³ã¯ããã蟌ã¿) ãæŽåœ¢ããã«åã蟌ãã
Phase 2: ããªã¬ãŒè©äŸ¡ãšãšãŒãžã§ã³ã䞊åå®è¡
ããšãŒãžã§ã³ãäžèЧãåè¡ã® trigger ã .files[].path ã«å¯ŸããŠè©äŸ¡ãèµ·åå¯Ÿè±¡ãæ±ºãŸã£ãããåäžã¡ãã»ãŒãžå
ã®ç¬ç«ãã Agent ããŒã«åŒã³åºãã§äžŠåèµ·åãããåãšãŒãžã§ã³ããžæž¡ã prompt ã¯æ¬¡ã®ç¯æ§æã«ãã:
## PR ã¡ã¿
<ã¿ã€ãã« / æ¬æ / ããŒã¹ã»ããããã©ã³ãå>
## å·®å
<gh pr diff ã®çåºåããã³ã¯ããã蟌ã¿ã§è²Œã>
## æ¢åã³ã¡ã³ã
<gh api ... /comments ã®åºå>
## åºåãã©ãŒããã
<@.claude/skills/review-pr/output-format.md ã®æ¬æãäžžããšè²Œã>
## åºåãã©ãŒããã ç¯ã¯å
š reviewer å
±éã®æ§é åã¹ããŒãã»éã®ã³ã³ãããŒã«ã»æ¬æããŒã³ã®åäžæ
å ±æºã§ãagent å®çŸ©åŽã«ã¯èšèŒããŠããªããæ¯å貌ãããšã
芳ç¹ã¯åãšãŒãžã§ã³ãã®ãäžæ¬¡è²¬ä»»ãã§å€§éšåã¯åé¢ãããããããŒããŒã©ã€ã³ã±ãŒã¹ã§è€æ°ãšãŒãžã§ã³ããåç®æãææããããšã¯ããããã®å Žå㯠Phase 3 ã§ããŒãžããã
ããããã倱æããŠãæ®ãã§ç¶è¡ãã倱æãããšãŒãžã§ã³ãåãçµ±åãµããªãŒã«æèšããã
Phase 3: ææã®éçŽ
責å: ãšãŒãžã§ã³ã暪æã§ Findings ãæ£èŠåã»éè€æ€åºã»ããŒãžããåŸç¶ãã§ãŒãºã䜿ãäžéããŒã¿æ§é (çµ±å Finding ãªã¹ã) ãäœãã衚瀺æŽåœ¢ã Overview/Key Changes ã®çæã¯ Phase 4ãå¯äœçšã䌎ãæçš¿ã¯ Phase 5 ã§è¡ãã
åãšãŒãžã§ã³ã㯠Findings (æ§é åææãããã¯ã®ãªã¹ã) ãè¿ããåãããã¯ã«ã¯ priority / file / line / side / ã¿ã€ãã« / æ¬ææ®µèœ / (ä»»æã®) ä¿®æ£æ¡ ãå«ãŸãã (詳现ã¯å agent å®çŸ©ã®ãåºåãã©ãŒããããç¯)ã
å agent ã¯èªåã®è²¬ä»»ç¯å²ã§ãåºããæ¹ãå®å
šãã«åããã¡ãªã®ã§ãéçŽã¯éè€é€å»ã ãã§ãªã å
šäœèгã§ã®æçµãã£ã«ã¿ ãæ
ãã
éçŽæé
-
æ£èŠå â å Finding ã {priority, file, line, side, title, body, suggestion?, source} ã®å
éšè¡šçŸã«æãããsource ã«ã¯èµ·åãããšãŒãžã§ã³ãå (code-reviewer ç) ãå
¥ãã
-
éè€æ€åº â 以äžã®ããããã«è©²åœãã Finding 矀ã 1 ã¯ã©ã¹ã¿ã«ãŸãšãã:
file + line ãå®å
šäžèŽ (ãã ãæ ¹æ¬åå ãå®å
šã«ç¬ç«ããŠãããšã â äŸ: åãè¡ã«å¶ç¶ãã»ãã¥ãªãã£è匱æ§ããšãåœåèŠçŽéåãã䞊ãã å Žå â ã¯ã¯ã©ã¹ã¿åããå¥ Finding ãšããŠæ®ããå€æåºæºã¯ äž¡ææã®ä¿®æ£ãäºãã«äŸåããªãã = çæ¹ãçŽããŠã仿¹ãæ®ãã)
file ãäžèŽããline ã ±3 è¡ä»¥å
ãã€åäžã®æ ¹æ¬åå ãæããŠãã (ã¿ã€ãã«/æ¬æãã倿)
file ãäžèŽããçæ¹ã <颿°å> ãã©ãŒã«ããã¯ã§ããçæ¹ãå颿°å
ã®çµ¶å¯Ÿè¡çªå·
-
ããŒãž â ã¯ã©ã¹ã¿å
ã§ 1 ä»¶ã®çµ±å Finding ã«ãŸãšãã:
priority: æãé«ããã® (critical > warning > suggestion) ãæ¡çš
source: å
šãšãŒãžã§ã³ãåãäœµèš (äŸ: security-reviewer, typescript-reviewer)
title: priority é«ã® Finding ã® title ã䞻軞ã«ããäœ priority åŽã«åºææ
å ±ãããã°æ¬åŒ§æžãã§è£è¶³ãã
body: priority é« â äœã®é ã§æ®µèœã䞊ã¹ããäž¡æ¹ã«åºææ
å ±ãããå Žåã®ã¿çµ±åããçæ¹ãåé·ãªå説æãªãæšãŠã
suggestion: priority é«ã® suggestion ãæ¡çšãå priority ã§äž¡æ¹ããå Žåã¯ãææè¡ããã®ãŸãŸåçŽçœ®æã§ããæ¹ããåªå
(Suggested Changes ã«å€æã§ãããã)
line / side: 絶察è¡çªå·ãæã€æ¹ãåªå
(ãã©ãŒã«ããã¯ããå
·äœç)
-
æçµãã£ã«ã¿ (éçŽåŸã²ãŒã) â ããŒãžæžã¿ã®çµ±å Finding ããšã«ã芪ãä»¥äž 4 ãã¹ããé ã«åœãŠããèœã¡ã Finding 㯠芳å¯äºé
ç¯ã«éæ ŒããPhase 5 ã®æçš¿åè£ããå€ããsub-agent ã®ãã£ã«ã¿ãä¿¡çšãã芪ãå¿
ã宿œ (çç¥äžå¯)ãå
šä»¶èœã¡ãŠãææãªãããæ£åžžãªçµæã
- å®å®³ã·ããªãªã®äžæãã¹ã â æŸçœ®ãããäœãèµ·ãããã芪ã 1 æã§èšããããã念ã®ããããäžè²«æ§ã®ããããå°æ¥ãããçè«äžãããèšããªããªãèœãšãã
- æ¡ä»¶ä»ãã¯OK: ããåæããªããçµæãããšæžãããªãåæãæç€ºããŠæ®ã (äŸ: æ»æè
å°éå¯èœãªå
éš API ã§ã® SQL injection)
- priority ãšå®å®³ãä¹é¢ããå Žå: åé€åã« priority ãåæ ¡æ£ (criticalâwarningâsuggestion) ãåé©çšãããã§ãå®å®³ãèšããªããã°èœãšã
- äœè
åå¿ã®äžæãã¹ã â PR äœè
ããããèŠãŠæãåããããã奜ã¿ã®åé¡ãããèšããªã suggestion (å¯èªæ§ã®å¥œã¿ã»ã¹ã¿ã€ã«éãã®ã¿) ã¯èœãšã
- å®ã³ãŒãäžæ¬¡è³æãã¹ã â æ ¹æ ããã³ãŒããèªãã°åŽ©ããæã蟌ã¿ãã«ãªã£ãŠããªãã (äŸ: ã
toHaveBeenCalledWith ã§ undefined ãåžžã«æåãã¯å®ã¯å³å¯äžèŽã§å€±æããïŒãemit ãäŸå€ãæããããå®ã¯ãã³ãã©ã§æ¡ã£ãŠãã)ãåŒã£ããã£ããã³ãŒãçãèªã¿çŽããŠå€æãä¿çã«ããªã
- æ¬ PR å·®åå
ãã¹ã â ä¿®æ£å¯Ÿè±¡è¡ãæ¬ PR ã®è¿œå /倿Žè¡ã«å«ãŸããŠããããå·®åå€ãžã®ææã¯æ£ãããŠãæçš¿å¯Ÿè±¡å€ããå¥ PR ã§å¯Ÿå¿ããšããŠèгå¯äºé
ã«éæ Œ
-
éèš â èµ·åãããšãŒãžã§ã³ãããšã«æçµãã£ã«ã¿åŸã® Findings ä»¶æ°ãæ°ãããããŒãžæžã¿ã¯ã©ã¹ã¿ã¯é¢äžããåãšãŒãžã§ã³ãåã« 1 ä»¶ãã€èšäž (åèšã¯ã¯ã©ã¹ã¿æ° = åã®åçŽåã§ã¯ãªã)ãéæ Œåã¯éèšã«å
¥ããªã (芳å¯äºé
ç¯ã«ã¯æ®ã)
æ¬ãã§ãŒãºã®åºå (ãã£ã«ã¿åŸã®çµ±å Finding ãªã¹ã + 芳å¯äºé
ãªã¹ã + éèš) 㯠Phase 4 ãš Phase 5 ã®å
¥åãšããŠåå©çšãããã
Phase 4: çµ±åãµããªãŒã®æç€º
責å: Phase 3 ã®éçŽçµæãšã芪ã diff ããçæãã Overview / Key Changes ãçµã¿åãããŠããŠãŒã¶ãŒåãã®çµ±åãµããªãŒã衚瀺ããã
Overview
Summary 1 æïŒããžãã¹/ãããã¯ãèæ¯ãå«ãå¹³æãªè¡šçŸïŒãš Type/Scope/Impact/Size ã®è¡šãèšèŒãããã¬ãã¥ã¢ãŒã 5 ç§ã§ PR ãçè§£ã§ããããšãçãã芪ã PR ã¿ã€ãã«ã»æ¬æã»diff ãµããªããçæãã (ãšãŒãžã§ã³ãåºåã¯äœ¿ããªã)ã
Key Changes
ãã¡ã€ã«ããšã«èªã¿ç©ãšããŠè§£èª¬ãããã¬ãã¥ã¢ãŒãå·®åãéãåã«å
šäœåãææ¡ã§ããããã«ããã芪ã diff ããçæãã (ãšãŒãžã§ã³ãåºåã¯äœ¿ããªã)ã
- èªã¿é ã¯å€æŽã®æ§è³ªã«åããã:
- å®è£
ã³ãŒãäžå¿: ããŒã¿æ§é /ãã¡ã€ã³ã¢ãã« â ã³ã¢ããžã㯠â çµ±å/ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ â UI â ãã¹ã
- ããã¥ã¡ã³ãã®ã¿: æææ±ºå® (ADR) â æŠèŠ (README) â ããŒã¿ â æ¯ãèã (API) â UI (ç»é¢)
- åãã¡ã€ã«ã¯
#### N. èŠåºãããã㯠(Markdown ã®ãã³ããŒããªã¹ãã¯äœ¿ããªã)
- èŠåºã:
#### N. + 倪åããã¯ã¯ã©ãŒãã®ãã¡ã€ã«ãã¹ + (new)/(modified)/(deleted)/(renamed)
- æ¬æ: (a) ã¢ãŒããã¯ãã£äžã®åœ¹å²ã(b) æ¬ PR ã§ã®å€æŽãšçç±ã(c) ååŸãã¡ã€ã«ãšã®ç¹ããã(d) éèªæãªèšèšå€æã»ãã¬ãŒããªã
- éèŠãªã³ãŒãã¹ããããã¯ã€ã³ã©ã€ã³ã³ã¡ã³ãä»ãã§åŒçšããClaude Code ã§ã®ã¬ã³ããªã³ã°ã®ãã
> ãããã¯ã¯ã©ãŒãã§å²ã
- ãããžã§ã¯ãåºæã®çšèªã»ç¥èªã¯ååºæã«çãè£è¶³ãã
Findings
Phase 3 (æçµãã£ã«ã¿åŸ) ã®çµ±å Finding ãªã¹ããããŒãã«åœ¢åŒã§åºã (ç®æ¡æžãäžå¯)ãææããªãå Žåã¯æ¬æã« No findings. ãšæžã (空ããŒãã«ã¯æç»ããªããã»ã¯ã·ã§ã³èªäœã¯çç¥ããªã)ãå
šä»¶éæ Œã§ç©ºã«ãªã£ãå Žåãåãæ±ãã§ãéæ Œä»¶æ°ã䜵èšãããšã㯠No findings. (X ä»¶ã芳å¯äºé
ã«éæ Œ) ã®åœ¢ã
åè¡ã«å«ããå:
- # (é£çªãPhase 5 ã§æçš¿å¯Ÿè±¡ãéžã¶çªå·ãšäžèŽ)
- åªå
床 (
priority ãçµµæåä»ãã§è¡šç€º: ðŽ Critical / ð¡ Warning / ð¢ Suggestion)
- åºå
ž (
sourceãè€æ°ãšãŒãžã§ã³ãç±æ¥ã¯äœµèš)
- ãã¡ã€ã«:è¡ (絶察è¡çªå·ããªããã°
file (颿°å) ãã©ãŒã«ããã¯)
- åé¡ (ã¿ã€ãã« + æ¬æããèŠçŽ)
- æšå¥šå¯Ÿå¿ (å
·äœçãªä¿®æ£æ¡)
芳å¯äºé
(çç¥å¯)
éæ Œãã Finding ãããå Žåã®ã¿ Findings ç¯ã®çŽåŸã«åºã (0 ä»¶ãªãèŠåºãããšçç¥)ãFindings ãšåãåã« éæ Œçç± å (ã©ã®ãã¹ãã§èœã¡ãã + 1 è¡æ ¹æ ãäŸ: ããã¹ã 1: å®å®³ãæ¡ä»¶ä»ãã§ãæžããªããããã¹ã 4: å·®åå€ â å¥ PR ã§å¯Ÿå¿ã) ãæ«å°Ÿè¿œå ãPhase 5 ã®ã€ã³ã©ã€ã³æçš¿å¯Ÿè±¡ã«ã¯å«ããªãã
éèšããŒãã«
- è¡ã¯
ðŽ Critical / ð¡ Warning / ð¢ Suggestion ã® 3 è¡ã®ã¿ (ãèšãè¡ãªã)
- å㯠Phase 2 ã®ããªã¬ãŒè©äŸ¡ã§èµ·åãæ±ºå®ãããšãŒãžã§ã³ãåã®ã¿ +
åèš (ããªã¬ãŒã§é€å€ãããšãŒãžã§ã³ãã®åã¯åºããªã)
- Findings 0 ä»¶ã®ãšãŒãžã§ã³ããåãæ®ã (ãèµ·åã㊠0 ä»¶ããšãèµ·åããªãã£ããã¯å¥)
postgres-reviewer ã DB èšè¿°ãªãã§å³çµäºããå Žåããèµ·åã㊠0 ä»¶ãæ±ãã§åãæ®ã
- ããŒãžæžã¿ã¯ã©ã¹ã¿ã¯ååºå
žåã« 1 ä»¶ãã€èšäžãã
åèš ã¯ã¯ã©ã¹ã¿æ° (åã®åçŽåã§ã¯ãªã)
- å
šä»¶éæ ŒæãéèšããŒãã«ã¯åºã (å
šã»ã« 0)ããèµ·åãææãè¿ããã芪ãã£ã«ã¿ã§å
šèœã¡ããå¯èŠåãããã
Phase 5: Pending Review æçš¿ïŒãªãã·ã§ã³ïŒ
çµ±åãµããªãŒæç€ºåŸããŠãŒã¶ãŒã«æçš¿å¯Ÿè±¡ã®ææçªå·ãå°ãã (äŸ: 1,3,5 / all / skip)ã
skip â 衚瀺ã®ã¿ã§çµäº
- ããä»¥å€ â éžã°ããææã Pending Review ã®ã€ã³ã©ã€ã³ã³ã¡ã³ããšããŠæçš¿
- submit ã¯ãŠãŒã¶ãŒã«å§ãã (Pending ç¶æ
ã®ãŸãŸæ®ã)
çªå·ãå°ããéããã©ãŒã«ããã¯ææ (<颿°å> 圢åŒã§è¡çªå·æªç¢ºå®) ã¯ã€ã³ã©ã€ã³æçš¿äžå¯ãªã®ã§ããã®çªå·ã (æçš¿äžå¯: è¡çªå·æªç¢ºå®) ãšæç€ºãããäŸ: æçš¿å¯èœ: 1,2,4 / æçš¿äžå¯: 3 (è¡çªå·æªç¢ºå®ã®ãã Findings ããŒãã«ã«ã®ã¿æ®ã)ã
ææ â ã³ã¡ã³ããžã®ãããã³ã°
ææããŒãã« 1 è¡ = 1 ã€ã³ã©ã€ã³ã³ã¡ã³ãã
æé
1. æ¢å Pending Review ãç¢ºèª (èªåãäœæãããã®ã®ã¿å¯Ÿè±¡):
ME=$(gh api user --jq .login)
gh api repos/{owner}/{repo}/pulls/{PRçªå·}/reviews \
--jq ".[] | select(.state == \"PENDING\") | select(.user.login == \"$ME\") | {id, state, user: .user.login}"
2a. Pending Review ãªã â REST API ã§æ°èŠäœæ
event ãã£ãŒã«ããçç¥ãããš pending ç¶æ
ã«ãªã (event: "PENDING" ãæç€ºãããš 422):
cat <<'PAYLOAD' | gh api repos/{owner}/{repo}/pulls/{PRçªå·}/reviews --method POST --input -
{
"comments": [
{
"path": "src/example.ts",
"line": 10,
"side": "RIGHT",
"body": "ðŽ **Critical**: SQL injection via unsanitized input\n\nUse parameterized queries."
}
]
}
PAYLOAD
2b. Pending Review ãã â GraphQL ã§ã³ã¡ã³ã远å (REST ã§ã¯æ¢å pending ã«ã³ã¡ã³ã远å äžå¯)
Node ID ååŸ â ã³ã¡ã³ã远å :
gh api graphql -f query="
{
repository(owner: \"{owner}\", name: \"{repo}\") {
pullRequest(number: {PRçªå·}) {
reviews(states: PENDING, first: 20) {
nodes { id state author { login } }
}
}
}
}" --jq ".data.repository.pullRequest.reviews.nodes[] | select(.author.login == \"$ME\")"
cat <<'GQL' | gh api graphql --input -
{
"query": "mutation($input: AddPullRequestReviewThreadInput!) { addPullRequestReviewThread(input: $input) { thread { id comments(first: 1) { nodes { id body } } } } }",
"variables": {
"input": {
"pullRequestReviewId": "PRR_kwDOxxxxxxx",
"path": "src/example.ts",
"line": 10,
"side": "RIGHT",
"body": "ã³ã¡ã³ãæ¬æ"
}
}
}
GQL
ãšã©ãŒãã³ããªã³ã°
| ã·ããªãª | å¯Ÿå¿ |
|---|
| ããããã®ãšãŒãžã§ã³ãã倱æ | æ®ãã®çµæã§ç¶è¡ãã倱æãããšãŒãžã§ã³ããæèšãã |
| Pending Review äœæå€±æ | ãšã©ãŒå
容ã衚瀺ããçµ±åãµããªãŒã¯ãŠãŒã¶ãŒã«æ®ã |
åºåãã©ãŒããã
## PR ã¬ãã¥ãŒãµããªãŒ
### æŠèŠ
> ãã¹ã¯ãŒããªã»ããæã«ãªã»ããããŒã¯ã³ã®æå¹æéãæ€èšŒããŠããªãã£ããããæéåãã®ããŒã¯ã³ã§ããªã»ãããæåããŠããŸãäžå
·åãä¿®æ£ããã
| | |
|---|---|
| **çš®å¥** | ãã°ä¿®æ£ |
| **ã¹ã³ãŒã** | èªèšŒæ©èœ â ãã¹ã¯ãŒããªã»ãããã㌠|
| **圱é¿** | æéåãã®ãªã»ãããªã³ã¯ãããããŸã§éã£ãŠããŸã£ãŠããã®ãæ£ãããšã©ãŒãšããŠè¿ãããã«ãªã |
| **èŠæš¡** | 3 ãã¡ã€ã«å€æŽã+45 / -12 è¡ |
### äž»ãªå€æŽ
#### 1. **`src/errors.ts`** (æ°èŠ)
ããããèªããèªèšŒãããŒã®å€±æã¢ãŒããåºå¥ããããã®ã«ã¹ã¿ã ãšã©ãŒã¯ã©ã¹ãšã㊠`TokenExpiredError` ãå°å
¥ãããã«ãŠã§ã¢ (#3) ã§å奿æããŠæ±çš 500 ã§ã¯ãªã 401 ãè¿ããããã«ããã
> ```ts
> // src/errors.ts:1-6
> export class TokenExpiredError extends Error {
> constructor(message = "Reset token has expired") {
> super(message);
> }
> }
> ```
auth.ts (#2) ãš middleware.ts (#3) ã®äž¡æ¹ãã import ãããã
#### 2. **`src/auth.ts`** (倿Ž)
ïŒåæ§ã®è§£èª¬ + ã³ãŒãã¹ããããåŒçšïŒ
#### 3. **`src/middleware.ts`** (倿Ž)
ïŒåæ§ã®è§£èª¬ + ã³ãŒãã¹ããããåŒçšïŒ
---
### ææäºé
| # | åªå
床 | åºå
ž | ãã¡ã€ã« | åé¡ | æšå¥šå¯Ÿå¿ |
|---|-------|------|---------|------|---------|
| 1 | ðŽ Critical | security-reviewer, typescript-reviewer | src/auth.ts:42 | ãµãã¿ã€ãºãããŠããªãå
¥åã«ãã SQL ã€ã³ãžã§ã¯ã·ã§ã³ | ãã©ã¡ãŒã¿åã¯ãšãªã䜿çšãã |
| 2 | ð¡ Warning | typescript-reviewer | src/api.ts:15 | éåæåŒã³åºãã§æªåŠçã® Promise rejection | `await` + try-catch ã§ãšã©ãŒãäŒæããã |
| 3 | ð¢ Suggestion | code-reviewer | src/utils.ts:8 | ããžãã¯ã®éè€ | å
±éãã«ããŒã«æœåºãã |
åºå
žåã«ã¯åé ããŒãã«ã® `ãšãŒãžã§ã³ãå` ããã®ãŸãŸå
¥ãã (äžèšã¯äŸç€º)ã
### 芳å¯äºé
éæ Œãã Finding ã®ã¿èŒãã (0 ä»¶ãªãæ¬ç¯ããšçç¥)ã
| # | åªå
床 | åºå
ž | ãã¡ã€ã« | åé¡ | éæ Œçç± |
|---|-------|------|---------|------|---------|
| - | ð¢ Suggestion | code-reviewer | src/utils.ts:8 | ããžãã¯ã®éè€ | ãã¹ã 4: å·®åå€ â å¥ PR ã§å¯Ÿå¿ |
### éèš
èµ·åãããšãŒãžã§ã³ãåã®åã®ã¿åºã (äŸ: TS/JS 倿Žããªã PR ã§ã¯ `typescript-reviewer` åãçç¥ãã)ã
| åªå
床 | code-reviewer | security-reviewer | typescript-reviewer | åèš |
|---|---|---|---|---|
| ðŽ Critical | 0 | 1 | 1 | 1 |
| ð¡ Warning | 0 | 0 | 1 | 1 |
| ð¢ Suggestion | 1 | 0 | 0 | 1 |