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,373 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# release.sh - Master release orchestration script for DomainForge
|
|
3
|
+
# Usage: ./scripts/release.sh [major|minor|patch|X.Y.Z] [OPTIONS]
|
|
4
|
+
#
|
|
5
|
+
# Orchestrates the complete release process:
|
|
6
|
+
# 1. Pre-release checks
|
|
7
|
+
# 2. Version bump
|
|
8
|
+
# 3. Changelog generation
|
|
9
|
+
# 4. Release notes generation
|
|
10
|
+
# 5. Git tag creation
|
|
11
|
+
# 6. Build artifacts
|
|
12
|
+
# 7. Push and create GitHub release
|
|
13
|
+
|
|
14
|
+
set -euo pipefail
|
|
15
|
+
|
|
16
|
+
# ============================================================================
|
|
17
|
+
# Configuration
|
|
18
|
+
# ============================================================================
|
|
19
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
20
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
21
|
+
|
|
22
|
+
# Colors
|
|
23
|
+
RED='\033[0;31m'
|
|
24
|
+
GREEN='\033[0;32m'
|
|
25
|
+
YELLOW='\033[1;33m'
|
|
26
|
+
BLUE='\033[0;34m'
|
|
27
|
+
CYAN='\033[0;36m'
|
|
28
|
+
NC='\033[0m'
|
|
29
|
+
|
|
30
|
+
# Flags
|
|
31
|
+
DRY_RUN=false
|
|
32
|
+
SKIP_TESTS=false
|
|
33
|
+
SKIP_BUILD=false
|
|
34
|
+
AUTO_CONFIRM=false
|
|
35
|
+
|
|
36
|
+
# ============================================================================
|
|
37
|
+
# Helper Functions
|
|
38
|
+
# ============================================================================
|
|
39
|
+
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
|
40
|
+
log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
|
|
41
|
+
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
|
42
|
+
log_error() { echo -e "${RED}[✗]${NC} $1"; }
|
|
43
|
+
log_step() { echo -e "${CYAN}[STEP]${NC} $1"; }
|
|
44
|
+
|
|
45
|
+
banner() {
|
|
46
|
+
echo ""
|
|
47
|
+
echo -e "${CYAN}=============================================="
|
|
48
|
+
echo " 🚀 DomainForge Release Process"
|
|
49
|
+
echo "==============================================${NC}"
|
|
50
|
+
echo ""
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
usage() {
|
|
54
|
+
cat <<EOF
|
|
55
|
+
Usage: $(basename "$0") [VERSION_TYPE] [OPTIONS]
|
|
56
|
+
|
|
57
|
+
Complete release orchestration for DomainForge.
|
|
58
|
+
|
|
59
|
+
VERSION_TYPE:
|
|
60
|
+
major Bump major version (X.0.0)
|
|
61
|
+
minor Bump minor version (x.Y.0)
|
|
62
|
+
patch Bump patch version (x.y.Z) [default]
|
|
63
|
+
X.Y.Z Set explicit version (e.g., 1.2.3)
|
|
64
|
+
|
|
65
|
+
OPTIONS:
|
|
66
|
+
--dry-run Run through all steps without making changes
|
|
67
|
+
--skip-tests Skip running test suites (faster, less safe)
|
|
68
|
+
--skip-build Skip building release artifacts
|
|
69
|
+
--yes, -y Auto-confirm push and release creation
|
|
70
|
+
-h, --help Show this help message
|
|
71
|
+
|
|
72
|
+
RELEASE PROCESS:
|
|
73
|
+
Run this from main after merging the release changes.
|
|
74
|
+
1. Run pre-release checks (git status, tests, version sync)
|
|
75
|
+
2. Bump version in all package files
|
|
76
|
+
3. Generate changelog from commits
|
|
77
|
+
4. Generate release notes for GitHub
|
|
78
|
+
5. Commit version changes
|
|
79
|
+
6. Create annotated git tag
|
|
80
|
+
7. Build release artifacts (CLI, Python, WASM)
|
|
81
|
+
8. Push to remote (with confirmation)
|
|
82
|
+
9. Create GitHub release with artifacts
|
|
83
|
+
|
|
84
|
+
EXAMPLES:
|
|
85
|
+
$(basename "$0") # Patch release (0.6.2 -> 0.6.3)
|
|
86
|
+
$(basename "$0") minor # Minor release (0.6.2 -> 0.7.0)
|
|
87
|
+
$(basename "$0") major # Major release (0.6.2 -> 1.0.0)
|
|
88
|
+
$(basename "$0") --dry-run # Preview full release process
|
|
89
|
+
$(basename "$0") patch --yes # Patch release with auto-confirm
|
|
90
|
+
|
|
91
|
+
REQUIREMENTS:
|
|
92
|
+
- git
|
|
93
|
+
- cargo (Rust toolchain)
|
|
94
|
+
- just (optional, for tests)
|
|
95
|
+
- maturin (for Python wheels)
|
|
96
|
+
- wasm-pack (for WASM bundle)
|
|
97
|
+
- gh (GitHub CLI, for release creation)
|
|
98
|
+
|
|
99
|
+
ROLLBACK:
|
|
100
|
+
If the release fails after version bump:
|
|
101
|
+
git reset --hard HEAD~1
|
|
102
|
+
git tag -d v{VERSION}
|
|
103
|
+
EOF
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
confirm() {
|
|
107
|
+
local prompt="$1"
|
|
108
|
+
local default="${2:-n}"
|
|
109
|
+
|
|
110
|
+
if $AUTO_CONFIRM; then
|
|
111
|
+
return 0
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
if $DRY_RUN; then
|
|
115
|
+
log_info "Would prompt: $prompt"
|
|
116
|
+
return 0
|
|
117
|
+
fi
|
|
118
|
+
|
|
119
|
+
local answer
|
|
120
|
+
read -r -p "$prompt [y/N] " answer
|
|
121
|
+
[[ "$answer" =~ ^[Yy]$ ]]
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
run_script() {
|
|
125
|
+
local script="$1"
|
|
126
|
+
shift
|
|
127
|
+
local args=("$@")
|
|
128
|
+
|
|
129
|
+
if $DRY_RUN; then
|
|
130
|
+
args+=("--dry-run")
|
|
131
|
+
fi
|
|
132
|
+
|
|
133
|
+
if [[ -x "$SCRIPT_DIR/$script" ]]; then
|
|
134
|
+
"$SCRIPT_DIR/$script" "${args[@]}"
|
|
135
|
+
else
|
|
136
|
+
log_error "Script not found or not executable: $script"
|
|
137
|
+
exit 1
|
|
138
|
+
fi
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
# ============================================================================
|
|
142
|
+
# Parse Arguments
|
|
143
|
+
# ============================================================================
|
|
144
|
+
VERSION_TYPE="patch"
|
|
145
|
+
|
|
146
|
+
while [[ $# -gt 0 ]]; do
|
|
147
|
+
case $1 in
|
|
148
|
+
--dry-run)
|
|
149
|
+
DRY_RUN=true
|
|
150
|
+
shift
|
|
151
|
+
;;
|
|
152
|
+
--skip-tests)
|
|
153
|
+
SKIP_TESTS=true
|
|
154
|
+
shift
|
|
155
|
+
;;
|
|
156
|
+
--skip-build)
|
|
157
|
+
SKIP_BUILD=true
|
|
158
|
+
shift
|
|
159
|
+
;;
|
|
160
|
+
--yes|-y)
|
|
161
|
+
AUTO_CONFIRM=true
|
|
162
|
+
shift
|
|
163
|
+
;;
|
|
164
|
+
-h|--help)
|
|
165
|
+
usage
|
|
166
|
+
exit 0
|
|
167
|
+
;;
|
|
168
|
+
-*)
|
|
169
|
+
log_error "Unknown option: $1"
|
|
170
|
+
usage
|
|
171
|
+
exit 1
|
|
172
|
+
;;
|
|
173
|
+
*)
|
|
174
|
+
VERSION_TYPE="$1"
|
|
175
|
+
shift
|
|
176
|
+
;;
|
|
177
|
+
esac
|
|
178
|
+
done
|
|
179
|
+
|
|
180
|
+
# ============================================================================
|
|
181
|
+
# Main
|
|
182
|
+
# ============================================================================
|
|
183
|
+
cd "$PROJECT_ROOT"
|
|
184
|
+
|
|
185
|
+
banner
|
|
186
|
+
|
|
187
|
+
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
188
|
+
|
|
189
|
+
if [[ "$CURRENT_BRANCH" != "main" ]]; then
|
|
190
|
+
log_error "Release execution must start from main. Current branch: $CURRENT_BRANCH"
|
|
191
|
+
log_info "Merge or fast-forward the intended release commit onto main, then rerun this script from main."
|
|
192
|
+
exit 1
|
|
193
|
+
fi
|
|
194
|
+
|
|
195
|
+
if $DRY_RUN; then
|
|
196
|
+
log_warn "DRY RUN MODE - No changes will be made"
|
|
197
|
+
echo ""
|
|
198
|
+
fi
|
|
199
|
+
|
|
200
|
+
log_info "Release type: $VERSION_TYPE"
|
|
201
|
+
echo ""
|
|
202
|
+
|
|
203
|
+
# ============================================================================
|
|
204
|
+
# Step 1: Pre-release checks
|
|
205
|
+
# ============================================================================
|
|
206
|
+
log_step "Step 1/9: Running pre-release checks..."
|
|
207
|
+
echo ""
|
|
208
|
+
|
|
209
|
+
PRE_CHECK_ARGS=()
|
|
210
|
+
if $SKIP_TESTS; then
|
|
211
|
+
PRE_CHECK_ARGS+=("--skip-tests")
|
|
212
|
+
fi
|
|
213
|
+
if $DRY_RUN; then
|
|
214
|
+
PRE_CHECK_ARGS+=("--dry-run")
|
|
215
|
+
fi
|
|
216
|
+
|
|
217
|
+
if ! "$SCRIPT_DIR/pre-release-check.sh" "${PRE_CHECK_ARGS[@]}"; then
|
|
218
|
+
log_error "Pre-release checks failed. Fix issues before releasing."
|
|
219
|
+
exit 1
|
|
220
|
+
fi
|
|
221
|
+
echo ""
|
|
222
|
+
|
|
223
|
+
# ============================================================================
|
|
224
|
+
# Step 2: Bump version
|
|
225
|
+
# ============================================================================
|
|
226
|
+
log_step "Step 2/9: Bumping version..."
|
|
227
|
+
echo ""
|
|
228
|
+
|
|
229
|
+
BUMP_ARGS=("$VERSION_TYPE" "--no-commit")
|
|
230
|
+
if $DRY_RUN; then
|
|
231
|
+
BUMP_ARGS+=("--dry-run")
|
|
232
|
+
fi
|
|
233
|
+
|
|
234
|
+
# Capture new version from bump script
|
|
235
|
+
NEW_VERSION=$("$SCRIPT_DIR/bump-version.sh" "${BUMP_ARGS[@]}" | tail -1)
|
|
236
|
+
log_success "New version: $NEW_VERSION"
|
|
237
|
+
echo ""
|
|
238
|
+
|
|
239
|
+
# ============================================================================
|
|
240
|
+
# Step 3: Generate changelog
|
|
241
|
+
# ============================================================================
|
|
242
|
+
log_step "Step 3/9: Generating changelog..."
|
|
243
|
+
echo ""
|
|
244
|
+
|
|
245
|
+
CHANGELOG_ARGS=("$NEW_VERSION" "--no-commit")
|
|
246
|
+
if $DRY_RUN; then
|
|
247
|
+
CHANGELOG_ARGS+=("--dry-run")
|
|
248
|
+
fi
|
|
249
|
+
|
|
250
|
+
"$SCRIPT_DIR/generate-changelog.sh" "${CHANGELOG_ARGS[@]}"
|
|
251
|
+
echo ""
|
|
252
|
+
|
|
253
|
+
# ============================================================================
|
|
254
|
+
# Step 4: Generate release notes
|
|
255
|
+
# ============================================================================
|
|
256
|
+
log_step "Step 4/9: Generating release notes..."
|
|
257
|
+
echo ""
|
|
258
|
+
|
|
259
|
+
NOTES_ARGS=("$NEW_VERSION")
|
|
260
|
+
if $DRY_RUN; then
|
|
261
|
+
NOTES_ARGS+=("--dry-run")
|
|
262
|
+
fi
|
|
263
|
+
|
|
264
|
+
"$SCRIPT_DIR/generate-release-notes.sh" "${NOTES_ARGS[@]}"
|
|
265
|
+
echo ""
|
|
266
|
+
|
|
267
|
+
# ============================================================================
|
|
268
|
+
# Step 5: Commit version changes
|
|
269
|
+
# ============================================================================
|
|
270
|
+
log_step "Step 5/9: Committing changes..."
|
|
271
|
+
echo ""
|
|
272
|
+
|
|
273
|
+
if $DRY_RUN; then
|
|
274
|
+
log_info "Would commit: chore: release v$NEW_VERSION"
|
|
275
|
+
else
|
|
276
|
+
git add -A
|
|
277
|
+
git commit -m "chore: release v$NEW_VERSION" || log_warn "Nothing to commit or commit failed"
|
|
278
|
+
log_success "Created commit: chore: release v$NEW_VERSION"
|
|
279
|
+
fi
|
|
280
|
+
echo ""
|
|
281
|
+
|
|
282
|
+
# ============================================================================
|
|
283
|
+
# Step 6: Create git tag
|
|
284
|
+
# ============================================================================
|
|
285
|
+
log_step "Step 6/9: Creating git tag..."
|
|
286
|
+
echo ""
|
|
287
|
+
|
|
288
|
+
TAG_ARGS=("$NEW_VERSION")
|
|
289
|
+
if $DRY_RUN; then
|
|
290
|
+
TAG_ARGS+=("--dry-run")
|
|
291
|
+
fi
|
|
292
|
+
|
|
293
|
+
"$SCRIPT_DIR/create-tag.sh" "${TAG_ARGS[@]}"
|
|
294
|
+
echo ""
|
|
295
|
+
|
|
296
|
+
# ============================================================================
|
|
297
|
+
# Step 7: Build artifacts
|
|
298
|
+
# ============================================================================
|
|
299
|
+
if ! $SKIP_BUILD; then
|
|
300
|
+
log_step "Step 7/9: Building release artifacts..."
|
|
301
|
+
echo ""
|
|
302
|
+
|
|
303
|
+
BUILD_ARGS=()
|
|
304
|
+
if $DRY_RUN; then
|
|
305
|
+
BUILD_ARGS+=("--dry-run")
|
|
306
|
+
fi
|
|
307
|
+
|
|
308
|
+
"$SCRIPT_DIR/build-release.sh" "${BUILD_ARGS[@]}"
|
|
309
|
+
echo ""
|
|
310
|
+
else
|
|
311
|
+
log_step "Step 7/9: Skipping build (--skip-build)"
|
|
312
|
+
echo ""
|
|
313
|
+
fi
|
|
314
|
+
|
|
315
|
+
# ============================================================================
|
|
316
|
+
# Step 8: Push to remote
|
|
317
|
+
# ============================================================================
|
|
318
|
+
log_step "Step 8/9: Preparing to push..."
|
|
319
|
+
echo ""
|
|
320
|
+
|
|
321
|
+
BRANCH="$CURRENT_BRANCH"
|
|
322
|
+
TAG_NAME="v$NEW_VERSION"
|
|
323
|
+
|
|
324
|
+
log_warn "Ready to push the following:"
|
|
325
|
+
echo " - Branch: $BRANCH"
|
|
326
|
+
echo " - Tag: $TAG_NAME"
|
|
327
|
+
echo ""
|
|
328
|
+
|
|
329
|
+
if $DRY_RUN; then
|
|
330
|
+
log_info "Would push: git push origin $BRANCH"
|
|
331
|
+
log_info "Would push: git push origin $TAG_NAME"
|
|
332
|
+
else
|
|
333
|
+
if confirm "Push to remote and create GitHub release?"; then
|
|
334
|
+
log_info "Pushing branch..."
|
|
335
|
+
git push origin "$BRANCH"
|
|
336
|
+
log_success "Pushed branch: $BRANCH"
|
|
337
|
+
|
|
338
|
+
log_info "Pushing tag..."
|
|
339
|
+
git push origin "$TAG_NAME"
|
|
340
|
+
log_success "Pushed tag: $TAG_NAME"
|
|
341
|
+
echo ""
|
|
342
|
+
|
|
343
|
+
# ============================================================================
|
|
344
|
+
# Step 9: Create GitHub release
|
|
345
|
+
# ============================================================================
|
|
346
|
+
log_step "Step 9/9: Creating GitHub release..."
|
|
347
|
+
echo ""
|
|
348
|
+
|
|
349
|
+
GH_ARGS=("$NEW_VERSION")
|
|
350
|
+
"$SCRIPT_DIR/create-github-release.sh" "${GH_ARGS[@]}"
|
|
351
|
+
|
|
352
|
+
echo ""
|
|
353
|
+
echo -e "${GREEN}=============================================="
|
|
354
|
+
echo " ✨ Release v$NEW_VERSION completed!"
|
|
355
|
+
echo "==============================================${NC}"
|
|
356
|
+
echo ""
|
|
357
|
+
log_success "All release steps completed successfully"
|
|
358
|
+
echo ""
|
|
359
|
+
log_info "Next steps:"
|
|
360
|
+
echo " 1. Verify GitHub release: https://github.com/GodSpeedAI/DomainForge/releases"
|
|
361
|
+
echo " 2. Wait for CI to publish to npm, PyPI, and crates.io"
|
|
362
|
+
echo " 3. Announce the release"
|
|
363
|
+
else
|
|
364
|
+
echo ""
|
|
365
|
+
log_warn "Release cancelled. To undo local changes:"
|
|
366
|
+
echo " git reset --hard HEAD~1"
|
|
367
|
+
echo " git tag -d $TAG_NAME"
|
|
368
|
+
exit 1
|
|
369
|
+
fi
|
|
370
|
+
fi
|
|
371
|
+
|
|
372
|
+
echo ""
|
|
373
|
+
log_success "Release process complete"
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Locate a compiled Rust binary under the workspace `target/` directories.
|
|
4
|
+
|
|
5
|
+
Supports both workspace-level targets (e.g., `target/x86_64-unknown-linux-gnu/release/sea`)
|
|
6
|
+
and crate-local targets (e.g., `domainforge-core/target/release/domainforge`). The script can match
|
|
7
|
+
by exact name, prefix, or substring and falls back to alternate match modes when
|
|
8
|
+
requested. Designed for both CI (finding the built CLI) and editor automation
|
|
9
|
+
(finding hashed test binaries for codelldb).
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import argparse
|
|
15
|
+
import os
|
|
16
|
+
import sys
|
|
17
|
+
from dataclasses import dataclass
|
|
18
|
+
from typing import Iterable, List, Optional, Sequence, Tuple
|
|
19
|
+
|
|
20
|
+
MATCH_CHOICES = ("exact", "prefix", "contains")
|
|
21
|
+
DEFAULT_SEARCH_ROOTS = ["target", os.path.join("domainforge-core", "target")]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass(frozen=True)
|
|
25
|
+
class SearchOptions:
|
|
26
|
+
names: Sequence[str]
|
|
27
|
+
match_mode: str
|
|
28
|
+
require_executable: bool
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def parse_args() -> argparse.Namespace:
|
|
32
|
+
parser = argparse.ArgumentParser(description="Find a compiled Rust binary path.")
|
|
33
|
+
parser.add_argument(
|
|
34
|
+
"--name", required=True, help="Base name of the binary (stem without hash)."
|
|
35
|
+
)
|
|
36
|
+
parser.add_argument(
|
|
37
|
+
"--profile",
|
|
38
|
+
choices=["debug", "release"],
|
|
39
|
+
default="debug",
|
|
40
|
+
help="Cargo profile directory to search (default: debug).",
|
|
41
|
+
)
|
|
42
|
+
parser.add_argument(
|
|
43
|
+
"--target-triple",
|
|
44
|
+
help="Optional target triple (searches target/<triple>/<profile>).",
|
|
45
|
+
)
|
|
46
|
+
parser.add_argument(
|
|
47
|
+
"--deps-subdir",
|
|
48
|
+
help="Optional additional subdirectory (e.g., 'deps' for test binaries).",
|
|
49
|
+
)
|
|
50
|
+
parser.add_argument(
|
|
51
|
+
"--match-mode",
|
|
52
|
+
choices=MATCH_CHOICES,
|
|
53
|
+
default="exact",
|
|
54
|
+
help="Primary match mode for filenames (default: exact).",
|
|
55
|
+
)
|
|
56
|
+
parser.add_argument(
|
|
57
|
+
"--fallback-mode",
|
|
58
|
+
choices=MATCH_CHOICES,
|
|
59
|
+
help="Optional secondary match mode if the primary fails.",
|
|
60
|
+
)
|
|
61
|
+
parser.add_argument(
|
|
62
|
+
"--extension",
|
|
63
|
+
action="append",
|
|
64
|
+
dest="extensions",
|
|
65
|
+
help=(
|
|
66
|
+
"Explicit filename extensions to consider. Provide multiple times for "
|
|
67
|
+
"multiple extensions. Defaults to ['', '.exe']."
|
|
68
|
+
),
|
|
69
|
+
)
|
|
70
|
+
parser.add_argument(
|
|
71
|
+
"--search-root",
|
|
72
|
+
action="append",
|
|
73
|
+
dest="search_roots",
|
|
74
|
+
help=(
|
|
75
|
+
"Override search roots (relative to workspace). Provide multiple times "
|
|
76
|
+
"to search several directories. Defaults to workspace 'target/' and "
|
|
77
|
+
"'domainforge-core/target/'."
|
|
78
|
+
),
|
|
79
|
+
)
|
|
80
|
+
parser.add_argument(
|
|
81
|
+
"--workspace",
|
|
82
|
+
default=".",
|
|
83
|
+
help="Workspace root (defaults to current working directory).",
|
|
84
|
+
)
|
|
85
|
+
parser.add_argument(
|
|
86
|
+
"--require-executable",
|
|
87
|
+
action="store_true",
|
|
88
|
+
help="Only consider paths that are executable.",
|
|
89
|
+
)
|
|
90
|
+
return parser.parse_args()
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def canonical_workspace(path: str) -> str:
|
|
94
|
+
return os.path.abspath(os.path.expanduser(path))
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def candidate_directories(
|
|
98
|
+
workspace: str, roots: Sequence[str], target: Optional[str], profile: str, deps: Optional[str]
|
|
99
|
+
) -> List[str]:
|
|
100
|
+
seen = set()
|
|
101
|
+
directories: List[str] = []
|
|
102
|
+
|
|
103
|
+
for root in roots:
|
|
104
|
+
base = os.path.join(workspace, root)
|
|
105
|
+
targets: Tuple[str, ...]
|
|
106
|
+
if target:
|
|
107
|
+
targets = (
|
|
108
|
+
os.path.join(base, target, profile),
|
|
109
|
+
os.path.join(base, profile),
|
|
110
|
+
)
|
|
111
|
+
else:
|
|
112
|
+
targets = (os.path.join(base, profile),)
|
|
113
|
+
|
|
114
|
+
for target_dir in targets:
|
|
115
|
+
if deps:
|
|
116
|
+
target_dir = os.path.join(target_dir, deps)
|
|
117
|
+
normalized = os.path.normpath(target_dir)
|
|
118
|
+
if normalized not in seen:
|
|
119
|
+
seen.add(normalized)
|
|
120
|
+
directories.append(normalized)
|
|
121
|
+
return directories
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def build_candidate_names(name: str, extensions: Sequence[str]) -> List[str]:
|
|
125
|
+
if extensions:
|
|
126
|
+
return [f"{name}{ext}" for ext in extensions]
|
|
127
|
+
return [name, f"{name}.exe"]
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def iter_sorted_files(directory: str) -> Iterable[str]:
|
|
131
|
+
try:
|
|
132
|
+
entries = os.listdir(directory)
|
|
133
|
+
except FileNotFoundError:
|
|
134
|
+
return []
|
|
135
|
+
except NotADirectoryError:
|
|
136
|
+
return []
|
|
137
|
+
entries.sort(
|
|
138
|
+
key=lambda entry: os.path.getmtime(os.path.join(directory, entry)),
|
|
139
|
+
reverse=True,
|
|
140
|
+
)
|
|
141
|
+
return entries
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def match_entry(entry: str, names: Sequence[str], mode: str) -> bool:
|
|
145
|
+
entry_cmp = entry.lower()
|
|
146
|
+
if mode == "exact":
|
|
147
|
+
lowered = [n.lower() for n in names]
|
|
148
|
+
return entry_cmp in lowered
|
|
149
|
+
if mode == "prefix":
|
|
150
|
+
lowered = [n.lower() for n in names]
|
|
151
|
+
return any(entry_cmp.startswith(n) for n in lowered)
|
|
152
|
+
if mode == "contains":
|
|
153
|
+
lowered = [n.lower() for n in names]
|
|
154
|
+
return any(n in entry_cmp for n in lowered)
|
|
155
|
+
raise ValueError(f"Unsupported match mode: {mode}")
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def find_binary(
|
|
159
|
+
directories: Sequence[str],
|
|
160
|
+
options: SearchOptions,
|
|
161
|
+
) -> Optional[str]:
|
|
162
|
+
for directory in directories:
|
|
163
|
+
for entry in iter_sorted_files(directory):
|
|
164
|
+
path = os.path.join(directory, entry)
|
|
165
|
+
if not os.path.isfile(path):
|
|
166
|
+
continue
|
|
167
|
+
if options.require_executable and not os.access(path, os.X_OK):
|
|
168
|
+
continue
|
|
169
|
+
if match_entry(entry, options.names, options.match_mode):
|
|
170
|
+
return os.path.abspath(path)
|
|
171
|
+
return None
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def fail_with_diagnostics(
|
|
175
|
+
name: str, directories: Sequence[str], match_mode: str, fallback_mode: Optional[str]
|
|
176
|
+
) -> None:
|
|
177
|
+
rel_dirs = [os.path.relpath(d) for d in directories]
|
|
178
|
+
print(
|
|
179
|
+
"Unable to locate compiled binary.\n"
|
|
180
|
+
f" name: {name}\n"
|
|
181
|
+
f" match_mode: {match_mode}\n"
|
|
182
|
+
f" fallback_mode: {fallback_mode or 'none'}\n"
|
|
183
|
+
f" searched directories:\n - " + "\n - ".join(rel_dirs),
|
|
184
|
+
file=sys.stderr,
|
|
185
|
+
)
|
|
186
|
+
sys.exit(1)
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def main() -> None:
|
|
190
|
+
args = parse_args()
|
|
191
|
+
workspace = canonical_workspace(args.workspace)
|
|
192
|
+
roots = args.search_roots or DEFAULT_SEARCH_ROOTS
|
|
193
|
+
extensions = args.extensions or ["", ".exe"]
|
|
194
|
+
|
|
195
|
+
directories = candidate_directories(
|
|
196
|
+
workspace=workspace,
|
|
197
|
+
roots=roots,
|
|
198
|
+
target=args.target_triple,
|
|
199
|
+
profile=args.profile,
|
|
200
|
+
deps=args.deps_subdir,
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
options = SearchOptions(
|
|
204
|
+
names=build_candidate_names(args.name, extensions),
|
|
205
|
+
match_mode=args.match_mode,
|
|
206
|
+
require_executable=args.require_executable,
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
result = find_binary(directories, options)
|
|
210
|
+
if not result and args.fallback_mode:
|
|
211
|
+
fallback_options = SearchOptions(
|
|
212
|
+
names=options.names,
|
|
213
|
+
match_mode=args.fallback_mode,
|
|
214
|
+
require_executable=options.require_executable,
|
|
215
|
+
)
|
|
216
|
+
result = find_binary(directories, fallback_options)
|
|
217
|
+
|
|
218
|
+
if not result:
|
|
219
|
+
fail_with_diagnostics(
|
|
220
|
+
name=args.name,
|
|
221
|
+
directories=directories,
|
|
222
|
+
match_mode=args.match_mode,
|
|
223
|
+
fallback_mode=args.fallback_mode,
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
print(result)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
if __name__ == "__main__":
|
|
230
|
+
main()
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
set -eu
|
|
3
|
+
|
|
4
|
+
if [ "$#" -ne 1 ]; then
|
|
5
|
+
echo "Usage: $0 <commit_message_file>" >&2
|
|
6
|
+
exit 2
|
|
7
|
+
fi
|
|
8
|
+
|
|
9
|
+
msg_file="$1"
|
|
10
|
+
|
|
11
|
+
if [ -x "./node_modules/.bin/commitlint" ]; then
|
|
12
|
+
exec ./node_modules/.bin/commitlint --edit "$msg_file"
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
if command -v bunx >/dev/null 2>&1; then
|
|
16
|
+
exec bunx --yes commitlint --edit "$msg_file"
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
if command -v npx >/dev/null 2>&1; then
|
|
20
|
+
exec npx --yes commitlint --edit "$msg_file"
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
if command -v npm >/dev/null 2>&1; then
|
|
24
|
+
exec npm exec --yes commitlint -- --edit "$msg_file"
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
echo "commitlint is required but no compatible runner was found (node_modules/.bin, bunx, npx, npm)." >&2
|
|
28
|
+
echo "Run 'just setup' or install Node.js/Bun, then retry." >&2
|
|
29
|
+
exit 1
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
echo "========================================"
|
|
5
|
+
echo " DomainForge SEA DSL - Test Suite"
|
|
6
|
+
echo "========================================"
|
|
7
|
+
echo ""
|
|
8
|
+
|
|
9
|
+
# Colors for output
|
|
10
|
+
RED='\033[0;31m'
|
|
11
|
+
GREEN='\033[0;32m'
|
|
12
|
+
YELLOW='\033[1;33m'
|
|
13
|
+
NC='\033[0m' # No Color
|
|
14
|
+
|
|
15
|
+
FAILED=0
|
|
16
|
+
|
|
17
|
+
# Rust tests
|
|
18
|
+
echo "==> Running Rust tests..."
|
|
19
|
+
if cargo test --manifest-path domainforge-core/Cargo.toml; then
|
|
20
|
+
echo -e "${GREEN}✓ Rust tests passed${NC}"
|
|
21
|
+
else
|
|
22
|
+
echo -e "${RED}✗ Rust tests failed${NC}"
|
|
23
|
+
FAILED=1
|
|
24
|
+
fi
|
|
25
|
+
echo ""
|
|
26
|
+
|
|
27
|
+
# Python tests
|
|
28
|
+
echo "==> Running Python tests..."
|
|
29
|
+
if [ -f "tests/test_primitives.py" ]; then
|
|
30
|
+
# Build Python bindings if not already built
|
|
31
|
+
if [ ! -d ".venv" ] || ! .venv/bin/python -c "import domainforge" 2>/dev/null; then
|
|
32
|
+
echo "Building Python bindings..."
|
|
33
|
+
bash scripts/build-python.sh
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
# Activate virtual environment and run tests
|
|
37
|
+
source .venv/bin/activate
|
|
38
|
+
if pytest tests/ -v; then
|
|
39
|
+
echo -e "${GREEN}✓ Python tests passed${NC}"
|
|
40
|
+
else
|
|
41
|
+
echo -e "${RED}✗ Python tests failed${NC}"
|
|
42
|
+
FAILED=1
|
|
43
|
+
fi
|
|
44
|
+
deactivate
|
|
45
|
+
else
|
|
46
|
+
echo -e "${YELLOW}⚠ No Python tests found${NC}"
|
|
47
|
+
fi
|
|
48
|
+
echo ""
|
|
49
|
+
|
|
50
|
+
# TypeScript tests
|
|
51
|
+
echo "==> Running TypeScript tests..."
|
|
52
|
+
if [ -f "vitest.config.ts" ]; then
|
|
53
|
+
# Build TypeScript bindings if not already built
|
|
54
|
+
if [ ! -f "domainforge-core.linux-x64-gnu.node" ] && [ ! -f "index.node" ]; then
|
|
55
|
+
echo "Building TypeScript bindings..."
|
|
56
|
+
bash scripts/build-typescript.sh
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
if npm test; then
|
|
60
|
+
echo -e "${GREEN}✓ TypeScript tests passed${NC}"
|
|
61
|
+
else
|
|
62
|
+
echo -e "${RED}✗ TypeScript tests failed${NC}"
|
|
63
|
+
FAILED=1
|
|
64
|
+
fi
|
|
65
|
+
else
|
|
66
|
+
echo -e "${YELLOW}⚠ No TypeScript tests found${NC}"
|
|
67
|
+
fi
|
|
68
|
+
echo ""
|
|
69
|
+
|
|
70
|
+
echo "========================================"
|
|
71
|
+
if [ $FAILED -eq 0 ]; then
|
|
72
|
+
echo -e "${GREEN}✓ All tests passed!${NC}"
|
|
73
|
+
exit 0
|
|
74
|
+
else
|
|
75
|
+
echo -e "${RED}✗ Some tests failed${NC}"
|
|
76
|
+
exit 1
|
|
77
|
+
fi
|