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.
Files changed (160) hide show
  1. package/.next/standalone/.failproofai/policies/review-policies.mjs +4 -3
  2. package/.next/standalone/.next/BUILD_ID +1 -1
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/required-server-files.json +1 -1
  6. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  7. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  11. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  12. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  13. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  14. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  15. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  17. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  20. package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
  21. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  22. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  23. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
  24. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  25. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  26. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  27. package/.next/standalone/.next/server/app/index.html +1 -1
  28. package/.next/standalone/.next/server/app/index.rsc +15 -15
  29. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  30. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  31. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  32. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
  33. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  34. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  35. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
  38. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  41. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  44. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  45. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  48. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g72weg._.js +1 -1
  51. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
  52. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0~kmh8w._.js → [root-of-the-server]__05akje6._.js} +2 -2
  53. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
  54. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
  55. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
  56. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
  57. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0rh.18_._.js → [root-of-the-server]__0i5kvry._.js} +2 -2
  58. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
  59. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +2 -2
  60. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
  61. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
  62. package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
  63. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
  64. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
  65. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  66. package/.next/standalone/.next/server/pages/404.html +2 -2
  67. package/.next/standalone/.next/server/pages/500.html +1 -1
  68. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/server-reference-manifest.json +9 -9
  70. package/.next/standalone/.next/static/chunks/{08t08igdql9yt.js → 00j0rr7rh8ef8.js} +1 -1
  71. package/.next/standalone/.next/static/chunks/{12~yi9oj8av8p.js → 05j1px0r8yzh6.js} +2 -2
  72. package/.next/standalone/.next/static/chunks/{09_k80d~cq2wg.js → 0badv41uxa56..js} +1 -1
  73. package/.next/standalone/.next/static/chunks/{0wlyoif4_kj_t.js → 0ijk_kek9_wyx.js} +1 -1
  74. package/.next/standalone/.next/static/chunks/{0bvhsa6zva2o..js → 0ksdlt_1hucdm.js} +1 -1
  75. package/.next/standalone/.next/static/chunks/{03rz6ykw-a2xi.js → 0npb~873.wvg3.js} +1 -1
  76. package/.next/standalone/.next/static/chunks/{01b~z8f1ws0rk.js → 0xpl.oscrakvx.js} +1 -1
  77. package/.next/standalone/.next/static/chunks/{0gbf4cphy8ksq.js → 1052sguyd-.ka.js} +1 -1
  78. package/.next/standalone/.next/static/chunks/{0v.yd0kg_ld3r.js → 14cl9poem30dq.js} +1 -1
  79. package/.next/standalone/CHANGELOG.md +11 -0
  80. package/.next/standalone/dist/cli.mjs +3 -3
  81. package/.next/standalone/docs/ar/built-in-policies.mdx +124 -87
  82. package/.next/standalone/docs/ar/custom-policies.mdx +72 -72
  83. package/.next/standalone/docs/ar/examples.mdx +86 -33
  84. package/.next/standalone/docs/ar/getting-started.mdx +82 -29
  85. package/.next/standalone/docs/built-in-policies.mdx +1 -1
  86. package/.next/standalone/docs/de/built-in-policies.mdx +93 -56
  87. package/.next/standalone/docs/de/custom-policies.mdx +56 -56
  88. package/.next/standalone/docs/de/examples.mdx +72 -18
  89. package/.next/standalone/docs/de/getting-started.mdx +72 -20
  90. package/.next/standalone/docs/es/built-in-policies.mdx +115 -78
  91. package/.next/standalone/docs/es/custom-policies.mdx +55 -55
  92. package/.next/standalone/docs/es/examples.mdx +73 -19
  93. package/.next/standalone/docs/es/getting-started.mdx +72 -20
  94. package/.next/standalone/docs/fr/built-in-policies.mdx +83 -46
  95. package/.next/standalone/docs/fr/custom-policies.mdx +51 -51
  96. package/.next/standalone/docs/fr/examples.mdx +78 -24
  97. package/.next/standalone/docs/fr/getting-started.mdx +65 -13
  98. package/.next/standalone/docs/he/built-in-policies.mdx +156 -117
  99. package/.next/standalone/docs/he/custom-policies.mdx +75 -75
  100. package/.next/standalone/docs/he/examples.mdx +87 -33
  101. package/.next/standalone/docs/he/getting-started.mdx +84 -33
  102. package/.next/standalone/docs/hi/built-in-policies.mdx +101 -60
  103. package/.next/standalone/docs/hi/custom-policies.mdx +71 -70
  104. package/.next/standalone/docs/hi/examples.mdx +90 -36
  105. package/.next/standalone/docs/hi/getting-started.mdx +80 -27
  106. package/.next/standalone/docs/i18n/README.ar.md +69 -69
  107. package/.next/standalone/docs/i18n/README.de.md +46 -46
  108. package/.next/standalone/docs/i18n/README.es.md +42 -42
  109. package/.next/standalone/docs/i18n/README.fr.md +39 -39
  110. package/.next/standalone/docs/i18n/README.he.md +83 -83
  111. package/.next/standalone/docs/i18n/README.hi.md +69 -69
  112. package/.next/standalone/docs/i18n/README.it.md +72 -72
  113. package/.next/standalone/docs/i18n/README.ja.md +71 -71
  114. package/.next/standalone/docs/i18n/README.ko.md +52 -52
  115. package/.next/standalone/docs/i18n/README.pt-br.md +44 -44
  116. package/.next/standalone/docs/i18n/README.ru.md +66 -66
  117. package/.next/standalone/docs/i18n/README.tr.md +82 -83
  118. package/.next/standalone/docs/i18n/README.vi.md +70 -71
  119. package/.next/standalone/docs/i18n/README.zh.md +51 -51
  120. package/.next/standalone/docs/it/built-in-policies.mdx +118 -81
  121. package/.next/standalone/docs/it/custom-policies.mdx +69 -69
  122. package/.next/standalone/docs/it/examples.mdx +93 -39
  123. package/.next/standalone/docs/it/getting-started.mdx +73 -21
  124. package/.next/standalone/docs/ja/built-in-policies.mdx +98 -61
  125. package/.next/standalone/docs/ja/custom-policies.mdx +71 -71
  126. package/.next/standalone/docs/ja/examples.mdx +76 -22
  127. package/.next/standalone/docs/ja/getting-started.mdx +65 -13
  128. package/.next/standalone/docs/ko/built-in-policies.mdx +137 -100
  129. package/.next/standalone/docs/ko/custom-policies.mdx +67 -67
  130. package/.next/standalone/docs/ko/examples.mdx +87 -33
  131. package/.next/standalone/docs/ko/getting-started.mdx +61 -9
  132. package/.next/standalone/docs/pt-br/built-in-policies.mdx +94 -57
  133. package/.next/standalone/docs/pt-br/custom-policies.mdx +56 -56
  134. package/.next/standalone/docs/pt-br/examples.mdx +78 -24
  135. package/.next/standalone/docs/pt-br/getting-started.mdx +64 -12
  136. package/.next/standalone/docs/ru/built-in-policies.mdx +142 -105
  137. package/.next/standalone/docs/ru/custom-policies.mdx +82 -81
  138. package/.next/standalone/docs/ru/examples.mdx +77 -22
  139. package/.next/standalone/docs/ru/getting-started.mdx +74 -22
  140. package/.next/standalone/docs/tr/built-in-policies.mdx +104 -67
  141. package/.next/standalone/docs/tr/custom-policies.mdx +59 -60
  142. package/.next/standalone/docs/tr/examples.mdx +97 -42
  143. package/.next/standalone/docs/tr/getting-started.mdx +75 -23
  144. package/.next/standalone/docs/vi/built-in-policies.mdx +110 -72
  145. package/.next/standalone/docs/vi/custom-policies.mdx +68 -68
  146. package/.next/standalone/docs/vi/examples.mdx +93 -38
  147. package/.next/standalone/docs/vi/getting-started.mdx +74 -22
  148. package/.next/standalone/docs/zh/built-in-policies.mdx +132 -95
  149. package/.next/standalone/docs/zh/custom-policies.mdx +49 -49
  150. package/.next/standalone/docs/zh/examples.mdx +90 -36
  151. package/.next/standalone/docs/zh/getting-started.mdx +73 -21
  152. package/.next/standalone/package.json +1 -1
  153. package/.next/standalone/server.js +1 -1
  154. package/.next/standalone/src/hooks/builtin-policies.ts +5 -1
  155. package/dist/cli.mjs +3 -3
  156. package/package.json +1 -1
  157. package/src/hooks/builtin-policies.ts +5 -1
  158. /package/.next/standalone/.next/static/{CkmOT-ZvDN-sVULinGVKT → A9pNTZdoYJTVyPAYwQMx5}/_buildManifest.js +0 -0
  159. /package/.next/standalone/.next/static/{CkmOT-ZvDN-sVULinGVKT → A9pNTZdoYJTVyPAYwQMx5}/_clientMiddlewareManifest.js +0 -0
  160. /package/.next/standalone/.next/static/{CkmOT-ZvDN-sVULinGVKT → A9pNTZdoYJTVyPAYwQMx5}/_ssgManifest.js +0 -0
