Skip to content

chore(release): 0.4.0 - #279

Open
github-actions[bot] wants to merge 1 commit into
mainfrom
release-please--branches--main
Open

github-actions[bot] wants to merge 1 commit into
mainfrom
release-please--branches--main

Conversation

@github-actions

@github-actions github-actions Bot commented Jun 15, 2026 •

Copy link
Copy Markdown

The next claudecode.nvim release. Merging this PR creates the release tag and GitHub Release, then starts Communique GitHub Release note generation.

[0.4.0] - 2026-10-24

Added

  • :ClaudeCodeSendText {text} command and require("claudecode.terminal").send_to_terminal(text, opts) to send arbitrary text to the open Claude pane as if typed at the prompt; :ClaudeCodeSendText! inserts without submitting. In-editor providers (native/snacks) only. (#272)
  • 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 session (e.g. via tmux select-pane). (#265)
  • :ClaudeCodeCloseAllDiffs command to close pending Claude diffs at once; already-accepted-but-unwritten diffs are left intact. (#261)
  • :checkhealth claudecode health check covering Neovim version, setup(), Claude CLI resolution, terminal provider, WebSocket server, lock file, and client connection. (#275)
  • diff_opts.layout = "unified": a VS Code-style unified diff rendered in a single buffer with deleted and added lines interleaved; customizable ClaudeCodeInlineDiff* highlight groups. Requires Neovim >= 0.9.0. (#195, #295, #297)
  • terminal.auto_insert option (default true): set to false to stay in Normal mode when refocusing the Claude terminal, preserving scroll position. (#233)
  • terminal.diff_split_width_percentage and diff_opts.auto_resize_terminal, plus User ClaudeCodeDiffOpened / ClaudeCodeDiffClosed autocmds for reacting to diff lifecycle. (#270)
  • Netrw file selection for @-mentions via <leader>as (marked files or file under cursor). (#62)
  • :ClaudeCodeTreeAdd support in snacks.nvim pickers (snacks_picker_list), including Snacks.explorer() and modal pickers. (#269)
  • terminal.fix_streamed_paste option ("auto" by default) working around a Neovim < 0.12.2 bracketed-paste fragmentation bug. (#252)

Fixed

  • closeAllDiffTabs is now scoped to claudecode's own tracked diffs and no longer destroys open diffview.nvim, fugitive, or native :diffsplit reviews; openFile/openDiff also no longer reuse windows in diff mode. (#290)
  • The Claude terminal now adds loopback hosts 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 times out queued @ mentions. (#268)
  • Fixed the "climbing cursor" in the Snacks terminal on hide/show toggle, so typed text no longer lands on the wrong line. Splits fixed on all versions; float fix requires Neovim >= 0.10. (#271)
  • Rejecting a Claude diff with :q / :close / <C-w>c now resolves it as rejected via a WinClosed autocmd. (#266)
  • Quickly-made visual selections (single-line viw/v$/V, mouse) are now pushed to Claude reliably, flushed synchronously on visual-mode exit and persisting until the cursor moves. (#267)
  • Diffs opened via openDiff are now auto-closed when the client that opened them disconnects or the integration stops, instead of lingering forever. (#261)
  • Diffs now open when the Claude terminal is the only window, creating a split instead of failing with "No suitable editor window found". (#260)
  • Fixed a segfault (exit 139) when accepting a new-file diff with render-markdown.nvim installed. (#224)
  • ClaudeCodeSend now classifies tree buffers by filetype only, so an ordinary file whose path contains neo-tree/NvimTree is no longer misrouted. (#292)
  • Snacks Explorer and picker windows are excluded from main-editor-window detection, so diffs no longer open on top of the explorer. (#255, #165)
  • Legacy vertical_split / open_in_current_tab diff options now apply correctly again (merge-order bug). (#142)
  • Handle $ in file paths for ClaudeCodeAdd and openFile. (#286)
  • getDiagnostics now accepts a bare file path (no file:// schema), which Claude frequently sends. (#163)
  • IDE diagnostics 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)
  • keep_terminal_focus now works for floating Claude terminals. (#178)
  • Plugin-created diff splits are now closed deterministically on cleanup, preventing leftover windows. (#175)
  • A stranded empty tab is now closed when open_in_new_tab diff setup errors before the diff registers. (#264)
  • Empty scratch buffer is wiped when the terminal provider is none. (#223)
  • focus_after_send = true now emits a one-time warning with provider = "none"/"external" (where it cannot focus), pointing at the new ClaudeCodeSendComplete event. (#265)
  • The WebSocket server now closes connections on malformed frames instead of stalling, and fires on_disconnect on all teardown paths to prevent phantom clients. (#258, #176)
  • Port binding now retries on EADDRINUSE, so parallel Neovim instances start on different ports instead of colliding. (#284)
  • System sleep is detected to prevent false keepalive timeouts and disconnections on wake. (#141)
  • Selection updates are now also sent on BufEnter, and external-terminal (provider = "none") buffers are correctly skipped via substring matching. (#159, #160)

Changed

  • Modernized the :ClaudeCodeSelectModel picker with version-free labels (Claude Opus (Latest), etc.), 1M-context variants, and a Default (account recommended) entry. (#256)
  • The Snacks provider now launches Claude via an argv list instead of a shell string, fixing a zsh glob bug that broke 1M-context model aliases. (#256)

Security

  • The WebSocket auth token is now generated from a CSPRNG and the lock file is written atomically with 0600 permissions in a 0700 directory. (#259)

Maintained by the release-please workflow. CHANGELOG.md and the release PR body are regenerated by Communique on every push to main, so manual edits to this PR are overwritten.

@github-actions
github-actions Bot force-pushed the release-please--branches--main branch 8 times, most recently from 9e9ac77 to 576d224 Compare June 22, 2026 14:46
@github-actions
github-actions Bot force-pushed the release-please--branches--main branch 3 times, most recently from 52c0c6e to 1346f88 Compare June 23, 2026 09:57
@github-actions
github-actions Bot force-pushed the release-please--branches--main branch from 1346f88 to 1319d40 Compare June 23, 2026 10:01
@github-actions
github-actions Bot force-pushed the release-please--branches--main branch from 1319d40 to 7c1f13e Compare June 23, 2026 10:53
gogongxt pushed a commit to gogongxt/claudecode.nvim that referenced this pull request Jun 24, 2026
)

## Summary

Renames the `diff_opts.layout = "inline"` option (added in coder#195, queued
for v0.4.0 via release-please coder#279) to **`"unified"`**, before it ships
in a tagged release. Tracked in coder#293.

[@wookayin pointed
out](coder#195 (comment))
that the shipped `"inline"` mode isn't a true "inline" diff in the VS
Code sense — it renders a unified diff in a separate `rightbelow vsplit`
pane, not an in-place virtual-text overlay in the same window. Naming it
`"inline"` now would force a breaking rename later, once we add the real
in-place overlay (the mode that most deserves the name `"inline"`).
Renaming is free now (not yet released) and a breaking change after coder#279
merges.

## What changed

- **Config value** `"inline"` → `"unified"`: validation + error message
(`config.lua`), the `ClaudeCodeDiffLayout` type alias (`types.lua`), all
four dispatch sites (`diff.lua`), and the stored `layout` value
(`diff_inline.lua`).
- **User-facing buffer name**: `<file> (inline diff)` → `<file> (unified
diff)`.
- **Docs**: README layout enum + label; a `CHANGELOG.md` `[Unreleased]`
entry for `layout = "unified"`.
- **Tests**: the accept test now expects `"unified"`; a new test asserts
the former `"inline"` is rejected.

## Decisions

- **No deprecated alias.** `"inline"` was never in a tagged release, so
there's no backward-compat obligation, and rejecting it cleanly reserves
the name for the future in-place overlay (coder#294). The validation error
names `'unified'`, so anyone tracking `main` is pointed at the new
value.
- **Internal names kept.** The `diff_inline.lua` module, its functions,
the `claudecode_inline_diff` buffer variable, and the
`ClaudeCodeInlineDiff*` highlight groups are unchanged — they describe
the inline-*style* rendering, not the layout value (coder#293 noted the
buffer var can stay). This keeps the diff small and low-risk.
- **coder#279 changelog** regenerates from commits via Communique on the next
push to `main`, so the v0.4.0 entry reflects "unified" automatically; I
did not hand-edit the bot branch.

## Validation

- `mise run all`: treefmt clean, luacheck **0/0**, **703/703** tests
pass (baseline 702 + the new rejection test).
- Headless Neovim smoke test: `layout = "unified"` accepted, `"inline"`
rejected (error names `'unified'`), `"vertical"` still works.

The true in-place overlay (the future `"inline"`) is tracked in coder#294.

Refs coder#293, coder#195, coder#82

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Signed-off-by: Thomas Kosiewski <tk@coder.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions
github-actions Bot force-pushed the release-please--branches--main branch from 7c1f13e to f7efec6 Compare June 25, 2026 17:39
@github-actions
github-actions Bot force-pushed the release-please--branches--main branch from f7efec6 to e323636 Compare October 24, 2026 09:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants