Skip to content

feat(config): explain why a setting has the value it has - #857

Merged
jdx merged 1 commit into
agent/config-filesfrom
agent/config-explain
Aug 13, 2026
Merged

jdx merged 1 commit into
agent/config-filesfrom
agent/config-explain

Conversation

@jdx

@jdx jdx commented Aug 13, 2026

Copy link
Copy Markdown
Owner

config explain for every adopter, as a renderer rather than a reimplementation. Second PR of stack #858; depends on #856 only for sitting on top of it.

hk's version is the best of its kind in the fleet — it names the winning source and the exact identifier, and does per-item provenance for lists. It also costs about two hundred lines, and it is written against a second merge function that exists only to answer this question. Two merges can disagree, and when they do the explanation describes a resolution that never happened. Here there is one merge and its provenance is the answer, so this module reads what the merge recorded and formats it.

jobs = 8
  set by  HK_JOBS
  type    uint
          How many jobs to run at once

  also considered, lowest precedence first:
    the default
    hk.toml#jobs

  environment  HK_JOBS, HK_JOB
  also         git hk.jobs

What the wording is careful about

Each of these sends a user to the wrong place if it is careless:

  • A default is not something anybody set, and neither is a post-merge rewrite — default and derived rather than set by. mise's raw implying jobs = 1 must not read as though a file said so, or the user goes looking for the file.
  • The winner is not repeated among the things it beat.
  • Asking after an old name answers about both, and reads the deprecation notice from the declaration that has one — the old one. Reading it off the setting that replaced it printed nothing for the only case where it matters, which the test caught.
  • The type is the spec's spelling (uint, list<string>), not the prose an error message uses. A reader searching the docs for "a positive integer" finds nothing. That is a new Ty::name, distinct from the existing describe.

Also warnings, pairing each message with the place that caused it, and list for a config ls — sorted by key, because a registry's order is the order somebody wrote a TOML file in, and excluding hidden settings and old names, which are documented nowhere and would surface here for the first time.

Plain text on purpose: a CLI that wants JSON has the same Resolved this reads, and better taste than a library about what its own output should look like.

Eight tests, five mutations — the verbs, the winner appearing among the also-considereds, the deprecation source, hidden settings in the listing, and the sort — each verified to fail without its fix.

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


Note

Low Risk
User-facing text and warning formatting only; resolution merge logic is unchanged aside from clearer type-error strings.

Overview
Adds shared config explain rendering on top of existing merge provenance in Resolved—no second merge path. New explain, warnings, and list format plain text for one key, resolution warnings, and config ls (sorted keys, hidden/renamed keys omitted).

explain prints the winning value with shown, provenance verbs (default / derived / set by), spec types via new Ty::name, lower-precedence contributors, env/bindings hints, and deprecation along rename chains.

Supporting changes: one_line / shown in value.rs keep line-oriented output safe (newlines, empty [] / "" / {}); layer type-coercion warnings drop duplicated origin text so explain::warnings can append (origin) once; Ty coercion errors quote values with shown.

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

@coderabbitai

coderabbitai Bot commented Aug 13, 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: 33adb9d7-9c03-47cb-b9c6-7acfac937d69

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 13, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

Adds configuration explanation, warning, and listing renderers backed by the existing resolution provenance.

  • Reports winning values, origins, contributors, declared types, metadata, bindings, and rename-chain deprecations.
  • Adds stable one-line rendering for values and metadata while preserving literal path separators.
  • Separates warning messages from their structured origins and adds sorted, visibility-aware configuration listings.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains.

Important Files Changed

Filename Overview
config/src/explain.rs Adds provenance-based explain, warning, and listing renderers; the previously reported line-boundary and path-rendering issues are addressed.
config/src/value.rs Adds one-line and empty-value display helpers while deliberately preserving literal backslashes.
config/src/layer.rs Removes duplicated origin text from warning messages while retaining the structured warning origin.
config/src/ty.rs Adds specification-style type names and uses the new shown-value representation in coercion errors.
config/src/lib.rs Exposes the new explanation module and its primary explain function.

Fix All in Greploop

Reviews (15): Last reviewed commit: "feat(config): explain why a setting has ..." | Re-trigger Greptile

Comment thread config/src/explain.rs Outdated
Comment thread config/src/explain.rs
.map(|(kind, key)| format!("{kind} {key}"))
.collect();
let _ = writeln!(out, " also {}", bindings.join(", "));
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Bindings label assumes environment section

