---
name: pr
description: Create or update a pull request for the current branch with a summary of all changes. Use when the user asks to open, create, update, or refresh a PR/pull request.
disable-model-invocation: false
user-invocable: true
allowed-tools: Bash(git branch:*) Bash(git rev-parse:*) Bash(git log:*) Bash(git diff:*) Bash(gh pr view:*) Bash(gh pr create:*) Bash(gh pr edit:*) Read
---
## Context
- Current branch: !`git branch --show-current`
- Default branch candidates: !`git branch -r | grep -E 'origin/(main|master)'`
- PR for this branch: !`gh pr view --json number,title,url 2>/dev/null || echo "NO_PR"`
## Your task
Create or update a pull request for the current branch.
### Pre-flight checks
1. Detect the base branch by running: `git rev-parse --verify origin/main >/dev/null 2>&1 && echo main || echo master`. Use this as ``.
2. If the current branch is the base branch, stop and tell the user to switch to a feature branch first. Do nothing else.
3. Run `git log ..HEAD --oneline`. If there are **no commits** ahead of the base branch, stop and tell the user to commit changes first. Do nothing else.
4. Never run `git add` or `git commit`. Only manage the PR.
### Analysis
1. Run `git diff ...HEAD` to get the full diff of all changes on this branch.
2. Run `git log ..HEAD --format="%h %s"` to get all commit messages.
3. Identify the **main topic**, group **specific changes** logically.
### Decide: create or update
- If the PR context above shows `NO_PR` → **create** a new PR.
- If a PR is found for the current branch → **update** that PR.
### PR title
Follow **Conventional Commits** format: `: `.
**Types:** feat, fix, docs, refactor, test, chore, build, perf, ci. Append `!` for breaking changes.
When **updating**, keep the existing title unless it is generic (e.g. "Update"), outdated, or does not follow Conventional Commits.
### PR body format
First, check if the repository has a PR template. Look for these files in order:
1. `pull_request_template.md` in the repo root
2. `.github/pull_request_template.md`
3. `.github/PULL_REQUEST_TEMPLATE/*.md`
**If multiple templates exist in `.github/PULL_REQUEST_TEMPLATE/`:**
- Read all template files in that directory
- Analyze the current changes (types of files modified, nature of changes)
- Select the template whose filename and content best match the changes (e.g., `bugfix.md` for bug fixes, `feature.md` for new features, `docs.md` for documentation changes)
**If a template is found:**
- Use the template's content as the PR body
- Replace any placeholder variables (e.g., `{{description}}`, `{{summary}}`) with actual content derived from the changes
- If the template includes a checklist, only check items that are truly complete and verified. Leave items unchecked when the related work is not done, not validated yet, or failed.
- If you can reasonably perform a check needed to validate a checklist item (for example by reading the diff, inspecting files, or running an available verification command), do it before deciding whether the item should be checked.
**If no template is found, use this default format:**
```
## Summary
<1-2 sentence high-level description of what this PR does and why>
## Changes
## Test plan
```
### Execution
**Create flow:**
1. Push the branch to origin: `git push -u origin `.
2. Create the PR:
```bash
gh pr create --title "" --body "$(cat <<'EOF'
EOF
)"
```
**Update flow:**
1. Update the PR:
```bash
gh pr edit --title "" --body "$(cat <<'EOF'
EOF
)"
```
### Rules
- Write the summary in plain English, focusing on the **why** and the **what**.
- List changes as concise bullet points. Group related items under sub-headers if the PR touches multiple areas.
- The test plan should contain actionable verification steps relevant to the changes. If a check was already run and passed, mark it as done.
- If the PR body includes a checklist from a template, never auto-check every item. Each checked item must match work that is actually done and confirmed.
- When a checklist item can be validated with available evidence or commands, verify it instead of guessing.
- Do not send any text besides the tool calls.