failproofai 0.0.6-beta.1 → 0.0.6-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.failproofai/policies/review-policies.mjs +4 -3
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g72weg._.js +1 -1
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0~kmh8w._.js → [root-of-the-server]__05akje6._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0rh.18_._.js → [root-of-the-server]__0i5kvry._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +9 -9
- package/.next/standalone/.next/static/chunks/{08t08igdql9yt.js → 00j0rr7rh8ef8.js} +1 -1
- package/.next/standalone/.next/static/chunks/{12~yi9oj8av8p.js → 05j1px0r8yzh6.js} +2 -2
- package/.next/standalone/.next/static/chunks/{09_k80d~cq2wg.js → 0badv41uxa56..js} +1 -1
- package/.next/standalone/.next/static/chunks/{0wlyoif4_kj_t.js → 0ijk_kek9_wyx.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0bvhsa6zva2o..js → 0ksdlt_1hucdm.js} +1 -1
- package/.next/standalone/.next/static/chunks/{03rz6ykw-a2xi.js → 0npb~873.wvg3.js} +1 -1
- package/.next/standalone/.next/static/chunks/{01b~z8f1ws0rk.js → 0xpl.oscrakvx.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0gbf4cphy8ksq.js → 1052sguyd-.ka.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0v.yd0kg_ld3r.js → 14cl9poem30dq.js} +1 -1
- package/.next/standalone/CHANGELOG.md +11 -0
- package/.next/standalone/dist/cli.mjs +3 -3
- package/.next/standalone/docs/ar/built-in-policies.mdx +124 -87
- package/.next/standalone/docs/ar/custom-policies.mdx +72 -72
- package/.next/standalone/docs/ar/examples.mdx +86 -33
- package/.next/standalone/docs/ar/getting-started.mdx +82 -29
- package/.next/standalone/docs/built-in-policies.mdx +1 -1
- package/.next/standalone/docs/de/built-in-policies.mdx +93 -56
- package/.next/standalone/docs/de/custom-policies.mdx +56 -56
- package/.next/standalone/docs/de/examples.mdx +72 -18
- package/.next/standalone/docs/de/getting-started.mdx +72 -20
- package/.next/standalone/docs/es/built-in-policies.mdx +115 -78
- package/.next/standalone/docs/es/custom-policies.mdx +55 -55
- package/.next/standalone/docs/es/examples.mdx +73 -19
- package/.next/standalone/docs/es/getting-started.mdx +72 -20
- package/.next/standalone/docs/fr/built-in-policies.mdx +83 -46
- package/.next/standalone/docs/fr/custom-policies.mdx +51 -51
- package/.next/standalone/docs/fr/examples.mdx +78 -24
- package/.next/standalone/docs/fr/getting-started.mdx +65 -13
- package/.next/standalone/docs/he/built-in-policies.mdx +156 -117
- package/.next/standalone/docs/he/custom-policies.mdx +75 -75
- package/.next/standalone/docs/he/examples.mdx +87 -33
- package/.next/standalone/docs/he/getting-started.mdx +84 -33
- package/.next/standalone/docs/hi/built-in-policies.mdx +101 -60
- package/.next/standalone/docs/hi/custom-policies.mdx +71 -70
- package/.next/standalone/docs/hi/examples.mdx +90 -36
- package/.next/standalone/docs/hi/getting-started.mdx +80 -27
- package/.next/standalone/docs/i18n/README.ar.md +69 -69
- package/.next/standalone/docs/i18n/README.de.md +46 -46
- package/.next/standalone/docs/i18n/README.es.md +42 -42
- package/.next/standalone/docs/i18n/README.fr.md +39 -39
- package/.next/standalone/docs/i18n/README.he.md +83 -83
- package/.next/standalone/docs/i18n/README.hi.md +69 -69
- package/.next/standalone/docs/i18n/README.it.md +72 -72
- package/.next/standalone/docs/i18n/README.ja.md +71 -71
- package/.next/standalone/docs/i18n/README.ko.md +52 -52
- package/.next/standalone/docs/i18n/README.pt-br.md +44 -44
- package/.next/standalone/docs/i18n/README.ru.md +66 -66
- package/.next/standalone/docs/i18n/README.tr.md +82 -83
- package/.next/standalone/docs/i18n/README.vi.md +70 -71
- package/.next/standalone/docs/i18n/README.zh.md +51 -51
- package/.next/standalone/docs/it/built-in-policies.mdx +118 -81
- package/.next/standalone/docs/it/custom-policies.mdx +69 -69
- package/.next/standalone/docs/it/examples.mdx +93 -39
- package/.next/standalone/docs/it/getting-started.mdx +73 -21
- package/.next/standalone/docs/ja/built-in-policies.mdx +98 -61
- package/.next/standalone/docs/ja/custom-policies.mdx +71 -71
- package/.next/standalone/docs/ja/examples.mdx +76 -22
- package/.next/standalone/docs/ja/getting-started.mdx +65 -13
- package/.next/standalone/docs/ko/built-in-policies.mdx +137 -100
- package/.next/standalone/docs/ko/custom-policies.mdx +67 -67
- package/.next/standalone/docs/ko/examples.mdx +87 -33
- package/.next/standalone/docs/ko/getting-started.mdx +61 -9
- package/.next/standalone/docs/pt-br/built-in-policies.mdx +94 -57
- package/.next/standalone/docs/pt-br/custom-policies.mdx +56 -56
- package/.next/standalone/docs/pt-br/examples.mdx +78 -24
- package/.next/standalone/docs/pt-br/getting-started.mdx +64 -12
- package/.next/standalone/docs/ru/built-in-policies.mdx +142 -105
- package/.next/standalone/docs/ru/custom-policies.mdx +82 -81
- package/.next/standalone/docs/ru/examples.mdx +77 -22
- package/.next/standalone/docs/ru/getting-started.mdx +74 -22
- package/.next/standalone/docs/tr/built-in-policies.mdx +104 -67
- package/.next/standalone/docs/tr/custom-policies.mdx +59 -60
- package/.next/standalone/docs/tr/examples.mdx +97 -42
- package/.next/standalone/docs/tr/getting-started.mdx +75 -23
- package/.next/standalone/docs/vi/built-in-policies.mdx +110 -72
- package/.next/standalone/docs/vi/custom-policies.mdx +68 -68
- package/.next/standalone/docs/vi/examples.mdx +93 -38
- package/.next/standalone/docs/vi/getting-started.mdx +74 -22
- package/.next/standalone/docs/zh/built-in-policies.mdx +132 -95
- package/.next/standalone/docs/zh/custom-policies.mdx +49 -49
- package/.next/standalone/docs/zh/examples.mdx +90 -36
- package/.next/standalone/docs/zh/getting-started.mdx +73 -21
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/src/hooks/builtin-policies.ts +5 -1
- package/dist/cli.mjs +3 -3
- package/package.json +1 -1
- package/src/hooks/builtin-policies.ts +5 -1
- /package/.next/standalone/.next/static/{CkmOT-ZvDN-sVULinGVKT → A9pNTZdoYJTVyPAYwQMx5}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{CkmOT-ZvDN-sVULinGVKT → A9pNTZdoYJTVyPAYwQMx5}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{CkmOT-ZvDN-sVULinGVKT → A9pNTZdoYJTVyPAYwQMx5}/_ssgManifest.js +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Politiques personnalisées
|
|
3
|
-
description: "
|
|
3
|
+
description: "Rédigez vos propres politiques en JavaScript — appliquez des conventions de projet, évitez la dérive, détectez les échecs, intégrez des systèmes externes"
|
|
4
4
|
icon: code
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Les politiques personnalisées vous permettent d'écrire des règles pour n'importe quel comportement d'agent : appliquer des conventions de projet, prévenir la dérive,
|
|
7
|
+
Les politiques personnalisées vous permettent d'écrire des règles pour n'importe quel comportement d'agent : appliquer des conventions de projet, prévenir la dérive, contrôler les opérations destructrices, détecter les agents bloqués, ou s'intégrer avec Slack, des workflows d'approbation, et plus encore. Elles utilisent le même système d'événements hook et les mêmes décisions `allow`, `deny`, `instruct` que les politiques intégrées.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -29,7 +29,7 @@ customPolicies.add({
|
|
|
29
29
|
});
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Installez-le :
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
35
|
failproofai policies --install --custom ./my-policies.js
|
|
@@ -39,12 +39,12 @@ failproofai policies --install --custom ./my-policies.js
|
|
|
39
39
|
|
|
40
40
|
## Deux façons de charger des politiques personnalisées
|
|
41
41
|
|
|
42
|
-
### Option 1 :
|
|
42
|
+
### Option 1 : Par convention (recommandé)
|
|
43
43
|
|
|
44
|
-
Déposez des fichiers `*policies.{js,mjs,ts}` dans `.failproofai/policies/` et ils sont automatiquement
|
|
44
|
+
Déposez des fichiers `*policies.{js,mjs,ts}` dans `.failproofai/policies/` et ils sont chargés automatiquement — sans indicateurs ni modifications de configuration. Cela fonctionne comme les hooks git : déposez un fichier, ça fonctionne.
|
|
45
45
|
|
|
46
46
|
```
|
|
47
|
-
# Niveau projet —
|
|
47
|
+
# Niveau projet — commité dans git, partagé avec l'équipe
|
|
48
48
|
.failproofai/policies/security-policies.mjs
|
|
49
49
|
.failproofai/policies/workflow-policies.mjs
|
|
50
50
|
|
|
@@ -52,15 +52,15 @@ Déposez des fichiers `*policies.{js,mjs,ts}` dans `.failproofai/policies/` et i
|
|
|
52
52
|
~/.failproofai/policies/my-policies.mjs
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
**
|
|
56
|
-
- Les répertoires
|
|
55
|
+
**Comment ça fonctionne :**
|
|
56
|
+
- Les répertoires projet et utilisateur sont tous deux analysés (union — pas de priorité par périmètre)
|
|
57
57
|
- Les fichiers sont chargés par ordre alphabétique dans chaque répertoire. Préfixez avec `01-`, `02-` pour contrôler l'ordre
|
|
58
58
|
- Seuls les fichiers correspondant à `*policies.{js,mjs,ts}` sont chargés ; les autres fichiers sont ignorés
|
|
59
59
|
- Chaque fichier est chargé indépendamment (fail-open par fichier)
|
|
60
|
-
- Fonctionne
|
|
60
|
+
- Fonctionne avec les politiques `--custom` explicites et les politiques intégrées
|
|
61
61
|
|
|
62
62
|
<Tip>
|
|
63
|
-
Les politiques par convention sont le moyen le plus simple de
|
|
63
|
+
Les politiques par convention sont le moyen le plus simple de définir un standard de qualité pour votre organisation. Commitez `.failproofai/policies/` dans git et chaque membre de l'équipe obtient les mêmes règles automatiquement — aucune configuration individuelle requise. Au fil des découvertes de nouveaux modes d'échec, ajoutez une politique et poussez. Ces politiques deviennent avec le temps un standard de qualité vivant qui s'améliore à chaque contribution.
|
|
64
64
|
</Tip>
|
|
65
65
|
|
|
66
66
|
### Option 2 : Chemin de fichier explicite
|
|
@@ -72,11 +72,11 @@ failproofai policies --install --custom ./my-policies.js
|
|
|
72
72
|
# Remplacer le chemin du fichier de politiques
|
|
73
73
|
failproofai policies --install --custom ./new-policies.js
|
|
74
74
|
|
|
75
|
-
# Supprimer le chemin
|
|
75
|
+
# Supprimer le chemin des politiques personnalisées de la configuration
|
|
76
76
|
failproofai policies --uninstall --custom
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
Le chemin absolu résolu est stocké dans `policies-config.json` sous `customPoliciesPath`. Le fichier est chargé à nouveau à chaque événement
|
|
79
|
+
Le chemin absolu résolu est stocké dans `policies-config.json` sous `customPoliciesPath`. Le fichier est chargé à nouveau à chaque événement hook — il n'y a pas de mise en cache entre les événements.
|
|
80
80
|
|
|
81
81
|
### Utiliser les deux ensemble
|
|
82
82
|
|
|
@@ -84,7 +84,7 @@ Les politiques par convention et le fichier `--custom` explicite peuvent coexist
|
|
|
84
84
|
|
|
85
85
|
1. Fichier `customPoliciesPath` explicite (si configuré)
|
|
86
86
|
2. Fichiers de convention du projet (`{cwd}/.failproofai/policies/`, alphabétique)
|
|
87
|
-
3. Fichiers de convention
|
|
87
|
+
3. Fichiers de convention utilisateur (`~/.failproofai/policies/`, alphabétique)
|
|
88
88
|
|
|
89
89
|
---
|
|
90
90
|
|
|
@@ -102,7 +102,7 @@ Enregistre une politique. Appelez cette fonction autant de fois que nécessaire
|
|
|
102
102
|
|
|
103
103
|
```ts
|
|
104
104
|
customPolicies.add({
|
|
105
|
-
name: string; //
|
|
105
|
+
name: string; // requis - identifiant unique
|
|
106
106
|
description?: string; // affiché dans la sortie de `failproofai policies`
|
|
107
107
|
match?: { events?: HookEventType[] }; // filtrer par type d'événement ; omettre pour tout correspondre
|
|
108
108
|
fn: (ctx: PolicyContext) => PolicyResult | Promise<PolicyResult>;
|
|
@@ -117,26 +117,26 @@ customPolicies.add({
|
|
|
117
117
|
| `deny(message)` | Bloque l'opération | L'agent ne doit pas effectuer cette action |
|
|
118
118
|
| `instruct(message)` | Ajoute du contexte sans bloquer | Donner à l'agent un contexte supplémentaire pour rester sur la bonne voie |
|
|
119
119
|
|
|
120
|
-
`deny(message)` — le message apparaît à Claude préfixé
|
|
120
|
+
`deny(message)` — le message apparaît à Claude préfixé de `"Blocked by failproofai:"`. Un seul `deny` court-circuite toute évaluation ultérieure.
|
|
121
121
|
|
|
122
|
-
`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
|
|
122
|
+
`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 transmis ensemble.
|
|
123
123
|
|
|
124
124
|
<Tip>
|
|
125
|
-
Vous pouvez ajouter des
|
|
125
|
+
Vous pouvez ajouter des instructions supplémentaires à n'importe quel message `deny` ou `instruct` en ajoutant un champ `hint` dans `policyParams` — sans modification de code. Cela fonctionne également pour les politiques personnalisées (`custom/`), par convention de projet (`.failproofai-project/`) et par convention utilisateur (`.failproofai-user/`). Consultez [Configuration → hint](/fr/configuration#hint-cross-cutting) pour plus de détails.
|
|
126
126
|
</Tip>
|
|
127
127
|
|
|
128
|
-
### Messages
|
|
128
|
+
### Messages allow informatifs
|
|
129
129
|
|
|
130
|
-
`allow(message)` autorise l'opération **et** envoie un message informatif à Claude. Le message est
|
|
130
|
+
`allow(message)` autorise l'opération **et** envoie un message informatif à Claude. Le message est transmis en tant qu'`additionalContext` dans la réponse stdout du gestionnaire de hook — le même mécanisme utilisé par `instruct`, mais sémantiquement différent : c'est une mise à jour de statut, pas un avertissement.
|
|
131
131
|
|
|
132
132
|
| Fonction | Effet | Utiliser quand |
|
|
133
133
|
|----------|--------|----------|
|
|
134
|
-
| `allow(message)` |
|
|
134
|
+
| `allow(message)` | Autorise et envoie du contexte à Claude | Confirmer qu'une vérification a réussi, ou expliquer pourquoi une vérification a été ignorée |
|
|
135
135
|
|
|
136
|
-
Cas d'
|
|
136
|
+
Cas d'usage :
|
|
137
137
|
- **Confirmations de statut :** `allow("All CI checks passed.")` — indique à Claude que tout est en ordre
|
|
138
138
|
- **Explications fail-open :** `allow("GitHub CLI not installed, skipping CI check.")` — indique à Claude pourquoi une vérification a été ignorée afin qu'il dispose du contexte complet
|
|
139
|
-
- **Accumulation de plusieurs messages :** si plusieurs politiques retournent chacune `allow(message)`, tous les messages sont joints
|
|
139
|
+
- **Accumulation de plusieurs messages :** si plusieurs politiques retournent chacune `allow(message)`, tous les messages sont joints avec des sauts de ligne et transmis ensemble
|
|
140
140
|
|
|
141
141
|
```js
|
|
142
142
|
customPolicies.add({
|
|
@@ -162,7 +162,7 @@ customPolicies.add({
|
|
|
162
162
|
| `eventType` | `string` | `"PreToolUse"`, `"PostToolUse"`, `"Notification"`, `"Stop"` |
|
|
163
163
|
| `toolName` | `string \| undefined` | L'outil appelé (ex. `"Bash"`, `"Write"`, `"Read"`) |
|
|
164
164
|
| `toolInput` | `Record<string, unknown> \| undefined` | Les paramètres d'entrée de l'outil |
|
|
165
|
-
| `payload` | `Record<string, unknown>` | Charge utile brute complète de l'événement
|
|
165
|
+
| `payload` | `Record<string, unknown>` | Charge utile brute complète de l'événement depuis Claude Code |
|
|
166
166
|
| `session` | `SessionMetadata \| undefined` | Contexte de session (voir ci-dessous) |
|
|
167
167
|
|
|
168
168
|
### Champs de `SessionMetadata`
|
|
@@ -177,8 +177,8 @@ customPolicies.add({
|
|
|
177
177
|
|
|
178
178
|
| Événement | Quand il se déclenche | Contenu de `toolInput` |
|
|
179
179
|
|-------|--------------|----------------------|
|
|
180
|
-
| `PreToolUse` | Avant
|
|
181
|
-
| `PostToolUse` | Après
|
|
180
|
+
| `PreToolUse` | Avant qu'un outil soit exécuté par Claude | L'entrée de l'outil (ex. `{ command: "..." }` pour Bash) |
|
|
181
|
+
| `PostToolUse` | Après la fin d'un outil | L'entrée de l'outil + `tool_result` (la sortie) |
|
|
182
182
|
| `Notification` | Quand Claude envoie une notification | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }` — les hooks doivent toujours retourner `allow()`, ils ne peuvent pas bloquer les notifications |
|
|
183
183
|
| `Stop` | Quand la session Claude se termine | Vide |
|
|
184
184
|
|
|
@@ -189,19 +189,19 @@ customPolicies.add({
|
|
|
189
189
|
Les politiques sont évaluées dans cet ordre :
|
|
190
190
|
|
|
191
191
|
1. Politiques intégrées (dans l'ordre de définition)
|
|
192
|
-
2. Politiques personnalisées explicites depuis `customPoliciesPath` (dans l'ordre `.add()`)
|
|
192
|
+
2. Politiques personnalisées explicites depuis `customPoliciesPath` (dans l'ordre de `.add()`)
|
|
193
193
|
3. Politiques de convention du projet `.failproofai/policies/` (fichiers alphabétiques, ordre `.add()` à l'intérieur)
|
|
194
|
-
4. Politiques de convention
|
|
194
|
+
4. Politiques de convention utilisateur `~/.failproofai/policies/` (fichiers alphabétiques, ordre `.add()` à l'intérieur)
|
|
195
195
|
|
|
196
196
|
<Note>
|
|
197
|
-
Le premier `deny` court-circuite toutes les politiques suivantes. Tous les messages `instruct` sont accumulés et
|
|
197
|
+
Le premier `deny` court-circuite toutes les politiques suivantes. Tous les messages `instruct` sont accumulés et transmis ensemble.
|
|
198
198
|
</Note>
|
|
199
199
|
|
|
200
200
|
---
|
|
201
201
|
|
|
202
202
|
## Imports transitifs
|
|
203
203
|
|
|
204
|
-
Les fichiers de politiques personnalisées peuvent importer des modules locaux
|
|
204
|
+
Les fichiers de politiques personnalisées peuvent importer des modules locaux via des chemins relatifs :
|
|
205
205
|
|
|
206
206
|
```js
|
|
207
207
|
// my-policies.js
|
|
@@ -218,13 +218,13 @@ customPolicies.add({
|
|
|
218
218
|
});
|
|
219
219
|
```
|
|
220
220
|
|
|
221
|
-
Tous les imports relatifs accessibles depuis le fichier d'entrée sont résolus. Ceci est implémenté en réécrivant les imports `from "failproofai"` vers le chemin dist réel et en créant des fichiers `.mjs` temporaires pour
|
|
221
|
+
Tous les imports relatifs accessibles depuis le fichier d'entrée sont résolus. Ceci est implémenté en réécrivant les imports `from "failproofai"` vers le chemin dist réel et en créant des fichiers `.mjs` temporaires pour assurer la compatibilité ESM.
|
|
222
222
|
|
|
223
223
|
---
|
|
224
224
|
|
|
225
225
|
## Filtrage par type d'événement
|
|
226
226
|
|
|
227
|
-
Utilisez `match.events` pour limiter
|
|
227
|
+
Utilisez `match.events` pour limiter le déclenchement d'une politique :
|
|
228
228
|
|
|
229
229
|
```js
|
|
230
230
|
customPolicies.add({
|
|
@@ -238,23 +238,23 @@ customPolicies.add({
|
|
|
238
238
|
});
|
|
239
239
|
```
|
|
240
240
|
|
|
241
|
-
Omettez `match` entièrement pour se déclencher
|
|
241
|
+
Omettez `match` entièrement pour se déclencher sur chaque type d'événement.
|
|
242
242
|
|
|
243
243
|
---
|
|
244
244
|
|
|
245
|
-
## Gestion des erreurs et modes
|
|
245
|
+
## Gestion des erreurs et modes d'échec
|
|
246
246
|
|
|
247
|
-
Les politiques personnalisées sont **fail-open** : les erreurs ne bloquent jamais les politiques intégrées
|
|
247
|
+
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.
|
|
248
248
|
|
|
249
|
-
|
|
|
249
|
+
| Échec | Comportement |
|
|
250
250
|
|---------|----------|
|
|
251
|
-
| `customPoliciesPath` non défini | Aucune politique personnalisée explicite
|
|
251
|
+
| `customPoliciesPath` non défini | Aucune politique personnalisée explicite n'est exécutée ; les politiques par convention et intégrées continuent normalement |
|
|
252
252
|
| Fichier introuvable | Avertissement consigné dans `~/.failproofai/hook.log` ; les politiques intégrées continuent |
|
|
253
|
-
| Erreur de syntaxe/import (explicite) | Erreur consignée dans `~/.failproofai/hook.log` ;
|
|
254
|
-
| Erreur de syntaxe/import (convention) | Erreur consignée ; ce fichier est ignoré, les autres fichiers de convention
|
|
253
|
+
| Erreur de syntaxe/import (explicite) | Erreur consignée dans `~/.failproofai/hook.log` ; politiques personnalisées explicites ignorées |
|
|
254
|
+
| Erreur de syntaxe/import (convention) | Erreur consignée ; ce fichier est ignoré, les autres fichiers de convention sont toujours chargés |
|
|
255
255
|
| `fn` lève une exception à l'exécution | Erreur consignée ; ce hook est traité comme `allow` ; les autres hooks continuent |
|
|
256
|
-
| `fn` prend plus de 10
|
|
257
|
-
| Répertoire de convention manquant | Aucune politique de convention
|
|
256
|
+
| `fn` prend plus de 10 secondes | Timeout consigné ; traité comme `allow` |
|
|
257
|
+
| Répertoire de convention manquant | Aucune politique de convention n'est exécutée ; aucune erreur |
|
|
258
258
|
|
|
259
259
|
<Tip>
|
|
260
260
|
Pour déboguer les erreurs de politiques personnalisées, surveillez le fichier de log :
|
|
@@ -272,7 +272,7 @@ tail -f ~/.failproofai/hook.log
|
|
|
272
272
|
// my-policies.js
|
|
273
273
|
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
274
274
|
|
|
275
|
-
//
|
|
275
|
+
// Empêche l'agent d'écrire dans le répertoire secrets/
|
|
276
276
|
customPolicies.add({
|
|
277
277
|
name: "block-secrets-dir",
|
|
278
278
|
description: "Prevent agent from writing to secrets/ directory",
|
|
@@ -285,7 +285,7 @@ customPolicies.add({
|
|
|
285
285
|
},
|
|
286
286
|
});
|
|
287
287
|
|
|
288
|
-
//
|
|
288
|
+
// Maintient l'agent sur la bonne voie : vérifier les tests avant de commiter
|
|
289
289
|
customPolicies.add({
|
|
290
290
|
name: "remind-test-before-commit",
|
|
291
291
|
description: "Keep the agent on track: verify tests pass before committing",
|
|
@@ -300,7 +300,7 @@ customPolicies.add({
|
|
|
300
300
|
},
|
|
301
301
|
});
|
|
302
302
|
|
|
303
|
-
//
|
|
303
|
+
// Empêche les modifications de dépendances non planifiées pendant le gel
|
|
304
304
|
customPolicies.add({
|
|
305
305
|
name: "dependency-freeze",
|
|
306
306
|
description: "Prevent unplanned dependency changes during freeze period",
|
|
@@ -327,10 +327,10 @@ Le répertoire `examples/` contient des fichiers de politiques prêts à l'emplo
|
|
|
327
327
|
|
|
328
328
|
| Fichier | Contenu |
|
|
329
329
|
|------|----------|
|
|
330
|
-
| `examples/policies-basic.js` | Cinq politiques de démarrage couvrant les modes
|
|
331
|
-
| `examples/policies-advanced/index.js` | Modèles avancés : imports transitifs, appels asynchrones, nettoyage
|
|
332
|
-
| `examples/convention-policies/security-policies.mjs` | Politiques de sécurité
|
|
333
|
-
| `examples/convention-policies/workflow-policies.mjs` | Politiques de workflow
|
|
330
|
+
| `examples/policies-basic.js` | Cinq politiques de démarrage couvrant les modes d'échec courants des agents |
|
|
331
|
+
| `examples/policies-advanced/index.js` | Modèles avancés : imports transitifs, appels asynchrones, nettoyage de sortie et hooks de fin de session |
|
|
332
|
+
| `examples/convention-policies/security-policies.mjs` | Politiques de sécurité par convention (bloquer les écritures .env, empêcher la réécriture de l'historique git) |
|
|
333
|
+
| `examples/convention-policies/workflow-policies.mjs` | Politiques de workflow par convention (rappels de tests, audit des écritures de fichiers) |
|
|
334
334
|
|
|
335
335
|
### Utiliser les exemples de fichiers explicites
|
|
336
336
|
|
|
@@ -338,16 +338,16 @@ Le répertoire `examples/` contient des fichiers de politiques prêts à l'emplo
|
|
|
338
338
|
failproofai policies --install --custom ./examples/policies-basic.js
|
|
339
339
|
```
|
|
340
340
|
|
|
341
|
-
### Utiliser les exemples
|
|
341
|
+
### Utiliser les exemples par convention
|
|
342
342
|
|
|
343
343
|
```bash
|
|
344
|
-
# Copier au niveau
|
|
344
|
+
# Copier au niveau projet
|
|
345
345
|
mkdir -p .failproofai/policies
|
|
346
346
|
cp examples/convention-policies/*.mjs .failproofai/policies/
|
|
347
347
|
|
|
348
|
-
# Ou copier au niveau
|
|
348
|
+
# Ou copier au niveau utilisateur
|
|
349
349
|
mkdir -p ~/.failproofai/policies
|
|
350
350
|
cp examples/convention-policies/*.mjs ~/.failproofai/policies/
|
|
351
351
|
```
|
|
352
352
|
|
|
353
|
-
Aucune commande d'installation nécessaire — les fichiers sont
|
|
353
|
+
Aucune commande d'installation n'est nécessaire — les fichiers sont automatiquement détectés au prochain événement hook.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Exemples
|
|
3
|
-
description: "Comment configurer des hooks pour Claude Code et
|
|
3
|
+
description: "Comment configurer des hooks pour Claude Code et l'Agents SDK"
|
|
4
4
|
icon: book-open
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Des exemples prêts à l'emploi pour les scénarios courants. Chacun montre comment installer et ce
|
|
7
|
+
Des exemples prêts à l'emploi pour les scénarios courants. Chacun montre comment l'installer et ce à quoi s'attendre.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -35,15 +35,15 @@ Failproof AI s'intègre à Claude Code via son [système de hooks](https://docs.
|
|
|
35
35
|
claude
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
Les politiques s'exécutent désormais automatiquement à chaque appel d'outil. Essayez de demander à Claude d'exécuter `sudo rm -rf /` —
|
|
38
|
+
Les politiques s'exécutent désormais automatiquement à chaque appel d'outil. Essayez de demander à Claude d'exécuter `sudo rm -rf /` — la commande sera bloquée.
|
|
39
39
|
</Step>
|
|
40
40
|
</Steps>
|
|
41
41
|
|
|
42
42
|
---
|
|
43
43
|
|
|
44
|
-
## Configurer des hooks pour
|
|
44
|
+
## Configurer des hooks pour l'Agents SDK
|
|
45
45
|
|
|
46
|
-
Si vous développez avec
|
|
46
|
+
Si vous développez avec l'[Agents SDK](https://docs.anthropic.com/en/docs/agents-sdk), vous pouvez utiliser le même système de hooks de manière programmatique.
|
|
47
47
|
|
|
48
48
|
<Steps>
|
|
49
49
|
<Step title="Installer failproofai dans votre projet">
|
|
@@ -52,7 +52,7 @@ Si vous développez avec le [Agents SDK](https://docs.anthropic.com/en/docs/agen
|
|
|
52
52
|
```
|
|
53
53
|
</Step>
|
|
54
54
|
<Step title="Configurer les hooks dans votre agent">
|
|
55
|
-
|
|
55
|
+
Transmettez des commandes de hooks lors de la création de votre processus agent. Les hooks se déclenchent de la même manière que dans Claude Code — via JSON en stdin/stdout :
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
58
|
failproofai --hook PreToolUse # appelé avant chaque outil
|
|
@@ -65,7 +65,7 @@ Si vous développez avec le [Agents SDK](https://docs.anthropic.com/en/docs/agen
|
|
|
65
65
|
|
|
66
66
|
customPolicies.add({
|
|
67
67
|
name: "limit-to-project-dir",
|
|
68
|
-
description: "
|
|
68
|
+
description: "Maintenir l'agent dans le répertoire du projet",
|
|
69
69
|
match: { events: ["PreToolUse"] },
|
|
70
70
|
fn: async (ctx) => {
|
|
71
71
|
const path = String(ctx.toolInput?.file_path ?? "");
|
|
@@ -86,7 +86,7 @@ Si vous développez avec le [Agents SDK](https://docs.anthropic.com/en/docs/agen
|
|
|
86
86
|
|
|
87
87
|
---
|
|
88
88
|
|
|
89
|
-
## Bloquer les commandes
|
|
89
|
+
## Bloquer les commandes destructrices
|
|
90
90
|
|
|
91
91
|
La configuration la plus courante — empêcher les agents de causer des dommages irréversibles.
|
|
92
92
|
|
|
@@ -94,36 +94,36 @@ La configuration la plus courante — empêcher les agents de causer des dommage
|
|
|
94
94
|
failproofai policies --install block-sudo block-rm-rf block-force-push block-curl-pipe-sh
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
-
Ce que
|
|
97
|
+
Ce que cela fait :
|
|
98
98
|
- `block-sudo` — bloque toutes les commandes `sudo`
|
|
99
99
|
- `block-rm-rf` — bloque la suppression récursive de fichiers
|
|
100
|
-
- `block-force-push` — bloque
|
|
101
|
-
- `block-curl-pipe-sh` — bloque
|
|
100
|
+
- `block-force-push` — bloque `git push --force`
|
|
101
|
+
- `block-curl-pipe-sh` — bloque l'exécution de scripts distants via un pipe vers le shell
|
|
102
102
|
|
|
103
103
|
---
|
|
104
104
|
|
|
105
105
|
## Prévenir les fuites de secrets
|
|
106
106
|
|
|
107
|
-
|
|
107
|
+
Empêcher les agents de voir ou de divulguer des identifiants dans la sortie des outils.
|
|
108
108
|
|
|
109
109
|
```bash
|
|
110
110
|
failproofai policies --install sanitize-api-keys sanitize-jwt sanitize-connection-strings sanitize-bearer-tokens
|
|
111
111
|
```
|
|
112
112
|
|
|
113
|
-
Ces politiques se déclenchent sur `PostToolUse` — après l'exécution d'un outil, elles nettoient la sortie avant que l'agent ne la
|
|
113
|
+
Ces politiques se déclenchent sur `PostToolUse` — après l'exécution d'un outil, elles nettoient la sortie avant que l'agent ne la reçoive.
|
|
114
114
|
|
|
115
115
|
---
|
|
116
116
|
|
|
117
117
|
## Recevoir des alertes Slack quand les agents ont besoin d'attention
|
|
118
118
|
|
|
119
|
-
Utilisez le hook de notification pour
|
|
119
|
+
Utilisez le hook de notification pour transférer les alertes d'inactivité vers Slack.
|
|
120
120
|
|
|
121
121
|
```javascript
|
|
122
122
|
import { customPolicies, allow, instruct } from "failproofai";
|
|
123
123
|
|
|
124
124
|
customPolicies.add({
|
|
125
125
|
name: "slack-on-idle",
|
|
126
|
-
description: "
|
|
126
|
+
description: "Alerter Slack quand l'agent attend une entrée",
|
|
127
127
|
match: { events: ["Notification"] },
|
|
128
128
|
fn: async (ctx) => {
|
|
129
129
|
const webhookUrl = process.env.SLACK_WEBHOOK_URL;
|
|
@@ -160,14 +160,14 @@ SLACK_WEBHOOK_URL=https://hooks.slack.com/... failproofai policies --install --c
|
|
|
160
160
|
|
|
161
161
|
## Maintenir les agents sur une branche
|
|
162
162
|
|
|
163
|
-
|
|
163
|
+
Empêcher les agents de changer de branche ou de pousser vers des branches protégées.
|
|
164
164
|
|
|
165
165
|
```javascript
|
|
166
166
|
import { customPolicies, allow, deny } from "failproofai";
|
|
167
167
|
|
|
168
168
|
customPolicies.add({
|
|
169
169
|
name: "stay-on-branch",
|
|
170
|
-
description: "
|
|
170
|
+
description: "Empêcher l'agent de basculer sur d'autres branches",
|
|
171
171
|
match: { events: ["PreToolUse"] },
|
|
172
172
|
fn: async (ctx) => {
|
|
173
173
|
if (ctx.toolName !== "Bash") return allow();
|
|
@@ -184,14 +184,14 @@ customPolicies.add({
|
|
|
184
184
|
|
|
185
185
|
## Exiger des tests avant les commits
|
|
186
186
|
|
|
187
|
-
|
|
187
|
+
Rappeler aux agents d'exécuter les tests avant de committer.
|
|
188
188
|
|
|
189
189
|
```javascript
|
|
190
190
|
import { customPolicies, allow, instruct } from "failproofai";
|
|
191
191
|
|
|
192
192
|
customPolicies.add({
|
|
193
193
|
name: "test-before-commit",
|
|
194
|
-
description: "
|
|
194
|
+
description: "Rappeler à l'agent d'exécuter les tests avant de committer",
|
|
195
195
|
match: { events: ["PreToolUse"] },
|
|
196
196
|
fn: async (ctx) => {
|
|
197
197
|
if (ctx.toolName !== "Bash") return allow();
|
|
@@ -206,9 +206,9 @@ customPolicies.add({
|
|
|
206
206
|
|
|
207
207
|
---
|
|
208
208
|
|
|
209
|
-
##
|
|
209
|
+
## Sécuriser un dépôt de production
|
|
210
210
|
|
|
211
|
-
|
|
211
|
+
Committez une configuration au niveau du projet afin que tous les développeurs de votre équipe bénéficient des mêmes politiques.
|
|
212
212
|
|
|
213
213
|
Créez `.failproofai/policies-config.json` dans votre dépôt :
|
|
214
214
|
|
|
@@ -231,7 +231,7 @@ Créez `.failproofai/policies-config.json` dans votre dépôt :
|
|
|
231
231
|
}
|
|
232
232
|
```
|
|
233
233
|
|
|
234
|
-
Puis
|
|
234
|
+
Puis committez-le :
|
|
235
235
|
|
|
236
236
|
```bash
|
|
237
237
|
git add .failproofai/policies-config.json
|
|
@@ -242,12 +242,66 @@ Chaque membre de l'équipe ayant failproofai installé récupérera automatiquem
|
|
|
242
242
|
|
|
243
243
|
---
|
|
244
244
|
|
|
245
|
+
## Établir un standard qualité à l'échelle de l'organisation avec des politiques de convention
|
|
246
|
+
|
|
247
|
+
La configuration la plus impactante : committez `.failproofai/policies/` dans votre dépôt avec des politiques adaptées à votre projet. Tous les membres de l'équipe les récupèrent automatiquement — sans commandes d'installation ni modifications de configuration.
|
|
248
|
+
|
|
249
|
+
<Steps>
|
|
250
|
+
<Step title="Créer le répertoire et ajouter des politiques">
|
|
251
|
+
```bash
|
|
252
|
+
mkdir -p .failproofai/policies
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
```js
|
|
256
|
+
// .failproofai/policies/team-policies.mjs
|
|
257
|
+
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
258
|
+
|
|
259
|
+
// Imposer le gestionnaire de paquets préféré de votre équipe
|
|
260
|
+
// (ou activez plutôt la politique intégrée prefer-package-manager)
|
|
261
|
+
customPolicies.add({
|
|
262
|
+
name: "enforce-bun",
|
|
263
|
+
match: { events: ["PreToolUse"] },
|
|
264
|
+
fn: async (ctx) => {
|
|
265
|
+
if (ctx.toolName !== "Bash") return allow();
|
|
266
|
+
const cmd = String(ctx.toolInput?.command ?? "");
|
|
267
|
+
if (/\bnpm\b/.test(cmd)) return deny("Use bun instead of npm.");
|
|
268
|
+
return allow();
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
// Rappeler à l'agent d'exécuter les tests avant de committer
|
|
273
|
+
customPolicies.add({
|
|
274
|
+
name: "test-before-commit",
|
|
275
|
+
match: { events: ["PreToolUse"] },
|
|
276
|
+
fn: async (ctx) => {
|
|
277
|
+
if (ctx.toolName !== "Bash") return allow();
|
|
278
|
+
if (/git\s+commit/.test(ctx.toolInput?.command ?? "")) {
|
|
279
|
+
return instruct("Run tests before committing.");
|
|
280
|
+
}
|
|
281
|
+
return allow();
|
|
282
|
+
},
|
|
283
|
+
});
|
|
284
|
+
```
|
|
285
|
+
</Step>
|
|
286
|
+
<Step title="Committer dans git">
|
|
287
|
+
```bash
|
|
288
|
+
git add .failproofai/policies/
|
|
289
|
+
git commit -m "Add team quality policies"
|
|
290
|
+
```
|
|
291
|
+
</Step>
|
|
292
|
+
<Step title="Continuer à améliorer">
|
|
293
|
+
Au fur et à mesure que votre équipe rencontre de nouveaux types d'échecs, ajoutez des politiques et poussez-les. Tout le monde reçoit la mise à jour au prochain `git pull`. Ces politiques deviennent un standard qualité vivant qui évolue avec votre équipe.
|
|
294
|
+
</Step>
|
|
295
|
+
</Steps>
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
245
299
|
## Plus d'exemples
|
|
246
300
|
|
|
247
301
|
Le répertoire [`examples/`](https://github.com/exospherehost/failproofai/tree/main/examples) du dépôt contient :
|
|
248
302
|
|
|
249
303
|
| Fichier | Ce qu'il illustre |
|
|
250
304
|
|---------|-------------------|
|
|
251
|
-
| `policies-basic.js` | Politiques de
|
|
305
|
+
| `policies-basic.js` | Politiques de base — bloquer les écritures en production, les force-push, les scripts pipés |
|
|
252
306
|
| `policies-notification.js` | Alertes Slack pour les notifications d'inactivité et la fin de session |
|
|
253
|
-
| `policies-advanced/index.js` | Imports transitifs, hooks asynchrones, nettoyage de la sortie
|
|
307
|
+
| `policies-advanced/index.js` | Imports transitifs, hooks asynchrones, nettoyage de la sortie PostToolUse, gestion de l'événement Stop |
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Démarrage rapide
|
|
3
|
-
description: "Installez failproofai, activez les politiques et laissez vos agents
|
|
3
|
+
description: "Installez failproofai, activez les politiques et laissez vos agents fonctionner de manière fiable"
|
|
4
4
|
icon: rocket
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
## Prérequis
|
|
8
8
|
|
|
9
9
|
- **Node.js** >= 20.9.0
|
|
10
|
-
- **Bun** >= 1.3.0 (optionnel - uniquement
|
|
10
|
+
- **Bun** >= 1.3.0 (optionnel - nécessaire uniquement pour compiler depuis les sources)
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -31,13 +31,13 @@ bun add -g failproofai
|
|
|
31
31
|
|
|
32
32
|
<Steps>
|
|
33
33
|
<Step title="Activer les politiques">
|
|
34
|
-
Les politiques sont des règles qui s'exécutent avant et après chaque appel d'outil de l'agent. Elles interceptent les commandes destructrices, les fuites de secrets et autres modes de défaillance avant qu'ils ne causent des dommages.
|
|
34
|
+
Les politiques sont des règles qui s'exécutent avant et après chaque appel d'outil de l'agent. Elles interceptent les commandes destructrices, les fuites de secrets et d'autres modes de défaillance avant qu'ils ne causent des dommages.
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
37
|
failproofai policies --install
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
Cette commande inscrit les entrées de hook dans le fichier `settings.json` de Claude Code. Vous pouvez également installer pour un seul projet ou choisir des politiques spécifiques :
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
43
|
failproofai policies --install --scope project
|
|
@@ -65,7 +65,7 @@ bun add -g failproofai
|
|
|
65
65
|
|
|
66
66
|
---
|
|
67
67
|
|
|
68
|
-
##
|
|
68
|
+
## Fonctionnement des politiques
|
|
69
69
|
|
|
70
70
|
Chaque fois qu'un agent exécute un outil, Claude Code appelle failproofai en tant que sous-processus :
|
|
71
71
|
|
|
@@ -79,14 +79,66 @@ Chaque politique retourne l'une des trois décisions suivantes :
|
|
|
79
79
|
|
|
80
80
|
- **allow** - l'agent continue normalement
|
|
81
81
|
- **deny** - l'action est bloquée, l'agent est informé de la raison
|
|
82
|
-
- **instruct** - du contexte supplémentaire est ajouté
|
|
82
|
+
- **instruct** - du contexte supplémentaire est ajouté à l'invite de l'agent
|
|
83
83
|
|
|
84
84
|
<Note>
|
|
85
|
-
Les politiques s'exécutent dans votre processus local.
|
|
85
|
+
Les politiques s'exécutent dans votre processus local. Rien n'est envoyé à un service distant.
|
|
86
86
|
</Note>
|
|
87
87
|
|
|
88
88
|
---
|
|
89
89
|
|
|
90
|
+
## Configurer des politiques d'équipe avec les politiques par convention
|
|
91
|
+
|
|
92
|
+
La façon la plus rapide d'établir des standards de qualité au sein de votre équipe est la convention `.failproofai/policies/`. Déposez des fichiers de politiques dans ce répertoire et ils sont chargés automatiquement — sans options, sans modification de configuration, sans commandes d'installation.
|
|
93
|
+
|
|
94
|
+
<Steps>
|
|
95
|
+
<Step title="Créer le répertoire des politiques">
|
|
96
|
+
```bash
|
|
97
|
+
mkdir -p .failproofai/policies
|
|
98
|
+
```
|
|
99
|
+
</Step>
|
|
100
|
+
<Step title="Ajouter des fichiers de politiques">
|
|
101
|
+
Copiez les exemples de démarrage ou créez les vôtres :
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
cp node_modules/failproofai/examples/convention-policies/*.mjs .failproofai/policies/
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Ou créez-en un nouveau :
|
|
108
|
+
|
|
109
|
+
```js
|
|
110
|
+
// .failproofai/policies/team-policies.mjs
|
|
111
|
+
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
112
|
+
|
|
113
|
+
customPolicies.add({
|
|
114
|
+
name: "test-before-commit",
|
|
115
|
+
match: { events: ["PreToolUse"] },
|
|
116
|
+
fn: async (ctx) => {
|
|
117
|
+
if (ctx.toolName !== "Bash") return allow();
|
|
118
|
+
if (/git\s+commit/.test(ctx.toolInput?.command ?? "")) {
|
|
119
|
+
return instruct("Run tests before committing.");
|
|
120
|
+
}
|
|
121
|
+
return allow();
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
```
|
|
125
|
+
</Step>
|
|
126
|
+
<Step title="Valider dans git">
|
|
127
|
+
```bash
|
|
128
|
+
git add .failproofai/policies/
|
|
129
|
+
git commit -m "Add team quality policies"
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Chaque membre de l'équipe ayant failproofai installé récupère ces politiques automatiquement. Aucune configuration individuelle n'est nécessaire.
|
|
133
|
+
</Step>
|
|
134
|
+
</Steps>
|
|
135
|
+
|
|
136
|
+
<Tip>
|
|
137
|
+
Commitez `.failproofai/policies/` dans votre dépôt afin que toute l'équipe partage les mêmes standards. Au fur et à mesure que votre équipe découvre de nouveaux modes de défaillance, ajoutez des politiques et poussez-les — tout le monde reçoit la mise à jour au prochain `git pull`. Au fil du temps, ces politiques deviennent un standard de qualité vivant qui ne cesse de s'améliorer.
|
|
138
|
+
</Tip>
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
90
142
|
## Stockage des données
|
|
91
143
|
|
|
92
144
|
Toute la configuration et les journaux restent sur votre machine :
|
|
@@ -96,8 +148,8 @@ Toute la configuration et les journaux restent sur votre machine :
|
|
|
96
148
|
| `~/.failproofai/policies-config.json` | Configuration globale des politiques |
|
|
97
149
|
| `~/.failproofai/hook-activity.jsonl` | Historique d'exécution des hooks |
|
|
98
150
|
| `~/.failproofai/hook.log` | Journal de débogage pour les erreurs de hooks personnalisés |
|
|
99
|
-
| `.failproofai/policies-config.json` | Configuration par projet (
|
|
100
|
-
| `.failproofai/policies-config.local.json` |
|
|
151
|
+
| `.failproofai/policies-config.json` | Configuration par projet (versionnée) |
|
|
152
|
+
| `.failproofai/policies-config.local.json` | Substitutions personnelles (ignorées par git) |
|
|
101
153
|
|
|
102
154
|
---
|
|
103
155
|
|
|
@@ -111,12 +163,12 @@ Supprime les entrées de hook du fichier `~/.claude/settings.json`. Les fichiers
|
|
|
111
163
|
|
|
112
164
|
---
|
|
113
165
|
|
|
114
|
-
##
|
|
166
|
+
## Prochaines étapes
|
|
115
167
|
|
|
116
168
|
<CardGroup cols={2}>
|
|
117
169
|
|
|
118
170
|
<Card title="Configuration" icon="gear" href="/fr/configuration">
|
|
119
|
-
|
|
171
|
+
Portées et format des fichiers de configuration
|
|
120
172
|
</Card>
|
|
121
173
|
|
|
122
174
|
<Card title="Politiques intégrées" icon="shield" href="/fr/built-in-policies">
|
|
@@ -127,8 +179,8 @@ Supprime les entrées de hook du fichier `~/.claude/settings.json`. Les fichiers
|
|
|
127
179
|
Écrivez vos propres politiques en JavaScript
|
|
128
180
|
</Card>
|
|
129
181
|
|
|
130
|
-
<Card title="Moniteur d'
|
|
131
|
-
Surveillez les sessions et
|
|
182
|
+
<Card title="Moniteur d'agent" icon="chart-line" href="/fr/dashboard">
|
|
183
|
+
Surveillez les sessions et examinez l'activité des politiques
|
|
132
184
|
</Card>
|
|
133
185
|
|
|
134
186
|
</CardGroup>
|