| name | release-it |
| description | Automate versioned releases of NPM packages to GitHub repositories. Use this skill when setting up or configuring release-it for version bumping, changelog generation, npm publishing, GitHub releases, and CI/CD integration. Triggers include requests to: (1) Set up automated releases for an npm package, (2) Configure release-it for a project, (3) Create GitHub Actions workflows for releases, (4) Set up conventional commits with changelog generation, (5) Configure pre-release versioning (alpha/beta/rc), (6) Troubleshoot release-it issues. |
Release-It Skill
Automate NPM package versioning, changelog generation, and publishing with release-it.
Core Workflow Overview
Setting up release-it involves these steps:
- Install release-it and plugins
- Create configuration file (
.release-it.json)
- Configure Git and GitHub settings
- Set up changelog generation (optional but recommended)
- Create GitHub Actions workflow for CI/CD
- Configure authentication (NPM_TOKEN or OIDC)
Step 1: Installation
npm init release-it
npm install --save-dev release-it
npm install --save-dev @release-it/conventional-changelog
Add scripts to package.json:
{
"scripts": {
"release": "release-it",
"release:dry": "release-it --dry-run",
"release:ci": "release-it --ci"
}
}
Requirement: Node.js 20 or higher for release-it v19+.
Step 2: Configuration File
Create .release-it.json in project root. See references/config-options.md for all options.
Minimal Configuration
{
"$schema": "https://unpkg.com/release-it@19/schema/release-it.json",
"git": {
"commitMessage": "chore: release v${version}",
"tagName": "v${version}"
},
"github": {
"release": true
},
"npm": {
"publish": true
}
}
Production Configuration (Recommended)
{
"$schema": "https://unpkg.com/release-it@19/schema/release-it.json",
"git": {
"commitMessage": "chore: release v${version}",
"tagName": "v${version}",
"requireBranch": "main",
"requireCleanWorkingDir": true,
"requireCommits": true,
"requireUpstream": true
},
"github": {
"release": true,
"releaseName": "v${version}"
},
"npm": {
"publish": true
},
"hooks": {
"before:init": ["npm run lint", "npm test"],
"after:bump": "npm run build"
},
"plugins": {
"@release-it/conventional-changelog": {
"preset": {
"name": "conventionalcommits",
"types": [
{ "type": "feat", "section": "Features" },
{ "type": "fix", "section": "Bug Fixes" },
{ "type": "perf", "section": "Performance" }
]
},
"infile": "CHANGELOG.md",
"header": "# Changelog"
}
}
}
Step 3: GitHub Actions Workflow
Create .github/workflows/release.yml. See references/github-actions.md for complete examples.
Standard Workflow (Token-Based Auth)
name: Release
on:
workflow_dispatch:
inputs:
release-type:
description: 'Release type (patch, minor, major)'
required: false
permissions:
contents: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- name: Configure Git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Release
run: |
if [ -n "${{ github.event.inputs.release-type }}" ]; then
npm run release -- ${{ github.event.inputs.release-type }} --ci
else
npm run release -- --ci
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
OIDC Authentication (Recommended for Security)
For npm Trusted Publishing without long-lived tokens:
- Configure trusted publisher at npmjs.com → Package Settings
- Update config:
"npm": { "skipChecks": true }
- Use workflow with
id-token: write permission
permissions:
contents: write
id-token: write
steps:
- run: npm install -g npm@latest
- run: npx release-it --ci
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Step 4: NPM Authentication Setup
For Token-Based Auth
Create .npmrc in project root:
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
Generate automation token at npmjs.com → Access Tokens → Generate New Token → Automation.
For Scoped Packages
Add to package.json:
{
"name": "@myorg/my-package",
"publishConfig": {
"access": "public",
"registry": "https://registry.npmjs.org"
}
}
Semantic Versioning Commands
release-it patch
release-it minor
release-it major
release-it major --preRelease=beta
release-it --preRelease
release-it --preRelease=rc
release-it major
Pre-releases automatically set npm dist-tag to the identifier (e.g., npm install pkg@beta).
Lifecycle Hooks
Execute commands at specific release stages:
| Hook | Timing | Use Case |
|---|
before:init | Before any operations | Lint, test, fetch tags |
after:bump | After version bump | Build, generate assets |
before:release | Before release ops | Final validation |
after:release | After everything | Notifications, cleanup |
Example: Ensure fresh tags in CI:
{
"hooks": {
"before:init": "git fetch --prune --prune-tags origin"
}
}
Dry Run and Debugging
release-it --dry-run
release-it --release-version
release-it --changelog
release-it -V
release-it -VV
NODE_DEBUG=release-it:* release-it
Common Issues and Solutions
| Issue | Solution |
|---|
| Empty changelog | Use fetch-depth: 0 in checkout action |
| Tag already exists | Add git fetch --prune --prune-tags origin to before:init hook |
| npm auth fails | Verify NPM_TOKEN secret or use OIDC |
| Permission denied (git push) | Ensure contents: write permission |
| Pre-release on wrong channel | Set npm.tag explicitly in config |
Configuration Priority
- CLI arguments (highest)
.release-it.json / .release-it.js / .release-it.yaml
release-it property in package.json (lowest)
Files to Create
For a complete setup, create these files:
.release-it.json - Configuration
.github/workflows/release.yml - CI/CD workflow
.npmrc - NPM registry authentication
CHANGELOG.md - Changelog (if using conventional-changelog plugin)
Reference Files