| name | hooks-test |
| description | Test skill demonstrating hooks functionality. Shows PreToolUse, PostToolUse, and Stop hooks in action. |
| version | 1.0.0 |
| author | SDK Team <sdk@example.com> |
| tags | ["testing","hooks","development"] |
| dependencies | [] |
| allowed_tools | ["Read","Write","Bash","Grep"] |
| hooks | {"pre_tool_use":[{"matcher":"Bash","command":"echo '๐ PreToolUse: About to execute Bash tool'","type":"command","once":false},{"matcher":"Write","command":"echo '๐ PreToolUse: About to write file - $TOOL_NAME'","type":"command","once":false},{"matcher":"*","command":"echo 'โก PreToolUse: Tool $TOOL_NAME is about to be used'","type":"command","once":true}],"post_tool_use":[{"matcher":"Bash","command":"echo 'โ
PostToolUse: Bash tool executed successfully'","type":"command","once":false},{"matcher":"Write","command":"echo '๐พ PostToolUse: File written successfully'","type":"command","once":false}],"stop":[{"matcher":"*","command":"echo '๐ Stop hook: Cleaning up resources...'","type":"command","once":false}]} |
Hooks Test Skill
Demonstrates the complete hooks functionality in Claude Agent SDK. This skill showcases how PreToolUse, PostToolUse, and Stop hooks work together to provide event-driven automation.
What are Hooks?
Hooks are event-driven commands that run at specific points during skill execution:
- PreToolUse: Runs BEFORE a tool is executed
- PostToolUse: Runs AFTER a tool completes successfully
- Stop: Runs when the skill execution stops or completes
Hook Configuration
Each hook has:
- matcher: Pattern to match tool names (e.g., "Bash", "Write", "*")
- command: Shell command to execute
- once: If true, runs only once per session (default: false)
- type: Execution type - "command", "script", or "function"
Testing the Hooks
Test 1: Bash Tool Hooks
When you ask me to run a Bash command:
Please run: echo "Hello World"
Expected Output:
๐ PreToolUse: About to execute Bash tool
[Bash command executes]
โ
PostToolUse: Bash tool executed successfully
Test 2: Write Tool Hooks
When you ask me to write a file:
Create a file named test.txt with content "Hello"
Expected Output:
๐ PreToolUse: About to write file - Write
[File is written]
๐พ PostToolUse: File written successfully
Test 3: Wildcard Matcher
The * matcher with once: true will run only once for the first tool used:
Run any command
Expected Output:
โก PreToolUse: Tool <tool_name> is about to be used
[This message appears only once per session]
Test 4: Stop Hook
When this skill finishes execution:
Expected Output:
๐ Stop hook: Cleaning up resources...
Hook Features Demonstrated
1. Tool-Specific Hooks
- PreToolUse and PostToolUse for specific tools (Bash, Write)
- Fine-grained control over tool execution
2. Wildcard Matching
* matcher applies to all tools
- Useful for global hooks like logging
3. Once-Only Execution
once: true ensures hook runs only once per session
- Perfect for initialization tasks
4. Multiple Hooks Per Event
- Can stack multiple hooks for the same event
- Run in sequence for chained operations
Advanced Usage
Pattern Matching
You can use patterns in the matcher field:
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: "echo 'Bash tool detected'"
- matcher: "Bash*"
hooks:
- type: command
command: "echo 'Any Bash-related tool'"
- matcher: "*"
hooks:
- type: command
command: "echo 'Any tool'"
Environment Variables
Hooks can access environment variables:
hooks:
PreToolUse:
- matcher: "*"
hooks:
- type: command
command: "echo 'Tool: $TOOL_NAME, Input: $TOOL_INPUT'"
Script Hooks
Instead of inline commands, use scripts:
hooks:
PreToolUse:
- matcher: "Write"
hooks:
- type: script
command: "scripts/validate_write.sh"
With scripts/validate_write.sh:
#!/bin/bash
echo "Validating write operation..."
echo "Tool: $TOOL_NAME"
echo "Input: $TOOL_INPUT"
Common Use Cases
1. Security Validation
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: script
command: "scripts/security_check.sh"
2. Audit Logging
hooks:
PostToolUse:
- matcher: "*"
hooks:
- type: command
command: "echo '$(date): Tool $TOOL_NAME used' >> audit.log"
3. Resource Cleanup
hooks:
Stop:
- matcher: "*"
hooks:
- type: script
command: "scripts/cleanup.sh"
4. Performance Monitoring
hooks:
PreToolUse:
- matcher: "*"
hooks:
- type: command
command: "echo $(date +%s%N) > /tmp/start_time"
PostToolUse:
- matcher: "*"
hooks:
- type: command
command: |
START=$(cat /tmp/start_time)
END=$(date +%s%N)
echo "Tool execution time: $((($END - $START) / 1000000))ms"
Testing Checklist
Test each hook type:
Troubleshooting
Hook Not Firing
Problem: Hook command doesn't execute
Solutions:
- Check YAML syntax (use spaces, not tabs)
- Verify matcher pattern matches tool name
- Ensure command is executable
- Check hook event type (PreToolUse vs PostToolUse)
Once Flag Not Working
Problem: Hook with once: true keeps running
Solution: The once flag applies per session. Restart the session to test.
Hook Failing Silently
Problem: Hook errors not visible
Solution: Add error handling:
hooks:
PreToolUse:
- matcher: "*"
hooks:
- type: command
command: "python scripts/hook.py 2>&1 || echo 'Hook failed'"
Best Practices
DO โ
- Use specific matchers when possible
- Keep hook commands simple and fast
- Add proper error handling
- Use scripts for complex logic
- Test hooks in isolation
- Log hook execution for debugging
DON'T โ
- Don't put long-running commands in hooks
- Don't use hooks for core logic (use skill execution)
- Don't forget to make scripts executable
- Don't assume environment variables exist
- Don't create circular dependencies with hooks
Summary
This skill demonstrates:
- โ
PreToolUse hooks for tool preparation
- โ
PostToolUse hooks for tool completion
- โ
Stop hooks for cleanup
- โ
Pattern matching with specific tools
- โ
Wildcard matching for all tools
- โ
Once-only execution
- โ
Multiple hooks per event
Try the tests above to see hooks in action!
Version: 1.0.0
Last Updated: 2026-01-10
Maintainer: SDK Team