failproofai 0.0.11-beta.1 → 0.0.11-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +8 -1
- package/.next/standalone/.next/build-manifest.json +10 -10
- package/.next/standalone/.next/prerender-manifest.json +3 -32
- package/.next/standalone/.next/required-server-files.json +2 -1
- package/.next/standalone/.next/routes-manifest.json +45 -3
- package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +7 -7
- 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 +6 -6
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/_not-found/page/next-font-manifest.json +2 -6
- 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 +12 -13
- 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 +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +16 -16
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +16 -16
- 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 +10 -10
- 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/api/audit/run/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/audit/run/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/audit/run/route.js +8 -0
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/audit/run/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/audit/status/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/audit/status/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/audit/status/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/audit/status/route.js +6 -0
- package/.next/standalone/.next/server/app/api/audit/status/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/audit/status/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js +6 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/status/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/status/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/status/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/status/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/status/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/status/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +3 -3
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/audit/page/build-manifest.json +18 -0
- package/.next/standalone/.next/server/app/audit/page/next-font-manifest.json +6 -0
- package/.next/standalone/.next/server/app/audit/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +29 -0
- package/.next/standalone/.next/server/app/audit/page.js +17 -0
- package/.next/standalone/.next/server/app/audit/page.js.map +5 -0
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +16 -17
- 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 -17
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -3
- package/.next/standalone/.next/server/app/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/page/next-font-manifest.json +2 -6
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js +14 -15
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/policies/page/next-font-manifest.json +2 -6
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
- package/.next/standalone/.next/server/app/policies/page.js +16 -16
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/project/[name]/page/next-font-manifest.json +2 -6
- 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 +16 -17
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/next-font-manifest.json +2 -6
- 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 +19 -20
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/projects/page/next-font-manifest.json +2 -6
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js +15 -16
- 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/app-paths-manifest.json +8 -1
- package/.next/standalone/.next/server/chunks/[externals]__14odj07._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[externals]__0z0j--b._.js → [externals]__1nl3dvw._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[externals]__0-p9.k~._.js → [externals]__1s61mel._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[externals]_node_os_06ur78j._.js → [externals]_node_os_0by37l-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__07tgnzi._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0kjo7d_._.js → [root-of-the-server]__0_0xu5z._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cag8qd._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0z-180.._.js → [root-of-the-server]__0cycwg6._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__08px0ym._.js → [root-of-the-server]__0f7mikp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0oeun7z._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q-v9z2._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rv7m0k._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0g48iv.._.js → [root-of-the-server]__0sb_5m8._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0j8-xkl._.js → [root-of-the-server]__0xuaoik._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__12pit4m._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13h8pzr._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13ra2jq._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__17g9wh7._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0d_ob4n._.js → [root-of-the-server]__1_mqemn._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1b9z5-i._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0vlhtkc._.js → [root-of-the-server]__1hgv_75._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ixjiy8._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0wu7fr7._.js → [root-of-the-server]__1jm9fw6._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1legmza._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0fwb7ao._.js → [root-of-the-server]__1m2_4t0._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0yfq1yr._.js → [root-of-the-server]__1mhmdzs._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0zso~62._.js → [root-of-the-server]__1ou2ehh._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qxztj-._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rhmvod._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0.~nmr9._.js → [root-of-the-server]__1w9zl9-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{_0ebx_lc._.js → _0p53ge1._.js} +2 -2
- package/.next/standalone/.next/server/chunks/_1-1804f._.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_audit_run_route_actions_1qgp9io.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_audit_status_route_actions_1f7pjof.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_login-request_route_actions_1c49co0.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_login-verify_route_actions_1r3slzk.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_logout_route_actions_0regwyr.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_reminder_route_actions_1kjgxf8.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_status_route_actions_1aho9zu.js +3 -0
- package/.next/standalone/.next/server/chunks/{_next-internal_server_app_api_download_[project]_[session]_route_actions_0wb00i-.js → _next-internal_server_app_api_download_[project]_[session]_route_actions_1is7vs7.js} +1 -1
- package/.next/standalone/.next/server/chunks/{lib_logger_ts_047tt9f._.js → lib_logger_ts_07e65t5._.js} +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_17k9e3w.js +23 -0
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oi._.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +3 -0
- package/.next/standalone/.next/server/chunks/{package_json_[json]_cjs_0z7w.hh._.js → package_json_[json]_cjs_1nxcc4v._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[externals]__12dv.x0._.js → [externals]__1_g_b3t._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[externals]_node_async_hooks_0v0ln8c._.js → [externals]_node_async_hooks_1gjz99j._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00jkjmt._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__013du6r._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0989_dx._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e85wxv._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0gfxvb1._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h12me5._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0l13qf2._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ywoypf._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1-scthx._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__100hdar._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11rtg6s._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__14dd6h8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1cd25c7._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0t5l7a5._.js → [root-of-the-server]__1d8omgc._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0tcyn68._.js → [root-of-the-server]__1dky4g0._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__098zro9._.js → [root-of-the-server]__1fax1sl._.js} +4 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1hlrq6y._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ihxdo5._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1mt35_w._.js +221 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0-wn51s._.js → [root-of-the-server]__1pcxxwg._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1usf8v2._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1vvfde2._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__212nf49._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_03d7qyt._.js → _05whahf._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_11_p9y8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0xb8ngh._.js → _1kje4fm._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0zx~s__._.js → _1p0-leb._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_04qfs8z._.js → app_087bt9w._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_0uosk1e._.js → app_1fvisnp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_13f0ohr._.js → app_209u41o._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +43 -0
- package/.next/standalone/.next/server/chunks/ssr/app_audit_loading_tsx_1j1kc6j._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{app_error_tsx_11t4ysq._.js → app_error_tsx_1zds1ns._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_global-error_tsx_0m9qisk._.js → app_global-error_tsx_113y3za._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +8 -0
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_error_tsx_0.9-fod._.js → app_project_[name]_error_tsx_1v02_5n._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_loading_tsx_03g9xy0._.js → app_project_[name]_loading_tsx_05-l4uf._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_session_[sessionId]_error_tsx_0ler-mr._.js → app_project_[name]_session_[sessionId]_error_tsx_0-lj3nd._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_session_[sessionId]_loading_tsx_0c0e3yx._.js → app_project_[name]_session_[sessionId]_loading_tsx_0l4aixs._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_projects_loading_tsx_20-3u8b._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{lib_codex-projects_ts_0eosib~._.js → lib_codex-projects_ts_0pqlw37._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_copilot-projects_ts_0r8xkn8._.js → lib_copilot-projects_ts_19wl7tp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_cursor-projects_ts_0qt1scg._.js → lib_cursor-projects_ts_18-iwyk._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_gemini-projects_ts_0sl~yqr._.js → lib_gemini-projects_ts_1c7bgx-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_opencode-projects_ts_0op9gyp._.js → lib_opencode-projects_ts_15bjxkm._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_pi-projects_ts_103tsh1._.js → lib_pi-projects_ts_1wikofb._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_utils_ts_068jk73._.js → lib_utils_ts_0az0sfq._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_1ynf7el._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_html2canvas_dist_html2canvas_esm_05gja40.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_html2canvas_dist_html2canvas_esm_1n-0xws.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_0rd0oc-._.js → node_modules_next_1a1kch7._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_0h9llsw._.js → node_modules_next_dist_0uboya6._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_11dij6w._.js → node_modules_next_dist_1d_onnt._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_client_components_0inhx6q._.js → node_modules_next_dist_client_components_0wpq8j3._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js → node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js → node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0-uvagv.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_03c7gi5.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_09p-8om.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0v-kfiu.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0j79~gv.js → node_modules_next_dist_esm_build_templates_app-page_0xrgzyz.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1806lsc.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1j6dd-e.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1sa65r-.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1ezd2jf._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1tnuifj._.js +5 -0
- package/.next/standalone/.next/server/functions-config-manifest.json +3 -0
- package/.next/standalone/.next/server/instrumentation.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +10 -10
- package/.next/standalone/.next/server/middleware.js +2 -2
- package/.next/standalone/.next/server/next-font-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.json +2 -21
- package/.next/standalone/.next/server/pages/404.html +1 -1
- 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 +27 -9
- package/.next/standalone/.next/static/chunks/{07uz2g0_38qia.js → 03fmihek9n986.js} +1 -1
- package/.next/standalone/.next/static/chunks/09ueq8s1as8xs.css +2 -0
- package/.next/standalone/.next/static/chunks/0ehe4dh0grngk.js +41 -0
- package/.next/standalone/.next/static/chunks/{13-bt.3~irg00.js → 0gdm-xaez4l7t.js} +1 -1
- package/.next/standalone/.next/static/chunks/{07kfzzinhsl7e.js → 0kdglk0vtzymo.js} +1 -1
- package/.next/standalone/.next/static/chunks/0qassxjx1ef04.js +1 -0
- package/.next/standalone/.next/static/chunks/0zbxssxh53n-3.js +1 -0
- package/.next/standalone/.next/static/chunks/13f1kmjea-0md.js +2 -0
- package/.next/standalone/.next/static/chunks/1btx2c49fk9xt.css +1 -0
- package/.next/standalone/.next/static/chunks/1fmco3pvq_twz.js +1 -0
- package/.next/standalone/.next/static/chunks/2b1fzuhuk-42n.js +1 -0
- package/.next/standalone/.next/static/chunks/{0_vk1wsgf~q3o.js → 2dtip-mvmihiu.js} +1 -1
- package/.next/standalone/.next/static/chunks/2srzafd1_ha5y.js +1 -0
- package/.next/standalone/.next/static/chunks/{0d3shmwh5_nmn.js → 33u59vf_8xpd-.js} +1 -1
- package/.next/standalone/.next/static/chunks/3gti1qdk5epqn.js +1 -0
- package/.next/standalone/.next/static/chunks/{0wtiofzdt-l2u.js → 3krzy-lhwfrmz.js} +1 -1
- package/.next/standalone/.next/static/chunks/{17mubwtqwijpu.js → 3w8d8k_dca5rp.js} +1 -1
- package/.next/standalone/.next/static/chunks/43lnq0c1rnflb.js +6 -0
- package/.next/standalone/.next/static/chunks/{turbopack-0nh.aopesgj~5.js → turbopack-00qy7zfa7m--m.js} +1 -1
- package/.next/standalone/SECURITY.md +73 -0
- package/.next/standalone/app/actions/get-audit-result.ts +24 -0
- package/.next/standalone/app/api/audit/_state.ts +72 -0
- package/.next/standalone/app/api/audit/run/route.ts +89 -0
- package/.next/standalone/app/api/audit/status/route.ts +23 -0
- package/.next/standalone/app/api/auth/login-request/route.ts +91 -0
- package/.next/standalone/app/api/auth/login-verify/route.ts +98 -0
- package/.next/standalone/app/api/auth/logout/route.ts +48 -0
- package/.next/standalone/app/api/auth/reminder/route.ts +213 -0
- package/.next/standalone/app/api/auth/status/route.ts +42 -0
- package/.next/standalone/app/audit/_components/audit-dashboard.tsx +364 -0
- package/.next/standalone/app/audit/_components/auth-dialog.tsx +401 -0
- package/.next/standalone/app/audit/_components/empty-state.tsx +146 -0
- package/.next/standalone/app/audit/_components/findings-section.tsx +135 -0
- package/.next/standalone/app/audit/_components/identity-section.tsx +126 -0
- package/.next/standalone/app/audit/_components/policies-section.tsx +194 -0
- package/.next/standalone/app/audit/_components/report-footer.tsx +35 -0
- package/.next/standalone/app/audit/_components/rerun-button.tsx +81 -0
- package/.next/standalone/app/audit/_components/return-section.tsx +428 -0
- package/.next/standalone/app/audit/_components/run-progress.tsx +120 -0
- package/.next/standalone/app/audit/_components/score-section.tsx +179 -0
- package/.next/standalone/app/audit/_components/share-dock.tsx +265 -0
- package/.next/standalone/app/audit/_components/share-templates.ts +67 -0
- package/.next/standalone/app/audit/_components/show-off-cta.tsx +135 -0
- package/.next/standalone/app/audit/_components/sigil.tsx +93 -0
- package/.next/standalone/app/audit/_components/strengths-section.tsx +57 -0
- package/.next/standalone/app/audit/audit-styles.css +2066 -0
- package/.next/standalone/app/audit/loading.tsx +24 -0
- package/.next/standalone/app/audit/page.tsx +53 -0
- package/.next/standalone/app/globals.css +570 -137
- package/.next/standalone/app/layout.tsx +16 -9
- package/.next/standalone/app/policies/hooks-client.tsx +325 -142
- package/.next/standalone/app/project/[name]/page.tsx +89 -39
- package/.next/standalone/app/projects/loading.tsx +30 -8
- package/.next/standalone/app/projects/page.tsx +76 -18
- package/.next/standalone/assets/audit/Audit Report.html +22 -0
- package/.next/standalone/assets/audit/Show Off Your Agent.html +22 -0
- package/.next/standalone/assets/audit/archetypes.jsx +277 -0
- package/.next/standalone/assets/audit/assets/fonts/bitcount-prop-single.woff2 +0 -0
- package/.next/standalone/assets/audit/audit.jsx +825 -0
- package/.next/standalone/assets/audit/poster-styles.css +424 -0
- package/.next/standalone/assets/audit/poster.jsx +247 -0
- package/.next/standalone/assets/audit/screenshots/poster-optimist.png +0 -0
- package/.next/standalone/assets/audit/screenshots/poster-scrolled.png +0 -0
- package/.next/standalone/assets/audit/styles.css +1225 -0
- package/.next/standalone/assets/audit/tweaks-panel.jsx +425 -0
- package/.next/standalone/assets/logos/company/icon.svg +1 -0
- package/.next/standalone/assets/logos/company/logo.svg +1 -0
- package/.next/standalone/components/navbar.tsx +154 -65
- package/.next/standalone/components/reach-developers.tsx +37 -9
- package/.next/standalone/lib/atomic-write.ts +67 -0
- package/.next/standalone/lib/auth/api-server-client.ts +281 -0
- package/.next/standalone/lib/auth/auth-store.ts +250 -0
- package/.next/standalone/lib/claude-sessions.ts +181 -0
- package/.next/standalone/lib/client-telemetry.ts +2 -0
- package/.next/standalone/lib/fetch-with-timeout.ts +42 -0
- package/.next/standalone/lib/share-card.ts +120 -0
- package/.next/standalone/lib/telemetry.ts +12 -7
- package/.next/standalone/node_modules/@next/env/package.json +1 -1
- package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
- package/.next/standalone/node_modules/next/dist/client/dev/debug-channel.js +102 -2
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +11 -11
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +13 -13
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-route-turbo.runtime.prod.js +2 -2
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +1 -1
- package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
- package/.next/standalone/node_modules/next/dist/server/app-render/action-handler.js +18 -8
- package/.next/standalone/node_modules/next/dist/server/config-schema.js +1 -0
- package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/encode-cache-tag.js +45 -0
- package/.next/standalone/node_modules/next/dist/server/lib/implicit-tags.js +6 -3
- package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch.js +5 -1
- package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/revalidate.js +4 -3
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/unstable-cache.js +6 -2
- package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
- package/.next/standalone/node_modules/next/package.json +15 -15
- package/.next/standalone/node_modules/react/cjs/react.development.js +1 -1
- package/.next/standalone/node_modules/react/cjs/react.production.js +1 -1
- package/.next/standalone/node_modules/react/package.json +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/package.json +2 -2
- package/.next/standalone/osv-scanner.toml +17 -0
- package/.next/standalone/package.json +8 -3
- package/.next/standalone/public/audit/fonts/bitcount-prop-single.woff2 +0 -0
- package/.next/standalone/public/icon.svg +1 -0
- package/.next/standalone/public/logo.svg +1 -0
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/templates/bitcount-font/README.md +42 -0
- package/.next/standalone/templates/bitcount-font/bitcount-prop-single.woff2 +0 -0
- package/.next/standalone/templates/bitcount-font/bitcount.css +49 -0
- package/.next/standalone/templates/bitcount-font/fonts.ts.example +23 -0
- package/README.md +4 -3
- package/bin/failproofai.mjs +248 -70
- package/dist/cli.mjs +1709 -1385
- package/lib/atomic-write.ts +67 -0
- package/lib/auth/api-server-client.ts +281 -0
- package/lib/auth/auth-store.ts +250 -0
- package/lib/claude-sessions.ts +181 -0
- package/lib/client-telemetry.ts +2 -0
- package/lib/fetch-with-timeout.ts +42 -0
- package/lib/share-card.ts +120 -0
- package/lib/telemetry.ts +12 -7
- package/package.json +8 -3
- package/scripts/install-telemetry.mjs +4 -0
- package/scripts/postinstall.mjs +89 -1
- package/src/audit/archetypes.ts +924 -0
- package/src/audit/cache.ts +132 -0
- package/src/audit/cli-adapters/claude.ts +97 -0
- package/src/audit/cli-adapters/codex.ts +56 -0
- package/src/audit/cli-adapters/copilot.ts +51 -0
- package/src/audit/cli-adapters/cursor.ts +51 -0
- package/src/audit/cli-adapters/gemini.ts +51 -0
- package/src/audit/cli-adapters/index.ts +70 -0
- package/src/audit/cli-adapters/opencode.ts +52 -0
- package/src/audit/cli-adapters/pi.ts +51 -0
- package/src/audit/cli-adapters/shared.ts +85 -0
- package/src/audit/dashboard-cache.ts +111 -0
- package/src/audit/detectors/find-from-root.ts +27 -0
- package/src/audit/detectors/git-commit-no-verify.ts +22 -0
- package/src/audit/detectors/index.ts +33 -0
- package/src/audit/detectors/prefer-edit-over-read-cat.ts +31 -0
- package/src/audit/detectors/prefer-edit-over-sed-awk.ts +27 -0
- package/src/audit/detectors/prefer-write-over-heredoc.ts +36 -0
- package/src/audit/detectors/redundant-cd-cwd.ts +28 -0
- package/src/audit/detectors/reread-after-edit.ts +58 -0
- package/src/audit/detectors/sleep-polling-loop.ts +34 -0
- package/src/audit/features.ts +268 -0
- package/src/audit/findings.ts +298 -0
- package/src/audit/index.ts +387 -0
- package/src/audit/replay.ts +147 -0
- package/src/audit/report.ts +349 -0
- package/src/audit/scoring.ts +174 -0
- package/src/audit/strengths.ts +138 -0
- package/src/audit/types.ts +216 -0
- package/src/auth/cli.ts +359 -0
- package/src/hooks/builtin-policies.ts +80 -1
- package/src/hooks/custom-hooks-loader.ts +19 -3
- package/src/hooks/first-run-nudge.ts +146 -0
- package/src/hooks/handler.ts +21 -102
- package/src/hooks/hook-telemetry.ts +2 -2
- package/src/hooks/install-prompt.ts +34 -4
- package/src/hooks/manager.ts +72 -5
- package/src/hooks/policy-evaluator.ts +16 -1
- package/src/hooks/policy-registry.ts +20 -0
- package/src/hooks/policy-types.ts +9 -0
- package/src/hooks/tool-name-canonicalize.ts +65 -0
- package/src/posthog-key.ts +9 -0
- package/.next/standalone/.next/server/app/icon.png/route/app-paths-manifest.json +0 -3
- package/.next/standalone/.next/server/app/icon.png/route.js +0 -7
- package/.next/standalone/.next/server/app/icon.png/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/icon.png.body +0 -0
- package/.next/standalone/.next/server/app/icon.png.meta +0 -1
- package/.next/standalone/.next/server/chunks/[externals]_next_dist_0sqmaqd._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06.arfm._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0__i0h0._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fe7_q_._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fw.e.h._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pxn0e1._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xv0jh2._.js +0 -3
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_icon_png_route_actions_12.gv.r.js +0 -3
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0bdfoky.js +0 -3
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_05pz9._._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0370~qj._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09i-rsi._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09v.ljl._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0agrcb8._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0b7hkr~._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ehh6vp._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g8l0tu._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0j4l6hl._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0lp08ll._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n0yaqw._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0o21f.o._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0t8juvy._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0uylufv._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ymlddl._.js +0 -223
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0~03grs._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__101v4_7._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12y7xmt._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_0cdqd9w._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +0 -8
- package/.next/standalone/.next/server/chunks/ssr/app_projects_loading_tsx_13veom4._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_0ttbz1~._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_06u0kr8._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a_7sdg.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ef3uwk.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0pbja1x.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0r6o0i2.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11y81~_.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_12or2kf.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0mebn66._.js +0 -3
- package/.next/standalone/.next/static/chunks/03xhjwk6zhi8f.js +0 -1
- package/.next/standalone/.next/static/chunks/0f5p9plm.aqlp.css +0 -2
- package/.next/standalone/.next/static/chunks/0ffvlbgzgnlw7.js +0 -2
- package/.next/standalone/.next/static/chunks/0wq808vlc8l04.js +0 -6
- package/.next/standalone/.next/static/chunks/0zg~cpc5ysg6d.js +0 -1
- package/.next/standalone/.next/static/chunks/12pt~2f.c1sha.js +0 -1
- package/.next/standalone/.next/static/chunks/16vev.do1oho7.js +0 -4
- package/.next/standalone/.next/static/media/4fa387ec64143e14-s.0.qu-9752pffj.woff2 +0 -0
- package/.next/standalone/.next/static/media/5ce348bf30bf5439-s.0ee55_hj9qcer.woff2 +0 -0
- package/.next/standalone/.next/static/media/6306c77e7c8268e4-s.0mao5jbfbduzp.woff2 +0 -0
- package/.next/standalone/.next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2 +0 -0
- package/.next/standalone/.next/static/media/7d817b4c03b0c5f1-s.0uzt.a6d44yda.woff2 +0 -0
- package/.next/standalone/.next/static/media/bbc41e54d2fcbd21-s.0mvwgmnhv29no.woff2 +0 -0
- package/.next/standalone/.next/static/media/icon.0a.gigb3_x5pd.png +0 -0
- package/.next/standalone/app/icon.png +0 -0
- package/src/auth/login.ts +0 -104
- package/src/auth/logout.ts +0 -50
- package/src/auth/token-store.ts +0 -64
- package/src/relay/daemon.ts +0 -362
- package/src/relay/pid.ts +0 -76
- package/src/relay/queue.ts +0 -225
- /package/.next/standalone/.next/server/app/{icon.png → api/audit/run}/route/build-manifest.json +0 -0
- /package/.next/standalone/.next/server/app/{icon.png → api/audit/run}/route.js.map +0 -0
- /package/.next/standalone/.next/static/chunks/{03~yq9q893hmn.js → 0cz1d0mv5g_q7.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0a40sy4tk8ioe.js → 0wwt5o04i4zwh.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0n1n67imq.udf.js → 1__i9af9g78vd.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0w6fzf.07a24u.js → 2so39wg7mjbi7.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0xbo5nl6w4lka.js → 2wbuxnsvux4di.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0_s0luks5tay-.js → 35fgpd_feci6x.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{15fklyav5py5m.js → 3xpjn3cdgm-7m.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{17.b3suj8zjjj.js → 4448_qq7bd963.js} +0 -0
- /package/.next/standalone/.next/static/{s5Nn6KwDdLpPhjG3l2WNf → wU3ot-EKa5ApKoh785wp8}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{s5Nn6KwDdLpPhjG3l2WNf → wU3ot-EKa5ApKoh785wp8}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{s5Nn6KwDdLpPhjG3l2WNf → wU3ot-EKa5ApKoh785wp8}/_ssgManifest.js +0 -0
|
@@ -1471,7 +1471,8 @@ function requireCiGreenBeforeStop(ctx: PolicyContext): PolicyResult {
|
|
|
1471
1471
|
r.status === "completed" &&
|
|
1472
1472
|
r.conclusion !== "success" &&
|
|
1473
1473
|
r.conclusion !== "skipped" &&
|
|
1474
|
-
r.conclusion !== "cancelled"
|
|
1474
|
+
r.conclusion !== "cancelled" &&
|
|
1475
|
+
r.conclusion !== "neutral",
|
|
1475
1476
|
);
|
|
1476
1477
|
if (failing.length > 0) {
|
|
1477
1478
|
const names = failing.map((r) => `"${r.name}"`).join(", ");
|
|
@@ -1502,6 +1503,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1502
1503
|
{
|
|
1503
1504
|
name: "sanitize-jwt",
|
|
1504
1505
|
description: "Stop Claude from reading JWTs in tool responses",
|
|
1506
|
+
displayTitle: "Redacted JWT tokens from tool output",
|
|
1507
|
+
impact: "Stops the agent from echoing auth tokens it saw in command output.",
|
|
1505
1508
|
fn: sanitizeJwt,
|
|
1506
1509
|
match: { events: ["PostToolUse"] },
|
|
1507
1510
|
defaultEnabled: true,
|
|
@@ -1510,6 +1513,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1510
1513
|
{
|
|
1511
1514
|
name: "sanitize-api-keys",
|
|
1512
1515
|
description: "Stop Claude from reading API keys (OpenAI, Anthropic, GitHub, AWS, Stripe, Google) in tool responses",
|
|
1516
|
+
displayTitle: "Redacted API keys from tool output",
|
|
1517
|
+
impact: "Catches OpenAI / Anthropic / GitHub / AWS / Stripe / Google keys before the model sees them.",
|
|
1513
1518
|
fn: sanitizeApiKeys,
|
|
1514
1519
|
match: { events: ["PostToolUse"] },
|
|
1515
1520
|
defaultEnabled: true,
|
|
@@ -1525,6 +1530,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1525
1530
|
{
|
|
1526
1531
|
name: "sanitize-connection-strings",
|
|
1527
1532
|
description: "Stop Claude from reading database connection strings with embedded credentials in tool responses",
|
|
1533
|
+
displayTitle: "Redacted database connection strings from tool output",
|
|
1534
|
+
impact: "Strips embedded DB credentials before they reach the model context.",
|
|
1528
1535
|
fn: sanitizeConnectionStrings,
|
|
1529
1536
|
match: { events: ["PostToolUse"] },
|
|
1530
1537
|
defaultEnabled: true,
|
|
@@ -1533,6 +1540,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1533
1540
|
{
|
|
1534
1541
|
name: "sanitize-private-key-content",
|
|
1535
1542
|
description: "Stop Claude from reading PEM private key content in tool responses",
|
|
1543
|
+
displayTitle: "Redacted PEM private keys from tool output",
|
|
1544
|
+
impact: "Prevents private key bodies from being echoed into chat context.",
|
|
1536
1545
|
fn: sanitizePrivateKeyContent,
|
|
1537
1546
|
match: { events: ["PostToolUse"] },
|
|
1538
1547
|
defaultEnabled: true,
|
|
@@ -1540,6 +1549,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1540
1549
|
},
|
|
1541
1550
|
{
|
|
1542
1551
|
name: "sanitize-bearer-tokens",
|
|
1552
|
+
displayTitle: "Redacted bearer tokens from tool output",
|
|
1553
|
+
impact: "Strips Authorization: Bearer values before they hit the model.",
|
|
1543
1554
|
description: "Stop Claude from reading Authorization Bearer tokens in tool responses",
|
|
1544
1555
|
fn: sanitizeBearerTokens,
|
|
1545
1556
|
match: { events: ["PostToolUse"] },
|
|
@@ -1548,6 +1559,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1548
1559
|
},
|
|
1549
1560
|
{
|
|
1550
1561
|
name: "protect-env-vars",
|
|
1562
|
+
displayTitle: "Tried to dump environment variables to chat",
|
|
1563
|
+
impact: "Env vars often contain secrets; blocking `env` / `printenv` keeps them out of the model context.",
|
|
1551
1564
|
description: "Prevent commands that read environment variables",
|
|
1552
1565
|
fn: protectEnvVars,
|
|
1553
1566
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1556,6 +1569,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1556
1569
|
},
|
|
1557
1570
|
{
|
|
1558
1571
|
name: "block-env-files",
|
|
1572
|
+
displayTitle: "Tried to read or write a .env file",
|
|
1573
|
+
impact: "`.env` files routinely contain API keys and DB credentials.",
|
|
1559
1574
|
description: "Block reading/writing .env files",
|
|
1560
1575
|
fn: blockEnvFiles,
|
|
1561
1576
|
match: { events: ["PreToolUse"] },
|
|
@@ -1564,6 +1579,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1564
1579
|
},
|
|
1565
1580
|
{
|
|
1566
1581
|
name: "block-read-outside-cwd",
|
|
1582
|
+
displayTitle: "Tried to read files outside your project directory",
|
|
1583
|
+
impact: "Stops the agent from peeking at neighboring repos or your home directory.",
|
|
1567
1584
|
description: "Block file reads outside the session working directory",
|
|
1568
1585
|
fn: blockReadOutsideCwd,
|
|
1569
1586
|
match: { events: ["PreToolUse"], toolNames: ["Read", "Glob", "Grep", "Bash"] },
|
|
@@ -1579,6 +1596,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1579
1596
|
},
|
|
1580
1597
|
{
|
|
1581
1598
|
name: "block-sudo",
|
|
1599
|
+
displayTitle: "Tried to run a command with sudo",
|
|
1600
|
+
impact: "Sudo gives the agent root — blocked unless explicitly allow-listed.",
|
|
1582
1601
|
description: "Block sudo commands",
|
|
1583
1602
|
fn: blockSudo,
|
|
1584
1603
|
// PermissionRequest is Codex's escalation-approval event; fire the same
|
|
@@ -1596,6 +1615,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1596
1615
|
},
|
|
1597
1616
|
{
|
|
1598
1617
|
name: "block-curl-pipe-sh",
|
|
1618
|
+
displayTitle: "Tried to pipe a downloaded script straight to a shell",
|
|
1619
|
+
impact: "`curl ... | sh` runs unverified remote code on your machine.",
|
|
1599
1620
|
description: "Block piping downloads to shell",
|
|
1600
1621
|
fn: blockCurlPipeSh,
|
|
1601
1622
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1604,6 +1625,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1604
1625
|
},
|
|
1605
1626
|
{
|
|
1606
1627
|
name: "block-rm-rf",
|
|
1628
|
+
displayTitle: "Tried to recursively delete a system path",
|
|
1629
|
+
impact: "Catches catastrophic `rm -rf /` and Windows equivalents.",
|
|
1607
1630
|
description: "Prevent catastrophic deletions",
|
|
1608
1631
|
fn: blockRmRf,
|
|
1609
1632
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1619,6 +1642,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1619
1642
|
},
|
|
1620
1643
|
{
|
|
1621
1644
|
name: "block-failproofai-commands",
|
|
1645
|
+
displayTitle: "Tried to disable or modify failproofai itself",
|
|
1646
|
+
impact: "Prevents the agent from turning off the policies that protect you.",
|
|
1622
1647
|
description: "Block failproofai CLI commands and uninstallation",
|
|
1623
1648
|
fn: blockFailproofaiCommands,
|
|
1624
1649
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1627,6 +1652,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1627
1652
|
},
|
|
1628
1653
|
{
|
|
1629
1654
|
name: "block-kubectl",
|
|
1655
|
+
displayTitle: "Tried to run a Kubernetes command",
|
|
1656
|
+
impact: "kubectl can change live cluster state — gated unless allow-listed.",
|
|
1630
1657
|
description: "Block kubectl commands (Kubernetes cluster mutations)",
|
|
1631
1658
|
fn: blockKubectl,
|
|
1632
1659
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1642,6 +1669,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1642
1669
|
},
|
|
1643
1670
|
{
|
|
1644
1671
|
name: "block-terraform",
|
|
1672
|
+
displayTitle: "Tried to run a Terraform/OpenTofu command",
|
|
1673
|
+
impact: "Terraform mutates real infrastructure — gated unless allow-listed.",
|
|
1645
1674
|
description: "Block terraform and tofu (OpenTofu) commands",
|
|
1646
1675
|
fn: blockTerraform,
|
|
1647
1676
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1657,6 +1686,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1657
1686
|
},
|
|
1658
1687
|
{
|
|
1659
1688
|
name: "block-aws-cli",
|
|
1689
|
+
displayTitle: "Tried to run an AWS CLI command",
|
|
1690
|
+
impact: "AWS CLI can spend money or break prod — gated.",
|
|
1660
1691
|
description: "Block aws CLI commands",
|
|
1661
1692
|
fn: blockAwsCli,
|
|
1662
1693
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1672,6 +1703,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1672
1703
|
},
|
|
1673
1704
|
{
|
|
1674
1705
|
name: "block-gcloud",
|
|
1706
|
+
displayTitle: "Tried to run a Google Cloud command",
|
|
1707
|
+
impact: "gcloud can spend money or break prod — gated.",
|
|
1675
1708
|
description: "Block gcloud (Google Cloud) CLI commands",
|
|
1676
1709
|
fn: blockGcloud,
|
|
1677
1710
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1687,6 +1720,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1687
1720
|
},
|
|
1688
1721
|
{
|
|
1689
1722
|
name: "block-az-cli",
|
|
1723
|
+
displayTitle: "Tried to run an Azure CLI command",
|
|
1724
|
+
impact: "az can spend money or break prod — gated.",
|
|
1690
1725
|
description: "Block az (Azure) CLI commands",
|
|
1691
1726
|
fn: blockAzCli,
|
|
1692
1727
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1702,6 +1737,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1702
1737
|
},
|
|
1703
1738
|
{
|
|
1704
1739
|
name: "block-helm",
|
|
1740
|
+
displayTitle: "Tried to run a Helm command",
|
|
1741
|
+
impact: "Helm releases mutate cluster state — gated.",
|
|
1705
1742
|
description: "Block helm commands",
|
|
1706
1743
|
fn: blockHelm,
|
|
1707
1744
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1717,6 +1754,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1717
1754
|
},
|
|
1718
1755
|
{
|
|
1719
1756
|
name: "block-gh-pipeline",
|
|
1757
|
+
displayTitle: "Tried to run a privileged GitHub CLI pipeline command",
|
|
1758
|
+
impact: "Catches `gh workflow run`, `gh pr merge`, `gh secret set`, etc.",
|
|
1720
1759
|
description: "Block gh CLI pipeline-trigger subcommands (workflow run, run rerun/cancel, pr merge, release create/delete, cache delete, secret set/delete)",
|
|
1721
1760
|
fn: blockGhPipeline,
|
|
1722
1761
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1732,6 +1771,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1732
1771
|
},
|
|
1733
1772
|
{
|
|
1734
1773
|
name: "block-secrets-write",
|
|
1774
|
+
displayTitle: "Tried to write a secret-key file",
|
|
1775
|
+
impact: "Stops the agent from creating `.pem`, `id_rsa`, `credentials.json`, etc.",
|
|
1735
1776
|
description: "Block writing secret key files",
|
|
1736
1777
|
fn: blockSecretsWrite,
|
|
1737
1778
|
match: { events: ["PreToolUse"], toolNames: ["Write"] },
|
|
@@ -1747,6 +1788,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1747
1788
|
},
|
|
1748
1789
|
{
|
|
1749
1790
|
name: "block-push-master",
|
|
1791
|
+
displayTitle: "Tried to push directly to main/master",
|
|
1792
|
+
impact: "Direct pushes to a protected branch bypass review.",
|
|
1750
1793
|
description: "Block pushing to main/master",
|
|
1751
1794
|
fn: blockPushMaster,
|
|
1752
1795
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1762,6 +1805,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1762
1805
|
},
|
|
1763
1806
|
{
|
|
1764
1807
|
name: "block-force-push",
|
|
1808
|
+
displayTitle: "Tried to force-push",
|
|
1809
|
+
impact: "Force-pushes rewrite history and can clobber teammates' work.",
|
|
1765
1810
|
description: "Prevent force-pushing to any branch",
|
|
1766
1811
|
fn: blockForcePush,
|
|
1767
1812
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1770,6 +1815,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1770
1815
|
},
|
|
1771
1816
|
{
|
|
1772
1817
|
name: "block-work-on-main",
|
|
1818
|
+
displayTitle: "Tried to commit or merge on main/master",
|
|
1819
|
+
impact: "Work should land via PR — direct commits skip review.",
|
|
1773
1820
|
description: "Block git commits and merges on main/master branch",
|
|
1774
1821
|
fn: blockWorkOnMain,
|
|
1775
1822
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1785,6 +1832,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1785
1832
|
},
|
|
1786
1833
|
{
|
|
1787
1834
|
name: "warn-git-amend",
|
|
1835
|
+
displayTitle: "Used git commit --amend",
|
|
1836
|
+
impact: "Amending after a push rewrites history that others may have pulled.",
|
|
1788
1837
|
description: "Warns before amending git commits, which rewrites history",
|
|
1789
1838
|
fn: warnGitAmend,
|
|
1790
1839
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1793,6 +1842,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1793
1842
|
},
|
|
1794
1843
|
{
|
|
1795
1844
|
name: "warn-git-stash-drop",
|
|
1845
|
+
displayTitle: "Tried to drop or clear git stash",
|
|
1846
|
+
impact: "Stash deletions are permanent and silent.",
|
|
1796
1847
|
description: "Warns before permanently deleting stashed changes",
|
|
1797
1848
|
fn: warnGitStashDrop,
|
|
1798
1849
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1801,6 +1852,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1801
1852
|
},
|
|
1802
1853
|
{
|
|
1803
1854
|
name: "warn-all-files-staged",
|
|
1855
|
+
displayTitle: "Staged all files with git add -A / .",
|
|
1856
|
+
impact: "Wide stages routinely catch generated files or secrets you didn't intend to commit.",
|
|
1804
1857
|
description: "Warns before staging all working tree files with git add -A / . / --all",
|
|
1805
1858
|
fn: warnAllFilesStaged,
|
|
1806
1859
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1809,6 +1862,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1809
1862
|
},
|
|
1810
1863
|
{
|
|
1811
1864
|
name: "warn-destructive-sql",
|
|
1865
|
+
displayTitle: "Ran destructive SQL (DROP / TRUNCATE / DELETE without WHERE)",
|
|
1866
|
+
impact: "Easy way to wipe a table by accident.",
|
|
1812
1867
|
description: "Warn before executing destructive SQL (DROP/TRUNCATE/DELETE without WHERE) via database clients",
|
|
1813
1868
|
fn: warnDestructiveSql,
|
|
1814
1869
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1817,6 +1872,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1817
1872
|
},
|
|
1818
1873
|
{
|
|
1819
1874
|
name: "warn-schema-alteration",
|
|
1875
|
+
displayTitle: "Altered a database schema column",
|
|
1876
|
+
impact: "ALTER TABLE operations can lock tables and break readers.",
|
|
1820
1877
|
description: "Warns before SQL schema changes (ALTER TABLE with column or rename operations)",
|
|
1821
1878
|
fn: warnSchemaAlteration,
|
|
1822
1879
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1825,6 +1882,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1825
1882
|
},
|
|
1826
1883
|
{
|
|
1827
1884
|
name: "warn-package-publish",
|
|
1885
|
+
displayTitle: "Tried to publish a package",
|
|
1886
|
+
impact: "Publishes are irreversible — `npm publish` / `cargo publish` shouldn't happen without intent.",
|
|
1828
1887
|
description: "Warn before publishing packages to public registries (npm, PyPI, crates.io, RubyGems, etc.)",
|
|
1829
1888
|
fn: warnPackagePublish,
|
|
1830
1889
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1833,6 +1892,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1833
1892
|
},
|
|
1834
1893
|
{
|
|
1835
1894
|
name: "warn-global-package-install",
|
|
1895
|
+
displayTitle: "Installed a package globally",
|
|
1896
|
+
impact: "`npm i -g`, `cargo install`, `pip --user` pollute your machine outside the project.",
|
|
1836
1897
|
description: "Warns before installing packages globally (npm -g, cargo install, etc.)",
|
|
1837
1898
|
fn: warnGlobalPackageInstall,
|
|
1838
1899
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1841,6 +1902,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1841
1902
|
},
|
|
1842
1903
|
{
|
|
1843
1904
|
name: "prefer-package-manager",
|
|
1905
|
+
displayTitle: "Used a non-preferred package manager",
|
|
1906
|
+
impact: "Mixing package managers creates lockfile churn for your team.",
|
|
1844
1907
|
description: "Blocks non-preferred package managers and tells Claude to use an allowed one (e.g., uv instead of pip)",
|
|
1845
1908
|
fn: preferPackageManager,
|
|
1846
1909
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1861,6 +1924,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1861
1924
|
},
|
|
1862
1925
|
{
|
|
1863
1926
|
name: "warn-large-file-write",
|
|
1927
|
+
displayTitle: "Wrote a file larger than the configured threshold",
|
|
1928
|
+
impact: "Catches accidentally large file writes (logs, binaries, model dumps).",
|
|
1864
1929
|
description: "Warn before writing files larger than 1MB (configurable via thresholdKb param)",
|
|
1865
1930
|
fn: warnLargeFileWrite,
|
|
1866
1931
|
match: { events: ["PreToolUse"], toolNames: ["Write"] },
|
|
@@ -1876,6 +1941,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1876
1941
|
},
|
|
1877
1942
|
{
|
|
1878
1943
|
name: "warn-background-process",
|
|
1944
|
+
displayTitle: "Started a long-lived background process",
|
|
1945
|
+
impact: "Catches `nohup` / `&` / `screen` / `tmux` / `disown` patterns that the agent often forgets to clean up.",
|
|
1879
1946
|
description: "Warns before starting detached or background processes",
|
|
1880
1947
|
fn: warnBackgroundProcess,
|
|
1881
1948
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
@@ -1884,6 +1951,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1884
1951
|
},
|
|
1885
1952
|
{
|
|
1886
1953
|
name: "warn-repeated-tool-calls",
|
|
1954
|
+
displayTitle: "Called the same tool 3+ times with identical arguments",
|
|
1955
|
+
impact: "Usually a sign of a stuck loop burning tokens.",
|
|
1887
1956
|
description: "Warn when the same tool is called 3+ times with identical parameters",
|
|
1888
1957
|
fn: warnRepeatedToolCalls,
|
|
1889
1958
|
match: { events: ["PreToolUse"] },
|
|
@@ -1892,6 +1961,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1892
1961
|
},
|
|
1893
1962
|
{
|
|
1894
1963
|
name: "require-commit-before-stop",
|
|
1964
|
+
displayTitle: "Stopped with uncommitted changes",
|
|
1965
|
+
impact: "Work not in a commit is invisible to teammates and easy to lose.",
|
|
1895
1966
|
description: "Require all changes to be committed before Claude stops",
|
|
1896
1967
|
fn: requireCommitBeforeStop,
|
|
1897
1968
|
match: { events: ["Stop"] },
|
|
@@ -1900,6 +1971,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1900
1971
|
},
|
|
1901
1972
|
{
|
|
1902
1973
|
name: "require-push-before-stop",
|
|
1974
|
+
displayTitle: "Stopped with unpushed commits",
|
|
1975
|
+
impact: "Local-only commits won't trigger CI or be reviewable.",
|
|
1903
1976
|
description: "Require all commits to be pushed to remote before Claude stops",
|
|
1904
1977
|
fn: requirePushBeforeStop,
|
|
1905
1978
|
match: { events: ["Stop"] },
|
|
@@ -1920,6 +1993,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1920
1993
|
},
|
|
1921
1994
|
{
|
|
1922
1995
|
name: "require-pr-before-stop",
|
|
1996
|
+
displayTitle: "Stopped without a PR for the branch",
|
|
1997
|
+
impact: "Branches without PRs don't get reviewed.",
|
|
1923
1998
|
description: "Require a pull request to exist for the current branch before Claude stops",
|
|
1924
1999
|
fn: requirePrBeforeStop,
|
|
1925
2000
|
match: { events: ["Stop"] },
|
|
@@ -1935,6 +2010,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1935
2010
|
},
|
|
1936
2011
|
{
|
|
1937
2012
|
name: "require-no-conflicts-before-stop",
|
|
2013
|
+
displayTitle: "Stopped with a branch that conflicts with main",
|
|
2014
|
+
impact: "Conflicting branches can't merge — surface them early.",
|
|
1938
2015
|
description: "Require the current branch to merge cleanly with the base branch before Claude stops",
|
|
1939
2016
|
fn: requireNoConflictsBeforeStop,
|
|
1940
2017
|
match: { events: ["Stop"] },
|
|
@@ -1950,6 +2027,8 @@ export const BUILTIN_POLICIES: BuiltinPolicyDefinition[] = [
|
|
|
1950
2027
|
},
|
|
1951
2028
|
{
|
|
1952
2029
|
name: "require-ci-green-before-stop",
|
|
2030
|
+
displayTitle: "Stopped with failing CI",
|
|
2031
|
+
impact: "Failing CI blocks deploy.",
|
|
1953
2032
|
description: "Require CI checks to pass on the current HEAD commit before Claude stops (ignores stale runs on prior commits)",
|
|
1954
2033
|
fn: requireCiGreenBeforeStop,
|
|
1955
2034
|
match: { events: ["Stop"] },
|
|
@@ -18,6 +18,8 @@ import { hookLogWarn, hookLogError, hookLogInfo } from "./hook-logger";
|
|
|
18
18
|
import { getCustomHooks, clearCustomHooks } from "./custom-hooks-registry";
|
|
19
19
|
import { findDistIndex, rewriteFileTree, TMP_SUFFIX, cleanupTmpFiles } from "./loader-utils";
|
|
20
20
|
import { findProjectConfigDir } from "./hooks-config";
|
|
21
|
+
import { trackHookEvent } from "./hook-telemetry";
|
|
22
|
+
import { getInstanceId } from "../../lib/telemetry-id";
|
|
21
23
|
import type { CustomHook } from "./policy-types";
|
|
22
24
|
|
|
23
25
|
const LOADING_KEY = "__FAILPROOFAI_LOADING_HOOKS__";
|
|
@@ -46,7 +48,10 @@ export function discoverPolicyFiles(dir: string): string[] {
|
|
|
46
48
|
* Load a single policy file into the globalThis custom hooks registry.
|
|
47
49
|
* Does NOT clear the registry — caller is responsible for that.
|
|
48
50
|
*/
|
|
49
|
-
async function loadSingleFile(
|
|
51
|
+
async function loadSingleFile(
|
|
52
|
+
absPath: string,
|
|
53
|
+
opts?: { strict?: boolean; conventionScope?: "project" | "user" },
|
|
54
|
+
): Promise<void> {
|
|
50
55
|
const g = globalThis as Record<string, unknown>;
|
|
51
56
|
g[LOADING_KEY] = true;
|
|
52
57
|
|
|
@@ -62,6 +67,17 @@ async function loadSingleFile(absPath: string, opts?: { strict?: boolean }): Pro
|
|
|
62
67
|
await import(/* webpackIgnore: true */ fileUrl);
|
|
63
68
|
} catch (err) {
|
|
64
69
|
const msg = err instanceof Error ? err.message : String(err);
|
|
70
|
+
const errorType = /Cannot find module|MODULE_NOT_FOUND|ENOENT/i.test(msg)
|
|
71
|
+
? "module_not_found"
|
|
72
|
+
: /SyntaxError|Unexpected token/i.test(msg)
|
|
73
|
+
? "syntax_error"
|
|
74
|
+
: "runtime_error";
|
|
75
|
+
void trackHookEvent(getInstanceId(), "custom_hooks_load_error", {
|
|
76
|
+
error_type: errorType,
|
|
77
|
+
is_convention: !!opts?.conventionScope,
|
|
78
|
+
convention_scope: opts?.conventionScope ?? null,
|
|
79
|
+
file_basename: basename(absPath),
|
|
80
|
+
});
|
|
65
81
|
if (opts?.strict) throw new Error(`Failed to load custom hooks from ${absPath}: ${msg}`);
|
|
66
82
|
hookLogError(`failed to load custom hooks from ${absPath}: ${msg}`);
|
|
67
83
|
} finally {
|
|
@@ -148,7 +164,7 @@ export async function loadAllCustomHooks(
|
|
|
148
164
|
const projectFiles = discoverPolicyFiles(projectDir);
|
|
149
165
|
for (const file of projectFiles) {
|
|
150
166
|
const hooksBefore = getCustomHooks().length;
|
|
151
|
-
await loadSingleFile(file);
|
|
167
|
+
await loadSingleFile(file, { conventionScope: "project" });
|
|
152
168
|
const newHooks = getCustomHooks().slice(hooksBefore);
|
|
153
169
|
if (newHooks.length > 0) {
|
|
154
170
|
conventionSources.push({
|
|
@@ -164,7 +180,7 @@ export async function loadAllCustomHooks(
|
|
|
164
180
|
const userFiles = discoverPolicyFiles(userDir);
|
|
165
181
|
for (const file of userFiles) {
|
|
166
182
|
const hooksBefore = getCustomHooks().length;
|
|
167
|
-
await loadSingleFile(file);
|
|
183
|
+
await loadSingleFile(file, { conventionScope: "user" });
|
|
168
184
|
const newHooks = getCustomHooks().slice(hooksBefore);
|
|
169
185
|
if (newHooks.length > 0) {
|
|
170
186
|
conventionSources.push({
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* First-run nudge for `failproofai` (no-args invocation).
|
|
3
|
+
*
|
|
4
|
+
* Fires when a user runs the bare CLI without having installed any policies on
|
|
5
|
+
* any detected agent CLI. PostHog data showed only ~10% of npm-installed users
|
|
6
|
+
* ran `failproofai policies --install`; this prompt closes the awareness gap
|
|
7
|
+
* by offering to run that install inline.
|
|
8
|
+
*
|
|
9
|
+
* The hooks themselves are the sentinel — if any are installed for any
|
|
10
|
+
* detected CLI, we never prompt again. No separate state file needed.
|
|
11
|
+
*
|
|
12
|
+
* Honors `FAILPROOFAI_NO_FIRST_RUN=1` for opt-out, falls back to a short
|
|
13
|
+
* stderr hint in non-TTY contexts (CI, piped invocations).
|
|
14
|
+
*/
|
|
15
|
+
import * as readline from "node:readline";
|
|
16
|
+
|
|
17
|
+
import { detectInstalledClis, getIntegration } from "./integrations";
|
|
18
|
+
import { installHooks } from "./manager";
|
|
19
|
+
import { trackHookEvent } from "./hook-telemetry";
|
|
20
|
+
import { getInstanceId } from "../../lib/telemetry-id";
|
|
21
|
+
import type { IntegrationType } from "./types";
|
|
22
|
+
|
|
23
|
+
type TTYIn = NodeJS.ReadableStream & { isTTY?: boolean };
|
|
24
|
+
type TTYOut = NodeJS.WritableStream & { isTTY?: boolean };
|
|
25
|
+
|
|
26
|
+
export interface FirstRunNudgeOptions {
|
|
27
|
+
stdin?: TTYIn;
|
|
28
|
+
stdout?: TTYOut;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function emit(event: string, props: Record<string, unknown>): Promise<void> {
|
|
32
|
+
try {
|
|
33
|
+
await trackHookEvent(getInstanceId(), event, props);
|
|
34
|
+
} catch {
|
|
35
|
+
// Telemetry must never break first-run UX.
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function anyHooksInstalled(detected: IntegrationType[]): boolean {
|
|
40
|
+
for (const id of detected) {
|
|
41
|
+
const integration = getIntegration(id);
|
|
42
|
+
for (const scope of integration.scopes) {
|
|
43
|
+
try {
|
|
44
|
+
if (integration.hooksInstalledInSettings(scope)) return true;
|
|
45
|
+
} catch {
|
|
46
|
+
// A broken settings file shouldn't suppress the nudge.
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function clisLabel(detected: IntegrationType[]): string {
|
|
54
|
+
return detected.map((id) => getIntegration(id).displayName).join(", ");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function promptYesNo(
|
|
58
|
+
stdin: TTYIn,
|
|
59
|
+
stdout: TTYOut,
|
|
60
|
+
): Promise<"yes" | "no" | "sigint"> {
|
|
61
|
+
return new Promise((resolve) => {
|
|
62
|
+
const rl = readline.createInterface({ input: stdin, output: stdout });
|
|
63
|
+
let settled = false;
|
|
64
|
+
const finish = (answer: "yes" | "no" | "sigint") => {
|
|
65
|
+
if (settled) return;
|
|
66
|
+
settled = true;
|
|
67
|
+
rl.close();
|
|
68
|
+
resolve(answer);
|
|
69
|
+
};
|
|
70
|
+
rl.on("SIGINT", () => finish("sigint"));
|
|
71
|
+
rl.question("Install policies now? [Y/n] ", (raw) => {
|
|
72
|
+
const a = (raw ?? "").trim().toLowerCase();
|
|
73
|
+
if (a === "" || a === "y" || a === "yes") finish("yes");
|
|
74
|
+
else finish("no");
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export async function maybeRunFirstRunNudge(opts: FirstRunNudgeOptions = {}): Promise<void> {
|
|
80
|
+
if (process.env.FAILPROOFAI_NO_FIRST_RUN === "1") return;
|
|
81
|
+
|
|
82
|
+
const stdin: TTYIn = opts.stdin ?? process.stdin;
|
|
83
|
+
const stdout: TTYOut = opts.stdout ?? process.stdout;
|
|
84
|
+
|
|
85
|
+
let detected: IntegrationType[];
|
|
86
|
+
try {
|
|
87
|
+
detected = detectInstalledClis();
|
|
88
|
+
} catch {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (detected.length === 0) return;
|
|
92
|
+
|
|
93
|
+
if (anyHooksInstalled(detected)) return;
|
|
94
|
+
|
|
95
|
+
const detectedProps = { detected_clis: detected, detected_count: detected.length };
|
|
96
|
+
|
|
97
|
+
if (!stdin.isTTY || !stdout.isTTY) {
|
|
98
|
+
stdout.write(
|
|
99
|
+
`\n[failproofai] No policies are installed. Run \`failproofai policies --install\` to set them up.\n` +
|
|
100
|
+
`[failproofai] Launching dashboard…\n\n`,
|
|
101
|
+
);
|
|
102
|
+
await emit("first_run_nudge_skipped_noninteractive", detectedProps);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
stdout.write(
|
|
107
|
+
`\n┌─ Failproof AI — first-run setup ────────────────────────────────────\n` +
|
|
108
|
+
`│ Detected agent CLI(s): ${clisLabel(detected)}\n` +
|
|
109
|
+
`│ Policies block unsafe actions (sudo, rm -rf /, secret leaks, …)\n` +
|
|
110
|
+
`│ before your agent runs them. Nothing is installed yet.\n` +
|
|
111
|
+
`└──────────────────────────────────────────────────────────────────────\n\n` +
|
|
112
|
+
` Disable this prompt anytime: FAILPROOFAI_NO_FIRST_RUN=1\n\n`,
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
await emit("first_run_nudge_shown", detectedProps);
|
|
116
|
+
|
|
117
|
+
const answer = await promptYesNo(stdin, stdout);
|
|
118
|
+
|
|
119
|
+
if (answer === "sigint") {
|
|
120
|
+
await emit("first_run_nudge_declined", { ...detectedProps, reason: "sigint" });
|
|
121
|
+
process.exit(130);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (answer === "no") {
|
|
125
|
+
await emit("first_run_nudge_declined", { ...detectedProps, reason: "user_no" });
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
await emit("first_run_nudge_accepted", {
|
|
130
|
+
...detectedProps,
|
|
131
|
+
target_scope: "user",
|
|
132
|
+
source: "first-run-nudge",
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
await installHooks(
|
|
136
|
+
undefined,
|
|
137
|
+
"user",
|
|
138
|
+
undefined,
|
|
139
|
+
false,
|
|
140
|
+
"first-run-nudge",
|
|
141
|
+
undefined,
|
|
142
|
+
false,
|
|
143
|
+
detected,
|
|
144
|
+
);
|
|
145
|
+
process.exit(0);
|
|
146
|
+
}
|