failproofai 0.0.6-beta.0 → 0.0.6-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.failproofai/policies/review-policies.mjs +113 -0
- 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]__0a.nuas._.js → [root-of-the-server]__05akje6._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0.~fd7s._.js → [root-of-the-server]__0i5kvry._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +6 -6
- 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/{0teq8wdh3po1n.js → 00j0rr7rh8ef8.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0maq.q1t.ri85.js → 05j1px0r8yzh6.js} +2 -2
- package/.next/standalone/.next/static/chunks/0badv41uxa56..js +4 -0
- package/.next/standalone/.next/static/chunks/{0hplx-8c-4vpv.js → 0ijk_kek9_wyx.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0uc0um_uz51m_.js → 0npb~873.wvg3.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0hctoh28rg838.js → 0xpl.oscrakvx.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0.z51twd.0l5z.js → 1052sguyd-.ka.js} +1 -1
- package/.next/standalone/.next/static/chunks/{09e7drilkf1sn.js → 12simlrcfk3g2.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0ul6fk-z.6k-0.js → 14cl9poem30dq.js} +1 -1
- package/.next/standalone/.next/static/chunks/{turbopack-0r26pc8h0y_-e.js → turbopack-0o7k.hakttp4k.js} +1 -1
- package/.next/standalone/CHANGELOG.md +19 -0
- package/.next/standalone/README.md +2 -2
- package/.next/standalone/bun.lock +43 -85
- package/.next/standalone/dist/cli.mjs +91 -4
- package/.next/standalone/docs/ar/built-in-policies.mdx +124 -87
- package/.next/standalone/docs/ar/custom-policies.mdx +72 -72
- package/.next/standalone/docs/ar/examples.mdx +86 -33
- package/.next/standalone/docs/ar/getting-started.mdx +82 -29
- package/.next/standalone/docs/built-in-policies.mdx +38 -1
- package/.next/standalone/docs/custom-policies.mdx +1 -1
- package/.next/standalone/docs/de/built-in-policies.mdx +93 -56
- package/.next/standalone/docs/de/custom-policies.mdx +56 -56
- package/.next/standalone/docs/de/examples.mdx +72 -18
- package/.next/standalone/docs/de/getting-started.mdx +72 -20
- package/.next/standalone/docs/es/built-in-policies.mdx +115 -78
- package/.next/standalone/docs/es/custom-policies.mdx +55 -55
- package/.next/standalone/docs/es/examples.mdx +73 -19
- package/.next/standalone/docs/es/getting-started.mdx +72 -20
- package/.next/standalone/docs/examples.mdx +54 -0
- package/.next/standalone/docs/fr/built-in-policies.mdx +83 -46
- package/.next/standalone/docs/fr/custom-policies.mdx +51 -51
- package/.next/standalone/docs/fr/examples.mdx +78 -24
- package/.next/standalone/docs/fr/getting-started.mdx +65 -13
- package/.next/standalone/docs/getting-started.mdx +52 -0
- package/.next/standalone/docs/he/built-in-policies.mdx +156 -117
- package/.next/standalone/docs/he/custom-policies.mdx +75 -75
- package/.next/standalone/docs/he/examples.mdx +87 -33
- package/.next/standalone/docs/he/getting-started.mdx +84 -33
- package/.next/standalone/docs/hi/built-in-policies.mdx +101 -60
- package/.next/standalone/docs/hi/custom-policies.mdx +71 -70
- package/.next/standalone/docs/hi/examples.mdx +90 -36
- package/.next/standalone/docs/hi/getting-started.mdx +80 -27
- package/.next/standalone/docs/i18n/README.ar.md +69 -69
- package/.next/standalone/docs/i18n/README.de.md +46 -46
- package/.next/standalone/docs/i18n/README.es.md +42 -42
- package/.next/standalone/docs/i18n/README.fr.md +39 -39
- package/.next/standalone/docs/i18n/README.he.md +83 -83
- package/.next/standalone/docs/i18n/README.hi.md +69 -69
- package/.next/standalone/docs/i18n/README.it.md +72 -72
- package/.next/standalone/docs/i18n/README.ja.md +71 -71
- package/.next/standalone/docs/i18n/README.ko.md +52 -52
- package/.next/standalone/docs/i18n/README.pt-br.md +44 -44
- package/.next/standalone/docs/i18n/README.ru.md +66 -66
- package/.next/standalone/docs/i18n/README.tr.md +82 -83
- package/.next/standalone/docs/i18n/README.vi.md +70 -71
- package/.next/standalone/docs/i18n/README.zh.md +51 -51
- package/.next/standalone/docs/it/built-in-policies.mdx +118 -81
- package/.next/standalone/docs/it/custom-policies.mdx +69 -69
- package/.next/standalone/docs/it/examples.mdx +93 -39
- package/.next/standalone/docs/it/getting-started.mdx +73 -21
- package/.next/standalone/docs/ja/built-in-policies.mdx +98 -61
- package/.next/standalone/docs/ja/custom-policies.mdx +71 -71
- package/.next/standalone/docs/ja/examples.mdx +76 -22
- package/.next/standalone/docs/ja/getting-started.mdx +65 -13
- package/.next/standalone/docs/ko/built-in-policies.mdx +137 -100
- package/.next/standalone/docs/ko/custom-policies.mdx +67 -67
- package/.next/standalone/docs/ko/examples.mdx +87 -33
- package/.next/standalone/docs/ko/getting-started.mdx +61 -9
- package/.next/standalone/docs/pt-br/built-in-policies.mdx +94 -57
- package/.next/standalone/docs/pt-br/custom-policies.mdx +56 -56
- package/.next/standalone/docs/pt-br/examples.mdx +78 -24
- package/.next/standalone/docs/pt-br/getting-started.mdx +64 -12
- package/.next/standalone/docs/ru/built-in-policies.mdx +142 -105
- package/.next/standalone/docs/ru/custom-policies.mdx +82 -81
- package/.next/standalone/docs/ru/examples.mdx +77 -22
- package/.next/standalone/docs/ru/getting-started.mdx +74 -22
- package/.next/standalone/docs/tr/built-in-policies.mdx +104 -67
- package/.next/standalone/docs/tr/custom-policies.mdx +59 -60
- package/.next/standalone/docs/tr/examples.mdx +97 -42
- package/.next/standalone/docs/tr/getting-started.mdx +75 -23
- package/.next/standalone/docs/vi/built-in-policies.mdx +110 -72
- package/.next/standalone/docs/vi/custom-policies.mdx +68 -68
- package/.next/standalone/docs/vi/examples.mdx +93 -38
- package/.next/standalone/docs/vi/getting-started.mdx +74 -22
- package/.next/standalone/docs/zh/built-in-policies.mdx +132 -95
- package/.next/standalone/docs/zh/custom-policies.mdx +49 -49
- package/.next/standalone/docs/zh/examples.mdx +90 -36
- package/.next/standalone/docs/zh/getting-started.mdx +73 -21
- package/.next/standalone/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 +106 -1
- package/README.md +2 -2
- package/dist/cli.mjs +91 -4
- package/package.json +2 -2
- package/src/hooks/builtin-policies.ts +106 -1
- package/.next/standalone/.next/static/chunks/0w9lwqy0-v1dk.js +0 -4
- /package/.next/standalone/.next/static/{8mygPGI5bzrtWK36ZYO59 → A9pNTZdoYJTVyPAYwQMx5}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{8mygPGI5bzrtWK36ZYO59 → A9pNTZdoYJTVyPAYwQMx5}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{8mygPGI5bzrtWK36ZYO59 → A9pNTZdoYJTVyPAYwQMx5}/_ssgManifest.js +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Políticas Personalizadas
|
|
3
|
-
description: "Escreva suas próprias políticas em JavaScript
|
|
3
|
+
description: "Escreva suas próprias políticas em JavaScript — aplique convenções, evite desvios, detecte falhas e integre com sistemas externos"
|
|
4
4
|
icon: code
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
As políticas personalizadas permitem
|
|
7
|
+
As políticas personalizadas permitem criar regras para qualquer comportamento do agente: aplicar convenções do projeto, evitar desvios, bloquear operações destrutivas, detectar agentes travados ou integrar com Slack, fluxos de aprovação e muito mais. Elas utilizam o mesmo sistema de eventos de hook e as mesmas decisões `allow`, `deny` e `instruct` das políticas integradas.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -29,7 +29,7 @@ customPolicies.add({
|
|
|
29
29
|
});
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
Instale:
|
|
32
|
+
Instale com:
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
35
|
failproofai policies --install --custom ./my-policies.js
|
|
@@ -41,44 +41,44 @@ failproofai policies --install --custom ./my-policies.js
|
|
|
41
41
|
|
|
42
42
|
### Opção 1: Baseada em convenção (recomendada)
|
|
43
43
|
|
|
44
|
-
Coloque arquivos `*policies.{js,mjs,ts}` na pasta `.failproofai/policies/` e eles serão carregados automaticamente — sem flags ou alterações de configuração. Funciona como git hooks:
|
|
44
|
+
Coloque arquivos `*policies.{js,mjs,ts}` na pasta `.failproofai/policies/` e eles serão carregados automaticamente — sem flags ou alterações de configuração. Funciona como git hooks: adicione o arquivo e pronto.
|
|
45
45
|
|
|
46
46
|
```
|
|
47
|
-
# Nível
|
|
47
|
+
# Nível do projeto — commitado no git, compartilhado com o time
|
|
48
48
|
.failproofai/policies/security-policies.mjs
|
|
49
49
|
.failproofai/policies/workflow-policies.mjs
|
|
50
50
|
|
|
51
|
-
# Nível
|
|
51
|
+
# Nível do usuário — pessoal, aplicado a todos os projetos
|
|
52
52
|
~/.failproofai/policies/my-policies.mjs
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
**Como funciona:**
|
|
56
|
-
-
|
|
57
|
-
- Os arquivos são carregados em ordem alfabética dentro de cada diretório. Use
|
|
58
|
-
-
|
|
56
|
+
- Tanto o diretório do projeto quanto o do usuário são verificados (união — sem prioridade por escopo)
|
|
57
|
+
- Os arquivos são carregados em ordem alfabética dentro de cada diretório. Use prefixos como `01-`, `02-` para controlar a ordem
|
|
58
|
+
- Apenas arquivos que correspondem ao padrão `*policies.{js,mjs,ts}` são carregados; os demais são ignorados
|
|
59
59
|
- Cada arquivo é carregado de forma independente (fail-open por arquivo)
|
|
60
|
-
- Funciona
|
|
60
|
+
- Funciona junto com `--custom` explícito e políticas integradas
|
|
61
61
|
|
|
62
62
|
<Tip>
|
|
63
|
-
As políticas por convenção são a forma mais fácil de
|
|
63
|
+
As políticas por convenção são a forma mais fácil de estabelecer um padrão de qualidade para sua organização. Faça commit de `.failproofai/policies/` no git e todos os membros do time receberão as mesmas regras automaticamente — sem configuração individual. À medida que o time identifica novos modos de falha, adicione uma política e faça push. Com o tempo, elas se tornam um padrão de qualidade vivo que melhora a cada contribuição.
|
|
64
64
|
</Tip>
|
|
65
65
|
|
|
66
66
|
### Opção 2: Caminho de arquivo explícito
|
|
67
67
|
|
|
68
68
|
```bash
|
|
69
|
-
# Instalar com um arquivo de políticas
|
|
69
|
+
# Instalar com um arquivo de políticas personalizado
|
|
70
70
|
failproofai policies --install --custom ./my-policies.js
|
|
71
71
|
|
|
72
72
|
# Substituir o caminho do arquivo de políticas
|
|
73
73
|
failproofai policies --install --custom ./new-policies.js
|
|
74
74
|
|
|
75
|
-
# Remover o caminho de políticas
|
|
75
|
+
# Remover o caminho de políticas personalizado da configuração
|
|
76
76
|
failproofai policies --uninstall --custom
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
O caminho absoluto resolvido é armazenado em `policies-config.json` como `customPoliciesPath`. O arquivo é carregado novamente a cada evento de hook — não há cache entre eventos.
|
|
80
80
|
|
|
81
|
-
### Usando
|
|
81
|
+
### Usando os dois juntos
|
|
82
82
|
|
|
83
83
|
As políticas por convenção e o arquivo `--custom` explícito podem coexistir. Ordem de carregamento:
|
|
84
84
|
|
|
@@ -104,7 +104,7 @@ Registra uma política. Chame quantas vezes forem necessárias para múltiplas p
|
|
|
104
104
|
customPolicies.add({
|
|
105
105
|
name: string; // obrigatório - identificador único
|
|
106
106
|
description?: string; // exibido na saída de `failproofai policies`
|
|
107
|
-
match?: { events?: HookEventType[] }; // filtra por tipo de evento;
|
|
107
|
+
match?: { events?: HookEventType[] }; // filtra por tipo de evento; omita para corresponder a todos
|
|
108
108
|
fn: (ctx: PolicyContext) => PolicyResult | Promise<PolicyResult>;
|
|
109
109
|
});
|
|
110
110
|
```
|
|
@@ -113,30 +113,30 @@ customPolicies.add({
|
|
|
113
113
|
|
|
114
114
|
| Função | Efeito | Quando usar |
|
|
115
115
|
|----------|--------|----------|
|
|
116
|
-
| `allow()` | Permite a operação silenciosamente | A ação é segura
|
|
116
|
+
| `allow()` | Permite a operação silenciosamente | A ação é segura e não precisa de mensagem |
|
|
117
117
|
| `deny(message)` | Bloqueia a operação | O agente não deve executar esta ação |
|
|
118
118
|
| `instruct(message)` | Adiciona contexto sem bloquear | Fornece contexto adicional ao agente para mantê-lo no caminho certo |
|
|
119
119
|
|
|
120
|
-
`deny(message)` — a mensagem
|
|
120
|
+
`deny(message)` — a mensagem é exibida para o Claude com o prefixo `"Blocked by failproofai:"`. Um único `deny` interrompe toda avaliação subsequente.
|
|
121
121
|
|
|
122
|
-
`instruct(message)` — a mensagem é
|
|
122
|
+
`instruct(message)` — a mensagem é adicionada ao contexto do Claude para a chamada de ferramenta atual. Todas as mensagens `instruct` são acumuladas e entregues juntas.
|
|
123
123
|
|
|
124
124
|
<Tip>
|
|
125
|
-
Você pode adicionar orientações extras a qualquer mensagem `deny` ou `instruct` incluindo um campo `hint` em `policyParams` — sem necessidade de
|
|
125
|
+
Você pode adicionar orientações extras a qualquer mensagem `deny` ou `instruct` incluindo um campo `hint` em `policyParams` — sem necessidade de alterar o código. Isso funciona também para políticas personalizadas (`custom/`), por convenção do projeto (`.failproofai-project/`) e por convenção do usuário (`.failproofai-user/`). Consulte [Configuração → hint](/pt-br/configuration#hint-cross-cutting) para mais detalhes.
|
|
126
126
|
</Tip>
|
|
127
127
|
|
|
128
128
|
### Mensagens informativas de allow
|
|
129
129
|
|
|
130
|
-
`allow(message)` permite a operação **e** envia uma mensagem informativa
|
|
130
|
+
`allow(message)` permite a operação **e** envia uma mensagem informativa de volta ao Claude. A mensagem é entregue como `additionalContext` na resposta stdout do handler de hook — o mesmo mecanismo usado por `instruct`, mas semanticamente diferente: é uma atualização de status, não um aviso.
|
|
131
131
|
|
|
132
132
|
| Função | Efeito | Quando usar |
|
|
133
133
|
|----------|--------|----------|
|
|
134
|
-
| `allow(message)` | Permite e envia contexto
|
|
134
|
+
| `allow(message)` | Permite e envia contexto ao Claude | Confirmar que uma verificação passou, ou explicar por que foi ignorada |
|
|
135
135
|
|
|
136
136
|
Casos de uso:
|
|
137
|
-
- **Confirmações de status:** `allow("All CI checks passed.")` — informa ao Claude que tudo está
|
|
138
|
-
- **Explicações de fail-open:** `allow("GitHub CLI not installed, skipping CI check.")` — informa ao Claude por que uma verificação foi ignorada
|
|
139
|
-
- **Múltiplas mensagens
|
|
137
|
+
- **Confirmações de status:** `allow("All CI checks passed.")` — informa ao Claude que tudo está em ordem
|
|
138
|
+
- **Explicações de fail-open:** `allow("GitHub CLI not installed, skipping CI check.")` — informa ao Claude por que uma verificação foi ignorada, garantindo contexto completo
|
|
139
|
+
- **Múltiplas mensagens são acumuladas:** se várias políticas retornarem `allow(message)`, todas as mensagens são unidas com quebras de linha e entregues juntas
|
|
140
140
|
|
|
141
141
|
```js
|
|
142
142
|
customPolicies.add({
|
|
@@ -146,7 +146,7 @@ customPolicies.add({
|
|
|
146
146
|
const cwd = ctx.session?.cwd;
|
|
147
147
|
if (!cwd) return allow("No working directory, skipping branch check.");
|
|
148
148
|
|
|
149
|
-
// ...
|
|
149
|
+
// ... check branch status ...
|
|
150
150
|
if (allPushed) {
|
|
151
151
|
return allow("Branch is up to date with remote.");
|
|
152
152
|
}
|
|
@@ -160,27 +160,27 @@ customPolicies.add({
|
|
|
160
160
|
| Campo | Tipo | Descrição |
|
|
161
161
|
|-------|------|-------------|
|
|
162
162
|
| `eventType` | `string` | `"PreToolUse"`, `"PostToolUse"`, `"Notification"`, `"Stop"` |
|
|
163
|
-
| `toolName` | `string \| undefined` | A ferramenta sendo chamada (ex
|
|
163
|
+
| `toolName` | `string \| undefined` | A ferramenta sendo chamada (ex.: `"Bash"`, `"Write"`, `"Read"`) |
|
|
164
164
|
| `toolInput` | `Record<string, unknown> \| undefined` | Os parâmetros de entrada da ferramenta |
|
|
165
|
-
| `payload` | `Record<string, unknown>` | Payload completo do evento
|
|
165
|
+
| `payload` | `Record<string, unknown>` | Payload bruto completo do evento do Claude Code |
|
|
166
166
|
| `session` | `SessionMetadata \| undefined` | Contexto da sessão (veja abaixo) |
|
|
167
167
|
|
|
168
168
|
### Campos de `SessionMetadata`
|
|
169
169
|
|
|
170
170
|
| Campo | Tipo | Descrição |
|
|
171
171
|
|-------|------|-------------|
|
|
172
|
-
| `sessionId` | `string` | Identificador
|
|
172
|
+
| `sessionId` | `string` | Identificador da sessão do Claude Code |
|
|
173
173
|
| `cwd` | `string` | Diretório de trabalho da sessão do Claude Code |
|
|
174
174
|
| `transcriptPath` | `string` | Caminho para o arquivo de transcrição JSONL da sessão |
|
|
175
175
|
|
|
176
176
|
### Tipos de evento
|
|
177
177
|
|
|
178
|
-
| Evento | Quando
|
|
178
|
+
| Evento | Quando é disparado | Conteúdo de `toolInput` |
|
|
179
179
|
|-------|--------------|----------------------|
|
|
180
|
-
| `PreToolUse` | Antes
|
|
181
|
-
| `PostToolUse` | Após uma ferramenta
|
|
182
|
-
| `Notification` | Quando Claude envia uma notificação | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }`
|
|
183
|
-
| `Stop` | Quando a sessão Claude
|
|
180
|
+
| `PreToolUse` | Antes do Claude executar uma ferramenta | A entrada da ferramenta (ex.: `{ command: "..." }` para Bash) |
|
|
181
|
+
| `PostToolUse` | Após a conclusão de uma ferramenta | A entrada da ferramenta + `tool_result` (a saída) |
|
|
182
|
+
| `Notification` | Quando o Claude envia uma notificação | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }` — hooks sempre devem retornar `allow()`, não podem bloquear notificações |
|
|
183
|
+
| `Stop` | Quando a sessão do Claude é encerrada | Vazio |
|
|
184
184
|
|
|
185
185
|
---
|
|
186
186
|
|
|
@@ -190,8 +190,8 @@ As políticas são avaliadas nesta ordem:
|
|
|
190
190
|
|
|
191
191
|
1. Políticas integradas (na ordem de definição)
|
|
192
192
|
2. Políticas personalizadas explícitas de `customPoliciesPath` (na ordem de `.add()`)
|
|
193
|
-
3. Políticas
|
|
194
|
-
4. Políticas
|
|
193
|
+
3. Políticas por convenção do projeto em `.failproofai/policies/` (arquivos em ordem alfabética, ordem de `.add()` dentro de cada arquivo)
|
|
194
|
+
4. Políticas por convenção do usuário em `~/.failproofai/policies/` (arquivos em ordem alfabética, ordem de `.add()` dentro de cada arquivo)
|
|
195
195
|
|
|
196
196
|
<Note>
|
|
197
197
|
O primeiro `deny` interrompe todas as políticas subsequentes. Todas as mensagens `instruct` são acumuladas e entregues juntas.
|
|
@@ -201,7 +201,7 @@ O primeiro `deny` interrompe todas as políticas subsequentes. Todas as mensagen
|
|
|
201
201
|
|
|
202
202
|
## Importações transitivas
|
|
203
203
|
|
|
204
|
-
Arquivos de
|
|
204
|
+
Arquivos de política personalizados podem importar módulos locais usando caminhos relativos:
|
|
205
205
|
|
|
206
206
|
```js
|
|
207
207
|
// my-policies.js
|
|
@@ -218,46 +218,46 @@ customPolicies.add({
|
|
|
218
218
|
});
|
|
219
219
|
```
|
|
220
220
|
|
|
221
|
-
Todas as importações relativas acessíveis a partir do arquivo de entrada são resolvidas. Isso é implementado reescrevendo as importações `from "failproofai"` para o caminho real
|
|
221
|
+
Todas as importações relativas acessíveis a partir do arquivo de entrada são resolvidas. Isso é implementado reescrevendo as importações `from "failproofai"` para o caminho real de dist e criando arquivos `.mjs` temporários para garantir compatibilidade com ESM.
|
|
222
222
|
|
|
223
223
|
---
|
|
224
224
|
|
|
225
225
|
## Filtragem por tipo de evento
|
|
226
226
|
|
|
227
|
-
Use `match.events` para limitar quando uma política é
|
|
227
|
+
Use `match.events` para limitar quando uma política é acionada:
|
|
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
|
-
// Só
|
|
234
|
+
// Só é acionado quando a sessão é encerrada
|
|
235
235
|
// ctx.session.transcriptPath contém o log completo da sessão
|
|
236
236
|
return allow();
|
|
237
237
|
},
|
|
238
238
|
});
|
|
239
239
|
```
|
|
240
240
|
|
|
241
|
-
Omita `match` completamente para
|
|
241
|
+
Omita `match` completamente para acionar em todos os tipos de evento.
|
|
242
242
|
|
|
243
243
|
---
|
|
244
244
|
|
|
245
245
|
## Tratamento de erros e modos de falha
|
|
246
246
|
|
|
247
|
-
|
|
247
|
+
As políticas personalizadas são **fail-open**: erros nunca bloqueiam as políticas integradas nem causam falha no handler de hook.
|
|
248
248
|
|
|
249
249
|
| Falha | Comportamento |
|
|
250
250
|
|---------|----------|
|
|
251
251
|
| `customPoliciesPath` não configurado | Nenhuma política personalizada explícita é executada; políticas por convenção e integradas continuam normalmente |
|
|
252
|
-
| Arquivo não encontrado | Aviso registrado em `~/.failproofai/hook.log`; integradas continuam |
|
|
253
|
-
| Erro de sintaxe/importação (explícito) | Erro registrado em `~/.failproofai/hook.log`; políticas personalizadas explícitas ignoradas |
|
|
254
|
-
| Erro de sintaxe/importação (convenção) | Erro registrado; aquele arquivo é ignorado,
|
|
255
|
-
| `fn` lança
|
|
252
|
+
| Arquivo não encontrado | Aviso registrado em `~/.failproofai/hook.log`; políticas integradas continuam |
|
|
253
|
+
| Erro de sintaxe/importação (explícito) | Erro registrado em `~/.failproofai/hook.log`; políticas personalizadas explícitas são ignoradas |
|
|
254
|
+
| Erro de sintaxe/importação (convenção) | Erro registrado; aquele arquivo é ignorado, os demais arquivos de convenção continuam carregando |
|
|
255
|
+
| `fn` lança erro em tempo de execução | Erro registrado; aquele hook é tratado como `allow`; os demais hooks continuam |
|
|
256
256
|
| `fn` demora mais de 10s | Timeout registrado; tratado como `allow` |
|
|
257
|
-
| Diretório de convenção ausente | Nenhuma política
|
|
257
|
+
| Diretório de convenção ausente | Nenhuma política por convenção é executada; sem erro |
|
|
258
258
|
|
|
259
259
|
<Tip>
|
|
260
|
-
Para depurar erros em políticas personalizadas,
|
|
260
|
+
Para depurar erros em políticas personalizadas, monitore o arquivo de log:
|
|
261
261
|
|
|
262
262
|
```bash
|
|
263
263
|
tail -f ~/.failproofai/hook.log
|
|
@@ -285,7 +285,7 @@ customPolicies.add({
|
|
|
285
285
|
},
|
|
286
286
|
});
|
|
287
287
|
|
|
288
|
-
// Mantém o agente no caminho certo:
|
|
288
|
+
// Mantém o agente no caminho certo: verifica testes antes de commitar
|
|
289
289
|
customPolicies.add({
|
|
290
290
|
name: "remind-test-before-commit",
|
|
291
291
|
description: "Keep the agent on track: verify tests pass before committing",
|
|
@@ -300,7 +300,7 @@ customPolicies.add({
|
|
|
300
300
|
},
|
|
301
301
|
});
|
|
302
302
|
|
|
303
|
-
//
|
|
303
|
+
// Impede mudanças de dependências não planejadas durante o período de freeze
|
|
304
304
|
customPolicies.add({
|
|
305
305
|
name: "dependency-freeze",
|
|
306
306
|
description: "Prevent unplanned dependency changes during freeze period",
|
|
@@ -323,14 +323,14 @@ export { customPolicies };
|
|
|
323
323
|
|
|
324
324
|
## Exemplos
|
|
325
325
|
|
|
326
|
-
O diretório `examples/` contém arquivos de
|
|
326
|
+
O diretório `examples/` contém arquivos de política prontos para uso:
|
|
327
327
|
|
|
328
328
|
| Arquivo | Conteúdo |
|
|
329
329
|
|------|----------|
|
|
330
|
-
| `examples/policies-basic.js` | Cinco políticas iniciais cobrindo modos
|
|
331
|
-
| `examples/policies-advanced/index.js` | Padrões avançados: importações transitivas, chamadas assíncronas,
|
|
332
|
-
| `examples/convention-policies/security-policies.mjs` | Políticas de segurança baseadas em convenção (bloquear escritas em .env,
|
|
333
|
-
| `examples/convention-policies/workflow-policies.mjs` | Políticas de fluxo de trabalho baseadas em convenção (lembretes de teste, auditoria de escritas em
|
|
330
|
+
| `examples/policies-basic.js` | Cinco políticas iniciais cobrindo modos de falha comuns de agentes |
|
|
331
|
+
| `examples/policies-advanced/index.js` | Padrões avançados: importações transitivas, chamadas assíncronas, limpeza de saída e hooks de encerramento de sessão |
|
|
332
|
+
| `examples/convention-policies/security-policies.mjs` | Políticas de segurança baseadas em convenção (bloquear escritas em .env, impedir reescrita do histórico git) |
|
|
333
|
+
| `examples/convention-policies/workflow-policies.mjs` | Políticas de fluxo de trabalho baseadas em convenção (lembretes de teste, auditoria de escritas em arquivo) |
|
|
334
334
|
|
|
335
335
|
### Usando exemplos com arquivo explícito
|
|
336
336
|
|
|
@@ -341,11 +341,11 @@ failproofai policies --install --custom ./examples/policies-basic.js
|
|
|
341
341
|
### Usando exemplos baseados em convenção
|
|
342
342
|
|
|
343
343
|
```bash
|
|
344
|
-
# Copiar para o nível
|
|
344
|
+
# Copiar para o nível do projeto
|
|
345
345
|
mkdir -p .failproofai/policies
|
|
346
346
|
cp examples/convention-policies/*.mjs .failproofai/policies/
|
|
347
347
|
|
|
348
|
-
# Ou copiar para o nível
|
|
348
|
+
# Ou copiar para o nível do usuário
|
|
349
349
|
mkdir -p ~/.failproofai/policies
|
|
350
350
|
cp examples/convention-policies/*.mjs ~/.failproofai/policies/
|
|
351
351
|
```
|
|
@@ -8,34 +8,34 @@ Exemplos prontos para uso em cenários comuns. Cada um mostra como instalar e o
|
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Configurando hooks para
|
|
11
|
+
## Configurando hooks para Claude Code
|
|
12
12
|
|
|
13
|
-
O Failproof AI se integra ao Claude Code por meio do seu [sistema de hooks](https://docs.anthropic.com/en/docs/claude-code/hooks). Quando você executa `failproofai policies --install`, ele registra comandos de hook no `settings.json` do Claude Code que são acionados
|
|
13
|
+
O Failproof AI se integra ao Claude Code por meio do seu [sistema de hooks](https://docs.anthropic.com/en/docs/claude-code/hooks). Quando você executa `failproofai policies --install`, ele registra comandos de hook no `settings.json` do Claude Code, que são acionados a cada chamada de ferramenta.
|
|
14
14
|
|
|
15
15
|
<Steps>
|
|
16
|
-
<Step title="
|
|
16
|
+
<Step title="Instalar o failproofai">
|
|
17
17
|
```bash
|
|
18
18
|
npm install -g failproofai
|
|
19
19
|
```
|
|
20
20
|
</Step>
|
|
21
|
-
<Step title="
|
|
21
|
+
<Step title="Habilitar todas as políticas integradas">
|
|
22
22
|
```bash
|
|
23
23
|
failproofai policies --install
|
|
24
24
|
```
|
|
25
25
|
</Step>
|
|
26
|
-
<Step title="
|
|
26
|
+
<Step title="Verificar se os hooks foram registrados">
|
|
27
27
|
```bash
|
|
28
28
|
cat ~/.claude/settings.json | grep failproofai
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
Você
|
|
31
|
+
Você deve ver entradas de hook para os eventos `PreToolUse`, `PostToolUse`, `Notification` e `Stop`.
|
|
32
32
|
</Step>
|
|
33
|
-
<Step title="
|
|
33
|
+
<Step title="Executar o Claude Code">
|
|
34
34
|
```bash
|
|
35
35
|
claude
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
As políticas agora são executadas automaticamente
|
|
38
|
+
As políticas agora são executadas automaticamente a cada chamada de ferramenta. Tente pedir ao Claude para executar `sudo rm -rf /` — o comando será bloqueado.
|
|
39
39
|
</Step>
|
|
40
40
|
</Steps>
|
|
41
41
|
|
|
@@ -46,26 +46,26 @@ O Failproof AI se integra ao Claude Code por meio do seu [sistema de hooks](http
|
|
|
46
46
|
Se você está desenvolvendo com o [Agents SDK](https://docs.anthropic.com/en/docs/agents-sdk), pode usar o mesmo sistema de hooks de forma programática.
|
|
47
47
|
|
|
48
48
|
<Steps>
|
|
49
|
-
<Step title="
|
|
49
|
+
<Step title="Instalar o failproofai no seu projeto">
|
|
50
50
|
```bash
|
|
51
51
|
npm install failproofai
|
|
52
52
|
```
|
|
53
53
|
</Step>
|
|
54
|
-
<Step title="
|
|
55
|
-
Passe
|
|
54
|
+
<Step title="Configurar hooks no seu agente">
|
|
55
|
+
Passe comandos de hook ao criar o processo do seu agente. Os hooks são acionados da mesma forma que no Claude Code — via stdin/stdout JSON:
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
58
|
failproofai --hook PreToolUse # chamado antes de cada ferramenta
|
|
59
59
|
failproofai --hook PostToolUse # chamado após cada ferramenta
|
|
60
60
|
```
|
|
61
61
|
</Step>
|
|
62
|
-
<Step title="
|
|
62
|
+
<Step title="Escrever uma política personalizada para seu agente">
|
|
63
63
|
```javascript
|
|
64
64
|
import { customPolicies, allow, deny } from "failproofai";
|
|
65
65
|
|
|
66
66
|
customPolicies.add({
|
|
67
67
|
name: "limit-to-project-dir",
|
|
68
|
-
description: "
|
|
68
|
+
description: "Mantém o agente dentro do diretório do projeto",
|
|
69
69
|
match: { events: ["PreToolUse"] },
|
|
70
70
|
fn: async (ctx) => {
|
|
71
71
|
const path = String(ctx.toolInput?.file_path ?? "");
|
|
@@ -77,7 +77,7 @@ Se você está desenvolvendo com o [Agents SDK](https://docs.anthropic.com/en/do
|
|
|
77
77
|
});
|
|
78
78
|
```
|
|
79
79
|
</Step>
|
|
80
|
-
<Step title="
|
|
80
|
+
<Step title="Instalar a política personalizada">
|
|
81
81
|
```bash
|
|
82
82
|
failproofai policies --install --custom ./my-agent-policies.js
|
|
83
83
|
```
|
|
@@ -123,7 +123,7 @@ import { customPolicies, allow, instruct } from "failproofai";
|
|
|
123
123
|
|
|
124
124
|
customPolicies.add({
|
|
125
125
|
name: "slack-on-idle",
|
|
126
|
-
description: "
|
|
126
|
+
description: "Alerta o Slack quando o agente está aguardando entrada",
|
|
127
127
|
match: { events: ["Notification"] },
|
|
128
128
|
fn: async (ctx) => {
|
|
129
129
|
const webhookUrl = process.env.SLACK_WEBHOOK_URL;
|
|
@@ -150,7 +150,7 @@ customPolicies.add({
|
|
|
150
150
|
});
|
|
151
151
|
```
|
|
152
152
|
|
|
153
|
-
Instale
|
|
153
|
+
Instale:
|
|
154
154
|
|
|
155
155
|
```bash
|
|
156
156
|
SLACK_WEBHOOK_URL=https://hooks.slack.com/... failproofai policies --install --custom ./slack-alerts.js
|
|
@@ -167,7 +167,7 @@ import { customPolicies, allow, deny } from "failproofai";
|
|
|
167
167
|
|
|
168
168
|
customPolicies.add({
|
|
169
169
|
name: "stay-on-branch",
|
|
170
|
-
description: "
|
|
170
|
+
description: "Impede o agente de fazer checkout em outras branches",
|
|
171
171
|
match: { events: ["PreToolUse"] },
|
|
172
172
|
fn: async (ctx) => {
|
|
173
173
|
if (ctx.toolName !== "Bash") return allow();
|
|
@@ -184,14 +184,14 @@ customPolicies.add({
|
|
|
184
184
|
|
|
185
185
|
## Exigir testes antes de commits
|
|
186
186
|
|
|
187
|
-
Lembra os agentes de executar
|
|
187
|
+
Lembra os agentes de executar testes antes de fazer commit.
|
|
188
188
|
|
|
189
189
|
```javascript
|
|
190
190
|
import { customPolicies, allow, instruct } from "failproofai";
|
|
191
191
|
|
|
192
192
|
customPolicies.add({
|
|
193
193
|
name: "test-before-commit",
|
|
194
|
-
description: "
|
|
194
|
+
description: "Lembra o agente de executar testes antes de fazer commit",
|
|
195
195
|
match: { events: ["PreToolUse"] },
|
|
196
196
|
fn: async (ctx) => {
|
|
197
197
|
if (ctx.toolName !== "Bash") return allow();
|
|
@@ -206,11 +206,11 @@ customPolicies.add({
|
|
|
206
206
|
|
|
207
207
|
---
|
|
208
208
|
|
|
209
|
-
##
|
|
209
|
+
## Bloquear um repositório de produção
|
|
210
210
|
|
|
211
|
-
Faça commit de uma configuração no nível do projeto para que todos os desenvolvedores
|
|
211
|
+
Faça commit de uma configuração no nível do projeto para que todos os desenvolvedores da sua equipe utilizem as mesmas políticas.
|
|
212
212
|
|
|
213
|
-
Crie
|
|
213
|
+
Crie `.failproofai/policies-config.json` no seu repositório:
|
|
214
214
|
|
|
215
215
|
```json
|
|
216
216
|
{
|
|
@@ -238,7 +238,61 @@ git add .failproofai/policies-config.json
|
|
|
238
238
|
git commit -m "Add failproofai team policies"
|
|
239
239
|
```
|
|
240
240
|
|
|
241
|
-
|
|
241
|
+
Todo membro da equipe que tiver o failproofai instalado receberá essas regras automaticamente.
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## Construir um padrão de qualidade organizacional com políticas de convenção
|
|
246
|
+
|
|
247
|
+
A configuração de maior impacto: faça commit de `.failproofai/policies/` no seu repositório com políticas adaptadas ao seu projeto. Todos os membros da equipe as recebem automaticamente — sem comandos de instalação, sem alterações de configuração.
|
|
248
|
+
|
|
249
|
+
<Steps>
|
|
250
|
+
<Step title="Criar o diretório e adicionar políticas">
|
|
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
|
+
// Enforce your team's preferred package manager
|
|
260
|
+
// (or enable the built-in prefer-package-manager policy instead)
|
|
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("Use bun instead of npm.");
|
|
268
|
+
return allow();
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
// Remind the agent to run tests before committing
|
|
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("Run tests before committing.");
|
|
280
|
+
}
|
|
281
|
+
return allow();
|
|
282
|
+
},
|
|
283
|
+
});
|
|
284
|
+
```
|
|
285
|
+
</Step>
|
|
286
|
+
<Step title="Fazer commit no git">
|
|
287
|
+
```bash
|
|
288
|
+
git add .failproofai/policies/
|
|
289
|
+
git commit -m "Add team quality policies"
|
|
290
|
+
```
|
|
291
|
+
</Step>
|
|
292
|
+
<Step title="Continue melhorando">
|
|
293
|
+
À medida que sua equipe encontra novos problemas, adicione políticas e faça push. Todos recebem a atualização no próximo `git pull`. Essas políticas se tornam um padrão de qualidade vivo que cresce junto com a sua equipe.
|
|
294
|
+
</Step>
|
|
295
|
+
</Steps>
|
|
242
296
|
|
|
243
297
|
---
|
|
244
298
|
|
|
@@ -248,6 +302,6 @@ O diretório [`examples/`](https://github.com/exospherehost/failproofai/tree/mai
|
|
|
248
302
|
|
|
249
303
|
| Arquivo | O que demonstra |
|
|
250
304
|
|---------|-----------------|
|
|
251
|
-
| `policies-basic.js` | Políticas iniciais —
|
|
305
|
+
| `policies-basic.js` | Políticas iniciais — bloquear escrita em produção, force-push e scripts redirecionados |
|
|
252
306
|
| `policies-notification.js` | Alertas no Slack para notificações de inatividade e encerramento de sessão |
|
|
253
307
|
| `policies-advanced/index.js` | Importações transitivas, hooks assíncronos, limpeza de saída no PostToolUse e tratamento do evento Stop |
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Primeiros passos
|
|
3
|
-
description: "Instale o failproofai, ative as políticas e deixe seus agentes
|
|
3
|
+
description: "Instale o failproofai, ative as políticas e deixe seus agentes rodarem de forma confiável"
|
|
4
4
|
icon: rocket
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
## Requisitos
|
|
8
8
|
|
|
9
9
|
- **Node.js** >= 20.9.0
|
|
10
|
-
- **Bun** >= 1.3.0 (opcional
|
|
10
|
+
- **Bun** >= 1.3.0 (opcional - necessário apenas para compilar a partir do código-fonte)
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -31,13 +31,13 @@ bun add -g failproofai
|
|
|
31
31
|
|
|
32
32
|
<Steps>
|
|
33
33
|
<Step title="Ativar políticas">
|
|
34
|
-
Políticas são regras
|
|
34
|
+
Políticas são regras que executam antes e depois de cada chamada de ferramenta do agente. Elas interceptam comandos destrutivos, vazamento de segredos e outros modos de falha antes que causem danos.
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
37
|
failproofai policies --install
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
Isso
|
|
40
|
+
Isso insere entradas de hook no `settings.json` do Claude Code. Você também pode instalar para um único projeto ou escolher políticas específicas:
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
43
|
failproofai policies --install --scope project
|
|
@@ -59,7 +59,7 @@ bun add -g failproofai
|
|
|
59
59
|
Abre um painel local em `http://localhost:8020` onde você pode navegar por sessões, inspecionar chamadas de ferramentas e gerenciar políticas.
|
|
60
60
|
</Step>
|
|
61
61
|
<Step title="Executar seu agente">
|
|
62
|
-
Inicie o Claude Code normalmente. Se o agente tentar algo arriscado, o failproofai
|
|
62
|
+
Inicie o Claude Code normalmente. Se o agente tentar algo arriscado, o failproofai intercepta automaticamente. Deixe-o rodando sem supervisão e revise o que aconteceu no painel.
|
|
63
63
|
</Step>
|
|
64
64
|
</Steps>
|
|
65
65
|
|
|
@@ -75,27 +75,79 @@ Claude Code → failproofai --hook PreToolUse → reads stdin JSON
|
|
|
75
75
|
writes decision to stdout
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
-
Cada política retorna uma
|
|
78
|
+
Cada política retorna uma de três decisões:
|
|
79
79
|
|
|
80
|
-
- **allow**
|
|
81
|
-
- **deny**
|
|
82
|
-
- **instruct**
|
|
80
|
+
- **allow** - o agente prossegue normalmente
|
|
81
|
+
- **deny** - a ação é bloqueada e o agente é informado do motivo
|
|
82
|
+
- **instruct** - contexto adicional é inserido no prompt do agente
|
|
83
83
|
|
|
84
84
|
<Note>
|
|
85
|
-
As políticas são executadas no seu processo local.
|
|
85
|
+
As políticas são executadas no seu processo local. Nada é enviado a um serviço remoto.
|
|
86
86
|
</Note>
|
|
87
87
|
|
|
88
88
|
---
|
|
89
89
|
|
|
90
|
+
## Configure políticas de equipe com políticas baseadas em convenção
|
|
91
|
+
|
|
92
|
+
A forma mais rápida de estabelecer padrões de qualidade em toda a sua equipe é a convenção `.failproofai/policies/`. Basta colocar arquivos de política nesse diretório e eles são carregados automaticamente — sem flags, sem alterações de configuração, sem comandos de instalação.
|
|
93
|
+
|
|
94
|
+
<Steps>
|
|
95
|
+
<Step title="Criar o diretório de políticas">
|
|
96
|
+
```bash
|
|
97
|
+
mkdir -p .failproofai/policies
|
|
98
|
+
```
|
|
99
|
+
</Step>
|
|
100
|
+
<Step title="Adicionar arquivos de política">
|
|
101
|
+
Copie os exemplos iniciais ou escreva os seus próprios:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
cp node_modules/failproofai/examples/convention-policies/*.mjs .failproofai/policies/
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Ou crie um novo:
|
|
108
|
+
|
|
109
|
+
```js
|
|
110
|
+
// .failproofai/policies/team-policies.mjs
|
|
111
|
+
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
112
|
+
|
|
113
|
+
customPolicies.add({
|
|
114
|
+
name: "test-before-commit",
|
|
115
|
+
match: { events: ["PreToolUse"] },
|
|
116
|
+
fn: async (ctx) => {
|
|
117
|
+
if (ctx.toolName !== "Bash") return allow();
|
|
118
|
+
if (/git\s+commit/.test(ctx.toolInput?.command ?? "")) {
|
|
119
|
+
return instruct("Run tests before committing.");
|
|
120
|
+
}
|
|
121
|
+
return allow();
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
```
|
|
125
|
+
</Step>
|
|
126
|
+
<Step title="Enviar para o git">
|
|
127
|
+
```bash
|
|
128
|
+
git add .failproofai/policies/
|
|
129
|
+
git commit -m "Add team quality policies"
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Todo membro da equipe que tiver o failproofai instalado receberá essas políticas automaticamente. Sem necessidade de configuração individual por desenvolvedor.
|
|
133
|
+
</Step>
|
|
134
|
+
</Steps>
|
|
135
|
+
|
|
136
|
+
<Tip>
|
|
137
|
+
Faça commit de `.failproofai/policies/` no seu repositório para que toda a equipe compartilhe os mesmos padrões. À medida que sua equipe descobre novos modos de falha, adicione políticas e faça push — todos recebem a atualização no próximo `git pull`. Com o tempo, essas políticas se tornam um padrão de qualidade vivo que continua melhorando.
|
|
138
|
+
</Tip>
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
90
142
|
## Armazenamento de dados
|
|
91
143
|
|
|
92
|
-
Todas as configurações e logs
|
|
144
|
+
Todas as configurações e logs permanecem na sua máquina:
|
|
93
145
|
|
|
94
146
|
| Caminho | O que armazena |
|
|
95
147
|
|---------|----------------|
|
|
96
148
|
| `~/.failproofai/policies-config.json` | Configuração global de políticas |
|
|
97
149
|
| `~/.failproofai/hook-activity.jsonl` | Histórico de execução de hooks |
|
|
98
|
-
| `~/.failproofai/hook.log` | Log de depuração para erros
|
|
150
|
+
| `~/.failproofai/hook.log` | Log de depuração para erros de hooks personalizados |
|
|
99
151
|
| `.failproofai/policies-config.json` | Configuração por projeto (versionada) |
|
|
100
152
|
| `.failproofai/policies-config.local.json` | Substituições pessoais (ignoradas pelo git) |
|
|
101
153
|
|