
semantic-release
by terrylica
Claude Code Skills Marketplace: plugins, skills for ADR-driven development, DevOps automation, ClickHouse management, semantic versioning, and productivity workflows
SKILL.md
name: semantic-release description: Automate versioning with Node.js semantic-release v25+. TRIGGERS - npm run release, version bump, changelog, conventional commits, release automation. allowed-tools: Read, Bash, Glob, Grep, Edit, Write
semantic-release
Overview
Automate semantic versioning and release management using semantic-release v25+ (Node.js) following 2025 best practices. Works with all languages (JavaScript, TypeScript, Python, Rust, Go, C++, etc.) via the @semantic-release/exec plugin. Create shareable configurations for multi-repository setups, initialize individual projects with automated releases, and configure GitHub Actions workflows with OIDC trusted publishing.
Important: This skill uses semantic-release (Node.js) exclusively, NOT python-semantic-release, even for Python projects. Rationale: 23.5x larger community, 100x+ adoption, better future-proofing.
When to Use This Skill
Invoke when:
- Setting up local releases for a new project (any language)
- Creating shareable semantic-release configuration for organization-wide use
- Migrating existing projects to 2025 semantic-release patterns
- Troubleshooting semantic-release setup or version bumps
- Setting up Python projects (use Node.js semantic-release, NOT python-semantic-release)
- Configuring GitHub Actions (optional backup, not recommended as primary due to speed)
- Rust workspaces using release-plz (see Rust reference)
Why Node.js semantic-release
22,900 GitHub stars - Large, active community
1.9M weekly downloads - Proven adoption
126,000 projects using it - Battle-tested at scale
35+ official plugins - Rich ecosystem
Multi-language support - Works with any language via @semantic-release/exec
Do NOT use python-semantic-release. It has a 23.5x smaller community (975 vs 22,900 stars), ~100x less adoption, and is not affiliated with the semantic-release organization.
Release Workflow Philosophy: Local-First
Default approach: Run releases locally, not via GitHub Actions.
Why Local Releases
Primary argument: GitHub Actions is slow
- ⏱️ GitHub Actions: 2-5 minute wait for release to complete
- ⚡ Local release: Instant feedback and file updates
- 🔄 Immediate workflow continuity - no waiting for CI/CD
Additional benefits:
- ✅ Instant local file sync -
package.json,CHANGELOG.md, tags updated immediately - ✅ No pull required - Continue working without
git pullafter release - ✅ Dry-run testing -
npm run release:dryto preview changes before release - ✅ Offline capable - Can release without CI/CD dependency
- ✅ Faster iteration - Debug release issues immediately, not through CI logs
GitHub Actions: Optional Backup Only
GitHub Actions workflows are provided as optional automation, not the primary method:
- Use for team consistency if required
- Backup if local environment unavailable
- Not recommended as primary workflow due to speed
Authentication Setup
gh auth login
# Browser authentication once
# Credentials stored in keyring
# All future releases: zero manual intervention
This is the minimum manual intervention possible for local semantic-release with GitHub plugin functionality.
Multi-Account Authentication via mise [env]
For multi-account GitHub setups, use mise [env] to set per-directory GH_TOKEN:
# ~/your-project/.mise.toml
[env]
GH_TOKEN = "{{ read_file(path=env.HOME ~ '/.claude/.secrets/gh-token-accountname') | trim }}"
GITHUB_TOKEN = "{{ read_file(path=env.HOME ~ '/.claude/.secrets/gh-token-accountname') | trim }}"
This overrides gh CLI's global authentication, ensuring semantic-release uses the correct account for each directory.
See the mise-configuration skill for complete setup.
mise Task Detection
When .mise.toml has release tasks, prefer mise run over npm run:
| Priority | Condition | Command |
|---|---|---|
| 1 | .mise.toml has [tasks.release:*] | mise run release:version |
| 2 | package.json has scripts.release | npm run release |
| 3 | Global semantic-release | semantic-release --no-ci |
See Python Guide for complete mise workflow example.
GitHub Actions Policy
CRITICAL: No testing or linting in GitHub Actions. See CLAUDE.md for full policy.
| Forbidden | Allowed |
|---|---|
| pytest, npm test, cargo test | semantic-release |
| ruff, eslint, clippy, prettier | CodeQL, npm audit |
| mypy | Deployment, Dependabot |
Separation of Concerns (4-Level Architecture)
semantic-release configuration follows a hierarchical, composable pattern:
Level 1: Skill - ${CLAUDE_PLUGIN_ROOT}/skills/semantic-release/ (Generic templates, system-wide tool)
Level 2: User Config - ~/semantic-release-config/ (@username/semantic-release-config)
Level 3: Organization Config - npm registry (@company/semantic-release-config)
Level 4: Project Config - .releaserc.yml in project root
Configuration Precedence
Level 4 (Project) → overrides → Level 3 (Org) → overrides → Level 2 (User) → overrides → Defaults
Conventional Commits Format
semantic-release analyzes commit messages to determine version bumps:
<type>(<scope>): <subject>
Version Bump Rules (Default)
feat:→ MINOR version bump (0.1.0 → 0.2.0)fix:→ PATCH version bump (0.1.0 → 0.1.1)BREAKING CHANGE:orfeat!:→ MAJOR version bump (0.1.0 → 1.0.0)docs:,chore:,style:,refactor:,perf:,test:→ No version bump (by default)
Release Notes Visibility (Important)
Warning: The @semantic-release/release-notes-generator (Angular preset) only includes these types in release notes:
feat:→ Features sectionfix:→ Bug Fixes sectionperf:→ Performance Improvements section
Other types (docs:, chore:, refactor:, etc.) trigger releases when configured but do NOT appear in release notes.
Recommendation: For documentation changes that should be visible in release notes, use:
fix(docs): description of documentation improvement
This ensures the commit appears in the "Bug Fixes" section while still being semantically accurate (fixing documentation gaps is a fix).
Marketplace Plugin Configuration (Always Bump)
For Claude Code marketplace plugins, every change requires a version bump for users to receive updates.
Option A: Shareable Config (if published)
# .releaserc.yml
extends: "@terryli/semantic-release-config/marketplace"
Option B: Inline Configuration
# .releaserc.yml
plugins:
- - "@semantic-release/commit-analyzer"
- releaseRules:
# Marketplace plugins require version bump for ANY change
- { type: "docs", release: "patch" }
- { type: "chore", release: "patch" }
- { type: "style", release: "patch" }
- { type: "refactor", release: "patch" }
- { type: "test", release: "patch" }
- { type: "build", release: "patch" }
- { type: "ci", release: "patch" }
Result after configuration:
| Commit Type | Release Type |
|---|---|
feat: | minor (default) |
fix:, perf:, revert: | patch (default) |
docs:, chore:, style:, refactor:, test:, build:, ci: | patch (configured) |
Why marketplace plugins need this: Plugin updates are distributed via version tags. Without a version bump, users running /plugin update see no changes even if content was modified.
MANDATORY: Every Release Must Increment Version
Pre-release validation: Before running semantic-release, verify releasable commits exist since last tag. A release without version increment is invalid.
Autonomous check sequence:
- List commits since last tag: compare HEAD against latest version tag
- Identify commit types: scan for
feat:,fix:, orBREAKING CHANGE:prefixes - If NO releasable commits found → STOP - do not proceed with release
- Inform user: "No version-bumping commits since last release. Use
feat:orfix:prefix for releasable changes."
Commit type selection guidance:
- Use
fix:for any change that improves existing behavior (bug fixes, enhancements, documentation corrections that affect usage) - Use
feat:for new capabilities or significant additions - Reserve
chore:,docs:,refactor:for changes that truly don't warrant a release
Why this matters: A release without version increment creates confusion - users cannot distinguish between releases, package managers may cache old versions, and changelog entries become meaningless.
MAJOR Version Breaking Change Confirmation
Trigger: BREAKING CHANGE: footer or feat!: / fix!: prefix in commits.
When MAJOR is detected, this skill runs a 3-phase confirmation workflow:
- Detection: Scan commits for breaking change markers
- Analysis: Spawn 3 parallel subagents (User Impact, API Compat, Migration)
- Confirmation: AskUserQuestion with proceed/downgrade/abort options
See MAJOR Confirmation Workflow for complete details including subagent prompts, decision tree, and example output.
Examples
Feature (MINOR):
feat: add BigQuery data source support
Bug Fix (PATCH):
fix: correct timestamp parsing for UTC offsets
Breaking Change (MAJOR):
feat!: change API to require authentication
BREAKING CHANGE: All API calls now require API key in Authorization header.
Documentation Linking
Auto-include doc changes in release notes. Add to .releaserc.yml:
- - "@semantic-release/exec"
- generateNotesCmd: "node plugins/itp/skills/semantic-release/scripts/generate-doc-notes.mjs ${lastRelease.gitTag}"
Detects: ADRs, Design Specs, Skills, Plugin READMEs. See Doc Release Linking.
Note: The
@semantic-release/execplugin uses Lodash templates (${var}). This conflicts with bash default syntax (${VAR:-default}). See Troubleshooting: Lodash Template Conflicts.
Quick Start
Prerequisites
| Check | Command | Fix |
|---|---|---|
| gh CLI authenticated | gh auth status | gh auth login |
| GH_TOKEN for directory | gh api user --jq '.login' | See Authentication |
| Git remote is HTTPS | git remote get-url origin | git-ssh-to-https |
| semantic-release global | command -v semantic-release | See Troubleshooting |
Initialize Project
./scripts/init-project.mjs --project # Initialize current project
./scripts/init-project.mjs --user # Create user-level shareable config
./scripts/init-project.mjs --help # See all options
Run Release
| Priority | Condition | Commands |
|---|---|---|
| 1 | .mise.toml has release tasks | mise run release:version / mise run release:full |
| 2 | package.json has scripts | npm run release:dry (preview) / npm run release |
| 3 | Global CLI | semantic-release --no-ci |
See Local Release Workflow for the complete 4-phase process.
Python Projects
semantic-release handles versioning. For PyPI publishing, see pypi-doppler skill.
Version pattern (importlib.metadata - never hardcode):
from importlib.metadata import PackageNotFoundError, version
try:
__version__ = version("your-package-name")
except PackageNotFoundError:
__version__ = "0.0.0+dev"
See Python Projects Guide for complete setup including Rust+Python hybrids.
GitHub Actions (Optional)
Not recommended as primary (2-5 minute delay). Repository Settings → Actions → Workflow permissions → Enable "Read and write permissions".
Reference Documentation
| Category | Reference | Description |
|---|---|---|
| Setup | Authentication | HTTPS-first setup, multi-account patterns |
| Workflow | Local Release Workflow | 4-phase process (PREFLIGHT → RELEASE → POSTFLIGHT) |
| Languages | Python Projects | Python + Rust+Python hybrid patterns |
| Rust Projects | release-plz, cargo-rdme README SSoT | |
| Config | Version Alignment | Git tags as SSoT, manifest patterns |
| Monorepo Support | Polyglot monorepo with Pants + mise, pnpm/npm workspaces | |
| Advanced | MAJOR Confirmation | Breaking change analysis workflow |
| Doc Release Linking | Auto-link ADRs/specs in release notes | |
| Help | Troubleshooting | All common issues consolidated |
| Evolution Log | Skill change history |
Cross-skill references:
mise-tasksskill: polyglot-affected - Complete Pants + mise integration guidemise-tasksskill: bootstrap-monorepo - Autonomous polyglot monorepo setuppypi-dopplerskill - Local PyPI publishing with Doppler
Post-Change Checklist
After modifying THIS skill (semantic-release):
- SKILL.md and references remain aligned
- New references documented in Reference Documentation table
- All referenced files in references/ exist
- Append changes to evolution-log.md
- Validate with
bun scripts/validate-plugins.mjs - Run
npm run release:dryto verify no regressions
Score
Total Score
Based on repository quality metrics
SKILL.mdファイルが含まれている
ライセンスが設定されている
100文字以上の説明がある
GitHub Stars 100以上
1ヶ月以内に更新
10回以上フォークされている
オープンIssueが50未満
プログラミング言語が設定されている
1つ以上のタグが設定されている
Reviews
Reviews coming soon

