|
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 | | -- `terminal.auto_insert` option (default `true`) controlling whether the Claude terminal auto-enters insert/terminal mode when its window gains focus. With the default Snacks provider, switching back into the terminal window (e.g. `<C-w>l`) previously re-entered terminal mode and jumped to the bottom prompt, discarding your Normal-mode scroll/reading position; set `auto_insert = false` to stay in Normal mode and preserve the scroll position (press `i` to type). Applies to the `native` and `snacks` providers and the new-tab diff terminal. ([#232](https://github.com/coder/claudecode.nvim/issues/232), [#145](https://github.com/coder/claudecode.nvim/issues/145)) |
| 5 | +## [0.4.0] - 2026-06-23 |
| 6 | + |
| 7 | +### Added |
| 8 | + |
| 9 | +- `: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 (submits by default; `:ClaudeCodeSendText!` inserts without submitting; multi-line uses bracketed paste). Works with the in-editor `native`/`snacks` providers only. ([#272](https://github.com/coder/claudecode.nvim/pull/272), [#197](https://github.com/coder/claudecode.nvim/issues/197)) |
| 10 | +- `layout = "inline"` for `diff_opts`, a VS Code-style unified diff rendered in a single read-only buffer with interleaved added/deleted lines (requires Neovim >= 0.9). Highlight groups `ClaudeCodeInlineDiffAdd`/`Delete`/`AddSign`/`DeleteSign` are customizable. ([#195](https://github.com/coder/claudecode.nvim/pull/195)) |
| 11 | +- `:checkhealth claudecode` health check that verifies Neovim version, `setup()`, the Claude CLI, terminal provider, WebSocket server, lock file, and live client connection. ([#275](https://github.com/coder/claudecode.nvim/pull/275)) |
| 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 }` (0-indexed lines) — lets you run post-send logic such as focusing a Claude session outside Neovim. ([#265](https://github.com/coder/claudecode.nvim/pull/265), [#228](https://github.com/coder/claudecode.nvim/issues/228)) |
| 13 | +- `User ClaudeCodeDiffOpened` / `ClaudeCodeDiffClosed` autocmds carrying diff metadata so configs can react to diffs opening/closing without monkey-patching. ([#270](https://github.com/coder/claudecode.nvim/pull/270)) |
| 14 | +- `terminal.diff_split_width_percentage` to set a separate terminal width while a diff is open (falls back to `split_width_percentage`), plus `diff_opts.auto_resize_terminal` (default `true`) to opt out of automatic terminal resizing. ([#270](https://github.com/coder/claudecode.nvim/pull/270)) |
| 15 | +- `terminal.auto_insert` option (default `true`) controlling whether the Claude terminal auto-enters insert/terminal mode on focus; set to `false` to preserve your Normal-mode scroll position. ([#233](https://github.com/coder/claudecode.nvim/pull/233)) |
| 16 | +- `:ClaudeCodeCloseAllDiffs` command to close all pending Claude diffs at once; already-accepted-but-unwritten diffs are left intact. ([#261](https://github.com/coder/claudecode.nvim/pull/261), [#248](https://github.com/coder/claudecode.nvim/issues/248)) |
| 17 | +- netrw file selection: `<leader>as` in a netrw buffer adds marked files (or the file under the cursor) to Claude's context. ([#62](https://github.com/coder/claudecode.nvim/pull/62)) |
| 18 | +- `:ClaudeCodeTreeAdd` / `:ClaudeCodeSend` support for snacks.nvim pickers (`Snacks.explorer()` and modal pickers via the `snacks_picker_list` filetype). ([#269](https://github.com/coder/claudecode.nvim/pull/269), [#192](https://github.com/coder/claudecode.nvim/issues/192)) |
| 19 | + |
| 20 | +### Changed |
| 21 | + |
| 22 | +- Modernized the `:ClaudeCodeSelectModel` picker with version-free, evergreen labels (`Claude Opus (Latest)`, `Claude Sonnet (Latest)`, `Claude Haiku (Latest)`), added 1M-context variants (`opus[1m]`/`sonnet[1m]`) and a `Default (account recommended)` entry. ([#256](https://github.com/coder/claudecode.nvim/pull/256), [#146](https://github.com/coder/claudecode.nvim/pull/146)) |
| 23 | +- IDE diagnostics now return grouped, URI-keyed payloads with editor-native ranges and severity names; the server no longer advertises an unsupported resources capability and serializes tool JSON compactly. ([#274](https://github.com/coder/claudecode.nvim/pull/274)) |
| 24 | +- The lock file is now written atomically with `0600` permissions in a `0700` directory, and the WebSocket auth token is generated from a CSPRNG (128-bit hex) instead of a seeded PRNG. ([#259](https://github.com/coder/claudecode.nvim/pull/259)) |
| 25 | + |
| 26 | +### Fixed |
| 27 | + |
| 28 | +- The Snacks launcher passes the model command as an argv list instead of a shell string, so 1M-context aliases like `opus[1m]` (which the shell treats as a glob) no longer prevent Claude from launching. ([#256](https://github.com/coder/claudecode.nvim/pull/256)) |
| 29 | +- `closeAllDiffTabs` is now scoped to claudecode's own tracked diffs; it no longer wipes out an open diffview.nvim/fugitive/`:diffsplit` review, and `openFile`/`openDiff` no longer reuse a window already in diff mode. ([#290](https://github.com/coder/claudecode.nvim/pull/290), [#277](https://github.com/coder/claudecode.nvim/issues/277)) |
| 30 | +- The Claude terminal adds loopback hosts to `no_proxy`/`NO_PROXY`, so a configured proxy no longer tunnels Claude's `ws://127.0.0.1` IDE connection and causes @ mentions to time out. ([#268](https://github.com/coder/claudecode.nvim/pull/268), [#70](https://github.com/coder/claudecode.nvim/issues/70)) |
| 31 | +- Rejecting a Claude diff with `:q`/`:close`/`<C-w>c` (or closing the tab) now resolves it as rejected via a new `WinClosed` handler. ([#266](https://github.com/coder/claudecode.nvim/pull/266)) |
| 32 | +- Quickly-made visual selections are now flushed synchronously on visual-mode exit and persist until the cursor moves, so short and single-line selections reliably reach Claude; selection context is also sent on `BufEnter`. ([#267](https://github.com/coder/claudecode.nvim/pull/267), [#246](https://github.com/coder/claudecode.nvim/issues/246), [#159](https://github.com/coder/claudecode.nvim/pull/159)) |
| 33 | +- Pending `openDiff` diffs are now auto-closed when the client that opened them disconnects or the integration stops, instead of lingering forever. ([#261](https://github.com/coder/claudecode.nvim/pull/261), [#260](https://github.com/coder/claudecode.nvim/pull/260)) |
| 34 | +- Diffs now open when the Claude terminal is the only window by creating a split, instead of failing with "No suitable editor window found". ([#260](https://github.com/coder/claudecode.nvim/pull/260)) |
| 35 | +- A stranded empty tab is no longer left behind (and focus returns to the original tab) when an `open_in_new_tab` diff errors during setup. ([#264](https://github.com/coder/claudecode.nvim/pull/264)) |
| 36 | +- The Snacks terminal no longer leaves a "climbing cursor" one row above the prompt after hide/show toggling; floats are parked via `nvim_win_set_config({hide=...})` and splits are recreated (float fix requires Neovim >= 0.10). ([#271](https://github.com/coder/claudecode.nvim/pull/271), [#240](https://github.com/coder/claudecode.nvim/issues/240), [#183](https://github.com/coder/claudecode.nvim/issues/183)) |
| 37 | +- Worked around a Neovim core bug (< 0.12.2) that fragmented large bracketed pastes into the terminal; a version-gated `vim.paste` shim is controlled by `terminal.fix_streamed_paste` (`"auto"` by default, no-op on >= 0.12.2). ([#252](https://github.com/coder/claudecode.nvim/pull/252)) |
| 38 | +- `keep_terminal_focus = true` now restores focus to a floating Claude terminal after a diff opens, instead of leaving focus on the hidden diff split. ([#178](https://github.com/coder/claudecode.nvim/pull/178)) |
| 39 | +- Legacy diff options `vertical_split` and `open_in_current_tab` are applied correctly again (they were silently ignored after merging with defaults). ([#142](https://github.com/coder/claudecode.nvim/pull/142)) |
| 40 | +- IDE diagnostics tool calls that pass a bare file path (no `file://` URI) no longer error. ([#163](https://github.com/coder/claudecode.nvim/pull/163)) |
| 41 | +- `ClaudeCodeAdd` and the `openFile` tool now handle `$` in file paths. ([#286](https://github.com/coder/claudecode.nvim/pull/286)) |
| 42 | +- `:ClaudeCodeSend` classifies tree/explorer buffers by filetype only, so an ordinary file whose path contains `neo-tree`/`NvimTree` is no longer misrouted into tree extraction. ([#292](https://github.com/coder/claudecode.nvim/pull/292)) |
| 43 | +- A second Neovim instance now starts reliably: the server seeds the PRNG per process and retries port binding on `EADDRINUSE` across candidate ports. ([#284](https://github.com/coder/claudecode.nvim/pull/284)) |
| 44 | +- Malformed WebSocket frames now close the connection with the correct RFC 6455 status code instead of stalling with un-drainable buffered bytes. ([#258](https://github.com/coder/claudecode.nvim/pull/258)) |
| 45 | +- Disconnect callbacks (`on_disconnect`) now fire on all teardown paths (EOF, read/protocol errors, CLOSE frames, keepalive timeouts), preventing phantom clients. ([#176](https://github.com/coder/claudecode.nvim/pull/176)) |
| 46 | +- Waking from system sleep no longer triggers false keepalive timeouts and disconnections. ([#141](https://github.com/coder/claudecode.nvim/pull/141)) |
| 47 | +- IDE tool responses are hardened: background file opens ignore empty text anchors, preserve focus, and return metadata from the target buffer. ([#274](https://github.com/coder/claudecode.nvim/pull/274)) |
| 48 | +- Plugin-created diff splits are closed deterministically on cleanup instead of accumulating. ([#175](https://github.com/coder/claudecode.nvim/pull/175)) |
| 49 | +- The empty scratch buffer is wiped when opening a new-tab diff with `terminal.provider = "none"`. ([#223](https://github.com/coder/claudecode.nvim/pull/223)) |
| 50 | +- `snacks_picker_list` is excluded from main-editor-window detection so diffs open in a split when a Snacks picker (or Explorer layout box) is focused. ([#165](https://github.com/coder/claudecode.nvim/pull/165), [#255](https://github.com/coder/claudecode.nvim/pull/255)) |
| 51 | +- Third-party (`provider = "none"`) terminals are correctly skipped for selection context via a substring buffer-name check. ([#160](https://github.com/coder/claudecode.nvim/pull/160)) |
11 | 52 |
|
12 | | -### Bug Fixes |
| 53 | +### Documentation |
13 | 54 |
|
14 | | -- `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)) |
15 | | -- 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)) |
16 | | -- `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)) |
17 | | -- 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)) |
18 | | -- 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)) |
19 | | -- 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)) |
20 | | -- 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)) |
21 | | -- 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)) |
22 | | -- 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)) |
| 55 | +- README documents `cmd` triggers for the lazy.nvim spec so `:ClaudeCode` loads on demand, and adds IDE launch instructions for `provider = "none"`. ([#263](https://github.com/coder/claudecode.nvim/pull/263), [#157](https://github.com/coder/claudecode.nvim/pull/157)) |
23 | 56 |
|
24 | 57 | ## [0.3.0] - 2025-09-15 |
25 | 58 |
|
|
0 commit comments