設定スコープ
設定には3つのスコープがあり、優先順位の高い順に評価されます:
failproofai がフックイベントを受信すると、現在の作業ディレクトリに存在する3つのファイルすべてをロードしてマージします。
マージルール
enabledPolicies — 3つのスコープの和集合。いずれかのレベルで有効になっているポリシーはアクティブになります。
policyParams — 特定のポリシーに対してパラメーターを定義した最初のスコープが完全に優先されます。ポリシーのパラメーター内での深いマージは行われません。
customPoliciesPath — 最初に定義したスコープが優先されます。
llm — 最初に定義したスコープが優先されます。
設定ファイルのフォーマット
フィールドリファレンス
enabledPolicies
型: string[]
有効にするポリシー名のリスト。名前は failproofai policies で表示されるポリシー識別子と完全に一致する必要があります。完全なリストは組み込みポリシーを参照してください。
enabledPolicies に含まれていないポリシーは、policyParams にエントリがあっても無効です。
policyParams
型: Record<string, Record<string, unknown>>
ポリシーごとのパラメーター上書き設定。外側のキーはポリシー名、内側のキーはポリシー固有のものです。各ポリシーで使用可能なパラメーターは組み込みポリシーに記載されています。
ポリシーにパラメーターがある場合でも指定しなければ、そのポリシーの組み込みデフォルト値が使用されます。policyParams を設定しないユーザーは、以前のバージョンと同じ動作になります。
ポリシーのパラメーターブロック内の未知のキーは、フック実行時には無視されますが、failproofai policies を実行すると警告として表示されます。
hint(横断的設定)
型: string(省略可能)
ポリシーが deny または instruct を返す際に、理由として追記されるメッセージです。ポリシー自体を変更せずに Claude へ具体的な指示を伝えるために使用します。
組み込み、カスタム(custom/)、プロジェクト規約(.failproofai-project/)、ユーザー規約(.failproofai-user/)など、あらゆるポリシータイプで使用できます。
block-force-push が拒否する場合、Claude には次のように表示されます:「Force-pushing is blocked. Try creating a fresh branch instead.」
文字列以外の値や空文字列は無視されます。hint が設定されていない場合は従来の動作と変わりません(後方互換性あり)。
customPoliciesPath
型: string(絶対パス)
カスタムフックポリシーを含む JavaScript ファイルへのパス。failproofai policies --install --custom <path> によって自動的に設定されます(パスは保存前に絶対パスに解決されます)。
ファイルはフックイベントのたびに再読み込みされます。キャッシュは行われません。作成方法の詳細はカスタムポリシーを参照してください。
規約ベースのポリシー
明示的なcustomPoliciesPath に加えて、failproofai は .failproofai/policies/ ディレクトリからポリシーファイルを自動的に検出してロードします:
ファイルのマッチング:
*policies.{js,mjs,ts} に一致するファイルのみロードされます(例:security-policies.mjs、workflow-policies.js)。ディレクトリ内のその他のファイルは無視されます。
設定不要: 規約ポリシーは policies-config.json へのエントリが不要です。ディレクトリにファイルを置くだけで、次のフックイベント時に自動的に読み込まれます。
ユニオンロード: プロジェクトとユーザーの規約ディレクトリが両方スキャンされます。両方のレベルから一致したすべてのファイルがロードされます(customPoliciesPath が最初のスコープ優先なのとは異なります)。
詳細と例はカスタムポリシーを参照してください。
llm
型: object(省略可能)
AI 呼び出しを行うポリシーのための LLM クライアント設定。ほとんどの環境では不要です。
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 にはlocalスコープがありません - GitHub Copilot CLI (beta):
~/.copilot/hooks/failproofai.json(ユーザー)、<cwd>/.github/hooks/failproofai.json(プロジェクト)— Copilot にはlocalスコープがありません。フックエントリは Copilot の OS キー付きbash/powershellコマンドフィールドとtimeoutSecを使用し、ファイルにはトップレベルのversion: 1マーカーが付きます。events.jsonlレコードスキーマ(公開ドキュメントに記載なし)を実際の使用環境で検証中のため、Copilot CLI のサポートはベータ版です。 - Cursor Agent (beta):
~/.cursor/hooks.json(ユーザー)、<cwd>/.cursor/hooks.json(プロジェクト)— Cursor にはlocalスコープがありません。フックエントリは Claude 形式の{type, command, timeout}を使用しますが、Cursor のフックスキーマに従いキャメルケースのイベントキー(preToolUse、beforeSubmitPromptなど)のフラット配列として保存され、ファイルにはトップレベルのversion: 1マーカーが付きます。ハンドラーはCURSOR_EVENT_MAPを通じてキャメルケース → PascalCase に正規化するため、既存の組み込みポリシーはそのまま動作します。Cursor のトランスクリプトのオンディスクフォーマット(公開ドキュメントに未記載)を実際の環境で検証中のため、Cursor Agent のサポートはベータ版です。 - OpenCode (beta):
~/.config/opencode/opencode.json+~/.config/opencode/plugins/failproofai.mjs(ユーザー)、<cwd>/.opencode/opencode.json+<cwd>/.opencode/plugins/failproofai.mjs(プロジェクト)— OpenCode にはlocalスコープがありません。他の5つの CLI とは異なり、OpenCode には外部コマンドフックシステムがありません。opencode.jsonのplugin: []配列で明示的に登録された JS/TS プラグインをインプロセスでロードします(.opencode/plugins/からの自動検出は opencode v1.14.33 でのプラグインロード方法ではありません)。インストール時に小さな生成プラグインシムが配置され、failproofai バイナリをサブプロセスで呼び出し、バイナリの Claude 形式 JSON レスポンスをプラグインセマンティクスに変換します:ツールイベントの deny にはthrow new Error()(ツール呼び出しをキャンセル)、instruct およびStop/SubagentStopの deny にはclient.session.prompt(...)(deny の理由を次のユーザーメッセージとして送信 —session.idleが通知専用で例外をスローしても無効なため、強制リトライの唯一のチャネル)、allow には no-op を使用します。シムはツール名(小文字 →OPENCODE_TOOL_MAPを通じた PascalCase)とツール入力引数のキー(OPENCODE_TOOL_INPUT_MAPを通じたキャメルケース → スネークケース:Read/Write/EditのfilePath→file_path、oldString→old_stringなど)を正規化してからバイナリに転送するため、block-read-outside-cwd、block-env-files、block-secrets-writeなどのパスチェック組み込みポリシーは OpenCode のツール呼び出しでもそのまま動作します。セッションは~/.local/share/opencode/opencode.dbの OpenCode の SQLite DB に保存され、ダッシュボードのセッションビューアーはopencode db --format jsonとopencode export <id>を通じて読み取ります。バージョン間の動作や実際の使用環境での検証中のため、OpenCode のサポートはベータ版です。OpenCode プラグインドキュメントを参照してください。 - Pi (beta):
~/.pi/agent/settings.json(ユーザー)、<cwd>/.pi/settings.json(プロジェクト)— Pi にはlocalスコープがありません。Pi は起動時に TypeScript 拡張パッケージをロードします。設定ファイルはフラットな文字列配列{"packages": ["./relative/path", …]}です。failproofai はバンドルされたpi-extension/ディレクトリを指す単一の packages 配列エントリを書き込みます。拡張機能は内部で Pi のtool_call/user_bash/input/session_startイベントを購読し、failproofai --hook <Event> --cli piをシェルアウトします。ハンドラーはPI_EVENT_MAPを通じてアンダースコア付き小文字スネークケース → PascalCase に正規化するため、既存の組み込みポリシーはそのまま動作します。ツール入力引数もPI_TOOL_INPUT_MAPを通じて正規化されます(Pi の Read / Write / Edit はfile_pathではなくpathを使用。トップレベルキーのマッピングによりblock-env-filesとblock-secrets-writeが動作します —block-read-outside-cwdにはすでにpathフォールバックがあります)。Pi の拡張 API とセッションログのレイアウトが安定化するまで Pi のサポートはベータ版です。 - Hermes (hermes-agent):
~/.hermes/config.yaml(ユーザースコープのみ — Hermes にはプロジェクト/ローカル設定がありません)。Hermes は Slack/Telegram のゲートウェイであるため、1回のインストールでSlack/Telegram/cli/cron など全プラットフォームからのツール呼び出しと内部サブエージェントを傍受します。フックエントリは Hermes のスネークケースイベント(pre_tool_call/post_tool_call/on_session_start/on_session_end/subagent_stop)をキーとするhooks:マップ下の{command, timeout}ペア(タイムアウトは秒単位)です。ハンドラーはHERMES_EVENT_MAPでイベントを、HERMES_TOOL_MAPでツール名を正規化するため、組み込みポリシーはそのまま動作します。設定はコメントを保持する YAMLDocumentのラウンドトリップで編集されるため、オペレーターの他の設定は保持されます。インストール時にhooks_auto_accept: trueが設定されるため、ヘッドレスゲートウェイ(TTY なし)は同意プロンプトなしでフックを実行します。評価器は Hermes の{"decision":"block","reason"}stdout 契約を出力します(Hermes は終了コードを無視)。制限事項: Hermes にはターン終了のStopイベントがないため、require-*-before-stop組み込みポリシーは動作しません(非適用、バグではありません)。instructは allow-with-logged-note に降格します(追加コンテキストチャネルなし)。出力シークレットのリダクション(sanitize-*)はシェルフックの契約上ツール出力を書き換えられません。Hermes はオフライン監査ソースでもあり、ダッシュボードはゲートウェイセッションを~/.hermes/state.dbから直接読み取ります。
- Claude Code:
policies-config.json— failproofai が評価するポリシーとそのパラメーターを指定します(すべてのエージェント CLI で共有)
--cli claude|codex|copilot|cursor|opencode|pi|hermes を渡します(スペース区切りまたは繰り返しで複数指定可能):
--cli を省略すると、failproofai はインストール済みのエージェント CLI を自動検出します(which claude / which codex / which copilot / which cursor-agent / which opencode / which pi / which hermes):
- CLI が1つ検出された場合 — プロンプトなしでその 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 にインストールします。
- 何も検出されない場合 — エージェントバイナリが PATH に見つからないという警告とともに
claudeにフォールバックします。フックコマンドは書き込まれるため、インストール後すぐに有効になります。
policies-config.json はいつでも直接編集できます。変更は次のフックイベント時に即座に反映され、再起動は不要です。
例:チームデフォルトを含むプロジェクトレベルの設定
.failproofai/policies-config.json をリポジトリにコミットします:
.failproofai/policies-config.local.json(gitignore 対象)を作成できます。
