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
|
@@ -4,7 +4,7 @@ description: "Formato del archivo de configuración, sistema de tres ámbitos y
|
|
|
4
4
|
icon: gear
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
failproofai utiliza archivos de configuración JSON para controlar qué políticas están activas, cómo se comportan y desde dónde se cargan las políticas personalizadas. La configuración está diseñada para compartirse fácilmente con tu equipo: confírmala en tu repositorio y todos los desarrolladores
|
|
7
|
+
failproofai utiliza archivos de configuración JSON para controlar qué políticas están activas, cómo se comportan y desde dónde se cargan las políticas personalizadas. La configuración está diseñada para compartirse fácilmente con tu equipo: confírmala en tu repositorio y todos los desarrolladores obtendrán la misma red de seguridad para el agente.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -14,15 +14,15 @@ Existen tres ámbitos de configuración, evaluados en orden de prioridad:
|
|
|
14
14
|
|
|
15
15
|
| Ámbito | Ruta del archivo | Propósito |
|
|
16
16
|
|--------|-----------------|-----------|
|
|
17
|
-
| **project** | `.failproofai/policies-config.json` | Configuración por repositorio, confirmada en control de versiones |
|
|
17
|
+
| **project** | `.failproofai/policies-config.json` | Configuración por repositorio, confirmada en el control de versiones |
|
|
18
18
|
| **local** | `.failproofai/policies-config.local.json` | Anulaciones personales por repositorio, ignoradas por git |
|
|
19
19
|
| **global** | `~/.failproofai/policies-config.json` | Valores predeterminados a nivel de usuario para todos los proyectos |
|
|
20
20
|
|
|
21
|
-
Cuando failproofai recibe un evento de hook, carga y fusiona los tres archivos que existen
|
|
21
|
+
Cuando failproofai recibe un evento de hook, carga y fusiona los tres archivos que existen para el directorio de trabajo actual.
|
|
22
22
|
|
|
23
23
|
### Reglas de fusión
|
|
24
24
|
|
|
25
|
-
**`enabledPolicies`**
|
|
25
|
+
**`enabledPolicies`** - la unión de los tres ámbitos. Una política habilitada en cualquier nivel está activa.
|
|
26
26
|
|
|
27
27
|
```text
|
|
28
28
|
project: ["block-sudo"]
|
|
@@ -32,13 +32,13 @@ global: ["block-sudo", "sanitize-api-keys"]
|
|
|
32
32
|
resolved: ["block-sudo", "block-rm-rf", "sanitize-api-keys"] ← unión sin duplicados
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
**`policyParams`**
|
|
35
|
+
**`policyParams`** - el primer ámbito que define los parámetros para una política determinada gana completamente. No hay fusión profunda de valores dentro de los parámetros de una política.
|
|
36
36
|
|
|
37
37
|
```text
|
|
38
38
|
project: block-sudo → { allowPatterns: ["sudo apt-get update"] }
|
|
39
39
|
global: block-sudo → { allowPatterns: ["sudo systemctl status"] }
|
|
40
40
|
|
|
41
|
-
resolved: { allowPatterns: ["sudo apt-get update"] } ← gana
|
|
41
|
+
resolved: { allowPatterns: ["sudo apt-get update"] } ← project gana, global ignorado
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
```text
|
|
@@ -46,12 +46,12 @@ project: (sin entrada block-sudo)
|
|
|
46
46
|
local: (sin entrada block-sudo)
|
|
47
47
|
global: block-sudo → { allowPatterns: ["sudo systemctl status"] }
|
|
48
48
|
|
|
49
|
-
resolved: { allowPatterns: ["sudo systemctl status"] } ←
|
|
49
|
+
resolved: { allowPatterns: ["sudo systemctl status"] } ← recae en global
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
**`customPoliciesPath`**
|
|
52
|
+
**`customPoliciesPath`** - el primer ámbito que lo define gana.
|
|
53
53
|
|
|
54
|
-
**`llm`**
|
|
54
|
+
**`llm`** - el primer ámbito que lo define gana.
|
|
55
55
|
|
|
56
56
|
---
|
|
57
57
|
|
|
@@ -112,17 +112,17 @@ Tipo: `Record<string, Record<string, unknown>>`
|
|
|
112
112
|
|
|
113
113
|
Anulaciones de parámetros por política. La clave externa es el nombre de la política; las claves internas son específicas de cada política. Cada política documenta sus parámetros disponibles en [Políticas integradas](/es/built-in-policies).
|
|
114
114
|
|
|
115
|
-
Si una política tiene parámetros pero no los especificas, se
|
|
115
|
+
Si una política tiene parámetros pero no los especificas, se utilizan los valores predeterminados integrados de la política. Los usuarios que no configuren `policyParams` en absoluto obtendrán un comportamiento idéntico al de versiones anteriores.
|
|
116
116
|
|
|
117
|
-
Las claves desconocidas dentro del bloque de parámetros de una política se ignoran silenciosamente
|
|
117
|
+
Las claves desconocidas dentro del bloque de parámetros de una política se ignoran silenciosamente al momento de ejecutar el hook, pero se marcan como advertencias cuando ejecutas `failproofai policies`.
|
|
118
118
|
|
|
119
119
|
#### `hint` (transversal)
|
|
120
120
|
|
|
121
121
|
Tipo: `string` (opcional)
|
|
122
122
|
|
|
123
|
-
Un mensaje que se añade al motivo cuando una política devuelve `deny` o `instruct`. Úsalo para dar a Claude orientación
|
|
123
|
+
Un mensaje que se añade al motivo cuando una política devuelve `deny` o `instruct`. Úsalo para dar a Claude orientación práctica sin modificar la política en sí.
|
|
124
124
|
|
|
125
|
-
Funciona con cualquier tipo de política:
|
|
125
|
+
Funciona con cualquier tipo de política: integradas, personalizadas (`custom/`), convenciones de proyecto (`.failproofai-project/`) o convenciones de usuario (`.failproofai-user/`).
|
|
126
126
|
|
|
127
127
|
```json
|
|
128
128
|
{
|
|
@@ -141,7 +141,7 @@ Funciona con cualquier tipo de política: integrada, personalizada (`custom/`),
|
|
|
141
141
|
}
|
|
142
142
|
```
|
|
143
143
|
|
|
144
|
-
Cuando block-force-push deniega, Claude ve: *"Force-pushing is blocked. Try creating a fresh branch instead."*
|
|
144
|
+
Cuando `block-force-push` deniega, Claude ve: *"Force-pushing is blocked. Try creating a fresh branch instead."*
|
|
145
145
|
|
|
146
146
|
Los valores que no sean cadenas de texto y las cadenas vacías se ignoran silenciosamente. Si `hint` no está definido, el comportamiento no cambia (compatible con versiones anteriores).
|
|
147
147
|
|
|
@@ -149,24 +149,24 @@ Los valores que no sean cadenas de texto y las cadenas vacías se ignoran silenc
|
|
|
149
149
|
|
|
150
150
|
Tipo: `string` (ruta absoluta)
|
|
151
151
|
|
|
152
|
-
Ruta a un archivo JavaScript que contiene políticas de hook personalizadas.
|
|
152
|
+
Ruta a un archivo JavaScript que contiene políticas de hook personalizadas. Se establece automáticamente mediante `failproofai policies --install --custom <path>` (la ruta se resuelve como absoluta antes de guardarse).
|
|
153
153
|
|
|
154
|
-
El archivo se carga
|
|
154
|
+
El archivo se carga de nuevo en cada evento de hook, sin ningún tipo de caché. Consulta [Políticas personalizadas](/es/custom-policies) para más detalles sobre cómo crearlas.
|
|
155
155
|
|
|
156
|
-
### Políticas basadas en
|
|
156
|
+
### Políticas basadas en convenciones
|
|
157
157
|
|
|
158
158
|
Además del `customPoliciesPath` explícito, failproofai descubre y carga automáticamente archivos de políticas desde directorios `.failproofai/policies/`:
|
|
159
159
|
|
|
160
160
|
| Nivel | Directorio | Ámbito |
|
|
161
161
|
|-------|-----------|--------|
|
|
162
|
-
| Proyecto | `.failproofai/policies/` | Compartido con el equipo
|
|
162
|
+
| Proyecto | `.failproofai/policies/` | Compartido con el equipo mediante control de versiones |
|
|
163
163
|
| Usuario | `~/.failproofai/policies/` | Personal, se aplica a todos los proyectos |
|
|
164
164
|
|
|
165
165
|
**Coincidencia de archivos:** Solo se cargan los archivos que coincidan con `*policies.{js,mjs,ts}` (por ejemplo, `security-policies.mjs`, `workflow-policies.js`). Los demás archivos del directorio se ignoran.
|
|
166
166
|
|
|
167
|
-
**Sin configuración necesaria:** Las políticas de convención no requieren entradas en `policies-config.json`. Simplemente coloca los archivos en el directorio y se detectarán en el
|
|
167
|
+
**Sin configuración necesaria:** Las políticas de convención no requieren entradas en `policies-config.json`. Simplemente coloca los archivos en el directorio y se detectarán en el próximo evento de hook.
|
|
168
168
|
|
|
169
|
-
**Carga por unión:** Se analizan tanto
|
|
169
|
+
**Carga por unión:** Se analizan tanto los directorios de convención del proyecto como los del usuario. Se cargan todos los archivos coincidentes de ambos niveles (a diferencia de `customPoliciesPath`, que utiliza el primero que gana por ámbito).
|
|
170
170
|
|
|
171
171
|
Consulta [Políticas personalizadas](/es/custom-policies) para más detalles y ejemplos.
|
|
172
172
|
|
|
@@ -174,7 +174,7 @@ Consulta [Políticas personalizadas](/es/custom-policies) para más detalles y e
|
|
|
174
174
|
|
|
175
175
|
Tipo: `object` (opcional)
|
|
176
176
|
|
|
177
|
-
Configuración del cliente LLM para políticas que realizan llamadas a IA. No es
|
|
177
|
+
Configuración del cliente LLM para políticas que realizan llamadas a IA. No es necesaria para la mayoría de las configuraciones.
|
|
178
178
|
|
|
179
179
|
```json
|
|
180
180
|
{
|
|
@@ -189,12 +189,12 @@ Configuración del cliente LLM para políticas que realizan llamadas a IA. No es
|
|
|
189
189
|
|
|
190
190
|
## Gestión de la configuración desde la CLI
|
|
191
191
|
|
|
192
|
-
Los comandos `policies --install` y `policies --uninstall` escriben en el settings.json de Claude Code (los puntos de entrada del hook), mientras que policies-config.json es el archivo que gestionas directamente.
|
|
192
|
+
Los comandos `policies --install` y `policies --uninstall` escriben en el `settings.json` de Claude Code (los puntos de entrada del hook), mientras que `policies-config.json` es el archivo que gestionas directamente. Ambos son independientes:
|
|
193
193
|
|
|
194
|
-
- **`settings.json`**
|
|
195
|
-
- **`policies-config.json`**
|
|
194
|
+
- **`settings.json`** - indica a Claude Code que llame a `failproofai --hook <event>` en cada uso de herramienta
|
|
195
|
+
- **`policies-config.json`** - indica a failproofai qué políticas evaluar y con qué parámetros
|
|
196
196
|
|
|
197
|
-
Puedes editar `policies-config.json` directamente en cualquier momento; los cambios surten efecto de inmediato en el
|
|
197
|
+
Puedes editar `policies-config.json` directamente en cualquier momento; los cambios surten efecto de inmediato en el próximo evento de hook, sin necesidad de reiniciar.
|
|
198
198
|
|
|
199
199
|
---
|
|
200
200
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Políticas Personalizadas
|
|
3
|
-
description: "Escribe tus propias políticas en JavaScript: aplica convenciones, previene
|
|
3
|
+
description: "Escribe tus propias políticas en JavaScript: aplica convenciones, previene la deriva, detecta fallos e integra con sistemas externos"
|
|
4
4
|
icon: code
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Las políticas personalizadas te permiten escribir reglas para cualquier comportamiento del agente: aplicar convenciones del proyecto, prevenir
|
|
7
|
+
Las políticas personalizadas te permiten escribir reglas para cualquier comportamiento del agente: aplicar convenciones del proyecto, prevenir la deriva, bloquear operaciones destructivas, detectar agentes atascados o integrarte con Slack, flujos de aprobación y más. Utilizan el mismo sistema de eventos de hook y las decisiones `allow`, `deny`, `instruct` que las políticas integradas.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -29,7 +29,7 @@ customPolicies.add({
|
|
|
29
29
|
});
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Instálalo:
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
35
|
failproofai policies --install --custom ./my-policies.js
|
|
@@ -39,9 +39,9 @@ failproofai policies --install --custom ./my-policies.js
|
|
|
39
39
|
|
|
40
40
|
## Dos formas de cargar políticas personalizadas
|
|
41
41
|
|
|
42
|
-
### Opción 1: Basada en
|
|
42
|
+
### Opción 1: Basada en convenciones (recomendada)
|
|
43
43
|
|
|
44
|
-
Coloca archivos `*policies.{js,mjs,ts}` en `.failproofai/policies/` y se cargarán automáticamente, sin necesidad de flags ni cambios de configuración. Funciona como los git hooks:
|
|
44
|
+
Coloca archivos `*policies.{js,mjs,ts}` en `.failproofai/policies/` y se cargarán automáticamente, sin necesidad de flags ni cambios de configuración. Funciona como los git hooks: deposita un archivo y ya está.
|
|
45
45
|
|
|
46
46
|
```
|
|
47
47
|
# Nivel de proyecto — incluido en git, compartido con el equipo
|
|
@@ -53,14 +53,14 @@ Coloca archivos `*policies.{js,mjs,ts}` en `.failproofai/policies/` y se cargar
|
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
**Cómo funciona:**
|
|
56
|
-
- Se analizan tanto el directorio del proyecto como el del usuario (unión — no el primero
|
|
57
|
-
- Los archivos se cargan
|
|
58
|
-
- Solo se cargan los archivos que coincidan con `*policies.{js,mjs,ts}`;
|
|
56
|
+
- Se analizan tanto el directorio del proyecto como el del usuario (unión — no gana el primero en ámbito)
|
|
57
|
+
- Los archivos se cargan en orden alfabético dentro de cada directorio. Usa el prefijo `01-`, `02-` para controlar el orden
|
|
58
|
+
- Solo se cargan los archivos que coincidan con `*policies.{js,mjs,ts}`; los demás se ignoran
|
|
59
59
|
- Cada archivo se carga de forma independiente (fail-open por archivo)
|
|
60
60
|
- Funciona junto con `--custom` explícito y las políticas integradas
|
|
61
61
|
|
|
62
62
|
<Tip>
|
|
63
|
-
Las políticas por convención son la forma más sencilla de compartir políticas en un equipo. Incluye `.failproofai/policies/` en git y todos los miembros del equipo las
|
|
63
|
+
Las políticas por convención son la forma más sencilla de compartir políticas en un equipo. Incluye `.failproofai/policies/` en git y todos los miembros del equipo las obtendrán automáticamente.
|
|
64
64
|
</Tip>
|
|
65
65
|
|
|
66
66
|
### Opción 2: Ruta de archivo explícita
|
|
@@ -76,15 +76,15 @@ failproofai policies --install --custom ./new-policies.js
|
|
|
76
76
|
failproofai policies --uninstall --custom
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
La ruta absoluta resuelta se almacena en `policies-config.json` como `customPoliciesPath`. El archivo se carga de nuevo en cada evento de hook
|
|
79
|
+
La ruta absoluta resuelta se almacena en `policies-config.json` como `customPoliciesPath`. El archivo se carga de nuevo en cada evento de hook — no hay caché entre eventos.
|
|
80
80
|
|
|
81
|
-
###
|
|
81
|
+
### Usando ambas formas juntas
|
|
82
82
|
|
|
83
83
|
Las políticas por convención y el archivo `--custom` explícito pueden coexistir. Orden de carga:
|
|
84
84
|
|
|
85
85
|
1. Archivo explícito `customPoliciesPath` (si está configurado)
|
|
86
|
-
2. Archivos de convención del proyecto (`{cwd}/.failproofai/policies/`, alfabético)
|
|
87
|
-
3. Archivos de convención del usuario (`~/.failproofai/policies/`, alfabético)
|
|
86
|
+
2. Archivos de convención del proyecto (`{cwd}/.failproofai/policies/`, en orden alfabético)
|
|
87
|
+
3. Archivos de convención del usuario (`~/.failproofai/policies/`, en orden alfabético)
|
|
88
88
|
|
|
89
89
|
---
|
|
90
90
|
|
|
@@ -98,13 +98,13 @@ import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
|
98
98
|
|
|
99
99
|
### `customPolicies.add(hook)`
|
|
100
100
|
|
|
101
|
-
Registra una política. Llámalo
|
|
101
|
+
Registra una política. Llámalo tantas veces como sea necesario para múltiples políticas en el mismo archivo.
|
|
102
102
|
|
|
103
103
|
```ts
|
|
104
104
|
customPolicies.add({
|
|
105
105
|
name: string; // requerido - identificador único
|
|
106
106
|
description?: string; // se muestra en la salida de `failproofai policies`
|
|
107
|
-
match?: { events?: HookEventType[] }; // filtra por tipo de evento;
|
|
107
|
+
match?: { events?: HookEventType[] }; // filtra por tipo de evento; omite para coincidir con todos
|
|
108
108
|
fn: (ctx: PolicyContext) => PolicyResult | Promise<PolicyResult>;
|
|
109
109
|
});
|
|
110
110
|
```
|
|
@@ -113,25 +113,21 @@ customPolicies.add({
|
|
|
113
113
|
|
|
114
114
|
| Función | Efecto | Cuándo usarla |
|
|
115
115
|
|----------|--------|----------|
|
|
116
|
-
| `allow()` | Permite la operación
|
|
116
|
+
| `allow()` | Permite la operación en silencio | La acción es segura, no se necesita mensaje |
|
|
117
117
|
| `deny(message)` | Bloquea la operación | El agente no debería realizar esta acción |
|
|
118
118
|
| `instruct(message)` | Añade contexto sin bloquear | Proporciona contexto adicional al agente para mantenerlo en curso |
|
|
119
119
|
|
|
120
|
-
`deny(message)` — el mensaje aparece
|
|
120
|
+
`deny(message)` — el mensaje aparece ante Claude con el prefijo `"Blocked by failproofai:"`. Un único `deny` cortocircuita toda evaluación posterior.
|
|
121
121
|
|
|
122
122
|
`instruct(message)` — el mensaje se añade al contexto de Claude para la llamada de herramienta actual. Todos los mensajes `instruct` se acumulan y se entregan juntos.
|
|
123
123
|
|
|
124
124
|
<Tip>
|
|
125
|
-
Puedes añadir orientación adicional a cualquier mensaje `deny` o `instruct`
|
|
125
|
+
Puedes añadir orientación adicional a cualquier mensaje `deny` o `instruct` agregando un campo `hint` en `policyParams`, sin necesidad de cambiar el código. Esto también funciona para políticas personalizadas (`custom/`), de convención de proyecto (`.failproofai-project/`) y de convención de usuario (`.failproofai-user/`). Consulta [Configuración → hint](/es/configuration#hint-cross-cutting) para más detalles.
|
|
126
126
|
</Tip>
|
|
127
127
|
|
|
128
|
-
### Mensajes informativos en allow
|
|
128
|
+
### Mensajes informativos en allow
|
|
129
129
|
|
|
130
|
-
|
|
131
|
-
`allow(message)` es una funcionalidad en beta disponible desde v0.0.2-beta.3. La API podría cambiar en versiones futuras. Las versiones anteriores solo admiten `allow()` sin argumentos.
|
|
132
|
-
</Note>
|
|
133
|
-
|
|
134
|
-
`allow(message)` permite la operación **y** envía un mensaje informativo a Claude. El mensaje se entrega como `additionalContext` en la respuesta stdout del manejador de hooks — el mismo mecanismo que usa `instruct`, pero con una semántica diferente: es una actualización de estado, no una advertencia.
|
|
130
|
+
`allow(message)` permite la operación **y** envía un mensaje informativo a Claude. El mensaje se entrega como `additionalContext` en la respuesta stdout del manejador de hooks — el mismo mecanismo que usa `instruct`, pero semánticamente distinto: es una actualización de estado, no una advertencia.
|
|
135
131
|
|
|
136
132
|
| Función | Efecto | Cuándo usarla |
|
|
137
133
|
|----------|--------|----------|
|
|
@@ -139,8 +135,8 @@ Puedes añadir orientación adicional a cualquier mensaje `deny` o `instruct` in
|
|
|
139
135
|
|
|
140
136
|
Casos de uso:
|
|
141
137
|
- **Confirmaciones de estado:** `allow("All CI checks passed.")` — le indica a Claude que todo está en orden
|
|
142
|
-
- **Explicaciones de fail-open:** `allow("GitHub CLI not installed, skipping CI check.")` — le
|
|
143
|
-
- **
|
|
138
|
+
- **Explicaciones de fail-open:** `allow("GitHub CLI not installed, skipping CI check.")` — le indica a Claude por qué se omitió una verificación para que tenga contexto completo
|
|
139
|
+
- **Acumulación de múltiples mensajes:** si varias políticas devuelven `allow(message)`, todos los mensajes se unen con saltos de línea y se entregan juntos
|
|
144
140
|
|
|
145
141
|
```js
|
|
146
142
|
customPolicies.add({
|
|
@@ -166,8 +162,8 @@ customPolicies.add({
|
|
|
166
162
|
| `eventType` | `string` | `"PreToolUse"`, `"PostToolUse"`, `"Notification"`, `"Stop"` |
|
|
167
163
|
| `toolName` | `string \| undefined` | La herramienta que se está invocando (p. ej. `"Bash"`, `"Write"`, `"Read"`) |
|
|
168
164
|
| `toolInput` | `Record<string, unknown> \| undefined` | Los parámetros de entrada de la herramienta |
|
|
169
|
-
| `payload` | `Record<string, unknown>` | Payload completo del evento
|
|
170
|
-
| `session` | `SessionMetadata \| undefined` | Contexto de sesión (ver más abajo) |
|
|
165
|
+
| `payload` | `Record<string, unknown>` | Payload completo del evento sin procesar, proveniente de Claude Code |
|
|
166
|
+
| `session` | `SessionMetadata \| undefined` | Contexto de la sesión (ver más abajo) |
|
|
171
167
|
|
|
172
168
|
### Campos de `SessionMetadata`
|
|
173
169
|
|
|
@@ -182,7 +178,7 @@ customPolicies.add({
|
|
|
182
178
|
| Evento | Cuándo se dispara | Contenido de `toolInput` |
|
|
183
179
|
|-------|--------------|----------------------|
|
|
184
180
|
| `PreToolUse` | Antes de que Claude ejecute una herramienta | La entrada de la herramienta (p. ej. `{ command: "..." }` para Bash) |
|
|
185
|
-
| `PostToolUse` | Después de que una herramienta completa | La entrada de la herramienta + `tool_result` (la salida) |
|
|
181
|
+
| `PostToolUse` | Después de que una herramienta completa su ejecución | La entrada de la herramienta + `tool_result` (la salida) |
|
|
186
182
|
| `Notification` | Cuando Claude envía una notificación | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }` — los hooks siempre deben devolver `allow()`, no pueden bloquear notificaciones |
|
|
187
183
|
| `Stop` | Cuando la sesión de Claude finaliza | Vacío |
|
|
188
184
|
|
|
@@ -194,8 +190,8 @@ Las políticas se evalúan en este orden:
|
|
|
194
190
|
|
|
195
191
|
1. Políticas integradas (en orden de definición)
|
|
196
192
|
2. Políticas personalizadas explícitas de `customPoliciesPath` (en orden de `.add()`)
|
|
197
|
-
3. Políticas de convención del proyecto `.failproofai/policies/` (archivos en orden alfabético, orden de `.add()` dentro de cada
|
|
198
|
-
4. Políticas de convención del usuario `~/.failproofai/policies/` (archivos en orden alfabético, orden de `.add()` dentro de cada
|
|
193
|
+
3. Políticas de convención del proyecto en `.failproofai/policies/` (archivos en orden alfabético, orden de `.add()` dentro de cada uno)
|
|
194
|
+
4. Políticas de convención del usuario en `~/.failproofai/policies/` (archivos en orden alfabético, orden de `.add()` dentro de cada uno)
|
|
199
195
|
|
|
200
196
|
<Note>
|
|
201
197
|
El primer `deny` cortocircuita todas las políticas siguientes. Todos los mensajes `instruct` se acumulan y se entregan juntos.
|
|
@@ -222,7 +218,7 @@ customPolicies.add({
|
|
|
222
218
|
});
|
|
223
219
|
```
|
|
224
220
|
|
|
225
|
-
Se resuelven todas las importaciones relativas
|
|
221
|
+
Se resuelven todas las importaciones relativas alcanzables desde el archivo de entrada. Esto se implementa reescribiendo las importaciones `from "failproofai"` a la ruta real de dist y creando archivos `.mjs` temporales para garantizar la compatibilidad con ESM.
|
|
226
222
|
|
|
227
223
|
---
|
|
228
224
|
|
|
@@ -235,33 +231,33 @@ customPolicies.add({
|
|
|
235
231
|
name: "require-summary-on-stop",
|
|
236
232
|
match: { events: ["Stop"] },
|
|
237
233
|
fn: async (ctx) => {
|
|
238
|
-
// Solo se dispara cuando la sesión
|
|
239
|
-
// ctx.session.transcriptPath contiene el
|
|
234
|
+
// Solo se dispara cuando la sesión termina
|
|
235
|
+
// ctx.session.transcriptPath contiene el registro completo de la sesión
|
|
240
236
|
return allow();
|
|
241
237
|
},
|
|
242
238
|
});
|
|
243
239
|
```
|
|
244
240
|
|
|
245
|
-
Omite `match` por completo para
|
|
241
|
+
Omite `match` por completo para disparar en cada tipo de evento.
|
|
246
242
|
|
|
247
243
|
---
|
|
248
244
|
|
|
249
245
|
## Manejo de errores y modos de fallo
|
|
250
246
|
|
|
251
|
-
Las políticas personalizadas son **fail-open**: los errores nunca bloquean las políticas integradas ni
|
|
247
|
+
Las políticas personalizadas son **fail-open**: los errores nunca bloquean las políticas integradas ni hacen fallar el manejador de hooks.
|
|
252
248
|
|
|
253
249
|
| Fallo | Comportamiento |
|
|
254
250
|
|---------|----------|
|
|
255
|
-
| `customPoliciesPath` no configurado | No se ejecutan políticas personalizadas explícitas; las políticas
|
|
256
|
-
| Archivo no encontrado | Se registra una advertencia en `~/.failproofai/hook.log`; las
|
|
251
|
+
| `customPoliciesPath` no configurado | No se ejecutan políticas personalizadas explícitas; las políticas de convención y las integradas continúan con normalidad |
|
|
252
|
+
| Archivo no encontrado | Se registra una advertencia en `~/.failproofai/hook.log`; las integradas continúan |
|
|
257
253
|
| Error de sintaxis/importación (explícito) | Error registrado en `~/.failproofai/hook.log`; se omiten las políticas personalizadas explícitas |
|
|
258
|
-
| Error de sintaxis/importación (convención) | Error registrado; ese archivo se omite, los demás archivos de convención
|
|
254
|
+
| Error de sintaxis/importación (convención) | Error registrado; ese archivo se omite, los demás archivos de convención se cargan igualmente |
|
|
259
255
|
| `fn` lanza un error en tiempo de ejecución | Error registrado; ese hook se trata como `allow`; los demás hooks continúan |
|
|
260
|
-
| `fn` tarda más de 10 segundos |
|
|
261
|
-
| Directorio de convención
|
|
256
|
+
| `fn` tarda más de 10 segundos | Se registra el timeout; se trata como `allow` |
|
|
257
|
+
| Directorio de convención faltante | No se ejecutan políticas de convención; sin error |
|
|
262
258
|
|
|
263
259
|
<Tip>
|
|
264
|
-
Para depurar errores en políticas personalizadas,
|
|
260
|
+
Para depurar errores en políticas personalizadas, monitorea el archivo de log:
|
|
265
261
|
|
|
266
262
|
```bash
|
|
267
263
|
tail -f ~/.failproofai/hook.log
|
|
@@ -276,7 +272,7 @@ tail -f ~/.failproofai/hook.log
|
|
|
276
272
|
// my-policies.js
|
|
277
273
|
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
278
274
|
|
|
279
|
-
//
|
|
275
|
+
// Evitar que el agente escriba en el directorio secrets/
|
|
280
276
|
customPolicies.add({
|
|
281
277
|
name: "block-secrets-dir",
|
|
282
278
|
description: "Prevent agent from writing to secrets/ directory",
|
|
@@ -289,7 +285,7 @@ customPolicies.add({
|
|
|
289
285
|
},
|
|
290
286
|
});
|
|
291
287
|
|
|
292
|
-
//
|
|
288
|
+
// Mantener al agente en curso: verificar tests antes de hacer commit
|
|
293
289
|
customPolicies.add({
|
|
294
290
|
name: "remind-test-before-commit",
|
|
295
291
|
description: "Keep the agent on track: verify tests pass before committing",
|
|
@@ -304,7 +300,7 @@ customPolicies.add({
|
|
|
304
300
|
},
|
|
305
301
|
});
|
|
306
302
|
|
|
307
|
-
//
|
|
303
|
+
// Prevenir cambios de dependencias no planificados durante el período de congelamiento
|
|
308
304
|
customPolicies.add({
|
|
309
305
|
name: "dependency-freeze",
|
|
310
306
|
description: "Prevent unplanned dependency changes during freeze period",
|
|
@@ -327,22 +323,22 @@ export { customPolicies };
|
|
|
327
323
|
|
|
328
324
|
## Ejemplos
|
|
329
325
|
|
|
330
|
-
El directorio `examples/` contiene archivos de políticas listos para
|
|
326
|
+
El directorio `examples/` contiene archivos de políticas listos para usar:
|
|
331
327
|
|
|
332
328
|
| Archivo | Contenido |
|
|
333
329
|
|------|----------|
|
|
334
|
-
| `examples/policies-basic.js` | Cinco políticas
|
|
335
|
-
| `examples/policies-advanced/index.js` | Patrones avanzados: importaciones transitivas, llamadas asíncronas, limpieza de
|
|
336
|
-
| `examples/convention-policies/security-policies.mjs` | Políticas de seguridad
|
|
337
|
-
| `examples/convention-policies/workflow-policies.mjs` | Políticas de flujo de trabajo
|
|
330
|
+
| `examples/policies-basic.js` | Cinco políticas iniciales que cubren los modos de fallo más comunes del agente |
|
|
331
|
+
| `examples/policies-advanced/index.js` | Patrones avanzados: importaciones transitivas, llamadas asíncronas, limpieza de salida y hooks al final de sesión |
|
|
332
|
+
| `examples/convention-policies/security-policies.mjs` | Políticas de seguridad basadas en convenciones (bloquear escrituras en .env, prevenir la reescritura del historial de git) |
|
|
333
|
+
| `examples/convention-policies/workflow-policies.mjs` | Políticas de flujo de trabajo basadas en convenciones (recordatorios de tests, auditoría de escrituras en archivos) |
|
|
338
334
|
|
|
339
|
-
###
|
|
335
|
+
### Uso de los ejemplos con archivo explícito
|
|
340
336
|
|
|
341
337
|
```bash
|
|
342
338
|
failproofai policies --install --custom ./examples/policies-basic.js
|
|
343
339
|
```
|
|
344
340
|
|
|
345
|
-
###
|
|
341
|
+
### Uso de los ejemplos basados en convenciones
|
|
346
342
|
|
|
347
343
|
```bash
|
|
348
344
|
# Copiar al nivel del proyecto
|
|
@@ -354,4 +350,4 @@ mkdir -p ~/.failproofai/policies
|
|
|
354
350
|
cp examples/convention-policies/*.mjs ~/.failproofai/policies/
|
|
355
351
|
```
|
|
356
352
|
|
|
357
|
-
No se necesita ningún comando de instalación — los archivos se detectan automáticamente en el
|
|
353
|
+
No se necesita ningún comando de instalación — los archivos se detectan automáticamente en el próximo evento de hook.
|