Skip to content

feat(derive): support path value hints - #951

Merged
jdx merged 2 commits into
agent/derive-verbatim-doc-commentfrom
agent/derive-value-hint
Aug 17, 2026
Merged

feat(derive): support path value hints#951
jdx merged 2 commits into
agent/derive-verbatim-doc-commentfrom
agent/derive-value-hint

Conversation

@jdx

@jdx jdx commented Aug 17, 2026

Copy link
Copy Markdown
Owner

Summary

  • add a usage-owned usage_argv::ValueHint for value_hint expressions
  • map FilePath and AnyPath to the spec's type="path", and DirPath to type="dir"
  • carry hints through native usage-argv completion and emitted KDL
  • reject hints on valueless fields or alongside a custom completer
  • document and test file/directory completion behavior end to end

Declarations use usage’s own hint type:

#[usage(long, value_hint = usage_argv::ValueHint::FilePath)]

The hint type lives in usage-argv, the derive runtime a compiled CLI already uses.

Stack

Targets #949 and becomes the direct base for #936.

Checks

  • cargo test -p usage-conformance --test completion
  • cargo test -p usage-argv --features spec,complete
  • cargo test -p usage-derive
  • cargo test --all --all-features
  • cargo clippy --all --all-features --all-targets -- -D warnings
  • mise run render

This PR was generated by Codex.


Note

Low Risk
Changes are limited to completion/spec metadata and derive codegen; parsing is unaffected and behavior is covered by conformance tests.

Overview
Adds usage_argv::ValueHint (FilePath, AnyPath, DirPath) so #[usage(value_hint = …)] can declare filesystem completion without pulling in clap.

The derive maps hints to spec vocabulary (path / dir), stores them on FlagMeta / ArgMeta as complete_type, and emits complete "…" type="…" blocks in KDL. Native completion now prefers that metadata (then still falls back to value-name heuristics like <FILE>).

Compile-time guards reject value_hint on valueless fields and value_hint together with a custom complete function. Conformance tests cover bash markers, emitted KDL, and parsing unchanged.

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

@coderabbitai

coderabbitai Bot commented Aug 17, 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: 0621d2c1-f727-4023-875b-c37df251a790

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

Copy link
Copy Markdown
Contributor

Greptile Summary

Adds a usage-owned path hint type and carries path or directory completion metadata through derive-generated runtime tables and emitted KDL.

  • Maps file and arbitrary-path hints to type="path" and directory hints to type="dir".
  • Rejects hints on valueless fields and alongside custom completers.
  • Adds end-to-end coverage for native completion, KDL emission, and unchanged parsing.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains.

Important Files Changed

Filename Overview
argv/src/complete.rs Prefers explicit completion metadata over value-name-based filesystem inference.
argv/src/spec.rs Stores completion types in argument and flag metadata and serializes them into KDL.
argv/src/lib.rs Introduces the public usage-owned ValueHint variants for file and directory completion.
derive/src/model.rs Parses supported value hints, lowers them to spec completion types, and validates incompatible field shapes.
derive/src/codegen.rs Propagates derived completion types into generated runtime metadata.
conformance/tests/completion.rs Verifies path hints through native completion, emitted KDL, and normal argument parsing.

Reviews (6): Last reviewed commit: "refactor(derive): use usage value hints" | Re-trigger Greptile

@jdx
jdx force-pushed the agent/derive-value-hint branch from 2e03ed3 to fc3a232 Compare August 17, 2026 03:33
@github-actions

github-actions Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Instruction counts

Nothing was compared, and so nothing was gated. No series appears on both sides: either the base has no measurements recorded, or the two were measured on different runner classes, which are deliberately not comparable — counts shift between machine types by more than a real regression does.

New, nothing to compare against: markdown on bamboo-v2-ubuntu24.04-x64-30vcpu-24gb-rust1.97.1, startup on bamboo-v2-ubuntu24.04-x64-30vcpu-24gb-rust1.97.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 64525 5895248 91x
usage: argv -> struct                            1125 ns      1.12 µs
clap: build tree + parse -> struct             508782 ns    508.78 µs
clap: parse -> struct, tree reused              24458 ns     24.46 µs
clap: build tree only                          315543 ns    315.54 µs

26fa45574d48 vs 60b4357913a5 · measured on the runner, not pushed to the history.

