Releases¶
Pulsar follows Semantic Versioning and documents changes in CHANGELOG.md using Keep a Changelog format.
Version source of truth¶
Cargo.toml [package].version is the canonical version. Maturin reads it when building wheels; pyproject.toml declares dynamic = ["version"] so the Python package metadata stays in sync automatically.
Editable checkouts resolve the same value through pulsar._version (which reads Cargo.toml). Sphinx docs import pulsar.__version__ in conf.py.
CI enforces consistency with:
python scripts/check_versions.py
Cutting a patch release¶
Example: shipping v0.2.5.
Branch
git checkout main git pull git checkout -b release/v0.2.5
Bump version — edit
Cargo.tomlonly:[package] version = "0.2.5"
Update changelog — under
## [Unreleased], finalize notes into a dated section:## [Unreleased] ## [0.2.5] - 2026-07-11 ### Added - ...
Verify locally
python scripts/check_versions.py uv run pytest tests/test_version.py -v uv run pytest -v
Open a PR to
mainfromrelease/v0.2.5. Wait for CI (build, tests, version check, lint).Tag after merge — tags drive production publishing:
git checkout main git pull git tag v0.2.5 git push origin v0.2.5
What the tag triggers¶
.github/workflows/release.yml runs on tag push:
Builds wheels (Linux, Windows, macOS) and sdist
Smoke-tests each wheel platform by installing the cp312 wheel and running
scripts/smoke_mcp.py(import + MCP ping/list_tools/stdio launch):Linux x86_64 on
ubuntu-latestLinux aarch64 on
ubuntu-24.04-armWindows x86_64 on
windows-latestmacOS x86_64 on
macos-15-intelmacOS arm64 on
macos-latest
Creates a GitHub Release with attached artifacts
Publishes to PyPI via trusted publishing
Pull requests to main also exercise the release build matrix but do not publish. CI additionally runs scripts/smoke_mcp.py on macos-15-intel.
Agent-friendly replication¶
Agents automating releases should read .agents/AGENTS.md (versioning section) and follow the same file touch list:
Cargo.toml— version bumpCHANGELOG.md— release notes + datescripts/check_versions.py— must pass (no manual doc version strings)
Do not hand-edit pyproject.toml version fields or hard-code versions in docs/source/conf.py; both derive from Cargo.toml through the Python package.