Audit open GitHub issues for staleness, orphaned blockers, missing labels, codebase drift, and already-implemented features. Categorizes issues into close-candidates, update-needed, needs-triage, stale, and healthy. Supports bulk and individual remediation via interactive approval. Triggers: audit issues, clean up issues, update stale issues, issue hygiene, backlog cleanup, prune issues.
From project-managernpx claudepluginhub rube-de/cc-skills --plugin project-managerThis skill is limited to using the following tools:
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Details PluginEval's skill quality evaluation: 3 layers (static, LLM judge), 10 dimensions, rubrics, formulas, anti-patterns, badges. Use to interpret scores, improve triggering, calibrate thresholds.
Audit open GitHub issues for staleness, drift, and hygiene problems. Categorize findings and execute approved remediations.
1. Auth Check → 2. Detect Repo → 3. Fetch Issues → 4. Pass 1: Metadata Audit
→ 5. Pass 2: Codebase-Aware Audit → 6. Categorize → 7. Present Report
→ 8. Interactive Remediation → 9. Execute Actions → 10. Summary
gh auth status
On failure: Stop and tell the user to run gh auth login.
gh repo view --json nameWithOwner -q .nameWithOwner
On failure: Ask the user for the target repository (owner/repo).
gh issue list --state open --limit 100 --json number,title,body,labels,assignees,milestone,createdAt,updatedAt,author
Edge case — no open issues: Report "No open issues to audit" and stop.
Edge case — 100+ issues: Warn the user that results are capped at 100. Suggest filtering by label or milestone for larger backlogs.
Check each issue for these problems:
| Check | Condition | Severity |
|---|---|---|
| Stale | No updates in 30+ days | Medium |
| Ancient | No updates in 90+ days | High |
| Orphaned blocker | References Blocked by: #<number> where the referenced issue is closed (see batch verification note below) | Medium |
| Completed sub-tasks | All - [x] checkboxes checked but issue still open | High |
| Missing labels | No type label (bug, enhancement, etc.) | Low |
| Missing priority | No priority label (P0-P3) | Low |
| Abandoned assignment | Assigned but no updates in 14+ days | Medium |
For each issue, collect all matching problems into a findings list.
Batch verification for orphaned blockers: Step 3 already fetches all open issues. Any blocker reference (Blocked by: #<number>) where the number is absent from the open set is treated as resolved — no extra API call needed. Only use gh issue view for edge cases where you need to distinguish "closed" from "never existed".
For issues that reference specific files or features, cross-check against the codebase:
For issues whose body contains file paths (e.g., src/auth/login.ts):
Glob to check if remaining paths still existFor feature requests and bug fixes:
Grep to search for those patterns in the codebasegh pr list --state all --search "ISSUE_NUMBER" --limit 5 --json number,title,state,mergedAt
Check if:
Sort issues into five categories based on findings:
| Category | Criteria | Suggested Action |
|---|---|---|
| Close Candidates | Has merged PR, all checkboxes done, or flagged as possibly-implemented | Close with comment |
| Update Needed | Orphaned blockers, file drift, stale assignment | Edit issue metadata |
| Needs Triage | Missing labels, missing priority, no clear scope | Add labels, clarify scope |
| Stale | 30-90 days inactive, no PR activity | Ping assignee or add stale label |
| Healthy | Recently active, properly labeled, has assignee or clear owner | No action needed |
Show a structured report by category:
## Issue Audit Report
### Close Candidates (3 issues)
| Issue | Title | Reason |
|-------|-------|--------|
| #12 | Add user avatars | Merged PR #45, all acceptance criteria met |
| #18 | Fix login redirect | Feature already implemented (found in src/auth/redirect.ts) |
| #23 | Update deps | Ancient (142 days), no activity |
### Update Needed (2 issues)
| Issue | Title | Problem | Fix |
|-------|-------|---------|-----|
| #31 | Refactor API layer | Blocked by #12 (closed) | Remove stale blocker reference |
| #35 | Add caching | References src/old/cache.ts (deleted) | Update file paths |
### Needs Triage (4 issues)
| Issue | Title | Missing |
|-------|-------|---------|
| #40 | Something about auth | No type label, no priority |
| #41 | Performance issue | No priority label |
| ... | ... | ... |
### Stale (2 issues)
| Issue | Title | Last Activity | Assignee |
|-------|-------|---------------|----------|
| #28 | Add dark mode | 45 days ago | @alice |
| #33 | Improve tests | 38 days ago | unassigned |
### Healthy (8 issues)
✓ 8 issues are properly maintained — no action needed.
### Summary
- 3 close candidates
- 2 issues need metadata updates
- 4 issues need triage
- 2 stale issues
- 8 healthy issues
For each non-healthy category, use AskUserQuestion to get approval:
Close Candidates:
Question: "How should I handle close candidates?"
Options:
- Close all 3 with a comment
- Let me review each one individually
- Skip — don't close any
Update Needed:
Question: "Should I fix the metadata issues?"
Options:
- Fix all automatically
- Let me review each fix
- Skip — I'll handle these manually
Needs Triage:
Question: "Should I add missing labels?"
Options:
- Add suggested labels to all
- Let me review each suggestion
- Skip
Stale Issues:
Question: "How should I handle stale issues?"
Options:
- Add 'stale' label to all
- Comment pinging assignees
- Skip
For "review each" options, iterate through issues one at a time with per-issue AskUserQuestion.
Run approved actions using gh CLI:
Closing issues:
gh issue close ISSUE_NUMBER --comment "Closing: [reason]. Identified by /pm:update audit."
Editing issue metadata:
gh issue edit ISSUE_NUMBER --add-label "label-name"
gh issue edit ISSUE_NUMBER --remove-assignee "username"
Removing stale blocker references:
gh issue comment ISSUE_NUMBER --body "Removed stale blocker reference to CLOSED_ISSUE_NUMBER (now closed). Issue is unblocked."
Pinging stale assignees:
gh issue comment ISSUE_NUMBER --body "@username — This issue hasn't been updated in [X] days. Are you still working on it? If not, I can unassign so someone else can pick it up."
After all actions complete, print a final summary:
## Audit Complete
| Action | Count | Issues |
|--------|-------|--------|
| Closed | 3 | #12, #18, #23 |
| Labels added | 4 | #40, #41, #42, #43 |
| Blockers cleaned | 1 | #31 |
| Stale pings sent | 2 | #28, #33 |
| Skipped | 0 | — |
Total: 10 actions taken across 10 issues.
Suggest: "Run /pm:next to see what to work on now that the backlog is cleaned up."