failproofai 0.0.5-beta.0 → 0.0.6-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.failproofai/policies/workflow-policies.mjs +2 -1
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g72weg._.js +1 -1
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0r6vvp5._.js → [root-of-the-server]__0.~fd7s._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0z5dd-f._.js → [root-of-the-server]__0a.nuas._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +9 -9
- package/.next/standalone/.next/static/chunks/{0j_ivegn3i5wt.js → 0.z51twd.0l5z.js} +1 -1
- package/.next/standalone/.next/static/chunks/{04fpsjft~cje..js → 0hctoh28rg838.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0.io32u7gjgsb.js → 0hplx-8c-4vpv.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0yf_mmdukq6up.js → 0maq.q1t.ri85.js} +2 -2
- package/.next/standalone/.next/static/chunks/{0x8vagatq36_7.js → 0teq8wdh3po1n.js} +1 -1
- package/.next/standalone/.next/static/chunks/{04mtv9jnqknn3.js → 0uc0um_uz51m_.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0h4qcn40dunn7.js → 0ul6fk-z.6k-0.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0kvldut6ndzyz.js → 0w9lwqy0-v1dk.js} +1 -1
- package/.next/standalone/CHANGELOG.md +9 -1
- package/.next/standalone/README.md +2 -2
- package/.next/standalone/dist/cli.mjs +19 -2
- package/.next/standalone/docs/ar/architecture.mdx +66 -65
- package/.next/standalone/docs/ar/configuration.mdx +42 -42
- package/.next/standalone/docs/ar/custom-policies.mdx +63 -68
- package/.next/standalone/docs/architecture.mdx +2 -2
- package/.next/standalone/docs/configuration.mdx +1 -1
- package/.next/standalone/docs/custom-policies.mdx +2 -6
- package/.next/standalone/docs/de/architecture.mdx +92 -92
- package/.next/standalone/docs/de/configuration.mdx +35 -35
- package/.next/standalone/docs/de/custom-policies.mdx +50 -54
- package/.next/standalone/docs/es/architecture.mdx +73 -73
- package/.next/standalone/docs/es/configuration.mdx +25 -25
- package/.next/standalone/docs/es/custom-policies.mdx +49 -53
- package/.next/standalone/docs/fr/architecture.mdx +55 -55
- package/.next/standalone/docs/fr/configuration.mdx +26 -26
- package/.next/standalone/docs/fr/custom-policies.mdx +42 -46
- package/.next/standalone/docs/he/architecture.mdx +67 -67
- package/.next/standalone/docs/he/configuration.mdx +53 -52
- package/.next/standalone/docs/he/custom-policies.mdx +73 -77
- package/.next/standalone/docs/hi/architecture.mdx +107 -107
- package/.next/standalone/docs/hi/configuration.mdx +39 -39
- package/.next/standalone/docs/hi/custom-policies.mdx +77 -81
- package/.next/standalone/docs/i18n/README.ar.md +66 -66
- package/.next/standalone/docs/i18n/README.de.md +40 -40
- package/.next/standalone/docs/i18n/README.es.md +40 -40
- package/.next/standalone/docs/i18n/README.fr.md +44 -44
- package/.next/standalone/docs/i18n/README.he.md +67 -67
- package/.next/standalone/docs/i18n/README.hi.md +71 -71
- package/.next/standalone/docs/i18n/README.it.md +63 -63
- package/.next/standalone/docs/i18n/README.ja.md +55 -55
- package/.next/standalone/docs/i18n/README.ko.md +59 -59
- package/.next/standalone/docs/i18n/README.pt-br.md +45 -45
- package/.next/standalone/docs/i18n/README.ru.md +71 -71
- package/.next/standalone/docs/i18n/README.tr.md +76 -76
- package/.next/standalone/docs/i18n/README.vi.md +71 -71
- package/.next/standalone/docs/i18n/README.zh.md +53 -53
- package/.next/standalone/docs/it/architecture.mdx +55 -54
- package/.next/standalone/docs/it/configuration.mdx +45 -46
- package/.next/standalone/docs/it/custom-policies.mdx +77 -82
- package/.next/standalone/docs/ja/architecture.mdx +93 -93
- package/.next/standalone/docs/ja/configuration.mdx +48 -48
- package/.next/standalone/docs/ja/custom-policies.mdx +63 -67
- package/.next/standalone/docs/ko/architecture.mdx +66 -66
- package/.next/standalone/docs/ko/configuration.mdx +36 -36
- package/.next/standalone/docs/ko/custom-policies.mdx +73 -77
- package/.next/standalone/docs/pt-br/architecture.mdx +55 -55
- package/.next/standalone/docs/pt-br/configuration.mdx +36 -36
- package/.next/standalone/docs/pt-br/custom-policies.mdx +62 -66
- package/.next/standalone/docs/ru/architecture.mdx +59 -60
- package/.next/standalone/docs/ru/configuration.mdx +52 -53
- package/.next/standalone/docs/ru/custom-policies.mdx +70 -74
- package/.next/standalone/docs/tr/architecture.mdx +124 -124
- package/.next/standalone/docs/tr/configuration.mdx +46 -47
- package/.next/standalone/docs/tr/custom-policies.mdx +75 -78
- package/.next/standalone/docs/vi/architecture.mdx +65 -64
- package/.next/standalone/docs/vi/configuration.mdx +42 -42
- package/.next/standalone/docs/vi/custom-policies.mdx +68 -72
- package/.next/standalone/docs/zh/architecture.mdx +67 -67
- package/.next/standalone/docs/zh/configuration.mdx +35 -35
- package/.next/standalone/docs/zh/custom-policies.mdx +54 -58
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/src/hooks/builtin-policies.ts +30 -0
- package/README.md +2 -2
- package/dist/cli.mjs +19 -2
- package/package.json +1 -1
- package/src/hooks/builtin-policies.ts +30 -0
- /package/.next/standalone/.next/static/{ICeMHZ-8ZR7HY5GLm7oSJ → 8mygPGI5bzrtWK36ZYO59}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{ICeMHZ-8ZR7HY5GLm7oSJ → 8mygPGI5bzrtWK36ZYO59}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{ICeMHZ-8ZR7HY5GLm7oSJ → 8mygPGI5bzrtWK36ZYO59}/_ssgManifest.js +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Пользовательские политики
|
|
3
|
-
description: "Напишите свои собственные политики на JavaScript
|
|
3
|
+
description: "Напишите свои собственные политики на JavaScript — обеспечьте соблюдение соглашений, предотвратите отклонения, обнаружьте сбои, интегрируйте с внешними системами"
|
|
4
4
|
icon: code
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Пользовательские политики позволяют написать правила для любого поведения агента:
|
|
7
|
+
Пользовательские политики позволяют вам написать правила для любого поведения агента: обеспечить соблюдение проектных соглашений, предотвратить отклонения, заблокировать деструктивные операции, обнаружить зависшие агенты или интегрироваться с Slack, рабочими процессами утверждения и т. д. Они используют ту же систему событий hook и решения `allow`, `deny`, `instruct`, что и встроенные политики.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -39,50 +39,50 @@ failproofai policies --install --custom ./my-policies.js
|
|
|
39
39
|
|
|
40
40
|
## Два способа загрузки пользовательских политик
|
|
41
41
|
|
|
42
|
-
### Вариант 1: На основе соглашений (
|
|
42
|
+
### Вариант 1: На основе соглашений (рекомендуется)
|
|
43
43
|
|
|
44
|
-
Поместите файлы `*policies.{js,mjs,ts}` в `.failproofai/policies/` и они будут загружены
|
|
44
|
+
Поместите файлы `*policies.{js,mjs,ts}` в `.failproofai/policies/` и они будут автоматически загружены — не требуется никаких флагов или изменений конфигурации. Это работает как git hooks: поместите файл, и он просто работает.
|
|
45
45
|
|
|
46
46
|
```
|
|
47
|
-
#
|
|
47
|
+
# Уровень проекта — коммитится в git, общий для всей команды
|
|
48
48
|
.failproofai/policies/security-policies.mjs
|
|
49
49
|
.failproofai/policies/workflow-policies.mjs
|
|
50
50
|
|
|
51
|
-
#
|
|
51
|
+
# Уровень пользователя — личный, применяется ко всем проектам
|
|
52
52
|
~/.failproofai/policies/my-policies.mjs
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
**Как это работает:**
|
|
56
|
-
-
|
|
57
|
-
- Файлы загружаются в алфавитном порядке в каждом
|
|
58
|
-
- Загружаются только файлы, соответствующие `*policies.{js,mjs,ts}`;
|
|
56
|
+
- Оба директория проекта и пользователя сканируются (объединение — не первый находит победителя)
|
|
57
|
+
- Файлы загружаются в алфавитном порядке в каждом директории. Используйте префикс `01-`, `02-` для управления порядком
|
|
58
|
+
- Загружаются только файлы, соответствующие `*policies.{js,mjs,ts}`; другие файлы игнорируются
|
|
59
59
|
- Каждый файл загружается независимо (fail-open для каждого файла)
|
|
60
|
-
- Работает
|
|
60
|
+
- Работает наряду с явным `--custom` и встроенными политиками
|
|
61
61
|
|
|
62
62
|
<Tip>
|
|
63
|
-
Политики
|
|
63
|
+
Политики соглашений — самый простой способ поделиться политиками с командой. Коммитьте `.failproofai/policies/` в git, и каждый член команды получит их автоматически.
|
|
64
64
|
</Tip>
|
|
65
65
|
|
|
66
|
-
### Вариант 2: Явный путь
|
|
66
|
+
### Вариант 2: Явный путь файла
|
|
67
67
|
|
|
68
68
|
```bash
|
|
69
69
|
# Установите с файлом пользовательских политик
|
|
70
70
|
failproofai policies --install --custom ./my-policies.js
|
|
71
71
|
|
|
72
|
-
# Замените путь
|
|
72
|
+
# Замените путь файла политик
|
|
73
73
|
failproofai policies --install --custom ./new-policies.js
|
|
74
74
|
|
|
75
|
-
# Удалите путь
|
|
75
|
+
# Удалите путь пользовательских политик из конфигурации
|
|
76
76
|
failproofai policies --uninstall --custom
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
Разрешённый абсолютный путь сохраняется в `policies-config.json` как `customPoliciesPath`. Файл загружается заново при каждом событии
|
|
79
|
+
Разрешённый абсолютный путь сохраняется в `policies-config.json` как `customPoliciesPath`. Файл загружается заново при каждом событии hook — кеширования между событиями нет.
|
|
80
80
|
|
|
81
|
-
### Использование обоих
|
|
81
|
+
### Использование обоих вместе
|
|
82
82
|
|
|
83
|
-
Политики
|
|
83
|
+
Политики соглашений и явный файл `--custom` могут сосуществовать. Порядок загрузки:
|
|
84
84
|
|
|
85
|
-
1.
|
|
85
|
+
1. Файл явной `customPoliciesPath` (если настроена)
|
|
86
86
|
2. Файлы соглашений проекта (`{cwd}/.failproofai/policies/`, в алфавитном порядке)
|
|
87
87
|
3. Файлы соглашений пользователя (`~/.failproofai/policies/`, в алфавитном порядке)
|
|
88
88
|
|
|
@@ -98,49 +98,45 @@ import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
|
98
98
|
|
|
99
99
|
### `customPolicies.add(hook)`
|
|
100
100
|
|
|
101
|
-
Регистрирует политику.
|
|
101
|
+
Регистрирует политику. Вызовите это столько раз, сколько требуется, для нескольких политик в одном файле.
|
|
102
102
|
|
|
103
103
|
```ts
|
|
104
104
|
customPolicies.add({
|
|
105
105
|
name: string; // обязательно - уникальный идентификатор
|
|
106
|
-
description?: string; //
|
|
107
|
-
match?: { events?: HookEventType[] }; // фильтр по типу события;
|
|
106
|
+
description?: string; // показывается в выводе `failproofai policies`
|
|
107
|
+
match?: { events?: HookEventType[] }; // фильтр по типу события; опустите для совпадения со всеми
|
|
108
108
|
fn: (ctx: PolicyContext) => PolicyResult | Promise<PolicyResult>;
|
|
109
109
|
});
|
|
110
110
|
```
|
|
111
111
|
|
|
112
|
-
###
|
|
112
|
+
### Вспомогательные функции решений
|
|
113
113
|
|
|
114
|
-
| Функция | Эффект |
|
|
115
|
-
|
|
114
|
+
| Функция | Эффект | Используйте, когда |
|
|
115
|
+
|---------|--------|----------|
|
|
116
116
|
| `allow()` | Разрешить операцию молча | Действие безопасно, сообщение не требуется |
|
|
117
117
|
| `deny(message)` | Заблокировать операцию | Агент не должен выполнять это действие |
|
|
118
|
-
| `instruct(message)` | Добавить контекст без
|
|
118
|
+
| `instruct(message)` | Добавить контекст без блокирования | Дайте агенту дополнительный контекст для правильного выполнения |
|
|
119
119
|
|
|
120
|
-
`deny(message)` — сообщение
|
|
120
|
+
`deny(message)` — сообщение появляется Claude с префиксом `"Blocked by failproofai:"`. Одно `deny` прерывает всю дальнейшую оценку.
|
|
121
121
|
|
|
122
|
-
`instruct(message)` — сообщение добавляется
|
|
122
|
+
`instruct(message)` — сообщение добавляется к контексту Claude для текущего вызова инструмента. Все сообщения `instruct` накапливаются и доставляются вместе.
|
|
123
123
|
|
|
124
124
|
<Tip>
|
|
125
|
-
Вы можете добавить
|
|
125
|
+
Вы можете добавить дополнительное руководство к любому сообщению `deny` или `instruct`, добавив поле `hint` в `policyParams` — без изменения кода. Это работает для пользовательских (`custom/`), проектных соглашений (`.failproofai-project/`) и пользовательских соглашений (`.failproofai-user/`) политик. Подробнее см. [Configuration → hint](/ru/configuration#hint-cross-cutting).
|
|
126
126
|
</Tip>
|
|
127
127
|
|
|
128
|
-
### Информационные сообщения allow
|
|
128
|
+
### Информационные сообщения allow
|
|
129
129
|
|
|
130
|
-
|
|
131
|
-
`allow(message)` — это функция бета, доступная с v0.0.2-beta.3. API может измениться в будущих версиях. Более ранние версии поддерживают только `allow()` без аргументов.
|
|
132
|
-
</Note>
|
|
133
|
-
|
|
134
|
-
`allow(message)` разрешает операцию **и** отправляет информационное сообщение обратно Claude. Сообщение доставляется как `additionalContext` в ответе stdout обработчика перехватчика — тот же механизм, используемый `instruct`, но семантически отличается: это обновление статуса, а не предупреждение.
|
|
130
|
+
`allow(message)` разрешает операцию **и** отправляет информационное сообщение обратно Claude. Сообщение доставляется как `additionalContext` в ответ stdout обработчика hook — того же механизма, используемого `instruct`, но семантически отличного: это обновление статуса, а не предупреждение.
|
|
135
131
|
|
|
136
|
-
| Функция | Эффект |
|
|
137
|
-
|
|
138
|
-
| `allow(message)` | Разрешить и отправить контекст Claude |
|
|
132
|
+
| Функция | Эффект | Используйте, когда |
|
|
133
|
+
|---------|--------|----------|
|
|
134
|
+
| `allow(message)` | Разрешить и отправить контекст Claude | Подтвердить прохождение проверки или объяснить, почему проверка была пропущена |
|
|
139
135
|
|
|
140
136
|
Варианты использования:
|
|
141
|
-
- **Подтверждения статуса:** `allow("All CI checks passed.")` —
|
|
142
|
-
- **Объяснения fail-open:** `allow("GitHub CLI not installed, skipping CI check.")` —
|
|
143
|
-
- **Несколько сообщений накапливаются:** если несколько политик возвращают `allow(message)`, все сообщения объединяются с
|
|
137
|
+
- **Подтверждения статуса:** `allow("All CI checks passed.")` — говорит Claude, что всё хорошо
|
|
138
|
+
- **Объяснения fail-open:** `allow("GitHub CLI not installed, skipping CI check.")` — говорит Claude, почему проверка была пропущена, чтобы у неё был полный контекст
|
|
139
|
+
- **Несколько сообщений накапливаются:** если несколько политик возвращают `allow(message)`, все сообщения объединяются с переводами строк и доставляются вместе
|
|
144
140
|
|
|
145
141
|
```js
|
|
146
142
|
customPolicies.add({
|
|
@@ -162,35 +158,35 @@ customPolicies.add({
|
|
|
162
158
|
### Поля `PolicyContext`
|
|
163
159
|
|
|
164
160
|
| Поле | Тип | Описание |
|
|
165
|
-
|
|
161
|
+
|------|------|-------------|
|
|
166
162
|
| `eventType` | `string` | `"PreToolUse"`, `"PostToolUse"`, `"Notification"`, `"Stop"` |
|
|
167
|
-
| `toolName` | `string \| undefined` | Вызываемый инструмент (
|
|
163
|
+
| `toolName` | `string \| undefined` | Вызываемый инструмент (например, `"Bash"`, `"Write"`, `"Read"`) |
|
|
168
164
|
| `toolInput` | `Record<string, unknown> \| undefined` | Входные параметры инструмента |
|
|
169
|
-
| `payload` | `Record<string, unknown>` |
|
|
165
|
+
| `payload` | `Record<string, unknown>` | Полное необработанное событие от Claude Code |
|
|
170
166
|
| `session` | `SessionMetadata \| undefined` | Контекст сессии (см. ниже) |
|
|
171
167
|
|
|
172
168
|
### Поля `SessionMetadata`
|
|
173
169
|
|
|
174
170
|
| Поле | Тип | Описание |
|
|
175
|
-
|
|
171
|
+
|------|------|-------------|
|
|
176
172
|
| `sessionId` | `string` | Идентификатор сессии Claude Code |
|
|
177
|
-
| `cwd` | `string` | Рабочий
|
|
173
|
+
| `cwd` | `string` | Рабочий директорий сессии Claude Code |
|
|
178
174
|
| `transcriptPath` | `string` | Путь к файлу транскрипта JSONL сессии |
|
|
179
175
|
|
|
180
176
|
### Типы событий
|
|
181
177
|
|
|
182
178
|
| Событие | Когда срабатывает | Содержимое `toolInput` |
|
|
183
|
-
|
|
184
|
-
| `PreToolUse` |
|
|
185
|
-
| `PostToolUse` | После завершения инструмента |
|
|
186
|
-
| `Notification` | Когда Claude отправляет уведомление | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }` -
|
|
187
|
-
| `Stop` | Когда сессия Claude
|
|
179
|
+
|--------|--------------|----------------------|
|
|
180
|
+
| `PreToolUse` | Перед запуском инструмента Claude | Входные данные инструмента (например, `{ command: "..." }` для Bash) |
|
|
181
|
+
| `PostToolUse` | После завершения инструмента | Входные данные инструмента + `tool_result` (результат) |
|
|
182
|
+
| `Notification` | Когда Claude отправляет уведомление | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }` - hooks должны всегда возвращать `allow()`, они не могут блокировать уведомления |
|
|
183
|
+
| `Stop` | Когда сессия Claude завершается | Пусто |
|
|
188
184
|
|
|
189
185
|
---
|
|
190
186
|
|
|
191
187
|
## Порядок оценки
|
|
192
188
|
|
|
193
|
-
Политики оцениваются в
|
|
189
|
+
Политики оцениваются в таком порядке:
|
|
194
190
|
|
|
195
191
|
1. Встроенные политики (в порядке определения)
|
|
196
192
|
2. Явные пользовательские политики из `customPoliciesPath` (в порядке `.add()`)
|
|
@@ -198,7 +194,7 @@ customPolicies.add({
|
|
|
198
194
|
4. Политики соглашений из пользователя `~/.failproofai/policies/` (файлы в алфавитном порядке, `.add()` внутри)
|
|
199
195
|
|
|
200
196
|
<Note>
|
|
201
|
-
|
|
197
|
+
Первое `deny` прерывает все последующие политики. Все сообщения `instruct` накапливаются и доставляются вместе.
|
|
202
198
|
</Note>
|
|
203
199
|
|
|
204
200
|
---
|
|
@@ -222,11 +218,11 @@ customPolicies.add({
|
|
|
222
218
|
});
|
|
223
219
|
```
|
|
224
220
|
|
|
225
|
-
Все относительные импорты, достижимые из
|
|
221
|
+
Все относительные импорты, достижимые из файла входа, разрешаются. Это реализовано переписыванием импортов `from "failproofai"` на фактический путь dist и созданием временных файлов `.mjs` для обеспечения совместимости ESM.
|
|
226
222
|
|
|
227
223
|
---
|
|
228
224
|
|
|
229
|
-
## Фильтрация
|
|
225
|
+
## Фильтрация типов событий
|
|
230
226
|
|
|
231
227
|
Используйте `match.events` для ограничения срабатывания политики:
|
|
232
228
|
|
|
@@ -248,20 +244,20 @@ customPolicies.add({
|
|
|
248
244
|
|
|
249
245
|
## Обработка ошибок и режимы отказа
|
|
250
246
|
|
|
251
|
-
Пользовательские политики —
|
|
247
|
+
Пользовательские политики — **fail-open**: ошибки никогда не блокируют встроенные политики и не вызывают крах обработчика hook.
|
|
252
248
|
|
|
253
249
|
| Отказ | Поведение |
|
|
254
|
-
|
|
255
|
-
| `customPoliciesPath` не
|
|
256
|
-
| Файл не найден | Предупреждение
|
|
257
|
-
|
|
|
258
|
-
|
|
|
259
|
-
| `fn` выбрасывает
|
|
260
|
-
| `fn`
|
|
261
|
-
|
|
|
250
|
+
|---------|----------|
|
|
251
|
+
| `customPoliciesPath` не установлена | Явные пользовательские политики не запускаются; встроенные и политики соглашений работают нормально |
|
|
252
|
+
| Файл не найден | Предупреждение логируется в `~/.failproofai/hook.log`; встроенные работают |
|
|
253
|
+
| Ошибка синтаксиса/импорта (явная) | Ошибка логируется в `~/.failproofai/hook.log`; явные пользовательские политики пропущены |
|
|
254
|
+
| Ошибка синтаксиса/импорта (соглашение) | Ошибка логируется; этот файл пропущен, другие файлы соглашений всё ещё загружаются |
|
|
255
|
+
| `fn` выбрасывает во время выполнения | Ошибка логируется; этот hook рассматривается как `allow`; другие hooks продолжают работать |
|
|
256
|
+
| `fn` работает дольше 10 сек | Timeout логируется; рассматривается как `allow` |
|
|
257
|
+
| Директорий соглашений отсутствует | Политики соглашений не запускаются; нет ошибки |
|
|
262
258
|
|
|
263
259
|
<Tip>
|
|
264
|
-
Для отладки ошибок
|
|
260
|
+
Для отладки ошибок пользовательской политики смотрите файл журнала:
|
|
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
|
+
// Предотвратите запись агента в директорий 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
|
+
// Удерживайте агента на правильном пути: проверьте тесты перед коммитом
|
|
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
|
+
// Предотвратите неплановые изменения зависимостей во время заморозки
|
|
308
304
|
customPolicies.add({
|
|
309
305
|
name: "dependency-freeze",
|
|
310
306
|
description: "Prevent unplanned dependency changes during freeze period",
|
|
@@ -327,16 +323,16 @@ export { customPolicies };
|
|
|
327
323
|
|
|
328
324
|
## Примеры
|
|
329
325
|
|
|
330
|
-
|
|
326
|
+
Директорий `examples/` содержит готовые файлы политик:
|
|
331
327
|
|
|
332
328
|
| Файл | Содержимое |
|
|
333
|
-
|
|
334
|
-
| `examples/policies-basic.js` | Пять начальных политик, охватывающих
|
|
335
|
-
| `examples/policies-advanced/index.js` | Продвинутые паттерны: транзитивные импорты, асинхронные вызовы, очистка
|
|
336
|
-
| `examples/convention-policies/security-policies.mjs` | Политики безопасности на основе соглашений (блокировка
|
|
329
|
+
|------|----------|
|
|
330
|
+
| `examples/policies-basic.js` | Пять начальных политик, охватывающих частые режимы отказа агента |
|
|
331
|
+
| `examples/policies-advanced/index.js` | Продвинутые паттерны: транзитивные импорты, асинхронные вызовы, очистка вывода и hooks завершения сессии |
|
|
332
|
+
| `examples/convention-policies/security-policies.mjs` | Политики безопасности на основе соглашений (блокировка записи .env, предотвращение переписывания истории git) |
|
|
337
333
|
| `examples/convention-policies/workflow-policies.mjs` | Политики рабочего процесса на основе соглашений (напоминания о тестах, аудит записей файлов) |
|
|
338
334
|
|
|
339
|
-
### Использование примеров
|
|
335
|
+
### Использование примеров явного файла
|
|
340
336
|
|
|
341
337
|
```bash
|
|
342
338
|
failproofai policies --install --custom ./examples/policies-basic.js
|
|
@@ -354,4 +350,4 @@ mkdir -p ~/.failproofai/policies
|
|
|
354
350
|
cp examples/convention-policies/*.mjs ~/.failproofai/policies/
|
|
355
351
|
```
|
|
356
352
|
|
|
357
|
-
Команда
|
|
353
|
+
Команда install не требуется — файлы будут подхвачены автоматически при следующем событии hook.
|