A parser-level fix that makes double_dash="required" actually behave as declared drives the major bump: values before -- are now rejected, and values after -- are routed past greedy variadics to the arg that was waiting for them. The release also fixes a cluster of long-standing Windows problems — usage bash losing every usage_* variable under WSL, run= scripts being handed to cmd /c, and completion guards being fooled by a shell function named usage — and lets generate markdown write to stdout like the other generators.
Added
-
Override the shell binary with
USAGE_SHELL_<SHELL>(#767 by @JamBalaya56562). Pointusage bash,usage zsh,usage fish, andusage powershellat a specific interpreter — mainly so Windows users can escape the WSLbash.exethat Win32's search order picks up ahead of$PATH:set USAGE_SHELL_BASH=C:\Program Files\Git\usr\bin\bash.exe usage bash C:/work/mycliThe variable is keyed by the program (so
powershell's override isUSAGE_SHELL_PWSH). Unset, empty, or whitespace-only falls back to the default. Spawn failures now name the program that was tried and the variable it came from, and on Windows abashexit 127 against a drive-letter path prints a hint pointing at this override. -
generate markdownwrites to stdout (#766 by @JamBalaya56562).--out-fileis now optional and defaults to stdout, matchingmanpage,fig,json, andcompletion.--out-file -also means stdout onmarkdown,manpage, andfig, mirroring the-f -input convention. Thewriting to …progress line moved to stderr onmarkdown,manpage,fig, andsdk, so it no longer ends up inside the generated document.--out-dirnow requires--multi.
Fixed
-
double_dash="required"is now enforced on both sides (#762 by @JamBalaya56562). The parser previously ignoredSpecDoubleDashChoices::Requiredentirely — a word offered to such an arg without--was accepted anyway, and a required arg sitting behind a greedy variadic was unreachable even with a separator. Now offering a value before--is reported asArgRequiresDoubleDash(once per variadic, not once per word), and an explicit--routes the positional cursor onto the arg that required it, past earlier args. Completion learns about--too: while an arg is locked behind a separator,--itself is offered rather than values the parser would reject. -
Windows:
usage_*variables reach WSL bash (#764 by @JamBalaya56562). On Windows thebashpicked up from the system directory is WSL's launcher, and WSL only forwards a Win32 variable whenWSLENVnames it — so scripts saw everyusage_*value unset. Bothshellandexecnow append the parsed argument names toWSLENV(bare, no/por/lflags), preserving any entries the user had already configured. -
Windows:
run=scripts useshwhen available (#765 by @JamBalaya56562).complete run=already usedsh -ceverywhere, butmount run=usedcmd /con Windows, so the same POSIX one-liner behaved differently depending on which KDL node it lived in — and shebang scripts silently exited 0 with empty output. Both call sites now share one implementation:sh -cfirst, falling back tocmd /conly ifshis not found. Non-UTF-8 output from either shell is now reported as an error instead of panicking. -
Bash/fish completion guard ignores shell functions (#760 by @JamBalaya56562). The generated completion opens with a guard that bails out when the
usageCLI is not installed, buttype -preturns exit 0 for a shell function, so any environment defining ausagefunction (e.g. oh-my-bash) passed the guard and then failed further down with an unrelated error. Switched totype -Pin both bash guards and the fish equivalent; zsh'stype -palready forces a$PATHsearch and is unchanged.
Breaking Changes
double_dash="required"positional args now reject values before--(#762). Specs where such an arg previously happened to work without a separator will now error. Inexamples/mise.usage.kdl, post---values also move from the preceding greedy variadic to the arg that declared the separator (e.g. fromTASK_ARGStoTASK_ARGS_LAST, fromTOOL@VERSIONtoCOMMANDunderexec), which changes whichusage_*variable a consumer reads. Spec authors who want the old permissiveness can drop back todouble_dash="optional"(the default).UsageErrandParseOutputgained fields.UsageErrhas a newArgRequiresDoubleDashvariant, andParseOutputgainednext_arganddouble_dash_seen. Library consumers matching these types exhaustively will need to update.
Full Changelog: v4.1.0...v5.0.0
💚 Sponsor usage
usage is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools including mise, aube, hk, and more. Work on usage is funded by sponsorships.
If usage powers CLI specs, docs, or completions for a tool you maintain or use, please consider sponsoring at jdx.dev. Every sponsorship helps the project stay independent and moving.