skills/practices/release/SKILL.md
Automated release workflow — version bump from conventional commits, changelog generation, tagging, and optional push. Use when a project is ready to cut a release.
npx skillsauth add devjarus/coding-agent releaseInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Handles the full release pipeline: detect project type, determine version bump from commit history, generate changelog, update version files, commit, tag, and optionally push.
Check which version file exists (first match wins):
| File | Ecosystem | Version Location |
|------|-----------|-----------------|
| package.json | Node.js | .version field |
| pyproject.toml | Python | [project].version or [tool.poetry].version |
| Cargo.toml | Rust | [package].version |
| go.mod | Go | git tags only (no version file) |
| .claude-plugin/plugin.json | Claude Plugin | .version field |
| VERSION or version.txt | Generic | file contents |
If no version file is found, ask the user which ecosystem this is.
Read the current version from the detected file. If no version exists yet, start at 0.0.0.
Find the last git tag matching v* pattern:
git describe --tags --abbrev=0 --match "v*" 2>/dev/null
If no tag exists, use all commits.
Read commits since the last tag:
git log <last-tag>..HEAD --pretty=format:"%s" --no-merges
Parse each commit using conventional commit format (type: description or type(scope): description):
| Commit Type | Semver Bump | Changelog Section |
|-------------|-------------|-------------------|
| feat: | minor | Added |
| fix: | patch | Fixed |
| refactor: | patch | Changed |
| perf: | patch | Performance |
| docs: | none | Documentation |
| test: | none | Testing |
| chore: | none | Maintenance |
| BREAKING CHANGE in body or ! after type | major | Breaking Changes |
The highest bump wins: if any commit is major → major. If any is minor → minor. Otherwise patch.
Calculate the new version from current + bump type. Present to the user:
Current version: 1.2.3
Commits since v1.2.3: 8 (3 feat, 4 fix, 1 refactor)
Proposed bump: minor → 1.3.0
Proceed? (yes/no/major/minor/patch to override)
Wait for user confirmation. Do not proceed without it.
Generate a changelog entry for the new version. Prepend to CHANGELOG.md (create if it doesn't exist).
Format:
## [1.3.0] - 2026-03-28
### Breaking Changes
- Description of breaking change
### Added
- feat: description ([abc1234])
- feat(scope): description ([def5678])
### Fixed
- fix: description ([aaa1111])
### Changed
- refactor: description ([bbb2222])
### Performance
- perf: description ([ccc3333])
Rules:
Update the version in the detected file(s):
package.json: update .version field. Also update package-lock.json if it exists (run npm install --package-lock-only or equivalent).pyproject.toml: update the version fieldCargo.toml: update [package].version, then run cargo check to update Cargo.lock.claude-plugin/plugin.json: update .version fieldVERSION/version.txt: overwrite file contents# Never `git add -A` in a coding-agent project — it would track .coding-agent/
# runtime state, which a later reset/clean then deletes. Stage source explicitly.
git add -- . ':(exclude).coding-agent'
git commit -m "release: v1.3.0"
git tag -a "v1.3.0" -m "Release v1.3.0"
Then ask the user:
Release v1.3.0 committed and tagged locally.
Push to remote? (yes/no)
If yes:
git push origin main --follow-tags
Report what was done:
Release v1.3.0 complete.
- Version bumped: 1.2.3 → 1.3.0 (minor)
- Changelog updated: CHANGELOG.md
- Commits included: 8
- Tag: v1.3.0
- Pushed: yes/no
| Flag | Effect |
|------|--------|
| --dry-run | Show what would happen without making changes |
| --major | Force major bump regardless of commits |
| --minor | Force minor bump |
| --patch | Force patch bump |
| --no-push | Skip the push prompt, don't push |
CHANGELOG.md already has an entry for this version, warn and ask before overwritingtesting
Multi-source research method — decompose a question, fan out parallel investigators, interleaved-think each result, verify claims adversarially, synthesize a cited answer. Use for breadth-heavy research, stack comparisons, "which approach wins" questions.
testing
Decide when to use unit vs integration vs e2e tests, and when to mock vs use the real thing per dependency. Dependency injection is the enabler — without it you end up monkey-patching imports. Apply when writing tests of any kind.
development
Test-driven development process — write failing test, implement to pass, refactor. Use when implementing any feature or fixing bugs.
development
Patterns for sharing types, API contracts, and validation schemas between frontend and backend. Use when multiple domains consume the same data shapes to prevent contract drift.