@plures/praxis 0.2.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/README.md +188 -61
  2. package/core/codegen/docs-generator.ts +808 -0
  3. package/core/codegen/index.ts +27 -0
  4. package/core/codegen/ts-generator.ts +15 -0
  5. package/core/db-adapter/index.ts +52 -0
  6. package/core/db-adapter/sync-engine.ts +450 -0
  7. package/core/logic-engine/engine.ts +12 -0
  8. package/core/logic-engine/index.ts +16 -0
  9. package/core/logic-engine/protocol.ts +16 -0
  10. package/core/logic-engine/psf-adapter.ts +269 -0
  11. package/core/logic-engine/rules.ts +16 -0
  12. package/core/schema-engine/compiler.ts +431 -0
  13. package/core/schema-engine/generator.ts +635 -0
  14. package/core/schema-engine/index.ts +18 -0
  15. package/core/schema-engine/psf.ts +664 -0
  16. package/core/schema-engine/types.ts +63 -0
  17. package/core/schema-engine/validator.ts +541 -0
  18. package/dist/core/codegen/docs-generator.d.ts +123 -0
  19. package/dist/core/codegen/docs-generator.d.ts.map +1 -0
  20. package/dist/core/codegen/docs-generator.js +674 -0
  21. package/dist/core/codegen/docs-generator.js.map +1 -0
  22. package/dist/core/codegen/index.d.ts +11 -0
  23. package/dist/core/codegen/index.d.ts.map +1 -0
  24. package/dist/core/codegen/index.js +13 -0
  25. package/dist/core/codegen/index.js.map +1 -0
  26. package/dist/core/codegen/ts-generator.d.ts +8 -0
  27. package/dist/core/codegen/ts-generator.d.ts.map +1 -0
  28. package/dist/core/codegen/ts-generator.js +8 -0
  29. package/dist/core/codegen/ts-generator.js.map +1 -0
  30. package/dist/core/db-adapter/index.d.ts +18 -0
  31. package/dist/core/db-adapter/index.d.ts.map +1 -0
  32. package/dist/core/db-adapter/index.js +23 -0
  33. package/dist/core/db-adapter/index.js.map +1 -0
  34. package/dist/core/db-adapter/sync-engine.d.ts +180 -0
  35. package/dist/core/db-adapter/sync-engine.d.ts.map +1 -0
  36. package/dist/core/db-adapter/sync-engine.js +342 -0
  37. package/dist/core/db-adapter/sync-engine.js.map +1 -0
  38. package/dist/core/logic-engine/engine.d.ts +8 -0
  39. package/dist/core/logic-engine/engine.d.ts.map +1 -0
  40. package/dist/core/logic-engine/engine.js +8 -0
  41. package/dist/core/logic-engine/engine.js.map +1 -0
  42. package/dist/core/logic-engine/index.d.ts +16 -0
  43. package/dist/core/logic-engine/index.d.ts.map +1 -0
  44. package/dist/core/logic-engine/index.js +16 -0
  45. package/dist/core/logic-engine/index.js.map +1 -0
  46. package/dist/core/logic-engine/protocol.d.ts +7 -0
  47. package/dist/core/logic-engine/protocol.d.ts.map +1 -0
  48. package/dist/core/logic-engine/protocol.js +7 -0
  49. package/dist/core/logic-engine/protocol.js.map +1 -0
  50. package/dist/core/logic-engine/psf-adapter.d.ts +88 -0
  51. package/dist/core/logic-engine/psf-adapter.d.ts.map +1 -0
  52. package/dist/core/logic-engine/psf-adapter.js +207 -0
  53. package/dist/core/logic-engine/psf-adapter.js.map +1 -0
  54. package/dist/core/logic-engine/rules.d.ts +7 -0
  55. package/dist/core/logic-engine/rules.d.ts.map +1 -0
  56. package/dist/core/logic-engine/rules.js +7 -0
  57. package/dist/core/logic-engine/rules.js.map +1 -0
  58. package/dist/core/schema-engine/compiler.d.ts +198 -0
  59. package/dist/core/schema-engine/compiler.d.ts.map +1 -0
  60. package/dist/core/schema-engine/compiler.js +262 -0
  61. package/dist/core/schema-engine/compiler.js.map +1 -0
  62. package/dist/core/schema-engine/generator.d.ts +115 -0
  63. package/dist/core/schema-engine/generator.d.ts.map +1 -0
  64. package/dist/core/schema-engine/generator.js +506 -0
  65. package/dist/core/schema-engine/generator.js.map +1 -0
  66. package/dist/core/schema-engine/index.d.ts +18 -0
  67. package/dist/core/schema-engine/index.d.ts.map +1 -0
  68. package/dist/core/schema-engine/index.js +18 -0
  69. package/dist/core/schema-engine/index.js.map +1 -0
  70. package/dist/core/schema-engine/psf.d.ts +612 -0
  71. package/dist/core/schema-engine/psf.d.ts.map +1 -0
  72. package/dist/core/schema-engine/psf.js +45 -0
  73. package/dist/core/schema-engine/psf.js.map +1 -0
  74. package/dist/core/schema-engine/types.d.ts +10 -0
  75. package/dist/core/schema-engine/types.d.ts.map +1 -0
  76. package/dist/core/schema-engine/types.js +7 -0
  77. package/dist/core/schema-engine/types.js.map +1 -0
  78. package/dist/core/schema-engine/validator.d.ts +140 -0
  79. package/dist/core/schema-engine/validator.d.ts.map +1 -0
  80. package/dist/core/schema-engine/validator.js +407 -0
  81. package/dist/core/schema-engine/validator.js.map +1 -0
  82. package/dist/src/adapters/cli.d.ts.map +1 -0
  83. package/dist/src/adapters/cli.js.map +1 -0
  84. package/dist/src/cli/commands/auth.d.ts.map +1 -0
  85. package/dist/src/cli/commands/auth.js.map +1 -0
  86. package/dist/src/cli/commands/build.d.ts +23 -0
  87. package/dist/src/cli/commands/build.d.ts.map +1 -0
  88. package/dist/src/cli/commands/build.js +162 -0
  89. package/dist/src/cli/commands/build.js.map +1 -0
  90. package/dist/src/cli/commands/canvas.d.ts +23 -0
  91. package/dist/src/cli/commands/canvas.d.ts.map +1 -0
  92. package/dist/src/cli/commands/canvas.js +215 -0
  93. package/dist/src/cli/commands/canvas.js.map +1 -0
  94. package/dist/src/cli/commands/cloud.d.ts.map +1 -0
  95. package/dist/src/cli/commands/cloud.js.map +1 -0
  96. package/dist/src/cli/commands/create.d.ts +21 -0
  97. package/dist/src/cli/commands/create.d.ts.map +1 -0
  98. package/dist/src/cli/commands/create.js +621 -0
  99. package/dist/src/cli/commands/create.js.map +1 -0
  100. package/dist/src/cli/commands/dev.d.ts +21 -0
  101. package/dist/src/cli/commands/dev.d.ts.map +1 -0
  102. package/dist/src/cli/commands/dev.js +71 -0
  103. package/dist/src/cli/commands/dev.js.map +1 -0
  104. package/dist/src/cli/commands/generate.d.ts.map +1 -0
  105. package/dist/src/cli/commands/generate.js.map +1 -0
  106. package/dist/src/cli/commands/orchestrate.d.ts +44 -0
  107. package/dist/src/cli/commands/orchestrate.d.ts.map +1 -0
  108. package/dist/src/cli/commands/orchestrate.js +150 -0
  109. package/dist/src/cli/commands/orchestrate.js.map +1 -0
  110. package/dist/{cli → src/cli}/index.d.ts.map +1 -1
  111. package/dist/{cli → src/cli}/index.js +53 -21
  112. package/dist/src/cli/index.js.map +1 -0
  113. package/dist/src/cloud/auth.d.ts.map +1 -0
  114. package/dist/src/cloud/auth.js.map +1 -0
  115. package/dist/src/cloud/billing.d.ts.map +1 -0
  116. package/dist/src/cloud/billing.js.map +1 -0
  117. package/dist/src/cloud/client.d.ts.map +1 -0
  118. package/dist/src/cloud/client.js.map +1 -0
  119. package/dist/src/cloud/index.d.ts.map +1 -0
  120. package/dist/src/cloud/index.js.map +1 -0
  121. package/dist/src/cloud/marketplace.d.ts.map +1 -0
  122. package/dist/src/cloud/marketplace.js.map +1 -0
  123. package/dist/src/cloud/provisioning.d.ts.map +1 -0
  124. package/dist/src/cloud/provisioning.js.map +1 -0
  125. package/dist/src/cloud/relay/endpoints.d.ts.map +1 -0
  126. package/dist/src/cloud/relay/endpoints.js.map +1 -0
  127. package/dist/src/cloud/relay/health/index.d.ts.map +1 -0
  128. package/dist/src/cloud/relay/health/index.js.map +1 -0
  129. package/dist/src/cloud/relay/stats/index.d.ts.map +1 -0
  130. package/dist/src/cloud/relay/stats/index.js.map +1 -0
  131. package/dist/src/cloud/relay/sync/index.d.ts.map +1 -0
  132. package/dist/src/cloud/relay/sync/index.js.map +1 -0
  133. package/dist/src/cloud/relay/usage/index.d.ts.map +1 -0
  134. package/dist/src/cloud/relay/usage/index.js.map +1 -0
  135. package/dist/src/cloud/sponsors.d.ts.map +1 -0
  136. package/dist/src/cloud/sponsors.js.map +1 -0
  137. package/dist/src/cloud/types.d.ts.map +1 -0
  138. package/dist/src/cloud/types.js.map +1 -0
  139. package/dist/src/components/index.d.ts.map +1 -0
  140. package/dist/src/components/index.js.map +1 -0
  141. package/dist/src/core/actors.d.ts.map +1 -0
  142. package/dist/src/core/actors.js.map +1 -0
  143. package/dist/src/core/component/generator.d.ts.map +1 -0
  144. package/dist/{core → src/core}/component/generator.js +45 -3
  145. package/dist/src/core/component/generator.js.map +1 -0
  146. package/dist/src/core/engine.d.ts.map +1 -0
  147. package/dist/src/core/engine.js.map +1 -0
  148. package/dist/src/core/introspection.d.ts.map +1 -0
  149. package/dist/src/core/introspection.js.map +1 -0
  150. package/dist/src/core/logic/generator.d.ts.map +1 -0
  151. package/dist/{core → src/core}/logic/generator.js +35 -4
  152. package/dist/src/core/logic/generator.js.map +1 -0
  153. package/dist/src/core/pluresdb/adapter.d.ts +72 -0
  154. package/dist/src/core/pluresdb/adapter.d.ts.map +1 -0
  155. package/dist/src/core/pluresdb/adapter.js +73 -0
  156. package/dist/src/core/pluresdb/adapter.js.map +1 -0
  157. package/dist/src/core/pluresdb/generator.d.ts.map +1 -0
  158. package/dist/{core → src/core}/pluresdb/generator.js +33 -4
  159. package/dist/src/core/pluresdb/generator.js.map +1 -0
  160. package/dist/src/core/pluresdb/index.d.ts +15 -0
  161. package/dist/src/core/pluresdb/index.d.ts.map +1 -0
  162. package/dist/src/core/pluresdb/index.js +11 -0
  163. package/dist/src/core/pluresdb/index.js.map +1 -0
  164. package/dist/src/core/pluresdb/schema-registry.d.ts +104 -0
  165. package/dist/src/core/pluresdb/schema-registry.d.ts.map +1 -0
  166. package/dist/src/core/pluresdb/schema-registry.js +130 -0
  167. package/dist/src/core/pluresdb/schema-registry.js.map +1 -0
  168. package/dist/src/core/pluresdb/store.d.ts +199 -0
  169. package/dist/src/core/pluresdb/store.d.ts.map +1 -0
  170. package/dist/src/core/pluresdb/store.js +344 -0
  171. package/dist/src/core/pluresdb/store.js.map +1 -0
  172. package/dist/src/core/protocol.d.ts.map +1 -0
  173. package/dist/src/core/protocol.js.map +1 -0
  174. package/dist/src/core/rules.d.ts.map +1 -0
  175. package/dist/src/core/rules.js.map +1 -0
  176. package/dist/src/core/schema/loader.d.ts.map +1 -0
  177. package/dist/src/core/schema/loader.js.map +1 -0
  178. package/dist/src/core/schema/normalize.d.ts.map +1 -0
  179. package/dist/src/core/schema/normalize.js.map +1 -0
  180. package/dist/src/core/schema/types.d.ts.map +1 -0
  181. package/dist/src/core/schema/types.js.map +1 -0
  182. package/dist/src/dsl/index.d.ts.map +1 -0
  183. package/dist/src/dsl/index.js.map +1 -0
  184. package/dist/src/dsl.d.ts.map +1 -0
  185. package/dist/src/dsl.js.map +1 -0
  186. package/dist/src/examples/advanced-todo/index.d.ts.map +1 -0
  187. package/dist/src/examples/advanced-todo/index.js.map +1 -0
  188. package/dist/src/examples/auth-basic/index.d.ts.map +1 -0
  189. package/dist/src/examples/auth-basic/index.js.map +1 -0
  190. package/dist/src/examples/cart/index.d.ts.map +1 -0
  191. package/dist/src/examples/cart/index.js.map +1 -0
  192. package/dist/src/examples/hero-ecommerce/index.d.ts.map +1 -0
  193. package/dist/src/examples/hero-ecommerce/index.js.map +1 -0
  194. package/dist/src/examples/svelte-counter/index.d.ts.map +1 -0
  195. package/dist/src/examples/svelte-counter/index.js.map +1 -0
  196. package/dist/src/flows.d.ts.map +1 -0
  197. package/dist/src/flows.js.map +1 -0
  198. package/dist/{index.d.ts → src/index.d.ts} +12 -2
  199. package/dist/src/index.d.ts.map +1 -0
  200. package/dist/{index.js → src/index.js} +6 -1
  201. package/dist/src/index.js.map +1 -0
  202. package/dist/src/integrations/code-canvas.d.ts +265 -0
  203. package/dist/src/integrations/code-canvas.d.ts.map +1 -0
  204. package/dist/src/integrations/code-canvas.js +451 -0
  205. package/dist/src/integrations/code-canvas.js.map +1 -0
  206. package/dist/src/integrations/pluresdb.d.ts +117 -0
  207. package/dist/src/integrations/pluresdb.d.ts.map +1 -0
  208. package/dist/src/integrations/pluresdb.js +117 -0
  209. package/dist/src/integrations/pluresdb.js.map +1 -0
  210. package/dist/src/integrations/state-docs.d.ts +191 -0
  211. package/dist/src/integrations/state-docs.d.ts.map +1 -0
  212. package/dist/src/integrations/state-docs.js +515 -0
  213. package/dist/src/integrations/state-docs.js.map +1 -0
  214. package/dist/src/integrations/svelte.d.ts.map +1 -0
  215. package/dist/src/integrations/svelte.js.map +1 -0
  216. package/dist/src/integrations/tauri.d.ts +360 -0
  217. package/dist/src/integrations/tauri.d.ts.map +1 -0
  218. package/dist/src/integrations/tauri.js +278 -0
  219. package/dist/src/integrations/tauri.js.map +1 -0
  220. package/dist/src/integrations/unum.d.ts +159 -0
  221. package/dist/src/integrations/unum.d.ts.map +1 -0
  222. package/dist/src/integrations/unum.js +240 -0
  223. package/dist/src/integrations/unum.js.map +1 -0
  224. package/dist/src/registry.d.ts.map +1 -0
  225. package/dist/src/registry.js.map +1 -0
  226. package/dist/{runtime → src/runtime}/terminal-adapter.d.ts +58 -7
  227. package/dist/src/runtime/terminal-adapter.d.ts.map +1 -0
  228. package/dist/src/runtime/terminal-adapter.js +237 -0
  229. package/dist/src/runtime/terminal-adapter.js.map +1 -0
  230. package/dist/src/step.d.ts.map +1 -0
  231. package/dist/src/step.js.map +1 -0
  232. package/dist/src/types.d.ts.map +1 -0
  233. package/dist/{cloud → src}/types.js.map +1 -1
  234. package/dist/tools/cli/commands/index.d.ts +7 -0
  235. package/dist/tools/cli/commands/index.d.ts.map +1 -0
  236. package/dist/tools/cli/commands/index.js +7 -0
  237. package/dist/tools/cli/commands/index.js.map +1 -0
  238. package/dist/tools/cli/index.d.ts +8 -0
  239. package/dist/tools/cli/index.d.ts.map +1 -0
  240. package/dist/tools/cli/index.js +9 -0
  241. package/dist/tools/cli/index.js.map +1 -0
  242. package/dist/tools/watcher/index.d.ts +105 -0
  243. package/dist/tools/watcher/index.d.ts.map +1 -0
  244. package/dist/tools/watcher/index.js +213 -0
  245. package/dist/tools/watcher/index.js.map +1 -0
  246. package/dist/ui/canvas/canvas-projection.d.ts +78 -0
  247. package/dist/ui/canvas/canvas-projection.d.ts.map +1 -0
  248. package/dist/ui/canvas/canvas-projection.js +416 -0
  249. package/dist/ui/canvas/canvas-projection.js.map +1 -0
  250. package/dist/ui/canvas/canvas-state.d.ts +200 -0
  251. package/dist/ui/canvas/canvas-state.d.ts.map +1 -0
  252. package/dist/ui/canvas/canvas-state.js +464 -0
  253. package/dist/ui/canvas/canvas-state.js.map +1 -0
  254. package/dist/ui/canvas/components/index.d.ts +95 -0
  255. package/dist/ui/canvas/components/index.d.ts.map +1 -0
  256. package/dist/ui/canvas/components/index.js +19 -0
  257. package/dist/ui/canvas/components/index.js.map +1 -0
  258. package/dist/ui/canvas/index.d.ts +32 -0
  259. package/dist/ui/canvas/index.d.ts.map +1 -0
  260. package/dist/ui/canvas/index.js +32 -0
  261. package/dist/ui/canvas/index.js.map +1 -0
  262. package/dist/ui/svelte-generator/index.d.ts +9 -0
  263. package/dist/ui/svelte-generator/index.d.ts.map +1 -0
  264. package/dist/ui/svelte-generator/index.js +11 -0
  265. package/dist/ui/svelte-generator/index.js.map +1 -0
  266. package/dist/ui/svelte-generator/psf-generator.d.ts +128 -0
  267. package/dist/ui/svelte-generator/psf-generator.d.ts.map +1 -0
  268. package/dist/ui/svelte-generator/psf-generator.js +506 -0
  269. package/dist/ui/svelte-generator/psf-generator.js.map +1 -0
  270. package/docs/README.md +155 -0
  271. package/docs/core/building-extensions.md +553 -0
  272. package/docs/core/cli-usage.md +498 -0
  273. package/docs/core/code-canvas-sync.md +468 -0
  274. package/docs/core/logic-engine.md +566 -0
  275. package/docs/core/pluresdb-integration.md +646 -0
  276. package/docs/core/schema-model.md +414 -0
  277. package/docs/core/ui-generation.md +580 -0
  278. package/docs/core/what-is-praxis.md +240 -0
  279. package/docs/tutorials/README.md +84 -0
  280. package/docs/tutorials/ecommerce-cart.md +631 -0
  281. package/docs/tutorials/first-app.md +529 -0
  282. package/docs/tutorials/form-builder.md +620 -0
  283. package/docs/tutorials/todo-pluresdb.md +589 -0
  284. package/package.json +1 -1
  285. package/src/__tests__/canvas-components.test.ts +450 -0
  286. package/src/__tests__/cli-create.test.ts +178 -0
  287. package/src/__tests__/code-canvas-integration.test.ts +277 -0
  288. package/src/__tests__/docs-generator.test.ts +181 -0
  289. package/src/__tests__/generators.test.ts +3 -2
  290. package/src/__tests__/pluresdb.test.ts +457 -0
  291. package/src/__tests__/psf-schema-engine.test.ts +450 -0
  292. package/src/__tests__/state-docs-integration.test.ts +297 -0
  293. package/src/__tests__/tauri-integration.test.ts +298 -0
  294. package/src/__tests__/terminal-node.test.ts +1 -1
  295. package/src/__tests__/unum-integration.test.ts +142 -0
  296. package/src/cli/commands/build.ts +203 -0
  297. package/src/cli/commands/canvas.ts +246 -0
  298. package/src/cli/commands/create.ts +666 -0
  299. package/src/cli/commands/dev.ts +95 -0
  300. package/src/cli/commands/orchestrate.ts +212 -0
  301. package/src/cli/index.ts +48 -21
  302. package/src/core/component/generator.ts +45 -3
  303. package/src/core/logic/generator.ts +39 -4
  304. package/src/core/pluresdb/adapter.ts +117 -0
  305. package/src/core/pluresdb/generator.ts +33 -4
  306. package/src/core/pluresdb/index.ts +37 -0
  307. package/src/core/pluresdb/schema-registry.ts +162 -0
  308. package/src/core/pluresdb/store.ts +443 -0
  309. package/src/index.ts +109 -0
  310. package/src/integrations/code-canvas.ts +717 -0
  311. package/src/integrations/pluresdb.ts +140 -29
  312. package/src/integrations/state-docs.ts +710 -0
  313. package/src/integrations/tauri.ts +638 -0
  314. package/src/integrations/unum.ts +395 -0
  315. package/src/runtime/terminal-adapter.ts +178 -23
  316. package/dist/adapters/cli.d.ts.map +0 -1
  317. package/dist/adapters/cli.js.map +0 -1
  318. package/dist/cli/commands/auth.d.ts.map +0 -1
  319. package/dist/cli/commands/auth.js.map +0 -1
  320. package/dist/cli/commands/cloud.d.ts.map +0 -1
  321. package/dist/cli/commands/cloud.js.map +0 -1
  322. package/dist/cli/commands/generate.d.ts.map +0 -1
  323. package/dist/cli/commands/generate.js.map +0 -1
  324. package/dist/cli/index.js.map +0 -1
  325. package/dist/cloud/auth.d.ts.map +0 -1
  326. package/dist/cloud/auth.js.map +0 -1
  327. package/dist/cloud/billing.d.ts.map +0 -1
  328. package/dist/cloud/billing.js.map +0 -1
  329. package/dist/cloud/client.d.ts.map +0 -1
  330. package/dist/cloud/client.js.map +0 -1
  331. package/dist/cloud/index.d.ts.map +0 -1
  332. package/dist/cloud/index.js.map +0 -1
  333. package/dist/cloud/marketplace.d.ts.map +0 -1
  334. package/dist/cloud/marketplace.js.map +0 -1
  335. package/dist/cloud/provisioning.d.ts.map +0 -1
  336. package/dist/cloud/provisioning.js.map +0 -1
  337. package/dist/cloud/relay/endpoints.d.ts.map +0 -1
  338. package/dist/cloud/relay/endpoints.js.map +0 -1
  339. package/dist/cloud/relay/health/index.d.ts.map +0 -1
  340. package/dist/cloud/relay/health/index.js.map +0 -1
  341. package/dist/cloud/relay/stats/index.d.ts.map +0 -1
  342. package/dist/cloud/relay/stats/index.js.map +0 -1
  343. package/dist/cloud/relay/sync/index.d.ts.map +0 -1
  344. package/dist/cloud/relay/sync/index.js.map +0 -1
  345. package/dist/cloud/relay/usage/index.d.ts.map +0 -1
  346. package/dist/cloud/relay/usage/index.js.map +0 -1
  347. package/dist/cloud/sponsors.d.ts.map +0 -1
  348. package/dist/cloud/sponsors.js.map +0 -1
  349. package/dist/cloud/types.d.ts.map +0 -1
  350. package/dist/components/index.d.ts.map +0 -1
  351. package/dist/components/index.js.map +0 -1
  352. package/dist/core/actors.d.ts.map +0 -1
  353. package/dist/core/actors.js.map +0 -1
  354. package/dist/core/component/generator.d.ts.map +0 -1
  355. package/dist/core/component/generator.js.map +0 -1
  356. package/dist/core/engine.d.ts.map +0 -1
  357. package/dist/core/engine.js.map +0 -1
  358. package/dist/core/introspection.d.ts.map +0 -1
  359. package/dist/core/introspection.js.map +0 -1
  360. package/dist/core/logic/generator.d.ts.map +0 -1
  361. package/dist/core/logic/generator.js.map +0 -1
  362. package/dist/core/pluresdb/generator.d.ts.map +0 -1
  363. package/dist/core/pluresdb/generator.js.map +0 -1
  364. package/dist/core/protocol.d.ts.map +0 -1
  365. package/dist/core/protocol.js.map +0 -1
  366. package/dist/core/rules.d.ts.map +0 -1
  367. package/dist/core/rules.js.map +0 -1
  368. package/dist/core/schema/loader.d.ts.map +0 -1
  369. package/dist/core/schema/loader.js.map +0 -1
  370. package/dist/core/schema/normalize.d.ts.map +0 -1
  371. package/dist/core/schema/normalize.js.map +0 -1
  372. package/dist/core/schema/types.d.ts.map +0 -1
  373. package/dist/core/schema/types.js.map +0 -1
  374. package/dist/dsl/index.d.ts.map +0 -1
  375. package/dist/dsl/index.js.map +0 -1
  376. package/dist/dsl.d.ts.map +0 -1
  377. package/dist/dsl.js.map +0 -1
  378. package/dist/examples/advanced-todo/index.d.ts.map +0 -1
  379. package/dist/examples/advanced-todo/index.js.map +0 -1
  380. package/dist/examples/auth-basic/index.d.ts.map +0 -1
  381. package/dist/examples/auth-basic/index.js.map +0 -1
  382. package/dist/examples/cart/index.d.ts.map +0 -1
  383. package/dist/examples/cart/index.js.map +0 -1
  384. package/dist/examples/hero-ecommerce/index.d.ts.map +0 -1
  385. package/dist/examples/hero-ecommerce/index.js.map +0 -1
  386. package/dist/examples/svelte-counter/index.d.ts.map +0 -1
  387. package/dist/examples/svelte-counter/index.js.map +0 -1
  388. package/dist/flows.d.ts.map +0 -1
  389. package/dist/flows.js.map +0 -1
  390. package/dist/index.d.ts.map +0 -1
  391. package/dist/index.js.map +0 -1
  392. package/dist/integrations/pluresdb.d.ts +0 -56
  393. package/dist/integrations/pluresdb.d.ts.map +0 -1
  394. package/dist/integrations/pluresdb.js +0 -46
  395. package/dist/integrations/pluresdb.js.map +0 -1
  396. package/dist/integrations/svelte.d.ts.map +0 -1
  397. package/dist/integrations/svelte.js.map +0 -1
  398. package/dist/registry.d.ts.map +0 -1
  399. package/dist/registry.js.map +0 -1
  400. package/dist/runtime/terminal-adapter.d.ts.map +0 -1
  401. package/dist/runtime/terminal-adapter.js +0 -113
  402. package/dist/runtime/terminal-adapter.js.map +0 -1
  403. package/dist/step.d.ts.map +0 -1
  404. package/dist/step.js.map +0 -1
  405. package/dist/types.d.ts.map +0 -1
  406. package/dist/types.js.map +0 -1
  407. /package/dist/{adapters → src/adapters}/cli.d.ts +0 -0
  408. /package/dist/{adapters → src/adapters}/cli.js +0 -0
  409. /package/dist/{cli → src/cli}/commands/auth.d.ts +0 -0
  410. /package/dist/{cli → src/cli}/commands/auth.js +0 -0
  411. /package/dist/{cli → src/cli}/commands/cloud.d.ts +0 -0
  412. /package/dist/{cli → src/cli}/commands/cloud.js +0 -0
  413. /package/dist/{cli → src/cli}/commands/generate.d.ts +0 -0
  414. /package/dist/{cli → src/cli}/commands/generate.js +0 -0
  415. /package/dist/{cli → src/cli}/index.d.ts +0 -0
  416. /package/dist/{cloud → src/cloud}/auth.d.ts +0 -0
  417. /package/dist/{cloud → src/cloud}/auth.js +0 -0
  418. /package/dist/{cloud → src/cloud}/billing.d.ts +0 -0
  419. /package/dist/{cloud → src/cloud}/billing.js +0 -0
  420. /package/dist/{cloud → src/cloud}/client.d.ts +0 -0
  421. /package/dist/{cloud → src/cloud}/client.js +0 -0
  422. /package/dist/{cloud → src/cloud}/index.d.ts +0 -0
  423. /package/dist/{cloud → src/cloud}/index.js +0 -0
  424. /package/dist/{cloud → src/cloud}/marketplace.d.ts +0 -0
  425. /package/dist/{cloud → src/cloud}/marketplace.js +0 -0
  426. /package/dist/{cloud → src/cloud}/provisioning.d.ts +0 -0
  427. /package/dist/{cloud → src/cloud}/provisioning.js +0 -0
  428. /package/dist/{cloud → src/cloud}/relay/endpoints.d.ts +0 -0
  429. /package/dist/{cloud → src/cloud}/relay/endpoints.js +0 -0
  430. /package/dist/{cloud → src/cloud}/relay/health/index.d.ts +0 -0
  431. /package/dist/{cloud → src/cloud}/relay/health/index.js +0 -0
  432. /package/dist/{cloud → src/cloud}/relay/stats/index.d.ts +0 -0
  433. /package/dist/{cloud → src/cloud}/relay/stats/index.js +0 -0
  434. /package/dist/{cloud → src/cloud}/relay/sync/index.d.ts +0 -0
  435. /package/dist/{cloud → src/cloud}/relay/sync/index.js +0 -0
  436. /package/dist/{cloud → src/cloud}/relay/usage/index.d.ts +0 -0
  437. /package/dist/{cloud → src/cloud}/relay/usage/index.js +0 -0
  438. /package/dist/{cloud → src/cloud}/sponsors.d.ts +0 -0
  439. /package/dist/{cloud → src/cloud}/sponsors.js +0 -0
  440. /package/dist/{cloud → src/cloud}/types.d.ts +0 -0
  441. /package/dist/{cloud → src/cloud}/types.js +0 -0
  442. /package/dist/{components → src/components}/index.d.ts +0 -0
  443. /package/dist/{components → src/components}/index.js +0 -0
  444. /package/dist/{core → src/core}/actors.d.ts +0 -0
  445. /package/dist/{core → src/core}/actors.js +0 -0
  446. /package/dist/{core → src/core}/component/generator.d.ts +0 -0
  447. /package/dist/{core → src/core}/engine.d.ts +0 -0
  448. /package/dist/{core → src/core}/engine.js +0 -0
  449. /package/dist/{core → src/core}/introspection.d.ts +0 -0
  450. /package/dist/{core → src/core}/introspection.js +0 -0
  451. /package/dist/{core → src/core}/logic/generator.d.ts +0 -0
  452. /package/dist/{core → src/core}/pluresdb/generator.d.ts +0 -0
  453. /package/dist/{core → src/core}/protocol.d.ts +0 -0
  454. /package/dist/{core → src/core}/protocol.js +0 -0
  455. /package/dist/{core → src/core}/rules.d.ts +0 -0
  456. /package/dist/{core → src/core}/rules.js +0 -0
  457. /package/dist/{core → src/core}/schema/loader.d.ts +0 -0
  458. /package/dist/{core → src/core}/schema/loader.js +0 -0
  459. /package/dist/{core → src/core}/schema/normalize.d.ts +0 -0
  460. /package/dist/{core → src/core}/schema/normalize.js +0 -0
  461. /package/dist/{core → src/core}/schema/types.d.ts +0 -0
  462. /package/dist/{core → src/core}/schema/types.js +0 -0
  463. /package/dist/{dsl → src/dsl}/index.d.ts +0 -0
  464. /package/dist/{dsl → src/dsl}/index.js +0 -0
  465. /package/dist/{dsl.d.ts → src/dsl.d.ts} +0 -0
  466. /package/dist/{dsl.js → src/dsl.js} +0 -0
  467. /package/dist/{examples → src/examples}/advanced-todo/index.d.ts +0 -0
  468. /package/dist/{examples → src/examples}/advanced-todo/index.js +0 -0
  469. /package/dist/{examples → src/examples}/auth-basic/index.d.ts +0 -0
  470. /package/dist/{examples → src/examples}/auth-basic/index.js +0 -0
  471. /package/dist/{examples → src/examples}/cart/index.d.ts +0 -0
  472. /package/dist/{examples → src/examples}/cart/index.js +0 -0
  473. /package/dist/{examples → src/examples}/hero-ecommerce/index.d.ts +0 -0
  474. /package/dist/{examples → src/examples}/hero-ecommerce/index.js +0 -0
  475. /package/dist/{examples → src/examples}/svelte-counter/index.d.ts +0 -0
  476. /package/dist/{examples → src/examples}/svelte-counter/index.js +0 -0
  477. /package/dist/{flows.d.ts → src/flows.d.ts} +0 -0
  478. /package/dist/{flows.js → src/flows.js} +0 -0
  479. /package/dist/{integrations → src/integrations}/svelte.d.ts +0 -0
  480. /package/dist/{integrations → src/integrations}/svelte.js +0 -0
  481. /package/dist/{registry.d.ts → src/registry.d.ts} +0 -0
  482. /package/dist/{registry.js → src/registry.js} +0 -0
  483. /package/dist/{step.d.ts → src/step.d.ts} +0 -0
  484. /package/dist/{step.js → src/step.js} +0 -0
  485. /package/dist/{types.d.ts → src/types.d.ts} +0 -0
  486. /package/dist/{types.js → src/types.js} +0 -0
