工具钩子系统,支持在工具执行前后注入自定义逻辑。PreToolUse:执行前调用,可修改输入或阻止执行;PostToolUse:执行后调用,可修改输出或记录日志。触发词:添加钩子、hook、拦截工具、工具前后处理。依赖:Node.js 18+。
text
工具调用流程(带Hook):
User Message → [PreToolUse Hook] → Tool Executor → [PostToolUse Hook] → Response
↓ ↓
可以阻止执行 可以修改输出
类型时机用途PreToolUse工具执行前验证输入、日志记录、阻止执行PostToolUse工具执行后修改输出、错误处理、通知
javascript
const { HookRunner } = require('./scripts/hook-runner.mjs');
const runner = new HookRunner({
preToolUse: ['echo "Calling $HOOK_TOOL_NAME"'],
postToolUse: ['echo "Done: $HOOK_TOOL_NAME"']
});
// 执行前钩子
const preResult = runner.runPreToolUse('read_file', '{"path":"README.md"}');
console.log(preResult.allow); // true/false
console.log(preResult.messages); // 钩子输出
// 执行后钩子
const postResult = runner.runPostToolUse('read_file', '{"path":"README.md"}', 'file content...', false);
bash
# 标准输出 = 钩子消息(会被注入到结果)
# 退出码 = 结果
# 0 = 允许/成功
# 2 = 拒绝(仅PreToolUse)
# 其他 = 警告(不阻止执行)
钩子运行时自动注入:
变量说明HOOK_EVENT事件类型: PreToolUse 或 PostToolUse``HOOK_TOOL_NAME工具名称HOOK_TOOL_INPUT工具输入(原始JSON字符串)HOOK_TOOL_INPUT_PARSED解析后的JSON(美化格式)HOOK_TOOL_OUTPUT工具输出(PostToolUse才有)HOOK_TOOL_IS_ERROR是否错误: 0 或 1
退出码结果说明0Allow工具正常执行/继续2Deny阻止工具执行其他Warn显示警告但继续执行
json
{
"hooks": {
"preToolUse": [
"node ./hooks/validate-input.mjs",
"echo 'PreHook: $HOOK_TOOL_NAME'"
],
"postToolUse": [
"node ./hooks/log-output.mjs"
]
}
}
bash
# pre-log.sh
echo "[$(date)] Calling $HOOK_TOOL_NAME with $HOOK_TOOL_INPUT" >> hooks.log
javascript
// validate-input.mjs
const input = JSON.parse(process.env.HOOK_TOOL_INPUT || '{}');
if (input.path?.includes('..')) {
console.error('Path traversal detected');
process.exit(2); // Deny
}
console.log('Input valid');
process.exit(0);
javascript
// filter-secrets.mjs
const output = process.env.HOOK_TOOL_OUTPUT || '';
const filtered = output.replace(/sk-\w{32,}/g, '[REDACTED_API_KEY]');
console.log(filtered);
process.exit(0);
text
hook-system/
├── SKILL.md # 本文件
├── scripts/
│ ├── hook-runner.mjs # 核心钩子运行器
│ └── hooks/
│ ├── pre-log.mjs # 日志示例
│ ├── validate-path.mjs # 路径验证
│ └── filter-secrets.mjs # 敏感信息过滤
└── references/
└── hook-examples.md # 更多示例
龙虾王子自我进化的成果 🦞