failproofai 0.0.5 → 0.0.6-beta.0
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/workflow-policies.mjs +2 -1
- 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]__0a~g15g._.js → [root-of-the-server]__0.~fd7s._.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]__0qn95h3._.js → [root-of-the-server]__0a.nuas._.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]__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/{09ikntpt2-o9b.js → 0.z51twd.0l5z.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0sme4lkv.tgn-.js → 0hctoh28rg838.js} +1 -1
- package/.next/standalone/.next/static/chunks/{13juklu.vksks.js → 0hplx-8c-4vpv.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0em7tspi4kylh.js → 0maq.q1t.ri85.js} +2 -2
- package/.next/standalone/.next/static/chunks/{17manv47o-~wp.js → 0teq8wdh3po1n.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0lgbwkfqmnsmc.js → 0uc0um_uz51m_.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0yumumfzx_f27.js → 0ul6fk-z.6k-0.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0_yayar~bpphd.js → 0w9lwqy0-v1dk.js} +1 -1
- package/.next/standalone/CHANGELOG.md +5 -0
- package/.next/standalone/dist/cli.mjs +19 -2
- 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/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/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/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/package.json +1 -1
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/src/hooks/builtin-policies.ts +30 -0
- package/dist/cli.mjs +19 -2
- package/package.json +1 -1
- package/src/hooks/builtin-policies.ts +30 -0
- /package/.next/standalone/.next/static/{hYQM6iCWnF1W5XDpsIRhV → 8mygPGI5bzrtWK36ZYO59}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{hYQM6iCWnF1W5XDpsIRhV → 8mygPGI5bzrtWK36ZYO59}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{hYQM6iCWnF1W5XDpsIRhV → 8mygPGI5bzrtWK36ZYO59}/_ssgManifest.js +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Politiques personnalisées
|
|
3
|
-
description: "Écrivez vos propres politiques en JavaScript — appliquez des conventions, prévenez la dérive, détectez les
|
|
3
|
+
description: "Écrivez vos propres politiques en JavaScript — appliquez des conventions, prévenez la dérive, détectez les défaillances, 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, bloquer les opérations
|
|
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, bloquer les opérations destructives, détecter les agents bloqués, ou s'intégrer avec Slack, des workflows d'approbation, et bien plus. Elles utilisent le même système d'événements de 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
|
+
Installation :
|
|
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 : Basée sur les conventions (recommandée)
|
|
43
43
|
|
|
44
|
-
Déposez des fichiers `*policies.{js,mjs,ts}` dans `.failproofai/policies/` et ils sont chargés
|
|
44
|
+
Déposez des fichiers `*policies.{js,mjs,ts}` dans `.failproofai/policies/` et ils sont automatiquement chargés — aucun indicateur ni modification de configuration nécessaire. Cela fonctionne comme les hooks git : déposez un fichier, et c'est tout.
|
|
45
45
|
|
|
46
46
|
```
|
|
47
|
-
# Niveau projet —
|
|
47
|
+
# Niveau projet — validé 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 projet et utilisateur sont tous deux analysés (union — pas de priorité au premier scope)
|
|
57
|
-
- Les fichiers sont chargés
|
|
55
|
+
**Fonctionnement :**
|
|
56
|
+
- Les répertoires du projet et de l'utilisateur sont tous deux analysés (union — pas de priorité au premier scope)
|
|
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 conjointement 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 partager des politiques au sein d'une équipe.
|
|
63
|
+
Les politiques par convention sont le moyen le plus simple de partager des politiques au sein d'une équipe. Validez `.failproofai/policies/` dans git et chaque membre de l'équipe les obtient automatiquement.
|
|
64
64
|
</Tip>
|
|
65
65
|
|
|
66
66
|
### Option 2 : Chemin de fichier explicite
|
|
@@ -76,15 +76,15 @@ failproofai policies --install --custom ./new-policies.js
|
|
|
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 hook —
|
|
79
|
+
Le chemin absolu résolu est stocké dans `policies-config.json` sous `customPoliciesPath`. Le fichier est chargé à nouveau à chaque événement de hook — il n'y a pas de mise en cache entre les événements.
|
|
80
80
|
|
|
81
81
|
### Utiliser les deux ensemble
|
|
82
82
|
|
|
83
83
|
Les politiques par convention et le fichier `--custom` explicite peuvent coexister. Ordre de chargement :
|
|
84
84
|
|
|
85
85
|
1. Fichier `customPoliciesPath` explicite (si configuré)
|
|
86
|
-
2. Fichiers de convention projet (`{cwd}/.failproofai/policies/`, alphabétique)
|
|
87
|
-
3. Fichiers de convention utilisateur (`~/.failproofai/policies/`, alphabétique)
|
|
86
|
+
2. Fichiers de convention du projet (`{cwd}/.failproofai/policies/`, alphabétique)
|
|
87
|
+
3. Fichiers de convention de l'utilisateur (`~/.failproofai/policies/`, alphabétique)
|
|
88
88
|
|
|
89
89
|
---
|
|
90
90
|
|
|
@@ -98,7 +98,7 @@ import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
|
98
98
|
|
|
99
99
|
### `customPolicies.add(hook)`
|
|
100
100
|
|
|
101
|
-
Enregistre une politique. Appelez cette
|
|
101
|
+
Enregistre une politique. Appelez cette fonction autant de fois que nécessaire pour plusieurs politiques dans le même fichier.
|
|
102
102
|
|
|
103
103
|
```ts
|
|
104
104
|
customPolicies.add({
|
|
@@ -115,29 +115,28 @@ customPolicies.add({
|
|
|
115
115
|
|----------|--------|----------|
|
|
116
116
|
| `allow()` | Autorise l'opération silencieusement | L'action est sûre, aucun message nécessaire |
|
|
117
117
|
| `deny(message)` | Bloque l'opération | L'agent ne doit pas effectuer cette action |
|
|
118
|
-
| `instruct(message)` | Ajoute du contexte sans bloquer |
|
|
118
|
+
| `instruct(message)` | Ajoute du contexte sans bloquer | Donner à l'agent un contexte supplémentaire pour rester sur la bonne voie |
|
|
119
119
|
|
|
120
120
|
`deny(message)` — le message apparaît à Claude préfixé par `"Blocked by failproofai:"`. Un seul `deny` court-circuite toute évaluation ultérieure.
|
|
121
121
|
|
|
122
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 délivrés ensemble.
|
|
123
123
|
|
|
124
124
|
<Tip>
|
|
125
|
-
Vous pouvez ajouter des
|
|
125
|
+
Vous pouvez ajouter des indications supplémentaires à n'importe quel message `deny` ou `instruct` en ajoutant un champ `hint` dans `policyParams` — aucune modification de code nécessaire. Cela fonctionne également pour les politiques personnalisées (`custom/`), les politiques de convention de projet (`.failproofai-project/`) et les politiques de 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 d'autorisation informatifs
|
|
129
129
|
|
|
130
|
-
|
|
131
|
-
`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 qu'`instruct`, mais sémantiquement différent : c'est une mise à jour de statut, pas un avertissement.
|
|
130
|
+
`allow(message)` autorise l'opération **et** envoie un message informatif à Claude. Le message est délivré en tant que `additionalContext` dans la réponse stdout du gestionnaire de hook — le même mécanisme qu'`instruct`, mais sémantiquement différent : c'est une mise à jour de statut, pas un avertissement.
|
|
132
131
|
|
|
133
132
|
| Fonction | Effet | Utiliser quand |
|
|
134
133
|
|----------|--------|----------|
|
|
135
|
-
| `allow(message)` |
|
|
134
|
+
| `allow(message)` | Autoriser et envoyer du contexte à Claude | Confirmer qu'une vérification a réussi, ou expliquer pourquoi une vérification a été ignorée |
|
|
136
135
|
|
|
137
136
|
Cas d'utilisation :
|
|
138
137
|
- **Confirmations de statut :** `allow("All CI checks passed.")` — indique à Claude que tout est en ordre
|
|
139
|
-
- **Explications fail-open :** `allow("GitHub CLI not installed, skipping CI check.")` — indique à Claude pourquoi une vérification a été ignorée
|
|
140
|
-
- **Accumulation de messages
|
|
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 par des sauts de ligne et délivrés ensemble
|
|
141
140
|
|
|
142
141
|
```js
|
|
143
142
|
customPolicies.add({
|
|
@@ -163,7 +162,7 @@ customPolicies.add({
|
|
|
163
162
|
| `eventType` | `string` | `"PreToolUse"`, `"PostToolUse"`, `"Notification"`, `"Stop"` |
|
|
164
163
|
| `toolName` | `string \| undefined` | L'outil appelé (ex. `"Bash"`, `"Write"`, `"Read"`) |
|
|
165
164
|
| `toolInput` | `Record<string, unknown> \| undefined` | Les paramètres d'entrée de l'outil |
|
|
166
|
-
| `payload` | `Record<string, unknown>` |
|
|
165
|
+
| `payload` | `Record<string, unknown>` | Charge utile brute complète de l'événement provenant de Claude Code |
|
|
167
166
|
| `session` | `SessionMetadata \| undefined` | Contexte de session (voir ci-dessous) |
|
|
168
167
|
|
|
169
168
|
### Champs de `SessionMetadata`
|
|
@@ -190,9 +189,9 @@ customPolicies.add({
|
|
|
190
189
|
Les politiques sont évaluées dans cet ordre :
|
|
191
190
|
|
|
192
191
|
1. Politiques intégrées (dans l'ordre de définition)
|
|
193
|
-
2. Politiques personnalisées explicites
|
|
194
|
-
3. Politiques de convention projet `.failproofai/policies/` (fichiers alphabétiques, ordre `.add()` à l'intérieur)
|
|
195
|
-
4. Politiques de convention utilisateur `~/.failproofai/policies/` (fichiers alphabétiques, ordre `.add()` à l'intérieur)
|
|
192
|
+
2. Politiques personnalisées explicites depuis `customPoliciesPath` (dans l'ordre `.add()`)
|
|
193
|
+
3. Politiques de convention du projet `.failproofai/policies/` (fichiers alphabétiques, ordre `.add()` à l'intérieur)
|
|
194
|
+
4. Politiques de convention de l'utilisateur `~/.failproofai/policies/` (fichiers alphabétiques, ordre `.add()` à l'intérieur)
|
|
196
195
|
|
|
197
196
|
<Note>
|
|
198
197
|
Le premier `deny` court-circuite toutes les politiques suivantes. Tous les messages `instruct` sont accumulés et délivrés ensemble.
|
|
@@ -219,13 +218,13 @@ customPolicies.add({
|
|
|
219
218
|
});
|
|
220
219
|
```
|
|
221
220
|
|
|
222
|
-
Tous les imports relatifs accessibles depuis le fichier d'entrée sont résolus.
|
|
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 garantir la compatibilité ESM.
|
|
223
222
|
|
|
224
223
|
---
|
|
225
224
|
|
|
226
225
|
## Filtrage par type d'événement
|
|
227
226
|
|
|
228
|
-
Utilisez `match.events` pour limiter
|
|
227
|
+
Utilisez `match.events` pour limiter quand une politique se déclenche :
|
|
229
228
|
|
|
230
229
|
```js
|
|
231
230
|
customPolicies.add({
|
|
@@ -239,7 +238,7 @@ customPolicies.add({
|
|
|
239
238
|
});
|
|
240
239
|
```
|
|
241
240
|
|
|
242
|
-
Omettez `match` entièrement pour se déclencher
|
|
241
|
+
Omettez `match` entièrement pour se déclencher à chaque type d'événement.
|
|
243
242
|
|
|
244
243
|
---
|
|
245
244
|
|
|
@@ -251,14 +250,14 @@ Les politiques personnalisées sont **fail-open** : les erreurs ne bloquent jama
|
|
|
251
250
|
|---------|----------|
|
|
252
251
|
| `customPoliciesPath` non défini | Aucune politique personnalisée explicite ne s'exécute ; les politiques de convention et les politiques intégrées continuent normalement |
|
|
253
252
|
| Fichier introuvable | Avertissement consigné dans `~/.failproofai/hook.log` ; les politiques intégrées continuent |
|
|
254
|
-
| Erreur de syntaxe/import (explicite) | Erreur consignée dans `~/.failproofai/hook.log` ; politiques personnalisées explicites ignorées |
|
|
255
|
-
| Erreur de syntaxe/import (convention) | Erreur consignée ; ce fichier ignoré, les autres fichiers de convention se chargent quand même |
|
|
256
|
-
| `fn` lève une exception à l'exécution | Erreur consignée ; ce hook traité comme `allow` ; les autres hooks continuent |
|
|
257
|
-
| `fn` prend plus de
|
|
253
|
+
| Erreur de syntaxe/import (explicite) | Erreur consignée dans `~/.failproofai/hook.log` ; les politiques personnalisées explicites sont ignorées |
|
|
254
|
+
| Erreur de syntaxe/import (convention) | Erreur consignée ; ce fichier est ignoré, les autres fichiers de convention se chargent quand même |
|
|
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 s | Délai consigné ; traité comme `allow` |
|
|
258
257
|
| Répertoire de convention manquant | Aucune politique de convention ne s'exécute ; aucune erreur |
|
|
259
258
|
|
|
260
259
|
<Tip>
|
|
261
|
-
Pour déboguer les erreurs de politiques personnalisées, surveillez le fichier
|
|
260
|
+
Pour déboguer les erreurs de politiques personnalisées, surveillez le fichier de log :
|
|
262
261
|
|
|
263
262
|
```bash
|
|
264
263
|
tail -f ~/.failproofai/hook.log
|
|
@@ -328,10 +327,10 @@ Le répertoire `examples/` contient des fichiers de politiques prêts à l'emplo
|
|
|
328
327
|
|
|
329
328
|
| Fichier | Contenu |
|
|
330
329
|
|------|----------|
|
|
331
|
-
| `examples/policies-basic.js` | Cinq politiques de démarrage couvrant les modes
|
|
332
|
-
| `examples/policies-advanced/index.js` |
|
|
333
|
-
| `examples/convention-policies/security-policies.mjs` | Politiques de sécurité
|
|
334
|
-
| `examples/convention-policies/workflow-policies.mjs` | Politiques de workflow
|
|
330
|
+
| `examples/policies-basic.js` | Cinq politiques de démarrage couvrant les modes de défaillance courants des agents |
|
|
331
|
+
| `examples/policies-advanced/index.js` | Modèles avancés : imports transitifs, appels asynchrones, nettoyage des sorties et hooks de fin de session |
|
|
332
|
+
| `examples/convention-policies/security-policies.mjs` | Politiques de sécurité basées sur les conventions (bloquer les écritures .env, empêcher la réécriture de l'historique git) |
|
|
333
|
+
| `examples/convention-policies/workflow-policies.mjs` | Politiques de workflow basées sur les conventions (rappels de tests, audit des écritures de fichiers) |
|
|
335
334
|
|
|
336
335
|
### Utiliser les exemples de fichiers explicites
|
|
337
336
|
|
|
@@ -339,16 +338,16 @@ Le répertoire `examples/` contient des fichiers de politiques prêts à l'emplo
|
|
|
339
338
|
failproofai policies --install --custom ./examples/policies-basic.js
|
|
340
339
|
```
|
|
341
340
|
|
|
342
|
-
### Utiliser les exemples
|
|
341
|
+
### Utiliser les exemples basés sur les conventions
|
|
343
342
|
|
|
344
343
|
```bash
|
|
345
|
-
# Copier au niveau projet
|
|
344
|
+
# Copier au niveau du projet
|
|
346
345
|
mkdir -p .failproofai/policies
|
|
347
346
|
cp examples/convention-policies/*.mjs .failproofai/policies/
|
|
348
347
|
|
|
349
|
-
# Ou copier au niveau utilisateur
|
|
348
|
+
# Ou copier au niveau de l'utilisateur
|
|
350
349
|
mkdir -p ~/.failproofai/policies
|
|
351
350
|
cp examples/convention-policies/*.mjs ~/.failproofai/policies/
|
|
352
351
|
```
|
|
353
352
|
|
|
354
|
-
Aucune commande d'installation
|
|
353
|
+
Aucune commande d'installation nécessaire — les fichiers sont récupérés automatiquement au prochain événement de hook.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
---
|
|
3
3
|
title: ארכיטקטורה
|
|
4
|
-
description: "כיצד מטפל ה-hook, טעינת
|
|
4
|
+
description: "כיצד מטפל ה-hook, טעינת התצורה והערכת המדיניות עובדים באופן פנימי"
|
|
5
5
|
icon: sitemap
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
מסמך זה מסביר כיצד failproofai עובד באופן פנימי: כיצד מערכת ה-hook
|
|
8
|
+
מסמך זה מסביר כיצד failproofai עובד באופן פנימי: כיצד מערכת ה-hook חוצצת קריאות כלי סוכן, כיצד התצורה נטענת ומוזגת, כיצד מדיניות מוערכת, וכיצד לוח המחוונים מנטר פעילות סוכן.
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -13,18 +13,18 @@ icon: sitemap
|
|
|
13
13
|
|
|
14
14
|
ל-failproofai יש שתי תת-מערכות עצמאיות:
|
|
15
15
|
|
|
16
|
-
1. **מטפל Hook** -
|
|
17
|
-
2. **Agent Monitor (Dashboard)** -
|
|
16
|
+
1. **מטפל ה-Hook** - תהליך CLI מהיר שהוא Claude Code משדר בכל קריאת כלי סוכן. מעריך מדיניות והחזר החלטה.
|
|
17
|
+
2. **Agent Monitor (Dashboard)** - אפליקציית Next.js לניטור מושבי סוכן וניהול מדיניות.
|
|
18
18
|
|
|
19
|
-
שתי התת-מערכות
|
|
19
|
+
שתי התת-מערכות חולקות קבצי תצורה ב-`~/.failproofai/` ובתיקייה `~/.failproofai/` של הפרויקט, אך הם פועלים כתהליכים נפרדים ותקשורתם היא רק דרך מערכת הקבצים.
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
23
|
-
## מטפל Hook
|
|
23
|
+
## מטפל ה-Hook
|
|
24
24
|
|
|
25
|
-
###
|
|
25
|
+
### אינטגרציה עם Claude Code
|
|
26
26
|
|
|
27
|
-
כאשר אתה מריץ `failproofai policies --install`, הוא כותב ערכים כמו זה
|
|
27
|
+
כאשר אתה מריץ `failproofai policies --install`, הוא כותב ערכים כמו זה ב-`~/.claude/settings.json`:
|
|
28
28
|
|
|
29
29
|
```json
|
|
30
30
|
{
|
|
@@ -45,9 +45,9 @@ icon: sitemap
|
|
|
45
45
|
}
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
-
Claude Code לאחר מכן
|
|
48
|
+
Claude Code לאחר מכן משדר `failproofai --hook PreToolUse` כתת-תהליך לפני כל קריאת כלי, והעברת עומס JSON על stdin.
|
|
49
49
|
|
|
50
|
-
### פורמט
|
|
50
|
+
### פורמט עומס
|
|
51
51
|
|
|
52
52
|
```json
|
|
53
53
|
{
|
|
@@ -61,11 +61,11 @@ Claude Code לאחר מכן מפעיל את `failproofai --hook PreToolUse` כת
|
|
|
61
61
|
}
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
עבור אירועי `PostToolUse`, העומס מכיל גם `tool_result` עם הפלט של הכלי.
|
|
65
65
|
|
|
66
|
-
המטפל
|
|
66
|
+
המטפל כופה גבול של 1 MB ל-stdin. עומסים החוצים זאת מושלכים וכל המדיניות משתמעת להרשות.
|
|
67
67
|
|
|
68
|
-
### פורמט
|
|
68
|
+
### פורמט תגובה
|
|
69
69
|
|
|
70
70
|
**Deny (PreToolUse):**
|
|
71
71
|
```json
|
|
@@ -86,7 +86,7 @@ Claude Code לאחר מכן מפעיל את `failproofai --hook PreToolUse` כת
|
|
|
86
86
|
}
|
|
87
87
|
```
|
|
88
88
|
|
|
89
|
-
**Instruct (
|
|
89
|
+
**Instruct (any event except Stop):**
|
|
90
90
|
```json
|
|
91
91
|
{
|
|
92
92
|
"hookSpecificOutput": {
|
|
@@ -95,9 +95,9 @@ Claude Code לאחר מכן מפעיל את `failproofai --hook PreToolUse` כת
|
|
|
95
95
|
}
|
|
96
96
|
```
|
|
97
97
|
|
|
98
|
-
|
|
98
|
+
**Stop event instruct:**
|
|
99
99
|
- קוד יציאה: `2`
|
|
100
|
-
-
|
|
100
|
+
- הנמקה כתובה ל-stderr (לא stdout)
|
|
101
101
|
|
|
102
102
|
**Allow:**
|
|
103
103
|
- קוד יציאה: `0`
|
|
@@ -105,23 +105,23 @@ Claude Code לאחר מכן מפעיל את `failproofai --hook PreToolUse` כת
|
|
|
105
105
|
|
|
106
106
|
**Allow עם הודעה:**
|
|
107
107
|
|
|
108
|
-
`allow(message)` מאפשר למדיניות לשלוח הקשר מידע
|
|
108
|
+
`allow(message)` מאפשר למדיניות לשלוח הקשר מידע חזרה ל-Claude גם כאשר הפעולה מורשית. מטפל ה-Hook כותב את ה-JSON הבא ל-**stdout** (לא קובץ תצורה — זו התגובה של המטפל ל-Claude Code, בדיוק כמו תגובות deny ו-instruct למעלה):
|
|
109
109
|
|
|
110
110
|
```json
|
|
111
|
-
//
|
|
111
|
+
// Written to stdout by the hook handler process
|
|
112
112
|
{
|
|
113
113
|
"hookSpecificOutput": {
|
|
114
114
|
"additionalContext": "All CI checks passed on branch 'feat/my-feature'."
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
```
|
|
118
|
-
- קוד יציאה: `0` (
|
|
119
|
-
- כאשר מדיניות מרובות
|
|
120
|
-
- אם
|
|
118
|
+
- קוד יציאה: `0` (הפעולה מורשית)
|
|
119
|
+
- כאשר מדיניות מרובות החוזרות `allow` עם הודעה, ההודעות שלהן מחוברות עם שורות חדשות למחרוזת `additionalContext` יחידה
|
|
120
|
+
- אם אין מדיניות המספקת הודעה, stdout הוא ריק (כמו קודם)
|
|
121
121
|
|
|
122
122
|
### צינור עיבוד
|
|
123
123
|
|
|
124
|
-
`src/hooks/handler.ts` מיישם את
|
|
124
|
+
`src/hooks/handler.ts` מיישם את המסלול המלא:
|
|
125
125
|
|
|
126
126
|
```text
|
|
127
127
|
stdin JSON
|
|
@@ -140,13 +140,13 @@ stdin JSON
|
|
|
140
140
|
→ exit
|
|
141
141
|
```
|
|
142
142
|
|
|
143
|
-
|
|
143
|
+
התהליך כולו פועל בפחות מ-100ms עבור עומסים טיפוסיים ללא קריאות LLM.
|
|
144
144
|
|
|
145
145
|
---
|
|
146
146
|
|
|
147
|
-
## טעינת
|
|
147
|
+
## טעינת תצורה
|
|
148
148
|
|
|
149
|
-
`src/hooks/hooks-config.ts` מיישם טעינת
|
|
149
|
+
`src/hooks/hooks-config.ts` מיישם טעינת תצורה בתחום שלוש.
|
|
150
150
|
|
|
151
151
|
```text
|
|
152
152
|
[1] {cwd}/.failproofai/policies-config.json ← project (highest priority)
|
|
@@ -154,40 +154,40 @@ stdin JSON
|
|
|
154
154
|
[3] ~/.failproofai/policies-config.json ← global (lowest priority)
|
|
155
155
|
```
|
|
156
156
|
|
|
157
|
-
|
|
158
|
-
- `enabledPolicies` - איחוד
|
|
159
|
-
- `policyParams` -
|
|
160
|
-
- `customPoliciesPath` - הקובץ הראשון שמגדיר
|
|
161
|
-
- `llm` - הקובץ הראשון שמגדיר
|
|
157
|
+
ההיגיון של המיזוג:
|
|
158
|
+
- `enabledPolicies` - איחוד לא משוכפל בכל שלוש הקבצים
|
|
159
|
+
- `policyParams` - per-policy key, הקובץ הראשון שמגדיר את זה מנצח לחלוטין
|
|
160
|
+
- `customPoliciesPath` - הקובץ הראשון שמגדיר את זה מנצח
|
|
161
|
+
- `llm` - הקובץ הראשון שמגדיר את זה מנצח
|
|
162
162
|
|
|
163
|
-
לוח
|
|
163
|
+
לוח המחוונים ברשת משתמש ב-`readHooksConfig()` (global only) לקריאה וכתיבה, מכיוון שהוא לא משדר עם cwd של פרויקט.
|
|
164
164
|
|
|
165
165
|
---
|
|
166
166
|
|
|
167
167
|
## הערכת מדיניות
|
|
168
168
|
|
|
169
|
-
`src/hooks/policy-evaluator.ts`
|
|
169
|
+
`src/hooks/policy-evaluator.ts` מריץ מדיניות בסדר.
|
|
170
170
|
|
|
171
171
|
עבור כל מדיניות:
|
|
172
172
|
|
|
173
|
-
1. חפש את
|
|
174
|
-
2. קרא את `policyParams[policy.name]`
|
|
175
|
-
3.
|
|
176
|
-
4.
|
|
177
|
-
5. אם התוצאה היא `deny`, עצור מיד והחזר
|
|
173
|
+
1. חפש את סכימת `params` של המדיניות (אם יש לה).
|
|
174
|
+
2. קרא את `policyParams[policy.name]` מהתצורה המוזגת.
|
|
175
|
+
3. זיזוג ערכים המסופקים על ידי המשתמש מעל ברירות ברירת המחדל בסכימה כדי לייצר `ctx.params`.
|
|
176
|
+
4. התקשר ל-`policy.fn(ctx)` עם ההקשר המסולק.
|
|
177
|
+
5. אם התוצאה היא `deny`, עצור מיד והחזר החלטה זו.
|
|
178
178
|
6. אם התוצאה היא `instruct`, צבור את ההודעה והמשך.
|
|
179
179
|
7. אם התוצאה היא `allow`, המשך למדיניות הבאה.
|
|
180
180
|
|
|
181
|
-
לאחר שכל המדיניות
|
|
182
|
-
- אם
|
|
183
|
-
- אם
|
|
181
|
+
לאחר שכל המדיניות תרוץ:
|
|
182
|
+
- אם אחת כלשהי `deny` הוחזרה, פלוט את תגובת deny.
|
|
183
|
+
- אם תשובות `instruct` כלשהן אוספות, פלוט תגובת instruct אחת עם כל ההודעות מחוברות.
|
|
184
184
|
- אחרת, פלוט תגובת allow (stdout ריק, יציאה 0).
|
|
185
185
|
|
|
186
186
|
---
|
|
187
187
|
|
|
188
|
-
## מדיניות
|
|
188
|
+
## מדיניות בנויה
|
|
189
189
|
|
|
190
|
-
`src/hooks/builtin-policies.ts` מגדיר את כל 26
|
|
190
|
+
`src/hooks/builtin-policies.ts` מגדיר את כל 26 המדיניות המובנות כ-`BuiltinPolicyDefinition` אובייקטים:
|
|
191
191
|
|
|
192
192
|
```typescript
|
|
193
193
|
interface BuiltinPolicyDefinition {
|
|
@@ -205,15 +205,15 @@ interface BuiltinPolicyDefinition {
|
|
|
205
205
|
}
|
|
206
206
|
```
|
|
207
207
|
|
|
208
|
-
מדיניות המקבלת `params` מצהירה
|
|
208
|
+
מדיניות המקבלת `params` מצהירה `PolicyParamsSchema` עם סוגים וברירות ברירת מחדל עבור כל פרמטר. מעריך המדיניות מזריק ערכים מסולקים ל-`ctx.params` לפני קריאה ל-`fn`. פונקציות מדיניות קוראות ל-`ctx.params` ללא guard null מכיוון שברירות ברירת מחדל תמיד מיושמות תחילה.
|
|
209
209
|
|
|
210
|
-
התאמת
|
|
210
|
+
התאמת דפוסים בתוך מדיניות משתמשת בקלקולי פקודה מנותחים (argv), לא התאמה של מחרוזות גולמיות. זה מונע עקיפה דרך הזרקת אופרטור מעטפת (למשל דפוס עבור `sudo systemctl status *` לא יכול להיות מעוקף על ידי הוספת `; rm -rf /` לפקודה).
|
|
211
211
|
|
|
212
212
|
---
|
|
213
213
|
|
|
214
|
-
## מדיניות מותאמת
|
|
214
|
+
## מדיניות מותאמת
|
|
215
215
|
|
|
216
|
-
`src/hooks/custom-hooks-registry.ts` מיישם רישום `globalThis
|
|
216
|
+
`src/hooks/custom-hooks-registry.ts` מיישם רישום מסגרת `globalThis`:
|
|
217
217
|
|
|
218
218
|
```typescript
|
|
219
219
|
const REGISTRY_KEY = "__failproofai_custom_hooks__";
|
|
@@ -228,23 +228,23 @@ export function clearCustomHooks(): void { ... } // used in tests
|
|
|
228
228
|
|
|
229
229
|
`src/hooks/custom-hooks-loader.ts` טוען את קובץ המדיניות של המשתמש:
|
|
230
230
|
|
|
231
|
-
1. קרא את `customPoliciesPath`
|
|
232
|
-
2. פתור לנתיב מוחלט; בדוק
|
|
233
|
-
3. כתוב מחדש את כל `from "failproofai"`
|
|
234
|
-
4. כתוב מחדש
|
|
235
|
-
5. כתוב קבצי `.mjs` זמניים ו-`import()`
|
|
236
|
-
6.
|
|
231
|
+
1. קרא את `customPoliciesPath` מהתצורה; דלג אם חסר.
|
|
232
|
+
2. פתור לנתיב מוחלט; בדוק קובץ קיים.
|
|
233
|
+
3. כתוב מחדש את כל `from "failproofai"` ייבוא לנתיב ה-dist בפועל כדי `customPolicies` יתבררו לרישום `globalThis` זהה.
|
|
234
|
+
4. כתוב מחדש ייבוא מקומי חולף רקורסיבי כדי להבטיח התאימות ESM.
|
|
235
|
+
5. כתוב קבצי `.mjs` זמניים ו-`import()` קובץ הכניסה.
|
|
236
|
+
6. התקשר ל-`getCustomHooks()` כדי לשלוח קטגוריות מחדש.
|
|
237
237
|
7. נקה את כל הקבצים הזמניים בבלוק `finally`.
|
|
238
238
|
|
|
239
|
-
בכל שגיאה (קובץ לא נמצא, שגיאת תחביר,
|
|
239
|
+
בכל שגיאה (קובץ לא נמצא, שגיאת תחביר, כישלון ייבוא), השגיאה מתועדת ב-`~/.failproofai/hook.log` והטוען מחזיר מערך ריק. מדיניות מובנית לא מושפעת.
|
|
240
240
|
|
|
241
|
-
מדיניות מותאמת
|
|
241
|
+
מדיניות מותאמת מוערכת לאחר כל המדיניות המובנות. `deny` מדיניות מותאמת עדיין מעיל קצר מדיניות מותאמת נוספת (אך כל הבנוי כבר רץ בנקודה זו).
|
|
242
242
|
|
|
243
243
|
---
|
|
244
244
|
|
|
245
245
|
## רישום פעילות
|
|
246
246
|
|
|
247
|
-
לאחר כל אירוע hook, המטפל
|
|
247
|
+
לאחר כל אירוע hook, המטפל מוסיף שורת JSONL ל-`~/.failproofai/hook-activity.jsonl`:
|
|
248
248
|
|
|
249
249
|
```json
|
|
250
250
|
{
|
|
@@ -259,13 +259,13 @@ export function clearCustomHooks(): void { ... } // used in tests
|
|
|
259
259
|
}
|
|
260
260
|
```
|
|
261
261
|
|
|
262
|
-
שורה אחת לכל מדיניות
|
|
262
|
+
שורה אחת לכל מדיניות שנתנה החלטה שאינה מאפשרת. החלטות Allow לא מתועדות (כדי לשמור את הקובץ קטן).
|
|
263
263
|
|
|
264
264
|
---
|
|
265
265
|
|
|
266
|
-
## ארכיטקטורת לוח
|
|
266
|
+
## ארכיטקטורת לוח המחוונים
|
|
267
267
|
|
|
268
|
-
לוח
|
|
268
|
+
לוח המחוונים הוא אפליקציית **Next.js 16** באמצעות App Router עם React Server Components ו-Server Actions.
|
|
269
269
|
|
|
270
270
|
```text
|
|
271
271
|
app/
|
|
@@ -287,20 +287,20 @@ app/
|
|
|
287
287
|
|
|
288
288
|
**זרימת נתונים:**
|
|
289
289
|
|
|
290
|
-
- רכיבי עמוד קוראים ל-`lib/projects.ts` ו-`lib/log-entries.ts` כדי לקרוא נתוני
|
|
291
|
-
- עמוד המדיניות משתמש
|
|
292
|
-
-
|
|
290
|
+
- רכיבי עמוד קוראים ל-`lib/projects.ts` ו-`lib/log-entries.ts` כדי לקרוא נתוני פרויקט/מושב ישירות מ-filesystem (ללא שכבת API לקריאות).
|
|
291
|
+
- עמוד המדיניות משתמש בשרת Actions עבור כל מוטציות (החלפה, עדכון params, התקנה/הסרה).
|
|
292
|
+
- צופה המושב מנתח פורמט תוליד JSONL של Claude ומרחיב ציר זמן של הודעות וקריאות כלים.
|
|
293
293
|
|
|
294
294
|
**החלטות עיצוב מרכזיות:**
|
|
295
295
|
|
|
296
|
-
- אין
|
|
297
|
-
- Server Actions למוטציות - אין צורך ב-REST API
|
|
298
|
-
- React Server Components עבור עמודי קריאה -
|
|
299
|
-
-
|
|
296
|
+
- אין מסד נתונים - כל המצב קבוע נמצא בקבצים רגילים (`~/.failproofai/`, `~/.claude/projects/`).
|
|
297
|
+
- Server Actions למוטציות - אין צורך ב-REST API לפעולות CRUD.
|
|
298
|
+
- React Server Components עבור עמודי קריאה - קריאה ראשונית מהירה יותר, אין צרור לקוח לאחזור נתונים.
|
|
299
|
+
- רכיבי לקוח רק בו זה דרוש אינטראקטיביות (החלפות מדיניות, חיפוש פעילות, צופה יומן).
|
|
300
300
|
|
|
301
301
|
---
|
|
302
302
|
|
|
303
|
-
## פריסת
|
|
303
|
+
## פריסת קבצים
|
|
304
304
|
|
|
305
305
|
```text
|
|
306
306
|
failproofai/
|