failproofai 0.0.2 → 0.0.3

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 (483) 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 +5 -5
  6. package/.next/standalone/.next/prerender-manifest.json +3 -3
  7. package/.next/standalone/.next/required-server-files.json +3 -1
  8. package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +2 -2
  9. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  10. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  14. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  15. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  16. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  17. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  18. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +2 -2
  20. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  21. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  24. package/.next/standalone/.next/server/app/_not-found.rsc +17 -17
  25. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +17 -17
  26. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  27. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
  28. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  29. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  30. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  31. package/.next/standalone/.next/server/app/index.html +1 -1
  32. package/.next/standalone/.next/server/app/index.rsc +16 -16
  33. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  34. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +16 -16
  35. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  36. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +11 -11
  37. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  38. package/.next/standalone/.next/server/app/page/build-manifest.json +2 -2
  39. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  40. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/policies/page/build-manifest.json +2 -2
  43. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
  44. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +2 -2
  47. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  48. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +2 -2
  51. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  52. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  53. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  54. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/projects/page/build-manifest.json +2 -2
  56. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  57. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  58. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g72weg._.js +3 -0
  60. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0kjo7d_._.js +1 -1
  61. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_05pz9._._.js +1 -1
  62. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
  63. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__12kr5~_._.js → [root-of-the-server]__03kiqd5._.js} +2 -2
  64. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
  65. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
  66. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0qo8503._.js → [root-of-the-server]__0bo8s~-._.js} +2 -2
  67. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
  68. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
  69. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
  70. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +9 -9
  71. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
  72. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
  73. package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
  74. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
  75. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
  76. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a_7sdg.js +2 -2
  77. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ef3uwk.js +2 -2
  78. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0j79~gv.js +2 -2
  79. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0pbja1x.js +2 -2
  80. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0r6o0i2.js +2 -2
  81. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11y81~_.js +2 -2
  82. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_12or2kf.js +2 -2
  83. package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0mebn66._.js +1 -1
  84. package/.next/standalone/.next/server/middleware-build-manifest.js +5 -5
  85. package/.next/standalone/.next/server/pages/404.html +2 -2
  86. package/.next/standalone/.next/server/pages/500.html +1 -1
  87. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/server-reference-manifest.json +9 -9
  89. package/.next/standalone/.next/static/chunks/{0x-625~1vx1lu.js → 02t9.s735hqyq.js} +1 -1
  90. package/.next/standalone/.next/static/chunks/{0ov60i6md~37t.js → 03oepxbqx6o8~.js} +2 -2
  91. package/.next/standalone/.next/static/chunks/{031pa5~qfzt~_.js → 09e7drilkf1sn.js} +1 -1
  92. package/.next/standalone/.next/static/chunks/{0y~0creqvl5wx.js → 0cwft44dh9bww.js} +1 -1
  93. package/.next/standalone/.next/static/chunks/{06og.7e9nkpjh.js → 0e2uz2g026ckb.js} +1 -1
  94. package/.next/standalone/.next/static/chunks/0gu_a.a80ritd.css +1 -0
  95. package/.next/standalone/.next/static/chunks/{15wf7x-e.8ia3.js → 0h5kbvg~.xf.v.js} +1 -1
  96. package/.next/standalone/.next/static/chunks/{0_4y_t03jn2nq.js → 0od..umlku4bb.js} +1 -1
  97. package/.next/standalone/.next/static/chunks/{0cvffh-pbsv5u.js → 0xbwzy4dl87-0.js} +1 -1
  98. package/.next/standalone/.next/static/chunks/{0c_ljlxa._4lc.js → 18cl6wups7ouq.js} +2 -2
  99. package/.next/standalone/.next/static/chunks/{turbopack-0uc5y~g6h.n7-.js → turbopack-0r26pc8h0y_-e.js} +1 -1
  100. package/.next/standalone/CHANGELOG.md +103 -0
  101. package/.next/standalone/CLAUDE.md +28 -0
  102. package/.next/standalone/Dockerfile.docs +12 -0
  103. package/.next/standalone/README.md +95 -49
  104. package/.next/standalone/app/components/session-hooks-panel.tsx +14 -1
  105. package/.next/standalone/app/policies/hooks-client.tsx +14 -1
  106. package/.next/standalone/bin/failproofai.mjs +5 -0
  107. package/.next/standalone/bun.lock +76 -63
  108. package/.next/standalone/components/navbar.tsx +5 -0
  109. package/.next/standalone/dist/cli.mjs +539 -90
  110. package/.next/standalone/dist/index.js +2 -2
  111. package/.next/standalone/docs/ar/architecture.mdx +333 -0
  112. package/.next/standalone/docs/ar/built-in-policies.mdx +566 -0
  113. package/.next/standalone/docs/ar/cli/dashboard.mdx +28 -0
  114. package/.next/standalone/docs/ar/cli/environment-variables.mdx +34 -0
  115. package/.next/standalone/docs/ar/cli/hook.mdx +31 -0
  116. package/.next/standalone/docs/ar/cli/install-policies.mdx +49 -0
  117. package/.next/standalone/docs/ar/cli/list-policies.mdx +31 -0
  118. package/.next/standalone/docs/ar/cli/remove-policies.mdx +45 -0
  119. package/.next/standalone/docs/ar/cli/version.mdx +13 -0
  120. package/.next/standalone/docs/ar/configuration.mdx +223 -0
  121. package/.next/standalone/docs/ar/custom-policies.mdx +359 -0
  122. package/.next/standalone/docs/ar/dashboard.mdx +142 -0
  123. package/.next/standalone/docs/ar/examples.mdx +254 -0
  124. package/.next/standalone/docs/ar/for-agents.mdx +39 -0
  125. package/.next/standalone/docs/ar/getting-started.mdx +134 -0
  126. package/.next/standalone/docs/ar/introduction.mdx +58 -0
  127. package/.next/standalone/docs/ar/package-aliases.mdx +82 -0
  128. package/.next/standalone/docs/ar/testing.mdx +261 -0
  129. package/.next/standalone/docs/{architecture.md → architecture.mdx} +40 -23
  130. package/.next/standalone/docs/{built-in-policies.md → built-in-policies.mdx} +151 -13
  131. package/.next/standalone/docs/cli/dashboard.mdx +28 -0
  132. package/.next/standalone/docs/cli/environment-variables.mdx +34 -0
  133. package/.next/standalone/docs/cli/hook.mdx +30 -0
  134. package/.next/standalone/docs/cli/install-policies.mdx +48 -0
  135. package/.next/standalone/docs/cli/list-policies.mdx +31 -0
  136. package/.next/standalone/docs/cli/remove-policies.mdx +44 -0
  137. package/.next/standalone/docs/cli/version.mdx +12 -0
  138. package/.next/standalone/docs/{configuration.md → configuration.mdx} +62 -16
  139. package/.next/standalone/docs/custom-policies.mdx +357 -0
  140. package/.next/standalone/docs/{dashboard.md → dashboard.mdx} +26 -29
  141. package/.next/standalone/docs/de/architecture.mdx +332 -0
  142. package/.next/standalone/docs/de/built-in-policies.mdx +564 -0
  143. package/.next/standalone/docs/de/cli/dashboard.mdx +28 -0
  144. package/.next/standalone/docs/de/cli/environment-variables.mdx +34 -0
  145. package/.next/standalone/docs/de/cli/hook.mdx +30 -0
  146. package/.next/standalone/docs/de/cli/install-policies.mdx +48 -0
  147. package/.next/standalone/docs/de/cli/list-policies.mdx +31 -0
  148. package/.next/standalone/docs/de/cli/remove-policies.mdx +44 -0
  149. package/.next/standalone/docs/de/cli/version.mdx +12 -0
  150. package/.next/standalone/docs/de/configuration.mdx +222 -0
  151. package/.next/standalone/docs/de/custom-policies.mdx +357 -0
  152. package/.next/standalone/docs/de/dashboard.mdx +142 -0
  153. package/.next/standalone/docs/de/examples.mdx +253 -0
  154. package/.next/standalone/docs/de/for-agents.mdx +38 -0
  155. package/.next/standalone/docs/de/getting-started.mdx +134 -0
  156. package/.next/standalone/docs/de/introduction.mdx +57 -0
  157. package/.next/standalone/docs/de/package-aliases.mdx +82 -0
  158. package/.next/standalone/docs/de/testing.mdx +260 -0
  159. package/.next/standalone/docs/docs.json +938 -24
  160. package/.next/standalone/docs/es/architecture.mdx +332 -0
  161. package/.next/standalone/docs/es/built-in-policies.mdx +564 -0
  162. package/.next/standalone/docs/es/cli/dashboard.mdx +28 -0
  163. package/.next/standalone/docs/es/cli/environment-variables.mdx +34 -0
  164. package/.next/standalone/docs/es/cli/hook.mdx +30 -0
  165. package/.next/standalone/docs/es/cli/install-policies.mdx +48 -0
  166. package/.next/standalone/docs/es/cli/list-policies.mdx +31 -0
  167. package/.next/standalone/docs/es/cli/remove-policies.mdx +44 -0
  168. package/.next/standalone/docs/es/cli/version.mdx +12 -0
  169. package/.next/standalone/docs/es/configuration.mdx +222 -0
  170. package/.next/standalone/docs/es/custom-policies.mdx +357 -0
  171. package/.next/standalone/docs/es/dashboard.mdx +142 -0
  172. package/.next/standalone/docs/es/examples.mdx +253 -0
  173. package/.next/standalone/docs/es/for-agents.mdx +38 -0
  174. package/.next/standalone/docs/es/getting-started.mdx +134 -0
  175. package/.next/standalone/docs/es/introduction.mdx +57 -0
  176. package/.next/standalone/docs/es/package-aliases.mdx +82 -0
  177. package/.next/standalone/docs/es/testing.mdx +260 -0
  178. package/.next/standalone/docs/examples.mdx +253 -0
  179. package/.next/standalone/docs/for-agents.mdx +38 -0
  180. package/.next/standalone/docs/fr/architecture.mdx +332 -0
  181. package/.next/standalone/docs/fr/built-in-policies.mdx +564 -0
  182. package/.next/standalone/docs/fr/cli/dashboard.mdx +28 -0
  183. package/.next/standalone/docs/fr/cli/environment-variables.mdx +34 -0
  184. package/.next/standalone/docs/fr/cli/hook.mdx +30 -0
  185. package/.next/standalone/docs/fr/cli/install-policies.mdx +48 -0
  186. package/.next/standalone/docs/fr/cli/list-policies.mdx +31 -0
  187. package/.next/standalone/docs/fr/cli/remove-policies.mdx +44 -0
  188. package/.next/standalone/docs/fr/cli/version.mdx +12 -0
  189. package/.next/standalone/docs/fr/configuration.mdx +222 -0
  190. package/.next/standalone/docs/fr/custom-policies.mdx +357 -0
  191. package/.next/standalone/docs/fr/dashboard.mdx +142 -0
  192. package/.next/standalone/docs/fr/examples.mdx +253 -0
  193. package/.next/standalone/docs/fr/for-agents.mdx +38 -0
  194. package/.next/standalone/docs/fr/getting-started.mdx +134 -0
  195. package/.next/standalone/docs/fr/introduction.mdx +57 -0
  196. package/.next/standalone/docs/fr/package-aliases.mdx +82 -0
  197. package/.next/standalone/docs/fr/testing.mdx +260 -0
  198. package/.next/standalone/docs/getting-started.mdx +134 -0
  199. package/.next/standalone/docs/he/architecture.mdx +333 -0
  200. package/.next/standalone/docs/he/built-in-policies.mdx +564 -0
  201. package/.next/standalone/docs/he/cli/dashboard.mdx +28 -0
  202. package/.next/standalone/docs/he/cli/environment-variables.mdx +34 -0
  203. package/.next/standalone/docs/he/cli/hook.mdx +30 -0
  204. package/.next/standalone/docs/he/cli/install-policies.mdx +48 -0
  205. package/.next/standalone/docs/he/cli/list-policies.mdx +32 -0
  206. package/.next/standalone/docs/he/cli/remove-policies.mdx +44 -0
  207. package/.next/standalone/docs/he/cli/version.mdx +12 -0
  208. package/.next/standalone/docs/he/configuration.mdx +222 -0
  209. package/.next/standalone/docs/he/custom-policies.mdx +357 -0
  210. package/.next/standalone/docs/he/dashboard.mdx +142 -0
  211. package/.next/standalone/docs/he/examples.mdx +253 -0
  212. package/.next/standalone/docs/he/for-agents.mdx +38 -0
  213. package/.next/standalone/docs/he/getting-started.mdx +135 -0
  214. package/.next/standalone/docs/he/introduction.mdx +57 -0
  215. package/.next/standalone/docs/he/package-aliases.mdx +82 -0
  216. package/.next/standalone/docs/he/testing.mdx +260 -0
  217. package/.next/standalone/docs/hi/architecture.mdx +334 -0
  218. package/.next/standalone/docs/hi/built-in-policies.mdx +564 -0
  219. package/.next/standalone/docs/hi/cli/dashboard.mdx +28 -0
  220. package/.next/standalone/docs/hi/cli/environment-variables.mdx +34 -0
  221. package/.next/standalone/docs/hi/cli/hook.mdx +30 -0
  222. package/.next/standalone/docs/hi/cli/install-policies.mdx +48 -0
  223. package/.next/standalone/docs/hi/cli/list-policies.mdx +31 -0
  224. package/.next/standalone/docs/hi/cli/remove-policies.mdx +44 -0
  225. package/.next/standalone/docs/hi/cli/version.mdx +12 -0
  226. package/.next/standalone/docs/hi/configuration.mdx +222 -0
  227. package/.next/standalone/docs/hi/custom-policies.mdx +357 -0
  228. package/.next/standalone/docs/hi/dashboard.mdx +142 -0
  229. package/.next/standalone/docs/hi/examples.mdx +255 -0
  230. package/.next/standalone/docs/hi/for-agents.mdx +38 -0
  231. package/.next/standalone/docs/hi/getting-started.mdx +134 -0
  232. package/.next/standalone/docs/hi/introduction.mdx +57 -0
  233. package/.next/standalone/docs/hi/package-aliases.mdx +82 -0
  234. package/.next/standalone/docs/hi/testing.mdx +260 -0
  235. package/.next/standalone/docs/i18n/README.ar.md +312 -0
  236. package/.next/standalone/docs/i18n/README.de.md +307 -0
  237. package/.next/standalone/docs/i18n/README.es.md +307 -0
  238. package/.next/standalone/docs/i18n/README.fr.md +307 -0
  239. package/.next/standalone/docs/i18n/README.he.md +312 -0
  240. package/.next/standalone/docs/i18n/README.hi.md +307 -0
  241. package/.next/standalone/docs/i18n/README.it.md +307 -0
  242. package/.next/standalone/docs/i18n/README.ja.md +307 -0
  243. package/.next/standalone/docs/i18n/README.ko.md +307 -0
  244. package/.next/standalone/docs/i18n/README.pt-br.md +307 -0
  245. package/.next/standalone/docs/i18n/README.ru.md +308 -0
  246. package/.next/standalone/docs/i18n/README.tr.md +308 -0
  247. package/.next/standalone/docs/i18n/README.vi.md +308 -0
  248. package/.next/standalone/docs/i18n/README.zh.md +307 -0
  249. package/.next/standalone/docs/introduction.mdx +57 -0
  250. package/.next/standalone/docs/it/architecture.mdx +333 -0
  251. package/.next/standalone/docs/it/built-in-policies.mdx +564 -0
  252. package/.next/standalone/docs/it/cli/dashboard.mdx +28 -0
  253. package/.next/standalone/docs/it/cli/environment-variables.mdx +34 -0
  254. package/.next/standalone/docs/it/cli/hook.mdx +30 -0
  255. package/.next/standalone/docs/it/cli/install-policies.mdx +48 -0
  256. package/.next/standalone/docs/it/cli/list-policies.mdx +31 -0
  257. package/.next/standalone/docs/it/cli/remove-policies.mdx +44 -0
  258. package/.next/standalone/docs/it/cli/version.mdx +12 -0
  259. package/.next/standalone/docs/it/configuration.mdx +223 -0
  260. package/.next/standalone/docs/it/custom-policies.mdx +358 -0
  261. package/.next/standalone/docs/it/dashboard.mdx +142 -0
  262. package/.next/standalone/docs/it/examples.mdx +253 -0
  263. package/.next/standalone/docs/it/for-agents.mdx +38 -0
  264. package/.next/standalone/docs/it/getting-started.mdx +134 -0
  265. package/.next/standalone/docs/it/introduction.mdx +57 -0
  266. package/.next/standalone/docs/it/package-aliases.mdx +82 -0
  267. package/.next/standalone/docs/it/testing.mdx +260 -0
  268. package/.next/standalone/docs/ja/architecture.mdx +332 -0
  269. package/.next/standalone/docs/ja/built-in-policies.mdx +562 -0
  270. package/.next/standalone/docs/ja/cli/dashboard.mdx +28 -0
  271. package/.next/standalone/docs/ja/cli/environment-variables.mdx +34 -0
  272. package/.next/standalone/docs/ja/cli/hook.mdx +30 -0
  273. package/.next/standalone/docs/ja/cli/install-policies.mdx +48 -0
  274. package/.next/standalone/docs/ja/cli/list-policies.mdx +31 -0
  275. package/.next/standalone/docs/ja/cli/remove-policies.mdx +44 -0
  276. package/.next/standalone/docs/ja/cli/version.mdx +12 -0
  277. package/.next/standalone/docs/ja/configuration.mdx +222 -0
  278. package/.next/standalone/docs/ja/custom-policies.mdx +357 -0
  279. package/.next/standalone/docs/ja/dashboard.mdx +142 -0
  280. package/.next/standalone/docs/ja/examples.mdx +253 -0
  281. package/.next/standalone/docs/ja/for-agents.mdx +38 -0
  282. package/.next/standalone/docs/ja/getting-started.mdx +134 -0
  283. package/.next/standalone/docs/ja/introduction.mdx +57 -0
  284. package/.next/standalone/docs/ja/package-aliases.mdx +82 -0
  285. package/.next/standalone/docs/ja/testing.mdx +260 -0
  286. package/.next/standalone/docs/ko/architecture.mdx +332 -0
  287. package/.next/standalone/docs/ko/built-in-policies.mdx +562 -0
  288. package/.next/standalone/docs/ko/cli/dashboard.mdx +28 -0
  289. package/.next/standalone/docs/ko/cli/environment-variables.mdx +34 -0
  290. package/.next/standalone/docs/ko/cli/hook.mdx +30 -0
  291. package/.next/standalone/docs/ko/cli/install-policies.mdx +48 -0
  292. package/.next/standalone/docs/ko/cli/list-policies.mdx +31 -0
  293. package/.next/standalone/docs/ko/cli/remove-policies.mdx +44 -0
  294. package/.next/standalone/docs/ko/cli/version.mdx +12 -0
  295. package/.next/standalone/docs/ko/configuration.mdx +222 -0
  296. package/.next/standalone/docs/ko/custom-policies.mdx +357 -0
  297. package/.next/standalone/docs/ko/dashboard.mdx +142 -0
  298. package/.next/standalone/docs/ko/examples.mdx +253 -0
  299. package/.next/standalone/docs/ko/for-agents.mdx +38 -0
  300. package/.next/standalone/docs/ko/getting-started.mdx +134 -0
  301. package/.next/standalone/docs/ko/introduction.mdx +57 -0
  302. package/.next/standalone/docs/ko/package-aliases.mdx +82 -0
  303. package/.next/standalone/docs/ko/testing.mdx +260 -0
  304. package/.next/standalone/docs/logo/dark.svg +21 -0
  305. package/.next/standalone/docs/logo/light.svg +21 -0
  306. package/.next/standalone/docs/{package-aliases.md → package-aliases.mdx} +5 -5
  307. package/.next/standalone/docs/pt-br/architecture.mdx +332 -0
  308. package/.next/standalone/docs/pt-br/built-in-policies.mdx +564 -0
  309. package/.next/standalone/docs/pt-br/cli/dashboard.mdx +28 -0
  310. package/.next/standalone/docs/pt-br/cli/environment-variables.mdx +34 -0
  311. package/.next/standalone/docs/pt-br/cli/hook.mdx +30 -0
  312. package/.next/standalone/docs/pt-br/cli/install-policies.mdx +48 -0
  313. package/.next/standalone/docs/pt-br/cli/list-policies.mdx +31 -0
  314. package/.next/standalone/docs/pt-br/cli/remove-policies.mdx +44 -0
  315. package/.next/standalone/docs/pt-br/cli/version.mdx +12 -0
  316. package/.next/standalone/docs/pt-br/configuration.mdx +222 -0
  317. package/.next/standalone/docs/pt-br/custom-policies.mdx +357 -0
  318. package/.next/standalone/docs/pt-br/dashboard.mdx +142 -0
  319. package/.next/standalone/docs/pt-br/examples.mdx +253 -0
  320. package/.next/standalone/docs/pt-br/for-agents.mdx +38 -0
  321. package/.next/standalone/docs/pt-br/getting-started.mdx +134 -0
  322. package/.next/standalone/docs/pt-br/introduction.mdx +57 -0
  323. package/.next/standalone/docs/pt-br/package-aliases.mdx +82 -0
  324. package/.next/standalone/docs/pt-br/testing.mdx +260 -0
  325. package/.next/standalone/docs/ru/architecture.mdx +334 -0
  326. package/.next/standalone/docs/ru/built-in-policies.mdx +562 -0
  327. package/.next/standalone/docs/ru/cli/dashboard.mdx +28 -0
  328. package/.next/standalone/docs/ru/cli/environment-variables.mdx +34 -0
  329. package/.next/standalone/docs/ru/cli/hook.mdx +30 -0
  330. package/.next/standalone/docs/ru/cli/install-policies.mdx +48 -0
  331. package/.next/standalone/docs/ru/cli/list-policies.mdx +32 -0
  332. package/.next/standalone/docs/ru/cli/remove-policies.mdx +44 -0
  333. package/.next/standalone/docs/ru/cli/version.mdx +12 -0
  334. package/.next/standalone/docs/ru/configuration.mdx +223 -0
  335. package/.next/standalone/docs/ru/custom-policies.mdx +357 -0
  336. package/.next/standalone/docs/ru/dashboard.mdx +142 -0
  337. package/.next/standalone/docs/ru/examples.mdx +254 -0
  338. package/.next/standalone/docs/ru/for-agents.mdx +38 -0
  339. package/.next/standalone/docs/ru/getting-started.mdx +134 -0
  340. package/.next/standalone/docs/ru/introduction.mdx +57 -0
  341. package/.next/standalone/docs/ru/package-aliases.mdx +82 -0
  342. package/.next/standalone/docs/ru/testing.mdx +260 -0
  343. package/.next/standalone/docs/{testing.md → testing.mdx} +11 -11
  344. package/.next/standalone/docs/tr/architecture.mdx +333 -0
  345. package/.next/standalone/docs/tr/built-in-policies.mdx +562 -0
  346. package/.next/standalone/docs/tr/cli/dashboard.mdx +28 -0
  347. package/.next/standalone/docs/tr/cli/environment-variables.mdx +34 -0
  348. package/.next/standalone/docs/tr/cli/hook.mdx +30 -0
  349. package/.next/standalone/docs/tr/cli/install-policies.mdx +48 -0
  350. package/.next/standalone/docs/tr/cli/list-policies.mdx +31 -0
  351. package/.next/standalone/docs/tr/cli/remove-policies.mdx +45 -0
  352. package/.next/standalone/docs/tr/cli/version.mdx +12 -0
  353. package/.next/standalone/docs/tr/configuration.mdx +223 -0
  354. package/.next/standalone/docs/tr/custom-policies.mdx +357 -0
  355. package/.next/standalone/docs/tr/dashboard.mdx +142 -0
  356. package/.next/standalone/docs/tr/examples.mdx +253 -0
  357. package/.next/standalone/docs/tr/for-agents.mdx +38 -0
  358. package/.next/standalone/docs/tr/getting-started.mdx +134 -0
  359. package/.next/standalone/docs/tr/introduction.mdx +57 -0
  360. package/.next/standalone/docs/tr/package-aliases.mdx +82 -0
  361. package/.next/standalone/docs/tr/testing.mdx +260 -0
  362. package/.next/standalone/docs/vi/architecture.mdx +333 -0
  363. package/.next/standalone/docs/vi/built-in-policies.mdx +564 -0
  364. package/.next/standalone/docs/vi/cli/dashboard.mdx +28 -0
  365. package/.next/standalone/docs/vi/cli/environment-variables.mdx +34 -0
  366. package/.next/standalone/docs/vi/cli/hook.mdx +30 -0
  367. package/.next/standalone/docs/vi/cli/install-policies.mdx +48 -0
  368. package/.next/standalone/docs/vi/cli/list-policies.mdx +31 -0
  369. package/.next/standalone/docs/vi/cli/remove-policies.mdx +44 -0
  370. package/.next/standalone/docs/vi/cli/version.mdx +13 -0
  371. package/.next/standalone/docs/vi/configuration.mdx +222 -0
  372. package/.next/standalone/docs/vi/custom-policies.mdx +357 -0
  373. package/.next/standalone/docs/vi/dashboard.mdx +142 -0
  374. package/.next/standalone/docs/vi/examples.mdx +253 -0
  375. package/.next/standalone/docs/vi/for-agents.mdx +38 -0
  376. package/.next/standalone/docs/vi/getting-started.mdx +134 -0
  377. package/.next/standalone/docs/vi/introduction.mdx +57 -0
  378. package/.next/standalone/docs/vi/package-aliases.mdx +82 -0
  379. package/.next/standalone/docs/vi/testing.mdx +260 -0
  380. package/.next/standalone/docs/zh/architecture.mdx +332 -0
  381. package/.next/standalone/docs/zh/built-in-policies.mdx +562 -0
  382. package/.next/standalone/docs/zh/cli/dashboard.mdx +28 -0
  383. package/.next/standalone/docs/zh/cli/environment-variables.mdx +34 -0
  384. package/.next/standalone/docs/zh/cli/hook.mdx +30 -0
  385. package/.next/standalone/docs/zh/cli/install-policies.mdx +48 -0
  386. package/.next/standalone/docs/zh/cli/list-policies.mdx +31 -0
  387. package/.next/standalone/docs/zh/cli/remove-policies.mdx +44 -0
  388. package/.next/standalone/docs/zh/cli/version.mdx +12 -0
  389. package/.next/standalone/docs/zh/configuration.mdx +222 -0
  390. package/.next/standalone/docs/zh/custom-policies.mdx +357 -0
  391. package/.next/standalone/docs/zh/dashboard.mdx +142 -0
  392. package/.next/standalone/docs/zh/examples.mdx +253 -0
  393. package/.next/standalone/docs/zh/for-agents.mdx +38 -0
  394. package/.next/standalone/docs/zh/getting-started.mdx +134 -0
  395. package/.next/standalone/docs/zh/introduction.mdx +57 -0
  396. package/.next/standalone/docs/zh/package-aliases.mdx +82 -0
  397. package/.next/standalone/docs/zh/testing.mdx +260 -0
  398. package/.next/standalone/examples/convention-policies/security-policies.mjs +40 -0
  399. package/.next/standalone/examples/convention-policies/workflow-policies.mjs +41 -0
  400. package/.next/standalone/next.config.ts +5 -3
  401. package/.next/standalone/node_modules/@next/env/package.json +1 -1
  402. package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
  403. package/.next/standalone/node_modules/next/dist/compiled/jsonwebtoken/index.js +2 -2
  404. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +1 -1
  405. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +1 -1
  406. package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +1 -1
  407. package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
  408. package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
  409. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +7 -2
  410. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
  411. package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
  412. package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
  413. package/.next/standalone/node_modules/next/dist/server/render.js +20 -19
  414. package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
  415. package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
  416. package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
  417. package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
  418. package/.next/standalone/node_modules/next/package.json +15 -15
  419. package/.next/standalone/node_modules/react/cjs/react.development.js +1 -1
  420. package/.next/standalone/node_modules/react/cjs/react.production.js +1 -1
  421. package/.next/standalone/node_modules/react/package.json +1 -1
  422. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +1 -1
  423. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +1 -1
  424. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +3 -3
  425. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +3 -3
  426. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +3 -3
  427. package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +1 -1
  428. package/.next/standalone/node_modules/react-dom/package.json +2 -2
  429. package/.next/standalone/package.json +13 -10
  430. package/.next/standalone/scripts/translate-docs/cache.ts +62 -0
  431. package/.next/standalone/scripts/translate-docs/cli.ts +357 -0
  432. package/.next/standalone/scripts/translate-docs/config.ts +248 -0
  433. package/.next/standalone/scripts/translate-docs/mdx-translator.ts +153 -0
  434. package/.next/standalone/scripts/translate-docs/mintlify-nav.ts +107 -0
  435. package/.next/standalone/scripts/translate-docs/readme-translator.ts +154 -0
  436. package/.next/standalone/scripts/translate-docs/translator.ts +68 -0
  437. package/.next/standalone/scripts/translate-docs/types.ts +43 -0
  438. package/.next/standalone/server.js +1 -1
  439. package/.next/standalone/skills-lock.json +10 -0
  440. package/.next/standalone/src/hooks/builtin-policies.ts +405 -25
  441. package/.next/standalone/src/hooks/custom-hooks-loader.ts +165 -21
  442. package/.next/standalone/src/hooks/handler.ts +33 -6
  443. package/.next/standalone/src/hooks/hook-activity-store.ts +6 -1
  444. package/.next/standalone/src/hooks/hooks-config.ts +47 -2
  445. package/.next/standalone/src/hooks/llm-client.ts +2 -2
  446. package/.next/standalone/src/hooks/loader-utils.ts +4 -4
  447. package/.next/standalone/src/hooks/manager.ts +67 -16
  448. package/.next/standalone/src/hooks/policy-evaluator.ts +58 -19
  449. package/.next/standalone/src/hooks/policy-helpers.ts +2 -2
  450. package/.next/standalone/vitest.config.e2e.mts +3 -0
  451. package/.next/standalone/vitest.config.mts +3 -0
  452. package/README.md +95 -49
  453. package/bin/failproofai.mjs +5 -0
  454. package/dist/cli.mjs +539 -90
  455. package/dist/index.js +2 -2
  456. package/package.json +13 -10
  457. package/scripts/translate-docs/cache.ts +62 -0
  458. package/scripts/translate-docs/cli.ts +357 -0
  459. package/scripts/translate-docs/config.ts +248 -0
  460. package/scripts/translate-docs/mdx-translator.ts +153 -0
  461. package/scripts/translate-docs/mintlify-nav.ts +107 -0
  462. package/scripts/translate-docs/readme-translator.ts +154 -0
  463. package/scripts/translate-docs/translator.ts +68 -0
  464. package/scripts/translate-docs/types.ts +43 -0
  465. package/src/hooks/builtin-policies.ts +405 -25
  466. package/src/hooks/custom-hooks-loader.ts +165 -21
  467. package/src/hooks/handler.ts +33 -6
  468. package/src/hooks/hook-activity-store.ts +6 -1
  469. package/src/hooks/hooks-config.ts +47 -2
  470. package/src/hooks/llm-client.ts +2 -2
  471. package/src/hooks/loader-utils.ts +4 -4
  472. package/src/hooks/manager.ts +67 -16
  473. package/src/hooks/policy-evaluator.ts +58 -19
  474. package/src/hooks/policy-helpers.ts +2 -2
  475. package/.next/standalone/.next/server/chunks/[root-of-the-server]__02nt~6d._.js +0 -3
  476. package/.next/standalone/.next/static/chunks/15jpradyu_531.css +0 -1
  477. package/.next/standalone/docs/cli-reference.md +0 -175
  478. package/.next/standalone/docs/custom-hooks.md +0 -261
  479. package/.next/standalone/docs/getting-started.md +0 -128
  480. package/.next/standalone/docs/introduction.md +0 -47
  481. /package/.next/standalone/.next/static/{WS-OQSqL1Lp1w_obXfjvl → En9eEShUkUjgeYbY9v6Gy}/_buildManifest.js +0 -0
  482. /package/.next/standalone/.next/static/{WS-OQSqL1Lp1w_obXfjvl → En9eEShUkUjgeYbY9v6Gy}/_clientMiddlewareManifest.js +0 -0
  483. /package/.next/standalone/.next/static/{WS-OQSqL1Lp1w_obXfjvl → En9eEShUkUjgeYbY9v6Gy}/_ssgManifest.js +0 -0
