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,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 列出策略
|
|
3
|
+
description: "查看已启用的策略、其参数以及自定义策略"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
failproofai policies
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
显示所有策略及其状态、已配置的参数和自定义策略。
|
|
11
|
+
|
|
12
|
+
## 示例输出
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
Failproof AI Hook Policies (user)
|
|
16
|
+
|
|
17
|
+
Status Name Description
|
|
18
|
+
────── ──────────────────────────────────────────────────────────────
|
|
19
|
+
✓ block-sudo Block sudo commands
|
|
20
|
+
allowPatterns: ["sudo systemctl status"]
|
|
21
|
+
✓ block-rm-rf Block recursive deletions
|
|
22
|
+
✗ block-curl-pipe-sh Block curl|bash patterns
|
|
23
|
+
✓ sanitize-api-keys Redact API keys from output
|
|
24
|
+
additionalPatterns: [{ regex: "MY_TOKEN_...", label: "..." }]
|
|
25
|
+
|
|
26
|
+
── Custom Policies (/home/alice/myproject/my-policies.js) ──────────────
|
|
27
|
+
✓ require-jira-ticket Block commits without ticket
|
|
28
|
+
✓ approval-gate Approval gate for destructive ops
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`policyParams` 中的未知键会在此处标记出来,帮助你尽早发现拼写错误。
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 卸载策略
|
|
3
|
+
description: "从 Claude Code 的设置中移除 hook 条目"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
failproofai policies --uninstall [policy-names...] [options]
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
从 Claude Code 的 `settings.json` 中移除 failproofai hook 条目。
|
|
11
|
+
|
|
12
|
+
别名:`failproofai p -u`
|
|
13
|
+
|
|
14
|
+
## 选项
|
|
15
|
+
|
|
16
|
+
| 标志 | 描述 |
|
|
17
|
+
|------|------|
|
|
18
|
+
| `--scope user` | 从全局设置中移除(默认) |
|
|
19
|
+
| `--scope project` | 从项目设置中移除 |
|
|
20
|
+
| `--scope local` | 从本地设置中移除 |
|
|
21
|
+
| `--scope all` | 同时从所有作用域中移除 |
|
|
22
|
+
| `--custom` / `-c` | 从配置中清除 `customPoliciesPath` |
|
|
23
|
+
| `--beta` | 仅从配置中移除 beta 策略 |
|
|
24
|
+
|
|
25
|
+
## 行为说明
|
|
26
|
+
|
|
27
|
+
- **不指定策略名称** — 从设置文件中移除所有 failproofai hook 条目
|
|
28
|
+
- **指定具体名称** — 禁用对应策略,但保留已安装的 hook
|
|
29
|
+
|
|
30
|
+
## 示例
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# 全局移除所有 hook
|
|
34
|
+
failproofai policies --uninstall
|
|
35
|
+
|
|
36
|
+
# 禁用特定策略(保留已安装的 hook)
|
|
37
|
+
failproofai policies --uninstall block-sudo
|
|
38
|
+
|
|
39
|
+
# 从所有作用域中移除 hook
|
|
40
|
+
failproofai policies --uninstall --scope all
|
|
41
|
+
|
|
42
|
+
# 清除自定义策略路径
|
|
43
|
+
failproofai policies --uninstall --custom
|
|
44
|
+
```
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 配置
|
|
3
|
+
description: "配置文件格式、三级作用域系统及合并规则"
|
|
4
|
+
icon: gear
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
failproofai 使用 JSON 配置文件来控制哪些策略处于激活状态、策略的行为方式以及自定义策略的加载位置。配置设计便于与团队共享——将其提交到代码仓库,每位开发者都能获得相同的智能体安全防护网。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 配置作用域
|
|
12
|
+
|
|
13
|
+
共有三个配置作用域,按优先级顺序进行评估:
|
|
14
|
+
|
|
15
|
+
| 作用域 | 文件路径 | 用途 |
|
|
16
|
+
|-------|-----------|---------|
|
|
17
|
+
| **project** | `.failproofai/policies-config.json` | 每个代码仓库的配置,提交到版本控制 |
|
|
18
|
+
| **local** | `.failproofai/policies-config.local.json` | 个人级别的仓库覆盖配置,已加入 .gitignore |
|
|
19
|
+
| **global** | `~/.failproofai/policies-config.json` | 适用于所有项目的用户级默认配置 |
|
|
20
|
+
|
|
21
|
+
当 failproofai 接收到 hook 事件时,会加载并合并当前工作目录下存在的所有三个文件。
|
|
22
|
+
|
|
23
|
+
### 合并规则
|
|
24
|
+
|
|
25
|
+
**`enabledPolicies`** — 取三个作用域的并集。在任意级别启用的策略均处于激活状态。
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
project: ["block-sudo"]
|
|
29
|
+
local: ["block-rm-rf"]
|
|
30
|
+
global: ["block-sudo", "sanitize-api-keys"]
|
|
31
|
+
|
|
32
|
+
resolved: ["block-sudo", "block-rm-rf", "sanitize-api-keys"] ← 去重后的并集
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**`policyParams`** — 最先定义某策略参数的作用域完全优先。策略参数内部的值不进行深度合并。
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
project: block-sudo → { allowPatterns: ["sudo apt-get update"] }
|
|
39
|
+
global: block-sudo → { allowPatterns: ["sudo systemctl status"] }
|
|
40
|
+
|
|
41
|
+
resolved: { allowPatterns: ["sudo apt-get update"] } ← project 优先,global 被忽略
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
project: (无 block-sudo 条目)
|
|
46
|
+
local: (无 block-sudo 条目)
|
|
47
|
+
global: block-sudo → { allowPatterns: ["sudo systemctl status"] }
|
|
48
|
+
|
|
49
|
+
resolved: { allowPatterns: ["sudo systemctl status"] } ← 向下回落到 global
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**`customPoliciesPath`** — 最先定义该字段的作用域优先。
|
|
53
|
+
|
|
54
|
+
**`llm`** — 最先定义该字段的作用域优先。
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 配置文件格式
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"enabledPolicies": [
|
|
63
|
+
"block-sudo",
|
|
64
|
+
"block-rm-rf",
|
|
65
|
+
"block-push-master",
|
|
66
|
+
"sanitize-api-keys",
|
|
67
|
+
"sanitize-jwt",
|
|
68
|
+
"block-env-files",
|
|
69
|
+
"block-read-outside-cwd"
|
|
70
|
+
],
|
|
71
|
+
"policyParams": {
|
|
72
|
+
"block-sudo": {
|
|
73
|
+
"allowPatterns": ["sudo systemctl status", "sudo journalctl"]
|
|
74
|
+
},
|
|
75
|
+
"block-push-master": {
|
|
76
|
+
"protectedBranches": ["main", "release", "prod"]
|
|
77
|
+
},
|
|
78
|
+
"block-rm-rf": {
|
|
79
|
+
"allowPaths": ["/tmp"]
|
|
80
|
+
},
|
|
81
|
+
"block-read-outside-cwd": {
|
|
82
|
+
"allowPaths": ["/shared/data", "/opt/company"]
|
|
83
|
+
},
|
|
84
|
+
"sanitize-api-keys": {
|
|
85
|
+
"additionalPatterns": [
|
|
86
|
+
{ "regex": "myco_[A-Za-z0-9]{32}", "label": "MyCo API key" }
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
"warn-large-file-write": {
|
|
90
|
+
"thresholdKb": 512
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"customPoliciesPath": "/home/alice/myproject/my-policies.js"
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 字段参考
|
|
100
|
+
|
|
101
|
+
### `enabledPolicies`
|
|
102
|
+
|
|
103
|
+
类型:`string[]`
|
|
104
|
+
|
|
105
|
+
要启用的策略名称列表。名称必须与 `failproofai policies` 显示的策略标识符完全匹配。完整列表请参阅[内置策略](/zh/built-in-policies)。
|
|
106
|
+
|
|
107
|
+
不在 `enabledPolicies` 中的策略处于非激活状态,即使在 `policyParams` 中有对应条目也同样如此。
|
|
108
|
+
|
|
109
|
+
### `policyParams`
|
|
110
|
+
|
|
111
|
+
类型:`Record<string, Record<string, unknown>>`
|
|
112
|
+
|
|
113
|
+
各策略的参数覆盖配置。外层键为策略名称,内层键为策略专属参数。每个策略的可用参数详见[内置策略](/zh/built-in-policies)。
|
|
114
|
+
|
|
115
|
+
如果某策略有参数但未指定,则使用该策略的内置默认值。未配置 `policyParams` 的用户将获得与之前版本完全相同的行为。
|
|
116
|
+
|
|
117
|
+
策略参数块中的未知键在 hook 触发时会被静默忽略,但运行 `failproofai policies` 时会显示为警告。
|
|
118
|
+
|
|
119
|
+
#### `hint`(通用字段)
|
|
120
|
+
|
|
121
|
+
类型:`string`(可选)
|
|
122
|
+
|
|
123
|
+
当策略返回 deny 或 instruct 时,附加到原因末尾的消息。使用它可以在不修改策略本身的情况下,为 Claude 提供可操作的指导建议。
|
|
124
|
+
|
|
125
|
+
适用于任何类型的策略——内置策略、自定义策略(`custom/`)、项目约定策略(`.failproofai-project/`)或用户约定策略(`.failproofai-user/`)。
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"policyParams": {
|
|
130
|
+
"block-force-push": {
|
|
131
|
+
"hint": "Try creating a fresh branch instead."
|
|
132
|
+
},
|
|
133
|
+
"block-sudo": {
|
|
134
|
+
"allowPatterns": ["sudo apt-get"],
|
|
135
|
+
"hint": "Use apt-get directly without sudo."
|
|
136
|
+
},
|
|
137
|
+
"custom/my-policy": {
|
|
138
|
+
"hint": "Ask the user for approval first."
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
当 block-force-push 拒绝操作时,Claude 会看到:*"Force-pushing is blocked. Try creating a fresh branch instead."*
|
|
145
|
+
|
|
146
|
+
非字符串值和空字符串会被静默忽略。若未设置 `hint`,行为保持不变(向后兼容)。
|
|
147
|
+
|
|
148
|
+
### `customPoliciesPath`
|
|
149
|
+
|
|
150
|
+
类型:`string`(绝对路径)
|
|
151
|
+
|
|
152
|
+
包含自定义 hook 策略的 JavaScript 文件路径。此字段由 `failproofai policies --install --custom <path>` 自动设置(路径在存储前会解析为绝对路径)。
|
|
153
|
+
|
|
154
|
+
每次 hook 事件触发时都会重新加载该文件,不存在缓存机制。关于编写自定义策略的详情,请参阅[自定义策略](/zh/custom-policies)。
|
|
155
|
+
|
|
156
|
+
### 基于约定的策略(v0.0.2-beta.7+)
|
|
157
|
+
|
|
158
|
+
除显式指定的 `customPoliciesPath` 外,failproofai 还会自动发现并加载 `.failproofai/policies/` 目录中的策略文件:
|
|
159
|
+
|
|
160
|
+
| 级别 | 目录 | 作用域 |
|
|
161
|
+
|-------|-----------|-------|
|
|
162
|
+
| 项目 | `.failproofai/policies/` | 通过版本控制与团队共享 |
|
|
163
|
+
| 用户 | `~/.failproofai/policies/` | 个人级别,适用于所有项目 |
|
|
164
|
+
|
|
165
|
+
**文件匹配规则:** 仅加载符合 `*policies.{js,mjs,ts}` 模式的文件(例如 `security-policies.mjs`、`workflow-policies.js`),目录中的其他文件将被忽略。
|
|
166
|
+
|
|
167
|
+
**无需配置:** 约定策略无需在 `policies-config.json` 中添加任何条目。只需将文件放入对应目录,下次 hook 事件触发时即可自动加载。
|
|
168
|
+
|
|
169
|
+
**联合加载:** 项目级和用户级约定目录都会被扫描。两个级别中所有匹配的文件都会被加载(与 `customPoliciesPath` 的首个作用域优先规则不同)。
|
|
170
|
+
|
|
171
|
+
更多详情和示例请参阅[自定义策略](/zh/custom-policies)。
|
|
172
|
+
|
|
173
|
+
### `llm`
|
|
174
|
+
|
|
175
|
+
类型:`object`(可选)
|
|
176
|
+
|
|
177
|
+
适用于需要进行 AI 调用的策略的 LLM 客户端配置。大多数场景下无需配置。
|
|
178
|
+
|
|
179
|
+
```json
|
|
180
|
+
{
|
|
181
|
+
"llm": {
|
|
182
|
+
"model": "claude-sonnet-4-6",
|
|
183
|
+
"apiKey": "sk-ant-..."
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 通过 CLI 管理配置
|
|
191
|
+
|
|
192
|
+
`policies --install` 和 `policies --uninstall` 命令会写入 Claude Code 的 `settings.json`(hook 入口点),而 `policies-config.json` 则是由你直接管理的文件。两者相互独立:
|
|
193
|
+
|
|
194
|
+
- **`settings.json`** — 告知 Claude Code 在每次工具调用时执行 `failproofai --hook <event>`
|
|
195
|
+
- **`policies-config.json`** — 告知 failproofai 要评估哪些策略以及使用什么参数
|
|
196
|
+
|
|
197
|
+
你可以随时直接编辑 `policies-config.json`,修改将在下次 hook 事件触发时立即生效,无需重启。
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 示例:包含团队默认值的项目级配置
|
|
202
|
+
|
|
203
|
+
将 `.failproofai/policies-config.json` 提交到代码仓库:
|
|
204
|
+
|
|
205
|
+
```json
|
|
206
|
+
{
|
|
207
|
+
"enabledPolicies": [
|
|
208
|
+
"block-sudo",
|
|
209
|
+
"block-rm-rf",
|
|
210
|
+
"block-push-master",
|
|
211
|
+
"sanitize-api-keys",
|
|
212
|
+
"block-env-files"
|
|
213
|
+
],
|
|
214
|
+
"policyParams": {
|
|
215
|
+
"block-push-master": {
|
|
216
|
+
"protectedBranches": ["main", "release", "hotfix"]
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
每位开发者可以在此基础上创建 `.failproofai/policies-config.local.json`(已加入 .gitignore)进行个人覆盖配置,而不会影响其他团队成员。
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 自定义策略
|
|
3
|
+
description: "用 JavaScript 编写您自己的策略——强制执行项目规范、防止偏离、检测失败、与外部系统集成"
|
|
4
|
+
icon: code
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
自定义策略允许您为任何 Agent 行为编写规则:强制执行项目规范、防止偏离、限制破坏性操作、检测卡死的 Agent,或与 Slack、审批工作流等系统集成。它们使用与内置策略相同的 hook 事件系统以及 `allow`、`deny`、`instruct` 决策机制。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 快速示例
|
|
12
|
+
|
|
13
|
+
```js
|
|
14
|
+
// my-policies.js
|
|
15
|
+
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
16
|
+
|
|
17
|
+
customPolicies.add({
|
|
18
|
+
name: "no-production-writes",
|
|
19
|
+
description: "Block writes to paths containing 'production'",
|
|
20
|
+
match: { events: ["PreToolUse"] },
|
|
21
|
+
fn: async (ctx) => {
|
|
22
|
+
if (ctx.toolName !== "Write" && ctx.toolName !== "Edit") return allow();
|
|
23
|
+
const path = ctx.toolInput?.file_path ?? "";
|
|
24
|
+
if (path.includes("production")) {
|
|
25
|
+
return deny("Writes to production paths are blocked");
|
|
26
|
+
}
|
|
27
|
+
return allow();
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
安装:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
failproofai policies --install --custom ./my-policies.js
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 两种加载自定义策略的方式
|
|
41
|
+
|
|
42
|
+
### 方式一:基于约定(推荐,v0.0.2-beta.7+)
|
|
43
|
+
|
|
44
|
+
将 `*policies.{js,mjs,ts}` 文件放入 `.failproofai/policies/` 目录,它们会被自动加载——无需任何标志或配置更改。这类似于 git hooks:放入文件即可生效。
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
# 项目级别——提交到 git,与团队共享
|
|
48
|
+
.failproofai/policies/security-policies.mjs
|
|
49
|
+
.failproofai/policies/workflow-policies.mjs
|
|
50
|
+
|
|
51
|
+
# 用户级别——个人配置,适用于所有项目
|
|
52
|
+
~/.failproofai/policies/my-policies.mjs
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**工作原理:**
|
|
56
|
+
- 项目目录和用户目录都会被扫描(取并集——不是先匹配作用域优先)
|
|
57
|
+
- 每个目录内的文件按字母顺序加载。可使用 `01-`、`02-` 等前缀控制顺序
|
|
58
|
+
- 只加载匹配 `*policies.{js,mjs,ts}` 的文件,其他文件会被忽略
|
|
59
|
+
- 每个文件独立加载(单文件失败开放)
|
|
60
|
+
- 与显式 `--custom` 和内置策略兼容并存
|
|
61
|
+
|
|
62
|
+
<Tip>
|
|
63
|
+
基于约定的策略是在团队中共享策略的最简便方式。将 `.failproofai/policies/` 提交到 git,每位团队成员都能自动获取这些策略。
|
|
64
|
+
</Tip>
|
|
65
|
+
|
|
66
|
+
### 方式二:显式文件路径
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# 使用自定义策略文件安装
|
|
70
|
+
failproofai policies --install --custom ./my-policies.js
|
|
71
|
+
|
|
72
|
+
# 替换策略文件路径
|
|
73
|
+
failproofai policies --install --custom ./new-policies.js
|
|
74
|
+
|
|
75
|
+
# 从配置中移除自定义策略路径
|
|
76
|
+
failproofai policies --uninstall --custom
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
解析后的绝对路径以 `customPoliciesPath` 的形式存储在 `policies-config.json` 中。每次 hook 事件都会重新加载该文件——事件之间不存在缓存。
|
|
80
|
+
|
|
81
|
+
### 同时使用两种方式
|
|
82
|
+
|
|
83
|
+
基于约定的策略与显式 `--custom` 文件可以共存。加载顺序如下:
|
|
84
|
+
|
|
85
|
+
1. 显式 `customPoliciesPath` 文件(如已配置)
|
|
86
|
+
2. 项目约定文件(`{cwd}/.failproofai/policies/`,按字母顺序)
|
|
87
|
+
3. 用户约定文件(`~/.failproofai/policies/`,按字母顺序)
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## API
|
|
92
|
+
|
|
93
|
+
### 导入
|
|
94
|
+
|
|
95
|
+
```js
|
|
96
|
+
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### `customPolicies.add(hook)`
|
|
100
|
+
|
|
101
|
+
注册一个策略。可多次调用以在同一文件中添加多个策略。
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
customPolicies.add({
|
|
105
|
+
name: string; // 必填 - 唯一标识符
|
|
106
|
+
description?: string; // 显示在 `failproofai policies` 输出中
|
|
107
|
+
match?: { events?: HookEventType[] }; // 按事件类型过滤;省略则匹配所有事件
|
|
108
|
+
fn: (ctx: PolicyContext) => PolicyResult | Promise<PolicyResult>;
|
|
109
|
+
});
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 决策辅助函数
|
|
113
|
+
|
|
114
|
+
| 函数 | 效果 | 适用场景 |
|
|
115
|
+
|----------|--------|----------|
|
|
116
|
+
| `allow()` | 静默允许操作 | 操作安全,无需提示 |
|
|
117
|
+
| `deny(message)` | 阻止操作 | Agent 不应执行此操作 |
|
|
118
|
+
| `instruct(message)` | 添加上下文但不阻止 | 为 Agent 提供额外上下文以保持正轨 |
|
|
119
|
+
|
|
120
|
+
`deny(message)` - 消息会以 `"Blocked by failproofai:"` 为前缀显示给 Claude。单个 `deny` 会短路所有后续评估。
|
|
121
|
+
|
|
122
|
+
`instruct(message)` - 消息会附加到 Claude 当前工具调用的上下文中。所有 `instruct` 消息会被累积并一并发送。
|
|
123
|
+
|
|
124
|
+
<Tip>
|
|
125
|
+
您可以通过在 `policyParams` 中添加 `hint` 字段,为任何 `deny` 或 `instruct` 消息追加额外指导——无需修改代码。这对自定义(`custom/`)、项目约定(`.failproofai-project/`)和用户约定(`.failproofai-user/`)策略同样适用。详情请参阅[配置 → hint](/zh/configuration#hint-cross-cutting)。
|
|
126
|
+
</Tip>
|
|
127
|
+
|
|
128
|
+
### 信息性 allow 消息(Beta)
|
|
129
|
+
|
|
130
|
+
<Note>
|
|
131
|
+
`allow(message)` 是自 v0.0.2-beta.3 起提供的 Beta 功能。API 可能在未来版本中发生变化。早期版本仅支持不带参数的 `allow()`。
|
|
132
|
+
</Note>
|
|
133
|
+
|
|
134
|
+
`allow(message)` 允许操作**并**向 Claude 发送一条信息性消息。该消息以 `additionalContext` 的形式通过 hook 处理器的 stdout 响应发送——与 `instruct` 使用相同的机制,但语义不同:它是状态更新,而非警告。
|
|
135
|
+
|
|
136
|
+
| 函数 | 效果 | 适用场景 |
|
|
137
|
+
|----------|--------|----------|
|
|
138
|
+
| `allow(message)` | 允许并向 Claude 发送上下文 | 确认检查已通过,或说明为何跳过某项检查 |
|
|
139
|
+
|
|
140
|
+
使用场景:
|
|
141
|
+
- **状态确认:** `allow("All CI checks passed.")` — 告知 Claude 一切正常
|
|
142
|
+
- **失败开放说明:** `allow("GitHub CLI not installed, skipping CI check.")` — 告知 Claude 跳过检查的原因,使其拥有完整上下文
|
|
143
|
+
- **多条消息累积:** 若多个策略各自返回 `allow(message)`,所有消息会以换行符连接并一并发送
|
|
144
|
+
|
|
145
|
+
```js
|
|
146
|
+
customPolicies.add({
|
|
147
|
+
name: "confirm-branch-status",
|
|
148
|
+
match: { events: ["Stop"] },
|
|
149
|
+
fn: async (ctx) => {
|
|
150
|
+
const cwd = ctx.session?.cwd;
|
|
151
|
+
if (!cwd) return allow("No working directory, skipping branch check.");
|
|
152
|
+
|
|
153
|
+
// ... check branch status ...
|
|
154
|
+
if (allPushed) {
|
|
155
|
+
return allow("Branch is up to date with remote.");
|
|
156
|
+
}
|
|
157
|
+
return deny("Unpushed changes detected.");
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### `PolicyContext` 字段
|
|
163
|
+
|
|
164
|
+
| 字段 | 类型 | 描述 |
|
|
165
|
+
|-------|------|-------------|
|
|
166
|
+
| `eventType` | `string` | `"PreToolUse"`、`"PostToolUse"`、`"Notification"`、`"Stop"` |
|
|
167
|
+
| `toolName` | `string \| undefined` | 被调用的工具(如 `"Bash"`、`"Write"`、`"Read"`) |
|
|
168
|
+
| `toolInput` | `Record<string, unknown> \| undefined` | 工具的输入参数 |
|
|
169
|
+
| `payload` | `Record<string, unknown>` | 来自 Claude Code 的完整原始事件载荷 |
|
|
170
|
+
| `session` | `SessionMetadata \| undefined` | 会话上下文(见下文) |
|
|
171
|
+
|
|
172
|
+
### `SessionMetadata` 字段
|
|
173
|
+
|
|
174
|
+
| 字段 | 类型 | 描述 |
|
|
175
|
+
|-------|------|-------------|
|
|
176
|
+
| `sessionId` | `string` | Claude Code 会话标识符 |
|
|
177
|
+
| `cwd` | `string` | Claude Code 会话的工作目录 |
|
|
178
|
+
| `transcriptPath` | `string` | 会话 JSONL 记录文件的路径 |
|
|
179
|
+
|
|
180
|
+
### 事件类型
|
|
181
|
+
|
|
182
|
+
| 事件 | 触发时机 | `toolInput` 内容 |
|
|
183
|
+
|-------|--------------|----------------------|
|
|
184
|
+
| `PreToolUse` | Claude 执行工具之前 | 工具的输入(如 Bash 对应 `{ command: "..." }`) |
|
|
185
|
+
| `PostToolUse` | 工具执行完成之后 | 工具的输入 + `tool_result`(输出内容) |
|
|
186
|
+
| `Notification` | Claude 发送通知时 | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }` - hook 必须始终返回 `allow()`,不能阻止通知 |
|
|
187
|
+
| `Stop` | Claude 会话结束时 | 空 |
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 评估顺序
|
|
192
|
+
|
|
193
|
+
策略按以下顺序评估:
|
|
194
|
+
|
|
195
|
+
1. 内置策略(按定义顺序)
|
|
196
|
+
2. 来自 `customPoliciesPath` 的显式自定义策略(按 `.add()` 顺序)
|
|
197
|
+
3. 来自项目 `.failproofai/policies/` 的约定策略(文件按字母顺序,文件内按 `.add()` 顺序)
|
|
198
|
+
4. 来自用户 `~/.failproofai/policies/` 的约定策略(文件按字母顺序,文件内按 `.add()` 顺序)
|
|
199
|
+
|
|
200
|
+
<Note>
|
|
201
|
+
第一个 `deny` 会短路所有后续策略。所有 `instruct` 消息会被累积并一并发送。
|
|
202
|
+
</Note>
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 传递性导入
|
|
207
|
+
|
|
208
|
+
自定义策略文件可以使用相对路径导入本地模块:
|
|
209
|
+
|
|
210
|
+
```js
|
|
211
|
+
// my-policies.js
|
|
212
|
+
import { isBlockedPath } from "./utils.js";
|
|
213
|
+
import { checkApproval } from "./approval-client.js";
|
|
214
|
+
|
|
215
|
+
customPolicies.add({
|
|
216
|
+
name: "approval-gate",
|
|
217
|
+
fn: async (ctx) => {
|
|
218
|
+
if (ctx.toolName !== "Bash") return allow();
|
|
219
|
+
const approved = await checkApproval(ctx.toolInput?.command, ctx.session?.sessionId);
|
|
220
|
+
return approved ? allow() : deny("Approval required for this command");
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
从入口文件可达的所有相对导入都会被解析。实现方式是将 `from "failproofai"` 的导入重写为实际的 dist 路径,并创建临时 `.mjs` 文件以确保 ESM 兼容性。
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## 事件类型过滤
|
|
230
|
+
|
|
231
|
+
使用 `match.events` 限制策略的触发时机:
|
|
232
|
+
|
|
233
|
+
```js
|
|
234
|
+
customPolicies.add({
|
|
235
|
+
name: "require-summary-on-stop",
|
|
236
|
+
match: { events: ["Stop"] },
|
|
237
|
+
fn: async (ctx) => {
|
|
238
|
+
// 仅在会话结束时触发
|
|
239
|
+
// ctx.session.transcriptPath 包含完整的会话日志
|
|
240
|
+
return allow();
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
省略 `match` 则对每种事件类型都触发。
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## 错误处理与失败模式
|
|
250
|
+
|
|
251
|
+
自定义策略采用**失败开放**原则:错误不会阻止内置策略运行或导致 hook 处理器崩溃。
|
|
252
|
+
|
|
253
|
+
| 失败情形 | 行为 |
|
|
254
|
+
|---------|----------|
|
|
255
|
+
| `customPoliciesPath` 未设置 | 不运行显式自定义策略;约定策略和内置策略正常继续 |
|
|
256
|
+
| 文件未找到 | 警告记录到 `~/.failproofai/hook.log`;内置策略继续运行 |
|
|
257
|
+
| 语法/导入错误(显式) | 错误记录到 `~/.failproofai/hook.log`;跳过显式自定义策略 |
|
|
258
|
+
| 语法/导入错误(约定) | 错误记录;跳过该文件,其他约定文件继续加载 |
|
|
259
|
+
| `fn` 运行时抛出异常 | 错误记录;该 hook 视为 `allow`;其他 hook 继续运行 |
|
|
260
|
+
| `fn` 执行超过 10 秒 | 超时记录;视为 `allow` |
|
|
261
|
+
| 约定目录不存在 | 不运行约定策略;不报错 |
|
|
262
|
+
|
|
263
|
+
<Tip>
|
|
264
|
+
如需调试自定义策略错误,可监控日志文件:
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
tail -f ~/.failproofai/hook.log
|
|
268
|
+
```
|
|
269
|
+
</Tip>
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## 完整示例:多个策略
|
|
274
|
+
|
|
275
|
+
```js
|
|
276
|
+
// my-policies.js
|
|
277
|
+
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
278
|
+
|
|
279
|
+
// 防止 Agent 写入 secrets/ 目录
|
|
280
|
+
customPolicies.add({
|
|
281
|
+
name: "block-secrets-dir",
|
|
282
|
+
description: "Prevent agent from writing to secrets/ directory",
|
|
283
|
+
match: { events: ["PreToolUse"] },
|
|
284
|
+
fn: async (ctx) => {
|
|
285
|
+
if (!["Write", "Edit"].includes(ctx.toolName ?? "")) return allow();
|
|
286
|
+
const path = ctx.toolInput?.file_path ?? "";
|
|
287
|
+
if (path.includes("secrets/")) return deny("Writing to secrets/ is not permitted");
|
|
288
|
+
return allow();
|
|
289
|
+
},
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
// 引导 Agent 保持正轨:提交前验证测试
|
|
293
|
+
customPolicies.add({
|
|
294
|
+
name: "remind-test-before-commit",
|
|
295
|
+
description: "Keep the agent on track: verify tests pass before committing",
|
|
296
|
+
match: { events: ["PreToolUse"] },
|
|
297
|
+
fn: async (ctx) => {
|
|
298
|
+
if (ctx.toolName !== "Bash") return allow();
|
|
299
|
+
const cmd = ctx.toolInput?.command ?? "";
|
|
300
|
+
if (/git\s+commit/.test(cmd)) {
|
|
301
|
+
return instruct("Verify all tests pass before committing. Run `bun test` if you haven't already.");
|
|
302
|
+
}
|
|
303
|
+
return allow();
|
|
304
|
+
},
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// 在冻结期间防止计划外的依赖变更
|
|
308
|
+
customPolicies.add({
|
|
309
|
+
name: "dependency-freeze",
|
|
310
|
+
description: "Prevent unplanned dependency changes during freeze period",
|
|
311
|
+
match: { events: ["PreToolUse"] },
|
|
312
|
+
fn: async (ctx) => {
|
|
313
|
+
if (ctx.toolName !== "Bash") return allow();
|
|
314
|
+
const cmd = ctx.toolInput?.command ?? "";
|
|
315
|
+
const isInstall = /^(npm install|yarn add|bun add|pnpm add)\s+\S/.test(cmd);
|
|
316
|
+
if (isInstall && process.env.DEPENDENCY_FREEZE === "1") {
|
|
317
|
+
return deny("Package installs are frozen. Unset DEPENDENCY_FREEZE to allow.");
|
|
318
|
+
}
|
|
319
|
+
return allow();
|
|
320
|
+
},
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
export { customPolicies };
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## 示例文件
|
|
329
|
+
|
|
330
|
+
`examples/` 目录包含可直接运行的策略文件:
|
|
331
|
+
|
|
332
|
+
| 文件 | 内容 |
|
|
333
|
+
|------|----------|
|
|
334
|
+
| `examples/policies-basic.js` | 五个涵盖常见 Agent 失败模式的入门策略 |
|
|
335
|
+
| `examples/policies-advanced/index.js` | 高级模式:传递性导入、异步调用、输出脱敏、会话结束 hook |
|
|
336
|
+
| `examples/convention-policies/security-policies.mjs` | 基于约定的安全策略(阻止 .env 写入、防止 git 历史重写) |
|
|
337
|
+
| `examples/convention-policies/workflow-policies.mjs` | 基于约定的工作流策略(测试提醒、审计文件写入) |
|
|
338
|
+
|
|
339
|
+
### 使用显式文件示例
|
|
340
|
+
|
|
341
|
+
```bash
|
|
342
|
+
failproofai policies --install --custom ./examples/policies-basic.js
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### 使用基于约定的示例
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
# 复制到项目级别
|
|
349
|
+
mkdir -p .failproofai/policies
|
|
350
|
+
cp examples/convention-policies/*.mjs .failproofai/policies/
|
|
351
|
+
|
|
352
|
+
# 或复制到用户级别
|
|
353
|
+
mkdir -p ~/.failproofai/policies
|
|
354
|
+
cp examples/convention-policies/*.mjs ~/.failproofai/policies/
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
无需安装命令——下次 hook 事件触发时,文件会被自动加载。
|