Hookify Rule Syntax in Claude Code: A Complete Guide to Custom Hooks
Hookify rule syntax lets you define custom safety hooks in Claude Code using YAML front-matter inside markdown files placed in the .claude/ directory, supporting both simple regex patterns and advanced field-based conditions to warn or block specific tool usage.
The Hookify rule syntax enables developers to enforce project-specific guardrails in the anthropics/claude-code repository by reacting to bash commands, file edits, and prompt submissions without writing Python code. Each rule lives as a markdown file in your project's .claude/ directory and combines declarative YAML front-matter with a human-readable message body that Claude displays when the rule triggers.
Hookify Rule File Structure and Location
Store all rule files in your project's .claude/ directory using the naming convention .claude/hookify.{name}.local.md. According to the runtime implementation in plugins/hookify/hooks/pretooluse.py, the system scans this directory for *.local.md files and parses the YAML front-matter to register each hook.
Every rule file contains two distinct parts:
- YAML front-matter enclosed between
---delimiters that defines the rule logic - Markdown body after the closing
---that serves as the warning or blocking message shown to Claude
Required YAML Front-Matter Fields
As documented in plugins/hookify/skills/writing-rules/SKILL.md, every rule must specify these fields:
name: Unique identifier in kebab-case (e.g.,block-dangerous-rm)enabled: Boolean toggle (trueorfalse)event: Tool event to watch (bash,file,prompt,stop, orall)patternorconditions: Matching criteria defining when the rule firesaction: Eitherwarn(default) orblock—determines whether Claude proceeds after showing the message
All other YAML fields are ignored by the parser. The message body written in markdown after the front-matter appears in Claude's interface whenever the rule matches.
Pattern Matching Strategies
The Hookify rule syntax supports two distinct approaches for detecting tool usage: simple regex patterns and advanced field-based conditions.
Simple Pattern Matching
Use the pattern field to apply a Python regular expression against the entire event text. This works best for straightforward command detection or file path matching.
---
name: detect-rm-rf
enabled: true
event: bash
pattern: rm\s+-rf\s+/
action: warn
---
Advanced Condition Syntax
For precise control over complex scenarios, use the conditions field—a YAML list where every entry must evaluate to true for the rule to trigger. Each condition specifies:
field: The specific attribute to inspect (varies by event type)operator: The comparison methodpattern: The string or regex to match against
Available operators include:
regex_match: Python-style regular expression (most common)contains: Substring must appearequals: Exact string equalitynot_contains: Substring must not appearstarts_with: Prefix matchends_with: Suffix match
The fields available depend on the event type:
| Event | Available Fields |
|---|---|
bash |
command |
file |
file_path, new_text, old_text, content |
prompt |
user_prompt |
stop |
transcript (session state representation) |
Practical Hookify Rule Examples
The following examples demonstrate patterns found in plugins/hookify/README.md and the runtime hooks.
Warning on Dangerous Commands
This rule detects potentially destructive bash commands using a simple regex pattern:
---
name: block-dangerous-rm
enabled: true
event: bash
pattern: rm\s+-rf
---
⚠️ **Dangerous rm command detected!**
Please double-check the path before proceeding.
File location: .claude/hookify.block-dangerous-rm.local.md
Blocking Execution
Add action: block to the front-matter to prevent the matched tool from executing:
---
name: block-dangerous-rm
enabled: true
event: bash
pattern: rm\s+-rf
action: block
---
⛔️ **Execution blocked** – dangerous delete command.
Multi-Condition File Monitoring
Use multiple conditions to verify both the file path and content before triggering:
---
name: warn-sensitive-env
enabled: true
event: file
action: warn
conditions:
- field: file_path
operator: regex_match
pattern: \.env$
- field: new_text
operator: contains
pattern: API_KEY
---
🔐 **Sensitive credential added to .env**
Consider moving it to a secret manager and ensure the file is git-ignored.
Session Stop Validation
Monitor the stop event to enforce workflow requirements before ending sessions:
---
name: require-tests-before-stop
enabled: true
event: stop
action: block
conditions:
- field: transcript
operator: not_contains
pattern: npm test|pytest|cargo test
---
❗️ **Tests not detected** – please run your test suite before stopping.
Summary
- Hookify rules live in
.claude/hookify.{name}.local.mdfiles and use YAML front-matter to define trigger conditions - The syntax supports five event types:
bash,file,prompt,stop, andall - Match using either a single
patternregex or an advancedconditionslist with field-specific operators likeregex_match,contains, ornot_contains - Actions are either
warn(allow after notification) orblock(prevent execution) - All regular expressions use Python
remodule syntax as implemented inplugins/hookify/hooks/pretooluse.py
Frequently Asked Questions
Where do I place Hookify rule files?
Place them in your project's .claude/ directory with the naming format hookify.{name}.local.md. The plugin automatically discovers and loads these files during Claude Code initialization.
What is the difference between warn and block actions?
The warn action displays your message but allows Claude to proceed with the tool usage, while block prevents the action entirely until the user modifies their request. If omitted, action defaults to warn.
Can I combine multiple conditions in a single rule?
Yes. When using the conditions field (instead of a single pattern), provide a YAML list where all conditions must match for the rule to fire. Each condition specifies a field, operator, and pattern.
Which regex syntax does Hookify support?
Hookify uses Python regular expressions exactly as implemented by the standard library re module. This applies to all pattern values and regex_match operators throughout the rule syntax.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →