Plugin hooks.json does not register the MessageDisplay hook event (other events load fine)
What happened
A plugin that declares a MessageDisplay hook in its hooks/hooks.json never gets that hook fired — even though every other hook event in the same manifest (UserPromptSubmit, PreToolUse, PostToolUse, Stop, PreCompact) loads and fires correctly. Moving the identical MessageDisplay entry into ~/.claude/settings.json makes it work immediately (no restart needed).
Steps to reproduce
- Install a plugin whose
hooks/hooks.jsonincludes aMessageDisplayentry shaped exactly like its other (working) hook entries:
``json``
"MessageDisplay": [
{ "hooks": [ { "type": "command", "command": "node ${CLAUDE_PLUGIN_ROOT}/scripts/message-display.js", "timeout": 10 } ] }
]
- Use the VS Code extension panel.
- The
MessageDisplayhook never fires (no on-screen effect); the plugin's other hooks fire normally. - Move that same entry into
~/.claude/settings.jsonhooks→ it fires immediately.
Expected
MessageDisplay should register from a plugin hooks.json like every other hook event.
Actual
Only MessageDisplay fails to wire from a plugin manifest; the byte-identical entry in settings.json works.
Environment
- Claude Code 2.1.181, VS Code extension, Windows 11
- Plugin installed via the
pluginsarray in~/.claude/settings.json(absolute path) - Reproduced by @Non-Dev-Contributor; plugin:
pleasedodisturb/chronoclaude - On macOS, the plugin-loaded
MessageDisplaydoes fire — so this may be Windows- or install-method-specific.
Notes
Surfaced while resolving #44763. The plugin's MessageDisplay entry is byte-identical in shape to its working UserPromptSubmit/Stop entries, so this looks like a loader gap for the MessageDisplay event type rather than a manifest error. Workaround for affected users is to register MessageDisplay directly in settings.json.
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