mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 13:00:44 +00:00
fix(cli): skip plugin preload for plugin updates
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import type { Command } from "commander";
|
import type { Command } from "commander";
|
||||||
import { resolveCliArgvInvocation } from "../argv-invocation.js";
|
import { resolveCliArgvInvocation } from "../argv-invocation.js";
|
||||||
|
import { resolveCliCommandPathPolicy } from "../command-path-policy.js";
|
||||||
import {
|
import {
|
||||||
shouldEagerRegisterSubcommands,
|
shouldEagerRegisterSubcommands,
|
||||||
shouldRegisterPrimarySubcommandOnly,
|
shouldRegisterPrimarySubcommandOnly,
|
||||||
@@ -30,13 +31,17 @@ async function registerSubCliWithPluginCommands(
|
|||||||
registerSubCli: () => Promise<void>,
|
registerSubCli: () => Promise<void>,
|
||||||
pluginCliPosition: "before" | "after",
|
pluginCliPosition: "before" | "after",
|
||||||
) {
|
) {
|
||||||
const isHelpOrVersion = resolveCliArgvInvocation(process.argv).hasHelpOrVersion;
|
const invocation = resolveCliArgvInvocation(process.argv);
|
||||||
|
const shouldRegisterPluginCommands =
|
||||||
|
!invocation.hasHelpOrVersion &&
|
||||||
|
(invocation.commandPath.length <= 1 ||
|
||||||
|
resolveCliCommandPathPolicy(invocation.commandPath).loadPlugins !== "never");
|
||||||
const { registerPluginCliCommandsFromValidatedConfig } = await import("../../plugins/cli.js");
|
const { registerPluginCliCommandsFromValidatedConfig } = await import("../../plugins/cli.js");
|
||||||
if (pluginCliPosition === "before" && !isHelpOrVersion) {
|
if (pluginCliPosition === "before" && shouldRegisterPluginCommands) {
|
||||||
await registerPluginCliCommandsFromValidatedConfig(program);
|
await registerPluginCliCommandsFromValidatedConfig(program);
|
||||||
}
|
}
|
||||||
await registerSubCli();
|
await registerSubCli();
|
||||||
if (pluginCliPosition === "after" && !isHelpOrVersion) {
|
if (pluginCliPosition === "after" && shouldRegisterPluginCommands) {
|
||||||
await registerPluginCliCommandsFromValidatedConfig(program);
|
await registerPluginCliCommandsFromValidatedConfig(program);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,9 +37,22 @@ const { inferAction, registerCapabilityCli } = vi.hoisted(() => {
|
|||||||
return { inferAction: action, registerCapabilityCli: register };
|
return { inferAction: action, registerCapabilityCli: register };
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const { registerPluginsCli, registerPluginCliCommandsFromValidatedConfig } = vi.hoisted(() => ({
|
||||||
|
registerPluginsCli: vi.fn((program: Command) => {
|
||||||
|
const plugins = program.command("plugins");
|
||||||
|
plugins
|
||||||
|
.command("update")
|
||||||
|
.argument("[id]")
|
||||||
|
.action(() => undefined);
|
||||||
|
}),
|
||||||
|
registerPluginCliCommandsFromValidatedConfig: vi.fn(async () => null),
|
||||||
|
}));
|
||||||
|
|
||||||
vi.mock("../acp-cli.js", () => ({ registerAcpCli }));
|
vi.mock("../acp-cli.js", () => ({ registerAcpCli }));
|
||||||
vi.mock("../nodes-cli.js", () => ({ registerNodesCli }));
|
vi.mock("../nodes-cli.js", () => ({ registerNodesCli }));
|
||||||
vi.mock("../capability-cli.js", () => ({ registerCapabilityCli }));
|
vi.mock("../capability-cli.js", () => ({ registerCapabilityCli }));
|
||||||
|
vi.mock("../plugins-cli.js", () => ({ registerPluginsCli }));
|
||||||
|
vi.mock("../../plugins/cli.js", () => ({ registerPluginCliCommandsFromValidatedConfig }));
|
||||||
vi.mock("./private-qa-cli.js", async () => {
|
vi.mock("./private-qa-cli.js", async () => {
|
||||||
const actual = await vi.importActual<typeof import("./private-qa-cli.js")>("./private-qa-cli.js");
|
const actual = await vi.importActual<typeof import("./private-qa-cli.js")>("./private-qa-cli.js");
|
||||||
return {
|
return {
|
||||||
@@ -78,6 +91,8 @@ describe("registerSubCliCommands", () => {
|
|||||||
loadPrivateQaCliModule.mockClear();
|
loadPrivateQaCliModule.mockClear();
|
||||||
registerCapabilityCli.mockClear();
|
registerCapabilityCli.mockClear();
|
||||||
inferAction.mockClear();
|
inferAction.mockClear();
|
||||||
|
registerPluginsCli.mockClear();
|
||||||
|
registerPluginCliCommandsFromValidatedConfig.mockClear();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
@@ -158,4 +173,24 @@ describe("registerSubCliCommands", () => {
|
|||||||
expect(registerAcpCli).toHaveBeenCalledTimes(1);
|
expect(registerAcpCli).toHaveBeenCalledTimes(1);
|
||||||
expect(acpAction).toHaveBeenCalledTimes(1);
|
expect(acpAction).toHaveBeenCalledTimes(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("does not preload plugin CLI registrations for builtin plugins update", async () => {
|
||||||
|
process.argv = ["node", "openclaw", "plugins", "update", "lossless-claw"];
|
||||||
|
const program = new Command().name("openclaw");
|
||||||
|
|
||||||
|
await registerSubCliByName(program, "plugins");
|
||||||
|
|
||||||
|
expect(registerPluginsCli).toHaveBeenCalledTimes(1);
|
||||||
|
expect(registerPluginCliCommandsFromValidatedConfig).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("keeps plugin CLI registrations available for the plugins command root", async () => {
|
||||||
|
process.argv = ["node", "openclaw", "plugins"];
|
||||||
|
const program = new Command().name("openclaw");
|
||||||
|
|
||||||
|
await registerSubCliByName(program, "plugins");
|
||||||
|
|
||||||
|
expect(registerPluginsCli).toHaveBeenCalledTimes(1);
|
||||||
|
expect(registerPluginCliCommandsFromValidatedConfig).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user