Untether untether-release
Prepare and ship a Untether release. Use when asked to cut a release, bump release versions, update changelog/spec/readme, tag v<major.minor.patch>, or trigger the GitHub release workflow.
git clone https://github.com/littlebearapps/untether
T=$(mktemp -d) && git clone --depth=1 https://github.com/littlebearapps/untether "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.codex/skills/untether-release" ~/.claude/skills/littlebearapps-untether-untether-release && rm -rf "$T"
.codex/skills/untether-release/SKILL.mdUntether Release
Overview
Prepare a tagged release that matches the GitHub Actions release workflow. The workflow requires the tag version to match both
pyproject.toml and src/untether/__init__.py.
Workflow
1) Choose version + date
Pick the release version (major.minor.patch) and the release date (YYYY-MM-DD) for changelog/spec headers. If the current version has a
.dev suffix, assume the target release version is the same version without the suffix, as long as that tag does not already exist.
2) Update changelog
Update
changelog.md by adding a new top section. Before writing it, study the diff between the previous tag and the new release to rank changes; put user-facing changes first.
## v<major.minor.patch> (YYYY-MM-DD)- Include subsections like
,changes
,fixes
,breaking
as needed.docs - Keep entries short and include PR links when available (match existing style).
3) Bump versions
Update version strings to match the release tag:
:pyproject.tomlproject.version = "<major.minor.patch>"
:src/untether/__init__.py__version__ = "<major.minor.patch>"
: refresh so the root package version matches (runuv.lock
oruv lock
).uv sync
4) Update spec + docs
Update
docs/specification.md to match the release:
- Header:
# Untether Specification v<major.minor.patch> [YYYY-MM-DD] - Replace
andUntether v<old>
lines with the new version.Out of scope for v<old> - Add a changelog entry like
unless the spec itself changed.- No normative changes; align spec version with the v<major.minor.patch> release.
If the release highlights new features, update
readme.md accordingly (see v0.9.0 release).
5) Run checks
Run the standard checks before committing:
(ruff/ty/pytest)just check
6) Commit + tag
Commit the release using conventional commits:
- Commit message:
chore(release): v<major.minor.patch> - Tag:
git tag v<major.minor.patch>
Push the tag to trigger
.github/workflows/release.yml (build, PyPI publish, GitHub release).
7) Optional post-release bump
If you keep a dev version between releases, bump the minor version (reset patch to 0) and commit (
chore: bump version to ...).
Notes
- The release workflow checks that the tag matches
andpyproject.toml
.src/untether/__init__.py - Keep dates consistent across
andchangelog.md
.docs/specification.md