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,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
|
-
title:
|
|
3
|
-
description: "Scrivi le tue
|
|
2
|
+
title: Policy Personalizzate
|
|
3
|
+
description: "Scrivi le tue regole in JavaScript - applica convenzioni, previeni derive, rileva errori, integra con sistemi esterni"
|
|
4
4
|
icon: code
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Le
|
|
7
|
+
Le policy personalizzate ti permettono di scrivere regole per qualsiasi comportamento dell'agente: applicare convenzioni di progetto, prevenire derive, bloccare operazioni distruttive, rilevare agenti bloccati, o integrarsi con Slack, workflow di approvazione e altro. Utilizzano lo stesso sistema di eventi hook e le decisioni `allow`, `deny`, `instruct` delle policy built-in.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Esempio
|
|
11
|
+
## Esempio veloce
|
|
12
12
|
|
|
13
13
|
```js
|
|
14
14
|
// my-policies.js
|
|
@@ -37,14 +37,14 @@ failproofai policies --install --custom ./my-policies.js
|
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
40
|
-
## Due modi per caricare
|
|
40
|
+
## Due modi per caricare policy personalizzate
|
|
41
41
|
|
|
42
42
|
### Opzione 1: Basata su convenzione (consigliato)
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
Posiziona file `*policies.{js,mjs,ts}` in `.failproofai/policies/` e vengono caricati automaticamente — nessun flag o modifica di configurazione necessaria. Funziona come i git hook: aggiungi un file, e semplicemente funziona.
|
|
45
45
|
|
|
46
46
|
```
|
|
47
|
-
# Livello di progetto —
|
|
47
|
+
# Livello di progetto — committato su git, condiviso con il team
|
|
48
48
|
.failproofai/policies/security-policies.mjs
|
|
49
49
|
.failproofai/policies/workflow-policies.mjs
|
|
50
50
|
|
|
@@ -53,38 +53,38 @@ Inserisci file `*policies.{js,mjs,ts}` in `.failproofai/policies/` e verranno ca
|
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
**Come funziona:**
|
|
56
|
-
- Entrambe le directory di progetto e utente
|
|
56
|
+
- Entrambe le directory di progetto e utente sono scansionate (unione — non first-scope-wins)
|
|
57
57
|
- I file vengono caricati alfabeticamente all'interno di ogni directory. Aggiungi il prefisso `01-`, `02-` per controllare l'ordine
|
|
58
|
-
- Solo i file
|
|
58
|
+
- Solo i file corrispondenti a `*policies.{js,mjs,ts}` vengono caricati; altri file vengono ignorati
|
|
59
59
|
- Ogni file viene caricato indipendentemente (fail-open per file)
|
|
60
|
-
- Funziona insieme
|
|
60
|
+
- Funziona insieme a policy `--custom` esplicite e built-in
|
|
61
61
|
|
|
62
62
|
<Tip>
|
|
63
|
-
Le
|
|
63
|
+
Le policy per convenzione sono il modo più semplice per creare uno standard di qualità per la tua organizzazione. Committa `.failproofai/policies/` su git e ogni membro del team ottiene automaticamente le stesse regole — nessuna configurazione per-sviluppatore necessaria. Man mano che il tuo team scopre nuove modalità di errore, aggiungi una policy e fai push. Nel tempo queste diventano uno standard di qualità vivente che migliora continuamente con ogni contributo.
|
|
64
64
|
</Tip>
|
|
65
65
|
|
|
66
66
|
### Opzione 2: Percorso file esplicito
|
|
67
67
|
|
|
68
68
|
```bash
|
|
69
|
-
# Installa con un file di
|
|
69
|
+
# Installa con un file di policy personalizzate
|
|
70
70
|
failproofai policies --install --custom ./my-policies.js
|
|
71
71
|
|
|
72
|
-
# Sostituisci il percorso del file di
|
|
72
|
+
# Sostituisci il percorso del file di policy
|
|
73
73
|
failproofai policies --install --custom ./new-policies.js
|
|
74
74
|
|
|
75
|
-
# Rimuovi il percorso delle
|
|
75
|
+
# Rimuovi il percorso delle policy personalizzate dalla configurazione
|
|
76
76
|
failproofai policies --uninstall --custom
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
Il percorso assoluto risolto viene
|
|
79
|
+
Il percorso assoluto risolto viene archiviato in `policies-config.json` come `customPoliciesPath`. Il file viene caricato di nuovo ad ogni evento hook - non c'è caching tra gli eventi.
|
|
80
80
|
|
|
81
81
|
### Usare entrambi insieme
|
|
82
82
|
|
|
83
|
-
Le
|
|
83
|
+
Le policy per convenzione e il file `--custom` esplicito possono coesistere. Ordine di caricamento:
|
|
84
84
|
|
|
85
85
|
1. File `customPoliciesPath` esplicito (se configurato)
|
|
86
|
-
2. File
|
|
87
|
-
3. File
|
|
86
|
+
2. File per convenzione di progetto (`{cwd}/.failproofai/policies/`, alfabetico)
|
|
87
|
+
3. File per convenzione utente (`~/.failproofai/policies/`, alfabetico)
|
|
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
|
-
Registra una
|
|
101
|
+
Registra una policy. Chiama questa funzione tutte le volte necessarie per più policy nello stesso file.
|
|
102
102
|
|
|
103
103
|
```ts
|
|
104
104
|
customPolicies.add({
|
|
@@ -109,34 +109,34 @@ customPolicies.add({
|
|
|
109
109
|
});
|
|
110
110
|
```
|
|
111
111
|
|
|
112
|
-
###
|
|
112
|
+
### Decision helpers
|
|
113
113
|
|
|
114
114
|
| Funzione | Effetto | Usare quando |
|
|
115
|
-
|
|
116
|
-
| `allow()` |
|
|
117
|
-
| `deny(message)` | Blocca l'operazione | L'agente non dovrebbe
|
|
118
|
-
| `instruct(message)` | Aggiungi contesto senza bloccare |
|
|
115
|
+
|----------|--------|----------|
|
|
116
|
+
| `allow()` | Permetti l'operazione silenziosamente | L'azione è sicura, nessun messaggio necessario |
|
|
117
|
+
| `deny(message)` | Blocca l'operazione | L'agente non dovrebbe eseguire questa azione |
|
|
118
|
+
| `instruct(message)` | Aggiungi contesto senza bloccare | Dai all'agente contesto extra per rimanere in traccia |
|
|
119
119
|
|
|
120
|
-
`deny(message)` - il messaggio appare a Claude con prefisso `"Blocked by failproofai:"`. Un singolo `deny` interrompe la valutazione successiva.
|
|
120
|
+
`deny(message)` - il messaggio appare a Claude con prefisso `"Blocked by failproofai:"`. Un singolo `deny` interrompe tutta la valutazione successiva.
|
|
121
121
|
|
|
122
122
|
`instruct(message)` - il messaggio viene aggiunto al contesto di Claude per la chiamata dello strumento corrente. Tutti i messaggi `instruct` vengono accumulati e consegnati insieme.
|
|
123
123
|
|
|
124
124
|
<Tip>
|
|
125
|
-
Puoi aggiungere
|
|
125
|
+
Puoi aggiungere guida extra a qualsiasi messaggio `deny` o `instruct` aggiungendo un campo `hint` in `policyParams` — nessuna modifica del codice necessaria. Questo funziona per policy personalizzate (`custom/`), per convenzione di progetto (`.failproofai-project/`), e per convenzione utente (`.failproofai-user/`) anche. Vedi [Configuration → hint](/it/configuration#hint-cross-cutting) per i dettagli.
|
|
126
126
|
</Tip>
|
|
127
127
|
|
|
128
|
-
### Messaggi informativi
|
|
128
|
+
### Messaggi allow informativi
|
|
129
129
|
|
|
130
|
-
`allow(message)`
|
|
130
|
+
`allow(message)` permette l'operazione **e** invia un messaggio informativo indietro a Claude. Il messaggio viene consegnato come `additionalContext` nella risposta stdout del gestore hook — lo stesso meccanismo usato da `instruct`, ma semanticamente diverso: è un aggiornamento di stato, non un avviso.
|
|
131
131
|
|
|
132
132
|
| Funzione | Effetto | Usare quando |
|
|
133
|
-
|
|
134
|
-
| `allow(message)` |
|
|
133
|
+
|----------|--------|----------|
|
|
134
|
+
| `allow(message)` | Permetti e invia contesto a Claude | Conferma che un controllo è passato, o spiega perché un controllo è stato saltato |
|
|
135
135
|
|
|
136
136
|
Casi d'uso:
|
|
137
137
|
- **Conferme di stato:** `allow("All CI checks passed.")` — dice a Claude che tutto è verde
|
|
138
|
-
- **Spiegazioni fail-open:** `allow("GitHub CLI not installed, skipping CI check.")` — dice a Claude perché un controllo è stato saltato
|
|
139
|
-
- **Più messaggi si accumulano:** se
|
|
138
|
+
- **Spiegazioni fail-open:** `allow("GitHub CLI not installed, skipping CI check.")` — dice a Claude perché un controllo è stato saltato così ha il contesto completo
|
|
139
|
+
- **Più messaggi si accumulano:** se più policy ciascuna restituisce `allow(message)`, tutti i messaggi vengono uniti con newline e consegnati insieme
|
|
140
140
|
|
|
141
141
|
```js
|
|
142
142
|
customPolicies.add({
|
|
@@ -160,9 +160,9 @@ customPolicies.add({
|
|
|
160
160
|
| Campo | Tipo | Descrizione |
|
|
161
161
|
|-------|------|-------------|
|
|
162
162
|
| `eventType` | `string` | `"PreToolUse"`, `"PostToolUse"`, `"Notification"`, `"Stop"` |
|
|
163
|
-
| `toolName` | `string \| undefined` | Lo strumento
|
|
163
|
+
| `toolName` | `string \| undefined` | Lo strumento in corso di chiamata (es. `"Bash"`, `"Write"`, `"Read"`) |
|
|
164
164
|
| `toolInput` | `Record<string, unknown> \| undefined` | I parametri di input dello strumento |
|
|
165
|
-
| `payload` | `Record<string, unknown>` | Payload
|
|
165
|
+
| `payload` | `Record<string, unknown>` | Payload evento grezzo completo da Claude Code |
|
|
166
166
|
| `session` | `SessionMetadata \| undefined` | Contesto della sessione (vedi sotto) |
|
|
167
167
|
|
|
168
168
|
### Campi `SessionMetadata`
|
|
@@ -175,33 +175,33 @@ customPolicies.add({
|
|
|
175
175
|
|
|
176
176
|
### Tipi di evento
|
|
177
177
|
|
|
178
|
-
| Evento | Quando
|
|
179
|
-
|
|
178
|
+
| Evento | Quando si attiva | Contenuti `toolInput` |
|
|
179
|
+
|-------|--------------|----------------------|
|
|
180
180
|
| `PreToolUse` | Prima che Claude esegua uno strumento | L'input dello strumento (es. `{ command: "..." }` per Bash) |
|
|
181
181
|
| `PostToolUse` | Dopo che uno strumento si completa | L'input dello strumento + `tool_result` (l'output) |
|
|
182
|
-
| `Notification` | Quando Claude invia una notifica | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }` -
|
|
182
|
+
| `Notification` | Quando Claude invia una notifica | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }` - gli hook devono sempre restituire `allow()`, non possono bloccare le notifiche |
|
|
183
183
|
| `Stop` | Quando la sessione Claude termina | Vuoto |
|
|
184
184
|
|
|
185
185
|
---
|
|
186
186
|
|
|
187
187
|
## Ordine di valutazione
|
|
188
188
|
|
|
189
|
-
Le
|
|
189
|
+
Le policy vengono valutate in questo ordine:
|
|
190
190
|
|
|
191
|
-
1.
|
|
192
|
-
2.
|
|
193
|
-
3.
|
|
194
|
-
4.
|
|
191
|
+
1. Policy built-in (in ordine di definizione)
|
|
192
|
+
2. Policy personalizzate esplicite da `customPoliciesPath` (in ordine `.add()`)
|
|
193
|
+
3. Policy per convenzione dal progetto `.failproofai/policies/` (file alfabetico, ordine `.add()` interno)
|
|
194
|
+
4. Policy per convenzione dall'utente `~/.failproofai/policies/` (file alfabetico, ordine `.add()` interno)
|
|
195
195
|
|
|
196
196
|
<Note>
|
|
197
|
-
Il primo `deny` interrompe tutte le
|
|
197
|
+
Il primo `deny` interrompe tutte le policy successive. Tutti i messaggi `instruct` vengono accumulati e consegnati insieme.
|
|
198
198
|
</Note>
|
|
199
199
|
|
|
200
200
|
---
|
|
201
201
|
|
|
202
202
|
## Import transitivi
|
|
203
203
|
|
|
204
|
-
I file di
|
|
204
|
+
I file di policy personalizzate possono importare moduli locali usando percorsi relativi:
|
|
205
205
|
|
|
206
206
|
```js
|
|
207
207
|
// my-policies.js
|
|
@@ -222,42 +222,42 @@ Tutti gli import relativi raggiungibili dal file di entry vengono risolti. Quest
|
|
|
222
222
|
|
|
223
223
|
---
|
|
224
224
|
|
|
225
|
-
## Filtraggio
|
|
225
|
+
## Filtraggio del tipo di evento
|
|
226
226
|
|
|
227
|
-
Usa `match.events` per limitare quando una
|
|
227
|
+
Usa `match.events` per limitare quando una policy si attiva:
|
|
228
228
|
|
|
229
229
|
```js
|
|
230
230
|
customPolicies.add({
|
|
231
231
|
name: "require-summary-on-stop",
|
|
232
232
|
match: { events: ["Stop"] },
|
|
233
233
|
fn: async (ctx) => {
|
|
234
|
-
//
|
|
235
|
-
// ctx.session.transcriptPath
|
|
234
|
+
// Only fires when the session ends
|
|
235
|
+
// ctx.session.transcriptPath contains the full session log
|
|
236
236
|
return allow();
|
|
237
237
|
},
|
|
238
238
|
});
|
|
239
239
|
```
|
|
240
240
|
|
|
241
|
-
Ometti
|
|
241
|
+
Ometti `match` completamente per attivare su ogni tipo di evento.
|
|
242
242
|
|
|
243
243
|
---
|
|
244
244
|
|
|
245
|
-
## Gestione degli errori e modalità di
|
|
245
|
+
## Gestione degli errori e modalità di guasto
|
|
246
246
|
|
|
247
|
-
Le
|
|
247
|
+
Le policy personalizzate sono **fail-open**: gli errori non bloccheranno mai le policy built-in o crasheranno il gestore hook.
|
|
248
248
|
|
|
249
|
-
|
|
|
250
|
-
|
|
251
|
-
| `customPoliciesPath` non impostato | Nessuna
|
|
252
|
-
| File non trovato | Avviso registrato in `~/.failproofai/hook.log`;
|
|
253
|
-
| Errore di sintassi/import (esplicito) | Errore registrato in `~/.failproofai/hook.log`; le
|
|
254
|
-
| Errore di sintassi/import (convenzione) | Errore registrato; quel file viene saltato,
|
|
255
|
-
| `fn`
|
|
249
|
+
| Guasto | Comportamento |
|
|
250
|
+
|---------|----------|
|
|
251
|
+
| `customPoliciesPath` non impostato | Nessuna policy personalizzata esplicita viene eseguita; le policy per convenzione e le built-in continuano normalmente |
|
|
252
|
+
| File non trovato | Avviso registrato in `~/.failproofai/hook.log`; le built-in continuano |
|
|
253
|
+
| Errore di sintassi/import (esplicito) | Errore registrato in `~/.failproofai/hook.log`; le policy personalizzate esplicite vengono saltate |
|
|
254
|
+
| Errore di sintassi/import (convenzione) | Errore registrato; quel file viene saltato, altri file per convenzione si caricano ancora |
|
|
255
|
+
| `fn` lancia a runtime | Errore registrato; quell'hook viene trattato come `allow`; altri hook continuano |
|
|
256
256
|
| `fn` impiega più di 10s | Timeout registrato; trattato come `allow` |
|
|
257
|
-
| Directory
|
|
257
|
+
| Directory per convenzione mancante | Nessuna policy per convenzione viene eseguita; nessun errore |
|
|
258
258
|
|
|
259
259
|
<Tip>
|
|
260
|
-
Per
|
|
260
|
+
Per debuggare gli errori delle policy personalizzate, guarda il file log:
|
|
261
261
|
|
|
262
262
|
```bash
|
|
263
263
|
tail -f ~/.failproofai/hook.log
|
|
@@ -266,7 +266,7 @@ tail -f ~/.failproofai/hook.log
|
|
|
266
266
|
|
|
267
267
|
---
|
|
268
268
|
|
|
269
|
-
## Esempio completo:
|
|
269
|
+
## Esempio completo: policy multiple
|
|
270
270
|
|
|
271
271
|
```js
|
|
272
272
|
// my-policies.js
|
|
@@ -323,22 +323,22 @@ export { customPolicies };
|
|
|
323
323
|
|
|
324
324
|
## Esempi
|
|
325
325
|
|
|
326
|
-
La directory `examples/` contiene file di
|
|
326
|
+
La directory `examples/` contiene file di policy pronti all'esecuzione:
|
|
327
327
|
|
|
328
328
|
| File | Contenuti |
|
|
329
329
|
|------|----------|
|
|
330
|
-
| `examples/policies-basic.js` | Cinque
|
|
331
|
-
| `examples/policies-advanced/index.js` | Pattern avanzati: import transitivi, chiamate async, scrubbing
|
|
332
|
-
| `examples/convention-policies/security-policies.mjs` |
|
|
333
|
-
| `examples/convention-policies/workflow-policies.mjs` |
|
|
330
|
+
| `examples/policies-basic.js` | Cinque policy per iniziare che coprono modalità di guasto comuni dell'agente |
|
|
331
|
+
| `examples/policies-advanced/index.js` | Pattern avanzati: import transitivi, chiamate async, output scrubbing, e hook di fine sessione |
|
|
332
|
+
| `examples/convention-policies/security-policies.mjs` | Policy di sicurezza basate su convenzione (blocca scritture .env, previeni riscrittura della cronologia git) |
|
|
333
|
+
| `examples/convention-policies/workflow-policies.mjs` | Policy di workflow basate su convenzione (promemoria test, file di audit writes) |
|
|
334
334
|
|
|
335
|
-
###
|
|
335
|
+
### Usando esempi di file espliciti
|
|
336
336
|
|
|
337
337
|
```bash
|
|
338
338
|
failproofai policies --install --custom ./examples/policies-basic.js
|
|
339
339
|
```
|
|
340
340
|
|
|
341
|
-
###
|
|
341
|
+
### Usando esempi basati su convenzione
|
|
342
342
|
|
|
343
343
|
```bash
|
|
344
344
|
# Copy to project level
|
|
@@ -350,4 +350,4 @@ mkdir -p ~/.failproofai/policies
|
|
|
350
350
|
cp examples/convention-policies/*.mjs ~/.failproofai/policies/
|
|
351
351
|
```
|
|
352
352
|
|
|
353
|
-
Nessun comando
|
|
353
|
+
Nessun comando di installazione necessario — i file vengono raccolti automaticamente al prossimo evento hook.
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Esempi
|
|
3
|
-
description: "Come configurare hook per Claude Code e Agents SDK"
|
|
3
|
+
description: "Come configurare i hook per Claude Code e l'Agents SDK"
|
|
4
4
|
icon: book-open
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Esempi pronti all'uso per scenari comuni.
|
|
7
|
+
Esempi pronti all'uso per scenari comuni. Ognuno mostra come installare e cosa aspettarsi.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Configurazione
|
|
11
|
+
## Configurazione dei hook per Claude Code
|
|
12
12
|
|
|
13
|
-
Failproof AI si integra con Claude Code tramite il suo [sistema di hook](https://docs.anthropic.com/en/docs/claude-code/hooks). Quando esegui `failproofai policies --install`, registra comandi hook
|
|
13
|
+
Failproof AI si integra con Claude Code tramite il suo [sistema di hook](https://docs.anthropic.com/en/docs/claude-code/hooks). Quando esegui `failproofai policies --install`, registra i comandi dei hook in `settings.json` di Claude Code che si attivano ad ogni chiamata di strumento.
|
|
14
14
|
|
|
15
15
|
<Steps>
|
|
16
16
|
<Step title="Installa failproofai">
|
|
@@ -18,32 +18,32 @@ Failproof AI si integra con Claude Code tramite il suo [sistema di hook](https:/
|
|
|
18
18
|
npm install -g failproofai
|
|
19
19
|
```
|
|
20
20
|
</Step>
|
|
21
|
-
<Step title="Abilita tutte le
|
|
21
|
+
<Step title="Abilita tutte le politiche integrate">
|
|
22
22
|
```bash
|
|
23
23
|
failproofai policies --install
|
|
24
24
|
```
|
|
25
25
|
</Step>
|
|
26
|
-
<Step title="Verifica che
|
|
26
|
+
<Step title="Verifica che i hook siano registrati">
|
|
27
27
|
```bash
|
|
28
28
|
cat ~/.claude/settings.json | grep failproofai
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
Dovresti vedere voci
|
|
31
|
+
Dovresti vedere le voci dei hook per gli eventi `PreToolUse`, `PostToolUse`, `Notification` e `Stop`.
|
|
32
32
|
</Step>
|
|
33
33
|
<Step title="Esegui Claude Code">
|
|
34
34
|
```bash
|
|
35
35
|
claude
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
Le
|
|
38
|
+
Le politiche ora vengono eseguite automaticamente ad ogni chiamata di strumento. Prova a chiedere a Claude di eseguire `sudo rm -rf /` - verrà bloccato.
|
|
39
39
|
</Step>
|
|
40
40
|
</Steps>
|
|
41
41
|
|
|
42
42
|
---
|
|
43
43
|
|
|
44
|
-
## Configurazione
|
|
44
|
+
## Configurazione dei hook per l'Agents SDK
|
|
45
45
|
|
|
46
|
-
Se stai costruendo con [Agents SDK](https://docs.anthropic.com/en/docs/agents-sdk), puoi
|
|
46
|
+
Se stai costruendo con l'[Agents SDK](https://docs.anthropic.com/en/docs/agents-sdk), puoi usare lo stesso sistema di hook a livello programmatico.
|
|
47
47
|
|
|
48
48
|
<Steps>
|
|
49
49
|
<Step title="Installa failproofai nel tuo progetto">
|
|
@@ -51,33 +51,33 @@ Se stai costruendo con [Agents SDK](https://docs.anthropic.com/en/docs/agents-sd
|
|
|
51
51
|
npm install failproofai
|
|
52
52
|
```
|
|
53
53
|
</Step>
|
|
54
|
-
<Step title="Configura
|
|
55
|
-
Passa comandi hook quando crei il tuo processo agent.
|
|
54
|
+
<Step title="Configura i hook nel tuo agent">
|
|
55
|
+
Passa i comandi dei hook quando crei il tuo processo di agent. I hook si attivano allo stesso modo di Claude Code - tramite JSON su stdin/stdout:
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
|
-
failproofai --hook PreToolUse #
|
|
59
|
-
failproofai --hook PostToolUse #
|
|
58
|
+
failproofai --hook PreToolUse # chiamato prima di ogni strumento
|
|
59
|
+
failproofai --hook PostToolUse # chiamato dopo ogni strumento
|
|
60
60
|
```
|
|
61
61
|
</Step>
|
|
62
|
-
<Step title="Scrivi una
|
|
62
|
+
<Step title="Scrivi una politica personalizzata per il tuo agent">
|
|
63
63
|
```javascript
|
|
64
64
|
import { customPolicies, allow, deny } from "failproofai";
|
|
65
65
|
|
|
66
66
|
customPolicies.add({
|
|
67
67
|
name: "limit-to-project-dir",
|
|
68
|
-
description: "
|
|
68
|
+
description: "Mantieni l'agent all'interno della directory del progetto",
|
|
69
69
|
match: { events: ["PreToolUse"] },
|
|
70
70
|
fn: async (ctx) => {
|
|
71
71
|
const path = String(ctx.toolInput?.file_path ?? "");
|
|
72
72
|
if (path.startsWith("/") && !path.startsWith(ctx.session?.cwd ?? "")) {
|
|
73
|
-
return deny("
|
|
73
|
+
return deny("L'agent è limitato alla directory del progetto");
|
|
74
74
|
}
|
|
75
75
|
return allow();
|
|
76
76
|
},
|
|
77
77
|
});
|
|
78
78
|
```
|
|
79
79
|
</Step>
|
|
80
|
-
<Step title="Installa la
|
|
80
|
+
<Step title="Installa la politica personalizzata">
|
|
81
81
|
```bash
|
|
82
82
|
failproofai policies --install --custom ./my-agent-policies.js
|
|
83
83
|
```
|
|
@@ -88,7 +88,7 @@ Se stai costruendo con [Agents SDK](https://docs.anthropic.com/en/docs/agents-sd
|
|
|
88
88
|
|
|
89
89
|
## Blocca i comandi distruttivi
|
|
90
90
|
|
|
91
|
-
La configurazione più comune -
|
|
91
|
+
La configurazione più comune - previeni agli agent di causare danni irreversibili.
|
|
92
92
|
|
|
93
93
|
```bash
|
|
94
94
|
failproofai policies --install block-sudo block-rm-rf block-force-push block-curl-pipe-sh
|
|
@@ -104,45 +104,45 @@ Cosa fa:
|
|
|
104
104
|
|
|
105
105
|
## Previeni la perdita di segreti
|
|
106
106
|
|
|
107
|
-
Impedisci agli agent di
|
|
107
|
+
Impedisci agli agent di visualizzare o perdere credenziali nell'output dello strumento.
|
|
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
|
-
|
|
113
|
+
Questi si attivano su `PostToolUse` - dopo che uno strumento è stato eseguito, ripuliscono l'output prima che l'agent lo veda.
|
|
114
114
|
|
|
115
115
|
---
|
|
116
116
|
|
|
117
117
|
## Ricevi avvisi Slack quando gli agent hanno bisogno di attenzione
|
|
118
118
|
|
|
119
|
-
|
|
119
|
+
Usa l'hook di notifica per inoltrare gli avvisi di inattività a 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: "Avvisa Slack quando l'agent è in attesa di input",
|
|
127
127
|
match: { events: ["Notification"] },
|
|
128
128
|
fn: async (ctx) => {
|
|
129
129
|
const webhookUrl = process.env.SLACK_WEBHOOK_URL;
|
|
130
130
|
if (!webhookUrl) return allow();
|
|
131
131
|
|
|
132
|
-
const message = String(ctx.payload?.message ?? "
|
|
133
|
-
const project = ctx.session?.cwd ?? "
|
|
132
|
+
const message = String(ctx.payload?.message ?? "L'agent è in attesa");
|
|
133
|
+
const project = ctx.session?.cwd ?? "sconosciuto";
|
|
134
134
|
|
|
135
135
|
try {
|
|
136
136
|
await fetch(webhookUrl, {
|
|
137
137
|
method: "POST",
|
|
138
138
|
headers: { "Content-Type": "application/json" },
|
|
139
139
|
body: JSON.stringify({
|
|
140
|
-
text: `*${message}*\
|
|
140
|
+
text: `*${message}*\nProgetto: \`${project}\``,
|
|
141
141
|
}),
|
|
142
142
|
signal: AbortSignal.timeout(5000),
|
|
143
143
|
});
|
|
144
144
|
} catch {
|
|
145
|
-
//
|
|
145
|
+
// non bloccare mai l'agent se Slack non è raggiungibile
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
return allow();
|
|
@@ -160,20 +160,20 @@ SLACK_WEBHOOK_URL=https://hooks.slack.com/... failproofai policies --install --c
|
|
|
160
160
|
|
|
161
161
|
## Mantieni gli agent su un branch
|
|
162
162
|
|
|
163
|
-
|
|
163
|
+
Previeni agli agent di cambiare branch o fare push a quelli protetti.
|
|
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: "Impedisci all'agent di fare checkout di altri branch",
|
|
171
171
|
match: { events: ["PreToolUse"] },
|
|
172
172
|
fn: async (ctx) => {
|
|
173
173
|
if (ctx.toolName !== "Bash") return allow();
|
|
174
174
|
const cmd = String(ctx.toolInput?.command ?? "");
|
|
175
175
|
if (/git\s+checkout\s+(?!-b)/.test(cmd)) {
|
|
176
|
-
return deny("
|
|
176
|
+
return deny("Rimani sul branch corrente. Crea un nuovo branch con -b se necessario.");
|
|
177
177
|
}
|
|
178
178
|
return allow();
|
|
179
179
|
},
|
|
@@ -182,7 +182,7 @@ customPolicies.add({
|
|
|
182
182
|
|
|
183
183
|
---
|
|
184
184
|
|
|
185
|
-
## Richiedi test prima dei commit
|
|
185
|
+
## Richiedi i test prima dei commit
|
|
186
186
|
|
|
187
187
|
Ricorda agli agent di eseguire i test prima di fare commit.
|
|
188
188
|
|
|
@@ -191,13 +191,13 @@ import { customPolicies, allow, instruct } from "failproofai";
|
|
|
191
191
|
|
|
192
192
|
customPolicies.add({
|
|
193
193
|
name: "test-before-commit",
|
|
194
|
-
description: "
|
|
194
|
+
description: "Ricorda all'agent di eseguire i test prima di fare commit",
|
|
195
195
|
match: { events: ["PreToolUse"] },
|
|
196
196
|
fn: async (ctx) => {
|
|
197
197
|
if (ctx.toolName !== "Bash") return allow();
|
|
198
198
|
const cmd = String(ctx.toolInput?.command ?? "");
|
|
199
199
|
if (/git\s+commit/.test(cmd)) {
|
|
200
|
-
return instruct("
|
|
200
|
+
return instruct("Esegui i test prima di fare commit. Usa prima `npm test` o `bun test`.");
|
|
201
201
|
}
|
|
202
202
|
return allow();
|
|
203
203
|
},
|
|
@@ -206,9 +206,9 @@ customPolicies.add({
|
|
|
206
206
|
|
|
207
207
|
---
|
|
208
208
|
|
|
209
|
-
##
|
|
209
|
+
## Blocca un repository di produzione
|
|
210
210
|
|
|
211
|
-
|
|
211
|
+
Commit una configurazione a livello di progetto in modo che ogni sviluppatore del tuo team ottenga le stesse politiche.
|
|
212
212
|
|
|
213
213
|
Crea `.failproofai/policies-config.json` nel tuo repository:
|
|
214
214
|
|
|
@@ -235,19 +235,73 @@ Poi fai il commit:
|
|
|
235
235
|
|
|
236
236
|
```bash
|
|
237
237
|
git add .failproofai/policies-config.json
|
|
238
|
-
git commit -m "
|
|
238
|
+
git commit -m "Aggiungi politiche failproofai del team"
|
|
239
239
|
```
|
|
240
240
|
|
|
241
241
|
Ogni membro del team che ha failproofai installato raccoglierà automaticamente queste regole.
|
|
242
242
|
|
|
243
243
|
---
|
|
244
244
|
|
|
245
|
+
## Costruisci uno standard di qualità a livello di organizzazione con politiche di convenzione
|
|
246
|
+
|
|
247
|
+
La configurazione più impattante: commit `.failproofai/policies/` nel tuo repository con politiche personalizzate per il tuo progetto. Ogni membro del team le ottiene automaticamente — nessun comando di installazione, nessun cambiamento di configurazione.
|
|
248
|
+
|
|
249
|
+
<Steps>
|
|
250
|
+
<Step title="Crea la directory e aggiungi le politiche">
|
|
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
|
+
// Applica il package manager preferito del tuo team
|
|
260
|
+
// (o abilita invece la politica integrata 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("Usa bun invece di npm.");
|
|
268
|
+
return allow();
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
// Ricorda all'agent di eseguire i test prima di fare commit
|
|
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("Esegui i test prima di fare commit.");
|
|
280
|
+
}
|
|
281
|
+
return allow();
|
|
282
|
+
},
|
|
283
|
+
});
|
|
284
|
+
```
|
|
285
|
+
</Step>
|
|
286
|
+
<Step title="Commit su git">
|
|
287
|
+
```bash
|
|
288
|
+
git add .failproofai/policies/
|
|
289
|
+
git commit -m "Aggiungi politiche di qualità del team"
|
|
290
|
+
```
|
|
291
|
+
</Step>
|
|
292
|
+
<Step title="Continua a migliorare">
|
|
293
|
+
Mentre il tuo team incontra nuove modalità di fallimento, aggiungi politiche e fai push. Tutti ricevono l'aggiornamento al loro prossimo `git pull`. Queste politiche diventano uno standard di qualità vivo che cresce con il tuo team.
|
|
294
|
+
</Step>
|
|
295
|
+
</Steps>
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
245
299
|
## Altri esempi
|
|
246
300
|
|
|
247
301
|
La directory [`examples/`](https://github.com/exospherehost/failproofai/tree/main/examples) nel repository contiene:
|
|
248
302
|
|
|
249
303
|
| File | Cosa mostra |
|
|
250
|
-
|
|
251
|
-
| `policies-basic.js` |
|
|
252
|
-
| `policies-notification.js` | Avvisi Slack per notifiche di inattività e fine sessione |
|
|
304
|
+
|------|---------------|
|
|
305
|
+
| `policies-basic.js` | Politiche di avvio - blocca le scritture di produzione, force-push, script in pipe |
|
|
306
|
+
| `policies-notification.js` | Avvisi Slack per notifiche di inattività e fine della sessione |
|
|
253
307
|
| `policies-advanced/index.js` | Import transitivi, hook asincroni, scrubbing dell'output PostToolUse, gestione dell'evento Stop |
|