diff --git a/src/cli/daemon-cli/shared.test.ts b/src/cli/daemon-cli/shared.test.ts new file mode 100644 index 00000000000..37d6147ec5c --- /dev/null +++ b/src/cli/daemon-cli/shared.test.ts @@ -0,0 +1,16 @@ +import { describe, expect, it } from "vitest"; +import { theme } from "../../terminal/theme.js"; +import { resolveRuntimeStatusColor } from "./shared.js"; + +describe("resolveRuntimeStatusColor", () => { + it("maps known runtime states to expected theme colors", () => { + expect(resolveRuntimeStatusColor("running")).toBe(theme.success); + expect(resolveRuntimeStatusColor("stopped")).toBe(theme.error); + expect(resolveRuntimeStatusColor("unknown")).toBe(theme.muted); + }); + + it("falls back to warning color for unexpected states", () => { + expect(resolveRuntimeStatusColor("degraded")).toBe(theme.warn); + expect(resolveRuntimeStatusColor(undefined)).toBe(theme.muted); + }); +}); diff --git a/src/cli/daemon-cli/shared.ts b/src/cli/daemon-cli/shared.ts index ef37e855b24..bfd54e87751 100644 --- a/src/cli/daemon-cli/shared.ts +++ b/src/cli/daemon-cli/shared.ts @@ -27,6 +27,17 @@ export function createCliStatusTextStyles() { }; } +export function resolveRuntimeStatusColor(status: string | undefined): (value: string) => string { + const runtimeStatus = status ?? "unknown"; + return runtimeStatus === "running" + ? theme.success + : runtimeStatus === "stopped" + ? theme.error + : runtimeStatus === "unknown" + ? theme.muted + : theme.warn; +} + export function parsePortFromArgs(programArguments: string[] | undefined): number | null { if (!programArguments?.length) { return null; diff --git a/src/cli/daemon-cli/status.print.ts b/src/cli/daemon-cli/status.print.ts index bfa0cfa69c2..ec36e9e674a 100644 --- a/src/cli/daemon-cli/status.print.ts +++ b/src/cli/daemon-cli/status.print.ts @@ -12,13 +12,14 @@ import { import { isWSLEnv } from "../../infra/wsl.js"; import { getResolvedLoggerSettings } from "../../logging.js"; import { defaultRuntime } from "../../runtime.js"; -import { colorize, theme } from "../../terminal/theme.js"; +import { colorize } from "../../terminal/theme.js"; import { shortenHomePath } from "../../utils.js"; import { formatCliCommand } from "../command-format.js"; import { createCliStatusTextStyles, filterDaemonEnv, formatRuntimeStatus, + resolveRuntimeStatusColor, renderRuntimeHints, safeDaemonEnv, } from "./shared.js"; @@ -165,15 +166,7 @@ export function printDaemonStatus(status: DaemonStatus, opts: { json: boolean }) const runtimeLine = formatRuntimeStatus(service.runtime); if (runtimeLine) { - const runtimeStatus = service.runtime?.status ?? "unknown"; - const runtimeColor = - runtimeStatus === "running" - ? theme.success - : runtimeStatus === "stopped" - ? theme.error - : runtimeStatus === "unknown" - ? theme.muted - : theme.warn; + const runtimeColor = resolveRuntimeStatusColor(service.runtime?.status); defaultRuntime.log(`${label("Runtime:")} ${colorize(rich, runtimeColor, runtimeLine)}`); } diff --git a/src/cli/node-cli/daemon.ts b/src/cli/node-cli/daemon.ts index dccc2429008..d16e0e09134 100644 --- a/src/cli/node-cli/daemon.ts +++ b/src/cli/node-cli/daemon.ts @@ -14,7 +14,7 @@ import { resolveNodeService } from "../../daemon/node-service.js"; import type { GatewayServiceRuntime } from "../../daemon/service-runtime.js"; import { loadNodeHostConfig } from "../../node-host/config.js"; import { defaultRuntime } from "../../runtime.js"; -import { colorize, theme } from "../../terminal/theme.js"; +import { colorize } from "../../terminal/theme.js"; import { formatCliCommand } from "../command-format.js"; import { runServiceRestart, @@ -27,7 +27,12 @@ import { createDaemonActionContext, installDaemonServiceAndEmit, } from "../daemon-cli/response.js"; -import { createCliStatusTextStyles, formatRuntimeStatus, parsePort } from "../daemon-cli/shared.js"; +import { + createCliStatusTextStyles, + formatRuntimeStatus, + parsePort, + resolveRuntimeStatusColor, +} from "../daemon-cli/shared.js"; type NodeDaemonInstallOptions = { host?: string; @@ -261,15 +266,7 @@ export async function runNodeDaemonStatus(opts: NodeDaemonStatusOptions = {}) { const runtimeLine = formatRuntimeStatus(runtime); if (runtimeLine) { - const runtimeStatus = runtime?.status ?? "unknown"; - const runtimeColor = - runtimeStatus === "running" - ? theme.success - : runtimeStatus === "stopped" - ? theme.error - : runtimeStatus === "unknown" - ? theme.muted - : theme.warn; + const runtimeColor = resolveRuntimeStatusColor(runtime?.status); defaultRuntime.log(`${label("Runtime:")} ${colorize(rich, runtimeColor, runtimeLine)}`); }