From b9fe5dc0c0b24ecf351e97e469bdc2e6b3f2fd85 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 12:40:04 +0800 Subject: [PATCH 01/16] publish desktop betas to separate repo --- .github/workflows/publish.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 431581f5966..4df9e9605ba 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -202,8 +202,11 @@ jobs: tagName: ${{ needs.version.outputs.tag }} releaseDraft: true releaseAssetNamePattern: opencode-desktop-[platform]-[arch][ext] + owner: ${{ (github.ref_name == 'beta' && 'brendonovich') || '' }} + repo: ${{ (github.ref_name == 'beta' && 'opencode-desktop-betas') || '' }} + releaseCommitish: ${{ (github.ref_name == 'beta' && github.sha) || '' }} env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ (github.ref_name == 'beta' && secrets.BRENDAN_GITHUB_TOKEN) || secrets.GITHUB_TOKEN }} TAURI_BUNDLER_NEW_APPIMAGE_FORMAT: true TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} From 21e7749fa0ba7b718992f5511dfe558feec79f54 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 12:52:06 +0800 Subject: [PATCH 02/16] set tagName in beta --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 4df9e9605ba..81e0de43d26 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -199,7 +199,7 @@ jobs: args: --target ${{ matrix.settings.target }} --config ./src-tauri/tauri.prod.conf.json --verbose updaterJsonPreferNsis: true releaseId: ${{ needs.version.outputs.release }} - tagName: ${{ needs.version.outputs.tag }} + tagName: ${{ (github.ref_name == 'beta' && needs.version.outputs.version) || needs.version.outputs.tag }} releaseDraft: true releaseAssetNamePattern: opencode-desktop-[platform]-[arch][ext] owner: ${{ (github.ref_name == 'beta' && 'brendonovich') || '' }} From b416c6644bf45f62e5ef8d6395514168d56312a9 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 12:58:51 +0800 Subject: [PATCH 03/16] releaseName --- .github/workflows/publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 81e0de43d26..603e0972f9d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -205,6 +205,7 @@ jobs: owner: ${{ (github.ref_name == 'beta' && 'brendonovich') || '' }} repo: ${{ (github.ref_name == 'beta' && 'opencode-desktop-betas') || '' }} releaseCommitish: ${{ (github.ref_name == 'beta' && github.sha) || '' }} + releaseName: ${{ (github.ref_name == 'beta' && needs.version.outputs.version) || '' }} env: GITHUB_TOKEN: ${{ (github.ref_name == 'beta' && secrets.BRENDAN_GITHUB_TOKEN) || secrets.GITHUB_TOKEN }} TAURI_BUNDLER_NEW_APPIMAGE_FORMAT: true From 26e43d4241d3811c110064cf92f6511c470ccf52 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 13:16:18 +0800 Subject: [PATCH 04/16] create release in beta repo --- .github/workflows/publish.yml | 5 ++--- script/version.ts | 6 ++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 603e0972f9d..71f2b35b177 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -49,7 +49,7 @@ jobs: run: | ./script/version.ts env: - GH_TOKEN: ${{ github.token }} + GH_TOKEN: ${{ (github.ref_name == 'beta' && secrets.BRENDAN_GITHUB_TOKEN) || github.token }} OPENCODE_BUMP: ${{ inputs.bump }} OPENCODE_VERSION: ${{ inputs.version }} OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }} @@ -199,13 +199,12 @@ jobs: args: --target ${{ matrix.settings.target }} --config ./src-tauri/tauri.prod.conf.json --verbose updaterJsonPreferNsis: true releaseId: ${{ needs.version.outputs.release }} - tagName: ${{ (github.ref_name == 'beta' && needs.version.outputs.version) || needs.version.outputs.tag }} + tagName: ${{ needs.version.outputs.tag }} releaseDraft: true releaseAssetNamePattern: opencode-desktop-[platform]-[arch][ext] owner: ${{ (github.ref_name == 'beta' && 'brendonovich') || '' }} repo: ${{ (github.ref_name == 'beta' && 'opencode-desktop-betas') || '' }} releaseCommitish: ${{ (github.ref_name == 'beta' && github.sha) || '' }} - releaseName: ${{ (github.ref_name == 'beta' && needs.version.outputs.version) || '' }} env: GITHUB_TOKEN: ${{ (github.ref_name == 'beta' && secrets.BRENDAN_GITHUB_TOKEN) || secrets.GITHUB_TOKEN }} TAURI_BUNDLER_NEW_APPIMAGE_FORMAT: true diff --git a/script/version.ts b/script/version.ts index e011f44539d..b2a2bf05e9c 100755 --- a/script/version.ts +++ b/script/version.ts @@ -17,6 +17,12 @@ if (!Script.preview) { const release = await $`gh release view v${Script.version} --json tagName,databaseId`.json() output.push(`release=${release.databaseId}`) output.push(`tag=${release.tagName}`) +} else if (Script.channel === "beta") { + await $`gh release create ${Script.version} -d --title "${Script.version}" --repo brendonovich/opencode-desktop-beta` + const release = + await $`gh release view ${Script.version} --json tagName,databaseId --repo brendonovich/opencode-desktop-beta`.json() + output.push(`release=${release.databaseId}`) + output.push(`tag=${release.tagName}`) } if (process.env.GITHUB_OUTPUT) { From 64659861ba99337e00556c09d7f4434886264558 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 13:26:51 +0800 Subject: [PATCH 05/16] don't upload cli to beta release --- .github/workflows/publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 71f2b35b177..166a11a3be7 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -74,8 +74,8 @@ jobs: run: | ./packages/opencode/script/build.ts env: - OPENCODE_VERSION: ${{ needs.version.outputs.version }} - OPENCODE_RELEASE: ${{ needs.version.outputs.release }} + OPENCODE_VERSION: ${{ (github.ref_name != 'beta' && needs.version.outputs.version) || '' }} + OPENCODE_RELEASE: ${{ (github.ref_name != 'beta' && needs.version.outputs.release) || '' }} GH_TOKEN: ${{ github.token }} - uses: actions/upload-artifact@v4 From 7a9440de380505952144c263033c604fa8ce1ee4 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 14:18:04 +0800 Subject: [PATCH 06/16] desktop-beta not desktop-betas --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 166a11a3be7..09a44a57b5f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -203,7 +203,7 @@ jobs: releaseDraft: true releaseAssetNamePattern: opencode-desktop-[platform]-[arch][ext] owner: ${{ (github.ref_name == 'beta' && 'brendonovich') || '' }} - repo: ${{ (github.ref_name == 'beta' && 'opencode-desktop-betas') || '' }} + repo: ${{ (github.ref_name == 'beta' && 'opencode-desktop-beta') || '' }} releaseCommitish: ${{ (github.ref_name == 'beta' && github.sha) || '' }} env: GITHUB_TOKEN: ${{ (github.ref_name == 'beta' && secrets.BRENDAN_GITHUB_TOKEN) || secrets.GITHUB_TOKEN }} From cb171542164885b07a4d0f491357383079f47cac Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 14:42:08 +0800 Subject: [PATCH 07/16] pass through repo in final publish script --- .github/workflows/publish.yml | 6 ++++-- script/publish.ts | 17 ++++++++++------- script/version.ts | 5 +++-- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 09a44a57b5f..2bcadbdd871 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -53,10 +53,12 @@ jobs: OPENCODE_BUMP: ${{ inputs.bump }} OPENCODE_VERSION: ${{ inputs.version }} OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }} + GH_REPO: ${{ (github.ref_name == 'beta' && 'brendonovich/opencode-desktop-beta') || github.repository }} outputs: version: ${{ steps.version.outputs.version }} release: ${{ steps.version.outputs.release }} tag: ${{ steps.version.outputs.tag }} + repo: ${{ steps.version.outputs.repo }} build-cli: needs: version @@ -202,8 +204,7 @@ jobs: tagName: ${{ needs.version.outputs.tag }} releaseDraft: true releaseAssetNamePattern: opencode-desktop-[platform]-[arch][ext] - owner: ${{ (github.ref_name == 'beta' && 'brendonovich') || '' }} - repo: ${{ (github.ref_name == 'beta' && 'opencode-desktop-beta') || '' }} + repo: ${{ (github.ref_name == 'beta' && 'opencode-desktop-betas') || '' }} releaseCommitish: ${{ (github.ref_name == 'beta' && github.sha) || '' }} env: GITHUB_TOKEN: ${{ (github.ref_name == 'beta' && secrets.BRENDAN_GITHUB_TOKEN) || secrets.GITHUB_TOKEN }} @@ -283,4 +284,5 @@ jobs: OPENCODE_RELEASE: ${{ needs.version.outputs.release }} AUR_KEY: ${{ secrets.AUR_KEY }} GITHUB_TOKEN: ${{ steps.committer.outputs.token }} + GH_REPO: ${{ needs.version.outputs.repo }} NPM_CONFIG_PROVENANCE: false diff --git a/script/publish.ts b/script/publish.ts index 1294f8d793e..586d1cf351a 100755 --- a/script/publish.ts +++ b/script/publish.ts @@ -57,13 +57,16 @@ await $`bun install` await import(`../packages/sdk/js/script/build.ts`) if (Script.release) { - await $`git commit -am "release: v${Script.version}"` - await $`git tag v${Script.version}` - await $`git fetch origin` - await $`git cherry-pick HEAD..origin/dev`.nothrow() - await $`git push origin HEAD --tags --no-verify --force-with-lease` - await new Promise((resolve) => setTimeout(resolve, 5_000)) - await $`gh release edit v${Script.version} --draft=false` + if (Script.channel === "latest") { + await $`git commit -am "release: v${Script.version}"` + await $`git tag v${Script.version}` + await $`git fetch origin` + await $`git cherry-pick HEAD..origin/dev`.nothrow() + await $`git push origin HEAD --tags --no-verify --force-with-lease` + await new Promise((resolve) => setTimeout(resolve, 5_000)) + } + + await $`gh release edit v${Script.version} --draft=false --repo ${process.env.GH_REPO}` } console.log("\n=== cli ===\n") diff --git a/script/version.ts b/script/version.ts index b2a2bf05e9c..3f2d8b970cc 100755 --- a/script/version.ts +++ b/script/version.ts @@ -18,11 +18,12 @@ if (!Script.preview) { output.push(`release=${release.databaseId}`) output.push(`tag=${release.tagName}`) } else if (Script.channel === "beta") { - await $`gh release create ${Script.version} -d --title "${Script.version}" --repo brendonovich/opencode-desktop-beta` + await $`gh release create ${Script.version} -d --title "${Script.version}" --repo ${process.env.GH_REPO}` const release = - await $`gh release view ${Script.version} --json tagName,databaseId --repo brendonovich/opencode-desktop-beta`.json() + await $`gh release view ${Script.version} --json tagName,databaseId --repo ${process.env.GH_REPO}`.json() output.push(`release=${release.databaseId}`) output.push(`tag=${release.tagName}`) + output.push(`repo=${process.env.GH_REPO}`) } if (process.env.GITHUB_OUTPUT) { From 403c72329ca4bf1294deaf2bddf73f3c070ed92f Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 14:53:02 +0800 Subject: [PATCH 08/16] -_- --- .github/workflows/publish.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2bcadbdd871..bf0f5ad832e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -204,7 +204,8 @@ jobs: tagName: ${{ needs.version.outputs.tag }} releaseDraft: true releaseAssetNamePattern: opencode-desktop-[platform]-[arch][ext] - repo: ${{ (github.ref_name == 'beta' && 'opencode-desktop-betas') || '' }} + owner: ${{ (github.ref_name == 'beta' && 'brendonovich') || '' }} + repo: ${{ (github.ref_name == 'beta' && 'opencode-desktop-beta') || '' }} releaseCommitish: ${{ (github.ref_name == 'beta' && github.sha) || '' }} env: GITHUB_TOKEN: ${{ (github.ref_name == 'beta' && secrets.BRENDAN_GITHUB_TOKEN) || secrets.GITHUB_TOKEN }} From 9295a0c5f9215982ffb5e533030e9c9c7a1628b4 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 15:01:27 +0800 Subject: [PATCH 09/16] beta tauri config --- .github/workflows/publish.yml | 2 +- .../desktop/src-tauri/tauri.beta.conf.json | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 packages/desktop/src-tauri/tauri.beta.conf.json diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index bf0f5ad832e..666a8ea86fa 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -198,7 +198,7 @@ jobs: projectPath: packages/desktop uploadWorkflowArtifacts: true tauriScript: ${{ (contains(matrix.settings.host, 'ubuntu') && 'cargo tauri') || '' }} - args: --target ${{ matrix.settings.target }} --config ./src-tauri/tauri.prod.conf.json --verbose + args: --target ${{ matrix.settings.target }} --config ${{ (github.ref_name == 'beta' && './src-tauri/tauri.beta.conf.json') || './src-tauri/tauri.prod.conf.json' }} --verbose updaterJsonPreferNsis: true releaseId: ${{ needs.version.outputs.release }} tagName: ${{ needs.version.outputs.tag }} diff --git a/packages/desktop/src-tauri/tauri.beta.conf.json b/packages/desktop/src-tauri/tauri.beta.conf.json new file mode 100644 index 00000000000..90a33adbaf7 --- /dev/null +++ b/packages/desktop/src-tauri/tauri.beta.conf.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "OpenCode Beta", + "identifier": "ai.opencode.desktop.beta", + "bundle": { + "createUpdaterArtifacts": true, + "linux": { + "rpm": { + "compression": { + "type": "none" + } + } + } + }, + "plugins": { + "updater": { + "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEYwMDM5Nzg5OUMzOUExMDQKUldRRW9UbWNpWmNEOENYT01CV0lhOXR1UFhpaXJsK1Z3aU9lZnNtNzE0TDROWVMwVW9XQnFOelkK", + "endpoints": ["https://github.com/brendonovich/opencode-desktop-beta/releases/latest/download/latest.json"] + } + } +} From 8b86fe9e0b5ba5d4f32dc515f52a7ef9d7875e9f Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 15:19:01 +0800 Subject: [PATCH 10/16] use brendan github token in publish --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 666a8ea86fa..a72548a239e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -284,6 +284,6 @@ jobs: OPENCODE_VERSION: ${{ needs.version.outputs.version }} OPENCODE_RELEASE: ${{ needs.version.outputs.release }} AUR_KEY: ${{ secrets.AUR_KEY }} - GITHUB_TOKEN: ${{ steps.committer.outputs.token }} + GITHUB_TOKEN: ${{ (github.ref_name == 'beta' && secrets.BRENDAN_GITHUB_TOKEN) || steps.committer.outputs.token }} GH_REPO: ${{ needs.version.outputs.repo }} NPM_CONFIG_PROVENANCE: false From 95468c6caa7fac04b54e1daada1ab5a0a738a12f Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 15:35:46 +0800 Subject: [PATCH 11/16] v prefix --- script/version.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/version.ts b/script/version.ts index 3f2d8b970cc..c678517eec9 100755 --- a/script/version.ts +++ b/script/version.ts @@ -18,9 +18,9 @@ if (!Script.preview) { output.push(`release=${release.databaseId}`) output.push(`tag=${release.tagName}`) } else if (Script.channel === "beta") { - await $`gh release create ${Script.version} -d --title "${Script.version}" --repo ${process.env.GH_REPO}` + await $`gh release create v${Script.version} -d --title "v${Script.version}" --repo ${process.env.GH_REPO}` const release = - await $`gh release view ${Script.version} --json tagName,databaseId --repo ${process.env.GH_REPO}`.json() + await $`gh release view v${Script.version} --json tagName,databaseId --repo ${process.env.GH_REPO}`.json() output.push(`release=${release.databaseId}`) output.push(`tag=${release.tagName}`) output.push(`repo=${process.env.GH_REPO}`) From 34883ec81704e4a96ae24db2d890d71c472cc8f4 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 21:40:59 +0800 Subject: [PATCH 12/16] use committer action github token --- .github/workflows/publish.yml | 27 ++++++++++++++----- .../desktop/src-tauri/tauri.beta.conf.json | 2 +- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a72548a239e..93db6aa98e8 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -41,6 +41,13 @@ jobs: - uses: ./.github/actions/setup-bun + - name: Setup git committer + id: committer + uses: ./.github/actions/setup-git-committer + with: + opencode-app-id: ${{ vars.OPENCODE_APP_ID }} + opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }} + - name: Install OpenCode if: inputs.bump || inputs.version run: bun i -g opencode-ai @@ -49,11 +56,11 @@ jobs: run: | ./script/version.ts env: - GH_TOKEN: ${{ (github.ref_name == 'beta' && secrets.BRENDAN_GITHUB_TOKEN) || github.token }} + GH_TOKEN: ${{ steps.committer.outputs.token }} OPENCODE_BUMP: ${{ inputs.bump }} OPENCODE_VERSION: ${{ inputs.version }} OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }} - GH_REPO: ${{ (github.ref_name == 'beta' && 'brendonovich/opencode-desktop-beta') || github.repository }} + GH_REPO: ${{ (github.ref_name == 'beta' && 'anomalyco/opencode-beta') || github.repository }} outputs: version: ${{ steps.version.outputs.version }} release: ${{ steps.version.outputs.release }} @@ -191,6 +198,13 @@ jobs: if: contains(matrix.settings.host, 'ubuntu') run: cargo tauri --version + - name: Setup git committer + id: committer + uses: ./.github/actions/setup-git-committer + with: + opencode-app-id: ${{ vars.OPENCODE_APP_ID }} + opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }} + - name: Build and upload artifacts uses: tauri-apps/tauri-action@390cbe447412ced1303d35abe75287949e43437a timeout-minutes: 60 @@ -204,11 +218,10 @@ jobs: tagName: ${{ needs.version.outputs.tag }} releaseDraft: true releaseAssetNamePattern: opencode-desktop-[platform]-[arch][ext] - owner: ${{ (github.ref_name == 'beta' && 'brendonovich') || '' }} - repo: ${{ (github.ref_name == 'beta' && 'opencode-desktop-beta') || '' }} - releaseCommitish: ${{ (github.ref_name == 'beta' && github.sha) || '' }} + repo: ${{ (github.ref_name == 'beta' && 'opencode-beta') || '' }} + releaseCommitish: ${{ github.sha }} env: - GITHUB_TOKEN: ${{ (github.ref_name == 'beta' && secrets.BRENDAN_GITHUB_TOKEN) || secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ steps.committer.outputs.token }} TAURI_BUNDLER_NEW_APPIMAGE_FORMAT: true TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} @@ -284,6 +297,6 @@ jobs: OPENCODE_VERSION: ${{ needs.version.outputs.version }} OPENCODE_RELEASE: ${{ needs.version.outputs.release }} AUR_KEY: ${{ secrets.AUR_KEY }} - GITHUB_TOKEN: ${{ (github.ref_name == 'beta' && secrets.BRENDAN_GITHUB_TOKEN) || steps.committer.outputs.token }} + GITHUB_TOKEN: ${{ steps.committer.outputs.token }} GH_REPO: ${{ needs.version.outputs.repo }} NPM_CONFIG_PROVENANCE: false diff --git a/packages/desktop/src-tauri/tauri.beta.conf.json b/packages/desktop/src-tauri/tauri.beta.conf.json index 90a33adbaf7..5207c73fc1c 100644 --- a/packages/desktop/src-tauri/tauri.beta.conf.json +++ b/packages/desktop/src-tauri/tauri.beta.conf.json @@ -15,7 +15,7 @@ "plugins": { "updater": { "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEYwMDM5Nzg5OUMzOUExMDQKUldRRW9UbWNpWmNEOENYT01CV0lhOXR1UFhpaXJsK1Z3aU9lZnNtNzE0TDROWVMwVW9XQnFOelkK", - "endpoints": ["https://github.com/brendonovich/opencode-desktop-beta/releases/latest/download/latest.json"] + "endpoints": ["https://github.com/anomalyco/opencode-beta/releases/latest/download/latest.json"] } } } From a0e542573e35a879f88f639d602792f7c7122aef Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 21:50:54 +0800 Subject: [PATCH 13/16] add channel param to download urls --- .../download/{ => [channel]}/[platform].ts | 23 +++++++++++-------- .../console/app/src/routes/download/index.tsx | 22 +++++++++--------- 2 files changed, 24 insertions(+), 21 deletions(-) rename packages/console/app/src/routes/download/{ => [channel]}/[platform].ts (70%) diff --git a/packages/console/app/src/routes/download/[platform].ts b/packages/console/app/src/routes/download/[channel]/[platform].ts similarity index 70% rename from packages/console/app/src/routes/download/[platform].ts rename to packages/console/app/src/routes/download/[channel]/[platform].ts index 2c30a803623..9a52842639a 100644 --- a/packages/console/app/src/routes/download/[platform].ts +++ b/packages/console/app/src/routes/download/[channel]/[platform].ts @@ -1,5 +1,5 @@ -import { APIEvent } from "@solidjs/start" -import { DownloadPlatform } from "./types" +import type { APIEvent } from "@solidjs/start" +import type { DownloadPlatform } from "../types" const assetNames: Record = { "darwin-aarch64-dmg": "opencode-desktop-darwin-aarch64.dmg", @@ -17,17 +17,20 @@ const downloadNames: Record = { "windows-x64-nsis": "OpenCode Desktop Installer.exe", } satisfies { [K in DownloadPlatform]?: string } -export async function GET({ params: { platform } }: APIEvent) { +export async function GET({ params: { platform, channel } }: APIEvent) { const assetName = assetNames[platform] if (!assetName) return new Response("Not Found", { status: 404 }) - const resp = await fetch(`https://github.com/anomalyco/opencode/releases/latest/download/${assetName}`, { - cf: { - // in case gh releases has rate limits - cacheTtl: 60 * 5, - cacheEverything: true, - }, - } as any) + const resp = await fetch( + `https://github.com/anomalyco/${channel === "stable" ? "opencode" : "opencode-beta"}/releases/latest/download/${assetName}`, + { + cf: { + // in case gh releases has rate limits + cacheTtl: 60 * 5, + cacheEverything: true, + }, + } as any, + ) const downloadName = downloadNames[platform] diff --git a/packages/console/app/src/routes/download/index.tsx b/packages/console/app/src/routes/download/index.tsx index e5e4e975021..0278d8622bf 100644 --- a/packages/console/app/src/routes/download/index.tsx +++ b/packages/console/app/src/routes/download/index.tsx @@ -1,18 +1,18 @@ import "./index.css" -import { Title, Meta } from "@solidjs/meta" -import { A, createAsync, query } from "@solidjs/router" -import { Header } from "~/component/header" -import { Footer } from "~/component/footer" -import { IconCopy, IconCheck } from "~/component/icon" +import { Meta, Title } from "@solidjs/meta" +import { A } from "@solidjs/router" +import { createSignal, type JSX, onMount, Show } from "solid-js" import { Faq } from "~/component/faq" -import desktopAppIcon from "../../asset/lander/opencode-desktop-icon.png" +import { Footer } from "~/component/footer" +import { Header } from "~/component/header" +import { IconCheck, IconCopy } from "~/component/icon" import { Legal } from "~/component/legal" +import { LocaleLinks } from "~/component/locale-links" import { config } from "~/config" -import { createSignal, onMount, Show, JSX } from "solid-js" -import { DownloadPlatform } from "./types" import { useI18n } from "~/context/i18n" import { useLanguage } from "~/context/language" -import { LocaleLinks } from "~/component/locale-links" +import desktopAppIcon from "../../asset/lander/opencode-desktop-icon.png" +import type { DownloadPlatform } from "./types" type OS = "macOS" | "Windows" | "Linux" | null @@ -40,8 +40,8 @@ function getDownloadPlatform(os: OS): DownloadPlatform { } } -function getDownloadHref(platform: DownloadPlatform) { - return `/download/${platform}` +function getDownloadHref(platform: DownloadPlatform, channel: "stable" | "beta" = "stable") { + return `/download/${channel}/${platform}` } function IconDownload(props: JSX.SvgSVGAttributes) { From a4760a25a3f4fece15a588874ccc2be747bc70b0 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 21:58:25 +0800 Subject: [PATCH 14/16] upload cli betas too --- .github/workflows/publish.yml | 5 +++-- packages/opencode/script/build.ts | 18 +++++++++++------- script/version.ts | 3 ++- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 93db6aa98e8..b5e218ca744 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -83,8 +83,9 @@ jobs: run: | ./packages/opencode/script/build.ts env: - OPENCODE_VERSION: ${{ (github.ref_name != 'beta' && needs.version.outputs.version) || '' }} - OPENCODE_RELEASE: ${{ (github.ref_name != 'beta' && needs.version.outputs.release) || '' }} + OPENCODE_VERSION: ${{ needs.version.outputs.version }} + OPENCODE_RELEASE: ${{ needs.version.outputs.release }} + GH_REPO: ${{ needs.version.outputs.repo }} GH_TOKEN: ${{ github.token }} - uses: actions/upload-artifact@v4 diff --git a/packages/opencode/script/build.ts b/packages/opencode/script/build.ts index ddb4769912d..34e80d71a08 100755 --- a/packages/opencode/script/build.ts +++ b/packages/opencode/script/build.ts @@ -1,10 +1,10 @@ #!/usr/bin/env bun -import solidPlugin from "../node_modules/@opentui/solid/scripts/solid-plugin" -import path from "path" -import fs from "fs" import { $ } from "bun" +import fs from "fs" +import path from "path" import { fileURLToPath } from "url" +import solidPlugin from "../node_modules/@opentui/solid/scripts/solid-plugin" const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) @@ -12,8 +12,9 @@ const dir = path.resolve(__dirname, "..") process.chdir(dir) -import pkg from "../package.json" import { Script } from "@opencode-ai/script" +import pkg from "../package.json" + const modelsUrl = process.env.OPENCODE_MODELS_URL || "https://models.dev" // Fetch and generate models.dev snapshot const modelsData = process.env.MODELS_DEV_API_JSON @@ -26,7 +27,11 @@ await Bun.write( console.log("Generated models-snapshot.ts") // Load migrations from migration directories -const migrationDirs = (await fs.promises.readdir(path.join(dir, "migration"), { withFileTypes: true })) +const migrationDirs = ( + await fs.promises.readdir(path.join(dir, "migration"), { + withFileTypes: true, + }) +) .filter((entry) => entry.isDirectory() && /^\d{4}\d{2}\d{2}\d{2}\d{2}\d{2}/.test(entry.name)) .map((entry) => entry.name) .sort() @@ -171,7 +176,6 @@ for (const item of targets) { compile: { autoloadBunfig: false, autoloadDotenv: false, - //@ts-ignore (bun types aren't up to date) autoloadTsconfig: true, autoloadPackageJson: true, target: name.replace(pkg.name, "bun") as any, @@ -214,7 +218,7 @@ if (Script.release) { await $`zip -r ../../${key}.zip *`.cwd(`dist/${key}/bin`) } } - await $`gh release upload v${Script.version} ./dist/*.zip ./dist/*.tar.gz --clobber` + await $`gh release upload v${Script.version} ./dist/*.zip ./dist/*.tar.gz --clobber --repo ${process.env.GH_REPO}` } export { binaries } diff --git a/script/version.ts b/script/version.ts index c678517eec9..71619f46185 100755 --- a/script/version.ts +++ b/script/version.ts @@ -23,9 +23,10 @@ if (!Script.preview) { await $`gh release view v${Script.version} --json tagName,databaseId --repo ${process.env.GH_REPO}`.json() output.push(`release=${release.databaseId}`) output.push(`tag=${release.tagName}`) - output.push(`repo=${process.env.GH_REPO}`) } +output.push(`repo=${process.env.GH_REPO}`) + if (process.env.GITHUB_OUTPUT) { await Bun.write(process.env.GITHUB_OUTPUT, output.join("\n")) } From b660d222ef0cccb356391aea71a3021cda18b829 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 22:08:39 +0800 Subject: [PATCH 15/16] add git committer token to build-cli --- .github/workflows/publish.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b5e218ca744..8d4c9038a7e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -78,6 +78,13 @@ jobs: - uses: ./.github/actions/setup-bun + - name: Setup git committer + id: committer + uses: ./.github/actions/setup-git-committer + with: + opencode-app-id: ${{ vars.OPENCODE_APP_ID }} + opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }} + - name: Build id: build run: | @@ -86,7 +93,7 @@ jobs: OPENCODE_VERSION: ${{ needs.version.outputs.version }} OPENCODE_RELEASE: ${{ needs.version.outputs.release }} GH_REPO: ${{ needs.version.outputs.repo }} - GH_TOKEN: ${{ github.token }} + GH_TOKEN: ${{ steps.committer.outputs.token }} - uses: actions/upload-artifact@v4 with: From 946f2942800cbcff7121bafec6434ebc9747410d Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Feb 2026 22:15:55 +0800 Subject: [PATCH 16/16] use .preview instead of === "latest" --- script/publish.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/publish.ts b/script/publish.ts index 586d1cf351a..8aa921daa83 100755 --- a/script/publish.ts +++ b/script/publish.ts @@ -57,7 +57,7 @@ await $`bun install` await import(`../packages/sdk/js/script/build.ts`) if (Script.release) { - if (Script.channel === "latest") { + if (!Script.preview) { await $`git commit -am "release: v${Script.version}"` await $`git tag v${Script.version}` await $`git fetch origin`