plugins/plugin-dev/skills/hook-development/SKILL.md
当用户要求 "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", 或提到 hook 事件 (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification) 时应使用此技能. 提供创建和实现 Claude Code 插件 hooks 的全面指导, 重点关注高级基于 prompt 的 hooks API.
npx skillsauth add phpmac/skills hook-developmentInstall 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.
Hooks 是响应 Claude Code 事件执行的事件驱动自动化脚本. 使用 hooks 来验证操作, 执行策略, 添加上下文, 并将外部工具集成到工作流中.
核心能力:
使用 LLM 驱动的决策进行上下文感知验证:
{
"type": "prompt",
"prompt": "评估此工具使用是否适当: $TOOL_INPUT",
"timeout": 30
}
支持的事件: Stop, SubagentStop, UserPromptSubmit, PreToolUse
优点:
执行 bash 命令进行确定性检查:
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh",
"timeout": 60
}
用于:
对于插件 hooks 在 hooks/hooks.json 中, 使用包装格式:
{
"description": "hooks 的简要说明 (可选)",
"hooks": {
"PreToolUse": [...],
"Stop": [...],
"SessionStart": [...]
}
}
关键点:
description 字段是可选的hooks 字段是包含实际 hook 事件的必需包装器示例:
{
"description": "代码质量验证 hooks",
"hooks": {
"PreToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/validate.sh"
}
]
}
]
}
}
对于用户设置 在 .claude/settings.json 中, 使用直接格式:
{
"PreToolUse": [...],
"Stop": [...],
"SessionStart": [...]
}
关键点:
重要: 下面的示例展示了适用于任一格式的 hook 事件结构. 对于插件 hooks.json, 将这些包装在 {"hooks": {...}} 中.
在任何工具运行前执行. 用于批准, 拒绝或修改工具调用.
示例 (基于 prompt):
{
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "prompt",
"prompt": "验证文件写入安全性. 检查: 系统路径, 凭证, 路径遍历, 敏感内容. 返回 'approve' 或 'deny'."
}
]
}
]
}
PreToolUse 输出:
{
"hookSpecificOutput": {
"permissionDecision": "allow|deny|ask",
"updatedInput": {"field": "modified_value"}
},
"systemMessage": "给 Claude 的解释"
}
在工具完成后执行. 用于响应结果, 提供反馈或记录.
示例:
{
"PostToolUse": [
{
"matcher": "Edit",
"hooks": [
{
"type": "prompt",
"prompt": "分析编辑结果的潜在问题: 语法错误, 安全漏洞, 破坏性更改. 提供反馈."
}
]
}
]
}
输出行为:
当主 agent 考虑停止时执行. 用于验证完整性.
示例:
{
"Stop": [
{
"matcher": "*",
"hooks": [
{
"type": "prompt",
"prompt": "验证任务完成: 测试已运行, 构建成功, 问题已回答. 返回 'approve' 停止或 'block' 并说明原因继续."
}
]
}
]
}
决策输出:
{
"decision": "approve|block",
"reason": "说明",
"systemMessage": "额外上下文"
}
当子 agent 考虑停止时执行. 用于确保子 agent 完成了其任务.
类似于 Stop hook, 但用于子 agents.
当用户提交提示时执行. 用于添加上下文, 验证或阻止提示.
示例:
{
"UserPromptSubmit": [
{
"matcher": "*",
"hooks": [
{
"type": "prompt",
"prompt": "检查提示是否需要安全指导. 如果讨论认证, 权限或 API 安全, 返回相关警告."
}
]
}
]
}
当 Claude Code 会话开始时执行. 用于加载上下文和设置环境.
示例:
{
"SessionStart": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/load-context.sh"
}
]
}
]
}
特殊能力: 使用 $CLAUDE_ENV_FILE 持久化环境变量:
echo "export PROJECT_TYPE=nodejs" >> "$CLAUDE_ENV_FILE"
参见 examples/load-context.sh 获取完整示例.
当会话结束时执行. 用于清理, 记录和状态保存.
在上下文压缩前执行. 用于添加要保留的关键信息.
当 Claude 发送通知时执行. 用于响应用户通知.
{
"continue": true,
"suppressOutput": false,
"systemMessage": "给 Claude 的消息"
}
continue: 如果为 false, 停止处理 (默认 true)suppressOutput: 从记录中隐藏输出 (默认 false)systemMessage: 显示给 Claude 的消息0 - 成功 (stdout 显示在记录中)2 - 阻塞错误 (stderr 反馈给 Claude)所有 hooks 通过 stdin 接收 JSON, 包含通用字段:
{
"session_id": "abc123",
"transcript_path": "/path/to/transcript.txt",
"cwd": "/current/working/dir",
"permission_mode": "ask|allow",
"hook_event_name": "PreToolUse"
}
事件特定字段:
tool_name, tool_input, tool_resultuser_promptreason使用 $TOOL_INPUT, $TOOL_RESULT, $USER_PROMPT 等在 prompts 中访问字段.
在所有命令 hooks 中可用:
$CLAUDE_PROJECT_DIR - 项目根路径$CLAUDE_PLUGIN_ROOT - 插件目录 (用于可移植路径)$CLAUDE_ENV_FILE - 仅 SessionStart: 在此持久化环境变量$CLAUDE_CODE_REMOTE - 如果在远程上下文中运行则设置始终在 hook 命令中使用 ${CLAUDE_PLUGIN_ROOT} 以实现可移植性:
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh"
}
在插件中, 在 hooks/hooks.json 中定义 hooks:
{
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "prompt",
"prompt": "验证文件写入安全性"
}
]
}
],
"Stop": [
{
"matcher": "*",
"hooks": [
{
"type": "prompt",
"prompt": "验证任务完成"
}
]
}
],
"SessionStart": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/load-context.sh",
"timeout": 10
}
]
}
]
}
插件 hooks 与用户的 hooks 合并并并行运行.
精确匹配:
"matcher": "Write"
多个工具:
"matcher": "Read|Write|Edit"
通配符 (所有工具):
"matcher": "*"
正则模式:
"matcher": "mcp__.*__delete.*" // 所有 MCP 删除工具
注意: 匹配器区分大小写.
// 所有 MCP 工具
"matcher": "mcp__.*"
// 特定插件的 MCP 工具
"matcher": "mcp__plugin_asana_.*"
// 所有文件操作
"matcher": "Read|Write|Edit"
// 仅 Bash 命令
"matcher": "Bash"
始终在命令 hooks 中验证输入:
#!/bin/bash
set -euo pipefail
input=$(cat)
tool_name=$(echo "$input" | jq -r '.tool_name')
# 验证工具名称格式
if [[ ! "$tool_name" =~ ^[a-zA-Z0-9_]+$ ]]; then
echo '{"decision": "deny", "reason": "无效的工具名称"}' >&2
exit 2
fi
检查路径遍历和敏感文件:
file_path=$(echo "$input" | jq -r '.tool_input.file_path')
# 拒绝路径遍历
if [[ "$file_path" == *".."* ]]; then
echo '{"decision": "deny", "reason": "检测到路径遍历"}' >&2
exit 2
fi
# 拒绝敏感文件
if [[ "$file_path" == *".env"* ]]; then
echo '{"decision": "deny", "reason": "敏感文件"}' >&2
exit 2
fi
参见 examples/validate-write.sh 和 examples/validate-bash.sh 获取完整示例.
# 好: 已引用
echo "$file_path"
cd "$CLAUDE_PROJECT_DIR"
# 坏: 未引用 (注入风险)
echo $file_path
cd $CLAUDE_PROJECT_DIR
{
"type": "command",
"command": "bash script.sh",
"timeout": 10
}
默认值: 命令 hooks (60秒), Prompt hooks (30秒)
所有匹配的 hooks 并行运行:
{
"PreToolUse": [
{
"matcher": "Write",
"hooks": [
{"type": "command", "command": "check1.sh"}, // 并行
{"type": "command", "command": "check2.sh"}, // 并行
{"type": "prompt", "prompt": "验证..."} // 并行
]
}
]
}
设计影响:
通过检查标志文件或配置来创建条件激活的 hooks:
模式: 标志文件激活
#!/bin/bash
# 仅当标志文件存在时激活
FLAG_FILE="$CLAUDE_PROJECT_DIR/.enable-strict-validation"
if [ ! -f "$FLAG_FILE" ]; then
# 标志不存在, 跳过验证
exit 0
fi
# 标志存在, 运行验证
input=$(cat)
# ... 验证逻辑 ...
模式: 基于配置的激活
#!/bin/bash
# 检查配置是否激活
CONFIG_FILE="$CLAUDE_PROJECT_DIR/.claude/plugin-config.json"
if [ -f "$CONFIG_FILE" ]; then
enabled=$(jq -r '.strictMode // false' "$CONFIG_FILE")
if [ "$enabled" != "true" ]; then
exit 0 # 未启用, 跳过
fi
fi
# 已启用, 运行 hook 逻辑
input=$(cat)
# ... hook 逻辑 ...
用例:
最佳实践: 在插件 README 中记录激活机制, 以便用户知道如何启用/禁用临时 hooks.
重要: Hooks 在 Claude Code 会话启动时加载. 更改 hook 配置需要重启 Claude Code.
无法热交换 hooks:
hooks/hooks.json 不会影响当前会话claude测试 hook 更改:
claude 或 ccclaude --debug 测试 hooksHooks 在 Claude Code 启动时验证:
使用 /hooks 命令查看当前会话中加载的 hooks.
claude --debug
查看 hook 注册, 执行日志, 输入/输出 JSON 和计时信息.
直接测试命令 hooks:
echo '{"tool_name": "Write", "tool_input": {"file_path": "/test"}}' | \
bash ${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh
echo "退出码: $?"
确保 hooks 输出有效的 JSON:
output=$(./your-hook.sh < test-input.json)
echo "$output" | jq .
| 事件 | 时机 | 用途 | |------|------|------| | PreToolUse | 工具前 | 验证, 修改 | | PostToolUse | 工具后 | 反馈, 记录 | | UserPromptSubmit | 用户输入 | 上下文, 验证 | | Stop | Agent 停止 | 完整性检查 | | SubagentStop | 子 agent 完成 | 任务验证 | | SessionStart | 会话开始 | 上下文加载 | | SessionEnd | 会话结束 | 清理, 记录 | | PreCompact | 压缩前 | 保留上下文 | | Notification | 用户通知 | 记录, 响应 |
应该:
不应该:
有关详细模式和高级技术, 请参阅:
references/patterns.md - 常见 hook 模式 (8+ 成熟模式)references/migration.md - 从基础到高级 hooks 的迁移references/advanced.md - 高级用例和技术examples/ 中的工作示例:
validate-write.sh - 文件写入验证示例validate-bash.sh - Bash 命令验证示例load-context.sh - SessionStart 上下文加载示例scripts/ 中的开发工具:
validate-hook-schema.sh - 验证 hooks.json 结构和语法test-hook.sh - 在部署前用示例输入测试 hookshook-linter.sh - 检查 hook 脚本的常见问题和最佳实践claude --debug 获取详细日志jq 验证 hook JSON 输出在插件中实现 hooks:
hooks/hooks.json 中编写 hook 配置scripts/validate-hook-schema.sh hooks/hooks.json 验证配置scripts/test-hook.sh 测试 hooksclaude --debug 在 Claude Code 中测试大多数用例专注于基于 prompt 的 hooks. 为性能关键或确定性检查保留命令 hooks.
data-ai
当用户提到 Linux 提权/本地提权/local privilege escalation/获取root权限/内核漏洞利用/LPE/SUID/sudo滥用/容器逃逸/权限提升检测; 或要求在Linux系统上从普通用户提升到root权限; 或查询CVE提权漏洞(如Dirty Pipe/CopyFail/Dirty Frag/PwnKit/Looney Tunables); 或需要安全加固建议时应使用此技能
tools
当用户要求 "计算仓位", "仓位管理", "止损比例", "凯利公式", "盈亏比", "资金管理", "半凯利", "反马丁格尔", "固定风险", "position sizing", "策略评估", "策略体检", "SQN", "夏普比率", "卡玛比率", "期望值", "获利因子", "MAE", "MFE", "R乘数", "索提诺", "蒙特卡洛", "样本外测试", "策略回测" 或需要计算合约交易的最优仓位/止损/资金分配/策略质量评估时应使用此技能. 覆盖仓位管理/策略评估/交易解剖/压力测试的完整框架. 即使用户只是提到 "这笔交易该下多少", "策略好不好", "复盘怎么算" 等模糊描述也应触发.
development
当用户要求 "提取API", "逆向APK", "分析APP接口", "提取业务端点", "React Native逆向", "Flutter逆向" 或需要从移动应用提取后端API信息时使用此技能. 覆盖APK解包/JS bundle分析/kernel_blob.bin分析/H5页面参数发现/Spring Boot API验证全流程. 支持React Native和Flutter两种框架.
research
当用户要求 "推荐VPS", "选服务器", "对比服务商", "建站VPS", "便宜VPS", "VPS推荐" 或需要研究/筛选/对比VPS服务商时应使用此技能. 从 hostloc/lowendtalk/lowendbox/测评站搜集真实评测数据, 交叉验证后给出可溯源排名.