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
@@ -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, gemini). " +
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, gemini). " +
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
- function truncateLine(line: string, width: number): string {
250
- let visual = 0;
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 = action === "uninstall" ? "Remove Hooks" : "Install Hooks";
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 || 120;
267
+ const cols = process.stdout.columns || 100;
274
268
  hideCursor();
275
269
 
276
- const lines: string[] = [];
277
- lines.push(` \x1B[1mFailproof AI\x1B[0m \x1B[2m—\x1B[0m ${heading}`);
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 hintVisible = row.hint ? ` · ${row.hint}` : "";
287
- // Line shape: " " + "── " + title + hintVisible + " " + dashes → cols
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 pointer = isActive ? "\x1B[36m❯\x1B[0m" : " ";
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
- ? `\x1B[1;36m${opt.label}\x1B[0m`
289
+ ? pinkBold(opt.label)
306
290
  : opt.detected
307
291
  ? opt.label
308
- : `\x1B[2m${opt.label}\x1B[0m`;
309
- lines.push(` ${pointer} ${marker} ${label}`);
292
+ : dim(opt.label);
293
+ lines.push(`${g} ${caret} ${marker} ${label}`);
310
294
  }
311
295
 
312
- lines.push("");
313
- lines.push(" \x1B[2m" + "─".repeat(Math.max(2, cols - 2)) + "\x1B[0m");
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
- const output =
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 = 8;
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 || 120;
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
- // ── Title ────────────────────────────────────────────────────
498
- lines.push(" Failproof AI \u2014 Policy Manager");
499
- lines.push("");
500
-
501
- // ── Bordered search box ──────────────────────────────────────
502
- const innerWidth = Math.max(20, cols - 6);
503
- const topBorder = " \u250c" + "\u2500".repeat(innerWidth + 2) + "\u2510";
504
- const botBorder = " \u2514" + "\u2500".repeat(innerWidth + 2) + "\u2518";
505
- const cursorChar = "\x1B[7m \x1B[0m"; // reverse-video block cursor
506
- const countPart = search
507
- ? ` \x1B[2m(${shown}/${total})\x1B[0m`
508
- : ` \x1B[2m(${total} policies)\x1B[0m`;
509
- const searchContent = `\x1B[1mSearch:\x1B[0m ${search}${cursorChar}${countPart}`;
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(" \x1B[2mNo policies match \u201c" + search + "\u201d\x1B[0m");
518
- // Pad to stable height: 1 (scroll-up) + WINDOW_SIZE (rows) + 1 (scroll-down)
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
- // Scroll-up indicator (always reserve this line for stable height)
540
- const aboveItems = displayRows
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
- // ── CATEGORY NAME (enabled/total) ─────
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 isActive = row.filteredIndex === cursor;
564
- const pointer = isActive ? "\x1B[36m\u276f\x1B[0m" : " ";
565
- const check = item.selected ? "\x1B[32m[\u2713]\x1B[0m" : "[ ]";
566
- const namePart = isActive
567
- ? `\x1B[1;36m${item.name}\x1B[0m`
568
- : item.name;
569
- const betaPart = item.beta ? " \x1B[35m[beta]\x1B[0m" : "";
570
- const pad = " ".repeat(Math.max(1, 28 - item.name.length));
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
- // Pad window to fixed WINDOW_SIZE rows for stable height
577
- for (let i = windowEnd - windowStart; i < WINDOW_SIZE; i++) {
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
- // ── Footer ───────────────────────────────────────────────────
593
- lines.push("");
594
- lines.push(" \x1B[2m" + "\u2500".repeat(cols - 2) + "\x1B[0m");
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
- // ── Repaint: cursor-up by previous line count, clear to end, redraw ──
609
- if (lastLineCount > 0) {
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 === "return" || key.name === "space") {
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);