lfx-pr-catchup/SKILL.md
Morning PR catch-up dashboard — shows unresolved comments, status changes, stale PRs, and approved-but-not-merged PRs across all your open PRs.
npx skillsauth add linuxfoundation/lfx-skills lfx-pr-catchupInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You generate a compact terminal dashboard of the user's open pull requests, highlighting what needs attention — unresolved comments, status changes, stale PRs, and approved-but-not-merged PRs.
This skill is read-only. It never modifies code, creates branches, or pushes commits.
gh auth status 2>&1
If authentication fails, tell the user:
GitHub CLI is not authenticated. Please run:
gh auth login
Then try /lfx-pr-catchup again.
Stop here if auth fails.
Do NOT ask the user for preferences. Proceed immediately with defaults.
Defaults:
ORG_FILTER — empty string (all orgs)STALE_DAYS — 7The user can override these by including preferences in their initial message when invoking the skill (e.g., "/lfx-pr-catchup linuxfoundation" or "/lfx-pr-catchup stale=14"). If the user's message includes an org name, set ORG_FILTER to --owner <org>. If it includes a number for stale days, set STALE_DAYS accordingly. Otherwise, use defaults and move straight to Step 3.
gh search prs --author=@me --state=open --limit=50 --json repository,number,title,url,updatedAt,createdAt ${ORG_FILTER}
No PRs found: Display a friendly message:
No open PRs found! You're all caught up.
If an org filter was used, suggest: "Try without the org filter to check all repos." Stop here.
50 PRs returned (hit the limit): Warn the user:
You have 50+ open PRs — showing the first 50. Consider filtering by org to narrow results.
For each PR, fetch detailed review and thread data using a single GraphQL call. Process PRs in batches to avoid rate limiting.
gh api graphql -f query='
query($owner: String!, $repo: String!, $number: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $number) {
number
title
url
updatedAt
mergeable
reviewDecision
reviewThreads(first: 50) {
nodes {
isResolved
comments(first: 1) {
nodes {
author { login }
createdAt
}
}
}
}
reviews(last: 10) {
nodes {
state
author { login }
submittedAt
}
}
reviewRequests(first: 10) {
nodes {
requestedReviewer {
... on User { login }
... on Team { name }
}
}
}
}
}
}' -f owner="$OWNER" -f repo="$REPO" -F number=$NUMBER
After each batch of 10 GraphQL calls, check the rate limit:
gh api rate_limit --jq '.resources.graphql'
If remaining is below 100:
GitHub API rate limit approaching — showing partial results.
Rate limit resets at [reset time].
If a GraphQL call fails for a specific PR (403/404), skip it and add a note:
(skipped — repo not accessible)
Do not fail the entire dashboard.
If GraphQL calls fail entirely (e.g., auth scope issue), fall back to REST enrichment:
gh pr view $NUMBER --repo $OWNER/$REPO --json reviews,reviewDecision,reviewRequests
Note: REST fallback loses isResolved accuracy for review threads. Mention this in output:
(Note: using REST fallback — unresolved comment counts may be approximate)
For each PR, classify zero or more signals. A PR can have multiple signals.
!!)| Signal | Condition |
|--------|-----------|
| Unresolved comments | reviewThreads has nodes where isResolved == false |
| Changes requested | reviews contains a review with state == "CHANGES_REQUESTED" that is not superseded by a newer review from the same author |
**)| Signal | Condition |
|--------|-----------|
| Approved but not merged | reviewDecision == "APPROVED" and PR is still open |
| Stale | updatedAt is older than STALE_DAYS days ago |
| Signal | Condition |
|--------|-----------|
| No reviewers assigned | reviewRequests is empty AND reviews is empty |
Output the dashboard directly as text. Use box-drawing characters for visual structure.
═══════════════════════════════════════════════════════════
PR CATCH-UP — [current date, e.g., March 17, 2026]
═══════════════════════════════════════════════════════════
[N] open PRs across [M] repos | [X] need attention | [Y] all clear
─── NEEDS ATTENTION ───────────────────────────────────────
[owner/repo]
#[number] [title]
!! [count] unresolved comments (from @[author1], @[author2])
!! Changes requested by @[reviewer] ([N] days ago)
[url]
#[number] [title]
** Approved but not merged (approved [N] days ago)
[url]
─── ALL CLEAR ─────────────────────────────────────────────
[owner/repo]
#[number] [title] — [short status summary]
#[number] [title] — [short status summary]
═══════════════════════════════════════════════════════════
owner/repo!! prefix = action needed (HIGH signals)** prefix = informational (MEDIUM signals)After rendering the dashboard, offer:
Want to dive deeper into any PR? Give me a number (e.g., #142) and I'll show:
- Full comment threads
- CI status details
- File diff summary
If the user provides a PR number, fetch and display:
# Review comments
gh pr view $NUMBER --repo $OWNER/$REPO --json comments,reviews,statusCheckRollup --template '...'
# CI status
gh pr checks $NUMBER --repo $OWNER/$REPO
Present the drill-down in a readable format, then offer to drill into another PR or end.
This skill DOES:
This skill does NOT:
tools
Create a new ticket in the LFXV2 Jira project (linuxfoundation.atlassian.net). Guides the user through picking an issue type (Bug, Story, Task, Epic), writing a concise summary, and capturing the requirement, feature, or bug context — collecting reproduction steps for bugs. Optionally attaches a parent epic, labels, or priority if the user provides them. Submits the ticket via Atlassian MCP and returns the URL. Use this skill any time someone asks to "create a Jira ticket", "open an LFXV2 ticket", "file a bug", "log a story", "write up a feature request", "draft a ticket", or any variation of submitting work into LFXV2.
development
Starting point for LFX development. Describe what you want in plain language and this skill routes you to the right workflow.
development
Generate compliant Angular 20 frontend code — components, services, templates, drawers, pagination UI, and styling. Encodes signal patterns, component structure, PrimeNG wrapper strategy, and all frontend conventions. Only activates in Angular repos.
testing
Combine multiple feature branches across repos into worktrees for end-to-end journey testing. Create, refresh, and teardown integration environments that merge branches from multiple repos.