About release
A repository-local skill for releasing the fromargs package, covering changelog preparation, approval-gated publishing, and post-release checks. It guides maintainers through a versioned PyPI and GitHub release.
Key features
- 01Changelog-based release notes
- 02Version and branch preflight checks
- 03Approval-gated PyPI publishing
- 04Rebuild of embedded artifacts
- 05GitHub release verification
Use cases
- 01Preparing a fromargs release PR
- 02Publishing an approved version to PyPI
- 03Checking release artifacts and metadata
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ paulnsorensen/ skillz-that-grillz --skill releaseAfter installing, type/releasein Claude Code to confirm it loaded.
Details
From the project READMERelease fromargs
This is a repository-local skill for skillz-that-grillz. It lives under .agents/skills/release/, with a .claude/skills/ symlink for Claude Code. metadata.internal: true hides it from npx skills add. Do not move it into the published skills/ tree.
A tag push publishes to PyPI after one approval, and PyPI never accepts the same version twice. Treat the tag push and the approval as irreversible.
Release contract
packages/fromargs/CHANGELOG.mdis the only source of release notes.just fromargs-release-notes <version>prints one section and fails when it is missing or empty..github/workflows/publish-fromargs.ymlruns on afromargs-v*tag. Its build job requires the tag commit onmainand the tag version equal topackages/fromargs/pyproject.toml.- The
publishjob waits for thepypienvironment approval, then uploads with trusted publishing. - The
github-releasejob creates the GitHub release with--latest=false. It fails when the tag moved after the build. - The wedge bundles and the
cheese-caveexample lock embed the fromargs source, so a version change needs a rebuild.
1. Preflight
- Switch to
main, pull with--ff-only, and require a clean tree. - Read the
## [Unreleased]section ofpackages/fromargs/CHANGELOG.md. Stop when it is empty. - Choose the version. Use the argument when the user gives one. Otherwise, propose the next minor version for a
0.xrelease with a Breaking entry, and the next patch version for other changes. Confirm the proposed version with the user. - Stop when the tag
fromargs-v<version>exists onoriginorhttps://pypi.org/pypi/fromargs/<version>/jsonreturns 200.
2. Prepare the release PR
-
Create the branch
chore/fromargs-release-<version>. -
In
packages/fromargs/CHANGELOG.md, move theUnreleasedentries under## [<version>] - <YYYY-MM-DD>with today's date. Keep an empty## [Unreleased]heading. -
Update the link references at the end of the CHANGELOG.
[Unreleased]comparesfromargs-v<version>...HEAD. Add[<version>]to compare the previous tag withfromargs-v<version>. -
Set
version = "<version>"inpackages/fromargs/pyproject.toml. -
When the minor version changes, set the
fromargsrange inpyproject.tomlandpackages/wedge/pyproject.tomlto>=<major>.<minor>.0,<<major>.<next minor>. -
Relock the workspace with the uv version that the workflow pins in its
setup-uvstep, so the lockfilerevisionstays compatible with CI:uvx uv@<ci-uv-version> lock -
Rebuild the artifacts that embed fromargs:
uv run --locked --project packages/wedge wedge lock --root packages/wedge/examples/skills uv run --locked --project packages/wedge wedge bundle skills/skillz -
Run
just fromargs-release-notes <version>and read the output. It must show the complete new section. -
Run
uv build --package fromargs --no-sources --out-dir <temp dir>anduvx twine check <temp dir>/*. -
Run
just build. Stop on a new failure. Compare any failure with a cleanmaincheckout before you call it a baseline failure. -
Commit the named files as
chore(fromargs): release <version>. Push the branch and open a PR againstmain. Put the release notes and the post-merge steps in the PR body.
3. Merge
- Wait for every PR check to pass. Resolve or answer every review thread.
- Get explicit user approval to merge, unless the user asked for the complete release in this session.
- Squash-merge with
gh pr merge <n> --squash --match-head-commit <sha>. Record the merge commit SHA. - When the merge date differs from the CHANGELOG date, fix the date in a new PR before you tag.
4. Tag and approve
-
Fetch
main. Confirm that the merge commit is onorigin/mainand that it has the new version and CHANGELOG section. -
Create and push an annotated tag on the merge commit:
git tag -a fromargs-v<version> <merge-sha> -m "Release fromargs <version>" git push origin fromargs-v<version> -
Find the
publish fromargsrun for the tag. Wait until the build job passes and the run waits on thepypienvironment. -
Approve the deployment only after the user approves it, unless the user asked for the complete release in this session:
gh api repos/<owner>/<repo>/actions/runs/<run-id>/pending_deployments \ -X POST -F "environment_ids[]=<pypi-env-id>" -f state=approved \ -f comment="Approve fromargs <version>"
5. Verify
- Watch the run to completion. Every job must succeed.
- Read
https://pypi.org/pypi/fromargs/<version>/json. Confirm the version, the dependency ranges, and one wheel and one sdist. - Read
gh release view fromargs-v<version>. Confirm that it is not a draft, that its body starts with the CHANGELOG section, and that both dist files are attached. - Confirm that the repository's latest release did not change.
Failure rules
- Never move, delete, or re-push a published tag. A new fix needs a new patch version.
- When the build job fails, no upload happened. Fix the cause on
main, delete the unpublished tag only with user approval, and tag again. - When PyPI has the version but the
github-releasejob failed, re-run only the failed job withgh run rerun <run-id> --failed. - Never approve a deployment for a run whose tag does not point at the reviewed merge commit.
Report
Report the PR, the merge commit, the tag, the workflow run, the PyPI URL, and the GitHub release URL. Name every check that did not run.