failproofai 0.0.5 → 0.0.6-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.failproofai/policies/review-policies.mjs +112 -0
- package/.next/standalone/.failproofai/policies/workflow-policies.mjs +2 -1
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g72weg._.js +1 -1
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0a~g15g._.js → [root-of-the-server]__0rh.18_._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +6 -6
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0qn95h3._.js → [root-of-the-server]__0~kmh8w._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +5 -5
- package/.next/standalone/.next/server/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +9 -9
- package/.next/standalone/.next/static/chunks/{0sme4lkv.tgn-.js → 01b~z8f1ws0rk.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0lgbwkfqmnsmc.js → 03rz6ykw-a2xi.js} +1 -1
- package/.next/standalone/.next/static/chunks/{17manv47o-~wp.js → 08t08igdql9yt.js} +1 -1
- package/.next/standalone/.next/static/chunks/09_k80d~cq2wg.js +4 -0
- package/.next/standalone/.next/static/chunks/{0ksdlt_1hucdm.js → 0bvhsa6zva2o..js} +1 -1
- package/.next/standalone/.next/static/chunks/{09ikntpt2-o9b.js → 0gbf4cphy8ksq.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0yumumfzx_f27.js → 0v.yd0kg_ld3r.js} +1 -1
- package/.next/standalone/.next/static/chunks/{13juklu.vksks.js → 0wlyoif4_kj_t.js} +1 -1
- package/.next/standalone/.next/static/chunks/{09e7drilkf1sn.js → 12simlrcfk3g2.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0em7tspi4kylh.js → 12~yi9oj8av8p.js} +2 -2
- package/.next/standalone/.next/static/chunks/{turbopack-0r26pc8h0y_-e.js → turbopack-0o7k.hakttp4k.js} +1 -1
- package/.next/standalone/CHANGELOG.md +13 -0
- package/.next/standalone/README.md +2 -2
- package/.next/standalone/bun.lock +43 -85
- package/.next/standalone/dist/cli.mjs +107 -3
- package/.next/standalone/docs/ar/architecture.mdx +65 -64
- package/.next/standalone/docs/ar/configuration.mdx +42 -42
- package/.next/standalone/docs/ar/custom-policies.mdx +62 -64
- package/.next/standalone/docs/built-in-policies.mdx +37 -0
- package/.next/standalone/docs/custom-policies.mdx +1 -1
- package/.next/standalone/docs/de/architecture.mdx +92 -92
- package/.next/standalone/docs/de/configuration.mdx +34 -34
- package/.next/standalone/docs/de/custom-policies.mdx +49 -50
- package/.next/standalone/docs/es/architecture.mdx +72 -72
- package/.next/standalone/docs/es/configuration.mdx +25 -25
- package/.next/standalone/docs/es/custom-policies.mdx +48 -49
- package/.next/standalone/docs/examples.mdx +54 -0
- package/.next/standalone/docs/fr/architecture.mdx +53 -53
- package/.next/standalone/docs/fr/configuration.mdx +25 -25
- package/.next/standalone/docs/fr/custom-policies.mdx +42 -43
- package/.next/standalone/docs/getting-started.mdx +52 -0
- package/.next/standalone/docs/he/architecture.mdx +66 -66
- package/.next/standalone/docs/he/configuration.mdx +53 -52
- package/.next/standalone/docs/he/custom-policies.mdx +72 -73
- package/.next/standalone/docs/hi/architecture.mdx +106 -106
- package/.next/standalone/docs/hi/configuration.mdx +39 -39
- package/.next/standalone/docs/hi/custom-policies.mdx +75 -76
- package/.next/standalone/docs/i18n/README.ar.md +66 -66
- package/.next/standalone/docs/i18n/README.de.md +38 -38
- package/.next/standalone/docs/i18n/README.es.md +38 -38
- package/.next/standalone/docs/i18n/README.fr.md +42 -42
- package/.next/standalone/docs/i18n/README.he.md +67 -67
- package/.next/standalone/docs/i18n/README.hi.md +70 -70
- package/.next/standalone/docs/i18n/README.it.md +62 -62
- package/.next/standalone/docs/i18n/README.ja.md +54 -54
- package/.next/standalone/docs/i18n/README.ko.md +58 -58
- package/.next/standalone/docs/i18n/README.pt-br.md +43 -43
- package/.next/standalone/docs/i18n/README.ru.md +69 -69
- package/.next/standalone/docs/i18n/README.tr.md +76 -76
- package/.next/standalone/docs/i18n/README.vi.md +70 -70
- package/.next/standalone/docs/i18n/README.zh.md +52 -52
- package/.next/standalone/docs/it/architecture.mdx +54 -53
- package/.next/standalone/docs/it/configuration.mdx +44 -45
- package/.next/standalone/docs/it/custom-policies.mdx +76 -78
- package/.next/standalone/docs/ja/architecture.mdx +93 -93
- package/.next/standalone/docs/ja/configuration.mdx +47 -47
- package/.next/standalone/docs/ja/custom-policies.mdx +62 -63
- package/.next/standalone/docs/ko/architecture.mdx +66 -66
- package/.next/standalone/docs/ko/configuration.mdx +35 -35
- package/.next/standalone/docs/ko/custom-policies.mdx +71 -72
- package/.next/standalone/docs/pt-br/architecture.mdx +55 -55
- package/.next/standalone/docs/pt-br/configuration.mdx +35 -35
- package/.next/standalone/docs/pt-br/custom-policies.mdx +60 -61
- package/.next/standalone/docs/ru/architecture.mdx +59 -60
- package/.next/standalone/docs/ru/configuration.mdx +52 -53
- package/.next/standalone/docs/ru/custom-policies.mdx +68 -69
- package/.next/standalone/docs/tr/architecture.mdx +124 -124
- package/.next/standalone/docs/tr/configuration.mdx +45 -46
- package/.next/standalone/docs/tr/custom-policies.mdx +75 -75
- package/.next/standalone/docs/vi/architecture.mdx +65 -64
- package/.next/standalone/docs/vi/configuration.mdx +41 -41
- package/.next/standalone/docs/vi/custom-policies.mdx +68 -69
- package/.next/standalone/docs/zh/architecture.mdx +67 -67
- package/.next/standalone/docs/zh/configuration.mdx +34 -34
- package/.next/standalone/docs/zh/custom-policies.mdx +53 -54
- package/.next/standalone/node_modules/@next/env/package.json +1 -1
- package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +7 -7
- package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
- package/.next/standalone/node_modules/next/dist/server/config-schema.js +10 -2
- package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/render.js +27 -20
- package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
- package/.next/standalone/node_modules/next/package.json +15 -15
- package/.next/standalone/package.json +2 -2
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/src/hooks/builtin-policies.ts +131 -0
- package/README.md +2 -2
- package/dist/cli.mjs +107 -3
- package/package.json +2 -2
- package/src/hooks/builtin-policies.ts +131 -0
- package/.next/standalone/.next/static/chunks/0_yayar~bpphd.js +0 -4
- /package/.next/standalone/.next/static/{hYQM6iCWnF1W5XDpsIRhV → CkmOT-ZvDN-sVULinGVKT}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{hYQM6iCWnF1W5XDpsIRhV → CkmOT-ZvDN-sVULinGVKT}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{hYQM6iCWnF1W5XDpsIRhV → CkmOT-ZvDN-sVULinGVKT}/_ssgManifest.js +0 -0
|
@@ -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
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,46 +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
|
-
|
|
128
|
+
### Messaggi informativi di consenso
|
|
131
129
|
|
|
132
|
-
`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.
|
|
133
131
|
|
|
134
|
-
| Funzione | Effetto |
|
|
135
|
-
|
|
136
|
-
| `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 |
|
|
137
135
|
|
|
138
136
|
Casi d'uso:
|
|
139
137
|
- **Conferme di stato:** `allow("All CI checks passed.")` — dice a Claude che tutto è verde
|
|
140
|
-
- **Spiegazioni fail-open:** `allow("GitHub CLI not installed, skipping CI check.")` — dice a Claude perché un controllo è stato saltato
|
|
141
|
-
- **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
|
|
142
140
|
|
|
143
141
|
```js
|
|
144
142
|
customPolicies.add({
|
|
@@ -164,21 +162,21 @@ customPolicies.add({
|
|
|
164
162
|
| `eventType` | `string` | `"PreToolUse"`, `"PostToolUse"`, `"Notification"`, `"Stop"` |
|
|
165
163
|
| `toolName` | `string \| undefined` | Lo strumento che viene chiamato (es. `"Bash"`, `"Write"`, `"Read"`) |
|
|
166
164
|
| `toolInput` | `Record<string, unknown> \| undefined` | I parametri di input dello strumento |
|
|
167
|
-
| `payload` | `Record<string, unknown>` | Payload
|
|
168
|
-
| `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) |
|
|
169
167
|
|
|
170
168
|
### Campi `SessionMetadata`
|
|
171
169
|
|
|
172
170
|
| Campo | Tipo | Descrizione |
|
|
173
171
|
|-------|------|-------------|
|
|
174
|
-
| `sessionId` | `string` | Identificatore
|
|
172
|
+
| `sessionId` | `string` | Identificatore della sessione Claude Code |
|
|
175
173
|
| `cwd` | `string` | Directory di lavoro della sessione Claude Code |
|
|
176
|
-
| `transcriptPath` | `string` | Percorso
|
|
174
|
+
| `transcriptPath` | `string` | Percorso del file transcript JSONL della sessione |
|
|
177
175
|
|
|
178
176
|
### Tipi di evento
|
|
179
177
|
|
|
180
|
-
| Evento | Quando
|
|
181
|
-
|
|
178
|
+
| Evento | Quando viene attivato | Contenuti `toolInput` |
|
|
179
|
+
|--------|----------------------|-----|
|
|
182
180
|
| `PreToolUse` | Prima che Claude esegua uno strumento | L'input dello strumento (es. `{ command: "..." }` per Bash) |
|
|
183
181
|
| `PostToolUse` | Dopo che uno strumento si completa | L'input dello strumento + `tool_result` (l'output) |
|
|
184
182
|
| `Notification` | Quando Claude invia una notifica | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }` - i hook devono sempre restituire `allow()`, non possono bloccare le notifiche |
|
|
@@ -188,22 +186,22 @@ customPolicies.add({
|
|
|
188
186
|
|
|
189
187
|
## Ordine di valutazione
|
|
190
188
|
|
|
191
|
-
|
|
189
|
+
Le politiche vengono valutate in questo ordine:
|
|
192
190
|
|
|
193
|
-
1.
|
|
194
|
-
2.
|
|
195
|
-
3.
|
|
196
|
-
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)
|
|
197
195
|
|
|
198
196
|
<Note>
|
|
199
|
-
Il primo `deny`
|
|
197
|
+
Il primo `deny` interrompe tutte le politiche successive. Tutti i messaggi `instruct` vengono accumulati e consegnati insieme.
|
|
200
198
|
</Note>
|
|
201
199
|
|
|
202
200
|
---
|
|
203
201
|
|
|
204
|
-
##
|
|
202
|
+
## Import transitivi
|
|
205
203
|
|
|
206
|
-
I file di
|
|
204
|
+
I file di politiche personalizzate possono importare moduli locali utilizzando percorsi relativi:
|
|
207
205
|
|
|
208
206
|
```js
|
|
209
207
|
// my-policies.js
|
|
@@ -220,13 +218,13 @@ customPolicies.add({
|
|
|
220
218
|
});
|
|
221
219
|
```
|
|
222
220
|
|
|
223
|
-
|
|
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.
|
|
224
222
|
|
|
225
223
|
---
|
|
226
224
|
|
|
227
|
-
## Filtraggio
|
|
225
|
+
## Filtraggio per tipo di evento
|
|
228
226
|
|
|
229
|
-
Usa `match.events` per limitare quando
|
|
227
|
+
Usa `match.events` per limitare quando una politica si attiva:
|
|
230
228
|
|
|
231
229
|
```js
|
|
232
230
|
customPolicies.add({
|
|
@@ -234,32 +232,32 @@ customPolicies.add({
|
|
|
234
232
|
match: { events: ["Stop"] },
|
|
235
233
|
fn: async (ctx) => {
|
|
236
234
|
// Si attiva solo quando la sessione termina
|
|
237
|
-
// ctx.session.transcriptPath contiene il log
|
|
235
|
+
// ctx.session.transcriptPath contiene il log della sessione completa
|
|
238
236
|
return allow();
|
|
239
237
|
},
|
|
240
238
|
});
|
|
241
239
|
```
|
|
242
240
|
|
|
243
|
-
Ometti `match`
|
|
241
|
+
Ometti completamente `match` per attivarsi su ogni tipo di evento.
|
|
244
242
|
|
|
245
243
|
---
|
|
246
244
|
|
|
247
|
-
## Gestione degli errori e modalità di
|
|
245
|
+
## Gestione degli errori e modalità di fallimento
|
|
248
246
|
|
|
249
|
-
|
|
247
|
+
Le politiche personalizzate sono **fail-open**: gli errori non bloccano mai le politiche integrate o bloccano il gestore hook.
|
|
250
248
|
|
|
251
249
|
| Errore | Comportamento |
|
|
252
|
-
|
|
253
|
-
| `customPoliciesPath` non impostato |
|
|
254
|
-
| File non trovato | Avviso registrato
|
|
255
|
-
| Errore di sintassi/
|
|
256
|
-
| Errore di sintassi/
|
|
257
|
-
| `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 |
|
|
258
256
|
| `fn` impiega più di 10s | Timeout registrato; trattato come `allow` |
|
|
259
|
-
| Directory di convenzione mancante |
|
|
257
|
+
| Directory di convenzione mancante | Nessuna politica di convenzione viene eseguita; nessun errore |
|
|
260
258
|
|
|
261
259
|
<Tip>
|
|
262
|
-
Per eseguire il debug degli errori di
|
|
260
|
+
Per eseguire il debug degli errori di politiche personalizzate, osserva il file di log:
|
|
263
261
|
|
|
264
262
|
```bash
|
|
265
263
|
tail -f ~/.failproofai/hook.log
|
|
@@ -268,13 +266,13 @@ tail -f ~/.failproofai/hook.log
|
|
|
268
266
|
|
|
269
267
|
---
|
|
270
268
|
|
|
271
|
-
## Esempio completo: più
|
|
269
|
+
## Esempio completo: più politiche
|
|
272
270
|
|
|
273
271
|
```js
|
|
274
272
|
// my-policies.js
|
|
275
273
|
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
276
274
|
|
|
277
|
-
//
|
|
275
|
+
// Prevent agent from writing to secrets/ directory
|
|
278
276
|
customPolicies.add({
|
|
279
277
|
name: "block-secrets-dir",
|
|
280
278
|
description: "Prevent agent from writing to secrets/ directory",
|
|
@@ -287,7 +285,7 @@ customPolicies.add({
|
|
|
287
285
|
},
|
|
288
286
|
});
|
|
289
287
|
|
|
290
|
-
//
|
|
288
|
+
// Keep the agent on track: verify tests before committing
|
|
291
289
|
customPolicies.add({
|
|
292
290
|
name: "remind-test-before-commit",
|
|
293
291
|
description: "Keep the agent on track: verify tests pass before committing",
|
|
@@ -302,7 +300,7 @@ customPolicies.add({
|
|
|
302
300
|
},
|
|
303
301
|
});
|
|
304
302
|
|
|
305
|
-
//
|
|
303
|
+
// Prevent unplanned dependency changes during freeze
|
|
306
304
|
customPolicies.add({
|
|
307
305
|
name: "dependency-freeze",
|
|
308
306
|
description: "Prevent unplanned dependency changes during freeze period",
|
|
@@ -325,14 +323,14 @@ export { customPolicies };
|
|
|
325
323
|
|
|
326
324
|
## Esempi
|
|
327
325
|
|
|
328
|
-
La directory `examples/` contiene file di
|
|
326
|
+
La directory `examples/` contiene file di politiche pronti all'uso:
|
|
329
327
|
|
|
330
328
|
| File | Contenuti |
|
|
331
329
|
|------|----------|
|
|
332
|
-
| `examples/policies-basic.js` | Cinque
|
|
333
|
-
| `examples/policies-advanced/index.js` |
|
|
334
|
-
| `examples/convention-policies/security-policies.mjs` |
|
|
335
|
-
| `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) |
|
|
336
334
|
|
|
337
335
|
### Uso di esempi di file espliciti
|
|
338
336
|
|
|
@@ -343,13 +341,13 @@ failproofai policies --install --custom ./examples/policies-basic.js
|
|
|
343
341
|
### Uso di esempi basati su convenzione
|
|
344
342
|
|
|
345
343
|
```bash
|
|
346
|
-
#
|
|
344
|
+
# Copy to project level
|
|
347
345
|
mkdir -p .failproofai/policies
|
|
348
346
|
cp examples/convention-policies/*.mjs .failproofai/policies/
|
|
349
347
|
|
|
350
|
-
#
|
|
348
|
+
# Or copy to user level
|
|
351
349
|
mkdir -p ~/.failproofai/policies
|
|
352
350
|
cp examples/convention-policies/*.mjs ~/.failproofai/policies/
|
|
353
351
|
```
|
|
354
352
|
|
|
355
|
-
Nessun comando
|
|
353
|
+
Nessun comando install necessario — i file vengono ripresi automaticamente al prossimo evento hook.
|