From e762918a1d614baf92d13e2c693d33ba38cd8441 Mon Sep 17 00:00:00 2001 From: 0xRoy <1997roylee@gmail.com> Date: Thu, 4 Jun 2026 01:24:22 +0800 Subject: [PATCH] Surface CLI task intake failures --- .../server/src/tasks/task-chat-service.ts | 16 +++++++++-- .../tests/task-chat-service-failure.test.ts | 28 +++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 packages/server/tests/task-chat-service-failure.test.ts diff --git a/packages/server/src/tasks/task-chat-service.ts b/packages/server/src/tasks/task-chat-service.ts index 202038d4..928cc90e 100644 --- a/packages/server/src/tasks/task-chat-service.ts +++ b/packages/server/src/tasks/task-chat-service.ts @@ -53,7 +53,7 @@ export async function runTaskIntake( json: true, }); if (result.status !== "succeeded") { - throw new Error(result.error ?? "Task creation failed"); + throw new Error(readCliFailureMessage(result, "Task creation failed")); } return parseTaskIntakeOutput(result.commandResult?.stdout ?? ""); } @@ -73,7 +73,9 @@ export async function runTaskRequirementIntake( json: true, }); if (result.status !== "succeeded") { - throw new Error(result.error ?? "Task requirement intake failed"); + throw new Error( + readCliFailureMessage(result, "Task requirement intake failed"), + ); } return parseTaskRequirementOutput(result.commandResult?.stdout ?? ""); } @@ -222,6 +224,16 @@ function readErrorMessage(record: Record): string { : "unknown legacy Linear failure"; } +function readCliFailureMessage( + result: Awaited>, + fallback: string, +): string { + const output = [result.commandResult?.stderr, result.commandResult?.stdout] + .map((value) => value?.trim()) + .find((value) => value !== undefined && value.length > 0); + return result.error ?? output ?? fallback; +} + async function settle( run: () => Promise, ): Promise<{ ok: true; value: T } | { ok: false; error: string }> { diff --git a/packages/server/tests/task-chat-service-failure.test.ts b/packages/server/tests/task-chat-service-failure.test.ts new file mode 100644 index 00000000..aef465c7 --- /dev/null +++ b/packages/server/tests/task-chat-service-failure.test.ts @@ -0,0 +1,28 @@ +import { describe, expect, it } from "bun:test"; +import { runTaskRequirementIntake } from "../src/tasks/task-chat-service"; +import type { CliExecutor } from "../src/types/app.types"; + +describe("task chat service CLI failures", () => { + it("surfaces stderr from failed requirement intake commands", async () => { + const cliExecutor: CliExecutor = { + execute: async (request) => ({ + status: "failed", + request, + commandResult: { + code: 1, + stdout: "", + stderr: "codex failed with exit code 1\n", + }, + }), + getHistory: () => [], + }; + + await expect( + runTaskRequirementIntake(cliExecutor, { + request: "Build the dashboard", + projectId: "default", + answers: [], + }), + ).rejects.toThrow("codex failed with exit code 1"); + }); +});