Safe Substack draft automation from Markdown with Python, CLI, and MCP.
Read the release plan before release work and update its status and validation evidence as the release proceeds.
pyproject.toml and substack/__init__.py on the previous version
while implementing code, tests, workflows, and documentation.poetry install --all-extras.poetry run pytest -q -m "not live" --strict-markers.poetry run pytest -q with 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
pyproject.toml, substack.__version__, CHANGELOG.md, and the
release page to the target version.poetry check, poetry build, and
poetry run python -m twine check dist/*.[mcp] virtual environments, run
pip check, verify all five console entry points, and import the base and MCP
modules.vX.Y.Z from that exact commit; the publish
workflow rejects a tag that differs from either package version.python-substack==X.Y.Z from 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.