[BUG] Prompt-based hooks (type: "prompt") silently ignored when installed via plugins

Resolved 💬 4 comments Opened Dec 5, 2025 by oneryalcin Closed Feb 11, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report
  • [x] I am using the latest version of Claude Code

What's Wrong?

Hooks with type: "prompt" are silently ignored during registration when installed via plugins. Only type: "command" hooks are registered from plugin hooks/hooks.json files.

Debug log evidence:

With prompt-based Stop hook:

Loading hooks from plugin: core-utils
Registered 2 hooks from 4 plugins   ← Stop hook missing

After converting to command-based:

Loading hooks from plugin: core-utils  
Registered 3 hooks from 4 plugins   ← Stop hook now registered

Steps to Reproduce

  1. Create a plugin with a prompt-based Stop hook in hooks/hooks.json:
{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "prompt",
            "prompt": "Evaluate if task is complete. Return approve or block.",
            "timeout": 30
          }
        ]
      }
    ]
  }
}
  1. Enable the plugin and start Claude Code with --debug
  2. Observe: Stop hook is not registered (check debug log for "Registered N hooks")
  3. The hook never fires when stopping

What Should Happen?

Prompt-based hooks should register and execute the same way whether installed via plugins or defined in user settings.

Workaround

Convert prompt-based hooks to command-based hooks that call an external script/LLM:

{
  "type": "command",
  "command": "python3 \"${CLAUDE_PLUGIN_ROOT}/hooks/my-check.py\"",
  "timeout": 15
}

Environment

  • Claude Code version: 2.0.59
  • OS: macOS Darwin 25.0.0
  • Installation: Homebrew

Related Issues

  • #10412 - Plugin Stop hooks with exit code 2 (different code paths for plugins)
  • #11786 - Prompt hooks not receiving content (different - hook fires but lacks context)

View original on GitHub ↗

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