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,301 +0,0 @@
|
|
|
1
|
-
```
|
|
2
|
-
______ _ __ ____ ___ ____
|
|
3
|
-
/ ____/___ _(_) /___ _________ ____ / __/ / | / _/
|
|
4
|
-
/ /_ / __ `/ / / __ \/ ___/ __ \/ __ \/ /_ / /| | / /
|
|
5
|
-
/ __/ / /_/ / / / /_/ / / / /_/ / /_/ / __/ / ___ |_/ /
|
|
6
|
-
/_/ \__,_/_/_/ .___/_/ \____/\____/_/ /_/ |_/___/
|
|
7
|
-
/_/
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
# Failproof AI
|
|
11
|
-
|
|
12
|
-
[](https://befailproof.ai)
|
|
13
|
-
[](https://www.npmjs.com/package/failproofai)
|
|
14
|
-
[](LICENSE)
|
|
15
|
-
[](https://github.com/exospherehost/failproofai/actions)
|
|
16
|
-
[](https://join.slack.com/t/failproofai/shared_invite/zt-3v63b7k5e-O3NBHmj8X6n9gZSGDx6ggQ)
|
|
17
|
-
|
|
18
|
-
**Translations**: [简体中文](docs/i18n/README.zh.md) | [日本語](docs/i18n/README.ja.md) | [한국어](docs/i18n/README.ko.md) | [Español](docs/i18n/README.es.md) | [Português](docs/i18n/README.pt-br.md) | [Deutsch](docs/i18n/README.de.md) | [Français](docs/i18n/README.fr.md) | [Русский](docs/i18n/README.ru.md) | [हिन्दी](docs/i18n/README.hi.md) | [Türkçe](docs/i18n/README.tr.md) | [Tiếng Việt](docs/i18n/README.vi.md) | [Italiano](docs/i18n/README.it.md) | [العربية](docs/i18n/README.ar.md) | [עברית](docs/i18n/README.he.md)
|
|
19
|
-
|
|
20
|
-
The easiest way to manage policies that keep your AI agents reliable, on-task, and running autonomously - for **Claude Code** & the **Agents SDK**.
|
|
21
|
-
|
|
22
|
-
- **30 Built-in Policies** - Catch common agent failure modes out of the box. Block destructive commands, prevent secret leakage, keep agents inside project boundaries, detect loops, and more.
|
|
23
|
-
- **Custom Policies** - Write your own reliability rules in JavaScript. Use the `allow`/`deny`/`instruct` API to enforce conventions, prevent drift, gate operations, or integrate with external systems.
|
|
24
|
-
- **Easy Configuration** - Tune any policy without writing code. Set allowlists, protected branches, thresholds per-project or globally. Three-scope config merges automatically.
|
|
25
|
-
- **Agent Monitor** - See what your agents did while you were away. Browse sessions, inspect every tool call, and review exactly where policies fired.
|
|
26
|
-
|
|
27
|
-
Everything runs locally - no data leaves your machine.
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## Requirements
|
|
32
|
-
|
|
33
|
-
- Node.js >= 20.9.0
|
|
34
|
-
- Bun >= 1.3.0 (optional - only needed for development / building from source)
|
|
35
|
-
|
|
36
|
-
---
|
|
37
|
-
|
|
38
|
-
## Install
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
npm install -g failproofai
|
|
42
|
-
# or
|
|
43
|
-
bun add -g failproofai
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## Quick start
|
|
49
|
-
|
|
50
|
-
### 1. Enable policies globally
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
failproofai policies --install
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
Writes hook entries into `~/.claude/settings.json`. Claude Code will now invoke failproofai before and after each tool call.
|
|
57
|
-
|
|
58
|
-
### 2. Launch the dashboard
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
failproofai
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Opens `http://localhost:8020` - browse sessions, inspect logs, manage policies.
|
|
65
|
-
|
|
66
|
-
### 3. Check what's active
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
failproofai policies
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## Policy installation
|
|
75
|
-
|
|
76
|
-
### Scopes
|
|
77
|
-
|
|
78
|
-
| Scope | Command | Where it writes |
|
|
79
|
-
|-------|---------|-----------------|
|
|
80
|
-
| Global (default) | `failproofai policies --install` | `~/.claude/settings.json` |
|
|
81
|
-
| Project | `failproofai policies --install --scope project` | `.claude/settings.json` |
|
|
82
|
-
| Local | `failproofai policies --install --scope local` | `.claude/settings.local.json` |
|
|
83
|
-
|
|
84
|
-
### Install specific policies
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
failproofai policies --install block-sudo block-rm-rf sanitize-api-keys
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
### Remove policies
|
|
91
|
-
|
|
92
|
-
```bash
|
|
93
|
-
failproofai policies --uninstall
|
|
94
|
-
# or for a specific scope:
|
|
95
|
-
failproofai policies --uninstall --scope project
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
## Configuration
|
|
101
|
-
|
|
102
|
-
Policy configuration lives in `~/.failproofai/policies-config.json` (global) or `.failproofai/policies-config.json` in your project (per-project).
|
|
103
|
-
|
|
104
|
-
```json
|
|
105
|
-
{
|
|
106
|
-
"enabledPolicies": [
|
|
107
|
-
"block-sudo",
|
|
108
|
-
"block-rm-rf",
|
|
109
|
-
"sanitize-api-keys",
|
|
110
|
-
"block-push-master",
|
|
111
|
-
"block-env-files",
|
|
112
|
-
"block-read-outside-cwd"
|
|
113
|
-
],
|
|
114
|
-
"policyParams": {
|
|
115
|
-
"block-sudo": {
|
|
116
|
-
"allowPatterns": ["sudo systemctl status", "sudo journalctl"],
|
|
117
|
-
"hint": "Use apt-get directly without sudo."
|
|
118
|
-
},
|
|
119
|
-
"block-push-master": {
|
|
120
|
-
"protectedBranches": ["main", "release", "prod"],
|
|
121
|
-
"hint": "Try creating a fresh branch instead."
|
|
122
|
-
},
|
|
123
|
-
"sanitize-api-keys": {
|
|
124
|
-
"additionalPatterns": [
|
|
125
|
-
{ "regex": "myco_[A-Za-z0-9]{32}", "label": "MyCo API key" }
|
|
126
|
-
]
|
|
127
|
-
},
|
|
128
|
-
"warn-large-file-write": {
|
|
129
|
-
"thresholdKb": 512
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
**Three config scopes** are merged automatically (project → local → global). See [docs/configuration.mdx](docs/configuration.mdx) for full merge rules.
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
## Built-in policies
|
|
140
|
-
|
|
141
|
-
| Policy | Description | Configurable |
|
|
142
|
-
|--------|-------------|:---:|
|
|
143
|
-
| `block-sudo` | Prevent agents from running privileged system commands | `allowPatterns` |
|
|
144
|
-
| `block-rm-rf` | Prevent accidental recursive file deletion | `allowPaths` |
|
|
145
|
-
| `block-curl-pipe-sh` | Prevent agents from piping untrusted scripts to shell | |
|
|
146
|
-
| `block-failproofai-commands` | Prevent self-uninstallation | |
|
|
147
|
-
| `sanitize-jwt` | Stop JWT tokens from leaking into agent context | |
|
|
148
|
-
| `sanitize-api-keys` | Stop API keys from leaking into agent context | `additionalPatterns` |
|
|
149
|
-
| `sanitize-connection-strings` | Stop database credentials from leaking into agent context | |
|
|
150
|
-
| `sanitize-private-key-content` | Redact PEM private key blocks from output | |
|
|
151
|
-
| `sanitize-bearer-tokens` | Redact Authorization Bearer tokens from output | |
|
|
152
|
-
| `block-env-files` | Keep agents from reading .env files | |
|
|
153
|
-
| `protect-env-vars` | Prevent agents from printing environment variables | |
|
|
154
|
-
| `block-read-outside-cwd` | Keep agents inside project boundaries | `allowPaths` |
|
|
155
|
-
| `block-secrets-write` | Prevent writes to private key and certificate files | `additionalPatterns` |
|
|
156
|
-
| `block-push-master` | Prevent accidental pushes to main/master | `protectedBranches` |
|
|
157
|
-
| `block-work-on-main` | Keep agents off protected branches | `protectedBranches` |
|
|
158
|
-
| `block-force-push` | Prevent `git push --force` | |
|
|
159
|
-
| `warn-git-amend` | Remind agents before amending commits | |
|
|
160
|
-
| `warn-git-stash-drop` | Remind agents before dropping stashes | |
|
|
161
|
-
| `warn-all-files-staged` | Catch accidental `git add -A` | |
|
|
162
|
-
| `warn-destructive-sql` | Catch DROP/DELETE SQL before execution | |
|
|
163
|
-
| `warn-schema-alteration` | Catch ALTER TABLE before execution | |
|
|
164
|
-
| `warn-large-file-write` | Catch unexpectedly large file writes | `thresholdKb` |
|
|
165
|
-
| `warn-package-publish` | Catch accidental `npm publish` | |
|
|
166
|
-
| `warn-background-process` | Catch unintended background process launches | |
|
|
167
|
-
| `warn-global-package-install` | Catch unintended global package installs | |
|
|
168
|
-
| …and more | | |
|
|
169
|
-
|
|
170
|
-
Full policy details and parameter reference: [docs/built-in-policies.mdx](docs/built-in-policies.mdx)
|
|
171
|
-
|
|
172
|
-
---
|
|
173
|
-
|
|
174
|
-
## Custom policies
|
|
175
|
-
|
|
176
|
-
Write your own policies to keep agents reliable and on-task:
|
|
177
|
-
|
|
178
|
-
```js
|
|
179
|
-
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
180
|
-
|
|
181
|
-
customPolicies.add({
|
|
182
|
-
name: "no-production-writes",
|
|
183
|
-
description: "Block writes to paths containing 'production'",
|
|
184
|
-
match: { events: ["PreToolUse"] },
|
|
185
|
-
fn: async (ctx) => {
|
|
186
|
-
if (!["Write", "Edit"].includes(ctx.toolName ?? "")) return allow();
|
|
187
|
-
const path = ctx.toolInput?.file_path ?? "";
|
|
188
|
-
if (path.includes("production")) return deny("Writes to production paths are blocked");
|
|
189
|
-
return allow();
|
|
190
|
-
},
|
|
191
|
-
});
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
Install with:
|
|
195
|
-
|
|
196
|
-
```bash
|
|
197
|
-
failproofai policies --install --custom ./my-policies.js
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
### Decision helpers
|
|
201
|
-
|
|
202
|
-
| Function | Effect |
|
|
203
|
-
|----------|--------|
|
|
204
|
-
| `allow()` | Permit the operation |
|
|
205
|
-
| `allow(message)` | Permit and send informational context to Claude |
|
|
206
|
-
| `deny(message)` | Block the operation; message shown to Claude |
|
|
207
|
-
| `instruct(message)` | Add context to Claude's prompt; does not block |
|
|
208
|
-
|
|
209
|
-
### Context object (`ctx`)
|
|
210
|
-
|
|
211
|
-
| Field | Type | Description |
|
|
212
|
-
|-------|------|-------------|
|
|
213
|
-
| `eventType` | `string` | `"PreToolUse"`, `"PostToolUse"`, `"Notification"`, `"Stop"` |
|
|
214
|
-
| `toolName` | `string` | Tool being called (`"Bash"`, `"Write"`, `"Read"`, …) |
|
|
215
|
-
| `toolInput` | `object` | Tool's input parameters |
|
|
216
|
-
| `payload` | `object` | Full raw event payload |
|
|
217
|
-
| `session.cwd` | `string` | Working directory of the Claude Code session |
|
|
218
|
-
| `session.sessionId` | `string` | Session identifier |
|
|
219
|
-
| `session.transcriptPath` | `string` | Path to the session transcript file |
|
|
220
|
-
|
|
221
|
-
Custom hooks support transitive local imports, async/await, and access to `process.env`. Errors are fail-open (logged to `~/.failproofai/hook.log`, built-in policies continue). See [docs/custom-hooks.mdx](docs/custom-hooks.mdx) for the full guide.
|
|
222
|
-
|
|
223
|
-
### Convention-based policies
|
|
224
|
-
|
|
225
|
-
Drop `*policies.{js,mjs,ts}` files into `.failproofai/policies/` and they're automatically loaded — no flags or config changes needed. Commit the directory to git and every team member gets the same quality standards automatically.
|
|
226
|
-
|
|
227
|
-
```text
|
|
228
|
-
# Project level — committed to git, shared with the team
|
|
229
|
-
.failproofai/policies/security-policies.mjs
|
|
230
|
-
.failproofai/policies/workflow-policies.mjs
|
|
231
|
-
|
|
232
|
-
# User level — personal, applies to all projects
|
|
233
|
-
~/.failproofai/policies/my-policies.mjs
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
Both levels load (union). Files are loaded alphabetically within each directory. Prefix with `01-`, `02-`, etc. to control order. As your team discovers new failure modes, add a policy and push — everyone gets the update on their next pull. See [examples/convention-policies/](examples/convention-policies/) for ready-to-use examples.
|
|
237
|
-
|
|
238
|
-
---
|
|
239
|
-
|
|
240
|
-
## Telemetry
|
|
241
|
-
|
|
242
|
-
Failproof AI collects anonymous usage telemetry via PostHog to understand feature usage. No session content, file names, tool inputs, or personal information is ever sent.
|
|
243
|
-
|
|
244
|
-
Disable it:
|
|
245
|
-
|
|
246
|
-
```bash
|
|
247
|
-
FAILPROOFAI_TELEMETRY_DISABLED=1 failproofai
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
---
|
|
251
|
-
|
|
252
|
-
## Documentation
|
|
253
|
-
|
|
254
|
-
| Guide | Description |
|
|
255
|
-
|-------|-------------|
|
|
256
|
-
| [Getting Started](docs/getting-started.mdx) | Installation and first steps |
|
|
257
|
-
| [Built-in Policies](docs/built-in-policies.mdx) | All 30 built-in policies with parameters |
|
|
258
|
-
| [Custom Policies](docs/custom-policies.mdx) | Write your own policies |
|
|
259
|
-
| [Configuration](docs/configuration.mdx) | Config file format and scope merging |
|
|
260
|
-
| [Dashboard](docs/dashboard.mdx) | Monitor sessions and review policy activity |
|
|
261
|
-
| [Architecture](docs/architecture.mdx) | How the hook system works |
|
|
262
|
-
| [Testing](docs/testing.mdx) | Running tests and writing new ones |
|
|
263
|
-
|
|
264
|
-
### Run docs locally
|
|
265
|
-
|
|
266
|
-
```bash
|
|
267
|
-
docker build -f Dockerfile.docs -t failproofai-docs .
|
|
268
|
-
docker run --rm -p 3000:3000 failproofai-docs
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
Opens the Mintlify docs site at `http://localhost:3000`. The container watches for changes if you mount the docs directory:
|
|
272
|
-
|
|
273
|
-
```bash
|
|
274
|
-
docker run --rm -p 3000:3000 -v $(pwd)/docs:/app/docs failproofai-docs
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
---
|
|
278
|
-
|
|
279
|
-
## Note for failproofai contributors
|
|
280
|
-
|
|
281
|
-
This repo's `.claude/settings.json` uses `bun ./bin/failproofai.mjs --hook <EventType>` instead of the standard `npx -y failproofai` command. This is because running `npx -y failproofai` inside the failproofai project itself creates a self-referencing conflict.
|
|
282
|
-
|
|
283
|
-
For all other repos, the recommended approach is `npx -y failproofai`, installed via:
|
|
284
|
-
|
|
285
|
-
```bash
|
|
286
|
-
failproofai policies --install --scope project
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
## Contributing
|
|
290
|
-
|
|
291
|
-
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
292
|
-
|
|
293
|
-
---
|
|
294
|
-
|
|
295
|
-
## License
|
|
296
|
-
|
|
297
|
-
See [LICENSE](LICENSE).
|
|
298
|
-
|
|
299
|
-
---
|
|
300
|
-
|
|
301
|
-
Built and Maintained by **ExosphereHost: Reliability Research Lab for Your Agents**. We help enterprises and startups improve the reliability of their AI agents through our own agents, software, and expertise. Learn more at [exosphere.host](https://exosphere.host).
|
|
@@ -1,352 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
/**
|
|
3
|
-
* failproofai — main entry point.
|
|
4
|
-
*
|
|
5
|
-
* Handles:
|
|
6
|
-
* --hook <event> Hook event from Claude Code (minimal startup latency)
|
|
7
|
-
* --version / -v Print version and exit
|
|
8
|
-
* --help / -h Show usage and exit
|
|
9
|
-
* policies Manage policies (list / install / uninstall)
|
|
10
|
-
* (default) Launch production dashboard
|
|
11
|
-
*/
|
|
12
|
-
import { realpathSync } from "node:fs";
|
|
13
|
-
import { dirname, resolve } from "node:path";
|
|
14
|
-
import { fileURLToPath } from "node:url";
|
|
15
|
-
import { version } from "../package.json";
|
|
16
|
-
|
|
17
|
-
// Resolve the real package root early (following any npm bin symlinks) so that
|
|
18
|
-
// scripts/launch.ts can locate .next/standalone/server.js correctly regardless
|
|
19
|
-
// of how bun resolves import.meta.url for dynamically-imported modules.
|
|
20
|
-
if (!process.env.FAILPROOFAI_PACKAGE_ROOT) {
|
|
21
|
-
process.env.FAILPROOFAI_PACKAGE_ROOT = resolve(
|
|
22
|
-
dirname(realpathSync(fileURLToPath(import.meta.url))),
|
|
23
|
-
".."
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
if (!process.env.FAILPROOFAI_DIST_PATH) {
|
|
28
|
-
process.env.FAILPROOFAI_DIST_PATH = resolve(
|
|
29
|
-
dirname(realpathSync(fileURLToPath(import.meta.url))),
|
|
30
|
-
"..",
|
|
31
|
-
"dist"
|
|
32
|
-
);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const args = process.argv.slice(2);
|
|
36
|
-
|
|
37
|
-
// Normalize 'p' → 'policies' (shorthand alias)
|
|
38
|
-
if (args[0] === "p") args[0] = "policies";
|
|
39
|
-
|
|
40
|
-
// --hook <event> — called by Claude Code hooks; fast path, outside runCli()
|
|
41
|
-
// because it has its own exit code contract with Claude Code.
|
|
42
|
-
const hookIdx = args.indexOf("--hook");
|
|
43
|
-
if (hookIdx >= 0) {
|
|
44
|
-
if (!args[hookIdx + 1]) {
|
|
45
|
-
console.error("Error: Missing event type after --hook");
|
|
46
|
-
console.error("Usage: failproofai --hook <event> (e.g. PreToolUse, PostToolUse)");
|
|
47
|
-
process.exit(1);
|
|
48
|
-
}
|
|
49
|
-
try {
|
|
50
|
-
const { handleHookEvent } = await import("../src/hooks/handler");
|
|
51
|
-
const exitCode = await handleHookEvent(args[hookIdx + 1]);
|
|
52
|
-
process.exit(exitCode);
|
|
53
|
-
} catch (err) {
|
|
54
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
55
|
-
console.error(`Unexpected error: ${msg}`);
|
|
56
|
-
process.exit(2);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Centralised error handler for all CLI subcommands.
|
|
62
|
-
* CliError → clean message, no stack trace, exit exitCode (1 or 2)
|
|
63
|
-
* Error → unexpected; shows message only, exits 2
|
|
64
|
-
*/
|
|
65
|
-
async function runCli() {
|
|
66
|
-
// --help / -h (only when not inside a subcommand that handles its own --help)
|
|
67
|
-
const SUBCOMMANDS = ["policies"];
|
|
68
|
-
if ((args.includes("--help") || args.includes("-h")) && !SUBCOMMANDS.includes(args[0])) {
|
|
69
|
-
const extraArgs = args.filter((a) => a !== "--help" && a !== "-h");
|
|
70
|
-
if (extraArgs.length > 0) {
|
|
71
|
-
throw new CliError(`Unexpected argument: ${extraArgs[0]}\nRun \`failproofai --help\` for usage.`);
|
|
72
|
-
}
|
|
73
|
-
console.log(`
|
|
74
|
-
failproofai v${version}
|
|
75
|
-
|
|
76
|
-
USAGE
|
|
77
|
-
failproofai [command] [options]
|
|
78
|
-
|
|
79
|
-
COMMANDS
|
|
80
|
-
(no args) Launch the policy dashboard
|
|
81
|
-
|
|
82
|
-
policies, p List all available policies and their status
|
|
83
|
-
policies --install, -i Enable policies in Claude Code settings
|
|
84
|
-
[names...] Specific policy names to enable
|
|
85
|
-
--scope user|project|local Config scope to write to (default: user)
|
|
86
|
-
--beta Include beta policies
|
|
87
|
-
--custom, -c <path> Path to a JS file of custom policies
|
|
88
|
-
|
|
89
|
-
policies --uninstall, -u Disable policies or remove hooks
|
|
90
|
-
[names...] Specific policy names to disable
|
|
91
|
-
--scope user|project|local|all Config scope to remove from (default: user)
|
|
92
|
-
--beta Remove only beta policies
|
|
93
|
-
--custom, -c Clear the customPoliciesPath from config
|
|
94
|
-
|
|
95
|
-
policies --help, -h Show this help for the policies command
|
|
96
|
-
|
|
97
|
-
--version, -v Print version and exit
|
|
98
|
-
--help, -h Show this help message
|
|
99
|
-
|
|
100
|
-
CONVENTION POLICIES
|
|
101
|
-
Drop *policies.{js,mjs,ts} files into .failproofai/policies/ for auto-loading.
|
|
102
|
-
Works at project level (.failproofai/policies/) and user level (~/.failproofai/policies/).
|
|
103
|
-
No --custom flag or config changes needed — just drop files and they're picked up.
|
|
104
|
-
|
|
105
|
-
EXAMPLES
|
|
106
|
-
failproofai policies
|
|
107
|
-
failproofai policies --install
|
|
108
|
-
failproofai policies --install block-sudo sanitize-api-keys --scope project
|
|
109
|
-
failproofai policies --install --custom ./my-policies.js
|
|
110
|
-
failproofai policies -i -c ./my-policies.js
|
|
111
|
-
failproofai policies --uninstall block-sudo
|
|
112
|
-
failproofai policies --uninstall --custom
|
|
113
|
-
|
|
114
|
-
LINKS
|
|
115
|
-
⭐ Star us: https://github.com/exospherehost/failproofai
|
|
116
|
-
📖 Docs: https://befailproof.ai
|
|
117
|
-
`.trimStart());
|
|
118
|
-
process.exit(0);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// --version / -v
|
|
122
|
-
if ((args.includes("--version") || args.includes("-v")) && !SUBCOMMANDS.includes(args[0])) {
|
|
123
|
-
const extraArgs = args.filter((a) => a !== "--version" && a !== "-v");
|
|
124
|
-
if (extraArgs.length > 0) {
|
|
125
|
-
throw new CliError(`Unexpected argument: ${extraArgs[0]}\nRun \`failproofai --help\` for usage.`);
|
|
126
|
-
}
|
|
127
|
-
console.log(version);
|
|
128
|
-
process.exit(0);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// policies [--install|-i|--uninstall|-u|--help|-h] [names...] [--scope] [--beta] [--custom|-c <path>]
|
|
132
|
-
if (args[0] === "policies") {
|
|
133
|
-
const subArgs = args.slice(1);
|
|
134
|
-
|
|
135
|
-
const isInstall = subArgs.includes("--install") || subArgs.includes("-i");
|
|
136
|
-
const isUninstall = subArgs.includes("--uninstall") || subArgs.includes("-u");
|
|
137
|
-
const isHelp = subArgs.includes("--help") || subArgs.includes("-h");
|
|
138
|
-
|
|
139
|
-
if (isHelp) {
|
|
140
|
-
console.log(`
|
|
141
|
-
failproofai policies — manage Failproof AI policies
|
|
142
|
-
|
|
143
|
-
USAGE
|
|
144
|
-
failproofai policies List all policies and their status
|
|
145
|
-
failproofai policies --install, -i Enable policies
|
|
146
|
-
failproofai policies --uninstall, -u Disable policies or remove hooks
|
|
147
|
-
|
|
148
|
-
OPTIONS (install)
|
|
149
|
-
[names...] Specific policy names to enable (omit for interactive)
|
|
150
|
-
--scope user|project|local Config scope to write to (default: user)
|
|
151
|
-
--beta Include beta policies
|
|
152
|
-
--custom, -c <path> Path to a JS file of custom policies
|
|
153
|
-
(skips interactive prompt; validates file first)
|
|
154
|
-
|
|
155
|
-
OPTIONS (uninstall)
|
|
156
|
-
[names...] Specific policy names to disable (omit to remove hooks)
|
|
157
|
-
--scope user|project|local|all Config scope to remove from (default: user)
|
|
158
|
-
--beta Remove only beta policies
|
|
159
|
-
--custom, -c Clear the customPoliciesPath from config
|
|
160
|
-
|
|
161
|
-
EXAMPLES
|
|
162
|
-
failproofai policies
|
|
163
|
-
failproofai policies --install
|
|
164
|
-
failproofai policies --install block-sudo sanitize-api-keys
|
|
165
|
-
failproofai policies --install --custom ./my-policies.js
|
|
166
|
-
failproofai policies -i -c ./my-policies.js
|
|
167
|
-
failproofai policies --uninstall block-sudo
|
|
168
|
-
failproofai policies -u
|
|
169
|
-
failproofai policies --uninstall --custom
|
|
170
|
-
`.trimStart());
|
|
171
|
-
process.exit(0);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
if (isInstall) {
|
|
175
|
-
const { installHooks } = await import("../src/hooks/manager");
|
|
176
|
-
|
|
177
|
-
const scopeIdx = subArgs.indexOf("--scope");
|
|
178
|
-
const scope = scopeIdx >= 0 ? subArgs[scopeIdx + 1] : "user";
|
|
179
|
-
if (scopeIdx >= 0 && (!scope || scope.startsWith("-"))) {
|
|
180
|
-
throw new CliError("Missing value for --scope. Valid values: user, project, local");
|
|
181
|
-
}
|
|
182
|
-
if (scopeIdx >= 0 && !["user", "project", "local"].includes(scope)) {
|
|
183
|
-
throw new CliError(`Invalid scope: ${scope}. Valid values: user, project, local`);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
const customIdx = subArgs.includes("--custom") ? subArgs.indexOf("--custom")
|
|
187
|
-
: subArgs.includes("-c") ? subArgs.indexOf("-c")
|
|
188
|
-
: -1;
|
|
189
|
-
const customPoliciesPath = customIdx >= 0 ? subArgs[customIdx + 1] : undefined;
|
|
190
|
-
if (customIdx >= 0 && (!customPoliciesPath || customPoliciesPath.startsWith("-"))) {
|
|
191
|
-
throw new CliError("Missing path after --custom/-c\nUsage: --custom <path> (e.g. --custom ./my-policies.js)");
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
const includeBeta = subArgs.includes("--beta");
|
|
195
|
-
|
|
196
|
-
// Collect positional policy names — args that don't start with - and aren't
|
|
197
|
-
// values consumed by --scope or --custom/-c (tracked by index, not value,
|
|
198
|
-
// so a policy named "user" isn't incorrectly dropped by the default scope).
|
|
199
|
-
const consumedIdxs = new Set();
|
|
200
|
-
if (scopeIdx >= 0) consumedIdxs.add(scopeIdx + 1);
|
|
201
|
-
if (customIdx >= 0) consumedIdxs.add(customIdx + 1);
|
|
202
|
-
const flags = new Set(["--install", "-i", "--scope", "--beta", "--custom", "-c"]);
|
|
203
|
-
const unknownInstallFlag = subArgs.find((a) => a.startsWith("-") && !flags.has(a));
|
|
204
|
-
if (unknownInstallFlag) {
|
|
205
|
-
throw new CliError(`Unknown flag: ${unknownInstallFlag}\nRun \`failproofai policies --help\` for usage.`);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
const explicitPolicyNames = subArgs.filter(
|
|
209
|
-
(a, idx) => !a.startsWith("-") && !consumedIdxs.has(idx)
|
|
210
|
-
);
|
|
211
|
-
|
|
212
|
-
// When --custom/-c is present but no explicit policy names, pass [] so
|
|
213
|
-
// installHooks uses the existing enabled policies and skips the interactive
|
|
214
|
-
// prompt — validation of the custom file happens inside installHooks.
|
|
215
|
-
const policyNames =
|
|
216
|
-
explicitPolicyNames.length > 0 ? explicitPolicyNames
|
|
217
|
-
: customPoliciesPath !== undefined ? []
|
|
218
|
-
: undefined;
|
|
219
|
-
|
|
220
|
-
await installHooks(
|
|
221
|
-
policyNames,
|
|
222
|
-
scope,
|
|
223
|
-
undefined,
|
|
224
|
-
includeBeta,
|
|
225
|
-
undefined,
|
|
226
|
-
customPoliciesPath,
|
|
227
|
-
);
|
|
228
|
-
process.exit(0);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
if (isUninstall) {
|
|
232
|
-
const { removeHooks } = await import("../src/hooks/manager");
|
|
233
|
-
|
|
234
|
-
const scopeIdx = subArgs.indexOf("--scope");
|
|
235
|
-
const scope = scopeIdx >= 0 ? subArgs[scopeIdx + 1] : "user";
|
|
236
|
-
if (scopeIdx >= 0 && (!scope || scope.startsWith("-"))) {
|
|
237
|
-
throw new CliError("Missing value for --scope. Valid values: user, project, local, all");
|
|
238
|
-
}
|
|
239
|
-
if (scopeIdx >= 0 && !["user", "project", "local", "all"].includes(scope)) {
|
|
240
|
-
throw new CliError(`Invalid scope: ${scope}. Valid values: user, project, local, all`);
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
const betaOnly = subArgs.includes("--beta");
|
|
244
|
-
const removeCustomHooks = subArgs.includes("--custom") || subArgs.includes("-c");
|
|
245
|
-
|
|
246
|
-
const consumedIdxs = new Set();
|
|
247
|
-
if (scopeIdx >= 0) consumedIdxs.add(scopeIdx + 1);
|
|
248
|
-
const flags = new Set(["--uninstall", "-u", "--scope", "--beta", "--custom", "-c"]);
|
|
249
|
-
const unknownUninstallFlag = subArgs.find((a) => a.startsWith("-") && !flags.has(a));
|
|
250
|
-
if (unknownUninstallFlag) {
|
|
251
|
-
throw new CliError(`Unknown flag: ${unknownUninstallFlag}\nRun \`failproofai policies --help\` for usage.`);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
const policyNames = subArgs.filter(
|
|
255
|
-
(a, idx) => !a.startsWith("-") && !consumedIdxs.has(idx)
|
|
256
|
-
);
|
|
257
|
-
|
|
258
|
-
await removeHooks(
|
|
259
|
-
policyNames.length > 0 ? policyNames : undefined,
|
|
260
|
-
scope,
|
|
261
|
-
undefined,
|
|
262
|
-
{ betaOnly, removeCustomHooks },
|
|
263
|
-
);
|
|
264
|
-
process.exit(0);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// Default: list policies
|
|
268
|
-
// Accept --list as a no-op alias (common intuition), reject all other unknown flags
|
|
269
|
-
// and unexpected positional args (e.g. "hi").
|
|
270
|
-
const knownListFlags = new Set(["--install", "-i", "--uninstall", "-u", "--help", "-h", "--list"]);
|
|
271
|
-
const unknownListArg = subArgs.find((a) => a.startsWith("-") && !knownListFlags.has(a));
|
|
272
|
-
if (unknownListArg) {
|
|
273
|
-
throw new CliError(
|
|
274
|
-
`Unknown flag: ${unknownListArg}\n` +
|
|
275
|
-
`Run \`failproofai policies --help\` for usage.`
|
|
276
|
-
);
|
|
277
|
-
}
|
|
278
|
-
const positionalArgs = subArgs.filter((a) => !a.startsWith("-"));
|
|
279
|
-
if (positionalArgs.length > 0) {
|
|
280
|
-
throw new CliError(
|
|
281
|
-
`Unexpected argument: ${positionalArgs[0]}\n` +
|
|
282
|
-
`Run \`failproofai policies --help\` for usage.`
|
|
283
|
-
);
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
const { listHooks } = await import("../src/hooks/manager");
|
|
287
|
-
await listHooks();
|
|
288
|
-
process.exit(0);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
// Unknown flag guard — must appear after all known-flag branches
|
|
292
|
-
const knownFlags = ["--version", "-v", "--help", "-h", "--hook"];
|
|
293
|
-
const unknownFlag = args.find(a => a.startsWith("-") && !knownFlags.includes(a));
|
|
294
|
-
|
|
295
|
-
if (unknownFlag) {
|
|
296
|
-
function levenshtein(a, b) {
|
|
297
|
-
const m = a.length, n = b.length;
|
|
298
|
-
const dp = Array.from({ length: m + 1 }, (_, i) =>
|
|
299
|
-
Array.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0))
|
|
300
|
-
);
|
|
301
|
-
for (let i = 1; i <= m; i++)
|
|
302
|
-
for (let j = 1; j <= n; j++)
|
|
303
|
-
dp[i][j] = a[i - 1] === b[j - 1]
|
|
304
|
-
? dp[i - 1][j - 1]
|
|
305
|
-
: 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
|
|
306
|
-
return dp[m][n];
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
const primary = ["--version", "--help", "--hook", "policies"];
|
|
310
|
-
const closest = primary.reduce((best, flag) => {
|
|
311
|
-
const dist = levenshtein(unknownFlag, flag);
|
|
312
|
-
return dist < best.dist ? { flag, dist } : best;
|
|
313
|
-
}, { flag: primary[0], dist: Infinity });
|
|
314
|
-
|
|
315
|
-
throw new CliError(
|
|
316
|
-
`Unknown flag: ${unknownFlag}\n` +
|
|
317
|
-
`Did you mean: ${closest.flag}?\n` +
|
|
318
|
-
`Run \`failproofai --help\` for usage details.`
|
|
319
|
-
);
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
// Unknown subcommand guard (non-flag args that aren't "policies")
|
|
323
|
-
const unknownSubcommand = args.find(a => !a.startsWith("-") && a !== "policies");
|
|
324
|
-
if (unknownSubcommand) {
|
|
325
|
-
throw new CliError(
|
|
326
|
-
`Unknown command: ${unknownSubcommand}\n` +
|
|
327
|
-
`Did you mean: failproofai policies?\n` +
|
|
328
|
-
`Run \`failproofai --help\` for usage details.`
|
|
329
|
-
);
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
// Dashboard launch — always production mode
|
|
333
|
-
const { launch } = await import("../scripts/launch");
|
|
334
|
-
launch("start");
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
// ── Import CliError for use in the guard above ────────────────────────────────
|
|
338
|
-
const { CliError } = await import("../src/cli-error");
|
|
339
|
-
|
|
340
|
-
// ── Run ───────────────────────────────────────────────────────────────────────
|
|
341
|
-
try {
|
|
342
|
-
await runCli();
|
|
343
|
-
} catch (err) {
|
|
344
|
-
if (err instanceof CliError) {
|
|
345
|
-
console.error(`Error: ${err.message}`);
|
|
346
|
-
process.exit(err.exitCode);
|
|
347
|
-
}
|
|
348
|
-
// Unexpected internal error — show message only, no stack trace
|
|
349
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
350
|
-
console.error(`Unexpected error: ${msg}`);
|
|
351
|
-
process.exit(2);
|
|
352
|
-
}
|