@@ -1,14 +1,14 @@
1
1
  ---
2
- title: Politiche personalizzate
3
- description: "Scrivi le tue politiche in JavaScript - applica convenzioni, previeni derive, rileva guasti, integrati con sistemi esterni"
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 politiche personalizzate ti permettono di scrivere regole per qualsiasi comportamento dell'agente: applica convenzioni di progetto, previeni derive, blocca operazioni distruttive, rileva agenti bloccati, oppure integrati con Slack, flussi di approvazione e altro. Utilizzano lo stesso sistema di eventi hook e le stesse decisioni `allow`, `deny`, `instruct` delle politiche integrate.
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 rapido
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 politiche personalizzate
40
+ ## Due modi per caricare policy personalizzate
41
41
 
42
42
  ### Opzione 1: Basata su convenzione (consigliato)
43
43
 
44
- Inserisci file `*policies.{js,mjs,ts}` in `.failproofai/policies/` e verranno caricati automaticamente — nessun flag o modifica della configurazione necessari. Funziona come i git hook: inserisci un file, e semplicemente funziona.
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 — commesso in git, condiviso con il team
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 vengono scansionate (unione — non vince il primo ambito)
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 che corrispondono a `*policies.{js,mjs,ts}` vengono caricati; gli altri file vengono ignorati
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 alle politiche esplicite `--custom` e a quelle integrate
60
+ - Funziona insieme a policy `--custom` esplicite e built-in
61
61
 
