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

快速示例

安装:

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

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

*policies.{js,mjs,ts} 文件放入 .failproofai/policies/ 目录,它们会被自动加载——无需任何命令行参数或配置变更。这和 git hooks 的用法一样:放入文件即生效。
工作原理:
  • 项目目录和用户目录均会被扫描(取并集,而非”第一个作用域优先”)
  • 文件在各自目录内按字母顺序加载;可使用 01-02- 前缀控制顺序
  • 仅加载匹配 *policies.{js,mjs,ts} 的文件,其他文件会被忽略
  • 每个文件独立加载(单文件失败不影响其他文件)
  • 可与显式 --custom 及内置策略共存
基于约定的策略是为团队建立质量标准的最简便方式。将 .failproofai/policies/ 提交到 git,每位团队成员都会自动获得相同的规则,无需任何个人配置。随着团队不断发现新的故障模式,添加策略并推送即可。久而久之,这些策略将成为随着每次贡献持续完善的质量标准。

方式二:显式指定文件路径

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

两种方式同时使用

基于约定的策略与显式 --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 发送一条信息性消息。该消息通过 Hook 处理器 stdout 响应中的 additionalContext 传递——与 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 则对所有事件类型触发。

错误处理与故障模式

自定义策略采用失败开放原则:错误不会阻止内置策略运行,也不会导致 Hook 处理器崩溃。
要调试自定义策略错误,可以实时查看日志文件:

完整示例:多条策略


示例文件

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

使用显式文件示例

使用基于约定的示例

无需安装命令——文件在下次 Hook 事件触发时会被自动加载。