-
Keep
pyproject.tomlandsubstack/__init__.pyon the previous version while implementing code, tests, workflows, and documentation. -
Run
poetry install --all-extras. -
Run
poetry run pytest -q -m "not live" --strict-markers. -
Run
poetry run pytest -qwith live opt-ins unset and confirm all live tests are skipped. -
With configured maintainer credentials, run:
RUN_SUBSTACK_E2E=1 poetry run pytest -q -m live RUN_SUBSTACK_CLI_E2E=1 poetry run pytest -q -m live tests/substack/test_cli_end_to_end.py
-
Update
pyproject.toml,substack.__version__,CHANGELOG.md, and the release page to the target version. -
From a clean checkout, run
poetry check,poetry build, andpoetry run python -m twine check dist/*. -
Install the wheel in fresh base and
[mcp]virtual environments, runpip check, verify all five console entry points, and import the base and MCP modules. -
Push only after CI passes. Create
vX.Y.Zfrom that exact commit; the publish workflow rejects a tag that differs from either package version. -
After publishing, install
python-substack==X.Y.Zfrom PyPI in a clean environment and repeat the smoke checks before announcing.
Live tests create disposable drafts and must never publish. Confirm cleanup in the publication after each run. If an artifact is defective, yank it rather than attempting to replace the same version.