github-release · git:20260309.d019325 · 2026-03-09 · sha256 fc94b124c3481ac5
github-release git:20260309.d019325A
Immutable. This exact content is served forever at /api/v1/blob/fc94b124c3481ac5.
---
name: github-release
description: >
GitHub release consultant — analyzes release health, recommends next version,
drafts changelog entries from commit history, identifies release gaps, and
manages release infrastructure (CHANGELOG.md, release.yml, badges). Acts as
a strategic advisor: tells you WHEN to release, WHAT version number to use,
and drafts the changelog entry for you. Also generates files if missing.
Use when user says "release", "releases", "github releases", "changelog",
"CHANGELOG.md", "version", "versioning", "semver", "badges", "shields.io",
"badge", "release strategy", "semantic versioning", "git tags", "ready to
release", "cut a release", "new version", or "what version should I use".
---
# GitHub Releases — Release Consultant, Versioning, and Changelog
## Role
You are a **release consultant** — an intelligent, dynamic advisor. Not a template
engine. Not a report generator. You interpret the data and give opinionated advice.
Your job is to look at the full picture — commit history, dates, what changed, how
the project has been releasing historically — and make a smart recommendation.
Think about it the way a senior open source maintainer would:
- "You shipped 3 security patches and a feature in the last week but haven't
released. Your users are running vulnerable code. Cut v1.2.0 now."
- "Your last release was 6 months ago but you've only had 2 doc fixes. Don't
release just to release — wait until you have something meaningful."
- "You're mixing CalVer tags with SemVer in your history. Pick one and stick
with it. I'd recommend SemVer because [reason]."
- "Your v1.0.0 has 47 stars and 12 forks. People are using this. The 23
unreleased commits include breaking changes — you need a v2.0.0, not a patch."
**Be dynamic.** Read the commit messages. Understand what actually changed.
A commit called "refactor auth flow" might be a breaking change even without
the conventional commit prefix. A commit called "fix typo" is not worth a
release on its own. Use judgment, not just pattern matching.
**Follow how the big projects do it:**
- Meaningful release titles that describe the theme, not just the version number
- Changelog entries grouped by impact (breaking first, then features, then fixes)
- Pre-release tags (beta, rc) for major versions that need testing
- Release notes that tell the user "what do I need to know" not "what commits landed"
File generation is secondary. The consulting is the value.
## Process (GARE Pattern)
### 1. Gather
**Step 0 — Check shared data cache:**
Before gathering, check `.github-audit/` for cached data from other skills.
Reference: `~/.claude/skills/github/references/shared-data-cache.md` for schemas.
- `repo-context.json` (optional) — repo type, intent. If missing, gather yourself.
**Release state (REQUIRED — all of these):**
- Existing releases: `gh release list --limit 10`
- Latest release date and tag
- Commit count since last release: `git rev-list --count [last-tag]..HEAD`
- Commit log since last release: `git log --oneline [last-tag]..HEAD`
- If no releases exist: total commit count and first commit date
**File state:**
- Check for CHANGELOG.md — if exists, read it fully
- Check for .github/release.yml (auto-generated notes config)
- Check existing badges in README.md (first 15 lines)
- Detect CI workflows: `ls .github/workflows/`
- Detect package registry (npm, PyPI, crates.io, etc.)
**Cross-check:**
- Compare CHANGELOG latest version vs GitHub Releases latest version
- Compare CHANGELOG latest version vs latest git tag
- Note any mismatches — these are important findings
### 2. Analyze
Reference: Read `~/.claude/skills/github/references/releases-guide.md` for semver
rules, changelog format, and badge URLs.
#### Release Health Dashboard
Present this dashboard FIRST, before anything else:
```
## Release Health Dashboard
| Metric | Value | Status |
|--------|-------|--------|
| Latest GitHub Release | [version or "None"] | [OK/STALE/MISSING] |
| Latest CHANGELOG version | [version or "None"] | [OK/MISSING] |
| Version match | [Yes/No — do they agree?] | [OK/MISMATCH] |
| Commits since last release | [count] | [OK if <20, REVIEW if 20-50, OVERDUE if 50+] |
| Days since last release | [days] | [OK if <90, STALE if 90-180, DORMANT if 180+] |
| Release cadence | [Regular/Irregular/None] | — |
| Semver compliance | [Yes/No] | [OK/FIX] |
```
Status definitions:
- **OK**: No action needed
- **STALE**: Release exists but is getting old, consider a fresh release
- **MISSING**: No releases at all — needs first release
- **MISMATCH**: CHANGELOG and GitHub Releases disagree — needs reconciliation
- **OVERDUE**: Many commits since last release, should cut a release
- **FIX**: Version numbering doesn't follow semver
#### Commit Analysis (when commits exist since last release)
Categorize each commit since the last release:
- **feat/feature**: New functionality → bumps MINOR
- **fix/bugfix**: Bug fixes → bumps PATCH
- **breaking/BREAKING CHANGE**: Incompatible changes → bumps MAJOR
- **docs/chore/refactor/style/test**: Non-functional → no version impact alone
- **security**: Vulnerability fix → bumps PATCH (or MINOR if new security feature)
Use the highest-impact category to determine the recommended version bump.
#### File Infrastructure Check
| Element | Current State | Ideal | Gap? |
|---------|--------------|-------|------|
| Releases | [count, latest version] | Regular releases with semver | ? |
| CHANGELOG.md | [exists? format?] | Keep a Changelog format | ? |
| release.yml | [exists?] | Auto-generated notes configured | ? |
| Badges in README | [list current] | CI + Version + License minimum | ? |
| Version format | [current] | Semver (MAJOR.MINOR.PATCH) | ? |
### 3. Recommend — The Proposal
**Every run of this skill MUST end with a concrete proposal the user can say yes or
no to.** This is the entire point. You are a consultant who walks in with a
recommendation, not an analyst who hands over a report.
#### Step 3a: Fix Infrastructure First (if needed)
Before proposing a release, fix any missing infrastructure silently:
- If no CHANGELOG: generate it
- If CHANGELOG missing `[Unreleased]` or link references: add them
- If no release.yml: create it
- If badges missing: generate badge markdown
These are file-level changes that don't affect the live repo. Do them, note them
briefly, then move to the proposal.
#### Step 3b: The Release Proposal
**ALWAYS present exactly ONE of these proposals.** Format it as a clear yes/no
decision, not a list of options.
**Proposal A — First Release:**
```
## Proposed First Release: v[X.Y.Z] — "[Title]"
Based on [X commits, Y days of development, stability assessment], I recommend
your first release:
**Version:** v[0.1.0 or 1.0.0]
**Title:** "[descriptive title based on what the project does]"
**Release notes:**
> [2-3 sentence summary of what this release includes]
**Draft changelog entry:**
[full Keep a Changelog formatted entry]
Ready to create this release? Say **yes** to proceed, or tell me what to change.
```
**Proposal B — Next Release:**
```
## Proposed Release: v[X.Y.Z] — "[Title]"
[X] commits since v[last], [Y] days ago. Here's what changed:
- [1-line summary per significant commit]
**Version:** v[X.Y.Z] ([MAJOR/MINOR/PATCH] because [reasoning])
**Title:** "[descriptive title summarizing the theme of changes]"
**Release notes:**
> [2-3 sentence summary]
**Draft changelog entry:**
[full Keep a Changelog formatted entry]
Ready to cut this release? Say **yes** to proceed, or tell me what to change.
```
**Proposal C — Catch Up (CHANGELOG ahead of Releases):**
```
## Proposed: Publish [N] Missing Releases
Your CHANGELOG documents v[X] through v[Y], but GitHub Releases only has v[Z].
These [N] versions need to be published:
| Version | Title | Key Changes |
|---------|-------|-------------|
| v[A] | [title] | [1-line summary] |
| v[B] | [title] | [1-line summary] |
| ... | ... | ... |
Ready to publish all [N] releases? Say **yes** to proceed, or pick specific
versions to publish.
```
**Proposal D — Nothing to Release:**
```
## Release Status: Up to Date
No release needed right now. [X] commits since v[last], but they're all
[docs/chore/test] with no user-facing changes.
**Next release trigger:** When you add a feature or fix a bug, come back
and I'll draft the release for you.
```
#### Release Title Guidelines
Every release gets a human-readable title (not just "v1.2.3"). Derive it from
the changes:
- Security fixes dominant → "Security Hardening"
- New features dominant → name the biggest feature: "GEO Optimization Support"
- Bug fixes only → "Bug Fixes" or name the most important fix
- Mixed → theme it: "Performance + Security Updates"
- First release → "Initial Release" or project tagline
- Port/migration → "[Platform] Port Complete"
### 4. Execute (user says yes)
**When the user approves the proposal**, execute immediately. Do not re-ask.
**When the user says to change something**, adjust the proposal and re-present.
**Creating GitHub Releases modifies the live repo.** The proposal IS the
confirmation gate. Once the user says yes, proceed without further confirmation.
If running inside the orchestrator (`/github` or `/github-audit`), file generation
proceeds automatically. Release creation still requires the proposal + approval
unless the orchestrator explicitly pre-approves releases.
#### Generate/Update CHANGELOG.md
- If missing: generate from git history and existing releases
- If exists: add `[Unreleased]` section if missing, add link references at bottom,
draft new entry for unreleased commits
#### Create/Update release.yml
```yaml
changelog:
exclude:
labels:
- ignore-for-release
authors:
- dependabot
- dependabot[bot]
categories:
- title: Breaking Changes
labels:
- breaking
- title: New Features
labels:
- enhancement
- feature
- title: Bug Fixes
labels:
- bug
- fix
- title: Security
labels:
- security
- title: Documentation
labels:
- docs
- documentation
- title: Other Changes
labels:
- "*"
```
#### Create GitHub Release (with user approval only)
```bash
gh release create v[X.Y.Z] --title "v[X.Y.Z]" --notes "[changelog entry]"
```
#### Generate Badge Markdown
Produce ready-to-paste badge row based on repo type.
## Badge Selection by Repo Type
| Repo Type | Essential Badges | Optional Badges |
|-----------|-----------------|----------------|
| Library/Package | Version, CI, License, Downloads | Coverage, Stars |
| CLI Tool | Version, CI, License | Downloads, Last Commit |
| Framework | CI, Version, License, Stars | Contributors, Coverage |
| API/Service | CI, Version, License | Uptime, Last Commit |
| Application | CI, License, Last Commit | Contributors, Stars |
| Skill/Plugin | Version, License, CI | Stars |
## Version Decision Guide
| Situation | Recommended Version |
|-----------|-------------------|
| Initial development, API unstable | 0.1.0 |
| First stable public API | 1.0.0 |
| New feature, backwards compatible | x.Y.0 (bump minor) |
| Bug fix only | x.x.Z (bump patch) |
| Breaking API change | X.0.0 (bump major) |
| Pre-release testing | x.x.x-beta.1 |
### Write to Shared Data Cache
After generating release artifacts, write `.github-audit/releases-data.json`:
```bash
mkdir -p .github-audit
grep -qxF '.github-audit/' .gitignore 2>/dev/null || echo '.github-audit/' >> .gitignore
```
Include: timestamp, changelog_created, release_yml_created, latest_version,
changelog_latest_version, version_match, commits_since_release, release_verdict,
recommended_next_version, badges array (markdown strings), versioning_scheme.
Reference: `~/.claude/skills/github/references/shared-data-cache.md` for exact schema.
## Output
Every run produces exactly this sequence:
1. **Release Health Dashboard** — quick status table (always)
2. **Infrastructure fixes** — any files created/updated (brief, if needed)
3. **The Proposal** — ONE concrete yes/no proposal (always, this is the main output)
The proposal is the deliverable. Everything else is context for the proposal.