Skip to content

feat(derive): a command that takes nothing can be written that way - #923

Merged
jdx merged 2 commits into
agent/msrvfrom
agent/unit-variants
Aug 17, 2026
Merged

feat(derive): a command that takes nothing can be written that way#923
jdx merged 2 commits into
agent/msrvfrom
agent/unit-variants

Conversation

@jdx

@jdx jdx commented Aug 16, 2026

Copy link
Copy Markdown
Owner

The last of the communique follow-ups. clap lets a command with no options be a bare variant; the derive wanted three things to say the same:

// before
#[derive(Args)] struct Sponsors {}
enum Command { Sponsors(Box<Sponsors>) }
// ...and at the call site, because `_` leaves the payload unread and dead_code is an error in CI:
Command::Sponsors(args) => { let cli::Sponsors {} = *args; sponsors() }

// after
enum Command { #[usage(effect = "read")] Sponsors }
Command::Sponsors => sponsors(),

Everything generated speaks to a struct — its tables, its metadata, its build — so rather than teach all of that about a variant with no struct, the derive writes the empty struct such a variant implies and points the variant at it. Only the construction differs.

The struct is named after the enum as well as the variant: two enums in one module may each declare a Sponsors, and two structs of one name is a worse error than the one being avoided — it would land in the adopter's crate, pointing at something they never wrote. A test has two such enums.

effect moves with it

This is the part I did not see coming. effect is an Args attribute, because that is where a command declares itself — and a bare variant has none. Porting communique's sponsors over dropped effect=read from its spec, silently. Its in-sync test caught it, which is the second time that test has paid for itself.

So a variant carries effect when it holds nothing, and the written struct receives it as the same attribute, read by the same code. Refused on a variant that does wrap a struct: two places to say one thing is two answers waiting to disagree.

What communique deletes

 src/cli.rs  | 7 +------
 src/main.rs | 8 +-------

Verification

mutation result
a bare variant still builds with a payload generated code fails to compile
the implied struct is not written generated code fails to compile
the struct name omits the enum generated code fails to compile (two enums, one name)
effect on a struct-wrapping variant is accepted FAILED

The third survived at first — my fixture had only one enum, so nothing collided. Seven conformance tests, workspace suite green, clippy clean, gate green over mise's 211 commands.

AI-assisted — Tool: Claude Code; model: anthropic/claude-opus-5; version: unavailable.


Note

Medium Risk
Touches core Subcommands codegen and parsing/build paths for all unit variants; mistakes could break spec/help/effect metadata or cause name collisions, though coverage is broad in new conformance tests.

Overview
Subcommands can be written as bare unit variants (e.g. Sponsors,) instead of Sponsors(Box<Sponsors>) plus a hand-written empty Args struct. The derive emits a hidden #[derive(Args)] empty struct per unit variant so parsing, spec, help, and build still go through the same CommandArgs path; only enum construction changes (Command::Sponsors vs wrapping a payload).

#[usage(effect = "...")] on the variant is allowed when the variant holds nothing (forwarded onto the generated struct). Putting effect on a variant that wraps a struct is a compile error.

Naming hardening: implied structs use length-prefixed __Usage{n}{Enum}{Variant} ids so two enums in one module can both have Sponsors; variant ids use unraw() so r#type becomes command name type and macro id generation does not panic.

Adds conformance tests in unit_variants.rs and crate docs for the pattern.

Reviewed by Cursor Bugbot for commit 99f2622. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitai Bot commented Aug 16, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Central YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 15483c5c-45b2-4d7c-8f9b-071991e94dbb

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

The PR adds support for bare unit variants in Subcommands, generating empty Args helpers so existing table, metadata, validation, and build paths remain shared.

