Release Commits Readme Stats
Release automation playbook for commits-readme-stats with semantic version tags:
- •Tag format:
vMAJOR.MINOR.PATCH - •Example progression:
- •
v4.0.0 -> v4.0.1 -> v4.1.0 -> v5.0.0
- •
Use this skill when the user asks to cut/publish a release for this repository.
Required Companion Skill
Always invoke $release-notes-writer to draft the release notes body and section structure.
Important: this skill overrides versioning to full semver (vMAJOR.MINOR.PATCH) even if $release-notes-writer examples show vMAJOR.MINOR.
Prerequisites
Run before any release operation:
git status --short --branch git fetch --tags --prune gh auth status
Rules:
- •Working tree must be clean.
- •Current branch should be
mainunless user explicitly requests another target. - •
ghauthentication must be valid.
Step 1: Discover Last Tag and Change Set
LAST_TAG="$(git tag --list 'v*' --sort=-version:refname | head -n1)"
If no tag exists:
- •Use
v1.0.0as initial release unless user specifies otherwise. - •Build change context from full history.
If tag exists:
git log --oneline "$LAST_TAG"..HEAD git log --no-merges --pretty=format:'%h %s' "$LAST_TAG"..HEAD git diff --name-only "$LAST_TAG"..HEAD git diff --stat "$LAST_TAG"..HEAD
If zero commits since last tag, stop and report "No release needed."
Step 2: Decide Bump Type (Major/Minor/Patch)
Pick the highest required bump from commit messages and effective behavior changes.
Major bump
Choose major when any of these are true:
- •Commit follows conventional-commit breaking syntax (
type!:) or containsBREAKING CHANGE. - •Backward-incompatible behavior in action inputs/outputs/public config.
- •Required environment variables or defaults are removed/renamed incompatibly.
Minor bump
Choose minor when:
- •New backward-compatible feature is added (typically
feat:commits). - •New optional capabilities or inputs are introduced without breaking existing users.
Patch bump
Choose patch for:
- •Fixes, refactors, dependency bumps, docs/tests/chore changes.
- •Stability and correctness improvements without feature surface expansion.
Step 3: Compute Next Version
Normalize the last tag to semver first:
- •
v4.0should be treated asv4.0.0. - •
v3.0.0staysv3.0.0.
Bump logic:
- •
major:X.Y.Z -> (X+1).0.0 - •
minor:X.Y.Z -> X.(Y+1).0 - •
patch:X.Y.Z -> X.Y.(Z+1)
Candidate tag must not already exist locally or remotely.
Step 4: Draft Release Notes (via release-notes-writer)
Use $release-notes-writer formatting and guidance to create notes:
- •
## What's Newsummary - •
### ✨ Features(if any) - •
### 🔧 Improvements(if any) - •
### 🐛 Bug Fixes(if any) - •
### ⚠️ Breaking Changes(major only) - •
**Full Changelog**: <previous-tag>...<new-tag>
Write notes to a file:
NOTES_FILE="/tmp/commits-readme-stats-${NEW_TAG}-notes.md"
Step 5: Confirm Before Git Operations
Present to the user:
- •Last tag
- •Commits since last tag
- •Proposed bump rationale (
major|minor|patch) - •Proposed new tag
- •Draft release notes
Proceed only after explicit user approval.
Step 6: Create Tag, Push, and Publish Release
git tag -a "$NEW_TAG" -m "Release $NEW_TAG" git push origin "$NEW_TAG" gh release create "$NEW_TAG" \ --repo VatsalSy/commits-readme-stats \ --target main \ --title "GitHub Commit Stats $NEW_TAG" \ --notes-file "$NOTES_FILE"
Step 7: Post-Release Validation
Verify:
git show --no-patch "$NEW_TAG" gh release view "$NEW_TAG" --repo VatsalSy/commits-readme-stats
Report:
- •Final tag
- •Release URL
- •Number of commits included
- •Any follow-up doc/version reference updates needed
Error Recovery
| Error | Resolution |
|---|---|
| Tag exists | Compute next available tag and re-propose |
| Dirty working tree | Ask user to commit/stash, or stop |
| No commits since last tag | Skip release and report |
| gh unauthenticated | Run gh auth login |
| Push/release rejected | Check permissions/protection rules and retry with corrected target |