--- description: Generate a report of PRs needing reviews argument-hint: [org/repo] --- ## Name git:review-queue ## Synopsis ``` /git:review-queue [org/repo] ``` ## Description The `git:review-queue` command generates a comprehensive report of pull requests that need attention. It operates in two modes: analyzing your own PRs across repositories, or providing a detailed breakdown of all open PRs in a specific repository. The command integrates with GitHub's tide status to identify merge blockers, categorizes PRs by review state, and helps prioritize review work. **Key capabilities:** - Identify your PRs awaiting reviews, approvals, or blocked by CI - Find fresh PRs in a repository that haven't been reviewed yet - Track PRs you've previously commented on - Filter out blocked PRs (merge conflicts, failing CI) - Parse tide status to understand merge requirements - Categorize PRs by review state and priority This command is particularly useful for: - **Maintainers**: Get an overview of repository review queue - **Contributors**: Track status of your own PRs across multiple repos - **Reviewers**: Find PRs that need your attention based on your previous involvement ## Implementation ### Step 1: Determine Operation Mode **Check for repository argument:** ```bash if [ -n "$1" ]; then MODE="repository" TARGET_REPO="$1" else MODE="my-prs" fi ``` **Get current user:** ```bash CURRENT_USER=$(gh api user --jq .login) ``` ### Step 2: Fetch Pull Requests #### Mode 1: My PRs **Fetch PRs authored by current user across all repositories:** ```bash gh search prs --author="$CURRENT_USER" --state=open --json number,title,repository,labels,createdAt,updatedAt,isDraft,reviewDecision,url --limit 100 ``` **Filter and deduplicate:** Process JSON output to get unique PRs #### Mode 2: Repository Mode **Fetch all open PRs for the specified repository:** ```bash gh pr list --repo "$TARGET_REPO" --state=open --limit 100 \ --json number,title,author,labels,createdAt,updatedAt,isDraft,reviewDecision,mergeable,headRefOid,url,additions,deletions,changedFiles ``` ### Step 3: Enrich PR Data For each PR, gather additional context: **1. Get tide status from status checks:** ```bash # Extract commit SHA (headRefOid from PR data) gh api "repos/$REPO_OWNER/$REPO_NAME/commits/$SHA/status" \ --jq '.statuses[] | select(.context == "tide") | {state, description, target_url}' ``` **Tide status parsing:** - State: `success` (ready to merge), `pending` (waiting), `failure` (blocked) - Description contains: missing labels, failing jobs, merge conflicts - Examples: - "Needs lgtm label and approved label" - "Job e2e-aws failed" - "PR has a merge conflict" **2. Get review information:** ```bash gh api "repos/$REPO_OWNER/$REPO_NAME/pulls/$PR_NUMBER/reviews" \ --jq '[.[] | {user: .user.login, state, submitted_at}]' ``` **Review states:** - `APPROVED`: Reviewer approved - `CHANGES_REQUESTED`: Reviewer requested changes - `COMMENTED`: Reviewer commented without approval **3. Check if current user has commented (repository mode only):** ```bash # Get all comments (issue comments + review comments) gh api "repos/$REPO_OWNER/$REPO_NAME/issues/$PR_NUMBER/comments" \ --jq '[.[] | .user.login] | unique' gh api "repos/$REPO_OWNER/$REPO_NAME/pulls/$PR_NUMBER/comments" \ --jq '[.[] | .user.login] | unique' ``` Check if `$CURRENT_USER` appears in either list. **4. Get CI status summary:** ```bash gh pr checks $PR_NUMBER --repo "$TARGET_REPO" --json name,state,conclusion ``` Count passing/failing/pending checks. ### Step 4: Categorize PRs #### For "My PRs" Mode: **Category 1: Awaiting Reviews** - Criteria: No `approved` or `lgtm` labels - No reviews with state `APPROVED` - Not in draft state **Category 2: Requested Changes** - Criteria: Has reviews with state `CHANGES_REQUESTED` - No subsequent commits after the change request **Category 3: Blocked by CI** - Criteria: Tide status shows failing required jobs - OR: Required status checks are failing **Category 4: Ready to Merge** - Criteria: Has `approved` and `lgtm` labels - Tide status is `success` - All required checks passing **Category 5: Awaiting Tide** - Criteria: Has approvals but tide status is `pending` - Typically waiting for merge queue #### For "Repository" Mode: **Category 1: PRs I've Reviewed** - Criteria: Current user has comments or reviews on the PR - Sort by last activity date (most recent first) **Category 2: Fresh PRs - No Reviews Yet** - Criteria: No comments except from: - PR author - Bot accounts (openshift-ci-robot, openshift-merge-robot, k8s-ci-robot, etc.) - No reviews from any user - Sort by age (oldest first for priority) **Category 3: In Discussion** - Criteria: Has comments/reviews from humans (not just bots/author) - Does NOT have `approved` + `lgtm` labels - Not in "Fresh PRs" category **Category 4: Ready for Additional Review** - Criteria: Has some approvals but may need more - Tide shows additional labels needed - Sort by age **Category 5: Excluded from Review** - PRs with merge conflicts (`mergeable: "CONFLICTING"`) - Draft PRs (unless in "My PRs" mode) - PRs with failing required CI (based on tide status) - Show count summary only, don't list details ### Step 5: Generate Report **Report structure:** ```markdown # Review Queue Report Repository: {org/repo} OR All Repositories Generated: {timestamp} Current User: @{username} --- ## My PRs Needing Attention ({count}) ### Awaiting Reviews ({count}) {list PRs with metadata} ### Requested Changes ({count}) {list PRs with metadata} ### Blocked by CI ({count}) {list PRs with metadata} ### Ready to Merge ({count}) {list PRs with metadata} --- ## Repository: {org/repo} ({total} open PRs, {reviewable} needing review) ### PRs I've Reviewed ({count}) {list PRs with metadata} ### Fresh PRs - No Reviews Yet ({count}) {list PRs with metadata} ### In Discussion ({count}) {list PRs with metadata} ### Excluded from Review - {count} with merge conflicts - {count} drafts - {count} with failing required CI ``` **PR metadata format:** ```markdown - #{number} {title} (opened {X} days ago) Author: @{author} Tide: {tide_description} CI: {passing}/{total} checks passing Reviews: {approval_summary} Labels: {relevant_labels} Changes: +{additions}/-{deletions} across {files} files URL: {pr_url} ``` **Calculate PR age:** ```bash # Use jq to calculate days since creation echo "$PR_JSON" | jq -r ' (.createdAt | fromdateiso8601) as $created | (now | floor) as $now | (($now - $created) / 86400 | floor) as $days | "\($days) days ago" ' ``` **Approval summary examples:** - "2 approvals (@user1, @user2)" - "1 approval, 1 change request (@user3)" - "No reviews yet" ### Step 6: Add Interactive Options (Optional) After displaying the report, optionally ask user: ``` Would you like to: 1. Open a specific PR in browser 2. Fetch a PR to address reviews (/utils:address-reviews) 3. Refresh the report 4. Exit ``` If user selects option 2, invoke the address-reviews command. ## Return Value **Format:** Markdown report with categorized PR lists **Content:** - Summary statistics (total PRs, reviewable PRs, blocked PRs) - Categorized PR lists with detailed metadata - Actionable insights (which PRs need attention first) - Tide status interpretation for each PR **Example output:** ```markdown # Review Queue Report Repository: openshift/installer Generated: 2025-10-31 14:23 UTC Current User: @stbenjam --- ## My PRs Needing Attention (3) ### Awaiting Reviews (2) - #5234 feat: add support for custom networking (opened 3 days ago) Author: @stbenjam Tide: Needs lgtm label and approved label CI: 5/6 checks passing (e2e-aws pending) Reviews: No reviews yet Labels: size/L Changes: +347/-123 across 8 files URL: https://github.com/openshift/installer/pull/5234 - #5189 fix: correct AWS region validation (opened 1 day ago) Author: @stbenjam Tide: Needs lgtm label, needs approved label CI: All 6 checks passing Reviews: No reviews yet Labels: size/S, bugfix Changes: +23/-15 across 2 files URL: https://github.com/openshift/installer/pull/5189 ### Requested Changes (1) - #5156 refactor: improve error handling in bootstrap (opened 5 days ago) Author: @stbenjam Tide: Needs lgtm label after addressing feedback CI: All 7 checks passing Reviews: 1 change request (@reviewer1, 2 days ago) Labels: size/M Changes: +156/-89 across 5 files URL: https://github.com/openshift/installer/pull/5156 --- ## Repository: openshift/installer (28 open PRs, 15 needing review) ### PRs I've Reviewed (2) - #5198 feat: support for additional Azure regions (opened 7 days ago) Author: @contributor1 Your last comment: 3 days ago Tide: Needs approved label CI: All 8 checks passing Reviews: 1 lgtm (@stbenjam), awaiting approval Labels: size/M, azure Changes: +234/-67 across 12 files URL: https://github.com/openshift/installer/pull/5198 - #5167 fix: handle IPv6 configuration edge cases (opened 10 days ago) Author: @contributor2 Your last comment: 5 days ago Tide: Needs lgtm label and approved label CI: 7/8 checks passing (unit-tests failing) Reviews: 2 comments (@stbenjam, @other-reviewer) Labels: size/L, networking Changes: +445/-178 across 15 files URL: https://github.com/openshift/installer/pull/5167 ### Fresh PRs - No Reviews Yet (5) - #5221 fix: prevent timeout errors during cluster creation (opened 4 days ago) Author: @contributor3 Tide: Needs lgtm label and approved label CI: 7/8 checks passing (e2e-gcp pending) Reviews: No reviews yet Labels: size/M, bugfix Changes: +87/-34 across 4 files URL: https://github.com/openshift/installer/pull/5221 - #5215 feat: add retry logic for API calls (opened 5 days ago) Author: @contributor4 Tide: Needs lgtm label and approved label, Job e2e-aws failed CI: 6/8 checks passing (2 jobs failing) Reviews: No reviews yet Labels: size/L Changes: +312/-156 across 9 files URL: https://github.com/openshift/installer/pull/5215 [... 3 more PRs ...] ### In Discussion (8) - #5187 feat: improve logging throughout installer (opened 8 days ago) Author: @contributor5 Tide: Needs approved label CI: All 8 checks passing Reviews: 1 lgtm (@reviewer2), 2 comments (@reviewer3, @reviewer4) Labels: size/XL, enhancement Changes: +678/-234 across 23 files URL: https://github.com/openshift/installer/pull/5187 [... 7 more PRs ...] ### Excluded from Review - 3 PRs with merge conflicts - 2 draft PRs - 4 PRs with failing required CI - 1 bot PR (renovate) --- 💡 Priority recommendations: 1. Review fresh PRs (5) - especially #5221 (4 days old) 2. Address change requests on your PR #5156 3. Follow up on PRs you've reviewed (#5167 has failing tests) ``` ## Examples ### Example 1: Check Your Own PRs ``` /git:review-queue ``` Output: ```markdown # Review Queue Report All Repositories Generated: 2025-10-31 14:30 UTC Current User: @alice --- ## My PRs Needing Attention (4) ### Awaiting Reviews (3) - #234 [openshift/api] feat: add new validation rules (opened 2 days ago) Tide: Needs lgtm label and approved label CI: All 4 checks passing Reviews: No reviews yet URL: https://github.com/openshift/api/pull/234 - #567 [kubernetes/kubernetes] fix: correct scheduler behavior (opened 5 days ago) Tide: Needs lgtm label and approved label CI: 15/16 checks passing (integration-test pending) Reviews: No reviews yet URL: https://github.com/kubernetes/kubernetes/pull/567 - #89 [openshift/installer] docs: update installation guide (opened 1 day ago) Tide: Needs lgtm label and approved label CI: All 3 checks passing Reviews: No reviews yet URL: https://github.com/openshift/installer/pull/89 ### Requested Changes (1) - #445 [openshift/cluster-api] refactor: improve error handling (opened 7 days ago) Tide: Needs lgtm label after addressing feedback CI: All 6 checks passing Reviews: 1 change request (@bob, 3 days ago) URL: https://github.com/openshift/cluster-api/pull/445 --- 💡 Priority: Address change request on PR #445, then follow up on #567 (oldest) ``` ### Example 2: Check Repository Review Queue ``` /git:review-queue openshift/installer ``` Output: ```markdown # Review Queue Report Repository: openshift/installer Generated: 2025-10-31 14:35 UTC Current User: @bob --- ## Repository: openshift/installer (18 open PRs, 12 needing review) ### PRs I've Reviewed (1) - #5234 feat: add support for custom networking (opened 3 days ago) Author: @alice Your last comment: 1 day ago Tide: Needs approved label CI: All 6 checks passing Reviews: 1 lgtm (@bob), awaiting approval URL: https://github.com/openshift/installer/pull/5234 ### Fresh PRs - No Reviews Yet (6) - #5267 fix: handle cluster deletion errors (opened 2 days ago) Author: @charlie Tide: Needs lgtm label and approved label CI: All 7 checks passing Reviews: No reviews yet Labels: size/S, bugfix Changes: +34/-12 across 2 files URL: https://github.com/openshift/installer/pull/5267 - #5245 feat: add support for proxy configuration (opened 6 days ago) Author: @diana Tide: Needs lgtm label and approved label CI: 8/9 checks passing (e2e-vsphere pending) Reviews: No reviews yet Labels: size/L, enhancement Changes: +423/-67 across 11 files URL: https://github.com/openshift/installer/pull/5245 [... 4 more PRs ...] ### In Discussion (5) - #5198 feat: improve Azure integration (opened 9 days ago) Author: @eve Tide: Needs lgtm label CI: All 8 checks passing Reviews: 2 comments (@frank, @grace) Labels: size/XL, azure Changes: +789/-234 across 19 files URL: https://github.com/openshift/installer/pull/5198 [... 4 more PRs ...] ### Excluded from Review - 2 PRs with merge conflicts - 1 draft PR - 3 PRs with failing required CI --- 💡 Priority recommendations: 1. Review fresh PR #5245 (6 days old, substantial changes) 2. Review fresh PR #5267 (small bugfix, easy win) 3. PR #5234 (you reviewed) needs approval from maintainer ``` ### Example 3: Repository with No PRs Needing Review ``` /git:review-queue openshift/api ``` Output: ```markdown # Review Queue Report Repository: openshift/api Generated: 2025-10-31 14:40 UTC Current User: @henry --- ## Repository: openshift/api (4 open PRs, 0 needing review) All open PRs are either: - Draft PRs (2) - Have merge conflicts (1) - Awaiting CI results (1) ### Excluded from Review - 2 draft PRs - 1 PR with merge conflicts - 1 PR with failing required CI --- ✅ No PRs currently need review. Check back later! ``` ### Example 4: Your PRs All In Good State ``` /git:review-queue ``` Output: ```markdown # Review Queue Report All Repositories Generated: 2025-10-31 14:45 UTC Current User: @isabel --- ## My PRs Needing Attention (0) ### Ready to Merge (2) - #678 [openshift/installer] feat: add new platform support (opened 4 days ago) Tide: In merge queue (position 3) CI: All 8 checks passing Reviews: 2 approvals (@jack, @karen) URL: https://github.com/openshift/installer/pull/678 - #345 [openshift/api] fix: validation bug (opened 2 days ago) Tide: Ready to merge CI: All 4 checks passing Reviews: 2 approvals (@lisa, @mike) URL: https://github.com/openshift/api/pull/345 --- ✅ All your PRs are approved or in the merge queue! ``` ### Example 5: Large Repository with Many PRs ``` /git:review-queue kubernetes/kubernetes ``` Output shows first 50 PRs with note: ```markdown # Review Queue Report Repository: kubernetes/kubernetes Generated: 2025-10-31 14:50 UTC Current User: @noah --- ## Repository: kubernetes/kubernetes (247 open PRs, showing 50 most recent) â„šī¸ Note: This repository has many open PRs. Showing most recent 50. Use filters to narrow down: - gh pr list --repo kubernetes/kubernetes --label "area/scheduler" - gh pr list --repo kubernetes/kubernetes --author "@me" [... categorized list of 50 PRs ...] --- 💡 Tip: Focus on "Fresh PRs" in your area of expertise for maximum impact ``` ## Arguments - `org/repo` (optional): Repository to analyze in format `owner/repo`. If omitted, shows your PRs across all repositories. ## Notes ### Bot Account Detection The following accounts are considered bots and their comments are excluded when determining "fresh PRs": - `openshift-ci-robot` - `openshift-merge-robot` - `openshift-merge-bot` - `k8s-ci-robot` - `k8s-merge-robot` - `dependabot[bot]` - `renovate[bot]` - Any account ending in `[bot]` Exception: The PR author's own comments are always excluded regardless of account type. ### Tide Status Interpretation Tide is Prow's merge automation system. Common tide status messages: **Success states:** - "Merge will happen soon" - In merge queue - "Ready to merge" - Will merge on next tide cycle **Pending states:** - "Needs lgtm label" - Awaiting reviewer LGTM - "Needs approved label" - Awaiting approver approval - "Waiting for batch" - In merge pool, waiting turn **Failure states:** - "PR has a merge conflict" - Must resolve conflicts - "Job {name} failed" - Required CI job failed - "Missing required label" - Needs specific label to merge ### Performance Considerations - For repositories with >100 PRs, only the 100 most recent are analyzed - API calls are batched where possible to avoid rate limits - Results can be cached for 5-10 minutes for repeated queries - Use `--json` output from `gh` CLI for efficient parsing ### GitHub Permissions This command requires: - Read access to the repository - GitHub CLI (`gh`) authenticated - Access to GitHub Status API for tide information ### Caveats - Tide status is specific to Prow-based CI systems (OpenShift, Kubernetes) - For non-Prow repos, falls back to checking labels and review status - Draft PRs are excluded in repository mode but shown in "My PRs" mode - Bot PRs (renovate, dependabot) are excluded unless authored by you