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,74 @@
|
|
|
1
|
+
# Security Model
|
|
2
|
+
|
|
3
|
+
This document describes the DomainForge security model, focusing on how untrusted input is handled.
|
|
4
|
+
|
|
5
|
+
## Threat Model: Untrusted .sea Input
|
|
6
|
+
|
|
7
|
+
DomainForge processes `.sea` DSL files that may originate from untrusted sources. The primary threat vectors are:
|
|
8
|
+
|
|
9
|
+
- **Malformed input** designed to trigger panics or resource exhaustion in the parser
|
|
10
|
+
- **Path traversal** via import paths or namespace declarations
|
|
11
|
+
- **Archive extraction** exploits when unpacking semantic packs
|
|
12
|
+
- **Injection** of executable content through DSL constructs
|
|
13
|
+
|
|
14
|
+
The parser is the primary attack surface. It must handle arbitrary input without panicking, exhausting memory, or executing external processes.
|
|
15
|
+
|
|
16
|
+
## Parser Limits
|
|
17
|
+
|
|
18
|
+
The Pest-based parser processes input through a PEG grammar. Known behaviors:
|
|
19
|
+
|
|
20
|
+
- **Deeply nested expressions**: Excessive nesting (hundreds of levels) may hit recursion limits. The parser returns a `ParseError` rather than panicking.
|
|
21
|
+
- **Large input**: Files with hundreds of thousands of declarations are accepted. Memory usage scales linearly with input size.
|
|
22
|
+
- **Null bytes**: Input containing null bytes is handled gracefully and produces a parse error.
|
|
23
|
+
- **Long strings**: Individual string literals up to at least 1 MB are processed without panicking.
|
|
24
|
+
|
|
25
|
+
Test coverage for these limits lives in `domainforge-core/tests/parser_resource_limits_tests.rs`.
|
|
26
|
+
|
|
27
|
+
## Namespace and Import Path Restrictions
|
|
28
|
+
|
|
29
|
+
The module resolver enforces the following restrictions:
|
|
30
|
+
|
|
31
|
+
- **No path separators** in namespace declarations. Forward slashes (`/`) and backslashes (`\`) are rejected.
|
|
32
|
+
- **No path traversal** sequences (`..`) in namespace or import paths.
|
|
33
|
+
- **No absolute paths** in namespace declarations.
|
|
34
|
+
- **Circular imports** are detected and reported as `E505: CircularDependency` with the full cycle path.
|
|
35
|
+
|
|
36
|
+
These checks are implemented in `domainforge_core::projection::protobuf::validate_proto_package_namespace` and `domainforge_core::module::resolver::ModuleResolver`.
|
|
37
|
+
|
|
38
|
+
## Safe Archive Extraction
|
|
39
|
+
|
|
40
|
+
When extracting semantic packs (`.sea-pack` archives), the following protections apply:
|
|
41
|
+
|
|
42
|
+
- **Path traversal prevention**: Archive entries with paths containing `..` or absolute paths are rejected.
|
|
43
|
+
- **Size limits**: Archive entries exceeding configured size thresholds are rejected before extraction.
|
|
44
|
+
- **Symlink handling**: Symlinks within archives are not followed during extraction.
|
|
45
|
+
|
|
46
|
+
## No Process Execution from Model Content
|
|
47
|
+
|
|
48
|
+
DomainForge does **not** execute external processes based on the content of `.sea` files. Specifically:
|
|
49
|
+
|
|
50
|
+
- DSL declarations (Entity, Resource, Flow, Policy, etc.) are data declarations only
|
|
51
|
+
- Annotations and metadata are parsed as structured data, never evaluated as code
|
|
52
|
+
- The `export` keyword controls visibility within the DSL namespace system
|
|
53
|
+
- No `eval()`, `system()`, or subprocess invocation exists in the parser or graph construction pipeline
|
|
54
|
+
- CLI commands operate on files and produce structured output (JSON, Turtle, Protobuf) without interpreting DSL content as executable instructions
|
|
55
|
+
|
|
56
|
+
## Cargo Supply Chain Security
|
|
57
|
+
|
|
58
|
+
Dependency auditing is enforced through:
|
|
59
|
+
|
|
60
|
+
- **cargo-audit**: Scans for known vulnerabilities in dependencies
|
|
61
|
+
- **cargo-deny**: Enforces license allowlists, bans duplicate versions, and denies wildcard dependencies
|
|
62
|
+
- **Configuration**: `deny.toml` at the workspace root defines the policy
|
|
63
|
+
|
|
64
|
+
Run `just audit` to check dependencies locally, or `just enterprise-verify` for the full release verification pipeline.
|
|
65
|
+
|
|
66
|
+
## Release Workflow Linting
|
|
67
|
+
|
|
68
|
+
Three Python scripts validate CI/CD workflow files for security issues:
|
|
69
|
+
|
|
70
|
+
| Script | Checks |
|
|
71
|
+
|--------|--------|
|
|
72
|
+
| `scripts/lint_release_workflows.py` | Unfrozen npm installs, curl without checksums, continue-on-error on publish |
|
|
73
|
+
| `scripts/lint_release_security.py` | curl pipe to shell, publish failure masking, token exposure during builds |
|
|
74
|
+
| `scripts/lint_workflow_gates.py` | Artifact upload jobs gated by create-release, dependabot empty-check handling |
|
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
# @godspeedai/domainforge
|
|
2
|
+
|
|
3
|
+
TypeScript/Node.js bindings for the SEA (Semantic Enterprise Architecture) DSL.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# From source (npm package coming soon)
|
|
9
|
+
git clone https://github.com/GodSpeedAI/DomainForge.git
|
|
10
|
+
cd DomainForge
|
|
11
|
+
npm install
|
|
12
|
+
npm run build
|
|
13
|
+
|
|
14
|
+
# The build produces native .node bindings
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { Graph, Entity, Resource, Flow } from "@godspeedai/domainforge";
|
|
21
|
+
|
|
22
|
+
// Create a graph programmatically
|
|
23
|
+
const graph = new Graph();
|
|
24
|
+
|
|
25
|
+
// Constructor patterns - new() for default namespace, newWithNamespace() for explicit
|
|
26
|
+
const warehouse = Entity.new("Warehouse"); // Default namespace
|
|
27
|
+
const factory = Entity.newWithNamespace("Factory", "manufacturing");
|
|
28
|
+
|
|
29
|
+
// Namespace is always a string (not undefined), defaults to "default"
|
|
30
|
+
console.log(warehouse.namespace()); // "default"
|
|
31
|
+
console.log(factory.namespace()); // "manufacturing"
|
|
32
|
+
|
|
33
|
+
const cameras = Resource.new("Cameras", "units");
|
|
34
|
+
|
|
35
|
+
graph.addEntity(warehouse);
|
|
36
|
+
graph.addEntity(factory);
|
|
37
|
+
graph.addResource(cameras);
|
|
38
|
+
|
|
39
|
+
// Flow constructor takes ConceptId values - clone before passing
|
|
40
|
+
const flow = Flow.new(
|
|
41
|
+
cameras.id().clone(),
|
|
42
|
+
warehouse.id().clone(),
|
|
43
|
+
factory.id().clone(),
|
|
44
|
+
100
|
|
45
|
+
);
|
|
46
|
+
graph.addFlow(flow);
|
|
47
|
+
|
|
48
|
+
console.log(`Graph has ${graph.entityCount()} entities`);
|
|
49
|
+
console.log(`Graph has ${graph.flowCount()} flows`);
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Parsing SEA DSL
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
import { Graph } from "@godspeedai/domainforge";
|
|
56
|
+
|
|
57
|
+
// Supports multiline strings with """ syntax
|
|
58
|
+
const source = `
|
|
59
|
+
Entity "Warehouse" in logistics
|
|
60
|
+
Entity """Multi-line
|
|
61
|
+
Factory Name""" in manufacturing
|
|
62
|
+
Resource "Cameras" units
|
|
63
|
+
Flow "Cameras" from "Warehouse" to "Multi-line\\nFactory Name" quantity 100
|
|
64
|
+
`;
|
|
65
|
+
|
|
66
|
+
const graph = Graph.parse(source);
|
|
67
|
+
|
|
68
|
+
console.log(`Parsed ${graph.entityCount()} entities`);
|
|
69
|
+
console.log(`Parsed ${graph.flowCount()} flows`);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Error Handling
|
|
73
|
+
|
|
74
|
+
`Graph.parse(source: string)` may throw an `Error` on invalid input. The binding typically surfaces syntax issues as a standard `Error` with a message that includes parser details (line/column); some runtimes may implement a specific `ParseError` subclass. Callers should wrap parsing in a try/catch and handle errors accordingly:
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
try {
|
|
78
|
+
const g = Graph.parse(source);
|
|
79
|
+
} catch (e) {
|
|
80
|
+
// `e` typically includes a message and a line/column in the text
|
|
81
|
+
console.error("Failed to parse", e);
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Formatting Source Code
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
import { formatSource, checkFormat } from "@godspeedai/domainforge";
|
|
89
|
+
|
|
90
|
+
// Format SEA-DSL source with default settings
|
|
91
|
+
const source = 'Entity "Foo" in bar';
|
|
92
|
+
const formatted = formatSource(source);
|
|
93
|
+
console.log(formatted); // Entity "Foo" in bar
|
|
94
|
+
|
|
95
|
+
// Format with custom options
|
|
96
|
+
const formatted2 = formatSource(source, {
|
|
97
|
+
indentWidth: 2,
|
|
98
|
+
useTabs: false,
|
|
99
|
+
preserveComments: true,
|
|
100
|
+
sortImports: true,
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Check if source is already formatted
|
|
104
|
+
const isFormatted = checkFormat(source);
|
|
105
|
+
console.log(isFormatted); // false
|
|
106
|
+
|
|
107
|
+
// Check with formatted content
|
|
108
|
+
const isFormatted2 = checkFormat('Entity "Foo" in bar\n');
|
|
109
|
+
console.log(isFormatted2); // true
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## API Reference
|
|
113
|
+
|
|
114
|
+
### Formatter Functions
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
// Format SEA-DSL source code
|
|
118
|
+
function formatSource(source: string, options?: FormatOptions): string;
|
|
119
|
+
|
|
120
|
+
// Check if source is already formatted
|
|
121
|
+
function checkFormat(source: string, options?: FormatOptions): boolean;
|
|
122
|
+
|
|
123
|
+
interface FormatOptions {
|
|
124
|
+
indentWidth?: number; // Default: 4
|
|
125
|
+
useTabs?: boolean; // Default: false
|
|
126
|
+
preserveComments?: boolean; // Default: true
|
|
127
|
+
sortImports?: boolean; // Default: true
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Entity
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
class Entity {
|
|
135
|
+
static new(name: string): Entity; // Default namespace
|
|
136
|
+
static newWithNamespace(name: string, namespace: string): Entity; // Explicit namespace
|
|
137
|
+
|
|
138
|
+
id(): ConceptId;
|
|
139
|
+
name(): string;
|
|
140
|
+
namespace(): string; // Always returns string, never undefined (defaults to "default")
|
|
141
|
+
setAttribute(key: string, value: any): void;
|
|
142
|
+
getAttribute(key: string): any;
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Resource
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
class Resource {
|
|
150
|
+
// Constructor patterns (November 2025)
|
|
151
|
+
static new(name: string, unit: string): Resource; // Default namespace
|
|
152
|
+
static newWithNamespace(
|
|
153
|
+
name: string,
|
|
154
|
+
unit: string,
|
|
155
|
+
namespace: string
|
|
156
|
+
): Resource;
|
|
157
|
+
|
|
158
|
+
id(): ConceptId;
|
|
159
|
+
name(): string;
|
|
160
|
+
unit(): string;
|
|
161
|
+
namespace(): string; // Always returns string (defaults to "default")
|
|
162
|
+
setAttribute(key: string, value: any): void;
|
|
163
|
+
getAttribute(key: string): any;
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Flow
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
class Flow {
|
|
171
|
+
// Constructor takes ConceptId values (not references) - clone before passing
|
|
172
|
+
static new(
|
|
173
|
+
resourceId: ConceptId,
|
|
174
|
+
fromId: ConceptId,
|
|
175
|
+
toId: ConceptId,
|
|
176
|
+
quantity: number
|
|
177
|
+
): Flow;
|
|
178
|
+
|
|
179
|
+
id(): ConceptId;
|
|
180
|
+
resourceId(): ConceptId;
|
|
181
|
+
fromId(): ConceptId;
|
|
182
|
+
toId(): ConceptId;
|
|
183
|
+
quantity(): number;
|
|
184
|
+
namespace(): string;
|
|
185
|
+
setAttribute(key: string, value: any): void;
|
|
186
|
+
getAttribute(key: string): any;
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Instance
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
class Instance {
|
|
194
|
+
static new(resourceId: ConceptId, entityId: ConceptId): Instance; // Default namespace
|
|
195
|
+
static newWithNamespace(
|
|
196
|
+
resourceId: ConceptId,
|
|
197
|
+
entityId: ConceptId,
|
|
198
|
+
namespace: string
|
|
199
|
+
): Instance;
|
|
200
|
+
|
|
201
|
+
id(): ConceptId;
|
|
202
|
+
resourceId(): ConceptId;
|
|
203
|
+
entityId(): ConceptId;
|
|
204
|
+
namespace(): string; // Always returns string (defaults to "default")
|
|
205
|
+
setAttribute(key: string, value: any): void;
|
|
206
|
+
getAttribute(key: string): any;
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Graph
|
|
211
|
+
|
|
212
|
+
```typescript
|
|
213
|
+
class Graph {
|
|
214
|
+
constructor();
|
|
215
|
+
|
|
216
|
+
// Add primitives (validates referential integrity)
|
|
217
|
+
addEntity(entity: Entity): void;
|
|
218
|
+
addResource(resource: Resource): void;
|
|
219
|
+
addFlow(flow: Flow): void; // Throws if Entity/Resource references invalid
|
|
220
|
+
addInstance(instance: Instance): void;
|
|
221
|
+
|
|
222
|
+
// Counts
|
|
223
|
+
entityCount(): number;
|
|
224
|
+
resourceCount(): number;
|
|
225
|
+
flowCount(): number;
|
|
226
|
+
instanceCount(): number;
|
|
227
|
+
|
|
228
|
+
// Lookup by ID
|
|
229
|
+
hasEntity(id: ConceptId): boolean;
|
|
230
|
+
getEntity(id: ConceptId): Entity | null;
|
|
231
|
+
getResource(id: ConceptId): Resource | null;
|
|
232
|
+
getFlow(id: ConceptId): Flow | null;
|
|
233
|
+
getInstance(id: ConceptId): Instance | null;
|
|
234
|
+
|
|
235
|
+
// Lookup by name
|
|
236
|
+
findEntityByName(name: string): ConceptId | null;
|
|
237
|
+
findResourceByName(name: string): ConceptId | null;
|
|
238
|
+
|
|
239
|
+
// Flow queries
|
|
240
|
+
flowsFrom(entityId: ConceptId): Flow[];
|
|
241
|
+
flowsTo(entityId: ConceptId): Flow[];
|
|
242
|
+
|
|
243
|
+
// Get all (IndexMap ensures deterministic iteration order)
|
|
244
|
+
allEntities(): Entity[];
|
|
245
|
+
allResources(): Resource[];
|
|
246
|
+
allFlows(): Flow[];
|
|
247
|
+
allInstances(): Instance[];
|
|
248
|
+
|
|
249
|
+
// Parsing (supports multiline strings with """)
|
|
250
|
+
static parse(source: string): Graph;
|
|
251
|
+
|
|
252
|
+
// CALM integration (architecture-as-code)
|
|
253
|
+
exportCalm(): string; // Returns CALM JSON string
|
|
254
|
+
static importCalm(json: string): Graph; // Import from CALM JSON
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
`Graph.importCalm` will throw if the JSON is invalid or violates schema constraints; callers should also wrap `importCalm` in try/catch and inspect error messages for details.
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### Expression API (December 2025)
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
import { Expression, BinaryOp } from "@godspeedai/domainforge";
|
|
264
|
+
|
|
265
|
+
// Factory methods
|
|
266
|
+
const expr = Expression.binary(
|
|
267
|
+
BinaryOp.And,
|
|
268
|
+
Expression.variable("b"),
|
|
269
|
+
Expression.variable("a")
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
// Normalization
|
|
273
|
+
const normalized = expr.normalize();
|
|
274
|
+
console.log(normalized.toStringRepr()); // "(a AND b)"
|
|
275
|
+
console.log(normalized.stableHashHex()); // Stable hash
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Expression and BinaryOp
|
|
279
|
+
|
|
280
|
+
```typescript
|
|
281
|
+
enum BinaryOp {
|
|
282
|
+
And,
|
|
283
|
+
Or,
|
|
284
|
+
Equal,
|
|
285
|
+
NotEqual,
|
|
286
|
+
GreaterThan,
|
|
287
|
+
LessThan,
|
|
288
|
+
GreaterThanOrEqual,
|
|
289
|
+
LessThanOrEqual,
|
|
290
|
+
Plus,
|
|
291
|
+
Minus,
|
|
292
|
+
Multiply,
|
|
293
|
+
Divide,
|
|
294
|
+
Contains,
|
|
295
|
+
StartsWith,
|
|
296
|
+
EndsWith,
|
|
297
|
+
Matches,
|
|
298
|
+
HasRole,
|
|
299
|
+
Before,
|
|
300
|
+
After,
|
|
301
|
+
During,
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
class Expression {
|
|
305
|
+
// Factories
|
|
306
|
+
static literal(valueJson: string): Expression;
|
|
307
|
+
static literalBool(value: boolean): Expression;
|
|
308
|
+
static literalNumber(value: number): Expression;
|
|
309
|
+
static literalString(value: string): Expression;
|
|
310
|
+
static variable(name: string): Expression;
|
|
311
|
+
static binary(op: BinaryOp, left: Expression, right: Expression): Expression;
|
|
312
|
+
|
|
313
|
+
// Methods
|
|
314
|
+
normalize(): NormalizedExpression;
|
|
315
|
+
isEquivalent(other: Expression): boolean;
|
|
316
|
+
toStringRepr(): string;
|
|
317
|
+
equals(other: Expression): boolean;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
class NormalizedExpression {
|
|
321
|
+
stableHash(): string;
|
|
322
|
+
stableHashHex(): string;
|
|
323
|
+
innerExpression(): Expression;
|
|
324
|
+
toStringRepr(): string;
|
|
325
|
+
equals(other: NormalizedExpression): boolean;
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### NamespaceRegistry (Workspace)
|
|
330
|
+
|
|
331
|
+
```typescript
|
|
332
|
+
import { NamespaceRegistry } from "@godspeedai/domainforge";
|
|
333
|
+
|
|
334
|
+
// Load a registry by path to the file
|
|
335
|
+
const reg = NamespaceRegistry.from_file("./.sea-registry.toml");
|
|
336
|
+
|
|
337
|
+
// Expand files and get bindings
|
|
338
|
+
const files = reg.resolve_files(); // or reg.resolve_files(true) to fail on ambiguity via the failOnAmbiguity flag
|
|
339
|
+
for (const f of files) {
|
|
340
|
+
console.log(f.path, "=>", f.namespace);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Query namespace for a single file
|
|
344
|
+
const ns = reg.namespace_for("/path/to/file.sea"); // or pass true as the failOnAmbiguity flag to error on ambiguous matches
|
|
345
|
+
console.log("Namespace:", ns);
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
## Advanced Usage
|
|
349
|
+
|
|
350
|
+
### Working with Attributes
|
|
351
|
+
|
|
352
|
+
```typescript
|
|
353
|
+
// Use new() for default namespace
|
|
354
|
+
const entity = Entity.new("Warehouse");
|
|
355
|
+
entity.setAttribute("capacity", JSON.stringify(10000));
|
|
356
|
+
entity.setAttribute("location", JSON.stringify({ lat: 40.7128, lng: -74.006 }));
|
|
357
|
+
|
|
358
|
+
const capacity = JSON.parse(entity.getAttribute("capacity")!); // 10000
|
|
359
|
+
const location = JSON.parse(entity.getAttribute("location")!); // { lat: 40.7128, lng: -74.0060 }
|
|
360
|
+
|
|
361
|
+
// Namespace is always present (not undefined)
|
|
362
|
+
console.log(entity.namespace()); // "default"
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Querying Flow Networks
|
|
366
|
+
|
|
367
|
+
```typescript
|
|
368
|
+
const graph = Graph.parse(`
|
|
369
|
+
Entity "Supplier"
|
|
370
|
+
Entity "Warehouse"
|
|
371
|
+
Entity "Retailer"
|
|
372
|
+
Resource "Products" units
|
|
373
|
+
Flow "Products" from "Supplier" to "Warehouse" quantity 1000
|
|
374
|
+
Flow "Products" from "Warehouse" to "Retailer" quantity 800
|
|
375
|
+
`);
|
|
376
|
+
|
|
377
|
+
const warehouseId = graph.findEntityByName("Warehouse");
|
|
378
|
+
const inboundFlows = graph.flowsTo(warehouseId!);
|
|
379
|
+
const outboundFlows = graph.flowsFrom(warehouseId!);
|
|
380
|
+
|
|
381
|
+
console.log(`Warehouse receives ${inboundFlows.length} flows`);
|
|
382
|
+
console.log(`Warehouse sends ${outboundFlows.length} flows`);
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
## Building from Source
|
|
386
|
+
|
|
387
|
+
```bash
|
|
388
|
+
# Install dependencies
|
|
389
|
+
npm install
|
|
390
|
+
|
|
391
|
+
# Build the native module
|
|
392
|
+
npm run build
|
|
393
|
+
|
|
394
|
+
# Run tests
|
|
395
|
+
npm test
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
## Platform Support
|
|
399
|
+
|
|
400
|
+
Pre-built binaries are available for:
|
|
401
|
+
|
|
402
|
+
- Linux x64
|
|
403
|
+
- macOS ARM64 (Apple Silicon)
|
|
404
|
+
- Windows x64
|
|
405
|
+
|
|
406
|
+
Build from source for other platforms using `npm run build`.
|
|
407
|
+
|
|
408
|
+
## Semantic Pack API
|
|
409
|
+
|
|
410
|
+
The `@godspeedai/domainforge` module exposes semantic pack enums and functions for building, validating, signing, and inspecting packs programmatically.
|
|
411
|
+
|
|
412
|
+
### Enums
|
|
413
|
+
|
|
414
|
+
```typescript
|
|
415
|
+
import {
|
|
416
|
+
SemanticTruth, // Valid = 0, Invalid = 1, Unknown = 2
|
|
417
|
+
DiagnosticSeverity, // Error = 0, Warning = 1, Info = 2, Hint = 3
|
|
418
|
+
ValidationMode, // Off = 0, Warn = 1, Strict = 2
|
|
419
|
+
ApprovalState, // Candidate = 0, Approved = 1, Rejected = 2
|
|
420
|
+
SignatureState, // Unsigned = 0, Signed = 1, InvalidSignature = 2
|
|
421
|
+
ConceptStatus, // Active = 0, Proposed = 1, Deprecated = 2, Rejected = 3, ExternalOnly = 4
|
|
422
|
+
ConceptKind, // Entity = 0, Resource = 1, Role = 2, Flow = 3, Policy = 4, Metric = 5, Dimension = 6, Unit = 7, External = 8
|
|
423
|
+
AliasStatus, // Approved = 0, Deprecated = 1, Ambiguous = 2, Blocked = 3
|
|
424
|
+
SemanticValidationStatus, // Passed = 0, Failed = 1, Unknown = 2, Blocked = 3
|
|
425
|
+
} from "@godspeedai/domainforge";
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### Functions
|
|
429
|
+
|
|
430
|
+
#### semanticPackBuild
|
|
431
|
+
|
|
432
|
+
Build a semantic pack from input JSON. Returns a JSON string with `pack`, `pack_content_hash`, `meaning_fingerprint`, `pre_pack_diagnostics`, and `build_warnings`.
|
|
433
|
+
|
|
434
|
+
```typescript
|
|
435
|
+
const result = semanticPackBuild(inputJson);
|
|
436
|
+
const { pack, pack_content_hash, meaning_fingerprint } = JSON.parse(result);
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
#### semanticPackValidate
|
|
440
|
+
|
|
441
|
+
Validate a pack's internal consistency. Returns a JSON array of diagnostics.
|
|
442
|
+
|
|
443
|
+
```typescript
|
|
444
|
+
const diagnosticsJson = semanticPackValidate(packJson);
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
#### semanticPackValidateGraph
|
|
448
|
+
|
|
449
|
+
Validate a source against a pack with options. Returns a JSON validation result.
|
|
450
|
+
|
|
451
|
+
```typescript
|
|
452
|
+
const resultJson = semanticPackValidateGraph(packJson, "source_uri", optionsJson);
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
#### semanticPackSign
|
|
456
|
+
|
|
457
|
+
Sign a pack with an Ed25519 private key (PEM string). Returns the signed pack JSON.
|
|
458
|
+
|
|
459
|
+
```typescript
|
|
460
|
+
const signedJson = semanticPackSign(packJson, privateKeyPem);
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
#### semanticPackVerify
|
|
464
|
+
|
|
465
|
+
Verify a pack's Ed25519 signature. Returns `true` if valid, throws on failure.
|
|
466
|
+
|
|
467
|
+
```typescript
|
|
468
|
+
const isValid: boolean = semanticPackVerify(packJson, publicKeyPem);
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
#### semanticPackDiff
|
|
472
|
+
|
|
473
|
+
Compare two packs. Returns a JSON diff with entries and summary.
|
|
474
|
+
|
|
475
|
+
```typescript
|
|
476
|
+
const diffJson = semanticPackDiff(oldPackJson, newPackJson);
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
#### semanticPackHash
|
|
480
|
+
|
|
481
|
+
Compute the content hash of a pack (excluding signature fields).
|
|
482
|
+
|
|
483
|
+
```typescript
|
|
484
|
+
const hash: string = semanticPackHash(packJson);
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
#### semanticNormalizeKey
|
|
488
|
+
|
|
489
|
+
Normalize a term for lookup (NFC, case-fold, whitespace collapse).
|
|
490
|
+
|
|
491
|
+
```typescript
|
|
492
|
+
const normalized: string = semanticNormalizeKey(" Hello World "); // "hello world"
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
#### semanticResolveConcept
|
|
496
|
+
|
|
497
|
+
Resolve a term against a pack. Returns a JSON object with `resolved_concept_id`, `semantic_truth`, `diagnostic_code`, `diagnostic_severity`, `message`, and `suggestions`.
|
|
498
|
+
|
|
499
|
+
```typescript
|
|
500
|
+
const resultJson = semanticResolveConcept("Supplier", packJson, optionsJson);
|
|
501
|
+
const result = JSON.parse(resultJson);
|
|
502
|
+
console.log(result.resolved_concept_id); // "supplier" or null
|
|
503
|
+
console.log(result.semantic_truth); // "valid", "invalid", or "unknown"
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
## License
|
|
507
|
+
|
|
508
|
+
Apache-2.0
|