fix(cli): preserve lazy command parent flags

This commit is contained in:
Peter Steinberger
2026-04-30 00:48:46 +01:00
parent 36bb723dfb
commit 01254500df
7 changed files with 186 additions and 29 deletions

View File

@@ -3,16 +3,20 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
const manageMocks = vi.hoisted(() => {
const doctorAction = vi.fn();
const openAction = vi.fn();
const statusAction = vi.fn();
const tabsAction = vi.fn();
const registerBrowserManageCommands = vi.fn((browser: Command) => {
browser.command("status").description("Show browser status").action(statusAction);
browser.command("tabs").description("List tabs").action(tabsAction);
browser.command("open").description("Open URL").argument("<url>").action(openAction);
browser
.command("doctor")
.description("Check browser plugin readiness")
.option("--deep", "Run a live snapshot probe")
.action(doctorAction);
});
return { doctorAction, registerBrowserManageCommands, statusAction };
return { doctorAction, openAction, registerBrowserManageCommands, statusAction, tabsAction };
});
const inspectMocks = vi.hoisted(() => ({
registerBrowserInspectCommands: vi.fn(),
@@ -44,7 +48,9 @@ describe("registerBrowserCli lazy browser subcommands", () => {
vi.unstubAllEnvs();
manageMocks.registerBrowserManageCommands.mockClear();
manageMocks.doctorAction.mockClear();
manageMocks.openAction.mockClear();
manageMocks.statusAction.mockClear();
manageMocks.tabsAction.mockClear();
inspectMocks.registerBrowserInspectCommands.mockClear();
actionInputMocks.registerBrowserActionInputCommands.mockClear();
actionObserveMocks.registerBrowserActionObserveCommands.mockClear();
@@ -103,6 +109,29 @@ describe("registerBrowserCli lazy browser subcommands", () => {
expect(manageMocks.doctorAction.mock.calls[0]?.[0]).toMatchObject({ deep: true });
});
it("preserves parent --json while reparsing lazy manage commands", async () => {
const program = new Command();
program.name("openclaw");
registerBrowserCli(program, ["node", "openclaw", "browser", "--json", "open", "about:blank"]);
await program.parseAsync(["browser", "--json", "open", "about:blank"], { from: "user" });
expect(manageMocks.openAction).toHaveBeenCalledTimes(1);
const openCommand = manageMocks.openAction.mock.calls[0]?.at(-1) as Command | undefined;
expect(openCommand?.parent?.opts()).toMatchObject({ json: true });
const tabsProgram = new Command();
tabsProgram.name("openclaw");
registerBrowserCli(tabsProgram, ["node", "openclaw", "browser", "--json", "tabs"]);
await tabsProgram.parseAsync(["browser", "--json", "tabs"], { from: "user" });
expect(manageMocks.tabsAction).toHaveBeenCalledTimes(1);
const tabsCommand = manageMocks.tabsAction.mock.calls[0]?.at(-1) as Command | undefined;
expect(tabsCommand?.parent?.opts()).toMatchObject({ json: true });
});
it("can eagerly register all browser groups for compatibility", async () => {
vi.stubEnv("OPENCLAW_DISABLE_LAZY_SUBCOMMANDS", "1");
const program = new Command();