diff --git a/.claude/commands/triage-prs.md b/.claude/commands/triage-prs.md new file mode 100644 index 0000000..45e9717 --- /dev/null +++ b/.claude/commands/triage-prs.md @@ -0,0 +1,193 @@ +--- +name: triage-prs +description: Triage all open PRs with parallel agents, label, group, and review one-by-one +argument-hint: "[optional: repo owner/name or GitHub PRs URL]" +disable-model-invocation: true +allowed-tools: Bash(gh *), Bash(git log *) +--- + +# Triage Open Pull Requests + +Review, label, and act on all open PRs for a repository using parallel review agents. Produces a grouped triage report, applies labels, cross-references with issues, and walks through each PR for merge/comment decisions. + +## Step 0: Detect Repository + +Detect repo context: +- Current repo: !`gh repo view --json nameWithOwner -q .nameWithOwner 2>/dev/null || echo "no repo detected"` +- Current branch: !`git branch --show-current 2>/dev/null` + +If `$ARGUMENTS` contains a GitHub URL or `owner/repo`, use that instead. Confirm the repo with the user if ambiguous. + +## Step 1: Gather Context (Parallel) + +Run these in parallel: + +1. **List all open PRs:** + ```bash + gh pr list --repo OWNER/REPO --state open --limit 50 + ``` + +2. **List all open issues:** + ```bash + gh issue list --repo OWNER/REPO --state open --limit 50 + ``` + +3. **List existing labels:** + ```bash + gh label list --repo OWNER/REPO --limit 50 + ``` + +4. **Check recent merges** (to detect duplicate/superseded PRs): + ```bash + git log --oneline -20 main + ``` + +## Step 2: Batch PRs by Theme + +Group PRs into review batches of 4-6 based on apparent type: + +- **Bug fixes** - titles with `fix`, `bug`, error descriptions +- **Features** - titles with `feat`, `add`, new functionality +- **Documentation** - titles with `docs`, `readme`, terminology +- **Configuration/Setup** - titles with `config`, `setup`, `install` +- **Stale/Old** - PRs older than 30 days + +## Step 3: Parallel Review (Team of Agents) + +Spawn one review agent per batch using the Task tool. Each agent should: + +For each PR in their batch: +1. Run `gh pr view --repo OWNER/REPO --json title,body,files,additions,deletions,author,createdAt` +2. Run `gh pr diff --repo OWNER/REPO ` (pipe to `head -200` for large diffs) +3. Determine: + - **Description:** 1-2 sentence summary of the change + - **Label:** Which existing repo label fits best + - **Action:** merge / request changes / close / needs discussion + - **Related PRs:** Any PRs in this or other batches that touch the same files or feature + - **Quality notes:** Code quality, test coverage, staleness concerns + +Instruct each agent to: +- Flag PRs that touch the same files (potential merge conflicts) +- Flag PRs that duplicate recently merged work +- Flag PRs that are part of a group solving the same problem differently +- Report findings as a markdown table +- Send findings back via message when done + +## Step 4: Cross-Reference Issues + +After all agents report, match issues to PRs: + +- Check if any PR title/body mentions `Fixes #X` or `Closes #X` +- Check if any issue title matches a PR's topic +- Look for duplicate issues (same bug reported twice) + +Build a mapping table: +``` +| Issue | PR | Relationship | +|-------|-----|--------------| +| #158 | #159 | PR fixes issue | +``` + +## Step 5: Identify Themes + +Group all issues into themes (3-6 themes): +- Count issues per theme +- Note which themes have PRs addressing them and which don't +- Flag themes with competing/overlapping PRs + +## Step 6: Compile Triage Report + +Present a single report with: + +1. **Summary stats:** X open PRs, Y open issues, Z themes +2. **PR groups** with recommended actions: + - Group name and related PRs + - Per-PR: #, title, author, description, label, action +3. **Issue-to-PR mapping** +4. **Themes across issues** +5. **Suggested cleanup:** spam issues, duplicates, stale items + +## Step 7: Apply Labels + +After presenting the report, ask user: + +> "Apply these labels to all PRs on GitHub?" + +If yes, run `gh pr edit --repo OWNER/REPO --add-label "