pub fn parse_script(input: &str) -> Result<Vec<Step>, Error>Expand description
Parse a script using the production lower_command dispatcher.
The typed ParseError converts into anyhow::Error at this boundary
with no intermediate .context() wrapping, so the message survives.
Builtin function names seed the reserved set, so FUNC shadowing a
native fails here; hosts unknown at parse time fall back to the runtime
define_func guard.