Release CLI

Quick Release

./scripts/release-cli.sh v0.2.0

This script:

  1. Validates you're on main and it's clean
  2. Runs goreleaser check to validate config
  3. Optionally does a --snapshot dry-run build
  4. Creates and pushes the git tag
  5. Monitors the GitHub Actions release workflow
  6. Verifies binaries are downloadable from blob storage

Manual Release Steps

If the script doesn't fit:

  1. Ensure all CLI changes are merged to main
  2. Validate GoReleaser config: goreleaser check
  3. Local dry run (optional): goreleaser build --snapshot --clean
  4. Tag: git tag v0.2.0
  5. Push tag: git push origin v0.2.0
  6. Monitor: gh run watch (the Release CLI workflow triggers on v* tags)
  7. Verify: curl -sSf https://seed.unionstreet.ai/cli/install | sh

What the Pipeline Does

git tag v0.2.0 → push → GitHub Actions triggers:
  1. GoReleaser cross-compiles 5 targets
  2. Archives: tar.gz (linux/mac) + zip (windows)
  3. @vercel/blob SDK uploads to:
     - cli/v0.2.0/seed_linux_amd64.tar.gz  (versioned)
     - cli/latest/seed_linux_amd64.tar.gz   (latest)

Build Targets

OSArchArchive
linuxamd64tar.gz
linuxarm64tar.gz
darwinamd64tar.gz
darwinarm64tar.gz
windowsamd64zip

Blob Storage

Binaries live in Vercel Blob at BLOB_BASE_URL/cli/latest/. The app serves them through:

  • /cli — browser install page
  • /cli/installcurl | sh script (auto-detects OS/arch)
  • /cli/download/[filename] — 302 redirect to blob

Version Conventions

  • v0.x.y — pre-1.0, breaking changes allowed between minor versions
  • Semantic versioning: vMAJOR.MINOR.PATCH
  • Tags must match v* pattern to trigger the workflow

Forking for a New Product

When forking the seed for a new product:

  1. Update project_name in .goreleaser.yml
  2. Update cliName in lib/brand.ts
  3. Verify BLOB_READ_WRITE_TOKEN is available (inherited from org secret)
  4. First release: git tag v0.1.0 && git push origin v0.1.0

If You're Lost