





























@@ -3,16 +3,20 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3344const manageMocks = vi.hoisted(() => {
55const doctorAction = vi.fn();
6+const openAction = vi.fn();
67const statusAction = vi.fn();
8+const tabsAction = vi.fn();
79const registerBrowserManageCommands = vi.fn((browser: Command) => {
810browser.command("status").description("Show browser status").action(statusAction);
11+browser.command("tabs").description("List tabs").action(tabsAction);
12+browser.command("open").description("Open URL").argument("<url>").action(openAction);
913browser
1014.command("doctor")
1115.description("Check browser plugin readiness")
1216.option("--deep", "Run a live snapshot probe")
1317.action(doctorAction);
1418});
15-return { doctorAction, registerBrowserManageCommands, statusAction };
19+return { doctorAction, openAction, registerBrowserManageCommands, statusAction, tabsAction };
1620});
1721const inspectMocks = vi.hoisted(() => ({
1822registerBrowserInspectCommands: vi.fn(),
@@ -44,7 +48,9 @@ describe("registerBrowserCli lazy browser subcommands", () => {
4448vi.unstubAllEnvs();
4549manageMocks.registerBrowserManageCommands.mockClear();
4650manageMocks.doctorAction.mockClear();
51+manageMocks.openAction.mockClear();
4752manageMocks.statusAction.mockClear();
53+manageMocks.tabsAction.mockClear();
4854inspectMocks.registerBrowserInspectCommands.mockClear();
4955actionInputMocks.registerBrowserActionInputCommands.mockClear();
5056actionObserveMocks.registerBrowserActionObserveCommands.mockClear();
@@ -103,6 +109,29 @@ describe("registerBrowserCli lazy browser subcommands", () => {
103109expect(manageMocks.doctorAction.mock.calls[0]?.[0]).toMatchObject({ deep: true });
104110});
105111112+it("preserves parent --json while reparsing lazy manage commands", async () => {
113+const program = new Command();
114+program.name("openclaw");
115+116+registerBrowserCli(program, ["node", "openclaw", "browser", "--json", "open", "about:blank"]);
117+118+await program.parseAsync(["browser", "--json", "open", "about:blank"], { from: "user" });
119+120+expect(manageMocks.openAction).toHaveBeenCalledTimes(1);
121+const openCommand = manageMocks.openAction.mock.calls[0]?.at(-1) as Command | undefined;
122+expect(openCommand?.parent?.opts()).toMatchObject({ json: true });
123+124+const tabsProgram = new Command();
125+tabsProgram.name("openclaw");
126+registerBrowserCli(tabsProgram, ["node", "openclaw", "browser", "--json", "tabs"]);
127+128+await tabsProgram.parseAsync(["browser", "--json", "tabs"], { from: "user" });
129+130+expect(manageMocks.tabsAction).toHaveBeenCalledTimes(1);
131+const tabsCommand = manageMocks.tabsAction.mock.calls[0]?.at(-1) as Command | undefined;
132+expect(tabsCommand?.parent?.opts()).toMatchObject({ json: true });
133+});
134+106135it("can eagerly register all browser groups for compatibility", async () => {
107136vi.stubEnv("OPENCLAW_DISABLE_LAZY_SUBCOMMANDS", "1");
108137const program = new Command();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。