Disabled plugins still have their hooks executed
Description
Plugins set to false in enabledPlugins still have their hooks (Stop, PreToolUse, etc.) executed by Claude Code.
Reproduction
- Install a plugin that registers hooks (e.g.,
ralph-looporhookifyfromclaude-plugins-official) - Disable it in
~/.claude/settings.json:
``json``
"enabledPlugins": {
"ralph-loop@claude-plugins-official": false,
"hookify@claude-plugins-official": false
}
- Start a Claude Code session and observe the stop hooks output:
````
⏺ Ran 2 stop hooks
⎿ ${CLAUDE_PLUGIN_ROOT}/hooks/stop-hook.sh
⎿ python3 ${CLAUDE_PLUGIN_ROOT}/hooks/stop.py
⎿ Stop hook error: Failed with non-blocking status code: /bin/sh: .../ralph-loop/hooks/stop-hook.sh: Permission denied
Both hooks are from disabled plugins but still execute.
Expected behavior
Hooks defined in a plugin's hooks.json should not be executed when the plugin is disabled via enabledPlugins: false.
Actual behavior
Claude Code loads and executes hooks.json from all installed plugins in ~/.claude/plugins/marketplaces/*/plugins/*/hooks/hooks.json, regardless of the enabledPlugins setting.
Environment
- Claude Code CLI (latest as of 2026-03-26)
- macOS (Darwin 25.3.0)
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