You'll noticeTier: how much it should matter to you
1Useful: my rating, 1 to 5
1Signal: worth watching, 1 to 5
PluginsArea: what it touches
Bug FixesKind: in v2.1.280,
Bug FixesSection of the release
What
Plugins can define hooks (scripts that run automatically at certain points, like before or after a tool runs) two ways: by placing a hooks/hooks.json file in the plugin, which loads automatically, or by listing a hooks file explicitly in the plugin's manifest. If a plugin's manifest explicitly points to its own hooks/hooks.json, Claude Code used to load that file twice. Now it detects this case and logs a message instead of loading it a second time.
Why
This avoids duplicate hook registration for plugin authors who explicitly list their default hooks file out of habit or clarity, so the same hook doesn't fire twice for a single event.
Read from
Names in the bundlehooks/hooks.json
Since it was published
The entry above is what we published on the day. These lines were added later, as Anthropic's own pages caught up, and they sit beside the original rather than replacing it.
Confirmed sinceAnthropic's documentation has since written up hooks/hooks.json, on Hooks reference.| [Plugin](/docs/en/plugins/overview) `hooks/hooks.json` | When plugin is enabled | Yes, bundled with the plugin |hookssee the edit
Added sinceA small documentation edit on Debug your configuration touched a line naming hooks/hooks.json after this was published.| Hook never fires | Hooks are defined in a standalone file instead of `settings.json` | There is no standalone hooks file for project or user config. Define hooks under the `"hooks"` key in `settings.json`. Only [plugins](/docs/en/plugins…debug-your-configsee the edit
How sure we are
One source agreesOne thing we can check says the same as this entry.
Anthropic's documentation agreesA small documentation edit on Debug your configuration touched a line naming hooks/hooks.json after this was published.