Low Severity

The bindings line is labeled also and has no leading blank line of its own, so it only reads as a continuation of environment. A setting with git or pkl bindings but no env vars gets a dangling also jammed against the type or help text.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 982b919. Configure here.

Comment thread config/src/explain.rs
@jdx
jdx force-pushed the agent/config-explain branch from 982b919 to 3b5aca5 Compare August 13, 2026 14:46

jdx commented Aug 13, 2026

Copy link
Copy Markdown
Owner Author

Both real, and both about output that lies about its own shape.

A newline in a value broke the record boundary. Both renderers here are line-oriented — one setting per line for a listing, one fact per line for an explanation — and a multi-line string is a perfectly ordinary thing to put in a TOML file. Its continuation read as another setting, or as provenance. Values now render with newlines (and carriage returns, and the backslashes that would be ambiguous) escaped.

A setting with bindings and no environment variable had a dangling also. The blank line belonged to the environment section, so a git- or pkl-bound setting with no variables had its also line jammed against the type or help above it. The blank line now opens whichever section comes first.

Three mutations, each verified. The listing test asserts the line count as well as the content, so a value that splits into two records fails rather than merely looking odd.

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

greptile-apps[bot]
greptile-apps Bot previously approved these changes Aug 13, 2026
Comment thread config/src/explain.rs
@jdx
jdx force-pushed the agent/config-explain branch from 3b5aca5 to 3cfb1dd Compare August 13, 2026 14:59
@greptile-apps
greptile-apps Bot dismissed their stale review August 13, 2026 14:59

Dismissed because a newer commit was pushed; Greptile will re-review the current head.

jdx commented Aug 13, 2026

Copy link
Copy Markdown
Owner Author

Right, and the fix belongs on the message rather than the renderer: a type error named the place in its own text and the Warning carried it, so the rendered line said the same file twice — for exactly the warnings that had bothered to be specific.

The message now says what is wrong and the renderer says where, which also means every warning renders the same way instead of two kinds needing two treatments. Test asserts the place appears exactly once; mutation-verified by putting it back.

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

Comment thread config/src/explain.rs Outdated
@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Instruction counts

benchmark trend instructions Δ wall (min) Δ
markdown ▁▁▁▁▁▂▂▂██ 175,245,063 → 175,068,442 -0.10% 16.93 → 15.89ms -6.17%
startup ▁▁▁▁▁▁▁▁██ 1,222,129 → 1,222,055 -0.01% 1.00 → 0.98ms -1.16%

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 29823 5960254 199x
usage: argv -> struct                             839 ns      0.84 µs
clap: build tree + parse -> struct             502684 ns    502.68 µs
clap: parse -> struct, tree reused              23512 ns     23.51 µs
clap: build tree only                          313841 ns    313.84 µs

59e00a7b2b56 vs fe13b0b9c7d8 · measured on the runner, not pushed to the history.

Comment thread config/src/explain.rs
@jdx
jdx force-pushed the agent/config-explain branch 3 times, most recently from a57f88a to 7612b38 Compare August 13, 2026 15:07

jdx commented Aug 13, 2026

Copy link
Copy Markdown
Owner Author

Both right, and both the same class as the value fix — applied to the other two things interpolated into a line-oriented output.

An origin can carry a newline (a path may contain one), and a warning message quotes the value it rejected, which comes out of a file and can hold anything. Either one splitting its line makes the remainder read as another record; for warnings it hides every warning after it. So the escaping moved off the value and onto the shared helper, and all three go through it.

Two things about the verification. My first test covered only one of the two places an origin is rendered — the winner's line and the also-considered list are different branches — and the mutation for the other survived; both paths now carry a newline in the test. And I pushed once with a clippy failure in between (an import left unused by the change), because my gate command let the push run after the check reported. Caught on the next pass and fixed before this push; the branch is clean now.

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

Comment thread config/src/explain.rs Outdated
@jdx
jdx force-pushed the agent/config-explain branch from 7612b38 to 769addb Compare August 13, 2026 15:15

jdx commented Aug 13, 2026

Copy link
Copy Markdown
Owner Author

Right, and worse than the problem it was solving: C:\Users\me\hk.toml came out with doubled separators, so a reader copying the path lands nowhere. The escaping now covers newlines and carriage returns only. The ambiguity that buys — a literal \n in text is indistinguishable from an escaped newline — is the right trade for output a human reads, whose one requirement is that a record stays on its line.

