failproofai 0.0.6-beta.2 → 0.0.6-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +7 -1
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +17 -17
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +17 -17
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +16 -16
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +16 -16
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +11 -11
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g72weg._.js +1 -1
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0i5kvry._.js → [root-of-the-server]__0om-5pe._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__05akje6._.js → [root-of-the-server]__111.vxi._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0mebn66._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +9 -9
- package/.next/standalone/.next/static/chunks/{05j1px0r8yzh6.js → 02dqjyv6_9mhq.js} +2 -2
- package/.next/standalone/.next/static/chunks/{14cl9poem30dq.js → 070orfsl6.xal.js} +1 -1
- package/.next/standalone/.next/static/chunks/0mir9jdxn35~s.css +1 -0
- package/.next/standalone/.next/static/chunks/{00j0rr7rh8ef8.js → 0o547jv-k_k35.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0ijk_kek9_wyx.js → 0pk2h2.mjxy.m.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0xpl.oscrakvx.js → 0rcwkbh24w38b.js} +1 -1
- package/.next/standalone/.next/static/chunks/{1052sguyd-.ka.js → 140xx_tfr~lm_.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0npb~873.wvg3.js → 169_e4dq~1~b6.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0badv41uxa56..js → 17ne4p.1sw1jy.js} +1 -1
- package/.next/standalone/next.config.ts +6 -0
- package/.next/standalone/package.json +2 -2
- package/.next/standalone/server.js +1 -1
- package/bin/failproofai.mjs +91 -4
- package/dist/cli.mjs +1155 -54
- package/package.json +2 -2
- package/scripts/prune-standalone.mjs +128 -0
- package/src/auth/login.ts +104 -0
- package/src/auth/logout.ts +50 -0
- package/src/auth/token-store.ts +64 -0
- package/src/hooks/builtin-policies.ts +22 -20
- package/src/hooks/handler.ts +35 -15
- package/src/relay/daemon.ts +362 -0
- package/src/relay/pid.ts +76 -0
- package/src/relay/queue.ts +225 -0
- package/.next/standalone/.claude/settings.json +0 -316
- package/.next/standalone/.failproofai/policies/review-policies.mjs +0 -113
- package/.next/standalone/.failproofai/policies/workflow-policies.mjs +0 -63
- package/.next/standalone/.failproofai/policies-config.json +0 -39
- package/.next/standalone/.next/static/chunks/0gu_a.a80ritd.css +0 -1
- package/.next/standalone/AGENTS.md +0 -80
- package/.next/standalone/CHANGELOG.md +0 -151
- package/.next/standalone/CLAUDE.md +0 -165
- package/.next/standalone/CONTRIBUTING.md +0 -76
- package/.next/standalone/Dockerfile.docs +0 -12
- package/.next/standalone/LICENSE +0 -42
- package/.next/standalone/README.md +0 -301
- package/.next/standalone/bin/failproofai.mjs +0 -352
- package/.next/standalone/bun.lock +0 -1119
- package/.next/standalone/components.json +0 -23
- package/.next/standalone/dist/cli.mjs +0 -3595
- package/.next/standalone/dist/index.js +0 -80
- package/.next/standalone/docs/ar/architecture.mdx +0 -334
- package/.next/standalone/docs/ar/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/ar/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ar/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ar/cli/hook.mdx +0 -31
- package/.next/standalone/docs/ar/cli/install-policies.mdx +0 -48
- package/.next/standalone/docs/ar/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/ar/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ar/cli/version.mdx +0 -13
- package/.next/standalone/docs/ar/configuration.mdx +0 -223
- package/.next/standalone/docs/ar/custom-policies.mdx +0 -354
- package/.next/standalone/docs/ar/dashboard.mdx +0 -142
- package/.next/standalone/docs/ar/examples.mdx +0 -307
- package/.next/standalone/docs/ar/for-agents.mdx +0 -39
- package/.next/standalone/docs/ar/getting-started.mdx +0 -187
- package/.next/standalone/docs/ar/introduction.mdx +0 -58
- package/.next/standalone/docs/ar/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ar/testing.mdx +0 -261
- package/.next/standalone/docs/architecture.mdx +0 -332
- package/.next/standalone/docs/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/cli/hook.mdx +0 -30
- package/.next/standalone/docs/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/cli/version.mdx +0 -12
- package/.next/standalone/docs/configuration.mdx +0 -222
- package/.next/standalone/docs/custom-policies.mdx +0 -353
- package/.next/standalone/docs/dashboard.mdx +0 -142
- package/.next/standalone/docs/de/architecture.mdx +0 -332
- package/.next/standalone/docs/de/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/de/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/de/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/de/cli/hook.mdx +0 -30
- package/.next/standalone/docs/de/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/de/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/de/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/de/cli/version.mdx +0 -12
- package/.next/standalone/docs/de/configuration.mdx +0 -222
- package/.next/standalone/docs/de/custom-policies.mdx +0 -353
- package/.next/standalone/docs/de/dashboard.mdx +0 -142
- package/.next/standalone/docs/de/examples.mdx +0 -307
- package/.next/standalone/docs/de/for-agents.mdx +0 -38
- package/.next/standalone/docs/de/getting-started.mdx +0 -186
- package/.next/standalone/docs/de/introduction.mdx +0 -57
- package/.next/standalone/docs/de/package-aliases.mdx +0 -82
- package/.next/standalone/docs/de/testing.mdx +0 -260
- package/.next/standalone/docs/docs.json +0 -1002
- package/.next/standalone/docs/es/architecture.mdx +0 -332
- package/.next/standalone/docs/es/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/es/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/es/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/es/cli/hook.mdx +0 -30
- package/.next/standalone/docs/es/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/es/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/es/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/es/cli/version.mdx +0 -12
- package/.next/standalone/docs/es/configuration.mdx +0 -222
- package/.next/standalone/docs/es/custom-policies.mdx +0 -353
- package/.next/standalone/docs/es/dashboard.mdx +0 -142
- package/.next/standalone/docs/es/examples.mdx +0 -307
- package/.next/standalone/docs/es/for-agents.mdx +0 -38
- package/.next/standalone/docs/es/getting-started.mdx +0 -186
- package/.next/standalone/docs/es/introduction.mdx +0 -57
- package/.next/standalone/docs/es/package-aliases.mdx +0 -82
- package/.next/standalone/docs/es/testing.mdx +0 -260
- package/.next/standalone/docs/examples.mdx +0 -307
- package/.next/standalone/docs/favicon.ico +0 -0
- package/.next/standalone/docs/for-agents.mdx +0 -38
- package/.next/standalone/docs/fr/architecture.mdx +0 -332
- package/.next/standalone/docs/fr/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/fr/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/fr/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/fr/cli/hook.mdx +0 -30
- package/.next/standalone/docs/fr/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/fr/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/fr/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/fr/cli/version.mdx +0 -12
- package/.next/standalone/docs/fr/configuration.mdx +0 -222
- package/.next/standalone/docs/fr/custom-policies.mdx +0 -353
- package/.next/standalone/docs/fr/dashboard.mdx +0 -142
- package/.next/standalone/docs/fr/examples.mdx +0 -307
- package/.next/standalone/docs/fr/for-agents.mdx +0 -38
- package/.next/standalone/docs/fr/getting-started.mdx +0 -186
- package/.next/standalone/docs/fr/introduction.mdx +0 -57
- package/.next/standalone/docs/fr/package-aliases.mdx +0 -82
- package/.next/standalone/docs/fr/testing.mdx +0 -260
- package/.next/standalone/docs/getting-started.mdx +0 -186
- package/.next/standalone/docs/he/architecture.mdx +0 -333
- package/.next/standalone/docs/he/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/he/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/he/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/he/cli/hook.mdx +0 -30
- package/.next/standalone/docs/he/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/he/cli/list-policies.mdx +0 -32
- package/.next/standalone/docs/he/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/he/cli/version.mdx +0 -12
- package/.next/standalone/docs/he/configuration.mdx +0 -223
- package/.next/standalone/docs/he/custom-policies.mdx +0 -353
- package/.next/standalone/docs/he/dashboard.mdx +0 -142
- package/.next/standalone/docs/he/examples.mdx +0 -307
- package/.next/standalone/docs/he/for-agents.mdx +0 -38
- package/.next/standalone/docs/he/getting-started.mdx +0 -186
- package/.next/standalone/docs/he/introduction.mdx +0 -57
- package/.next/standalone/docs/he/package-aliases.mdx +0 -82
- package/.next/standalone/docs/he/testing.mdx +0 -260
- package/.next/standalone/docs/hi/architecture.mdx +0 -334
- package/.next/standalone/docs/hi/built-in-policies.mdx +0 -576
- package/.next/standalone/docs/hi/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/hi/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/hi/cli/hook.mdx +0 -30
- package/.next/standalone/docs/hi/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/hi/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/hi/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/hi/cli/version.mdx +0 -12
- package/.next/standalone/docs/hi/configuration.mdx +0 -222
- package/.next/standalone/docs/hi/custom-policies.mdx +0 -354
- package/.next/standalone/docs/hi/dashboard.mdx +0 -142
- package/.next/standalone/docs/hi/examples.mdx +0 -309
- package/.next/standalone/docs/hi/for-agents.mdx +0 -38
- package/.next/standalone/docs/hi/getting-started.mdx +0 -187
- package/.next/standalone/docs/hi/introduction.mdx +0 -57
- package/.next/standalone/docs/hi/package-aliases.mdx +0 -82
- package/.next/standalone/docs/hi/testing.mdx +0 -260
- package/.next/standalone/docs/i18n/README.ar.md +0 -312
- package/.next/standalone/docs/i18n/README.de.md +0 -307
- package/.next/standalone/docs/i18n/README.es.md +0 -307
- package/.next/standalone/docs/i18n/README.fr.md +0 -307
- package/.next/standalone/docs/i18n/README.he.md +0 -312
- package/.next/standalone/docs/i18n/README.hi.md +0 -307
- package/.next/standalone/docs/i18n/README.it.md +0 -307
- package/.next/standalone/docs/i18n/README.ja.md +0 -307
- package/.next/standalone/docs/i18n/README.ko.md +0 -307
- package/.next/standalone/docs/i18n/README.pt-br.md +0 -307
- package/.next/standalone/docs/i18n/README.ru.md +0 -308
- package/.next/standalone/docs/i18n/README.tr.md +0 -307
- package/.next/standalone/docs/i18n/README.vi.md +0 -307
- package/.next/standalone/docs/i18n/README.zh.md +0 -307
- package/.next/standalone/docs/introduction.mdx +0 -57
- package/.next/standalone/docs/it/architecture.mdx +0 -334
- package/.next/standalone/docs/it/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/it/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/it/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/it/cli/hook.mdx +0 -30
- package/.next/standalone/docs/it/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/it/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/it/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/it/cli/version.mdx +0 -12
- package/.next/standalone/docs/it/configuration.mdx +0 -222
- package/.next/standalone/docs/it/custom-policies.mdx +0 -353
- package/.next/standalone/docs/it/dashboard.mdx +0 -142
- package/.next/standalone/docs/it/examples.mdx +0 -307
- package/.next/standalone/docs/it/for-agents.mdx +0 -38
- package/.next/standalone/docs/it/getting-started.mdx +0 -186
- package/.next/standalone/docs/it/introduction.mdx +0 -57
- package/.next/standalone/docs/it/package-aliases.mdx +0 -82
- package/.next/standalone/docs/it/testing.mdx +0 -260
- package/.next/standalone/docs/ja/architecture.mdx +0 -332
- package/.next/standalone/docs/ja/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/ja/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ja/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ja/cli/hook.mdx +0 -30
- package/.next/standalone/docs/ja/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/ja/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/ja/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ja/cli/version.mdx +0 -12
- package/.next/standalone/docs/ja/configuration.mdx +0 -222
- package/.next/standalone/docs/ja/custom-policies.mdx +0 -353
- package/.next/standalone/docs/ja/dashboard.mdx +0 -142
- package/.next/standalone/docs/ja/examples.mdx +0 -307
- package/.next/standalone/docs/ja/for-agents.mdx +0 -38
- package/.next/standalone/docs/ja/getting-started.mdx +0 -186
- package/.next/standalone/docs/ja/introduction.mdx +0 -57
- package/.next/standalone/docs/ja/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ja/testing.mdx +0 -260
- package/.next/standalone/docs/ko/architecture.mdx +0 -332
- package/.next/standalone/docs/ko/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/ko/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ko/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ko/cli/hook.mdx +0 -30
- package/.next/standalone/docs/ko/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/ko/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/ko/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ko/cli/version.mdx +0 -12
- package/.next/standalone/docs/ko/configuration.mdx +0 -222
- package/.next/standalone/docs/ko/custom-policies.mdx +0 -353
- package/.next/standalone/docs/ko/dashboard.mdx +0 -142
- package/.next/standalone/docs/ko/examples.mdx +0 -307
- package/.next/standalone/docs/ko/for-agents.mdx +0 -38
- package/.next/standalone/docs/ko/getting-started.mdx +0 -186
- package/.next/standalone/docs/ko/introduction.mdx +0 -57
- package/.next/standalone/docs/ko/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ko/testing.mdx +0 -260
- package/.next/standalone/docs/logo/dark.svg +0 -21
- package/.next/standalone/docs/logo/exosphere-dark.png +0 -0
- package/.next/standalone/docs/logo/exosphere-light.png +0 -0
- package/.next/standalone/docs/logo/light.svg +0 -21
- package/.next/standalone/docs/package-aliases.mdx +0 -82
- package/.next/standalone/docs/pt-br/architecture.mdx +0 -332
- package/.next/standalone/docs/pt-br/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/pt-br/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/pt-br/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/pt-br/cli/hook.mdx +0 -30
- package/.next/standalone/docs/pt-br/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/pt-br/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/pt-br/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/pt-br/cli/version.mdx +0 -12
- package/.next/standalone/docs/pt-br/configuration.mdx +0 -222
- package/.next/standalone/docs/pt-br/custom-policies.mdx +0 -353
- package/.next/standalone/docs/pt-br/dashboard.mdx +0 -142
- package/.next/standalone/docs/pt-br/examples.mdx +0 -307
- package/.next/standalone/docs/pt-br/for-agents.mdx +0 -38
- package/.next/standalone/docs/pt-br/getting-started.mdx +0 -186
- package/.next/standalone/docs/pt-br/introduction.mdx +0 -57
- package/.next/standalone/docs/pt-br/package-aliases.mdx +0 -82
- package/.next/standalone/docs/pt-br/testing.mdx +0 -260
- package/.next/standalone/docs/ru/architecture.mdx +0 -333
- package/.next/standalone/docs/ru/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/ru/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ru/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ru/cli/hook.mdx +0 -30
- package/.next/standalone/docs/ru/cli/install-policies.mdx +0 -48
- package/.next/standalone/docs/ru/cli/list-policies.mdx +0 -32
- package/.next/standalone/docs/ru/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ru/cli/version.mdx +0 -12
- package/.next/standalone/docs/ru/configuration.mdx +0 -222
- package/.next/standalone/docs/ru/custom-policies.mdx +0 -354
- package/.next/standalone/docs/ru/dashboard.mdx +0 -142
- package/.next/standalone/docs/ru/examples.mdx +0 -309
- package/.next/standalone/docs/ru/for-agents.mdx +0 -38
- package/.next/standalone/docs/ru/getting-started.mdx +0 -186
- package/.next/standalone/docs/ru/introduction.mdx +0 -57
- package/.next/standalone/docs/ru/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ru/testing.mdx +0 -260
- package/.next/standalone/docs/testing.mdx +0 -260
- package/.next/standalone/docs/tr/architecture.mdx +0 -333
- package/.next/standalone/docs/tr/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/tr/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/tr/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/tr/cli/hook.mdx +0 -30
- package/.next/standalone/docs/tr/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/tr/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/tr/cli/remove-policies.mdx +0 -44
- package/.next/standalone/docs/tr/cli/version.mdx +0 -12
- package/.next/standalone/docs/tr/configuration.mdx +0 -222
- package/.next/standalone/docs/tr/custom-policies.mdx +0 -353
- package/.next/standalone/docs/tr/dashboard.mdx +0 -142
- package/.next/standalone/docs/tr/examples.mdx +0 -308
- package/.next/standalone/docs/tr/for-agents.mdx +0 -38
- package/.next/standalone/docs/tr/getting-started.mdx +0 -186
- package/.next/standalone/docs/tr/introduction.mdx +0 -57
- package/.next/standalone/docs/tr/package-aliases.mdx +0 -82
- package/.next/standalone/docs/tr/testing.mdx +0 -260
- package/.next/standalone/docs/vi/architecture.mdx +0 -334
- package/.next/standalone/docs/vi/built-in-policies.mdx +0 -575
- package/.next/standalone/docs/vi/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/vi/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/vi/cli/hook.mdx +0 -30
- package/.next/standalone/docs/vi/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/vi/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/vi/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/vi/cli/version.mdx +0 -13
- package/.next/standalone/docs/vi/configuration.mdx +0 -222
- package/.next/standalone/docs/vi/custom-policies.mdx +0 -353
- package/.next/standalone/docs/vi/dashboard.mdx +0 -142
- package/.next/standalone/docs/vi/examples.mdx +0 -308
- package/.next/standalone/docs/vi/for-agents.mdx +0 -38
- package/.next/standalone/docs/vi/getting-started.mdx +0 -186
- package/.next/standalone/docs/vi/introduction.mdx +0 -57
- package/.next/standalone/docs/vi/package-aliases.mdx +0 -82
- package/.next/standalone/docs/vi/testing.mdx +0 -260
- package/.next/standalone/docs/zh/architecture.mdx +0 -332
- package/.next/standalone/docs/zh/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/zh/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/zh/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/zh/cli/hook.mdx +0 -30
- package/.next/standalone/docs/zh/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/zh/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/zh/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/zh/cli/version.mdx +0 -12
- package/.next/standalone/docs/zh/configuration.mdx +0 -222
- package/.next/standalone/docs/zh/custom-policies.mdx +0 -353
- package/.next/standalone/docs/zh/dashboard.mdx +0 -142
- package/.next/standalone/docs/zh/examples.mdx +0 -307
- package/.next/standalone/docs/zh/for-agents.mdx +0 -38
- package/.next/standalone/docs/zh/getting-started.mdx +0 -186
- package/.next/standalone/docs/zh/introduction.mdx +0 -57
- package/.next/standalone/docs/zh/package-aliases.mdx +0 -82
- package/.next/standalone/docs/zh/testing.mdx +0 -260
- package/.next/standalone/eslint.config.mjs +0 -15
- package/.next/standalone/examples/convention-policies/security-policies.mjs +0 -40
- package/.next/standalone/examples/convention-policies/workflow-policies.mjs +0 -41
- package/.next/standalone/examples/policies-advanced/index.js +0 -103
- package/.next/standalone/examples/policies-advanced/utils.js +0 -35
- package/.next/standalone/examples/policies-basic.js +0 -77
- package/.next/standalone/examples/policies-notification.js +0 -104
- package/.next/standalone/node_modules/@img/colour/color.cjs +0 -1594
- package/.next/standalone/node_modules/@img/colour/index.cjs +0 -1
- package/.next/standalone/node_modules/@img/colour/package.json +0 -45
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/README.md +0 -46
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/glib-2.0/include/glibconfig.h +0 -221
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/index.js +0 -1
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/package.json +0 -42
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/versions.json +0 -30
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/README.md +0 -46
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/glib-2.0/include/glibconfig.h +0 -221
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +0 -1
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +0 -42
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +0 -30
- package/.next/standalone/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
- package/.next/standalone/node_modules/@img/sharp-linux-x64/package.json +0 -46
- package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
- package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +0 -46
- package/.next/standalone/node_modules/detect-libc/lib/detect-libc.js +0 -313
- package/.next/standalone/node_modules/detect-libc/lib/elf.js +0 -39
- package/.next/standalone/node_modules/detect-libc/lib/filesystem.js +0 -51
- package/.next/standalone/node_modules/detect-libc/lib/process.js +0 -24
- package/.next/standalone/node_modules/detect-libc/package.json +0 -44
- package/.next/standalone/node_modules/sharp/lib/channel.js +0 -177
- package/.next/standalone/node_modules/sharp/lib/colour.js +0 -195
- package/.next/standalone/node_modules/sharp/lib/composite.js +0 -212
- package/.next/standalone/node_modules/sharp/lib/constructor.js +0 -499
- package/.next/standalone/node_modules/sharp/lib/index.js +0 -16
- package/.next/standalone/node_modules/sharp/lib/input.js +0 -809
- package/.next/standalone/node_modules/sharp/lib/is.js +0 -143
- package/.next/standalone/node_modules/sharp/lib/libvips.js +0 -207
- package/.next/standalone/node_modules/sharp/lib/operation.js +0 -1016
- package/.next/standalone/node_modules/sharp/lib/output.js +0 -1666
- package/.next/standalone/node_modules/sharp/lib/resize.js +0 -595
- package/.next/standalone/node_modules/sharp/lib/sharp.js +0 -121
- package/.next/standalone/node_modules/sharp/lib/utility.js +0 -291
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/comparator.js +0 -143
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/range.js +0 -557
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/semver.js +0 -333
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/cmp.js +0 -54
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/coerce.js +0 -62
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/compare.js +0 -7
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/eq.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gt.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gte.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lt.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lte.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/neq.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/parse.js +0 -18
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/satisfies.js +0 -12
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/constants.js +0 -37
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/debug.js +0 -11
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/identifiers.js +0 -29
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/lrucache.js +0 -42
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/parse-options.js +0 -17
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/re.js +0 -223
- package/.next/standalone/node_modules/sharp/node_modules/semver/package.json +0 -78
- package/.next/standalone/node_modules/sharp/package.json +0 -202
- package/.next/standalone/scripts/alias-proxy.js +0 -18
- package/.next/standalone/scripts/dev.ts +0 -3
- package/.next/standalone/scripts/install-telemetry.mjs +0 -108
- package/.next/standalone/scripts/launch.ts +0 -83
- package/.next/standalone/scripts/parse-script-args.ts +0 -87
- package/.next/standalone/scripts/postinstall.mjs +0 -121
- package/.next/standalone/scripts/preuninstall.mjs +0 -131
- package/.next/standalone/scripts/publish-aliases.mjs +0 -87
- package/.next/standalone/scripts/start.ts +0 -3
- package/.next/standalone/scripts/sync-hook-events-prompt.md +0 -60
- package/.next/standalone/scripts/translate-docs/cache.ts +0 -62
- package/.next/standalone/scripts/translate-docs/cli.ts +0 -357
- package/.next/standalone/scripts/translate-docs/config.ts +0 -248
- package/.next/standalone/scripts/translate-docs/mdx-translator.ts +0 -153
- package/.next/standalone/scripts/translate-docs/mintlify-nav.ts +0 -107
- package/.next/standalone/scripts/translate-docs/readme-translator.ts +0 -154
- package/.next/standalone/scripts/translate-docs/translator.ts +0 -68
- package/.next/standalone/scripts/translate-docs/types.ts +0 -43
- package/.next/standalone/src/cli-error.ts +0 -18
- package/.next/standalone/src/hooks/builtin-policies.ts +0 -1613
- package/.next/standalone/src/hooks/custom-hooks-loader.ts +0 -205
- package/.next/standalone/src/hooks/custom-hooks-registry.ts +0 -30
- package/.next/standalone/src/hooks/handler.ts +0 -202
- package/.next/standalone/src/hooks/hook-activity-store.ts +0 -349
- package/.next/standalone/src/hooks/hook-logger.ts +0 -133
- package/.next/standalone/src/hooks/hook-telemetry.ts +0 -43
- package/.next/standalone/src/hooks/hooks-config.ts +0 -166
- package/.next/standalone/src/hooks/install-prompt.ts +0 -357
- package/.next/standalone/src/hooks/llm-client.ts +0 -90
- package/.next/standalone/src/hooks/loader-utils.ts +0 -178
- package/.next/standalone/src/hooks/manager.ts +0 -692
- package/.next/standalone/src/hooks/policy-evaluator.ts +0 -224
- package/.next/standalone/src/hooks/policy-helpers.ts +0 -16
- package/.next/standalone/src/hooks/policy-registry.ts +0 -90
- package/.next/standalone/src/hooks/policy-types.ts +0 -77
- package/.next/standalone/src/hooks/types.ts +0 -63
- package/.next/standalone/src/index.ts +0 -19
- package/.next/standalone/src/posthog-key.ts +0 -5
- package/.next/standalone/tailwind.config.ts +0 -11
- package/.next/standalone/tsconfig.json +0 -42
- package/.next/standalone/vitest.config.e2e.mts +0 -24
- package/.next/standalone/vitest.config.mts +0 -23
- /package/.next/standalone/.next/static/{A9pNTZdoYJTVyPAYwQMx5 → wOkJXoch1UmRAmyIuKZWc}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{A9pNTZdoYJTVyPAYwQMx5 → wOkJXoch1UmRAmyIuKZWc}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{A9pNTZdoYJTVyPAYwQMx5 → wOkJXoch1UmRAmyIuKZWc}/_ssgManifest.js +0 -0
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Failproof AI
|
|
3
|
-
description: "管理钩子与策略,让你的 AI 智能体保持可靠并自主运行"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
[](https://www.npmjs.com/package/failproofai)
|
|
7
|
-
|
|
8
|
-
为 **Claude Code** 和 **Agents SDK** 提供钩子与策略,让你的 AI 智能体保持可靠并自主运行。
|
|
9
|
-
|
|
10
|
-
AI 智能体的失败方式往往是可预测的:执行破坏性命令、泄露密钥、偏离任务、陷入循环,或直接推送到主分支。一旦无人看管,小问题就会接连爆发。
|
|
11
|
-
|
|
12
|
-
Failproof AI 通过**策略**来解决这些问题——这些规则会钩入每一次智能体工具调用,能够**检测故障**、**缓解故障**(拦截、指令纠正、脱敏处理),并在需要关注时**提醒你**。本地仪表板让你事后随时查看所有详情。
|
|
13
|
-
|
|
14
|
-
一切均在本地运行,数据不会离开你的机器。
|
|
15
|
-
|
|
16
|
-
## 开始使用
|
|
17
|
-
|
|
18
|
-
<CardGroup cols={2}>
|
|
19
|
-
|
|
20
|
-
<Card title="26 条内置策略" icon="shield" href="/zh/built-in-policies">
|
|
21
|
-
开箱即用:拦截破坏性命令、防止密钥泄露、将智能体限制在项目边界内,以及更多功能。
|
|
22
|
-
</Card>
|
|
23
|
-
|
|
24
|
-
<Card title="自定义策略" icon="code" href="/zh/custom-policies">
|
|
25
|
-
使用简洁的 allow / deny / instruct API,用 JavaScript 编写你自己的规则。
|
|
26
|
-
</Card>
|
|
27
|
-
|
|
28
|
-
<Card title="智能体监控" icon="chart-line" href="/zh/dashboard">
|
|
29
|
-
查看智能体在你离开期间做了什么。浏览会话、检查工具调用、查看策略触发记录。
|
|
30
|
-
</Card>
|
|
31
|
-
|
|
32
|
-
<Card title="轻松配置" icon="gear" href="/zh/configuration">
|
|
33
|
-
无需编写代码即可调整任意策略。按项目或全局设置白名单、受保护分支或阈值。
|
|
34
|
-
</Card>
|
|
35
|
-
|
|
36
|
-
</CardGroup>
|
|
37
|
-
|
|
38
|
-
## 快速上手
|
|
39
|
-
|
|
40
|
-
<CodeGroup>
|
|
41
|
-
|
|
42
|
-
```bash npm
|
|
43
|
-
npm install -g failproofai
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
```bash bun
|
|
47
|
-
bun add -g failproofai
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
</CodeGroup>
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
failproofai policies --install # enable policies
|
|
54
|
-
failproofai # launch the dashboard
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
完整的操作流程请参阅[入门指南](/zh/getting-started)。
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 包别名
|
|
3
|
-
description: "已注册的防拼写错误别名及其工作原理"
|
|
4
|
-
icon: copy
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## 官方包
|
|
8
|
-
|
|
9
|
-
npm 的正式包名为 **`failproofai`**:
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
npm install -g failproofai
|
|
13
|
-
# or
|
|
14
|
-
bun add -g failproofai
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## 为什么我们持有这些别名
|
|
20
|
-
|
|
21
|
-
供应链攻击中,拼写抢注(typosquatting)是一种常见手段——恶意攻击者注册一个与热门包名仅有一个按键之差的包名,不知情的用户在安装时一旦输错,便会运行攻击者控制的代码,并获得完整的系统访问权限。这正是 Failproof AI 所要防范的威胁。
|
|
22
|
-
|
|
23
|
-
为消除这一攻击面,**我们在 npm 上抢先注册了 `failproofai` 的所有常见拼写错误和格式变体**。这些包名均无法被第三方注册。每个别名都是一个轻量代理,安装后会自动委托给真正的 `failproofai` 包。
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## 已注册的别名
|
|
28
|
-
|
|
29
|
-
**格式变体** —— "failproof ai" 的不同写法:
|
|
30
|
-
|
|
31
|
-
| 包名 | 状态 |
|
|
32
|
-
|---------|--------|
|
|
33
|
-
| `failproof` | ✅ 已发布 |
|
|
34
|
-
| `failproof-ai` | ⏳ 等待 npm 审核 |
|
|
35
|
-
| `fail-proof-ai` | ⏳ 等待 npm 审核 |
|
|
36
|
-
| `failproof_ai` | ⏳ 等待 npm 审核 |
|
|
37
|
-
| `fail_proof_ai` | ⏳ 等待 npm 审核 |
|
|
38
|
-
| `fail-proofai` | ⏳ 等待 npm 审核 |
|
|
39
|
-
|
|
40
|
-
**`failprof*` 拼写错误** —— "proof" 中缺少一个 `o`:
|
|
41
|
-
|
|
42
|
-
| 包名 | 状态 |
|
|
43
|
-
|---------|--------|
|
|
44
|
-
| `failprof` | ✅ 已发布 |
|
|
45
|
-
| `failprof-ai` | ✅ 已发布 |
|
|
46
|
-
| `failprofai` | ⏳ 等待 npm 审核 |
|
|
47
|
-
| `fail-prof-ai` | ⏳ 等待 npm 审核 |
|
|
48
|
-
| `failprof_ai` | ⏳ 等待 npm 审核 |
|
|
49
|
-
|
|
50
|
-
**`faliproof*` 拼写错误** —— `a` 和 `i` 互换位置:
|
|
51
|
-
|
|
52
|
-
| 包名 | 状态 |
|
|
53
|
-
|---------|--------|
|
|
54
|
-
| `faliproof` | ✅ 已发布 |
|
|
55
|
-
| `faliproof-ai` | ✅ 已发布 |
|
|
56
|
-
| `faliproofai` | ⏳ 等待 npm 审核 |
|
|
57
|
-
|
|
58
|
-
> **为什么显示"等待审核"?** npm 的防滥用政策会拦截那些在去除标点符号并经过相似度检测后与已有包名规范化为同一字符串的新包名。我们已联系 npm 支持团队,申请以防抢注为由保留这些名称,获批后将正式激活。
|
|
59
|
-
|
|
60
|
-
您可以通过以下命令验证任意已发布的别名均归我们所有:
|
|
61
|
-
|
|
62
|
-
```bash
|
|
63
|
-
npm info failproof
|
|
64
|
-
# Look for: "ExosphereHost Inc." in the maintainers field
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
---
|
|
68
|
-
|
|
69
|
-
## 别名的工作原理
|
|
70
|
-
|
|
71
|
-
每个别名包的工作方式如下:
|
|
72
|
-
|
|
73
|
-
1. 将 `failproofai` 列为依赖项——安装时会运行真正的包(包括其 `postinstall` 钩子配置)
|
|
74
|
-
2. 暴露一个与自身同名的可执行文件(例如 `failprof-ai`),将所有参数代理转发给 `failproofai` 二进制文件
|
|
75
|
-
|
|
76
|
-
代理逻辑仅为两行 Node 脚本,没有任何业务逻辑、网络请求,也不会收集 `failproofai` 本身行为之外的任何数据。
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
## 如果您发现我们遗漏的包名
|
|
81
|
-
|
|
82
|
-
请在 [exospherehost/failproofai](https://github.com/exospherehost/failproofai/issues) 提交 issue,我们会及时注册。
|
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 测试
|
|
3
|
-
description: "单元测试、端到端测试与测试辅助工具"
|
|
4
|
-
icon: flask-vial
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
failproofai 包含两套测试套件:**单元测试**(快速、使用 mock)和**端到端测试**(真实子进程调用)。
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## 运行测试
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
# 单次运行所有单元测试
|
|
15
|
-
bun run test:run
|
|
16
|
-
|
|
17
|
-
# 以监视模式运行单元测试
|
|
18
|
-
bun run test
|
|
19
|
-
|
|
20
|
-
# 运行端到端测试(需要配置环境,详见下文)
|
|
21
|
-
bun run test:e2e
|
|
22
|
-
|
|
23
|
-
# 仅进行类型检查,不构建
|
|
24
|
-
bunx tsc --noEmit
|
|
25
|
-
|
|
26
|
-
# 代码检查
|
|
27
|
-
bun run lint
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## 单元测试
|
|
33
|
-
|
|
34
|
-
单元测试位于 `__tests__/` 目录,使用 [Vitest](https://vitest.dev) 和 `happy-dom`。
|
|
35
|
-
|
|
36
|
-
```text
|
|
37
|
-
__tests__/
|
|
38
|
-
hooks/
|
|
39
|
-
builtin-policies.test.ts # 每个内置策略的逻辑测试
|
|
40
|
-
hooks-config.test.ts # 配置加载与作用域合并
|
|
41
|
-
policy-evaluator.test.ts # 参数注入与评估顺序
|
|
42
|
-
custom-hooks-registry.test.ts # globalThis 注册表的增删查
|
|
43
|
-
custom-hooks-loader.test.ts # ESM 加载器、传递性导入、错误处理
|
|
44
|
-
manager.test.ts # 安装/移除/列出操作
|
|
45
|
-
components/
|
|
46
|
-
sessions-list.test.tsx # 会话列表组件
|
|
47
|
-
project-list.test.tsx # 项目列表组件
|
|
48
|
-
...
|
|
49
|
-
lib/
|
|
50
|
-
logger.test.ts
|
|
51
|
-
paths.test.ts
|
|
52
|
-
date-filters.test.ts
|
|
53
|
-
telemetry.test.ts
|
|
54
|
-
...
|
|
55
|
-
actions/
|
|
56
|
-
get-hooks-config.test.ts
|
|
57
|
-
get-hook-activity.test.ts
|
|
58
|
-
...
|
|
59
|
-
contexts/
|
|
60
|
-
ThemeContext.test.tsx
|
|
61
|
-
AutoRefreshContext.test.tsx
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### 编写策略单元测试
|
|
65
|
-
|
|
66
|
-
```typescript
|
|
67
|
-
import { describe, it, expect, beforeEach } from "vitest";
|
|
68
|
-
import { getBuiltinPolicies } from "../../src/hooks/builtin-policies";
|
|
69
|
-
import { allow, deny } from "../../src/hooks/policy-types";
|
|
70
|
-
|
|
71
|
-
describe("block-sudo", () => {
|
|
72
|
-
const policy = getBuiltinPolicies().find((p) => p.name === "block-sudo")!;
|
|
73
|
-
|
|
74
|
-
it("denies sudo commands", () => {
|
|
75
|
-
const ctx = {
|
|
76
|
-
eventType: "PreToolUse" as const,
|
|
77
|
-
payload: {},
|
|
78
|
-
toolName: "Bash",
|
|
79
|
-
toolInput: { command: "sudo apt install nodejs" },
|
|
80
|
-
params: { allowPatterns: [] },
|
|
81
|
-
};
|
|
82
|
-
expect(policy.fn(ctx)).toEqual(deny("sudo command blocked by failproofai"));
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it("allows non-sudo commands", () => {
|
|
86
|
-
const ctx = {
|
|
87
|
-
eventType: "PreToolUse" as const,
|
|
88
|
-
payload: {},
|
|
89
|
-
toolName: "Bash",
|
|
90
|
-
toolInput: { command: "ls -la" },
|
|
91
|
-
params: { allowPatterns: [] },
|
|
92
|
-
};
|
|
93
|
-
expect(policy.fn(ctx)).toEqual(allow());
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it("allows patterns in allowPatterns", () => {
|
|
97
|
-
const ctx = {
|
|
98
|
-
eventType: "PreToolUse" as const,
|
|
99
|
-
payload: {},
|
|
100
|
-
toolName: "Bash",
|
|
101
|
-
toolInput: { command: "sudo systemctl status nginx" },
|
|
102
|
-
params: { allowPatterns: ["sudo systemctl status"] },
|
|
103
|
-
};
|
|
104
|
-
expect(policy.fn(ctx)).toEqual(allow());
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
## 端到端测试
|
|
112
|
-
|
|
113
|
-
端到端测试将真实的 `failproofai` 二进制文件作为子进程调用,通过 stdin 传入 JSON payload,并对 stdout 输出和退出码进行断言。这能够测试 Claude Code 所使用的完整集成路径。
|
|
114
|
-
|
|
115
|
-
### 环境配置
|
|
116
|
-
|
|
117
|
-
端到端测试直接从仓库源码运行二进制文件。在首次运行前,需要构建自定义 hook 文件从 `'failproofai'` 导入时所使用的 CJS 包:
|
|
118
|
-
|
|
119
|
-
```bash
|
|
120
|
-
bun build src/index.ts --outdir dist --target node --format cjs
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
然后运行测试:
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
bun run test:e2e
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
每当修改公共 hook API(`src/hooks/custom-hooks-registry.ts`、`src/hooks/policy-helpers.ts` 或 `src/hooks/policy-types.ts`)后,请重新构建 `dist/`。
|
|
130
|
-
|
|
131
|
-
### 端到端测试结构
|
|
132
|
-
|
|
133
|
-
```text
|
|
134
|
-
__tests__/e2e/
|
|
135
|
-
helpers/
|
|
136
|
-
hook-runner.ts # 启动二进制进程,传入 payload JSON,捕获退出码 + stdout + stderr
|
|
137
|
-
fixture-env.ts # 为每个测试创建包含配置文件的隔离临时目录
|
|
138
|
-
payloads.ts # 符合 Claude 格式的各事件类型 payload 工厂函数
|
|
139
|
-
hooks/
|
|
140
|
-
builtin-policies.e2e.test.ts # 每个内置策略的真实子进程测试
|
|
141
|
-
custom-hooks.e2e.test.ts # 自定义 hook 的加载与评估
|
|
142
|
-
config-scopes.e2e.test.ts # 跨项目/本地/全局的配置合并
|
|
143
|
-
policy-params.e2e.test.ts # 各参数化策略的参数注入
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
### 使用端到端测试辅助工具
|
|
147
|
-
|
|
148
|
-
**`FixtureEnv`** - 每个测试的隔离环境:
|
|
149
|
-
|
|
150
|
-
```typescript
|
|
151
|
-
import { createFixtureEnv } from "../helpers/fixture-env";
|
|
152
|
-
|
|
153
|
-
const env = createFixtureEnv();
|
|
154
|
-
// env.cwd - 临时目录;作为 payload.cwd 传入以加载 .failproofai/policies-config.json
|
|
155
|
-
// env.home - 隔离的 home 目录;不会读取真实的 ~/.failproofai
|
|
156
|
-
|
|
157
|
-
env.writeConfig({
|
|
158
|
-
enabledPolicies: ["block-sudo"],
|
|
159
|
-
policyParams: {
|
|
160
|
-
"block-sudo": { allowPatterns: ["sudo systemctl status"] },
|
|
161
|
-
},
|
|
162
|
-
});
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
`createFixtureEnv()` 会自动注册 `afterEach` 清理回调。
|
|
166
|
-
|
|
167
|
-
**`runHook`** - 调用二进制文件:
|
|
168
|
-
|
|
169
|
-
```typescript
|
|
170
|
-
import { runHook } from "../helpers/hook-runner";
|
|
171
|
-
import { Payloads } from "../helpers/payloads";
|
|
172
|
-
|
|
173
|
-
const result = await runHook(
|
|
174
|
-
"PreToolUse",
|
|
175
|
-
Payloads.preToolUse.bash("sudo apt install nodejs", env.cwd),
|
|
176
|
-
{ homeDir: env.home }
|
|
177
|
-
);
|
|
178
|
-
|
|
179
|
-
expect(result.exitCode).toBe(0);
|
|
180
|
-
expect(result.parsed?.hookSpecificOutput?.permissionDecision).toBe("deny");
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
**`Payloads`** - 现成的 payload 工厂函数:
|
|
184
|
-
|
|
185
|
-
```typescript
|
|
186
|
-
Payloads.preToolUse.bash(command, cwd)
|
|
187
|
-
Payloads.preToolUse.write(filePath, content, cwd)
|
|
188
|
-
Payloads.preToolUse.read(filePath, cwd)
|
|
189
|
-
Payloads.postToolUse.bash(command, output, cwd)
|
|
190
|
-
Payloads.postToolUse.read(filePath, content, cwd)
|
|
191
|
-
Payloads.notification(message, cwd)
|
|
192
|
-
Payloads.stop(cwd)
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
### 编写端到端测试
|
|
196
|
-
|
|
197
|
-
```typescript
|
|
198
|
-
import { describe, it, expect } from "vitest";
|
|
199
|
-
import { createFixtureEnv } from "../helpers/fixture-env";
|
|
200
|
-
import { runHook } from "../helpers/hook-runner";
|
|
201
|
-
import { Payloads } from "../helpers/payloads";
|
|
202
|
-
|
|
203
|
-
describe("block-rm-rf (E2E)", () => {
|
|
204
|
-
it("denies rm -rf", async () => {
|
|
205
|
-
const env = createFixtureEnv();
|
|
206
|
-
env.writeConfig({ enabledPolicies: ["block-rm-rf"] });
|
|
207
|
-
|
|
208
|
-
const result = await runHook(
|
|
209
|
-
"PreToolUse",
|
|
210
|
-
Payloads.preToolUse.bash("rm -rf /", env.cwd),
|
|
211
|
-
{ homeDir: env.home }
|
|
212
|
-
);
|
|
213
|
-
|
|
214
|
-
expect(result.exitCode).toBe(0);
|
|
215
|
-
expect(result.parsed?.hookSpecificOutput?.permissionDecision).toBe("deny");
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
it("allows non-recursive rm", async () => {
|
|
219
|
-
const env = createFixtureEnv();
|
|
220
|
-
env.writeConfig({ enabledPolicies: ["block-rm-rf"] });
|
|
221
|
-
|
|
222
|
-
const result = await runHook(
|
|
223
|
-
"PreToolUse",
|
|
224
|
-
Payloads.preToolUse.bash("rm /tmp/file.txt", env.cwd),
|
|
225
|
-
{ homeDir: env.home }
|
|
226
|
-
);
|
|
227
|
-
|
|
228
|
-
expect(result.exitCode).toBe(0);
|
|
229
|
-
expect(result.stdout).toBe(""); // allow → 空 stdout
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
### 端到端响应格式
|
|
235
|
-
|
|
236
|
-
| 决策 | 退出码 | stdout |
|
|
237
|
-
|----------|-----------|--------|
|
|
238
|
-
| `PreToolUse` 拒绝 | `0` | `{"hookSpecificOutput":{"permissionDecision":"deny","permissionDecisionReason":"..."}}` |
|
|
239
|
-
| `PostToolUse` 拒绝 | `0` | `{"hookSpecificOutput":{"additionalContext":"Blocked ... because: ..."}}` |
|
|
240
|
-
| 指令(非 Stop) | `0` | `{"hookSpecificOutput":{"additionalContext":"Instruction from failproofai: ..."}}` |
|
|
241
|
-
| Stop 指令 | `2` | stdout 为空;原因输出至 stderr |
|
|
242
|
-
| 允许 | `0` | 空字符串 |
|
|
243
|
-
|
|
244
|
-
### Vitest 配置
|
|
245
|
-
|
|
246
|
-
端到端测试使用 `vitest.config.e2e.mts`,配置如下:
|
|
247
|
-
|
|
248
|
-
- `environment: "node"` - 无需浏览器全局变量
|
|
249
|
-
- `pool: "forks"` - 真正的进程隔离(测试会派生子进程)
|
|
250
|
-
- `testTimeout: 20_000` - 每个测试 20 秒超时(含二进制启动和 hook 评估时间)
|
|
251
|
-
|
|
252
|
-
使用 `forks` 池至关重要:基于线程的 worker 共享 `globalThis`,可能干扰需要派生子进程的测试。基于进程的 forks 模式可避免此问题。
|
|
253
|
-
|
|
254
|
-
---
|
|
255
|
-
|
|
256
|
-
## 持续集成
|
|
257
|
-
|
|
258
|
-
在合并前,必须通过完整的 CI 运行(`bun run lint && bunx tsc --noEmit && bun run test:run && bun run build`)。端到端测试套件作为独立的 CI 任务并行运行。
|
|
259
|
-
|
|
260
|
-
完整的合并前检查清单请参阅 [Contributing](../CONTRIBUTING.md)。
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import nextConfig from "eslint-config-next/core-web-vitals";
|
|
2
|
-
import tsParser from "@typescript-eslint/parser";
|
|
3
|
-
|
|
4
|
-
const config = [
|
|
5
|
-
{ ignores: ["dist/"] },
|
|
6
|
-
...nextConfig,
|
|
7
|
-
{ settings: { react: { version: "19" } } },
|
|
8
|
-
{
|
|
9
|
-
files: ["**/*.{js,jsx,mjs,mts,cts}"],
|
|
10
|
-
languageOptions: { parser: tsParser },
|
|
11
|
-
},
|
|
12
|
-
];
|
|
13
|
-
|
|
14
|
-
export default config;
|
|
15
|
-
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* security-policies.mjs — Convention-based security policies
|
|
3
|
-
*
|
|
4
|
-
* Drop this file into .failproofai/policies/ at the project or user level
|
|
5
|
-
* and it will be automatically loaded — no --custom flag needed.
|
|
6
|
-
*
|
|
7
|
-
* Project level: .failproofai/policies/security-policies.mjs
|
|
8
|
-
* User level: ~/.failproofai/policies/security-policies.mjs
|
|
9
|
-
*/
|
|
10
|
-
import { customPolicies, allow, deny } from "failproofai";
|
|
11
|
-
|
|
12
|
-
// Block writes to .env files
|
|
13
|
-
customPolicies.add({
|
|
14
|
-
name: "block-env-writes",
|
|
15
|
-
description: "Prevent Claude from writing to .env files",
|
|
16
|
-
match: { events: ["PreToolUse"] },
|
|
17
|
-
fn: async (ctx) => {
|
|
18
|
-
if (!["Write", "Edit"].includes(ctx.toolName ?? "")) return allow();
|
|
19
|
-
const path = String(ctx.toolInput?.file_path ?? "");
|
|
20
|
-
if (/\.env($|\.)/.test(path)) {
|
|
21
|
-
return deny(`Writing to .env files is blocked: ${path}`);
|
|
22
|
-
}
|
|
23
|
-
return allow();
|
|
24
|
-
},
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
// Block commands that delete git history
|
|
28
|
-
customPolicies.add({
|
|
29
|
-
name: "block-git-history-rewrite",
|
|
30
|
-
description: "Prevent destructive git history operations",
|
|
31
|
-
match: { events: ["PreToolUse"] },
|
|
32
|
-
fn: async (ctx) => {
|
|
33
|
-
if (ctx.toolName !== "Bash") return allow();
|
|
34
|
-
const cmd = String(ctx.toolInput?.command ?? "");
|
|
35
|
-
if (/git\s+(rebase\s+-i|filter-branch|reflog\s+expire)/.test(cmd)) {
|
|
36
|
-
return deny("Rewriting git history is not allowed — use a revert commit instead");
|
|
37
|
-
}
|
|
38
|
-
return allow();
|
|
39
|
-
},
|
|
40
|
-
});
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* workflow-policies.mjs — Convention-based workflow policies
|
|
3
|
-
*
|
|
4
|
-
* Drop this file into .failproofai/policies/ at the project or user level
|
|
5
|
-
* and it will be automatically loaded — no --custom flag needed.
|
|
6
|
-
*
|
|
7
|
-
* Project level: .failproofai/policies/workflow-policies.mjs
|
|
8
|
-
* User level: ~/.failproofai/policies/workflow-policies.mjs
|
|
9
|
-
*/
|
|
10
|
-
import { customPolicies, allow, instruct } from "failproofai";
|
|
11
|
-
|
|
12
|
-
// Remind to run tests before committing
|
|
13
|
-
customPolicies.add({
|
|
14
|
-
name: "test-before-commit",
|
|
15
|
-
description: "Remind Claude to run tests before git commit",
|
|
16
|
-
match: { events: ["PreToolUse"] },
|
|
17
|
-
fn: async (ctx) => {
|
|
18
|
-
if (ctx.toolName !== "Bash") return allow();
|
|
19
|
-
const cmd = String(ctx.toolInput?.command ?? "");
|
|
20
|
-
if (/git\s+commit/.test(cmd)) {
|
|
21
|
-
return instruct(
|
|
22
|
-
"Before committing, make sure all tests pass. " +
|
|
23
|
-
"Run the test suite first if you haven't already."
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
return allow();
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
// Log all file writes for audit trail
|
|
31
|
-
customPolicies.add({
|
|
32
|
-
name: "audit-file-writes",
|
|
33
|
-
description: "Log all file write operations",
|
|
34
|
-
match: { events: ["PostToolUse"] },
|
|
35
|
-
fn: async (ctx) => {
|
|
36
|
-
if (!["Write", "Edit"].includes(ctx.toolName ?? "")) return allow();
|
|
37
|
-
const path = ctx.toolInput?.file_path ?? "unknown";
|
|
38
|
-
console.error(`[audit] File written: ${path}`);
|
|
39
|
-
return allow();
|
|
40
|
-
},
|
|
41
|
-
});
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* policies-advanced/index.js — advanced custom policies example
|
|
3
|
-
*
|
|
4
|
-
* Demonstrates:
|
|
5
|
-
* - Transitive local imports (./utils.js is auto-rewritten by the loader)
|
|
6
|
-
* - Async hooks (await inside fn)
|
|
7
|
-
* - Using ctx.session (cwd, sessionId)
|
|
8
|
-
* - PostToolUse event (inspect tool output)
|
|
9
|
-
* - Stop event (verify before Claude finishes)
|
|
10
|
-
*
|
|
11
|
-
* Install:
|
|
12
|
-
* failproofai --install-hooks custom ./examples/policies-advanced/index.js
|
|
13
|
-
*
|
|
14
|
-
* See also: ../policies-notification.js for a Notification event example.
|
|
15
|
-
*/
|
|
16
|
-
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
17
|
-
import { isOutsideProject, extractPushBranch, looksLikeSecretFile } from "./utils.js";
|
|
18
|
-
|
|
19
|
-
// 1. Block writes to secret-looking file paths (uses transitive import)
|
|
20
|
-
customPolicies.add({
|
|
21
|
-
name: "block-secret-file-writes",
|
|
22
|
-
description: "Block writing to files that look like private keys or credentials",
|
|
23
|
-
match: { events: ["PreToolUse"] },
|
|
24
|
-
fn: async (ctx) => {
|
|
25
|
-
if (ctx.toolName !== "Write") return allow();
|
|
26
|
-
const path = String(ctx.toolInput?.file_path ?? "");
|
|
27
|
-
if (looksLikeSecretFile(path)) {
|
|
28
|
-
return deny(`Writing to ${path} is blocked — looks like a secret or credential file`);
|
|
29
|
-
}
|
|
30
|
-
return allow();
|
|
31
|
-
},
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
// 2. Block pushing to version-tagged branches (e.g. v1.2.3) — must go through release process
|
|
35
|
-
customPolicies.add({
|
|
36
|
-
name: "block-push-to-version-tags",
|
|
37
|
-
description: "Block git push directly to version branches (v*.*.*)",
|
|
38
|
-
match: { events: ["PreToolUse"] },
|
|
39
|
-
fn: async (ctx) => {
|
|
40
|
-
if (ctx.toolName !== "Bash") return allow();
|
|
41
|
-
const cmd = String(ctx.toolInput?.command ?? "");
|
|
42
|
-
if (!/git\s+push\b/.test(cmd)) return allow();
|
|
43
|
-
const branch = extractPushBranch(cmd);
|
|
44
|
-
if (branch && /^v\d+\.\d+/.test(branch)) {
|
|
45
|
-
return deny(`Pushing directly to version branch "${branch}" is not allowed — use the release workflow`);
|
|
46
|
-
}
|
|
47
|
-
return allow();
|
|
48
|
-
},
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
// 3. Warn if a Bash command touches paths outside the session cwd (uses ctx.session)
|
|
52
|
-
customPolicies.add({
|
|
53
|
-
name: "warn-outside-cwd",
|
|
54
|
-
description: "Warn before Bash commands that reference absolute paths outside the session cwd",
|
|
55
|
-
match: { events: ["PreToolUse"] },
|
|
56
|
-
fn: async (ctx) => {
|
|
57
|
-
if (ctx.toolName !== "Bash") return allow();
|
|
58
|
-
const cmd = String(ctx.toolInput?.command ?? "");
|
|
59
|
-
const cwd = ctx.session?.cwd;
|
|
60
|
-
if (cwd && isOutsideProject(cmd, cwd)) {
|
|
61
|
-
return instruct(
|
|
62
|
-
`The command references a path outside the project root (${cwd}). ` +
|
|
63
|
-
"Confirm this is intentional before proceeding."
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
return allow();
|
|
67
|
-
},
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// 4. PostToolUse: strip any line from Bash output that looks like a raw API key
|
|
71
|
-
customPolicies.add({
|
|
72
|
-
name: "scrub-api-key-output",
|
|
73
|
-
description: "Redact lines containing raw API keys from Bash tool output",
|
|
74
|
-
match: { events: ["PostToolUse"] },
|
|
75
|
-
fn: async (ctx) => {
|
|
76
|
-
if (ctx.toolName !== "Bash") return allow();
|
|
77
|
-
const output = String(ctx.payload?.tool_result ?? "");
|
|
78
|
-
// Simple heuristic: long alphanumeric tokens prefixed by known key prefixes
|
|
79
|
-
const keyPattern = /(?:sk-|ghp_|AIza|AKIA)[A-Za-z0-9_\-]{20,}/;
|
|
80
|
-
if (keyPattern.test(output)) {
|
|
81
|
-
return deny("Bash output contains what looks like a raw API key — output suppressed");
|
|
82
|
-
}
|
|
83
|
-
return allow();
|
|
84
|
-
},
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
// 5. Stop event: remind Claude to summarise what it changed before finishing
|
|
88
|
-
customPolicies.add({
|
|
89
|
-
name: "require-change-summary",
|
|
90
|
-
description: "Ask Claude to include a change summary before stopping",
|
|
91
|
-
match: { events: ["Stop"] },
|
|
92
|
-
fn: async (ctx) => {
|
|
93
|
-
const transcript = String(ctx.payload?.transcript ?? "");
|
|
94
|
-
// Only trigger if there were file-modifying tool calls in the session
|
|
95
|
-
const hadWrites = /\"tool_name\"\s*:\s*\"(Write|Edit|Bash)\"/.test(transcript);
|
|
96
|
-
if (hadWrites && !transcript.includes("## Summary")) {
|
|
97
|
-
return instruct(
|
|
98
|
-
"Before finishing, provide a brief '## Summary' of files you created or modified."
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
return allow();
|
|
102
|
-
},
|
|
103
|
-
});
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared utilities for hooks-advanced/index.js
|
|
3
|
-
* This file is a transitive import — the loader rewrites it automatically.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/** Return true if the command touches a path outside the project root. */
|
|
7
|
-
export function isOutsideProject(cmd, cwd) {
|
|
8
|
-
if (!cwd) return false;
|
|
9
|
-
// Very rough check: absolute paths that don't start with cwd
|
|
10
|
-
const absPathRe = /(?:^|\s)(\/[^\s]+)/g;
|
|
11
|
-
let match;
|
|
12
|
-
while ((match = absPathRe.exec(cmd)) !== null) {
|
|
13
|
-
if (!match[1].startsWith(cwd)) return true;
|
|
14
|
-
}
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/** Extract the first git branch name from a push command, e.g. "git push origin feat/foo" → "feat/foo" */
|
|
19
|
-
export function extractPushBranch(cmd) {
|
|
20
|
-
const m = cmd.match(/git\s+push\s+\S+\s+(\S+)/);
|
|
21
|
-
return m ? m[1] : null;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/** Return the list of staged secret file patterns to check. */
|
|
25
|
-
export const SECRET_FILENAME_PATTERNS = [
|
|
26
|
-
/\.pem$/i,
|
|
27
|
-
/\.key$/i,
|
|
28
|
-
/id_rsa/i,
|
|
29
|
-
/credentials\.json$/i,
|
|
30
|
-
/\.p12$/i,
|
|
31
|
-
];
|
|
32
|
-
|
|
33
|
-
export function looksLikeSecretFile(path) {
|
|
34
|
-
return SECRET_FILENAME_PATTERNS.some((re) => re.test(path));
|
|
35
|
-
}
|