62
62
  <Tip>
63
- Le politiche di convenzione sono il modo più semplice per condividere politiche in un team. Esegui il commit di `.failproofai/policies/` in git e ogni membro del team le otterrà automaticamente.
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 politiche personalizzate
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 politiche
72
+ # Sostituisci il percorso del file di policy
73
73
  failproofai policies --install --custom ./new-policies.js
74
74
 
75
- # Rimuovi il percorso delle politiche personalizzate dalla configurazione
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 memorizzato in `policies-config.json` come `customPoliciesPath`. Il file viene caricato nuovamente ad ogni evento hook - non esiste cache tra gli eventi.
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 politiche di convenzione e il file esplicito `--custom` possono coesistere. Ordine di caricamento:
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 di convenzione di progetto (`{cwd}/.failproofai/policies/`, alfabetico)
87
- 3. File di convenzione utente (`~/.failproofai/policies/`, alfabetico)
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 politica. Chiama questo metodo tutte le volte che è necessario per più politiche nello stesso file.
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
- ### Helper per decisioni
112
+ ### Decision helpers
113
113
 
114
114
  | Funzione | Effetto | Usare quando |
115
- |----------|---------|----------|
116
- | `allow()` | Consenti l'operazione silenziosamente | L'azione è sicura, nessun messaggio necessario |
117
- | `deny(message)` | Blocca l'operazione | L'agente non dovrebbe intraprendere questa azione |
118
- | `instruct(message)` | Aggiungi contesto senza bloccare | Fornisci all'agente contesto extra per restare in pista |
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 guidance extra a qualsiasi messaggio `deny` o `instruct` aggiungendo un campo `hint` in `policyParams` — nessuna modifica del codice necessaria. Questo funziona anche per le politiche personalizzate (`custom/`), di convenzione di progetto (`.failproofai-project/`), e di convenzione utente (`.failproofai-user/`). Vedi [Configuration → hint](/it/configuration#hint-cross-cutting) per dettagli.
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 di consenso
128
+ ### Messaggi allow informativi
129
129
 
130
- `allow(message)` consente l'operazione **e** invia un messaggio informativo a Claude. Il messaggio viene consegnato come `additionalContext` nella risposta stdout del gestore hook — lo stesso meccanismo utilizzato da `instruct`, ma semanticamente diverso: è un aggiornamento di stato, non un avviso.
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)` | Consenti e invia contesto a Claude | Conferma che un controllo è stato superato, o spiega perché un controllo è stato saltato |
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 in modo da avere il contesto completo
139
- - **Più messaggi si accumulano:** se diverse politiche restituiscono `allow(message)`, tutti i messaggi vengono uniti con newline e consegnati insieme
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 che viene chiamato (es. `"Bash"`, `"Write"`, `"Read"`) |
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 dell'evento grezzo completo da Claude Code |
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 viene attivato | Contenuti `toolInput` |
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" \| ... }` - i hook devono sempre restituire `allow()`, non possono bloccare le notifiche |
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 politiche vengono valutate in questo ordine:
189
+ Le policy vengono valutate in questo ordine:
190
190
 
