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.
Files changed (481) hide show
  1. package/.cargo/config.toml +6 -0
  2. package/.claude/settings.local.json +18 -0
  3. package/.coderabbit.yml +43 -0
  4. package/.codex/skills/release-management/SKILL.md +151 -0
  5. package/.codex/skills/release-management/agents/openai.yaml +4 -0
  6. package/.github/actions/decrypt-secrets/action.yml +121 -0
  7. package/.github/agents/Coder.agent.md +97 -0
  8. package/.github/agents/DeepResearch.agent.md +61 -0
  9. package/.github/chatmodes/tdd.vibepro.chatmode.md +1183 -0
  10. package/.github/copilot-instructions.md +13 -0
  11. package/.github/dependabot.yml +68 -0
  12. package/.github/workflows/README.md +165 -0
  13. package/.github/workflows/ci.yml +335 -0
  14. package/.github/workflows/dependabot-automerge.yml +114 -0
  15. package/.github/workflows/dependency-review.yml +27 -0
  16. package/.github/workflows/deploy.yml +87 -0
  17. package/.github/workflows/prepare-release.yml +168 -0
  18. package/.github/workflows/release-crates.yml +42 -0
  19. package/.github/workflows/release-npm.yml +137 -0
  20. package/.github/workflows/release-please.yml +29 -0
  21. package/.github/workflows/release-pypi.yml +96 -0
  22. package/.gitkeep +1 -0
  23. package/.release-please-manifest.json +5 -0
  24. package/.sea-registry.toml +10 -0
  25. package/.serena/project.yml +133 -0
  26. package/.sops.yaml +10 -0
  27. package/AGENTS.md +216 -0
  28. package/CHANGELOG.md +400 -0
  29. package/CLAUDE.md +62 -0
  30. package/CONTRIBUTING.md +323 -0
  31. package/Cargo.lock +3612 -0
  32. package/Cargo.toml +12 -0
  33. package/LICENSE +201 -0
  34. package/README.md +660 -0
  35. package/README_PYTHON.md +256 -0
  36. package/README_TYPESCRIPT.md +305 -0
  37. package/README_WASM.md +329 -0
  38. package/RELEASE_NOTES.md +41 -0
  39. package/bun.lock +378 -0
  40. package/bunfig.toml +11 -0
  41. package/check_output.txt +83 -0
  42. package/clippy_output.txt +80 -0
  43. package/commitlint.config.cjs +8 -0
  44. package/deny.toml +42 -0
  45. package/devbox.json +14 -0
  46. package/devbox.lock +76 -0
  47. package/docs/RELEASE_PROCESS.md +360 -0
  48. package/docs/diagnostics.md +161 -0
  49. package/docs/doc_guidelines.md +53 -0
  50. package/docs/explanations/README.md +21 -0
  51. package/docs/explanations/architecture-overview.md +109 -0
  52. package/docs/explanations/cross-language-binding-strategy.md +68 -0
  53. package/docs/explanations/graph-store-design.md +47 -0
  54. package/docs/explanations/performance-benchmarks.md +63 -0
  55. package/docs/explanations/policy-evaluation-logic.md +106 -0
  56. package/docs/explanations/semantic-modeling-concepts.md +109 -0
  57. package/docs/explanations/three-valued-logic.md +66 -0
  58. package/docs/explanations/versioning-strategy.md +45 -0
  59. package/docs/governance.md +168 -0
  60. package/docs/how-tos/README.md +46 -0
  61. package/docs/how-tos/ci-cd-validation.md +93 -0
  62. package/docs/how-tos/create-custom-units.md +125 -0
  63. package/docs/how-tos/define-policies.md +119 -0
  64. package/docs/how-tos/export-to-calm.md +110 -0
  65. package/docs/how-tos/export-to-protobuf.md +312 -0
  66. package/docs/how-tos/extend-grammar.md +133 -0
  67. package/docs/how-tos/generate-rdf-turtle.md +106 -0
  68. package/docs/how-tos/import-from-calm.md +114 -0
  69. package/docs/how-tos/import-from-sbvr.md +249 -0
  70. package/docs/how-tos/install-cli.md +126 -0
  71. package/docs/how-tos/parse-sea-files.md +132 -0
  72. package/docs/how-tos/policy-evaluation-modes.md +30 -0
  73. package/docs/how-tos/run-cross-language-tests.md +115 -0
  74. package/docs/how-tos/troubleshoot-napi-builds.md +55 -0
  75. package/docs/how-tos/use-modules-imports.md +285 -0
  76. package/docs/index.md +13 -0
  77. package/docs/plans/canonical-normalizer.md +121 -0
  78. package/docs/plans/cd_improvement.md +112 -0
  79. package/docs/plans/cli-ast.md +29 -0
  80. package/docs/plans/expression-bindings-and-normalizer-integration.md +174 -0
  81. package/docs/plans/protobuf_advanced_features_plan.md +597 -0
  82. package/docs/plans/protobuf_plan.yml +525 -0
  83. package/docs/plans/refactor_dsl_architecture.md +131 -0
  84. package/docs/plans/release-plan.md +163 -0
  85. package/docs/plans/sea_fmt_implementation_plan.md +516 -0
  86. package/docs/playbooks/README.md +18 -0
  87. package/docs/playbooks/adding-new-primitive.md +68 -0
  88. package/docs/playbooks/debugging-parser-failures.md +42 -0
  89. package/docs/playbooks/local-release-preparation.md +139 -0
  90. package/docs/playbooks/migrating-schema-versions.md +43 -0
  91. package/docs/playbooks/onboarding-contributors.md +64 -0
  92. package/docs/playbooks/releasing-beta.md +86 -0
  93. package/docs/playbooks/secret-management.md +64 -0
  94. package/docs/reference/README.md +199 -0
  95. package/docs/reference/ast-json-api.md +427 -0
  96. package/docs/reference/calm-mapping.md +519 -0
  97. package/docs/reference/cli-commands.md +588 -0
  98. package/docs/reference/configuration.md +202 -0
  99. package/docs/reference/error-codes.md +664 -0
  100. package/docs/reference/generated-artifacts-policy.md +53 -0
  101. package/docs/reference/grammar-spec.md +255 -0
  102. package/docs/reference/primitives-api.md +317 -0
  103. package/docs/reference/protobuf-api.md +426 -0
  104. package/docs/reference/python-api.md +485 -0
  105. package/docs/reference/registry.md +50 -0
  106. package/docs/reference/sea-dsl-ai-cheatsheet.yaml +913 -0
  107. package/docs/reference/security-model.md +74 -0
  108. package/docs/reference/typescript-api.md +508 -0
  109. package/docs/reference/wasm-api.md +420 -0
  110. package/docs/semantic-pack-review.md +144 -0
  111. package/docs/semantic-pack-signing.md +234 -0
  112. package/docs/semantic-packs.md +284 -0
  113. package/docs/specs/ADR-001-sea-dsl-semantic-source-of-truth.md +33 -0
  114. package/docs/specs/ADR-002-projection-first-class-construct.md +50 -0
  115. package/docs/specs/ADR-003-protobuf-projection-target.md +51 -0
  116. package/docs/specs/ADR-004-projection-compatibility-semantics.md +57 -0
  117. package/docs/specs/ADR-005-multi-language-support-strategy.md +112 -0
  118. package/docs/specs/ADR-006-error-handling-strategy.md +115 -0
  119. package/docs/specs/ADR-007-policy-evaluation-engine.md +95 -0
  120. package/docs/specs/ADR-008-knowledge-graph-integration.md +90 -0
  121. package/docs/specs/ADR-009-module-resolution-strategy.md +115 -0
  122. package/docs/specs/ADR-010-unit-system.md +106 -0
  123. package/docs/specs/PRD-001-sea-projection-framework.md +155 -0
  124. package/docs/specs/PRD-002-sea-cli-tooling.md +169 -0
  125. package/docs/specs/PRD-003-dsl-core-capabilities.md +275 -0
  126. package/docs/specs/README.md +62 -0
  127. package/docs/specs/SDS-001-protobuf-projection-engine.md +451 -0
  128. package/docs/specs/SDS-002-sea-core-architecture.md +268 -0
  129. package/docs/specs/SDS-003-parser-semantic-graph.md +377 -0
  130. package/docs/specs/SDS-004-policy-engine-design.md +362 -0
  131. package/docs/specs/SDS-005-knowledge-graph-module.md +364 -0
  132. package/docs/specs/SDS-006-calm-integration.md +367 -0
  133. package/docs/specs/SDS-007-sbvr-import.md +347 -0
  134. package/docs/templates/template_explanation.md +14 -0
  135. package/docs/templates/template_howto.md +21 -0
  136. package/docs/templates/template_playbook.md +21 -0
  137. package/docs/templates/template_reference.md +17 -0
  138. package/docs/templates/template_tutorial.md +24 -0
  139. package/docs/tutorials/README.md +12 -0
  140. package/docs/tutorials/first-sea-model.md +85 -0
  141. package/docs/tutorials/getting-started.md +98 -0
  142. package/docs/tutorials/python-binding-quickstart.md +107 -0
  143. package/docs/tutorials/typescript-binding-quickstart.md +91 -0
  144. package/docs/tutorials/wasm-in-browser.md +75 -0
  145. package/domainforge-core/CHANGELOG.md +138 -0
  146. package/domainforge-core/Cargo.toml +101 -0
  147. package/domainforge-core/MIGRATING.md +32 -0
  148. package/domainforge-core/README.md +197 -0
  149. package/domainforge-core/benchmark_results.txt +51 -0
  150. package/domainforge-core/build.rs +6 -0
  151. package/domainforge-core/deny.toml +31 -0
  152. package/domainforge-core/docs/specs/projections/sbvr_kg_mapping.md +43 -0
  153. package/domainforge-core/examples/basic.sea +7 -0
  154. package/domainforge-core/examples/cli/import_export_workflow.sh +38 -0
  155. package/domainforge-core/examples/cli/validate_example.sh +30 -0
  156. package/domainforge-core/examples/evolution_semantics.sea +31 -0
  157. package/domainforge-core/examples/parser_demo.rs +203 -0
  158. package/domainforge-core/grammar/sea.pest +408 -0
  159. package/domainforge-core/schemas/calm-v1.schema.json +170 -0
  160. package/domainforge-core/schemas/shacl/sea_shapes.ttl +19 -0
  161. package/domainforge-core/src/authority/compiler.rs +309 -0
  162. package/domainforge-core/src/authority/environment.rs +203 -0
  163. package/domainforge-core/src/authority/error.rs +164 -0
  164. package/domainforge-core/src/authority/fact_resolver.rs +224 -0
  165. package/domainforge-core/src/authority/mod.rs +25 -0
  166. package/domainforge-core/src/authority/pack.rs +133 -0
  167. package/domainforge-core/src/authority/policy.rs +224 -0
  168. package/domainforge-core/src/authority/resolver.rs +446 -0
  169. package/domainforge-core/src/authority/trace.rs +217 -0
  170. package/domainforge-core/src/authority/transform.rs +168 -0
  171. package/domainforge-core/src/authority/types.rs +617 -0
  172. package/domainforge-core/src/bin/domainforge.rs +25 -0
  173. package/domainforge-core/src/calm/export.rs +538 -0
  174. package/domainforge-core/src/calm/import.rs +1220 -0
  175. package/domainforge-core/src/calm/mod.rs +9 -0
  176. package/domainforge-core/src/calm/models.rs +108 -0
  177. package/domainforge-core/src/calm/sbvr_import.rs +9 -0
  178. package/domainforge-core/src/cli/authority.rs +149 -0
  179. package/domainforge-core/src/cli/format.rs +85 -0
  180. package/domainforge-core/src/cli/import.rs +133 -0
  181. package/domainforge-core/src/cli/mod.rs +64 -0
  182. package/domainforge-core/src/cli/normalize.rs +180 -0
  183. package/domainforge-core/src/cli/pack.rs +904 -0
  184. package/domainforge-core/src/cli/parse.rs +112 -0
  185. package/domainforge-core/src/cli/project.rs +294 -0
  186. package/domainforge-core/src/cli/registry.rs +41 -0
  187. package/domainforge-core/src/cli/test.rs +12 -0
  188. package/domainforge-core/src/cli/validate.rs +195 -0
  189. package/domainforge-core/src/cli/validate_kg.rs +80 -0
  190. package/domainforge-core/src/concept_id.rs +89 -0
  191. package/domainforge-core/src/error/diagnostics.rs +426 -0
  192. package/domainforge-core/src/error/fuzzy.rs +253 -0
  193. package/domainforge-core/src/error/mod.rs +13 -0
  194. package/domainforge-core/src/formatter/comments.rs +223 -0
  195. package/domainforge-core/src/formatter/config.rs +114 -0
  196. package/domainforge-core/src/formatter/mod.rs +22 -0
  197. package/domainforge-core/src/formatter/printer.rs +906 -0
  198. package/domainforge-core/src/graph/mod.rs +858 -0
  199. package/domainforge-core/src/graph/to_ast.rs +66 -0
  200. package/domainforge-core/src/kg.rs +1476 -0
  201. package/domainforge-core/src/kg_import.rs +251 -0
  202. package/domainforge-core/src/lib.rs +203 -0
  203. package/domainforge-core/src/module/mod.rs +1 -0
  204. package/domainforge-core/src/module/resolver.rs +260 -0
  205. package/domainforge-core/src/parser/ast.rs +2919 -0
  206. package/domainforge-core/src/parser/ast_convert.rs +494 -0
  207. package/domainforge-core/src/parser/ast_schema.rs +491 -0
  208. package/domainforge-core/src/parser/error.rs +291 -0
  209. package/domainforge-core/src/parser/lint.rs +39 -0
  210. package/domainforge-core/src/parser/mod.rs +193 -0
  211. package/domainforge-core/src/parser/printer.rs +702 -0
  212. package/domainforge-core/src/parser/profiles.rs +71 -0
  213. package/domainforge-core/src/parser/string_utils.rs +138 -0
  214. package/domainforge-core/src/patterns.rs +68 -0
  215. package/domainforge-core/src/policy/core.rs +1148 -0
  216. package/domainforge-core/src/policy/expression.rs +399 -0
  217. package/domainforge-core/src/policy/mod.rs +18 -0
  218. package/domainforge-core/src/policy/normalize.rs +1028 -0
  219. package/domainforge-core/src/policy/quantifier.rs +940 -0
  220. package/domainforge-core/src/policy/three_valued.rs +140 -0
  221. package/domainforge-core/src/policy/three_valued_microbench.rs +104 -0
  222. package/domainforge-core/src/policy/type_inference.rs +67 -0
  223. package/domainforge-core/src/policy/violation.rs +36 -0
  224. package/domainforge-core/src/primitives/concept_change.rs +61 -0
  225. package/domainforge-core/src/primitives/entity.rs +224 -0
  226. package/domainforge-core/src/primitives/flow.rs +111 -0
  227. package/domainforge-core/src/primitives/instance.rs +93 -0
  228. package/domainforge-core/src/primitives/mapping_contract.rs +50 -0
  229. package/domainforge-core/src/primitives/metric.rs +79 -0
  230. package/domainforge-core/src/primitives/mod.rs +25 -0
  231. package/domainforge-core/src/primitives/projection_contract.rs +50 -0
  232. package/domainforge-core/src/primitives/quantity.rs +56 -0
  233. package/domainforge-core/src/primitives/relation.rs +68 -0
  234. package/domainforge-core/src/primitives/resource.rs +237 -0
  235. package/domainforge-core/src/primitives/resource_instance.rs +88 -0
  236. package/domainforge-core/src/primitives/role.rs +49 -0
  237. package/domainforge-core/src/projection/buf.rs +404 -0
  238. package/domainforge-core/src/projection/contracts.rs +22 -0
  239. package/domainforge-core/src/projection/engine.rs +19 -0
  240. package/domainforge-core/src/projection/mod.rs +16 -0
  241. package/domainforge-core/src/projection/protobuf.rs +3331 -0
  242. package/domainforge-core/src/projection/registry.rs +43 -0
  243. package/domainforge-core/src/python/authority.rs +253 -0
  244. package/domainforge-core/src/python/error.rs +227 -0
  245. package/domainforge-core/src/python/formatter.rs +86 -0
  246. package/domainforge-core/src/python/graph.rs +366 -0
  247. package/domainforge-core/src/python/mod.rs +9 -0
  248. package/domainforge-core/src/python/policy.rs +651 -0
  249. package/domainforge-core/src/python/primitives.rs +796 -0
  250. package/domainforge-core/src/python/registry.rs +98 -0
  251. package/domainforge-core/src/python/semantic_pack.rs +619 -0
  252. package/domainforge-core/src/python/units.rs +96 -0
  253. package/domainforge-core/src/registry/mod.rs +432 -0
  254. package/domainforge-core/src/registry/tests.rs +210 -0
  255. package/domainforge-core/src/sbvr.rs +744 -0
  256. package/domainforge-core/src/semantic_pack/builder.rs +470 -0
  257. package/domainforge-core/src/semantic_pack/canonical_json.rs +184 -0
  258. package/domainforge-core/src/semantic_pack/diagnostics.rs +214 -0
  259. package/domainforge-core/src/semantic_pack/diff.rs +216 -0
  260. package/domainforge-core/src/semantic_pack/mod.rs +31 -0
  261. package/domainforge-core/src/semantic_pack/pack_set.rs +240 -0
  262. package/domainforge-core/src/semantic_pack/resolver.rs +437 -0
  263. package/domainforge-core/src/semantic_pack/review.rs +125 -0
  264. package/domainforge-core/src/semantic_pack/schema.rs +342 -0
  265. package/domainforge-core/src/semantic_pack/signing.rs +105 -0
  266. package/domainforge-core/src/semantic_pack/validator.rs +368 -0
  267. package/domainforge-core/src/semantic_version.rs +140 -0
  268. package/domainforge-core/src/test_utils.rs +12 -0
  269. package/domainforge-core/src/typescript/authority.rs +184 -0
  270. package/domainforge-core/src/typescript/error.rs +146 -0
  271. package/domainforge-core/src/typescript/formatter.rs +76 -0
  272. package/domainforge-core/src/typescript/graph.rs +391 -0
  273. package/domainforge-core/src/typescript/mod.rs +9 -0
  274. package/domainforge-core/src/typescript/policy.rs +564 -0
  275. package/domainforge-core/src/typescript/primitives.rs +784 -0
  276. package/domainforge-core/src/typescript/registry.rs +88 -0
  277. package/domainforge-core/src/typescript/semantic_pack.rs +470 -0
  278. package/domainforge-core/src/typescript/units.rs +76 -0
  279. package/domainforge-core/src/units/mod.rs +462 -0
  280. package/domainforge-core/src/uuid_module.rs +42 -0
  281. package/domainforge-core/src/validation_error.rs +818 -0
  282. package/domainforge-core/src/validation_result.rs +30 -0
  283. package/domainforge-core/src/wasm/authority.rs +192 -0
  284. package/domainforge-core/src/wasm/error.rs +145 -0
  285. package/domainforge-core/src/wasm/formatter.rs +69 -0
  286. package/domainforge-core/src/wasm/graph.rs +471 -0
  287. package/domainforge-core/src/wasm/mod.rs +16 -0
  288. package/domainforge-core/src/wasm/policy.rs +607 -0
  289. package/domainforge-core/src/wasm/primitives.rs +295 -0
  290. package/domainforge-core/src/wasm/semantic_pack.rs +471 -0
  291. package/domainforge-core/src/wasm/units.rs +62 -0
  292. package/domainforge-core/std/aws.sea +6 -0
  293. package/domainforge-core/std/core.sea +6 -0
  294. package/domainforge-core/std/http.sea +27 -0
  295. package/domainforge-core/tests/aggregation_enhanced_tests.rs +162 -0
  296. package/domainforge-core/tests/aggregation_eval_tests.rs +248 -0
  297. package/domainforge-core/tests/aggregation_integration_tests.rs +379 -0
  298. package/domainforge-core/tests/aggregation_parser_tests.rs +92 -0
  299. package/domainforge-core/tests/aggregation_tests.rs +102 -0
  300. package/domainforge-core/tests/authority_conformance_tests.rs +1173 -0
  301. package/domainforge-core/tests/calm_round_trip_tests.rs +283 -0
  302. package/domainforge-core/tests/calm_schema_validation_tests.rs +137 -0
  303. package/domainforge-core/tests/cast_operator_tests.rs +85 -0
  304. package/domainforge-core/tests/cli_binary_check.rs +37 -0
  305. package/domainforge-core/tests/cli_import_tests.rs +291 -0
  306. package/domainforge-core/tests/cli_path_traversal_tests.rs +124 -0
  307. package/domainforge-core/tests/cli_tests.rs +63 -0
  308. package/domainforge-core/tests/diagnostics_tests.rs +203 -0
  309. package/domainforge-core/tests/dimension_unit_tests.rs +80 -0
  310. package/domainforge-core/tests/entity_tests.rs +69 -0
  311. package/domainforge-core/tests/evolution_semantics_tests.rs +157 -0
  312. package/domainforge-core/tests/flow_tests.rs +78 -0
  313. package/domainforge-core/tests/flow_unit_validation_tests.rs +31 -0
  314. package/domainforge-core/tests/graph_integration_tests.rs +218 -0
  315. package/domainforge-core/tests/graph_tests.rs +626 -0
  316. package/domainforge-core/tests/import_parsing_tests.rs +23 -0
  317. package/domainforge-core/tests/instance_integration_tests.rs +98 -0
  318. package/domainforge-core/tests/instance_parsing_tests.rs +58 -0
  319. package/domainforge-core/tests/instance_tests.rs +61 -0
  320. package/domainforge-core/tests/kg_uri_encoding_tests.rs +53 -0
  321. package/domainforge-core/tests/lint_tests.rs +19 -0
  322. package/domainforge-core/tests/metric_tests.rs +143 -0
  323. package/domainforge-core/tests/module_resolution_tests.rs +100 -0
  324. package/domainforge-core/tests/namespace_registry_tests.rs +247 -0
  325. package/domainforge-core/tests/null_handling_tests.rs +26 -0
  326. package/domainforge-core/tests/parser_ast_v3.rs +53 -0
  327. package/domainforge-core/tests/parser_dimension_registry_tests.rs +20 -0
  328. package/domainforge-core/tests/parser_integration_tests.rs +294 -0
  329. package/domainforge-core/tests/parser_metadata_tests.rs +97 -0
  330. package/domainforge-core/tests/parser_resource_domain_only_graph_test.rs +21 -0
  331. package/domainforge-core/tests/parser_resource_limits_tests.rs +122 -0
  332. package/domainforge-core/tests/parser_tests.rs +512 -0
  333. package/domainforge-core/tests/pattern_semantics_tests.rs +87 -0
  334. package/domainforge-core/tests/phase_14_determinism_tests.rs +166 -0
  335. package/domainforge-core/tests/phase_15_validation_error_tests.rs +136 -0
  336. package/domainforge-core/tests/phase_16_unicode_tests.rs +248 -0
  337. package/domainforge-core/tests/phase_17_export_tests.rs +285 -0
  338. package/domainforge-core/tests/phase_17_round_trip_tests.rs +264 -0
  339. package/domainforge-core/tests/policy_tests.rs +635 -0
  340. package/domainforge-core/tests/primitives_integration_tests.rs +151 -0
  341. package/domainforge-core/tests/print_rdf_xml.rs +14 -0
  342. package/domainforge-core/tests/printer_tests.rs +204 -0
  343. package/domainforge-core/tests/profile_tests.rs +35 -0
  344. package/domainforge-core/tests/projection_contracts_tests.rs +154 -0
  345. package/domainforge-core/tests/protobuf_projection_tests.rs +199 -0
  346. package/domainforge-core/tests/quantity_tests.rs +41 -0
  347. package/domainforge-core/tests/rdf_xml_typed_literal_tests.rs +105 -0
  348. package/domainforge-core/tests/registry_schema_tests.rs +33 -0
  349. package/domainforge-core/tests/resource_tests.rs +50 -0
  350. package/domainforge-core/tests/resource_unit_tests.rs +24 -0
  351. package/domainforge-core/tests/roles_relations_tests.rs +61 -0
  352. package/domainforge-core/tests/round_trip_tests.rs +34 -0
  353. package/domainforge-core/tests/runtime_toggle_tests.rs +70 -0
  354. package/domainforge-core/tests/sbvr_fact_schema_tests.rs +60 -0
  355. package/domainforge-core/tests/sbvr_flow_facts_tests.rs +55 -0
  356. package/domainforge-core/tests/sbvr_parsing_tests.rs +53 -0
  357. package/domainforge-core/tests/semantic_pack_alias_resolution.rs +197 -0
  358. package/domainforge-core/tests/semantic_pack_build.rs +302 -0
  359. package/domainforge-core/tests/semantic_pack_consumer_smoke.rs +150 -0
  360. package/domainforge-core/tests/semantic_pack_pack_set.rs +160 -0
  361. package/domainforge-core/tests/semantic_pack_signing.rs +157 -0
  362. package/domainforge-core/tests/semantic_pack_three_valued.rs +250 -0
  363. package/domainforge-core/tests/semantic_pack_validate.rs +196 -0
  364. package/domainforge-core/tests/std_lib_tests.rs +37 -0
  365. package/domainforge-core/tests/temporal_evaluation_tests.rs +159 -0
  366. package/domainforge-core/tests/temporal_semantics_tests.rs +214 -0
  367. package/domainforge-core/tests/three_valued_quantifiers_tests.rs +164 -0
  368. package/domainforge-core/tests/turtle_entity_export_tests.rs +38 -0
  369. package/domainforge-core/tests/turtle_escaping_tests.rs +53 -0
  370. package/domainforge-core/tests/turtle_resource_export_tests.rs +34 -0
  371. package/domainforge-core/tests/type_inference_tests.rs +40 -0
  372. package/domainforge-core/tests/unicode_validation_tests.rs +169 -0
  373. package/domainforge-core/tests/unit_tests.rs +81 -0
  374. package/domainforge-core/tests/validate_tests.rs +38 -0
  375. package/domainforge-core/tests/validation_unit_mismatch_tests.rs +83 -0
  376. package/domainforge-core/tests/wasm_tests.rs +229 -0
  377. package/domainforge-python/CHANGELOG-python.md +12 -0
  378. package/domainforge-python/MIGRATING.md +24 -0
  379. package/domainforge-python/README.md +256 -0
  380. package/domainforge-python/domainforge/__init__.py +95 -0
  381. package/domainforge-python/domainforge/domainforge.pyi +519 -0
  382. package/domainforge-python/pyproject.toml +36 -0
  383. package/domainforge-typescript/CHANGELOG-typescript.md +12 -0
  384. package/domainforge-typescript/LICENSE +201 -0
  385. package/domainforge-typescript/MIGRATING.md +24 -0
  386. package/domainforge-typescript/README.md +305 -0
  387. package/domainforge-typescript/index.d.ts +452 -0
  388. package/domainforge-typescript/index.js +361 -0
  389. package/domainforge-typescript/package.json +60 -0
  390. package/example.js +61 -0
  391. package/examples/browser.html +366 -0
  392. package/examples/namespaces/finance/cashflow.sea +5 -0
  393. package/examples/namespaces/logistics/core.sea +7 -0
  394. package/examples/observability_metrics.sea +38 -0
  395. package/fixtures/semantic_packs/acme_procurement/domain/entities.sea +39 -0
  396. package/fixtures/semantic_packs/acme_procurement/domain/metrics.sea +11 -0
  397. package/fixtures/semantic_packs/acme_procurement/domain/relations.sea +7 -0
  398. package/fixtures/semantic_packs/acme_procurement/domain/resources.sea +9 -0
  399. package/fixtures/semantic_packs/acme_procurement/review/acme.procurement.semantic-review.jsonl +7 -0
  400. package/fixtures/semantic_packs/acme_procurement/tests/ambiguous_vendor_alias.sea +8 -0
  401. package/fixtures/semantic_packs/acme_procurement/tests/deprecated_vendor_alias.sea +8 -0
  402. package/fixtures/semantic_packs/acme_procurement/tests/invalid_relation.sea +3 -0
  403. package/fixtures/semantic_packs/acme_procurement/tests/proposed_concept.sea +8 -0
  404. package/fixtures/semantic_packs/acme_procurement/tests/rejected_concept.sea +8 -0
  405. package/fixtures/semantic_packs/acme_procurement/tests/unit_mismatch.sea +7 -0
  406. package/fixtures/semantic_packs/acme_procurement/tests/unknown_vendor_policy.sea +8 -0
  407. package/fixtures/semantic_packs/acme_procurement/tests/valid_purchase_policy.sea +8 -0
  408. package/index.d.ts +2 -0
  409. package/index.js +8 -0
  410. package/justfile +200 -0
  411. package/lefthook.yml +13 -0
  412. package/lib/validate_native_exports.d.ts +4 -0
  413. package/lib/validate_native_exports.js +12 -0
  414. package/package.json +22 -0
  415. package/pytest.ini +5 -0
  416. package/python/tests/test_registry.py +75 -0
  417. package/python/tests/test_units.py +18 -0
  418. package/release-please-config.json +49 -0
  419. package/requirements-dev.txt +3 -0
  420. package/requirements.txt +3 -0
  421. package/rust-toolchain.toml +3 -0
  422. package/schemas/ast-v1.schema.json +72 -0
  423. package/schemas/ast-v2.schema.json +1200 -0
  424. package/schemas/ast-v3.schema.json +1200 -0
  425. package/schemas/sea-registry.schema.json +45 -0
  426. package/scripts/build-python.sh +37 -0
  427. package/scripts/build-release.sh +279 -0
  428. package/scripts/build-typescript.sh +13 -0
  429. package/scripts/build-wasm.sh +113 -0
  430. package/scripts/bump-version.sh +245 -0
  431. package/scripts/check_unused_test_imports.py +85 -0
  432. package/scripts/ci_tasks.py +379 -0
  433. package/scripts/clear_debug_test.sh +10 -0
  434. package/scripts/create-github-release.sh +262 -0
  435. package/scripts/create-tag.sh +203 -0
  436. package/scripts/find_and_link_test_binary.sh +70 -0
  437. package/scripts/generate-changelog.sh +271 -0
  438. package/scripts/generate-release-notes.sh +205 -0
  439. package/scripts/lint_release_security.py +96 -0
  440. package/scripts/lint_release_workflows.py +82 -0
  441. package/scripts/lint_workflow_gates.py +113 -0
  442. package/scripts/optimized-wasm-build.sh +61 -0
  443. package/scripts/patch_napi_types.py +62 -0
  444. package/scripts/pre-release-check.sh +289 -0
  445. package/scripts/prepare_rust_debug.sh +52 -0
  446. package/scripts/release.sh +373 -0
  447. package/scripts/resolve_rust_binary.py +230 -0
  448. package/scripts/run_commitlint.sh +29 -0
  449. package/scripts/test-all.sh +77 -0
  450. package/scripts/update_launch_program.py +93 -0
  451. package/secrets/README.md +27 -0
  452. package/secrets/secrets.yaml +21 -0
  453. package/test_integration.py +67 -0
  454. package/tests/test_authority.py +328 -0
  455. package/tests/test_ci_tasks.py +143 -0
  456. package/tests/test_expression.py +256 -0
  457. package/tests/test_golden_payment_flow.py +42 -0
  458. package/tests/test_graph.py +127 -0
  459. package/tests/test_instance.py +136 -0
  460. package/tests/test_parser.py +82 -0
  461. package/tests/test_primitives.py +68 -0
  462. package/tests/test_role_relation_parity.py +56 -0
  463. package/tests/test_runtime_toggle.py +156 -0
  464. package/tests/test_semantic_pack.py +639 -0
  465. package/tests/test_three_valued_eval.py +159 -0
  466. package/tsconfig.json +30 -0
  467. package/typescript-tests/advanced.test.ts +165 -0
  468. package/typescript-tests/authority.test.ts +216 -0
  469. package/typescript-tests/expression.test.ts +228 -0
  470. package/typescript-tests/golden-payment-flow.test.ts +51 -0
  471. package/typescript-tests/graph.test.ts +142 -0
  472. package/typescript-tests/native-binding.test.ts +20 -0
  473. package/typescript-tests/primitives.test.ts +88 -0
  474. package/typescript-tests/registry.test.ts +122 -0
  475. package/typescript-tests/role_relation.test.ts +63 -0
  476. package/typescript-tests/runtime_toggle.test.ts +141 -0
  477. package/typescript-tests/semantic-pack.test.ts +556 -0
  478. package/typescript-tests/three_valued_eval.test.ts +135 -0
  479. package/typescript-tests/units.test.ts +36 -0
  480. package/vitest.config.ts +13 -0
  481. package/wasm_demo.html +225 -0
