| name | create-epic-pr |
| description | Create an aggregated Epic PR from a `cc-epic-<Issue number>` branch to the default branch. Takes the Epic Issue number as argument, assumes sub-PRs have already been merged into the epic branch, and automatically generates the PR title and description from the commit log against the base branch (including sub-PR / sub-Issue references). The PR is posted via `gh pr create` with no label and `Closes #<Epic Issue>`. |
| argument-hint | [issue-number] |
| disable-model-invocation | true |
Create Epic Pull Request
åŒæ°ã® Epic Issue çªå· $0 ã«å¯Ÿå¿ãã cc-epic-$0 ãã©ã³ããããããã©ã«ããã©ã³ããžã®éçŽPRïŒEpic PRïŒãäœæããã¹ãã«ãepic ãã©ã³ãã¯è€æ°ãµãIssueã®å®è£
PRããŸãšããŠããŒãžããéçŽçšãã©ã³ãã§ãæ¬ã¹ãã«åŒã³åºãæç¹ã§ãµãPRã¯ãã¹ãŠ epic ãã©ã³ããžããŒãžæžã¿ãåæïŒæ¬ã¹ãã«ã¯ epic ãã©ã³ããåå¥ã³ããããäœããªãïŒãããŒã¹ãã©ã³ããšã®å·®åã³ããããã°ããPR descriptionãèªåçæããgh pr create ã§æçš¿ããã
ãŠãŒã¶ãŒãžã®ç¢ºèªã¯è¡ããã倿ã¯ãã¹ãŠæ¬ã¹ãã«å
ã®ã«ãŒã«ã§èªå決å®ãããäžææ¡ä»¶ã«è©²åœããå Žåã®ã¿ãçç±ãåºåããŠçµäºããã
Instructions
å®è¡ã¢ãŒãã®å¶çŽ: ãµããšãŒãžã§ã³ãã»ãµãã¹ãã«ã»Bashãããã¯ã°ã©ãŠã³ãå®è¡ããªãããš
æ¬ã¹ãã«ã¯ claude-task-worker ã® epic-issue ã¯ãŒã«ãŒïŒcc-epic-issue ã©ãã«ïŒããèªåèµ·åãããæ³å®ãã¯ãŒã«ãŒã¯ã¹ãã«ããã»ã¹ã®åæå®äºãæ ¹æ ã«ã©ãã«é·ç§»ãåŸç¶åŠçãé²ãããããããã¯ã°ã©ãŠã³ãåãããš PR URL æªååŸã®ãŸãŸå ±åãããããEpic PR æªäœæã®ãŸãŸ cc-epic-issue ãå€ããç¶æ
å£ããèµ·ãããå
éšåŠçã¯ãã¹ãŠåæå®è¡ã§å®çµãããããšã
Agent ããŒã«ã¯æ¢å®ã run_in_background: trueïŒããã¯ã°ã©ãŠã³ãïŒãåŒã³åºãããšã« å¿
ã run_in_background: false ãæç€ºæå® ãããã©ã¢ã°ã©ãŠã³ãã§åæçã«çµæãåãåã£ãŠããæ¬¡ã®åŠçã«é²ããæå®ãçç¥ããå Žåã¯ããã¯ã°ã©ãŠã³ãã§èµ°ããæ¬ã¹ãã«ãæªå®ã®ãŸãŸçµäºãã
Skill / Bash ããŒã«åŒã³åºãæã« run_in_background: true ãæå®ããªãïŒæ¢å®ã¯åæïŒãç¹ã« gh pr create ã¯åæå®è¡ããæšæºåºåã§è¿ãPR URLãååŸããŠããå®äºå ±åãã
- ã·ã§ã«ã³ãã³ãæ«å°Ÿã«
& ãä»ããªããnohup / disown / setsid ã§ã®ãã¿ãããScheduleWakeup çã§ã®åŸåããçŠæ¢
- åäžã¡ãã»ãŒãžå
ã§è€æ°ã®
Agent / Skill ã䞊åã«æããã®ã¯ã䞊åå®è¡ãã§ãã£ãŠãããã¯ã°ã©ãŠã³ãå®è¡ãã§ã¯ãªããã蚱容ãããïŒåå®äºã¯ãã®å Žã§åæçã«åŸ
ã€ïŒ
ãã§ãŒãº0: åŒæ°å€å®ãšäºåãã§ãã¯
0-1. åŒæ°ã®åŠ¥åœæ§ç¢ºèª
$0 ãæ°å€ã®ã¿ã®Issueçªå·ã§ããããšïŒäŸ: 123ïŒã確èªãããåŒæ°ã空ããŸãã¯æ°å€ä»¥å€ãå«ãå Žåã¯äžæããã以éã$0 ããã®ãŸãŸIssueçªå·ãšããŠæ±ãã
0-2. Epic Issueã®ååšç¢ºèª
gh issue view $0 --json number,title,state,url
IssueãååšããªãããŸã㯠state ã CLOSED ã®å Žåã¯äžæãããtitle ã¯åŸç¶ã®PRã¿ã€ãã«çæãurl ã¯æçµå ±åã§äœ¿ãããä¿æããã
0-3. äœæ¥ãã£ã¬ã¯ããªãšæªã³ããã倿Žã®ç¢ºèª
pwd ã§ã«ã¬ã³ãã確èªãããgit status --short ã§æªã³ããã倿Žãããã°äžæãããæ¬ã¹ãã«ã¯ã³ãŒããç·šéããªããããæªã³ããã倿Žã¯ãŠãŒã¶ãŒã®äœæ¥äžãã¡ã€ã«ã®å¯èœæ§ãé«ããéé¿æäœãè¡ããªãã
0-4. ããã©ã«ããã©ã³ãåã®ååŸ
gh repo view --json defaultBranchRef -q .defaultBranchRef.name
倱æããå Žåã¯äžæãããååŸããå€ã <BASE> ãšåŒã¶ã
å®äºæ¡ä»¶: $0 / Epic Issueã¿ã€ãã« / <BASE> ã確å®ããæªã³ããã倿Žãç¡ãããšã
ãã§ãŒãº1: epicãã©ã³ããžã®ãã§ãã¯ã¢ãŠã
1-1. ãªã¢ãŒãããã®ææ°ååŸ
git fetch origin --prune
1-2. ãã©ã³ãã®ç¹å®ãšãã§ãã¯ã¢ãŠã
察象ãã©ã³ãå㯠cc-epic-$0ã以äžã®åªå
é ã§åŠçãã:
- ãªã¢ãŒãã«ååšããå ŽåïŒ
git rev-parse --verify origin/cc-epic-$0 ãæåïŒ: git checkout cc-epic-$0ïŒããŒã«ã«ã«ç¡ããã°èªåã§ tracking branch ãäœãããïŒâ git pull --ff-only origin cc-epic-$0 ã§ææ°åãff-only 倱ææã¯äžæ
- ããŒã«ã«ã®ã¿ã«ååšããå ŽåïŒãªã¢ãŒãã«ç¡ãã
git rev-parse --verify cc-epic-$0 ãæåïŒ: git checkout cc-epic-$0
- ã©ã¡ãã«ãååšããªãå Žåã¯äžæããããµãPRããŒãžåã®æ©ãããåŒã³åºããé²ããããèªåäœæããæ¢ãã
å®äºæ¡ä»¶: git rev-parse --abbrev-ref HEAD ã cc-epic-$0 ãè¿ãããšã
git pull 㯠ff-only ã§ã®ã¿å®è¡ãããããŒãžã³ã³ããªã¯ããçºçããå Žåã¯æå解決ãä¿ãã
ãã§ãŒãº2: ããŒã¹ãã©ã³ããšã®å·®åãã°ååŸ
2-1. merge-base ãã HEAD ãŸã§ã®ã³ãããäžèЧ
BASE_REF=$(git merge-base origin/<BASE> HEAD)
git log ${BASE_REF}..HEAD --pretty=format:'%h%x09%s'
å·®åã³ãããã0ä»¶ã®å Žåã¯äžæããïŒPR ã«ãã倿ŽããªãïŒã
2-2. ãµãPR / ãµãIssue çªå·ã®æœåº
åã³ãããã¡ãã»ãŒãžãã以äžã®ãã¿ãŒã³ã§ PR / Issue çªå·ãæœåºãã:
Merge pull request #<çªå·> ãã¿ãŒã³ â ãµãPR
(#<çªå·>) ãã¿ãŒã³ïŒsquash merge ã®æ
£ç¿ïŒâ ãµãPR
Closes #<çªå·> / closes #<çªå·> / Closed #<çªå·> / Fixes #<çªå·> / fixes #<çªå·> / Resolves #<çªå·> ãã¿ãŒã³ â ãµãIssue
$0 èªèº«ã¯é€å€ããéè€ãé€å»ãããé åºã¯ã³ããããã°é ãç¶æããã
å®äºæ¡ä»¶: å·®åã³ãããäžèЧãšããµãPR / ãµãIssue çªå·ã®æœåºçµæãåŸãããŠããããšã
ãã§ãŒãº3: PR æ¬æã®çæ
3-1. PR ã¿ã€ãã«
Epic: <Epic Issueã¿ã€ãã«> 圢åŒãšããã
3-2. PR æ¬æã®çµã¿ç«ãŠ
以äžã®ãã©ãŒãããã§çµã¿ç«ãŠãããµãPR / ãµãIssue ãç¡ãã»ã¯ã·ã§ã³ã¯çç¥ããããªãããš1è¡æžãïŒåŸç¶ã¬ãã¥ãŒããæªèšå
¥ããšã該åœãªãããåºå¥ã§ããããã«ããããïŒã
## æŠèŠ
Epic Issue #$0ã<Epic Issueã¿ã€ãã«>ãã«çŽã¥ããµãã¿ã¹ã¯ããŸãšããéçŽPRã§ãã
## å«ãŸãã倿Ž
- `<short hash>` <subject>
- `<short hash>` <subject>
...
## å«ãŸãããµãPR
- #<çªå·>
- #<çªå·>
ïŒãªããã° "ãªã"ïŒ
## å«ãŸãããµãIssue
- #<çªå·>
- #<çªå·>
ïŒãªããã° "ãªã"ïŒ
Closes #$0
Closes #$0 ãå¿
ãå«ããïŒEpic PR ããŒãžæã« Epic Issue ãèªå close ãããããïŒã
ãã§ãŒãº4: PR ã®äœæïŒgh pr create å®è¡ïŒ
4-1. assignee ã®ååŸ
ME=$(gh api user --jq '.login')
4-2. gh pr create ã®å®è¡
æ¬ææž¡ã㯠--body-file - + heredocïŒ<<'EOF' ã¯ã©ãŒãçïŒã䜿ãã--body "..." 圢åŒã¯æ¬æäžã®ããã¯ã¯ã©ãŒãã»$ã»æ¹è¡ã§ãšã¹ã±ãŒããå£ãããããã䜿ããªããheredoc 㯠<<'EOF' ã§ã·ã§ã«å±éãææ¢ãããããæ¬æäžã® $0 ãªã©ã®ãã¬ãŒã¹ãã«ã㯠heredoc ã«æž¡ãåã«å®å€ãžçœ®æããŠããããšã
gh pr create \
--title "Epic: <Epic Issueã¿ã€ãã«>" \
--base "<BASE>" \
--assignee "${ME}" \
--body-file - <<'EOF'
Epic Issue
- `<short hash>` <subject>
...
-
...
-
...
Closes
EOF
ã©ãã«ã¯ä»äžããªãïŒ--label ãã©ã°ã䜿ããªãïŒã
gh pr create ã倱æããå Žåã¯å€±æãã°ãæçµå ±åã«å«ããŠçµäºãããå詊è¡ã¯1åãŸã§ã
ãã§ãŒãº5: æçµå ±å
gh pr create ãè¿ãã PR URL ãšã以äžã1-3è¡ã§å ±åããŠçµäºãã:
- ãã©ã³ãåïŒ
cc-epic-$0ïŒ
- å·®åã³ãããæ°
- å«ãŸãããµãPR / ãµãIssue ã®ä»¶æ°
äžææ¡ä»¶
以äžã®ããããã«è©²åœããå Žåã®ã¿ãçç±ã1-2è¡ã§åºåããŠå³äžæããã
- åŒæ°ã空ããŸã㯠Issue çªå·ãšããŠè§£éã§ããªã
gh issue view ã§ Issue ãèŠã€ãããªãããŸã㯠CLOSED
- æªã³ããã倿Žãååšãã
- ããã©ã«ããã©ã³ãåã®ååŸå€±æ
cc-epic-$0 ãã©ã³ããããŒã«ã« / ãªã¢ãŒãã®ãããã«ãååšããªã
git pull --ff-only ã ff-only ã§å€±æïŒããŒã«ã«ãšãªã¢ãŒãã®ä¹é¢ïŒ
- ããŒã¹ãã©ã³ããšã®å·®åã³ãããã0ä»¶
gh pr create ã倱æããå詊è¡ããŠãè§£æ¶ããªã