From 31658df49ef6198c763e0a2842ab9b6f7e1f1267 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:00:11 +1000 Subject: [PATCH 01/24] ci: use bun baseline build to avoid segfaults --- .github/actions/setup-bun/action.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index 20d53e81e8c..c1a21e65714 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -11,10 +11,18 @@ runs: restore-keys: | ${{ runner.os }}-bun- + - name: Get baseline download URL + id: bun-url + shell: bash + run: | + V=$(node -p "require('./package.json').packageManager.split('@')[1]") + OS=$(echo "$RUNNER_OS" | tr '[:upper:]' '[:lower:]') + echo "url=https://bun.sh/download/${V}/${OS}/x64?avx2=false&profile=false" >> "$GITHUB_OUTPUT" + - name: Setup Bun uses: oven-sh/setup-bun@v2 with: - bun-version-file: package.json + bun-download-url: ${{ steps.bun-url.outputs.url }} - name: Install dependencies run: bun install From ec4c39547d4870d5b49f281c2130c062a8968caf Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:07:21 +1000 Subject: [PATCH 02/24] ci: map macOS to darwin in bun download URL --- .github/actions/setup-bun/action.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index c1a21e65714..45796338636 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -16,7 +16,11 @@ runs: shell: bash run: | V=$(node -p "require('./package.json').packageManager.split('@')[1]") - OS=$(echo "$RUNNER_OS" | tr '[:upper:]' '[:lower:]') + case "$RUNNER_OS" in + macOS) OS=darwin ;; + Linux) OS=linux ;; + Windows) OS=windows ;; + esac echo "url=https://bun.sh/download/${V}/${OS}/x64?avx2=false&profile=false" >> "$GITHUB_OUTPUT" - name: Setup Bun From c31a335a8f3fad5843dce329c29080a675d4253a Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:10:54 +1000 Subject: [PATCH 03/24] ci: only use baseline for x64 runners, let ARM64 use default --- .github/actions/setup-bun/action.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index 45796338636..47267775c01 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -15,17 +15,20 @@ runs: id: bun-url shell: bash run: | - V=$(node -p "require('./package.json').packageManager.split('@')[1]") - case "$RUNNER_OS" in - macOS) OS=darwin ;; - Linux) OS=linux ;; - Windows) OS=windows ;; - esac - echo "url=https://bun.sh/download/${V}/${OS}/x64?avx2=false&profile=false" >> "$GITHUB_OUTPUT" + if [ "$RUNNER_ARCH" = "X64" ]; then + V=$(node -p "require('./package.json').packageManager.split('@')[1]") + case "$RUNNER_OS" in + macOS) OS=darwin ;; + Linux) OS=linux ;; + Windows) OS=windows ;; + esac + echo "url=https://bun.sh/download/${V}/${OS}/x64?avx2=false&profile=false" >> "$GITHUB_OUTPUT" + fi - name: Setup Bun uses: oven-sh/setup-bun@v2 with: + bun-version-file: ${{ !steps.bun-url.outputs.url && 'package.json' || '' }} bun-download-url: ${{ steps.bun-url.outputs.url }} - name: Install dependencies From 66c4eb3ad5c51acec6771c10e06cb960893dfdac Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:24:26 +1000 Subject: [PATCH 04/24] ci: downgrade bun to 1.3.8 for working baseline support --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2e7c1172aa6..870c6ce329b 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "AI-powered development tool", "private": true, "type": "module", - "packageManager": "bun@1.3.9", + "packageManager": "bun@1.3.8", "scripts": { "dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts", "dev:desktop": "bun --cwd packages/desktop tauri dev", @@ -23,7 +23,7 @@ "packages/slack" ], "catalog": { - "@types/bun": "1.3.9", + "@types/bun": "1.3.8", "@octokit/rest": "22.0.0", "@hono/zod-validator": "0.4.2", "ulid": "3.0.1", From 587deef95d7f36197cb0c5f20a68311880e9bd10 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:29:56 +1000 Subject: [PATCH 05/24] ci: use GitHub release URLs for baseline (bun.sh ignores avx2 on Windows) --- .github/actions/setup-bun/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index 47267775c01..6c632f7e072 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -22,7 +22,7 @@ runs: Linux) OS=linux ;; Windows) OS=windows ;; esac - echo "url=https://bun.sh/download/${V}/${OS}/x64?avx2=false&profile=false" >> "$GITHUB_OUTPUT" + echo "url=https://github.com/oven-sh/bun/releases/download/bun-v${V}/bun-${OS}-x64-baseline.zip" >> "$GITHUB_OUTPUT" fi - name: Setup Bun From 9ae32d1c1a1cdbff012fee12a6e719b642b12706 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:30:36 +1000 Subject: [PATCH 06/24] ci: revert bun to 1.3.9 (baseline now uses GitHub release URLs) --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 870c6ce329b..2e7c1172aa6 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "AI-powered development tool", "private": true, "type": "module", - "packageManager": "bun@1.3.8", + "packageManager": "bun@1.3.9", "scripts": { "dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts", "dev:desktop": "bun --cwd packages/desktop tauri dev", @@ -23,7 +23,7 @@ "packages/slack" ], "catalog": { - "@types/bun": "1.3.8", + "@types/bun": "1.3.9", "@octokit/rest": "22.0.0", "@hono/zod-validator": "0.4.2", "ulid": "3.0.1", From ce4a2d0d1ef667d30974b68b41b0c682d49b9299 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:37:06 +1000 Subject: [PATCH 07/24] ci: downgrade bun to 1.3.8 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2e7c1172aa6..870c6ce329b 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "AI-powered development tool", "private": true, "type": "module", - "packageManager": "bun@1.3.9", + "packageManager": "bun@1.3.8", "scripts": { "dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts", "dev:desktop": "bun --cwd packages/desktop tauri dev", @@ -23,7 +23,7 @@ "packages/slack" ], "catalog": { - "@types/bun": "1.3.9", + "@types/bun": "1.3.8", "@octokit/rest": "22.0.0", "@hono/zod-validator": "0.4.2", "ulid": "3.0.1", From 02c0e9604fe5d44af6d7cb9de9bd37e5acbf1855 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:40:54 +1000 Subject: [PATCH 08/24] ci: downgrade bun to 1.3.5 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 870c6ce329b..30376f6698c 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "AI-powered development tool", "private": true, "type": "module", - "packageManager": "bun@1.3.8", + "packageManager": "bun@1.3.5", "scripts": { "dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts", "dev:desktop": "bun --cwd packages/desktop tauri dev", @@ -23,7 +23,7 @@ "packages/slack" ], "catalog": { - "@types/bun": "1.3.8", + "@types/bun": "1.3.5", "@octokit/rest": "22.0.0", "@hono/zod-validator": "0.4.2", "ulid": "3.0.1", From bf57596aea059965c443bbe8c0c048d385ccdb0c Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:46:25 +1000 Subject: [PATCH 09/24] ci: upgrade to bun canary --- .github/actions/setup-bun/action.yml | 7 ++++++- package.json | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index 6c632f7e072..6bd4f3e9cde 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -22,7 +22,12 @@ runs: Linux) OS=linux ;; Windows) OS=windows ;; esac - echo "url=https://github.com/oven-sh/bun/releases/download/bun-v${V}/bun-${OS}-x64-baseline.zip" >> "$GITHUB_OUTPUT" + if [ "$V" = "canary" ]; then + TAG=canary + else + TAG="bun-v${V}" + fi + echo "url=https://github.com/oven-sh/bun/releases/download/${TAG}/bun-${OS}-x64-baseline.zip" >> "$GITHUB_OUTPUT" fi - name: Setup Bun diff --git a/package.json b/package.json index 30376f6698c..0e02e6b755a 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "AI-powered development tool", "private": true, "type": "module", - "packageManager": "bun@1.3.5", + "packageManager": "bun@canary", "scripts": { "dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts", "dev:desktop": "bun --cwd packages/desktop tauri dev", From 13973dd192c80ff766c39ffc4ecb8a5ef647272c Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:48:46 +1000 Subject: [PATCH 10/24] ci: use canary baseline build directly from GitHub releases --- .github/actions/setup-bun/action.yml | 8 +------- package.json | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index 6bd4f3e9cde..3df4d9e692a 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -16,18 +16,12 @@ runs: shell: bash run: | if [ "$RUNNER_ARCH" = "X64" ]; then - V=$(node -p "require('./package.json').packageManager.split('@')[1]") case "$RUNNER_OS" in macOS) OS=darwin ;; Linux) OS=linux ;; Windows) OS=windows ;; esac - if [ "$V" = "canary" ]; then - TAG=canary - else - TAG="bun-v${V}" - fi - echo "url=https://github.com/oven-sh/bun/releases/download/${TAG}/bun-${OS}-x64-baseline.zip" >> "$GITHUB_OUTPUT" + echo "url=https://github.com/oven-sh/bun/releases/download/canary/bun-${OS}-x64-baseline.zip" >> "$GITHUB_OUTPUT" fi - name: Setup Bun diff --git a/package.json b/package.json index 0e02e6b755a..9a71cfcc445 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "AI-powered development tool", "private": true, "type": "module", - "packageManager": "bun@canary", + "packageManager": "bun@1.3.9", "scripts": { "dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts", "dev:desktop": "bun --cwd packages/desktop tauri dev", From b0a7dfeb63f35fc4baba39dd9b06158ef7f57315 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:52:41 +1000 Subject: [PATCH 11/24] ci: restore @types/bun to 1.3.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9a71cfcc445..2e7c1172aa6 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "packages/slack" ], "catalog": { - "@types/bun": "1.3.5", + "@types/bun": "1.3.9", "@octokit/rest": "22.0.0", "@hono/zod-validator": "0.4.2", "ulid": "3.0.1", From d250de632c695d1c755c12cb6d4c50deed363e43 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:02:46 +1000 Subject: [PATCH 12/24] ci: default to --single build in CI to avoid canary cross-compile failures --- packages/opencode/script/build.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opencode/script/build.ts b/packages/opencode/script/build.ts index 34e80d71a08..3de0da1050a 100755 --- a/packages/opencode/script/build.ts +++ b/packages/opencode/script/build.ts @@ -56,7 +56,7 @@ const migrations = await Promise.all( ) console.log(`Loaded ${migrations.length} migrations`) -const singleFlag = process.argv.includes("--single") +const singleFlag = process.argv.includes("--single") || (!!process.env.CI && !process.argv.includes("--all")) const baselineFlag = process.argv.includes("--baseline") const skipInstall = process.argv.includes("--skip-install") From 61547f47865b5933a33f19f16e1723bc9471b18a Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:11:37 +1000 Subject: [PATCH 13/24] ci: override cross-compile tarball URL for canary builds --- packages/opencode/script/build.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/opencode/script/build.ts b/packages/opencode/script/build.ts index 3de0da1050a..b58bf53370f 100755 --- a/packages/opencode/script/build.ts +++ b/packages/opencode/script/build.ts @@ -60,6 +60,13 @@ const singleFlag = process.argv.includes("--single") || (!!process.env.CI && !pr const baselineFlag = process.argv.includes("--baseline") const skipInstall = process.argv.includes("--skip-install") +// Resolve canary npm version for cross-compilation tarball override +const canary = Bun.version.includes("canary") + ? await fetch("https://registry.npmjs.org/@oven/bun-linux-x64") + .then((r) => r.json()) + .then((d) => d["dist-tags"].canary as string) + : undefined + const allTargets: { os: string arch: "arm64" | "x64" @@ -161,6 +168,14 @@ for (const item of targets) { console.log(`building ${name}`) await $`mkdir -p dist/${name}/bin` + if (canary) { + const os = item.os === "win32" ? "windows" : item.os + const arch = item.arch === "arm64" ? "aarch64" : item.arch + const suffix = (item.abi ? `-${item.abi}` : "") + (item.avx2 === false ? "-baseline" : "") + const npmPkg = `bun-${os}-${arch}${suffix}` + process.env.BUN_COMPILE_TARGET_TARBALL_URL = `https://registry.npmjs.org/@oven/${npmPkg}/-/${npmPkg}-${canary}.tgz` + } + const parserWorker = fs.realpathSync(path.resolve(dir, "./node_modules/@opentui/core/parser.worker.js")) const workerPath = "./src/cli/cmd/tui/worker.ts" From fe0c3ca825bb7848bac90bc9259c319fcd31257a Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:14:05 +1000 Subject: [PATCH 14/24] ci: remove --single CI default now that canary cross-compile is handled --- packages/opencode/script/build.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opencode/script/build.ts b/packages/opencode/script/build.ts index b58bf53370f..cbf27a50a03 100755 --- a/packages/opencode/script/build.ts +++ b/packages/opencode/script/build.ts @@ -56,7 +56,7 @@ const migrations = await Promise.all( ) console.log(`Loaded ${migrations.length} migrations`) -const singleFlag = process.argv.includes("--single") || (!!process.env.CI && !process.argv.includes("--all")) +const singleFlag = process.argv.includes("--single") const baselineFlag = process.argv.includes("--baseline") const skipInstall = process.argv.includes("--skip-install") From d9ee41a56e1871d73de7c5d3432b521d4fe0551c Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:26:55 +1000 Subject: [PATCH 15/24] ci: pre-cache canary cross-compile binaries via opt-in input --- .github/actions/setup-bun/action.yml | 33 ++++++++++++++++++++++++++++ .github/workflows/publish.yml | 2 ++ packages/opencode/script/build.ts | 15 ------------- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index 3df4d9e692a..3c639fb21c6 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -1,5 +1,10 @@ name: "Setup Bun" description: "Setup Bun with caching and install dependencies" +inputs: + cross-compile: + description: "Pre-cache canary cross-compile binaries for all targets" + required: false + default: "false" runs: using: "composite" steps: @@ -30,6 +35,34 @@ runs: bun-version-file: ${{ !steps.bun-url.outputs.url && 'package.json' || '' }} bun-download-url: ${{ steps.bun-url.outputs.url }} + - name: Pre-cache canary cross-compile binaries + if: inputs.cross-compile == 'true' + shell: bash + run: | + BUN_VERSION=$(bun --version) + if echo "$BUN_VERSION" | grep -q "canary"; then + SEMVER=$(echo "$BUN_VERSION" | grep -oP '^\d+\.\d+\.\d+') + CANARY_NPM=$(curl -sf https://registry.npmjs.org/@oven/bun-linux-x64 | node -p "JSON.parse(require('fs').readFileSync(0,'utf8'))['dist-tags'].canary") + CACHE_DIR="$HOME/.bun/install/cache" + mkdir -p "$CACHE_DIR" + for TARGET in linux-aarch64 linux-x64 linux-x64-baseline linux-aarch64-musl linux-x64-musl linux-x64-musl-baseline darwin-aarch64 darwin-x64 darwin-x64-baseline windows-x64 windows-x64-baseline; do + DEST="$CACHE_DIR/bun-${TARGET}-v${SEMVER}" + if [ -f "$DEST" ]; then + echo "Already cached: $DEST" + continue + fi + URL="https://registry.npmjs.org/@oven/bun-${TARGET}/-/bun-${TARGET}-${CANARY_NPM}.tgz" + echo "Downloading $TARGET..." + if curl -sfL "$URL" | tar xz --strip-components=2 -C "$CACHE_DIR" "package/bin/bun"; then + mv "$CACHE_DIR/bun" "$DEST" + chmod +x "$DEST" + echo "Cached: $DEST" + else + echo "Skipped: $TARGET (not available)" + fi + done + fi + - name: Install dependencies run: bun install shell: bash diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8d4c9038a7e..da8f1e8d9fa 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -77,6 +77,8 @@ jobs: fetch-tags: true - uses: ./.github/actions/setup-bun + with: + cross-compile: "true" - name: Setup git committer id: committer diff --git a/packages/opencode/script/build.ts b/packages/opencode/script/build.ts index cbf27a50a03..34e80d71a08 100755 --- a/packages/opencode/script/build.ts +++ b/packages/opencode/script/build.ts @@ -60,13 +60,6 @@ const singleFlag = process.argv.includes("--single") const baselineFlag = process.argv.includes("--baseline") const skipInstall = process.argv.includes("--skip-install") -// Resolve canary npm version for cross-compilation tarball override -const canary = Bun.version.includes("canary") - ? await fetch("https://registry.npmjs.org/@oven/bun-linux-x64") - .then((r) => r.json()) - .then((d) => d["dist-tags"].canary as string) - : undefined - const allTargets: { os: string arch: "arm64" | "x64" @@ -168,14 +161,6 @@ for (const item of targets) { console.log(`building ${name}`) await $`mkdir -p dist/${name}/bin` - if (canary) { - const os = item.os === "win32" ? "windows" : item.os - const arch = item.arch === "arm64" ? "aarch64" : item.arch - const suffix = (item.abi ? `-${item.abi}` : "") + (item.avx2 === false ? "-baseline" : "") - const npmPkg = `bun-${os}-${arch}${suffix}` - process.env.BUN_COMPILE_TARGET_TARBALL_URL = `https://registry.npmjs.org/@oven/${npmPkg}/-/${npmPkg}-${canary}.tgz` - } - const parserWorker = fs.realpathSync(path.resolve(dir, "./node_modules/@opentui/core/parser.worker.js")) const workerPath = "./src/cli/cmd/tui/worker.ts" From 9c50c06f90ea0be58d05025a69bfb3c2040908be Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:29:24 +1000 Subject: [PATCH 16/24] ci: default to --single in CI, publish passes --all --- .github/workflows/publish.yml | 2 +- packages/opencode/script/build.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index da8f1e8d9fa..cca7df5c4ed 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -90,7 +90,7 @@ jobs: - name: Build id: build run: | - ./packages/opencode/script/build.ts + ./packages/opencode/script/build.ts --all env: OPENCODE_VERSION: ${{ needs.version.outputs.version }} OPENCODE_RELEASE: ${{ needs.version.outputs.release }} diff --git a/packages/opencode/script/build.ts b/packages/opencode/script/build.ts index 34e80d71a08..3de0da1050a 100755 --- a/packages/opencode/script/build.ts +++ b/packages/opencode/script/build.ts @@ -56,7 +56,7 @@ const migrations = await Promise.all( ) console.log(`Loaded ${migrations.length} migrations`) -const singleFlag = process.argv.includes("--single") +const singleFlag = process.argv.includes("--single") || (!!process.env.CI && !process.argv.includes("--all")) const baselineFlag = process.argv.includes("--baseline") const skipInstall = process.argv.includes("--skip-install") From 5374245a5dc487b78af29d3f7709c368aaa34da4 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:30:30 +1000 Subject: [PATCH 17/24] ci: pass --all and cross-compile to sign-cli build --- .github/workflows/sign-cli.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sign-cli.yml b/.github/workflows/sign-cli.yml index d9d61fd800e..89176223176 100644 --- a/.github/workflows/sign-cli.yml +++ b/.github/workflows/sign-cli.yml @@ -20,10 +20,12 @@ jobs: fetch-tags: true - uses: ./.github/actions/setup-bun + with: + cross-compile: "true" - name: Build run: | - ./packages/opencode/script/build.ts + ./packages/opencode/script/build.ts --all - name: Upload unsigned Windows CLI id: upload_unsigned_windows_cli From f53a7c2a8256adc381eaba80a2c699928cbc694f Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:39:18 +1000 Subject: [PATCH 18/24] ci: fix non-portable grep -oP in pre-cache step --- .github/actions/setup-bun/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index 3c639fb21c6..96fe033ea4e 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -41,7 +41,7 @@ runs: run: | BUN_VERSION=$(bun --version) if echo "$BUN_VERSION" | grep -q "canary"; then - SEMVER=$(echo "$BUN_VERSION" | grep -oP '^\d+\.\d+\.\d+') + SEMVER=$(echo "$BUN_VERSION" | sed 's/^\([0-9]*\.[0-9]*\.[0-9]*\).*/\1/') CANARY_NPM=$(curl -sf https://registry.npmjs.org/@oven/bun-linux-x64 | node -p "JSON.parse(require('fs').readFileSync(0,'utf8'))['dist-tags'].canary") CACHE_DIR="$HOME/.bun/install/cache" mkdir -p "$CACHE_DIR" From 7f77bb16c71b12c1131bf7bed41a0e20e013a734 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:48:26 +1000 Subject: [PATCH 19/24] ci: add debug output and use bun instead of node for npm json parsing --- .github/actions/setup-bun/action.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index 96fe033ea4e..9f5253630b5 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -42,7 +42,9 @@ runs: BUN_VERSION=$(bun --version) if echo "$BUN_VERSION" | grep -q "canary"; then SEMVER=$(echo "$BUN_VERSION" | sed 's/^\([0-9]*\.[0-9]*\.[0-9]*\).*/\1/') - CANARY_NPM=$(curl -sf https://registry.npmjs.org/@oven/bun-linux-x64 | node -p "JSON.parse(require('fs').readFileSync(0,'utf8'))['dist-tags'].canary") + echo "Bun version: $BUN_VERSION (semver: $SEMVER)" + CANARY_NPM=$(curl -sf https://registry.npmjs.org/@oven/bun-linux-x64 | bun -e "process.stdout.write(JSON.parse(await Bun.stdin.text())['dist-tags'].canary)") + echo "Canary npm version: $CANARY_NPM" CACHE_DIR="$HOME/.bun/install/cache" mkdir -p "$CACHE_DIR" for TARGET in linux-aarch64 linux-x64 linux-x64-baseline linux-aarch64-musl linux-x64-musl linux-x64-musl-baseline darwin-aarch64 darwin-x64 darwin-x64-baseline windows-x64 windows-x64-baseline; do @@ -52,7 +54,7 @@ runs: continue fi URL="https://registry.npmjs.org/@oven/bun-${TARGET}/-/bun-${TARGET}-${CANARY_NPM}.tgz" - echo "Downloading $TARGET..." + echo "Downloading $TARGET from $URL" if curl -sfL "$URL" | tar xz --strip-components=2 -C "$CACHE_DIR" "package/bin/bun"; then mv "$CACHE_DIR/bun" "$DEST" chmod +x "$DEST" @@ -61,6 +63,8 @@ runs: echo "Skipped: $TARGET (not available)" fi done + else + echo "Not a canary build ($BUN_VERSION), skipping pre-cache" fi - name: Install dependencies From e08bdeb6561290cd32e22408f957cbd5e3c73dc6 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:51:50 +1000 Subject: [PATCH 20/24] ci: use bun --revision to detect canary (--version strips it) --- .github/actions/setup-bun/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index 9f5253630b5..0d9e0d8bfc6 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -39,7 +39,7 @@ runs: if: inputs.cross-compile == 'true' shell: bash run: | - BUN_VERSION=$(bun --version) + BUN_VERSION=$(bun --revision) if echo "$BUN_VERSION" | grep -q "canary"; then SEMVER=$(echo "$BUN_VERSION" | sed 's/^\([0-9]*\.[0-9]*\.[0-9]*\).*/\1/') echo "Bun version: $BUN_VERSION (semver: $SEMVER)" From 71eed6f2db71e5e37d090201d6248b855346fd8c Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:56:15 +1000 Subject: [PATCH 21/24] ci: handle bun.exe for Windows targets in pre-cache --- .github/actions/setup-bun/action.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index 0d9e0d8bfc6..f614896ab61 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -55,8 +55,13 @@ runs: fi URL="https://registry.npmjs.org/@oven/bun-${TARGET}/-/bun-${TARGET}-${CANARY_NPM}.tgz" echo "Downloading $TARGET from $URL" - if curl -sfL "$URL" | tar xz --strip-components=2 -C "$CACHE_DIR" "package/bin/bun"; then - mv "$CACHE_DIR/bun" "$DEST" + if echo "$TARGET" | grep -q "windows"; then + BIN_NAME="bun.exe" + else + BIN_NAME="bun" + fi + if curl -sfL "$URL" | tar xz --strip-components=2 -C "$CACHE_DIR" "package/bin/$BIN_NAME"; then + mv "$CACHE_DIR/$BIN_NAME" "$DEST" chmod +x "$DEST" echo "Cached: $DEST" else From 4285c50183486eb34e2ae296c9050e13c23abef1 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 12:00:36 +1000 Subject: [PATCH 22/24] ci: download cross-compile binaries from GitHub canary release (same version as running bun) --- .github/actions/setup-bun/action.yml | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index f614896ab61..fab136ad8d0 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -43,31 +43,33 @@ runs: if echo "$BUN_VERSION" | grep -q "canary"; then SEMVER=$(echo "$BUN_VERSION" | sed 's/^\([0-9]*\.[0-9]*\.[0-9]*\).*/\1/') echo "Bun version: $BUN_VERSION (semver: $SEMVER)" - CANARY_NPM=$(curl -sf https://registry.npmjs.org/@oven/bun-linux-x64 | bun -e "process.stdout.write(JSON.parse(await Bun.stdin.text())['dist-tags'].canary)") - echo "Canary npm version: $CANARY_NPM" CACHE_DIR="$HOME/.bun/install/cache" mkdir -p "$CACHE_DIR" + TMP_DIR=$(mktemp -d) for TARGET in linux-aarch64 linux-x64 linux-x64-baseline linux-aarch64-musl linux-x64-musl linux-x64-musl-baseline darwin-aarch64 darwin-x64 darwin-x64-baseline windows-x64 windows-x64-baseline; do DEST="$CACHE_DIR/bun-${TARGET}-v${SEMVER}" if [ -f "$DEST" ]; then echo "Already cached: $DEST" continue fi - URL="https://registry.npmjs.org/@oven/bun-${TARGET}/-/bun-${TARGET}-${CANARY_NPM}.tgz" + URL="https://github.com/oven-sh/bun/releases/download/canary/bun-${TARGET}.zip" echo "Downloading $TARGET from $URL" - if echo "$TARGET" | grep -q "windows"; then - BIN_NAME="bun.exe" - else - BIN_NAME="bun" - fi - if curl -sfL "$URL" | tar xz --strip-components=2 -C "$CACHE_DIR" "package/bin/$BIN_NAME"; then - mv "$CACHE_DIR/$BIN_NAME" "$DEST" + if curl -sfL -o "$TMP_DIR/bun.zip" "$URL"; then + unzip -qo "$TMP_DIR/bun.zip" -d "$TMP_DIR" + if echo "$TARGET" | grep -q "windows"; then + BIN_NAME="bun.exe" + else + BIN_NAME="bun" + fi + mv "$TMP_DIR/bun-${TARGET}/$BIN_NAME" "$DEST" chmod +x "$DEST" + rm -rf "$TMP_DIR/bun-${TARGET}" "$TMP_DIR/bun.zip" echo "Cached: $DEST" else echo "Skipped: $TARGET (not available)" fi done + rm -rf "$TMP_DIR" else echo "Not a canary build ($BUN_VERSION), skipping pre-cache" fi From 2814fe2caf3a05d7b005a6853c24acf1fe25c04b Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 12:25:18 +1000 Subject: [PATCH 23/24] ci: drop darwin-x64-baseline target (no Mac needs it) and alias modern binary to baseline cache key --- .github/actions/setup-bun/action.yml | 11 ++++++++++- packages/opencode/script/build.ts | 5 ----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index fab136ad8d0..e7966cb48c7 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -46,7 +46,7 @@ runs: CACHE_DIR="$HOME/.bun/install/cache" mkdir -p "$CACHE_DIR" TMP_DIR=$(mktemp -d) - for TARGET in linux-aarch64 linux-x64 linux-x64-baseline linux-aarch64-musl linux-x64-musl linux-x64-musl-baseline darwin-aarch64 darwin-x64 darwin-x64-baseline windows-x64 windows-x64-baseline; do + for TARGET in linux-aarch64 linux-x64 linux-x64-baseline linux-aarch64-musl linux-x64-musl linux-x64-musl-baseline darwin-aarch64 darwin-x64 windows-x64 windows-x64-baseline; do DEST="$CACHE_DIR/bun-${TARGET}-v${SEMVER}" if [ -f "$DEST" ]; then echo "Already cached: $DEST" @@ -65,6 +65,15 @@ runs: chmod +x "$DEST" rm -rf "$TMP_DIR/bun-${TARGET}" "$TMP_DIR/bun.zip" echo "Cached: $DEST" + # baseline bun resolves "bun-darwin-x64" to the baseline cache key + # so copy the modern binary there too + if [ "$TARGET" = "darwin-x64" ]; then + BASELINE_DEST="$CACHE_DIR/bun-darwin-x64-baseline-v${SEMVER}" + if [ ! -f "$BASELINE_DEST" ]; then + cp "$DEST" "$BASELINE_DEST" + echo "Cached (baseline alias): $BASELINE_DEST" + fi + fi else echo "Skipped: $TARGET (not available)" fi diff --git a/packages/opencode/script/build.ts b/packages/opencode/script/build.ts index 3de0da1050a..19353b67fe4 100755 --- a/packages/opencode/script/build.ts +++ b/packages/opencode/script/build.ts @@ -103,11 +103,6 @@ const allTargets: { os: "darwin", arch: "x64", }, - { - os: "darwin", - arch: "x64", - avx2: false, - }, { os: "win32", arch: "x64", From 05ad2f9893678cf6046aed106e3daae8e3423400 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 24 Feb 2026 12:29:26 +1000 Subject: [PATCH 24/24] ci: switch desktop sidecar to modern darwin-x64 (all Intel Macs have AVX2) --- packages/desktop/scripts/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/desktop/scripts/utils.ts b/packages/desktop/scripts/utils.ts index 2629eb466c0..f6ea7009c86 100644 --- a/packages/desktop/scripts/utils.ts +++ b/packages/desktop/scripts/utils.ts @@ -8,7 +8,7 @@ export const SIDECAR_BINARIES: Array<{ rustTarget: string; ocBinary: string; ass }, { rustTarget: "x86_64-apple-darwin", - ocBinary: "opencode-darwin-x64-baseline", + ocBinary: "opencode-darwin-x64", assetExt: "zip", }, {