git-release
Skill8 starsChanged 48 days agoMITView on GitHub
Create semantic version releases with automated changelog generation
- Installs packages
- Commits and pushes
5 other projects use a version of this.
Adopted by
Most recently taken up by
- Zenobia000/agent-skills-startertheir own version, first seen Nov 1, 2026
- troskater/flowdeck-claudetheir own version, first seen Oct 25, 2026
- keithmackay/git-releasetheir own version, first seen Oct 11, 2026
- qhkm/zeptoclaw-skillstheir own version, first seen Feb 26, 2026
- denghuinow/agent-skillstheir own version, first seen Jan 29, 2026
Other versions5 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 5
- denghuinow/agent-skills★ 4same name
- qhkm/zeptoclaw-skills★ 4same name
- Zenobia000/agent-skills-starter★ 4same name
- keithmackay/git-release★ 1same name
- troskater/flowdeck-claude★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository53 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- agent-browserSkill
- anything-to-skillSkill
- ci-generateSkill
- ci-localSkill
- clotho-researchSkill
- codex-imagegenSkill
- create-ruleSkill
- create-skillSkill
- db-migrateSkill
- docker-initSkill
- docs-adrSkill
- docs-checkSkill
- docs-diagramSkill
- docs-initSkill
- docs-rfcSkill
- docs-updateSkill
- env-setupSkill
- find-skillsSkill
- fix-bugSkill
- git-commitSkill
- git-create-prSkill
- gitflowSkill
- git-syncSkill
- i18n-checkSkill
- implement-featureSkill
- improve-skillSkill
- inject-docsSkill
- jira-cliSkill
- motion-studioSkill
- optimize-ai-setupSkill
- orchestrateSkill
- oss-launchSkill
- prd-to-issuesSkill
- product-design-specSkill
- product-design-tokensSkill
- product-prdSkill
- project-illustratorSkill
- project-plannerSkill
- refactorSkill
- renderSkill
- review-codeSkill
- review-depsSkill
- review-designSkill
- review-perfSkill
- review-planSkill
- review-securitySkill
- shipSkill
- stopslopSkill
- test-suiteSkill
- vrt-checkSkill
- wtfSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
26 rules. 0 are common, 16 are distinctive, and 10 are very specific to this project.
0
Common
Most of the 4 edited versions we read keep these.
16
Distinctive
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 20
Create semantic version releases with automated changelog generation from conventional commits, version file updates, and GitHub release …
- Distinctive: line 25
Verify every change: analyze actual commits, not assumptions
- Distinctive: line 38
If no tags exist, collect all commits on the current branch
- Distinctive: line 39
If a tag exists, collect commits since that tag
- Distinctive: line 54
If there are no commits since the last tag, abort with a clear message
- Very specific: line 71
If no previous tag, start from 0.1.0 (first feature release) or 1.0.0 if user specifies
- Distinctive: line 86
Read existing CHANGELOG.md (if it exists) to understand the current format and preserve it
- Distinctive: line 119
Only include sections that have entries.
- Distinctive: line 127
Use short commit hashes (7 chars) linked to the full commit URL
- Very specific: line 128
If scope exists, bold it: scope: description
- Distinctive: line 129
If no scope: just the description
- Very specific: line 133
If CHANGELOG.md exists, insert the entry after the # Changelog header, preserving existing entries below it
- Very specific: line 134
If CHANGELOG.md does not exist, this entry becomes the file's first entry under a new # Changelog header
- Distinctive: line 142
If the heading is missing, or every section under it is empty, abort before creating the release commit: "CHANGELOG.md write produced empty …
- Very specific: line 146
When --changelog-only is passed, skip Phases 4-6 entirely:
- Distinctive: line 148
Run Phases 1-3 normally (collect commits, detect version bump, build the changelog entry)
- Distinctive: line 149
Write CHANGELOG.md using the Phase 3 step 5 insertion logic, including its step 6 verification (abort here on a failed verification, do not …
- Distinctive: line 151
Stop here: no tag, version bump, commit, or GitHub release
- Distinctive: line 153
Use case: draft a changelog before deciding on a release, or maintain a running changelog during development.
- Very specific: line 199
If --dry-run (or -n) was passed: stop here.
- Very specific: line 232
Use mktemp with an explicit XXXXXX template (bare mktemp -t name fails on GNU): a fixed path (e.g.
- Very specific: line 256
When force flags conflict (e.g., --major --minor), use the highest: major > minor > patch.
- Very specific: line 260
No conventional commits: If commits don't follow conventional format, default to patch bump and list all commits under Other Changes
- Distinctive: line 264
No remote: If git push fails due to no remote, skip push and GitHub release, warn the user
- Very specific: line 274
Never skip hooks: Never pass --no-verify on the release commit
- Distinctive: line 275
No inline execution: Nothing in Phase 1-4 writes to the working tree, the first mutation is Phase 5 item 1, after approval
“Common” is measured: kept by at least 6 in 10 of the 4 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Release Manager
Create semantic version releases with automated changelog generation from conventional commits, version file updates, and GitHub release publishing.
Quality Guidelines
Release operations are high-consequence and irreversible once pushed:
- Verify every change: analyze actual commits, not assumptions
- Confirm version bump: the detected semver bump must match the change scope
- Validate changelog: every entry must correspond to a real commit
- User approval required: confirm before executing anything in Phase 5
Workflow
Phase 1: Collect Commits Since Last Tag
- Find the latest tag:
git describe --tags --abbrev=0 2>/dev/null || echo "none"- If no tags exist, collect all commits on the current branch
- If a tag exists, collect commits since that tag
- Collect commits:
# With existing tag
git log <last-tag>..HEAD --format="%H %s" --no-merges
# Without existing tag (first release)
git log --format="%H %s" --no-merges- Validate preconditions:
- Working tree is clean:
git status --porcelain - On the expected branch (main/master or release branch)
- Remote is up to date:
git fetch origin && git log HEAD..origin/$(git branch --show-current) --oneline - If there are no commits since the last tag, abort with a clear message
- Unless
--no-githubor--changelog-only,gh auth statusmust pass; if it fails, stop and ask the user to fix it. Requiresgh(brew install gh, thengh auth login).
Phase 2: Auto-detect version bump
- Parse each commit using conventional commit format:
- Extract type:
feat,fix,docs,style,refactor,perf,test,build,ci,chore,revert - Extract scope (optional): text in parentheses after type
- Detect breaking changes:
!after type/scope ORBREAKING CHANGE:in commit body - For non-conventional commits, classify as
other
This is plain regex/string parsing over commit subjects, do it inline regardless of commit count, no agent needed.
- Determine version bump: load
references/semver-guide.mdfor the full commit-type → bump mapping and pre-1.0 rules. The highest-priority bump wins (major > minor > patch). - Calculate new version:
- Parse last tag as semver (strip leading
vif present) - If no previous tag, start from
0.1.0(first feature release) or1.0.0if user specifies - Apply the detected bump
- Respect
--major,--minor, or--patchoverride from arguments
- Display version summary: the counts must reflect commits you actually parsed in step 1, never estimated:
Current version: v1.2.3
Detected bump: minor (2 features, 5 fixes, 3 chores)
New version: v1.3.0
Breaking changes: nonePhase 3: Build the CHANGELOG Entry
- Read existing CHANGELOG.md (if it exists) to understand the current format and preserve it
- Group commits by type using this order and heading format:
## [1.3.0](https://github.com/owner/repo/compare/v1.2.3...v1.3.0) (YYYY-MM-DD)
### Breaking Changes
- **scope:** description ([hash](url))
### Features
- **scope:** description ([hash](url))
### Bug Fixes
- **scope:** description ([hash](url))
### Performance
- **scope:** description ([hash](url))
### Documentation
- **scope:** description ([hash](url))
### Other Changes
- **scope:** description ([hash](url))Type-to-heading mapping:
- Breaking changes (any type with
!orBREAKING CHANGE:) → Breaking Changes feat→ Featuresfix→ Bug Fixesperf→ Performancedocs→ Documentationrefactor,style,test,build,ci,chore,revert,other→ Other Changes
Only include sections that have entries. Omit empty sections.
- Generate comparison URL:
gh repo view --json url -q .url 2>/dev/null || git remote get-url origin- Construct the changelog entry:
- Use short commit hashes (7 chars) linked to the full commit URL
- If scope exists, bold it:
**scope:** description - If no scope: just the description
- Date format:
YYYY-MM-DD
- Insertion logic (defines the mechanics only, nothing is written to disk yet, so the Phase 4 preview and a later abort both stay side-effect-free):
- If CHANGELOG.md exists, insert the entry after the
# Changelogheader, preserving existing entries below it - If CHANGELOG.md does not exist, this entry becomes the file's first entry under a new
# Changelogheader - Maintain a blank line between the header and first entry, and between entries
- The actual file write happens in Phase 5 item 3, or Phase 3b step 2 for changelog-only mode: both reuse this same logic
- Verify the write (same call sites as step 5): after writing the file, re-read it and confirm the new version heading (
## [<new-version>]) is present and that at least one section under it has a real bullet line, not just an empty### Headingwith nothing below. A narrated changelog is not evidence the write succeeded, check the file on disk, e.g.:
grep -A2 "## \[<new-version>\]" CHANGELOG.mdIf the heading is missing, or every section under it is empty, abort before creating the release commit: "CHANGELOG.md write produced empty sections, release aborted, no commit created." Do not proceed to Phase 5 item 4 (or, in changelog-only mode, report success) on a failed verification.
Phase 3b: Changelog-only mode (if --changelog-only)
When --changelog-only is passed, skip Phases 4-6 entirely:
- Run Phases 1-3 normally (collect commits, detect version bump, build the changelog entry)
- Write CHANGELOG.md using the Phase 3 step 5 insertion logic, including its step 6 verification (abort here on a failed verification, do not report success)
- Display the updated changelog entry to the user
- Stop here: no tag, version bump, commit, or GitHub release
Use case: draft a changelog before deciding on a release, or maintain a running changelog during development.
# Example output for --changelog-only
git-release --changelog-only
# → Scans commits since v1.2.3
# → Writes changelog entry to CHANGELOG.md
# → Reports: "CHANGELOG.md updated with 8 commits. No tag or release created."Phase 4: User Approval
- Display release summary:
=== Release Summary ===
Version: v1.2.3 → v1.3.0 (minor)
Tag: v1.3.0
Commits: 12 commits since v1.2.3
Branch: main
Changelog preview:
─────────────────────
## [1.3.0](...) (2025-01-15)
### Features
- **auth:** add OAuth2 login support (abc1234)
- **api:** add rate limiting endpoint (def5678)
### Bug Fixes
- **api:** resolve null pointer in user endpoint (ghi9012)
─────────────────────
Version files to update:
- package.json (1.2.3 → 1.3.0)
- pyproject.toml (1.2.3 → 1.3.0)
Actions:
1. Update version files
2. Update CHANGELOG.md
3. Create git commit: "chore(release): v1.3.0"
4. Create git tag: v1.3.0
5. Push commit and tag to origin
6. Create GitHub release with changelog- If
--dry-run(or-n) was passed: stop here. The summary above already shows everything that would happen, this flag is the only dry-run entry point, so no separate "preview" option is offered below. - Otherwise, ask for confirmation:
- "Proceed with release": continue to Phase 5
- "Change version": ask for the desired version, recalculate, re-display the summary
- "Abort": exit cleanly with "Release cancelled."
Phase 5: Execute Release
Copy this checklist into your reply and tick each item only after its check passes. Do the items in order. If a gate fails, stop, report which item failed and what manual cleanup may be needed, and do not continue past it.
- [ ] 1. Bump every version file that exists: `package.json`, `package-lock.json` (root `"version"`), `pyproject.toml` (`[project]` or `[tool.poetry]`), `Cargo.toml` (`[package]`), `VERSION` / `VERSION.txt` (whole file), `setup.cfg` (`[metadata]`), `build.gradle` / `build.gradle.kts`. Skip unknown formats and tell the user.
- [ ] 2. Re-parse each bumped manifest and confirm it prints `<new-version>`. Gate: any mismatch, return to item 1.
- [ ] 3. Write CHANGELOG.md (Phase 3 step 5 logic) and run the Phase 3 step 6 verification. Gate: verification fails, stop, no commit.
- [ ] 4. Stage by explicit path: `git add CHANGELOG.md <each bumped manifest>`, then check `git diff --cached --name-only` lists only those files. Gate: any other file staged, run `git reset -q <path>` on it (or stop and ask), never continue with extras.
- [ ] 5. `git commit -m "chore(release): v<new-version>"`. Gate: a hook fails, fix the cause and return to item 4, never `--no-verify`.
- [ ] 6. `git tag -a v<new-version> -m "Release v<new-version>"`. Gate: tag exists, stop (see Edge Cases).
- [ ] 7. `git push origin $(git branch --show-current)`, then `git push origin v<new-version>`. Gate: either push fails, stop and report; nothing is released until the tag is pushed.
- [ ] 8. Unless `--no-github`: `notes_file=$(mktemp "${TMPDIR:-/tmp}/release-notes.XXXXXX")`, write the changelog entry without its `## [version]` header to it, run `gh release create v<new-version> --title "v<new-version>" --notes-file "$notes_file" --latest`, then `rm -f "$notes_file"`. Gate: it fails, follow the recovery note below.
- [ ] 9. Show the completion summary.Manifest re-parse commands (jq is brew install jq; without it use python3 -c "import json;print(json.load(open('package.json'))['version'])"):
jq -r .version package.json package-lock.json
python3 -c "import tomllib;d=tomllib.load(open('pyproject.toml','rb'));print(d.get('project',{}).get('version') or d['tool']['poetry']['version'])"
python3 -c "import tomllib;print(tomllib.load(open('Cargo.toml','rb'))['package']['version'])"
cat VERSION
grep -E '^version' setup.cfg build.gradle build.gradle.ktsUse mktemp with an explicit XXXXXX template (bare mktemp -t name fails on GNU): a fixed path (e.g. /tmp/release-notes.md) can collide across concurrent or repeated runs.
Recovery: tag pushed but gh release create fails. The release is half done, do not re-tag or re-commit. Fix the cause (gh auth status, network, permissions) and re-run only gh release create for the existing tag. Delete the remote tag (git push origin :refs/tags/v<new-version>) only if the user explicitly confirms.
Completion summary (item 9):
Release v1.3.0 completed successfully!
- Commit: abc1234 chore(release): v1.3.0
- Tag: v1.3.0
- GitHub: https://github.com/owner/repo/releases/tag/v1.3.0
- Changelog: Updated CHANGELOG.mdArgument Parsing
Parse optional arguments from command arguments:
--major: Force a major version bump (overrides auto-detection)--minor: Force a minor version bump (overrides auto-detection)--patch: Force a patch version bump (overrides auto-detection)--dry-runor-n: Show what would happen without making changes (see Phase 4 step 2, the single dry-run entry point)--no-github: Skip GitHub release creation (only local tag + changelog)--changelog-only: Generate/update CHANGELOG.md only, skip tagging, version bumps, and GitHub release
When force flags conflict (e.g., --major --minor), use the highest: major > minor > patch.
Edge Cases
- No conventional commits: If commits don't follow conventional format, default to
patchbump and list all commits under Other Changes - Pre-release versions (e.g.,
0.x.y): Follow semver pre-1.0 rules, breaking changes bump minor, features bump minor, fixes bump patch - Monorepo: If multiple
package.jsonfiles exist, only update the root one. Warn the user about other version files found - Dirty working tree: Abort with a clear message asking the user to commit or stash changes first
- No remote: If
git pushfails due to no remote, skip push and GitHub release, warn the user - Tag already exists: If the computed tag already exists, abort and suggest a force flag or a different version
- CHANGELOG write verification fails: If the re-read in Phase 3 step 6 shows a missing heading or empty sections, abort before the release commit, never commit a changelog write you haven't confirmed on disk
Important Notes
- Conventional Commits: Works best with conventional commits (see the git-commit skill)
- Tag Format: Always uses
vprefix (e.g.,v1.3.0) unless existing tags use a different convention - CHANGELOG Format: Follows Keep a Changelog conventions
- Semver: Follows Semantic Versioning 2.0.0
- Never skip hooks: Never pass
--no-verifyon the release commit - No inline execution: Nothing in Phase 1-4 writes to the working tree, the first mutation is Phase 5 item 1, after approval
Examples
# Auto-detect version bump from commits
git-release
# Force a major version bump
git-release --major
# Preview without making changes
git-release --dry-run
# Release without creating a GitHub release
git-release --no-github
# Force minor bump, dry run
git-release --minor --dry-run
# Update CHANGELOG.md only (no tag or release)
git-release --changelog-onlyDoes it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

