
































@@ -2,6 +2,7 @@ import process from "node:process";
22import { CommanderError } from "commander";
33import { beforeEach, describe, expect, it, vi } from "vitest";
44import { loggingState } from "../logging/state.js";
5+import type { RootHelpRenderOptions } from "./program/root-help.js";
56import { runCli, shouldStartProxyForCli } from "./run-main.js";
6778const tryRouteCliMock = vi.hoisted(() => vi.fn());
@@ -18,6 +19,9 @@ const startTaskRegistryMaintenanceMock = vi.hoisted(() => vi.fn());
1819const outputRootHelpMock = vi.hoisted(() => vi.fn());
1920const outputPrecomputedRootHelpTextMock = vi.hoisted(() => vi.fn(() => false));
2021const outputPrecomputedBrowserHelpTextMock = vi.hoisted(() => vi.fn(() => false));
22+const loadRootHelpRenderOptionsForConfigSensitivePluginsMock = vi.hoisted(() =>
23+vi.fn<() => Promise<RootHelpRenderOptions | null>>(async () => null),
24+);
2125const buildProgramMock = vi.hoisted(() => vi.fn());
2226const getProgramContextMock = vi.hoisted(() => vi.fn(() => null));
2327const registerCoreCliByNameMock = vi.hoisted(() => vi.fn());
@@ -168,6 +172,11 @@ vi.mock("./root-help-metadata.js", () => ({
168172outputPrecomputedRootHelpText: outputPrecomputedRootHelpTextMock,
169173}));
170174175+vi.mock("./root-help-live-config.js", () => ({
176+loadRootHelpRenderOptionsForConfigSensitivePlugins:
177+loadRootHelpRenderOptionsForConfigSensitivePluginsMock,
178+}));
179+171180vi.mock("./program.js", () => ({
172181buildProgram: buildProgramMock,
173182}));
@@ -242,6 +251,7 @@ describe("runCli exit behavior", () => {
242251listAgentHarnessIdsMock.mockReturnValue([]);
243252outputPrecomputedBrowserHelpTextMock.mockReturnValue(false);
244253outputPrecomputedRootHelpTextMock.mockReturnValue(false);
254+loadRootHelpRenderOptionsForConfigSensitivePluginsMock.mockResolvedValue(null);
245255hasEnvHttpProxyAgentConfiguredMock.mockReturnValue(false);
246256loadConfigMock.mockReturnValue({});
247257startProxyMock.mockResolvedValue(null);
@@ -401,6 +411,7 @@ describe("runCli exit behavior", () => {
401411402412await runCli(["node", "openclaw", "--help"]);
403413414+expect(loadRootHelpRenderOptionsForConfigSensitivePluginsMock).toHaveBeenCalledTimes(1);
404415expect(outputPrecomputedRootHelpTextMock).toHaveBeenCalledTimes(1);
405416expect(hasEnvHttpProxyAgentConfiguredMock).not.toHaveBeenCalled();
406417expect(ensureGlobalUndiciEnvProxyDispatcherMock).not.toHaveBeenCalled();
@@ -416,6 +427,7 @@ describe("runCli exit behavior", () => {
416427417428expect(maybeRunCliInContainerMock).toHaveBeenCalledWith(["node", "openclaw", "--help"]);
418429expect(tryRouteCliMock).not.toHaveBeenCalled();
430+expect(loadRootHelpRenderOptionsForConfigSensitivePluginsMock).toHaveBeenCalledTimes(1);
419431expect(outputPrecomputedRootHelpTextMock).toHaveBeenCalledTimes(1);
420432expect(outputRootHelpMock).toHaveBeenCalledTimes(1);
421433expect(buildProgramMock).not.toHaveBeenCalled();
@@ -424,6 +436,28 @@ describe("runCli exit behavior", () => {
424436exitSpy.mockRestore();
425437});
426438439+it("renders config-sensitive root help live instead of precomputed metadata", async () => {
440+const liveOptions: RootHelpRenderOptions = {
441+config: {
442+plugins: {
443+slots: {
444+memory: "memory-lancedb",
445+},
446+},
447+},
448+env: process.env,
449+};
450+loadRootHelpRenderOptionsForConfigSensitivePluginsMock.mockResolvedValueOnce(liveOptions);
451+outputPrecomputedRootHelpTextMock.mockReturnValueOnce(true);
452+453+await runCli(["node", "openclaw", "--help"]);
454+455+expect(loadRootHelpRenderOptionsForConfigSensitivePluginsMock).toHaveBeenCalledTimes(1);
456+expect(outputPrecomputedRootHelpTextMock).not.toHaveBeenCalled();
457+expect(outputRootHelpMock).toHaveBeenCalledWith(liveOptions);
458+expect(buildProgramMock).not.toHaveBeenCalled();
459+});
460+427461it("does not start the managed proxy for local gateway client commands", async () => {
428462tryRouteCliMock.mockResolvedValueOnce(true);
429463此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。