failproofai 0.0.13 → 0.0.14-beta.0
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/.factory/hooks.json +112 -0
- 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 +1 -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 +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- 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/invite/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/run/route.js +3 -3
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +2 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- 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 -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 +1 -1
- 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 +3 -2
- 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 +5 -3
- 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 +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]__0--lkk6._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-219ec._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__04_h-a5._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06cuf1y._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08w4wmd._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g6bbuw._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jllheg._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jnjf2t._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q-v9z2._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q0qzx1._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q2nbsl._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rv7m0k._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xuaoik._.js +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__16le-kd._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__17g9wh7._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1d9qen3._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ffkmds._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1fwl2mz._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1legmza._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1mrihkj._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1myjm-d._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qb590j._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qxztj-._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1shcqgr._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1xuedea._.js +3 -0
- package/.next/standalone/.next/server/chunks/{_1z062h5._.js → _1vslkoe._.js} +2 -2
- package/.next/standalone/.next/server/chunks/lib_factory-projects_ts_1eo_bk-._.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_openclaw-projects_ts_0gc-p24._.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_17k9e3w.js +24 -12
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00cz9as._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__015_i4t._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__030k0c6._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__03lv-pe._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__042d3cd._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__05r_17v._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__07iom4f._.js → [root-of-the-server]__07qfsfa._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09q1168._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e2l3c1._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ge8e7w._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h12me5._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0hci7t3._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0hdsupo._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0p84xee._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qeuy9c._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s89hoe._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ynf7tx._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11rtg6s._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__14dd6h8._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__170799-._.js +12 -9
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__17ai7sy._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1d8omgc._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1dky4g0._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1nq7ivq._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1tkjqka._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__212nf49._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_05whahf._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0_9_ytf._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_11_p9y8._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0ul5rf_._.js → _1_ozgif._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_1p0-leb._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/lib_0xkhw_v._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/lib_antigravity-projects_ts_0_6zf11._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/lib_devin-projects_ts_0a64qdy._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/lib_factory-projects_ts_1uyaahq._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/lib_goose-projects_ts_0zkscri._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/lib_openclaw-projects_ts_0qxq3bp._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_html-to-image_es_index_13p7zob.js → node_modules_html-to-image_es_index_0g5r64e.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0-uvagv.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_03c7gi5.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_09p-8om.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0v-kfiu.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/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 +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1j6dd-e.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1sa65r-.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1ezd2jf._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1tnuifj._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- 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 +10 -10
- package/.next/standalone/.next/static/chunks/{23c7v2svx90dp.js → 003uz088wbmz7.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0vc0eak148vo6.js → 0405htbxay9vd.js} +1 -1
- package/.next/standalone/.next/static/chunks/0iinhn4417nk1.js +1 -0
- package/.next/standalone/.next/static/chunks/1374x9bv_s_vg.js +6 -0
- package/.next/standalone/.next/static/chunks/{30ysv-_8jj052.js → 17sdztgbcc0fi.js} +1 -1
- package/.next/standalone/.next/static/chunks/{2cejn75gug3j8.js → 2m_tbl39fcedn.js} +1 -1
- package/.next/standalone/.next/static/chunks/{36wdtkgdf0zrd.js → 2o3ql0n5owqsw.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0wtagd8a5gwq-.js → 2ufuwhv03yvtb.js} +1 -1
- package/.next/standalone/.next/static/chunks/35-90m9py64d4.js +1 -0
- package/.next/standalone/.next/static/chunks/3r--yyjkp9_7b.css +2 -0
- package/.next/standalone/.next/static/chunks/43weu8f59tlix.js +1 -0
- package/.next/standalone/.next/static/chunks/{05apzuand0c22.js → 454dyizqik6t9.js} +2 -2
- package/.next/standalone/app/api/audit/run/route.ts +2 -0
- package/.next/standalone/app/audit/_components/empty-state.tsx +1 -1
- package/.next/standalone/app/globals.css +25 -1
- package/.next/standalone/app/policies/hooks-client.tsx +2 -4
- package/.next/standalone/app/project/[name]/page.tsx +30 -10
- package/.next/standalone/app/project/[name]/session/[sessionId]/page.tsx +71 -21
- package/.next/standalone/assets/logos/antigravity.svg +1 -0
- package/.next/standalone/assets/logos/devin.svg +1 -0
- package/.next/standalone/assets/logos/factory-dark.png +0 -0
- package/.next/standalone/assets/logos/factory-light.png +0 -0
- package/.next/standalone/assets/logos/goose-dark.svg +1 -0
- package/.next/standalone/assets/logos/goose-light.svg +1 -0
- package/.next/standalone/assets/logos/openclaw.svg +22 -0
- package/.next/standalone/components/navbar.tsx +5 -11
- package/.next/standalone/components/reach-developers.tsx +1 -1
- package/.next/standalone/lib/antigravity-projects.ts +224 -0
- package/.next/standalone/lib/antigravity-sessions.ts +283 -0
- package/.next/standalone/lib/cli-registry.ts +26 -6
- package/.next/standalone/lib/devin-projects.ts +141 -0
- package/.next/standalone/lib/devin-sessions.ts +343 -0
- package/.next/standalone/lib/download-session.ts +56 -5
- package/.next/standalone/lib/factory-projects.ts +109 -0
- package/.next/standalone/lib/factory-sessions.ts +312 -0
- package/.next/standalone/lib/goose-projects.ts +148 -0
- package/.next/standalone/lib/goose-sessions.ts +296 -0
- package/.next/standalone/lib/openclaw-projects.ts +182 -0
- package/.next/standalone/lib/openclaw-sessions.ts +284 -0
- package/.next/standalone/lib/projects.ts +33 -9
- package/.next/standalone/lib/telemetry-sanitize.ts +43 -0
- package/.next/standalone/openclaw-plugin/index.js +223 -0
- package/.next/standalone/openclaw-plugin/openclaw.plugin.json +6 -0
- package/.next/standalone/openclaw-plugin/package.json +12 -0
- package/.next/standalone/package.json +2 -1
- package/.next/standalone/server.js +1 -1
- package/README.md +105 -57
- package/bin/failproofai.mjs +87 -29
- package/dist/cli.mjs +12803 -9809
- package/lib/antigravity-projects.ts +224 -0
- package/lib/antigravity-sessions.ts +283 -0
- package/lib/cli-registry.ts +26 -6
- package/lib/devin-projects.ts +141 -0
- package/lib/devin-sessions.ts +343 -0
- package/lib/download-session.ts +56 -5
- package/lib/factory-projects.ts +109 -0
- package/lib/factory-sessions.ts +312 -0
- package/lib/goose-projects.ts +148 -0
- package/lib/goose-sessions.ts +296 -0
- package/lib/openclaw-projects.ts +182 -0
- package/lib/openclaw-sessions.ts +284 -0
- package/lib/projects.ts +33 -9
- package/lib/telemetry-sanitize.ts +43 -0
- package/openclaw-plugin/index.js +223 -0
- package/openclaw-plugin/openclaw.plugin.json +6 -0
- package/openclaw-plugin/package.json +12 -0
- package/package.json +2 -1
- package/scripts/launch.ts +4 -8
- package/scripts/postinstall.mjs +3 -4
- package/scripts/sync-agent-cli-harnesses-prompt.md +7 -10
- package/scripts/translate-docs/cli.ts +73 -52
- package/scripts/translate-docs/config.ts +57 -13
- package/scripts/translate-docs/mdx-translator.ts +51 -31
- package/scripts/translate-docs/mintlify-nav.ts +91 -10
- package/scripts/translate-docs/types.ts +3 -0
- package/src/audit/cli-adapters/antigravity.ts +87 -0
- package/src/audit/cli-adapters/devin.ts +53 -0
- package/src/audit/cli-adapters/factory.ts +75 -0
- package/src/audit/cli-adapters/goose.ts +53 -0
- package/src/audit/cli-adapters/index.ts +30 -6
- package/src/audit/cli-adapters/openclaw.ts +56 -0
- package/src/audit/cli.ts +44 -1
- package/src/audit/report.ts +1 -1
- package/src/audit/types.ts +1 -1
- package/src/hooks/builtin-policies.ts +5 -5
- package/src/hooks/configure-wizard.ts +356 -0
- package/src/hooks/handler.ts +283 -218
- package/src/hooks/hook-telemetry.ts +43 -3
- package/src/hooks/install-prompt.ts +92 -173
- package/src/hooks/integrations.ts +739 -138
- package/src/hooks/manager.ts +46 -2
- package/src/hooks/policy-evaluator.ts +301 -121
- package/src/hooks/policy-presets.ts +71 -0
- package/src/hooks/resolve-cwd.ts +1 -1
- package/src/hooks/resolve-permission-mode.ts +1 -5
- package/src/hooks/resolve-transcript-path.ts +25 -7
- package/src/hooks/tool-name-canonicalize.ts +36 -3
- package/src/hooks/tui.ts +578 -0
- package/src/hooks/types.ts +447 -109
- package/.next/standalone/.gemini/settings.json +0 -147
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cag8qd._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cefjd9._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ekj92q._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__12v-lma._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__136y39g._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13h8pzr._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1hgv_75._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04bqvos._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dqgs96._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0q5rfxg._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qukut7._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__108slqn._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ql-mch._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_11v0g3z._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/lib_gemini-projects_ts_1c7bgx-._.js +0 -3
- package/.next/standalone/.next/static/chunks/0fa7j157kg9_d.js +0 -1
- package/.next/standalone/.next/static/chunks/0nrah-qv6smeg.js +0 -6
- package/.next/standalone/.next/static/chunks/1c8i78p7t1i-5.js +0 -1
- package/.next/standalone/.next/static/chunks/25qr0e6ez0ei0.js +0 -1
- package/.next/standalone/.next/static/chunks/25s52un3k_wht.css +0 -2
- package/.next/standalone/assets/logos/gemini-dark.svg +0 -13
- package/.next/standalone/assets/logos/gemini-light.svg +0 -13
- package/.next/standalone/lib/gemini-projects.ts +0 -243
- package/.next/standalone/lib/gemini-sessions.ts +0 -365
- package/lib/gemini-projects.ts +0 -243
- package/lib/gemini-sessions.ts +0 -365
- package/src/audit/cli-adapters/gemini.ts +0 -51
- package/src/hooks/first-run-nudge.ts +0 -146
- /package/.next/standalone/.next/static/{kmzdjTLVs6LqsfyOaUf69 → MNJWFb2jLRrxRKGFNK6Hy}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{kmzdjTLVs6LqsfyOaUf69 → MNJWFb2jLRrxRKGFNK6Hy}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{kmzdjTLVs6LqsfyOaUf69 → MNJWFb2jLRrxRKGFNK6Hy}/_ssgManifest.js +0 -0
|
@@ -9,7 +9,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
|
|
|
9
9
|
const hostname = process.env.HOSTNAME || '0.0.0.0'
|
|
10
10
|
|
|
11
11
|
let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
|
|
12
|
-
const nextConfig = {"env":{"NEXT_PUBLIC_APP_VERSION":"0.0.
|
|
12
|
+
const nextConfig = {"env":{"NEXT_PUBLIC_APP_VERSION":"0.0.14-beta.0"},"typescript":{"ignoreBuildErrors":false},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":true,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/failproofai/failproofai","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":false,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"partialFallbacks":false,"dynamicOnHover":false,"varyParams":false,"prefetchInlining":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","outputFileTracingExcludes":{"*":["node_modules/@img/**","node_modules/sharp/**"]},"turbopack":{"root":"/home/runner/work/failproofai/failproofai"},"distDirRoot":".next"}
|
|
13
13
|
|
|
14
14
|
process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
|
|
15
15
|
|
package/README.md
CHANGED
|
@@ -25,65 +25,113 @@ before they become incidents. Zero latency. Runs locally.
|
|
|
25
25
|
|
|
26
26
|
## Supported agent CLIs
|
|
27
27
|
|
|
28
|
-
<
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
</
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
</
|
|
54
|
-
<
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
<
|
|
71
|
-
<
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
28
|
+
<!-- A 6-column table instead of inline <img> runs: table columns never re-wrap,
|
|
29
|
+
so the grid stays 2×6 at any window width (scrolling on very narrow screens
|
|
30
|
+
instead of collapsing into ragged orphan rows). -->
|
|
31
|
+
<table align="center">
|
|
32
|
+
<tr>
|
|
33
|
+
<td align="center" width="96">
|
|
34
|
+
<a href="https://claude.com/claude-code" title="Claude Code">
|
|
35
|
+
<img src="assets/logos/claude.svg" alt="Claude Code" width="56" height="56" />
|
|
36
|
+
</a>
|
|
37
|
+
</td>
|
|
38
|
+
<td align="center" width="96">
|
|
39
|
+
<a href="https://learn.chatgpt.com" title="OpenAI Codex">
|
|
40
|
+
<picture>
|
|
41
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/logos/openai-dark.svg" />
|
|
42
|
+
<img src="assets/logos/openai-light.svg" alt="OpenAI Codex" width="56" height="56" />
|
|
43
|
+
</picture>
|
|
44
|
+
</a>
|
|
45
|
+
</td>
|
|
46
|
+
<td align="center" width="96">
|
|
47
|
+
<a href="https://github.com/features/copilot/cli" title="GitHub Copilot CLI">
|
|
48
|
+
<picture>
|
|
49
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/logos/copilot-dark.svg" />
|
|
50
|
+
<img src="assets/logos/copilot-light.svg" alt="GitHub Copilot" width="56" height="56" />
|
|
51
|
+
</picture>
|
|
52
|
+
</a>
|
|
53
|
+
</td>
|
|
54
|
+
<td align="center" width="96">
|
|
55
|
+
<a href="https://cursor.com" title="Cursor Agent CLI">
|
|
56
|
+
<picture>
|
|
57
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/logos/cursor-dark.svg" />
|
|
58
|
+
<img src="assets/logos/cursor-light.svg" alt="Cursor Agent" width="56" height="56" />
|
|
59
|
+
</picture>
|
|
60
|
+
</a>
|
|
61
|
+
</td>
|
|
62
|
+
<td align="center" width="96">
|
|
63
|
+
<a href="https://opencode.ai/" title="OpenCode">
|
|
64
|
+
<picture>
|
|
65
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/logos/opencode-dark.svg" />
|
|
66
|
+
<img src="assets/logos/opencode-light.svg" alt="OpenCode" width="56" height="56" />
|
|
67
|
+
</picture>
|
|
68
|
+
</a>
|
|
69
|
+
</td>
|
|
70
|
+
<td align="center" width="96">
|
|
71
|
+
<a href="https://pi.dev/" title="Pi (pi-coding-agent)">
|
|
72
|
+
<picture>
|
|
73
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/logos/pi-dark.svg" />
|
|
74
|
+
<img src="assets/logos/pi-light.svg" alt="Pi" width="56" height="56" />
|
|
75
|
+
</picture>
|
|
76
|
+
</a>
|
|
77
|
+
</td>
|
|
78
|
+
</tr>
|
|
79
|
+
<tr>
|
|
80
|
+
<td align="center" width="96">
|
|
81
|
+
<a href="https://hermes-agent.nousresearch.com/" title="Hermes (hermes-agent)">
|
|
82
|
+
<picture>
|
|
83
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/logos/hermes-dark.svg" />
|
|
84
|
+
<img src="assets/logos/hermes-light.svg" alt="Hermes" width="56" height="56" />
|
|
85
|
+
</picture>
|
|
86
|
+
</a>
|
|
87
|
+
</td>
|
|
88
|
+
<td align="center" width="96">
|
|
89
|
+
<a href="https://openclaw.ai/" title="OpenClaw (openclaw gateway)">
|
|
90
|
+
<img src="assets/logos/openclaw.svg" alt="OpenClaw" width="56" height="56" />
|
|
91
|
+
</a>
|
|
92
|
+
</td>
|
|
93
|
+
<td align="center" width="96">
|
|
94
|
+
<a href="https://factory.ai/" title="Factory Droid (droid)">
|
|
95
|
+
<picture>
|
|
96
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/logos/factory-dark.png" />
|
|
97
|
+
<img src="assets/logos/factory-light.png" alt="Factory Droid" width="56" height="56" />
|
|
98
|
+
</picture>
|
|
99
|
+
</a>
|
|
100
|
+
</td>
|
|
101
|
+
<td align="center" width="96">
|
|
102
|
+
<a href="https://devin.ai" title="Devin CLI (Cognition)">
|
|
103
|
+
<img src="assets/logos/devin.svg" alt="Devin CLI" width="56" height="56" />
|
|
104
|
+
</a>
|
|
105
|
+
</td>
|
|
106
|
+
<td align="center" width="96">
|
|
107
|
+
<a href="https://antigravity.google" title="Antigravity CLI (agy)">
|
|
108
|
+
<img src="assets/logos/antigravity.svg" alt="Antigravity CLI" width="56" height="56" />
|
|
109
|
+
</a>
|
|
110
|
+
</td>
|
|
111
|
+
<td align="center" width="96">
|
|
112
|
+
<a href="https://goose-docs.ai/" title="Goose (codename goose)">
|
|
113
|
+
<picture>
|
|
114
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/logos/goose-dark.svg" />
|
|
115
|
+
<img src="assets/logos/goose-light.svg" alt="Goose" width="56" height="56" />
|
|
116
|
+
</picture>
|
|
117
|
+
</a>
|
|
118
|
+
</td>
|
|
119
|
+
</tr>
|
|
120
|
+
</table>
|
|
121
|
+
|
|
122
|
+
> Install hooks for one or any combination: `failproofai policies --install --cli opencode pi` (or `--cli claude codex copilot cursor opencode pi hermes openclaw factory devin antigravity goose`). Omit `--cli` to auto-detect installed CLIs and prompt.
|
|
85
123
|
>
|
|
86
124
|
> **Hermes** (hermes-agent, a Slack/Telegram gateway) is supported for both **live-hook enforcement** (`--cli hermes` — one install intercepts tool calls from every platform and subagent) and offline **audit** replay of its gateway sessions from the single `~/.hermes/state.db`.
|
|
125
|
+
>
|
|
126
|
+
> **OpenClaw** (openclaw gateway, a self-hosted multi-channel assistant) is supported for both **live-hook enforcement** (`--cli openclaw`, user-scope) and offline **audit** replay of its JSONL sessions (`~/.openclaw/agents/<id>/sessions/*.jsonl`). Enforcement uses OpenClaw's **in-process plugin hooks** (a shipped `openclaw-plugin/` that async-spawns failproofai — its file-based internal hooks are observation-only and can't block): `before_tool_call` blocks a tool, and `before_agent_finalize` is a real turn-end gate, so the `require-*-before-stop` builtins enforce.
|
|
127
|
+
>
|
|
128
|
+
> **Factory Droid** (`droid`) is supported for both **live-hook enforcement** (`--cli factory`, user + project scope) and offline **audit** replay of its on-disk JSONL sessions. droid blocks tool calls off hook **exit code 2** (not a JSON decision) and honors `{decision:"block"}` only on the turn-end `Stop` event — failproofai emits the right shape per event automatically.
|
|
129
|
+
>
|
|
130
|
+
> **Devin CLI** (`devin`, Cognition) is supported for both **live-hook enforcement** (`--cli devin`, user + project scope) and offline **audit** replay of its SQLite sessions (`~/.local/share/devin/cli/sessions.db`). Devin is a **pure Claude-clone** — same event names, same snake_case payload, same `"hooks"`-wrapper config (`~/.config/devin/config.json` / `<cwd>/.devin/config.json`) — blocking via `{decision:"block"}` JSON on every event.
|
|
131
|
+
>
|
|
132
|
+
> **Antigravity CLI** (`agy`) is supported for both **live-hook enforcement** (`--cli antigravity`, user + project scope) and offline **audit** replay of its plain-JSONL sessions (`~/.gemini/antigravity-cli/brain/<id>/…/transcript_full.jsonl`). Antigravity has its **own** contract (not a Claude-clone): a **named-hook** `hooks.json` schema (`~/.gemini/config/hooks.json` / `<cwd>/.agents/hooks.json`), a camelCase stdin payload that failproofai normalizes, and its own response shapes — `{decision:"deny"}` to block a tool, `{decision:"continue"}` to force another turn at `Stop`, `{injectSteps}` to inject a reminder before the model runs.
|
|
133
|
+
>
|
|
134
|
+
> **Goose** (codename goose, Block) is supported for both **live-hook enforcement** (`--cli goose`, user + project scope) and offline **audit** replay of its SQLite sessions (`~/.local/share/goose/sessions/sessions.db`). Enforcement uses Goose's **hooks** system (the cross-agent **Open Plugins** spec) — the installer just drops a plugin dir at `~/.agents/plugins/failproofai/` and Goose auto-discovers it. Blocking is `{"decision":"block"}` JSON on the `PreToolUse` event (which fires for the shell tool and inside delegated subagents), verified live against goose v1.43.0; Goose has no turn-end `Stop` event, so the `require-*-before-stop` builtins don't apply (as with Hermes).
|
|
87
135
|
|
|
88
136
|
---
|
|
89
137
|
|
package/bin/failproofai.mjs
CHANGED
|
@@ -36,6 +36,9 @@ const args = process.argv.slice(2);
|
|
|
36
36
|
|
|
37
37
|
// Normalize 'p' → 'policies' (shorthand alias)
|
|
38
38
|
if (args[0] === "p") args[0] = "policies";
|
|
39
|
+
// Normalize 'configure' / 'setup' → 'config' (aliases), so every later check
|
|
40
|
+
// (SUBCOMMANDS, dispatch) mentions only the canonical name.
|
|
41
|
+
if (args[0] === "configure" || args[0] === "setup") args[0] = "config";
|
|
39
42
|
|
|
40
43
|
// Lightweight telemetry helper for CLI lifecycle events. Lazy-loads to avoid
|
|
41
44
|
// pulling in the hook-telemetry / telemetry-id modules on the fast --hook path.
|
|
@@ -65,7 +68,7 @@ const hookIdx = args.indexOf("--hook");
|
|
|
65
68
|
if (hookIdx >= 0) {
|
|
66
69
|
if (!args[hookIdx + 1]) {
|
|
67
70
|
console.error("Error: Missing event type after --hook");
|
|
68
|
-
console.error("Usage: failproofai --hook <event> [--cli <claude|codex|copilot|cursor|opencode|pi|
|
|
71
|
+
console.error("Usage: failproofai --hook <event> [--cli <claude|codex|copilot|cursor|opencode|pi|hermes|openclaw|factory|devin|antigravity|goose>]");
|
|
69
72
|
process.exit(1);
|
|
70
73
|
}
|
|
71
74
|
const eventType = args[hookIdx + 1];
|
|
@@ -81,14 +84,20 @@ if (hookIdx >= 0) {
|
|
|
81
84
|
|| cliArg === "cursor"
|
|
82
85
|
|| cliArg === "opencode"
|
|
83
86
|
|| cliArg === "pi"
|
|
84
|
-
|| cliArg === "gemini"
|
|
85
87
|
|| cliArg === "hermes"
|
|
88
|
+
|| cliArg === "openclaw"
|
|
89
|
+
|| cliArg === "factory"
|
|
90
|
+
|| cliArg === "devin"
|
|
91
|
+
|| cliArg === "antigravity"
|
|
92
|
+
|| cliArg === "goose"
|
|
86
93
|
)
|
|
87
94
|
? cliArg
|
|
88
95
|
: "claude";
|
|
89
96
|
try {
|
|
90
97
|
const { handleHookEvent } = await import("../src/hooks/handler");
|
|
91
98
|
const exitCode = await handleHookEvent(eventType, cli);
|
|
99
|
+
// handleHookEvent already flushes its own telemetry before returning; this
|
|
100
|
+
// is the normal, reliable exit.
|
|
92
101
|
process.exit(exitCode);
|
|
93
102
|
} catch (err) {
|
|
94
103
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -97,6 +106,13 @@ if (hookIdx >= 0) {
|
|
|
97
106
|
cli,
|
|
98
107
|
error_type: err instanceof Error ? err.name : "unknown",
|
|
99
108
|
});
|
|
109
|
+
// handleHookEvent threw before its own flush ran, so any events it fired
|
|
110
|
+
// with `void trackHookEvent(...)` are still in flight — drain them (plus the
|
|
111
|
+
// hook_dispatch_error above) before exiting so they aren't dropped.
|
|
112
|
+
try {
|
|
113
|
+
const { flushHookTelemetry } = await import("../src/hooks/hook-telemetry");
|
|
114
|
+
await flushHookTelemetry();
|
|
115
|
+
} catch {}
|
|
100
116
|
console.error(`Unexpected error: ${msg}`);
|
|
101
117
|
process.exit(2);
|
|
102
118
|
}
|
|
@@ -109,7 +125,7 @@ if (hookIdx >= 0) {
|
|
|
109
125
|
*/
|
|
110
126
|
async function runCli() {
|
|
111
127
|
// --help / -h (only when not inside a subcommand that handles its own --help)
|
|
112
|
-
const SUBCOMMANDS = ["policies", "policy", "auth", "audit"];
|
|
128
|
+
const SUBCOMMANDS = ["policies", "policy", "auth", "audit", "config"];
|
|
113
129
|
if ((args.includes("--help") || args.includes("-h")) && !SUBCOMMANDS.includes(args[0])) {
|
|
114
130
|
const extraArgs = args.filter((a) => a !== "--help" && a !== "-h");
|
|
115
131
|
if (extraArgs.length > 0) {
|
|
@@ -123,6 +139,7 @@ USAGE
|
|
|
123
139
|
|
|
124
140
|
COMMANDS
|
|
125
141
|
(no args) Launch the policy dashboard
|
|
142
|
+
config Interactive setup — pick scope, agents & policies
|
|
126
143
|
|
|
127
144
|
policy add <name> Enable a single policy (see \`policy --help\`)
|
|
128
145
|
policy remove <name> Disable a single policy
|
|
@@ -130,18 +147,18 @@ COMMANDS
|
|
|
130
147
|
policies, p List all available policies and their status
|
|
131
148
|
policies --install, -i Enable policies in agent CLI settings
|
|
132
149
|
[names...] Specific policy names to enable
|
|
133
|
-
--cli claude|codex|copilot|cursor|opencode|pi|
|
|
150
|
+
--cli claude|codex|copilot|cursor|opencode|pi|hermes|openclaw|factory|devin|antigravity|goose
|
|
134
151
|
Agent CLI(s) to install for; space-separated
|
|
135
|
-
(e.g. --cli claude codex copilot cursor opencode pi
|
|
152
|
+
(e.g. --cli claude codex copilot cursor opencode pi hermes openclaw factory devin antigravity goose) or repeated.
|
|
136
153
|
Default: detect installed CLIs and prompt.
|
|
137
154
|
--scope user|project|local Config scope to write to (default: user)
|
|
138
|
-
(Codex / Copilot / Cursor / OpenCode / Pi
|
|
155
|
+
(Codex / Copilot / Cursor / OpenCode / Pi support user|project only)
|
|
139
156
|
--beta Include beta policies
|
|
140
157
|
--custom, -c <path> Path to a JS file of custom policies
|
|
141
158
|
|
|
142
159
|
policies --uninstall, -u Disable policies or remove hooks
|
|
143
160
|
[names...] Specific policy names to disable
|
|
144
|
-
--cli claude|codex|copilot|cursor|opencode|pi|
|
|
161
|
+
--cli claude|codex|copilot|cursor|opencode|pi|hermes|openclaw|factory|devin|antigravity|goose
|
|
145
162
|
Agent CLI(s) to uninstall from
|
|
146
163
|
--scope user|project|local|all Config scope to remove from (default: user)
|
|
147
164
|
--beta Remove only beta policies
|
|
@@ -176,8 +193,9 @@ EXAMPLES
|
|
|
176
193
|
failproofai policies --install --cli cursor --scope project
|
|
177
194
|
failproofai policies --install --cli opencode --scope project
|
|
178
195
|
failproofai policies --install --cli pi --scope project
|
|
179
|
-
failproofai policies --install --cli
|
|
180
|
-
failproofai policies --install --cli
|
|
196
|
+
failproofai policies --install --cli factory --scope project
|
|
197
|
+
failproofai policies --install --cli devin --scope project
|
|
198
|
+
failproofai policies --install --cli claude codex copilot cursor opencode pi hermes openclaw factory devin antigravity goose
|
|
181
199
|
failproofai policies --install --custom ./my-policies.js
|
|
182
200
|
failproofai policies -i -c ./my-policies.js
|
|
183
201
|
failproofai policies --uninstall block-sudo
|
|
@@ -186,7 +204,6 @@ EXAMPLES
|
|
|
186
204
|
failproofai policies --uninstall --cli cursor
|
|
187
205
|
failproofai policies --uninstall --cli opencode
|
|
188
206
|
failproofai policies --uninstall --cli pi
|
|
189
|
-
failproofai policies --uninstall --cli gemini
|
|
190
207
|
failproofai policies --uninstall --custom
|
|
191
208
|
|
|
192
209
|
LINKS
|
|
@@ -226,20 +243,20 @@ USAGE
|
|
|
226
243
|
|
|
227
244
|
OPTIONS (install)
|
|
228
245
|
[names...] Specific policy names to enable (omit for interactive)
|
|
229
|
-
--cli claude|codex|copilot|cursor|opencode|pi|
|
|
246
|
+
--cli claude|codex|copilot|cursor|opencode|pi|hermes|openclaw|factory|devin|antigravity|goose
|
|
230
247
|
Agent CLI(s) to install for; space-separated
|
|
231
|
-
(e.g. --cli claude codex copilot cursor opencode pi
|
|
248
|
+
(e.g. --cli claude codex copilot cursor opencode pi hermes openclaw factory devin antigravity goose) or repeated.
|
|
232
249
|
Omit to detect installed CLIs and prompt (or
|
|
233
250
|
auto-pick if only one is found).
|
|
234
251
|
--scope user|project|local Config scope to write to (default: user)
|
|
235
|
-
(Codex / Copilot / Cursor / OpenCode / Pi
|
|
252
|
+
(Codex / Copilot / Cursor / OpenCode / Pi support user|project only)
|
|
236
253
|
--beta Include beta policies
|
|
237
254
|
--custom, -c <path> Path to a JS file of custom policies
|
|
238
255
|
(skips interactive prompt; validates file first)
|
|
239
256
|
|
|
240
257
|
OPTIONS (uninstall)
|
|
241
258
|
[names...] Specific policy names to disable (omit to remove hooks)
|
|
242
|
-
--cli claude|codex|copilot|cursor|opencode|pi|
|
|
259
|
+
--cli claude|codex|copilot|cursor|opencode|pi|hermes|openclaw|factory|devin|antigravity|goose
|
|
243
260
|
Agent CLI(s) to uninstall from
|
|
244
261
|
--scope user|project|local|all Config scope to remove from (default: user)
|
|
245
262
|
--beta Remove only beta policies
|
|
@@ -254,8 +271,9 @@ EXAMPLES
|
|
|
254
271
|
failproofai policies --install --cli cursor --scope project
|
|
255
272
|
failproofai policies --install --cli opencode --scope project
|
|
256
273
|
failproofai policies --install --cli pi --scope project
|
|
257
|
-
failproofai policies --install --cli
|
|
258
|
-
failproofai policies --install --cli
|
|
274
|
+
failproofai policies --install --cli factory --scope project
|
|
275
|
+
failproofai policies --install --cli devin --scope project
|
|
276
|
+
failproofai policies --install --cli claude codex copilot cursor opencode pi hermes openclaw factory devin antigravity goose
|
|
259
277
|
failproofai policies --install --custom ./my-policies.js
|
|
260
278
|
failproofai policies -i -c ./my-policies.js
|
|
261
279
|
failproofai policies --uninstall block-sudo
|
|
@@ -296,7 +314,7 @@ EXAMPLES
|
|
|
296
314
|
// --cli claude codex copilot
|
|
297
315
|
// --cli claude --cli codex
|
|
298
316
|
// Values are consumed greedily until the next flag or end of argv.
|
|
299
|
-
const VALID_CLIS = new Set(["claude", "codex", "copilot", "cursor", "opencode", "pi", "
|
|
317
|
+
const VALID_CLIS = new Set(["claude", "codex", "copilot", "cursor", "opencode", "pi", "hermes", "openclaw", "factory", "devin", "antigravity", "goose"]);
|
|
300
318
|
const cliFlagValues = [];
|
|
301
319
|
const cliConsumedIdxs = new Set();
|
|
302
320
|
const cliFlagIdxs = subArgs.map((a, i) => (a === "--cli" ? i : -1)).filter((i) => i >= 0);
|
|
@@ -313,7 +331,7 @@ EXAMPLES
|
|
|
313
331
|
consumed++;
|
|
314
332
|
}
|
|
315
333
|
if (consumed === 0) {
|
|
316
|
-
throw new CliError("Missing value(s) for --cli. Usage: --cli claude codex copilot cursor opencode pi
|
|
334
|
+
throw new CliError("Missing value(s) for --cli. Usage: --cli claude codex copilot cursor opencode pi hermes openclaw (or any subset)");
|
|
317
335
|
}
|
|
318
336
|
}
|
|
319
337
|
|
|
@@ -385,7 +403,7 @@ EXAMPLES
|
|
|
385
403
|
}
|
|
386
404
|
|
|
387
405
|
// --cli accepts one or more space-separated values; same parser as install.
|
|
388
|
-
const VALID_CLIS = new Set(["claude", "codex", "copilot", "cursor", "opencode", "pi", "
|
|
406
|
+
const VALID_CLIS = new Set(["claude", "codex", "copilot", "cursor", "opencode", "pi", "hermes", "openclaw", "factory", "devin", "antigravity", "goose"]);
|
|
389
407
|
const cliFlagValues = [];
|
|
390
408
|
const cliConsumedIdxs = new Set();
|
|
391
409
|
const cliFlagIdxs = subArgs.map((a, i) => (a === "--cli" ? i : -1)).filter((i) => i >= 0);
|
|
@@ -402,7 +420,7 @@ EXAMPLES
|
|
|
402
420
|
consumed++;
|
|
403
421
|
}
|
|
404
422
|
if (consumed === 0) {
|
|
405
|
-
throw new CliError("Missing value(s) for --cli. Usage: --cli claude codex copilot cursor opencode pi
|
|
423
|
+
throw new CliError("Missing value(s) for --cli. Usage: --cli claude codex copilot cursor opencode pi hermes openclaw (or any subset)");
|
|
406
424
|
}
|
|
407
425
|
}
|
|
408
426
|
|
|
@@ -511,7 +529,7 @@ USAGE
|
|
|
511
529
|
failproofai policy remove <name> Disable one policy
|
|
512
530
|
|
|
513
531
|
OPTIONS
|
|
514
|
-
--cli claude|codex|copilot|cursor|opencode|pi|
|
|
532
|
+
--cli claude|codex|copilot|cursor|opencode|pi|hermes|openclaw|factory|devin|antigravity|goose
|
|
515
533
|
Agent CLI(s) to apply to; space-separated or repeated.
|
|
516
534
|
Omit to detect installed CLIs and prompt.
|
|
517
535
|
--scope user|project|local Config scope (default: user)
|
|
@@ -549,7 +567,7 @@ EXAMPLES
|
|
|
549
567
|
}
|
|
550
568
|
|
|
551
569
|
// --cli accepts one or more space-separated values, optionally repeated.
|
|
552
|
-
const VALID_CLIS = new Set(["claude", "codex", "copilot", "cursor", "opencode", "pi", "
|
|
570
|
+
const VALID_CLIS = new Set(["claude", "codex", "copilot", "cursor", "opencode", "pi", "hermes", "openclaw", "factory", "devin", "antigravity", "goose"]);
|
|
553
571
|
const cliFlagValues = [];
|
|
554
572
|
const cliConsumedIdxs = new Set();
|
|
555
573
|
const cliFlagIdxs = rest.map((a, i) => (a === "--cli" ? i : -1)).filter((i) => i >= 0);
|
|
@@ -564,7 +582,7 @@ EXAMPLES
|
|
|
564
582
|
consumed++;
|
|
565
583
|
}
|
|
566
584
|
if (consumed === 0) {
|
|
567
|
-
throw new CliError("Missing value(s) for --cli. Usage: --cli claude codex copilot cursor opencode pi
|
|
585
|
+
throw new CliError("Missing value(s) for --cli. Usage: --cli claude codex copilot cursor opencode pi hermes openclaw (or any subset)");
|
|
568
586
|
}
|
|
569
587
|
}
|
|
570
588
|
|
|
@@ -652,6 +670,42 @@ EXAMPLES
|
|
|
652
670
|
process.exit(0);
|
|
653
671
|
}
|
|
654
672
|
|
|
673
|
+
// config — the interactive setup launcher (scope, agents, policies).
|
|
674
|
+
// `configure` and `setup` are canonicalized to "config" up top. Running it
|
|
675
|
+
// explicitly does NOT run the post-setup audit (that only fires on first-run
|
|
676
|
+
// onboarding via bare `failproofai`).
|
|
677
|
+
if (args[0] === "config") {
|
|
678
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
679
|
+
console.log(`
|
|
680
|
+
failproofai config — interactive setup
|
|
681
|
+
|
|
682
|
+
USAGE
|
|
683
|
+
failproofai config Guided setup: choose scope, agents, and policies
|
|
684
|
+
failproofai configure Alias for config
|
|
685
|
+
failproofai setup Alias for config
|
|
686
|
+
|
|
687
|
+
WHAT IT DOES
|
|
688
|
+
Walks you through 4 quick steps and writes everything for you:
|
|
689
|
+
1. Where — global (all projects) or just this project
|
|
690
|
+
2. Assistants — which agent CLIs to protect (Claude, Codex, ...)
|
|
691
|
+
3. Policies — presets (combine any), Everything, or a custom pick
|
|
692
|
+
4. Review — confirms the exact files it will change, then applies
|
|
693
|
+
|
|
694
|
+
Prefer flags? See \`failproofai policies --help\`.
|
|
695
|
+
`.trimStart());
|
|
696
|
+
process.exit(0);
|
|
697
|
+
}
|
|
698
|
+
lastSubcommand = "config";
|
|
699
|
+
const { runConfigureWizard } = await import("../src/hooks/configure-wizard");
|
|
700
|
+
const result = await runConfigureWizard();
|
|
701
|
+
await track("cli_configure_invoked", {
|
|
702
|
+
applied: result.applied,
|
|
703
|
+
scope: result.scope ?? null,
|
|
704
|
+
cli_count: result.clis?.length ?? 0,
|
|
705
|
+
});
|
|
706
|
+
process.exit(0);
|
|
707
|
+
}
|
|
708
|
+
|
|
655
709
|
// Unknown flag guard — must appear after all known-flag branches
|
|
656
710
|
const knownFlags = ["--version", "-v", "--help", "-h", "--hook"];
|
|
657
711
|
const unknownFlag = args.find(a => a.startsWith("-") && !knownFlags.includes(a));
|
|
@@ -693,18 +747,22 @@ EXAMPLES
|
|
|
693
747
|
);
|
|
694
748
|
}
|
|
695
749
|
|
|
696
|
-
// First-run
|
|
697
|
-
//
|
|
750
|
+
// First-run onboarding — on the first bare `failproofai` invocation, run the
|
|
751
|
+
// configure wizard (which also fires the post-setup audit) BEFORE the
|
|
752
|
+
// dashboard. Unlike before, we then fall through to launch the dashboard, so a
|
|
753
|
+
// fresh user gets: setup → audit → dashboard, and every later `failproofai`
|
|
754
|
+
// goes straight to the dashboard. Best-effort: any error must not block launch.
|
|
698
755
|
if (args.length === 0) {
|
|
699
756
|
try {
|
|
700
|
-
const {
|
|
701
|
-
await
|
|
757
|
+
const { maybeFirstRunConfigure } = await import("../src/hooks/configure-wizard");
|
|
758
|
+
await maybeFirstRunConfigure();
|
|
702
759
|
} catch {
|
|
703
|
-
//
|
|
760
|
+
// First-run onboarding is non-critical; fall through to the dashboard.
|
|
704
761
|
}
|
|
705
762
|
}
|
|
706
763
|
|
|
707
|
-
// Dashboard launch — always production mode
|
|
764
|
+
// Dashboard launch — always production mode. Runs on every bare `failproofai`
|
|
765
|
+
// (after first-run onboarding, if any).
|
|
708
766
|
const { launch } = await import("../scripts/launch");
|
|
709
767
|
launch("start");
|
|
710
768
|
}
|