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.
Something disagreesSomething we can check disagrees with this entry, or the writer said they could not settle it.
The writer flagged doubt
It is not clear whether ordinary plugins can reach this or only built-in ones.