diff --git a/CHANGELOG.md b/CHANGELOG.md index 20657faf83..7df81e6a88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,164 @@ # Changelog +## 2.1.294 + +- Fixed `prompt` and `agent` hooks written as instructions (such as "Block commands that...") allowing what they should block +- Improved how `prompt` hooks on Stop and SubagentStop written as instructions (such as "Carry on if the build is broken") are judged, so Claude is less likely to stop early + +## 2.1.293 + +- Added Claude Haiku 5.5 (`claude-haiku-5-5`), now the default Haiku model on the Anthropic API — 1M context, $0.10/$0.50 per Mtok ($0.50/$2.50 for prompts over 100K) +- Added `agentType` to the `subagentStatusLine` payload, so scripts can tell custom subagent types apart +- Added `isDeferred` to `$.tool.register` for mods: `false` lists the tool's schema in the prompt from the start instead of behind tool search +- Fixed Claude sometimes treating its own last actions before a context compaction as done after it, and retracting or redoing finished work +- Fixed a memory leak where an HTTP MCP connection kept every request it had sent until it closed +- Fixed a message sent while Claude was working being lost when `←` moved the session to the background; if a queued message can't move, `←` now stays put and says so +- Fixed `/model` effort ←/→ wrapping past the highest or lowest level, which could accidentally save Low as a model's default effort +- Fixed `/tui` disconnecting Claude in Chrome in a session started with `--chrome`, and ignoring `--no-chrome` +- Fixed Claude being told to continue or message subagents with `SendMessage` in sessions, including resumed ones, where a host, a permission rule or a `--tools` list removed that tool +- Fixed subagents and `--agent` sessions being told a built-in tool was disabled for the whole session when only their own tool list left it out +- Fixed a claude.ai-synced skill's edited description sometimes not reaching the model until a new conversation or `/clear` +- Fixed `claude logs`, `stop`, `kill`, `rm` and `claude daemon status`, `stop`, `uninstall` sometimes signing you out when your login had expired or was about to +- Fixed the footer's agents count disappearing after a momentary failure to read the sessions folder (for example, too many open files) +- Fixed a custom agent named `worker` being shown as "Agent" when it starts, and the agent detail dialog's title losing the agent type once the agent finishes +- Fixed the Artifact tool's transcript row briefly reading `Artifact("(unprintable path)")` while a publish call was still streaming in +- Fixed the `/ultrareview` upload on Linux wrongly refusing some repositories, such as one inside another checkout, over a settings file that "could not be parsed" while a sandboxed command was running +- Fixed the `/ultrareview` upload's refusal over split-index files advising a git command that could leave git unable to read its index +- Fixed replies in very long Remote Control and cloud sessions that could still appear a block at a time instead of streaming in +- Fixed Remote Control uploading a session's starting history again after every credential recovery +- Fixed PushNotification reporting "Remote Control inactive" in sessions started with `claude remote-control` +- Fixed a mod's hooks on `classic.*` events being skipped while the plugin hooks worker restarts, which left settings hooks to answer without them +- Fixed `claude plugin test` failing for mods that call `$.session.append`; tests can read the appended rows back with the new `mock.session` +- Fixed `claude plugin eval` refusing every Bash-granting run on Macs with Docker Desktop (links under `~/.docker/bin`); the refusal now names which part of a credential store held the link +- Fixed the Claude apps gateway refusing to start when a `desktop` policy sets Claude Desktop's built-in browser keys, such as `builtinBrowserEnabled` +- Fixed `claude agents` offering bypass permissions that background sessions then ignored when consent was saved only in `.claude/settings.local.json` or a `--settings` file; it now asks for consent first, and a session that ignores bypass shows a short notice that stays +- Fixed `←` backgrounding a session after 10 seconds while the prompt held unsent text (it now cancels the move) or a question was waiting for your answer +- Fixed Esc, or No without feedback, on a permission prompt not stopping the turn when `←` had just been pressed to move the session to the background +- Fixed the agents view briefly replacing the session list with placeholder rows when the sessions folder could not be read (for example, too many open files) +- Fixed path-scoped rules and nested CLAUDE.md files not loading when Claude views a file with a single-file cat, head, tail, sed -n or grep command in the Bash tool instead of the Read tool +- Fixed pasted text that begins and ends with the same words sometimes being sent to Claude as if it had been typed +- Fixed a skill name in pasted text being treated as typed when an accent typed or pasted right after the paste merged into its last letter +- Fixed `/feedback` returning to the drafts list after Ctrl+O or Ctrl+Z while a report was sending, leaving the send impossible to cancel +- Fixed `claude purge` stopping silently (exit 0, or a hang in a terminal) when a file or folder could not be deleted; it now deletes the rest, lists what it could not delete, and exits 1 +- Fixed keybindings.json checks: a lone " " (space key) is no longer reported as an error, and keys like "ctrl+ k" now get a warning +- Fixed vim mode `>>` and `<<` on a line of only spaces leaving the cursor past the end of the line, where a following `x` deleted nothing +- Fixed vim mode: after deleting whole lines in Visual mode (`V` then `d`) the cursor lands on the first non-blank, and `.` after it acts on the cursor's line +- Windows: Fixed stopping a status line, hook, or shell command sometimes terminating an unrelated process that had been given the same process ID +- Reverted the auto mode denial message change from 2.1.281 that told Claude a denial covers the outcome, not only the exact command +- Reverted the 2.1.290 fix for cloud sessions staying asleep after a container restart lost a pending `/loop` wakeup or scheduled task; Claude is no longer told, and the session stays asleep +- Improved startup for Team and Enterprise organizations: policy and managed settings are fetched earlier, and a stalled request is retried after 3 seconds +- Improved Claude in Chrome: fewer page actions are refused when the browser is slow to report its tabs +- Improved the Claude in Chrome message in cloud sessions when the browser can't be reached: if you belong to more than one organization, it now says the extension must be signed in to the same one, and how to change that +- Improved the Bash edit diff note to say the listed files changed while the command ran, which can include writes by other processes +- Improved artifacts: Claude pins libraries to exact versions two weeks old or older +- Changed claude.ai skill syncing to check for changes about every 40 minutes, instead of every 10, while no session is in use +- Changed the order of agent lists and of MCP servers announced to the model: names with non-ASCII characters now sort after ASCII names +- Changed OpenTelemetry `claude_code.at_mention` logging to emit at most 100 agent and 100 MCP-resource events each time a prompt is read +- Self-hosted runner: Changed the orchestrator to sleep 4 to 6 seconds between polls instead of a constant 5, so several replicas for one environment stop polling at the same moment +- [Claude Tag] Fixed Claude in Slack saying a workspace isn't set up in Enterprise Grid channels shared across workspaces when Slack labels a message with a workspace that isn't connected +- [Claude Tag] Fixed Claude in Slack stopping mid-task in a channel when an admin changed the channel's connectors, plugins, skills or rules; the change now applies once Claude finishes +- [Claude Tag] Fixed asking Claude in Slack to run a thread's routine now with extra notes starting a separate run that couldn't post back; the run now continues in that thread +- [Claude Tag] Fixed an access bundle's Add a connector dialog in Claude Tag admin settings showing every Google connector as connected after one Google sign-in +- [Claude Tag] Improved Claude Tag admin settings to list an Enterprise Grid that isn't connected yet, with a Connect button +- [Claude Tag] Changed Claude in Slack to join announcement channels, where only admins can post, without posting its intro +- [Claude Tag] Changed the limit on channel rules in Claude Tag admin settings from 20 to 50 for each workspace and for the organization-wide Slack page +- [Code Review] Improved Code Review's Add a repository dialog to list each repository that couldn't be added and why, such as missing GitHub write access + +## 2.1.292 + +- Added `--marketplace ` to `claude plugin install`: adds the marketplace if needed, under the same policy checks as `claude plugin marketplace add`, then installs the plugin from it +- Added an `effort` parameter to the Agent tool, so Claude runs a sub-agent at the effort level you ask for +- Added `CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS` environment variable to set a longer base delay for the backoff when retrying an overloaded (529) request +- Added `prompt.autocomplete`, an event a mod hooks to add its own rows to the prompt box's autocomplete list +- Added prompt caching to `$.model.complete` for mods: `prompt` and `system` take blocks of text, and `cache: true` on a block caches the request up to it +- Added workflow agents to the `agent.spawn` mod hook, with their run and index, so a mod can refuse them +- Fixed subagent definitions with `permissionMode: auto` entering auto mode when auto mode is unavailable (disabled by settings, circuit breaker, or a model that doesn't support it) +- Fixed sandboxed commands being able to read the staged file copies of `/ultrareview` uploads under `~/.claude/seed-admin` +- Fixed a managed sandbox read-deny path (and user ones beside it) that appears or re-points mid-session not dropping project grants inside it or ending credential injection from files it covers +- Fixed a notebook or PDF read on macOS and Windows being able to return a file outside what was approved, through a link swapped in mid-read +- Fixed a tampered on-disk cache of server-managed settings being able to switch off or unseat the built-in policy plugin while the settings fetch failed +- Fixed `rm -rf` on the 8.3 short name or another alternate Windows spelling of the home folder or a drive not being treated as removing it +- Security: Fixed PreToolUse hook approvals and auto mode bypassing the permission prompt for file reads from network (UNC) paths +- Fixed a skill's or slash command's `allowed-tools` rule coming back in a later turn when you leave auto mode or plan mode partway through that turn +- Fixed `NO_PROXY` being ignored for Claude Code's own API requests (sign-in, policy, feedback, artifacts) when `HTTPS_PROXY` is set +- Fixed an MCP tool with a name longer than 128 characters making every request fail; that tool is now left out and an MCP error names it +- Fixed `claude plugin` commands such as `marketplace add` and `install` running before an organization's managed settings had loaded on a first run +- Fixed one-shot `claude -p` and Agent SDK runs stopping a background command 5 seconds after the final result, and one-shot `claude -p` runs dropping a scheduled wakeup; both are now waited for +- Fixed plan mode not being restored when resuming a session from the `claude --resume` session picker or with `/resume` +- Fixed saved scheduled tasks created after `/resume`, `/branch` or `/clear` never firing, and saved tasks ignoring later creates and deletes after two writes to the tasks file milliseconds apart +- Fixed a background session's `/loop` silently stopping when the session's process restarted (for example after a crash), because its pending wakeup was lost +- Fixed Grep and Glob reporting no matches when the file or folder they were given could not be read; Claude now retries once or tells you +- Fixed the Read tool returning only the first entry, with no error, when a PDF's `pages` was a list such as "6,9,15"; it now returns an error saying to read each page or range separately +- Fixed @-mentioned text files over 256KB being left out silently: Claude is now told the file's size and to read it in portions +- Fixed the usage limit alert repeating once per background agent when agents failed on a limit that had already stopped the main conversation +- Fixed Remote Control viewers seeing an empty subagent pane for background subagents in sessions hosted by the desktop app or an IDE +- Fixed cross-session delivery notices showing two sessions with similar names as one recipient, and the expiry notice blaming the desktop app when a terminal session let the message lapse +- Fixed Send now in the desktop app ending the subagent a turn was waiting on when another message was already queued +- Fixed `/bug`, `/share` and `/feedback ` starting over after Ctrl+O or Ctrl+Z while a report was being sent, and closing as cancelled after it had been sent +- Fixed `/remote-env` replacing your saved default environment when you pressed Enter right away: the list now opens on your default, and no row has a check mark when no default is in effect +- Fixed some pasted text reaching Claude as typed text when several pastes overlapped in one prompt +- Fixed vim mode leaving the cursor past the end of a line, j/k losing their column on shorter lines, and `f`/`t`/`F`/`T`/`;`/`,` jumping to, or deleting up to, a match on another line of the prompt +- Fixed `/add-dir` path box letting Shift+Enter or a paste add a line break, and treating fast-typed "tab", "up" or "down" as those keys +- Fixed fast typing, input-method text and decomposed accents being dropped while a prompt footer row was selected, and `!` leaving the row selected +- Fixed fullscreen mode sending a full-screen clear on every window resize and Ctrl+L when iTerm2 is detected, which may be what filled iTerm2's scrollback with stale pages +- Fixed a spurious "could not be examined" note for @-words that name no file when a Read deny rule is set and the working directory is under a symlink +- Fixed "instruction file not loaded" lines going stale or missing after `/cd` or a permission change, and added a transcript line when a nested one isn't loaded +- Fixed a compaction summary that repeated `/name` letting Claude invoke a skill that is reserved for the user +- Fixed Write, Edit, NotebookEdit and LSP rows, and single Read, Grep and Glob rows, hiding why a mod denied the call: the row now shows the reason +- Fixed a cloud session showing a turn that never ended when its worker was stopped just as the turn finished +- Fixed cloud sessions with a large transcript sometimes asking for a permission again after it was approved +- Fixed scheduled tasks and other queued notifications being lost in cloud sessions when a message was retried or edited while Claude was reading them +- Fixed cloud sessions forgetting the thinking setting chosen in the client when the session's container restarted +- Fixed Cowork cloud sessions saying a proxy blocked artifacts when Anthropic couldn't confirm the organization's settings +- Fixed plugins whose hooks module makes many `$.state` calls through one const taking minutes to load or validate +- Fixed `claude plugin validate` listing a matcher or state value for a hooks module that the engine reads from elsewhere +- Fixed `claude plugin validate` listing a `$.state` value read through a top-level `var` that was declared again or reassigned; such a module is now refused +- Fixed a plugin's served `$` method restarting the hook origin, which could run a guard hook with a `.catch` above it again without end +- Fixed plugin interface calls made while the plugin hooks worker restarts running without the hooks other plugins put on them +- Fixed a mod's `config.set`, `state.set`, `env.set` or `agent.spawn` hook that denies after calling `next(e)` being answered as a refusal: the hook is now reported as failed, by name +- Fixed `/theme`, the `/config` Theme menu and the first-run theme step saving a theme before a plugin's `config.set` hook was asked +- Fixed a plugin's `tool.check` hook answering allow running a tool that requires your answer (a question, a plan approval) without showing its dialog +- Fixed a mod's start-up prompt, command or subagent being queued a second time when the hooks worker was replaced +- Fixed a mod's hook that called `next(e)` and then failed while the turn was interrupted letting the call through; the call is now rejected +- Fixed a plugin's prompt drop or setting deny being ignored when its reason was longer than 4,096 characters +- Fixed an organization's plugin being unloaded on its own reload, or after another plugin crashed, when it returned a `$` name that a user-installed mod had added; the mod is now unloaded instead +- Fixed tool calls made while the plugin hooks worker restarts being answered without the plugins' permission hooks +- Fixed plugin `tool.call` hooks seeing some tool calls before misnamed parameters were repaired; a hook now sees the arguments the tool will run with +- Fixed a mod's guard hook with a `.catch` being skipped silently for calls another mod's hook makes beneath the guard's own `$` call; its `.catch` is now asked +- Improved startup of `claude -p` and SDK sessions: the first turn no longer waits for HTTP and SSE MCP servers to answer `resources/list` +- Improved rendering speed of long bulleted or numbered replies: they stream, resize and re-open in the transcript (ctrl+o) much faster +- Improved Ctrl+C draft recovery: a cleared prompt now stays reachable with Up after a slash command or a sent message +- Improved hook output handling: `` tags written in a hook's output are escaped before they reach Claude +- Improved tool input handling: Grep accepts `file_path` for `path`, and Write, WebFetch and Read ignore a few stray parameters instead of failing the call +- Improved the steps shown when a marketplace declared in a settings file has a name that looks like an official Anthropic marketplace +- Improved sandbox auto-allow: with strict sandbox mode set in user, managed or --settings settings, an interpreter command with an env var prefix like `FOO=bar python3 app.py` runs unprompted +- Improved the Artifact tool's listing: Claude now sees how many published artifacts you have and can list up to 200 at once instead of 50 +- Improved cloud sessions after a restart: Claude is now told which stopped background agents it can resume by id +- Improved the Claude in Chrome message in claude.ai cloud sessions when the browser can't be reached: Claude is now told it may continue with alternatives if the user prefers +- Improved the /focus tip: it now invites you to try focus view mid-turn and shows how to switch back +- Improved startup with local (stdio) MCP servers that ignore the newer protocol check: after one slow connect they are remembered for 7 days and connected the older way without the wait +- Changed local (stdio) MCP server connections to negotiate protocol version 2026-07-28 by default on every install, including Bedrock, Vertex and Foundry; `MCP_PROTOCOL_NEGOTIATION=legacy` opts out +- Changed `claude plugin test`: a failed `expect` inside a hook the test registered, or a stub answer the engine refuses, now fails the test instead of passing silently +- Changed usage limit messages to write claude.ai settings links with https:// so terminals and apps can make them clickable +- Changed scheduled and Run now routine runs to publish a new artifact only you can see without asking for approval; artifacts that request connectors or other access still ask +- Changed agent names to allow at most 256 characters: a longer one is rejected, and a skill's or a plugin file's `name` longer than that is ignored +- [Cloud sessions] Fixed routine runs occasionally staying listed as running for hours after they had finished +- [Cloud sessions] Fixed editing or duplicating a routine turning off its push notifications when the routine had no saved notification setting +- [Cloud sessions] Fixed SVG, HEIC, TIFF and other less common image files failing to attach; they now attach as regular files +- [Cloud sessions] Fixed approval prompts offering "Always allow" for connector tools that an organization set to require approval; the choice had no effect +- [Remote Control] Fixed the first message of a new Remote Control session started from claude.ai/code accepting only images; it now accepts PDFs and other files like later messages +- [Claude Tag] Added an Edit button to the Allowed domains card on a channel's Configure page, so Enterprise admins can open the access bundle that sets the channel's domains +- [Claude Tag] Fixed replies sent in a Slack thread while Claude was still on its first request there being held until that request finished, or missed when sent seconds apart +- [Claude Tag] Fixed Slack threads woken only by GitHub pull request activity or a routine staying on their original model after an admin changed the channel or workspace default model +- [Claude Tag] Fixed Claude sometimes posting a spend limit notice in Slack when the real cause was that your organization had run out of usage credits +- [Claude Tag] Fixed a session hanging until interrupted when a permission prompt that can't be answered from Slack was denied automatically +- [Claude Tag] Improved `@Claude !status` in a channel to say when Claude has stopped reading its untagged messages, why, and that an @-mention starts it reading again +- [Claude Tag] Changed the first message of a Slack thread continued with `!fork` to a card showing where it came from, the request, and who asked, with a link to the original thread +- [Claude Tag] Changed the organization-wide and default spend limit boxes on Claude Tag's spend limits page in admin settings to save only when you press Save or Enter, not when you click away +- [Code Review] Added the period's total with its change from the previous period, and a breakdown by repository, to the PRs reviewed chart in Code Review analytics +- [Code Review] Fixed a queued review failing when the pull request moved to a new base branch and the old one was deleted; the commit is now re-queued for review +- [Code Review] Fixed reviews ignoring a CLAUDE.md's rules when the pull request edits that file; reviews now use its version from the base branch + ## 2.1.291 - Fixed a regression in 2.1.290 where cloud sessions could drop answers to permission prompts diff --git a/feed.xml b/feed.xml index f3109ddee0..3d0ba85168 100644 --- a/feed.xml +++ b/feed.xml @@ -6,7 +6,175 @@ Anthropic - 2026-10-06T03:54:58Z + 2026-10-08T05:03:36Z + + https://github.com/anthropics/claude-code/releases/tag/v2.1.294 + Claude Code v2.1.294 + + 2026-10-08T05:03:36Z + <p>• Fixed prompt and agent hooks written as instructions (such as "Block commands that...") allowing what they should block</p> +<p>• Improved how prompt hooks on Stop and SubagentStop written as instructions (such as "Carry on if the build is broken") are judged, so Claude is less likely to stop early</p> + + + https://github.com/anthropics/claude-code/releases/tag/v2.1.293 + Claude Code v2.1.293 + + 2026-10-07T18:10:03Z + <p>• Added Claude Haiku 5.5 (claude-haiku-5-5), now the default Haiku model on the Anthropic API — 1M context, $0.10/$0.50 per Mtok ($0.50/$2.50 for prompts over 100K)</p> +<p>• Added agentType to the subagentStatusLine payload, so scripts can tell custom subagent types apart</p> +<p>• Added isDeferred to $.tool.register for mods: false lists the tool's schema in the prompt from the start instead of behind tool search</p> +<p>• Fixed Claude sometimes treating its own last actions before a context compaction as done after it, and retracting or redoing finished work</p> +<p>• Fixed a memory leak where an HTTP MCP connection kept every request it had sent until it closed</p> +<p>• Fixed a message sent while Claude was working being lost when ← moved the session to the background; if a queued message can't move, ← now stays put and says so</p> +<p>• Fixed /model effort ←/→ wrapping past the highest or lowest level, which could accidentally save Low as a model's default effort</p> +<p>• Fixed /tui disconnecting Claude in Chrome in a session started with --chrome, and ignoring --no-chrome</p> +<p>• Fixed Claude being told to continue or message subagents with SendMessage in sessions, including resumed ones, where a host, a permission rule or a --tools list removed that tool</p> +<p>• Fixed subagents and --agent sessions being told a built-in tool was disabled for the whole session when only their own tool list left it out</p> +<p>• Fixed a claude.ai-synced skill's edited description sometimes not reaching the model until a new conversation or /clear</p> +<p>• Fixed claude logs, stop, kill, rm and claude daemon status, stop, uninstall sometimes signing you out when your login had expired or was about to</p> +<p>• Fixed the footer's agents count disappearing after a momentary failure to read the sessions folder (for example, too many open files)</p> +<p>• Fixed a custom agent named worker being shown as "Agent" when it starts, and the agent detail dialog's title losing the agent type once the agent finishes</p> +<p>• Fixed the Artifact tool's transcript row briefly reading Artifact("(unprintable path)") while a publish call was still streaming in</p> +<p>• Fixed the /ultrareview upload on Linux wrongly refusing some repositories, such as one inside another checkout, over a settings file that "could not be parsed" while a sandboxed command was running</p> +<p>• Fixed the /ultrareview upload's refusal over split-index files advising a git command that could leave git unable to read its index</p> +<p>• Fixed replies in very long Remote Control and cloud sessions that could still appear a block at a time instead of streaming in</p> +<p>• Fixed Remote Control uploading a session's starting history again after every credential recovery</p> +<p>• Fixed PushNotification reporting "Remote Control inactive" in sessions started with claude remote-control</p> +<p>• Fixed a mod's hooks on classic.* events being skipped while the plugin hooks worker restarts, which left settings hooks to answer without them</p> +<p>• Fixed claude plugin test failing for mods that call $.session.append; tests can read the appended rows back with the new mock.session</p> +<p>• Fixed claude plugin eval refusing every Bash-granting run on Macs with Docker Desktop (links under ~/.docker/bin); the refusal now names which part of a credential store held the link</p> +<p>• Fixed the Claude apps gateway refusing to start when a desktop policy sets Claude Desktop's built-in browser keys, such as builtinBrowserEnabled</p> +<p>• Fixed claude agents offering bypass permissions that background sessions then ignored when consent was saved only in .claude/settings.local.json or a --settings file; it now asks for consent first, and a session that ignores bypass shows a short notice that stays</p> +<p>• Fixed ← backgrounding a session after 10 seconds while the prompt held unsent text (it now cancels the move) or a question was waiting for your answer</p> +<p>• Fixed Esc, or No without feedback, on a permission prompt not stopping the turn when ← had just been pressed to move the session to the background</p> +<p>• Fixed the agents view briefly replacing the session list with placeholder rows when the sessions folder could not be read (for example, too many open files)</p> +<p>• Fixed path-scoped rules and nested CLAUDE.md files not loading when Claude views a file with a single-file cat, head, tail, sed -n or grep command in the Bash tool instead of the Read tool</p> +<p>• Fixed pasted text that begins and ends with the same words sometimes being sent to Claude as if it had been typed</p> +<p>• Fixed a skill name in pasted text being treated as typed when an accent typed or pasted right after the paste merged into its last letter</p> +<p>• Fixed /feedback returning to the drafts list after Ctrl+O or Ctrl+Z while a report was sending, leaving the send impossible to cancel</p> +<p>• Fixed claude purge stopping silently (exit 0, or a hang in a terminal) when a file or folder could not be deleted; it now deletes the rest, lists what it could not delete, and exits 1</p> +<p>• Fixed keybindings.json checks: a lone " " (space key) is no longer reported as an error, and keys like "ctrl+ k" now get a warning</p> +<p>• Fixed vim mode &gt;&gt; and &lt;&lt; on a line of only spaces leaving the cursor past the end of the line, where a following x deleted nothing</p> +<p>• Fixed vim mode: after deleting whole lines in Visual mode (V then d) the cursor lands on the first non-blank, and . after it acts on the cursor's line</p> +<p>• Windows: Fixed stopping a status line, hook, or shell command sometimes terminating an unrelated process that had been given the same process ID</p> +<p>• Reverted the auto mode denial message change from 2.1.281 that told Claude a denial covers the outcome, not only the exact command</p> +<p>• Reverted the 2.1.290 fix for cloud sessions staying asleep after a container restart lost a pending /loop wakeup or scheduled task; Claude is no longer told, and the session stays asleep</p> +<p>• Improved startup for Team and Enterprise organizations: policy and managed settings are fetched earlier, and a stalled request is retried after 3 seconds</p> +<p>• Improved Claude in Chrome: fewer page actions are refused when the browser is slow to report its tabs</p> +<p>• Improved the Claude in Chrome message in cloud sessions when the browser can't be reached: if you belong to more than one organization, it now says the extension must be signed in to the same one, and how to change that</p> +<p>• Improved the Bash edit diff note to say the listed files changed while the command ran, which can include writes by other processes</p> +<p>• Improved artifacts: Claude pins libraries to exact versions two weeks old or older</p> +<p>• Changed claude.ai skill syncing to check for changes about every 40 minutes, instead of every 10, while no session is in use</p> +<p>• Changed the order of agent lists and of MCP servers announced to the model: names with non-ASCII characters now sort after ASCII names</p> +<p>• Changed OpenTelemetry claude_code.at_mention logging to emit at most 100 agent and 100 MCP-resource events each time a prompt is read</p> +<p>• Self-hosted runner: Changed the orchestrator to sleep 4 to 6 seconds between polls instead of a constant 5, so several replicas for one environment stop polling at the same moment</p> +<p>• [Claude Tag] Fixed Claude in Slack saying a workspace isn't set up in Enterprise Grid channels shared across workspaces when Slack labels a message with a workspace that isn't connected</p> +<p>• [Claude Tag] Fixed Claude in Slack stopping mid-task in a channel when an admin changed the channel's connectors, plugins, skills or rules; the change now applies once Claude finishes</p> +<p>• [Claude Tag] Fixed asking Claude in Slack to run a thread's routine now with extra notes starting a separate run that couldn't post back; the run now continues in that thread</p> +<p>• [Claude Tag] Fixed an access bundle's Add a connector dialog in Claude Tag admin settings showing every Google connector as connected after one Google sign-in</p> +<p>• [Claude Tag] Improved Claude Tag admin settings to list an Enterprise Grid that isn't connected yet, with a Connect button</p> +<p>• [Claude Tag] Changed Claude in Slack to join announcement channels, where only admins can post, without posting its intro</p> +<p>• [Claude Tag] Changed the limit on channel rules in Claude Tag admin settings from 20 to 50 for each workspace and for the organization-wide Slack page</p> +<p>• [Code Review] Improved Code Review's Add a repository dialog to list each repository that couldn't be added and why, such as missing GitHub write access</p> + + + https://github.com/anthropics/claude-code/releases/tag/v2.1.292 + Claude Code v2.1.292 + + 2026-10-06T18:59:09Z + <p>• Added --marketplace &lt;source&gt; to claude plugin install: adds the marketplace if needed, under the same policy checks as claude plugin marketplace add, then installs the plugin from it</p> +<p>• Added an effort parameter to the Agent tool, so Claude runs a sub-agent at the effort level you ask for</p> +<p>• Added CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS environment variable to set a longer base delay for the backoff when retrying an overloaded (529) request</p> +<p>• Added prompt.autocomplete, an event a mod hooks to add its own rows to the prompt box's autocomplete list</p> +<p>• Added prompt caching to $.model.complete for mods: prompt and system take blocks of text, and cache: true on a block caches the request up to it</p> +<p>• Added workflow agents to the agent.spawn mod hook, with their run and index, so a mod can refuse them</p> +<p>• Fixed subagent definitions with permissionMode: auto entering auto mode when auto mode is unavailable (disabled by settings, circuit breaker, or a model that doesn't support it)</p> +<p>• Fixed sandboxed commands being able to read the staged file copies of /ultrareview uploads under ~/.claude/seed-admin</p> +<p>• Fixed a managed sandbox read-deny path (and user ones beside it) that appears or re-points mid-session not dropping project grants inside it or ending credential injection from files it covers</p> +<p>• Fixed a notebook or PDF read on macOS and Windows being able to return a file outside what was approved, through a link swapped in mid-read</p> +<p>• Fixed a tampered on-disk cache of server-managed settings being able to switch off or unseat the built-in policy plugin while the settings fetch failed</p> +<p>• Fixed rm -rf on the 8.3 short name or another alternate Windows spelling of the home folder or a drive not being treated as removing it</p> +<p>• Security: Fixed PreToolUse hook approvals and auto mode bypassing the permission prompt for file reads from network (UNC) paths</p> +<p>• Fixed a skill's or slash command's allowed-tools rule coming back in a later turn when you leave auto mode or plan mode partway through that turn</p> +<p>• Fixed NO_PROXY being ignored for Claude Code's own API requests (sign-in, policy, feedback, artifacts) when HTTPS_PROXY is set</p> +<p>• Fixed an MCP tool with a name longer than 128 characters making every request fail; that tool is now left out and an MCP error names it</p> +<p>• Fixed claude plugin commands such as marketplace add and install running before an organization's managed settings had loaded on a first run</p> +<p>• Fixed one-shot claude -p and Agent SDK runs stopping a background command 5 seconds after the final result, and one-shot claude -p runs dropping a scheduled wakeup; both are now waited for</p> +<p>• Fixed plan mode not being restored when resuming a session from the claude --resume session picker or with /resume</p> +<p>• Fixed saved scheduled tasks created after /resume, /branch or /clear never firing, and saved tasks ignoring later creates and deletes after two writes to the tasks file milliseconds apart</p> +<p>• Fixed a background session's /loop silently stopping when the session's process restarted (for example after a crash), because its pending wakeup was lost</p> +<p>• Fixed Grep and Glob reporting no matches when the file or folder they were given could not be read; Claude now retries once or tells you</p> +<p>• Fixed the Read tool returning only the first entry, with no error, when a PDF's pages was a list such as "6,9,15"; it now returns an error saying to read each page or range separately</p> +<p>• Fixed @-mentioned text files over 256KB being left out silently: Claude is now told the file's size and to read it in portions</p> +<p>• Fixed the usage limit alert repeating once per background agent when agents failed on a limit that had already stopped the main conversation</p> +<p>• Fixed Remote Control viewers seeing an empty subagent pane for background subagents in sessions hosted by the desktop app or an IDE</p> +<p>• Fixed cross-session delivery notices showing two sessions with similar names as one recipient, and the expiry notice blaming the desktop app when a terminal session let the message lapse</p> +<p>• Fixed Send now in the desktop app ending the subagent a turn was waiting on when another message was already queued</p> +<p>• Fixed /bug, /share and /feedback &lt;text&gt; starting over after Ctrl+O or Ctrl+Z while a report was being sent, and closing as cancelled after it had been sent</p> +<p>• Fixed /remote-env replacing your saved default environment when you pressed Enter right away: the list now opens on your default, and no row has a check mark when no default is in effect</p> +<p>• Fixed some pasted text reaching Claude as typed text when several pastes overlapped in one prompt</p> +<p>• Fixed vim mode leaving the cursor past the end of a line, j/k losing their column on shorter lines, and f/t/F/T/;/, jumping to, or deleting up to, a match on another line of the prompt</p> +<p>• Fixed /add-dir path box letting Shift+Enter or a paste add a line break, and treating fast-typed "tab", "up" or "down" as those keys</p> +<p>• Fixed fast typing, input-method text and decomposed accents being dropped while a prompt footer row was selected, and ! leaving the row selected</p> +<p>• Fixed fullscreen mode sending a full-screen clear on every window resize and Ctrl+L when iTerm2 is detected, which may be what filled iTerm2's scrollback with stale pages</p> +<p>• Fixed a spurious "could not be examined" note for @-words that name no file when a Read deny rule is set and the working directory is under a symlink</p> +<p>• Fixed "instruction file not loaded" lines going stale or missing after /cd or a permission change, and added a transcript line when a nested one isn't loaded</p> +<p>• Fixed a compaction summary that repeated /name letting Claude invoke a skill that is reserved for the user</p> +<p>• Fixed Write, Edit, NotebookEdit and LSP rows, and single Read, Grep and Glob rows, hiding why a mod denied the call: the row now shows the reason</p> +<p>• Fixed a cloud session showing a turn that never ended when its worker was stopped just as the turn finished</p> +<p>• Fixed cloud sessions with a large transcript sometimes asking for a permission again after it was approved</p> +<p>• Fixed scheduled tasks and other queued notifications being lost in cloud sessions when a message was retried or edited while Claude was reading them</p> +<p>• Fixed cloud sessions forgetting the thinking setting chosen in the client when the session's container restarted</p> +<p>• Fixed Cowork cloud sessions saying a proxy blocked artifacts when Anthropic couldn't confirm the organization's settings</p> +<p>• Fixed plugins whose hooks module makes many $.state calls through one const taking minutes to load or validate</p> +<p>• Fixed claude plugin validate listing a matcher or state value for a hooks module that the engine reads from elsewhere</p> +<p>• Fixed claude plugin validate listing a $.state value read through a top-level var that was declared again or reassigned; such a module is now refused</p> +<p>• Fixed a plugin's served $ method restarting the hook origin, which could run a guard hook with a .catch above it again without end</p> +<p>• Fixed plugin interface calls made while the plugin hooks worker restarts running without the hooks other plugins put on them</p> +<p>• Fixed a mod's config.set, state.set, env.set or agent.spawn hook that denies after calling next(e) being answered as a refusal: the hook is now reported as failed, by name</p> +<p>• Fixed /theme, the /config Theme menu and the first-run theme step saving a theme before a plugin's config.set hook was asked</p> +<p>• Fixed a plugin's tool.check hook answering allow running a tool that requires your answer (a question, a plan approval) without showing its dialog</p> +<p>• Fixed a mod's start-up prompt, command or subagent being queued a second time when the hooks worker was replaced</p> +<p>• Fixed a mod's hook that called next(e) and then failed while the turn was interrupted letting the call through; the call is now rejected</p> +<p>• Fixed a plugin's prompt drop or setting deny being ignored when its reason was longer than 4,096 characters</p> +<p>• Fixed an organization's plugin being unloaded on its own reload, or after another plugin crashed, when it returned a $ name that a user-installed mod had added; the mod is now unloaded instead</p> +<p>• Fixed tool calls made while the plugin hooks worker restarts being answered without the plugins' permission hooks</p> +<p>• Fixed plugin tool.call hooks seeing some tool calls before misnamed parameters were repaired; a hook now sees the arguments the tool will run with</p> +<p>• Fixed a mod's guard hook with a .catch being skipped silently for calls another mod's hook makes beneath the guard's own $ call; its .catch is now asked</p> +<p>• Improved startup of claude -p and SDK sessions: the first turn no longer waits for HTTP and SSE MCP servers to answer resources/list</p> +<p>• Improved rendering speed of long bulleted or numbered replies: they stream, resize and re-open in the transcript (ctrl+o) much faster</p> +<p>• Improved Ctrl+C draft recovery: a cleared prompt now stays reachable with Up after a slash command or a sent message</p> +<p>• Improved hook output handling: &lt;system-reminder&gt; tags written in a hook's output are escaped before they reach Claude</p> +<p>• Improved tool input handling: Grep accepts file_path for path, and Write, WebFetch and Read ignore a few stray parameters instead of failing the call</p> +<p>• Improved the steps shown when a marketplace declared in a settings file has a name that looks like an official Anthropic marketplace</p> +<p>• Improved sandbox auto-allow: with strict sandbox mode set in user, managed or --settings settings, an interpreter command with an env var prefix like FOO=bar python3 app.py runs unprompted</p> +<p>• Improved the Artifact tool's listing: Claude now sees how many published artifacts you have and can list up to 200 at once instead of 50</p> +<p>• Improved cloud sessions after a restart: Claude is now told which stopped background agents it can resume by id</p> +<p>• Improved the Claude in Chrome message in claude.ai cloud sessions when the browser can't be reached: Claude is now told it may continue with alternatives if the user prefers</p> +<p>• Improved the /focus tip: it now invites you to try focus view mid-turn and shows how to switch back</p> +<p>• Improved startup with local (stdio) MCP servers that ignore the newer protocol check: after one slow connect they are remembered for 7 days and connected the older way without the wait</p> +<p>• Changed local (stdio) MCP server connections to negotiate protocol version 2026-07-28 by default on every install, including Bedrock, Vertex and Foundry; MCP_PROTOCOL_NEGOTIATION=legacy opts out</p> +<p>• Changed claude plugin test: a failed expect inside a hook the test registered, or a stub answer the engine refuses, now fails the test instead of passing silently</p> +<p>• Changed usage limit messages to write claude.ai settings links with https:// so terminals and apps can make them clickable</p> +<p>• Changed scheduled and Run now routine runs to publish a new artifact only you can see without asking for approval; artifacts that request connectors or other access still ask</p> +<p>• Changed agent names to allow at most 256 characters: a longer one is rejected, and a skill's or a plugin file's name longer than that is ignored</p> +<p>• [Cloud sessions] Fixed routine runs occasionally staying listed as running for hours after they had finished</p> +<p>• [Cloud sessions] Fixed editing or duplicating a routine turning off its push notifications when the routine had no saved notification setting</p> +<p>• [Cloud sessions] Fixed SVG, HEIC, TIFF and other less common image files failing to attach; they now attach as regular files</p> +<p>• [Cloud sessions] Fixed approval prompts offering "Always allow" for connector tools that an organization set to require approval; the choice had no effect</p> +<p>• [Remote Control] Fixed the first message of a new Remote Control session started from claude.ai/code accepting only images; it now accepts PDFs and other files like later messages</p> +<p>• [Claude Tag] Added an Edit button to the Allowed domains card on a channel's Configure page, so Enterprise admins can open the access bundle that sets the channel's domains</p> +<p>• [Claude Tag] Fixed replies sent in a Slack thread while Claude was still on its first request there being held until that request finished, or missed when sent seconds apart</p> +<p>• [Claude Tag] Fixed Slack threads woken only by GitHub pull request activity or a routine staying on their original model after an admin changed the channel or workspace default model</p> +<p>• [Claude Tag] Fixed Claude sometimes posting a spend limit notice in Slack when the real cause was that your organization had run out of usage credits</p> +<p>• [Claude Tag] Fixed a session hanging until interrupted when a permission prompt that can't be answered from Slack was denied automatically</p> +<p>• [Claude Tag] Improved @Claude !status in a channel to say when Claude has stopped reading its untagged messages, why, and that an @-mention starts it reading again</p> +<p>• [Claude Tag] Changed the first message of a Slack thread continued with !fork to a card showing where it came from, the request, and who asked, with a link to the original thread</p> +<p>• [Claude Tag] Changed the organization-wide and default spend limit boxes on Claude Tag's spend limits page in admin settings to save only when you press Save or Enter, not when you click away</p> +<p>• [Code Review] Added the period's total with its change from the previous period, and a breakdown by repository, to the PRs reviewed chart in Code Review analytics</p> +<p>• [Code Review] Fixed a queued review failing when the pull request moved to a new base branch and the old one was deleted; the commit is now re-queued for review</p> +<p>• [Code Review] Fixed reviews ignoring a CLAUDE.md's rules when the pull request edits that file; reviews now use its version from the base branch</p> + https://github.com/anthropics/claude-code/releases/tag/v2.1.291 Claude Code v2.1.291 @@ -1611,183 +1779,4 @@ <p>• [Code Review] Improved how Code Review words each posted finding: short plain sentences that say who is affected, where the code goes wrong, and the fix up front</p> <p>• [Code Review] Improved the check-run card and PR comment when a review is skipped because of an organization limit: each cause now links the admin page that fixes it</p> - - https://github.com/anthropics/claude-code/releases/tag/v2.1.273 - Claude Code v2.1.273 - - 2026-09-15T20:22:55Z - <p>• Added x-claude-code-request-class, x-claude-code-agent-type, x-claude-code-prev-tool-durations, x-claude-code-compaction and x-claude-code-context-compacted request headers for LLM gateways; opt in with CLAUDE_CODE_GATEWAY_HINT_HEADERS=1</p> -<p>• Added a notification when an MCP server disconnects mid-session and automatic reconnection gives up, pointing at /mcp</p> -<p>• Added forking a session started with claude --remote-control or /remote-control from the Claude app; the fork runs as a background session on your computer</p> -<p>• Fixed Bash commands the permission checker cannot fully analyze skipping the prompt under permissions.blockReadsOutsideWorkingDirectories, and a subshell hiding a dangerous rm in bypass mode</p> -<p>• Fixed skills synced from claude.ai staying available after your organization turns Skills off; they now move to the recoverable trash</p> -<p>• Fixed allowManagedMcpServersOnly, deniedMcpServers and disableClaudeAiConnectors set via MDM or managed-settings.json being ignored when server-managed settings are also present</p> -<p>• Fixed 401/403 errors on Bedrock, Vertex and Foundry, and Claude apps gateway 403s, telling you to run /login; the message now names the credential to refresh or points to your gateway administrator</p> -<p>• Fixed /login, /upgrade, and /extra-usage discarding earlier thinking from the conversation, which forced a full prompt-cache rewrite on the next request</p> -<p>• Fixed auto mode stopping for approval when the Artifact tool uploads a file you attached to the chat in a cloud or Remote Control session</p> -<p>• Fixed a long-running session recreating a stub .git/info/exclude after the repository's .git directory was removed or moved away</p> -<p>• Fixed the main prompt dropping a ! typed at the start while already in shell mode, so negated commands like ! grep … can be typed</p> -<p>• Fixed Read on macOS refusing a dragged-in screenshot, or any file the system reports under a second path, with "symlink resolution changed after permission was checked"</p> -<p>• Fixed permissions.blockReadsOutsideWorkingDirectories: a memory directory chosen by a repository's settings is no longer loaded into the prompt, recalled, indexed, or used by memory extraction</p> -<p>• Fixed sub-agents and background agents being reported as failed, with their result never delivered, when the final streamed reply omitted token usage or carried no model id</p> -<p>• Fixed the context meter and auto-compact counting advisor-tool turns at roughly twice their real context size, which made auto-compact fire at about half the real window</p> -<p>• Fixed /tui refusing to restart because of an agent-team teammate that had already finished its work and was no longer shown in the agents panel</p> -<p>• Fixed saved scheduled tasks running in the wrong session after .claude/scheduled_tasks.json was copied into another folder, such as a new worktree</p> -<p>• Fixed SDK and --output-format stream-json output dropping a subagent's remaining messages and final report after it is moved to the background mid-run (e.g. by CLAUDE_AUTO_BACKGROUND_TASKS)</p> -<p>• Fixed /install-github-app reporting a SAML single sign-on block as "admin permissions required"</p> -<p>• Fixed Remote Control clients attached to a Claude Desktop, VS Code or JetBrains session being refused when they ask for the session's context window usage</p> -<p>• Fixed the spinner showing a doubled ellipsis ("……") on compaction status lines such as "Running PreCompact hooks…"</p> -<p>• Fixed a false-positive spinner tip suggesting the frontend-design plugin after reading or publishing Artifacts</p> -<p>• Reverted a 2.1.268 change that checked Read and Edit deny rules on Bash lines the permission checker can't analyze (eval, env -C); commands like time -p make build prompt again instead of being denied</p> -<p>• Improved responsiveness in long sessions: hook progress and sub-agent activity no longer re-process the whole conversation on every update</p> -<p>• Improved the Artifact tool's error when a publish includes a file type artifacts don't serve: Claude is told which types are served and what to do instead, and the terminal shows one plain line</p> -<p>• Improved the Artifact tool's page read to state the capabilities and database rules the artifact service holds for the page, for anyone who can publish to it</p> -<p>• Improved artifact database writes: an update can now remove a single field instead of rewriting the whole document</p> -<p>• Improved artifact publishing: a publish whose connection drops after reaching claude.ai is now re-sent safely instead of failing or creating a duplicate version</p> -<p>• Improved the cloud-session GitHub error for an IP allow list, a suspended app installation or SAML single sign-on to show the cause instead of a generic install hint</p> -<p>• Improved /autofix-pr: when gh pr view fails it now shows gh's own error (sign-in, SAML, rate limit) instead of a generic exit-code line</p> -<p>• Improved /autofix-pr to say why GitHub webhook delivery couldn't be set up for the PR (for example, no linked GitHub account) instead of a generic warning</p> -<p>• Improved /web-setup errors: a refused GitHub token now lists the likely reasons and the fix, and a connection failure names a configured proxy or TLS certificate problem</p> -<p>• Improved the in-session SSL certificate and proxy connection errors to name the error code and what to fix, such as NODE_EXTRA_CA_CERTS for an untrusted corporate CA</p> -<p>• Improved the error when a cloud session can't be created because your Claude login expired or was revoked: it now tells you to run /login</p> -<p>• Improved the error shown when an MCP server's sign-in expires mid-session to say how to re-authenticate (/mcp)</p> -<p>• Changed auto mode on Bedrock, Vertex and Foundry to use the local classifier by default for now; set CLAUDE_CODE_AUTO_MODE_SERVER=1 to use the platform's server-side classifier</p> -<p>• Changed OTEL_LOG_TOOL_DETAILS=1 to also include real agent, skill, plugin and MCP server names on cost and token metrics</p> -<p>• Changed sign-in with a Claude account to also request access to your claude.ai plugins</p> -<p>• Changed /bug and /feedback reports to include only model-behavior params (model, system prompt, tools) from the last API request, omitting request metadata and CLAUDE_CODE_EXTRA_BODY fields</p> -<p>• [VSCode] Fixed "Report a problem" still appearing, and /bug / /feedback opening a report form, for organizations that have product feedback disabled</p> -<p>• [VSCode] Fixed a red "Claude Code process exited with code 4294967295" banner appearing after completed turns on Windows</p> -<p>• Windows: Improved the network-path permission check for UNC paths when a mapped network drive was added with --add-dir</p> -<p>• [Claude Code on the web] Fixed routines losing access to an organization connector, and still calling the old one, after an admin removed and re-added that connector</p> -<p>• [Claude Code on the web] Fixed creating a self-hosted environment from organization settings occasionally failing with a server error and leaving a half-created environment behind</p> -<p>• [Claude Code on the web] Changed the admin "Share cloud sessions" setting to live under Data and privacy instead of the Claude Code page, where Data and privacy admins can also manage it</p> -<p>• [Claude Code on the web] Added a "Discard unsaved changes?" confirmation before the New routine page or the Edit routine dialog throws away a routine name, prompt or edit you typed</p> -<p>• [Claude Code on the web] Removed the full-page desktop-app download screen that new users without a cloud environment saw on Mac and Windows; they now go straight to setup</p> -<p>• [Claude Code on the web] Improved the routine detail page: menu and rename in the breadcrumb, the on/off switch and Run now at the top, and run history beside the routine's settings</p> -<p>• [Claude Tag] Fixed Claude going silent minutes after reinstalling the app when an Enterprise Grid was disconnected but one of its workspaces stayed connected</p> -<p>• [Claude Tag] Fixed scheduled tasks set up in an organization-shared private Slack channel silently never posting; they now keep running in the thread they were created in</p> -<p>• [Claude Tag] Fixed replying in an older Slack thread while Claude is mid-task sometimes restarting it from scratch and losing work it had not pushed yet</p> -<p>• [Claude Tag] Fixed Claude occasionally dropping a message with an incorrect "couldn't find a Claude Code environment" notice right after your account token refreshed</p> -<p>• [Claude Tag] Fixed AWS connections refusing region-less endpoints such as Budgets, Savings Plans, WAF Classic and Import/Export; Global Accelerator requests now sign correctly</p> -<p>• [Claude Tag] Improved AWS connection failures: when a request can't be signed, such as a hostname with no region, Claude is told why and how to fix it instead of a bare error</p> -<p>• [Claude Tag] Fixed OAuth client-credentials and JWT-bearer connections failing with providers that return a lowercase token type; requests now send the standard Bearer scheme</p> -<p>• [Claude Tag] Fixed adding a channel manager being refused on Enterprise Grid shared channels, on channels where Claude hasn't been used yet, and on legacy private channels</p> -<p>• [Claude Tag] Changed Claude to start watching related public channels on its own, such as an incident channel a conversation depends on, instead of only when asked</p> -<p>• [Claude Tag] Fixed the admin Memory page not listing Slack channels Claude set up on its own even when they had saved memory; admins can now open, edit and delete that memory</p> -<p>• [Code Review] Fixed merging the base branch into a PR whose earlier review listed "Additional findings" triggering a full re-review; these pushes now get the lighter follow-up review</p> -<p>• [Code Review] Fixed a whole REVIEW.md being ignored because of an @-mention, a code span wrapped across lines, or a backticked HTML tag; only lines linking to changed files are withheld</p> -<p>• [Code Review] Improved suggested fixes to say what the fix must keep working when other code depends on the behavior being changed</p> -<p>• [Code Review] Improved review comments that point to a second affected location to state that location's issue in a full sentence instead of a cut-off stub</p> -<p>• [Code Review] Fixed /ultrareview --post so a retry after a GitHub error posts the findings comment exactly once instead of never or twice; the comment now names the reviewed commit</p> -<p>• [Code Review] Fixed empty or content-identical pushes being re-reviewed on GitHub repositories whose owner or name contains a capital letter; these pushes are now skipped</p> - - - https://github.com/anthropics/claude-code/releases/tag/v2.1.272 - Claude Code v2.1.272 - - 2026-09-15T00:42:19Z - <p>• Bug fixes and reliability improvements</p> - - - https://github.com/anthropics/claude-code/releases/tag/v2.1.271 - Claude Code v2.1.271 - - 2026-09-14T22:12:48Z - <p>• Added fast mode in Claude Code Remote sessions (cloud and self-hosted runners): the host's fast-mode setting or /fast typed in the session applies where your organization allows it</p> -<p>• Added mouse support to the /config panel in fullscreen mode: the wheel scrolls the settings list, a click on a setting's value changes it, and the row under the pointer is highlighted</p> -<p>• Added claude self-hosted-runner --drain-marker-file &lt;path&gt;: when that file exists at a SIGTERM drain, the runner reports its exit to the server as a host drain (telemetry only)</p> -<p>• Added per-command allowed_domains to Bash, PowerShell and Monitor in auto mode with sandboxing: the hosts a command needs are reviewed with it and opened for it alone; other hosts are refused</p> -<p>• Added omitClaudeMd to agent frontmatter and --agents JSON, letting custom and plugin subagents run without user, project and local CLAUDE.md files; managed policy files still load</p> -<p>• Added --accept-command &lt;sha256&gt; to claude plugin install and claude plugin update to accept exactly the command a previous --json run displayed, instead of -y</p> -<p>• Added support for a multiplier above 1, up to 10, in the modelPricing managed setting and the Claude apps gateway pricing block, for marked-up internal chargeback rates</p> -<p>• Added a spinner tip pointing Bedrock, Vertex AI, Foundry and LLM gateway users to the Claude desktop app; the claude.ai desktop app tip now suggests /desktop, which offers to download the app</p> -<p>• Fixed a cached organization policy being reused after switching accounts, organizations, or API keys, and the policy not refreshing until the hourly check when the credential changes mid-session</p> -<p>• Fixed the tool and command lists not updating when the organization policy finishes loading after startup or changes mid-session</p> -<p>• Fixed an enterprise managed-mcp.json that can't be read or parsed being ignored: it now keeps exclusive MCP control (user, project and plugin servers don't load) and warns at startup</p> -<p>• Fixed org policy being fetched through, and rejected by, third-party local proxies set via ANTHROPIC_UNIX_SOCKET; they are again treated like other custom gateways, including for Remote Control</p> -<p>• Fixed cloud sessions rejecting every subagent tool call ("updatedInput … failed schema validation") when a workflow or agent approval was applied after the session's worker restarted</p> -<p>• Fixed /fast off answering "Fast mode unavailable" instead of turning fast mode off when the organization has fast mode disabled</p> -<p>• Fixed sessions started with CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK re-sending fast requests every turn after the API rejected fast mode; the rejection now stands and its reason is shown</p> -<p>• Fixed fast mode under CLAUDE_CODE_RETRY_WATCHDOG failing the turn on a usage-credits limit, or retrying an overload at fast speed, instead of falling back to standard speed</p> -<p>• Fixed Bash permission checks missing the file that fmt, column and similar commands read when it follows an option the checker doesn't recognize</p> -<p>• Fixed Bash permission checks skipping files a wildcard expands to when the wildcard sits in a command's pattern or option value (for example grep -v dir/* file)</p> -<p>• Fixed Bash permission checks so that shell variable declaration flags cannot misrepresent the command being run</p> -<p>• Fixed Bash commands with two directory changes, a subshell, or a cd+git chain skipping the prompt under permissions.blockReadsOutsideWorkingDirectories in bypass and auto mode</p> -<p>• Fixed a stale .git/config.lock breaking git checkout -b, git push -u and git config for the rest of a session after a sandboxed command failed to start (Linux)</p> -<p>• Fixed settings file changes made outside the session going unnoticed on macOS machines whose system file-event service is saturated; the watcher now falls back to polling</p> -<p>• Fixed resumed claude -p sessions whose tools all come from MCP servers failing with "At least one tool must have defer_loading=false"</p> -<p>• Fixed turns failing with "API returned an empty or malformed response" when an LLM gateway returns the non-streaming reply as text/plain</p> -<p>• Fixed sustained high CPU usage and repeated tool-list requests when an MCP server sends list_changed notifications in a tight loop</p> -<p>• Fixed MCP OAuth mishandling client registrations: denying consent forced a new one, one for another redirect URI was reused, and a concurrent write could delete a valid one or keep a mismatched one</p> -<p>• Fixed tool search returning no match when Claude selects an MCP tool by its bare name instead of its full mcp__server__tool name</p> -<p>• Fixed Ctrl+O cancelling pending MCP server reconnects, and /mcp sent from Remote Control failing while the transcript view is open</p> -<p>• Fixed the Claude in Chrome prompt telling the model to load tools through ToolSearch when ToolSearch is unavailable</p> -<p>• Fixed cross-session messages held by the receiving session's permission-mode policy leaving no trace: headless senders now get a delivery notice, and SendMessage results no longer imply it was read</p> -<p>• Fixed Claude starting a second copy of a background command (such as a watch task or dev server) that was still running after the conversation was compacted</p> -<p>• Fixed /model warning about losing the conversation cache when switching back to the model the conversation actually ran on</p> -<p>• Fixed /reload-skills reporting a skill count that disagreed with the slash menu after /cd</p> -<p>• Fixed /resume and /continue showing only 1-2 sessions in fullscreen mode on short terminals</p> -<p>• Fixed /resume and /teleport keeping the previous conversation's file-read tracking, so Claude could edit files the resumed conversation had never read</p> -<p>• Fixed --resume dropping the 1M context window ([1m]) when the resumed session's model family differs from the configured default model</p> -<p>• Fixed artifacts attached with /artifacts disappearing from the session after --resume</p> -<p>• Fixed background sessions (claude --bg, claude agents) not watching the artifacts they publish for republishes made elsewhere</p> -<p>• Fixed custom agents, slash commands and output styles beyond the first not loading from a virtual drive that reports inode 0, such as an encrypted vault mounted as a Windows drive</p> -<p>• Fixed self-hosted runner sessions silently losing all host config (settings, skills, plugins, MCP servers) when the host config directory exceeds 64 MiB; added --host-config-snapshot disk|memory</p> -<p>• Fixed skills synced from claude.ai staying on disk indefinitely after signing out; copies not refreshed within cleanupPeriodDays now move to the recoverable trash at the next launch</p> -<p>• Fixed spinner tips suggesting commands that aren't available for your account type or are disabled in your session</p> -<p>• Fixed the /add-dir path input: the left and right arrow keys now move the cursor, and Enter adds only the typed path instead of also adding the highlighted completion</p> -<p>• Fixed text fields outside the main prompt moving a leading ! to the end of what you typed (!foo came out as foo!)</p> -<p>• Fixed the interactive /hooks menu crashing when a hook matcher is named after an inherited object property such as __proto__ or constructor</p> -<p>• Fixed a fullscreen rendering glitch where text kept a stale background color after the box around it lost its background</p> -<p>• Fixed Delete in st and Alt+arrow keys in rxvt-unicode not working in attached background sessions</p> -<p>• Fixed the terminal's replies to capability queries (^[[?1;2c) appearing at the shell prompt or in an editor when Claude Code exits, is suspended, or opens an editor right after starting</p> -<p>• Improved terminal rendering performance: large diffs and long transcripts render faster, with fewer slow frames</p> -<p>• Improved startup time slightly by skipping a redundant validation of built-in model data on every launch</p> -<p>• Improved hook feedback: while a SessionStart, UserPromptSubmit, PreToolUse or SessionEnd hook runs, the spinner says so with elapsed time, and Esc cancels a prompt waiting on a SessionStart hook</p> -<p>• Improved the spinner status during long thinking: it now reads "deep in thought" after 45s, and shows "picking the thought back up" while recovering from the output-token limit</p> -<p>• Improved dynamic workflows to pause when you hit your usage limit and continue automatically when it resets, instead of dropping the affected agents</p> -<p>• Improved Remote Control to leave fewer empty sessions on claude.ai when setup fails on a flaky network</p> -<p>• Improved the Claude in Chrome message in cloud sessions when the browser can't be reached: it now says the computer may be asleep before it suggests an install</p> -<p>• Improved claude mcp serve: a running tool call now sends a progress update every 30 seconds, so clients show it is still running and idle timeouts don't abort a long command that prints nothing</p> -<p>• Improved Foundry and Claude Platform on AWS sessions: an alwaysLoad MCP server that finishes connecting mid-conversation is usable on the next turn without a tool-search round trip</p> -<p>• Improved Markdown files published as artifacts: they now render as styled document pages (title header, document typography, syntax-highlighted code)</p> -<p>• Improved Artifact tool publish errors: a publish with no file now says to write the page to a file first, and an unsupported file type is reported before a missing favicon</p> -<p>• Improved the Artifact tool's error when a page declares a capability its contract version lacks: it now lists every supported capability and notes when a newer contract version has it</p> -<p>• Improved artifact watching: a session can now watch up to 10 published artifacts at once for republishes made elsewhere, up from 5</p> -<p>• Improved PDF @-mentions to say "page count unknown" instead of a page count guessed from the file size when pdfinfo cannot count the pages</p> -<p>• Improved /mobile to show a single QR code for claude.ai/mobile, which opens the right app store for your phone</p> -<p>• Changed auto mode so that a skill's or slash command's inline ! shell commands follow default-mode permission rules instead of the classifier; a command no rule decides runs as a reviewed tool call</p> -<p>• Changed auto mode so a subagent reports back to its caller through a dedicated hand-back call that the safety classifier reviews, instead of its last message being reviewed after the fact</p> -<p>• Changed Monitor watches to always have a deadline (at most 30 minutes; 10 in single-prompt -p runs) and notify Claude to re-arm, replacing the no-timeout persistent option</p> -<p>• Changed the IDE selection indicator in the prompt to a [⧉ …] pill that wraps with the text instead of squeezing multi-line prompts; delete it with Backspace to leave the selection out</p> -<p>• Changed the default dynamic workflow size to small on Pro plans and lowered the medium size guideline from 15 to 10 agents</p> -<p>• Changed Claude apps gateway, Bedrock, Vertex AI, and Foundry sessions so that they no longer refresh a leftover claude.ai login that the session does not use</p> -<p>• Updated the bundled claude-api skill to enable eager_input_streaming on streaming custom tools, and to start deliverable-shaped Managed Agents work with user.define_outcome</p> -<p>• [VSCode] Added an Attach Open File setting that, when turned off, stops the open file from being added to messages; selected text is still attached</p> -<p>• [VSCode] Fixed the Hooks and Permission rules dialogs reporting a save that landed as failed, and the Hooks dialog going blank under a plugin-only policy lock or showing color codes in save errors</p> -<p>• [VSCode] Fixed Hooks dialog saves: no duplicate hook on replace, a header name retyped in other capitals keeps its secret, and settings.local.json is gitignored before the save returns</p> -<p>• [VSCode] Fixed session history showing only the current session when the workspace is on a Windows mapped network drive or SUBST drive</p> -<p>• [VSCode] Fixed the session list's Active filter hiding open idle sessions when Open is also checked in the filter menu</p> -<p>• [VSCode] Fixed a new chat switching back to the previous chat when the session list refreshed</p> -<p>• [VSCode] Fixed open tabs and the side bar keeping the old config folder until a window reload after CLAUDE_CONFIG_DIR changed in the environmentVariables setting</p> -<p>• [VSCode] Fixed console windows flashing on Windows when the extension runs background commands such as git, ripgrep, and the sign-in status check</p> -<p>• [VSCode] Fixed the prompt cache clock's hover text appearing only after a delay, and the auto-compact icon showing the browser's own tooltip beside its popup</p> -<p>• [VSCode] Improved the Hooks dialog: a save refused because of the settings file itself now opens a popup with an "Open settings file" button and the reason behind "Copy error"</p> -<p>• [VSCode] Changed the on state of toggle switches from Claude orange to the editor theme's button color</p> -<p>• [Claude Code on the web] Fixed a cloud session sometimes taking about ten minutes to respond after its process exited while the session still looked live; sending a message now restarts it right away</p> -<p>• [Claude Code on the web] Changed the Routines page on claude.ai/code to a new layout with Yours and Templates tabs and two-column routine cards that show run status, and removed its calendar view</p> -<p>• [Claude Code on the web] Added a Custom network access option to the Cloud environments editor in admin settings, with the same allowed-domains list the environment dialog on claude.ai/code offers</p> -<p>• [Claude Code on the web] Improved the Cloud environments admin page: it shows the default environment for Claude Tag and Claude Code, with a link to change it, and marks the recommended kind to create</p> -<p>• [Claude Tag] Fixed Claude in a channel where it stays active losing its working context about once an hour when the conversation is mostly in threads; thread activity now keeps it from being reset</p> -<p>• [Claude Tag] Fixed a thread that asked Claude to watch a pull request no longer hearing about CI failures, comments and reviews after Claude was restarted in that thread</p> -<p>• [Claude Tag] Fixed deleting the first message of a thread Claude had already replied in not ending Claude's work there; it now stops, as it did when a message with no replies was deleted</p> -<p>• [Claude Tag] Fixed Claude holding back a post because of an earlier instruction addressed to a different bot or assistant; only instructions addressed to Claude bind it, and it asks when unsure</p> -<p>• [Claude Tag] Fixed the reply-mode card Claude posts on joining a busy channel saying it "sees a lot of automated posts" when the channel is only chatty or large; the card now names the real reason</p> -<p>• [Claude Tag] Improved the Environment picker in Claude Tag admin settings: options are labeled Anthropic-hosted or self-hosted, with links to edit that environment or create one</p> -<p>• [Code Review] Fixed a pull request in a repository reviewed once per PR sometimes getting no review when a commit arrived while its review was waiting to start; it now reviews the requested commit</p> -<p>• [Code Review] Fixed Code Review occasionally posting the same findings two or three times when GitHub reported an error for a review it had in fact created</p> -<p>• [Code Review] Fixed follow-up reviews re-posting a security finding a person had already resolved when a later push moved the lines it was anchored to</p> -<p>• [Code Review] Fixed reopening a finished /ultrareview cloud session in the Claude app starting the whole review over again unprompted</p> -<p>• Windows: Fixed PowerShell commands failing with "Exit code 1" and no output when the session's temp output path reaches 260 characters</p> - diff --git a/mods/diff/hooks/limits/sizes/pane/index.ts b/mods/diff/hooks/limits/sizes/pane/index.ts index 204346044e..f1eba31c15 100644 --- a/mods/diff/hooks/limits/sizes/pane/index.ts +++ b/mods/diff/hooks/limits/sizes/pane/index.ts @@ -1,6 +1,5 @@ export * from './gutter-chrome.js' export * from './max-summary-rows.js' -export * from './pane-top-pad-rows.js' export * from './pre-session-body-cap.js' export * from './scroll-margin-rows.js' export * from './wheel-rows.js' diff --git a/mods/diff/hooks/limits/sizes/pane/pane-top-pad-rows.ts b/mods/diff/hooks/limits/sizes/pane/pane-top-pad-rows.ts deleted file mode 100644 index e487c31804..0000000000 --- a/mods/diff/hooks/limits/sizes/pane/pane-top-pad-rows.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * The blank row the docked pane keeps above its header, as the built-in - * sidebar's header does (its `paddingY`). - */ -export const PANE_TOP_PAD_ROWS = 1 diff --git a/mods/diff/hooks/views/body/plan/body-layout-of.ts b/mods/diff/hooks/views/body/plan/body-layout-of.ts index 3c3ae6cbbb..48ffb50e65 100644 --- a/mods/diff/hooks/views/body/plan/body-layout-of.ts +++ b/mods/diff/hooks/views/body/plan/body-layout-of.ts @@ -1,4 +1,3 @@ -import Limits from '../../../limits' import type PaneState from '../../../pane-state' import type { BodyLayout, DockPlan } from '../types' import Segments from './segments' @@ -39,10 +38,7 @@ export function bodyLayoutOf( const tops = new Map() - const visibleRows = Math.max( - 0, - model.place.rows - Limits.PANE_TOP_PAD_ROWS - headRows - listRows, - ) + const visibleRows = Math.max(0, model.place.rows - headRows - listRows) let extent = 0 @@ -54,7 +50,7 @@ export function bodyLayoutOf( extent += Segments.segmentRowsOf(segment) } - const listTop = Limits.PANE_TOP_PAD_ROWS + headRows + 1 + const listTop = headRows + 1 return { segments, diff --git a/mods/diff/hooks/views/inset-of/inset-of.ts b/mods/diff/hooks/views/inset-of/inset-of.ts index 0e349553a6..b58cb9edee 100644 --- a/mods/diff/hooks/views/inset-of/inset-of.ts +++ b/mods/diff/hooks/views/inset-of/inset-of.ts @@ -3,7 +3,10 @@ import type { Kit } from '../kit' /** * A drawing's kit inside the docked pane's padding: the built-in's blank - * last column and its blank row above the header taken off. + * last column taken off. + * + * No row comes off: the blank row above the header is the engine's own, + * the one it keeps over a docked pane's body for its close mark. * * @param kit the drawing's kit at the pane's full size * @returns the kit its body draws with @@ -11,5 +14,4 @@ import type { Kit } from '../kit' export const insetOf = (kit: Kit): Kit => ({ ...kit, columns: Math.max(1, kit.columns - Limits.PANE_RIGHT_PAD_COLUMNS), - rows: Math.max(0, kit.rows - Limits.PANE_TOP_PAD_ROWS), }) diff --git a/mods/diff/hooks/views/pane-view.tsx b/mods/diff/hooks/views/pane-view.tsx index 96cac2536f..96d530ab49 100644 --- a/mods/diff/hooks/views/pane-view.tsx +++ b/mods/diff/hooks/views/pane-view.tsx @@ -40,11 +40,7 @@ export function paneView( seat.terminalColumns < Limits.OPEN_MIN_COLUMNS return isDocked ? ( - + {sidebarPane(insetOf(kit), model)} ) : isNarrow ? ( diff --git a/mods/diff/tests/fixtures/index.ts b/mods/diff/tests/fixtures/index.ts index 55efa567dc..c4d420a578 100644 --- a/mods/diff/tests/fixtures/index.ts +++ b/mods/diff/tests/fixtures/index.ts @@ -60,6 +60,8 @@ export * from './unsaid-hint.js' export * from './usage-at.js' export * from './vs-main.js' export * from './wheel-over-list.js' +export * from './wheel-over-list-margin.js' +export * from './wheel-over-list-top.js' export * from './wheel-tick.js' export * from './with-lockfile.js' export * from './worktree' diff --git a/mods/diff/tests/fixtures/pane-view/body-rows.ts b/mods/diff/tests/fixtures/pane-view/body-rows.ts index 5a2aa9dc80..adeafe0248 100644 --- a/mods/diff/tests/fixtures/pane-view/body-rows.ts +++ b/mods/diff/tests/fixtures/pane-view/body-rows.ts @@ -1,4 +1,5 @@ /** - * The pane's body rows in the ordinary cases: docked in a 40-row terminal. + * The pane's body rows in the ordinary cases: docked in a 40-row terminal, + * under the row the engine keeps for its close mark. */ -export const BODY_ROWS = 35 +export const BODY_ROWS = 34 diff --git a/mods/diff/tests/fixtures/pane-view/engine-head-rows.ts b/mods/diff/tests/fixtures/pane-view/engine-head-rows.ts new file mode 100644 index 0000000000..a6e263e241 --- /dev/null +++ b/mods/diff/tests/fixtures/pane-view/engine-head-rows.ts @@ -0,0 +1,5 @@ +/** + * The rows the engine keeps over a docked pane's body: one, blank but for + * its close mark. + */ +export const ENGINE_HEAD_ROWS = 1 diff --git a/mods/diff/tests/fixtures/pane-view/index.ts b/mods/diff/tests/fixtures/pane-view/index.ts index 3ae59badc2..907874bfae 100644 --- a/mods/diff/tests/fixtures/pane-view/index.ts +++ b/mods/diff/tests/fixtures/pane-view/index.ts @@ -9,6 +9,7 @@ export * from './dock-seat.js' export * from './docked-pane.js' export * from './docks-pane.js' export * from './draws-pane.js' +export * from './engine-head-rows.js' export * from './long-line-chars.js' export * from './long-path-segments.js' export * from './narrow-seat.js' diff --git a/mods/diff/tests/fixtures/wheel-over-list-margin.ts b/mods/diff/tests/fixtures/wheel-over-list-margin.ts new file mode 100644 index 0000000000..a26ce25f71 --- /dev/null +++ b/mods/diff/tests/fixtures/wheel-over-list-margin.ts @@ -0,0 +1,12 @@ +import type { UiScrollInput } from 'claude-code' + +import { WHEEL_TICK } from './wheel-tick.js' + +/** + * The same wheel tick with the pointer over the blank row between the + * docked header and its list. + */ +export const WHEEL_OVER_LIST_MARGIN: UiScrollInput = { + ...WHEEL_TICK, + pointer: { column: 10, row: 1 }, +} diff --git a/mods/diff/tests/fixtures/wheel-over-list-top.ts b/mods/diff/tests/fixtures/wheel-over-list-top.ts new file mode 100644 index 0000000000..b422d79869 --- /dev/null +++ b/mods/diff/tests/fixtures/wheel-over-list-top.ts @@ -0,0 +1,12 @@ +import type { UiScrollInput } from 'claude-code' + +import { WHEEL_TICK } from './wheel-tick.js' + +/** + * The same wheel tick with the pointer over the docked list's first row + * (header, the list's margin, then the rows). + */ +export const WHEEL_OVER_LIST_TOP: UiScrollInput = { + ...WHEEL_TICK, + pointer: { column: 10, row: 2 }, +} diff --git a/mods/diff/tests/fixtures/wheel-over-list.ts b/mods/diff/tests/fixtures/wheel-over-list.ts index 80ab7b58e6..a4e537236b 100644 --- a/mods/diff/tests/fixtures/wheel-over-list.ts +++ b/mods/diff/tests/fixtures/wheel-over-list.ts @@ -4,9 +4,9 @@ import { WHEEL_TICK } from './wheel-tick.js' /** * The same wheel tick with the pointer over the docked list's third row - * (top pad, header, the list's margin, then the rows). + * (header, the list's margin, then the rows). */ export const WHEEL_OVER_LIST: UiScrollInput = { ...WHEEL_TICK, - pointer: { column: 10, row: 5 }, + pointer: { column: 10, row: 4 }, } diff --git a/mods/diff/tests/views/pane-view.test.ts b/mods/diff/tests/views/pane-view.test.ts index 3a1b82bb04..45df89130f 100644 --- a/mods/diff/tests/views/pane-view.test.ts +++ b/mods/diff/tests/views/pane-view.test.ts @@ -365,7 +365,7 @@ describe('pane-view', () => { expect(Fixtures.jsonOf(reversed)).not.toContain('‮') }) - test("docked: the built-in's blank top row, last column", async ($, on) => { + test("docked: no top pad, the built-in's last column", async ($, on) => { const tree = await Fixtures.dockedPane( $, on, @@ -381,16 +381,55 @@ describe('pane-view', () => { expect(tree).toMatchObject({ type: 'Box', - props: { - paddingTop: Limits.PANE_TOP_PAD_ROWS, - paddingRight: Limits.PANE_RIGHT_PAD_COLUMNS, - }, + props: { paddingRight: Limits.PANE_RIGHT_PAD_COLUMNS }, }) + expect(Fixtures.jsonOf(tree)).not.toContain('"paddingTop"') expect(Fixtures.stringsOf(tree)).toContain(rule) expect(Fixtures.stringsOf(tree)).not.toContain(`${rule}─`) }) + test('docked: the window takes every row under the list', () => { + const files = [Fixtures.rowOf('src/a.ts'), Fixtures.rowOf('b.ts')] + const headerRows = 1 + const listMarginRows = 1 + + const model = modelOf({ + data: dataOf(files), + place: { ...Fixtures.WHOLE_PLACE, rows: Fixtures.BODY_ROWS }, + }) + + const listTop = headerRows + listMarginRows + const listEnd = listTop + files.length + + expect(Views.bodyLayoutOf(model, Views.dockPlanOf(model))).toMatchObject({ + listTop, + listEnd, + visibleRows: Fixtures.BODY_ROWS - listEnd - listMarginRows, + }) + }) + + test('docked: the list takes the wheel from its first row', () => { + const model = modelOf({ + data: dataOf( + Array.from({ length: Limits.MAX_SUMMARY_ROWS + 1 }, (_, index) => + Fixtures.rowOf(`file${index}.ts`), + ), + ), + place: { ...Fixtures.WHOLE_PLACE, rows: Fixtures.BODY_ROWS }, + }) + + expect( + Views.isWheelOverList(model, Fixtures.WHEEL_OVER_LIST_MARGIN), + 'the blank row under the header', + ).toBe(false) + + expect( + Views.isWheelOverList(model, Fixtures.WHEEL_OVER_LIST_TOP), + "the list's first row", + ).toBe(true) + }) + test("docked rows follow the built-in's, its hunks after", async ($, on) => { expect( Fixtures.rowShapesOf( @@ -428,11 +467,9 @@ describe('pane-view', () => { const [header, pad, middle, foot, ...more] = Fixtures.childrenOf(body) const [spacer, headline, ...under] = Fixtures.childrenOf(middle) - const aboveMiddle = Limits.PANE_TOP_PAD_ROWS + 2 + const aboveMiddle = Fixtures.ENGINE_HEAD_ROWS + 2 - expect(body).toMatchObject({ - props: { height: Fixtures.BODY_ROWS - Limits.PANE_TOP_PAD_ROWS }, - }) + expect(body).toMatchObject({ props: { height: Fixtures.BODY_ROWS } }) expect(Fixtures.stringsOf(header)).toEqual([]) expect(Fixtures.jsonOf(header)).not.toContain('✕')