From 83fedf16b223895f654d621a7621b779643b2832 Mon Sep 17 00:00:00 2001 From: dongjiang Date: Wed, 29 Jul 2026 11:45:14 +0800 Subject: [PATCH 1/2] fix(release): skip GitHub Packages publish when version already exists MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The release workflow fails with 409 Conflict when re-pushing a tag because GitHub Packages does not allow overwriting existing versions. Add versionExistsOnRegistry() check before publishing — if the version already exists, skip with a [SKIP] message instead of failing. Signed-off-by: dongjiang --- scripts/publish-npm.mjs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/scripts/publish-npm.mjs b/scripts/publish-npm.mjs index c6327d2..bebe1cb 100644 --- a/scripts/publish-npm.mjs +++ b/scripts/publish-npm.mjs @@ -55,6 +55,14 @@ function publishToNpm(publishArgs) { } } +function versionExistsOnRegistry(name, version, registry) { + const r = spawnSync("npm", ["view", `${name}@${version}`, "version", "--registry", registry], { + encoding: "utf8", + stdio: ["pipe", "pipe", "pipe"], + }); + return r.status === 0 && r.stdout.trim() === version; +} + function publishToGitHubPackages(publishArgs) { const staging = mkdtempSync(join(tmpdir(), "ghpkg-")); try { @@ -72,6 +80,7 @@ function publishToGitHubPackages(publishArgs) { const pj = JSON.parse(readFileSync(pjPath, "utf8")); // Rewrite package name and dependency keys + const originalName = pj.name; pj.name = rewriteScope(pj.name); for (const field of ["dependencies", "peerDependencies", "optionalDependencies"]) { if (!pj[field]) continue; @@ -99,6 +108,12 @@ function publishToGitHubPackages(publishArgs) { } } + // Skip if this version already exists on GitHub Packages + if (versionExistsOnRegistry(pj.name, pj.version, GHP_REGISTRY)) { + console.log(`[SKIP] ${pj.name}@${pj.version} already exists on GitHub Packages — skipping`); + continue; + } + run("npm", [ "publish", pkgDir, From 40eedc57dc248e18dbce0770ca0077da87af3092 Mon Sep 17 00:00:00 2001 From: dongjiang Date: Wed, 29 Jul 2026 11:54:56 +0800 Subject: [PATCH 2/2] fix: remove unused originalName variable in publish script Signed-off-by: dongjiang --- scripts/publish-npm.mjs | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/publish-npm.mjs b/scripts/publish-npm.mjs index bebe1cb..cf857a6 100644 --- a/scripts/publish-npm.mjs +++ b/scripts/publish-npm.mjs @@ -80,7 +80,6 @@ function publishToGitHubPackages(publishArgs) { const pj = JSON.parse(readFileSync(pjPath, "utf8")); // Rewrite package name and dependency keys - const originalName = pj.name; pj.name = rewriteScope(pj.name); for (const field of ["dependencies", "peerDependencies", "optionalDependencies"]) { if (!pj[field]) continue;