diff --git a/.changeset/account-save-state.md b/.changeset/account-save-state.md deleted file mode 100644 index e48fdb130..000000000 --- a/.changeset/account-save-state.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Store document save coordination in the account's Hunk state directory without creating a `.hunk` project marker in the user home. This preserves project discovery and reload bounds for directories beneath the home, including Windows temporary files. diff --git a/.changeset/annotated-nav-owner-parity.md b/.changeset/annotated-nav-owner-parity.md deleted file mode 100644 index 84d563468..000000000 --- a/.changeset/annotated-nav-owner-parity.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -`{`/`}` and `hunk session navigate --next-comment`/`--prev-comment` no longer skip notes drawn outside the diff’s changed lines, such as after a reload moves the hunks. diff --git a/.changeset/argument-aware-shell-completions.md b/.changeset/argument-aware-shell-completions.md deleted file mode 100644 index 49d11ca42..000000000 --- a/.changeset/argument-aware-shell-completions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Respect option arguments and the `--` pathspec separator in Bash and Zsh completions, and offer help and supported leading CLI flags. diff --git a/.changeset/batched-wheel-return.md b/.changeset/batched-wheel-return.md deleted file mode 100644 index 11ffe9820..000000000 --- a/.changeset/batched-wheel-return.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Restore the original comment target when wheel events return the viewport in a single burst. diff --git a/.changeset/beta-one-release-preparation.md b/.changeset/beta-one-release-preparation.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/beta-one-release-preparation.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/bold-bobcats-prove.md b/.changeset/bold-bobcats-prove.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/bold-bobcats-prove.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/bounded-highlight-worker-retries.md b/.changeset/bounded-highlight-worker-retries.md deleted file mode 100644 index a3483d886..000000000 --- a/.changeset/bounded-highlight-worker-retries.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"hunkdiff": patch ---- - -Stop re-running a failed large-diff highlight on every scroll, pick up a later successful retry -without remounting the file, and charge worker highlight results to the cache budget by the payload -they actually retain. diff --git a/.changeset/breezy-walls-fall.md b/.changeset/breezy-walls-fall.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/breezy-walls-fall.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/bright-diffs-conflict.md b/.changeset/bright-diffs-conflict.md deleted file mode 100644 index ad225f2f3..000000000 --- a/.changeset/bright-diffs-conflict.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Render Git combined conflict diffs from `git diff` during paused merges and rebases. diff --git a/.changeset/calm-hosts-stay.md b/.changeset/calm-hosts-stay.md deleted file mode 100644 index 05fc8babc..000000000 --- a/.changeset/calm-hosts-stay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Resolve releases from `hunk.dev/api/release/latest` so macOS no longer blocks pasting the curl install command as malware. diff --git a/.changeset/captured-document-editor-targets.md b/.changeset/captured-document-editor-targets.md deleted file mode 100644 index 38e9c18cf..000000000 --- a/.changeset/captured-document-editor-targets.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Capture the document editor's file and visible line when editing is requested, so later scrolling or selection during copy preparation cannot retarget the launch. diff --git a/.changeset/checked-documents-stay.md b/.changeset/checked-documents-stay.md deleted file mode 100644 index dc514f00a..000000000 --- a/.changeset/checked-documents-stay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Harden document browsing and editor saves against path replacement, reject incomplete Git ignore results, and fix Windows path checks. diff --git a/.changeset/clear-config-examples.md b/.changeset/clear-config-examples.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/clear-config-examples.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/clear-document-menu-accelerators.md b/.changeset/clear-document-menu-accelerators.md deleted file mode 100644 index 1ed530ff7..000000000 --- a/.changeset/clear-document-menu-accelerators.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Allow document menu shortcuts to refresh, edit, and quit with configured keybindings while keeping help and theme dialogs isolated. diff --git a/.changeset/clear-empty-reviews.md b/.changeset/clear-empty-reviews.md deleted file mode 100644 index f94de30ca..000000000 --- a/.changeset/clear-empty-reviews.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Show an empty-review message instead of claiming an active filter hid files when there are no changes to review. diff --git a/.changeset/compact-local-renames.md b/.changeset/compact-local-renames.md deleted file mode 100644 index e27e35136..000000000 --- a/.changeset/compact-local-renames.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Show the directory only once in same-directory rename labels so both filenames fit more easily in review headers. diff --git a/.changeset/compiled-extension-imports.md b/.changeset/compiled-extension-imports.md deleted file mode 100644 index 5b9dafda9..000000000 --- a/.changeset/compiled-extension-imports.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Folder extensions resolve installed packages in compiled binaries with the correct export conditions while preserving documentation strings, unrelated method calls, and locally bound `require` functions. diff --git a/.changeset/configurable-auto-split-width.md b/.changeset/configurable-auto-split-width.md deleted file mode 100644 index 84f40b8aa..000000000 --- a/.changeset/configurable-auto-split-width.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": minor ---- - -Add an `auto_split_min_width` config setting with a default of 160 available diff columns, accounting for side panes and outer padding so auto layout switches between unified and split as panes open, close, or resize. diff --git a/.changeset/coordinated-document-saves.md b/.changeset/coordinated-document-saves.md deleted file mode 100644 index 8d46d89a8..000000000 --- a/.changeset/coordinated-document-saves.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Coordinate document saves across Hunk windows in the same OS account to prevent overlapping writeback and preserve losing editors' recovery copies. diff --git a/.changeset/dismissed-document-menus.md b/.changeset/dismissed-document-menus.md deleted file mode 100644 index 4fbebf2c5..000000000 --- a/.changeset/dismissed-document-menus.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Dismiss document-browser menus when clicking the document or tree so subsequent keys follow the newly focused content. diff --git a/.changeset/docs-accuracy-pass.md b/.changeset/docs-accuracy-pass.md deleted file mode 100644 index dfd85e3bf..000000000 --- a/.changeset/docs-accuracy-pass.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -The bundled `hunk-review` skill now tells agents that agent notes start hidden, `hunk gh --help` lists its options and token variables, and the hunk.dev docs add `hunk log` and `hunk gh` to the CLI reference and correct stale install, platform, pager, watch, Jujutsu, and extension details. diff --git a/.changeset/draft-note-focus-transition.md b/.changeset/draft-note-focus-transition.md deleted file mode 100644 index 2be46a007..000000000 --- a/.changeset/draft-note-focus-transition.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Preserve text typed immediately after opening a note editor, including immediate saves, without triggering global shortcuts. diff --git a/.changeset/extension-directory-verdict-guide.md b/.changeset/extension-directory-verdict-guide.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/extension-directory-verdict-guide.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fast-terminal-color-refresh.md b/.changeset/fast-terminal-color-refresh.md deleted file mode 100644 index 006f66a76..000000000 --- a/.changeset/fast-terminal-color-refresh.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Refresh the `terminal` theme about three times faster after a terminal color-scheme switch, pick up switches from terminals that answer slowly, and settle on the final palette instead of a mix of old and new colors after rapid switches. diff --git a/.changeset/filled-document-viewports.md b/.changeset/filled-document-viewports.md deleted file mode 100644 index 6506924c3..000000000 --- a/.changeset/filled-document-viewports.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Fill initial document and tree viewports without requiring scrolling when native layout temporarily reports a negative scroll position. diff --git a/.changeset/fix-grapheme-prepend-113d1.md b/.changeset/fix-grapheme-prepend-113d1.md deleted file mode 100644 index c170a4792..000000000 --- a/.changeset/fix-grapheme-prepend-113d1.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Measure text containing U+113D1 (and other grapheme Prepend characters) with the correct terminal width instead of counting the prepend as its own cell, so slicing and wrapping agree with `string-width`. diff --git a/.changeset/focused-document-workflows.md b/.changeset/focused-document-workflows.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/focused-document-workflows.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/focused-status-ownership.md b/.changeset/focused-status-ownership.md deleted file mode 100644 index 676e42014..000000000 --- a/.changeset/focused-status-ownership.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Keep workspace-status reviews tied to launch configuration across reloads, serialize returns from history, and keep expanded status navigation responsive. diff --git a/.changeset/fresh-brand-downloads.md b/.changeset/fresh-brand-downloads.md deleted file mode 100644 index 7f6e902d3..000000000 --- a/.changeset/fresh-brand-downloads.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add a website brand page with SVG, transparent PNG, and PDF logo downloads in two colors and a complete ZIP bundle. diff --git a/.changeset/fresh-documents-scroll.md b/.changeset/fresh-documents-scroll.md deleted file mode 100644 index ce698a8a6..000000000 --- a/.changeset/fresh-documents-scroll.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Preserve the visible source line in complete documents when wrapping, resizing, toggling line numbers, or refreshing shortened files. diff --git a/.changeset/good-cats-say.md b/.changeset/good-cats-say.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/good-cats-say.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/grumpy-crabs-beg.md b/.changeset/grumpy-crabs-beg.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/grumpy-crabs-beg.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/independent-pane-edges.md b/.changeset/independent-pane-edges.md deleted file mode 100644 index 0137cdb65..000000000 --- a/.changeset/independent-pane-edges.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": minor ---- - -Reveal left and right extension panes independently and add `ctx.panes.isVisible()` so guide toggles leave the files pane's state untouched. diff --git a/.changeset/isolated-suspension-test.md b/.changeset/isolated-suspension-test.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/isolated-suspension-test.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/lazy-documents-open.md b/.changeset/lazy-documents-open.md deleted file mode 100644 index 77ab62a05..000000000 --- a/.changeset/lazy-documents-open.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": minor ---- - -Add `hunk open` to view complete syntax-highlighted files and browse directories with lazy loading, live refresh, and keyboard/mouse navigation. diff --git a/.changeset/lazy-navigation-copy-rows.md b/.changeset/lazy-navigation-copy-rows.md deleted file mode 100644 index 5c59a230f..000000000 --- a/.changeset/lazy-navigation-copy-rows.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Reduce memory use in large reviews by keeping copy-selection row content lazy during keyboard navigation. diff --git a/.changeset/light-agent-skills.md b/.changeset/light-agent-skills.md deleted file mode 100644 index e1be03d4f..000000000 --- a/.changeset/light-agent-skills.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": minor ---- - -Add `hunk skill show [name]` and publish pointer skills installable with `npx skills add modem-dev/hunk -g --skill hunk-review` or `--skill hunk-extensions`, delegating agent installation to the skills CLI while loading version-matched instructions from the installed Hunk binary. diff --git a/.changeset/list-hunk-checkpoint.md b/.changeset/list-hunk-checkpoint.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/list-hunk-checkpoint.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/list-hunk-verdict-and-hunk-backup.md b/.changeset/list-hunk-verdict-and-hunk-backup.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/list-hunk-verdict-and-hunk-backup.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/list-hunk-why.md b/.changeset/list-hunk-why.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/list-hunk-why.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/major-candies-nail.md b/.changeset/major-candies-nail.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/major-candies-nail.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/npm-extension-sources.md b/.changeset/npm-extension-sources.md deleted file mode 100644 index 29c1d5fb8..000000000 --- a/.changeset/npm-extension-sources.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": minor ---- - -Support scoped npm packages, versions, ranges, and tags in `hunk extension install` and the shared list/update/remove workflow while preserving Git installs and blocking npm lifecycle scripts. diff --git a/.changeset/pager-filter-focus.md b/.changeset/pager-filter-focus.md deleted file mode 100644 index dc56cb8bf..000000000 --- a/.changeset/pager-filter-focus.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Keep the file filter focused in pager mode when files reappear after a filter matches no files. diff --git a/.changeset/patient-windows-account-lookup.md b/.changeset/patient-windows-account-lookup.md deleted file mode 100644 index 4521346da..000000000 --- a/.changeset/patient-windows-account-lookup.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Allow bounded cold PowerShell startup time when locating the Windows account's document save namespace. Account lookup failures still refuse writeback and preserve recovery copies. diff --git a/.changeset/pinned-startup-benchmark-theme.md b/.changeset/pinned-startup-benchmark-theme.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/pinned-startup-benchmark-theme.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/plain-pager-epipe.md b/.changeset/plain-pager-epipe.md deleted file mode 100644 index 6838d7c32..000000000 --- a/.changeset/plain-pager-epipe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Fix plain-text Git pager output being truncated or failing with EPIPE when stdout is piped. diff --git a/.changeset/pre.json b/.changeset/pre.json deleted file mode 100644 index 21bea95a4..000000000 --- a/.changeset/pre.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "mode": "pre", - "tag": "beta", - "initialVersions": { - "hunkdiff": "0.23.0", - "@hunk/gh": "0.0.0", - "@hunk/git": "0.0.0", - "@hunk/jj": "0.0.0", - "@hunk/sapling": "0.0.0", - "@hunk/vcs": "0.0.0", - "@hunk/session-broker": "0.0.0", - "@hunk/session-broker-bun": "0.0.0", - "@hunk/session-broker-core": "0.0.0", - "@hunk/session-broker-node": "0.0.0", - "@hunk/term-video": "0.0.0" - }, - "changesets": [ - "account-save-state", - "annotated-nav-owner-parity", - "argument-aware-shell-completions", - "batched-wheel-return", - "beta-ci-smoke-coverage", - "bold-bobcats-prove", - "bounded-highlight-worker-retries", - "breezy-walls-fall", - "bright-diffs-conflict", - "calm-hosts-stay", - "captured-document-editor-targets", - "checked-documents-stay", - "clear-config-examples", - "clear-document-menu-accelerators", - "clear-empty-reviews", - "compact-local-renames", - "compiled-extension-imports", - "configurable-auto-split-width", - "coordinated-document-saves", - "dismissed-document-menus", - "docs-accuracy-pass", - "draft-note-focus-transition", - "extension-directory-verdict-guide", - "fast-terminal-color-refresh", - "filled-document-viewports", - "fix-grapheme-prepend-113d1", - "focused-document-workflows", - "focused-status-ownership", - "fresh-documents-scroll", - "good-cats-say", - "grumpy-crabs-beg", - "independent-pane-edges", - "isolated-suspension-test", - "lazy-documents-open", - "light-agent-skills", - "list-hunk-verdict-and-hunk-backup", - "list-hunk-why", - "major-candies-nail", - "npm-extension-sources", - "pager-filter-focus", - "patient-windows-account-lookup", - "pinned-startup-benchmark-theme", - "plain-pager-epipe", - "published-changelog-smoke", - "quiet-jj-paths", - "quiet-otters-scroll", - "quiet-states-rest", - "quiet-status-ci", - "quiet-watch-selection", - "quiet-worktrees-explain", - "readable-document-spacing", - "recognized-patch-input", - "reject-malformed-vcs-watch-hooks", - "release-benchmark-maintenance", - "reload-retired-note-count", - "remappable-save-note", - "retained-document-editor-notices", - "select-binary-files", - "settled-document-reviews", - "settled-editor-input", - "shell-completions", - "shell-parser-aware-completions", - "short-readme-draft", - "spaced-document-tests", - "stable-document-watch-demand", - "stable-document-wrap-test", - "steady-directory-watch", - "steady-history-cleanup", - "steady-sidebar-follow", - "suspended-session-stays-registered", - "tidy-document-keyboard-bursts", - "tidy-notes-reveal", - "tidy-status-workspaces", - "transient-presentation-scope", - "update-release-notes-link", - "warm-worker-highlighting", - "wheel-roundtrip-comment-target" - ] -} diff --git a/.changeset/published-changelog-smoke.md b/.changeset/published-changelog-smoke.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/published-changelog-smoke.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/quiet-jj-paths.md b/.changeset/quiet-jj-paths.md deleted file mode 100644 index ea677fd79..000000000 --- a/.changeset/quiet-jj-paths.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Name the repository in every Jujutsu source-read diagnostic. A missing `jj` binary and an unreadable `jj` stream now log the repo path beside the revision and file, as a failed `jj file show` already did. diff --git a/.changeset/quiet-otters-scroll.md b/.changeset/quiet-otters-scroll.md deleted file mode 100644 index 3c40ccbdf..000000000 --- a/.changeset/quiet-otters-scroll.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": minor ---- - -Add a `scroll_off` setting (and `--scroll-off ` flag) that defaults to keeping five rows of context around the current line while stepping through a diff, like Vim's `scrolloff`, with `scroll_off = 0` or `--scroll-off 0` restoring edge-only scrolling. diff --git a/.changeset/quiet-rejected-reviews.md b/.changeset/quiet-rejected-reviews.md deleted file mode 100644 index 8d18362a4..000000000 --- a/.changeset/quiet-rejected-reviews.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Stop repeatedly resubmitting rejected reviews to an unchanged healthy session daemon while preserving recovery after review replacement or daemon changes. diff --git a/.changeset/quiet-states-rest.md b/.changeset/quiet-states-rest.md deleted file mode 100644 index b2047791e..000000000 --- a/.changeset/quiet-states-rest.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Store persistent Hunk state under the XDG state directory while preserving existing state and global extension locations. diff --git a/.changeset/quiet-status-ci.md b/.changeset/quiet-status-ci.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/quiet-status-ci.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/quiet-watch-selection.md b/.changeset/quiet-watch-selection.md deleted file mode 100644 index 4ef0d4592..000000000 --- a/.changeset/quiet-watch-selection.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Preserve pending filesystem refreshes when selecting a file or changing expanded directories in the document browser. diff --git a/.changeset/quiet-worktrees-explain.md b/.changeset/quiet-worktrees-explain.md deleted file mode 100644 index 472d9137b..000000000 --- a/.changeset/quiet-worktrees-explain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -`hunk session` commands that select a window with `--repo` or `--session-path` now say which path matched no live session, instead of failing with `protocol-validation-failed` (for example, when run from a different git worktree than the Hunk window). The session daemon produces this message, so it appears once a daemon from this release is running; an older daemon keeps answering with `protocol-validation-failed` until it restarts. diff --git a/.changeset/readable-document-spacing.md b/.changeset/readable-document-spacing.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/readable-document-spacing.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/recognized-patch-input.md b/.changeset/recognized-patch-input.md deleted file mode 100644 index 8b0432b83..000000000 --- a/.changeset/recognized-patch-input.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Reject nonempty patch input without recognizable file changes instead of silently opening an empty review. diff --git a/.changeset/reject-malformed-vcs-watch-hooks.md b/.changeset/reject-malformed-vcs-watch-hooks.md deleted file mode 100644 index f0945407b..000000000 --- a/.changeset/reject-malformed-vcs-watch-hooks.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Extension VCS operation registration now requires `watchSignature` and `watchPlan` to be absent or callable. A non-callable hook is dropped along with its operation at registration instead of throwing a `TypeError` the first time watch planning invokes it. diff --git a/.changeset/release-benchmark-maintenance.md b/.changeset/release-benchmark-maintenance.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/release-benchmark-maintenance.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/release-reloaded-review-renders.md b/.changeset/release-reloaded-review-renders.md deleted file mode 100644 index 49a32e3ea..000000000 --- a/.changeset/release-reloaded-review-renders.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Fix a memory leak in `--watch` and other live reloads where every reload kept the previous review's files and render state alive, so long-running sessions grew without bound. diff --git a/.changeset/reload-retired-note-count.md b/.changeset/reload-retired-note-count.md deleted file mode 100644 index bd0ad5bee..000000000 --- a/.changeset/reload-retired-note-count.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -`hunk session reload` onto a diff that leaves out a file holding a live note keeps the session connected, and the note returns when a later reload brings its file back. diff --git a/.changeset/remappable-save-note.md b/.changeset/remappable-save-note.md deleted file mode 100644 index 1b24dafcc..000000000 --- a/.changeset/remappable-save-note.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": minor ---- - -Make the note composer save shortcut remappable via `hunk.review.saveNote` (default `ctrl+s`). diff --git a/.changeset/restore-github-default-theme.md b/.changeset/restore-github-default-theme.md deleted file mode 100644 index fe566a4a6..000000000 --- a/.changeset/restore-github-default-theme.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Restore `github-dark-default` as the default theme. The `terminal` theme remains available explicitly through config, `--theme terminal`, or the theme picker. diff --git a/.changeset/retained-document-editor-notices.md b/.changeset/retained-document-editor-notices.md deleted file mode 100644 index bf780222a..000000000 --- a/.changeset/retained-document-editor-notices.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Preserve every unique document editor failure notice and print its full recovery location after terminal teardown, even after later successful edits. diff --git a/.changeset/select-binary-files.md b/.changeset/select-binary-files.md deleted file mode 100644 index ef7176b29..000000000 --- a/.changeset/select-binary-files.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Binary files can be selected again with next/previous file navigation (`.` and `,`) and by clicking them in the files pane. diff --git a/.changeset/settled-document-reviews.md b/.changeset/settled-document-reviews.md deleted file mode 100644 index 076cde149..000000000 --- a/.changeset/settled-document-reviews.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Prevent overlapping document edits and lost recovery notices on quit, preserve wrapped text beside scrollbars, release vanished directory expansions, and restore keyboard scrolling in controls help. diff --git a/.changeset/settled-editor-input.md b/.changeset/settled-editor-input.md deleted file mode 100644 index 25111b277..000000000 --- a/.changeset/settled-editor-input.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Terminal editor handoffs release Hunk's stdin reader before launching the editor so Windows keyboard input does not wait for an extra Enter press. diff --git a/.changeset/shell-completions.md b/.changeset/shell-completions.md deleted file mode 100644 index 379b4a093..000000000 --- a/.changeset/shell-completions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": minor ---- - -Add `hunk completion bash` and `hunk completion zsh` to print shell completion scripts for commands, flags, and enumerated flag values. diff --git a/.changeset/shell-parser-aware-completions.md b/.changeset/shell-parser-aware-completions.md deleted file mode 100644 index 5efcbb895..000000000 --- a/.changeset/shell-parser-aware-completions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Handle Bash word-break fragments, nested session reload commands, and `--fast` shorthand in shell completion, and use Zsh's native argument completion for options and values. diff --git a/.changeset/short-readme-draft.md b/.changeset/short-readme-draft.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/short-readme-draft.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/spaced-document-tests.md b/.changeset/spaced-document-tests.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/spaced-document-tests.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/stable-document-watch-demand.md b/.changeset/stable-document-watch-demand.md deleted file mode 100644 index fa7da6899..000000000 --- a/.changeset/stable-document-watch-demand.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Keep document browser watch subscriptions alive across unchanged refreshes so files created during directory metadata queries appear automatically. diff --git a/.changeset/stable-document-wrap-test.md b/.changeset/stable-document-wrap-test.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/stable-document-wrap-test.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/beta-ci-smoke-coverage.md b/.changeset/stable-release-preparation.md similarity index 100% rename from .changeset/beta-ci-smoke-coverage.md rename to .changeset/stable-release-preparation.md diff --git a/.changeset/steady-directory-watch.md b/.changeset/steady-directory-watch.md deleted file mode 100644 index f405f79a8..000000000 --- a/.changeset/steady-directory-watch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Keep document browsing updates live after watched directories are replaced or deleted and recreated at the same path. diff --git a/.changeset/steady-history-cleanup.md b/.changeset/steady-history-cleanup.md deleted file mode 100644 index 84c320f19..000000000 --- a/.changeset/steady-history-cleanup.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Report history cursor cleanup failures when quitting during or after a refresh. diff --git a/.changeset/steady-sidebar-follow.md b/.changeset/steady-sidebar-follow.md deleted file mode 100644 index 14b96eff0..000000000 --- a/.changeset/steady-sidebar-follow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Keep the selected file visible in the sidebar during held next-file or previous-file navigation and terminal resizing without snapping ordinary manual scrolling back to the selection. diff --git a/.changeset/suspended-session-stays-registered.md b/.changeset/suspended-session-stays-registered.md deleted file mode 100644 index a1e75cf03..000000000 --- a/.changeset/suspended-session-stays-registered.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Keep Hunk sessions alive while window is suspended. diff --git a/.changeset/tidy-document-keyboard-bursts.md b/.changeset/tidy-document-keyboard-bursts.md deleted file mode 100644 index 2054ff204..000000000 --- a/.changeset/tidy-document-keyboard-bursts.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Keep document focus, help, themes, and menus consistent when keyboard or mouse actions arrive before the next render. diff --git a/.changeset/tidy-notes-reveal.md b/.changeset/tidy-notes-reveal.md deleted file mode 100644 index 2bf1a1df2..000000000 --- a/.changeset/tidy-notes-reveal.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Reveal the full note composer when opening a draft near the bottom of the diff pane, scrolling only when needed to keep the input and Save/Cancel controls visible. diff --git a/.changeset/tidy-nowrap-geometry.md b/.changeset/tidy-nowrap-geometry.md deleted file mode 100644 index 610f92a6a..000000000 --- a/.changeset/tidy-nowrap-geometry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Reduce diff geometry allocation and retention when resizing nonwrapped reviews without inline notes. diff --git a/.changeset/tidy-status-workspaces.md b/.changeset/tidy-status-workspaces.md deleted file mode 100644 index 897346652..000000000 --- a/.changeset/tidy-status-workspaces.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": minor ---- - -Add a live read-only workspace status view with sibling inspection, shared-theme navigation into Log and full diff reviews, indented tracked/untracked groups with readable theme-colored staging facts and independent ten-file expansion, clearly separated sibling worktrees, and static or versioned JSON output. diff --git a/.changeset/transient-presentation-scope.md b/.changeset/transient-presentation-scope.md deleted file mode 100644 index ac156fffe..000000000 --- a/.changeset/transient-presentation-scope.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": minor ---- - -Add extension-owned, generation-scoped presentation filters for selecting runtime files and hunks without changing canonical review state. diff --git a/.changeset/update-release-notes-link.md b/.changeset/update-release-notes-link.md deleted file mode 100644 index b293ae363..000000000 --- a/.changeset/update-release-notes-link.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Link the matching GitHub release notes after `hunk update` installs a version, reports one as already current, or checks for a newer one. diff --git a/.changeset/warm-worker-highlighting.md b/.changeset/warm-worker-highlighting.md deleted file mode 100644 index 66363ac8b..000000000 --- a/.changeset/warm-worker-highlighting.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": minor ---- - -Syntax highlighting now runs in the worker by default, and the worker starts compiling the review's grammars during startup, so the first key after the review appears is no longer blocked by highlighting. `--fast` is accepted as a no-op and will be removed in a later release; Windows compiled binaries and custom themes with `syntax_scopes` keep highlighting inline. diff --git a/.changeset/wheel-roundtrip-comment-target.md b/.changeset/wheel-roundtrip-comment-target.md deleted file mode 100644 index 9d290bcd2..000000000 --- a/.changeset/wheel-roundtrip-comment-target.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"hunkdiff": patch ---- - -Fix stale comment targets after scrolling or stepping the cursor. diff --git a/CHANGELOG.md b/CHANGELOG.md index 41a86e754..3940ecc64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,137 @@ # Changelog +## 0.24.0 + +### Minor Changes + +- [#1170](https://github.com/modem-dev/hunk/pull/1170) [`8d93ef6`](https://github.com/modem-dev/hunk/commit/8d93ef691ba43f56795d44652649188828061dcd) - Add an `auto_split_min_width` config setting with a default of 160 available diff columns, accounting for side panes and outer padding so auto layout switches between unified and split as panes open, close, or resize. + +- [#1171](https://github.com/modem-dev/hunk/pull/1171) [`38b1231`](https://github.com/modem-dev/hunk/commit/38b1231e30c371c4ba5fe9a34ff96ab81296aca0) - Reveal left and right extension panes independently and add `ctx.panes.isVisible()` so guide toggles leave the files pane's state untouched. + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Add `hunk open` to view complete syntax-highlighted files and browse directories with lazy loading, live refresh, and keyboard/mouse navigation. + +- [#1167](https://github.com/modem-dev/hunk/pull/1167) [`d464cff`](https://github.com/modem-dev/hunk/commit/d464cffe527ec1725c88949613e7411c6e7b559d) - Add `hunk skill show [name]` and publish pointer skills installable with `npx skills add modem-dev/hunk -g --skill hunk-review` or `--skill hunk-extensions`, delegating agent installation to the skills CLI while loading version-matched instructions from the installed Hunk binary. + +- [#1162](https://github.com/modem-dev/hunk/pull/1162) [`f0aa9af`](https://github.com/modem-dev/hunk/commit/f0aa9af122c1d7203613e7dc086041b0af573f41) - Support scoped npm packages, versions, ranges, and tags in `hunk extension install` and the shared list/update/remove workflow while preserving Git installs and blocking npm lifecycle scripts. + +- [#1109](https://github.com/modem-dev/hunk/pull/1109) [`7828628`](https://github.com/modem-dev/hunk/commit/782862886a64e1d61b588d10bfa2b1d6fc374d34) - Add a `scroll_off` setting (and `--scroll-off ` flag) that defaults to keeping five rows of context around the current line while stepping through a diff, like Vim's `scrolloff`, with `scroll_off = 0` or `--scroll-off 0` restoring edge-only scrolling. + +- [#962](https://github.com/modem-dev/hunk/pull/962) [`55c5ac1`](https://github.com/modem-dev/hunk/commit/55c5ac1670aae213c6ea069663e60def7d542328) - Make the note composer save shortcut remappable via `hunk.review.saveNote` (default `ctrl+s`). + +- [#1157](https://github.com/modem-dev/hunk/pull/1157) [`74596a0`](https://github.com/modem-dev/hunk/commit/74596a067024c71ba084dacf89e6f01e5f66e6fa) - Add `hunk completion bash` and `hunk completion zsh` to print shell completion scripts for commands, flags, and enumerated flag values. + +- [#1067](https://github.com/modem-dev/hunk/pull/1067) [`49bebf7`](https://github.com/modem-dev/hunk/commit/49bebf7385cf532a9beb40f8f7a32d945b456a2e) - Add a live read-only workspace status view with sibling inspection, shared-theme navigation into Log and full diff reviews, indented tracked/untracked groups with readable theme-colored staging facts and independent ten-file expansion, clearly separated sibling worktrees, and static or versioned JSON output. + +- [#1118](https://github.com/modem-dev/hunk/pull/1118) [`09a76af`](https://github.com/modem-dev/hunk/commit/09a76af7e6379d7e83c269704c0b5df5a450b952) - Add extension-owned, generation-scoped presentation filters for selecting runtime files and hunks without changing canonical review state. + +- [#1105](https://github.com/modem-dev/hunk/pull/1105) [`69d1d2f`](https://github.com/modem-dev/hunk/commit/69d1d2fe2fc86a40b28b74482347a683d5045f24) - Syntax highlighting now runs in the worker by default, and the worker starts compiling the review's grammars during startup, so the first key after the review appears is no longer blocked by highlighting. `--fast` is accepted as a no-op and will be removed in a later release; Windows compiled binaries and custom themes with `syntax_scopes` keep highlighting inline. + +### Patch Changes + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Store document save coordination in the account's Hunk state directory without creating a `.hunk` project marker in the user home. This preserves project discovery and reload bounds for directories beneath the home, including Windows temporary files. + +- [#1147](https://github.com/modem-dev/hunk/pull/1147) [`8111914`](https://github.com/modem-dev/hunk/commit/8111914e03f56063e0800ce882edbbad06ccfd93) - `{`/`}` and `hunk session navigate --next-comment`/`--prev-comment` no longer skip notes drawn outside the diff’s changed lines, such as after a reload moves the hunks. + +- [#1157](https://github.com/modem-dev/hunk/pull/1157) [`74596a0`](https://github.com/modem-dev/hunk/commit/74596a067024c71ba084dacf89e6f01e5f66e6fa) - Respect option arguments and the `--` pathspec separator in Bash and Zsh completions, and offer help and supported leading CLI flags. + +- [#1164](https://github.com/modem-dev/hunk/pull/1164) [`4acc46f`](https://github.com/modem-dev/hunk/commit/4acc46fde7ccd18c5d0b8e4a9e3716c49ad0222b) - Restore the original comment target when wheel events return the viewport in a single burst. + +- [#785](https://github.com/modem-dev/hunk/pull/785) [`d2e85a0`](https://github.com/modem-dev/hunk/commit/d2e85a0847fcee8911ce386ea7b03888586049e4) - Stop re-running a failed large-diff highlight on every scroll, pick up a later successful retry + without remounting the file, and charge worker highlight results to the cache budget by the payload + they actually retain. + +- [#1102](https://github.com/modem-dev/hunk/pull/1102) [`0871387`](https://github.com/modem-dev/hunk/commit/0871387d211dbeb0f3319db64ac6c0d5e3dbedde) - Render Git combined conflict diffs from `git diff` during paused merges and rebases. + +- [#1140](https://github.com/modem-dev/hunk/pull/1140) [`f4beb16`](https://github.com/modem-dev/hunk/commit/f4beb1650c7cab6ca8accc171383d2110f80f71c) - Resolve releases from `hunk.dev/api/release/latest` so macOS no longer blocks pasting the curl install command as malware. + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Capture the document editor's file and visible line when editing is requested, so later scrolling or selection during copy preparation cannot retarget the launch. + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Harden document browsing and editor saves against path replacement, reject incomplete Git ignore results, and fix Windows path checks. + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Allow document menu shortcuts to refresh, edit, and quit with configured keybindings while keeping help and theme dialogs isolated. + +- [#1182](https://github.com/modem-dev/hunk/pull/1182) [`08c3da7`](https://github.com/modem-dev/hunk/commit/08c3da70d82b512c61c585c9445dd94599144b16) - Show an empty-review message instead of claiming an active filter hid files when there are no changes to review. + +- [#1156](https://github.com/modem-dev/hunk/pull/1156) [`9af06b3`](https://github.com/modem-dev/hunk/commit/9af06b32082a04266bbd15f7a38db00772aa54fc) - Show the directory only once in same-directory rename labels so both filenames fit more easily in review headers. + +- [#1163](https://github.com/modem-dev/hunk/pull/1163) [`7ca7eb9`](https://github.com/modem-dev/hunk/commit/7ca7eb90e4b1853c72e475cd4b68e6aa5ceff802) - Folder extensions resolve installed packages in compiled binaries with the correct export conditions while preserving documentation strings, unrelated method calls, and locally bound `require` functions. + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Coordinate document saves across Hunk windows in the same OS account to prevent overlapping writeback and preserve losing editors' recovery copies. + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Dismiss document-browser menus when clicking the document or tree so subsequent keys follow the newly focused content. + +- [#1186](https://github.com/modem-dev/hunk/pull/1186) [`d8cd77b`](https://github.com/modem-dev/hunk/commit/d8cd77bbfc053bedbeeb049207effcd4ba86039c) - The bundled `hunk-review` skill now tells agents that agent notes start hidden, `hunk gh --help` lists its options and token variables, and the hunk.dev docs add `hunk log` and `hunk gh` to the CLI reference and correct stale install, platform, pager, watch, Jujutsu, and extension details. + +- [#1125](https://github.com/modem-dev/hunk/pull/1125) [`e5f4a05`](https://github.com/modem-dev/hunk/commit/e5f4a05cb726dbdf39774e08d3b45c5fde539b5f) - Preserve text typed immediately after opening a note editor, including immediate saves, without triggering global shortcuts. + +- [#1130](https://github.com/modem-dev/hunk/pull/1130) [`9566e33`](https://github.com/modem-dev/hunk/commit/9566e33d930e8844a0fe910e7b9d0f822b0728cb) - Refresh the `terminal` theme about three times faster after a terminal color-scheme switch, pick up switches from terminals that answer slowly, and settle on the final palette instead of a mix of old and new colors after rapid switches. + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Fill initial document and tree viewports without requiring scrolling when native layout temporarily reports a negative scroll position. + +- [#1153](https://github.com/modem-dev/hunk/pull/1153) [`291fe75`](https://github.com/modem-dev/hunk/commit/291fe755b9161844d03b932615a69b2dbb6dc7dd) - Measure text containing U+113D1 (and other grapheme Prepend characters) with the correct terminal width instead of counting the prepend as its own cell, so slicing and wrapping agree with `string-width`. + +- [#1067](https://github.com/modem-dev/hunk/pull/1067) [`49bebf7`](https://github.com/modem-dev/hunk/commit/49bebf7385cf532a9beb40f8f7a32d945b456a2e) - Keep workspace-status reviews tied to launch configuration across reloads, serialize returns from history, and keep expanded status navigation responsive. + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Preserve the visible source line in complete documents when wrapping, resizing, toggling line numbers, or refreshing shortened files. + +- [#1202](https://github.com/modem-dev/hunk/pull/1202) [`4dd9448`](https://github.com/modem-dev/hunk/commit/4dd9448670cb6d4d2d0f303186a6437d2e4292bd) - Reduce memory use in large reviews by keeping copy-selection row content lazy during keyboard navigation. + +- [#1161](https://github.com/modem-dev/hunk/pull/1161) [`58ecbc5`](https://github.com/modem-dev/hunk/commit/58ecbc5bf6ebb23ba3856482f81c1ac1681a3e72) - Keep the file filter focused in pager mode when files reappear after a filter matches no files. + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Allow bounded cold PowerShell startup time when locating the Windows account's document save namespace. Account lookup failures still refuse writeback and preserve recovery copies. + +- [#1112](https://github.com/modem-dev/hunk/pull/1112) [`606a3dc`](https://github.com/modem-dev/hunk/commit/606a3dcb9a1c8e45f886e547a241309322a71671) - Fix plain-text Git pager output being truncated or failing with EPIPE when stdout is piped. + +- [#1146](https://github.com/modem-dev/hunk/pull/1146) [`e1ec8c1`](https://github.com/modem-dev/hunk/commit/e1ec8c1f9d802cc6bfe2393391364b5a55e045c5) - Name the repository in every Jujutsu source-read diagnostic. A missing `jj` binary and an unreadable `jj` stream now log the repo path beside the revision and file, as a failed `jj file show` already did. + +- [#1199](https://github.com/modem-dev/hunk/pull/1199) [`4b15946`](https://github.com/modem-dev/hunk/commit/4b1594692ff67e5680ab7cfe72573d39177ff031) - Stop repeatedly resubmitting rejected reviews to an unchanged healthy session daemon while preserving recovery after review replacement or daemon changes. + +- [#920](https://github.com/modem-dev/hunk/pull/920) [`f3e78cb`](https://github.com/modem-dev/hunk/commit/f3e78cb6d38203180f2b8795f774ce434b2d1ac3) - Store persistent Hunk state under the XDG state directory while preserving existing state and global extension locations. + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Preserve pending filesystem refreshes when selecting a file or changing expanded directories in the document browser. + +- [#1149](https://github.com/modem-dev/hunk/pull/1149) [`252f59d`](https://github.com/modem-dev/hunk/commit/252f59dd39409b2390d02b0f9e003819c9d41176) - `hunk session` commands that select a window with `--repo` or `--session-path` now say which path matched no live session, instead of failing with `protocol-validation-failed` (for example, when run from a different git worktree than the Hunk window). The session daemon produces this message, so it appears once a daemon from this release is running; an older daemon keeps answering with `protocol-validation-failed` until it restarts. + +- [#1183](https://github.com/modem-dev/hunk/pull/1183) [`b0afaab`](https://github.com/modem-dev/hunk/commit/b0afaabeafc93357c1618c80c87ed8753a7f56e3) - Reject nonempty patch input without recognizable file changes instead of silently opening an empty review. + +- [#1080](https://github.com/modem-dev/hunk/pull/1080) [`8e0bc1a`](https://github.com/modem-dev/hunk/commit/8e0bc1af1c5c970ddd6b44712b6c050db4c0faa8) - Extension VCS operation registration now requires `watchSignature` and `watchPlan` to be absent or callable. A non-callable hook is dropped along with its operation at registration instead of throwing a `TypeError` the first time watch planning invokes it. + +- [#1201](https://github.com/modem-dev/hunk/pull/1201) [`1c9ae6b`](https://github.com/modem-dev/hunk/commit/1c9ae6ba11f80a7753fc9cb396b77dc5836e9bc5) - Fix a memory leak in `--watch` and other live reloads where every reload kept the previous review's files and render state alive, so long-running sessions grew without bound. + +- [#1131](https://github.com/modem-dev/hunk/pull/1131) [`8dae12f`](https://github.com/modem-dev/hunk/commit/8dae12f75e619027d08d545607705fdd0152d970) - `hunk session reload` onto a diff that leaves out a file holding a live note keeps the session connected, and the note returns when a later reload brings its file back. + +- [#1195](https://github.com/modem-dev/hunk/pull/1195) [`483ea47`](https://github.com/modem-dev/hunk/commit/483ea47d3db4c8e3d06c5be191ea7c1fe7051d8a) - Restore `github-dark-default` as the default theme. The `terminal` theme remains available explicitly through config, `--theme terminal`, or the theme picker. + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Preserve every unique document editor failure notice and print its full recovery location after terminal teardown, even after later successful edits. + +- [#1178](https://github.com/modem-dev/hunk/pull/1178) [`d3543c6`](https://github.com/modem-dev/hunk/commit/d3543c618374b648510183237904cdd5251f6425) - Binary files can be selected again with next/previous file navigation (`.` and `,`) and by clicking them in the files pane. + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Prevent overlapping document edits and lost recovery notices on quit, preserve wrapped text beside scrollbars, release vanished directory expansions, and restore keyboard scrolling in controls help. + +- [#1165](https://github.com/modem-dev/hunk/pull/1165) [`529f110`](https://github.com/modem-dev/hunk/commit/529f1109efdb29c28f45e273e8b9e96dff1919c3) - Terminal editor handoffs release Hunk's stdin reader before launching the editor so Windows keyboard input does not wait for an extra Enter press. + +- [#1157](https://github.com/modem-dev/hunk/pull/1157) [`74596a0`](https://github.com/modem-dev/hunk/commit/74596a067024c71ba084dacf89e6f01e5f66e6fa) - Handle Bash word-break fragments, nested session reload commands, and `--fast` shorthand in shell completion, and use Zsh's native argument completion for options and values. + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Keep document browser watch subscriptions alive across unchanged refreshes so files created during directory metadata queries appear automatically. + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Keep document browsing updates live after watched directories are replaced or deleted and recreated at the same path. + +- [#1067](https://github.com/modem-dev/hunk/pull/1067) [`49bebf7`](https://github.com/modem-dev/hunk/commit/49bebf7385cf532a9beb40f8f7a32d945b456a2e) - Report history cursor cleanup failures when quitting during or after a refresh. + +- [#1085](https://github.com/modem-dev/hunk/pull/1085) [`654a14a`](https://github.com/modem-dev/hunk/commit/654a14a8d13caabc1f56b5888d4d960cd1b74c88) - Keep the selected file visible in the sidebar during held next-file or previous-file navigation and terminal resizing without snapping ordinary manual scrolling back to the selection. + +- [#1134](https://github.com/modem-dev/hunk/pull/1134) [`9eb1421`](https://github.com/modem-dev/hunk/commit/9eb142125ff6832efb7b1fca3dc4ec6889e2e799) - Keep Hunk sessions alive while window is suspended. + +- [#1148](https://github.com/modem-dev/hunk/pull/1148) [`82642e0`](https://github.com/modem-dev/hunk/commit/82642e0b0d90696087dec4c72546fe0f2ab41151) - Keep document focus, help, themes, and menus consistent when keyboard or mouse actions arrive before the next render. + +- [#1160](https://github.com/modem-dev/hunk/pull/1160) [`48e6981`](https://github.com/modem-dev/hunk/commit/48e69810b72d6cdade7a83609544636b3dc1965e) - Reveal the full note composer when opening a draft near the bottom of the diff pane, scrolling only when needed to keep the input and Save/Cancel controls visible. + +- [#1200](https://github.com/modem-dev/hunk/pull/1200) [`4051955`](https://github.com/modem-dev/hunk/commit/4051955ff43c66010f30de7afc75e300c4819913) - Reduce diff geometry allocation and retention when resizing nonwrapped reviews without inline notes. + +- [#1166](https://github.com/modem-dev/hunk/pull/1166) [`7572a22`](https://github.com/modem-dev/hunk/commit/7572a2281576094ba135d4b2be65d8c9a3ca97db) - Link the matching GitHub release notes after `hunk update` installs a version, reports one as already current, or checks for a newer one. + +- [#1143](https://github.com/modem-dev/hunk/pull/1143) [`b237c18`](https://github.com/modem-dev/hunk/commit/b237c18c21aae2bba5f5fe5856241d5270843f7f) - Fix stale comment targets after scrolling or stepping the cursor. + ## 0.24.0-beta.1 ### Patch Changes diff --git a/benchmarks/release/bench-0.24.0.json b/benchmarks/release/bench-0.24.0.json new file mode 100644 index 000000000..c649e6c98 --- /dev/null +++ b/benchmarks/release/bench-0.24.0.json @@ -0,0 +1,1828 @@ +{ + "version": 1, + "generatedAt": "2026-10-19T03:23:08.377Z", + "gitSha": "5fb9926470a70981aff8a9229d1db60f8602f067", + "packageVersion": "0.24.0", + "acceptedRegressions": [ + { + "name": "interaction-latency/hunk_nav_press_p95_ms", + "reason": "Carries forward the sidebar-follow tradeoff the maintainer accepted for 0.24.0-beta.1 after attempts to remove the slowdown were unsuccessful. The stable snapshot measures 42.74ms, lower than beta.1's 44.55ms and stable 0.23.0's 46.32ms, but above beta.0's 36.35ms. Preserve correct sidebar following during held file navigation and terminal resizing. This inherited exception identifies the known beta.0 comparison cost; no new regression against the previous stable release or beta.1 is waived. Stable tag/publication remains subject to final maintainer approval." + } + ], + "runtime": { + "bunVersion": "1.4.2", + "platform": "linux", + "arch": "x64" + }, + "samplesPerBenchmark": 5, + "results": [ + { + "name": "bootstrap-load/file_pair_bootstrap_ms", + "source": "bootstrap-load", + "samples": [20.09, 21.41, 21.45, 19.62, 19.36], + "median": 20.09, + "p75": 21.41, + "p95": 21.45, + "min": 19.36, + "max": 21.45, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "bootstrap-load/files", + "source": "bootstrap-load", + "samples": [64, 64, 64, 64, 64], + "median": 64, + "p75": 64, + "p95": 64, + "min": 64, + "max": 64, + "unit": "count", + "comparable": false + }, + { + "name": "bootstrap-load/git_bootstrap_ms", + "source": "bootstrap-load", + "samples": [44.05, 43.36, 46.43, 46.91, 49.61], + "median": 46.43, + "p75": 46.91, + "p95": 49.61, + "min": 43.36, + "max": 49.61, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "bootstrap-load/git_diff_subprocess_ms", + "source": "bootstrap-load", + "samples": [10.99, 10.97, 11.38, 11.73, 9.77], + "median": 10.99, + "p75": 11.38, + "p95": 11.73, + "min": 9.77, + "max": 11.73, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "bootstrap-load/git_parse_patch_ms", + "source": "bootstrap-load", + "samples": [5.43, 5.72, 6.13, 5.54, 5.7], + "median": 5.7, + "p75": 5.72, + "p95": 6.13, + "min": 5.43, + "max": 6.13, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "bootstrap-load/git_split_patch_chunks_ms", + "source": "bootstrap-load", + "samples": [1.35, 1.76, 1.94, 1.48, 1.33], + "median": 1.48, + "p75": 1.76, + "p95": 1.94, + "min": 1.33, + "max": 1.94, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "bootstrap-load/lines_per_file", + "source": "bootstrap-load", + "samples": [420, 420, 420, 420, 420], + "median": 420, + "p75": 420, + "p95": 420, + "min": 420, + "max": 420, + "unit": "count", + "comparable": false + }, + { + "name": "bootstrap-load/parsed_files", + "source": "bootstrap-load", + "samples": [64, 64, 64, 64, 64], + "median": 64, + "p75": 64, + "p95": 64, + "min": 64, + "max": 64, + "unit": "count", + "comparable": false + }, + { + "name": "bootstrap-load/patch_chunks", + "source": "bootstrap-load", + "samples": [64, 64, 64, 64, 64], + "median": 64, + "p75": 64, + "p95": 64, + "min": 64, + "max": 64, + "unit": "count", + "comparable": false + }, + { + "name": "changeset-parse/balanced_changeset_build_diff_files_ms", + "source": "changeset-parse", + "samples": [0.3, 0.32, 0.51, 0.31, 0.28], + "median": 0.31, + "p75": 0.32, + "p95": 0.51, + "min": 0.28, + "max": 0.51, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "changeset-parse/balanced_changeset_files", + "source": "changeset-parse", + "samples": [96, 96, 96, 96, 96], + "median": 96, + "p75": 96, + "p95": 96, + "min": 96, + "max": 96, + "unit": "count", + "comparable": false + }, + { + "name": "changeset-parse/balanced_changeset_normalize_patch_ms", + "source": "changeset-parse", + "samples": [0.21, 0.19, 0.2, 0.2, 0.2], + "median": 0.2, + "p75": 0.2, + "p95": 0.21, + "min": 0.19, + "max": 0.21, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "changeset-parse/balanced_changeset_parse_patch_ms", + "source": "changeset-parse", + "samples": [2.46, 4.62, 2.54, 2.82, 2.44], + "median": 2.54, + "p75": 2.82, + "p95": 4.62, + "min": 2.44, + "max": 4.62, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "changeset-parse/balanced_changeset_patch_bytes", + "source": "changeset-parse", + "samples": [682727, 682727, 682727, 682727, 682727], + "median": 682727, + "p75": 682727, + "p95": 682727, + "min": 682727, + "max": 682727, + "unit": "bytes", + "comparable": false + }, + { + "name": "changeset-parse/balanced_changeset_split_chunks_ms", + "source": "changeset-parse", + "samples": [0.8, 0.65, 0.72, 0.73, 0.8], + "median": 0.73, + "p75": 0.8, + "p95": 0.8, + "min": 0.65, + "max": 0.8, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "changeset-parse/large_single_file_build_diff_files_ms", + "source": "changeset-parse", + "samples": [0.06, 0.06, 0.06, 0.06, 0.06], + "median": 0.06, + "p75": 0.06, + "p95": 0.06, + "min": 0.06, + "max": 0.06, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "changeset-parse/large_single_file_files", + "source": "changeset-parse", + "samples": [1, 1, 1, 1, 1], + "median": 1, + "p75": 1, + "p95": 1, + "min": 1, + "max": 1, + "unit": "count", + "comparable": false + }, + { + "name": "changeset-parse/large_single_file_normalize_patch_ms", + "source": "changeset-parse", + "samples": [0.08, 0.08, 0.08, 0.08, 0.08], + "median": 0.08, + "p75": 0.08, + "p95": 0.08, + "min": 0.08, + "max": 0.08, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "changeset-parse/large_single_file_parse_patch_ms", + "source": "changeset-parse", + "samples": [0.7, 0.74, 0.79, 0.77, 0.73], + "median": 0.74, + "p75": 0.77, + "p95": 0.79, + "min": 0.7, + "max": 0.79, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "changeset-parse/large_single_file_patch_bytes", + "source": "changeset-parse", + "samples": [284479, 284479, 284479, 284479, 284479], + "median": 284479, + "p75": 284479, + "p95": 284479, + "min": 284479, + "max": 284479, + "unit": "bytes", + "comparable": false + }, + { + "name": "changeset-parse/large_single_file_split_chunks_ms", + "source": "changeset-parse", + "samples": [0.23, 0.17, 0.16, 0.37, 0.23], + "median": 0.23, + "p75": 0.23, + "p95": 0.37, + "min": 0.16, + "max": 0.37, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "changeset-parse/many_small_files_build_diff_files_ms", + "source": "changeset-parse", + "samples": [1.12, 1.03, 3.15, 1.32, 1.1], + "median": 1.12, + "p75": 1.32, + "p95": 3.15, + "min": 1.03, + "max": 3.15, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "changeset-parse/many_small_files_files", + "source": "changeset-parse", + "samples": [240, 240, 240, 240, 240], + "median": 240, + "p75": 240, + "p95": 240, + "min": 240, + "max": 240, + "unit": "count", + "comparable": false + }, + { + "name": "changeset-parse/many_small_files_normalize_patch_ms", + "source": "changeset-parse", + "samples": [0.47, 0.46, 0.46, 0.46, 0.46], + "median": 0.46, + "p75": 0.46, + "p95": 0.47, + "min": 0.46, + "max": 0.47, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "changeset-parse/many_small_files_parse_patch_ms", + "source": "changeset-parse", + "samples": [4.32, 4.17, 4.26, 4.4, 4.17], + "median": 4.26, + "p75": 4.32, + "p95": 4.4, + "min": 4.17, + "max": 4.4, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "changeset-parse/many_small_files_patch_bytes", + "source": "changeset-parse", + "samples": [376703, 376703, 376703, 376703, 376703], + "median": 376703, + "p75": 376703, + "p95": 376703, + "min": 376703, + "max": 376703, + "unit": "bytes", + "comparable": false + }, + { + "name": "changeset-parse/many_small_files_split_chunks_ms", + "source": "changeset-parse", + "samples": [0.75, 0.67, 0.71, 0.96, 0.76], + "median": 0.75, + "p75": 0.76, + "p95": 0.96, + "min": 0.67, + "max": 0.96, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "highlight-prefetch/adjacent_ready_before_move", + "source": "highlight-prefetch", + "samples": [1, 1, 1, 1, 1], + "median": 1, + "p75": 1, + "p95": 1, + "min": 1, + "max": 1, + "unit": "boolean", + "comparable": false + }, + { + "name": "highlight-prefetch/files", + "source": "highlight-prefetch", + "samples": [4, 4, 4, 4, 4], + "median": 4, + "p75": 4, + "p95": 4, + "min": 4, + "max": 4, + "unit": "count", + "comparable": false + }, + { + "name": "highlight-prefetch/iterations", + "source": "highlight-prefetch", + "samples": [2, 2, 2, 2, 2], + "median": 2, + "p75": 2, + "p95": 2, + "min": 2, + "max": 2, + "unit": "count", + "comparable": false + }, + { + "name": "highlight-prefetch/next_file_ready_ms", + "source": "highlight-prefetch", + "samples": [8.72, 10.81, 8.25, 8.9, 11.18], + "median": 8.9, + "p75": 10.81, + "p95": 11.18, + "min": 8.25, + "max": 11.18, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "highlight-prefetch/selected_startup_ms", + "source": "highlight-prefetch", + "samples": [5.76, 6.3, 6.09, 6.43, 7.07], + "median": 6.3, + "p75": 6.43, + "p95": 7.07, + "min": 5.76, + "max": 7.07, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "interaction-latency/after_first_frame_heap_used_bytes", + "source": "interaction-latency", + "samples": [42445006, 42484066, 42485322, 42464368, 42412088], + "median": 42464368, + "p75": 42484066, + "p95": 42485322, + "min": 42412088, + "max": 42485322, + "unit": "bytes", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.2, + "minAbsoluteRegression": 8388608 + } + }, + { + "name": "interaction-latency/after_first_frame_rss_bytes", + "source": "interaction-latency", + "samples": [203534336, 202174464, 204255232, 203624448, 205557760], + "median": 203624448, + "p75": 204255232, + "p95": 205557760, + "min": 202174464, + "max": 205557760, + "unit": "bytes", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.2, + "minAbsoluteRegression": 8388608 + } + }, + { + "name": "interaction-latency/after_navigation_heap_used_bytes", + "source": "interaction-latency", + "samples": [52792449, 53938474, 53274205, 52564371, 53877372], + "median": 53274205, + "p75": 53877372, + "p95": 53938474, + "min": 52564371, + "max": 53938474, + "unit": "bytes", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.2, + "minAbsoluteRegression": 8388608 + } + }, + { + "name": "interaction-latency/after_navigation_rss_bytes", + "source": "interaction-latency", + "samples": [350408704, 345796608, 333905920, 343908352, 350892032], + "median": 345796608, + "p75": 350408704, + "p95": 350892032, + "min": 333905920, + "max": 350892032, + "unit": "bytes", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.2, + "minAbsoluteRegression": 8388608 + } + }, + { + "name": "interaction-latency/files", + "source": "interaction-latency", + "samples": [180, 180, 180, 180, 180], + "median": 180, + "p75": 180, + "p95": 180, + "min": 180, + "max": 180, + "unit": "count", + "comparable": false + }, + { + "name": "interaction-latency/first_frame_ms", + "source": "interaction-latency", + "samples": [8.8, 8.05, 8.31, 8.9, 8.45], + "median": 8.45, + "p75": 8.8, + "p95": 8.9, + "min": 8.05, + "max": 8.9, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "interaction-latency/hunk_nav_press_median_ms", + "source": "interaction-latency", + "samples": [26.94, 24.01, 23.65, 26.62, 23.75], + "median": 24.01, + "p75": 26.62, + "p95": 26.94, + "min": 23.65, + "max": 26.94, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "interaction-latency/hunk_nav_press_p95_ms", + "source": "interaction-latency", + "samples": [46.04, 42.78, 31.71, 42.74, 42.58], + "median": 42.74, + "p75": 42.78, + "p95": 46.04, + "min": 31.71, + "max": 46.04, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "interaction-latency/lines_per_file", + "source": "interaction-latency", + "samples": [120, 120, 120, 120, 120], + "median": 120, + "p75": 120, + "p95": 120, + "min": 120, + "max": 120, + "unit": "count", + "comparable": false + }, + { + "name": "interaction-latency/navigation_presses", + "source": "interaction-latency", + "samples": [6, 6, 6, 6, 6], + "median": 6, + "p75": 6, + "p95": 6, + "min": 6, + "max": 6, + "unit": "count", + "comparable": false + }, + { + "name": "interaction-latency/scroll_tick_median_ms", + "source": "interaction-latency", + "samples": [0.92, 0.91, 0.97, 0.89, 0.96], + "median": 0.92, + "p75": 0.96, + "p95": 0.97, + "min": 0.89, + "max": 0.97, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "interaction-latency/scroll_tick_p95_ms", + "source": "interaction-latency", + "samples": [5.21, 3.3, 3.11, 5.23, 4.34], + "median": 4.34, + "p75": 5.21, + "p95": 5.23, + "min": 3.11, + "max": 5.23, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "interaction-latency/scroll_ticks", + "source": "interaction-latency", + "samples": [8, 8, 8, 8, 8], + "median": 8, + "p75": 8, + "p95": 8, + "min": 8, + "max": 8, + "unit": "count", + "comparable": false + }, + { + "name": "large-stream/cold_first_frame_ms", + "source": "large-stream", + "samples": [2.35, 2.74, 2.45, 2.66, 2.84], + "median": 2.66, + "p75": 2.74, + "p95": 2.84, + "min": 2.35, + "max": 2.84, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "large-stream/files", + "source": "large-stream", + "samples": [180, 180, 180, 180, 180], + "median": 180, + "p75": 180, + "p95": 180, + "min": 180, + "max": 180, + "unit": "count", + "comparable": false + }, + { + "name": "large-stream/lines_per_file", + "source": "large-stream", + "samples": [120, 120, 120, 120, 120], + "median": 120, + "p75": 120, + "p95": 120, + "min": 120, + "max": 120, + "unit": "count", + "comparable": false + }, + { + "name": "large-stream/scroll_ticks", + "source": "large-stream", + "samples": [4, 4, 4, 4, 4], + "median": 4, + "p75": 4, + "p95": 4, + "min": 4, + "max": 4, + "unit": "count", + "comparable": false + }, + { + "name": "large-stream/warm_first_frame_ms", + "source": "large-stream", + "samples": [1.72, 1.71, 1.73, 1.88, 1.89], + "median": 1.73, + "p75": 1.88, + "p95": 1.89, + "min": 1.71, + "max": 1.89, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "large-stream/windowed_scroll_ticks_ms", + "source": "large-stream", + "samples": [88.45, 90, 92.87, 90.29, 89.02], + "median": 90, + "p75": 90.29, + "p95": 92.87, + "min": 88.45, + "max": 92.87, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "non-ascii-stream/files", + "source": "non-ascii-stream", + "samples": [120, 120, 120, 120, 120], + "median": 120, + "p75": 120, + "p95": 120, + "min": 120, + "max": 120, + "unit": "count", + "comparable": false + }, + { + "name": "non-ascii-stream/lines_per_file", + "source": "non-ascii-stream", + "samples": [120, 120, 120, 120, 120], + "median": 120, + "p75": 120, + "p95": 120, + "min": 120, + "max": 120, + "unit": "count", + "comparable": false + }, + { + "name": "non-ascii-stream/non_ascii_cold_first_frame_ms", + "source": "non-ascii-stream", + "samples": [8.49, 8.11, 7.64, 8.17, 8.02], + "median": 8.11, + "p75": 8.17, + "p95": 8.49, + "min": 7.64, + "max": 8.49, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "non-ascii-stream/non_ascii_scroll_tick_median_ms", + "source": "non-ascii-stream", + "samples": [1.13, 1.19, 1.12, 1.11, 1.16], + "median": 1.13, + "p75": 1.16, + "p95": 1.19, + "min": 1.11, + "max": 1.19, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "non-ascii-stream/non_ascii_scroll_tick_p95_ms", + "source": "non-ascii-stream", + "samples": [5.46, 5.51, 5.15, 4.89, 5.17], + "median": 5.17, + "p75": 5.46, + "p95": 5.51, + "min": 4.89, + "max": 5.51, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "non-ascii-stream/scroll_ticks", + "source": "non-ascii-stream", + "samples": [8, 8, 8, 8, 8], + "median": 8, + "p75": 8, + "p95": 8, + "min": 8, + "max": 8, + "unit": "count", + "comparable": false + }, + { + "name": "render-layout/balanced_stream_files", + "source": "render-layout", + "samples": [180, 180, 180, 180, 180], + "median": 180, + "p75": 180, + "p95": 180, + "min": 180, + "max": 180, + "unit": "count", + "comparable": false + }, + { + "name": "render-layout/balanced_stream_geometry_ms", + "source": "render-layout", + "samples": [16.32, 13.56, 15.31, 14.33, 13.79], + "median": 14.33, + "p75": 15.31, + "p95": 16.32, + "min": 13.56, + "max": 16.32, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "render-layout/balanced_stream_planned_rows", + "source": "render-layout", + "samples": [10260, 10260, 10260, 10260, 10260], + "median": 10260, + "p75": 10260, + "p95": 10260, + "min": 10260, + "max": 10260, + "unit": "count", + "comparable": false + }, + { + "name": "render-layout/balanced_stream_review_plan_ms", + "source": "render-layout", + "samples": [8.41, 10.7, 10.02, 8.49, 8.81], + "median": 8.81, + "p75": 10.02, + "p95": 10.7, + "min": 8.41, + "max": 10.7, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "render-layout/balanced_stream_split_rows", + "source": "render-layout", + "samples": [10260, 10260, 10260, 10260, 10260], + "median": 10260, + "p75": 10260, + "p95": 10260, + "min": 10260, + "max": 10260, + "unit": "count", + "comparable": false + }, + { + "name": "render-layout/balanced_stream_split_rows_ms", + "source": "render-layout", + "samples": [3.59, 4.87, 3.82, 3.64, 4.28], + "median": 3.82, + "p75": 4.28, + "p95": 4.87, + "min": 3.59, + "max": 4.87, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "render-layout/balanced_stream_unified_rows", + "source": "render-layout", + "samples": [18900, 18900, 18900, 18900, 18900], + "median": 18900, + "p75": 18900, + "p95": 18900, + "min": 18900, + "max": 18900, + "unit": "count", + "comparable": false + }, + { + "name": "render-layout/balanced_stream_unified_rows_ms", + "source": "render-layout", + "samples": [2.48, 2.65, 2.92, 2.4, 2.7], + "median": 2.65, + "p75": 2.7, + "p95": 2.92, + "min": 2.4, + "max": 2.92, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "render-layout/large_single_file_files", + "source": "render-layout", + "samples": [1, 1, 1, 1, 1], + "median": 1, + "p75": 1, + "p95": 1, + "min": 1, + "max": 1, + "unit": "count", + "comparable": false + }, + { + "name": "render-layout/large_single_file_geometry_ms", + "source": "render-layout", + "samples": [20.24, 20.15, 22.25, 19.71, 22.15], + "median": 20.24, + "p75": 22.15, + "p95": 22.25, + "min": 19.71, + "max": 22.25, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "render-layout/large_single_file_planned_rows", + "source": "render-layout", + "samples": [16010, 16010, 16010, 16010, 16010], + "median": 16010, + "p75": 16010, + "p95": 16010, + "min": 16010, + "max": 16010, + "unit": "count", + "comparable": false + }, + { + "name": "render-layout/large_single_file_review_plan_ms", + "source": "render-layout", + "samples": [13.01, 14.35, 15.05, 14.04, 13.02], + "median": 14.04, + "p75": 14.35, + "p95": 15.05, + "min": 13.01, + "max": 15.05, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "render-layout/large_single_file_split_rows", + "source": "render-layout", + "samples": [16010, 16010, 16010, 16010, 16010], + "median": 16010, + "p75": 16010, + "p95": 16010, + "min": 16010, + "max": 16010, + "unit": "count", + "comparable": false + }, + { + "name": "render-layout/large_single_file_split_rows_ms", + "source": "render-layout", + "samples": [6.59, 3.91, 3.45, 7.16, 3.39], + "median": 3.91, + "p75": 6.59, + "p95": 7.16, + "min": 3.39, + "max": 7.16, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "render-layout/large_single_file_unified_rows", + "source": "render-layout", + "samples": [32011, 32011, 32011, 32011, 32011], + "median": 32011, + "p75": 32011, + "p95": 32011, + "min": 32011, + "max": 32011, + "unit": "count", + "comparable": false + }, + { + "name": "render-layout/large_single_file_unified_rows_ms", + "source": "render-layout", + "samples": [6.28, 6.82, 6.2, 6.46, 6.38], + "median": 6.38, + "p75": 6.46, + "p95": 6.82, + "min": 6.2, + "max": 6.82, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "render-layout/many_small_files_files", + "source": "render-layout", + "samples": [360, 360, 360, 360, 360], + "median": 360, + "p75": 360, + "p95": 360, + "min": 360, + "max": 360, + "unit": "count", + "comparable": false + }, + { + "name": "render-layout/many_small_files_geometry_ms", + "source": "render-layout", + "samples": [13.75, 15.02, 12.85, 13.96, 13.55], + "median": 13.75, + "p75": 13.96, + "p95": 15.02, + "min": 12.85, + "max": 15.02, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "render-layout/many_small_files_planned_rows", + "source": "render-layout", + "samples": [6120, 6120, 6120, 6120, 6120], + "median": 6120, + "p75": 6120, + "p95": 6120, + "min": 6120, + "max": 6120, + "unit": "count", + "comparable": false + }, + { + "name": "render-layout/many_small_files_review_plan_ms", + "source": "render-layout", + "samples": [7.3, 7.79, 5.86, 6.23, 6.23], + "median": 6.23, + "p75": 7.3, + "p95": 7.79, + "min": 5.86, + "max": 7.79, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "render-layout/many_small_files_split_rows", + "source": "render-layout", + "samples": [6120, 6120, 6120, 6120, 6120], + "median": 6120, + "p75": 6120, + "p95": 6120, + "min": 6120, + "max": 6120, + "unit": "count", + "comparable": false + }, + { + "name": "render-layout/many_small_files_split_rows_ms", + "source": "render-layout", + "samples": [3.98, 4.1, 4.24, 3.92, 3.74], + "median": 3.98, + "p75": 4.1, + "p95": 4.24, + "min": 3.74, + "max": 4.24, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "render-layout/many_small_files_unified_rows", + "source": "render-layout", + "samples": [10440, 10440, 10440, 10440, 10440], + "median": 10440, + "p75": 10440, + "p95": 10440, + "min": 10440, + "max": 10440, + "unit": "count", + "comparable": false + }, + { + "name": "render-layout/many_small_files_unified_rows_ms", + "source": "render-layout", + "samples": [3.81, 3.94, 3.85, 3.83, 3.5], + "median": 3.83, + "p75": 3.85, + "p95": 3.94, + "min": 3.5, + "max": 3.94, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "startup-first-frame/files", + "source": "startup-first-frame", + "samples": [8, 8, 8, 8, 8], + "median": 8, + "p75": 8, + "p95": 8, + "min": 8, + "max": 8, + "unit": "count", + "comparable": false + }, + { + "name": "startup-first-frame/startup_first_color_ms", + "source": "startup-first-frame", + "samples": [306.59, 300.65, 311.23, 308.35, 307.25], + "median": 307.25, + "p75": 308.35, + "p95": 311.23, + "min": 300.65, + "max": 311.23, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "startup-first-frame/startup_first_frame_min_ms", + "source": "startup-first-frame", + "samples": [245.07, 237.23, 244.96, 246.46, 244.17], + "median": 244.96, + "p75": 245.07, + "p95": 246.46, + "min": 237.23, + "max": 246.46, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "startup-first-frame/startup_first_frame_ms", + "source": "startup-first-frame", + "samples": [248.77, 245.76, 249.05, 249.38, 251.18], + "median": 249.05, + "p75": 249.38, + "p95": 251.18, + "min": 245.76, + "max": 251.18, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "startup-first-frame/startup_launches", + "source": "startup-first-frame", + "samples": [5, 5, 5, 5, 5], + "median": 5, + "p75": 5, + "p95": 5, + "min": 5, + "max": 5, + "unit": "count", + "comparable": false + }, + { + "name": "startup-first-frame/startup_post_paint_key_max_ms", + "source": "startup-first-frame", + "samples": [37.17, 34.83, 36.77, 35.27, 34.83], + "median": 35.27, + "p75": 36.77, + "p95": 37.17, + "min": 34.83, + "max": 37.17, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "startup-first-frame/startup_post_paint_keys", + "source": "startup-first-frame", + "samples": [8, 8, 8, 8, 8], + "median": 8, + "p75": 8, + "p95": 8, + "min": 8, + "max": 8, + "unit": "count", + "comparable": false + }, + { + "name": "terminal-width/cjk_scalar_text_width_ms", + "source": "terminal-width", + "samples": [14.07, 11.07, 10.7, 11.25, 12.4], + "median": 11.25, + "p75": 12.4, + "p95": 14.07, + "min": 10.7, + "max": 14.07, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "terminal-width/cjk_scalar_width_checksum", + "source": "terminal-width", + "samples": [664000, 664000, 664000, 664000, 664000], + "median": 664000, + "p75": 664000, + "p95": 664000, + "min": 664000, + "max": 664000, + "unit": "count", + "comparable": false + }, + { + "name": "terminal-width/cjk_scalar_width_measurements", + "source": "terminal-width", + "samples": [12000, 12000, 12000, 12000, 12000], + "median": 12000, + "p75": 12000, + "p95": 12000, + "min": 12000, + "max": 12000, + "unit": "count", + "comparable": false + }, + { + "name": "terminal-width/competitor_string_width_cjk_scalar_ms", + "source": "terminal-width", + "samples": [71.03, 73.15, 66.3, 75.19, 71.02], + "median": 71.03, + "p75": 73.15, + "p95": 75.19, + "min": 66.3, + "max": 75.19, + "unit": "ms", + "comparable": false + }, + { + "name": "terminal-width/competitor_string_width_complex_cluster_ms", + "source": "terminal-width", + "samples": [15.34, 18.89, 15.03, 18.24, 14.78], + "median": 15.34, + "p75": 18.24, + "p95": 18.89, + "min": 14.78, + "max": 18.89, + "unit": "ms", + "comparable": false + }, + { + "name": "terminal-width/competitor_string_width_emoji_scalar_ms", + "source": "terminal-width", + "samples": [13.42, 12.33, 11.81, 12.08, 12.48], + "median": 12.33, + "p75": 12.48, + "p95": 13.42, + "min": 11.81, + "max": 13.42, + "unit": "ms", + "comparable": false + }, + { + "name": "terminal-width/complex_cluster_text_width_ms", + "source": "terminal-width", + "samples": [9.54, 12.48, 9.48, 10.39, 9.5], + "median": 9.54, + "p75": 10.39, + "p95": 12.48, + "min": 9.48, + "max": 12.48, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "terminal-width/complex_cluster_width_checksum", + "source": "terminal-width", + "samples": [196000, 196000, 196000, 196000, 196000], + "median": 196000, + "p75": 196000, + "p95": 196000, + "min": 196000, + "max": 196000, + "unit": "count", + "comparable": false + }, + { + "name": "terminal-width/complex_cluster_width_measurements", + "source": "terminal-width", + "samples": [4000, 4000, 4000, 4000, 4000], + "median": 4000, + "p75": 4000, + "p95": 4000, + "min": 4000, + "max": 4000, + "unit": "count", + "comparable": false + }, + { + "name": "terminal-width/emoji_scalar_text_width_ms", + "source": "terminal-width", + "samples": [5.24, 5.11, 4.93, 5.01, 4.87], + "median": 5.01, + "p75": 5.11, + "p95": 5.24, + "min": 4.87, + "max": 5.24, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "terminal-width/emoji_scalar_width_checksum", + "source": "terminal-width", + "samples": [170000, 170000, 170000, 170000, 170000], + "median": 170000, + "p75": 170000, + "p95": 170000, + "min": 170000, + "max": 170000, + "unit": "count", + "comparable": false + }, + { + "name": "terminal-width/emoji_scalar_width_measurements", + "source": "terminal-width", + "samples": [4000, 4000, 4000, 4000, 4000], + "median": 4000, + "p75": 4000, + "p95": 4000, + "min": 4000, + "max": 4000, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/large_worktree_additions", + "source": "working-tree-load", + "samples": [8640, 8640, 8640, 8640, 8640], + "median": 8640, + "p75": 8640, + "p95": 8640, + "min": 8640, + "max": 8640, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/large_worktree_deletions", + "source": "working-tree-load", + "samples": [8640, 8640, 8640, 8640, 8640], + "median": 8640, + "p75": 8640, + "p95": 8640, + "min": 8640, + "max": 8640, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/large_worktree_files", + "source": "working-tree-load", + "samples": [240, 240, 240, 240, 240], + "median": 240, + "p75": 240, + "p95": 240, + "min": 240, + "max": 240, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/large_worktree_load_ms", + "source": "working-tree-load", + "samples": [50.37, 50.38, 51.44, 49.15, 49.68], + "median": 50.37, + "p75": 50.38, + "p95": 51.44, + "min": 49.15, + "max": 51.44, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "working-tree-load/medium_worktree_additions", + "source": "working-tree-load", + "samples": [2880, 2880, 2880, 2880, 2880], + "median": 2880, + "p75": 2880, + "p95": 2880, + "min": 2880, + "max": 2880, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/medium_worktree_deletions", + "source": "working-tree-load", + "samples": [2880, 2880, 2880, 2880, 2880], + "median": 2880, + "p75": 2880, + "p95": 2880, + "min": 2880, + "max": 2880, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/medium_worktree_files", + "source": "working-tree-load", + "samples": [96, 96, 96, 96, 96], + "median": 96, + "p75": 96, + "p95": 96, + "min": 96, + "max": 96, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/medium_worktree_load_ms", + "source": "working-tree-load", + "samples": [21.89, 22.99, 23.49, 22.17, 22.26], + "median": 22.26, + "p75": 22.99, + "p95": 23.49, + "min": 21.89, + "max": 23.49, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "working-tree-load/small_worktree_additions", + "source": "working-tree-load", + "samples": [208, 208, 208, 208, 208], + "median": 208, + "p75": 208, + "p95": 208, + "min": 208, + "max": 208, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/small_worktree_deletions", + "source": "working-tree-load", + "samples": [208, 208, 208, 208, 208], + "median": 208, + "p75": 208, + "p95": 208, + "min": 208, + "max": 208, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/small_worktree_files", + "source": "working-tree-load", + "samples": [16, 16, 16, 16, 16], + "median": 16, + "p75": 16, + "p95": 16, + "min": 16, + "max": 16, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/small_worktree_load_ms", + "source": "working-tree-load", + "samples": [13.95, 15.15, 13.99, 13.2, 14.53], + "median": 13.99, + "p75": 14.53, + "p95": 15.15, + "min": 13.2, + "max": 15.15, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "working-tree-load/untracked_few_large_additions", + "source": "working-tree-load", + "samples": [30104, 30104, 30104, 30104, 30104], + "median": 30104, + "p75": 30104, + "p95": 30104, + "min": 30104, + "max": 30104, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/untracked_few_large_deletions", + "source": "working-tree-load", + "samples": [104, 104, 104, 104, 104], + "median": 104, + "p75": 104, + "p95": 104, + "min": 104, + "max": 104, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/untracked_few_large_files", + "source": "working-tree-load", + "samples": [14, 14, 14, 14, 14], + "median": 14, + "p75": 14, + "p95": 14, + "min": 14, + "max": 14, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/untracked_few_large_load_ms", + "source": "working-tree-load", + "samples": [18.18, 17.01, 17.29, 16.68, 18.53], + "median": 17.29, + "p75": 18.18, + "p95": 18.53, + "min": 16.68, + "max": 18.53, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "working-tree-load/untracked_many_small_additions", + "source": "working-tree-load", + "samples": [4528, 4528, 4528, 4528, 4528], + "median": 4528, + "p75": 4528, + "p95": 4528, + "min": 4528, + "max": 4528, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/untracked_many_small_deletions", + "source": "working-tree-load", + "samples": [208, 208, 208, 208, 208], + "median": 208, + "p75": 208, + "p95": 208, + "min": 208, + "max": 208, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/untracked_many_small_files", + "source": "working-tree-load", + "samples": [136, 136, 136, 136, 136], + "median": 136, + "p75": 136, + "p95": 136, + "min": 136, + "max": 136, + "unit": "count", + "comparable": false + }, + { + "name": "working-tree-load/untracked_many_small_load_ms", + "source": "working-tree-load", + "samples": [17.81, 18.53, 19.36, 19.38, 18.52], + "median": 18.53, + "p75": 19.36, + "p95": 19.38, + "min": 17.81, + "max": 19.38, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "wrapped-cjk/long_line_characters", + "source": "wrapped-cjk", + "samples": [8736, 8736, 8736, 8736, 8736], + "median": 8736, + "p75": 8736, + "p95": 8736, + "min": 8736, + "max": 8736, + "unit": "count", + "comparable": false + }, + { + "name": "wrapped-cjk/physical_lines", + "source": "wrapped-cjk", + "samples": [518, 518, 518, 518, 518], + "median": 518, + "p75": 518, + "p95": 518, + "min": 518, + "max": 518, + "unit": "count", + "comparable": false + }, + { + "name": "wrapped-cjk/wheel_burst_events", + "source": "wrapped-cjk", + "samples": [12, 12, 12, 12, 12], + "median": 12, + "p75": 12, + "p95": 12, + "min": 12, + "max": 12, + "unit": "count", + "comparable": false + }, + { + "name": "wrapped-cjk/wrapped_cjk_518_mount_first_frame_ms", + "source": "wrapped-cjk", + "samples": [79.9, 82.61, 80.25, 84.23, 95.58], + "median": 82.61, + "p75": 84.23, + "p95": 95.58, + "min": 79.9, + "max": 95.58, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "wrapped-cjk/wrapped_cjk_long_line_mount_first_frame_ms", + "source": "wrapped-cjk", + "samples": [20.74, 21.2, 20.77, 21.45, 21.18], + "median": 21.18, + "p75": 21.2, + "p95": 21.45, + "min": 20.74, + "max": 21.45, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "wrapped-cjk/wrapped_cjk_wheel_burst_immediate_content_rows", + "source": "wrapped-cjk", + "samples": [55, 55, 55, 55, 55], + "median": 55, + "p75": 55, + "p95": 55, + "min": 55, + "max": 55, + "unit": "count", + "comparable": false + }, + { + "name": "wrapped-cjk/wrapped_cjk_wheel_burst_immediate_ms", + "source": "wrapped-cjk", + "samples": [3.79, 4.04, 4.61, 4.16, 3.74], + "median": 4.04, + "p75": 4.16, + "p95": 4.61, + "min": 3.74, + "max": 4.61, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + }, + { + "name": "wrapped-cjk/wrapped_cjk_wheel_burst_initial_content_rows", + "source": "wrapped-cjk", + "samples": [54, 54, 54, 54, 54], + "median": 54, + "p75": 54, + "p95": 54, + "min": 54, + "max": 54, + "unit": "count", + "comparable": false + }, + { + "name": "wrapped-cjk/wrapped_cjk_wheel_burst_settled_content_rows", + "source": "wrapped-cjk", + "samples": [55, 55, 55, 55, 55], + "median": 55, + "p75": 55, + "p95": 55, + "min": 55, + "max": 55, + "unit": "count", + "comparable": false + }, + { + "name": "wrapped-cjk/wrapped_cjk_wheel_burst_settled_ms", + "source": "wrapped-cjk", + "samples": [26.46, 27.25, 29.71, 30.06, 28.07], + "median": 28.07, + "p75": 29.71, + "p95": 30.06, + "min": 26.46, + "max": 30.06, + "unit": "ms", + "comparable": true, + "threshold": { + "maxRegressionRatio": 1.15, + "minAbsoluteRegression": 5 + } + } + ] +} diff --git a/bun.lock b/bun.lock index cec1a9211..a9b397601 100644 --- a/bun.lock +++ b/bun.lock @@ -41,7 +41,7 @@ }, "packages/hunk": { "name": "hunkdiff", - "version": "0.24.0-beta.1", + "version": "0.24.0", "bin": { "hunk": "./bin/hunk.cjs", "hunkdiff": "./bin/hunk.cjs", diff --git a/packages/hunk/package.json b/packages/hunk/package.json index 9639bfed0..b56554bfc 100644 --- a/packages/hunk/package.json +++ b/packages/hunk/package.json @@ -1,6 +1,6 @@ { "name": "hunkdiff", - "version": "0.24.0-beta.1", + "version": "0.24.0", "description": "Desktop-inspired terminal diff viewer for understanding agent-authored changesets.", "keywords": [ "ai", diff --git a/packages/hunk/src/ui/hooks/useTerminalReview.test.tsx b/packages/hunk/src/ui/hooks/useTerminalReview.test.tsx index a1f60b990..70cc3dd0e 100644 --- a/packages/hunk/src/ui/hooks/useTerminalReview.test.tsx +++ b/packages/hunk/src/ui/hooks/useTerminalReview.test.tsx @@ -515,6 +515,24 @@ describe("useTerminalReview", () => { }); test("releases files from earlier reloads once later reloads replace them", async () => { + // Isolate GC reachability from the shared runner's accumulated JIT and renderer state. + if (process.env.HUNK_TEST_RELOAD_RETENTION_CHILD !== "1") { + const child = Bun.spawnSync({ + cmd: [ + process.execPath, + "test", + import.meta.path, + "--test-name-pattern", + "releases files from earlier reloads once later reloads replace them", + ], + env: { ...process.env, HUNK_TEST_RELOAD_RETENTION_CHILD: "1" }, + stdout: "pipe", + stderr: "pipe", + }); + expect(child.exitCode, new TextDecoder().decode(child.stderr)).toBe(0); + return; + } + const { controllerRef, setFilesRef, setup } = await renderTerminalReview([createTwoHunkFile()]); const reloadedFiles: WeakRef[] = []; diff --git a/website/public/changelog/og/0.24.png b/website/public/changelog/og/0.24.png index f7afb0691..431eb4dfe 100644 Binary files a/website/public/changelog/og/0.24.png and b/website/public/changelog/og/0.24.png differ diff --git a/website/releases/cards.json b/website/releases/cards.json index 3fbc052e3..b3f03e062 100644 --- a/website/releases/cards.json +++ b/website/releases/cards.json @@ -11,9 +11,9 @@ "slug": "0.24", "title": "Hunk 0.24", "tagline": "Hunk 0.24 adds complete-file and directory browsing, a live workspace status view, npm-installed extensions, shell completions, and…", - "meta": "Prerelease · October 13, 2026 – October 15, 2026 · 2 releases · 57 changes", + "meta": "Prerelease · October 13, 2026 – October 15, 2026 · 3 releases · 119 changes", "chips": ["0.24.0-beta.1", "0.24.0-beta.0"], - "alt": "Hunk 0.24 release notes — Prerelease · October 13, 2026 – October 15, 2026 · 2 releases · 57 changes" + "alt": "Hunk 0.24 release notes — Prerelease · October 13, 2026 – October 15, 2026 · 3 releases · 119 changes" }, { "slug": "0.23", diff --git a/website/src/content/docs/changelog/0.24.md b/website/src/content/docs/changelog/0.24.md index b145de1e6..a662d42c2 100644 --- a/website/src/content/docs/changelog/0.24.md +++ b/website/src/content/docs/changelog/0.24.md @@ -11,7 +11,7 @@ head: - tag: meta attrs: property: og:image:alt - content: "Hunk 0.24 release notes — Prerelease · October 13, 2026 – October 15, 2026 · 2 releases · 57 changes" + content: "Hunk 0.24 release notes — Prerelease · October 13, 2026 – October 15, 2026 · 3 releases · 119 changes" - tag: meta attrs: name: twitter:image @@ -20,7 +20,7 @@ head: -Prerelease · October 13, 2026 – October 15, 2026 · 2 releases +Prerelease · October 13, 2026 – October 15, 2026 · 3 releases Hunk 0.24 adds complete-file and directory browsing, a live workspace status view, npm-installed extensions, shell completions, and pane-aware automatic diff layout, while moving syntax highlighting off the review's main thread by default. @@ -34,6 +34,80 @@ Hunk 0.24 adds complete-file and directory browsing, a live workspace status vie ## Releases in this series + + +### 0.24.0 + +Unreleased + +#### Minor Changes + +- Add an `auto_split_min_width` config setting with a default of 160 available diff columns, accounting for side panes and outer padding so auto layout switches between unified and split as panes open, close, or resize. ([#1170](https://github.com/modem-dev/hunk/pull/1170)) +- Reveal left and right extension panes independently and add `ctx.panes.isVisible()` so guide toggles leave the files pane's state untouched. ([#1171](https://github.com/modem-dev/hunk/pull/1171)) +- Add `hunk open` to view complete syntax-highlighted files and browse directories with lazy loading, live refresh, and keyboard/mouse navigation. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- Add `hunk skill show [name]` and publish pointer skills installable with `npx skills add modem-dev/hunk -g --skill hunk-review` or `--skill hunk-extensions`, delegating agent installation to the skills CLI while loading version-matched instructions from the installed Hunk binary. ([#1167](https://github.com/modem-dev/hunk/pull/1167)) +- Support scoped npm packages, versions, ranges, and tags in `hunk extension install` and the shared list/update/remove workflow while preserving Git installs and blocking npm lifecycle scripts. ([#1162](https://github.com/modem-dev/hunk/pull/1162)) +- Add a `scroll_off` setting (and `--scroll-off ` flag) that defaults to keeping five rows of context around the current line while stepping through a diff, like Vim's `scrolloff`, with `scroll_off = 0` or `--scroll-off 0` restoring edge-only scrolling. ([#1109](https://github.com/modem-dev/hunk/pull/1109)) +- Make the note composer save shortcut remappable via `hunk.review.saveNote` (default `ctrl+s`). ([#962](https://github.com/modem-dev/hunk/pull/962)) +- Add `hunk completion bash` and `hunk completion zsh` to print shell completion scripts for commands, flags, and enumerated flag values. ([#1157](https://github.com/modem-dev/hunk/pull/1157)) +- Add a live read-only workspace status view with sibling inspection, shared-theme navigation into Log and full diff reviews, indented tracked/untracked groups with readable theme-colored staging facts and independent ten-file expansion, clearly separated sibling worktrees, and static or versioned JSON output. ([#1067](https://github.com/modem-dev/hunk/pull/1067)) +- Add extension-owned, generation-scoped presentation filters for selecting runtime files and hunks without changing canonical review state. ([#1118](https://github.com/modem-dev/hunk/pull/1118)) +- Syntax highlighting now runs in the worker by default, and the worker starts compiling the review's grammars during startup, so the first key after the review appears is no longer blocked by highlighting. `--fast` is accepted as a no-op and will be removed in a later release; Windows compiled binaries and custom themes with `syntax_scopes` keep highlighting inline. ([#1105](https://github.com/modem-dev/hunk/pull/1105)) + +#### Patch Changes + +- Store document save coordination in the account's Hunk state directory without creating a `.hunk` project marker in the user home. This preserves project discovery and reload bounds for directories beneath the home, including Windows temporary files. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- `{`/`}` and `hunk session navigate --next-comment`/`--prev-comment` no longer skip notes drawn outside the diff’s changed lines, such as after a reload moves the hunks. ([#1147](https://github.com/modem-dev/hunk/pull/1147)) +- Respect option arguments and the `--` pathspec separator in Bash and Zsh completions, and offer help and supported leading CLI flags. ([#1157](https://github.com/modem-dev/hunk/pull/1157)) +- Restore the original comment target when wheel events return the viewport in a single burst. ([#1164](https://github.com/modem-dev/hunk/pull/1164)) +- Stop re-running a failed large-diff highlight on every scroll, pick up a later successful retry without remounting the file, and charge worker highlight results to the cache budget by the payload they actually retain. ([#785](https://github.com/modem-dev/hunk/pull/785)) +- Render Git combined conflict diffs from `git diff` during paused merges and rebases. ([#1102](https://github.com/modem-dev/hunk/pull/1102)) +- Resolve releases from `hunk.dev/api/release/latest` so macOS no longer blocks pasting the curl install command as malware. ([#1140](https://github.com/modem-dev/hunk/pull/1140)) +- Capture the document editor's file and visible line when editing is requested, so later scrolling or selection during copy preparation cannot retarget the launch. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- Harden document browsing and editor saves against path replacement, reject incomplete Git ignore results, and fix Windows path checks. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- Allow document menu shortcuts to refresh, edit, and quit with configured keybindings while keeping help and theme dialogs isolated. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- Show an empty-review message instead of claiming an active filter hid files when there are no changes to review. ([#1182](https://github.com/modem-dev/hunk/pull/1182)) +- Show the directory only once in same-directory rename labels so both filenames fit more easily in review headers. ([#1156](https://github.com/modem-dev/hunk/pull/1156)) +- Folder extensions resolve installed packages in compiled binaries with the correct export conditions while preserving documentation strings, unrelated method calls, and locally bound `require` functions. ([#1163](https://github.com/modem-dev/hunk/pull/1163)) +- Coordinate document saves across Hunk windows in the same OS account to prevent overlapping writeback and preserve losing editors' recovery copies. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- Dismiss document-browser menus when clicking the document or tree so subsequent keys follow the newly focused content. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- The bundled `hunk-review` skill now tells agents that agent notes start hidden, `hunk gh --help` lists its options and token variables, and the hunk.dev docs add `hunk log` and `hunk gh` to the CLI reference and correct stale install, platform, pager, watch, Jujutsu, and extension details. ([#1186](https://github.com/modem-dev/hunk/pull/1186)) +- Preserve text typed immediately after opening a note editor, including immediate saves, without triggering global shortcuts. ([#1125](https://github.com/modem-dev/hunk/pull/1125)) +- Refresh the `terminal` theme about three times faster after a terminal color-scheme switch, pick up switches from terminals that answer slowly, and settle on the final palette instead of a mix of old and new colors after rapid switches. ([#1130](https://github.com/modem-dev/hunk/pull/1130)) +- Fill initial document and tree viewports without requiring scrolling when native layout temporarily reports a negative scroll position. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- Measure text containing U+113D1 (and other grapheme Prepend characters) with the correct terminal width instead of counting the prepend as its own cell, so slicing and wrapping agree with `string-width`. ([#1153](https://github.com/modem-dev/hunk/pull/1153)) +- Keep workspace-status reviews tied to launch configuration across reloads, serialize returns from history, and keep expanded status navigation responsive. ([#1067](https://github.com/modem-dev/hunk/pull/1067)) +- Preserve the visible source line in complete documents when wrapping, resizing, toggling line numbers, or refreshing shortened files. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- Reduce memory use in large reviews by keeping copy-selection row content lazy during keyboard navigation. ([#1202](https://github.com/modem-dev/hunk/pull/1202)) +- Keep the file filter focused in pager mode when files reappear after a filter matches no files. ([#1161](https://github.com/modem-dev/hunk/pull/1161)) +- Allow bounded cold PowerShell startup time when locating the Windows account's document save namespace. Account lookup failures still refuse writeback and preserve recovery copies. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- Fix plain-text Git pager output being truncated or failing with EPIPE when stdout is piped. ([#1112](https://github.com/modem-dev/hunk/pull/1112)) +- Name the repository in every Jujutsu source-read diagnostic. A missing `jj` binary and an unreadable `jj` stream now log the repo path beside the revision and file, as a failed `jj file show` already did. ([#1146](https://github.com/modem-dev/hunk/pull/1146)) +- Stop repeatedly resubmitting rejected reviews to an unchanged healthy session daemon while preserving recovery after review replacement or daemon changes. ([#1199](https://github.com/modem-dev/hunk/pull/1199)) +- Store persistent Hunk state under the XDG state directory while preserving existing state and global extension locations. ([#920](https://github.com/modem-dev/hunk/pull/920)) +- Preserve pending filesystem refreshes when selecting a file or changing expanded directories in the document browser. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- `hunk session` commands that select a window with `--repo` or `--session-path` now say which path matched no live session, instead of failing with `protocol-validation-failed` (for example, when run from a different git worktree than the Hunk window). The session daemon produces this message, so it appears once a daemon from this release is running; an older daemon keeps answering with `protocol-validation-failed` until it restarts. ([#1149](https://github.com/modem-dev/hunk/pull/1149)) +- Reject nonempty patch input without recognizable file changes instead of silently opening an empty review. ([#1183](https://github.com/modem-dev/hunk/pull/1183)) +- Extension VCS operation registration now requires `watchSignature` and `watchPlan` to be absent or callable. A non-callable hook is dropped along with its operation at registration instead of throwing a `TypeError` the first time watch planning invokes it. ([#1080](https://github.com/modem-dev/hunk/pull/1080)) +- Fix a memory leak in `--watch` and other live reloads where every reload kept the previous review's files and render state alive, so long-running sessions grew without bound. ([#1201](https://github.com/modem-dev/hunk/pull/1201)) +- `hunk session reload` onto a diff that leaves out a file holding a live note keeps the session connected, and the note returns when a later reload brings its file back. ([#1131](https://github.com/modem-dev/hunk/pull/1131)) +- Restore `github-dark-default` as the default theme. The `terminal` theme remains available explicitly through config, `--theme terminal`, or the theme picker. ([#1195](https://github.com/modem-dev/hunk/pull/1195)) +- Preserve every unique document editor failure notice and print its full recovery location after terminal teardown, even after later successful edits. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- Binary files can be selected again with next/previous file navigation (`.` and `,`) and by clicking them in the files pane. ([#1178](https://github.com/modem-dev/hunk/pull/1178)) +- Prevent overlapping document edits and lost recovery notices on quit, preserve wrapped text beside scrollbars, release vanished directory expansions, and restore keyboard scrolling in controls help. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- Terminal editor handoffs release Hunk's stdin reader before launching the editor so Windows keyboard input does not wait for an extra Enter press. ([#1165](https://github.com/modem-dev/hunk/pull/1165)) +- Handle Bash word-break fragments, nested session reload commands, and `--fast` shorthand in shell completion, and use Zsh's native argument completion for options and values. ([#1157](https://github.com/modem-dev/hunk/pull/1157)) +- Keep document browser watch subscriptions alive across unchanged refreshes so files created during directory metadata queries appear automatically. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- Keep document browsing updates live after watched directories are replaced or deleted and recreated at the same path. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- Report history cursor cleanup failures when quitting during or after a refresh. ([#1067](https://github.com/modem-dev/hunk/pull/1067)) +- Keep the selected file visible in the sidebar during held next-file or previous-file navigation and terminal resizing without snapping ordinary manual scrolling back to the selection. ([#1085](https://github.com/modem-dev/hunk/pull/1085)) +- Keep Hunk sessions alive while window is suspended. ([#1134](https://github.com/modem-dev/hunk/pull/1134)) +- Keep document focus, help, themes, and menus consistent when keyboard or mouse actions arrive before the next render. ([#1148](https://github.com/modem-dev/hunk/pull/1148)) +- Reveal the full note composer when opening a draft near the bottom of the diff pane, scrolling only when needed to keep the input and Save/Cancel controls visible. ([#1160](https://github.com/modem-dev/hunk/pull/1160)) +- Reduce diff geometry allocation and retention when resizing nonwrapped reviews without inline notes. ([#1200](https://github.com/modem-dev/hunk/pull/1200)) +- Link the matching GitHub release notes after `hunk update` installs a version, reports one as already current, or checks for a newer one. ([#1166](https://github.com/modem-dev/hunk/pull/1166)) +- Fix stale comment targets after scrolling or stepping the cursor. ([#1143](https://github.com/modem-dev/hunk/pull/1143)) + ### 0.24.0-beta.1 diff --git a/website/src/content/docs/changelog/index.md b/website/src/content/docs/changelog/index.md index 6a9fbec93..dd90aa63f 100644 --- a/website/src/content/docs/changelog/index.md +++ b/website/src/content/docs/changelog/index.md @@ -24,7 +24,7 @@ head: ## [Hunk 0.24](/changelog/0.24/) -Prerelease · October 13, 2026 – October 15, 2026 · 2 releases · 57 changes +Prerelease · October 13, 2026 – October 15, 2026 · 3 releases · 119 changes Hunk 0.24 adds complete-file and directory browsing, a live workspace status view, npm-installed extensions, shell completions, and pane-aware automatic diff layout, while moving syntax highlighting off the review's main thread by default.