Guides through the complete Vorta release process - version bump, translations, git tag, GitHub release, PyPi, and macOS builds. Invoke with /release.
Guide the user through all release steps interactively. Confirm before each destructive operation.
Before starting, verify the repository is ready:
git status # Must be clean, on master branch
If there are uncommitted changes, stop and ask the user to resolve them first.
Ask the user for the new version number (e.g., 0.12.0). Verify it follows semver format.
Edit src/vorta/_version.py:
__version__ = "X.Y.Z" # New version
Note: Use command op to bypass shell function issues with 1Password CLI.
command op run -- make translations-update
If this fails (e.g., 1Password not configured), ask user if they want to skip or fix it.
Note: make bump-version has a preflight check that requires a clean tree, but we've already edited _version.py. Perform the steps manually instead:
# Edit src/vorta/assets/metadata/com.borgbase.Vorta.appdata.xml
# Change: <release version="vX.Y.Z" date="YYYY-MM-DD" ...>
git add src/vorta/_version.py src/vorta/assets/metadata/com.borgbase.Vorta.appdata.xml
git commit -m "Bump version to vX.Y.Z"
git tag -a vX.Y.Z -m "TAG_MESSAGE_HERE"
Prompt the user for the tag message (brief summary of changes).
git push upstream master
git push upstream vX.Y.Z
Monitor the test workflow:
gh run list --workflow=test.yml --limit=1
gh run watch <run-id> --exit-status
Wait for tests to pass before proceeding. If tests fail, stop and notify the user.
make changelog
Format the output as a bullet list for release notes, excluding:
gh release create vX.Y.Z --draft --title "vX.Y.Z" --notes "CHANGELOG_HERE"
Show the user the draft URL for review.
Note: Use command op to bypass shell function issues with 1Password CLI.
command op run -- make pypi-release
This builds the sdist and uploads to PyPi via twine.
If op fails, provide manual instructions:
uv run python -m build --sdist
uv run twine upload dist/vorta-X.Y.Z.tar.gz
Default Borg version: 1.4.3 (ask user if they want different)
# ARM build (Apple Silicon) - uses macos-14
gh workflow run build-macos.yml -f branch=master -f macos_version=macos-14 -f borg_version=1.4.3
# Intel build - uses macos-15-intel (x86_64 runner)
gh workflow run build-macos.yml -f branch=master -f macos_version=macos-15-intel -f borg_version=1.4.3
# List recent workflow runs to get run IDs
gh run list --workflow=build-macos.yml --limit=2
# Watch both runs
gh run watch <arm-run-id> --exit-status
gh run watch <intel-run-id> --exit-status
rm -rf ./release-artifacts && mkdir -p ./release-artifacts
gh run download <arm-run-id> -D ./release-artifacts
gh run download <intel-run-id> -D ./release-artifacts
Note: Artifacts are in nested directories (e.g., ./release-artifacts/Vorta-vX.Y.Z-arm.dmg/Vorta-vX.Y.Z-arm.dmg)
gh release upload vX.Y.Z \
"./release-artifacts/Vorta-vX.Y.Z-arm.dmg/Vorta-vX.Y.Z-arm.dmg" \
"./release-artifacts/Vorta-vX.Y.Z-intel.dmg/Vorta-vX.Y.Z-intel.dmg"
rm -rf ./release-artifacts
After verifying the release looks correct:
gh release edit vX.Y.Z --draft=false
Provide the release URL to the user.
Update the Sparkle appcast for macOS auto-updates.
Note: The gh-pages branch doesn't have pre-commit config, so commits may fail. Handle this:
make update-appcast
If the commit fails due to pre-commit, complete manually:
# If already on gh-pages from failed make target:
PRE_COMMIT_ALLOW_NO_CONFIG=1 git commit -m "Update appcast for vX.Y.Z"
git push upstream gh-pages
git checkout master
Summarize what was done: