Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.3.0"
".": "0.4.0"
}
66 changes: 47 additions & 19 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,53 @@

## [Unreleased]

### Features

- `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))
- `: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))
- `: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))
- `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))
- `diff_opts.layout = "unified"`: a unified diff rendered in a single buffer with deleted (red/strikethrough) and added (green) lines interleaved, as a compact alternative to the two-pane `"vertical"`/`"horizontal"` layouts. Requires Neovim >= 0.9.0; the `ClaudeCodeInlineDiffAdd`/`Delete`/`AddSign`/`DeleteSign` highlight groups are customizable. ([#82](https://github.com/coder/claudecode.nvim/issues/82), [#195](https://github.com/coder/claudecode.nvim/pull/195), [#293](https://github.com/coder/claudecode.nvim/issues/293))

### Bug Fixes

- `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))
- 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))
- `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))
- 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))
- 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))
- 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))
- 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))
- 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))
- 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))
## [0.4.0] - 2026-06-23

### Added

- `: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. 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))
- `:checkhealth claudecode` health check that verifies Neovim version, `setup()`, the Claude CLI, the terminal provider, the WebSocket server, the lock file, and live client connection. ([#275](https://github.com/coder/claudecode.nvim/pull/275))
- `:ClaudeCodeCloseAllDiffs` command to close all pending Claude diffs at once; already-accepted-but-unwritten diffs are left intact so saved edits are never discarded. ([#261](https://github.com/coder/claudecode.nvim/pull/261), [#248](https://github.com/coder/claudecode.nvim/issues/248))
- `diff_opts.layout = "unified"`: a VS Code-style unified diff rendered in a single buffer with interleaved deleted (red/strikethrough) and added (green) lines, as a compact alternative to `"vertical"`/`"horizontal"`. Requires Neovim >= 0.9.0; `ClaudeCodeInlineDiffAdd`/`Delete`/`AddSign`/`DeleteSign` highlight groups are customizable. ([#195](https://github.com/coder/claudecode.nvim/pull/195), [#295](https://github.com/coder/claudecode.nvim/pull/295))
- `terminal.auto_insert` option (default `true`) controlling whether the Claude terminal auto-enters insert/terminal mode on focus; set `auto_insert = false` to preserve your Normal-mode scroll position. Applies to the `native`/`snacks` providers and the new-tab diff terminal. ([#233](https://github.com/coder/claudecode.nvim/pull/233))
- `terminal.diff_split_width_percentage` (optional terminal width while a diff is open), `diff_opts.auto_resize_terminal` (default `true`; set `false` to own the layout), and `User` autocmds `ClaudeCodeDiffOpened`/`ClaudeCodeDiffClosed` carrying data payloads. ([#270](https://github.com/coder/claudecode.nvim/pull/270))
- `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 focus a Claude session running outside Neovim (`provider = "none"`/`"external"`). ([#265](https://github.com/coder/claudecode.nvim/pull/265), [#228](https://github.com/coder/claudecode.nvim/issues/228))
- 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))
- snacks.nvim picker support for `:ClaudeCodeTreeAdd`/`:ClaudeCodeSend`: with a snacks picker list focused, the selected/highlighted file(s) are added to Claude's context. ([#269](https://github.com/coder/claudecode.nvim/pull/269), [#192](https://github.com/coder/claudecode.nvim/issues/192))
- Modernized model picker with evergreen labels (`Claude Opus (Latest)`, `Claude Sonnet (Latest)`, `Claude Haiku (Latest)`), 1M-context variants (`opus[1m]`/`sonnet[1m]`), and `Default (account recommended)`. ([#256](https://github.com/coder/claudecode.nvim/pull/256))

### Fixed

- Auth token for the IDE lock file is now generated from a CSPRNG (128-bit hex) and the lock file is written atomically with `0600` permissions in a `0700` directory (previously world-readable `0644`); handshake auth comparison is constant-time. ([#259](https://github.com/coder/claudecode.nvim/pull/259))
- The WebSocket server now closes connections on malformed frames (with the correct RFC 6455 close code) instead of stalling forever on un-drainable buffers. ([#258](https://github.com/coder/claudecode.nvim/pull/258))
- Parallel Neovim instances no longer fail to start with `EADDRINUSE`: port selection is re-seeded per process and the server retries the next candidate port on bind/listen failure. ([#284](https://github.com/coder/claudecode.nvim/pull/284), [#283](https://github.com/coder/claudecode.nvim/issues/283))
- `closeAllDiffTabs` is now scoped to claudecode's own diffs and no longer destroys an open diffview.nvim, fugitive, or native `:diffsplit` review; `openFile`/`openDiff` no longer reuse a window that is in diff mode. ([#290](https://github.com/coder/claudecode.nvim/pull/290), [#277](https://github.com/coder/claudecode.nvim/issues/277))
- The Claude terminal now excludes loopback hosts (`localhost`, `127.0.0.1`, `::1`) from `no_proxy`/`NO_PROXY`, so a configured proxy no longer tunnels Claude's `ws://127.0.0.1` IDE connection and times out @ mentions. ([#268](https://github.com/coder/claudecode.nvim/pull/268), [#70](https://github.com/coder/claudecode.nvim/issues/70))
- Rejecting a Claude diff with `:q`/`:close`/`<C-w>c`/closing the tab now resolves it as rejected via a new `WinClosed` autocmd. ([#266](https://github.com/coder/claudecode.nvim/pull/266))
- Quickly-made visual selections are now pushed to Claude reliably: selections are flushed synchronously on visual-mode exit and persist until the cursor moves, fixing single-line selections that previously never reached Claude (especially in the `/ide` external flow). ([#267](https://github.com/coder/claudecode.nvim/pull/267), [#246](https://github.com/coder/claudecode.nvim/issues/246))
- Diffs opened via `openDiff` 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), [#248](https://github.com/coder/claudecode.nvim/issues/248))
- 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))
- Fixed the "climbing cursor" in the Snacks terminal on hide/show toggle by parking floats via `nvim_win_set_config({hide=...})` and recreating splits like the native provider (float fix requires Neovim >= 0.10). ([#271](https://github.com/coder/claudecode.nvim/pull/271))
- Worked around a Neovim core bug (< 0.12.2) that fragmented large bracketed pastes into the terminal, via a version-gated `vim.paste` shim controlled by `terminal.fix_streamed_paste` (`"auto"` by default; no-op on Neovim >= 0.12.2). ([#252](https://github.com/coder/claudecode.nvim/pull/252))
- Prevented a segfault (exit 139) when accepting a new-file diff with render-markdown.nvim installed, by calling `diffoff` before Neovim's post-write redraw. ([#224](https://github.com/coder/claudecode.nvim/pull/224))
- Legacy `diff_opts.vertical_split`/`open_in_current_tab` options now apply correctly (they were silently ignored due to merge order). ([#142](https://github.com/coder/claudecode.nvim/pull/142))
- Detect system sleep/wake and reset keepalive timestamps so clients aren't falsely disconnected after a laptop wakes. ([#141](https://github.com/coder/claudecode.nvim/pull/141))
- IDE diagnostics now work when the tool is called with a bare file path instead of a `file://` URI. ([#163](https://github.com/coder/claudecode.nvim/pull/163))
- `getDiagnostics` returns grouped URI-based payloads with editor-native ranges and severity names; the unsupported resources capability is no longer advertised; background file opens preserve focus and serialize JSON compactly. ([#274](https://github.com/coder/claudecode.nvim/pull/274))
- Selection context is now also sent on `BufEnter`, so switching buffers without moving the cursor updates Claude. ([#159](https://github.com/coder/claudecode.nvim/pull/159))
- Selection-context fallback for third-party (`provider = "none"`) terminals now matches by substring, since Neovim rewrites buffer names to paths/URLs. ([#160](https://github.com/coder/claudecode.nvim/pull/160))
- `ClaudeCodeSend` now classifies tree/explorer 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), [#289](https://github.com/coder/claudecode.nvim/issues/289))
- Handle `$` in file paths for `:ClaudeCodeAdd` and the `openFile` tool. ([#286](https://github.com/coder/claudecode.nvim/pull/286))
- Snacks Explorer and snacks picker windows are no longer mistaken for the main editor window when opening diffs, preventing corrupted explorer layouts. ([#255](https://github.com/coder/claudecode.nvim/pull/255), [#165](https://github.com/coder/claudecode.nvim/pull/165))
- Fixed a Snacks launch failure caused by shell-glob interpretation of model aliases like `opus[1m]`; the command is now passed as an argv list with no shell. ([#256](https://github.com/coder/claudecode.nvim/pull/256))
- `keep_terminal_focus` now works for floating Claude terminals (e.g. Snacks `position="float"`). ([#178](https://github.com/coder/claudecode.nvim/pull/178))
- Plugin-created diff splits are now closed deterministically on cleanup, and a stranded empty tab is closed if `open_in_new_tab` diff setup errors. ([#175](https://github.com/coder/claudecode.nvim/pull/175), [#264](https://github.com/coder/claudecode.nvim/pull/264))
- An empty scratch buffer left over when the terminal provider is `none` is now wiped on diff open. ([#223](https://github.com/coder/claudecode.nvim/pull/223))
- Updated Haiku to the 4.5 model version. ([#146](https://github.com/coder/claudecode.nvim/pull/146))

### Changed

- The diff layout value `"inline"` (added in #195, never released) was renamed to `"unified"`; the old value is rejected. ([#295](https://github.com/coder/claudecode.nvim/pull/295))

## [0.3.0] - 2025-09-15

Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.3.0
0.4.0
Loading