| name | my-semantic-release |
| description | **ALWAYS use when user mentions:** "release", "ship it", "cut a release",
"changelog", "version bump", "semver", "conventional commit".
**DO NOT use for:** daily VCS operations ā use @skills/my-jj-workflow.
Automates semantic versioning, changelog generation, and release workflows.
|
My Semantic Release
Automate semantic versioning, changelog generation, and release workflows.
ā” Quick Start
Quick version bump check:
git log v1.2.0..HEAD --format='%s' | grep -E '^feat:|^fix:'
git log v1.2.0..HEAD --format='%b' | grep 'BREAKING CHANGE'
Quick release workflow:
- Update CHANGELOG.md with new version section
- Bump version in package.json / Cargo.toml / etc.
- Commit:
chore(release): X.Y.Z
- Tag:
git tag -a vX.Y.Z -m "Release vX.Y.Z"
- Push:
git push origin main && git push origin vX.Y.Z
Overview
This skill provides workflows for:
- Semantic versioning ā Determine version bumps from conventional commits
- Changelog generation ā Auto-generate CHANGELOG.md from commit history
- Conventional commits ā Format commits for release automation
- Release workflow ā Full release automation chain
Prerequisites
The project should follow Conventional Commits specification:
feat: ā New features (minor version bump)
fix: ā Bug fixes (patch version bump)
BREAKING CHANGE: ā Breaking changes (major version bump)
docs:, style:, refactor:, test:, chore: ā No version bump
Workflows
1. Generate Changelog
Trigger phrases: "generate changelog", "update CHANGELOG.md", "create changelog"
Steps:
- Find last release tag/version
- Collect commits since last release
- Categorize by conventional commit type
- Write/update CHANGELOG.md
Concrete commands:
git describe --tags --abbrev=0
git log v1.2.0..HEAD --oneline --no-decorate
jj log -r 'tags()::@' --no-graph
Changelog format:
## [Unreleased]
### Added
- New features...
### Fixed
- Bug fixes...
## [1.2.0] - 2026-04-16
...
2. Determine Version Bump
Trigger phrases: "what version bump", "should this be major/minor/patch", "semantic version"
Steps:
- Analyze commits since last tag
- Check for BREAKING CHANGE markers
- Check for feat: commits
- Check for fix: commits
- Recommend version bump
Concrete analysis commands:
git log v1.2.0..HEAD --format='%s%n%b%n---' | grep -E '(BREAKING CHANGE:|^feat:|^fix:|^docs:|^style:|^refactor:)'
git log v1.2.0..HEAD --format='%s' | grep -c '^feat:'
git log v1.2.0..HEAD --format='%s' | grep -c '^fix:'
git log v1.2.0..HEAD --format='%b' | grep -c 'BREAKING CHANGE'
Decision rules:
BREAKING CHANGE: in any commit ā MAJOR (1.2.0 ā 2.0.0)
feat: present ā MINOR (1.2.0 ā 1.3.0) (if no breaking change)
fix: present ā PATCH (1.2.0 ā 1.2.1) (if no feat/breaking)
- Only docs/style/refactor ā No bump
3. Format Conventional Commit
Trigger phrases: "format this commit", "conventional commit for release", "write commit message for feat/fix"
Use this to write properly formatted commit messages that feed into release automation:
| Type | Use when | Example |
|---|
feat | Adding features | feat(auth): add JWT token support |
fix | Fixing bugs | fix(api): handle null response |
docs | Documentation only | docs(readme): update install steps |
style | Formatting, no logic | style: run biome format |
refactor | Code restructuring | refactor(db): extract connection pool |
test | Adding tests | test(auth): add login flow tests |
perf | Performance improvements | perf(db): optimize query |
chore | Maintenance tasks | chore(deps): update dependencies |
4. Full Release Workflow (Chained)
Trigger phrases: "create release", "release version", "bump version and release", "ship it"
This workflow chains all operations in sequence:
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā STEP 0: PRE-RELEASE VERIFICATION (Critical!) ā
ā āā> Run full check suite (biome, tests, typecheck) ā
ā āā> Fix any format/lint issues BEFORE tagging ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā STEP 1: Semantic Versioning ā
ā āā> Analyze commits since last tag ā
ā āā> Detect major/minor/patch (or none) ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā STEP 2: Changelog Generation ā
ā āā> Generate CHANGELOG.md with new version section ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā STEP 3: Version Bump ā
ā āā> Update package.json, Cargo.toml, etc. ā
ā āā> Commit version bump ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā STEP 4: Release Commit & Tag ā
ā āā> Commit: "chore(release): X.Y.Z" ā
ā āā> Tag: vX.Y.Z ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā ļø CRITICAL: Pre-Release Verification
ALWAYS run full checks before tagging. CI failures after tagging require force-pushing the tag:
just check
Concrete execution (example: 1.2.0 ā 1.3.0):
cat package.json | jq '.version = "1.3.0"' > package.json.tmp && mv package.json.tmp package.json
jj describe -m "chore(release): 1.3.0"
jj commit
git tag -a "v1.3.0" -m "Release v1.3.0"
git push origin main
git push origin v1.3.0
Integration with VCS
This skill assumes you have version control set up (see @skills/my-jj-workflow for jj/git workflows). The release workflow:
- Reads commit history via jj/git
- Writes changelog, version bumps, commits, tags
- Uses jj or git depending on your setup
Custom Release Tools
Some projects have custom release automation (e.g., just release, make release, npm run release) that handles tagging and pushing automatically. Check first before manually tagging.
Signs of custom release tools:
justfile, Makefile, or package.json scripts with release target
- Workflow files that trigger on tags but also create tags themselves
- Documentation saying "run
just release" instead of manual tagging
If custom tool exists:
- Bump version in
package.json (or relevant file)
- Update
CHANGELOG.md
- Commit with
chore(release): X.X.X message
- Run the custom tool (e.g.,
just release) - it will tag and push for you
Do NOT manually run git tag if the tool does it automatically - this creates duplicate or mismatched tags.
Example: npm Project with just release
A typical npm project with just release which:
- Reads version from
package.json
- Validates version matches conventional commits
- Creates and pushes the tag automatically
- Monitors GitHub Actions with auto-retry (up to 3 times)
Correct workflow:
jj describe -m "chore(release): X.X.X"
jj commit
just release
Wrong workflow (creates tag at wrong commit):
git tag -a vX.X.X -m "Release vX.X.X"
just release
Advanced: Skip monitoring
RELEASE_NO_WATCH=1 just release
Common CI Failures & Recovery
Failure: Biome Format Errors
Symptom: CI fails with "Formatter would have printed the following content"
Common causes:
jq modified package.json with wrong indentation (2 spaces vs tabs)
- New test files have unsorted imports
- File saved without final newline
Fix:
just fix
jj commit -m "style: fix biome formatting"
git tag -d vX.Y.X
git tag -a vX.Y.X -m "Release vX.Y.X" <new-commit-hash>
git push --force origin vX.Y.X
Failure: Test Failures
Symptom: CI fails during test phase
Fix:
just test
Failure: TypeScript Errors
Symptom: npx tsc --noEmit fails
Fix:
npx tsc --noEmit --skipLibCheck
Example Release Session
Before: package.json has "version": "1.2.0", last tag is v1.2.0
$ git log v1.2.0..HEAD --format='%s' | grep -E '^feat:|^fix:'
feat: add user profiles
fix: handle auth edge case
ā Recommendation: MINOR bump (1.2.0 ā 1.3.0)
$ cat > /tmp/changelog_section.md << 'EOF'
- User profiles feature
- Auth edge case handling
EOF
$ cat /tmp/changelog_section.md CHANGELOG.md > CHANGELOG.md.new
$ mv CHANGELOG.md.new CHANGELOG.md
$ cat package.json | jq '.version = "1.3.0"' > package.json.tmp
$ mv package.json.tmp package.json
$ jj st
$ jj describe -m "chore(release): 1.3.0"
$ jj commit
$ git tag -a v1.3.0 -m "Release v1.3.0"
$ git push origin main && git push origin v1.3.0
When NOT to Use This Skill
- Daily commit operations ā Use @skills/my-jj-workflow
- Checking what changed ā Use @skills/my-jj-workflow
- Push to GitHub ā Use @skills/my-jj-workflow
- Worktree management ā Use @skills/my-jj-workflow
Use this skill only when the conversation is about releases, versioning, or changelog.