Области действия конфигурации
Существует три области действия конфигурации, оцениваемые по приоритету:| Область | Путь файла | Назначение |
|---|---|---|
| project | .failproofai/policies-config.json | Параметры для одного репозитория, закоммичены в систему контроля версий |
| local | .failproofai/policies-config.local.json | Личные переопределения для одного репозитория, игнорируются в .gitignore |
| global | ~/.failproofai/policies-config.json | Пользовательские значения по умолчанию для всех проектов |
Правила слияния
enabledPolicies — объединение всех трёх областей. Политика, включённая на любом уровне, активна.
policyParams — первая область, которая определяет параметры для данной политики, побеждает полностью. Глубокое слияние значений внутри параметров политики не происходит.
customPoliciesPath — первая область, которая её определяет, побеждает.
llm — первая область, которая её определяет, побеждает.
Формат файла конфигурации
Справочник полей
enabledPolicies
Тип: string[]
Список имён политик для включения. Имена должны точно совпадать с идентификаторами политик, показанными failproofai policies. См. Built-in Policies для полного списка.
Политики, не указанные в enabledPolicies, неактивны, даже если у них есть записи в policyParams.
policyParams
Тип: Record<string, Record<string, unknown>>
Переопределения параметров для каждой политики. Внешний ключ — имя политики; внутренние ключи — специфичны для политики. Каждая политика документирует свои доступные параметры в Built-in Policies.
Если политика имеет параметры, но вы их не указываете, используются встроенные значения по умолчанию политики. Пользователи, которые вообще не настраивают policyParams, получают идентичное поведение предыдущим версиям.
Неизвестные ключи внутри блока параметров политики молча игнорируются при срабатывании хука, но помечаются как предупреждения при запуске failproofai policies.
hint (сквозной)
Тип: string (опционально)
Сообщение, добавляемое к причине, когда политика возвращает deny или instruct. Используйте его, чтобы дать Claude практическое руководство без изменения самой политики.
Работает с любым типом политики — встроенной, пользовательской (custom/), проектной конвенции (.failproofai-project/), или пользовательской конвенции (.failproofai-user/).
block-force-push отклоняет, Claude видит: “Force-pushing заблокирован. Попробуйте создать новую ветку вместо этого.”
Не строковые значения и пустые строки молча игнорируются. Если hint не установлен, поведение не изменяется (обратно совместимо).
customPoliciesPath
Тип: string (абсолютный путь)
Путь к файлу JavaScript, содержащему пользовательские политики хука. Этот путь устанавливается автоматически с помощью failproofai policies --install --custom <path> (путь преобразуется в абсолютный перед сохранением).
Файл загружается заново при каждом событии хука — кэширование отсутствует. Подробности разработки см. в Custom Policies.
Политики на основе конвенций
В дополнение к явномуcustomPoliciesPath, failproofai автоматически обнаруживает и загружает файлы политик из каталогов .failproofai/policies/:
| Уровень | Каталог | Область |
|---|---|---|
| Проект | .failproofai/policies/ | Делится с командой через систему контроля версий |
| Пользователь | ~/.failproofai/policies/ | Личное, применяется ко всем проектам |
*policies.{js,mjs,ts} (например security-policies.mjs, workflow-policies.js). Другие файлы в каталоге игнорируются.
Конфигурация не требуется: Политики конвенций не требуют записей в policies-config.json. Просто поместите файлы в каталог, и они будут обнаружены при следующем событии хука.
Объединённая загрузка: Сканируются оба каталога конвенций проекта и пользователя. Все соответствующие файлы с обоих уровней загружаются (в отличие от customPoliciesPath, который использует принцип первой области-победителя).
Подробности и примеры см. в Custom Policies.
llm
Тип: object (опционально)
Конфигурация LLM клиента для политик, которые выполняют вызовы AI. Не требуется для большинства установок.
Управление конфигурацией из CLI
Командыpolicies --install и policies --uninstall записывают в файл параметров хука вашего CLI агента (точки входа хука), а policies-config.json — это файл, которым вы управляете напрямую. Это два отдельных файла:
- Параметры CLI агента — указывает агенту вызывать
failproofai --hook <event>при каждом использовании инструмента:- Claude Code:
~/.claude/settings.json(пользователь),<cwd>/.claude/settings.json(проект),<cwd>/.claude/settings.local.json(локально) - OpenAI Codex:
~/.codex/hooks.json(пользователь),<cwd>/.codex/hooks.json(проект) — Codex не имеет локальной области - GitHub Copilot CLI (beta):
~/.copilot/hooks/failproofai.json(пользователь),<cwd>/.github/hooks/failproofai.json(проект) — Copilot не имеет локальной области. Записи хука используют поля командыbash/powershellCopilot с ключомtimeoutSec; файл содержит маркер уровня верхнего уровняversion: 1. Поддержка Copilot CLI находится в beta, пока мы проверяем схему записиevents.jsonl(которую не указывает официальная документация) против более реальных сессий. - Cursor Agent (beta):
~/.cursor/hooks.json(пользователь),<cwd>/.cursor/hooks.json(проект) — Cursor не имеет локальной области. Записи хука используют форму в стиле Claude{type, command, timeout}(без разделенияbash/powershell), но сохраняются под ключами событий в camelCase (preToolUse,beforeSubmitPrompt, …) в плоском массиве согласно схеме хуков Cursor; файл содержит маркер уровня верхнего уровняversion: 1. Обработчик канонизирует camelCase → PascalCase черезCURSOR_EVENT_MAP, поэтому существующие встроенные политики срабатывают без изменений. Поддержка Cursor Agent находится в beta, пока мы проверяем формат записи записей Cursor на диске (не указан в официальной документации) против более реальных установок. - OpenCode (beta):
~/.config/opencode/opencode.json+~/.config/opencode/plugins/failproofai.mjs(пользователь),<cwd>/.opencode/opencode.json+<cwd>/.opencode/plugins/failproofai.mjs(проект) — OpenCode не имеет локальной области. В отличие от других шести CLI, OpenCode имеет отсутствие системы внешних командных хуков: он загружает встроенные плагины JS/TS, явно зарегистрированные через массивplugin: []вopencode.json(автообнаружение из.opencode/plugins/не является способом загрузки плагинов в opencode v1.14.33). Установка помещает небольшой созданный шим плагина, который вызывает двоичный файл failproofai в подпроцессе и переводит ответ JSON двоичного файла в семантику плагина:throw new Error()для отклонения события инструмента (отменяет вызов инструмента),client.session.prompt(...)для instruct И для отклоненияStop/SubagentStop(отправляет причину отклонения в качестве следующего сообщения пользователя — единственный канал принудительного повторного попытки, так какsession.idleдоступна только для уведомлений и выброс из неё не работает), и no-op для allow. Шим канонизирует как имена инструментов (нижний регистр → PascalCase черезOPENCODE_TOOL_MAP), так и ключи аргументов инструмента (camelCase → snake_case черезOPENCODE_TOOL_INPUT_MAPдляRead/Write/Edit, напримерfilePath→file_path,oldString→old_string) перед передачей двоичному файлу, поэтому встроенные функции проверки пути, такие какblock-read-outside-cwd,block-env-filesиblock-secrets-write, срабатывают без изменений на вызовах инструментов OpenCode. Сессии живут в БД SQLite OpenCode в~/.local/share/opencode/opencode.db; средство просмотра сессий панели управления читает их черезopencode db --format jsonиopencode export <id>. Поддержка OpenCode находится в beta, пока мы проверяем поведение в разных версиях и против более реальных сессий. См. документацию плагинов OpenCode. - Pi (beta):
~/.pi/agent/settings.json(пользователь),<cwd>/.pi/settings.json(проект) — Pi не имеет локальной области. Pi загружает пакеты расширений TypeScript при запуске; файл параметров — это плоский массив строк{"packages": ["./relative/path", …]}. failproofai записывает единственную запись массива пакетов, указывающую на свой встроенный каталогpi-extension/. Расширение внутри подписывается на событияtool_call/user_bash/input/session_startPi и запускаетfailproofai --hook <Event> --cli pi; обработчик канонизирует underscore_lower_snake_case → PascalCase черезPI_EVENT_MAP, поэтому существующие встроенные политики срабатывают без изменений. Аргументы входа инструмента также канонизируются черезPI_TOOL_INPUT_MAP(Read / Write / Edit Pi доставляютpathвместоfile_path; отображение верхнего уровня ключа позволяетblock-env-filesиblock-secrets-writeсрабатывать —block-read-outside-cwdуже имел fallbackpath). Поддержка Pi находится в beta, пока стабилизируются API расширений Pi и макет журнала сессий. - Gemini CLI (beta):
~/.gemini/settings.json(пользователь),<cwd>/.gemini/settings.json(проект) — Gemini не имеет локальной области (документирует областьsystemв/etc/gemini-cli/settings.json, которую failproofai не предоставляет). Записи хука используют форму Claude{type, command, timeout}, завёрнутую в схему сопоставителя Gemini{matcher, hooks: [...]}сmatcher: "*"по умолчанию. События — PascalCase (SessionStart,BeforeAgent,AfterAgent,BeforeModel,AfterModel,BeforeToolSelection,BeforeTool,AfterTool,PreCompress,Notification,SessionEnd); обработчик отображает на канонические имена Claude черезGEMINI_EVENT_MAP. Имена инструментов — snake_case (run_shell_command,read_file,write_file,replace, …) — обработчик канонизирует черезGEMINI_TOOL_MAP, поэтому существующие встроенные политики срабатывают без изменений. Оценка политики выдаёт плоскую форму Gemini{decision: "deny", reason}(предпочтительно согласно “Golden Rule” Gemini контракт exit-0),{hookSpecificOutput: {hookEventName, additionalContext}}для внедрения контекста на BeforeAgent / AfterTool / SessionStart и{decision: "block", reason}на AfterAgent для семантики принудительного повторного попытки. Поддержка Gemini CLI находится в beta, пока мы расширяем реальное покрытие. См. документацию хуков Gemini CLI.
- Claude Code:
policies-config.json— указывает failproofai, какие политики оценивать и с какими параметрами (общее для всех CLI агентов)
--cli claude|codex|copilot|cursor|opencode|pi|gemini для целевого агента (разделённые пробелом или повторяемые для любого подмножества):
--cli опущена, failproofai обнаруживает, какие CLI агентов установлены (which claude / which codex / which copilot / which cursor-agent / which opencode / which pi / which gemini):
- Один CLI обнаружен — автоматически выбирает этот CLI без запроса.
- Несколько CLI обнаружены в интерактивном терминале — показывает запрос одиночного выбора со стрелками, сгруппированный в раздел
Detected (N)(с агрегированной строкойInstall for all N detected+ каждый обнаруженный CLI отдельно) и разделNot installed (M) · install hooks ahead of time, перечисляющий каждый необнаруженный поддерживаемый CLI как опцию предварительной установки (↑↓ для перемещения, Enter для выбора, ^C для выхода). Поток удаления показывает только раздел Detected. - Несколько CLI обнаружены в неинтерактивном запуске (CI, нет TTY) — устанавливает для всех обнаруженных CLI без запроса.
- Ничего не обнаружено — возвращается к
claude, с предупреждением, что двоичный файл агента не найден в PATH; команда хука всё ещё записывается, поэтому она активируется, как только вы установите один.
policies-config.json напрямую в любой момент; изменения вступают в силу немедленно при следующем событии хука без необходимости перезагрузки.
Пример: конфигурация уровня проекта с командными значениями по умолчанию
Закоммитьте.failproofai/policies-config.json в ваш репозиторий:
.failproofai/policies-config.local.json (игнорируется в gitignore) для личных переопределений без воздействия на товарищей по команде.
