{"version":"2.1.289","summary":"You can now let plugins read the text you have selected in a connected app, in sessions without a terminal. The first non-empty answer that arrives within 5 seconds is used. Plugin agent-launch hooks now also apply when you start a named teammate. Such a hook can block, rewrite or retype the teammate. Running claude plugin eval on a plugin from a folder marketplace now runs it from that folder. When a plugin's view drawn by the desktop app fails, the plugin is told and can draw another view.\n\nA plugin interface that crashes no longer breaks the screen. Claude Code shows its own interface instead and keeps your session running. Plugins now get a teammate's real id and model when they launch agents. The claude auth status command now exits right away with code 0 or 1 after printing your login status. Stale or overdrawn content in scrolled boxes is fixed. A plugin view that crashed while drawing is no longer applied again.","filter":{"section":null,"tier":null,"area":null},"offset":0,"limit":50,"count":50,"total":52,"next_offset":50,"next_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/entries.json?offset=50","entries":[{"anchor":"plugin-folder-re-read-detection-added-run","heading":"Claude Code can notice when a plugin&#039;s folder has been edited","glance":"Claude Code can detect plugin folders changed since they were last read and show a notice that the plugin was re-read from its folder","teaser":null,"tier":"notice","area":"Plugins","section":"What probably matters to you","position":0,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-folder-re-read-detection-added-run","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-folder-re-read-detection-added-run.json"},{"anchor":"new-plugin-function-hooks-feature-slot-plugin-function-hook","heading":"A new drawing slot for plugin function hooks, plus an interface fault event","glance":"Claude Code lists a new drawing slot for plugin function hooks and a new interface event for reporting faults","teaser":null,"tier":"internal","area":"Plugin Hooks","section":"What probably matters to you","position":1,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/new-plugin-function-hooks-feature-slot-plugin-function-hook","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/new-plugin-function-hooks-feature-slot-plugin-function-hook.json"},{"anchor":"new-ui-read-selection-client-capability-for-plugin-uisele","heading":"Plugins can read the user&#039;s selected text through ui_read_selection","glance":"A new `ui_read_selection` request lets a plugin's `$.ui.selection` read text the user has selected in an attached client","teaser":null,"tier":"internal","area":"Plugin UI","section":"What probably matters to you","position":2,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/new-ui-read-selection-client-capability-for-plugin-uisele","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/new-ui-read-selection-client-capability-for-plugin-uisele.json"},{"anchor":"new-function-hooks-capability-plugin-function-hooks-selecti","heading":"Plugin function hooks get a capability named for reading the selection","glance":"A plugin function-hook capability called `plugin_function_hooks_selection_read` now exists, along with a new internal control message","teaser":null,"tier":"internal","area":"Plugin Hooks","section":"What probably matters to you","position":3,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/new-function-hooks-capability-plugin-function-hooks-selecti","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/new-function-hooks-capability-plugin-function-hooks-selecti.json"},{"anchor":"new-ui-client-fault-control-request-lets-the-desktop-report","heading":"Plugin UI failures are now caught, reported and recoverable","glance":"When a plugin's on-screen UI throws an error, Claude Code now catches it, draws its own UI instead and lets the plugin recover","teaser":null,"tier":"notice","area":"Plugin UI","section":"What probably matters to you","position":5,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/new-ui-client-fault-control-request-lets-the-desktop-report","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/new-ui-client-fault-control-request-lets-the-desktop-report.json"},{"anchor":"claude-plugin-eval-resolves-installed-plugins-from-marketpla","heading":"<code>claude plugin eval<\/code> tests folder marketplace plugins from where sessions load them","glance":"Evaluating an installed plugin from a folder marketplace now runs it from that folder, or stops with an error if the folder no longer lists it","teaser":null,"tier":"use","area":"Plugins","section":"What probably matters to you","position":6,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/claude-plugin-eval-resolves-installed-plugins-from-marketpla","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/claude-plugin-eval-resolves-installed-plugins-from-marketpla.json"},{"anchor":"toolcheck-hook-decision-accepts-an-optional-hook-string","heading":"Permission decisions can now name the hook that made them","glance":"Permission decisions gain an optional `hook` field, which plugin `tool.check` hooks can set, and rules inside nested commands are now found","teaser":null,"tier":"use","area":"Plugin Hooks","section":"What probably matters to you","position":7,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/toolcheck-hook-decision-accepts-an-optional-hook-string","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/toolcheck-hook-decision-accepts-an-optional-hook-string.json"},{"anchor":"pinned-plugin-line-limit-changed-from-4096-to-10000-characte","heading":"Plugin text lines described as up to 10000 characters instead of 4096","glance":"Plugin-supplied text lines such as the pinned line are now described as up to 10000 characters followed by an ellipsis, not at most 4096","teaser":null,"tier":"internal","area":"Plugin UI","section":"What probably matters to you","position":8,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/pinned-plugin-line-limit-changed-from-4096-to-10000-characte","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/pinned-plugin-line-limit-changed-from-4096-to-10000-characte.json"},{"anchor":"idefile-reference-rows-show-not-read-could-not-be-examine","heading":"Unread file references can now say the file could not be examined","glance":"A referenced file that was not read now shows \"not read: could not be examined\" when it could not be examined, and \"not read\" otherwise","teaser":null,"tier":"notice","area":"Elsewhere","section":"Improvements","position":0,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/idefile-reference-rows-show-not-read-could-not-be-examine","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/idefile-reference-rows-show-not-read-could-not-be-examine.json"},{"anchor":"find-rm-no-longer-auto-allowed-in-the-read-only-find-patter","heading":"find -rm is no longer auto-approved as a read-only command","glance":"Claude Code now treats `find ... -rm` like `find ... -delete`: it is not auto-allowed as read-only and is flagged as destructive","teaser":null,"tier":"notice","area":"Permissions","section":"Improvements","position":1,"scope":"individual","heads_up":true,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/find-rm-no-longer-auto-allowed-in-the-read-only-find-patter","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/find-rm-no-longer-auto-allowed-in-the-read-only-find-patter.json"},{"anchor":"compound-bash-permission-check-also-fires-when-a-single-pars","heading":"More shell commands get checked part by part against your permission rules","glance":"Claude Code now checks a shell command part by part when it splits into several commands, or when its one parsed command differs from what was written","teaser":null,"tier":"notice","area":"Permissions","section":"Improvements","position":2,"scope":"individual","heads_up":true,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/compound-bash-permission-check-also-fires-when-a-single-pars","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/compound-bash-permission-check-also-fires-when-a-single-pars.json"},{"anchor":"plugin-update-message-for-folder-sourced-plugins","heading":"Clearer handling of plugins loaded from a local folder","glance":"Folder-based plugins now get a note on update, extra lines in `\/reload-plugins` output, and file watching that follows the real path","teaser":null,"tier":"notice","area":"Plugins","section":"Improvements","position":3,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-update-message-for-folder-sourced-plugins","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-update-message-for-folder-sourced-plugins.json"},{"anchor":"plugin-list-shows-where-each-plugin-was-read-from-and-its-fo","heading":"<code>claude plugin list<\/code> shows which folder a plugin was read from","glance":"`claude plugin list` now shows a \"Read from:\" line and folder version for plugins loaded from a folder, with matching fields in JSON output","teaser":null,"tier":"notice","area":"Plugins","section":"Improvements","position":4,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-list-shows-where-each-plugin-was-read-from-and-its-fo","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-list-shows-where-each-plugin-was-read-from-and-its-fo.json"},{"anchor":"dismissed-state-option-list-now-always-includes-a-0-dismiss","heading":"Dismissed prompts now always offer a Dismiss option on key 0","glance":"The list of choices shown after \"Dismissed.\" now always ends with a \"Dismiss\" option bound to key 0","teaser":null,"tier":"notice","area":"Terminal UI","section":"Improvements","position":5,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/dismissed-state-option-list-now-always-includes-a-0-dismiss","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/dismissed-state-option-list-now-always-includes-a-0-dismiss.json"},{"anchor":"at-mention-reminder-distinguishes-mentions-that-could-not-be","heading":"@-mentioned files are re-checked before reading and may be left unexamined","glance":"@-mentioned files are now re-checked before being read; ones that can't be safely opened are passed as references and the model is told why","teaser":null,"tier":"notice","area":"Elsewhere","section":"Improvements","position":6,"scope":"individual","heads_up":true,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/at-mention-reminder-distinguishes-mentions-that-could-not-be","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/at-mention-reminder-distinguishes-mentions-that-could-not-be.json"},{"anchor":"teammates-ignore-background-and-cwd-overrides-and-say-so","heading":"Teammates now keep their spawn details and ignore background and cwd overrides","glance":"Spawned teammates record how they were started, carry a `teammateId`, and keep their original `background` and `cwd` even when a tool call asks otherwise","teaser":null,"tier":"notice","area":"Teammates","section":"Improvements","position":7,"scope":"individual","heads_up":true,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/teammates-ignore-background-and-cwd-overrides-and-say-so","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/teammates-ignore-background-and-cwd-overrides-and-say-so.json"},{"anchor":"plugin-hooks-modules-rollout-flag-late-load-handling-and-a","heading":"Startup wait for plugin hook modules reworked, including late rollout answers","glance":"How long startup waits for plugin hook modules now depends on an extra check, and a rollout answer that arrives late is logged and handled","teaser":null,"tier":"internal","area":"Plugin Hooks","section":"Improvements","position":8,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-hooks-modules-rollout-flag-late-load-handling-and-a","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-hooks-modules-rollout-flag-late-load-handling-and-a.json"},{"anchor":"client-error-text-is-stripped-of-prefixes-and-falls-back-whe","heading":"Plugin client error messages drop repeated prefixes and fall back when empty","glance":"Error text from a plugin client now has its leading labels removed, and a standard message is shown when nothing is left","teaser":null,"tier":"notice","area":"Plugin UI","section":"Improvements","position":9,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/client-error-text-is-stripped-of-prefixes-and-falls-back-whe","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/client-error-text-is-stripped-of-prefixes-and-falls-back-whe.json"},{"anchor":"pane-layout-restructured-tab-strip-and-body-get-separate-bo","heading":"Plugin pane layout rearranged around its tabs, content and close button","glance":"A pane's tab strip, body and close button are now laid out in separate boxes, with scrolling handled differently and a spacer row in some cases","teaser":null,"tier":"notice","area":"Plugin UI","section":"Improvements","position":11,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/pane-layout-restructured-tab-strip-and-body-get-separate-bo","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/pane-layout-restructured-tab-strip-and-body-get-separate-bo.json"},{"anchor":"border-style-validation-and-syntax-highlight-fallback","heading":"Invalid Box borderStyle values are now checked and drawn with no border","glance":"Plugin UI boxes with an unknown `borderStyle` now get a diagnostic and no border, and diff highlighting stops retrying after an error","teaser":null,"tier":"notice","area":"Terminal UI","section":"Improvements","position":13,"scope":"individual","heads_up":true,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/border-style-validation-and-syntax-highlight-fallback","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/border-style-validation-and-syntax-highlight-fallback.json"},{"anchor":"plugin-link-validation-href-length-and-surface-support","heading":"Plugin links that cannot be shown now appear as plain text","glance":"A link in a plugin's UI with a bad address, or on a screen that does not support links, is drawn as plain text with a diagnostic","teaser":null,"tier":"notice","area":"Plugin UI","section":"Improvements","position":16,"scope":"individual","heads_up":true,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-link-validation-href-length-and-surface-support","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-link-validation-href-length-and-surface-support.json"},{"anchor":"plugin-agentspawn-hook-gets-mcp-requirement-and-unknown-sub","heading":"Clearer errors when a plugin launches an agent that cannot start","glance":"Plugin agent launches now say when required MCP servers have no tools yet, and list the available agents when the named one does not exist","teaser":null,"tier":"notice","area":"Plugin Hooks","section":"Improvements","position":18,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-agentspawn-hook-gets-mcp-requirement-and-unknown-sub","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-agentspawn-hook-gets-mcp-requirement-and-unknown-sub.json"},{"anchor":"plugin-update-cli-prints-an-optional-foldernote","heading":"Plugin updates can print a note about the plugin&#039;s folder","glance":"Updating a plugin from the command line can now print an extra note about its folder before the result","teaser":null,"tier":"notice","area":"Plugins","section":"Improvements","position":19,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-update-cli-prints-an-optional-foldernote","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-update-cli-prints-an-optional-foldernote.json"},{"anchor":"pane-grip-split-into-two-segments","heading":"Pane headers now have two drag areas instead of one","glance":"In the terminal interface, a pane's header now has two separately sized mouse grab areas, one at the left edge and one just past the close mark","teaser":null,"tier":"notice","area":"Terminal UI","section":"Improvements","position":20,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/pane-grip-split-into-two-segments","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/pane-grip-split-into-two-segments.json"},{"anchor":"find-command-safety-check-tightened-for-bash-permission-auto","heading":"Fewer <code>find<\/code> commands are allowed without asking","glance":"Claude Code now asks before running some `find`, `test`, `jobs` and `set` commands that it used to treat as safe to run automatically","teaser":null,"tier":"notice","area":"Permissions","section":"Improvements","position":21,"scope":"individual","heads_up":true,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/find-command-safety-check-tightened-for-bash-permission-auto","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/find-command-safety-check-tightened-for-bash-permission-auto.json"},{"anchor":"agent-teammate-spawn-now-runs-through-the-agentspawn-plugin","heading":"Plugin agent-launch hooks now also apply to teammates","glance":"Starting a named teammate now goes through a plugin's agent-launch hook, which can block, rewrite or retype it","teaser":null,"tier":"notice","area":"Plugin Hooks","section":"Improvements","position":22,"scope":"individual","heads_up":true,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/agent-teammate-spawn-now-runs-through-the-agentspawn-plugin","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/agent-teammate-spawn-now-runs-through-the-agentspawn-plugin.json"},{"anchor":"toolcheck-plugin-hook-can-be-floored-for-pretooluse-asks","heading":"Plugin <code>tool.check<\/code> hooks get an extra input when a PreToolUse hook asks for permission","glance":"When a PreToolUse hook has asked for permission, plugin tool checks are now built with that hook's ask passed in as an extra input","teaser":null,"tier":"internal","area":"Plugin Hooks","section":"Improvements","position":23,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/toolcheck-plugin-hook-can-be-floored-for-pretooluse-asks","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/toolcheck-plugin-hook-can-be-floored-for-pretooluse-asks.json"},{"anchor":"syntax-highlighting-gets-a-work-bound","heading":"Syntax highlighting gives up on code blocks that take too much work","glance":"Code highlighting now has a work limit based on text length, nesting and embedded languages, and stops highlighting a block that goes over it","teaser":null,"tier":"notice","area":"Terminal UI","section":"Improvements","position":24,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/syntax-highlighting-gets-a-work-bound","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/syntax-highlighting-gets-a-work-bound.json"},{"anchor":"ide-selection-hidden-when-file-is-outside-allowed-paths","heading":"Editor selections from outside allowed folders are no longer attached","glance":"Lines selected in your editor are no longer sent to Claude when the file fails an added real-path permission check","teaser":null,"tier":"notice","area":"Elsewhere","section":"Improvements","position":26,"scope":"individual","heads_up":true,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/ide-selection-hidden-when-file-is-outside-allowed-paths","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/ide-selection-hidden-when-file-is-outside-allowed-paths.json"},{"anchor":"url-validation-error-messages-reworded-and-length-limit-remo","heading":"A URL check no longer limits length and gives shorter error messages","glance":"One of Claude Code's URL checks dropped its length limit and empty-text check and now uses shorter error messages","teaser":null,"tier":"internal","area":"Elsewhere","section":"Improvements","position":27,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/url-validation-error-messages-reworded-and-length-limit-remo","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/url-validation-error-messages-reworded-and-length-limit-remo.json"},{"anchor":"plugin-hook-warning-text-changes-for-unapplied-hooks","heading":"Warnings for plugin hooks that were not applied no longer say &quot;skipped&quot;","glance":"A plugin hook that was not applied now gets a warning reading \"<event> hook: <reason>\" instead of \"<event> hook skipped: <reason>\"","teaser":null,"tier":"notice","area":"Plugin Hooks","section":"Improvements","position":29,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-hook-warning-text-changes-for-unapplied-hooks","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-hook-warning-text-changes-for-unapplied-hooks.json"},{"anchor":"feedback-survey-now-receives-a-dismiss-handler","heading":"The &quot;That was helpful&quot; feedback prompt now gets a way to be dismissed","glance":"The two-choice feedback prompt (\"That was helpful\" \/ \"Didn\u2019t understand\") is now given a dismiss action, so it can be closed without answering","teaser":null,"tier":"notice","area":"Terminal UI","section":"Improvements","position":30,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/feedback-survey-now-receives-a-dismiss-handler","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/feedback-survey-now-receives-a-dismiss-handler.json"},{"anchor":"permission-rule-suggestions-now-also-apply-to-commands-with","heading":"Permission suggestions now cover commands that start with environment variables","glance":"Commands like `FOO=1 cmd` now get a suggested permission rule even when the command itself matches the original","teaser":null,"tier":"notice","area":"Permissions","section":"Improvements","position":31,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/permission-rule-suggestions-now-also-apply-to-commands-with","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/permission-rule-suggestions-now-also-apply-to-commands-with.json"},{"anchor":"renderer-clips-tracked-through-scroll-blits","heading":"Fix for stale or overdrawn content in scrolled boxes","glance":"Claude Code's terminal display now tracks clipped areas while scrolling, fixing stale or overdrawn content in scrolled boxes","teaser":null,"tier":"notice","area":"Terminal UI","section":"Bug Fixes","position":0,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/renderer-clips-tracked-through-scroll-blits","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/renderer-clips-tracked-through-scroll-blits.json"},{"anchor":"pane-and-tail-hint-rendering-fixes-for-plugin-clients","heading":"A plugin view that crashed while drawing is no longer applied again","glance":"Claude Code now skips applying a plugin view whose drawing failed, and fits pane contents to the space left by the pane frame","teaser":null,"tier":"notice","area":"Plugin UI","section":"Bug Fixes","position":1,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/pane-and-tail-hint-rendering-fixes-for-plugin-clients","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/pane-and-tail-hint-rendering-fixes-for-plugin-clients.json"},{"anchor":"spawn-provenance-cleared-when-hookcaller-is-absent","heading":"Stale hook attribution is cleared when an agent was not started by a hook","glance":"When an agent was not started by a hook, Claude Code now deletes any old record saying it was, so a reused id is not misattributed","teaser":null,"tier":"internal","area":"Plugin Hooks","section":"Bug Fixes","position":2,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/spawn-provenance-cleared-when-hookcaller-is-absent","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/spawn-provenance-cleared-when-hookcaller-is-absent.json"},{"anchor":"smaller-changes-new-clientfault-pass-through-teammate-fiel","heading":"Small fixes: teammate details in the task list, a dismiss action and a newline check","glance":"Several small internal changes: teammate fields in the task list, a dismiss handler, a client fault pass-through and a corrected newline check","teaser":null,"tier":"notice","area":"Teammates","section":"Bug Fixes","position":3,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/smaller-changes-new-clientfault-pass-through-teammate-fiel","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/smaller-changes-new-clientfault-pass-through-teammate-fiel.json"},{"anchor":"hook-skipped-message-wording-differs-for-unapplied-hooks","heading":"Plugin hook skip notices worded differently when a hook was not applied","glance":"When a plugin hook was not applied, the notice now gives the reason directly instead of saying the hook was skipped","teaser":null,"tier":"notice","area":"Plugin Hooks","section":"Bug Fixes","position":4,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/hook-skipped-message-wording-differs-for-unapplied-hooks","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/hook-skipped-message-wording-differs-for-unapplied-hooks.json"},{"anchor":"text-measurement-handles-tabs-and-per-segment-text","heading":"Text containing tabs is measured the same way it is drawn","glance":"Claude Code now expands tabs and respects the wrapping mode when measuring text width, so layout matches what appears on screen","teaser":null,"tier":"notice","area":"Terminal UI","section":"Bug Fixes","position":6,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/text-measurement-handles-tabs-and-per-segment-text","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/text-measurement-handles-tabs-and-per-segment-text.json"},{"anchor":"auth-status-cli-exits-directly","heading":"<code>claude auth status<\/code> now exits straight away after printing its result","glance":"After showing your login status, `claude auth status` now ends at once with exit code 0 or 1 instead of first waiting on an internal step","teaser":null,"tier":"notice","area":"Elsewhere","section":"Bug Fixes","position":7,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/auth-status-cli-exits-directly","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/auth-status-cli-exits-directly.json"},{"anchor":"agentspawn-result-and-sessionsend-resolve-teammates-th","heading":"Plugins see accurate ids and states for teammates","glance":"Plugin agent launches now return a teammate's real id and model, and plugin messaging and task lists find teammates more reliably","teaser":null,"tier":"notice","area":"Teammates","section":"Bug Fixes","position":8,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/agentspawn-result-and-sessionsend-resolve-teammates-th","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/agentspawn-result-and-sessionsend-resolve-teammates-th.json"},{"anchor":"tab-expansion-in-terminal-output-rewritten-per-line","heading":"Tabs in terminal output are expanded line by line, keeping colour codes intact","glance":"Tab characters in output are now expanded one line at a time without breaking terminal escape codes, with the column count carried between lines","teaser":null,"tier":"notice","area":"Terminal UI","section":"Bug Fixes","position":9,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/tab-expansion-in-terminal-output-rewritten-per-line","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/tab-expansion-in-terminal-output-rewritten-per-line.json"},{"anchor":"hooks-worker-hook-failed-handling-refactored","heading":"Handling of failed plugin hooks reorganised","glance":"The code that marks in-progress work as failed when a plugin hook fails was moved into a shared helper; runaway-plugin shutdown is unchanged","teaser":null,"tier":"internal","area":"Plugin Hooks","section":"Internal Changes","position":0,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/hooks-worker-hook-failed-handling-refactored","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/hooks-worker-hook-failed-handling-refactored.json"},{"anchor":"teammate-spawn-records-spawnedwith-agentspawn-hook-gains","heading":"Teammate spawning keeps more detail about how each teammate was started","glance":"Teammate records gain a field for how they were spawned, and the agent.spawn hook gains an entry for an argument that was not applied","teaser":null,"tier":"internal","area":"Teammates","section":"Internal Changes","position":1,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/teammate-spawn-records-spawnedwith-agentspawn-hook-gains","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/teammate-spawn-records-spawnedwith-agentspawn-hook-gains.json"},{"anchor":"teammate-record-stores-spawnedwith","heading":"Teammate records now store how the teammate was spawned","glance":"Teammates running inside Claude Code now carry a `spawnedWith` record of how they were started","teaser":null,"tier":"internal","area":"Teammates","section":"Internal Changes","position":2,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/teammate-record-stores-spawnedwith","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/teammate-record-stores-spawnedwith.json"},{"anchor":"plugin-hook-sandbox-now-copies-values-leaving-the-sandbox","heading":"Values leaving the plugin hook sandbox are now copied and checked","glance":"Plugin hook values leaving the plugin's sandbox are now copied, frozen and checked as plain data, unless `isLeavingUncopied` is set","teaser":null,"tier":"internal","area":"Plugin Hooks","section":"Internal Changes","position":5,"scope":"individual","heads_up":true,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-hook-sandbox-now-copies-values-leaving-the-sandbox","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-hook-sandbox-now-copies-values-leaving-the-sandbox.json"},{"anchor":"plugin-toast-docs-2-s-spacing-removed-from-the-schema-descr","heading":"Plugin notification description no longer promises 2 second spacing","glance":"The description of plugin pop-up notifications now tells apps to expect them at no fixed rate, instead of 2 seconds apart","teaser":null,"tier":"internal","area":"Plugin UI","section":"Internal Changes","position":6,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-toast-docs-2-s-spacing-removed-from-the-schema-descr","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/plugin-toast-docs-2-s-spacing-removed-from-the-schema-descr.json"},{"anchor":"new-gate-tengu-fresh-heron-compiled-in-default-on","heading":"A new remote feature switch with no visible purpose yet","glance":"Claude Code has a new remotely controlled switch that counts as on when the server sends no value, and nothing yet shows what it controls","teaser":null,"tier":"internal","area":"Elsewhere","section":"Internal Changes","position":7,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/new-gate-tengu-fresh-heron-compiled-in-default-on","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/new-gate-tengu-fresh-heron-compiled-in-default-on.json"},{"anchor":"read-deny-check-refactored-attachment-reads-use-it","heading":"Read-deny check for attached files now goes through shared helpers","glance":"Checking whether a deny rule blocks reading an attached file now uses a shared helper that also tests whether any read-deny rules exist","teaser":null,"tier":"internal","area":"Permissions","section":"Internal Changes","position":8,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/read-deny-check-refactored-attachment-reads-use-it","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/read-deny-check-refactored-attachment-reads-use-it.json"},{"anchor":"renderer-passes-clip-regions-when-drawing-children","heading":"Screen drawing now passes clipping areas down and shares its text-wrap check","glance":"Claude Code now passes clipping areas when drawing nested elements and uses one shared check to decide which text wraps","teaser":null,"tier":"internal","area":"Terminal UI","section":"Internal Changes","position":9,"scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/renderer-passes-clip-regions-when-drawing-children","entry_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.289\/e\/renderer-passes-clip-regions-when-drawing-children.json"}],"facets":{"sections":[{"value":"What probably matters to you","entries":8},{"value":"Improvements","entries":25},{"value":"Bug Fixes","entries":9},{"value":"Internal Changes","entries":10}],"tiers":[{"value":"notice","entries":32},{"value":"internal","entries":18},{"value":"use","entries":2}],"areas":[{"value":"Plugin Hooks","entries":13},{"value":"Plugin UI","entries":9},{"value":"Terminal UI","entries":9},{"value":"Elsewhere","entries":6},{"value":"Permissions","entries":5},{"value":"Plugins","entries":5},{"value":"Teammates","entries":5}]}}