failproofai 0.0.5 → 0.0.6-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.failproofai/policies/review-policies.mjs +112 -0
- package/.next/standalone/.failproofai/policies/workflow-policies.mjs +2 -1
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g72weg._.js +1 -1
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0a~g15g._.js → [root-of-the-server]__0rh.18_._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +6 -6
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0qn95h3._.js → [root-of-the-server]__0~kmh8w._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +5 -5
- package/.next/standalone/.next/server/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +9 -9
- package/.next/standalone/.next/static/chunks/{0sme4lkv.tgn-.js → 01b~z8f1ws0rk.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0lgbwkfqmnsmc.js → 03rz6ykw-a2xi.js} +1 -1
- package/.next/standalone/.next/static/chunks/{17manv47o-~wp.js → 08t08igdql9yt.js} +1 -1
- package/.next/standalone/.next/static/chunks/09_k80d~cq2wg.js +4 -0
- package/.next/standalone/.next/static/chunks/{0ksdlt_1hucdm.js → 0bvhsa6zva2o..js} +1 -1
- package/.next/standalone/.next/static/chunks/{09ikntpt2-o9b.js → 0gbf4cphy8ksq.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0yumumfzx_f27.js → 0v.yd0kg_ld3r.js} +1 -1
- package/.next/standalone/.next/static/chunks/{13juklu.vksks.js → 0wlyoif4_kj_t.js} +1 -1
- package/.next/standalone/.next/static/chunks/{09e7drilkf1sn.js → 12simlrcfk3g2.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0em7tspi4kylh.js → 12~yi9oj8av8p.js} +2 -2
- package/.next/standalone/.next/static/chunks/{turbopack-0r26pc8h0y_-e.js → turbopack-0o7k.hakttp4k.js} +1 -1
- package/.next/standalone/CHANGELOG.md +13 -0
- package/.next/standalone/README.md +2 -2
- package/.next/standalone/bun.lock +43 -85
- package/.next/standalone/dist/cli.mjs +107 -3
- package/.next/standalone/docs/ar/architecture.mdx +65 -64
- package/.next/standalone/docs/ar/configuration.mdx +42 -42
- package/.next/standalone/docs/ar/custom-policies.mdx +62 -64
- package/.next/standalone/docs/built-in-policies.mdx +37 -0
- package/.next/standalone/docs/custom-policies.mdx +1 -1
- package/.next/standalone/docs/de/architecture.mdx +92 -92
- package/.next/standalone/docs/de/configuration.mdx +34 -34
- package/.next/standalone/docs/de/custom-policies.mdx +49 -50
- package/.next/standalone/docs/es/architecture.mdx +72 -72
- package/.next/standalone/docs/es/configuration.mdx +25 -25
- package/.next/standalone/docs/es/custom-policies.mdx +48 -49
- package/.next/standalone/docs/examples.mdx +54 -0
- package/.next/standalone/docs/fr/architecture.mdx +53 -53
- package/.next/standalone/docs/fr/configuration.mdx +25 -25
- package/.next/standalone/docs/fr/custom-policies.mdx +42 -43
- package/.next/standalone/docs/getting-started.mdx +52 -0
- package/.next/standalone/docs/he/architecture.mdx +66 -66
- package/.next/standalone/docs/he/configuration.mdx +53 -52
- package/.next/standalone/docs/he/custom-policies.mdx +72 -73
- package/.next/standalone/docs/hi/architecture.mdx +106 -106
- package/.next/standalone/docs/hi/configuration.mdx +39 -39
- package/.next/standalone/docs/hi/custom-policies.mdx +75 -76
- package/.next/standalone/docs/i18n/README.ar.md +66 -66
- package/.next/standalone/docs/i18n/README.de.md +38 -38
- package/.next/standalone/docs/i18n/README.es.md +38 -38
- package/.next/standalone/docs/i18n/README.fr.md +42 -42
- package/.next/standalone/docs/i18n/README.he.md +67 -67
- package/.next/standalone/docs/i18n/README.hi.md +70 -70
- package/.next/standalone/docs/i18n/README.it.md +62 -62
- package/.next/standalone/docs/i18n/README.ja.md +54 -54
- package/.next/standalone/docs/i18n/README.ko.md +58 -58
- package/.next/standalone/docs/i18n/README.pt-br.md +43 -43
- package/.next/standalone/docs/i18n/README.ru.md +69 -69
- package/.next/standalone/docs/i18n/README.tr.md +76 -76
- package/.next/standalone/docs/i18n/README.vi.md +70 -70
- package/.next/standalone/docs/i18n/README.zh.md +52 -52
- package/.next/standalone/docs/it/architecture.mdx +54 -53
- package/.next/standalone/docs/it/configuration.mdx +44 -45
- package/.next/standalone/docs/it/custom-policies.mdx +76 -78
- package/.next/standalone/docs/ja/architecture.mdx +93 -93
- package/.next/standalone/docs/ja/configuration.mdx +47 -47
- package/.next/standalone/docs/ja/custom-policies.mdx +62 -63
- package/.next/standalone/docs/ko/architecture.mdx +66 -66
- package/.next/standalone/docs/ko/configuration.mdx +35 -35
- package/.next/standalone/docs/ko/custom-policies.mdx +71 -72
- package/.next/standalone/docs/pt-br/architecture.mdx +55 -55
- package/.next/standalone/docs/pt-br/configuration.mdx +35 -35
- package/.next/standalone/docs/pt-br/custom-policies.mdx +60 -61
- package/.next/standalone/docs/ru/architecture.mdx +59 -60
- package/.next/standalone/docs/ru/configuration.mdx +52 -53
- package/.next/standalone/docs/ru/custom-policies.mdx +68 -69
- package/.next/standalone/docs/tr/architecture.mdx +124 -124
- package/.next/standalone/docs/tr/configuration.mdx +45 -46
- package/.next/standalone/docs/tr/custom-policies.mdx +75 -75
- package/.next/standalone/docs/vi/architecture.mdx +65 -64
- package/.next/standalone/docs/vi/configuration.mdx +41 -41
- package/.next/standalone/docs/vi/custom-policies.mdx +68 -69
- package/.next/standalone/docs/zh/architecture.mdx +67 -67
- package/.next/standalone/docs/zh/configuration.mdx +34 -34
- package/.next/standalone/docs/zh/custom-policies.mdx +53 -54
- package/.next/standalone/node_modules/@next/env/package.json +1 -1
- package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +7 -7
- package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
- package/.next/standalone/node_modules/next/dist/server/config-schema.js +10 -2
- package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/render.js +27 -20
- package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
- package/.next/standalone/node_modules/next/package.json +15 -15
- package/.next/standalone/package.json +2 -2
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/src/hooks/builtin-policies.ts +131 -0
- package/README.md +2 -2
- package/dist/cli.mjs +107 -3
- package/package.json +2 -2
- package/src/hooks/builtin-policies.ts +131 -0
- package/.next/standalone/.next/static/chunks/0_yayar~bpphd.js +0 -4
- /package/.next/standalone/.next/static/{hYQM6iCWnF1W5XDpsIRhV → CkmOT-ZvDN-sVULinGVKT}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{hYQM6iCWnF1W5XDpsIRhV → CkmOT-ZvDN-sVULinGVKT}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{hYQM6iCWnF1W5XDpsIRhV → CkmOT-ZvDN-sVULinGVKT}/_ssgManifest.js +0 -0
|
@@ -1,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
|
|
|
@@ -41,48 +41,48 @@ failproofai policies --install --custom ./my-policies.js
|
|
|
41
41
|
|
|
42
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,46 +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
128
|
### Информационные сообщения allow
|
|
129
129
|
|
|
130
|
+
`allow(message)` разрешает операцию **и** отправляет информационное сообщение обратно Claude. Сообщение доставляется как `additionalContext` в ответ stdout обработчика hook — того же механизма, используемого `instruct`, но семантически отличного: это обновление статуса, а не предупреждение.
|
|
130
131
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
|
134
|
-
|---------|--------|------------------|
|
|
135
|
-
| `allow(message)` | Разрешить и отправить контекст Claude | Подтвердить, что проверка прошла, или объяснить, почему проверка была пропущена |
|
|
132
|
+
| Функция | Эффект | Используйте, когда |
|
|
133
|
+
|---------|--------|----------|
|
|
134
|
+
| `allow(message)` | Разрешить и отправить контекст Claude | Подтвердить прохождение проверки или объяснить, почему проверка была пропущена |
|
|
136
135
|
|
|
137
136
|
Варианты использования:
|
|
138
|
-
- **Подтверждения статуса:** `allow("All CI checks passed.")` —
|
|
139
|
-
- **Объяснения fail-open:** `allow("GitHub CLI not installed, skipping CI check.")` —
|
|
140
|
-
- **Несколько сообщений накапливаются:** если несколько политик возвращают `allow(message)`, все сообщения объединяются с
|
|
137
|
+
- **Подтверждения статуса:** `allow("All CI checks passed.")` — говорит Claude, что всё хорошо
|
|
138
|
+
- **Объяснения fail-open:** `allow("GitHub CLI not installed, skipping CI check.")` — говорит Claude, почему проверка была пропущена, чтобы у неё был полный контекст
|
|
139
|
+
- **Несколько сообщений накапливаются:** если несколько политик возвращают `allow(message)`, все сообщения объединяются с переводами строк и доставляются вместе
|
|
141
140
|
|
|
142
141
|
```js
|
|
143
142
|
customPolicies.add({
|
|
@@ -159,35 +158,35 @@ customPolicies.add({
|
|
|
159
158
|
### Поля `PolicyContext`
|
|
160
159
|
|
|
161
160
|
| Поле | Тип | Описание |
|
|
162
|
-
|
|
161
|
+
|------|------|-------------|
|
|
163
162
|
| `eventType` | `string` | `"PreToolUse"`, `"PostToolUse"`, `"Notification"`, `"Stop"` |
|
|
164
|
-
| `toolName` | `string \| undefined` | Вызываемый инструмент (
|
|
163
|
+
| `toolName` | `string \| undefined` | Вызываемый инструмент (например, `"Bash"`, `"Write"`, `"Read"`) |
|
|
165
164
|
| `toolInput` | `Record<string, unknown> \| undefined` | Входные параметры инструмента |
|
|
166
|
-
| `payload` | `Record<string, unknown>` |
|
|
165
|
+
| `payload` | `Record<string, unknown>` | Полное необработанное событие от Claude Code |
|
|
167
166
|
| `session` | `SessionMetadata \| undefined` | Контекст сессии (см. ниже) |
|
|
168
167
|
|
|
169
168
|
### Поля `SessionMetadata`
|
|
170
169
|
|
|
171
170
|
| Поле | Тип | Описание |
|
|
172
|
-
|
|
171
|
+
|------|------|-------------|
|
|
173
172
|
| `sessionId` | `string` | Идентификатор сессии Claude Code |
|
|
174
|
-
| `cwd` | `string` | Рабочий
|
|
173
|
+
| `cwd` | `string` | Рабочий директорий сессии Claude Code |
|
|
175
174
|
| `transcriptPath` | `string` | Путь к файлу транскрипта JSONL сессии |
|
|
176
175
|
|
|
177
176
|
### Типы событий
|
|
178
177
|
|
|
179
178
|
| Событие | Когда срабатывает | Содержимое `toolInput` |
|
|
180
|
-
|
|
181
|
-
| `PreToolUse` |
|
|
182
|
-
| `PostToolUse` | После завершения инструмента |
|
|
183
|
-
| `Notification` | Когда Claude отправляет уведомление | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }` -
|
|
184
|
-
| `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 завершается | Пусто |
|
|
185
184
|
|
|
186
185
|
---
|
|
187
186
|
|
|
188
187
|
## Порядок оценки
|
|
189
188
|
|
|
190
|
-
Политики оцениваются в
|
|
189
|
+
Политики оцениваются в таком порядке:
|
|
191
190
|
|
|
192
191
|
1. Встроенные политики (в порядке определения)
|
|
193
192
|
2. Явные пользовательские политики из `customPoliciesPath` (в порядке `.add()`)
|
|
@@ -195,7 +194,7 @@ customPolicies.add({
|
|
|
195
194
|
4. Политики соглашений из пользователя `~/.failproofai/policies/` (файлы в алфавитном порядке, `.add()` внутри)
|
|
196
195
|
|
|
197
196
|
<Note>
|
|
198
|
-
|
|
197
|
+
Первое `deny` прерывает все последующие политики. Все сообщения `instruct` накапливаются и доставляются вместе.
|
|
199
198
|
</Note>
|
|
200
199
|
|
|
201
200
|
---
|
|
@@ -219,11 +218,11 @@ customPolicies.add({
|
|
|
219
218
|
});
|
|
220
219
|
```
|
|
221
220
|
|
|
222
|
-
Все относительные импорты, достижимые из
|
|
221
|
+
Все относительные импорты, достижимые из файла входа, разрешаются. Это реализовано переписыванием импортов `from "failproofai"` на фактический путь dist и созданием временных файлов `.mjs` для обеспечения совместимости ESM.
|
|
223
222
|
|
|
224
223
|
---
|
|
225
224
|
|
|
226
|
-
## Фильтрация
|
|
225
|
+
## Фильтрация типов событий
|
|
227
226
|
|
|
228
227
|
Используйте `match.events` для ограничения срабатывания политики:
|
|
229
228
|
|
|
@@ -245,20 +244,20 @@ customPolicies.add({
|
|
|
245
244
|
|
|
246
245
|
## Обработка ошибок и режимы отказа
|
|
247
246
|
|
|
248
|
-
Пользовательские политики —
|
|
247
|
+
Пользовательские политики — **fail-open**: ошибки никогда не блокируют встроенные политики и не вызывают крах обработчика hook.
|
|
249
248
|
|
|
250
249
|
| Отказ | Поведение |
|
|
251
|
-
|
|
252
|
-
| `customPoliciesPath` не
|
|
253
|
-
| Файл не найден | Предупреждение
|
|
254
|
-
|
|
|
255
|
-
|
|
|
256
|
-
| `fn` выбрасывает
|
|
257
|
-
| `fn`
|
|
258
|
-
|
|
|
250
|
+
|---------|----------|
|
|
251
|
+
| `customPoliciesPath` не установлена | Явные пользовательские политики не запускаются; встроенные и политики соглашений работают нормально |
|
|
252
|
+
| Файл не найден | Предупреждение логируется в `~/.failproofai/hook.log`; встроенные работают |
|
|
253
|
+
| Ошибка синтаксиса/импорта (явная) | Ошибка логируется в `~/.failproofai/hook.log`; явные пользовательские политики пропущены |
|
|
254
|
+
| Ошибка синтаксиса/импорта (соглашение) | Ошибка логируется; этот файл пропущен, другие файлы соглашений всё ещё загружаются |
|
|
255
|
+
| `fn` выбрасывает во время выполнения | Ошибка логируется; этот hook рассматривается как `allow`; другие hooks продолжают работать |
|
|
256
|
+
| `fn` работает дольше 10 сек | Timeout логируется; рассматривается как `allow` |
|
|
257
|
+
| Директорий соглашений отсутствует | Политики соглашений не запускаются; нет ошибки |
|
|
259
258
|
|
|
260
259
|
<Tip>
|
|
261
|
-
Для отладки ошибок
|
|
260
|
+
Для отладки ошибок пользовательской политики смотрите файл журнала:
|
|
262
261
|
|
|
263
262
|
```bash
|
|
264
263
|
tail -f ~/.failproofai/hook.log
|
|
@@ -273,7 +272,7 @@ tail -f ~/.failproofai/hook.log
|
|
|
273
272
|
// my-policies.js
|
|
274
273
|
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
275
274
|
|
|
276
|
-
//
|
|
275
|
+
// Предотвратите запись агента в директорий secrets/
|
|
277
276
|
customPolicies.add({
|
|
278
277
|
name: "block-secrets-dir",
|
|
279
278
|
description: "Prevent agent from writing to secrets/ directory",
|
|
@@ -286,7 +285,7 @@ customPolicies.add({
|
|
|
286
285
|
},
|
|
287
286
|
});
|
|
288
287
|
|
|
289
|
-
//
|
|
288
|
+
// Удерживайте агента на правильном пути: проверьте тесты перед коммитом
|
|
290
289
|
customPolicies.add({
|
|
291
290
|
name: "remind-test-before-commit",
|
|
292
291
|
description: "Keep the agent on track: verify tests pass before committing",
|
|
@@ -301,7 +300,7 @@ customPolicies.add({
|
|
|
301
300
|
},
|
|
302
301
|
});
|
|
303
302
|
|
|
304
|
-
//
|
|
303
|
+
// Предотвратите неплановые изменения зависимостей во время заморозки
|
|
305
304
|
customPolicies.add({
|
|
306
305
|
name: "dependency-freeze",
|
|
307
306
|
description: "Prevent unplanned dependency changes during freeze period",
|
|
@@ -324,16 +323,16 @@ export { customPolicies };
|
|
|
324
323
|
|
|
325
324
|
## Примеры
|
|
326
325
|
|
|
327
|
-
|
|
326
|
+
Директорий `examples/` содержит готовые файлы политик:
|
|
328
327
|
|
|
329
328
|
| Файл | Содержимое |
|
|
330
|
-
|
|
331
|
-
| `examples/policies-basic.js` | Пять начальных политик, охватывающих
|
|
332
|
-
| `examples/policies-advanced/index.js` | Продвинутые паттерны: транзитивные импорты, асинхронные вызовы, очистка
|
|
333
|
-
| `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) |
|
|
334
333
|
| `examples/convention-policies/workflow-policies.mjs` | Политики рабочего процесса на основе соглашений (напоминания о тестах, аудит записей файлов) |
|
|
335
334
|
|
|
336
|
-
### Использование примеров
|
|
335
|
+
### Использование примеров явного файла
|
|
337
336
|
|
|
338
337
|
```bash
|
|
339
338
|
failproofai policies --install --custom ./examples/policies-basic.js
|
|
@@ -351,4 +350,4 @@ mkdir -p ~/.failproofai/policies
|
|
|
351
350
|
cp examples/convention-policies/*.mjs ~/.failproofai/policies/
|
|
352
351
|
```
|
|
353
352
|
|
|
354
|
-
Команда
|
|
353
|
+
Команда install не требуется — файлы будут подхвачены автоматически при следующем событии hook.
|