Skip to content

Releases: idursun/jjui

v0.10.1

11 Mar 17:22
03c78f2

Choose a tag to compare

Everything from v0.10.0 with additional bug fixes and some improvements.

Improvements

  • We show jjui: press a key to continue message after a shell command is run. The underlying interactive detection code has been improved with additional signals to skip showing that message if the executed command started an interactive PTY.

Fixes

  • Fixed slow starts on Windows machines. #581
  • Fixed improper rendering of double-width characters as well as misalignment of borders when double-width characters are present. #526

Full Changelog: v0.10.0...v0.10.1

v0.10.0

08 Mar 22:50
1f3b3b8

Choose a tag to compare

Wow, a major release after a very long time. As promised, v0.10 is ready, and it comes with breaking changes.

First, thank you to everybody who contributed code, bug reports, ideas, and testing for this release. In particular, thanks to @baggiiiie for various features and fixes, @nickchomey for contributions and continuous feedback, and @vic for updating the documentation website. Thanks as well to everyone else for various code contributions, reporting issues, and verifying fixes.

We changed a lot in v0.10, but the biggest shift is that we finally got rid of some legacy configuration and moved to a unified actions + bindings model. Old concepts like [custom_commands] and [leader] are now replaced by a more consistent system built around actions, bindings, and first-class support for leader-style key sequences.

This release also introduces config.lua, which makes it much easier to customise and extend jjui with real scripting instead of only static configuration. Between config.toml, config.lua, Lua actions, and bindings, much more of the UI can now be customised in one consistent way.

The documentation has been updated with migration notes and examples such as the Lua Cookbook.

From my testing it looks ready, but I am sure more rough edges will show up once more people start using it, so please keep reporting issues as you find them.

⚠️ Breaking Changes

v0.10 replaces the legacy keybinding and customisation model with the new actions + bindings system.

  • [keys] configuration is no longer used.
  • [custom_commands] is replaced by [[actions]] and [[bindings]].
  • [leader] sequences are replaced by sequence bindings via seq.

If you have an existing configuration, plan to migrate it rather than expecting a drop-in upgrade from v0.9.x.

✨Highlights

  • Unified actions + bindings system. Keyboard input now flows through a single dispatch pipeline, default bindings are declared in TOML, actions are discoverable, and custom behaviour can be defined in both TOML and Lua.
  • Much stronger scripting support. Lua setup now receives the full config plus runtime context, generated intent-backed actions replace handwritten drift-prone bridges, and new helpers like wait_close() and wait_refresh() make multi-step scripts more predictable.
  • Upgraded TUI foundations. Moving from Bubble Tea v1 to v2 brings better terminal support, a new rendering engine for better performance, and better input handling, including support for bindings like ctrl+space and dedicated shift+... style keys.
  • Improved diff and selection workflows. The diff view now supports word wrap, revisions and details support modifier-based mouse selection, and several details and evolog interactions are more consistent.

🚀 New and Improved

Command History

  • Added command history, available with shift+w, to review dismissed command runs together with their output.
  • Moved running command information out of the status area and into dedicated flash messages, so the command and its output are now shown together in one place.

Help and Status

  • Reintroduced a dedicated Help view for full keybinding discovery, with filtering and scrolling, alongside the existing inline help.
  • Changed status/help binding presentation to column-major order so related bindings are easier to scan.

Lua and Configuration

  • Shipped the unified actions + bindings architecture introduced in v0.10.
  • Exposed the full config object to Lua setup, including runtime context such as repository path via config.repo, and terminal state via config.terminal.dark_mode, config.terminal.fg, and config.terminal.bg.
  • Standardised closeable action naming around open_* and aligned apply/close semantics for more predictable scripted workflows.

Oplog

  • Added quick search to oplog and shared the search behavior with revision search.

Evolog

  • Changed evolog preview defaults to show interdiff output, matching jj evolog -p more closely.

Abandon

  • Added s in abandon mode to target descendants of the selected revision(s).

