{"version":"2.1.296","anchor":"plugin-hooks-left-out-by-name-are-now-tracked-and-reported","canonical_anchor":"plugin-hooks-left-out-by-name-are-now-tracked-and-reported","heading":"Duplicate-name plugins: skipped hooks are recorded and explained","tier":"notice","area":"Plugins","scope":"individual","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.296\/e\/plugin-hooks-left-out-by-name-are-now-tracked-and-reported","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.296","markdown":"### Duplicate-name plugins: skipped hooks are recorded and explained\n\nWhen two plugins share a name only the first runs hooks; the other's skipped hooks are now recorded and shown alongside plugin warnings\n\n**What**\n\nPlugins 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:\n\n- hooks.json hooks: a `hooks-left-out-by-name` entry is recorded, with its source and the plugin that holds the name (`heldBy`). The plugin shows \"Its hooks.json hooks do not run\".\n\n- Hooks module: a `hooks-module-left-out-by-name` entry is recorded, with the holder. The plugin shows \"Its hooks module does not load\". Choosing which hooks modules load now returns `chosen` and `leftOut` lists.\n\n- 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.\n\nBefore, a duplicate was only logged as \"Skipping duplicate hook registration for plugin\".\n\n**Why**\n\nIf 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.\n\n- Area: Plugins\n- Tier: You'll notice\n- Useful: 2\/5\n- Signal: 1\/5\n- Scope: individual\n- Heads-up: no"}