




















@@ -16,6 +16,7 @@ import {
1616isRootVersionInvocation,
1717normalizeGeneratedHelpCommandArgv,
1818normalizeRootHelpTargetArgv,
19+normalizeRootLogLevelArgv,
1920normalizeRootNoColorArgv,
2021shouldMigrateState,
2122shouldMigrateStateFromPath,
@@ -227,6 +228,63 @@ describe("argv helpers", () => {
227228).toEqual(["node", "openclaw", "--no-color", "doctor", "--lint", "--json"]);
228229});
229230231+it.each([
232+{
233+name: "subcommand trailing log-level",
234+argv: ["node", "openclaw", "doctor", "--log-level", "debug", "--json"],
235+expected: ["node", "openclaw", "--log-level", "debug", "doctor", "--json"],
236+},
237+{
238+name: "subcommand trailing log-level equals form",
239+argv: ["node", "openclaw", "doctor", "--log-level=trace", "--json"],
240+expected: ["node", "openclaw", "--log-level=trace", "doctor", "--json"],
241+},
242+{
243+name: "keeps existing root options first",
244+argv: ["node", "openclaw", "--profile", "work", "doctor", "--log-level", "debug"],
245+expected: ["node", "openclaw", "--profile", "work", "--log-level", "debug", "doctor"],
246+},
247+{
248+name: "keeps log-level after possible command option value",
249+argv: ["node", "openclaw", "agent", "--message", "--log-level", "debug"],
250+expected: ["node", "openclaw", "agent", "--message", "--log-level", "debug"],
251+},
252+{
253+name: "flag terminator leaves log-level positional",
254+argv: ["node", "openclaw", "nodes", "run", "--", "--log-level", "debug"],
255+expected: ["node", "openclaw", "nodes", "run", "--", "--log-level", "debug"],
256+},
257+{
258+name: "missing value remains command scoped",
259+argv: ["node", "openclaw", "doctor", "--log-level", "--json"],
260+expected: ["node", "openclaw", "doctor", "--log-level", "--json"],
261+},
262+])("normalizes root --log-level before command parsing: $name", ({ argv, expected }) => {
263+expect(normalizeRootLogLevelArgv(argv)).toEqual(expected);
264+});
265+266+it("allows final command metadata to lift log-level after boolean command flags", () => {
267+const argv = ["node", "openclaw", "doctor", "--lint", "--json", "--log-level", "debug"];
268+269+expect(
270+normalizeRootLogLevelArgv(argv, {
271+shouldPreserveLogLevel: ({ remainingArgs, logLevelIndex }) =>
272+remainingArgs[logLevelIndex - 1] === "--message",
273+}),
274+).toEqual(["node", "openclaw", "--log-level", "debug", "doctor", "--lint", "--json"]);
275+});
276+277+it("preserves log-level when final command metadata owns the option", () => {
278+const argv = ["node", "openclaw", "plugin-cmd", "--log-level", "debug"];
279+280+expect(
281+normalizeRootLogLevelArgv(argv, {
282+shouldPreserveLogLevel: ({ remainingArgs, logLevelIndex }) =>
283+remainingArgs[logLevelIndex] === "--log-level",
284+}),
285+).toEqual(argv);
286+});
287+230288it.each([
231289{
232290name: "root help command",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。