From d480986397c271edb77eae4cb5333cadfadb4035 Mon Sep 17 00:00:00 2001 From: Ben Vinegar Date: Sun, 18 Oct 2026 23:25:53 -0400 Subject: [PATCH 1/3] chore(release): prepare stable 0.24.0 --- .changeset/account-save-state.md | 5 - .changeset/annotated-nav-owner-parity.md | 5 - .../argument-aware-shell-completions.md | 5 - .changeset/batched-wheel-return.md | 5 - .changeset/beta-one-release-preparation.md | 2 - .changeset/bold-bobcats-prove.md | 2 - .../bounded-highlight-worker-retries.md | 7 - .changeset/breezy-walls-fall.md | 2 - .changeset/bright-diffs-conflict.md | 5 - .changeset/calm-hosts-stay.md | 5 - .../captured-document-editor-targets.md | 5 - .changeset/checked-documents-stay.md | 5 - .changeset/clear-config-examples.md | 2 - .../clear-document-menu-accelerators.md | 5 - .changeset/clear-empty-reviews.md | 5 - .changeset/compact-local-renames.md | 5 - .changeset/compiled-extension-imports.md | 5 - .changeset/configurable-auto-split-width.md | 5 - .changeset/coordinated-document-saves.md | 5 - .changeset/dismissed-document-menus.md | 5 - .changeset/docs-accuracy-pass.md | 5 - .changeset/draft-note-focus-transition.md | 5 - .../extension-directory-verdict-guide.md | 2 - .changeset/fast-terminal-color-refresh.md | 5 - .changeset/filled-document-viewports.md | 5 - .changeset/fix-grapheme-prepend-113d1.md | 5 - .changeset/focused-document-workflows.md | 2 - .changeset/focused-status-ownership.md | 5 - .changeset/fresh-brand-downloads.md | 4 - .changeset/fresh-documents-scroll.md | 5 - .changeset/good-cats-say.md | 2 - .changeset/grumpy-crabs-beg.md | 2 - .changeset/independent-pane-edges.md | 5 - .changeset/isolated-suspension-test.md | 2 - .changeset/lazy-documents-open.md | 5 - .changeset/lazy-navigation-copy-rows.md | 5 - .changeset/light-agent-skills.md | 5 - .changeset/list-hunk-checkpoint.md | 2 - .../list-hunk-verdict-and-hunk-backup.md | 2 - .changeset/list-hunk-why.md | 2 - .changeset/major-candies-nail.md | 2 - .changeset/npm-extension-sources.md | 5 - .changeset/pager-filter-focus.md | 5 - .changeset/patient-windows-account-lookup.md | 5 - .changeset/pinned-startup-benchmark-theme.md | 2 - .changeset/plain-pager-epipe.md | 5 - .changeset/pre.json | 96 - .changeset/published-changelog-smoke.md | 2 - .changeset/quiet-jj-paths.md | 5 - .changeset/quiet-otters-scroll.md | 5 - .changeset/quiet-rejected-reviews.md | 5 - .changeset/quiet-states-rest.md | 5 - .changeset/quiet-status-ci.md | 2 - .changeset/quiet-watch-selection.md | 5 - .changeset/quiet-worktrees-explain.md | 5 - .changeset/readable-document-spacing.md | 2 - .changeset/recognized-patch-input.md | 5 - .../reject-malformed-vcs-watch-hooks.md | 5 - .changeset/release-benchmark-maintenance.md | 2 - .changeset/release-reloaded-review-renders.md | 5 - .changeset/reload-retired-note-count.md | 5 - .changeset/remappable-save-note.md | 5 - .changeset/restore-github-default-theme.md | 5 - .../retained-document-editor-notices.md | 5 - .changeset/select-binary-files.md | 5 - .changeset/settled-document-reviews.md | 5 - .changeset/settled-editor-input.md | 5 - .changeset/shell-completions.md | 5 - .changeset/shell-parser-aware-completions.md | 5 - .changeset/short-readme-draft.md | 2 - .changeset/spaced-document-tests.md | 2 - .changeset/stable-document-watch-demand.md | 5 - .changeset/stable-document-wrap-test.md | 2 - ...erage.md => stable-release-preparation.md} | 0 .changeset/steady-directory-watch.md | 5 - .changeset/steady-history-cleanup.md | 5 - .changeset/steady-sidebar-follow.md | 5 - .../suspended-session-stays-registered.md | 5 - .changeset/tidy-document-keyboard-bursts.md | 5 - .changeset/tidy-notes-reveal.md | 5 - .changeset/tidy-nowrap-geometry.md | 5 - .changeset/tidy-status-workspaces.md | 5 - .changeset/transient-presentation-scope.md | 5 - .changeset/update-release-notes-link.md | 5 - .changeset/warm-worker-highlighting.md | 5 - .changeset/wheel-roundtrip-comment-target.md | 5 - CHANGELOG.md | 132 ++ benchmarks/release/bench-0.24.0.json | 1828 +++++++++++++++++ bun.lock | 2 +- packages/hunk/package.json | 2 +- website/public/changelog/og/0.24.png | Bin 45470 -> 45592 bytes website/releases/cards.json | 4 +- website/src/content/docs/changelog/0.24.md | 78 +- website/src/content/docs/changelog/index.md | 2 +- 94 files changed, 2041 insertions(+), 461 deletions(-) delete mode 100644 .changeset/account-save-state.md delete mode 100644 .changeset/annotated-nav-owner-parity.md delete mode 100644 .changeset/argument-aware-shell-completions.md delete mode 100644 .changeset/batched-wheel-return.md delete mode 100644 .changeset/beta-one-release-preparation.md delete mode 100644 .changeset/bold-bobcats-prove.md delete mode 100644 .changeset/bounded-highlight-worker-retries.md delete mode 100644 .changeset/breezy-walls-fall.md delete mode 100644 .changeset/bright-diffs-conflict.md delete mode 100644 .changeset/calm-hosts-stay.md delete mode 100644 .changeset/captured-document-editor-targets.md delete mode 100644 .changeset/checked-documents-stay.md delete mode 100644 .changeset/clear-config-examples.md delete mode 100644 .changeset/clear-document-menu-accelerators.md delete mode 100644 .changeset/clear-empty-reviews.md delete mode 100644 .changeset/compact-local-renames.md delete mode 100644 .changeset/compiled-extension-imports.md delete mode 100644 .changeset/configurable-auto-split-width.md delete mode 100644 .changeset/coordinated-document-saves.md delete mode 100644 .changeset/dismissed-document-menus.md delete mode 100644 .changeset/docs-accuracy-pass.md delete mode 100644 .changeset/draft-note-focus-transition.md delete mode 100644 .changeset/extension-directory-verdict-guide.md delete mode 100644 .changeset/fast-terminal-color-refresh.md delete mode 100644 .changeset/filled-document-viewports.md delete mode 100644 .changeset/fix-grapheme-prepend-113d1.md delete mode 100644 .changeset/focused-document-workflows.md delete mode 100644 .changeset/focused-status-ownership.md delete mode 100644 .changeset/fresh-brand-downloads.md delete mode 100644 .changeset/fresh-documents-scroll.md delete mode 100644 .changeset/good-cats-say.md delete mode 100644 .changeset/grumpy-crabs-beg.md delete mode 100644 .changeset/independent-pane-edges.md delete mode 100644 .changeset/isolated-suspension-test.md delete mode 100644 .changeset/lazy-documents-open.md delete mode 100644 .changeset/lazy-navigation-copy-rows.md delete mode 100644 .changeset/light-agent-skills.md delete mode 100644 .changeset/list-hunk-checkpoint.md delete mode 100644 .changeset/list-hunk-verdict-and-hunk-backup.md delete mode 100644 .changeset/list-hunk-why.md delete mode 100644 .changeset/major-candies-nail.md delete mode 100644 .changeset/npm-extension-sources.md delete mode 100644 .changeset/pager-filter-focus.md delete mode 100644 .changeset/patient-windows-account-lookup.md delete mode 100644 .changeset/pinned-startup-benchmark-theme.md delete mode 100644 .changeset/plain-pager-epipe.md delete mode 100644 .changeset/pre.json delete mode 100644 .changeset/published-changelog-smoke.md delete mode 100644 .changeset/quiet-jj-paths.md delete mode 100644 .changeset/quiet-otters-scroll.md delete mode 100644 .changeset/quiet-rejected-reviews.md delete mode 100644 .changeset/quiet-states-rest.md delete mode 100644 .changeset/quiet-status-ci.md delete mode 100644 .changeset/quiet-watch-selection.md delete mode 100644 .changeset/quiet-worktrees-explain.md delete mode 100644 .changeset/readable-document-spacing.md delete mode 100644 .changeset/recognized-patch-input.md delete mode 100644 .changeset/reject-malformed-vcs-watch-hooks.md delete mode 100644 .changeset/release-benchmark-maintenance.md delete mode 100644 .changeset/release-reloaded-review-renders.md delete mode 100644 .changeset/reload-retired-note-count.md delete mode 100644 .changeset/remappable-save-note.md delete mode 100644 .changeset/restore-github-default-theme.md delete mode 100644 .changeset/retained-document-editor-notices.md delete mode 100644 .changeset/select-binary-files.md delete mode 100644 .changeset/settled-document-reviews.md delete mode 100644 .changeset/settled-editor-input.md delete mode 100644 .changeset/shell-completions.md delete mode 100644 .changeset/shell-parser-aware-completions.md delete mode 100644 .changeset/short-readme-draft.md delete mode 100644 .changeset/spaced-document-tests.md delete mode 100644 .changeset/stable-document-watch-demand.md delete mode 100644 .changeset/stable-document-wrap-test.md rename .changeset/{beta-ci-smoke-coverage.md => stable-release-preparation.md} (100%) delete mode 100644 .changeset/steady-directory-watch.md delete mode 100644 .changeset/steady-history-cleanup.md delete mode 100644 .changeset/steady-sidebar-follow.md delete mode 100644 .changeset/suspended-session-stays-registered.md delete mode 100644 .changeset/tidy-document-keyboard-bursts.md delete mode 100644 .changeset/tidy-notes-reveal.md delete mode 100644 .changeset/tidy-nowrap-geometry.md delete mode 100644 .changeset/tidy-status-workspaces.md delete mode 100644 .changeset/transient-presentation-scope.md delete mode 100644 .changeset/update-release-notes-link.md delete mode 100644 .changeset/warm-worker-highlighting.md delete mode 100644 .changeset/wheel-roundtrip-comment-target.md create mode 100644 benchmarks/release/bench-0.24.0.json 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/website/public/changelog/og/0.24.png b/website/public/changelog/og/0.24.png index f7afb0691de3a67f484486fc0e97b20607a9da79..431eb4dfe033e6d26e205b1239fd65140fdfc363 100644 GIT binary patch literal 45592 zcmeEuWmHw&*Dnf!k}66!(w#@TyIWei4@h@N2}ntINq09W-5t_OcX!@}&+~upxL@w4 zJI1|Z+}AH|gT2>Td#*WuG3N=AmlZ=n#6g6CfkBZF7gmIUfh&W7dFuH5DfpWoB)dp3 zFfU;wgawqHlXn-MX}vKcL^wo{hkFwt&o7|x1G*bl+1R+E(|A(EGE_2N*~m4t4;6XV zDVU8L4RwEDY^dFD>#}@#a??P_*S^bAUOCKra=Ve>lFB{$>L)UI0{G=87Wd@ug*Oo~ z5!~Oamy~dRe=lI3`g_0pd&Qsr^5x@_U|^oVc`Eq#0>(#>|M}l5BKhaf|G5Vo;uGS( zf91{p-#7d3J%fSyKO7n^A4^sifPzc(PpEraKCk`yzlrPmRcygm z_$gHneD0Svmpux6x_mdU&mGLCp%Zx-s25#wbF~LwLPN5G5ZC%4Rmk?0`O4+`D_xC$ z2Kx0Jb2V0_DuwG~WKzMH4CInEcGLSmPU-n?&UR>Cy(HlCY+LI@N;Dm9s&~#K->x+t zN%wJeb+v^Mw~rb152tVq%Mfxo`u%fzL;rclep7wH<*F?f;S8LOqZJAk;~_)y*Kglu z_mLBDI}-)NyPa)sX%*wZ{@u17#Ckd+_sdNMOUvDfd?iQAC3esG4|XgpP~K;j)7JAJ zw`~p?mQ?-DB-)fQ)4 zQ3yl|piR?zyN=E37j(hi~S1b@7k8NcoC8dAgn24<=Qiff1fmU8uzII`3XebI~ zZ*OmK!smkgv#&4YwlXrQM5WMpxV>lZf9p|RKz631|Jy2rq~aq+4hUozJ4 z?`>h!scWD4aeOXGCHQww%%b@as_d`YHBlu(I zb))L;sjM8mfjLZQhKHY^F2c#Yf9j8f3Bq^ypNCY0@xuy=As|4P2X`QvHI_0m zGTB?3o0~2t_utpK_UR}n*bw{-XD6rv0s`hw)4b@VB_;L$U7s*mUoCV&*k`6acAH<>cgay$X)`rw|d*Yzm7#Z}z9Y-I*SVi0J8| zL_$I;Z1ewmykYXs$9U@fU&V-#k>{V~@&9+3`Tx1h^tHplu=aw4$iPtg<45|BA3uJl zr+a(zKfpYUj4;yB(6F3Td5MHzQ0eKmjrL~f`y;YO`8)-Q@At+AA=aBW(t$DeNT`U1 zCvuXqIlg8F1_o9}R#pa9Rz^l@10{~d8jrC_gw6@z5-r5_;of71ea|r0<o^CzgqaAy836UIZvWuyHdEl!a9ZQ-fmfDjI5s9Wb}t+)JG z8L#IpT)3%xa$MX6A1OpP^3`@!L`1)duMr}F_pNsIleSE&0vhu{&gi6sc9J(8*xs@v@O?^-Rj`=KzHHUHt)x~yR-v2 z-5lK+-x!vLrPpm4tFdwm?)ab@5*n1ibb?mjD;kcYUav^@ScA3$Kz>nPUO#V8E9Fg1 z)sZ%!EHpSY)JWsvY_1lY#iUn;9XkK3Vy%xEEMo*2!1y2Iv2=6J^ERedR@&u) z{>GhE?O0OdwZor7MtDpJVY^&;~H#!W~QeT z&6rWE6um$8YJH5m5v+MXSQvM1k88`T;J1k6^jdW`0EQ*9n~kLlcm&lhwt9KpoTn6m zEp&3p=qZ?As(YxuEcFkmnhwa3X?@`RrZ4ymT`f;O!*~$Ks6U!Yp~5e_UPQ03jf#p& z;HTMQljq9%`Son*PB{}I+g%EuSB6mt#@=kT(X8#-_T;$9P>-y^$B$+DYqr|jT6KW1 zj1WD3%4>!$frKt&Ilqt}TFMq-b`DQ8{c8WD?6Sxsj@%Q=Cz48^a zKkVBcj{H$8DGC1mJ&W_xm|qw^r+BMM1)P5%nfY{q$asdH9*F&44Gu{pJKXN8c~ei@ zMn*8BSs0 z0&mq8-CBXRr&r)LI(n^@(xy+nORVB8l?`v8*T4U+7^WlKA;M1Pt-#>kabz2yV zS%-!u0a)z`d-;o-t5sxH1+G>fgzX=WRRIEDkT73|E~Mwaox7i`MS60=%ieO ziEM>2djiVy0A2Q}Q8I81u4%n_DJm+e(?n_VrBl!!saU-+z$t5{%1mhub@AnEJlnHv zwj7D^oZ-vsy`){%YK!UprB=enV^;il%=%nTFC%y1!0Rp0%73ji_=_pah{E~uP{G`s zy8kT!uj@O=;9-Uk-N0Z1VgND@_*3P^a6%W}d*{Rb1-FWEEL>a$-5NMZ2w(xGDB#G+ z4}rI7M6o%Og`lJ!vOb7}Nl!~E;O>6g9ZslTayYwJy$i?A&VF}&W>jD{T~eHpk+I9F zr)PWZ`e$%@+NpQU$Tn&)o_BC+Di)k#?;0W^zoJ)f->v~HyS;wCJ9C0Y$O{J#-`9-v zssh$L+Aa#a`30r(?nK!1$e1`tB zoWzLV5prpKz2YA~ntsT(H6oW27VemnK1-n1&01^158__C`@)vkQOF z(3mJyYyA`@>aa6aT~+px1JNVsRHaWwHD6zZ^esV2zb!E_@rxHPm|x4M=;-RE*voa7Xjpb&>$(q5ym_V$K&l#w%gcW$RE$?7ng6a-wMGTVsfFx*&VNK{R+3% z7sqvRfE|=T$m=;@;nF{2w-FT;WkidMgX4HTfbF`qwdHWIXmwjxuBxg^OOd`lcn=G& z&_Tncp2Fz>PEWfna{~zxmq5Ovth7vDG&LQUfM3(TgstC58Dst6%J#PH_^85At3snl)b7j*a@lk@MBqTW8FU32!%9I0I>X4;9&7Yp09MBqSt86pZvA2PQgxO$a-F{vyu76-C-1+TW@^ zJFmrqvfkBY+mdp4c-YY)oWq-+4^FjoNO*W$$}TvFU=IesPVw)&eEAvPoLzCG1Jp{+b#+FN4F_^$JdJyZ3-msFoYojyEUZ zah+(CTUuyz?Ay0vE|jLdZ&uu!wAA8b^za@|)lb%miulFkmlpxRh@7eo` zuuox)DC7@p4y_lKN_1NVpcVCY>mafo3seuHDKVT3sG7TR45`xipzg>q>783rXw{on z&!X&=YUQ;2{F=FbAJ<=g7QMP63c$>otjy*Bi?(sgil2}c|nnnD-5jYo>tV-B|Nj)2$w-MtB@i(Ov{ zCd>3-(W8(9VzO#FK=Omm)$jmBo8#>ph#HQ?l=)FWDb}GbNu;$uB$P(2fYq?)C42-= z4?bS!*jT3E)v+|&#Pj?faTck#TQVnkVep8Nr}NB+<`|f`JIBlZo5M3+0}b{^?x1+E ze1#86Nm)2(4X^XOGtUjfPk2f~N{U9n*-LjXk1Rc*3~=Xg%G8|<<{7~W>tL)3oeV;+r@aWZhkH} zkN(XXtGP3kM!frwL#E?7)ruisv6yawrtygXQ+5~ToD>uk)NNbU_4Svl z%n%o7Io&Vi;T0DfT0M?Ww{Fk~!NOG=l=GR5`l~EQKl=oLB(yzMJXbMpzdxTZ|3^^z zS*`UFhy7*QyrEPaEqh;D+G9kW6K#6itmF(Lvu1r-5p54R3i^UUcY89r((U8pQxVnd zepMjgdo8^)RiwW0=MOQL%wm(vr^>vlvctn{skoH)pA=a)#RU?gSWO*Yi+ka6qRHNlq5vYX@H~OyIPjP^ahJH6;4QwG-jL(XB_035YiAont@K3eJiW32FEqGGnuX$jfDEL<+_ z`i!v7X?XwoY=>#Yn@TB1v5K5a24H}`7=~`;GMk?yy1KeEX1jYKa!H*2ROCcNzwdo- zm|wpmCwq)ddF)hTxU<3!8G^+cY}mTm4UUmXU2~eGD|mhBmxGzD;aEez)oe9YAL4lc zZVB^gz<+PQxp;?Q8x=|jiOv7rH(6+Va5^^_xEl*P>i)bfY2+@0pOmm`xN4%QQuI1SM3}$Z-_rzTdI_cx>2_&1^=pb30wT=ay3J|BAg%%EAItc z1{yvu$-DQ$&_0gJ2l;Hf(I^Tz?M6>+M;vn&-Tz`w-n$53E7J1wsgxeW#)#sJ+=!0X zYXAXUckWdkac2L#m5N*M^(9n>mzH_cht}2g3@cB_+4WD(wtdET+ib~4G+9A5p(}6)&~3c=D!iY@%6*r13TCqc}L1kEGas)mlF+Hs8FFs5hSse){aPwvPZr!(WUy5|g6R zAD6X;2U0v2`l(9;$dRrM)DF+DMpq1MY#4p~_~BQx6IGX5@9}PhD#1 zi-7W>!oL11+(e5;DM43`+GPHC?#4qse`K`RP};`sK_%bN2-6x;6m~)tLDB-D6NLIJe!$0eoGT?4w8=&fMf8?D1^MXGc0k1(#;z&-^Z( z{Uto&uewj|9YN^dlN3`@3R5`j3JhOx^XGk|Q7e^AX5}Cw6M^=1h2jpTuq5UGJ_TAV z0nfK2K;Dc@IS@epzqhG@{~bi#xT&uE38Y$s?yu0vg0&l`gZ8#I0B`8%=s}5$Q*%z6s|I&%c$oF8hDRU@ZXeh$A_@TJe<(%e$YAluy53&) z9*~N4c6ay7n5p;JUhJn#yz6Hz1w@dVT@V0u@2TI(C_lz^L*gjMd=R_?>YALH+&d0z zxtxe|$aCBr_d9$OA8(5CgcwFn8DGuj2Lz_t&d!a;`EX=&(^TZO^=#FXc0TZ5_yYhv zIjl9_Yl!&$5^9aWWh4`O;o~l>sUOqoh zXx>>~w%rIzcHIM5*V>_Zq3#nYe7cKni}U#bA0sQPG_n*{FeF16=`^Yk(c)OPXK$~(fONDtG7|B`^jmH1g}09{$n0x518t^{o}DcQSZ@TC z9ZO{bOHRMc`rb;VBmO?lv%%wwi(J!@;bA$bq_8jekLmB>{M6;d!~%_AXABrBQh?4f zQJ|s(tpM_EtJg#73;tAYTPTgVjEvE2W)@AfmQ?X)Sa{^)^Yh50*P}$>4wTQH=uOec zr-S6mRDRrz9Yv$MDET!s6x+~nG}GVZWIZN@oP*;koNxWP-iJ29*jSLsgoPQ|UPL)n zmPAIrLiZjiD+B1<u7hYDlUmb&CaI zXkobCVThf3OQ)gS)i|8Wqc&~eCzr+(mGUFU^i_`D{r$bQPOF5htg!|rIy#GC4`c0g z=~|BPqXY-jL`*c`x^8@&v<|>ohjK(j#37K?X3Pc#U%l*81QrT-Pdze@=ezZdP6y>$ zgR`@eU5!9QEY;FZ;N*6>21JrMTZ#oGUEC4?i1xq-okrQ_YZRR7gJ1cIYXv}5jDOhp zJPkc=XQ}=Y8j8H3)KIlX`c zKpw_y)W;lQwmyIjv0nVfMf)e2!_Mxa%#WSjmVlJ|)2{F&wMx7>)_$9;o-TzX!n>#VG(Z5_gFr)IRg_YhpDQ5$&2u8wO6U0s`4F<<#>*R zKjKLB%}AM^uR(WMzc_!WEFlkfG9ErQ!(7clL<$gp`6GY6g$tXt z&6P=EHdv>f>230GXScjG*`A=HjVn-CxH|kp%KRFS!_o3^bb6!TkJod&Q`IBW%l z&2gg%mG|#$R{`_^Qk2`pexvi&*j5z9Dty=NJ96?cJhp29PHdHoRpvfM+Do_V^f!Wn z0s~|2qbXYHe|@&yD^qFnQ_wRDNB)`G{!15>?P>7Kgb1yAocc9~5?pFXAerStL-p=H z50!Z$vx_+p-c~F&hP1=i7FKUHD|4iafi}y)h4bdc3)BP_CxUSp^WH~scW=&VHK!vb z6Fe&&1BBhPI3tu_|Iq@>iKDr=@0xGWfTzVG&AQo4CYcf;qAtKrVn?S{QE?2q#^xeErw4Ebrz-K7+UQmGK_0qwXb!rO1j*f(Sd_lFv1M{g_Z3muC{lGcN86J$>QGiwAo2i}Lq>EEYS10Z z=e%hXc)r&cN23OiLJ-`OCr|dRmw4STzs$lX=$lWLh|u{-7caI%@m)6h0jU54zJ-NF zjyCT7j5tG%M6O&~k#af7W94}Q(q8CS0yf2;T!Oy7zG@{}oidp8TEAxdB>B=jZRE>p zk5{JA0FwPEfZ~{*ra1|cic)u&ZIV5uKsdnyB~!lx087V*qgen#QhmGB{n2gMyih+YH0pJXnRl`kXayM)iSLKbNlz3GjSS~eKNzoJVX^$hm zrDwI8Rj%*l^}0F^53oM$rv?%uF2r(V9X1c0LUv@tJ0Uyy68U&*b+hAfp|;E*&WFax zyv+2zIwK*4q;NTYh)-gX7dX)2DO4$@hRnnk&+&TP57?466qT9BTwDJhkk1lD5evN~ z97h(T$QI&)h4o!F-`jcv?#6%f@})5ssCx_LR)r+Z%*X4itM-S#Jq!9+vDQbzqZMmZb2}`@N0FxCuJUVajb#U-;FCaRR=VZF@*I9OSZ3?B!*2|y zSO(tW(YDdE$$U5m@ZKaEa%WweI9 z6MnM*x9Gj7dDpa8=sV*fV3FA)-NqHF=Ix@7Nh&# zOBKnt43pNh!F5v7JXo30<6?h7qh>@L<}rPz%Yfv?R)C<}XzS8-YUYU8fy)f!S2P0d z&FwX*_L1B?cq|+oU?}iID?n7Y-fOhkR)c^{=6g7J-$`OP!|AkL2X@Jv8p1X?Rz_KE zKAFttl}fS~0i@3~2xNK@_VF>FKkHFcaG|3|y&?@5-vK%^P#xWlmi?D~Q4*7q)Cx6X z3hE~kGX_hDo_!(lJKvj2;c=67tN;P-uro`hhAKs=_+32m1$q~N5Bpo=CMLrvjm}4} zMcNSQrBLi0b|$QrTC4!|L3%^^qpHNKwIvjn?bf1qtUs>QFy5PfP&$cIBrE*#5hR#K z$=bsW6Ymlg0?SB2UUouc?+D+SlLRD$DX512H@hK3y#J{$D(!>PQW zi(u+5lp&&mU0J-4z$L1}-sQ+I5caPWq)2(dE1b}m- zGXWs7GgZ>!bpVYd5xGIZ`cSB91uys+gn7i^marIHWikUf`Fclr7OO&$b9t9cqC^ue zA)(Xhp-_92C@k#J!P{as z0w_{p>}RBzC{VD#zn17WF7IsMqN7`={3;Oc{f2_`tqV9slEvG7YyCb??pa6kB*vFJ zLn?RasHnC^eC}8ke)Sco?67Nmco|K0O(t2W+AIp95X*42e?yLt&lR-BWWUS(VjN2i zbexoi1UlQB^TAFeOq+4wL324BM9KP=3W>}zaK2f}BzaUnD&*z6rMFUt*bhgu)3l~cLR zhmZk>)@(8r_{i^V8WtW7Y2Kf2amd)dnz38QPQs$8qlQ3gV`yT>ge4FV8h#8^G=KkY zxUX5FoL}+n3GwhV0rgDXOjcMSp*>+D`-GLgwGdV&=gpDhHJXZDI(ByG%r_BW=R|lG zY6pffKNZx*Z+^&eIAfNM!fy$~lerNIT-H>62fJ#@u@i_4=xFU%#LsDIOLgU0`Ud)D z4W^@+Ykg{rEG#ES=bqQ6FW7KXIXtMjx!s56ucSTZ7j)$kSR+-3#`BJfB>t2mGAlaIWj+fp3ik(b<(n3hqWc_3lP~C2MgIR zkfi$g9<)q#Gr#9yDF{D2@!cdNebN#(F9QV!z?;^uD|Q|jSxbYHG30p((B4b|Cys*dsIbUFkoC>b7>KOM0{?k>WN0J}@#v zql(#@EJTC#E_(U$B|j6fjB?S31kbOMB99z6B88YpIjO@BPEKwZ?O-W4C#Pb!V{kAg zX>+7J>hvzws4qHu8(*f$%mMG z6SEcL(fD{Q1_lPFi)k(2f@MG-7Z#TM{QW<9QMcsYVtg-fF%|CtqKHn5vp`6oADq|2 zeTo?t+wEBAv)SYdguvNg5BH`{z8n&LgB5_Xq+Iw}12G;B@3r;yGf6^nttO@er+!o` zTO@9>1Ox`M6ptKZtay38x;kF-mY2WLML5XxJ>qdXq_=Y(zsGnHV+r1a{YSH%V1`aE z*hBg?=M^<>+e>^vU(5tsjiL)C48+0>w^B&H;z9&C1qv|+H{WTG{nR^&-CI8K@bCyk z-j+j`No2=mF}|&_N-EW8#IDLsKhDIqdLFIzHZeA<%Xt^_!!{{GKWZZoqo z4NFZ{0$S_sR)6>ifqt|;)~%xzu|PBe=acnn)3DHLnZ1TH*Nc6+m3VoX{a@vzYV_KO z&u>Sa!cw%$Gup)_@)V+azxRCx2$<8}hEIjRb0aA+z6Ls8<2J0*)fMbGnN_F8po_=n zcnUI)0;6h2&U5@^0v@-7r2am}a6l&=jyphR%u6Jj9S#V^0bL%9?OC%K+B=t*&gLpp z{aLlv2L#t!qorosr`W)XPJo!yg!J1~D1CZ!g~KEw47aIi~R3FyPZ9 z3bm#muk~N-@RdnU7D&TVZY1-%EQ9^Z9R5(2u6`GQf^bSmbcapIUB~COZ@Cp?_}*@~ z1(uy%M0s9cRlU)5(jRH#`v$N@ihu_qZBXT96HUjd%ne>Ir}Ij!$RhT~6}}zti6ziA zYoHH6Yu{F(`RwbJ+*VXnj0-UzE0kNhy*e?ed4GVMu1uAiN?7r&lXS(wrcF@j=5${m zBg@CC0)!^5=snmnKUcy&ysrAvj!nZoUI9Is>06?!m| zfvyCvy?0}B$C;R3;Re!Gftat^P1NDasj=zD2))nld>h@J-I#{v{0`5s4-_W@hYVTu z$QfeOf5m4n(atuT$mK{hI$HACZ+dq~7u+Rty4=psu-I)d^w|6^y1cAg3PgFU^6kBS zaojdse{5-VImaT>w;4O*=Gz$<8hX%$c=*Q`&0Oojg3PBc)~w ziIb@*4f05ipv-PA^Jv%WR=SFWCbA(TGvCJ-s?z6nig+m+^-rEnR^>W?j^R2cKgkD00wSNj6IpSO2g50yL*7S8XhrKH}~P#T(< zSaeq;p0}cUiUfYC*g#bYM)j;}6?tWCoz@w0|0WIn4VLq2PX^M)aPd-IzIY@u{j1|4 zm?kNXMQ6-#yiT+*|7@ed#A-^}91E*j>xF?bKEC8R-2Z3+zmg!@=5)-T5qcZX?3c+C9M((ILxI3 zD4Mi>uSsF<59J}xp>a&yR-3OO=ENk4FzCD=R@su4mTtJ%R4H`C$HlcEv`$0s4%cq= zWTT=oTdT-Us@+Rhl?i%waWL0E8AS;tWHXi?#Hp5+mf`a{zjRxeUD?XgHx9V?Tve#W zD$X@tHDf(tW2Fbhe)a0l`uX-y%G^?m=iTK|`<7BSXv`g+SlwUX%5+uq4G2w6DO5UZ zTN=LTUFm+~PEJ8ls@_~+81!vyvIw*=1Q&1(dRpkz+rABcXl~|a&~6g1mYAKqI@ypf zbPG_s&L=zk@h8jp+2H*AJh>bmCO-b&@$F1GItA6!`6e?`l~L27EHO0Td{8&jP6p2} zEZHB7R;nb`oVuN!9W6AwQK)V3x}MrZ8Mo$_>tBAY_F~;lHk_uI) z?)3VR@l+mxB7?KlopUPg?(U`=3FKxczipf`@$m>YP!~lItea}{T;YK(mEPPnYOK zqCU@m7N5CRbw?|ouG0*U3Ucb-E~3aGKt2q>jw@Nn-%mj$OO#F zg;C8)XmiR!c%wOfN^;I{vWSe8eRFKdEO}sX(gNae4X1xDlEcjw)o9amY6y6b0_FhpNw<@ zXO>9+L)YQ%eD+*|{7Q_7N?^4rHJL6&3^HVAj zXdJ!H=4^4}sVI$Vk@zSP1OV3H#6gSc;{Iv`$DOH^r-HGIDvF{v{gm%8tY3UD+(p8m zPvvsMm<-G_yPgW&@eM#WGH>$`y>q{sDw&h7v(ba*DCH}jRxm=AD&5pR^8d(2+Gun< zAlC3>j?XJ10`>h)A>49SIU0SUv9m~!Q0x|6Aw_fiNya%EDyY!yEAu}aH-Cp-V5khk zEVX#d)mwybihAR)nX48kn;oV<$si_1Bbd(>F9qdudCSEFh9Emx!?WkB+ELHS?}>cP zaQ&6TLmN(CIJirx`BvA9Mf`nwbxzVkkN5g8Jyf=uxy<%cW=ERnL2AQL?f5P%Z0xgb zQkRy4nMw#mKrJLeA3#hy-&+i7W#{AQEop;!Ep0dZ9ajCz5ef7z^VWwXnm7hgyBKGH&?8>SLE;_FRi$;paOD-^*6_9Q6{_G{$a zyq?j{A+jaPb6G)vsFRt)C}Zx<6sj3(t~L|BxWs-IL!~6UOh;p}BL&Dty`$a2wO4$i zv#aOPiBzLPnSQq9^4UAtX($ge$~ct${_sBK^t09v)#`%EjvkVUAx7KN576tMca7Lk zh;GZnzEw`h6zv{#gYb-i#f}9^LLDXh1{nqA=A4j-S4>RIq~k%~CZ(L@n<|lYWAzWC z)@D#MTy<5ErxUmpEQK4@ZoF5-&-A>y4N9`Hr6y}mSIQrwMQ_41+^QA)gl@gmk`Zz$ z-Trwj(CeL1e{7UzTuaNV)^J25l$i35`HI-?qFkC>eSgZC%6)tUq!*a+2*bB`<}vsl zxGxLPJwz>Vakrez2tiH3dx@3aHJrDMaj?|5vy!xRmfsbcC|(r19k;x2XcNgH<#nni zv~ZFq_!pE43D4LCQi~w)%`RouA#>@MUtQf@U*CO80I|K8jc096MG(XJ{<}j`&HUbA z9DOPwqfNwS2M#v&73&?U4fQ(~?x!$BFTsckt!j~Td%!n?lx~U+i_I%U{a6L-kJnen zqd|VNOW&fR;-B8@)RMnzW*7mMa4d~ls+r=9Eg#}to2n`XMy#|ZFv?7ZlDl|_XUdf} zg5R=)nM@UFV8<-pZ2l&0XZ5Je(^B48X%X8Jz!z>#FuC-O$QH>MnCf*Ch}ALr(;$_= zW}vY#v_P$vuh?L(KB&$6Mba8ie5vs3iNu`ao)JU*%(zl)tbdb16A4KRlLHGRuDY{y z8`qEj6dMVHwV(0HGg;*)Dk~<+pF$>3iB?jZ6=k!TizGJQfIu^hQn0_Rm6H6QvG$fW zUVzXf(-#B#6)|s`6Z~)OzN4JjWrcj-_OTU1lZ|bFgutwX+f`e(IhzUezE~4dhwGnM zD||xaoxWD{IKHtwre@XZc~emD9pQvDC50J>(aQEJO({oO9Xl?0G8^!5baGi#low_r zWf>(UvHRHf7)MrJRlW13XDWr9;g=qU0lk1Z-~INSrQ>-^t-Lu_jXRD3$WpN;`}O7J zNX*CVz~X*J1j=u8(Yj@JaV6nt+?mPfn3$k@$FHS4%_ymg?x*<%Ncv#y;_Wl zZM7}t>bVlS0fli*uDP{2#@Xbg)2@U3X3 znd?e^{zGEMwT|Lve*UR49}fVj+jDx;>xtg=IJVgVP&r`uf7tY!vVT+KD|IAc9UVEG zeT9oFMyJuz(n8BKrdejH09qbcq^|&+IAI4p?4zSoTUW=~Ar{j`7@=@6DGKKw8tgmE zNmoCD2_ne&_z6<8EFPD+fz^1W6Cs^feT332lL>t@R-POxH7CqwW=4LHnXqBULSt>W zOuVV7DHa~y?X|<~Wx~*;g<%@8^b;Z}BBBB2DR%bOJG|M=93md_+SF_w&2-{^4D1p^A;0B#u0b ziZfZLmS#RQ$>OFargk^YR@K^xCv1U0(ftS@na^ACI+4108-G!@*YOV<>ros3mCWk>NwrdF`DmP zys|U7*k2T32+De=!Pq`5F8Fzza|9h9kqvnN)gq*%)hLqm+pWa67FgqmkB4RS{^uWU z`@@`|OwvZHNXR0#w-Z&jCI&`0K%Fs#-$nYt!*a->*47NM>|d?W0ffPVd7d<)`5Y+` zgO!aA>($X-Wj6(M0^!JMsoAYx<`-tI2@bpMM7)Vyn&-{=Wak=3bvTz|IQdJ%u#F zE5UDD6G&3mSEoj&xU@L%oJ>qUW=4;p)QXz@muPF-ucp%-cm0i}4yrSup|<77D)WWw z$$m`Mp9>0tiM5Zk>(FmeP&|?SCNvxE+J1ZW)6rFV`6sSgYlAH(C@XX}+6=2YRVJC+ zKWXuFIKX;)hoIRtG!Y)&EPM~2&vQb_{Np~z-dGl^e4(@dt zjUQTgq;sMu!tgn4zhtAux0nwu&7Au<&{rU$p*cBtklpS7X-BC4^EF#tQ`62`0mkcK zAOEN}Gcz*`k9UCir<*{5i)<2Skj{9nY;ZJA?85Xk5bz+h9z}xH!oIZ44~n4b$Lhp= zBN)2uILgxM%$A<17(*J%HcfQCznw{$tLRcZD_p8X>&^O6~dn%-IfxQjO(p zV3Om|?H`iZ#W^mBKms>8c|fnBmBGsIO>uN!1HC|g9^pK_aCf#Uv9i_A>9HMM6mwg2 z((Hcpxi>48Zk-6!zUa0`JnS?Y>08r-dw~3-G5W@6r|&kRvdsA%XpQYnAK1Y zVO0lnoegK3R0d=KJfb2Zzqz~m{j(V~s~E+;e^2=Zl^mj-Ejf8&@-RqiltnJXV!1n( zs9HSNP+vdV(Z;s{_P10L41Co%+Sfyfet3ZaCr?jL`~B#!mJhBQ^xBOMxv=8nV7PL+ zz#$2PPE$#fQbi1PcS*A^zbbbl4!O3+O~AZ0+m6FSR~aFN8OU|_urg!T@L|DWpi6Ik ztP^P-D;x|z=xwu@ZkE@RlKe*tDD(Fk$_fI~Hm}QZo(7uL5kkQP6f*Lkfes{X11iFc( z;^=Npk5&L(270?~ zlOG&rW0#Ngl|jvi_YE7>e6!n4TI<957^}sUbQcETpZzGDPJeDW8pu^Lw4RM>+Sh%* ziBt3lnLX-V8NYLD?Lgz@qHz=ki=Ag#B&g=frT)IR3>qbeA;N#!R;5YS{T08}^-R(nE^D@?@&iYv_ohGMR>CcG_Fv{d}{{)jhIm>vMtx!#}$pWZ-`}2HO zmcczAgapQQ2^eTU$g76v>W_H|QR}wYD~R^JMnzS}eaUV;dVE`7xxa4>aG=$Eoxm-f zIrhE9Rs~rIrcurAZ(^b5=4L`3cmDA=;iDl*a%{ef9yef|PW%oD75{p72Hl)4!xd}t z-FNhnwZ+utYsNFPk@P=he_Daq<)0n;+9gD1`CyDVk=sZzAWn+XF}slZW=!*2scxer z!;#ZgV*l+`NFCDTw#W`(%DC0%cGIn$q4*Gi^ItospK@f9n9P>nBNht@e$MC7A`z%1 zXzn155Dmq3b939DYouU(XE^h%_4_otXWMs;>YbinB$LGt5ZlwPQ+A&?divAX%_?I* z1sVwQuQ94uPE5k@ZZ3>3V>`OvRc}x9G7^m3PiMRV0vC|3@HG}QHJH6CoF8F+@|Q8b zRa$BSjw(L=Cwdm}Fy5M?95P9FV9znY91g=xPlEJMOdwCa>kX3tXWT{O>^m7_4uv?UP4lCruiW_6`vFZLk(%lVbT zZ)xbSE%GZXi@deu7>2>1jp<~jnL}ENV zJPn?$#(S-`b@$Fj1OQl+nd(z^K>*y0Pe+Reg7F8>^|-J(cZ1JK~2y})BQ$hZxsoX;ge$t z{XMq2hLG@y6_+CwGr3{zkTwQ`x@wIjhX_H1NY0(h;1k>}(K9lq__Lmo^sHkXYb~ZKxmWQXw^q{6OG7?c!_Z5`I z_-AJ?BY8gDFANT{v602d63>&qte23Kv^5ns{otIJ;gcZ~Nm6k$9f^UBy|uFgW?&8U z^fLUPZAtzNyx{9H8!(9&o*$T>ZxbBnh(%S9e|g8*2By#vF<6zFhJUTDu6n~fRMDCk z74IG?M3j~uL{0a{QMS+F}QB>(9@rluRgX6Odv2U_ejjs&l4y8OY@tSk%+!th_yd({(de<{~ABKv|S4736Y|6_%(daBVs zY_1o(Ae}NG!aNB4{U(!$et-V}UXN?P?2FfGAQ{5L9HKuJgy}i@D)aT`43{7MoJfM@(P>f5&p=-&3t#Xbg= zV%3tj4``Awj)48+2IoDGl8p!B?FgpqA8lixp%3&%vFhn&8UnWt%W(gEFDV3*{&$X* zm6g-}VmCj{YxLKsgq-nzG$#wD!MNsACHR)^BC>1t;(vT(82$zMz9%rIV!);S8vJ#( z)r&!f)od2|Nrq(ur|W~v&NkCXte>ASeVilMi- ziUi1poK>J#ixvW9G7+FcfJw)94v@FOVYU3_^@HEQV8wQ=Z#b1JTwuuW;1z%KzrH37 z3CTAze-Jj6>Cvz-BdFX$l)`ri$eEb1djOob*zVune zX4Yyj1hrELiJ`W(w*1~+mX<|XSy`#6uL(~8xgh@e6X5fjnob~eztIYw(*m8qF)`J^ zpBgWVj*c$<^GENG9>AXfC?dV3HZ)Tg2aU64AM^!3d-22E9c-?GRJFnrYa5#zkZANi&2tFp3` zQn`a;ZJStJz`>N4KLqZ=UPzq0xd7cpGA$K>o#bew$_6T3zkq)X^<_#Vc4;OlJNwYw zT&43THz6S*s4UhClyU|IMKF%{gda6-?x|oicLNw;a=X~&bUW9jCL3ShT+9EEuMc`E zY1Hx)|B&E5sC!*2YoKNSFYeK4lev-ALY+dCj>k2aQQ)hjEYo{mBxc$Af|IL!|H5jJc>NIaQd-*p3>-|Bn2G*P&~E< zyEy2wMLL?p^=ZBk!iCbEkUOtc6%c&DH%>6Kv&Sy>g5Cq|IvZKn``;Pu!0PK~{gRiQZX zWNeLwMH>AT_Gq&dMWT&kNsHkO;uf5}jcgkC(eav;0y)Enks{Cb0N86Z`IVmvchf(k zZ+UE$X`e9L0sR2*!%;uqtd#&Sb_uQ6)?7!T=?;A7@$|^I$^i@WL1vav;}jS-ySqji z`NzlX)2_6mw-l*;@(Xh*lrE%<>TvMCXhXCuvDup*FufbP7 zfF=+gAXgi)0BbSrq+9xk8b1RmFISe}U@jMPlJP^B2(b*9aWezvD`vC=v$WmDIUO`p zpdHzDbD`D=f}adp<$_FX&B-~zU}@i~F0YrqdFFMg(9BX6903`>@n_%9_v)=-bQc{@IJU@{3Jnhk==A-hV#4+4zT?1rIVe;zwtT2HtuR57D z^KO|5;Vr%f*ZYDvjwY(4HDw07ir@+p!&d|%2zS5Gc9+zOK74`-fq^bw_stRD=LNr! zXw(ouFd5u_dvt`8?+j)iR%=wo* zYP6L`;dmUT*1GzeWq-gl*wpCw&Efss5WXg#i~IlJ?k%IL?%I7}3=ok}LZm_IR6@E- zxIx1Ho2+&lx6$asEoya{|`>yiboQ$lZQ z7EdR5`5SI&V@m^%d_a!{6;#A4NMRzmhOcaQ)M-xF`=31rJmKwNO8_N3J^fuD411{g zT~ka%q_V26+F|Xj6)=fmWXlol0uOI9Y&2h6^Gc{bJRD=2N9lV*3W;`NR{CVIQ^M~6 z6gM|_;9uKX4c$B%9c4%Wtb9k(i{=5EwyvS5Ozn@u1c0mr@<*BfAQu4@SqzeWHd2Kj znf`8W&hQA=DKj4{Dk?hJKS>Q2fXo1h4bl~3JzFmP#N~ch%dSTT?N}hjE_`w4y5>&G zL6rnLI}iE-HJ2H8H2in9keH6sEF=3ap#b2)SAc1`P2T&P=pza#p8kvIYfZl=6Cd1w zPTU~=xHASJE>*bBb>Mz=vFuRvc?dQQZRE#Oj5uLEXw7B94zGK;`B02^xMMWXYD>tZ z17})#U;^u9&+M#@d&m{@`Am%qb?|%^%_{{DK=fudr0hnuh38JnjCqab>ws*6Yln#U z@(G;cM|coksI#;4@CDh$&~_O?S-_ykQmYI&xhY0S=M z6u264;&dhE|6cmqy`bRuw7S`Oeovvq*Vx+H8oZ(*VPVd0H(TRDQAkLi9Rc!=I*=$H zPOM05j1XY}5ahic3wEv<^cSq(FNYcj>;@JyOK!glz9G|oT;shx3B)$cnkRsU<#yRl zWe&S65eton(5m3`m<;<#wu?;_=5VKX^#zUA)%n6#TV z0V`+vtVZAYh+o?x!=gw`%#7gRK(>Zhy+Kfz%fQXU!{OB9?EIqt77+zIA}3`4!eg!9 zTYJ9JdChLAo!%M>v}>HU0=iuH_`Q$bU1aD~So69E-DF56E8bhkmLpyiFH?pO0+3Nw zR<_z>4Lyk&bVx5}o=o3in?W=~S?m_0i3y+}S&T0uXbr{dD2{rvHe@ZA_RFcK`Z#S9 z@kmrUg)^l7mAO`0$TV0Yip$m%GE1ktAZ)|1?WBO!?p6m0!ctv-xhSe3QxsoPk{guU zT%$#qtuZj^M1X?J*xlnus}ij9e06nrgZRZ$TlnvD*o?<(NbcF@{Jux@56j09aStv} z>b*8)vCu&AGm}-|cz>4P5Pf8Zh8>-l>+5BdWEJ8Q+`c5IykpHP+g&#I4Z+ZbX09h27mg;8N-W(O(;zo2MIxQc0g-f`g*&){{erAzzJv{op0^ ziT%L}3(!(wu`_sYzN(;wJm5b4*q}6q$_GkFMw)Kxhcnehj4SIFoLyP^+fO`kG&Q=Iht5E-xGaL-r4NItO6pDrnU^iw}dNJlQ=%Usr1BJj~AS?y|jEMgM=V#1IE zG5Da7sc*bv4lU*WPMwEKE@S&(8g7S2g-BejQAkW0N(?evki5$GOy1{C;kkaaK)?YO zyd(r6&d$ZB2kpIXj{HK0QkKbgu@;iz)KtB>n+MHnAe`&#*}YCq}cccHY!8H5I@jnQe&D0gE~?eP!{D2{;<~IBL5HXU~i{ar)ZTMJHH_zZ8o; z3Jew;U=?jK+dNm7jgL#P!%~QR@eYgBqzfdV;W@jCnpgnF&{5;!Kw?yh4$t|;2Lpp9 znX`*)#dZ+KW`_l&R^N0wdq=~j^gn!vIP=^ILX2_d?1_bK6qOcFO^uGiOb1FgqwD$j z-!5z>IFCsd>3@Tuf{m{-2)L5vEeM8UFe!*K!lBoF2_{z$$eGZBp}k?~VS^S9l0LQM z2|qM^&k#KxrzKoRd->DXq`rV(U%DtiuJPEF1)7-VxkdALjx!kw>6DmKLCjUheY&4G zIxz#D;GiR;Mzk;2<{oU$pMq7O{5T@Dva%9DQlLvsf~xy;$0exSM1k_yDAqnDlQ?=Y zsY6t}%yPnh@QGqF-u`9I&whD$MQNe~hXy0DgX%!)wZo$Z=0J9Db=ejcdsT&#uUESG z6d~w13YR~_ZL(U7m&9b4uZj^!rN9{~9^lcGiT8B(Wt-o~4Ecgk*k;>D`8o>mjyc{mk7O~?oZ?Kx0T$_-xD<>=IXc0797xs3QE-l$TeS&JCz&NQcNJc%^IVwAWQ!ELBU6=}kkj{Jj?CqJmoPc&MSM2Ph;PTK!F83uhG?3T*?8{{>-pMglXDwX}Q>L0Rotgn8 z_O#FsP(rY7NrYz?yya)xv7hg}X`QCr`n0zZ=MZ}y=Bnv*S{K2B6~Y+N76VxtE})+~ zgK*aF_u4}fBTIr&OqRP>O=_Z;5lq#spCFg;bJr{aLH$bd`re7Ghjr?EcR3tz)>>P` z=)Hcb!7gn;03>GD;BiBylo}zo5W1MSxC6_bifj|eu-}dXGV!$Irxbg{!ryG-ZWfQ4 zdH+u`mEIiMlljJ(x%gXG;;ozOQjdzGql27%Jz|xdgUxongN-!^@4M0ypLU`4WezB_ zVMo;iqp)Ase`rR8<%h_~Wucon5u4D)Snlf#j9mi@leNWz#MQvexiND~%fy9WJ&roN z6E!Xs#JtJ;K0r^UA}=rh?%mJ8Kye`MoQWV966TT-D|^)%lBsucY2jjbELVtYzFOqNJV~K}&9v&E`_mzh;)6 z1JXnqR+iZGtX*M6{1V9DItgc^d+a%jy6+*#*MKNYW9J){%b@cHZhB^QmI_fg_nWOj zxwoJ|m64V{+CP57$~sScx+W_GDyC_#D+)tr)2!@lwGv|ncRQa!^^-e}P+I^rNF4_s z`#U@16OhqSV!YX@sUwUC+QNwz>T}~tjK}ik1i0>b`Bl9lWo2h)QiIik;*2VsL;>fu zF5iRLwZ2Naxnq_p7pZ7BtL_b%Iqn;Vy=I5eAOyAFE~q&9gIsuJNaSH0~c;sF=yYQkBT80mmg zpb~*V+SXx})af4>XvD!!&QW0V1`D_#DO>r)-{MyF8*zknAc^#)!`q zIt zsyf{~W}}-qmziY-(_pG5&PJ9=;f`i-a9v7TVYL(MEeD!a1OX0vO@a0El@iB?i%Ux~ z$1L$b%gPMQ^^J~~rneR%8(%9qrbbSs9rqc&1a5rgzz^`c@u9fZ9TU0H>36C(-ribc zniSs7WDJeIC<-S+vEU-t|4CY-jo)_Qu?Q9*KGEpTM5Ts@PzG2qOId8Q1105G$HA&}PU~n!e z?yQ-Ve!KWu%Ti^kVl!7Q)ga|j>D1K3ItMzNzzQUdzZJx0$T`lu&-{)+?U`G)0K3c^GlnX+mMqN55~63IH0b;x%3Y=_;BoUd?#;kEzS)8A{Ts1W{X>03B zG+*+PdvK9Mo@B`R614yld z`XnSICW`mlau$0PG33EQbX49RWJ*&ox&VF^%-v)T@8~@77#dC0MTWl~0VwOSIbXXC zD>_n_iN>5L&)U#?{isr+3J>WE4-K8F@*%!gFn8y8!G2h5f_hT68)9-t=bw`|wd@>DJKZe_y6@n5`n zYd#F30uz)GCPnjv_G_tQMg2(N4Sd@wZ95gf?{6y?2vU#s=*n<~Isw{pyiA!@10@;*9jfVLB zP$x}xcJ}!9XKPm=xJD&cH8egFUhF0C@fJqJeRXxUE?Mq~BdJXtG8s!Pp=QO)=S}#= z@*Mz@QPEIau#R@7!fVcBa^W79!#Vp2?1eOE)0Je~w2!?MC*CL)>UiNYT}08MMNx*5 za9O&Z+vBW3%2#K};=A%Dk`9Wp3qK__-ZS z=Wso;DTU8#V>s6VUTl=Y=k0m4uE!)N7sChBu*mJpk)$MHbsPsI?7&0qA-98Ng);MA zkle<_RSoK#3=7`r=QXG6G<82>9KtrlA7ze;$f~Tui1g}F(0mM_Ioa@-Kp47 zQn%|#75AV9sWtfdA+C|D0jdjA=h$B9nn1J7ZYpIMu%_5`*;83Q23bs*oB58$$46H} zWjX+#gp`^T@?o+7wdObg;=9_VaB2gq9RtHVsN{eR(CmNfA(zd?Tw|xYJb^DLky#4vFo#; z7n9AUW-OF4gyJ~G5fSqMaFHNiA5D*?CROe_9sg;EwPWCYwwIhaS3^-#*zjM7#8aOu ze+dA|=xsDzjx}DM<~%lN4f9!8JlLKZ(_}BKu$&mIa!1>DIlqn&U03QyWHNu{ezTR^ ztZC3D^TUY382YV)fYp@4@@#ji!YUOGxaV5Kd^c z{a^d62)7B{2#uyA!bjWX-+EM^QHfybc^(VX>N`4aymdSv#sHt!UCR!Q2Yc3M{)b|w zR0@~dA`n)k4dkpR%E<5nOuRck*1TqsKUon3dOU52rml`12>>;wMl`tniVY5{k-wcFl2-w=<3!yyU|ZLRlp{H0Q)EaD}`4{4p% zqYkW^Mg@>b^Vb{!Cf#~$68i%6lGQq3byt<{;isEzKyN(-Ph&bX{c!b4aEMNgajwXr zFmk}hssZ#~Ae;f*0%&&j6hCP=#)t^u>leMbzo~M4lsj5Tqk|EF5Tg z?gMgGo11Dw7b?eGe_R#J-cMeLzo zSFr`;4Iu+=xcYm?hmVHFo~_Q$=bUAC4XmNJm~nQQom*zokA$Ejv>)4V|2hI2)xyq$ z4oE`!DAIQLP9~#ZBR@>=y~)jwfb~e!0^V@}HMI3f+j6gySKR&flxm`~6Dr>P%fq|; ztt>yn%@SlA5mmaEOI<-kg+x`2YxnQ8bX%^>=N*5(jit-%*0P0QH|+s}eVrD;Q=t=V zJiID{OI7R1dXbLqZ$ZQzrXXOW@hEu|SnP`l5(^MWaX|o0JSh98tBnr3XEQCLv~V}@ zFnPZXz`Q&F?-{|cV2OxOg>YY}{XU2*rIJphUm8H%ar+8Z-%9g^-d)C!s%`oGk6NT- z&a@BI8QIvJZfAKH9gYsx;}SH-ap-hX@5?44bOwF-%HeQ8F4Ztr4TvRF1c7_hpkicv z_$NsK0pWh;T@)Gk+*w=xaWeyU_Rr_jT@diy=l}P41J=?19ixg6A-d=B5P?|U5tzIK zWgSIccR5+l)mMRI-gUqp{C52%D*x0CI8bZdar z78BXzjK`Ol6a;V0n^|dMA)K7rviwk>U!+LvyjPq$Jt35nmwq}|3M1}-PGgWpMy0{8N5nWUq7JVtZf>0%}gNjV>hkN}6G-8tzI0>)Kn7d&A zW+#2H@a!E@J57T)f;_j1Bqvyu2$PZA4}=DNev!Jr(PQ}!`jy+3wTM*U^PUGbax~|J zBqIm78U%z=gt~v`EhxjR$d(!2kTvp?e!OvUv>zN%q5dE%A#sjRO#GY}#06%j$Ti5P zg1DdnM@Pr+lr8^>Ni{M6X~p;M-GJb|(b2ack0O`}I2?d*!NADKN>8tGFqup*zSTpm zOb(*mLldWUgeU4IV8^+_a*)0V1MV1l@oO$uki3YFf^u`Ro#(ZW3AV1QgS%e3qQYc< z@#HQ@Kk+ptzCJLg0^RU*%g|f=7f-Q>w%6CAslr?PRym7YMFz-ZAe|2y0IHI0k07tQ z^B5WUZJZW^;WmeJ`TktUU+SZRt1WV&l8PO z-~BvWe;-J!0?~J}F;zY5fu0z6ZfZ`qj4Unb`EDEiE-fEA<03m@z!lcvYF$j?Pp?<<8F$7Eg%VVhAv$%>)Z>rj$*L3gtQTwFnI{8J$EST}&p%%Gs%NIS5v$GbqxhQx}L%K(=oU;wir9`CVUKnYwS3 z;`L~jF0ba%J)kbj)976$^loUoGzLFcR*I#Q-UN{g>?7Uu2%qs(Bo3QE;Crye)J#9pmETtJiI~=k9iN zvON?kR-mbLeWMrHZQYiJK^-{#%Ah&3@QJcNW?j%pBe{r;r7Pi zTAv7&u~6(R@c$V%f6)VkVW({_urC4*Zg-+i$`OT(k8f5v&UJgWv$zM=n|S`n#p-x` z;8n6NpA^it&zccGU$Y{a8owK=jT8HdnUkoFv&2N9=lvD9nK>6yDf>}@fm8~~4 zR~R2J2nPbCyHdtG4M%JOtQzBE6k1dkP0x|e6{;|jr8L2q*`M%@3-ifg2}j=#8!>*& z2*K!h%K1Fh9=65H%IFBSE6LA)$Cp`z=(Zj2?^k(UW-W#Qg>RkDZ5Sg`1t2PHQ-ySr zb*N+sYuuK&>dKtDR)Nmne$C7dmnqQ)z9@tR&SaqOQXOn;{5=igZ-4h}k0fzdG@NilWrv-@r*uodBqb4Pzj%HPKbZ_=lp6X^bQT5?mjD(}q|bO9K~-wPLPN{KD=#EhJ+E7C z*#QXsP5AXXPSRo%kUkFi=bAN2C}jmPW$Gi%dnt2Hb}SRlHnf%YRoY;%&umq!Lg>`q zu&|&0(Nextp)?Hv@5)52k%#ly*U9Wf*kB`gVOiKr#|m_H8~xJtW4fO0%+?7z0bQ+N zlNdNg;bYsoYnRLW2Eo2SV>|XQ`VUeoDcJR?NxTOozN)H9CYghgi)(V_yu^S?7Bq>V zIf=Zl5P!HnAWVyw5sQX`>geJ#R43l2YBf1{y1uzo<8dl$j+b7MvurlF#SVmiS(H4? zAA>UqgVAN=iw=G*&70nWrw(oBy+_8@(l2#Hm9zvwLFNZeL5J~woPxX#qg$Zuu5sDv zR~ZK``*$vmtxlOTtKA8@z_<5+>)(8P@(aMX*MQ{TB9idO4`-JJ{BWLYEDj5vlcB8G zuKDT}$*L_qj*j;6d=4?d%d7n`Gw<6Uime`BW{FXGbFHhwdFJ!)fF}+tKxmp48&Jim z4Sc!Cm5vLZV>`U$&ucyRU$P5|t2jz`#uio@Z-0KgBnF;gUEc7K%kAvUBaEG)fVCy@ zaNv+g$mEw6+9&fmX61FdK;^m&W=aFkuP%>p+t3~z0DL(?26xUu!9(DHp2@UeuRgim zf-6DMh5|NVGu0*eH-A68xVHvb)UEQ%^EuyF?EQf*+8#?OtJiekpyA}ISG$^s+ue0) zl)=$9jF?lXCBNAhx;z4eh>EQ3GT7zCDCj6q?FvRwKh|u`iXH5ygZ>Q-K6kFe?jJ(l zKpQ`uf*uz3xAlKhDsMEpqn&xwO*jd$JH-kzgI z(vb!RI?Mtb>s^!%`TW{MwRD_4rVYrK(XF<>2EhxPqqj}N{=G+R=EE66ZqsK$Y4^1= zlwx7i{%vjH^m%UX-V0FXKh8KZk@W-evF`w_<_)U&-P8mx6~P*Ta!M%^t!Ipss4;=V z0wRp|aTxU-mdD8!D)Kwcz9IwhN`feja&v6}#@_vW#b287;wvx@Nuj37#>R<<5qHV( zSNgD*uo>R=<)GlWK=A7`G!qR82}eq_PQ+6pYierlJbweE*%lSVpFbn9?k`+(!x2?F z^3D(NzGQ*49f4Z{{Ht}f*6!)A315P{UFZ3Pg`4WHAARW?7#P6YZ-|^eGRfs0ck2?w zLl6x_g{l!p^Kwk`Lmqq#e){xAJ}tw~vC#VDgrf5C?MGDDFo3|CWoo@HKbsLJxx+6A z>oh9N=&tXAR;nKR`0&S!`1<-*KK^5MgLB|AMypmJqoRIul{(@Gj#8q5BZ9ZlcmvcI zoWlqlM&^?;sh}LmQ-$sA@6V=qd*EmvkZ_vQcgfat+6z(QdbKKMGPff*mpe~8Bye7^ zK!sYg%NWe*c$Hck6?nUhd_WigP<_H(oSdA*ulRz^2Sf4MJ1hlf-5?dHm!z4&d=)Ky z8y-1KkBktoiI{VA+~iOGTB@`{0%v~eV%nDQwXQa&eBd@AzlP=9e`C>F3cS3vwr<1( zSY5@)kh5vn9jj(kmUAQpwEk4ps94`K`Cno_+n3Sj(^g%kWcK{lIGFZSiG8+)Rx!^x z3Dl?k{=l;1VA8k9mHC}-38Nalvv>k#e0%p~<9Ivu&EjGn*&mrG2L#uc>zmX5+qIaQ z>BZ^!mTylwK;Yfamy^`o{_?=_ODT-3{6PH(=3 z|Gqw2CyuI%$GK;(-)!C$s;7nr)FEHH4oyHz_H>;IP}zeM@ud>`hzr}L$-(UjZ`6o= zLf1fw0*?Bz(;fS=x@-&*20DB4YK?#ytuKd@`oWL&2q{q6-S(vxfchZ^nZf^RpsWax zKBz=oz8?4em*D3sfbof<{7N+3z;ybe0$;n{(QbLSsVZ=(#EO+#0F;l5O+F(EKbHIx zg)ZZ?F75kGuz!!;i%?qrG53lV1A&x416f6A%`X`c&YJ^EAfmy#PzMnaF~I+!hpQ_& zdGn)(Ncq|&o#W#o`nGzrz@4jBs3C~U0g~x}S_OCySMG?KpB{jynb=nJ0=OEKQ>|}H zn`p+;F-{($?RCD`0_lns^?~UWd2XI00e|G1p3;XmV0_kJSU~@Q!iX_tA1&uPi*W~R z^#=*F>3wDaV|$T-NGv)Ggdax8$Rh%Ba)rh{8flCaKw65vHPto4TkLa7?39EG3cBAo z6Mw8*4WAtE6A>j@DrSZ3JSr-qqnvfj@<-+WLTOXKSeK^|sQ@Ca_2FI<$6F(p^Pjvx z)dJ+w#4OG{N_1>McVJ2tb?ZWFUBmQzv;7-=HjzDmz7g4C)mVVd zEB5xU=R!tDhcU@@x2|owaxPYS5?uNtQd@#?v&{hd=QNWHs1J!-TvnE@p90whwgz)X zkJ29XH#K~wDVg?3((w;4`Uxf=Apd#Mi*I(zrXL)EME10g5d}<`>)T~n|{4&@+_qo?gHAN$(Sn%p!g2-ms#ez@AR2|VH8e7GJ+ ze}sxKOch)D)cfGf@phIe0K{ftu!Ha;#9Qu7ppY07xSPFb|1=Z|%Qk@TjF=`9e+TIXC+;KWpp4N%t5>2_R zQzuudY?cEJ8f(#B-#N%>$pe921qDRfo@mH>b7cmBDJdjuViGAa8%t@JMNzD7DGFuXtrQp6L0Xs-miP^zt*a{O026&LobPBNfp zj`sJn&W|EBjaX}oWBAiK%wf;Un82LBgp&xfj~dP@>QEET0w792!{@SGNI5jsUkT2X zOXh*9_Dr<40)@e8?{)%6vC2FLwGhZAQE~@}qRO+i4Yu5ftN%w|*59j3c%YG0fC2I- zbB`NBm7Q_*{md=ODtOp`ok2k#K|Vwa^QrgER*}!`Eb5#)=+~I`Ie~viftQpV;1^ye zTaUF3Gt)wQ1qL6lADH*)cp2t@>TJ6WC9HdMy_nhT4P?g=97_L<(FvRffAa=Wfr_#T zZw&^U?Hpk!k00~dU40kv1qwZ*_ic*KjsJxv_{VSb&c<{vB6W6lHk>$1`zqamwyyHr z(HA~bu?v8Y@74QLBR+kJSr*mw*9jX_6%A*a%2Ww_UeC3;v*B!cs;a=U@Ifs7f|-H^ zL1`i9pp_{q@4zF2E2biQtlrDR^a4cS9bw98^>bdeBO zi>=DX(T@!2^UA(yiR1!!Es*kV`Oy<+AMo%K(27>zZA!>|ne9y9QI$dX)Wnc}g+rt0 z*i(%bn!p+bi(ZGr2PlfzEXJgGR>=wgfDQm_I?eLL+@Pz#nOlwGTAPM@n49^a$4_gB z;Q~ZJu$`m*g~{P)b!Rvvd&?K_4;q!OK_w1OJ35k)V6K48R8gJ`B^AG9?T3ZMH%qO! zMKmwt%}mrRPZHfuPSB-UqGwd9Gpe1sC{GTJ6}Xxt$aCK3Dz?ccsb7pNf_MnydZQI) zge4DUHzg@bHPzcse$N>%Lh#L-`Ck#GfbnG@)p({+p=UzixUXFspY#uJ!J6|}{m>~V zaivssb#FA?q!7?1N*`X?9nq@5ih+-cYaS?~S86*Y{$-bHE4TYMyOb6;MHPn;NIsHx zG!*;u`f@;UX|=xBh*p8Pf@#9QZ|DI-Hk{9m#y}dMZB>r*b~V_z#HqMme*a_+C;+}% zpEj8_mUa_sAad19jgcC|1Kw4Taq#aTKY@2~>R-mC_I6~D!zUDgLg#G=;@Z5tfV-`%*~Z(^fd;tV|<~x0kuFJ32Y3LJ;>NWGC)i^W%?hiLA+^jbi`7yI5rVx zG4$ZaSuPJ78)Oovg{1L^*9ivlJn_*ACwu${i&~u<3Ko;JuH&0J0W1`2;52edHfd z64;)s0Mj*ry6_&t#G^Yj{iagX7!55HEfj^ijFdUZ zcCVNGj-T*N!yV;CE;&}UyzlR^~3KeS-K5Bo2YDT>c9Pz^8e#|vVi2jzi+oYJx5MO z#Zs?tU|@zuLt{Vs6dU{OYNDi2w<+$xb=T1K{R=DBmx}~lk3DPa%xvIM#g<5Mndl8vpDME2Q0gIuoHG^d4-URbDG zq2ouRl${W#`7Rqw&yDBs1}?Dffu-#4%*xXpCVk0QoHi%HDw`Xld40-z=ZD$A?sL2~ zQKPp+Da``fp0X3Sb{d@5bypLLor(h|6y8Yx4}wKYJrUP zg+WL{iE*FT@nXwYcodGVUtxG(M$nReTDmt0=S3j}9S8<-1P4FjlU1Ydt{_ZPCt3IA z%)q+d6G>VRx|>nm+$sX>I6U-VoSJ~8boZ9}&{)2PPPrB$z${{{NTaAl)4{#)lm=h^ zQA+}RJG-@3I)`D;BpME_Y8t<0xjDhJXGPXM(25?{LW8&8@`6I@W z5)8ue)8&0(Cb>T5mCm=O{gnVYs;)K*Z3XHUw9OIBOsy(?nz~9j7!6lpJ#@2nk$$>8 zaSc!{5*wz3m!cM<`D~``KLJOJJ;iPO!StsgT(W28YbOD7(E1F0ANj_`-4rN<2(m^* z|6zII+f6t;Xmz{njoC65g;cM7&5B!-XQ+^uF(VWBPM&km<21yaD&fzR_bmy-GAA}D=EEQYad z#HGB!>F^g8aAfP?<#yKp2?^j%7Nfp5wN8iC02gc$y9%d~Xi3VK|3rH+WR_+ZWehSu z0JKlU?d_XuCK!LXczy`pA4<6-Kn-Is3U0VKZ!ABalt7WqdHiK+YRtNDaO1*h(`9E; zTYrUbb{3mQI^j)-#gjC){@b=N!nEh9V0P_Kt$W~2HNDNH*@Nn1_tie*x~ibza!*42Gy`}F$u z+Jm->AwuGPc?UVv=dYV2Qwbn?d0Q*&tBqLj!hc!vz>f8Wr8d!XVc)0U;Ew=i?$lcl zLO~a4-?u{qd^}~Q15mdR)x|?FtLA2HdcwtKt}{Pvu1vEJ3C#yjQV;mu@l<_Tru-MV zX{NwZ0q&Y+84u5^_CfcmtATO@18s7v)j(kNzbVO<)2X+G50q2{<>s2AX@!T`?b{8~ zg@5@%4}w~A;$?N}JR6z6O|*5FM@Urimk3iTjJ4gJi62oPGm=^kR!;0JazAJKehW_* z2Z7qeyq>lvb3-7mGotbdBbZmWxf;s4u(|X~LAcHfVEUVC)LvSa(*iftx!>Rwj5V_BAszm;L&O=87-1ZbKW_Ad;`Fl)ib;BRgX>*-DeW z!eWe!hGu^~QW(rdll1Ba$}#{+ge0Ipc``IIun=aVFqM|3uvPq!`SGc$bNj#c!i5>; zc&53@hTAx9ka^0>t$s0MClh~j(l+ge*?}7R6&xhDqt`NEXzL#jPR8x^m8Z-0^vP!Y zaaDD_uc4(-V^VaU=4or6La#=DDj2|E{Elb4Iy$<}yVGJ!pwleh<|?(AGwXq_1p9Pj zkjzRE3h&5GM&+X+M@n$~``dIElAtd8eEoDH)e$GF_WO5J5~jj$VX_w&7kHFl#L@Bb zeikkB(2J^sh?=P2y{iLJajF8C9GgAdCD*PM7@Bz54!$@Mrd8(Tyt83q0*VboRJv^V zt8@6Z)Mgrm5xD?mB;BP6CJukrwDjEzOe*~w4Vi4LUrPYF3h9qrhTXD6J$(I?xRZPir~Oaa`a62*QP!G>s6TvTru7b5K>|LVo`!}hPLFdpCx-zqED&&I!JWSk90Vu-tAN5%iGkqX#{~OvHNZ^X? zC-0QIh<)(Bss3ct__ktrr>nago&i4ok1GC===|S!`TxyI`+vPm(A}K_r0)NgaH;-3!I6$uFm)freXi|5KO~lFxSin;t17IQIG*A zV2zAyke0qKLdSbsv09K&VcAqn0_x)+BA8MknXEr1pQmeuN84(2G&ayuUJUgdkE}?U z1fmkb-$PlIW+&OC9$a0;6lnFiE*!iV`B|buad|VNiOZBMBPpE$2bv_4_Z=}h&*efAWEv(UUmIs$D?knP*$ zr6PGxUThx*(fA>-A%+}<;9J9(3bpv=vUfjJ*R~*#R&;^EfPv=xUY8hIkD)Q3gtpz; z%C%5q!cT}Fh809U>4xU0H9P~I1Ci!!>LmFC8WTB^?80K3TQUf(nh~5T``W`Lk=Mh1 zaXC(UZ&BX>MD<;qA5w8SjO9*!wDu9)kDJVK7T&c1_oK0Y=B4|K{kU2!cDiK z@dDfAtbw#`k4|^FycXL_;|?oXm2GA#JUr~}4|Z<})CLEFR$V<^8ywoQ>T1e+66;7o zcpnN(oScjD;;KqX?6X)Bmy3xyikk`&;-UG*sWM7lmUK!JtMt5^iiMG{76%42;AI1o z=paazAmO$L3|@F=k^KtYAmJ&yb#zlW@r35!LLVr*Un8`S*e|g7E2lwdwVn6+Z;MK$ z^eZy4GO{wxE?gfWB7!#FxDts=1_|+ED5N6;cHExX?w-Sk58Aoy?YQsXBh=%;%mk)B zfO_%)lsdPVfdLug2^u;&t#%fnS`#G>ol5HF&JkXNH(IPL2_`1}WeJ_o(S+H{riWZy zT=aFt>nq1AV6ue$Sd-zm1Rq1>$7oq49!XrsG|SZb7F6uK+k+tCH+OX`)nH64)W-k} zP~Si#iZSldv|}@fasHHLevX0zqH*C5>>c>LU8S7D;>$Md*(`<7OhJQ_6-P`mM^{fA zIYbrK+SXRFIX=?g{>6xBS!DvdJFnE3h{!52+&@vRB{xs{>6V*(P~rM;i82NI7h)XvV&zb3r4YC8!X zP%xu#6=W$9^z*Ku(NK=2WMtf#8)}=G(Oz0wgv&h;_OoB1by^?p>F<}{-c<1S-E_0P z?S)9KEiLL-@h9btZH-rn*L$9eJYHvYJLwJz#MlX59iM!@Iar{kP~_lOeWK0)uu1qW zXjz+0;^Q)BYH;?q3B0PN384l9Ywm}WDn}D}oMXUfosctH_F+~U+7vYU+N<;Z0IL`4 zz_D5N$BW&#rP5@7|59@i;}mT*wbPTHO*O_8IayhKpdaA#dbBb!hD#x@b`#mv-*39U zr{K6C9NDZ~HPPU5X~90$JL7Ji(^xC7mzO1@$-#MTpPiU%HaUii^GwgkNCxZKGqX7} zg(>|-v#nqppR4s7;2y@-#aNq}Vh2l*kWfm&`pQvq(l|Tb$0Ov8pkpWS8J-cQC4U-%YfKt=9Xj)f-H;PB`Gg zH{iK0DI+f_*aB|G21cHxYHpJ|6l=NNHq@ikDIVYusB4ARVa}Ud2-s_OT{ARVqcooo6Mf2 zB!26@+eXXoEfgfE0mxH|izBEnqbm&*?RgpnNHS_U?T4NkG6#Gfhclw!5N|;wVgA z7AI-%r#!3>1W0(VVLA{weI;a}X*vdIpIDpi?`1sx4Nn>x3snZMn=7+T=cHzSkN5A_ zOYsgXH)J8Sz0se;95%~|D%a@1O&@0D;VDSEIvenFTuESbvdBI~1~fK*tc)GNdTsMZ|K%c~o&>uN~a z<&o*yBh(jSy1YZL@2#qoML+iC#pu+QlNAvU&zzyZhJoYKbT!ar$IJ$&7-Vovtt5YZ z{klJ8Q$7LK>2rS7F*Oy{D`z$3^6i}}RJ!UmE2&e<*yO>L&osIq_7S_5uyTQ7W1hvE`>R^5Ma#piPqy`V`U#r1xQ+DfV45m|MyLRGKqu(N$ z)Hz+_5kg6;x_UlDbI_nw}u{5)Eb_<63#=5$$hP*AQ2bCc(-c5LR8Lzx6H*~6&i z8ZRZ{r2AtIt(PWkeBK(H;^|b&_dGob zWy`yTDp%2J-_R@kj!ZN1o>J_uaj~g-lm=Mzfqn@_Mn0<)iX9YZT9p_bX}oC@cIGo9 z-f43RzM4;;QXS*Jubb{4=Op_Khvi{#LTHuh#FAFJo+t8qXr$jG8;LpDosgAzI^%xS z^Rpws8=_n`I55EW_U&p>@))cT$WelymtD@S?_XS)VIWgbQd-Vd?tmH$R;Wd*W@j9n zYP#2*Yk*fjQsm%rjO5>*XU}FmsHG-%3hKnFYS$^}Brh*7J`YdS$7s)dh~?_+C3SEV z)T*E`X2I`kf>oOe!Owdk!PF5A0u{tw=tScsCS$7BVF3XYY;`e(@*OWjJ}V<4Sak+8 z$x`F|B)%vGwxNuKrf4Mdl7+DogJewY}Go6S@L71~c z@kTbj`XnxzQR!r)YmF61Avh_?H#+&_1;$FGqN&d(w{b?ass=`e!zSI(Nv1FNmpq_b zqdDr_O|0iYD}L>>!6l4c^aIqd$&{k$ajx|BVvGgBX4zLVVFfaFTBlF3M zS=VpX;SV|4*<*6>WbXxxN)<_M%(xh@HC)P8}(zZNfJ z?)uwP+&1O(o@3ARZzoT&wVSYZ_duw{5N)(~y(b7pbY34XGcKqGRXrGGO{v4 ziWfGOGX7n6LwY*pGyiS?i}WspjO(oiPiR}2$)>hqrX3jGKVgmrv6P*Uq z99R05mLBaFCBwNUve5ECrk$B7?>Xuq)RZi>@oKc`nBf`r3sT95x7cNCCi}-CZ6ZT2 zfzBQ?#mqF?`C@EjWTmK2J~c6n9*q_I46)fM@i{pAeo?~UOUc8-*WXygc+ll%==ed@;HiUI zr8bVP+zIDr(U7c>P=I7U>q$)%Xp4CHNGdm^9#{^PWFmDy2gagfJy-2~x$0DHK3j47 zRG}WzL^Ge``gXB}Wj~HdheyVvt5;|LIGRR@jA5e3VsQ?a;oFI7)q(V8gqlihe0;6f zCcilP4o*+%=SG(u8|vobBF2}IFWeyPnVk=DRz?qhfMW(8M#3q;{|h$bzG3Etjno4Q1z2}j3&+|`?OAaX%NrrNU@Utzr8vBEXL>^`drFq(d80EFImG!Uj z$`|ClUuYvtfj&;>RN|*hbFA%lylAS!Xw`7F%2=lHU>P&0xJl4a>62L==>jZn$QIgp zK;DjnL$i2mb)u&S6m?xfnHi4v)Dq59Xt1dUnM(vg^U_#xwVJ29oQpR|Gyn|36lMPy z!>}O;8f4E2w&Uj>C=X|9haJ|jsNYnOSG2`oRnV4%FYTr-M~jpcgp~4I+jNUm@TiYN z3rsIpI29mca*`Hr$J5BydtP9_!vDBavTdYAmcMuMN1amek&UHFQp+RZ`FjUDI9a(dcpeVd+D@(`q7p#1yigwQif^Uv<9Cw^sW<}H@y zX@cm^zyNOTcj!GJ^ZXNC>_F5N1dy=q}wCN92TMQBrsG?13 zU$Lt+LCQxuD|m)D$qx^t)0zKS=eK+LQZ%uG-$ynlghZE^aOJk~A+eq>CMITUlLU3# zKx}@fUy2-#;9mZs6dW2B{@G*AEl+kDQw8 zu}R?{%r}o$HQD3YpHr#*T!L9==2ad5WSJgZ+A26~8S9*&LqT;PHM$LoddUG92Zk5| z<~5}=t)9j*JorLViBP~7!N40HaeDZ{Z{N07QrK7fr(x%VLC=+ma3=ZkKO36c@y~`r zjyLr1!u!3dJ!dOjcxd#KzSxu|CDlIN@C+8=KLkO=uM7{uKIvdK?M`Gk z3wrO>s3v(x%^Yl*NAgfZ%lO;dUdjuDc5nQ}6#o_!eU;-cH7Y2cpMh2gnLTuQCofyb z2dbbvcg1*lhqBc4ue#%Vjh>)TtAJra=iCwS9LyKQT7n1m2`Q4;tDN6SzPGotZKtND zCwJBSN@&RqWru1^8?WAnk5Dhc+2pIG zS6Ev4UwMKX-&?!hNjHAYh*bO&cq>3aIthnoOErs1>50x54e5{T-1kR4fR}c1aws8< z=&CIP*#5c1PTnK(SGSPoMT z*3NW(R{V5FtK7ln>QH0n>`>$Uv-}U6#W%*Ek`y^R=ayw%9B2&yUSIqw*;|bVHo9%Oyn3K^3AuHvMq_9pK{=3{`zr=h zTq0`L4wEB|SO@Sg8Dd~ez#V$96DP9O`Y^O6BGMZ68gDOtAi^@5mVEXEw|_4t&~XT8 zUnicSTk~kHH zAlP}Ejg_9F4W^xKH(Kb;VTV4ZA1%Qw18Xf0TU~}l#+B}*M4N=g!tra)#32+iqQ>R0h|YV{`? z#WksrdrN!8fh^KnBxsbtG`QASE*J=z;*fzsLEpUG9n~fqd?-r-@pHOM%bMWPjHh^S z%%3Q;h`h-D2@q|Kj>Ts}(lD zyGwo5*c8(S>mDhT7-g*gPc6Va!@4)ix-YE4i2n_FZEAVbs;tMO#%)y?4XeL42d)eK zElWE@J~B{+xZZZtm9COFo%yNMO1D1*B6UXql`ejyE*n$FX};cZCTvN!8>sL1=UJ+I z&R>_kk38+)`AtbxH|b8~;snkBo7?e$Li$a9|LdwHdbz_IRw$0>*S3E>!b3xS$usG3uF=t%d@m*rjSCDMX8TVw+W_R10#hqhMR#W9u}cBc?x^OHWT`75 zg7}81j0F;1>wBbe@4Ab-mokYYOj?%nBTGVfv8F?8%#}(`<0VB!$#*R;@6HSHA_&j- zfzSoSgY^)WXIxfcH0X&c)2gEFy>kQA+JMu5O=lbjdc^vfF-tD1#Ftw?3lgfEz~BA3 z6EeB3zeWH$c=(P7kQj)Z{Z^<_Thiv7E~0Yr8(uZ~sIBi`)vOtN(0Z%nQ@b$NVN&w> zqIS?9wMRe#ZV|T@b%s{%x{Qgx^_*88ZSh;&bHMA5~S9`o?Y6#ef?*@z_2xz zFMUCo76OS^XQ-Ktwzh^s`u%;I9adqsRnma=oF?zp+euFd&v+bK@v!!}L+Ji1ip@A^ zHV)6e$*VD3r-%dk9S@G@EiTr_dt;`pbgj@R26x0gHur^022K+Jr^{SIhAW=@=dsFR zS46qTxO`hwnTVbmGBRPmjL1t23=zK;^`H4UNtXRxsJq{tm9`o`^~c8S0FDYbfPZ`s z!VVCv%+guG>u|(s*G3{S!(xt8OMOsI<+zP&BReU5N>q2T2^T3nvplUl&fK-NuFdYu zzcV-OA+$W)o0}%@Q%9SnL)=|cw{rt`XZ)*m-Z&a$Lm~Q-@PUX>B z-GnQ-fZ!ZlHNq^DY1hvGgS5Zz*n9!Wc5$;KC8&?I>(I_=pg?O5t4*yv;|(1AYhPhG z0__t??GQmH=)9R@5 zx8Caxh`!?bCI5eCXXg(#W-lI1f+Ti*T_+|ct_~Bw*xbC?F*h^A1x*B+zlVn}lWykT zdh|PluGyjJ;#6~|7}*1!ed8b|^Vq2h+!4giPNIT*8fC7BtLns}n!WuJPM3@R!n@8c zVOG?j*h3t$5zu5ni#VA2(?3fJ@Q@(QlG~Mk33qJa_P`iHP?n$lt)!}|@dxX$^4o>^ zc|ErCJ4zCw=6mh~!9##k^9^oXu#}&dcd&v_I$(z;ev-$!2ZMv6@=iwRrm=E=#Vln^ zSl~`{lA^5J(O45Zv|ygJaOX9qFY6`s4zSQ7Q_~XO1Au69vPMWqh{IS>^Xz^M5a0WP zEYne(K8A;TQQovROfS`}X;V&N7WZe?^;w1nfMq2M3Z+`^9z9bT)U0 zC%D-I%r+jG-yJ@Br*sr^a+j+JL4mMJ>%z z!Pm42w4u#VK6`5gRX*q70|CG6GGAan2M!##qc^Xz_69`{>TQ5s2K7F1Lb*{He%r55 z5LIxpEB#F?;KnO7Y4pQ-TlM~HVx{m^svHOWASsC>{IO3p7JihjemzCV(O&`T9N?4K z41Y25uSY%huiujEfXRLScb@jWT|?4&=A$~%b72VWvbuuzlgbyFH4OgkeYlqz;B8vH z7adDDUagZ2ALsdNS|8M_{9}PofL9_FEi7U{5e|$vkD>^f4m$q)IW^m!N4}p@=UWHV z`<1aeQt#K=X+9m?bKX7#wj2wf~%z1T;@Zn<&YP@?t>BD8Nx3B1SV=r=~Z=DsE zX0luX7&Se~@0HZYf7^BgwjlSkM0GhYg5F{e{pe_!8m;D!+hCxFudf`)F_ljd)iZyW z7xhM++(sQyDnh;TtzgCjjYG)-jmA@fo$Us>_8Tl1DYHuM%+V6LO? zXFu4NJm(cI^yyM)8SB1wp9_pZV$|P?)@yVj=(z< zi%fWi?oJ$EZ!}Tqho{fev)?hzQ9V%_dR!39Vw4o^FGrv`I5<8imyA=g^+nE|1&oM| z(E-){cN-@8hDP8z1b4n!syqN&&daY+mnOXIhlWo4wT{RZ#_Mu6o(wY_2XRie((j7! zt}CMY`i;+9-*L;2FC$&QGP?#y?AI`pWW+`5eEG!fo+h;AB&6!W4ck<)y zu81a*M_LLK54V?251>5d1|Qd-I7Q1PA*5uk-9?~7<}LhyQA;}bmRFoP3AP*1ipicb zoWh0Rmj_F8b-hHQxRtRbMMv>_kB-;E_GzO)+PGB6(`R?{6Xl`Tf>#Z1A=l%UAfk0^ z_Ss)8A~;y@kgj~8V$`GJ=O+tY{b(Pj~(etm-s9h zJKAsS@XO!9{JdtrTgv77`ntWXhR8#`A%c6_BD#uK!u4*7#sqA34qb0_)EB}v!$6VZ zje-8~wqt!uw;Dn(ePmThoyRZu1v_?Xk?2p~&D>}LIL12X3GDLG`nOuL605id3} zim!x}beUat6s2eNT^xr#tM@%?#bzut8AV*fY#N@R`8lwX96fi7;ntb)qa{`ICtMB9 z!Exy{iX~QDJQp&prkizHAq$5UhKQB87EW0)IOf5FCsXS!@gYzH5;PhOtNS2?ji z!CoJaFH}5#zP(+CSYoNU5-dnKO4duCGKr8ako1yo0=bcU^2|P^eaDLdCH#zP{1R?# z%%oFb`@Jr}K_fbwtsZgU&G6ulqeqZE^llzU-97z**Q_FLf-GAaC10AWo32s zQEI#}irnBlP{J3FPKp1rULPq+iv#F#ujjL|1V?u9tu3+Sho+`(-=fpLWjqAVBl@SK zAukwV`+GMFjk|Qc4L%HtFvt_C9(R5}_e9c(@L0w(dd`XG#Wl;7gH0kHvnM zIQ{x{phhH@-@2t$B(UABTsBvD=!=DTZcdW=P*(s$4!VCu`wIlpX}VlDwAHW99apf_--X z05&30FbYn<&dg>H%z3ib9gnIPasFtp5!_gRZ{K=F^zx<3RfF$%gvnkc_!k-S3&bq9 ziWC`TcQ;YVu+oiG)P%=^0PeL!c{!xx!%&*kOEsL^)HOHq+6Xd*x;4nxPcqck$FNQ& zL7Y8VSLkfw=RbE89xkMDd5F<7%k9iJ?(grTWL6t?*^Q;@CW|&<)SVG{H`|>O;h`O! z?IZ|fl>?eBNeHm6%JQOc8*R?rg7Roah^Uu|rj-g1r>0b|=^MKl0Dt7;NtbA=vn>&X z&t8>|5>{HMp(^2;ZdTvny|;XBza^MwFY%d6lK^~9ZojpWk*7lBqUY57dipQhE20`M z{n4u1hri2#u^S*lYRZqujQsrkhXY)GlT(RzEck*(q)U+nlQKz?;kpdq%=d@JI29%w zmgl7lQc%J0T+F?bdIwKC4(U1CxIA{ioD((z`1SmGQ%(0)m1oqopPx zeiwYcb2GVLu5tPK*8|W#;eXU#agi#zOY~_8!?Sl;nM+{|kVqt0xt~9Kv034qhQGT~ zHUSO1G{h3DRqVJnCk@TrH)j>VN7Y8V8Gr%RAOKiP|JOg61!n;-;Doxm(gVZ)%kTOB u&;GpvRM3?{rE(wLNC5|e_IOcG(eUwQh35{x1YBPl8g*qIr2>V=0sjHC0S3eX literal 45470 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 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. From 91664328ec8683f09f86b50e4a192b7f07d686b4 Mon Sep 17 00:00:00 2001 From: Ben Vinegar Date: Sun, 18 Oct 2026 23:38:09 -0400 Subject: [PATCH 2/3] test(ui): settle collector turns before reload retention assertions --- packages/hunk/src/ui/hooks/useTerminalReview.test.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/hunk/src/ui/hooks/useTerminalReview.test.tsx b/packages/hunk/src/ui/hooks/useTerminalReview.test.tsx index a1f60b990..a7f4173d3 100644 --- a/packages/hunk/src/ui/hooks/useTerminalReview.test.tsx +++ b/packages/hunk/src/ui/hooks/useTerminalReview.test.tsx @@ -533,7 +533,13 @@ describe("useTerminalReview", () => { } expect(expectValue(controllerRef.current).visibleFiles).toHaveLength(1); - Bun.gc(true); + + // Drain completed React jobs and deferred collector work without dereferencing the probes. + for (let collection = 0; collection < 3; collection += 1) { + await Bun.sleep(0); + Bun.gc(true); + } + const retainedEarlyReloads = reloadedFiles .slice(0, -4) .filter((reference) => reference.deref() !== undefined); From 0ade2843bdaf20a2d3e0cfbd1f2df6d09eebfbd6 Mon Sep 17 00:00:00 2001 From: Ben Vinegar Date: Sun, 18 Oct 2026 23:41:35 -0400 Subject: [PATCH 3/3] test(ui): isolate reload retention assertions from shared heap roots --- .../src/ui/hooks/useTerminalReview.test.tsx | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/hunk/src/ui/hooks/useTerminalReview.test.tsx b/packages/hunk/src/ui/hooks/useTerminalReview.test.tsx index a7f4173d3..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[] = []; @@ -533,13 +551,7 @@ describe("useTerminalReview", () => { } expect(expectValue(controllerRef.current).visibleFiles).toHaveLength(1); - - // Drain completed React jobs and deferred collector work without dereferencing the probes. - for (let collection = 0; collection < 3; collection += 1) { - await Bun.sleep(0); - Bun.gc(true); - } - + Bun.gc(true); const retainedEarlyReloads = reloadedFiles .slice(0, -4) .filter((reference) => reference.deref() !== undefined);