From c60de42e98428dc1ef7440d78c23f5915966cdb3 Mon Sep 17 00:00:00 2001 From: muyiyr <940955635@qq.com> Date: Thu, 22 Oct 2026 16:15:33 +0800 Subject: [PATCH] fix(coding-agent): preserve pi.exec spawn errors Fixes #11085 --- packages/coding-agent/src/core/exec.ts | 4 ++-- packages/coding-agent/test/exec.test.ts | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 packages/coding-agent/test/exec.test.ts diff --git a/packages/coding-agent/src/core/exec.ts b/packages/coding-agent/src/core/exec.ts index 5afe9ec36..53e53366a 100644 --- a/packages/coding-agent/src/core/exec.ts +++ b/packages/coding-agent/src/core/exec.ts @@ -96,12 +96,12 @@ export async function execCommand( } resolve({ stdout, stderr, code: code ?? 0, killed }); }) - .catch((_err) => { + .catch((error: Error) => { if (timeoutId) clearTimeout(timeoutId); if (options?.signal) { options.signal.removeEventListener("abort", killProcess); } - resolve({ stdout, stderr, code: 1, killed }); + resolve({ stdout, stderr: stderr || error.message, code: 1, killed }); }); }); } diff --git a/packages/coding-agent/test/exec.test.ts b/packages/coding-agent/test/exec.test.ts new file mode 100644 index 000000000..96232a8b3 --- /dev/null +++ b/packages/coding-agent/test/exec.test.ts @@ -0,0 +1,22 @@ +import { describe, expect, it } from "vitest"; +import { execCommand } from "../src/core/exec.ts"; + +describe("execCommand", () => { + // Regression test for https://github.com/earendil-works/pi/issues/11085 + it("reports spawn errors in stderr", async () => { + const result = await execCommand("pi-command-that-does-not-exist-11085", [], process.cwd()); + + expect(result).toMatchObject({ + code: 1, + killed: false, + stdout: "", + }); + expect(result.stderr).toMatch(/ENOENT/); + }); + + it("keeps stderr empty when a command exits silently", async () => { + const result = await execCommand(process.execPath, ["-e", "process.exit(1)"], process.cwd()); + + expect(result).toEqual({ stdout: "", stderr: "", code: 1, killed: false }); + }); +});