| name | gh-issue-template |
| description | Canonical templates and operating rules for writing GitHub Issues and Pull Requests (PR templates included despite the name). |
| when_to_use | When writing or updating the body of a GitHub Issue or Pull Request. |
| user-invocable | false |
| disable-model-invocation | false |
| metadata | {"type":"reference","author":"shigurenimo","description":"GitHub Issue / PR ãæžã蟌ãéã®ãã³ãã¬ãŒãã»å¿
é ã»ã¯ã·ã§ã³ã»Title èŠåã»Assignment ã«ãŒã«ã»Issue Type ã®èŠçŽã","design":"Issue ãš PR ã®æ¬æãçµã¿ç«ãŠãéã®ãã³ãã¬ãŒããšéçšèŠçŽããŸãšããåç
§ã¹ãã«ãé圢åªå
é äœãã¢ãµã€ã³è¡çªåé¿ãªã©èŠçŽã«æ²¿ã£ã倿ãäžå¿ã","dev":false,"tools":"gh","tags":["tools"]} |
GitHub Issue ãš Pull Request ãæžã蟌ãæã®ãã³ãã¬ãŒããšéçšã«ãŒã«ããŸãšããã¹ãã«ãIssue / PR ã®æ¬æãäœãåã«å¿
ãåç
§ããã
Issue 㯠Claude ãåŸã§èªã¿è¿ãããšãã«æææ±ºå®ã®çµç·¯ãšå®è£
æ¹éãåçŸã§ããç¶æ
ã«ä¿ã€ãPR ã¯å®è£
çµæãèšé²ããå Žæã§ãèšç»ã¯æžããªãã
ãªããžããªãšãŠãŒã¶ãŒã®ååŸ
ãªããžããªåã»çµç¹åã»ãã°ã€ã³åã¯ããŒãã³ãŒãããªããå¿
èŠã«ãªã£ãéœåºŠã次ã®ã³ãã³ãã§åçã«ååŸããã
REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner)
OWNER=${REPO%%/*}
ME=$(gh api user --jq .login)
Issue Type
Issue 㯠GitHub Issue Type ã§ 3 çš®é¡ã«åãããLabel ã¯äœ¿ããªãã
Bug ã¯äžå
·åã®éçŽãèšç»ã«ç§»ããªã倧ããäžå
·åããããã調æ»ãå¿
èŠãªäžå
·åãªã©ãå®è£
èšç»ã¯æããªãã
Feature ã¯èŠæã®éçŽãèšç»ã«ç§»ããªã倧ããèŠæãå®è£
æ¹éããŸã åºãŸããªãèŠæãªã©ãå®è£
èšç»ã¯æããªãã
Task ã¯å®è£
èšç»ãæè¡èšç»ãš Tasks ãªã¹ããæžããBug / Feature ãšã¯ç¬ç«ããŠäœã£ãŠããã
éžã³æ¹
å®è£
èšç»ãšããŠæžããç²åºŠãªã Taskã倧ããã»èšç»ã«èœãšããªãã»ãŸã èª¿æ»æ®µéã®äžå
·å㯠Bugãåãæ§è³ªã®èŠæã¯ Featureã
Bug / Feature ããæŽŸçã㊠Task ãåãããšãããããTask ã¯å¿
ããã芪ãæããªããçŽæ¥ Task ã ããäœã£ãŠå®è£
ã«é²ãã§ããã
çµç¹ã§ 3 çš®é¡ã enabled ãæåã«ç¢ºèªããã
gh api "/orgs/$OWNER/issue-types" --jq '.[] | select(.is_enabled) | .name'
Issue äœææã¯ gh issue create --type Bug|Feature|Task ãå¿
ãæå®ããã
--type ãã©ã°ã䜿ããªãå Žåã® GraphQL 代æ¿
gh ã®ããŒãžã§ã³ã«ãã£ãŠ --type ãã©ã°ãæªå¯Ÿå¿ã®å Žåãããããã®å Žå㯠GraphQL ã§ä»£æ¿ããã
ãŸããªããžã㪠ID ãš Issue Type ID ãååŸããã
REPO_ID=$(gh api graphql -f query='{ repository(owner:"'"$OWNER"'",name:"'"${REPO##*/}"'"){id} }' -q '.data.repository.id')
gh api graphql -f query='{ repository(owner:"'"$OWNER"'",name:"'"${REPO##*/}"'"){ issueTypes(first:10){ nodes { id name } } } }' -q '.data.repository.issueTypes.nodes[] | [.id, .name] | @tsv'
Issue ãäœæããã
ISSUE_NUM=$(gh api graphql -f query='
mutation($repoId:ID!, $title:String!, $body:String!, $typeId:ID!) {
createIssue(input:{repositoryId:$repoId, title:$title, body:$body, issueTypeId:$typeId}) {
issue { number url }
}
}' \
-f repoId="$REPO_ID" \
-f typeId="$TYPE_ID" \
-f title="ã¿ã€ãã«" \
-f body="æ¬æ" \
-q '.data.createIssue.issue.number')
assigneeIds 㯠GraphQL ã§é
åãæž¡ããªããããäœæåŸã« gh issue edit $ISSUE_NUM --add-assignee @me ã§ã¢ãµã€ã³ããã
.github é圢ãã¡ã€ã«ã®åªå
é äœ
.github/ISSUE_TEMPLATE.md ãš .github/PULL_REQUEST_TEMPLATE.md 㯠GitHub UI ãèªåé©çšããé圢ãã¡ã€ã«ãClaude ãæ¬æãçµã¿ç«ãŠãæã®åªå
é äœã¯æ¬¡ã®éãã
é圢ãã¡ã€ã«ãããã°ãããåªå
ãããäžèšã® Template ã»ã¯ã·ã§ã³ã¯ãããŸã§ãã©ãŒã«ããã¯ãé圢ãç¡ãã»å£ããŠããã»ãã®ã¹ãã«ã®æ¹éãšæŽåããªãå Žåã®ã¿ããã®ã¹ãã«ã® Template ã«åŸã£ãŠæ¬æãçµã¿ç«ãŠãã
å¿
é ã»ã¯ã·ã§ã³ã»é åºã»Title èŠåã»Assignment ã«ãŒã«ã¯ãã®ã¹ãã«ãåžžã«æ£æ¬ãé圢ãã¡ã€ã«ããã®ã¹ãã«ã®æ¹éãšççŸããå Žåã¯é圢ãåªå
ããããŠãŒã¶ãŒã«ççŸãå ±åããã
Issue é圢ã®åãæ±ã
Issue ãäœæããåã« .github/ ããã§ãã¯ããæ¬¡ã®ããã«åå²ããã
.github/ISSUE_TEMPLATE.md ãååšããå Žåã¯ããã®ãã¡ã€ã«ãèªã¿èŸŒãã§åããã
.github/ISSUE_TEMPLATE.md ã .github/ISSUE_TEMPLATE/ ãã£ã¬ã¯ããªãååšããªãå Žåã¯ãäžèšãIssue Templateãã»ã¯ã·ã§ã³ã®å
容㧠.github/ISSUE_TEMPLATE.md ãæ°èŠäœæããåãã³ãããã«å«ããã
.github/ISSUE_TEMPLATE/ ãã£ã¬ã¯ããªãæ¢ã«ååšããå Žåã¯ãèªåäœæãã¹ãããããããåäžãã³ãã¬ãŒãã«çµ±äžããŸããããšãªãŒããŒã«ç¢ºèªããæ¿èªãåŸãŠãããã£ã¬ã¯ããªåé€ãšåäžãã¡ã€ã«äœæãè¡ããåæã«ãã£ã¬ã¯ããªãåé€ããªãã
PR é圢ã®åãæ±ã
PR ãäœæããåã« .github/PULL_REQUEST_TEMPLATE.md ããã§ãã¯ããã
ååšããå Žåã¯ãã®ãã¡ã€ã«ãèªã¿èŸŒãã§åããã
ååšããªãå Žåã¯ãäžèšãPR Templateãã»ã¯ã·ã§ã³ã®å
å®¹ã§æ°èŠäœæããåãã³ãããã«å«ãããæ¢ã«ååšããå Žåã¯åæã«äžæžãããªãã
å
±éã«ãŒã«
åé ã®æŠèŠã¯äººéåããæè¡çšèªãé¿ããäœãã»ãªãå€ããããèªç¶ãªæç« ã§æžããèŠåºãã¯ä»ããªãã
å¿
é ã»ã¯ã·ã§ã³ã¯åºå®ãé åºãå€ããªãã
å¿
é ã»ã¯ã·ã§ã³ã®åŸã«ãä»»æã»ã¯ã·ã§ã³ãèªç±ã«è¿œå ããŠããã
Claude ãæ®ãããæ
å ±ïŒèª¿æ»ã¡ã¢ãæ€èšããä»£æ¿æ¡ã詊è¡é¯èª€ã®èšé²ãªã©ïŒã¯äœã§ãæžããŠããã
Notion ã¿ã¹ã¯ãååšããå Žåã¯ãIssue åé ã« [TASK-{çªå·}](Notion URL) ããPR ã® closes è¡ã« [TASK-{çªå·}](Notion URL) ã远èšããã
ããããã£åœ¢åŒïŒããªã¹ã¯è©äŸ¡:ãã®ãã㪠Key: ValueïŒã¯äœ¿ããªããèªç¶ãªæç« ã§æžãã
Issue Template (type:Task)
å®è£
èšç»ãæžããæè¡è©³çŽ°ãæžããŠããã
Task 㯠2 éãã®äœãæ¹ããããçŽæ¥ Task ãäœãå Žåã¯æ¢ã«èšç»ãæžããå°ããåäœãBug / Feature ããæŽŸçããŠäœãå Žåã¯å€§ããäžå
·å / èŠæã 1 å以äžã® Task ã«åè§£ããçµæã
掟çã§äœãå Žåã¯èŠª Bug / Feature çªå·ã Parent: #N ã§æžããBug / Feature ãå®è£
ã«é²ãããšãã¯å¿
ã 1 å以äžã® Task ãæŽŸçããããBug / Feature èªäœã«ã¯å®è£
èšç»ãæžããªãã
[人éåãã®æŠèŠãäœãã»ãªã倿Žããã®ããèæ¯ãšç®çãèªç¶ãªæç« ã§æžã]
Parent: #{芪 Bug / Feature çªå·} â æŽŸçã§äœããšãã ãæžã
## Technical Challenges
[圱é¿ãããã¡ã€ã«ã»APIã»ããŒã¿æ§é ã»å®è£
äžã®æžå¿µãªã©æè¡çãªäºå®ãåæãã]
## Plan
[å®è£
æ¹éãšãã®çç±ããªããã®ã¢ãããŒããéžãã ããã©ã®ãããªæé ã§é²ããããèæ
®ãããã¬ãŒããªããèªç¶ãªæç« ã§èª¬æãããç®æ¡æžãã ãã§ãªããæèã®æµãã远ããã¬ãã«ã®è©³çްããå¿
èŠ]
### Tasks
- [ ] ã¿ã¹ã¯1
- [ ] ã¿ã¹ã¯2
å¿
é ã»ã¯ã·ã§ã³
åé ã®æŠèŠïŒèŠåºããªãïŒãTechnical ChallengesãPlanïŒTasks ãµãã»ã¯ã·ã§ã³ãå«ãïŒã掟ç Task ã®å Žåã¯åé ã®æŠèŠçŽåŸã« Parent: #N ãå
¥ããã
ä»»æã»ã¯ã·ã§ã³ã®äŸ
NotesãResearchãAlternatives ConsideredãDebug LogãDependenciesãMigrationã
Issue Template (type:Bug / type:Feature)
äžå
·å / èŠæã®éçŽãééçºè
ïŒçµå¶è
ã»äŒç»æ
åœè
ïŒãèªããæè¡çšèªã»ãã¡ã€ã«åã»ã³ãŒãã¯æžããªãã
Bug / Feature èªäœã«ã¯å®è£
èšç»ãæžããªããå®è£
ã«é²ããšãã¯æŽŸç Task ã 1 å以äžäœã£ãŠãããã«æè¡èšç»ãæžãã1 ã€ã® Bug / Feature ãè€æ°ã® Task ã«åè§£ãããããšãæ®éã
[人éåãã®æŠèŠãäœãèµ·ããŠããŠäœãçŽãããã / äœãå®çŸããããã誰ã®ããã«ãäœãå€ãããããªãå¿
èŠã]
## Source
- Notion: [TASK-{çªå·}](Notion URL)
- Sentry: [{SHORT_ID}](Sentry permalink)
- Voice: [[signals/{slug}]]
- Direct: {誰} / {YYYY-MM-DD}
## Scope
- ããããš: {äœãå€ãã / çŽã}
- ãããªãããš: {ã¹ã³ãŒãå€ãæç€º}
- 圱é¿ç¯å²: {誰ã®ã©ã®äœéš}
## Tasks
掟ç type:Task ã®äžèЧãå®è£
ã«çæãããšãã« 1 ã€ä»¥äžå¿
ã远å ããã
- [ ] #{çªå·} 掟ç Task ã¿ã€ãã«
- [ ] #{çªå·} 掟ç Task ã¿ã€ãã«
Source ã¯è©²åœããè¡ã®ã¿æ®ããè€æ° source ãæã£ãŠããã
Tasks ã®æŽŸç Task ã close ãããã察å¿è¡ã [x] ã«æŽæ°ããããã¹ãŠã®æŽŸç Task ã close ãããã Bug / Feature èªäœã close ããã
å¿
é ã»ã¯ã·ã§ã³
åé ã®æŠèŠïŒèŠåºããªãã人éåãïŒãSourceãScopeãTasksïŒå®è£
çæåã¯ç©ºã§ãããçææã«æŽŸç Task ã远å ããïŒã
ä»»æã»ã¯ã·ã§ã³ã®äŸ
NotesãDecisionsãOpen questionsã
PR Template
PR ã¯å®è£
çµæãèšé²ããå Žæãèšç»ã¯ Issue åŽã«æžããPR ã«ã¯æžããªãã
closes #<Issueçªå·>
[人éåãã®æŠèŠãäœãå€ããããäœãè¯ããªãããèªç¶ãªæç« ã§æžãããªã¹ã¯ã圱é¿ãããã°è§Šãã]
## Verification
- [ ] 察象æ©èœã®åäœç¢ºèª
- [ ] æ¢åæ©èœãžã®åœ±é¿ç¢ºèª
å¿
é ã»ã¯ã·ã§ã³
closes è¡ïŒIssue ãªã³ã¯ïŒãåé ã®æŠèŠïŒèŠåºããªãïŒãVerificationïŒå®éã«ãã©ãŠã¶æäœã API åŒã³åºãã§ç¢ºèªããå
容ãtest / build ãªã©ã®æè¡çãã§ãã¯ã¯å«ããªãïŒã
ä»»æã»ã¯ã·ã§ã³ã®äŸ
Implementation NotesãBreaking ChangesãScreenshotsã
Title èŠå
ã¿ã€ãã«èŠå㯠type:Task ã®ã¿é©çšãããBug / Feature ã«ã¯ãã¬ãã£ãã¯ã¹ãä»ããªãã
Task ã§ Notion ç±æ¥ãªã TASK-{N} - {ã¿ã¹ã¯å} ã®åœ¢åŒã«ããã{N} 㯠Notion åŽã® TASK IDïŒauto_increment_idïŒã
Task ã§ãã以å€ãBugãFeature 㯠{èŠçŽ} ã®ã¿ã§ãã¬ãã£ãã¯ã¹ãªãã
Notion åŽã® TASK-{N} 㯠Issue type ã® Task ãšã¯å¥æŠå¿µãNotion ç±æ¥ã® Task èšç»ã«ã ã TASK çªå·ãã¬ãã£ãã¯ã¹ãä»ããã
Source ã®èå¥ïŒSentry ç±æ¥ã Voice ç±æ¥ãçïŒã¯ã¿ã€ãã«ã§ã¯ãªãæ¬æã® ## Source ã§è¡ãã
Bug / Feature ãš Task ã®é£æº
Bug / Feature ãå®è£
ã«é²ãããšãã¯ãå¿
ã 1 ã€ä»¥äžã® Task ã«åè§£ããŠæŽŸçãããã1 ã€ã® Bug / Feature ãè€æ° Task ã«åãããããšãæ®éïŒãã§ãŒãºåããã¬ã€ã€ãŒåããã¯ãŒã¯ã¹ããŒã¹åãçïŒã
掟ç Task ã®äœãæ¹
掟ç Task ã® body åé ïŒæŠèŠçŽåŸïŒã« Parent: #{芪 Bug/Feature çªå·} ãæžãã
芪 Bug / Feature ã® ## Tasks ã«æŽŸç Task çªå·ã远èšããïŒ- [ ] #N ã¿ã€ãã«ïŒã
掟ç Task ã close ããããã芪㮠## Tasks ã®å¯Ÿå¿è¡ã [x] ã«æŽæ°ããã
芪 Bug / Feature ã® ## Tasks ããã¹ãŠ [x] ã«ãªã£ããã芪èªäœã close ããã
çŽæ¥ Task ãäœãå ŽåïŒBug / Feature ãçµç±ããªãïŒã¯ Parent è¡ãæžããªããããã¯å³èšç»ã§ããå°ããåäœçšã§ãBug / Feature ãç«ãŠãæéãçãããšãéå®ã
GitHub Sub-issues æ©èœã䜿ãå Žå㯠body ã®åç
§ãšäœµçšããŠããïŒäž¡æ¹ãç¶æïŒã
Assignment
GitHub Issue ã®ã¢ãµã€ã³ã管çããã話ãããã人ïŒgh api user ã® loginïŒã Issue ã«ä»ããä»ã®äººé / Claude ãšã®ã¢ãµã€ã³è¡çªãé¿ããã
æäœ
mine ã¯èªåã«ã¢ãµã€ã³ããã open Issue ã®äžèЧïŒgh issue list --assignee "@me" --state openïŒã
unassigned ã¯èª°ã«ãã¢ãµã€ã³ãããŠããªã open Issue ã®äžèЧïŒgh issue list --search "no:assignee" --state openïŒã
assign {N} 㯠Issue N ãèªåã«ã¢ãµã€ã³ã
release {N} 㯠Issue N ã®èªåã®ã¢ãµã€ã³ãå€ãïŒgh issue edit N --remove-assignee "@me"ïŒã
Assign ã®å€å®ãããŒ
å Issue çªå· N ã«ã€ã㊠gh issue view N --json number,title,state,assignees,issueType ãåã£ãŠå€å®ããã
state == "CLOSED" ã¯ã¹ãããïŒclose æžã¿ã«ã¢ãµã€ã³ããªãïŒã
assignees ã«èªåãå«ãŸããå Žå㯠already assignedãã¹ãããã
assignees ã«ä»äººãããå Žåã¯å
±åã¢ãµã€ã³ããã AskUserQuestion ã§ç¢ºèªãYes ãªã gh issue edit N --add-assignee @me ã§å
±åã¢ãµã€ã³ãNo ãªãã¹ãããã
assignees ã空ã〠issueType.name == "Feature" ã®å Žåã¯èŠæéçŽçšãªã®ã§ã¢ãµã€ã³éåžžäžèŠãAskUserQuestion ã§ç¢ºèªããŠããå®è¡ã
assignees ã空ã〠issueType.name in ("Bug", "Task", null) ã®å Žåã¯ãã®ãŸãŸã¢ãµã€ã³ã
è¡çªåé¿
ä»äººãã¢ãµã€ã³äžã® Issue ã«ç¡æã§èªåã远å ããªãïŒç¢ºèªå¿
é ïŒã
close æžã¿ Issue ã«ã¢ãµã€ã³ããªãã
åäž Issue ãè€æ°ã® Claude ã»ãã·ã§ã³ã§åãåãã®ãé¿ãããããassign å®è¡åŸã«ããäžåºŠ gh issue view ã§å®éã«ã¢ãµã€ã³ãããã確èªããã倱æããŠããã°å詊è¡ããããŠãŒã¶ãŒã«ç¶æ³ãå ±åããã
ãã©ã³ãåœå
Issue ãå®è£
ãããã©ã³ã㯠{issueçªå·}-{èªç¶ãªè±æ} ã®åœ¢åŒã«ãããäŸ: 42-fix-pagination-offsetã