@plures/praxis 0.2.1 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/README.md +191 -64
  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 +239 -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 +16 -16
  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 +446 -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 +184 -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,142 @@
1
+ /**
2
+ * Unum Integration Tests
3
+ */
4
+
5
+ import { describe, it, expect, beforeEach } from "vitest";
6
+ import { createUnumAdapter, attachUnumToEngine } from "../integrations/unum.js";
7
+ import { createInMemoryDB } from "../integrations/pluresdb.js";
8
+ import { createPraxisEngine, PraxisRegistry } from "../index.js";
9
+
10
+ describe("Unum Integration", () => {
11
+ describe("createUnumAdapter", () => {
12
+ it("should create an adapter without identity", async () => {
13
+ const db = createInMemoryDB();
14
+ const adapter = await createUnumAdapter({ db });
15
+
16
+ expect(adapter).toBeDefined();
17
+ expect(adapter.identity).toBeNull();
18
+ });
19
+
20
+ it("should create an adapter with identity", async () => {
21
+ const db = createInMemoryDB();
22
+ const adapter = await createUnumAdapter({
23
+ db,
24
+ identity: {
25
+ id: "test-user",
26
+ name: "Test User",
27
+ createdAt: Date.now(),
28
+ },
29
+ });
30
+
31
+ expect(adapter.identity).toBeDefined();
32
+ expect(adapter.identity?.name).toBe("Test User");
33
+ });
34
+
35
+ it("should set identity", async () => {
36
+ const db = createInMemoryDB();
37
+ const adapter = await createUnumAdapter({ db });
38
+
39
+ const identity = await adapter.setIdentity({ name: "New User" });
40
+
41
+ expect(identity.name).toBe("New User");
42
+ expect(identity.id).toBeDefined();
43
+ expect(identity.createdAt).toBeDefined();
44
+ });
45
+
46
+ it("should get identity by ID", async () => {
47
+ const db = createInMemoryDB();
48
+ const adapter = await createUnumAdapter({ db });
49
+
50
+ const created = await adapter.setIdentity({ name: "Test" });
51
+ const fetched = await adapter.getIdentity(created.id);
52
+
53
+ expect(fetched).toBeDefined();
54
+ expect(fetched?.name).toBe("Test");
55
+ });
56
+
57
+ it("should create a channel", async () => {
58
+ const db = createInMemoryDB();
59
+ const adapter = await createUnumAdapter({ db });
60
+
61
+ const channel = await adapter.createChannel("test-channel");
62
+
63
+ expect(channel).toBeDefined();
64
+ expect(channel.name).toBe("test-channel");
65
+ expect(channel.id).toBeDefined();
66
+ });
67
+
68
+ it("should join a channel", async () => {
69
+ const db = createInMemoryDB();
70
+ const adapter = await createUnumAdapter({ db });
71
+
72
+ const created = await adapter.createChannel("test-channel");
73
+ const joined = await adapter.joinChannel(created.id);
74
+
75
+ expect(joined.id).toBe(created.id);
76
+ expect(joined.name).toBe("test-channel");
77
+ });
78
+
79
+ it("should list channels", async () => {
80
+ const db = createInMemoryDB();
81
+ const adapter = await createUnumAdapter({ db });
82
+
83
+ await adapter.createChannel("channel-1");
84
+ await adapter.createChannel("channel-2");
85
+
86
+ const channels = await adapter.listChannels();
87
+
88
+ expect(channels.length).toBe(2);
89
+ });
90
+
91
+ it("should publish messages to channel", async () => {
92
+ const db = createInMemoryDB();
93
+ const adapter = await createUnumAdapter({
94
+ db,
95
+ identity: { id: "user-1", name: "User 1", createdAt: Date.now() },
96
+ });
97
+
98
+ const channel = await adapter.createChannel("test-channel");
99
+
100
+ const messages: unknown[] = [];
101
+ channel.subscribe((msg) => messages.push(msg));
102
+
103
+ await channel.publish({
104
+ id: "msg-1",
105
+ sender: adapter.identity!,
106
+ content: { text: "Hello!" },
107
+ type: "text",
108
+ });
109
+
110
+ expect(messages.length).toBe(1);
111
+ });
112
+
113
+ it("should disconnect and cleanup", async () => {
114
+ const db = createInMemoryDB();
115
+ const adapter = await createUnumAdapter({ db });
116
+
117
+ await adapter.createChannel("test-channel");
118
+ await adapter.disconnect();
119
+
120
+ const channels = await adapter.listChannels();
121
+ expect(channels.length).toBe(0);
122
+ expect(adapter.identity).toBeNull();
123
+ });
124
+ });
125
+
126
+ describe("attachUnumToEngine", () => {
127
+ it("should attach adapter to engine", async () => {
128
+ const db = createInMemoryDB();
129
+ const adapter = await createUnumAdapter({ db });
130
+ const registry = new PraxisRegistry();
131
+ const engine = createPraxisEngine({
132
+ initialContext: {},
133
+ registry,
134
+ });
135
+
136
+ const cleanup = attachUnumToEngine(engine, adapter, "test-channel");
137
+
138
+ expect(cleanup).toBeInstanceOf(Function);
139
+ cleanup();
140
+ });
141
+ });
142
+ });
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Build Command
3
+ *
4
+ * Builds a Praxis application for production.
5
+ */
6
+
7
+ import { spawn } from 'child_process';
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+
11
+ /**
12
+ * Build options
13
+ */
14
+ export interface BuildOptions {
15
+ /** Output directory */
16
+ output?: string;
17
+ /** Build target */
18
+ target?: 'web' | 'desktop' | 'mobile';
19
+ /** Minify output */
20
+ minify?: boolean;
21
+ /** Generate source maps */
22
+ sourcemap?: boolean;
23
+ }
24
+
25
+ /**
26
+ * Build application for production
27
+ */
28
+ export async function build(options: BuildOptions): Promise<void> {
29
+ const output = options.output || './dist';
30
+ const target = options.target || 'web';
31
+
32
+ console.log('\n╔═══════════════════════════════════════════════════╗');
33
+ console.log('║ Praxis Production Build ║');
34
+ console.log('╚═══════════════════════════════════════════════════╝\n');
35
+
36
+ // Check if we're in a Praxis project
37
+ const packageJsonPath = path.join(process.cwd(), 'package.json');
38
+
39
+ if (!fs.existsSync(packageJsonPath)) {
40
+ console.error('Error: No package.json found in current directory.');
41
+ console.log('Make sure you are in a Praxis project directory.\n');
42
+ process.exit(1);
43
+ }
44
+
45
+ // Read package.json to check for build script
46
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
47
+
48
+ if (!packageJson.scripts?.build) {
49
+ console.error('Error: No "build" script found in package.json.');
50
+ console.log('\nTo build your Praxis project, add a build script to your package.json:');
51
+ console.log(' "scripts": {');
52
+ console.log(' "build": "vite build"');
53
+ console.log(' }\n');
54
+ process.exit(1);
55
+ }
56
+
57
+ console.log(`Building for: ${target}`);
58
+ console.log(`Output: ${output}`);
59
+ console.log('');
60
+
61
+ // Handle different build targets
62
+ if (target === 'desktop') {
63
+ await buildDesktop(options);
64
+ return;
65
+ }
66
+
67
+ if (target === 'mobile') {
68
+ await buildMobile(options);
69
+ return;
70
+ }
71
+
72
+ // Web build (default)
73
+ await buildWeb(options);
74
+ }
75
+
76
+ /**
77
+ * Build for web
78
+ */
79
+ async function buildWeb(options: BuildOptions): Promise<void> {
80
+ const output = options.output || './dist';
81
+
82
+ console.log('🌐 Building web application...\n');
83
+
84
+ // Set up environment variables for Vite
85
+ const env = {
86
+ ...process.env,
87
+ FORCE_COLOR: '1',
88
+ };
89
+
90
+ // Build args
91
+ const args = ['run', 'build'];
92
+ if (output !== './dist') {
93
+ args.push('--', '--outDir', output);
94
+ }
95
+
96
+ return new Promise((resolve, reject) => {
97
+ const child = spawn('npm', args, {
98
+ stdio: 'inherit',
99
+ shell: true,
100
+ cwd: process.cwd(),
101
+ env,
102
+ });
103
+
104
+ child.on('error', (error) => {
105
+ console.error('Build failed:', error.message);
106
+ reject(error);
107
+ });
108
+
109
+ child.on('exit', (code) => {
110
+ if (code === 0) {
111
+ console.log('\n✅ Build completed successfully!');
112
+ console.log(`\nOutput: ${output}/`);
113
+ console.log('\nTo preview the build:');
114
+ console.log(' npm run preview\n');
115
+ resolve();
116
+ } else {
117
+ console.error(`\n❌ Build failed with code ${code}`);
118
+ process.exit(code || 1);
119
+ }
120
+ });
121
+ });
122
+ }
123
+
124
+ /**
125
+ * Build for desktop (Tauri)
126
+ */
127
+ async function buildDesktop(_options: BuildOptions): Promise<void> {
128
+ console.log('🖥️ Building desktop application with Tauri...\n');
129
+
130
+ // Check if Tauri is configured
131
+ const tauriConfigPath = path.join(process.cwd(), 'src-tauri', 'tauri.conf.json');
132
+
133
+ if (!fs.existsSync(tauriConfigPath)) {
134
+ console.log('Tauri is not configured for this project.');
135
+ console.log('\nTo add Tauri support:');
136
+ console.log(' 1. npm install -D @tauri-apps/cli');
137
+ console.log(' 2. npm run tauri init');
138
+ console.log(' 3. praxis build --target desktop\n');
139
+ console.log('For more information, see the Tauri integration docs.');
140
+ process.exit(1);
141
+ }
142
+
143
+ // Check for tauri build script
144
+ const packageJson = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8'));
145
+
146
+ const buildScript = packageJson.scripts?.['tauri:build'] || packageJson.scripts?.['tauri'];
147
+
148
+ return new Promise((resolve, reject) => {
149
+ const child = spawn('npm', ['run', buildScript ? 'tauri:build' : 'tauri', 'build'], {
150
+ stdio: 'inherit',
151
+ shell: true,
152
+ cwd: process.cwd(),
153
+ env: {
154
+ ...process.env,
155
+ FORCE_COLOR: '1',
156
+ },
157
+ });
158
+
159
+ child.on('error', (error) => {
160
+ console.error('Desktop build failed:', error.message);
161
+ reject(error);
162
+ });
163
+
164
+ child.on('exit', (code) => {
165
+ if (code === 0) {
166
+ console.log('\n✅ Desktop build completed!');
167
+ console.log('\nBundles are in: src-tauri/target/release/bundle/');
168
+ resolve();
169
+ } else {
170
+ console.error(`\n❌ Desktop build failed with code ${code}`);
171
+ process.exit(code || 1);
172
+ }
173
+ });
174
+ });
175
+ }
176
+
177
+ /**
178
+ * Build for mobile (Tauri mobile)
179
+ */
180
+ async function buildMobile(_options: BuildOptions): Promise<void> {
181
+ console.log('📱 Building mobile application...\n');
182
+
183
+ // Check if Tauri mobile is configured
184
+ const tauriConfigPath = path.join(process.cwd(), 'src-tauri', 'tauri.conf.json');
185
+
186
+ if (!fs.existsSync(tauriConfigPath)) {
187
+ console.log('Tauri is not configured for this project.');
188
+ console.log('\nTo add mobile support:');
189
+ console.log(' 1. npm install -D @tauri-apps/cli');
190
+ console.log(' 2. npm run tauri init');
191
+ console.log(' 3. npm run tauri android init');
192
+ console.log(' 4. npm run tauri ios init');
193
+ console.log(' 5. praxis build --target mobile\n');
194
+ console.log('For more information, see the Tauri mobile docs.');
195
+ process.exit(1);
196
+ }
197
+
198
+ console.log('Mobile build requires platform-specific setup:');
199
+ console.log('\n📱 Android:');
200
+ console.log(' npm run tauri android build');
201
+ console.log('\n🍎 iOS:');
202
+ console.log(' npm run tauri ios build\n');
203
+ }
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Canvas Command
3
+ *
4
+ * Opens the CodeCanvas visual schema editor.
5
+ */
6
+
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import * as http from 'http';
10
+ import {
11
+ schemaToCanvas,
12
+ canvasToYaml,
13
+ canvasToMermaid,
14
+ createCanvasEditor,
15
+ } from '../../integrations/code-canvas.js';
16
+ import { loadSchemaFromFile } from '../../core/schema/loader.js';
17
+ import type { PraxisSchema } from '../../core/schema/types.js';
18
+
19
+ /**
20
+ * Canvas command options
21
+ */
22
+ export interface CanvasOptions {
23
+ /** Port for Canvas server */
24
+ port?: string;
25
+ /** Mode (edit, view, present) */
26
+ mode?: 'edit' | 'view' | 'present';
27
+ /** Export format */
28
+ export?: 'yaml' | 'mermaid' | 'json';
29
+ /** Output file for export */
30
+ output?: string;
31
+ }
32
+
33
+ /**
34
+ * Open CodeCanvas for visual editing
35
+ */
36
+ export async function canvas(schemaPath: string | undefined, options: CanvasOptions): Promise<void> {
37
+ const port = parseInt(options.port || '3000', 10);
38
+ const mode = options.mode || 'edit';
39
+
40
+ console.log('\n╔═══════════════════════════════════════════════════╗');
41
+ console.log('║ CodeCanvas Visual Editor ║');
42
+ console.log('╚═══════════════════════════════════════════════════╝\n');
43
+
44
+ // If export format is specified, export and exit
45
+ if (options.export) {
46
+ await exportCanvas(schemaPath, options);
47
+ return;
48
+ }
49
+
50
+ // Load schema if provided
51
+ let schema: PraxisSchema | undefined;
52
+ if (schemaPath && fs.existsSync(schemaPath)) {
53
+ try {
54
+ const result = await loadSchemaFromFile(schemaPath);
55
+ if (result.errors.length > 0) {
56
+ console.error(`Error loading schema: ${result.errors.join(', ')}`);
57
+ process.exit(1);
58
+ }
59
+ schema = result.schema;
60
+ console.log(`✓ Loaded schema: ${schemaPath}`);
61
+ } catch (error) {
62
+ console.error(`Error loading schema: ${error}`);
63
+ process.exit(1);
64
+ }
65
+ }
66
+
67
+ // Create canvas from schema
68
+ const editor = createCanvasEditor({ schema, layout: 'hierarchical' });
69
+
70
+ console.log(`\nStarting Canvas server on http://localhost:${port}`);
71
+ console.log(`Mode: ${mode}\n`);
72
+
73
+ // Start a simple HTTP server for the canvas
74
+ const server = http.createServer((req, res) => {
75
+ if (req.url === '/') {
76
+ res.writeHead(200, { 'Content-Type': 'text/html' });
77
+ res.end(generateCanvasHtml(editor.document, mode));
78
+ } else if (req.url === '/api/canvas') {
79
+ res.writeHead(200, { 'Content-Type': 'application/json' });
80
+ res.end(JSON.stringify(editor.document));
81
+ } else if (req.url === '/api/mermaid') {
82
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
83
+ res.end(editor.toMermaid());
84
+ } else if (req.url === '/api/yaml') {
85
+ res.writeHead(200, { 'Content-Type': 'text/yaml' });
86
+ res.end(editor.toYaml());
87
+ } else if (req.url === '/api/schema') {
88
+ res.writeHead(200, { 'Content-Type': 'application/json' });
89
+ res.end(JSON.stringify(editor.toSchema()));
90
+ } else {
91
+ res.writeHead(404);
92
+ res.end('Not found');
93
+ }
94
+ });
95
+
96
+ server.listen(port, () => {
97
+ console.log('Canvas server running!');
98
+ console.log(`\n Local: http://localhost:${port}`);
99
+ console.log(` Mermaid: http://localhost:${port}/api/mermaid`);
100
+ console.log(` YAML: http://localhost:${port}/api/yaml`);
101
+ console.log(` Schema: http://localhost:${port}/api/schema\n`);
102
+ console.log('Press Ctrl+C to stop.\n');
103
+ });
104
+
105
+ // Handle shutdown
106
+ process.on('SIGINT', () => {
107
+ console.log('\nShutting down Canvas server...');
108
+ server.close();
109
+ process.exit(0);
110
+ });
111
+ }
112
+
113
+ /**
114
+ * Export canvas to file
115
+ */
116
+ async function exportCanvas(schemaPath: string | undefined, options: CanvasOptions): Promise<void> {
117
+ if (!schemaPath || !fs.existsSync(schemaPath)) {
118
+ console.error('Error: Schema file required for export');
119
+ console.log('Usage: praxis canvas <schema-file> --export yaml --output schema.canvas.yaml');
120
+ process.exit(1);
121
+ }
122
+
123
+ const result = await loadSchemaFromFile(schemaPath);
124
+ if (result.errors.length > 0 || !result.schema) {
125
+ console.error(`Error loading schema: ${result.errors.join(', ')}`);
126
+ process.exit(1);
127
+ }
128
+ const canvas = schemaToCanvas(result.schema);
129
+
130
+ let output: string;
131
+ let ext: string;
132
+
133
+ switch (options.export) {
134
+ case 'yaml':
135
+ output = canvasToYaml(canvas);
136
+ ext = 'yaml';
137
+ break;
138
+ case 'mermaid':
139
+ output = canvasToMermaid(canvas);
140
+ ext = 'mmd';
141
+ break;
142
+ case 'json':
143
+ default:
144
+ output = JSON.stringify(canvas, null, 2);
145
+ ext = 'json';
146
+ }
147
+
148
+ const outputPath = options.output || `${path.basename(schemaPath, path.extname(schemaPath))}.canvas.${ext}`;
149
+ fs.writeFileSync(outputPath, output);
150
+
151
+ console.log(`✓ Exported canvas to: ${outputPath}`);
152
+ }
153
+
154
+ /**
155
+ * Generate HTML for canvas viewer
156
+ */
157
+ function generateCanvasHtml(document: ReturnType<typeof createCanvasEditor>['document'], mode: string): string {
158
+ const mermaidDiagram = canvasToMermaid({
159
+ id: document.id,
160
+ name: document.name,
161
+ version: document.version,
162
+ nodes: document.nodes,
163
+ edges: document.edges,
164
+ });
165
+
166
+ return `<!DOCTYPE html>
167
+ <html lang="en">
168
+ <head>
169
+ <meta charset="UTF-8">
170
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
171
+ <title>CodeCanvas - ${document.name}</title>
172
+ <script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
173
+ <style>
174
+ * { box-sizing: border-box; margin: 0; padding: 0; }
175
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #1a1a2e; color: #eee; }
176
+ .header { background: #16213e; padding: 1rem 2rem; display: flex; justify-content: space-between; align-items: center; }
177
+ .header h1 { font-size: 1.25rem; color: #00d9ff; }
178
+ .header .mode { background: #0f3460; padding: 0.25rem 0.75rem; border-radius: 4px; font-size: 0.875rem; }
179
+ .main { padding: 2rem; display: flex; gap: 2rem; }
180
+ .canvas { flex: 1; background: #16213e; border-radius: 8px; padding: 1.5rem; min-height: 500px; }
181
+ .sidebar { width: 300px; }
182
+ .panel { background: #16213e; border-radius: 8px; padding: 1rem; margin-bottom: 1rem; }
183
+ .panel h3 { font-size: 0.875rem; color: #00d9ff; margin-bottom: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; }
184
+ .panel ul { list-style: none; }
185
+ .panel li { padding: 0.5rem 0; border-bottom: 1px solid #0f3460; font-size: 0.875rem; }
186
+ .panel li:last-child { border-bottom: none; }
187
+ .mermaid { background: #fff; border-radius: 8px; padding: 1rem; }
188
+ .stats { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.5rem; }
189
+ .stat { background: #0f3460; padding: 0.75rem; border-radius: 4px; text-align: center; }
190
+ .stat-value { font-size: 1.5rem; font-weight: bold; color: #00d9ff; }
191
+ .stat-label { font-size: 0.75rem; color: #888; }
192
+ </style>
193
+ </head>
194
+ <body>
195
+ <div class="header">
196
+ <h1>🎨 CodeCanvas - ${document.name}</h1>
197
+ <span class="mode">${mode.toUpperCase()} MODE</span>
198
+ </div>
199
+ <div class="main">
200
+ <div class="canvas">
201
+ <div class="mermaid">
202
+ ${mermaidDiagram}
203
+ </div>
204
+ </div>
205
+ <div class="sidebar">
206
+ <div class="panel">
207
+ <h3>Statistics</h3>
208
+ <div class="stats">
209
+ <div class="stat">
210
+ <div class="stat-value">${document.nodes.filter(n => n.type === 'model').length}</div>
211
+ <div class="stat-label">Models</div>
212
+ </div>
213
+ <div class="stat">
214
+ <div class="stat-value">${document.nodes.filter(n => n.type === 'component').length}</div>
215
+ <div class="stat-label">Components</div>
216
+ </div>
217
+ <div class="stat">
218
+ <div class="stat-value">${document.nodes.filter(n => n.type === 'event').length}</div>
219
+ <div class="stat-label">Events</div>
220
+ </div>
221
+ <div class="stat">
222
+ <div class="stat-value">${document.nodes.filter(n => n.type === 'fact').length}</div>
223
+ <div class="stat-label">Facts</div>
224
+ </div>
225
+ </div>
226
+ </div>
227
+ <div class="panel">
228
+ <h3>Nodes</h3>
229
+ <ul>
230
+ ${document.nodes.map(n => `<li><strong>${n.type}:</strong> ${n.label}</li>`).join('\n ')}
231
+ </ul>
232
+ </div>
233
+ <div class="panel">
234
+ <h3>Edges</h3>
235
+ <ul>
236
+ ${document.edges.length ? document.edges.map(e => `<li>${e.source} → ${e.target}</li>`).join('\n ') : '<li>No edges</li>'}
237
+ </ul>
238
+ </div>
239
+ </div>
240
+ </div>
241
+ <script>
242
+ mermaid.initialize({ startOnLoad: true, theme: 'base' });
243
+ </script>
244
+ </body>
245
+ </html>`;
246
+ }