跳转至

Hook 配置与发现

启用并选择内部钩子,以及 Gateway 如何跨来源发现它们。属于 钩子 指南的一部分。

配置

为了获得可预测的选择,请启用命名钩子,而不是开启广泛发现:

{
  "hooks": {
    "internal": {
      "enabled": true,
      "entries": {
        "command-logger": { "enabled": true },
        "session-memory": { "enabled": false }
      }
    }
  }
}

目录加载钩子的主开关和选择规则如下:

配置 选择
hooks.internal.enabled: false 内部钩子已关闭。
没有主标志,也没有已启用条目、额外目录或受跟踪的安装 Gateway 会跳过目录钩子加载。
命名条目,且主标志省略或为 true 已启用的名称构成允许列表;主开关上的 enabled: true 不会扩大该列表。未设置 enabled: false 的条目会贡献其名称。
主标志为 true,但没有命名条目或命名安装 对符合条件的钩子进行开放式发现。
声明钩子名称的受跟踪钩子包 这些名称会加入选择;显式的每个钩子 enabled: false 仍会禁用非插件钩子。
非空的 load.extraDirs,或没有钩子名称列表的受跟踪安装 开放式发现,而不是限制到该目录或包的选择。

工作区钩子始终需要 entries.<hookKey>.enabled: true,即使处于开放式发现中。对于其他文件钩子,条目可以通过其名称或 hookKey 选择,但设置会在 hookKey 下读取。CLI 会解析名称并为你写入正确的键。添加第一个命名条目可能会缩小之前较宽泛的选择;在更改之前请检查现有钩子。

每个钩子的条目接受任意处理器定义的字段。核心类型包括 enabled 为布尔值,以及 env 为字符串到字符串的映射;它不会校验自定义处理器选项。例如:

{
  "hooks": {
    "internal": {
      "entries": {
        "my-hook": {
          "enabled": true,
          "env": { "MY_HOOK_LABEL": "example" }
        }
      }
    }
  }
}

每个钩子的 env 可满足资格检查,但不会修改 process.env。 在携带配置的事件中,处理器可以从 event.context.cfg?.hooks?.internal?.entries?.["my-hook"]?.env 读取它。其他事件不 保证提供 cfg 字段。不要记录完整的配置对象,也不要在示例中放入机密信息。

Warning

hooks.internal.handlers 已弃用,并且无法通过常规配置校验。在运行 openclaw doctor --fix 之前,请将每个已注册模块迁移到包含 HOOK.md 和处理器的托管或 工作区钩子目录。Doctor 会移除旧注册项;它不会创建可执行文件。对于仅旧版配置 且 hooks.internal.enabled: true 的情况,它也会移除该标志,以避免广泛 发现。命名条目、非空额外目录以及显式的 enabled: false 会被保留。

钩子发现

目录发现按名称合并钩子,规则如下:

来源 位置和冲突行为
内置 随 OpenClaw 一起提供。
插件 由活动插件声明的钩子目录;可以替换内置名称。
托管 <stateDir>/hooks/,通常为 ~/.openclaw/hooks/;可以替换内置和插件名称。
额外目录 hooks.internal.load.extraDirs;与托管钩子相同的来源策略。后面的额外目录优先于前面的额外目录;托管目录优先于额外目录。
工作区 <workspace>/hooks/;可以添加名称,但不能替换内置、插件或托管名称。需要显式选择加入。

内置、托管、工作区和插件钩子位置都是集合目录:发现过程会检查它们的直接子项,以查找钩子或在其 package.json 中声明 openclaw.hooks 的包。

每个显式的 hooks.internal.load.extraDirs 路径也可以是包根目录、 单钩子根目录或集合目录。包根目录只加载其声明的钩子路径,包括 ./hooks/my-hook 这样的嵌套路径。每个 路径必须直接指向一个钩子;发现过程不会递归进入另一个 包或集合。一个被识别但没有有效钩子的包会保持为空,而不是 扫描未列出的子项。单钩子根目录会加载其自身的 HOOK.md 和处理器。只有普通集合根目录才会执行直接子项扫描。

例如,若要直接选择 /opt/openclaw-hook-library/my-hook/HOOK.md,请添加该钩子的目录:

{
  "hooks": {
    "internal": {
      "load": {
        "extraDirs": ["/opt/openclaw-hook-library/my-hook"]
      }
    }
  }
}

若要改为扫描库的直接子项,请添加 /opt/openclaw-hook-library。仅添加受信任的目录:任何额外路径都会启用跨发现源、超出命名条目的钩子名称选择, 即使该路径只选择单个钩子或包。 处理器文件必须保留在其钩子目录内;包和插件钩子路径必须保留在其包根目录内。逃逸这些边界的 符号链接将被拒绝。钩子配置和已选择工作区的变更会在 hybrid 模式下重新加载发现,包括由新钩子包安装或链接写入的配置。钩子 文件和元数据不会被监视;在编辑它们或更新现有钩子代码后请重启,然后验证处理器的实际副作用。

钩子包

钩子包是一种在 package.json 的 openclaw.hooks 中声明钩子目录的包。通过统一安装器安装已审核的包或本地目录:

openclaw plugins install <path-or-spec>

安装和更新标志、npm 限制、链接根目录的行为和信任,以及已弃用的 hooks install / hooks update 别名,详见 安装和更新钩子包。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw