From bbaae459c6979aab46d8625621cbf96c10c932c4 Mon Sep 17 00:00:00 2001 From: Mani Sundararajan <10191300+itsrainingmani@users.noreply.github.com> Date: Mon, 8 Sep 2025 16:14:18 -0400 Subject: [PATCH] feat: make npm package install work on windows (#2419) --- packages/opencode/bin/opencode.cmd | 6 +++-- packages/opencode/script/postinstall.mjs | 5 ++++ packages/opencode/script/preinstall.mjs | 32 ++++++++++++++++++++++++ packages/opencode/script/publish.ts | 2 ++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 packages/opencode/script/preinstall.mjs diff --git a/packages/opencode/bin/opencode.cmd b/packages/opencode/bin/opencode.cmd index 3a4ef3e7..775bfe68 100644 --- a/packages/opencode/bin/opencode.cmd +++ b/packages/opencode/bin/opencode.cmd @@ -52,5 +52,7 @@ echo It seems that your package manager failed to install the right version of t exit /b 1 :execute -rem Execute the binary with all arguments -"%resolved%" %* +rem Execute the binary with all arguments in the same console window +rem Use start /b /wait to ensure it runs in the current shell context for all shells +start /b /wait "" "%resolved%" %* +exit /b %ERRORLEVEL% diff --git a/packages/opencode/script/postinstall.mjs b/packages/opencode/script/postinstall.mjs index 2c697412..40796562 100644 --- a/packages/opencode/script/postinstall.mjs +++ b/packages/opencode/script/postinstall.mjs @@ -70,6 +70,11 @@ function findBinary() { function main() { try { + if (os.platform() === "win32") { + console.log("Windows detected, skipping postinstall") + return + } + const binaryPath = findBinary() const binScript = path.join(__dirname, "bin", "opencode") diff --git a/packages/opencode/script/preinstall.mjs b/packages/opencode/script/preinstall.mjs new file mode 100644 index 00000000..49c8db5e --- /dev/null +++ b/packages/opencode/script/preinstall.mjs @@ -0,0 +1,32 @@ +#!/usr/bin/env node + +import fs from "fs" +import path from "path" +import os from "os" +import { fileURLToPath } from "url" + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) + +function main() { + if (os.platform() !== "win32") { + console.log("Non-Windows platform detected, skipping preinstall") + return + } + + const binDir = path.join(__dirname, "bin") + const unixScript = path.join(binDir, "opencode") + + console.log("Windows detected: Configuring bin scripts for Windows") + + if (fs.existsSync(unixScript)) { + console.log("Removing Unix shell script from bin/") + fs.unlinkSync(unixScript) + } +} + +try { + main() +} catch (error) { + console.error("Preinstall script error:", error.message) + process.exit(0) +} diff --git a/packages/opencode/script/publish.ts b/packages/opencode/script/publish.ts index 33ddeff0..0de48fe6 100755 --- a/packages/opencode/script/publish.ts +++ b/packages/opencode/script/publish.ts @@ -66,6 +66,7 @@ for (const [os, arch] of targets) { await $`mkdir -p ./dist/${pkg.name}` await $`cp -r ./bin ./dist/${pkg.name}/bin` +await $`cp ./script/preinstall.mjs ./dist/${pkg.name}/preinstall.mjs` await $`cp ./script/postinstall.mjs ./dist/${pkg.name}/postinstall.mjs` await Bun.file(`./dist/${pkg.name}/package.json`).write( JSON.stringify( @@ -75,6 +76,7 @@ await Bun.file(`./dist/${pkg.name}/package.json`).write( [pkg.name]: `./bin/${pkg.name}`, }, scripts: { + preinstall: "node ./preinstall.mjs", postinstall: "node ./postinstall.mjs", }, version,