Skip to content

DotCraft Hooks 指南

Hooks 让 DotCraft 在生命周期事件中执行外部命令。它适合做格式化、审计、通知、环境检查和安全守卫。第一次使用建议先写一个观察型 Hook,再逐步加入阻止型 Hook。

快速开始

.craft/config.json 中添加:

json
{
  "Hooks": {
    "Enabled": true,
    "Events": {
      "AfterToolCall": [
        {
          "name": "log-tool-call",
          "type": "command",
          "command": "node .craft/hooks/log-tool-call.js",
          "matcher": ".*",
          "timeoutSeconds": 10
        }
      ]
    }
  }
}

示例脚本读取 stdin 中的 JSON,并记录工具调用:

js
import fs from 'node:fs'

let input = ''
process.stdin.on('data', chunk => (input += chunk))
process.stdin.on('end', () => {
  fs.appendFileSync('.craft/hooks.log', input + '\n')
})

配置

Hooks 支持全局配置和工作区配置。工作区配置会覆盖或补充全局配置,适合保存项目自己的格式化、审计和通知规则。

字段说明
Hooks.Enabled是否启用 Hooks
Hooks.Events按事件名分组的 Hook 列表
nameHook 名称,便于日志和排查
type支持 "command"
command要执行的 Shell 命令
matcher匹配工具名的正则;空字符串匹配所有工具相关事件
timeoutSecondsHook 超时时间

完整事件、stdin payload、退出码和示例见 Hooks 参考

使用示例

场景事件行为
文件写入后格式化AfterToolCall匹配 WriteFile / EditFile 后运行 formatter
Shell 命令安全守卫BeforeToolCall检查危险命令,返回非零退出码阻止执行
Agent 完成后通知AfterTurn向企业微信、飞书或内部系统发送摘要
自动化任务审计Automations 相关事件写入外部审计日志

进阶

执行模型

Hook 进程通过 stdin 接收 JSON 上下文。DotCraft 等待命令退出,并按退出码决定是否继续当前操作:

退出码含义
0Hook 成功,继续执行
0Hook 失败;阻止型事件会中断当前操作

Matcher

matcher 是正则表达式,只对工具相关事件生效。常见写法:

matcher匹配
`WriteFileEditFile`
ExecShell 命令
.*所有工具

最佳实践

  • Hook 脚本保持短小,复杂逻辑放到项目脚本中。
  • 观察型 Hook 失败时可以在命令末尾加 || true,避免影响主流程。
  • 阻止型 Hook 要输出清楚的错误信息,方便用户知道如何修复。
  • 不要把敏感 Token 写进仓库,优先使用环境变量或全局配置。

故障排查

Hook 没有执行

确认 Hooks.Enabled = true,事件名正确,matcher 能匹配当前工具名,并且命令路径相对当前工作区可用。

Hook 超时

调大 timeoutSeconds,或把慢操作放到后台队列。Hook 适合做短任务,不适合长时间阻塞 Agent。

可以在 Hook 中修改工具参数吗?

Hook 不支持修改工具参数或执行结果。Hook 只能观察或阻止当前操作。

Apache License 2.0