failproofai 0.0.2-beta.8 → 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 (379) hide show
  1. package/.next/standalone/.claude/settings.json +26 -26
  2. package/.next/standalone/.next/BUILD_ID +1 -1
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/required-server-files.json +1 -1
  6. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  7. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  11. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  12. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  13. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  14. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  15. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  17. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  20. package/.next/standalone/.next/server/app/_not-found.rsc +17 -17
  21. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +17 -17
  22. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  23. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
  24. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  25. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  26. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  27. package/.next/standalone/.next/server/app/index.html +1 -1
  28. package/.next/standalone/.next/server/app/index.rsc +16 -16
  29. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  30. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +16 -16
  31. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  32. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +11 -11
  33. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  34. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  35. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
  38. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  41. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  44. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  45. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  48. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g72weg._.js +3 -0
  51. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0kjo7d_._.js +1 -1
  52. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
  53. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
  54. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
  55. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
  56. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
  57. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
  58. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0.t2266._.js → [root-of-the-server]__0vn1ciw._.js} +2 -2
  59. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +2 -1
  60. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0pjorff._.js → [root-of-the-server]__0z-n~~r._.js} +2 -2
  61. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
  62. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
  63. package/.next/standalone/.next/server/chunks/ssr/_0x..fj-._.js +1 -1
  64. package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
  65. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
  66. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
  67. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  68. package/.next/standalone/.next/server/pages/404.html +2 -2
  69. package/.next/standalone/.next/server/pages/500.html +1 -1
  70. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/server-reference-manifest.json +9 -9
  72. package/.next/standalone/.next/static/chunks/{0qi0ubup__3pj.js → 04wavch6dsfes.js} +1 -1
  73. package/.next/standalone/.next/static/chunks/{121a-0zn-knuy.js → 0drr--vxs_m-c.js} +1 -1
  74. package/.next/standalone/.next/static/chunks/{0jf9lx3rkmqx_.css → 0gu_a.a80ritd.css} +1 -1
  75. package/.next/standalone/.next/static/chunks/{07g0rbtaux_1t.js → 0i1ilz5554nv9.js} +1 -1
  76. package/.next/standalone/.next/static/chunks/{0j752uotyfvjh.js → 0keqg6-cjs8aa.js} +1 -1
  77. package/.next/standalone/.next/static/chunks/{0xyvis4r_y.8o.js → 0myzx7y.rqqi3.js} +2 -2
  78. package/.next/standalone/.next/static/chunks/{0a_xh94bt.y0j.js → 0zfrusm~j404v.js} +1 -1
  79. package/.next/standalone/.next/static/chunks/{0zfyfi1suoteq.js → 10xhknzfyigcu.js} +1 -1
  80. package/.next/standalone/.next/static/chunks/{04xfyqyhdxbxz.js → 16yg3xhkmdb9v.js} +1 -1
  81. package/.next/standalone/CHANGELOG.md +13 -0
  82. package/.next/standalone/CLAUDE.md +14 -0
  83. package/.next/standalone/README.md +16 -0
  84. package/.next/standalone/bun.lock +45 -0
  85. package/.next/standalone/dist/cli.mjs +12 -5
  86. package/.next/standalone/docs/ar/architecture.mdx +333 -0
  87. package/.next/standalone/docs/ar/built-in-policies.mdx +566 -0
  88. package/.next/standalone/docs/ar/cli/dashboard.mdx +28 -0
  89. package/.next/standalone/docs/ar/cli/environment-variables.mdx +34 -0
  90. package/.next/standalone/docs/ar/cli/hook.mdx +31 -0
  91. package/.next/standalone/docs/ar/cli/install-policies.mdx +49 -0
  92. package/.next/standalone/docs/ar/cli/list-policies.mdx +31 -0
  93. package/.next/standalone/docs/ar/cli/remove-policies.mdx +45 -0
  94. package/.next/standalone/docs/ar/cli/version.mdx +13 -0
  95. package/.next/standalone/docs/ar/configuration.mdx +223 -0
  96. package/.next/standalone/docs/ar/custom-policies.mdx +359 -0
  97. package/.next/standalone/docs/ar/dashboard.mdx +142 -0
  98. package/.next/standalone/docs/ar/examples.mdx +254 -0
  99. package/.next/standalone/docs/ar/for-agents.mdx +39 -0
  100. package/.next/standalone/docs/ar/getting-started.mdx +134 -0
  101. package/.next/standalone/docs/ar/introduction.mdx +58 -0
  102. package/.next/standalone/docs/ar/package-aliases.mdx +82 -0
  103. package/.next/standalone/docs/ar/testing.mdx +261 -0
  104. package/.next/standalone/docs/de/architecture.mdx +332 -0
  105. package/.next/standalone/docs/de/built-in-policies.mdx +564 -0
  106. package/.next/standalone/docs/de/cli/dashboard.mdx +28 -0
  107. package/.next/standalone/docs/de/cli/environment-variables.mdx +34 -0
  108. package/.next/standalone/docs/de/cli/hook.mdx +30 -0
  109. package/.next/standalone/docs/de/cli/install-policies.mdx +48 -0
  110. package/.next/standalone/docs/de/cli/list-policies.mdx +31 -0
  111. package/.next/standalone/docs/de/cli/remove-policies.mdx +44 -0
  112. package/.next/standalone/docs/de/cli/version.mdx +12 -0
  113. package/.next/standalone/docs/de/configuration.mdx +222 -0
  114. package/.next/standalone/docs/de/custom-policies.mdx +357 -0
  115. package/.next/standalone/docs/de/dashboard.mdx +142 -0
  116. package/.next/standalone/docs/de/examples.mdx +253 -0
  117. package/.next/standalone/docs/de/for-agents.mdx +38 -0
  118. package/.next/standalone/docs/de/getting-started.mdx +134 -0
  119. package/.next/standalone/docs/de/introduction.mdx +57 -0
  120. package/.next/standalone/docs/de/package-aliases.mdx +82 -0
  121. package/.next/standalone/docs/de/testing.mdx +260 -0
  122. package/.next/standalone/docs/docs.json +922 -35
  123. package/.next/standalone/docs/es/architecture.mdx +332 -0
  124. package/.next/standalone/docs/es/built-in-policies.mdx +564 -0
  125. package/.next/standalone/docs/es/cli/dashboard.mdx +28 -0
  126. package/.next/standalone/docs/es/cli/environment-variables.mdx +34 -0
  127. package/.next/standalone/docs/es/cli/hook.mdx +30 -0
  128. package/.next/standalone/docs/es/cli/install-policies.mdx +48 -0
  129. package/.next/standalone/docs/es/cli/list-policies.mdx +31 -0
  130. package/.next/standalone/docs/es/cli/remove-policies.mdx +44 -0
  131. package/.next/standalone/docs/es/cli/version.mdx +12 -0
  132. package/.next/standalone/docs/es/configuration.mdx +222 -0
  133. package/.next/standalone/docs/es/custom-policies.mdx +357 -0
  134. package/.next/standalone/docs/es/dashboard.mdx +142 -0
  135. package/.next/standalone/docs/es/examples.mdx +253 -0
  136. package/.next/standalone/docs/es/for-agents.mdx +38 -0
  137. package/.next/standalone/docs/es/getting-started.mdx +134 -0
  138. package/.next/standalone/docs/es/introduction.mdx +57 -0
  139. package/.next/standalone/docs/es/package-aliases.mdx +82 -0
  140. package/.next/standalone/docs/es/testing.mdx +260 -0
  141. package/.next/standalone/docs/fr/architecture.mdx +332 -0
  142. package/.next/standalone/docs/fr/built-in-policies.mdx +564 -0
  143. package/.next/standalone/docs/fr/cli/dashboard.mdx +28 -0
  144. package/.next/standalone/docs/fr/cli/environment-variables.mdx +34 -0
  145. package/.next/standalone/docs/fr/cli/hook.mdx +30 -0
  146. package/.next/standalone/docs/fr/cli/install-policies.mdx +48 -0
  147. package/.next/standalone/docs/fr/cli/list-policies.mdx +31 -0
  148. package/.next/standalone/docs/fr/cli/remove-policies.mdx +44 -0
  149. package/.next/standalone/docs/fr/cli/version.mdx +12 -0
  150. package/.next/standalone/docs/fr/configuration.mdx +222 -0
  151. package/.next/standalone/docs/fr/custom-policies.mdx +357 -0
  152. package/.next/standalone/docs/fr/dashboard.mdx +142 -0
  153. package/.next/standalone/docs/fr/examples.mdx +253 -0
  154. package/.next/standalone/docs/fr/for-agents.mdx +38 -0
  155. package/.next/standalone/docs/fr/getting-started.mdx +134 -0
  156. package/.next/standalone/docs/fr/introduction.mdx +57 -0
  157. package/.next/standalone/docs/fr/package-aliases.mdx +82 -0
  158. package/.next/standalone/docs/fr/testing.mdx +260 -0
  159. package/.next/standalone/docs/he/architecture.mdx +333 -0
  160. package/.next/standalone/docs/he/built-in-policies.mdx +564 -0
  161. package/.next/standalone/docs/he/cli/dashboard.mdx +28 -0
  162. package/.next/standalone/docs/he/cli/environment-variables.mdx +34 -0
  163. package/.next/standalone/docs/he/cli/hook.mdx +30 -0
  164. package/.next/standalone/docs/he/cli/install-policies.mdx +48 -0
  165. package/.next/standalone/docs/he/cli/list-policies.mdx +32 -0
  166. package/.next/standalone/docs/he/cli/remove-policies.mdx +44 -0
  167. package/.next/standalone/docs/he/cli/version.mdx +12 -0
  168. package/.next/standalone/docs/he/configuration.mdx +222 -0
  169. package/.next/standalone/docs/he/custom-policies.mdx +357 -0
  170. package/.next/standalone/docs/he/dashboard.mdx +142 -0
  171. package/.next/standalone/docs/he/examples.mdx +253 -0
  172. package/.next/standalone/docs/he/for-agents.mdx +38 -0
  173. package/.next/standalone/docs/he/getting-started.mdx +135 -0
  174. package/.next/standalone/docs/he/introduction.mdx +57 -0
  175. package/.next/standalone/docs/he/package-aliases.mdx +82 -0
  176. package/.next/standalone/docs/he/testing.mdx +260 -0
  177. package/.next/standalone/docs/hi/architecture.mdx +334 -0
  178. package/.next/standalone/docs/hi/built-in-policies.mdx +564 -0
  179. package/.next/standalone/docs/hi/cli/dashboard.mdx +28 -0
  180. package/.next/standalone/docs/hi/cli/environment-variables.mdx +34 -0
  181. package/.next/standalone/docs/hi/cli/hook.mdx +30 -0
  182. package/.next/standalone/docs/hi/cli/install-policies.mdx +48 -0
  183. package/.next/standalone/docs/hi/cli/list-policies.mdx +31 -0
  184. package/.next/standalone/docs/hi/cli/remove-policies.mdx +44 -0
  185. package/.next/standalone/docs/hi/cli/version.mdx +12 -0
  186. package/.next/standalone/docs/hi/configuration.mdx +222 -0
  187. package/.next/standalone/docs/hi/custom-policies.mdx +357 -0
  188. package/.next/standalone/docs/hi/dashboard.mdx +142 -0
  189. package/.next/standalone/docs/hi/examples.mdx +255 -0
  190. package/.next/standalone/docs/hi/for-agents.mdx +38 -0
  191. package/.next/standalone/docs/hi/getting-started.mdx +134 -0
  192. package/.next/standalone/docs/hi/introduction.mdx +57 -0
  193. package/.next/standalone/docs/hi/package-aliases.mdx +82 -0
  194. package/.next/standalone/docs/hi/testing.mdx +260 -0
  195. package/.next/standalone/docs/i18n/README.ar.md +312 -0
  196. package/.next/standalone/docs/i18n/README.de.md +307 -0
  197. package/.next/standalone/docs/i18n/README.es.md +307 -0
  198. package/.next/standalone/docs/i18n/README.fr.md +307 -0
  199. package/.next/standalone/docs/i18n/README.he.md +312 -0
  200. package/.next/standalone/docs/i18n/README.hi.md +307 -0
  201. package/.next/standalone/docs/i18n/README.it.md +307 -0
  202. package/.next/standalone/docs/i18n/README.ja.md +307 -0
  203. package/.next/standalone/docs/i18n/README.ko.md +307 -0
  204. package/.next/standalone/docs/i18n/README.pt-br.md +307 -0
  205. package/.next/standalone/docs/i18n/README.ru.md +308 -0
  206. package/.next/standalone/docs/i18n/README.tr.md +308 -0
  207. package/.next/standalone/docs/i18n/README.vi.md +308 -0
  208. package/.next/standalone/docs/i18n/README.zh.md +307 -0
  209. package/.next/standalone/docs/it/architecture.mdx +333 -0
  210. package/.next/standalone/docs/it/built-in-policies.mdx +564 -0
  211. package/.next/standalone/docs/it/cli/dashboard.mdx +28 -0
  212. package/.next/standalone/docs/it/cli/environment-variables.mdx +34 -0
  213. package/.next/standalone/docs/it/cli/hook.mdx +30 -0
  214. package/.next/standalone/docs/it/cli/install-policies.mdx +48 -0
  215. package/.next/standalone/docs/it/cli/list-policies.mdx +31 -0
  216. package/.next/standalone/docs/it/cli/remove-policies.mdx +44 -0
  217. package/.next/standalone/docs/it/cli/version.mdx +12 -0
  218. package/.next/standalone/docs/it/configuration.mdx +223 -0
  219. package/.next/standalone/docs/it/custom-policies.mdx +358 -0
  220. package/.next/standalone/docs/it/dashboard.mdx +142 -0
  221. package/.next/standalone/docs/it/examples.mdx +253 -0
  222. package/.next/standalone/docs/it/for-agents.mdx +38 -0
  223. package/.next/standalone/docs/it/getting-started.mdx +134 -0
  224. package/.next/standalone/docs/it/introduction.mdx +57 -0
  225. package/.next/standalone/docs/it/package-aliases.mdx +82 -0
  226. package/.next/standalone/docs/it/testing.mdx +260 -0
  227. package/.next/standalone/docs/ja/architecture.mdx +332 -0
  228. package/.next/standalone/docs/ja/built-in-policies.mdx +562 -0
  229. package/.next/standalone/docs/ja/cli/dashboard.mdx +28 -0
  230. package/.next/standalone/docs/ja/cli/environment-variables.mdx +34 -0
  231. package/.next/standalone/docs/ja/cli/hook.mdx +30 -0
  232. package/.next/standalone/docs/ja/cli/install-policies.mdx +48 -0
  233. package/.next/standalone/docs/ja/cli/list-policies.mdx +31 -0
  234. package/.next/standalone/docs/ja/cli/remove-policies.mdx +44 -0
  235. package/.next/standalone/docs/ja/cli/version.mdx +12 -0
  236. package/.next/standalone/docs/ja/configuration.mdx +222 -0
  237. package/.next/standalone/docs/ja/custom-policies.mdx +357 -0
  238. package/.next/standalone/docs/ja/dashboard.mdx +142 -0
  239. package/.next/standalone/docs/ja/examples.mdx +253 -0
  240. package/.next/standalone/docs/ja/for-agents.mdx +38 -0
  241. package/.next/standalone/docs/ja/getting-started.mdx +134 -0
  242. package/.next/standalone/docs/ja/introduction.mdx +57 -0
  243. package/.next/standalone/docs/ja/package-aliases.mdx +82 -0
  244. package/.next/standalone/docs/ja/testing.mdx +260 -0
  245. package/.next/standalone/docs/ko/architecture.mdx +332 -0
  246. package/.next/standalone/docs/ko/built-in-policies.mdx +562 -0
  247. package/.next/standalone/docs/ko/cli/dashboard.mdx +28 -0
  248. package/.next/standalone/docs/ko/cli/environment-variables.mdx +34 -0
  249. package/.next/standalone/docs/ko/cli/hook.mdx +30 -0
  250. package/.next/standalone/docs/ko/cli/install-policies.mdx +48 -0
  251. package/.next/standalone/docs/ko/cli/list-policies.mdx +31 -0
  252. package/.next/standalone/docs/ko/cli/remove-policies.mdx +44 -0
  253. package/.next/standalone/docs/ko/cli/version.mdx +12 -0
  254. package/.next/standalone/docs/ko/configuration.mdx +222 -0
  255. package/.next/standalone/docs/ko/custom-policies.mdx +357 -0
  256. package/.next/standalone/docs/ko/dashboard.mdx +142 -0
  257. package/.next/standalone/docs/ko/examples.mdx +253 -0
  258. package/.next/standalone/docs/ko/for-agents.mdx +38 -0
  259. package/.next/standalone/docs/ko/getting-started.mdx +134 -0
  260. package/.next/standalone/docs/ko/introduction.mdx +57 -0
  261. package/.next/standalone/docs/ko/package-aliases.mdx +82 -0
  262. package/.next/standalone/docs/ko/testing.mdx +260 -0
  263. package/.next/standalone/docs/pt-br/architecture.mdx +332 -0
  264. package/.next/standalone/docs/pt-br/built-in-policies.mdx +564 -0
  265. package/.next/standalone/docs/pt-br/cli/dashboard.mdx +28 -0
  266. package/.next/standalone/docs/pt-br/cli/environment-variables.mdx +34 -0
  267. package/.next/standalone/docs/pt-br/cli/hook.mdx +30 -0
  268. package/.next/standalone/docs/pt-br/cli/install-policies.mdx +48 -0
  269. package/.next/standalone/docs/pt-br/cli/list-policies.mdx +31 -0
  270. package/.next/standalone/docs/pt-br/cli/remove-policies.mdx +44 -0
  271. package/.next/standalone/docs/pt-br/cli/version.mdx +12 -0
  272. package/.next/standalone/docs/pt-br/configuration.mdx +222 -0
  273. package/.next/standalone/docs/pt-br/custom-policies.mdx +357 -0
  274. package/.next/standalone/docs/pt-br/dashboard.mdx +142 -0
  275. package/.next/standalone/docs/pt-br/examples.mdx +253 -0
  276. package/.next/standalone/docs/pt-br/for-agents.mdx +38 -0
  277. package/.next/standalone/docs/pt-br/getting-started.mdx +134 -0
  278. package/.next/standalone/docs/pt-br/introduction.mdx +57 -0
  279. package/.next/standalone/docs/pt-br/package-aliases.mdx +82 -0
  280. package/.next/standalone/docs/pt-br/testing.mdx +260 -0
  281. package/.next/standalone/docs/ru/architecture.mdx +334 -0
  282. package/.next/standalone/docs/ru/built-in-policies.mdx +562 -0
  283. package/.next/standalone/docs/ru/cli/dashboard.mdx +28 -0
  284. package/.next/standalone/docs/ru/cli/environment-variables.mdx +34 -0
  285. package/.next/standalone/docs/ru/cli/hook.mdx +30 -0
  286. package/.next/standalone/docs/ru/cli/install-policies.mdx +48 -0
  287. package/.next/standalone/docs/ru/cli/list-policies.mdx +32 -0
  288. package/.next/standalone/docs/ru/cli/remove-policies.mdx +44 -0
  289. package/.next/standalone/docs/ru/cli/version.mdx +12 -0
  290. package/.next/standalone/docs/ru/configuration.mdx +223 -0
  291. package/.next/standalone/docs/ru/custom-policies.mdx +357 -0
  292. package/.next/standalone/docs/ru/dashboard.mdx +142 -0
  293. package/.next/standalone/docs/ru/examples.mdx +254 -0
  294. package/.next/standalone/docs/ru/for-agents.mdx +38 -0
  295. package/.next/standalone/docs/ru/getting-started.mdx +134 -0
  296. package/.next/standalone/docs/ru/introduction.mdx +57 -0
  297. package/.next/standalone/docs/ru/package-aliases.mdx +82 -0
  298. package/.next/standalone/docs/ru/testing.mdx +260 -0
  299. package/.next/standalone/docs/tr/architecture.mdx +333 -0
  300. package/.next/standalone/docs/tr/built-in-policies.mdx +562 -0
  301. package/.next/standalone/docs/tr/cli/dashboard.mdx +28 -0
  302. package/.next/standalone/docs/tr/cli/environment-variables.mdx +34 -0
  303. package/.next/standalone/docs/tr/cli/hook.mdx +30 -0
  304. package/.next/standalone/docs/tr/cli/install-policies.mdx +48 -0
  305. package/.next/standalone/docs/tr/cli/list-policies.mdx +31 -0
  306. package/.next/standalone/docs/tr/cli/remove-policies.mdx +45 -0
  307. package/.next/standalone/docs/tr/cli/version.mdx +12 -0
  308. package/.next/standalone/docs/tr/configuration.mdx +223 -0
  309. package/.next/standalone/docs/tr/custom-policies.mdx +357 -0
  310. package/.next/standalone/docs/tr/dashboard.mdx +142 -0
  311. package/.next/standalone/docs/tr/examples.mdx +253 -0
  312. package/.next/standalone/docs/tr/for-agents.mdx +38 -0
  313. package/.next/standalone/docs/tr/getting-started.mdx +134 -0
  314. package/.next/standalone/docs/tr/introduction.mdx +57 -0
  315. package/.next/standalone/docs/tr/package-aliases.mdx +82 -0
  316. package/.next/standalone/docs/tr/testing.mdx +260 -0
  317. package/.next/standalone/docs/vi/architecture.mdx +333 -0
  318. package/.next/standalone/docs/vi/built-in-policies.mdx +564 -0
  319. package/.next/standalone/docs/vi/cli/dashboard.mdx +28 -0
  320. package/.next/standalone/docs/vi/cli/environment-variables.mdx +34 -0
  321. package/.next/standalone/docs/vi/cli/hook.mdx +30 -0
  322. package/.next/standalone/docs/vi/cli/install-policies.mdx +48 -0
  323. package/.next/standalone/docs/vi/cli/list-policies.mdx +31 -0
  324. package/.next/standalone/docs/vi/cli/remove-policies.mdx +44 -0
  325. package/.next/standalone/docs/vi/cli/version.mdx +13 -0
  326. package/.next/standalone/docs/vi/configuration.mdx +222 -0
  327. package/.next/standalone/docs/vi/custom-policies.mdx +357 -0
  328. package/.next/standalone/docs/vi/dashboard.mdx +142 -0
  329. package/.next/standalone/docs/vi/examples.mdx +253 -0
  330. package/.next/standalone/docs/vi/for-agents.mdx +38 -0
  331. package/.next/standalone/docs/vi/getting-started.mdx +134 -0
  332. package/.next/standalone/docs/vi/introduction.mdx +57 -0
  333. package/.next/standalone/docs/vi/package-aliases.mdx +82 -0
  334. package/.next/standalone/docs/vi/testing.mdx +260 -0
  335. package/.next/standalone/docs/zh/architecture.mdx +332 -0
  336. package/.next/standalone/docs/zh/built-in-policies.mdx +562 -0
  337. package/.next/standalone/docs/zh/cli/dashboard.mdx +28 -0
  338. package/.next/standalone/docs/zh/cli/environment-variables.mdx +34 -0
  339. package/.next/standalone/docs/zh/cli/hook.mdx +30 -0
  340. package/.next/standalone/docs/zh/cli/install-policies.mdx +48 -0
  341. package/.next/standalone/docs/zh/cli/list-policies.mdx +31 -0
  342. package/.next/standalone/docs/zh/cli/remove-policies.mdx +44 -0
  343. package/.next/standalone/docs/zh/cli/version.mdx +12 -0
  344. package/.next/standalone/docs/zh/configuration.mdx +222 -0
  345. package/.next/standalone/docs/zh/custom-policies.mdx +357 -0
  346. package/.next/standalone/docs/zh/dashboard.mdx +142 -0
  347. package/.next/standalone/docs/zh/examples.mdx +253 -0
  348. package/.next/standalone/docs/zh/for-agents.mdx +38 -0
  349. package/.next/standalone/docs/zh/getting-started.mdx +134 -0
  350. package/.next/standalone/docs/zh/introduction.mdx +57 -0
  351. package/.next/standalone/docs/zh/package-aliases.mdx +82 -0
  352. package/.next/standalone/docs/zh/testing.mdx +260 -0
  353. package/.next/standalone/package.json +8 -2
  354. package/.next/standalone/scripts/translate-docs/cache.ts +62 -0
  355. package/.next/standalone/scripts/translate-docs/cli.ts +357 -0
  356. package/.next/standalone/scripts/translate-docs/config.ts +248 -0
  357. package/.next/standalone/scripts/translate-docs/mdx-translator.ts +153 -0
  358. package/.next/standalone/scripts/translate-docs/mintlify-nav.ts +107 -0
  359. package/.next/standalone/scripts/translate-docs/readme-translator.ts +154 -0
  360. package/.next/standalone/scripts/translate-docs/translator.ts +68 -0
  361. package/.next/standalone/scripts/translate-docs/types.ts +43 -0
  362. package/.next/standalone/server.js +1 -1
  363. package/.next/standalone/src/hooks/manager.ts +10 -2
  364. package/README.md +16 -0
  365. package/dist/cli.mjs +12 -5
  366. package/package.json +8 -2
  367. package/scripts/translate-docs/cache.ts +62 -0
  368. package/scripts/translate-docs/cli.ts +357 -0
  369. package/scripts/translate-docs/config.ts +248 -0
  370. package/scripts/translate-docs/mdx-translator.ts +153 -0
  371. package/scripts/translate-docs/mintlify-nav.ts +107 -0
  372. package/scripts/translate-docs/readme-translator.ts +154 -0
  373. package/scripts/translate-docs/translator.ts +68 -0
  374. package/scripts/translate-docs/types.ts +43 -0
  375. package/src/hooks/manager.ts +10 -2
  376. package/.next/standalone/.next/server/chunks/[root-of-the-server]__02nt~6d._.js +0 -3
  377. /package/.next/standalone/.next/static/{itedhTSyIDln6TUf41j5X → XqGmAwGDuJ6fEQgD-8y60}/_buildManifest.js +0 -0
  378. /package/.next/standalone/.next/static/{itedhTSyIDln6TUf41j5X → XqGmAwGDuJ6fEQgD-8y60}/_clientMiddlewareManifest.js +0 -0
  379. /package/.next/standalone/.next/static/{itedhTSyIDln6TUf41j5X → XqGmAwGDuJ6fEQgD-8y60}/_ssgManifest.js +0 -0
