fix(coding-agent): reject invalid --mode values

fixes #9045
This commit is contained in:
Ramiz Wachtler 2026-09-22 08:29:57 +02:00
parent 1a584a7a56
commit e40126f578
2 changed files with 56 additions and 14 deletions

View file

@ -92,11 +92,21 @@ export function parseArgs(args: string[]): Args {
result.help = true;
} else if (arg === "--version" || arg === "-v") {
result.version = true;
} else if (arg === "--mode" && i + 1 < args.length) {
const mode = args[++i];
if (mode === "text" || mode === "json" || mode === "rpc") {
result.mode = mode;
} else if (arg === "--mode") {
const mode = args[i + 1];
if (mode === undefined || mode.startsWith("-")) {
result.diagnostics.push({ type: "error", message: "--mode requires text, json, or rpc" });
continue;
}
i++;
if (mode !== "text" && mode !== "json" && mode !== "rpc") {
result.diagnostics.push({
type: "error",
message: `Invalid mode "${mode}". Valid values: text, json, rpc`,
});
continue;
}
result.mode = mode;
} else if (arg === "--continue" || arg === "-c") {
result.continue = true;
} else if (arg === "--resume" || arg === "-r") {

View file

@ -115,16 +115,6 @@ describe("parseArgs", () => {
expect(result.appendSystemPrompt).toEqual(["Context A", "Context B"]);
});
test("parses --mode", () => {
const result = parseArgs(["--mode", "json"]);
expect(result.mode).toBe("json");
});
test("parses --mode rpc", () => {
const result = parseArgs(["--mode", "rpc"]);
expect(result.mode).toBe("rpc");
});
test("parses --session", () => {
const result = parseArgs(["--session", "/path/to/session.jsonl"]);
expect(result.session).toBe("/path/to/session.jsonl");
@ -157,6 +147,48 @@ describe("parseArgs", () => {
});
});
// Issue #9045
describe("--mode flag", () => {
test.each(["text", "json", "rpc"] as const)("parses --mode %s", (mode) => {
const result = parseArgs(["--mode", mode]);
expect(result.mode).toBe(mode);
expect(result.diagnostics).toEqual([]);
});
test.each(["yaml", ""])("rejects invalid --mode value %j", (mode) => {
const result = parseArgs(["--mode", mode, "--version"]);
expect(result.mode).toBeUndefined();
expect(result.version).toBe(true);
expect(result.messages).toEqual([]);
expect(result.unknownFlags.size).toBe(0);
expect(result.diagnostics).toEqual([
{ type: "error", message: `Invalid mode "${mode}". Valid values: text, json, rpc` },
]);
});
test("reports a missing --mode value", () => {
const result = parseArgs(["--mode"]);
expect(result.mode).toBeUndefined();
expect(result.unknownFlags.size).toBe(0);
expect(result.diagnostics).toEqual([{ type: "error", message: "--mode requires text, json, or rpc" }]);
});
test("does not consume another option as a --mode value", () => {
const result = parseArgs(["--mode", "--version"]);
expect(result.mode).toBeUndefined();
expect(result.version).toBe(true);
expect(result.unknownFlags.size).toBe(0);
expect(result.diagnostics).toEqual([{ type: "error", message: "--mode requires text, json, or rpc" }]);
});
test("reports an invalid --mode value after a valid one", () => {
const result = parseArgs(["--mode", "json", "--mode", "yaml"]);
expect(result.diagnostics).toEqual([
{ type: "error", message: 'Invalid mode "yaml". Valid values: text, json, rpc' },
]);
});
});
describe("--name flag", () => {
test("parses --name flag with value", () => {
const result = parseArgs(["--name", "my-session"]);