failproofai 0.0.6-beta.1 → 0.0.6-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.failproofai/policies/review-policies.mjs +4 -3
- 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]__0~kmh8w._.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]__0rh.18_._.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 +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/{08t08igdql9yt.js → 00j0rr7rh8ef8.js} +1 -1
- package/.next/standalone/.next/static/chunks/{12~yi9oj8av8p.js → 05j1px0r8yzh6.js} +2 -2
- package/.next/standalone/.next/static/chunks/{09_k80d~cq2wg.js → 0badv41uxa56..js} +1 -1
- package/.next/standalone/.next/static/chunks/{0wlyoif4_kj_t.js → 0ijk_kek9_wyx.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0bvhsa6zva2o..js → 0ksdlt_1hucdm.js} +1 -1
- package/.next/standalone/.next/static/chunks/{03rz6ykw-a2xi.js → 0npb~873.wvg3.js} +1 -1
- package/.next/standalone/.next/static/chunks/{01b~z8f1ws0rk.js → 0xpl.oscrakvx.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0gbf4cphy8ksq.js → 1052sguyd-.ka.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0v.yd0kg_ld3r.js → 14cl9poem30dq.js} +1 -1
- package/.next/standalone/CHANGELOG.md +11 -0
- package/.next/standalone/dist/cli.mjs +3 -3
- 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 +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/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/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/package.json +1 -1
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/src/hooks/builtin-policies.ts +5 -1
- package/dist/cli.mjs +3 -3
- package/package.json +1 -1
- package/src/hooks/builtin-policies.ts +5 -1
- /package/.next/standalone/.next/static/{CkmOT-ZvDN-sVULinGVKT → A9pNTZdoYJTVyPAYwQMx5}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{CkmOT-ZvDN-sVULinGVKT → A9pNTZdoYJTVyPAYwQMx5}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{CkmOT-ZvDN-sVULinGVKT → A9pNTZdoYJTVyPAYwQMx5}/_ssgManifest.js +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
+
---
|
|
2
3
|
title: Пользовательские политики
|
|
3
|
-
description: "Напишите
|
|
4
|
+
description: "Напишите собственные политики на JavaScript - обеспечьте соблюдение соглашений, предотвратите дрейф, выявляйте сбои, интегрируйтесь с внешними системами"
|
|
4
5
|
icon: code
|
|
5
6
|
---
|
|
6
7
|
|
|
7
|
-
Пользовательские политики позволяют
|
|
8
|
+
Пользовательские политики позволяют писать правила для любого поведения агента: обеспечивать соблюдение соглашений проекта, предотвращать дрейф, блокировать деструктивные операции, выявлять зависшие агенты или интегрироваться со Slack, рабочими процессами одобрения и многим другим. Они используют ту же систему событий hook и решения `allow`, `deny`, `instruct`, что и встроенные политики.
|
|
8
9
|
|
|
9
10
|
---
|
|
10
11
|
|
|
@@ -39,52 +40,52 @@ failproofai policies --install --custom ./my-policies.js
|
|
|
39
40
|
|
|
40
41
|
## Два способа загрузки пользовательских политик
|
|
41
42
|
|
|
42
|
-
### Вариант 1: На основе
|
|
43
|
+
### Вариант 1: На основе соглашения (рекомендуется)
|
|
43
44
|
|
|
44
|
-
|
|
45
|
+
Разместите файлы `*policies.{js,mjs,ts}` в `.failproofai/policies/` и они будут загружены автоматически — без флагов или изменений конфигурации. Это работает как git hooks: положите файл, и он просто работает.
|
|
45
46
|
|
|
46
47
|
```
|
|
47
|
-
#
|
|
48
|
+
# На уровне проекта — добавляется в git, совместно используется командой
|
|
48
49
|
.failproofai/policies/security-policies.mjs
|
|
49
50
|
.failproofai/policies/workflow-policies.mjs
|
|
50
51
|
|
|
51
|
-
#
|
|
52
|
+
# На уровне пользователя — личные, применяются ко всем проектам
|
|
52
53
|
~/.failproofai/policies/my-policies.mjs
|
|
53
54
|
```
|
|
54
55
|
|
|
55
56
|
**Как это работает:**
|
|
56
|
-
- Оба
|
|
57
|
-
- Файлы загружаются в алфавитном порядке в каждом
|
|
58
|
-
- Загружаются только файлы, соответствующие `*policies.{js,mjs,ts}`;
|
|
57
|
+
- Оба каталога (проекта и пользователя) сканируются (объединение — не первый найденный)
|
|
58
|
+
- Файлы загружаются в алфавитном порядке в каждом каталоге. Добавьте префикс `01-`, `02-` для управления порядком
|
|
59
|
+
- Загружаются только файлы, соответствующие `*policies.{js,mjs,ts}`; остальные файлы игнорируются
|
|
59
60
|
- Каждый файл загружается независимо (fail-open для каждого файла)
|
|
60
|
-
- Работает
|
|
61
|
+
- Работает рядом с явными `--custom` и встроенными политиками
|
|
61
62
|
|
|
62
63
|
<Tip>
|
|
63
|
-
Политики
|
|
64
|
+
Политики на основе соглашения — самый простой способ установить стандарт качества для вашей организации. Добавьте `.failproofai/policies/` в git, и каждый участник команды получит одни и те же правила автоматически — не требуется настройка для каждого разработчика. По мере того как ваша команда обнаруживает новые режимы сбоев, добавьте политику и отправьте её. Со временем эти политики становятся живым стандартом качества, который улучшается с каждым вкладом.
|
|
64
65
|
</Tip>
|
|
65
66
|
|
|
66
|
-
### Вариант 2: Явный путь
|
|
67
|
+
### Вариант 2: Явный путь к файлу
|
|
67
68
|
|
|
68
69
|
```bash
|
|
69
|
-
#
|
|
70
|
+
# Установка с пользовательским файлом политик
|
|
70
71
|
failproofai policies --install --custom ./my-policies.js
|
|
71
72
|
|
|
72
|
-
#
|
|
73
|
+
# Замена пути к файлу политик
|
|
73
74
|
failproofai policies --install --custom ./new-policies.js
|
|
74
75
|
|
|
75
|
-
#
|
|
76
|
+
# Удаление пути к пользовательским политикам из конфигурации
|
|
76
77
|
failproofai policies --uninstall --custom
|
|
77
78
|
```
|
|
78
79
|
|
|
79
80
|
Разрешённый абсолютный путь сохраняется в `policies-config.json` как `customPoliciesPath`. Файл загружается заново при каждом событии hook — кеширования между событиями нет.
|
|
80
81
|
|
|
81
|
-
### Использование обоих вместе
|
|
82
|
+
### Использование обоих способов вместе
|
|
82
83
|
|
|
83
|
-
Политики
|
|
84
|
+
Политики на основе соглашения и явный файл `--custom` могут сосуществовать. Порядок загрузки:
|
|
84
85
|
|
|
85
|
-
1. Файл
|
|
86
|
-
2. Файлы
|
|
87
|
-
3. Файлы
|
|
86
|
+
1. Файл с явным `customPoliciesPath` (если настроен)
|
|
87
|
+
2. Файлы соглашения проекта (`{cwd}/.failproofai/policies/`, в алфавитном порядке)
|
|
88
|
+
3. Файлы соглашения пользователя (`~/.failproofai/policies/`, в алфавитном порядке)
|
|
88
89
|
|
|
89
90
|
---
|
|
90
91
|
|
|
@@ -98,45 +99,45 @@ import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
|
98
99
|
|
|
99
100
|
### `customPolicies.add(hook)`
|
|
100
101
|
|
|
101
|
-
Регистрирует политику.
|
|
102
|
+
Регистрирует политику. Вызывайте столько раз, сколько нужно для нескольких политик в одном файле.
|
|
102
103
|
|
|
103
104
|
```ts
|
|
104
105
|
customPolicies.add({
|
|
105
|
-
name: string; //
|
|
106
|
+
name: string; // обязателен - уникальный идентификатор
|
|
106
107
|
description?: string; // показывается в выводе `failproofai policies`
|
|
107
|
-
match?: { events?: HookEventType[] }; // фильтр по типу события; опустите для
|
|
108
|
+
match?: { events?: HookEventType[] }; // фильтр по типу события; опустите для соответствия всем
|
|
108
109
|
fn: (ctx: PolicyContext) => PolicyResult | Promise<PolicyResult>;
|
|
109
110
|
});
|
|
110
111
|
```
|
|
111
112
|
|
|
112
|
-
### Вспомогательные функции решений
|
|
113
|
+
### Вспомогательные функции принятия решений
|
|
113
114
|
|
|
114
|
-
| Функция | Эффект |
|
|
115
|
-
|
|
115
|
+
| Функция | Эффект | Когда использовать |
|
|
116
|
+
|---------|--------|-------------------|
|
|
116
117
|
| `allow()` | Разрешить операцию молча | Действие безопасно, сообщение не требуется |
|
|
117
|
-
| `deny(message)` |
|
|
118
|
-
| `instruct(message)` | Добавить контекст без
|
|
118
|
+
| `deny(message)` | Блокировать операцию | Агент не должен выполнять это действие |
|
|
119
|
+
| `instruct(message)` | Добавить контекст без блокировки | Дать агенту дополнительный контекст для остановки на пути |
|
|
119
120
|
|
|
120
|
-
`deny(message)`
|
|
121
|
+
`deny(message)` - сообщение появляется Claude с префиксом `"Blocked by failproofai:"`. Один `deny` прерывает всю дальнейшую оценку.
|
|
121
122
|
|
|
122
|
-
`instruct(message)`
|
|
123
|
+
`instruct(message)` - сообщение добавляется в контекст Claude для текущего вызова инструмента. Все сообщения `instruct` накапливаются и доставляются вместе.
|
|
123
124
|
|
|
124
125
|
<Tip>
|
|
125
|
-
Вы можете добавить дополнительное руководство к любому сообщению `deny` или `instruct`, добавив поле `hint` в `policyParams` — без изменения кода. Это работает для пользовательских (`custom/`), проектных соглашений (`.failproofai-project/`) и пользовательских соглашений (`.failproofai-user/`) политик.
|
|
126
|
+
Вы можете добавить дополнительное руководство к любому сообщению `deny` или `instruct`, добавив поле `hint` в `policyParams` — без изменения кода. Это работает для пользовательских (`custom/`), проектных соглашений (`.failproofai-project/`) и пользовательских соглашений (`.failproofai-user/`) политик. Смотрите [Configuration → hint](/ru/configuration#hint-cross-cutting) для деталей.
|
|
126
127
|
</Tip>
|
|
127
128
|
|
|
128
129
|
### Информационные сообщения allow
|
|
129
130
|
|
|
130
|
-
`allow(message)` разрешает операцию **и** отправляет информационное сообщение обратно Claude. Сообщение доставляется как `additionalContext` в
|
|
131
|
+
`allow(message)` разрешает операцию **и** отправляет информационное сообщение обратно Claude. Сообщение доставляется как `additionalContext` в ответе stdout обработчика hook — тот же механизм, используемый `instruct`, но семантически отличающийся: это обновление статуса, а не предупреждение.
|
|
131
132
|
|
|
132
|
-
| Функция | Эффект |
|
|
133
|
-
|
|
133
|
+
| Функция | Эффект | Когда использовать |
|
|
134
|
+
|---------|--------|-------------------|
|
|
134
135
|
| `allow(message)` | Разрешить и отправить контекст Claude | Подтвердить прохождение проверки или объяснить, почему проверка была пропущена |
|
|
135
136
|
|
|
136
|
-
|
|
137
|
-
- **Подтверждения статуса:** `allow("All CI checks passed.")` —
|
|
138
|
-
-
|
|
139
|
-
- **Несколько сообщений накапливаются:** если несколько политик
|
|
137
|
+
Примеры использования:
|
|
138
|
+
- **Подтверждения статуса:** `allow("All CI checks passed.")` — сообщает Claude, что всё хорошо
|
|
139
|
+
- **Fail-open объяснения:** `allow("GitHub CLI not installed, skipping CI check.")` — сообщает Claude, почему проверка была пропущена, чтобы у него был полный контекст
|
|
140
|
+
- **Несколько сообщений накапливаются:** если несколько политик каждая возвращает `allow(message)`, все сообщения объединяются с новыми строками и доставляются вместе
|
|
140
141
|
|
|
141
142
|
```js
|
|
142
143
|
customPolicies.add({
|
|
@@ -158,43 +159,43 @@ customPolicies.add({
|
|
|
158
159
|
### Поля `PolicyContext`
|
|
159
160
|
|
|
160
161
|
| Поле | Тип | Описание |
|
|
161
|
-
|
|
162
|
+
|------|-----|---------|
|
|
162
163
|
| `eventType` | `string` | `"PreToolUse"`, `"PostToolUse"`, `"Notification"`, `"Stop"` |
|
|
163
|
-
| `toolName` | `string \| undefined` | Вызываемый инструмент (
|
|
164
|
+
| `toolName` | `string \| undefined` | Вызываемый инструмент (например `"Bash"`, `"Write"`, `"Read"`) |
|
|
164
165
|
| `toolInput` | `Record<string, unknown> \| undefined` | Входные параметры инструмента |
|
|
165
|
-
| `payload` | `Record<string, unknown>` |
|
|
166
|
+
| `payload` | `Record<string, unknown>` | Полная необработанная полезная нагрузка события из Claude Code |
|
|
166
167
|
| `session` | `SessionMetadata \| undefined` | Контекст сессии (см. ниже) |
|
|
167
168
|
|
|
168
169
|
### Поля `SessionMetadata`
|
|
169
170
|
|
|
170
171
|
| Поле | Тип | Описание |
|
|
171
|
-
|
|
172
|
+
|------|-----|---------|
|
|
172
173
|
| `sessionId` | `string` | Идентификатор сессии Claude Code |
|
|
173
|
-
| `cwd` | `string` | Рабочий
|
|
174
|
+
| `cwd` | `string` | Рабочий каталог сессии Claude Code |
|
|
174
175
|
| `transcriptPath` | `string` | Путь к файлу транскрипта JSONL сессии |
|
|
175
176
|
|
|
176
177
|
### Типы событий
|
|
177
178
|
|
|
178
179
|
| Событие | Когда срабатывает | Содержимое `toolInput` |
|
|
179
|
-
|
|
180
|
-
| `PreToolUse` | Перед запуском инструмента Claude | Входные данные инструмента (
|
|
181
|
-
| `PostToolUse` | После завершения инструмента | Входные данные инструмента + `tool_result` (
|
|
180
|
+
|--------|------------------|----------------------|
|
|
181
|
+
| `PreToolUse` | Перед запуском инструмента Claude | Входные данные инструмента (например `{ command: "..." }` для Bash) |
|
|
182
|
+
| `PostToolUse` | После завершения инструмента | Входные данные инструмента + `tool_result` (выход) |
|
|
182
183
|
| `Notification` | Когда Claude отправляет уведомление | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }` - hooks должны всегда возвращать `allow()`, они не могут блокировать уведомления |
|
|
183
|
-
| `Stop` | Когда сессия Claude
|
|
184
|
+
| `Stop` | Когда сессия Claude заканчивается | Пусто |
|
|
184
185
|
|
|
185
186
|
---
|
|
186
187
|
|
|
187
188
|
## Порядок оценки
|
|
188
189
|
|
|
189
|
-
Политики оцениваются в
|
|
190
|
+
Политики оцениваются в этом порядке:
|
|
190
191
|
|
|
191
192
|
1. Встроенные политики (в порядке определения)
|
|
192
193
|
2. Явные пользовательские политики из `customPoliciesPath` (в порядке `.add()`)
|
|
193
|
-
3. Политики
|
|
194
|
-
4. Политики
|
|
194
|
+
3. Политики соглашения из проекта `.failproofai/policies/` (файлы в алфавитном порядке, `.add()` порядок внутри)
|
|
195
|
+
4. Политики соглашения из пользователя `~/.failproofai/policies/` (файлы в алфавитном порядке, `.add()` порядок внутри)
|
|
195
196
|
|
|
196
197
|
<Note>
|
|
197
|
-
|
|
198
|
+
Первый `deny` прерывает все последующие политики. Все сообщения `instruct` накапливаются и доставляются вместе.
|
|
198
199
|
</Note>
|
|
199
200
|
|
|
200
201
|
---
|
|
@@ -218,13 +219,13 @@ customPolicies.add({
|
|
|
218
219
|
});
|
|
219
220
|
```
|
|
220
221
|
|
|
221
|
-
Все относительные импорты,
|
|
222
|
+
Все относительные импорты, доступные из файла входа, разрешаются. Это реализуется путём переписывания импортов `from "failproofai"` на фактический путь dist и создания временных файлов `.mjs` для обеспечения совместимости ESM.
|
|
222
223
|
|
|
223
224
|
---
|
|
224
225
|
|
|
225
|
-
## Фильтрация
|
|
226
|
+
## Фильтрация по типу события
|
|
226
227
|
|
|
227
|
-
Используйте `match.events` для
|
|
228
|
+
Используйте `match.events` для ограничения, когда срабатывает политика:
|
|
228
229
|
|
|
229
230
|
```js
|
|
230
231
|
customPolicies.add({
|
|
@@ -238,26 +239,26 @@ customPolicies.add({
|
|
|
238
239
|
});
|
|
239
240
|
```
|
|
240
241
|
|
|
241
|
-
Опустите `match` полностью, чтобы срабатывать
|
|
242
|
+
Опустите `match` полностью, чтобы срабатывать при каждом типе события.
|
|
242
243
|
|
|
243
244
|
---
|
|
244
245
|
|
|
245
|
-
## Обработка ошибок и режимы
|
|
246
|
+
## Обработка ошибок и режимы сбоя
|
|
246
247
|
|
|
247
|
-
Пользовательские политики — **fail-open**: ошибки никогда не блокируют встроенные политики и не
|
|
248
|
+
Пользовательские политики — **fail-open**: ошибки никогда не блокируют встроенные политики и не приводят к краху обработчика hook.
|
|
248
249
|
|
|
249
|
-
|
|
|
250
|
-
|
|
251
|
-
| `customPoliciesPath` не
|
|
252
|
-
| Файл не найден | Предупреждение
|
|
253
|
-
|
|
|
254
|
-
|
|
|
255
|
-
| `fn` выбрасывает во время выполнения | Ошибка
|
|
256
|
-
| `fn` работает дольше 10 сек |
|
|
257
|
-
|
|
|
250
|
+
| Сбой | Поведение |
|
|
251
|
+
|------|-----------|
|
|
252
|
+
| `customPoliciesPath` не установлен | Явные пользовательские политики не запускаются; встроенные и политики соглашения продолжают работать нормально |
|
|
253
|
+
| Файл не найден | Предупреждение записывается в `~/.failproofai/hook.log`; встроенные продолжают работать |
|
|
254
|
+
| Синтаксическая/ошибка импорта (явная) | Ошибка записывается в `~/.failproofai/hook.log`; явные пользовательские политики пропускаются |
|
|
255
|
+
| Синтаксическая/ошибка импорта (соглашение) | Ошибка записывается; этот файл пропускается, остальные файлы соглашения всё ещё загружаются |
|
|
256
|
+
| `fn` выбрасывает исключение во время выполнения | Ошибка записывается; этот hook рассматривается как `allow`; остальные hooks продолжают работу |
|
|
257
|
+
| `fn` работает дольше 10 сек | Тайм-аут записывается; рассматривается как `allow` |
|
|
258
|
+
| Каталог соглашения отсутствует | Политики соглашения не запускаются; нет ошибки |
|
|
258
259
|
|
|
259
260
|
<Tip>
|
|
260
|
-
Для отладки ошибок
|
|
261
|
+
Для отладки ошибок пользовательских политик смотрите файл журнала:
|
|
261
262
|
|
|
262
263
|
```bash
|
|
263
264
|
tail -f ~/.failproofai/hook.log
|
|
@@ -272,7 +273,7 @@ tail -f ~/.failproofai/hook.log
|
|
|
272
273
|
// my-policies.js
|
|
273
274
|
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
274
275
|
|
|
275
|
-
//
|
|
276
|
+
// Запретить агенту писать в каталог secrets/
|
|
276
277
|
customPolicies.add({
|
|
277
278
|
name: "block-secrets-dir",
|
|
278
279
|
description: "Prevent agent from writing to secrets/ directory",
|
|
@@ -285,7 +286,7 @@ customPolicies.add({
|
|
|
285
286
|
},
|
|
286
287
|
});
|
|
287
288
|
|
|
288
|
-
//
|
|
289
|
+
// Держать агента на пути: проверить тесты перед коммитом
|
|
289
290
|
customPolicies.add({
|
|
290
291
|
name: "remind-test-before-commit",
|
|
291
292
|
description: "Keep the agent on track: verify tests pass before committing",
|
|
@@ -300,7 +301,7 @@ customPolicies.add({
|
|
|
300
301
|
},
|
|
301
302
|
});
|
|
302
303
|
|
|
303
|
-
//
|
|
304
|
+
// Запретить незапланированные изменения зависимостей во время freeze
|
|
304
305
|
customPolicies.add({
|
|
305
306
|
name: "dependency-freeze",
|
|
306
307
|
description: "Prevent unplanned dependency changes during freeze period",
|
|
@@ -323,31 +324,31 @@ export { customPolicies };
|
|
|
323
324
|
|
|
324
325
|
## Примеры
|
|
325
326
|
|
|
326
|
-
|
|
327
|
+
Каталог `examples/` содержит готовые к запуску файлы политик:
|
|
327
328
|
|
|
328
329
|
| Файл | Содержимое |
|
|
329
|
-
|
|
330
|
-
| `examples/policies-basic.js` | Пять начальных политик, охватывающих
|
|
331
|
-
| `examples/policies-advanced/index.js` | Продвинутые паттерны: транзитивные импорты, асинхронные вызовы, очистка
|
|
332
|
-
| `examples/convention-policies/security-policies.mjs` | Политики безопасности на основе
|
|
333
|
-
| `examples/convention-policies/workflow-policies.mjs` | Политики рабочего процесса на основе
|
|
330
|
+
|------|-----------|
|
|
331
|
+
| `examples/policies-basic.js` | Пять начальных политик, охватывающих распространённые режимы сбоев агента |
|
|
332
|
+
| `examples/policies-advanced/index.js` | Продвинутые паттерны: транзитивные импорты, асинхронные вызовы, очистка выходных данных и hooks конца сессии |
|
|
333
|
+
| `examples/convention-policies/security-policies.mjs` | Политики безопасности на основе соглашения (блокировка записей .env, предотвращение переписывания истории git) |
|
|
334
|
+
| `examples/convention-policies/workflow-policies.mjs` | Политики рабочего процесса на основе соглашения (напоминания о тестах, аудит записей файлов) |
|
|
334
335
|
|
|
335
|
-
### Использование примеров
|
|
336
|
+
### Использование примеров с явным файлом
|
|
336
337
|
|
|
337
338
|
```bash
|
|
338
339
|
failproofai policies --install --custom ./examples/policies-basic.js
|
|
339
340
|
```
|
|
340
341
|
|
|
341
|
-
### Использование примеров на основе
|
|
342
|
+
### Использование примеров на основе соглашения
|
|
342
343
|
|
|
343
344
|
```bash
|
|
344
|
-
#
|
|
345
|
+
# Копировать на уровень проекта
|
|
345
346
|
mkdir -p .failproofai/policies
|
|
346
347
|
cp examples/convention-policies/*.mjs .failproofai/policies/
|
|
347
348
|
|
|
348
|
-
# Или
|
|
349
|
+
# Или копировать на уровень пользователя
|
|
349
350
|
mkdir -p ~/.failproofai/policies
|
|
350
351
|
cp examples/convention-policies/*.mjs ~/.failproofai/policies/
|
|
351
352
|
```
|
|
352
353
|
|
|
353
|
-
Команда
|
|
354
|
+
Команда установки не требуется — файлы будут подхвачены автоматически при следующем событии hook.
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
---
|
|
2
|
+
|
|
2
3
|
---
|
|
3
4
|
title: Примеры
|
|
4
5
|
description: "Как настроить hooks для Claude Code и Agents SDK"
|
|
5
6
|
icon: book-open
|
|
6
7
|
---
|
|
7
8
|
|
|
8
|
-
Готовые
|
|
9
|
+
Готовые примеры для распространённых сценариев. Каждый показывает, как установить и что ожидать.
|
|
9
10
|
|
|
10
11
|
---
|
|
11
12
|
|
|
12
13
|
## Настройка hooks для Claude Code
|
|
13
14
|
|
|
14
|
-
Failproof AI интегрируется с Claude Code через его [систему hooks](https://docs.anthropic.com/en/docs/claude-code/hooks). Когда вы запускаете `failproofai policies --install`, он регистрирует
|
|
15
|
+
Failproof AI интегрируется с Claude Code через его [систему hooks](https://docs.anthropic.com/en/docs/claude-code/hooks). Когда вы запускаете `failproofai policies --install`, он регистрирует hook-команды в `settings.json` Claude Code, которые срабатывают при каждом вызове инструмента.
|
|
15
16
|
|
|
16
17
|
<Steps>
|
|
17
18
|
<Step title="Установите failproofai">
|
|
@@ -29,14 +30,14 @@ Failproof AI интегрируется с Claude Code через его [сис
|
|
|
29
30
|
cat ~/.claude/settings.json | grep failproofai
|
|
30
31
|
```
|
|
31
32
|
|
|
32
|
-
Вы должны увидеть записи
|
|
33
|
+
Вы должны увидеть записи hook для событий `PreToolUse`, `PostToolUse`, `Notification` и `Stop`.
|
|
33
34
|
</Step>
|
|
34
35
|
<Step title="Запустите Claude Code">
|
|
35
36
|
```bash
|
|
36
37
|
claude
|
|
37
38
|
```
|
|
38
39
|
|
|
39
|
-
Политики теперь выполняются автоматически при каждом вызове инструмента. Попробуйте попросить Claude
|
|
40
|
+
Политики теперь выполняются автоматически при каждом вызове инструмента. Попробуйте попросить Claude запустить `sudo rm -rf /` — это будет заблокировано.
|
|
40
41
|
</Step>
|
|
41
42
|
</Steps>
|
|
42
43
|
|
|
@@ -44,7 +45,7 @@ Failproof AI интегрируется с Claude Code через его [сис
|
|
|
44
45
|
|
|
45
46
|
## Настройка hooks для Agents SDK
|
|
46
47
|
|
|
47
|
-
Если вы разрабатываете с
|
|
48
|
+
Если вы разрабатываете с использованием [Agents SDK](https://docs.anthropic.com/en/docs/agents-sdk), вы можете использовать ту же систему hooks программно.
|
|
48
49
|
|
|
49
50
|
<Steps>
|
|
50
51
|
<Step title="Установите failproofai в ваш проект">
|
|
@@ -53,7 +54,7 @@ Failproof AI интегрируется с Claude Code через его [сис
|
|
|
53
54
|
```
|
|
54
55
|
</Step>
|
|
55
56
|
<Step title="Настройте hooks в вашем агенте">
|
|
56
|
-
Передайте
|
|
57
|
+
Передайте hook-команды при создании процесса агента. Hooks срабатывают так же, как в Claude Code — через stdin/stdout JSON:
|
|
57
58
|
|
|
58
59
|
```bash
|
|
59
60
|
failproofai --hook PreToolUse # вызывается перед каждым инструментом
|
|
@@ -89,7 +90,7 @@ Failproof AI интегрируется с Claude Code через его [сис
|
|
|
89
90
|
|
|
90
91
|
## Блокировка деструктивных команд
|
|
91
92
|
|
|
92
|
-
|
|
93
|
+
Наиболее распространённая настройка — предотвратить необратимый ущерб от действий агентов.
|
|
93
94
|
|
|
94
95
|
```bash
|
|
95
96
|
failproofai policies --install block-sudo block-rm-rf block-force-push block-curl-pipe-sh
|
|
@@ -99,25 +100,25 @@ failproofai policies --install block-sudo block-rm-rf block-force-push block-cur
|
|
|
99
100
|
- `block-sudo` — блокирует все команды `sudo`
|
|
100
101
|
- `block-rm-rf` — блокирует рекурсивное удаление файлов
|
|
101
102
|
- `block-force-push` — блокирует `git push --force`
|
|
102
|
-
- `block-curl-pipe-sh` — блокирует передачу удалённых скриптов в
|
|
103
|
+
- `block-curl-pipe-sh` — блокирует передачу удалённых скриптов в shell
|
|
103
104
|
|
|
104
105
|
---
|
|
105
106
|
|
|
106
107
|
## Предотвращение утечки секретов
|
|
107
108
|
|
|
108
|
-
|
|
109
|
+
Помешайте агентам видеть или утекать учётные данные в выводе инструментов.
|
|
109
110
|
|
|
110
111
|
```bash
|
|
111
112
|
failproofai policies --install sanitize-api-keys sanitize-jwt sanitize-connection-strings sanitize-bearer-tokens
|
|
112
113
|
```
|
|
113
114
|
|
|
114
|
-
|
|
115
|
+
Они срабатывают на `PostToolUse` — после запуска инструмента, они скрывают вывод, прежде чем агент его увидит.
|
|
115
116
|
|
|
116
117
|
---
|
|
117
118
|
|
|
118
|
-
## Получайте оповещения
|
|
119
|
+
## Получайте оповещения Slack, когда агентам требуется внимание
|
|
119
120
|
|
|
120
|
-
Используйте hook
|
|
121
|
+
Используйте notification hook для отправки оповещений об ожидании в Slack.
|
|
121
122
|
|
|
122
123
|
```javascript
|
|
123
124
|
import { customPolicies, allow, instruct } from "failproofai";
|
|
@@ -151,7 +152,7 @@ customPolicies.add({
|
|
|
151
152
|
});
|
|
152
153
|
```
|
|
153
154
|
|
|
154
|
-
Установите
|
|
155
|
+
Установите это:
|
|
155
156
|
|
|
156
157
|
```bash
|
|
157
158
|
SLACK_WEBHOOK_URL=https://hooks.slack.com/... failproofai policies --install --custom ./slack-alerts.js
|
|
@@ -161,7 +162,7 @@ SLACK_WEBHOOK_URL=https://hooks.slack.com/... failproofai policies --install --c
|
|
|
161
162
|
|
|
162
163
|
## Держите агентов на одной ветке
|
|
163
164
|
|
|
164
|
-
Предотвратите переключение
|
|
165
|
+
Предотвратите переключение веток и отправку на защищённые ветки.
|
|
165
166
|
|
|
166
167
|
```javascript
|
|
167
168
|
import { customPolicies, allow, deny } from "failproofai";
|
|
@@ -183,9 +184,9 @@ customPolicies.add({
|
|
|
183
184
|
|
|
184
185
|
---
|
|
185
186
|
|
|
186
|
-
## Требуйте тесты перед
|
|
187
|
+
## Требуйте тесты перед коммитами
|
|
187
188
|
|
|
188
|
-
|
|
189
|
+
Напомните агентам запустить тесты перед коммитом.
|
|
189
190
|
|
|
190
191
|
```javascript
|
|
191
192
|
import { customPolicies, allow, instruct } from "failproofai";
|
|
@@ -209,7 +210,7 @@ customPolicies.add({
|
|
|
209
210
|
|
|
210
211
|
## Заблокируйте production репозиторий
|
|
211
212
|
|
|
212
|
-
|
|
213
|
+
Заколмитьте конфигурацию на уровне проекта, чтобы все разработчики в вашей команде получили одинаковые политики.
|
|
213
214
|
|
|
214
215
|
Создайте `.failproofai/policies-config.json` в вашем репозитории:
|
|
215
216
|
|
|
@@ -232,7 +233,7 @@ customPolicies.add({
|
|
|
232
233
|
}
|
|
233
234
|
```
|
|
234
235
|
|
|
235
|
-
Затем
|
|
236
|
+
Затем заколмитьте это:
|
|
236
237
|
|
|
237
238
|
```bash
|
|
238
239
|
git add .failproofai/policies-config.json
|
|
@@ -243,12 +244,66 @@ git commit -m "Add failproofai team policies"
|
|
|
243
244
|
|
|
244
245
|
---
|
|
245
246
|
|
|
246
|
-
##
|
|
247
|
+
## Постройте стандарт качества на уровне организации с политиками соглашения
|
|
248
|
+
|
|
249
|
+
Наиболее эффективная настройка: заколмитьте `.failproofai/policies/` в ваш репозиторий с политиками, подобранными для вашего проекта. Каждый член команды получит их автоматически — без команд установки, без изменения конфигурации.
|
|
250
|
+
|
|
251
|
+
<Steps>
|
|
252
|
+
<Step title="Создайте директорию и добавьте политики">
|
|
253
|
+
```bash
|
|
254
|
+
mkdir -p .failproofai/policies
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
```js
|
|
258
|
+
// .failproofai/policies/team-policies.mjs
|
|
259
|
+
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
260
|
+
|
|
261
|
+
// Enforce your team's preferred package manager
|
|
262
|
+
// (or enable the built-in prefer-package-manager policy instead)
|
|
263
|
+
customPolicies.add({
|
|
264
|
+
name: "enforce-bun",
|
|
265
|
+
match: { events: ["PreToolUse"] },
|
|
266
|
+
fn: async (ctx) => {
|
|
267
|
+
if (ctx.toolName !== "Bash") return allow();
|
|
268
|
+
const cmd = String(ctx.toolInput?.command ?? "");
|
|
269
|
+
if (/\bnpm\b/.test(cmd)) return deny("Use bun instead of npm.");
|
|
270
|
+
return allow();
|
|
271
|
+
},
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
// Remind the agent to run tests before committing
|
|
275
|
+
customPolicies.add({
|
|
276
|
+
name: "test-before-commit",
|
|
277
|
+
match: { events: ["PreToolUse"] },
|
|
278
|
+
fn: async (ctx) => {
|
|
279
|
+
if (ctx.toolName !== "Bash") return allow();
|
|
280
|
+
if (/git\s+commit/.test(ctx.toolInput?.command ?? "")) {
|
|
281
|
+
return instruct("Run tests before committing.");
|
|
282
|
+
}
|
|
283
|
+
return allow();
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
```
|
|
287
|
+
</Step>
|
|
288
|
+
<Step title="Заколмитьте в git">
|
|
289
|
+
```bash
|
|
290
|
+
git add .failproofai/policies/
|
|
291
|
+
git commit -m "Add team quality policies"
|
|
292
|
+
```
|
|
293
|
+
</Step>
|
|
294
|
+
<Step title="Продолжайте совершенствоваться">
|
|
295
|
+
Когда ваша команда сталкивается с новыми сбоями, добавьте политики и отправьте. Все получат обновление при следующем `git pull`. Эти политики становятся живым стандартом качества, который растёт вместе с вашей командой.
|
|
296
|
+
</Step>
|
|
297
|
+
</Steps>
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Другие примеры
|
|
247
302
|
|
|
248
303
|
Директория [`examples/`](https://github.com/exospherehost/failproofai/tree/main/examples) в репозитории содержит:
|
|
249
304
|
|
|
250
305
|
| Файл | Что он показывает |
|
|
251
306
|
|------|---------------|
|
|
252
|
-
| `policies-basic.js` |
|
|
253
|
-
| `policies-notification.js` | Оповещения Slack для уведомлений
|
|
254
|
-
| `policies-advanced/index.js` |
|
|
307
|
+
| `policies-basic.js` | Начальные политики — блокировка записей в production, force-push, передача скриптов |
|
|
308
|
+
| `policies-notification.js` | Оповещения Slack для уведомлений об ожидании и завершения сессии |
|
|
309
|
+
| `policies-advanced/index.js` | Транзитивный импорт, асинхронные hooks, скрубинг вывода PostToolUse, обработка события Stop |
|