fix(windows): force npm cmd shim generation and update install docs (#2558)

Co-authored-by: Dax <mail@thdxr.com>
Co-authored-by: GitHub Action <action@github.com>
This commit is contained in:
Mani Sundararajan
2025-09-16 03:40:19 -04:00
committed by GitHub
parent 02e492f6eb
commit 15df2710fa
4 changed files with 88 additions and 9 deletions

View File

@@ -68,10 +68,45 @@ function findBinary() {
} }
} }
function main() { async function regenerateWindowsCmdWrappers() {
console.log("Windows + npm detected: Forcing npm to rebuild bin links")
try {
const { execSync } = require("child_process")
const pkgPath = path.join(__dirname, "..")
// npm_config_global is string | undefined
// if it exists, the value is true
const isGlobal = process.env.npm_config_global === "true" || pkgPath.includes(path.join("npm", "node_modules"))
// The npm rebuild command does 2 things - Execute lifecycle scripts and rebuild bin links
// We want to skip lifecycle scripts to avoid infinite loops, so we use --ignore-scripts
const cmd = `npm rebuild opencode-ai --ignore-scripts${isGlobal ? " -g" : ""}`
const opts = {
stdio: "inherit",
shell: true,
...(isGlobal ? {} : { cwd: path.join(pkgPath, "..", "..") }), // For local, run from project root
}
console.log(`Running: ${cmd}`)
execSync(cmd, opts)
console.log("Successfully rebuilt npm bin links")
} catch (error) {
console.error("Error rebuilding npm links:", error.message)
console.error("npm rebuild failed. You may need to manually run: npm rebuild opencode-ai --ignore-scripts")
}
}
async function main() {
try { try {
if (os.platform() === "win32") { if (os.platform() === "win32") {
console.log("Windows detected, skipping postinstall") // NPM eg format - npm/11.4.2 node/v24.4.1 win32 x64
// Bun eg format - bun/1.2.19 npm/? node/v24.3.0 win32 x64
if (process.env.npm_config_user_agent.startsWith("npm")) {
await regenerateWindowsCmdWrappers()
} else {
console.log("Windows detected but not npm, skipping postinstall")
}
return return
} }
@@ -92,4 +127,9 @@ function main() {
} }
} }
try {
main() main()
} catch (error) {
console.error("Postinstall script error:", error.message)
process.exit(0)
}

View File

@@ -13,13 +13,25 @@ function main() {
return return
} }
const binDir = path.join(__dirname, "bin") console.log("Windows detected: Modifying package.json bin entry")
const unixScript = path.join(binDir, "opencode")
console.log("Windows detected: Configuring bin scripts for Windows") // Read package.json
const packageJsonPath = path.join(__dirname, "package.json")
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"))
// Modify bin to point to .cmd file on Windows
packageJson.bin = {
opencode: "./bin/opencode.cmd",
}
// Write it back
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2))
console.log("Updated package.json bin to use opencode.cmd")
// Now you can also remove the Unix script if you want
const unixScript = path.join(__dirname, "bin", "opencode")
if (fs.existsSync(unixScript)) { if (fs.existsSync(unixScript)) {
console.log("Removing Unix shell script from bin/") console.log("Removing Unix shell script")
fs.unlinkSync(unixScript) fs.unlinkSync(unixScript)
} }
} }

View File

@@ -62,7 +62,34 @@ You can also install it with the following:
#### Windows #### Windows
Currently, the automatic installation methods do not work properly on Windows. However you can grab the binary from the [Releases](https://github.com/sst/opencode/releases). - **Using Chocolatey**
```bash
choco install opencode
```
- **Using WinGet**
```bash
winget install opencode
```
- **Using Scoop**
```bash
scoop bucket add extras
scoop install extras/opencode
```
- **Using NPM**
```bash
npm install -g opencode-ai
```
Support for installing opencode on Windows using the bun package manager is currently in progress.
You can also grab the binary from the [Releases](https://github.com/sst/opencode/releases).
--- ---

View File

@@ -13,7 +13,7 @@ that it stores locally.
Log files are written to: Log files are written to:
- **macOS/Linux**: `~/.local/share/opencode/log/` - **macOS/Linux**: `~/.local/share/opencode/log/`
- **Windows**: `%APPDATA%\opencode\log\` - **Windows**: `%USERPROFILE%\.local\share\opencode\log\`
Log files are named with timestamps (e.g., `2025-01-09T123456.log`) and the most recent 10 log files are kept. Log files are named with timestamps (e.g., `2025-01-09T123456.log`) and the most recent 10 log files are kept.