import { describe, expect, it } from "vitest"; import { captureCliOutput, setCapturedCliExitCode, writeJsonEnvelope } from "../src/cli/output.js"; function deferred(): { promise: Promise; resolve: () => void } { let resolve = () => {}; const promise = new Promise((done) => { resolve = done; }); return { promise, resolve }; } describe("captured CLI output status", () => { it("keeps overlapping JSON statuses AsyncLocalStorage-local", async () => { const previousExitCode = process.exitCode; process.exitCode = 23; const failureGate = deferred(); const successGate = deferred(); try { const failure = captureCliOutput(async () => { await failureGate.promise; writeJsonEnvelope({ ok: false, error: { message: "failed" } }); setCapturedCliExitCode(1); }); const success = captureCliOutput(async () => { await successGate.promise; writeJsonEnvelope({ ok: true, data: { value: "ok" } }); }); successGate.resolve(); await Promise.resolve(); failureGate.resolve(); const [failed, succeeded] = await Promise.all([failure, success]); expect(failed.exitCode).toBe(1); expect(JSON.parse(failed.stdout)).toEqual({ ok: false, error: { message: "failed" } }); expect(succeeded.exitCode).toBe(0); expect(JSON.parse(succeeded.stdout)).toEqual({ ok: true, data: { value: "ok" } }); expect(process.exitCode).toBe(23); } finally { process.exitCode = previousExitCode; } }); it("preserves uncaptured CLI process exit behavior", () => { const previousExitCode = process.exitCode; try { process.exitCode = undefined; setCapturedCliExitCode(7); expect(process.exitCode).toBe(7); } finally { process.exitCode = previousExitCode; } }); });