failproofai 0.0.13 → 0.0.14-beta.1

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 (310) hide show
  1. package/.next/standalone/.codex/hooks.json +6 -6
  2. package/.next/standalone/.cursor/hooks.json +6 -6
  3. package/.next/standalone/.factory/hooks.json +112 -0
  4. package/.next/standalone/.next/BUILD_ID +1 -1
  5. package/.next/standalone/.next/build-manifest.json +5 -5
  6. package/.next/standalone/.next/prerender-manifest.json +3 -3
  7. package/.next/standalone/.next/required-server-files.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +2 -2
  9. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  10. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  14. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  15. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  16. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  17. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  18. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +2 -2
  20. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  21. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  24. package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
  25. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  26. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  27. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
  28. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  29. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  30. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  31. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/audit/run/route.js +3 -3
  33. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +2 -1
  40. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/audit/page/build-manifest.json +2 -2
  42. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
  43. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/index.html +1 -1
  46. package/.next/standalone/.next/server/app/index.rsc +15 -15
  47. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  48. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  49. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  50. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
  51. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  52. package/.next/standalone/.next/server/app/page/build-manifest.json +2 -2
  53. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  54. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  55. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/policies/page/build-manifest.json +2 -2
  57. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
  58. package/.next/standalone/.next/server/app/policies/page.js +1 -1
  59. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  60. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +2 -2
  62. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  63. package/.next/standalone/.next/server/app/project/[name]/page.js +3 -2
  64. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  65. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +2 -2
  67. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  68. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  69. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +5 -3
  70. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  71. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/projects/page/build-manifest.json +2 -2
  73. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  74. package/.next/standalone/.next/server/app/projects/page.js +1 -1
  75. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0--lkk6._.js +3 -0
  78. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-219ec._.js +3 -0
  79. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04_h-a5._.js +3 -0
  80. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06cuf1y._.js +3 -0
  81. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08w4wmd._.js +3 -0
  82. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g6bbuw._.js +3 -0
  83. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jllheg._.js +3 -0
  84. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jnjf2t._.js +3 -0
  85. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q-v9z2._.js +1 -1
  86. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q0qzx1._.js +3 -0
  87. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q2nbsl._.js +3 -0
  88. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rv7m0k._.js +1 -1
  89. package/.next/standalone/.next/server/chunks/[root-of-the-server]__16le-kd._.js +3 -0
  90. package/.next/standalone/.next/server/chunks/[root-of-the-server]__17g9wh7._.js +1 -1
  91. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1d9qen3._.js +3 -0
  92. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ffkmds._.js +3 -0
  93. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1fwl2mz._.js +1 -1
  94. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1legmza._.js +1 -1
  95. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1mrihkj._.js +1 -1
  96. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1myjm-d._.js +1 -1
  97. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qb590j._.js +3 -0
  98. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qxztj-._.js +1 -1
  99. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1shcqgr._.js +3 -0
  100. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1xuedea._.js +3 -0
  101. package/.next/standalone/.next/server/chunks/{_1z062h5._.js → _1vslkoe._.js} +2 -2
  102. package/.next/standalone/.next/server/chunks/lib_factory-projects_ts_1eo_bk-._.js +3 -0
  103. package/.next/standalone/.next/server/chunks/lib_openclaw-projects_ts_0gc-p24._.js +3 -0
  104. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_17k9e3w.js +24 -12
  105. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oi._.js +1 -1
  106. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +1 -1
  107. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
  108. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00cz9as._.js +3 -0
  109. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__015_i4t._.js +2 -2
  110. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__030k0c6._.js +3 -0
  111. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__03lv-pe._.js +2 -2
  112. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__042d3cd._.js +3 -0
  113. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__05r_17v._.js +3 -0
  114. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09q1168._.js +3 -0
  115. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__108slqn._.js → [root-of-the-server]__0brjczq._.js} +2 -2
  116. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e2l3c1._.js +3 -0
  117. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0hci7t3._.js +3 -0
  118. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0hdsupo._.js +2 -2
  119. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0p84xee._.js +3 -0
  120. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qeuy9c._.js +2 -2
  121. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s89hoe._.js +2 -2
  122. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__07iom4f._.js → [root-of-the-server]__0wp9w6i._.js} +2 -2
  123. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ynf7tx._.js +2 -2
  124. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__170799-._.js +12 -9
  125. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__17ai7sy._.js +4 -0
  126. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1d8omgc._.js +1 -1
  127. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1nq7ivq._.js +3 -0
  128. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1tkjqka._.js +2 -2
  129. package/.next/standalone/.next/server/chunks/ssr/_05whahf._.js +1 -1
  130. package/.next/standalone/.next/server/chunks/ssr/_0_9_ytf._.js +3 -0
  131. package/.next/standalone/.next/server/chunks/ssr/_11_p9y8._.js +1 -1
  132. package/.next/standalone/.next/server/chunks/ssr/{_0ul5rf_._.js → _1_ozgif._.js} +2 -2
  133. package/.next/standalone/.next/server/chunks/ssr/_1p0-leb._.js +1 -1
  134. package/.next/standalone/.next/server/chunks/ssr/app_087bt9w._.js +1 -1
  135. package/.next/standalone/.next/server/chunks/ssr/app_1fvisnp._.js +1 -1
  136. package/.next/standalone/.next/server/chunks/ssr/app_209u41o._.js +1 -1
  137. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +2 -2
  138. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
  139. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +1 -1
  140. package/.next/standalone/.next/server/chunks/ssr/lib_0xkhw_v._.js +3 -0
  141. package/.next/standalone/.next/server/chunks/ssr/lib_antigravity-projects_ts_0_6zf11._.js +3 -0
  142. package/.next/standalone/.next/server/chunks/ssr/lib_devin-projects_ts_0a64qdy._.js +3 -0
  143. package/.next/standalone/.next/server/chunks/ssr/lib_factory-projects_ts_1uyaahq._.js +3 -0
  144. package/.next/standalone/.next/server/chunks/ssr/lib_goose-projects_ts_0zkscri._.js +3 -0
  145. package/.next/standalone/.next/server/chunks/ssr/lib_openclaw-projects_ts_0qxq3bp._.js +3 -0
  146. package/.next/standalone/.next/server/chunks/ssr/{node_modules_html-to-image_es_index_13p7zob.js → node_modules_html-to-image_es_index_12rjfea.js} +1 -1
  147. package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js +1 -1
  148. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1ezd2jf._.js +1 -1
  149. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1tnuifj._.js +1 -1
  150. package/.next/standalone/.next/server/middleware-build-manifest.js +5 -5
  151. package/.next/standalone/.next/server/pages/404.html +1 -1
  152. package/.next/standalone/.next/server/pages/500.html +1 -1
  153. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/server-reference-manifest.json +10 -10
  155. package/.next/standalone/.next/static/chunks/{13f1kmjea-0md.js → 02jcotghcxrbu.js} +1 -1
  156. package/.next/standalone/.next/static/chunks/{30ysv-_8jj052.js → 0d5lypu1zs21r.js} +1 -1
  157. package/.next/standalone/.next/static/chunks/0emg30_6svycu.js +1 -0
  158. package/.next/standalone/.next/static/chunks/0o9wpnze1ey8y.js +6 -0
  159. package/.next/standalone/.next/static/chunks/{05apzuand0c22.js → 1359o5785rmve.js} +2 -2
  160. package/.next/standalone/.next/static/chunks/20tuctw38jbgw.js +1 -0
  161. package/.next/standalone/.next/static/chunks/{0vc0eak148vo6.js → 2ldhnaweu9ew3.js} +1 -1
  162. package/.next/standalone/.next/static/chunks/{23c7v2svx90dp.js → 2vav_x0_336ds.js} +1 -1
  163. package/.next/standalone/.next/static/chunks/3-ogr79xqbw0h.js +1 -0
  164. package/.next/standalone/.next/static/chunks/36j05kb2x323i.css +2 -0
  165. package/.next/standalone/.next/static/chunks/3cg7x0joi2b98.js +1 -0
  166. package/.next/standalone/.next/static/chunks/{36wdtkgdf0zrd.js → 3k87p-tijud-4.js} +1 -1
  167. package/.next/standalone/.next/static/chunks/{2cejn75gug3j8.js → 3kmaqcp7rldad.js} +1 -1
  168. package/.next/standalone/.next/static/chunks/{turbopack-0vavqo2d-tlt3.js → turbopack-10hj8t5pf33tu.js} +1 -1
  169. package/.next/standalone/.opencode/plugins/failproofai.mjs +30 -11
  170. package/.next/standalone/app/api/audit/run/route.ts +2 -0
  171. package/.next/standalone/app/audit/_components/empty-state.tsx +1 -1
  172. package/.next/standalone/app/components/global-error-listeners.tsx +27 -0
  173. package/.next/standalone/app/globals.css +25 -1
  174. package/.next/standalone/app/policies/hooks-client.tsx +2 -4
  175. package/.next/standalone/app/project/[name]/page.tsx +30 -10
  176. package/.next/standalone/app/project/[name]/session/[sessionId]/page.tsx +71 -21
  177. package/.next/standalone/assets/logos/antigravity.svg +1 -0
  178. package/.next/standalone/assets/logos/devin.svg +1 -0
  179. package/.next/standalone/assets/logos/factory-dark.png +0 -0
  180. package/.next/standalone/assets/logos/factory-light.png +0 -0
  181. package/.next/standalone/assets/logos/goose-dark.svg +1 -0
  182. package/.next/standalone/assets/logos/goose-light.svg +1 -0
  183. package/.next/standalone/assets/logos/openclaw.svg +22 -0
  184. package/.next/standalone/ci/cli-integration/Dockerfile +47 -0
  185. package/.next/standalone/ci/cli-integration/README.md +69 -0
  186. package/.next/standalone/ci/cli-integration/canary-policies.mjs +45 -0
  187. package/.next/standalone/ci/cli-integration/capture-tokens.sh +48 -0
  188. package/.next/standalone/ci/cli-integration/inject-tokens.sh +44 -0
  189. package/.next/standalone/ci/cli-integration/install-clis.sh +91 -0
  190. package/.next/standalone/ci/cli-integration/probe-cli.sh +208 -0
  191. package/.next/standalone/ci/cli-integration/report.js +74 -0
  192. package/.next/standalone/ci/cli-integration/run.sh +107 -0
  193. package/.next/standalone/components/navbar.tsx +5 -11
  194. package/.next/standalone/components/reach-developers.tsx +2 -2
  195. package/.next/standalone/docker-hook-sync/Dockerfile +8 -4
  196. package/.next/standalone/lib/antigravity-projects.ts +224 -0
  197. package/.next/standalone/lib/antigravity-sessions.ts +283 -0
  198. package/.next/standalone/lib/cli-registry.ts +26 -6
  199. package/.next/standalone/lib/devin-projects.ts +141 -0
  200. package/.next/standalone/lib/devin-sessions.ts +343 -0
  201. package/.next/standalone/lib/download-session.ts +56 -5
  202. package/.next/standalone/lib/error-origin.ts +67 -0
  203. package/.next/standalone/lib/factory-projects.ts +109 -0
  204. package/.next/standalone/lib/factory-sessions.ts +312 -0
  205. package/.next/standalone/lib/goose-projects.ts +148 -0
  206. package/.next/standalone/lib/goose-sessions.ts +296 -0
  207. package/.next/standalone/lib/install-check.ts +231 -0
  208. package/.next/standalone/lib/openclaw-projects.ts +182 -0
  209. package/.next/standalone/lib/openclaw-sessions.ts +284 -0
  210. package/.next/standalone/lib/projects.ts +33 -9
  211. package/.next/standalone/lib/telemetry-sanitize.ts +43 -0
  212. package/.next/standalone/openclaw-plugin/index.js +223 -0
  213. package/.next/standalone/openclaw-plugin/openclaw.plugin.json +6 -0
  214. package/.next/standalone/openclaw-plugin/package.json +12 -0
  215. package/.next/standalone/package.json +2 -3
  216. package/.next/standalone/server.js +1 -1
  217. package/README.md +94 -62
  218. package/bin/failproofai.mjs +98 -30
  219. package/dist/cli.mjs +12499 -9243
  220. package/lib/antigravity-projects.ts +224 -0
  221. package/lib/antigravity-sessions.ts +283 -0
  222. package/lib/cli-registry.ts +26 -6
  223. package/lib/devin-projects.ts +141 -0
  224. package/lib/devin-sessions.ts +343 -0
  225. package/lib/download-session.ts +56 -5
  226. package/lib/error-origin.ts +67 -0
  227. package/lib/factory-projects.ts +109 -0
  228. package/lib/factory-sessions.ts +312 -0
  229. package/lib/goose-projects.ts +148 -0
  230. package/lib/goose-sessions.ts +296 -0
  231. package/lib/install-check.ts +231 -0
  232. package/lib/openclaw-projects.ts +182 -0
  233. package/lib/openclaw-sessions.ts +284 -0
  234. package/lib/projects.ts +33 -9
  235. package/lib/telemetry-sanitize.ts +43 -0
  236. package/openclaw-plugin/index.js +223 -0
  237. package/openclaw-plugin/openclaw.plugin.json +6 -0
  238. package/openclaw-plugin/package.json +12 -0
  239. package/package.json +2 -3
  240. package/scripts/dev-hook.mjs +292 -0
  241. package/scripts/install-diagnosis.mjs +5 -8
  242. package/scripts/install-telemetry.mjs +12 -4
  243. package/scripts/launch.ts +4 -8
  244. package/scripts/sync-agent-cli-harnesses-prompt.md +7 -10
  245. package/scripts/translate-docs/cli.ts +120 -53
  246. package/scripts/translate-docs/config.ts +57 -13
  247. package/scripts/translate-docs/mdx-translator.ts +177 -28
  248. package/scripts/translate-docs/mintlify-nav.ts +91 -10
  249. package/scripts/translate-docs/readme-translator.ts +13 -5
  250. package/scripts/translate-docs/translator.ts +38 -2
  251. package/scripts/translate-docs/types.ts +3 -0
  252. package/scripts/validate-mdx.ts +12 -4
  253. package/src/audit/cli-adapters/antigravity.ts +87 -0
  254. package/src/audit/cli-adapters/devin.ts +53 -0
  255. package/src/audit/cli-adapters/factory.ts +75 -0
  256. package/src/audit/cli-adapters/goose.ts +53 -0
  257. package/src/audit/cli-adapters/index.ts +30 -6
  258. package/src/audit/cli-adapters/openclaw.ts +56 -0
  259. package/src/audit/cli.ts +83 -8
  260. package/src/audit/report.ts +1 -1
  261. package/src/audit/types.ts +1 -1
  262. package/src/hooks/builtin-policies.ts +5 -5
  263. package/src/hooks/configure-wizard.ts +356 -0
  264. package/src/hooks/handler.ts +283 -218
  265. package/src/hooks/hook-telemetry.ts +43 -3
  266. package/src/hooks/install-prompt.ts +92 -173
  267. package/src/hooks/integrations.ts +739 -138
  268. package/src/hooks/manager.ts +46 -2
  269. package/src/hooks/policy-evaluator.ts +301 -121
  270. package/src/hooks/policy-presets.ts +71 -0
  271. package/src/hooks/resolve-cwd.ts +1 -1
  272. package/src/hooks/resolve-permission-mode.ts +1 -5
  273. package/src/hooks/resolve-transcript-path.ts +25 -7
  274. package/src/hooks/tool-name-canonicalize.ts +36 -3
  275. package/src/hooks/tui.ts +578 -0
  276. package/src/hooks/types.ts +447 -109
  277. package/.next/standalone/.gemini/settings.json +0 -147
  278. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cag8qd._.js +0 -3
  279. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cefjd9._.js +0 -3
  280. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ekj92q._.js +0 -3
  281. package/.next/standalone/.next/server/chunks/[root-of-the-server]__12v-lma._.js +0 -3
  282. package/.next/standalone/.next/server/chunks/[root-of-the-server]__136y39g._.js +0 -3
  283. package/.next/standalone/.next/server/chunks/[root-of-the-server]__13h8pzr._.js +0 -3
  284. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1hgv_75._.js +0 -3
  285. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04bqvos._.js +0 -3
  286. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dqgs96._.js +0 -3
  287. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0q5rfxg._.js +0 -3
  288. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qukut7._.js +0 -4
  289. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ql-mch._.js +0 -3
  290. package/.next/standalone/.next/server/chunks/ssr/_11v0g3z._.js +0 -3
  291. package/.next/standalone/.next/server/chunks/ssr/lib_gemini-projects_ts_1c7bgx-._.js +0 -3
  292. package/.next/standalone/.next/static/chunks/0fa7j157kg9_d.js +0 -1
  293. package/.next/standalone/.next/static/chunks/0nrah-qv6smeg.js +0 -6
  294. package/.next/standalone/.next/static/chunks/0wtagd8a5gwq-.js +0 -1
  295. package/.next/standalone/.next/static/chunks/1c8i78p7t1i-5.js +0 -1
  296. package/.next/standalone/.next/static/chunks/25qr0e6ez0ei0.js +0 -1
  297. package/.next/standalone/.next/static/chunks/25s52un3k_wht.css +0 -2
  298. package/.next/standalone/assets/logos/gemini-dark.svg +0 -13
  299. package/.next/standalone/assets/logos/gemini-light.svg +0 -13
  300. package/.next/standalone/lib/gemini-projects.ts +0 -243
  301. package/.next/standalone/lib/gemini-sessions.ts +0 -365
  302. package/lib/gemini-projects.ts +0 -243
  303. package/lib/gemini-sessions.ts +0 -365
  304. package/scripts/postinstall.mjs +0 -243
  305. package/scripts/preuninstall.mjs +0 -131
  306. package/src/audit/cli-adapters/gemini.ts +0 -51
  307. package/src/hooks/first-run-nudge.ts +0 -146
  308. /package/.next/standalone/.next/static/{kmzdjTLVs6LqsfyOaUf69 → LkN-JjmhKGmL-WklH7WVi}/_buildManifest.js +0 -0
  309. /package/.next/standalone/.next/static/{kmzdjTLVs6LqsfyOaUf69 → LkN-JjmhKGmL-WklH7WVi}/_clientMiddlewareManifest.js +0 -0
  310. /package/.next/standalone/.next/static/{kmzdjTLVs6LqsfyOaUf69 → LkN-JjmhKGmL-WklH7WVi}/_ssgManifest.js +0 -0
@@ -32,7 +32,6 @@ tracked in `src/hooks/types.ts` and written to disk by `src/hooks/integrations.t
32
32
  | Cursor Agent | `CURSOR_HOOK_EVENT_TYPES` | `CURSOR_EVENT_MAP` | `.cursor/hooks.json` |
33
33
  | OpenCode | `OPENCODE_HOOK_EVENT_TYPES` | `OPENCODE_EVENT_MAP` | `.opencode/opencode.json` + `.opencode/plugins/failproofai.mjs` |
34
34
  | Pi | `PI_HOOK_EVENT_TYPES` | `PI_EVENT_MAP` | `.pi/settings.json` |
35
- | Gemini CLI | `GEMINI_HOOK_EVENT_TYPES` | `GEMINI_EVENT_MAP` | `.gemini/settings.json` |
36
35
 
37
36
  ## What "drift" means — three scopes
38
37
 
@@ -62,7 +61,7 @@ For each verified CLI, compare the upstream docs to this repo across three scope
62
61
  when you only need to **inspect** a committed fixture, prefer
63
62
  `git show HEAD:<path>` (e.g. `git show HEAD:.codex/hooks.json`) — it is never
64
63
  blocked and is the reliable way to read `.claude/settings.json`, `.codex/hooks.json`,
65
- `.cursor/hooks.json`, `.github/hooks/failproofai.json`, `.gemini/settings.json`,
64
+ `.cursor/hooks.json`, `.github/hooks/failproofai.json`,
66
65
  `.pi/settings.json`, and `.opencode/*`.
67
66
  - Do **NOT** run `failproofai policies --install` (or any `failproofai` subcommand)
68
67
  to regenerate a fixture — it is blocked. Edit fixtures by hand.
@@ -76,7 +75,7 @@ Spawn one subagent per CLI (seven, in parallel). Each subagent, for its CLI:
76
75
  **settings-file schema** (top-level keys, per-entry shape, command field name,
77
76
  timeout field name **and unit**, and whether `matcher` / `version` / `$schema`
78
77
  are present). **Use upstream casing exactly** — Codex snake_case, Cursor
79
- camelCase, OpenCode dot.namespaced, Pi snake_case, Claude/Copilot/Gemini
78
+ camelCase, OpenCode dot.namespaced, Pi snake_case, Claude/Copilot
80
79
  PascalCase. Do **not** normalize.
81
80
  2. Compare against this repo: the CLI's `*HOOK_EVENT_TYPES` array + paired
82
81
  `*EVENT_MAP` (scope 1); its `*_TOOL_MAP` / `*_TOOL_INPUT_MAP` and its branch in
@@ -98,7 +97,6 @@ surface is documented in the package source, not a clean enumeration).
98
97
  | Cursor | https://cursor.com/docs/hooks |
99
98
  | OpenCode | https://opencode.ai/docs/plugins/ |
100
99
  | Pi | https://www.npmjs.com/package/@mariozechner/pi-coding-agent |
101
- | Gemini | https://geminicli.com/docs/hooks/ · https://geminicli.com/docs/reference/tools/ (tool names) |
102
100
 
103
101
  ## Phase 2 — Decide what to do (do this BEFORE editing any files)
104
102
 
@@ -122,7 +120,6 @@ changes that block a clean stop on the comment / no-op paths below.
122
120
 
123
121
  > This open sync PR is missing newly-detected drift:
124
122
  > - **Cursor**: upstream added event `afterEdit` — append to `CURSOR_HOOK_EVENT_TYPES` (+ a `CURSOR_EVENT_MAP` entry).
125
- > - **Gemini**: the `run_shell_command` tool was renamed to `shell` — the `GEMINI_TOOL_MAP` key is stale.
126
123
  >
127
124
  > (hook-sync bot — please fold these into this PR rather than opening a second sync PR.)
128
125
 
@@ -140,7 +137,7 @@ requires.
140
137
  - **Append** new events just before `] as const`, preserving upstream casing.
141
138
  - **Delete** removed events; if the CLI has an `*EVENT_MAP`, also delete the same
142
139
  key from that map (the `Record` is exhaustive — a stale key fails `tsc`).
143
- - For **map-bearing CLIs** (Codex, Cursor, OpenCode, Pi, Gemini), do **NOT** invent
140
+ - For **map-bearing CLIs** (Codex, Cursor, OpenCode, Pi), do **NOT** invent
144
141
  the canonical mapping for a newly-added event — leave it out of the `*EVENT_MAP`
145
142
  so `tsc` fails intentionally, and add a reviewer-checklist item to the PR body
146
143
  (see below). For **Claude and Copilot** (no map), the build stays green.
@@ -148,9 +145,9 @@ requires.
148
145
  - If `HOOK_EVENT_TYPES` (Claude) changed: in `__tests__/hooks/manager.test.ts`,
149
146
  update the `installs hooks for all <N> event types` description AND both
150
147
  `expect(Object.keys(written.hooks)).toHaveLength(<N>)` assertions.
151
- - If `GEMINI_HOOK_EVENT_TYPES` changed: in `__tests__/hooks/integrations.test.ts`,
152
- update the `expect(gemini.eventTypes).toHaveLength(<N>)` assertion AND the
153
- matching description string.
148
+ - If a CLI's `*_HOOK_EVENT_TYPES` changed: in `__tests__/hooks/integrations.test.ts`,
149
+ update the matching `expect(<cli>.eventTypes).toHaveLength(<N>)` assertion AND the
150
+ description string.
154
151
  - Locate these by searching for the current count number.
155
152
 
156
153
  ### Scope 2 / Scope 3 (tool schema / settings-file shape)
@@ -211,7 +208,7 @@ The PR **body** must contain, in order:
211
208
  `__tests__/e2e/hooks/<cli>-integration.e2e.test.ts`, the seven dogfood fixtures
212
209
  (`.claude/settings.json`, `.codex/hooks.json`, `.cursor/hooks.json`,
213
210
  `.github/hooks/failproofai.json`, `.opencode/opencode.json`,
214
- `.opencode/plugins/failproofai.mjs`, `.pi/settings.json`, `.gemini/settings.json`),
211
+ `.opencode/plugins/failproofai.mjs`, `.pi/settings.json`),
215
212
  and `CHANGELOG.md`.
216
213
  - Do **NOT** edit `.failproofai/policies-config.json` (the entrypoint manages it),
217
214
  `src/hooks/handler.ts`, `src/hooks/manager.ts`, or any other source file.
@@ -3,10 +3,23 @@ import { parseArgs } from "node:util";
3
3
  import { existsSync, readdirSync, readFileSync } from "node:fs";
4
4
  import { dirname, join, relative } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
- import { LANGUAGES, getLanguagesByTier, getLanguageByCode, getModelForTier } from "./config";
7
- import { getEnglishMdxPages, translateMdxPage } from "./mdx-translator";
6
+ import {
7
+ LANGUAGES,
8
+ getLanguagesByTier,
9
+ getLanguageByCode,
10
+ getModelForTier,
11
+ } from "./config";
12
+ import {
13
+ getEnglishMdxPages,
14
+ translateMdxPage,
15
+ pruneOrphanedTranslations,
16
+ } from "./mdx-translator";
8
17
  import { translateReadme } from "./readme-translator";
9
- import { updateDocsJson, readDocsConfig } from "./mintlify-nav";
18
+ import {
19
+ getNavigationPageReferences,
20
+ updateDocsJson,
21
+ readDocsConfig,
22
+ } from "./mintlify-nav";
10
23
  import { readCache, writeCache, isCached, setCacheEntry } from "./cache";
11
24
  import type { TranslationResult } from "./types";
12
25
 
@@ -24,6 +37,8 @@ const { values: args } = parseArgs({
24
37
  force: { type: "boolean", short: "f", default: false },
25
38
  "update-nav": { type: "boolean", default: false },
26
39
  validate: { type: "boolean", default: false },
40
+ prune: { type: "boolean", default: false },
41
+ "no-prune": { type: "boolean", default: false },
27
42
  model: { type: "string", short: "m" },
28
43
  help: { type: "boolean", short: "h", default: false },
29
44
  },
@@ -44,6 +59,8 @@ Options:
44
59
  -f, --force Ignore cache, re-translate everything
45
60
  --update-nav Regenerate docs.json navigation after translation
46
61
  --validate Check all nav references resolve to files
62
+ --prune Only delete translations whose English source is gone
63
+ --no-prune Skip the prune step during a normal translation run
47
64
  -m, --model <model> Claude model override (default: Sonnet for Tier 1, Haiku for Tier 2/3)
48
65
  -h, --help Show this help
49
66
 
@@ -56,6 +73,7 @@ Examples:
56
73
  bun scripts/translate-docs/cli.ts --dry-run --tier 3 # Preview all translations
57
74
  bun scripts/translate-docs/cli.ts --validate # Check nav references
58
75
  bun scripts/translate-docs/cli.ts --update-nav # Regenerate docs.json
76
+ bun scripts/translate-docs/cli.ts --prune --tier 3 # Drop orphaned translations
59
77
  `);
60
78
  process.exit(0);
61
79
  }
@@ -87,44 +105,14 @@ async function validateNavReferences(): Promise<boolean> {
87
105
  let total = 0;
88
106
  let missing = 0;
89
107
 
90
- const languages = (nav.languages || []) as Array<{
91
- language: string;
92
- tabs: Array<{ groups: Array<{ pages: string[] }> }>;
93
- }>;
94
-
95
- if (languages.length === 0) {
96
- // Flat tabs structure (not yet migrated to languages)
97
- const tabs = (nav.tabs || []) as Array<{
98
- groups: Array<{ pages: string[] }>;
99
- }>;
100
- for (const tab of tabs) {
101
- for (const group of tab.groups) {
102
- for (const page of group.pages) {
103
- total++;
104
- const filePath = join(DOCS_DIR, `${page}.mdx`);
105
- if (!existsSync(filePath)) {
106
- console.error(` MISSING: ${page} -> ${filePath}`);
107
- missing++;
108
- valid = false;
109
- }
110
- }
111
- }
112
- }
113
- } else {
114
- for (const langEntry of languages) {
115
- for (const tab of langEntry.tabs) {
116
- for (const group of tab.groups) {
117
- for (const page of group.pages) {
118
- total++;
119
- const filePath = join(DOCS_DIR, `${page}.mdx`);
120
- if (!existsSync(filePath)) {
121
- console.error(` MISSING [${langEntry.language}]: ${page} -> ${filePath}`);
122
- missing++;
123
- valid = false;
124
- }
125
- }
126
- }
127
- }
108
+ for (const reference of getNavigationPageReferences(nav)) {
109
+ total++;
110
+ const filePath = join(DOCS_DIR, `${reference.page}.mdx`);
111
+ if (!existsSync(filePath)) {
112
+ const context = reference.language ? ` [${reference.language}]` : "";
113
+ console.error(` MISSING${context}: ${reference.page} -> ${filePath}`);
114
+ missing++;
115
+ valid = false;
128
116
  }
129
117
  }
130
118
 
@@ -153,6 +141,26 @@ async function main() {
153
141
  return;
154
142
  }
155
143
 
144
+ // Prune-only mode
145
+ if (args.prune) {
146
+ const langCodes = resolveLanguages();
147
+ const cache = readCache();
148
+ const pruned = pruneOrphanedTranslations(langCodes, {
149
+ dryRun: args["dry-run"],
150
+ cache,
151
+ });
152
+ for (const file of pruned) {
153
+ console.log(
154
+ ` ${args["dry-run"] ? "would remove" : "removed"}: ${file}`,
155
+ );
156
+ }
157
+ if (pruned.length > 0 && !args["dry-run"]) writeCache(cache);
158
+ console.log(
159
+ `\n${pruned.length} orphaned translation(s)${args["dry-run"] ? " would be" : ""} removed.`,
160
+ );
161
+ return;
162
+ }
163
+
156
164
  const langCodes = resolveLanguages();
157
165
  const isDryRun = args["dry-run"];
158
166
  const isForce = args.force;
@@ -169,7 +177,9 @@ async function main() {
169
177
  `${isDryRun ? "[DRY RUN] " : ""}Translating into: ${langCodes.join(", ")}`,
170
178
  );
171
179
  if (!modelOverride) {
172
- console.log(`Models: Tier 1 -> ${getModelForTier(1)}, Tier 2/3 -> ${getModelForTier(2)}`);
180
+ console.log(
181
+ `Models: Tier 1 -> ${getModelForTier(1)}, Tier 2/3 -> ${getModelForTier(2)}`,
182
+ );
173
183
  } else {
174
184
  console.log(`Model override: ${modelOverride}`);
175
185
  }
@@ -186,10 +196,17 @@ async function main() {
186
196
  // configured in translator.ts) to absorb per-request transient
187
197
  // `Connection error.` from LB-induced replica flapping.
188
198
  // Override via TRANSLATE_MAX_CONCURRENT (integer >= 1; otherwise default).
189
- const parsedConcurrent = Number.parseInt(process.env.TRANSLATE_MAX_CONCURRENT ?? "", 10);
199
+ const parsedConcurrent = Number.parseInt(
200
+ process.env.TRANSLATE_MAX_CONCURRENT ?? "",
201
+ 10,
202
+ );
190
203
  const MAX_CONCURRENT =
191
- Number.isInteger(parsedConcurrent) && parsedConcurrent > 0 ? parsedConcurrent : 4;
192
- async function runWithConcurrency<T>(tasks: (() => Promise<T>)[]): Promise<T[]> {
204
+ Number.isInteger(parsedConcurrent) && parsedConcurrent > 0
205
+ ? parsedConcurrent
206
+ : 4;
207
+ async function runWithConcurrency<T>(
208
+ tasks: (() => Promise<T>)[],
209
+ ): Promise<T[]> {
193
210
  const results: T[] = [];
194
211
  let i = 0;
195
212
  async function next(): Promise<void> {
@@ -198,12 +215,33 @@ async function main() {
198
215
  results[idx] = await tasks[idx]();
199
216
  }
200
217
  }
201
- await Promise.all(Array.from({ length: Math.min(MAX_CONCURRENT, tasks.length) }, () => next()));
218
+ await Promise.all(
219
+ Array.from({ length: Math.min(MAX_CONCURRENT, tasks.length) }, () =>
220
+ next(),
221
+ ),
222
+ );
202
223
  return results;
203
224
  }
204
225
 
205
226
  // Translate docs
206
227
  if (!args["readme-only"]) {
228
+ // Drop translations orphaned by an upstream English deletion before
229
+ // translating, so a stale locale page can never outlive its source.
230
+ if (!args["no-prune"]) {
231
+ const pruned = pruneOrphanedTranslations(langCodes, {
232
+ dryRun: isDryRun,
233
+ cache,
234
+ });
235
+ for (const file of pruned) {
236
+ console.log(` ${isDryRun ? "would prune" : "pruned"}: ${file}`);
237
+ }
238
+ if (pruned.length > 0) {
239
+ console.log(
240
+ `${pruned.length} orphaned translation(s)${isDryRun ? " would be" : ""} removed.`,
241
+ );
242
+ }
243
+ }
244
+
207
245
  const pages = getEnglishMdxPages();
208
246
  const filteredPages = args.pages
209
247
  ? pages.filter((p) => {
@@ -227,7 +265,11 @@ async function main() {
227
265
  for (const page of filteredPages) {
228
266
  const relPath = relative(DOCS_DIR, page);
229
267
  const task = { page, relPath, lang };
230
- if (!isForce && !isDryRun && isCached(cache, relPath, lang, pageContents.get(page)!)) {
268
+ if (
269
+ !isForce &&
270
+ !isDryRun &&
271
+ isCached(cache, relPath, lang, pageContents.get(page)!)
272
+ ) {
231
273
  cachedTasks.push(task);
232
274
  } else {
233
275
  uncachedTasks.push(task);
@@ -235,7 +277,9 @@ async function main() {
235
277
  }
236
278
  }
237
279
 
238
- console.log(`\n${filteredPages.length} MDX pages x ${langCodes.length} languages = ${filteredPages.length * langCodes.length} total`);
280
+ console.log(
281
+ `\n${filteredPages.length} MDX pages x ${langCodes.length} languages = ${filteredPages.length * langCodes.length} total`,
282
+ );
239
283
  console.log(` Cached (unchanged): ${cachedTasks.length}`);
240
284
  console.log(` Need translation: ${uncachedTasks.length}`);
241
285
 
@@ -268,7 +312,14 @@ async function main() {
268
312
  console.log(` ${relPath} [${lang}] -> ${status}`);
269
313
  results.push(result);
270
314
  if (!result.cached && !isDryRun) {
271
- setCacheEntry(cache, relPath, lang, pageContents.get(page)!, result.inputTokens, result.outputTokens);
315
+ setCacheEntry(
316
+ cache,
317
+ relPath,
318
+ lang,
319
+ pageContents.get(page)!,
320
+ result.inputTokens,
321
+ result.outputTokens,
322
+ );
272
323
  }
273
324
  } catch (err) {
274
325
  const msg = err instanceof Error ? err.message : String(err);
@@ -285,10 +336,17 @@ async function main() {
285
336
  console.log(`\nTranslating README...`);
286
337
 
287
338
  // Read README once
288
- const readmeSource = readFileSync(join(DOCS_DIR, "..", "README.md"), "utf-8");
339
+ const readmeSource = readFileSync(
340
+ join(DOCS_DIR, "..", "README.md"),
341
+ "utf-8",
342
+ );
289
343
  const uncachedLangs: string[] = [];
290
344
  for (const lang of langCodes) {
291
- if (!isForce && !isDryRun && isCached(cache, "README.md", lang, readmeSource)) {
345
+ if (
346
+ !isForce &&
347
+ !isDryRun &&
348
+ isCached(cache, "README.md", lang, readmeSource)
349
+ ) {
292
350
  console.log(` README.${lang}.md -> cached`);
293
351
  results.push({
294
352
  lang,
@@ -317,10 +375,19 @@ async function main() {
317
375
  const status = isDryRun
318
376
  ? "would translate"
319
377
  : `translated (${result.inputTokens}+${result.outputTokens} tokens)`;
320
- console.log(` README.${lang}.md -> ${langConfig.nativeName}: ${status}`);
378
+ console.log(
379
+ ` README.${lang}.md -> ${langConfig.nativeName}: ${status}`,
380
+ );
321
381
  results.push(result);
322
382
  if (!result.cached && !isDryRun) {
323
- setCacheEntry(cache, "README.md", lang, readmeSource, result.inputTokens, result.outputTokens);
383
+ setCacheEntry(
384
+ cache,
385
+ "README.md",
386
+ lang,
387
+ readmeSource,
388
+ result.inputTokens,
389
+ result.outputTokens,
390
+ );
324
391
  }
325
392
  } catch (err) {
326
393
  const msg = err instanceof Error ? err.message : String(err);
@@ -2,22 +2,60 @@ import type { LanguageConfig } from "./types";
2
2
 
3
3
  export const LANGUAGES: LanguageConfig[] = [
4
4
  // Tier 1 — largest developer populations
5
- { code: "zh", name: "Chinese (Simplified)", nativeName: "\u7b80\u4f53\u4e2d\u6587", tier: 1 },
5
+ {
6
+ code: "zh",
7
+ name: "Chinese (Simplified)",
8
+ nativeName: "\u7b80\u4f53\u4e2d\u6587",
9
+ tier: 1,
10
+ },
6
11
  { code: "ja", name: "Japanese", nativeName: "\u65e5\u672c\u8a9e", tier: 1 },
7
12
  { code: "ko", name: "Korean", nativeName: "\ud55c\uad6d\uc5b4", tier: 1 },
8
13
  { code: "es", name: "Spanish", nativeName: "Espa\u00f1ol", tier: 1 },
9
- { code: "pt-br", name: "Portuguese (Brazil)", nativeName: "Portugu\u00eas", tier: 1 },
14
+ {
15
+ code: "pt-br",
16
+ mintlifyCode: "pt-BR",
17
+ name: "Portuguese (Brazil)",
18
+ nativeName: "Portugu\u00eas",
19
+ tier: 1,
20
+ },
10
21
  { code: "de", name: "German", nativeName: "Deutsch", tier: 1 },
11
22
  { code: "fr", name: "French", nativeName: "Fran\u00e7ais", tier: 1 },
12
23
  // Tier 2 — strong tech communities
13
- { code: "ru", name: "Russian", nativeName: "\u0420\u0443\u0441\u0441\u043a\u0438\u0439", tier: 2 },
14
- { code: "hi", name: "Hindi", nativeName: "\u0939\u093f\u0928\u094d\u0926\u0940", tier: 2 },
24
+ {
25
+ code: "ru",
26
+ name: "Russian",
27
+ nativeName: "\u0420\u0443\u0441\u0441\u043a\u0438\u0439",
28
+ tier: 2,
29
+ },
30
+ {
31
+ code: "hi",
32
+ name: "Hindi",
33
+ nativeName: "\u0939\u093f\u0928\u094d\u0926\u0940",
34
+ tier: 2,
35
+ },
15
36
  { code: "tr", name: "Turkish", nativeName: "T\u00fcrk\u00e7e", tier: 2 },
16
- { code: "vi", name: "Vietnamese", nativeName: "Ti\u1ebfng Vi\u1ec7t", tier: 2 },
37
+ {
38
+ code: "vi",
39
+ name: "Vietnamese",
40
+ nativeName: "Ti\u1ebfng Vi\u1ec7t",
41
+ tier: 2,
42
+ },
17
43
  { code: "it", name: "Italian", nativeName: "Italiano", tier: 2 },
18
44
  // Tier 3 — RTL languages
19
- { code: "ar", name: "Arabic", nativeName: "\u0627\u0644\u0639\u0631\u0628\u064a\u0629", tier: 3, rtl: true },
20
- { code: "he", name: "Hebrew", nativeName: "\u05e2\u05d1\u05e8\u05d9\u05ea", tier: 3, rtl: true },
45
+ {
46
+ code: "ar",
47
+ name: "Arabic",
48
+ nativeName: "\u0627\u0644\u0639\u0631\u0628\u064a\u0629",
49
+ tier: 3,
50
+ rtl: true,
51
+ },
52
+ {
53
+ code: "he",
54
+ name: "Hebrew",
55
+ nativeName: "\u05e2\u05d1\u05e8\u05d9\u05ea",
56
+ tier: 3,
57
+ rtl: true,
58
+ },
21
59
  ];
22
60
 
23
61
  export function getLanguagesByTier(maxTier: number): LanguageConfig[] {
@@ -184,17 +222,21 @@ export const NAV_TRANSLATIONS: Record<
184
222
  ru: {
185
223
  docs: "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f",
186
224
  examples: "\u041f\u0440\u0438\u043c\u0435\u0440\u044b",
187
- gettingStarted: "\u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b",
188
- coreConcepts: "\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438",
225
+ gettingStarted:
226
+ "\u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b",
227
+ coreConcepts:
228
+ "\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438",
189
229
  cli: "CLI",
190
230
  tools: "\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b",
191
- advanced: "\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439",
231
+ advanced:
232
+ "\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439",
192
233
  },
193
234
  hi: {
194
235
  docs: "\u0926\u0938\u094d\u0924\u093e\u0935\u0947\u091c\u093c",
195
236
  examples: "\u0909\u0926\u093e\u0939\u0930\u0923",
196
237
  gettingStarted: "\u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
197
- coreConcepts: "\u092e\u0942\u0932 \u0905\u0935\u0927\u093e\u0930\u0923\u093e\u090f\u0901",
238
+ coreConcepts:
239
+ "\u092e\u0942\u0932 \u0905\u0935\u0927\u093e\u0930\u0923\u093e\u090f\u0901",
198
240
  cli: "CLI",
199
241
  tools: "\u0909\u092a\u0915\u0930\u0923",
200
242
  advanced: "\u0909\u0928\u094d\u0928\u0924",
@@ -230,7 +272,8 @@ export const NAV_TRANSLATIONS: Record<
230
272
  docs: "\u0627\u0644\u0645\u0633\u062a\u0646\u062f\u0627\u062a",
231
273
  examples: "\u0623\u0645\u062b\u0644\u0629",
232
274
  gettingStarted: "\u0627\u0644\u0628\u062f\u0627\u064a\u0629",
233
- coreConcepts: "\u0627\u0644\u0645\u0641\u0627\u0647\u064a\u0645 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629",
275
+ coreConcepts:
276
+ "\u0627\u0644\u0645\u0641\u0627\u0647\u064a\u0645 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629",
234
277
  cli: "CLI",
235
278
  tools: "\u0627\u0644\u0623\u062f\u0648\u0627\u062a",
236
279
  advanced: "\u0645\u062a\u0642\u062f\u0645",
@@ -238,7 +281,8 @@ export const NAV_TRANSLATIONS: Record<
238
281
  he: {
239
282
  docs: "\u05ea\u05d9\u05e2\u05d5\u05d3",
240
283
  examples: "\u05d3\u05d5\u05d2\u05de\u05d0\u05d5\u05ea",
241
- gettingStarted: "\u05ea\u05d7\u05d9\u05dc\u05ea \u05e2\u05d1\u05d5\u05d3\u05d4",
284
+ gettingStarted:
285
+ "\u05ea\u05d7\u05d9\u05dc\u05ea \u05e2\u05d1\u05d5\u05d3\u05d4",
242
286
  coreConcepts: "\u05de\u05d5\u05e9\u05d2\u05d9 \u05d9\u05e1\u05d5\u05d3",
243
287
  cli: "CLI",
244
288
  tools: "\u05db\u05dc\u05d9\u05dd",