一键导入
agents-hooks
Event-driven hooks for AI coding agents. Use when automating Claude Code or Codex CLI with stdin JSON and decision-control responses.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Event-driven hooks for AI coding agents. Use when automating Claude Code or Codex CLI with stdin JSON and decision-control responses.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Builds multi-repo context hubs and compiled markdown knowledge maps. Use when profiling repo portfolios or assembling LLM-ready cross-repo knowledge bases.
Builds per-repo code graphs in JSON and markdown-ready derived artifacts. Use when you need blast radius, symbol-level maps, import graphs, inheritance, or test links.
Context-driven AI development with AGENTS.md, repo knowledge bases, Claude Code, Codex, and Copilot. Use when adopting repo-native AI workflows or multi-repo setups.
Technical writing for READMEs, ADRs, API docs, and changelogs. Use when revising or consolidating a repo documentation folder.
Design, implement, and troubleshoot NUKE-based CI/CD pipelines for .NET services with fast local-to-CI feedback loops. Use when creating or refactoring `nuke/Build.cs` target graphs, tuning `DependsOn`/`After`/`Triggers`/`OnlyWhenDynamic` behavior, orchestrating unit/API/DB test categories, merging and publishing coverage and test reports, building and pushing Docker images with traceable tags and digests, producing artifact contracts such as `deploy.env`, and diagnosing flaky or slow pipeline execution. For service code changes use $software-csharp-backend, for NUnit fixture design use $qa-testing-nunit, and for safe logging rewrites use $dev-structured-logs.
Systematic debugging for crashes, regressions, flakes, and production bugs. Use when diagnosing stack traces, logs, traces, or profiling data.
| name | agents-hooks |
| description | Event-driven hooks for AI coding agents. Use when automating Claude Code or Codex CLI with stdin JSON and decision-control responses. |
This skill provides the definitive reference for creating Claude Code hooks. Use this when building automation that triggers on Claude Code events.
| Event | Trigger | Use Case |
|---|---|---|
SessionStart | Session begins/resumes | Initialize environment |
UserPromptSubmit | User submits prompt | Preprocess/validate input |
PreToolUse | Before tool execution | Validate, block dangerous commands |
PermissionRequest | Permission dialog shown | Auto-allow/deny permissions |
PostToolUse | After tool succeeds | Format, audit, notify |
PostToolUseFailure | After tool fails | Capture failures, add guidance |
SubagentStart | Subagent spawns | Inspect subagent metadata |
Stop | When Claude finishes | Run tests, summarize |
SubagentStop | Subagent finishes | Verify subagent completion |
Notification | On notifications | Alert integrations |
PreCompact | Before context compaction | Preserve critical context |
Setup | --init/--maintenance | Initialize repo/env |
SessionEnd | Session ends | Cleanup, save state |
.claude/hooks/
├── pre-tool-validate.sh
├── post-tool-format.sh
├── post-tool-audit.sh
├── stop-run-tests.sh
└── session-start-init.sh
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/post-tool-format.sh"
}
]
}
],
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/pre-tool-validate.sh"
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/stop-run-tests.sh"
}
]
}
]
}
}
{
"hook_event_name": "PreToolUse",
"tool_name": "Bash",
"tool_input": {
"command": "ls -la"
}
}
| Variable | Description |
|---|---|
CLAUDE_PROJECT_DIR | Absolute project root where Claude Code started |
CLAUDE_PLUGIN_ROOT | Plugin root (plugin hooks only) |
CLAUDE_CODE_REMOTE | "true" in remote/web environments; empty/local otherwise |
CLAUDE_ENV_FILE | File path to persist export ... lines (available in SessionStart; check docs for Setup support) |
| Code | Meaning | Notes |
|---|---|---|
0 | Success | JSON written to stdout is parsed for structured control |
2 | Blocking error | stderr becomes the message; JSON in stdout is ignored |
| Other | Non-blocking error | Execution continues; stderr is visible in verbose mode |
Stdout injection note: for UserPromptSubmit, SessionStart, and Setup, non-JSON stdout (exit 0) is injected into Claude’s context; most other events show stdout only in verbose mode.
PreToolUse hooks can allow/deny/ask and optionally modify the tool input via updatedInput.
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"permissionDecisionReason": "Reason shown to user (and to Claude on deny)",
"updatedInput": { "command": "echo 'modified'" },
"additionalContext": "Extra context added before tool runs"
}
}
Note: older decision/reason fields are deprecated; prefer the hookSpecificOutput.* fields.
See hook-templates.md for full examples: redirect sensitive file edits to /dev/null and strip .env files from git add commands.
For complex decisions, use LLM-evaluated hooks (type: "prompt") instead of bash scripts. They are most useful for Stop and SubagentStop decisions.
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "prompt",
"prompt": "Evaluate whether Claude should stop. Context JSON: $ARGUMENTS. Return {\"ok\": true} if all tasks are complete, otherwise {\"ok\": false, \"reason\": \"what remains\"}.",
"timeout": 30
}
]
}
]
}
}
{"ok": true}{"ok": false, "reason": "Explanation shown to Claude"}Use command hooks for fast, deterministic checks. Use prompt hooks for nuanced decisions:
{
"Stop": [
{
"hooks": [
{ "type": "command", "command": ".claude/hooks/quick-check.sh" },
{ "type": "prompt", "prompt": "Verify code quality meets standards" }
]
}
]
}
Use this when frequent approval dialogs slow down repeated safe workflows.
rm, git reset --hard, generic interpreters with arbitrary input) out of auto-approval rules.npm run test:e2e), not unrestricted executors.This reduces repeated permission interruptions while preserving high-safety boundaries.
Add a lightweight runtime preflight hook when workflows depend on specific local tool versions (for example Node for JS REPL, test runners, linters).
SessionStart for general runtime checks.Setup for repository bootstrap checks.Copy-paste templates for the five most common hook scenarios: PreToolUse validation, PostToolUse formatting, PostToolUse security audit, Stop test runner, and SessionStart environment check.
See references/hook-templates.md for all scripts.
Matchers filter which tool triggers the hook:
Write matches only the Write toolEdit|Write or Notebook.** (also works with "" or omitted matcher)Hooks run with full user permissions outside the Bash tool sandbox. Key rules: validate all stdin input, quote every variable ("$VAR"), use absolute paths, never eval untrusted data, and set -euo pipefail.
See references/hook-security.md for the full checklist, command injection prevention, path traversal defense, credential protection, and ShellCheck requirements.
{
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{ "type": "command", "command": ".claude/hooks/format.sh" },
{ "type": "command", "command": ".claude/hooks/audit.sh" },
{ "type": "command", "command": ".claude/hooks/notify.sh" }
]
}
]
}
All matching hooks run in parallel. If you need strict ordering (format → lint → test), make one wrapper script that runs them sequentially.
# Test a PostToolUse hook manually (stdin JSON)
export CLAUDE_PROJECT_DIR="$(pwd)"
echo '{"hook_event_name":"PostToolUse","tool_name":"Edit","tool_input":{"file_path":"'"$(pwd)"'/src/app.ts"}}' \
| bash .claude/hooks/post-tool-format.sh
# Check exit code
echo $?