home / skills / yonatangross / orchestkit / release-management

release-management skill

/plugins/ork/skills/release-management

This skill automates GitHub releases with semantic versioning, changelog generation, and gh CLI workflows to streamline tagging and publishing.

npx playbooks add skill yonatangross/orchestkit --skill release-management

Review the files below or copy the command above to add this skill to your agents.

Files (5)
SKILL.md
6.7 KB
---
name: release-management
license: MIT
compatibility: "Claude Code 2.1.34+. Requires gh CLI."
description: GitHub release workflow with semantic versioning, changelogs, and release automation using gh CLI. Use when creating releases, tagging versions, or publishing changelogs.
context: fork
version: 1.0.0
author: OrchestKit
tags: [git, github, releases, versioning, changelog, automation]
user-invocable: false
complexity: low
metadata:
  category: document-asset-creation
---

# Release Management

Automate releases with `gh release`, semantic versioning, and changelog generation.

## Quick Reference

### Create Release

```bash
# Auto-generate notes from PRs
gh release create v1.2.0 --generate-notes

# With custom title
gh release create v1.2.0 --title "Version 1.2.0: Performance Update" --generate-notes

# Draft release (review before publishing)
gh release create v1.2.0 --draft --generate-notes

# Pre-release (beta, rc)
gh release create v1.2.0-beta.1 --prerelease --generate-notes

# With custom notes
gh release create v1.2.0 --notes "## Highlights
- New auth system
- 50% faster search"

# From notes file
gh release create v1.2.0 --notes-file RELEASE_NOTES.md
```

### List & View Releases

```bash
# List all releases
gh release list

# View specific release
gh release view v1.2.0

# View in browser
gh release view v1.2.0 --web

# JSON output
gh release list --json tagName,publishedAt,isPrerelease
```

### Verify Releases (gh CLI 2.86.0+)

```bash
# Verify release attestation (sigstore)
gh release verify v1.2.0

# Verify specific asset
gh release verify-asset v1.2.0 ./dist/app.zip

# Verify with custom trust policy
gh release verify v1.2.0 --owner myorg
```

### Manage Releases

```bash
# Edit release
gh release edit v1.2.0 --title "New Title" --notes "Updated notes"

# Delete release
gh release delete v1.2.0

# Upload assets
gh release upload v1.2.0 ./dist/app.zip ./dist/app.tar.gz
```

---

## Semantic Versioning

```text
MAJOR.MINOR.PATCH
  │     │     │
  │     │     └── Bug fixes (backwards compatible)
  │     └──────── New features (backwards compatible)
  └────────────── Breaking changes

Examples:
  1.0.0 → 1.0.1  (patch: bug fix)
  1.0.1 → 1.1.0  (minor: new feature)
  1.1.0 → 2.0.0  (major: breaking change)

Pre-release:
  2.0.0-alpha.1  (early testing)
  2.0.0-beta.1   (feature complete)
  2.0.0-rc.1     (release candidate)
```

---

## Release Workflow

### Standard Release

```bash
# 1. Ensure main is up to date
git checkout main
git pull origin main

# 2. Determine version bump
# Check commits since last release
gh release view --json tagName -q .tagName  # Current: v1.2.3
git log v1.2.3..HEAD --oneline

# 3. Create and push tag
git tag -a v1.3.0 -m "Release v1.3.0"
git push origin v1.3.0

# 4. Create GitHub release
gh release create v1.3.0 \
  --title "v1.3.0: Feature Name" \
  --generate-notes

# 5. Close milestone if used
gh api -X PATCH repos/:owner/:repo/milestones/5 -f state=closed
```

### Hotfix Release

```bash
# 1. Branch from release tag
git checkout -b hotfix/v1.2.4 v1.2.3

# 2. Fix and commit
git commit -m "fix: Critical security patch"

# 3. Tag and release
git tag -a v1.2.4 -m "Hotfix: Security patch"
git push origin v1.2.4
gh release create v1.2.4 --title "v1.2.4: Security Hotfix" \
  --notes "Critical security fix for authentication bypass"

# 4. Merge fix to main
git checkout main
git cherry-pick <commit-sha>
git push origin main
```

---

## Changelog Generation

### Auto-Generated (from PRs)

```bash
# GitHub auto-generates from merged PRs
gh release create v1.2.0 --generate-notes

# Output includes:
# ## What's Changed
# * feat: Add user auth by @dev in #123
# * fix: Login redirect by @dev in #124
# * docs: Update README by @dev in #125
```

### Custom Changelog Template

Create `.github/release.yml`:

```yaml
changelog:
  categories:
    - title: "Breaking Changes"
      labels:
        - "breaking"
    - title: "New Features"
      labels:
        - "enhancement"
        - "feature"
    - title: "Bug Fixes"
      labels:
        - "bug"
        - "fix"
    - title: "Documentation"
      labels:
        - "documentation"
    - title: "Other Changes"
      labels:
        - "*"
```

