Release
Automate the full llm-router release pipeline (version, changelog, publish)From its SKILL.md
npx -y skills add Chuzom/Chuzom --skill releaseAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 21 stars21 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
2.9 KB, as published. Nobody here has run it
/release — llm-router Release Skill
Automates the full release pipeline for llm-router. Run this skill whenever you are ready to ship a new version.
Steps
1. Confirm version
Ask the user: "What version are we releasing?" (e.g. 4.0.1)
2. Sync all version strings
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"
3. Update CHANGELOG.md
Add entry at the top:
## vX.Y.Z — YYYY-MM-DD
### What's new
- <bullet points>
### Technical notes
- <any migration notes>
4. Run tests — abort if any fail
uv run pytest tests/ -q --ignore=tests/test_integration.py
uv run ruff check src/ tests/
5. Verify version sync
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}')
"
6. Deploy hooks (if any hook changed)
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
7. Commit and tag
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
8. Publish to PyPI
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"
9. Create GitHub Release
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
\`\`\`"
10. Reinstall plugin locally
claude plugin reinstall llm-router
claude plugin list | grep llm-router
11. Log the decision
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