$workflow.input.user_intent/skills/hook-skill/SKILL.md
Claude Code Hook 开发专家。当需要创建、调试、配置 Hook 时触发。触发词:创建 hook、写 hook、hook 配置、stop hook、pre tool use、post tool use、session start。
npx skillsauth add maxoreric/sop-engine hook-skillInstall 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.
创建和配置 Claude Code Hooks,用于在特定事件时执行自定义逻辑。
Hook 是在 Claude Code 执行过程中特定时机自动触发的脚本或命令。可以用于:
| 事件 | 触发时机 | 常见用途 | |-----|---------|---------| | PreToolUse | 工具执行前 | 验证、拦截、修改输入 | | PostToolUse | 工具执行后 | 验证结果、触发后续 | | PermissionRequest | 权限对话框显示时 | 自动批准/拒绝 | | UserPromptSubmit | 用户提交 prompt 时 | 添加上下文、验证 | | Stop | Claude 完成响应时 | 实现循环、强制继续 | | SubagentStop | Subagent 完成时 | 链式触发、验证完成 | | PreCompact | 压缩操作前 | 保存状态 | | SessionStart | 会话开始时 | 加载上下文、初始化 | | SessionEnd | 会话结束时 | 清理、保存状态 | | Notification | 通知时 | 自定义通知 |
| Exit Code | 含义 | 效果 | |-----------|------|------| | 0 | 成功 | 继续执行,stdout 可返回 JSON | | 2 | 阻止 | 阻止操作,stderr 反馈给 Claude | | 其他 | 非阻止错误 | 显示警告,继续执行 |
{
"hooks": {
"EventName": [
{
"matcher": "ToolPattern",
"hooks": [
{
"type": "command",
"command": "your-command-here",
"timeout": 60
}
]
}
]
}
}
WriteEdit|Write、Notebook.** 或省略command(bash 命令)或 prompt(LLM 评估)$CLAUDE_PROJECT_DIR:项目根目录$CLAUDE_PLUGIN_ROOT:插件根目录(插件 Hook 专用)$CLAUDE_ENV_FILE:环境变量文件(仅 SessionStart){
"session_id": "abc123",
"transcript_path": "/path/to/transcript.jsonl",
"cwd": "/current/directory",
"permission_mode": "default",
"hook_event_name": "PreToolUse"
}
{
"hook_event_name": "PreToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "/path/to/file.txt",
"content": "file content"
},
"tool_use_id": "toolu_01ABC123..."
}
{
"hook_event_name": "Stop",
"stop_hook_active": true // 是否已被 Stop hook 继续过
}
{
"hook_event_name": "UserPromptSubmit",
"prompt": "用户的 prompt 内容"
}
{
"hook_event_name": "SessionStart",
"source": "startup" // startup | resume | clear | compact
}
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow", // allow | deny | ask
"permissionDecisionReason": "原因",
"updatedInput": { } // 可选:修改输入
}
}
{
"decision": "block", // block = 阻止停止,继续执行
"reason": "告诉 Claude 为什么要继续"
}
{
"decision": "block", // 可选:阻止 prompt
"reason": "阻止原因",
"hookSpecificOutput": {
"hookEventName": "UserPromptSubmit",
"additionalContext": "添加的上下文"
}
}
{
"hookSpecificOutput": {
"hookEventName": "SessionStart",
"additionalContext": "启动时添加的上下文"
}
}
#!/bin/bash
# stop-loop.sh - 阻止停止,让 Claude 继续
HOOK_INPUT=$(cat)
STOP_ACTIVE=$(echo "$HOOK_INPUT" | jq -r '.stop_hook_active // false')
# 检查状态文件
if [ -f ".loop-status.json" ]; then
CURRENT=$(jq -r '.current // 0' .loop-status.json)
MAX=$(jq -r '.max // 5' .loop-status.json)
if [ "$CURRENT" -lt "$MAX" ]; then
# 更新计数
jq ".current = $((CURRENT + 1))" .loop-status.json > .tmp && mv .tmp .loop-status.json
# 阻止停止
echo "继续执行 ($((CURRENT + 1))/$MAX)" >&2
exit 2
fi
fi
exit 0
#!/usr/bin/env python3
import json
import sys
input_data = json.load(sys.stdin)
tool_name = input_data.get("tool_name", "")
tool_input = input_data.get("tool_input", {})
if tool_name == "Read":
file_path = tool_input.get("file_path", "")
if file_path.endswith((".md", ".txt", ".json")):
output = {
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"permissionDecisionReason": "文档文件自动批准"
}
}
print(json.dumps(output))
sys.exit(0)
sys.exit(0)
#!/bin/bash
# session-start.sh
echo "当前时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "项目目录: $CLAUDE_PROJECT_DIR"
# 如果有 CLAUDE_ENV_FILE,设置环境变量
if [ -n "$CLAUDE_ENV_FILE" ]; then
echo "export PROJECT_START_TIME=$(date +%s)" >> "$CLAUDE_ENV_FILE"
fi
exit 0
#!/usr/bin/env python3
import json
import sys
import re
input_data = json.load(sys.stdin)
tool_name = input_data.get("tool_name", "")
tool_input = input_data.get("tool_input", {})
if tool_name != "Bash":
sys.exit(0)
command = tool_input.get("command", "")
# 危险命令检查
dangerous_patterns = [
(r"\brm\s+-rf\s+/", "禁止删除根目录"),
(r"\bsudo\b", "禁止使用 sudo"),
]
for pattern, message in dangerous_patterns:
if re.search(pattern, command):
print(message, file=sys.stderr)
sys.exit(2)
sys.exit(0)
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "prompt",
"prompt": "评估 Claude 是否应该停止。检查:1. 所有任务是否完成 2. 是否有错误需要处理。返回 JSON: {\"decision\": \"approve\" 或 \"block\", \"reason\": \"原因\"}",
"timeout": 30
}
]
}
]
}
}
# 查看 Hook 执行详情
claude --debug
# 检查 Hook 配置
# 在 Claude Code 中运行 /hooks
Hook 不触发
/hooks 查看注册状态命令找不到
chmod +x script.shJSON 解析失败
"$VAR"...env、.git/--debug 调试chmod +x官方文档:site:code.claude.com hooks
data-ai
# workflow-define-skill **用途**: 定义 Workflow(基于需求生成 Workflow YAML) **输入**: 需求、系统结构、Skills 列表 **输出**: Workflow YAML 定义 --- ## 核心原则 1. **基于需求驱动** - Workflow 服务于具体需求 2. **复用 Skills** - 优先使用已有的 Skills 3. **遵循规范** - 严格遵循 workflow-spec.md 4. **清晰命名** - Workflow 和节点名称自解释 5. **适度复杂** - 避免过度设计,保持简单 --- ## 输入格式 ```yaml input: requirement: # 需求描述 name: string # Workflow 名称 purpose: string # 用途 trigger: object # 触发
testing
Skill 版本管理的 Skill。当需要 A/B test、切换版本、回滚时触发。触发词:版本、version、A/B test、切换、回滚、promote。
development
# user-confirm-skill **用途**: 判别式确认 - 展示内容并获取用户反馈 **核心理念**: - 做选择题,不做填空题 - 人类擅长判别(喜不喜欢),不擅长生成(描述细节) - 展示具体方案,让用户说"对/不对" --- ## 输入参数 ```yaml input: content: object | string # 要确认的内容(方案、结果等) format: string # 展示格式(见下方) question: string # 确认问题 options: array # 可选:预定义的选项 ``` ### format 选项 | 格式 | 说明 | 适用场景 | |------|------|----------| | `visual_summary` | 可视化摘要(emoji + 结构化) | 展示设计方案 | | `file_list_with_summary` | 文件列表 + 功能说明 | 展示执行结果 | | `comp
data-ai
# system-create-skill **用途**: 创建一个完整的 System/Project **触发**: 当用户表达想要创建一个系统时(如:"创建一个健康管理系统") **核心理念**: - 人只说意图,AI 自己设计 - 做选择题,不做填空题 - 问最关键的一题(最大信息增益) --- ## Workflow 定义 这是一个完整的 Workflow,演示了: - 条件分支 - 循环迭代 - Workflow 嵌套 - 判别式交互 ```yaml workflow: name: system-create-skill description: 创建一个完整的 System/Project version: 1.0.0 input: user_intent: string # 用户的模糊意图 output: system_path: string # 创建的系统路径 summary: object # 系统摘要 # ===============================