Release notes
Claude Code v2.1.277
What's changed
- Added AGENTS.md support: in a project with no CLAUDE.md, Claude Code reads AGENTS.md instead; change it under "Project instructions" in
/config(not yet on Bedrock, Vertex or Foundry) - Added
CLAUDE_GATEWAY_PROXY_IS_EGRESS_BOUNDARY=1for Claude apps gateways whose only egress is a forward proxy: every outbound request hands the proxy the hostname instead of resolving it locally - Added an optional
headers:map on Claude apps gateway upstreams, to send static headers to a proxy you run in front of a provider - Added a line saying a background task's update is waiting when it finishes while a panel such as
/tasksis open - Fixed
claude -pand Agent SDK sessions that could hang with no result after an internal error; they now report the error and exit with code 1 - Fixed conversations failing every request with "text content blocks must be non-empty" when an earlier assistant turn held an empty text block beside other content, including after
--resume - Fixed being unexpectedly logged out when an older Claude Code build (for example an IDE extension's bundled CLI) runs on the same machine as the current one
- Fixed interactive start-up hanging or showing an error for
ANTHROPIC_API_KEYusers when~/.claude.jsonholds a malformedcustomApiKeyResponsesvalue - Fixed update checks erroring every 30 minutes, and
claude updatehanging when a minimum or maximum version is set, if a proxy returns an invalid version; a malformedminimumVersionis now ignored - Fixed
claude updateon winget- or apk-managed installs reporting "up to date" when the version lookup failed - Fixed
claude plugin installsometimes failing and breaking the installed copy when reinstalling a plugin version that a session or another program was using; an unchanged copy is now left alone - Fixed Grep and Glob reporting no matches when the search could not start because the system was out of processes, memory or file handles; they now return an error saying so
- Fixed the Write tool silently ending the turn as a declined permission when the target path is an existing directory; it now reports a clear error
- Fixed the Edit tool treating an escaped backslash followed by
uXXXXtext as a\uXXXXescape, which could make an edit of a non-ASCII character rewrite an escaped backslash sequence instead - Fixed the Edit tool reporting "Invalid regular expression: regular expression too large" instead of "String not found in file" when a very large edit containing non-ASCII text did not match the file
- Fixed a turn ending early with "Path contains null bytes" when a tool call's file path contained
\u0000written as an escape sequence; escaped control characters now stay as literal text - Fixed background sessions (
claude --bg) exiting when a plugin's LSP server exited or closed its stdin - Fixed a crash ("Type error") when opening
/mcpor/plugin managewith a malformedclaudeAiMcpEverConnectedvalue in~/.claude.json - Fixed a crash at launch when
~/.claude.jsonholds a malformedthemevalue - Fixed a crash ("unrecoverable interface error") when the prompt held text containing terminal color codes, for example a prompt recalled from history or text loaded from the external editor
- Fixed a crash when resuming a session whose saved history holds an assistant message stored as a plain string
- Fixed sessions on slow or heavily loaded machines sometimes exiting with "Claude Code exited after an unrecoverable interface error" when the first spinner appeared
- Fixed a rare case where the screen could stop updating for the rest of the session after an internal rendering error
- Fixed a rare case on Windows where a turn could stop with an error such as "Out of memory" right after Claude replied, so that reply's tool calls never ran
- Fixed sessions continued after
/clear(restart,--continue,--resume) missing part of their first message when a SessionStart hook printed output, causing a full prompt-cache miss - Fixed messages from other agents (such as a subagent's SendMessage) that arrived mid-turn showing up below the "Ran N shell commands" row instead of where they arrived
- Fixed the "copied" notice not appearing after drag-selecting text in the fullscreen
/resumepicker and other panels that cover the prompt area - Fixed
$TMPDIRexpanding empty in Bash commands that run outside the sandbox while sandboxing is enabled - Fixed WebFetch and WebSearch in Cowork cloud sessions not telling Claude why a request was refused, such as a used-up fetch budget or an admin policy
- Fixed the Claude apps gateway's telemetry relay ignoring a collector hostname or domain listed in
NO_PROXYwhen a proxy is set - Fixed one malformed
strictKnownMarketplacesorblockedMarketplacesentry silently disabling the whole enterprise marketplace policy - Fixed failed auto-updates leaving large staged downloads behind in
~/.cache/claude/staging - Fixed
/pluginnot stripping terminal control characters from messages on the Installed tab, such as the error of a failed plugin update - Fixed
/plugin→ Installed and/skillscrashing when a skill or legacy command is named like a built-in Object property such asconstructorortoString - Fixed
/pluginclosing with no message when every install in a multi-select failed - Fixed uninstalled plugins reappearing as "failed to load" rows in
/pluginInstalled, and Remove not clearing such a row - Fixed plugins from the official marketplace being recorded without their commit in
installed_plugins.json, andinstalled_plugins.jsonkeeping the old commit after updating a pinned-commit plugin - Fixed plugin reload previews keeping every previewed copy of a plugin archive unpacked until exit, and overwriting the cached
--plugin-urlarchive a reload falls back to when its download fails - Fixed Remote Control session bookkeeping failing when
~/.claude.jsonholds a malformed placeholder record - Fixed the error after a revoked claude.ai login blaming an expired Anthropic profile; it now leads with
/login - Fixed typed or pasted text occasionally coming out scrambled in the
claude agentsdispatch input during key repeat or very fast input - Fixed a crash ("unrecoverable interface error") when resuming a session whose saved transcript contains a stop hook summary without a well-formed hook list
- Fixed Enter on a selected agent panel row doing nothing when
keybindings.jsonrebinds Enter in the Chat context, for example tochat:queueSubmit - Fixed PDF page reads on Windows failing when the working folder's path is long (about 120 characters or more)
- Fixed a headless resume (
claude -p --resume, the SDK, a VS Code extension window reload) starting the session's cost and usage totals at zero; headless sessions now save their totals at exit - Fixed project skills from the main repository not loading in
--worktreesessions when.claude/skillsis untracked - Fixed a
sandbox.excludedCommandsglob exempting an entire compound Bash command from the sandbox when only one part matched; every part must now match - Fixed resumed subagents and teammates re-rendering the MCP tool definitions they had loaded, which broke prompt caching for that agent
- Fixed rate-limited artifact publishes telling Claude to stop retrying; Claude is now told nothing was published and when to send the same publish again
- Fixed attachments recorded earlier in a conversation being re-rendered after a resume or relaunch, which dropped extended thinking and missed the prompt cache
- Fixed Console sign-in showing only "Request failed with status code 400" when the server refuses to create an API key; it now shows the server's message
- Fixed messages typed while Claude is still working sometimes being ignored by the model
- Improved session start-up for SDK and headless (
-p) use: the first turn no longer waits on the per-directory CLAUDE.md lookup - Improved the Claude apps gateway's loopback error messages to name
CLAUDE_GATEWAY_ALLOW_LOOPBACK
…