## sinelaw/fresh — v0.5.1…v0.5.2

_272+ commits._

### Features
- **Dialog UX: Live Grep as an aligned form, combo boxes, the Browse… file picker, New Workspace order (#3367)** (41ce38f)
- **Tree test spec: the new columns field** (10d8c43)

### Fixes
- **Fix importing a Claude session, and move each agent's spec into its own module (#3421)** (83c0814)
- **fix(language): highlight .h headers as the language detection actually chose (#3018)** (2b970ad)
- **fix(windows): run shell commands with cmd /c instead of -c (#3291)** (7449f9e)
- **fix(lsp): silence transient crash UI while a restart is pending (#3288)** (a0142ca)
- **Fix the clippy warnings in the integration tests** (e60b71b)
- **Fix the remaining compiler and clippy warnings in the sources** (28fb295)
- **Fix the place question's Go button, the suggestion wheel, a picker test** (cafbc32)
- **Fix CI: text area height, dropdown select by index, tests for R2/R3** (9df0051)
- **Gate the plugin-terminal regression test on the plugins feature** (1c68cee)

### Backend
- **Bump version to 0.5.2 (#3423)** (25c6b90)
- **CHANGELOG: prepare 0.5.2 (#3372)** (f0c128f)
- **`fresh --cmd init plugin` sets up a typed plugin dev environment; setup guide (#3422)** (ca55fc6)
- **Cut the daemon's idle CPU and TypeScript typing cost (#3418)** (9221c43)
- **Keep large-file offsets on character boundaries (#3285) (#3419)** (4b9cc82)
- **Hash files on their own host for the #3380 changed-on-disk check (#3414)** (123b7f9)
- **Don't take a save's own torn write for a change on disk** (4b98f25)
- **Keep the view still when a click or a key leaves the caret in place** (39ffca4)
- **Keep the caret's screen row and goal column across PageDown/PageUp** (86a0348)
- **Derive the status bar's line from the cursor instead of caching it** (f92c103)
- **Make wrap_column count text columns, not the gutter** (6250ce0)
- **Make vi an editor-wide input mode instead of a window's editor mode** (43c153d)
- **Don't mirror a panel drawn over a buffer that isn't plugin-composed** (c8e3a1b)
- **Encode every key the kitty keyboard flags a terminal child pushed require** (98136c0)
- **Report a terminal's exit only after its last output is drained** (9f8baf7)
- **Don't take a moved mtime over our own saved bytes for a change on disk** (39fdadd)
- **Restore a hot-exit unnamed buffer into the launch's empty scratch buffer** (84f5f6c)
- **Report a modified buffer's change on disk once, not on every poll** (bbd65ea)
- **Close a tab with Save only after its sudo save has happened** (e85a18e)
- **Name the unsaved buffers and why in the quit prompt** (18d2a76)
- **Inflect counted status and quit messages for their number** (e375429)
- **Say "Quit cancelled" when the user backs out of quitting** (ff28673)
- **Make interrupted in-place saves recoverable and never write torn bytes** (59d1802)
- **Keep save temp names short enough for filesystems with short name limits** (4e149dd)
- **Keep a window's editor mode when switching away under a floating panel** (ad96ee7)
- **Describe the final save design and FileSystem contract in text-model.md** (39916d0)
- **Stop FileSystem and ProcessSpawner defaults from silently degrading** (8c555cd)
- **Leave a page's cursor to the control that places one** (e015085)
- **Arm the wheel walk after the notch is routed** (58f10be)
- **Take the rainbow bracket match emphasis from the theme** (c370f17)
- **Keep the viewport's ensure-visible hold in one value** (fbcf61d)
- **Load a diff baseline through the window that owns it** (f4f168c)
- **Give a panel without a mode no keymap** (838c1ef)
- **Inject the owner/xattr calls of an atomic replace instead of test hooks** (df5d208)
- **Stage in-place saves in the editor's recovery dir, with one sweep for it** (e393f4d)
- **Give the combined save status messages their own locale keys** (796ca65)
- **Decide what exiting writes and asks about in one plan** (ba94d34)
- **Give the save on exit its own outcome type** (7375f5f)
- **Decide between atomic and in-place saves in one place, in the save path** (bf102c9)
- **Make changed_on_disk and quit_skips_buffer Window methods** (f4ec70a)
- **Gate the Ctrl+J mode test on the plugins feature** (f7935de)
- **Document the PR's input, quit and terminal behaviour changes** (8d64da5)
- **Ask the focus chain which modes can claim Ctrl+J** (e072d7e)
- **Let the sudo-save error own its temp file** (0d2b352)
- **Drop an earlier in-place recovery once a sudo save writes the file** (f1d1fcd)
- **Forward private temp-file creation through the stdin spool filesystem** (0060f0f)
- **Don't auto-save on quit before the quit is confirmed** (eee5879)
- **Don't hold Save and Quit on a buffer the quit prompt skips** (4f789ab)
- **Read ESC LF as Alt+Enter on Windows too** (1a6b026)
- **Keep in-place save tests out of the real recovery directory** (d9c14ac)
- **Create the sudo save's temp file readable by its owner only** (a5b6056)
- **Keep an earlier staged copy until the file is opened for writing** (dc1d205)
- **Leave Ctrl+Alt+J as typed text on Windows** (c3857f2)
- **Report a file auto-save skips once, not every interval** (893a260)
- **Defer Live Diff recomputes for buffers of a background window** (d3eee8c)
- **Don't quit when Save and Quit or auto-save on exit can't save a file** (9792734)
- **Keep the Import sessions dialog's keymap off the window's editor mode** (c8a24ea)
- **Keep Ctrl+J for its chords and noop, and read ESC LF as Alt+Enter** (14c6112)
- **Don't ask for sudo when only the recovery directory can't be written** (6765d65)
- **End a drag's row hold when the cursor leaves the head** (efc80e7)
- **Keep one private staged copy per in-place save, and sweep resolved ones** (946005c)
- **Hold the rows while a drag leaves the pane sideways** (c3b28bb)
- **Keep a read-only file's user xattrs when saving it** (3fa00c4)
- **Compare canonical paths in the sudo-save tests' denying filesystem** (259123e)
- **Keep drag autoscroll sideways and at bare screen edges** (7b836b1)
- **Find a Live Diff baseline's encoding in any window** (8ae04db)
- **Build the sudo-save tests without the plugins feature** (e3e730a)
- **Delete the sudo-save temp file when a plugin's replace can't save** (2aece87)
- **Read an unbound Ctrl+J as Enter outside the terminal** (de9769f)
- **Remove recovery temp files left by a crash when a session starts** (765ef05)
- **Delete the sudo-save temp file when a save can't prompt for sudo** (d3070e9)
- **Ask before quitting when auto-save on exit would skip a changed file** (b8b97b5)
- **Keep Orchestrator keymaps off the window's editor mode** (bff0106)
- **Create a save's temp file with the original's mode, not the umask default** (882dcc6)
- **Stage in-place saves in the recovery directory before truncating** (64070b5)
- **Keep saves atomic when an xattr can't be copied, and drop content-bound ones** (df8ba3d)
- **Wait for the unwound blame view to render before checking it** (5b56c4f)
- **Don't let the Orchestrator dock clear another plugin's editor mode** (4a5dc8c)
- **Emphasize the matched bracket pair when rainbow brackets are on** (d0da6b4)
- **Decode Live Diff baselines with the buffer's encoding** (8243e79)
- **Highlight TOML trailing comments and end single-line strings at EOL** (5e2891a)
- **Don't overwrite a file changed on disk when closing its tab with Save** (1d739c1)
- **Put the cursor at a page text field's caret, not the reader's seat** (c959dae)
- **Count rows at wrap_column in the viewport's scroll math** (7f25e58)
- **Don't scroll the view while drag-selecting inside the text area** (0ed0ffc)
- **Put the cursor after a one-character line when clicking past its end** (4b0927e)
- **Don't write wide-char spacer cells into terminal scrollback** (d8cb152)
- **Forward each wheel notch to a terminal child only once** (1adb5b6)
- **Send modified Enter to kitty-protocol TUIs in the terminal as CSI-u** (a1ab73c)
- **Parse a raw LF byte as Ctrl+J, not Enter** (0f01672)
- **Let a terminal-context binding stop the terminal's key lookup** (895c10e)
- **Don't overwrite files changed on disk from Save All, quit or auto-save** (19d9ca0)
- **Keep owner, group, hard links and xattrs when saving a file** (c25466b)
- **Use a unique, never-clobbering temp file for atomic saves** (069a25c)
- **Pin the LSP first-spawn root URI for verbatim Windows paths** (dd03462)
- **macOS app bundle: stop the GUI launcher overwriting the fresh binary** (7020b48)
- **Reach split state through the window, and move split-only methods onto Window** (6716f3f)
- **Status bar: move non-bar helpers out and trim the history essays** (4cc89ff)
- **Status bar: anchor each popup to the element that opened it** (f0608a0)
- **Status bar: hand the web scene::StatusSegment directly** (99635b0)
- **Status bar: build items directly, without ElementKind** (23709e8)
- **Status bar: let the fold's provenance cover the bar** (35987ba)
- **Status bar: style elements by theme key, fixing the hover underline** (052fa65)
- **Status bar: drop the dead warning level and stale references** (a738c45)
- **tests: name the remote read outcome type** (bfad17b)
- **settings: a nested map entry saves into its parent dialog** (ad5c40d)
- **Apply clippy's machine-applicable suggestions across the workspace** (f55bad5)
- **Follow the dock's Menu button in the web UI suite** (471cc80)
- **Record the second cleanup pass in the UI doc** (ca9f084)
- **Compute composite pane geometry from one function, not the last paint** (4601d06)
- **Hold each pointer drag in one typed value on the window** (ac1f5e5)
- **Remove code only tests reached, and gate the test-only accessors that remain** (fb18330)
- **Move the rest of the page's and dialog's shared field logic onto SettingsSurface** (4707a5a)
- **Record the closed leftovers and the drag-state pattern in the UI doc** (9e32a16)
- **Keep the split separator's drag state in one value owned by the gesture** (d55f7a8)
- **Test the horizontal scrollbar's track click and thumb drag** (c7652bf)
- **Let the horizontal scrollbar reach the end of the widest line** (2acafe1)
- **Share the settings list-row code between the page and the entry dialog** (486ca54)
- **Delete popup and margin APIs that only tests called** (0eede17)
- **Remove the re-render of pane panels on a split height change** (233c13b)
- **Remove the dead user_scrolled flag from widget instance state** (66a8291)
- **Widget controls, follow-up: use fresh-ui's own traversal, focus return and layout (#3371)** (31536ab)
- **Open picker: stop snapping focus to Visit; a Settings test moves up** (e85d37d)
- **Dock: keep the opener and the Move dropdown; dock tests follow R1/R2** (5c6056f)
- **Path picker: Esc and ⌫ in every dialog; keep focus while a folder loads** (cd8a09c)
- **tsconfig: list lib/pickers.ts** (d2be0f1)
- **Shared composites in plugins/lib: the path picker and the Machine picker** (4336124)
- **Sizes from layout: a Text that fills its row, and a table widget** (1be8532)
- **Arrows nothing used move focus by screen position; bindings scoped to controls** (2dd59fc)
- **Text area: keep the caret in view on every layout; minRows/maxRows** (5cc038a)
- **Controls: one shared pop-up list; the dropdown and combo-box contracts** (68bd267)
- **Widget panels: the host owns focus; plugins read it, and a closed panel returns it** (ac476bc)
- **Offer the focused control every key exactly; the form's Enter moves on** (fbc587c)
- **Widget panels: the focused control handles a key before the plugin's mode** (62ee356)
- **Run settings-context keybindings the settings UI ignores** (6bb0e89)
- **Re-request semantic tokens when the server asks for a refresh** (3f17782)
- **Forward custom LSP notifications to plugins** (fa6feb5)
- **Keep prompt history across restarts** (e5fc1fc)
- **Kill background processes on request and report whether they are running** (0bc3585)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/sinelaw/fresh?utm_source=github-action)._