failproofai 0.0.6-beta.2 → 0.0.6-beta.4
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/.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 +7 -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 +17 -17
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +17 -17
- 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 +11 -11
- 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 +2 -2
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +16 -16
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +16 -16
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +11 -11
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +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/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]__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]__0i5kvry._.js → [root-of-the-server]__0om-5pe._.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]__05akje6._.js → [root-of-the-server]__111.vxi._.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/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0mebn66._.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/{05j1px0r8yzh6.js → 02dqjyv6_9mhq.js} +2 -2
- package/.next/standalone/.next/static/chunks/{14cl9poem30dq.js → 070orfsl6.xal.js} +1 -1
- package/.next/standalone/.next/static/chunks/0mir9jdxn35~s.css +1 -0
- package/.next/standalone/.next/static/chunks/{00j0rr7rh8ef8.js → 0o547jv-k_k35.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0ijk_kek9_wyx.js → 0pk2h2.mjxy.m.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0xpl.oscrakvx.js → 0rcwkbh24w38b.js} +1 -1
- package/.next/standalone/.next/static/chunks/{1052sguyd-.ka.js → 140xx_tfr~lm_.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0npb~873.wvg3.js → 169_e4dq~1~b6.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0badv41uxa56..js → 17ne4p.1sw1jy.js} +1 -1
- package/.next/standalone/next.config.ts +6 -0
- package/.next/standalone/package.json +2 -2
- package/.next/standalone/server.js +1 -1
- package/bin/failproofai.mjs +91 -4
- package/dist/cli.mjs +1155 -54
- package/package.json +2 -2
- package/scripts/prune-standalone.mjs +128 -0
- 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 +22 -20
- 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/.claude/settings.json +0 -316
- package/.next/standalone/.failproofai/policies/review-policies.mjs +0 -113
- package/.next/standalone/.failproofai/policies/workflow-policies.mjs +0 -63
- package/.next/standalone/.failproofai/policies-config.json +0 -39
- package/.next/standalone/.next/static/chunks/0gu_a.a80ritd.css +0 -1
- package/.next/standalone/AGENTS.md +0 -80
- package/.next/standalone/CHANGELOG.md +0 -151
- package/.next/standalone/CLAUDE.md +0 -165
- package/.next/standalone/CONTRIBUTING.md +0 -76
- package/.next/standalone/Dockerfile.docs +0 -12
- package/.next/standalone/LICENSE +0 -42
- package/.next/standalone/README.md +0 -301
- package/.next/standalone/bin/failproofai.mjs +0 -352
- package/.next/standalone/bun.lock +0 -1119
- package/.next/standalone/components.json +0 -23
- package/.next/standalone/dist/cli.mjs +0 -3595
- package/.next/standalone/dist/index.js +0 -80
- package/.next/standalone/docs/ar/architecture.mdx +0 -334
- package/.next/standalone/docs/ar/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/ar/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ar/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ar/cli/hook.mdx +0 -31
- package/.next/standalone/docs/ar/cli/install-policies.mdx +0 -48
- package/.next/standalone/docs/ar/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/ar/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ar/cli/version.mdx +0 -13
- package/.next/standalone/docs/ar/configuration.mdx +0 -223
- package/.next/standalone/docs/ar/custom-policies.mdx +0 -354
- package/.next/standalone/docs/ar/dashboard.mdx +0 -142
- package/.next/standalone/docs/ar/examples.mdx +0 -307
- package/.next/standalone/docs/ar/for-agents.mdx +0 -39
- package/.next/standalone/docs/ar/getting-started.mdx +0 -187
- package/.next/standalone/docs/ar/introduction.mdx +0 -58
- package/.next/standalone/docs/ar/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ar/testing.mdx +0 -261
- package/.next/standalone/docs/architecture.mdx +0 -332
- package/.next/standalone/docs/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/cli/hook.mdx +0 -30
- package/.next/standalone/docs/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/cli/version.mdx +0 -12
- package/.next/standalone/docs/configuration.mdx +0 -222
- package/.next/standalone/docs/custom-policies.mdx +0 -353
- package/.next/standalone/docs/dashboard.mdx +0 -142
- package/.next/standalone/docs/de/architecture.mdx +0 -332
- package/.next/standalone/docs/de/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/de/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/de/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/de/cli/hook.mdx +0 -30
- package/.next/standalone/docs/de/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/de/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/de/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/de/cli/version.mdx +0 -12
- package/.next/standalone/docs/de/configuration.mdx +0 -222
- package/.next/standalone/docs/de/custom-policies.mdx +0 -353
- package/.next/standalone/docs/de/dashboard.mdx +0 -142
- package/.next/standalone/docs/de/examples.mdx +0 -307
- package/.next/standalone/docs/de/for-agents.mdx +0 -38
- package/.next/standalone/docs/de/getting-started.mdx +0 -186
- package/.next/standalone/docs/de/introduction.mdx +0 -57
- package/.next/standalone/docs/de/package-aliases.mdx +0 -82
- package/.next/standalone/docs/de/testing.mdx +0 -260
- package/.next/standalone/docs/docs.json +0 -1002
- package/.next/standalone/docs/es/architecture.mdx +0 -332
- package/.next/standalone/docs/es/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/es/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/es/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/es/cli/hook.mdx +0 -30
- package/.next/standalone/docs/es/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/es/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/es/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/es/cli/version.mdx +0 -12
- package/.next/standalone/docs/es/configuration.mdx +0 -222
- package/.next/standalone/docs/es/custom-policies.mdx +0 -353
- package/.next/standalone/docs/es/dashboard.mdx +0 -142
- package/.next/standalone/docs/es/examples.mdx +0 -307
- package/.next/standalone/docs/es/for-agents.mdx +0 -38
- package/.next/standalone/docs/es/getting-started.mdx +0 -186
- package/.next/standalone/docs/es/introduction.mdx +0 -57
- package/.next/standalone/docs/es/package-aliases.mdx +0 -82
- package/.next/standalone/docs/es/testing.mdx +0 -260
- package/.next/standalone/docs/examples.mdx +0 -307
- package/.next/standalone/docs/favicon.ico +0 -0
- package/.next/standalone/docs/for-agents.mdx +0 -38
- package/.next/standalone/docs/fr/architecture.mdx +0 -332
- package/.next/standalone/docs/fr/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/fr/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/fr/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/fr/cli/hook.mdx +0 -30
- package/.next/standalone/docs/fr/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/fr/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/fr/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/fr/cli/version.mdx +0 -12
- package/.next/standalone/docs/fr/configuration.mdx +0 -222
- package/.next/standalone/docs/fr/custom-policies.mdx +0 -353
- package/.next/standalone/docs/fr/dashboard.mdx +0 -142
- package/.next/standalone/docs/fr/examples.mdx +0 -307
- package/.next/standalone/docs/fr/for-agents.mdx +0 -38
- package/.next/standalone/docs/fr/getting-started.mdx +0 -186
- package/.next/standalone/docs/fr/introduction.mdx +0 -57
- package/.next/standalone/docs/fr/package-aliases.mdx +0 -82
- package/.next/standalone/docs/fr/testing.mdx +0 -260
- package/.next/standalone/docs/getting-started.mdx +0 -186
- package/.next/standalone/docs/he/architecture.mdx +0 -333
- package/.next/standalone/docs/he/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/he/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/he/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/he/cli/hook.mdx +0 -30
- package/.next/standalone/docs/he/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/he/cli/list-policies.mdx +0 -32
- package/.next/standalone/docs/he/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/he/cli/version.mdx +0 -12
- package/.next/standalone/docs/he/configuration.mdx +0 -223
- package/.next/standalone/docs/he/custom-policies.mdx +0 -353
- package/.next/standalone/docs/he/dashboard.mdx +0 -142
- package/.next/standalone/docs/he/examples.mdx +0 -307
- package/.next/standalone/docs/he/for-agents.mdx +0 -38
- package/.next/standalone/docs/he/getting-started.mdx +0 -186
- package/.next/standalone/docs/he/introduction.mdx +0 -57
- package/.next/standalone/docs/he/package-aliases.mdx +0 -82
- package/.next/standalone/docs/he/testing.mdx +0 -260
- package/.next/standalone/docs/hi/architecture.mdx +0 -334
- package/.next/standalone/docs/hi/built-in-policies.mdx +0 -576
- package/.next/standalone/docs/hi/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/hi/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/hi/cli/hook.mdx +0 -30
- package/.next/standalone/docs/hi/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/hi/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/hi/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/hi/cli/version.mdx +0 -12
- package/.next/standalone/docs/hi/configuration.mdx +0 -222
- package/.next/standalone/docs/hi/custom-policies.mdx +0 -354
- package/.next/standalone/docs/hi/dashboard.mdx +0 -142
- package/.next/standalone/docs/hi/examples.mdx +0 -309
- package/.next/standalone/docs/hi/for-agents.mdx +0 -38
- package/.next/standalone/docs/hi/getting-started.mdx +0 -187
- package/.next/standalone/docs/hi/introduction.mdx +0 -57
- package/.next/standalone/docs/hi/package-aliases.mdx +0 -82
- package/.next/standalone/docs/hi/testing.mdx +0 -260
- package/.next/standalone/docs/i18n/README.ar.md +0 -312
- package/.next/standalone/docs/i18n/README.de.md +0 -307
- package/.next/standalone/docs/i18n/README.es.md +0 -307
- package/.next/standalone/docs/i18n/README.fr.md +0 -307
- package/.next/standalone/docs/i18n/README.he.md +0 -312
- package/.next/standalone/docs/i18n/README.hi.md +0 -307
- package/.next/standalone/docs/i18n/README.it.md +0 -307
- package/.next/standalone/docs/i18n/README.ja.md +0 -307
- package/.next/standalone/docs/i18n/README.ko.md +0 -307
- package/.next/standalone/docs/i18n/README.pt-br.md +0 -307
- package/.next/standalone/docs/i18n/README.ru.md +0 -308
- package/.next/standalone/docs/i18n/README.tr.md +0 -307
- package/.next/standalone/docs/i18n/README.vi.md +0 -307
- package/.next/standalone/docs/i18n/README.zh.md +0 -307
- package/.next/standalone/docs/introduction.mdx +0 -57
- package/.next/standalone/docs/it/architecture.mdx +0 -334
- package/.next/standalone/docs/it/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/it/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/it/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/it/cli/hook.mdx +0 -30
- package/.next/standalone/docs/it/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/it/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/it/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/it/cli/version.mdx +0 -12
- package/.next/standalone/docs/it/configuration.mdx +0 -222
- package/.next/standalone/docs/it/custom-policies.mdx +0 -353
- package/.next/standalone/docs/it/dashboard.mdx +0 -142
- package/.next/standalone/docs/it/examples.mdx +0 -307
- package/.next/standalone/docs/it/for-agents.mdx +0 -38
- package/.next/standalone/docs/it/getting-started.mdx +0 -186
- package/.next/standalone/docs/it/introduction.mdx +0 -57
- package/.next/standalone/docs/it/package-aliases.mdx +0 -82
- package/.next/standalone/docs/it/testing.mdx +0 -260
- package/.next/standalone/docs/ja/architecture.mdx +0 -332
- package/.next/standalone/docs/ja/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/ja/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ja/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ja/cli/hook.mdx +0 -30
- package/.next/standalone/docs/ja/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/ja/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/ja/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ja/cli/version.mdx +0 -12
- package/.next/standalone/docs/ja/configuration.mdx +0 -222
- package/.next/standalone/docs/ja/custom-policies.mdx +0 -353
- package/.next/standalone/docs/ja/dashboard.mdx +0 -142
- package/.next/standalone/docs/ja/examples.mdx +0 -307
- package/.next/standalone/docs/ja/for-agents.mdx +0 -38
- package/.next/standalone/docs/ja/getting-started.mdx +0 -186
- package/.next/standalone/docs/ja/introduction.mdx +0 -57
- package/.next/standalone/docs/ja/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ja/testing.mdx +0 -260
- package/.next/standalone/docs/ko/architecture.mdx +0 -332
- package/.next/standalone/docs/ko/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/ko/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ko/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ko/cli/hook.mdx +0 -30
- package/.next/standalone/docs/ko/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/ko/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/ko/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ko/cli/version.mdx +0 -12
- package/.next/standalone/docs/ko/configuration.mdx +0 -222
- package/.next/standalone/docs/ko/custom-policies.mdx +0 -353
- package/.next/standalone/docs/ko/dashboard.mdx +0 -142
- package/.next/standalone/docs/ko/examples.mdx +0 -307
- package/.next/standalone/docs/ko/for-agents.mdx +0 -38
- package/.next/standalone/docs/ko/getting-started.mdx +0 -186
- package/.next/standalone/docs/ko/introduction.mdx +0 -57
- package/.next/standalone/docs/ko/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ko/testing.mdx +0 -260
- package/.next/standalone/docs/logo/dark.svg +0 -21
- package/.next/standalone/docs/logo/exosphere-dark.png +0 -0
- package/.next/standalone/docs/logo/exosphere-light.png +0 -0
- package/.next/standalone/docs/logo/light.svg +0 -21
- package/.next/standalone/docs/package-aliases.mdx +0 -82
- package/.next/standalone/docs/pt-br/architecture.mdx +0 -332
- package/.next/standalone/docs/pt-br/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/pt-br/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/pt-br/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/pt-br/cli/hook.mdx +0 -30
- package/.next/standalone/docs/pt-br/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/pt-br/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/pt-br/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/pt-br/cli/version.mdx +0 -12
- package/.next/standalone/docs/pt-br/configuration.mdx +0 -222
- package/.next/standalone/docs/pt-br/custom-policies.mdx +0 -353
- package/.next/standalone/docs/pt-br/dashboard.mdx +0 -142
- package/.next/standalone/docs/pt-br/examples.mdx +0 -307
- package/.next/standalone/docs/pt-br/for-agents.mdx +0 -38
- package/.next/standalone/docs/pt-br/getting-started.mdx +0 -186
- package/.next/standalone/docs/pt-br/introduction.mdx +0 -57
- package/.next/standalone/docs/pt-br/package-aliases.mdx +0 -82
- package/.next/standalone/docs/pt-br/testing.mdx +0 -260
- package/.next/standalone/docs/ru/architecture.mdx +0 -333
- package/.next/standalone/docs/ru/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/ru/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ru/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ru/cli/hook.mdx +0 -30
- package/.next/standalone/docs/ru/cli/install-policies.mdx +0 -48
- package/.next/standalone/docs/ru/cli/list-policies.mdx +0 -32
- package/.next/standalone/docs/ru/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ru/cli/version.mdx +0 -12
- package/.next/standalone/docs/ru/configuration.mdx +0 -222
- package/.next/standalone/docs/ru/custom-policies.mdx +0 -354
- package/.next/standalone/docs/ru/dashboard.mdx +0 -142
- package/.next/standalone/docs/ru/examples.mdx +0 -309
- package/.next/standalone/docs/ru/for-agents.mdx +0 -38
- package/.next/standalone/docs/ru/getting-started.mdx +0 -186
- package/.next/standalone/docs/ru/introduction.mdx +0 -57
- package/.next/standalone/docs/ru/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ru/testing.mdx +0 -260
- package/.next/standalone/docs/testing.mdx +0 -260
- package/.next/standalone/docs/tr/architecture.mdx +0 -333
- package/.next/standalone/docs/tr/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/tr/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/tr/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/tr/cli/hook.mdx +0 -30
- package/.next/standalone/docs/tr/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/tr/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/tr/cli/remove-policies.mdx +0 -44
- package/.next/standalone/docs/tr/cli/version.mdx +0 -12
- package/.next/standalone/docs/tr/configuration.mdx +0 -222
- package/.next/standalone/docs/tr/custom-policies.mdx +0 -353
- package/.next/standalone/docs/tr/dashboard.mdx +0 -142
- package/.next/standalone/docs/tr/examples.mdx +0 -308
- package/.next/standalone/docs/tr/for-agents.mdx +0 -38
- package/.next/standalone/docs/tr/getting-started.mdx +0 -186
- package/.next/standalone/docs/tr/introduction.mdx +0 -57
- package/.next/standalone/docs/tr/package-aliases.mdx +0 -82
- package/.next/standalone/docs/tr/testing.mdx +0 -260
- package/.next/standalone/docs/vi/architecture.mdx +0 -334
- package/.next/standalone/docs/vi/built-in-policies.mdx +0 -575
- package/.next/standalone/docs/vi/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/vi/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/vi/cli/hook.mdx +0 -30
- package/.next/standalone/docs/vi/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/vi/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/vi/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/vi/cli/version.mdx +0 -13
- package/.next/standalone/docs/vi/configuration.mdx +0 -222
- package/.next/standalone/docs/vi/custom-policies.mdx +0 -353
- package/.next/standalone/docs/vi/dashboard.mdx +0 -142
- package/.next/standalone/docs/vi/examples.mdx +0 -308
- package/.next/standalone/docs/vi/for-agents.mdx +0 -38
- package/.next/standalone/docs/vi/getting-started.mdx +0 -186
- package/.next/standalone/docs/vi/introduction.mdx +0 -57
- package/.next/standalone/docs/vi/package-aliases.mdx +0 -82
- package/.next/standalone/docs/vi/testing.mdx +0 -260
- package/.next/standalone/docs/zh/architecture.mdx +0 -332
- package/.next/standalone/docs/zh/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/zh/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/zh/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/zh/cli/hook.mdx +0 -30
- package/.next/standalone/docs/zh/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/zh/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/zh/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/zh/cli/version.mdx +0 -12
- package/.next/standalone/docs/zh/configuration.mdx +0 -222
- package/.next/standalone/docs/zh/custom-policies.mdx +0 -353
- package/.next/standalone/docs/zh/dashboard.mdx +0 -142
- package/.next/standalone/docs/zh/examples.mdx +0 -307
- package/.next/standalone/docs/zh/for-agents.mdx +0 -38
- package/.next/standalone/docs/zh/getting-started.mdx +0 -186
- package/.next/standalone/docs/zh/introduction.mdx +0 -57
- package/.next/standalone/docs/zh/package-aliases.mdx +0 -82
- package/.next/standalone/docs/zh/testing.mdx +0 -260
- package/.next/standalone/eslint.config.mjs +0 -15
- package/.next/standalone/examples/convention-policies/security-policies.mjs +0 -40
- package/.next/standalone/examples/convention-policies/workflow-policies.mjs +0 -41
- package/.next/standalone/examples/policies-advanced/index.js +0 -103
- package/.next/standalone/examples/policies-advanced/utils.js +0 -35
- package/.next/standalone/examples/policies-basic.js +0 -77
- package/.next/standalone/examples/policies-notification.js +0 -104
- package/.next/standalone/node_modules/@img/colour/color.cjs +0 -1594
- package/.next/standalone/node_modules/@img/colour/index.cjs +0 -1
- package/.next/standalone/node_modules/@img/colour/package.json +0 -45
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/README.md +0 -46
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/glib-2.0/include/glibconfig.h +0 -221
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/index.js +0 -1
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/package.json +0 -42
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/versions.json +0 -30
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/README.md +0 -46
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/glib-2.0/include/glibconfig.h +0 -221
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +0 -1
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +0 -42
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +0 -30
- package/.next/standalone/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
- package/.next/standalone/node_modules/@img/sharp-linux-x64/package.json +0 -46
- package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
- package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +0 -46
- package/.next/standalone/node_modules/detect-libc/lib/detect-libc.js +0 -313
- package/.next/standalone/node_modules/detect-libc/lib/elf.js +0 -39
- package/.next/standalone/node_modules/detect-libc/lib/filesystem.js +0 -51
- package/.next/standalone/node_modules/detect-libc/lib/process.js +0 -24
- package/.next/standalone/node_modules/detect-libc/package.json +0 -44
- package/.next/standalone/node_modules/sharp/lib/channel.js +0 -177
- package/.next/standalone/node_modules/sharp/lib/colour.js +0 -195
- package/.next/standalone/node_modules/sharp/lib/composite.js +0 -212
- package/.next/standalone/node_modules/sharp/lib/constructor.js +0 -499
- package/.next/standalone/node_modules/sharp/lib/index.js +0 -16
- package/.next/standalone/node_modules/sharp/lib/input.js +0 -809
- package/.next/standalone/node_modules/sharp/lib/is.js +0 -143
- package/.next/standalone/node_modules/sharp/lib/libvips.js +0 -207
- package/.next/standalone/node_modules/sharp/lib/operation.js +0 -1016
- package/.next/standalone/node_modules/sharp/lib/output.js +0 -1666
- package/.next/standalone/node_modules/sharp/lib/resize.js +0 -595
- package/.next/standalone/node_modules/sharp/lib/sharp.js +0 -121
- package/.next/standalone/node_modules/sharp/lib/utility.js +0 -291
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/comparator.js +0 -143
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/range.js +0 -557
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/semver.js +0 -333
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/cmp.js +0 -54
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/coerce.js +0 -62
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/compare.js +0 -7
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/eq.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gt.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gte.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lt.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lte.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/neq.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/parse.js +0 -18
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/satisfies.js +0 -12
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/constants.js +0 -37
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/debug.js +0 -11
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/identifiers.js +0 -29
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/lrucache.js +0 -42
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/parse-options.js +0 -17
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/re.js +0 -223
- package/.next/standalone/node_modules/sharp/node_modules/semver/package.json +0 -78
- package/.next/standalone/node_modules/sharp/package.json +0 -202
- package/.next/standalone/scripts/alias-proxy.js +0 -18
- package/.next/standalone/scripts/dev.ts +0 -3
- package/.next/standalone/scripts/install-telemetry.mjs +0 -108
- package/.next/standalone/scripts/launch.ts +0 -83
- package/.next/standalone/scripts/parse-script-args.ts +0 -87
- package/.next/standalone/scripts/postinstall.mjs +0 -121
- package/.next/standalone/scripts/preuninstall.mjs +0 -131
- package/.next/standalone/scripts/publish-aliases.mjs +0 -87
- package/.next/standalone/scripts/start.ts +0 -3
- package/.next/standalone/scripts/sync-hook-events-prompt.md +0 -60
- package/.next/standalone/scripts/translate-docs/cache.ts +0 -62
- package/.next/standalone/scripts/translate-docs/cli.ts +0 -357
- package/.next/standalone/scripts/translate-docs/config.ts +0 -248
- package/.next/standalone/scripts/translate-docs/mdx-translator.ts +0 -153
- package/.next/standalone/scripts/translate-docs/mintlify-nav.ts +0 -107
- package/.next/standalone/scripts/translate-docs/readme-translator.ts +0 -154
- package/.next/standalone/scripts/translate-docs/translator.ts +0 -68
- package/.next/standalone/scripts/translate-docs/types.ts +0 -43
- package/.next/standalone/src/cli-error.ts +0 -18
- package/.next/standalone/src/hooks/builtin-policies.ts +0 -1613
- package/.next/standalone/src/hooks/custom-hooks-loader.ts +0 -205
- package/.next/standalone/src/hooks/custom-hooks-registry.ts +0 -30
- package/.next/standalone/src/hooks/handler.ts +0 -202
- package/.next/standalone/src/hooks/hook-activity-store.ts +0 -349
- package/.next/standalone/src/hooks/hook-logger.ts +0 -133
- package/.next/standalone/src/hooks/hook-telemetry.ts +0 -43
- package/.next/standalone/src/hooks/hooks-config.ts +0 -166
- package/.next/standalone/src/hooks/install-prompt.ts +0 -357
- package/.next/standalone/src/hooks/llm-client.ts +0 -90
- package/.next/standalone/src/hooks/loader-utils.ts +0 -178
- package/.next/standalone/src/hooks/manager.ts +0 -692
- package/.next/standalone/src/hooks/policy-evaluator.ts +0 -224
- package/.next/standalone/src/hooks/policy-helpers.ts +0 -16
- package/.next/standalone/src/hooks/policy-registry.ts +0 -90
- package/.next/standalone/src/hooks/policy-types.ts +0 -77
- package/.next/standalone/src/hooks/types.ts +0 -63
- package/.next/standalone/src/index.ts +0 -19
- package/.next/standalone/src/posthog-key.ts +0 -5
- package/.next/standalone/tailwind.config.ts +0 -11
- package/.next/standalone/tsconfig.json +0 -42
- package/.next/standalone/vitest.config.e2e.mts +0 -24
- package/.next/standalone/vitest.config.mts +0 -23
- /package/.next/standalone/.next/static/{A9pNTZdoYJTVyPAYwQMx5 → wOkJXoch1UmRAmyIuKZWc}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{A9pNTZdoYJTVyPAYwQMx5 → wOkJXoch1UmRAmyIuKZWc}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{A9pNTZdoYJTVyPAYwQMx5 → wOkJXoch1UmRAmyIuKZWc}/_ssgManifest.js +0 -0
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Testes
|
|
3
|
-
description: "Testes unitários, testes E2E e utilitários de teste"
|
|
4
|
-
icon: flask-vial
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
failproofai possui duas suítes de testes: **testes unitários** (rápidos, com mocks) e **testes end-to-end** (invocações reais de subprocessos).
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Executando os testes
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
# Executar todos os testes unitários uma vez
|
|
15
|
-
bun run test:run
|
|
16
|
-
|
|
17
|
-
# Executar testes unitários em modo watch
|
|
18
|
-
bun run test
|
|
19
|
-
|
|
20
|
-
# Executar testes E2E (requer configuração - veja abaixo)
|
|
21
|
-
bun run test:e2e
|
|
22
|
-
|
|
23
|
-
# Verificar tipos sem compilar
|
|
24
|
-
bunx tsc --noEmit
|
|
25
|
-
|
|
26
|
-
# Lint
|
|
27
|
-
bun run lint
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## Testes unitários
|
|
33
|
-
|
|
34
|
-
Os testes unitários ficam em `__tests__/` e utilizam o [Vitest](https://vitest.dev) com `happy-dom`.
|
|
35
|
-
|
|
36
|
-
```text
|
|
37
|
-
__tests__/
|
|
38
|
-
hooks/
|
|
39
|
-
builtin-policies.test.ts # Lógica de políticas para cada builtin
|
|
40
|
-
hooks-config.test.ts # Carregamento de configuração e mesclagem de escopos
|
|
41
|
-
policy-evaluator.test.ts # Injeção de parâmetros e ordem de avaliação
|
|
42
|
-
custom-hooks-registry.test.ts # Registro globalThis: add/get/clear
|
|
43
|
-
custom-hooks-loader.test.ts # Loader ESM, imports transitivos, tratamento de erros
|
|
44
|
-
manager.test.ts # Operações install/remove/list
|
|
45
|
-
components/
|
|
46
|
-
sessions-list.test.tsx # Componente de lista de sessões
|
|
47
|
-
project-list.test.tsx # Componente de lista de projetos
|
|
48
|
-
...
|
|
49
|
-
lib/
|
|
50
|
-
logger.test.ts
|
|
51
|
-
paths.test.ts
|
|
52
|
-
date-filters.test.ts
|
|
53
|
-
telemetry.test.ts
|
|
54
|
-
...
|
|
55
|
-
actions/
|
|
56
|
-
get-hooks-config.test.ts
|
|
57
|
-
get-hook-activity.test.ts
|
|
58
|
-
...
|
|
59
|
-
contexts/
|
|
60
|
-
ThemeContext.test.tsx
|
|
61
|
-
AutoRefreshContext.test.tsx
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### Escrevendo um teste unitário de política
|
|
65
|
-
|
|
66
|
-
```typescript
|
|
67
|
-
import { describe, it, expect, beforeEach } from "vitest";
|
|
68
|
-
import { getBuiltinPolicies } from "../../src/hooks/builtin-policies";
|
|
69
|
-
import { allow, deny } from "../../src/hooks/policy-types";
|
|
70
|
-
|
|
71
|
-
describe("block-sudo", () => {
|
|
72
|
-
const policy = getBuiltinPolicies().find((p) => p.name === "block-sudo")!;
|
|
73
|
-
|
|
74
|
-
it("denies sudo commands", () => {
|
|
75
|
-
const ctx = {
|
|
76
|
-
eventType: "PreToolUse" as const,
|
|
77
|
-
payload: {},
|
|
78
|
-
toolName: "Bash",
|
|
79
|
-
toolInput: { command: "sudo apt install nodejs" },
|
|
80
|
-
params: { allowPatterns: [] },
|
|
81
|
-
};
|
|
82
|
-
expect(policy.fn(ctx)).toEqual(deny("sudo command blocked by failproofai"));
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it("allows non-sudo commands", () => {
|
|
86
|
-
const ctx = {
|
|
87
|
-
eventType: "PreToolUse" as const,
|
|
88
|
-
payload: {},
|
|
89
|
-
toolName: "Bash",
|
|
90
|
-
toolInput: { command: "ls -la" },
|
|
91
|
-
params: { allowPatterns: [] },
|
|
92
|
-
};
|
|
93
|
-
expect(policy.fn(ctx)).toEqual(allow());
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it("allows patterns in allowPatterns", () => {
|
|
97
|
-
const ctx = {
|
|
98
|
-
eventType: "PreToolUse" as const,
|
|
99
|
-
payload: {},
|
|
100
|
-
toolName: "Bash",
|
|
101
|
-
toolInput: { command: "sudo systemctl status nginx" },
|
|
102
|
-
params: { allowPatterns: ["sudo systemctl status"] },
|
|
103
|
-
};
|
|
104
|
-
expect(policy.fn(ctx)).toEqual(allow());
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
## Testes end-to-end
|
|
112
|
-
|
|
113
|
-
Os testes E2E invocam o binário real do `failproofai` como subprocesso, enviam um payload JSON via stdin e verificam a saída no stdout e o código de saída. Isso testa o caminho completo de integração que o Claude Code utiliza.
|
|
114
|
-
|
|
115
|
-
### Configuração
|
|
116
|
-
|
|
117
|
-
Os testes E2E executam o binário diretamente do código-fonte do repositório. Antes da primeira execução, compile o bundle CJS que os arquivos de hook customizados usam ao importar de `'failproofai'`:
|
|
118
|
-
|
|
119
|
-
```bash
|
|
120
|
-
bun build src/index.ts --outdir dist --target node --format cjs
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
Em seguida, execute os testes:
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
bun run test:e2e
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
Recompile o `dist/` sempre que alterar a API pública de hooks (`src/hooks/custom-hooks-registry.ts`, `src/hooks/policy-helpers.ts` ou `src/hooks/policy-types.ts`).
|
|
130
|
-
|
|
131
|
-
### Estrutura dos testes E2E
|
|
132
|
-
|
|
133
|
-
```text
|
|
134
|
-
__tests__/e2e/
|
|
135
|
-
helpers/
|
|
136
|
-
hook-runner.ts # Inicia o binário, envia payload JSON, captura código de saída + stdout + stderr
|
|
137
|
-
fixture-env.ts # Diretórios temporários isolados por teste com arquivos de configuração
|
|
138
|
-
payloads.ts # Fábricas de payload compatíveis com Claude para cada tipo de evento
|
|
139
|
-
hooks/
|
|
140
|
-
builtin-policies.e2e.test.ts # Cada política builtin com subprocesso real
|
|
141
|
-
custom-hooks.e2e.test.ts # Carregamento e avaliação de hooks customizados
|
|
142
|
-
config-scopes.e2e.test.ts # Mesclagem de configuração entre escopos project/local/global
|
|
143
|
-
policy-params.e2e.test.ts # Injeção de parâmetros para cada política parametrizada
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
### Usando os utilitários E2E
|
|
147
|
-
|
|
148
|
-
**`FixtureEnv`** - ambiente isolado por teste:
|
|
149
|
-
|
|
150
|
-
```typescript
|
|
151
|
-
import { createFixtureEnv } from "../helpers/fixture-env";
|
|
152
|
-
|
|
153
|
-
const env = createFixtureEnv();
|
|
154
|
-
// env.cwd - diretório temporário; passe como payload.cwd para carregar .failproofai/policies-config.json
|
|
155
|
-
// env.home - home isolado; evita vazamento do ~/.failproofai real
|
|
156
|
-
|
|
157
|
-
env.writeConfig({
|
|
158
|
-
enabledPolicies: ["block-sudo"],
|
|
159
|
-
policyParams: {
|
|
160
|
-
"block-sudo": { allowPatterns: ["sudo systemctl status"] },
|
|
161
|
-
},
|
|
162
|
-
});
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
`createFixtureEnv()` registra a limpeza via `afterEach` automaticamente.
|
|
166
|
-
|
|
167
|
-
**`runHook`** - invoca o binário:
|
|
168
|
-
|
|
169
|
-
```typescript
|
|
170
|
-
import { runHook } from "../helpers/hook-runner";
|
|
171
|
-
import { Payloads } from "../helpers/payloads";
|
|
172
|
-
|
|
173
|
-
const result = await runHook(
|
|
174
|
-
"PreToolUse",
|
|
175
|
-
Payloads.preToolUse.bash("sudo apt install nodejs", env.cwd),
|
|
176
|
-
{ homeDir: env.home }
|
|
177
|
-
);
|
|
178
|
-
|
|
179
|
-
expect(result.exitCode).toBe(0);
|
|
180
|
-
expect(result.parsed?.hookSpecificOutput?.permissionDecision).toBe("deny");
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
**`Payloads`** - fábricas de payload prontas para uso:
|
|
184
|
-
|
|
185
|
-
```typescript
|
|
186
|
-
Payloads.preToolUse.bash(command, cwd)
|
|
187
|
-
Payloads.preToolUse.write(filePath, content, cwd)
|
|
188
|
-
Payloads.preToolUse.read(filePath, cwd)
|
|
189
|
-
Payloads.postToolUse.bash(command, output, cwd)
|
|
190
|
-
Payloads.postToolUse.read(filePath, content, cwd)
|
|
191
|
-
Payloads.notification(message, cwd)
|
|
192
|
-
Payloads.stop(cwd)
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
### Escrevendo um teste E2E
|
|
196
|
-
|
|
197
|
-
```typescript
|
|
198
|
-
import { describe, it, expect } from "vitest";
|
|
199
|
-
import { createFixtureEnv } from "../helpers/fixture-env";
|
|
200
|
-
import { runHook } from "../helpers/hook-runner";
|
|
201
|
-
import { Payloads } from "../helpers/payloads";
|
|
202
|
-
|
|
203
|
-
describe("block-rm-rf (E2E)", () => {
|
|
204
|
-
it("denies rm -rf", async () => {
|
|
205
|
-
const env = createFixtureEnv();
|
|
206
|
-
env.writeConfig({ enabledPolicies: ["block-rm-rf"] });
|
|
207
|
-
|
|
208
|
-
const result = await runHook(
|
|
209
|
-
"PreToolUse",
|
|
210
|
-
Payloads.preToolUse.bash("rm -rf /", env.cwd),
|
|
211
|
-
{ homeDir: env.home }
|
|
212
|
-
);
|
|
213
|
-
|
|
214
|
-
expect(result.exitCode).toBe(0);
|
|
215
|
-
expect(result.parsed?.hookSpecificOutput?.permissionDecision).toBe("deny");
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
it("allows non-recursive rm", async () => {
|
|
219
|
-
const env = createFixtureEnv();
|
|
220
|
-
env.writeConfig({ enabledPolicies: ["block-rm-rf"] });
|
|
221
|
-
|
|
222
|
-
const result = await runHook(
|
|
223
|
-
"PreToolUse",
|
|
224
|
-
Payloads.preToolUse.bash("rm /tmp/file.txt", env.cwd),
|
|
225
|
-
{ homeDir: env.home }
|
|
226
|
-
);
|
|
227
|
-
|
|
228
|
-
expect(result.exitCode).toBe(0);
|
|
229
|
-
expect(result.stdout).toBe(""); // allow → stdout vazio
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
### Formatos de resposta E2E
|
|
235
|
-
|
|
236
|
-
| Decisão | Código de saída | stdout |
|
|
237
|
-
|----------|-----------|--------|
|
|
238
|
-
| `PreToolUse` deny | `0` | `{"hookSpecificOutput":{"permissionDecision":"deny","permissionDecisionReason":"..."}}` |
|
|
239
|
-
| `PostToolUse` deny | `0` | `{"hookSpecificOutput":{"additionalContext":"Blocked ... because: ..."}}` |
|
|
240
|
-
| Instruct (não-Stop) | `0` | `{"hookSpecificOutput":{"additionalContext":"Instruction from failproofai: ..."}}` |
|
|
241
|
-
| Stop instruct | `2` | stdout vazio; motivo no stderr |
|
|
242
|
-
| Allow | `0` | string vazia |
|
|
243
|
-
|
|
244
|
-
### Configuração do Vitest
|
|
245
|
-
|
|
246
|
-
Os testes E2E utilizam `vitest.config.e2e.mts` com:
|
|
247
|
-
|
|
248
|
-
- `environment: "node"` - sem necessidade de globals do navegador
|
|
249
|
-
- `pool: "forks"` - isolamento real de processos (os testes iniciam subprocessos)
|
|
250
|
-
- `testTimeout: 20_000` - 20s por teste (inicialização do binário + avaliação do hook)
|
|
251
|
-
|
|
252
|
-
O pool `forks` é importante: workers baseados em threads compartilham `globalThis`, o que pode interferir com testes que iniciam subprocessos. Forks baseados em processos evitam esse problema.
|
|
253
|
-
|
|
254
|
-
---
|
|
255
|
-
|
|
256
|
-
## CI
|
|
257
|
-
|
|
258
|
-
A execução completa de CI (`bun run lint && bunx tsc --noEmit && bun run test:run && bun run build`) deve passar antes do merge. A suíte E2E é executada como um job de CI separado, em paralelo.
|
|
259
|
-
|
|
260
|
-
Consulte [Contributing](../CONTRIBUTING.md) para o checklist completo de pré-merge.
|
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
---
|
|
3
|
-
title: Архитектура
|
|
4
|
-
description: "Как работают обработчик хуков, загрузка конфига и оценка политик"
|
|
5
|
-
icon: sitemap
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
Этот документ объясняет, как работает failproofai изнутри: как система хуков перехватывает вызовы инструментов агента, как загружается и объединяется конфигурация, как оцениваются политики и как панель мониторинга отслеживает активность агента.
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Обзор
|
|
13
|
-
|
|
14
|
-
failproofai состоит из двух независимых подсистем:
|
|
15
|
-
|
|
16
|
-
1. **Hook handler** — быстрый CLI подпроцесс, который Claude Code вызывает при каждом вызове инструмента агента. Оценивает политики и возвращает решение.
|
|
17
|
-
2. **Agent Monitor (Dashboard)** — веб-приложение Next.js для мониторинга сессий агента и управления политиками.
|
|
18
|
-
|
|
19
|
-
Обе подсистемы совместно используют файлы конфигурации в `~/.failproofai/` и в директории проекта `.failproofai/`, но работают как отдельные процессы и взаимодействуют только через файловую систему.
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## Hook handler
|
|
24
|
-
|
|
25
|
-
### Интеграция с Claude Code
|
|
26
|
-
|
|
27
|
-
Когда вы запускаете `failproofai policies --install`, он записывает записи подобно этой в `~/.claude/settings.json`:
|
|
28
|
-
|
|
29
|
-
```json
|
|
30
|
-
{
|
|
31
|
-
"hooks": {
|
|
32
|
-
"PreToolUse": [
|
|
33
|
-
{
|
|
34
|
-
"matcher": "",
|
|
35
|
-
"hooks": [
|
|
36
|
-
{
|
|
37
|
-
"type": "command",
|
|
38
|
-
"command": "failproofai --hook PreToolUse"
|
|
39
|
-
}
|
|
40
|
-
]
|
|
41
|
-
}
|
|
42
|
-
],
|
|
43
|
-
"PostToolUse": [ ... ]
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
Claude Code затем вызывает `failproofai --hook PreToolUse` как подпроцесс перед каждым вызовом инструмента, передавая JSON-полезную нагрузку на stdin.
|
|
49
|
-
|
|
50
|
-
### Формат полезной нагрузки
|
|
51
|
-
|
|
52
|
-
```json
|
|
53
|
-
{
|
|
54
|
-
"session_id": "abc123",
|
|
55
|
-
"transcript_path": "/home/user/.claude/projects/myproject/sessions/abc123.jsonl",
|
|
56
|
-
"cwd": "/home/user/myproject",
|
|
57
|
-
"permission_mode": "default",
|
|
58
|
-
"hook_event_name": "PreToolUse",
|
|
59
|
-
"tool_name": "Bash",
|
|
60
|
-
"tool_input": { "command": "sudo apt install nodejs" }
|
|
61
|
-
}
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Для событий `PostToolUse` полезная нагрузка также содержит `tool_result` с результатом работы инструмента.
|
|
65
|
-
|
|
66
|
-
Обработчик устанавливает лимит stdin в 1 МБ. Полезные нагрузки, превышающие этот лимит, отбрасываются и все политики неявно разрешают операцию.
|
|
67
|
-
|
|
68
|
-
### Формат ответа
|
|
69
|
-
|
|
70
|
-
**Deny (PreToolUse):**
|
|
71
|
-
```json
|
|
72
|
-
{
|
|
73
|
-
"hookSpecificOutput": {
|
|
74
|
-
"permissionDecision": "deny",
|
|
75
|
-
"permissionDecisionReason": "Blocked by failproofai: sudo command blocked"
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
**Deny (PostToolUse):**
|
|
81
|
-
```json
|
|
82
|
-
{
|
|
83
|
-
"hookSpecificOutput": {
|
|
84
|
-
"additionalContext": "Blocked by failproofai because: API key detected in output"
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
**Instruct (любое событие, кроме Stop):**
|
|
90
|
-
```json
|
|
91
|
-
{
|
|
92
|
-
"hookSpecificOutput": {
|
|
93
|
-
"additionalContext": "Instruction from failproofai: Verify tests pass before committing."
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
**Instruct для события Stop:**
|
|
99
|
-
- Код выхода: `2`
|
|
100
|
-
- Причина выводится в stderr (не в stdout)
|
|
101
|
-
|
|
102
|
-
**Allow:**
|
|
103
|
-
- Код выхода: `0`
|
|
104
|
-
- Пустой stdout
|
|
105
|
-
|
|
106
|
-
**Allow с сообщением:**
|
|
107
|
-
|
|
108
|
-
`allow(message)` позволяет политике отправлять информационный контекст обратно в Claude даже когда операция разрешена. Обработчик хуков записывает следующий JSON в **stdout** (не в файл конфига — это ответ обработчика для Claude Code, как и ответы deny и instruct выше):
|
|
109
|
-
|
|
110
|
-
```json
|
|
111
|
-
// Написано в stdout процессом обработчика хуков
|
|
112
|
-
{
|
|
113
|
-
"hookSpecificOutput": {
|
|
114
|
-
"additionalContext": "All CI checks passed on branch 'feat/my-feature'."
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
- Код выхода: `0` (операция разрешена)
|
|
119
|
-
- Когда несколько политик возвращают `allow` с сообщением, их сообщения объединяются с переводами строк в один string `additionalContext`
|
|
120
|
-
- Если ни одна политика не предоставляет сообщение, stdout пуст (как и раньше)
|
|
121
|
-
|
|
122
|
-
### Конвейер обработки
|
|
123
|
-
|
|
124
|
-
`src/hooks/handler.ts` реализует полный конвейер:
|
|
125
|
-
|
|
126
|
-
```text
|
|
127
|
-
stdin JSON
|
|
128
|
-
→ parse payload (max 1 MB)
|
|
129
|
-
→ extract session metadata (session_id, cwd, tool_name, tool_input, etc.)
|
|
130
|
-
→ readMergedHooksConfig(cwd) ← merges project + local + global config
|
|
131
|
-
→ register enabled builtin policies with resolved params
|
|
132
|
-
→ load custom policies from customPoliciesPath (if set)
|
|
133
|
-
→ register custom policies into policy registry
|
|
134
|
-
→ evaluate all policies (builtins first, then custom)
|
|
135
|
-
→ first deny short-circuits
|
|
136
|
-
→ instruct decisions accumulate
|
|
137
|
-
→ allow messages accumulate
|
|
138
|
-
→ write JSON decision to stdout
|
|
139
|
-
→ persist event to ~/.failproofai/hook-activity.jsonl
|
|
140
|
-
→ exit
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
Весь процесс выполняется менее чем за 100 мс для типичных полезных нагрузок без вызовов LLM.
|
|
144
|
-
|
|
145
|
-
---
|
|
146
|
-
|
|
147
|
-
## Загрузка конфигурации
|
|
148
|
-
|
|
149
|
-
`src/hooks/hooks-config.ts` реализует загрузку конфигурации в трёх областях.
|
|
150
|
-
|
|
151
|
-
```text
|
|
152
|
-
[1] {cwd}/.failproofai/policies-config.json ← project (highest priority)
|
|
153
|
-
[2] {cwd}/.failproofai/policies-config.local.json ← local
|
|
154
|
-
[3] ~/.failproofai/policies-config.json ← global (lowest priority)
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
Логика объединения:
|
|
158
|
-
- `enabledPolicies` — дедублицированное объединение всех трёх файлов
|
|
159
|
-
- `policyParams` — по ключу политики, первый файл, который его определяет, получает полный приоритет
|
|
160
|
-
- `customPoliciesPath` — первый файл, который его определяет, получает приоритет
|
|
161
|
-
- `llm` — первый файл, который его определяет, получает приоритет
|
|
162
|
-
|
|
163
|
-
Веб-панель использует `readHooksConfig()` (только глобальный) для чтения и записи, поскольку она вызывается без cwd проекта.
|
|
164
|
-
|
|
165
|
-
---
|
|
166
|
-
|
|
167
|
-
## Оценка политик
|
|
168
|
-
|
|
169
|
-
`src/hooks/policy-evaluator.ts` запускает политики по порядку.
|
|
170
|
-
|
|
171
|
-
Для каждой политики:
|
|
172
|
-
|
|
173
|
-
1. Поиск схемы `params` политики (если она есть).
|
|
174
|
-
2. Чтение `policyParams[policy.name]` из объединённой конфигурации.
|
|
175
|
-
3. Объединение предоставленных пользователем значений со значениями по умолчанию из схемы для создания `ctx.params`.
|
|
176
|
-
4. Вызов `policy.fn(ctx)` с разрешённым контекстом.
|
|
177
|
-
5. Если результат `deny`, остановиться немедленно и вернуть это решение.
|
|
178
|
-
6. Если результат `instruct`, накопить сообщение и продолжить.
|
|
179
|
-
7. Если результат `allow`, перейти к следующей политике.
|
|
180
|
-
|
|
181
|
-
После выполнения всех политик:
|
|
182
|
-
- Если была возвращена какая-либо `deny`, вывести ответ deny.
|
|
183
|
-
- Если были собраны какие-либо `instruct`, вывести один ответ instruct со всеми объединёнными сообщениями.
|
|
184
|
-
- В противном случае вывести ответ allow (пустой stdout, выход 0).
|
|
185
|
-
|
|
186
|
-
---
|
|
187
|
-
|
|
188
|
-
## Встроенные политики
|
|
189
|
-
|
|
190
|
-
`src/hooks/builtin-policies.ts` определяет все 26 встроенных политик как объекты `BuiltinPolicyDefinition`:
|
|
191
|
-
|
|
192
|
-
```typescript
|
|
193
|
-
interface BuiltinPolicyDefinition {
|
|
194
|
-
name: string;
|
|
195
|
-
description: string;
|
|
196
|
-
fn: (ctx: PolicyContext) => PolicyResult;
|
|
197
|
-
match: {
|
|
198
|
-
events: HookEventType[];
|
|
199
|
-
tools?: string[];
|
|
200
|
-
};
|
|
201
|
-
defaultEnabled: boolean;
|
|
202
|
-
category: string;
|
|
203
|
-
beta?: boolean;
|
|
204
|
-
params?: PolicyParamsSchema;
|
|
205
|
-
}
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
Политики, которые принимают `params`, объявляют `PolicyParamsSchema` с типами и значениями по умолчанию для каждого параметра. Оценщик политик внедряет разрешённые значения в `ctx.params` перед вызовом `fn`. Функции политик читают `ctx.params` без проверки на null, поскольку значения по умолчанию всегда применяются в первую очередь.
|
|
209
|
-
|
|
210
|
-
Сопоставление шаблонов внутри политик использует разобранные токены команды (argv), а не простое совпадение строк. Это предотвращает обход с помощью инъекции оператора оболочки (например, шаблон для `sudo systemctl status *` не может быть обойден путём добавления `; rm -rf /` к команде).
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
## Пользовательские политики
|
|
215
|
-
|
|
216
|
-
`src/hooks/custom-hooks-registry.ts` реализует реестр, поддерживаемый `globalThis`:
|
|
217
|
-
|
|
218
|
-
```typescript
|
|
219
|
-
const REGISTRY_KEY = "__failproofai_custom_hooks__";
|
|
220
|
-
|
|
221
|
-
export const customPolicies = {
|
|
222
|
-
add(hook: CustomHook): void { ... }
|
|
223
|
-
};
|
|
224
|
-
|
|
225
|
-
export function getCustomHooks(): CustomHook[] { ... }
|
|
226
|
-
export function clearCustomHooks(): void { ... } // used in tests
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
`src/hooks/custom-hooks-loader.ts` загружает файл политики пользователя:
|
|
230
|
-
|
|
231
|
-
1. Чтение `customPoliciesPath` из конфигурации; пропуск, если отсутствует.
|
|
232
|
-
2. Разрешение в абсолютный путь; проверка существования файла.
|
|
233
|
-
3. Переписывание всех импортов `from "failproofai"` на фактический путь dist, чтобы `customPolicies` разрешался в одинаковый реестр `globalThis`.
|
|
234
|
-
4. Рекурсивное переписывание переходных локальных импортов для обеспечения совместимости ESM.
|
|
235
|
-
5. Запись временных файлов `.mjs` и `import()` файла входа.
|
|
236
|
-
6. Вызов `getCustomHooks()` для получения зарегистрированных хуков.
|
|
237
|
-
7. Очистка всех временных файлов в блоке `finally`.
|
|
238
|
-
|
|
239
|
-
При любой ошибке (файл не найден, синтаксическая ошибка, ошибка импорта) ошибка регистрируется в `~/.failproofai/hook.log` и загрузчик возвращает пустой массив. Встроенные политики не затрагиваются.
|
|
240
|
-
|
|
241
|
-
Пользовательские политики оцениваются после всех встроенных политик. Пользовательская политика `deny` по-прежнему прерывает дальнейшие пользовательские политики (но к тому моменту все встроенные уже выполнены).
|
|
242
|
-
|
|
243
|
-
---
|
|
244
|
-
|
|
245
|
-
## Логирование активности
|
|
246
|
-
|
|
247
|
-
После каждого события хука обработчик добавляет строку JSONL в `~/.failproofai/hook-activity.jsonl`:
|
|
248
|
-
|
|
249
|
-
```json
|
|
250
|
-
{
|
|
251
|
-
"timestamp": "2026-04-06T12:34:56.789Z",
|
|
252
|
-
"sessionId": "abc123",
|
|
253
|
-
"eventType": "PreToolUse",
|
|
254
|
-
"toolName": "Bash",
|
|
255
|
-
"policyName": "block-sudo",
|
|
256
|
-
"decision": "deny",
|
|
257
|
-
"reason": "sudo command blocked by failproofai",
|
|
258
|
-
"durationMs": 12
|
|
259
|
-
}
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
По одной строке на каждую политику, которая приняла решение, отличное от allow. Решения allow не регистрируются (чтобы держать файл в разумном размере).
|
|
263
|
-
|
|
264
|
-
---
|
|
265
|
-
|
|
266
|
-
## Архитектура панели
|
|
267
|
-
|
|
268
|
-
Панель — это приложение **Next.js 16** с использованием App Router, React Server Components и Server Actions.
|
|
269
|
-
|
|
270
|
-
```text
|
|
271
|
-
app/
|
|
272
|
-
layout.tsx ← Root layout (theme, telemetry, nav)
|
|
273
|
-
projects/page.tsx ← Server component: list all Claude projects
|
|
274
|
-
project/[name]/page.tsx ← Server component: list sessions in a project
|
|
275
|
-
project/[name]/session/
|
|
276
|
-
[sessionId]/page.tsx ← Server component: render session viewer
|
|
277
|
-
policies/page.tsx ← Client component: policy management + activity log
|
|
278
|
-
actions/
|
|
279
|
-
get-hooks-config.ts ← Read config + policy list
|
|
280
|
-
update-hooks-config.ts ← Toggle policy on/off
|
|
281
|
-
update-policy-params.ts ← Update policy parameters
|
|
282
|
-
get-hook-activity.ts ← Paginate/search activity log
|
|
283
|
-
install-hooks-web.ts ← Install/remove hooks from the browser
|
|
284
|
-
api/
|
|
285
|
-
download/[project]/[session]/route.ts ← Export session as ZIP/JSONL
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
**Поток данных:**
|
|
289
|
-
|
|
290
|
-
- Компоненты страниц вызывают `lib/projects.ts` и `lib/log-entries.ts` для чтения данных проекта/сессии непосредственно из файловой системы (без слоя API для чтения).
|
|
291
|
-
- Страница Policies использует Server Actions для всех изменений (переключение, обновление параметров, установка/удаление).
|
|
292
|
-
- Просмотрщик сессии анализирует формат JSONL транскрипта Claude и отображает временную шкалу сообщений и вызовов инструментов.
|
|
293
|
-
|
|
294
|
-
**Ключевые решения проектирования:**
|
|
295
|
-
|
|
296
|
-
- Нет базы данных — всё постоянное состояние хранится в простых файлах (`~/.failproofai/`, `~/.claude/projects/`).
|
|
297
|
-
- Server Actions для изменений — REST API не требуется для CRUD операций.
|
|
298
|
-
- React Server Components для страниц чтения — более быстрая начальная загрузка, без клиентского пакета для получения данных.
|
|
299
|
-
- Клиентские компоненты только где требуется интерактивность (переключение политик, поиск по активности, просмотр логов).
|
|
300
|
-
|
|
301
|
-
---
|
|
302
|
-
|
|
303
|
-
## Структура файлов
|
|
304
|
-
|
|
305
|
-
```text
|
|
306
|
-
failproofai/
|
|
307
|
-
├── bin/
|
|
308
|
-
│ └── failproofai.mjs # CLI router (hook / dashboard / install / etc.)
|
|
309
|
-
├── src/hooks/
|
|
310
|
-
│ ├── handler.ts # Hook event pipeline
|
|
311
|
-
│ ├── builtin-policies.ts # 26 policy definitions
|
|
312
|
-
│ ├── policy-evaluator.ts # Policy execution engine
|
|
313
|
-
│ ├── policy-registry.ts # Policy registration and lookup
|
|
314
|
-
│ ├── policy-types.ts # TypeScript interfaces
|
|
315
|
-
│ ├── hooks-config.ts # Multi-scope config loading
|
|
316
|
-
│ ├── custom-hooks-registry.ts # globalThis-backed hook registry
|
|
317
|
-
│ ├── custom-hooks-loader.ts # ESM loader for user JS hooks
|
|
318
|
-
│ ├── manager.ts # install / remove / list operations
|
|
319
|
-
│ ├── install-prompt.ts # Interactive policy selection prompt
|
|
320
|
-
│ ├── hook-logger.ts # Logging to hook.log
|
|
321
|
-
│ ├── hook-activity-store.ts # Persist activity to hook-activity.jsonl
|
|
322
|
-
│ └── llm-client.ts # LLM API client (for AI-powered policies)
|
|
323
|
-
├── app/ # Next.js dashboard (pages + server actions)
|
|
324
|
-
├── lib/ # Shared utilities
|
|
325
|
-
│ ├── projects.ts # Enumerate Claude projects from filesystem
|
|
326
|
-
│ ├── log-entries.ts # Parse Claude transcript JSONL format
|
|
327
|
-
│ ├── paths.ts # Resolve system paths
|
|
328
|
-
│ └── ...
|
|
329
|
-
├── components/ # Shared React UI components
|
|
330
|
-
├── contexts/ # React context providers (theme, auto-refresh, telemetry)
|
|
331
|
-
├── examples/ # Example custom hook files
|
|
332
|
-
└── __tests__/ # Unit and E2E tests
|
|
333
|
-
```
|