From llm-router
Automates the llm-router release pipeline: version syncing, changelog, tests, tagging, PyPI publish, GitHub release, and local reinstall.
How this skill is triggered — by the user, by Claude, or both
Slash command
/llm-router:releaseThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Automates the full release pipeline for llm-router. Run this skill whenever
Automates the full release pipeline for llm-router. Run this skill whenever you are ready to ship a new version.
Ask the user: "What version are we releasing?" (e.g. 4.0.1)
Update ALL of the following to the new version — grep first to catch any extras:
grep -rn "version" pyproject.toml .claude-plugin/plugin.json .claude-plugin/marketplace.json --include="*.toml" --include="*.json" | grep -v ".venv"
Files to update:
pyproject.toml → version = "X.Y.Z".claude-plugin/plugin.json → "version": "X.Y.Z".claude-plugin/marketplace.json → "version": "X.Y.Z"Add entry at the top:
## vX.Y.Z — YYYY-MM-DD
### What's new
- <bullet points>
### Technical notes
- <any migration notes>
uv run pytest tests/ -q --ignore=tests/test_integration.py
uv run ruff check src/ tests/
python3 -c "
import tomllib, json
v1 = tomllib.load(open('pyproject.toml','rb'))['project']['version']
v2 = json.load(open('.claude-plugin/plugin.json'))['version']
v3 = json.load(open('.claude-plugin/marketplace.json'))['version']
assert v1==v2==v3, f'MISMATCH: pyproject={v1} plugin={v2} marketplace={v3}'
print(f'✅ All versions in sync: {v1}')
"
install -m 755 src/llm_router/hooks/auto-route.py ~/.claude/hooks/llm-router-auto-route.py
install -m 755 src/llm_router/hooks/session-end.py ~/.claude/hooks/llm-router-session-end.py
install -m 755 src/llm_router/hooks/session-start.py ~/.claude/hooks/llm-router-session-start.py
install -m 755 src/llm_router/hooks/enforce-route.py ~/.claude/hooks/llm-router-enforce-route.py
git add -p # stage deliberately — never git add .
git commit -m "feat(vX.Y.Z): <headline>"
git tag vX.Y.Z
git push && git push origin --tags
rm -rf dist/ && uv build
PYPI_TOKEN=$(python3 -c "import configparser; c=configparser.ConfigParser(); c.read('/Users/yali.pollak/.pypirc'); print(c['pypi']['password'])")
uv publish --token "$PYPI_TOKEN"
gh release create vX.Y.Z \
--title "vX.Y.Z — <headline>" \
--latest \
--notes "## What's new
- <bullets from CHANGELOG>
## Upgrade
\`\`\`bash
pip install --upgrade claude-code-llm-router && llm-router install
\`\`\`"
claude plugin reinstall llm-router
claude plugin list | grep llm-router
Append to docs/decisions.md:
## YYYY-MM-DD — Release vX.Y.Z
**Decision**: shipped version X.Y.Z
**What changed**: <summary>
**Outcome**: published to PyPI, plugin reinstalled
npx claudepluginhub ypollak2/llm-router --plugin llm-routerAutomates releases for projects using Keep a Changelog and GitHub: bump detection, CHANGELOG promotion, merge to main, tag, and GitHub Release with a single confirmation gate.
Automates publishing of Claude Code plugins and Agent Skills: version bumping, changelog updates, git workflow. Activates on 'publish plugin' or 'release plugin' requests.
Automates semantic version bumps across plugin.json, marketplace.extended.json, and marketplace.json in Claude Code plugins. Triggers on mentions of version bump, update version, or release for consistency.