failproofai 0.0.5 → 0.0.6-beta.1
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 +112 -0
- package/.next/standalone/.failproofai/policies/workflow-policies.mjs +2 -1
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +5 -5
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- 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]__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]__0okos0k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0a~g15g._.js → [root-of-the-server]__0rh.18_._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +6 -6
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0qn95h3._.js → [root-of-the-server]__0~kmh8w._.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 +5 -5
- 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/{0sme4lkv.tgn-.js → 01b~z8f1ws0rk.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0lgbwkfqmnsmc.js → 03rz6ykw-a2xi.js} +1 -1
- package/.next/standalone/.next/static/chunks/{17manv47o-~wp.js → 08t08igdql9yt.js} +1 -1
- package/.next/standalone/.next/static/chunks/09_k80d~cq2wg.js +4 -0
- package/.next/standalone/.next/static/chunks/{0ksdlt_1hucdm.js → 0bvhsa6zva2o..js} +1 -1
- package/.next/standalone/.next/static/chunks/{09ikntpt2-o9b.js → 0gbf4cphy8ksq.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0yumumfzx_f27.js → 0v.yd0kg_ld3r.js} +1 -1
- package/.next/standalone/.next/static/chunks/{13juklu.vksks.js → 0wlyoif4_kj_t.js} +1 -1
- package/.next/standalone/.next/static/chunks/{09e7drilkf1sn.js → 12simlrcfk3g2.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0em7tspi4kylh.js → 12~yi9oj8av8p.js} +2 -2
- package/.next/standalone/.next/static/chunks/{turbopack-0r26pc8h0y_-e.js → turbopack-0o7k.hakttp4k.js} +1 -1
- package/.next/standalone/CHANGELOG.md +13 -0
- package/.next/standalone/README.md +2 -2
- package/.next/standalone/bun.lock +43 -85
- package/.next/standalone/dist/cli.mjs +107 -3
- package/.next/standalone/docs/ar/architecture.mdx +65 -64
- package/.next/standalone/docs/ar/configuration.mdx +42 -42
- package/.next/standalone/docs/ar/custom-policies.mdx +62 -64
- package/.next/standalone/docs/built-in-policies.mdx +37 -0
- package/.next/standalone/docs/custom-policies.mdx +1 -1
- package/.next/standalone/docs/de/architecture.mdx +92 -92
- package/.next/standalone/docs/de/configuration.mdx +34 -34
- package/.next/standalone/docs/de/custom-policies.mdx +49 -50
- package/.next/standalone/docs/es/architecture.mdx +72 -72
- package/.next/standalone/docs/es/configuration.mdx +25 -25
- package/.next/standalone/docs/es/custom-policies.mdx +48 -49
- package/.next/standalone/docs/examples.mdx +54 -0
- package/.next/standalone/docs/fr/architecture.mdx +53 -53
- package/.next/standalone/docs/fr/configuration.mdx +25 -25
- package/.next/standalone/docs/fr/custom-policies.mdx +42 -43
- package/.next/standalone/docs/getting-started.mdx +52 -0
- package/.next/standalone/docs/he/architecture.mdx +66 -66
- package/.next/standalone/docs/he/configuration.mdx +53 -52
- package/.next/standalone/docs/he/custom-policies.mdx +72 -73
- package/.next/standalone/docs/hi/architecture.mdx +106 -106
- package/.next/standalone/docs/hi/configuration.mdx +39 -39
- package/.next/standalone/docs/hi/custom-policies.mdx +75 -76
- package/.next/standalone/docs/i18n/README.ar.md +66 -66
- package/.next/standalone/docs/i18n/README.de.md +38 -38
- package/.next/standalone/docs/i18n/README.es.md +38 -38
- package/.next/standalone/docs/i18n/README.fr.md +42 -42
- package/.next/standalone/docs/i18n/README.he.md +67 -67
- package/.next/standalone/docs/i18n/README.hi.md +70 -70
- package/.next/standalone/docs/i18n/README.it.md +62 -62
- package/.next/standalone/docs/i18n/README.ja.md +54 -54
- package/.next/standalone/docs/i18n/README.ko.md +58 -58
- package/.next/standalone/docs/i18n/README.pt-br.md +43 -43
- package/.next/standalone/docs/i18n/README.ru.md +69 -69
- package/.next/standalone/docs/i18n/README.tr.md +76 -76
- package/.next/standalone/docs/i18n/README.vi.md +70 -70
- package/.next/standalone/docs/i18n/README.zh.md +52 -52
- package/.next/standalone/docs/it/architecture.mdx +54 -53
- package/.next/standalone/docs/it/configuration.mdx +44 -45
- package/.next/standalone/docs/it/custom-policies.mdx +76 -78
- package/.next/standalone/docs/ja/architecture.mdx +93 -93
- package/.next/standalone/docs/ja/configuration.mdx +47 -47
- package/.next/standalone/docs/ja/custom-policies.mdx +62 -63
- package/.next/standalone/docs/ko/architecture.mdx +66 -66
- package/.next/standalone/docs/ko/configuration.mdx +35 -35
- package/.next/standalone/docs/ko/custom-policies.mdx +71 -72
- package/.next/standalone/docs/pt-br/architecture.mdx +55 -55
- package/.next/standalone/docs/pt-br/configuration.mdx +35 -35
- package/.next/standalone/docs/pt-br/custom-policies.mdx +60 -61
- package/.next/standalone/docs/ru/architecture.mdx +59 -60
- package/.next/standalone/docs/ru/configuration.mdx +52 -53
- package/.next/standalone/docs/ru/custom-policies.mdx +68 -69
- package/.next/standalone/docs/tr/architecture.mdx +124 -124
- package/.next/standalone/docs/tr/configuration.mdx +45 -46
- package/.next/standalone/docs/tr/custom-policies.mdx +75 -75
- package/.next/standalone/docs/vi/architecture.mdx +65 -64
- package/.next/standalone/docs/vi/configuration.mdx +41 -41
- package/.next/standalone/docs/vi/custom-policies.mdx +68 -69
- package/.next/standalone/docs/zh/architecture.mdx +67 -67
- package/.next/standalone/docs/zh/configuration.mdx +34 -34
- package/.next/standalone/docs/zh/custom-policies.mdx +53 -54
- package/.next/standalone/node_modules/@next/env/package.json +1 -1
- package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +7 -7
- package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
- package/.next/standalone/node_modules/next/dist/server/config-schema.js +10 -2
- package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/render.js +27 -20
- package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
- package/.next/standalone/node_modules/next/package.json +15 -15
- package/.next/standalone/package.json +2 -2
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/src/hooks/builtin-policies.ts +131 -0
- package/README.md +2 -2
- package/dist/cli.mjs +107 -3
- package/package.json +2 -2
- package/src/hooks/builtin-policies.ts +131 -0
- package/.next/standalone/.next/static/chunks/0_yayar~bpphd.js +0 -4
- /package/.next/standalone/.next/static/{hYQM6iCWnF1W5XDpsIRhV → CkmOT-ZvDN-sVULinGVKT}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{hYQM6iCWnF1W5XDpsIRhV → CkmOT-ZvDN-sVULinGVKT}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{hYQM6iCWnF1W5XDpsIRhV → CkmOT-ZvDN-sVULinGVKT}/_ssgManifest.js +0 -0
|
@@ -4,7 +4,7 @@ description: "Fonctionnement interne du gestionnaire de hooks, du chargement de
|
|
|
4
4
|
icon: sitemap
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Ce document explique le fonctionnement interne de failproofai : comment le système de hooks intercepte les appels d'outils
|
|
7
|
+
Ce document explique le fonctionnement interne de failproofai : comment le système de hooks intercepte les appels d'outils de l'agent, comment la configuration est chargée et fusionnée, comment les politiques sont évaluées, et comment le tableau de bord surveille l'activité de l'agent.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -12,10 +12,10 @@ Ce document explique le fonctionnement interne de failproofai : comment le syst
|
|
|
12
12
|
|
|
13
13
|
failproofai comporte deux sous-systèmes indépendants :
|
|
14
14
|
|
|
15
|
-
1. **Gestionnaire de hooks** - Un sous-processus CLI rapide que Claude Code invoque à chaque appel d'outil
|
|
15
|
+
1. **Gestionnaire de hooks** - Un sous-processus CLI rapide que Claude Code invoque à chaque appel d'outil de l'agent. Il évalue les politiques et retourne une décision.
|
|
16
16
|
2. **Moniteur d'agent (Tableau de bord)** - Une application web Next.js pour surveiller les sessions d'agent et gérer les politiques.
|
|
17
17
|
|
|
18
|
-
Les deux sous-systèmes partagent
|
|
18
|
+
Les deux sous-systèmes partagent des fichiers de configuration dans `~/.failproofai/` et le répertoire `.failproofai/` du projet, mais ils s'exécutent en tant que processus séparés et ne communiquent que via le système de fichiers.
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
@@ -23,7 +23,7 @@ Les deux sous-systèmes partagent les fichiers de configuration dans `~/.failpro
|
|
|
23
23
|
|
|
24
24
|
### Intégration avec Claude Code
|
|
25
25
|
|
|
26
|
-
Lorsque vous exécutez `failproofai policies --install`, des entrées comme celle-ci
|
|
26
|
+
Lorsque vous exécutez `failproofai policies --install`, il écrit des entrées comme celle-ci dans `~/.claude/settings.json` :
|
|
27
27
|
|
|
28
28
|
```json
|
|
29
29
|
{
|
|
@@ -44,7 +44,7 @@ Lorsque vous exécutez `failproofai policies --install`, des entrées comme cell
|
|
|
44
44
|
}
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
Claude Code invoque ensuite `failproofai --hook PreToolUse`
|
|
47
|
+
Claude Code invoque ensuite `failproofai --hook PreToolUse` comme sous-processus avant chaque appel d'outil, en transmettant un payload JSON sur stdin.
|
|
48
48
|
|
|
49
49
|
### Format du payload
|
|
50
50
|
|
|
@@ -62,7 +62,7 @@ Claude Code invoque ensuite `failproofai --hook PreToolUse` en tant que sous-pro
|
|
|
62
62
|
|
|
63
63
|
Pour les événements `PostToolUse`, le payload contient également `tool_result` avec la sortie de l'outil.
|
|
64
64
|
|
|
65
|
-
Le gestionnaire impose une limite de 1 Mo sur stdin. Les payloads dépassant cette
|
|
65
|
+
Le gestionnaire impose une limite de 1 Mo sur stdin. Les payloads dépassant cette taille sont ignorés et toutes les politiques autorisent implicitement.
|
|
66
66
|
|
|
67
67
|
### Format de la réponse
|
|
68
68
|
|
|
@@ -94,7 +94,7 @@ Le gestionnaire impose une limite de 1 Mo sur stdin. Les payloads dépassant cet
|
|
|
94
94
|
}
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
-
**Instruction
|
|
97
|
+
**Instruction pour l'événement Stop :**
|
|
98
98
|
- Code de sortie : `2`
|
|
99
99
|
- Raison écrite sur stderr (pas sur stdout)
|
|
100
100
|
|
|
@@ -116,7 +116,7 @@ Le gestionnaire impose une limite de 1 Mo sur stdin. Les payloads dépassant cet
|
|
|
116
116
|
```
|
|
117
117
|
- Code de sortie : `0` (l'opération est autorisée)
|
|
118
118
|
- Lorsque plusieurs politiques retournent `allow` avec un message, leurs messages sont joints par des sauts de ligne en une seule chaîne `additionalContext`
|
|
119
|
-
- Si aucune politique ne fournit de message, stdout est vide (comme
|
|
119
|
+
- Si aucune politique ne fournit de message, stdout est vide (comme précédemment)
|
|
120
120
|
|
|
121
121
|
### Pipeline de traitement
|
|
122
122
|
|
|
@@ -124,19 +124,19 @@ Le gestionnaire impose une limite de 1 Mo sur stdin. Les payloads dépassant cet
|
|
|
124
124
|
|
|
125
125
|
```text
|
|
126
126
|
stdin JSON
|
|
127
|
-
→
|
|
128
|
-
→
|
|
129
|
-
→ readMergedHooksConfig(cwd) ←
|
|
130
|
-
→
|
|
131
|
-
→
|
|
132
|
-
→
|
|
133
|
-
→
|
|
134
|
-
→
|
|
135
|
-
→
|
|
136
|
-
→
|
|
137
|
-
→
|
|
138
|
-
→
|
|
139
|
-
→
|
|
127
|
+
→ parse payload (max 1 MB)
|
|
128
|
+
→ extract session metadata (session_id, cwd, tool_name, tool_input, etc.)
|
|
129
|
+
→ readMergedHooksConfig(cwd) ← merges project + local + global config
|
|
130
|
+
→ register enabled builtin policies with resolved params
|
|
131
|
+
→ load custom policies from customPoliciesPath (if set)
|
|
132
|
+
→ register custom policies into policy registry
|
|
133
|
+
→ evaluate all policies (builtins first, then custom)
|
|
134
|
+
→ first deny short-circuits
|
|
135
|
+
→ instruct decisions accumulate
|
|
136
|
+
→ allow messages accumulate
|
|
137
|
+
→ write JSON decision to stdout
|
|
138
|
+
→ persist event to ~/.failproofai/hook-activity.jsonl
|
|
139
|
+
→ exit
|
|
140
140
|
```
|
|
141
141
|
|
|
142
142
|
L'ensemble du processus s'exécute en moins de 100 ms pour les payloads typiques, sans aucun appel LLM.
|
|
@@ -145,7 +145,7 @@ L'ensemble du processus s'exécute en moins de 100 ms pour les payloads typiques
|
|
|
145
145
|
|
|
146
146
|
## Chargement de la configuration
|
|
147
147
|
|
|
148
|
-
`src/hooks/hooks-config.ts` implémente le chargement de configuration
|
|
148
|
+
`src/hooks/hooks-config.ts` implémente le chargement de la configuration sur trois niveaux.
|
|
149
149
|
|
|
150
150
|
```text
|
|
151
151
|
[1] {cwd}/.failproofai/policies-config.json ← projet (priorité la plus haute)
|
|
@@ -156,8 +156,8 @@ L'ensemble du processus s'exécute en moins de 100 ms pour les payloads typiques
|
|
|
156
156
|
Logique de fusion :
|
|
157
157
|
- `enabledPolicies` - union dédupliquée sur les trois fichiers
|
|
158
158
|
- `policyParams` - par clé de politique, le premier fichier qui la définit l'emporte entièrement
|
|
159
|
-
- `customPoliciesPath` - le premier fichier qui
|
|
160
|
-
- `llm` - le premier fichier qui
|
|
159
|
+
- `customPoliciesPath` - le premier fichier qui la définit l'emporte
|
|
160
|
+
- `llm` - le premier fichier qui la définit l'emporte
|
|
161
161
|
|
|
162
162
|
Le tableau de bord web utilise `readHooksConfig()` (global uniquement) pour la lecture et l'écriture, car il n'est pas invoqué avec un répertoire de travail de projet.
|
|
163
163
|
|
|
@@ -171,7 +171,7 @@ Pour chaque politique :
|
|
|
171
171
|
|
|
172
172
|
1. Rechercher le schéma `params` de la politique (si elle en possède un).
|
|
173
173
|
2. Lire `policyParams[policy.name]` depuis la configuration fusionnée.
|
|
174
|
-
3. Fusionner les valeurs fournies par l'utilisateur
|
|
174
|
+
3. Fusionner les valeurs fournies par l'utilisateur avec les valeurs par défaut du schéma pour produire `ctx.params`.
|
|
175
175
|
4. Appeler `policy.fn(ctx)` avec le contexte résolu.
|
|
176
176
|
5. Si le résultat est `deny`, s'arrêter immédiatement et retourner cette décision.
|
|
177
177
|
6. Si le résultat est `instruct`, accumuler le message et continuer.
|
|
@@ -180,7 +180,7 @@ Pour chaque politique :
|
|
|
180
180
|
Après l'exécution de toutes les politiques :
|
|
181
181
|
- Si un `deny` a été retourné, émettre la réponse de refus.
|
|
182
182
|
- Si des retours `instruct` ont été collectés, émettre une seule réponse d'instruction avec tous les messages joints.
|
|
183
|
-
- Sinon, émettre une réponse d'autorisation (stdout vide,
|
|
183
|
+
- Sinon, émettre une réponse d'autorisation (stdout vide, exit 0).
|
|
184
184
|
|
|
185
185
|
---
|
|
186
186
|
|
|
@@ -204,15 +204,15 @@ interface BuiltinPolicyDefinition {
|
|
|
204
204
|
}
|
|
205
205
|
```
|
|
206
206
|
|
|
207
|
-
Les politiques qui acceptent des `params` déclarent un `PolicyParamsSchema` avec
|
|
207
|
+
Les politiques qui acceptent des `params` déclarent un `PolicyParamsSchema` avec des types et des valeurs par défaut pour chaque paramètre. L'évaluateur de politiques injecte les valeurs résolues dans `ctx.params` avant d'appeler `fn`. Les fonctions de politique lisent `ctx.params` sans protection contre les valeurs nulles, car les valeurs par défaut sont toujours appliquées en premier.
|
|
208
208
|
|
|
209
|
-
La correspondance de motifs à l'intérieur des politiques utilise des tokens de commande analysés (argv), et non une correspondance de chaînes brutes. Cela empêche
|
|
209
|
+
La correspondance de motifs à l'intérieur des politiques utilise des tokens de commande analysés (argv), et non une correspondance de chaînes brutes. Cela empêche les contournements via l'injection d'opérateurs shell (par exemple, un motif pour `sudo systemctl status *` ne peut pas être contourné en ajoutant `; rm -rf /` à la commande).
|
|
210
210
|
|
|
211
211
|
---
|
|
212
212
|
|
|
213
213
|
## Politiques personnalisées
|
|
214
214
|
|
|
215
|
-
`src/hooks/custom-hooks-registry.ts` implémente un registre
|
|
215
|
+
`src/hooks/custom-hooks-registry.ts` implémente un registre adossé à `globalThis` :
|
|
216
216
|
|
|
217
217
|
```typescript
|
|
218
218
|
const REGISTRY_KEY = "__failproofai_custom_hooks__";
|
|
@@ -228,14 +228,14 @@ export function clearCustomHooks(): void { ... } // used in tests
|
|
|
228
228
|
`src/hooks/custom-hooks-loader.ts` charge le fichier de politique de l'utilisateur :
|
|
229
229
|
|
|
230
230
|
1. Lire `customPoliciesPath` depuis la configuration ; ignorer si absent.
|
|
231
|
-
2. Résoudre
|
|
232
|
-
3. Réécrire tous les imports `from "failproofai"` vers le chemin dist réel afin que `customPolicies` résolve vers le même registre `globalThis`.
|
|
231
|
+
2. Résoudre vers un chemin absolu ; vérifier que le fichier existe.
|
|
232
|
+
3. Réécrire tous les imports `from "failproofai"` vers le chemin dist réel afin que `customPolicies` se résolve vers le même registre `globalThis`.
|
|
233
233
|
4. Réécrire récursivement les imports locaux transitifs pour assurer la compatibilité ESM.
|
|
234
234
|
5. Écrire des fichiers `.mjs` temporaires et `import()` le fichier d'entrée.
|
|
235
235
|
6. Appeler `getCustomHooks()` pour récupérer les hooks enregistrés.
|
|
236
236
|
7. Nettoyer tous les fichiers temporaires dans un bloc `finally`.
|
|
237
237
|
|
|
238
|
-
En cas d'erreur (fichier
|
|
238
|
+
En cas d'erreur (fichier non trouvé, erreur de syntaxe, échec d'import), l'erreur est consignée dans `~/.failproofai/hook.log` et le chargeur retourne un tableau vide. Les politiques intégrées ne sont pas affectées.
|
|
239
239
|
|
|
240
240
|
Les politiques personnalisées sont évaluées après toutes les politiques intégrées. Un `deny` d'une politique personnalisée court-circuite quand même les politiques personnalisées suivantes (mais toutes les politiques intégrées ont déjà été exécutées à ce stade).
|
|
241
241
|
|
|
@@ -243,7 +243,7 @@ Les politiques personnalisées sont évaluées après toutes les politiques int
|
|
|
243
243
|
|
|
244
244
|
## Journalisation de l'activité
|
|
245
245
|
|
|
246
|
-
Après chaque événement de hook, le gestionnaire ajoute une ligne JSONL
|
|
246
|
+
Après chaque événement de hook, le gestionnaire ajoute une ligne JSONL à `~/.failproofai/hook-activity.jsonl` :
|
|
247
247
|
|
|
248
248
|
```json
|
|
249
249
|
{
|
|
@@ -258,24 +258,24 @@ Après chaque événement de hook, le gestionnaire ajoute une ligne JSONL dans `
|
|
|
258
258
|
}
|
|
259
259
|
```
|
|
260
260
|
|
|
261
|
-
Une ligne par politique ayant pris une décision autre que allow. Les décisions
|
|
261
|
+
Une ligne par politique ayant pris une décision autre que allow. Les décisions allow ne sont pas journalisées (pour garder le fichier léger).
|
|
262
262
|
|
|
263
263
|
---
|
|
264
264
|
|
|
265
265
|
## Architecture du tableau de bord
|
|
266
266
|
|
|
267
|
-
Le tableau de bord est une application **Next.js 16** utilisant l'App Router avec
|
|
267
|
+
Le tableau de bord est une application **Next.js 16** utilisant l'App Router avec les React Server Components et les Server Actions.
|
|
268
268
|
|
|
269
269
|
```text
|
|
270
270
|
app/
|
|
271
|
-
layout.tsx ← Mise en page racine (thème, télémétrie,
|
|
271
|
+
layout.tsx ← Mise en page racine (thème, télémétrie, navigation)
|
|
272
272
|
projects/page.tsx ← Composant serveur : liste tous les projets Claude
|
|
273
273
|
project/[name]/page.tsx ← Composant serveur : liste les sessions d'un projet
|
|
274
274
|
project/[name]/session/
|
|
275
275
|
[sessionId]/page.tsx ← Composant serveur : affiche le visualiseur de session
|
|
276
276
|
policies/page.tsx ← Composant client : gestion des politiques + journal d'activité
|
|
277
277
|
actions/
|
|
278
|
-
get-hooks-config.ts ← Lire la
|
|
278
|
+
get-hooks-config.ts ← Lire la configuration + liste des politiques
|
|
279
279
|
update-hooks-config.ts ← Activer/désactiver une politique
|
|
280
280
|
update-policy-params.ts ← Mettre à jour les paramètres d'une politique
|
|
281
281
|
get-hook-activity.ts ← Paginer/rechercher dans le journal d'activité
|
|
@@ -287,19 +287,19 @@ app/
|
|
|
287
287
|
**Flux de données :**
|
|
288
288
|
|
|
289
289
|
- Les composants de page appellent `lib/projects.ts` et `lib/log-entries.ts` pour lire les données de projet/session directement depuis le système de fichiers (pas de couche API pour les lectures).
|
|
290
|
-
- La page Politiques utilise
|
|
291
|
-
- Le visualiseur de session analyse le format de
|
|
290
|
+
- La page Politiques utilise les Server Actions pour toutes les mutations (activation/désactivation, mise à jour des paramètres, installation/suppression).
|
|
291
|
+
- Le visualiseur de session analyse le format de transcription JSONL de Claude et affiche une chronologie des messages et des appels d'outils.
|
|
292
292
|
|
|
293
293
|
**Décisions de conception clés :**
|
|
294
294
|
|
|
295
|
-
- Pas de base de données - tout l'état persistant est dans des fichiers
|
|
296
|
-
- Server Actions pour les mutations -
|
|
295
|
+
- Pas de base de données - tout l'état persistant est dans des fichiers plats (`~/.failproofai/`, `~/.claude/projects/`).
|
|
296
|
+
- Server Actions pour les mutations - pas d'API REST nécessaire pour les opérations CRUD.
|
|
297
297
|
- React Server Components pour les pages de lecture - chargement initial plus rapide, pas de bundle client pour la récupération des données.
|
|
298
|
-
- Composants client uniquement là où l'interactivité est nécessaire (
|
|
298
|
+
- Composants client uniquement là où l'interactivité est nécessaire (activation des politiques, recherche dans l'activité, visualiseur de journaux).
|
|
299
299
|
|
|
300
300
|
---
|
|
301
301
|
|
|
302
|
-
##
|
|
302
|
+
## Structure des fichiers
|
|
303
303
|
|
|
304
304
|
```text
|
|
305
305
|
failproofai/
|
|
@@ -309,23 +309,23 @@ failproofai/
|
|
|
309
309
|
│ ├── handler.ts # Pipeline d'événements de hook
|
|
310
310
|
│ ├── builtin-policies.ts # 26 définitions de politiques
|
|
311
311
|
│ ├── policy-evaluator.ts # Moteur d'exécution des politiques
|
|
312
|
-
│ ├── policy-registry.ts # Enregistrement et recherche
|
|
312
|
+
│ ├── policy-registry.ts # Enregistrement et recherche des politiques
|
|
313
313
|
│ ├── policy-types.ts # Interfaces TypeScript
|
|
314
|
-
│ ├── hooks-config.ts # Chargement de configuration multi-
|
|
315
|
-
│ ├── custom-hooks-registry.ts # Registre de hooks
|
|
314
|
+
│ ├── hooks-config.ts # Chargement de la configuration multi-niveaux
|
|
315
|
+
│ ├── custom-hooks-registry.ts # Registre de hooks adossé à globalThis
|
|
316
316
|
│ ├── custom-hooks-loader.ts # Chargeur ESM pour les hooks JS utilisateur
|
|
317
|
-
│ ├── manager.ts # Opérations
|
|
318
|
-
│ ├── install-prompt.ts # Invite de sélection
|
|
317
|
+
│ ├── manager.ts # Opérations d'installation / suppression / liste
|
|
318
|
+
│ ├── install-prompt.ts # Invite interactive de sélection des politiques
|
|
319
319
|
│ ├── hook-logger.ts # Journalisation vers hook.log
|
|
320
|
-
│ ├── hook-activity-store.ts # Persistance de l'activité
|
|
321
|
-
│ └── llm-client.ts # Client API LLM (pour les politiques
|
|
320
|
+
│ ├── hook-activity-store.ts # Persistance de l'activité vers hook-activity.jsonl
|
|
321
|
+
│ └── llm-client.ts # Client API LLM (pour les politiques basées sur l'IA)
|
|
322
322
|
├── app/ # Tableau de bord Next.js (pages + server actions)
|
|
323
323
|
├── lib/ # Utilitaires partagés
|
|
324
|
-
│ ├── projects.ts #
|
|
325
|
-
│ ├── log-entries.ts # Analyse du format JSONL des
|
|
324
|
+
│ ├── projects.ts # Énumération des projets Claude depuis le système de fichiers
|
|
325
|
+
│ ├── log-entries.ts # Analyse du format JSONL des transcriptions Claude
|
|
326
326
|
│ ├── paths.ts # Résolution des chemins système
|
|
327
327
|
│ └── ...
|
|
328
|
-
├── components/ # Composants React
|
|
328
|
+
├── components/ # Composants UI React partagés
|
|
329
329
|
├── contexts/ # Fournisseurs de contexte React (thème, actualisation automatique, télémétrie)
|
|
330
330
|
├── examples/ # Exemples de fichiers de hooks personnalisés
|
|
331
331
|
└── __tests__/ # Tests unitaires et E2E
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Configuration
|
|
3
|
-
description: "Format
|
|
3
|
+
description: "Format des fichiers de configuration, système à trois portées et règles de fusion"
|
|
4
4
|
icon: gear
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
failproofai utilise des fichiers de configuration JSON pour contrôler quelles politiques sont actives, leur comportement et
|
|
7
|
+
failproofai utilise des fichiers de configuration JSON pour contrôler quelles politiques sont actives, leur comportement, et les chemins de chargement des politiques personnalisées. La configuration est conçue pour être facilement partagée avec votre équipe — commitez-la dans votre dépôt et chaque développeur bénéficie du même filet de sécurité pour les agents.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -13,16 +13,16 @@ failproofai utilise des fichiers de configuration JSON pour contrôler quelles p
|
|
|
13
13
|
Il existe trois portées de configuration, évaluées par ordre de priorité :
|
|
14
14
|
|
|
15
15
|
| Portée | Chemin du fichier | Objectif |
|
|
16
|
-
|
|
17
|
-
| **project** | `.failproofai/policies-config.json` | Paramètres par dépôt,
|
|
16
|
+
|--------|-------------------|---------|
|
|
17
|
+
| **project** | `.failproofai/policies-config.json` | Paramètres par dépôt, commités dans le contrôle de version |
|
|
18
18
|
| **local** | `.failproofai/policies-config.local.json` | Surcharges personnelles par dépôt, ignorées par git |
|
|
19
|
-
| **global** | `~/.failproofai/policies-config.json` |
|
|
19
|
+
| **global** | `~/.failproofai/policies-config.json` | Valeurs par défaut au niveau utilisateur pour tous les projets |
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Lorsque failproofai reçoit un événement de hook, il charge et fusionne les trois fichiers qui existent pour le répertoire de travail courant.
|
|
22
22
|
|
|
23
23
|
### Règles de fusion
|
|
24
24
|
|
|
25
|
-
**`enabledPolicies`** — union des trois portées. Une politique activée à n'importe quel niveau est active.
|
|
25
|
+
**`enabledPolicies`** — l'union des trois portées. Une politique activée à n'importe quel niveau est active.
|
|
26
26
|
|
|
27
27
|
```text
|
|
28
28
|
project: ["block-sudo"]
|
|
@@ -32,7 +32,7 @@ global: ["block-sudo", "sanitize-api-keys"]
|
|
|
32
32
|
resolved: ["block-sudo", "block-rm-rf", "sanitize-api-keys"] ← union dédupliquée
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
**`policyParams`** — la première portée qui définit
|
|
35
|
+
**`policyParams`** — la première portée qui définit des paramètres pour une politique donnée l'emporte entièrement. Il n'y a pas de fusion profonde des valeurs au sein des paramètres d'une politique.
|
|
36
36
|
|
|
37
37
|
```text
|
|
38
38
|
project: block-sudo → { allowPatterns: ["sudo apt-get update"] }
|
|
@@ -46,7 +46,7 @@ project: (aucune entrée block-sudo)
|
|
|
46
46
|
local: (aucune entrée block-sudo)
|
|
47
47
|
global: block-sudo → { allowPatterns: ["sudo systemctl status"] }
|
|
48
48
|
|
|
49
|
-
resolved: { allowPatterns: ["sudo systemctl status"] } ←
|
|
49
|
+
resolved: { allowPatterns: ["sudo systemctl status"] } ← repli sur global
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
**`customPoliciesPath`** — la première portée qui le définit l'emporte.
|
|
@@ -112,7 +112,7 @@ Type : `Record<string, Record<string, unknown>>`
|
|
|
112
112
|
|
|
113
113
|
Surcharges de paramètres par politique. La clé externe est le nom de la politique ; les clés internes sont spécifiques à chaque politique. Chaque politique documente ses paramètres disponibles dans [Politiques intégrées](/fr/built-in-policies).
|
|
114
114
|
|
|
115
|
-
Si une politique possède des paramètres
|
|
115
|
+
Si une politique possède des paramètres que vous ne spécifiez pas, les valeurs par défaut intégrées de la politique sont utilisées. Les utilisateurs qui ne configurent pas `policyParams` du tout obtiennent un comportement identique aux versions précédentes.
|
|
116
116
|
|
|
117
117
|
Les clés inconnues dans le bloc de paramètres d'une politique sont silencieusement ignorées au moment du déclenchement du hook, mais signalées comme avertissements lors de l'exécution de `failproofai policies`.
|
|
118
118
|
|
|
@@ -122,7 +122,7 @@ Type : `string` (optionnel)
|
|
|
122
122
|
|
|
123
123
|
Un message ajouté à la raison lorsqu'une politique retourne `deny` ou `instruct`. Utilisez-le pour donner à Claude des indications exploitables sans modifier la politique elle-même.
|
|
124
124
|
|
|
125
|
-
Fonctionne avec
|
|
125
|
+
Fonctionne avec tout type de politique — intégrée, personnalisée (`custom/`), convention de projet (`.failproofai-project/`) ou convention utilisateur (`.failproofai-user/`).
|
|
126
126
|
|
|
127
127
|
```json
|
|
128
128
|
{
|
|
@@ -141,40 +141,40 @@ Fonctionne avec n'importe quel type de politique — intégrée, personnalisée
|
|
|
141
141
|
}
|
|
142
142
|
```
|
|
143
143
|
|
|
144
|
-
Lorsque `block-force-push`
|
|
144
|
+
Lorsque `block-force-push` bloque, Claude voit : *« Le push forcé est bloqué. Try creating a fresh branch instead. »*
|
|
145
145
|
|
|
146
|
-
Les valeurs non-chaînes et les chaînes vides sont silencieusement ignorées. Si `hint` n'est pas défini, le comportement
|
|
146
|
+
Les valeurs non-chaînes et les chaînes vides sont silencieusement ignorées. Si `hint` n'est pas défini, le comportement reste inchangé (rétrocompatible).
|
|
147
147
|
|
|
148
148
|
### `customPoliciesPath`
|
|
149
149
|
|
|
150
150
|
Type : `string` (chemin absolu)
|
|
151
151
|
|
|
152
|
-
Chemin vers un fichier JavaScript contenant des politiques de hook personnalisées. Ce champ est défini automatiquement par `failproofai policies --install --custom <path>` (le chemin est résolu en chemin absolu avant d'être
|
|
152
|
+
Chemin vers un fichier JavaScript contenant des politiques de hook personnalisées. Ce champ est défini automatiquement par `failproofai policies --install --custom <path>` (le chemin est résolu en chemin absolu avant d'être stocké).
|
|
153
153
|
|
|
154
|
-
Le fichier est
|
|
154
|
+
Le fichier est rechargé à chaque événement de hook — il n'y a pas de mise en cache. Consultez [Politiques personnalisées](/fr/custom-policies) pour les détails de création.
|
|
155
155
|
|
|
156
156
|
### Politiques basées sur les conventions
|
|
157
157
|
|
|
158
158
|
En plus du `customPoliciesPath` explicite, failproofai découvre et charge automatiquement les fichiers de politiques depuis les répertoires `.failproofai/policies/` :
|
|
159
159
|
|
|
160
160
|
| Niveau | Répertoire | Portée |
|
|
161
|
-
|
|
161
|
+
|--------|------------|--------|
|
|
162
162
|
| Projet | `.failproofai/policies/` | Partagé avec l'équipe via le contrôle de version |
|
|
163
163
|
| Utilisateur | `~/.failproofai/policies/` | Personnel, s'applique à tous les projets |
|
|
164
164
|
|
|
165
165
|
**Correspondance de fichiers :** Seuls les fichiers correspondant à `*policies.{js,mjs,ts}` sont chargés (par exemple `security-policies.mjs`, `workflow-policies.js`). Les autres fichiers du répertoire sont ignorés.
|
|
166
166
|
|
|
167
|
-
**Aucune configuration
|
|
167
|
+
**Aucune configuration requise :** Les politiques de convention ne nécessitent aucune entrée dans `policies-config.json`. Il suffit de déposer des fichiers dans le répertoire et ils seront pris en compte au prochain événement de hook.
|
|
168
168
|
|
|
169
|
-
**Chargement par union :** Les répertoires de convention du projet et de l'utilisateur sont tous deux analysés. Tous les fichiers correspondants des deux niveaux sont chargés (contrairement à `customPoliciesPath` qui utilise la règle
|
|
169
|
+
**Chargement par union :** Les répertoires de convention du projet et de l'utilisateur sont tous deux analysés. Tous les fichiers correspondants des deux niveaux sont chargés (contrairement à `customPoliciesPath` qui utilise la règle « première portée gagnante »).
|
|
170
170
|
|
|
171
|
-
Consultez [Politiques personnalisées](/fr/custom-policies) pour plus de détails et
|
|
171
|
+
Consultez [Politiques personnalisées](/fr/custom-policies) pour plus de détails et d'exemples.
|
|
172
172
|
|
|
173
173
|
### `llm`
|
|
174
174
|
|
|
175
175
|
Type : `object` (optionnel)
|
|
176
176
|
|
|
177
|
-
Configuration du client LLM pour les politiques
|
|
177
|
+
Configuration du client LLM pour les politiques effectuant des appels à l'IA. Non requis dans la plupart des configurations.
|
|
178
178
|
|
|
179
179
|
```json
|
|
180
180
|
{
|
|
@@ -187,20 +187,20 @@ Configuration du client LLM pour les politiques qui effectuent des appels à l'I
|
|
|
187
187
|
|
|
188
188
|
---
|
|
189
189
|
|
|
190
|
-
## Gestion de la configuration depuis
|
|
190
|
+
## Gestion de la configuration depuis la CLI
|
|
191
191
|
|
|
192
192
|
Les commandes `policies --install` et `policies --uninstall` écrivent dans le fichier `settings.json` de Claude Code (les points d'entrée des hooks), tandis que `policies-config.json` est le fichier que vous gérez directement. Les deux sont distincts :
|
|
193
193
|
|
|
194
194
|
- **`settings.json`** — indique à Claude Code d'appeler `failproofai --hook <event>` à chaque utilisation d'outil
|
|
195
195
|
- **`policies-config.json`** — indique à failproofai quelles politiques évaluer et avec quels paramètres
|
|
196
196
|
|
|
197
|
-
Vous pouvez modifier `policies-config.json` directement à tout moment ; les
|
|
197
|
+
Vous pouvez modifier `policies-config.json` directement à tout moment ; les changements prennent effet immédiatement au prochain événement de hook, sans redémarrage nécessaire.
|
|
198
198
|
|
|
199
199
|
---
|
|
200
200
|
|
|
201
|
-
## Exemple : configuration au niveau projet avec
|
|
201
|
+
## Exemple : configuration au niveau projet avec des valeurs par défaut d'équipe
|
|
202
202
|
|
|
203
|
-
|
|
203
|
+
Commitez `.failproofai/policies-config.json` dans votre dépôt :
|
|
204
204
|
|
|
205
205
|
```json
|
|
206
206
|
{
|
|
@@ -219,4 +219,4 @@ Committez `.failproofai/policies-config.json` dans votre dépôt :
|
|
|
219
219
|
}
|
|
220
220
|
```
|
|
221
221
|
|
|
222
|
-
Chaque développeur peut ensuite créer `.failproofai/policies-config.local.json` (ignoré par git) pour
|
|
222
|
+
Chaque développeur peut ensuite créer `.failproofai/policies-config.local.json` (ignoré par git) pour des surcharges personnelles sans affecter ses coéquipiers.
|