failproofai 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.claude/settings.json +316 -0
- package/.next/standalone/.failproofai/policies/workflow-policies.mjs +62 -0
- package/.next/standalone/.failproofai/policies-config.json +39 -0
- 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 +3 -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 +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/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 +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0kjo7d_._.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_05pz9._._.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]__12kr5~_._.js → [root-of-the-server]__03kiqd5._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0qo8503._.js → [root-of-the-server]__0bo8s~-._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +9 -9
- 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_next_dist_esm_build_templates_app-page_0a_7sdg.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ef3uwk.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0j79~gv.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0pbja1x.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0r6o0i2.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11y81~_.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_12or2kf.js +2 -2
- 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 +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/{0x-625~1vx1lu.js → 02t9.s735hqyq.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0ov60i6md~37t.js → 03oepxbqx6o8~.js} +2 -2
- package/.next/standalone/.next/static/chunks/{031pa5~qfzt~_.js → 09e7drilkf1sn.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0y~0creqvl5wx.js → 0cwft44dh9bww.js} +1 -1
- package/.next/standalone/.next/static/chunks/{06og.7e9nkpjh.js → 0e2uz2g026ckb.js} +1 -1
- package/.next/standalone/.next/static/chunks/0gu_a.a80ritd.css +1 -0
- package/.next/standalone/.next/static/chunks/{15wf7x-e.8ia3.js → 0h5kbvg~.xf.v.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0_4y_t03jn2nq.js → 0od..umlku4bb.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0cvffh-pbsv5u.js → 0xbwzy4dl87-0.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0c_ljlxa._4lc.js → 18cl6wups7ouq.js} +2 -2
- package/.next/standalone/.next/static/chunks/{turbopack-0uc5y~g6h.n7-.js → turbopack-0r26pc8h0y_-e.js} +1 -1
- package/.next/standalone/CHANGELOG.md +103 -0
- package/.next/standalone/CLAUDE.md +28 -0
- package/.next/standalone/Dockerfile.docs +12 -0
- package/.next/standalone/README.md +95 -49
- package/.next/standalone/app/components/session-hooks-panel.tsx +14 -1
- package/.next/standalone/app/policies/hooks-client.tsx +14 -1
- package/.next/standalone/bin/failproofai.mjs +5 -0
- package/.next/standalone/bun.lock +76 -63
- package/.next/standalone/components/navbar.tsx +5 -0
- package/.next/standalone/dist/cli.mjs +539 -90
- package/.next/standalone/dist/index.js +2 -2
- package/.next/standalone/docs/ar/architecture.mdx +333 -0
- package/.next/standalone/docs/ar/built-in-policies.mdx +566 -0
- package/.next/standalone/docs/ar/cli/dashboard.mdx +28 -0
- package/.next/standalone/docs/ar/cli/environment-variables.mdx +34 -0
- package/.next/standalone/docs/ar/cli/hook.mdx +31 -0
- package/.next/standalone/docs/ar/cli/install-policies.mdx +49 -0
- package/.next/standalone/docs/ar/cli/list-policies.mdx +31 -0
- package/.next/standalone/docs/ar/cli/remove-policies.mdx +45 -0
- package/.next/standalone/docs/ar/cli/version.mdx +13 -0
- package/.next/standalone/docs/ar/configuration.mdx +223 -0
- package/.next/standalone/docs/ar/custom-policies.mdx +359 -0
- package/.next/standalone/docs/ar/dashboard.mdx +142 -0
- package/.next/standalone/docs/ar/examples.mdx +254 -0
- package/.next/standalone/docs/ar/for-agents.mdx +39 -0
- package/.next/standalone/docs/ar/getting-started.mdx +134 -0
- package/.next/standalone/docs/ar/introduction.mdx +58 -0
- package/.next/standalone/docs/ar/package-aliases.mdx +82 -0
- package/.next/standalone/docs/ar/testing.mdx +261 -0
- package/.next/standalone/docs/{architecture.md → architecture.mdx} +40 -23
- package/.next/standalone/docs/{built-in-policies.md → built-in-policies.mdx} +151 -13
- package/.next/standalone/docs/cli/dashboard.mdx +28 -0
- package/.next/standalone/docs/cli/environment-variables.mdx +34 -0
- package/.next/standalone/docs/cli/hook.mdx +30 -0
- package/.next/standalone/docs/cli/install-policies.mdx +48 -0
- package/.next/standalone/docs/cli/list-policies.mdx +31 -0
- package/.next/standalone/docs/cli/remove-policies.mdx +44 -0
- package/.next/standalone/docs/cli/version.mdx +12 -0
- package/.next/standalone/docs/{configuration.md → configuration.mdx} +62 -16
- package/.next/standalone/docs/custom-policies.mdx +357 -0
- package/.next/standalone/docs/{dashboard.md → dashboard.mdx} +26 -29
- package/.next/standalone/docs/de/architecture.mdx +332 -0
- package/.next/standalone/docs/de/built-in-policies.mdx +564 -0
- package/.next/standalone/docs/de/cli/dashboard.mdx +28 -0
- package/.next/standalone/docs/de/cli/environment-variables.mdx +34 -0
- package/.next/standalone/docs/de/cli/hook.mdx +30 -0
- package/.next/standalone/docs/de/cli/install-policies.mdx +48 -0
- package/.next/standalone/docs/de/cli/list-policies.mdx +31 -0
- package/.next/standalone/docs/de/cli/remove-policies.mdx +44 -0
- package/.next/standalone/docs/de/cli/version.mdx +12 -0
- package/.next/standalone/docs/de/configuration.mdx +222 -0
- package/.next/standalone/docs/de/custom-policies.mdx +357 -0
- package/.next/standalone/docs/de/dashboard.mdx +142 -0
- package/.next/standalone/docs/de/examples.mdx +253 -0
- package/.next/standalone/docs/de/for-agents.mdx +38 -0
- package/.next/standalone/docs/de/getting-started.mdx +134 -0
- package/.next/standalone/docs/de/introduction.mdx +57 -0
- package/.next/standalone/docs/de/package-aliases.mdx +82 -0
- package/.next/standalone/docs/de/testing.mdx +260 -0
- package/.next/standalone/docs/docs.json +938 -24
- package/.next/standalone/docs/es/architecture.mdx +332 -0
- package/.next/standalone/docs/es/built-in-policies.mdx +564 -0
- package/.next/standalone/docs/es/cli/dashboard.mdx +28 -0
- package/.next/standalone/docs/es/cli/environment-variables.mdx +34 -0
- package/.next/standalone/docs/es/cli/hook.mdx +30 -0
- package/.next/standalone/docs/es/cli/install-policies.mdx +48 -0
- package/.next/standalone/docs/es/cli/list-policies.mdx +31 -0
- package/.next/standalone/docs/es/cli/remove-policies.mdx +44 -0
- package/.next/standalone/docs/es/cli/version.mdx +12 -0
- package/.next/standalone/docs/es/configuration.mdx +222 -0
- package/.next/standalone/docs/es/custom-policies.mdx +357 -0
- package/.next/standalone/docs/es/dashboard.mdx +142 -0
- package/.next/standalone/docs/es/examples.mdx +253 -0
- package/.next/standalone/docs/es/for-agents.mdx +38 -0
- package/.next/standalone/docs/es/getting-started.mdx +134 -0
- package/.next/standalone/docs/es/introduction.mdx +57 -0
- package/.next/standalone/docs/es/package-aliases.mdx +82 -0
- package/.next/standalone/docs/es/testing.mdx +260 -0
- package/.next/standalone/docs/examples.mdx +253 -0
- package/.next/standalone/docs/for-agents.mdx +38 -0
- package/.next/standalone/docs/fr/architecture.mdx +332 -0
- package/.next/standalone/docs/fr/built-in-policies.mdx +564 -0
- package/.next/standalone/docs/fr/cli/dashboard.mdx +28 -0
- package/.next/standalone/docs/fr/cli/environment-variables.mdx +34 -0
- package/.next/standalone/docs/fr/cli/hook.mdx +30 -0
- package/.next/standalone/docs/fr/cli/install-policies.mdx +48 -0
- package/.next/standalone/docs/fr/cli/list-policies.mdx +31 -0
- package/.next/standalone/docs/fr/cli/remove-policies.mdx +44 -0
- package/.next/standalone/docs/fr/cli/version.mdx +12 -0
- package/.next/standalone/docs/fr/configuration.mdx +222 -0
- package/.next/standalone/docs/fr/custom-policies.mdx +357 -0
- package/.next/standalone/docs/fr/dashboard.mdx +142 -0
- package/.next/standalone/docs/fr/examples.mdx +253 -0
- package/.next/standalone/docs/fr/for-agents.mdx +38 -0
- package/.next/standalone/docs/fr/getting-started.mdx +134 -0
- package/.next/standalone/docs/fr/introduction.mdx +57 -0
- package/.next/standalone/docs/fr/package-aliases.mdx +82 -0
- package/.next/standalone/docs/fr/testing.mdx +260 -0
- package/.next/standalone/docs/getting-started.mdx +134 -0
- package/.next/standalone/docs/he/architecture.mdx +333 -0
- package/.next/standalone/docs/he/built-in-policies.mdx +564 -0
- package/.next/standalone/docs/he/cli/dashboard.mdx +28 -0
- package/.next/standalone/docs/he/cli/environment-variables.mdx +34 -0
- package/.next/standalone/docs/he/cli/hook.mdx +30 -0
- package/.next/standalone/docs/he/cli/install-policies.mdx +48 -0
- package/.next/standalone/docs/he/cli/list-policies.mdx +32 -0
- package/.next/standalone/docs/he/cli/remove-policies.mdx +44 -0
- package/.next/standalone/docs/he/cli/version.mdx +12 -0
- package/.next/standalone/docs/he/configuration.mdx +222 -0
- package/.next/standalone/docs/he/custom-policies.mdx +357 -0
- package/.next/standalone/docs/he/dashboard.mdx +142 -0
- package/.next/standalone/docs/he/examples.mdx +253 -0
- package/.next/standalone/docs/he/for-agents.mdx +38 -0
- package/.next/standalone/docs/he/getting-started.mdx +135 -0
- package/.next/standalone/docs/he/introduction.mdx +57 -0
- package/.next/standalone/docs/he/package-aliases.mdx +82 -0
- package/.next/standalone/docs/he/testing.mdx +260 -0
- package/.next/standalone/docs/hi/architecture.mdx +334 -0
- package/.next/standalone/docs/hi/built-in-policies.mdx +564 -0
- package/.next/standalone/docs/hi/cli/dashboard.mdx +28 -0
- package/.next/standalone/docs/hi/cli/environment-variables.mdx +34 -0
- package/.next/standalone/docs/hi/cli/hook.mdx +30 -0
- package/.next/standalone/docs/hi/cli/install-policies.mdx +48 -0
- package/.next/standalone/docs/hi/cli/list-policies.mdx +31 -0
- package/.next/standalone/docs/hi/cli/remove-policies.mdx +44 -0
- package/.next/standalone/docs/hi/cli/version.mdx +12 -0
- package/.next/standalone/docs/hi/configuration.mdx +222 -0
- package/.next/standalone/docs/hi/custom-policies.mdx +357 -0
- package/.next/standalone/docs/hi/dashboard.mdx +142 -0
- package/.next/standalone/docs/hi/examples.mdx +255 -0
- package/.next/standalone/docs/hi/for-agents.mdx +38 -0
- package/.next/standalone/docs/hi/getting-started.mdx +134 -0
- package/.next/standalone/docs/hi/introduction.mdx +57 -0
- package/.next/standalone/docs/hi/package-aliases.mdx +82 -0
- package/.next/standalone/docs/hi/testing.mdx +260 -0
- package/.next/standalone/docs/i18n/README.ar.md +312 -0
- package/.next/standalone/docs/i18n/README.de.md +307 -0
- package/.next/standalone/docs/i18n/README.es.md +307 -0
- package/.next/standalone/docs/i18n/README.fr.md +307 -0
- package/.next/standalone/docs/i18n/README.he.md +312 -0
- package/.next/standalone/docs/i18n/README.hi.md +307 -0
- package/.next/standalone/docs/i18n/README.it.md +307 -0
- package/.next/standalone/docs/i18n/README.ja.md +307 -0
- package/.next/standalone/docs/i18n/README.ko.md +307 -0
- package/.next/standalone/docs/i18n/README.pt-br.md +307 -0
- package/.next/standalone/docs/i18n/README.ru.md +308 -0
- package/.next/standalone/docs/i18n/README.tr.md +308 -0
- package/.next/standalone/docs/i18n/README.vi.md +308 -0
- package/.next/standalone/docs/i18n/README.zh.md +307 -0
- package/.next/standalone/docs/introduction.mdx +57 -0
- package/.next/standalone/docs/it/architecture.mdx +333 -0
- package/.next/standalone/docs/it/built-in-policies.mdx +564 -0
- package/.next/standalone/docs/it/cli/dashboard.mdx +28 -0
- package/.next/standalone/docs/it/cli/environment-variables.mdx +34 -0
- package/.next/standalone/docs/it/cli/hook.mdx +30 -0
- package/.next/standalone/docs/it/cli/install-policies.mdx +48 -0
- package/.next/standalone/docs/it/cli/list-policies.mdx +31 -0
- package/.next/standalone/docs/it/cli/remove-policies.mdx +44 -0
- package/.next/standalone/docs/it/cli/version.mdx +12 -0
- package/.next/standalone/docs/it/configuration.mdx +223 -0
- package/.next/standalone/docs/it/custom-policies.mdx +358 -0
- package/.next/standalone/docs/it/dashboard.mdx +142 -0
- package/.next/standalone/docs/it/examples.mdx +253 -0
- package/.next/standalone/docs/it/for-agents.mdx +38 -0
- package/.next/standalone/docs/it/getting-started.mdx +134 -0
- package/.next/standalone/docs/it/introduction.mdx +57 -0
- package/.next/standalone/docs/it/package-aliases.mdx +82 -0
- package/.next/standalone/docs/it/testing.mdx +260 -0
- package/.next/standalone/docs/ja/architecture.mdx +332 -0
- package/.next/standalone/docs/ja/built-in-policies.mdx +562 -0
- package/.next/standalone/docs/ja/cli/dashboard.mdx +28 -0
- package/.next/standalone/docs/ja/cli/environment-variables.mdx +34 -0
- package/.next/standalone/docs/ja/cli/hook.mdx +30 -0
- package/.next/standalone/docs/ja/cli/install-policies.mdx +48 -0
- package/.next/standalone/docs/ja/cli/list-policies.mdx +31 -0
- package/.next/standalone/docs/ja/cli/remove-policies.mdx +44 -0
- package/.next/standalone/docs/ja/cli/version.mdx +12 -0
- package/.next/standalone/docs/ja/configuration.mdx +222 -0
- package/.next/standalone/docs/ja/custom-policies.mdx +357 -0
- package/.next/standalone/docs/ja/dashboard.mdx +142 -0
- package/.next/standalone/docs/ja/examples.mdx +253 -0
- package/.next/standalone/docs/ja/for-agents.mdx +38 -0
- package/.next/standalone/docs/ja/getting-started.mdx +134 -0
- package/.next/standalone/docs/ja/introduction.mdx +57 -0
- package/.next/standalone/docs/ja/package-aliases.mdx +82 -0
- package/.next/standalone/docs/ja/testing.mdx +260 -0
- package/.next/standalone/docs/ko/architecture.mdx +332 -0
- package/.next/standalone/docs/ko/built-in-policies.mdx +562 -0
- package/.next/standalone/docs/ko/cli/dashboard.mdx +28 -0
- package/.next/standalone/docs/ko/cli/environment-variables.mdx +34 -0
- package/.next/standalone/docs/ko/cli/hook.mdx +30 -0
- package/.next/standalone/docs/ko/cli/install-policies.mdx +48 -0
- package/.next/standalone/docs/ko/cli/list-policies.mdx +31 -0
- package/.next/standalone/docs/ko/cli/remove-policies.mdx +44 -0
- package/.next/standalone/docs/ko/cli/version.mdx +12 -0
- package/.next/standalone/docs/ko/configuration.mdx +222 -0
- package/.next/standalone/docs/ko/custom-policies.mdx +357 -0
- package/.next/standalone/docs/ko/dashboard.mdx +142 -0
- package/.next/standalone/docs/ko/examples.mdx +253 -0
- package/.next/standalone/docs/ko/for-agents.mdx +38 -0
- package/.next/standalone/docs/ko/getting-started.mdx +134 -0
- package/.next/standalone/docs/ko/introduction.mdx +57 -0
- package/.next/standalone/docs/ko/package-aliases.mdx +82 -0
- package/.next/standalone/docs/ko/testing.mdx +260 -0
- package/.next/standalone/docs/logo/dark.svg +21 -0
- package/.next/standalone/docs/logo/light.svg +21 -0
- package/.next/standalone/docs/{package-aliases.md → package-aliases.mdx} +5 -5
- package/.next/standalone/docs/pt-br/architecture.mdx +332 -0
- package/.next/standalone/docs/pt-br/built-in-policies.mdx +564 -0
- package/.next/standalone/docs/pt-br/cli/dashboard.mdx +28 -0
- package/.next/standalone/docs/pt-br/cli/environment-variables.mdx +34 -0
- package/.next/standalone/docs/pt-br/cli/hook.mdx +30 -0
- package/.next/standalone/docs/pt-br/cli/install-policies.mdx +48 -0
- package/.next/standalone/docs/pt-br/cli/list-policies.mdx +31 -0
- package/.next/standalone/docs/pt-br/cli/remove-policies.mdx +44 -0
- package/.next/standalone/docs/pt-br/cli/version.mdx +12 -0
- package/.next/standalone/docs/pt-br/configuration.mdx +222 -0
- package/.next/standalone/docs/pt-br/custom-policies.mdx +357 -0
- package/.next/standalone/docs/pt-br/dashboard.mdx +142 -0
- package/.next/standalone/docs/pt-br/examples.mdx +253 -0
- package/.next/standalone/docs/pt-br/for-agents.mdx +38 -0
- package/.next/standalone/docs/pt-br/getting-started.mdx +134 -0
- package/.next/standalone/docs/pt-br/introduction.mdx +57 -0
- package/.next/standalone/docs/pt-br/package-aliases.mdx +82 -0
- package/.next/standalone/docs/pt-br/testing.mdx +260 -0
- package/.next/standalone/docs/ru/architecture.mdx +334 -0
- package/.next/standalone/docs/ru/built-in-policies.mdx +562 -0
- package/.next/standalone/docs/ru/cli/dashboard.mdx +28 -0
- package/.next/standalone/docs/ru/cli/environment-variables.mdx +34 -0
- package/.next/standalone/docs/ru/cli/hook.mdx +30 -0
- package/.next/standalone/docs/ru/cli/install-policies.mdx +48 -0
- package/.next/standalone/docs/ru/cli/list-policies.mdx +32 -0
- package/.next/standalone/docs/ru/cli/remove-policies.mdx +44 -0
- package/.next/standalone/docs/ru/cli/version.mdx +12 -0
- package/.next/standalone/docs/ru/configuration.mdx +223 -0
- package/.next/standalone/docs/ru/custom-policies.mdx +357 -0
- package/.next/standalone/docs/ru/dashboard.mdx +142 -0
- package/.next/standalone/docs/ru/examples.mdx +254 -0
- package/.next/standalone/docs/ru/for-agents.mdx +38 -0
- package/.next/standalone/docs/ru/getting-started.mdx +134 -0
- package/.next/standalone/docs/ru/introduction.mdx +57 -0
- package/.next/standalone/docs/ru/package-aliases.mdx +82 -0
- package/.next/standalone/docs/ru/testing.mdx +260 -0
- package/.next/standalone/docs/{testing.md → testing.mdx} +11 -11
- package/.next/standalone/docs/tr/architecture.mdx +333 -0
- package/.next/standalone/docs/tr/built-in-policies.mdx +562 -0
- package/.next/standalone/docs/tr/cli/dashboard.mdx +28 -0
- package/.next/standalone/docs/tr/cli/environment-variables.mdx +34 -0
- package/.next/standalone/docs/tr/cli/hook.mdx +30 -0
- package/.next/standalone/docs/tr/cli/install-policies.mdx +48 -0
- package/.next/standalone/docs/tr/cli/list-policies.mdx +31 -0
- package/.next/standalone/docs/tr/cli/remove-policies.mdx +45 -0
- package/.next/standalone/docs/tr/cli/version.mdx +12 -0
- package/.next/standalone/docs/tr/configuration.mdx +223 -0
- package/.next/standalone/docs/tr/custom-policies.mdx +357 -0
- package/.next/standalone/docs/tr/dashboard.mdx +142 -0
- package/.next/standalone/docs/tr/examples.mdx +253 -0
- package/.next/standalone/docs/tr/for-agents.mdx +38 -0
- package/.next/standalone/docs/tr/getting-started.mdx +134 -0
- package/.next/standalone/docs/tr/introduction.mdx +57 -0
- package/.next/standalone/docs/tr/package-aliases.mdx +82 -0
- package/.next/standalone/docs/tr/testing.mdx +260 -0
- package/.next/standalone/docs/vi/architecture.mdx +333 -0
- package/.next/standalone/docs/vi/built-in-policies.mdx +564 -0
- package/.next/standalone/docs/vi/cli/dashboard.mdx +28 -0
- package/.next/standalone/docs/vi/cli/environment-variables.mdx +34 -0
- package/.next/standalone/docs/vi/cli/hook.mdx +30 -0
- package/.next/standalone/docs/vi/cli/install-policies.mdx +48 -0
- package/.next/standalone/docs/vi/cli/list-policies.mdx +31 -0
- package/.next/standalone/docs/vi/cli/remove-policies.mdx +44 -0
- package/.next/standalone/docs/vi/cli/version.mdx +13 -0
- package/.next/standalone/docs/vi/configuration.mdx +222 -0
- package/.next/standalone/docs/vi/custom-policies.mdx +357 -0
- package/.next/standalone/docs/vi/dashboard.mdx +142 -0
- package/.next/standalone/docs/vi/examples.mdx +253 -0
- package/.next/standalone/docs/vi/for-agents.mdx +38 -0
- package/.next/standalone/docs/vi/getting-started.mdx +134 -0
- package/.next/standalone/docs/vi/introduction.mdx +57 -0
- package/.next/standalone/docs/vi/package-aliases.mdx +82 -0
- package/.next/standalone/docs/vi/testing.mdx +260 -0
- package/.next/standalone/docs/zh/architecture.mdx +332 -0
- package/.next/standalone/docs/zh/built-in-policies.mdx +562 -0
- package/.next/standalone/docs/zh/cli/dashboard.mdx +28 -0
- package/.next/standalone/docs/zh/cli/environment-variables.mdx +34 -0
- package/.next/standalone/docs/zh/cli/hook.mdx +30 -0
- package/.next/standalone/docs/zh/cli/install-policies.mdx +48 -0
- package/.next/standalone/docs/zh/cli/list-policies.mdx +31 -0
- package/.next/standalone/docs/zh/cli/remove-policies.mdx +44 -0
- package/.next/standalone/docs/zh/cli/version.mdx +12 -0
- package/.next/standalone/docs/zh/configuration.mdx +222 -0
- package/.next/standalone/docs/zh/custom-policies.mdx +357 -0
- package/.next/standalone/docs/zh/dashboard.mdx +142 -0
- package/.next/standalone/docs/zh/examples.mdx +253 -0
- package/.next/standalone/docs/zh/for-agents.mdx +38 -0
- package/.next/standalone/docs/zh/getting-started.mdx +134 -0
- package/.next/standalone/docs/zh/introduction.mdx +57 -0
- package/.next/standalone/docs/zh/package-aliases.mdx +82 -0
- package/.next/standalone/docs/zh/testing.mdx +260 -0
- package/.next/standalone/examples/convention-policies/security-policies.mjs +40 -0
- package/.next/standalone/examples/convention-policies/workflow-policies.mjs +41 -0
- package/.next/standalone/next.config.ts +5 -3
- 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/jsonwebtoken/index.js +2 -2
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +1 -1
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +1 -1
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +1 -1
- package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
- 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 +7 -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 +20 -19
- 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/node_modules/react/cjs/react.development.js +1 -1
- package/.next/standalone/node_modules/react/cjs/react.production.js +1 -1
- package/.next/standalone/node_modules/react/package.json +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/package.json +2 -2
- package/.next/standalone/package.json +13 -10
- package/.next/standalone/scripts/translate-docs/cache.ts +62 -0
- package/.next/standalone/scripts/translate-docs/cli.ts +357 -0
- package/.next/standalone/scripts/translate-docs/config.ts +248 -0
- package/.next/standalone/scripts/translate-docs/mdx-translator.ts +153 -0
- package/.next/standalone/scripts/translate-docs/mintlify-nav.ts +107 -0
- package/.next/standalone/scripts/translate-docs/readme-translator.ts +154 -0
- package/.next/standalone/scripts/translate-docs/translator.ts +68 -0
- package/.next/standalone/scripts/translate-docs/types.ts +43 -0
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/skills-lock.json +10 -0
- package/.next/standalone/src/hooks/builtin-policies.ts +405 -25
- package/.next/standalone/src/hooks/custom-hooks-loader.ts +165 -21
- package/.next/standalone/src/hooks/handler.ts +33 -6
- package/.next/standalone/src/hooks/hook-activity-store.ts +6 -1
- package/.next/standalone/src/hooks/hooks-config.ts +47 -2
- package/.next/standalone/src/hooks/llm-client.ts +2 -2
- package/.next/standalone/src/hooks/loader-utils.ts +4 -4
- package/.next/standalone/src/hooks/manager.ts +67 -16
- package/.next/standalone/src/hooks/policy-evaluator.ts +58 -19
- package/.next/standalone/src/hooks/policy-helpers.ts +2 -2
- package/.next/standalone/vitest.config.e2e.mts +3 -0
- package/.next/standalone/vitest.config.mts +3 -0
- package/README.md +95 -49
- package/bin/failproofai.mjs +5 -0
- package/dist/cli.mjs +539 -90
- package/dist/index.js +2 -2
- package/package.json +13 -10
- package/scripts/translate-docs/cache.ts +62 -0
- package/scripts/translate-docs/cli.ts +357 -0
- package/scripts/translate-docs/config.ts +248 -0
- package/scripts/translate-docs/mdx-translator.ts +153 -0
- package/scripts/translate-docs/mintlify-nav.ts +107 -0
- package/scripts/translate-docs/readme-translator.ts +154 -0
- package/scripts/translate-docs/translator.ts +68 -0
- package/scripts/translate-docs/types.ts +43 -0
- package/src/hooks/builtin-policies.ts +405 -25
- package/src/hooks/custom-hooks-loader.ts +165 -21
- package/src/hooks/handler.ts +33 -6
- package/src/hooks/hook-activity-store.ts +6 -1
- package/src/hooks/hooks-config.ts +47 -2
- package/src/hooks/llm-client.ts +2 -2
- package/src/hooks/loader-utils.ts +4 -4
- package/src/hooks/manager.ts +67 -16
- package/src/hooks/policy-evaluator.ts +58 -19
- package/src/hooks/policy-helpers.ts +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__02nt~6d._.js +0 -3
- package/.next/standalone/.next/static/chunks/15jpradyu_531.css +0 -1
- package/.next/standalone/docs/cli-reference.md +0 -175
- package/.next/standalone/docs/custom-hooks.md +0 -261
- package/.next/standalone/docs/getting-started.md +0 -128
- package/.next/standalone/docs/introduction.md +0 -47
- /package/.next/standalone/.next/static/{WS-OQSqL1Lp1w_obXfjvl → En9eEShUkUjgeYbY9v6Gy}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{WS-OQSqL1Lp1w_obXfjvl → En9eEShUkUjgeYbY9v6Gy}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{WS-OQSqL1Lp1w_obXfjvl → En9eEShUkUjgeYbY9v6Gy}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
---
|
|
2
|
+
---
|
|
3
|
+
title: الاختبارات
|
|
4
|
+
description: "اختبارات الوحدات واختبارات الشامل (E2E) ومساعدات الاختبارات"
|
|
5
|
+
icon: flask-vial
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
يتضمن failproofai مجموعتي اختبارات: **اختبارات الوحدات** (سريعة، محاكاة) و**اختبارات الشامل** (استدعاءات عملية فرعية حقيقية).
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## تشغيل الاختبارات
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# تشغيل جميع اختبارات الوحدات مرة واحدة
|
|
16
|
+
bun run test:run
|
|
17
|
+
|
|
18
|
+
# تشغيل اختبارات الوحدات في وضع المراقبة
|
|
19
|
+
bun run test
|
|
20
|
+
|
|
21
|
+
# تشغيل اختبارات الشامل (يتطلب إعدادًا - انظر أدناه)
|
|
22
|
+
bun run test:e2e
|
|
23
|
+
|
|
24
|
+
# فحص النوع بدون بناء
|
|
25
|
+
bunx tsc --noEmit
|
|
26
|
+
|
|
27
|
+
# فحص الكود
|
|
28
|
+
bun run lint
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## اختبارات الوحدات
|
|
34
|
+
|
|
35
|
+
تقع اختبارات الوحدات في `__tests__/` وتستخدم [Vitest](https://vitest.dev) مع `happy-dom`.
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
__tests__/
|
|
39
|
+
hooks/
|
|
40
|
+
builtin-policies.test.ts # منطق السياسة لكل سياسة مدمجة
|
|
41
|
+
hooks-config.test.ts # تحميل الإعدادات ودمج النطاق
|
|
42
|
+
policy-evaluator.test.ts # حقن المعاملات وترتيب التقييم
|
|
43
|
+
custom-hooks-registry.test.ts # سجل globalThis للإضافة والحصول والمسح
|
|
44
|
+
custom-hooks-loader.test.ts # محمل ESM والاستيرادات المتعدية ومعالجة الأخطاء
|
|
45
|
+
manager.test.ts # عمليات التثبيت والإزالة والقائمة
|
|
46
|
+
components/
|
|
47
|
+
sessions-list.test.tsx # مكون قائمة الجلسات
|
|
48
|
+
project-list.test.tsx # مكون قائمة المشاريع
|
|
49
|
+
...
|
|
50
|
+
lib/
|
|
51
|
+
logger.test.ts
|
|
52
|
+
paths.test.ts
|
|
53
|
+
date-filters.test.ts
|
|
54
|
+
telemetry.test.ts
|
|
55
|
+
...
|
|
56
|
+
actions/
|
|
57
|
+
get-hooks-config.test.ts
|
|
58
|
+
get-hook-activity.test.ts
|
|
59
|
+
...
|
|
60
|
+
contexts/
|
|
61
|
+
ThemeContext.test.tsx
|
|
62
|
+
AutoRefreshContext.test.tsx
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### كتابة اختبار وحدة للسياسة
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
69
|
+
import { getBuiltinPolicies } from "../../src/hooks/builtin-policies";
|
|
70
|
+
import { allow, deny } from "../../src/hooks/policy-types";
|
|
71
|
+
|
|
72
|
+
describe("block-sudo", () => {
|
|
73
|
+
const policy = getBuiltinPolicies().find((p) => p.name === "block-sudo")!;
|
|
74
|
+
|
|
75
|
+
it("denies sudo commands", () => {
|
|
76
|
+
const ctx = {
|
|
77
|
+
eventType: "PreToolUse" as const,
|
|
78
|
+
payload: {},
|
|
79
|
+
toolName: "Bash",
|
|
80
|
+
toolInput: { command: "sudo apt install nodejs" },
|
|
81
|
+
params: { allowPatterns: [] },
|
|
82
|
+
};
|
|
83
|
+
expect(policy.fn(ctx)).toEqual(deny("sudo command blocked by failproofai"));
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("allows non-sudo commands", () => {
|
|
87
|
+
const ctx = {
|
|
88
|
+
eventType: "PreToolUse" as const,
|
|
89
|
+
payload: {},
|
|
90
|
+
toolName: "Bash",
|
|
91
|
+
toolInput: { command: "ls -la" },
|
|
92
|
+
params: { allowPatterns: [] },
|
|
93
|
+
};
|
|
94
|
+
expect(policy.fn(ctx)).toEqual(allow());
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("allows patterns in allowPatterns", () => {
|
|
98
|
+
const ctx = {
|
|
99
|
+
eventType: "PreToolUse" as const,
|
|
100
|
+
payload: {},
|
|
101
|
+
toolName: "Bash",
|
|
102
|
+
toolInput: { command: "sudo systemctl status nginx" },
|
|
103
|
+
params: { allowPatterns: ["sudo systemctl status"] },
|
|
104
|
+
};
|
|
105
|
+
expect(policy.fn(ctx)).toEqual(allow());
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## اختبارات الشامل (E2E)
|
|
113
|
+
|
|
114
|
+
تستدعي اختبارات الشامل ملف failproofai الثنائي الفعلي كعملية فرعية، وترسل حمولة JSON إلى stdin، وتتحقق من مخرجات stdout وكود الخروج. يختبر هذا مسار التكامل الكامل الذي يستخدمه Claude Code.
|
|
115
|
+
|
|
116
|
+
### الإعداد
|
|
117
|
+
|
|
118
|
+
تشغل اختبارات الشامل الملف الثنائي مباشرة من مصدر المستودع. قبل التشغيل الأول، قم بناء حزمة CJS التي تستخدمها ملفات hook المخصصة عند الاستيراد من `'failproofai'`:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
bun build src/index.ts --outdir dist --target node --format cjs
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
ثم قم بتشغيل الاختبارات:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
bun run test:e2e
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
أعد بناء `dist/` في أي وقت تغير فيه API hook العام (`src/hooks/custom-hooks-registry.ts` أو `src/hooks/policy-helpers.ts` أو `src/hooks/policy-types.ts`).
|
|
131
|
+
|
|
132
|
+
### هيكل اختبار الشامل
|
|
133
|
+
|
|
134
|
+
```text
|
|
135
|
+
__tests__/e2e/
|
|
136
|
+
helpers/
|
|
137
|
+
hook-runner.ts # تشغيل الملف الثنائي وإرسال حمولة JSON والتقاط كود الخروج والمخرجات والأخطاء
|
|
138
|
+
fixture-env.ts # دليل مؤقت معزول لكل اختبار مع ملفات الإعدادات
|
|
139
|
+
payloads.ts # مصانع الحمولة الدقيقة لـ Claude لكل نوع حدث
|
|
140
|
+
hooks/
|
|
141
|
+
builtin-policies.e2e.test.ts # كل سياسة مدمجة مع عملية فرعية حقيقية
|
|
142
|
+
custom-hooks.e2e.test.ts # تحميل وتقييم hook المخصص
|
|
143
|
+
config-scopes.e2e.test.ts # دمج الإعدادات عبر المشروع/المحلي/العام
|
|
144
|
+
policy-params.e2e.test.ts # حقن المعاملات لكل سياسة معاملات
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### استخدام مساعدات الشامل
|
|
148
|
+
|
|
149
|
+
**`FixtureEnv`** - بيئة معزولة لكل اختبار:
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import { createFixtureEnv } from "../helpers/fixture-env";
|
|
153
|
+
|
|
154
|
+
const env = createFixtureEnv();
|
|
155
|
+
// env.cwd - دليل مؤقت؛ مرره كـ payload.cwd للتقاط .failproofai/policies-config.json
|
|
156
|
+
// env.home - دليل منزل معزول؛ لا تسرب ~/ failproofai حقيقي
|
|
157
|
+
|
|
158
|
+
env.writeConfig({
|
|
159
|
+
enabledPolicies: ["block-sudo"],
|
|
160
|
+
policyParams: {
|
|
161
|
+
"block-sudo": { allowPatterns: ["sudo systemctl status"] },
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
`createFixtureEnv()` يسجل تنظيف `afterEach` تلقائيًا.
|
|
167
|
+
|
|
168
|
+
**`runHook`** - استدعاء الملف الثنائي:
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
import { runHook } from "../helpers/hook-runner";
|
|
172
|
+
import { Payloads } from "../helpers/payloads";
|
|
173
|
+
|
|
174
|
+
const result = await runHook(
|
|
175
|
+
"PreToolUse",
|
|
176
|
+
Payloads.preToolUse.bash("sudo apt install nodejs", env.cwd),
|
|
177
|
+
{ homeDir: env.home }
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
expect(result.exitCode).toBe(0);
|
|
181
|
+
expect(result.parsed?.hookSpecificOutput?.permissionDecision).toBe("deny");
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**`Payloads`** - مصانع حمولة جاهزة:
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
Payloads.preToolUse.bash(command, cwd)
|
|
188
|
+
Payloads.preToolUse.write(filePath, content, cwd)
|
|
189
|
+
Payloads.preToolUse.read(filePath, cwd)
|
|
190
|
+
Payloads.postToolUse.bash(command, output, cwd)
|
|
191
|
+
Payloads.postToolUse.read(filePath, content, cwd)
|
|
192
|
+
Payloads.notification(message, cwd)
|
|
193
|
+
Payloads.stop(cwd)
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### كتابة اختبار شامل
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
import { describe, it, expect } from "vitest";
|
|
200
|
+
import { createFixtureEnv } from "../helpers/fixture-env";
|
|
201
|
+
import { runHook } from "../helpers/hook-runner";
|
|
202
|
+
import { Payloads } from "../helpers/payloads";
|
|
203
|
+
|
|
204
|
+
describe("block-rm-rf (E2E)", () => {
|
|
205
|
+
it("denies rm -rf", async () => {
|
|
206
|
+
const env = createFixtureEnv();
|
|
207
|
+
env.writeConfig({ enabledPolicies: ["block-rm-rf"] });
|
|
208
|
+
|
|
209
|
+
const result = await runHook(
|
|
210
|
+
"PreToolUse",
|
|
211
|
+
Payloads.preToolUse.bash("rm -rf /", env.cwd),
|
|
212
|
+
{ homeDir: env.home }
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
expect(result.exitCode).toBe(0);
|
|
216
|
+
expect(result.parsed?.hookSpecificOutput?.permissionDecision).toBe("deny");
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it("allows non-recursive rm", async () => {
|
|
220
|
+
const env = createFixtureEnv();
|
|
221
|
+
env.writeConfig({ enabledPolicies: ["block-rm-rf"] });
|
|
222
|
+
|
|
223
|
+
const result = await runHook(
|
|
224
|
+
"PreToolUse",
|
|
225
|
+
Payloads.preToolUse.bash("rm /tmp/file.txt", env.cwd),
|
|
226
|
+
{ homeDir: env.home }
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
expect(result.exitCode).toBe(0);
|
|
230
|
+
expect(result.stdout).toBe(""); // allow → empty stdout
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### أشكال استجابة الشامل
|
|
236
|
+
|
|
237
|
+
| القرار | كود الخروج | stdout |
|
|
238
|
+
|----------|-----------|--------|
|
|
239
|
+
| `PreToolUse` deny | `0` | `{"hookSpecificOutput":{"permissionDecision":"deny","permissionDecisionReason":"..."}}` |
|
|
240
|
+
| `PostToolUse` deny | `0` | `{"hookSpecificOutput":{"additionalContext":"Blocked ... because: ..."}}` |
|
|
241
|
+
| Instruct (غير Stop) | `0` | `{"hookSpecificOutput":{"additionalContext":"Instruction from failproofai: ..."}}` |
|
|
242
|
+
| تعليمات Stop | `2` | stdout فارغة؛ السبب في stderr |
|
|
243
|
+
| السماح | `0` | سلسلة فارغة |
|
|
244
|
+
|
|
245
|
+
### إعدادات Vitest
|
|
246
|
+
|
|
247
|
+
تستخدم اختبارات الشامل `vitest.config.e2e.mts` مع:
|
|
248
|
+
|
|
249
|
+
- `environment: "node"` - لا توجد حاجة لمتغيرات المتصفح العام
|
|
250
|
+
- `pool: "forks"` - عزل العملية الحقيقي (اختبارات تشغيل العمليات الفرعية)
|
|
251
|
+
- `testTimeout: 20_000` - 20 ثانية لكل اختبار (بدء الملف الثنائي وتقييم hook)
|
|
252
|
+
|
|
253
|
+
مجموعة `forks` مهمة: تشارك العمال المستندة إلى الخيط `globalThis`، وهو ما قد يتداخل مع اختبارات توليد العمليات الفرعية. تتجنب الفروع المستندة إلى العملية هذا.
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## CI
|
|
258
|
+
|
|
259
|
+
يجب أن تنجح عملية CI الكاملة (`bun run lint && bunx tsc --noEmit && bun run test:run && bun run build`) قبل الدمج. تعمل مجموعة الشامل كوظيفة CI منفصلة بالتوازي.
|
|
260
|
+
|
|
261
|
+
انظر [المساهمة](../CONTRIBUTING.md) للحصول على قائمة التحقق الكاملة قبل الدمج.
|
|
@@ -4,7 +4,7 @@ description: "How the hook handler, config loading, and policy evaluation work i
|
|
|
4
4
|
icon: sitemap
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
This document explains how failproofai works internally: how the hook system
|
|
7
|
+
This document explains how failproofai works internally: how the hook system intercepts agent tool calls, how configuration is loaded and merged, how policies are evaluated, and how the dashboard monitors agent activity.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -12,8 +12,8 @@ This document explains how failproofai works internally: how the hook system pro
|
|
|
12
12
|
|
|
13
13
|
failproofai has two independent subsystems:
|
|
14
14
|
|
|
15
|
-
1. **Hook handler**
|
|
16
|
-
2. **Dashboard**
|
|
15
|
+
1. **Hook handler** - A fast CLI subprocess that Claude Code invokes on every agent tool call. Evaluates policies and returns a decision.
|
|
16
|
+
2. **Agent Monitor (Dashboard)** - A Next.js web application for monitoring agent sessions and managing policies.
|
|
17
17
|
|
|
18
18
|
Both subsystems share configuration files in `~/.failproofai/` and the project's `.failproofai/` directory, but they run as separate processes and communicate only through the filesystem.
|
|
19
19
|
|
|
@@ -23,7 +23,7 @@ Both subsystems share configuration files in `~/.failproofai/` and the project's
|
|
|
23
23
|
|
|
24
24
|
### Integration with Claude Code
|
|
25
25
|
|
|
26
|
-
When you run `failproofai --install
|
|
26
|
+
When you run `failproofai policies --install`, it writes entries like this into `~/.claude/settings.json`:
|
|
27
27
|
|
|
28
28
|
```json
|
|
29
29
|
{
|
|
@@ -60,7 +60,7 @@ Claude Code then invokes `failproofai --hook PreToolUse` as a subprocess before
|
|
|
60
60
|
}
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
-
For `PostToolUse` events, the payload
|
|
63
|
+
For `PostToolUse` events, the payload also contains `tool_result` with the tool's output.
|
|
64
64
|
|
|
65
65
|
The handler enforces a 1 MB stdin limit. Payloads exceeding this are discarded and all policies implicitly allow.
|
|
66
66
|
|
|
@@ -102,21 +102,38 @@ The handler enforces a 1 MB stdin limit. Payloads exceeding this are discarded a
|
|
|
102
102
|
- Exit code: `0`
|
|
103
103
|
- Empty stdout
|
|
104
104
|
|
|
105
|
+
**Allow with message (beta):**
|
|
106
|
+
|
|
107
|
+
Since v0.0.2-beta.3, `allow(message)` lets a policy send informational context back to Claude even when the operation is permitted. The hook handler writes the following JSON to **stdout** (not a config file — this is the handler's response to Claude Code, just like deny and instruct responses above):
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
// Written to stdout by the hook handler process
|
|
111
|
+
{
|
|
112
|
+
"hookSpecificOutput": {
|
|
113
|
+
"additionalContext": "All CI checks passed on branch 'feat/my-feature'."
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
- Exit code: `0` (operation is allowed)
|
|
118
|
+
- When multiple policies return `allow` with a message, their messages are joined with newlines into a single `additionalContext` string
|
|
119
|
+
- If no policy provides a message, stdout is empty (same as before)
|
|
120
|
+
|
|
105
121
|
### Processing pipeline
|
|
106
122
|
|
|
107
123
|
`src/hooks/handler.ts` implements the full pipeline:
|
|
108
124
|
|
|
109
|
-
```
|
|
125
|
+
```text
|
|
110
126
|
stdin JSON
|
|
111
127
|
→ parse payload (max 1 MB)
|
|
112
128
|
→ extract session metadata (session_id, cwd, tool_name, tool_input, etc.)
|
|
113
129
|
→ readMergedHooksConfig(cwd) ← merges project + local + global config
|
|
114
130
|
→ register enabled builtin policies with resolved params
|
|
115
|
-
→ load custom
|
|
116
|
-
→ register custom
|
|
131
|
+
→ load custom policies from customPoliciesPath (if set)
|
|
132
|
+
→ register custom policies into policy registry
|
|
117
133
|
→ evaluate all policies (builtins first, then custom)
|
|
118
134
|
→ first deny short-circuits
|
|
119
135
|
→ instruct decisions accumulate
|
|
136
|
+
→ allow messages accumulate
|
|
120
137
|
→ write JSON decision to stdout
|
|
121
138
|
→ persist event to ~/.failproofai/hook-activity.jsonl
|
|
122
139
|
→ exit
|
|
@@ -130,17 +147,17 @@ The entire process runs in under 100ms for typical payloads with no LLM calls.
|
|
|
130
147
|
|
|
131
148
|
`src/hooks/hooks-config.ts` implements three-scope config loading.
|
|
132
149
|
|
|
133
|
-
```
|
|
150
|
+
```text
|
|
134
151
|
[1] {cwd}/.failproofai/policies-config.json ← project (highest priority)
|
|
135
152
|
[2] {cwd}/.failproofai/policies-config.local.json ← local
|
|
136
153
|
[3] ~/.failproofai/policies-config.json ← global (lowest priority)
|
|
137
154
|
```
|
|
138
155
|
|
|
139
156
|
Merge logic:
|
|
140
|
-
- `enabledPolicies`
|
|
141
|
-
- `policyParams`
|
|
142
|
-
- `customPoliciesPath`
|
|
143
|
-
- `llm`
|
|
157
|
+
- `enabledPolicies` - deduplicated union across all three files
|
|
158
|
+
- `policyParams` - per-policy key, first file that defines it wins entirely
|
|
159
|
+
- `customPoliciesPath` - first file that defines it wins
|
|
160
|
+
- `llm` - first file that defines it wins
|
|
144
161
|
|
|
145
162
|
The web dashboard uses `readHooksConfig()` (global only) for reading and writing, since it is not invoked with a project cwd.
|
|
146
163
|
|
|
@@ -169,7 +186,7 @@ After all policies run:
|
|
|
169
186
|
|
|
170
187
|
## Builtin policies
|
|
171
188
|
|
|
172
|
-
`src/hooks/builtin-policies.ts` defines all
|
|
189
|
+
`src/hooks/builtin-policies.ts` defines all 26 built-in policies as `BuiltinPolicyDefinition` objects:
|
|
173
190
|
|
|
174
191
|
```typescript
|
|
175
192
|
interface BuiltinPolicyDefinition {
|
|
@@ -193,7 +210,7 @@ Pattern matching inside policies uses parsed command tokens (argv), not raw stri
|
|
|
193
210
|
|
|
194
211
|
---
|
|
195
212
|
|
|
196
|
-
## Custom
|
|
213
|
+
## Custom policies
|
|
197
214
|
|
|
198
215
|
`src/hooks/custom-hooks-registry.ts` implements a `globalThis`-backed registry:
|
|
199
216
|
|
|
@@ -208,7 +225,7 @@ export function getCustomHooks(): CustomHook[] { ... }
|
|
|
208
225
|
export function clearCustomHooks(): void { ... } // used in tests
|
|
209
226
|
```
|
|
210
227
|
|
|
211
|
-
`src/hooks/custom-hooks-loader.ts` loads the user's
|
|
228
|
+
`src/hooks/custom-hooks-loader.ts` loads the user's policy file:
|
|
212
229
|
|
|
213
230
|
1. Read `customPoliciesPath` from config; skip if absent.
|
|
214
231
|
2. Resolve to absolute path; check file exists.
|
|
@@ -220,7 +237,7 @@ export function clearCustomHooks(): void { ... } // used in tests
|
|
|
220
237
|
|
|
221
238
|
On any error (file not found, syntax error, import failure), the error is logged to `~/.failproofai/hook.log` and the loader returns an empty array. Built-in policies are unaffected.
|
|
222
239
|
|
|
223
|
-
Custom
|
|
240
|
+
Custom policies are evaluated after all built-in policies. A custom policy `deny` still short-circuits further custom policies (but all built-ins have already run by that point).
|
|
224
241
|
|
|
225
242
|
---
|
|
226
243
|
|
|
@@ -249,7 +266,7 @@ One line per policy that made a non-allow decision. Allow decisions are not logg
|
|
|
249
266
|
|
|
250
267
|
The dashboard is a **Next.js 16** application using the App Router with React Server Components and Server Actions.
|
|
251
268
|
|
|
252
|
-
```
|
|
269
|
+
```text
|
|
253
270
|
app/
|
|
254
271
|
layout.tsx ← Root layout (theme, telemetry, nav)
|
|
255
272
|
projects/page.tsx ← Server component: list all Claude projects
|
|
@@ -275,22 +292,22 @@ app/
|
|
|
275
292
|
|
|
276
293
|
**Key design decisions:**
|
|
277
294
|
|
|
278
|
-
- No database
|
|
279
|
-
- Server Actions for mutations
|
|
280
|
-
- React Server Components for read pages
|
|
295
|
+
- No database - all persistent state is in plain files (`~/.failproofai/`, `~/.claude/projects/`).
|
|
296
|
+
- Server Actions for mutations - no REST API needed for CRUD operations.
|
|
297
|
+
- React Server Components for read pages - faster initial load, no client bundle for data fetching.
|
|
281
298
|
- Client components only where interactivity is needed (policy toggles, activity search, log viewer).
|
|
282
299
|
|
|
283
300
|
---
|
|
284
301
|
|
|
285
302
|
## File layout
|
|
286
303
|
|
|
287
|
-
```
|
|
304
|
+
```text
|
|
288
305
|
failproofai/
|
|
289
306
|
├── bin/
|
|
290
307
|
│ └── failproofai.mjs # CLI router (hook / dashboard / install / etc.)
|
|
291
308
|
├── src/hooks/
|
|
292
309
|
│ ├── handler.ts # Hook event pipeline
|
|
293
|
-
│ ├── builtin-policies.ts #
|
|
310
|
+
│ ├── builtin-policies.ts # 26 policy definitions
|
|
294
311
|
│ ├── policy-evaluator.ts # Policy execution engine
|
|
295
312
|
│ ├── policy-registry.ts # Policy registration and lookup
|
|
296
313
|
│ ├── policy-types.ts # TypeScript interfaces
|