






















@@ -3,12 +3,21 @@ import { describe, expect, it } from "vitest";
33import {
44resolveCliStartupPolicy,
55shouldBypassConfigGuardForCommandPath,
6-shouldEnsureCliPathForCommandPath,
7-shouldHideCliBannerForCommandPath,
8-shouldLoadPluginsForCommandPath,
9-shouldSkipRouteConfigGuardForCommandPath,
106} from "./command-startup-policy.js";
1178+function resolvePolicy(params: {
9+argv?: string[];
10+commandPath: string[];
11+jsonOutputMode?: boolean;
12+env?: NodeJS.ProcessEnv;
13+routeMode?: boolean;
14+}) {
15+return resolveCliStartupPolicy({
16+jsonOutputMode: false,
17+ ...params,
18+});
19+}
20+1221describe("command-startup-policy", () => {
1322it("matches config guard bypass commands", () => {
1423expect(shouldBypassConfigGuardForCommandPath(["backup", "create"])).toBe(true);
@@ -21,161 +30,152 @@ describe("command-startup-policy", () => {
21302231it("matches route-first config guard skip policy", () => {
2332expect(
24-shouldSkipRouteConfigGuardForCommandPath({
33+resolvePolicy({
2534commandPath: ["status"],
26-suppressDoctorStdout: true,
27-}),
35+jsonOutputMode: true,
36+routeMode: true,
37+}).skipConfigGuard,
2838).toBe(false);
2939expect(
30-shouldSkipRouteConfigGuardForCommandPath({
40+resolvePolicy({
3141commandPath: ["gateway", "status"],
32-suppressDoctorStdout: false,
33-}),
42+routeMode: true,
43+}).skipConfigGuard,
3444).toBe(true);
3545expect(
36-shouldSkipRouteConfigGuardForCommandPath({
46+resolvePolicy({
3747commandPath: ["status"],
38-suppressDoctorStdout: false,
39-}),
48+routeMode: true,
49+}).skipConfigGuard,
4050).toBe(false);
4151});
42524353it("matches plugin preload policy", () => {
4454expect(
45-shouldLoadPluginsForCommandPath({
55+resolvePolicy({
4656commandPath: ["status"],
47-jsonOutputMode: false,
48-}),
57+}).loadPlugins,
4958).toBe(false);
5059expect(
51-shouldLoadPluginsForCommandPath({
60+resolvePolicy({
5261commandPath: ["status"],
5362jsonOutputMode: true,
54-}),
63+}).loadPlugins,
5564).toBe(false);
5665expect(
57-shouldLoadPluginsForCommandPath({
66+resolvePolicy({
5867commandPath: ["health"],
59-jsonOutputMode: false,
60-}),
68+}).loadPlugins,
6169).toBe(false);
6270expect(
63-shouldLoadPluginsForCommandPath({
71+resolvePolicy({
6472commandPath: ["channels", "status"],
65-jsonOutputMode: false,
66-}),
73+}).loadPlugins,
6774).toBe(false);
6875expect(
69-shouldLoadPluginsForCommandPath({
76+resolvePolicy({
7077commandPath: ["channels", "list"],
71-jsonOutputMode: false,
72-}),
78+}).loadPlugins,
7379).toBe(false);
7480expect(
75-shouldLoadPluginsForCommandPath({
81+resolvePolicy({
7682commandPath: ["channels", "add"],
77-jsonOutputMode: false,
78-}),
83+}).loadPlugins,
7984).toBe(false);
8085expect(
81-shouldLoadPluginsForCommandPath({
86+resolvePolicy({
8287commandPath: ["channels", "logs"],
83-jsonOutputMode: false,
84-}),
88+}).loadPlugins,
8589).toBe(false);
8690expect(
87-shouldLoadPluginsForCommandPath({
91+resolvePolicy({
8892commandPath: ["message", "send"],
89-jsonOutputMode: false,
90-}),
93+}).loadPlugins,
9194).toBe(false);
9295expect(
93-shouldLoadPluginsForCommandPath({
96+resolvePolicy({
9497commandPath: ["message", "send"],
9598jsonOutputMode: true,
96-}),
99+}).loadPlugins,
97100).toBe(false);
98101expect(
99-shouldLoadPluginsForCommandPath({
102+resolvePolicy({
100103argv: ["node", "openclaw", "agent", "--json"],
101104commandPath: ["agent"],
102105jsonOutputMode: true,
103-}),
106+}).loadPlugins,
104107).toBe(false);
105108expect(
106-shouldLoadPluginsForCommandPath({
109+resolvePolicy({
107110argv: ["node", "openclaw", "agent", "--json", "--local"],
108111commandPath: ["agent"],
109112jsonOutputMode: true,
110-}),
113+}).loadPlugins,
111114).toBe(true);
112115expect(
113-shouldLoadPluginsForCommandPath({
116+resolvePolicy({
114117argv: ["node", "openclaw", "agent"],
115118commandPath: ["agent"],
116-jsonOutputMode: false,
117-}),
119+}).loadPlugins,
118120).toBe(true);
119121expect(
120-shouldLoadPluginsForCommandPath({
122+resolvePolicy({
121123commandPath: ["agents"],
122-jsonOutputMode: false,
123-}),
124+}).loadPlugins,
124125).toBe(false);
125126expect(
126-shouldLoadPluginsForCommandPath({
127+resolvePolicy({
127128commandPath: ["agents", "list"],
128-jsonOutputMode: false,
129-}),
129+}).loadPlugins,
130130).toBe(false);
131131expect(
132-shouldLoadPluginsForCommandPath({
132+resolvePolicy({
133133commandPath: ["agents", "list"],
134134jsonOutputMode: true,
135-}),
135+}).loadPlugins,
136136).toBe(false);
137137expect(
138-shouldLoadPluginsForCommandPath({
138+resolvePolicy({
139139commandPath: ["agents", "bind"],
140-jsonOutputMode: false,
141-}),
140+}).loadPlugins,
142141).toBe(false);
143142expect(
144-shouldLoadPluginsForCommandPath({
143+resolvePolicy({
145144commandPath: ["agents", "bindings"],
146145jsonOutputMode: true,
147-}),
146+}).loadPlugins,
148147).toBe(false);
149148expect(
150-shouldLoadPluginsForCommandPath({
149+resolvePolicy({
151150commandPath: ["agents", "unbind"],
152-jsonOutputMode: false,
153-}),
151+}).loadPlugins,
154152).toBe(false);
155153expect(
156-shouldLoadPluginsForCommandPath({
154+resolvePolicy({
157155commandPath: ["agents", "set-identity"],
158-jsonOutputMode: false,
159-}),
156+}).loadPlugins,
160157).toBe(false);
161158expect(
162-shouldLoadPluginsForCommandPath({
159+resolvePolicy({
163160commandPath: ["agents", "delete"],
164161jsonOutputMode: true,
165-}),
162+}).loadPlugins,
166163).toBe(false);
167164});
168165169166it("matches banner suppression policy", () => {
170-expect(shouldHideCliBannerForCommandPath(["update", "status"])).toBe(true);
171-expect(shouldHideCliBannerForCommandPath(["completion"])).toBe(true);
167+expect(resolvePolicy({ commandPath: ["update", "status"], env: {} }).hideBanner).toBe(true);
168+expect(resolvePolicy({ commandPath: ["completion"], env: {} }).hideBanner).toBe(true);
172169expect(
173-shouldHideCliBannerForCommandPath(["status"], {
174- ...process.env,
175-OPENCLAW_HIDE_BANNER: "1",
176-}),
170+resolvePolicy({
171+commandPath: ["status"],
172+env: {
173+ ...process.env,
174+OPENCLAW_HIDE_BANNER: "1",
175+},
176+}).hideBanner,
177177).toBe(true);
178-expect(shouldHideCliBannerForCommandPath(["status"], {})).toBe(false);
178+expect(resolvePolicy({ commandPath: ["status"], env: {} }).hideBanner).toBe(false);
179179});
180180181181it("uses process env banner suppression when startup env is omitted", () => {
@@ -205,16 +205,6 @@ describe("command-startup-policy", () => {
205205}
206206});
207207208-it("matches CLI PATH bootstrap policy", () => {
209-expect(shouldEnsureCliPathForCommandPath(["status"])).toBe(false);
210-expect(shouldEnsureCliPathForCommandPath(["sessions"])).toBe(false);
211-expect(shouldEnsureCliPathForCommandPath(["config", "get"])).toBe(false);
212-expect(shouldEnsureCliPathForCommandPath(["models", "status"])).toBe(false);
213-expect(shouldEnsureCliPathForCommandPath(["tools", "effective"])).toBe(false);
214-expect(shouldEnsureCliPathForCommandPath(["message", "send"])).toBe(true);
215-expect(shouldEnsureCliPathForCommandPath([])).toBe(true);
216-});
217-218208it("aggregates startup policy for commander and route-first callers", () => {
219209expect(
220210resolveCliStartupPolicy({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。