import { describe, expect, it } from "vitest"; import { createCli } from "./cli.js"; describe("canonical CLI surface", () => { it("offers daemon host selection as a global option", () => { expect(createCli().helpInformation()).toContain("--host "); }); it("shows project, workspace, and heartbeat commands while hiding worktree compatibility", () => { const cli = createCli(); const help = cli.helpInformation(); expect(help).toContain("project"); expect(help).toContain("workspace"); expect(help).toContain("heartbeat"); expect(help).not.toContain("worktree"); }); it("offers identical top-level and daemon config reload commands", () => { const cli = createCli(); const reload = cli.commands.find((command) => command.name() === "reload"); const daemon = cli.commands.find((command) => command.name() === "daemon"); const nestedReload = daemon?.commands.find((command) => command.name() === "reload"); expect(reload?.helpInformation()).toContain("--host "); expect(reload?.helpInformation()).toContain("--json"); expect(nestedReload?.helpInformation()).toContain("--host "); expect(nestedReload?.helpInformation()).toContain("--json"); }); it("names explicit workspace creation without exposing older syntax", () => { const run = createCli().commands.find((command) => command.name() === "run"); const help = run?.helpInformation(); expect(help).toContain("--new-workspace "); expect(help).not.toContain("--isolation"); expect(help).not.toContain("--worktree "); }); it("offers the worktree creation options on run", () => { const run = createCli().commands.find((command) => command.name() === "run"); const help = run?.helpInformation(); expect(help).toContain("--worktree-mode "); expect(help).toContain("--worktree-slug "); expect(help).toContain("--new-branch "); expect(help).toContain("--branch "); expect(help).toContain("--pr-number "); expect(help).toContain("--forge "); }); it("uses background for execution and reserves detach for ownership", () => { const run = createCli().commands.find((command) => command.name() === "run"); expect(run?.helpInformation()).toContain("--background"); expect(run?.helpInformation()).not.toContain("--detach"); }); it("offers thinking configuration when running, updating, and scheduling agents", () => { const cli = createCli(); const run = cli.commands.find((command) => command.name() === "run"); const agent = cli.commands.find((command) => command.name() === "agent"); const update = agent?.commands.find((command) => command.name() === "update"); const schedule = cli.commands.find((command) => command.name() === "schedule"); const scheduleCreate = schedule?.commands.find((command) => command.name() === "create"); expect(run?.helpInformation()).toContain("--thinking "); expect(update?.helpInformation()).toContain("--thinking "); expect(scheduleCreate?.helpInformation()).toContain("--thinking "); }); it("offers opening an existing agent in the desktop app", () => { const agent = createCli().commands.find((command) => command.name() === "agent"); const open = agent?.commands.find((command) => command.name() === "open"); expect(open?.helpInformation()).toContain(""); expect(open?.helpInformation()).toContain("--server "); }); it("offers the complete local plugin lifecycle", () => { const plugin = createCli().commands.find((command) => command.name() === "plugin"); expect(plugin?.commands.map((command) => command.name())).toEqual([ "init", "ls", "status", "logs", "install", "update", "reload", "enable", "disable", "remove", ]); expect( plugin?.commands.find((command) => command.name() === "init")?.helpInformation(), ).toContain("--id "); expect( plugin?.commands.find((command) => command.name() === "install")?.helpInformation(), ).toContain("--id "); }); });