Imported from shoji9x9/skills (
skills/pr-finalize-loop/SKILL.md). Install upstream withnpx skills add shoji9x9/skills --skill pr-finalize-loop. Copyright stays with the author (MIT).
Pr Finalize Loop
äœææžã¿ã® GitHub PR ããCI ãæåãæªè§£æ±ºã®ã¬ãã¥ãŒææãç¡ããªããŸã§èªåŸçã«åæããããCI 倱æã®ä¿®æ£ã»ã¬ãã¥ãŒææãžã®è¿ä¿¡ãšè§£æ±ºã»commit/pushã»èšå®ããã¬ãã¥ãŒããŒã«ãžã®åã¬ãã¥ãŒäŸé Œãšããæ±ºãŸã£ãåŸåŸ©ãã人æã§äœåºŠãç¹°ãè¿ã代ããã«ã«ãŒãã§åããPR èªäœã®äœæã¯ãã®ã¹ãã«ã®å¯Ÿè±¡å€ïŒå¥éè¡ãïŒã
ãã®åŸåŸ©ã¯ãçŽã â push â CI ãšã¬ãã¥ãŒãåã³èµ°ã â ãŸãçŽãããåæãŸã§ç¶ãããã®ã§ãæ¢ãæã誀ããšç¡éã«åãã ã ããæ¬ã¹ãã«ã¯ (1) ã«ãŒãäžã¯ãŠãŒã¶ãŒç¢ºèªãæãŸãèªåŸã§é²ããã(2) äŸå€ãšããŠäººé倿ãèŠããã¬ãã¥ãŒææã ãã¯ç¢ºèªããŠåæ åŸã«åŸ©åž°ããã(3) æå€§ååŸ©åæ°ã»è¡ãè©°ãŸãæ€ç¥ãšããå®å šåŒã§å¿ ã忢ãã ã® 3 ç¹ãåºå®ããã ã¬ãã¥ãŒå¯Ÿå¿ 1 ååã®ç¢ºèªã»è¿ä¿¡ã»è§£æ±ºã®äœæ³ã¯å§åйã¹ãã« [[pr-review-handle]] ãšåãã§ãæ¬ã¹ãã«ã¯ãããèªåŸã«ãŒããšããŠæããã
äœ¿ãæ¹
pr-finalize-loop <PR URL> [--max-iterations <N>] [--wait-ci-before-review] [--review-tool <tool>]
<PR URL>ïŒå¿ é ïŒ:https://github.com/<owner>/<repo>/pull/<çªå·>ãçªå·ã ããæž¡ãããå Žåã¯çŸåšã® repo ã® PR ãšã¿ãªã--max-iterations <N>ïŒä»»æ, æ¢å® 5ïŒ: ã«ãŒãã®æå€§ååŸ©åæ°ãç¡éã«ãŒã鲿¢ã®å®å šåŒã1 å埩ïŒãç¶æ ååŸ â CI/ã¬ãã¥ãŒãçŽã â commit/push â åå®è¡åŸ ã¡ãã® 1 åš--wait-ci-before-reviewïŒä»»æ, æ¢å®ãªãïŒ: push åŸã®åã¬ãã¥ãŒäŸé ŒããCI åå®è¡ã®å®äºãåŸ ã£ãŠããåºããæ¢å®ïŒãªãïŒã§ã¯ push çŽåŸã« CI å®äºãåŸ ããäŸé ŒããCI ãšã¬ãã¥ãŒã䞊è¡ãããïŒåæãéãããã¬ãã¥ãŒé²è¡äžïŒèšå®ããŒã«ã®èªåã¬ãã¥ãŒã»å¥ãšãŒãžã§ã³ããšãïŒã¯ä¿çããïŒãå£ãã HEAD ã«ã¬ãã¥ãŒãä¿ããããªãå Žåã ãæå®ãã--review-tool <tool>ïŒä»»æïŒ: ãã®å®è¡ã ãcopilot/claude-code/codex/noneã®ããããã䜿ããå ±æèšå®ã倿Žãããäžæçã«ã¯ã¬ãžããç¶æ³ãªã©ãžå¯Ÿå¿ãã- ã«ãŒãäžã¯ãŠãŒã¶ãŒç¢ºèªãæãŸãèªåŸã§é²ããïŒå¯äžã®äŸå€ã¯åŸè¿°ãèªåŸæ§ããªã·ãŒãã®äººé倿ãèŠããã¬ãã¥ãŒææïŒ
äŸ: pr-finalize-loop https://github.com/<owner>/<repo>/pull/6 / pr-finalize-loop 6 --max-iterations 3 / pr-finalize-loop 6 --review-tool codex
- èªç¶æã§ãçºåãã:ãPR ãæåŸãŸã§è§£æ±ºããŠããCI ãšã¬ãã¥ãŒææããªããªããŸã§åããŠããPR ã® CI ãšã¬ãã¥ãŒãåæãããŠãã
åæ
- ããŒã«:
ghïŒGitHub CLIãgh api graphql/gh pr checks/gh run viewãå«ãïŒ,git - åæã¹ãã«: ãªãïŒã¬ãã¥ãŒå¯Ÿå¿ã®äœæ³ã¯ [[pr-review-handle]] ãšå ±éã ããæ¬ã¹ãã«ã¯èªåŸçãå èµãåäœã§åãïŒ
- MCP: ãªã
- ã·ã§ã«: bashïŒPOSIX äºæã·ã§ã«ïŒãã³ãã³ãäŸã¯ bash åæã®ãããWindows ã§ã¯ WSL / Git Bash çã® bash ç°å¢ã§å®è¡ãã
- node / pnpm / python ãªã©ã®ã©ã³ã¿ã€ã ã¯äžèŠïŒCI ãçŽãããã®ä¿®æ£ã§å¯Ÿè±¡ãªããžããªã®ã©ã³ã¿ã€ã ãèŠãããšã¯ããïŒã
ãã©ã³ãéçšã»commit èŠçŽã®åç §
ãã©ã³ãéçšã»commit èŠçŽã¯ãªããžããªããšã«ç°ãªãã解決æé ïŒèšå®ãã¡ã€ã« â æšæºããã¥ã¡ã³ãæ¢çŽ¢ â ãŠãŒã¶ãŒç¢ºèªïŒãšèšå®ãã¡ã€ã« .config/skills/shoji9x9/skills.yml ã®æ±ã㯠references/conventions.md ãåç
§ããã
--amend / force push ãããªãã»é¢é£ãã¡ã€ã«ã ãã stage ããã»é·ã commit æ¬æã¯ git commit -F <file> ã§æž¡ãããšãã£ãæ±çšã®æäœã¡ã«ãã¯ã¹ã¯èŠçŽè§£æ±ºã®çµæã«äŸããåžžã«å®ãã
ã¬ãã¥ãŒããŒã«ã®éžæ
push åŸãªã©ã«åã¬ãã¥ãŒãäŸé Œãã AI ã¬ãã¥ã¢ãŒã¯ CLIã»ç°å¢å€æ°ã»å
±æèšå®ããéžã¶ã解決é ãš
ããŒã«ããšã®äŸé Œã»æç«ç¢ºèªã®å
·äœæé 㯠references/review-tool.md ãåç
§ããã
å€ã¯ copilot / claude-code / codex / noneãnone ã®å Žåã¯åã¬ãã¥ãŒäŸé Œãäžåè¡ãããåæã»å®äºå€å®ãã
ãHEAD ãã¬ãã¥ãŒæžã¿ãæ¡ä»¶ãå€ãïŒCI å
šæåã»æªè§£æ±ºã¹ã¬ããç¡ãã»ã¹ã¬ããå€ã®ææå¯Ÿå¿æžã¿ã§å®äºïŒã以éã®æ¬æã§ãã¬ãã¥ãŒäŸé Œããšèšããšãã¯
èšå®ãã review_tool ãžã®äŸé Œãæãã
èªåŸæ§ããªã·ãŒ
- ã«ãŒãäžã¯ç¢ºèªãªãã§èªåŸå®è¡ããã CI 倱æã®ä¿®æ£ã»ã¬ãã¥ãŒææã®è¿ä¿¡/解決ã»commit/pushã»ã¬ãã¥ãŒããŒã«ãžã®åäŸé ŒãããŠãŒã¶ãŒã«éäžç¢ºèªããé²ããã
- å¯äžã®äŸå€ïŒäººé倿ãèŠããã¬ãã¥ãŒææ: åŠ¥åœæ§ãã³ãŒãã ãã§ã¯å€æã§ããªãïŒä¿®æ£æ¹éãè€æ°ãã圱é¿ã倧ããïŒèšèšå€æãçµ¡ãææã¯ãåæã«çŽããã»èª€ã£ã解決ãããããã® 1 ä»¶ã ããŠãŒã¶ãŒã«å€æãä»°ãã倿ãåæ ãããïŒä¿®æ£ or äžèŠã®æ ¹æ ãè¿ä¿¡ããŠè§£æ±ºïŒã«ãŒãã«æ»ããåæãŸã§ç¶ããïŒãã®ç¢ºèªã§æã¡åããªãïŒã
- çæåã®ããŒãåæãã§ãã¯ïŒæºãããªããã°çæããäžæã»å ±åïŒãèªåŸã§ commit/push ããããã察象ãåãéãããšå±éºããã«å¿
ãå
ã«ç¢ºèªãã:
- PR ã OPEN ã§ããïŒ
MERGED/CLOSEDãªãä»äžã察象ãªããšããŠå ±åããŠçµäºãhead ãã©ã³ããæ¶ããŠããããšãããããæåã«å€å®ããïŒ - çŸåšã® repo ãš PR ã® owner/repo ãäžèŽãã
- çŸåšã®ããŒã«ã«ãã©ã³ãã PR ã® head ãã©ã³ããšäžèŽãã
- PR ã OPEN ã§ããïŒ
åºæ¬ãããŒ
çæåã®ããŒãåæãã§ãã¯ãééããããiteration = 1 ãã --max-iterationsïŒæ¢å® 5ïŒãŸã§ä»¥äžãç¹°ãè¿ãã
- ç¶æ
ååŸïŒãã®æ®µéã§ã¯ã¬ãã¥ãŒäŸé ŒãããªããåŸ
æ©ã®ééã»äžéã¯åŸè¿°ãããŒãªã³ã°ãšåŸ
æ©ãã«åŸãïŒ
- summary-firstã§ååŸãã:
references/state-query.mdãèªã¿ãreviewã»threadã»ãããã¬ãã«ã³ã¡ã³ãã»timelineã»check-runã¯compact indexãå ã«ååŸãããå šæã¯çŸåšHEADãååååŸåŸã«é å»¶å°çããæ§HEAD reviewãæªåŠçIDãæªè§£æ±ºææãã¬ãã¥ãŒå°çå€å®ã«å¿ èŠãªcheck-runåºåã ããåå¥ååŸããæªå å·¥ã®å šAPIã¬ã¹ãã³ã¹ãå埩ããšã«äŒè©±ãžè¿ããªã - PR ç¶æ
ã®å確èª:
gh pr view <çªå·> --repo <owner>/<repo> --json stateãåãçŽããOPENã§ãªããªã£ãŠãããïŒä»è ã®ããŒãž / ã¯ããŒãºçã§å¯Ÿè±¡ãæ¶æ» ïŒä»äžãå¯Ÿè±¡æ¶æ» ãšããŠåæ¢ãããçæåãã§ãã¯ã ãã§ãªãåå埩ã®åé ã§ç¢ºèªããæ¶ãã察象㮠CIã»ã¬ãã¥ãŒãåŸ ã¡ç¶ããªã - CI:
gh pr checks <çªå·> --repo <owner>/<repo> --watch --fail-fastã§å®äºãåŸ ã€ïŒããããã倱æããæç¹ã§æããïŒãpush çŽåŸã«ãã§ãã¯æªç»é²ã§no checksãšå³æã«è¿ãããšãããããããã®å Žåã¯ééã空ããŠæ°åãŸã§å確èªãã - æªè§£æ±ºã¬ãã¥ãŒã¹ã¬ãã: åŸè¿°ã® GraphQL ã
--paginateã§å šååŸãisResolved == falseã§çµãïŒå šã¬ãã¥ã¢ãŒã察象ãèè ã§çµããªãïŒ - çŸåšã® HEAD ãã¬ãã¥ãŒæžã¿ãããã¬ãã¥ãŒã»çŸåš HEAD ã®ã¬ãã¥ãŒçš check-runã»çŸåš HEAD ã®å®å šãª commit OID ãæç€ºããã¬ãã¥ãŒãããã³ã¡ã³ãããå€å®ãã ïŒåŸè¿°ãHEAD ã®ã¬ãã¥ãŒæžã¿å€å®ãïŒ
- ã¬ãã¥ãŒé²è¡äžã®æ€åº: çŸåšã® HEAD ã«å¯Ÿããé²è¡äžã®ã¬ãã¥ãŒïŒPR äœææã»push æã®èªåã¬ãã¥ãŒãå«ãïŒãé²è¡äžã®ã¬ãã¥ãŒãšãŒãžã§ã³ãããªããã確èªãã
ïŒåŸè¿°ãã¬ãã¥ãŒé²è¡äžã®æ€åºãã
review_toolã«ããæ€åºææ®µãç°ãªããnoneã¯åäŸé Œããªããããã®ä¿çèªäœãäžèŠïŒãé²è¡äžãªãäŸé Œããäžéã€ãã§çµæãåŸ ã¡ãå°çåãåæ ããŠããå€å®ãã - ã¬ãã¥ãŒå 容ãšã®æŽåæ€èšŒ: HEAD ãžã®éèè ã¬ãã¥ãŒãã³ã¡ã³ããçæããŠããã®ã« reviewThreads ããååŸã§ããªãå Žåã¯åæ ã©ã°ãšã¿ãªãã ééã空ããŠåååŸããïŒåŸè¿°ãã¬ãã¥ãŒå 容ãšã®æŽåæ€èšŒãïŒ
- ã¹ã¬ããå€ã®ææã®ååŸ: ææã¯ã¹ã¬ããã ãã§ãªãã¬ãã¥ãŒæ¬æãšãããã¬ãã«ã® PR ã³ã¡ã³ãã«ãå
¥ã
ïŒåŸè¿°ãã¹ã¬ããå€ã«çœ®ãããææïŒã¬ãã¥ãŒæ¬æã»ãããã¬ãã«ã³ã¡ã³ãïŒãïŒãã¹ã¬ãã 0 ä»¶ã»
comments.totalCount0 ã§ã æªå¯Ÿå¿ã®ææãããåŸããããHEAD ãžã®éèè ã¬ãã¥ãŒã®bodyãšããããã¬ãã«ã³ã¡ã³ããåãè©°ããã«å¿ ãèªã
- summary-firstã§ååŸãã:
- åæå€å®ïŒäŸé Œããå
ã«è©äŸ¡ããïŒ: CI ãå
šæå ã〠æªè§£æ±ºã¹ã¬ãããç¡ã ã〠ã¬ãã¥ãŒæ¬æã»ãããã¬ãã«ã³ã¡ã³ãã«æªå¯Ÿå¿ã®ææãç¡ã ã〠çŸåšã® HEAD ãã¬ãã¥ãŒæžã¿ ã〠ã¬ãã¥ãŒå
容ãšã®æŽåæ€èšŒãéé â å®äºããµããªãŒãå ±åããŠçµäºãããæ¢ã« CIã»ã¬ãã¥ãŒãæã£ã PR ã¯ãã®æç¹ã§ã¬ãã¥ãŒäŸé Œãããç¡å®³ã«çµããã
review_tool: noneã®å Žåã¯ãHEAD ãã¬ãã¥ãŒæžã¿ããæ¡ä»¶ã«ãããCI å šæåã»æªè§£æ±ºã¹ã¬ããç¡ãã»ã¹ã¬ããå€ïŒã¬ãã¥ãŒæ¬æã»ãããã¬ãã«ã³ã¡ã³ãïŒã®ææå¯Ÿå¿æžã¿ã§å®äºãšããïŒä»¥éã®äŸé Œæé ãã¹ãããïŒ- çŽè¿ã®ã¬ãã¥ãŒå¯Ÿå¿ïŒè¿ä¿¡ã»è§£æ±ºã»ã¹ã¬ããå€ã®å¯Ÿå¿èšé²ïŒã®
createdAtããåŸã®ã¬ãã¥ãŒã HEAD ã«ä»ããŠããªããªããã³ãŒã push ã®æç¡ã«ããããããHEAD ãã¬ãã¥ãŒæžã¿ããæºãããªããã®ãšããŠæ±ãïŒreview_tool: noneãé€ãïŒã æ¢å HEAD ãžã®ã¬ãã¥ãŒã¯ããã®å¯Ÿå¿ããåã«è¡ããããã®ã§ã¬ãã¥ã¢ãŒã¯å¯Ÿå¿å 容ãèŠãŠããªããæé 2 ã¯æé 4 ããåã«è©äŸ¡ãããã®ã§ãå€å®ææã¯ããã®å埩ã§ããããè¡ã察å¿ãã§ã¯ãªãçŽè¿ã®å¯Ÿå¿ããåŸã®ã¬ãã¥ãŒã®æç¡ã«ããïŒåè ã«ãããšåå埩ã®å¯Ÿå¿ãæŸããã察å¿ããååŸ©ã®æ¬¡ã§åæããŠããŸãïŒã æºãããªãå Žåã¯æé 6 ã§åã¬ãã¥ãŒãäŸé Œããæ°ããã¬ãã¥ãŒçµæãå°çãããäžéã€ãåŸ æ©ãå®äºãããŸã§åæãšå€å®ããªã - CI å
šæå ã〠æªè§£æ±ºã¹ã¬ããç¡ãã ã HEAD ãæªã¬ãã¥ãŒã®å Žåã®ã¿ïŒ
review_tool: noneãé€ãïŒãåŸè¿°ãã¬ãã¥ãŒé²è¡äžã®æ€åºããééããŠãããèšå®ããã¬ãã¥ãŒããŒã«ã«ã¬ãã¥ãŒãäŸé ŒããŠäžéã€ãã§åŸ ã€ïŒåŸè¿°ãåã¬ãã¥ãŒäŸé ŒãïŒãã¬ãã¥ãŒãä»ãã°æ¬¡ååŸ©ã§æŸããäžéãŸã§ã«ä»ããªããã°ã¬ãã¥ãŒæªçã®ãŸãŸå®äºãšããŠããã®æšãæèšããŠå ±åãã
- çŽè¿ã®ã¬ãã¥ãŒå¯Ÿå¿ïŒè¿ä¿¡ã»è§£æ±ºã»ã¹ã¬ããå€ã®å¯Ÿå¿èšé²ïŒã®
- CI 倱æã®ä¿®æ£: 倱æãããã§ãã¯ã®ãã°ãååŸïŒåŸè¿°ïŒããåå ãã³ãŒãã®äºå®ã«ç §ãããŠåæããŠä¿®æ£ãããçŽããªãïŒåã倱æãåå埩ããæ¹åããªãå Žåã¯ãè¡ãè©°ãŸããïŒåŸè¿°ã忢æ¡ä»¶ãïŒãž
- ã¬ãã¥ãŒææã®è§£æ¶ïŒ1 ä»¶ãã€ãã¹ã¬ããã»ã¬ãã¥ãŒæ¬æã»ãããã¬ãã«ã³ã¡ã³ãã® 3 系統ãã¹ãŠã察象ã«ããïŒ
- 該åœ
pathã®lineä»è¿ã Read ããææå 容ãã³ãŒãã®äºå®ã«ç §ãããŠè©äŸ¡ãã - 劥åœãã€èŠä¿®æ£ â 察象ãã¡ã€ã«ãä¿®æ£ãããäžèŠ â çŽããªãæ ¹æ ãçšæããïŒäŸ: æ¢ã«å¥ã®ä»çµã¿ã§ç·©åæžã¿ãææãäºå®ãšç°ãªããèšèšå€æãšããŠæå³çïŒ
- ã¹ã¬ããã«è¿ä¿¡ããŠãã解決ããïŒé åºå³å®ãè¿ä¿¡ããŠããªãã¹ã¬ããã¯è§£æ±ºããªãïŒ
- ã¬ãã¥ãŒæ¬æã»ãããã¬ãã«ã³ã¡ã³ãã®ææã«ã¯è¿ä¿¡å
ã®ã¹ã¬ãããç¡ãïŒ
resolveãã§ããªãïŒããããã¬ãã«ã® PR ã³ã¡ã³ãã§ãå¯Ÿè±¡ç®æã»å€æã»æ ¹æ ã»å®æž¬ãæèšããŠè¿ããä¿®æ£ããå ŽåãèŠéã£ãå Žåãæ®ã - 人é倿ãèŠããå Žåã¯ãããã§ä¿®æ£ã解決ããããŠãŒã¶ãŒã«å€æãä»°ãã倿ãåæ ããŠè¿ä¿¡ã»è§£æ±ºããããã§ã«ãŒããç¶ãã
- 該åœ
- commit / push: æé 3ã»4 ãäž¡æ¹çµããŠãããŸãšããŠè¡ããã¬ãã¥ãŒå¯Ÿå¿ã»CI ä¿®æ£ã§è§Šã£ããã¡ã€ã«ã ãã stage ããè«çåäœã§ conventional commitãpush ããïŒç¡é¢ä¿ãªå€æŽãæ··ããªãïŒãã³ãŒãä¿®æ£ãç¡ããã° commit/push ã¯ããªã
- 察å¿åŸã®è¿œåŸïŒ
review_tool: noneã®å Žåã¯ãã®æé ããšã¹ãããïŒ: ã¬ãã¥ãŒã確å®ã«èµ°ãç¶æ ã«ãããèµ·ç¹ã¯ push ã ãã§ã¯ãªãââã³ãŒãä¿®æ£ãç¡ãæé 4 ã®è¿ä¿¡ã»è§£æ±ºã»ã¹ã¬ããå€ã®å¯Ÿå¿èšé²ã ãã§çµãã£ãå埩ãããã®å¯Ÿå¿ãã¬ãã¥ã¢ãŒãèŠãŠããªãã®ã§åãã远åŸããïŒå¯Ÿå¿æžã¿ã ããåæããšããªãïŒã- push ãçºçããå埩: æ°ãã HEAD ãæªã¬ãã¥ãŒãªã®ã§äŸé ŒããããŸã push ã«é£åããèªåã¬ãã¥ãŒãçºçããŠããªããã確èªãã
ïŒåŸè¿°ãã¬ãã¥ãŒé²è¡äžã®æ€åºãã
copilotã¯ã¿ã€ã ã©ã€ã³ã® Copilot å®review_requestedã€ãã³ããclaude-code/codexã¯é²è¡äžã® bot ã¬ãã¥ãŒïŒã³ã¡ã³ãïŒãçºçããŠããã°ã¹ãã«ããã¯äŸé Œããããã®ã¬ãã¥ãŒçµæã次ååŸ©ã§æŸãã èªåã¬ãã¥ãŒãç¡ãå Žåã®ã¿ã¬ãã¥ãŒããŒã«ãžåäŸé ŒãããäŸé Œã¯ã¢ãŒããåããåŸè¿°ãã¬ãã¥ãŒé²è¡äžã®æ€åºããééããŠããè¡ããæ¢å®ã§ã¯ CI å®äºãåŸ ããã«äŸé ŒããCI åå®è¡ã®å®äºã¯æ¬¡å埩åé ã®æé 1 ã§åŸ ã€ïŒCI ãšã¬ãã¥ãŒã䞊è¡ããŠé²ãïŒã--wait-ci-before-reviewæå®æã®ã¿ãpush ã«ãã CI åå®è¡ã®å®äºãåŸ ã£ãŠãããæ°ãã HEAD ãæªã¬ãã¥ãŒã§ããã°äŸé Œããã - push ãçºçããªãå埩ïŒè¿ä¿¡ã»è§£æ±ºã»ã¹ã¬ããå€ã®å¯Ÿå¿èšé²ã ãïŒ: ãã®å埩ã§ãã®ããããè¡ã£ãŠããªããªã远åŸã¯äžèŠïŒäŸé Œããæé 7 ãžïŒãè¡ã£ãŠããã°ããªã¢ãŒãã® HEAD ã¯å€ãããæ°ã㪠CI å®è¡ãç¡ãããã
--wait-ci-before-reviewã¯é¢ä¿ããªãã ãã¬ãã¥ãŒé²è¡äžã®æ€åºããééããŠããæ¢å HEAD ã察象ã«äŸé Œãããåºæºæå»ã«ã¯ push å®äºæå»ãç¡ãã®ã§ HEAD ã³ãããã®committedDateã§ã¯ãªãã ãã®ååŸ©ã§æåŸã«æçš¿ããè¿ä¿¡ã»ã³ã¡ã³ãã®createdAtãäžéã«äœ¿ãïŒããããåã®ã¬ãã¥ãŒã¯å¯Ÿå¿ãèŠãŠããªãïŒã ãªããžããªã«å¥ã®ã¬ãã¥ãŒ botïŒCI ããèµ·åããã auto-review çïŒãååšããã ãã§ã¯ããããã¬ãã¥ãŒããŒã«äŸé Œã®ä»£æ¿ãšã¿ãªããŠçç¥ããªãïŒé²è¡äžã®å Žåã®ä¿çã»åè©äŸ¡ã¯æ€åºã«åŸããä¿çã¯çç¥ã§ã¯ãªãïŒãHEAD ãã¬ãã¥ãŒæžã¿ãªãäŸé Œããªãã®ã¯åæå€å®ã©ãããHEAD ãæªã¬ãã¥ãŒã®ãŸãŸäŸé Œèªäœãçç¥ããŠããã®ã¯ããŠãŒã¶ãŒãæç€ºçã«æç€ºããå Žåã ã
- push ãçºçããå埩: æ°ãã HEAD ãæªã¬ãã¥ãŒãªã®ã§äŸé ŒããããŸã push ã«é£åããèªåã¬ãã¥ãŒãçºçããŠããªããã確èªãã
ïŒåŸè¿°ãã¬ãã¥ãŒé²è¡äžã®æ€åºãã
- è¡ãè©°ãŸãæ€ç¥: ãã®å埩ã§ãã³ãŒãä¿®æ£ãã¬ãã¥ãŒå¯Ÿå¿ãæ°ãã«è¡ããªãã£ãããã€ãCI 倱æãåå埩ãšåãã§æ¹åããŠããªããå Žåã¯åæ¢ããïŒåŸè¿°ã忢æ¡ä»¶ãïŒ
iterationã 1 å¢ããã--max-iterationsã«éããã忢ãã
忢æ¡ä»¶
ãããã®å Žåããçµäºæã« CI ç¶æ ã»æ®ã£ãæªè§£æ±ºã¹ã¬ããã»ã¹ã¬ããå€ïŒã¬ãã¥ãŒæ¬æã»ãããã¬ãã«ã³ã¡ã³ãïŒã«æ®ã£ãææãç·åå€å®ã»ååŸ©åæ°ã»åæ¢çç±ãèŠçŽããŠå ±åãããæªè§£æ±ºã¹ã¬ãããæ®ããŠçµããå Žåã§ããèåœã®è§£æ±ºïŒäžèº«ã«å¯Ÿå¿ãã resolveïŒã¯ããªãã
- å®äº: CI ãå
šæåããæªè§£æ±ºã¹ã¬ãããç¡ããã¬ãã¥ãŒæ¬æã»ãããã¬ãã«ã³ã¡ã³ãã«æªå¯Ÿå¿ã®ææãç¡ããHEAD ãã¬ãã¥ãŒæžã¿ïŒãŸãã¯ã¬ãã¥ãŒåºçŸåŸ
ã¡ãäžéã«éããïŒã
review_tool: noneã§ã¯ HEAD ã¬ãã¥ãŒæžã¿ãåãã CI å šæåã»æªè§£æ±ºã¹ã¬ããç¡ãã»ã¹ã¬ããå€ã®ææå¯Ÿå¿æžã¿ã§å®äº - æå€§å埩å°é:
--max-iterationsïŒæ¢å® 5ïŒã«éãããæ®ã£ãŠãã CI 倱æã»æªè§£æ±ºã¹ã¬ããã»ã¹ã¬ããå€ïŒã¬ãã¥ãŒæ¬æã»ãããã¬ãã«ã³ã¡ã³ãïŒã®ææãæç€ºãã - è¡ãè©°ãŸã: åã CI 倱æãæ¹åãããæ°ãã«æãŠãæãç¡ãã倱æå 容ãšãã©ãããã°çŽããããããå ±åãã
- ä»äžã察象ãªãïŒçæåã»ãŸãã¯ã«ãŒãäžã®ç¶æ
ååŸã§æ€åºïŒ: PR ã OPEN ã§ãªãïŒ
MERGED/CLOSEDïŒãã«ãŒãäžã«ä»è ã®ããŒãž / ã¯ããŒãºã§å¯Ÿè±¡ãæ¶æ» ããå Žåãåæ§ã«åæ¢ãã - åæäžäžèŽïŒçæåã«äžæïŒ: repo äžäžèŽ / çŸåšãã©ã³ãã PR ã® head ãšäžäžèŽ
人é倿ãèŠããã¬ãã¥ãŒææã§ã®ç¢ºèªã¯åæ¢æ¡ä»¶ã§ã¯ãªãïŒå€æåæ åŸã«ã«ãŒããžæ»ãïŒã
ããŒãªã³ã°ãšåŸ æ©
åŸ æ©ã¯å¿ ãäžéãèšããŠè¡ãïŒç¡éåŸ ã¡ãšéå°ããŒãªã³ã°ã®äž¡æ¹ãé¿ããïŒãå ·äœã®ééã»åæ°ã¯ãªããžããªã® CI æèŠæéã«å¿ããŠèª¿æŽããŠããã
- CI å®äºåŸ
ã¡:
gh pr checks --watchã«å§è²ããïŒgh ãå éšã§ããŒãªã³ã°ãå®äºãŸã§ãããã¯ãããééã¯--interval <ç§>ïŒãèªåã®çééã«ãŒãã§å©ãç¶ããªãã no checksã®å確èª: push çŽåŸã®æªç»é²ã¯æ°åãŸã§å確èªããç»é²ãããªããã°ããã® HEAD ã§ã¯ CI ãèµ°ããªãããšã¿ãªã㊠CI åŸ ã¡ãæã¡åãåæå€å®ãžé²ãïŒCI ãç¡ãããšèªäœã¯å€±æã§ã¯ãªãïŒã- ã¬ãã¥ãŒåºçŸåŸ
ã¡ïŒ
--watchçžåœãç¡ãïŒ: ã¬ãã¥ãŒäŸé ŒåŸãäžå®ééã§æªè§£æ±ºã¹ã¬ãã/ã¬ãã¥ãŒã®æç¡ãåååŸããäžéãŸã§åŸ ã€ãäžéãè¶ ããããã®å埩ã¯ã¬ãã¥ãŒæªçã®ãŸãŸéããCI çã®äœæ¥ãé²ããïŒæªçãå ±åã«æ®ãïŒã - é²è¡äžã¬ãã¥ãŒã®å®äºåŸ ã¡: é²è¡äžïŒèšå®ããŒã«ã®èªåã¬ãã¥ãŒã»å¥ãšãŒãžã§ã³ããšãïŒãæ€åºããŠäŸé Œãä¿çããå Žåãäžéã€ãããŒãªã³ã°ã§åŸ ã€ãäžéãŸã§ã«å®äºããªããã°é²è¡äžã·ã°ãã«ãç¡å¹ãšã¿ãªããŠéåžžã®äŸé Œå€æã«æ»ãããã®æšãå ±åã«æ®ãïŒãã³ã°ããã¯ãŒã¯ãããŒã§åæãæ¢ããªãïŒã
é·æéå®è¡ã»ã³ã³ããã¹ãã®åŒãç¶ã
åæã¯æéãããããéäžã§ auto-compactionïŒã³ã³ããã¹ãå§çž®ïŒãèµ°ãåŸããèãããããç¶æ 㯠GitHub ã®å®äœããåãçŽãã
- åå埩㯠GitHub ã®å®ç¶æ ããåéå¯èœã«ããïŒæé 1 ã§ CI ç¶æ ãšæªè§£æ±ºã¹ã¬ãããåãçŽããæ°žç¶åæžã¿ã®è¿ä¿¡ã»è§£æ±ºããå®ç¶æ ãåæ§ç¯ã§ããïŒã
- å埩äºç®ïŒ
--max-iterationsïŒãšè¡ãè©°ãŸãæ€ç¥ã ãã¯ã¡ã¢ãªã«æ®ããããããäœå埩ç®ãã»çŽè¿ã® CI 倱æã®èŠç¹ããç°¡æœãªé²æã¡ã¢ã«æ®ããŠåéã®èµ·ç¹ã«ãããã¡ã¢ã倱ã£ãã GitHub ã®å®ç¶æ ããçŸæ³ãåå°åºããæ®äœæ¥ãç¡ããã°å®äºãšããŠå®å šåŽã«åãïŒäºç®ãææ§ãªã远å å埩ããçŸæ³ãå ±åããŠæ¢ããïŒã
gh ã¡ã«ãã¯ã¹
å
šã¬ãã¥ã¢ãŒã察象ã®ããæªè§£æ±ºã¹ã¬ãããã¬ãã¥ãŒã®ååŸæã«èè
ã§çµãå¿
èŠã¯ãªããreview_tool: copilot ã䜿ãå ŽåãCopilot ã®èè
login 㯠API ã§è¡šèšãç°ãªã
ïŒREST ã§ã¯ CopilotãGraphQL ã§ã¯ copilot-pull-request-reviewerãäŸé Œçšã¯ copilot-pull-request-reviewer[bot]ïŒãããäŸé Œã»æ€åºã§ã¯ãã®å·®ã«æ³šæããïŒè©³çŽ°ã¯ references/review-tool.mdïŒã
çæåãã§ãã¯ïŒrepo / head ãã©ã³ãã®äžèŽïŒ
gh pr view <çªå·> --repo <owner>/<repo> --json headRefName,baseRefName,url,state
git branch --show-current
stateãOPENã§ãªããã°ïŒMERGED/CLOSEDïŒãä»äžã察象ãªããšããŠå ±åããŠçµäºãããhead ãã©ã³ããå逿žã¿ã®ããšãããããããã©ã³ãäžèŽããå ã«å€å®ããã- çŸåšã® repoïŒ
gh repo view --json nameWithOwner -q .nameWithOwnerïŒãš PR ã® owner/repo ãäžèŽããªããã°äžæããã headRefNameãšçŸåšã®ãã©ã³ããç°ãªãã°ãä¿®æ£å¯Ÿè±¡ãåãéããããäžæããã
CI ç¶æ ã®ç¢ºèª
gh pr checks <çªå·> --repo <owner>/<repo> --watch --fail-fast
-
å šãã§ãã¯ã®å®äºãŸã§åŸ ã¡ããã¹ãŠæåãªãçµäºã³ãŒã 0ããããã倱æãªãé 0 ã§çµããã
-
push çŽåŸã¯ãã§ãã¯æªç»é²ã§
no checksãšå³æã«è¿ãããšãããããã®å Žåã¯ãããŒãªã³ã°ãšåŸ æ©ãã«åŸã£ãŠå確èªããã -
push çŽåŸã®
--watch峿çµäº(exit 0)ããCI å®äºããšä¿¡çšããªããforce-pushã»å push çŽåŸã¯å¿ é ãã§ãã¯ããŸã ç»é²ããããå ã«ç»é²ãããã¹ãããå°çšãã§ãã¯ïŒCodeQL skipping çïŒã ããèŠããç¬éãããã--watchã¯ãã®éåã®å®äºã§ exit 0 ããïŒå¿ é ãã§ãã¯ã¯ pending ã®ãŸãŸïŒãno checks峿è¿åŽãšå系㮠false positiveã å€å®ã¯å¿ é ãã§ãã¯ïŒcheck/signaturesçããã©ã³ãä¿è·ã§å¿ é æå®ããããã®ïŒã ããèŠãŠè¡ãã--jsonã®ãã£ãŒã«ãïŒbucket, completedAt, description, event, link, name, startedAt, state, workflowïŒã« ãå¿ é ããã瀺ããã®ã¯ç¡ããããçµã蟌ã¿ã¯--requiredãã©ã°ã§è¡ãïŒhttps://cli.github.com/manual/gh_pr_checksïŒ:gh pr checks <çªå·> --repo <owner>/<repo> --required --json name,state,bucketçµæããfailed / pending / æªç»é²ãã§åºå¥ããŠåå²ããïŒpending æ±ãã«äžžããªãïŒ:
bucketãfail/cancelã®è¡ããã: CI 倱æã確å®ããŠããã®ã§åŸ ããã«ãCI 倱æãã°ã®ååŸããžé²ããmergeStateStatusã®é·ç§»åŸ ã¡ã§ä»£çšããªãââå¿ é ãã§ãã¯ã倱æãã PR ã¯BLOCKEDã®ãŸãŸã§CLEAN/UNSTABLEã«ãªãããèµ€ã CI ã§ã¯æ¯å埩ããŒãªã³ã°äžéãŸã§ç©ºè²»ãããpendingãæ®ã: ãããŒãªã³ã°ãšåŸ æ©ãã®äžéã€ãã§å確èªããã- ãã¹ãŠé pending ã§
fail/cancelãç¡ã: CI å®äºã»æåãšã¿ãªãïŒè£å©çã«gh pr view <çªå·> --repo <owner>/<repo> --json mergeStateStatusãCLEAN/UNSTABLEã§ããããšã確èªã§ããïŒã - å¿
é ãã§ãã¯ã 0 ä»¶: å¿
é ãã§ãã¯æªç»é²ããå¿
é ãã§ãã¯ãèšå®ããŠããªããªããžããªã®ãããããè¡ãç¡ãïŒpending äžåšãšã¿ãªããªãïŒ
--requiredã§ãåãïŒã ãã®ãšãghã¯ç©ºé åãè¿ããno required checks reported on the '<branch>' branchã stderr ã«åºããŠé 0 ã§çµäºããïŒforce-push çŽåŸã®æªç»é²ã¯ãŸãã«ãã®ç¶æ ïŒã ã³ãã³ãäžåãšããŠæ±ããããã®åå²ïŒãããŒãªã³ã°ãšåŸ æ©ãã®no checkså確èªã«åŸãã
CI 倱æãã°ã®ååŸïŒä¿®æ£ã®æãããïŒ
倱æãããã§ãã¯åãšã察å¿ãã GitHub Actions run ã®å€±æãã°ãååŸããŠåå ãçµã:
gh pr checks <çªå·> --repo <owner>/<repo> --json name,state,bucket,link \
--jq '.[] | select(.bucket=="fail")'
gh run view <run-id> --repo <owner>/<repo> --log-failed # 倱æãžã§ãã®ãã°ã ã衚瀺
-
bucketã¯stateãpass/fail/pending/skipping/cancelã«åé¡ãããfailã¯FAILURE/ERRORã ãã§ãªãTIMED_OUT/ACTION_REQUIRED/STARTUP_FAILUREãå«ããããstateãçŽæ¥åæãããã倱æãåãããŒããªã ïŒãã£ã³ã»ã«ãæŸããªãor .bucket=="cancel"ïŒãlinkãã run-id ãåãã -
linkãã run-id ãåãã--log-failedã§å€±æã¹ãããã®ãã°ã«çµããåå ã¯ã³ãŒãã®äºå®ã«ç §ãããŠå€æããæšæž¬ã§åºç¯å²ãæžãæããªãã
æªè§£æ±ºã¹ã¬ããã®ååŸïŒGraphQLã»å šããŒãžååŸïŒ
threadIdïŒè§£æ±ºã«å¿
èŠïŒã»è§£æ±ºç¶æ
ã»å
é ã³ã¡ã³ãã® databaseIdïŒè¿ä¿¡ã«å¿
èŠïŒããŸãšããŠåŸããããæªè§£æ±ºã¹ã¬ãã㯠1 ããŒãžã«åãŸããªãããšããããã --paginate ã§å
šããŒãžååŸããã
gh api graphql --paginate -f query='
query($endCursor: String) {
repository(owner: "<owner>", name: "<repo>") {
pullRequest(number: <çªå·>) {
reviewThreads(first: 100, after: $endCursor) {
pageInfo { hasNextPage endCursor }
nodes {
id
isResolved
comments(first: 1) {
nodes { databaseId author { login } path line body }
}
}
}
}
}
}'
isResolved == false ã®ã¹ã¬ããã ãã 1 ä»¶ãã€åŠçãããå
é ã³ã¡ã³ãã® databaseId ãè¿ä¿¡å
ã«äœ¿ãã
è¿ä¿¡ïŒRESTïŒ
gh api --method POST \
repos/<owner>/<repo>/pulls/<çªå·>/comments/<comment-id>/replies \
-f body="<è¿ä¿¡æ¬æ>"
解決ïŒGraphQLïŒ
è¿ä¿¡ãæçš¿ããåŸã«ã¹ã¬ããã解決ãã:
gh api graphql -f query='
mutation {
resolveReviewThread(input: { threadId: "<threadId>" }) {
thread { isResolved }
}
}'
HEAD ã®ã¬ãã¥ãŒæžã¿å€å®
çŸåšã® HEADïŒææ°ã³ãããïŒãã¬ãã¥ãŒæžã¿ãã¯ã次ã®èšŒè·¡ãçŸåš HEAD ãšçªãåãããŠå€å®ãããéå»ã³ããããžã®ã¬ãã¥ãŒãå€ãå®äºã³ã¡ã³ãã§ãææ° push ãã¬ãã¥ãŒæžã¿ã«ããªãããã
gh api graphql --paginate -f query='
query($endCursor: String) {
repository(owner: "<owner>", name: "<repo>") {
pullRequest(number: <çªå·>) {
headRefOid
author { login }
reviews(first: 100, after: $endCursor) {
pageInfo { hasNextPage endCursor }
nodes { author { login } state commit { oid } }
}
}
}
}'
-
ã¬ãã¥ãŒã¯
--paginateã§å šããŒãžååŸãããèè é€å€ïŒæ¬¡é ïŒãåæã«ãããšãèè ã®è¿ä¿¡ïŒCOMMENTED ã¬ãã¥ãŒïŒãçŽè¿ã«é£ãªã£ãå Žåã« èè 以å€ã® HEAD ã¬ãã¥ãŒãlast: Nã®çªããæŒãåºããåŸããããåçºååŸã§ã¯ãæªã¬ãã¥ãŒããšèª€å€å®ããŠäžèŠãªåäŸé Œã«ã€ãªããã -
PR èè ïŒ
pullRequest.author.loginïŒã«ããã¬ãã¥ãŒã¯å€å®ããé€å€ããïŒå¿ é ïŒãã¬ãã¥ãŒã¹ã¬ãããžã®è¿ä¿¡ã¯ REST/GraphQL äžãèè ã®state: COMMENTEDã¬ãã¥ãŒãšããŠèšé²ããããã®commit.oidãè¿ä¿¡åŸã®æ°ãã HEAD ãæãåŸãïŒå®æž¬ïŒã é€å€ããªããšãä¿®æ£ â è¿ä¿¡ â pushããšããæ¬ã¹ãã«ã®æšæºãããŒãåããã³ã«ã誰ã«ãã¬ãã¥ãŒãããŠããªãæ° HEAD ããã¬ãã¥ãŒæžã¿ããšèª€å€å®ãããã¬ãã¥ãŒåäŸé ŒãæŒããã -
èè 以å€ã®ã¬ãã¥ãŒã®ããããã®
commit.oidãheadRefOidãšäžèŽããã°ãçŸåšã® HEAD ã¯ã¬ãã¥ãŒæžã¿ã -
review_tool: claude-code/codexã§ã¯ãææã 0 ä»¶ã ãšã¬ãã¥ãŒçµæããããã¬ãã«ã³ã¡ã³ããŸã㯠check-run ã ãã«èŒããreviews[]ã«ã¬ã³ãŒãèªäœãäœãããªãããšããããæ¬¡ã®ã©ã¡ãããã¬ãã¥ãŒå°çã®èšŒè·¡ãšããŠèªãã:headRefOidã ref ã«ããŠååŸãã check-run ã®ãã¡ãåç§°ã»GitHub Appã»åºåã®è¶£æšãã Claude ã®ã¬ãã¥ãŒçšãšç¢ºèªã§ããæ£åžžã«å®äºãããã®ãstatus: completedã ãã§ã¯è¶³ãããconclusionãšoutput.title/output.summaryãèªã¿ã倱æã»timeoutã»skipã»spend cap çã§ã¬ãã¥ãŒãè¡ãããªãã£ããã®ãé€å€ãã- PR èè
以å€ã®ã¬ãã¥ãŒãããã«ãããããã¬ãã«ã³ã¡ã³ãã®ãã¡ãæ¬æãã¬ãã¥ãŒå®äºãŸãã¯ã¬ãã¥ãŒçµæã瀺ããã¬ãã¥ãŒå¯Ÿè±¡ commit ãçŸåšã®
headRefOidãšäžèŽãããã®ã Codex ã¯Reviewed commitãççž® SHA ã§æžãïŒå®æž¬ïŒãããå€ãæã§è£å®ããgh api repos/<owner>/<repo>/commits/<ççž®SHA> --jq .shaã§å®å š SHA ã«è§£æ±ºããheadRefOidãšå®å šäžèŽãããã 解決倱æã»è€æ°åè£ã»äžäžèŽãworking çã®é²è¡äžããšã©ãŒã»skipãç¡é¢ä¿ãª bot ã³ã¡ã³ãã¯é€å€ãã
-
ã³ã¡ã³ãã®
created_at/updated_atãçŽè¿ push ã®åºæºæå»ããåŸãšããã ãã§ã¯ãã¬ãã¥ãŒæžã¿ã®èšŒè·¡ã«ããªããæ§ HEAD ã§éå§ããã¬ãã¥ãŒãæ°ãã push ã®åŸã«å®äºãããšæå»æ¡ä»¶ãæºããããã§ãããæ¬æã® commit ãå®å š SHA ãžè§£æ±ºã§ããªãå®äºã³ã¡ã³ãã¯ææåéãšcheck-runã®æå³ç¢ºèªã«ã¯äœ¿ããããåç¬ã§ã¯çŸåš HEAD ã®ã¬ãã¥ãŒå°çã蚌æããªãã -
check-run 㯠GitHub ã® commit ref çš endpoint ã§çŸåš HEAD ã«éå®ããŠååŸãããæ¢å®ã®
filter=latestã¯åå check-run ã®å€ãåå®è¡ãç³ãããããã® HEAD ã®å š attempt ãå€å®ããå¿ èŠãããã°filter=allãšããŒãžããŒã·ã§ã³ã䜿ã:gh api --paginate \ "repos/<owner>/<repo>/commits/<headRefOid>/check-runs?filter=all&per_page=100" \ --jq '.check_runs[] | {name, head_sha, status, conclusion, app: .app.slug, started_at, completed_at, title: .output.title, summary: .output.summary}'API 圢ç¶ã¯ GitHub ã® check runs REST APIãClaude Code Review ã®ææ 0 ä»¶æã®åºå㯠Claude Code Review å ¬åŒããã¥ã¡ã³ã ãåç §ããã
-
äžã®èšŒè·¡ãããããç¡ããã°ææ° HEAD ã¯æªã¬ãã¥ãŒãã¬ãã¥ãŒæžã¿ãšå€å®ããåŸããã¬ãã¥ãŒæ¬æã»ãããã¬ãã«ã³ã¡ã³ãã»check-run ã®åºåã«æªå¯Ÿå¿ã®ææã倱æããªãããåŸç¶ã®åéã»æŽåæ€èšŒã§ç¢ºèªããããå°çããããšãææãç¡ãããåäžèŠããªãã
-
åæå€å®ã§ã¯ãã®ãHEAD ã¬ãã¥ãŒæžã¿ããæ¡ä»¶ã«å«ããïŒ
review_tool: noneãé€ãïŒãæ¢æžã¿ãªãã¬ãã¥ãŒäŸé ŒãããªãïŒæ¢å®äº PR ã«äœèšãªã¬ãã¥ãŒæŽ»åãèµ·ãããªãïŒã
ã¬ãã¥ãŒå 容ãšã®æŽåæ€èšŒïŒã¹ã¬ããåæ ã©ã°ïŒ
ã¬ãã¥ãŒ submit çŽåŸã¯ãã¬ãã¥ãŒèªäœïŒreviewsïŒã¯ååŸã§ããã®ã« reviewThreads ãžã®ã³ã¡ã³ãåæ ãé
ããããšãããïŒå®æž¬ïŒã
æªè§£æ±ºã¹ã¬ãã 0 ä»¶ã ããæ ¹æ ã«ãææãªãããšå€å®ãããšãã³ã¡ã³ãä»ãã¬ãã¥ãŒãåãããŒãã
ã¬ãã¥ãŒã®ååŸã¯ãHEAD ã®ã¬ãã¥ãŒæžã¿å€å®ããšåãå
šããŒãžååŸã¯ãšãªãæµçšããnodes ã« comments { totalCount } ãš body ã
å ã㊠1 åã®ã¯ãšãªã§äž¡æ¹ãå€å®ããã
- HEAD ãžã®éèè
ã¬ãã¥ãŒã®
comments.totalCountïŒCopilot ã¯ã¬ãã¥ãŒæ¬æã®ãgenerated N commentsãã§ã確èªã§ããã»å®æž¬ïŒã 1 以äžãªã®ã«ã ãã®ã¬ãã¥ãŒç±æ¥ã®ã³ã¡ã³ãã reviewThreads ããååŸã§ããªãå Žåã¯åæ ã©ã°ãšã¿ãªããééã空ããŠåååŸãïŒãããŒãªã³ã°ãšåŸ æ©ãã®äžéã«åŸãïŒã æŽåãåãããŸã§åæå€å®ããªãã - äžéãŸã§ã«æŽåããªãå Žåã¯ãã¹ã¬ããæªåæ ã®å¯èœæ§ããæ®äœæ¥ãšããŠæèšããŠå ±åããïŒé»ã£ãŠãææãªãããšçµè«ããªãïŒã
ã¹ã¬ããå€ã«çœ®ãããææïŒã¬ãã¥ãŒæ¬æã»ãããã¬ãã«ã³ã¡ã³ãïŒ
ææãèŒãå Žæã¯ã¹ã¬ããã ãã§ã¯ãªãã åé察象㯠3 系統ããââã¬ãã¥ãŒã¹ã¬ããïŒreviewThreadsïŒã
ã¬ãã¥ãŒæ¬æïŒreviews[].bodyïŒããããã¬ãã«ã® PR ã³ã¡ã³ãïŒissues/<çªå·>/commentsïŒã
åŸãã® 2 系統㯠reviewThreads ã«ã comments.totalCount ã«ãçŸããªããããæªè§£æ±ºã¹ã¬ãã 0 ä»¶ã»çæã³ã¡ã³ã 0 ä»¶ã§ã
æªå¯Ÿå¿ã®ææãæ®ãåŸãã宿ž¬ãããŠãã圢㯠2 éã:
- ã¬ãã¥ãŒæ¬æ: Copilot ã¯èªä¿¡åºŠã®äœãææãæ¬æã®
<details>å ãž### Comments suppressed due to low confidence (N)ãšããŠæ ŒçŽãã ãããã«ã¯Comments generated: 0 newãšæžããæ¬æåé ã«ã¯### ð¡ Not ready to approveã®ãããªç·åå€å®ãå ¥ãã - ãããã¬ãã«ã³ã¡ã³ã: Claude GitHub ActionïŒ
review_tool: claude-codeïŒã¯ç·è©ãšè»œåŸ®ãªææããããã¬ãã«ã³ã¡ã³ãã«çœ®ããreviews[].bodyã¯ç©ºã»stateã¯COMMENTEDã«ãªãããã®åœ¢ã§ã¯ææãã¹ã¬ããã«ãæ¬æã«ãçŸããªãã
# 2 系統ç®: ã¬ãã¥ãŒæ¬æ
gh api --paginate repos/<owner>/<repo>/pulls/<çªå·>/reviews \
--jq '.[] | select(.commit_id=="<headRefOid>") | {id, user: .user.login, state, body}'
# 3 系統ç®: ãããã¬ãã«ã³ã¡ã³ãïŒæ¬æã¯åãè©°ããªãïŒ
gh api --paginate repos/<owner>/<repo>/issues/<çªå·>/comments \
--jq '.[] | {id, login: .user.login, type: .user.type, created_at, updated_at, body}'
- HEAD ãžã®éèè
ã¬ãã¥ãŒã®
bodyãæ¯å埩èªããstateãCOMMENTEDã§ãæ¬æã«ææã»ç·åå€å®ãå ¥ãã - ãããã¬ãã«ã³ã¡ã³ããæ¯å埩èªãã ãšãã«
review_toolã mention æ¹åŒïŒclaude-code/codexïŒã®ãšãã¯ã ã¬ãã¥ã¢ãŒãç·è©ã»ææãããã«çœ®ãåæã§æ±ãïŒreviews[].bodyã空ã§ãææã¯ããïŒã 察象ã¯èªåïŒPR èè ãæ¬ã¹ãã«ã®äŸé Œã³ã¡ã³ãã察å¿èšé²ãå«ãïŒä»¥å€ã®æçš¿ãã¹ãŠãselect(.user.type=="Bot")ã§ bot ã«çµããªãââ人éã¬ãã¥ã¢ãŒãç·è©ããããã¬ãã«ã«çœ®ãããšããããçµããšåãããŒãã.user.type㯠bot ã人ãã®åºå¥ã«äœ¿ãã ãã§ãåé察象ã®çµãèŸŒã¿æ¡ä»¶ã«ã¯ããªãã - åãè©°ããã«èªãã ãã¬ãã¥ãŒé²è¡äžã®æ€åºãã®è£å©ã·ã°ãã«ã¯åã API ã
body: .body[:200]ã§ååŸãããã ããã¯é²è¡äžãå®äºãã®å€å®çšã§ãããææã®åéã«ãã®ååŸã䜿ãåããªãïŒ200 æåããåŸãã®ææãåãããŒãïŒã - ããã 2 ç³»çµ±ã®ææã«ã¯è¿ä¿¡å
ã®ã¹ã¬ãããç¡ã
resolveãã§ããªãããããããã¬ãã«ã® PR ã³ã¡ã³ãã§è¿ãïŒæé 4-4ïŒã 察å¿ã®èšé²ãææåŽã«æ®ããªãã®ã§ã朰ãããã©ããã¯èªåã®ã³ã¡ã³ããå¯äžã®èšŒè·¡ãšããŠæ±ãã - ã¬ãã¥ã¢ãŒã次ã©ãŠã³ãã®ç·è©ã§ååã®ææããæªå¯Ÿå¿ã®ãŸãŸããšåæ²ããããšãããïŒå®æž¬ïŒãåæ²ãæªå¯Ÿå¿ææãšããŠæ±ãã èªåã®èšŒè·¡ã³ã¡ã³ããšçªãåãããŠå¯Ÿå¿æžã¿ãã倿ããã
- ç·åå€å®ïŒ
Not ready to approveçïŒãæ®ã£ããŸãŸå®äºããå Žåã¯ãæ ¹æ ïŒã©ã®ææã«åºã¥ããã»ä¿®æ£ãããèŠéã£ããïŒãå ±åã«æèšããã å¿ é ãã§ãã¯ã«åœ±é¿ããªãå€å®ã§ãã£ãŠããŠãŒã¶ãŒãããŒãžå¯åŠã倿ããææã«ãªãã
ã¬ãã¥ãŒé²è¡äžã®æ€åº
ã¬ãã¥ãŒäŸé Œã®çŽåïŒåæå€å®æã»æé 6 ã®å¯Ÿå¿åŸã®è¿œåŸæãšãïŒãšåå埩ã®ç¶æ ååŸæã«å¿ ããã®æ€åºãè¡ããé²è¡äžãªãäŸé ŒããçµæãåŸ ã€ã 察象ã¯å¥ãšãŒãžã§ã³ãã«éããã**èšå®ããã¬ãã¥ãŒããŒã«èªèº«ã®é²è¡äžã¬ãã¥ãŒïŒPR äœææã»push æã®èªåã¬ãã¥ãŒãå«ãïŒ**ãå«ããã
-
èªåäŸé Œã·ã°ãã«ïŒã¿ã€ã ã©ã€ã³ã
review_tool: copilotã®å ŽåïŒ: ãªããžããªèšå®ã«ãã PR äœææã»push æã« Copilot ãžã®èªåã¬ãã¥ãŒäŸé Œãè¡ãããããšãããïŒå®æž¬ïŒã Copilot å®review_requestedã€ãã³ãã®created_atãåºæºæå»ãšæ¯èŒããŠçŸåšã® HEAD åããå€å®ããåºæºæå»ä»¥éã®ã€ãã³ããããã ãã€ãã® HEAD ãžã®éèè ã¬ãã¥ãŒããŸã ç¡ããã°ãäŸé Œæžã¿ã»ã¬ãã¥ãŒé²è¡äžãšã¿ãªããŠæ°ããªäŸé Œãããªãã mention æ¹åŒïŒclaude-code/codexïŒã¯review_requestedã䜿ããªããããèªåã¬ãã¥ãŒã¯äžã®è£å©ã·ã°ãã«ïŒé²è¡äžã® bot ã¬ãã¥ãŒïŒã³ã¡ã³ãïŒã§æ€åºãããgh api --paginate repos/<owner>/<repo>/issues/<çªå·>/timeline \ --jq '[.[] | select(.event=="review_requested" and .requested_reviewer.login=="Copilot")] | last | .created_at'- ææ°ã€ãã³ãã®æ¥æã ãã§ã¯å€å®ã§ããªããåºæºæå»ããåŸã®
created_atã ããèªåäŸé Œã®æ ¹æ ã«ããéå»ã® HEAD ãžã®äŸé Œã€ãã³ã ïŒPR äœææãªã©ïŒã§ãèªåäŸé Œæžã¿ããšèª€å€å®ããŠåäŸé Œãã¹ãããããªãã - åºæºæå»ã¯ãæé 6 ã® push ãçºçããå埩ã§ã¯ push å®äºçŽåŸã«èšé²ããæå»ã䜿ãã
push ãçºçããªãå埩ïŒè¿ä¿¡ã»è§£æ±ºã ãïŒã§ã¯ããã®ååŸ©ã§æåŸã«æçš¿ããè¿ä¿¡ã»ã³ã¡ã³ãã®
createdAtã䜿ã ïŒHEAD ã¯å€ãããªãã®ã§ commit æå»ã§ã¯å¯Ÿå¿åã®ã¬ãã¥ãŒãã察å¿åŸã®ã¬ãã¥ãŒããšèª€èªããïŒãã«ãŒãéå§æãªã©åºæºãèšé²ããŠããªãå Žå㯠HEAD ã³ãããã® committedDateïŒgit log -1 --format=%cIïŒãäžéãšããŠäœ¿ãïŒ--amend/force push ãè¡ããªãåæã§ push ã¯ãã以éïŒã
- ææ°ã€ãã³ãã®æ¥æã ãã§ã¯å€å®ã§ããªããåºæºæå»ããåŸã®
-
äžæ¬¡ã·ã°ãã«ïŒãã§ãã¯ã©ã³ïŒ: çŸåšã® HEAD ã®æªå®äºãã§ãã¯ã«ãå¥ãšãŒãžã§ã³ãã®ã¬ãã¥ãŒã瀺ããã®ããªãããèŠãã
gh pr checksã ãã§ãé²è¡äžã§ãªãããšçµè«ããªãã åã³ãã³ãã¯ã¬ãã¥ãŒ bot ã® check-run ãäžèЧã«åºããªãããšãããïŒå®æž¬:copilot-pull-request-reviewerãin_progressã§ãgh pr checksã® pending ã«çŸããªãïŒãpending 0 ä»¶ã¯äžåšã®èšŒæ ã«ãªããªããçŸ HEAD ã® commit check-runs endpoint ãå¿ ã䜵ããŠèŠã:check-run åã®æ±ãã¯
review_toolã§åããããããã®çµè·¯èªäœãã¹ãããããªããcopilotã¯ååãåºå®ïŒcopilot-pull-request-reviewerã»å®æž¬ïŒãªã®ã§å®å šäžèŽã§çµãã mention æ¹åŒïŒclaude-code/codexïŒã¯ååãåºå®ã§ãªãããåäžã®ååãæšæž¬ããŠæããªãããreferences/review-tool.mdãå®ãããšãã check-run ã¯ã¬ãã¥ãŒé²è¡äžã®æ±çšã·ã°ãã«ã§ããã ææ 0 ä»¶ã®ãšãçµæã check-run ã ãã«èŒããããšãããïŒåãã¡ã€ã«ã®åºå žãåç §ïŒãç §äŒèªäœãçããšã bot ã³ã¡ã³ãã䌎ããªãã¬ãã¥ãŒãäžåšãšèª€å€å®ããŠåã mention ãéè€æçš¿ãããååãåºå®ã§ãªãããŒã«ã§ã¯ çŸ HEAD ã®æªå®äº check-run ãåè£ãšããŠåããapp/name/outputã®è¶£æšããã¬ãã¥ãŒãšãŒãžã§ã³ãã®ãã®ã ãšç¢ºèªã§ãããã®ã ããæ°ãã ïŒreferences/state-query.mdã® 2 段ååŸãšåã圢ïŒã確èªã§ããªãåè£ã¯éåžžã® CI ãšããŠé€å€ããã# copilot: ååãåºå®ãªã®ã§å®å šäžèŽã§çµãã gh api --paginate "repos/<owner>/<repo>/commits/<headRefOid>/check-runs?filter=all&per_page=100" \ --jq '.check_runs[] | select(.status != "completed") | select(.name == "copilot-pull-request-reviewer") | {name, app: .app.slug, status, started_at, title: .output.title, summary: .output.summary}' # claude-code / codex: ååãåºå®ã§ããªãã®ã§æªå®äºã®åè£ãåæããapp / name / output ã§ä»åããã # çµã蟌ã¿ã¯ gh ã® --jq å ã§å®çµãããïŒå€éš jq ãžãã€ãããªããåæããŒã«ãå¢ããããgh api ã®çµäºã³ãŒããä¿ãŠãïŒã gh api --paginate "repos/<owner>/<repo>/commits/<headRefOid>/check-runs?filter=all&per_page=100" \ --jq '.check_runs[] | select(.status != "completed") | {name, app: .app.slug, status, started_at, title: .output.title, summary: .output.summary}'ããã§æ°ããã®ã¯ã¬ãã¥ãŒçš check-run ã ãã«ããã ãã® endpoint ã«ã¯éåžžã® CI ãå ¥ããããæªå®äºãç¡æ¡ä»¶ã«ã¬ãã¥ãŒé²è¡äžãšèªããšã
gh pr checksã« pending ãšããŠåºãªãç¡é¢ä¿ãª run ãåäŸé Œãç¡æéã«ææ¢ãããååã®éšåäžèŽã§æŸããªãââdependency-review/security-reviewã®ãããªéåžžã® CI ãŸã§é²è¡äžã¬ãã¥ãŒã«æ°ããŠããŸããèšå®ããreview_toolã® check-run åã«å®å šäžèŽããããoutputã®æç¡ãæ¡ä»¶ã«ããªãââé²è¡äžã® check-run ã¯output.title/output.summaryãæããªãããšãããïŒå®æž¬ïŒã åºåã¯ãå°çããã¬ãã¥ãŒãå®éã«è¡ãããããã確ãããææã§ãã£ãŠãé²è¡äžå€å®ã®å¿ é æ¡ä»¶ã§ã¯ãªããgh apiãé 0 ã§çµãã£ãã空ã®çµæããé²è¡äžãªããã®èšŒæ ã«ããªãïŒæš©éã»ref äžæ£ã»äžæç㪠API 倱æã§ã空ã«ãªãïŒã çµäºã³ãŒãã確èªãã倱æãªãäžåšãšå€å®ããã«åååŸãžåãïŒfail-closedïŒã ãé²è¡äžãªãããšçµè«ã§ããã®ã¯ãgh pr checksãšäžã® check-run ç §äŒã®äž¡æ¹ãæåããããã§ãã¬ãã¥ãŒåè£ããŒãã®ãšãã ãã ååãåºå®ã§ãªãããŒã«ã§ã¯ãã¬ãã¥ãŒåè£ãŒããã®å€æã«ä»åããèŠããããäŸé ŒçŽåŸã®ç©ºæ¯ããäžåšãšåãéããªãããã ãããŒãªã³ã°ãšåŸ æ©ãã®äžéã€ãã§ééã空ããŠæ°ååãçŽãããããã®åã§ãåè£ãåºãªãããšãšãè£å©ã·ã°ãã«ïŒé²è¡äžã® bot ã¬ãã¥ãŒïŒã³ã¡ã³ãïŒã空ã§ããããšã確ãããŠããçµè«ããã åŸ æ©äžéã®è¶ éãæ ¹æ ã«åäŸé Œãžé²ãåã«ããã®äºçµè·¯ã§é²è¡äžã·ã°ãã«ãæ¬åœã«ç¡ãããšã確ãããââ äžéã¯å®æž¬å°çæéããæ±ºããç®å®ã«ããããè¶ éããã ãã§ã¯ã¬ãã¥ãŒãæ¢ãŸã£ã蚌æ ã«ãªããªãã# review_tool: copilot ã®ãšã㯠Copilot èªèº«ã®ãã§ãã¯ãå¥ãšãŒãžã§ã³ãå€å®ããé€å€ããã # copilot 以å€ïŒclaude-code / codex / noneïŒã®ãšãã¯æ«å°Ÿã® `and .name!=...` ãå€ããé€å€ããªãã gh pr checks <çªå·> --repo <owner>/<repo> --json name,bucket,workflow \ --jq '.[] | select(.bucket=="pending" and .name!="copilot-pull-request-reviewer")'- workflow åã»ãžã§ãåãã¬ãã¥ãŒãšãŒãžã§ã³ãã瀺ããã®ïŒäŸ: workflowãClaude Reviewã/ ãžã§ã
auto-reviewïŒãpendingãªãé²è¡äžãšã¿ãªããååã¯ãªããžããªããšã«ç°ãªãããåºå®ãªã¹ãã§ã¯ãªãåç§°ãã倿ããã - é€å€ã¯
review_toolã§æ¡ä»¶ãå€ãããreview_tool: copilotã®ãšããCopilot èªèº«ã®ãã§ã㯠ïŒãã§ãã¯åcopilot-pull-request-reviewerã»å®æž¬ïŒã¯ãå¥ãšãŒãžã§ã³ããã§ã¯ãªã èšå®ããã¬ãã¥ãŒããŒã«ã®ã¬ãã¥ãŒé²è¡äžã® ã·ã°ãã«ãšããŠæ±ããããäžã®ã³ãã³ãã§é€å€ããïŒå¥ãšãŒãžã§ã³ãå€å®ããå€ãïŒãpending ãªãæ°ããªäŸé Œãããå®äºãåŸ ã€ã review_toolã copilot 以å€ïŒclaude-code/codex/noneïŒã®ãšãã¯ãCopilot ã¯èšå®ããŒã«ã§ã¯ãªãã®ã§ã pending ã® Copilot ãã§ãã¯ã¯å¥ãšãŒãžã§ã³ãã®é²è¡äžã¬ãã¥ãŒã«ãããããã®å Žåã¯é€å€ãã ïŒjq ã®and .name!="copilot-pull-request-reviewer"ãå€ãïŒé²è¡äžãšããŠæ±ããä¿çããŠå®äºãåŸ ã€ã
- workflow åã»ãžã§ãåãã¬ãã¥ãŒãšãŒãžã§ã³ãã瀺ããã®ïŒäŸ: workflowãClaude Reviewã/ ãžã§ã
-
è£å©ã·ã°ãã«ïŒbot ã®é²è¡äžã³ã¡ã³ãïŒ: ãã§ãã¯ã©ã³ãšããŠçŸããªãã¬ãã¥ãŒãšãŒãžã§ã³ãïŒcloud å®è¡çïŒåããbot ã«ããçŽè¿ã®ã³ã¡ã³ããäœæ¥äžã瀺ããŠããªãããèŠããè©äŸ¡å¯Ÿè±¡ã¯çŸåšã®å埩ïŒçŽè¿ã® push 以éïŒã«äœæã»æŽæ°ãããã¬ãã¥ãŒãšãŒãžã§ã³ãã®ã³ã¡ã³ãã ããã¬ãã¥ãŒãšç¡é¢ä¿ãª botïŒã«ãã¬ããžçïŒãå€ãã³ã¡ã³ãã¯é²è¡äžã®æ ¹æ ã«ããªãã
gh api --paginate repos/<owner>/<repo>/issues/<çªå·>/comments \ --jq '.[] | select(.user.type=="Bot") | {login: .user.login, created_at, updated_at, body: .body[:200]}'- ãã®
body: .body[:200]ã¯é²è¡äžå€å®å°çšãææã®åéã«ãã®ååŸã䜿ãåããªãïŒåè¿°ãã¹ã¬ããå€ã«çœ®ãããææããåãè©°ããåã®ææãåãããŒãïŒã - Claude GitHub Action ã¯éå§æã«ã³ã¡ã³ããäœæããå®äºæã«åãã³ã¡ã³ãããfinishedã衚èšãžç·šéããïŒé²è¡äžã¯ working 衚èšã»å®æž¬ïŒãé²è¡äžã§ãã¿ã¹ã¯ãªã¹ãã®æŽæ°çã§ç·šéãã
updated_atã¯é²ããããç·šéã®æç¡ã§å®äºãšã¿ãªããæ¬æã®è¡šèšã§å€å®ãããæèšã¯å®è£ äŸåã§å€ããåŸããããç¹å®æååã®äžèŽã§ã¯ãªãæ¬æãäœæ¥äžãå®äºãã®è¶£æšã§å€æããã
- ãã®
-
äŸé ŒçŽåŸã®ç©ºæ¯ãã«æ³šæ: æé 6 ã®äŸé ŒïŒpush ã®æç¡ãåããªãïŒã§ã¯ãå¥ãšãŒãžã§ã³ãã®ãã§ãã¯ãæªç»é²ã»éå§ã³ã¡ã³ããæªæçš¿ã®ããã§äž¡ã·ã°ãã«ã空ã«ãªãåŸãïŒ
no checksãšåãçŸè±¡ïŒãäž¡ã·ã°ãã«ã空ã§ãå³ãé²è¡äžã§ãªãããšç¢ºå®ãããééã空ããŠæ°åå確èªããŠããäŸé Œããã -
æ€åºæã®æå: ã¬ãã¥ãŒäŸé Œãåºãããäžéã€ãããŒãªã³ã°ïŒãããŒãªã³ã°ãšåŸ æ©ãïŒã§ãã§ãã¯å®äºã»ã³ã¡ã³ãã® finished åã»ã¬ãã¥ãŒå°çã®ãããããåŸ ã€ â å®äºåŸã«ãHEAD ã®ã¬ãã¥ãŒæžã¿å€å®ããšãã¬ãã¥ãŒå 容ãšã®æŽåæ€èšŒããåè©äŸ¡ â ããã§ã HEAD æªã¬ãã¥ãŒã®å Žåã ãäŸé Œããã
åã¬ãã¥ãŒäŸé Œ
review_tool: none ã®å Žåã¯äŸé ŒããªãïŒãã®æé ããšã¹ãããïŒããã以å€ã§ã¯ãçŸåšã® HEAD ãæªã¬ãã¥ãŒããã€é²è¡äžã®ã¬ãã¥ãŒïŒèšå®ããŒã«ã®èªåã¬ãã¥ãŒã»å¥ãšãŒãžã§ã³ããšãïŒãç¡ããšãã ãäŸé ŒããïŒäžã®ãHEAD ã®ã¬ãã¥ãŒæžã¿å€å®ãã»åè¿°ãã¬ãã¥ãŒé²è¡äžã®æ€åºãïŒã
push ãçºçããå埩ã§ã¯ãæ¢å®ã§ã¯ push çŽåŸïŒCI åå®è¡ã®å®äºãåŸ
ããïŒã«äŸé ŒããCI ãšã¬ãã¥ãŒã䞊è¡ãããã
--wait-ci-before-review æå®æã®ã¿ãpushã»CI åå®è¡ã®å®äºãåŸ
ã£ãŠããäŸé ŒããïŒå£ãã HEAD ã§ã¬ãã¥ãŒãä¿ããªãåŸæ¥æåïŒã
æ¢å®ã§ã¯ CI 倱æã倿ãã HEAD ã«ã¬ãã¥ãŒãä»ãåŸãããä¿®æ£ã»å push ã§æ°ãã HEAD ã«ã¬ãã¥ãŒãåäŸé Œãããããç¡å®³ã
äŸé Œãšæç«ç¢ºèªã®å
·äœæé ã¯èšå®ãã review_tool ããšã«ç°ãªãïŒreferences/review-tool.mdïŒ:
-
copilot:requested_reviewersAPI ã«copilot-pull-request-reviewer[bot]ãæž¡ããæç«ã¯ã¿ã€ã ã©ã€ã³ã® Copilot å®review_requestedã€ãã³ãã§ç¢ºèªããïŒrequested_reviewersã空ã§ãå³äžæç«ãšããªãã»å®æž¬ïŒã -
claude-code/codex: ãããã¬ãã« PR ã³ã¡ã³ãã«@claude review/@codex reviewãæçš¿ããŠäŸé Œãããæç«ã¯äŸé Œã³ã¡ã³ãã®æçš¿ãšã以éã®é²è¡äž bot ã¬ãã¥ãŒïŒã³ã¡ã³ãã»ã¬ãã¥ãŒå°çã§ç¢ºèªããã -
ã¿ã€ã ã©ã€ã³çã§ç¢ºèªã§ããªãå Žåããäžéã€ãããŒãªã³ã°ïŒãããŒãªã³ã°ãšåŸ æ©ãïŒã§ã¬ãã¥ãŒå°çèªäœãåŸ ãŠã°æç«ã確èªã§ãããã©ã¡ãã§ã確èªã§ããªããã°äžæç«ãšããŠå ±åããã
-
ã¬ãã¥ãŒãä»ããŸã§ã®åŸ æ©ã¯ãããŒãªã³ã°ãšåŸ æ©ãã®äžéã€ãããŒãªã³ã°ã«åŸãããã³ã°ãããªãã
commit ã®æ±ã
- commit message ã¯ããã©ã³ãéçšã»commit èŠçŽã®åç
§ãã§è§£æ±ºããèŠçŽã«åŸãïŒcommitlint/lefthook çã® commit-msg æ€èšŒãããã°ããã«ãåŸããbody ã®è¡é·äžéãããã°å®ããé·ãæ¬æã¯
git commit -F <file>ã§æž¡ãïŒã - ç¡é¢ä¿ãªå€æŽãåã commit ã«æ··ããªããCI ä¿®æ£ã»ã¬ãã¥ãŒå¯Ÿå¿ã§è§Šã£ããã¡ã€ã«ã ãã stage ãããæ¢å worktree ã«ç¡é¢ä¿ãªå·®åãããã°å·»ã蟌ãŸãªãã
- pre-commit ããã¯ïŒlefthook çïŒã kaizen ã®ã³ãããåã²ãŒããããã°èµ°ããã²ãŒãã§ãããã¯ããããæç€ºã«åŸã£ãŠ
kaizen --currentãå®è¡ããŠããå commit ããã - commit ã®
--amendãš force push ã¯è¡ããªãã
åŠ¥åœæ§ã®å€æã¬ã€ã
CI 倱æãã¬ãã¥ãŒææããæ©æ¢°çã«å šéšçŽãã®ã§ãå šéšã¯ããã®ã§ããªããäºå®ã«åºã¥ã㊠1 ä»¶ãã€å€æããã
- ã¬ãã¥ãŒææãã³ãŒãã®çŸç¶ãšåèŽãããã°ã»ãªã¹ã¯ã»å¯èªæ§ãªã©ã®å®å®³ãããããæ¢ã«å¥ã®ä»çµã¿ã§ç·©åæžã¿ãªããä¿®æ£ããæ ¹æ ãè¿ä¿¡ãã
- å€éšããŒã« / API / ã©ã€ãã©ãªã®ä»æ§ã«é¢ããææïŒç¹ã«ãåžžã«å£ããïŒå€±æãããç³»ïŒã¯ãé©çšåã«äžæ¬¡æ å ±ïŒå ¬åŒ docã»å®åºåã»ãã¹ãïŒã§è£åããããèªä¿¡ããããªèª€ææããã®ãŸãŸãä¿®æ£ããããšããèªäœããªã°ã¬ãã·ã§ã³ã«ãªã
- CI 倱æã¯å€±æãã°ã®äºå®ããåå ãç¹å®ããŠçŽãããã¬ãŒããŒãçãããå ŽåãããŸãåå®è¡ãåå 確èªã§åãåãããã¹ããã³ãŒãã®å®ãã°ãåãéããªã
- ä¿®æ£æ¹éãè€æ°ãã圱é¿ã倧ãããåŠ¥åœæ§ãã³ãŒãã ãã§ã¯å€æã§ããªããèšèšå€æã絡ãå Žåã¯ã人é倿ãèŠããææããšããŠæ±ãããã® 1 ä»¶ã ããŠãŒã¶ãŒã«ç¢ºèªããŠããã«ãŒãã«æ»ã
远å 確èªãå¿ èŠãªæ¡ä»¶
ã«ãŒãäžã¯èªåŸã§é²ãããã以äžã®ãšãã ã確èªããïŒåè 2 ã€ã¯åæ¢ãæåŸã® 1 ã€ã¯ç¢ºèªåŸã«ãŒã埩垰ïŒã
- çŸåšã® repo ãš PR ã® owner/repo ãäžèŽããªãïŒçæåã«äžæïŒ
- çŸåšã®ããŒã«ã«ãã©ã³ãã PR ã® head ãã©ã³ããšç°ãªãïŒçæåã«äžæïŒ
- ã¬ãã¥ãŒææã®åŠ¥åœæ§ãã³ãŒãã ãã§ã¯å€æã§ããªãïŒä¿®æ£æ¹éãè€æ°ãã圱é¿ã倧ããïŒèšèšå€æã絡ãïŒãã® 1 ä»¶ã確èªããåæ åŸã«ã«ãŒããžæ»ãïŒ