Test asserts a Windows path round-trips as written, and the mutation that reintroduces backslash doubling fails.

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

Comment thread config/src/explain.rs Outdated
@jdx
jdx force-pushed the agent/config-explain branch from 769addb to 8f2465c Compare August 13, 2026 15:20

jdx commented Aug 13, 2026

Copy link
Copy Markdown
Owner Author

Right — same class again, and this time for the string most likely to contain a newline: an adopter's help is a doc comment, and a doc comment with a second paragraph is the ordinary case rather than an exotic one. Help, the deprecation notice, and the joined environment and binding lists all go through the helper now.

The test asserts the line count of a whole explanation rather than only the content, so anything splitting a record fails whether or not I thought to look for it. Both mutations verified.

That is four rounds on one small renderer, each finding a different string I had not routed through the escaping — which is a fair signal that the helper should have been applied at the point where a line is written rather than at each interpolation. If a fifth turns up I will restructure it that way instead of patching another call site.

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

@jdx
jdx force-pushed the agent/config-explain branch from 8f2465c to 95ef048 Compare August 13, 2026 16:17
@jdx
jdx force-pushed the agent/config-explain branch from 95ef048 to 11e4bbb Compare August 13, 2026 16:28
@jdx
jdx force-pushed the agent/config-explain branch from 11e4bbb to c0fb90b Compare August 13, 2026 16:44
@jdx
jdx force-pushed the agent/config-explain branch from c0fb90b to 5f217e0 Compare August 13, 2026 16:56
@jdx
jdx force-pushed the agent/config-explain branch from 5f217e0 to 2329e95 Compare August 13, 2026 17:05
Comment thread config/src/explain.rs Outdated
@jdx
jdx force-pushed the agent/config-explain branch from 2329e95 to da190e9 Compare August 13, 2026 17:15

jdx commented Aug 13, 2026

Copy link
Copy Markdown
Owner Author

Right, and it is the shape I only half-handled. Reading the notice off the replacement printed
nothing for the case that matters (a rename with a notice on the old name); reading it off the
asked-about name alone prints nothing when the notice sits further along — threads renamed to
concurrency, and concurrency the step carrying "use jobs instead". A rename is not itself an
explanation of what to do instead, so the notice worth printing is the first one along the chain.

deprecation_along walks from the asked-about name and stops at the first notice, bounded by the
number of settings there are — the same guard Registry::lookup uses, so a registry whose renames
form a cycle stops instead of hanging. (usage-config-build will refuse that registry outright;
until then, nothing here can be made to loop.)

Also in this commit: one_line moved to value.rs as a crate-internal helper, because #862 needs
the same rule for its failure lines and one rule shared by every renderer is one rule.

79 tests. Mutation: restoring the old lookup_exact-only read fails the new test.

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

Comment thread config/src/value.rs
Comment thread config/src/explain.rs Outdated
@jdx
jdx force-pushed the agent/config-explain branch from da190e9 to c920d2e Compare August 13, 2026 17:22

jdx commented Aug 13, 2026

Copy link
Copy Markdown
Owner Author

One real, one I am going to leave as it is with the reasoning.

The padding was aligning a column that does not exist. Real, and worse than trailing
whitespace: the doc example above explain shows each contributor with its value beside it —
the default 4 — and the code cannot print that, because provenance keeps origins and not
values. So the width only ever padded the last thing on the line, and a path copied out of an
explanation stopped being the path the merge recorded. The padding is gone, the doc example now
shows what the function actually prints, and the contributors test asserts no line of an
explanation ends in whitespace.

The \n ambiguity I am keeping. It is real — a rendered newline and a literal backslash-n
look the same — but it is the deliberate trade recorded in the comment on one_line, and I got
there by trying the alternative. Escaping backslashes too renders every Windows path with doubled
separators (C:\\Users\\me\\hk.toml), so the common case becomes a path the reader cannot copy in
order to disambiguate the pathological one (a real newline inside a path). This output is for a
human, and the property it needs is that one record stays on one line. A CLI that needs values
unambiguously has the same Resolved and can render JSON, which is the note already in the module
doc.

79 tests. Mutation: restoring the padding fails the new assertion.

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

Comment thread config/src/explain.rs Outdated
@jdx
jdx force-pushed the agent/config-explain branch from c920d2e to ff67378 Compare August 13, 2026 18:19