@@ -0,0 +1,485 @@
1
+ # SEA DSL - Python Bindings
2
+
3
+ Python bindings for the Semantic Enterprise Architecture (SEA) Domain Specific Language.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ # From source (PyPI package coming soon)
9
+ pip install maturin
10
+ git clone https://github.com/GodSpeedAI/DomainForge.git
11
+ cd DomainForge
12
+ maturin develop
13
+
14
+ # Or build wheel
15
+ maturin build --release
16
+ pip install target/wheels/domainforge-*.whl
17
+ ```
18
+
19
+ ## Quick Start
20
+
21
+ ### Creating Primitives
22
+
23
+ ```python
24
+ import domainforge
25
+
26
+ # Create entities - use new() for default namespace, new_with_namespace() for explicit
27
+ warehouse = domainforge.Entity.new("Warehouse") # Default namespace
28
+ factory = domainforge.Entity.new_with_namespace("Factory", "manufacturing")
29
+
30
+ # Namespace is always a string (not None), defaults to "default"
31
+ print(warehouse.namespace()) # "default"
32
+ print(factory.namespace()) # "manufacturing"
33
+
34
+ # Create resources
35
+ cameras = domainforge.Resource.new("Cameras", "units")
36
+
37
+ # Create flows - pass ConceptId values (clone before passing)
38
+ flow = domainforge.Flow.new(
39
+ cameras.id().clone(),
40
+ warehouse.id().clone(),
41
+ factory.id().clone(),
42
+ 100.0
43
+ )
44
+ ```
45
+
46
+ ### Building a Graph
47
+
48
+ ```python
49
+ import domainforge
50
+ from decimal import Decimal
51
+
52
+ # Create and populate a graph
53
+ graph = domainforge.Graph()
54
+
55
+ # Entities with constructor patterns
56
+ warehouse = domainforge.Entity.new("Warehouse")
57
+ factory = domainforge.Entity.new_with_namespace("Factory", "manufacturing")
58
+
59
+ # Resources with units
60
+ cameras = domainforge.Resource.new("Cameras", "units")
61
+
62
+ graph.add_entity(warehouse)
63
+ graph.add_entity(factory)
64
+ graph.add_resource(cameras)
65
+
66
+ # Flow with ConceptId clones and Decimal quantity
67
+ flow = domainforge.Flow.new(
68
+ cameras.id().clone(),
69
+ warehouse.id().clone(),
70
+ factory.id().clone(),
71
+ Decimal("100.0")
72
+ )
73
+ graph.add_flow(flow)
74
+
75
+ print(f"Graph has {graph.entity_count()} entities")
76
+ print(f"Graph has {graph.flow_count()} flows")
77
+ ```
78
+
79
+ ### Parsing DSL Source
80
+
81
+ ```python
82
+ import domainforge
83
+
84
+ # Supports multiline strings with """ syntax
85
+ source = '''
86
+ Entity "Warehouse" in logistics
87
+ Entity """Multi-line
88
+ Factory Name""" in manufacturing
89
+ Resource "Cameras" units
90
+ Flow "Cameras" from "Warehouse" to "Multi-line\nFactory Name" quantity 100
91
+ '''
92
+
93
+ graph = domainforge.Graph.parse(source)
94
+ print(f"Parsed {graph.entity_count()} entities")
95
+ print(f"Parsed {graph.flow_count()} flows")
96
+
97
+ # Query the graph
98
+ warehouse_id = graph.find_entity_by_name("Warehouse")
99
+ flows = graph.flows_from(warehouse_id)
100
+ for flow in flows:
101
+ print(f"Flow: {flow.quantity()} units")
102
+ ```
103
+
104
+ ### Working with Attributes
105
+
106
+ ```python
107
+ import domainforge
108
+
109
+ # Use new() for default namespace
110
+ entity = domainforge.Entity.new("Warehouse")
111
+ entity.set_attribute("capacity", 10000)
112
+ entity.set_attribute("location", "New York")
113
+
114
+ print(entity.get_attribute("capacity")) # 10000
115
+ print(entity.get_attribute("location")) # "New York"
116
+
117
+ # Namespace is always present (not None)
118
+ print(entity.namespace()) # "default"
119
+ ```
120
+
121
+ ### Formatting Source Code
122
+
123
+ ```python
124
+ import domainforge
125
+
126
+ # Format SEA-DSL source with default settings
127
+ source = '''Entity "Foo" in bar'''
128
+ formatted = domainforge.format_source(source)
129
+ print(formatted) # Entity "Foo" in bar
130
+
131
+ # Format with custom options
132
+ formatted = domainforge.format_source(
133
+ source,
134
+ indent_width=2,
135
+ use_tabs=False,
136
+ preserve_comments=True,
137
+ sort_imports=True
138
+ )
139
+
140
+ # Check if source is already formatted
141
+ is_formatted = domainforge.check_format(source)
142
+ print(is_formatted) # False
143
+
144
+ # Check with formatted content
145
+ is_formatted = domainforge.check_format('Entity "Foo" in bar\n')
146
+ print(is_formatted) # True
147
+ ```
148
+
149
+ ## API Reference
150
+
151
+ ### Formatter Functions
152
+
153
+ - `format_source(source, indent_width=4, use_tabs=False, preserve_comments=True, sort_imports=True)`: Format SEA-DSL source code
154
+ - `check_format(source, indent_width=4, use_tabs=False)`: Check if source is already formatted
155
+
156
+ ### Classes
157
+
158
+ - `Entity`: Represents business entities (WHO)
159
+ - `Resource`: Represents quantifiable resources (WHAT)
160
+ - `Flow`: Represents resource movement between entities
161
+ - `Instance`: Represents physical instances of resources
162
+ - `Graph`: Container with validation and query capabilities (uses IndexMap for deterministic iteration)
163
+ - `Expression`: Policy expression AST wrapper with normalization support
164
+ - `NormalizedExpression`: Canonical form of an expression with stable hashing
165
+
166
+ ### Constructor Patterns (November 2025)
167
+
168
+ **Entities:**
169
+
170
+ ```python
171
+ # Default namespace
172
+ entity = Entity.new("Warehouse") # namespace() returns "default"
173
+
174
+ # Explicit namespace
175
+ entity = Entity.new_with_namespace("Warehouse", "logistics")
176
+ ```
177
+
178
+ **Resources:**
179
+
180
+ ```python
181
+ resource = Resource.new("Cameras", "units") # Default namespace
182
+ resource = Resource.new_with_namespace("Cameras", "units", "inventory")
183
+ ```
184
+
185
+ **Flows:**
186
+
187
+ ```python
188
+ # Takes ConceptId values (not references) - clone before passing
189
+ flow = Flow.new(
190
+ resource_id.clone(),
191
+ from_id.clone(),
192
+ to_id.clone(),
193
+ Decimal("100.0")
194
+ )
195
+ ```
196
+
197
+ ### Graph Methods
198
+
199
+ - `add_entity(entity)`: Add an entity to the graph
200
+ - `add_resource(resource)`: Add a resource to the graph
201
+ - `add_flow(flow)`: Add a flow to the graph (validates references)
202
+ - `add_instance(instance)`: Add an instance to the graph
203
+ - `entity_count()`: Get number of entities
204
+ - `resource_count()`: Get number of resources
205
+ - `flow_count()`: Get number of flows
206
+ - `instance_count()`: Get number of instances
207
+ - `find_entity_by_name(name)`: Find entity ID by name
208
+ - `find_resource_by_name(name)`: Find resource ID by name
209
+ - `flows_from(entity_id)`: Get all flows from an entity
210
+ - `flows_to(entity_id)`: Get all flows to an entity
211
+ - `all_entities()`: Get all entities
212
+ - `all_resources()`: Get all resources
213
+ - `all_flows()`: Get all flows
214
+ - `all_instances()`: Get all instances
215
+ - `Graph.parse(source)`: Parse DSL source into a graph
216
+ - `Graph.parse_to_ast_json(source)`: Parse DSL source into AST JSON string
217
+ - `export_calm()`: Export graph to CALM JSON format
218
+ - `Graph.import_calm(json_str)`: Import graph from CALM JSON
219
+ - `add_policy(policy)`: Add a policy to the graph
220
+ - `add_association(owner_id, owned_id, rel_type)`: Add ownership/association relation between two entities (owner/owned)
221
+
222
+ ### Expression API (December 2025)
223
+
224
+ ```python
225
+ from domainforge import Expression, BinaryOp
226
+
227
+ # Factory methods
228
+ expr = Expression.binary(
229
+ BinaryOp.And,
230
+ Expression.variable("b"),
231
+ Expression.variable("a")
232
+ )
233
+
234
+ # Normalization
235
+ normalized = expr.normalize()
236
+ print(str(normalized)) # "(a AND b)" (commutative sorting)
237
+ print(normalized.stable_hash()) # Stable hash for caching
238
+ ```
239
+
240
+ **Breaking Changes:**
241
+
242
+ ### NamespaceRegistry (Workspace)
243
+
244
+ ```python
245
+ import domainforge
246
+
247
+ reg = domainforge.NamespaceRegistry.from_file('./.sea-registry.toml')
248
+ files = reg.resolve_files()
249
+ for binding in files:
250
+ print(binding.path, '=>', binding.namespace)
251
+
252
+ ns = reg.namespace_for('/path/to/file.sea')
253
+ print('Namespace:', ns)
254
+
255
+ # You can also pass `True` as an optional second argument to make resolution fail on ambiguity:
256
+ try:
257
+ reg.namespace_for(str('/path/to/file.sea'), True)
258
+ except Exception as e:
259
+ print('Ambiguity detected:', e)
260
+ ```
261
+
262
+ - `namespace()` now returns `str` instead of `Optional[str]` (always returns "default" if unspecified)
263
+ - Constructors split: `new()` for default namespace, `new_with_namespace()` for explicit
264
+ - `Resource.new(name, unit)` now routes through `new_with_namespace(..., "default")` so `namespace()` never returns `None` even when a namespace is not supplied
265
+ - Flow constructor takes `ConceptId` values (not references) - must clone before passing
266
+
267
+ - Multiline string support in parser: `Entity """Multi-line\nName"""`
268
+ - ValidationError helpers: `undefined_entity()`, `unit_mismatch()`, etc.
269
+ - CALM integration: `export_calm()` and `import_calm()` for architecture-as-code
270
+ - IndexMap storage ensures deterministic iteration (reproducible results)
271
+
272
+ ## Semantic Pack API
273
+
274
+ The `domainforge` module exposes semantic pack types and functions for building, validating, signing, and inspecting packs programmatically.
275
+
276
+ ### Enums
277
+
278
+ ```python
279
+ from domainforge import (
280
+ SemanticTruth, # Valid, Invalid, Unknown
281
+ DiagnosticSeverity, # Error, Warning, Info, Hint
282
+ ValidationMode, # Off, Warn, Strict
283
+ ApprovalState, # Candidate, Approved, Rejected
284
+ SignatureState, # Unsigned, Signed, InvalidSignature
285
+ ConceptStatus, # Active, Proposed, Deprecated, Rejected, ExternalOnly
286
+ ConceptKind, # Entity, Resource, Role, Flow, Policy, Metric, Dimension, Unit, External
287
+ AliasStatus, # Approved, Deprecated, Ambiguous, Blocked
288
+ UnknownConceptPolicy, # Ignore, Warning, Error
289
+ DeprecatedPolicy, # Allow, Warn, ErrorInStrict, ErrorAlways
290
+ SemanticValidationStatus, # Passed, Failed, Unknown, Blocked
291
+ )
292
+ ```
293
+
294
+ ### SemanticPack Class
295
+
296
+ ```python
297
+ pack = domainforge.SemanticPack.from_json(pack_json_string)
298
+ print(pack.pack_id()) # "acme/logistics/1.1.0"
299
+ print(pack.schema_version()) # "0.3"
300
+ print(pack.approval_state()) # ApprovalState.Approved
301
+ print(pack.signature_state()) # SignatureState.Signed
302
+ print(pack.concept_count()) # 42
303
+ print(pack.alias_count()) # 15
304
+ print(pack.meaning_version()) # "1.1.0"
305
+ print(pack.meaning_fingerprint()) # "sha256:abc..."
306
+ print(pack.pack_content_hash()) # "sha256:def..."
307
+
308
+ json_str = pack.to_json()
309
+ ```
310
+
311
+ Methods:
312
+
313
+ | Method | Return Type | Description |
314
+ |-----------------------|---------------------|----------------------------------------|
315
+ | `from_json(json)` | `SemanticPack` | Deserialize from JSON string. |
316
+ | `to_json()` | `str` | Serialize to JSON string. |
317
+ | `pack_id()` | `str` | Pack identifier. |
318
+ | `schema_version()` | `str` | Schema version. |
319
+ | `approval_state()` | `ApprovalState` | Pack approval state. |
320
+ | `signature_state()` | `SignatureState` | Pack signature state. |
321
+ | `concept_count()` | `int` | Number of concepts. |
322
+ | `alias_count()` | `int` | Number of aliases. |
323
+ | `meaning_version()` | `str` | Meaning version. |
324
+ | `meaning_fingerprint()` | `str` | Meaning fingerprint hash. |
325
+ | `pack_content_hash()` | `str` | Content hash (excluding signature). |
326
+
327
+ ### SemanticValidationResult Class
328
+
329
+ ```python
330
+ result = domainforge.SemanticValidationResult.from_json(result_json)
331
+ print(result.status()) # SemanticValidationStatus.Passed
332
+ print(result.diagnostics_json()) # JSON array of diagnostics
333
+ print(result.unsigned_fixture_bypass_used()) # False
334
+ print(result.first_approved_version_bypass_used()) # False
335
+ ```
336
+
337
+ ### Functions
338
+
339
+ #### build_semantic_pack
340
+
341
+ Build a semantic pack from input JSON. Returns a tuple of `(pack_json, error_list)`.
342
+
343
+ ```python
344
+ pack_json, errors = domainforge.build_semantic_pack(input_json)
345
+ if errors:
346
+ for err in errors:
347
+ print(err)
348
+ ```
349
+
350
+ #### validate_semantic_pack
351
+
352
+ Validate a pack's internal consistency. Returns a list of diagnostic JSON strings.
353
+
354
+ ```python
355
+ diagnostics = domainforge.validate_semantic_pack(pack_json)
356
+ for d in diagnostics:
357
+ print(d)
358
+ ```
359
+
360
+ #### validate_graph_with_pack
361
+
362
+ Validate a source file against a pack. Returns a JSON result string.
363
+
364
+ ```python
365
+ result_json = domainforge.validate_graph_with_pack(
366
+ pack_json,
367
+ "source_uri",
368
+ options_json
369
+ )
370
+ ```
371
+
372
+ #### sign_pack
373
+
374
+ Sign a pack with an Ed25519 private key. Returns the signed pack JSON.
375
+
376
+ ```python
377
+ signed_json = domainforge.sign_pack(pack_json, private_key_pem_string)
378
+ ```
379
+
380
+ #### verify_pack_signature
381
+
382
+ Verify a pack's signature. Returns `True` or `False`.
383
+
384
+ ```python
385
+ is_valid = domainforge.verify_pack_signature(pack_json, public_key_pem_string)
386
+ ```
387
+
388
+ #### diff_packs
389
+
390
+ Compare two packs. Returns a JSON diff result.
391
+
392
+ ```python
393
+ diff_json = domainforge.diff_packs(old_pack_json, new_pack_json)
394
+ ```
395
+
396
+ #### compute_pack_hash
397
+
398
+ Compute the content hash of a pack.
399
+
400
+ ```python
401
+ hash_str = domainforge.compute_pack_hash(pack_json)
402
+ ```
403
+
404
+ #### normalize_lookup_key
405
+
406
+ Normalize a term for lookup (NFC, case-fold, whitespace collapse).
407
+
408
+ ```python
409
+ normalized = domainforge.normalize_lookup_key(" Hello World ") # "hello world"
410
+ ```
411
+
412
+ #### resolve_concept
413
+
414
+ Resolve a term against a pack. Returns a JSON result with `resolved_concept_id`, `semantic_truth`, `diagnostic_code`, `message`, and `suggestions`.
415
+
416
+ ```python
417
+ result_json = domainforge.resolve_concept(
418
+ "Supplier",
419
+ pack_json,
420
+ options_json
421
+ )
422
+ ```
423
+
424
+ ## Development
425
+
426
+ ### Building from Source
427
+
428
+ ```bash
429
+ # Install maturin
430
+ pip install maturin
431
+
432
+ # Build and install in development mode
433
+ maturin develop
434
+
435
+ # Run tests
436
+ pytest
437
+ ```
438
+
439
+ ### Running Tests
440
+
441
+ ```bash
442
+ pytest tests/
443
+ ```
444
+
445
+ Quick start for tests in development (recommended):
446
+
447
+ ```bash
448
+ # Requires just
449
+ just python-setup
450
+ just python-test
451
+ ```
452
+
453
+ If you'd like to remove the local virtual environment and start fresh:
454
+
455
+ ```bash
456
+ just python-clean
457
+ ```
458
+
459
+ ### Manual Python workflow (without just)
460
+
461
+ ```bash
462
+ # Create a local virtual environment
463
+ python -m venv .venv
464
+
465
+ # Activate the environment
466
+ # Linux/macOS:
467
+ source .venv/bin/activate
468
+ # Windows (Command Prompt):
469
+ .\.venv\Scripts\activate
470
+ # Windows (PowerShell):
471
+ .\.venv\Scripts\Activate.ps1
472
+
473
+ # Install development dependencies
474
+ pip install -e . # or `pip install -r requirements-dev.txt`
475
+
476
+ # Run the Python test suite
477
+ pytest tests/
478
+
479
+ # Clean up the virtual environment when you're done
480
+ deactivate
481
+ rm -rf .venv
482
+ Apache-2.0
483
+
484
+
485
+ ```
@@ -0,0 +1,50 @@
1
+ # Workspace Registry (`.sea-registry.toml`)
2
+
3
+ Purpose: map files to namespaces so identifiers stay deterministic across a workspace.
4
+
5
+ ## File format
6
+
7
+ ```toml
8
+ version = 1
9
+ default_namespace = "default" # optional fallback
10
+
11
+ [[namespaces]]
12
+ namespace = "logistics"
13
+ patterns = ["examples/namespaces/logistics/**/*.sea"]
14
+
15
+ [[namespaces]]
16
+ namespace = "finance"
17
+ patterns = ["examples/namespaces/finance/**/*.sea"]
18
+ ```
19
+
20
+ - `version`: currently only `1` is supported.
21
+ - `default_namespace`: applied when no patterns match.
22
+ - `namespaces`: each entry declares the namespace and one or more glob `patterns` (relative to the registry file).
23
+ - Schema: `schemas/sea-registry.schema.json` (validated in tests).
24
+
25
+ ## Ambiguity handling
26
+
27
+ - If multiple patterns match a file, the **longest literal prefix** wins.
28
+ - Tie-breaker: deterministic alphabetical order.
29
+ - Prefer using `--fail-on-ambiguity` (CLI) when you want ambiguous matches to error.
30
+
31
+ ## CLI usage
32
+
33
+ ```bash
34
+ domainforge validate --registry .sea-registry.toml models/payments/payment.sea
35
+ sea graph --registry .sea-registry.toml models/**/*.sea
36
+ ```
37
+
38
+ - Without a registry, unnamed namespaces default to `"default"`.
39
+ - Combine with `--format json` for CI pipelines that need namespace-aware outputs.
40
+
41
+ ## Maintenance tips
42
+
43
+ - Keep glob patterns specific to avoid accidental overlaps.
44
+ - Regenerate or pin baselines in tests when changing registry behavior.
45
+ - Store the registry at the workspace root so relative patterns are stable.
46
+
47
+ ## See also
48
+
49
+ - [Configuration](./configuration.md) for CLI flags and env vars
50
+ - [Parse SEA Files](../how-tos/parse-sea-files.md) for parsing examples