hook-creator
Create and configure Claude Code hooks for customizing agent behavior. Use when the user wants to (1) create a new hook, (2) configure automatic formatting, logging, or notifications, (3) add file protection or custom permissions, (4) set up pre/post tool execution actions, (5) configure session initialization or cleanup (SessionStart/SessionEnd), (6) auto- approve or deny permission requests (PermissionRequest), or (7) asks about any of the 10 hook events.
What this skill does
# Hook Creator
Create Claude Code hooks that execute shell commands at specific lifecycle events.
## Hook Creation Workflow
1. **Identify the use case** - Determine what the hook should accomplish
2. **Select the appropriate event** - Choose from available hook events
(see references/hook-events.md)
3. **Design the hook command** - Write shell command that processes JSON
input from stdin
4. **Configure the matcher** - Set tool/event filter (use `*` for all,
or specific tool names like `Bash`, `Edit|Write`)
5. **Choose storage location** - User settings (`~/.claude/settings.json`)
or project (`.claude/settings.json`)
6. **Test the hook** - Verify behavior with a simple test case
## Hook Configuration Structure
```json
{
"hooks": {
"<EventName>": [
{
"matcher": "<ToolPattern>",
"hooks": [
{
"type": "command",
"command": "<shell-command>",
"once": true
}
]
}
]
}
}
```
### Hook Types
- `type: "command"` - Execute shell command (default)
- `type: "prompt"` - LLM-based evaluation. Supported for: Stop,
SubagentStop, UserPromptSubmit, PreToolUse, PermissionRequest
### Hook Options
- `once` - Run only once per session (optional, default: false)
## Common Patterns
### Reading Input Data
Hooks receive JSON via stdin. Use `jq` to extract fields:
```bash
# Extract tool input field
jq -r '.tool_input.file_path'
# Extract with fallback
jq -r '.tool_input.description // "No description"'
# Conditional processing
jq -r 'if .tool_input.file_path
then .tool_input.file_path else empty end'
```
### Exit Codes for PreToolUse
- `0` - Allow the tool to proceed
- `2` - Block the tool and provide feedback to Claude
### Matcher Patterns
- `*` - Match all tools
- `Bash` - Match only Bash tool
- `Edit|Write` - Match Edit or Write tools
- `Read` - Match Read tool
## Quick Examples
**Log all bash commands:**
```bash
jq -r '"\(.tool_input.command)"' >> ~/.claude/bash-log.txt
```
**Auto-format TypeScript after edit:**
```bash
jq -r '.tool_input.file_path' | {
read f
[[ "$f" == *.ts ]] && npx prettier --write "$f"
}
```
**Block edits to .env files:**
```bash
python3 -c "
import json, sys
p = json.load(sys.stdin).get('tool_input', {}).get('file_path', '')
sys.exit(2 if '.env' in p else 0)
"
```
## Prompt-Based Hooks
Use `type: "prompt"` for LLM-based evaluation. The prompt receives
context and returns a decision.
**Example - Stop hook with evaluation:**
<!-- markdownlint-disable MD013 -->
```json
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "prompt",
"prompt": "Review if all user requirements are met. Context: {{context}}. Respond with JSON: {\"decision\": \"approve\" or \"block\", \"reason\": \"explanation\"}"
}
]
}
]
}
}
```
<!-- markdownlint-enable MD013 -->
Supported events: `Stop`, `SubagentStop`, `UserPromptSubmit`, `PreToolUse`,
`PermissionRequest`
## Hooks in Skills/Agents/Commands
Define hooks directly in frontmatter for scoped lifecycle hooks:
```yaml
---
name: secure-operations
description: Perform operations with security checks
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: "./scripts/security-check.sh"
once: true
---
```
Supported events in frontmatter: `PreToolUse`, `PostToolUse`, `Stop`
Hooks defined in Skills/Agents/Commands are scoped to that execution context
and automatically cleaned up when finished.
## Resources
- **Hook Events Reference**: See [references/hook-events.md](references/hook-events.md)
for detailed event documentation with input/output schemas
## Triggers
This skill activates when users want to:
- Create a new hook for Claude Code
- Configure automatic formatting, linting, or code quality tools
- Set up logging or notification systems for tool usage
- Add file protection or access control rules
- Configure pre/post tool execution actions
- Set up session initialization or cleanup (SessionStart/SessionEnd)
- Auto-approve or deny permission requests (PermissionRequest)
- Understand hook events, input schemas, or exit codes
## Anti-Patterns
Avoid these common mistakes when creating hooks:
- **Blocking without feedback**: Using exit code 2 in PreToolUse without
providing stdout message leaves Claude confused about why the tool was
blocked
- **Ignoring stdin**: Not reading JSON from stdin causes hooks to fail
silently or behave unexpectedly
- **Heavy synchronous operations**: Running slow commands in PreToolUse
blocks the entire workflow; prefer async logging or use PostToolUse
- **Hardcoded paths**: Using absolute paths like `/home/user/...` instead
of `$HOME` or relative paths breaks portability
- **Missing error handling**: Not handling `jq` parse failures or missing
fields causes cryptic errors
- **Over-matching**: Using `*` matcher when only specific tools need the
hook wastes resources and may cause side effects
## Extension Points
1. **Custom event handlers**: Add new hook configurations in settings.json
for any of the 10 hook events
2. **External integrations**: Extend hooks to call external services
(Slack, Discord, webhooks) via curl or custom scripts
3. **Project-specific overrides**: Layer project `.claude/settings.json`
hooks over user `~/.claude/settings.json` defaults
4. **Script libraries**: Create reusable shell scripts in project that
hooks can call for complex logic
## Design Rationale
**Why JSON via stdin?** Passing structured data through stdin allows hooks
to access any tool input field without parsing command-line arguments.
This is more flexible and handles special characters safely.
**Why exit codes for control flow?** Exit codes are the Unix-standard way
to signal success/failure. Using 0/2 for PreToolUse allows simple shell
commands to control tool execution without complex IPC.
**Why separate PreToolUse and PostToolUse?** Pre-hooks can block operations
(validation, access control) while post-hooks handle side effects
(formatting, logging). Mixing these concerns would complicate hook logic.
**Why 10 distinct events?** Each event represents a unique lifecycle moment
with different input schemas and use cases. Fine-grained events allow
precise hook targeting without over-triggering.
Related in AI Agents
skill-development
IncludedComprehensive meta-skill for creating, managing, validating, auditing, and distributing Claude Code skills and slash commands (unified in v2.1.3+). Provides skill templates, creation workflows, validation patterns, audit checklists, naming conventions, YAML frontmatter guidance, progressive disclosure examples, and best practices lookup. Use when creating new skills, validating existing skills, auditing skill quality, understanding skill architecture, needing skill templates, learning about YAML frontmatter requirements, progressive disclosure patterns, tool restrictions (allowed-tools), skill composition, skill naming conventions, troubleshooting skill activation issues, creating custom slash commands, configuring command frontmatter, using command arguments ($ARGUMENTS, $1, $2), bash execution in commands, file references in commands, command namespacing, plugin commands, MCP slash commands, Skill tool configuration, or deciding between skills vs slash commands. Delegates to docs-management skill for official documentation.
reprompter
IncludedTransform messy prompts into well-structured, effective prompts — single or multi-agent. Use when: "reprompt", "reprompt this", "clean up this prompt", "structure my prompt", rough text needing XML tags and best practices, "reprompter teams", "repromptception", "run with quality", "smart run", "smart agents", multi-agent tasks, audits, parallel work, anything going to agent teams. Don't use when: simple Q&A, pure chat, immediate execution-only tasks. See "Don't Use When" section for details. Outputs: Structured XML/Markdown prompt, quality score (before/after), optional team brief + per-agent sub-prompts, agent team output files. Success criteria: Single mode quality score ≥ 7/10; Repromptception per-agent prompt quality score 8+/10; all required sections present, actionable and specific.
adaptive-compaction
IncludedAdaptive add-on policy and recovery layer that decides WHEN to compact, prune, snapshot, or fork -- replacing fixed-percent auto-compaction across Claude Code, Codex, and MCP-capable hosts. Trigger on auto-compact timing or damage: "when should I compact", "is it safe to compact now or start a fresh session", "auto-compact fires too early/mid-task", "switching to an unrelated task but the window still has space", "context rot", "answers get worse the longer the session runs", "the agent forgot the plan or my decisions after it summarized", "add a layer on top that manages context without changing the agent", raising autoCompactWindow to give the policy room, or installing/tuning a cross-tool compaction policy or PreCompact hook -- even when "compaction" is never said but the problem is context-window pressure or post-summarization memory loss. Do NOT use to summarize a conversation, build RAG, write a summarization prompt (decides WHEN not HOW), or answer max-context-length trivia.
agent-skill-creator
IncludedCreate cross-platform agent skills from workflow descriptions. Activates when users ask to create an agent, automate a repetitive workflow, create a custom skill, or need advanced agent creation. Triggers on phrases like create agent for, automate workflow, create skill for, every day I have to, daily I need to, turn process into agent, need to automate, create a cross-platform skill, validate this skill, export this skill, migrate this skill. Supports single skills, multi-agent suites, transcript processing, template-based creation, interactive configuration, cross-platform export, and spec validation.
llm-wiki
IncludedUse when building or maintaining a persistent personal knowledge base (second brain) in Obsidian where an LLM incrementally ingests sources, updates entity/concept pages, maintains cross-references, and keeps a synthesis current. Triggers include "second brain", "Obsidian wiki", "personal knowledge management", "ingest this paper/article/book", "build a research wiki", "compound knowledge", "Memex", or whenever the user wants knowledge to accumulate across sessions instead of being re-derived by RAG on every query.
skill-master
IncludedAgent Skills authoring, evaluation, and optimization. Create, edit, validate, benchmark, and improve skills following the agentskills.io specification. Use when designing SKILL.md files, structuring skill folders (references, scripts, assets), ingesting external documentation into skills, running trigger evals, benchmarking skill quality, optimizing descriptions, or performing blind A/B comparisons. Keywords: agentskills.io, SKILL.md, skill authoring, eval, benchmark, trigger optimization.