






















@@ -4,19 +4,36 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
44const manageMocks = vi.hoisted(() => {
55const doctorAction = vi.fn();
66const openAction = vi.fn();
7+const startAction = vi.fn();
78const statusAction = vi.fn();
9+const tabNewAction = vi.fn();
810const tabsAction = vi.fn();
911const registerBrowserManageCommands = vi.fn((browser: Command) => {
12+browser.command("start").description("Start browser").action(startAction);
1013browser.command("status").description("Show browser status").action(statusAction);
1114browser.command("tabs").description("List tabs").action(tabsAction);
15+browser
16+.command("tab")
17+.description("Tab shortcuts")
18+.command("new")
19+.description("Open a new tab")
20+.action(tabNewAction);
1221browser.command("open").description("Open URL").argument("<url>").action(openAction);
1322browser
1423.command("doctor")
1524.description("Check browser plugin readiness")
1625.option("--deep", "Run a live snapshot probe")
1726.action(doctorAction);
1827});
19-return { doctorAction, openAction, registerBrowserManageCommands, statusAction, tabsAction };
28+return {
29+ doctorAction,
30+ openAction,
31+ registerBrowserManageCommands,
32+ startAction,
33+ statusAction,
34+ tabNewAction,
35+ tabsAction,
36+};
2037});
2138const inspectMocks = vi.hoisted(() => ({
2239registerBrowserInspectCommands: vi.fn(),
@@ -68,7 +85,9 @@ describe("registerBrowserCli lazy browser subcommands", () => {
6885manageMocks.registerBrowserManageCommands.mockClear();
6986manageMocks.doctorAction.mockClear();
7087manageMocks.openAction.mockClear();
88+manageMocks.startAction.mockClear();
7189manageMocks.statusAction.mockClear();
90+manageMocks.tabNewAction.mockClear();
7291manageMocks.tabsAction.mockClear();
7392inspectMocks.registerBrowserInspectCommands.mockClear();
7493actionInputMocks.registerBrowserActionInputCommands.mockClear();
@@ -160,6 +179,57 @@ describe("registerBrowserCli lazy browser subcommands", () => {
160179expect(tabsCommand.parent?.opts().json).toBe(true);
161180});
162181182+it("skips browser option values when selecting the lazy command group", async () => {
183+const program = new Command();
184+program.name("openclaw");
185+186+registerBrowserCli(program, [
187+"node",
188+"openclaw",
189+"browser",
190+"--browser-profile",
191+"status",
192+"start",
193+]);
194+195+const browser = program.commands.find((command) => command.name() === "browser");
196+expect(browser?.commands.map((command) => command.name())).toContain("start");
197+198+await program.parseAsync(["browser", "--browser-profile", "status", "start"], {
199+from: "user",
200+});
201+202+expect(manageMocks.registerBrowserManageCommands).toHaveBeenCalledTimes(1);
203+expect(manageMocks.startAction).toHaveBeenCalledTimes(1);
204+expect(manageMocks.statusAction).not.toHaveBeenCalled();
205+});
206+207+it("resolves browser parent options for nested commands", async () => {
208+const program = new Command();
209+program.name("openclaw");
210+211+registerBrowserCli(program, [
212+"node",
213+"openclaw",
214+"browser",
215+"--browser-profile",
216+"work",
217+"tab",
218+"new",
219+]);
220+221+await program.parseAsync(["browser", "--browser-profile", "work", "--json", "tab", "new"], {
222+from: "user",
223+});
224+225+expect(manageMocks.tabNewAction).toHaveBeenCalledTimes(1);
226+const tabCommand = requireTrailingCommand(
227+requireFirstCall(manageMocks.tabNewAction, "tab new action call"),
228+"tab new action",
229+);
230+expect(tabCommand.parent?.parent?.opts()).toMatchObject({ browserProfile: "work", json: true });
231+});
232+163233it("can eagerly register all browser groups for compatibility", async () => {
164234vi.stubEnv("OPENCLAW_DISABLE_LAZY_SUBCOMMANDS", "1");
165235const program = new Command();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。