failproofai 0.0.2-beta.7 → 0.0.2-beta.9

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 (390) hide show
  1. package/.next/standalone/.claude/settings.json +316 -0
  2. package/.next/standalone/.failproofai/policies/workflow-policies.mjs +62 -0
  3. package/.next/standalone/.failproofai/policies-config.json +39 -0
  4. package/.next/standalone/.next/BUILD_ID +1 -1
  5. package/.next/standalone/.next/build-manifest.json +3 -3
  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/server-reference-manifest.json +1 -1
  9. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  13. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  14. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  15. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  16. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  17. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  18. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  19. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  22. package/.next/standalone/.next/server/app/_not-found.rsc +17 -17
  23. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +17 -17
  24. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  25. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
  26. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  27. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  28. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  29. package/.next/standalone/.next/server/app/index.html +1 -1
  30. package/.next/standalone/.next/server/app/index.rsc +16 -16
  31. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  32. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +16 -16
  33. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  34. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +11 -11
  35. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  36. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  37. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
  40. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  43. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  46. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  47. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  50. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g72weg._.js +3 -0
  53. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0kjo7d_._.js +1 -1
  54. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
  55. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
  56. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
  57. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
  58. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
  59. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
  60. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__05zi2mt._.js → [root-of-the-server]__0vn1ciw._.js} +2 -2
  61. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +2 -1
  62. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0kkt_9z._.js → [root-of-the-server]__0z-n~~r._.js} +2 -2
  63. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
  64. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
  65. package/.next/standalone/.next/server/chunks/ssr/_0x..fj-._.js +1 -1
  66. package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
  67. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
  68. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
  69. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  70. package/.next/standalone/.next/server/pages/404.html +2 -2
  71. package/.next/standalone/.next/server/pages/500.html +1 -1
  72. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  73. package/.next/standalone/.next/server/server-reference-manifest.json +9 -9
  74. package/.next/standalone/.next/static/chunks/{0ltx5i0xv85_s.js → 04wavch6dsfes.js} +1 -1
  75. package/.next/standalone/.next/static/chunks/{13jdpvk~s2da8.js → 0drr--vxs_m-c.js} +1 -1
  76. package/.next/standalone/.next/static/chunks/{0jf9lx3rkmqx_.css → 0gu_a.a80ritd.css} +1 -1
  77. package/.next/standalone/.next/static/chunks/{0e76l4~hq_sei.js → 0i1ilz5554nv9.js} +1 -1
  78. package/.next/standalone/.next/static/chunks/{0suauczjqzn07.js → 0keqg6-cjs8aa.js} +1 -1
  79. package/.next/standalone/.next/static/chunks/{0w.rtg9.m8dk-.js → 0myzx7y.rqqi3.js} +2 -2
  80. package/.next/standalone/.next/static/chunks/{02u4v.k5amfah.js → 0zfrusm~j404v.js} +1 -1
  81. package/.next/standalone/.next/static/chunks/{0bkizbynk9via.js → 10xhknzfyigcu.js} +1 -1
  82. package/.next/standalone/.next/static/chunks/{0q7atesxo-36k.js → 16yg3xhkmdb9v.js} +1 -1
  83. package/.next/standalone/CHANGELOG.md +27 -0
  84. package/.next/standalone/CLAUDE.md +14 -0
  85. package/.next/standalone/README.md +16 -0
  86. package/.next/standalone/bun.lock +45 -0
  87. package/.next/standalone/dist/cli.mjs +44 -23
  88. package/.next/standalone/docs/ar/architecture.mdx +333 -0
  89. package/.next/standalone/docs/ar/built-in-policies.mdx +566 -0
  90. package/.next/standalone/docs/ar/cli/dashboard.mdx +28 -0
  91. package/.next/standalone/docs/ar/cli/environment-variables.mdx +34 -0
  92. package/.next/standalone/docs/ar/cli/hook.mdx +31 -0
  93. package/.next/standalone/docs/ar/cli/install-policies.mdx +49 -0
  94. package/.next/standalone/docs/ar/cli/list-policies.mdx +31 -0
  95. package/.next/standalone/docs/ar/cli/remove-policies.mdx +45 -0
  96. package/.next/standalone/docs/ar/cli/version.mdx +13 -0
  97. package/.next/standalone/docs/ar/configuration.mdx +223 -0
  98. package/.next/standalone/docs/ar/custom-policies.mdx +359 -0
  99. package/.next/standalone/docs/ar/dashboard.mdx +142 -0
  100. package/.next/standalone/docs/ar/examples.mdx +254 -0
  101. package/.next/standalone/docs/ar/for-agents.mdx +39 -0
  102. package/.next/standalone/docs/ar/getting-started.mdx +134 -0
  103. package/.next/standalone/docs/ar/introduction.mdx +58 -0
  104. package/.next/standalone/docs/ar/package-aliases.mdx +82 -0
  105. package/.next/standalone/docs/ar/testing.mdx +261 -0
  106. package/.next/standalone/docs/built-in-policies.mdx +17 -1
  107. package/.next/standalone/docs/configuration.mdx +1 -1
  108. package/.next/standalone/docs/custom-policies.mdx +3 -3
  109. package/.next/standalone/docs/de/architecture.mdx +332 -0
  110. package/.next/standalone/docs/de/built-in-policies.mdx +564 -0
  111. package/.next/standalone/docs/de/cli/dashboard.mdx +28 -0
  112. package/.next/standalone/docs/de/cli/environment-variables.mdx +34 -0
  113. package/.next/standalone/docs/de/cli/hook.mdx +30 -0
  114. package/.next/standalone/docs/de/cli/install-policies.mdx +48 -0
  115. package/.next/standalone/docs/de/cli/list-policies.mdx +31 -0
  116. package/.next/standalone/docs/de/cli/remove-policies.mdx +44 -0
  117. package/.next/standalone/docs/de/cli/version.mdx +12 -0
  118. package/.next/standalone/docs/de/configuration.mdx +222 -0
  119. package/.next/standalone/docs/de/custom-policies.mdx +357 -0
  120. package/.next/standalone/docs/de/dashboard.mdx +142 -0
  121. package/.next/standalone/docs/de/examples.mdx +253 -0
  122. package/.next/standalone/docs/de/for-agents.mdx +38 -0
  123. package/.next/standalone/docs/de/getting-started.mdx +134 -0
  124. package/.next/standalone/docs/de/introduction.mdx +57 -0
  125. package/.next/standalone/docs/de/package-aliases.mdx +82 -0
  126. package/.next/standalone/docs/de/testing.mdx +260 -0
  127. package/.next/standalone/docs/docs.json +922 -35
  128. package/.next/standalone/docs/es/architecture.mdx +332 -0
  129. package/.next/standalone/docs/es/built-in-policies.mdx +564 -0
  130. package/.next/standalone/docs/es/cli/dashboard.mdx +28 -0
  131. package/.next/standalone/docs/es/cli/environment-variables.mdx +34 -0
  132. package/.next/standalone/docs/es/cli/hook.mdx +30 -0
  133. package/.next/standalone/docs/es/cli/install-policies.mdx +48 -0
  134. package/.next/standalone/docs/es/cli/list-policies.mdx +31 -0
  135. package/.next/standalone/docs/es/cli/remove-policies.mdx +44 -0
  136. package/.next/standalone/docs/es/cli/version.mdx +12 -0
  137. package/.next/standalone/docs/es/configuration.mdx +222 -0
  138. package/.next/standalone/docs/es/custom-policies.mdx +357 -0
  139. package/.next/standalone/docs/es/dashboard.mdx +142 -0
  140. package/.next/standalone/docs/es/examples.mdx +253 -0
  141. package/.next/standalone/docs/es/for-agents.mdx +38 -0
  142. package/.next/standalone/docs/es/getting-started.mdx +134 -0
  143. package/.next/standalone/docs/es/introduction.mdx +57 -0
  144. package/.next/standalone/docs/es/package-aliases.mdx +82 -0
  145. package/.next/standalone/docs/es/testing.mdx +260 -0
  146. package/.next/standalone/docs/fr/architecture.mdx +332 -0
  147. package/.next/standalone/docs/fr/built-in-policies.mdx +564 -0
  148. package/.next/standalone/docs/fr/cli/dashboard.mdx +28 -0
  149. package/.next/standalone/docs/fr/cli/environment-variables.mdx +34 -0
  150. package/.next/standalone/docs/fr/cli/hook.mdx +30 -0
  151. package/.next/standalone/docs/fr/cli/install-policies.mdx +48 -0
  152. package/.next/standalone/docs/fr/cli/list-policies.mdx +31 -0
  153. package/.next/standalone/docs/fr/cli/remove-policies.mdx +44 -0
  154. package/.next/standalone/docs/fr/cli/version.mdx +12 -0
  155. package/.next/standalone/docs/fr/configuration.mdx +222 -0
  156. package/.next/standalone/docs/fr/custom-policies.mdx +357 -0
  157. package/.next/standalone/docs/fr/dashboard.mdx +142 -0
  158. package/.next/standalone/docs/fr/examples.mdx +253 -0
  159. package/.next/standalone/docs/fr/for-agents.mdx +38 -0
  160. package/.next/standalone/docs/fr/getting-started.mdx +134 -0
  161. package/.next/standalone/docs/fr/introduction.mdx +57 -0
  162. package/.next/standalone/docs/fr/package-aliases.mdx +82 -0
  163. package/.next/standalone/docs/fr/testing.mdx +260 -0
  164. package/.next/standalone/docs/he/architecture.mdx +333 -0
  165. package/.next/standalone/docs/he/built-in-policies.mdx +564 -0
  166. package/.next/standalone/docs/he/cli/dashboard.mdx +28 -0
  167. package/.next/standalone/docs/he/cli/environment-variables.mdx +34 -0
  168. package/.next/standalone/docs/he/cli/hook.mdx +30 -0
  169. package/.next/standalone/docs/he/cli/install-policies.mdx +48 -0
  170. package/.next/standalone/docs/he/cli/list-policies.mdx +32 -0
  171. package/.next/standalone/docs/he/cli/remove-policies.mdx +44 -0
  172. package/.next/standalone/docs/he/cli/version.mdx +12 -0
  173. package/.next/standalone/docs/he/configuration.mdx +222 -0
  174. package/.next/standalone/docs/he/custom-policies.mdx +357 -0
  175. package/.next/standalone/docs/he/dashboard.mdx +142 -0
  176. package/.next/standalone/docs/he/examples.mdx +253 -0
  177. package/.next/standalone/docs/he/for-agents.mdx +38 -0
  178. package/.next/standalone/docs/he/getting-started.mdx +135 -0
  179. package/.next/standalone/docs/he/introduction.mdx +57 -0
  180. package/.next/standalone/docs/he/package-aliases.mdx +82 -0
  181. package/.next/standalone/docs/he/testing.mdx +260 -0
  182. package/.next/standalone/docs/hi/architecture.mdx +334 -0
  183. package/.next/standalone/docs/hi/built-in-policies.mdx +564 -0
  184. package/.next/standalone/docs/hi/cli/dashboard.mdx +28 -0
  185. package/.next/standalone/docs/hi/cli/environment-variables.mdx +34 -0
  186. package/.next/standalone/docs/hi/cli/hook.mdx +30 -0
  187. package/.next/standalone/docs/hi/cli/install-policies.mdx +48 -0
  188. package/.next/standalone/docs/hi/cli/list-policies.mdx +31 -0
  189. package/.next/standalone/docs/hi/cli/remove-policies.mdx +44 -0
  190. package/.next/standalone/docs/hi/cli/version.mdx +12 -0
  191. package/.next/standalone/docs/hi/configuration.mdx +222 -0
  192. package/.next/standalone/docs/hi/custom-policies.mdx +357 -0
  193. package/.next/standalone/docs/hi/dashboard.mdx +142 -0
  194. package/.next/standalone/docs/hi/examples.mdx +255 -0
  195. package/.next/standalone/docs/hi/for-agents.mdx +38 -0
  196. package/.next/standalone/docs/hi/getting-started.mdx +134 -0
  197. package/.next/standalone/docs/hi/introduction.mdx +57 -0
  198. package/.next/standalone/docs/hi/package-aliases.mdx +82 -0
  199. package/.next/standalone/docs/hi/testing.mdx +260 -0
  200. package/.next/standalone/docs/i18n/README.ar.md +312 -0
  201. package/.next/standalone/docs/i18n/README.de.md +307 -0
  202. package/.next/standalone/docs/i18n/README.es.md +307 -0
  203. package/.next/standalone/docs/i18n/README.fr.md +307 -0
  204. package/.next/standalone/docs/i18n/README.he.md +312 -0
  205. package/.next/standalone/docs/i18n/README.hi.md +307 -0
  206. package/.next/standalone/docs/i18n/README.it.md +307 -0
  207. package/.next/standalone/docs/i18n/README.ja.md +307 -0
  208. package/.next/standalone/docs/i18n/README.ko.md +307 -0
  209. package/.next/standalone/docs/i18n/README.pt-br.md +307 -0
  210. package/.next/standalone/docs/i18n/README.ru.md +308 -0
  211. package/.next/standalone/docs/i18n/README.tr.md +308 -0
  212. package/.next/standalone/docs/i18n/README.vi.md +308 -0
  213. package/.next/standalone/docs/i18n/README.zh.md +307 -0
  214. package/.next/standalone/docs/it/architecture.mdx +333 -0
  215. package/.next/standalone/docs/it/built-in-policies.mdx +564 -0
  216. package/.next/standalone/docs/it/cli/dashboard.mdx +28 -0
  217. package/.next/standalone/docs/it/cli/environment-variables.mdx +34 -0
  218. package/.next/standalone/docs/it/cli/hook.mdx +30 -0
  219. package/.next/standalone/docs/it/cli/install-policies.mdx +48 -0
  220. package/.next/standalone/docs/it/cli/list-policies.mdx +31 -0
  221. package/.next/standalone/docs/it/cli/remove-policies.mdx +44 -0
  222. package/.next/standalone/docs/it/cli/version.mdx +12 -0
  223. package/.next/standalone/docs/it/configuration.mdx +223 -0
  224. package/.next/standalone/docs/it/custom-policies.mdx +358 -0
  225. package/.next/standalone/docs/it/dashboard.mdx +142 -0
  226. package/.next/standalone/docs/it/examples.mdx +253 -0
  227. package/.next/standalone/docs/it/for-agents.mdx +38 -0
  228. package/.next/standalone/docs/it/getting-started.mdx +134 -0
  229. package/.next/standalone/docs/it/introduction.mdx +57 -0
  230. package/.next/standalone/docs/it/package-aliases.mdx +82 -0
  231. package/.next/standalone/docs/it/testing.mdx +260 -0
  232. package/.next/standalone/docs/ja/architecture.mdx +332 -0
  233. package/.next/standalone/docs/ja/built-in-policies.mdx +562 -0
  234. package/.next/standalone/docs/ja/cli/dashboard.mdx +28 -0
  235. package/.next/standalone/docs/ja/cli/environment-variables.mdx +34 -0
  236. package/.next/standalone/docs/ja/cli/hook.mdx +30 -0
  237. package/.next/standalone/docs/ja/cli/install-policies.mdx +48 -0
  238. package/.next/standalone/docs/ja/cli/list-policies.mdx +31 -0
  239. package/.next/standalone/docs/ja/cli/remove-policies.mdx +44 -0
  240. package/.next/standalone/docs/ja/cli/version.mdx +12 -0
  241. package/.next/standalone/docs/ja/configuration.mdx +222 -0
  242. package/.next/standalone/docs/ja/custom-policies.mdx +357 -0
  243. package/.next/standalone/docs/ja/dashboard.mdx +142 -0
  244. package/.next/standalone/docs/ja/examples.mdx +253 -0
  245. package/.next/standalone/docs/ja/for-agents.mdx +38 -0
  246. package/.next/standalone/docs/ja/getting-started.mdx +134 -0
  247. package/.next/standalone/docs/ja/introduction.mdx +57 -0
  248. package/.next/standalone/docs/ja/package-aliases.mdx +82 -0
  249. package/.next/standalone/docs/ja/testing.mdx +260 -0
  250. package/.next/standalone/docs/ko/architecture.mdx +332 -0
  251. package/.next/standalone/docs/ko/built-in-policies.mdx +562 -0
  252. package/.next/standalone/docs/ko/cli/dashboard.mdx +28 -0
  253. package/.next/standalone/docs/ko/cli/environment-variables.mdx +34 -0
  254. package/.next/standalone/docs/ko/cli/hook.mdx +30 -0
  255. package/.next/standalone/docs/ko/cli/install-policies.mdx +48 -0
  256. package/.next/standalone/docs/ko/cli/list-policies.mdx +31 -0
  257. package/.next/standalone/docs/ko/cli/remove-policies.mdx +44 -0
  258. package/.next/standalone/docs/ko/cli/version.mdx +12 -0
  259. package/.next/standalone/docs/ko/configuration.mdx +222 -0
  260. package/.next/standalone/docs/ko/custom-policies.mdx +357 -0
  261. package/.next/standalone/docs/ko/dashboard.mdx +142 -0
  262. package/.next/standalone/docs/ko/examples.mdx +253 -0
  263. package/.next/standalone/docs/ko/for-agents.mdx +38 -0
  264. package/.next/standalone/docs/ko/getting-started.mdx +134 -0
  265. package/.next/standalone/docs/ko/introduction.mdx +57 -0
  266. package/.next/standalone/docs/ko/package-aliases.mdx +82 -0
  267. package/.next/standalone/docs/ko/testing.mdx +260 -0
  268. package/.next/standalone/docs/pt-br/architecture.mdx +332 -0
  269. package/.next/standalone/docs/pt-br/built-in-policies.mdx +564 -0
  270. package/.next/standalone/docs/pt-br/cli/dashboard.mdx +28 -0
  271. package/.next/standalone/docs/pt-br/cli/environment-variables.mdx +34 -0
  272. package/.next/standalone/docs/pt-br/cli/hook.mdx +30 -0
  273. package/.next/standalone/docs/pt-br/cli/install-policies.mdx +48 -0
  274. package/.next/standalone/docs/pt-br/cli/list-policies.mdx +31 -0
  275. package/.next/standalone/docs/pt-br/cli/remove-policies.mdx +44 -0
  276. package/.next/standalone/docs/pt-br/cli/version.mdx +12 -0
  277. package/.next/standalone/docs/pt-br/configuration.mdx +222 -0
  278. package/.next/standalone/docs/pt-br/custom-policies.mdx +357 -0
  279. package/.next/standalone/docs/pt-br/dashboard.mdx +142 -0
  280. package/.next/standalone/docs/pt-br/examples.mdx +253 -0
  281. package/.next/standalone/docs/pt-br/for-agents.mdx +38 -0
  282. package/.next/standalone/docs/pt-br/getting-started.mdx +134 -0
  283. package/.next/standalone/docs/pt-br/introduction.mdx +57 -0
  284. package/.next/standalone/docs/pt-br/package-aliases.mdx +82 -0
  285. package/.next/standalone/docs/pt-br/testing.mdx +260 -0
  286. package/.next/standalone/docs/ru/architecture.mdx +334 -0
  287. package/.next/standalone/docs/ru/built-in-policies.mdx +562 -0
  288. package/.next/standalone/docs/ru/cli/dashboard.mdx +28 -0
  289. package/.next/standalone/docs/ru/cli/environment-variables.mdx +34 -0
  290. package/.next/standalone/docs/ru/cli/hook.mdx +30 -0
  291. package/.next/standalone/docs/ru/cli/install-policies.mdx +48 -0
  292. package/.next/standalone/docs/ru/cli/list-policies.mdx +32 -0
  293. package/.next/standalone/docs/ru/cli/remove-policies.mdx +44 -0
  294. package/.next/standalone/docs/ru/cli/version.mdx +12 -0
  295. package/.next/standalone/docs/ru/configuration.mdx +223 -0
  296. package/.next/standalone/docs/ru/custom-policies.mdx +357 -0
  297. package/.next/standalone/docs/ru/dashboard.mdx +142 -0
  298. package/.next/standalone/docs/ru/examples.mdx +254 -0
  299. package/.next/standalone/docs/ru/for-agents.mdx +38 -0
  300. package/.next/standalone/docs/ru/getting-started.mdx +134 -0
  301. package/.next/standalone/docs/ru/introduction.mdx +57 -0
  302. package/.next/standalone/docs/ru/package-aliases.mdx +82 -0
  303. package/.next/standalone/docs/ru/testing.mdx +260 -0
  304. package/.next/standalone/docs/tr/architecture.mdx +333 -0
  305. package/.next/standalone/docs/tr/built-in-policies.mdx +562 -0
  306. package/.next/standalone/docs/tr/cli/dashboard.mdx +28 -0
  307. package/.next/standalone/docs/tr/cli/environment-variables.mdx +34 -0
  308. package/.next/standalone/docs/tr/cli/hook.mdx +30 -0
  309. package/.next/standalone/docs/tr/cli/install-policies.mdx +48 -0
  310. package/.next/standalone/docs/tr/cli/list-policies.mdx +31 -0
  311. package/.next/standalone/docs/tr/cli/remove-policies.mdx +45 -0
  312. package/.next/standalone/docs/tr/cli/version.mdx +12 -0
  313. package/.next/standalone/docs/tr/configuration.mdx +223 -0
  314. package/.next/standalone/docs/tr/custom-policies.mdx +357 -0
  315. package/.next/standalone/docs/tr/dashboard.mdx +142 -0
  316. package/.next/standalone/docs/tr/examples.mdx +253 -0
  317. package/.next/standalone/docs/tr/for-agents.mdx +38 -0
  318. package/.next/standalone/docs/tr/getting-started.mdx +134 -0
  319. package/.next/standalone/docs/tr/introduction.mdx +57 -0
  320. package/.next/standalone/docs/tr/package-aliases.mdx +82 -0
  321. package/.next/standalone/docs/tr/testing.mdx +260 -0
  322. package/.next/standalone/docs/vi/architecture.mdx +333 -0
  323. package/.next/standalone/docs/vi/built-in-policies.mdx +564 -0
  324. package/.next/standalone/docs/vi/cli/dashboard.mdx +28 -0
  325. package/.next/standalone/docs/vi/cli/environment-variables.mdx +34 -0
  326. package/.next/standalone/docs/vi/cli/hook.mdx +30 -0
  327. package/.next/standalone/docs/vi/cli/install-policies.mdx +48 -0
  328. package/.next/standalone/docs/vi/cli/list-policies.mdx +31 -0
  329. package/.next/standalone/docs/vi/cli/remove-policies.mdx +44 -0
  330. package/.next/standalone/docs/vi/cli/version.mdx +13 -0
  331. package/.next/standalone/docs/vi/configuration.mdx +222 -0
  332. package/.next/standalone/docs/vi/custom-policies.mdx +357 -0
  333. package/.next/standalone/docs/vi/dashboard.mdx +142 -0
  334. package/.next/standalone/docs/vi/examples.mdx +253 -0
  335. package/.next/standalone/docs/vi/for-agents.mdx +38 -0
  336. package/.next/standalone/docs/vi/getting-started.mdx +134 -0
  337. package/.next/standalone/docs/vi/introduction.mdx +57 -0
  338. package/.next/standalone/docs/vi/package-aliases.mdx +82 -0
  339. package/.next/standalone/docs/vi/testing.mdx +260 -0
  340. package/.next/standalone/docs/zh/architecture.mdx +332 -0
  341. package/.next/standalone/docs/zh/built-in-policies.mdx +562 -0
  342. package/.next/standalone/docs/zh/cli/dashboard.mdx +28 -0
  343. package/.next/standalone/docs/zh/cli/environment-variables.mdx +34 -0
  344. package/.next/standalone/docs/zh/cli/hook.mdx +30 -0
  345. package/.next/standalone/docs/zh/cli/install-policies.mdx +48 -0
  346. package/.next/standalone/docs/zh/cli/list-policies.mdx +31 -0
  347. package/.next/standalone/docs/zh/cli/remove-policies.mdx +44 -0
  348. package/.next/standalone/docs/zh/cli/version.mdx +12 -0
  349. package/.next/standalone/docs/zh/configuration.mdx +222 -0
  350. package/.next/standalone/docs/zh/custom-policies.mdx +357 -0
  351. package/.next/standalone/docs/zh/dashboard.mdx +142 -0
  352. package/.next/standalone/docs/zh/examples.mdx +253 -0
  353. package/.next/standalone/docs/zh/for-agents.mdx +38 -0
  354. package/.next/standalone/docs/zh/getting-started.mdx +134 -0
  355. package/.next/standalone/docs/zh/introduction.mdx +57 -0
  356. package/.next/standalone/docs/zh/package-aliases.mdx +82 -0
  357. package/.next/standalone/docs/zh/testing.mdx +260 -0
  358. package/.next/standalone/package.json +8 -2
  359. package/.next/standalone/scripts/translate-docs/cache.ts +62 -0
  360. package/.next/standalone/scripts/translate-docs/cli.ts +357 -0
  361. package/.next/standalone/scripts/translate-docs/config.ts +248 -0
  362. package/.next/standalone/scripts/translate-docs/mdx-translator.ts +153 -0
  363. package/.next/standalone/scripts/translate-docs/mintlify-nav.ts +107 -0
  364. package/.next/standalone/scripts/translate-docs/readme-translator.ts +154 -0
  365. package/.next/standalone/scripts/translate-docs/translator.ts +68 -0
  366. package/.next/standalone/scripts/translate-docs/types.ts +43 -0
  367. package/.next/standalone/server.js +1 -1
  368. package/.next/standalone/src/hooks/custom-hooks-loader.ts +12 -5
  369. package/.next/standalone/src/hooks/handler.ts +9 -3
  370. package/.next/standalone/src/hooks/manager.ts +10 -2
  371. package/.next/standalone/src/hooks/policy-evaluator.ts +20 -16
  372. package/README.md +16 -0
  373. package/dist/cli.mjs +44 -23
  374. package/package.json +8 -2
  375. package/scripts/translate-docs/cache.ts +62 -0
  376. package/scripts/translate-docs/cli.ts +357 -0
  377. package/scripts/translate-docs/config.ts +248 -0
  378. package/scripts/translate-docs/mdx-translator.ts +153 -0
  379. package/scripts/translate-docs/mintlify-nav.ts +107 -0
  380. package/scripts/translate-docs/readme-translator.ts +154 -0
  381. package/scripts/translate-docs/translator.ts +68 -0
  382. package/scripts/translate-docs/types.ts +43 -0
  383. package/src/hooks/custom-hooks-loader.ts +12 -5
  384. package/src/hooks/handler.ts +9 -3
  385. package/src/hooks/manager.ts +10 -2
  386. package/src/hooks/policy-evaluator.ts +20 -16
  387. package/.next/standalone/.next/server/chunks/[root-of-the-server]__02nt~6d._.js +0 -3
  388. /package/.next/standalone/.next/static/{Opbai6exOQP2W488FWmr6 → XqGmAwGDuJ6fEQgD-8y60}/_buildManifest.js +0 -0
  389. /package/.next/standalone/.next/static/{Opbai6exOQP2W488FWmr6 → XqGmAwGDuJ6fEQgD-8y60}/_clientMiddlewareManifest.js +0 -0
  390. /package/.next/standalone/.next/static/{Opbai6exOQP2W488FWmr6 → XqGmAwGDuJ6fEQgD-8y60}/_ssgManifest.js +0 -0
@@ -0,0 +1,153 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, readdirSync, statSync } from "node:fs";
2
+ import { dirname, join, relative } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { getLanguageByCode } from "./config";
5
+ import { translateContent } from "./translator";
6
+ import {
7
+ readCache,
8
+ writeCache,
9
+ isCached,
10
+ setCacheEntry,
11
+ } from "./cache";
12
+ import type { TranslationResult, TranslationCache } from "./types";
13
+
14
+ const __dirname = dirname(fileURLToPath(import.meta.url));
15
+ const DOCS_DIR = join(__dirname, "..", "..", "docs");
16
+
17
+ /**
18
+ * Rewrite internal doc links to include the language prefix.
19
+ * e.g. href="/built-in-policies" -> href="/es/built-in-policies"
20
+ * [Getting started](/getting-started) -> [Getting started](/es/getting-started)
21
+ */
22
+ export function rewriteInternalLinks(
23
+ content: string,
24
+ lang: string,
25
+ ): string {
26
+ // Rewrite MDX component href attributes pointing to internal paths
27
+ let result = content.replace(
28
+ /href="(\/[^"]*?)"/g,
29
+ (_match, path: string) => {
30
+ // Skip external URLs and anchors
31
+ if (path.startsWith("/http") || path === "/") return `href="${path}"`;
32
+ return `href="/${lang}${path}"`;
33
+ },
34
+ );
35
+
36
+ // Rewrite Markdown links with internal paths
37
+ result = result.replace(
38
+ /\]\((\/[^)]*?)\)/g,
39
+ (_match, path: string) => {
40
+ if (path.startsWith("/http") || path === "/") return `](${path})`;
41
+ return `](/${lang}${path})`;
42
+ },
43
+ );
44
+
45
+ return result;
46
+ }
47
+
48
+ /**
49
+ * Translate a single MDX doc page for a given language.
50
+ */
51
+ export async function translateMdxPage(
52
+ sourcePath: string,
53
+ lang: string,
54
+ options: { force?: boolean; dryRun?: boolean; model?: string; cache?: TranslationCache } = {},
55
+ ): Promise<TranslationResult> {
56
+ const relPath = relative(DOCS_DIR, sourcePath);
57
+ const outputPath = join(DOCS_DIR, lang, relPath);
58
+ const sourceContent = readFileSync(sourcePath, "utf-8");
59
+
60
+ const langConfig = getLanguageByCode(lang);
61
+ if (!langConfig) throw new Error(`Unknown language: ${lang}`);
62
+
63
+ // Check cache — use provided cache object or read from disk
64
+ if (!options.force && !options.dryRun) {
65
+ const cache = options.cache ?? readCache();
66
+ if (isCached(cache, relPath, lang, sourceContent)) {
67
+ return {
68
+ lang,
69
+ sourcePath,
70
+ outputPath,
71
+ inputTokens: 0,
72
+ outputTokens: 0,
73
+ cached: true,
74
+ };
75
+ }
76
+ }
77
+
78
+ if (options.dryRun) {
79
+ return {
80
+ lang,
81
+ sourcePath,
82
+ outputPath,
83
+ inputTokens: 0,
84
+ outputTokens: 0,
85
+ cached: false,
86
+ };
87
+ }
88
+
89
+ // Translate
90
+ const { translated, inputTokens, outputTokens } = await translateContent(
91
+ sourceContent,
92
+ lang,
93
+ langConfig.name,
94
+ options.model,
95
+ );
96
+
97
+ // Rewrite internal links
98
+ const withLinks = rewriteInternalLinks(translated, lang);
99
+
100
+ // Write output
101
+ mkdirSync(dirname(outputPath), { recursive: true });
102
+ writeFileSync(outputPath, withLinks);
103
+
104
+ // Update cache — skip if caller manages the cache (batch write)
105
+ if (!options.cache) {
106
+ const cache = readCache();
107
+ setCacheEntry(cache, relPath, lang, sourceContent, inputTokens, outputTokens);
108
+ writeCache(cache);
109
+ }
110
+
111
+ return {
112
+ lang,
113
+ sourcePath,
114
+ outputPath,
115
+ inputTokens,
116
+ outputTokens,
117
+ cached: false,
118
+ };
119
+ }
120
+
121
+ /**
122
+ * Get all MDX page paths from the docs directory (English only, no language subdirs).
123
+ */
124
+ export function getEnglishMdxPages(): string[] {
125
+ const results: string[] = [];
126
+
127
+ function walk(dir: string, prefix: string = "") {
128
+ for (const entry of readdirSync(dir)) {
129
+ const full = join(dir, entry);
130
+ const rel = prefix ? `${prefix}/${entry}` : entry;
131
+ if (statSync(full).isDirectory()) {
132
+ // Skip language directories at the top level
133
+ if (!prefix && isLanguageDir(entry)) continue;
134
+ // Skip non-doc directories like logo, i18n
135
+ if (!prefix && (entry === "logo" || entry === "i18n")) continue;
136
+ walk(full, rel);
137
+ } else if (entry.endsWith(".mdx")) {
138
+ results.push(full);
139
+ }
140
+ }
141
+ }
142
+
143
+ walk(DOCS_DIR);
144
+ return results.sort();
145
+ }
146
+
147
+ function isLanguageDir(name: string): boolean {
148
+ const langCodes = [
149
+ "zh", "ja", "ko", "es", "pt-br", "de", "fr",
150
+ "ru", "hi", "tr", "vi", "it", "ar", "he",
151
+ ];
152
+ return langCodes.includes(name);
153
+ }
@@ -0,0 +1,107 @@
1
+ import { readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { NAV_TRANSLATIONS, LANGUAGES } from "./config";
5
+
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ const DOCS_JSON_PATH = join(__dirname, "..", "..", "docs", "docs.json");
8
+
9
+ interface NavGroup {
10
+ group: string;
11
+ pages: string[];
12
+ }
13
+
14
+ interface NavTab {
15
+ tab: string;
16
+ groups: NavGroup[];
17
+ }
18
+
19
+ interface LanguageNav {
20
+ language: string;
21
+ tabs: NavTab[];
22
+ }
23
+
24
+ /**
25
+ * Build a navigation entry for a specific language by transforming the
26
+ * English navigation structure.
27
+ */
28
+ export function buildLanguageNav(
29
+ englishTabs: NavTab[],
30
+ lang: string,
31
+ ): LanguageNav {
32
+ const t = NAV_TRANSLATIONS[lang];
33
+ if (!t) throw new Error(`No nav translations for language: ${lang}`);
34
+
35
+ const groupNameMap: Record<string, string> = {
36
+ "Getting Started": t.gettingStarted,
37
+ "Core Concepts": t.coreConcepts,
38
+ CLI: t.cli,
39
+ Tools: t.tools,
40
+ Advanced: t.advanced,
41
+ Examples: t.examples,
42
+ };
43
+
44
+ const tabNameMap: Record<string, string> = {
45
+ Docs: t.docs,
46
+ Examples: t.examples,
47
+ };
48
+
49
+ const tabs: NavTab[] = englishTabs.map((tab) => ({
50
+ tab: tabNameMap[tab.tab] || tab.tab,
51
+ groups: tab.groups.map((group) => ({
52
+ group: groupNameMap[group.group] || group.group,
53
+ pages: group.pages.map((page) => `${lang}/${page}`),
54
+ })),
55
+ }));
56
+
57
+ return { language: lang, tabs };
58
+ }
59
+
60
+ /**
61
+ * Read the current docs.json config.
62
+ */
63
+ export function readDocsConfig(): Record<string, unknown> {
64
+ return JSON.parse(readFileSync(DOCS_JSON_PATH, "utf-8"));
65
+ }
66
+
67
+ /**
68
+ * Generate the full languages array for docs.json from the English nav
69
+ * and a list of language codes.
70
+ */
71
+ export function generateLanguagesArray(
72
+ englishTabs: NavTab[],
73
+ langCodes: string[],
74
+ ): LanguageNav[] {
75
+ // English first (default)
76
+ const english: LanguageNav = { language: "en", tabs: englishTabs };
77
+ const others = langCodes.map((code) => buildLanguageNav(englishTabs, code));
78
+ return [english, ...others];
79
+ }
80
+
81
+ /**
82
+ * Update docs.json to use the languages array structure.
83
+ */
84
+ export function updateDocsJson(langCodes: string[]): void {
85
+ const config = readDocsConfig();
86
+ const nav = config.navigation as Record<string, unknown>;
87
+
88
+ // Extract existing English tabs
89
+ const englishTabs = nav.tabs as NavTab[];
90
+ if (!englishTabs) {
91
+ throw new Error("docs.json navigation.tabs not found — is this already using the languages format?");
92
+ }
93
+
94
+ // Build languages array
95
+ const languages = generateLanguagesArray(englishTabs, langCodes);
96
+
97
+ // Replace tabs with languages, preserve global
98
+ const newNav: Record<string, unknown> = {
99
+ languages,
100
+ };
101
+ if (nav.global) {
102
+ newNav.global = nav.global;
103
+ }
104
+
105
+ config.navigation = newNav;
106
+ writeFileSync(DOCS_JSON_PATH, JSON.stringify(config, null, 2) + "\n");
107
+ }
@@ -0,0 +1,154 @@
1
+ import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { LANGUAGES, getLanguageByCode } from "./config";
5
+ import { translateContent } from "./translator";
6
+ import { readCache, writeCache, isCached, setCacheEntry } from "./cache";
7
+ import type { TranslationResult, TranslationCache } from "./types";
8
+
9
+ const __dirname = dirname(fileURLToPath(import.meta.url));
10
+ const ROOT_DIR = join(__dirname, "..", "..");
11
+ const README_PATH = join(ROOT_DIR, "README.md");
12
+ const I18N_DIR = join(ROOT_DIR, "docs", "i18n");
13
+
14
+ function buildLanguageSelector(currentLang: string): string {
15
+ const flags: Record<string, string> = {
16
+ en: "\ud83c\uddfa\ud83c\uddf8",
17
+ zh: "\ud83c\udde8\ud83c\uddf3",
18
+ ja: "\ud83c\uddef\ud83c\uddf5",
19
+ ko: "\ud83c\uddf0\ud83c\uddf7",
20
+ es: "\ud83c\uddea\ud83c\uddf8",
21
+ "pt-br": "\ud83c\udde7\ud83c\uddf7",
22
+ de: "\ud83c\udde9\ud83c\uddea",
23
+ fr: "\ud83c\uddeb\ud83c\uddf7",
24
+ ru: "\ud83c\uddf7\ud83c\uddfa",
25
+ hi: "\ud83c\uddee\ud83c\uddf3",
26
+ tr: "\ud83c\uddf9\ud83c\uddf7",
27
+ vi: "\ud83c\uddfb\ud83c\uddf3",
28
+ it: "\ud83c\uddee\ud83c\uddf9",
29
+ ar: "\ud83c\uddf8\ud83c\udde6",
30
+ he: "\ud83c\uddee\ud83c\uddf1",
31
+ };
32
+
33
+ const links: string[] = [];
34
+
35
+ // English link (to root README)
36
+ if (currentLang !== "en") {
37
+ links.push(`[${flags.en} English](../../README.md)`);
38
+ }
39
+
40
+ for (const lang of LANGUAGES) {
41
+ const flag = flags[lang.code] || "";
42
+ if (lang.code === currentLang) {
43
+ links.push(`**${flag} ${lang.nativeName}**`);
44
+ } else {
45
+ links.push(`[${flag} ${lang.nativeName}](README.${lang.code}.md)`);
46
+ }
47
+ }
48
+
49
+ return links.join(" | ");
50
+ }
51
+
52
+ export async function translateReadme(
53
+ lang: string,
54
+ options: { force?: boolean; dryRun?: boolean; model?: string; cache?: TranslationCache } = {},
55
+ ): Promise<TranslationResult> {
56
+ const outputPath = join(I18N_DIR, `README.${lang}.md`);
57
+ const sourceContent = readFileSync(README_PATH, "utf-8");
58
+
59
+ const langConfig = getLanguageByCode(lang);
60
+ if (!langConfig) throw new Error(`Unknown language: ${lang}`);
61
+
62
+ // Check cache — use provided cache object or read from disk
63
+ if (!options.force && !options.dryRun) {
64
+ const cache = options.cache ?? readCache();
65
+ if (isCached(cache, "README.md", lang, sourceContent)) {
66
+ return {
67
+ lang,
68
+ sourcePath: README_PATH,
69
+ outputPath,
70
+ inputTokens: 0,
71
+ outputTokens: 0,
72
+ cached: true,
73
+ };
74
+ }
75
+ }
76
+
77
+ if (options.dryRun) {
78
+ return {
79
+ lang,
80
+ sourcePath: README_PATH,
81
+ outputPath,
82
+ inputTokens: 0,
83
+ outputTokens: 0,
84
+ cached: false,
85
+ };
86
+ }
87
+
88
+ // Translate
89
+ const { translated, inputTokens, outputTokens } = await translateContent(
90
+ sourceContent,
91
+ lang,
92
+ langConfig.name,
93
+ options.model,
94
+ );
95
+
96
+ // Build the final output with header
97
+ const disclaimer = langConfig.rtl
98
+ ? `> **\u26a0\ufe0f** \u0647\u0630\u0647 \u062a\u0631\u062c\u0645\u0629 \u0622\u0644\u064a\u0629. \u0644\u0644\u0627\u0637\u0644\u0627\u0639 \u0639\u0644\u0649 \u0623\u062d\u062f\u062b \u0625\u0635\u062f\u0627\u0631\u060c \u0631\u0627\u062c\u0639 [English README](../../README.md).`
99
+ : `> **\u26a0\ufe0f** This is an auto-generated translation. For the latest version, see the [English README](../../README.md). Community corrections welcome!`;
100
+
101
+ const langSelector = buildLanguageSelector(lang);
102
+ const rtlOpen = langConfig.rtl ? `<div dir="rtl">\n\n` : "";
103
+ const rtlClose = langConfig.rtl ? `\n\n</div>` : "";
104
+
105
+ const output = `${disclaimer}\n\n${langSelector}\n\n---\n${rtlOpen}\n${translated}\n${rtlClose}`;
106
+
107
+ // Write output
108
+ mkdirSync(I18N_DIR, { recursive: true });
109
+ writeFileSync(outputPath, output);
110
+
111
+ // Update cache — skip if caller manages the cache (batch write)
112
+ if (!options.cache) {
113
+ const cache = readCache();
114
+ setCacheEntry(cache, "README.md", lang, sourceContent, inputTokens, outputTokens);
115
+ writeCache(cache);
116
+ }
117
+
118
+ return {
119
+ lang,
120
+ sourcePath: README_PATH,
121
+ outputPath,
122
+ inputTokens,
123
+ outputTokens,
124
+ cached: false,
125
+ };
126
+ }
127
+
128
+ /**
129
+ * Build the language selector line to add to the main README.
130
+ */
131
+ export function buildMainReadmeLanguageLinks(): string {
132
+ const flags: Record<string, string> = {
133
+ zh: "\ud83c\udde8\ud83c\uddf3",
134
+ ja: "\ud83c\uddef\ud83c\uddf5",
135
+ ko: "\ud83c\uddf0\ud83c\uddf7",
136
+ es: "\ud83c\uddea\ud83c\uddf8",
137
+ "pt-br": "\ud83c\udde7\ud83c\uddf7",
138
+ de: "\ud83c\udde9\ud83c\uddea",
139
+ fr: "\ud83c\uddeb\ud83c\uddf7",
140
+ ru: "\ud83c\uddf7\ud83c\uddfa",
141
+ hi: "\ud83c\uddee\ud83c\uddf3",
142
+ tr: "\ud83c\uddf9\ud83c\uddf7",
143
+ vi: "\ud83c\uddfb\ud83c\uddf3",
144
+ it: "\ud83c\uddee\ud83c\uddf9",
145
+ ar: "\ud83c\uddf8\ud83c\udde6",
146
+ he: "\ud83c\uddee\ud83c\uddf1",
147
+ };
148
+
149
+ const links = LANGUAGES.map(
150
+ (l) => `[${flags[l.code] || ""} ${l.nativeName}](docs/i18n/README.${l.code}.md)`,
151
+ );
152
+
153
+ return `**Translations**: ${links.join(" | ")}`;
154
+ }
@@ -0,0 +1,68 @@
1
+ import Anthropic from "@anthropic-ai/sdk";
2
+ import { DO_NOT_TRANSLATE } from "./config";
3
+
4
+ let client: Anthropic | null = null;
5
+
6
+ function getClient(): Anthropic {
7
+ if (!client) {
8
+ client = new Anthropic();
9
+ }
10
+ return client;
11
+ }
12
+
13
+ const SYSTEM_PROMPT = `You are a professional technical documentation translator. Your task is to translate documentation content precisely and naturally into the target language.
14
+
15
+ ## Rules
16
+
17
+ 1. **Preserve all code blocks exactly as-is** — never translate content inside backtick-fenced code blocks (\`\`\`...\`\`\`) or inline code (\`...\`).
18
+ 2. **Preserve MDX component syntax** — tags like <Card>, <CardGroup>, <CodeGroup>, <Steps>, <Step>, <Note>, <Tip>, <Tabs>, <Tab>, <Warning> must remain unchanged. Their attribute names (title, icon, href, cols) must remain in English. Only translate the text content of the \`title\` attribute and the text body between tags.
19
+ 3. **Preserve YAML frontmatter keys** — only translate the string values of \`title\` and \`description\`. Keep the \`icon\` value unchanged.
20
+ 4. **Preserve all URLs and paths** — never modify href values, image paths, or links.
21
+ 5. **Preserve Markdown structure** — headers (#, ##), lists (-, *), tables (|), bold (**), italic (*), links ([text](url)) must keep their Markdown formatting.
22
+ 6. **Preserve badge/shield URLs** — any [![...](https://img.shields.io/...)](url) pattern must remain completely unchanged.
23
+
24
+ ## Do-not-translate list
25
+
26
+ The following terms must NEVER be translated — keep them exactly as-is in the output:
27
+ ${DO_NOT_TRANSLATE.map((t) => `- ${t}`).join("\n")}
28
+
29
+ ## Translation quality
30
+
31
+ - Use natural, idiomatic phrasing in the target language — do NOT produce word-for-word literal translations.
32
+ - Technical documentation should read as if originally written in the target language by a native-speaking developer.
33
+ - Maintain the same level of formality and tone as the source.
34
+ - For languages that distinguish formal/informal registers, use a professional but approachable tone.
35
+
36
+ ## Output
37
+
38
+ Return ONLY the translated content. Do not add explanations, notes, or commentary.`;
39
+
40
+ export async function translateContent(
41
+ content: string,
42
+ targetLang: string,
43
+ targetLangName: string,
44
+ model: string = "claude-sonnet-4-6",
45
+ ): Promise<{ translated: string; inputTokens: number; outputTokens: number }> {
46
+ const anthropic = getClient();
47
+
48
+ const response = await anthropic.messages.create({
49
+ model,
50
+ max_tokens: 16384,
51
+ system: [{ type: "text", text: SYSTEM_PROMPT, cache_control: { type: "ephemeral" } }],
52
+ messages: [
53
+ {
54
+ role: "user",
55
+ content: `Translate the following documentation content into ${targetLangName} (${targetLang}).\n\n---\n\n${content}`,
56
+ },
57
+ ],
58
+ });
59
+
60
+ const translated =
61
+ response.content[0].type === "text" ? response.content[0].text : "";
62
+
63
+ return {
64
+ translated,
65
+ inputTokens: response.usage.input_tokens,
66
+ outputTokens: response.usage.output_tokens,
67
+ };
68
+ }
@@ -0,0 +1,43 @@
1
+ export interface LanguageConfig {
2
+ code: string;
3
+ name: string;
4
+ nativeName: string;
5
+ tier: 1 | 2 | 3;
6
+ rtl?: boolean;
7
+ }
8
+
9
+ export interface CacheEntry {
10
+ sourceHash: string;
11
+ targetLang: string;
12
+ translatedAt: string;
13
+ inputTokens: number;
14
+ outputTokens: number;
15
+ }
16
+
17
+ export interface TranslationCache {
18
+ sourceHash: string;
19
+ lastUpdated: string;
20
+ translations: Record<string, CacheEntry>;
21
+ }
22
+
23
+ export interface TranslateOptions {
24
+ languages: string[];
25
+ tier?: number;
26
+ pagesFilter?: string[];
27
+ readmeOnly?: boolean;
28
+ docsOnly?: boolean;
29
+ dryRun?: boolean;
30
+ force?: boolean;
31
+ updateNav?: boolean;
32
+ validate?: boolean;
33
+ model?: string;
34
+ }
35
+
36
+ export interface TranslationResult {
37
+ lang: string;
38
+ sourcePath: string;
39
+ outputPath: string;
40
+ inputTokens: number;
41
+ outputTokens: number;
42
+ cached: boolean;
43
+ }
@@ -116,7 +116,7 @@ export interface LoadAllResult {
116
116
  * 3. User convention: ~/.failproofai/policies/*policies.{js,mjs,ts} (alphabetical)
117
117
  *
118
118
  * Each file is loaded independently (fail-open per file).
119
- * Convention hooks are tagged with __conventionSource so the handler can distinguish them.
119
+ * Convention hooks are tagged with __conventionScope so the handler can build scoped prefixes.
120
120
  */
121
121
  export async function loadAllCustomHooks(
122
122
  customPoliciesPath: string | undefined,
@@ -181,16 +181,23 @@ export async function loadAllCustomHooks(
181
181
  );
182
182
  }
183
183
 
184
- // Tag convention hooks so the handler can register them with a "convention/" prefix.
185
- // Track by object reference (not name) to avoid mis-tagging an explicit custom hook
186
- // that happens to share the same name as a convention hook.
184
+ // Tag convention hooks with their scope so the handler can build scoped prefixes.
185
+ // Build a name→scope map from conventionSources, then tag by object reference
186
+ // to avoid mis-tagging an explicit custom hook that shares the same name.
187
+ const hookNameToScope = new Map<string, string>();
188
+ for (const source of conventionSources) {
189
+ for (const name of source.hookNames) {
190
+ hookNameToScope.set(name, source.scope);
191
+ }
192
+ }
187
193
  const conventionHookRefs = new Set<CustomHook>();
188
194
  for (const hook of allHooks.slice(hooksBeforeConvention)) {
189
195
  conventionHookRefs.add(hook);
190
196
  }
191
197
  for (const hook of allHooks) {
192
198
  if (conventionHookRefs.has(hook)) {
193
- (hook as CustomHook & { __conventionSource?: boolean }).__conventionSource = true;
199
+ (hook as CustomHook & { __conventionScope?: string }).__conventionScope =
200
+ hookNameToScope.get(hook.name) ?? "project";
194
201
  }
195
202
  }
196
203
 
@@ -78,8 +78,9 @@ export async function handleHookEvent(eventType: string): Promise<number> {
78
78
 
79
79
  for (const hook of customHooksList) {
80
80
  const hookName = hook.name;
81
- const isConvention = (hook as CustomHook & { __conventionSource?: boolean }).__conventionSource === true;
82
- const prefix = isConvention ? "convention" : "custom";
81
+ const conventionScope = (hook as CustomHook & { __conventionScope?: string }).__conventionScope;
82
+ const isConvention = !!conventionScope;
83
+ const prefix = isConvention ? `.failproofai-${conventionScope}` : "custom";
83
84
  const fn: PolicyFunction = async (ctx): Promise<PolicyResult> => {
84
85
  try {
85
86
  const result = await Promise.race([
@@ -98,6 +99,7 @@ export async function handleHookEvent(eventType: string): Promise<number> {
98
99
  error_type: isTimeout ? "timeout" : "exception",
99
100
  event_type: eventType,
100
101
  is_convention_policy: isConvention,
102
+ convention_scope: conventionScope ?? null,
101
103
  });
102
104
  return { decision: "allow" };
103
105
  }
@@ -170,7 +172,10 @@ export async function handleHookEvent(eventType: string): Promise<number> {
170
172
  if (result.decision === "deny" || result.decision === "instruct") {
171
173
  try {
172
174
  const isCustomHook = result.policyName?.startsWith("custom/") ?? false;
173
- const isConventionPolicy = result.policyName?.startsWith("convention/") ?? false;
175
+ const isConventionPolicy = result.policyName?.startsWith(".failproofai-") ?? false;
176
+ const conventionScope = isConventionPolicy
177
+ ? result.policyName!.match(/^\.failproofai-(project|user)\//)?.[1] ?? null
178
+ : null;
174
179
  const hasCustomParams =
175
180
  !isCustomHook && !isConventionPolicy && !!(result.policyName && config.policyParams?.[result.policyName]);
176
181
  const paramKeysOverridden = hasCustomParams
@@ -184,6 +189,7 @@ export async function handleHookEvent(eventType: string): Promise<number> {
184
189
  decision: result.decision,
185
190
  is_custom_hook: isCustomHook,
186
191
  is_convention_policy: isConventionPolicy,
192
+ convention_scope: conventionScope,
187
193
  has_custom_params: hasCustomParams,
188
194
  param_keys_overridden: paramKeysOverridden,
189
195
  });
@@ -267,7 +267,9 @@ export async function installHooks(
267
267
  }
268
268
 
269
269
  for (const eventType of HOOK_EVENT_TYPES) {
270
- const command = `"${binaryPath}" --hook ${eventType}`;
270
+ const command = scope === "project"
271
+ ? `npx -y failproofai --hook ${eventType}`
272
+ : `"${binaryPath}" --hook ${eventType}`;
271
273
  const hookEntry: ClaudeHookEntry = {
272
274
  type: "command",
273
275
  command,
@@ -323,6 +325,7 @@ export async function installHooks(
323
325
  has_custom_hooks_path: !!(configToWrite.customPoliciesPath),
324
326
  has_policy_params: !!(configToWrite.policyParams && Object.keys(configToWrite.policyParams).length > 0),
325
327
  param_policy_names: configToWrite.policyParams ? Object.keys(configToWrite.policyParams) : [],
328
+ command_format: scope === "project" ? "npx" : "absolute",
326
329
  });
327
330
  } catch {
328
331
  // Telemetry is best-effort — never block the operation
@@ -330,7 +333,12 @@ export async function installHooks(
330
333
 
331
334
  console.log(`Failproof AI hooks installed for all ${HOOK_EVENT_TYPES.length} event types (scope: ${scope}).`);
332
335
  console.log(`Settings: ${settingsPath}`);
333
- console.log(`Binary: ${binaryPath}`);
336
+ if (scope === "project") {
337
+ console.log(`Command: npx -y failproofai`);
338
+ console.log(`\nThis file can be committed to git — no machine-specific paths.`);
339
+ } else {
340
+ console.log(`Binary: ${binaryPath}`);
341
+ }
334
342
 
335
343
  // Warn about duplicate-scope installations
336
344
  const otherScopes = deduplicateScopes(HOOK_SCOPES, cwd).filter((s) => s !== scope);