branchdiff 0.64.0

Terminal UI showing unified diff of current branch vs its base
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
## [0.63.14] - 2026-05-19

### Bug Fixes

- Flash "Copied" indicator on text-selection auto-copy
## [0.63.13] - 2026-05-19

### Performance

- Cache display width on DiffLine to fix scroll on huge single-line files
## [0.63.12] - 2026-05-19

### Bug Fixes

- Count modified lines in +/- totals
## [0.63.11] - 2026-05-19

### Bug Fixes

- Align search highlights when modified lines render with deletion text
## [0.63.10] - 2026-05-19

### Bug Fixes

- Stop watchdog stacking refreshes; honor cancel inside diff
- Tighten cancel coverage in jj refresh and diff; configurable watchdog

### Miscellaneous

- Require conventional commits in cliff.toml
## [0.63.8] - 2026-05-19

### Bug Fixes

- Clamp drag selection row to last visible content row

### Miscellaneous

- Satisfy new clippy 1.95 lints
## [0.63.6] - 2026-05-19

### Refactor

- Adopt vcs-runner crate for git/jj subprocess execution
## [0.63.2] - 2026-05-19

### Bug Fixes

- Selection highlighting and copy on wrapped lines and wide characters
## [0.63.1] - 2026-05-19

### Bug Fixes

- Robust repo detection in waiting screen using filesystem watcher

### Documentation

- Update README
## [0.63.0] - 2026-05-19

### Features

- Mark files as reviewed with r/R keybindings
## [0.62.2] - 2026-05-19

### Bug Fixes

- WCAG AA contrast for solarized HTML theme
## [0.62.1] - 2026-05-19

### Bug Fixes

- Hunk boundary sliding for cleaner function-level diffs
## [0.62.0] - 2026-05-19

### Features

- Move detection with block matching across files
## [0.61.1] - 2026-05-19

### Bug Fixes

- HTML output refinements — live-reload, collapsed files, styling

### Miscellaneous

- Regenerate Cargo.lock and changelog
## [0.61.0] - 2026-05-19

### Features

- HTML output mode with shared rendering engine
## [0.60.1] - 2026-05-19

### Bug Fixes

- Consistent bracket notation for status bar toggles

### Miscellaneous

- Regenerate changelog
## [0.60.0] - 2026-05-19

### Features

- Upstream divergence awareness with fork-point/trunk-tip toggle
## [0.59.1] - 2026-05-19

### Bug Fixes

- Gracefully fall back from CommitOnly/BookmarkOnly when revision context disappears
## [0.59.0] - 2026-05-19

### Features

- Auto-retry on transient VCS errors with exponential backoff

### Miscellaneous

- Regenerate changelog
## [0.58.0] - 2026-05-19

### Features

- Auto-copy on highlight and status bar selection

### Miscellaneous

- Update GitHub Actions to Node 24 versions
## [0.57.0] - 2026-05-19

### Features

- Add BookmarkOnly view mode for jj stacked bookmarks

### Bug Fixes

- Align help modal color legend indentation and shorten view mode label

### Documentation

- Update README
- Update README
## [0.56.2] - 2026-05-19

### Bug Fixes

- Rename [changes] view mode label to [changed lines only]
- Show [all lines] label for Full view mode in status bar
- Update Cargo.lock for v0.56.2
## [0.56.0] - 2026-05-19

### Features

- Show commit short hash in CommitOnly view mode label

### Bug Fixes

- Hide files with no current-commit changes in CommitOnly view
## [0.55.2] - 2026-05-19

### Bug Fixes

- Remove --keepParent from ditto to fix notarization ticket registration
- Remove --keepParent from ditto to fix notarization ticket registration
## [0.55.1] - 2026-05-19

### Miscellaneous

- Add formula and repo fields to tap dispatch payload
- Add Apple code signing and notarization for macOS binaries
## [0.55.0] - 2026-05-19

### Features

- Add Homebrew tap, man pages, shell completions, and changelog

### Bug Fixes

- Correct artifact download paths in release workflow
## [0.54.4] - 2026-05-19

### Bug Fixes

- Render inline deletion text in merged diff view
## [0.54.3] - 2026-05-19

### Bug Fixes

- Publish to crates.io before downloading artifacts to avoid payload size issue
## [0.54.2] - 2026-05-19

### Features

