Test skill demonstrating hooks functionality. Shows PreToolUse, PostToolUse, and Stop hooks in action.
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.
Hooks are event-driven commands that run at specific points during skill execution:
Each hook has:
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
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
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]
When this skill finishes execution:
Expected Output:
š Stop hook: Cleaning up resources...
* matcher applies to all toolsonce: true ensures hook runs only once per sessionYou can use patterns in the matcher field:
hooks:
PreToolUse:
# Match specific tool
- matcher: "Bash"
hooks:
- type: command
command: "echo 'Bash tool detected'"
# Match multiple tools with wildcard
- matcher: "Bash*"
hooks:
- type: command
command: "echo 'Any Bash-related tool'"
# Match all tools
- matcher: "*"
hooks:
- type: command
command: "echo 'Any tool'"
Hooks can access environment variables:
hooks:
PreToolUse:
- matcher: "*"
hooks:
- type: command
command: "echo 'Tool: $TOOL_NAME, Input: $TOOL_INPUT'"
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"
# Add validation logic here
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: script
command: "scripts/security_check.sh"
hooks:
PostToolUse:
- matcher: "*"
hooks:
- type: command
command: "echo '$(date): Tool $TOOL_NAME used' >> audit.log"
hooks:
Stop:
- matcher: "*"
hooks:
- type: script
command: "scripts/cleanup.sh"
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"
Test each hook type:
once: true prevents repeat executionProblem: Hook command doesn't execute
Solutions:
Problem: Hook with once: true keeps running
Solution: The once flag applies per session. Restart the session to test.
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'"
This skill demonstrates:
Try the tests above to see hooks in action!
Version: 1.0.0 Last Updated: 2026-01-10 Maintainer: SDK Team