docs/RELEASING.md
Quick guide for releasing a new version of beads.
Use the fully automated release script:
./scripts/release.sh 0.9.3
This does everything: version bump, tests, git tag, Homebrew update, and local installation.
See scripts/README.md for details.
If you prefer step-by-step control:
Stop all running Dolt servers (CRITICAL):
# Stop Dolt servers in all workspaces
bd dolt stop
# Or find and stop by process
pkill -f "dolt sql-server" 2>/dev/null
pgrep -lf "dolt sql-server" || echo "No Dolt servers running ā"
Why this matters: Old server versions can cause:
Run tests and build:
TMPDIR=/tmp go test ./...
golangci-lint run ./...
TMPDIR=/tmp go build -o bd ./cmd/bd
./bd version # Verify it shows new version
Skip local install (avoid go install vs brew conflicts):
./bd directly from the repo for testingalias bd="$PWD/bd" if neededUpdate CHANGELOG.md:
## [0.9.X] - YYYY-MM-DDCommit changelog:
git add CHANGELOG.md
git commit -m "Add 0.9.X release notes"
Use the automated script to update all version files:
./scripts/bump-version.sh 0.9.X --commit
git push origin main
This updates:
cmd/bd/version.go.claude-plugin/plugin.json.claude-plugin/marketplace.jsonintegrations/beads-mcp/pyproject.tomlintegrations/beads-mcp/src/beads_mcp/__init__.pyREADME.mdPLUGIN.mdIMPORTANT: After version bump, rebuild the local binary:
go build -o bd ./cmd/bd
./bd version # Should show new version
git tag v0.9.X
git push origin main
git push origin v0.9.X
That's it! GitHub Actions automatically handles the rest:
The automation requires this secret to be configured:
PYPI_API_TOKEN: Your PyPI API token
PYPI_API_TOKENpypi-... (your full token)If the automated publish fails, you can manually upload:
cd integrations/beads-mcp
# Clean and rebuild
rm -rf dist/ build/ src/*.egg-info
uv build
# Upload to PyPI
TWINE_USERNAME=__token__ TWINE_PASSWORD=pypi-... uv tool run twine upload dist/*
See integrations/beads-mcp/PYPI.md for detailed PyPI instructions.
The Homebrew formula is now in homebrew-core and updates automatically via GitHub Release artifacts.
Verify the installation works:
brew update
brew upgrade beads # Or: brew install beads
bd version # Should show v0.9.X
Note: If you have an old bd binary from go install in your PATH, remove it to avoid conflicts:
# Find where bd is installed
which bd
# If it's in a Go toolchain path (e.g., ~/go/bin/bd or mise-managed Go), remove it
# Common locations:
rm ~/go/bin/bd # Standard go install location
rm ~/.local/share/mise/installs/go/*/bin/bd # mise-managed Go installs
# Verify you're using the correct version
which bd # Should show /opt/homebrew/bin/bd or your package manager's path
bd version # Should show the latest version
GoReleaser automatically creates releases when you push tags!
The .github/workflows/release.yml workflow:
v* tagsJust push your tag and wait ~5 minutes:
git push origin v0.9.X
Monitor at: https://github.com/gastownhall/beads/actions
The release will appear at: https://github.com/gastownhall/beads/releases
The published docs at GitHub Pages are versioned. Unreleased edits live in website/docs/ (Next); each release should add a snapshot:
cd website
npm ci
npm run docusaurus docs:version X.Y.Z
Then set lastVersion in website/docusaurus.config.ts to X.Y.Z so visitors default to the latest stable docs (not Next).
Commit website/versioned_docs/, website/versioned_sidebars/, and website/versions.json with the release. The scripts/generate-llms-full.sh script pulls from the latest entry in versions.json so llms-full.txt stays aligned with that snapshot.
Stop old Dolt servers:
bd dolt stop
pkill -f "dolt sql-server" 2>/dev/null
pgrep -lf "dolt sql-server" || echo "No Dolt servers running ā"
This ensures your local machine picks up the new version immediately.
Verify installations:
# Homebrew
brew update && brew upgrade beads && bd version
# PyPI
pip install --upgrade beads-mcp
beads-mcp --help
Announce (optional):
Always rm -rf dist/ before uv build to avoid uploading old versions.
PyPI doesn't allow re-uploading same version. Increment version number even for fixes.
Wait a few seconds after pushing tag for GitHub to make tarball available, then recompute SHA256.
Set up API token at https://pypi.org/manage/account/token/ and use __token__ as username.
ā Automated:
š TODO: