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,597 @@
|
|
|
1
|
+
# Protobuf Advanced Features Implementation Plan
|
|
2
|
+
|
|
3
|
+
This plan covers the implementation of advanced Protobuf projection features for `domainforge-core`.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
| Feature | Priority | Effort | Dependencies |
|
|
8
|
+
| ------------------------------------------- | -------- | ------ | -------------- |
|
|
9
|
+
| gRPC Service Definitions from Flow Patterns | HIGH | Medium | Flow primitive |
|
|
10
|
+
| Protobuf Well-Known Types | HIGH | Low | None |
|
|
11
|
+
| Custom Proto Options | MEDIUM | Low | None |
|
|
12
|
+
| Buf.build Integration | MEDIUM | Medium | External CLI |
|
|
13
|
+
| Multiple File Output per Namespace | LOW | Medium | None |
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Phase 1: Protobuf Well-Known Types
|
|
18
|
+
|
|
19
|
+
> [!IMPORTANT]
|
|
20
|
+
> This is the easiest win and should be done first as it improves type fidelity.
|
|
21
|
+
|
|
22
|
+
### Goal
|
|
23
|
+
|
|
24
|
+
Map SEA types to Google's well-known types (WKT) for better interoperability.
|
|
25
|
+
|
|
26
|
+
### Changes
|
|
27
|
+
|
|
28
|
+
#### [MODIFY] [protobuf.rs](file:///home/sprime01/projects/domainforge/domainforge-core/src/projection/protobuf.rs)
|
|
29
|
+
|
|
30
|
+
1. **Add WKT imports automatically**:
|
|
31
|
+
|
|
32
|
+
```rust
|
|
33
|
+
impl ProtoFile {
|
|
34
|
+
pub fn add_wkt_imports(&mut self) {
|
|
35
|
+
let wkt_imports = [
|
|
36
|
+
"google/protobuf/timestamp.proto",
|
|
37
|
+
"google/protobuf/duration.proto",
|
|
38
|
+
"google/protobuf/any.proto",
|
|
39
|
+
"google/protobuf/wrappers.proto",
|
|
40
|
+
];
|
|
41
|
+
// Add only imports that are actually used
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
2. **Extend `map_sea_type_to_proto()`**:
|
|
47
|
+
|
|
48
|
+
```rust
|
|
49
|
+
pub fn map_sea_type_to_proto(sea_type: &str) -> ProtoType {
|
|
50
|
+
match sea_type.to_lowercase().as_str() {
|
|
51
|
+
// Existing mappings...
|
|
52
|
+
"timestamp" | "datetime" => ProtoType::Message("google.protobuf.Timestamp".to_string()),
|
|
53
|
+
"duration" | "timespan" => ProtoType::Message("google.protobuf.Duration".to_string()),
|
|
54
|
+
"any" | "dynamic" => ProtoType::Message("google.protobuf.Any".to_string()),
|
|
55
|
+
"optional_int" => ProtoType::Message("google.protobuf.Int64Value".to_string()),
|
|
56
|
+
"optional_string" => ProtoType::Message("google.protobuf.StringValue".to_string()),
|
|
57
|
+
// ...
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
3. **Add `WellKnownType` enum**:
|
|
63
|
+
```rust
|
|
64
|
+
pub enum WellKnownType {
|
|
65
|
+
Timestamp,
|
|
66
|
+
Duration,
|
|
67
|
+
Any,
|
|
68
|
+
Struct,
|
|
69
|
+
Value,
|
|
70
|
+
ListValue,
|
|
71
|
+
Int32Value, Int64Value, UInt32Value, UInt64Value,
|
|
72
|
+
FloatValue, DoubleValue, BoolValue, StringValue, BytesValue,
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Tests
|
|
77
|
+
|
|
78
|
+
- Test timestamp field generates correct import
|
|
79
|
+
- Test duration field generates correct import
|
|
80
|
+
- Test multiple WKT fields consolidate imports
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Phase 2: gRPC Service Definitions from Flow Patterns
|
|
85
|
+
|
|
86
|
+
> [!IMPORTANT]
|
|
87
|
+
> This is the most impactful feature, enabling RPC generation from semantic flows.
|
|
88
|
+
|
|
89
|
+
### Goal
|
|
90
|
+
|
|
91
|
+
Generate gRPC service definitions from SEA Flow patterns, where:
|
|
92
|
+
|
|
93
|
+
- **Flow.from** → Request message source
|
|
94
|
+
- **Flow.to** → Response message destination
|
|
95
|
+
- **Flow.resource** → Request/Response payload type
|
|
96
|
+
|
|
97
|
+
### Semantic Mapping
|
|
98
|
+
|
|
99
|
+
| SEA Concept | gRPC Concept |
|
|
100
|
+
| ------------------------- | ------------------------ |
|
|
101
|
+
| Entity (service provider) | Service |
|
|
102
|
+
| Flow (from → to) | RPC method |
|
|
103
|
+
| Flow's Resource | Request/Response message |
|
|
104
|
+
| Flow direction | Unary/Streaming |
|
|
105
|
+
|
|
106
|
+
### New IR Types
|
|
107
|
+
|
|
108
|
+
#### [MODIFY] [protobuf.rs](file:///home/sprime01/projects/domainforge/domainforge-core/src/projection/protobuf.rs)
|
|
109
|
+
|
|
110
|
+
```rust
|
|
111
|
+
/// Represents a gRPC service definition.
|
|
112
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
113
|
+
pub struct ProtoService {
|
|
114
|
+
/// Service name (e.g., "PaymentService")
|
|
115
|
+
pub name: String,
|
|
116
|
+
/// RPC methods
|
|
117
|
+
pub methods: Vec<ProtoRpcMethod>,
|
|
118
|
+
/// Documentation comments
|
|
119
|
+
pub comments: Vec<String>,
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/// Represents an RPC method definition.
|
|
123
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
124
|
+
pub struct ProtoRpcMethod {
|
|
125
|
+
/// Method name (e.g., "ProcessPayment")
|
|
126
|
+
pub name: String,
|
|
127
|
+
/// Request message type
|
|
128
|
+
pub request_type: String,
|
|
129
|
+
/// Response message type
|
|
130
|
+
pub response_type: String,
|
|
131
|
+
/// Whether request is streaming
|
|
132
|
+
pub client_streaming: bool,
|
|
133
|
+
/// Whether response is streaming
|
|
134
|
+
pub server_streaming: bool,
|
|
135
|
+
/// Documentation comments
|
|
136
|
+
pub comments: Vec<String>,
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Engine Extension
|
|
141
|
+
|
|
142
|
+
```rust
|
|
143
|
+
impl ProtobufEngine {
|
|
144
|
+
/// Generate services from Flows.
|
|
145
|
+
///
|
|
146
|
+
/// Groups flows by their destination entity (service provider)
|
|
147
|
+
/// and creates RPC methods for each flow.
|
|
148
|
+
pub fn flows_to_services(graph: &Graph) -> Vec<ProtoService> {
|
|
149
|
+
let mut services: BTreeMap<String, ProtoService> = BTreeMap::new();
|
|
150
|
+
|
|
151
|
+
for flow in graph.all_flows() {
|
|
152
|
+
let to_entity = graph.get_entity(flow.to_id());
|
|
153
|
+
let service_name = format!("{}Service", to_pascal_case(to_entity.name()));
|
|
154
|
+
|
|
155
|
+
// Create RPC method from flow
|
|
156
|
+
let method = ProtoRpcMethod {
|
|
157
|
+
name: derive_method_name(flow),
|
|
158
|
+
request_type: derive_request_type(flow, graph),
|
|
159
|
+
response_type: derive_response_type(flow, graph),
|
|
160
|
+
client_streaming: false,
|
|
161
|
+
server_streaming: false,
|
|
162
|
+
comments: vec![],
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
services.entry(service_name).or_insert_with(|| ProtoService::new(service_name))
|
|
166
|
+
.methods.push(method);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
services.into_values().collect()
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Example Transformation
|
|
175
|
+
|
|
176
|
+
**SEA Input:**
|
|
177
|
+
|
|
178
|
+
```sea
|
|
179
|
+
Entity "Customer"
|
|
180
|
+
Entity "PaymentProcessor"
|
|
181
|
+
Resource "PaymentRequest" USD
|
|
182
|
+
|
|
183
|
+
Flow from Customer to PaymentProcessor of PaymentRequest
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Generated `.proto`:**
|
|
187
|
+
|
|
188
|
+
```protobuf
|
|
189
|
+
service PaymentProcessorService {
|
|
190
|
+
rpc ProcessPaymentRequest(PaymentRequest) returns (PaymentRequestResponse);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
message PaymentRequest {
|
|
194
|
+
string id = 1;
|
|
195
|
+
// ...
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
message PaymentRequestResponse {
|
|
199
|
+
bool success = 1;
|
|
200
|
+
string transaction_id = 2;
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### CLI Flag
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
domainforge project --format protobuf --include-services model.sea output.proto
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Tests
|
|
211
|
+
|
|
212
|
+
- Test single flow generates single service with one method
|
|
213
|
+
- Test multiple flows to same entity grouped into one service
|
|
214
|
+
- Test flow attributes become method options
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Phase 3: Custom Proto Options
|
|
219
|
+
|
|
220
|
+
### Goal
|
|
221
|
+
|
|
222
|
+
Allow users to specify custom proto options via SEA projections or attributes.
|
|
223
|
+
|
|
224
|
+
### Grammar Extension
|
|
225
|
+
|
|
226
|
+
#### [MODIFY] [sea.pest](file:///home/sprime01/projects/domainforge/domainforge-core/grammar/sea.pest)
|
|
227
|
+
|
|
228
|
+
```pest
|
|
229
|
+
proto_option = {
|
|
230
|
+
"option" ~ proto_option_name ~ "=" ~ proto_option_value
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
proto_option_name = { identifier ~ ("." ~ identifier)* }
|
|
234
|
+
proto_option_value = { string_literal | number | boolean_literal }
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### IR Extension
|
|
238
|
+
|
|
239
|
+
```rust
|
|
240
|
+
/// Custom proto option
|
|
241
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
242
|
+
pub struct ProtoCustomOption {
|
|
243
|
+
/// Full option name (e.g., "java_package" or "(myopt).foo")
|
|
244
|
+
pub name: String,
|
|
245
|
+
/// Option value
|
|
246
|
+
pub value: ProtoOptionValue,
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
250
|
+
pub enum ProtoOptionValue {
|
|
251
|
+
String(String),
|
|
252
|
+
Number(f64),
|
|
253
|
+
Bool(bool),
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Usage in SEA
|
|
258
|
+
|
|
259
|
+
```sea
|
|
260
|
+
Projection "api" for protobuf {
|
|
261
|
+
@option java_package = "com.example.api"
|
|
262
|
+
@option java_multiple_files = true
|
|
263
|
+
@option go_package = "github.com/example/api"
|
|
264
|
+
|
|
265
|
+
Entity "Customer" {
|
|
266
|
+
@option deprecated = true
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Phase 4: Buf.build Integration
|
|
274
|
+
|
|
275
|
+
### Goal
|
|
276
|
+
|
|
277
|
+
Integrate with [buf.build](https://buf.build) CLI for linting, breaking change detection, and registry publishing.
|
|
278
|
+
|
|
279
|
+
### Components
|
|
280
|
+
|
|
281
|
+
#### [NEW] [buf.rs](file:///home/sprime01/projects/domainforge/domainforge-core/src/projection/buf.rs)
|
|
282
|
+
|
|
283
|
+
```rust
|
|
284
|
+
/// Buf.build integration for proto linting and management.
|
|
285
|
+
pub struct BufIntegration {
|
|
286
|
+
buf_path: PathBuf, // Path to buf binary
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
impl BufIntegration {
|
|
290
|
+
/// Generate buf.yaml configuration file.
|
|
291
|
+
pub fn generate_buf_yaml(proto_files: &[PathBuf]) -> String;
|
|
292
|
+
|
|
293
|
+
/// Run buf lint on generated protos.
|
|
294
|
+
pub fn lint(&self, proto_dir: &Path) -> Result<BufLintResult, BufError>;
|
|
295
|
+
|
|
296
|
+
/// Run buf breaking check against schema history.
|
|
297
|
+
pub fn breaking_check(&self, new_dir: &Path, old_dir: &Path) -> Result<BufBreakingResult, BufError>;
|
|
298
|
+
|
|
299
|
+
/// Generate buf.gen.yaml for code generation.
|
|
300
|
+
pub fn generate_buf_gen_yaml(languages: &[Language]) -> String;
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### CLI Integration
|
|
305
|
+
|
|
306
|
+
```bash
|
|
307
|
+
# Lint generated protos
|
|
308
|
+
domainforge project --format protobuf --buf-lint model.sea output.proto
|
|
309
|
+
|
|
310
|
+
# Check breaking changes
|
|
311
|
+
domainforge project --format protobuf --buf-breaking --against ./previous model.sea output.proto
|
|
312
|
+
|
|
313
|
+
# Full buf workflow
|
|
314
|
+
domainforge project --format protobuf --buf-generate --languages rust,go,ts model.sea output/
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Buf Configuration Generation
|
|
318
|
+
|
|
319
|
+
```yaml
|
|
320
|
+
# Generated buf.yaml
|
|
321
|
+
version: v1
|
|
322
|
+
breaking:
|
|
323
|
+
use:
|
|
324
|
+
- FILE
|
|
325
|
+
lint:
|
|
326
|
+
use:
|
|
327
|
+
- DEFAULT
|
|
328
|
+
except:
|
|
329
|
+
- PACKAGE_VERSION_SUFFIX
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## Phase 5: Multiple File Output per Namespace
|
|
335
|
+
|
|
336
|
+
### Goal
|
|
337
|
+
|
|
338
|
+
Generate separate `.proto` files per namespace for better organization.
|
|
339
|
+
|
|
340
|
+
### Changes
|
|
341
|
+
|
|
342
|
+
#### [MODIFY] [protobuf.rs](file:///home/sprime01/projects/domainforge/domainforge-core/src/projection/protobuf.rs)
|
|
343
|
+
|
|
344
|
+
```rust
|
|
345
|
+
impl ProtobufEngine {
|
|
346
|
+
/// Project to multiple files, one per namespace.
|
|
347
|
+
pub fn project_multi_file(
|
|
348
|
+
graph: &Graph,
|
|
349
|
+
base_package: &str,
|
|
350
|
+
) -> BTreeMap<String, ProtoFile> {
|
|
351
|
+
let mut files: BTreeMap<String, ProtoFile> = BTreeMap::new();
|
|
352
|
+
|
|
353
|
+
// Group entities by namespace
|
|
354
|
+
for entity in graph.all_entities() {
|
|
355
|
+
let ns = entity.namespace();
|
|
356
|
+
let package = format!("{}.{}", base_package, ns);
|
|
357
|
+
|
|
358
|
+
files.entry(ns.to_string())
|
|
359
|
+
.or_insert_with(|| ProtoFile::new(&package))
|
|
360
|
+
.messages.push(Self::entity_to_message(entity));
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Add cross-namespace imports
|
|
364
|
+
for file in files.values_mut() {
|
|
365
|
+
Self::add_cross_namespace_imports(file, &files);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
files
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Output Structure
|
|
374
|
+
|
|
375
|
+
```
|
|
376
|
+
output/
|
|
377
|
+
├── buf.yaml
|
|
378
|
+
├── common/
|
|
379
|
+
│ └── common.proto
|
|
380
|
+
├── orders/
|
|
381
|
+
│ └── orders.proto
|
|
382
|
+
├── payments/
|
|
383
|
+
│ └── payments.proto
|
|
384
|
+
└── customers/
|
|
385
|
+
└── customers.proto
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
### CLI Flag
|
|
389
|
+
|
|
390
|
+
```bash
|
|
391
|
+
domainforge project --format protobuf --multi-file --output-dir ./proto model.sea
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## Implementation Order
|
|
397
|
+
|
|
398
|
+
```mermaid
|
|
399
|
+
gantt
|
|
400
|
+
title Protobuf Advanced Features
|
|
401
|
+
dateFormat YYYY-MM-DD
|
|
402
|
+
section Phase 1
|
|
403
|
+
Well-Known Types :p1, 2024-01-01, 2d
|
|
404
|
+
section Phase 2
|
|
405
|
+
gRPC Services :p2, after p1, 5d
|
|
406
|
+
section Phase 3
|
|
407
|
+
Custom Options :p3, after p2, 3d
|
|
408
|
+
section Phase 4
|
|
409
|
+
Buf Integration :p4, after p3, 4d
|
|
410
|
+
section Phase 5
|
|
411
|
+
Multi-File Output :p5, after p4, 3d
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
## Verification Plan
|
|
417
|
+
|
|
418
|
+
### Automated Tests
|
|
419
|
+
|
|
420
|
+
| Phase | Test Coverage |
|
|
421
|
+
| ----- | ---------------------------------------------- |
|
|
422
|
+
| 1 | WKT type mapping, import generation |
|
|
423
|
+
| 2 | Flow→Service mapping, method generation |
|
|
424
|
+
| 3 | Option parsing, serialization |
|
|
425
|
+
| 4 | Buf CLI invocation (mocked), config generation |
|
|
426
|
+
| 5 | Multi-file output, import resolution |
|
|
427
|
+
|
|
428
|
+
### Integration Tests
|
|
429
|
+
|
|
430
|
+
- Generate protos for `examples/ecommerce.sea`
|
|
431
|
+
- Validate with `protoc --decode_raw`
|
|
432
|
+
- Validate with `buf lint`
|
|
433
|
+
- Generate code with `buf generate`
|
|
434
|
+
|
|
435
|
+
### Manual Verification
|
|
436
|
+
|
|
437
|
+
- Review generated `.proto` files for readability
|
|
438
|
+
- Test generated code compiles in target languages
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## Design Decisions (Resolved)
|
|
443
|
+
|
|
444
|
+
> [!NOTE]
|
|
445
|
+
> These decisions were made based on user input and gRPC/Protobuf best practices.
|
|
446
|
+
|
|
447
|
+
### 1. gRPC Streaming Support ✅
|
|
448
|
+
|
|
449
|
+
**Decision**: Support streaming via Flow attributes.
|
|
450
|
+
|
|
451
|
+
**Syntax**:
|
|
452
|
+
|
|
453
|
+
```sea
|
|
454
|
+
// Unary RPC (default)
|
|
455
|
+
Flow from Client to Server of Request
|
|
456
|
+
|
|
457
|
+
// Server streaming
|
|
458
|
+
Flow @streaming from Client to Server of EventStream
|
|
459
|
+
|
|
460
|
+
// Client streaming
|
|
461
|
+
Flow @client_streaming from Client to Server of DataChunks
|
|
462
|
+
|
|
463
|
+
// Bidirectional streaming
|
|
464
|
+
Flow @bidirectional from Client to Server of ChatMessage
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
**Rationale**: Streaming is essential for real-time use cases (event sourcing, log tailing, chat).
|
|
468
|
+
|
|
469
|
+
---
|
|
470
|
+
|
|
471
|
+
### 2. Service Naming Convention ✅
|
|
472
|
+
|
|
473
|
+
**Decision**: Use `{DestinationEntity}Service` naming.
|
|
474
|
+
|
|
475
|
+
**Example**:
|
|
476
|
+
|
|
477
|
+
```protobuf
|
|
478
|
+
// Entity "PaymentProcessor" becomes:
|
|
479
|
+
service PaymentProcessorService { ... }
|
|
480
|
+
|
|
481
|
+
// Entity "OrderManager" becomes:
|
|
482
|
+
service OrderManagerService { ... }
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
**Rationale**: This is the standard gRPC naming convention:
|
|
486
|
+
|
|
487
|
+
- Google APIs use `FooService` pattern
|
|
488
|
+
- Idiomatic and predictable
|
|
489
|
+
- Self-describing (service named after the capability provider)
|
|
490
|
+
- Matches `grpc-gateway` and `protoc-gen-*` expectations
|
|
491
|
+
|
|
492
|
+
---
|
|
493
|
+
|
|
494
|
+
### 3. Buf.build Integration ✅
|
|
495
|
+
|
|
496
|
+
**Decision**: Make `buf` CLI **optional** with graceful degradation.
|
|
497
|
+
|
|
498
|
+
**Behavior**:
|
|
499
|
+
|
|
500
|
+
```bash
|
|
501
|
+
# If buf is installed - runs linting
|
|
502
|
+
domainforge project --format protobuf --buf-lint input.sea output.proto
|
|
503
|
+
# Output: "✓ buf lint passed (12 files, 0 issues)"
|
|
504
|
+
|
|
505
|
+
# If buf is NOT installed - warns and continues
|
|
506
|
+
domainforge project --format protobuf --buf-lint input.sea output.proto
|
|
507
|
+
# Output: "⚠ buf CLI not found. Skipping lint. Install: https://buf.build/docs/installation"
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
**Rationale**:
|
|
511
|
+
|
|
512
|
+
- Lowers barrier to entry (works without buf)
|
|
513
|
+
- Power users get enhanced validation
|
|
514
|
+
- No hard dependency on external tooling
|
|
515
|
+
|
|
516
|
+
---
|
|
517
|
+
|
|
518
|
+
### 4. Cross-Namespace Imports ✅
|
|
519
|
+
|
|
520
|
+
**Decision**: Use **fully qualified imports**.
|
|
521
|
+
|
|
522
|
+
**Example**:
|
|
523
|
+
|
|
524
|
+
```protobuf
|
|
525
|
+
// In payments/payments.proto
|
|
526
|
+
syntax = "proto3";
|
|
527
|
+
package com.example.payments;
|
|
528
|
+
|
|
529
|
+
import "com/example/common/money.proto";
|
|
530
|
+
import "com/example/customers/customer.proto";
|
|
531
|
+
|
|
532
|
+
message PaymentRequest {
|
|
533
|
+
com.example.common.Money amount = 1;
|
|
534
|
+
com.example.customers.CustomerId customer_id = 2;
|
|
535
|
+
}
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
**Rationale**:
|
|
539
|
+
|
|
540
|
+
- **Toolchain-agnostic**: Works with `protoc`, `buf`, `grpc-tools` without configuration
|
|
541
|
+
- **Self-documenting**: Imports show exact dependency paths
|
|
542
|
+
- **No aliasing issues**: No risk of name collisions
|
|
543
|
+
- **Mono-repo standard**: Google, Uber, and other large-scale Protobuf users prefer this
|
|
544
|
+
- **IDE support**: Better autocomplete and navigation
|
|
545
|
+
|
|
546
|
+
---
|
|
547
|
+
|
|
548
|
+
## Updated Implementation Summary
|
|
549
|
+
|
|
550
|
+
| Phase | Feature | Key Design Choice |
|
|
551
|
+
| ----- | ---------------- | ----------------------------------------- |
|
|
552
|
+
| 1 | Well-Known Types | Auto-add imports only when WKT used |
|
|
553
|
+
| 2 | gRPC Services | `{Entity}Service` + streaming annotations |
|
|
554
|
+
| 3 | Custom Options | Via `@option` in projections |
|
|
555
|
+
| 4 | Buf.build | Optional CLI, graceful degradation |
|
|
556
|
+
| 5 | Multi-File | Fully qualified imports |
|
|
557
|
+
|
|
558
|
+
---
|
|
559
|
+
|
|
560
|
+
## Grammar Changes for Streaming
|
|
561
|
+
|
|
562
|
+
#### [MODIFY] [sea.pest](file:///home/sprime01/projects/domainforge/domainforge-core/grammar/sea.pest)
|
|
563
|
+
|
|
564
|
+
```pest
|
|
565
|
+
flow_modifier = @{ "@" ~ ("streaming" | "client_streaming" | "bidirectional") }
|
|
566
|
+
|
|
567
|
+
flow_statement = {
|
|
568
|
+
flow_modifier* ~ "Flow" ~ "from" ~ identifier ~ "to" ~ identifier ~ "of" ~ identifier
|
|
569
|
+
}
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
#### Streaming Enum in IR
|
|
573
|
+
|
|
574
|
+
```rust
|
|
575
|
+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
|
|
576
|
+
pub enum StreamingMode {
|
|
577
|
+
#[default]
|
|
578
|
+
Unary,
|
|
579
|
+
ServerStreaming,
|
|
580
|
+
ClientStreaming,
|
|
581
|
+
Bidirectional,
|
|
582
|
+
}
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
---
|
|
586
|
+
|
|
587
|
+
## Next Steps
|
|
588
|
+
|
|
589
|
+
After approval, I will implement in this order:
|
|
590
|
+
|
|
591
|
+
1. **Phase 1 (Well-Known Types)** — ~2 hours
|
|
592
|
+
2. **Phase 2 (gRPC Services + Streaming)** — ~4 hours
|
|
593
|
+
3. **Phase 3 (Custom Options)** — ~2 hours
|
|
594
|
+
4. **Phase 4 (Buf.build Optional)** — ~3 hours
|
|
595
|
+
5. **Phase 5 (Multi-File Output)** — ~3 hours
|
|
596
|
+
|
|
597
|
+
**Total estimated effort**: ~14 hours
|