feat: add winget and Homebrew packaging with automated release pipeline#27
Merged
Conversation
…workflow - release.yml: tag-triggered workflow cross-compiles all five platform binaries and publishes them as GitHub Release assets (cpool-*.zip) - winget-releaser.yml: auto-submits PiersSinclair.CardPool to microsoft/winget-pkgs on each release using winget-releaser action - homebrew-releaser.yml: updates SHA256 hashes and version in piers-sinclair/homebrew-cpool tap on each release - packaging/winget: reference manifests for v1.2.1 (zip+portable, x64 and arm64) - packaging/homebrew/cpool.rb: multi-platform formula (macOS arm64/x64, Linux x64) - packaging/aur: PKGBUILD and .SRCINFO for Arch User Repository (linux-x64) - README: add winget, Homebrew, and AUR install options (Options B–D) - CLAUDE.md: document new release automation and all distribution channels Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…moke tests - Remove packaging/aur/ (Homebrew on Linux covers the use case adequately) - Remove AUR option from README and CLAUDE.md - Rename winget manifest directory 1.2.1 → 1.2.2 and update all version refs - Update Homebrew formula version to 1.2.2 - Fix publish.yml trigger: tags (v*.*.*) instead of every push to main, so NuGet is published only when a release is cut, not on every commit - Add validate-packaging.yml: runs on PRs touching packaging/ — winget validate on Windows runner, brew style on macOS runner - Add smoke-test.yml: triggered by workflow_run after homebrew-releaser succeeds, installs cpool from the Homebrew tap on macOS and Linux and asserts version output; winget install can be triggered manually (workflow_dispatch) after winget-pkgs PR merges Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ed22ce3 to
dfb0c4c
Compare
Homebrew formula: - Replace on_macos/on_linux blocks (url disallowed inside them) with top-level if OS.mac? / elsif OS.mac? / else conditionals — correct pattern for binary distros - Use unique placeholder sha256 per platform (brew style flags identical branches) - Update desc to mention 25 Format and Discord link, drop trademarked game name Winget manifests: - Add yaml-language-server schema header to all three files (winget validate warning) - Use distinct placeholder sha256 for x64 and arm64 (validate warns on duplicates) - Remove trademarked game name and Edison format ref from locale description - Add 25 Format framing and Discord link (discord.gg/wDXgNHukb) - Swap yugioh tag for 25-format validate-packaging workflow: - Add --manifest flag to winget validate (was using positional arg) - Create temporary git tap before brew style so Homebrew uses formula-scoped RuboCop config (suppresses Sorbet/FrozenStringLiteral cops that fire on raw files) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rkflow release.yml now triggers on push to main when CardPool.Cli.csproj changes: - check job reads <Version> from csproj and calls gh release view to skip if a release for that version already exists (idempotent) - release job builds all five platforms, packs NuGet, creates GitHub Release (which auto-creates the git tag), then pushes to nuget.org - workflow_dispatch kept for manual re-runs - winget-releaser and homebrew-releaser still trigger from release:published publish.yml deleted — NuGet publish is now part of the unified release job. No manual tag push required: merge a version bump to main and all channels (GitHub Releases, NuGet, winget, Homebrew) publish automatically. Update descriptions: 'originally built for the 25 Format' framing in both the Homebrew formula desc and the winget locale, with Discord link retained in the winget long description. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Homebrew desc and winget ShortDescription now both include the 25 Format Discord invite (discord.gg/wDXgNHukb) to encourage community discovery. Framing is 'originally built for the 25 Format' throughout to avoid implying the tool is exclusively for that format. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…scriptions Both Homebrew desc and winget ShortDescription/Description now lead with 'originally built for the 25 Format' and close with a community invite, making clear the origin while welcoming all TCG use cases. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…patching hashes Previously only sed/awk-patched version+sha256 in the tap, meaning any structural change to packaging/homebrew/cpool.rb (install logic, test, URL pattern) would silently never reach the tap. Now: checkout both repos, cp the full formula file from cardpool into the tap, then stamp in real sha256 values. packaging/homebrew/cpool.rb is the single source of truth for formula structure. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…README Covers: how to release (version bump + merge), automated pipeline steps, post-release winget smoke test, secrets setup and renewal for all three channels (NuGet/winget/Homebrew), and Homebrew formula sync process. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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.
Summary
mainthat touchesCardPool.Cli.csproj. Extracts the<Version>, checks if a GitHub Release already exists (skips if so), then builds all five platform binaries, creates the GitHub Release + git tag, and pushes to NuGet. No manual tag push ever needed.release: published; usesvedantmgoyal9/winget-releaserto auto-submit a PR tomicrosoft/winget-pkgswith real SHA256 hashes (requiresWINGET_TOKENsecret)release: published; checks out both this repo andpiers-sinclair/homebrew-cpool, copiespackaging/homebrew/cpool.rbwholesale into the tap, then stamps real SHA256 hashes and pushes (requiresHOMEBREW_TAP_TOKENsecret)packaging/; validates the winget manifest withwinget validate --manifeston a Windows runner and checks the Homebrew formula style viabrew styleusing a temporary local tap (ensures formula-scoped RuboCop config)homebrew-releaser.ymlsucceeds; installs from the Homebrew tap on macOS and Linux and assertscpool --versionreturns output; winget install can be triggered manually viaworkflow_dispatchafter the winget-pkgs PR mergesrelease.ymlif OS.mac?top-level conditionals as required by Homebrew), macOS arm64/x64 + Linux x64Pre-requisites before first release
WINGET_TOKENsecret — classic PAT,public_reposcope only → https://github.com/piers-sinclair/cardpool/settings/secrets/actionsHOMEBREW_TAP_TOKENsecret — fine-grained PAT,homebrew-cpoolrepo, Contents read/write → same pageNUGET_API_KEYshould already exist)How to release
Bump
<Version>insrc/CardPool.Cli/CardPool.Cli.csproj, commit, merge tomain. Everything else is automatic.Test plan
validate-packagingCI passes on this PR (winget validate + brew style)release.ymlcreates GitHub Release, publishes NuGet, triggers winget and Homebrew workflowshomebrew-releaser.ymlpushes real SHA256s topiers-sinclair/homebrew-cpoolsmoke-test.ymlpasses on macOS and Linux (brew install cpool && cpool --version)🤖 Generated with Claude Code