uv sync --all-extras
uv run pytest tests/ -qThe fast unit-test loop above excludes the slower integration suite under
tests/integration/. Those run automatically in CI on every PR (see
.github/workflows/test.yml).
- Update
CHANGELOG.mdwith a## [X.Y.Z]section describing the release. Use the existing entries as a template. - Run the version-bump validator:
This validates semver formatting, the CHANGELOG entry, and the
python scripts/release_version.py X.Y.Z
npm/package.jsonversion (use--allow-npm-mismatchwhile the npm package is intentionally decoupled). On success it rewritessrc/_version.py. - Commit:
git commit -am "chore(release): bump to X.Y.Z" - Push to
main:git push origin main
- From the GitHub Actions tab, manually trigger the Release
workflow (
.github/workflows/release.yml) withversion=X.Y.Z. - Watch each gate go green, in order:
- preflight-checks — version + changelog + slash template drift
- reviewer prompt sanity
- unit-tests — full pytest run including the fake-binary E2E
- doctor-smoke — built wheel installs and
autodev doctorruns - manual-smoke-issue — opens a GitHub issue with the manual checklist (do not close until step 7 is done)
- tag-and-publish — creates and pushes the
vX.Y.Ztag, which triggerspublish.ymlto push to PyPI + npm - post-publish-smoke — installs the published wheel from PyPI
30 s after the tag and runs
autodev --version+autodev doctor
- preflight-checks — version + changelog + slash template drift
- Walk the manual smoke checklist issue end to end, then close it.
If any gate fails, fix on main (or revert the bump commit) before
re-triggering. Never publish around a red gate.
tests/fixtures/fake_binaries/ ships pure-bash stand-ins for claude
and cursor that respect a canned-response protocol and an
AUTODEV_FAKE_FAILURE_MODE env switch. See
tests/fixtures/fake_binaries/README.md
for the protocol. The integration tests at
tests/integration/test_e2e_with_fake_binaries.py show how to wire
them up.