-
Preflight. From the repo root, run the bundled check — it reports branch / sync / version and
builds + twine check --stricts the artifacts before anything irreversible:
bash ${CLAUDE_SKILL_DIR}/scripts/preflight.sh
Resolve anything it flags (dirty tree, behind upstream, build/twine failure) before continuing.
-
Pick the new version (semver) and confirm it. It must be greater than aeview's latest published
version — PyPI is immutable, so a version can never be reused or overwritten.
-
Bump version in pyproject.toml, then run uv lock so uv.lock records the new version too
(otherwise the lock drifts behind the release).
-
Commit as chore(release): <version> — stage both pyproject.toml and uv.lock (put any
release notes in the body).
-
Push main:
git push origin main
-
Tag and push the tag — this triggers the publish. Confirm first.
git tag -a v<version> -m "aeview <version>"
git push origin v<version>
-
Hand the approval gate to the maintainer. The run pauses at the pypi environment. Give them
the run URL (gh run list --workflow=release.yml → the run) and ask them to Review deployments →
approve. Never approve the publish yourself — that click is the maintainer's go/no-go on the
permanent upload.
-
Verify after it publishes. Watch the run (gh run watch <run-id>); on success, confirm:
https://pypi.org/pypi/aeview/<version>/json returns 200 (the plain …/aeview/json "latest" can
lag a minute behind the CDN);
- a clean install works:
uv tool install --prerelease=allow aeview && aeview --version (mind the
prerelease flag — see Gotchas).