Claude docs changes for April 23rd, 2026 [diff]
Executive Summary
- Vim visual mode (
v/V) and custom themes (via/theme) added to the Claude Code UI - Hooks can now invoke MCP tools directly via
type: "mcp_tool"in shell command hooks - Linux package manager support added (apt for Debian/Ubuntu, dnf for Fedora/RHEL, apk for Alpine)
- Voice dictation gains tap-to-toggle mode alongside the existing hold-to-talk mode
- Auto mode configuration extracted into a dedicated reference page (
auto-mode-config.md)
New Claude Code versions
2.1.118
New features
- Added vim visual mode (
v) and visual-line mode (V) with selection, operators, and visual feedback - Merged
/costand/statsinto/usage— both remain as typing shortcuts that open the relevant tab - Create and switch between named custom themes from
/theme, or hand-edit JSON files in~/.claude/themes/; plugins can also ship themes via athemes/directory - Hooks can now invoke MCP tools directly via
type: "mcp_tool" - Added
DISABLE_UPDATESenv var to completely block all update paths including manualclaude update— stricter thanDISABLE_AUTOUPDATER - WSL on Windows can now inherit Windows-side managed settings via the
wslInheritsWindowsSettingspolicy key - Auto mode: include
"$defaults"inautoMode.allow,autoMode.soft_deny, orautoMode.environmentto add custom rules alongside the built-in list instead of replacing it - Added a "Don't ask again" option to the auto mode opt-in prompt
- Added
claude plugin tagto create release git tags for plugins with version validation --continue/--resumenow find sessions that added the current directory via/add-dir/colornow syncs the session accent color to claude.ai/code when Remote Control is connected- The
/modelpicker now honorsANTHROPIC_DEFAULT_*_MODEL_NAME/_DESCRIPTIONoverrides when using a customANTHROPIC_BASE_URLgateway
Existing feature improvements
- When auto-update skips a plugin due to another plugin's version constraint, the skip now appears in
/doctorand the/pluginErrors tab
Major bug fixes
- Fixed
/mcpmenu hiding OAuth Authenticate/Re-authenticate actions for servers configured withheadersHelper, and HTTP/SSE MCP servers with custom headers being stuck in "needs authentication" after a transient 401 - Fixed MCP servers whose OAuth token response omits
expires_inrequiring re-authentication every hour - Fixed MCP step-up authorization silently refreshing instead of prompting for re-consent
- Fixed multiple MCP OAuth race conditions (cross-process lock contention, macOS keychain concurrent refresh, token refresh when server revokes before local expiry)
- Fixed credential save crash on Linux/Windows corrupting
~/.claude/.credentials.json - Fixed
/loginhaving no effect in a session launched withCLAUDE_CODE_OAUTH_TOKEN - Fixed plan acceptance dialog offering "auto mode" instead of "bypass permissions" when running with
--dangerously-skip-permissions - Fixed agent-type hooks failing with "Messages are required for agent hooks" when configured for events other than
StoporSubagentStop - Fixed
prompthooks re-firing on tool calls made by an agent-hook verifier subagent - Fixed
/forkwriting the full parent conversation to disk per fork — now writes a pointer and hydrates on read - Fixed Alt+K / Alt+X / Alt+^ / Alt+_ freezing keyboard input
- Fixed connecting to a remote session overwriting your local
modelsetting in~/.claude/settings.json - Fixed typeahead showing "No commands match" error when pasting file paths that start with
/ - Fixed
plugin installon an already-installed plugin not re-resolving a dependency installed at the wrong version - Fixed Remote Control sessions getting archived on transient CCR initialization blips during JWT refresh
- Fixed subagents resumed via
SendMessagenot restoring the explicitcwdthey were spawned with
Claude Code changes
New Documents
auto-mode-config [Source]
New dedicated configuration reference for the auto mode classifier (previously embedded in permissions.md). Covers how to define trusted infrastructure via autoMode.environment, override block/allow rules with autoMode.soft_deny and autoMode.allow, inspect the effective config with claude auto-mode subcommands, and review denials via the /permissions Recently denied tab.
Changed documents
agent-sdk/hooks [Source]
- Added
"defer"as a newpermissionDecisionvalue in the TypeScript SDKPreToolUsehook — allows pausing execution and resuming later from a persisted session. Not available in the Python SDK. [line 179] [Source] - Updated hook priority order to: deny > defer > ask > allow [line 183] [Source]
agent-sdk/typescript [Source]
- Added
deferred_tool_usefield toSDKResultMessagetype carrying the pending tool'sid,name, andinputwhen aPreToolUsehook returns"defer"[line 885] [Source] - Added
"defer"as valid value forpermissionDecisioninSyncHookJSONOutputtype definition [line 1316] [Source]
agent-sdk/user-input [Source]
- Added note that the
canUseToolcallback can stay pending indefinitely, and that the TypeScript SDK supportsdeferto let the process exit and resume later from a persisted session [line 6] [Source]
claude-directory [Source]
- Added
tasks/,shell-snapshots/, andbackups/to the auto-cleanup section (previouslybackups/andshell-snapshots/were listed under "kept until you delete them") [line 189] [Source]
commands [Source]
common-workflows [Source]
- Added note that
--resume,--continue, and/resumeoffer to resume old large sessions from a summary instead of loading the full transcript (not available on Bedrock, Vertex AI, or Foundry) [line 578] [Source]
errors [Source]
- Changed recommendation for large
CLAUDE.mdto use path-scoped rules (load only when relevant) rather than imports (which still load at launch and consume context) [line 330] [Source]
google-vertex-ai [Source]
- Added multi-region endpoint support:
CLOUD_ML_REGIONcan now be set toglobal, a multi-region location (eu,us), or a specific region; Claude Code selects the correct hostname automatically [line 41] [Source]
hooks [Source]
- Deferred sessions are now subject to the
cleanupPeriodDaysretention sweep (30 days by default) [line 1040] [Source]
interactive-mode [Source]
mcp [Source]
- GitHub MCP server connection example updated: now requires a personal access token (PAT) passed as an
Authorizationheader instead of the previous OAuth flow [line 1257] [Source]
memory [Source]
- Clarified that
@pathimports do not reduce context (imported files still load at launch); path-scoped rules are now the recommended approach for largeCLAUDE.mdfiles [line 68] [Source]
model-config [Source]
- Added note that
/modelselection persists across restarts; if project settings pin a different model, the choice is written to.claude/settings.local.jsonso it continues to apply [line 43] [Source] - Simplified effort level defaults:
xhighon Opus 4.7,highon Opus 4.6 and Sonnet 4.6 (removed per-plan differentiation) [line 151] [Source]
monitoring-usage [Source]
- Added
effortattribute to cost counter, token counter, API event, and API error event telemetry [lines 406-536] [Source] - Added
command_nameandcommand_sourceattributes to user_prompt event [line 466] [Source] OTEL_LOG_TOOL_DETAILS=1now also exposes verbatim custom, plugin, and MCP command names onuser_promptevents [line 77] [Source]
network-config [Source]
- Network access requirements reformatted as a table listing each URL with its purpose, and clarified when Bedrock/Vertex/Foundry providers replace
api.anthropic.com[line 88] [Source]
permission-modes [Source]
- Links to auto mode classifier configuration now point to the new
auto-mode-config.mdpage instead ofpermissions.md[lines 131-28] [Source]
permissions [Source]
- Large "Configure the auto mode classifier" and "Review auto mode denials" sections removed — content moved to the new
auto-mode-config.mdpage
plugin-dependencies [Source]
- Added
dependency-unsatisfiederror to the error table with resolution steps [line 192] [Source] - Clarified that re-running
claude plugin installor adding a new marketplace also resolves outstanding missing dependencies
plugin-marketplaces [Source]
- Marketplace restrictions (
strictKnownMarketplaces,blockedMarketplaces) are now enforced on plugin install, update, refresh, and auto-update — not just on marketplace add. A marketplace added before the policy was set cannot be used to fetch plugins once its source no longer matches the allowlist [line 204] [Source]
quickstart [Source]
- Added mention of Linux package manager installation (apt, dnf, apk)
remote-control [Source]
settings [Source]
- Added new
voicesettings object (enabled,mode,autoSubmit) to replace the legacyvoiceEnabledkey (which remains as an alias) [line 277] [Source] blockedMarketplacesandstrictKnownMarketplacesdescriptions updated to reflect enforcement on install/update/refresh/auto-update cycles [lines 263-272] [Source]
setup [Source]
- Added full Linux package manager installation instructions for apt (Debian/Ubuntu), dnf (Fedora/RHEL), and apk (Alpine) with signed repository setup and GPG key verification [line 265] [Source]
- Added uninstall instructions for apt/dnf/apk [line 458] [Source]
sub-agents [Source]
- Clarified that
mcpServersfield applies both when the agent runs as a subagent and when launched as the main session via--agent[line 311] [Source]
terminal-guide [Source]
- Added system requirements callouts: macOS 13.0+ for macOS, Windows 10 version 1809+ for Windows [lines 12-59] [Source]
- Added dyld error troubleshooting section for users on unsupported macOS versions [line 209] [Source]
voice-dictation [Source]
- Added tap mode: tap once to start recording, tap again to send — no hold required. Enable with
/voice tap[line 67] [Source] - Added
autoSubmitoption for hold mode: sends the prompt automatically on key release when transcript is at least three words [line 62] [Source] - Added VS Code extension voice dictation support note (not available in VS Code Remote sessions) [line 27] [Source]
- Transcription does not consume Claude messages or tokens and does not count toward
/usagelimits [line 17] [Source] - Added new troubleshooting entries: "No audio detected", "No speech detected", and tap mode space key behavior [lines 137-141] [Source]
vs-code [Source]
- GitHub MCP server example updated to use a personal access token passed as a header [line 303] [Source]