| --- |
| description: Create hooks to prevent unwanted behaviors from conversation analysis or explicit instructions |
| argument-hint: Optional specific behavior to address |
| allowed-tools: ["Read", "Write", "AskUserQuestion", "Task", "Grep", "TodoWrite", "Skill"] |
| --- |
| |
| # Hookify - Create Hooks from Unwanted Behaviors |
|
|
| **FIRST: Load the hookify:writing-rules skill** using the Skill tool to understand rule file format and syntax. |
|
|
| Create hook rules to prevent problematic behaviors by analyzing the conversation or from explicit user instructions. |
|
|
| ## Your Task |
|
|
| You will help the user create hookify rules to prevent unwanted behaviors. Follow these steps: |
|
|
| ### Step 1: Gather Behavior Information |
|
|
| **If $ARGUMENTS is provided:** |
| - User has given specific instructions: `$ARGUMENTS` |
| - Still analyze recent conversation (last 10-15 user messages) for additional context |
| - Look for examples of the behavior happening |
|
|
| **If $ARGUMENTS is empty:** |
| - Launch the conversation-analyzer agent to find problematic behaviors |
| - Agent will scan user prompts for frustration signals |
| - Agent will return structured findings |
|
|
| **To analyze conversation:** |
| Use the Task tool to launch conversation-analyzer agent: |
| ``` |
| { |
| "subagent_type": "general-purpose", |
| "description": "Analyze conversation for unwanted behaviors", |
| "prompt": "You are analyzing a Claude Code conversation to find behaviors the user wants to prevent. |
| |
| Read user messages in the current conversation and identify: |
| 1. Explicit requests to avoid something (\"don't do X\", \"stop doing Y\") |
| 2. Corrections or reversions (user fixing Claude's actions) |
| 3. Frustrated reactions (\"why did you do X?\", \"I didn't ask for that\") |
| 4. Repeated issues (same problem multiple times) |
| |
| For each issue found, extract: |
| - What tool was used (Bash, Edit, Write, etc.) |
| - Specific pattern or command |
| - Why it was problematic |
| - User's stated reason |
| |
| Return findings as a structured list with: |
| - category: Type of issue |
| - tool: Which tool was involved |
| - pattern: Regex or literal pattern to match |
| - context: What happened |
| - severity: high/medium/low |
| |
| Focus on the most recent issues (last 20-30 messages). Don't go back further unless explicitly asked." |
| } |
| ``` |
|
|
| ### Step 2: Present Findings to User |
|
|
| After gathering behaviors (from arguments or agent), present to user using AskUserQuestion: |
|
|
| **Question 1: Which behaviors to hookify?** |
| - Header: "Create Rules" |
| - multiSelect: true |
| - Options: List each detected behavior (max 4) |
| - Label: Short description (e.g., "Block rm -rf") |
| - Description: Why it's problematic |
|
|
| **Question 2: For each selected behavior, ask about action:** |
| - "Should this block the operation or just warn?" |
| - Options: |
| - "Just warn" (action: warn - shows message but allows) |
| - "Block operation" (action: block - prevents execution) |
|
|
| **Question 3: Ask for example patterns:** |
| - "What patterns should trigger this rule?" |
| - Show detected patterns |
| - Allow user to refine or add more |
|
|
| ### Step 3: Generate Rule Files |
|
|
| For each confirmed behavior, create a `.claude/hookify.{rule-name}.local.md` file: |
|
|
| **Rule naming convention:** |
| - Use kebab-case |
| - Be descriptive: `block-dangerous-rm`, `warn-console-log`, `require-tests-before-stop` |
| - Start with action verb: block, warn, prevent, require |
|
|
| **File format:** |
| ```markdown |
| --- |
| name: {rule-name} |
| enabled: true |
| event: {bash|file|stop|prompt|all} |
| pattern: {regex pattern} |
| action: {warn|block} |
| --- |
|
|
| {Message to show Claude when rule triggers} |
| ``` |
| |
| **Action values:** |
| - `warn`: Show message but allow operation (default) |
| - `block`: Prevent operation or stop session |
| |
| **For more complex rules (multiple conditions):** |
| ```markdown |
| --- |
| name: {rule-name} |
| enabled: true |
| event: file |
| conditions: |
| - field: file_path |
| operator: regex_match |
| pattern: \.env$ |
| - field: new_text |
| operator: contains |
| pattern: API_KEY |
| --- |
| |
| {Warning message} |
| ``` |
| |
| ### Step 4: Create Files and Confirm |
| |
| **IMPORTANT**: Rule files must be created in the current working directory's `.claude/` folder, NOT the plugin directory. |
| |
| Use the current working directory (where Claude Code was started) as the base path. |
| |
| 1. Check if `.claude/` directory exists in current working directory |
| - If not, create it first with: `mkdir -p .claude` |
| |
| 2. Use Write tool to create each `.claude/hookify.{name}.local.md` file |
| - Use relative path from current working directory: `.claude/hookify.{name}.local.md` |
| - The path should resolve to the project's .claude directory, not the plugin's |
| |
| 3. Show user what was created: |
| ``` |
| Created 3 hookify rules: |
| - .claude/hookify.dangerous-rm.local.md |
| - .claude/hookify.console-log.local.md |
| - .claude/hookify.sensitive-files.local.md |
|
|
| These rules will trigger on: |
| - dangerous-rm: Bash commands matching "rm -rf" |
| - console-log: Edits adding console.log statements |
| - sensitive-files: Edits to .env or credentials files |
| ``` |
| |
| 4. Verify files were created in the correct location by listing them |
| |
| 5. Inform user: **"Rules are active immediately - no restart needed!"** |
| |
| The hookify hooks are already loaded and will read your new rules on the next tool use. |
| |
| ## Event Types Reference |
| |
| - **bash**: Matches Bash tool commands |
| - **file**: Matches Edit, Write, MultiEdit tools |
| - **stop**: Matches when agent wants to stop (use for completion checks) |
| - **prompt**: Matches when user submits prompts |
| - **all**: Matches all events |
| |
| ## Pattern Writing Tips |
| |
| **Bash patterns:** |
| - Match dangerous commands: `rm\s+-rf|chmod\s+777|dd\s+if=` |
| - Match specific tools: `npm\s+install\s+|pip\s+install` |
| |
| **File patterns:** |
| - Match code patterns: `console\.log\(|eval\(|innerHTML\s*=` |
| - Match file paths: `\.env$|\.git/|node_modules/` |
| |
| **Stop patterns:** |
| - Check for missing steps: (check transcript or completion criteria) |
| |
| ## Example Workflow |
| |
| **User says**: "/hookify Don't use rm -rf without asking me first" |
| |
| **Your response**: |
| 1. Analyze: User wants to prevent rm -rf commands |
| 2. Ask: "Should I block this command or just warn you?" |
| 3. User selects: "Just warn" |
| 4. Create `.claude/hookify.dangerous-rm.local.md`: |
| ```markdown |
| --- |
| name: warn-dangerous-rm |
| enabled: true |
| event: bash |
| pattern: rm\s+-rf |
| --- |
|
|
| ⚠️ **Dangerous rm command detected** |
|
|
| You requested to be warned before using rm -rf. |
| Please verify the path is correct. |
| ``` |
| 5. Confirm: "Created hookify rule. It's active immediately - try triggering it!" |
| |
| ## Important Notes |
| |
| - **No restart needed**: Rules take effect immediately on the next tool use |
| - **File location**: Create files in project's `.claude/` directory (current working directory), NOT the plugin's .claude/ |
| - **Regex syntax**: Use Python regex syntax (raw strings, no need to escape in YAML) |
| - **Action types**: Rules can `warn` (default) or `block` operations |
| - **Testing**: Test rules immediately after creating them |
| |
| ## Troubleshooting |
| |
| **If rule file creation fails:** |
| 1. Check current working directory with pwd |
| 2. Ensure `.claude/` directory exists (create with mkdir if needed) |
| 3. Use absolute path if needed: `{cwd}/.claude/hookify.{name}.local.md` |
| 4. Verify file was created with Glob or ls |
| |
| **If rule doesn't trigger after creation:** |
| 1. Verify file is in project `.claude/` not plugin `.claude/` |
| 2. Check file with Read tool to ensure pattern is correct |
| 3. Test pattern with: `python3 -c "import re; print(re.search(r'pattern', 'test text'))"` |
| 4. Verify `enabled: true` in frontmatter |
| 5. Remember: Rules work immediately, no restart needed |
| |
| **If blocking seems too strict:** |
| 1. Change `action: block` to `action: warn` in the rule file |
| 2. Or adjust the pattern to be more specific |
| 3. Changes take effect on next tool use |
| |
| Use TodoWrite to track your progress through the steps. |
| |