The 0.3.0 help-driven dispatch only scanned a leaf's `Options:` block
for a revset flag. `jj show` takes its revision as a positional
`[REVSET]` argument, not an option, so it looked like it accepted no
revset — and bare `jjf` (which defaults to `show`) errored with
"takes no revset flag" instead of opening the picker.
- Read the `Arguments:` block too: a positional `[REVSET]`/`[REVSETS]`
that exposes `-r` as an alias is recognized, and jjf injects
`-r <picked>` for it.
- A bare positional in the passthrough now counts as the user having
named the revision, so `jjf show @-` bypasses the picker like an
explicit `-r` would. Option values are stepped over (parsing every
`Options:` section, including globals) so they aren't mistaken for
the positional.
- The picker-bypass check also accepts the inline `--revision=<rev>` /
`--to=<rev>` form, not just space-separated flags.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two real failures motivated this:
- `jjf bm main` (where `bm` is a user alias for `bookmark move`) ran
`jj bm main -r <id>` — but bookmark move uses `--to`, not `-r`.
- `jjf tag set v0.2.0` errored with "doesn't take revisions" because
jjf only inspected `jj tag --help` (parent) instead of walking
into the `set` leaf, which does take `-r`.
Replace the boolean `supports_revisions()` (a substring match on
"REVSET") with `RevsetTarget { leaf, passthrough, flag }`:
- Walks multi-level subcommands by parsing each parent's `Commands:`
block — including `[aliases: …]` annotations, so `jjf tag s` walks
to `tag set`. Aliases like `bm` work transparently because `jj bm
--help` already emits the resolved leaf's help.
- Parses the leaf's `Options:` block and picks the revset flag in
priority order: `-r`/`--revision[s]` first, then `-t, --to`.
`--from` is intentionally not a fallback (different semantics from
"the revision the picker chose").
- Bypasses the picker entirely when the user already passed a revset
flag in their args, so `jjf describe -r @-` runs verbatim instead
of double-injecting `-r`.
`exec` and `command_line` now take `&RevsetTarget` and emit the
resolved flag; signatures thread through `tui.rs` and `main.rs`.
New unit tests cover the help parsers and command-line construction
against captured fixtures of `jj tag set --help`, `jj bookmark move
--help`, and `jj tag --help`.
- Custom oneline template (drops timestamp + commit-id hash from the
left pane); keeps change-id with shortest-unique-prefix highlighting,
bookmarks, conflict/empty labels, and the description first-line.
More room for the actually-useful columns.
- Drop the dim '── <change_id> ────' header above the preview; the
cursor row tee (├) now carries the 'this is what you're looking at'
signal.
- Box-char frame for the preview pane: top border (┌────) and left
border (│), with ├ replacing │ on the cursor row to draw the eye
from picker selection into preview content.
- Dynamic description clipping: the description fills whatever rows
are left after the file list (ellipsis on overflow). Replaces the
hard 3-line cap, which under-used vertical space for short file
lists and was buggy (didn't count blank lines within description).
- Bump VIEWPORT_MIN from 15 to 20 so the preview pane has enough
vertical room to be useful by default.
A TUI revision picker for jujutsu (jj). Wraps any jj subcommand with an
inline fuzzy-finder over jj log, then forwards the picked revision(s)
as -r '<id>' to the underlying jj invocation.
Features:
- Inline viewport (no full-screen alt-screen takeover)
- Smart prefix matching: typing the bold portion of a change ID jumps
to that revision instantly
- Multi-select via Tab; emitted as -r 'A|B|C' revset union
- Preflight detection of subcommands that don't accept -r
- Optional shell integration (jjf init <bash|zsh|fish|nu>) that
rewrites shell history so up-arrow recalls the resolved jj command
Hand-rolled ANSI rendering to /dev/tty; only crossterm, nucleo-matcher,
anyhow, and libc as runtime dependencies.