- Detect unstaged file renames using temp index
- Auto-collapse Rails schema files
- Add double-click word selection with smart boundaries
- Use histogram diff algorithm for better structural alignment
- Update help modal with new color scheme and status symbols
- Switch to background-based color highlighting with status symbols
- Add syntax highlighting with syntect
- Add git patch format output
- Add triple-click line selection
- Add per-character contrast checking for syntax highlighting
- Support nested .gitignore files with correct directory scoping
- Add file links detection for app-spec file pairs (Part 1)
- Add image diff detection and placeholder rendering
- Add image loading and metadata display for image diffs
- Implement terminal image rendering with StatefulImage
- Enable partial image rendering at viewport bottom
- Show repo directory name in status bar
- Prevent git lock collisions with external commands
- Add Swift, TypeScript, and extended syntax highlighting
- Detect git init and auto-initialize when started in non-git directory
- Add Jujutsu (jj) VCS backend
- Auto-detect VCS backend (jj preferred over git)
- Auto-detect VCS backend changes at runtime
- Jj full stack diff with per-commit color coding
- Add StackPosition type and wire through construction sites
- Jj mid-stack visibility with full stack diff
- Display jj stack position [N/M] in status bar
- VCS-aware help modal labels
- Show jj change IDs in status bar labels
- Jj-native gutter symbols and VCS-aware help legend
- Add search/find within diffs (/ or Ctrl+F)
- Add CommitOnly view mode for jj (shows only current commit changes with context)

### Bug Fixes

- Improve large repo warning to show actual behavior
- Exclude visual line wrap newlines from copied text
- Set viewport_height before initial FrameContext creation
- Show only actual changes for renamed files
- Uncollapse restored files that were collapsed due to deletion
- Correct inline span highlighting for modified base lines
- Account for wrapped line heights in visible range calculation
- Use unicode display width for wrapped line height calculation
- Count modified base lines in changed_line_count
- Sanitize control characters to prevent ghost artifacts at terminal edges
- Prevent index out of bounds in provenance map for unequal line counts
- Use fallback picker initialization and add cache tests
- Reserve image space before protocols exist
- Correct scrolling and image height calculations
- Use actual font size from Picker for image height calculations
- Include binary and image files in files list for accurate counts
- Tighten image spacing in high-fidelity view
- Use display dimensions for image layout centering
- Use pub(super) visibility for internal diff submodules
- Address adversarial review feedback
- Default to Context view mode instead of Full
- JS line comments no longer bleed into subsequent lines
- Reset syntax highlight state on each render to prevent flickering
- Harden jj backend — rename parsing, binary detection, UTF-8 handling
- Single_file_diff rename support, deduplicate base_identifier
- Render pure deletion inline diffs as split del/ins lines
- Prevent jj refresh cancel storm and update base label live
- Strip jj tracking marker from bookmark labels
- Suppress jj self-triggered refresh loop and add retry logic
- Propagate VCS refresh errors to UI warning banner
- Immediate Full refresh on jj revision changes
- VCS paths bypass gitignore filter for event detection
- Suppress self-triggered VCS events and add post-refresh staleness check
- Update benchmarks for ViewState refactor and update() signature change
- Show change ID before bookmark in jj status labels
- Prevent panic when searching in empty diff
- Is_noisy_path should check relative paths, not absolute
- Add cargo build step before test so integration tests find the binary
- Use GITHUB_PATH to prepend target/debug to PATH for integration tests
- Skip flaky PTY integration tests in CI, run unit tests only

### Refactor

- *(test)* Extract shared TestAppBuilder to reduce duplication
- Extract LineSource classification methods and provenance helpers
- Use stdlib char boundary methods, add rust-version
- Consolidate wrapped_line_height into single source of truth
- Fix antipatterns identified in code review
- Split diff/mod.rs into focused modules
- Use DiffInput struct for readable function calls
- Extract collapse logic to app/collapse.rs
- Extract helper functions from handle_input
- Extract ViewState from App struct
- Extract VCS abstraction layer for future jj support
- Wire Vcs trait through entire app, eliminating direct git calls
- Split vcs/git.rs god module into submodules
- Split update.rs god module into submodules
- Relocate misplaced tests and remove redundancies
- Extract shared VCS types and functions into vcs/shared.rs
- Unify VCS retry logic into shared run_vcs_with_retry
- Replace stringly-typed VCS dispatch with VcsBackend enum

### Documentation

- Add Contributing section to README
- Update README
- Update README
- Add semver guidelines to CLAUDE.md
- Add committing section linking semver to commit workflow
- Add antipatterns section to CLAUDE.md
- Add pre-commit checklist to CLAUDE.md for version bump reminder
- Add guidance on unit tests vs integration tests
- Update README with jj support, --diff flag, and current features
- Update README
- Update README

### Performance

- Increase debounce time and deduplicate file events
- Use PollWatcher on WSL for reliable file watching
- Add retry logic for transient git errors
- Use platform-native recursive file watching
- Skip rendering when UI state unchanged
- Reduce git subprocess overhead
- Parallelize git operations and fix initial render viewport
- Fix jj VCS idle CPU and subprocess spam
- Batch git cat-file calls to reduce 3*N subprocesses to 3

### Testing

