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,21 +1,21 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Architektur
|
|
3
|
-
description: "Wie der Hook-Handler, das Laden der Konfiguration und die
|
|
3
|
+
description: "Wie der Hook-Handler, das Laden der Konfiguration und die Richtlinienauswertung intern funktionieren"
|
|
4
4
|
icon: sitemap
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Dieses Dokument
|
|
7
|
+
Dieses Dokument erläutert, wie failproofai intern funktioniert: wie das Hook-System Agent-Tool-Aufrufe abfängt, wie die Konfiguration geladen und zusammengeführt wird, wie Richtlinien ausgewertet werden und wie das Dashboard die Agentenaktivität überwacht.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Überblick
|
|
12
12
|
|
|
13
|
-
failproofai besteht aus zwei unabhängigen
|
|
13
|
+
failproofai besteht aus zwei unabhängigen Teilsystemen:
|
|
14
14
|
|
|
15
|
-
1. **Hook-Handler** – Ein schneller CLI-
|
|
16
|
-
2. **Agent Monitor (Dashboard)** – Eine Next.js-Webanwendung zur Überwachung von Agentensitzungen und
|
|
15
|
+
1. **Hook-Handler** – Ein schneller CLI-Subprozess, den Claude Code bei jedem Agent-Tool-Aufruf startet. Er wertet Richtlinien aus und gibt eine Entscheidung zurück.
|
|
16
|
+
2. **Agent Monitor (Dashboard)** – Eine Next.js-Webanwendung zur Überwachung von Agentensitzungen und Verwaltung von Richtlinien.
|
|
17
17
|
|
|
18
|
-
Beide
|
|
18
|
+
Beide Teilsysteme teilen sich Konfigurationsdateien in `~/.failproofai/` und im `.failproofai/`-Verzeichnis des Projekts, laufen aber als separate Prozesse und kommunizieren ausschließlich über das Dateisystem.
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
@@ -23,7 +23,7 @@ Beide Subsysteme teilen sich Konfigurationsdateien in `~/.failproofai/` und im `
|
|
|
23
23
|
|
|
24
24
|
### Integration mit Claude Code
|
|
25
25
|
|
|
26
|
-
Wenn Sie `failproofai policies --install` ausführen,
|
|
26
|
+
Wenn Sie `failproofai policies --install` ausführen, werden Einträge wie diese in `~/.claude/settings.json` geschrieben:
|
|
27
27
|
|
|
28
28
|
```json
|
|
29
29
|
{
|
|
@@ -44,7 +44,7 @@ Wenn Sie `failproofai policies --install` ausführen, schreibt es folgende Eintr
|
|
|
44
44
|
}
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
Claude Code
|
|
47
|
+
Claude Code startet dann `failproofai --hook PreToolUse` als Subprozess vor jedem Tool-Aufruf und übergibt dabei ein JSON-Payload über stdin.
|
|
48
48
|
|
|
49
49
|
### Payload-Format
|
|
50
50
|
|
|
@@ -60,13 +60,13 @@ Claude Code ruft daraufhin `failproofai --hook PreToolUse` als Subprocess vor je
|
|
|
60
60
|
}
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
-
Bei `PostToolUse`-
|
|
63
|
+
Bei `PostToolUse`-Ereignissen enthält das Payload zusätzlich `tool_result` mit der Ausgabe des Tools.
|
|
64
64
|
|
|
65
|
-
Der Handler
|
|
65
|
+
Der Handler erzwingt ein stdin-Limit von 1 MB. Payloads, die dieses Limit überschreiten, werden verworfen und alle Richtlinien erlauben implizit.
|
|
66
66
|
|
|
67
67
|
### Antwortformat
|
|
68
68
|
|
|
69
|
-
**
|
|
69
|
+
**Ablehnen (PreToolUse):**
|
|
70
70
|
```json
|
|
71
71
|
{
|
|
72
72
|
"hookSpecificOutput": {
|
|
@@ -76,7 +76,7 @@ Der Handler setzt ein Limit von 1 MB für stdin. Payloads, die dieses Limit übe
|
|
|
76
76
|
}
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
**
|
|
79
|
+
**Ablehnen (PostToolUse):**
|
|
80
80
|
```json
|
|
81
81
|
{
|
|
82
82
|
"hookSpecificOutput": {
|
|
@@ -85,7 +85,7 @@ Der Handler setzt ein Limit von 1 MB für stdin. Payloads, die dieses Limit übe
|
|
|
85
85
|
}
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
-
**
|
|
88
|
+
**Anweisung (beliebiges Ereignis außer Stop):**
|
|
89
89
|
```json
|
|
90
90
|
{
|
|
91
91
|
"hookSpecificOutput": {
|
|
@@ -94,17 +94,17 @@ Der Handler setzt ein Limit von 1 MB für stdin. Payloads, die dieses Limit übe
|
|
|
94
94
|
}
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
-
**Stop-
|
|
97
|
+
**Stop-Ereignis mit Anweisung:**
|
|
98
98
|
- Exit-Code: `2`
|
|
99
|
-
-
|
|
99
|
+
- Begründung wird in stderr geschrieben (nicht stdout)
|
|
100
100
|
|
|
101
|
-
**
|
|
101
|
+
**Erlauben:**
|
|
102
102
|
- Exit-Code: `0`
|
|
103
103
|
- Leerer stdout
|
|
104
104
|
|
|
105
|
-
**
|
|
105
|
+
**Erlauben mit Nachricht:**
|
|
106
106
|
|
|
107
|
-
`allow(message)`
|
|
107
|
+
`allow(message)` erlaubt es einer Richtlinie, informationellen Kontext an Claude zurückzusenden, auch wenn die Operation erlaubt ist. Der Hook-Handler schreibt folgenden JSON-Inhalt in **stdout** (nicht in eine Konfigurationsdatei – dies ist die Antwort des Handlers an Claude Code, genau wie Ablehnen- und Anweisungsantworten oben):
|
|
108
108
|
|
|
109
109
|
```json
|
|
110
110
|
// Written to stdout by the hook handler process
|
|
@@ -115,8 +115,8 @@ Der Handler setzt ein Limit von 1 MB für stdin. Payloads, die dieses Limit übe
|
|
|
115
115
|
}
|
|
116
116
|
```
|
|
117
117
|
- Exit-Code: `0` (Operation ist erlaubt)
|
|
118
|
-
- Wenn mehrere
|
|
119
|
-
- Wenn keine
|
|
118
|
+
- Wenn mehrere Richtlinien `allow` mit einer Nachricht zurückgeben, werden ihre Nachrichten mit Zeilenumbrüchen zu einem einzelnen `additionalContext`-String zusammengefügt
|
|
119
|
+
- Wenn keine Richtlinie eine Nachricht liefert, ist stdout leer (wie zuvor)
|
|
120
120
|
|
|
121
121
|
### Verarbeitungspipeline
|
|
122
122
|
|
|
@@ -124,28 +124,28 @@ Der Handler setzt ein Limit von 1 MB für stdin. Payloads, die dieses Limit übe
|
|
|
124
124
|
|
|
125
125
|
```text
|
|
126
126
|
stdin JSON
|
|
127
|
-
→
|
|
128
|
-
→
|
|
129
|
-
→ readMergedHooksConfig(cwd) ←
|
|
130
|
-
→
|
|
131
|
-
→
|
|
132
|
-
→
|
|
133
|
-
→
|
|
134
|
-
→
|
|
135
|
-
→ instruct
|
|
136
|
-
→ allow
|
|
137
|
-
→
|
|
138
|
-
→
|
|
139
|
-
→
|
|
127
|
+
→ Payload parsen (max. 1 MB)
|
|
128
|
+
→ Sitzungsmetadaten extrahieren (session_id, cwd, tool_name, tool_input, etc.)
|
|
129
|
+
→ readMergedHooksConfig(cwd) ← führt Projekt-, lokale und globale Konfiguration zusammen
|
|
130
|
+
→ aktivierte eingebaute Richtlinien mit aufgelösten Parametern registrieren
|
|
131
|
+
→ benutzerdefinierte Richtlinien aus customPoliciesPath laden (falls gesetzt)
|
|
132
|
+
→ benutzerdefinierte Richtlinien in die Policy-Registry registrieren
|
|
133
|
+
→ alle Richtlinien auswerten (zuerst eingebaute, dann benutzerdefinierte)
|
|
134
|
+
→ erstes deny unterbricht sofort die Auswertung
|
|
135
|
+
→ instruct-Entscheidungen werden gesammelt
|
|
136
|
+
→ allow-Nachrichten werden gesammelt
|
|
137
|
+
→ JSON-Entscheidung in stdout schreiben
|
|
138
|
+
→ Ereignis in ~/.failproofai/hook-activity.jsonl speichern
|
|
139
|
+
→ beenden
|
|
140
140
|
```
|
|
141
141
|
|
|
142
142
|
Der gesamte Prozess läuft bei typischen Payloads ohne LLM-Aufrufe in unter 100 ms ab.
|
|
143
143
|
|
|
144
144
|
---
|
|
145
145
|
|
|
146
|
-
##
|
|
146
|
+
## Konfigurationsladen
|
|
147
147
|
|
|
148
|
-
`src/hooks/hooks-config.ts` implementiert das
|
|
148
|
+
`src/hooks/hooks-config.ts` implementiert das Laden der Konfiguration mit drei Geltungsbereichen.
|
|
149
149
|
|
|
150
150
|
```text
|
|
151
151
|
[1] {cwd}/.failproofai/policies-config.json ← Projekt (höchste Priorität)
|
|
@@ -154,39 +154,39 @@ Der gesamte Prozess läuft bei typischen Payloads ohne LLM-Aufrufe in unter 100
|
|
|
154
154
|
```
|
|
155
155
|
|
|
156
156
|
Zusammenführungslogik:
|
|
157
|
-
- `enabledPolicies` – deduplizierte Vereinigung
|
|
158
|
-
- `policyParams` – pro
|
|
159
|
-
- `customPoliciesPath` – die erste Datei, die
|
|
160
|
-
- `llm` – die erste Datei, die
|
|
157
|
+
- `enabledPolicies` – deduplizierte Vereinigung aus allen drei Dateien
|
|
158
|
+
- `policyParams` – pro Richtlinienschlüssel gewinnt die erste Datei, die ihn definiert, vollständig
|
|
159
|
+
- `customPoliciesPath` – die erste Datei, die diesen Wert definiert, gewinnt
|
|
160
|
+
- `llm` – die erste Datei, die diesen Wert definiert, gewinnt
|
|
161
161
|
|
|
162
|
-
Das Web-Dashboard verwendet `readHooksConfig()` (nur global) zum Lesen und Schreiben, da es
|
|
162
|
+
Das Web-Dashboard verwendet `readHooksConfig()` (nur global) zum Lesen und Schreiben, da es ohne Projekt-cwd aufgerufen wird.
|
|
163
163
|
|
|
164
164
|
---
|
|
165
165
|
|
|
166
|
-
##
|
|
166
|
+
## Richtlinienauswertung
|
|
167
167
|
|
|
168
|
-
`src/hooks/policy-evaluator.ts` führt
|
|
168
|
+
`src/hooks/policy-evaluator.ts` führt Richtlinien der Reihe nach aus.
|
|
169
169
|
|
|
170
|
-
Für jede
|
|
170
|
+
Für jede Richtlinie:
|
|
171
171
|
|
|
172
|
-
1. Das `params`-Schema der
|
|
172
|
+
1. Das `params`-Schema der Richtlinie nachschlagen (falls vorhanden).
|
|
173
173
|
2. `policyParams[policy.name]` aus der zusammengeführten Konfiguration lesen.
|
|
174
|
-
3.
|
|
174
|
+
3. Vom Benutzer angegebene Werte über Schema-Standardwerte legen, um `ctx.params` zu erzeugen.
|
|
175
175
|
4. `policy.fn(ctx)` mit dem aufgelösten Kontext aufrufen.
|
|
176
|
-
5.
|
|
177
|
-
6.
|
|
178
|
-
7.
|
|
176
|
+
5. Wenn das Ergebnis `deny` ist, sofort abbrechen und diese Entscheidung zurückgeben.
|
|
177
|
+
6. Wenn das Ergebnis `instruct` ist, die Nachricht sammeln und fortfahren.
|
|
178
|
+
7. Wenn das Ergebnis `allow` ist, mit der nächsten Richtlinie fortfahren.
|
|
179
179
|
|
|
180
|
-
Nach
|
|
181
|
-
-
|
|
182
|
-
-
|
|
183
|
-
- Andernfalls eine
|
|
180
|
+
Nach dem Durchlauf aller Richtlinien:
|
|
181
|
+
- Falls ein `deny` zurückgegeben wurde, die Ablehnungsantwort ausgeben.
|
|
182
|
+
- Falls `instruct`-Rückgaben gesammelt wurden, eine einzelne instruct-Antwort mit allen zusammengefügten Nachrichten ausgeben.
|
|
183
|
+
- Andernfalls eine allow-Antwort ausgeben (leerer stdout, Exit 0).
|
|
184
184
|
|
|
185
185
|
---
|
|
186
186
|
|
|
187
|
-
## Eingebaute
|
|
187
|
+
## Eingebaute Richtlinien
|
|
188
188
|
|
|
189
|
-
`src/hooks/builtin-policies.ts` definiert alle 26 eingebauten
|
|
189
|
+
`src/hooks/builtin-policies.ts` definiert alle 26 eingebauten Richtlinien als `BuiltinPolicyDefinition`-Objekte:
|
|
190
190
|
|
|
191
191
|
```typescript
|
|
192
192
|
interface BuiltinPolicyDefinition {
|
|
@@ -204,15 +204,15 @@ interface BuiltinPolicyDefinition {
|
|
|
204
204
|
}
|
|
205
205
|
```
|
|
206
206
|
|
|
207
|
-
|
|
207
|
+
Richtlinien, die `params` akzeptieren, deklarieren ein `PolicyParamsSchema` mit Typen und Standardwerten für jeden Parameter. Der Richtlinienauswerter injiziert aufgelöste Werte in `ctx.params`, bevor `fn` aufgerufen wird. Richtlinienfunktionen lesen `ctx.params` ohne Null-Prüfung, da Standardwerte immer zuerst angewendet werden.
|
|
208
208
|
|
|
209
|
-
|
|
209
|
+
Das Muster-Matching in Richtlinien verwendet geparste Befehls-Token (argv), keine rohe Zeichenkettenübereinstimmung. Dies verhindert Umgehungsversuche durch Shell-Operator-Injection (z. B. kann ein Muster für `sudo systemctl status *` nicht durch Anhängen von `; rm -rf /` an den Befehl umgangen werden).
|
|
210
210
|
|
|
211
211
|
---
|
|
212
212
|
|
|
213
|
-
## Benutzerdefinierte
|
|
213
|
+
## Benutzerdefinierte Richtlinien
|
|
214
214
|
|
|
215
|
-
`src/hooks/custom-hooks-registry.ts` implementiert eine `globalThis
|
|
215
|
+
`src/hooks/custom-hooks-registry.ts` implementiert eine auf `globalThis` basierende Registry:
|
|
216
216
|
|
|
217
217
|
```typescript
|
|
218
218
|
const REGISTRY_KEY = "__failproofai_custom_hooks__";
|
|
@@ -225,25 +225,25 @@ export function getCustomHooks(): CustomHook[] { ... }
|
|
|
225
225
|
export function clearCustomHooks(): void { ... } // used in tests
|
|
226
226
|
```
|
|
227
227
|
|
|
228
|
-
`src/hooks/custom-hooks-loader.ts` lädt die
|
|
228
|
+
`src/hooks/custom-hooks-loader.ts` lädt die Richtliniendatei des Benutzers:
|
|
229
229
|
|
|
230
230
|
1. `customPoliciesPath` aus der Konfiguration lesen; überspringen, falls nicht vorhanden.
|
|
231
|
-
2.
|
|
232
|
-
3. Alle `from "failproofai"`-
|
|
233
|
-
4. Transitive lokale
|
|
231
|
+
2. Zum absoluten Pfad auflösen; prüfen, ob die Datei existiert.
|
|
232
|
+
3. Alle `from "failproofai"`-Importe in den tatsächlichen dist-Pfad umschreiben, damit `customPolicies` zur gleichen `globalThis`-Registry aufgelöst wird.
|
|
233
|
+
4. Transitive lokale Importe rekursiv umschreiben, um ESM-Kompatibilität sicherzustellen.
|
|
234
234
|
5. Temporäre `.mjs`-Dateien schreiben und die Einstiegsdatei per `import()` laden.
|
|
235
235
|
6. `getCustomHooks()` aufrufen, um registrierte Hooks abzurufen.
|
|
236
236
|
7. Alle temporären Dateien in einem `finally`-Block bereinigen.
|
|
237
237
|
|
|
238
|
-
Bei jedem Fehler (Datei nicht gefunden, Syntaxfehler, Import-Fehler) wird der Fehler in `~/.failproofai/hook.log` protokolliert und der Loader gibt ein leeres Array zurück. Eingebaute
|
|
238
|
+
Bei jedem Fehler (Datei nicht gefunden, Syntaxfehler, Import-Fehler) wird der Fehler in `~/.failproofai/hook.log` protokolliert und der Loader gibt ein leeres Array zurück. Eingebaute Richtlinien sind davon nicht betroffen.
|
|
239
239
|
|
|
240
|
-
Benutzerdefinierte
|
|
240
|
+
Benutzerdefinierte Richtlinien werden nach allen eingebauten Richtlinien ausgewertet. Ein `deny` einer benutzerdefinierten Richtlinie unterbricht weiterhin die Auswertung weiterer benutzerdefinierter Richtlinien (aber alle eingebauten wurden zu diesem Zeitpunkt bereits ausgeführt).
|
|
241
241
|
|
|
242
242
|
---
|
|
243
243
|
|
|
244
244
|
## Aktivitätsprotokollierung
|
|
245
245
|
|
|
246
|
-
Nach jedem Hook-
|
|
246
|
+
Nach jedem Hook-Ereignis fügt der Handler eine JSONL-Zeile an `~/.failproofai/hook-activity.jsonl` an:
|
|
247
247
|
|
|
248
248
|
```json
|
|
249
249
|
{
|
|
@@ -258,7 +258,7 @@ Nach jedem Hook-Event hängt der Handler eine JSONL-Zeile an `~/.failproofai/hoo
|
|
|
258
258
|
}
|
|
259
259
|
```
|
|
260
260
|
|
|
261
|
-
Eine Zeile pro
|
|
261
|
+
Eine Zeile pro Richtlinie, die eine Nicht-allow-Entscheidung getroffen hat. Allow-Entscheidungen werden nicht protokolliert (um die Dateigröße gering zu halten).
|
|
262
262
|
|
|
263
263
|
---
|
|
264
264
|
|
|
@@ -272,13 +272,13 @@ app/
|
|
|
272
272
|
projects/page.tsx ← Server-Komponente: alle Claude-Projekte auflisten
|
|
273
273
|
project/[name]/page.tsx ← Server-Komponente: Sitzungen in einem Projekt auflisten
|
|
274
274
|
project/[name]/session/
|
|
275
|
-
[sessionId]/page.tsx ← Server-Komponente:
|
|
276
|
-
policies/page.tsx ← Client-Komponente:
|
|
275
|
+
[sessionId]/page.tsx ← Server-Komponente: Sitzungs-Viewer rendern
|
|
276
|
+
policies/page.tsx ← Client-Komponente: Richtlinienverwaltung + Aktivitätsprotokoll
|
|
277
277
|
actions/
|
|
278
|
-
get-hooks-config.ts ← Konfiguration +
|
|
279
|
-
update-hooks-config.ts ←
|
|
280
|
-
update-policy-params.ts ←
|
|
281
|
-
get-hook-activity.ts ←
|
|
278
|
+
get-hooks-config.ts ← Konfiguration + Richtlinienliste lesen
|
|
279
|
+
update-hooks-config.ts ← Richtlinie aktivieren/deaktivieren
|
|
280
|
+
update-policy-params.ts ← Richtlinienparameter aktualisieren
|
|
281
|
+
get-hook-activity.ts ← Aktivitätsprotokoll paginieren/durchsuchen
|
|
282
282
|
install-hooks-web.ts ← Hooks über den Browser installieren/entfernen
|
|
283
283
|
api/
|
|
284
284
|
download/[project]/[session]/route.ts ← Sitzung als ZIP/JSONL exportieren
|
|
@@ -286,16 +286,16 @@ app/
|
|
|
286
286
|
|
|
287
287
|
**Datenfluss:**
|
|
288
288
|
|
|
289
|
-
- Seitenkomponenten rufen `lib/projects.ts` und `lib/log-entries.ts` auf, um Projekt
|
|
290
|
-
- Die Policies-Seite verwendet Server Actions für alle Mutationen (Umschalten,
|
|
291
|
-
- Der Sitzungs-Viewer parst das JSONL-Transkriptformat von Claude und rendert
|
|
289
|
+
- Seitenkomponenten rufen `lib/projects.ts` und `lib/log-entries.ts` auf, um Projekt- und Sitzungsdaten direkt aus dem Dateisystem zu lesen (keine API-Schicht für Lesevorgänge).
|
|
290
|
+
- Die Policies-Seite verwendet Server Actions für alle Mutationen (Umschalten, Parameteraktualisierung, Installieren/Entfernen).
|
|
291
|
+
- Der Sitzungs-Viewer parst das JSONL-Transkriptformat von Claude und rendert eine Zeitachse mit Nachrichten und Tool-Aufrufen.
|
|
292
292
|
|
|
293
293
|
**Wesentliche Designentscheidungen:**
|
|
294
294
|
|
|
295
295
|
- Keine Datenbank – der gesamte persistente Zustand liegt in einfachen Dateien (`~/.failproofai/`, `~/.claude/projects/`).
|
|
296
|
-
- Server Actions für Mutationen –
|
|
297
|
-
- React Server Components für
|
|
298
|
-
- Client-Komponenten nur dort, wo Interaktivität benötigt wird (
|
|
296
|
+
- Server Actions für Mutationen – keine REST-API für CRUD-Operationen erforderlich.
|
|
297
|
+
- React Server Components für Leseseiten – schnelleres initiales Laden, kein Client-Bundle für das Datenabrufen.
|
|
298
|
+
- Client-Komponenten nur dort, wo Interaktivität benötigt wird (Richtlinien-Schalter, Aktivitätssuche, Log-Viewer).
|
|
299
299
|
|
|
300
300
|
---
|
|
301
301
|
|
|
@@ -304,29 +304,29 @@ app/
|
|
|
304
304
|
```text
|
|
305
305
|
failproofai/
|
|
306
306
|
├── bin/
|
|
307
|
-
│ └── failproofai.mjs # CLI-Router (
|
|
307
|
+
│ └── failproofai.mjs # CLI-Router (Hook / Dashboard / Install / etc.)
|
|
308
308
|
├── src/hooks/
|
|
309
|
-
│ ├── handler.ts # Hook-
|
|
310
|
-
│ ├── builtin-policies.ts # 26
|
|
311
|
-
│ ├── policy-evaluator.ts #
|
|
312
|
-
│ ├── policy-registry.ts #
|
|
309
|
+
│ ├── handler.ts # Hook-Ereignis-Pipeline
|
|
310
|
+
│ ├── builtin-policies.ts # 26 Richtliniendefinitionen
|
|
311
|
+
│ ├── policy-evaluator.ts # Richtlinienausführungs-Engine
|
|
312
|
+
│ ├── policy-registry.ts # Richtlinienregistrierung und -suche
|
|
313
313
|
│ ├── policy-types.ts # TypeScript-Interfaces
|
|
314
|
-
│ ├── hooks-config.ts #
|
|
314
|
+
│ ├── hooks-config.ts # Konfigurationsladen mit mehreren Geltungsbereichen
|
|
315
315
|
│ ├── custom-hooks-registry.ts # globalThis-basierte Hook-Registry
|
|
316
316
|
│ ├── custom-hooks-loader.ts # ESM-Loader für benutzerdefinierte JS-Hooks
|
|
317
|
-
│ ├── manager.ts #
|
|
318
|
-
│ ├── install-prompt.ts # Interaktive
|
|
319
|
-
│ ├── hook-logger.ts # Protokollierung
|
|
320
|
-
│ ├── hook-activity-store.ts #
|
|
321
|
-
│ └── llm-client.ts # LLM-API-Client (für KI-gestützte
|
|
317
|
+
│ ├── manager.ts # Install-, Entfernen- und Listen-Operationen
|
|
318
|
+
│ ├── install-prompt.ts # Interaktive Richtlinienauswahl-Eingabeaufforderung
|
|
319
|
+
│ ├── hook-logger.ts # Protokollierung in hook.log
|
|
320
|
+
│ ├── hook-activity-store.ts # Aktivitäten in hook-activity.jsonl speichern
|
|
321
|
+
│ └── llm-client.ts # LLM-API-Client (für KI-gestützte Richtlinien)
|
|
322
322
|
├── app/ # Next.js-Dashboard (Seiten + Server Actions)
|
|
323
|
-
├── lib/ #
|
|
323
|
+
├── lib/ # Gemeinsam genutzte Hilfsfunktionen
|
|
324
324
|
│ ├── projects.ts # Claude-Projekte aus dem Dateisystem aufzählen
|
|
325
325
|
│ ├── log-entries.ts # Claude-Transkript-JSONL-Format parsen
|
|
326
326
|
│ ├── paths.ts # Systempfade auflösen
|
|
327
327
|
│ └── ...
|
|
328
|
-
├── components/ #
|
|
329
|
-
├── contexts/ # React-
|
|
328
|
+
├── components/ # Gemeinsam genutzte React-UI-Komponenten
|
|
329
|
+
├── contexts/ # React-Kontext-Provider (Theme, Auto-Refresh, Telemetrie)
|
|
330
330
|
├── examples/ # Beispieldateien für benutzerdefinierte Hooks
|
|
331
331
|
└── __tests__/ # Unit- und E2E-Tests
|
|
332
332
|
```
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Konfiguration
|
|
3
|
-
description: "Konfigurationsdateiformat, Drei-
|
|
3
|
+
description: "Konfigurationsdateiformat, Drei-Ebenen-System und Zusammenführungsregeln"
|
|
4
4
|
icon: gear
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
failproofai verwendet JSON-Konfigurationsdateien, um festzulegen, welche Richtlinien aktiv sind, wie sie sich verhalten und woher benutzerdefinierte Richtlinien geladen werden. Die Konfiguration ist
|
|
7
|
+
failproofai verwendet JSON-Konfigurationsdateien, um festzulegen, welche Richtlinien aktiv sind, wie sie sich verhalten und woher benutzerdefinierte Richtlinien geladen werden. Die Konfiguration ist darauf ausgelegt, einfach mit dem Team geteilt zu werden – checke sie in dein Repository ein, und jeder Entwickler profitiert vom gleichen Sicherheitsnetz für den Agenten.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Konfigurationsebenen
|
|
12
12
|
|
|
13
|
-
Es gibt drei
|
|
13
|
+
Es gibt drei Konfigurationsebenen, die in Prioritätsreihenfolge ausgewertet werden:
|
|
14
14
|
|
|
15
|
-
|
|
|
15
|
+
| Ebene | Dateipfad | Zweck |
|
|
16
16
|
|-------|-----------|-------|
|
|
17
|
-
| **project** | `.failproofai/policies-config.json` |
|
|
18
|
-
| **local** | `.failproofai/policies-config.local.json` | Persönliche
|
|
17
|
+
| **project** | `.failproofai/policies-config.json` | Repo-spezifische Einstellungen, in die Versionskontrolle eingecheckt |
|
|
18
|
+
| **local** | `.failproofai/policies-config.local.json` | Persönliche Repo-spezifische Überschreibungen, via gitignore ausgeschlossen |
|
|
19
19
|
| **global** | `~/.failproofai/policies-config.json` | Benutzerweite Standardeinstellungen für alle Projekte |
|
|
20
20
|
|
|
21
|
-
Wenn failproofai ein Hook-Ereignis empfängt, lädt und
|
|
21
|
+
Wenn failproofai ein Hook-Ereignis empfängt, lädt und fügt es alle drei Dateien zusammen, die für das aktuelle Arbeitsverzeichnis vorhanden sind.
|
|
22
22
|
|
|
23
23
|
### Zusammenführungsregeln
|
|
24
24
|
|
|
25
|
-
**`enabledPolicies`** – die Vereinigung aller drei
|
|
25
|
+
**`enabledPolicies`** – die Vereinigung aller drei Ebenen. Eine Richtlinie, die auf einer beliebigen Ebene aktiviert ist, ist aktiv.
|
|
26
26
|
|
|
27
27
|
```text
|
|
28
28
|
project: ["block-sudo"]
|
|
@@ -32,13 +32,13 @@ global: ["block-sudo", "sanitize-api-keys"]
|
|
|
32
32
|
resolved: ["block-sudo", "block-rm-rf", "sanitize-api-keys"] ← deduplizierte Vereinigung
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
**`policyParams`** –
|
|
35
|
+
**`policyParams`** – die erste Ebene, die Parameter für eine bestimmte Richtlinie definiert, gewinnt vollständig. Es findet kein tiefes Zusammenführen von Werten innerhalb der Parameter einer Richtlinie statt.
|
|
36
36
|
|
|
37
37
|
```text
|
|
38
38
|
project: block-sudo → { allowPatterns: ["sudo apt-get update"] }
|
|
39
39
|
global: block-sudo → { allowPatterns: ["sudo systemctl status"] }
|
|
40
40
|
|
|
41
|
-
resolved: { allowPatterns: ["sudo apt-get update"] } ← project gewinnt, global ignoriert
|
|
41
|
+
resolved: { allowPatterns: ["sudo apt-get update"] } ← project gewinnt, global wird ignoriert
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
```text
|
|
@@ -49,9 +49,9 @@ global: block-sudo → { allowPatterns: ["sudo systemctl status"] }
|
|
|
49
49
|
resolved: { allowPatterns: ["sudo systemctl status"] } ← fällt auf global zurück
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
**`customPoliciesPath`** –
|
|
52
|
+
**`customPoliciesPath`** – die erste Ebene, die diesen Wert definiert, gewinnt.
|
|
53
53
|
|
|
54
|
-
**`llm`** –
|
|
54
|
+
**`llm`** – die erste Ebene, die diesen Wert definiert, gewinnt.
|
|
55
55
|
|
|
56
56
|
---
|
|
57
57
|
|
|
@@ -102,25 +102,25 @@ resolved: { allowPatterns: ["sudo systemctl status"] } ← fällt auf global zu
|
|
|
102
102
|
|
|
103
103
|
Typ: `string[]`
|
|
104
104
|
|
|
105
|
-
Liste der zu aktivierenden Richtliniennamen. Die Namen müssen exakt mit den Richtlinienbezeichnern übereinstimmen, die von `failproofai policies` angezeigt werden.
|
|
105
|
+
Liste der zu aktivierenden Richtliniennamen. Die Namen müssen exakt mit den Richtlinienbezeichnern übereinstimmen, die von `failproofai policies` angezeigt werden. Eine vollständige Liste findest du unter [Integrierte Richtlinien](/de/built-in-policies).
|
|
106
106
|
|
|
107
|
-
Richtlinien, die nicht in `enabledPolicies` aufgeführt sind, sind inaktiv
|
|
107
|
+
Richtlinien, die nicht in `enabledPolicies` aufgeführt sind, sind inaktiv – auch wenn sie Einträge in `policyParams` haben.
|
|
108
108
|
|
|
109
109
|
### `policyParams`
|
|
110
110
|
|
|
111
111
|
Typ: `Record<string, Record<string, unknown>>`
|
|
112
112
|
|
|
113
|
-
Richtlinienspezifische Parameterüberschreibungen. Der äußere Schlüssel ist der Richtlinienname
|
|
113
|
+
Richtlinienspezifische Parameterüberschreibungen. Der äußere Schlüssel ist der Richtlinienname, die inneren Schlüssel sind richtlinienspezifisch. Jede Richtlinie dokumentiert ihre verfügbaren Parameter unter [Integrierte Richtlinien](/de/built-in-policies).
|
|
114
114
|
|
|
115
|
-
Wenn eine Richtlinie Parameter hat,
|
|
115
|
+
Wenn eine Richtlinie Parameter hat, du diese aber nicht angibst, werden die integrierten Standardwerte der Richtlinie verwendet. Benutzer, die `policyParams` gar nicht konfigurieren, erhalten identisches Verhalten wie in früheren Versionen.
|
|
116
116
|
|
|
117
|
-
Unbekannte Schlüssel innerhalb des Parameterblocks einer Richtlinie werden zum Zeitpunkt der Hook-
|
|
117
|
+
Unbekannte Schlüssel innerhalb des Parameterblocks einer Richtlinie werden zum Zeitpunkt der Hook-Ausführung still ignoriert, aber als Warnungen ausgegeben, wenn du `failproofai policies` ausführst.
|
|
118
118
|
|
|
119
119
|
#### `hint` (übergreifend)
|
|
120
120
|
|
|
121
121
|
Typ: `string` (optional)
|
|
122
122
|
|
|
123
|
-
Eine Nachricht, die
|
|
123
|
+
Eine Nachricht, die dem Grund hinzugefügt wird, wenn eine Richtlinie `deny` oder `instruct` zurückgibt. Verwende sie, um Claude handlungsorientierte Hinweise zu geben, ohne die Richtlinie selbst zu ändern.
|
|
124
124
|
|
|
125
125
|
Funktioniert mit jedem Richtlinientyp – integriert, benutzerdefiniert (`custom/`), Projektkonvention (`.failproofai-project/`) oder Benutzerkonvention (`.failproofai-user/`).
|
|
126
126
|
|
|
@@ -141,9 +141,9 @@ Funktioniert mit jedem Richtlinientyp – integriert, benutzerdefiniert (`custom
|
|
|
141
141
|
}
|
|
142
142
|
```
|
|
143
143
|
|
|
144
|
-
Wenn `block-force-push`
|
|
144
|
+
Wenn `block-force-push` ablehnt, sieht Claude: *„Force-Pushing ist blockiert. Try creating a fresh branch instead."*
|
|
145
145
|
|
|
146
|
-
Nicht-String-Werte und leere
|
|
146
|
+
Nicht-String-Werte und leere Zeichenfolgen werden still ignoriert. Wenn `hint` nicht gesetzt ist, bleibt das Verhalten unverändert (abwärtskompatibel).
|
|
147
147
|
|
|
148
148
|
### `customPoliciesPath`
|
|
149
149
|
|
|
@@ -151,24 +151,24 @@ Typ: `string` (absoluter Pfad)
|
|
|
151
151
|
|
|
152
152
|
Pfad zu einer JavaScript-Datei mit benutzerdefinierten Hook-Richtlinien. Dieser Wert wird automatisch durch `failproofai policies --install --custom <path>` gesetzt (der Pfad wird vor der Speicherung in einen absoluten Pfad aufgelöst).
|
|
153
153
|
|
|
154
|
-
Die Datei wird bei jedem Hook-Ereignis neu geladen – es gibt kein Caching.
|
|
154
|
+
Die Datei wird bei jedem Hook-Ereignis neu geladen – es gibt kein Caching. Einzelheiten zur Erstellung findest du unter [Benutzerdefinierte Richtlinien](/de/custom-policies).
|
|
155
155
|
|
|
156
156
|
### Konventionsbasierte Richtlinien
|
|
157
157
|
|
|
158
158
|
Zusätzlich zum expliziten `customPoliciesPath` erkennt und lädt failproofai automatisch Richtliniendateien aus `.failproofai/policies/`-Verzeichnissen:
|
|
159
159
|
|
|
160
|
-
| Ebene | Verzeichnis |
|
|
161
|
-
|
|
162
|
-
| Projekt | `.failproofai/policies/` |
|
|
160
|
+
| Ebene | Verzeichnis | Geltungsbereich |
|
|
161
|
+
|-------|-------------|-----------------|
|
|
162
|
+
| Projekt | `.failproofai/policies/` | Gemeinsam mit dem Team über die Versionskontrolle |
|
|
163
163
|
| Benutzer | `~/.failproofai/policies/` | Persönlich, gilt für alle Projekte |
|
|
164
164
|
|
|
165
165
|
**Dateiabgleich:** Es werden nur Dateien geladen, die dem Muster `*policies.{js,mjs,ts}` entsprechen (z. B. `security-policies.mjs`, `workflow-policies.js`). Andere Dateien im Verzeichnis werden ignoriert.
|
|
166
166
|
|
|
167
|
-
**Keine Konfiguration
|
|
167
|
+
**Keine Konfiguration nötig:** Konventionsrichtlinien benötigen keine Einträge in `policies-config.json`. Lege die Dateien einfach im Verzeichnis ab, und sie werden beim nächsten Hook-Ereignis aufgegriffen.
|
|
168
168
|
|
|
169
|
-
**Vereinigtes Laden:** Sowohl das Projekt- als auch das Benutzerkonventionsverzeichnis werden durchsucht. Alle
|
|
169
|
+
**Vereinigtes Laden:** Sowohl das Projekt- als auch das Benutzerkonventionsverzeichnis werden durchsucht. Alle übereinstimmenden Dateien aus beiden Ebenen werden geladen (im Gegensatz zu `customPoliciesPath`, das nach dem Prinzip „erste Ebene gewinnt" vorgeht).
|
|
170
170
|
|
|
171
|
-
Weitere Details und Beispiele
|
|
171
|
+
Weitere Details und Beispiele findest du unter [Benutzerdefinierte Richtlinien](/de/custom-policies).
|
|
172
172
|
|
|
173
173
|
### `llm`
|
|
174
174
|
|
|
@@ -189,18 +189,18 @@ LLM-Client-Konfiguration für Richtlinien, die KI-Aufrufe durchführen. Für die
|
|
|
189
189
|
|
|
190
190
|
## Konfiguration über die CLI verwalten
|
|
191
191
|
|
|
192
|
-
Die Befehle `policies --install` und `policies --uninstall` schreiben in Claude Codes `settings.json` (die Hook-Einstiegspunkte), während `policies-config.json` die Datei ist, die
|
|
192
|
+
Die Befehle `policies --install` und `policies --uninstall` schreiben in Claude Codes `settings.json` (die Hook-Einstiegspunkte), während `policies-config.json` die Datei ist, die du direkt verwaltest. Beide sind voneinander getrennt:
|
|
193
193
|
|
|
194
|
-
- **`settings.json`** – weist Claude Code an, bei jeder
|
|
195
|
-
- **`policies-config.json`** –
|
|
194
|
+
- **`settings.json`** – weist Claude Code an, bei jeder Tool-Nutzung `failproofai --hook <event>` aufzurufen
|
|
195
|
+
- **`policies-config.json`** – weist failproofai an, welche Richtlinien mit welchen Parametern ausgewertet werden sollen
|
|
196
196
|
|
|
197
|
-
|
|
197
|
+
Du kannst `policies-config.json` jederzeit direkt bearbeiten; Änderungen treten beim nächsten Hook-Ereignis sofort in Kraft – kein Neustart erforderlich.
|
|
198
198
|
|
|
199
199
|
---
|
|
200
200
|
|
|
201
201
|
## Beispiel: Konfiguration auf Projektebene mit Team-Standardwerten
|
|
202
202
|
|
|
203
|
-
|
|
203
|
+
Checke `.failproofai/policies-config.json` in dein Repository ein:
|
|
204
204
|
|
|
205
205
|
```json
|
|
206
206
|
{
|
|
@@ -219,4 +219,4 @@ Committen Sie `.failproofai/policies-config.json` in Ihr Repository:
|
|
|
219
219
|
}
|
|
220
220
|
```
|
|
221
221
|
|
|
222
|
-
Jeder Entwickler kann dann `.failproofai/policies-config.local.json` (
|
|
222
|
+
Jeder Entwickler kann dann `.failproofai/policies-config.local.json` (via gitignore ausgeschlossen) für persönliche Überschreibungen erstellen, ohne die Teammitglieder zu beeinflussen.
|