Guide through releasing a project with tenzir-ship (detect, stage, commit, publish, verify).
Guides through releasing a project with tenzir-ship, handling versioning, staging, and publishing.
/plugin marketplace add tenzir/claude-plugins/plugin install ship@tenzir[patch|minor|major]Look for the right changelog directory for this release by running:
uvx tenzir-ship stats --json
This release is a module release iff it belongs to one of the listed module paths. Otherwise it is a relase of the parent project.
Abort if there are no unreleased changelog entries.
Bootstrap your knowledge by invoking the prose:technical-writing skill and
reading about the tenzir-ship CLI here:
Before starting, verify:
If any check fails, abort and explain why. Do not attempt to fix issues.
Begin by identifying the project type by running
${CLAUDE_PLUGIN_ROOT}/scripts/detect-project-type.sh.
Only execute the project-specific sections, e.g., if the project type is
python, only read the instructions fenced within the respective XML tag:
Run the quality gates of the project. All must pass.
<project type="python">uv run ruff checkuv run ruff format --checkuv run mypyuv run pytestuv buildFix any failures before continuing.
Use $1 if provided. Otherwise, infer from unreleased entries:
If the bump type cannot be determined, abort and explain why.
Staging the release means reorganizing the changelog/ directory to reflect the latest release. This requires two additional inputs:
Title: Examine the release notes and synthesize a user-facing title that highlights the lead topic—the most important change from a user's perspective. For example, "User-Defined Functions" or "Kubernetes Support".
Intro: Create an intro file (e.g., .intro.md) summarizing the release
highlights based on entries in changelog/unreleased/. Example:
This release adds support for custom templates and improves validation performance. It also fixes several bugs related to YAML parsing.
Then execute staging the release:
uvx tenzir-ship release create --patch|--minor|--major \
--title "Title" \
--intro-file .intro.md \
--yes
Remove the temporary intro file upon success.
If the project contains files that maintain the authoritative project version, update them now using the bump type from step 2.
Example files that contain an authoritative version:
Run with the bump type from step 2:
uv version --bump patch|minor|major
This updates pyproject.toml and uv.lock.
Preview the release notes:
uvx tenzir-ship show --release latest
Stage all changes, then publish (commits, creates git tag, pushes, and creates GitHub release):
git add -A
uvx tenzir-ship release publish --commit --tag --yes
Confirm:
Watch CI until the Publish to PyPI workflow completes successfully.
</project>For module releases, adapt the above release steps as follows:
git add <module-root>/
<module-root> is the parent directory of module's changelog/plugins/cpp/changelog/, stage plugins/cpp/git commit -m "Release <module-name> <version>"
<module-name> is the module directory name (e.g., cpp, mylib)<version> is the direct output from uvx tenzir-ship release version
that includes a v prefix/releasePrepare a new release by updating changelog, version, and documentation