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,485 @@
|
|
|
1
|
+
# SEA DSL - Python Bindings
|
|
2
|
+
|
|
3
|
+
Python bindings for the Semantic Enterprise Architecture (SEA) Domain Specific Language.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# From source (PyPI package coming soon)
|
|
9
|
+
pip install maturin
|
|
10
|
+
git clone https://github.com/GodSpeedAI/DomainForge.git
|
|
11
|
+
cd DomainForge
|
|
12
|
+
maturin develop
|
|
13
|
+
|
|
14
|
+
# Or build wheel
|
|
15
|
+
maturin build --release
|
|
16
|
+
pip install target/wheels/domainforge-*.whl
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
### Creating Primitives
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
import domainforge
|
|
25
|
+
|
|
26
|
+
# Create entities - use new() for default namespace, new_with_namespace() for explicit
|
|
27
|
+
warehouse = domainforge.Entity.new("Warehouse") # Default namespace
|
|
28
|
+
factory = domainforge.Entity.new_with_namespace("Factory", "manufacturing")
|
|
29
|
+
|
|
30
|
+
# Namespace is always a string (not None), defaults to "default"
|
|
31
|
+
print(warehouse.namespace()) # "default"
|
|
32
|
+
print(factory.namespace()) # "manufacturing"
|
|
33
|
+
|
|
34
|
+
# Create resources
|
|
35
|
+
cameras = domainforge.Resource.new("Cameras", "units")
|
|
36
|
+
|
|
37
|
+
# Create flows - pass ConceptId values (clone before passing)
|
|
38
|
+
flow = domainforge.Flow.new(
|
|
39
|
+
cameras.id().clone(),
|
|
40
|
+
warehouse.id().clone(),
|
|
41
|
+
factory.id().clone(),
|
|
42
|
+
100.0
|
|
43
|
+
)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Building a Graph
|
|
47
|
+
|
|
48
|
+
```python
|
|
49
|
+
import domainforge
|
|
50
|
+
from decimal import Decimal
|
|
51
|
+
|
|
52
|
+
# Create and populate a graph
|
|
53
|
+
graph = domainforge.Graph()
|
|
54
|
+
|
|
55
|
+
# Entities with constructor patterns
|
|
56
|
+
warehouse = domainforge.Entity.new("Warehouse")
|
|
57
|
+
factory = domainforge.Entity.new_with_namespace("Factory", "manufacturing")
|
|
58
|
+
|
|
59
|
+
# Resources with units
|
|
60
|
+
cameras = domainforge.Resource.new("Cameras", "units")
|
|
61
|
+
|
|
62
|
+
graph.add_entity(warehouse)
|
|
63
|
+
graph.add_entity(factory)
|
|
64
|
+
graph.add_resource(cameras)
|
|
65
|
+
|
|
66
|
+
# Flow with ConceptId clones and Decimal quantity
|
|
67
|
+
flow = domainforge.Flow.new(
|
|
68
|
+
cameras.id().clone(),
|
|
69
|
+
warehouse.id().clone(),
|
|
70
|
+
factory.id().clone(),
|
|
71
|
+
Decimal("100.0")
|
|
72
|
+
)
|
|
73
|
+
graph.add_flow(flow)
|
|
74
|
+
|
|
75
|
+
print(f"Graph has {graph.entity_count()} entities")
|
|
76
|
+
print(f"Graph has {graph.flow_count()} flows")
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Parsing DSL Source
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
import domainforge
|
|
83
|
+
|
|
84
|
+
# Supports multiline strings with """ syntax
|
|
85
|
+
source = '''
|
|
86
|
+
Entity "Warehouse" in logistics
|
|
87
|
+
Entity """Multi-line
|
|
88
|
+
Factory Name""" in manufacturing
|
|
89
|
+
Resource "Cameras" units
|
|
90
|
+
Flow "Cameras" from "Warehouse" to "Multi-line\nFactory Name" quantity 100
|
|
91
|
+
'''
|
|
92
|
+
|
|
93
|
+
graph = domainforge.Graph.parse(source)
|
|
94
|
+
print(f"Parsed {graph.entity_count()} entities")
|
|
95
|
+
print(f"Parsed {graph.flow_count()} flows")
|
|
96
|
+
|
|
97
|
+
# Query the graph
|
|
98
|
+
warehouse_id = graph.find_entity_by_name("Warehouse")
|
|
99
|
+
flows = graph.flows_from(warehouse_id)
|
|
100
|
+
for flow in flows:
|
|
101
|
+
print(f"Flow: {flow.quantity()} units")
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Working with Attributes
|
|
105
|
+
|
|
106
|
+
```python
|
|
107
|
+
import domainforge
|
|
108
|
+
|
|
109
|
+
# Use new() for default namespace
|
|
110
|
+
entity = domainforge.Entity.new("Warehouse")
|
|
111
|
+
entity.set_attribute("capacity", 10000)
|
|
112
|
+
entity.set_attribute("location", "New York")
|
|
113
|
+
|
|
114
|
+
print(entity.get_attribute("capacity")) # 10000
|
|
115
|
+
print(entity.get_attribute("location")) # "New York"
|
|
116
|
+
|
|
117
|
+
# Namespace is always present (not None)
|
|
118
|
+
print(entity.namespace()) # "default"
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Formatting Source Code
|
|
122
|
+
|
|
123
|
+
```python
|
|
124
|
+
import domainforge
|
|
125
|
+
|
|
126
|
+
# Format SEA-DSL source with default settings
|
|
127
|
+
source = '''Entity "Foo" in bar'''
|
|
128
|
+
formatted = domainforge.format_source(source)
|
|
129
|
+
print(formatted) # Entity "Foo" in bar
|
|
130
|
+
|
|
131
|
+
# Format with custom options
|
|
132
|
+
formatted = domainforge.format_source(
|
|
133
|
+
source,
|
|
134
|
+
indent_width=2,
|
|
135
|
+
use_tabs=False,
|
|
136
|
+
preserve_comments=True,
|
|
137
|
+
sort_imports=True
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
# Check if source is already formatted
|
|
141
|
+
is_formatted = domainforge.check_format(source)
|
|
142
|
+
print(is_formatted) # False
|
|
143
|
+
|
|
144
|
+
# Check with formatted content
|
|
145
|
+
is_formatted = domainforge.check_format('Entity "Foo" in bar\n')
|
|
146
|
+
print(is_formatted) # True
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## API Reference
|
|
150
|
+
|
|
151
|
+
### Formatter Functions
|
|
152
|
+
|
|
153
|
+
- `format_source(source, indent_width=4, use_tabs=False, preserve_comments=True, sort_imports=True)`: Format SEA-DSL source code
|
|
154
|
+
- `check_format(source, indent_width=4, use_tabs=False)`: Check if source is already formatted
|
|
155
|
+
|
|
156
|
+
### Classes
|
|
157
|
+
|
|
158
|
+
- `Entity`: Represents business entities (WHO)
|
|
159
|
+
- `Resource`: Represents quantifiable resources (WHAT)
|
|
160
|
+
- `Flow`: Represents resource movement between entities
|
|
161
|
+
- `Instance`: Represents physical instances of resources
|
|
162
|
+
- `Graph`: Container with validation and query capabilities (uses IndexMap for deterministic iteration)
|
|
163
|
+
- `Expression`: Policy expression AST wrapper with normalization support
|
|
164
|
+
- `NormalizedExpression`: Canonical form of an expression with stable hashing
|
|
165
|
+
|
|
166
|
+
### Constructor Patterns (November 2025)
|
|
167
|
+
|
|
168
|
+
**Entities:**
|
|
169
|
+
|
|
170
|
+
```python
|
|
171
|
+
# Default namespace
|
|
172
|
+
entity = Entity.new("Warehouse") # namespace() returns "default"
|
|
173
|
+
|
|
174
|
+
# Explicit namespace
|
|
175
|
+
entity = Entity.new_with_namespace("Warehouse", "logistics")
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**Resources:**
|
|
179
|
+
|
|
180
|
+
```python
|
|
181
|
+
resource = Resource.new("Cameras", "units") # Default namespace
|
|
182
|
+
resource = Resource.new_with_namespace("Cameras", "units", "inventory")
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Flows:**
|
|
186
|
+
|
|
187
|
+
```python
|
|
188
|
+
# Takes ConceptId values (not references) - clone before passing
|
|
189
|
+
flow = Flow.new(
|
|
190
|
+
resource_id.clone(),
|
|
191
|
+
from_id.clone(),
|
|
192
|
+
to_id.clone(),
|
|
193
|
+
Decimal("100.0")
|
|
194
|
+
)
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Graph Methods
|
|
198
|
+
|
|
199
|
+
- `add_entity(entity)`: Add an entity to the graph
|
|
200
|
+
- `add_resource(resource)`: Add a resource to the graph
|
|
201
|
+
- `add_flow(flow)`: Add a flow to the graph (validates references)
|
|
202
|
+
- `add_instance(instance)`: Add an instance to the graph
|
|
203
|
+
- `entity_count()`: Get number of entities
|
|
204
|
+
- `resource_count()`: Get number of resources
|
|
205
|
+
- `flow_count()`: Get number of flows
|
|
206
|
+
- `instance_count()`: Get number of instances
|
|
207
|
+
- `find_entity_by_name(name)`: Find entity ID by name
|
|
208
|
+
- `find_resource_by_name(name)`: Find resource ID by name
|
|
209
|
+
- `flows_from(entity_id)`: Get all flows from an entity
|
|
210
|
+
- `flows_to(entity_id)`: Get all flows to an entity
|
|
211
|
+
- `all_entities()`: Get all entities
|
|
212
|
+
- `all_resources()`: Get all resources
|
|
213
|
+
- `all_flows()`: Get all flows
|
|
214
|
+
- `all_instances()`: Get all instances
|
|
215
|
+
- `Graph.parse(source)`: Parse DSL source into a graph
|
|
216
|
+
- `Graph.parse_to_ast_json(source)`: Parse DSL source into AST JSON string
|
|
217
|
+
- `export_calm()`: Export graph to CALM JSON format
|
|
218
|
+
- `Graph.import_calm(json_str)`: Import graph from CALM JSON
|
|
219
|
+
- `add_policy(policy)`: Add a policy to the graph
|
|
220
|
+
- `add_association(owner_id, owned_id, rel_type)`: Add ownership/association relation between two entities (owner/owned)
|
|
221
|
+
|
|
222
|
+
### Expression API (December 2025)
|
|
223
|
+
|
|
224
|
+
```python
|
|
225
|
+
from domainforge import Expression, BinaryOp
|
|
226
|
+
|
|
227
|
+
# Factory methods
|
|
228
|
+
expr = Expression.binary(
|
|
229
|
+
BinaryOp.And,
|
|
230
|
+
Expression.variable("b"),
|
|
231
|
+
Expression.variable("a")
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
# Normalization
|
|
235
|
+
normalized = expr.normalize()
|
|
236
|
+
print(str(normalized)) # "(a AND b)" (commutative sorting)
|
|
237
|
+
print(normalized.stable_hash()) # Stable hash for caching
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
**Breaking Changes:**
|
|
241
|
+
|
|
242
|
+
### NamespaceRegistry (Workspace)
|
|
243
|
+
|
|
244
|
+
```python
|
|
245
|
+
import domainforge
|
|
246
|
+
|
|
247
|
+
reg = domainforge.NamespaceRegistry.from_file('./.sea-registry.toml')
|
|
248
|
+
files = reg.resolve_files()
|
|
249
|
+
for binding in files:
|
|
250
|
+
print(binding.path, '=>', binding.namespace)
|
|
251
|
+
|
|
252
|
+
ns = reg.namespace_for('/path/to/file.sea')
|
|
253
|
+
print('Namespace:', ns)
|
|
254
|
+
|
|
255
|
+
# You can also pass `True` as an optional second argument to make resolution fail on ambiguity:
|
|
256
|
+
try:
|
|
257
|
+
reg.namespace_for(str('/path/to/file.sea'), True)
|
|
258
|
+
except Exception as e:
|
|
259
|
+
print('Ambiguity detected:', e)
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
- `namespace()` now returns `str` instead of `Optional[str]` (always returns "default" if unspecified)
|
|
263
|
+
- Constructors split: `new()` for default namespace, `new_with_namespace()` for explicit
|
|
264
|
+
- `Resource.new(name, unit)` now routes through `new_with_namespace(..., "default")` so `namespace()` never returns `None` even when a namespace is not supplied
|
|
265
|
+
- Flow constructor takes `ConceptId` values (not references) - must clone before passing
|
|
266
|
+
|
|
267
|
+
- Multiline string support in parser: `Entity """Multi-line\nName"""`
|
|
268
|
+
- ValidationError helpers: `undefined_entity()`, `unit_mismatch()`, etc.
|
|
269
|
+
- CALM integration: `export_calm()` and `import_calm()` for architecture-as-code
|
|
270
|
+
- IndexMap storage ensures deterministic iteration (reproducible results)
|
|
271
|
+
|
|
272
|
+
## Semantic Pack API
|
|
273
|
+
|
|
274
|
+
The `domainforge` module exposes semantic pack types and functions for building, validating, signing, and inspecting packs programmatically.
|
|
275
|
+
|
|
276
|
+
### Enums
|
|
277
|
+
|
|
278
|
+
```python
|
|
279
|
+
from domainforge import (
|
|
280
|
+
SemanticTruth, # Valid, Invalid, Unknown
|
|
281
|
+
DiagnosticSeverity, # Error, Warning, Info, Hint
|
|
282
|
+
ValidationMode, # Off, Warn, Strict
|
|
283
|
+
ApprovalState, # Candidate, Approved, Rejected
|
|
284
|
+
SignatureState, # Unsigned, Signed, InvalidSignature
|
|
285
|
+
ConceptStatus, # Active, Proposed, Deprecated, Rejected, ExternalOnly
|
|
286
|
+
ConceptKind, # Entity, Resource, Role, Flow, Policy, Metric, Dimension, Unit, External
|
|
287
|
+
AliasStatus, # Approved, Deprecated, Ambiguous, Blocked
|
|
288
|
+
UnknownConceptPolicy, # Ignore, Warning, Error
|
|
289
|
+
DeprecatedPolicy, # Allow, Warn, ErrorInStrict, ErrorAlways
|
|
290
|
+
SemanticValidationStatus, # Passed, Failed, Unknown, Blocked
|
|
291
|
+
)
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### SemanticPack Class
|
|
295
|
+
|
|
296
|
+
```python
|
|
297
|
+
pack = domainforge.SemanticPack.from_json(pack_json_string)
|
|
298
|
+
print(pack.pack_id()) # "acme/logistics/1.1.0"
|
|
299
|
+
print(pack.schema_version()) # "0.3"
|
|
300
|
+
print(pack.approval_state()) # ApprovalState.Approved
|
|
301
|
+
print(pack.signature_state()) # SignatureState.Signed
|
|
302
|
+
print(pack.concept_count()) # 42
|
|
303
|
+
print(pack.alias_count()) # 15
|
|
304
|
+
print(pack.meaning_version()) # "1.1.0"
|
|
305
|
+
print(pack.meaning_fingerprint()) # "sha256:abc..."
|
|
306
|
+
print(pack.pack_content_hash()) # "sha256:def..."
|
|
307
|
+
|
|
308
|
+
json_str = pack.to_json()
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
Methods:
|
|
312
|
+
|
|
313
|
+
| Method | Return Type | Description |
|
|
314
|
+
|-----------------------|---------------------|----------------------------------------|
|
|
315
|
+
| `from_json(json)` | `SemanticPack` | Deserialize from JSON string. |
|
|
316
|
+
| `to_json()` | `str` | Serialize to JSON string. |
|
|
317
|
+
| `pack_id()` | `str` | Pack identifier. |
|
|
318
|
+
| `schema_version()` | `str` | Schema version. |
|
|
319
|
+
| `approval_state()` | `ApprovalState` | Pack approval state. |
|
|
320
|
+
| `signature_state()` | `SignatureState` | Pack signature state. |
|
|
321
|
+
| `concept_count()` | `int` | Number of concepts. |
|
|
322
|
+
| `alias_count()` | `int` | Number of aliases. |
|
|
323
|
+
| `meaning_version()` | `str` | Meaning version. |
|
|
324
|
+
| `meaning_fingerprint()` | `str` | Meaning fingerprint hash. |
|
|
325
|
+
| `pack_content_hash()` | `str` | Content hash (excluding signature). |
|
|
326
|
+
|
|
327
|
+
### SemanticValidationResult Class
|
|
328
|
+
|
|
329
|
+
```python
|
|
330
|
+
result = domainforge.SemanticValidationResult.from_json(result_json)
|
|
331
|
+
print(result.status()) # SemanticValidationStatus.Passed
|
|
332
|
+
print(result.diagnostics_json()) # JSON array of diagnostics
|
|
333
|
+
print(result.unsigned_fixture_bypass_used()) # False
|
|
334
|
+
print(result.first_approved_version_bypass_used()) # False
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### Functions
|
|
338
|
+
|
|
339
|
+
#### build_semantic_pack
|
|
340
|
+
|
|
341
|
+
Build a semantic pack from input JSON. Returns a tuple of `(pack_json, error_list)`.
|
|
342
|
+
|
|
343
|
+
```python
|
|
344
|
+
pack_json, errors = domainforge.build_semantic_pack(input_json)
|
|
345
|
+
if errors:
|
|
346
|
+
for err in errors:
|
|
347
|
+
print(err)
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
#### validate_semantic_pack
|
|
351
|
+
|
|
352
|
+
Validate a pack's internal consistency. Returns a list of diagnostic JSON strings.
|
|
353
|
+
|
|
354
|
+
```python
|
|
355
|
+
diagnostics = domainforge.validate_semantic_pack(pack_json)
|
|
356
|
+
for d in diagnostics:
|
|
357
|
+
print(d)
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
#### validate_graph_with_pack
|
|
361
|
+
|
|
362
|
+
Validate a source file against a pack. Returns a JSON result string.
|
|
363
|
+
|
|
364
|
+
```python
|
|
365
|
+
result_json = domainforge.validate_graph_with_pack(
|
|
366
|
+
pack_json,
|
|
367
|
+
"source_uri",
|
|
368
|
+
options_json
|
|
369
|
+
)
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
#### sign_pack
|
|
373
|
+
|
|
374
|
+
Sign a pack with an Ed25519 private key. Returns the signed pack JSON.
|
|
375
|
+
|
|
376
|
+
```python
|
|
377
|
+
signed_json = domainforge.sign_pack(pack_json, private_key_pem_string)
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
#### verify_pack_signature
|
|
381
|
+
|
|
382
|
+
Verify a pack's signature. Returns `True` or `False`.
|
|
383
|
+
|
|
384
|
+
```python
|
|
385
|
+
is_valid = domainforge.verify_pack_signature(pack_json, public_key_pem_string)
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
#### diff_packs
|
|
389
|
+
|
|
390
|
+
Compare two packs. Returns a JSON diff result.
|
|
391
|
+
|
|
392
|
+
```python
|
|
393
|
+
diff_json = domainforge.diff_packs(old_pack_json, new_pack_json)
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
#### compute_pack_hash
|
|
397
|
+
|
|
398
|
+
Compute the content hash of a pack.
|
|
399
|
+
|
|
400
|
+
```python
|
|
401
|
+
hash_str = domainforge.compute_pack_hash(pack_json)
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
#### normalize_lookup_key
|
|
405
|
+
|
|
406
|
+
Normalize a term for lookup (NFC, case-fold, whitespace collapse).
|
|
407
|
+
|
|
408
|
+
```python
|
|
409
|
+
normalized = domainforge.normalize_lookup_key(" Hello World ") # "hello world"
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
#### resolve_concept
|
|
413
|
+
|
|
414
|
+
Resolve a term against a pack. Returns a JSON result with `resolved_concept_id`, `semantic_truth`, `diagnostic_code`, `message`, and `suggestions`.
|
|
415
|
+
|
|
416
|
+
```python
|
|
417
|
+
result_json = domainforge.resolve_concept(
|
|
418
|
+
"Supplier",
|
|
419
|
+
pack_json,
|
|
420
|
+
options_json
|
|
421
|
+
)
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
## Development
|
|
425
|
+
|
|
426
|
+
### Building from Source
|
|
427
|
+
|
|
428
|
+
```bash
|
|
429
|
+
# Install maturin
|
|
430
|
+
pip install maturin
|
|
431
|
+
|
|
432
|
+
# Build and install in development mode
|
|
433
|
+
maturin develop
|
|
434
|
+
|
|
435
|
+
# Run tests
|
|
436
|
+
pytest
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
### Running Tests
|
|
440
|
+
|
|
441
|
+
```bash
|
|
442
|
+
pytest tests/
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
Quick start for tests in development (recommended):
|
|
446
|
+
|
|
447
|
+
```bash
|
|
448
|
+
# Requires just
|
|
449
|
+
just python-setup
|
|
450
|
+
just python-test
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
If you'd like to remove the local virtual environment and start fresh:
|
|
454
|
+
|
|
455
|
+
```bash
|
|
456
|
+
just python-clean
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
### Manual Python workflow (without just)
|
|
460
|
+
|
|
461
|
+
```bash
|
|
462
|
+
# Create a local virtual environment
|
|
463
|
+
python -m venv .venv
|
|
464
|
+
|
|
465
|
+
# Activate the environment
|
|
466
|
+
# Linux/macOS:
|
|
467
|
+
source .venv/bin/activate
|
|
468
|
+
# Windows (Command Prompt):
|
|
469
|
+
.\.venv\Scripts\activate
|
|
470
|
+
# Windows (PowerShell):
|
|
471
|
+
.\.venv\Scripts\Activate.ps1
|
|
472
|
+
|
|
473
|
+
# Install development dependencies
|
|
474
|
+
pip install -e . # or `pip install -r requirements-dev.txt`
|
|
475
|
+
|
|
476
|
+
# Run the Python test suite
|
|
477
|
+
pytest tests/
|
|
478
|
+
|
|
479
|
+
# Clean up the virtual environment when you're done
|
|
480
|
+
deactivate
|
|
481
|
+
rm -rf .venv
|
|
482
|
+
Apache-2.0
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Workspace Registry (`.sea-registry.toml`)
|
|
2
|
+
|
|
3
|
+
Purpose: map files to namespaces so identifiers stay deterministic across a workspace.
|
|
4
|
+
|
|
5
|
+
## File format
|
|
6
|
+
|
|
7
|
+
```toml
|
|
8
|
+
version = 1
|
|
9
|
+
default_namespace = "default" # optional fallback
|
|
10
|
+
|
|
11
|
+
[[namespaces]]
|
|
12
|
+
namespace = "logistics"
|
|
13
|
+
patterns = ["examples/namespaces/logistics/**/*.sea"]
|
|
14
|
+
|
|
15
|
+
[[namespaces]]
|
|
16
|
+
namespace = "finance"
|
|
17
|
+
patterns = ["examples/namespaces/finance/**/*.sea"]
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
- `version`: currently only `1` is supported.
|
|
21
|
+
- `default_namespace`: applied when no patterns match.
|
|
22
|
+
- `namespaces`: each entry declares the namespace and one or more glob `patterns` (relative to the registry file).
|
|
23
|
+
- Schema: `schemas/sea-registry.schema.json` (validated in tests).
|
|
24
|
+
|
|
25
|
+
## Ambiguity handling
|
|
26
|
+
|
|
27
|
+
- If multiple patterns match a file, the **longest literal prefix** wins.
|
|
28
|
+
- Tie-breaker: deterministic alphabetical order.
|
|
29
|
+
- Prefer using `--fail-on-ambiguity` (CLI) when you want ambiguous matches to error.
|
|
30
|
+
|
|
31
|
+
## CLI usage
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
domainforge validate --registry .sea-registry.toml models/payments/payment.sea
|
|
35
|
+
sea graph --registry .sea-registry.toml models/**/*.sea
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
- Without a registry, unnamed namespaces default to `"default"`.
|
|
39
|
+
- Combine with `--format json` for CI pipelines that need namespace-aware outputs.
|
|
40
|
+
|
|
41
|
+
## Maintenance tips
|
|
42
|
+
|
|
43
|
+
- Keep glob patterns specific to avoid accidental overlaps.
|
|
44
|
+
- Regenerate or pin baselines in tests when changing registry behavior.
|
|
45
|
+
- Store the registry at the workspace root so relative patterns are stable.
|
|
46
|
+
|
|
47
|
+
## See also
|
|
48
|
+
|
|
49
|
+
- [Configuration](./configuration.md) for CLI flags and env vars
|
|
50
|
+
- [Parse SEA Files](../how-tos/parse-sea-files.md) for parsing examples
|