@@ -0,0 +1,31 @@
1
+ ---
2
+ title: 정책 목록 보기
3
+ description: "활성화된 정책, 해당 파라미터, 커스텀 정책을 확인합니다"
4
+ ---
5
+
6
+ ```bash
7
+ failproofai policies
8
+ ```
9
+
10
+ 모든 정책의 상태, 설정된 파라미터, 커스텀 정책을 표시합니다.
11
+
12
+ ## 출력 예시
13
+
14
+ ```text
15
+ Failproof AI Hook Policies (user)
16
+
17
+ Status Name Description
18
+ ────── ──────────────────────────────────────────────────────────────
19
+ ✓ block-sudo Block sudo commands
20
+ allowPatterns: ["sudo systemctl status"]
21
+ ✓ block-rm-rf Block recursive deletions
22
+ ✗ block-curl-pipe-sh Block curl|bash patterns
23
+ ✓ sanitize-api-keys Redact API keys from output
24
+ additionalPatterns: [{ regex: "MY_TOKEN_...", label: "..." }]
25
+
26
+ ── Custom Policies (/home/alice/myproject/my-policies.js) ──────────────
27
+ ✓ require-jira-ticket Block commits without ticket
28
+ ✓ approval-gate Approval gate for destructive ops
29
+ ```
30
+
31
+ `policyParams`에 알 수 없는 키가 있으면 여기서 표시되므로, 오타를 조기에 발견할 수 있습니다.
@@ -0,0 +1,44 @@
1
+ ---
2
+ title: 정책 제거
3
+ description: "Claude Code의 설정에서 훅 항목 제거"
4
+ ---
5
+
6
+ ```bash
7
+ failproofai policies --uninstall [policy-names...] [options]
8
+ ```
9
+
10
+ Claude Code의 `settings.json`에서 failproofai 훅 항목을 제거합니다.
11
+
12
+ 별칭: `failproofai p -u`
13
+
14
+ ## 옵션
15
+
16
+ | 플래그 | 설명 |
17
+ |--------|------|
18
+ | `--scope user` | 전역 설정에서 제거 (기본값) |
19
+ | `--scope project` | 프로젝트 설정에서 제거 |
20
+ | `--scope local` | 로컬 설정에서 제거 |
21
+ | `--scope all` | 모든 범위에서 한 번에 제거 |
22
+ | `--custom` / `-c` | 설정에서 `customPoliciesPath` 초기화 |
23
+ | `--beta` | 설정에서 베타 정책만 제거 |
24
+
25
+ ## 동작 방식
26
+
27
+ - **정책 이름 미지정** - 설정 파일에서 모든 failproofai 훅 항목을 제거합니다
28
+ - **특정 이름 지정** - 해당 정책을 비활성화하지만 훅은 설치된 상태로 유지됩니다
29
+
30
+ ## 예시
31
+
32
+ ```bash
33
+ # 전역에서 모든 훅 제거
34
+ failproofai policies --uninstall
35
+
36
+ # 특정 정책 비활성화 (훅은 설치 상태 유지)
37
+ failproofai policies --uninstall block-sudo
38
+
39
+ # 모든 범위에서 훅 제거
40
+ failproofai policies --uninstall --scope all
41
+
42
+ # 커스텀 정책 경로 초기화
43
+ failproofai policies --uninstall --custom
44
+ ```
@@ -0,0 +1,12 @@
1
+ ---
2
+ title: 버전 확인
3
+ description: "설치된 failproofai 버전 출력"
4
+ ---
5
+
6
+ ```bash
7
+ failproofai --version
8
+ # or
9
+ failproofai -v
10
+ ```
11
+
12
+ 설치된 버전 번호를 출력합니다.
@@ -0,0 +1,222 @@
1
+ ---
2
+ title: 설정
3
+ description: "설정 파일 형식, 세 가지 범위 시스템, 그리고 병합 규칙"
4
+ icon: gear
5
+ ---
6
+
7
+ failproofai는 JSON 설정 파일을 사용하여 어떤 정책이 활성화되어 있는지, 정책이 어떻게 동작하는지, 커스텀 정책을 어디서 로드할지를 제어합니다. 설정은 팀과 쉽게 공유할 수 있도록 설계되었습니다. 저장소에 커밋하면 모든 개발자가 동일한 에이전트 안전망을 갖게 됩니다.
8
+
9
+ ---
10
+
11
+ ## 설정 범위
12
+
13
+ 설정 범위는 세 가지이며, 우선순위 순서대로 평가됩니다:
14
+
15
+ | 범위 | 파일 경로 | 용도 |
16
+ |-------|-----------|---------|
17
+ | **project** | `.failproofai/policies-config.json` | 저장소별 설정, 버전 관리에 커밋 |
18
+ | **local** | `.failproofai/policies-config.local.json` | 개인 저장소별 오버라이드, gitignore 처리 |
19
+ | **global** | `~/.failproofai/policies-config.json` | 모든 프로젝트에 적용되는 사용자 수준 기본값 |
20
+
21
+ failproofai가 훅 이벤트를 수신하면, 현재 작업 디렉터리에 존재하는 세 파일을 모두 로드하여 병합합니다.
22
+
23
+ ### 병합 규칙
24
+
25
+ **`enabledPolicies`** - 세 범위의 합집합입니다. 어느 한 수준에서라도 활성화된 정책은 적용됩니다.
26
+
27
+ ```text
28
+ project: ["block-sudo"]
29
+ local: ["block-rm-rf"]
30
+ global: ["block-sudo", "sanitize-api-keys"]
31
+
32
+ resolved: ["block-sudo", "block-rm-rf", "sanitize-api-keys"] ← 중복 제거된 합집합
33
+ ```
34
+
35
+ **`policyParams`** - 특정 정책의 파라미터를 처음으로 정의한 범위가 전적으로 우선합니다. 정책 파라미터 내부의 값은 깊은 병합이 이루어지지 않습니다.
36
+
37
+ ```text
38
+ project: block-sudo → { allowPatterns: ["sudo apt-get update"] }
39
+ global: block-sudo → { allowPatterns: ["sudo systemctl status"] }
40
+
41
+ resolved: { allowPatterns: ["sudo apt-get update"] } ← project 우선, global 무시
42
+ ```
43
+
44
+ ```text
45
+ project: (block-sudo 항목 없음)
46
+ local: (block-sudo 항목 없음)
47
+ global: block-sudo → { allowPatterns: ["sudo systemctl status"] }
48
+
49
+ resolved: { allowPatterns: ["sudo systemctl status"] } ← global까지 폴스루
50
+ ```
51
+
52
+ **`customPoliciesPath`** - 처음으로 정의한 범위가 우선합니다.
53
+
54
+ **`llm`** - 처음으로 정의한 범위가 우선합니다.
55
+
56
+ ---
57
+
58
+ ## 설정 파일 형식
59
+
60
+ ```json
61
+ {
62
+ "enabledPolicies": [
63
+ "block-sudo",
64
+ "block-rm-rf",
65
+ "block-push-master",
66
+ "sanitize-api-keys",
67
+ "sanitize-jwt",
68
+ "block-env-files",
69
+ "block-read-outside-cwd"
70
+ ],
71
+ "policyParams": {
72
+ "block-sudo": {
73
+ "allowPatterns": ["sudo systemctl status", "sudo journalctl"]
74
+ },
75
+ "block-push-master": {
76
+ "protectedBranches": ["main", "release", "prod"]
77
+ },
78
+ "block-rm-rf": {
79
+ "allowPaths": ["/tmp"]
80
+ },
81
+ "block-read-outside-cwd": {
82
+ "allowPaths": ["/shared/data", "/opt/company"]
83
+ },
84
+ "sanitize-api-keys": {
85
+ "additionalPatterns": [
86
+ { "regex": "myco_[A-Za-z0-9]{32}", "label": "MyCo API key" }
87
+ ]
88
+ },
89
+ "warn-large-file-write": {
90
+ "thresholdKb": 512
91
+ }
92
+ },
93
+ "customPoliciesPath": "/home/alice/myproject/my-policies.js"
94
+ }
95
+ ```
96
+
97
+ ---
98
+
99
+ ## 필드 참조
100
+
101
+ ### `enabledPolicies`
102
+
103
+ 타입: `string[]`
104
+
105
+ 활성화할 정책 이름 목록입니다. 이름은 `failproofai policies`가 표시하는 정책 식별자와 정확히 일치해야 합니다. 전체 목록은 [기본 제공 정책](/ko/built-in-policies)을 참조하세요.
106
+
107
+ `enabledPolicies`에 포함되지 않은 정책은 `policyParams`에 항목이 있더라도 비활성 상태입니다.
108
+
109
+ ### `policyParams`
110
+
111
+ 타입: `Record<string, Record<string, unknown>>`
112
+
113
+ 정책별 파라미터 오버라이드입니다. 외부 키는 정책 이름이고, 내부 키는 정책별로 다릅니다. 각 정책의 사용 가능한 파라미터는 [기본 제공 정책](/ko/built-in-policies)에 문서화되어 있습니다.
114
+
115
+ 정책에 파라미터가 있지만 별도로 지정하지 않으면 정책의 기본값이 사용됩니다. `policyParams`를 전혀 설정하지 않은 사용자는 이전 버전과 동일하게 동작합니다.
116
+
117
+ 정책 파라미터 블록 내의 알 수 없는 키는 훅 실행 시에는 조용히 무시되지만, `failproofai policies`를 실행하면 경고로 표시됩니다.
118
+
119
+ #### `hint` (공통 설정)
120
+
121
+ 타입: `string` (선택 사항)
122
+
123
+ 정책이 `deny` 또는 `instruct`를 반환할 때 사유에 덧붙여지는 메시지입니다. 정책 자체를 수정하지 않고도 Claude에게 실행 가능한 안내를 제공할 수 있습니다.
124
+
125
+ 기본 제공 정책, 커스텀 정책(`custom/`), 프로젝트 컨벤션 정책(`.failproofai-project/`), 사용자 컨벤션 정책(`.failproofai-user/`) 등 모든 정책 유형에서 동작합니다.
126
+
127
+ ```json
128
+ {
129
+ "policyParams": {
130
+ "block-force-push": {
131
+ "hint": "Try creating a fresh branch instead."
132
+ },
133
+ "block-sudo": {
134
+ "allowPatterns": ["sudo apt-get"],
135
+ "hint": "Use apt-get directly without sudo."
136
+ },
137
+ "custom/my-policy": {
138
+ "hint": "Ask the user for approval first."
139
+ }
140
+ }
141
+ }
142
+ ```
143
+
144
+ `block-force-push`가 거부할 때, Claude는 다음을 보게 됩니다: *"Force-pushing is blocked. Try creating a fresh branch instead."*
145
+
146
+ 문자열이 아닌 값과 빈 문자열은 조용히 무시됩니다. `hint`를 설정하지 않으면 동작이 변경되지 않습니다(하위 호환성 유지).
147
+
148
+ ### `customPoliciesPath`
149
+
150
+ 타입: `string` (절대 경로)
151
+
152
+ 커스텀 훅 정책이 담긴 JavaScript 파일 경로입니다. `failproofai policies --install --custom <path>` 명령으로 자동 설정되며, 저장 전에 절대 경로로 변환됩니다.
153
+
154
+ 파일은 매 훅 이벤트마다 새로 로드됩니다. 캐싱은 없습니다. 작성 방법은 [커스텀 정책](/ko/custom-policies)을 참조하세요.
155
+
156
+ ### 컨벤션 기반 정책 (v0.0.2-beta.7+)
157
+
158
+ 명시적인 `customPoliciesPath` 외에도, failproofai는 `.failproofai/policies/` 디렉터리에서 정책 파일을 자동으로 검색하여 로드합니다:
159
+
160
+ | 수준 | 디렉터리 | 범위 |
161
+ |-------|-----------|-------|
162
+ | 프로젝트 | `.failproofai/policies/` | 버전 관리를 통해 팀과 공유 |
163
+ | 사용자 | `~/.failproofai/policies/` | 개인용, 모든 프로젝트에 적용 |
164
+
165
+ **파일 매칭:** `*policies.{js,mjs,ts}` 패턴과 일치하는 파일만 로드됩니다(예: `security-policies.mjs`, `workflow-policies.js`). 디렉터리 내 다른 파일은 무시됩니다.
166
+
167
+ **설정 불필요:** 컨벤션 정책은 `policies-config.json`에 별도 항목이 필요하지 않습니다. 해당 디렉터리에 파일을 넣기만 하면 다음 훅 이벤트에서 자동으로 인식됩니다.
168
+
169
+ **합집합 로딩:** 프로젝트와 사용자 컨벤션 디렉터리가 모두 검색됩니다. 두 수준의 일치하는 파일이 모두 로드됩니다(`customPoliciesPath`는 첫 번째 범위가 우선하는 것과 다릅니다).
170
+
171
+ 자세한 내용과 예시는 [커스텀 정책](/ko/custom-policies)을 참조하세요.
172
+
173
+ ### `llm`
174
+
175
+ 타입: `object` (선택 사항)
176
+
177
+ AI 호출을 수행하는 정책을 위한 LLM 클라이언트 설정입니다. 대부분의 경우에는 필요하지 않습니다.
178
+
179
+ ```json
180
+ {
181
+ "llm": {
182
+ "model": "claude-sonnet-4-6",
183
+ "apiKey": "sk-ant-..."
184
+ }
185
+ }
186
+ ```
187
+
188
+ ---
189
+
190
+ ## CLI로 설정 관리하기
191
+
192
+ `policies --install` 및 `policies --uninstall` 명령은 Claude Code의 `settings.json`(훅 진입점)에 기록하고, `policies-config.json`은 직접 관리하는 파일입니다. 두 파일은 별개입니다:
193
+
194
+ - **`settings.json`** - 각 도구 사용 시 Claude Code가 `failproofai --hook <event>`를 호출하도록 지시
195
+ - **`policies-config.json`** - failproofai가 어떤 정책을 어떤 파라미터로 평가할지 지시
196
+
197
+ `policies-config.json`은 언제든지 직접 편집할 수 있으며, 변경 사항은 재시작 없이 다음 훅 이벤트에서 즉시 반영됩니다.
198
+
199
+ ---
200
+
201
+ ## 예시: 팀 기본값이 포함된 프로젝트 수준 설정
202
+
203
+ `.failproofai/policies-config.json`을 저장소에 커밋하세요:
204
+
205
+ ```json
206
+ {
207
+ "enabledPolicies": [
208
+ "block-sudo",
209
+ "block-rm-rf",
210
+ "block-push-master",
211
+ "sanitize-api-keys",
212
+ "block-env-files"
213
+ ],
214
+ "policyParams": {
215
+ "block-push-master": {
216
+ "protectedBranches": ["main", "release", "hotfix"]
217
+ }
218
+ }
219
+ }
220
+ ```
221
+
222
+ 각 개발자는 `.failproofai/policies-config.local.json`(gitignore 처리)을 생성하여 팀원에게 영향을 주지 않고 개인 오버라이드를 적용할 수 있습니다.
@@ -0,0 +1,357 @@
1
+ ---
2
+ title: 커스텀 정책
3
+ description: "JavaScript로 직접 정책을 작성하세요 - 컨벤션 적용, 드리프트 방지, 실패 감지, 외부 시스템 연동"
4
+ icon: code
5
+ ---
6
+
7
+ 커스텀 정책을 사용하면 에이전트 동작에 대한 규칙을 직접 작성할 수 있습니다. 프로젝트 컨벤션 강제 적용, 드리프트 방지, 위험한 작업 차단, 멈춘 에이전트 감지, Slack이나 승인 워크플로우 연동 등 다양한 용도로 활용할 수 있습니다. 내장 정책과 동일한 훅 이벤트 시스템 및 `allow`, `deny`, `instruct` 결정 방식을 사용합니다.
8
+
9
+ ---
10
+
11
+ ## 빠른 예제
12
+
13
+ ```js
14
+ // my-policies.js
15
+ import { customPolicies, allow, deny, instruct } from "failproofai";
16
+
17
+ customPolicies.add({
18
+ name: "no-production-writes",
19
+ description: "Block writes to paths containing 'production'",
20
+ match: { events: ["PreToolUse"] },
21
+ fn: async (ctx) => {
22
+ if (ctx.toolName !== "Write" && ctx.toolName !== "Edit") return allow();
23
+ const path = ctx.toolInput?.file_path ?? "";
24
+ if (path.includes("production")) {
25
+ return deny("Writes to production paths are blocked");
26
+ }
27
+ return allow();
28
+ },
29
+ });
30
+ ```
31
+
32
+ 설치:
33
+
34
+ ```bash
35
+ failproofai policies --install --custom ./my-policies.js
36
+ ```
37
+
38
+ ---
39
+
40
+ ## 커스텀 정책을 불러오는 두 가지 방법
41
+
42
+ ### 방법 1: 컨벤션 기반 (권장, v0.0.2-beta.7 이상)
43
+
44
+ `.failproofai/policies/` 디렉터리에 `*policies.{js,mjs,ts}` 파일을 넣으면 자동으로 불러옵니다 — 별도의 플래그나 설정 변경이 필요 없습니다. git 훅처럼 파일을 넣으면 바로 작동합니다.
45
+
46
+ ```
47
+ # 프로젝트 레벨 — git에 커밋되어 팀과 공유
48
+ .failproofai/policies/security-policies.mjs
49
+ .failproofai/policies/workflow-policies.mjs
50
+
51
+ # 사용자 레벨 — 개인용, 모든 프로젝트에 적용
52
+ ~/.failproofai/policies/my-policies.mjs
53
+ ```
54
+
55
+ **동작 방식:**
56
+ - 프로젝트와 사용자 디렉터리 모두 탐색합니다 (합집합 방식 — 첫 번째 스코프 우선이 아님)
57
+ - 각 디렉터리 내에서 파일은 알파벳 순으로 불러옵니다. 순서를 제어하려면 `01-`, `02-` 접두사를 사용하세요
58
+ - `*policies.{js,mjs,ts}` 패턴에 맞는 파일만 불러옵니다. 그 외 파일은 무시됩니다
59
+ - 각 파일은 독립적으로 불러옵니다 (파일 단위 fail-open)
60
+ - 명시적 `--custom` 및 내장 정책과 함께 사용할 수 있습니다
61
+
62
+ <Tip>
63
+ 컨벤션 정책은 팀 전체에 정책을 공유하는 가장 쉬운 방법입니다. `.failproofai/policies/`를 git에 커밋하면 팀원 모두가 자동으로 적용받습니다.
64
+ </Tip>
65
+
66
+ ### 방법 2: 명시적 파일 경로
67
+
68
+ ```bash
69
+ # 커스텀 정책 파일과 함께 설치
70
+ failproofai policies --install --custom ./my-policies.js
71
+
72
+ # 정책 파일 경로 교체
73
+ failproofai policies --install --custom ./new-policies.js
74
+
75
+ # 설정에서 커스텀 정책 경로 제거
76
+ failproofai policies --uninstall --custom
77
+ ```
78
+
79
+ 확인된 절대 경로는 `policies-config.json`에 `customPoliciesPath`로 저장됩니다. 파일은 매 훅 이벤트마다 새로 불러옵니다 — 이벤트 간 캐싱은 없습니다.
80
+
81
+ ### 두 방법 함께 사용하기
82
+
83
+ 컨벤션 정책과 명시적 `--custom` 파일은 함께 사용할 수 있습니다. 불러오는 순서:
84
+
85
+ 1. 명시적 `customPoliciesPath` 파일 (설정된 경우)
86
+ 2. 프로젝트 컨벤션 파일 (`{cwd}/.failproofai/policies/`, 알파벳 순)
87
+ 3. 사용자 컨벤션 파일 (`~/.failproofai/policies/`, 알파벳 순)
88
+
89
+ ---
90
+
91
+ ## API
92
+
93
+ ### Import
94
+
95
+ ```js
96
+ import { customPolicies, allow, deny, instruct } from "failproofai";
97
+ ```
98
+
99
+ ### `customPolicies.add(hook)`
100
+
101
+ 정책을 등록합니다. 같은 파일에 여러 정책을 등록하려면 필요한 만큼 호출하세요.
102
+
103
+ ```ts
104
+ customPolicies.add({
105
+ name: string; // 필수 - 고유 식별자
106
+ description?: string; // `failproofai policies` 출력에 표시됨
107
+ match?: { events?: HookEventType[] }; // 이벤트 유형으로 필터링; 생략 시 모든 이벤트에 적용
108
+ fn: (ctx: PolicyContext) => PolicyResult | Promise<PolicyResult>;
109
+ });
110
+ ```
111
+
112
+ ### 결정 헬퍼
113
+
114
+ | 함수 | 효과 | 사용 시점 |
115
+ |----------|--------|----------|
116
+ | `allow()` | 조용히 작업을 허용 | 작업이 안전하고 메시지가 필요 없을 때 |
117
+ | `deny(message)` | 작업을 차단 | 에이전트가 해당 작업을 수행해서는 안 될 때 |
118
+ | `instruct(message)` | 차단 없이 컨텍스트 추가 | 에이전트가 올바른 방향을 유지하도록 추가 정보를 제공할 때 |
119
+
120
+ `deny(message)` — 메시지는 `"Blocked by failproofai:"` 접두사가 붙어 Claude에게 전달됩니다. 하나의 `deny`가 이후 모든 평가를 단락시킵니다.
121
+
122
+ `instruct(message)` — 메시지는 현재 도구 호출에 대한 Claude의 컨텍스트에 추가됩니다. 모든 `instruct` 메시지는 누적되어 함께 전달됩니다.
123
+
124
+ <Tip>
125
+ `policyParams`의 `hint` 필드를 추가하면 코드 변경 없이 `deny` 또는 `instruct` 메시지에 추가 안내를 덧붙일 수 있습니다. 커스텀(`custom/`), 프로젝트 컨벤션(`.failproofai-project/`), 사용자 컨벤션(`.failproofai-user/`) 정책 모두에서 작동합니다. 자세한 내용은 [Configuration → hint](/ko/configuration#hint-cross-cutting)를 참고하세요.
126
+ </Tip>
127
+
128
+ ### 정보성 allow 메시지 (베타)
129
+
130
+ <Note>
131
+ `allow(message)`는 v0.0.2-beta.3부터 사용 가능한 베타 기능입니다. API는 향후 릴리스에서 변경될 수 있습니다. 이전 버전은 인수 없는 `allow()`만 지원합니다.
132
+ </Note>
133
+
134
+ `allow(message)`는 작업을 허용하면서 **동시에** 정보성 메시지를 Claude에게 전달합니다. 메시지는 훅 핸들러의 stdout 응답에서 `additionalContext`로 전달됩니다 — `instruct`와 동일한 메커니즘이지만, 의미적으로 다릅니다. 이는 경고가 아닌 상태 업데이트입니다.
135
+
136
+ | 함수 | 효과 | 사용 시점 |
137
+ |----------|--------|----------|
138
+ | `allow(message)` | 허용하면서 Claude에게 컨텍스트 전달 | 검사가 통과되었음을 확인하거나, 검사가 건너뛰어진 이유를 설명할 때 |
139
+
140
+ 사용 사례:
141
+ - **상태 확인:** `allow("All CI checks passed.")` — 모든 것이 정상임을 Claude에게 알림
142
+ - **Fail-open 설명:** `allow("GitHub CLI not installed, skipping CI check.")` — 검사가 건너뛰어진 이유를 Claude에게 알려 전체 컨텍스트를 제공
143
+ - **다중 메시지 누적:** 여러 정책이 각각 `allow(message)`를 반환하면 모든 메시지가 줄바꿈으로 이어져 함께 전달됨
144
+
145
+ ```js
146
+ customPolicies.add({
147
+ name: "confirm-branch-status",
148
+ match: { events: ["Stop"] },
149
+ fn: async (ctx) => {
150
+ const cwd = ctx.session?.cwd;
151
+ if (!cwd) return allow("No working directory, skipping branch check.");
152
+
153
+ // ... check branch status ...
154
+ if (allPushed) {
155
+ return allow("Branch is up to date with remote.");
156
+ }
157
+ return deny("Unpushed changes detected.");
158
+ },
159
+ });
160
+ ```
161
+
162
+ ### `PolicyContext` 필드
163
+
164
+ | 필드 | 타입 | 설명 |
165
+ |-------|------|-------------|
166
+ | `eventType` | `string` | `"PreToolUse"`, `"PostToolUse"`, `"Notification"`, `"Stop"` |
167
+ | `toolName` | `string \| undefined` | 호출되는 도구 (예: `"Bash"`, `"Write"`, `"Read"`) |
168
+ | `toolInput` | `Record<string, unknown> \| undefined` | 도구의 입력 파라미터 |
169
+ | `payload` | `Record<string, unknown>` | Claude Code에서 전달된 전체 원시 이벤트 페이로드 |
170
+ | `session` | `SessionMetadata \| undefined` | 세션 컨텍스트 (아래 참조) |
171
+
172
+ ### `SessionMetadata` 필드
173
+
174
+ | 필드 | 타입 | 설명 |
175
+ |-------|------|-------------|
176
+ | `sessionId` | `string` | Claude Code 세션 식별자 |
177
+ | `cwd` | `string` | Claude Code 세션의 작업 디렉터리 |
178
+ | `transcriptPath` | `string` | 세션의 JSONL 트랜스크립트 파일 경로 |
179
+
180
+ ### 이벤트 유형
181
+
182
+ | 이벤트 | 발생 시점 | `toolInput` 내용 |
183
+ |-------|--------------|----------------------|
184
+ | `PreToolUse` | Claude가 도구를 실행하기 전 | 도구의 입력 (예: Bash의 경우 `{ command: "..." }`) |
185
+ | `PostToolUse` | 도구 실행 완료 후 | 도구의 입력 + `tool_result` (출력값) |
186
+ | `Notification` | Claude가 알림을 보낼 때 | `{ message: "...", notification_type: "idle" \| "permission_prompt" \| ... }` - 훅은 항상 `allow()`를 반환해야 하며 알림을 차단할 수 없습니다 |
187
+ | `Stop` | Claude 세션 종료 시 | 비어 있음 |
188
+
189
+ ---
190
+
191
+ ## 평가 순서
192
+
193
+ 정책은 다음 순서로 평가됩니다:
194
+
195
+ 1. 내장 정책 (정의 순서대로)
196
+ 2. `customPoliciesPath`의 명시적 커스텀 정책 (`.add()` 호출 순서대로)
197
+ 3. 프로젝트 `.failproofai/policies/`의 컨벤션 정책 (파일은 알파벳 순, 파일 내에서는 `.add()` 순서)
198
+ 4. 사용자 `~/.failproofai/policies/`의 컨벤션 정책 (파일은 알파벳 순, 파일 내에서는 `.add()` 순서)
199
+
200
+ <Note>
201
+ 첫 번째 `deny`는 이후 모든 정책을 단락시킵니다. 모든 `instruct` 메시지는 누적되어 함께 전달됩니다.
202
+ </Note>
203
+
204
+ ---
205
+
206
+ ## 전이적 import
207
+
208
+ 커스텀 정책 파일은 상대 경로를 사용해 로컬 모듈을 import할 수 있습니다:
209
+
210
+ ```js
211
+ // my-policies.js
212
+ import { isBlockedPath } from "./utils.js";
213
+ import { checkApproval } from "./approval-client.js";
214
+
215
+ customPolicies.add({
216
+ name: "approval-gate",
217
+ fn: async (ctx) => {
218
+ if (ctx.toolName !== "Bash") return allow();
219
+ const approved = await checkApproval(ctx.toolInput?.command, ctx.session?.sessionId);
220
+ return approved ? allow() : deny("Approval required for this command");
221
+ },
222
+ });
223
+ ```
224
+
225
+ 엔트리 파일에서 도달 가능한 모든 상대 import가 처리됩니다. 이는 `from "failproofai"` import를 실제 dist 경로로 재작성하고, ESM 호환성을 보장하기 위해 임시 `.mjs` 파일을 생성하는 방식으로 구현됩니다.
226
+
227
+ ---
228
+
229
+ ## 이벤트 유형 필터링
230
+
231
+ `match.events`를 사용해 정책이 발동되는 시점을 제한하세요:
232
+
233
+ ```js
234
+ customPolicies.add({
235
+ name: "require-summary-on-stop",
236
+ match: { events: ["Stop"] },
237
+ fn: async (ctx) => {
238
+ // 세션이 종료될 때만 발동
239
+ // ctx.session.transcriptPath에 전체 세션 로그가 포함됨
240
+ return allow();
241
+ },
242
+ });
243
+ ```
244
+
245
+ `match`를 완전히 생략하면 모든 이벤트 유형에서 발동됩니다.
246
+
247
+ ---
248
+
249
+ ## 오류 처리 및 실패 모드
250
+
251
+ 커스텀 정책은 **fail-open** 방식입니다: 오류가 발생해도 내장 정책을 차단하거나 훅 핸들러를 중단시키지 않습니다.
252
+
253
+ | 실패 상황 | 동작 |
254
+ |---------|----------|
255
+ | `customPoliciesPath` 미설정 | 명시적 커스텀 정책이 실행되지 않음; 컨벤션 정책과 내장 정책은 정상 계속 |
256
+ | 파일을 찾을 수 없음 | `~/.failproofai/hook.log`에 경고 기록; 내장 정책은 계속 |
257
+ | 구문/import 오류 (명시적) | `~/.failproofai/hook.log`에 오류 기록; 명시적 커스텀 정책 건너뜀 |
258
+ | 구문/import 오류 (컨벤션) | 오류 기록; 해당 파일 건너뜀, 다른 컨벤션 파일은 계속 로드 |
259
+ | `fn` 런타임 예외 | 오류 기록; 해당 훅은 `allow`로 처리; 다른 훅은 계속 |
260
+ | `fn` 실행 10초 초과 | 타임아웃 기록; `allow`로 처리 |
261
+ | 컨벤션 디렉터리 없음 | 컨벤션 정책 실행 안 됨; 오류 없음 |
262
+
263
+ <Tip>
264
+ 커스텀 정책 오류를 디버깅하려면 로그 파일을 모니터링하세요:
265
+
266
+ ```bash
267
+ tail -f ~/.failproofai/hook.log
268
+ ```
269
+ </Tip>
270
+
271
+ ---
272
+
273
+ ## 전체 예제: 다중 정책
274
+
275
+ ```js
276
+ // my-policies.js
277
+ import { customPolicies, allow, deny, instruct } from "failproofai";
278
+
279
+ // 에이전트가 secrets/ 디렉터리에 쓰는 것을 방지
280
+ customPolicies.add({
281
+ name: "block-secrets-dir",
282
+ description: "Prevent agent from writing to secrets/ directory",
283
+ match: { events: ["PreToolUse"] },
284
+ fn: async (ctx) => {
285
+ if (!["Write", "Edit"].includes(ctx.toolName ?? "")) return allow();
286
+ const path = ctx.toolInput?.file_path ?? "";
287
+ if (path.includes("secrets/")) return deny("Writing to secrets/ is not permitted");
288
+ return allow();
289
+ },
290
+ });
291
+
292
+ // 에이전트가 올바른 방향 유지: 커밋 전 테스트 확인
293
+ customPolicies.add({
294
+ name: "remind-test-before-commit",
295
+ description: "Keep the agent on track: verify tests pass before committing",
296
+ match: { events: ["PreToolUse"] },
297
+ fn: async (ctx) => {
298
+ if (ctx.toolName !== "Bash") return allow();
299
+ const cmd = ctx.toolInput?.command ?? "";
300
+ if (/git\s+commit/.test(cmd)) {
301
+ return instruct("Verify all tests pass before committing. Run `bun test` if you haven't already.");
302
+ }
303
+ return allow();
304
+ },
305
+ });
306
+
307
+ // 프리즈 기간 중 계획되지 않은 의존성 변경 방지
308
+ customPolicies.add({
309
+ name: "dependency-freeze",
310
+ description: "Prevent unplanned dependency changes during freeze period",
311
+ match: { events: ["PreToolUse"] },
312
+ fn: async (ctx) => {
313
+ if (ctx.toolName !== "Bash") return allow();
314
+ const cmd = ctx.toolInput?.command ?? "";
315
+ const isInstall = /^(npm install|yarn add|bun add|pnpm add)\s+\S/.test(cmd);
316
+ if (isInstall && process.env.DEPENDENCY_FREEZE === "1") {
317
+ return deny("Package installs are frozen. Unset DEPENDENCY_FREEZE to allow.");
318
+ }
319
+ return allow();
320
+ },
321
+ });
322
+
323
+ export { customPolicies };
324
+ ```
325
+
326
+ ---
327
+
328
+ ## 예제 파일
329
+
330
+ `examples/` 디렉터리에는 바로 실행 가능한 정책 파일이 포함되어 있습니다:
331
+
332
+ | 파일 | 내용 |
333
+ |------|----------|
334
+ | `examples/policies-basic.js` | 일반적인 에이전트 실패 모드를 다루는 5가지 기본 정책 |
335
+ | `examples/policies-advanced/index.js` | 고급 패턴: 전이적 import, 비동기 호출, 출력 스크러빙, 세션 종료 훅 |
336
+ | `examples/convention-policies/security-policies.mjs` | 컨벤션 기반 보안 정책 (.env 쓰기 차단, git 히스토리 재작성 방지) |
337
+ | `examples/convention-policies/workflow-policies.mjs` | 컨벤션 기반 워크플로우 정책 (테스트 알림, 감사 파일 쓰기) |
338
+
339
+ ### 명시적 파일 예제 사용하기
340
+
341
+ ```bash
342
+ failproofai policies --install --custom ./examples/policies-basic.js
343
+ ```
344
+
345
+ ### 컨벤션 기반 예제 사용하기
346
+
347
+ ```bash
348
+ # 프로젝트 레벨로 복사
349
+ mkdir -p .failproofai/policies
350
+ cp examples/convention-policies/*.mjs .failproofai/policies/
351
+
352
+ # 또는 사용자 레벨로 복사
353
+ mkdir -p ~/.failproofai/policies
354
+ cp examples/convention-policies/*.mjs ~/.failproofai/policies/
355
+ ```
356
+
357
+ 설치 명령이 필요하지 않습니다 — 다음 훅 이벤트 시 파일이 자동으로 인식됩니다.