Hook settings are cached and changes don't take effect until session restart
Description
When modifying hook settings in .claude/settings.json or .claude/settings.local.json during a session, the changes don't take effect until the session is restarted. The old hook configuration continues to be cached and used.
Steps to Reproduce
- Configure a
PostToolUsehook in.claude/settings.json(e.g.,"matcher": "Bash") - During the session, modify the setting (e.g., change to
"matcher": "mcp__plugin_github_github__create_pull_request") - Run a Bash command - the old hook (matching all Bash) still fires
Expected Behavior
Changes to hook settings in .claude/settings.json or .claude/settings.local.json should take effect immediately without requiring a session restart.
Actual Behavior
Hook settings are cached at session start. Any modifications to the settings files during the session are ignored until a new session is started.
Workaround
- Restart the Claude Code session after modifying hook settings
- Or completely disable hooks and start a new session
Environment
- Claude Code version: Latest (as of Feb 2026)
- OS: macOS (Darwin 25.2.0)
Impact
Medium - This affects the developer experience when iterating on hook configurations, but can be worked around by restarting the session.
Suggested Solution
Consider implementing one of the following:
- File watching: Watch
.claude/settings.jsonand.claude/settings.local.jsonfor changes and reload hook configurations automatically - Manual reload command: Add a
/reload-hooksor similar command to manually reload hook configurations - Per-invocation loading: Load hook settings on each tool invocation instead of caching at session start (may have performance implications)
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