Automate publishing the opt-in VST packs (CI), like the venue content-packs workflow
Problem
The opt-in VST-pack system shipped (rig #55, core #1025) but the three packs are not published: data/vst_packs.json still holds placeholders (bytes: 0, all-zero sha) for mac/win/linux, so the runtime gate correctly keeps the "download a simulated rig" path hidden. There is no automation to build and publish them — unlike career venue packs, which have .github/workflows/content-packs.yml in core (build → publish release → open a manifest-bump PR).
We need the equivalent for VST packs so a maintainer can publish (and re-version) them from the Actions tab instead of hand-running the tool and hand-editing hashes.
Why it's not a copy of the venue workflow
The venue workflow is trivial because everything is in core — media, tool, release, and manifest — so GITHUB_TOKEN suffices. The VST pieces are split across two repos:
| Piece |
Lives in |
Fat .vst3 binaries (the pack source) |
rig repo (committed by build-*-vst3.yml) |
content_packs.build_vst_pack (the slicer + --vst CLI) |
core (got-feedBack/feedBack) |
data/vst_packs.json (manifest to bump) |
rig repo |
| Release URLs the manifest currently points at |
core (…/feedBack/releases/download/vst-<plat>-v1/…) |
Because the binaries live in rig but the releases are configured for core, publishing forces exactly one cross-repo write no matter where the workflow runs — and cross-repo writes need a PAT, not the free GITHUB_TOKEN.
Proposed fix (recommended): host the VST packs as rig-repo releases
The binaries already live in rig, so hosting the releases there too collapses the cross-repo problem — the same rationale that put venue packs + their workflow in core ("host where the media and manifest live"). Everything becomes same-repo, GITHUB_TOKEN-only, no PAT.
Add .github/workflows/vst-packs.yml in the rig repo (workflow_dispatch, inputs version default 1), which:
- Checks out the rig repo (fat
.vst3 bundles present in-tree).
- Fetches
tools/content_packs.py from core at a pinned ref (public, read-only — curl the raw file or a sparse checkout).
- Runs
python content_packs.py <vst_root> --vst --version N --publish --repo <this-rig-repo> --manifest /tmp/vst-manifest.json → builds the three per-platform slices and uploads them as immutable vst-<plat>-v<N> releases in the rig repo.
- Rewrites
data/vst_packs.json url/sha256/bytes from the manifest and opens a bump PR (peter-evans/create-pull-request), mirroring content-packs.yml.
Small prerequisite changes:
- core
tools/content_packs.py: add a --repo CLI flag (default got-feedBack/feedBack, so the venue path is unchanged) and thread it to both call sites in the --vst branch — the upload target and the URL written into the manifest:
# today both default to REPO (core); they MUST use the same repo:
_publish_release(vst_tag(plat, v), zip_path, title, notes, repo=args.repo)
url = vst_url(plat, v, repo=args.repo)
This is the load-bearing detail: the asset is downloaded from whatever vst_url() emits into data/vst_packs.json, so if --repo reaches _publish_release but not vst_url (or vice-versa), the manifest points where the asset isn't and every client download 404s. _publish_release/vst_url already accept repo=; only main()'s --vst branch passes neither today.
- rig
data/vst_packs.json: the three URLs are rewritten from the tool's manifest on each publish, so once --repo reaches vst_url they self-correct to the chosen host. Still flip the committed placeholders got-feedBack/feedBack/releases/… → got-feedBack/feedBack-plugin-rig-builder/releases/… up front so the intended download location is correct in-tree even before the first run.
Alternative: keep releases in core (needs a PAT)
Run the workflow in either repo but publish to core; whichever repo it runs from, it needs a PAT with write scope on the other repo (release-upload on core, or the manifest-bump PR on rig) stored as a repo secret. More moving parts and a maintainer secret to rotate — only worth it if there's a reason to keep all release assets under core.
Acceptance criteria
Related
Automate publishing the opt-in VST packs (CI), like the venue content-packs workflow
Problem
The opt-in VST-pack system shipped (rig #55, core #1025) but the three packs are not published:
data/vst_packs.jsonstill holds placeholders (bytes: 0, all-zero sha) for mac/win/linux, so the runtime gate correctly keeps the "download a simulated rig" path hidden. There is no automation to build and publish them — unlike career venue packs, which have.github/workflows/content-packs.ymlin core (build → publish release → open a manifest-bump PR).We need the equivalent for VST packs so a maintainer can publish (and re-version) them from the Actions tab instead of hand-running the tool and hand-editing hashes.
Why it's not a copy of the venue workflow
The venue workflow is trivial because everything is in core — media, tool, release, and manifest — so
GITHUB_TOKENsuffices. The VST pieces are split across two repos:.vst3binaries (the pack source)build-*-vst3.yml)content_packs.build_vst_pack(the slicer +--vstCLI)got-feedBack/feedBack)data/vst_packs.json(manifest to bump)…/feedBack/releases/download/vst-<plat>-v1/…)Because the binaries live in rig but the releases are configured for core, publishing forces exactly one cross-repo write no matter where the workflow runs — and cross-repo writes need a PAT, not the free
GITHUB_TOKEN.Proposed fix (recommended): host the VST packs as rig-repo releases
The binaries already live in rig, so hosting the releases there too collapses the cross-repo problem — the same rationale that put venue packs + their workflow in core ("host where the media and manifest live"). Everything becomes same-repo,
GITHUB_TOKEN-only, no PAT.Add
.github/workflows/vst-packs.ymlin the rig repo (workflow_dispatch, inputsversiondefault1), which:.vst3bundles present in-tree).tools/content_packs.pyfrom core at a pinned ref (public, read-only —curlthe raw file or a sparse checkout).python content_packs.py <vst_root> --vst --version N --publish --repo <this-rig-repo> --manifest /tmp/vst-manifest.json→ builds the three per-platform slices and uploads them as immutablevst-<plat>-v<N>releases in the rig repo.data/vst_packs.jsonurl/sha256/bytes from the manifest and opens a bump PR (peter-evans/create-pull-request), mirroringcontent-packs.yml.Small prerequisite changes:
tools/content_packs.py: add a--repoCLI flag (defaultgot-feedBack/feedBack, so the venue path is unchanged) and thread it to both call sites in the--vstbranch — the upload target and the URL written into the manifest:vst_url()emits intodata/vst_packs.json, so if--reporeaches_publish_releasebut notvst_url(or vice-versa), the manifest points where the asset isn't and every client download 404s._publish_release/vst_urlalready acceptrepo=; onlymain()'s--vstbranch passes neither today.data/vst_packs.json: the three URLs are rewritten from the tool's manifest on each publish, so once--reporeachesvst_urlthey self-correct to the chosen host. Still flip the committed placeholdersgot-feedBack/feedBack/releases/…→got-feedBack/feedBack-plugin-rig-builder/releases/…up front so the intended download location is correct in-tree even before the first run.Alternative: keep releases in core (needs a PAT)
Run the workflow in either repo but publish to core; whichever repo it runs from, it needs a PAT with write scope on the other repo (release-upload on core, or the manifest-bump PR on rig) stored as a repo secret. More moving parts and a maintainer secret to rotate — only worth it if there's a reason to keep all release assets under core.
Acceptance criteria
GITHUB_TOKENonly (recommended path).vst-<plat>-v<N>releases and opens avst_packs.jsonbump PR with real sha256/bytes.vst_packs.jsonresolves to the release the workflow actually uploaded to (same host/tag/asset) — i.e.--reporeached both_publish_releaseandvst_url. Guard it with a test assertingvst_url(plat, v, repo=r)matches the upload target for the samer.bytes>0gate flips) and a client download sha-verifies end-to-end.content-packs.ymlpath is unaffected by the--repoflag.Related
build_vst_pack+--vst), rig test(vst): make the VST-pack download test runnable + add a test CI #57 (VST download test + CI)..github/workflows/content-packs.yml(venue packs).