|
2 | 2 |
|
3 | 3 | ## [Unreleased] |
4 | 4 |
|
5 | | -### Features |
6 | | - |
7 | | -- `User ClaudeCodeSendComplete` autocmd, fired once per file when a send is accepted while Claude is connected, with `data = { file_path, start_line, end_line, context }` (lines 0-indexed). Lets you run arbitrary post-send logic — in particular, focus a Claude session running outside Neovim (`provider = "none"`/`"external"`), e.g. via `tmux select-pane`, which `focus_after_send` cannot do. ([#228](https://github.com/coder/claudecode.nvim/issues/228)) |
8 | | -- `:ClaudeCodeCloseAllDiffs` command to close pending Claude diffs at once (e.g. proposals orphaned by resolving them via Claude remote control). Diffs you have already accepted but whose file has not been written yet are left intact so saved edits are never discarded. ([#248](https://github.com/coder/claudecode.nvim/issues/248)) |
9 | | -- `:ClaudeCodeSendText {text}` command (and `require("claudecode.terminal").send_to_terminal(text, opts)` function) to send arbitrary text to the open Claude terminal as if typed at the prompt, submitting it by default. `:ClaudeCodeSendText!` inserts the text without submitting. Handy for scripting and keymaps; multi-line text is sent via bracketed paste. Works with the in-editor `native`/`snacks` providers only — `external`/`none` run Claude outside Neovim, where there is no pane to write to. ([#197](https://github.com/coder/claudecode.nvim/issues/197)) |
10 | | - |
11 | | -### Bug Fixes |
12 | | - |
13 | | -- `closeAllDiffTabs` no longer destroys diffs it does not own. It previously closed every window with `&diff` set and force-deleted any buffer named like `*.diff`/`diff://`/`fugitive://`, so an open diffview.nvim, fugitive, or native `:diffsplit` review was wiped out — and because the Claude CLI calls this tool at the start of every turn, it happened on essentially every prompt. The tool is now scoped to claudecode's own tracked diffs (matching the official VS Code extension, which only closes the tabs it labelled). Relatedly, `openFile`/`openDiff` no longer reuse a window that is in diff mode, which previously `:edit`-ed over one side of an unrelated diff and broke its layout. ([#277](https://github.com/coder/claudecode.nvim/issues/277)) |
14 | | -- The Claude terminal now adds the loopback hosts (`localhost`, `127.0.0.1`, `::1`) to `no_proxy`/`NO_PROXY`, so a configured `http_proxy`/`all_proxy` no longer tunnels Claude's `ws://127.0.0.1` IDE connection and causes queued @ mentions to time out. Existing `no_proxy` exclusions are preserved. ([#70](https://github.com/coder/claudecode.nvim/issues/70)) |
15 | | -- `focus_after_send = true` no longer fails silently with `terminal.provider = "none"`/`"external"`: those providers run Claude outside Neovim, so focus cannot move there. A one-time warning is now emitted at setup pointing to the new `User ClaudeCodeSendComplete` autocmd, which you can hook to focus your own terminal. (`focus_after_send` still only auto-focuses the in-editor providers.) ([#228](https://github.com/coder/claudecode.nvim/issues/228)) |
16 | | -- Rejecting a Claude diff with `:q` (or `:close` / `<C-w>c` / closing the tab) now resolves it as rejected, matching the documented behavior. The proposed buffer is a scratch buffer that `:q` only hides, so the existing `BufDelete`/`BufUnload`/`BufWipeout` autocmds never fired; a `WinClosed` autocmd now handles window-close rejection. ([#238](https://github.com/coder/claudecode.nvim/issues/238)) |
17 | | -- Push quickly-made visual selections to Claude reliably. Selections made and released faster than the selection-tracking debounce were never broadcast, and any selection was wiped shortly after leaving visual mode when Claude runs in an external terminal (the `/ide` flow) — so single-line selections in particular often never reached Claude. Selections are now flushed synchronously on visual-mode exit (from the `'<`/`'>` marks) and persist until the cursor actually moves; a single-line linewise `V` made right after a charwise selection is also no longer mis-extracted to a single character. ([#246](https://github.com/coder/claudecode.nvim/issues/246)) |
18 | | -- Diffs opened via `openDiff` no longer linger forever when they are resolved outside this Neovim or their Claude session goes away. Pending diffs are now automatically closed when the client that opened them disconnects or the integration is stopped, and `closeAllDiffTabs` now also resolves/cleans the diff module's tracked state instead of only closing windows. ([#248](https://github.com/coder/claudecode.nvim/issues/248)) |
19 | | -- Show diffs when the Claude Code terminal is the only window (no other splits). Previously `openDiff` failed with "No suitable editor window found"; now a split is created to host the diff, matching the behavior of the `openFile` tool. ([#231](https://github.com/coder/claudecode.nvim/issues/231)) |
20 | | -- Fix the "climbing cursor" in the Snacks terminal: hiding and re-showing the Claude panel no longer leaves the cursor one row above the prompt (so typed text lands on the wrong line). The Snacks provider now hides/shows without destroying the window — floats are parked via `nvim_win_set_config({hide=...})` and splits are recreated like the native provider — which preserves the cursor anchor Claude re-renders against on focus-in. Splits are fixed on all supported Neovim versions; the float fix requires Neovim >= 0.10. ([#240](https://github.com/coder/claudecode.nvim/issues/240), [#183](https://github.com/coder/claudecode.nvim/issues/183)) |
21 | | -- Work around a Neovim core bug (< 0.12.2) that fragmented large bracketed pastes into the terminal across `vim.paste` phases, making Cmd+V appear to truncate content. Added a scoped, version-gated `vim.paste` shim controlled by `terminal.fix_streamed_paste` (`"auto"` by default; no-op on Neovim >= 0.12.2). ([#161](https://github.com/coder/claudecode.nvim/issues/161)) |
| 5 | +## [0.4.0] - 2026-06-22 |
| 6 | + |
| 7 | +### Added |
| 8 | + |
| 9 | +- `:checkhealth claudecode` health check that diagnoses your setup: Neovim version, `setup()` status, Claude CLI resolution, terminal provider sanity, WebSocket server/port, lock file presence, and live client connection ([#275](https://github.com/coder/claudecode.nvim/pull/275)). |
| 10 | +- `:ClaudeCodeSendText {text}` command (and `require("claudecode.terminal").send_to_terminal(text, opts)`) to send arbitrary text to the open Claude terminal as if typed at the prompt, submitting by default; `:ClaudeCodeSendText!` inserts without submitting. Multi-line text is sent via bracketed paste. In-editor (`native`/`snacks`) providers only ([#272](https://github.com/coder/claudecode.nvim/pull/272)). |
| 11 | +- `:ClaudeCodeCloseAllDiffs` command to close pending Claude diffs at once; diffs you have already accepted but not yet written are left intact ([#261](https://github.com/coder/claudecode.nvim/pull/261)). |
| 12 | +- `User ClaudeCodeSendComplete` autocmd, fired once per file when a send is accepted while Claude is connected, with `data = { file_path, start_line, end_line, context }` (lines 0-indexed). Lets you focus an out-of-editor Claude session (`provider = "none"`/`"external"`), e.g. via `tmux select-pane` ([#265](https://github.com/coder/claudecode.nvim/pull/265)). |
| 13 | +- `User ClaudeCodeDiffOpened` / `ClaudeCodeDiffClosed` autocmds carrying diff metadata, plus `diff_opts.auto_resize_terminal` (default `true`) opt-out and `terminal.diff_split_width_percentage` for a separate terminal width while a diff is open ([#270](https://github.com/coder/claudecode.nvim/pull/270)). |
| 14 | +- `:ClaudeCodeTreeAdd` support for snacks.nvim pickers and Snacks Explorer ([#269](https://github.com/coder/claudecode.nvim/pull/269)). |
| 15 | +- netrw file selection support (`<leader>as` adds marked/cursor files to Claude context) ([#62](https://github.com/coder/claudecode.nvim/pull/62)). |
| 16 | + |
| 17 | +### Changed |
| 18 | + |
| 19 | +- Modernized the `:ClaudeCodeSelectModel` picker with evergreen, version-free labels (`Claude Opus/Sonnet/Haiku (Latest)`), added 1M-context variants (`opus[1m]`, `sonnet[1m]`) and a `Default (account recommended)` option ([#256](https://github.com/coder/claudecode.nvim/pull/256)). |
| 20 | +- The IDE auth token is now generated from a cryptographically secure RNG and the lock file is written atomically with `0600` permissions in a `0700` directory ([#259](https://github.com/coder/claudecode.nvim/pull/259)). |
| 21 | + |
| 22 | +### Fixed |
| 23 | + |
| 24 | +- `closeAllDiffTabs` no longer destroys diffs it doesn't own (diffview.nvim, fugitive, native `:diffsplit`); it is now scoped to claudecode's own tracked diffs, and `openFile`/`openDiff` no longer reuse a window in diff mode ([#290](https://github.com/coder/claudecode.nvim/pull/290)). |
| 25 | +- Rejecting a Claude diff with `:q` / `:close` / `<C-w>c` now correctly resolves it as rejected via a new `WinClosed` autocmd ([#266](https://github.com/coder/claudecode.nvim/pull/266)). |
| 26 | +- Pending diffs are now auto-closed when the client that opened them disconnects or the integration stops, so diffs resolved outside this Neovim no longer leak windows ([#261](https://github.com/coder/claudecode.nvim/pull/261)). |
| 27 | +- Diffs now open when the Claude terminal is the only window instead of failing with "No suitable editor window found" ([#260](https://github.com/coder/claudecode.nvim/pull/260)). |
| 28 | +- The Snacks Explorer layout box is excluded from main-editor-window detection, so diffs no longer corrupt the explorer sidebar ([#255](https://github.com/coder/claudecode.nvim/pull/255)); `snacks_picker_list` is likewise excluded ([#165](https://github.com/coder/claudecode.nvim/pull/165)). |
| 29 | +- `keep_terminal_focus` now works for floating Claude terminals ([#178](https://github.com/coder/claudecode.nvim/pull/178)). |
| 30 | +- Plugin-created diff splits are now closed on cleanup instead of lingering ([#175](https://github.com/coder/claudecode.nvim/pull/175)); a stranded empty tab is closed when an `open_in_new_tab` diff errors during setup ([#264](https://github.com/coder/claudecode.nvim/pull/264)). |
| 31 | +- Fixed the "climbing cursor" in the Snacks terminal on hide/show toggle, for both splits and floats ([#271](https://github.com/coder/claudecode.nvim/pull/271)). |
| 32 | +- Worked around a Neovim core bug (< 0.12.2) that fragmented large bracketed pastes into the terminal, gated by `terminal.fix_streamed_paste` (`"auto"` by default) ([#252](https://github.com/coder/claudecode.nvim/pull/252)). |
| 33 | +- The Claude terminal now adds loopback hosts to `no_proxy`/`NO_PROXY` so a configured proxy no longer tunnels Claude's `ws://127.0.0.1` IDE connection ([#268](https://github.com/coder/claudecode.nvim/pull/268)). |
| 34 | +- Legacy `diff_opts.vertical_split` and `open_in_current_tab` options now apply correctly ([#142](https://github.com/coder/claudecode.nvim/pull/142)). |
| 35 | +- Quickly-made visual selections (including single-line) are now flushed synchronously on visual-mode exit and persist until the cursor moves ([#267](https://github.com/coder/claudecode.nvim/pull/267)). |
| 36 | +- Selection context is now also sent on `BufEnter` ([#159](https://github.com/coder/claudecode.nvim/pull/159)); third-party terminal (`provider = "none"`) buffers are detected via substring match for the selection fallback ([#160](https://github.com/coder/claudecode.nvim/pull/160)); debounce timers are stopped and closed safely ([#245](https://github.com/coder/claudecode.nvim/pull/245)). |
| 37 | +- `getDiagnostics` now accepts a bare file path (not just a `file://` URI) ([#163](https://github.com/coder/claudecode.nvim/pull/163)); IDE diagnostic responses now return grouped, URI-based payloads with editor-native ranges and severity names, the unsupported resources capability is no longer advertised, and background file opens preserve focus ([#274](https://github.com/coder/claudecode.nvim/pull/274)). |
| 38 | +- `ClaudeCodeSend` no longer misroutes ordinary files whose path merely contains a tree-explorer name (e.g. `_neo-tree_.lua`); tree buffers are classified by filetype only ([#292](https://github.com/coder/claudecode.nvim/pull/292)). |
| 39 | +- System sleep is now detected so waking from sleep no longer triggers false keepalive disconnects ([#141](https://github.com/coder/claudecode.nvim/pull/141)). |
| 40 | +- The WebSocket server now closes connections on malformed frames instead of stalling ([#258](https://github.com/coder/claudecode.nvim/pull/258)), retries port binding on `EADDRINUSE` so parallel Neovim instances start on different ports ([#284](https://github.com/coder/claudecode.nvim/pull/284)), and fires disconnect callbacks consistently to avoid phantom-client state ([#176](https://github.com/coder/claudecode.nvim/pull/176)). |
| 41 | +- `focus_after_send = true` now emits a one-time warning under `provider = "none"`/`"external"`, pointing at the new `ClaudeCodeSendComplete` event ([#265](https://github.com/coder/claudecode.nvim/pull/265)). |
| 42 | +- Bumped the Haiku model to its current latest version ([#146](https://github.com/coder/claudecode.nvim/pull/146)). |
22 | 43 |
|
23 | 44 | ## [0.3.0] - 2025-09-15 |
24 | 45 |
|
|
0 commit comments