allow、deny、instruct 决策。
快速示例
两种加载自定义策略的方式
方式一:基于约定(推荐)
将*policies.{js,mjs,ts} 文件放入 .failproofai/policies/ 目录,它们会被自动加载——无需任何命令行参数或配置变更。这和 git hooks 的用法一样:放入文件即生效。
- 项目目录和用户目录均会被扫描(取并集,而非”第一个作用域优先”)
- 文件在各自目录内按字母顺序加载;可使用
01-、02-前缀控制顺序 - 仅加载匹配
*policies.{js,mjs,ts}的文件,其他文件会被忽略 - 每个文件独立加载(单文件失败不影响其他文件)
- 可与显式
--custom及内置策略共存
方式二:显式指定文件路径
customPoliciesPath 存储在 policies-config.json 中。每次 Hook 事件触发时都会重新加载该文件,事件之间不存在缓存。
两种方式同时使用
基于约定的策略与显式--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 发送一条信息性消息。该消息通过 Hook 处理器 stdout 响应中的 additionalContext 传递——与 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 则对所有事件类型触发。
错误处理与故障模式
自定义策略采用失败开放原则:错误不会阻止内置策略运行,也不会导致 Hook 处理器崩溃。完整示例:多条策略
示例文件
examples/ 目录包含可直接运行的策略文件:

