What
Plugins can add hooks, which are commands or code Claude Code runs automatically at set points. Only one plugin per name runs hooks. When another plugin with the same name loads first, the later copy's hooks are now tracked and explained instead of being dropped quietly:
- hooks.json hooks: a
hooks-left-out-by-nameentry is recorded, with its source and the plugin that holds the name (heldBy). The plugin shows "Its hooks.json hooks do not run". - Hooks module: a
hooks-module-left-out-by-nameentry is recorded, with the holder. The plugin shows "Its hooks module does not load". Choosing which hooks modules load now returnschosenandleftOutlists. - Storage and display: the entries are kept in
hooksLeftOutByName, and a change event (hooksLeftOutByNameChanged) is emitted when they change. They are merged with plugin warnings so they appear in the same place.
Before, a duplicate was only logged as "Skipping duplicate hook registration for plugin".
Why
If a plugin's hooks seem to do nothing, you can now see that another plugin with the same name took precedence. Renaming or removing one of the two copies resolves the clash.