I’m a broken record on this topic, but there’s a ton of non-Unix prior art to learn from. Many minicomputer systems had a separation from programs and commands, with the former being not directly invoked latter being what the user called. For example, with i, programs have typed arguments with validation (including marking secrets which aren’t visible on recall), and you can call up a form (F4 key anywhere) for all the valid arguments and their types. It then assembles the the command arguments for you, then calling that builds arguments for the program (which themselves are typed - you can pass pointers on argv). There’s other good human factors features to take too, such as context-sensitive help everywhere, even for exceptions and errors.
source: https://lobste.rs/s/f18rax/i_m_re_imagining_command_line_interpreter#c_s4afyp