Konfigurationsbereiche
Es gibt drei Konfigurationsbereiche, die in Prioritätsreihenfolge ausgewertet werden:| Bereich | Dateipfad | Zweck |
|---|---|---|
| project | .failproofai/policies-config.json | Repository-spezifische Einstellungen, in die Versionsverwaltung eingecheckt |
| local | .failproofai/policies-config.local.json | Persönliche, repository-spezifische Überschreibungen, per gitignore ausgeschlossen |
| global | ~/.failproofai/policies-config.json | Benutzerweite Standardwerte für alle Projekte |
Merge-Regeln
enabledPolicies – die Vereinigung aller drei Bereiche. Eine Richtlinie, die auf irgendeiner Ebene aktiviert ist, ist aktiv.
policyParams – der erste Bereich, der Parameter für eine bestimmte Richtlinie definiert, gewinnt vollständig. Es gibt kein tiefes Mergen von Werten innerhalb der Parameter einer Richtlinie.
customPoliciesPath – der erste Bereich, der diesen Wert definiert, gewinnt.
llm – der erste Bereich, der diesen Wert definiert, gewinnt.
Konfigurationsdateiformat
Feldreferenz
enabledPolicies
Typ: string[]
Liste der zu aktivierenden Richtliniennamen. Die Namen müssen exakt mit den Richtlinienbezeichnern übereinstimmen, die von failproofai policies angezeigt werden. Eine vollständige Liste finden Sie unter Integrierte Richtlinien.
Richtlinien, die nicht in enabledPolicies enthalten sind, sind inaktiv, auch wenn sie Einträge in policyParams haben.
policyParams
Typ: Record<string, Record<string, unknown>>
Parameterüberschreibungen pro Richtlinie. Der äußere Schlüssel ist der Richtlinienname; die inneren Schlüssel sind richtlinienspezifisch. Jede Richtlinie dokumentiert ihre verfügbaren Parameter unter Integrierte Richtlinien.
Wenn eine Richtlinie Parameter hat, Sie diese aber nicht angeben, werden die eingebauten Standardwerte der Richtlinie verwendet. Benutzer, die policyParams gar nicht konfigurieren, erhalten ein identisches Verhalten wie in früheren Versionen.
Unbekannte Schlüssel innerhalb des Parameterblocks einer Richtlinie werden zum Zeitpunkt der Hook-Ausführung stillschweigend ignoriert, werden jedoch als Warnungen markiert, wenn Sie failproofai policies ausführen.
hint (übergreifend)
Typ: string (optional)
Eine Meldung, die an den Grund angehängt wird, wenn eine Richtlinie deny oder instruct zurückgibt. Verwenden Sie sie, um Claude handlungsrelevante Hinweise zu geben, ohne die Richtlinie selbst zu ändern.
Funktioniert mit jedem Richtlinientyp – integriert, benutzerdefiniert (custom/), Projektkonvention (.failproofai-project/) oder Benutzerkonvention (.failproofai-user/).
block-force-push ablehnt, sieht Claude: „Force-Pushing ist blockiert. Try creating a fresh branch instead.”
Nicht-String-Werte und leere Strings werden stillschweigend ignoriert. Wenn hint nicht gesetzt ist, bleibt das Verhalten unverändert (abwärtskompatibel).
customPoliciesPath
Typ: string (absoluter Pfad)
Pfad zu einer JavaScript-Datei mit benutzerdefinierten Hook-Richtlinien. Dieser wird automatisch von failproofai policies --install --custom <path> gesetzt (der Pfad wird vor der Speicherung in einen absoluten Pfad aufgelöst).
Die Datei wird bei jedem Hook-Ereignis neu geladen – es gibt kein Caching. Weitere Informationen zur Erstellung finden Sie unter Benutzerdefinierte Richtlinien.
Konventionsbasierte Richtlinien
Zusätzlich zum explizitencustomPoliciesPath erkennt und lädt failproofai automatisch Richtliniendateien aus .failproofai/policies/-Verzeichnissen:
| Ebene | Verzeichnis | Bereich |
|---|---|---|
| Projekt | .failproofai/policies/ | Mit dem Team über Versionsverwaltung geteilt |
| Benutzer | ~/.failproofai/policies/ | Persönlich, gilt für alle Projekte |
*policies.{js,mjs,ts} entsprechen (z. B. security-policies.mjs, workflow-policies.js). Andere Dateien im Verzeichnis werden ignoriert.
Keine Konfiguration erforderlich: Konventionsrichtlinien benötigen keine Einträge in policies-config.json. Legen Sie einfach Dateien in das Verzeichnis und sie werden beim nächsten Hook-Ereignis aufgenommen.
Vereinigtes Laden: Sowohl Projekt- als auch Benutzerkonventionsverzeichnisse werden durchsucht. Alle passenden Dateien aus beiden Ebenen werden geladen (im Gegensatz zu customPoliciesPath, das das Prinzip „erster Bereich gewinnt” verwendet).
Weitere Details und Beispiele finden Sie unter Benutzerdefinierte Richtlinien.
llm
Typ: object (optional)
LLM-Client-Konfiguration für Richtlinien, die KI-Aufrufe durchführen. Für die meisten Setups nicht erforderlich.
Konfiguration über die CLI verwalten
Die Befehlepolicies --install und policies --uninstall schreiben in die Hook-Einstellungsdatei Ihres Agenten-CLIs (die Hook-Einstiegspunkte), während policies-config.json die Datei ist, die Sie direkt verwalten. Beide sind voneinander getrennt:
- Agenten-CLI-Einstellungen — weist den Agenten an, bei jeder Werkzeugnutzung
failproofai --hook <event>aufzurufen:- Claude Code:
~/.claude/settings.json(Benutzer),<cwd>/.claude/settings.json(Projekt),<cwd>/.claude/settings.local.json(lokal) - OpenAI Codex:
~/.codex/hooks.json(Benutzer),<cwd>/.codex/hooks.json(Projekt) — Codex hat keinenlocal-Bereich - GitHub Copilot CLI (beta):
~/.copilot/hooks/failproofai.json(Benutzer),<cwd>/.github/hooks/failproofai.json(Projekt) — Copilot hat keinenlocal-Bereich. Hook-Einträge verwenden die betriebssystemabhängigenbash/powershell-Befehlsfelder von Copilot mittimeoutSec; die Datei enthält einenversion: 1-Marker auf oberster Ebene. Die Unterstützung für Copilot CLI ist beta, während wir dasevents.jsonl-Aufzeichnungsschema (das in den öffentlichen Docs nicht spezifiziert ist) anhand weiterer realer Sitzungen verifizieren. - Cursor Agent (beta):
~/.cursor/hooks.json(Benutzer),<cwd>/.cursor/hooks.json(Projekt) — Cursor hat keinenlocal-Bereich. Hook-Einträge verwenden die Claude-ähnliche Form{type, command, timeout}(keinebash/powershell-Aufteilung), werden aber unter camelCase-Ereignisschlüsseln (preToolUse,beforeSubmitPrompt, …) in einem flachen Array gemäß Cursors Hooks-Schema gespeichert; die Datei trägt einenversion: 1-Marker auf oberster Ebene. Der Handler kanonisiert camelCase → PascalCase überCURSOR_EVENT_MAP, sodass bestehende eingebaute Richtlinien unverändert ausgelöst werden. Die Unterstützung für Cursor Agent ist beta, während wir Cursors On-Disk-Transkriptformat (in den öffentlichen Docs nicht spezifiziert) anhand weiterer realer Installationen verifizieren. - OpenCode (beta):
~/.config/opencode/opencode.json+~/.config/opencode/plugins/failproofai.mjs(Benutzer),<cwd>/.opencode/opencode.json+<cwd>/.opencode/plugins/failproofai.mjs(Projekt) — OpenCode hat keinenlocal-Bereich. Im Gegensatz zu den anderen sechs CLIs verfügt OpenCode über kein externes Befehlshook-System: Es lädt In-Process-JS/TS-Plugins, die explizit über dasplugin: []-Array inopencode.jsonregistriert werden (Auto-Discovery aus.opencode/plugins/ist nicht der Weg, wie Plugins in opencode v1.14.33 geladen werden). Die Installation legt einen kleinen generierten Plugin-Shim ab, der die failproofai-Binärdatei als Subprocess aufruft und die Claude-ähnliche JSON-Antwort der Binärdatei zurück in Plugin-Semantik übersetzt:throw new Error()für Tool-Event-deny (bricht den Tool-Aufruf ab),client.session.prompt(...)für instruct UND fürStop/SubagentStop-deny (sendet den Ablehnungsgrund als nächste Benutzernachricht – der einzige Force-Retry-Kanal, dasession.idlenur benachrichtigend ist und ein Throw daraus ein No-Op ist), und No-Op für allow. Der Shim kanonisiert sowohl Werkzeugnamen (Kleinbuchstaben → PascalCase überOPENCODE_TOOL_MAP) als auch Tool-Input-Argumentschlüssel (camelCase → snake_case überOPENCODE_TOOL_INPUT_MAPfürRead/Write/Edit, z. B.filePath→file_path,oldString→old_string), bevor es an die Binärdatei weitergeleitet wird, sodass pfadprüfende Builtins wieblock-read-outside-cwd,block-env-filesundblock-secrets-writebei OpenCode-Tool-Aufrufen unverändert ausgelöst werden. Sitzungen werden in OpenCodes SQLite-Datenbank unter~/.local/share/opencode/opencode.dbgespeichert; der Sitzungs-Viewer des Dashboards liest sie überopencode db --format jsonundopencode export <id>. Die Unterstützung für OpenCode ist beta, während wir das Verhalten über verschiedene Versionen und mehr reale Sitzungen hinweg verifizieren. Siehe die OpenCode-Plugins-Dokumentation. - Pi (beta):
~/.pi/agent/settings.json(Benutzer),<cwd>/.pi/settings.json(Projekt) — Pi hat keinenlocal-Bereich. Pi lädt TypeScript-Erweiterungspakete beim Start; die Einstellungsdatei ist ein flaches String-Array{"packages": ["./relative/path", …]}. failproofai schreibt einen einzelnen packages-Array-Eintrag, der auf sein gebündeltespi-extension/-Verzeichnis verweist. Die Erweiterung abonniert intern Pistool_call/user_bash/input/session_start-Ereignisse und ruftfailproofai --hook <Event> --cli pials Shell-Prozess auf; der Handler kanonisiert underscore_lower_snake_case → PascalCase überPI_EVENT_MAP, sodass bestehende eingebaute Richtlinien unverändert ausgelöst werden. Tool-Input-Argumente werden ebenfalls überPI_TOOL_INPUT_MAPkanonisiert (Pis Read/Write/Edit liefernpathstattfile_path; die Abbildung des Top-Level-Schlüssels lässtblock-env-filesundblock-secrets-writeauslösen –block-read-outside-cwdhatte bereits einenpath-Fallback). Die Pi-Unterstützung ist beta, während sich Pis Erweiterungs-API und das Sitzungsprotokoll-Layout stabilisieren. - Gemini CLI (beta):
~/.gemini/settings.json(Benutzer),<cwd>/.gemini/settings.json(Projekt) — Gemini hat keinenlocal-Bereich (es dokumentiert einensystem-Bereich unter/etc/gemini-cli/settings.json, den failproofai nicht bereitstellt). Hook-Einträge verwenden Claudes{type, command, timeout}-Form, eingebettet in Geminis{matcher, hooks: [...]}-Matcher-Schema mit standardmäßigmatcher: "*". Ereignisse sind PascalCase (SessionStart,BeforeAgent,AfterAgent,BeforeModel,AfterModel,BeforeToolSelection,BeforeTool,AfterTool,PreCompress,Notification,SessionEnd); der Handler bildet sie überGEMINI_EVENT_MAPauf kanonische Claude-Namen ab. Werkzeugnamen sind snake_case (run_shell_command,read_file,write_file,replace, …) – der Handler kanonisiert überGEMINI_TOOL_MAP, sodass bestehende eingebaute Richtlinien unverändert ausgelöst werden. Der Richtlinienauswerter gibt Geminis flache{decision: "deny", reason}-Form aus (bevorzugt gemäß Geminis „Golden Rule” exit-0-Vertrag),{hookSpecificOutput: {hookEventName, additionalContext}}für Kontexteinschleusung bei BeforeAgent/AfterTool/SessionStart, und{decision: "block", reason}bei AfterAgent für Force-Retry-Semantik. Die Unterstützung für Gemini CLI ist beta, während wir die reale Abdeckung ausweiten. Siehe die Gemini CLI Hooks-Dokumentation.
- Claude Code:
policies-config.json— teilt failproofai mit, welche Richtlinien ausgewertet werden sollen und mit welchen Parametern (gilt für alle Agenten-CLIs)
--cli claude|codex|copilot|cursor|opencode|pi|gemini, um einen bestimmten Agenten auszuwählen (leerzeichen-getrennt oder mehrfach für eine beliebige Teilmenge):
--cli weggelassen wird, erkennt failproofai automatisch, welche Agenten-CLIs installiert sind (which claude / which codex / which copilot / which cursor-agent / which opencode / which pi / which gemini):
- Eine CLI erkannt — wählt diese CLI automatisch ohne Nachfrage aus.
- Mehrere CLIs erkannt in einem interaktiven Terminal — zeigt eine Pfeilauswahl-Eingabeaufforderung an, gruppiert in einen Abschnitt
Erkannt (N)(mit einer aggregierten ZeileFür alle N erkannten installieren+ jede erkannte CLI einzeln) und einen AbschnittNicht installiert (M) · Hooks vorab installieren, der jede nicht erkannte unterstützte CLI als Vorab-Installationsoption aufführt (↑↓ zum Bewegen, Enter zum Auswählen, ^C zum Beenden). Der Deinstallationsablauf zeigt nur den Abschnitt „Erkannt”. - Mehrere CLIs erkannt in einer nicht-interaktiven Ausführung (CI, kein TTY) — installiert für alle erkannten CLIs ohne Nachfrage.
- Keine erkannt — fällt auf
claudezurück, mit einer Warnung, dass keine Agenten-Binärdatei im PATH gefunden wurde; der Hook-Befehl wird dennoch geschrieben, sodass er aktiviert wird, sobald Sie eine installieren.
policies-config.json jederzeit direkt bearbeiten; Änderungen treten sofort beim nächsten Hook-Ereignis in Kraft, ohne dass ein Neustart erforderlich ist.
Beispiel: Konfiguration auf Projektebene mit Team-Standardwerten
Committen Sie.failproofai/policies-config.json in Ihr Repository:
.failproofai/policies-config.local.json (per gitignore ausgeschlossen) für persönliche Überschreibungen erstellen, ohne Teamkollegen zu beeinflussen.
