Skip to content

Releases: hewigovens/jayjay

v0.2.12

14 Apr 13:44
512c813

Choose a tag to compare

Drag-to-rebase in the DAG

  • Drag a change directly onto another change to run jj rebase without looking up change IDs
  • Hold-to-arm interaction reduces accidental drags and keeps single-click selection intact
  • Drag hover now shows a clear target outline, node ring, and inline rebase preview
  • Successful drag rebases show a toast with inline conflict follow-up and a one-click Undo action

DAG interaction polish

  • Clicking a change no longer recenters or scroll-jumps the DAG unexpectedly
  • The commit box is only shown for the working copy
  • The Dock menu now includes Open Repository… for faster access

Internal cleanup

  • Repo-level alerts, sheets, HUDs, and toasts now go through a consolidated presentation model
  • DAGRow and DAGView logic moved into focused view models to keep the UI code smaller and easier to test
  • Added macOS app tests for drag-rebase gesture policy and DAG row/view-model regressions, and wired them into CI via just test-app

Checksums

  • JayJay-0.2.12.zip SHA-256: 2ff97bbf07c7fb297f8ab949adcda26a8c93375eed1b85366f1ea8f49cf0e0f3

v0.2.11

12 Apr 12:01
a62a40d

Choose a tag to compare

Status bar + GitHub PR integration

  • New extensible status bar with four item types: plain text, clickable link, action, and picker
  • GitHub PR status via gh CLI — shows PR number, state (open/merged/closed), and checks icon for the selected change's bookmark
  • Click to open PR in browser; hover to see title
  • gh CLI version shown in Settings

Post-fetch cleanup for merged PRs

  • After Git Pull, empty-after-rebase changes whose remote tracking was deleted are auto-abandoned
  • Conflicting changes in the same situation get flagged in the toast message

Other fixes

  • Toast dismiss time scales with message length (2–8s)
  • Tap-to-dismiss works on the full HUD background
  • CI dedup: push trigger restricted to main
  • Docs: Myers → Histogram diff algorithm corrected
  • types.rs split into types/ module (7 files)
  • JJStatusCliStatus, PrState/ChecksStatus enums

SHA-256: 443c1a48d5fd5302653744dc1b03609c50cb4812334d095cf2b9e4d469db2af7

v0.2.10

11 Apr 11:20
e66ce42

Choose a tag to compare

Diff view fixes

  • Long lines no longer wrap in the unified diff — each diff line is exactly one row so the gutter and content stay aligned. Long lines scroll horizontally instead
  • Row backgrounds (red/green) now fill cleanly edge-to-edge under the no-wrap layout
  • Abandon Selected Lines on the working copy refreshes the diff pane correctly

Rename detection

  • Batch moves (multiple files from one directory to another) are now paired correctly by filename instead of cascade-misassigning on the file list
  • Empty content no longer scores as "identical" — an unrelated deletion in a batch can't steal a rename slot

Working copy auto-refresh

  • Reviewing the working copy + external file save → refresh button shows the pending indicator instead of yanking your selection and scroll mid-review
  • Reviewing another change + working copy change → graph silently updates so the WC entry stays current
  • User actions (Abandon Selected Lines, Describe, Split, …) refresh immediately without a ghost "files changed" flash from the FS echo

Other fixes

  • Repos with many files no longer stuck at loading — fixed a pipe deadlock in the LFS path probe where git's stdout filled up while we were still writing to its stdin
  • Welcome view centers the logo when there are no recent repos; repo list is scrollable when long

Internal

  • Diff rendering extracted into a `JayJayDiffUI` Swift package — cleaner separation between app glue (`DiffSection`, `DiffStore`) and reusable rendering primitives
  • New test target on `JayJayDiffUI` with regression tests for the no-wrap alignment, background fill width, and rename batching

SHA-256: `a5e290e8e45d9238d7414c65ef6a87c3caba6d51303fec677043873ff8cd70f6`

v0.2.9

11 Apr 00:37
e4a6c8e

Choose a tag to compare

What's New

Image diff rendering

PNG, JPG, JPEG, GIF, WebP, HEIC, BMP, TIFF, ICO, ICNS now render as actual images in the diff view instead of <binary file> text. Side-by-side before/after for modified files; single pane for added, removed, and renamed. Pixel dimensions and file size shown under each pane. 32×32 icons render at 1:1 — no upscale-blur. Transparent regions get a checkerboard background. Diff edit mode continues to treat images as non-editable.

SVG rich-view toggle

SVG files keep the text diff by default. A small eye-icon toggle in the diff header (only shown for .svg files) switches to a rendered view via WKWebView.

DAG + file list keyboard navigation

  • j / / Ctrl-n → next change
  • k / / Ctrl-p → previous change
  • Same bindings work in the file list when it's the active pane
  • First-pane focus is the DAG on cold launch and new repo windows — no more clicking to start navigating
  • Multi-window safe — only the key window's DAG responds to keys

Other fixes

  • Settings → Open jj config now respects the configured editor instead of falling through to the system default
  • jj fix config uses absolute paths so the formatters work regardless of which shell launched jj
  • Roadmap reshuffle: added change evolution history (jj evolog), image diff, keyboard nav; removed tab-based multi-repo and bookmark drag-and-drop
  • Histogram diff algorithm (via similar 3.0) — matches what jj diff produces and reads better on code than Myers

