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,68 @@
|
|
|
1
|
+
# Adding a New Primitive
|
|
2
|
+
|
|
3
|
+
This playbook outlines the steps required to add a new primitive (e.g., `Zone`, `Cluster`) to the DomainForge language.
|
|
4
|
+
|
|
5
|
+
**Warning**: This is a cross-cutting change that affects Core, Grammar, and all Bindings.
|
|
6
|
+
|
|
7
|
+
## Checklist
|
|
8
|
+
|
|
9
|
+
### 1. Rust Core (`domainforge-core`)
|
|
10
|
+
|
|
11
|
+
- [ ] **Grammar**: Update `domainforge-core/grammar/sea.pest`. Add the new keyword and syntax rules.
|
|
12
|
+
- [ ] **AST**: Update `domainforge-core/src/parser/ast.rs` to include the new node type.
|
|
13
|
+
- [ ] **Primitive Struct**: Create `domainforge-core/src/primitives/new_primitive.rs`. Implement `Debug`, `Clone`, `Serialize`.
|
|
14
|
+
- [ ] **Module Exports**: Add the new module to `domainforge-core/src/primitives/mod.rs` and export it (`pub mod new_primitive;` and `pub use` if needed).
|
|
15
|
+
- [ ] **Graph**: Update `domainforge-core/src/graph/mod.rs`. Add an `IndexMap` for the new primitive, expose it with `pub mod`/`pub use`, and wire the new collection into Graph.
|
|
16
|
+
- [ ] **Parser Logic**: Update `domainforge-core/src/parser/mod.rs` to transform the AST node into the Primitive struct, add the module to the `mod` list, and export it.
|
|
17
|
+
|
|
18
|
+
### 2. Bindings
|
|
19
|
+
|
|
20
|
+
- [ ] **Python**: Update `domainforge-core/src/python/lib.rs` and `domainforge-core/src/python/primitives.rs` to add the `#[pyclass]` wrapper and register it in `lib.rs`.
|
|
21
|
+
- [ ] **TypeScript**: Update `domainforge-core/src/typescript/primitives.rs` and `domainforge-core/src/typescript/index.ts` to add the napi-compatible struct and export it.
|
|
22
|
+
- [ ] **WASM**: Update `domainforge-core/src/wasm/primitives.rs` and `domainforge-core/src/wasm/lib.rs` if the primitive needs specific exposure.
|
|
23
|
+
|
|
24
|
+
### 3. Testing
|
|
25
|
+
|
|
26
|
+
- [ ] **Rust Tests**: Add a test case in `domainforge-core/tests/parser_tests.rs`.
|
|
27
|
+
- [ ] **Python Tests**: Add a test in `tests/test_primitives.py`.
|
|
28
|
+
- [ ] **TypeScript Tests**: Add a test in `typescript-tests/primitives.test.ts`.
|
|
29
|
+
|
|
30
|
+
### 4. Documentation
|
|
31
|
+
|
|
32
|
+
- [ ] Update `semantic-modeling-concepts.md`.
|
|
33
|
+
- [ ] Update `sea.pest` comments.
|
|
34
|
+
|
|
35
|
+
## Example: Adding "Zone"
|
|
36
|
+
|
|
37
|
+
1. **Grammar**:
|
|
38
|
+
|
|
39
|
+
```pest
|
|
40
|
+
zone_decl = { "zone" ~ identifier ~ "{" ~ (property)* ~ "}" }
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
2. **Struct**:
|
|
44
|
+
|
|
45
|
+
```rust
|
|
46
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
47
|
+
pub struct Zone {
|
|
48
|
+
pub id: ConceptId,
|
|
49
|
+
pub properties: IndexMap<String, Value>,
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
3. **Graph**:
|
|
54
|
+
|
|
55
|
+
```rust
|
|
56
|
+
pub struct Graph {
|
|
57
|
+
pub zones: IndexMap<ConceptId, Zone>,
|
|
58
|
+
// ... other primitive collections (entities, resources, flows, roles, relations, instances)
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Verification
|
|
63
|
+
|
|
64
|
+
Run the full suite to ensure no regressions:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
just all-tests
|
|
68
|
+
```
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Debugging Parser Failures
|
|
2
|
+
|
|
3
|
+
When the parser fails to process a `.sea` file, follow these steps to diagnose the issue.
|
|
4
|
+
|
|
5
|
+
## 1. Read the Error Message
|
|
6
|
+
|
|
7
|
+
Pest provides detailed error locations.
|
|
8
|
+
```text
|
|
9
|
+
Error: --> 3:12
|
|
10
|
+
|
|
|
11
|
+
3 | entity Foo { type = "service"
|
|
12
|
+
| ^--- expected "}"
|
|
13
|
+
```
|
|
14
|
+
*Interpretation*: Missing closing brace.
|
|
15
|
+
|
|
16
|
+
## 2. Common Syntax Mistakes
|
|
17
|
+
|
|
18
|
+
- **Missing Quotes**: Strings must be double-quoted. `type = service` is wrong; `type = "service"` is right.
|
|
19
|
+
- **Trailing Commas**: SEA does not use commas between properties. Use newlines.
|
|
20
|
+
- **Keywords**: Ensure you aren't using a reserved keyword as an identifier.
|
|
21
|
+
|
|
22
|
+
## 3. Using the Pest Debugger
|
|
23
|
+
|
|
24
|
+
If you are modifying the grammar, you can use either the web-based playground or the command-line debugger depending on your workflow:
|
|
25
|
+
|
|
26
|
+
- Web playground (fast, visual):
|
|
27
|
+
1. Go to [pest.rs](https://pest.rs/).
|
|
28
|
+
2. Paste the content of `domainforge-core/grammar/sea.pest` into the grammar box.
|
|
29
|
+
3. Paste your failing input into the input box.
|
|
30
|
+
4. Watch the rule matching visualization to see where it diverges.
|
|
31
|
+
|
|
32
|
+
- CLI debugger (`pest_debugger`) — useful for iterative debugging locally:
|
|
33
|
+
1. Install the CLI via cargo: `cargo install pest_debugger` or via `cargo install --git https://github.com/pest-parser/pest` if you prefer the latest.
|
|
34
|
+
2. Run the CLI against your grammar and failing input: `pest_debugger --grammar domainforge-core/grammar/sea.pest --input test.repro.sea`.
|
|
35
|
+
3. Use the interactive prompt to step rules and inspect matches.
|
|
36
|
+
|
|
37
|
+
## 4. Reporting Grammar Bugs
|
|
38
|
+
|
|
39
|
+
If valid syntax is rejected:
|
|
40
|
+
1. Create a minimal reproduction file (`repro.sea`).
|
|
41
|
+
2. Open an issue with the file content and the error output.
|
|
42
|
+
3. Tag with `area/parser`.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Local Release Preparation
|
|
2
|
+
|
|
3
|
+
This playbook describes how to prepare a release locally using the just recipes, allowing you to preview changes, generate replay scripts, and test the release process before triggering the GitHub Actions workflow.
|
|
4
|
+
|
|
5
|
+
## Available Recipes
|
|
6
|
+
|
|
7
|
+
| Recipe | Purpose |
|
|
8
|
+
| ------------------------------ | --------------------------------------------------------------- |
|
|
9
|
+
| `just release-preview [bump]` | Preview all changes + generate replay script (no modifications) |
|
|
10
|
+
| `just prepare-release [bump]` | Apply version bump to all files |
|
|
11
|
+
| `just changelog-entry VERSION` | Add a changelog entry for a specific version |
|
|
12
|
+
| `just test-changelog-logic` | Test changelog insertion logic (restores original) |
|
|
13
|
+
|
|
14
|
+
Where `[bump]` is one of: `patch`, `minor`, `major`
|
|
15
|
+
|
|
16
|
+
## Prerequisites
|
|
17
|
+
|
|
18
|
+
- `jq` installed (for JSON processing)
|
|
19
|
+
- `just` command runner
|
|
20
|
+
- Clean git working directory (recommended)
|
|
21
|
+
|
|
22
|
+
## Workflow
|
|
23
|
+
|
|
24
|
+
### 1. Create a Release Branch
|
|
25
|
+
|
|
26
|
+
Always create a dedicated branch for the release. This allows you to group the changelog updates, version bumps, and any other release-related changes (like updating this playbook!) into a single PR.
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# From main
|
|
30
|
+
git checkout -b release/x.y.z main
|
|
31
|
+
# Example
|
|
32
|
+
git checkout -b release/0.7.0 main
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 2. Preview Changes (Recommended)
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
just release-preview minor
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
This will:
|
|
42
|
+
|
|
43
|
+
- Calculate the new version based on bump type
|
|
44
|
+
- Show unified diffs for all affected files:
|
|
45
|
+
- `domainforge-core/Cargo.toml`
|
|
46
|
+
- `pyproject.toml`
|
|
47
|
+
- `package.json`
|
|
48
|
+
- `CHANGELOG.md`
|
|
49
|
+
- Generate an executable replay script (e.g., `release-0.5.0.sh`)
|
|
50
|
+
|
|
51
|
+
**No files are modified** - this is purely a preview.
|
|
52
|
+
|
|
53
|
+
### 3. Apply Changes
|
|
54
|
+
|
|
55
|
+
You have two options:
|
|
56
|
+
|
|
57
|
+
**Option A: Run the generated script**
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
./release-0.7.0.sh
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Option B: Use the just recipe directly**
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
just prepare-release minor
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Both approaches produce identical results.
|
|
70
|
+
|
|
71
|
+
### 4. Review and Commit
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# Review the changes
|
|
75
|
+
git diff
|
|
76
|
+
|
|
77
|
+
# Edit CHANGELOG.md with actual release notes
|
|
78
|
+
vim CHANGELOG.md
|
|
79
|
+
|
|
80
|
+
# Commit
|
|
81
|
+
git add -A
|
|
82
|
+
git commit -m "chore: bump version to 0.5.0"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 5. Continue with Release
|
|
86
|
+
|
|
87
|
+
After preparing locally, you can either:
|
|
88
|
+
|
|
89
|
+
1. **Push and let CI handle it**: Push the release branch, merge to `main`, create a tag
|
|
90
|
+
2. **Use the GitHub workflow**: Trigger `prepare-release.yml` which will create a PR
|
|
91
|
+
|
|
92
|
+
## Pre-release Versions
|
|
93
|
+
|
|
94
|
+
To create a pre-release (e.g., `0.5.0-beta.1`):
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# Preview
|
|
98
|
+
just release-preview minor beta.1
|
|
99
|
+
|
|
100
|
+
# Apply
|
|
101
|
+
just prepare-release minor beta.1
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Debugging
|
|
105
|
+
|
|
106
|
+
### Test Changelog Logic Only
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
just test-changelog-logic
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
This adds a test entry to CHANGELOG.md, displays the result, then restores the original file.
|
|
113
|
+
|
|
114
|
+
### Verbose Diff
|
|
115
|
+
|
|
116
|
+
The `release-preview` recipe shows diffs for all files. If you need to inspect a specific file more closely:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
just release-preview patch 2>&1 | grep -A 50 "Cargo.toml"
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Integration with GitHub Actions
|
|
123
|
+
|
|
124
|
+
The local recipes mirror the logic in `.github/workflows/prepare-release.yml`:
|
|
125
|
+
|
|
126
|
+
| GitHub Action Step | Local Equivalent |
|
|
127
|
+
| --------------------- | ----------------------------------------------------- |
|
|
128
|
+
| Calculate new version | Same algorithm in `release-preview`/`prepare-release` |
|
|
129
|
+
| Bump Cargo.toml | `sed` replacement |
|
|
130
|
+
| Sync pyproject.toml | `sed` replacement |
|
|
131
|
+
| Sync package.json | `jq` replacement |
|
|
132
|
+
| Update CHANGELOG.md | `just changelog-entry` |
|
|
133
|
+
|
|
134
|
+
This ensures you can validate the release logic locally before triggering the workflow.
|
|
135
|
+
|
|
136
|
+
## See Also
|
|
137
|
+
|
|
138
|
+
- [Releasing Beta](./releasing-beta.md) - Full release process
|
|
139
|
+
- [Secret Management](./secret-management.md) - Managing release tokens
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Migrating Schema Versions
|
|
2
|
+
|
|
3
|
+
As DomainForge evolves, the `.sea` file format may change. This guide explains how to handle migrations.
|
|
4
|
+
|
|
5
|
+
## Detection
|
|
6
|
+
|
|
7
|
+
The CLI will warn if you are using deprecated syntax.
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
Warning: 'interface' keyword is deprecated. Use 'flow' instead.
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Breaking Changes Strategy
|
|
14
|
+
|
|
15
|
+
### 1. Automated Migration (Future)
|
|
16
|
+
|
|
17
|
+
We plan to add `sea-cli migrate <file>` to automatically update syntax.
|
|
18
|
+
|
|
19
|
+
### 2. Manual Migration
|
|
20
|
+
|
|
21
|
+
For now, manual updates are required.
|
|
22
|
+
|
|
23
|
+
**Example: Renaming `connection` to `flow`**
|
|
24
|
+
*Old:*
|
|
25
|
+
```sea
|
|
26
|
+
connection "c1" from "A" to "B"
|
|
27
|
+
```
|
|
28
|
+
*New:*
|
|
29
|
+
```sea
|
|
30
|
+
flow "Data" from "A" to "B"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Backward Compatibility
|
|
34
|
+
|
|
35
|
+
We strive to support the previous MAJOR version's syntax for one release cycle.
|
|
36
|
+
|
|
37
|
+
- **v0.4**: Introduces `flow`, deprecates `connection`. Both work.
|
|
38
|
+
- **v0.5**: Removes `connection`.
|
|
39
|
+
|
|
40
|
+
## Best Practices
|
|
41
|
+
|
|
42
|
+
- Pin the CLI version in your CI pipeline to avoid unexpected breakages.
|
|
43
|
+
- Read the `CHANGELOG.md` before upgrading.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Onboarding Contributors
|
|
2
|
+
|
|
3
|
+
Welcome to the DomainForge team! This guide will get you set up and ready to contribute.
|
|
4
|
+
|
|
5
|
+
## 1. Development Environment
|
|
6
|
+
|
|
7
|
+
You need:
|
|
8
|
+
|
|
9
|
+
- **Rust**: Latest stable (`rustup update`)
|
|
10
|
+
- **Python**: 3.8+
|
|
11
|
+
- **Node.js**: 16+
|
|
12
|
+
- **Just**: Command runner (`cargo install just`)
|
|
13
|
+
|
|
14
|
+
## 2. Initial Setup
|
|
15
|
+
|
|
16
|
+
Run the setup script to install dependencies for all languages.
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
just setup
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 3. Codebase Tour
|
|
23
|
+
|
|
24
|
+
- **`domainforge-core/`**: The brain. Start here.
|
|
25
|
+
- `grammar/`: The syntax definition.
|
|
26
|
+
- `primitives/`: The data structures.
|
|
27
|
+
- **`tests/`**: Integration tests.
|
|
28
|
+
- **`docs/`**: You are here.
|
|
29
|
+
|
|
30
|
+
## 4. Running Tests
|
|
31
|
+
|
|
32
|
+
Before submitting a PR, ensure everything passes.
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
just all-tests
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
This runs:
|
|
39
|
+
|
|
40
|
+
1. `cargo test` (Core)
|
|
41
|
+
2. `pytest` (Python bindings)
|
|
42
|
+
3. `vitest` (TypeScript bindings)
|
|
43
|
+
|
|
44
|
+
## 5. Your First Issue
|
|
45
|
+
|
|
46
|
+
Look for issues labeled `good first issue`.
|
|
47
|
+
|
|
48
|
+
- **Documentation**: Fix typos or add examples.
|
|
49
|
+
- **Parser**: Add a small syntax feature.
|
|
50
|
+
- **CLI**: Improve output formatting.
|
|
51
|
+
|
|
52
|
+
## 6. PR Process
|
|
53
|
+
|
|
54
|
+
1. Fork the repo.
|
|
55
|
+
2. Create a feature branch.
|
|
56
|
+
3. Make changes.
|
|
57
|
+
4. Add tests! (We love tests).
|
|
58
|
+
5. Run `cargo fmt` and `cargo clippy`.
|
|
59
|
+
6. Submit PR.
|
|
60
|
+
|
|
61
|
+
## See Also
|
|
62
|
+
|
|
63
|
+
- [Architecture Overview](../explanations/architecture-overview.md)
|
|
64
|
+
- [Developer Commands](../../../justfile)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Releasing Beta
|
|
2
|
+
|
|
3
|
+
This playbook describes the process for releasing a new beta version of DomainForge.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Clean git working directory.
|
|
8
|
+
- Passing CI (`just all-tests`).
|
|
9
|
+
- Write access to crates.io, PyPI, and NPM.
|
|
10
|
+
|
|
11
|
+
## Steps
|
|
12
|
+
|
|
13
|
+
1. **Version Bump**:
|
|
14
|
+
|
|
15
|
+
> **Recommended**: Use `just release-preview minor` to preview changes first, then `just prepare-release minor` to apply them. See [Local Release Preparation](./local-release-preparation.md) for details.
|
|
16
|
+
|
|
17
|
+
> **Automated (GitHub)**: Use the `prepare-release.yml` workflow (Actions → Prepare Release → Run workflow) to bump all versions and create a PR automatically.
|
|
18
|
+
|
|
19
|
+
If bumping manually, update version in all files (they must stay in sync):
|
|
20
|
+
|
|
21
|
+
- `domainforge-core/Cargo.toml` (source of truth)
|
|
22
|
+
- `pyproject.toml`
|
|
23
|
+
- `package.json`
|
|
24
|
+
|
|
25
|
+
> Note: WASM `pkg/package.json` is auto-generated from `domainforge-core/Cargo.toml` during build.
|
|
26
|
+
|
|
27
|
+
1. **Changelog**:
|
|
28
|
+
|
|
29
|
+
Update `CHANGELOG.md` with new features and breaking changes.
|
|
30
|
+
|
|
31
|
+
1. **Build & Test**:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
just setup
|
|
35
|
+
just all-tests
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
1. **Git Tag**:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
git tag -a v0.x.0 -m "Release v0.x.0"
|
|
42
|
+
git push origin v0.x.0
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
1. **Publish Rust Core**:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
cargo publish -p domainforge-core
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
1. **Publish Python**:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
maturin publish
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
1. **Publish TypeScript**:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npm publish
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
1. **GitHub Release**:
|
|
64
|
+
|
|
65
|
+
Draft a new release on GitHub using the changelog notes.
|
|
66
|
+
|
|
67
|
+
If a critical bug is found immediately:
|
|
68
|
+
|
|
69
|
+
- **Rust**: Yank the crate (`cargo yank --vers <version>`).
|
|
70
|
+
|
|
71
|
+
- **NPM**: Deprecate the package version and suggest replacement:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
npm deprecate @godspeedai/domainforge@0.x.0 "Critical security bug; use @godspeedai/domainforge@0.x.1"
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
- **PyPI**: Yank/unyank through standard tooling (e.g., `twine` or `maturin publish --yank`) or publish a hotfix patch:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Publish a hotfix
|
|
81
|
+
git checkout -b hotfix/0.x.1
|
|
82
|
+
bumpversion patch
|
|
83
|
+
git push origin hotfix/0.x.1
|
|
84
|
+
# Create release and upload via twine/maturin
|
|
85
|
+
maturin publish --skip-existing
|
|
86
|
+
```
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Secret Management with SOPS + age
|
|
2
|
+
|
|
3
|
+
Scope: securely manage project secrets under `secrets/` using SOPS and age; keep encrypted files in git and avoid plaintext leaks.
|
|
4
|
+
|
|
5
|
+
## Preconditions
|
|
6
|
+
|
|
7
|
+
- age key pair available (or generate one).
|
|
8
|
+
- `sops` installed locally/CI.
|
|
9
|
+
- `secrets/secrets.template.yaml` present as a placeholder.
|
|
10
|
+
|
|
11
|
+
## Steps
|
|
12
|
+
|
|
13
|
+
1. **Create editable copy**
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
cp secrets/secrets.template.yaml secrets/secrets.yaml
|
|
17
|
+
# fill in real values
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
2. **Encrypt in place**
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# replace AGE_PUBLIC_KEY with your age public key
|
|
24
|
+
sops --encrypt --age "AGE_PUBLIC_KEY" --in-place secrets/secrets.yaml
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
- Verify encryption (`head -n 5 secrets/secrets.yaml` shows a `sops:` section).
|
|
28
|
+
|
|
29
|
+
3. **Commit only encrypted files**
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
git add secrets/secrets.yaml .sops.yaml
|
|
33
|
+
git commit -m "Add encrypted secrets"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
4. **Decrypt when needed (local only)**
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
sops --decrypt secrets/secrets.yaml > /tmp/decrypted-secrets.yaml
|
|
40
|
+
# or edit inline
|
|
41
|
+
sops secrets/secrets.yaml
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
5. **Rotate or add recipients**
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
sops --add-recipients "AGE_PUBLIC_KEY" --in-place secrets/secrets.yaml
|
|
48
|
+
# remove a key by re-encrypting without it
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
6. **Use in CI**
|
|
52
|
+
|
|
53
|
+
- Provide `SOPS_AGE_KEY` (private key) as a CI secret.
|
|
54
|
+
- Decrypt with `sops --decrypt secrets/secrets.yaml > /tmp/secrets.yaml` before publishing packages.
|
|
55
|
+
|
|
56
|
+
## Security notes
|
|
57
|
+
|
|
58
|
+
- Never commit plaintext secrets or private age keys.
|
|
59
|
+
- Keep `.sops.yaml` aligned with repository paths; use per-environment keys when possible.
|
|
60
|
+
|
|
61
|
+
## See also
|
|
62
|
+
|
|
63
|
+
- [Configuration](../reference/configuration.md) for registry/environment flags
|
|
64
|
+
- [.sops.yaml](../../.sops.yaml) for creation rules
|