Claude Code · Source-level changelog

Version 2.1.120

This release introduces a condensed "lean prompt" system for reduced token usage on capable models, a new claude ultrareview CLI command for cloud-hosted code reviews, interactive daemon service installation prompts, a memory write confirmation dialog, and expanded Windows PowerShell support. It also adds the tabs_close_mcp Chrome extension tool, a hideVimModeIndicator setting for custom status lines, and several improvements to how deny rules, autocompact notifications, and explore agent descriptions are handled.

Package @anthropic-ai/claude-code Diff v2.1.119 โ†’ v2.1.120
23
Features & Changes
3
Bug Fixes
0
In Development
0
Env Vars / Flags

Changes

23 items

claude ultrareview CLI Subcommand #

What

Run a cloud-hosted multi-agent code review directly from the command line, without entering an interactive session.

Usage
claude ultrareview              # review current branch
claude ultrareview 42           # review PR #42
claude ultrareview main         # review against a base branch
claude ultrareview --json       # print raw bugs.json payload
claude ultrareview --timeout 45 # wait up to 45 minutes (default: 30)
Details
  • Launches a remote multi-agent session that finds and verifies bugs in your branch
  • Prints live progress (found, verified, refuted counts) to stderr while waiting
  • Outputs formatted findings with file paths, line numbers, and severity (๐Ÿ”ด normal, ๐ŸŸก nit, ๐ŸŸฃ pre-existing)
  • Ctrl-C cancels the wait but leaves the remote review running โ€” a URL is printed so you can view it in the browser
  • The /ultrareview slash command existed previously; this adds it as a top-level CLI entry point
Evidence

CLI command registered via .command("ultrareview [target]") with .description("Run a cloud-hosted multi-agent code review...") โ€” search for "ultrareview [target]"

Lean Prompt Mode (Condensed Tool Descriptions) #

What

A new prompt optimization mode that significantly reduces system prompt token usage by sending shorter, denser tool descriptions to capable models.

Usage
CLAUDE_CODE_LEAN_PROMPT=1 claude   # force enable via env var
Details
  • When active, tool descriptions for Grep, Glob, WebFetch, Write, Edit, WebSearch, TodoWrite, Bash, and the Task/Explore agent are replaced with much shorter versions
  • Example: the Grep tool description goes from a multi-paragraph usage guide to a compact 4-line summary
  • The Explore agent description is refined to emphasize it is a "read-only search agent" not suitable for code review or cross-file analysis
  • Activated by the CLAUDE_CODE_LEAN_PROMPT environment variable, or gradually rolled out via the tengu_vellum_lantern feature flag
  • Currently limited to Opus 4.6+ and Opus 4.7 models
Evidence

Lean prompt gate function checks CLAUDE_CODE_LEAN_PROMPT and tengu_vellum_lantern โ€” search for "CLAUDE_CODE_LEAN_PROMPT"

Memory Write Confirmation Dialog #

What

When Claude writes or edits a memory file, a confirmation dialog now appears showing what was saved, with the option to approve or reject the change.

Details
  • Shows "Memory written" or "Memory updated" with a preview of the content (or a one-sentence AI-generated summary for large memories)
  • For edits, displays a diff view; for new memories, displays the body text
  • Auto-hides after a configurable timeout (default 8 seconds) with a countdown indicator
  • Rejecting a memory write undoes the file change (restores the previous content or deletes the file)
  • The summary is generated by Sonnet 4.6 for memories exceeding a line threshold (default: 5 lines)
  • Controlled by the tengu_slate_siskin feature flag (disabled by default)
Evidence

Memory write survey infrastructure with approve/reject dialog โ€” search for "memoryWriteSurvey" and "tengu_slate_siskin"

memory-types Skill #

What

A new internal skill that provides a full reference for the memory type taxonomy โ€” what each type captures, when to save it, and how to structure the body.

