domainforge 0.13.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.
- package/.cargo/config.toml +6 -0
- package/.claude/settings.local.json +18 -0
- package/.coderabbit.yml +43 -0
- package/.codex/skills/release-management/SKILL.md +151 -0
- package/.codex/skills/release-management/agents/openai.yaml +4 -0
- package/.github/actions/decrypt-secrets/action.yml +121 -0
- package/.github/agents/Coder.agent.md +97 -0
- package/.github/agents/DeepResearch.agent.md +61 -0
- package/.github/chatmodes/tdd.vibepro.chatmode.md +1183 -0
- package/.github/copilot-instructions.md +13 -0
- package/.github/dependabot.yml +68 -0
- package/.github/workflows/README.md +165 -0
- package/.github/workflows/ci.yml +335 -0
- package/.github/workflows/dependabot-automerge.yml +114 -0
- package/.github/workflows/dependency-review.yml +27 -0
- package/.github/workflows/deploy.yml +87 -0
- package/.github/workflows/prepare-release.yml +168 -0
- package/.github/workflows/release-crates.yml +42 -0
- package/.github/workflows/release-npm.yml +137 -0
- package/.github/workflows/release-please.yml +29 -0
- package/.github/workflows/release-pypi.yml +96 -0
- package/.gitkeep +1 -0
- package/.release-please-manifest.json +5 -0
- package/.sea-registry.toml +10 -0
- package/.serena/project.yml +133 -0
- package/.sops.yaml +10 -0
- package/AGENTS.md +216 -0
- package/CHANGELOG.md +400 -0
- package/CLAUDE.md +62 -0
- package/CONTRIBUTING.md +323 -0
- package/Cargo.lock +3612 -0
- package/Cargo.toml +12 -0
- package/LICENSE +201 -0
- package/README.md +660 -0
- package/README_PYTHON.md +256 -0
- package/README_TYPESCRIPT.md +305 -0
- package/README_WASM.md +329 -0
- package/RELEASE_NOTES.md +41 -0
- package/bun.lock +378 -0
- package/bunfig.toml +11 -0
- package/check_output.txt +83 -0
- package/clippy_output.txt +80 -0
- package/commitlint.config.cjs +8 -0
- package/deny.toml +42 -0
- package/devbox.json +14 -0
- package/devbox.lock +76 -0
- package/docs/RELEASE_PROCESS.md +360 -0
- package/docs/diagnostics.md +161 -0
- package/docs/doc_guidelines.md +53 -0
- package/docs/explanations/README.md +21 -0
- package/docs/explanations/architecture-overview.md +109 -0
- package/docs/explanations/cross-language-binding-strategy.md +68 -0
- package/docs/explanations/graph-store-design.md +47 -0
- package/docs/explanations/performance-benchmarks.md +63 -0
- package/docs/explanations/policy-evaluation-logic.md +106 -0
- package/docs/explanations/semantic-modeling-concepts.md +109 -0
- package/docs/explanations/three-valued-logic.md +66 -0
- package/docs/explanations/versioning-strategy.md +45 -0
- package/docs/governance.md +168 -0
- package/docs/how-tos/README.md +46 -0
- package/docs/how-tos/ci-cd-validation.md +93 -0
- package/docs/how-tos/create-custom-units.md +125 -0
- package/docs/how-tos/define-policies.md +119 -0
- package/docs/how-tos/export-to-calm.md +110 -0
- package/docs/how-tos/export-to-protobuf.md +312 -0
- package/docs/how-tos/extend-grammar.md +133 -0
- package/docs/how-tos/generate-rdf-turtle.md +106 -0
- package/docs/how-tos/import-from-calm.md +114 -0
- package/docs/how-tos/import-from-sbvr.md +249 -0
- package/docs/how-tos/install-cli.md +126 -0
- package/docs/how-tos/parse-sea-files.md +132 -0
- package/docs/how-tos/policy-evaluation-modes.md +30 -0
- package/docs/how-tos/run-cross-language-tests.md +115 -0
- package/docs/how-tos/troubleshoot-napi-builds.md +55 -0
- package/docs/how-tos/use-modules-imports.md +285 -0
- package/docs/index.md +13 -0
- package/docs/plans/canonical-normalizer.md +121 -0
- package/docs/plans/cd_improvement.md +112 -0
- package/docs/plans/cli-ast.md +29 -0
- package/docs/plans/expression-bindings-and-normalizer-integration.md +174 -0
- package/docs/plans/protobuf_advanced_features_plan.md +597 -0
- package/docs/plans/protobuf_plan.yml +525 -0
- package/docs/plans/refactor_dsl_architecture.md +131 -0
- package/docs/plans/release-plan.md +163 -0
- package/docs/plans/sea_fmt_implementation_plan.md +516 -0
- package/docs/playbooks/README.md +18 -0
- package/docs/playbooks/adding-new-primitive.md +68 -0
- package/docs/playbooks/debugging-parser-failures.md +42 -0
- package/docs/playbooks/local-release-preparation.md +139 -0
- package/docs/playbooks/migrating-schema-versions.md +43 -0
- package/docs/playbooks/onboarding-contributors.md +64 -0
- package/docs/playbooks/releasing-beta.md +86 -0
- package/docs/playbooks/secret-management.md +64 -0
- package/docs/reference/README.md +199 -0
- package/docs/reference/ast-json-api.md +427 -0
- package/docs/reference/calm-mapping.md +519 -0
- package/docs/reference/cli-commands.md +588 -0
- package/docs/reference/configuration.md +202 -0
- package/docs/reference/error-codes.md +664 -0
- package/docs/reference/generated-artifacts-policy.md +53 -0
- package/docs/reference/grammar-spec.md +255 -0
- package/docs/reference/primitives-api.md +317 -0
- package/docs/reference/protobuf-api.md +426 -0
- package/docs/reference/python-api.md +485 -0
- package/docs/reference/registry.md +50 -0
- package/docs/reference/sea-dsl-ai-cheatsheet.yaml +913 -0
- package/docs/reference/security-model.md +74 -0
- package/docs/reference/typescript-api.md +508 -0
- package/docs/reference/wasm-api.md +420 -0
- package/docs/semantic-pack-review.md +144 -0
- package/docs/semantic-pack-signing.md +234 -0
- package/docs/semantic-packs.md +284 -0
- package/docs/specs/ADR-001-sea-dsl-semantic-source-of-truth.md +33 -0
- package/docs/specs/ADR-002-projection-first-class-construct.md +50 -0
- package/docs/specs/ADR-003-protobuf-projection-target.md +51 -0
- package/docs/specs/ADR-004-projection-compatibility-semantics.md +57 -0
- package/docs/specs/ADR-005-multi-language-support-strategy.md +112 -0
- package/docs/specs/ADR-006-error-handling-strategy.md +115 -0
- package/docs/specs/ADR-007-policy-evaluation-engine.md +95 -0
- package/docs/specs/ADR-008-knowledge-graph-integration.md +90 -0
- package/docs/specs/ADR-009-module-resolution-strategy.md +115 -0
- package/docs/specs/ADR-010-unit-system.md +106 -0
- package/docs/specs/PRD-001-sea-projection-framework.md +155 -0
- package/docs/specs/PRD-002-sea-cli-tooling.md +169 -0
- package/docs/specs/PRD-003-dsl-core-capabilities.md +275 -0
- package/docs/specs/README.md +62 -0
- package/docs/specs/SDS-001-protobuf-projection-engine.md +451 -0
- package/docs/specs/SDS-002-sea-core-architecture.md +268 -0
- package/docs/specs/SDS-003-parser-semantic-graph.md +377 -0
- package/docs/specs/SDS-004-policy-engine-design.md +362 -0
- package/docs/specs/SDS-005-knowledge-graph-module.md +364 -0
- package/docs/specs/SDS-006-calm-integration.md +367 -0
- package/docs/specs/SDS-007-sbvr-import.md +347 -0
- package/docs/templates/template_explanation.md +14 -0
- package/docs/templates/template_howto.md +21 -0
- package/docs/templates/template_playbook.md +21 -0
- package/docs/templates/template_reference.md +17 -0
- package/docs/templates/template_tutorial.md +24 -0
- package/docs/tutorials/README.md +12 -0
- package/docs/tutorials/first-sea-model.md +85 -0
- package/docs/tutorials/getting-started.md +98 -0
- package/docs/tutorials/python-binding-quickstart.md +107 -0
- package/docs/tutorials/typescript-binding-quickstart.md +91 -0
- package/docs/tutorials/wasm-in-browser.md +75 -0
- package/domainforge-core/CHANGELOG.md +138 -0
- package/domainforge-core/Cargo.toml +101 -0
- package/domainforge-core/MIGRATING.md +32 -0
- package/domainforge-core/README.md +197 -0
- package/domainforge-core/benchmark_results.txt +51 -0
- package/domainforge-core/build.rs +6 -0
- package/domainforge-core/deny.toml +31 -0
- package/domainforge-core/docs/specs/projections/sbvr_kg_mapping.md +43 -0
- package/domainforge-core/examples/basic.sea +7 -0
- package/domainforge-core/examples/cli/import_export_workflow.sh +38 -0
- package/domainforge-core/examples/cli/validate_example.sh +30 -0
- package/domainforge-core/examples/evolution_semantics.sea +31 -0
- package/domainforge-core/examples/parser_demo.rs +203 -0
- package/domainforge-core/grammar/sea.pest +408 -0
- package/domainforge-core/schemas/calm-v1.schema.json +170 -0
- package/domainforge-core/schemas/shacl/sea_shapes.ttl +19 -0
- package/domainforge-core/src/authority/compiler.rs +309 -0
- package/domainforge-core/src/authority/environment.rs +203 -0
- package/domainforge-core/src/authority/error.rs +164 -0
- package/domainforge-core/src/authority/fact_resolver.rs +224 -0
- package/domainforge-core/src/authority/mod.rs +25 -0
- package/domainforge-core/src/authority/pack.rs +133 -0
- package/domainforge-core/src/authority/policy.rs +224 -0
- package/domainforge-core/src/authority/resolver.rs +446 -0
- package/domainforge-core/src/authority/trace.rs +217 -0
- package/domainforge-core/src/authority/transform.rs +168 -0
- package/domainforge-core/src/authority/types.rs +617 -0
- package/domainforge-core/src/bin/domainforge.rs +25 -0
- package/domainforge-core/src/calm/export.rs +538 -0
- package/domainforge-core/src/calm/import.rs +1220 -0
- package/domainforge-core/src/calm/mod.rs +9 -0
- package/domainforge-core/src/calm/models.rs +108 -0
- package/domainforge-core/src/calm/sbvr_import.rs +9 -0
- package/domainforge-core/src/cli/authority.rs +149 -0
- package/domainforge-core/src/cli/format.rs +85 -0
- package/domainforge-core/src/cli/import.rs +133 -0
- package/domainforge-core/src/cli/mod.rs +64 -0
- package/domainforge-core/src/cli/normalize.rs +180 -0
- package/domainforge-core/src/cli/pack.rs +904 -0
- package/domainforge-core/src/cli/parse.rs +112 -0
- package/domainforge-core/src/cli/project.rs +294 -0
- package/domainforge-core/src/cli/registry.rs +41 -0
- package/domainforge-core/src/cli/test.rs +12 -0
- package/domainforge-core/src/cli/validate.rs +195 -0
- package/domainforge-core/src/cli/validate_kg.rs +80 -0
- package/domainforge-core/src/concept_id.rs +89 -0
- package/domainforge-core/src/error/diagnostics.rs +426 -0
- package/domainforge-core/src/error/fuzzy.rs +253 -0
- package/domainforge-core/src/error/mod.rs +13 -0
- package/domainforge-core/src/formatter/comments.rs +223 -0
- package/domainforge-core/src/formatter/config.rs +114 -0
- package/domainforge-core/src/formatter/mod.rs +22 -0
- package/domainforge-core/src/formatter/printer.rs +906 -0
- package/domainforge-core/src/graph/mod.rs +858 -0
- package/domainforge-core/src/graph/to_ast.rs +66 -0
- package/domainforge-core/src/kg.rs +1476 -0
- package/domainforge-core/src/kg_import.rs +251 -0
- package/domainforge-core/src/lib.rs +203 -0
- package/domainforge-core/src/module/mod.rs +1 -0
- package/domainforge-core/src/module/resolver.rs +260 -0
- package/domainforge-core/src/parser/ast.rs +2919 -0
- package/domainforge-core/src/parser/ast_convert.rs +494 -0
- package/domainforge-core/src/parser/ast_schema.rs +491 -0
- package/domainforge-core/src/parser/error.rs +291 -0
- package/domainforge-core/src/parser/lint.rs +39 -0
- package/domainforge-core/src/parser/mod.rs +193 -0
- package/domainforge-core/src/parser/printer.rs +702 -0
- package/domainforge-core/src/parser/profiles.rs +71 -0
- package/domainforge-core/src/parser/string_utils.rs +138 -0
- package/domainforge-core/src/patterns.rs +68 -0
- package/domainforge-core/src/policy/core.rs +1148 -0
- package/domainforge-core/src/policy/expression.rs +399 -0
- package/domainforge-core/src/policy/mod.rs +18 -0
- package/domainforge-core/src/policy/normalize.rs +1028 -0
- package/domainforge-core/src/policy/quantifier.rs +940 -0
- package/domainforge-core/src/policy/three_valued.rs +140 -0
- package/domainforge-core/src/policy/three_valued_microbench.rs +104 -0
- package/domainforge-core/src/policy/type_inference.rs +67 -0
- package/domainforge-core/src/policy/violation.rs +36 -0
- package/domainforge-core/src/primitives/concept_change.rs +61 -0
- package/domainforge-core/src/primitives/entity.rs +224 -0
- package/domainforge-core/src/primitives/flow.rs +111 -0
- package/domainforge-core/src/primitives/instance.rs +93 -0
- package/domainforge-core/src/primitives/mapping_contract.rs +50 -0
- package/domainforge-core/src/primitives/metric.rs +79 -0
- package/domainforge-core/src/primitives/mod.rs +25 -0
- package/domainforge-core/src/primitives/projection_contract.rs +50 -0
- package/domainforge-core/src/primitives/quantity.rs +56 -0
- package/domainforge-core/src/primitives/relation.rs +68 -0
- package/domainforge-core/src/primitives/resource.rs +237 -0
- package/domainforge-core/src/primitives/resource_instance.rs +88 -0
- package/domainforge-core/src/primitives/role.rs +49 -0
- package/domainforge-core/src/projection/buf.rs +404 -0
- package/domainforge-core/src/projection/contracts.rs +22 -0
- package/domainforge-core/src/projection/engine.rs +19 -0
- package/domainforge-core/src/projection/mod.rs +16 -0
- package/domainforge-core/src/projection/protobuf.rs +3331 -0
- package/domainforge-core/src/projection/registry.rs +43 -0
- package/domainforge-core/src/python/authority.rs +253 -0
- package/domainforge-core/src/python/error.rs +227 -0
- package/domainforge-core/src/python/formatter.rs +86 -0
- package/domainforge-core/src/python/graph.rs +366 -0
- package/domainforge-core/src/python/mod.rs +9 -0
- package/domainforge-core/src/python/policy.rs +651 -0
- package/domainforge-core/src/python/primitives.rs +796 -0
- package/domainforge-core/src/python/registry.rs +98 -0
- package/domainforge-core/src/python/semantic_pack.rs +619 -0
- package/domainforge-core/src/python/units.rs +96 -0
- package/domainforge-core/src/registry/mod.rs +432 -0
- package/domainforge-core/src/registry/tests.rs +210 -0
- package/domainforge-core/src/sbvr.rs +744 -0
- package/domainforge-core/src/semantic_pack/builder.rs +470 -0
- package/domainforge-core/src/semantic_pack/canonical_json.rs +184 -0
- package/domainforge-core/src/semantic_pack/diagnostics.rs +214 -0
- package/domainforge-core/src/semantic_pack/diff.rs +216 -0
- package/domainforge-core/src/semantic_pack/mod.rs +31 -0
- package/domainforge-core/src/semantic_pack/pack_set.rs +240 -0
- package/domainforge-core/src/semantic_pack/resolver.rs +437 -0
- package/domainforge-core/src/semantic_pack/review.rs +125 -0
- package/domainforge-core/src/semantic_pack/schema.rs +342 -0
- package/domainforge-core/src/semantic_pack/signing.rs +105 -0
- package/domainforge-core/src/semantic_pack/validator.rs +368 -0
- package/domainforge-core/src/semantic_version.rs +140 -0
- package/domainforge-core/src/test_utils.rs +12 -0
- package/domainforge-core/src/typescript/authority.rs +184 -0
- package/domainforge-core/src/typescript/error.rs +146 -0
- package/domainforge-core/src/typescript/formatter.rs +76 -0
- package/domainforge-core/src/typescript/graph.rs +391 -0
- package/domainforge-core/src/typescript/mod.rs +9 -0
- package/domainforge-core/src/typescript/policy.rs +564 -0
- package/domainforge-core/src/typescript/primitives.rs +784 -0
- package/domainforge-core/src/typescript/registry.rs +88 -0
- package/domainforge-core/src/typescript/semantic_pack.rs +470 -0
- package/domainforge-core/src/typescript/units.rs +76 -0
- package/domainforge-core/src/units/mod.rs +462 -0
- package/domainforge-core/src/uuid_module.rs +42 -0
- package/domainforge-core/src/validation_error.rs +818 -0
- package/domainforge-core/src/validation_result.rs +30 -0
- package/domainforge-core/src/wasm/authority.rs +192 -0
- package/domainforge-core/src/wasm/error.rs +145 -0
- package/domainforge-core/src/wasm/formatter.rs +69 -0
- package/domainforge-core/src/wasm/graph.rs +471 -0
- package/domainforge-core/src/wasm/mod.rs +16 -0
- package/domainforge-core/src/wasm/policy.rs +607 -0
- package/domainforge-core/src/wasm/primitives.rs +295 -0
- package/domainforge-core/src/wasm/semantic_pack.rs +471 -0
- package/domainforge-core/src/wasm/units.rs +62 -0
- package/domainforge-core/std/aws.sea +6 -0
- package/domainforge-core/std/core.sea +6 -0
- package/domainforge-core/std/http.sea +27 -0
- package/domainforge-core/tests/aggregation_enhanced_tests.rs +162 -0
- package/domainforge-core/tests/aggregation_eval_tests.rs +248 -0
- package/domainforge-core/tests/aggregation_integration_tests.rs +379 -0
- package/domainforge-core/tests/aggregation_parser_tests.rs +92 -0
- package/domainforge-core/tests/aggregation_tests.rs +102 -0
- package/domainforge-core/tests/authority_conformance_tests.rs +1173 -0
- package/domainforge-core/tests/calm_round_trip_tests.rs +283 -0
- package/domainforge-core/tests/calm_schema_validation_tests.rs +137 -0
- package/domainforge-core/tests/cast_operator_tests.rs +85 -0
- package/domainforge-core/tests/cli_binary_check.rs +37 -0
- package/domainforge-core/tests/cli_import_tests.rs +291 -0
- package/domainforge-core/tests/cli_path_traversal_tests.rs +124 -0
- package/domainforge-core/tests/cli_tests.rs +63 -0
- package/domainforge-core/tests/diagnostics_tests.rs +203 -0
- package/domainforge-core/tests/dimension_unit_tests.rs +80 -0
- package/domainforge-core/tests/entity_tests.rs +69 -0
- package/domainforge-core/tests/evolution_semantics_tests.rs +157 -0
- package/domainforge-core/tests/flow_tests.rs +78 -0
- package/domainforge-core/tests/flow_unit_validation_tests.rs +31 -0
- package/domainforge-core/tests/graph_integration_tests.rs +218 -0
- package/domainforge-core/tests/graph_tests.rs +626 -0
- package/domainforge-core/tests/import_parsing_tests.rs +23 -0
- package/domainforge-core/tests/instance_integration_tests.rs +98 -0
- package/domainforge-core/tests/instance_parsing_tests.rs +58 -0
- package/domainforge-core/tests/instance_tests.rs +61 -0
- package/domainforge-core/tests/kg_uri_encoding_tests.rs +53 -0
- package/domainforge-core/tests/lint_tests.rs +19 -0
- package/domainforge-core/tests/metric_tests.rs +143 -0
- package/domainforge-core/tests/module_resolution_tests.rs +100 -0
- package/domainforge-core/tests/namespace_registry_tests.rs +247 -0
- package/domainforge-core/tests/null_handling_tests.rs +26 -0
- package/domainforge-core/tests/parser_ast_v3.rs +53 -0
- package/domainforge-core/tests/parser_dimension_registry_tests.rs +20 -0
- package/domainforge-core/tests/parser_integration_tests.rs +294 -0
- package/domainforge-core/tests/parser_metadata_tests.rs +97 -0
- package/domainforge-core/tests/parser_resource_domain_only_graph_test.rs +21 -0
- package/domainforge-core/tests/parser_resource_limits_tests.rs +122 -0
- package/domainforge-core/tests/parser_tests.rs +512 -0
- package/domainforge-core/tests/pattern_semantics_tests.rs +87 -0
- package/domainforge-core/tests/phase_14_determinism_tests.rs +166 -0
- package/domainforge-core/tests/phase_15_validation_error_tests.rs +136 -0
- package/domainforge-core/tests/phase_16_unicode_tests.rs +248 -0
- package/domainforge-core/tests/phase_17_export_tests.rs +285 -0
- package/domainforge-core/tests/phase_17_round_trip_tests.rs +264 -0
- package/domainforge-core/tests/policy_tests.rs +635 -0
- package/domainforge-core/tests/primitives_integration_tests.rs +151 -0
- package/domainforge-core/tests/print_rdf_xml.rs +14 -0
- package/domainforge-core/tests/printer_tests.rs +204 -0
- package/domainforge-core/tests/profile_tests.rs +35 -0
- package/domainforge-core/tests/projection_contracts_tests.rs +154 -0
- package/domainforge-core/tests/protobuf_projection_tests.rs +199 -0
- package/domainforge-core/tests/quantity_tests.rs +41 -0
- package/domainforge-core/tests/rdf_xml_typed_literal_tests.rs +105 -0
- package/domainforge-core/tests/registry_schema_tests.rs +33 -0
- package/domainforge-core/tests/resource_tests.rs +50 -0
- package/domainforge-core/tests/resource_unit_tests.rs +24 -0
- package/domainforge-core/tests/roles_relations_tests.rs +61 -0
- package/domainforge-core/tests/round_trip_tests.rs +34 -0
- package/domainforge-core/tests/runtime_toggle_tests.rs +70 -0
- package/domainforge-core/tests/sbvr_fact_schema_tests.rs +60 -0
- package/domainforge-core/tests/sbvr_flow_facts_tests.rs +55 -0
- package/domainforge-core/tests/sbvr_parsing_tests.rs +53 -0
- package/domainforge-core/tests/semantic_pack_alias_resolution.rs +197 -0
- package/domainforge-core/tests/semantic_pack_build.rs +302 -0
- package/domainforge-core/tests/semantic_pack_consumer_smoke.rs +150 -0
- package/domainforge-core/tests/semantic_pack_pack_set.rs +160 -0
- package/domainforge-core/tests/semantic_pack_signing.rs +157 -0
- package/domainforge-core/tests/semantic_pack_three_valued.rs +250 -0
- package/domainforge-core/tests/semantic_pack_validate.rs +196 -0
- package/domainforge-core/tests/std_lib_tests.rs +37 -0
- package/domainforge-core/tests/temporal_evaluation_tests.rs +159 -0
- package/domainforge-core/tests/temporal_semantics_tests.rs +214 -0
- package/domainforge-core/tests/three_valued_quantifiers_tests.rs +164 -0
- package/domainforge-core/tests/turtle_entity_export_tests.rs +38 -0
- package/domainforge-core/tests/turtle_escaping_tests.rs +53 -0
- package/domainforge-core/tests/turtle_resource_export_tests.rs +34 -0
- package/domainforge-core/tests/type_inference_tests.rs +40 -0
- package/domainforge-core/tests/unicode_validation_tests.rs +169 -0
- package/domainforge-core/tests/unit_tests.rs +81 -0
- package/domainforge-core/tests/validate_tests.rs +38 -0
- package/domainforge-core/tests/validation_unit_mismatch_tests.rs +83 -0
- package/domainforge-core/tests/wasm_tests.rs +229 -0
- package/domainforge-python/CHANGELOG-python.md +12 -0
- package/domainforge-python/MIGRATING.md +24 -0
- package/domainforge-python/README.md +256 -0
- package/domainforge-python/domainforge/__init__.py +95 -0
- package/domainforge-python/domainforge/domainforge.pyi +519 -0
- package/domainforge-python/pyproject.toml +36 -0
- package/domainforge-typescript/CHANGELOG-typescript.md +12 -0
- package/domainforge-typescript/LICENSE +201 -0
- package/domainforge-typescript/MIGRATING.md +24 -0
- package/domainforge-typescript/README.md +305 -0
- package/domainforge-typescript/index.d.ts +452 -0
- package/domainforge-typescript/index.js +361 -0
- package/domainforge-typescript/package.json +60 -0
- package/example.js +61 -0
- package/examples/browser.html +366 -0
- package/examples/namespaces/finance/cashflow.sea +5 -0
- package/examples/namespaces/logistics/core.sea +7 -0
- package/examples/observability_metrics.sea +38 -0
- package/fixtures/semantic_packs/acme_procurement/domain/entities.sea +39 -0
- package/fixtures/semantic_packs/acme_procurement/domain/metrics.sea +11 -0
- package/fixtures/semantic_packs/acme_procurement/domain/relations.sea +7 -0
- package/fixtures/semantic_packs/acme_procurement/domain/resources.sea +9 -0
- package/fixtures/semantic_packs/acme_procurement/review/acme.procurement.semantic-review.jsonl +7 -0
- package/fixtures/semantic_packs/acme_procurement/tests/ambiguous_vendor_alias.sea +8 -0
- package/fixtures/semantic_packs/acme_procurement/tests/deprecated_vendor_alias.sea +8 -0
- package/fixtures/semantic_packs/acme_procurement/tests/invalid_relation.sea +3 -0
- package/fixtures/semantic_packs/acme_procurement/tests/proposed_concept.sea +8 -0
- package/fixtures/semantic_packs/acme_procurement/tests/rejected_concept.sea +8 -0
- package/fixtures/semantic_packs/acme_procurement/tests/unit_mismatch.sea +7 -0
- package/fixtures/semantic_packs/acme_procurement/tests/unknown_vendor_policy.sea +8 -0
- package/fixtures/semantic_packs/acme_procurement/tests/valid_purchase_policy.sea +8 -0
- package/index.d.ts +2 -0
- package/index.js +8 -0
- package/justfile +200 -0
- package/lefthook.yml +13 -0
- package/lib/validate_native_exports.d.ts +4 -0
- package/lib/validate_native_exports.js +12 -0
- package/package.json +22 -0
- package/pytest.ini +5 -0
- package/python/tests/test_registry.py +75 -0
- package/python/tests/test_units.py +18 -0
- package/release-please-config.json +49 -0
- package/requirements-dev.txt +3 -0
- package/requirements.txt +3 -0
- package/rust-toolchain.toml +3 -0
- package/schemas/ast-v1.schema.json +72 -0
- package/schemas/ast-v2.schema.json +1200 -0
- package/schemas/ast-v3.schema.json +1200 -0
- package/schemas/sea-registry.schema.json +45 -0
- package/scripts/build-python.sh +37 -0
- package/scripts/build-release.sh +279 -0
- package/scripts/build-typescript.sh +13 -0
- package/scripts/build-wasm.sh +113 -0
- package/scripts/bump-version.sh +245 -0
- package/scripts/check_unused_test_imports.py +85 -0
- package/scripts/ci_tasks.py +379 -0
- package/scripts/clear_debug_test.sh +10 -0
- package/scripts/create-github-release.sh +262 -0
- package/scripts/create-tag.sh +203 -0
- package/scripts/find_and_link_test_binary.sh +70 -0
- package/scripts/generate-changelog.sh +271 -0
- package/scripts/generate-release-notes.sh +205 -0
- package/scripts/lint_release_security.py +96 -0
- package/scripts/lint_release_workflows.py +82 -0
- package/scripts/lint_workflow_gates.py +113 -0
- package/scripts/optimized-wasm-build.sh +61 -0
- package/scripts/patch_napi_types.py +62 -0
- package/scripts/pre-release-check.sh +289 -0
- package/scripts/prepare_rust_debug.sh +52 -0
- package/scripts/release.sh +373 -0
- package/scripts/resolve_rust_binary.py +230 -0
- package/scripts/run_commitlint.sh +29 -0
- package/scripts/test-all.sh +77 -0
- package/scripts/update_launch_program.py +93 -0
- package/secrets/README.md +27 -0
- package/secrets/secrets.yaml +21 -0
- package/test_integration.py +67 -0
- package/tests/test_authority.py +328 -0
- package/tests/test_ci_tasks.py +143 -0
- package/tests/test_expression.py +256 -0
- package/tests/test_golden_payment_flow.py +42 -0
- package/tests/test_graph.py +127 -0
- package/tests/test_instance.py +136 -0
- package/tests/test_parser.py +82 -0
- package/tests/test_primitives.py +68 -0
- package/tests/test_role_relation_parity.py +56 -0
- package/tests/test_runtime_toggle.py +156 -0
- package/tests/test_semantic_pack.py +639 -0
- package/tests/test_three_valued_eval.py +159 -0
- package/tsconfig.json +30 -0
- package/typescript-tests/advanced.test.ts +165 -0
- package/typescript-tests/authority.test.ts +216 -0
- package/typescript-tests/expression.test.ts +228 -0
- package/typescript-tests/golden-payment-flow.test.ts +51 -0
- package/typescript-tests/graph.test.ts +142 -0
- package/typescript-tests/native-binding.test.ts +20 -0
- package/typescript-tests/primitives.test.ts +88 -0
- package/typescript-tests/registry.test.ts +122 -0
- package/typescript-tests/role_relation.test.ts +63 -0
- package/typescript-tests/runtime_toggle.test.ts +141 -0
- package/typescript-tests/semantic-pack.test.ts +556 -0
- package/typescript-tests/three_valued_eval.test.ts +135 -0
- package/typescript-tests/units.test.ts +36 -0
- package/vitest.config.ts +13 -0
- package/wasm_demo.html +225 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Explanation Template
|
|
2
|
+
|
|
3
|
+
Title:
|
|
4
|
+
Summary: (Explain the concept, context and why it matters)
|
|
5
|
+
|
|
6
|
+
## Details
|
|
7
|
+
|
|
8
|
+
- Provide diagrams and examples
|
|
9
|
+
- Clarify tradeoffs and design decisions
|
|
10
|
+
|
|
11
|
+
## Links
|
|
12
|
+
|
|
13
|
+
- Deeper reference pages
|
|
14
|
+
- How-Tos that use the concept
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Playbook Template
|
|
2
|
+
|
|
3
|
+
Title:
|
|
4
|
+
Scope: (What incidents or workflows this covers)
|
|
5
|
+
|
|
6
|
+
## Prerequisites and safety checks
|
|
7
|
+
|
|
8
|
+
-
|
|
9
|
+
|
|
10
|
+
## Step-by-step runbook
|
|
11
|
+
|
|
12
|
+
1.
|
|
13
|
+
2.
|
|
14
|
+
|
|
15
|
+
## Rollback steps
|
|
16
|
+
|
|
17
|
+
## Contacts & Escalation
|
|
18
|
+
|
|
19
|
+
## Links
|
|
20
|
+
|
|
21
|
+
- Related How-Tos and Reference
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Reference Template
|
|
2
|
+
|
|
3
|
+
## Title
|
|
4
|
+
Replace with the title of this reference.
|
|
5
|
+
|
|
6
|
+
## Summary
|
|
7
|
+
What this reference covers.
|
|
8
|
+
|
|
9
|
+
## Shape & Schema
|
|
10
|
+
|
|
11
|
+
- JSON/YAML examples if applicable
|
|
12
|
+
- Code samples for API usage
|
|
13
|
+
|
|
14
|
+
## Notes & Links
|
|
15
|
+
|
|
16
|
+
- Backwards compatibility
|
|
17
|
+
- Related APIs
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Tutorial Template
|
|
2
|
+
|
|
3
|
+
Title:
|
|
4
|
+
Audience:
|
|
5
|
+
Goal:
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
- List the required tools, versions, and any environment setup.
|
|
10
|
+
|
|
11
|
+
## Steps
|
|
12
|
+
|
|
13
|
+
1. Step 1: Briefly describe the first action readers must take.
|
|
14
|
+
2. Step 2: Explain the next key change or command to run.
|
|
15
|
+
3. Step 3: Note how to verify the step or transition to the next phase.
|
|
16
|
+
|
|
17
|
+
## Result / Verify
|
|
18
|
+
|
|
19
|
+
## Troubleshooting
|
|
20
|
+
|
|
21
|
+
## Links
|
|
22
|
+
|
|
23
|
+
- Related How-Tos
|
|
24
|
+
- Reference pages
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Tutorials — DomainForge
|
|
2
|
+
|
|
3
|
+
Purpose: Provide task-based, goal-oriented walkthroughs for users who want to accomplish a larger goal and learn by doing.
|
|
4
|
+
|
|
5
|
+
MECE checklist for tutorials:
|
|
6
|
+
|
|
7
|
+
- Audience: beginner/experienced
|
|
8
|
+
- Learning outcome: what users will be able to do
|
|
9
|
+
- Prerequisites: environment and tools
|
|
10
|
+
- Step-by-step instructions with example inputs and outputs
|
|
11
|
+
- Troubleshooting/FAQ
|
|
12
|
+
- Links to related How-Tos and Reference docs
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Building Your First Complete SEA Model
|
|
2
|
+
|
|
3
|
+
In this tutorial, we will build a comprehensive domain model for a fictional E-Commerce system. We will cover Entities, Resources, Flows, and Instances.
|
|
4
|
+
|
|
5
|
+
## The Scenario
|
|
6
|
+
|
|
7
|
+
We are modeling "ShopEasy", an online store. It has:
|
|
8
|
+
- A **Storefront** (Web App)
|
|
9
|
+
- An **Order Service** (Backend API)
|
|
10
|
+
- A **Payment Gateway** (External Service)
|
|
11
|
+
- An **Order Database** (Storage)
|
|
12
|
+
|
|
13
|
+
## Step 1: Define Entities
|
|
14
|
+
|
|
15
|
+
Create a file `shopeasy.sea`. Start by defining the active components.
|
|
16
|
+
|
|
17
|
+
```sea
|
|
18
|
+
@namespace "shopeasy"
|
|
19
|
+
|
|
20
|
+
Entity "Storefront"
|
|
21
|
+
Entity "OrderService"
|
|
22
|
+
Entity "PaymentGateway"
|
|
23
|
+
Entity "OrderDatabase"
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Step 2: Define Resources
|
|
27
|
+
|
|
28
|
+
Now define the passive infrastructure.
|
|
29
|
+
|
|
30
|
+
```sea
|
|
31
|
+
Resource "OrderRequest" units
|
|
32
|
+
Resource "OrderRecord" units
|
|
33
|
+
Resource "PaymentIntent" units
|
|
34
|
+
Resource "ConfirmationMessage" units
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Step 3: Connect with Flows
|
|
38
|
+
|
|
39
|
+
Model how these components interact.
|
|
40
|
+
|
|
41
|
+
```sea
|
|
42
|
+
Flow "OrderRequest" from "Storefront" to "OrderService"
|
|
43
|
+
Flow "OrderRecord" from "OrderService" to "OrderDatabase"
|
|
44
|
+
Flow "PaymentIntent" from "OrderService" to "PaymentGateway"
|
|
45
|
+
Flow "ConfirmationMessage" from "OrderService" to "Storefront"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Step 4: Define Instances
|
|
49
|
+
|
|
50
|
+
Model the physical deployment in the production environment.
|
|
51
|
+
|
|
52
|
+
```sea
|
|
53
|
+
Instance prod_order_service of "OrderService" {
|
|
54
|
+
env: "production",
|
|
55
|
+
replicas: 3
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
Instance prod_db of "OrderDatabase" {
|
|
59
|
+
env: "production",
|
|
60
|
+
region: "us-west-2"
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Step 5: Validate
|
|
65
|
+
|
|
66
|
+
Run the CLI to verify your model structure.
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
sea-cli parse shopeasy.sea
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Understanding the Output
|
|
73
|
+
|
|
74
|
+
The parser confirms that:
|
|
75
|
+
1. All references are valid (e.g., `Flow "OrderRequest" from "Storefront"` points to declared entities).
|
|
76
|
+
2. The syntax is correct.
|
|
77
|
+
3. The graph is connected.
|
|
78
|
+
|
|
79
|
+
## Conclusion
|
|
80
|
+
|
|
81
|
+
You have successfully modeled a microservices architecture with data flows and infrastructure definitions. This model can now be used to generate diagrams, Terraform code, or validate security policies.
|
|
82
|
+
|
|
83
|
+
## See Also
|
|
84
|
+
|
|
85
|
+
- [Semantic Modeling Concepts](../explanations/semantic-modeling-concepts.md)
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Getting Started with DomainForge
|
|
2
|
+
|
|
3
|
+
This tutorial will guide you through installing the DomainForge CLI, writing your first Semantic Enterprise Architecture (SEA) model, and validating it.
|
|
4
|
+
|
|
5
|
+
**Time to complete**: 15 minutes
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
- **Rust**: You need Rust and Cargo installed. [Install Rust](https://rustup.rs/).
|
|
10
|
+
|
|
11
|
+
## Step 1: Install the CLI
|
|
12
|
+
|
|
13
|
+
Build and install the CLI tool directly from the source.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# From the root of the domainforge repository
|
|
17
|
+
cargo install --path . --features cli
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Verify the installation:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
sea-cli --version
|
|
24
|
+
# Output: sea-cli 0.1.0 (or current version)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Step 2: Create Your First Model
|
|
28
|
+
|
|
29
|
+
Create a new file named `hello.sea` in your favorite text editor. We will model a simple "Hello World" system with a Web Server and a Database.
|
|
30
|
+
|
|
31
|
+
```sea
|
|
32
|
+
@namespace "hello.world"
|
|
33
|
+
|
|
34
|
+
Entity "WebServer"
|
|
35
|
+
Entity "UserDatabase"
|
|
36
|
+
Resource "UserData" units
|
|
37
|
+
Flow "UserData" from "WebServer" to "UserDatabase" quantity 1
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Step 3: Parse and Validate
|
|
41
|
+
|
|
42
|
+
Run the CLI to parse your file. This checks for syntax errors and builds the internal graph.
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
sea-cli parse hello.sea
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Expected Output:**
|
|
49
|
+
```text
|
|
50
|
+
Successfully parsed hello.sea
|
|
51
|
+
Found:
|
|
52
|
+
- 1 Entities
|
|
53
|
+
- 1 Resources
|
|
54
|
+
- 1 Flows
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Step 4: Add a Policy
|
|
58
|
+
|
|
59
|
+
Let's add a rule to ensure our architecture is secure. Append this to `hello.sea`:
|
|
60
|
+
|
|
61
|
+
```sea
|
|
62
|
+
Policy secure_db_access as:
|
|
63
|
+
forall f in flows: (f.to = "UserDatabase" and f.quantity <= 1)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Run the parser again. The CLI automatically evaluates policies.
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
sea-cli parse hello.sea
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Expected Output:**
|
|
73
|
+
```text
|
|
74
|
+
...
|
|
75
|
+
Policy Results:
|
|
76
|
+
[PASS] secure_db_access
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Step 5: Break the Policy
|
|
80
|
+
|
|
81
|
+
Increase the quantity on the flow and re-validate to see the policy fail.
|
|
82
|
+
|
|
83
|
+
```sea
|
|
84
|
+
Flow "UserData" from "WebServer" to "UserDatabase" quantity 5
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Expected Output:**
|
|
88
|
+
```text
|
|
89
|
+
...
|
|
90
|
+
Policy Results:
|
|
91
|
+
[FAIL] secure_db_access
|
|
92
|
+
-> Violation at Flow("UserData")
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Next Steps
|
|
96
|
+
|
|
97
|
+
- Learn more about [Semantic Modeling Concepts](../explanations/semantic-modeling-concepts.md).
|
|
98
|
+
- Try the [Python Binding Quickstart](python-binding-quickstart.md).
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Python Binding Quickstart
|
|
2
|
+
|
|
3
|
+
This guide shows how to use DomainForge programmatically using Python. This is useful for writing custom analysis scripts, generating reports, or integrating SEA into Python-based tooling.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Python 3.8+
|
|
8
|
+
- `maturin` (for building bindings locally, or install from PyPI if available)
|
|
9
|
+
|
|
10
|
+
## Step 1: Installation
|
|
11
|
+
|
|
12
|
+
If you are working in the repo:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# Create venv
|
|
16
|
+
python -m venv .venv
|
|
17
|
+
source .venv/bin/activate
|
|
18
|
+
|
|
19
|
+
# Install dependencies and build bindings
|
|
20
|
+
pip install maturin
|
|
21
|
+
maturin develop --features python
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Step 2: Create a Script
|
|
25
|
+
|
|
26
|
+
Create `analyze_model.py`.
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
import domainforge
|
|
30
|
+
from domainforge import Entity, Flow
|
|
31
|
+
|
|
32
|
+
# 1. Define a simple model string (or load from file)
|
|
33
|
+
sea_content = """
|
|
34
|
+
entity Web { type = "service" }
|
|
35
|
+
resource DB { type = "database" }
|
|
36
|
+
flow f1 { from = Web, to = DB, interaction = "read" }
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
# 2. Parse the content
|
|
40
|
+
try:
|
|
41
|
+
model = domainforge.parse(sea_content)
|
|
42
|
+
print("Parse successful!")
|
|
43
|
+
except Exception as e:
|
|
44
|
+
print(f"Error: {e}")
|
|
45
|
+
exit(1)
|
|
46
|
+
|
|
47
|
+
# 3. Inspect the graph
|
|
48
|
+
print(f"Entities: {len(model.entities)}") # Entities includes only entity objects (resources are separate)
|
|
49
|
+
print(f"Flows: {len(model.flows)}")
|
|
50
|
+
|
|
51
|
+
# 4. Iterate and analyze
|
|
52
|
+
for flow in model.flows:
|
|
53
|
+
source = flow.from_entity
|
|
54
|
+
target = flow.to_entity
|
|
55
|
+
print(f"Flow: {source.name} -> {target.name} ({flow.interaction})")
|
|
56
|
+
|
|
57
|
+
# 5. Programmatic Modification (Hypothetical API)
|
|
58
|
+
# new_entity = Entity(name="Cache", type="redis")
|
|
59
|
+
# model.add_entity(new_entity)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Step 3: Run the Script
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
python analyze_model.py
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Expected Output:**
|
|
69
|
+
```text
|
|
70
|
+
Parse successful!
|
|
71
|
+
Entities: 1
|
|
72
|
+
Flows: 1
|
|
73
|
+
Flow: Web -> DB (read)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Integration with Pytest
|
|
77
|
+
|
|
78
|
+
You can use DomainForge to test your architecture definitions.
|
|
79
|
+
|
|
80
|
+
```python
|
|
81
|
+
# test_architecture.py
|
|
82
|
+
import pytest
|
|
83
|
+
import domainforge
|
|
84
|
+
|
|
85
|
+
def test_no_plaintext_passwords():
|
|
86
|
+
# Use parse_file if provided by the API; otherwise fallback to parse(file.contents)
|
|
87
|
+
if hasattr(domainforge, 'parse_file'):
|
|
88
|
+
model = domainforge.parse_file("production.sea")
|
|
89
|
+
else:
|
|
90
|
+
with open("production.sea") as f:
|
|
91
|
+
model = domainforge.parse(f.read())
|
|
92
|
+
for flow in model.flows:
|
|
93
|
+
# Only check properties that are part of the confirmed public API to avoid relying on internal fields.
|
|
94
|
+
payload = getattr(flow, 'payload', '')
|
|
95
|
+
encrypted = getattr(flow, 'encrypted', None)
|
|
96
|
+
if payload and "password" in str(payload).lower():
|
|
97
|
+
# Only assert encrypted if the API exposes the field; otherwise log for debugging.
|
|
98
|
+
if encrypted is not None:
|
|
99
|
+
assert encrypted == True, f"Flow {getattr(flow, 'name', '<unnamed>')} sends passwords in plain text!"
|
|
100
|
+
else:
|
|
101
|
+
# If `encrypted` is not provided, check the flow name and warn instead of failing the test
|
|
102
|
+
pytest.skip("Encrypted attribute not exposed by this API/binding; skip strict assertion")
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## See Also
|
|
106
|
+
|
|
107
|
+
- [Cross-Language Binding Strategy](../explanations/cross-language-binding-strategy.md)
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# TypeScript Binding Quickstart
|
|
2
|
+
|
|
3
|
+
This guide demonstrates how to use DomainForge in a Node.js/TypeScript environment.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Node.js 16+
|
|
8
|
+
- npm or yarn
|
|
9
|
+
|
|
10
|
+
## Step 1: Installation
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install @godspeedai/domainforge
|
|
14
|
+
# Or if building locally:
|
|
15
|
+
# npm install ../domainforge-core/typescript
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Step 2: Create a Script
|
|
19
|
+
|
|
20
|
+
Create `index.ts`.
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { parse, Model, Flow } from '@godspeedai/domainforge';
|
|
24
|
+
|
|
25
|
+
const seaContent = `
|
|
26
|
+
entity API { type = "service" }
|
|
27
|
+
resource Bucket { type = "storage" }
|
|
28
|
+
flow upload { from = API, to = Bucket, interaction = "write" }
|
|
29
|
+
`;
|
|
30
|
+
|
|
31
|
+
async function main() {
|
|
32
|
+
try {
|
|
33
|
+
// 1. Parse
|
|
34
|
+
const model: Model = parse(seaContent);
|
|
35
|
+
console.log(`Parsed model with ${model.entities.length} entities.`);
|
|
36
|
+
|
|
37
|
+
// 2. Analyze
|
|
38
|
+
model.flows.forEach((flow: Flow) => {
|
|
39
|
+
console.log(`Found flow: ${flow.name}`);
|
|
40
|
+
console.log(` From: ${flow.from.name}`);
|
|
41
|
+
console.log(` To: ${flow.to.name}`);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.error("Failed to parse SEA model:", error);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
main();
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Step 3: Run
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npx ts-node index.ts
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Expected Output:**
|
|
59
|
+
```text
|
|
60
|
+
Parsed model with 1 entities.
|
|
61
|
+
Found flow: upload
|
|
62
|
+
From: API
|
|
63
|
+
To: Bucket
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Integration with Vitest
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
// architecture.test.ts
|
|
70
|
+
import { describe, it, expect, beforeAll } from 'vitest';
|
|
71
|
+
import { parse } from '@godspeedai/domainforge';
|
|
72
|
+
import * as fs from 'fs';
|
|
73
|
+
|
|
74
|
+
describe('Architecture Rules', () => {
|
|
75
|
+
let model;
|
|
76
|
+
beforeAll(() => {
|
|
77
|
+
model = parse(fs.readFileSync('./system.sea', 'utf-8'));
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('should have all databases encrypted', () => {
|
|
81
|
+
const dbs = model.resources.filter(r => r.type === 'database');
|
|
82
|
+
dbs.forEach(db => {
|
|
83
|
+
expect(db.properties.encrypted).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## See Also
|
|
90
|
+
|
|
91
|
+
- [Cross-Language Binding Strategy](../explanations/cross-language-binding-strategy.md)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Running DomainForge in the Browser (WASM)
|
|
2
|
+
|
|
3
|
+
DomainForge can run entirely client-side using WebAssembly. This allows for building interactive editors or visualizers without a backend.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Rust with `wasm32-unknown-unknown` target
|
|
8
|
+
- `wasm-pack`
|
|
9
|
+
|
|
10
|
+
## Step 1: Build WASM
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# From the project root, build the WASM bundle into an example folder
|
|
14
|
+
mkdir -p examples/wasm-demo
|
|
15
|
+
wasm-pack build domainforge-core --target web --out-dir examples/wasm-demo/pkg --features wasm
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Step 2: HTML Setup
|
|
19
|
+
|
|
20
|
+
Create `examples/wasm-demo/index.html`.
|
|
21
|
+
|
|
22
|
+
```html
|
|
23
|
+
<!DOCTYPE html>
|
|
24
|
+
<html>
|
|
25
|
+
<head>
|
|
26
|
+
<title>SEA WASM Demo</title>
|
|
27
|
+
</head>
|
|
28
|
+
<body>
|
|
29
|
+
<h1>SEA Parser</h1>
|
|
30
|
+
<textarea id="input" rows="10" cols="50">
|
|
31
|
+
entity Web { type = "service" }
|
|
32
|
+
</textarea>
|
|
33
|
+
<button id="parseBtn">Parse</button>
|
|
34
|
+
<pre id="output"></pre>
|
|
35
|
+
|
|
36
|
+
<script type="module">
|
|
37
|
+
import init, { Graph } from './pkg/domainforge_core.js';
|
|
38
|
+
|
|
39
|
+
async function run() {
|
|
40
|
+
await init(); // Initialize WASM module
|
|
41
|
+
|
|
42
|
+
document.getElementById('parseBtn').onclick = () => {
|
|
43
|
+
const input = document.getElementById('input').value;
|
|
44
|
+
try {
|
|
45
|
+
const graph = Graph.parse(input);
|
|
46
|
+
document.getElementById('output').textContent =
|
|
47
|
+
JSON.stringify(graph.toJSON(), null, 2);
|
|
48
|
+
} catch (e) {
|
|
49
|
+
document.getElementById('output').textContent = "Error: " + e;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
run();
|
|
55
|
+
</script>
|
|
56
|
+
</body>
|
|
57
|
+
</html>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Step 3: Serve
|
|
61
|
+
|
|
62
|
+
You need a local web server to serve the WASM file (due to CORS).
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Using python
|
|
66
|
+
python3 -m http.server 8000
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Open `http://localhost:8000` in your browser (use `python3 -m http.server <port>` if you prefer another port). Click "Parse". You should see the JSON representation of the parsed model.
|
|
70
|
+
|
|
71
|
+
> If you rename the crate or output path, check the generated `pkg/` folder for the exact `.js` wrapper name and exported functions, then adjust the import accordingly.
|
|
72
|
+
|
|
73
|
+
## See Also
|
|
74
|
+
|
|
75
|
+
- [Cross-Language Binding Strategy](../explanations/cross-language-binding-strategy.md)
|