|
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 verifies your setup (Neovim version, `setup()` called, Claude CLI on PATH, terminal provider sanity, WebSocket server, lock file, and live connection state) with actionable advice on each failure ([#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; `:ClaudeCodeSendText!` inserts without submitting. Multi-line text uses bracketed paste. Works with the 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 accepted but whose file has not been written yet 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 external-terminal users focus their own Claude session (e.g. via `tmux select-pane`) ([#265](https://github.com/coder/claudecode.nvim/pull/265)). |
| 13 | +- `User ClaudeCodeDiffOpened` / `ClaudeCodeDiffClosed` autocmds, plus `terminal.diff_split_width_percentage` and `diff_opts.auto_resize_terminal` for controlling Claude terminal width across the diff lifecycle ([#270](https://github.com/coder/claudecode.nvim/pull/270)). |
| 14 | +- `:ClaudeCodeTreeAdd` / `:ClaudeCodeSend` support in snacks.nvim pickers (`snacks_picker_list`), adding selected files to Claude's context ([#269](https://github.com/coder/claudecode.nvim/pull/269)). |
| 15 | +- netrw file selection support: `<leader>as` in netrw buffers adds marked or cursor files to Claude's 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 (Latest)`, etc.), added 1M-context variants (`opus[1m]`/`sonnet[1m]`) and a `Default (account recommended)` option ([#256](https://github.com/coder/claudecode.nvim/pull/256)). |
| 20 | + |
| 21 | +### Fixed |
| 22 | + |
| 23 | +- Snacks terminal failed to launch with the 1M-context model aliases because the shell interpreted `[ ]` as a glob; the launch command is now passed as an argv list with no shell interpretation ([#256](https://github.com/coder/claudecode.nvim/pull/256)). |
| 24 | +- Hardened IDE auth: the WebSocket token is now generated from a CSPRNG and the lock file is written atomically with `0600` permissions in a `0700` directory ([#259](https://github.com/coder/claudecode.nvim/pull/259)). |
| 25 | +- A second Neovim instance no longer fails with `EADDRINUSE`; the server retries port binding so parallel instances start on different ports ([#284](https://github.com/coder/claudecode.nvim/pull/284)). |
| 26 | +- Malformed WebSocket frames now close the connection with the correct RFC 6455 status code instead of wedging the connection forever ([#258](https://github.com/coder/claudecode.nvim/pull/258)). |
| 27 | +- Waking a laptop from sleep no longer triggers false keepalive disconnects ([#141](https://github.com/coder/claudecode.nvim/pull/141)). |
| 28 | +- Disconnect callbacks now fire on all teardown paths (EOF, errors, timeouts), preventing phantom clients ([#176](https://github.com/coder/claudecode.nvim/pull/176)). |
| 29 | +- `getDiagnostics` and `openFile` IDE tool calls now accept a bare file path without a `file://` scheme, and diagnostics are returned grouped by URI with editor-native ranges and severity names ([#163](https://github.com/coder/claudecode.nvim/pull/163), [#274](https://github.com/coder/claudecode.nvim/pull/274)). |
| 30 | +- Legacy `diff_opts` keys `vertical_split` and `open_in_current_tab` now apply correctly ([#142](https://github.com/coder/claudecode.nvim/pull/142)). |
| 31 | +- Quickly-made visual selections are now reliably pushed to Claude, flushed synchronously on visual-mode exit ([#267](https://github.com/coder/claudecode.nvim/pull/267)). |
| 32 | +- Selection context is now also sent on `BufEnter` ([#159](https://github.com/coder/claudecode.nvim/pull/159)) and `provider = "none"` terminals are correctly skipped via substring matching ([#160](https://github.com/coder/claudecode.nvim/pull/160)). |
| 33 | +- Selection debounce timers are now stopped and closed safely, fixing a libuv handle leak and stale callbacks ([#245](https://github.com/coder/claudecode.nvim/pull/245)). |
| 34 | +- Diffs now open when the Claude terminal is the only window ([#260](https://github.com/coder/claudecode.nvim/pull/260)), reject correctly via `:q` ([#266](https://github.com/coder/claudecode.nvim/pull/266)), auto-close when the client disconnects or the server stops ([#261](https://github.com/coder/claudecode.nvim/pull/261)), close plugin-created splits on cleanup ([#175](https://github.com/coder/claudecode.nvim/pull/175)), and no longer strand an empty tab when `open_in_new_tab` setup errors ([#264](https://github.com/coder/claudecode.nvim/pull/264)). |
| 35 | +- Diff window detection no longer targets snacks picker lists ([#165](https://github.com/coder/claudecode.nvim/pull/165)) or the Snacks Explorer layout box ([#255](https://github.com/coder/claudecode.nvim/pull/255)), fixing corrupted explorer/diff layouts. |
| 36 | +- `keep_terminal_focus` now works for floating Claude terminals ([#178](https://github.com/coder/claudecode.nvim/pull/178)). |
| 37 | +- Fixed the "climbing cursor" in the Snacks terminal on hide/show toggle so typed text lands on the right line ([#271](https://github.com/coder/claudecode.nvim/pull/271)). |
| 38 | +- Worked around a Neovim core bug (< 0.12.2) that fragmented large bracketed pastes; controlled by `terminal.fix_streamed_paste` (`"auto"` by default) ([#252](https://github.com/coder/claudecode.nvim/pull/252)). |
| 39 | +- Loopback hosts are now excluded from `no_proxy`/`NO_PROXY` so a configured proxy no longer breaks Claude's `ws://127.0.0.1` IDE connection ([#268](https://github.com/coder/claudecode.nvim/pull/268)). |
| 40 | +- `:ClaudeCodeSend` now classifies tree buffers by filetype only, so ordinary files whose path contains `neo-tree`/`NvimTree` are no longer misrouted ([#292](https://github.com/coder/claudecode.nvim/pull/292)). |
| 41 | +- A one-time setup warning is now emitted when `focus_after_send = true` with `provider = "none"`/`"external"`, where focus cannot move ([#265](https://github.com/coder/claudecode.nvim/pull/265)). |
22 | 42 |
|
23 | 43 | ## [0.3.0] - 2025-09-15 |
24 | 44 |
|
|
0 commit comments