@jdx
jdx force-pushed the agent/derive-value-hint branch 2 times, most recently from 5a9fa67 to 390b71f Compare August 17, 2026 04:35
@jdx
jdx force-pushed the agent/derive-value-hint branch from 390b71f to 26fa455 Compare August 17, 2026 04:42
@jdx
jdx merged commit b8839b0 into main Aug 17, 2026
11 of 15 checks passed
@jdx
jdx deleted the agent/derive-value-hint branch August 17, 2026 10:18
jdx added a commit that referenced this pull request Aug 17, 2026
…#965)

Stacked on #963, the `usage-rs` facade.

`usage` is now its own first adopter. Its command structs, root, and
command enums use the `usage-rs` facade instead of Clap, and
`--usage-spec` prints `Cli::to_kdl()` from the same tables that parsed
the command line.

## What goes away

- `clap`, `clap_usage`, and the `clap-sort` dev dependency
- `tests/clap_sort.rs`; declaration order is held by the spec
- the duplicated command-effect tables; effects now live on the commands
they describe
- the empty `Sponsors` struct; unit subcommands are supported directly
- runtime checks for relationships the spec can express

## Migration shape

The declarations remain close to their former Clap layout:

- inferred shorts use `#[usage(short, long)]`
- command aliases live on their command structs, e.g. `#[usage(alias =
"c", alias_hidden("complete", "completions"))]`
- positive dependencies use `requires`, including `--cache-key` →
`--usage-cmd` and `--out-dir` → `--multi`
- aliases written on enum variants still merge with struct aliases for
compatibility
- deliberately formatted docs keep `#[usage(verbatim_doc_comment)]`
- path hints keep `value_hint = usage_rs::ValueHint::FilePath` or
`DirPath` from usage’s own runtime type
- subcommand payloads stay unboxed as they were under Clap; `Box<T>`
remains an optional size optimization

The four shell commands are separate derived structs flattening a shared
group. A single destination struct cannot identify which enum variant
selected it, so a macro keeps their common declaration in one place.

## Parity gaps closed by the stack

- required subcommands survive KDL generation (#937)
- strict unknown-flag behavior is inherited by subcommands (#939)
- command-owned visible and hidden aliases are supported (#946)
- duplicate non-repeatable flags are rejected (#945)
- a missing required subcommand prints the available command choices
(#947)
- verbatim doc-comment layout is preserved on commands, fields, and
variants (#949)
- file and directory value hints reach native and emitted completions
(#951)

The emitted spec still intentionally gains metadata the Clap bridge
dropped, including `JDX_USAGE_BIN` on `--usage-bin`, preserved multiline
long help, the manpage description, and the correct binary name `usage`.

## Verification

- `mise run render`
- `cargo test --all --all-features`
- `cargo clippy --all --all-features --all-targets -- -D warnings`
- direct binary checks for no-argument help, duplicate flags, command
aliases, and positive requirements

_This PR was generated by Codex._

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Changes how the primary `usage` CLI is parsed and documented
(including `--completions` UX), but behavior is covered by updated
integration tests and is an intentional migration to the shipped parser.
> 
> **Overview**
> The **`usage` binary dogfoods `usage-rs`**: command structs use
`#[derive(usage_rs::Cli)]` / `#[usage(...)]` instead of Clap, and
**`--usage-spec` emits `Cli::to_kdl()`** from the same parse tables that
handle argv. **Clap, `clap_usage`, and `clap-sort` are removed**, along
with the post-hoc **`command_effects` patch table**—`effect`,
`requires`, `overrides`, and similar metadata now live on the
declarations.
> 
> **Root CLI shape is corrected in spec and docs**: **`--completions
<SHELL>` is a long flag** (not a positional), with an **explicit
multi-line `usage` synopsis** for `usage <COMMAND>` / `--completions` /
`--usage-spec`. Shell runner commands (`bash`, `fish`, `zsh`,
`powershell`, `exec`) use **`unknown_flags = "value"`** so script
arguments can include unknown flags.
> 
> **Help and manpages** gain support for an optional root **`usage`
string** on `Spec` (derive + KDL emission); root help/man synopsis
prefer that over generated lines. Generated assets (`usage.usage.kdl`,
`usage.1`, Fig spec, CLI reference markdown, snapshots) are refreshed to
match.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
3aba1aa. 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**
  * Added `--completions <SHELL>` for selecting a completion shell.
* Improved command validation, aliases, defaults, environment settings,
and file-output completion hints.
  * Shell commands now forward unrecognized arguments as script values.
  * Added clearer help text and descriptions for generation commands.

* **Documentation**
* Updated CLI references, manpages, usage specifications, and shell
documentation to reflect revised options and behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Replaces #936 after flipping the facade and CLI layers.

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
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