From ee24cfb58e7b691a53e244cd39babc4cbb9a21dc Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 23 Jan 2026 04:45:23 +0000 Subject: [PATCH] fix: cover Windows exe argv (#1480) (thanks @Takhoffman) --- CHANGELOG.md | 1 + scripts/run-node.mjs | 1 + src/cli/argv.test.ts | 16 ++++++++++++++++ src/cli/argv.ts | 1 + 4 files changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16e5acc2a7..5b35e4ca11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ Docs: https://docs.clawd.bot ### Fixes - BlueBubbles: stop typing indicator on idle/no-reply. (#1439) Thanks @Nicell. - Message tool: keep path/filePath as-is for send; hydrate buffers only for sendAttachment. (#1444) Thanks @hopyky. +- CLI: handle Windows runtime exe argv and pnpm build shims more reliably. (#1480) Thanks @Takhoffman. - Auto-reply: only report a model switch when session state is available. (#1465) Thanks @robbyczgw-cla. - Control UI: resolve local avatar URLs with basePath across injection + identity RPC. (#1457) Thanks @dlauer. - Agents: surface concrete API error details instead of generic AI service errors. diff --git a/scripts/run-node.mjs b/scripts/run-node.mjs index dcb40dcbf4..d52d9beaac 100644 --- a/scripts/run-node.mjs +++ b/scripts/run-node.mjs @@ -116,6 +116,7 @@ if (!shouldBuild()) { } else { logRunner("Building TypeScript (dist is stale)."); const pnpmArgs = ["exec", compiler, ...projectArgs]; + // On Windows, pnpm is a .cmd shim, so use cmd.exe for reliable resolution. const buildCmd = process.platform === "win32" ? "cmd.exe" : "pnpm"; const buildArgs = process.platform === "win32" ? ["/d", "/s", "/c", "pnpm", ...pnpmArgs] : pnpmArgs; diff --git a/src/cli/argv.test.ts b/src/cli/argv.test.ts index 244e722419..f74fe9adec 100644 --- a/src/cli/argv.test.ts +++ b/src/cli/argv.test.ts @@ -78,6 +78,16 @@ describe("argv helpers", () => { }); expect(nodeArgv).toEqual(["node", "clawdbot", "status"]); + const nodeExeArgv = buildParseArgv({ + programName: "clawdbot", + rawArgs: ["C:\\\\Program Files\\\\nodejs\\\\Node.EXE", "clawdbot", "status"], + }); + expect(nodeExeArgv).toEqual([ + "C:\\\\Program Files\\\\nodejs\\\\Node.EXE", + "clawdbot", + "status", + ]); + const directArgv = buildParseArgv({ programName: "clawdbot", rawArgs: ["clawdbot", "status"], @@ -89,6 +99,12 @@ describe("argv helpers", () => { rawArgs: ["bun", "src/entry.ts", "status"], }); expect(bunArgv).toEqual(["bun", "src/entry.ts", "status"]); + + const bunExeArgv = buildParseArgv({ + programName: "clawdbot", + rawArgs: ["C:\\\\bun\\\\bun.exe", "src\\\\entry.ts", "status"], + }); + expect(bunExeArgv).toEqual(["C:\\\\bun\\\\bun.exe", "src\\\\entry.ts", "status"]); }); it("builds parse argv from fallback args", () => { diff --git a/src/cli/argv.ts b/src/cli/argv.ts index bc7b60ac92..02b8def143 100644 --- a/src/cli/argv.ts +++ b/src/cli/argv.ts @@ -95,6 +95,7 @@ export function buildParseArgv(params: { ? baseArgv.slice(1) : baseArgv; const executable = (normalizedArgv[0]?.split(/[/\\]/).pop() ?? "").toLowerCase(); + // Normalize Windows `.exe` runtimes (node.exe/bun.exe) for runtime detection. const looksLikeNode = normalizedArgv.length >= 2 && (executable === "node" ||