mirror of
https://github.com/ultraworkers/claw-code.git
synced 2026-04-25 21:54:09 +08:00
## What Was Broken
`claw bootstrap-plan garbage` silently accepted the `garbage` argument:
$ claw bootstrap-plan garbage
- CliEntry
- FastPathVersion
- StartupProfiler
- ...
Same pattern as #152 init follow-up (previous cycle): a no-arg diagnostic
verb was missing its `rest.len()` guard.
## What This Fix Does
Add parse-time length check before constructing CliAction::BootstrapPlan:
"bootstrap-plan" => {
if rest.len() > 1 {
return Err(format!(
"unrecognized argument \`{}\` for subcommand \`bootstrap-plan\`",
rest[1]
));
}
Ok(CliAction::BootstrapPlan { output_format })
}
## Dogfood Verification
Before:
$ claw bootstrap-plan garbage
- CliEntry
- FastPathVersion
(continues listing...)
After:
$ claw bootstrap-plan garbage
[error-kind: cli_parse]
error: unrecognized argument `garbage` for subcommand `bootstrap-plan`
$ claw bootstrap-plan (no args)
- CliEntry
- FastPathVersion
(still works normally)
## Full No-Arg Verb Suffix-Guard Sweep (Post-Fix)
All no-arg verbs now uniformly reject trailing garbage:
| Verb | Status |
|---|---|
| help garbage | ✅ rejects |
| version garbage | ✅ rejects |
| status garbage | ✅ rejects |
| sandbox garbage | ✅ rejects |
| doctor garbage | ✅ rejects |
| state garbage | ✅ rejects |
| init garbage | ✅ rejects (previous cycle #55) |
| diff garbage | ✅ rejects |
| plugins garbage | ✅ rejects |
| skills garbage | ✅ rejects |
| system-prompt garbage | ✅ rejects |
| dump-manifests garbage | ✅ rejects |
| bootstrap-plan garbage | ✅ rejects (this commit) |
| acp garbage | ✅ rejects |
Legitimate positionals (not a bug):
- `export <file-path>` — file path is the intended arg
- `config <section>` — flexible section filter (design question, not bug)
## Non-Regression
- `claw bootstrap-plan` (no args) still works ✅
- All 180 binary tests pass ✅
- All 466 library tests pass ✅
## Related
- #152 follow-up (init suffix guard, previous cycle)
- Completes diagnostic-verb suffix-guard contract hygiene