Releases: hewigovens/jayjay
v0.2.12
Drag-to-rebase in the DAG
- Drag a change directly onto another change to run
jj rebasewithout 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
DAGRowandDAGViewlogic 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.zipSHA-256:2ff97bbf07c7fb297f8ab949adcda26a8c93375eed1b85366f1ea8f49cf0e0f3
v0.2.11
Status bar + GitHub PR integration
- New extensible status bar with four item types: plain text, clickable link, action, and picker
- GitHub PR status via
ghCLI — 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
ghCLI 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:
pushtrigger restricted tomain - Docs: Myers → Histogram diff algorithm corrected
types.rssplit intotypes/module (7 files)JJStatus→CliStatus,PrState/ChecksStatusenums
SHA-256: 443c1a48d5fd5302653744dc1b03609c50cb4812334d095cf2b9e4d469db2af7
v0.2.10
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
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 changek/↑/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 fixconfig 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
similar3.0) — matches whatjj diffproduces and reads better on code than Myers
Internal
- New extensible
DiffPreviewenum onDiffHunk— 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_renamespreview carryover, end-to-end integration test) update-appcast.pynow prepends new entries instead of clobbering the entire file
SHA-256: e948823bfda13562086bcad8e27ad55b33a2564c3a9c49556470baf0f3e2e730
v0.2.8
What's New
- Myers diff algorithm — via
similarcrate, 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
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_mappingimplementation - Removed dead RepositoryFocus.swift
v0.2.6
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.emailnot 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 editcrash: "Descendants have not been rebased" - Fixed
jj newdeleting files from target commit - Fixed false config warning when
user.name/user.emailare set
JayJay 0.2.5
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
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
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