| name | github-pr-workflow |
| description | GitHub PR lifecycle: branch, commit, open, CI, merge. |
| allowed-tools | ["bash","read_file"] |
| enabled | true |
| related-skills | ["github-auth","github-code-review"] |
| license | MIT |
| author | Adapted from hermes-agent (Nous Research, MIT) |
GitHub Pull Request Workflow
Complete guide for managing the PR lifecycle. gh first, git + curl
fallback.
Prerequisites
- Authenticated with GitHub (see
github-auth skill)
- Inside a git repository with a GitHub remote
1. Branch & Commit
git checkout -b feature/add-login
git add -A
git commit -m "feat: add login endpoint"
git push -u origin feature/add-login
2. Create PR
gh pr create
gh pr create \
--title "feat: add login endpoint" \
--body "## Changes
- Add /api/login route
- Add JWT token generation
- Add tests
## Testing
\`\`\`bash
pytest tests/test_auth.py -v
\`\`\`" \
--base main \
--head feature/add-login
curl -s -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$OWNER/$REPO/pulls \
-d '{
"title":"feat: add login endpoint",
"body":"Add /api/login route with JWT",
"head":"feature/add-login",
"base":"main"
}'
3. Check CI Status
gh pr checks 42
curl -s "https://api.github.com/repos/$OWNER/$REPO/commits/$HEAD_SHA/check-runs" | python3 -c "
import sys, json
for r in json.load(sys.stdin)['check_runs']:
print(f'{r[\"name\"]:30s} {r[\"conclusion\"] or r[\"status\"]}')
"
curl -s "https://api.github.com/repos/$OWNER/$REPO/commits/$HEAD_SHA/status" | python3 -c "
import sys, json
r = json.load(sys.stdin)
print(f'Overall: {r[\"state\"]}')
for s in r['statuses']:
print(f' {s[\"context\"]:30s} {s[\"state\"]}')
"
4. Update PR (push more commits)
git add -A
git commit --fixup HEAD
git push
5. Review & Approve
gh pr edit 42 --add-reviewer username
gh pr review 42 --approve --body "LGTM!"
gh pr review 42 --request-changes --body "See inline comments."
gh pr review 42 --comment --body "Some suggestions."
6. Merge
gh pr merge 42 --merge
gh pr merge 42 --squash
gh pr merge 42 --rebase
gh pr merge 42 --squash --delete-branch
curl -s -X PUT \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$OWNER/$REPO/pulls/42/merge \
-d '{"merge_method":"squash"}'
7. Cleanup
git checkout main
git pull origin main
git branch -d feature/add-login
git push origin --delete feature/add-login
Full Workflow Example
git checkout -b fix/issue-42-login-timeout
pytest tests/test_auth.py -v
git add -A
git commit -m "fix: increase login timeout to 30s (fixes #42)"
git push -u origin fix/issue-42-login-timeout
gh pr create --title "fix: increase login timeout (fixes #42)" --body "..." --base main
gh pr checks
gh pr merge --squash --delete-branch
git checkout main && git pull
Pitfalls
fixes #42: auto-closes issue 42 on merge. Use refs #42 to reference
without closing.
- Squash merge: all commits become one. Branch history is lost. Best for
small PRs.
- Merge conflicts:
git fetch origin && git rebase origin/main to resolve
before pushing.
- Draft PR:
gh pr create --draft marks as WIP. Reviewers can't approve
until marked ready.
- Force push:
git push --force-with-lease (not --force) to avoid
overwriting others' work on shared branches.
- CI not triggering: check if branch protection rules require specific
status checks. Some CI only runs on certain branch patterns.