failproofai 0.0.6-beta.2 → 0.0.6-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +7 -1
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +17 -17
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +17 -17
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +16 -16
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +16 -16
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +11 -11
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g72weg._.js +1 -1
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0i5kvry._.js → [root-of-the-server]__0om-5pe._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__05akje6._.js → [root-of-the-server]__111.vxi._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0mebn66._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +9 -9
- package/.next/standalone/.next/static/chunks/{05j1px0r8yzh6.js → 02dqjyv6_9mhq.js} +2 -2
- package/.next/standalone/.next/static/chunks/{14cl9poem30dq.js → 070orfsl6.xal.js} +1 -1
- package/.next/standalone/.next/static/chunks/0mir9jdxn35~s.css +1 -0
- package/.next/standalone/.next/static/chunks/{00j0rr7rh8ef8.js → 0o547jv-k_k35.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0ijk_kek9_wyx.js → 0pk2h2.mjxy.m.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0xpl.oscrakvx.js → 0rcwkbh24w38b.js} +1 -1
- package/.next/standalone/.next/static/chunks/{1052sguyd-.ka.js → 140xx_tfr~lm_.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0npb~873.wvg3.js → 169_e4dq~1~b6.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0badv41uxa56..js → 17ne4p.1sw1jy.js} +1 -1
- package/.next/standalone/next.config.ts +6 -0
- package/.next/standalone/package.json +2 -2
- package/.next/standalone/server.js +1 -1
- package/bin/failproofai.mjs +91 -4
- package/dist/cli.mjs +1155 -54
- package/package.json +2 -2
- package/scripts/prune-standalone.mjs +128 -0
- package/src/auth/login.ts +104 -0
- package/src/auth/logout.ts +50 -0
- package/src/auth/token-store.ts +64 -0
- package/src/hooks/builtin-policies.ts +22 -20
- package/src/hooks/handler.ts +35 -15
- package/src/relay/daemon.ts +362 -0
- package/src/relay/pid.ts +76 -0
- package/src/relay/queue.ts +225 -0
- package/.next/standalone/.claude/settings.json +0 -316
- package/.next/standalone/.failproofai/policies/review-policies.mjs +0 -113
- package/.next/standalone/.failproofai/policies/workflow-policies.mjs +0 -63
- package/.next/standalone/.failproofai/policies-config.json +0 -39
- package/.next/standalone/.next/static/chunks/0gu_a.a80ritd.css +0 -1
- package/.next/standalone/AGENTS.md +0 -80
- package/.next/standalone/CHANGELOG.md +0 -151
- package/.next/standalone/CLAUDE.md +0 -165
- package/.next/standalone/CONTRIBUTING.md +0 -76
- package/.next/standalone/Dockerfile.docs +0 -12
- package/.next/standalone/LICENSE +0 -42
- package/.next/standalone/README.md +0 -301
- package/.next/standalone/bin/failproofai.mjs +0 -352
- package/.next/standalone/bun.lock +0 -1119
- package/.next/standalone/components.json +0 -23
- package/.next/standalone/dist/cli.mjs +0 -3595
- package/.next/standalone/dist/index.js +0 -80
- package/.next/standalone/docs/ar/architecture.mdx +0 -334
- package/.next/standalone/docs/ar/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/ar/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ar/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ar/cli/hook.mdx +0 -31
- package/.next/standalone/docs/ar/cli/install-policies.mdx +0 -48
- package/.next/standalone/docs/ar/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/ar/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ar/cli/version.mdx +0 -13
- package/.next/standalone/docs/ar/configuration.mdx +0 -223
- package/.next/standalone/docs/ar/custom-policies.mdx +0 -354
- package/.next/standalone/docs/ar/dashboard.mdx +0 -142
- package/.next/standalone/docs/ar/examples.mdx +0 -307
- package/.next/standalone/docs/ar/for-agents.mdx +0 -39
- package/.next/standalone/docs/ar/getting-started.mdx +0 -187
- package/.next/standalone/docs/ar/introduction.mdx +0 -58
- package/.next/standalone/docs/ar/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ar/testing.mdx +0 -261
- package/.next/standalone/docs/architecture.mdx +0 -332
- package/.next/standalone/docs/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/cli/hook.mdx +0 -30
- package/.next/standalone/docs/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/cli/version.mdx +0 -12
- package/.next/standalone/docs/configuration.mdx +0 -222
- package/.next/standalone/docs/custom-policies.mdx +0 -353
- package/.next/standalone/docs/dashboard.mdx +0 -142
- package/.next/standalone/docs/de/architecture.mdx +0 -332
- package/.next/standalone/docs/de/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/de/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/de/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/de/cli/hook.mdx +0 -30
- package/.next/standalone/docs/de/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/de/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/de/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/de/cli/version.mdx +0 -12
- package/.next/standalone/docs/de/configuration.mdx +0 -222
- package/.next/standalone/docs/de/custom-policies.mdx +0 -353
- package/.next/standalone/docs/de/dashboard.mdx +0 -142
- package/.next/standalone/docs/de/examples.mdx +0 -307
- package/.next/standalone/docs/de/for-agents.mdx +0 -38
- package/.next/standalone/docs/de/getting-started.mdx +0 -186
- package/.next/standalone/docs/de/introduction.mdx +0 -57
- package/.next/standalone/docs/de/package-aliases.mdx +0 -82
- package/.next/standalone/docs/de/testing.mdx +0 -260
- package/.next/standalone/docs/docs.json +0 -1002
- package/.next/standalone/docs/es/architecture.mdx +0 -332
- package/.next/standalone/docs/es/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/es/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/es/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/es/cli/hook.mdx +0 -30
- package/.next/standalone/docs/es/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/es/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/es/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/es/cli/version.mdx +0 -12
- package/.next/standalone/docs/es/configuration.mdx +0 -222
- package/.next/standalone/docs/es/custom-policies.mdx +0 -353
- package/.next/standalone/docs/es/dashboard.mdx +0 -142
- package/.next/standalone/docs/es/examples.mdx +0 -307
- package/.next/standalone/docs/es/for-agents.mdx +0 -38
- package/.next/standalone/docs/es/getting-started.mdx +0 -186
- package/.next/standalone/docs/es/introduction.mdx +0 -57
- package/.next/standalone/docs/es/package-aliases.mdx +0 -82
- package/.next/standalone/docs/es/testing.mdx +0 -260
- package/.next/standalone/docs/examples.mdx +0 -307
- package/.next/standalone/docs/favicon.ico +0 -0
- package/.next/standalone/docs/for-agents.mdx +0 -38
- package/.next/standalone/docs/fr/architecture.mdx +0 -332
- package/.next/standalone/docs/fr/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/fr/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/fr/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/fr/cli/hook.mdx +0 -30
- package/.next/standalone/docs/fr/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/fr/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/fr/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/fr/cli/version.mdx +0 -12
- package/.next/standalone/docs/fr/configuration.mdx +0 -222
- package/.next/standalone/docs/fr/custom-policies.mdx +0 -353
- package/.next/standalone/docs/fr/dashboard.mdx +0 -142
- package/.next/standalone/docs/fr/examples.mdx +0 -307
- package/.next/standalone/docs/fr/for-agents.mdx +0 -38
- package/.next/standalone/docs/fr/getting-started.mdx +0 -186
- package/.next/standalone/docs/fr/introduction.mdx +0 -57
- package/.next/standalone/docs/fr/package-aliases.mdx +0 -82
- package/.next/standalone/docs/fr/testing.mdx +0 -260
- package/.next/standalone/docs/getting-started.mdx +0 -186
- package/.next/standalone/docs/he/architecture.mdx +0 -333
- package/.next/standalone/docs/he/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/he/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/he/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/he/cli/hook.mdx +0 -30
- package/.next/standalone/docs/he/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/he/cli/list-policies.mdx +0 -32
- package/.next/standalone/docs/he/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/he/cli/version.mdx +0 -12
- package/.next/standalone/docs/he/configuration.mdx +0 -223
- package/.next/standalone/docs/he/custom-policies.mdx +0 -353
- package/.next/standalone/docs/he/dashboard.mdx +0 -142
- package/.next/standalone/docs/he/examples.mdx +0 -307
- package/.next/standalone/docs/he/for-agents.mdx +0 -38
- package/.next/standalone/docs/he/getting-started.mdx +0 -186
- package/.next/standalone/docs/he/introduction.mdx +0 -57
- package/.next/standalone/docs/he/package-aliases.mdx +0 -82
- package/.next/standalone/docs/he/testing.mdx +0 -260
- package/.next/standalone/docs/hi/architecture.mdx +0 -334
- package/.next/standalone/docs/hi/built-in-policies.mdx +0 -576
- package/.next/standalone/docs/hi/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/hi/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/hi/cli/hook.mdx +0 -30
- package/.next/standalone/docs/hi/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/hi/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/hi/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/hi/cli/version.mdx +0 -12
- package/.next/standalone/docs/hi/configuration.mdx +0 -222
- package/.next/standalone/docs/hi/custom-policies.mdx +0 -354
- package/.next/standalone/docs/hi/dashboard.mdx +0 -142
- package/.next/standalone/docs/hi/examples.mdx +0 -309
- package/.next/standalone/docs/hi/for-agents.mdx +0 -38
- package/.next/standalone/docs/hi/getting-started.mdx +0 -187
- package/.next/standalone/docs/hi/introduction.mdx +0 -57
- package/.next/standalone/docs/hi/package-aliases.mdx +0 -82
- package/.next/standalone/docs/hi/testing.mdx +0 -260
- package/.next/standalone/docs/i18n/README.ar.md +0 -312
- package/.next/standalone/docs/i18n/README.de.md +0 -307
- package/.next/standalone/docs/i18n/README.es.md +0 -307
- package/.next/standalone/docs/i18n/README.fr.md +0 -307
- package/.next/standalone/docs/i18n/README.he.md +0 -312
- package/.next/standalone/docs/i18n/README.hi.md +0 -307
- package/.next/standalone/docs/i18n/README.it.md +0 -307
- package/.next/standalone/docs/i18n/README.ja.md +0 -307
- package/.next/standalone/docs/i18n/README.ko.md +0 -307
- package/.next/standalone/docs/i18n/README.pt-br.md +0 -307
- package/.next/standalone/docs/i18n/README.ru.md +0 -308
- package/.next/standalone/docs/i18n/README.tr.md +0 -307
- package/.next/standalone/docs/i18n/README.vi.md +0 -307
- package/.next/standalone/docs/i18n/README.zh.md +0 -307
- package/.next/standalone/docs/introduction.mdx +0 -57
- package/.next/standalone/docs/it/architecture.mdx +0 -334
- package/.next/standalone/docs/it/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/it/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/it/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/it/cli/hook.mdx +0 -30
- package/.next/standalone/docs/it/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/it/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/it/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/it/cli/version.mdx +0 -12
- package/.next/standalone/docs/it/configuration.mdx +0 -222
- package/.next/standalone/docs/it/custom-policies.mdx +0 -353
- package/.next/standalone/docs/it/dashboard.mdx +0 -142
- package/.next/standalone/docs/it/examples.mdx +0 -307
- package/.next/standalone/docs/it/for-agents.mdx +0 -38
- package/.next/standalone/docs/it/getting-started.mdx +0 -186
- package/.next/standalone/docs/it/introduction.mdx +0 -57
- package/.next/standalone/docs/it/package-aliases.mdx +0 -82
- package/.next/standalone/docs/it/testing.mdx +0 -260
- package/.next/standalone/docs/ja/architecture.mdx +0 -332
- package/.next/standalone/docs/ja/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/ja/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ja/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ja/cli/hook.mdx +0 -30
- package/.next/standalone/docs/ja/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/ja/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/ja/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ja/cli/version.mdx +0 -12
- package/.next/standalone/docs/ja/configuration.mdx +0 -222
- package/.next/standalone/docs/ja/custom-policies.mdx +0 -353
- package/.next/standalone/docs/ja/dashboard.mdx +0 -142
- package/.next/standalone/docs/ja/examples.mdx +0 -307
- package/.next/standalone/docs/ja/for-agents.mdx +0 -38
- package/.next/standalone/docs/ja/getting-started.mdx +0 -186
- package/.next/standalone/docs/ja/introduction.mdx +0 -57
- package/.next/standalone/docs/ja/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ja/testing.mdx +0 -260
- package/.next/standalone/docs/ko/architecture.mdx +0 -332
- package/.next/standalone/docs/ko/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/ko/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ko/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ko/cli/hook.mdx +0 -30
- package/.next/standalone/docs/ko/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/ko/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/ko/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ko/cli/version.mdx +0 -12
- package/.next/standalone/docs/ko/configuration.mdx +0 -222
- package/.next/standalone/docs/ko/custom-policies.mdx +0 -353
- package/.next/standalone/docs/ko/dashboard.mdx +0 -142
- package/.next/standalone/docs/ko/examples.mdx +0 -307
- package/.next/standalone/docs/ko/for-agents.mdx +0 -38
- package/.next/standalone/docs/ko/getting-started.mdx +0 -186
- package/.next/standalone/docs/ko/introduction.mdx +0 -57
- package/.next/standalone/docs/ko/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ko/testing.mdx +0 -260
- package/.next/standalone/docs/logo/dark.svg +0 -21
- package/.next/standalone/docs/logo/exosphere-dark.png +0 -0
- package/.next/standalone/docs/logo/exosphere-light.png +0 -0
- package/.next/standalone/docs/logo/light.svg +0 -21
- package/.next/standalone/docs/package-aliases.mdx +0 -82
- package/.next/standalone/docs/pt-br/architecture.mdx +0 -332
- package/.next/standalone/docs/pt-br/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/pt-br/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/pt-br/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/pt-br/cli/hook.mdx +0 -30
- package/.next/standalone/docs/pt-br/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/pt-br/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/pt-br/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/pt-br/cli/version.mdx +0 -12
- package/.next/standalone/docs/pt-br/configuration.mdx +0 -222
- package/.next/standalone/docs/pt-br/custom-policies.mdx +0 -353
- package/.next/standalone/docs/pt-br/dashboard.mdx +0 -142
- package/.next/standalone/docs/pt-br/examples.mdx +0 -307
- package/.next/standalone/docs/pt-br/for-agents.mdx +0 -38
- package/.next/standalone/docs/pt-br/getting-started.mdx +0 -186
- package/.next/standalone/docs/pt-br/introduction.mdx +0 -57
- package/.next/standalone/docs/pt-br/package-aliases.mdx +0 -82
- package/.next/standalone/docs/pt-br/testing.mdx +0 -260
- package/.next/standalone/docs/ru/architecture.mdx +0 -333
- package/.next/standalone/docs/ru/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/ru/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ru/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ru/cli/hook.mdx +0 -30
- package/.next/standalone/docs/ru/cli/install-policies.mdx +0 -48
- package/.next/standalone/docs/ru/cli/list-policies.mdx +0 -32
- package/.next/standalone/docs/ru/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ru/cli/version.mdx +0 -12
- package/.next/standalone/docs/ru/configuration.mdx +0 -222
- package/.next/standalone/docs/ru/custom-policies.mdx +0 -354
- package/.next/standalone/docs/ru/dashboard.mdx +0 -142
- package/.next/standalone/docs/ru/examples.mdx +0 -309
- package/.next/standalone/docs/ru/for-agents.mdx +0 -38
- package/.next/standalone/docs/ru/getting-started.mdx +0 -186
- package/.next/standalone/docs/ru/introduction.mdx +0 -57
- package/.next/standalone/docs/ru/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ru/testing.mdx +0 -260
- package/.next/standalone/docs/testing.mdx +0 -260
- package/.next/standalone/docs/tr/architecture.mdx +0 -333
- package/.next/standalone/docs/tr/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/tr/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/tr/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/tr/cli/hook.mdx +0 -30
- package/.next/standalone/docs/tr/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/tr/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/tr/cli/remove-policies.mdx +0 -44
- package/.next/standalone/docs/tr/cli/version.mdx +0 -12
- package/.next/standalone/docs/tr/configuration.mdx +0 -222
- package/.next/standalone/docs/tr/custom-policies.mdx +0 -353
- package/.next/standalone/docs/tr/dashboard.mdx +0 -142
- package/.next/standalone/docs/tr/examples.mdx +0 -308
- package/.next/standalone/docs/tr/for-agents.mdx +0 -38
- package/.next/standalone/docs/tr/getting-started.mdx +0 -186
- package/.next/standalone/docs/tr/introduction.mdx +0 -57
- package/.next/standalone/docs/tr/package-aliases.mdx +0 -82
- package/.next/standalone/docs/tr/testing.mdx +0 -260
- package/.next/standalone/docs/vi/architecture.mdx +0 -334
- package/.next/standalone/docs/vi/built-in-policies.mdx +0 -575
- package/.next/standalone/docs/vi/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/vi/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/vi/cli/hook.mdx +0 -30
- package/.next/standalone/docs/vi/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/vi/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/vi/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/vi/cli/version.mdx +0 -13
- package/.next/standalone/docs/vi/configuration.mdx +0 -222
- package/.next/standalone/docs/vi/custom-policies.mdx +0 -353
- package/.next/standalone/docs/vi/dashboard.mdx +0 -142
- package/.next/standalone/docs/vi/examples.mdx +0 -308
- package/.next/standalone/docs/vi/for-agents.mdx +0 -38
- package/.next/standalone/docs/vi/getting-started.mdx +0 -186
- package/.next/standalone/docs/vi/introduction.mdx +0 -57
- package/.next/standalone/docs/vi/package-aliases.mdx +0 -82
- package/.next/standalone/docs/vi/testing.mdx +0 -260
- package/.next/standalone/docs/zh/architecture.mdx +0 -332
- package/.next/standalone/docs/zh/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/zh/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/zh/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/zh/cli/hook.mdx +0 -30
- package/.next/standalone/docs/zh/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/zh/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/zh/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/zh/cli/version.mdx +0 -12
- package/.next/standalone/docs/zh/configuration.mdx +0 -222
- package/.next/standalone/docs/zh/custom-policies.mdx +0 -353
- package/.next/standalone/docs/zh/dashboard.mdx +0 -142
- package/.next/standalone/docs/zh/examples.mdx +0 -307
- package/.next/standalone/docs/zh/for-agents.mdx +0 -38
- package/.next/standalone/docs/zh/getting-started.mdx +0 -186
- package/.next/standalone/docs/zh/introduction.mdx +0 -57
- package/.next/standalone/docs/zh/package-aliases.mdx +0 -82
- package/.next/standalone/docs/zh/testing.mdx +0 -260
- package/.next/standalone/eslint.config.mjs +0 -15
- package/.next/standalone/examples/convention-policies/security-policies.mjs +0 -40
- package/.next/standalone/examples/convention-policies/workflow-policies.mjs +0 -41
- package/.next/standalone/examples/policies-advanced/index.js +0 -103
- package/.next/standalone/examples/policies-advanced/utils.js +0 -35
- package/.next/standalone/examples/policies-basic.js +0 -77
- package/.next/standalone/examples/policies-notification.js +0 -104
- package/.next/standalone/node_modules/@img/colour/color.cjs +0 -1594
- package/.next/standalone/node_modules/@img/colour/index.cjs +0 -1
- package/.next/standalone/node_modules/@img/colour/package.json +0 -45
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/README.md +0 -46
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/glib-2.0/include/glibconfig.h +0 -221
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/index.js +0 -1
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/package.json +0 -42
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/versions.json +0 -30
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/README.md +0 -46
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/glib-2.0/include/glibconfig.h +0 -221
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +0 -1
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +0 -42
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +0 -30
- package/.next/standalone/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
- package/.next/standalone/node_modules/@img/sharp-linux-x64/package.json +0 -46
- package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
- package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +0 -46
- package/.next/standalone/node_modules/detect-libc/lib/detect-libc.js +0 -313
- package/.next/standalone/node_modules/detect-libc/lib/elf.js +0 -39
- package/.next/standalone/node_modules/detect-libc/lib/filesystem.js +0 -51
- package/.next/standalone/node_modules/detect-libc/lib/process.js +0 -24
- package/.next/standalone/node_modules/detect-libc/package.json +0 -44
- package/.next/standalone/node_modules/sharp/lib/channel.js +0 -177
- package/.next/standalone/node_modules/sharp/lib/colour.js +0 -195
- package/.next/standalone/node_modules/sharp/lib/composite.js +0 -212
- package/.next/standalone/node_modules/sharp/lib/constructor.js +0 -499
- package/.next/standalone/node_modules/sharp/lib/index.js +0 -16
- package/.next/standalone/node_modules/sharp/lib/input.js +0 -809
- package/.next/standalone/node_modules/sharp/lib/is.js +0 -143
- package/.next/standalone/node_modules/sharp/lib/libvips.js +0 -207
- package/.next/standalone/node_modules/sharp/lib/operation.js +0 -1016
- package/.next/standalone/node_modules/sharp/lib/output.js +0 -1666
- package/.next/standalone/node_modules/sharp/lib/resize.js +0 -595
- package/.next/standalone/node_modules/sharp/lib/sharp.js +0 -121
- package/.next/standalone/node_modules/sharp/lib/utility.js +0 -291
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/comparator.js +0 -143
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/range.js +0 -557
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/semver.js +0 -333
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/cmp.js +0 -54
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/coerce.js +0 -62
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/compare.js +0 -7
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/eq.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gt.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gte.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lt.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lte.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/neq.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/parse.js +0 -18
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/satisfies.js +0 -12
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/constants.js +0 -37
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/debug.js +0 -11
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/identifiers.js +0 -29
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/lrucache.js +0 -42
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/parse-options.js +0 -17
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/re.js +0 -223
- package/.next/standalone/node_modules/sharp/node_modules/semver/package.json +0 -78
- package/.next/standalone/node_modules/sharp/package.json +0 -202
- package/.next/standalone/scripts/alias-proxy.js +0 -18
- package/.next/standalone/scripts/dev.ts +0 -3
- package/.next/standalone/scripts/install-telemetry.mjs +0 -108
- package/.next/standalone/scripts/launch.ts +0 -83
- package/.next/standalone/scripts/parse-script-args.ts +0 -87
- package/.next/standalone/scripts/postinstall.mjs +0 -121
- package/.next/standalone/scripts/preuninstall.mjs +0 -131
- package/.next/standalone/scripts/publish-aliases.mjs +0 -87
- package/.next/standalone/scripts/start.ts +0 -3
- package/.next/standalone/scripts/sync-hook-events-prompt.md +0 -60
- package/.next/standalone/scripts/translate-docs/cache.ts +0 -62
- package/.next/standalone/scripts/translate-docs/cli.ts +0 -357
- package/.next/standalone/scripts/translate-docs/config.ts +0 -248
- package/.next/standalone/scripts/translate-docs/mdx-translator.ts +0 -153
- package/.next/standalone/scripts/translate-docs/mintlify-nav.ts +0 -107
- package/.next/standalone/scripts/translate-docs/readme-translator.ts +0 -154
- package/.next/standalone/scripts/translate-docs/translator.ts +0 -68
- package/.next/standalone/scripts/translate-docs/types.ts +0 -43
- package/.next/standalone/src/cli-error.ts +0 -18
- package/.next/standalone/src/hooks/builtin-policies.ts +0 -1613
- package/.next/standalone/src/hooks/custom-hooks-loader.ts +0 -205
- package/.next/standalone/src/hooks/custom-hooks-registry.ts +0 -30
- package/.next/standalone/src/hooks/handler.ts +0 -202
- package/.next/standalone/src/hooks/hook-activity-store.ts +0 -349
- package/.next/standalone/src/hooks/hook-logger.ts +0 -133
- package/.next/standalone/src/hooks/hook-telemetry.ts +0 -43
- package/.next/standalone/src/hooks/hooks-config.ts +0 -166
- package/.next/standalone/src/hooks/install-prompt.ts +0 -357
- package/.next/standalone/src/hooks/llm-client.ts +0 -90
- package/.next/standalone/src/hooks/loader-utils.ts +0 -178
- package/.next/standalone/src/hooks/manager.ts +0 -692
- package/.next/standalone/src/hooks/policy-evaluator.ts +0 -224
- package/.next/standalone/src/hooks/policy-helpers.ts +0 -16
- package/.next/standalone/src/hooks/policy-registry.ts +0 -90
- package/.next/standalone/src/hooks/policy-types.ts +0 -77
- package/.next/standalone/src/hooks/types.ts +0 -63
- package/.next/standalone/src/index.ts +0 -19
- package/.next/standalone/src/posthog-key.ts +0 -5
- package/.next/standalone/tailwind.config.ts +0 -11
- package/.next/standalone/tsconfig.json +0 -42
- package/.next/standalone/vitest.config.e2e.mts +0 -24
- package/.next/standalone/vitest.config.mts +0 -23
- /package/.next/standalone/.next/static/{A9pNTZdoYJTVyPAYwQMx5 → wOkJXoch1UmRAmyIuKZWc}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{A9pNTZdoYJTVyPAYwQMx5 → wOkJXoch1UmRAmyIuKZWc}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{A9pNTZdoYJTVyPAYwQMx5 → wOkJXoch1UmRAmyIuKZWc}/_ssgManifest.js +0 -0
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Тестирование
|
|
3
|
-
description: "Модульные тесты, E2E тесты и вспомогательные инструменты для тестирования"
|
|
4
|
-
icon: flask-vial
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
failproofai имеет два набора тестов: **модульные тесты** (быстрые, с моками) и **сквозные тесты** (реальные вызовы подпроцессов).
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Запуск тестов
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
# Запустить все модульные тесты один раз
|
|
15
|
-
bun run test:run
|
|
16
|
-
|
|
17
|
-
# Запустить модульные тесты в режиме наблюдения
|
|
18
|
-
bun run test
|
|
19
|
-
|
|
20
|
-
# Запустить E2E тесты (требуется подготовка - см. ниже)
|
|
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
|
-
E2E тесты вызывают реальный бинарный файл `failproofai` как подпроцесс, передают JSON-полезную нагрузку в stdin и проверяют выходные данные stdout и код выхода. Это тестирует полный путь интеграции, который использует Claude Code.
|
|
114
|
-
|
|
115
|
-
### Подготовка
|
|
116
|
-
|
|
117
|
-
E2E тесты запускают бинарный файл непосредственно из исходного кода репозитория. Перед первым запуском соберите CJS-пакет, который используют файлы пользовательских хуков при импорте из `'failproofai'`:
|
|
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
|
-
Пересобирайте `dist/` всякий раз, когда вы изменяете публичный API хуков (`src/hooks/custom-hooks-registry.ts`, `src/hooks/policy-helpers.ts` или `src/hooks/policy-types.ts`).
|
|
130
|
-
|
|
131
|
-
### Структура E2E теста
|
|
132
|
-
|
|
133
|
-
```text
|
|
134
|
-
__tests__/e2e/
|
|
135
|
-
helpers/
|
|
136
|
-
hook-runner.ts # Запуск бинарного файла, передача полезной нагрузки JSON, захват кода выхода + stdout + stderr
|
|
137
|
-
fixture-env.ts # Изолированные на тест временные каталоги с файлами конфига
|
|
138
|
-
payloads.ts # Фабрики полезных нагрузок с точностью Claude для каждого типа события
|
|
139
|
-
hooks/
|
|
140
|
-
builtin-policies.e2e.test.ts # Каждая встроенная политика с реальным подпроцессом
|
|
141
|
-
custom-hooks.e2e.test.ts # Загрузка и оценка пользовательских хуков
|
|
142
|
-
config-scopes.e2e.test.ts # Объединение конфига между проектом/локальным/глобальным
|
|
143
|
-
policy-params.e2e.test.ts # Внедрение параметров для каждой параметризованной политики
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
### Использование E2E вспомогательных инструментов
|
|
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 - изолированный домашний каталог; нет утечек реального ~/.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`** - готовые фабрики полезных нагрузок:
|
|
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
|
-
### Написание E2E теста
|
|
196
|
-
|
|
197
|
-
```typescript
|
|
198
|
-
import { describe, it, expect } from "vitest";
|
|
199
|
-
import { createFixtureEnv } from "../helpers/fixture-env";
|
|
200
|
-
import { runHook } from "../helpers/hook-runner";
|
|
201
|
-
import { Payloads } from "../helpers/payloads";
|
|
202
|
-
|
|
203
|
-
describe("block-rm-rf (E2E)", () => {
|
|
204
|
-
it("denies rm -rf", async () => {
|
|
205
|
-
const env = createFixtureEnv();
|
|
206
|
-
env.writeConfig({ enabledPolicies: ["block-rm-rf"] });
|
|
207
|
-
|
|
208
|
-
const result = await runHook(
|
|
209
|
-
"PreToolUse",
|
|
210
|
-
Payloads.preToolUse.bash("rm -rf /", env.cwd),
|
|
211
|
-
{ homeDir: env.home }
|
|
212
|
-
);
|
|
213
|
-
|
|
214
|
-
expect(result.exitCode).toBe(0);
|
|
215
|
-
expect(result.parsed?.hookSpecificOutput?.permissionDecision).toBe("deny");
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
it("allows non-recursive rm", async () => {
|
|
219
|
-
const env = createFixtureEnv();
|
|
220
|
-
env.writeConfig({ enabledPolicies: ["block-rm-rf"] });
|
|
221
|
-
|
|
222
|
-
const result = await runHook(
|
|
223
|
-
"PreToolUse",
|
|
224
|
-
Payloads.preToolUse.bash("rm /tmp/file.txt", env.cwd),
|
|
225
|
-
{ homeDir: env.home }
|
|
226
|
-
);
|
|
227
|
-
|
|
228
|
-
expect(result.exitCode).toBe(0);
|
|
229
|
-
expect(result.stdout).toBe(""); // allow → пустой stdout
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
### Формы ответов E2E
|
|
235
|
-
|
|
236
|
-
| Решение | Код выхода | stdout |
|
|
237
|
-
|----------|-----------|--------|
|
|
238
|
-
| `PreToolUse` deny | `0` | `{"hookSpecificOutput":{"permissionDecision":"deny","permissionDecisionReason":"..."}}` |
|
|
239
|
-
| `PostToolUse` deny | `0` | `{"hookSpecificOutput":{"additionalContext":"Blocked ... because: ..."}}` |
|
|
240
|
-
| Instruct (не-Stop) | `0` | `{"hookSpecificOutput":{"additionalContext":"Instruction from failproofai: ..."}}` |
|
|
241
|
-
| Stop instruct | `2` | пустой stdout; причина в stderr |
|
|
242
|
-
| Allow | `0` | пустая строка |
|
|
243
|
-
|
|
244
|
-
### Конфигурация Vitest
|
|
245
|
-
|
|
246
|
-
E2E тесты используют `vitest.config.e2e.mts` с:
|
|
247
|
-
|
|
248
|
-
- `environment: "node"` - глобальные переменные браузера не требуются
|
|
249
|
-
- `pool: "forks"` - истинная изоляция процессов (тесты запускают подпроцессы)
|
|
250
|
-
- `testTimeout: 20_000` - 20 сек на тест (запуск бинарного файла + оценка хука)
|
|
251
|
-
|
|
252
|
-
Пул `forks` важен: рабочие потоки используют совместно `globalThis`, что может помешать тестам, запускающим подпроцессы. Процессные fork избегают этой проблемы.
|
|
253
|
-
|
|
254
|
-
---
|
|
255
|
-
|
|
256
|
-
## CI
|
|
257
|
-
|
|
258
|
-
Полный запуск CI (`bun run lint && bunx tsc --noEmit && bun run test:run && bun run build`) должен пройти перед слиянием. Набор E2E запускается как отдельная задача CI параллельно.
|
|
259
|
-
|
|
260
|
-
См. [Contributing](../CONTRIBUTING.md) для полного контрольного списка перед слиянием.
|
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Testing
|
|
3
|
-
description: "Unit tests, E2E tests, and test helpers"
|
|
4
|
-
icon: flask-vial
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
failproofai has two test suites: **unit tests** (fast, mocked) and **end-to-end tests** (real subprocess invocations).
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Running tests
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
# Run all unit tests once
|
|
15
|
-
bun run test:run
|
|
16
|
-
|
|
17
|
-
# Run unit tests in watch mode
|
|
18
|
-
bun run test
|
|
19
|
-
|
|
20
|
-
# Run E2E tests (requires setup - see below)
|
|
21
|
-
bun run test:e2e
|
|
22
|
-
|
|
23
|
-
# Type-check without building
|
|
24
|
-
bunx tsc --noEmit
|
|
25
|
-
|
|
26
|
-
# Lint
|
|
27
|
-
bun run lint
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## Unit tests
|
|
33
|
-
|
|
34
|
-
Unit tests live in `__tests__/` and use [Vitest](https://vitest.dev) with `happy-dom`.
|
|
35
|
-
|
|
36
|
-
```text
|
|
37
|
-
__tests__/
|
|
38
|
-
hooks/
|
|
39
|
-
builtin-policies.test.ts # Policy logic for each builtin
|
|
40
|
-
hooks-config.test.ts # Config loading and scope merging
|
|
41
|
-
policy-evaluator.test.ts # Param injection and evaluation order
|
|
42
|
-
custom-hooks-registry.test.ts # globalThis registry add/get/clear
|
|
43
|
-
custom-hooks-loader.test.ts # ESM loader, transitive imports, error handling
|
|
44
|
-
manager.test.ts # install/remove/list operations
|
|
45
|
-
components/
|
|
46
|
-
sessions-list.test.tsx # Session list component
|
|
47
|
-
project-list.test.tsx # Project list component
|
|
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
|
-
### Writing a policy unit test
|
|
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
|
-
## End-to-end tests
|
|
112
|
-
|
|
113
|
-
E2E tests invoke the real `failproofai` binary as a subprocess, pipe a JSON payload to stdin, and assert on the stdout output and exit code. This tests the complete integration path that Claude Code uses.
|
|
114
|
-
|
|
115
|
-
### Setup
|
|
116
|
-
|
|
117
|
-
E2E tests run the binary directly from the repo source. Before the first run, build the CJS bundle that custom hook files use when they import from `'failproofai'`:
|
|
118
|
-
|
|
119
|
-
```bash
|
|
120
|
-
bun build src/index.ts --outdir dist --target node --format cjs
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
Then run the tests:
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
bun run test:e2e
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
Rebuild `dist/` whenever you change the public hook API (`src/hooks/custom-hooks-registry.ts`, `src/hooks/policy-helpers.ts`, or `src/hooks/policy-types.ts`).
|
|
130
|
-
|
|
131
|
-
### E2E test structure
|
|
132
|
-
|
|
133
|
-
```text
|
|
134
|
-
__tests__/e2e/
|
|
135
|
-
helpers/
|
|
136
|
-
hook-runner.ts # Spawn the binary, pipe payload JSON, capture exit code + stdout + stderr
|
|
137
|
-
fixture-env.ts # Per-test isolated temp directories with config files
|
|
138
|
-
payloads.ts # Claude-accurate payload factories for each event type
|
|
139
|
-
hooks/
|
|
140
|
-
builtin-policies.e2e.test.ts # Each builtin policy with real subprocess
|
|
141
|
-
custom-hooks.e2e.test.ts # Custom hook loading and evaluation
|
|
142
|
-
config-scopes.e2e.test.ts # Config merging across project/local/global
|
|
143
|
-
policy-params.e2e.test.ts # Parameter injection for each parameterized policy
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
### Using the E2E helpers
|
|
147
|
-
|
|
148
|
-
**`FixtureEnv`** - isolated per-test environment:
|
|
149
|
-
|
|
150
|
-
```typescript
|
|
151
|
-
import { createFixtureEnv } from "../helpers/fixture-env";
|
|
152
|
-
|
|
153
|
-
const env = createFixtureEnv();
|
|
154
|
-
// env.cwd - temp dir; pass as payload.cwd to pick up .failproofai/policies-config.json
|
|
155
|
-
// env.home - isolated home dir; no real ~/.failproofai leaks in
|
|
156
|
-
|
|
157
|
-
env.writeConfig({
|
|
158
|
-
enabledPolicies: ["block-sudo"],
|
|
159
|
-
policyParams: {
|
|
160
|
-
"block-sudo": { allowPatterns: ["sudo systemctl status"] },
|
|
161
|
-
},
|
|
162
|
-
});
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
`createFixtureEnv()` registers `afterEach` cleanup automatically.
|
|
166
|
-
|
|
167
|
-
**`runHook`** - invoke the binary:
|
|
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`** - ready-made payload factories:
|
|
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
|
-
### Writing an E2E test
|
|
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 → empty stdout
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
### E2E response shapes
|
|
235
|
-
|
|
236
|
-
| Decision | Exit code | stdout |
|
|
237
|
-
|----------|-----------|--------|
|
|
238
|
-
| `PreToolUse` deny | `0` | `{"hookSpecificOutput":{"permissionDecision":"deny","permissionDecisionReason":"..."}}` |
|
|
239
|
-
| `PostToolUse` deny | `0` | `{"hookSpecificOutput":{"additionalContext":"Blocked ... because: ..."}}` |
|
|
240
|
-
| Instruct (non-Stop) | `0` | `{"hookSpecificOutput":{"additionalContext":"Instruction from failproofai: ..."}}` |
|
|
241
|
-
| Stop instruct | `2` | empty stdout; reason in stderr |
|
|
242
|
-
| Allow | `0` | empty string |
|
|
243
|
-
|
|
244
|
-
### Vitest config
|
|
245
|
-
|
|
246
|
-
E2E tests use `vitest.config.e2e.mts` with:
|
|
247
|
-
|
|
248
|
-
- `environment: "node"` - no browser globals needed
|
|
249
|
-
- `pool: "forks"` - true process isolation (tests spawn subprocesses)
|
|
250
|
-
- `testTimeout: 20_000` - 20s per test (binary startup + hook eval)
|
|
251
|
-
|
|
252
|
-
The `forks` pool is important: thread-based workers share `globalThis`, which can interfere with subprocess-spawning tests. Process-based forks avoid this.
|
|
253
|
-
|
|
254
|
-
---
|
|
255
|
-
|
|
256
|
-
## CI
|
|
257
|
-
|
|
258
|
-
The full CI run (`bun run lint && bunx tsc --noEmit && bun run test:run && bun run build`) is required to pass before merging. The E2E suite runs as a separate CI job in parallel.
|
|
259
|
-
|
|
260
|
-
See [Contributing](../CONTRIBUTING.md) for the complete pre-merge checklist.
|