From ffb647cecedc7e23f8ad0aec539dc1e5df2cedd5 Mon Sep 17 00:00:00 2001 From: badlogic Date: Wed, 4 Feb 2026 02:15:22 +0100 Subject: [PATCH] fix(coding-agent): use shell execution for spawn on Windows fixes #1220 --- packages/coding-agent/CHANGELOG.md | 4 ++++ .../coding-agent/src/core/package-manager.ts | 18 +++++++----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 349eeb9b..36b9d827 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Fixed Windows package installs regression by using shell execution instead of `.cmd` resolution ([#1220](https://github.com/badlogic/pi-mono/issues/1220)) + ## [0.51.4] - 2026-02-03 ### New Features diff --git a/packages/coding-agent/src/core/package-manager.ts b/packages/coding-agent/src/core/package-manager.ts index e62039b9..3135c16b 100644 --- a/packages/coding-agent/src/core/package-manager.ts +++ b/packages/coding-agent/src/core/package-manager.ts @@ -1595,19 +1595,12 @@ export class DefaultPackageManager implements PackageManager { }; } - private resolveCommand(command: string): string { - if (process.platform === "win32" && command === "npm") { - return "npm.cmd"; - } - return command; - } - private runCommand(command: string, args: string[], options?: { cwd?: string }): Promise { - const resolvedCommand = this.resolveCommand(command); return new Promise((resolvePromise, reject) => { - const child = spawn(resolvedCommand, args, { + const child = spawn(command, args, { cwd: options?.cwd, stdio: "inherit", + shell: process.platform === "win32", }); child.on("error", reject); child.on("exit", (code) => { @@ -1621,8 +1614,11 @@ export class DefaultPackageManager implements PackageManager { } private runCommandSync(command: string, args: string[]): string { - const resolvedCommand = this.resolveCommand(command); - const result = spawnSync(resolvedCommand, args, { stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }); + const result = spawnSync(command, args, { + stdio: ["ignore", "pipe", "pipe"], + encoding: "utf-8", + shell: process.platform === "win32", + }); if (result.status !== 0) { throw new Error(`Failed to run ${command} ${args.join(" ")}: ${result.stderr || result.stdout}`); }