Details
  • Not user-invocable directly; Claude uses it automatically before writing a memory file when lean prompts are active
  • Enabled when tengu_ochre_finch flag is active or CLAUDE_CODE_LEAN_PROMPT is set
  • Replaces the longer inline memory documentation in the system prompt with a shorter summary plus a skill reference
  • The system prompt now lists memory types as a compact bulleted list and says "Invoke the memory-types skill for scope, body structure and examples"
Evidence

Skill registered as "memory-types" with userInvocable: !1 โ€” search for "memory-types"

Daemon Cold-Start Service Installation Prompt #

What

When no background daemon is running and one is needed, Claude Code now interactively asks whether to install it as a persistent system service.

Usage
No background daemon is running.
Installing it as a service keeps scheduled and remote-control workers running across reboot.
Install as a service now? [Y/n/never, or 'once' for this login session]
Details
  • Y (default): installs a launchd (macOS) or systemd (Linux) service that persists across reboot
  • once: spawns a transient daemon for the current login session only
  • never: remembers the dismissal and won't ask again (spawns transient)
  • n: does nothing โ€” the command fails with the original "no daemon running" error
  • Controlled by the tengu_quiet_harbor feature flag (determines whether mode is "ask" or "transient")
  • Also configurable via CLAUDE_CODE_DAEMON_COLD_START environment variable or settings.daemonColdStart
  • The daemon auto-uninstalls stale service files that were not created by the current version (tagged with claude-managed: v1)
Evidence

Interactive prompt with "Install as a service now? [Y/n/never, or 'once' for this login session]" โ€” search for that string, gated by tengu_quiet_harbor

Chrome Extension: tabs_close_mcp Tool #

What

A new MCP tool that lets Claude close individual tabs in the Chrome tab group by ID.

Details
  • Only tabs in the current session's tab group are closable
  • Call tabs_context_mcp first to get valid tab IDs
  • If you close the group's last tab, Chrome auto-removes the group โ€” the next tabs_context_mcp with createIfEmpty starts fresh
  • Replaces the previous update_plan tool that was used in the Chrome extension's plan-approval flow
Evidence

Tool registered as "tabs_close_mcp" with title "Tabs Close" โ€” search for "tabs_close_mcp"

User Deny Rules Awareness in System Prompt #

What

Claude is now informed about the user's configured permission deny rules and instructed to block circumvention attempts.

Details
  • The system prompt now includes a section listing all active deny rules
  • Claude is instructed to block actions that achieve the same effect via a different tool โ€” e.g., using python -c, sed -i, cat >, heredocs, or similar to write a file that an Edit/Write deny rule covers
  • Only non-internal deny rules are surfaced (rules starting with a specific internal prefix are filtered out)
Evidence

New function builds deny rule text: "User Deny Rules: The user has configured these permission deny rules..." โ€” search for "User Deny Rules"

hideVimModeIndicator Status Line Setting #

What

A new boolean setting to suppress the built-in -- INSERT -- / -- VISUAL -- vim mode indicator below the prompt.

Usage (in settings):

{
  "statusLine": {
    "hideVimModeIndicator": true
  }
}
Details
  • Use this when your custom status line script already renders vim.mode itself
  • Prevents duplicate mode indicators when using a custom status line
Evidence

New setting hideVimModeIndicator with .describe("Hide the built-in...") โ€” search for "hideVimModeIndicator"

CLAUDE_EFFORT System Prompt Substitution #

What

A new ${CLAUDE_EFFORT} template variable is now available in system prompts, dynamically resolved from the session's effort setting.

Details
  • The variable is interpolated during session initialization
  • Allows system prompts to adapt behavior based on the current effort level
Evidence

Template variable ${CLAUDE_EFFORT} appears in system prompt processing โ€” search for "CLAUDE_EFFORT"

Renamed "Bash Mode" to "Shell Mode" #

The ! prefix hint has been renamed from "bash mode" to "shell mode" to reflect the broader shell support now available (bash, zsh, sh, and PowerShell on Windows).

Evidence

String changed from "! for bash mode" to "! for shell mode" โ€” search for "! for shell mode"

Expanded Windows PowerShell Integration #

