Skip to main content
自定义策略让你能够为任何 Agent 行为编写规则:强制执行项目规范、防止偏移、拦截破坏性操作、检测卡死的 Agent,或与 Slack、审批工作流等系统集成。它们使用与内置策略相同的钩子事件系统和 allowdenyinstruct 决策机制。

快速示例

安装:

加载自定义策略的两种方式

方式一:基于约定(推荐)

*policies.{js,mjs,ts} 文件放入 .failproofai/policies/ 目录,它们会被自动加载——无需任何命令行参数或配置更改。这与 git hooks 的工作方式类似:放入文件,直接生效。
工作原理:
  • 项目目录和用户目录均会被扫描(取并集,而非先匹配者优先)
  • 每个目录内的文件按字母顺序加载;可用 01-02- 前缀控制顺序
  • 仅加载匹配 *policies.{js,mjs,ts} 的文件,其他文件会被忽略
  • 每个文件独立加载(单个文件失败时采用宽松策略)
  • 可与显式 --custom 参数及内置策略共存
基于约定的策略是为团队建立质量标准的最便捷方式。将 .failproofai/policies/ 提交到 git,每位团队成员就能自动获得相同的规则——无需逐个开发者配置。随着团队发现新的故障模式,只需添加一个策略并推送。随着时间推移,这些策略将成为一套随每次贡献不断完善的活质量标准。

方式二:显式文件路径

解析后的绝对路径会以 customPoliciesPath 字段存储在 policies-config.json 中。每次钩子事件触发时都会重新加载该文件,事件之间不存在缓存。

两种方式同时使用

基于约定的策略与显式 --custom 文件可以共存。加载顺序如下:
  1. 显式 customPoliciesPath 文件(如已配置)
  2. 项目约定文件({cwd}/.failproofai/policies/,按字母顺序)
  3. 用户约定文件(~/.failproofai/policies/,按字母顺序)

API

导入

customPolicies.add(hook)

注册一个策略。同一文件中可多次调用以注册多个策略。

决策辅助函数

deny(message) ——消息会以 "Blocked by failproofai:" 为前缀显示给 Claude。单个 deny 会短路所有后续评估。 instruct(message) ——消息会附加到 Claude 当前工具调用的上下文中。所有 instruct 消息会被累积并一起传递。
你可以通过在 policyParams 中添加 hint 字段,为任何 denyinstruct 消息附加额外的指引——无需修改代码。这同样适用于自定义(custom/)、项目约定(.failproofai-project/)和用户约定(.failproofai-user/)策略。详见 配置 → hint

信息性 allow 消息

allow(message) 允许操作向 Claude 发送一条信息性消息。该消息以 additionalContext 的形式通过钩子处理器的 stdout 响应传递——与 instruct 使用相同的机制,但语义不同:它是一个状态更新,而非警告。 使用场景:
  • 状态确认: allow("All CI checks passed.") ——告知 Claude 一切正常
  • 宽松失败说明: allow("GitHub CLI not installed, skipping CI check.") ——告知 Claude 为何跳过某项检查,使其获得完整上下文
  • 多条消息累积: 若多个策略各自返回 allow(message),所有消息将以换行符连接后一并传递

PolicyContext 字段

SessionMetadata 字段

事件类型


评估顺序

策略按以下顺序评估:
  1. 内置策略(按定义顺序)
  2. 来自 customPoliciesPath 的显式自定义策略(按 .add() 调用顺序)
  3. 项目 .failproofai/policies/ 中的约定策略(文件按字母顺序,文件内按 .add() 调用顺序)
  4. 用户 ~/.failproofai/policies/ 中的约定策略(文件按字母顺序,文件内按 .add() 调用顺序)
第一个 deny 会短路所有后续策略。所有 instruct 消息会被累积并一起传递。

传递性导入

自定义策略文件可以使用相对路径导入本地模块:
所有从入口文件可达的相对导入均会被解析。实现方式是将 from "failproofai" 的导入重写为实际的 dist 路径,并创建临时 .mjs 文件以确保 ESM 兼容性。

事件类型过滤

使用 match.events 限制策略的触发时机:
完全省略 match 则在每种事件类型上都触发。

错误处理与失败模式

自定义策略采用宽松失败策略:错误不会阻止内置策略运行,也不会导致钩子处理器崩溃。
要调试自定义策略错误,可监听日志文件:

完整示例:多个策略


示例

examples/ 目录包含可直接运行的策略文件:

使用显式文件示例

使用基于约定的示例

无需执行安装命令——文件会在下次钩子事件触发时自动被识别加载。