This document outlines the complete automated release process for OpenCLI.
OpenCLI uses a fully automated multi-channel publishing workflow. A single command triggers the entire release process across all distribution channels.
- GitHub Releases - Binaries and release notes
- Homebrew - macOS and Linux package manager
- Scoop - Windows package manager
- Winget - Windows Package Manager
- npm - Node.js package manager (planned)
- Docker/GHCR - Container images
- Snap - Linux package manager (planned)
- MCP Markets - Smithery.ai, Glama.ai, PulseMCP, etc.
Configure these secrets in GitHub Settings → Secrets and variables → Actions:
HOMEBREW_TAP_TOKEN # GitHub PAT for homebrew-tap repository
SCOOP_BUCKET_TOKEN # GitHub PAT for scoop-bucket repository
NPM_TOKEN # npm automation token (if publishing to npm)
SNAPCRAFT_TOKEN # Snap store credentials (if publishing to Snap)
Create these repositories before first release:
<org>/homebrew-tap- Homebrew formula repository<org>/scoop-bucket- Scoop manifest repository
Ensure all changes are committed and tests pass:
# Run tests
dart test
cargo test --workspace
# Check for uncommitted changes
git statusRun the automated release script:
./scripts/release.sh <version> "<description>"Examples:
# Stable release
./scripts/release.sh 1.0.0 "Initial stable release"
# Minor update
./scripts/release.sh 1.1.0 "Add browser automation features"
# Patch release
./scripts/release.sh 1.0.1 "Bug fixes and performance improvements"
# Pre-release
./scripts/release.sh 1.1.0-beta.1 "Beta release with new features"The script automatically performs:
- Validates version format (SemVer)
- Checks for uncommitted changes
- Updates version in all files:
cli/Cargo.tomldaemon/pubspec.yamlide-plugins/vscode/package.jsonweb-ui/package.jsonplugins/*/pubspec.yamlREADME.md
- Updates
CHANGELOG.md - Syncs documentation across packages
- Creates git commit
- Tags release with
v<version> - Pushes to GitHub (triggers CI/CD)
Once pushed, GitHub Actions automatically:
- Extracts version from tag
- Syncs documentation
- CLI Binaries - 5 platforms:
- macOS (ARM64 + x86_64)
- Linux (x86_64 + ARM64)
- Windows (x86_64)
- Daemon Binaries - 3 platforms:
- macOS
- Linux
- Windows
- Calculates SHA256 checksums for all binaries
- GitHub Release
- Creates release with auto-generated notes
- Uploads all binaries
- Uploads checksums
- Marks as pre-release if version contains hyphen
- Homebrew
- Updates formula with new version and checksums
- Pushes to homebrew-tap repository
- Scoop
- Updates manifest with new version and checksum
- Pushes to scoop-bucket repository
- Winget
- Generates manifest files
- Uploads as artifacts (manual PR required)
- Docker
- Builds multi-arch images (amd64, arm64)
- Pushes to GitHub Container Registry
- Tags:
latest,<version>,<major>.<minor>,<major>
Some platforms require manual submission:
- Download manifest artifacts from GitHub Actions
- Fork
microsoft/winget-pkgs - Create directory:
manifests/o/OpenCLI/OpenCLI/<version>/ - Copy manifest files
- Submit Pull Request
Or use automated tool:
winget-create update OpenCLI.OpenCLI -u <binary-url> -v <version> -t $GITHUB_TOKENSmithery.ai (Automated)
- Automatically indexed via
smithery.json - No manual action needed
Glama.ai (Automated)
- Submit repository URL
- Automatically scrapes for MCP Server
PulseMCP (Manual)
- Visit https://pulsemcp.com/submit
- Submit project details
Awesome MCP Servers (Manual PR)
- Fork
awesome-mcp-serversrepository - Add OpenCLI to README table
- Submit Pull Request
Follow Semantic Versioning:
- MAJOR (
x.0.0) - Incompatible API changes - MINOR (
1.x.0) - Backwards-compatible features - PATCH (
1.0.x) - Backwards-compatible bug fixes - Pre-release (
1.0.0-alpha.1) - Alpha, beta, rc
The CHANGELOG.md follows Keep a Changelog:
## [1.0.0] - 2026-01-31
### Added
- New features
### Changed
- Changes in existing functionality
### Fixed
- Bug fixes
### Deprecated
- Soon-to-be removed features
### Removed
- Removed features
### Security
- Security fixes- All tests passing
- Documentation updated
- CHANGELOG.md describes changes
- Version bump is appropriate
- No uncommitted changes
- On correct branch (usually
main)
- Run
./scripts/release.sh <version> "<description>" - Verify git tag created
- Verify push successful
- Monitor GitHub Actions
- Verify GitHub Release created
- Verify binaries uploaded
- Check Homebrew formula updated
- Check Scoop manifest updated
- Check Docker images pushed
- Submit Winget PR (if applicable)
- Update MCP Markets (if needed)
- Announce release
Monitor workflow progress:
https://github.com/<org>/opencli/actions
Verify images:
docker pull ghcr.io/<org>/opencli:latest
docker pull ghcr.io/<org>/opencli:<version>Test installation:
# Homebrew
brew install <org>/tap/opencli
brew upgrade opencli
# Scoop
scoop install opencli
scoop update opencli
# Winget
winget install OpenCLI.OpenCLI
winget upgrade OpenCLI.OpenCLI
# npm (if published)
npm install -g @opencli/cliIf a workflow fails:
- Check logs in GitHub Actions
- Fix the issue in code
- Delete the tag locally and remotely:
git tag -d v<version> git push origin :refs/tags/v<version>
- Re-run the release script
If version sync fails:
# Manually run version bump
dart scripts/bump_version.dart <version>
# Check differences
git diffIf push fails:
# Verify remote
git remote -v
# Try manual push
git push origin main --follow-tags
# Or push tag separately
git push origin v<version>To rollback a release:
-
Delete GitHub Release
- Go to Releases → Edit → Delete
-
Delete Git Tag
git tag -d v<version> git push origin :refs/tags/v<version>
-
Revert Package Managers
- Homebrew: Push old formula
- Scoop: Push old manifest
- Winget: Submit new PR
- Docker: Delete image tags (or leave as historical)
- Test locally first - Build and test before releasing
- Use pre-releases - Test distribution with
-betaversions - Automate everything - Avoid manual version updates
- Document changes - Keep CHANGELOG.md current
- Verify checksums - Ensure integrity across platforms
- Monitor failures - Set up notifications for failed workflows
- Communicate - Announce releases to users
For automated releases on every merge to main:
-
Update
.github/workflows/release.ymltrigger:on: push: branches: [main]
-
Implement automatic version bumping
-
Generate CHANGELOG from commits
Note: Manual releases are recommended for better control.
For release issues:
- GitHub Discussions: https://github.com//opencli/discussions
- Issues: https://github.com//opencli/issues
- Email: support@opencli.ai