191
- 1. Politiche integrate (in ordine di definizione)
192
- 2. Politiche personalizzate esplicite da `customPoliciesPath` (in ordine `.add()`)
193
- 3. Politiche di convenzione da progetto `.failproofai/policies/` (file alfabetico, ordine `.add()` all'interno)
194
- 4. Politiche di convenzione da utente `~/.failproofai/policies/` (file alfabetico, ordine `.add()` all'interno)
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 politiche successive. Tutti i messaggi `instruct` vengono accumulati e consegnati insieme.
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 politiche personalizzate possono importare moduli locali utilizzando percorsi relativi:
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 per tipo di evento
225
+ ## Filtraggio del tipo di evento
226
226
 
227
- Usa `match.events` per limitare quando una politica si attiva:
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
- // Si attiva solo quando la sessione termina
235
- // ctx.session.transcriptPath contiene il log della sessione completa
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 completamente `match` per attivarsi su ogni tipo di evento.
241
+ Ometti `match` completamente per attivare su ogni tipo di evento.
242
242
 
243
243
  ---
244
244
 
245
- ## Gestione degli errori e modalità di fallimento
245
+ ## Gestione degli errori e modalità di guasto
246
246
 
247
- Le politiche personalizzate sono **fail-open**: gli errori non bloccano mai le politiche integrate o bloccano il gestore hook.
247
+ Le policy personalizzate sono **fail-open**: gli errori non bloccheranno mai le policy built-in o crasheranno il gestore hook.
248
248
 
249
- | Errore | Comportamento |
250
- |--------|----------|
251
- | `customPoliciesPath` non impostato | Nessuna politica personalizzata esplicita viene eseguita; le politiche di convenzione e gli integrati continuano normalmente |
252
- | File non trovato | Avviso registrato in `~/.failproofai/hook.log`; gli integrati continuano |
253
- | Errore di sintassi/import (esplicito) | Errore registrato in `~/.failproofai/hook.log`; le politiche personalizzate esplicite vengono saltate |
254
- | Errore di sintassi/import (convenzione) | Errore registrato; quel file viene saltato, gli altri file di convenzione vengono ancora caricati |
255
- | `fn` genera errore a runtime | Errore registrato; quel hook viene trattato come `allow`; altri hook continuano |
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 di convenzione mancante | Nessuna politica di convenzione viene eseguita; nessun errore |
257
+ | Directory per convenzione mancante | Nessuna policy per convenzione viene eseguita; nessun errore |
258
258
 
259
259
  <Tip>
260
- Per eseguire il debug degli errori di politiche personalizzate, osserva il file di log:
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: più politiche
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 politiche pronti all'uso:
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 politiche iniziali che coprono modalità di fallimento comuni dell'agente |
331
- | `examples/policies-advanced/index.js` | Pattern avanzati: import transitivi, chiamate async, scrubbing dell'output, e hook di fine sessione |
332
- | `examples/convention-policies/security-policies.mjs` | Politiche di sicurezza basate su convenzione (blocca scritture .env, previeni riscrittura della cronologia git) |
333
- | `examples/convention-policies/workflow-policies.mjs` | Politiche di flusso di lavoro basate su convenzione (promemoria test, controllare scritture di file) |
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
- ### Uso di esempi di file espliciti
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
- ### Uso di esempi basati su convenzione
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 install necessario — i file vengono ripresi automaticamente al prossimo evento hook.
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. Ogni esempio mostra come installare e cosa aspettarsi.
7
+ Esempi pronti all'uso per scenari comuni. Ognuno mostra come installare e cosa aspettarsi.
8
8
 
9
9
  ---
10
10
 
11
- ## Configurazione di hook per Claude Code
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 nel file `settings.json` di Claude Code che si attivano ad ogni chiamata di tool.
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 policy integrate">
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 gli hook siano registrati">
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 di hook per gli eventi `PreToolUse`, `PostToolUse`, `Notification` e `Stop`.
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 policy ora vengono eseguite automaticamente ad ogni chiamata di tool. Prova a chiedere a Claude di eseguire `sudo rm -rf /` - verrà bloccato.
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 di hook per Agents SDK
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 utilizzare lo stesso sistema di hook a livello programmatico.
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 gli hook nel tuo agent">
55
- Passa comandi hook quando crei il tuo processo agent. Gli hook si attivano allo stesso modo che in Claude Code - tramite JSON su stdin/stdout:
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 # called before each tool
59
- failproofai --hook PostToolUse # called after each tool
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 policy personalizzata per il tuo agent">
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: "Keep the agent inside the project directory",
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("Agent is restricted to the project directory");
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 policy personalizzata">
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 - impedisci agli agent di causare danni irreversibili.
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 vedere o perdere credenziali nell'output dei tool.
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
- Queste si attivano su `PostToolUse` - dopo che uno strumento viene eseguito, puliscono l'output prima che l'agent lo veda.
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
- Utilizza l'hook di notifica per inviare gli avvisi di inattività a Slack.
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: "Alert Slack when the agent is waiting for input",
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 ?? "Agent is waiting");
133
- const project = ctx.session?.cwd ?? "unknown";
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}*\nProject: \`${project}\``,
140
+ text: `*${message}*\nProgetto: \`${project}\``,
141
141
  }),
142
142
  signal: AbortSignal.timeout(5000),
143
143
  });
144
144
  } catch {
145
- // never block the agent if Slack is unreachable
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
- Impedisci agli agent di cambiare branch o fare push su quelli protetti.
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: "Prevent the agent from checking out other branches",
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("Stay on the current branch. Create a new branch with -b if needed.");
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: "Remind the agent to run tests before committing",
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("Run tests before committing. Use `npm test` or `bun test` first.");
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
- ## Proteggi un repository di produzione
209
+ ## Blocca un repository di produzione
210
210
 
211
- Fai il commit di una config a livello di progetto in modo che ogni sviluppatore del tuo team ottenga le stesse policy.
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 "Add failproofai team policies"
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` | Policy di base - blocca scritture in produzione, force-push, script pipati |
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 |