agentsclimarketplace

Release

Skill ypollak2/llm-router/skills/release

Universal LLM router for AI coding tools. Works with Claude Code, Cursor, Codex, Gemini CLI, Copilot and more. Free-first fallback chain cuts costs 35-80%.From the repository description

Install
npx -y skills add ypollak2/llm-router --skill release

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

SKILL.md

2.8 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

Keep looking

Skills are one crate of 627,801. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.