From 810374d64831578d49dd7c17c205fcc59df7b16c Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 21 Jan 2026 05:20:31 +0000 Subject: [PATCH] fix: align cli output tests and help examples --- src/cli/directory-cli.ts | 5 +++++ src/cli/dns-cli.test.ts | 4 +++- src/cli/help-format.ts | 10 +++++++--- src/cli/pairing-cli.test.ts | 8 ++++++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/cli/directory-cli.ts b/src/cli/directory-cli.ts index 347695f63..5491935ef 100644 --- a/src/cli/directory-cli.ts +++ b/src/cli/directory-cli.ts @@ -30,6 +30,11 @@ function buildRows(entries: Array<{ id: string; name?: string | undefined }>) { })); } +function formatEntry(entry: { id: string; name?: string | undefined }) { + const name = entry.name?.trim(); + return name ? `${entry.id} ${theme.muted(name)}` : entry.id; +} + export function registerDirectoryCli(program: Command) { const directory = program .command("directory") diff --git a/src/cli/dns-cli.test.ts b/src/cli/dns-cli.test.ts index 6ad0938c6..d746df0d4 100644 --- a/src/cli/dns-cli.test.ts +++ b/src/cli/dns-cli.test.ts @@ -7,6 +7,8 @@ describe("dns cli", () => { const log = vi.spyOn(console, "log").mockImplementation(() => {}); const program = buildProgram(); await program.parseAsync(["dns", "setup"], { from: "user" }); - expect(log).toHaveBeenCalledWith(expect.stringContaining("Domain:")); + const output = log.mock.calls.map((call) => call.join(" ")).join("\n"); + expect(output).toContain("DNS setup"); + expect(output).toContain("clawdbot.internal"); }); }); diff --git a/src/cli/help-format.ts b/src/cli/help-format.ts index a57ae8d29..20f2da733 100644 --- a/src/cli/help-format.ts +++ b/src/cli/help-format.ts @@ -1,6 +1,6 @@ import { theme } from "../terminal/theme.js"; -export type HelpExample = [command: string, description: string]; +export type HelpExample = readonly [command: string, description: string]; export function formatHelpExample(command: string, description: string): string { return ` ${theme.command(command)}\n ${theme.muted(description)}`; @@ -11,11 +11,15 @@ export function formatHelpExampleLine(command: string, description: string): str return ` ${theme.command(command)} ${theme.muted(`# ${description}`)}`; } -export function formatHelpExamples(examples: HelpExample[], inline = false): string { +export function formatHelpExamples(examples: ReadonlyArray, inline = false): string { const formatter = inline ? formatHelpExampleLine : formatHelpExample; return examples.map(([command, description]) => formatter(command, description)).join("\n"); } -export function formatHelpExampleGroup(label: string, examples: HelpExample[], inline = false) { +export function formatHelpExampleGroup( + label: string, + examples: ReadonlyArray, + inline = false, +) { return `${theme.muted(label)}\n${formatHelpExamples(examples, inline)}`; } diff --git a/src/cli/pairing-cli.test.ts b/src/cli/pairing-cli.test.ts index 9bbe0e3f2..0ff052d0c 100644 --- a/src/cli/pairing-cli.test.ts +++ b/src/cli/pairing-cli.test.ts @@ -71,7 +71,9 @@ describe("pairing cli", () => { await program.parseAsync(["pairing", "list", "--channel", "telegram"], { from: "user", }); - expect(log).toHaveBeenCalledWith(expect.stringContaining("telegramUserId=123")); + const output = log.mock.calls.map((call) => call.join(" ")).join("\n"); + expect(output).toContain("telegramUserId"); + expect(output).toContain("123"); }); it("accepts channel as positional for list", async () => { @@ -131,7 +133,9 @@ describe("pairing cli", () => { await program.parseAsync(["pairing", "list", "--channel", "discord"], { from: "user", }); - expect(log).toHaveBeenCalledWith(expect.stringContaining("discordUserId=999")); + const output = log.mock.calls.map((call) => call.join(" ")).join("\n"); + expect(output).toContain("discordUserId"); + expect(output).toContain("999"); }); it("accepts channel as positional for approve (npm-run compatible)", async () => {