plugins/core/skills/create-hook/SKILL.md
This skill should be used when building PreToolUse, PostToolUse, SessionStart, or other hook types for Claude Code plugins. It provides patterns, security best practices, and configuration guidance.
npx skillsauth add rbozydar/rbw-claude-code create-hookInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Create Claude Code hooks that intercept events in the lifecycle and can validate, modify, or block operations.
| Event | Trigger | Common Uses |
|-------|---------|-------------|
| PreToolUse | Before any tool executes | Block dangerous commands, validate inputs |
| PostToolUse | After tool completes | Format code, run linters, log results |
| SessionStart | When session begins | Check environment, load config |
| SessionEnd | When session ends | Cleanup, save state |
| Stop | When agent stops | Verify task completion |
| SubagentStop | When subagent stops | Validate subagent work |
| UserPromptSubmit | When user sends message | Process user input |
| PreCompact | Before context compression | Preserve critical info |
| Notification | System notifications | React to events |
| PermissionRequest | Permission dialogs (v2.1.0) | Custom permission handling |
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/check-bash.py",
"timeout": 10
}
]
}
]
}
}
Matchers: "Bash", "Edit", "Read" (case-sensitive tool names), or "*" for all.
| Variable | Description |
|----------|-------------|
| CLAUDE_PLUGIN_ROOT | Plugin directory (always use for portable paths) |
| CLAUDE_PROJECT_DIR | Current project root |
| CLAUDE_ENV_FILE | Persist variables from SessionStart |
Copy and customize a template from templates/:
| Template | Purpose |
|----------|---------|
| templates/pretooluse-bash.py | PreToolUse hook for Bash commands |
| templates/pretooluse-read.py | PreToolUse hook for file reads |
| templates/posttooluse-edit.py | PostToolUse hook for formatting |
| templates/sessionstart.sh | SessionStart initialization |
cp ${CLAUDE_PLUGIN_ROOT}/skills/create-hook/templates/pretooluse-bash.py \
plugins/my-hook/hooks/my-hook.py
chmod +x plugins/my-hook/hooks/my-hook.py
Always check safe patterns before blocking (allowlist-first):
SAFE_PATTERNS = [r"rm\s+-rf\s+/tmp/"]
BLOCKED_PATTERNS = [(r"rm\s+-rf\s+", "rm -rf is destructive")]
for pattern in SAFE_PATTERNS:
if re.search(pattern, command):
c.output.exit_success()
for pattern, reason in BLOCKED_PATTERNS:
if re.search(pattern, command):
c.output.exit_block(reason)
Exit methods:
c.output.exit_success() -- allow operationc.output.exit_block("reason") -- block with messagec.output.exit_modify({"command": modified}) -- modify input (PreToolUse only)Early exit when hook doesn't apply:
if c.tool_name != "Bash":
c.output.exit_success()
Create directory structure:
mkdir -p plugins/my-hook/.claude-plugin plugins/my-hook/hooks
Create plugins/my-hook/.claude-plugin/plugin.json:
{"name": "my-hook", "version": "1.0.0", "description": "What this hook does"}
Create plugins/my-hook/hooks/hooks.json with event matchers (see Configuration above)
Copy and customize a template from this skill's templates/ directory
Validate: claude plugin validate .
Test hooks directly by piping JSON input:
echo '{"tool_name": "Bash", "tool_input": {"command": "rm -rf /"}}' | \
python plugins/my-hook/hooks/my-hook.py
Validate hooks.json: cat plugins/my-hook/hooks/hooks.json | jq .
Existing hooks in this repository:
plugins/guards/security/safety-guard/plugins/guards/policy/conventional-commits/plugins/guards/quality/python-format/plugins/guards/security/protect-env/development
This skill should be loaded when writing, reviewing, or refactoring Python code to apply strict coding standards directly in the current context without spawning a subagent. It provides comprehensive Python development standards covering SOLID principles, asyncio patterns, type hints, testing, and production-quality code.
tools
This skill should be used when invoking the Gemini CLI for code review, plan review, or any prompt-based task. It provides correct invocation patterns emphasizing stdin piping and @ syntax over shell variable gymnastics.
development
Use this skill when writing, reviewing, or debugging Quickshell configurations (QML files for desktop shell UI on Wayland/Hyprland). Triggers on: QML files with Quickshell imports, shell.qml entry points, PanelWindow or FloatingWindow usage, Quickshell service integration (PipeWire, MPRIS, notifications, Hyprland IPC), Wayland layer-shell or session-lock code, custom bar/panel/widget/dock/OSD/lockscreen/launcher development, or any question about building a desktop shell with Quickshell on Hyprland.
development
This skill should be used when thorough, multi-perspective research with citations is needed. It performs comprehensive research using a diffusion research loop with domain specialization, supporting general web research and specialized domains (geopolitical with GDELT). Auto-detects domain from query or accepts an explicit --domain flag.