when need python, use uv run python
jupyter-jcliversion must have a single source of truth:[project].versioninpyproject.toml.- Do not leave a hard-coded duplicate version in Python modules or docs.
- After bumping
[project].version, runuv lockto refreshuv.lockso the editablejupyter-jclientry matches the new release version; do not hand-edituv.lock. - When bumping a release version, update user-facing docs only when they mention the current released version or version verification workflow.
- If a test asserts version output, make it compare against installed distribution metadata instead of a copied literal.
- Start from
main, fetchorigin/main, and require a clean worktree. If this release's code or docs commits are local, keep them unpushed so the version commit can share their push. - Choose the next semantic version. Update only
[project].versioninpyproject.toml, then runuv lock. - Run the local release checks:
uv run python -m jupyter_jcli --versionuv run j-cli --versionuv run pytest -vuv build
- Confirm that both version commands report the new version and inspect the
pyproject.tomlanduv.lockdiff. - Commit the bump using the established message format:
chore: bump version to X.Y.Z. - Push all pending release commits to
mainonce, including any unpushed code, docs, and version commits. Wait for the resulting GitHub ActionsTestsworkflow to succeed. Do not create the release tag before this workflow passes. - Create and push the lightweight tag matching the package version exactly:
git tag vX.Y.Zgit push origin vX.Y.Z
- The tag triggers
.github/workflows/release.yml, which builds the package, publishes it to PyPI withPYPI_TOKEN, and creates the GitHub Release with generated notes anddist/*assets. Do not create a second release manually. - Watch the
Release & Publishworkflow and verify the release after it succeeds:gh release view vX.Y.Z- Confirm
https://pypi.org/project/jupyter-jcli/X.Y.Z/is available. - no need for local install test.
The tag workflow does not run tests or verify that the tag and package versions match. Treat the successful main test run and the exact vX.Y.Z tag as mandatory release gates.