### Manual CHANGELOG.md

```markdown
# Changelog

## [1.3.0] - 2026-01-15

### Added
- User authentication system (#123)
- Dark mode support (#125)

### Changed
- Improved search performance (#126)

### Fixed
- Login redirect loop (#124)

### Security
- Updated dependencies for CVE-2026-1234
```

---

## Automation with GitHub Actions

```yaml
# .github/workflows/release.yml
name: Release

on:
  push:
    tags:
      - 'v*'

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Build
        run: npm run build

      - name: Create Release
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          gh release create ${{ github.ref_name }} \
            --generate-notes \
            ./dist/*.zip
```

---

## Version Bumping Script

```bash
#!/bin/bash
# bump-version.sh

CURRENT=$(gh release view --json tagName -q .tagName | sed 's/v//')
IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT"

case $1 in
  major) NEW="$((MAJOR + 1)).0.0" ;;
  minor) NEW="$MAJOR.$((MINOR + 1)).0" ;;
  patch) NEW="$MAJOR.$MINOR.$((PATCH + 1))" ;;
  *) echo "Usage: $0 [major|minor|patch]"; exit 1 ;;
esac

echo "Bumping $CURRENT -> $NEW"
git tag -a "v$NEW" -m "Release v$NEW"
git push origin "v$NEW"
gh release create "v$NEW" --generate-notes
```

Usage:

```bash
./bump-version.sh patch  # 1.2.3 -> 1.2.4
./bump-version.sh minor  # 1.2.4 -> 1.3.0
./bump-version.sh major  # 1.3.0 -> 2.0.0
```

---

## Release Checklist

```markdown
## Release v1.3.0 Checklist

### Pre-Release
- [ ] All PRs merged to main
- [ ] CI/CD passing on main
- [ ] Version numbers updated in package.json/pyproject.toml
- [ ] CHANGELOG.md updated
- [ ] Documentation updated
- [ ] Milestone closed

### Release
- [ ] Tag created and pushed
- [ ] GitHub release created
- [ ] Release notes reviewed
- [ ] Assets uploaded (if applicable)

### Post-Release
- [ ] Deployment verified
- [ ] Announcement posted (if applicable)
- [ ] Next milestone created
```

---

## Best Practices

1. **Use semantic versioning** - Communicate change impact
2. **Draft releases first** - Review notes before publishing
3. **Generate notes from PRs** - Accurate, automatic history
4. **Close milestone on release** - Track completion
5. **Tag main only** - Never tag feature branches
6. **Announce breaking changes** - Prominent in release notes

## Related Skills

- github-operations: Milestones, issues, and CLI reference
- git-workflow: Branching and recovery patterns

## References

- [Semantic Versioning](references/semver.md)
- [Release Automation](references/release-automation.md)

Overview

This skill automates GitHub releases using the gh CLI with semantic versioning, changelog generation, and release automation patterns. It provides commands, templates, and scripts to create, verify, and manage releases reliably. Use it to standardize tagging, changelog output, and CI-driven release workflows across projects.

How this skill works

The skill provides ready-to-use gh CLI commands and shell scripts to create releases, generate notes from merged PRs, upload assets, and verify attestation. It includes a semantic versioning guide, a bump script to increment versions, a customizable changelog template (.github/release.yml), and a CI workflow example that triggers on tag pushes. It also documents hotfix and standard release procedures and a release checklist to ensure consistency.

When to use it

  • When publishing a new version or tagging a release
  • When you need consistent changelogs generated from PR metadata
  • When automating releases in CI/CD (GitHub Actions)
  • When creating pre-releases or hotfixes with clear process
  • When verifying release artifacts or using sigstore attestation

Best practices

  • Follow MAJOR.MINOR.PATCH semantic versioning to communicate impact
  • Draft releases first to review generated notes before publishing
  • Generate release notes automatically from merged PRs for accuracy
  • Keep tagging on main only; merge fixes back into main after hotfixes
  • Close milestones and update CHANGELOG.md as part of the release checklist
  • Include verification steps (gh release verify) for signed or critical assets

Example use cases

  • Standard release: bump version, tag, push, then gh release create --generate-notes
  • Hotfix flow: branch from a release tag, fix, tag hotfix, create release and cherry-pick to main
  • Automated CI release: GitHub Actions triggered on tag push runs build and creates release with artifacts
  • Changelog customization: define categories and labels in .github/release.yml for organized release notes
  • Version bump script: run ./bump-version.sh {patch|minor|major} to tag and publish new release automatically

FAQ

How do I generate release notes from merged PRs?

Use gh release create <tag> --generate-notes; GitHub aggregates merged PR titles, labels, and authors into sections like "What's Changed."

Can I run releases from CI?

Yes. Trigger workflows on tag pushes and use GH_TOKEN or GITHUB_TOKEN to call gh release create and upload built artifacts.