Performs comprehensive code review of a GitHub PR. Use when: user wants to review a PR, check code changes, or analyze pull request.
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 |
content=sql|migrat|schema|prisma|drizzle|typeorm|sequelize|knex|sqlalchemy|active_?record|postgres|supabase|\brls\b|row.?level.?security|create (table|policy|index)|alter table |
Postgres èšèšã»ã¯ãšãªã»ã€ã³ããã¯ã¹ã»RLSã»æ¥ç¶ç®¡ç (ç SQL / ORM DML / Markdown DB 仿§ãDB ã«é¢ããèšè¿°ããªããã°å³çµäº) |
ponytail-reviewer |
always |
éå°èšèš: äžèŠãªäŸåã»æšæž¬çæœè±¡ã»stdlib/ãã€ãã£ãæ©èœã®åå®è£ ã»ççž®å¯èœãªããžã㯠(ãåããããã®ã¿ãæ£ããã»ã»ãã¥ãªãã£ã»æ§èœã¯æ±ããªã) |
meta-reviewer |
always |
ã¡ã¿èªç¥: åé¡èšå®ã»åæã»æ§é (çç¶å¯ŸåŠã«ãªã£ãŠããªãã / äžæµã«è»œãè§£ã¯ãªãã / ããããããã¹ãã)ãææã¯ scope: PR ã® PR-level ãããã¯ã®ã¿ã§ãè¡åäœææã¯ããªã |
trigger åã®å€:
always â ç¡æ¡ä»¶ã§èµ·åpaths=<glob...> (çç¥å¯ã§ ; exclude_paths=<glob...>) â paths ã®ãããããå·®åãã¡ã€ã«ã«ãããããexclude_paths ã«ãããããªããšãèµ·åextensions=<.ext...> â å·®åãã¡ã€ã«ã®æ¡åŒµåã®ããããã該åœãããšãèµ·åcontent=<regex> â gh pr diff ã®çåºå (ãã¡ã€ã«ãã¹å«ã) ã« regex ã 倧æåå°æåç¡èŠ ã§ããããããšãèµ·åãdiff å
šæå
¥ãããã³ããããå³çµäºãã®ããã ãã«éãããŒã¯ã³æµªè²»ãé²ãèµ·ååã²ãŒããå¢çãææ§ãªã regex ãç·©ãã«æžã (誀起å 1 äœåã®ã³ã¹ãã¯åãããŒãããå®ã)æ°ãã芳ç¹ã®è¿œå = æ¢åãšãŒãžã§ã³ã (äŸ: @.claude/agents/code-reviewer.md) ãææ¬ã« .claude/agents/<芳ç¹>-reviewer.md ãäœãããã®è¡šã« 1 è¡è¿œå ããã
$ARGUMENTS
åªå é :
^\d+$ / ^#\d+$): gh pr diff <çªå·>github.com ãå«ã): URL ããçªå·æœåº â gh pr diffgh pr view --json number --jq '.number' ã§çŸãã©ã³ãããèªåæ€åº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 \
--jq '[.[] | {path, line, side, body, user: .user.login}]'
gh api repos/{owner}/{repo}/pulls/{number}/reviews \
--jq '[.[] | {state, body, user: .user.login}]'
comments / reviews 㯠--jq ã§å¿
ãçµããç JSON 㯠diff_hunkã»åçš® URLã»user ãªããžã§ã¯ãã»reactions çã倧åãå ããéè€ææã®åé¿ã«å¿
èŠãªã®ã¯äžèšãã£ãŒã«ãã ãããã®åºå㯠Phase 2 ã§å
šãšãŒãžã§ã³ãã«è€è£œããããããçµããªããšãšãŒãžã§ã³ãæ°ã¶ãããŒã¯ã³ã浪費ããã
å·®åã空ãªããã¬ãã¥ãŒå¯Ÿè±¡ã®å·®åããããŸããããšå ±åããŠçµäºããã
.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> ã®çåºå (ãã³ã¯ããã蟌ã¿) ãæŽåœ¢ããã«åã蟌ãã
ããšãŒãžã§ã³ãäžèЧãåè¡ã® trigger ãè©äŸ¡ãã â paths= / extensions= 㯠.files[].path ã«å¯ŸããŠãcontent= 㯠gh pr diff ã®çåºåã«å¯ŸããŠãèµ·åå¯Ÿè±¡ãæ±ºãŸã£ãããåäžã¡ãã»ãŒãžå
ã®ç¬ç«ãã Agent ããŒã«åŒã³åºãã§äžŠåèµ·åãããåãšãŒãžã§ã³ããžæž¡ã prompt ã¯æ¬¡ã®ç¯æ§æã«ãã:
## PR ã¡ã¿
<ã¿ã€ãã« / æ¬æ / ããŒã¹ã»ããããã©ã³ãå>
## å·®å
<gh pr diff ã®çåºåããã³ã¯ããã蟌ã¿ã§è²Œã>
## æ¢åã³ã¡ã³ã
<Phase 1 ã§ --jq çµãèŸŒã¿æžã¿ã® comments / reviews åºå>
## åºåãã©ãŒããã
<@.claude/skills/review-pr/output-format.md ã®æ¬æãäžžããšè²Œã>
## åºåãã©ãŒããã ç¯ã¯å
š reviewer å
±éã®æ§é åã¹ããŒãã»éã®ã³ã³ãããŒã«ã»æ¬æããŒã³ã®åäžæ
å ±æºã§ãagent å®çŸ©åŽã«ã¯èšèŒããŠããªããæ¯å貌ãããšã
芳ç¹ã¯åãšãŒãžã§ã³ãã®ãäžæ¬¡è²¬ä»»ãã§å€§éšåã¯åé¢ãããããããŒããŒã©ã€ã³ã±ãŒã¹ã§è€æ°ãšãŒãžã§ã³ããåç®æãææããããšã¯ããããã®å Žå㯠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 ã®ãã£ã«ã¿ãä¿¡çšãã芪ãå¿ ã宿œ (çç¥äžå¯)ãå šä»¶èœã¡ãŠãææãªãããæ£åžžãªçµæã
toHaveBeenCalledWith ã§ undefined ãåžžã«æåãã¯å®ã¯å³å¯äžèŽã§å€±æããïŒãemit ãäŸå€ãæããããå®ã¯ãã³ãã©ã§æ¡ã£ãŠãã)ãåŒã£ããã£ããã³ãŒãçãèªã¿çŽããŠå€æãä¿çã«ããªãéèš â èµ·åãããšãŒãžã§ã³ãããšã«æçµãã£ã«ã¿åŸã® Findings ä»¶æ°ãæ°ãã (PR-level Finding ãå«ã)ãããŒãžæžã¿ã¯ã©ã¹ã¿ã¯é¢äžããåãšãŒãžã§ã³ãåã« 1 ä»¶ãã€èšäž (åèšã¯ã¯ã©ã¹ã¿æ° = åã®åçŽåã§ã¯ãªã)ãéæ Œåã¯éèšã«å ¥ããªã (芳å¯äºé ç¯ã«ã¯æ®ã)
scope: PR ã® Finding (è¡ã«çŽä»ããªããåé¡èšå®ã»åæã»æ§é ãžã®ææ) ã¯è¡åäœã®éçŽãšã¯å¥æ±ãã«ãã:
PR å
šäœ ãšæžãæ¬ãã§ãŒãºã®åºå (ãã£ã«ã¿åŸã®çµ±å Finding ãªã¹ã + 芳å¯äºé ãªã¹ã + éèš) 㯠Phase 4 ãš Phase 5 ã®å ¥åãšããŠåå©çšãããã
責å: Phase 3 ã®éçŽçµæãšã芪ã diff ããçæãã Overview / Key Changes ãçµã¿åãããŠããŠãŒã¶ãŒåãã®çµ±åãµããªãŒã衚瀺ããã
Summary 1 æïŒããžãã¹/ãããã¯ãèæ¯ãå«ãå¹³æãªè¡šçŸïŒãš Type/Scope/Impact/Size ã®è¡šãèšèŒãããã¬ãã¥ã¢ãŒã 5 ç§ã§ PR ãçè§£ã§ããããšãçãã芪ã PR ã¿ã€ãã«ã»æ¬æã»diff ãµããªããçæãã (ãšãŒãžã§ã³ãåºåã¯äœ¿ããªã)ã
ãã¡ã€ã«ããšã«èªã¿ç©ãšããŠè§£èª¬ãããã¬ãã¥ã¢ãŒãå·®åãéãåã«å šäœåãææ¡ã§ããããã«ããã芪ã diff ããçæãã (ãšãŒãžã§ã³ãåºåã¯äœ¿ããªã)ã
#### N. èŠåºãããã㯠(Markdown ã®ãã³ããŒããªã¹ãã¯äœ¿ããªã)#### N. + 倪åããã¯ã¯ã©ãŒãã®ãã¡ã€ã«ãã¹ + (new)/(modified)/(deleted)/(renamed)> ãããã¯ã¯ã©ãŒãã§å²ãPhase 3 (æçµãã£ã«ã¿åŸ) ã®çµ±å Finding ãªã¹ããããŒãã«åœ¢åŒã§åºã (ç®æ¡æžãäžå¯)ãææããªãå Žåã¯æ¬æã« No findings. ãšæžã (空ããŒãã«ã¯æç»ããªããã»ã¯ã·ã§ã³èªäœã¯çç¥ããªã)ãå
šä»¶éæ Œã§ç©ºã«ãªã£ãå Žåãåãæ±ãã§ãéæ Œä»¶æ°ã䜵èšãããšã㯠No findings. (X ä»¶ã芳å¯äºé
ã«éæ Œ) ã®åœ¢ã
åè¡ã«å«ããå:
priority ãçµµæåä»ãã§è¡šç€º: ðŽ Critical / ð¡ Warning / ð¢ Suggestion)sourceãè€æ°ãšãŒãžã§ã³ãç±æ¥ã¯äœµèš)file (颿°å) ãã©ãŒã«ããã¯)PR-level Finding (ãã£ã«ã¿ééå) ãããå Žåã®ã¿ Findings ç¯ã®çŽåŸã«åºã (0 ä»¶ãªãèŠåºãããšçç¥)ã1 ä»¶ã〠{çµµæå} {ã¿ã€ãã«} + æ¬æã®åœ¢ã§åæãã (åãã®æç« ãäž»äœã§ããŒãã«ã«åãŸããªããããFindings ãšéãç®æ¡æžãã§è¯ã)ãã€ã³ã©ã€ã³æçš¿ã®å¯Ÿè±¡å€ã§ããããšãç¯åé ã« 1 è¡æèšããã
éæ Œãã Finding ãããå Žåã®ã¿åç¯ (ãªããã° Findings ç¯) ã®çŽåŸã«åºã (0 ä»¶ãªãèŠåºãããšçç¥)ãFindings ãšåãåã« éæ Œçç± å (ã©ã®ãã¹ãã§èœã¡ãã + 1 è¡æ ¹æ ãäŸ: ããã¹ã 1: å®å®³ãæ¡ä»¶ä»ãã§ãæžããªããããã¹ã 4: å·®åå€ â å¥ PR ã§å¯Ÿå¿ã) ãæ«å°Ÿè¿œå ãPhase 5 ã®ã€ã³ã©ã€ã³æçš¿å¯Ÿè±¡ã«ã¯å«ããªãã
ðŽ Critical / ð¡ Warning / ð¢ Suggestion ã® 3 è¡ã®ã¿ (ãèšãè¡ãªã)åèš (ããªã¬ãŒã§é€å€ãããšãŒãžã§ã³ãã®åã¯åºããªã)postgres-reviewer ã DB èšè¿°ãªãã§å³çµäºããå Žåããèµ·åã㊠0 ä»¶ãæ±ãã§åãæ®ãåèš ã¯ã¯ã©ã¹ã¿æ° (åã®åçŽåã§ã¯ãªã)çµ±åãµããªãŒæç€ºåŸããŠãŒã¶ãŒã«æçš¿å¯Ÿè±¡ã®ææçªå·ãå°ãã (äŸ: 1,3,5 / all / skip)ã
skip â 衚瀺ã®ã¿ã§çµäºçªå·ãå°ããéããã©ãŒã«ããã¯ææ (<颿°å> 圢åŒã§è¡çªå·æªç¢ºå®) ã¯ã€ã³ã©ã€ã³æçš¿äžå¯ãªã®ã§ããã®çªå·ã (æçš¿äžå¯: è¡çªå·æªç¢ºå®) ãšæç€ºãããäŸ: æçš¿å¯èœ: 1,2,4 / æçš¿äžå¯: 3 (è¡çªå·æªç¢ºå®ã®ãã Findings ããŒãã«ã«ã®ã¿æ®ã)ã
ææããŒãã« 1 è¡ = 1 ã€ã³ã©ã€ã³ã³ã¡ã³ãã
path â ãã¡ã€ã«:è¡ ã®ãã¡ã€ã«éšåline â å
ãã¡ã€ã«ã®çµ¶å¯Ÿè¡çªå· (diff ãã³ã¯å
ã®çžå¯Ÿäœçœ®ã§ã¯ãªã)side: "RIGHT" ã®ãšã PR é©çšåŸ (head) ã®çµ¶å¯Ÿè¡çªå·ãside: "LEFT" ã®ãšã PR é©çšå (base) ã®çµ¶å¯Ÿè¡çªå·file (function_name) ãã©ãŒã«ããã¯) ã¯ã€ã³ã©ã€ã³æçš¿äžå¯ãéžæè¢ããé€å€ããPhase 4 ã® Findings ããŒãã«ã«ã¯æ®ãside â 远å /倿Žè¡ã¯ RIGHTãåé€è¡ã¯ LEFTbody â ãšãŒãžã§ã³ããè¿ãã ã¿ã€ãã« + æ¬ææ®µèœ ããã®ãŸãŸäœ¿ããæŽåœ¢ããªã:{çµµæå} {äžæãµããª}
{æ¬æ: èªç¶ãªæç« }
{å¿
èŠãªãä¿®æ£æ¡ã³ãŒããããã¯}
**Critical** ç) ã¯åé ã®çµµæåã§è¡šçŸæžã¿ãªã®ã§ã³ã¡ã³ãæ¬æã§ã¯ç¹°ãè¿ããªããææããŒãã« (Phase 4) ã§åªå
床ã»åºå
žã¯å¥éæ
ä¿ããã```suggestion ãããã¯)ããšãŒãžã§ã³ããè¿ããä¿®æ£æ¡ã³ãŒããããã¯ããã®åœ¢åŒã«å€æãã:line (åäžè¡) ãŸã㯠start_line + line (ç¯å²) ã«å¯Ÿããå®å
šçœ®æãšããŠè§£éããããããã³ã¡ã³ãã® line/side ããã®ãŸãŸçœ®æç¯å²ã«ãªãããšãŒãžã§ã³ããç¯å²ææ (start_line ãæã€) ãè¿ããå Žåã¯ããã䜿ã```ts ç) ã§è¿ããŠããå Žåã¯å€æããã«ãã®ãŸãŸæçš¿ãã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 | ããžãã¯ã®éè€ | å
±éãã«ããŒã«æœåºãã |
åºå
žåã«ã¯åé ããŒãã«ã® `ãšãŒãžã§ã³ãå` ããã®ãŸãŸå
¥ãã (äžèšã¯äŸç€º)ã
### åæã»æ§é ãžã®åã
PR-level Finding (ãã£ã«ã¿ééå) ã®ã¿èŒãã (0 ä»¶ãªãæ¬ç¯ããšçç¥)ãã€ã³ã©ã€ã³æçš¿ã®å¯Ÿè±¡å€ã
- ð¡ **ãªã»ããããŒã¯ã³ã®åçºè¡ãããŒã Description ã«èŠåœãããªã** â æéåãããŒã¯ã³ããšã©ãŒã«ããå¯ŸåŠ (çç¶) ã¯åŠ¥åœã ããæéåãã«è³ããŠãŒã¶ãŒãå€ããªãæå¹æéã®èšå®å€ãã®ãã® (äžæµ) ãèŠçŽãéžæè¢ããããèšå®å€ã®æ ¹æ ã¯æ€èšæžã¿ã
### 芳å¯äºé
éæ Œãã 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 |