release
Prepare and execute a selectools release — version bump, changelog, docs, git, PyPI
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
Prepare and execute a selectools release — version bump, changelog, docs, git, PyPI
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Basado en la clasificación ocupacional SOC
Run the full code quality pipeline — ruff format, ruff check, mypy, bandit
Auto-fill HANDOFF.md with current session state from git, then suggest /clear for a fresh start
Autonomous hunt-and-fix loop for a single selectools module. Finds bugs, auto-applies fixes, writes regression tests, verifies with pytest. Outputs RALPH_RESULT sentinel on the last line so the orchestration script can detect convergence.
End-to-end feature implementation — source, exports, tests, docs, examples, and notebook
Deploy parallel QA agents to hunt for bugs across selectools. Each agent audits a different subsystem. Use for pre-release quality gates or periodic sweeps.
Cross-reference audit for stale counts, broken links, and doc drift across all files
| name | release |
| description | Prepare and execute a selectools release — version bump, changelog, docs, git, PyPI |
| argument-hint | <version-number> |
Preparing release version: $ARGUMENTS
grep -m1 __version__ src/selectools/__init__.pygrep -m1 "version" pyproject.tomlpytest tests/ --collect-only -q 2>/dev/null | tail -1ls examples/*.py | wc -l | tr -d ' 'grep -c "ModelInfo(" src/selectools/models.pypython3 -c "from selectools.trace import StepType; print(len(StepType))" 2>/dev/nullpython3 -c "from selectools.observer import AgentObserver; print(len([m for m in dir(AgentObserver) if m.startswith('on_')]))" 2>/dev/nullls examples/*.py | tail -1Run /lint (fix mode) to auto-format and check code quality. ALL must pass
(the repo uses ruff + mypy + bandit — NOT black/isort/flake8):
ruff check src/ tests/ (lint; isort+flake8 replacement)ruff format src/ tests/ --check (format; black replacement)mypy src/bandit -c pyproject.toml -r src/Then run the full test suite (use the project venv, e.g. .venv/bin/python -m pytest):
pytest tests/ -q # full suite — do NOT shortcut to a subset
E2E hard gate (real API, before tagging). Per feedback_evals_before_release,
real-LLM e2e tests must run before every release — mock tests passed while a real
SYSTEM-role bug shipped. Run the named gate files with whatever provider keys are
set (each provider's tests skip if its key is absent):
python -u -m pytest tests/test_orchestration_evals.py tests/test_orchestration_e2e.py --run-e2e -v
Tip: do NOT pipe through tail (it block-buffers and hides progress); use -u
and read the output file. If only one provider key is available, a scoped
-k <provider> run validates that provider's real path quickly.
STOP if any lint, test, or e2e failure. Fix before proceeding.
Update version in TWO files (must match):
src/selectools/__init__.py: __version__ = "X.Y.Z"pyproject.toml: version = "X.Y.Z"Add entry at the top following existing format. Include:
Then sync:
cp CHANGELOG.md docs/CHANGELOG.md
This is the most commonly missed step. For EVERY new feature in this release, verify ALL of these exist. Use /docs guidance for each missing item.
For each new feature, verify:
@beta for first release, @stable for mature APIs — see ## Stability Markers in CLAUDE.md)@deprecated(since=..., replacement=...) applied and are listed in CHANGELOG migration notesdocs/modules/<FEATURE>.mdexamples/These docs reference counts and features that change with every release:
| Document | What to check |
|---|---|
README.md | "What's New" section, feature table, stats (test count, example count, model count) |
ROADMAP.md | Mark completed version ✅, update Implementation Order section |
CLAUDE.md | Codebase Structure tree, StepType table, Observer counts, Current Roadmap section, Common Pitfalls |
docs/index.md | Feature table, model count, test count |
CONTRIBUTING.md + docs/CONTRIBUTING.md | Test count |
landing/index.html | Badge counts (if exists) |
Update .private/ tracking docs:
.private/session.md — update Current State table, record what shipped.private/master-competitive-plan.md — mark completed items, update scorecard/counts.private/competitive-analysis.md — update comparison matrix, test count, advantages list.private/growth-plan.md — update product features listdocs/llms-full.txt is generated, NOT hand-edited — regenerate it so it picks up
new module docs and current counts/versions automatically:
python scripts/build_llms_full.py # rebuild from mkdocs nav
python scripts/build_llms_full.py --check # CI-style staleness guard
Then sync the changelog mirror and build the docs:
cp CHANGELOG.md docs/CHANGELOG.md && mkdocs build
Report any warnings. Fix broken links.
Run /audit to catch anything missed in Phase 4. This is a HARD GATE — do not proceed to commit if there are count mismatches or content drift.
The audit checks:
Fix ALL mismatches before proceeding.
git checkout -b release/vX.Y.Z # or feat/<name> for feature releases
git add <specific-files>
git commit -m "release: vX.Y.Z — Feature Theme Name"
Stop here and tell the user the commit is ready. Wait for explicit push approval.
git push -u origin HEAD
gh pr create --title "release: vX.Y.Z — Theme" --body "$(cat <<'EOF'
## Summary
- Feature 1
- Feature 2
- ...
## Checklist
- [ ] All tests pass (N tests)
- [ ] Lint clean (black, isort, flake8, mypy)
- [ ] Docs updated (README, ROADMAP, CHANGELOG, module docs, index, architecture)
- [ ] Audit passed (counts consistent)
- [ ] mkdocs build clean
EOF
)"
Wait for user to approve merge.
gh pr merge <number> --merge --delete-branch
git checkout main && git pull
git tag -a vX.Y.Z -m "vX.Y.Z — Feature Theme Name"
git push origin main --tags
Pushing the tag triggers the publish-pypi job in .github/workflows/ci.yml automatically.
No manual publish step needed — CI builds and uploads to PyPI after tests + security pass.
Monitor at: https://github.com/johnnichev/selectools/actions
pip install selectools==X.Y.Z in a clean env