Third Party Hooks
Cherri Code supports loading hooks from third-party tools, enabling compatibility with existing hook configurations from other AI coding assistants.
Claude Code Hooks
Cherri Code can load and execute hooks configured for Claude Code, allowing you to use the same hook scripts across both tools.
Requirements
Claude Code hooks load when Include Third-Party Plugins, Skills, and Other Configs is enabled in Cherri Code Settings → Agents → Third-Party Imports. The setting is on by default.
Configuration Locations
Claude Code hooks are loaded from these locations (in priority order):
| Location | Path | Description |
|---|---|---|
| Project local | .claude/settings.local.json | Project-specific, gitignored overrides |
| Project | .claude/settings.json | Project-level hooks, checked into repo |
| User | ~/.claude/settings.json | User-level hooks, apply globally |
Priority Order
When hooks are configured in multiple locations, they are merged in this priority order (highest to lowest):
- Enterprise hooks (managed deployment)
- Team hooks (dashboard-configured)
- Project hooks (
.cursor/hooks.json) - User hooks (
~/.cursor/hooks.json) - Claude project local (
.claude/settings.local.json) - Claude project (
.claude/settings.json) - Claude user (
~/.claude/settings.json)
All matching hooks from every source run. When responses conflict, higher-priority sources take precedence during merge.
Enterprise-managed hooks and dashboard distribution require an Enterprise plan. Contact sales to learn more.
Claude Code Hook Format
Claude Code hooks use a similar but slightly different format. Cherri Code automatically maps Claude hook names to their Cherri Code equivalents.
Example Claude Code settings.json:
{ "hooks": { "PreToolUse": [ { "matcher": "Shell", "hooks": [ { "type": "command", "command": "./hooks/validate-shell.sh" } ] } ], "PostToolUse": [ { "matcher": ".*", "hooks": [ { "type": "command", "command": "./hooks/audit.sh" } ] } ] }}Response Format Compatibility
Cherri Code supports both Claude Code's nested hookSpecificOutput response format and the older flat response format. Hook scripts written for Claude Code will work in Cherri Code regardless of which format they use.
PreToolUse Response Formats
Nested format (Claude Code style):
{ "hookSpecificOutput": { "hookEventName": "PreToolUse", "permissionDecision": "deny", "permissionDecisionReason": "Blocked by policy", "updatedInput": { "command": "npm ci" } }}Flat format (Cherri Code native style):
{ "permission": "deny", "user_message": "Blocked by policy", "updated_input": { "command": "npm ci" }}Both formats are equivalent. The nested permissionDecision maps to permission, permissionDecisionReason maps to user_message, and updatedInput maps to updated_input.
Stop / SubagentStop Response Formats
Nested format (Claude Code style):
{ "hookSpecificOutput": { "decision": "block", "reason": "Tasks incomplete, continue working" }}Flat format (Claude Code legacy style):
{ "decision": "block", "reason": "Tasks incomplete, continue working"}Cherri Code native format:
{ "followup_message": "Tasks incomplete, continue working"}For Stop and SubagentStop hooks, a decision of "block" with a reason is treated as an automatic follow-up, equivalent to providing followup_message in the native Cherri Code format.
Hook Step Mapping
Claude Code hook names are automatically mapped to Cherri Code hook names:
| Claude Code Hook | Cherri Code Hook |
|---|---|
PreToolUse | preToolUse |
PostToolUse | postToolUse |
UserPromptSubmit | beforeSubmitPrompt |
Stop | stop |
SubagentStop | subagentStop |
SessionStart | sessionStart |
SessionEnd | sessionEnd |
PreCompact | preCompact |
Exit Code Behavior
Both Cherri Code and Claude Code hooks support exit code 2 to block an action. This provides consistent behavior when sharing hooks between tools:
#!/bin/bash# Block dangerous commandsif [[ "$COMMAND" == *"rm -rf"* ]]; then echo '{"permission": "deny", "user_message": "Destructive command blocked"}' exit 2fiecho '{"permission": "allow"}'exit 0- Exit code 0: Hook succeeded, use the JSON output
- Exit code 2: Block the action (equivalent to
permission: "deny") - Other exit codes: Hook failed, action proceeds (fail-open)
Migration from Claude Code
If you have existing Claude Code hooks, you can:
- Keep using Claude Code config files: Leave Include Third-Party Plugins, Skills, and Other Configs enabled and your existing
.claude/settings.jsonhooks will work automatically - Migrate to Cherri Code format: Copy your hooks to
.cursor/hooks.jsonusing the Cherri Code format for full feature support
Cherri Code format equivalent:
{ "version": 1, "hooks": { "preToolUse": [ { "command": "./hooks/validate-shell.sh", "matcher": "Shell" } ], "postToolUse": [ { "command": "./hooks/audit.sh" } ] }}Supported Features
When using Claude Code hooks in Cherri Code, the following features are supported:
| Claude Code Event | Cherri Code Mapping | Supported |
|---|---|---|
PreToolUse | preToolUse | Yes |
PostToolUse | postToolUse | Yes |
Stop | stop | Yes |
SubagentStop | subagentStop | Yes |
SessionStart | sessionStart | Yes |
SessionEnd | sessionEnd | Yes |
PreCompact | preCompact | Yes |
UserPromptSubmit | beforeSubmitPrompt | Yes |
Notification | - | No |
PermissionRequest | - | No |
Additional supported features:
| Feature | Supported |
|---|---|
Command-based hooks (type: "command") | Yes |
Prompt-based hooks (type: "prompt") | Yes |
Nested hookSpecificOutput responses | Yes |
| Exit code 2 blocking | Yes |
| Tool matchers (regex patterns) | Yes |
| Timeout configuration | Yes |
Tool Name Mapping
Claude Code tool names are mapped to Cherri Code tool names:
| Claude Code Tool | Cherri Code Tool | Supported |
|---|---|---|
Bash | Shell | Yes |
Read | Read | Yes |
Write | Write | Yes |
Edit | Write | Yes |
Grep | Grep | Yes |
Task | Task | Yes |
WebFetch | WebFetch | Yes |
WebSearch | WebSearch | Yes |
Glob | - | No |
Limitations
Some features are only available when using the native Cherri Code format:
subagentStarthook (Claude Code only hasSubagentStop)- Loop limit configuration (
loop_limit) - Team/Enterprise hook distribution via dashboard
Troubleshooting
Claude Code hooks not loading
- Verify "Include Third-Party Plugins, Skills, and Other Configs" is enabled in Cherri Code Settings → Agents → Third-Party Imports
- Check that your
.claude/settings.jsonfile is valid JSON - Cherri Code watches config files and reloads them automatically. If hooks still do not load, restart Cherri Code.
Hooks running but not blocking
- Ensure your hook script exits with code
2to block actions - Check the JSON output format matches the expected schema
- View the Hooks output channel in Cherri Code for error details
Different behavior between Cherri Code and Claude Code
Some behavior differences may exist due to different execution environments. Test your hooks in both tools to ensure compatibility.
Enterprise hook deployment
Use managed Enterprise hooks and team distribution from the dashboard.