PowerShell support on Windows has been improved with smarter shell selection and better error handling:

  • Shell selection now falls back gracefully: if defaultShell is set to "bash" but Git Bash isn't installed, PowerShell is used instead, and vice versa
  • The shell setting description now reads "Defaults to bash (powershell on Windows without Git Bash)"
  • Clipboard operations on Windows now use proper argument arrays instead of concatenated strings for safer command execution
  • Clear error messages guide users when neither Git Bash nor PowerShell is available:
  • "Claude Code on Windows requires either Git for Windows (for bash) or PowerShell"
  • Hook errors now suggest "Install Git for Windows, or add shell: powershell to this hook's config"
Evidence

Shell fallback logic in g24() function โ€” search for "Git Bash not found" and "CLAUDE_CODE_USE_POWERSHELL_TOOL"

Improved Scroll Wheel Notification #

The scroll wheel arrow-key detection now suggests a simpler fix. The notification has been changed from "run /terminal-setup to fix" to "use PgUp/PgDn to scroll", removing the need for users to run a separate command.

Evidence

String changed from "run /terminal-setup to fix" to "use PgUp/PgDn to scroll" โ€” search for "PgUp/PgDn to scroll"

Improved Autocompact Notification #

The autocompact notification has been refined:

  • Message changed from "compacted at the auto window (N tokens)" to "compacting at the auto N window ยท configure with /autocompact"
  • Notification priority changed from "medium" to "immediate" for better visibility
  • Now uses the "suggestion" color theme and a 12-second timeout
Evidence

Notification text updated โ€” search for "compacting at the auto" and "configure with /autocompact"

Better Exit/Detach Labels for Remote Sessions #

When running as a background/remote session with active tasks, the Escape exit message now shows "detach (session keeps running)" instead of "stop session", making it clearer that background work continues after detaching.

Evidence

Dynamic label logic โ€” search for "detach (session keeps running)" and "stop session"

Richer Tool-Call Labels in Status Display #

AskUserQuestion prompts and Plan-mode submissions now show descriptive labels in the status display:

  • Questions show the header/question text (e.g., "Question: Which library?" or "Tap to answer")
  • Plan submissions show "Plan ready for review"
Evidence

Label rendering logic โ€” search for "Tap to answer" and "Plan ready for review"

Hidden Message Count in Focused Mode #

When messages are hidden due to /focus mode, the prompt now displays a count like "3 messages hidden (/focus to show)" to help users know when context has been abbreviated.

Evidence

New label format โ€” search for "hidden (/focus to show)"

Graceful Marketplace Plugin Degradation #

Plugins with unrecognized source types are now stubbed rather than dropped entirely:

  • If a marketplace plugin entry uses a source type not supported by the current Claude Code version, it is preserved as an "unsupported" placeholder
  • Installation attempts fail with a clear "update Claude Code and try again" message
  • This prevents detectDelistedPlugins from incorrectly treating it as removed
Evidence

Plugin stubbing logic โ€” search for "Stubbing unparseable marketplace plugin entry" and "source.source: 'unsupported'"

Daemon CLI Enhancements #

The claude daemon subcommand has been reorganized with new operations:

  • New hub subcommand for interactive daemon management (requires TTY)
  • New list subcommand for a flat view across all worker kinds
  • New scheduled, assistant, remote-control subcommands for per-kind listing and mutation
  • start and restart subcommands are now explicitly disabled with a clear message: "the daemon runs on demand and exits when the last client disconnects"
  • stop --any can now stop transient (non-service) daemons
  • Better status output including pid, version, uptime, origin, and config path
  • Auto-uninstalls stale service files from previous Claude Code versions
Evidence

Help text registered as "Usage: claude daemon [subcommand] [options]..." โ€” search for that string

Improved Explore Agent Description #

The Explore (search) agent description has been rewritten to be more precise about its limitations: it is now described as a "read-only search agent" that should NOT be used for "code review, design-doc auditing, cross-file consistency checks, or open-ended analysis" since it "reads excerpts rather than whole files and will miss content past its read window."

Evidence

New description string โ€” search for "read-only search agent"

