This document describes the complete release workflow for plugin-dev.
Version must be synchronized across these files on release:
plugins/plugin-dev/.claude-plugin/plugin.json(source of truth).claude-plugin/marketplace.json(metadata.version AND plugins[0].version)CLAUDE.md(version line)
# Verify version consistency
rg '"version"' plugins/plugin-dev/.claude-plugin/plugin.json .claude-plugin/marketplace.json
rg 'Version.*v[0-9]' CLAUDE.md# Ensure main is up to date
git checkout main
git pull origin main
# Create release branch
git checkout -b release/v0.x.xUpdate version in all version files (must match):
plugins/plugin-dev/.claude-plugin/plugin.json(source of truth).claude-plugin/marketplace.json(metadata.version AND plugins[0].version)CLAUDE.md(version line)
# Find current version to replace
rg '"version"' plugins/plugin-dev/.claude-plugin/plugin.json
# Update all version files, then verify
rg '"version"' plugins/plugin-dev/.claude-plugin/plugin.json .claude-plugin/marketplace.json
rg 'Version.*v[0-9]' CLAUDE.mdCHANGELOG.md- Add release notes following Keep a Changelog format:- Review commits since last release:
git log v0.x.x..HEAD --oneline - Organize into sections: Added, Changed, Fixed, Security, Performance, Documentation
- Group related changes and reference PR numbers
- Add version comparison links at bottom of file
- Review commits since last release:
- Any other relevant documentation
Note: The README.md version badge updates automatically from GitHub releases.
# Lint markdown files
markdownlint-cli2 '**/*.md'
# Verify version consistency
rg '"version"' plugins/plugin-dev/.claude-plugin/plugin.json .claude-plugin/marketplace.json
rg 'Version.*v[0-9]' CLAUDE.md
# Load plugin locally and test
claude --plugin-dir plugins/plugin-dev
# Test skills load correctly by asking trigger questions
# Test workflow commands: /plugin-dev:create-plugin, /plugin-dev:create-marketplace
# Test agents trigger appropriately# Commit version bump and documentation updates
git add .
git commit -m "chore: prepare release v0.x.x"
# Push release branch
git push origin release/v0.x.x
# Create pull request
gh pr create --title "chore: prepare release v0.x.x" \
--body "Version bump to v0.x.x
## Changes
- [List major changes]
- [List bug fixes]
- [List documentation updates]
## Checklist
- [x] Version updated in plugin.json, marketplace.json, CLAUDE.md
- [x] CHANGELOG.md updated with release notes
- [x] Markdownlint passes
- [x] Plugin tested locally
"After PR review and approval:
# Merge PR via GitHub UI or:
gh pr merge --squash # or --merge or --rebase based on preference
# Create GitHub Release (this also creates the tag atomically)
gh release create v0.x.x \
--target main \
--title "v0.x.x" \
--notes-file - <<'EOF'
## Summary
Brief description of the release focus.
## What's Changed
[Copy relevant sections from CHANGELOG.md]
**Full Changelog**: https://github.com/sjnims/plugin-dev/compare/v0.x-1.x...v0.x.x
EOFNote: Main branch is protected and requires PRs. All version bumps must go through the release branch workflow. The --target main flag ensures the tag is created on the correct commit.
Publishing: The entire repository acts as a marketplace. The plugins/plugin-dev/ directory is the distributable plugin unit.