From 49b0487e5b3fc8e1698c28b1fecd0d47a6b4fa34 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sat, 20 Jun 2026 02:36:52 +0200 Subject: [PATCH] fix(test): guard kitchen sink rpc cli args --- scripts/e2e/kitchen-sink-rpc-walk.mjs | 18 +++++++++++++++++- test/scripts/kitchen-sink-rpc-walk.test.ts | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/scripts/e2e/kitchen-sink-rpc-walk.mjs b/scripts/e2e/kitchen-sink-rpc-walk.mjs index 53c82df2ddd3..628f766df5d0 100644 --- a/scripts/e2e/kitchen-sink-rpc-walk.mjs +++ b/scripts/e2e/kitchen-sink-rpc-walk.mjs @@ -85,6 +85,15 @@ export function shouldPrintHelp(argv) { return argv.some((arg) => arg === "--help" || arg === "-h"); } +export function validateCliArgs(argv) { + for (const arg of argv) { + if (arg === "--help" || arg === "-h") { + continue; + } + throw new Error(`Unknown argument: ${arg}`); + } +} + export function readPositiveInt(raw, fallback, label = "value") { const text = String(raw || "").trim(); if (!text) { @@ -2597,9 +2606,16 @@ export async function main() { } if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { - if (shouldPrintHelp(process.argv.slice(2))) { + const argv = process.argv.slice(2); + if (shouldPrintHelp(argv)) { process.stdout.write(usage()); } else { + try { + validateCliArgs(argv); + } catch (error) { + console.error(error instanceof Error ? error.message : String(error)); + process.exit(1); + } await main(); } } diff --git a/test/scripts/kitchen-sink-rpc-walk.test.ts b/test/scripts/kitchen-sink-rpc-walk.test.ts index c0629833f2e9..eb6b19ec868b 100644 --- a/test/scripts/kitchen-sink-rpc-walk.test.ts +++ b/test/scripts/kitchen-sink-rpc-walk.test.ts @@ -55,6 +55,7 @@ import { tailFile, unwrapRpcPayload, usesBuiltOpenClawEntry, + validateCliArgs, waitForGatewayReady, } from "../../scripts/e2e/kitchen-sink-rpc-walk.mjs"; import { cleanupTempDirs, makeTempDir } from "../helpers/temp-dir.js"; @@ -116,6 +117,23 @@ describe("kitchen-sink RPC isolated state", () => { expect(shouldPrintHelp([])).toBe(false); }); + it("rejects unknown CLI args before creating temp state", async () => { + expect(() => validateCliArgs(["--wat"])).toThrow("Unknown argument: --wat"); + + const error = await runCommand(process.execPath, [ + "scripts/e2e/kitchen-sink-rpc-walk.mjs", + "--wat", + ]).then( + () => undefined, + (caught: unknown) => caught as Error & { stderr?: string; stdout?: string }, + ); + + expect(error).toBeDefined(); + expect(error?.stdout).toBe(""); + expect(error?.stderr?.trim()).toBe("Unknown argument: --wat"); + expect(error?.stderr).not.toContain("temp root preserved"); + }); + it("rejects loose numeric env values before they bypass runtime guardrails", () => { expect(readPositiveInt(undefined, 60_000)).toBe(60_000); expect(readPositiveInt("", 60_000)).toBe(60_000);