From gh-pms
Re-enter a `done` issue at `status:in-progress` with a clean audit trail. Auto-creates a fresh feature branch off the protected base. Auto-invoke when the user says "reopen
How this skill is triggered — by the user, by Claude, or both
Slash command
/gh-pms:gh-reopenThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Bring a closed issue back into the lifecycle when its work regresses or needs additional follow-up. Closes the gh-pms loop's missing reverse arrow.
Bring a closed issue back into the lifecycle when its work regresses or needs additional follow-up. Closes the gh-pms loop's missing reverse arrow.
done feature surfaced a bug that's actually a regression of the original work, not a new defectgh-reopen <issue-number> --reason "<text>" [--force] [--no-branch]
| Flag | Required | Effect |
|---|---|---|
<issue> | yes | Closed issue number to reopen. |
--reason | yes | Short why-text. Becomes part of the reopen comment + audit trail. |
--force | no | Bypass the WIP-limit guardrail (assignee already has an in-progress issue). |
--no-branch | no | Skip auto-creating a fresh feature branch. Use only when continuing work in an existing branch. |
Verify the issue is currently closed:
STATE=$(gh issue view {N} --json state -q .state)
If OPEN, refuse: "Issue #${N} is already open. Use /gh-pms:gh-current to start work on it."
Verify WIP guardrail unless --force:
ME=$(gh api user --jq .login)
gh issue list --assignee "$ME" --label status:in-progress --state open --json number
Refuse if non-empty: "You already have an in-progress issue (#${other}). Finish it or pass --force."
gh issue reopen {N}
Use the unified setter so label + Project v2 field stay atomic:
${CLAUDE_PLUGIN_ROOT}/lib/ghcall.sh set-status {N} "In Progress"
This swaps status:done for status:in-progress AND updates the Project board's Status field.
Pull the previous close timestamp and the closing PR (if any) for context:
PREV_CLOSED=$(gh issue view {N} --json closedAt -q .closedAt)
CLOSING_PR=$(gh issue view {N} --json closedByPullRequestsReferences -q '.closedByPullRequestsReferences | first.number // empty')
Post:
🔁 Reopened — {reason}
- Previously closed: {PREV_CLOSED}
- Closing PR: {#CLOSING_PR or "—"}
- Reopened by: @{me}
--no-branch)Same template as gh-current, with kind_short derived from the issue's type:* label:
SLUG=$(echo "{title}" | tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9]+/-/g; s/^-+|-+$//g')
BRANCH="${KIND_SHORT}/${N}-${SLUG}"
git checkout {protected_base}
git pull --ff-only
git checkout -b "$BRANCH"
Append the branch name to the audit comment so future visitors see where the rework happened.
{
"{N}": {
"current_status": "in-progress",
"last_transition_at": "{ISO now}",
"branch": "{BRANCH}",
"base": "{protected_base}",
"reopened_at": "{ISO now}",
"reopen_count": <prev + 1>
}
}
🔁 Reopened #{N}: {title}
Reason: {reason}
Branch: {BRANCH}
Previous PR: #{closing_pr or "—"}
Status: In Progress
Reopen count: {n} ({n}/3 before staleness flag)
Next: do the work, then /gh-pms:gh-advance #{N} or /gh-pms:gh-push #{N}
If reopen_count >= 3, also surface a warning: this issue has reopened ≥3 times — consider splitting it or filing a follow-up chore to address the underlying instability.
in-progress — it does NOT skip Gates 1-5 just because they passed pre-close. The gates are the source of truth for "is the new work also done".gh-status and gh-context should both surface reopened issues distinctly (e.g. 🔁 #N) so the team sees recurrence at a glance.gh-bug linked to the original via /gh-pms:gh-relate related_to. Reopen is for "this issue's work needs more iteration", not "this issue caused a critical incident".closed-as-not-planned (rejected) issue — for those, file a fresh issue if the user changed their mind. Reject means reject.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.