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,57 @@
|
|
|
1
|
+
# ADR-004: Enforce Projection Compatibility Semantics
|
|
2
|
+
|
|
3
|
+
**Status:** Accepted
|
|
4
|
+
**Date:** 2025-12-14
|
|
5
|
+
**Deciders:** DomainForge Architecture Team
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Protobuf and other schema formats require strong backward-compatibility guarantees to avoid breaking agents and services.
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
Each `Projection` SHALL declare a compatibility level:
|
|
14
|
+
|
|
15
|
+
| Level | Description |
|
|
16
|
+
| ---------- | -------------------------------------------------------------------- |
|
|
17
|
+
| `additive` | Only new fields may be added. No removals or modifications. |
|
|
18
|
+
| `backward` | Backward-compatible changes allowed. Removed fields become reserved. |
|
|
19
|
+
| `breaking` | Structural changes allowed with explicit version bump. |
|
|
20
|
+
|
|
21
|
+
Projection engines SHALL enforce these rules when generating artifacts.
|
|
22
|
+
|
|
23
|
+
### Enforcement Rules
|
|
24
|
+
|
|
25
|
+
1. **Additive Mode**
|
|
26
|
+
|
|
27
|
+
- New fields: ✅ Allowed
|
|
28
|
+
- Field removal: ❌ Rejected
|
|
29
|
+
- Field modification: ❌ Rejected
|
|
30
|
+
|
|
31
|
+
2. **Backward Mode**
|
|
32
|
+
|
|
33
|
+
- New fields: ✅ Allowed
|
|
34
|
+
- Field removal: ✅ Allowed (becomes `reserved`)
|
|
35
|
+
- Field type changes: ❌ Rejected
|
|
36
|
+
|
|
37
|
+
3. **Breaking Mode**
|
|
38
|
+
- All changes: ✅ Allowed
|
|
39
|
+
- Requires: Major version increment
|
|
40
|
+
|
|
41
|
+
## Consequences
|
|
42
|
+
|
|
43
|
+
### Positive
|
|
44
|
+
|
|
45
|
+
- Safe evolution of runtime contracts.
|
|
46
|
+
- Breaking changes are explicit and auditable.
|
|
47
|
+
- Field numbering and reservations are handled deterministically.
|
|
48
|
+
|
|
49
|
+
### Negative
|
|
50
|
+
|
|
51
|
+
- Requires tracking schema history for diff operations.
|
|
52
|
+
- May slow down iteration during early development phases.
|
|
53
|
+
|
|
54
|
+
## Related
|
|
55
|
+
|
|
56
|
+
- [ADR-002: Introduce Projection as a First-Class DSL Construct](./ADR-002-projection-first-class-construct.md)
|
|
57
|
+
- [ADR-003: Add Protobuf as a Projection Target](./ADR-003-protobuf-projection-target.md)
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# ADR-005: Multi-Language Support Strategy
|
|
2
|
+
|
|
3
|
+
**Status:** Accepted
|
|
4
|
+
**Date:** 2025-12-14
|
|
5
|
+
**Deciders:** DomainForge Architecture Team
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
DomainForge needs to support multiple runtime environments to maximize adoption:
|
|
10
|
+
|
|
11
|
+
- **Python**: Data scientists, ML engineers, enterprise automation
|
|
12
|
+
- **TypeScript/JavaScript**: Web applications, serverless functions, Node.js backends
|
|
13
|
+
- **WebAssembly (WASM)**: Browser-based tools, edge computing, sandboxed execution
|
|
14
|
+
- **Rust**: High-performance systems, CLI tools, core library consumers
|
|
15
|
+
|
|
16
|
+
Maintaining separate implementations for each language would lead to:
|
|
17
|
+
|
|
18
|
+
- Feature drift between implementations
|
|
19
|
+
- Multiplicative testing burden
|
|
20
|
+
- Inconsistent behavior across platforms
|
|
21
|
+
|
|
22
|
+
## Decision
|
|
23
|
+
|
|
24
|
+
Implement a **single Rust core** (`domainforge-core`) that exposes bindings to other languages via FFI:
|
|
25
|
+
|
|
26
|
+
| Target | Binding Technology | Feature Flag |
|
|
27
|
+
| ------------------ | ------------------ | ------------ |
|
|
28
|
+
| Python | PyO3 + Maturin | `python` |
|
|
29
|
+
| TypeScript/Node.js | NAPI-RS | `typescript` |
|
|
30
|
+
| WebAssembly | wasm-bindgen | `wasm` |
|
|
31
|
+
| Rust | Native crate | (default) |
|
|
32
|
+
|
|
33
|
+
### Binding Architecture
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
┌─────────────────────────────────────────────────────┐
|
|
37
|
+
│ domainforge-core (Rust) │
|
|
38
|
+
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──────────┐ │
|
|
39
|
+
│ │ Parser │ │ Graph │ │ Policy │ │Projection│ │
|
|
40
|
+
│ └─────────┘ └─────────┘ └─────────┘ └──────────┘ │
|
|
41
|
+
└─────────────────────────────────────────────────────┘
|
|
42
|
+
│ │ │
|
|
43
|
+
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
|
|
44
|
+
│ PyO3 │ │ NAPI-RS │ │ WASM │
|
|
45
|
+
│ Binding │ │ Binding │ │ Binding │
|
|
46
|
+
└────┬────┘ └────┬────┘ └────┬────┘
|
|
47
|
+
│ │ │
|
|
48
|
+
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
|
|
49
|
+
│ Python │ │ Node │ │ Browser │
|
|
50
|
+
│ domainforge│ │ @sea │ │ @sea │
|
|
51
|
+
└─────────┘ └─────────┘ └─────────┘
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Binding Wrapper Pattern
|
|
55
|
+
|
|
56
|
+
Each binding module wraps core Rust types with language-idiomatic APIs:
|
|
57
|
+
|
|
58
|
+
```rust
|
|
59
|
+
// Python binding example (domainforge-core/src/python/primitives.rs)
|
|
60
|
+
#[pyclass]
|
|
61
|
+
pub struct Entity {
|
|
62
|
+
inner: crate::primitives::Entity,
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
#[pymethods]
|
|
66
|
+
impl Entity {
|
|
67
|
+
#[new]
|
|
68
|
+
fn new(name: String, namespace: String) -> Self { /* ... */ }
|
|
69
|
+
|
|
70
|
+
#[getter]
|
|
71
|
+
fn name(&self) -> &str { self.inner.name() }
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Consequences
|
|
76
|
+
|
|
77
|
+
### Positive
|
|
78
|
+
|
|
79
|
+
- **Single source of truth**: All semantics defined once in Rust.
|
|
80
|
+
- **Consistent behavior**: All platforms use identical parsing, validation, and projection logic.
|
|
81
|
+
- **Performance**: Core operations run at native speed; only boundary crossing has overhead.
|
|
82
|
+
- **Reduced maintenance**: Bug fixes and features automatically propagate to all bindings.
|
|
83
|
+
|
|
84
|
+
### Negative
|
|
85
|
+
|
|
86
|
+
- **Rust expertise required**: Contributors must understand Rust for core changes.
|
|
87
|
+
- **FFI complexity**: Each binding layer introduces serialization/deserialization overhead.
|
|
88
|
+
- **Build complexity**: CI must build and test all target platforms.
|
|
89
|
+
|
|
90
|
+
## Implementation Notes
|
|
91
|
+
|
|
92
|
+
### Feature Flags
|
|
93
|
+
|
|
94
|
+
Bindings are conditionally compiled via Cargo features:
|
|
95
|
+
|
|
96
|
+
```toml
|
|
97
|
+
[features]
|
|
98
|
+
python = ["pyo3", "pythonize"]
|
|
99
|
+
typescript = ["napi", "napi-derive"]
|
|
100
|
+
wasm = ["wasm-bindgen", "serde-wasm-bindgen"]
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Data Serialization
|
|
104
|
+
|
|
105
|
+
- Python: `pythonize` for automatic serde ↔ Python dict conversion
|
|
106
|
+
- TypeScript: `napi` with serde for JSON-like object passing
|
|
107
|
+
- WASM: `serde-wasm-bindgen` for efficient JS object bridging
|
|
108
|
+
|
|
109
|
+
## Related
|
|
110
|
+
|
|
111
|
+
- [ADR-006: Error Handling Strategy](./ADR-006-error-handling-strategy.md)
|
|
112
|
+
- [SDS-002: SEA Core Architecture](./SDS-002-domainforge-core-architecture.md)
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# ADR-006: Error Handling Strategy
|
|
2
|
+
|
|
3
|
+
**Status:** Accepted
|
|
4
|
+
**Date:** 2025-12-14
|
|
5
|
+
**Deciders:** DomainForge Architecture Team
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
SEA-DSL operations can fail in multiple ways:
|
|
10
|
+
|
|
11
|
+
- **Parse errors**: Invalid syntax in `.sea` files
|
|
12
|
+
- **Validation errors**: Semantic violations (e.g., referencing undefined entities)
|
|
13
|
+
- **Policy violations**: Business rule failures during evaluation
|
|
14
|
+
- **Runtime errors**: I/O failures, module resolution issues
|
|
15
|
+
|
|
16
|
+
Errors must:
|
|
17
|
+
|
|
18
|
+
1. Provide actionable diagnostics (file, line, column, suggestions)
|
|
19
|
+
2. Cross FFI boundaries cleanly (Rust → Python/TypeScript/WASM)
|
|
20
|
+
3. Support multiple output formats (human-readable, JSON, LSP)
|
|
21
|
+
|
|
22
|
+
## Decision
|
|
23
|
+
|
|
24
|
+
### Error Type Hierarchy
|
|
25
|
+
|
|
26
|
+
```rust
|
|
27
|
+
// Core validation error with rich diagnostics
|
|
28
|
+
pub struct ValidationError {
|
|
29
|
+
pub code: ErrorCode,
|
|
30
|
+
pub message: String,
|
|
31
|
+
pub range: Option<SourceRange>,
|
|
32
|
+
pub severity: Severity,
|
|
33
|
+
pub suggestions: Vec<String>,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Structured error codes for programmatic handling
|
|
37
|
+
pub enum ErrorCode {
|
|
38
|
+
// Syntax errors (1xxx)
|
|
39
|
+
SyntaxError = 1000,
|
|
40
|
+
UnexpectedToken = 1001,
|
|
41
|
+
|
|
42
|
+
// Semantic errors (2xxx)
|
|
43
|
+
UndefinedEntity = 2000,
|
|
44
|
+
DuplicateDeclaration = 2001,
|
|
45
|
+
TypeMismatch = 2002,
|
|
46
|
+
|
|
47
|
+
// Policy errors (3xxx)
|
|
48
|
+
PolicyViolation = 3000,
|
|
49
|
+
ConstraintFailed = 3001,
|
|
50
|
+
|
|
51
|
+
// Module errors (4xxx)
|
|
52
|
+
ModuleNotFound = 4000,
|
|
53
|
+
CircularImport = 4001,
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Diagnostic Formatters
|
|
58
|
+
|
|
59
|
+
Multiple output formats via the `DiagnosticFormatter` trait:
|
|
60
|
+
|
|
61
|
+
| Formatter | Use Case | Output |
|
|
62
|
+
| ---------------- | ------------------ | ---------------------------- |
|
|
63
|
+
| `HumanFormatter` | CLI output | Colored, contextual snippets |
|
|
64
|
+
| `JsonFormatter` | CI/automation | Structured JSON array |
|
|
65
|
+
| `LspFormatter` | Editor integration | LSP Diagnostic objects |
|
|
66
|
+
|
|
67
|
+
### FFI Error Propagation
|
|
68
|
+
|
|
69
|
+
Errors are converted to native exceptions at language boundaries:
|
|
70
|
+
|
|
71
|
+
```rust
|
|
72
|
+
// Python: Convert to Python exception
|
|
73
|
+
#[pyfunction]
|
|
74
|
+
fn parse(source: &str) -> PyResult<Graph> {
|
|
75
|
+
crate::parse_to_graph(source)
|
|
76
|
+
.map_err(|e| PyValueError::new_err(e.to_string()))
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// TypeScript: Return Result-like object or throw
|
|
80
|
+
#[napi]
|
|
81
|
+
fn parse(source: String) -> napi::Result<Graph> {
|
|
82
|
+
crate::parse_to_graph(&source)
|
|
83
|
+
.map_err(|e| napi::Error::from_reason(e.to_string()))
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### "Did You Mean?" Suggestions
|
|
88
|
+
|
|
89
|
+
The `fuzzy` module provides Levenshtein-distance-based suggestions:
|
|
90
|
+
|
|
91
|
+
```rust
|
|
92
|
+
// When entity "Wharehouse" not found, suggest "Warehouse"
|
|
93
|
+
if let Some(suggestion) = fuzzy::did_you_mean("Wharehouse", known_entities) {
|
|
94
|
+
error.suggestions.push(format!("Did you mean '{}'?", suggestion));
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Consequences
|
|
99
|
+
|
|
100
|
+
### Positive
|
|
101
|
+
|
|
102
|
+
- **Actionable errors**: Users get file locations and fix suggestions.
|
|
103
|
+
- **Programmatic handling**: Error codes enable automated error categorization.
|
|
104
|
+
- **IDE integration**: LSP formatter enables real-time editor diagnostics.
|
|
105
|
+
- **Cross-platform consistency**: Same error structure across all bindings.
|
|
106
|
+
|
|
107
|
+
### Negative
|
|
108
|
+
|
|
109
|
+
- **Complexity**: Multiple formatter implementations to maintain.
|
|
110
|
+
- **FFI overhead**: Error details may be lost when converting to simple strings.
|
|
111
|
+
|
|
112
|
+
## Related
|
|
113
|
+
|
|
114
|
+
- [ADR-005: Multi-Language Support Strategy](./ADR-005-multi-language-support-strategy.md)
|
|
115
|
+
- [SDS-002: SEA Core Architecture](./SDS-002-domainforge-core-architecture.md)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# ADR-007: Policy Evaluation Engine
|
|
2
|
+
|
|
3
|
+
**Status:** Accepted
|
|
4
|
+
**Date:** 2025-12-14
|
|
5
|
+
**Deciders:** DomainForge Architecture Team
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
SEA-DSL policies express business rules as logical expressions over the semantic graph. These policies must:
|
|
10
|
+
|
|
11
|
+
1. Evaluate efficiently over large graphs (10,000+ entities)
|
|
12
|
+
2. Support quantified expressions (`forall`, `exists`)
|
|
13
|
+
3. Handle missing/null data gracefully
|
|
14
|
+
4. Provide actionable violation reports
|
|
15
|
+
|
|
16
|
+
Traditional two-valued boolean logic (true/false) fails when data is incomplete, leading to false positives or missed violations.
|
|
17
|
+
|
|
18
|
+
## Decision
|
|
19
|
+
|
|
20
|
+
### Three-Valued Logic
|
|
21
|
+
|
|
22
|
+
Implement a **three-valued logic** system based on Kleene's strong logic:
|
|
23
|
+
|
|
24
|
+
| Expression | Result |
|
|
25
|
+
| ----------------- | ------- |
|
|
26
|
+
| true AND unknown | unknown |
|
|
27
|
+
| false AND unknown | false |
|
|
28
|
+
| true OR unknown | true |
|
|
29
|
+
| false OR unknown | unknown |
|
|
30
|
+
| NOT unknown | unknown |
|
|
31
|
+
|
|
32
|
+
```rust
|
|
33
|
+
pub enum TruthValue {
|
|
34
|
+
True,
|
|
35
|
+
False,
|
|
36
|
+
Unknown, // NULL propagation
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
impl TruthValue {
|
|
40
|
+
pub fn and(self, other: TruthValue) -> TruthValue {
|
|
41
|
+
match (self, other) {
|
|
42
|
+
(TruthValue::False, _) | (_, TruthValue::False) => TruthValue::False,
|
|
43
|
+
(TruthValue::Unknown, _) | (_, TruthValue::Unknown) => TruthValue::Unknown,
|
|
44
|
+
_ => TruthValue::True,
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Quantifier Evaluation
|
|
51
|
+
|
|
52
|
+
Support universal and existential quantifiers over graph collections:
|
|
53
|
+
|
|
54
|
+
```sea
|
|
55
|
+
// Universal: must hold for ALL matching entities
|
|
56
|
+
Policy all_flows_positive as:
|
|
57
|
+
forall f in Flow: f.quantity > 0
|
|
58
|
+
|
|
59
|
+
// Existential: must hold for AT LEAST ONE entity
|
|
60
|
+
Policy has_active_warehouse as:
|
|
61
|
+
exists e in Entity where e.type = "Warehouse": e.active = true
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Expression Evaluation
|
|
65
|
+
|
|
66
|
+
Expressions are parsed into an AST and evaluated against the graph:
|
|
67
|
+
|
|
68
|
+
```rust
|
|
69
|
+
pub enum Expression {
|
|
70
|
+
Literal(Value),
|
|
71
|
+
FieldAccess { object: Box<Expression>, field: String },
|
|
72
|
+
BinaryOp { left: Box<Expression>, op: BinaryOperator, right: Box<Expression> },
|
|
73
|
+
UnaryOp { op: UnaryOperator, operand: Box<Expression> },
|
|
74
|
+
Quantifier { kind: QuantifierKind, variable: String, domain: String, filter: Option<Box<Expression>>, body: Box<Expression> },
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Consequences
|
|
79
|
+
|
|
80
|
+
### Positive
|
|
81
|
+
|
|
82
|
+
- **Null-safe**: Missing data doesn't cause false violations
|
|
83
|
+
- **Expressive**: Quantifiers enable complex business rules
|
|
84
|
+
- **Efficient**: Lazy evaluation and short-circuit logic
|
|
85
|
+
- **Debuggable**: Clear violation messages with context
|
|
86
|
+
|
|
87
|
+
### Negative
|
|
88
|
+
|
|
89
|
+
- **Complexity**: Three-valued logic less intuitive than boolean
|
|
90
|
+
- **Performance**: Quantifier evaluation is O(n) per policy
|
|
91
|
+
|
|
92
|
+
## Related
|
|
93
|
+
|
|
94
|
+
- [SDS-004: Policy Engine Design](./SDS-004-policy-engine-design.md)
|
|
95
|
+
- [ADR-001: SEA-DSL as Semantic Source of Truth](./ADR-001-sea-dsl-semantic-source-of-truth.md)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# ADR-008: Knowledge Graph Integration
|
|
2
|
+
|
|
3
|
+
**Status:** Accepted
|
|
4
|
+
**Date:** 2025-12-14
|
|
5
|
+
**Deciders:** DomainForge Architecture Team
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Enterprise systems often maintain knowledge in RDF/OWL knowledge graphs. SEA needs to:
|
|
10
|
+
|
|
11
|
+
1. Export semantic models to standard RDF formats (Turtle, RDF-XML)
|
|
12
|
+
2. Import existing knowledge graphs into SEA models
|
|
13
|
+
3. Validate graph constraints using SHACL shapes
|
|
14
|
+
4. Enable interoperability with semantic web tooling
|
|
15
|
+
|
|
16
|
+
## Decision
|
|
17
|
+
|
|
18
|
+
### RDF Export
|
|
19
|
+
|
|
20
|
+
SEA graphs export to RDF using a canonical vocabulary:
|
|
21
|
+
|
|
22
|
+
| SEA Concept | RDF Mapping |
|
|
23
|
+
| ----------- | ------------------------------------------------------- |
|
|
24
|
+
| Entity | `sea:Entity` instance with `rdfs:label` |
|
|
25
|
+
| Resource | `sea:Resource` instance with `sea:unit` |
|
|
26
|
+
| Flow | `sea:Flow` with `sea:from`, `sea:to`, `sea:hasResource` |
|
|
27
|
+
| Relation | `sea:Relation` with subject/object roles |
|
|
28
|
+
|
|
29
|
+
### Turtle Format
|
|
30
|
+
|
|
31
|
+
```turtle
|
|
32
|
+
@prefix sea: <http://domainforge.ai/sea#> .
|
|
33
|
+
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
|
34
|
+
|
|
35
|
+
sea:Warehouse a sea:Entity ;
|
|
36
|
+
rdfs:label "Warehouse" ;
|
|
37
|
+
sea:namespace "logistics" .
|
|
38
|
+
|
|
39
|
+
sea:Camera a sea:Resource ;
|
|
40
|
+
rdfs:label "Camera" ;
|
|
41
|
+
sea:unit "units" .
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### SHACL Validation
|
|
45
|
+
|
|
46
|
+
Generate SHACL shapes from SEA policies and validate imported graphs:
|
|
47
|
+
|
|
48
|
+
```rust
|
|
49
|
+
pub struct ShaclShape {
|
|
50
|
+
pub target_class: String,
|
|
51
|
+
pub properties: Vec<ShaclProperty>,
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
pub struct ShaclProperty {
|
|
55
|
+
pub path: String,
|
|
56
|
+
pub datatype: Option<String>,
|
|
57
|
+
pub min_count: Option<u32>,
|
|
58
|
+
pub max_count: Option<u32>,
|
|
59
|
+
pub min_exclusive: Option<String>,
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Bidirectional Round-Trip
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
SEA Graph
|
|
67
|
+
↓ to_turtle()
|
|
68
|
+
Turtle/RDF
|
|
69
|
+
↓ from_turtle()
|
|
70
|
+
SEA Graph (restored)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Consequences
|
|
74
|
+
|
|
75
|
+
### Positive
|
|
76
|
+
|
|
77
|
+
- **Interoperability**: Standard formats enable tool integration
|
|
78
|
+
- **Semantic web**: Leverage existing RDF infrastructure
|
|
79
|
+
- **Validation**: SHACL provides schema-level constraint checking
|
|
80
|
+
- **Portability**: Export models for external consumption
|
|
81
|
+
|
|
82
|
+
### Negative
|
|
83
|
+
|
|
84
|
+
- **Lossy conversion**: Some SEA semantics may not map perfectly to RDF
|
|
85
|
+
- **Complexity**: RDF parsing adds dependency weight
|
|
86
|
+
|
|
87
|
+
## Related
|
|
88
|
+
|
|
89
|
+
- [SDS-005: Knowledge Graph Module](./SDS-005-knowledge-graph-module.md)
|
|
90
|
+
- [ADR-001: SEA-DSL as Semantic Source of Truth](./ADR-001-sea-dsl-semantic-source-of-truth.md)
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# ADR-009: Module Resolution Strategy
|
|
2
|
+
|
|
3
|
+
**Status:** Accepted
|
|
4
|
+
**Date:** 2025-12-14
|
|
5
|
+
**Deciders:** DomainForge Architecture Team
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Large SEA models need to be split across multiple files for maintainability. This requires:
|
|
10
|
+
|
|
11
|
+
1. Import syntax for referencing external SEA files
|
|
12
|
+
2. Namespace resolution for qualified references
|
|
13
|
+
3. Standard library of reusable types
|
|
14
|
+
4. Circular dependency detection
|
|
15
|
+
|
|
16
|
+
## Decision
|
|
17
|
+
|
|
18
|
+
### Import Syntax
|
|
19
|
+
|
|
20
|
+
```sea
|
|
21
|
+
// Relative file import
|
|
22
|
+
import "common/types.sea"
|
|
23
|
+
|
|
24
|
+
// Namespace binding
|
|
25
|
+
import namespace core from "std/core.sea"
|
|
26
|
+
|
|
27
|
+
// Selective import
|
|
28
|
+
import { Customer, Order } from "domain/entities.sea"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Namespace Registry
|
|
32
|
+
|
|
33
|
+
A `.sea-registry.toml` file at the project root maps namespace prefixes to file paths:
|
|
34
|
+
|
|
35
|
+
```toml
|
|
36
|
+
[namespaces]
|
|
37
|
+
core = "domainforge-core/std/core.sea"
|
|
38
|
+
http = "domainforge-core/std/http.sea"
|
|
39
|
+
aws = "domainforge-core/std/aws.sea"
|
|
40
|
+
domain = "src/domain/index.sea"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Resolution Algorithm
|
|
44
|
+
|
|
45
|
+
1. Check if namespace is in registry
|
|
46
|
+
2. Resolve relative to entry file if not found
|
|
47
|
+
3. Search standard library paths
|
|
48
|
+
4. Fail with helpful error message
|
|
49
|
+
|
|
50
|
+
```rust
|
|
51
|
+
pub struct ModuleResolver {
|
|
52
|
+
registry: NamespaceRegistry,
|
|
53
|
+
loaded: HashMap<PathBuf, Ast>,
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
impl ModuleResolver {
|
|
57
|
+
pub fn resolve(&mut self, import: &ImportSpec, from: &Path) -> Result<Ast, ParseError> {
|
|
58
|
+
// 1. Try registry lookup
|
|
59
|
+
if let Some(path) = self.registry.resolve(&import.namespace) {
|
|
60
|
+
return self.load(path);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// 2. Try relative resolution
|
|
64
|
+
let relative = from.parent().unwrap().join(&import.path);
|
|
65
|
+
if relative.exists() {
|
|
66
|
+
return self.load(&relative);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// 3. Fail with suggestion
|
|
70
|
+
Err(ParseError::ModuleNotFound { /* ... */ })
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Circular Dependency Detection
|
|
76
|
+
|
|
77
|
+
Track loading state to detect cycles:
|
|
78
|
+
|
|
79
|
+
```rust
|
|
80
|
+
enum LoadState {
|
|
81
|
+
Loading, // Currently being parsed
|
|
82
|
+
Loaded(Ast), // Successfully loaded
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// If we encounter Loading while resolving, it's circular
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Standard Library
|
|
89
|
+
|
|
90
|
+
Built-in types available via `std:` prefix:
|
|
91
|
+
|
|
92
|
+
| Module | Contents |
|
|
93
|
+
| ---------- | ------------------------------ |
|
|
94
|
+
| `std:core` | Basic types (UUID, Email, URL) |
|
|
95
|
+
| `std:http` | HTTP request/response patterns |
|
|
96
|
+
| `std:aws` | AWS resource types |
|
|
97
|
+
|
|
98
|
+
## Consequences
|
|
99
|
+
|
|
100
|
+
### Positive
|
|
101
|
+
|
|
102
|
+
- **Modularity**: Large models split into maintainable files
|
|
103
|
+
- **Reusability**: Standard library provides common patterns
|
|
104
|
+
- **Clarity**: Explicit namespace bindings reduce ambiguity
|
|
105
|
+
- **Safety**: Circular dependencies caught at parse time
|
|
106
|
+
|
|
107
|
+
### Negative
|
|
108
|
+
|
|
109
|
+
- **Configuration**: Requires `.sea-registry.toml` setup
|
|
110
|
+
- **Complexity**: Resolution logic adds parsing overhead
|
|
111
|
+
|
|
112
|
+
## Related
|
|
113
|
+
|
|
114
|
+
- [SDS-003: Parser and Semantic Graph](./SDS-003-parser-semantic-graph.md)
|
|
115
|
+
- [ADR-001: SEA-DSL as Semantic Source of Truth](./ADR-001-sea-dsl-semantic-source-of-truth.md)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# ADR-010: Unit System
|
|
2
|
+
|
|
3
|
+
**Status:** Accepted
|
|
4
|
+
**Date:** 2025-12-14
|
|
5
|
+
**Deciders:** DomainForge Architecture Team
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
SEA Resources have associated units of measurement (e.g., "units", "kg", "USD"). The system needs to:
|
|
10
|
+
|
|
11
|
+
1. Parse unit specifications from DSL source
|
|
12
|
+
2. Validate unit compatibility in operations
|
|
13
|
+
3. Support unit conversions where applicable
|
|
14
|
+
4. Enable dimensional analysis for type safety
|
|
15
|
+
|
|
16
|
+
## Decision
|
|
17
|
+
|
|
18
|
+
### Unit Representation
|
|
19
|
+
|
|
20
|
+
```rust
|
|
21
|
+
pub struct Unit {
|
|
22
|
+
pub symbol: String, // "kg", "USD", "units"
|
|
23
|
+
pub name: String, // "Kilogram", "US Dollar", "Units"
|
|
24
|
+
pub dimension: Dimension, // Mass, Currency, Count
|
|
25
|
+
pub scale: f64, // Conversion factor to base unit
|
|
26
|
+
pub base_symbol: String, // Base unit symbol
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
pub enum Dimension {
|
|
30
|
+
Mass,
|
|
31
|
+
Length,
|
|
32
|
+
Time,
|
|
33
|
+
Currency,
|
|
34
|
+
Count,
|
|
35
|
+
Temperature,
|
|
36
|
+
Custom(String),
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Unit Parsing
|
|
41
|
+
|
|
42
|
+
```rust
|
|
43
|
+
pub fn unit_from_string(s: &str) -> Unit {
|
|
44
|
+
match s.to_lowercase().as_str() {
|
|
45
|
+
"units" | "unit" => Unit::count(),
|
|
46
|
+
"kg" | "kilograms" => Unit::mass_kg(),
|
|
47
|
+
"usd" | "dollars" => Unit::currency_usd(),
|
|
48
|
+
// ... more built-in units
|
|
49
|
+
custom => Unit::custom(custom),
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Conversion Operator
|
|
55
|
+
|
|
56
|
+
The DSL supports explicit unit conversion via the `as` operator:
|
|
57
|
+
|
|
58
|
+
```sea
|
|
59
|
+
Resource "Response Time" 1000 'ms' as 's' // Converts to 1 second
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Dimensional Analysis
|
|
63
|
+
|
|
64
|
+
Prevent invalid operations at parse time:
|
|
65
|
+
|
|
66
|
+
```sea
|
|
67
|
+
// Error: Cannot add Mass and Currency
|
|
68
|
+
Policy invalid as: Weight.value + Price.value > 100
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Unit Registry
|
|
72
|
+
|
|
73
|
+
Extensible registry for custom units:
|
|
74
|
+
|
|
75
|
+
```rust
|
|
76
|
+
pub struct UnitRegistry {
|
|
77
|
+
units: HashMap<String, Unit>,
|
|
78
|
+
conversions: HashMap<(String, String), f64>,
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
impl UnitRegistry {
|
|
82
|
+
pub fn convert(&self, value: f64, from: &str, to: &str) -> Option<f64> {
|
|
83
|
+
self.conversions.get(&(from.to_string(), to.to_string()))
|
|
84
|
+
.map(|factor| value * factor)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Consequences
|
|
90
|
+
|
|
91
|
+
### Positive
|
|
92
|
+
|
|
93
|
+
- **Type safety**: Dimensional analysis catches unit errors
|
|
94
|
+
- **Expressiveness**: Natural unit syntax in DSL
|
|
95
|
+
- **Flexibility**: Custom units for domain-specific needs
|
|
96
|
+
- **Interoperability**: Standard units map to external systems
|
|
97
|
+
|
|
98
|
+
### Negative
|
|
99
|
+
|
|
100
|
+
- **Complexity**: Full dimensional analysis is non-trivial
|
|
101
|
+
- **Limitations**: Not all unit conversions are linear
|
|
102
|
+
|
|
103
|
+
## Related
|
|
104
|
+
|
|
105
|
+
- [SDS-002: SEA Core Architecture](./SDS-002-domainforge-core-architecture.md)
|
|
106
|
+
- [PRD-003: DSL Core Capabilities](./PRD-003-dsl-core-capabilities.md)
|