  • Supports command-level effect metadata on unit variants while rejecting it on payload-bearing variants.
  • Uses raw-identifier normalization and length-prefixed helper names to avoid the previously reported generated-name ambiguity and panic.
  • Adds conformance coverage for parsing, metadata, help, aliases, hidden commands, effects, and generated-name edge cases.

Confidence Score: 4/5

The PR is not yet safe to merge because a bare subcommand can still make an adopter's crate fail to compile when its generated helper name matches an existing module-level type.

The raw-identifier and generated-pair ambiguity issue is fixed, but unit helpers are still emitted under predictable names directly into the adopter's type namespace, leaving the previously reported user-type collision unresolved.

Files Needing Attention: derive/src/codegen.rs, derive/src/model.rs

Important Files Changed

Filename Overview
derive/src/model.rs Adds unit-variant modeling, effect validation, raw-identifier normalization, and unambiguous generated helper naming.
derive/src/codegen.rs Generates empty backing structs and unit-variant construction, but the deterministic helper remains exposed to collisions in the adopter's module namespace.
conformance/tests/unit_variants.rs Adds end-to-end coverage for unit commands, metadata, aliases, hiding, effects, and generated-name edge cases.
derive/src/lib.rs Documents bare subcommand variants and where their effect metadata is declared.

Reviews (5): Last reviewed commit: "fix(derive): a command may be named afte..." | Re-trigger Greptile

Comment thread derive/src/model.rs Outdated
@jdx
jdx force-pushed the agent/unit-variants branch from 355b6f0 to ef3bb01 Compare August 16, 2026 23:21

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit ef3bb01. Configure here.

Comment thread derive/src/codegen.rs
@github-actions

github-actions Bot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Instruction counts

benchmark trend instructions Δ wall (min) Δ
markdown ▁▁▁▃▄▄▃▃███ 180,287,329 → 180,384,453 +0.05% 16.15 → 16.50ms +2.17%
startup ▁▁▁▁▁▁▁▁▆▃█ 1,222,732 → 1,226,001 +0.27% 0.95 → 0.96ms +0.69%

No instruction-count regression above 1%.

Only instruction counts gate. Wall clock is shown for context — on identical hardware it moves 4-20% run to run.

Measured by tak — instruction-counted CLI benchmarks, stored in this repository's git notes.

Shadow comparison

Parsing mise use -g node@20 against a shadow of mise's committed spec.
Reported, not gated: the shadow grows as the derive learns to express more, so
what to watch is the ratio rather than either column.

usage clap ratio
instructions, cold parse 72156 5895162 81x
usage: argv -> struct                            1193 ns      1.19 µs
clap: build tree + parse -> struct             497404 ns    497.40 µs
clap: parse -> struct, tree reused              23316 ns     23.32 µs
clap: build tree only                          307400 ns    307.40 µs

99f2622ead38 vs 81b1ee788d23 · measured on the runner, not pushed to the history.

Comment thread derive/src/codegen.rs
@jdx
jdx force-pushed the agent/unit-variants branch from a0a1289 to 0f401af Compare August 16, 2026 23:53

jdx commented Aug 16, 2026

Copy link
Copy Markdown
Owner Author

Triaged all three; none needs a change here, but the second one surfaced a real limitation worth writing down.

Synthesized identifiers collide and panic — neither half holds. Raw identifiers are unraw'd before the name is built (enum_ident.unraw() / variant.unraw()), so r#type never reaches syn::Ident::new with its prefix. And the concatenation is not separator-free: it carries the enum name's length, so the pair you name goes to __Usage3FooBarBaz and __Usage6FooBarBaz. Verified by compiling a CLI with a r#type bare variant alongside a normal one.

Public generated unit structs — the premise is not right: pub items are legal in function scope. pub struct, pub mod, and pub fn in an impl all compile inside a fn body; rustc emits no error and only an unused warning.

Underneath it, though, there is a real failure — a Subcommands enum declared in a function body does not compile, because the generated mod refers to its types through super, and super from a module nested in a function body is the enclosing module, not the body:

error[E0425]: cannot find type `__Usage5LocalInner` in module `super`
error[E0425]: cannot find type `Local` in module `super`

Not a regression from this PR, and not about unit variants: the identical enum written with a wrapping variant and no bare variant anywhere fails the same way, with the same two errors. It is a pre-existing limitation of the mod/super emission. Filing it separately rather than expanding this PR's scope.

Generated helper collides with user types — accepted. __Usage{len}{Enum}{Variant} is __-prefixed, length-disambiguated against sibling enums, and would require an adopter to declare that exact name at module scope. Worth a note in the derive docs rather than a hygiene mechanism.

AI-assisted — Tool: Claude Code; model: anthropic/claude-opus-5; version: unavailable.

jdx and others added 2 commits August 17, 2026 00:25
clap lets one be a bare variant. The derive wanted `Sponsors(Box<Sponsors>)`, an empty
struct to put in it, and — at the call site — a destructure, because a `_` leaves the
payload unread and `dead_code` is an error in CI. Three things to say that a command has
no options. communique carries all three today; with this it says nothing.

Everything generated speaks to a struct — its tables, its metadata, its `build` — so
rather than teach all of that about a variant with no struct, the derive writes the empty
struct such a variant implies and points the variant at it. Only the construction differs.
The struct is named after the enum as well as the variant, because two enums in one module
may each declare a `Sponsors` and two structs of one name is a worse error than the one
being avoided — landing in the adopter's crate, pointing at something they never wrote.

`effect` moves with it. It is otherwise an `Args` attribute, because that is where a
command declares itself, and a bare variant has none — so the variant carries it and the
written struct receives it as the same attribute, read by the same code. Found by porting
communique's `sponsors` over and watching `effect=read` vanish from the spec: its
in-sync test caught it, which is the second time that test has earned its place.

Refused on a variant that *does* wrap a struct: two places to say one thing is two answers
waiting to disagree.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…y rhyme

Two hazards in the name the implied struct gets, plus one they uncovered.

A raw identifier prints as `r#type`, and `Ident::new` **panics** on the `#` — a
proc-macro panic, which is the worst way for a CLI to learn it used a keyword for a
command name. Stripped before the name is built.

And plain concatenation is ambiguous: `Ambiguous::PairTwo` and `AmbiguousPair::Two` both
read as `AmbiguousPairTwo`, so two enums in one module would generate one struct twice.
The parts are length-prefixed rather than separated by an underscore, which would have
landed a `non_camel_case_types` warning in the adopter's crate about a type they never
wrote.

The test for the first found a third, older than this branch: the raw prefix also reached
the *command name*, so a variant written `r#type` produced a command called `r#type` —
which no user could type. It is `type` now, for bare and struct-wrapping variants alike.

Found by greptile.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jdx
jdx force-pushed the agent/unit-variants branch from 0f401af to 99f2622 Compare August 17, 2026 00:26
jdx added a commit that referenced this pull request Aug 17, 2026
`usage` is now its own first adopter. The ten command structs, the root and the
two command enums are declared with `usage-derive` instead of clap, and
`--usage-spec` prints `Cli::to_kdl()` — the same tables that parsed the command
line, rather than a transcription of a clap `Command` through `clap_usage`.

Smaller than mise and far less forgiving of a lossy spec, because this CLI's
spec is what generates its own docs, manpage and completions: anything the
derive cannot say shows up in the checked-in output.

## What went away

- `clap`, `clap_usage` and the `clap-sort` dev-dependency, plus `tests/clap_sort.rs`
  — declaration order is held by the spec since #915.
- `command_effects.rs`'s two tables, 60 lines that existed because "clap has no
  way to express this". Each command declares `#[usage(effect = "…")]` where it
  is defined; the file keeps `UNCLASSIFIED` and the coverage tests, which now
  read the derived metadata. A stale entry is no longer possible for the effects
  themselves — an effect moves with the command it is written on.

## What the conversion needed

- The four shell commands shared one `Shell` struct, which the derive refuses:
  a command collects into the struct that declares it. They are four structs
  flattening a shared group now, written by a macro so the paragraph of long
  help is not copied four times. Their docs improve as a side effect — all four
  used to say "Execute a shell script with the specified shell".
- `sponsors` is a bare variant (#923), so its empty struct is gone.
- `requires` has no positive form in the spec, so the two constraints that used
  it are stated as `required_if` on the other flag. `--out-dir requires --multi`
  is a positive requirement on a `bool` and has no spelling at all; #925
  adds `requires`, and it belongs here when it lands.

## What the emitted spec gains and loses

Gains `JDX_USAGE_BIN` on `--usage-bin` (the bridge dropped `env`), long help that
keeps its line breaks, an `about` for `generate manpage`, and `name "usage"`
rather than `name "usage-cli"`.

Loses `subcommand_required`, which the spec can hold and the derive knows from a
bare `T` subcommand field but does not emit, and strictness on subcommands:
`unknown_flags` is accepted on an `Args` and ignored, and the root's is not
inherited, so only the root is strict. Both are derive gaps worth their own fix
rather than a workaround here.

Workspace suite green, clippy clean, docs and assets re-rendered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jdx
jdx merged commit 6e563a4 into main Aug 17, 2026
11 checks passed
jdx added a commit that referenced this pull request Aug 17, 2026
`usage` is now its own first adopter. The ten command structs, the root and the
two command enums are declared with `usage-derive` instead of clap, and
`--usage-spec` prints `Cli::to_kdl()` — the same tables that parsed the command
line, rather than a transcription of a clap `Command` through `clap_usage`.

Smaller than mise and far less forgiving of a lossy spec, because this CLI's
spec is what generates its own docs, manpage and completions: anything the
derive cannot say shows up in the checked-in output.

## What went away

- `clap`, `clap_usage` and the `clap-sort` dev-dependency, plus `tests/clap_sort.rs`
  — declaration order is held by the spec since #915.
- `command_effects.rs`'s two tables, 60 lines that existed because "clap has no
  way to express this". Each command declares `#[usage(effect = "…")]` where it
  is defined; the file keeps `UNCLASSIFIED` and the coverage tests, which now
  read the derived metadata. A stale entry is no longer possible for the effects
  themselves — an effect moves with the command it is written on.

## What the conversion needed

- The four shell commands shared one `Shell` struct, which the derive refuses:
  a command collects into the struct that declares it. They are four structs
  flattening a shared group now, written by a macro so the paragraph of long
  help is not copied four times. Their docs improve as a side effect — all four
  used to say "Execute a shell script with the specified shell".
- `sponsors` is a bare variant (#923), so its empty struct is gone.
- `requires` has no positive form in the spec, so the two constraints that used
  it are stated as `required_if` on the other flag. `--out-dir requires --multi`
  is a positive requirement on a `bool` and has no spelling at all; #925
  adds `requires`, and it belongs here when it lands.

## What the emitted spec gains and loses

Gains `JDX_USAGE_BIN` on `--usage-bin` (the bridge dropped `env`), long help that
keeps its line breaks, an `about` for `generate manpage`, and `name "usage"`
rather than `name "usage-cli"`.

Loses `subcommand_required`, which the spec can hold and the derive knows from a
bare `T` subcommand field but does not emit, and strictness on subcommands:
`unknown_flags` is accepted on an `Args` and ignored, and the root's is not
inherited, so only the root is strict. Both are derive gaps worth their own fix
rather than a workaround here.

Workspace suite green, clippy clean, docs and assets re-rendered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jdx added a commit that referenced this pull request Aug 17, 2026
`usage` is now its own first adopter. The ten command structs, the root and the
two command enums are declared with `usage-derive` instead of clap, and
`--usage-spec` prints `Cli::to_kdl()` — the same tables that parsed the command
line, rather than a transcription of a clap `Command` through `clap_usage`.

Smaller than mise and far less forgiving of a lossy spec, because this CLI's
spec is what generates its own docs, manpage and completions: anything the
derive cannot say shows up in the checked-in output.

## What went away

- `clap`, `clap_usage` and the `clap-sort` dev-dependency, plus `tests/clap_sort.rs`
  — declaration order is held by the spec since #915.
- `command_effects.rs`'s two tables, 60 lines that existed because "clap has no
  way to express this". Each command declares `#[usage(effect = "…")]` where it
  is defined; the file keeps `UNCLASSIFIED` and the coverage tests, which now
  read the derived metadata. A stale entry is no longer possible for the effects
  themselves — an effect moves with the command it is written on.

## What the conversion needed

- The four shell commands shared one `Shell` struct, which the derive refuses:
  a command collects into the struct that declares it. They are four structs
  flattening a shared group now, written by a macro so the paragraph of long
  help is not copied four times. Their docs improve as a side effect — all four
  used to say "Execute a shell script with the specified shell".
- `sponsors` is a bare variant (#923), so its empty struct is gone.
- `requires` has no positive form in the spec, so the two constraints that used
  it are stated as `required_if` on the other flag. `--out-dir requires --multi`
  is a positive requirement on a `bool` and has no spelling at all; #925
  adds `requires`, and it belongs here when it lands.

## What the emitted spec gains and loses

Gains `JDX_USAGE_BIN` on `--usage-bin` (the bridge dropped `env`), long help that
keeps its line breaks, an `about` for `generate manpage`, and `name "usage"`
rather than `name "usage-cli"`.

Loses `subcommand_required`, which the spec can hold and the derive knows from a
bare `T` subcommand field but does not emit, and strictness on subcommands:
`unknown_flags` is accepted on an `Args` and ignored, and the root's is not
inherited, so only the root is strict. Both are derive gaps worth their own fix
rather than a workaround here.

Workspace suite green, clippy clean, docs and assets re-rendered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jdx added a commit that referenced this pull request Aug 17, 2026
`usage` is now its own first adopter. The ten command structs, the root and the
two command enums are declared with `usage-derive` instead of clap, and
`--usage-spec` prints `Cli::to_kdl()` — the same tables that parsed the command
line, rather than a transcription of a clap `Command` through `clap_usage`.

Smaller than mise and far less forgiving of a lossy spec, because this CLI's
spec is what generates its own docs, manpage and completions: anything the
derive cannot say shows up in the checked-in output.

## What went away

- `clap`, `clap_usage` and the `clap-sort` dev-dependency, plus `tests/clap_sort.rs`
  — declaration order is held by the spec since #915.
- `command_effects.rs`'s two tables, 60 lines that existed because "clap has no
  way to express this". Each command declares `#[usage(effect = "…")]` where it
  is defined; the file keeps `UNCLASSIFIED` and the coverage tests, which now
  read the derived metadata. A stale entry is no longer possible for the effects
  themselves — an effect moves with the command it is written on.

## What the conversion needed

- The four shell commands shared one `Shell` struct, which the derive refuses:
  a command collects into the struct that declares it. They are four structs
  flattening a shared group now, written by a macro so the paragraph of long
  help is not copied four times. Their docs improve as a side effect — all four
  used to say "Execute a shell script with the specified shell".
- `sponsors` is a bare variant (#923), so its empty struct is gone.
- `requires` has no positive form in the spec, so the two constraints that used
  it are stated as `required_if` on the other flag. `--out-dir requires --multi`
  is a positive requirement on a `bool` and has no spelling at all; #925
  adds `requires`, and it belongs here when it lands.

## What the emitted spec gains and loses

Gains `JDX_USAGE_BIN` on `--usage-bin` (the bridge dropped `env`), long help that
keeps its line breaks, an `about` for `generate manpage`, and `name "usage"`
rather than `name "usage-cli"`.

Loses `subcommand_required`, which the spec can hold and the derive knows from a
bare `T` subcommand field but does not emit, and strictness on subcommands:
`unknown_flags` is accepted on an `Args` and ignored, and the root's is not
inherited, so only the root is strict. Both are derive gaps worth their own fix
rather than a workaround here.

Workspace suite green, clippy clean, docs and assets re-rendered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jdx added a commit that referenced this pull request Aug 17, 2026
`usage` is now its own first adopter. The ten command structs, the root and the
two command enums are declared with `usage-derive` instead of clap, and
`--usage-spec` prints `Cli::to_kdl()` — the same tables that parsed the command
line, rather than a transcription of a clap `Command` through `clap_usage`.

Smaller than mise and far less forgiving of a lossy spec, because this CLI's
spec is what generates its own docs, manpage and completions: anything the
derive cannot say shows up in the checked-in output.

## What went away

- `clap`, `clap_usage` and the `clap-sort` dev-dependency, plus `tests/clap_sort.rs`
  — declaration order is held by the spec since #915.
- `command_effects.rs`'s two tables, 60 lines that existed because "clap has no
  way to express this". Each command declares `#[usage(effect = "…")]` where it
  is defined; the file keeps `UNCLASSIFIED` and the coverage tests, which now
  read the derived metadata. A stale entry is no longer possible for the effects
  themselves — an effect moves with the command it is written on.

## What the conversion needed

- The four shell commands shared one `Shell` struct, which the derive refuses:
  a command collects into the struct that declares it. They are four structs
  flattening a shared group now, written by a macro so the paragraph of long
  help is not copied four times. Their docs improve as a side effect — all four
  used to say "Execute a shell script with the specified shell".
- `sponsors` is a bare variant (#923), so its empty struct is gone.
- `requires` has no positive form in the spec, so the two constraints that used
  it are stated as `required_if` on the other flag. `--out-dir requires --multi`
  is a positive requirement on a `bool` and has no spelling at all; #925
  adds `requires`, and it belongs here when it lands.

## What the emitted spec gains and loses

Gains `JDX_USAGE_BIN` on `--usage-bin` (the bridge dropped `env`), long help that
keeps its line breaks, an `about` for `generate manpage`, and `name "usage"`
rather than `name "usage-cli"`.

Loses `subcommand_required`, which the spec can hold and the derive knows from a
bare `T` subcommand field but does not emit, and strictness on subcommands:
`unknown_flags` is accepted on an `Args` and ignored, and the root's is not
inherited, so only the root is strict. Both are derive gaps worth their own fix
rather than a workaround here.

Workspace suite green, clippy clean, docs and assets re-rendered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jdx added a commit that referenced this pull request Aug 17, 2026
`usage` is now its own first adopter. The ten command structs, the root and the
two command enums are declared with `usage-derive` instead of clap, and
`--usage-spec` prints `Cli::to_kdl()` — the same tables that parsed the command
line, rather than a transcription of a clap `Command` through `clap_usage`.

Smaller than mise and far less forgiving of a lossy spec, because this CLI's
spec is what generates its own docs, manpage and completions: anything the
derive cannot say shows up in the checked-in output.

## What went away

- `clap`, `clap_usage` and the `clap-sort` dev-dependency, plus `tests/clap_sort.rs`
  — declaration order is held by the spec since #915.
- `command_effects.rs`'s two tables, 60 lines that existed because "clap has no
  way to express this". Each command declares `#[usage(effect = "…")]` where it
  is defined; the file keeps `UNCLASSIFIED` and the coverage tests, which now
  read the derived metadata. A stale entry is no longer possible for the effects
  themselves — an effect moves with the command it is written on.

## What the conversion needed

- The four shell commands shared one `Shell` struct, which the derive refuses:
  a command collects into the struct that declares it. They are four structs
  flattening a shared group now, written by a macro so the paragraph of long
  help is not copied four times. Their docs improve as a side effect — all four
  used to say "Execute a shell script with the specified shell".
- `sponsors` is a bare variant (#923), so its empty struct is gone.
- `requires` has no positive form in the spec, so the two constraints that used
  it are stated as `required_if` on the other flag. `--out-dir requires --multi`
  is a positive requirement on a `bool` and has no spelling at all; #925
  adds `requires`, and it belongs here when it lands.

## What the emitted spec gains and loses

Gains `JDX_USAGE_BIN` on `--usage-bin` (the bridge dropped `env`), long help that
keeps its line breaks, an `about` for `generate manpage`, and `name "usage"`
rather than `name "usage-cli"`.

Loses `subcommand_required`, which the spec can hold and the derive knows from a
bare `T` subcommand field but does not emit, and strictness on subcommands:
`unknown_flags` is accepted on an `Args` and ignored, and the root's is not
inherited, so only the root is strict. Both are derive gaps worth their own fix
rather than a workaround here.

Workspace suite green, clippy clean, docs and assets re-rendered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jdx added a commit that referenced this pull request Aug 17, 2026
`usage` is now its own first adopter. The ten command structs, the root and the
two command enums are declared with `usage-derive` instead of clap, and
`--usage-spec` prints `Cli::to_kdl()` — the same tables that parsed the command
line, rather than a transcription of a clap `Command` through `clap_usage`.

Smaller than mise and far less forgiving of a lossy spec, because this CLI's
spec is what generates its own docs, manpage and completions: anything the
derive cannot say shows up in the checked-in output.

## What went away

- `clap`, `clap_usage` and the `clap-sort` dev-dependency, plus `tests/clap_sort.rs`
  — declaration order is held by the spec since #915.
- `command_effects.rs`'s two tables, 60 lines that existed because "clap has no
  way to express this". Each command declares `#[usage(effect = "…")]` where it
  is defined; the file keeps `UNCLASSIFIED` and the coverage tests, which now
  read the derived metadata. A stale entry is no longer possible for the effects
  themselves — an effect moves with the command it is written on.

## What the conversion needed

- The four shell commands shared one `Shell` struct, which the derive refuses:
  a command collects into the struct that declares it. They are four structs
  flattening a shared group now, written by a macro so the paragraph of long
  help is not copied four times. Their docs improve as a side effect — all four
  used to say "Execute a shell script with the specified shell".
- `sponsors` is a bare variant (#923), so its empty struct is gone.
- `requires` has no positive form in the spec, so the two constraints that used
  it are stated as `required_if` on the other flag. `--out-dir requires --multi`
  is a positive requirement on a `bool` and has no spelling at all; #925
  adds `requires`, and it belongs here when it lands.

## What the emitted spec gains and loses

Gains `JDX_USAGE_BIN` on `--usage-bin` (the bridge dropped `env`), long help that
keeps its line breaks, an `about` for `generate manpage`, and `name "usage"`
rather than `name "usage-cli"`.

Loses `subcommand_required`, which the spec can hold and the derive knows from a
bare `T` subcommand field but does not emit, and strictness on subcommands:
`unknown_flags` is accepted on an `Args` and ignored, and the root's is not
inherited, so only the root is strict. Both are derive gaps worth their own fix
rather than a workaround here.

Workspace suite green, clippy clean, docs and assets re-rendered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jdx added a commit that referenced this pull request Aug 17, 2026
`usage` is now its own first adopter. The ten command structs, the root and the
two command enums are declared with `usage-derive` instead of clap, and
`--usage-spec` prints `Cli::to_kdl()` — the same tables that parsed the command
line, rather than a transcription of a clap `Command` through `clap_usage`.

Smaller than mise and far less forgiving of a lossy spec, because this CLI's
spec is what generates its own docs, manpage and completions: anything the
derive cannot say shows up in the checked-in output.

## What went away

- `clap`, `clap_usage` and the `clap-sort` dev-dependency, plus `tests/clap_sort.rs`
  — declaration order is held by the spec since #915.
- `command_effects.rs`'s two tables, 60 lines that existed because "clap has no
  way to express this". Each command declares `#[usage(effect = "…")]` where it
  is defined; the file keeps `UNCLASSIFIED` and the coverage tests, which now
  read the derived metadata. A stale entry is no longer possible for the effects
  themselves — an effect moves with the command it is written on.

## What the conversion needed

- The four shell commands shared one `Shell` struct, which the derive refuses:
  a command collects into the struct that declares it. They are four structs
  flattening a shared group now, written by a macro so the paragraph of long
  help is not copied four times. Their docs improve as a side effect — all four
  used to say "Execute a shell script with the specified shell".
- `sponsors` is a bare variant (#923), so its empty struct is gone.
- `requires` has no positive form in the spec, so the two constraints that used
  it are stated as `required_if` on the other flag. `--out-dir requires --multi`
  is a positive requirement on a `bool` and has no spelling at all; #925
  adds `requires`, and it belongs here when it lands.

## What the emitted spec gains and loses

Gains `JDX_USAGE_BIN` on `--usage-bin` (the bridge dropped `env`), long help that
keeps its line breaks, an `about` for `generate manpage`, and `name "usage"`
rather than `name "usage-cli"`.

Loses `subcommand_required`, which the spec can hold and the derive knows from a
bare `T` subcommand field but does not emit, and strictness on subcommands:
`unknown_flags` is accepted on an `Args` and ignored, and the root's is not
inherited, so only the root is strict. Both are derive gaps worth their own fix
rather than a workaround here.

Workspace suite green, clippy clean, docs and assets re-rendered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jdx added a commit that referenced this pull request Aug 17, 2026
`usage` is now its own first adopter. The ten command structs, the root and the
two command enums are declared with `usage-derive` instead of clap, and
`--usage-spec` prints `Cli::to_kdl()` — the same tables that parsed the command
line, rather than a transcription of a clap `Command` through `clap_usage`.

Smaller than mise and far less forgiving of a lossy spec, because this CLI's
spec is what generates its own docs, manpage and completions: anything the
derive cannot say shows up in the checked-in output.

## What went away

- `clap`, `clap_usage` and the `clap-sort` dev-dependency, plus `tests/clap_sort.rs`
  — declaration order is held by the spec since #915.
- `command_effects.rs`'s two tables, 60 lines that existed because "clap has no
  way to express this". Each command declares `#[usage(effect = "…")]` where it
  is defined; the file keeps `UNCLASSIFIED` and the coverage tests, which now
  read the derived metadata. A stale entry is no longer possible for the effects
  themselves — an effect moves with the command it is written on.

## What the conversion needed

- The four shell commands shared one `Shell` struct, which the derive refuses:
  a command collects into the struct that declares it. They are four structs
  flattening a shared group now, written by a macro so the paragraph of long
  help is not copied four times. Their docs improve as a side effect — all four
  used to say "Execute a shell script with the specified shell".
- `sponsors` is a bare variant (#923), so its empty struct is gone.
- `requires` has no positive form in the spec, so the two constraints that used
  it are stated as `required_if` on the other flag. `--out-dir requires --multi`
  is a positive requirement on a `bool` and has no spelling at all; #925
  adds `requires`, and it belongs here when it lands.

## What the emitted spec gains and loses

Gains `JDX_USAGE_BIN` on `--usage-bin` (the bridge dropped `env`), long help that
keeps its line breaks, an `about` for `generate manpage`, and `name "usage"`
rather than `name "usage-cli"`.

Loses `subcommand_required`, which the spec can hold and the derive knows from a
bare `T` subcommand field but does not emit, and strictness on subcommands:
`unknown_flags` is accepted on an `Args` and ignored, and the root's is not
inherited, so only the root is strict. Both are derive gaps worth their own fix
rather than a workaround here.

Workspace suite green, clippy clean, docs and assets re-rendered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jdx added a commit that referenced this pull request Aug 17, 2026
`usage` is now its own first adopter. The ten command structs, the root and the
two command enums are declared with `usage-derive` instead of clap, and
`--usage-spec` prints `Cli::to_kdl()` — the same tables that parsed the command
line, rather than a transcription of a clap `Command` through `clap_usage`.

Smaller than mise and far less forgiving of a lossy spec, because this CLI's
spec is what generates its own docs, manpage and completions: anything the
derive cannot say shows up in the checked-in output.

## What went away

- `clap`, `clap_usage` and the `clap-sort` dev-dependency, plus `tests/clap_sort.rs`
  — declaration order is held by the spec since #915.
- `command_effects.rs`'s two tables, 60 lines that existed because "clap has no
  way to express this". Each command declares `#[usage(effect = "…")]` where it
  is defined; the file keeps `UNCLASSIFIED` and the coverage tests, which now
  read the derived metadata. A stale entry is no longer possible for the effects
  themselves — an effect moves with the command it is written on.

## What the conversion needed

- The four shell commands shared one `Shell` struct, which the derive refuses:
  a command collects into the struct that declares it. They are four structs
  flattening a shared group now, written by a macro so the paragraph of long
  help is not copied four times. Their docs improve as a side effect — all four
  used to say "Execute a shell script with the specified shell".
- `sponsors` is a bare variant (#923), so its empty struct is gone.
- `requires` has no positive form in the spec, so the two constraints that used
  it are stated as `required_if` on the other flag. `--out-dir requires --multi`
  is a positive requirement on a `bool` and has no spelling at all; #925
  adds `requires`, and it belongs here when it lands.

## What the emitted spec gains and loses

Gains `JDX_USAGE_BIN` on `--usage-bin` (the bridge dropped `env`), long help that
keeps its line breaks, an `about` for `generate manpage`, and `name "usage"`
rather than `name "usage-cli"`.

Loses `subcommand_required`, which the spec can hold and the derive knows from a
bare `T` subcommand field but does not emit, and strictness on subcommands:
`unknown_flags` is accepted on an `Args` and ignored, and the root's is not
inherited, so only the root is strict. Both are derive gaps worth their own fix
rather than a workaround here.

Workspace suite green, clippy clean, docs and assets re-rendered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jdx added a commit that referenced this pull request Aug 17, 2026
`usage` is now its own first adopter. The ten command structs, the root and the
two command enums are declared with `usage-derive` instead of clap, and
`--usage-spec` prints `Cli::to_kdl()` — the same tables that parsed the command
line, rather than a transcription of a clap `Command` through `clap_usage`.

Smaller than mise and far less forgiving of a lossy spec, because this CLI's
spec is what generates its own docs, manpage and completions: anything the
derive cannot say shows up in the checked-in output.

- `clap`, `clap_usage` and the `clap-sort` dev-dependency, plus `tests/clap_sort.rs`
  — declaration order is held by the spec since #915.
- `command_effects.rs`'s two tables, 60 lines that existed because "clap has no
  way to express this". Each command declares `#[usage(effect = "…")]` where it
  is defined; the file keeps `UNCLASSIFIED` and the coverage tests, which now
  read the derived metadata. A stale entry is no longer possible for the effects
  themselves — an effect moves with the command it is written on.

- The four shell commands shared one `Shell` struct, which the derive refuses:
  a command collects into the struct that declares it. They are four structs
  flattening a shared group now, written by a macro so the paragraph of long
  help is not copied four times. Their docs improve as a side effect — all four
  used to say "Execute a shell script with the specified shell".
- `sponsors` is a bare variant (#923), so its empty struct is gone.
- `requires` has no positive form in the spec, so the two constraints that used
  it are stated as `required_if` on the other flag. `--out-dir requires --multi`
  is a positive requirement on a `bool` and has no spelling at all; #925
  adds `requires`, and it belongs here when it lands.

Gains `JDX_USAGE_BIN` on `--usage-bin` (the bridge dropped `env`), long help that
keeps its line breaks, an `about` for `generate manpage`, and `name "usage"`
rather than `name "usage-cli"`.

Loses `subcommand_required`, which the spec can hold and the derive knows from a
bare `T` subcommand field but does not emit, and strictness on subcommands:
`unknown_flags` is accepted on an `Args` and ignored, and the root's is not
inherited, so only the root is strict. Both are derive gaps worth their own fix
rather than a workaround here.

Workspace suite green, clippy clean, docs and assets re-rendered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
pull Bot pushed a commit to rozsazoltan-forks/usage-rust-cli that referenced this pull request Aug 17, 2026
…nd did not write (jdx#937)

Stacked on jdx#923 — review that first; this PR's diff is the last commit.
One of the two gaps jdx#936 found by converting usage-cli itself to the
derive; the other one gets its own PR.

A bare `T` subcommand field requires a subcommand and an `Option<T>`
does not. The parser has always refused the invocation accordingly —
that half was never missing — but `Spec::to_kdl` wrote nothing, so the
emitted KDL described `usage generate` as a command a user could type on
its own.

That reaches past help text: docs, manpages, completions and the SDK
generators all read the emitted spec rather than the Rust type, so every
one of them was offering a command that cannot run.

```kdl
cmd "settings" help="Manage settings" subcommand_required=#true {
```

## Shape

Cold metadata rather than a parse table — `subcommand_required` is not
how a word binds, and the hot path never reads it. `CommandMeta` gains a
`bool`, the derive fills it from the field's type, and the writer emits
it **only where there is something to require**: the property on a
command with no subcommands is a spec the linter reports and nothing
could satisfy, so both conditions are held.

`gen-shadow` already read `subcommand_required` from a KDL and chose `T`
against `Option<T>` accordingly, so mise's shadow round-trips it now
instead of losing it on the way back out.

## Verification

- `conformance/tests/subcommand_required.rs` — four tests: a strict
command says it, a loose one stays quiet *and* reads back as `false`, a
leaf never claims it, and the parser and the spec agree about which
invocations exist.
- `nesting`'s snapshot picks the change up on a fixture that was already
shaped this way, which is the check that this is emission rather than a
new rule.
- Workspace suite green, clippy clean.

## Not fixed here

The spec accepts `subcommand_required` only inside a `cmd` block, so a
**root** that cannot run alone still has no way to say so — the same
restriction as the root mount, recorded next to it in PLAN.md. The clap
bridge could not say it either, so nothing regressed.

_This PR was generated by Claude Code._

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Cold-path metadata and KDL emission only; parsing behavior was already
correct, with added compile-time validation for an invalid flatten
shape.
> 
> **Overview**
> **Emits `subcommand_required` in specs** so docs, completions, and
generators match parser behavior: a non-optional `#[usage(subcommand)]`
field sets cold metadata and writes `subcommand_required=#true` only
when the command actually has subcommands; optional fields stay omitted
and read back as false.
> 
> **Compile-time guard** via `flatten_checks`: a `#[usage(flatten)]`
type that still declares subcommands fails const evaluation, because
flatten would leave the parent unable to express required subcommands
while the nested `build` still demands one.
> 
> **Tests and docs**: new `conformance/tests/subcommand_required.rs`,
updated nesting snapshot (`settings` gains the flag), and PLAN.md marks
the derive/spec gap done while noting root-level `subcommand_required`
remains unsupported in KDL.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
8ca7f41. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
  * Command specifications now identify when a subcommand is required.
* Help, documentation, completions, and generated specifications
consistently reflect required versus optional subcommands.
  * Nested required-subcommand behavior is supported.

* **Bug Fixes**
* Improved parsing and specification output for commands with required
or optional subcommands.

* **Documentation**
* Documented the remaining limitation that root-level required
subcommands cannot currently be represented.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
pull Bot pushed a commit to rozsazoltan-forks/usage-rust-cli that referenced this pull request Aug 17, 2026
…a tree (jdx#939)

Stacked on jdx#937 (and so on jdx#923) — review those first; this PR's diff is
the last commit. The second of the two gaps jdx#936 found by converting
usage-cli itself to the derive.

usage-lib resolves this by walking outward from the command that ran and
falling back to the spec's own setting — `effective_unknown_flags` in
`lib/src/parse.rs`. usage-argv held the effective value per command
instead, on the theory that whoever built the tables would resolve it.

A derive cannot. It expands one struct at a time and cannot see the
command above, so `#[usage(unknown_flags = "error")]` reached the root
alone — and on an `Args` it was parsed and then **ignored**, a
declaration that compiled and did nothing. A CLI could not make a
subcommand strict, or a single command lenient, whatever it wrote.

```rust
#[usage(bin = "usage", unknown_flags = "error")]  // now reaches the whole tree
struct Cli { … }

#[usage(unknown_flags = "value")]                 // now means something on an Args
struct Bash { … }                                 // `usage bash x.sh --script-flag`
```

Without it, `usage lint --nope f.kdl` offers `--nope` to the positional,
so the *file* becomes `--nope` and the real file is the unexpected word
— where clap named the flag.

## Shape

`Command::unknown_flags` is an `Option` now: `None` means inherit. The
parser carries the effective value down as it descends rather than
reading it off the command in scope — one branch on descent, and a field
read instead of a pointer chase on the two sites that ask.

The KDL writer follows: a command that states nothing writes nothing,
one that restates what it inherited writes nothing, and one that differs
says so. Same output as before for every spec that already
round-tripped.

**The corpus's table builder stops resolving inheritance on the way
in**, which is the part worth noticing: `conformance/src/argv.rs` had
its own correct implementation of the rule, and that is exactly why no
vector ever caught the parser not having one. One implementation now, in
the parser, where the reference has it.

## Cost

**160 instructions per parse — 72,272 against 72,112** at mise's scale,
measured twice against the parent branch on one machine. cachegrind is
deterministic; both figures repeated.

## Verification

- `conformance/tests/unknown_flags_inherit.rs` — five tests: a
subcommand inherits the root's answer, it reaches two levels down, a
command that declares its own keeps it, the emitted spec says what the
parser does, and **usage-lib reads the emitted spec the same way**,
which is the claim that matters.
- `a_subcommand_writes_unknown_flags_only_where_it_differs` gains a
command that declares nothing at all, which is the case the `Option`
adds.
- Workspace suite green, clippy clean, corpus green.

_This PR was generated by Claude Code._

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Changes core argv binding for unrecognized flags across the whole CLI
tree; behavior fixes are intentional but affect every parse path that
relied on the old pre-resolved tables.
> 
> **Overview**
> **`unknown_flags` now inherits down the command tree** instead of
being baked into each command table. `Command::unknown_flags` is
`Option<UnknownFlags>` (`None` = inherit); the parser keeps an effective
mode on descent and only updates it when a subcommand sets one.
> 
> The derive emits `None` for commands that do not declare the attribute
(fixing root-only `error` and ignored `#[usage(unknown_flags)]` on
`Args`). KDL emission and the conformance table builder stop flattening
inheritance on build—only the parser applies the rule, matching
usage-lib’s outward walk.
> 
> New `conformance/tests/unknown_flags_inherit.rs` covers inheritance
depth, per-command `value`, spec round-trip, and usage-lib parity on
emitted KDL.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
2ff6307. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
jdx added a commit that referenced this pull request Aug 17, 2026
`usage` is now its own first adopter. The ten command structs, the root and the
two command enums are declared with `usage-derive` instead of clap, and
`--usage-spec` prints `Cli::to_kdl()` — the same tables that parsed the command
line, rather than a transcription of a clap `Command` through `clap_usage`.

Smaller than mise and far less forgiving of a lossy spec, because this CLI's
spec is what generates its own docs, manpage and completions: anything the
derive cannot say shows up in the checked-in output.

- `clap`, `clap_usage` and the `clap-sort` dev-dependency, plus `tests/clap_sort.rs`
  — declaration order is held by the spec since #915.
- `command_effects.rs`'s two tables, 60 lines that existed because "clap has no
  way to express this". Each command declares `#[usage(effect = "…")]` where it
  is defined; the file keeps `UNCLASSIFIED` and the coverage tests, which now
  read the derived metadata. A stale entry is no longer possible for the effects
  themselves — an effect moves with the command it is written on.

- The four shell commands shared one `Shell` struct, which the derive refuses:
  a command collects into the struct that declares it. They are four structs
  flattening a shared group now, written by a macro so the paragraph of long
  help is not copied four times. Their docs improve as a side effect — all four
  used to say "Execute a shell script with the specified shell".
- `sponsors` is a bare variant (#923), so its empty struct is gone.
- `requires` has no positive form in the spec, so the two constraints that used
  it are stated as `required_if` on the other flag. `--out-dir requires --multi`
  is a positive requirement on a `bool` and has no spelling at all; #925
  adds `requires`, and it belongs here when it lands.

Gains `JDX_USAGE_BIN` on `--usage-bin` (the bridge dropped `env`), long help that
keeps its line breaks, an `about` for `generate manpage`, and `name "usage"`
rather than `name "usage-cli"`.

Loses `subcommand_required`, which the spec can hold and the derive knows from a
bare `T` subcommand field but does not emit, and strictness on subcommands:
`unknown_flags` is accepted on an `Args` and ignored, and the root's is not
inherited, so only the root is strict. Both are derive gaps worth their own fix
rather than a workaround here.

Workspace suite green, clippy clean, docs and assets re-rendered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jdx added a commit that referenced this pull request Aug 17, 2026
`usage` is now its own first adopter. The ten command structs, the root and the
two command enums are declared with `usage-derive` instead of clap, and
`--usage-spec` prints `Cli::to_kdl()` — the same tables that parsed the command
line, rather than a transcription of a clap `Command` through `clap_usage`.

Smaller than mise and far less forgiving of a lossy spec, because this CLI's
spec is what generates its own docs, manpage and completions: anything the
derive cannot say shows up in the checked-in output.

- `clap`, `clap_usage` and the `clap-sort` dev-dependency, plus `tests/clap_sort.rs`
  — declaration order is held by the spec since #915.
- `command_effects.rs`'s two tables, 60 lines that existed because "clap has no
  way to express this". Each command declares `#[usage(effect = "…")]` where it
  is defined; the file keeps `UNCLASSIFIED` and the coverage tests, which now
  read the derived metadata. A stale entry is no longer possible for the effects
  themselves — an effect moves with the command it is written on.

- The four shell commands shared one `Shell` struct, which the derive refuses:
  a command collects into the struct that declares it. They are four structs
  flattening a shared group now, written by a macro so the paragraph of long
  help is not copied four times. Their docs improve as a side effect — all four
  used to say "Execute a shell script with the specified shell".
- `sponsors` is a bare variant (#923), so its empty struct is gone.
- `requires` has no positive form in the spec, so the two constraints that used
  it are stated as `required_if` on the other flag. `--out-dir requires --multi`
  is a positive requirement on a `bool` and has no spelling at all; #925
  adds `requires`, and it belongs here when it lands.

Gains `JDX_USAGE_BIN` on `--usage-bin` (the bridge dropped `env`), long help that
keeps its line breaks, an `about` for `generate manpage`, and `name "usage"`
rather than `name "usage-cli"`.

Loses `subcommand_required`, which the spec can hold and the derive knows from a
bare `T` subcommand field but does not emit, and strictness on subcommands:
`unknown_flags` is accepted on an `Args` and ignored, and the root's is not
inherited, so only the root is strict. Both are derive gaps worth their own fix
rather than a workaround here.

Workspace suite green, clippy clean, docs and assets re-rendered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jdx added a commit that referenced this pull request Aug 17, 2026
`usage` is now its own first adopter. The ten command structs, the root and the
two command enums are declared with `usage-derive` instead of clap, and
`--usage-spec` prints `Cli::to_kdl()` — the same tables that parsed the command
line, rather than a transcription of a clap `Command` through `clap_usage`.

Smaller than mise and far less forgiving of a lossy spec, because this CLI's
spec is what generates its own docs, manpage and completions: anything the
derive cannot say shows up in the checked-in output.

- `clap`, `clap_usage` and the `clap-sort` dev-dependency, plus `tests/clap_sort.rs`
  — declaration order is held by the spec since #915.
- `command_effects.rs`'s two tables, 60 lines that existed because "clap has no
  way to express this". Each command declares `#[usage(effect = "…")]` where it
  is defined; the file keeps `UNCLASSIFIED` and the coverage tests, which now
  read the derived metadata. A stale entry is no longer possible for the effects
  themselves — an effect moves with the command it is written on.

- The four shell commands shared one `Shell` struct, which the derive refuses:
  a command collects into the struct that declares it. They are four structs
  flattening a shared group now, written by a macro so the paragraph of long
  help is not copied four times. Their docs improve as a side effect — all four
  used to say "Execute a shell script with the specified shell".
- `sponsors` is a bare variant (#923), so its empty struct is gone.
- `requires` has no positive form in the spec, so the two constraints that used
  it are stated as `required_if` on the other flag. `--out-dir requires --multi`
  is a positive requirement on a `bool` and has no spelling at all; #925
  adds `requires`, and it belongs here when it lands.

Gains `JDX_USAGE_BIN` on `--usage-bin` (the bridge dropped `env`), long help that
keeps its line breaks, an `about` for `generate manpage`, and `name "usage"`
rather than `name "usage-cli"`.

Loses `subcommand_required`, which the spec can hold and the derive knows from a
bare `T` subcommand field but does not emit, and strictness on subcommands:
`unknown_flags` is accepted on an `Args` and ignored, and the root's is not
inherited, so only the root is strict. Both are derive gaps worth their own fix
rather than a workaround here.

Workspace suite green, clippy clean, docs and assets re-rendered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Aug 24, 2026
⚠️ **CAUTION: this is a major update, indicating a breaking change!** ⚠️

This MR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [usage](https://github.com/jdx/usage) | tools | major | `5.1.0` → `6.2.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>jdx/usage (usage)</summary>

### [`v6.2.0`](https://github.com/jdx/usage/blob/HEAD/CHANGELOG.md#620---2026-08-24)

[Compare Source](jdx/usage@v6.1.1...v6.2.0)

##### 🚀 Features

- **(argv)** add embedded parse outcomes by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1250](jdx/usage#1250)
- **(cli)** render inline formatting in help text by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1245](jdx/usage#1245)
- **(cli)** split grouped help template sections by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1251](jdx/usage#1251)
- **(complete)** add presentation labels to candidates by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1239](jdx/usage#1239)
- **(complete)** expose structured completion traces by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1241](jdx/usage#1241)
- **(complete)** add semantic candidate kinds by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1242](jdx/usage#1242)
- **(complete)** add Elvish runtime completions by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1243](jdx/usage#1243)
- **(derive)** let argument groups carry values by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1253](jdx/usage#1253)
- **(derive)** add typed command finalization by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1254](jdx/usage#1254)
- **(derive)** add runtime-computed defaults by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1256](jdx/usage#1256)
- **(derive)** dispatch embedded control requests by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1270](jdx/usage#1270)
- **(derive)** emit embedded\_outcome\_into for converted CLIs by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1281](jdx/usage#1281)
- **(docs)** allow overriding markdown templates by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1267](jdx/usage#1267)
- **(docs)** default to compact markdown references by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1272](jdx/usage#1272)
- **(docs)** polish compact markdown references by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1280](jdx/usage#1280)
- **(help)** expose addressable help topics by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1257](jdx/usage#1257)
- **(help)** list commands by name in one aligned column by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1284](jdx/usage#1284)
- **(help)** wrap the short help page by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1287](jdx/usage#1287)
- **(parse)** add structured diagnostic reports by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1255](jdx/usage#1255)
- **(parse)** add opt-in response files by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1259](jdx/usage#1259)
- **(parse)** preserve ordered argument groups by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1271](jdx/usage#1271)
- **(spec)** declare command outputs and exit codes by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1249](jdx/usage#1249)
- **(spec)** add surface availability metadata by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1258](jdx/usage#1258)
- **(spec)** add semantic note and warning blocks by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1273](jdx/usage#1273)
- **(spec)** add output media types by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1274](jdx/usage#1274)
- **(spec)** add help prose to heading sections by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1282](jdx/usage#1282)
- add dynamic command catalogs by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1275](jdx/usage#1275)

##### 🐛 Bug Fixes

- **(completion)** handle attached values and emit built-ins by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1277](jdx/usage#1277)
- **(derive)** preserve flattened command metadata by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1268](jdx/usage#1268)
- **(derive)** skip choice checks for typed defaults by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1269](jdx/usage#1269)
- **(derive)** suppress generated partial field lint by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1278](jdx/usage#1278)
- **(derive)** keep an invalid choice after an override displaces the flag by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1286](jdx/usage#1286)
- **(spec)** make the two KDL writers agree on three more nodes by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1289](jdx/usage#1289)

##### 🚜 Refactor

- **(deps)** replace versions with semver by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1285](jdx/usage#1285)

##### ⚡ Performance

- **(argv)** reduce sort code size by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1264](jdx/usage#1264)
- **(markdown)** skip empty admonition context by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1279](jdx/usage#1279)
- document usage-rs parser tradeoffs by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1265](jdx/usage#1265)

##### 🛡️ Security

- **(complete)** filter path candidates by extension by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1240](jdx/usage#1240)

##### 🔍 Other Changes

- update usage of deprecated `str downcase` thingy in nushell by [@&#8203;TheBearodactyl](https://github.com/TheBearodactyl) in [#&#8203;1262](jdx/usage#1262)

##### New Contributors

- [@&#8203;TheBearodactyl](https://github.com/TheBearodactyl) made their first contribution in [#&#8203;1262](jdx/usage#1262)

### [`v6.1.1`](https://github.com/jdx/usage/blob/HEAD/CHANGELOG.md#611---2026-08-23)

[Compare Source](jdx/usage@v6.1.0...v6.1.1)

##### 🐛 Bug Fixes

- **(argv)** simplify generated completion headers by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1226](jdx/usage#1226)
- **(argv)** plan for the target platform, not the host by [@&#8203;JamBalaya56562](https://github.com/JamBalaya56562) in [#&#8203;1233](jdx/usage#1233)
- **(complete)** keep the path separator the caller typed by [@&#8203;JamBalaya56562](https://github.com/JamBalaya56562) in [#&#8203;1230](jdx/usage#1230)
- **(config)** report config paths without the verbatim prefix by [@&#8203;JamBalaya56562](https://github.com/JamBalaya56562) in [#&#8203;1232](jdx/usage#1232)
- **(docs)** separate visible flag aliases by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1228](jdx/usage#1228)
- **(test)** compile the platform-conditional fixtures warning-free on windows by [@&#8203;JamBalaya56562](https://github.com/JamBalaya56562) in [#&#8203;1234](jdx/usage#1234)

##### ⚡ Performance

- **(derive)** outline invalid-value error construction from generated builds by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1235](jdx/usage#1235)
- **(derive)** share the repeated-value collection loop across fields by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1236](jdx/usage#1236)

##### 🧪 Testing

- **(windows)** let the suite run where zsh, fish and bash-completion are not by [@&#8203;JamBalaya56562](https://github.com/JamBalaya56562) in [#&#8203;1229](jdx/usage#1229)

### [`v6.1.0`](https://github.com/jdx/usage/blob/HEAD/CHANGELOG.md#610---2026-08-22)

[Compare Source](jdx/usage@v6.0.0...v6.1.0)

##### 🚀 Features

- **(cli)** read settings under a prefix mise does not strip by [@&#8203;JamBalaya56562](https://github.com/JamBalaya56562) in [#&#8203;1213](jdx/usage#1213)
- **(derive)** dispatch more of the matches CLIs already write by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1221](jdx/usage#1221)
- **(spec)** apply runtime identity and flatten headings in help by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1220](jdx/usage#1220)

##### 🐛 Bug Fixes

- **(derive)** flow long help and emit kdl raw multiline strings by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1215](jdx/usage#1215)

##### 📚 Documentation

- **(rust)** drop the restated one-declaration line from the intro by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1211](jdx/usage#1211)
- **(spec)** complete KDL reference by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1214](jdx/usage#1214)

### [`v6.0.0`](https://github.com/jdx/usage/blob/HEAD/CHANGELOG.md#600---2026-08-22)

[Compare Source](jdx/usage@v5.1.0...v6.0.0)

##### 🚀 Features

- **(argv)** add a zero-allocation argv parser by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;798](jdx/usage#798)
- **(argv)** emit a usage spec from static metadata by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;801](jdx/usage#801)
- **(argv)** a bound stops a variadic by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;826](jdx/usage#826)
- **(argv)** route a word that names nothing to the default subcommand by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;848](jdx/usage#848)
- **(argv)** join static tables at compile time by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;851](jdx/usage#851)
- **(argv)** render the usage line, byte-identical to usage-lib's by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;854](jdx/usage#854)
- **(argv)** render `-h`, byte-identical to usage-lib's by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;860](jdx/usage#860)
- **(argv)** render `--help` too, byte-identical to usage-lib's by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;866](jdx/usage#866)
- **(argv)** answer `--help` and `-h` by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;870](jdx/usage#870)
- **(argv)** answer the `help` subcommand by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;872](jdx/usage#872)
- **(argv)** split a command line the way the shell that typed it would by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;874](jdx/usage#874)
- **(argv)** read the cursor's position off a real parse by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;876](jdx/usage#876)
- **(argv)** offer what the reference offers, from compiled tables by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;877](jdx/usage#877)
- **(argv)** generate the shell script each shell wants by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;887](jdx/usage#887)
- **(argv)** let a Rust function answer for a value by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;888](jdx/usage#888)
- **(argv)** write the `run=` a declared completer answers by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;890](jdx/usage#890)
- **(argv)** say what went wrong the way clap says it by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;895](jdx/usage#895)
- **(argv)** suggest what was probably meant by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;897](jdx/usage#897)
- **(argv)** answer `--version`, which an adopter loses on the way from clap by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;909](jdx/usage#909)
- **(argv)** a flag whose value may be left off by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;969](jdx/usage#969)
- **(argv)** take flag-like detached values when declared by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1012](jdx/usage#1012)
- **(bench)** count what a parse allocates, and stop allocating for commands nobody ran by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;829](jdx/usage#829)
- **(cli)** hold a spec's declaration order, the way clap-sort holds a clap CLI's by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;915](jdx/usage#915)
- **(cli)** parse usage's own command line with the parser usage ships by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;965](jdx/usage#965)
- **(cli)** support long version text by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1120](jdx/usage#1120)
- **(cli)** check that examples still parse, and let the derive declare them by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1168](jdx/usage#1168)
- **(cli)** add usage explain by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1179](jdx/usage#1179)
- **(cli)** add usage diff for spec compatibility checking by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1171](jdx/usage#1171)
- **(complete)** complete config keys and values from the spec by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;840](jdx/usage#840)
- **(complete)** add async runtime overlays by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1060](jdx/usage#1060)
- **(complete)** support command value hints by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1081](jdx/usage#1081)
- **(complete)** add shell quoting filter by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1114](jdx/usage#1114)
- **(complete)** support full value hint vocabulary by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1119](jdx/usage#1119)
- **(complete)** expand partial path segments by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1128](jdx/usage#1128)
- **(complete)** support shell alias registration by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1158](jdx/usage#1158)
- **(complete)** **breaking** remove the vendored bash-completion copy by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1176](jdx/usage#1176)
- **(complete)** install a completion script where its shell looks for it by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1188](jdx/usage#1188)
- **(config)** read config files as a layer by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;856](jdx/usage#856)
- **(config)** explain why a setting has the value it has by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;857](jdx/usage#857)
- **(config)** read a resolution as the types a struct holds by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;862](jdx/usage#862)
- **(config)** generate the settings registry from the spec by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;864](jdx/usage#864)
- **(config)** generate the settings struct a CLI reads by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;865](jdx/usage#865)
- **(config)** hold a value to the choices its setting declares by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;868](jdx/usage#868)
- **(config)** carry a setting's choices into the generated registry by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;869](jdx/usage#869)
- **(config)** say what sort of thing each warning is by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;873](jdx/usage#873)
- **(config)** carry the flags a setting declares into its registry by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;880](jdx/usage#880)
- **(config)** read the command line as a layer by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;881](jdx/usage#881)
- **(config)** compare the flags a spec declares with the flags a CLI binds by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;884](jdx/usage#884)
- **(config)** support optional props and aliases by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1134](jdx/usage#1134)
- **(config)** read YAML config files by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1192](jdx/usage#1192)
- **(config)** ask for provenance by key, like a value by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1195](jdx/usage#1195)
- **(config)** a read that keeps every setting that reads by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1196](jdx/usage#1196)
- **(config)** close Config derive and spec authoring gaps by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1202](jdx/usage#1202)
- **(config)** gate deprecated settings by explicit CLI version by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1201](jdx/usage#1201)
- **(derive)** compile a struct into parse tables and a spec by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;803](jdx/usage#803)
- **(derive)** compile subcommands from an enum by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;816](jdx/usage#816)
- **(derive)** check what a parse cannot decide on its own by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;817](jdx/usage#817)
- **(derive)** nest commands to any depth by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;818](jdx/usage#818)
- **(derive)** declare which flags conflict and which require each other by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;820](jdx/usage#820)
- **(derive)** let a flag displace another, the last one given winning by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;821](jdx/usage#821)
- **(derive)** let a command answer to more than one name by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;827](jdx/usage#827)
- **(derive)** let a variant hold its command in a `Box` by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;828](jdx/usage#828)
- **(derive)** let a field be the type it means by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;833](jdx/usage#833)
- **(derive)** declare the words a value may be by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;838](jdx/usage#838)
- **(derive)** hold the bytes a word arrived as by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;841](jdx/usage#841)
- **(derive)** declare the properties mise patches in by hand by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;842](jdx/usage#842)
- **(derive)** accept a value the OS accepts and UTF-8 does not by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;844](jdx/usage#844)
- **(derive)** share declarations between commands with flatten by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;852](jdx/usage#852)
- **(derive)** say three things about a CLI the spec could and the derive could not by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;853](jdx/usage#853)
- **(derive)** answer a completion request from the binary itself by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;885](jdx/usage#885)
- **(derive)** bind a flag to a setting, from what the parser saw by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;889](jdx/usage#889)
- **(derive)** a setting can be declared wherever a flag is by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;896](jdx/usage#896)
- **(derive)** let a field name the function that completes it by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;892](jdx/usage#892)
- **(derive)** say how an argument relates to `--`, all four ways by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;900](jdx/usage#900)
- **(derive)** a default a collecting field can hold by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;902](jdx/usage#902)
- **(derive)** say what a command does to the world by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;905](jdx/usage#905)
- **(derive)** name a value the way clap names it, and say which usage can read the spec by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;907](jdx/usage#907)
- **(derive)** let `parse()` answer a failure the way a program does by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;910](jdx/usage#910)
- **(derive)** read the package's version, and be called what the binary is called by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;917](jdx/usage#917)
- **(derive)** a command that takes nothing can be written that way by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;923](jdx/usage#923)
- **(derive)** say that a command cannot be run alone, which it knew and did not write by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;937](jdx/usage#937)
- **(derive)** keep command aliases on their args by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;946](jdx/usage#946)
- **(derive)** preserve verbatim doc comments by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;949](jdx/usage#949)
- **(derive)** support path value hints by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;951](jdx/usage#951)
- **(derive)** declare a group where the flags are declared by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;934](jdx/usage#934)
- **(derive)** add value-conditional requirements by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1002](jdx/usage#1002)
- **(derive)** add skip for fields that are not arguments by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1009](jdx/usage#1009)
- **(derive)** support inline subcommand fields by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1055](jdx/usage#1055)
- **(derive)** accept runtime metadata expressions by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1056](jdx/usage#1056)
- **(derive)** accept clap value attributes by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1057](jdx/usage#1057)
- **(derive)** parse full argv with program name by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1063](jdx/usage#1063)
- **(derive)** support clap no binary name by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1064](jdx/usage#1064)
- **(derive)** support unit command structs by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1071](jdx/usage#1071)
- **(derive)** reuse args across commands by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1076](jdx/usage#1076)
- **(derive)** support runtime program identity by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1078](jdx/usage#1078)
- **(derive)** preserve value enum metadata by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1079](jdx/usage#1079)
- **(derive)** accept clap field spellings by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1086](jdx/usage#1086)
- **(derive)** preserve hidden flag aliases by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1087](jdx/usage#1087)
- **(derive)** resolve relationships through flatten by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1088](jdx/usage#1088)
- **(derive)** support flattened overrides by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1089](jdx/usage#1089)
- **(derive)** preserve flattened help headings by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1090](jdx/usage#1090)
- **(derive)** support clap casing policies by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1094](jdx/usage#1094)
- **(derive)** bind value enums directly by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1110](jdx/usage#1110)
- **(derive)** accept portable clap field spellings by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1135](jdx/usage#1135)
- **(derive)** inherit clap command metadata by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1136](jdx/usage#1136)
- **(derive)** support clap implicit groups by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1137](jdx/usage#1137)
- **(derive)** generate command dispatch by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1182](jdx/usage#1182)
- **(derive)** add usage::Config derive for settings declared in code by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1180](jdx/usage#1180)
- **(derive)** close remaining PLAN gaps for 6.x by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1197](jdx/usage#1197)
- **(docs)** support granular help visibility by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1107](jdx/usage#1107)
- **(docs)** customize subcommand presentation by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1108](jdx/usage#1108)
- **(docs)** color process-facing help by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1111](https://github.com/jdx/usage/pull/1111)
- **(docs)** support help width controls by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1113](https://github.com/jdx/usage/pull/1113)
- **(docs)** support next-line help layout by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1117](https://github.com/jdx/usage/pull/1117)
- **(docs)** support flattened subcommand help by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1118](https://github.com/jdx/usage/pull/1118)
- **(docs)** support explicit display order by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1121](https://github.com/jdx/usage/pull/1121)
- **(docs)** group subcommands under help headings by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1153](https://github.com/jdx/usage/pull/1153)
- **(docs)** add recursive help by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1132](https://github.com/jdx/usage/pull/1132)
- **(generate)** add json-schema for a CLI's config file by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;839](https://github.com/jdx/usage/pull/839)
- **(go)** emit Go parse tables from a spec, which is what Go has instead of a derive by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;931](https://github.com/jdx/usage/pull/931)
- **(go)** emit the cold table too, so generated code can apply the rules by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;959](https://github.com/jdx/usage/pull/959)
- **(go)** render the usage line, from a third table that costs nothing unused by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;964](https://github.com/jdx/usage/pull/964)
- **(go)** render a failure as something a person can act on by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;977](https://github.com/jdx/usage/pull/977)
- **(go)** generate a struct per command, and the Parse that fills them by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;990](https://github.com/jdx/usage/pull/990)
- **(go)** answer the completion request a shell sends by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1005](https://github.com/jdx/usage/pull/1005)
- **(go)** enforce value-conditional requirements by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1003](https://github.com/jdx/usage/pull/1003)
- **(help)** line the flag column up, and give the short page a column at all by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;912](https://github.com/jdx/usage/pull/912)
- **(help)** list the flags a command inherits by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;913](https://github.com/jdx/usage/pull/913)
- **(help)** list `--help` and `--version`, which every page answers by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;914](https://github.com/jdx/usage/pull/914)
- **(lib)** add usage-rs facade by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;963](https://github.com/jdx/usage/pull/963)
- **(lib)** ship usage-rs as the one-crate rust default by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1041](https://github.com/jdx/usage/pull/1041)
- **(parse)** support inferred prefixes by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1080](https://github.com/jdx/usage/pull/1080)
- **(parse)** support arg required else help by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1093](https://github.com/jdx/usage/pull/1093)
- **(parse)** add narrow token boundary controls by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1097](https://github.com/jdx/usage/pull/1097)
- **(parse)** preserve trailing delimiters by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1098](https://github.com/jdx/usage/pull/1098)
- **(parse)** add scalar repeat policy by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1102](https://github.com/jdx/usage/pull/1102)
- **(parse)** add subcommand requirement policy by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1103](https://github.com/jdx/usage/pull/1103)
- **(parse)** add argument subcommand conflicts by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1104](https://github.com/jdx/usage/pull/1104)
- **(parse)** add subcommand value precedence by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1105](https://github.com/jdx/usage/pull/1105)
- **(parse)** support missing optional positionals by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1106](https://github.com/jdx/usage/pull/1106)
- **(parse)** support optional flag values by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1109](https://github.com/jdx/usage/pull/1109)
- **(parse)** support custom help and version actions by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1123](https://github.com/jdx/usage/pull/1123)
- **(parse)** accept explicit boolean values by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1124](https://github.com/jdx/usage/pull/1124)
- **(parse)** support non-strict choices by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1127](https://github.com/jdx/usage/pull/1127)
- **(parse)** support ordered environment fallbacks by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1130](https://github.com/jdx/usage/pull/1130)
- **(parse)** warn at runtime when a deprecated declaration is used by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1186](https://github.com/jdx/usage/pull/1186)
- **(spec)** support flag relationships by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;793](https://github.com/jdx/usage/pull/793)
- **(spec)** add help\_heading, and render it by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;802](https://github.com/jdx/usage/pull/802)
- **(spec)** allow a mount at the top level by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;806](https://github.com/jdx/usage/pull/806)
- **(spec)** make unknown flags configurable, and keep them as values by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;810](https://github.com/jdx/usage/pull/810)
- **(spec)** add `conflicts` to flags by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;819](https://github.com/jdx/usage/pull/819)
- **(spec)** say that one flag needs another, which nothing here could by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;925](https://github.com/jdx/usage/pull/925)
- **(spec)** **breaking** a group, for the rule that no single flag can state by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;927](https://github.com/jdx/usage/pull/927)
- **(spec)** a flag that has to be given on its own by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;941](https://github.com/jdx/usage/pull/941)
- **(spec)** split a value the way clap splits one by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;961](https://github.com/jdx/usage/pull/961)
- **(spec)** add value-conditional requirements by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1001](https://github.com/jdx/usage/pull/1001)
- **(spec)** refuse a detached value when require\_equals is set by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1013](https://github.com/jdx/usage/pull/1013)
- **(spec)** bind a value when a flag is given with none by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1015](https://github.com/jdx/usage/pull/1015)
- **(spec)** forward unmatched words as an external subcommand by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1021](https://github.com/jdx/usage/pull/1021)
- **(spec)** bind a default when another flag is given by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1023](https://github.com/jdx/usage/pull/1023)
- **(spec)** add portable expression validation by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1037](https://github.com/jdx/usage/pull/1037)
- **(spec)** add borrowed metadata overlays by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1059](https://github.com/jdx/usage/pull/1059)
- **(spec)** omit versions from metadata views by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1066](https://github.com/jdx/usage/pull/1066)
- **(spec)** support positional conflicts and groups by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1085](https://github.com/jdx/usage/pull/1085)
- **(spec)** add fixed arity value names by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1099](https://github.com/jdx/usage/pull/1099)
- **(spec)** complete relationship families by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1100](https://github.com/jdx/usage/pull/1100)
- **(spec)** expose package metadata by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1116](https://github.com/jdx/usage/pull/1116)
- **(spec)** add deprecation milestones by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1129](https://github.com/jdx/usage/pull/1129)
- **(spec)** add executable views by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1143](https://github.com/jdx/usage/pull/1143)
- **(spec)** add deprecated config environment aliases by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1159](https://github.com/jdx/usage/pull/1159)
- **(spec)** declare source\_code\_link\_template on the derive by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1184](https://github.com/jdx/usage/pull/1184)
- **(spec)** answer **usage\_spec** from a binary's own tables by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1183](https://github.com/jdx/usage/pull/1183)
- **(spec)** reusable flag declarations with flagset and use by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1170](https://github.com/jdx/usage/pull/1170)
- **(spec)** **breaking** lower the derive's flatten into a flagset by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1172](https://github.com/jdx/usage/pull/1172)
- **(test)** a test harness for an adopter's own suite by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1181](https://github.com/jdx/usage/pull/1181)

##### 🐛 Bug Fixes

- **(argv)** stop a repeatable flag from eating a positional by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;799](https://github.com/jdx/usage/pull/799)
- **(argv)** inherit `unknown_flags`, which reached one command out of a tree by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;939](https://github.com/jdx/usage/pull/939)
- **(argv)** reject duplicate flags by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;945](https://github.com/jdx/usage/pull/945)
- **(argv)** show choices when a subcommand is required by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;947](https://github.com/jdx/usage/pull/947)
- **(argv)** a bare `-` binds where it was typed by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;986](https://github.com/jdx/usage/pull/986)
- **(argv)** put zsh's magic comment first, and print fish's candidates as data by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1033](https://github.com/jdx/usage/pull/1033)
- **(ci)** unblock releases by cutting usage-derive's dev-dependency by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;811](https://github.com/jdx/usage/pull/811)
- **(ci)** check the version the crates promise, and promise one that is true by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;918](https://github.com/jdx/usage/pull/918)
- **(clap)** say what clap would do with an unknown flag by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;899](https://github.com/jdx/usage/pull/899)
- **(cli)** recognize about as root command help by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;794](https://github.com/jdx/usage/pull/794)
- **(complete)** resolve config keys through aliases and renames by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1169](https://github.com/jdx/usage/pull/1169)
- **(config)** accept case-insensitive boolean words by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1207](https://github.com/jdx/usage/pull/1207)
- **(derive)** let a `--`-only argument follow a variadic by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;823](https://github.com/jdx/usage/pull/823)
- **(derive)** three more descriptions a spec keeps and the derive lost by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;861](https://github.com/jdx/usage/pull/861)
- **(derive)** name the mistake when `settings` has nothing to collect by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;904](https://github.com/jdx/usage/pull/904)
- **(derive)** emit the tables beside the user's types, not in a module above them by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;938](https://github.com/jdx/usage/pull/938)
- **(derive)** a global flag may be given once per command, not once per line by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;991](https://github.com/jdx/usage/pull/991)
- **(derive)** separate value metadata from parsing by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1054](https://github.com/jdx/usage/pull/1054)
- **(derive)** make defaulted fields optional in metadata by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1065](https://github.com/jdx/usage/pull/1065)
- **(derive)** isolate process exit from adopters by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1139](https://github.com/jdx/usage/pull/1139)
- **(derive)** propagate redeclared global values by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1140](https://github.com/jdx/usage/pull/1140)
- **(derive)** preserve set-false actions by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1156](https://github.com/jdx/usage/pull/1156)
- **(derive)** name the count type in standing presence checks by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1205](https://github.com/jdx/usage/pull/1205)
- **(docs)** link multi-word commands to their real source files by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;845](https://github.com/jdx/usage/pull/845)
- **(docs)** link every command to the file that implements it by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;846](https://github.com/jdx/usage/pull/846)
- **(docs)** keep hidden entries out of help by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;859](https://github.com/jdx/usage/pull/859)
- **(docs)** list visible flag aliases by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1112](https://github.com/jdx/usage/pull/1112)
- **(help)** a command's page should say what that command does by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;911](https://github.com/jdx/usage/pull/911)
- **(help)** a declared name is not a short form, and blank help is no help by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;916](https://github.com/jdx/usage/pull/916)
- **(help)** render the page for the mount the words reached by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;928](https://github.com/jdx/usage/pull/928)
- **(help)** a description ending in a break adds no blank line by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;970](https://github.com/jdx/usage/pull/970)
- **(lib)** validate every variadic fallback by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1049](https://github.com/jdx/usage/pull/1049)
- **(parse)** keep every `--` after the first by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;809](https://github.com/jdx/usage/pull/809)
- **(parse)** stop losing a flag that is missing its value by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;807](https://github.com/jdx/usage/pull/807)
- **(parse)** answer the five vectors the reference implementation was failing by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;930](https://github.com/jdx/usage/pull/930)
- **(parse)** **breaking** a command that needs a subcommand says so by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;992](https://github.com/jdx/usage/pull/992)
- **(parse)** keep optional validation lint-clean by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1141](https://github.com/jdx/usage/pull/1141)
- **(parse)** honor separator after automatic args by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1164](https://github.com/jdx/usage/pull/1164)
- **(parse)** let a bundle contain a supplied short by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1175](https://github.com/jdx/usage/pull/1175)
- **(spec)** make the config block survive being written out by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;832](https://github.com/jdx/usage/pull/832)
- **(spec)** apply default\_subcommand only at the root by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;850](https://github.com/jdx/usage/pull/850)
- **(spec)** split a clap default by the delimiter clap splits it by by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;901](https://github.com/jdx/usage/pull/901)
- **(spec)** rank a subcommand name above another command's alias by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;967](https://github.com/jdx/usage/pull/967)
- **(spec)** preserve clap value count bounds by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1032](https://github.com/jdx/usage/pull/1032)
- **(spec)** deduplicate derived completers by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1072](https://github.com/jdx/usage/pull/1072)
- **(spec)** canonicalize derived kdl by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1095](https://github.com/jdx/usage/pull/1095)

##### 🚜 Refactor

- **(deps)** **breaking** stop shipping features and crates nobody uses by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1185](https://github.com/jdx/usage/pull/1185)
- **(deps)** drop heck from usage-derive by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1187](https://github.com/jdx/usage/pull/1187)
- **(deps)** take expr-lang without the builtins a spec cannot reach by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1191](https://github.com/jdx/usage/pull/1191)

##### 📚 Documentation

- **(plan)** tick landed clap gaps and stop quoting vector counts by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1027](https://github.com/jdx/usage/pull/1027)
- correct current Rust limitations by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1029](https://github.com/jdx/usage/pull/1029)
- audit 6.x release documentation by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1084](https://github.com/jdx/usage/pull/1084)
- add third-party license notices by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1174](https://github.com/jdx/usage/pull/1174)

##### ⚡ Performance

- **(derive)** fill the partial through \&mut instead of returning it by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;980](https://github.com/jdx/usage/pull/980)
- **(derive)** hold one subcommand's partial, not every subcommand's by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;981](https://github.com/jdx/usage/pull/981)
- **(derive)** drop proc-macro-crate transitive deps by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1042](https://github.com/jdx/usage/pull/1042)

##### 🧪 Testing

- **(clap)** preserve choices in external adopter probes by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1157](https://github.com/jdx/usage/pull/1157)
- **(corpus)** pin what completes where the cursor is by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;998](https://github.com/jdx/usage/pull/998)
- **(derive)** cover verbatim doc compatibility by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1092](https://github.com/jdx/usage/pull/1092)
- **(docs)** preserve fleet footer spacing by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1142](https://github.com/jdx/usage/pull/1142)
- **(fleet)** refresh typed adopter fixtures by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1115](https://github.com/jdx/usage/pull/1115)
- **(parse)** cover mounted command discovery by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1131](https://github.com/jdx/usage/pull/1131)
- **(parse)** add clap micro-conformance by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1133](https://github.com/jdx/usage/pull/1133)
- **(spec)** import the argv questions clap's suite answers and ours did not by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;926](https://github.com/jdx/usage/pull/926)
- **(spec)** verify portable parser settings by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1053](https://github.com/jdx/usage/pull/1053)

##### 🛡️ Security

- **(config)** resolve settings from layers, with provenance by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;849](https://github.com/jdx/usage/pull/849)
- **(config)** read the environment as a layer by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;867](https://github.com/jdx/usage/pull/867)
- **(config)** give a deprecation notice from anywhere along a rename chain by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;893](https://github.com/jdx/usage/pull/893)
- **(derive)** keep parsed fields live for lints by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1138](https://github.com/jdx/usage/pull/1138)
- **(docs)** render the config block by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;837](https://github.com/jdx/usage/pull/837)
- **(go)** render the page `-h` prints, matching usage-lib on all 211 of mise's by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;974](https://github.com/jdx/usage/pull/974)
- **(go)** render `--help` too, matching usage-lib on all 211 of mise's long pages by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;975](https://github.com/jdx/usage/pull/975)
- **(parse)** require exact command and flag names by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1096](https://github.com/jdx/usage/pull/1096)
- **(spec)** the config vocabulary by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;835](https://github.com/jdx/usage/pull/835)

##### 🔍 Other Changes

- **(docs)** remove stale mise spec fixture by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;1200](https://github.com/jdx/usage/pull/1200)
- **(perf)** say when the clap ratio slides, and record why the derive is stricter by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;996](https://github.com/jdx/usage/pull/996)
- agent/complete files by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;883](https://github.com/jdx/usage/pull/883)

##### 📦️ Dependency Updates

- update rust crate syn to v3 by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;808](https://github.com/jdx/usage/pull/808)
- update rust crate toml to v1 by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;1016](https://github.com/jdx/usage/pull/1016)

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yODguMCIsInVwZGF0ZWRJblZlciI6IjQzLjI4OC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiLCJhdXRvbWF0aW9uOmJvdC1hdXRob3JlZCIsImRlcGVuZGVuY3ktdHlwZTo6bWFqb3IiXX0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant