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.
Files changed (283) hide show
  1. package/.next/standalone/.factory/hooks.json +112 -0
  2. package/.next/standalone/.next/BUILD_ID +1 -1
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/required-server-files.json +1 -1
  6. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  7. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  11. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  12. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  13. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  14. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  15. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  17. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  20. package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
  21. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  22. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  23. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
  24. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  25. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  26. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  27. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/audit/run/route.js +3 -3
  29. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +2 -1
  36. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
  38. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/index.html +1 -1
  41. package/.next/standalone/.next/server/app/index.rsc +15 -15
  42. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  43. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  44. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  45. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
  46. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  47. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  48. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
  51. package/.next/standalone/.next/server/app/policies/page.js +1 -1
  52. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  55. package/.next/standalone/.next/server/app/project/[name]/page.js +3 -2
  56. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  59. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  60. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +5 -3
  61. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  62. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  64. package/.next/standalone/.next/server/app/projects/page.js +1 -1
  65. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  66. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0--lkk6._.js +3 -0
  68. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-219ec._.js +3 -0
  69. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04_h-a5._.js +3 -0
  70. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06cuf1y._.js +3 -0
  71. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08w4wmd._.js +3 -0
  72. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g6bbuw._.js +3 -0
  73. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jllheg._.js +3 -0
  74. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jnjf2t._.js +3 -0
  75. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q-v9z2._.js +1 -1
  76. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q0qzx1._.js +3 -0
  77. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q2nbsl._.js +3 -0
  78. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rv7m0k._.js +1 -1
  79. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xuaoik._.js +3 -3
  80. package/.next/standalone/.next/server/chunks/[root-of-the-server]__16le-kd._.js +3 -0
  81. package/.next/standalone/.next/server/chunks/[root-of-the-server]__17g9wh7._.js +1 -1
  82. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1d9qen3._.js +3 -0
  83. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ffkmds._.js +3 -0
  84. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1fwl2mz._.js +1 -1
  85. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1legmza._.js +1 -1
  86. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1mrihkj._.js +1 -1
  87. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1myjm-d._.js +1 -1
  88. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qb590j._.js +3 -0
  89. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qxztj-._.js +1 -1
  90. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1shcqgr._.js +3 -0
  91. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1xuedea._.js +3 -0
  92. package/.next/standalone/.next/server/chunks/{_1z062h5._.js → _1vslkoe._.js} +2 -2
  93. package/.next/standalone/.next/server/chunks/lib_factory-projects_ts_1eo_bk-._.js +3 -0
  94. package/.next/standalone/.next/server/chunks/lib_openclaw-projects_ts_0gc-p24._.js +3 -0
  95. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_17k9e3w.js +24 -12
  96. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
  97. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00cz9as._.js +3 -0
  98. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__015_i4t._.js +2 -2
  99. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__030k0c6._.js +3 -0
  100. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__03lv-pe._.js +2 -2
  101. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__042d3cd._.js +3 -0
  102. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__05r_17v._.js +3 -0
  103. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__07iom4f._.js → [root-of-the-server]__07qfsfa._.js} +2 -2
  104. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09q1168._.js +3 -0
  105. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e2l3c1._.js +3 -0
  106. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ge8e7w._.js +3 -0
  107. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h12me5._.js +1 -1
  108. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0hci7t3._.js +3 -0
  109. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0hdsupo._.js +2 -2
  110. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0p84xee._.js +3 -0
  111. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qeuy9c._.js +2 -2
  112. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s89hoe._.js +2 -2
  113. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ynf7tx._.js +2 -2
  114. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11rtg6s._.js +1 -1
  115. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__14dd6h8._.js +1 -1
  116. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__170799-._.js +12 -9
  117. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__17ai7sy._.js +4 -0
  118. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1d8omgc._.js +1 -1
  119. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1dky4g0._.js +1 -1
  120. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1nq7ivq._.js +3 -0
  121. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1tkjqka._.js +2 -2
  122. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__212nf49._.js +1 -1
  123. package/.next/standalone/.next/server/chunks/ssr/_05whahf._.js +1 -1
  124. package/.next/standalone/.next/server/chunks/ssr/_0_9_ytf._.js +3 -0
  125. package/.next/standalone/.next/server/chunks/ssr/_11_p9y8._.js +1 -1
  126. package/.next/standalone/.next/server/chunks/ssr/{_0ul5rf_._.js → _1_ozgif._.js} +2 -2
  127. package/.next/standalone/.next/server/chunks/ssr/_1p0-leb._.js +1 -1
  128. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +2 -2
  129. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
  130. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +1 -1
  131. package/.next/standalone/.next/server/chunks/ssr/lib_0xkhw_v._.js +3 -0
  132. package/.next/standalone/.next/server/chunks/ssr/lib_antigravity-projects_ts_0_6zf11._.js +3 -0
  133. package/.next/standalone/.next/server/chunks/ssr/lib_devin-projects_ts_0a64qdy._.js +3 -0
  134. package/.next/standalone/.next/server/chunks/ssr/lib_factory-projects_ts_1uyaahq._.js +3 -0
  135. package/.next/standalone/.next/server/chunks/ssr/lib_goose-projects_ts_0zkscri._.js +3 -0
  136. package/.next/standalone/.next/server/chunks/ssr/lib_openclaw-projects_ts_0qxq3bp._.js +3 -0
  137. 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
  138. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0-uvagv.js +1 -1
  139. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_03c7gi5.js +1 -1
  140. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_09p-8om.js +1 -1
  141. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0v-kfiu.js +1 -1
  142. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0xrgzyz.js +1 -1
  143. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1806lsc.js +1 -1
  144. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1j6dd-e.js +1 -1
  145. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1sa65r-.js +1 -1
  146. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1ezd2jf._.js +1 -1
  147. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1tnuifj._.js +1 -1
  148. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  149. package/.next/standalone/.next/server/pages/404.html +1 -1
  150. package/.next/standalone/.next/server/pages/500.html +1 -1
  151. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/server-reference-manifest.json +10 -10
  153. package/.next/standalone/.next/static/chunks/{23c7v2svx90dp.js → 003uz088wbmz7.js} +1 -1
  154. package/.next/standalone/.next/static/chunks/{0vc0eak148vo6.js → 0405htbxay9vd.js} +1 -1
  155. package/.next/standalone/.next/static/chunks/0iinhn4417nk1.js +1 -0
  156. package/.next/standalone/.next/static/chunks/1374x9bv_s_vg.js +6 -0
  157. package/.next/standalone/.next/static/chunks/{30ysv-_8jj052.js → 17sdztgbcc0fi.js} +1 -1
  158. package/.next/standalone/.next/static/chunks/{2cejn75gug3j8.js → 2m_tbl39fcedn.js} +1 -1
  159. package/.next/standalone/.next/static/chunks/{36wdtkgdf0zrd.js → 2o3ql0n5owqsw.js} +1 -1
  160. package/.next/standalone/.next/static/chunks/{0wtagd8a5gwq-.js → 2ufuwhv03yvtb.js} +1 -1
  161. package/.next/standalone/.next/static/chunks/35-90m9py64d4.js +1 -0
  162. package/.next/standalone/.next/static/chunks/3r--yyjkp9_7b.css +2 -0
  163. package/.next/standalone/.next/static/chunks/43weu8f59tlix.js +1 -0
  164. package/.next/standalone/.next/static/chunks/{05apzuand0c22.js → 454dyizqik6t9.js} +2 -2
  165. package/.next/standalone/app/api/audit/run/route.ts +2 -0
  166. package/.next/standalone/app/audit/_components/empty-state.tsx +1 -1
  167. package/.next/standalone/app/globals.css +25 -1
  168. package/.next/standalone/app/policies/hooks-client.tsx +2 -4
  169. package/.next/standalone/app/project/[name]/page.tsx +30 -10
  170. package/.next/standalone/app/project/[name]/session/[sessionId]/page.tsx +71 -21
  171. package/.next/standalone/assets/logos/antigravity.svg +1 -0
  172. package/.next/standalone/assets/logos/devin.svg +1 -0
  173. package/.next/standalone/assets/logos/factory-dark.png +0 -0
  174. package/.next/standalone/assets/logos/factory-light.png +0 -0
  175. package/.next/standalone/assets/logos/goose-dark.svg +1 -0
  176. package/.next/standalone/assets/logos/goose-light.svg +1 -0
  177. package/.next/standalone/assets/logos/openclaw.svg +22 -0
  178. package/.next/standalone/components/navbar.tsx +5 -11
  179. package/.next/standalone/components/reach-developers.tsx +1 -1
  180. package/.next/standalone/lib/antigravity-projects.ts +224 -0
  181. package/.next/standalone/lib/antigravity-sessions.ts +283 -0
  182. package/.next/standalone/lib/cli-registry.ts +26 -6
  183. package/.next/standalone/lib/devin-projects.ts +141 -0
  184. package/.next/standalone/lib/devin-sessions.ts +343 -0
  185. package/.next/standalone/lib/download-session.ts +56 -5
  186. package/.next/standalone/lib/factory-projects.ts +109 -0
  187. package/.next/standalone/lib/factory-sessions.ts +312 -0
  188. package/.next/standalone/lib/goose-projects.ts +148 -0
  189. package/.next/standalone/lib/goose-sessions.ts +296 -0
  190. package/.next/standalone/lib/openclaw-projects.ts +182 -0
  191. package/.next/standalone/lib/openclaw-sessions.ts +284 -0
  192. package/.next/standalone/lib/projects.ts +33 -9
  193. package/.next/standalone/lib/telemetry-sanitize.ts +43 -0
  194. package/.next/standalone/openclaw-plugin/index.js +223 -0
  195. package/.next/standalone/openclaw-plugin/openclaw.plugin.json +6 -0
  196. package/.next/standalone/openclaw-plugin/package.json +12 -0
  197. package/.next/standalone/package.json +2 -1
  198. package/.next/standalone/server.js +1 -1
  199. package/README.md +105 -57
  200. package/bin/failproofai.mjs +87 -29
  201. package/dist/cli.mjs +12803 -9809
  202. package/lib/antigravity-projects.ts +224 -0
  203. package/lib/antigravity-sessions.ts +283 -0
  204. package/lib/cli-registry.ts +26 -6
  205. package/lib/devin-projects.ts +141 -0
  206. package/lib/devin-sessions.ts +343 -0
  207. package/lib/download-session.ts +56 -5
  208. package/lib/factory-projects.ts +109 -0
  209. package/lib/factory-sessions.ts +312 -0
  210. package/lib/goose-projects.ts +148 -0
  211. package/lib/goose-sessions.ts +296 -0
  212. package/lib/openclaw-projects.ts +182 -0
  213. package/lib/openclaw-sessions.ts +284 -0
  214. package/lib/projects.ts +33 -9
  215. package/lib/telemetry-sanitize.ts +43 -0
  216. package/openclaw-plugin/index.js +223 -0
  217. package/openclaw-plugin/openclaw.plugin.json +6 -0
  218. package/openclaw-plugin/package.json +12 -0
  219. package/package.json +2 -1
  220. package/scripts/launch.ts +4 -8
  221. package/scripts/postinstall.mjs +3 -4
  222. package/scripts/sync-agent-cli-harnesses-prompt.md +7 -10
  223. package/scripts/translate-docs/cli.ts +73 -52
  224. package/scripts/translate-docs/config.ts +57 -13
  225. package/scripts/translate-docs/mdx-translator.ts +51 -31
  226. package/scripts/translate-docs/mintlify-nav.ts +91 -10
  227. package/scripts/translate-docs/types.ts +3 -0
  228. package/src/audit/cli-adapters/antigravity.ts +87 -0
  229. package/src/audit/cli-adapters/devin.ts +53 -0
  230. package/src/audit/cli-adapters/factory.ts +75 -0
  231. package/src/audit/cli-adapters/goose.ts +53 -0
  232. package/src/audit/cli-adapters/index.ts +30 -6
  233. package/src/audit/cli-adapters/openclaw.ts +56 -0
  234. package/src/audit/cli.ts +44 -1
  235. package/src/audit/report.ts +1 -1
  236. package/src/audit/types.ts +1 -1
  237. package/src/hooks/builtin-policies.ts +5 -5
  238. package/src/hooks/configure-wizard.ts +356 -0
  239. package/src/hooks/handler.ts +283 -218
  240. package/src/hooks/hook-telemetry.ts +43 -3
  241. package/src/hooks/install-prompt.ts +92 -173
  242. package/src/hooks/integrations.ts +739 -138
  243. package/src/hooks/manager.ts +46 -2
  244. package/src/hooks/policy-evaluator.ts +301 -121
  245. package/src/hooks/policy-presets.ts +71 -0
  246. package/src/hooks/resolve-cwd.ts +1 -1
  247. package/src/hooks/resolve-permission-mode.ts +1 -5
  248. package/src/hooks/resolve-transcript-path.ts +25 -7
  249. package/src/hooks/tool-name-canonicalize.ts +36 -3
  250. package/src/hooks/tui.ts +578 -0
  251. package/src/hooks/types.ts +447 -109
  252. package/.next/standalone/.gemini/settings.json +0 -147
  253. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cag8qd._.js +0 -3
  254. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cefjd9._.js +0 -3
  255. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ekj92q._.js +0 -3
  256. package/.next/standalone/.next/server/chunks/[root-of-the-server]__12v-lma._.js +0 -3
  257. package/.next/standalone/.next/server/chunks/[root-of-the-server]__136y39g._.js +0 -3
  258. package/.next/standalone/.next/server/chunks/[root-of-the-server]__13h8pzr._.js +0 -3
  259. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1hgv_75._.js +0 -3
  260. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04bqvos._.js +0 -3
  261. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dqgs96._.js +0 -3
  262. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0q5rfxg._.js +0 -3
  263. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qukut7._.js +0 -4
  264. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__108slqn._.js +0 -3
  265. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ql-mch._.js +0 -3
  266. package/.next/standalone/.next/server/chunks/ssr/_11v0g3z._.js +0 -3
  267. package/.next/standalone/.next/server/chunks/ssr/lib_gemini-projects_ts_1c7bgx-._.js +0 -3
  268. package/.next/standalone/.next/static/chunks/0fa7j157kg9_d.js +0 -1
  269. package/.next/standalone/.next/static/chunks/0nrah-qv6smeg.js +0 -6
  270. package/.next/standalone/.next/static/chunks/1c8i78p7t1i-5.js +0 -1
  271. package/.next/standalone/.next/static/chunks/25qr0e6ez0ei0.js +0 -1
  272. package/.next/standalone/.next/static/chunks/25s52un3k_wht.css +0 -2
  273. package/.next/standalone/assets/logos/gemini-dark.svg +0 -13
  274. package/.next/standalone/assets/logos/gemini-light.svg +0 -13
  275. package/.next/standalone/lib/gemini-projects.ts +0 -243
  276. package/.next/standalone/lib/gemini-sessions.ts +0 -365
  277. package/lib/gemini-projects.ts +0 -243
  278. package/lib/gemini-sessions.ts +0 -365
  279. package/src/audit/cli-adapters/gemini.ts +0 -51
  280. package/src/hooks/first-run-nudge.ts +0 -146
  281. /package/.next/standalone/.next/static/{kmzdjTLVs6LqsfyOaUf69 → MNJWFb2jLRrxRKGFNK6Hy}/_buildManifest.js +0 -0
  282. /package/.next/standalone/.next/static/{kmzdjTLVs6LqsfyOaUf69 → MNJWFb2jLRrxRKGFNK6Hy}/_clientMiddlewareManifest.js +0 -0
  283. /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.13"},"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"}
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
- <p align="center">
29
- <a href="https://claude.com/claude-code" title="Claude Code">
30
- <img src="assets/logos/claude.svg" alt="Claude Code" width="64" height="64" />
31
- </a>
32
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
33
- <a href="https://developers.openai.com/codex" title="OpenAI Codex">
34
- <picture>
35
- <source media="(prefers-color-scheme: dark)" srcset="assets/logos/openai-dark.svg" />
36
- <img src="assets/logos/openai-light.svg" alt="OpenAI Codex" width="64" height="64" />
37
- </picture>
38
- </a>
39
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
40
- <a href="https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/use-hooks" title="GitHub Copilot CLI">
41
- <picture>
42
- <source media="(prefers-color-scheme: dark)" srcset="assets/logos/copilot-dark.svg" />
43
- <img src="assets/logos/copilot-light.svg" alt="GitHub Copilot" width="64" height="64" />
44
- </picture>
45
- </a>
46
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
47
- <a href="https://cursor.com/docs/hooks" title="Cursor Agent CLI">
48
- <picture>
49
- <source media="(prefers-color-scheme: dark)" srcset="assets/logos/cursor-dark.svg" />
50
- <img src="assets/logos/cursor-light.svg" alt="Cursor Agent" width="64" height="64" />
51
- </picture>
52
- </a>
53
- </p>
54
- <p align="center">
55
- <a href="https://opencode.ai/docs/plugins/" title="OpenCode">
56
- <picture>
57
- <source media="(prefers-color-scheme: dark)" srcset="assets/logos/opencode-dark.svg" />
58
- <img src="assets/logos/opencode-light.svg" alt="OpenCode" width="64" height="64" />
59
- </picture>
60
- </a>
61
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
62
- <a href="https://pi.dev" title="Pi (pi-coding-agent)">
63
- <picture>
64
- <source media="(prefers-color-scheme: dark)" srcset="assets/logos/pi-dark.svg" />
65
- <img src="assets/logos/pi-light.svg" alt="Pi" width="64" height="64" />
66
- </picture>
67
- </a>
68
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
69
- <a href="https://geminicli.com/" title="Gemini CLI">
70
- <picture>
71
- <source media="(prefers-color-scheme: dark)" srcset="assets/logos/gemini-dark.svg" />
72
- <img src="assets/logos/gemini-light.svg" alt="Gemini CLI" width="64" height="64" />
73
- </picture>
74
- </a>
75
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
76
- <a href="https://github.com/FailproofAI/failproofai/blob/main/docs/configuration.mdx" title="Hermes (hermes-agent)">
77
- <picture>
78
- <source media="(prefers-color-scheme: dark)" srcset="assets/logos/hermes-dark.svg" />
79
- <img src="assets/logos/hermes-light.svg" alt="Hermes" width="64" height="64" />
80
- </picture>
81
- </a>
82
- </p>
83
-
84
- > Install hooks for one or any combination: `failproofai policies --install --cli opencode pi gemini` (or `--cli claude codex copilot cursor opencode pi gemini hermes`). Omit `--cli` to auto-detect installed CLIs and prompt.
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
 
@@ -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|gemini|hermes>]");
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|gemini|hermes
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 gemini hermes) or repeated.
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 / Gemini support user|project only)
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|gemini|hermes
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 gemini --scope project
180
- failproofai policies --install --cli claude codex copilot cursor opencode pi gemini hermes
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|gemini|hermes
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 gemini hermes) or repeated.
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 / Gemini support user|project only)
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|gemini|hermes
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 gemini --scope project
258
- failproofai policies --install --cli claude codex copilot cursor opencode pi gemini hermes
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", "gemini", "hermes"]);
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 gemini hermes (or any subset)");
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", "gemini", "hermes"]);
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 gemini hermes (or any subset)");
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|gemini|hermes
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", "gemini", "hermes"]);
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 gemini hermes (or any subset)");
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 nudgeonly on truly bare `failproofai` invocations. Best-effort:
697
- // any thrown error must not block the dashboard from launching.
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 { maybeRunFirstRunNudge } = await import("../src/hooks/first-run-nudge");
701
- await maybeRunFirstRunNudge();
757
+ const { maybeFirstRunConfigure } = await import("../src/hooks/configure-wizard");
758
+ await maybeFirstRunConfigure();
702
759
  } catch {
703
- // Nudge is non-critical; fall through to dashboard.
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
  }