@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.
- package/README.md +191 -64
- package/core/codegen/docs-generator.ts +808 -0
- package/core/codegen/index.ts +27 -0
- package/core/codegen/ts-generator.ts +15 -0
- package/core/db-adapter/index.ts +52 -0
- package/core/db-adapter/sync-engine.ts +450 -0
- package/core/logic-engine/engine.ts +12 -0
- package/core/logic-engine/index.ts +16 -0
- package/core/logic-engine/protocol.ts +16 -0
- package/core/logic-engine/psf-adapter.ts +269 -0
- package/core/logic-engine/rules.ts +16 -0
- package/core/schema-engine/compiler.ts +431 -0
- package/core/schema-engine/generator.ts +635 -0
- package/core/schema-engine/index.ts +18 -0
- package/core/schema-engine/psf.ts +664 -0
- package/core/schema-engine/types.ts +63 -0
- package/core/schema-engine/validator.ts +541 -0
- package/dist/core/codegen/docs-generator.d.ts +123 -0
- package/dist/core/codegen/docs-generator.d.ts.map +1 -0
- package/dist/core/codegen/docs-generator.js +674 -0
- package/dist/core/codegen/docs-generator.js.map +1 -0
- package/dist/core/codegen/index.d.ts +11 -0
- package/dist/core/codegen/index.d.ts.map +1 -0
- package/dist/core/codegen/index.js +13 -0
- package/dist/core/codegen/index.js.map +1 -0
- package/dist/core/codegen/ts-generator.d.ts +8 -0
- package/dist/core/codegen/ts-generator.d.ts.map +1 -0
- package/dist/core/codegen/ts-generator.js +8 -0
- package/dist/core/codegen/ts-generator.js.map +1 -0
- package/dist/core/db-adapter/index.d.ts +18 -0
- package/dist/core/db-adapter/index.d.ts.map +1 -0
- package/dist/core/db-adapter/index.js +23 -0
- package/dist/core/db-adapter/index.js.map +1 -0
- package/dist/core/db-adapter/sync-engine.d.ts +180 -0
- package/dist/core/db-adapter/sync-engine.d.ts.map +1 -0
- package/dist/core/db-adapter/sync-engine.js +342 -0
- package/dist/core/db-adapter/sync-engine.js.map +1 -0
- package/dist/core/logic-engine/engine.d.ts +8 -0
- package/dist/core/logic-engine/engine.d.ts.map +1 -0
- package/dist/core/logic-engine/engine.js +8 -0
- package/dist/core/logic-engine/engine.js.map +1 -0
- package/dist/core/logic-engine/index.d.ts +16 -0
- package/dist/core/logic-engine/index.d.ts.map +1 -0
- package/dist/core/logic-engine/index.js +16 -0
- package/dist/core/logic-engine/index.js.map +1 -0
- package/dist/core/logic-engine/protocol.d.ts +7 -0
- package/dist/core/logic-engine/protocol.d.ts.map +1 -0
- package/dist/core/logic-engine/protocol.js +7 -0
- package/dist/core/logic-engine/protocol.js.map +1 -0
- package/dist/core/logic-engine/psf-adapter.d.ts +88 -0
- package/dist/core/logic-engine/psf-adapter.d.ts.map +1 -0
- package/dist/core/logic-engine/psf-adapter.js +207 -0
- package/dist/core/logic-engine/psf-adapter.js.map +1 -0
- package/dist/core/logic-engine/rules.d.ts +7 -0
- package/dist/core/logic-engine/rules.d.ts.map +1 -0
- package/dist/core/logic-engine/rules.js +7 -0
- package/dist/core/logic-engine/rules.js.map +1 -0
- package/dist/core/schema-engine/compiler.d.ts +198 -0
- package/dist/core/schema-engine/compiler.d.ts.map +1 -0
- package/dist/core/schema-engine/compiler.js +262 -0
- package/dist/core/schema-engine/compiler.js.map +1 -0
- package/dist/core/schema-engine/generator.d.ts +115 -0
- package/dist/core/schema-engine/generator.d.ts.map +1 -0
- package/dist/core/schema-engine/generator.js +506 -0
- package/dist/core/schema-engine/generator.js.map +1 -0
- package/dist/core/schema-engine/index.d.ts +18 -0
- package/dist/core/schema-engine/index.d.ts.map +1 -0
- package/dist/core/schema-engine/index.js +18 -0
- package/dist/core/schema-engine/index.js.map +1 -0
- package/dist/core/schema-engine/psf.d.ts +612 -0
- package/dist/core/schema-engine/psf.d.ts.map +1 -0
- package/dist/core/schema-engine/psf.js +45 -0
- package/dist/core/schema-engine/psf.js.map +1 -0
- package/dist/core/schema-engine/types.d.ts +10 -0
- package/dist/core/schema-engine/types.d.ts.map +1 -0
- package/dist/core/schema-engine/types.js +7 -0
- package/dist/core/schema-engine/types.js.map +1 -0
- package/dist/core/schema-engine/validator.d.ts +140 -0
- package/dist/core/schema-engine/validator.d.ts.map +1 -0
- package/dist/core/schema-engine/validator.js +407 -0
- package/dist/core/schema-engine/validator.js.map +1 -0
- package/dist/src/adapters/cli.d.ts.map +1 -0
- package/dist/src/adapters/cli.js.map +1 -0
- package/dist/src/cli/commands/auth.d.ts.map +1 -0
- package/dist/src/cli/commands/auth.js.map +1 -0
- package/dist/src/cli/commands/build.d.ts +23 -0
- package/dist/src/cli/commands/build.d.ts.map +1 -0
- package/dist/src/cli/commands/build.js +162 -0
- package/dist/src/cli/commands/build.js.map +1 -0
- package/dist/src/cli/commands/canvas.d.ts +23 -0
- package/dist/src/cli/commands/canvas.d.ts.map +1 -0
- package/dist/src/cli/commands/canvas.js +215 -0
- package/dist/src/cli/commands/canvas.js.map +1 -0
- package/dist/src/cli/commands/cloud.d.ts.map +1 -0
- package/dist/src/cli/commands/cloud.js.map +1 -0
- package/dist/src/cli/commands/create.d.ts +21 -0
- package/dist/src/cli/commands/create.d.ts.map +1 -0
- package/dist/src/cli/commands/create.js +621 -0
- package/dist/src/cli/commands/create.js.map +1 -0
- package/dist/src/cli/commands/dev.d.ts +21 -0
- package/dist/src/cli/commands/dev.d.ts.map +1 -0
- package/dist/src/cli/commands/dev.js +71 -0
- package/dist/src/cli/commands/dev.js.map +1 -0
- package/dist/src/cli/commands/generate.d.ts.map +1 -0
- package/dist/src/cli/commands/generate.js.map +1 -0
- package/dist/src/cli/commands/orchestrate.d.ts +44 -0
- package/dist/src/cli/commands/orchestrate.d.ts.map +1 -0
- package/dist/src/cli/commands/orchestrate.js +150 -0
- package/dist/src/cli/commands/orchestrate.js.map +1 -0
- package/dist/{cli → src/cli}/index.d.ts.map +1 -1
- package/dist/{cli → src/cli}/index.js +53 -21
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cloud/auth.d.ts.map +1 -0
- package/dist/src/cloud/auth.js.map +1 -0
- package/dist/src/cloud/billing.d.ts.map +1 -0
- package/dist/src/cloud/billing.js.map +1 -0
- package/dist/src/cloud/client.d.ts.map +1 -0
- package/dist/src/cloud/client.js.map +1 -0
- package/dist/src/cloud/index.d.ts.map +1 -0
- package/dist/src/cloud/index.js.map +1 -0
- package/dist/src/cloud/marketplace.d.ts.map +1 -0
- package/dist/src/cloud/marketplace.js.map +1 -0
- package/dist/src/cloud/provisioning.d.ts.map +1 -0
- package/dist/src/cloud/provisioning.js.map +1 -0
- package/dist/src/cloud/relay/endpoints.d.ts.map +1 -0
- package/dist/src/cloud/relay/endpoints.js.map +1 -0
- package/dist/src/cloud/relay/health/index.d.ts.map +1 -0
- package/dist/src/cloud/relay/health/index.js.map +1 -0
- package/dist/src/cloud/relay/stats/index.d.ts.map +1 -0
- package/dist/src/cloud/relay/stats/index.js.map +1 -0
- package/dist/src/cloud/relay/sync/index.d.ts.map +1 -0
- package/dist/src/cloud/relay/sync/index.js.map +1 -0
- package/dist/src/cloud/relay/usage/index.d.ts.map +1 -0
- package/dist/src/cloud/relay/usage/index.js.map +1 -0
- package/dist/src/cloud/sponsors.d.ts.map +1 -0
- package/dist/src/cloud/sponsors.js.map +1 -0
- package/dist/src/cloud/types.d.ts.map +1 -0
- package/dist/src/cloud/types.js.map +1 -0
- package/dist/src/components/index.d.ts.map +1 -0
- package/dist/src/components/index.js.map +1 -0
- package/dist/src/core/actors.d.ts.map +1 -0
- package/dist/src/core/actors.js.map +1 -0
- package/dist/src/core/component/generator.d.ts.map +1 -0
- package/dist/{core → src/core}/component/generator.js +45 -3
- package/dist/src/core/component/generator.js.map +1 -0
- package/dist/src/core/engine.d.ts.map +1 -0
- package/dist/src/core/engine.js.map +1 -0
- package/dist/src/core/introspection.d.ts.map +1 -0
- package/dist/src/core/introspection.js.map +1 -0
- package/dist/src/core/logic/generator.d.ts.map +1 -0
- package/dist/{core → src/core}/logic/generator.js +35 -4
- package/dist/src/core/logic/generator.js.map +1 -0
- package/dist/src/core/pluresdb/adapter.d.ts +72 -0
- package/dist/src/core/pluresdb/adapter.d.ts.map +1 -0
- package/dist/src/core/pluresdb/adapter.js +73 -0
- package/dist/src/core/pluresdb/adapter.js.map +1 -0
- package/dist/src/core/pluresdb/generator.d.ts.map +1 -0
- package/dist/{core → src/core}/pluresdb/generator.js +33 -4
- package/dist/src/core/pluresdb/generator.js.map +1 -0
- package/dist/src/core/pluresdb/index.d.ts +15 -0
- package/dist/src/core/pluresdb/index.d.ts.map +1 -0
- package/dist/src/core/pluresdb/index.js +11 -0
- package/dist/src/core/pluresdb/index.js.map +1 -0
- package/dist/src/core/pluresdb/schema-registry.d.ts +104 -0
- package/dist/src/core/pluresdb/schema-registry.d.ts.map +1 -0
- package/dist/src/core/pluresdb/schema-registry.js +130 -0
- package/dist/src/core/pluresdb/schema-registry.js.map +1 -0
- package/dist/src/core/pluresdb/store.d.ts +199 -0
- package/dist/src/core/pluresdb/store.d.ts.map +1 -0
- package/dist/src/core/pluresdb/store.js +344 -0
- package/dist/src/core/pluresdb/store.js.map +1 -0
- package/dist/src/core/protocol.d.ts.map +1 -0
- package/dist/src/core/protocol.js.map +1 -0
- package/dist/src/core/rules.d.ts.map +1 -0
- package/dist/src/core/rules.js.map +1 -0
- package/dist/src/core/schema/loader.d.ts.map +1 -0
- package/dist/src/core/schema/loader.js.map +1 -0
- package/dist/src/core/schema/normalize.d.ts.map +1 -0
- package/dist/src/core/schema/normalize.js.map +1 -0
- package/dist/src/core/schema/types.d.ts.map +1 -0
- package/dist/src/core/schema/types.js.map +1 -0
- package/dist/src/dsl/index.d.ts.map +1 -0
- package/dist/src/dsl/index.js.map +1 -0
- package/dist/src/dsl.d.ts.map +1 -0
- package/dist/src/dsl.js.map +1 -0
- package/dist/src/examples/advanced-todo/index.d.ts.map +1 -0
- package/dist/src/examples/advanced-todo/index.js.map +1 -0
- package/dist/src/examples/auth-basic/index.d.ts.map +1 -0
- package/dist/src/examples/auth-basic/index.js.map +1 -0
- package/dist/src/examples/cart/index.d.ts.map +1 -0
- package/dist/src/examples/cart/index.js.map +1 -0
- package/dist/src/examples/hero-ecommerce/index.d.ts.map +1 -0
- package/dist/src/examples/hero-ecommerce/index.js.map +1 -0
- package/dist/src/examples/svelte-counter/index.d.ts.map +1 -0
- package/dist/src/examples/svelte-counter/index.js.map +1 -0
- package/dist/src/flows.d.ts.map +1 -0
- package/dist/src/flows.js.map +1 -0
- package/dist/{index.d.ts → src/index.d.ts} +12 -2
- package/dist/src/index.d.ts.map +1 -0
- package/dist/{index.js → src/index.js} +6 -1
- package/dist/src/index.js.map +1 -0
- package/dist/src/integrations/code-canvas.d.ts +265 -0
- package/dist/src/integrations/code-canvas.d.ts.map +1 -0
- package/dist/src/integrations/code-canvas.js +451 -0
- package/dist/src/integrations/code-canvas.js.map +1 -0
- package/dist/src/integrations/pluresdb.d.ts +117 -0
- package/dist/src/integrations/pluresdb.d.ts.map +1 -0
- package/dist/src/integrations/pluresdb.js +117 -0
- package/dist/src/integrations/pluresdb.js.map +1 -0
- package/dist/src/integrations/state-docs.d.ts +191 -0
- package/dist/src/integrations/state-docs.d.ts.map +1 -0
- package/dist/src/integrations/state-docs.js +515 -0
- package/dist/src/integrations/state-docs.js.map +1 -0
- package/dist/src/integrations/svelte.d.ts.map +1 -0
- package/dist/src/integrations/svelte.js.map +1 -0
- package/dist/src/integrations/tauri.d.ts +360 -0
- package/dist/src/integrations/tauri.d.ts.map +1 -0
- package/dist/src/integrations/tauri.js +278 -0
- package/dist/src/integrations/tauri.js.map +1 -0
- package/dist/src/integrations/unum.d.ts +159 -0
- package/dist/src/integrations/unum.d.ts.map +1 -0
- package/dist/src/integrations/unum.js +240 -0
- package/dist/src/integrations/unum.js.map +1 -0
- package/dist/src/registry.d.ts.map +1 -0
- package/dist/src/registry.js.map +1 -0
- package/dist/{runtime → src/runtime}/terminal-adapter.d.ts +58 -7
- package/dist/src/runtime/terminal-adapter.d.ts.map +1 -0
- package/dist/src/runtime/terminal-adapter.js +239 -0
- package/dist/src/runtime/terminal-adapter.js.map +1 -0
- package/dist/src/step.d.ts.map +1 -0
- package/dist/src/step.js.map +1 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/{cloud → src}/types.js.map +1 -1
- package/dist/tools/cli/commands/index.d.ts +7 -0
- package/dist/tools/cli/commands/index.d.ts.map +1 -0
- package/dist/tools/cli/commands/index.js +7 -0
- package/dist/tools/cli/commands/index.js.map +1 -0
- package/dist/tools/cli/index.d.ts +8 -0
- package/dist/tools/cli/index.d.ts.map +1 -0
- package/dist/tools/cli/index.js +9 -0
- package/dist/tools/cli/index.js.map +1 -0
- package/dist/tools/watcher/index.d.ts +105 -0
- package/dist/tools/watcher/index.d.ts.map +1 -0
- package/dist/tools/watcher/index.js +213 -0
- package/dist/tools/watcher/index.js.map +1 -0
- package/dist/ui/canvas/canvas-projection.d.ts +78 -0
- package/dist/ui/canvas/canvas-projection.d.ts.map +1 -0
- package/dist/ui/canvas/canvas-projection.js +416 -0
- package/dist/ui/canvas/canvas-projection.js.map +1 -0
- package/dist/ui/canvas/canvas-state.d.ts +200 -0
- package/dist/ui/canvas/canvas-state.d.ts.map +1 -0
- package/dist/ui/canvas/canvas-state.js +464 -0
- package/dist/ui/canvas/canvas-state.js.map +1 -0
- package/dist/ui/canvas/components/index.d.ts +95 -0
- package/dist/ui/canvas/components/index.d.ts.map +1 -0
- package/dist/ui/canvas/components/index.js +19 -0
- package/dist/ui/canvas/components/index.js.map +1 -0
- package/dist/ui/canvas/index.d.ts +32 -0
- package/dist/ui/canvas/index.d.ts.map +1 -0
- package/dist/ui/canvas/index.js +32 -0
- package/dist/ui/canvas/index.js.map +1 -0
- package/dist/ui/svelte-generator/index.d.ts +9 -0
- package/dist/ui/svelte-generator/index.d.ts.map +1 -0
- package/dist/ui/svelte-generator/index.js +11 -0
- package/dist/ui/svelte-generator/index.js.map +1 -0
- package/dist/ui/svelte-generator/psf-generator.d.ts +128 -0
- package/dist/ui/svelte-generator/psf-generator.d.ts.map +1 -0
- package/dist/ui/svelte-generator/psf-generator.js +506 -0
- package/dist/ui/svelte-generator/psf-generator.js.map +1 -0
- package/docs/README.md +155 -0
- package/docs/core/building-extensions.md +553 -0
- package/docs/core/cli-usage.md +498 -0
- package/docs/core/code-canvas-sync.md +468 -0
- package/docs/core/logic-engine.md +566 -0
- package/docs/core/pluresdb-integration.md +646 -0
- package/docs/core/schema-model.md +414 -0
- package/docs/core/ui-generation.md +580 -0
- package/docs/core/what-is-praxis.md +240 -0
- package/docs/tutorials/README.md +84 -0
- package/docs/tutorials/ecommerce-cart.md +631 -0
- package/docs/tutorials/first-app.md +529 -0
- package/docs/tutorials/form-builder.md +620 -0
- package/docs/tutorials/todo-pluresdb.md +589 -0
- package/package.json +16 -16
- package/src/__tests__/canvas-components.test.ts +450 -0
- package/src/__tests__/cli-create.test.ts +178 -0
- package/src/__tests__/code-canvas-integration.test.ts +277 -0
- package/src/__tests__/docs-generator.test.ts +181 -0
- package/src/__tests__/generators.test.ts +3 -2
- package/src/__tests__/pluresdb.test.ts +457 -0
- package/src/__tests__/psf-schema-engine.test.ts +450 -0
- package/src/__tests__/state-docs-integration.test.ts +297 -0
- package/src/__tests__/tauri-integration.test.ts +298 -0
- package/src/__tests__/terminal-node.test.ts +1 -1
- package/src/__tests__/unum-integration.test.ts +142 -0
- package/src/cli/commands/build.ts +203 -0
- package/src/cli/commands/canvas.ts +246 -0
- package/src/cli/commands/create.ts +666 -0
- package/src/cli/commands/dev.ts +95 -0
- package/src/cli/commands/orchestrate.ts +212 -0
- package/src/cli/index.ts +48 -21
- package/src/core/component/generator.ts +45 -3
- package/src/core/logic/generator.ts +39 -4
- package/src/core/pluresdb/adapter.ts +117 -0
- package/src/core/pluresdb/generator.ts +33 -4
- package/src/core/pluresdb/index.ts +37 -0
- package/src/core/pluresdb/schema-registry.ts +162 -0
- package/src/core/pluresdb/store.ts +446 -0
- package/src/index.ts +109 -0
- package/src/integrations/code-canvas.ts +717 -0
- package/src/integrations/pluresdb.ts +140 -29
- package/src/integrations/state-docs.ts +710 -0
- package/src/integrations/tauri.ts +638 -0
- package/src/integrations/unum.ts +395 -0
- package/src/runtime/terminal-adapter.ts +184 -23
- package/dist/adapters/cli.d.ts.map +0 -1
- package/dist/adapters/cli.js.map +0 -1
- package/dist/cli/commands/auth.d.ts.map +0 -1
- package/dist/cli/commands/auth.js.map +0 -1
- package/dist/cli/commands/cloud.d.ts.map +0 -1
- package/dist/cli/commands/cloud.js.map +0 -1
- package/dist/cli/commands/generate.d.ts.map +0 -1
- package/dist/cli/commands/generate.js.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/cloud/auth.d.ts.map +0 -1
- package/dist/cloud/auth.js.map +0 -1
- package/dist/cloud/billing.d.ts.map +0 -1
- package/dist/cloud/billing.js.map +0 -1
- package/dist/cloud/client.d.ts.map +0 -1
- package/dist/cloud/client.js.map +0 -1
- package/dist/cloud/index.d.ts.map +0 -1
- package/dist/cloud/index.js.map +0 -1
- package/dist/cloud/marketplace.d.ts.map +0 -1
- package/dist/cloud/marketplace.js.map +0 -1
- package/dist/cloud/provisioning.d.ts.map +0 -1
- package/dist/cloud/provisioning.js.map +0 -1
- package/dist/cloud/relay/endpoints.d.ts.map +0 -1
- package/dist/cloud/relay/endpoints.js.map +0 -1
- package/dist/cloud/relay/health/index.d.ts.map +0 -1
- package/dist/cloud/relay/health/index.js.map +0 -1
- package/dist/cloud/relay/stats/index.d.ts.map +0 -1
- package/dist/cloud/relay/stats/index.js.map +0 -1
- package/dist/cloud/relay/sync/index.d.ts.map +0 -1
- package/dist/cloud/relay/sync/index.js.map +0 -1
- package/dist/cloud/relay/usage/index.d.ts.map +0 -1
- package/dist/cloud/relay/usage/index.js.map +0 -1
- package/dist/cloud/sponsors.d.ts.map +0 -1
- package/dist/cloud/sponsors.js.map +0 -1
- package/dist/cloud/types.d.ts.map +0 -1
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/core/actors.d.ts.map +0 -1
- package/dist/core/actors.js.map +0 -1
- package/dist/core/component/generator.d.ts.map +0 -1
- package/dist/core/component/generator.js.map +0 -1
- package/dist/core/engine.d.ts.map +0 -1
- package/dist/core/engine.js.map +0 -1
- package/dist/core/introspection.d.ts.map +0 -1
- package/dist/core/introspection.js.map +0 -1
- package/dist/core/logic/generator.d.ts.map +0 -1
- package/dist/core/logic/generator.js.map +0 -1
- package/dist/core/pluresdb/generator.d.ts.map +0 -1
- package/dist/core/pluresdb/generator.js.map +0 -1
- package/dist/core/protocol.d.ts.map +0 -1
- package/dist/core/protocol.js.map +0 -1
- package/dist/core/rules.d.ts.map +0 -1
- package/dist/core/rules.js.map +0 -1
- package/dist/core/schema/loader.d.ts.map +0 -1
- package/dist/core/schema/loader.js.map +0 -1
- package/dist/core/schema/normalize.d.ts.map +0 -1
- package/dist/core/schema/normalize.js.map +0 -1
- package/dist/core/schema/types.d.ts.map +0 -1
- package/dist/core/schema/types.js.map +0 -1
- package/dist/dsl/index.d.ts.map +0 -1
- package/dist/dsl/index.js.map +0 -1
- package/dist/dsl.d.ts.map +0 -1
- package/dist/dsl.js.map +0 -1
- package/dist/examples/advanced-todo/index.d.ts.map +0 -1
- package/dist/examples/advanced-todo/index.js.map +0 -1
- package/dist/examples/auth-basic/index.d.ts.map +0 -1
- package/dist/examples/auth-basic/index.js.map +0 -1
- package/dist/examples/cart/index.d.ts.map +0 -1
- package/dist/examples/cart/index.js.map +0 -1
- package/dist/examples/hero-ecommerce/index.d.ts.map +0 -1
- package/dist/examples/hero-ecommerce/index.js.map +0 -1
- package/dist/examples/svelte-counter/index.d.ts.map +0 -1
- package/dist/examples/svelte-counter/index.js.map +0 -1
- package/dist/flows.d.ts.map +0 -1
- package/dist/flows.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/integrations/pluresdb.d.ts +0 -56
- package/dist/integrations/pluresdb.d.ts.map +0 -1
- package/dist/integrations/pluresdb.js +0 -46
- package/dist/integrations/pluresdb.js.map +0 -1
- package/dist/integrations/svelte.d.ts.map +0 -1
- package/dist/integrations/svelte.js.map +0 -1
- package/dist/registry.d.ts.map +0 -1
- package/dist/registry.js.map +0 -1
- package/dist/runtime/terminal-adapter.d.ts.map +0 -1
- package/dist/runtime/terminal-adapter.js +0 -113
- package/dist/runtime/terminal-adapter.js.map +0 -1
- package/dist/step.d.ts.map +0 -1
- package/dist/step.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- /package/dist/{adapters → src/adapters}/cli.d.ts +0 -0
- /package/dist/{adapters → src/adapters}/cli.js +0 -0
- /package/dist/{cli → src/cli}/commands/auth.d.ts +0 -0
- /package/dist/{cli → src/cli}/commands/auth.js +0 -0
- /package/dist/{cli → src/cli}/commands/cloud.d.ts +0 -0
- /package/dist/{cli → src/cli}/commands/cloud.js +0 -0
- /package/dist/{cli → src/cli}/commands/generate.d.ts +0 -0
- /package/dist/{cli → src/cli}/commands/generate.js +0 -0
- /package/dist/{cli → src/cli}/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/auth.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/auth.js +0 -0
- /package/dist/{cloud → src/cloud}/billing.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/billing.js +0 -0
- /package/dist/{cloud → src/cloud}/client.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/client.js +0 -0
- /package/dist/{cloud → src/cloud}/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/index.js +0 -0
- /package/dist/{cloud → src/cloud}/marketplace.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/marketplace.js +0 -0
- /package/dist/{cloud → src/cloud}/provisioning.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/provisioning.js +0 -0
- /package/dist/{cloud → src/cloud}/relay/endpoints.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/relay/endpoints.js +0 -0
- /package/dist/{cloud → src/cloud}/relay/health/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/relay/health/index.js +0 -0
- /package/dist/{cloud → src/cloud}/relay/stats/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/relay/stats/index.js +0 -0
- /package/dist/{cloud → src/cloud}/relay/sync/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/relay/sync/index.js +0 -0
- /package/dist/{cloud → src/cloud}/relay/usage/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/relay/usage/index.js +0 -0
- /package/dist/{cloud → src/cloud}/sponsors.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/sponsors.js +0 -0
- /package/dist/{cloud → src/cloud}/types.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/types.js +0 -0
- /package/dist/{components → src/components}/index.d.ts +0 -0
- /package/dist/{components → src/components}/index.js +0 -0
- /package/dist/{core → src/core}/actors.d.ts +0 -0
- /package/dist/{core → src/core}/actors.js +0 -0
- /package/dist/{core → src/core}/component/generator.d.ts +0 -0
- /package/dist/{core → src/core}/engine.d.ts +0 -0
- /package/dist/{core → src/core}/engine.js +0 -0
- /package/dist/{core → src/core}/introspection.d.ts +0 -0
- /package/dist/{core → src/core}/introspection.js +0 -0
- /package/dist/{core → src/core}/logic/generator.d.ts +0 -0
- /package/dist/{core → src/core}/pluresdb/generator.d.ts +0 -0
- /package/dist/{core → src/core}/protocol.d.ts +0 -0
- /package/dist/{core → src/core}/protocol.js +0 -0
- /package/dist/{core → src/core}/rules.d.ts +0 -0
- /package/dist/{core → src/core}/rules.js +0 -0
- /package/dist/{core → src/core}/schema/loader.d.ts +0 -0
- /package/dist/{core → src/core}/schema/loader.js +0 -0
- /package/dist/{core → src/core}/schema/normalize.d.ts +0 -0
- /package/dist/{core → src/core}/schema/normalize.js +0 -0
- /package/dist/{core → src/core}/schema/types.d.ts +0 -0
- /package/dist/{core → src/core}/schema/types.js +0 -0
- /package/dist/{dsl → src/dsl}/index.d.ts +0 -0
- /package/dist/{dsl → src/dsl}/index.js +0 -0
- /package/dist/{dsl.d.ts → src/dsl.d.ts} +0 -0
- /package/dist/{dsl.js → src/dsl.js} +0 -0
- /package/dist/{examples → src/examples}/advanced-todo/index.d.ts +0 -0
- /package/dist/{examples → src/examples}/advanced-todo/index.js +0 -0
- /package/dist/{examples → src/examples}/auth-basic/index.d.ts +0 -0
- /package/dist/{examples → src/examples}/auth-basic/index.js +0 -0
- /package/dist/{examples → src/examples}/cart/index.d.ts +0 -0
- /package/dist/{examples → src/examples}/cart/index.js +0 -0
- /package/dist/{examples → src/examples}/hero-ecommerce/index.d.ts +0 -0
- /package/dist/{examples → src/examples}/hero-ecommerce/index.js +0 -0
- /package/dist/{examples → src/examples}/svelte-counter/index.d.ts +0 -0
- /package/dist/{examples → src/examples}/svelte-counter/index.js +0 -0
- /package/dist/{flows.d.ts → src/flows.d.ts} +0 -0
- /package/dist/{flows.js → src/flows.js} +0 -0
- /package/dist/{integrations → src/integrations}/svelte.d.ts +0 -0
- /package/dist/{integrations → src/integrations}/svelte.js +0 -0
- /package/dist/{registry.d.ts → src/registry.d.ts} +0 -0
- /package/dist/{registry.js → src/registry.js} +0 -0
- /package/dist/{step.d.ts → src/step.d.ts} +0 -0
- /package/dist/{step.js → src/step.js} +0 -0
- /package/dist/{types.d.ts → src/types.d.ts} +0 -0
- /package/dist/{types.js → src/types.js} +0 -0
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
# Code ↔ Canvas Sync
|
|
2
|
+
|
|
3
|
+
Praxis provides bidirectional synchronization between code (PSF schemas, TypeScript) and CodeCanvas (visual editor). This allows developers to work in their preferred mode while keeping everything in sync.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
```mermaid
|
|
8
|
+
flowchart LR
|
|
9
|
+
subgraph Code["Code (Text Editor)"]
|
|
10
|
+
PSF[schema.psf.json]
|
|
11
|
+
TS[TypeScript Files]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
subgraph Sync["Sync Engine"]
|
|
15
|
+
Parser[PSF Parser]
|
|
16
|
+
Generator[Code Generator]
|
|
17
|
+
Watcher[File Watcher]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
subgraph Canvas["CodeCanvas (Visual)"]
|
|
21
|
+
Visual[Visual Editor]
|
|
22
|
+
Preview[Live Preview]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
PSF <--> Parser
|
|
26
|
+
Parser <--> Visual
|
|
27
|
+
Visual --> Generator
|
|
28
|
+
Generator --> TS
|
|
29
|
+
Watcher --> Parser
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## How It Works
|
|
33
|
+
|
|
34
|
+
### Code-First Workflow
|
|
35
|
+
|
|
36
|
+
1. Write or edit `schema.psf.json` in your text editor
|
|
37
|
+
2. File watcher detects changes
|
|
38
|
+
3. Canvas automatically updates to reflect changes
|
|
39
|
+
4. Visual editor shows the new state
|
|
40
|
+
|
|
41
|
+
### Canvas-First Workflow
|
|
42
|
+
|
|
43
|
+
1. Design visually in CodeCanvas
|
|
44
|
+
2. Canvas generates/updates `schema.psf.json`
|
|
45
|
+
3. Run code generation to update TypeScript files
|
|
46
|
+
4. Code editor reflects the changes
|
|
47
|
+
|
|
48
|
+
### Hybrid Workflow
|
|
49
|
+
|
|
50
|
+
Work in both modes simultaneously:
|
|
51
|
+
- Use Canvas for visual design and high-level structure
|
|
52
|
+
- Use code editor for detailed logic and fine-tuning
|
|
53
|
+
- Changes sync automatically in both directions
|
|
54
|
+
|
|
55
|
+
## Setting Up Sync
|
|
56
|
+
|
|
57
|
+
### 1. Start Canvas with Sync
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Start Canvas with file watching
|
|
61
|
+
praxis canvas ./src/schema.psf.json --watch
|
|
62
|
+
|
|
63
|
+
# With custom config
|
|
64
|
+
praxis canvas ./src/schema.psf.json --config canvas.config.ts
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 2. Configure Sync Options
|
|
68
|
+
|
|
69
|
+
Create `canvas.config.ts`:
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
import type { CanvasConfig } from '@plures/praxis/canvas';
|
|
73
|
+
|
|
74
|
+
export const config: CanvasConfig = {
|
|
75
|
+
sync: {
|
|
76
|
+
// Enable bidirectional sync
|
|
77
|
+
enabled: true,
|
|
78
|
+
|
|
79
|
+
// Watch for file changes
|
|
80
|
+
watchFiles: true,
|
|
81
|
+
|
|
82
|
+
// Debounce time for file changes (ms)
|
|
83
|
+
debounce: 500,
|
|
84
|
+
|
|
85
|
+
// How to handle conflicts
|
|
86
|
+
conflictResolution: 'ask', // 'ask' | 'canvas' | 'code' | 'merge'
|
|
87
|
+
|
|
88
|
+
// Auto-regenerate code on Canvas changes
|
|
89
|
+
autoGenerate: true,
|
|
90
|
+
|
|
91
|
+
// Files to generate
|
|
92
|
+
generateTargets: ['types', 'components', 'docs'],
|
|
93
|
+
},
|
|
94
|
+
|
|
95
|
+
// Code generation settings
|
|
96
|
+
generation: {
|
|
97
|
+
output: './src/generated',
|
|
98
|
+
format: 'typescript',
|
|
99
|
+
formatting: 'prettier',
|
|
100
|
+
includeComments: true,
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Sync Behaviors
|
|
106
|
+
|
|
107
|
+
### Real-Time Sync
|
|
108
|
+
|
|
109
|
+
With `watchFiles: true`, changes sync in real-time:
|
|
110
|
+
|
|
111
|
+
**Code → Canvas:**
|
|
112
|
+
- Edit `schema.psf.json` in VS Code
|
|
113
|
+
- Save the file
|
|
114
|
+
- Canvas updates within 500ms (configurable debounce)
|
|
115
|
+
|
|
116
|
+
**Canvas → Code:**
|
|
117
|
+
- Make changes in Canvas visual editor
|
|
118
|
+
- Click "Save" or auto-save triggers
|
|
119
|
+
- `schema.psf.json` updates immediately
|
|
120
|
+
- Generated files regenerate (if `autoGenerate: true`)
|
|
121
|
+
|
|
122
|
+
### Conflict Resolution
|
|
123
|
+
|
|
124
|
+
When both sides change simultaneously:
|
|
125
|
+
|
|
126
|
+
#### `'ask'` (Default)
|
|
127
|
+
|
|
128
|
+
Shows a dialog to choose which version to keep:
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
┌─────────────────────────────────────┐
|
|
132
|
+
│ Sync Conflict Detected │
|
|
133
|
+
│ │
|
|
134
|
+
│ Both code and canvas have changes. │
|
|
135
|
+
│ │
|
|
136
|
+
│ [Use Code] [Use Canvas] [Merge] │
|
|
137
|
+
└─────────────────────────────────────┘
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
#### `'canvas'`
|
|
141
|
+
|
|
142
|
+
Canvas changes always win:
|
|
143
|
+
- Canvas overwrites code changes
|
|
144
|
+
- Safe when primarily designing visually
|
|
145
|
+
|
|
146
|
+
#### `'code'`
|
|
147
|
+
|
|
148
|
+
Code changes always win:
|
|
149
|
+
- Code overwrites Canvas changes
|
|
150
|
+
- Safe when primarily coding
|
|
151
|
+
|
|
152
|
+
#### `'merge'`
|
|
153
|
+
|
|
154
|
+
Attempts to merge changes:
|
|
155
|
+
- Works for independent changes (different models, components)
|
|
156
|
+
- Conflicts still require manual resolution
|
|
157
|
+
|
|
158
|
+
## File Watcher
|
|
159
|
+
|
|
160
|
+
### CLI Watcher
|
|
161
|
+
|
|
162
|
+
Use the Praxis CLI for file watching:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
# Watch schema and regenerate on changes
|
|
166
|
+
praxis generate --schema ./schema.psf.json --watch
|
|
167
|
+
|
|
168
|
+
# With specific outputs
|
|
169
|
+
praxis generate --schema ./schema.psf.json --watch --only components,types
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Programmatic Watcher
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
import { createFileWatcher, regeneratePSF } from '@plures/praxis';
|
|
176
|
+
|
|
177
|
+
const watcher = createFileWatcher({
|
|
178
|
+
paths: ['./src/schemas/**/*.psf.json'],
|
|
179
|
+
debounce: 500,
|
|
180
|
+
onchange: async (path) => {
|
|
181
|
+
console.log(`Schema changed: ${path}`);
|
|
182
|
+
await regeneratePSF({
|
|
183
|
+
schema: path,
|
|
184
|
+
output: './src/generated',
|
|
185
|
+
});
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// Start watching
|
|
190
|
+
watcher.start();
|
|
191
|
+
|
|
192
|
+
// Stop watching
|
|
193
|
+
watcher.stop();
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Canvas API
|
|
197
|
+
|
|
198
|
+
### Reading Schema State
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
// In Canvas or external tool
|
|
202
|
+
import { readPSFSchema, writePSFSchema } from '@plures/praxis';
|
|
203
|
+
|
|
204
|
+
// Read current schema
|
|
205
|
+
const schema = await readPSFSchema('./schema.psf.json');
|
|
206
|
+
console.log(schema.models);
|
|
207
|
+
|
|
208
|
+
// Modify schema
|
|
209
|
+
schema.models.push({
|
|
210
|
+
id: 'model_new',
|
|
211
|
+
name: 'NewModel',
|
|
212
|
+
fields: [{ name: 'id', type: 'uuid' }],
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// Write back
|
|
216
|
+
await writePSFSchema('./schema.psf.json', schema);
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Canvas Events
|
|
220
|
+
|
|
221
|
+
```typescript
|
|
222
|
+
// Canvas emits events for sync
|
|
223
|
+
canvas.on('schema:changed', (schema) => {
|
|
224
|
+
console.log('Schema updated in Canvas');
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
canvas.on('sync:start', () => {
|
|
228
|
+
console.log('Sync starting...');
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
canvas.on('sync:complete', (result) => {
|
|
232
|
+
console.log('Sync complete:', result);
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
canvas.on('sync:conflict', (conflict) => {
|
|
236
|
+
console.log('Conflict:', conflict);
|
|
237
|
+
// Handle conflict programmatically
|
|
238
|
+
conflict.resolve('canvas'); // or 'code' or custom merge
|
|
239
|
+
});
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## PSF Regeneration
|
|
243
|
+
|
|
244
|
+
When the schema changes, regenerate derived files:
|
|
245
|
+
|
|
246
|
+
### Automatic Regeneration
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
// canvas.config.ts
|
|
250
|
+
export const config: CanvasConfig = {
|
|
251
|
+
sync: {
|
|
252
|
+
autoGenerate: true,
|
|
253
|
+
generateTargets: ['types', 'components', 'docs', 'rules'],
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Manual Regeneration
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
# Regenerate all
|
|
262
|
+
praxis generate --schema ./schema.psf.json
|
|
263
|
+
|
|
264
|
+
# Regenerate specific targets
|
|
265
|
+
praxis generate --schema ./schema.psf.json --only types,components
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Regeneration API
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
import { generate } from '@plures/praxis/codegen';
|
|
272
|
+
|
|
273
|
+
await generate({
|
|
274
|
+
schema: './schema.psf.json',
|
|
275
|
+
output: './src/generated',
|
|
276
|
+
targets: ['types', 'components', 'docs'],
|
|
277
|
+
options: {
|
|
278
|
+
formatting: 'prettier',
|
|
279
|
+
includeComments: true,
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Version Control
|
|
285
|
+
|
|
286
|
+
### Git Integration
|
|
287
|
+
|
|
288
|
+
Changes from both code and Canvas are tracked by Git:
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
# After making changes in Canvas
|
|
292
|
+
git status
|
|
293
|
+
# modified: src/schema.psf.json
|
|
294
|
+
# modified: src/generated/components/NewComponent.svelte
|
|
295
|
+
|
|
296
|
+
git diff src/schema.psf.json
|
|
297
|
+
# Shows the schema changes made in Canvas
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Merge Conflicts
|
|
301
|
+
|
|
302
|
+
When merging branches with schema changes:
|
|
303
|
+
|
|
304
|
+
1. Git shows conflict in `schema.psf.json`
|
|
305
|
+
2. Use Canvas to resolve visually:
|
|
306
|
+
```bash
|
|
307
|
+
praxis canvas ./schema.psf.json --resolve-conflicts
|
|
308
|
+
```
|
|
309
|
+
3. Or resolve in text editor (JSON merge)
|
|
310
|
+
4. Regenerate after resolution:
|
|
311
|
+
```bash
|
|
312
|
+
praxis generate --schema ./schema.psf.json
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Best Practices
|
|
316
|
+
|
|
317
|
+
### 1. Commit Generated Files (Optional)
|
|
318
|
+
|
|
319
|
+
Choose whether to commit generated files:
|
|
320
|
+
|
|
321
|
+
**Commit generated files:**
|
|
322
|
+
- ✅ Works without build step
|
|
323
|
+
- ✅ Code review shows generated changes
|
|
324
|
+
- ❌ More merge conflicts
|
|
325
|
+
|
|
326
|
+
**.gitignore generated files:**
|
|
327
|
+
- ✅ Cleaner commits
|
|
328
|
+
- ✅ Fewer conflicts
|
|
329
|
+
- ❌ Requires build step
|
|
330
|
+
|
|
331
|
+
### 2. Use Consistent Formatting
|
|
332
|
+
|
|
333
|
+
Configure Prettier for consistent JSON formatting:
|
|
334
|
+
|
|
335
|
+
```json
|
|
336
|
+
// .prettierrc
|
|
337
|
+
{
|
|
338
|
+
"overrides": [
|
|
339
|
+
{
|
|
340
|
+
"files": "*.psf.json",
|
|
341
|
+
"options": {
|
|
342
|
+
"tabWidth": 2,
|
|
343
|
+
"printWidth": 100
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
]
|
|
347
|
+
}
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### 3. Validate Before Commit
|
|
351
|
+
|
|
352
|
+
Add pre-commit hook:
|
|
353
|
+
|
|
354
|
+
```bash
|
|
355
|
+
# .husky/pre-commit
|
|
356
|
+
praxis validate --schema ./src/schema.psf.json
|
|
357
|
+
praxis generate --schema ./src/schema.psf.json --check
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### 4. Document Canvas Usage
|
|
361
|
+
|
|
362
|
+
Add to your project README:
|
|
363
|
+
|
|
364
|
+
```markdown
|
|
365
|
+
## Development
|
|
366
|
+
|
|
367
|
+
### Visual Development
|
|
368
|
+
\`\`\`bash
|
|
369
|
+
praxis canvas ./src/schema.psf.json
|
|
370
|
+
\`\`\`
|
|
371
|
+
|
|
372
|
+
### Code Generation
|
|
373
|
+
\`\`\`bash
|
|
374
|
+
praxis generate --schema ./src/schema.psf.json
|
|
375
|
+
\`\`\`
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
## Troubleshooting
|
|
379
|
+
|
|
380
|
+
### Sync Not Working
|
|
381
|
+
|
|
382
|
+
1. **Check Canvas is running:**
|
|
383
|
+
```bash
|
|
384
|
+
praxis canvas status
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
2. **Check file watcher:**
|
|
388
|
+
```bash
|
|
389
|
+
praxis canvas --debug
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
3. **Verify file permissions:**
|
|
393
|
+
Schema file must be writable
|
|
394
|
+
|
|
395
|
+
### Conflict Loop
|
|
396
|
+
|
|
397
|
+
If sync keeps creating conflicts:
|
|
398
|
+
|
|
399
|
+
1. Stop Canvas
|
|
400
|
+
2. Resolve manually in code
|
|
401
|
+
3. Restart Canvas
|
|
402
|
+
|
|
403
|
+
### Generated Files Out of Sync
|
|
404
|
+
|
|
405
|
+
Force regeneration:
|
|
406
|
+
|
|
407
|
+
```bash
|
|
408
|
+
praxis generate --schema ./schema.psf.json --force
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
### Canvas Shows Stale Data
|
|
412
|
+
|
|
413
|
+
Clear Canvas cache:
|
|
414
|
+
|
|
415
|
+
```bash
|
|
416
|
+
praxis canvas --clear-cache
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
## Advanced: Custom Sync
|
|
420
|
+
|
|
421
|
+
### Custom Sync Handler
|
|
422
|
+
|
|
423
|
+
```typescript
|
|
424
|
+
import { createSyncHandler } from '@plures/praxis/sync';
|
|
425
|
+
|
|
426
|
+
const handler = createSyncHandler({
|
|
427
|
+
// Called when code changes
|
|
428
|
+
onCodeChange: async (schema) => {
|
|
429
|
+
// Custom logic before Canvas update
|
|
430
|
+
return schema; // Transformed schema
|
|
431
|
+
},
|
|
432
|
+
|
|
433
|
+
// Called when Canvas changes
|
|
434
|
+
onCanvasChange: async (schema) => {
|
|
435
|
+
// Custom logic before code update
|
|
436
|
+
return schema; // Transformed schema
|
|
437
|
+
},
|
|
438
|
+
|
|
439
|
+
// Custom conflict resolution
|
|
440
|
+
onConflict: async (local, remote) => {
|
|
441
|
+
// Return merged schema
|
|
442
|
+
return mergeSchemas(local, remote);
|
|
443
|
+
},
|
|
444
|
+
});
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
### External Tool Integration
|
|
448
|
+
|
|
449
|
+
Integrate with other tools:
|
|
450
|
+
|
|
451
|
+
```typescript
|
|
452
|
+
import { createPSFWatcher } from '@plures/praxis';
|
|
453
|
+
|
|
454
|
+
// Watch for PSF changes from any source
|
|
455
|
+
const watcher = createPSFWatcher('./schema.psf.json');
|
|
456
|
+
|
|
457
|
+
watcher.on('change', async (schema) => {
|
|
458
|
+
// Update external system (e.g., database, API)
|
|
459
|
+
await updateExternalSystem(schema);
|
|
460
|
+
|
|
461
|
+
// Notify other tools
|
|
462
|
+
eventBus.emit('schema-updated', schema);
|
|
463
|
+
});
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
---
|
|
467
|
+
|
|
468
|
+
**Next:** [CLI Usage](./cli-usage.md)
|