feat(packaging): build and verify Homebrew releases - #6
Merged
Conversation
Generate the formula from the source archive and locked runtime resources so its version, checksum, and dashboard match the release. Gate release and publication on a real macOS Homebrew install and test. Keep service startup explicit and document the separate tap PR needed until the shared updater accepts Python formula artifacts.
Use the explicit v0.6.0 minimum instead of relative next-release copy. Describe the platform-specific installer behavior and keep tap availability conditional on its formula being merged.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
💡 Build a Homebrew formula with each release
macOS support is merged, but the tap needs a Python package with its dashboard and native MIDI dependency. Releases now generate a checksum-pinned Homebrew formula from the built source archive. The release workflow's CI gate installs that formula on macOS and runs its package tests before tagging; publication repeats the gate at the release tag.
🛠️ Packaging contract
The generator reads the archive's own package version and lockfile, follows the runtime dependency closure, and writes source-resource checksums into the formula. Missing dashboard content, mismatched versions, ambiguous locked versions, and unsafe resource fields fail generation. Build backends still use Homebrew's normal isolated builds; this is not a fully hermetic build.
The formula uses Homebrew's Python virtualenv support with Python 3.14, Rust, CMake, and pkgconf. Installation does not start a service. Users explicitly run
blocksd installafter stopping a foreground instance and repeat that command after upgrades to refresh the LaunchAgent path.Publication attaches
blocksd.rband includes it inSHA256SUMS. The current shared tap updater only accepts native binary artifacts, so the first formula will enterhyperb1iss/homebrew-tapthrough a separate PR after v0.6.0 is published. Automatic updates need shared-workflow support for formula artifacts and the tap token; this PR does not claim to enable them.🧪 Validation
brew test --force.--versioninvocation in the formula test. The corrected test exercises CLI help and reads the installed package version through Python metadata.The local build uses the unreleased checkout's 0.5.0 archive only for verification. No formula pointing to the existing v0.5.0 release has been published. Availability through the tap follows the new release and its tap PR.