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
package/README.md
ADDED
|
@@ -0,0 +1,660 @@
|
|
|
1
|
+
# ποΈ DomainForge
|
|
2
|
+
|
|
3
|
+
## Executable domain meaning for humans, agents, and systems
|
|
4
|
+
|
|
5
|
+
> Business rules should not live in folklore, stale PDFs, and three different implementations. DomainForge turns domain meaning into readable, executable structure that can move across languages, runtimes, and governance surfaces.
|
|
6
|
+
|
|
7
|
+
[](https://www.rust-lang.org/)
|
|
8
|
+
[](https://www.python.org/)
|
|
9
|
+
[](https://www.typescriptlang.org/)
|
|
10
|
+
[](https://webassembly.org/)
|
|
11
|
+
[](LICENSE)
|
|
12
|
+
[](https://github.com/GodSpeedAI/DomainForge/actions/workflows/ci.yml)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## The Drift Problem
|
|
17
|
+
|
|
18
|
+
Every organization has domain truth: the rules, entities, flows, policies, metrics, and relationships that define how the business actually works.
|
|
19
|
+
|
|
20
|
+
The problem is that this meaning usually gets scattered.
|
|
21
|
+
|
|
22
|
+
- Analysts describe it in documents.
|
|
23
|
+
- Developers reimplement it in services.
|
|
24
|
+
- Frontends rebuild parts of it again.
|
|
25
|
+
- Architects model it somewhere else.
|
|
26
|
+
- Auditors ask where it is enforced.
|
|
27
|
+
- Agents receive fragments and improvise.
|
|
28
|
+
|
|
29
|
+
That is not governance. That is a scavenger hunt.
|
|
30
|
+
|
|
31
|
+
DomainForge gives teams a semantic source of truth for domain structure: human-readable, machine-executable, versionable, and projectable into the systems that need to use it.
|
|
32
|
+
|
|
33
|
+
Analysts can read it. Developers can bind to it. Agents can reason over it. Governance systems can inspect it. Architecture tools can project it.
|
|
34
|
+
|
|
35
|
+
Not documentation hoping to be obeyed. Executable meaning with receipts.
|
|
36
|
+
|
|
37
|
+
| What You Get | Why It Matters |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| **One model, every language** | Python validation and TypeScript validation can use the same declared domain structure. |
|
|
40
|
+
| **Fast rule checking** | Current benchmarks include validation of 10,000 entities in under 100 milliseconds. |
|
|
41
|
+
| **Business-readable, machine-executable structure** | Analysts can read the rules. Systems can parse, validate, and enforce them. |
|
|
42
|
+
| **Architecture-as-Code projection** | Export to FINOS CALM for enterprise architecture and governance workflows. |
|
|
43
|
+
| **Structured validation and deterministic projection surfaces** | Not just documentation β rules that can be parsed, checked, projected, and tested. |
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## See It Working: 60 Seconds
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
import domainforge
|
|
51
|
+
|
|
52
|
+
graph = domainforge.Graph()
|
|
53
|
+
|
|
54
|
+
# Define WHO does the work
|
|
55
|
+
warehouse = domainforge.Entity("Warehouse", "logistics")
|
|
56
|
+
assembly_line = domainforge.Entity("Assembly Line A", "manufacturing")
|
|
57
|
+
graph.add_entity(warehouse)
|
|
58
|
+
graph.add_entity(assembly_line)
|
|
59
|
+
|
|
60
|
+
# Define WHAT moves between them
|
|
61
|
+
cameras = domainforge.Resource("Camera", "units")
|
|
62
|
+
graph.add_resource(cameras)
|
|
63
|
+
|
|
64
|
+
# Define HOW much moves
|
|
65
|
+
flow = domainforge.Flow(
|
|
66
|
+
cameras.id(),
|
|
67
|
+
assembly_line.id(),
|
|
68
|
+
warehouse.id(),
|
|
69
|
+
1000.0
|
|
70
|
+
)
|
|
71
|
+
graph.add_flow(flow)
|
|
72
|
+
|
|
73
|
+
# Validate everything
|
|
74
|
+
print(f"Entities: {graph.entity_count()}")
|
|
75
|
+
print(f"Flows: {graph.flow_count()}")
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**That's it.** You just created an executable domain model that:
|
|
79
|
+
|
|
80
|
+
- Defines entities, resources, and flows as a typed graph
|
|
81
|
+
- Uses the same Rust-backed core semantics across Python, TypeScript, Rust, and browser/WASM surfaces
|
|
82
|
+
- Exports to FINOS CALM for architecture governance
|
|
83
|
+
- Becomes a source of truth teams can inspect, test, version, and govern
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Install in 30 Seconds
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Python
|
|
91
|
+
pip install domainforge
|
|
92
|
+
|
|
93
|
+
# TypeScript / Node.js
|
|
94
|
+
npm install @godspeedai/domainforge
|
|
95
|
+
|
|
96
|
+
# Rust
|
|
97
|
+
cargo add domainforge-core
|
|
98
|
+
|
|
99
|
+
# Verify it works
|
|
100
|
+
python -c "import domainforge; print('β
Ready:', domainforge.__version__)"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
> π‘ Pre-built packages for PyPI, npm, and Crates.io. Build from source if pre-built wheels/binaries are not yet available for your platform.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Use DomainForge Anywhere
|
|
108
|
+
|
|
109
|
+
DomainForge is stack-agnostic.
|
|
110
|
+
|
|
111
|
+
It does **not** require the GodSpeed AI ecosystem. It does not require SEA-Forge, SWE_SEED, GodSpeed-Agent, a specific agent runtime, a specific cloud, or a specific governance platform.
|
|
112
|
+
|
|
113
|
+
You can use DomainForge as a standalone Apache 2.0 semantic/domain layer in:
|
|
114
|
+
|
|
115
|
+
- internal tools
|
|
116
|
+
- backend services
|
|
117
|
+
- frontend validation
|
|
118
|
+
- architecture repositories
|
|
119
|
+
- agent runtimes
|
|
120
|
+
- policy engines
|
|
121
|
+
- knowledge graphs
|
|
122
|
+
- compliance workflows
|
|
123
|
+
- browser/WASM applications
|
|
124
|
+
- Python, TypeScript, and Rust systems
|
|
125
|
+
|
|
126
|
+
DomainForge's value is self-contained: it makes domain meaning readable, executable, portable, and testable.
|
|
127
|
+
|
|
128
|
+
Within the broader GodSpeed AI stack, DomainForge can also serve as the semantic layer:
|
|
129
|
+
|
|
130
|
+
```text
|
|
131
|
+
DomainForge defines the domain.
|
|
132
|
+
SEA-Forge governs the work.
|
|
133
|
+
SWE_SEED proves the change.
|
|
134
|
+
GodSpeed-Agent compounds the capability.
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
That stack is optional. DomainForge stands on its own.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Who Benefits?
|
|
142
|
+
|
|
143
|
+
<table>
|
|
144
|
+
<tr>
|
|
145
|
+
<td width="50%">
|
|
146
|
+
|
|
147
|
+
### πΌ Business Analysts
|
|
148
|
+
|
|
149
|
+
**"I can finally model our processes without waiting for every rule to become custom code."**
|
|
150
|
+
|
|
151
|
+
- Write rules in controlled natural language
|
|
152
|
+
- Get validation feedback
|
|
153
|
+
- See the same domain model developers use
|
|
154
|
+
|
|
155
|
+
</td>
|
|
156
|
+
<td width="50%">
|
|
157
|
+
|
|
158
|
+
### ποΈ Enterprise Architects
|
|
159
|
+
|
|
160
|
+
**"We can make business architecture executable and projectable."**
|
|
161
|
+
|
|
162
|
+
- Export to FINOS CALM
|
|
163
|
+
- Preserve semantic consistency across systems
|
|
164
|
+
- Integrate with architecture and governance workflows
|
|
165
|
+
|
|
166
|
+
</td>
|
|
167
|
+
</tr>
|
|
168
|
+
<tr>
|
|
169
|
+
<td width="50%">
|
|
170
|
+
|
|
171
|
+
### π» Software Developers
|
|
172
|
+
|
|
173
|
+
**"Type-safe domain models that work across our stack."**
|
|
174
|
+
|
|
175
|
+
- Native APIs for Python, TypeScript, Rust, and WASM
|
|
176
|
+
- Runtime validation backed by a Rust core
|
|
177
|
+
- Less duplicate business logic across services and frontends
|
|
178
|
+
|
|
179
|
+
</td>
|
|
180
|
+
<td width="50%">
|
|
181
|
+
|
|
182
|
+
### π Compliance and Governance Teams
|
|
183
|
+
|
|
184
|
+
**"Policies can become executable, auditable structures."**
|
|
185
|
+
|
|
186
|
+
- Express complex rules in controlled language
|
|
187
|
+
- Check policies against declared domain structure
|
|
188
|
+
- Preserve inspectable traces of policy changes and decisions
|
|
189
|
+
|
|
190
|
+
</td>
|
|
191
|
+
</tr>
|
|
192
|
+
</table>
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## How It Works: Six Core Building Blocks
|
|
197
|
+
|
|
198
|
+
DomainForge starts with **six core concepts**:
|
|
199
|
+
|
|
200
|
+
| Concept | What It Represents | Example |
|
|
201
|
+
| --- | --- | --- |
|
|
202
|
+
| **π’ Entity** | Actors and locations in your system | Assembly Line, Customer, Warehouse |
|
|
203
|
+
| **π¦ Resource** | Things of value that move | Products, Money, Information |
|
|
204
|
+
| **π Flow** | Movement between entities | Shipments, Payments, Work Orders |
|
|
205
|
+
| **π Instance** | Specific, trackable items | Camera #SN12345, Invoice #INV-2024 |
|
|
206
|
+
| **π Pattern** | Reusable validation patterns | Email format, SKU codes |
|
|
207
|
+
| **π Policy** | Business rules and constraints | "All shipments must be inspected" |
|
|
208
|
+
|
|
209
|
+
That is the starting vocabulary. More advanced declarations β roles, relations, dimensions, units, metrics, mappings, projections, and concept changes β extend the model when the domain needs more structure.
|
|
210
|
+
|
|
211
|
+
No magic syntax. No framework lock-in. Just executable domain meaning.
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## SEA DSL Syntax
|
|
216
|
+
|
|
217
|
+
Write models directly in `.sea` files β human-readable, version-controllable, and parseable by all bindings.
|
|
218
|
+
|
|
219
|
+
### Basic Example
|
|
220
|
+
|
|
221
|
+
```sea
|
|
222
|
+
// Define entities (who/where)
|
|
223
|
+
Entity "Warehouse" in logistics
|
|
224
|
+
Entity "Factory" in manufacturing
|
|
225
|
+
|
|
226
|
+
// Define resources (what moves)
|
|
227
|
+
Resource "Camera" units in inventory
|
|
228
|
+
|
|
229
|
+
// Define flows (how things move)
|
|
230
|
+
Flow "Camera" from "Warehouse" to "Factory" quantity 100
|
|
231
|
+
|
|
232
|
+
// Define validation patterns
|
|
233
|
+
Pattern "SKU" matches "^[A-Z]{3}-[0-9]{4}$"
|
|
234
|
+
|
|
235
|
+
// Define business rules
|
|
236
|
+
Policy min_shipment as: quantity >= 10
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Advanced Features
|
|
240
|
+
|
|
241
|
+
```sea
|
|
242
|
+
// Versioned entities with evolution tracking
|
|
243
|
+
Entity "Vendor" v2.0.0
|
|
244
|
+
@replaces "Supplier" v1.0.0
|
|
245
|
+
@changes ["renamed", "added_fields"]
|
|
246
|
+
|
|
247
|
+
// Roles and relations
|
|
248
|
+
Role "Approver" in governance
|
|
249
|
+
|
|
250
|
+
Relation "Payment"
|
|
251
|
+
subject: "Buyer"
|
|
252
|
+
predicate: "pays"
|
|
253
|
+
object: "Seller"
|
|
254
|
+
via: flow "Money"
|
|
255
|
+
|
|
256
|
+
// Typed instances
|
|
257
|
+
Instance acme_corp of "Vendor" {
|
|
258
|
+
name: "Acme Corporation",
|
|
259
|
+
credit_limit: 50000 "USD"
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Quantified policy expressions
|
|
263
|
+
Policy all_shipments_inspected as:
|
|
264
|
+
forall s in flows: (s.inspected = true)
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### All Declaration Types
|
|
268
|
+
|
|
269
|
+
| Declaration | Syntax |
|
|
270
|
+
| --- | --- |
|
|
271
|
+
| Entity | `Entity "Name" [vX.Y.Z] [in domain]` |
|
|
272
|
+
| Resource | `Resource "Name" [unit] [in domain]` |
|
|
273
|
+
| Flow | `Flow "Resource" from "A" to "B" [quantity N]` |
|
|
274
|
+
| Pattern | `Pattern "Name" matches "regex"` |
|
|
275
|
+
| Role | `Role "Name" [in domain]` |
|
|
276
|
+
| Relation | `Relation "Name" subject: ... predicate: ... object: ...` |
|
|
277
|
+
| Instance | `Instance id of "Entity" { field: value }` |
|
|
278
|
+
| Policy | `Policy name as: expression` |
|
|
279
|
+
| Dimension | `Dimension "Name"` |
|
|
280
|
+
| Unit | `Unit "Name" of "Dimension" factor N base "Base"` |
|
|
281
|
+
| Metric | `Metric "Name" as: expression` |
|
|
282
|
+
| Mapping | `Mapping "Name" for format { ... }` |
|
|
283
|
+
| Projection | `Projection "Name" for format { ... }` |
|
|
284
|
+
| ConceptChange | `ConceptChange "Name" @from_version ... @to_version ...` |
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## Real-World Impact
|
|
289
|
+
|
|
290
|
+
<details>
|
|
291
|
+
<summary><strong>π Manufacturing: Assembly Line Control</strong> (click to expand)</summary>
|
|
292
|
+
|
|
293
|
+
```python
|
|
294
|
+
import domainforge
|
|
295
|
+
|
|
296
|
+
graph = domainforge.Graph()
|
|
297
|
+
|
|
298
|
+
# Define the supply chain
|
|
299
|
+
supplier = domainforge.Entity("Component Supplier", "supply")
|
|
300
|
+
assembly = domainforge.Entity("Assembly Line A", "manufacturing")
|
|
301
|
+
quality_control = domainforge.Entity("QC Department", "quality")
|
|
302
|
+
finished_goods = domainforge.Entity("Finished Goods Warehouse", "logistics")
|
|
303
|
+
graph.add_entity(supplier)
|
|
304
|
+
graph.add_entity(assembly)
|
|
305
|
+
graph.add_entity(quality_control)
|
|
306
|
+
graph.add_entity(finished_goods)
|
|
307
|
+
|
|
308
|
+
# Define what's being built
|
|
309
|
+
pcb_board = domainforge.Resource("PCB Board", "pieces")
|
|
310
|
+
camera_module = domainforge.Resource("Camera Module", "units")
|
|
311
|
+
graph.add_resource(pcb_board)
|
|
312
|
+
graph.add_resource(camera_module)
|
|
313
|
+
|
|
314
|
+
# Define the flow of components
|
|
315
|
+
component_delivery = domainforge.Flow(
|
|
316
|
+
pcb_board.id(),
|
|
317
|
+
supplier.id(),
|
|
318
|
+
assembly.id(),
|
|
319
|
+
500.0
|
|
320
|
+
)
|
|
321
|
+
graph.add_flow(component_delivery)
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
**Result:** Inventory constraints can be checked before they turn into production delays.
|
|
325
|
+
|
|
326
|
+
</details>
|
|
327
|
+
|
|
328
|
+
<details>
|
|
329
|
+
<summary><strong>π° Finance: Payment Fraud Detection</strong> (click to expand)</summary>
|
|
330
|
+
|
|
331
|
+
```typescript
|
|
332
|
+
import { Graph, Entity, Resource, Flow } from "@godspeedai/domainforge";
|
|
333
|
+
|
|
334
|
+
const graph = new Graph();
|
|
335
|
+
|
|
336
|
+
const customer = new Entity("Customer Account");
|
|
337
|
+
const merchant = new Entity("Merchant Account");
|
|
338
|
+
const gateway = new Entity("Payment Gateway");
|
|
339
|
+
graph.addEntity(customer);
|
|
340
|
+
graph.addEntity(merchant);
|
|
341
|
+
graph.addEntity(gateway);
|
|
342
|
+
|
|
343
|
+
const money = new Resource("USD", "dollars");
|
|
344
|
+
graph.addResource(money);
|
|
345
|
+
|
|
346
|
+
// Track payment flows
|
|
347
|
+
const payment = new Flow(money.id, customer.id, merchant.id, 100);
|
|
348
|
+
graph.addFlow(payment);
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**Result:** The same domain model can support policy checks before downstream action.
|
|
352
|
+
|
|
353
|
+
</details>
|
|
354
|
+
|
|
355
|
+
<details>
|
|
356
|
+
<summary><strong>π Logistics: Cross-Border Compliance</strong> (click to expand)</summary>
|
|
357
|
+
|
|
358
|
+
```python
|
|
359
|
+
import domainforge
|
|
360
|
+
|
|
361
|
+
graph = domainforge.Graph()
|
|
362
|
+
|
|
363
|
+
# Multi-location warehouses
|
|
364
|
+
warehouse_us = domainforge.Entity("US Distribution Center", "logistics")
|
|
365
|
+
warehouse_us.set_attribute("location", "USA")
|
|
366
|
+
|
|
367
|
+
warehouse_eu = domainforge.Entity("EU Distribution Center", "logistics")
|
|
368
|
+
warehouse_eu.set_attribute("location", "Germany")
|
|
369
|
+
|
|
370
|
+
retail_store = domainforge.Entity("Retail Store", "logistics")
|
|
371
|
+
retail_store.set_attribute("location", "France")
|
|
372
|
+
|
|
373
|
+
graph.add_entity(warehouse_us)
|
|
374
|
+
graph.add_entity(warehouse_eu)
|
|
375
|
+
graph.add_entity(retail_store)
|
|
376
|
+
|
|
377
|
+
product = domainforge.Resource("Widget", "boxes")
|
|
378
|
+
graph.add_resource(product)
|
|
379
|
+
|
|
380
|
+
# Create cross-border flow
|
|
381
|
+
shipment = domainforge.Flow(
|
|
382
|
+
product.id(),
|
|
383
|
+
warehouse_eu.id(),
|
|
384
|
+
retail_store.id(),
|
|
385
|
+
250.0
|
|
386
|
+
)
|
|
387
|
+
graph.add_flow(shipment)
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
**Result:** Cross-border requirements can be modeled as enforceable policy instead of scattered checklist logic.
|
|
391
|
+
|
|
392
|
+
</details>
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## Technical Foundation
|
|
397
|
+
|
|
398
|
+
<details>
|
|
399
|
+
<summary><strong>β‘ Performance Characteristics</strong></summary>
|
|
400
|
+
|
|
401
|
+
- **Rust core** for performance-critical validation
|
|
402
|
+
- **FFI overhead < 1ms** per operation
|
|
403
|
+
- **Streaming validation** for large models
|
|
404
|
+
|
|
405
|
+
See [benchmarks](docs/explanations/performance-benchmarks.md) for measured results.
|
|
406
|
+
|
|
407
|
+
</details>
|
|
408
|
+
|
|
409
|
+
<details>
|
|
410
|
+
<summary><strong>π Language Bindings</strong></summary>
|
|
411
|
+
|
|
412
|
+
**Python (PyO3):**
|
|
413
|
+
|
|
414
|
+
```python
|
|
415
|
+
import domainforge
|
|
416
|
+
|
|
417
|
+
d = domainforge.Dimension.parse("currency")
|
|
418
|
+
u = domainforge.Unit("USD", "US Dollar", "Currency", 1.0, "USD")
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
**TypeScript (napi-rs):**
|
|
422
|
+
|
|
423
|
+
```typescript
|
|
424
|
+
import { Dimension, Unit } from "@godspeedai/domainforge";
|
|
425
|
+
|
|
426
|
+
const d = Dimension.parse("currency");
|
|
427
|
+
const u = new Unit("USD", "US Dollar", "Currency", 1.0, "USD");
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
**WASM (browser):**
|
|
431
|
+
|
|
432
|
+
```javascript
|
|
433
|
+
import init, { Dimension, Unit } from "./domainforge_core.js";
|
|
434
|
+
await init();
|
|
435
|
+
|
|
436
|
+
const d = new Dimension("currency");
|
|
437
|
+
const u = new Unit("USD", "US Dollar", "Currency", 1.0, "USD");
|
|
438
|
+
|
|
439
|
+
// Programmatic Expression Building & Normalization
|
|
440
|
+
const expr = Expression.binary(
|
|
441
|
+
BinaryOp.And,
|
|
442
|
+
Expression.variable("b"),
|
|
443
|
+
Expression.variable("a")
|
|
444
|
+
);
|
|
445
|
+
console.log(expr.normalize().toStringRepr()); // "(a AND b)"
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
Bindings are designed to preserve the same core semantics across runtimes, with conformance tests guarding against behavioral drift.
|
|
449
|
+
|
|
450
|
+
</details>
|
|
451
|
+
|
|
452
|
+
<details>
|
|
453
|
+
<summary><strong>ποΈ Architecture</strong></summary>
|
|
454
|
+
|
|
455
|
+
```text
|
|
456
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
457
|
+
β Your Application β
|
|
458
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
|
|
459
|
+
β Python API β TypeScript β WASM β
|
|
460
|
+
β (PyO3) β (napi-rs) β (wasm-bindgen) β
|
|
461
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
|
|
462
|
+
β Rust Core Engine (domainforge-core) β
|
|
463
|
+
β βββββββββββββββ¬βββββββββββββββ¬ββββββββββββββββββ β
|
|
464
|
+
β β Primitives β Graph Store β Policy Engine β β
|
|
465
|
+
β β Parser β Validator β CALM Export β β
|
|
466
|
+
β β Authority β Fact Store β Provenance β β
|
|
467
|
+
β βββββββββββββββ΄βββββββββββββββ΄ββββββββββββββββββ β
|
|
468
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
**Design Principles:**
|
|
472
|
+
|
|
473
|
+
1. **Rust core is canonical.** Bindings wrap core behavior instead of duplicating logic.
|
|
474
|
+
2. **Deterministic behavior.** Stable ordering supports repeatable outputs across runs.
|
|
475
|
+
3. **Standards-aware projection.** SBVR-aligned expressions and FINOS CALM export help domain models travel into enterprise architecture workflows.
|
|
476
|
+
|
|
477
|
+
</details>
|
|
478
|
+
|
|
479
|
+
<details>
|
|
480
|
+
<summary><strong>π§ CLI Usage</strong></summary>
|
|
481
|
+
|
|
482
|
+
```bash
|
|
483
|
+
# Install the CLI
|
|
484
|
+
cargo install --path domainforge-core --features cli
|
|
485
|
+
|
|
486
|
+
# Validate a model
|
|
487
|
+
domainforge validate model.sea
|
|
488
|
+
|
|
489
|
+
# Export to FINOS CALM
|
|
490
|
+
domainforge project --format calm model.sea architecture.json
|
|
491
|
+
|
|
492
|
+
# Import from Knowledge Graph
|
|
493
|
+
domainforge import --format kg model.ttl
|
|
494
|
+
|
|
495
|
+
# Normalize Expressions
|
|
496
|
+
domainforge normalize "b AND a" # -> "(a AND b)"
|
|
497
|
+
|
|
498
|
+
# Evaluate authority decisions
|
|
499
|
+
domainforge authority config.json request.json --facts facts.json --json
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
[Full CLI Reference β](docs/reference/cli-commands.md)
|
|
503
|
+
|
|
504
|
+
</details>
|
|
505
|
+
|
|
506
|
+
<details>
|
|
507
|
+
<summary><strong>π‘οΈ Policy Authority</strong></summary>
|
|
508
|
+
|
|
509
|
+
DomainForge includes a **Policy Authority** system that makes business authority executable, deterministic, fact-grounded, and traceable.
|
|
510
|
+
|
|
511
|
+
**Key capabilities:**
|
|
512
|
+
|
|
513
|
+
- **Four policy modalities:** Permission, Prohibition, Obligation, Override
|
|
514
|
+
- **Trusted fact provenance:** Caller-supplied facts are untrusted by default
|
|
515
|
+
- **Three-valued logic:** True, False, and Unknown with modality-aware unknown handling
|
|
516
|
+
- **Deterministic conflict resolution:** Modality precedence β priority β specificity vector dominance
|
|
517
|
+
- **Replayable audit traces:** Every decision produces a complete `AuthorityTrace`
|
|
518
|
+
|
|
519
|
+
```python
|
|
520
|
+
from domainforge import AuthorityEnvironment
|
|
521
|
+
|
|
522
|
+
# Create environment from config
|
|
523
|
+
env = AuthorityEnvironment(config_json)
|
|
524
|
+
env.validate()
|
|
525
|
+
|
|
526
|
+
# Evaluate an authority request
|
|
527
|
+
trace_json, decision_json = env.evaluate(request_json, facts_json)
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
```typescript
|
|
531
|
+
import { evaluateAuthority } from '@godspeedai/domainforge';
|
|
532
|
+
|
|
533
|
+
const result = evaluateAuthority(configJson, requestJson, factsJson);
|
|
534
|
+
console.log(result.decisionJson);
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
**Decision outcomes:** `Allow`, `Deny`, `Escalate`, `NotApplicable`, `Reject`
|
|
538
|
+
|
|
539
|
+
**Safety guarantees:**
|
|
540
|
+
|
|
541
|
+
- No authority without declared semantics
|
|
542
|
+
- No decision without trusted facts
|
|
543
|
+
- No trust upgrade through derivation
|
|
544
|
+
- No allow from unknown permission
|
|
545
|
+
- No weakened prohibition from omitted facts
|
|
546
|
+
- No scalar specificity shortcuts
|
|
547
|
+
|
|
548
|
+
</details>
|
|
549
|
+
|
|
550
|
+
<details>
|
|
551
|
+
<summary><strong>π Error Diagnostics</strong></summary>
|
|
552
|
+
|
|
553
|
+
Comprehensive error handling with fuzzy matching suggestions:
|
|
554
|
+
|
|
555
|
+
```text
|
|
556
|
+
Error[E001]: Undefined Entity: 'Warehous' at line 1
|
|
557
|
+
--> 1:23
|
|
558
|
+
|
|
|
559
|
+
1 | Flow "Materials" from "Warehous" to "Factory"
|
|
560
|
+
| ^^^^^^^^^^
|
|
561
|
+
|
|
|
562
|
+
hint: Did you mean 'Warehouse'?
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
- **30+ structured error codes** with detailed descriptions
|
|
566
|
+
- **Multiple output formats**: JSON, human-readable, LSP
|
|
567
|
+
- **Native error types** for Python, TypeScript, and WASM
|
|
568
|
+
|
|
569
|
+
[Error Code Catalog β](docs/reference/error-codes.md)
|
|
570
|
+
|
|
571
|
+
</details>
|
|
572
|
+
|
|
573
|
+
---
|
|
574
|
+
|
|
575
|
+
## Getting Started
|
|
576
|
+
|
|
577
|
+
### Quick Start
|
|
578
|
+
|
|
579
|
+
```bash
|
|
580
|
+
# Clone and set up
|
|
581
|
+
git clone https://github.com/GodSpeedAI/DomainForge.git
|
|
582
|
+
cd DomainForge
|
|
583
|
+
pip install maturin
|
|
584
|
+
maturin develop
|
|
585
|
+
|
|
586
|
+
# Run your first model
|
|
587
|
+
python examples/camera_factory.py
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
### Running Tests
|
|
591
|
+
|
|
592
|
+
```bash
|
|
593
|
+
# Per-language tests
|
|
594
|
+
just rust-test # Rust core
|
|
595
|
+
just python-test # Python bindings
|
|
596
|
+
just ts-test # TypeScript bindings
|
|
597
|
+
|
|
598
|
+
# All tests at once
|
|
599
|
+
just all-tests
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
### Build from Source
|
|
603
|
+
|
|
604
|
+
```bash
|
|
605
|
+
# Python bindings
|
|
606
|
+
pip install maturin && maturin build --release
|
|
607
|
+
|
|
608
|
+
# TypeScript bindings
|
|
609
|
+
npm install && npm run build
|
|
610
|
+
|
|
611
|
+
# WebAssembly
|
|
612
|
+
./scripts/build-wasm.sh
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
---
|
|
616
|
+
|
|
617
|
+
## Documentation
|
|
618
|
+
|
|
619
|
+
| Resource | Description |
|
|
620
|
+
| --- | --- |
|
|
621
|
+
| π [**Copilot Instructions**](.github/copilot-instructions.md) | Essential guide for AI coding agents |
|
|
622
|
+
| π [**Product Requirements**](docs/specs/PRD-001-sea-projection-framework.md) | PRD with success metrics |
|
|
623
|
+
| π [**System Design**](docs/specs/SDS-002-domainforge-core-architecture.md) | Technical specifications |
|
|
624
|
+
| ποΈ [**Architecture Decisions**](docs/specs/ADR-001-sea-dsl-semantic-source-of-truth.md) | Key architectural choices |
|
|
625
|
+
| πΊοΈ [**CALM Mapping**](docs/reference/calm-mapping.md) | SEA β CALM conversion |
|
|
626
|
+
| π [**Error Codes**](docs/reference/error-codes.md) | Validation error reference |
|
|
627
|
+
| π§ [**CLI Reference**](docs/reference/cli-commands.md) | CLI commands and usage |
|
|
628
|
+
|
|
629
|
+
---
|
|
630
|
+
|
|
631
|
+
## Contributing
|
|
632
|
+
|
|
633
|
+
We welcome contributions. Please see [Contributing Guide](CONTRIBUTING.md) for developer notes on building the CLI, TypeScript bindings, and WASM.
|
|
634
|
+
|
|
635
|
+
---
|
|
636
|
+
|
|
637
|
+
## License
|
|
638
|
+
|
|
639
|
+
DomainForge is open source under the [Apache-2.0 License](LICENSE).
|
|
640
|
+
|
|
641
|
+
---
|
|
642
|
+
|
|
643
|
+
## Acknowledgments
|
|
644
|
+
|
|
645
|
+
Built on foundational work from:
|
|
646
|
+
|
|
647
|
+
- **[ERP5 Unified Business Model](https://www.erp5.com/)** β Foundational primitive design
|
|
648
|
+
- **[SBVR Standard (OMG)](https://www.omg.org/spec/SBVR/)** β Semantic business vocabulary
|
|
649
|
+
- **[FINOS CALM](https://github.com/finos/architecture-as-code)** β Architecture-as-Code integration
|
|
650
|
+
- **[Rust Community](https://www.rust-lang.org/)** β High-performance core runtime
|
|
651
|
+
|
|
652
|
+
---
|
|
653
|
+
|
|
654
|
+
<div align="center">
|
|
655
|
+
|
|
656
|
+
**Make business meaning executable.**
|
|
657
|
+
|
|
658
|
+
[Get Started β](#install-in-30-seconds) Β· [Read the Docs β](#documentation) Β· [See Examples β](#real-world-impact)
|
|
659
|
+
|
|
660
|
+
</div>
|