|
Download plugins/hookify/README.md from SaylorTwift/claude-code: direct link, hf CLI and curl.
- Browser
- Download file 7.71 kB
-
https://huggingface.co/SaylorTwift/claude-code/resolve/main/plugins/hookify/README.md
- Command line
-
hf download hf://SaylorTwift/claude-code/plugins/hookify/README.md
-
curl -L -o README.md https://huggingface.co/SaylorTwift/claude-code/resolve/main/plugins/hookify/README.md
7.71 kB
| # Hookify Plugin | |
| Easily create custom hooks to prevent unwanted behaviors by analyzing conversation patterns or from explicit instructions. | |
| ## Overview | |
| The hookify plugin makes it simple to create hooks without editing complex `hooks.json` files. Instead, you create lightweight markdown configuration files that define patterns to watch for and messages to show when those patterns match. | |
| **Key features:** | |
| - 🎯 Analyze conversations to find unwanted behaviors automatically | |
| - 📝 Simple markdown configuration files with YAML frontmatter | |
| - 🔍 Regex pattern matching for powerful rules | |
| - 🚀 No coding required - just describe the behavior | |
| - 🔄 Easy enable/disable without restarting | |
| ## Quick Start | |
| ### 1. Create Your First Rule | |
| ```bash | |
| /hookify Warn me when I use rm -rf commands | |
| ``` | |
| This analyzes your request and creates `.claude/hookify.warn-rm.local.md`. | |
| ### 2. Test It Immediately | |
| **No restart needed!** Rules take effect on the very next tool use. | |
| Ask Claude to run a command that should trigger the rule: | |
| ``` | |
| Run rm -rf /tmp/test | |
| ``` | |
| You should see the warning message immediately! | |
| ## Usage | |
| ### Main Command: /hookify | |
| **With arguments:** | |
| ``` | |
| /hookify Don't use console.log in TypeScript files | |
| ``` | |
| Creates a rule from your explicit instructions. | |
| **Without arguments:** | |
| ``` | |
| /hookify | |
| ``` | |
| Analyzes recent conversation to find behaviors you've corrected or been frustrated by. | |
| ### Helper Commands | |
| **List all rules:** | |
| ``` | |
| /hookify:list | |
| ``` | |
| **Configure rules interactively:** | |
| ``` | |
| /hookify:configure | |
| ``` | |
| Enable/disable existing rules through an interactive interface. | |
| **Get help:** | |
| ``` | |
| /hookify:help | |
| ``` | |
| ## Rule Configuration Format | |
| ### Simple Rule (Single Pattern) | |
| `.claude/hookify.dangerous-rm.local.md`: | |
| ```markdown | |
| --- | |
| name: block-dangerous-rm | |
| enabled: true | |
| event: bash | |
| pattern: rm\s+-rf | |
| action: block | |
| --- | |
| ⚠️ **Dangerous rm command detected!** | |
| This command could delete important files. Please: | |
| - Verify the path is correct | |
| - Consider using a safer approach | |
| - Make sure you have backups | |
| ``` | |
| **Action field:** | |
| - `warn`: Shows warning but allows operation (default) | |
| - `block`: Prevents operation from executing (PreToolUse) or stops session (Stop events) | |
| ### Advanced Rule (Multiple Conditions) | |
| `.claude/hookify.sensitive-files.local.md`: | |
| ```markdown | |
| --- | |
| name: warn-sensitive-files | |
| enabled: true | |
| event: file | |
| action: warn | |
| conditions: | |
| - field: file_path | |
| operator: regex_match | |
| pattern: \.env$|credentials|secrets | |
| - field: new_text | |
| operator: contains | |
| pattern: KEY | |
| --- | |
| 🔐 **Sensitive file edit detected!** | |
| Ensure credentials are not hardcoded and file is in .gitignore. | |
| ``` | |
| **All conditions must match** for the rule to trigger. | |
| ## Event Types | |
| - **`bash`**: Triggers on Bash tool commands | |
| - **`file`**: Triggers on Edit, Write, MultiEdit tools | |
| - **`stop`**: Triggers when Claude wants to stop (for completion checks) | |
| - **`prompt`**: Triggers on user prompt submission | |
| - **`all`**: Triggers on all events | |
| ## Pattern Syntax | |
| Use Python regex syntax: | |
| | Pattern | Matches | Example | | |
| |---------|---------|---------| | |
| | `rm\s+-rf` | rm -rf | rm -rf /tmp | | |
| | `console\.log\(` | console.log( | console.log("test") | | |
| | `(eval\|exec)\(` | eval( or exec( | eval("code") | | |
| | `\.env$` | files ending in .env | .env, .env.local | | |
| | `chmod\s+777` | chmod 777 | chmod 777 file.txt | | |
| **Tips:** | |
| - Use `\s` for whitespace | |
| - Escape special chars: `\.` for literal dot | |
| - Use `|` for OR: `(foo|bar)` | |
| - Use `.*` to match anything | |
| - Set `action: block` for dangerous operations | |
| - Set `action: warn` (or omit) for informational warnings | |
| ## Examples | |
| ### Example 1: Block Dangerous Commands | |
| ```markdown | |
| --- | |
| name: block-destructive-ops | |
| enabled: true | |
| event: bash | |
| pattern: rm\s+-rf|dd\s+if=|mkfs|format | |
| action: block | |
| --- | |
| 🛑 **Destructive operation detected!** | |
| This command can cause data loss. Operation blocked for safety. | |
| Please verify the exact path and use a safer approach. | |
| ``` | |
| **This rule blocks the operation** - Claude will not be allowed to execute these commands. | |
| ### Example 2: Warn About Debug Code | |
| ```markdown | |
| --- | |
| name: warn-debug-code | |
| enabled: true | |
| event: file | |
| pattern: console\.log\(|debugger;|print\( | |
| action: warn | |
| --- | |
| 🐛 **Debug code detected** | |
| Remember to remove debugging statements before committing. | |
| ``` | |
| **This rule warns but allows** - Claude sees the message but can still proceed. | |
| ### Example 3: Require Tests Before Stopping | |
| ```markdown | |
| --- | |
| name: require-tests-run | |
| enabled: false | |
| event: stop | |
| action: block | |
| conditions: | |
| - field: transcript | |
| operator: not_contains | |
| pattern: npm test|pytest|cargo test | |
| --- | |
| **Tests not detected in transcript!** | |
| Before stopping, please run tests to verify your changes work correctly. | |
| ``` | |
| **This blocks Claude from stopping** if no test commands appear in the session transcript. Enable only when you want strict enforcement. | |
| ## Advanced Usage | |
| ### Multiple Conditions | |
| Check multiple fields simultaneously: | |
| ```markdown | |
| --- | |
| name: api-key-in-typescript | |
| enabled: true | |
| event: file | |
| conditions: | |
| - field: file_path | |
| operator: regex_match | |
| pattern: \.tsx?$ | |
| - field: new_text | |
| operator: regex_match | |
| pattern: (API_KEY|SECRET|TOKEN)\s*=\s*["'] | |
| --- | |
| 🔐 **Hardcoded credential in TypeScript!** | |
| Use environment variables instead of hardcoded values. | |
| ``` | |
| ### Operators Reference | |
| - `regex_match`: Pattern must match (most common) | |
| - `contains`: String must contain pattern | |
| - `equals`: Exact string match | |
| - `not_contains`: String must NOT contain pattern | |
| - `starts_with`: String starts with pattern | |
| - `ends_with`: String ends with pattern | |
| ### Field Reference | |
| **For bash events:** | |
| - `command`: The bash command string | |
| **For file events:** | |
| - `file_path`: Path to file being edited | |
| - `new_text`: New content being added (Edit, Write) | |
| - `old_text`: Old content being replaced (Edit only) | |
| - `content`: File content (Write only) | |
| **For prompt events:** | |
| - `user_prompt`: The user's submitted prompt text | |
| **For stop events:** | |
| - Use general matching on session state | |
| ## Management | |
| ### Enable/Disable Rules | |
| **Temporarily disable:** | |
| Edit the `.local.md` file and set `enabled: false` | |
| **Re-enable:** | |
| Set `enabled: true` | |
| **Or use interactive tool:** | |
| ``` | |
| /hookify:configure | |
| ``` | |
| ### Delete Rules | |
| Simply delete the `.local.md` file: | |
| ```bash | |
| rm .claude/hookify.my-rule.local.md | |
| ``` | |
| ### View All Rules | |
| ``` | |
| /hookify:list | |
| ``` | |
| ## Installation | |
| This plugin is part of the Claude Code Marketplace. It should be auto-discovered when the marketplace is installed. | |
| **Manual testing:** | |
| ```bash | |
| cc --plugin-dir /path/to/hookify | |
| ``` | |
| ## Requirements | |
| - Python 3.7+ | |
| - No external dependencies (uses stdlib only) | |
| ## Troubleshooting | |
| **Rule not triggering:** | |
| 1. Check rule file exists in `.claude/` directory (in project root, not plugin directory) | |
| 2. Verify `enabled: true` in frontmatter | |
| 3. Test regex pattern separately | |
| 4. Rules should work immediately - no restart needed | |
| 5. Try `/hookify:list` to see if rule is loaded | |
| **Import errors:** | |
| - Ensure Python 3 is available: `python3 --version` | |
| - Check hookify plugin is installed | |
| **Pattern not matching:** | |
| - Test regex: `python3 -c "import re; print(re.search(r'pattern', 'text'))"` | |
| - Use unquoted patterns in YAML to avoid escaping issues | |
| - Start simple, then add complexity | |
| **Hook seems slow:** | |
| - Keep patterns simple (avoid complex regex) | |
| - Use specific event types (bash, file) instead of "all" | |
| - Limit number of active rules | |
| ## Contributing | |
| Found a useful rule pattern? Consider sharing example files via PR! | |
| ## Future Enhancements | |
| - Severity levels (error/warning/info distinctions) | |
| - Rule templates library | |
| - Interactive pattern builder | |
| - Hook testing utilities | |
| - JSON format support (in addition to markdown) | |
| ## License | |
| MIT License | |