jdx commented Aug 13, 2026

Copy link
Copy Markdown
Owner Author

Right, and my own no-trailing-space assertion from the last round did not catch it — the fixture
had no empty value in it, and an empty value is a value.

Value::display writes a value the way a user would type it, and three of them are typed as nothing
at all: the empty string, the empty list, the empty map. Interpolated into key = {} that ends the
line after the =, with a trailing space and a truncated look — for a state that is perfectly
ordinary, since clearing a list is how a declared default gets turned off (HK_EXCLUDE=). Set is
not unset, and both are worth saying:

exclude = []
  set by  HK_EXCLUDE
stash = ""

The rule is one helper, shown, beside one_line in value.rs, and it is applied everywhere a
value is quoted into a message a human reads — explain, list, and the type errors ty::coerce
builds, which the merge's warnings render and which had the same "expected a list but has ``"
problem. Deliberately not folded into display itself: that is also what `config get` prints,
where an empty setting printing nothing is exactly right and `[]` would be a value nobody wrote.

The same fix lands in #862 for the reader's own errors, since that module quotes values the same way
and is in the same stack.

80 tests. Mutation: returning the value's text unconditionally fails the new test, which covers the
empty list and the empty string, in an explanation and in a listing, and re-checks that no line ends
in whitespace.

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

@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.

There are 2 total unresolved issues (including 1 from previous review).

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 ff67378. Configure here.

Comment thread config/src/value.rs
hk's `config explain` is the best of its kind in the fleet: it names the winning
source and the exact identifier, and does per-item provenance for lists. It also
costs about two hundred lines and is written against a *second* merge function
that exists only to answer this question — two merges can disagree, and when they
do the explanation describes a resolution that never happened.

Here there is one merge and its provenance is the answer, so this is a renderer
and nothing more. Every adopter gets the command; none of them writes it.

    jobs = 8
      set by  HK_JOBS
      type    uint
              How many jobs to run at once

      also considered, lowest precedence first:
        the default
        hk.toml#jobs

      environment  HK_JOBS, HK_JOB
      also         git hk.jobs

Four things the wording is careful about, each of which sends a user to the wrong
place if it is careless:

- A declared default is not something anybody *set*, and a post-merge rewrite is
  not either — `default` and `derived` rather than `set by`, so nobody goes
  looking for a file that never said it.
- The winner is not repeated among the things it beat.
- Asking after an old name answers about both names, and reads the deprecation
  notice from the declaration that *has* one — the old one. Reading it off the
  setting that replaced it printed nothing for the only case where it matters.
- The type is shown as the spec spells it (`uint`, `list<string>`) rather than as
  the prose an error message uses; a reader searching the docs for "a positive
  integer" finds nothing. That is a new `Ty::name`.

Also `warnings`, which pairs each message with the place that caused it, and
`list` for a `config ls` — sorted by key, since a registry's order is the order
somebody wrote a TOML file in, and without hidden settings or old names, which
are documented nowhere and would surface here for the first time.

Plain text on purpose: a CLI that wants JSON has the same `Resolved` and better
taste than a library about what its own output should look like.

Eight tests, five mutations, each verified to fail without its fix.
@jdx
jdx force-pushed the agent/config-explain branch from ff67378 to 59e00a7 Compare August 13, 2026 18:39

jdx commented Aug 13, 2026

Copy link
Copy Markdown
Owner Author

Right, and worse than the finding says: read from the text, a one-item list holding the empty
string was indistinguishable from a cleared one, and two of them came out as ,.

Emptiness is now asked of the value, not of its rendering. And the underlying problem is that a list
is joined with commas, which hides any item whose own text is empty — so when an item would
disappear, the whole list is written out instead:

exclude = []          # cleared
exclude = [""]        # one item, which is not the same thing
exclude = ["",""]     # two, which used to be `,`
exclude = [a,""]      # the item the comma form would lose
exclude = a,b         # nothing to hide, so nothing to bracket

A map keeps its plain form even when a value is empty, because its keys are in the text (k=) and
that is enough to read.

Two mutations: not writing out a list whose items would vanish, and not marking the empty list, each
killing a test — the value test directly, and the explanation test through it.

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

@jdx
jdx merged commit 25f0fad into main Aug 13, 2026
9 checks passed
@jdx
jdx deleted the agent/config-explain branch August 13, 2026 20:16
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