[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
- 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
}
]
}
]
}
}
- Enable the plugin and start Claude Code with
--debug - Observe: Stop hook is not registered (check debug log for "Registered N hooks")
- 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)
This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