@@ -0,0 +1,261 @@
1
+ ---
2
+ ---
3
+ title: الاختبارات
4
+ description: "اختبارات الوحدات واختبارات الشامل (E2E) ومساعدات الاختبارات"
5
+ icon: flask-vial
6
+ ---
7
+
8
+ يتضمن failproofai مجموعتي اختبارات: **اختبارات الوحدات** (سريعة، محاكاة) و**اختبارات الشامل** (استدعاءات عملية فرعية حقيقية).
9
+
10
+ ---
11
+
12
+ ## تشغيل الاختبارات
13
+
14
+ ```bash
15
+ # تشغيل جميع اختبارات الوحدات مرة واحدة
16
+ bun run test:run
17
+
18
+ # تشغيل اختبارات الوحدات في وضع المراقبة
19
+ bun run test
20
+
21
+ # تشغيل اختبارات الشامل (يتطلب إعدادًا - انظر أدناه)
22
+ bun run test:e2e
23
+
24
+ # فحص النوع بدون بناء
25
+ bunx tsc --noEmit
26
+
27
+ # فحص الكود
28
+ bun run lint
29
+ ```
30
+
31
+ ---
32
+
33
+ ## اختبارات الوحدات
34
+
35
+ تقع اختبارات الوحدات في `__tests__/` وتستخدم [Vitest](https://vitest.dev) مع `happy-dom`.
36
+
37
+ ```text
38
+ __tests__/
39
+ hooks/
40
+ builtin-policies.test.ts # منطق السياسة لكل سياسة مدمجة
41
+ hooks-config.test.ts # تحميل الإعدادات ودمج النطاق
42
+ policy-evaluator.test.ts # حقن المعاملات وترتيب التقييم
43
+ custom-hooks-registry.test.ts # سجل globalThis للإضافة والحصول والمسح
44
+ custom-hooks-loader.test.ts # محمل ESM والاستيرادات المتعدية ومعالجة الأخطاء
45
+ manager.test.ts # عمليات التثبيت والإزالة والقائمة
46
+ components/
47
+ sessions-list.test.tsx # مكون قائمة الجلسات
48
+ project-list.test.tsx # مكون قائمة المشاريع
49
+ ...
50
+ lib/
51
+ logger.test.ts
52
+ paths.test.ts
53
+ date-filters.test.ts
54
+ telemetry.test.ts
55
+ ...
56
+ actions/
57
+ get-hooks-config.test.ts
58
+ get-hook-activity.test.ts
59
+ ...
60
+ contexts/
61
+ ThemeContext.test.tsx
62
+ AutoRefreshContext.test.tsx
63
+ ```
64
+
65
+ ### كتابة اختبار وحدة للسياسة
66
+
67
+ ```typescript
68
+ import { describe, it, expect, beforeEach } from "vitest";
69
+ import { getBuiltinPolicies } from "../../src/hooks/builtin-policies";
70
+ import { allow, deny } from "../../src/hooks/policy-types";
71
+
72
+ describe("block-sudo", () => {
73
+ const policy = getBuiltinPolicies().find((p) => p.name === "block-sudo")!;
74
+
75
+ it("denies sudo commands", () => {
76
+ const ctx = {
77
+ eventType: "PreToolUse" as const,
78
+ payload: {},
79
+ toolName: "Bash",
80
+ toolInput: { command: "sudo apt install nodejs" },
81
+ params: { allowPatterns: [] },
82
+ };
83
+ expect(policy.fn(ctx)).toEqual(deny("sudo command blocked by failproofai"));
84
+ });
85
+
86
+ it("allows non-sudo commands", () => {
87
+ const ctx = {
88
+ eventType: "PreToolUse" as const,
89
+ payload: {},
90
+ toolName: "Bash",
91
+ toolInput: { command: "ls -la" },
92
+ params: { allowPatterns: [] },
93
+ };
94
+ expect(policy.fn(ctx)).toEqual(allow());
95
+ });
96
+
97
+ it("allows patterns in allowPatterns", () => {
98
+ const ctx = {
99
+ eventType: "PreToolUse" as const,
100
+ payload: {},
101
+ toolName: "Bash",
102
+ toolInput: { command: "sudo systemctl status nginx" },
103
+ params: { allowPatterns: ["sudo systemctl status"] },
104
+ };
105
+ expect(policy.fn(ctx)).toEqual(allow());
106
+ });
107
+ });
108
+ ```
109
+
110
+ ---
111
+
112
+ ## اختبارات الشامل (E2E)
113
+
114
+ تستدعي اختبارات الشامل ملف failproofai الثنائي الفعلي كعملية فرعية، وترسل حمولة JSON إلى stdin، وتتحقق من مخرجات stdout وكود الخروج. يختبر هذا مسار التكامل الكامل الذي يستخدمه Claude Code.
115
+
116
+ ### الإعداد
117
+
118
+ تشغل اختبارات الشامل الملف الثنائي مباشرة من مصدر المستودع. قبل التشغيل الأول، قم بناء حزمة CJS التي تستخدمها ملفات hook المخصصة عند الاستيراد من `'failproofai'`:
119
+
120
+ ```bash
121
+ bun build src/index.ts --outdir dist --target node --format cjs
122
+ ```
123
+
124
+ ثم قم بتشغيل الاختبارات:
125
+
126
+ ```bash
127
+ bun run test:e2e
128
+ ```
129
+
130
+ أعد بناء `dist/` في أي وقت تغير فيه API hook العام (`src/hooks/custom-hooks-registry.ts` أو `src/hooks/policy-helpers.ts` أو `src/hooks/policy-types.ts`).
131
+
132
+ ### هيكل اختبار الشامل
133
+
134
+ ```text
135
+ __tests__/e2e/
136
+ helpers/
137
+ hook-runner.ts # تشغيل الملف الثنائي وإرسال حمولة JSON والتقاط كود الخروج والمخرجات والأخطاء
138
+ fixture-env.ts # دليل مؤقت معزول لكل اختبار مع ملفات الإعدادات
139
+ payloads.ts # مصانع الحمولة الدقيقة لـ Claude لكل نوع حدث
140
+ hooks/
141
+ builtin-policies.e2e.test.ts # كل سياسة مدمجة مع عملية فرعية حقيقية
142
+ custom-hooks.e2e.test.ts # تحميل وتقييم hook المخصص
143
+ config-scopes.e2e.test.ts # دمج الإعدادات عبر المشروع/المحلي/العام
144
+ policy-params.e2e.test.ts # حقن المعاملات لكل سياسة معاملات
145
+ ```
146
+
147
+ ### استخدام مساعدات الشامل
148
+
149
+ **`FixtureEnv`** - بيئة معزولة لكل اختبار:
150
+
151
+ ```typescript
152
+ import { createFixtureEnv } from "../helpers/fixture-env";
153
+
154
+ const env = createFixtureEnv();
155
+ // env.cwd - دليل مؤقت؛ مرره كـ payload.cwd للتقاط .failproofai/policies-config.json
156
+ // env.home - دليل منزل معزول؛ لا تسرب ~/ failproofai حقيقي
157
+
158
+ env.writeConfig({
159
+ enabledPolicies: ["block-sudo"],
160
+ policyParams: {
161
+ "block-sudo": { allowPatterns: ["sudo systemctl status"] },
162
+ },
163
+ });
164
+ ```
165
+
166
+ `createFixtureEnv()` يسجل تنظيف `afterEach` تلقائيًا.
167
+
168
+ **`runHook`** - استدعاء الملف الثنائي:
169
+
170
+ ```typescript
171
+ import { runHook } from "../helpers/hook-runner";
172
+ import { Payloads } from "../helpers/payloads";
173
+
174
+ const result = await runHook(
175
+ "PreToolUse",
176
+ Payloads.preToolUse.bash("sudo apt install nodejs", env.cwd),
177
+ { homeDir: env.home }
178
+ );
179
+
180
+ expect(result.exitCode).toBe(0);
181
+ expect(result.parsed?.hookSpecificOutput?.permissionDecision).toBe("deny");
182
+ ```
183
+
184
+ **`Payloads`** - مصانع حمولة جاهزة:
185
+
186
+ ```typescript
187
+ Payloads.preToolUse.bash(command, cwd)
188
+ Payloads.preToolUse.write(filePath, content, cwd)
189
+ Payloads.preToolUse.read(filePath, cwd)
190
+ Payloads.postToolUse.bash(command, output, cwd)
191
+ Payloads.postToolUse.read(filePath, content, cwd)
192
+ Payloads.notification(message, cwd)
193
+ Payloads.stop(cwd)
194
+ ```
195
+
196
+ ### كتابة اختبار شامل
197
+
198
+ ```typescript
199
+ import { describe, it, expect } from "vitest";
200
+ import { createFixtureEnv } from "../helpers/fixture-env";
201
+ import { runHook } from "../helpers/hook-runner";
202
+ import { Payloads } from "../helpers/payloads";
203
+
204
+ describe("block-rm-rf (E2E)", () => {
205
+ it("denies rm -rf", async () => {
206
+ const env = createFixtureEnv();
207
+ env.writeConfig({ enabledPolicies: ["block-rm-rf"] });
208
+
209
+ const result = await runHook(
210
+ "PreToolUse",
211
+ Payloads.preToolUse.bash("rm -rf /", env.cwd),
212
+ { homeDir: env.home }
213
+ );
214
+
215
+ expect(result.exitCode).toBe(0);
216
+ expect(result.parsed?.hookSpecificOutput?.permissionDecision).toBe("deny");
217
+ });
218
+
219
+ it("allows non-recursive rm", async () => {
220
+ const env = createFixtureEnv();
221
+ env.writeConfig({ enabledPolicies: ["block-rm-rf"] });
222
+
223
+ const result = await runHook(
224
+ "PreToolUse",
225
+ Payloads.preToolUse.bash("rm /tmp/file.txt", env.cwd),
226
+ { homeDir: env.home }
227
+ );
228
+
229
+ expect(result.exitCode).toBe(0);
230
+ expect(result.stdout).toBe(""); // allow → empty stdout
231
+ });
232
+ });
233
+ ```
234
+
235
+ ### أشكال استجابة الشامل
236
+
237
+ | القرار | كود الخروج | stdout |
238
+ |----------|-----------|--------|
239
+ | `PreToolUse` deny | `0` | `{"hookSpecificOutput":{"permissionDecision":"deny","permissionDecisionReason":"..."}}` |
240
+ | `PostToolUse` deny | `0` | `{"hookSpecificOutput":{"additionalContext":"Blocked ... because: ..."}}` |
241
+ | Instruct (غير Stop) | `0` | `{"hookSpecificOutput":{"additionalContext":"Instruction from failproofai: ..."}}` |
242
+ | تعليمات Stop | `2` | stdout فارغة؛ السبب في stderr |
243
+ | السماح | `0` | سلسلة فارغة |
244
+
245
+ ### إعدادات Vitest
246
+
247
+ تستخدم اختبارات الشامل `vitest.config.e2e.mts` مع:
248
+
249
+ - `environment: "node"` - لا توجد حاجة لمتغيرات المتصفح العام
250
+ - `pool: "forks"` - عزل العملية الحقيقي (اختبارات تشغيل العمليات الفرعية)
251
+ - `testTimeout: 20_000` - 20 ثانية لكل اختبار (بدء الملف الثنائي وتقييم hook)
252
+
253
+ مجموعة `forks` مهمة: تشارك العمال المستندة إلى الخيط `globalThis`، وهو ما قد يتداخل مع اختبارات توليد العمليات الفرعية. تتجنب الفروع المستندة إلى العملية هذا.
254
+
255
+ ---
256
+
257
+ ## CI
258
+
259
+ يجب أن تنجح عملية CI الكاملة (`bun run lint && bunx tsc --noEmit && bun run test:run && bun run build`) قبل الدمج. تعمل مجموعة الشامل كوظيفة CI منفصلة بالتوازي.
260
+
261
+ انظر [المساهمة](../CONTRIBUTING.md) للحصول على قائمة التحقق الكاملة قبل الدمج.
@@ -0,0 +1,332 @@
1
+ ---
2
+ title: Architektur
3
+ description: "Wie der Hook-Handler, das Laden der Konfiguration und die Policy-Auswertung intern funktionieren"
4
+ icon: sitemap
5
+ ---
6
+
7
+ Dieses Dokument erklärt, wie failproofai intern funktioniert: wie das Hook-System Agent-Tool-Aufrufe abfängt, wie die Konfiguration geladen und zusammengeführt wird, wie Policies ausgewertet werden und wie das Dashboard die Agentenaktivität überwacht.
8
+
9
+ ---
10
+
11
+ ## Überblick
12
+
13
+ failproofai besteht aus zwei unabhängigen Subsystemen:
14
+
15
+ 1. **Hook-Handler** – Ein schneller CLI-Subprocess, den Claude Code bei jedem Agent-Tool-Aufruf aufruft. Wertet Policies aus und gibt eine Entscheidung zurück.
16
+ 2. **Agent Monitor (Dashboard)** – Eine Next.js-Webanwendung zur Überwachung von Agentensitzungen und zur Verwaltung von Policies.
17
+
18
+ Beide Subsysteme teilen sich Konfigurationsdateien in `~/.failproofai/` und im `.failproofai/`-Verzeichnis des Projekts, laufen jedoch als separate Prozesse und kommunizieren ausschließlich über das Dateisystem.
19
+
20
+ ---
21
+
22
+ ## Hook-Handler
23
+
24
+ ### Integration mit Claude Code
25
+
26
+ Wenn Sie `failproofai policies --install` ausführen, schreibt es folgende Einträge in `~/.claude/settings.json`:
27
+
28
+ ```json
29
+ {
30
+ "hooks": {
31
+ "PreToolUse": [
32
+ {
33
+ "matcher": "",
34
+ "hooks": [
35
+ {
36
+ "type": "command",
37
+ "command": "failproofai --hook PreToolUse"
38
+ }
39
+ ]
40
+ }
41
+ ],
42
+ "PostToolUse": [ ... ]
43
+ }
44
+ }
45
+ ```
46
+
47
+ Claude Code ruft daraufhin `failproofai --hook PreToolUse` als Subprocess vor jedem Tool-Aufruf auf und übergibt dabei einen JSON-Payload über stdin.
48
+
49
+ ### Payload-Format
50
+
51
+ ```json
52
+ {
53
+ "session_id": "abc123",
54
+ "transcript_path": "/home/user/.claude/projects/myproject/sessions/abc123.jsonl",
55
+ "cwd": "/home/user/myproject",
56
+ "permission_mode": "default",
57
+ "hook_event_name": "PreToolUse",
58
+ "tool_name": "Bash",
59
+ "tool_input": { "command": "sudo apt install nodejs" }
60
+ }
61
+ ```
62
+
63
+ Bei `PostToolUse`-Events enthält der Payload zusätzlich `tool_result` mit der Ausgabe des Tools.
64
+
65
+ Der Handler setzt ein Limit von 1 MB für stdin. Payloads, die dieses Limit überschreiten, werden verworfen und alle Policies erlauben implizit.
66
+
67
+ ### Antwortformat
68
+
69
+ **Deny (PreToolUse):**
70
+ ```json
71
+ {
72
+ "hookSpecificOutput": {
73
+ "permissionDecision": "deny",
74
+ "permissionDecisionReason": "Blocked by failproofai: sudo command blocked"
75
+ }
76
+ }
77
+ ```
78
+
79
+ **Deny (PostToolUse):**
80
+ ```json
81
+ {
82
+ "hookSpecificOutput": {
83
+ "additionalContext": "Blocked by failproofai because: API key detected in output"
84
+ }
85
+ }
86
+ ```
87
+
88
+ **Instruct (alle Events außer Stop):**
89
+ ```json
90
+ {
91
+ "hookSpecificOutput": {
92
+ "additionalContext": "Instruction from failproofai: Verify tests pass before committing."
93
+ }
94
+ }
95
+ ```
96
+
97
+ **Stop-Event instruct:**
98
+ - Exit-Code: `2`
99
+ - Grund wird nach stderr geschrieben (nicht stdout)
100
+
101
+ **Allow:**
102
+ - Exit-Code: `0`
103
+ - Leerer stdout
104
+
105
+ **Allow mit Nachricht (Beta):**
106
+
107
+ Seit v0.0.2-beta.3 ermöglicht `allow(message)` einer Policy, informativen Kontext an Claude zurückzusenden, auch wenn die Operation erlaubt wird. Der Hook-Handler schreibt folgendes JSON nach **stdout** (keine Konfigurationsdatei – dies ist die Antwort des Handlers an Claude Code, genau wie deny- und instruct-Antworten oben):
108
+
109
+ ```json
110
+ // Written to stdout by the hook handler process
111
+ {
112
+ "hookSpecificOutput": {
113
+ "additionalContext": "All CI checks passed on branch 'feat/my-feature'."
114
+ }
115
+ }
116
+ ```
117
+ - Exit-Code: `0` (Operation ist erlaubt)
118
+ - Wenn mehrere Policies `allow` mit einer Nachricht zurückgeben, werden ihre Nachrichten mit Zeilenumbrüchen zu einem einzigen `additionalContext`-String verbunden
119
+ - Wenn keine Policy eine Nachricht liefert, ist stdout leer (wie zuvor)
120
+
121
+ ### Verarbeitungspipeline
122
+
123
+ `src/hooks/handler.ts` implementiert die vollständige Pipeline:
124
+
125
+ ```text
126
+ stdin JSON
127
+ → parse payload (max 1 MB)
128
+ → extract session metadata (session_id, cwd, tool_name, tool_input, etc.)
129
+ → readMergedHooksConfig(cwd) ← merges project + local + global config
130
+ → register enabled builtin policies with resolved params
131
+ → load custom policies from customPoliciesPath (if set)
132
+ → register custom policies into policy registry
133
+ → evaluate all policies (builtins first, then custom)
134
+ → first deny short-circuits
135
+ → instruct decisions accumulate
136
+ → allow messages accumulate
137
+ → write JSON decision to stdout
138
+ → persist event to ~/.failproofai/hook-activity.jsonl
139
+ → exit
140
+ ```
141
+
142
+ Der gesamte Prozess läuft bei typischen Payloads ohne LLM-Aufrufe in unter 100 ms ab.
143
+
144
+ ---
145
+
146
+ ## Konfiguration laden
147
+
148
+ `src/hooks/hooks-config.ts` implementiert das dreistufige Laden der Konfiguration.
149
+
150
+ ```text
151
+ [1] {cwd}/.failproofai/policies-config.json ← Projekt (höchste Priorität)
152
+ [2] {cwd}/.failproofai/policies-config.local.json ← lokal
153
+ [3] ~/.failproofai/policies-config.json ← global (niedrigste Priorität)
154
+ ```
155
+
156
+ Zusammenführungslogik:
157
+ - `enabledPolicies` – deduplizierte Vereinigung aller drei Dateien
158
+ - `policyParams` – pro Policy-Schlüssel gewinnt die erste Datei, die ihn definiert, vollständig
159
+ - `customPoliciesPath` – die erste Datei, die ihn definiert, gewinnt
160
+ - `llm` – die erste Datei, die ihn definiert, gewinnt
161
+
162
+ Das Web-Dashboard verwendet `readHooksConfig()` (nur global) zum Lesen und Schreiben, da es nicht mit einem Projekt-cwd aufgerufen wird.
163
+
164
+ ---
165
+
166
+ ## Policy-Auswertung
167
+
168
+ `src/hooks/policy-evaluator.ts` führt Policies der Reihe nach aus.
169
+
170
+ Für jede Policy:
171
+
172
+ 1. Das `params`-Schema der Policy nachschlagen (sofern vorhanden).
173
+ 2. `policyParams[policy.name]` aus der zusammengeführten Konfiguration lesen.
174
+ 3. Benutzerdefinierte Werte über Schema-Standardwerte zusammenführen, um `ctx.params` zu erzeugen.
175
+ 4. `policy.fn(ctx)` mit dem aufgelösten Kontext aufrufen.
176
+ 5. Ist das Ergebnis `deny`, sofort stoppen und diese Entscheidung zurückgeben.
177
+ 6. Ist das Ergebnis `instruct`, die Nachricht sammeln und fortfahren.
178
+ 7. Ist das Ergebnis `allow`, mit der nächsten Policy fortfahren.
179
+
180
+ Nach Ausführung aller Policies:
181
+ - Wenn ein `deny` zurückgegeben wurde, die Deny-Antwort ausgeben.
182
+ - Wenn `instruct`-Rückgaben gesammelt wurden, eine einzelne instruct-Antwort mit allen verbundenen Nachrichten ausgeben.
183
+ - Andernfalls eine Allow-Antwort ausgeben (leerer stdout, Exit 0).
184
+
185
+ ---
186
+
187
+ ## Eingebaute Policies
188
+
189
+ `src/hooks/builtin-policies.ts` definiert alle 26 eingebauten Policies als `BuiltinPolicyDefinition`-Objekte:
190
+
191
+ ```typescript
192
+ interface BuiltinPolicyDefinition {
193
+ name: string;
194
+ description: string;
195
+ fn: (ctx: PolicyContext) => PolicyResult;
196
+ match: {
197
+ events: HookEventType[];
198
+ tools?: string[];
199
+ };
200
+ defaultEnabled: boolean;
201
+ category: string;
202
+ beta?: boolean;
203
+ params?: PolicyParamsSchema;
204
+ }
205
+ ```
206
+
207
+ Policies, die `params` akzeptieren, deklarieren ein `PolicyParamsSchema` mit Typen und Standardwerten für jeden Parameter. Der Policy-Evaluator injiziert aufgelöste Werte in `ctx.params`, bevor `fn` aufgerufen wird. Policy-Funktionen lesen `ctx.params` ohne Null-Prüfung, da Standardwerte immer zuerst angewendet werden.
208
+
209
+ Pattern-Matching innerhalb von Policies verwendet geparste Befehlstoken (argv) statt einfachen String-Vergleichen. Dies verhindert Umgehungsversuche durch Shell-Operator-Injection (z. B. kann ein Muster für `sudo systemctl status *` nicht durch Anhängen von `; rm -rf /` an den Befehl umgangen werden).
210
+
211
+ ---
212
+
213
+ ## Benutzerdefinierte Policies
214
+
215
+ `src/hooks/custom-hooks-registry.ts` implementiert eine `globalThis`-basierte Registry:
216
+
217
+ ```typescript
218
+ const REGISTRY_KEY = "__failproofai_custom_hooks__";
219
+
220
+ export const customPolicies = {
221
+ add(hook: CustomHook): void { ... }
222
+ };
223
+
224
+ export function getCustomHooks(): CustomHook[] { ... }
225
+ export function clearCustomHooks(): void { ... } // used in tests
226
+ ```
227
+
228
+ `src/hooks/custom-hooks-loader.ts` lädt die Policy-Datei des Benutzers:
229
+
230
+ 1. `customPoliciesPath` aus der Konfiguration lesen; überspringen, falls nicht vorhanden.
231
+ 2. Zu absolutem Pfad auflösen; prüfen, ob die Datei existiert.
232
+ 3. Alle `from "failproofai"`-Imports zum tatsächlichen dist-Pfad umschreiben, damit `customPolicies` zur selben `globalThis`-Registry aufgelöst wird.
233
+ 4. Transitive lokale Imports rekursiv umschreiben, um ESM-Kompatibilität sicherzustellen.
234
+ 5. Temporäre `.mjs`-Dateien schreiben und die Einstiegsdatei per `import()` laden.
235
+ 6. `getCustomHooks()` aufrufen, um registrierte Hooks abzurufen.
236
+ 7. Alle temporären Dateien in einem `finally`-Block bereinigen.
237
+
238
+ Bei jedem Fehler (Datei nicht gefunden, Syntaxfehler, Import-Fehler) wird der Fehler in `~/.failproofai/hook.log` protokolliert und der Loader gibt ein leeres Array zurück. Eingebaute Policies sind davon nicht betroffen.
239
+
240
+ Benutzerdefinierte Policies werden nach allen eingebauten Policies ausgewertet. Ein `deny` einer benutzerdefinierten Policy unterbricht dennoch weitere benutzerdefinierte Policies (alle eingebauten Policies sind zu diesem Zeitpunkt jedoch bereits ausgeführt worden).
241
+
242
+ ---
243
+
244
+ ## Aktivitätsprotokollierung
245
+
246
+ Nach jedem Hook-Event hängt der Handler eine JSONL-Zeile an `~/.failproofai/hook-activity.jsonl` an:
247
+
248
+ ```json
249
+ {
250
+ "timestamp": "2026-04-06T12:34:56.789Z",
251
+ "sessionId": "abc123",
252
+ "eventType": "PreToolUse",
253
+ "toolName": "Bash",
254
+ "policyName": "block-sudo",
255
+ "decision": "deny",
256
+ "reason": "sudo command blocked by failproofai",
257
+ "durationMs": 12
258
+ }
259
+ ```
260
+
261
+ Eine Zeile pro Policy, die eine Nicht-Allow-Entscheidung getroffen hat. Allow-Entscheidungen werden nicht protokolliert (um die Dateigröße gering zu halten).
262
+
263
+ ---
264
+
265
+ ## Dashboard-Architektur
266
+
267
+ Das Dashboard ist eine **Next.js 16**-Anwendung, die den App Router mit React Server Components und Server Actions verwendet.
268
+
269
+ ```text
270
+ app/
271
+ layout.tsx ← Root-Layout (Theme, Telemetrie, Navigation)
272
+ projects/page.tsx ← Server-Komponente: alle Claude-Projekte auflisten
273
+ project/[name]/page.tsx ← Server-Komponente: Sitzungen in einem Projekt auflisten
274
+ project/[name]/session/
275
+ [sessionId]/page.tsx ← Server-Komponente: Sitzungsansicht rendern
276
+ policies/page.tsx ← Client-Komponente: Policy-Verwaltung + Aktivitätslog
277
+ actions/
278
+ get-hooks-config.ts ← Konfiguration + Policy-Liste lesen
279
+ update-hooks-config.ts ← Policy ein-/ausschalten
280
+ update-policy-params.ts ← Policy-Parameter aktualisieren
281
+ get-hook-activity.ts ← Aktivitätslog paginieren/durchsuchen
282
+ install-hooks-web.ts ← Hooks über den Browser installieren/entfernen
283
+ api/
284
+ download/[project]/[session]/route.ts ← Sitzung als ZIP/JSONL exportieren
285
+ ```
286
+
287
+ **Datenfluss:**
288
+
289
+ - Seitenkomponenten rufen `lib/projects.ts` und `lib/log-entries.ts` auf, um Projekt-/Sitzungsdaten direkt aus dem Dateisystem zu lesen (keine API-Schicht für Lesevorgänge).
290
+ - Die Policies-Seite verwendet Server Actions für alle Mutationen (Umschalten, Parameter-Aktualisierung, Installieren/Entfernen).
291
+ - Der Sitzungs-Viewer parst das JSONL-Transkriptformat von Claude und rendert einen Zeitstrahl von Nachrichten und Tool-Aufrufen.
292
+
293
+ **Wesentliche Designentscheidungen:**
294
+
295
+ - Keine Datenbank – der gesamte persistente Zustand liegt in einfachen Dateien (`~/.failproofai/`, `~/.claude/projects/`).
296
+ - Server Actions für Mutationen – kein REST-API für CRUD-Operationen erforderlich.
297
+ - React Server Components für Lese-Seiten – schnelleres initiales Laden, kein Client-Bundle für Datenabruf.
298
+ - Client-Komponenten nur dort, wo Interaktivität benötigt wird (Policy-Umschalter, Aktivitätssuche, Log-Viewer).
299
+
300
+ ---
301
+
302
+ ## Dateistruktur
303
+
304
+ ```text
305
+ failproofai/
306
+ ├── bin/
307
+ │ └── failproofai.mjs # CLI-Router (hook / dashboard / install / etc.)
308
+ ├── src/hooks/
309
+ │ ├── handler.ts # Hook-Event-Pipeline
310
+ │ ├── builtin-policies.ts # 26 Policy-Definitionen
311
+ │ ├── policy-evaluator.ts # Policy-Ausführungs-Engine
312
+ │ ├── policy-registry.ts # Policy-Registrierung und -Nachschlagen
313
+ │ ├── policy-types.ts # TypeScript-Interfaces
314
+ │ ├── hooks-config.ts # Mehrstufiges Laden der Konfiguration
315
+ │ ├── custom-hooks-registry.ts # globalThis-basierte Hook-Registry
316
+ │ ├── custom-hooks-loader.ts # ESM-Loader für benutzerdefinierte JS-Hooks
317
+ │ ├── manager.ts # Installations-/Entfernen-/Auflistungsoperationen
318
+ │ ├── install-prompt.ts # Interaktive Policy-Auswahlabfrage
319
+ │ ├── hook-logger.ts # Protokollierung nach hook.log
320
+ │ ├── hook-activity-store.ts # Aktivität nach hook-activity.jsonl persistieren
321
+ │ └── llm-client.ts # LLM-API-Client (für KI-gestützte Policies)
322
+ ├── app/ # Next.js-Dashboard (Seiten + Server Actions)
323
+ ├── lib/ # Gemeinsame Hilfsfunktionen
324
+ │ ├── projects.ts # Claude-Projekte aus dem Dateisystem aufzählen
325
+ │ ├── log-entries.ts # Claude-Transkript-JSONL-Format parsen
326
+ │ ├── paths.ts # Systempfade auflösen
327
+ │ └── ...
328
+ ├── components/ # Gemeinsame React-UI-Komponenten
329
+ ├── contexts/ # React-Context-Provider (Theme, Auto-Refresh, Telemetrie)
330
+ ├── examples/ # Beispieldateien für benutzerdefinierte Hooks
331
+ └── __tests__/ # Unit- und E2E-Tests
332
+ ```