- Improve test suite quality
- Add tests for selection range and span highlighting
- Add comprehensive unit tests for 4-way diff algorithm
- Add comprehensive unit tests for inline diff computation
- Add comprehensive unit tests for color utilities
- Add additional edge case tests for selection utilities
- Add integration tests using portable-pty + vt100
- Add unit tests for diff_view.rs and update module

### Miscellaneous

- Add codebase statistics script
- Merge main
- Merge main
- Add coverage and security audit to dev workflow
- Update Cargo.lock for unicode-width dependency
- Upgrade ratatui to 0.30 and ratatui-image to 10
- Set version to 0.44.1 based on semver history
- Bump version to 0.50.0
- Add MIT/Apache-2.0 dual license for crates.io publishing
- Replace cargo-dist with simple version-driven CI/release workflows
- Update Cargo.lock for v0.54.2
## [0.1.0] - 2026-05-19

### Features

- Add inline diff coalescing, line wrapping, and text selection
- Replace r:refresh with ?:help in status bar
- Auto-fetch base branch and detect merge conflicts
- Show changed line count in status bar instead of total lines
- Add three view modes (full, context, changes-only)
- Width-aware inline diff display
- Responsive status bar for narrow terminals
- Add a file display toggle
- Auto-collapse lock files by default
- Show canceled lines for committed additions deleted in working tree
- Add non-interactive print mode (-p/--print)
- J/k navigates between files instead of scrolling
- Add character-level background highlighting for multiline diffs
- Show pure additions/deletions as single wrapped lines
- Add color legend to help modal
- Improve inline diff readability with better coalescing
- Add Ctrl+C to copy selection
- Improve deleted file handling
- Show +/- line counts in status bar with GitHub-style colors
- Add FrameContext and benchmark infrastructure for performance optimization
- Integrate FrameContext into main render loop
- Add FrameContext-based navigation functions
- Add --benchmark flag for profiling
- Add profiling script with source attribution
- Add `p` to copy current file path with visual feedback
- Add `Y` to copy entire diff to clipboard
- Filter file watcher events using .gitignore rules
- Watch newly created directories dynamically
- Add performance warnings for large repos and diffs
- Graceful degradation for git version compatibility

### Bug Fixes

- Refresh view when staging/unstaging files
- Refresh getting stuck after cancellation
- Status bar showing wrong branch name after refresh
- Esc dismisses help modal instead of quitting
- Show files in new untracked directories
- Don't show canceled lines for modified additions
- Swap dim/bright red for better color pairing
- Keep local base branch in sync with origin
- Position canceled lines near their original location
- Preserve manual expand/collapse state across refreshes
- Correct position of canceled lines in multi-stage diffs
- Improve refresh resilience in noisy environments
- Handle UTF-8 and empty repos gracefully
- Show inline modifications in context view mode
- Clamp scroll percentage to 100% and handle UTF-8 in wrapping
- *(ci)* Correct dtolnay/rust-toolchain action name
- Align local clippy with CI (-D warnings)
- *(test)* Configure git user in cloned repos for CI

### Refactor

- Deduplicate refresh logic, use &Path, use extend()
- Extract magic numbers to named constants in ui.rs
- Reorganize diff.rs into diff/ module
- Reorganize app.rs into app/ module
- Reorganize ui.rs into ui/ module
- Reorganize modals into directory structure
- Turn unwraps into more explicit typing
- Remove redundant comments
- Improve code organization and reduce duplication
- Address code review feedback
- Fix clippy warnings and tighten lint configuration
- Extract max_scroll_offset to remove duplication
- Remove deprecated functions and clean up FrameContext migration
- Add message router and DiffViewModel for better testability
- Rewrite benchmarks to test current hot paths
- Remove deprecated test-only methods and fix clippy warnings
- Remove all #[allow(...)] suppressions

### Documentation

- Add README with screenshot
- Add Ctrl+c to quit keybindings in README
- Fix misleading comment about Unix fd limit fallback

### Performance

- Move git operations to background thread for responsive input
- Reduce debounce 100ms→20ms, add refresh pipeline tests
- Add parallel file processing with rayon
- Add incremental single-file updates
- Implement lazy inline diff computation
- Add dirty flag to skip redundant inline span computation
- Optimize navigation to use indices instead of cloning lines

### Testing

- Add unit tests for status bar layout logic
- Add unit tests for character-level highlighting

### Miscellaneous

- Initial commit (branchdiff v0.1.0)
- Add .DS_Store to .gitignore
- Mark as unlicensed (all rights reserved)
- Remove redundant comments
- Add clippy lints to prevent architectural regression
- Add profiling profile for samply
- Add CI workflow and cargo-dist release automation
- Add vendor/ to gitignore
- Upgrade to Rust Edition 2024 with let-chains