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,110 @@
|
|
|
1
|
+
# Export to CALM
|
|
2
|
+
|
|
3
|
+
Goal: Export a SEA DSL model to FINOS CALM and verify the payload is valid.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- SEA CLI installed (`cargo install --path domainforge-core --features cli`).
|
|
8
|
+
- A validated `.sea` model file with entities/resources/flows (and optional roles/relations).
|
|
9
|
+
- Optional: Python/TypeScript bindings for programmatic export.
|
|
10
|
+
- JSON tooling such as `jq` for inspection.
|
|
11
|
+
|
|
12
|
+
## Steps (be concise)
|
|
13
|
+
|
|
14
|
+
1. **Validate the model first (CLI)**
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
domainforge validate --format human path/to/model.sea
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
- Fails fast on syntax/semantic errors; fix these before exporting.
|
|
21
|
+
|
|
22
|
+
2. **Export to CALM JSON (CLI)**
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
domainforge project --format calm path/to/model.sea calm.json
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
- On success, the command prints `Projected to CALM: calm.json`.
|
|
29
|
+
- Output includes `metadata.sea:version` set to the current SEA version (e.g., `0.1.0`).
|
|
30
|
+
|
|
31
|
+
3. **Inspect the output**
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
jq '.metadata, (.models[0].roles | length), (.models[0].relations | length)' calm.json
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
- Confirm roles/relations/flows are present and IDs look like UUIDs.
|
|
38
|
+
|
|
39
|
+
4. **Re-import to double-check**
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
domainforge import --format kg calm.json
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
- Uses the KG importer to ensure the CALM payload can be transformed back into a graph.
|
|
46
|
+
|
|
47
|
+
5. **Export programmatically in Python**
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
from domainforge import Graph
|
|
51
|
+
|
|
52
|
+
with open("path/to/model.sea") as f:
|
|
53
|
+
graph = Graph.parse(f.read())
|
|
54
|
+
|
|
55
|
+
calm_json = graph.export_calm()
|
|
56
|
+
|
|
57
|
+
with open("calm.json", "w") as f:
|
|
58
|
+
f.write(calm_json)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
6. **Export programmatically in TypeScript**
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import { Graph } from "@godspeedai/domainforge";
|
|
65
|
+
import { readFileSync, writeFileSync } from "fs";
|
|
66
|
+
|
|
67
|
+
const graph = Graph.parse(readFileSync("path/to/model.sea", "utf8"));
|
|
68
|
+
const calm = graph.exportCalm();
|
|
69
|
+
writeFileSync("calm.json", calm);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
7. **Validate against the CALM schema (optional)**
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
ajv validate -s calm.schema.json -d calm.json
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
- Use the FINOS Architecture-as-Code schema for strict validation if a downstream system requires it.
|
|
79
|
+
|
|
80
|
+
## Mapping Notes
|
|
81
|
+
|
|
82
|
+
- Roles and relations emit as typed facts; verify `subjectRole`, `predicate`, and `objectRole` fields reference valid role IDs.
|
|
83
|
+
- Instances and resource quantities retain their units; ensure custom units are defined before export to avoid validation failures.
|
|
84
|
+
- Namespaces: unset namespaces default to `"default"` and may be omitted in the CALM output.
|
|
85
|
+
- Metadata includes `sea:exported`, `sea:version`, and `sea:timestamp`; keep them for traceability.
|
|
86
|
+
|
|
87
|
+
## Validation Tips
|
|
88
|
+
|
|
89
|
+
- Use `jq` to spot-check key sections (roles, relations, flows) and ensure UUIDs are present.
|
|
90
|
+
- If a relation references a flow ID, confirm the flow exists and carries a valid UUID; missing IDs cause export failures.
|
|
91
|
+
- For large models, prefer `domainforge project --format calm input.sea | gzip > calm.json.gz` to stream-compress during export (portable across Bourne-like shells and Windows with compatible tools).
|
|
92
|
+
|
|
93
|
+
## Troubleshooting
|
|
94
|
+
|
|
95
|
+
- **Parse errors**: Run `domainforge validate` before exporting; export stops on parse failure.
|
|
96
|
+
- **Missing roles/relations**: Ensure they are declared in the DSL; empty arrays in CALM indicate nothing was declared.
|
|
97
|
+
- **Schema validation failures**: Align with the official CALM schema and update your DSL model to supply required fields (e.g., `id`, `name`).
|
|
98
|
+
- **Version drift**: If consumers require a specific SEA version, check `metadata["sea:version"]` and consider pinning the toolchain.
|
|
99
|
+
|
|
100
|
+
## Verification Checklist
|
|
101
|
+
|
|
102
|
+
- [ ] `domainforge validate` passes on the source `.sea` file.
|
|
103
|
+
- [ ] `domainforge project --format calm` succeeds and outputs metadata with `sea:version`.
|
|
104
|
+
- [ ] CALM payload re-imports through `domainforge import --format kg` without losing entities/resources/roles/relations.
|
|
105
|
+
- [ ] Optional schema validation (AJV) passes when required by downstream systems.
|
|
106
|
+
|
|
107
|
+
## Links
|
|
108
|
+
|
|
109
|
+
- Tutorials: [Getting Started](../tutorials/getting-started.md)
|
|
110
|
+
- Reference: [CALM Mapping](../reference/calm-mapping.md), [CLI Commands](../reference/cli-commands.md), [Primitives API](../reference/primitives-api.md)
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
# Export to Protobuf
|
|
2
|
+
|
|
3
|
+
This guide explains how to export SEA models to Protocol Buffers (`.proto`) files for use with gRPC services, binary serialization, and cross-language contracts.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- `sea` CLI installed ([install guide](./install-cli.md))
|
|
8
|
+
- A valid `.sea` model file
|
|
9
|
+
|
|
10
|
+
## Quick Start
|
|
11
|
+
|
|
12
|
+
Export an entity model to a `.proto` file:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
domainforge project --format protobuf model.sea output.proto
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
This generates a complete `.proto` file with:
|
|
19
|
+
|
|
20
|
+
- All entities as Protobuf messages
|
|
21
|
+
- All resources as Protobuf messages
|
|
22
|
+
- Type mappings from SEA types to proto types
|
|
23
|
+
- Metadata header with generation timestamp
|
|
24
|
+
|
|
25
|
+
## Example
|
|
26
|
+
|
|
27
|
+
Given a SEA model (`payment.sea`):
|
|
28
|
+
|
|
29
|
+
```sea
|
|
30
|
+
Namespace "com.example.payments"
|
|
31
|
+
|
|
32
|
+
Entity "Customer" {
|
|
33
|
+
name: String
|
|
34
|
+
email: String
|
|
35
|
+
balance: Money
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
Entity "Payment" {
|
|
39
|
+
amount: Money
|
|
40
|
+
status: String
|
|
41
|
+
timestamp: DateTime
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
Resource "PaymentRequest" USD
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Running:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
domainforge project --format protobuf payment.sea payment.proto
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Produces:
|
|
54
|
+
|
|
55
|
+
```protobuf
|
|
56
|
+
// Generated by SEA Projection Framework
|
|
57
|
+
// Projection: protobuf
|
|
58
|
+
// Source Namespace: com.example.payments
|
|
59
|
+
// Generated At: 2025-12-14T20:00:00Z
|
|
60
|
+
// DO NOT EDIT - This file is auto-generated
|
|
61
|
+
|
|
62
|
+
syntax = "proto3";
|
|
63
|
+
|
|
64
|
+
package com.example.payments;
|
|
65
|
+
|
|
66
|
+
option java_package = "com.example.payments";
|
|
67
|
+
option java_multiple_files = true;
|
|
68
|
+
option go_package = "github.com/example/payments";
|
|
69
|
+
|
|
70
|
+
import "google/protobuf/timestamp.proto";
|
|
71
|
+
|
|
72
|
+
message Customer {
|
|
73
|
+
string balance = 1;
|
|
74
|
+
string email = 2;
|
|
75
|
+
string name = 3;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
message Payment {
|
|
79
|
+
string amount = 1;
|
|
80
|
+
string status = 2;
|
|
81
|
+
google.protobuf.Timestamp timestamp = 3;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
message PaymentRequest {
|
|
85
|
+
string id = 1;
|
|
86
|
+
double value = 2;
|
|
87
|
+
string unit = 3;
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Options
|
|
92
|
+
|
|
93
|
+
### Include gRPC Services
|
|
94
|
+
|
|
95
|
+
Generate gRPC service definitions from Flow patterns:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
domainforge project --format protobuf --include-services model.sea output.proto
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
This converts SEA Flows into gRPC RPC methods:
|
|
102
|
+
|
|
103
|
+
| SEA Construct | gRPC Output |
|
|
104
|
+
| ----------------------- | ---------------------- |
|
|
105
|
+
| Flow destination entity | Service name |
|
|
106
|
+
| Flow name | RPC method name |
|
|
107
|
+
| Flow resource | Request/Response types |
|
|
108
|
+
|
|
109
|
+
### Multi-File Output
|
|
110
|
+
|
|
111
|
+
Split output by namespace for large models:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
domainforge project --format protobuf --multi-file --output-dir ./proto model.sea
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
This creates a directory structure:
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
proto/
|
|
121
|
+
├── common/
|
|
122
|
+
│ └── common.proto
|
|
123
|
+
├── payments/
|
|
124
|
+
│ └── payments.proto
|
|
125
|
+
└── customers/
|
|
126
|
+
└── customers.proto
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Specify Package Name
|
|
130
|
+
|
|
131
|
+
Override the default package:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
domainforge project --format protobuf --package "org.example.api" model.sea output.proto
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Language-Specific Options
|
|
138
|
+
|
|
139
|
+
Set language-specific proto options:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
domainforge project --format protobuf \
|
|
143
|
+
--option java_package="com.example.api" \
|
|
144
|
+
--option go_package="github.com/example/api" \
|
|
145
|
+
--option java_multiple_files=true \
|
|
146
|
+
model.sea output.proto
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Type Mapping
|
|
150
|
+
|
|
151
|
+
SEA types are mapped to Protobuf types as follows:
|
|
152
|
+
|
|
153
|
+
| SEA Type | Protobuf Type |
|
|
154
|
+
| ---------------- | --------------------------- |
|
|
155
|
+
| `String` | `string` |
|
|
156
|
+
| `Int` | `int64` |
|
|
157
|
+
| `Float` | `double` |
|
|
158
|
+
| `Bool` | `bool` |
|
|
159
|
+
| `Date` | `google.protobuf.Timestamp` |
|
|
160
|
+
| `DateTime` | `google.protobuf.Timestamp` |
|
|
161
|
+
| `Duration` | `google.protobuf.Duration` |
|
|
162
|
+
| `UUID` | `string` |
|
|
163
|
+
| `Money` | Custom `Money` message |
|
|
164
|
+
| `List<T>` | `repeated T` |
|
|
165
|
+
| `Optional<T>` | `optional T` |
|
|
166
|
+
| Entity reference | Message reference |
|
|
167
|
+
|
|
168
|
+
## Buf.build Integration
|
|
169
|
+
|
|
170
|
+
If `buf` CLI is installed, use it for linting and validation:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
# Lint generated protos
|
|
174
|
+
domainforge project --format protobuf --buf-lint model.sea output.proto
|
|
175
|
+
|
|
176
|
+
# Check breaking changes
|
|
177
|
+
domainforge project --format protobuf --buf-breaking --against ./previous model.sea output.proto
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
If `buf` is not installed, these flags emit a warning and continue.
|
|
181
|
+
|
|
182
|
+
## Programmatic Usage
|
|
183
|
+
|
|
184
|
+
### Rust
|
|
185
|
+
|
|
186
|
+
```rust
|
|
187
|
+
use domainforge_core::parser::parse_source;
|
|
188
|
+
use domainforge_core::parser::ast::ast_to_graph;
|
|
189
|
+
use domainforge_core::projection::protobuf::ProtobufEngine;
|
|
190
|
+
|
|
191
|
+
let source = std::fs::read_to_string("model.sea")?;
|
|
192
|
+
let ast = parse_source(&source)?;
|
|
193
|
+
let graph = ast_to_graph(&ast)?;
|
|
194
|
+
|
|
195
|
+
let proto_file = ProtobufEngine::project(&graph, "my_namespace", "com.example");
|
|
196
|
+
println!("{}", proto_file.to_proto_string());
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Python
|
|
200
|
+
|
|
201
|
+
```python
|
|
202
|
+
from domainforge_core import parse_source, ast_to_graph
|
|
203
|
+
from domainforge_core.projection import protobuf_engine
|
|
204
|
+
|
|
205
|
+
source = open("model.sea").read()
|
|
206
|
+
ast = parse_source(source)
|
|
207
|
+
graph = ast_to_graph(ast)
|
|
208
|
+
|
|
209
|
+
proto = protobuf_engine.project(graph, "my_namespace", "com.example")
|
|
210
|
+
print(proto.to_proto_string())
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### TypeScript
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
import { parseSource, astToGraph } from "domainforge-core";
|
|
217
|
+
import { ProtobufEngine } from "domainforge-core/projection";
|
|
218
|
+
|
|
219
|
+
const source = fs.readFileSync("model.sea", "utf-8");
|
|
220
|
+
const ast = parseSource(source);
|
|
221
|
+
const graph = astToGraph(ast);
|
|
222
|
+
|
|
223
|
+
const protoFile = ProtobufEngine.project(graph, "my_namespace", "com.example");
|
|
224
|
+
console.log(protoFile.toProtoString());
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Compatibility Checking
|
|
228
|
+
|
|
229
|
+
The engine supports schema compatibility checking to prevent breaking changes:
|
|
230
|
+
|
|
231
|
+
### Compatibility Modes
|
|
232
|
+
|
|
233
|
+
| Mode | Allowed Changes |
|
|
234
|
+
| ---------- | ----------------------------------------- |
|
|
235
|
+
| `Additive` | Only additions (new fields/messages) |
|
|
236
|
+
| `Backward` | Additions + safe removals (with reserved) |
|
|
237
|
+
| `Breaking` | Any changes allowed |
|
|
238
|
+
|
|
239
|
+
### CLI Usage
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# Check compatibility against previous version
|
|
243
|
+
domainforge project --format protobuf --compatibility additive \
|
|
244
|
+
--against ./previous/output.proto \
|
|
245
|
+
model.sea output.proto
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## gRPC Streaming
|
|
249
|
+
|
|
250
|
+
SEA Flows can specify streaming mode for gRPC:
|
|
251
|
+
|
|
252
|
+
```sea
|
|
253
|
+
// Unary (default)
|
|
254
|
+
Flow from Client to Server of Request
|
|
255
|
+
|
|
256
|
+
// Server streaming
|
|
257
|
+
Flow @streaming from Client to Server of EventStream
|
|
258
|
+
|
|
259
|
+
// Client streaming
|
|
260
|
+
Flow @client_streaming from Client to Server of DataChunks
|
|
261
|
+
|
|
262
|
+
// Bidirectional
|
|
263
|
+
Flow @bidirectional from Client to Server of ChatMessage
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
Generated proto:
|
|
267
|
+
|
|
268
|
+
```protobuf
|
|
269
|
+
service ServerService {
|
|
270
|
+
rpc ProcessRequest(Request) returns (RequestResponse);
|
|
271
|
+
rpc StreamEvents(EventStreamRequest) returns (stream EventStream);
|
|
272
|
+
rpc UploadChunks(stream DataChunks) returns (DataChunksResponse);
|
|
273
|
+
rpc Chat(stream ChatMessage) returns (stream ChatMessage);
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Troubleshooting
|
|
278
|
+
|
|
279
|
+
### Missing Well-Known Types
|
|
280
|
+
|
|
281
|
+
If you see errors about missing `google.protobuf.*` types:
|
|
282
|
+
|
|
283
|
+
1. Ensure your protoc includes path has the Google WKT:
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
protoc -I /usr/include -I . --go_out=. output.proto
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
2. Or install the WKT package for your language.
|
|
290
|
+
|
|
291
|
+
### Field Number Stability
|
|
292
|
+
|
|
293
|
+
Field numbers are assigned deterministically by alphabetical order of field names. To maintain backward compatibility:
|
|
294
|
+
|
|
295
|
+
- Don't rename fields
|
|
296
|
+
- Don't remove fields without using `reserved`
|
|
297
|
+
- Add new fields at the end (they'll get higher numbers)
|
|
298
|
+
|
|
299
|
+
### Import Errors
|
|
300
|
+
|
|
301
|
+
For multi-file output, ensure your import paths match the generated structure:
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
protoc -I ./proto --go_out=. proto/**/*.proto
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
## See Also
|
|
308
|
+
|
|
309
|
+
- [SDS-001: Protobuf Projection Engine](../specs/SDS-001-protobuf-projection-engine.md) - System design spec
|
|
310
|
+
- [ADR-003: Protobuf as Projection Target](../specs/ADR-003-protobuf-projection-target.md) - Architecture decision
|
|
311
|
+
- [Protobuf Advanced Features Plan](../plans/protobuf_advanced_features_plan.md) - Roadmap
|
|
312
|
+
- [CLI Commands Reference](../reference/cli-commands.md) - All CLI options
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Extend Grammar
|
|
2
|
+
|
|
3
|
+
Goal: Extend the SEA grammar in `domainforge-core/grammar/sea.pest`, update the parser/AST, and refresh tests across languages.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Rust toolchain with `cargo` and `just` available.
|
|
8
|
+
- Familiarity with Pest grammar syntax and the existing rules in `domainforge-core/grammar/sea.pest`.
|
|
9
|
+
- Ability to run Rust/Python/TypeScript tests (`just all-tests`) to ensure binding parity.
|
|
10
|
+
|
|
11
|
+
## Steps (be concise)
|
|
12
|
+
|
|
13
|
+
1. **Plan the syntax change**
|
|
14
|
+
|
|
15
|
+
- Identify the new construct (e.g., `Constraint`, `Annotation`).
|
|
16
|
+
- Decide whether it is a statement, expression, or modifier of existing rules.
|
|
17
|
+
- Sketch the EBNF and how it should appear in AST structs.
|
|
18
|
+
|
|
19
|
+
2. **Update the grammar**
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
sed -n '1,160p' domainforge-core/grammar/sea.pest # review nearby rules
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
- Add or modify rules using Pest syntax. Prefer `silent` rules (`_`) for whitespace handling.
|
|
26
|
+
- Keep tokens unambiguous; if you add keywords, update `identifier` to prevent collisions.
|
|
27
|
+
|
|
28
|
+
3. **Regenerate parser expectations**
|
|
29
|
+
|
|
30
|
+
- If the change affects parsing order, adjust combinators in `domainforge-core/src/parser.rs` or helpers in `domainforge-core/src/ast.rs`.
|
|
31
|
+
- Update AST types to include new fields (e.g., add `Annotation` struct) and ensure `FromStr` implementations parse them.
|
|
32
|
+
|
|
33
|
+
4. **Propagate to projections**
|
|
34
|
+
|
|
35
|
+
- **CALM/KG/SBVR**: Update projectors (`domainforge-core/src/calm/mod.rs`, `domainforge-core/src/kg.rs`, `domainforge-core/src/sbvr.rs`) so the new construct is emitted.
|
|
36
|
+
- **Validation**: Add semantic checks in `domainforge-core/src/validator.rs` to keep error reporting meaningful.
|
|
37
|
+
|
|
38
|
+
5. **Expose through bindings**
|
|
39
|
+
|
|
40
|
+
- Python: Add new fields/classes in `domainforge-core/src/python/primitives.rs` and wire them into `domainforge-core/src/python/lib.rs` or `graph.rs` if they are part of the `Graph` API.
|
|
41
|
+
- TypeScript: Mirror changes in `domainforge-core/src/typescript/primitives.rs` and adjust `domainforge-core/src/typescript/index.d.ts` typing.
|
|
42
|
+
- WASM: Update `domainforge-core/src/wasm/mod.rs` (or `domainforge-core/src/wasm/lib.rs`) exports to expose the new types if browser consumers need the feature.
|
|
43
|
+
|
|
44
|
+
6. **Add parser tests (Rust)**
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
cargo test -p domainforge-core parser_tests -- --nocapture
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- Create or edit fixtures under `domainforge-core/tests/` or `domainforge-core/examples/` to cover the new syntax and failure cases.
|
|
51
|
+
- Add golden tests if the construct affects export formats.
|
|
52
|
+
|
|
53
|
+
7. **Add binding tests (Python + TypeScript)**
|
|
54
|
+
|
|
55
|
+
- Python: write a `tests/test_<feature>.py` that parses the DSL snippet and asserts field values.
|
|
56
|
+
- TypeScript: add a Vitest case under `typescript-tests/` that mirrors the Python assertion to maintain parity.
|
|
57
|
+
|
|
58
|
+
8. **Run cross-language suites**
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
just rust-test
|
|
62
|
+
just python-test
|
|
63
|
+
just ts-test
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
- Use `just all-tests` to run everything sequentially before committing.
|
|
67
|
+
|
|
68
|
+
9. **Document the new syntax**
|
|
69
|
+
|
|
70
|
+
- Update `docs/new_docs/reference/grammar-spec.md` with the new rule and an example.
|
|
71
|
+
- Add a short section to the relevant how-to or tutorial to show usage.
|
|
72
|
+
|
|
73
|
+
## Cross-Bindings and Snapshots
|
|
74
|
+
|
|
75
|
+
- Keep serialized forms stable; if the new construct appears in CALM, adjust mapping tables and fixtures.
|
|
76
|
+
- Update `index.d.ts` and Python type hints to match the Rust structs so auto-completion remains accurate.
|
|
77
|
+
- Regenerate any snapshot tests that capture textual output (e.g., KG/Turtle strings) after confirming the change is intentional.
|
|
78
|
+
|
|
79
|
+
## Spec and Example Tests
|
|
80
|
+
|
|
81
|
+
- Write minimal DSL examples that highlight the new rule with and without namespaces.
|
|
82
|
+
- Add negative tests for malformed input to ensure errors are descriptive (use error codes from `validation_error.rs`).
|
|
83
|
+
- If the rule impacts policies, add evaluation tests in `domainforge-core/src/policy` or binding-specific test suites.
|
|
84
|
+
|
|
85
|
+
## Common Pitfalls / Troubleshooting
|
|
86
|
+
|
|
87
|
+
- Forgetting to update one binding often leads to runtime errors (`AttributeError` in Python, `undefined` in TS). Keep a checklist per language.
|
|
88
|
+
- Grammar precedence issues: if a new rule causes existing tests to fail, inspect operator precedence and adjust via Pest ordering or explicit `_` separators.
|
|
89
|
+
- When changing keywords, ensure backwards compatibility or document the breaking change with a migration note.
|
|
90
|
+
|
|
91
|
+
## Links
|
|
92
|
+
|
|
93
|
+
- Tutorials: [Extend Grammar Walkthrough](../tutorials/getting-started.md)
|
|
94
|
+
- Reference: [Grammar Spec](../reference/grammar-spec.md), [Primitives API](../reference/primitives-api.md), [Cross-Language Binding Strategy](../explanations/cross-language-binding-strategy.md)
|
|
95
|
+
|
|
96
|
+
## Verification Checklist
|
|
97
|
+
|
|
98
|
+
- [ ] Parser accepts the new syntax (Rust tests passing).
|
|
99
|
+
- [ ] CALM/KG/SBVR exports reflect the construct without dropping fields.
|
|
100
|
+
- [ ] Python and TypeScript bindings expose the new fields with the same naming.
|
|
101
|
+
- [ ] Documentation updated (how-to + grammar spec) with a runnable example.
|
|
102
|
+
- [ ] Version bumped or changelog entry added if the change is user-visible.
|
|
103
|
+
|
|
104
|
+
## Example Workflow (adding a `Note` keyword)
|
|
105
|
+
|
|
106
|
+
1. Add grammar rule:
|
|
107
|
+
|
|
108
|
+
```pest
|
|
109
|
+
note = { "Note" ~ string }
|
|
110
|
+
statement = { role_decl | relation_decl | note | flow_decl | resource_decl | entity_decl }
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
2. Update AST:
|
|
114
|
+
|
|
115
|
+
```rust
|
|
116
|
+
pub struct Note { pub text: String }
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
3. Wire projection:
|
|
120
|
+
|
|
121
|
+
- CALM: add `notes` array under model metadata.
|
|
122
|
+
- KG: emit as annotation triples.
|
|
123
|
+
|
|
124
|
+
4. Add tests:
|
|
125
|
+
|
|
126
|
+
- Rust: `tests/note_tests.rs` covering parse success/failure.
|
|
127
|
+
- Python: assert `graph.notes()[0].text == "Payment delayed"`.
|
|
128
|
+
- TypeScript: similar Vitest assertion.
|
|
129
|
+
|
|
130
|
+
5. Document:
|
|
131
|
+
|
|
132
|
+
- Add a snippet to `grammar-spec.md` and this how-to.
|
|
133
|
+
- Mention migration steps if the keyword conflicts with existing identifiers.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Generate RDF/Turtle
|
|
2
|
+
|
|
3
|
+
Goal: Output SEA models as RDF/Turtle (or RDF/XML) for knowledge graph pipelines and validate them before loading into a triple store.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- SEA CLI installed with `cli` feature.
|
|
8
|
+
- Rust toolchain and optional SHACL feature if you need RDF/XML import validation (`cargo test -p domainforge-core --features "cli shacl"`).
|
|
9
|
+
- Optional bindings: Python/TypeScript packages built locally for programmatic export.
|
|
10
|
+
- A `.sea` file (e.g., `domainforge-core/examples/basic.sea`).
|
|
11
|
+
|
|
12
|
+
## Steps (be concise)
|
|
13
|
+
|
|
14
|
+
1. **Export to Turtle using the CLI**
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
domainforge project --format kg domainforge-core/examples/basic.sea /tmp/basic.ttl
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
- The `project` command parses the DSL, builds a graph, and writes Turtle by default.
|
|
21
|
+
- The CLI prints `Projected to KG: /tmp/basic.ttl` on success.
|
|
22
|
+
|
|
23
|
+
2. **Export to RDF/XML instead of Turtle**
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
domainforge project --format kg domainforge-core/examples/basic.sea /tmp/basic.rdf
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- The exporter inspects the output extension; `.rdf` or `.xml` triggers RDF/XML formatting.
|
|
30
|
+
|
|
31
|
+
3. **Export programmatically in Rust**
|
|
32
|
+
|
|
33
|
+
```rust
|
|
34
|
+
use domainforge_core::{KnowledgeGraph, parser::parse_to_graph};
|
|
35
|
+
|
|
36
|
+
let source = std::fs::read_to_string("domainforge-core/examples/basic.sea")?;
|
|
37
|
+
let graph = parse_to_graph(&source)?;
|
|
38
|
+
let kg = KnowledgeGraph::from_graph(&graph)?;
|
|
39
|
+
let turtle = kg.to_turtle();
|
|
40
|
+
std::fs::write("/tmp/basic.ttl", turtle)?;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- Use `kg.to_rdf_xml()` if you need XML output for SHACL validators.
|
|
44
|
+
|
|
45
|
+
4. **Export programmatically in Python**
|
|
46
|
+
|
|
47
|
+
```python
|
|
48
|
+
from domainforge import Graph
|
|
49
|
+
import json
|
|
50
|
+
|
|
51
|
+
graph = Graph.parse(open("domainforge-core/examples/basic.sea").read())
|
|
52
|
+
calm = graph.export_calm()
|
|
53
|
+
print("CALM length", len(calm))
|
|
54
|
+
# Convert to Turtle via the CLI or call Rust from Python if you need KG directly
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
- Python bindings expose CALM export; convert CALM to Turtle using the CLI (`domainforge import --format kg /tmp/basic.calm.json`) if you need a one-liner.
|
|
58
|
+
|
|
59
|
+
5. **Export programmatically in TypeScript**
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
import { Graph } from "@godspeedai/domainforge";
|
|
63
|
+
import { writeFileSync } from "fs";
|
|
64
|
+
|
|
65
|
+
const graph = Graph.parse(require("fs").readFileSync("domainforge-core/examples/basic.sea", "utf8"));
|
|
66
|
+
const calm = graph.exportCalm();
|
|
67
|
+
writeFileSync("/tmp/basic.calm.json", calm);
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
- Feed the CALM output to the CLI or a Rust helper to generate Turtle. Direct KG export is currently provided by the Rust core.
|
|
71
|
+
|
|
72
|
+
6. **Validate the Turtle with SHACL (optional)**
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
domainforge validate-kg --file /tmp/basic.ttl
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
- Requires building with `--features shacl`. Validation fails if the KG violates the SEA SHACL shapes.
|
|
79
|
+
|
|
80
|
+
7. **Load into a triple store**
|
|
81
|
+
|
|
82
|
+
- Use `riot --validate /tmp/basic.ttl` (Apache Jena) to check syntax.
|
|
83
|
+
- Load into GraphDB or Blazegraph with the namespace you expect; Turtle output uses CURIE prefixes derived from namespaces in the source DSL.
|
|
84
|
+
|
|
85
|
+
## Metadata and Namespaces
|
|
86
|
+
|
|
87
|
+
- Default namespace resolves from `.sea-registry.toml` if present. If you do not set one, resources/entities use the `default` namespace prefix.
|
|
88
|
+
- Custom prefixes appear in the Turtle header. Use consistent namespace configuration to avoid collisions when merging multiple models.
|
|
89
|
+
- CALM metadata fields (`sea:version`, `sea:timestamp`) are not embedded directly in Turtle; store them alongside the graph in your catalog.
|
|
90
|
+
|
|
91
|
+
## Post-processing and Validation Tips
|
|
92
|
+
|
|
93
|
+
- **Minify or canonicalize**: Run `riot --out=N-TRIPLE /tmp/basic.ttl` to flatten prefixes for diff-friendly output.
|
|
94
|
+
- **SHACL diagnostics**: When `domainforge validate-kg` fails, inspect the error for the offending triple and fix the originating DSL element (often a missing role or flow ID).
|
|
95
|
+
- **Round-trip**: Convert DSL → Turtle → Import (`domainforge import --format kg`) → Export CALM to ensure no information loss before loading to production stores.
|
|
96
|
+
|
|
97
|
+
## Common Pitfalls / Troubleshooting
|
|
98
|
+
|
|
99
|
+
- Missing namespaces lead to verbose IRIs; define them in the registry to keep triples stable.
|
|
100
|
+
- Ensure flows have UUIDs; the KG exporter relies on deterministic IDs for edges.
|
|
101
|
+
- If you see `Failed to convert to Knowledge Graph`, re-run `domainforge validate` first—semantic errors in the DSL often surface during KG projection.
|
|
102
|
+
|
|
103
|
+
## Links
|
|
104
|
+
|
|
105
|
+
- Tutorials: [Getting Started](../tutorials/getting-started.md)
|
|
106
|
+
- Reference: [CALM Mapping](../reference/calm-mapping.md), [CLI Commands](../reference/cli-commands.md), [Grammar Spec](../reference/grammar-spec.md)
|