dev:release — Claude Code skill for releases and setup
Runs a project release from version selection and changelog drafting through a GitHub release and npm publish. Use it when preparing a patch, minor, or major version.
npx skills add raphaelchristi/harness-evolver --skill dev-release -a claude-codeWhat dev:release does
The skill reads the version in package.json and checks commits since the latest Git tag. It uses those commits to draft a Keep a Changelog entry, then shows the proposed text before making further changes.
Once approved, it updates package.json and .claude-plugin/plugin.json, commits the changes, creates and pushes a tag, and opens a GitHub release. It also runs npm publish and checks the published package version with npm view harness-evolver version. npm publishing is part of the workflow, so make sure the package is ready to go live before starting.
What it helps with
- bump a package version as patch, minor, or major
- draft a user-facing
CHANGELOG.mdentry from commits - update package and plugin version files
- create and push a Git tag and GitHub release
- publish a package to npm and check its version
Example prompts for the agent
- Prepare a release with a
patchversion bump. - Draft the
CHANGELOG.mdentry and prepare aminorrelease. - Start the release workflow and ask me which version bump to use.
How to install dev:release
1Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill dev-release -a claude-code2Manually: put the files in place
~/.claude/skills/dev-release/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/dev-release/
1Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill dev-release -a codex2Manually: put the files in place
.agents/skills/dev-release/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill dev-release -a cursor2Manually: put the files in place
.cursor/skills/dev-release/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install raphaelchristi/harness-evolver dev-release2Manually: put the files in place
.github/skills/dev-release/SKILL.md1Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill dev-release -a gemini-cli2Platform CLI
gemini skills install https://github.com/raphaelchristi/harness-evolver --path .claude/skills/dev-releaseManually: put the files in place
.devin/skills/dev-release/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill dev-release -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about dev:release
How do I install dev:release in Claude Code?
Run npx skills add raphaelchristi/harness-evolver --skill dev-release -a claude-code. The skill file is installed at ~/.claude/skills/dev-release/SKILL.md.
What does dev:release do?
It reviews commits, drafts a changelog entry, and updates the package and plugin versions. It then creates a Git tag and GitHub release, publishes to npm, and checks the published version.
Which version bumps can dev:release make?
Choose patch, minor, or major. If you do not pass a choice, the skill asks which one to use.
Source text
SKILL.md · MIT
---
name: dev:release
description: "Use when the user wants to release a new version, publish to npm, create a GitHub release, bump version, or tag a release. Also use when the user says 'release', 'publish', 'bump version', 'tag', or 'npm publish'."
argument-hint: "[patch|minor|major]"
allowed-tools: [Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion]
---
# /dev:release
Interactive release workflow for harness-evolver. Handles everything: validation, changelog, version bump, git tag, GitHub release, npm publish.
## Step 1: Determine Version Bump
Parse the argument if provided (`patch`, `minor`, `major`). If not provided, ask:
```json
{
"questions": [
{
"question": "Version bump type?",
"header": "Bump",
"multiSelect": false,
"options": [
{"label": "patch", "description": "Bug fixes, small changes (e.g., 4.0.2 → 4.0.3)"},
{"label": "minor", "description": "New features, backwards compatible (e.g., 4.0.2 → 4.1.0)"},
{"label": "major", "description": "Breaking changes (e.g., 4.0.2 → 5.0.0)"}
]
}
]
}
```
## Step 2: Read Current State
```bash
# Current version
CURRENT=$(python3 -c "import json; print(json.load(open('package.json'))['version'])")
echo "Current version: $CURRENT"
# Commits since last tag
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -n "$LAST_TAG" ]; then
echo "Commits since $LAST_TAG:"
git log --oneline "$LAST_TAG"..HEAD
else
echo "No previous tags found"
git log --oneline -10
fi
```
## Step 3: Compute New Version
Based on the bump type and current version, compute the new version. For example:
- `patch`: 4.0.2 → 4.0.3
- `minor`: 4.0.2 → 4.1.0
- `major`: 4.0.2 → 5.0.0
```bash
python3 -c "
v = '$CURRENT'.split('.')
bump = '$BUMP_TYPE'
if bump == 'major':
v = [str(int(v[0])+1), '0', '0']
elif bump == 'minor':
v = [v[0], str(int(v[1])+1), '0']
else:
v = [v[0], v[1], str(int(v[2])+1)]
print('.'.join(v))
"
```
## Step 4: Generate Changelog Entry
Read the commits since the last tag. Categorize them:
- `feat:` → Added
- `fix:` → Fixed
- `refactor:` → Changed
- `docs:` → (skip unless significant)
- `chore:` → (skip unless version bump)
Write a new `## [NEW_VERSION] - YYYY-MM-DD` section at the top of `CHANGELOG.md` (after the header, before the previous version entry). Follow Keep a Changelog format. Use the commit messages as a starting point but **rewrite them to be user-facing** — explain what changed for the user, not what files were touched.
Show the generated changelog entry to the user before proceeding.
## Step 5: Bump Version
Update version in both files:
```bash
# package.json
python3 -c "
import json
with open('package.json') as f: p = json.load(f)
p['version'] = '$NEW_VERSION'
with open('package.json', 'w') as f: json.dump(p, f, indent=2); f.write('\n')
"
# .claude-plugin/plugin.json
python3 -c "
import json
with open('.claude-plugin/plugin.json') as f: p = json.load(f)
p['version'] = '$NEW_VERSION'
with open('.claude-plugin/plugin.json', 'w') as f: json.dump(p, f, indent=2); f.write('\n')
"
```
## Step 6: Commit, Tag, Push
```bash
git add CHANGELOG.md package.json .claude-plugin/plugin.json
git commit -m "chore: bump version to $NEW_VERSION
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>"
git tag -a "v$NEW_VERSION" -m "v$NEW_VERSION"
git push origin main --tags
```
## Step 7: Create GitHub Release
Generate release notes from the changelog entry. Use `gh release create`:
```bash
gh release create "v$NEW_VERSION" \
--title "v$NEW_VERSION — {short title from changelog}" \
--notes "{release notes from changelog entry}
Full changelog: https://github.com/raphaelchristi/harness-evolver/blob/main/CHANGELOG.md"
```
## Step 8: Publish to npm
```bash
npm publish
```
Verify the published version:
```bash
npm view harness-evolver version
```
## Step 9: Report
```
Release v{NEW_VERSION} complete:
- CHANGELOG.md updated
- package.json + plugin.json bumped
- Git tag v{NEW_VERSION} created and pushed
- GitHub release: {release_url}
- npm: harness-evolver@{NEW_VERSION} published
```
© raphaelchristi · MIT · raphaelchristi/harness-evolver