What
Plugins can ship hooks modules: code that runs when certain events happen in Claude Code. command.run is the event for running a slash command, and tool.call is the event for Claude using a tool. Claude Code now checks before handing an event to a module whether that module wants it.
command.run: a module's registration now records arunCommandslist. A command goes to the module only if the module has acommand.runhook and either lists no commands or lists that one. Before, every slash command went to it.runCommandsalso now appears in module analysis output.- A built-in module, the one that reads
CLAUDE_CODE_DISABLE_FILE_CHECKPOINTING, now declaresrunCommands: ["clear", "diff", "resume"]. Its hook now fires only for/clear,/diffand/resume. tool.call: the event now declarespinnedKeys. When a module's matcher rejects an event on a pinned key, Claude Code skips that module in the main process instead of sending the event to it. If the matcher fails with an error there, Claude Code logs "matcher threw on the host ...; the hop decides" and lets the module decide.
Why
Modules no longer receive every slash command or every tool call when they only care about some. This avoids an extra round trip to the module for events it would ignore anyway. Plugin authors can rely on a command.run hook seeing only the commands it lists.
tengu_plugin_hooks_modules Not enough to sayNothing here resolved what this flag was doing on this version, so nothing here should be read as on or off.
This account: no value returned · anonymous baseline: no value returned · compiled default in v2.1.283: off
These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
Read once, for one account on one subscription tier, against v2.1.283. It isn't a statement about your account. What a flag value here can and cannot tell you
It is not clear what the new `runCommands` field records.