From gh-pms
Cut a new release for the plugin — bundle issues closed since the last tag into a CHANGELOG entry, bump semver in plugin.json, refresh the README "What's new" banner, tag the commit, and (optionally) create a GitHub release. Auto-invoke when the user says "ship vX.Y", "cut a release", "release the plugin", "bump version".
How this skill is triggered — by the user, by Claude, or both
Slash command
/gh-pms:gh-releaseThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Ship a new release in one shot. Replaces the manual sequence of "edit plugin.json → write CHANGELOG entry → update README → tag → push".
Ship a new release in one shot. Replaces the manual sequence of "edit plugin.json → write CHANGELOG entry → update README → tag → push".
main after merging the final PRgh-release [--bump patch|minor|major]
[--dry]
[--no-tag]
[--no-release]
[--commit]
[--since <ref-or-date>]
| Flag | Default | Effect |
|---|---|---|
--bump | minor | Semver step. patch for bug-only, major for breaking changes. |
--dry | off | Print what would change without touching anything. |
--no-tag | tags by default | Skip git tag (you'll tag manually). |
--no-release | creates GH release after push | Skip gh release create (only writes CHANGELOG + README). |
--commit | off (changes left staged for review) | Auto-commit the version bump as chore(release): vX.Y.Z. |
--since | last git tag | Override the cutoff. Required for the very first run if the repo has no tags yet. Accepts a ref, tag, or YYYY-MM-DD. |
Reads plugins/gh-pms/.claude-plugin/plugin.json, applies the requested semver bump, refuses if the resulting version already appears in CHANGELOG.md or as a git tag (idempotency).
Default: git describe --tags --abbrev=0. If no tags exist, the skill refuses and asks for an explicit --since — better than silently bundling everything that ever merged.
Calls gh pr list --state merged --search "merged:>$cutoff". For each merged PR, parses Closes #N from the body and pulls that issue's labels. PRs with no Closes # reference are skipped (so non-issue commits like docs/CI don't show up — they belong in ### Changed of the user's own writing if material).
Based on the closed issue's type:* label:
| Issue label | CHANGELOG bucket |
|---|---|
type:feature (or no type) | ### Added |
type:chore | ### Changed |
type:bug / type:hotfix | ### Fixed |
plugin.json — bumps versionCHANGELOG.md — prepends the new ## [X.Y.Z] — YYYY-MM-DD entry above any prior entriesREADME.md — inserts a new ## What's new in vX.Y block; demotes the previous one to ### From vX.Y: (previous release) (rename the placeholder to a punchier title afterwards if you like)--commit) commits with chore(release): vX.Y.ZvX.Y.Z✓ plugin.json: 0.4.0 → 0.5.0
✓ CHANGELOG.md: prepended v0.5.0 entry (5 issues)
✓ README.md: 'What's new in v0.5' banner inserted; previous demoted
✓ tagged v0.5.0
Next steps:
git push origin main --follow-tags
gh release create v0.5.0 --title "v0.5.0" --notes-file <(...)
gh-pms ultimately needs this to ship.main, not during. The skill operates on the merged state, not in-flight branches.--since on the very first run (no tags yet), the skill refuses with a clear error — fix is to pass --since <date-of-prior-release>.If you've been hand-cutting releases (or this is the first release ever):
# Tag the previous release retroactively at its release-commit:
git tag -a v0.4.0 <sha-of-the-v0.4-release-commit> -m "Release v0.4.0"
git push origin v0.4.0
# Then the skill works without --since on every subsequent release:
${CLAUDE_PLUGIN_ROOT}/lib/gh-release.sh --bump minor --commit
(previous release) — refine it manually if you want the historical title preserved with character.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.