{"name":"hooks.json","slug":"hooks-json","family":"setting","title":"Settings keys","noun":"settings key","description":"Plugin validation now warns about symlinked or oversized files instead of reading them.","description_source":"entry","described_by":{"version":"2.1.233","anchor":"plugin-validation-now-reports-symlinked-and-oversized-files-"},"presence":{"first_seen":null,"removed_in":null,"in_current_build":false,"newest_mined":"2.1.319","builds":0,"mined_builds":159,"first_cited":{"version":"2.1.233","released_at":"2026-08-14 18:50:44","spans":8}},"aliases":[],"entries":[{"version":"2.1.296","anchor":"plugin-hooksjson-unknown-key-warning-no-longer-truncates-th","heading":"Warning about unknown keys in a plugin's hooks.json lists them differently","line":"The warning about unknown keys in a plugin's `hooks.json` no longer cuts the list off with \"and N more\"","released_at":"2026-10-09 16:58:10","reason":"found in this entry's text"},{"version":"2.1.296","anchor":"plugins-duplicate-name-copies-hooks-are-left-out-with-exp","heading":"Claude Code explains when a duplicate plugin's hooks do not run","line":"When two plugins share a name, Claude Code now reports that the later one's hooks do not run or load","released_at":"2026-10-09 16:58:10","reason":"found in this entry's text"},{"version":"2.1.281","anchor":"plugin-hooksjson-accepts-a-schema-key","heading":"Plugin hooks.json accepts a $schema key","line":"A plugin's hooks.json file can now include a `$schema` key, which Claude Code ignores when loading","released_at":"2026-09-23 17:01:17","reason":"found in this entry's text"},{"version":"2.1.281","anchor":"hooks-validation-warns-about-unquoted-plugin-path-placeholde","heading":"Hooks validation warns about unquoted plugin path placeholders (live)","line":"Validating hooks.json now warns when a command hook uses a plugin path placeholder without quotes","released_at":"2026-09-23 17:01:17","reason":"found in this entry's text, named in this entry"},{"version":"2.1.280","anchor":"plugin-hooks-manifest-dedup-warning-for-hookshooksjson","heading":"Plugin hooks manifest dedup warning for hooks\/hooks.json","line":"Claude Code now warns instead of double-loading a plugin's hooks.json if it's also listed explicitly","released_at":"2026-09-22 15:44:39","reason":"found in this entry's text"},{"version":"2.1.275","anchor":"hooks-modules-must-now-be-named-like-code","heading":"Hooks modules must now be 'named like code'","line":"Plugin hook modules must now use a recognized code file extension or they won't load","released_at":"2026-09-17 20:20:31","reason":"found in this entry's text, named in this entry"},{"version":"2.1.269","anchor":"hooksjson-surface-field-removed-in-favor-of-inline-client","heading":"hooks.json surface field removed in favor of inline Client module references","line":"hooks.json drops its surface field; plugins now name their display module directly on each Client element","released_at":"2026-09-11 18:12:49","reason":"found in this entry's text"},{"version":"2.1.269","anchor":"plugin-loader-hook-module-surface-tagging-removed-new-pa","heading":"Plugin loader: hook-module \"surface\" tagging removed; new parameter threaded through","line":"Plugin hook loading drops an internal \"surface\" tag while gaining a new unused parameter","released_at":"2026-09-11 18:12:49","reason":"found in this entry's text"},{"version":"2.1.268","anchor":"plugin-skillmonitor-path-checks-now-surface-unreadable-path","heading":"Plugin skill\/monitor path checks now surface unreadable-path errors instead of silently treating them as absent","line":"Plugin loading now reports unreadable SKILL.md or monitors.json paths instead of treating them as missing","released_at":"2026-09-10 18:41:11","reason":"found in this entry's text"},{"version":"2.1.267","anchor":"plugin-hooksjson-now-warned-on-unknownmalformed-keys","heading":"Plugin hooks.json now warned on unknown\/malformed keys","line":"Claude Code now warns about unknown or malformed keys in a plugin's hooks.json","released_at":"2026-09-09 18:25:42","reason":"found in this entry's text"}],"entries_total":20,"docs":[{"source":"claude-code","path":"agent-sdk\/plugins","title":"Plugins in the SDK","documented":false},{"source":"claude-code","path":"debug-your-config","title":"Debug your configuration","documented":false},{"source":"claude-code","path":"headless","title":"Run Claude Code programmatically","documented":false},{"source":"claude-code","path":"hooks","title":"Hooks reference","documented":false},{"source":"claude-code","path":"hooks-guide","title":"Automate actions with hooks","documented":false},{"source":"claude-code","path":"permissions","title":"Configure permissions","documented":false},{"source":"claude-code","path":"plugins\/components","title":"Add components to a plugin","documented":false},{"source":"claude-code","path":"plugins\/create","title":"Create a Claude Code plugin","documented":false},{"source":"claude-code","path":"plugins\/loading","title":"Plugin loading reference","documented":false},{"source":"claude-code","path":"plugins\/manifest-reference","title":"Plugin manifest reference","documented":false}],"docs_total":12,"gates":[],"related":[{"name":"hooks","slug":"hooks","description":"Run your own commands as [hooks](https:\/\/code.claude.com\/docs\/en\/hooks.md) at points in Claude Code's lifecycle"},{"name":"HOOKS_WORKER_URL","slug":"hooks-worker-url","description":"Onboarding, worktrees, tmux, Bedrock, Vertex and more now load on demand instead of at startup."},{"name":"hooksDir","slug":"hooksdir","description":null},{"name":"hooksFailed","slug":"hooksfailed","description":null},{"name":"hooksModules","slug":"hooksmodules","description":"A new `plugin test [dir]` command runs a mod's tests, marked as early access"},{"name":"hooksOk","slug":"hooksok","description":null},{"name":"hookSpecificOutput","slug":"hookspecificoutput","description":"Hooks can now return `permissionDisplay` in their output, next to `additionalContext`, to supply details for a permission prompt"},{"name":"hookSpecificOutput.additionalContext","slug":"hookspecificoutput-additionalcontext","description":"Text from a hook's systemMessage and additionalContext now goes through an extra processing step before the model sees it"},{"name":"hooksRunning","slug":"hooksrunning","description":null},{"name":"hooksStopped","slug":"hooksstopped","description":null}],"url":"https:\/\/changelogs.core-directive.com\/reference\/setting\/hooks-json","family_url":"https:\/\/changelogs.core-directive.com\/reference\/setting.json"}