2.1.129 untested · changelog-derived

Claude Code 2.1.129

**Plugin URL fetching + env-var sync-output control** — agents and power users can now inline ephemeral plugins from remote URLs and force deterministic terminal output, unlocking faster iteration on plugin-driven workflows and more reliable CI/automation on exotic terminals.

7 new primitives 3 workflow recipes 20 fixes

New primitives

--plugin-url <url>flag

Fetch and use a plugin `.zip` archive from a URL for the current session only

Added `--plugin-url <url>` flag to fetch a plugin `.zip` archive from a URL for the current session
CLAUDE_CODE_FORCE_SYNC_OUTPUT=1env-var

Force-enable synchronized output on terminals where auto-detection fails (e.g. Emacs `eat`)

Added `CLAUDE_CODE_FORCE_SYNC_OUTPUT=1` env var to force-enable synchronized output on terminals that auto-detection misses (e.g. Emacs `eat`)
CLAUDE_CODE_PACKAGE_MANAGER_AUTO_UPDATEenv-var

Enable automatic background upgrade prompts for Homebrew or WinGet installations

Added `CLAUDE_CODE_PACKAGE_MANAGER_AUTO_UPDATE`: when set on Homebrew or WinGet installations, Claude Code runs the upgrade command in the background and prompts to restart
CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1env-var

Opt-in to Gateway `/v1/models` discovery for the `/model` picker (now requires explicit opt-in, was automatic in 2.1.126–2.1.128)

Gateway `/v1/models` discovery for the `/model` picker is now opt-in via `CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1` (was automatic in 2.1.126–2.1.128)
skillOverrides setting (modes: off, user-invocable-only, name-only)setting

Control skill visibility: `off` hides from model and `/`, `user-invocable-only` hides from model only, `name-only` collapses description

`skillOverrides` setting now works: `off` hides from model and `/`, `user-invocable-only` hides from model only, `name-only` collapses description
Ctrl+R history picker search scope togglecapability

Ctrl+R now defaults to all prompts across all projects; press Ctrl+S to narrow to current project/session

Ctrl+R history picker now defaults to searching all prompts across all projects, matching pre-2.1.124 behavior. Press Ctrl+S to narrow to the current project or session
Plugin manifest experimental namespacesetting

Declare `themes` and `monitors` under `"experimental": { ... }` in plugin manifests (top-level still works but warns)

Plugin manifests: `themes` and `monitors` should now be declared under `"experimental": { ... }`. Top-level declarations still work but `claude plugin validate` will warn

Workflow recipes

Exotic Terminal + Skill-Gated Model Inference
CLAUDE_CODE_FORCE_SYNC_OUTPUT=1 + skillOverrides setting

Agents running inside constrained CI/automation environments (Emacs eat, Docker, GitHub Actions on ARM) often fail silently due to terminal output buffering and unintended skill inference. Combining forced synchronous output with skill availability gates enables reliable, auditable automation.

Deploy an agent worker in an Emacs buffer or CI container with CLAUDE_CODE_FORCE_SYNC_OUTPUT=1 and skillOverrides: "user-invocable-only" in settings. This ensures (1) terminal output is never buffered, so logs appear immediately and race conditions are visible, and (2) the model cannot spontaneously invoke skills—only the agent's explicit / commands trigger them. This prevents accidental tool invocations that might fail in the constrained environment and makes logs deterministic for debugging and audit trails.

Model Discovery Control for Multi-Tenant / Air-Gapped Deployments
CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 (opt-in) + deniedMcpServers pattern fixes

Third-party deployments (Vertex, Bedrock, Foundry, custom gateways) now explicitly control whether the model picker discovers models via gateway /v1/models. The fix to deniedMcpServers wildcard matching (case-insensitive hostnames) enables precise network boundary enforcement.

In air-gapped or multi-tenant environments, set CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY= absent or unset to prevent the model picker from auto-discovering external models, keeping users on only locally-available models. Pair this with deniedMcpServers patterns using *:// scheme wildcards to block entire categories of external tools—e.g., "*://anthropic.com": true" to deny all Anthropic first-party servers. The case-insensitive hostname fix ensures mixed-case domains in policies are honored consistently.

Skill Visibility Governance for Collaborative / Educational Agents
skillOverrides setting (modes: off, user-invocable-only, name-only)

Not a multi-primitive workflow, but a single newly-working primitive that enables collaborative and educational agents to enforce skill governance. The skillOverrides modes allow fine-grained control: off hides skills completely, user-invocable-only prevents model inference but allows human / calls, and name-only collapses descriptions to reduce token waste and cognitive load.

For educational agents teaching prompt engineering, set skillOverrides: "name-only" to show skill names in / lists but hide their full descriptions—reducing distraction and token bloat while preserving discoverability. For trusted teams sharing a workspace, use skillOverrides: "user-invocable-only" to let humans call any skill but prevent the model from auto-invoking them—keeping inference deterministic and accountable. For restricted automation, use skillOverrides: "off" to hide all skills and rely only on explicit tool calls.

Agentic relevance

The key agentic primitives in 2.1.129 are environment variable controls for output synchronization and model discovery, plus `skillOverrides` for controlling model inference behavior. These enable agents running on exotic CI platforms (Emacs, unusual shells) to operate reliably, and allow fine-grained control over which skills the model can invoke—supporting workflows where skill availability needs to be contextual or constrained. The plugin URL fetching is primarily a manual convenience rather than an agent-accessible capability.

