import { Command } from "commander"; import { afterEach, describe, expect, it, vi } from "vitest"; import { loggingState } from "../../logging/state.js"; const mocks = vi.hoisted(() => ({ ensureConfigReady: vi.fn(async () => {}), routeLogsToStderr: vi.fn(), })); vi.mock("../../globals.js", () => ({ setVerbose: vi.fn() })); vi.mock("../../runtime.js", () => ({ defaultRuntime: { error: vi.fn(), exit: vi.fn(), log: vi.fn() }, })); vi.mock("../../logging/console.js", () => ({ routeLogsToStderr: mocks.routeLogsToStderr, })); vi.mock("../banner.js", () => ({ emitCliBanner: vi.fn() })); vi.mock("./config-guard.js", () => ({ ensureConfigReady: mocks.ensureConfigReady })); vi.mock("../plugin-registry.js", () => ({ ensurePluginRegistryLoaded: vi.fn() })); const originalArgv = [...process.argv]; const originalTitle = process.title; const originalForceStderr = loggingState.forceConsoleToStderr; const originalEarlyConsoleRoutingRestore = loggingState.earlyConsoleRoutingRestore; describe("preaction model output owner", () => { afterEach(() => { vi.clearAllMocks(); process.argv = originalArgv; process.title = originalTitle; loggingState.forceConsoleToStderr = originalForceStderr; loggingState.earlyConsoleRoutingRestore = originalEarlyConsoleRoutingRestore; }); it.each([ { name: "plain-looking provider value", args: ["models", "auth", "list", "--provider", "--plain"], }, { name: "ignored parent plain alias and plain-looking provider value", args: ["models", "--status-plain", "auth", "list", "--provider", "--plain"], }, ])("restores human stdout for $name", async ({ args }) => { const program = new Command().name("openclaw").enablePositionalOptions(); program .command("models") .option("--status-plain") .command("auth") .command("list") .option("--provider ") .action(() => {}); const { registerPreActionHooks } = await import("./preaction.js"); registerPreActionHooks(program, "test"); loggingState.forceConsoleToStderr = true; loggingState.earlyConsoleRoutingRestore = false; process.argv = ["node", "openclaw", ...args]; await program.parseAsync(process.argv); expect(loggingState.forceConsoleToStderr).toBe(false); expect(mocks.routeLogsToStderr).not.toHaveBeenCalled(); }); });