Files
openclaw/src/cli/command-execution-startup.test.ts
Peter Steinberger 250376f885 fix: simplify bundled runtime dependency repair (#75183)
Summary:
- Merged fix: simplify bundled runtime dependency repair after ClawSweeper review.

ClawSweeper fixups:
- Included follow-up commit: fix: verify cached bundled runtime roots
- Included follow-up commit: refactor: simplify plugin runtime startup paths
- Included follow-up commit: refactor: trim plugin startup policy helpers
- Included follow-up commit: refactor: trust package manager runtime deps materialization
- Included follow-up commit: fix: narrow channel runtime deps skip policy
- Included follow-up commit: refactor: defer startup plugin runtime deps
- Ran the ClawSweeper repair loop before final review.

Validation:
- ClawSweeper review passed for head 04dc566534.
- Required merge gates passed before the squash merge.

Prepared head SHA: 04dc566534
Review: https://github.com/openclaw/openclaw/pull/75183#issuecomment-4358383786

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Shakker <shakkerdroid@gmail.com>
Co-authored-by: clawsweeper-repair <clawsweeper-repair@users.noreply.github.com>
2026-05-01 07:49:02 +00:00

196 lines
5.6 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
const emitCliBannerMock = vi.hoisted(() => vi.fn());
const routeLogsToStderrMock = vi.hoisted(() => vi.fn());
const ensureCliCommandBootstrapMock = vi.hoisted(() => vi.fn(async () => {}));
vi.mock("./banner.js", () => ({
emitCliBanner: emitCliBannerMock,
}));
vi.mock("../logging/console.js", () => ({
routeLogsToStderr: routeLogsToStderrMock,
}));
vi.mock("./command-bootstrap.js", () => ({
ensureCliCommandBootstrap: ensureCliCommandBootstrapMock,
}));
describe("command-execution-startup", () => {
let mod: typeof import("./command-execution-startup.js");
beforeEach(async () => {
vi.clearAllMocks();
vi.resetModules();
mod = await import("./command-execution-startup.js");
});
it("resolves startup context from argv and mode", () => {
expect(
mod.resolveCliExecutionStartupContext({
argv: ["node", "openclaw", "status", "--json"],
jsonOutputMode: true,
env: {},
routeMode: true,
}),
).toEqual({
invocation: {
argv: ["node", "openclaw", "status", "--json"],
commandPath: ["status"],
primary: "status",
hasHelpOrVersion: false,
isRootHelpInvocation: false,
},
commandPath: ["status"],
startupPolicy: {
suppressDoctorStdout: true,
hideBanner: false,
skipConfigGuard: true,
loadPlugins: false,
pluginRegistry: { scope: "channels", installBundledRuntimeDeps: false },
},
});
});
it("uses process env banner suppression when startup env is omitted", () => {
const originalHideBanner = process.env.OPENCLAW_HIDE_BANNER;
try {
process.env.OPENCLAW_HIDE_BANNER = "1";
expect(
mod.resolveCliExecutionStartupContext({
argv: ["node", "openclaw", "status"],
jsonOutputMode: false,
}).startupPolicy.hideBanner,
).toBe(true);
expect(
mod.resolveCliExecutionStartupContext({
argv: ["node", "openclaw", "status"],
jsonOutputMode: false,
env: {},
}).startupPolicy.hideBanner,
).toBe(false);
} finally {
if (originalHideBanner === undefined) {
delete process.env.OPENCLAW_HIDE_BANNER;
} else {
process.env.OPENCLAW_HIDE_BANNER = originalHideBanner;
}
}
});
it("skips local plugin bootstrap for JSON gateway agent calls", () => {
expect(
mod.resolveCliExecutionStartupContext({
argv: ["node", "openclaw", "agent", "--agent", "main", "--message", "hi", "--json"],
jsonOutputMode: true,
}).startupPolicy.loadPlugins,
).toBe(false);
expect(
mod.resolveCliExecutionStartupContext({
argv: [
"node",
"openclaw",
"agent",
"--agent",
"main",
"--message",
"hi",
"--json",
"--local",
],
jsonOutputMode: true,
}).startupPolicy.loadPlugins,
).toBe(true);
expect(
mod.resolveCliExecutionStartupContext({
argv: ["node", "openclaw", "agent", "--agent", "main", "--message", "hi"],
jsonOutputMode: false,
}).startupPolicy.loadPlugins,
).toBe(true);
});
it("routes logs to stderr and emits banner only when allowed", async () => {
await mod.applyCliExecutionStartupPresentation({
startupPolicy: {
suppressDoctorStdout: true,
hideBanner: false,
skipConfigGuard: false,
loadPlugins: true,
pluginRegistry: { scope: "all" },
},
version: "1.2.3",
argv: ["node", "openclaw", "status"],
});
expect(routeLogsToStderrMock).toHaveBeenCalledTimes(1);
expect(emitCliBannerMock).toHaveBeenCalledWith("1.2.3", {
argv: ["node", "openclaw", "status"],
});
await mod.applyCliExecutionStartupPresentation({
startupPolicy: {
suppressDoctorStdout: false,
hideBanner: true,
skipConfigGuard: false,
loadPlugins: true,
pluginRegistry: { scope: "all" },
},
version: "1.2.3",
showBanner: true,
});
expect(emitCliBannerMock).toHaveBeenCalledTimes(1);
});
it("forwards startup policy into bootstrap defaults and overrides", async () => {
const statusRuntime = {} as never;
await mod.ensureCliExecutionBootstrap({
runtime: statusRuntime,
commandPath: ["status"],
startupPolicy: {
suppressDoctorStdout: true,
hideBanner: false,
skipConfigGuard: true,
loadPlugins: false,
pluginRegistry: { scope: "channels", installBundledRuntimeDeps: false },
},
});
expect(ensureCliCommandBootstrapMock).toHaveBeenCalledWith({
runtime: statusRuntime,
commandPath: ["status"],
suppressDoctorStdout: true,
allowInvalid: undefined,
loadPlugins: false,
pluginRegistry: { scope: "channels", installBundledRuntimeDeps: false },
skipConfigGuard: true,
});
const messageRuntime = {} as never;
await mod.ensureCliExecutionBootstrap({
runtime: messageRuntime,
commandPath: ["message", "send"],
startupPolicy: {
suppressDoctorStdout: false,
hideBanner: false,
skipConfigGuard: false,
loadPlugins: false,
pluginRegistry: { scope: "all" },
},
allowInvalid: true,
loadPlugins: true,
});
expect(ensureCliCommandBootstrapMock).toHaveBeenLastCalledWith({
runtime: messageRuntime,
commandPath: ["message", "send"],
suppressDoctorStdout: false,
allowInvalid: true,
loadPlugins: true,
pluginRegistry: { scope: "all" },
skipConfigGuard: false,
});
});
});