@@ -0,0 +1,553 @@
1
+ # Building Extensions
2
+
3
+ Praxis is designed to be extensible. This guide explains how to create plugins, custom generators, and integrations for the Praxis framework.
4
+
5
+ ## Extension Types
6
+
7
+ | Type | Description | Use Case |
8
+ |------|-------------|----------|
9
+ | **Plugins** | Extend engine behavior | Add middleware, effects, logging |
10
+ | **Generators** | Custom code generation | Generate for other frameworks |
11
+ | **Adapters** | External integrations | Connect to databases, APIs |
12
+ | **Templates** | Custom project scaffolding | Organization-specific setups |
13
+ | **Canvas Extensions** | Extend visual editor | Custom components, tools |
14
+
15
+ ## Plugins
16
+
17
+ ### Creating a Plugin
18
+
19
+ Plugins can hook into the engine lifecycle:
20
+
21
+ ```typescript
22
+ import type { PraxisPlugin, PraxisState, PraxisEvent } from '@plures/praxis';
23
+
24
+ interface LoggerOptions {
25
+ level: 'debug' | 'info' | 'warn' | 'error';
26
+ prefix?: string;
27
+ }
28
+
29
+ export function createLoggerPlugin(options: LoggerOptions): PraxisPlugin {
30
+ return {
31
+ name: 'logger',
32
+
33
+ // Called when engine is created
34
+ onInit(engine) {
35
+ console.log(`${options.prefix || ''} Engine initialized`);
36
+ },
37
+
38
+ // Called before each step
39
+ beforeStep(state, events) {
40
+ if (options.level === 'debug') {
41
+ console.log('Events:', events);
42
+ }
43
+ return { state, events }; // Can modify
44
+ },
45
+
46
+ // Called after each step
47
+ afterStep(result) {
48
+ if (options.level === 'debug') {
49
+ console.log('Facts:', result.state.facts);
50
+ }
51
+ return result; // Can modify
52
+ },
53
+
54
+ // Called on error
55
+ onError(error, state, events) {
56
+ console.error(`${options.prefix || ''} Error:`, error);
57
+ },
58
+ };
59
+ }
60
+ ```
61
+
62
+ ### Using Plugins
63
+
64
+ ```typescript
65
+ import { createPraxisEngine, PraxisRegistry } from '@plures/praxis';
66
+ import { createLoggerPlugin } from './plugins/logger';
67
+ import { createPersistPlugin } from './plugins/persist';
68
+
69
+ const engine = createPraxisEngine({
70
+ initialContext: { count: 0 },
71
+ registry: new PraxisRegistry(),
72
+ plugins: [
73
+ createLoggerPlugin({ level: 'debug', prefix: '[MyApp]' }),
74
+ createPersistPlugin({ storage: 'localStorage', key: 'app-state' }),
75
+ ],
76
+ });
77
+ ```
78
+
79
+ ### Plugin API
80
+
81
+ ```typescript
82
+ interface PraxisPlugin<TContext = any> {
83
+ name: string;
84
+
85
+ // Lifecycle hooks
86
+ onInit?(engine: PraxisEngine<TContext>): void;
87
+ onDestroy?(): void;
88
+
89
+ // Step hooks
90
+ beforeStep?(
91
+ state: PraxisState<TContext>,
92
+ events: PraxisEvent[]
93
+ ): { state: PraxisState<TContext>; events: PraxisEvent[] };
94
+
95
+ afterStep?(result: StepResult<TContext>): StepResult<TContext>;
96
+
97
+ // Error handling
98
+ onError?(
99
+ error: Error,
100
+ state: PraxisState<TContext>,
101
+ events: PraxisEvent[]
102
+ ): void;
103
+
104
+ // Subscription
105
+ onStateChange?(state: PraxisState<TContext>): void;
106
+ }
107
+ ```
108
+
109
+ ## Custom Generators
110
+
111
+ ### Creating a Generator
112
+
113
+ Generators transform PSF schemas into code:
114
+
115
+ ```typescript
116
+ import type { PSFSchema, Generator, GeneratorOutput } from '@plures/praxis/codegen';
117
+
118
+ interface ReactGeneratorOptions {
119
+ typescript: boolean;
120
+ styling: 'css' | 'styled-components' | 'tailwind';
121
+ }
122
+
123
+ export const reactGenerator: Generator<ReactGeneratorOptions> = {
124
+ name: 'react',
125
+ description: 'Generate React components from PSF schema',
126
+
127
+ generate(schema: PSFSchema, options: ReactGeneratorOptions): GeneratorOutput[] {
128
+ const outputs: GeneratorOutput[] = [];
129
+
130
+ // Generate components
131
+ for (const component of schema.components) {
132
+ const code = generateReactComponent(component, options);
133
+ outputs.push({
134
+ path: `components/${component.name}.${options.typescript ? 'tsx' : 'jsx'}`,
135
+ content: code,
136
+ type: 'component',
137
+ });
138
+ }
139
+
140
+ // Generate types (TypeScript only)
141
+ if (options.typescript) {
142
+ const types = generateTypes(schema);
143
+ outputs.push({
144
+ path: 'types.ts',
145
+ content: types,
146
+ type: 'types',
147
+ });
148
+ }
149
+
150
+ return outputs;
151
+ },
152
+ };
153
+
154
+ function generateReactComponent(component: ComponentDef, options: ReactGeneratorOptions): string {
155
+ const { name, type, model, props } = component;
156
+
157
+ return `
158
+ import React from 'react';
159
+ ${options.typescript ? `import type { ${model} } from '../types';` : ''}
160
+
161
+ ${options.typescript ? `interface ${name}Props {` : ''}
162
+ ${props?.map(p => ` ${p.name}${p.required ? '' : '?'}: ${p.type};`).join('\n')}
163
+ ${options.typescript ? '}' : ''}
164
+
165
+ export function ${name}(${options.typescript ? `props: ${name}Props` : 'props'}) {
166
+ return (
167
+ <div className="${name.toLowerCase()}">
168
+ {/* Generated component */}
169
+ </div>
170
+ );
171
+ }
172
+ `.trim();
173
+ }
174
+ ```
175
+
176
+ ### Registering a Generator
177
+
178
+ ```typescript
179
+ import { registerGenerator } from '@plures/praxis/codegen';
180
+ import { reactGenerator } from './generators/react';
181
+
182
+ registerGenerator(reactGenerator);
183
+
184
+ // Use via CLI
185
+ // praxis generate --schema ./schema.psf.json --generator react
186
+ ```
187
+
188
+ ### Generator Output Structure
189
+
190
+ ```typescript
191
+ interface GeneratorOutput {
192
+ path: string; // Output file path
193
+ content: string; // Generated code
194
+ type: OutputType; // 'component' | 'types' | 'docs' | 'config'
195
+ overwrite?: boolean; // Allow overwriting existing files
196
+ format?: boolean; // Apply code formatting
197
+ }
198
+ ```
199
+
200
+ ## Adapters
201
+
202
+ ### Creating a Database Adapter
203
+
204
+ ```typescript
205
+ import type { DatabaseAdapter, Collection, Query } from '@plures/praxis';
206
+
207
+ interface PostgresOptions {
208
+ connectionString: string;
209
+ ssl?: boolean;
210
+ }
211
+
212
+ export function createPostgresAdapter(options: PostgresOptions): DatabaseAdapter {
213
+ let pool: Pool;
214
+
215
+ return {
216
+ name: 'postgres',
217
+
218
+ async connect() {
219
+ pool = new Pool({ connectionString: options.connectionString });
220
+ await pool.connect();
221
+ },
222
+
223
+ async disconnect() {
224
+ await pool.end();
225
+ },
226
+
227
+ async createCollection(name: string, schema: CollectionSchema) {
228
+ const columns = schemaToColumns(schema);
229
+ await pool.query(`CREATE TABLE IF NOT EXISTS ${name} (${columns})`);
230
+ },
231
+
232
+ async insert(collection: string, document: any) {
233
+ const { columns, values, placeholders } = prepareInsert(document);
234
+ const result = await pool.query(
235
+ `INSERT INTO ${collection} (${columns}) VALUES (${placeholders}) RETURNING *`,
236
+ values
237
+ );
238
+ return result.rows[0];
239
+ },
240
+
241
+ async find(collection: string, query: Query) {
242
+ const { where, params } = queryToSQL(query);
243
+ const result = await pool.query(
244
+ `SELECT * FROM ${collection} ${where}`,
245
+ params
246
+ );
247
+ return result.rows;
248
+ },
249
+
250
+ // ... other CRUD operations
251
+ };
252
+ }
253
+ ```
254
+
255
+ ### Using Adapters
256
+
257
+ ```typescript
258
+ import { createPluresDB } from '@plures/praxis';
259
+ import { createPostgresAdapter } from './adapters/postgres';
260
+
261
+ const db = createPluresDB({
262
+ adapter: createPostgresAdapter({
263
+ connectionString: process.env.DATABASE_URL,
264
+ }),
265
+ collections: ['users', 'posts'],
266
+ });
267
+ ```
268
+
269
+ ## Templates
270
+
271
+ ### Creating a Project Template
272
+
273
+ Templates are directories with files that get copied and transformed:
274
+
275
+ ```
276
+ templates/
277
+ my-template/
278
+ template.json # Template configuration
279
+ package.json.template # Files with .template get variable substitution
280
+ src/
281
+ schema.psf.json.template
282
+ index.ts
283
+ README.md.template
284
+ ```
285
+
286
+ **template.json:**
287
+ ```json
288
+ {
289
+ "name": "my-template",
290
+ "description": "My custom Praxis template",
291
+ "version": "1.0.0",
292
+ "variables": [
293
+ {
294
+ "name": "appName",
295
+ "prompt": "Application name",
296
+ "default": "my-app"
297
+ },
298
+ {
299
+ "name": "author",
300
+ "prompt": "Author name"
301
+ }
302
+ ],
303
+ "postInstall": [
304
+ "npm install",
305
+ "npx praxis generate --schema ./src/schema.psf.json"
306
+ ]
307
+ }
308
+ ```
309
+
310
+ **package.json.template:**
311
+ ```json
312
+ {
313
+ "name": "{{appName}}",
314
+ "version": "0.1.0",
315
+ "author": "{{author}}",
316
+ "dependencies": {
317
+ "@plures/praxis": "^0.2.1"
318
+ }
319
+ }
320
+ ```
321
+
322
+ ### Registering Templates
323
+
324
+ ```bash
325
+ # Global templates directory
326
+ ~/.praxis/templates/my-template/
327
+
328
+ # Or in a package
329
+ npm install @myorg/praxis-template-enterprise
330
+ ```
331
+
332
+ ### Using Custom Templates
333
+
334
+ ```bash
335
+ praxis create app my-app --template @myorg/praxis-template-enterprise
336
+ ```
337
+
338
+ ## Canvas Extensions
339
+
340
+ ### Creating a Canvas Extension
341
+
342
+ ```typescript
343
+ import type { CanvasExtension, CanvasContext } from '@plures/praxis/canvas';
344
+
345
+ export const customPaletteExtension: CanvasExtension = {
346
+ name: 'custom-palette',
347
+
348
+ // Add items to the component palette
349
+ palette: {
350
+ category: 'Custom',
351
+ items: [
352
+ {
353
+ id: 'custom-chart',
354
+ name: 'Chart Component',
355
+ icon: '📊',
356
+ createComponent: () => ({
357
+ id: `comp_${Date.now()}`,
358
+ name: 'Chart',
359
+ type: 'display',
360
+ description: 'A chart component',
361
+ }),
362
+ },
363
+ ],
364
+ },
365
+
366
+ // Add toolbar buttons
367
+ toolbar: [
368
+ {
369
+ id: 'export-figma',
370
+ label: 'Export to Figma',
371
+ icon: 'figma',
372
+ action: async (context: CanvasContext) => {
373
+ const schema = context.getSchema();
374
+ await exportToFigma(schema);
375
+ },
376
+ },
377
+ ],
378
+
379
+ // Add context menu items
380
+ contextMenu: [
381
+ {
382
+ id: 'duplicate-with-variants',
383
+ label: 'Duplicate with Variants',
384
+ applies: (selection) => selection.type === 'component',
385
+ action: (context, selection) => {
386
+ duplicateWithVariants(context, selection);
387
+ },
388
+ },
389
+ ],
390
+ };
391
+ ```
392
+
393
+ ### Registering Canvas Extensions
394
+
395
+ **canvas.config.ts:**
396
+ ```typescript
397
+ import { customPaletteExtension } from './extensions/custom-palette';
398
+
399
+ export const config: CanvasConfig = {
400
+ extensions: [
401
+ customPaletteExtension,
402
+ '@plures/canvas-figma', // npm package
403
+ './extensions/my-extension.ts', // local file
404
+ ],
405
+ };
406
+ ```
407
+
408
+ ## Publishing Extensions
409
+
410
+ ### Package Structure
411
+
412
+ ```
413
+ my-praxis-extension/
414
+ package.json
415
+ src/
416
+ index.ts # Main entry point
417
+ plugin.ts # Plugin code
418
+ generator.ts # Generator code (if applicable)
419
+ dist/ # Compiled output
420
+ README.md
421
+ ```
422
+
423
+ **package.json:**
424
+ ```json
425
+ {
426
+ "name": "@myorg/praxis-extension-foo",
427
+ "version": "1.0.0",
428
+ "main": "./dist/index.js",
429
+ "types": "./dist/index.d.ts",
430
+ "keywords": ["praxis", "praxis-extension", "praxis-plugin"],
431
+ "peerDependencies": {
432
+ "@plures/praxis": "^0.2.0"
433
+ },
434
+ "praxis": {
435
+ "type": "extension",
436
+ "provides": ["plugin", "generator"]
437
+ }
438
+ }
439
+ ```
440
+
441
+ ### Publishing
442
+
443
+ ```bash
444
+ npm publish --access public
445
+ ```
446
+
447
+ ### Discovery
448
+
449
+ Extensions with `praxis` in keywords are discoverable:
450
+
451
+ ```bash
452
+ npm search praxis-extension
453
+ praxis extensions list
454
+ praxis extensions install @myorg/praxis-extension-foo
455
+ ```
456
+
457
+ ## Best Practices
458
+
459
+ ### 1. Type Safety
460
+
461
+ Use TypeScript and export proper types:
462
+
463
+ ```typescript
464
+ export interface MyPluginOptions {
465
+ // Document all options
466
+ enabled: boolean;
467
+ level?: 'basic' | 'advanced';
468
+ }
469
+
470
+ export function createMyPlugin(options: MyPluginOptions): PraxisPlugin {
471
+ // Implementation
472
+ }
473
+ ```
474
+
475
+ ### 2. Error Handling
476
+
477
+ Handle errors gracefully:
478
+
479
+ ```typescript
480
+ export const myPlugin: PraxisPlugin = {
481
+ name: 'my-plugin',
482
+
483
+ beforeStep(state, events) {
484
+ try {
485
+ // Plugin logic
486
+ } catch (error) {
487
+ console.error('[my-plugin] Error:', error);
488
+ // Don't break the engine
489
+ return { state, events };
490
+ }
491
+ },
492
+ };
493
+ ```
494
+
495
+ ### 3. Documentation
496
+
497
+ Include comprehensive README:
498
+
499
+ ```markdown
500
+ # My Praxis Extension
501
+
502
+ ## Installation
503
+ \`\`\`bash
504
+ npm install @myorg/praxis-extension-foo
505
+ \`\`\`
506
+
507
+ ## Usage
508
+ \`\`\`typescript
509
+ import { createFooPlugin } from '@myorg/praxis-extension-foo';
510
+
511
+ const engine = createPraxisEngine({
512
+ plugins: [createFooPlugin({ option: 'value' })],
513
+ });
514
+ \`\`\`
515
+
516
+ ## Options
517
+ | Option | Type | Default | Description |
518
+ |--------|------|---------|-------------|
519
+ | option | string | 'default' | Description |
520
+ ```
521
+
522
+ ### 4. Testing
523
+
524
+ Test your extensions:
525
+
526
+ ```typescript
527
+ import { describe, it, expect } from 'vitest';
528
+ import { createMyPlugin } from './my-plugin';
529
+ import { createPraxisEngine, PraxisRegistry } from '@plures/praxis';
530
+
531
+ describe('MyPlugin', () => {
532
+ it('should log on state change', () => {
533
+ const logs: string[] = [];
534
+ const plugin = createMyPlugin({
535
+ onLog: (msg) => logs.push(msg),
536
+ });
537
+
538
+ const engine = createPraxisEngine({
539
+ initialContext: {},
540
+ registry: new PraxisRegistry(),
541
+ plugins: [plugin],
542
+ });
543
+
544
+ engine.dispatch([{ tag: 'TEST', payload: {} }]);
545
+
546
+ expect(logs).toContain('Step executed');
547
+ });
548
+ });
549
+ ```
550
+
551
+ ---
552
+
553
+ **Next:** [Tutorials](../tutorials/README.md)