From 860f285f70bdd0a180273716c61c2ed11eff27a4 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Thu, 23 Apr 2026 02:14:48 +0900 Subject: [PATCH] fix(#152-follow-up): claw init rejects trailing arguments ## What Was Broken `claw init foo` silently accepted the `foo` argument instead of rejecting it at parse time: $ claw init foo Init Project /path/to/project .claw/ skipped Trailing args should be rejected like other no-arg verbs (status, sandbox, etc.): $ claw status bar [error-kind: cli_parse] error: unrecognized argument `bar` for subcommand `status` ## Root Cause The `init` arm (main.rs:1191) was missing a `rest.len()` guard. Compare to `status` (main.rs:1319 in parse_diagnostic_verb), which correctly rejects extra args. ## What This Fix Does Add a simple length guard before constructing the CliAction::Init: "init" => { if rest.len() > 1 { return Err(format!( "unrecognized argument \`{}\` for subcommand \`init\`", rest[1] )); } Ok(CliAction::Init { output_format }) } ## Dogfood Verification Before: $ claw init foo Init Project /path/to/project After: $ claw init foo [error-kind: cli_parse] error: unrecognized argument `foo` for subcommand `init` $ claw init Init Project /path/to/project (continues normally) ## Non-Regression - `claw init` (no args) still works - All 180 binary tests pass - All 466 library tests pass ## Related - #152 (diagnostic verb suffix guard) - Follows pattern from parse_diagnostic_verb() guard clauses --- rust/crates/rusty-claude-cli/src/main.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/rust/crates/rusty-claude-cli/src/main.rs b/rust/crates/rusty-claude-cli/src/main.rs index dff88bc..35e7216 100644 --- a/rust/crates/rusty-claude-cli/src/main.rs +++ b/rust/crates/rusty-claude-cli/src/main.rs @@ -1188,7 +1188,16 @@ fn parse_args(args: &[String]) -> Result { "system-prompt" => parse_system_prompt_args(&rest[1..], output_format), "acp" => parse_acp_args(&rest[1..], output_format), "login" | "logout" => Err(removed_auth_surface_error(rest[0].as_str())), - "init" => Ok(CliAction::Init { output_format }), + "init" => { + // #152: init is a no-arg verb. Reject unexpected suffixes like `claw init foo`. + if rest.len() > 1 { + return Err(format!( + "unrecognized argument `{}` for subcommand `init`", + rest[1] + )); + } + Ok(CliAction::Init { output_format }) + } "export" => parse_export_args(&rest[1..], output_format), "prompt" => { let prompt = rest[1..].join(" ");