failproofai 0.0.5-beta.0 → 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]__0r6vvp5._.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]__0z5dd-f._.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/{0j_ivegn3i5wt.js → 0.z51twd.0l5z.js} +1 -1
- package/.next/standalone/.next/static/chunks/{04fpsjft~cje..js → 0hctoh28rg838.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0.io32u7gjgsb.js → 0hplx-8c-4vpv.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0yf_mmdukq6up.js → 0maq.q1t.ri85.js} +2 -2
- package/.next/standalone/.next/static/chunks/{0x8vagatq36_7.js → 0teq8wdh3po1n.js} +1 -1
- package/.next/standalone/.next/static/chunks/{04mtv9jnqknn3.js → 0uc0um_uz51m_.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0h4qcn40dunn7.js → 0ul6fk-z.6k-0.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0kvldut6ndzyz.js → 0w9lwqy0-v1dk.js} +1 -1
- package/.next/standalone/CHANGELOG.md +9 -1
- package/.next/standalone/README.md +2 -2
- package/.next/standalone/dist/cli.mjs +19 -2
- package/.next/standalone/docs/ar/architecture.mdx +66 -65
- package/.next/standalone/docs/ar/configuration.mdx +42 -42
- package/.next/standalone/docs/ar/custom-policies.mdx +63 -68
- package/.next/standalone/docs/architecture.mdx +2 -2
- package/.next/standalone/docs/configuration.mdx +1 -1
- package/.next/standalone/docs/custom-policies.mdx +2 -6
- package/.next/standalone/docs/de/architecture.mdx +92 -92
- package/.next/standalone/docs/de/configuration.mdx +35 -35
- package/.next/standalone/docs/de/custom-policies.mdx +50 -54
- package/.next/standalone/docs/es/architecture.mdx +73 -73
- package/.next/standalone/docs/es/configuration.mdx +25 -25
- package/.next/standalone/docs/es/custom-policies.mdx +49 -53
- package/.next/standalone/docs/fr/architecture.mdx +55 -55
- package/.next/standalone/docs/fr/configuration.mdx +26 -26
- package/.next/standalone/docs/fr/custom-policies.mdx +42 -46
- package/.next/standalone/docs/he/architecture.mdx +67 -67
- package/.next/standalone/docs/he/configuration.mdx +53 -52
- package/.next/standalone/docs/he/custom-policies.mdx +73 -77
- package/.next/standalone/docs/hi/architecture.mdx +107 -107
- package/.next/standalone/docs/hi/configuration.mdx +39 -39
- package/.next/standalone/docs/hi/custom-policies.mdx +77 -81
- package/.next/standalone/docs/i18n/README.ar.md +66 -66
- package/.next/standalone/docs/i18n/README.de.md +40 -40
- package/.next/standalone/docs/i18n/README.es.md +40 -40
- package/.next/standalone/docs/i18n/README.fr.md +44 -44
- package/.next/standalone/docs/i18n/README.he.md +67 -67
- package/.next/standalone/docs/i18n/README.hi.md +71 -71
- package/.next/standalone/docs/i18n/README.it.md +63 -63
- package/.next/standalone/docs/i18n/README.ja.md +55 -55
- package/.next/standalone/docs/i18n/README.ko.md +59 -59
- package/.next/standalone/docs/i18n/README.pt-br.md +45 -45
- package/.next/standalone/docs/i18n/README.ru.md +71 -71
- package/.next/standalone/docs/i18n/README.tr.md +76 -76
- package/.next/standalone/docs/i18n/README.vi.md +71 -71
- package/.next/standalone/docs/i18n/README.zh.md +53 -53
- package/.next/standalone/docs/it/architecture.mdx +55 -54
- package/.next/standalone/docs/it/configuration.mdx +45 -46
- package/.next/standalone/docs/it/custom-policies.mdx +77 -82
- package/.next/standalone/docs/ja/architecture.mdx +93 -93
- package/.next/standalone/docs/ja/configuration.mdx +48 -48
- package/.next/standalone/docs/ja/custom-policies.mdx +63 -67
- package/.next/standalone/docs/ko/architecture.mdx +66 -66
- package/.next/standalone/docs/ko/configuration.mdx +36 -36
- package/.next/standalone/docs/ko/custom-policies.mdx +73 -77
- package/.next/standalone/docs/pt-br/architecture.mdx +55 -55
- package/.next/standalone/docs/pt-br/configuration.mdx +36 -36
- package/.next/standalone/docs/pt-br/custom-policies.mdx +62 -66
- 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 +70 -74
- package/.next/standalone/docs/tr/architecture.mdx +124 -124
- package/.next/standalone/docs/tr/configuration.mdx +46 -47
- package/.next/standalone/docs/tr/custom-policies.mdx +75 -78
- package/.next/standalone/docs/vi/architecture.mdx +65 -64
- package/.next/standalone/docs/vi/configuration.mdx +42 -42
- package/.next/standalone/docs/vi/custom-policies.mdx +68 -72
- package/.next/standalone/docs/zh/architecture.mdx +67 -67
- package/.next/standalone/docs/zh/configuration.mdx +35 -35
- package/.next/standalone/docs/zh/custom-policies.mdx +54 -58
- 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/README.md +2 -2
- package/dist/cli.mjs +19 -2
- package/package.json +1 -1
- package/src/hooks/builtin-policies.ts +30 -0
- /package/.next/standalone/.next/static/{ICeMHZ-8ZR7HY5GLm7oSJ → 8mygPGI5bzrtWK36ZYO59}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{ICeMHZ-8ZR7HY5GLm7oSJ → 8mygPGI5bzrtWK36ZYO59}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{ICeMHZ-8ZR7HY5GLm7oSJ → 8mygPGI5bzrtWK36ZYO59}/_ssgManifest.js +0 -0
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
description: "Scrivi i tuoi criteri in JavaScript - applica convenzioni, previeni deviazioni, rilevai guasti, integra con sistemi esterni"
|
|
2
|
+
title: Politiche personalizzate
|
|
3
|
+
description: "Scrivi le tue politiche in JavaScript - applica convenzioni, previeni derive, rileva guasti, integrati con sistemi esterni"
|
|
5
4
|
icon: code
|
|
6
5
|
---
|
|
7
6
|
|
|
8
|
-
|
|
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.
|
|
9
8
|
|
|
10
9
|
---
|
|
11
10
|
|
|
@@ -38,14 +37,14 @@ failproofai policies --install --custom ./my-policies.js
|
|
|
38
37
|
|
|
39
38
|
---
|
|
40
39
|
|
|
41
|
-
## Due modi per caricare
|
|
40
|
+
## Due modi per caricare politiche personalizzate
|
|
42
41
|
|
|
43
|
-
### Opzione 1: Basata su convenzione (consigliato
|
|
42
|
+
### Opzione 1: Basata su convenzione (consigliato)
|
|
44
43
|
|
|
45
|
-
Inserisci
|
|
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.
|
|
46
45
|
|
|
47
46
|
```
|
|
48
|
-
# Livello di progetto —
|
|
47
|
+
# Livello di progetto — commesso in git, condiviso con il team
|
|
49
48
|
.failproofai/policies/security-policies.mjs
|
|
50
49
|
.failproofai/policies/workflow-policies.mjs
|
|
51
50
|
|
|
@@ -54,44 +53,44 @@ Inserisci i file `*policies.{js,mjs,ts}` in `.failproofai/policies/` e vengono c
|
|
|
54
53
|
```
|
|
55
54
|
|
|
56
55
|
**Come funziona:**
|
|
57
|
-
- Entrambe le directory di progetto e utente vengono scansionate (unione — non primo ambito
|
|
56
|
+
- Entrambe le directory di progetto e utente vengono scansionate (unione — non vince il primo ambito)
|
|
58
57
|
- I file vengono caricati alfabeticamente all'interno di ogni directory. Aggiungi il prefisso `01-`, `02-` per controllare l'ordine
|
|
59
58
|
- Solo i file che corrispondono a `*policies.{js,mjs,ts}` vengono caricati; gli altri file vengono ignorati
|
|
60
59
|
- Ogni file viene caricato indipendentemente (fail-open per file)
|
|
61
|
-
- Funziona insieme
|
|
60
|
+
- Funziona insieme alle politiche esplicite `--custom` e a quelle integrate
|
|
62
61
|
|
|
63
62
|
<Tip>
|
|
64
|
-
|
|
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.
|
|
65
64
|
</Tip>
|
|
66
65
|
|
|
67
66
|
### Opzione 2: Percorso file esplicito
|
|
68
67
|
|
|
69
68
|
```bash
|
|
70
|
-
# Installa con un file di
|
|
69
|
+
# Installa con un file di politiche personalizzate
|
|
71
70
|
failproofai policies --install --custom ./my-policies.js
|
|
72
71
|
|
|
73
|
-
# Sostituisci il percorso del file di
|
|
72
|
+
# Sostituisci il percorso del file di politiche
|
|
74
73
|
failproofai policies --install --custom ./new-policies.js
|
|
75
74
|
|
|
76
|
-
# Rimuovi il percorso
|
|
75
|
+
# Rimuovi il percorso delle politiche personalizzate dalla configurazione
|
|
77
76
|
failproofai policies --uninstall --custom
|
|
78
77
|
```
|
|
79
78
|
|
|
80
|
-
Il percorso assoluto risolto viene memorizzato in `policies-config.json` come `customPoliciesPath`. Il file viene caricato
|
|
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.
|
|
81
80
|
|
|
82
81
|
### Usare entrambi insieme
|
|
83
82
|
|
|
84
|
-
|
|
83
|
+
Le politiche di convenzione e il file esplicito `--custom` possono coesistere. Ordine di caricamento:
|
|
85
84
|
|
|
86
85
|
1. File `customPoliciesPath` esplicito (se configurato)
|
|
87
|
-
2. File di convenzione di progetto (`{cwd}/.failproofai/policies/`,
|
|
88
|
-
3. File di convenzione utente (`~/.failproofai/policies/`,
|
|
86
|
+
2. File di convenzione di progetto (`{cwd}/.failproofai/policies/`, alfabetico)
|
|
87
|
+
3. File di convenzione utente (`~/.failproofai/policies/`, alfabetico)
|
|
89
88
|
|
|
90
89
|
---
|
|
91
90
|
|
|
92
91
|
## API
|
|
93
92
|
|
|
94
|
-
###
|
|
93
|
+
### Import
|
|
95
94
|
|
|
96
95
|
```js
|
|
97
96
|
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
@@ -99,49 +98,45 @@ import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
|
99
98
|
|
|
100
99
|
### `customPolicies.add(hook)`
|
|
101
100
|
|
|
102
|
-
Registra
|
|
101
|
+
Registra una politica. Chiama questo metodo tutte le volte che è necessario per più politiche nello stesso file.
|
|
103
102
|
|
|
104
103
|
```ts
|
|
105
104
|
customPolicies.add({
|
|
106
|
-
name: string; //
|
|
107
|
-
description?: string; //
|
|
108
|
-
match?: { events?: HookEventType[] }; //
|
|
105
|
+
name: string; // required - unique identifier
|
|
106
|
+
description?: string; // shown in `failproofai policies` output
|
|
107
|
+
match?: { events?: HookEventType[] }; // filter by event type; omit to match all
|
|
109
108
|
fn: (ctx: PolicyContext) => PolicyResult | Promise<PolicyResult>;
|
|
110
109
|
});
|
|
111
110
|
```
|
|
112
111
|
|
|
113
|
-
### Helper
|
|
112
|
+
### Helper per decisioni
|
|
114
113
|
|
|
115
|
-
| Funzione | Effetto |
|
|
116
|
-
|
|
114
|
+
| Funzione | Effetto | Usare quando |
|
|
115
|
+
|----------|---------|----------|
|
|
117
116
|
| `allow()` | Consenti l'operazione silenziosamente | L'azione è sicura, nessun messaggio necessario |
|
|
118
|
-
| `deny(message)` | Blocca l'operazione | L'agente non dovrebbe
|
|
119
|
-
| `instruct(message)` | Aggiungi contesto senza bloccare |
|
|
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 |
|
|
120
119
|
|
|
121
|
-
`deny(message)` - il messaggio
|
|
120
|
+
`deny(message)` - il messaggio appare a Claude con prefisso `"Blocked by failproofai:"`. Un singolo `deny` interrompe la valutazione successiva.
|
|
122
121
|
|
|
123
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.
|
|
124
123
|
|
|
125
124
|
<Tip>
|
|
126
|
-
Puoi aggiungere guidance extra a qualsiasi messaggio `deny` o `instruct` aggiungendo un campo `hint` in `policyParams` — nessuna modifica
|
|
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.
|
|
127
126
|
</Tip>
|
|
128
127
|
|
|
129
|
-
### Messaggi di
|
|
130
|
-
|
|
131
|
-
<Note>
|
|
132
|
-
`allow(message)` è una funzione beta disponibile da v0.0.2-beta.3. L'API potrebbe cambiare nelle versioni future. Le versioni precedenti supportano solo `allow()` senza argomenti.
|
|
133
|
-
</Note>
|
|
128
|
+
### Messaggi informativi di consenso
|
|
134
129
|
|
|
135
|
-
`allow(message)` consente l'operazione **e** invia un messaggio informativo
|
|
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.
|
|
136
131
|
|
|
137
|
-
| Funzione | Effetto |
|
|
138
|
-
|
|
139
|
-
| `allow(message)` | Consenti e invia contesto a Claude | Conferma che un controllo è
|
|
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 |
|
|
140
135
|
|
|
141
136
|
Casi d'uso:
|
|
142
137
|
- **Conferme di stato:** `allow("All CI checks passed.")` — dice a Claude che tutto è verde
|
|
143
|
-
- **Spiegazioni fail-open:** `allow("GitHub CLI not installed, skipping CI check.")` — dice a Claude perché un controllo è stato saltato
|
|
144
|
-
- **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 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
|
|
145
140
|
|
|
146
141
|
```js
|
|
147
142
|
customPolicies.add({
|
|
@@ -167,21 +162,21 @@ customPolicies.add({
|
|
|
167
162
|
| `eventType` | `string` | `"PreToolUse"`, `"PostToolUse"`, `"Notification"`, `"Stop"` |
|
|
168
163
|
| `toolName` | `string \| undefined` | Lo strumento che viene chiamato (es. `"Bash"`, `"Write"`, `"Read"`) |
|
|
169
164
|
| `toolInput` | `Record<string, unknown> \| undefined` | I parametri di input dello strumento |
|
|
170
|
-
| `payload` | `Record<string, unknown>` | Payload
|
|
171
|
-
| `session` | `SessionMetadata \| undefined` | Contesto
|
|
165
|
+
| `payload` | `Record<string, unknown>` | Payload dell'evento grezzo completo da Claude Code |
|
|
166
|
+
| `session` | `SessionMetadata \| undefined` | Contesto della sessione (vedi sotto) |
|
|
172
167
|
|
|
173
168
|
### Campi `SessionMetadata`
|
|
174
169
|
|
|
175
170
|
| Campo | Tipo | Descrizione |
|
|
176
171
|
|-------|------|-------------|
|
|
177
|
-
| `sessionId` | `string` | Identificatore
|
|
172
|
+
| `sessionId` | `string` | Identificatore della sessione Claude Code |
|
|
178
173
|
| `cwd` | `string` | Directory di lavoro della sessione Claude Code |
|
|
179
|
-
| `transcriptPath` | `string` | Percorso
|
|
174
|
+
| `transcriptPath` | `string` | Percorso del file transcript JSONL della sessione |
|
|
180
175
|
|
|
181
176
|
### Tipi di evento
|
|
182
177
|
|
|
183
|
-
| Evento | Quando
|
|
184
|
-
|
|
178
|
+
| Evento | Quando viene attivato | Contenuti `toolInput` |
|
|
179
|
+
|--------|----------------------|-----|
|
|
185
180
|
| `PreToolUse` | Prima che Claude esegua uno strumento | L'input dello strumento (es. `{ command: "..." }` per Bash) |
|
|
186
181
|
| `PostToolUse` | Dopo che uno strumento si completa | L'input dello strumento + `tool_result` (l'output) |
|
|
187
182
|
| `Notification` | Quando Claude invia una notifica | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }` - i hook devono sempre restituire `allow()`, non possono bloccare le notifiche |
|
|
@@ -191,22 +186,22 @@ customPolicies.add({
|
|
|
191
186
|
|
|
192
187
|
## Ordine di valutazione
|
|
193
188
|
|
|
194
|
-
|
|
189
|
+
Le politiche vengono valutate in questo ordine:
|
|
195
190
|
|
|
196
|
-
1.
|
|
197
|
-
2.
|
|
198
|
-
3.
|
|
199
|
-
4.
|
|
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)
|
|
200
195
|
|
|
201
196
|
<Note>
|
|
202
|
-
Il primo `deny`
|
|
197
|
+
Il primo `deny` interrompe tutte le politiche successive. Tutti i messaggi `instruct` vengono accumulati e consegnati insieme.
|
|
203
198
|
</Note>
|
|
204
199
|
|
|
205
200
|
---
|
|
206
201
|
|
|
207
|
-
##
|
|
202
|
+
## Import transitivi
|
|
208
203
|
|
|
209
|
-
I file di
|
|
204
|
+
I file di politiche personalizzate possono importare moduli locali utilizzando percorsi relativi:
|
|
210
205
|
|
|
211
206
|
```js
|
|
212
207
|
// my-policies.js
|
|
@@ -223,13 +218,13 @@ customPolicies.add({
|
|
|
223
218
|
});
|
|
224
219
|
```
|
|
225
220
|
|
|
226
|
-
|
|
221
|
+
Tutti gli import relativi raggiungibili dal file di entry vengono risolti. Questo viene implementato riscrivendo gli import `from "failproofai"` al percorso dist effettivo e creando file `.mjs` temporanei per garantire la compatibilità ESM.
|
|
227
222
|
|
|
228
223
|
---
|
|
229
224
|
|
|
230
|
-
## Filtraggio
|
|
225
|
+
## Filtraggio per tipo di evento
|
|
231
226
|
|
|
232
|
-
Usa `match.events` per limitare quando
|
|
227
|
+
Usa `match.events` per limitare quando una politica si attiva:
|
|
233
228
|
|
|
234
229
|
```js
|
|
235
230
|
customPolicies.add({
|
|
@@ -237,32 +232,32 @@ customPolicies.add({
|
|
|
237
232
|
match: { events: ["Stop"] },
|
|
238
233
|
fn: async (ctx) => {
|
|
239
234
|
// Si attiva solo quando la sessione termina
|
|
240
|
-
// ctx.session.transcriptPath contiene il log
|
|
235
|
+
// ctx.session.transcriptPath contiene il log della sessione completa
|
|
241
236
|
return allow();
|
|
242
237
|
},
|
|
243
238
|
});
|
|
244
239
|
```
|
|
245
240
|
|
|
246
|
-
Ometti `match`
|
|
241
|
+
Ometti completamente `match` per attivarsi su ogni tipo di evento.
|
|
247
242
|
|
|
248
243
|
---
|
|
249
244
|
|
|
250
|
-
## Gestione degli errori e modalità di
|
|
245
|
+
## Gestione degli errori e modalità di fallimento
|
|
251
246
|
|
|
252
|
-
|
|
247
|
+
Le politiche personalizzate sono **fail-open**: gli errori non bloccano mai le politiche integrate o bloccano il gestore hook.
|
|
253
248
|
|
|
254
249
|
| Errore | Comportamento |
|
|
255
|
-
|
|
256
|
-
| `customPoliciesPath` non impostato |
|
|
257
|
-
| File non trovato | Avviso registrato
|
|
258
|
-
| Errore di sintassi/
|
|
259
|
-
| Errore di sintassi/
|
|
260
|
-
| `fn`
|
|
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 |
|
|
261
256
|
| `fn` impiega più di 10s | Timeout registrato; trattato come `allow` |
|
|
262
|
-
| Directory di convenzione mancante |
|
|
257
|
+
| Directory di convenzione mancante | Nessuna politica di convenzione viene eseguita; nessun errore |
|
|
263
258
|
|
|
264
259
|
<Tip>
|
|
265
|
-
Per eseguire il debug degli errori di
|
|
260
|
+
Per eseguire il debug degli errori di politiche personalizzate, osserva il file di log:
|
|
266
261
|
|
|
267
262
|
```bash
|
|
268
263
|
tail -f ~/.failproofai/hook.log
|
|
@@ -271,13 +266,13 @@ tail -f ~/.failproofai/hook.log
|
|
|
271
266
|
|
|
272
267
|
---
|
|
273
268
|
|
|
274
|
-
## Esempio completo: più
|
|
269
|
+
## Esempio completo: più politiche
|
|
275
270
|
|
|
276
271
|
```js
|
|
277
272
|
// my-policies.js
|
|
278
273
|
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
279
274
|
|
|
280
|
-
//
|
|
275
|
+
// Prevent agent from writing to secrets/ directory
|
|
281
276
|
customPolicies.add({
|
|
282
277
|
name: "block-secrets-dir",
|
|
283
278
|
description: "Prevent agent from writing to secrets/ directory",
|
|
@@ -290,7 +285,7 @@ customPolicies.add({
|
|
|
290
285
|
},
|
|
291
286
|
});
|
|
292
287
|
|
|
293
|
-
//
|
|
288
|
+
// Keep the agent on track: verify tests before committing
|
|
294
289
|
customPolicies.add({
|
|
295
290
|
name: "remind-test-before-commit",
|
|
296
291
|
description: "Keep the agent on track: verify tests pass before committing",
|
|
@@ -305,7 +300,7 @@ customPolicies.add({
|
|
|
305
300
|
},
|
|
306
301
|
});
|
|
307
302
|
|
|
308
|
-
//
|
|
303
|
+
// Prevent unplanned dependency changes during freeze
|
|
309
304
|
customPolicies.add({
|
|
310
305
|
name: "dependency-freeze",
|
|
311
306
|
description: "Prevent unplanned dependency changes during freeze period",
|
|
@@ -328,14 +323,14 @@ export { customPolicies };
|
|
|
328
323
|
|
|
329
324
|
## Esempi
|
|
330
325
|
|
|
331
|
-
La directory `examples/` contiene file di
|
|
326
|
+
La directory `examples/` contiene file di politiche pronti all'uso:
|
|
332
327
|
|
|
333
328
|
| File | Contenuti |
|
|
334
329
|
|------|----------|
|
|
335
|
-
| `examples/policies-basic.js` | Cinque
|
|
336
|
-
| `examples/policies-advanced/index.js` |
|
|
337
|
-
| `examples/convention-policies/security-policies.mjs` |
|
|
338
|
-
| `examples/convention-policies/workflow-policies.mjs` |
|
|
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) |
|
|
339
334
|
|
|
340
335
|
### Uso di esempi di file espliciti
|
|
341
336
|
|
|
@@ -346,13 +341,13 @@ failproofai policies --install --custom ./examples/policies-basic.js
|
|
|
346
341
|
### Uso di esempi basati su convenzione
|
|
347
342
|
|
|
348
343
|
```bash
|
|
349
|
-
#
|
|
344
|
+
# Copy to project level
|
|
350
345
|
mkdir -p .failproofai/policies
|
|
351
346
|
cp examples/convention-policies/*.mjs .failproofai/policies/
|
|
352
347
|
|
|
353
|
-
#
|
|
348
|
+
# Or copy to user level
|
|
354
349
|
mkdir -p ~/.failproofai/policies
|
|
355
350
|
cp examples/convention-policies/*.mjs ~/.failproofai/policies/
|
|
356
351
|
```
|
|
357
352
|
|
|
358
|
-
Nessun comando
|
|
353
|
+
Nessun comando install necessario — i file vengono ripresi automaticamente al prossimo evento hook.
|