From 71e0ba271f1917f3128649f23210187265573f29 Mon Sep 17 00:00:00 2001 From: opencode Date: Fri, 30 Jan 2026 14:32:22 +0000 Subject: [PATCH 01/24] release: v1.1.45 --- bun.lock | 36 ++++++++++++-------------- packages/app/package.json | 2 +- packages/console/app/package.json | 2 +- packages/console/core/package.json | 2 +- packages/console/function/package.json | 2 +- packages/console/mail/package.json | 2 +- packages/desktop/package.json | 2 +- packages/enterprise/package.json | 2 +- packages/extensions/zed/extension.toml | 12 ++++----- packages/function/package.json | 2 +- packages/opencode/package.json | 2 +- packages/plugin/package.json | 2 +- packages/sdk/js/package.json | 2 +- packages/slack/package.json | 2 +- packages/ui/package.json | 2 +- packages/util/package.json | 2 +- packages/web/package.json | 2 +- sdks/vscode/package.json | 2 +- 18 files changed, 38 insertions(+), 42 deletions(-) diff --git a/bun.lock b/bun.lock index 99d35168f3..538712601d 100644 --- a/bun.lock +++ b/bun.lock @@ -18,14 +18,12 @@ "prettier": "3.6.2", "semver": "^7.6.0", "sst": "3.17.23", - "stackback": "0.0.2", "turbo": "2.5.6", - "why-is-node-running": "2.2.2", }, }, "packages/app": { "name": "@opencode-ai/app", - "version": "1.1.43", + "version": "1.1.45", "dependencies": { "@kobalte/core": "catalog:", "@opencode-ai/sdk": "workspace:*", @@ -75,7 +73,7 @@ }, "packages/console/app": { "name": "@opencode-ai/console-app", - "version": "1.1.43", + "version": "1.1.45", "dependencies": { "@cloudflare/vite-plugin": "1.15.2", "@ibm/plex": "6.4.1", @@ -109,7 +107,7 @@ }, "packages/console/core": { "name": "@opencode-ai/console-core", - "version": "1.1.43", + "version": "1.1.45", "dependencies": { "@aws-sdk/client-sts": "3.782.0", "@jsx-email/render": "1.1.1", @@ -136,7 +134,7 @@ }, "packages/console/function": { "name": "@opencode-ai/console-function", - "version": "1.1.43", + "version": "1.1.45", "dependencies": { "@ai-sdk/anthropic": "2.0.0", "@ai-sdk/openai": "2.0.2", @@ -160,7 +158,7 @@ }, "packages/console/mail": { "name": "@opencode-ai/console-mail", - "version": "1.1.43", + "version": "1.1.45", "dependencies": { "@jsx-email/all": "2.2.3", "@jsx-email/cli": "1.4.3", @@ -184,7 +182,7 @@ }, "packages/desktop": { "name": "@opencode-ai/desktop", - "version": "1.1.43", + "version": "1.1.45", "dependencies": { "@opencode-ai/app": "workspace:*", "@opencode-ai/ui": "workspace:*", @@ -215,7 +213,7 @@ }, "packages/enterprise": { "name": "@opencode-ai/enterprise", - "version": "1.1.43", + "version": "1.1.45", "dependencies": { "@opencode-ai/ui": "workspace:*", "@opencode-ai/util": "workspace:*", @@ -244,7 +242,7 @@ }, "packages/function": { "name": "@opencode-ai/function", - "version": "1.1.43", + "version": "1.1.45", "dependencies": { "@octokit/auth-app": "8.0.1", "@octokit/rest": "catalog:", @@ -260,7 +258,7 @@ }, "packages/opencode": { "name": "opencode", - "version": "1.1.43", + "version": "1.1.45", "bin": { "opencode": "./bin/opencode", }, @@ -364,7 +362,7 @@ }, "packages/plugin": { "name": "@opencode-ai/plugin", - "version": "1.1.43", + "version": "1.1.45", "dependencies": { "@opencode-ai/sdk": "workspace:*", "zod": "catalog:", @@ -384,7 +382,7 @@ }, "packages/sdk/js": { "name": "@opencode-ai/sdk", - "version": "1.1.43", + "version": "1.1.45", "devDependencies": { "@hey-api/openapi-ts": "0.90.10", "@tsconfig/node22": "catalog:", @@ -395,7 +393,7 @@ }, "packages/slack": { "name": "@opencode-ai/slack", - "version": "1.1.43", + "version": "1.1.45", "dependencies": { "@opencode-ai/sdk": "workspace:*", "@slack/bolt": "^3.17.1", @@ -408,7 +406,7 @@ }, "packages/ui": { "name": "@opencode-ai/ui", - "version": "1.1.43", + "version": "1.1.45", "dependencies": { "@kobalte/core": "catalog:", "@opencode-ai/sdk": "workspace:*", @@ -450,7 +448,7 @@ }, "packages/util": { "name": "@opencode-ai/util", - "version": "1.1.43", + "version": "1.1.45", "dependencies": { "zod": "catalog:", }, @@ -461,7 +459,7 @@ }, "packages/web": { "name": "@opencode-ai/web", - "version": "1.1.43", + "version": "1.1.45", "dependencies": { "@astrojs/cloudflare": "12.6.3", "@astrojs/markdown-remark": "6.3.1", @@ -3901,7 +3899,7 @@ "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="], - "why-is-node-running": ["why-is-node-running@2.2.2", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA=="], + "why-is-node-running": ["why-is-node-running@3.2.2", "", { "bin": { "why-is-node-running": "cli.js" } }, "sha512-NKUzAelcoCXhXL4dJzKIwXeR8iEVqsA0Lq6Vnd0UXvgaKbzVo4ZTHROF2Jidrv+SgxOQ03fMinnNhzZATxOD3A=="], "widest-line": ["widest-line@5.0.0", "", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="], @@ -4389,8 +4387,6 @@ "opencode/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.30", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-thubwhRtv9uicAxSWwNpinM7hiL/0CkhL/ymPaHuKvI494J7HIzn8KQZQ2ymRz284WTIZnI7VMyyejxW4RMM6w=="], - "opencode/why-is-node-running": ["why-is-node-running@3.2.2", "", { "bin": { "why-is-node-running": "cli.js" } }, "sha512-NKUzAelcoCXhXL4dJzKIwXeR8iEVqsA0Lq6Vnd0UXvgaKbzVo4ZTHROF2Jidrv+SgxOQ03fMinnNhzZATxOD3A=="], - "opencontrol/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA=="], "opencontrol/@tsconfig/bun": ["@tsconfig/bun@1.0.7", "", {}, "sha512-udGrGJBNQdXGVulehc1aWT73wkR9wdaGBtB6yL70RJsqwW/yJhIg6ZbRlPOfIUiFNrnBuYLBi9CSmMKfDC7dvA=="], diff --git a/packages/app/package.json b/packages/app/package.json index 87ca7931c5..8459172e7c 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/app", - "version": "1.1.43", + "version": "1.1.45", "description": "", "type": "module", "exports": { diff --git a/packages/console/app/package.json b/packages/console/app/package.json index b10593a8fa..84d45d3a7b 100644 --- a/packages/console/app/package.json +++ b/packages/console/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-app", - "version": "1.1.43", + "version": "1.1.45", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/console/core/package.json b/packages/console/core/package.json index 111390efbe..38811d4de2 100644 --- a/packages/console/core/package.json +++ b/packages/console/core/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/console-core", - "version": "1.1.43", + "version": "1.1.45", "private": true, "type": "module", "license": "MIT", diff --git a/packages/console/function/package.json b/packages/console/function/package.json index c26b4584de..50acf1567c 100644 --- a/packages/console/function/package.json +++ b/packages/console/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-function", - "version": "1.1.43", + "version": "1.1.45", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/console/mail/package.json b/packages/console/mail/package.json index 564a7140cc..902dd447be 100644 --- a/packages/console/mail/package.json +++ b/packages/console/mail/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-mail", - "version": "1.1.43", + "version": "1.1.45", "dependencies": { "@jsx-email/all": "2.2.3", "@jsx-email/cli": "1.4.3", diff --git a/packages/desktop/package.json b/packages/desktop/package.json index c1f330ce93..1b01f8a6f2 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@opencode-ai/desktop", "private": true, - "version": "1.1.43", + "version": "1.1.45", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/enterprise/package.json b/packages/enterprise/package.json index 03016c1c58..2091e68574 100644 --- a/packages/enterprise/package.json +++ b/packages/enterprise/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/enterprise", - "version": "1.1.43", + "version": "1.1.45", "private": true, "type": "module", "license": "MIT", diff --git a/packages/extensions/zed/extension.toml b/packages/extensions/zed/extension.toml index eaa882b65b..283036bf5b 100644 --- a/packages/extensions/zed/extension.toml +++ b/packages/extensions/zed/extension.toml @@ -1,7 +1,7 @@ id = "opencode" name = "OpenCode" description = "The open source coding agent." -version = "1.1.43" +version = "1.1.45" schema_version = 1 authors = ["Anomaly"] repository = "https://github.com/anomalyco/opencode" @@ -11,26 +11,26 @@ name = "OpenCode" icon = "./icons/opencode.svg" [agent_servers.opencode.targets.darwin-aarch64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.43/opencode-darwin-arm64.zip" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.45/opencode-darwin-arm64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.darwin-x86_64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.43/opencode-darwin-x64.zip" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.45/opencode-darwin-x64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-aarch64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.43/opencode-linux-arm64.tar.gz" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.45/opencode-linux-arm64.tar.gz" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-x86_64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.43/opencode-linux-x64.tar.gz" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.45/opencode-linux-x64.tar.gz" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.windows-x86_64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.43/opencode-windows-x64.zip" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.1.45/opencode-windows-x64.zip" cmd = "./opencode.exe" args = ["acp"] diff --git a/packages/function/package.json b/packages/function/package.json index 4a9e82def5..9746d11dcc 100644 --- a/packages/function/package.json +++ b/packages/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/function", - "version": "1.1.43", + "version": "1.1.45", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/opencode/package.json b/packages/opencode/package.json index bd77afa2e8..ab28687d35 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "1.1.43", + "version": "1.1.45", "name": "opencode", "type": "module", "license": "MIT", diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 19077d786d..9e9232a4da 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/plugin", - "version": "1.1.43", + "version": "1.1.45", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index e929d62894..6b550512de 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/sdk", - "version": "1.1.43", + "version": "1.1.45", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/slack/package.json b/packages/slack/package.json index decfd834a7..fbcccac399 100644 --- a/packages/slack/package.json +++ b/packages/slack/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/slack", - "version": "1.1.43", + "version": "1.1.45", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/ui/package.json b/packages/ui/package.json index 2e7a2cfefd..5fde0960ac 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/ui", - "version": "1.1.43", + "version": "1.1.45", "type": "module", "license": "MIT", "exports": { diff --git a/packages/util/package.json b/packages/util/package.json index f76106701b..9a3eb8f7d3 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/util", - "version": "1.1.43", + "version": "1.1.45", "private": true, "type": "module", "license": "MIT", diff --git a/packages/web/package.json b/packages/web/package.json index 0f601ba248..06ab5ef4e9 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -2,7 +2,7 @@ "name": "@opencode-ai/web", "type": "module", "license": "MIT", - "version": "1.1.43", + "version": "1.1.45", "scripts": { "dev": "astro dev", "dev:remote": "VITE_API_URL=https://api.opencode.ai astro dev", diff --git a/sdks/vscode/package.json b/sdks/vscode/package.json index 1ffe553c2c..7c160a454f 100644 --- a/sdks/vscode/package.json +++ b/sdks/vscode/package.json @@ -2,7 +2,7 @@ "name": "opencode", "displayName": "opencode", "description": "opencode for VS Code", - "version": "1.1.43", + "version": "1.1.45", "publisher": "sst-dev", "repository": { "type": "git", From 11d486707cf5e0ff5c35cf4dff531c4f020b70d0 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Fri, 30 Jan 2026 00:56:47 -0600 Subject: [PATCH 02/24] fix: rm ai sdk middleware that was preventing blocks from being sent back as assistant message content (#11270) Co-authored-by: opencode-agent[bot] --- packages/opencode/src/session/llm.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/opencode/src/session/llm.ts b/packages/opencode/src/session/llm.ts index 4c4f4114a2..0c76521045 100644 --- a/packages/opencode/src/session/llm.ts +++ b/packages/opencode/src/session/llm.ts @@ -1,4 +1,3 @@ -import os from "os" import { Installation } from "@/installation" import { Provider } from "@/provider/provider" import { Log } from "@/util/log" @@ -9,7 +8,6 @@ import { type StreamTextResult, type Tool, type ToolSet, - extractReasoningMiddleware, tool, jsonSchema, } from "ai" @@ -261,7 +259,6 @@ export namespace LLM { return args.params }, }, - extractReasoningMiddleware({ tagName: "think", startWithReasoning: false }), ], }), experimental_telemetry: { From 08fa7f71884702df9ee2e69a840a1eaeb5685df7 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 09:32:39 -0500 Subject: [PATCH 03/24] ci --- script/publish.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/script/publish.ts b/script/publish.ts index 84abe6a66a..1294f8d793 100755 --- a/script/publish.ts +++ b/script/publish.ts @@ -63,6 +63,7 @@ if (Script.release) { 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` } console.log("\n=== cli ===\n") From 9493316502729292be463d55553c01c30edd5595 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 09:56:06 -0500 Subject: [PATCH 04/24] ci --- .github/workflows/test-homebrew-clone.yml | 39 +++++++++++++++++++++++ packages/opencode/script/publish.ts | 12 ++++++- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/test-homebrew-clone.yml diff --git a/.github/workflows/test-homebrew-clone.yml b/.github/workflows/test-homebrew-clone.yml new file mode 100644 index 0000000000..309e320636 --- /dev/null +++ b/.github/workflows/test-homebrew-clone.yml @@ -0,0 +1,39 @@ +name: test-homebrew-clone + +on: + workflow_dispatch: {} + +permissions: + contents: read + +jobs: + clone: + runs-on: blacksmith-4vcpu-ubuntu-2404 + steps: + - uses: actions/checkout@v3 + + - 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: Verify token present + run: | + if [ -z "${GITHUB_TOKEN}" ]; then + echo "GITHUB_TOKEN is missing" + exit 1 + fi + echo "GITHUB_TOKEN is present" + env: + GITHUB_TOKEN: ${{ steps.committer.outputs.token }} + + - name: Clone homebrew tap + run: | + tap="https://x-access-token:${GITHUB_TOKEN}@github.com/anomalyco/homebrew-tap.git" + git clone "${tap}" ./dist/homebrew-tap + cd ./dist/homebrew-tap + git status -sb + env: + GITHUB_TOKEN: ${{ steps.committer.outputs.token }} diff --git a/packages/opencode/script/publish.ts b/packages/opencode/script/publish.ts index 8cdeb35b40..9e3eadf87c 100755 --- a/packages/opencode/script/publish.ts +++ b/packages/opencode/script/publish.ts @@ -37,6 +37,7 @@ await Bun.file(`./dist/${pkg.name}/package.json`).write( ), ) +/* const tasks = Object.entries(binaries).map(async ([name]) => { if (process.platform !== "win32") { await $`chmod -R 755 .`.cwd(`./dist/${name}`) @@ -52,6 +53,7 @@ const platforms = "linux/amd64,linux/arm64" const tags = [`${image}:${version}`, `${image}:${Script.channel}`] const tagFlags = tags.flatMap((t) => ["-t", t]) await $`docker buildx build --platform ${platforms} ${tagFlags} --push .` +*/ // registries if (!Script.preview) { @@ -63,6 +65,7 @@ if (!Script.preview) { const [pkgver, _subver = ""] = Script.version.split(/(-.*)/, 2) + /* // arch const binaryPkgbuild = [ "# Maintainer: dax", @@ -176,6 +179,7 @@ if (!Script.preview) { } } } + */ // Homebrew formula const homebrewFormula = [ @@ -230,8 +234,14 @@ if (!Script.preview) { "", ].join("\n") + const token = process.env.GITHUB_TOKEN + if (!token) { + console.error("GITHUB_TOKEN is required to update homebrew tap") + process.exit(1) + } + const tap = `https://x-access-token:${token}@github.com/anomalyco/homebrew-tap.git` await $`rm -rf ./dist/homebrew-tap` - await $`git clone https://${process.env["GITHUB_TOKEN"]}@github.com/sst/homebrew-tap.git ./dist/homebrew-tap` + await $`git clone ${tap} ./dist/homebrew-tap` await Bun.file("./dist/homebrew-tap/opencode.rb").write(homebrewFormula) await $`cd ./dist/homebrew-tap && git add opencode.rb` await $`cd ./dist/homebrew-tap && git commit -m "Update to v${Script.version}"` From 698cf6dfc1614c4519a0ab193f6817d1ab568e6f Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 09:56:21 -0500 Subject: [PATCH 05/24] ci From 97a428cf69ebc4a00201475f9437f97079779f64 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 09:57:17 -0500 Subject: [PATCH 06/24] ci --- .github/workflows/test-homebrew-clone.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test-homebrew-clone.yml b/.github/workflows/test-homebrew-clone.yml index 309e320636..8fd7fd7ec8 100644 --- a/.github/workflows/test-homebrew-clone.yml +++ b/.github/workflows/test-homebrew-clone.yml @@ -1,6 +1,9 @@ name: test-homebrew-clone on: + push: + branches: + - dev workflow_dispatch: {} permissions: From 601744eacd649adc969bb4f978e081ede399ec70 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 09:58:54 -0500 Subject: [PATCH 07/24] sync --- .github/workflows/test-homebrew-clone.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/test-homebrew-clone.yml b/.github/workflows/test-homebrew-clone.yml index 8fd7fd7ec8..bf61cbc5f5 100644 --- a/.github/workflows/test-homebrew-clone.yml +++ b/.github/workflows/test-homebrew-clone.yml @@ -34,6 +34,12 @@ jobs: - name: Clone homebrew tap run: | + echo "Testing old URL pattern" + old="https://${GITHUB_TOKEN}@github.com/sst/homebrew-tap.git" + git clone "${old}" ./dist/homebrew-tap-old + rm -rf ./dist/homebrew-tap-old + + echo "Testing new URL pattern" tap="https://x-access-token:${GITHUB_TOKEN}@github.com/anomalyco/homebrew-tap.git" git clone "${tap}" ./dist/homebrew-tap cd ./dist/homebrew-tap From a530c1b5b6d56f2dba9edaf8458e8029d5e57f2f Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:02:05 -0500 Subject: [PATCH 08/24] ci --- .github/workflows/test-homebrew-clone.yml | 48 ----------------------- 1 file changed, 48 deletions(-) delete mode 100644 .github/workflows/test-homebrew-clone.yml diff --git a/.github/workflows/test-homebrew-clone.yml b/.github/workflows/test-homebrew-clone.yml deleted file mode 100644 index bf61cbc5f5..0000000000 --- a/.github/workflows/test-homebrew-clone.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: test-homebrew-clone - -on: - push: - branches: - - dev - workflow_dispatch: {} - -permissions: - contents: read - -jobs: - clone: - runs-on: blacksmith-4vcpu-ubuntu-2404 - steps: - - uses: actions/checkout@v3 - - - 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: Verify token present - run: | - if [ -z "${GITHUB_TOKEN}" ]; then - echo "GITHUB_TOKEN is missing" - exit 1 - fi - echo "GITHUB_TOKEN is present" - env: - GITHUB_TOKEN: ${{ steps.committer.outputs.token }} - - - name: Clone homebrew tap - run: | - echo "Testing old URL pattern" - old="https://${GITHUB_TOKEN}@github.com/sst/homebrew-tap.git" - git clone "${old}" ./dist/homebrew-tap-old - rm -rf ./dist/homebrew-tap-old - - echo "Testing new URL pattern" - tap="https://x-access-token:${GITHUB_TOKEN}@github.com/anomalyco/homebrew-tap.git" - git clone "${tap}" ./dist/homebrew-tap - cd ./dist/homebrew-tap - git status -sb - env: - GITHUB_TOKEN: ${{ steps.committer.outputs.token }} From abb87eac8f9a795ead817a062c3f614c315faf05 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:08:28 -0500 Subject: [PATCH 09/24] ci --- .github/workflows/beta.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml index f7180ea1ee..b941311d30 100644 --- a/.github/workflows/beta.yml +++ b/.github/workflows/beta.yml @@ -23,12 +23,14 @@ jobs: - name: Setup Bun uses: ./.github/actions/setup-bun - - name: Configure Git - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" + - name: Setup Git Committer + id: setup-git-committer + uses: ./.github/actions/setup-git-committer + with: + opencode-app-id: ${{ secrets.OPENCODE_APP_ID }} + opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }} - name: Sync beta branch env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ steps.setup-git-committer.outputs.token }} run: bun script/beta.ts From ad5d495b2c360a7368671899268406b0a50a5220 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:09:27 -0500 Subject: [PATCH 10/24] ci --- .github/workflows/beta.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml index b941311d30..f7ad115a29 100644 --- a/.github/workflows/beta.yml +++ b/.github/workflows/beta.yml @@ -27,7 +27,7 @@ jobs: id: setup-git-committer uses: ./.github/actions/setup-git-committer with: - opencode-app-id: ${{ secrets.OPENCODE_APP_ID }} + opencode-app-id: ${{ vars.OPENCODE_APP_ID }} opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }} - name: Sync beta branch From 5e823fd20872cef9aee1eb791abdd94666b7e74c Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:11:05 -0500 Subject: [PATCH 11/24] ci --- script/beta.ts | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/script/beta.ts b/script/beta.ts index eb61540fe7..ff511d9286 100755 --- a/script/beta.ts +++ b/script/beta.ts @@ -49,24 +49,8 @@ async function main() { continue } - // Try to rebase onto current beta branch - console.log(` Attempting to rebase PR #${pr.number}...`) - const rebase = await $`git rebase beta pr-${pr.number}`.nothrow() - if (rebase.exitCode !== 0) { - console.log(` Rebase failed for PR #${pr.number} (has conflicts)`) - await $`git rebase --abort`.nothrow() - await $`git checkout beta`.nothrow() - skipped.push({ number: pr.number, reason: "Rebase failed (conflicts)" }) - continue - } - - // Move rebased commits to pr-${pr.number} branch and checkout back to beta - await $`git checkout -B pr-${pr.number}`.nothrow() - await $`git checkout beta`.nothrow() - - console.log(` Successfully rebased PR #${pr.number}`) - - // Now squash merge the rebased PR + // Try to squash merge the PR directly + console.log(` Attempting to merge PR #${pr.number}...`) const merge = await $`git merge --squash pr-${pr.number}`.nothrow() if (merge.exitCode !== 0) { console.log(` Squash merge failed for PR #${pr.number}`) From 4a4fc48ee8ee193c73c0be143a06c00c01ba5902 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:12:29 -0500 Subject: [PATCH 12/24] ci --- script/beta.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/beta.ts b/script/beta.ts index ff511d9286..7884fd2483 100755 --- a/script/beta.ts +++ b/script/beta.ts @@ -49,9 +49,9 @@ async function main() { continue } - // Try to squash merge the PR directly + // Try to squash merge the PR directly (allow unrelated histories since beta starts fresh from dev) console.log(` Attempting to merge PR #${pr.number}...`) - const merge = await $`git merge --squash pr-${pr.number}`.nothrow() + const merge = await $`git merge --squash --allow-unrelated-histories pr-${pr.number}`.nothrow() if (merge.exitCode !== 0) { console.log(` Squash merge failed for PR #${pr.number}`) console.log(` Error: ${merge.stderr}`) From 0a0b54aa4b3ea20f45652bfc9d982922584e8448 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:15:45 -0500 Subject: [PATCH 13/24] ci --- script/beta.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/beta.ts b/script/beta.ts index 7884fd2483..a1a07ce9ab 100755 --- a/script/beta.ts +++ b/script/beta.ts @@ -100,7 +100,7 @@ async function main() { skipped.forEach((x) => console.log(` - PR #${x.number}: ${x.reason}`)) console.log("\nForce pushing beta branch...") - const push = await $`git push origin beta --force`.nothrow() + const push = await $`git push origin beta --force --no-verify`.nothrow() if (push.exitCode !== 0) { throw new Error(`Failed to push beta branch: ${push.stderr}`) } From 0d53f34c43a6e6f09a734e91b13332bcad9499da Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:20:49 -0500 Subject: [PATCH 14/24] ci --- script/beta.ts | 53 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/script/beta.ts b/script/beta.ts index a1a07ce9ab..2318ad68e1 100755 --- a/script/beta.ts +++ b/script/beta.ts @@ -49,33 +49,50 @@ async function main() { continue } - // Try to squash merge the PR directly (allow unrelated histories since beta starts fresh from dev) - console.log(` Attempting to merge PR #${pr.number}...`) - const merge = await $`git merge --squash --allow-unrelated-histories pr-${pr.number}`.nothrow() - if (merge.exitCode !== 0) { - console.log(` Squash merge failed for PR #${pr.number}`) - console.log(` Error: ${merge.stderr}`) - await $`git reset --hard HEAD`.nothrow() - skipped.push({ number: pr.number, reason: `Squash merge failed: ${merge.stderr}` }) + // Get diff from PR base to PR head and apply it + console.log(` Getting diff for PR #${pr.number}...`) + const diff = await $`git diff HEAD...pr-${pr.number}`.nothrow() + if (diff.exitCode !== 0) { + console.log(` Failed to get diff for PR #${pr.number}`) + console.log(` Error: ${diff.stderr}`) + skipped.push({ number: pr.number, reason: `Failed to get diff: ${diff.stderr}` }) continue } + if (!diff.stdout.trim()) { + console.log(` No changes in PR #${pr.number}, skipping`) + skipped.push({ number: pr.number, reason: "No changes" }) + continue + } + + // Apply the diff + console.log(` Applying diff for PR #${pr.number}...`) + const apply = await Bun.spawn(["git", "apply"], { + stdin: new TextEncoder().encode(diff.stdout), + stdout: "pipe", + stderr: "pipe", + }) + const applyExit = await apply.exited + const applyStderr = await Bun.readableStreamToText(apply.stderr) + + if (applyExit !== 0) { + console.log(` Failed to apply diff for PR #${pr.number}`) + console.log(` Error: ${applyStderr}`) + await $`git checkout -- .`.nothrow() + skipped.push({ number: pr.number, reason: `Failed to apply diff: ${applyStderr}` }) + continue + } + + // Stage all changes const add = await $`git add -A`.nothrow() if (add.exitCode !== 0) { console.log(` Failed to stage changes for PR #${pr.number}`) - await $`git reset --hard HEAD`.nothrow() + await $`git checkout -- .`.nothrow() skipped.push({ number: pr.number, reason: "Failed to stage" }) continue } - const status = await $`git status --porcelain`.nothrow() - if (status.exitCode !== 0 || !status.stdout.trim()) { - console.log(` No changes to commit for PR #${pr.number}, skipping`) - await $`git reset --hard HEAD`.nothrow() - skipped.push({ number: pr.number, reason: "No changes to commit" }) - continue - } - + // Commit const commitMsg = `Apply PR #${pr.number}: ${pr.title}` const commit = await Bun.spawn(["git", "commit", "-m", commitMsg], { stdout: "pipe", stderr: "pipe" }) const commitExit = await commit.exited @@ -84,7 +101,7 @@ async function main() { if (commitExit !== 0) { console.log(` Failed to commit PR #${pr.number}`) console.log(` Error: ${commitStderr}`) - await $`git reset --hard HEAD`.nothrow() + await $`git checkout -- .`.nothrow() skipped.push({ number: pr.number, reason: `Commit failed: ${commitStderr}` }) continue } From b9e9c8c76397b6ed2b710c67499170f9951f5e0f Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:21:47 -0500 Subject: [PATCH 15/24] ci --- script/beta.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/beta.ts b/script/beta.ts index 2318ad68e1..19b2f45640 100755 --- a/script/beta.ts +++ b/script/beta.ts @@ -49,9 +49,9 @@ async function main() { continue } - // Get diff from PR base to PR head and apply it + // Get diff from dev to PR head (PR's changes) console.log(` Getting diff for PR #${pr.number}...`) - const diff = await $`git diff HEAD...pr-${pr.number}`.nothrow() + const diff = await $`git diff dev..pr-${pr.number}`.nothrow() if (diff.exitCode !== 0) { console.log(` Failed to get diff for PR #${pr.number}`) console.log(` Error: ${diff.stderr}`) From 3f57f4913d8e6be835872bbbd42c167714103af7 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:23:19 -0500 Subject: [PATCH 16/24] ci --- script/beta.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/script/beta.ts b/script/beta.ts index 19b2f45640..401ca79901 100755 --- a/script/beta.ts +++ b/script/beta.ts @@ -49,9 +49,18 @@ async function main() { continue } - // Get diff from dev to PR head (PR's changes) + // Find merge base and get diff from base to PR head (just the PR's changes) + console.log(` Finding merge base for PR #${pr.number}...`) + const mergeBaseResult = await $`git merge-base dev pr-${pr.number}`.nothrow() + if (mergeBaseResult.exitCode !== 0 || !mergeBaseResult.stdout.trim()) { + console.log(` Failed to find merge base for PR #${pr.number}`) + skipped.push({ number: pr.number, reason: "Failed to find merge base" }) + continue + } + const mergeBase = mergeBaseResult.stdout.trim() + console.log(` Getting diff for PR #${pr.number}...`) - const diff = await $`git diff dev..pr-${pr.number}`.nothrow() + const diff = await $`git diff ${mergeBase}..pr-${pr.number}`.nothrow() if (diff.exitCode !== 0) { console.log(` Failed to get diff for PR #${pr.number}`) console.log(` Error: ${diff.stderr}`) From e0b60d9f34e411ff495c4fd9891a6d92d6bb8ad8 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:25:10 -0500 Subject: [PATCH 17/24] ci --- script/beta.ts | 82 +++++++++++++++++--------------------------------- 1 file changed, 27 insertions(+), 55 deletions(-) diff --git a/script/beta.ts b/script/beta.ts index 401ca79901..7f51ff7936 100755 --- a/script/beta.ts +++ b/script/beta.ts @@ -2,26 +2,19 @@ interface PR { number: number - headRefName: string - headRefOid: string - createdAt: string - isDraft: boolean title: string } async function main() { console.log("Fetching open contributor PRs...") - const prsResult = - await $`gh pr list --label contributor --state open --json number,headRefName,headRefOid,createdAt,isDraft,title --limit 100`.nothrow() + const prsResult = await $`gh pr list --label contributor --state open --json number,title --limit 100`.nothrow() if (prsResult.exitCode !== 0) { throw new Error(`Failed to fetch PRs: ${prsResult.stderr}`) } - const allPRs: PR[] = JSON.parse(prsResult.stdout) - const prs = allPRs.filter((pr) => !pr.isDraft) - - console.log(`Found ${prs.length} open non-draft contributor PRs`) + const prs: PR[] = JSON.parse(prsResult.stdout) + console.log(`Found ${prs.length} open contributor PRs`) console.log("Fetching latest dev branch...") const fetchDev = await $`git fetch origin dev`.nothrow() @@ -41,43 +34,25 @@ async function main() { for (const pr of prs) { console.log(`\nProcessing PR #${pr.number}: ${pr.title}`) - // Fetch the PR - const fetchPR = await $`git fetch origin pull/${pr.number}/head:pr-${pr.number}`.nothrow() - if (fetchPR.exitCode !== 0) { - console.log(` Failed to fetch PR #${pr.number}, skipping`) - skipped.push({ number: pr.number, reason: "Failed to fetch" }) + // Get the diff from GitHub + console.log(` Getting diff...`) + const diffResult = await $`gh pr diff ${pr.number}`.nothrow() + if (diffResult.exitCode !== 0) { + console.log(` Failed to get diff`) + skipped.push({ number: pr.number, reason: `Failed to get diff: ${diffResult.stderr}` }) continue } - // Find merge base and get diff from base to PR head (just the PR's changes) - console.log(` Finding merge base for PR #${pr.number}...`) - const mergeBaseResult = await $`git merge-base dev pr-${pr.number}`.nothrow() - if (mergeBaseResult.exitCode !== 0 || !mergeBaseResult.stdout.trim()) { - console.log(` Failed to find merge base for PR #${pr.number}`) - skipped.push({ number: pr.number, reason: "Failed to find merge base" }) - continue - } - const mergeBase = mergeBaseResult.stdout.trim() - - console.log(` Getting diff for PR #${pr.number}...`) - const diff = await $`git diff ${mergeBase}..pr-${pr.number}`.nothrow() - if (diff.exitCode !== 0) { - console.log(` Failed to get diff for PR #${pr.number}`) - console.log(` Error: ${diff.stderr}`) - skipped.push({ number: pr.number, reason: `Failed to get diff: ${diff.stderr}` }) - continue - } - - if (!diff.stdout.trim()) { - console.log(` No changes in PR #${pr.number}, skipping`) + if (!diffResult.stdout.trim()) { + console.log(` No changes, skipping`) skipped.push({ number: pr.number, reason: "No changes" }) continue } - // Apply the diff - console.log(` Applying diff for PR #${pr.number}...`) - const apply = await Bun.spawn(["git", "apply"], { - stdin: new TextEncoder().encode(diff.stdout), + // Try to apply the diff + console.log(` Applying...`) + const apply = await Bun.spawn(["git", "apply", "--3way"], { + stdin: new TextEncoder().encode(diffResult.stdout), stdout: "pipe", stderr: "pipe", }) @@ -85,37 +60,34 @@ async function main() { const applyStderr = await Bun.readableStreamToText(apply.stderr) if (applyExit !== 0) { - console.log(` Failed to apply diff for PR #${pr.number}`) - console.log(` Error: ${applyStderr}`) + console.log(` Failed to apply (conflicts)`) await $`git checkout -- .`.nothrow() - skipped.push({ number: pr.number, reason: `Failed to apply diff: ${applyStderr}` }) + await $`git clean -fd`.nothrow() + skipped.push({ number: pr.number, reason: "Has conflicts" }) continue } - // Stage all changes + // Stage and commit const add = await $`git add -A`.nothrow() if (add.exitCode !== 0) { - console.log(` Failed to stage changes for PR #${pr.number}`) + console.log(` Failed to stage`) await $`git checkout -- .`.nothrow() + await $`git clean -fd`.nothrow() skipped.push({ number: pr.number, reason: "Failed to stage" }) continue } - // Commit const commitMsg = `Apply PR #${pr.number}: ${pr.title}` - const commit = await Bun.spawn(["git", "commit", "-m", commitMsg], { stdout: "pipe", stderr: "pipe" }) - const commitExit = await commit.exited - const commitStderr = await Bun.readableStreamToText(commit.stderr) - - if (commitExit !== 0) { - console.log(` Failed to commit PR #${pr.number}`) - console.log(` Error: ${commitStderr}`) + const commit = await $`git commit -m ${commitMsg}`.nothrow() + if (commit.exitCode !== 0) { + console.log(` Failed to commit`) await $`git checkout -- .`.nothrow() - skipped.push({ number: pr.number, reason: `Commit failed: ${commitStderr}` }) + await $`git clean -fd`.nothrow() + skipped.push({ number: pr.number, reason: `Commit failed: ${commit.stderr}` }) continue } - console.log(` Successfully applied PR #${pr.number}`) + console.log(` Applied successfully`) applied.push(pr.number) } From 9cf3e651ca7bb1a7e28f3590fa846cf79bffa129 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:26:55 -0500 Subject: [PATCH 18/24] ci --- script/beta.ts | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/script/beta.ts b/script/beta.ts index 7f51ff7936..5cbdbfb552 100755 --- a/script/beta.ts +++ b/script/beta.ts @@ -5,6 +5,19 @@ interface PR { title: string } +interface Repo { + nameWithOwner: string +} + +interface HeadRepo { + nameWithOwner: string +} + +interface PRHead { + headRefName: string + headRepository: HeadRepo +} + async function main() { console.log("Fetching open contributor PRs...") @@ -16,6 +29,12 @@ async function main() { const prs: PR[] = JSON.parse(prsResult.stdout) console.log(`Found ${prs.length} open contributor PRs`) + const repoResult = await $`gh repo view --json nameWithOwner`.nothrow() + if (repoResult.exitCode !== 0) { + throw new Error(`Failed to fetch repo info: ${repoResult.stderr}`) + } + const repo: Repo = JSON.parse(repoResult.stdout) + console.log("Fetching latest dev branch...") const fetchDev = await $`git fetch origin dev`.nothrow() if (fetchDev.exitCode !== 0) { @@ -34,9 +53,18 @@ async function main() { for (const pr of prs) { console.log(`\nProcessing PR #${pr.number}: ${pr.title}`) - // Get the diff from GitHub + const headResult = await $`gh pr view ${pr.number} --json headRefName,headRepository`.nothrow() + if (headResult.exitCode !== 0) { + console.log(` Failed to get head info`) + skipped.push({ number: pr.number, reason: `Failed to get head info: ${headResult.stderr}` }) + continue + } + const head: PRHead = JSON.parse(headResult.stdout) + + // Get the diff from GitHub compare API console.log(` Getting diff...`) - const diffResult = await $`gh pr diff ${pr.number}`.nothrow() + const compare = `${repo.nameWithOwner}/compare/dev...${head.headRepository.nameWithOwner}:${head.headRefName}` + const diffResult = await $`gh api -H Accept:application/vnd.github.v3.diff repos/${compare}`.nothrow() if (diffResult.exitCode !== 0) { console.log(` Failed to get diff`) skipped.push({ number: pr.number, reason: `Failed to get diff: ${diffResult.stderr}` }) @@ -80,7 +108,7 @@ async function main() { const commitMsg = `Apply PR #${pr.number}: ${pr.title}` const commit = await $`git commit -m ${commitMsg}`.nothrow() if (commit.exitCode !== 0) { - console.log(` Failed to commit`) + console.log(` Failed to commit: ${commit.stderr}`) await $`git checkout -- .`.nothrow() await $`git clean -fd`.nothrow() skipped.push({ number: pr.number, reason: `Commit failed: ${commit.stderr}` }) From e4d3b961cd2217e19cd44f6b97dd92b485966afb Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:28:12 -0500 Subject: [PATCH 19/24] ci --- script/beta.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/script/beta.ts b/script/beta.ts index 5cbdbfb552..92625a8547 100755 --- a/script/beta.ts +++ b/script/beta.ts @@ -106,12 +106,17 @@ async function main() { } const commitMsg = `Apply PR #${pr.number}: ${pr.title}` - const commit = await $`git commit -m ${commitMsg}`.nothrow() - if (commit.exitCode !== 0) { - console.log(` Failed to commit: ${commit.stderr}`) + const commit = await Bun.spawn(["git", "commit", "-m", commitMsg], { + stdout: "pipe", + stderr: "pipe", + }) + const commitExit = await commit.exited + const commitStderr = await Bun.readableStreamToText(commit.stderr) + if (commitExit !== 0) { + console.log(` Failed to commit: ${commitStderr}`) await $`git checkout -- .`.nothrow() await $`git clean -fd`.nothrow() - skipped.push({ number: pr.number, reason: `Commit failed: ${commit.stderr}` }) + skipped.push({ number: pr.number, reason: `Commit failed: ${commitStderr}` }) continue } From 7fb22ab6819e6fc1486319d91f27782ad3541708 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:28:54 -0500 Subject: [PATCH 20/24] ci --- script/beta.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/script/beta.ts b/script/beta.ts index 92625a8547..f87e507547 100755 --- a/script/beta.ts +++ b/script/beta.ts @@ -66,7 +66,8 @@ async function main() { const compare = `${repo.nameWithOwner}/compare/dev...${head.headRepository.nameWithOwner}:${head.headRefName}` const diffResult = await $`gh api -H Accept:application/vnd.github.v3.diff repos/${compare}`.nothrow() if (diffResult.exitCode !== 0) { - console.log(` Failed to get diff`) + console.log(` Failed to get diff: ${diffResult.stderr}`) + console.log(` Compare: ${compare}`) skipped.push({ number: pr.number, reason: `Failed to get diff: ${diffResult.stderr}` }) continue } From 9a0132e7507ebc68511396f80757dfa90fe60276 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:35:39 -0500 Subject: [PATCH 21/24] ci --- script/beta.ts | 102 +++++++++++++++++++------------------------------ 1 file changed, 39 insertions(+), 63 deletions(-) mode change 100755 => 100644 script/beta.ts diff --git a/script/beta.ts b/script/beta.ts old mode 100755 new mode 100644 index f87e507547..7a3dfcccf4 --- a/script/beta.ts +++ b/script/beta.ts @@ -5,17 +5,10 @@ interface PR { title: string } -interface Repo { - nameWithOwner: string -} - -interface HeadRepo { - nameWithOwner: string -} - -interface PRHead { - headRefName: string - headRepository: HeadRepo +interface RunResult { + exitCode: number + stdout: string + stderr: string } async function main() { @@ -29,12 +22,6 @@ async function main() { const prs: PR[] = JSON.parse(prsResult.stdout) console.log(`Found ${prs.length} open contributor PRs`) - const repoResult = await $`gh repo view --json nameWithOwner`.nothrow() - if (repoResult.exitCode !== 0) { - throw new Error(`Failed to fetch repo info: ${repoResult.stderr}`) - } - const repo: Repo = JSON.parse(repoResult.stdout) - console.log("Fetching latest dev branch...") const fetchDev = await $`git fetch origin dev`.nothrow() if (fetchDev.exitCode !== 0) { @@ -53,53 +40,35 @@ async function main() { for (const pr of prs) { console.log(`\nProcessing PR #${pr.number}: ${pr.title}`) - const headResult = await $`gh pr view ${pr.number} --json headRefName,headRepository`.nothrow() - if (headResult.exitCode !== 0) { - console.log(` Failed to get head info`) - skipped.push({ number: pr.number, reason: `Failed to get head info: ${headResult.stderr}` }) - continue - } - const head: PRHead = JSON.parse(headResult.stdout) - - // Get the diff from GitHub compare API - console.log(` Getting diff...`) - const compare = `${repo.nameWithOwner}/compare/dev...${head.headRepository.nameWithOwner}:${head.headRefName}` - const diffResult = await $`gh api -H Accept:application/vnd.github.v3.diff repos/${compare}`.nothrow() - if (diffResult.exitCode !== 0) { - console.log(` Failed to get diff: ${diffResult.stderr}`) - console.log(` Compare: ${compare}`) - skipped.push({ number: pr.number, reason: `Failed to get diff: ${diffResult.stderr}` }) + console.log(" Fetching PR head...") + const fetch = await run(["git", "fetch", "origin", `pull/${pr.number}/head:pr/${pr.number}`]) + if (fetch.exitCode !== 0) { + console.log(` Failed to fetch PR head: ${fetch.stderr}`) + skipped.push({ number: pr.number, reason: `Fetch failed: ${fetch.stderr}` }) continue } - if (!diffResult.stdout.trim()) { - console.log(` No changes, skipping`) - skipped.push({ number: pr.number, reason: "No changes" }) - continue - } - - // Try to apply the diff - console.log(` Applying...`) - const apply = await Bun.spawn(["git", "apply", "--3way"], { - stdin: new TextEncoder().encode(diffResult.stdout), - stdout: "pipe", - stderr: "pipe", - }) - const applyExit = await apply.exited - const applyStderr = await Bun.readableStreamToText(apply.stderr) - - if (applyExit !== 0) { - console.log(` Failed to apply (conflicts)`) + console.log(" Merging...") + const merge = await run(["git", "merge", "--no-commit", "--no-ff", `pr/${pr.number}`]) + if (merge.exitCode !== 0) { + console.log(" Failed to merge (conflicts)") + await $`git merge --abort`.nothrow() await $`git checkout -- .`.nothrow() await $`git clean -fd`.nothrow() skipped.push({ number: pr.number, reason: "Has conflicts" }) continue } - // Stage and commit + const mergeHead = await $`git rev-parse -q --verify MERGE_HEAD`.nothrow() + if (mergeHead.exitCode !== 0) { + console.log(" No changes, skipping") + skipped.push({ number: pr.number, reason: "No changes" }) + continue + } + const add = await $`git add -A`.nothrow() if (add.exitCode !== 0) { - console.log(` Failed to stage`) + console.log(" Failed to stage") await $`git checkout -- .`.nothrow() await $`git clean -fd`.nothrow() skipped.push({ number: pr.number, reason: "Failed to stage" }) @@ -107,21 +76,16 @@ async function main() { } const commitMsg = `Apply PR #${pr.number}: ${pr.title}` - const commit = await Bun.spawn(["git", "commit", "-m", commitMsg], { - stdout: "pipe", - stderr: "pipe", - }) - const commitExit = await commit.exited - const commitStderr = await Bun.readableStreamToText(commit.stderr) - if (commitExit !== 0) { - console.log(` Failed to commit: ${commitStderr}`) + const commit = await run(["git", "commit", "-m", commitMsg]) + if (commit.exitCode !== 0) { + console.log(` Failed to commit: ${commit.stderr}`) await $`git checkout -- .`.nothrow() await $`git clean -fd`.nothrow() - skipped.push({ number: pr.number, reason: `Commit failed: ${commitStderr}` }) + skipped.push({ number: pr.number, reason: `Commit failed: ${commit.stderr}` }) continue } - console.log(` Applied successfully`) + console.log(" Applied successfully") applied.push(pr.number) } @@ -145,6 +109,18 @@ main().catch((err) => { process.exit(1) }) +async function run(args: string[], stdin?: Uint8Array): Promise { + const proc = Bun.spawn(args, { + stdin: stdin ?? "inherit", + stdout: "pipe", + stderr: "pipe", + }) + const exitCode = await proc.exited + const stdout = await new Response(proc.stdout).text() + const stderr = await new Response(proc.stderr).text() + return { exitCode, stdout, stderr } +} + function $(strings: TemplateStringsArray, ...values: unknown[]) { const cmd = strings.reduce((acc, str, i) => acc + str + (values[i] ?? ""), "") return { From e80a99e7bd458a68dbca2e24ee1e19c3d18f1d7f Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:36:01 -0500 Subject: [PATCH 22/24] ci --- script/beta.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 script/beta.ts diff --git a/script/beta.ts b/script/beta.ts old mode 100644 new mode 100755 From 2e005de670b53de126b08c8a0b92358815b4962f Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:38:10 -0500 Subject: [PATCH 23/24] ci --- script/beta.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/script/beta.ts b/script/beta.ts index 7a3dfcccf4..68cbd1097a 100755 --- a/script/beta.ts +++ b/script/beta.ts @@ -34,6 +34,18 @@ async function main() { throw new Error(`Failed to checkout beta branch: ${checkoutBeta.stderr}`) } + const shallow = await run(["git", "rev-parse", "--is-shallow-repository"]) + if (shallow.exitCode !== 0) { + throw new Error(`Failed to check shallow state: ${shallow.stderr}`) + } + if (shallow.stdout.trim() === "true") { + console.log("Unshallowing repository...") + const unshallow = await run(["git", "fetch", "--unshallow"]) + if (unshallow.exitCode !== 0) { + throw new Error(`Failed to unshallow repository: ${unshallow.stderr}`) + } + } + const applied: number[] = [] const skipped: Array<{ number: number; reason: string }> = [] From 1aade4b30817b8ecd2edb708737ed554879c2f28 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 30 Jan 2026 10:39:59 -0500 Subject: [PATCH 24/24] ci --- .github/workflows/beta.yml | 2 ++ script/beta.ts | 12 ------------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml index f7ad115a29..b9aa498962 100644 --- a/.github/workflows/beta.yml +++ b/.github/workflows/beta.yml @@ -19,6 +19,8 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Setup Bun uses: ./.github/actions/setup-bun diff --git a/script/beta.ts b/script/beta.ts index 68cbd1097a..7a3dfcccf4 100755 --- a/script/beta.ts +++ b/script/beta.ts @@ -34,18 +34,6 @@ async function main() { throw new Error(`Failed to checkout beta branch: ${checkoutBeta.stderr}`) } - const shallow = await run(["git", "rev-parse", "--is-shallow-repository"]) - if (shallow.exitCode !== 0) { - throw new Error(`Failed to check shallow state: ${shallow.stderr}`) - } - if (shallow.stdout.trim() === "true") { - console.log("Unshallowing repository...") - const unshallow = await run(["git", "fetch", "--unshallow"]) - if (unshallow.exitCode !== 0) { - throw new Error(`Failed to unshallow repository: ${unshallow.stderr}`) - } - } - const applied: number[] = [] const skipped: Array<{ number: number; reason: string }> = []