Hardening & fixes (20)

  • Third-party deployments (Bedrock, Vertex, Foundry, `ANTHROPIC_BASE_URL` gateway) no longer show spinner tips pointing at first-party Anthropic surfaces
  • The `claude_code.pull_request.count` OTel metric now counts PRs/MRs created via MCP tools, not just shell commands
  • Policy refusal error messages now include the API Request ID for easier support debugging
  • Fixed API errors with unrecognized 400 status codes showing raw JSON instead of the underlying error message
  • Fixed `/clear` not resetting the terminal tab title after a conversation
  • Fixed session title chip from `/rename` disappearing while a permission or other dialog is active
  • Fixed agent panel below the prompt being hidden when subagents are running (regression in 2.1.122)
  • Fixed external-editor handoff (Ctrl+G) blanking the conversation history above the prompt
  • Fixed `/context` dumping its rendered ASCII visualization grid into the conversation, wasting ~1.6k tokens per call
  • Fixed `/agents` Library list arrow-key navigation: the highlighted agent now stays visible when the list exceeds the viewport
  • Fixed `/branch` success message not including the new branch's session id for `/resume`
  • Fixed bold headers with keycap/ZWJ/skin-tone emoji losing trailing characters in fullscreen mode
  • Fixed server-managed settings policy not applying for enterprise/team users whose stored OAuth credentials lacked the `user:inference` scope
  • Fixed OAuth refresh race after wake-from-sleep that could log out all running sessions
  • Fixed 1-hour prompt cache TTL being silently downgraded to 5 minutes
  • Fixed cache-miss warning appearing spuriously after `/clear` or compaction when changing `/effort` or `/model`
  • Fixed `Bash(mkdir *)`, `Bash(touch *)` and similar allow rules not being honored for in-project paths
  • Fixed `deniedMcpServers` patterns with a `*://` scheme wildcard not matching mixed-case hostnames
  • Fixed harmless WebSocket warning being logged as an error in `--debug` during voice mode
  • [VSCode] Fixed `/clear` not clearing the conversation context and displayed transcript

Raw changelog

## 2.1.129

- Added `--plugin-url <url>` flag to fetch a plugin `.zip` archive from a URL for the current session
- Added `CLAUDE_CODE_FORCE_SYNC_OUTPUT=1` env var to force-enable synchronized output on terminals that auto-detection misses (e.g. Emacs `eat`)
- Added `CLAUDE_CODE_PACKAGE_MANAGER_AUTO_UPDATE`: when set on Homebrew or WinGet installations, Claude Code runs the upgrade command in the background and prompts to restart
- Plugin manifests: `themes` and `monitors` should now be declared under `"experimental": { ... }`. Top-level declarations still work but `claude plugin validate` will warn
- Gateway `/v1/models` discovery for the `/model` picker is now opt-in via `CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1` (was automatic in 2.1.126–2.1.128)
- Ctrl+R history picker now defaults to searching all prompts across all projects, matching pre-2.1.124 behavior. Press Ctrl+S to narrow to the current project or session
- Third-party deployments (Bedrock, Vertex, Foundry, or `ANTHROPIC_BASE_URL` gateway) no longer see spinner tips pointing at first-party Anthropic surfaces
- `skillOverrides` setting now works: `off` hides from model and `/`, `user-invocable-only` hides from model only, `name-only` collapses description
- The `claude_code.pull_request.count` OTel metric now counts PRs/MRs created via MCP tools, not just shell commands
- Policy refusal error messages now include the API Request ID for easier support debugging
- Fixed API errors with unrecognized 400 status codes showing raw JSON instead of the underlying error message
- Fixed `/clear` not resetting the terminal tab title after a conversation
- Fixed session title chip from `/rename` disappearing while a permission or other dialog is active
- Fixed agent panel below the prompt being hidden when subagents are running (regression in 2.1.122)
- Fixed external-editor handoff (Ctrl+G) blanking the conversation history above the prompt
- Fixed `/context` dumping its rendered ASCII visualization grid into the conversation, wasting ~1.6k tokens per call
- Fixed `/agents` Library list arrow-key navigation: the highlighted agent now stays visible when the list exceeds the viewport
- Fixed `/branch` success message not including the new branch's session id for `/resume`
- Fixed bold headers with keycap/ZWJ/skin-tone emoji losing trailing characters in fullscreen mode
- Fixed server-managed settings policy not applying for enterprise/team users whose stored OAuth credentials lacked the `user:inference` scope
- Fixed OAuth refresh race after wake-from-sleep that could log out all running sessions
- Fixed 1-hour prompt cache TTL being silently downgraded to 5 minutes
- Fixed cache-miss warning appearing spuriously after `/clear` or compaction when changing `/effort` or `/model`
- Fixed `Bash(mkdir *)`, `Bash(touch *)` and similar allow rules not being honored for in-project paths
- Fixed `deniedMcpServers` patterns with a `*://` scheme wildcard not matching mixed-case hostnames
- Fixed harmless WebSocket warning being logged as an error in `--debug` during voice mode
- [VSCode] Fixed `/clear` not clearing the conversation context and displayed transcript