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
|
@@ -10,6 +10,17 @@
|
|
|
10
10
|
* Keybindings: ↑↓ navigate · Space toggle · Ctrl+A all · Ctrl+S save · Esc clear search
|
|
11
11
|
*/
|
|
12
12
|
import * as readline from "node:readline";
|
|
13
|
+
// Brand palette, ANSI-aware truncation, and glyphs shared with the configure
|
|
14
|
+
// wizard (tui.ts) so every failproofai menu reads as one system.
|
|
15
|
+
import {
|
|
16
|
+
paint,
|
|
17
|
+
truncate as truncateLine,
|
|
18
|
+
BAR,
|
|
19
|
+
STEP_ACTIVE as STEP,
|
|
20
|
+
STEP_DONE as DONE,
|
|
21
|
+
CHECK_ON as BOX_ON,
|
|
22
|
+
CHECK_OFF as BOX_OFF,
|
|
23
|
+
} from "./tui";
|
|
13
24
|
import { BUILTIN_POLICIES } from "./builtin-policies";
|
|
14
25
|
import { detectInstalledClis, getIntegration, listInstallableIds } from "./integrations";
|
|
15
26
|
import { type IntegrationType } from "./types";
|
|
@@ -82,14 +93,14 @@ export async function resolveTargetClis(
|
|
|
82
93
|
// Uninstall flow: no agent CLIs detected — nothing to remove from. Default to
|
|
83
94
|
// claude so removeHooks operates over Claude's scopes (no-op if no settings file).
|
|
84
95
|
console.log(
|
|
85
|
-
"\x1B[33mWarning: no agent CLI binary found in PATH (claude, codex, copilot, cursor-agent, opencode, pi
|
|
96
|
+
"\x1B[33mWarning: no agent CLI binary found in PATH (claude, codex, copilot, cursor-agent, opencode, pi)." +
|
|
86
97
|
"Defaulting to Claude Code; nothing will be removed if no settings file exists.\x1B[0m",
|
|
87
98
|
);
|
|
88
99
|
fireDetectionEvent(["claude"], "defaulted_to_claude");
|
|
89
100
|
return ["claude"];
|
|
90
101
|
}
|
|
91
102
|
console.log(
|
|
92
|
-
"\x1B[33mWarning: no agent CLI binary found in PATH (claude, codex, copilot, cursor-agent, opencode, pi
|
|
103
|
+
"\x1B[33mWarning: no agent CLI binary found in PATH (claude, codex, copilot, cursor-agent, opencode, pi)." +
|
|
93
104
|
"Defaulting to Claude Code; hooks will activate when an agent is installed.\x1B[0m",
|
|
94
105
|
);
|
|
95
106
|
fireDetectionEvent(["claude"], "defaulted_to_claude");
|
|
@@ -246,79 +257,49 @@ async function promptCliTargetSelection(
|
|
|
246
257
|
}
|
|
247
258
|
}
|
|
248
259
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
let result = "";
|
|
252
|
-
let i = 0;
|
|
253
|
-
while (i < line.length) {
|
|
254
|
-
if (line[i] === "\x1B" && line[i + 1] === "[") {
|
|
255
|
-
let j = i + 2;
|
|
256
|
-
while (j < line.length && !/[A-Za-z]/.test(line[j])) j++;
|
|
257
|
-
j++;
|
|
258
|
-
result += line.slice(i, j);
|
|
259
|
-
i = j;
|
|
260
|
-
} else {
|
|
261
|
-
if (visual >= width) break;
|
|
262
|
-
result += line[i];
|
|
263
|
-
visual++;
|
|
264
|
-
i++;
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
return result;
|
|
268
|
-
}
|
|
260
|
+
// Shared brand painter from tui.ts (NO_COLOR-gated like the rest of this file).
|
|
261
|
+
const { dim, bold, guide: teal, pink, pinkBold } = paint(!process.env.NO_COLOR);
|
|
269
262
|
|
|
270
|
-
const heading =
|
|
263
|
+
const heading =
|
|
264
|
+
action === "uninstall" ? "Remove failproofai hooks" : "Install failproofai hooks";
|
|
271
265
|
|
|
272
266
|
function render(): void {
|
|
273
|
-
const cols = process.stdout.columns ||
|
|
267
|
+
const cols = process.stdout.columns || 100;
|
|
274
268
|
hideCursor();
|
|
275
269
|
|
|
276
|
-
const
|
|
277
|
-
lines
|
|
278
|
-
lines.push("");
|
|
270
|
+
const g = dim(BAR);
|
|
271
|
+
const lines: string[] = [g, `${teal(STEP)} ${bold(heading)}`];
|
|
279
272
|
|
|
280
273
|
for (const row of buildDisplayRows()) {
|
|
281
274
|
if (row.kind === "blank") {
|
|
282
|
-
lines.push(
|
|
275
|
+
lines.push(g);
|
|
283
276
|
continue;
|
|
284
277
|
}
|
|
285
278
|
if (row.kind === "header") {
|
|
286
|
-
const
|
|
287
|
-
|
|
288
|
-
const dashLen = Math.max(2, cols - 2 - 3 - row.title.length - hintVisible.length - 1);
|
|
289
|
-
const suffix = row.hint ? ` \x1B[2m· ${row.hint}\x1B[0m` : "";
|
|
290
|
-
lines.push(
|
|
291
|
-
` \x1B[2m── \x1B[0m\x1B[1m${row.title}\x1B[0m${suffix} \x1B[2m${"─".repeat(dashLen)}\x1B[0m`,
|
|
292
|
-
);
|
|
279
|
+
const hint = row.hint ? ` ${dim("· " + row.hint)}` : "";
|
|
280
|
+
lines.push(`${g} ${dim(row.title)}${hint}`);
|
|
293
281
|
continue;
|
|
294
282
|
}
|
|
295
283
|
|
|
296
284
|
const opt = row.option;
|
|
297
285
|
const isActive = row.itemIndex === cursor;
|
|
298
|
-
const
|
|
299
|
-
const marker = opt.isAll
|
|
300
|
-
? "\x1B[33m★\x1B[0m"
|
|
301
|
-
: opt.detected
|
|
302
|
-
? "\x1B[32m●\x1B[0m"
|
|
303
|
-
: "\x1B[2m○\x1B[0m";
|
|
286
|
+
const caret = isActive ? pink("❯") : " ";
|
|
287
|
+
const marker = opt.isAll ? teal("★") : opt.detected ? pink("●") : dim("○");
|
|
304
288
|
const label = isActive
|
|
305
|
-
?
|
|
289
|
+
? pinkBold(opt.label)
|
|
306
290
|
: opt.detected
|
|
307
291
|
? opt.label
|
|
308
|
-
:
|
|
309
|
-
lines.push(
|
|
292
|
+
: dim(opt.label);
|
|
293
|
+
lines.push(`${g} ${caret} ${marker} ${label}`);
|
|
310
294
|
}
|
|
311
295
|
|
|
312
|
-
lines.push(
|
|
313
|
-
lines.push(
|
|
314
|
-
lines.push(" [↑↓] Move [Enter] Select [^C] Quit");
|
|
296
|
+
lines.push(g);
|
|
297
|
+
lines.push(`${g} ${dim("↑/↓ move · ↵ select · esc cancel")}`);
|
|
315
298
|
|
|
316
299
|
if (lastLineCount > 0) {
|
|
317
300
|
process.stdout.write(`\x1B[${lastLineCount}A\x1B[J`);
|
|
318
301
|
}
|
|
319
|
-
|
|
320
|
-
lines.map((l) => (l === "" ? l : truncateLine(l, cols))).join("\n") + "\n";
|
|
321
|
-
process.stdout.write(output);
|
|
302
|
+
process.stdout.write(lines.map((l) => truncateLine(l, cols)).join("\n") + "\n");
|
|
322
303
|
lastLineCount = lines.length;
|
|
323
304
|
}
|
|
324
305
|
|
|
@@ -340,7 +321,7 @@ async function promptCliTargetSelection(
|
|
|
340
321
|
|
|
341
322
|
function onKey(_str: string | undefined, key: readline.Key): void {
|
|
342
323
|
if (!key) return;
|
|
343
|
-
if (key.ctrl && (key.name === "c" || key.name === "d")) {
|
|
324
|
+
if ((key.ctrl && (key.name === "c" || key.name === "d")) || key.name === "escape") {
|
|
344
325
|
cleanup();
|
|
345
326
|
process.stdout.write("\n");
|
|
346
327
|
process.exit(130); // SIGINT-equivalent
|
|
@@ -394,7 +375,19 @@ export async function promptPolicySelection(
|
|
|
394
375
|
}));
|
|
395
376
|
|
|
396
377
|
const total = items.length;
|
|
397
|
-
const WINDOW_SIZE =
|
|
378
|
+
const WINDOW_SIZE = 10;
|
|
379
|
+
|
|
380
|
+
// Shared brand painter from tui.ts, bound to role names so a reader never has
|
|
381
|
+
// to decode which hue a role happens to use today (glyphs imported above).
|
|
382
|
+
const useColor = !process.env.NO_COLOR;
|
|
383
|
+
const c = paint(useColor);
|
|
384
|
+
const { dim, bold } = c;
|
|
385
|
+
const stepMark = c.guide; // ◆ step marker + live selected-count
|
|
386
|
+
const activeName = c.pinkBold; // row under the cursor
|
|
387
|
+
const selectedMark = c.pink; // checked boxes / selected names
|
|
388
|
+
const betaTag = c.softPink; // "beta" pill
|
|
389
|
+
// Fixed name column so descriptions align into a clean, scannable second column.
|
|
390
|
+
const NAME_COL = Math.min(34, Math.max(10, ...items.map((i) => i.name.length)));
|
|
398
391
|
|
|
399
392
|
let cursor = 0;
|
|
400
393
|
let search = "";
|
|
@@ -415,28 +408,6 @@ export async function promptPolicySelection(
|
|
|
415
408
|
}
|
|
416
409
|
}
|
|
417
410
|
|
|
418
|
-
// Truncate a line to `width` visual columns, skipping ANSI CSI sequences.
|
|
419
|
-
function truncateLine(line: string, width: number): string {
|
|
420
|
-
let visual = 0;
|
|
421
|
-
let result = "";
|
|
422
|
-
let i = 0;
|
|
423
|
-
while (i < line.length) {
|
|
424
|
-
if (line[i] === "\x1B" && line[i + 1] === "[") {
|
|
425
|
-
let j = i + 2;
|
|
426
|
-
while (j < line.length && !/[A-Za-z]/.test(line[j])) j++;
|
|
427
|
-
j++;
|
|
428
|
-
result += line.slice(i, j);
|
|
429
|
-
i = j;
|
|
430
|
-
} else {
|
|
431
|
-
if (visual >= width) break;
|
|
432
|
-
result += line[i];
|
|
433
|
-
visual++;
|
|
434
|
-
i++;
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
return result;
|
|
438
|
-
}
|
|
439
|
-
|
|
440
411
|
function getFiltered(): SelectItem[] {
|
|
441
412
|
if (!search) return items;
|
|
442
413
|
const q = search.toLowerCase();
|
|
@@ -483,44 +454,36 @@ export async function promptPolicySelection(
|
|
|
483
454
|
}
|
|
484
455
|
|
|
485
456
|
function render(): void {
|
|
486
|
-
const cols = process.stdout.columns ||
|
|
457
|
+
const cols = process.stdout.columns || 100;
|
|
487
458
|
hideCursor();
|
|
488
459
|
|
|
489
460
|
const filtered = getFiltered();
|
|
490
461
|
const shown = filtered.length;
|
|
491
|
-
|
|
492
|
-
// Clamp cursor to filtered list bounds
|
|
493
462
|
if (shown > 0 && cursor >= shown) cursor = shown - 1;
|
|
463
|
+
const selectedCount = items.filter((i) => i.selected).length;
|
|
494
464
|
|
|
465
|
+
const g = dim(BAR);
|
|
495
466
|
const lines: string[] = [];
|
|
496
467
|
|
|
497
|
-
//
|
|
498
|
-
lines.push(
|
|
499
|
-
lines.push(
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
const
|
|
506
|
-
const
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
lines.push(topBorder);
|
|
511
|
-
lines.push(` \u2502 ${searchContent}`);
|
|
512
|
-
lines.push(botBorder);
|
|
513
|
-
lines.push("");
|
|
514
|
-
|
|
515
|
-
// ── Content area ─────────────────────────────────────────────
|
|
468
|
+
// header
|
|
469
|
+
lines.push(g);
|
|
470
|
+
lines.push(
|
|
471
|
+
`${stepMark(STEP)} ${bold("Choose the policies to enable")} ${dim("·")} ` +
|
|
472
|
+
`${stepMark(String(selectedCount))} ${dim("selected")}`,
|
|
473
|
+
);
|
|
474
|
+
|
|
475
|
+
// search
|
|
476
|
+
const blockCursor = useColor ? "\x1B[7m \x1B[0m" : "_";
|
|
477
|
+
const countLabel = search ? dim(`${shown}/${total} shown`) : dim(`${total} policies`);
|
|
478
|
+
lines.push(`${g} ${dim("filter ›")} ${search}${blockCursor} ${countLabel}`);
|
|
479
|
+
lines.push(g);
|
|
480
|
+
|
|
516
481
|
if (shown === 0) {
|
|
517
|
-
lines.push(
|
|
518
|
-
|
|
519
|
-
for (let i = 0; i < WINDOW_SIZE + 1; i++) lines.push("");
|
|
482
|
+
lines.push(`${g} ${dim(`no policies match “${search}”`)}`);
|
|
483
|
+
for (let i = 0; i < WINDOW_SIZE + 1; i++) lines.push(g);
|
|
520
484
|
} else {
|
|
521
485
|
const displayRows = buildDisplayRows(filtered);
|
|
522
486
|
|
|
523
|
-
// Find the display row index that corresponds to the current cursor
|
|
524
487
|
let cursorDisplayRow = 0;
|
|
525
488
|
for (let i = 0; i < displayRows.length; i++) {
|
|
526
489
|
const row = displayRows[i];
|
|
@@ -529,89 +492,42 @@ export async function promptPolicySelection(
|
|
|
529
492
|
break;
|
|
530
493
|
}
|
|
531
494
|
}
|
|
532
|
-
|
|
533
|
-
// Viewport: keep cursor row roughly centred
|
|
534
495
|
let windowStart = cursorDisplayRow - Math.floor(WINDOW_SIZE / 2);
|
|
535
496
|
windowStart = Math.max(0, windowStart);
|
|
536
497
|
windowStart = Math.min(windowStart, Math.max(0, displayRows.length - WINDOW_SIZE));
|
|
537
498
|
const windowEnd = Math.min(displayRows.length, windowStart + WINDOW_SIZE);
|
|
538
499
|
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
.slice(0, windowStart)
|
|
542
|
-
.filter((r) => r.kind === "item").length;
|
|
543
|
-
if (aboveItems > 0) {
|
|
544
|
-
lines.push(` \x1B[2m \u2191 ${aboveItems} more above\x1B[0m`);
|
|
545
|
-
} else {
|
|
546
|
-
lines.push("");
|
|
547
|
-
}
|
|
500
|
+
const aboveItems = displayRows.slice(0, windowStart).filter((r) => r.kind === "item").length;
|
|
501
|
+
lines.push(aboveItems > 0 ? `${g} ${dim(`↑ ${aboveItems} more`)}` : g);
|
|
548
502
|
|
|
549
|
-
// Visible display rows
|
|
550
503
|
for (let i = windowStart; i < windowEnd; i++) {
|
|
551
504
|
const row = displayRows[i];
|
|
552
505
|
if (row.kind === "header") {
|
|
553
|
-
|
|
554
|
-
const label = ` ${row.category.toUpperCase()} (${row.enabledCount}/${row.totalCount}) `;
|
|
555
|
-
const prefix = "\u2500\u2500 ";
|
|
556
|
-
const prefixLen = 3 + label.length;
|
|
557
|
-
const dashLen = Math.max(2, cols - 2 - prefixLen);
|
|
558
|
-
lines.push(
|
|
559
|
-
` \x1B[2m${prefix}${label}${"\u2500".repeat(dashLen)}\x1B[0m`,
|
|
560
|
-
);
|
|
506
|
+
lines.push(`${g} ${dim(row.category.toUpperCase())} ${dim(`${row.enabledCount}/${row.totalCount}`)}`);
|
|
561
507
|
} else {
|
|
562
508
|
const item = row.item;
|
|
563
|
-
const
|
|
564
|
-
const
|
|
565
|
-
const
|
|
566
|
-
const
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
const
|
|
570
|
-
|
|
571
|
-
const desc = `\x1B[2m${item.description}\x1B[0m`;
|
|
572
|
-
lines.push(` ${pointer} ${check} ${namePart}${betaPart}${pad}${desc}`);
|
|
509
|
+
const active = row.filteredIndex === cursor;
|
|
510
|
+
const box = item.selected ? selectedMark(BOX_ON) : dim(BOX_OFF);
|
|
511
|
+
const rawName = item.name.padEnd(NAME_COL);
|
|
512
|
+
const name = active ? activeName(rawName) : item.selected ? rawName : dim(rawName);
|
|
513
|
+
const beta = item.beta ? ` ${betaTag("beta")}` : "";
|
|
514
|
+
const descWidth = Math.max(8, cols - NAME_COL - 8 - (item.beta ? 5 : 0));
|
|
515
|
+
const desc = dim(truncateLine(item.description, descWidth));
|
|
516
|
+
lines.push(`${g} ${box} ${name}${beta} ${desc}`);
|
|
573
517
|
}
|
|
574
518
|
}
|
|
519
|
+
for (let i = windowEnd - windowStart; i < WINDOW_SIZE; i++) lines.push(g);
|
|
575
520
|
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
lines.push("");
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
// Scroll-down indicator (always reserve this line for stable height)
|
|
582
|
-
const belowItems = displayRows
|
|
583
|
-
.slice(windowEnd)
|
|
584
|
-
.filter((r) => r.kind === "item").length;
|
|
585
|
-
if (belowItems > 0) {
|
|
586
|
-
lines.push(` \x1B[2m \u2193 ${belowItems} more below\x1B[0m`);
|
|
587
|
-
} else {
|
|
588
|
-
lines.push("");
|
|
589
|
-
}
|
|
521
|
+
const belowItems = displayRows.slice(windowEnd).filter((r) => r.kind === "item").length;
|
|
522
|
+
lines.push(belowItems > 0 ? `${g} ${dim(`↓ ${belowItems} more`)}` : g);
|
|
590
523
|
}
|
|
591
524
|
|
|
592
|
-
//
|
|
593
|
-
lines.push(
|
|
594
|
-
lines.push(
|
|
595
|
-
lines.push(
|
|
596
|
-
" [\u2191\u2193] Move [Space] Toggle [Ctrl+A] All [Ctrl+S] Save [Esc] Clear [^C] Quit",
|
|
597
|
-
);
|
|
598
|
-
lines.push("");
|
|
599
|
-
lines.push(
|
|
600
|
-
" \x1B[2mTip: `policies` for a flat list \u00b7 `policies --install <name\u2026>` to skip prompt\x1B[0m",
|
|
601
|
-
);
|
|
602
|
-
if (!includeBeta) {
|
|
603
|
-
lines.push(
|
|
604
|
-
" \x1B[2mTip: `policies --install --beta` to include beta policies\x1B[0m",
|
|
605
|
-
);
|
|
606
|
-
}
|
|
525
|
+
// footer
|
|
526
|
+
lines.push(g);
|
|
527
|
+
lines.push(`${g} ${dim("↑/↓ move · space select · ctrl+a all · ↵ save · type to filter · esc clear")}`);
|
|
607
528
|
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
process.stdout.write(`\x1B[${lastLineCount}A\x1B[J`);
|
|
611
|
-
}
|
|
612
|
-
const output =
|
|
613
|
-
lines.map((l) => (l === "" ? l : truncateLine(l, cols))).join("\n") + "\n";
|
|
614
|
-
process.stdout.write(output);
|
|
529
|
+
if (lastLineCount > 0) process.stdout.write(`\x1B[${lastLineCount}A\x1B[J`);
|
|
530
|
+
process.stdout.write(lines.map((l) => truncateLine(l, cols)).join("\n") + "\n");
|
|
615
531
|
lastLineCount = lines.length;
|
|
616
532
|
}
|
|
617
533
|
|
|
@@ -645,10 +561,19 @@ export async function promptPolicySelection(
|
|
|
645
561
|
cursor = cursor < filtered.length - 1 ? cursor + 1 : 0;
|
|
646
562
|
}
|
|
647
563
|
render();
|
|
648
|
-
} else if (key.name === "
|
|
564
|
+
} else if (key.name === "space") {
|
|
649
565
|
const item = filtered[cursor];
|
|
650
566
|
if (item) item.selected = !item.selected;
|
|
651
567
|
render();
|
|
568
|
+
} else if (key.name === "return" || (key.ctrl && key.name === "s")) {
|
|
569
|
+
// Save — collapse the picker to a one-line summary, then resolve.
|
|
570
|
+
cleanup();
|
|
571
|
+
const selected = items.filter((i) => i.selected).map((i) => i.name);
|
|
572
|
+
if (lastLineCount > 0) process.stdout.write(`\x1B[${lastLineCount}A\x1B[J`);
|
|
573
|
+
process.stdout.write(
|
|
574
|
+
`${dim(BAR)}\n${dim(DONE)} Policies\n${dim(BAR)} ${dim(`${selected.length} selected`)}\n`,
|
|
575
|
+
);
|
|
576
|
+
resolve(selected);
|
|
652
577
|
} else if (key.name === "escape") {
|
|
653
578
|
// Clear search filter
|
|
654
579
|
search = "";
|
|
@@ -659,12 +584,6 @@ export async function promptPolicySelection(
|
|
|
659
584
|
const allSelected = filtered.length > 0 && filtered.every((i) => i.selected);
|
|
660
585
|
for (const item of filtered) item.selected = !allSelected;
|
|
661
586
|
render();
|
|
662
|
-
} else if (key.ctrl && key.name === "s") {
|
|
663
|
-
// Submit
|
|
664
|
-
cleanup();
|
|
665
|
-
const selected = items.filter((i) => i.selected).map((i) => i.name);
|
|
666
|
-
process.stdout.write("\n");
|
|
667
|
-
resolve(selected);
|
|
668
587
|
} else if (key.name === "backspace" || key.name === "delete") {
|
|
669
588
|
if (search.length > 0) {
|
|
670
589
|
search = search.slice(0, -1);
|