From 9e2aed2ece04ef35657149e6312ed6a493b0e386 Mon Sep 17 00:00:00 2001 From: Vincent Koc <25068+vincentkoc@users.noreply.github.com> Date: Sat, 11 Jul 2026 01:12:44 -0700 Subject: [PATCH] fix(release): allow explicit non-publish changelog packing --- scripts/openclaw-prepack.ts | 18 +++++++++++++++++- test/openclaw-prepack.test.ts | 25 +++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/scripts/openclaw-prepack.ts b/scripts/openclaw-prepack.ts index 68a155c3afcc..c18534249af3 100644 --- a/scripts/openclaw-prepack.ts +++ b/scripts/openclaw-prepack.ts @@ -15,6 +15,7 @@ const requiredPreparedPathGroups = [ ]; const requiredControlUiAssetPrefix = "dist/control-ui/assets/"; const DEFAULT_PREPACK_COMMAND_TIMEOUT_MS = 30 * 60 * 1000; +const ALLOW_UNRELEASED_CHANGELOG_ENV = "OPENCLAW_PREPACK_ALLOW_UNRELEASED_CHANGELOG"; type PreparedFileReader = { existsSync: typeof existsSync; @@ -118,6 +119,19 @@ export function resolvePrepackCommandTimeoutMs(env: NodeJS.ProcessEnv = process. ); } +export function resolvePrepackAllowUnreleasedChangelog( + env: NodeJS.ProcessEnv = process.env, +): boolean { + const raw = env[ALLOW_UNRELEASED_CHANGELOG_ENV]?.trim(); + if (raw === undefined || raw === "" || raw === "0" || raw === "false") { + return false; + } + if (raw === "1" || raw === "true") { + return true; + } + throw new Error(`invalid ${ALLOW_UNRELEASED_CHANGELOG_ENV}: ${raw}`); +} + export function resolvePrepackCommandStdio( options: SpawnSyncOptions, env: NodeJS.ProcessEnv = process.env, @@ -209,7 +223,9 @@ async function main(): Promise { ensurePreparedArtifacts(); await writeDistInventory(); runBuildSmoke(); - await preparePackageChangelog(); + await preparePackageChangelog(process.cwd(), { + allowUnreleased: resolvePrepackAllowUnreleasedChangelog(), + }); } if (import.meta.url === pathToFileURL(process.argv[1] ?? "").href) { diff --git a/test/openclaw-prepack.test.ts b/test/openclaw-prepack.test.ts index 91afc06af9f2..c24d4cc3577c 100644 --- a/test/openclaw-prepack.test.ts +++ b/test/openclaw-prepack.test.ts @@ -2,12 +2,37 @@ import { describe, expect, it } from "vitest"; import { collectPreparedPrepackErrors, + resolvePrepackAllowUnreleasedChangelog, resolvePrepackBuildEnvironment, resolvePrepackCommandStdio, resolvePrepackCommandTimeoutMs, runPrepackCommand, } from "../scripts/openclaw-prepack.ts"; +describe("resolvePrepackAllowUnreleasedChangelog", () => { + it("requires an explicit non-publish opt-in", () => { + for (const raw of [undefined, "", "0", "false"]) { + expect( + resolvePrepackAllowUnreleasedChangelog({ + OPENCLAW_PREPACK_ALLOW_UNRELEASED_CHANGELOG: raw, + }), + ).toBe(false); + } + for (const raw of ["1", "true"]) { + expect( + resolvePrepackAllowUnreleasedChangelog({ + OPENCLAW_PREPACK_ALLOW_UNRELEASED_CHANGELOG: raw, + }), + ).toBe(true); + } + expect(() => + resolvePrepackAllowUnreleasedChangelog({ + OPENCLAW_PREPACK_ALLOW_UNRELEASED_CHANGELOG: "yes", + }), + ).toThrow("invalid OPENCLAW_PREPACK_ALLOW_UNRELEASED_CHANGELOG: yes"); + }); +}); + describe("resolvePrepackBuildEnvironment", () => { it("pins one timestamp across package and Control UI builds", () => { const commit = "0123456789abcdef0123456789abcdef01234567";