Claude Code v2.1.269: Plugin Eval Suites, /output-style, and Bash Edit Diffs
Claude Code v2.1.269 adds claude plugin eval for scored eval suites, an /output-style command, Bash edit diffs, new environment variables, and a VS Code agent map with hooks and permission-rule dialogs.
Claude Code v2.1.269 is a large release with 98 changelog entries. It introduces claude plugin eval for scoring plugins with reproducible eval suites, an /output-style command that also works over Remote Control and in headless sessions, and several new environment variables, alongside prompt-cache, terminal-input and permission-rule fixes. VS Code gains an agent map and dialogs for managing hooks and permission rules.
What’s New
claude plugin eval
The new claude plugin eval command runs a plugin’s eval suite against Claude Code and returns scored, reproducible results as JSON and an HTML report. Run claude plugin eval --help for its options.
/output-style command
/output-style [name] lists and switches output styles. It works over Remote Control and in cloud and other headless sessions as well as locally.
Diffs for Bash file edits
With the bashEditDiffEnabled setting, when the Bash tool handles file edits, the Bash tool result now includes a diff of the files the command changed.
New environment variables
OTEL_METRICS_INCLUDE_REPOSITORYtags OpenTelemetry metrics and events withvcs.*repository attributes; withOTEL_LOG_TOOL_DETAILS, commit events also getvcs.ref.head.*.CLAUDE_CODE_GATEWAY_MODEL_DISCOVERY_TIMEOUT_MSextends the LLM gateway/v1/modelsdiscovery timeout (default 3s).CLAUDE_CODE_WORKFLOW_MAX_CONCURRENT_AGENTS(1–256) raises the Workflow tool’s per-run concurrent agent limit for inference-bound fan-outs.
Background agent status in remote and headless sessions
Remote and headless sessions no longer report “waiting for your input” while background agents are still running. Set CLAUDE_CODE_BG_TASKS_REPORT_RUNNING=0 to restore the old behavior.
Tighter permission rules
A deny or ask rule starting with ! now applies only within the settings source that wrote it, and a bare ! negation is ignored. Edit() deny rules and the write-path check now apply to the file a Bash tee command writes, and a Bash(tee:*) allow rule no longer covers destinations outside the working directories.
Review and skill naming changes
/ultrareview --post now posts the PR comment directly when the findings arrive and prints the comment link, instead of starting a second cloud session to post it. In cloud sessions, skills synced from claude.ai are now named anthropic-skills:<name>, matching Claude Desktop; the bare name still works when nothing else uses it.
VS Code agent map, hooks and permission rules dialogs
An “N agents” footer pill now opens a map of the session’s sub-agents with per-agent cards, Stop agent, and read-only transcripts. A new Hooks dialog in the command menu lets you view hooks and add, edit or remove them in user, project and local settings (managed, plugin and session hooks stay read-only). A Permission rules dialog lists permission rules and adds or removes them in the same three scopes (startup-option, session-only and managed rules stay read-only). Focus view also shows live progress rows for running subagents.
Fixes and Improvements
- Prompt cache: Fixed partial cache invalidation on the turn after a response was cut off at the output-token limit and automatically resumed, a case where resuming after interrupting Claude mid-thought could change how earlier context was re-sent, and cache misses in cloud sessions (Claude Code now waits briefly for server configuration before the first request).
- Terminal keys: Fixed F1/F2/F4 in kitty-protocol terminals, Delete in st, Alt+arrows acting as Escape in rxvt-unicode, and Shift+punctuation typing the unshifted key in WezTerm (a regression in 2.1.247). Keyboard support over SSH and in unrecognized terminals is also better: terminals that answer the kitty keyboard query, such as foot and Alacritty 0.16+, now get Shift+Enter and Ctrl+Shift shortcuts.
- Startup noise: The terminal’s replies to capability queries (
^[[?1;2c) no longer appear as stray text at startup, and stray characters like22care no longer typed into the prompt at startup over slow connections such as ssh or browser terminals. - Compaction: The git status Claude is told after a compaction is now the current status rather than the one from the start of the session, and sessions no longer get permanently stuck on “Prompt is too long” when auto-compaction had no complete earlier exchange to summarize.
/goal: Runs no longer stall silently after API errors, network drops or token limits; the goal now retries with backoff, or pauses and says why, including until a usage limit resets.- Attribution: The attribution reminder no longer overrides a CLAUDE.md or memory rule against commit and pull request attribution; lines set by managed settings still apply.
- Plugin security: Plugin archives extracted for a session are no longer readable by other local users, extracted files no longer keep world-writable bits from the archive, and stale files no longer survive re-extraction.
- Plugins: Organization plugins enabled through managed settings now load in headless sessions and on Claude Desktop (once Desktop bundles this CLI version), and plugin LSP servers that reject
shutdownparams, such as rust-analyzer, are no longer left running at session end. - Headless and SDK: Resumed headless sessions no longer lose a turn’s replies when the model was switched or a request was retried mid-turn, and
permission_denialsin--output-format stream-jsonresults now include Read, Edit and Write calls blocked by a path-scoped deny rule. - Interrupted turns:
CLAUDE_CODE_RESUME_INTERRUPTED_TURNno longer re-runs a turn that failed with an API error more than 6 hours earlier, or longer ago thanCLAUDE_CODE_RESUME_INTERRUPTED_TURN_MAX_AGE_MSwhen set. /btw: Side questions are now told not to write made-up tool calls and output, and any that appear are flagged as not executed.- MCP: Synced plugin MCP servers now connect when a remote session resumes, and MCP servers no longer reconnect when an updated config only changes the order of the server URL’s query parameters.
- Bedrock, Vertex, Foundry and gateways:
/insightsnow uses the session model when the account can’t reach the default Opus model instead of failing. - Languages: Prompt suggestions are no longer dropped for Japanese, Chinese, Thai and other languages written without spaces, and filtering for Japanese, Chinese and Korean now keeps mixed-script and single-word suggestions.
- Images and Windows: CMYK JPEG images now attach instead of failing with “cannot decode”, and on Windows, PowerShell tool commands sent to the background no longer stop when Claude Code exits.
- Responsiveness: The
/diffpanel opens fully rendered in one step, and transcript updates in long sessions no longer re-process the whole conversation to build collapsed tool-use summaries. - Claude Code on the web: You can now take back a queued message in a cloud session before Claude reads it,
/model defaultno longer leaves later messages failing in organizations that restrict models, and one-off scheduled routines no longer occasionally run a second time after a transient server error. - Claude Tag: Claude now declines a switch to a model your organization hasn’t enabled instead of quietly answering with a fallback model, routine runs can reply in an existing thread, and admin settings ask for confirmation before Connect all or Disconnect on a GitHub installation.
This release contains 98 changes in total; see the full changelog for the complete list.
How to Update
- Check your installed version:
claude --version - Update in place:
claude update - Review permission rules that start with
!(they now apply only within their own settings source) and anyBash(tee:*)allow rule. If you depend on the old “waiting for your input” status in remote or headless sessions, setCLAUDE_CODE_BG_TASKS_REPORT_RUNNING=0.