Revset

  • Kept revset editing open when the expression is invalid, improving iteration while editing.
  • Improved revset editing so function completion inserts ( when appropriate, while the function list display is cleaner and less noisy.

Diff

  • Added word wrap in the diff view, with explicit wrapped and unwrapped modes plus soft-wrap-aware scrolling.
  • Added g and G in the diff view to jump to the top and bottom.

Details and Revisions

  • Added Ctrl+click single-item toggle and Alt+click range selection in revisions and details.
  • Added a revisions.details.select_file action for finer control in details workflows.

🛠️ Fixes

  • Fixed rendering issues with double-width characters.
  • Simplified divergent revision handling by using change_id/offset directly from the jj log prefix template.
  • Fixed git push --all behaviour for deleted bookmarks and corrected related command descriptions.

⚙️ Internal Updates

  • Upgraded to Bubble Tea v2.
  • Replaced remaining cellbuf usage with ultraviolet.
  • Hardcoded model-level key handling has been removed in favor of dispatcher-driven intents.
  • Continued internal cleanup around rendering, overlays, display context, and generated action plumbing to support the new architecture.

What's Changed

  • Unified Actions + Bindings system by @idursun in #533
  • feat(oplog): add QuickSearch to oplog, share logic with revision search by @baggiiiie in #521
  • fix: add missing keys in bindings by @baggiiiie in #538
  • feat(evolog): change default evolog command to show interdiff by @academician in #539
  • fix: add back esc to clear checked revisions by @baggiiiie in #541
  • remove gh-pages workflow from main branch. by @vic in #542
  • docs: fix readme links by @baggiiiie in #549
  • Update CONTRIBUTING.md for documentation by @vic in #547
  • feat(lua): add "filter" and "ordered" option to choose lua api by @baggiiiie in #548
  • feat(abandon): use s for selecting descendants by @idursun in #544
  • feat: add change_offset in jj log prefix template for divergent revisions by @baggiiiie in #550
  • fix: make bookmark input visible when user has custom template-aliases by @baggiiiie in #551
  • fix(evolog): keep restore mode navigation on revisions and esc close by @baggiiiie in #554
  • Expose full config to Lua setup and add runtime context (repo + terminal) by @idursun in #553
  • feat(flash): command history by @idursun in #556
  • Update to bubbletea v2 by @idursun in #558
  • Ctrl+click and Alt+click for single and range selection by @idursun in #563
  • feat: add ( to functions when autocompleted by @nickchomey in #564
  • feat(status): change display to column major order by @baggiiiie in #569
  • fix: remove parentheses from functions list, but add when autocomplete by @nickchomey in #567
  • fix(git): prevent panic when opening git menu with no selected revision by @baggiiiie in #571
  • Refactor/Lua bridge by @idursun in #572
  • fix(ui): guard against nil commit in OpenBookmarks intent by @baggiiiie in #573
  • feat(diff): word wrap by @idursun in #575
  • Add pgup/pgdown keybindings to evolog and details by @academician in #576
  • feat(lua): make default actions overridable and expose jjui.builtin.* by @idursun in #577
  • feat(help): add "help view" bound to f1 by @idursun in #578

New Contributors

Full Changelog: v0.9.12...v0.10.0

v0.9.12

17 Feb 23:01
83468d0

Choose a tag to compare

Release 0.9.12 (Final 0.9.x Series)

Note

This is a quick release before marking the end of 0.9.x series due to breaking changes introduced by the work in #533

Fixes & Improvements

  • Modal rendering now fills the entire git, bookmarks, and custom command dialogs before drawing rows, eliminating gaps introduced by the new renderer #535
  • Fixed a regression where ui.colors.selected = { bg = "black" } no longer highlighted the selected revision by restoring the correct lipgloss → ANSI color conversion #534
  • jj git fetch --tracked uses the t shortcut so f remains dedicated to the default fetch, matching the push command’s tracked shortcut #532
  • Added a [keys.diff_view] config section so diff scrolling, paging, and closing bindings are customizable #527
  • Completion now auto-inserts () when selecting a parameterless function, improving Lua/script authoring speed #530
  • Lua’s flash() accepts error and sticky fields, so scripts can show error toasts and control persistence without additional helpers #529

What's Changed

  • Auto-append () for parameterless functions in completion by @Dima-369 in #530
  • Add customizable keybindings for the diff view ([keys.diff_view]) by @Dima-369 in #527
  • fix(ui/git): update key for jj git fetch --tracked by @PrayagS in #532

New Contributors

Full Changelog: v0.9.11...0.9.12

0.9.11

12 Feb 00:10
87c49a1

Choose a tag to compare

Release Notes

Overview

The underlying view system has gone through an almost complete rewrite (#473). This major overhaul enabled us to implement various features that weren't possible before and made most of the UI clickable.

What's new:

  • Mouse-clickable UI: details panel, evolog, git remotes, bookmark remotes, and more
  • Mouse wheel scrolling support across all views
  • Foundation for new interactive features like target picker and revset completion box

Highlights

🎉 Which-Key Style Status Bar (#503)

The status bar now works like which-key in Emacs/Vim:

  • Dynamically adjusts to window width - shows ?/more when space is limited
  • Press ? to expand and see all available keybindings
  • Works with stacked menus (git, bookmarks) to show context-specific help
  • Press esc to collapse
  • Replaces the old help menu
image

🎯 Target Picker for Operations (#490)

Operations like rebase, new, edit, and squash now support an interactive target picker:

  • Press t to open the target picker
  • Select a revision or type a custom target (bookmark name, change ID, etc.)
  • Press enter to execute the command
target-picker.mp4

✨ Enhanced Revset Completion (#510)

Multi-line revset completion with comprehensive function support:

  • Added 16 missing revset functions: bisect, divergent, none, subject, connected, heads, roots, reachable, tracked, untracked, conflict, file, diff, author_date, committer_date, working_copies
  • Fixed function signatures and renamed diff_contains to diff_lines
  • Shows full completion list when history is empty
  • Better visual styling and source-based completion
image

🔍 Backward Quick Search Navigation (#509)

Quick search now supports cycling in both directions:

  • Added quick_search_cycle_back keybinding (default: " which is Shift+')

Improvements

  • Split/Restore interactive mode (#500)
  • Quit now works from any view without needing to press ESC first

Bug Fixes

  • Preview window now updates after squash operations (#518)
  • Fixed "Change ID prefix is ambiguous" error when abandoning revisions (#517)
  • Preview resets to top when switching revisions (#477)
  • Confirmation dialog closes immediately after restore (#508)
  • Description editing works with single-line log templates (#496)
  • Fixed elided revision markers rendering (#486)
  • Fixed highlight rendering when inline describe is open (#485)
  • Fixed search highlighting (#481)
  • Prevent clicking outside window boundaries
  • Cursor position only enforced with keyboard navigation, not mouse wheel
  • Fixed remotes dialog height
  • Fixed divergent change ID parsing
  • Fixed bookmark remote filtering
  • Fixed curved graph lines
  • Removed extra gap above status line (#513)
  • Fixed preview split border z-index (#478)
  • Fixed details view rendering position (#476)
  • Added left/right arrow key support (#501, #502)
  • jj describe -m now handles messages starting with - (#475)
  • Fixed footer to show revset keybindings when active (#489)
  • Preview updates when jumping through search results (#498)

What's Changed

  • Introduce immediate view mode by @idursun in #473
  • feat: add treefmt formatters by @doprz in #436
  • revisions: fix displaycontext_renderer to render details before elided marker by @baggiiiie in #476
  • preview: reset preview offset after revision change by @baggiiiie in #477
  • fix preview split border and stacked menu indexes by @baggiiiie in #478
  • refactor: intents by @idursun in #480
  • hotfix(nix): add jjui build check and update vendor-hash by @doprz in #482
  • displaycontext_renderer: fix overlay rendering over description lines by @baggiiiie in #485
  • fix: set description from stdin to allow messages starting with minus by @kankri in #475
  • fix: displaycontext_renderer elided revision rendering issue by @baggiiiie in #486
  • revset,ui: fix ShortHelp display for revset by @baggiiiie in #489
  • Nix build warning (harmless for now; use deprecated) by @bogorad in #492
  • feat: add target picker to some operations (e.g. rebase) by @idursun in #490
  • refactor: centralize z-index constants in render/zindex.go by @baggiiiie in #493
  • Fix single line describe by @krksgbr in #496
  • feat: add interactive split for files in details view by @baggiiiie in #500
  • fix: add left/right keybindings in log by @lawcho in #501
  • fix: pretty-print left/right keys by @lawcho in #502
  • feat: enable quit keymap for different modes by @baggiiiie in #505
  • fix: close restore confirmation by batching instead of sequencing by @baggiiiie in #508
  • feat: add backward navigation for quick search by @baggiiiie in #509
  • which-key like status (footer help) by @baggiiiie in #503
  • feat: multi line revset completion by @idursun in #510
  • fix(status): remove extra gap above status line during file fzf by @baggiiiie in #513
  • fix(details): reload when selection changes by @baggiiiie in #517
  • fix(preview): update preview window after squash operation by @baggiiiie in #518

New Contributors

Full Changelog: v0.9.10...v0.9.11

v0.9.10

17 Jan 21:35
e6dd7df

Choose a tag to compare

Release Notes

🆕 Features

Lua Scripting Enhancements

  • Lua Context Module (#465): Added context module to Lua scripting API, exposing methods for accessing selected item metadata and checked items:
    • context.change_id() - Get the change ID of selected revision or file
    • context.commit_id() - Get the commit ID of selected revision, file, or commit
    • context.file() - Get the file path of selected file
    • context.operation_id() - Get the operation ID of selected operation
    • context.checked_files() - Get array of checked file paths
    • context.checked_change_ids() - Get array of change IDs from checked items
    • context.checked_commit_ids() - Get array of commit IDs from checked items
  • Shell Execution in Lua (#471): Exposed exec_shell() function to Lua scripts, enabling interactive commands like opening files in external editors directly from jjui. This enables custom commands such as:
    [custom_commands.open_file]
    key = ["O"]
    lua = '''
    local file = context.file()
    if not file then
        flash("No file selected")
        return
    end
    exec_shell("vim " .. file)
    '''

✨ Improvements

  • Abandon Workflow: Removed confirmation dialog; users can now use Space to add/remove revisions from the abandon list

🐛 Bug Fixes

  • Preview Pane Scrolling (#472): Fixed broken Ctrl-U/Ctrl-D scrolling in the preview pane that was introduced by earlier input routing changes. Preview commands are now properly grouped and always handled.
  • Parser: Fixed handling of divergent change ID format
  • Bookmarks: Fixed tracking of new bookmarks (currently tracks all remotes)

🔧 Compatibility

  • Jujutsu 0.36.0 Support (#407): Updated commands to work with breaking changes in Jujutsu 0.36.0:
    • Changed --destination flag to --onto
    • Changed --edit flag to --editor
    • Removed deprecated --allow-new flag from git push commands
    • Updated keybinding from d to o for --onto flag in related modes

📝 Documentation

  • README Updates (#470):
    • Added missing op log revert item to help menu
    • Fixed redo documentation
    • Updated custom command examples

What's Changed

  • jj-update: fix commands to work with breaking changes in jj-0.36.0 by @baggiiiie in #407
  • refactor(abandon): remove confirmation dialog by @idursun in #462
  • fix(bookmarks): track new bookmarks by @idursun in #463
  • feat(lua): add context module by @idursun in #465
  • lua: expose exec_shell to lua script by @baggiiiie in #471
  • README improvements and help menu missing item by @baggiiiie in #470
  • ui,preview: fix preview pane ctrl-u/d scrolling by @baggiiiie in #472

Full Changelog: v0.9.9...v0.9.10

v0.9.9

08 Jan 23:58
78f8adf

Choose a tag to compare

Release Notes

Another release with small improvements and bug fixes. Thanks to all contributors!

🎉 New Features

Custom Commands & Lua API Enhancements

  • Custom Commands with Sequence Keys (#420)

    • Added key_sequence property allowing custom commands to be invoked with multiple key presses in sequence
    • Added desc property for command descriptions
    • Introduced sequence overlay UI showing available key sequences when first key is pressed
    • Example: key_sequence = ["w", "b", "l"]
  • Lua API: Choose Method and UI (#427) (#442)

    • New choose() function for interactive selection prompts in Lua scripts
    • New input() function to prompt users for text input with customizable title and prompt
    • New split_lines() function for text processing
  • Lua API: Await on Operation Results (#422)

    • start_inline_describe() now returns boolean indicating if operation was applied or cancelled
    • Enables conditional command execution based on user actions
    • Fixes #310
  • Lua API: Interactive Commands (commit 8b257263)

    • Added jj_interactive Lua function for interactive jj command execution

Navigation & UI Improvements

  • Ace Jump for Operations (#445)

    • Pressing 'f' in set_parents/duplicate/rebase/squash modes now triggers ace jump
    • After jump completes, returns to the original operation mode instead of normal mode
    • Closes #394
  • Preview Width Variable (#452)

    • Added $preview_width placeholder variable for preview commands
    • Exposes actual view width (in columns) to enable tools like delta to use --side-by-side correctly
    • Width updates dynamically when preview pane is resized
    • Similar to fzf's $FZF_PREVIEW_COLUMNS
  • Configurable Flash Message Display Time (#456)

    • New config key: ui.flash_message_display_seconds (default: 4)
    • Special value 0 means messages display until manually dismissed
    • Fixes #455
  • Page Up/Down Key Configuration (#437)

    • ScrollUp/Down keys now registered in config instead of hardcoded
    • Keys exposed to configuration for customization
    • Fixes #360

SSH & Authentication

  • SSH Askpass Support (#423)
    • New [ssh] hijack_askpass setting to prompt for SSH passphrases/PINs within jjui
    • Works on Linux and macOS
    • Properly handles prompt overriding and cancellation
    • Fixes #100

🐛 Bug Fixes

  • Exec Command History (#458)

    • Fixed issue where selected command history wasn't applied in exec mode
    • Input value now properly updated when selecting from fuzzy/regex suggestions
    • Selected commands correctly saved to history
  • Menu Pagination Display (#446)

    • Fixed incorrect %d/%d pagination display
    • Height now calculated before pagination render
    • Added tab/shift+tab to short help menu
    • Fixes #444
  • Flash Message Width (#432)

    • Added maxWidth (50% of screen) to flash message rendering
    • Messages now properly line-wrap instead of extending beyond window width
  • Operation Log Refresh (#431)

    • Operation log now returns Refresh and SelectionChanged messages upon closing
    • Fixes #430
  • Custom Commands List Sorting (commit 3fa9783a)

    • Fixed custom commands list to use stable sort
    • Fixes #424
  • JJ Error Pass-through (#421)

    • jjui now properly passes through stderr from jj commands
    • Error messages are more informative and show actual jj errors
  • Navigation Message Display (commit 94a4a874)

    • Navigation messages now only shown for paged scrolls

What's Changed

  • main: pass through jj error by @baggiiiie in #421
  • feat(lua): add ability to await on operation results (cancelled/applied) by @idursun in #422
  • oplog: return Refresh and SelectionChanged upon oplog closing by @baggiiiie in #431
  • feat(nix): add comprehensive nix flake by @doprz in #426
  • Add option to hijack SSH Askpass to prompt for passphrase/pin by @oliverpool in #423
  • feat(lua): add choose method and ui by @idursun in #427
  • flash: add maxWidth to flash msg rendering by @baggiiiie in #432
  • keys: add pageup/down to keys config by @baggiiiie in #437
  • chore(github): Add Adda0 as an automatic reviewer for Nix-related changes by @Adda0 in #440
  • feat: add .editorconfig by @doprz in #434
  • Add input and log to custom_commands API by @ArnaudBger in #442
  • oplog,list: refactor scrolling with Scrollable/StreamableList interface by @baggiiiie in #429
  • menu: calculate height before pagination render by @baggiiiie in #446
  • operations: enable ace jump for set_parents/duplicate/rebase/squash by @baggiiiie in #445
  • feat: make flash message display time configurable by @living180 in #456
  • feat: add $width variable for preview commands by @pablospe in #452
  • status: fix exec command history not applied by @baggiiiie in #458

New Contributors

Full Changelog: v0.9.8...v0.9.9

v0.9.8

11 Dec 21:12
2a8d5a0

Choose a tag to compare

Release Summary

This release includes experimental Lua scripting support for custom commands, several bug fixes, and UI improvements. The streaming command handler has been reworked to remove the 100ms delay incurred on every refresh (you should feel the difference), and issues with leader keys, parser colour handling, and preview panel focus have been resolved.

Key Highlights

🚀 Major Features

  • Lua Scripting in Custom Commands (#415): Experimental support for writing custom commands using Lua scripts.

Initial version includes API for revision navigation, JJ command execution, clipboard operations, revset manipulation and displaying flash messages.

These are the currently available functions but expect the list to grow and change with each release.

Available Functions (v1):

  • revisions.current() - Get currently selected change ID
  • revisions.checked() - Get list of checked change IDs
  • revisions.refresh({keep_selections?, selected_revision?}) - Refresh revisions view
  • revisions.navigate({by?, page?, target?, to?, fallback?, ensureView?, allowStream?}) - Navigate revisions
  • revisions.start_squash({files?}) - Begin squash workflow
  • revisions.start_rebase({source?, target?}) - Start rebase operation
  • revisions.open_details() - Open revision details view
  • revisions.start_inline_describe() - Open inline describe editor
  • revset.set(value) - Set custom revset
  • revset.reset() - Reset to default revset
  • revset.current() - Get active revset string
  • revset.default() - Get default revset string
  • jj_async({...}) - Run JJ command asynchronously
  • jj({...}) - Run JJ command synchronously (returns output, err)
  • flash(message) - Display flash message
  • copy_to_clipboard(text) - Copy text to clipboard

Here are a couple of examples:

  • Appends | ancestors(<change id of the current revisions>, 2) to the end of revset and bumps the number with each execution
[custom_commands.append_to_revset]
  key = ["+"]
  lua = '''
  local change_id = revisions.current()
  if not change_id then return end

  local current = revset.current()
  local bumped = false
  local updated = current:gsub("ancestors%(" .. change_id .. "%s*,%s*(%d+)%)", function(n)
    bumped = true
    return "ancestors(" .. change_id .. ", " .. (tonumber(n) + 1) .. ")"
  end, 1)

  if not bumped then
    updated = current .. "| ancestors(" .. change_id .. ", 2)"
  end

  revset.set(updated)
 '''
  • Inserts a new commit after the selected one and then starts inline describe on the new revision.
[custom_commands.new_then_describe]
  key = ["N"]
  lua = '''
  jj("new", "-A", revisions.current())
  revisions.refresh()

  local new_change_id = jj("log", "-r", "@", "-T", "change_id.shortest()", "--no-graph")
  revisions.navigate{to=new_change_id}
  revisions.start_inline_describe()
  '''
  • Copy to clipboard example
[custom_commands.copy_to_clipboard]
  key = ["X"]
  lua = '''
  local selections = revisions.checked()
  if #selections == 0 then
    flash("none selected")
  end
  local content = table.concat(selections, ",")
  copy_to_clipboard(content)
  '''

✨ Enhancements

  • Key Sequences for Custom Commands (#420): Custom commands can now be triggered with multi-key sequences using key_sequence property. Also adds desc property for command descriptions. An overlay shows available sequences after pressing the first key.

    Example:

    [custom_commands.bookmark_list]
      key_sequence = ["w", "b", "l"]
      desc = "bookmarks list"
      lua = '''
      revset.set("bookmarks() | remote_bookmarks()")
      '''
  • Faster Refresh (#412): Improved streaming command handling, eliminating 100ms delay and making refreshes instant. Previously jjui would fail to launch or get stuck when jj emitted warning messages (e.g., deprecated config options like git.push-new-bookmarks).

  • Quick Search Highlighting (#414): Case-insensitive search with visual highlighting of all matches in the revisions view

  • Remember Unsaved Descriptions (#417): Descriptions are now preserved when you cancel, preventing accidental loss of work. Addresses the common frustration of accidentally hitting ESC and losing long commit messages with no way to recover them.

  • Squash Operation Toggle (#405): New --use-destination-message option for squash operations

🐛 Bug Fixes

  • Preview Panel Focus Issue (#390): Fixed preview panel showing full commit diff instead of selected file diff when terminal regains focus
  • EOF Error Handling (#418): Proper error messages when revset contains no revisions instead of getting stuck
  • Parser Color Agnostic (#413): Fixed parsing issues when users configure ChangeID/CommitID/IsDivergent with same colors.
  • Leader Key Timing (#416): Fixed leader key processing to prevent race conditions. Leader keys were completely non-functional in versions after v0.9.3 - the options would appear in the UI but do nothing when selected.

🎨 UI/UX Improvements

  • Clear selected revisions with ESC key when not in editing/overlay/focused operations (#419)
  • Better menu spacing for git and bookmarks
  • Reduced preview debounce time back to 50ms for snappier response (#410). The 200ms debounce made the UI feel sluggish when navigating between revisions.

⚙️ Internal Improvements

  • Introduced intent-based architecture for better separation of concerns (only implemented for revisions, flash for now)
  • Moved flash intents to dedicated package
  • Simplified details view rendering
  • Better configuration organisation

What's Changed

  • operation: Add use destination message to squash operation by @woutersmeenk in #405
  • Preview panel shows whole commit diff instead of selected file's diff when terminal regains focus by @abourget in #390
  • fix(streamer): handle warning messages by @idursun in #412
  • parser: stringify log/evolog prefixes to be color agnostic by @baggiiiie in #413
  • revisions: add highlight to QuickSearch, make search case insensitive by @baggiiiie in #414
  • feat: Lua scripting in custom commands by @idursun in #415
  • revisions: handle EOF error for revset without revisions by @baggiiiie in #418
  • revisions: clear selected revisions on cancel by @baggiiiie in #419
  • feat: custom commands with sequence keys by @idursun in #420

New Contributors

Full Changelog: v0.9.7...v0.9.8

v0.9.7

02 Dec 23:58
c198b4f

Choose a tag to compare

🎉 This release enhances performance and introduces stability improvements in log parsing and command execution. It also takes back some of the stability by adding basic mouse support.

Features

📈 Performance Improvements

Implemented frame-rate limited rendering (capped at 120 FPS) to significantly improve application performance by deferring view generation until the next frame tick. This addresses the slowest path in the application - view generation - making it much more responsive

🐭 Mouse Support

  • Clickable and scrollable revisions view (excluding operations) (#391)
  • Clickable and scrollable op log view
  • Draggable and scrollable (vertically + horizontally) preview pane
  • Scrollable diff window
  • Replaced custom viewport with bubbles/viewport for more responsive rendering (#396)
mouse.mp4

🔎 Preview

  • Replaced surrounding border with divider for more preview space (#396)

Operation Log (oplog)

  • Added jj op revert functionality with R key binding (#400)

Revset Handling

  • Pressing up arrow in empty revset field now sets the current revset (#284)
  • Fixed mismatch where empty revset input would use config default instead of session default from -r flag. Now correctly updates CurrentRevset to session default instead of empty string (#399)

Details View

  • Allow quitting from details view when quit key is pressed (e.g. q)

Bug Fixes

Rendering Issues

  • Fixed double rendering of inline describe content when next line contains only revision line. Added revisionLineRendered tracking flag to properly sequence the description overlay rendering (#403, #369)
  • Fixed viewport adjustment when PageDown moves cursor below viewport. The renderer now continues rendering until it reaches the focused item, ensuring proper viewport adjustment (#395)
  • Fixed PageUp/Down navigation at top and bottom of revset when less than one page remains. Now includes early return with feedback message when already at boundary (#387, #386)
  • Removed incorrect space trimming in renderer (#393)

Log Processing

  • Applied partial fixes to prevent out-of-order row updates in log streamer

Details View

  • Handle cases where conflict markers span multiple lines (#398)
  • Ignore virtual selection on refresh (#381)

Operation Log (oplog)

  • Fixed an issue in operation ID detection (#380, #377)

Command Execution

  • Added a mechanism for restoring failed commands to input field, allowing retries without retyping (#392)

Template System

  • Enhanced jj log parsing using native template prefixes for better change ID and commit ID detection. Fixes issues when bookmarks are "HexLike" (#358, #228, #372)

What's Changed

  • Remove teatest package and simplify tests by @idursun in #379
  • internal/parser: get revision ids with template prefixes by @baggiiiie in #372
  • fix(oplog): improve operation id detection by @idursun in #380
  • refactor: serialise command execution by @idursun in #378
  • Revert "refactor: serialise command execution" by @idursun in #383
  • revisions: fix scrolling at the top and bottom of revset by @baggiiiie in #387
  • refactor: introduce and implement common.Model by @idursun in #384
  • refactor: Replace custom cell buffer implementation with cellbuf package by @idursun in #388
  • refactor: use simple layout functions to lay out the main UI by @idursun in #389
  • Coming back to previous state when exec command failed by @ArnaudBger in #392
  • feat: add basic mouse support by @idursun in #391
  • list/renderer: fix viewport adjustment on PageDown by @baggiiiie in #395
  • Make preview horizontally scrollable by @idursun in #396
  • revset: fix revset not using default when empty by @baggiiiie in #399
  • operation: add op log revert by @baggiiiie in #400
  • revision: fix double rendering of inline describe content by @baggiiiie in #403
  • refactor: replace usages of scattered width/height pairs with ViewNode by @idursun in #401
  • describe: catch cursor blinking to avoid unnecessary rendering by @baggiiiie in #404

New Contributors

Full Changelog: v0.9.6...v0.9.7

v0.9.6

23 Nov 16:45
d37e32a

Choose a tag to compare

Another community driven release, mostly focusing on every day improvements.

What's Changed

  • fix(ace_jump): close operation after applying jump by @baggiiiie in #351
  • feat: auto-detect preview placement, on by default by @lbonn in #348
  • feat: allow remote selection in git menu by @baggiiiie in #349
  • fix(fuzzy_files): quote path for editor command by @baggiiiie in #354
  • fix for preview copied status file and filename with {} by @baggiiiie in #357
  • Support interactive file-level restores by @remo5000 in #365
  • fuzzy_files: remove quoting for files in revset by @baggiiiie in #370
  • ui/git: add --tracked to git fetch by @baggiiiie in #368
  • operation: add ForceApply to squash/rebase footer by @baggiiiie in #371
  • abandon: add force apply to footer help menu by @baggiiiie in #373
  • docs(README): add winget and scoop as installation method in Windows by @abgox in #362
  • fix(set_parents): keep parent order by @idursun in #375
  • fix(light theme): Removed the default border style of bright white as it was overriding the text style which should be the terminal’s default foreground and background.

New Contributors

Full Changelog: v0.9.5...v0.9.6

v0.9.5

20 Oct 19:49
6e95d19

Choose a tag to compare

This release contains some minor improvements and bug fixes.

  • Help window is now searchable. #334
  • changed preview to run in the background while getting the diff contents to improve UI responsiveness. #336
  • fix: async command executor used to append --color always to the end of the command to get colourful output but this broke some commands that expect arguments. This change moves the --color always to the beginning of the command. #339
  • Added pgup and pgdown bindings to the revisions view so that you can jump down/up without having to press j/k multiple times. #347
  • improved handling of bookmarks that contain -- characters in their name. jj returns these bookmarks with quotes which jjui didn't handle well. #346
  • JJUI_CONFIG_DIR is changed to match the documentation where it will load the configuration from $JJUI_CONFIG_DIR/config.toml rather than $JJUI_CONFIG_DIR/jjui/config.toml #343
  • ace jump didn't highlight change ids in some template configuration. It should highlight change ids and commit ids correctly now.

What's Changed

Full Changelog: v0.9.4...v0.9.5