allow, deny, instruct, что и встроенные политики.
Быстрый пример
Два способа загрузки пользовательских политик
Способ 1: На основе соглашений (рекомендуется)
Поместите файлы*policies.{js,mjs,ts} в .failproofai/policies/ — они загружаются автоматически, никаких флагов или изменений конфигурации не требуется. Это работает как git хуки: положите файл, и всё просто работает.
- Сканируются оба каталога проекта и пользователя (объединение — не первое совпадение)
- Файлы загружаются в алфавитном порядке в каждом каталоге. Префиксуйте с
01-,02-для управления порядком - Загружаются только файлы, совпадающие с
*policies.{js,mjs,ts}; остальные файлы игнорируются - Каждый файл загружается независимо (отказоустойчивая загрузка для каждого файла)
- Работает вместе с явным
--customи встроенными политиками
Способ 2: Явный путь к файлу
policies-config.json как customPoliciesPath. Файл загружается заново при каждом событии перехвата — кеширование между событиями отсутствует.
Использование обоих вместе
Политики на основе соглашений и явный файл--custom могут сосуществовать. Порядок загрузки:
- Явный файл
customPoliciesPath(если настроен) - Файлы соглашений проекта (
{cwd}/.failproofai/policies/, в алфавитном порядке) - Файлы соглашений пользователя (
~/.failproofai/policies/, в алфавитном порядке)
API
Импорт
customPolicies.add(hook)
Регистрирует политику. Вызывайте столько раз, сколько нужно для нескольких политик в одном файле.
Вспомогательные функции решений
deny(message) — сообщение отображается Claude с префиксом "Blocked by failproofai:". Единственное 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/ содержит готовые к использованию файлы политик:

