Restores `jj show` support, broken by the 0.3.0 dispatch rewrite. `jj show` accepts its revision as a positional `[REVSET]` argument rather than a `-r` option, which the help-driven dispatch didn't recognize — so bare `jjf` (which defaults to `show`) errored instead of opening the picker. A revision named as a bare positional now also bypasses the picker, like an explicit `-r`. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6.3 KiB
6.3 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.4.0 — 2026-05-22
Restores jj show support, which the 0.3.0 dispatch rewrite broke:
bare jjf (which defaults to show) works again, and a revision
named as a bare positional bypasses the picker.
Fixed
- Bare
jjf(which defaults to theshowsubcommand) no longer errors with "'jj show' takes no revset flag (-r/--to)". The 0.3.0 help-driven dispatch only scanned a leaf'sOptions:block, butjj showaccepts its revision as a positional[REVSET]argument. jjf now also reads theArguments:block and recognizes a positional revset that exposes-ras an alias, injecting-r <picked>as before. jjf show <rev>(a revision passed as a bare positional, e.g.jjf show @-) now bypasses the picker and runs verbatim, instead of launching the picker and appending a second, conflicting-r. The bypass check previously only recognized explicit revset flags; it now also recognizes a bare positional for positional-revset leaves. Option values are not mistaken for positionals — jjf reads the leaf's full option set (includingGlobal Options:) to step over them, sojjf show -T <template>still opens the picker.
Added
- The bypass check also recognizes the inline
--revision=<rev>/--to=<rev>form, not just space-separated flags.
0.3.0 — 2026-05-04
Subcommand dispatch is now help-driven instead of substring-matching
"REVSET", so multi-level subcommands and non--r revset flags work.
Fixed
jjf bm main(wherebmis a user alias forbookmark move) now correctly emitsjj bm main --to <picked>instead of-r <picked>, which jj rejected. jjf parses the leaf'sOptions:block and picks-r/--revision[s]first, then-t, --to.--fromis intentionally not a fallback (different semantics).jjf tag set v0.2.0no longer errors with "doesn't take revisions". jjf now walks into multi-level subcommands by parsing each parent'sCommands:block, sotag set,bookmark move,git push, etc. resolve to their actual leaf and read its real flag set.
Added
- Bypass mode when the user already passed a revset flag in their args.
jjf describe -r @-now runs verbatim instead of double-injecting-r. Triggers on any of-r,--revision,--revisions,-t,--toin passthrough. - Refusal message for leaves with no revset flag now includes the
resolved leaf path (e.g.
jjf workspace list→ "'jj workspace list' takes no revset flag — run 'jj workspace list' directly") so users see exactly which command jjf landed on. - Unit tests for the help parsers and command-line construction
against captured fixtures of
jj tag set --help,jj bookmark move --help, andjj tag --help.
0.2.0 — 2026-04-29
Picker now renders jj's real graph (merge connectors and all), with the cursor/filter aware of decorative rows.
Changed
- Graph rendering now uses jj's native
--graphoutput instead of a custom one-row-per-commit reconstruction. Merge connectors (├─┬─╮,├─╯,╰─╯) appear exactly asjj logdraws them, so the picker is a 1:1 visual match for the real log. - Cursor row arrow glyphs changed from
├──►to●──▶so the selection arrow doesn't visually clash with the graph chrome. - Hint row at the bottom of the picker drops trailing key/label pairs
(
esc quit,^U clear, …) until it fits on one row. Previously a narrow terminal would wrap the hint and push the search bar off the top of the screen.
Added
- Connector / decorative graph rows (
├─╮,╰─╯,~, …) are kept in the picker for visual fidelity withjj log. Cursor navigation (arrows, Page{Up,Down}, Home, End, Ctrl-N/P/J/K, Ctrl-A/E) skips over them; selection is silently ignored on connector rows. - Filtering (any non-empty query) excludes connector rows, since they
can't match a query and a stray
├─╮between filtered hits would carry no useful information.
Fixed
- Long descriptions no longer split across rows when the user has
ui.log-word-wrap = trueconfigured globally — the internaljj loginvocation now forcesui.log-word-wrap=falseso a single commit always renders on a single picker row.
0.1.0 — 2026-04-29
Initial release.
Added
- Fuzzy picker over
jj logfor any jj subcommand that accepts-r. - Smart prefix matching: typing the bold-highlighted portion of a change ID jumps to that revision instantly. Falls back to nucleo fuzzy matching against description text.
- Multi-select via
Tab; selections joined into-r 'A|B|C'revset union. - Two-column layout (when terminal ≥ 80 cols): picker on left, live
jj show --summarypreview of the cursor row on right, cached per revision. - Live command preview row showing the exact
jj …invocation that Enter will run. - Preflight check via
jj <sub> --help: subcommands that don't accept revisions (status,log, etc.) are rejected upfront with a friendly message. --ignore-working-copyon the internaljj logcall so the picker doesn't race with prompt/editor auto-snapshot integrations.- Shell integration via
jjf init <bash|zsh|fish|nu>:- rewrites shell history so up-arrow recalls the resolved
jj …command rather than thejjf …invocation, - drops the
jjf …entry on cancel/error so cancelled invocations don't pollute history, - defaults
jjf(no args) tojjf show, - passes meta-commands and bare flags through to the binary directly.
- rewrites shell history so up-arrow recalls the resolved
- Vim-style and emacs-style navigation:
↑↓,Ctrl-N/P,Ctrl-J/K,PageUp/PageDown,Home/End,Ctrl-A/E. - Light-terminal detection via
COLORFGBG: cursor-row highlight uses reverse video on light themes (where the dark gray bg is invisible). - Synchronized output (DEC mode 2026) around each redraw to eliminate tearing on Kitty / WezTerm / foot / recent iTerm.