allow, deny, instruct que les politiques intégrées.
Exemple rapide
Deux façons de charger des politiques personnalisées
Option 1 : Par convention (recommandée)
Déposez des fichiers*policies.{js,mjs,ts} dans .failproofai/policies/ et ils sont chargés automatiquement — aucun indicateur ni modification de configuration nécessaire. Cela fonctionne comme les hooks git : déposez un fichier, ça marche tout seul.
- Les répertoires projet et utilisateur sont tous deux analysés (union — pas de priorité au premier scope trouvé)
- Les fichiers sont chargés par ordre alphabétique dans chaque répertoire. Préfixez avec
01-,02-pour contrôler l’ordre - Seuls les fichiers correspondant à
*policies.{js,mjs,ts}sont chargés ; les autres fichiers sont ignorés - Chaque fichier est chargé indépendamment (fail-open par fichier)
- Fonctionne conjointement avec
--customexplicite et les politiques intégrées
Option 2 : Chemin de fichier explicite
policies-config.json sous la clé customPoliciesPath. Le fichier est chargé à nouveau à chaque événement de hook - il n’y a pas de mise en cache entre les événements.
Utiliser les deux ensemble
Les politiques par convention et le fichier--custom explicite peuvent coexister. Ordre de chargement :
- Fichier
customPoliciesPathexplicite (si configuré) - Fichiers de convention du projet (
{cwd}/.failproofai/policies/, alphabétique) - Fichiers de convention utilisateur (
~/.failproofai/policies/, alphabétique)
API
Import
customPolicies.add(hook)
Enregistre une politique. Appelez cette méthode autant de fois que nécessaire pour plusieurs politiques dans le même fichier.
Fonctions d’aide aux décisions
deny(message) - le message apparaît dans Claude précédé de "Blocked by failproofai:". Un seul deny court-circuite toute évaluation ultérieure.
instruct(message) - le message est ajouté au contexte de Claude pour l’appel d’outil en cours. Tous les messages instruct sont accumulés et délivrés ensemble.
Messages allow informationnels
allow(message) autorise l’opération et envoie un message informationnel à Claude. Le message est délivré en tant que additionalContext dans la réponse stdout du gestionnaire de hook — le même mécanisme que instruct, mais sémantiquement différent : c’est une mise à jour de statut, pas un avertissement.
Cas d’utilisation :
- Confirmations de statut :
allow("All CI checks passed.")— indique à Claude que tout est au vert - Explications fail-open :
allow("GitHub CLI not installed, skipping CI check.")— indique à Claude pourquoi une vérification a été ignorée pour qu’il dispose du contexte complet - Accumulation de plusieurs messages : si plusieurs politiques retournent chacune
allow(message), tous les messages sont joints avec des sauts de ligne et délivrés ensemble
Champs de PolicyContext
Champs de SessionMetadata
Types d’événements
Ordre d’évaluation
Les politiques sont évaluées dans cet ordre :- Politiques intégrées (dans l’ordre de définition)
- Politiques personnalisées explicites depuis
customPoliciesPath(dans l’ordre des.add()) - Politiques de convention du projet
.failproofai/policies/(fichiers alphabétiques, ordre.add()à l’intérieur) - Politiques de convention utilisateur
~/.failproofai/policies/(fichiers alphabétiques, ordre.add()à l’intérieur)
Le premier
deny court-circuite toutes les politiques suivantes. Tous les messages instruct sont accumulés et délivrés ensemble.Imports transitifs
Les fichiers de politiques personnalisées peuvent importer des modules locaux en utilisant des chemins relatifs :from "failproofai" vers le chemin dist réel et en créant des fichiers .mjs temporaires pour assurer la compatibilité ESM.
Filtrage par type d’événement
Utilisezmatch.events pour limiter le déclenchement d’une politique :
match entièrement pour se déclencher sur chaque type d’événement.
Gestion des erreurs et modes d’échec
Les politiques personnalisées sont fail-open : les erreurs ne bloquent jamais les politiques intégrées et ne font pas planter le gestionnaire de hook.Exemple complet : plusieurs politiques
Exemples
Le répertoireexamples/ contient des fichiers de politiques prêts à l’emploi :

