From gh-pms
Drain the `type:request` inbox — for each deferred user ask, decide accept-as-feature / accept-as-bug / reject / defer-again. Promotes accepted requests into real work; closes rejected ones with a documented reason. Auto-invoke when the user says "triage requests", "drain the inbox", "what's in the request queue".
How this skill is triggered — by the user, by Claude, or both
Slash command
/gh-pms:gh-triageThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Walk the `type:request` queue and convert each item into a decision: real work, rejected, or punt for later. Closes the loop on `gh-request`'s deferred captures.
Walk the type:request queue and convert each item into a decision: real work, rejected, or punt for later. Closes the loop on gh-request's deferred captures.
gh-context / gh-status is creeping upgh issue list --repo {owner}/{repo} --label type:request --state open --limit 100 \
--json number,title,body,createdAt,labels,assignees \
--jq 'sort_by(.createdAt)'
Oldest first — the longer something has sat unpromoted, the higher the priority on triage.
If the queue is empty, report No requests to triage. ✓ and exit.
Use AskUserQuestion with four options. Title shown is the request body's first line, plus the days-since-filed:
Request #{N}: "{first line of body}"
Filed {days} days ago by @{author}.
[a] Accept as feature → run /gh-pms:gh-feature with this body as objective
[b] Accept as bug → run /gh-pms:gh-bug with this body as steps_to_reproduce
[r] Reject → close with reason (you'll be asked for the reason)
[d] Defer again → leave it; increment a `Deferred` counter in the body
/gh-pms:gh-feature with:
title = request title (strip [Request] prefix if present)objective = request bodykind = feature (or chore if the user picked that variant)severity:* label if set, else defaultM#N:
🔁 Promoted to #${M} (feature)completed with reason "Promoted to issue #${M}"✓ #${N} → #${M} (feature)Same as 3a but call /gh-pms:gh-bug. The request body becomes the bug's ## Actual section; ask the user for a 1-line ## Expected if the body doesn't already have one.
AskUserQuestion: "Why are you rejecting #${N}? (free-text reason)"## Rejection reason section to the request body (or update if exists)❌ Rejected: ${reason}not_planned (gh issue close ${N} --reason "not planned")✗ #${N} rejected — ${reason}## Deferred section; if missing, add one with 1. If present, increment.mcp__github__issue_write (update_issue).⏸ Deferred #${N} (count: ${new_count}). If count crosses 3, also tag with severity:low to surface the staleness next triage round.… #${N} deferred (now ${new_count})If the user passed --all, jump back to Step 2 with the next item until the queue is empty or the user picks "stop".
Otherwise, after one item: ask "Continue with next request? [yes/no/stop]" and loop or exit accordingly.
Triage session done.
Accepted as feature : 2 (#42 #43)
Accepted as bug : 1 (#44)
Rejected : 3 (#21 #22 #23)
Deferred again : 1 (#19)
Skipped (still open): 0
--all because the user keeps clicking "Reject", but there's no single-keystroke "reject everything" — that would defeat the purpose.#${M} promoted from #${N}) appear in both timelines./gh-pms:gh-request (which files them) and /gh-pms:gh-context (which surfaces the count). Triage is the closing of the loop.severity:critical should ideally never sit in the queue more than 24h — gh-status could flag it; gh-triage doesn't enforce, only reports.npx claudepluginhub fadymondy/gh-pms --plugin gh-pmsGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.