Konfigurationsscopes
Es gibt drei Konfigurationsscopes, die in Prioritätsreihenfolge ausgewertet werden:
Wenn failproofai ein Hook-Ereignis empfängt, lädt und führt es alle drei Dateien zusammen, die für das aktuelle Arbeitsverzeichnis existieren.
Zusammenführungsregeln
enabledPolicies – die Vereinigung aller drei Scopes. Eine Richtlinie, die auf irgendeiner Ebene aktiviert ist, ist aktiv.
policyParams – der erste Scope, der Parameter für eine bestimmte Richtlinie definiert, gewinnt vollständig. Es gibt kein tiefes Zusammenführen von Werten innerhalb der Parameter einer Richtlinie.
customPoliciesPath – der erste Scope, der diesen definiert, gewinnt.
llm – der erste Scope, der diesen definiert, gewinnt.
Konfigurationsdateiformat
Feldreferenz
enabledPolicies
Typ: string[]
Liste der zu aktivierenden Richtliniennamen. Die Namen müssen exakt mit den Richtlinienbezeichnern übereinstimmen, die failproofai policies anzeigt. 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>>
Richtlinienspezifische Parameterüberschreibungen. 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 integrierten Standardwerte der Richtlinie verwendet. Benutzer, die policyParams überhaupt nicht konfigurieren, erhalten dasselbe Verhalten wie in früheren Versionen.
Unbekannte Schlüssel im Parameterblock einer Richtlinie werden zum Zeitpunkt des Hook-Aufrufs stillschweigend ignoriert, aber bei der Ausführung von failproofai policies als Warnungen markiert.
hint (übergreifend)
Typ: string (optional)
Eine Nachricht, die an den Grund angehängt wird, wenn eine Richtlinie deny oder instruct zurückgibt. Damit können Sie Claude handlungsrelevante Hinweise 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 Details zur Erstellung finden Sie unter Benutzerdefinierte Richtlinien.
Konventionsbasierte Richtlinien
Zusätzlich zum explizitencustomPoliciesPath erkennt und lädt failproofai automatisch Richtliniendateien aus .failproofai/policies/-Verzeichnissen:
Dateiabgleich: Es werden nur Dateien geladen, die dem Muster
*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 erkannt.
Vereinigtes Laden: Sowohl das Projekt- als auch das Benutzerkonventionsverzeichnis werden durchsucht. Alle passenden Dateien aus beiden Ebenen werden geladen (im Gegensatz zu customPoliciesPath, das das Prinzip „erster Scope 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 Ihrer Agenten-CLI (die Hook-Einstiegspunkte), während policies-config.json die Datei ist, die Sie direkt verwalten. Die beiden sind voneinander getrennt:
- Agenten-CLI-Einstellungen – weist den Agenten an, bei jeder Toolnutzung
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-Scope - GitHub Copilot CLI (beta):
~/.copilot/hooks/failproofai.json(Benutzer),<cwd>/.github/hooks/failproofai.json(Projekt) – Copilot hat keinenlocal-Scope. Hook-Einträge verwenden Copilots betriebssystemspezifischebash/powershell-Befehlsfelder mittimeoutSec; die Datei enthält einenversion: 1-Marker auf oberster Ebene. Die Unterstützung von Copilot CLI ist beta, während wir dasevents.jsonl-Aufzeichnungsschema (das in der öffentlichen Dokumentation nicht spezifiziert ist) anhand weiterer realer Sitzungen überprüfen. - Cursor Agent (beta):
~/.cursor/hooks.json(Benutzer),<cwd>/.cursor/hooks.json(Projekt) – Cursor hat keinenlocal-Scope. Hook-Einträge verwenden die Claude-ähnliche{type, command, timeout}-Form (ohnebash/powershell-Aufteilung), werden aber unter camelCase-Ereignisschlüsseln (preToolUse,beforeSubmitPrompt, …) in einem flachen Array gemäß Cursors Hooks-Schema gespeichert; die Datei enthält einenversion: 1-Marker auf oberster Ebene. Der Handler kanonisiert camelCase → PascalCase überCURSOR_EVENT_MAP, sodass bestehende integrierte Richtlinien unverändert ausgelöst werden. Die Unterstützung von Cursor Agent ist beta, während wir Cursors On-Disk-Transkriptformat (in der öffentlichen Dokumentation nicht spezifiziert) anhand weiterer realer Installationen überprüfen. - 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-Scope. Im Gegensatz zu den anderen fünf CLIs verfügt OpenCode über kein externes Befehls-Hook-System: Es lädt In-Process-JS/TS-Plugins, die explizit über dasplugin: []-Array inopencode.jsonregistriert werden (automatische Erkennung aus.opencode/plugins/ist nicht die Art, wie Plugins in opencode v1.14.33 geladen werden). Die Installation legt ein kleines generiertes Plugin-Shim ab, das den failproofai-Binary als Subprozess aufruft und die JSON-Antwort im Claude-Format des Binaries 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/SubagentStopdeny (reicht den Ablehnungsgrund als nächste Benutzernachricht ein – der einzige Force-Retry-Kanal, dasession.idlenur eine Benachrichtigung ist und das Werfen einer Exception dort ein No-op ist), und No-op für allow. Das Shim kanonisiert sowohl Tool-Namen (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 das Binary weiterleitet, 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 Session-Viewer des Dashboards liest sie überopencode db --format jsonundopencode export <id>. Die OpenCode-Unterstützung ist beta, während wir das Verhalten versionsübergreifend und anhand weiterer realer Sitzungen überprüfen. Siehe die OpenCode-Plugin-Dokumentation. - Pi (beta):
~/.pi/agent/settings.json(Benutzer),<cwd>/.pi/settings.json(Projekt) – Pi hat keinenlocal-Scope. 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 zeigt. Die Erweiterung abonniert intern Pistool_call/user_bash/input/session_start-Ereignisse und ruftfailproofai --hook <Event> --cli pials Shell-Befehl auf; der Handler kanonisiert Ereignisse überPI_EVENT_MAPvon underscore_lower_snake_case → PascalCase, sodass bestehende integrierte Richtlinien unverändert ausgelöst werden. Tool-Input-Argumente werden ebenfalls überPI_TOOL_INPUT_MAPkanonisiert (Pis Read / Write / Edit liefernpathstattfile_path; die Zuordnung des obersten 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 Sitzungslog-Layout stabilisieren. - Hermes (hermes-agent):
~/.hermes/config.yaml(nur Benutzer-Scope – Hermes hat keine Projekt-/lokale Konfiguration). Hermes ist ein Slack/Telegram-Gateway, daher fängt eine Installation Tool-Aufrufe von jeder Plattform (Slack/Telegram/cli/cron) und internen Subagenten ab. Hook-Einträge sind ein{command, timeout}-Paar (Timeout in Sekunden) unter einemhooks:-Map, der nach Hermes’ snake_case-Ereignissen (pre_tool_call/post_tool_call/on_session_start/on_session_end/subagent_stop) geordnet ist; der Handler kanonisiert Ereignisse überHERMES_EVENT_MAPund Tool-Namen überHERMES_TOOL_MAP, sodass integrierte Richtlinien unverändert ausgelöst werden. Die Konfiguration wird durch einen kommentarerhaltenden YAML-Document-Round-trip bearbeitet, sodass die anderen Einstellungen des Betreibers erhalten bleiben, und die Installation setzthooks_auto_accept: true, sodass das kopflose Gateway (kein TTY) die Hooks ohne Zustimmungsaufforderung ausführt. Der Auswerter gibt Hermes’ stdout-Vertrag{"decision":"block","reason"}aus (Hermes ignoriert Exit-Codes). Einschränkungen: Hermes hat kein turn-end-Stop-Ereignis, daher werden dierequire-*-before-stop-Builtins für Hermes nie ausgelöst (nicht anwendbar, nicht defekt);instructwird zu allow-with-logged-note herabgestuft (kein additional-context-Kanal); und Output-Secret-Redaktion (sanitize-*) kann Tool-Output über den Shell-Hook-Vertrag nicht umschreiben. Hermes ist auch eine Offline-Audit-Quelle – das Dashboard liest seine Gateway-Sitzungen direkt aus~/.hermes/state.db.
- Claude Code:
policies-config.json– teilt failproofai mit, welche Richtlinien ausgewertet werden sollen und mit welchen Parametern (geteilt über alle Agenten-CLIs)
--cli claude|codex|copilot|cursor|opencode|pi|hermes, um einen bestimmten Agenten anzusprechen (durch Leerzeichen getrennt oder wiederholt 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 hermes):
- Eine CLI erkannt – wählt diese CLI automatisch ohne Rückfrage aus.
- Mehrere CLIs erkannt in einem interaktiven Terminal – zeigt eine Einzelauswahl-Eingabeaufforderung mit Pfeiltasten an, die in einen Abschnitt
Erkannt (N)(mit einerFür alle N erkannten installieren-Sammelzeile + jeder erkannten CLI einzeln) und einen AbschnittNicht installiert (M) · Hooks vorab installierenunterteilt ist, der alle nicht erkannten unterstützten CLIs als Vorwärts-Installationsoption auflistet (↑↓ zum Bewegen, Enter zum Auswählen, ^C zum Beenden). Der Deinstallationsablauf zeigt nur den Abschnitt „Erkannt” an. - Mehrere CLIs erkannt in einem nicht-interaktiven Lauf (CI, kein TTY) – installiert für alle erkannten CLIs ohne Rückfrage.
- Keine erkannt – fällt auf
claudezurück, mit einer Warnung, dass kein Agenten-Binary im PATH gefunden wurde; der Hook-Befehl wird trotzdem geschrieben, sodass er aktiviert wird, sobald Sie einen 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 Overrides erstellen, ohne Teammitglieder zu beeinflussen.
