Skip to main content

Claude Code v2.1.288: Ctrl+C Draft Recovery, /code-review --max-findings, and Agents View Search

Claude Code v2.1.288 recovers prompts cleared with Ctrl+C, adds --max-findings to /code-review and name search to the agents view, and fixes resume, auto mode, plugin, MCP and permission issues.

Claude Code v2.1.288 is a large release with 89 changelog entries. It lets you bring back a prompt cleared with Ctrl+C, adds a --max-findings option to /code-review, and adds name search and group navigation to the agents view. Most of the remaining entries fix resume, auto mode, plugins, MCP, hooks and Bash permission checks, and the release also changes where the background command time limit applies.

What’s New

Recover a Prompt Cleared with Ctrl+C

If you clear a prompt with Ctrl+C, pressing Up on the empty prompt now brings the draft back, including any pasted text and images.

--max-findings for /code-review

/code-review now accepts --max-findings <n>|all to report more or fewer findings than the usual limit. Your choice is reused on later reviews until you pass --max-findings default.

Agents View Search and Group Navigation

In the agents view, Ctrl+F finds a session by name and Alt+↑/↓ jumps between groups. Both shortcuts, and rename, can be rebound in keybindings.json. Pressing Enter in the n: filter or in Ctrl+F search now opens the session whose name matches best instead of the top row.

Background Command Time Limit Only in Unattended Sessions

The background command time limit now applies only in unattended sessions (-p, Agent SDK, CI, cloud). Terminal, desktop app and VS Code sessions have no limit.

claude purge and Per-Model /autocompact

claude project purge has been renamed to claude purge; the old name still works and prints a notice. /autocompact now saves the auto-compact window per model, so each model keeps its own setting when you switch.

Auto Mode Classifier Changes

When a conversation grows too long for the client-side safety classifier to review, auto mode now compacts it instead of prompting for, or failing, every tool call. The client-side auto mode classifier also ignores an ANTHROPIC_DEFAULT_SONNET_MODEL pin that names Claude Sonnet 5.5 or Opus 5.5 and uses Claude Sonnet 5 instead.

MCP OAuth Scope and URL Prompts

Claude Code now shows a re-authenticate prompt when an MCP server asks for more OAuth scope during a tool call. URL prompts from MCP servers that can’t report when you’re done now wait for “I’m done, continue” before the tool call continues, so you can finish in the browser first.

New CLAUDE_CODE_DISABLE_STRUCTURED_OUTPUTS Variable

Session titles, memory recall and prompt hooks no longer fail on Mantle or behind gateways that reject structured outputs. The new CLAUDE_CODE_DISABLE_STRUCTURED_OUTPUTS environment variable turns structured outputs off.

Mods and Cloud Sessions

Mods can call $.ui.selection() to get the text you last selected in fullscreen mode and, when the selection lies within one transcript row, that row. Cloud sessions whose image has no GitHub CLI now get a built-in gh api, which also no longer sends control characters from file names, jq filters or GitHub errors to the terminal.

Fixes and Improvements

  • Interrupted responses: Mid-response API timeouts no longer fail the turn — non-interactive sessions and subagents continue from the partial response, and thinking-only responses are retried. Unattended sessions using CLAUDE_CODE_RETRY_WATCHDOG no longer retry for hours after a very long response stream fails; Claude Code streams again and gives up after three timeouts.
  • Compaction: Long conversations no longer fail with “Prompt is too long” instead of auto-compacting when the last reply reported zero token usage.
  • Resume: --resume no longer drops files and other context that a compaction had just restored, resumed sessions save the last response of a turn, transcripts are no longer loaded cut short when the session rewrites the file during the load, and resuming a conversation started on 2.1.286 or earlier keeps the model’s earlier thinking.
  • Permissions: A dangerous rm (such as one on / or the home directory) inside a bash -c or sh -c script no longer runs without a prompt in bypassPermissions mode or under a shell allow rule, and a BASHPID assignment whose value the shell would evaluate as arithmetic now prompts. Bash permission prompts also give a shorter reason when part of a command can’t be checked before it runs.
  • Hooks: PreToolUse and PermissionRequest hooks are no longer skipped when matching them fails or the tool’s input can’t be serialized to JSON — the call is now blocked. idle_prompt notification hooks no longer fire while background agents are still running.
  • Rules and CLAUDE.md: Path-scoped .claude/rules and nested CLAUDE.md files now load when Write or Edit creates or changes a file in their scope, not only on Read.
  • LSP: LSP tool calls no longer hang indefinitely when a language server uses dynamic capability registration or stops responding; requests now time out after 60s (per-server requestTimeout).
  • Plugins: git-subdir installs work on git older than 2.39, claude plugin install falls back to HTTPS for GitHub-source plugins on machines with no GitHub SSH key, plugin LSP servers receive substituted values instead of literal ${user_config.*} and ${CLAUDE_PLUGIN_ROOT} placeholders, and plugins loaded with --plugin-dir show “Configure options” in /plugin.
  • MCP: MCP tool calls no longer sometimes run twice when a remote server’s result was over 16 MB or could not be parsed, and the Agent tool in claude mcp serve no longer rejects every subagent_type.
  • Agent teams: A plugin-defined agent spawned by name now runs with its own prompt, tools, disallowedTools and effort instead of the defaults.
  • Login: /login no longer reports “Login successful” when credentials could not be saved to secure storage; it shows the failure and offers a retry when the new login didn’t take effect.
  • Sandbox: Sandboxed heredocs with an unquoted delimiter (python3 <<EOF) no longer ask for approval on every run under sandbox auto-allow when the body holds only plain text and simple $VAR references.
  • Claude in Chrome: On a site you allowed, Claude in Chrome no longer asks before every screenshot and page read when auto mode is unavailable; typing, navigation and JavaScript still ask.
  • Windows: The keyboard works again after Claude Code restarts itself, such as on first sign-in to a Claude apps gateway, provider setup or /tui.
  • Screen reader mode: Approving a plan, including with Shift+Tab, announces the new permission mode; short announcements stay on screen until your next key press or until something above them changes; and answered questions in question dialogs say “answered”.
  • VS Code: A claude.ai connector stuck on “Needs authentication” can be rechecked with Check connection in the MCP servers dialog, the opt-in New Conversation shortcut (Cmd/Ctrl+N) only starts a conversation in the view you are in, and archiving the session a chat view shows now starts a new conversation instead of resuming the next saved one.
  • Self-hosted runner: A refused gh command now prints its gh api equivalent, --paginate follows every page of a repository’s lists, and a nested claude no longer removes the built-in gh api.
  • Claude Tag: Claude also follows a related Slack thread in another channel that it only read, so updates there reach the conversation that depends on them.

This release contains 89 changes in total; see the full changelog for the complete list.

How to Update

  1. Check your installed version: claude --version
  2. Update in place: claude update
  3. If any scripts call claude project purge, switch them to claude purge; the old name still works but prints a notice.