From b642d3e06babd76f37f4106ef06f5e7ef8601762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20G=C3=B6tzken?= Date: Wed, 1 Apr 2026 09:25:39 +0200 Subject: [PATCH 1/2] fix(adapter-utils): use cmd.exe for .cmd/.bat wrappers on Windows Avoid relying on ComSpec for .cmd/.bat invocation in runChildProcess. Some Win11 environments set ComSpec to PowerShell, which breaks cmd-specific flags (/d /s /c) and causes adapter CLI discovery failures (e.g. opencode models). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- packages/adapter-utils/src/server-utils.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/adapter-utils/src/server-utils.ts b/packages/adapter-utils/src/server-utils.ts index 4a5affdf..b2337abf 100644 --- a/packages/adapter-utils/src/server-utils.ts +++ b/packages/adapter-utils/src/server-utils.ts @@ -306,6 +306,12 @@ function quoteForCmd(arg: string) { return /[\s"&<>|^()]/.test(escaped) ? `"${escaped}"` : escaped; } +function resolveWindowsCmdShell(env: NodeJS.ProcessEnv): string { + const fallbackRoot = env.SystemRoot || process.env.SystemRoot || "C:\\Windows"; + const candidate = path.join(fallbackRoot, "System32", "cmd.exe"); + return candidate; +} + async function resolveSpawnTarget( command: string, args: string[], @@ -320,7 +326,9 @@ async function resolveSpawnTarget( } if (/\.(cmd|bat)$/i.test(executable)) { - const shell = env.ComSpec || process.env.ComSpec || "cmd.exe"; + // Always use cmd.exe for .cmd/.bat wrappers. Some environments override + // ComSpec to PowerShell, which breaks cmd-specific flags like /d /s /c. + const shell = resolveWindowsCmdShell(env); const commandLine = [quoteForCmd(executable), ...args.map(quoteForCmd)].join(" "); return { command: shell, From 9b238d964421ca67dad7963bcbcca6becdbe521d Mon Sep 17 00:00:00 2001 From: TimoYi | HearthCore | ZenWise <1767125+HearthCore@users.noreply.github.com> Date: Wed, 1 Apr 2026 14:37:46 +0200 Subject: [PATCH 2/2] Update packages/adapter-utils/src/server-utils.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- packages/adapter-utils/src/server-utils.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/adapter-utils/src/server-utils.ts b/packages/adapter-utils/src/server-utils.ts index b2337abf..f509ada8 100644 --- a/packages/adapter-utils/src/server-utils.ts +++ b/packages/adapter-utils/src/server-utils.ts @@ -308,8 +308,7 @@ function quoteForCmd(arg: string) { function resolveWindowsCmdShell(env: NodeJS.ProcessEnv): string { const fallbackRoot = env.SystemRoot || process.env.SystemRoot || "C:\\Windows"; - const candidate = path.join(fallbackRoot, "System32", "cmd.exe"); - return candidate; + return path.join(fallbackRoot, "System32", "cmd.exe"); } async function resolveSpawnTarget(