allow、deny、instruct 决策机制。
快速示例
加载自定义策略的两种方式
方式一:基于约定(推荐)
将*policies.{js,mjs,ts} 文件放入 .failproofai/policies/ 目录,它们会被自动加载——无需任何命令行参数或配置更改。这与 git hooks 的工作方式类似:放入文件,直接生效。
- 项目目录和用户目录均会被扫描(取并集,而非先匹配者优先)
- 每个目录内的文件按字母顺序加载;可用
01-、02-前缀控制顺序 - 仅加载匹配
*policies.{js,mjs,ts}的文件,其他文件会被忽略 - 每个文件独立加载(单个文件失败时采用宽松策略)
- 可与显式
--custom参数及内置策略共存
方式二:显式文件路径
customPoliciesPath 字段存储在 policies-config.json 中。每次钩子事件触发时都会重新加载该文件,事件之间不存在缓存。
两种方式同时使用
基于约定的策略与显式--custom 文件可以共存。加载顺序如下:
- 显式
customPoliciesPath文件(如已配置) - 项目约定文件(
{cwd}/.failproofai/policies/,按字母顺序) - 用户约定文件(
~/.failproofai/policies/,按字母顺序)
API
导入
customPolicies.add(hook)
注册一个策略。同一文件中可多次调用以注册多个策略。
决策辅助函数
deny(message) ——消息会以 "Blocked by failproofai:" 为前缀显示给 Claude。单个 deny 会短路所有后续评估。
instruct(message) ——消息会附加到 Claude 当前工具调用的上下文中。所有 instruct 消息会被累积并一起传递。
信息性 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 字段
事件类型
评估顺序
策略按以下顺序评估:- 内置策略(按定义顺序)
- 来自
customPoliciesPath的显式自定义策略(按.add()调用顺序) - 项目
.failproofai/policies/中的约定策略(文件按字母顺序,文件内按.add()调用顺序) - 用户
~/.failproofai/policies/中的约定策略(文件按字母顺序,文件内按.add()调用顺序)
第一个
deny 会短路所有后续策略。所有 instruct 消息会被累积并一起传递。传递性导入
自定义策略文件可以使用相对路径导入本地模块:from "failproofai" 的导入重写为实际的 dist 路径,并创建临时 .mjs 文件以确保 ESM 兼容性。
事件类型过滤
使用match.events 限制策略的触发时机:
match 则在每种事件类型上都触发。
错误处理与失败模式
自定义策略采用宽松失败策略:错误不会阻止内置策略运行,也不会导致钩子处理器崩溃。完整示例:多个策略
示例
examples/ 目录包含可直接运行的策略文件:

