A repeatable, copy-pasteable checklist for cutting a codebase-index release.
Tagging v* triggers .github/workflows/release.yml, which builds,
twine checks, runs the clean-machine smoke, publishes a GitHub release, and
publishes to PyPI via Trusted Publishing (OIDC — no stored token). A manual
workflow_dispatch run publishes the current main build to PyPI without
recreating a GitHub release (used to publish an already-tagged version).
Work top to bottom. Do not tag until every required box is checked.
The package version is single-sourced from src/codebase_index/__init__.py
(hatch dynamic version). Two files mirror it and are not auto-synced — bump
them by hand and verify:
-
src/codebase_index/__init__.py→__version__bumped (canonical). -
.claude-plugin/plugin.json→"version"matches. -
.claude-plugin/marketplace.json→ version matches (if present). -
requirements.lock→ the GitHub tarball tag matches the new tag (.../tags/vX.Y.Z.tar.gz). The plugin bootstrap installs exactly this pin. -
README / QUICKSTART / INSTALLATION / FAQ / MCP install snippets reference the new tag (
@vX.Y.Z). -
Skill copies +
.skill_versionstamps regenerated and in sync:python scripts/sync_skill_copies.py # regenerate python scripts/sync_skill_copies.py --check # CI gate: must pass clean
-
pytestgreen locally (coverage gate--cov-fail-under=80enforced). -
ruff check src/ tests/clean. -
mypy src/codebase_index(advisory) reviewed. - Slow/perf tests considered:
pytest --runslowfor index/search latency. - CI matrix green (Ubuntu/macOS/Windows × py3.11–3.13) on the release branch.
-
Public suite runs and reports all metric families:
python tests/benchmark_public.py --workdir .tmp-public-benchmark
-
If any headline number in README/COMPARISON changed, re-run the honest benchmark and refresh
tests/benchmark_honest_RESULTS.mdwith raw logs. Do not publish a new number without a logged run (see BENCHMARKS.md).
-
codebase-index doctor --strictexits 0 in this repo. - No secret/binary/generated file slipped into the index (doctor reports clean).
- External-embeddings path still refused without all three gates
(config + key + warning) — covered by tests, eyeball SECURITY_MODEL.md if
anything in
embeddings/changed. - Skill
allowed-toolsstill limited to read-only subcommands (noBash(python *)).
-
Clean-venv build + install + init + index + search:
python scripts/release_smoke.py # build wheel, install in throwaway venv, exercise path -
pipx install "git+https://github.com/denfry/codebase-index.git@vX.Y.Z"on a clean machine →init→index→searchworks (the M9 exit criterion). -
Installer scripts sanity-checked:
tests/installer/smoke.sh/tests/installer/smoke.ps1.
-
.claude-plugin/plugin.json+marketplace.jsonvalidate and version-match (tests/test_plugin_manifest.py). -
bin/cbx/bin/codebase-indexwrappers still enforce the subcommand whitelist and refuse non-whitelisted commands likeclean(tests/test_plugin_wrappers.py). - Plugin ↔ skill parity holds (
tests/test_plugin_skill_parity.py). -
SessionStartbootstrap provisions a venv fromrequirements.lockand reinstalls only when the lock changes (tests/test_bootstrap.py).
-
codebase-index mcp --root .starts and registers all tools (tests/test_mcp_server.py):healthcheck,search_code,find_symbol,find_refs,impact_of,impact_of_diff,explain_code,index_stats. - MCP and CLI agree (shared
service.py) — vector channel + graph tier surfaced in both. -
docs/MCP.mdclient templates still match the shipped tool list.
-
CHANGELOG.md: move[Unreleased]items under the newvX.Y.Zdated heading; add the version-compare link at the bottom. - ROADMAP / docs reflect anything that shipped or moved.
-
docs/PRODUCT_UPGRADE_PLAN.mdstatus column updated for shipped items.
- Commit the version bump + changelog on the release branch; open/merge PR.
- Tag:
git tag vX.Y.Z && git push origin vX.Y.Z. -
release.ymlbuild job green (test gate +python -m build+twine check+release_smoke.py). - GitHub release created with artifacts attached; release notes reviewed.
- Post-publish: re-run
pipx install "...@vX.Y.Z"once to confirm the tag resolves.
- Homebrew tap.
- Signed release checksums (
cosign/minisign). - Published SBOM (e.g. CycloneDX) attached to each release.
- Provenance / build attestation (SLSA).
These matter for a tool that reads entire repositories, but they are roadmap
items in the current line. See docs/PRODUCT_UPGRADE_PLAN.md §9.