From d7fb01afad3dfaf456de905296fe50f614710280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Sormage=C3=A7?= Date: Fri, 30 Jan 2026 14:56:46 +0000 Subject: [PATCH] fix(windows): resolve command execution and binary detection issues --- src/agents/skills/config.ts | 15 +++++++++------ src/hooks/config.ts | 15 +++++++++------ src/process/exec.ts | 1 + 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/agents/skills/config.ts b/src/agents/skills/config.ts index 6e08e49c69..391f36f3e8 100644 --- a/src/agents/skills/config.ts +++ b/src/agents/skills/config.ts @@ -99,13 +99,16 @@ export function isBundledSkillAllowed(entry: SkillEntry, allowlist?: string[]): export function hasBinary(bin: string): boolean { const pathEnv = process.env.PATH ?? ""; const parts = pathEnv.split(path.delimiter).filter(Boolean); + const extensions = process.platform === "win32" ? [".exe", ".cmd", ".bat", ""] : [""]; for (const part of parts) { - const candidate = path.join(part, bin); - try { - fs.accessSync(candidate, fs.constants.X_OK); - return true; - } catch { - // keep scanning + for (const ext of extensions) { + const candidate = path.join(part, bin + ext); + try { + fs.accessSync(candidate, fs.constants.X_OK); + return true; + } catch { + // keep scanning + } } } return false; diff --git a/src/hooks/config.ts b/src/hooks/config.ts index 04d4beac68..e0c7855cf6 100644 --- a/src/hooks/config.ts +++ b/src/hooks/config.ts @@ -68,13 +68,16 @@ export function resolveRuntimePlatform(): string { export function hasBinary(bin: string): boolean { const pathEnv = process.env.PATH ?? ""; const parts = pathEnv.split(path.delimiter).filter(Boolean); + const extensions = process.platform === "win32" ? [".exe", ".cmd", ".bat", ""] : [""]; for (const part of parts) { - const candidate = path.join(part, bin); - try { - fs.accessSync(candidate, fs.constants.X_OK); - return true; - } catch { - // keep scanning + for (const ext of extensions) { + const candidate = path.join(part, bin + ext); + try { + fs.accessSync(candidate, fs.constants.X_OK); + return true; + } catch { + // keep scanning + } } } return false; diff --git a/src/process/exec.ts b/src/process/exec.ts index 8514eec233..28cabce3a9 100644 --- a/src/process/exec.ts +++ b/src/process/exec.ts @@ -116,6 +116,7 @@ export async function runCommandWithTimeout( cwd, env: resolvedEnv, windowsVerbatimArguments, + shell: process.platform === "win32", }); // Spawn with inherited stdin (TTY) so tools like `pi` stay interactive when needed. return await new Promise((resolve, reject) => {