failproofai 0.0.6-beta.1 → 0.0.6-beta.3
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]__092s1ta._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0~kmh8w._.js → [root-of-the-server]__096k.db._.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]__0kyh86x._.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/{0gbf4cphy8ksq.js → 0-dm_9a6nsc2l.js} +1 -1
- package/.next/standalone/.next/static/chunks/{12~yi9oj8av8p.js → 01pmw1-asbek~.js} +2 -2
- package/.next/standalone/.next/static/chunks/{0v.yd0kg_ld3r.js → 051m32nx~n5yr.js} +1 -1
- package/.next/standalone/.next/static/chunks/{09_k80d~cq2wg.js → 0a-yctdwn368y.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0bvhsa6zva2o..js → 0ksdlt_1hucdm.js} +1 -1
- package/.next/standalone/.next/static/chunks/{01b~z8f1ws0rk.js → 0l-mu4okl-cj1.js} +1 -1
- package/.next/standalone/.next/static/chunks/{08t08igdql9yt.js → 0mazj-p-~2kc6.js} +1 -1
- package/.next/standalone/.next/static/chunks/0qakntsrpc~1j.js +6 -0
- package/.next/standalone/.next/static/chunks/{03rz6ykw-a2xi.js → 156zca6aewyr-.js} +1 -1
- package/.next/standalone/CHANGELOG.md +18 -0
- package/.next/standalone/bin/failproofai.mjs +91 -4
- package/.next/standalone/dist/cli.mjs +1156 -55
- package/.next/standalone/docs/ar/built-in-policies.mdx +140 -103
- 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 +3 -3
- package/.next/standalone/docs/de/built-in-policies.mdx +97 -60
- 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 +91 -54
- 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 +99 -62
- 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 +139 -99
- 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 +203 -166
- 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 +115 -78
- 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 +155 -118
- 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 +103 -66
- 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 +72 -35
- 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 +135 -98
- 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 +126 -89
- 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 +116 -81
- 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 +117 -82
- 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/auth/login.ts +104 -0
- package/.next/standalone/src/auth/logout.ts +50 -0
- package/.next/standalone/src/auth/token-store.ts +64 -0
- package/.next/standalone/src/hooks/builtin-policies.ts +27 -21
- package/.next/standalone/src/hooks/handler.ts +35 -15
- package/.next/standalone/src/relay/daemon.ts +362 -0
- package/.next/standalone/src/relay/pid.ts +76 -0
- package/.next/standalone/src/relay/queue.ts +225 -0
- package/bin/failproofai.mjs +91 -4
- package/dist/cli.mjs +1156 -55
- package/package.json +1 -1
- package/src/auth/login.ts +104 -0
- package/src/auth/logout.ts +50 -0
- package/src/auth/token-store.ts +64 -0
- package/src/hooks/builtin-policies.ts +27 -21
- package/src/hooks/handler.ts +35 -15
- package/src/relay/daemon.ts +362 -0
- package/src/relay/pid.ts +76 -0
- package/src/relay/queue.ts +225 -0
- package/.next/standalone/.next/static/chunks/0wlyoif4_kj_t.js +0 -6
- /package/.next/standalone/.next/static/{CkmOT-ZvDN-sVULinGVKT → r-wX0MuAfCjbhJm3phQc8}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{CkmOT-ZvDN-sVULinGVKT → r-wX0MuAfCjbhJm3phQc8}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{CkmOT-ZvDN-sVULinGVKT → r-wX0MuAfCjbhJm3phQc8}/_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や承認ワークフローとの統合などが可能です。組み込みポリシーと同じフックイベントシステムおよび `allow`、`deny`、`instruct` の決定を使用します。
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -37,30 +37,30 @@ failproofai policies --install --custom ./my-policies.js
|
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
40
|
-
##
|
|
40
|
+
## カスタムポリシーの2つのロード方法
|
|
41
41
|
|
|
42
42
|
### オプション1: 規約ベース(推奨)
|
|
43
43
|
|
|
44
|
-
`*policies.{js,mjs,ts}`
|
|
44
|
+
`.failproofai/policies/` に `*policies.{js,mjs,ts}` ファイルを配置するだけで自動的にロードされます — フラグや設定変更は不要です。git フックと同じ仕組みです: ファイルを置くだけで動作します。
|
|
45
45
|
|
|
46
46
|
```
|
|
47
|
-
# プロジェクトレベル — git
|
|
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
|
-
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
- `*policies.{js,mjs,ts}`
|
|
59
|
-
-
|
|
60
|
-
- 明示的な `--custom`
|
|
55
|
+
**動作の仕組み:**
|
|
56
|
+
- プロジェクトとユーザーの両方のディレクトリがスキャンされます(最初のスコープ優先ではなく、両方の和集合)
|
|
57
|
+
- 各ディレクトリ内でファイルはアルファベット順にロードされます。順序を制御するには `01-`、`02-` などのプレフィックスを付けてください
|
|
58
|
+
- `*policies.{js,mjs,ts}` に一致するファイルのみロードされ、その他のファイルは無視されます
|
|
59
|
+
- 各ファイルは独立してロードされます(ファイルごとにフェイルオープン)
|
|
60
|
+
- 明示的な `--custom` および組み込みポリシーと併用できます
|
|
61
61
|
|
|
62
62
|
<Tip>
|
|
63
|
-
|
|
63
|
+
規約ポリシーは、組織の品質基準を構築する最も簡単な方法です。`.failproofai/policies/` を git にコミットすれば、すべてのチームメンバーが自動的に同じルールを取得できます — 開発者ごとのセットアップは不要です。チームが新しい障害パターンを発見するたびにポリシーを追加してプッシュしてください。時間とともに、これらは貢献のたびに改善され続ける生きた品質基準となります。
|
|
64
64
|
</Tip>
|
|
65
65
|
|
|
66
66
|
### オプション2: 明示的なファイルパス
|
|
@@ -69,22 +69,22 @@ failproofai policies --install --custom ./my-policies.js
|
|
|
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`
|
|
79
|
+
解決された絶対パスは `policies-config.json` に `customPoliciesPath` として保存されます。ファイルはフックイベントのたびに新たにロードされます — イベント間のキャッシュはありません。
|
|
80
80
|
|
|
81
81
|
### 両方を併用する
|
|
82
82
|
|
|
83
|
-
規約ポリシーと明示的な `--custom`
|
|
83
|
+
規約ポリシーと明示的な `--custom` ファイルは共存できます。ロード順序:
|
|
84
84
|
|
|
85
85
|
1. 明示的な `customPoliciesPath` ファイル(設定されている場合)
|
|
86
|
-
2.
|
|
87
|
-
3.
|
|
86
|
+
2. プロジェクト規約ファイル(`{cwd}/.failproofai/policies/`、アルファベット順)
|
|
87
|
+
3. ユーザー規約ファイル(`~/.failproofai/policies/`、アルファベット順)
|
|
88
88
|
|
|
89
89
|
---
|
|
90
90
|
|
|
@@ -98,45 +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
106
|
description?: string; // `failproofai policies` の出力に表示される
|
|
107
|
-
match?: { events?: HookEventType[] }; //
|
|
107
|
+
match?: { events?: HookEventType[] }; // イベントタイプでフィルタリング。省略するとすべてにマッチ
|
|
108
108
|
fn: (ctx: PolicyContext) => PolicyResult | Promise<PolicyResult>;
|
|
109
109
|
});
|
|
110
110
|
```
|
|
111
111
|
|
|
112
|
-
###
|
|
112
|
+
### 決定ヘルパー
|
|
113
113
|
|
|
114
|
-
| 関数 | 効果 |
|
|
114
|
+
| 関数 | 効果 | 使用タイミング |
|
|
115
115
|
|----------|--------|----------|
|
|
116
|
-
| `allow()` |
|
|
117
|
-
| `deny(message)` |
|
|
118
|
-
| `instruct(message)` |
|
|
116
|
+
| `allow()` | 操作を暗黙的に許可 | アクションが安全で、メッセージが不要な場合 |
|
|
117
|
+
| `deny(message)` | 操作をブロック | エージェントがこのアクションを実行すべきでない場合 |
|
|
118
|
+
| `instruct(message)` | ブロックせずにコンテキストを追加 | エージェントに追加のコンテキストを与えて軌道を保つ場合 |
|
|
119
119
|
|
|
120
|
-
`deny(message)` — メッセージは `"Blocked by failproofai:"`
|
|
120
|
+
`deny(message)` — メッセージは `"Blocked by failproofai:"` というプレフィックス付きで Claude に表示されます。1つの `deny` で以降のすべての評価がショートサーキットされます。
|
|
121
121
|
|
|
122
|
-
`instruct(message)` —
|
|
122
|
+
`instruct(message)` — メッセージは現在のツール呼び出しに対する Claude のコンテキストに追加されます。すべての `instruct` メッセージは蓄積されてまとめて配信されます。
|
|
123
123
|
|
|
124
124
|
<Tip>
|
|
125
|
-
`
|
|
125
|
+
`policyParams` の `hint` フィールドを追加することで、コード変更なしに `deny` または `instruct` メッセージに追加のガイダンスを付加できます。これはカスタム(`custom/`)、プロジェクト規約(`.failproofai-project/`)、ユーザー規約(`.failproofai-user/`)ポリシーでも機能します。詳しくは[設定 → hint](/ja/configuration#hint-cross-cutting)をご覧ください。
|
|
126
126
|
</Tip>
|
|
127
127
|
|
|
128
128
|
### 情報提供用のallowメッセージ
|
|
129
129
|
|
|
130
|
-
`allow(message)`
|
|
130
|
+
`allow(message)` は操作を許可し**かつ**情報メッセージを Claude に送信します。メッセージはフックハンドラーの stdout レスポンスの `additionalContext` として配信されます — `instruct` と同じ仕組みですが、意味的に異なります: 警告ではなくステータス更新です。
|
|
131
131
|
|
|
132
|
-
| 関数 | 効果 |
|
|
132
|
+
| 関数 | 効果 | 使用タイミング |
|
|
133
133
|
|----------|--------|----------|
|
|
134
|
-
| `allow(message)` |
|
|
134
|
+
| `allow(message)` | 許可してコンテキストを Claude に送信 | チェックが通過したことの確認、またはチェックがスキップされた理由の説明 |
|
|
135
135
|
|
|
136
136
|
ユースケース:
|
|
137
|
-
-
|
|
138
|
-
- **フェイルオープンの説明:** `allow("GitHub CLI not installed, skipping CI check.")` —
|
|
139
|
-
-
|
|
137
|
+
- **ステータス確認:** `allow("All CI checks passed.")` — Claudeにすべてが正常であることを伝える
|
|
138
|
+
- **フェイルオープンの説明:** `allow("GitHub CLI not installed, skipping CI check.")` — Claudeにチェックがスキップされた理由を伝え、完全なコンテキストを提供する
|
|
139
|
+
- **複数メッセージの蓄積:** 複数のポリシーがそれぞれ `allow(message)` を返す場合、すべてのメッセージが改行で結合されてまとめて配信されます
|
|
140
140
|
|
|
141
141
|
```js
|
|
142
142
|
customPolicies.add({
|
|
@@ -146,7 +146,7 @@ customPolicies.add({
|
|
|
146
146
|
const cwd = ctx.session?.cwd;
|
|
147
147
|
if (!cwd) return allow("No working directory, skipping branch check.");
|
|
148
148
|
|
|
149
|
-
// ...
|
|
149
|
+
// ... check branch status ...
|
|
150
150
|
if (allPushed) {
|
|
151
151
|
return allow("Branch is up to date with remote.");
|
|
152
152
|
}
|
|
@@ -162,39 +162,39 @@ customPolicies.add({
|
|
|
162
162
|
| `eventType` | `string` | `"PreToolUse"`、`"PostToolUse"`、`"Notification"`、`"Stop"` |
|
|
163
163
|
| `toolName` | `string \| undefined` | 呼び出されるツール(例: `"Bash"`、`"Write"`、`"Read"`) |
|
|
164
164
|
| `toolInput` | `Record<string, unknown> \| undefined` | ツールの入力パラメータ |
|
|
165
|
-
| `payload` | `Record<string, unknown>` | Claude Codeからの完全な生イベントペイロード |
|
|
165
|
+
| `payload` | `Record<string, unknown>` | Claude Code からの完全な生イベントペイロード |
|
|
166
166
|
| `session` | `SessionMetadata \| undefined` | セッションコンテキスト(下記参照) |
|
|
167
167
|
|
|
168
168
|
### `SessionMetadata` フィールド
|
|
169
169
|
|
|
170
170
|
| フィールド | 型 | 説明 |
|
|
171
171
|
|-------|------|-------------|
|
|
172
|
-
| `sessionId` | `string` | Claude Code
|
|
173
|
-
| `cwd` | `string` | Claude Codeセッションの作業ディレクトリ |
|
|
174
|
-
| `transcriptPath` | `string` | セッションのJSONLトランスクリプトファイルへのパス |
|
|
172
|
+
| `sessionId` | `string` | Claude Code セッション識別子 |
|
|
173
|
+
| `cwd` | `string` | Claude Code セッションの作業ディレクトリ |
|
|
174
|
+
| `transcriptPath` | `string` | セッションの JSONL トランスクリプトファイルへのパス |
|
|
175
175
|
|
|
176
176
|
### イベントタイプ
|
|
177
177
|
|
|
178
178
|
| イベント | 発火タイミング | `toolInput` の内容 |
|
|
179
179
|
|-------|--------------|----------------------|
|
|
180
|
-
| `PreToolUse` | Claudeがツールを実行する前 | ツールの入力(例: Bashの場合 `{ command: "..." }`) |
|
|
180
|
+
| `PreToolUse` | Claude がツールを実行する前 | ツールの入力(例: Bash の場合 `{ command: "..." }`) |
|
|
181
181
|
| `PostToolUse` | ツールが完了した後 | ツールの入力 + `tool_result`(出力) |
|
|
182
|
-
| `Notification` | Claudeが通知を送信するとき | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }` - フックは常に `allow()` を返す必要があり、通知をブロックすることはできません |
|
|
183
|
-
| `Stop` | Claudeセッションが終了するとき | 空 |
|
|
182
|
+
| `Notification` | Claude が通知を送信するとき | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }` - フックは常に `allow()` を返す必要があり、通知をブロックすることはできません |
|
|
183
|
+
| `Stop` | Claude セッションが終了するとき | 空 |
|
|
184
184
|
|
|
185
185
|
---
|
|
186
186
|
|
|
187
187
|
## 評価順序
|
|
188
188
|
|
|
189
|
-
|
|
189
|
+
ポリシーは次の順序で評価されます:
|
|
190
190
|
|
|
191
191
|
1. 組み込みポリシー(定義順)
|
|
192
|
-
2. `customPoliciesPath` からの明示的なカスタムポリシー(`.add()`
|
|
193
|
-
3.
|
|
194
|
-
4.
|
|
192
|
+
2. `customPoliciesPath` からの明示的なカスタムポリシー(`.add()` 順)
|
|
193
|
+
3. プロジェクト `.failproofai/policies/` からの規約ポリシー(ファイルはアルファベット順、内部では `.add()` 順)
|
|
194
|
+
4. ユーザー `~/.failproofai/policies/` からの規約ポリシー(ファイルはアルファベット順、内部では `.add()` 順)
|
|
195
195
|
|
|
196
196
|
<Note>
|
|
197
|
-
最初の `deny`
|
|
197
|
+
最初の `deny` で以降のすべてのポリシーがショートサーキットされます。すべての `instruct` メッセージは蓄積されてまとめて配信されます。
|
|
198
198
|
</Note>
|
|
199
199
|
|
|
200
200
|
---
|
|
@@ -218,11 +218,11 @@ customPolicies.add({
|
|
|
218
218
|
});
|
|
219
219
|
```
|
|
220
220
|
|
|
221
|
-
|
|
221
|
+
エントリーファイルから到達可能なすべての相対インポートが解決されます。これは `from "failproofai"` インポートを実際の dist パスに書き換え、ESM 互換性を確保するために一時的な `.mjs` ファイルを作成することで実装されています。
|
|
222
222
|
|
|
223
223
|
---
|
|
224
224
|
|
|
225
|
-
##
|
|
225
|
+
## イベントタイプフィルタリング
|
|
226
226
|
|
|
227
227
|
`match.events` を使用して、ポリシーが発火するタイミングを制限します:
|
|
228
228
|
|
|
@@ -231,30 +231,30 @@ customPolicies.add({
|
|
|
231
231
|
name: "require-summary-on-stop",
|
|
232
232
|
match: { events: ["Stop"] },
|
|
233
233
|
fn: async (ctx) => {
|
|
234
|
-
//
|
|
235
|
-
// ctx.session.transcriptPath
|
|
234
|
+
// セッション終了時にのみ発火
|
|
235
|
+
// ctx.session.transcriptPath には完全なセッションログが含まれる
|
|
236
236
|
return allow();
|
|
237
237
|
},
|
|
238
238
|
});
|
|
239
239
|
```
|
|
240
240
|
|
|
241
|
-
`match`
|
|
241
|
+
`match` を完全に省略すると、すべてのイベントタイプで発火します。
|
|
242
242
|
|
|
243
243
|
---
|
|
244
244
|
|
|
245
|
-
##
|
|
245
|
+
## エラーハンドリングと障害モード
|
|
246
246
|
|
|
247
247
|
カスタムポリシーは**フェイルオープン**です: エラーが発生しても組み込みポリシーをブロックしたり、フックハンドラーをクラッシュさせたりすることはありません。
|
|
248
248
|
|
|
249
249
|
| 障害 | 動作 |
|
|
250
250
|
|---------|----------|
|
|
251
|
-
| `customPoliciesPath` が未設定 |
|
|
252
|
-
| ファイルが見つからない | `~/.failproofai/hook.log`
|
|
253
|
-
| 構文/インポートエラー(明示的) | `~/.failproofai/hook.log`
|
|
254
|
-
| 構文/インポートエラー(規約) |
|
|
255
|
-
| `fn`
|
|
256
|
-
| `fn` が10秒以上かかる |
|
|
257
|
-
| 規約ディレクトリが存在しない |
|
|
251
|
+
| `customPoliciesPath` が未設定 | 明示的なカスタムポリシーは実行されない。規約ポリシーと組み込みは通常通り継続 |
|
|
252
|
+
| ファイルが見つからない | `~/.failproofai/hook.log` に警告が記録される。組み込みは継続 |
|
|
253
|
+
| 構文/インポートエラー(明示的) | `~/.failproofai/hook.log` にエラーが記録される。明示的なカスタムポリシーはスキップ |
|
|
254
|
+
| 構文/インポートエラー(規約) | エラーが記録される。そのファイルはスキップされ、他の規約ファイルは引き続きロード |
|
|
255
|
+
| 実行時に `fn` が例外をスロー | エラーが記録される。そのフックは `allow` として扱われ、他のフックは継続 |
|
|
256
|
+
| `fn` が10秒以上かかる | タイムアウトが記録される。`allow` として扱われる |
|
|
257
|
+
| 規約ディレクトリが存在しない | 規約ポリシーは実行されない。エラーは発生しない |
|
|
258
258
|
|
|
259
259
|
<Tip>
|
|
260
260
|
カスタムポリシーのエラーをデバッグするには、ログファイルを監視してください:
|
|
@@ -272,7 +272,7 @@ tail -f ~/.failproofai/hook.log
|
|
|
272
272
|
// my-policies.js
|
|
273
273
|
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
274
274
|
|
|
275
|
-
// エージェントがsecrets
|
|
275
|
+
// エージェントが secrets/ ディレクトリに書き込むのを防ぐ
|
|
276
276
|
customPolicies.add({
|
|
277
277
|
name: "block-secrets-dir",
|
|
278
278
|
description: "Prevent agent from writing to secrets/ directory",
|
|
@@ -285,7 +285,7 @@ customPolicies.add({
|
|
|
285
285
|
},
|
|
286
286
|
});
|
|
287
287
|
|
|
288
|
-
//
|
|
288
|
+
// エージェントを軌道に乗せる: コミット前にテストを確認
|
|
289
289
|
customPolicies.add({
|
|
290
290
|
name: "remind-test-before-commit",
|
|
291
291
|
description: "Keep the agent on track: verify tests pass before committing",
|
|
@@ -300,7 +300,7 @@ customPolicies.add({
|
|
|
300
300
|
},
|
|
301
301
|
});
|
|
302
302
|
|
|
303
|
-
//
|
|
303
|
+
// フリーズ期間中の予定外の依存関係変更を防ぐ
|
|
304
304
|
customPolicies.add({
|
|
305
305
|
name: "dependency-freeze",
|
|
306
306
|
description: "Prevent unplanned dependency changes during freeze period",
|
|
@@ -323,22 +323,22 @@ export { customPolicies };
|
|
|
323
323
|
|
|
324
324
|
## サンプル
|
|
325
325
|
|
|
326
|
-
`examples/`
|
|
326
|
+
`examples/` ディレクトリにはすぐに実行できるポリシーファイルが含まれています:
|
|
327
327
|
|
|
328
328
|
| ファイル | 内容 |
|
|
329
329
|
|------|----------|
|
|
330
|
-
| `examples/policies-basic.js` |
|
|
330
|
+
| `examples/policies-basic.js` | よくあるエージェント障害モードをカバーする5つのスタータポリシー |
|
|
331
331
|
| `examples/policies-advanced/index.js` | 高度なパターン: 推移的インポート、非同期呼び出し、出力のスクラビング、セッション終了フック |
|
|
332
|
-
| `examples/convention-policies/security-policies.mjs` | 規約ベースのセキュリティポリシー(.envファイルへの書き込みのブロック、git
|
|
333
|
-
| `examples/convention-policies/workflow-policies.mjs` |
|
|
332
|
+
| `examples/convention-policies/security-policies.mjs` | 規約ベースのセキュリティポリシー(.env ファイルへの書き込みのブロック、git履歴の書き換え防止) |
|
|
333
|
+
| `examples/convention-policies/workflow-policies.mjs` | 規約ベースのワークフローポリシー(テストリマインダー、監査ファイル書き込み) |
|
|
334
334
|
|
|
335
|
-
###
|
|
335
|
+
### 明示的なファイルの例を使用する
|
|
336
336
|
|
|
337
337
|
```bash
|
|
338
338
|
failproofai policies --install --custom ./examples/policies-basic.js
|
|
339
339
|
```
|
|
340
340
|
|
|
341
|
-
###
|
|
341
|
+
### 規約ベースの例を使用する
|
|
342
342
|
|
|
343
343
|
```bash
|
|
344
344
|
# プロジェクトレベルにコピー
|
|
@@ -350,4 +350,4 @@ mkdir -p ~/.failproofai/policies
|
|
|
350
350
|
cp examples/convention-policies/*.mjs ~/.failproofai/policies/
|
|
351
351
|
```
|
|
352
352
|
|
|
353
|
-
インストールコマンドは不要です —
|
|
353
|
+
インストールコマンドは不要です — 次のフックイベント時にファイルが自動的に検出されます。
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: 使用例
|
|
3
|
-
description: "Claude Code と Agents SDK
|
|
3
|
+
description: "Claude Code と Agents SDK にフックを設定する方法"
|
|
4
4
|
icon: book-open
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
よく使われるシナリオのすぐに使えるサンプル集です。インストール方法と期待される動作をそれぞれ示します。
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Claude Code 向けフックの設定
|
|
12
12
|
|
|
13
|
-
Failproof AI は Claude Code の[フックシステム](https://docs.anthropic.com/en/docs/claude-code/hooks)
|
|
13
|
+
Failproof AI は Claude Code の[フックシステム](https://docs.anthropic.com/en/docs/claude-code/hooks)を通じて連携します。`failproofai policies --install` を実行すると、Claude Code の `settings.json` にフックコマンドが登録され、すべてのツール呼び出し時に発火します。
|
|
14
14
|
|
|
15
15
|
<Steps>
|
|
16
16
|
<Step title="failproofai をインストールする">
|
|
@@ -18,7 +18,7 @@ Failproof AI は Claude Code の[フックシステム](https://docs.anthropic.c
|
|
|
18
18
|
npm install -g failproofai
|
|
19
19
|
```
|
|
20
20
|
</Step>
|
|
21
|
-
<Step title="
|
|
21
|
+
<Step title="すべての組み込みポリシーを有効にする">
|
|
22
22
|
```bash
|
|
23
23
|
failproofai policies --install
|
|
24
24
|
```
|
|
@@ -28,14 +28,14 @@ Failproof AI は Claude Code の[フックシステム](https://docs.anthropic.c
|
|
|
28
28
|
cat ~/.claude/settings.json | grep failproofai
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
`PreToolUse`、`PostToolUse`、`Notification`、`Stop`
|
|
31
|
+
`PreToolUse`、`PostToolUse`、`Notification`、`Stop` イベントのフックエントリーが表示されるはずです。
|
|
32
32
|
</Step>
|
|
33
33
|
<Step title="Claude Code を起動する">
|
|
34
34
|
```bash
|
|
35
35
|
claude
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
ポリシーがすべてのツール呼び出しで自動的に実行されるようになります。Claude に `sudo rm -rf /` を実行するよう依頼してみてください — ブロックされます。
|
|
39
39
|
</Step>
|
|
40
40
|
</Steps>
|
|
41
41
|
|
|
@@ -52,11 +52,11 @@ Failproof AI は Claude Code の[フックシステム](https://docs.anthropic.c
|
|
|
52
52
|
```
|
|
53
53
|
</Step>
|
|
54
54
|
<Step title="エージェントにフックを設定する">
|
|
55
|
-
エージェントプロセスの作成時にフックコマンドを渡します。フックは Claude Code
|
|
55
|
+
エージェントプロセスの作成時にフックコマンドを渡します。フックは Claude Code と同様に stdin/stdout の JSON 形式で発火します。
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
|
-
failproofai --hook PreToolUse #
|
|
59
|
-
failproofai --hook PostToolUse #
|
|
58
|
+
failproofai --hook PreToolUse # 各ツールの前に呼び出される
|
|
59
|
+
failproofai --hook PostToolUse # 各ツールの後に呼び出される
|
|
60
60
|
```
|
|
61
61
|
</Step>
|
|
62
62
|
<Step title="エージェント用のカスタムポリシーを作成する">
|
|
@@ -88,7 +88,7 @@ Failproof AI は Claude Code の[フックシステム](https://docs.anthropic.c
|
|
|
88
88
|
|
|
89
89
|
## 破壊的なコマンドをブロックする
|
|
90
90
|
|
|
91
|
-
|
|
91
|
+
最も一般的なセットアップ — エージェントが取り返しのつかない操作を行わないようにします。
|
|
92
92
|
|
|
93
93
|
```bash
|
|
94
94
|
failproofai policies --install block-sudo block-rm-rf block-force-push block-curl-pipe-sh
|
|
@@ -98,23 +98,23 @@ failproofai policies --install block-sudo block-rm-rf block-force-push block-cur
|
|
|
98
98
|
- `block-sudo` — すべての `sudo` コマンドをブロック
|
|
99
99
|
- `block-rm-rf` — 再帰的なファイル削除をブロック
|
|
100
100
|
- `block-force-push` — `git push --force` をブロック
|
|
101
|
-
- `block-curl-pipe-sh` —
|
|
101
|
+
- `block-curl-pipe-sh` — リモートスクリプトをシェルにパイプする操作をブロック
|
|
102
102
|
|
|
103
103
|
---
|
|
104
104
|
|
|
105
105
|
## シークレットの漏洩を防ぐ
|
|
106
106
|
|
|
107
|
-
|
|
107
|
+
ツールの出力に含まれる認証情報をエージェントが参照・漏洩しないようにします。
|
|
108
108
|
|
|
109
109
|
```bash
|
|
110
110
|
failproofai policies --install sanitize-api-keys sanitize-jwt sanitize-connection-strings sanitize-bearer-tokens
|
|
111
111
|
```
|
|
112
112
|
|
|
113
|
-
これらは `PostToolUse`
|
|
113
|
+
これらは `PostToolUse` で発火します — ツールの実行後、エージェントが出力を受け取る前にスクラブ処理が行われます。
|
|
114
114
|
|
|
115
115
|
---
|
|
116
116
|
|
|
117
|
-
## エージェントの待機時に Slack
|
|
117
|
+
## エージェントの待機時に Slack へアラートを送る
|
|
118
118
|
|
|
119
119
|
通知フックを使って、アイドル状態のアラートを Slack に転送します。
|
|
120
120
|
|
|
@@ -158,9 +158,9 @@ SLACK_WEBHOOK_URL=https://hooks.slack.com/... failproofai policies --install --c
|
|
|
158
158
|
|
|
159
159
|
---
|
|
160
160
|
|
|
161
|
-
##
|
|
161
|
+
## エージェントを特定のブランチに留める
|
|
162
162
|
|
|
163
|
-
|
|
163
|
+
エージェントが他のブランチに切り替えたり、保護されたブランチにプッシュしたりできないようにします。
|
|
164
164
|
|
|
165
165
|
```javascript
|
|
166
166
|
import { customPolicies, allow, deny } from "failproofai";
|
|
@@ -182,9 +182,9 @@ customPolicies.add({
|
|
|
182
182
|
|
|
183
183
|
---
|
|
184
184
|
|
|
185
|
-
##
|
|
185
|
+
## コミット前にテストを必須にする
|
|
186
186
|
|
|
187
|
-
|
|
187
|
+
コミットの前にテストを実行するようエージェントに促します。
|
|
188
188
|
|
|
189
189
|
```javascript
|
|
190
190
|
import { customPolicies, allow, instruct } from "failproofai";
|
|
@@ -238,16 +238,70 @@ git add .failproofai/policies-config.json
|
|
|
238
238
|
git commit -m "Add failproofai team policies"
|
|
239
239
|
```
|
|
240
240
|
|
|
241
|
-
failproofai
|
|
241
|
+
failproofai をインストールしているすべてのチームメンバーが、これらのルールを自動的に取得します。
|
|
242
242
|
|
|
243
243
|
---
|
|
244
244
|
|
|
245
|
-
##
|
|
245
|
+
## コンベンションポリシーでチーム全体の品質基準を構築する
|
|
246
|
+
|
|
247
|
+
最も効果的なセットアップ: プロジェクトに合わせたポリシーを `.failproofai/policies/` にコミットします。チーム全員がインストールコマンドや設定変更なしに自動で適用されます。
|
|
248
|
+
|
|
249
|
+
<Steps>
|
|
250
|
+
<Step title="ディレクトリを作成してポリシーを追加する">
|
|
251
|
+
```bash
|
|
252
|
+
mkdir -p .failproofai/policies
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
```js
|
|
256
|
+
// .failproofai/policies/team-policies.mjs
|
|
257
|
+
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
258
|
+
|
|
259
|
+
// チームが使用するパッケージマネージャーを強制する
|
|
260
|
+
// (組み込みの prefer-package-manager ポリシーを有効にしても構いません)
|
|
261
|
+
customPolicies.add({
|
|
262
|
+
name: "enforce-bun",
|
|
263
|
+
match: { events: ["PreToolUse"] },
|
|
264
|
+
fn: async (ctx) => {
|
|
265
|
+
if (ctx.toolName !== "Bash") return allow();
|
|
266
|
+
const cmd = String(ctx.toolInput?.command ?? "");
|
|
267
|
+
if (/\bnpm\b/.test(cmd)) return deny("Use bun instead of npm.");
|
|
268
|
+
return allow();
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
// コミット前にテストを実行するようエージェントに促す
|
|
273
|
+
customPolicies.add({
|
|
274
|
+
name: "test-before-commit",
|
|
275
|
+
match: { events: ["PreToolUse"] },
|
|
276
|
+
fn: async (ctx) => {
|
|
277
|
+
if (ctx.toolName !== "Bash") return allow();
|
|
278
|
+
if (/git\s+commit/.test(ctx.toolInput?.command ?? "")) {
|
|
279
|
+
return instruct("Run tests before committing.");
|
|
280
|
+
}
|
|
281
|
+
return allow();
|
|
282
|
+
},
|
|
283
|
+
});
|
|
284
|
+
```
|
|
285
|
+
</Step>
|
|
286
|
+
<Step title="git にコミットする">
|
|
287
|
+
```bash
|
|
288
|
+
git add .failproofai/policies/
|
|
289
|
+
git commit -m "Add team quality policies"
|
|
290
|
+
```
|
|
291
|
+
</Step>
|
|
292
|
+
<Step title="継続的に改善する">
|
|
293
|
+
チームが新たな問題に直面するたびにポリシーを追加してプッシュしてください。全員が次の `git pull` 時にアップデートを受け取ります。これらのポリシーはチームとともに成長する、生きた品質基準になります。
|
|
294
|
+
</Step>
|
|
295
|
+
</Steps>
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## その他のサンプル
|
|
246
300
|
|
|
247
301
|
リポジトリの [`examples/`](https://github.com/exospherehost/failproofai/tree/main/examples) ディレクトリには以下が含まれています:
|
|
248
302
|
|
|
249
303
|
| ファイル | 内容 |
|
|
250
304
|
|------|---------------|
|
|
251
|
-
| `policies-basic.js` |
|
|
305
|
+
| `policies-basic.js` | スターターポリシー — 本番環境への書き込み、force-push、パイプスクリプトのブロック |
|
|
252
306
|
| `policies-notification.js` | アイドル通知とセッション終了時の Slack アラート |
|
|
253
|
-
| `policies-advanced/index.js` | トランジティブインポート、非同期フック、PostToolUse
|
|
307
|
+
| `policies-advanced/index.js` | トランジティブインポート、非同期フック、PostToolUse 出力のスクラブ、Stop イベント処理 |
|