diff --git a/.github/workflows/homebrew-releaser.yml b/.github/workflows/homebrew-releaser.yml new file mode 100644 index 0000000..73c3820 --- /dev/null +++ b/.github/workflows/homebrew-releaser.yml @@ -0,0 +1,61 @@ +name: Homebrew Release + +on: + release: + types: [published] + +jobs: + homebrew: + runs-on: ubuntu-latest + steps: + - name: Checkout cardpool + uses: actions/checkout@v6 + with: + path: cardpool + + - name: Checkout tap + uses: actions/checkout@v6 + with: + repository: piers-sinclair/homebrew-cpool + token: ${{ secrets.HOMEBREW_TAP_TOKEN }} + path: tap + + - name: Sync formula and update hashes + env: + VERSION: ${{ github.ref_name }} + run: | + set -euo pipefail + VERSION="${VERSION#v}" + BASE="https://github.com/piers-sinclair/cardpool/releases/download/v${VERSION}" + + get_sha256() { curl -fsSL "$1" | sha256sum | awk '{print $1}'; } + + SHA_OSX_ARM64=$(get_sha256 "${BASE}/cpool-osx-arm64.zip") + SHA_OSX_X64=$( get_sha256 "${BASE}/cpool-osx-x64.zip") + SHA_LINUX_X64=$(get_sha256 "${BASE}/cpool-linux-x64.zip") + + cp cardpool/packaging/homebrew/cpool.rb tap/Formula/cpool.rb + + sed -i "s/version \"[0-9.]*\"/version \"${VERSION}\"/" tap/Formula/cpool.rb + + awk \ + -v osx_arm64="${SHA_OSX_ARM64}" \ + -v osx_x64="${SHA_OSX_X64}" \ + -v linux_x64="${SHA_LINUX_X64}" ' + /cpool-osx-arm64\.zip/ { print; getline; sub(/sha256 "[0-9a-f]+"/, "sha256 \"" osx_arm64 "\""); print; next } + /cpool-osx-x64\.zip/ { print; getline; sub(/sha256 "[0-9a-f]+"/, "sha256 \"" osx_x64 "\""); print; next } + /cpool-linux-x64\.zip/ { print; getline; sub(/sha256 "[0-9a-f]+"/, "sha256 \"" linux_x64 "\""); print; next } + { print } + ' tap/Formula/cpool.rb > tap/Formula/cpool.rb.tmp + mv tap/Formula/cpool.rb.tmp tap/Formula/cpool.rb + + - name: Commit and push + env: + VERSION: ${{ github.ref_name }} + working-directory: tap + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add Formula/cpool.rb + git commit -m "cpool ${VERSION}" + git push diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index fcc8511..0000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Publish to NuGet - -on: - push: - branches: - - main - workflow_dispatch: - -jobs: - publish: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v6 - - - name: Setup .NET - uses: actions/setup-dotnet@v5 - with: - dotnet-version: '10.x' - - - name: Restore dependencies - run: dotnet restore - - - name: Build - run: dotnet build src/CardPool.Cli --configuration Release --no-restore - - - name: Pack - run: dotnet pack src/CardPool.Cli --configuration Release --no-build --output ./nupkg - - - name: Push to NuGet - run: dotnet nuget push ./nupkg/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..b463358 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,81 @@ +name: Release + +on: + push: + branches: + - main + paths: + - 'src/CardPool.Cli/CardPool.Cli.csproj' + workflow_dispatch: + +permissions: + contents: write + +jobs: + check: + runs-on: ubuntu-latest + outputs: + version: ${{ steps.ver.outputs.version }} + tag: ${{ steps.ver.outputs.tag }} + should-release: ${{ steps.ver.outputs.should-release }} + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Check version + id: ver + env: + GH_TOKEN: ${{ github.token }} + run: | + VERSION=$(grep -oP '(?<=)[^<]+' src/CardPool.Cli/CardPool.Cli.csproj) + TAG="v${VERSION}" + echo "version=${VERSION}" >> $GITHUB_OUTPUT + echo "tag=${TAG}" >> $GITHUB_OUTPUT + if gh release view "${TAG}" &>/dev/null; then + echo "should-release=false" >> $GITHUB_OUTPUT + else + echo "should-release=true" >> $GITHUB_OUTPUT + fi + + release: + needs: check + if: needs.check.outputs.should-release == 'true' + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Setup .NET + uses: actions/setup-dotnet@v5 + with: + dotnet-version: '10.x' + + - name: Restore dependencies + run: dotnet restore + + - name: Publish all platforms + run: | + for rid in win-x64 win-arm64 osx-arm64 osx-x64 linux-x64; do + dotnet publish src/CardPool.Cli -p:PublishProfile=$rid -o dist/$rid --no-restore + done + + - name: Create archives + run: | + zip -j cpool-win-x64.zip dist/win-x64/cpool.exe + zip -j cpool-win-arm64.zip dist/win-arm64/cpool.exe + zip -j cpool-osx-arm64.zip dist/osx-arm64/cpool + zip -j cpool-osx-x64.zip dist/osx-x64/cpool + zip -j cpool-linux-x64.zip dist/linux-x64/cpool + + - name: Pack NuGet + run: dotnet pack src/CardPool.Cli --configuration Release --no-restore --output ./nupkg + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ needs.check.outputs.tag }} + files: cpool-*.zip + generate_release_notes: true + + - name: Push to NuGet + run: dotnet nuget push ./nupkg/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml new file mode 100644 index 0000000..a9c683f --- /dev/null +++ b/.github/workflows/smoke-test.yml @@ -0,0 +1,65 @@ +name: Package Manager Smoke Test + +on: + workflow_run: + workflows: ["Homebrew Release"] + types: [completed] + workflow_dispatch: + inputs: + test_winget: + description: 'Test winget install (run after winget-pkgs PR is merged)' + type: boolean + default: false + +jobs: + homebrew-macos: + if: > + (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') || + github.event_name == 'workflow_dispatch' + runs-on: macos-latest + steps: + - name: Install from tap + run: | + brew tap piers-sinclair/cpool + brew install cpool + + - name: Verify version + run: | + VERSION=$(cpool --version) + echo "Installed version: $VERSION" + [[ -n "$VERSION" ]] || { echo "cpool --version returned empty output"; exit 1; } + + homebrew-linux: + if: > + (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') || + github.event_name == 'workflow_dispatch' + runs-on: ubuntu-latest + steps: + - name: Install Homebrew + run: | + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + echo "/home/linuxbrew/.linuxbrew/bin" >> "$GITHUB_PATH" + + - name: Install from tap + run: | + brew tap piers-sinclair/cpool + brew install cpool + + - name: Verify version + run: | + VERSION=$(cpool --version) + echo "Installed version: $VERSION" + [[ -n "$VERSION" ]] || { echo "cpool --version returned empty output"; exit 1; } + + winget: + if: github.event_name == 'workflow_dispatch' && inputs.test_winget + runs-on: windows-latest + steps: + - name: Install via winget + run: winget install PiersSinclair.CardPool --accept-source-agreements --accept-package-agreements + + - name: Verify version + run: | + $version = cpool --version + Write-Output "Installed version: $version" + if (-not $version) { Write-Error "cpool --version returned empty output"; exit 1 } diff --git a/.github/workflows/validate-packaging.yml b/.github/workflows/validate-packaging.yml new file mode 100644 index 0000000..ca2fbbd --- /dev/null +++ b/.github/workflows/validate-packaging.yml @@ -0,0 +1,50 @@ +name: Validate Packaging + +on: + push: + branches: + - main + paths: + - 'packaging/**' + - '.github/workflows/validate-packaging.yml' + pull_request: + paths: + - 'packaging/**' + - '.github/workflows/validate-packaging.yml' + workflow_dispatch: + +jobs: + winget: + runs-on: windows-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Resolve manifest version + id: ver + shell: pwsh + run: | + $version = (Select-String -Path src/CardPool.Cli/CardPool.Cli.csproj -Pattern '(.*?)').Matches[0].Groups[1].Value + "version=$version" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + + - name: Validate winget manifest + shell: pwsh + run: winget validate --manifest packaging/winget/manifests/p/PiersSinclair/CardPool/${{ steps.ver.outputs.version }} + + homebrew: + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Create temporary tap + run: | + mkdir -p /tmp/homebrew-cpool/Formula + cp packaging/homebrew/cpool.rb /tmp/homebrew-cpool/Formula/cpool.rb + git -C /tmp/homebrew-cpool init + git -C /tmp/homebrew-cpool -c user.email="ci@ci" -c user.name="CI" add Formula + git -C /tmp/homebrew-cpool -c user.email="ci@ci" -c user.name="CI" commit -m "init" + brew tap local/cpool /tmp/homebrew-cpool + + - name: Check formula style + run: brew style local/cpool/cpool diff --git a/.github/workflows/winget-releaser.yml b/.github/workflows/winget-releaser.yml new file mode 100644 index 0000000..6288cf2 --- /dev/null +++ b/.github/workflows/winget-releaser.yml @@ -0,0 +1,15 @@ +name: Winget Release + +on: + release: + types: [published] + +jobs: + winget: + runs-on: windows-latest + steps: + - uses: vedantmgoyal9/winget-releaser@v2 + with: + identifier: PiersSinclair.CardPool + installers-regex: 'cpool-win-(x64|arm64)\.zip$' + token: ${{ secrets.WINGET_TOKEN }} diff --git a/CLAUDE.md b/CLAUDE.md index cbf3d39..ba8561a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -96,16 +96,89 @@ dotnet test tests/CardPool.Tests ## Distribution -The CLI is packaged as both a **.NET Global Tool** and a **self-contained single-file executable**. +The CLI is distributed via **.NET Global Tool** (NuGet), **winget**, **Homebrew**, and **self-contained single-file executables**. -### Global Tool +### GitHub Releases (automated) + +Merging a `` bump in `CardPool.Cli.csproj` to `main` triggers `release.yml`, which: +1. Checks whether a GitHub Release for that version already exists — skips everything if so +2. Cross-compiles all five platform binaries from ubuntu-latest +3. Creates a GitHub Release tagged `v` with the zips attached +4. Pushes the NuGet package to nuget.org + +``` +cpool-win-x64.zip, cpool-win-arm64.zip, cpool-osx-arm64.zip, cpool-osx-x64.zip, cpool-linux-x64.zip +``` + +After the GitHub Release is published, two dependent workflows fire automatically: +- `winget-releaser.yml` — submits a PR to `microsoft/winget-pkgs` (requires `WINGET_TOKEN` secret) +- `homebrew-releaser.yml` — updates `Formula/cpool.rb` in `piers-sinclair/homebrew-cpool` (requires `HOMEBREW_TAP_TOKEN` secret) + +`release.yml` also accepts `workflow_dispatch` for manual re-runs. + +### Global Tool (NuGet) + +Published to nuget.org as part of `release.yml` (consolidated — no separate publish workflow). PackageId is `CardPool`, command is `cpool`. ```bash dotnet pack src/CardPool.Cli -c Release -o dist/ dotnet tool install -g CardPool --add-source dist/ ``` -The `.nupkg` is produced by `true` in the csproj. PackageId is `CardPool`, command is `cpool`. +The `.nupkg` is produced by `true` in the csproj. + +### winget (Windows) + +Reference manifests live in `packaging/winget/manifests/p/PiersSinclair/CardPool//`. The `winget-releaser.yml` workflow auto-submits the real manifests (with computed SHA256 hashes) to `microsoft/winget-pkgs` on each release. + +Package identifier: `PiersSinclair.CardPool` — installer type `zip` with nested `portable` exe, adds `cpool` to PATH. + +### Homebrew (macOS + Linux) + +`packaging/homebrew/cpool.rb` in this repo is the **single source of truth** for the formula. Never edit `piers-sinclair/homebrew-cpool` directly. + +On each release, `homebrew-releaser.yml`: +1. Checks out both this repo and the tap repo +2. Copies `packaging/homebrew/cpool.rb` wholesale into `tap/Formula/cpool.rb` +3. Stamps in the real SHA256 hashes computed from the published zip downloads +4. Commits and pushes to `piers-sinclair/homebrew-cpool` + +To change anything about the formula (install logic, description, test, URL pattern) — edit `packaging/homebrew/cpool.rb` here and merge. The tap is updated automatically on the next release. + +```bash +brew tap piers-sinclair/cpool +brew install cpool +``` + +### Release secrets + +Three secrets are required for the automated release pipeline. All are set at: +**https://github.com/piers-sinclair/cardpool/settings/secrets/actions** + +| Secret | Used by | Expires | +|--------|---------|---------| +| `NUGET_API_KEY` | `release.yml` → NuGet push | Check nuget.org | +| `WINGET_TOKEN` | `winget-releaser.yml` → PR on microsoft/winget-pkgs | When PAT expires | +| `HOMEBREW_TAP_TOKEN` | `homebrew-releaser.yml` → push to piers-sinclair/homebrew-cpool | When PAT expires | + +**Renewing `NUGET_API_KEY`** +1. Go to **https://www.nuget.org/account/apikeys** +2. Find the existing key → **Regenerate** (or **Create** a new one scoped to `CardPool`) +3. Copy the new value → update the secret at the Actions secrets page above + +**Renewing `WINGET_TOKEN`** +1. Go to **https://github.com/settings/tokens** (classic tokens) +2. Find `winget-releaser` → **Regenerate** (keep scope: `public_repo` only) +3. Copy the new value → update the secret + +**Renewing `HOMEBREW_TAP_TOKEN`** +1. Go to **https://github.com/settings/personal-access-tokens** (fine-grained tokens) +2. Find `homebrew-tap-releaser` → **Regenerate** + - Repository access: `homebrew-cpool` only + - Permission: **Contents** → Read and write +3. Copy the new value → update the secret + +If a release workflow fails with a 401/403 error, an expired secret is the most likely cause — check the expiry dates before debugging further. ### Self-contained executables diff --git a/README.md b/README.md index 2dfcd23..676a48a 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,26 @@ cpool --help To update: `dotnet tool update -g CardPool` To remove: `dotnet tool uninstall -g CardPool` -### Option B — Self-contained executable (no .NET required) +### Option B — winget (Windows) + +```powershell +winget install PiersSinclair.CardPool +``` + +To update: `winget upgrade PiersSinclair.CardPool` +To remove: `winget uninstall PiersSinclair.CardPool` + +### Option C — Homebrew (macOS + Linux) + +```bash +brew tap piers-sinclair/cpool +brew install cpool +``` + +To update: `brew upgrade cpool` +To remove: `brew uninstall cpool && brew untap piers-sinclair/cpool` + +### Option D — Self-contained executable (direct download) Download the latest zip for your platform from the [Releases](https://github.com/piers-sinclair/cardpool/releases) page: @@ -48,7 +67,7 @@ Download the latest zip for your platform from the [Releases](https://github.com To uninstall — Windows: run `uninstall.ps1`; macOS/Linux: run `bash uninstall.sh`. -### Option C — Run from source +### Option E — Run from source ```bash git clone https://github.com/piers-sinclair/cardpool @@ -126,6 +145,10 @@ cpool --version # show installed version - [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0) +### Releasing + +See [RELEASING.md](RELEASING.md) for the full release process, including how to renew the NuGet, winget, and Homebrew secrets. + ### Run from source ```bash diff --git a/RELEASING.md b/RELEASING.md new file mode 100644 index 0000000..573568f --- /dev/null +++ b/RELEASING.md @@ -0,0 +1,79 @@ +# Releasing + +CardPool is distributed via NuGet, winget, Homebrew, and GitHub Releases. The entire pipeline is automated — the only manual step is bumping the version number. + +## How to release + +1. Update `` in `src/CardPool.Cli/CardPool.Cli.csproj` +2. Commit and merge to `main` + +That's it. The pipeline detects the version change and handles everything else automatically. + +## What happens automatically + +Merging a version bump triggers `release.yml`, which: + +1. Checks if a GitHub Release for that version already exists — skips if so (safe to re-run) +2. Cross-compiles all five platform binaries +3. Creates a GitHub Release tagged `v` with the binaries attached +4. Pushes the NuGet package to nuget.org + +Once the GitHub Release is published, two further workflows fire: + +- **`winget-releaser.yml`** — opens a pull request on [microsoft/winget-pkgs](https://github.com/microsoft/winget-pkgs) with the correct installer manifest and real SHA256 hashes. Microsoft's bot reviews and merges this within a few days, after which `winget install PiersSinclair.CardPool` works. +- **`homebrew-releaser.yml`** — copies the formula template from `packaging/homebrew/cpool.rb`, stamps in real SHA256 hashes, and pushes to the [piers-sinclair/homebrew-cpool](https://github.com/piers-sinclair/homebrew-cpool) tap. `brew install cpool` works immediately after. + +## Post-release verification + +Homebrew is verified automatically: `smoke-test.yml` runs after `homebrew-releaser.yml` and installs `cpool` from the tap on both macOS and Linux. + +Winget requires a manual check once the winget-pkgs PR is merged: + +1. Go to **Actions → Package Manager Smoke Test → Run workflow** +2. Tick **"Test winget install"** and run +3. Confirm the job passes + +## Required secrets + +All three secrets are set at **https://github.com/piers-sinclair/cardpool/settings/secrets/actions**. + +| Secret | Used by | What it needs | +|--------|---------|---------------| +| `NUGET_API_KEY` | NuGet push | API key scoped to the `CardPool` package | +| `WINGET_TOKEN` | winget PR submission | Classic PAT — `public_repo` scope only | +| `HOMEBREW_TAP_TOKEN` | Homebrew tap push | Fine-grained PAT — `homebrew-cpool` repo, Contents read/write | + +### Renewing `NUGET_API_KEY` + +1. Go to **https://www.nuget.org/account/apikeys** +2. Find the existing key → **Regenerate** (or create a new one scoped to `CardPool`) +3. Paste the new value into the `NUGET_API_KEY` secret + +### Renewing `WINGET_TOKEN` + +1. Go to **https://github.com/settings/tokens** (classic tokens) +2. Find `winget-releaser` → **Regenerate**, keeping scope: `public_repo` only +3. Paste the new value into the `WINGET_TOKEN` secret + +### Renewing `HOMEBREW_TAP_TOKEN` + +1. Go to **https://github.com/settings/personal-access-tokens** (fine-grained tokens) +2. Find `homebrew-tap-releaser` → **Regenerate** + - Repository access: `homebrew-cpool` only + - Permission: **Contents** → Read and write +3. Paste the new value into the `HOMEBREW_TAP_TOKEN` secret + +> If a release workflow fails with a 401 or 403 error, an expired secret is the most likely cause. + +## Homebrew formula + +`packaging/homebrew/cpool.rb` in this repository is the **single source of truth** for the Homebrew formula. Never edit [piers-sinclair/homebrew-cpool](https://github.com/piers-sinclair/homebrew-cpool) directly. + +On each release, `homebrew-releaser.yml` copies the full formula file from this repo into the tap and replaces the placeholder SHA256 values with real hashes. Any change to the formula — description, install logic, test, URL pattern — belongs in `packaging/homebrew/cpool.rb` here and takes effect on the next release. + +## Packaging reference files + +| Path | Purpose | +|------|---------| +| `packaging/homebrew/cpool.rb` | Homebrew formula template (source of truth) | +| `packaging/winget/manifests/…/` | Winget manifest reference for the current version — the `winget-releaser` action generates the real submission automatically | diff --git a/packaging/homebrew/cpool.rb b/packaging/homebrew/cpool.rb new file mode 100644 index 0000000..5d1d566 --- /dev/null +++ b/packaging/homebrew/cpool.rb @@ -0,0 +1,25 @@ +class Cpool < Formula + desc "Card pool generator originally built for the 25 Format — discord.gg/wDXgNHukb" + homepage "https://github.com/piers-sinclair/cardpool" + version "1.2.2" + license "MIT" + + if OS.mac? && Hardware::CPU.arm? + url "https://github.com/piers-sinclair/cardpool/releases/download/v#{version}/cpool-osx-arm64.zip" + sha256 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + elsif OS.mac? + url "https://github.com/piers-sinclair/cardpool/releases/download/v#{version}/cpool-osx-x64.zip" + sha256 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + else + url "https://github.com/piers-sinclair/cardpool/releases/download/v#{version}/cpool-linux-x64.zip" + sha256 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + end + + def install + bin.install "cpool" + end + + test do + assert_match version.to_s, shell_output("#{bin}/cpool --version") + end +end diff --git a/packaging/winget/manifests/p/PiersSinclair/CardPool/1.2.2/PiersSinclair.CardPool.installer.yaml b/packaging/winget/manifests/p/PiersSinclair/CardPool/1.2.2/PiersSinclair.CardPool.installer.yaml new file mode 100644 index 0000000..367e790 --- /dev/null +++ b/packaging/winget/manifests/p/PiersSinclair/CardPool/1.2.2/PiersSinclair.CardPool.installer.yaml @@ -0,0 +1,18 @@ +# yaml-language-server: $schema=https://aka.ms/winget-manifest.installer.1.9.0.schema.json +PackageIdentifier: PiersSinclair.CardPool +PackageVersion: 1.2.2 +InstallerLocale: en-US +InstallerType: zip +NestedInstallerType: portable +NestedInstallerFiles: + - RelativeFilePath: cpool.exe + PortableCommandAlias: cpool +Installers: + - Architecture: x64 + InstallerUrl: https://github.com/piers-sinclair/cardpool/releases/download/v1.2.2/cpool-win-x64.zip + InstallerSha256: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + - Architecture: arm64 + InstallerUrl: https://github.com/piers-sinclair/cardpool/releases/download/v1.2.2/cpool-win-arm64.zip + InstallerSha256: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +ManifestType: installer +ManifestVersion: 1.9.0 diff --git a/packaging/winget/manifests/p/PiersSinclair/CardPool/1.2.2/PiersSinclair.CardPool.locale.en-US.yaml b/packaging/winget/manifests/p/PiersSinclair/CardPool/1.2.2/PiersSinclair.CardPool.locale.en-US.yaml new file mode 100644 index 0000000..89b2c77 --- /dev/null +++ b/packaging/winget/manifests/p/PiersSinclair/CardPool/1.2.2/PiersSinclair.CardPool.locale.en-US.yaml @@ -0,0 +1,22 @@ +# yaml-language-server: $schema=https://aka.ms/winget-manifest.defaultLocale.1.9.0.schema.json +PackageIdentifier: PiersSinclair.CardPool +PackageVersion: 1.2.2 +PackageLocale: en-US +Publisher: Piers Sinclair +PublisherUrl: https://github.com/piers-sinclair +PackageName: CardPool +PackageUrl: https://github.com/piers-sinclair/cardpool +License: MIT +LicenseUrl: https://github.com/piers-sinclair/cardpool/blob/main/LICENSE +ShortDescription: Card pool generator originally built for the 25 Format — join the community at discord.gg/wDXgNHukb +Description: |- + CardPool fetches card data from YGOProDeck, enriches it with errata history from Yugipedia, + applies configurable word-count rules, and exports eligible card pools to Excel/CSV. + Originally built for the 25 Format trading card game community — join us at https://discord.gg/wDXgNHukb. +Tags: + - tcg + - card-pool + - cli + - 25-format +ManifestType: defaultLocale +ManifestVersion: 1.9.0 diff --git a/packaging/winget/manifests/p/PiersSinclair/CardPool/1.2.2/PiersSinclair.CardPool.yaml b/packaging/winget/manifests/p/PiersSinclair/CardPool/1.2.2/PiersSinclair.CardPool.yaml new file mode 100644 index 0000000..ec1ab69 --- /dev/null +++ b/packaging/winget/manifests/p/PiersSinclair/CardPool/1.2.2/PiersSinclair.CardPool.yaml @@ -0,0 +1,6 @@ +# yaml-language-server: $schema=https://aka.ms/winget-manifest.version.1.9.0.schema.json +PackageIdentifier: PiersSinclair.CardPool +PackageVersion: 1.2.2 +DefaultLocale: en-US +ManifestType: version +ManifestVersion: 1.9.0