Internal

  • New extensible DiffPreview enum on DiffHunk — adding PDF/video/etc. preview support is now a single enum variant + handler instead of new field pairs
  • Test coverage for the image preview pipeline (is_image_path, detect_renames preview carryover, end-to-end integration test)
  • update-appcast.py now prepends new entries instead of clobbering the entire file

SHA-256: e948823bfda13562086bcad8e27ad55b33a2564c3a9c49556470baf0f3e2e730

v0.2.8

04 Apr 01:57
b3a7dd3

Choose a tag to compare

What's New

  • Myers diff algorithm — via similar crate, same as libgit2/GitHub Desktop. Cargo.lock: 15s → instant
  • Divergent commit support — badge, commitId-based actions, "Abandon (resolve divergence)"
  • Bookmark Manager (Cmd+Shift+B) — stats bar, filter, clean up stale/deleted, resolve conflicts
  • Commit avatars — GitHub noreply + Gravatar for any email
  • Scrollable commit descriptions — see full PR messages and Co-authored-by trailers
  • jj-lib 0.40 + tree-sitter 0.26.8 + tree-sitter-rust 0.24.2

Performance

  • Myers diff O(n*d) replaces O(n²) LCS — large file diffs are instant
  • Preload all file diffs on change selection (Myers is fast enough)

Bug Fixes

  • Fixed jj new/jj edit "descendants not rebased" — proper snapshot + rebase lifecycle via jj-lib
  • Fixed multi-window Repository menu dispatching to wrong window (per-path handler registry)
  • Fixed DAG scroll recycling with divergent commits (ForEach identity uses commitId)
  • Fixed toast auto-dismiss timer not canceling on tap

v0.2.7

03 Apr 14:25
2163afb

Choose a tag to compare

What's New

  • DiffStore — extracted diff caching and preloading into a proper ViewModel
  • Preload diffs — first 10 files on change selection, neighbors on file click
  • DiffEdit context collapsing — hides unchanged lines, shared Rust implementation
  • Menu icons — SF Symbols on all menus: DAG context, Repository, Format, Help
  • DAG context menu — proper separators grouped by action type
  • Right-click target highlight — shows which commit "selected onto this" targets
  • Clean Up Stale Bookmarks in Repository menu (fetch + prune + forget)
  • Protocol-based menu system — reliable Repository menu in all window types
  • Toast HUD dismisses on click
  • Favicon for jayjay.hewig.dev

Performance

  • DiffEdit skips reload when scrolling LazyVStack (cached state check)
  • DiffEdit reuses DiffStore cache for file content loading

Cleanup

  • Removed EscapeDismisser NSViewRepresentable, replaced DispatchQueue delays with Task.sleep
  • Removed SwiftUI @focusedvalue system entirely, unified via ActiveRepoTracker + RepositoryMenuHandler protocol
  • Unified Rust collapse_context into single collapse_context_with_mapping implementation
  • Removed dead RepositoryFocus.swift

v0.2.6

02 Apr 13:05
7b65d03

Choose a tag to compare

What's New

  • Auto-track remote bookmarks on git fetch/pull — no more manual tracking
  • Rebase selected onto context menu action for DAG
  • Immutable-aware context menu — hides destructive actions (abandon, squash) for immutable commits
  • Config check on repo open — alerts when user.name/user.email not set
  • Working copy auto-sync — library transactions now properly sync files on disk when @ changes
  • O(n) diff algorithm — prefix/suffix trimming fixes 10s+ Cargo.lock diff (was O(n²) LCS)
  • Skip syntax highlighting for .lock/.csv/.svg files
  • File list performance — cached reviewedPaths and buildFileTree prevent re-render lag with many files
  • Redesigned Jujutsu settings — grouped sections with icons matching the Tools tab style
  • Updated bookmark track syntax — uses new --remote= flag (fixes deprecation warnings)

Bug Fixes

  • Fixed jj edit crash: "Descendants have not been rebased"
  • Fixed jj new deleting files from target commit
  • Fixed false config warning when user.name/user.email are set

JayJay 0.2.5

29 Mar 12:49

Choose a tag to compare

JayJay 0.2.5

Highlights:

  • Add bookmark shortcut actions on right click
  • Keep debug builds on debug Rust artifacts for a faster local build loop
  • Ship the 0.2.5 macOS app bundle, Sparkle appcast, and Homebrew update

JayJay 0.2.4

28 Mar 07:49
9594001

Choose a tag to compare

JayJay 0.2.4

Highlights:

  • Improve large-repo performance and default history loading
  • Improve Git LFS and submodule handling in diff and commit flows
  • Add path copy and other diff/settings UX polish

JayJay 0.2.3

27 Mar 09:53
9e35ccb

Choose a tag to compare

Highlights

  • Diffedit workflow and working-copy discard improvements
  • Default revset alignment and load-more fixes
  • Sponsorship prompt restoration

Artifacts

  • JayJay-0.2.3.zip
  • JayJay-0.2.3.zip.sha256