7272 # A nightly is a prerelease of the NEXT patch, so it sorts ABOVE the last
7373 # stable, not below it: 0.0.35 stable -> 0.0.36-beta.<run> (NOT
7474 # 0.0.35-beta.<run>, which semver ranks BELOW 0.0.35 and would read as a
75- # downgrade). electron-builder turns the -beta suffix into the `beta`
76- # channel (beta-mac.yml) automatically. No commit.
75+ # downgrade). The -beta suffix marks the GitHub release as a prerelease;
76+ # the update feed itself is always latest-mac.yml (no publish.channel set).
77+ # No commit.
7778 BASE=$(node -p "require('./package.json').version")
7879 BASE=${BASE%%-*}
7980 NEXT=$(node -e "const p='$BASE'.split('.').map(Number); console.log(p[0]+'.'+p[1]+'.'+(p[2]+1))")
@@ -94,12 +95,17 @@ jobs:
9495 with :
9596 ref : ${{ needs.version.outputs.sha }} # the exact bumped commit
9697 fetch-depth : 0
97- lfs :
98- true # resources/bin/* (llama-server, sd-cli, whisper, ffmpeg, dylibs)
99- # are Git LFS — without this CI bundles pointer stubs and every
100- # runtime spawn fails with ENOEXEC.
101- - name : Pull LFS binaries
102- run : git lfs pull
98+ lfs : false # Smudge nothing on checkout; pull only the shipped, non-rebuilt
99+ # binaries below. Fetching everything (~200 MB) blew the org's monthly LFS
100+ # bandwidth budget and failed the release checkout ("exceeded its LFS budget").
101+ - name : Pull shipped LFS binaries (skip the ones rebuilt below)
102+ # resources/bin/{ffmpeg,text-extractor,sd/**,LICENSE} are prebuilt and shipped
103+ # as-is, so they MUST be real files — a pointer stub spawns as ENOEXEC at runtime.
104+ # llama/ + whisper/ are excluded because build-llama.sh / build-whisper-cli.sh
105+ # recompile them from source in place later in this job, so pulling the committed
106+ # copies is wasted bandwidth. The packaged-helper probe (ffmpeg/sd/whisper/llama)
107+ # fails the release if any shipped binary is missing, so a bad exclude can't ship.
108+ run : git lfs pull --exclude="resources/bin/llama,resources/bin/whisper"
103109 # Rebuild the chat engine from source with a PINNED macOS deployment target.
104110 # The committed/LFS llama-server is minos 26 (built on a macOS-26 toolchain),
105111 # so it only launches on macOS 26 — every macOS 13/14/15 user saw "Chat model
@@ -173,7 +179,8 @@ jobs:
173179 # Stamp the resolved version into package.json so electron-builder picks the
174180 # right channel. For stable this matches the committed bump (no-op); for beta
175181 # it applies the -beta.<run> version (no commit needed — this checkout is
176- # throwaway). The -beta suffix is what makes electron-builder write beta-mac.yml.
182+ # throwaway). The -beta suffix marks the release prerelease; the feed stays
183+ # latest-mac.yml (electron-builder emits no beta-mac.yml without publish.channel).
177184 - name : Stamp build version
178185 run : npm version "${{ needs.version.outputs.version }}" --no-git-tag-version --allow-same-version
179186 - name : Build (typecheck + bundle)
@@ -223,11 +230,15 @@ jobs:
223230 CHANNEL : ${{ needs.version.outputs.channel }}
224231 TARGET_SHA : ${{ needs.version.outputs.sha }}
225232 run : |
226- if [ "$CHANNEL" = stable ]; then
227- FEED=latest-mac.yml
228- else
229- FEED=beta-mac.yml
230- fi
233+ # electron-builder writes ONE update feed, latest-mac.yml, for BOTH channels
234+ # (we set no publish.channel, so it never emits beta-mac.yml). Beta vs stable
235+ # is expressed by the release's prerelease flag + electron-updater's
236+ # allowPrerelease on the client, NOT by a distinct feed filename — every
237+ # shipped beta used latest-mac.yml (e.g. 0.0.39-beta.66), and the pro-mac.yml
238+ # migration below copies from latest-mac.yml on the beta path too. A prior
239+ # refactor assumed a beta-mac.yml that is never generated, so `test -f` aborted
240+ # every nightly publish under `set -e` with no output.
241+ FEED=latest-mac.yml
231242 test -f "dist/$FEED"
232243 node scripts/prepare-mac-release-assets.mjs \
233244 "dist/$FEED" dist dist/release-assets "$VERSION"
0 commit comments