From 315c9427a56c4cc0d0a4c5dfcf05b587603eac85 Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Sat, 1 Aug 2026 18:08:03 +0800 Subject: [PATCH] chore: Fix full auto release process (#7660) --- .github/workflows/release-beta.yml | 3 +++ .github/workflows/release-final.yml | 3 +++ extra/release/finish.mjs | 30 ++++++++++++++++++----------- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/.github/workflows/release-beta.yml b/.github/workflows/release-beta.yml index a4fb8f497..2e4c15138 100644 --- a/.github/workflows/release-beta.yml +++ b/.github/workflows/release-beta.yml @@ -76,6 +76,9 @@ jobs: username: ${{ secrets.GHCR_USERNAME }} password: ${{ secrets.GHCR_TOKEN }} + - name: Install opencode + run: curl -fsSL https://opencode.ai/install | bash + - name: Run release-beta env: RELEASE_BETA_VERSION: ${{ inputs.version }} diff --git a/.github/workflows/release-final.yml b/.github/workflows/release-final.yml index 333314073..045d243e5 100644 --- a/.github/workflows/release-final.yml +++ b/.github/workflows/release-final.yml @@ -76,6 +76,9 @@ jobs: username: ${{ secrets.GHCR_USERNAME }} password: ${{ secrets.GHCR_TOKEN }} + - name: Install opencode + run: curl -fsSL https://opencode.ai/install | bash + - name: Run release-final env: RELEASE_VERSION: ${{ inputs.version }} diff --git a/extra/release/finish.mjs b/extra/release/finish.mjs index 0fbdd6c22..71a362f14 100644 --- a/extra/release/finish.mjs +++ b/extra/release/finish.mjs @@ -49,7 +49,7 @@ const llmPrompt = await getPrompt(previousVersion); try { const result = childProcess.spawnSync( "opencode", - ["-p", llmPrompt, "-f", "text", "-q", "-m", "opencode/big-pickle"], + ["run", "-m", "opencode/big-pickle", "--format", "json", llmPrompt], { encoding: "utf-8", timeout: 120000, @@ -59,18 +59,26 @@ try { ); if (result.status === 0 && result.stdout) { - // Extract JSON from opencode's text output - const jsonMatch = result.stdout.match(/\{[^{}]*"improvements"[^{}]*\}/s) || result.stdout.match(/\{[\s\S]*\}/); - if (jsonMatch) { + // Parse NDJSON output: find "type":"text" line + for (const line of result.stdout.trim().split("\n")) { try { - categorizedMap = JSON.parse(jsonMatch[0]); - console.log("LLM categorization (opencode) applied."); - } catch (e) { - console.warn("Failed to parse opencode JSON output:", e.message); - console.warn("Raw output:", result.stdout.slice(0, 500)); + const obj = JSON.parse(line); + if (obj.type === "text" && obj.part?.text) { + const jsonMatch = obj.part.text.match(/\{[\s\S]*\}/); + if (jsonMatch) { + categorizedMap = JSON.parse(jsonMatch[0]); + console.log("LLM categorization applied."); + break; + } + } + } catch { + // skip unparseable lines } - } else { - console.warn("Could not find JSON in opencode output."); + } + + if (!categorizedMap) { + console.warn("No JSON found in opencode response."); + console.warn("Last 500 chars:", result.stdout.slice(-500)); } } else { console.warn("opencode failed or returned no output (status:", result.status, ")");