All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Command.structural_match(tokens, context)— keyword positions must match literally; typed slots are treated as always matching. Useful to find the command shape before validating individual arguments.Command.validate_arguments(tokens, context) -> list[ArgumentError]— per-slot validation that returns the list of failing slots (empty if all valid). EachArgumentErrorcarriesindex,name,value,slot_str, andvalid_options(populated forOptionsType/DynamicOptionsType).exceptions.ArgumentError(frozen dataclass) andexceptions.InvalidArgumentErrorexception. Raised by the interpreter when exactly one structurally-matching command exists but at least one typed slot fails.
Interpreter._matching_commandnow falls through to structural matching when no strict match exists. Inputs that already executed correctly behave identically; previously-rejected inputs with a valid keyword prefix and an invalid typed slot now raiseInvalidArgumentErrorinstead ofNoMatchingCommandFoundError, exposing per-slot diagnostics so callers can build precise error messages.
- Callers that catch
NoMatchingCommandFoundErrorto surface "unknown command" feedback should also catchInvalidArgumentErrorto render the new precise feedback. Genuine unknown-command inputs (no keyword prefix match) still raiseNoMatchingCommandFoundError.