Feedback Submission Now Tracks Surface Origin #

The /feedback submission now records the surface field (e.g., "cli") to distinguish reports from different Claude Code surfaces (terminal, CCD, CCW). This helps the triage pipeline route reports correctly.

Evidence

surface parameter in feedback payload โ€” search for "Where the feedback flow was initiated"

File Watcher Error Handling #

Multiple subsystems now log warnings on file watcher errors instead of crashing:

  • [settings] watcher error: for settings file changes
  • [skills] watcher error: for skill file changes
  • [theme] watcher error: for theme file changes
  • [jobStateNameSync] watcher error: for job state changes
  • [useBgSessionPr] watcher error: for background session PR changes
  • FileChanged: watcher error: for general file change detection
Evidence

Search for "watcher error:" in the string diff

Agent Auto-Relaunch Tracking #

A new CLAUDE_AGENTS_AUTO_RELAUNCHED_AT environment variable is set when an agent is automatically relaunched, allowing detection and prevention of relaunch loops.

Evidence

New env var โ€” search for "CLAUDE_AGENTS_AUTO_RELAUNCHED_AT"

Username Validation #

The getUsername() function now validates the system username against a safe regex pattern and falls back to "claude-code-user" if it contains unexpected characters, preventing potential issues with unusual usernames.

Evidence

Username validation with regex test โ€” function xe() at line ~104573

Bug Fixes

3 items
  • Fixed Chrome extension ToolCallTimeoutError and ExtensionDisconnectedMidCallError โ€” new error types provide more specific messaging when the Chrome extension disconnects mid-operation or times out (search for "ExtensionDisconnectedMidCallError")
  • Fixed daemon stop on Windows: the error message now correctly advises using taskkill /PID instead of attempting signals that Windows doesn't support (search for "taskkill /PID")
  • Fixed worktree cleanup handling: uncommitted changes in agent worktrees are now preserved with a warning rather than silently lost (search for "changed file(s) would be lost, kept")
  • Fixed autocompact thrashing detection: the thrashing message now properly triggers on repeated rapid re-compactions (search for "Autocompact is thrashing")
  • Fixed auth token refresh: proactive token refresh failures are now logged and retried with a 60-second delay instead of failing silently (search for "auth: proactive refresh failed")
  • Fixed plan-mode blocking: the post_turn_summary now correctly maps "blocked" status to "need_input" for plan mode flows (search for "status_category")

Lean Prompt System [Gradual Rollout] #

Fix
What

The full lean prompt system that compresses all tool descriptions and system prompt content for reduced token usage.

Status

Feature-flagged behind tengu_vellum_lantern (default false), overridable with CLAUDE_CODE_LEAN_PROMPT=1.

Details
  • Currently restricted to Opus 4.6+ and Opus 4.7 models
  • The tengu_ochre_finch flag controls lean memory prompts independently
  • When fully enabled, tool descriptions are 60-80% shorter while preserving essential usage information
  • Users can preview it now via the environment variable

Memory Write Confirmation [Gradual Rollout] #

Fix
What

The interactive approve/reject dialog for memory file writes.

Status

Feature-flagged behind tengu_slate_siskin (default false), with configurable timeout, throttle, and summary threshold.

Details
  • Full UI infrastructure is in place including diff rendering, AI-powered summaries, and undo capability
  • Configurable via the feature flag's schema: enabled, timeoutMs (1000-120000), throttleMs (0-3600000), summaryLineThreshold (1-50)
  • When enabled, every memory write surfaces a brief confirmation with countdown timer

Daemon Service Cold-Start Prompt [Gradual Rollout] #

Fix
What

Interactive prompt to install the daemon as a persistent system service.

Status

Feature-flagged behind tengu_quiet_harbor (default false โ€” defaults to "transient" mode where daemon spawns on demand without asking).

Details
  • When the flag is enabled (set to return "ask"), the interactive installation prompt appears
  • Can be forced via CLAUDE_CODE_DAEMON_COLD_START=ask environment variable or settings.daemonColdStart