Skip to content
Back to skills

Github:Prs

ASecurity

PR health analysis - CI passing without review, stale PRs, merge conflicts

  • 299 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 20, 2026
devopsgobashgit

Security analysis

A100/100

Scanned September 20, 2026

npx -y skills add rossoctl/rossoctl --skill github:prs --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Github:Prs?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Github:Prs
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/rossoctl-github-prs/badge)](https://www.skillsdirectory.com/skills/rossoctl-github-prs)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: github:prs
description: PR health analysis - CI passing without review, stale PRs, merge conflicts
---

# PR Health

Analyze open PRs to find those needing review, stuck in CI, or going stale.

## Variables

Set at session start:

```bash
export OWNER=<org-or-user>
export REPO=<repo-name>
```

## When to Use

- Weekly PR grooming
- Finding PRs ready to merge
- Identifying stuck or abandoned PRs

> **Auto-approved**: All `gh` commands are read-only and auto-approved.

## Analysis Steps

### 1. All Open PRs

```bash
gh pr list --repo $OWNER/$REPO --state open --json number,title,author,createdAt,updatedAt,reviewDecision,statusCheckRollup
```

### 2. PRs Passing CI Without Review

```bash
gh pr list --repo $OWNER/$REPO --state open --json number,title,author,reviewDecision,statusCheckRollup --jq '.[] | select(.reviewDecision != "APPROVED") | select(.statusCheckRollup != null) | select([.statusCheckRollup[] | select(.conclusion == "FAILURE")] | length == 0) | "#\(.number) \(.title) (@\(.author.login))"'
```

### 3. Stale PRs (no update > 14 days)

```bash
gh pr list --repo $OWNER/$REPO --state open --json number,title,updatedAt,author --jq '.[] | select(.updatedAt < (now - 14*24*3600 | strftime("%Y-%m-%dT%H:%M:%SZ"))) | "#\(.number) \(.title) (last: \(.updatedAt))"'
```

### 4. PRs with Failing CI

```bash
gh pr list --repo $OWNER/$REPO --state open --json number,title,statusCheckRollup --jq '.[] | select(.statusCheckRollup != null) | select([.statusCheckRollup[] | select(.conclusion == "FAILURE")] | length > 0) | "#\(.number) \(.title)"'
```

### 5. PRs with Merge Conflicts

```bash
gh pr list --repo $OWNER/$REPO --state open --json number,title,mergeable --jq '.[] | select(.mergeable == "CONFLICTING") | "#\(.number) \(.title)"'
```

## PR Health Report

```markdown
## PR Health Report

### Ready to Merge (CI passing, needs review): N
- [list — prioritize these for review]

### Failing CI: N
- [list — authors should investigate]

### Stale (> 14 days): N
- [list — ping authors or close]

### Merge Conflicts: N
- [list — needs rebase]
```

## Troubleshooting

### Problem: statusCheckRollup is null for all PRs
**Symptom**: jq filters on CI status return no results.
**Fix**: The repo may not have required status checks. Use `gh pr checks <N> --repo $OWNER/$REPO` per-PR instead.

### Problem: mergeable shows UNKNOWN
**Symptom**: GitHub hasn't computed mergeability yet.
**Fix**: Wait a few seconds and re-query — GitHub computes this lazily. Or open the PR in the browser to trigger the check.

### Problem: Stale query returns too many results
**Symptom**: Old PRs with recent bot comments show as active.
**Fix**: Filter by `updatedAt` AND check `comments` count or last human comment date.

## Related Skills

- `github:last-week` - Weekly summary including PRs
- `github:issues` - Issue triage
- `ci:status` - Detailed CI check analysis
- `repo:pr` - PR creation format
- `git:rebase` - Fix merge conflicts

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.