Disabled plugins still have their hooks executed

Resolved 💬 3 comments Opened Mar 26, 2026 by kaldown Closed Mar 30, 2026

Description

Plugins set to false in enabledPlugins still have their hooks (Stop, PreToolUse, etc.) executed by Claude Code.

Reproduction

  1. Install a plugin that registers hooks (e.g., ralph-loop or hookify from claude-plugins-official)
  2. Disable it in ~/.claude/settings.json:

``json
"enabledPlugins": {
"ralph-loop@claude-plugins-official": false,
"hookify@claude-plugins-official": false
}
``

  1. 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)

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