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,261 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
---
|
|
3
|
-
title: الاختبارات
|
|
4
|
-
description: "اختبارات الوحدات واختبارات الشامل (E2E) ومساعدات الاختبارات"
|
|
5
|
-
icon: flask-vial
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
يتضمن failproofai مجموعتي اختبارات: **اختبارات الوحدات** (سريعة، محاكاة) و**اختبارات الشامل** (استدعاءات عملية فرعية حقيقية).
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## تشغيل الاختبارات
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
# تشغيل جميع اختبارات الوحدات مرة واحدة
|
|
16
|
-
bun run test:run
|
|
17
|
-
|
|
18
|
-
# تشغيل اختبارات الوحدات في وضع المراقبة
|
|
19
|
-
bun run test
|
|
20
|
-
|
|
21
|
-
# تشغيل اختبارات الشامل (يتطلب إعدادًا - انظر أدناه)
|
|
22
|
-
bun run test:e2e
|
|
23
|
-
|
|
24
|
-
# فحص النوع بدون بناء
|
|
25
|
-
bunx tsc --noEmit
|
|
26
|
-
|
|
27
|
-
# فحص الكود
|
|
28
|
-
bun run lint
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## اختبارات الوحدات
|
|
34
|
-
|
|
35
|
-
تقع اختبارات الوحدات في `__tests__/` وتستخدم [Vitest](https://vitest.dev) مع `happy-dom`.
|
|
36
|
-
|
|
37
|
-
```text
|
|
38
|
-
__tests__/
|
|
39
|
-
hooks/
|
|
40
|
-
builtin-policies.test.ts # منطق السياسة لكل سياسة مدمجة
|
|
41
|
-
hooks-config.test.ts # تحميل الإعدادات ودمج النطاق
|
|
42
|
-
policy-evaluator.test.ts # حقن المعاملات وترتيب التقييم
|
|
43
|
-
custom-hooks-registry.test.ts # سجل globalThis للإضافة والحصول والمسح
|
|
44
|
-
custom-hooks-loader.test.ts # محمل ESM والاستيرادات المتعدية ومعالجة الأخطاء
|
|
45
|
-
manager.test.ts # عمليات التثبيت والإزالة والقائمة
|
|
46
|
-
components/
|
|
47
|
-
sessions-list.test.tsx # مكون قائمة الجلسات
|
|
48
|
-
project-list.test.tsx # مكون قائمة المشاريع
|
|
49
|
-
...
|
|
50
|
-
lib/
|
|
51
|
-
logger.test.ts
|
|
52
|
-
paths.test.ts
|
|
53
|
-
date-filters.test.ts
|
|
54
|
-
telemetry.test.ts
|
|
55
|
-
...
|
|
56
|
-
actions/
|
|
57
|
-
get-hooks-config.test.ts
|
|
58
|
-
get-hook-activity.test.ts
|
|
59
|
-
...
|
|
60
|
-
contexts/
|
|
61
|
-
ThemeContext.test.tsx
|
|
62
|
-
AutoRefreshContext.test.tsx
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### كتابة اختبار وحدة للسياسة
|
|
66
|
-
|
|
67
|
-
```typescript
|
|
68
|
-
import { describe, it, expect, beforeEach } from "vitest";
|
|
69
|
-
import { getBuiltinPolicies } from "../../src/hooks/builtin-policies";
|
|
70
|
-
import { allow, deny } from "../../src/hooks/policy-types";
|
|
71
|
-
|
|
72
|
-
describe("block-sudo", () => {
|
|
73
|
-
const policy = getBuiltinPolicies().find((p) => p.name === "block-sudo")!;
|
|
74
|
-
|
|
75
|
-
it("denies sudo commands", () => {
|
|
76
|
-
const ctx = {
|
|
77
|
-
eventType: "PreToolUse" as const,
|
|
78
|
-
payload: {},
|
|
79
|
-
toolName: "Bash",
|
|
80
|
-
toolInput: { command: "sudo apt install nodejs" },
|
|
81
|
-
params: { allowPatterns: [] },
|
|
82
|
-
};
|
|
83
|
-
expect(policy.fn(ctx)).toEqual(deny("sudo command blocked by failproofai"));
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it("allows non-sudo commands", () => {
|
|
87
|
-
const ctx = {
|
|
88
|
-
eventType: "PreToolUse" as const,
|
|
89
|
-
payload: {},
|
|
90
|
-
toolName: "Bash",
|
|
91
|
-
toolInput: { command: "ls -la" },
|
|
92
|
-
params: { allowPatterns: [] },
|
|
93
|
-
};
|
|
94
|
-
expect(policy.fn(ctx)).toEqual(allow());
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it("allows patterns in allowPatterns", () => {
|
|
98
|
-
const ctx = {
|
|
99
|
-
eventType: "PreToolUse" as const,
|
|
100
|
-
payload: {},
|
|
101
|
-
toolName: "Bash",
|
|
102
|
-
toolInput: { command: "sudo systemctl status nginx" },
|
|
103
|
-
params: { allowPatterns: ["sudo systemctl status"] },
|
|
104
|
-
};
|
|
105
|
-
expect(policy.fn(ctx)).toEqual(allow());
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
## اختبارات الشامل (E2E)
|
|
113
|
-
|
|
114
|
-
تستدعي اختبارات الشامل ملف failproofai الثنائي الفعلي كعملية فرعية، وترسل حمولة JSON إلى stdin، وتتحقق من مخرجات stdout وكود الخروج. يختبر هذا مسار التكامل الكامل الذي يستخدمه Claude Code.
|
|
115
|
-
|
|
116
|
-
### الإعداد
|
|
117
|
-
|
|
118
|
-
تشغل اختبارات الشامل الملف الثنائي مباشرة من مصدر المستودع. قبل التشغيل الأول، قم بناء حزمة CJS التي تستخدمها ملفات hook المخصصة عند الاستيراد من `'failproofai'`:
|
|
119
|
-
|
|
120
|
-
```bash
|
|
121
|
-
bun build src/index.ts --outdir dist --target node --format cjs
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
ثم قم بتشغيل الاختبارات:
|
|
125
|
-
|
|
126
|
-
```bash
|
|
127
|
-
bun run test:e2e
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
أعد بناء `dist/` في أي وقت تغير فيه API hook العام (`src/hooks/custom-hooks-registry.ts` أو `src/hooks/policy-helpers.ts` أو `src/hooks/policy-types.ts`).
|
|
131
|
-
|
|
132
|
-
### هيكل اختبار الشامل
|
|
133
|
-
|
|
134
|
-
```text
|
|
135
|
-
__tests__/e2e/
|
|
136
|
-
helpers/
|
|
137
|
-
hook-runner.ts # تشغيل الملف الثنائي وإرسال حمولة JSON والتقاط كود الخروج والمخرجات والأخطاء
|
|
138
|
-
fixture-env.ts # دليل مؤقت معزول لكل اختبار مع ملفات الإعدادات
|
|
139
|
-
payloads.ts # مصانع الحمولة الدقيقة لـ Claude لكل نوع حدث
|
|
140
|
-
hooks/
|
|
141
|
-
builtin-policies.e2e.test.ts # كل سياسة مدمجة مع عملية فرعية حقيقية
|
|
142
|
-
custom-hooks.e2e.test.ts # تحميل وتقييم hook المخصص
|
|
143
|
-
config-scopes.e2e.test.ts # دمج الإعدادات عبر المشروع/المحلي/العام
|
|
144
|
-
policy-params.e2e.test.ts # حقن المعاملات لكل سياسة معاملات
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
### استخدام مساعدات الشامل
|
|
148
|
-
|
|
149
|
-
**`FixtureEnv`** - بيئة معزولة لكل اختبار:
|
|
150
|
-
|
|
151
|
-
```typescript
|
|
152
|
-
import { createFixtureEnv } from "../helpers/fixture-env";
|
|
153
|
-
|
|
154
|
-
const env = createFixtureEnv();
|
|
155
|
-
// env.cwd - دليل مؤقت؛ مرره كـ payload.cwd للتقاط .failproofai/policies-config.json
|
|
156
|
-
// env.home - دليل منزل معزول؛ لا تسرب ~/ failproofai حقيقي
|
|
157
|
-
|
|
158
|
-
env.writeConfig({
|
|
159
|
-
enabledPolicies: ["block-sudo"],
|
|
160
|
-
policyParams: {
|
|
161
|
-
"block-sudo": { allowPatterns: ["sudo systemctl status"] },
|
|
162
|
-
},
|
|
163
|
-
});
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
`createFixtureEnv()` يسجل تنظيف `afterEach` تلقائيًا.
|
|
167
|
-
|
|
168
|
-
**`runHook`** - استدعاء الملف الثنائي:
|
|
169
|
-
|
|
170
|
-
```typescript
|
|
171
|
-
import { runHook } from "../helpers/hook-runner";
|
|
172
|
-
import { Payloads } from "../helpers/payloads";
|
|
173
|
-
|
|
174
|
-
const result = await runHook(
|
|
175
|
-
"PreToolUse",
|
|
176
|
-
Payloads.preToolUse.bash("sudo apt install nodejs", env.cwd),
|
|
177
|
-
{ homeDir: env.home }
|
|
178
|
-
);
|
|
179
|
-
|
|
180
|
-
expect(result.exitCode).toBe(0);
|
|
181
|
-
expect(result.parsed?.hookSpecificOutput?.permissionDecision).toBe("deny");
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
**`Payloads`** - مصانع حمولة جاهزة:
|
|
185
|
-
|
|
186
|
-
```typescript
|
|
187
|
-
Payloads.preToolUse.bash(command, cwd)
|
|
188
|
-
Payloads.preToolUse.write(filePath, content, cwd)
|
|
189
|
-
Payloads.preToolUse.read(filePath, cwd)
|
|
190
|
-
Payloads.postToolUse.bash(command, output, cwd)
|
|
191
|
-
Payloads.postToolUse.read(filePath, content, cwd)
|
|
192
|
-
Payloads.notification(message, cwd)
|
|
193
|
-
Payloads.stop(cwd)
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
### كتابة اختبار شامل
|
|
197
|
-
|
|
198
|
-
```typescript
|
|
199
|
-
import { describe, it, expect } from "vitest";
|
|
200
|
-
import { createFixtureEnv } from "../helpers/fixture-env";
|
|
201
|
-
import { runHook } from "../helpers/hook-runner";
|
|
202
|
-
import { Payloads } from "../helpers/payloads";
|
|
203
|
-
|
|
204
|
-
describe("block-rm-rf (E2E)", () => {
|
|
205
|
-
it("denies rm -rf", async () => {
|
|
206
|
-
const env = createFixtureEnv();
|
|
207
|
-
env.writeConfig({ enabledPolicies: ["block-rm-rf"] });
|
|
208
|
-
|
|
209
|
-
const result = await runHook(
|
|
210
|
-
"PreToolUse",
|
|
211
|
-
Payloads.preToolUse.bash("rm -rf /", env.cwd),
|
|
212
|
-
{ homeDir: env.home }
|
|
213
|
-
);
|
|
214
|
-
|
|
215
|
-
expect(result.exitCode).toBe(0);
|
|
216
|
-
expect(result.parsed?.hookSpecificOutput?.permissionDecision).toBe("deny");
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
it("allows non-recursive rm", async () => {
|
|
220
|
-
const env = createFixtureEnv();
|
|
221
|
-
env.writeConfig({ enabledPolicies: ["block-rm-rf"] });
|
|
222
|
-
|
|
223
|
-
const result = await runHook(
|
|
224
|
-
"PreToolUse",
|
|
225
|
-
Payloads.preToolUse.bash("rm /tmp/file.txt", env.cwd),
|
|
226
|
-
{ homeDir: env.home }
|
|
227
|
-
);
|
|
228
|
-
|
|
229
|
-
expect(result.exitCode).toBe(0);
|
|
230
|
-
expect(result.stdout).toBe(""); // allow → empty stdout
|
|
231
|
-
});
|
|
232
|
-
});
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
### أشكال استجابة الشامل
|
|
236
|
-
|
|
237
|
-
| القرار | كود الخروج | stdout |
|
|
238
|
-
|----------|-----------|--------|
|
|
239
|
-
| `PreToolUse` deny | `0` | `{"hookSpecificOutput":{"permissionDecision":"deny","permissionDecisionReason":"..."}}` |
|
|
240
|
-
| `PostToolUse` deny | `0` | `{"hookSpecificOutput":{"additionalContext":"Blocked ... because: ..."}}` |
|
|
241
|
-
| Instruct (غير Stop) | `0` | `{"hookSpecificOutput":{"additionalContext":"Instruction from failproofai: ..."}}` |
|
|
242
|
-
| تعليمات Stop | `2` | stdout فارغة؛ السبب في stderr |
|
|
243
|
-
| السماح | `0` | سلسلة فارغة |
|
|
244
|
-
|
|
245
|
-
### إعدادات Vitest
|
|
246
|
-
|
|
247
|
-
تستخدم اختبارات الشامل `vitest.config.e2e.mts` مع:
|
|
248
|
-
|
|
249
|
-
- `environment: "node"` - لا توجد حاجة لمتغيرات المتصفح العام
|
|
250
|
-
- `pool: "forks"` - عزل العملية الحقيقي (اختبارات تشغيل العمليات الفرعية)
|
|
251
|
-
- `testTimeout: 20_000` - 20 ثانية لكل اختبار (بدء الملف الثنائي وتقييم hook)
|
|
252
|
-
|
|
253
|
-
مجموعة `forks` مهمة: تشارك العمال المستندة إلى الخيط `globalThis`، وهو ما قد يتداخل مع اختبارات توليد العمليات الفرعية. تتجنب الفروع المستندة إلى العملية هذا.
|
|
254
|
-
|
|
255
|
-
---
|
|
256
|
-
|
|
257
|
-
## CI
|
|
258
|
-
|
|
259
|
-
يجب أن تنجح عملية CI الكاملة (`bun run lint && bunx tsc --noEmit && bun run test:run && bun run build`) قبل الدمج. تعمل مجموعة الشامل كوظيفة CI منفصلة بالتوازي.
|
|
260
|
-
|
|
261
|
-
انظر [المساهمة](../CONTRIBUTING.md) للحصول على قائمة التحقق الكاملة قبل الدمج.
|
|
@@ -1,332 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Architecture
|
|
3
|
-
description: "How the hook handler, config loading, and policy evaluation work internally"
|
|
4
|
-
icon: sitemap
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
This document explains how failproofai works internally: how the hook system intercepts agent tool calls, how configuration is loaded and merged, how policies are evaluated, and how the dashboard monitors agent activity.
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Overview
|
|
12
|
-
|
|
13
|
-
failproofai has two independent subsystems:
|
|
14
|
-
|
|
15
|
-
1. **Hook handler** - A fast CLI subprocess that Claude Code invokes on every agent tool call. Evaluates policies and returns a decision.
|
|
16
|
-
2. **Agent Monitor (Dashboard)** - A Next.js web application for monitoring agent sessions and managing policies.
|
|
17
|
-
|
|
18
|
-
Both subsystems share configuration files in `~/.failproofai/` and the project's `.failproofai/` directory, but they run as separate processes and communicate only through the filesystem.
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Hook handler
|
|
23
|
-
|
|
24
|
-
### Integration with Claude Code
|
|
25
|
-
|
|
26
|
-
When you run `failproofai policies --install`, it writes entries like this into `~/.claude/settings.json`:
|
|
27
|
-
|
|
28
|
-
```json
|
|
29
|
-
{
|
|
30
|
-
"hooks": {
|
|
31
|
-
"PreToolUse": [
|
|
32
|
-
{
|
|
33
|
-
"matcher": "",
|
|
34
|
-
"hooks": [
|
|
35
|
-
{
|
|
36
|
-
"type": "command",
|
|
37
|
-
"command": "failproofai --hook PreToolUse"
|
|
38
|
-
}
|
|
39
|
-
]
|
|
40
|
-
}
|
|
41
|
-
],
|
|
42
|
-
"PostToolUse": [ ... ]
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Claude Code then invokes `failproofai --hook PreToolUse` as a subprocess before each tool call, passing a JSON payload on stdin.
|
|
48
|
-
|
|
49
|
-
### Payload format
|
|
50
|
-
|
|
51
|
-
```json
|
|
52
|
-
{
|
|
53
|
-
"session_id": "abc123",
|
|
54
|
-
"transcript_path": "/home/user/.claude/projects/myproject/sessions/abc123.jsonl",
|
|
55
|
-
"cwd": "/home/user/myproject",
|
|
56
|
-
"permission_mode": "default",
|
|
57
|
-
"hook_event_name": "PreToolUse",
|
|
58
|
-
"tool_name": "Bash",
|
|
59
|
-
"tool_input": { "command": "sudo apt install nodejs" }
|
|
60
|
-
}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
For `PostToolUse` events, the payload also contains `tool_result` with the tool's output.
|
|
64
|
-
|
|
65
|
-
The handler enforces a 1 MB stdin limit. Payloads exceeding this are discarded and all policies implicitly allow.
|
|
66
|
-
|
|
67
|
-
### Response format
|
|
68
|
-
|
|
69
|
-
**Deny (PreToolUse):**
|
|
70
|
-
```json
|
|
71
|
-
{
|
|
72
|
-
"hookSpecificOutput": {
|
|
73
|
-
"permissionDecision": "deny",
|
|
74
|
-
"permissionDecisionReason": "Blocked by failproofai: sudo command blocked"
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
**Deny (PostToolUse):**
|
|
80
|
-
```json
|
|
81
|
-
{
|
|
82
|
-
"hookSpecificOutput": {
|
|
83
|
-
"additionalContext": "Blocked by failproofai because: API key detected in output"
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
**Instruct (any event except Stop):**
|
|
89
|
-
```json
|
|
90
|
-
{
|
|
91
|
-
"hookSpecificOutput": {
|
|
92
|
-
"additionalContext": "Instruction from failproofai: Verify tests pass before committing."
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
**Stop event instruct:**
|
|
98
|
-
- Exit code: `2`
|
|
99
|
-
- Reason written to stderr (not stdout)
|
|
100
|
-
|
|
101
|
-
**Allow:**
|
|
102
|
-
- Exit code: `0`
|
|
103
|
-
- Empty stdout
|
|
104
|
-
|
|
105
|
-
**Allow with message:**
|
|
106
|
-
|
|
107
|
-
`allow(message)` lets a policy send informational context back to Claude even when the operation is permitted. The hook handler writes the following JSON to **stdout** (not a config file — this is the handler's response to Claude Code, just like deny and instruct responses above):
|
|
108
|
-
|
|
109
|
-
```json
|
|
110
|
-
// Written to stdout by the hook handler process
|
|
111
|
-
{
|
|
112
|
-
"hookSpecificOutput": {
|
|
113
|
-
"additionalContext": "All CI checks passed on branch 'feat/my-feature'."
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
- Exit code: `0` (operation is allowed)
|
|
118
|
-
- When multiple policies return `allow` with a message, their messages are joined with newlines into a single `additionalContext` string
|
|
119
|
-
- If no policy provides a message, stdout is empty (same as before)
|
|
120
|
-
|
|
121
|
-
### Processing pipeline
|
|
122
|
-
|
|
123
|
-
`src/hooks/handler.ts` implements the full pipeline:
|
|
124
|
-
|
|
125
|
-
```text
|
|
126
|
-
stdin JSON
|
|
127
|
-
→ parse payload (max 1 MB)
|
|
128
|
-
→ extract session metadata (session_id, cwd, tool_name, tool_input, etc.)
|
|
129
|
-
→ readMergedHooksConfig(cwd) ← merges project + local + global config
|
|
130
|
-
→ register enabled builtin policies with resolved params
|
|
131
|
-
→ load custom policies from customPoliciesPath (if set)
|
|
132
|
-
→ register custom policies into policy registry
|
|
133
|
-
→ evaluate all policies (builtins first, then custom)
|
|
134
|
-
→ first deny short-circuits
|
|
135
|
-
→ instruct decisions accumulate
|
|
136
|
-
→ allow messages accumulate
|
|
137
|
-
→ write JSON decision to stdout
|
|
138
|
-
→ persist event to ~/.failproofai/hook-activity.jsonl
|
|
139
|
-
→ exit
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
The entire process runs in under 100ms for typical payloads with no LLM calls.
|
|
143
|
-
|
|
144
|
-
---
|
|
145
|
-
|
|
146
|
-
## Configuration loading
|
|
147
|
-
|
|
148
|
-
`src/hooks/hooks-config.ts` implements three-scope config loading.
|
|
149
|
-
|
|
150
|
-
```text
|
|
151
|
-
[1] {cwd}/.failproofai/policies-config.json ← project (highest priority)
|
|
152
|
-
[2] {cwd}/.failproofai/policies-config.local.json ← local
|
|
153
|
-
[3] ~/.failproofai/policies-config.json ← global (lowest priority)
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
Merge logic:
|
|
157
|
-
- `enabledPolicies` - deduplicated union across all three files
|
|
158
|
-
- `policyParams` - per-policy key, first file that defines it wins entirely
|
|
159
|
-
- `customPoliciesPath` - first file that defines it wins
|
|
160
|
-
- `llm` - first file that defines it wins
|
|
161
|
-
|
|
162
|
-
The web dashboard uses `readHooksConfig()` (global only) for reading and writing, since it is not invoked with a project cwd.
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
## Policy evaluation
|
|
167
|
-
|
|
168
|
-
`src/hooks/policy-evaluator.ts` runs policies in order.
|
|
169
|
-
|
|
170
|
-
For each policy:
|
|
171
|
-
|
|
172
|
-
1. Look up the policy's `params` schema (if it has one).
|
|
173
|
-
2. Read `policyParams[policy.name]` from the merged config.
|
|
174
|
-
3. Merge user-provided values over schema defaults to produce `ctx.params`.
|
|
175
|
-
4. Call `policy.fn(ctx)` with the resolved context.
|
|
176
|
-
5. If the result is `deny`, stop immediately and return that decision.
|
|
177
|
-
6. If the result is `instruct`, accumulate the message and continue.
|
|
178
|
-
7. If the result is `allow`, continue to the next policy.
|
|
179
|
-
|
|
180
|
-
After all policies run:
|
|
181
|
-
- If any `deny` was returned, emit the deny response.
|
|
182
|
-
- If any `instruct` returns were collected, emit a single instruct response with all messages joined.
|
|
183
|
-
- Otherwise, emit an allow response (empty stdout, exit 0).
|
|
184
|
-
|
|
185
|
-
---
|
|
186
|
-
|
|
187
|
-
## Builtin policies
|
|
188
|
-
|
|
189
|
-
`src/hooks/builtin-policies.ts` defines all 26 built-in policies as `BuiltinPolicyDefinition` objects:
|
|
190
|
-
|
|
191
|
-
```typescript
|
|
192
|
-
interface BuiltinPolicyDefinition {
|
|
193
|
-
name: string;
|
|
194
|
-
description: string;
|
|
195
|
-
fn: (ctx: PolicyContext) => PolicyResult;
|
|
196
|
-
match: {
|
|
197
|
-
events: HookEventType[];
|
|
198
|
-
tools?: string[];
|
|
199
|
-
};
|
|
200
|
-
defaultEnabled: boolean;
|
|
201
|
-
category: string;
|
|
202
|
-
beta?: boolean;
|
|
203
|
-
params?: PolicyParamsSchema;
|
|
204
|
-
}
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
Policies that accept `params` declare a `PolicyParamsSchema` with types and defaults for each parameter. The policy evaluator injects resolved values into `ctx.params` before calling `fn`. Policy functions read `ctx.params` without null-guarding because defaults are always applied first.
|
|
208
|
-
|
|
209
|
-
Pattern matching inside policies uses parsed command tokens (argv), not raw string matching. This prevents bypass via shell operator injection (e.g. a pattern for `sudo systemctl status *` cannot be bypassed by appending `; rm -rf /` to the command).
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## Custom policies
|
|
214
|
-
|
|
215
|
-
`src/hooks/custom-hooks-registry.ts` implements a `globalThis`-backed registry:
|
|
216
|
-
|
|
217
|
-
```typescript
|
|
218
|
-
const REGISTRY_KEY = "__failproofai_custom_hooks__";
|
|
219
|
-
|
|
220
|
-
export const customPolicies = {
|
|
221
|
-
add(hook: CustomHook): void { ... }
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
export function getCustomHooks(): CustomHook[] { ... }
|
|
225
|
-
export function clearCustomHooks(): void { ... } // used in tests
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
`src/hooks/custom-hooks-loader.ts` loads the user's policy file:
|
|
229
|
-
|
|
230
|
-
1. Read `customPoliciesPath` from config; skip if absent.
|
|
231
|
-
2. Resolve to absolute path; check file exists.
|
|
232
|
-
3. Rewrite all `from "failproofai"` imports to the actual dist path so `customPolicies` resolves to the same `globalThis` registry.
|
|
233
|
-
4. Recursively rewrite transitive local imports to ensure ESM compatibility.
|
|
234
|
-
5. Write temporary `.mjs` files and `import()` the entry file.
|
|
235
|
-
6. Call `getCustomHooks()` to retrieve registered hooks.
|
|
236
|
-
7. Clean up all temp files in a `finally` block.
|
|
237
|
-
|
|
238
|
-
On any error (file not found, syntax error, import failure), the error is logged to `~/.failproofai/hook.log` and the loader returns an empty array. Built-in policies are unaffected.
|
|
239
|
-
|
|
240
|
-
Custom policies are evaluated after all built-in policies. A custom policy `deny` still short-circuits further custom policies (but all built-ins have already run by that point).
|
|
241
|
-
|
|
242
|
-
---
|
|
243
|
-
|
|
244
|
-
## Activity logging
|
|
245
|
-
|
|
246
|
-
After each hook event, the handler appends a JSONL line to `~/.failproofai/hook-activity.jsonl`:
|
|
247
|
-
|
|
248
|
-
```json
|
|
249
|
-
{
|
|
250
|
-
"timestamp": "2026-04-06T12:34:56.789Z",
|
|
251
|
-
"sessionId": "abc123",
|
|
252
|
-
"eventType": "PreToolUse",
|
|
253
|
-
"toolName": "Bash",
|
|
254
|
-
"policyName": "block-sudo",
|
|
255
|
-
"decision": "deny",
|
|
256
|
-
"reason": "sudo command blocked by failproofai",
|
|
257
|
-
"durationMs": 12
|
|
258
|
-
}
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
One line per policy that made a non-allow decision. Allow decisions are not logged (to keep the file small).
|
|
262
|
-
|
|
263
|
-
---
|
|
264
|
-
|
|
265
|
-
## Dashboard architecture
|
|
266
|
-
|
|
267
|
-
The dashboard is a **Next.js 16** application using the App Router with React Server Components and Server Actions.
|
|
268
|
-
|
|
269
|
-
```text
|
|
270
|
-
app/
|
|
271
|
-
layout.tsx ← Root layout (theme, telemetry, nav)
|
|
272
|
-
projects/page.tsx ← Server component: list all Claude projects
|
|
273
|
-
project/[name]/page.tsx ← Server component: list sessions in a project
|
|
274
|
-
project/[name]/session/
|
|
275
|
-
[sessionId]/page.tsx ← Server component: render session viewer
|
|
276
|
-
policies/page.tsx ← Client component: policy management + activity log
|
|
277
|
-
actions/
|
|
278
|
-
get-hooks-config.ts ← Read config + policy list
|
|
279
|
-
update-hooks-config.ts ← Toggle policy on/off
|
|
280
|
-
update-policy-params.ts ← Update policy parameters
|
|
281
|
-
get-hook-activity.ts ← Paginate/search activity log
|
|
282
|
-
install-hooks-web.ts ← Install/remove hooks from the browser
|
|
283
|
-
api/
|
|
284
|
-
download/[project]/[session]/route.ts ← Export session as ZIP/JSONL
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
**Data flow:**
|
|
288
|
-
|
|
289
|
-
- Page components call `lib/projects.ts` and `lib/log-entries.ts` to read project/session data directly from the filesystem (no API layer for reads).
|
|
290
|
-
- The Policies page uses Server Actions for all mutations (toggle, params update, install/remove).
|
|
291
|
-
- The session viewer parses Claude's JSONL transcript format and renders a timeline of messages and tool calls.
|
|
292
|
-
|
|
293
|
-
**Key design decisions:**
|
|
294
|
-
|
|
295
|
-
- No database - all persistent state is in plain files (`~/.failproofai/`, `~/.claude/projects/`).
|
|
296
|
-
- Server Actions for mutations - no REST API needed for CRUD operations.
|
|
297
|
-
- React Server Components for read pages - faster initial load, no client bundle for data fetching.
|
|
298
|
-
- Client components only where interactivity is needed (policy toggles, activity search, log viewer).
|
|
299
|
-
|
|
300
|
-
---
|
|
301
|
-
|
|
302
|
-
## File layout
|
|
303
|
-
|
|
304
|
-
```text
|
|
305
|
-
failproofai/
|
|
306
|
-
├── bin/
|
|
307
|
-
│ └── failproofai.mjs # CLI router (hook / dashboard / install / etc.)
|
|
308
|
-
├── src/hooks/
|
|
309
|
-
│ ├── handler.ts # Hook event pipeline
|
|
310
|
-
│ ├── builtin-policies.ts # 26 policy definitions
|
|
311
|
-
│ ├── policy-evaluator.ts # Policy execution engine
|
|
312
|
-
│ ├── policy-registry.ts # Policy registration and lookup
|
|
313
|
-
│ ├── policy-types.ts # TypeScript interfaces
|
|
314
|
-
│ ├── hooks-config.ts # Multi-scope config loading
|
|
315
|
-
│ ├── custom-hooks-registry.ts # globalThis-backed hook registry
|
|
316
|
-
│ ├── custom-hooks-loader.ts # ESM loader for user JS hooks
|
|
317
|
-
│ ├── manager.ts # install / remove / list operations
|
|
318
|
-
│ ├── install-prompt.ts # Interactive policy selection prompt
|
|
319
|
-
│ ├── hook-logger.ts # Logging to hook.log
|
|
320
|
-
│ ├── hook-activity-store.ts # Persist activity to hook-activity.jsonl
|
|
321
|
-
│ └── llm-client.ts # LLM API client (for AI-powered policies)
|
|
322
|
-
├── app/ # Next.js dashboard (pages + server actions)
|
|
323
|
-
├── lib/ # Shared utilities
|
|
324
|
-
│ ├── projects.ts # Enumerate Claude projects from filesystem
|
|
325
|
-
│ ├── log-entries.ts # Parse Claude transcript JSONL format
|
|
326
|
-
│ ├── paths.ts # Resolve system paths
|
|
327
|
-
│ └── ...
|
|
328
|
-
├── components/ # Shared React UI components
|
|
329
|
-
├── contexts/ # React context providers (theme, auto-refresh, telemetry)
|
|
330
|
-
├── examples/ # Example custom hook files
|
|
331
|
-
└── __tests__/ # Unit and E2E tests
|
|
332
|
-
```
|