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,110 @@
1
+ # Export to CALM
2
+
3
+ Goal: Export a SEA DSL model to FINOS CALM and verify the payload is valid.
4
+
5
+ ## Prerequisites
6
+
7
+ - SEA CLI installed (`cargo install --path domainforge-core --features cli`).
8
+ - A validated `.sea` model file with entities/resources/flows (and optional roles/relations).
9
+ - Optional: Python/TypeScript bindings for programmatic export.
10
+ - JSON tooling such as `jq` for inspection.
11
+
12
+ ## Steps (be concise)
13
+
14
+ 1. **Validate the model first (CLI)**
15
+
16
+ ```bash
17
+ domainforge validate --format human path/to/model.sea
18
+ ```
19
+
20
+ - Fails fast on syntax/semantic errors; fix these before exporting.
21
+
22
+ 2. **Export to CALM JSON (CLI)**
23
+
24
+ ```bash
25
+ domainforge project --format calm path/to/model.sea calm.json
26
+ ```
27
+
28
+ - On success, the command prints `Projected to CALM: calm.json`.
29
+ - Output includes `metadata.sea:version` set to the current SEA version (e.g., `0.1.0`).
30
+
31
+ 3. **Inspect the output**
32
+
33
+ ```bash
34
+ jq '.metadata, (.models[0].roles | length), (.models[0].relations | length)' calm.json
35
+ ```
36
+
37
+ - Confirm roles/relations/flows are present and IDs look like UUIDs.
38
+
39
+ 4. **Re-import to double-check**
40
+
41
+ ```bash
42
+ domainforge import --format kg calm.json
43
+ ```
44
+
45
+ - Uses the KG importer to ensure the CALM payload can be transformed back into a graph.
46
+
47
+ 5. **Export programmatically in Python**
48
+
49
+ ```python
50
+ from domainforge import Graph
51
+
52
+ with open("path/to/model.sea") as f:
53
+ graph = Graph.parse(f.read())
54
+
55
+ calm_json = graph.export_calm()
56
+
57
+ with open("calm.json", "w") as f:
58
+ f.write(calm_json)
59
+ ```
60
+
61
+ 6. **Export programmatically in TypeScript**
62
+
63
+ ```ts
64
+ import { Graph } from "@godspeedai/domainforge";
65
+ import { readFileSync, writeFileSync } from "fs";
66
+
67
+ const graph = Graph.parse(readFileSync("path/to/model.sea", "utf8"));
68
+ const calm = graph.exportCalm();
69
+ writeFileSync("calm.json", calm);
70
+ ```
71
+
72
+ 7. **Validate against the CALM schema (optional)**
73
+
74
+ ```bash
75
+ ajv validate -s calm.schema.json -d calm.json
76
+ ```
77
+
78
+ - Use the FINOS Architecture-as-Code schema for strict validation if a downstream system requires it.
79
+
80
+ ## Mapping Notes
81
+
82
+ - Roles and relations emit as typed facts; verify `subjectRole`, `predicate`, and `objectRole` fields reference valid role IDs.
83
+ - Instances and resource quantities retain their units; ensure custom units are defined before export to avoid validation failures.
84
+ - Namespaces: unset namespaces default to `"default"` and may be omitted in the CALM output.
85
+ - Metadata includes `sea:exported`, `sea:version`, and `sea:timestamp`; keep them for traceability.
86
+
87
+ ## Validation Tips
88
+
89
+ - Use `jq` to spot-check key sections (roles, relations, flows) and ensure UUIDs are present.
90
+ - If a relation references a flow ID, confirm the flow exists and carries a valid UUID; missing IDs cause export failures.
91
+ - For large models, prefer `domainforge project --format calm input.sea | gzip > calm.json.gz` to stream-compress during export (portable across Bourne-like shells and Windows with compatible tools).
92
+
93
+ ## Troubleshooting
94
+
95
+ - **Parse errors**: Run `domainforge validate` before exporting; export stops on parse failure.
96
+ - **Missing roles/relations**: Ensure they are declared in the DSL; empty arrays in CALM indicate nothing was declared.
97
+ - **Schema validation failures**: Align with the official CALM schema and update your DSL model to supply required fields (e.g., `id`, `name`).
98
+ - **Version drift**: If consumers require a specific SEA version, check `metadata["sea:version"]` and consider pinning the toolchain.
99
+
100
+ ## Verification Checklist
101
+
102
+ - [ ] `domainforge validate` passes on the source `.sea` file.
103
+ - [ ] `domainforge project --format calm` succeeds and outputs metadata with `sea:version`.
104
+ - [ ] CALM payload re-imports through `domainforge import --format kg` without losing entities/resources/roles/relations.
105
+ - [ ] Optional schema validation (AJV) passes when required by downstream systems.
106
+
107
+ ## Links
108
+
109
+ - Tutorials: [Getting Started](../tutorials/getting-started.md)
110
+ - Reference: [CALM Mapping](../reference/calm-mapping.md), [CLI Commands](../reference/cli-commands.md), [Primitives API](../reference/primitives-api.md)
@@ -0,0 +1,312 @@
1
+ # Export to Protobuf
2
+
3
+ This guide explains how to export SEA models to Protocol Buffers (`.proto`) files for use with gRPC services, binary serialization, and cross-language contracts.
4
+
5
+ ## Prerequisites
6
+
7
+ - `sea` CLI installed ([install guide](./install-cli.md))
8
+ - A valid `.sea` model file
9
+
10
+ ## Quick Start
11
+
12
+ Export an entity model to a `.proto` file:
13
+
14
+ ```bash
15
+ domainforge project --format protobuf model.sea output.proto
16
+ ```
17
+
18
+ This generates a complete `.proto` file with:
19
+
20
+ - All entities as Protobuf messages
21
+ - All resources as Protobuf messages
22
+ - Type mappings from SEA types to proto types
23
+ - Metadata header with generation timestamp
24
+
25
+ ## Example
26
+
27
+ Given a SEA model (`payment.sea`):
28
+
29
+ ```sea
30
+ Namespace "com.example.payments"
31
+
32
+ Entity "Customer" {
33
+ name: String
34
+ email: String
35
+ balance: Money
36
+ }
37
+
38
+ Entity "Payment" {
39
+ amount: Money
40
+ status: String
41
+ timestamp: DateTime
42
+ }
43
+
44
+ Resource "PaymentRequest" USD
45
+ ```
46
+
47
+ Running:
48
+
49
+ ```bash
50
+ domainforge project --format protobuf payment.sea payment.proto
51
+ ```
52
+
53
+ Produces:
54
+
55
+ ```protobuf
56
+ // Generated by SEA Projection Framework
57
+ // Projection: protobuf
58
+ // Source Namespace: com.example.payments
59
+ // Generated At: 2025-12-14T20:00:00Z
60
+ // DO NOT EDIT - This file is auto-generated
61
+
62
+ syntax = "proto3";
63
+
64
+ package com.example.payments;
65
+
66
+ option java_package = "com.example.payments";
67
+ option java_multiple_files = true;
68
+ option go_package = "github.com/example/payments";
69
+
70
+ import "google/protobuf/timestamp.proto";
71
+
72
+ message Customer {
73
+ string balance = 1;
74
+ string email = 2;
75
+ string name = 3;
76
+ }
77
+
78
+ message Payment {
79
+ string amount = 1;
80
+ string status = 2;
81
+ google.protobuf.Timestamp timestamp = 3;
82
+ }
83
+
84
+ message PaymentRequest {
85
+ string id = 1;
86
+ double value = 2;
87
+ string unit = 3;
88
+ }
89
+ ```
90
+
91
+ ## Options
92
+
93
+ ### Include gRPC Services
94
+
95
+ Generate gRPC service definitions from Flow patterns:
96
+
97
+ ```bash
98
+ domainforge project --format protobuf --include-services model.sea output.proto
99
+ ```
100
+
101
+ This converts SEA Flows into gRPC RPC methods:
102
+
103
+ | SEA Construct | gRPC Output |
104
+ | ----------------------- | ---------------------- |
105
+ | Flow destination entity | Service name |
106
+ | Flow name | RPC method name |
107
+ | Flow resource | Request/Response types |
108
+
109
+ ### Multi-File Output
110
+
111
+ Split output by namespace for large models:
112
+
113
+ ```bash
114
+ domainforge project --format protobuf --multi-file --output-dir ./proto model.sea
115
+ ```
116
+
117
+ This creates a directory structure:
118
+
119
+ ```
120
+ proto/
121
+ ├── common/
122
+ │ └── common.proto
123
+ ├── payments/
124
+ │ └── payments.proto
125
+ └── customers/
126
+ └── customers.proto
127
+ ```
128
+
129
+ ### Specify Package Name
130
+
131
+ Override the default package:
132
+
133
+ ```bash
134
+ domainforge project --format protobuf --package "org.example.api" model.sea output.proto
135
+ ```
136
+
137
+ ### Language-Specific Options
138
+
139
+ Set language-specific proto options:
140
+
141
+ ```bash
142
+ domainforge project --format protobuf \
143
+ --option java_package="com.example.api" \
144
+ --option go_package="github.com/example/api" \
145
+ --option java_multiple_files=true \
146
+ model.sea output.proto
147
+ ```
148
+
149
+ ## Type Mapping
150
+
151
+ SEA types are mapped to Protobuf types as follows:
152
+
153
+ | SEA Type | Protobuf Type |
154
+ | ---------------- | --------------------------- |
155
+ | `String` | `string` |
156
+ | `Int` | `int64` |
157
+ | `Float` | `double` |
158
+ | `Bool` | `bool` |
159
+ | `Date` | `google.protobuf.Timestamp` |
160
+ | `DateTime` | `google.protobuf.Timestamp` |
161
+ | `Duration` | `google.protobuf.Duration` |
162
+ | `UUID` | `string` |
163
+ | `Money` | Custom `Money` message |
164
+ | `List<T>` | `repeated T` |
165
+ | `Optional<T>` | `optional T` |
166
+ | Entity reference | Message reference |
167
+
168
+ ## Buf.build Integration
169
+
170
+ If `buf` CLI is installed, use it for linting and validation:
171
+
172
+ ```bash
173
+ # Lint generated protos
174
+ domainforge project --format protobuf --buf-lint model.sea output.proto
175
+
176
+ # Check breaking changes
177
+ domainforge project --format protobuf --buf-breaking --against ./previous model.sea output.proto
178
+ ```
179
+
180
+ If `buf` is not installed, these flags emit a warning and continue.
181
+
182
+ ## Programmatic Usage
183
+
184
+ ### Rust
185
+
186
+ ```rust
187
+ use domainforge_core::parser::parse_source;
188
+ use domainforge_core::parser::ast::ast_to_graph;
189
+ use domainforge_core::projection::protobuf::ProtobufEngine;
190
+
191
+ let source = std::fs::read_to_string("model.sea")?;
192
+ let ast = parse_source(&source)?;
193
+ let graph = ast_to_graph(&ast)?;
194
+
195
+ let proto_file = ProtobufEngine::project(&graph, "my_namespace", "com.example");
196
+ println!("{}", proto_file.to_proto_string());
197
+ ```
198
+
199
+ ### Python
200
+
201
+ ```python
202
+ from domainforge_core import parse_source, ast_to_graph
203
+ from domainforge_core.projection import protobuf_engine
204
+
205
+ source = open("model.sea").read()
206
+ ast = parse_source(source)
207
+ graph = ast_to_graph(ast)
208
+
209
+ proto = protobuf_engine.project(graph, "my_namespace", "com.example")
210
+ print(proto.to_proto_string())
211
+ ```
212
+
213
+ ### TypeScript
214
+
215
+ ```typescript
216
+ import { parseSource, astToGraph } from "domainforge-core";
217
+ import { ProtobufEngine } from "domainforge-core/projection";
218
+
219
+ const source = fs.readFileSync("model.sea", "utf-8");
220
+ const ast = parseSource(source);
221
+ const graph = astToGraph(ast);
222
+
223
+ const protoFile = ProtobufEngine.project(graph, "my_namespace", "com.example");
224
+ console.log(protoFile.toProtoString());
225
+ ```
226
+
227
+ ## Compatibility Checking
228
+
229
+ The engine supports schema compatibility checking to prevent breaking changes:
230
+
231
+ ### Compatibility Modes
232
+
233
+ | Mode | Allowed Changes |
234
+ | ---------- | ----------------------------------------- |
235
+ | `Additive` | Only additions (new fields/messages) |
236
+ | `Backward` | Additions + safe removals (with reserved) |
237
+ | `Breaking` | Any changes allowed |
238
+
239
+ ### CLI Usage
240
+
241
+ ```bash
242
+ # Check compatibility against previous version
243
+ domainforge project --format protobuf --compatibility additive \
244
+ --against ./previous/output.proto \
245
+ model.sea output.proto
246
+ ```
247
+
248
+ ## gRPC Streaming
249
+
250
+ SEA Flows can specify streaming mode for gRPC:
251
+
252
+ ```sea
253
+ // Unary (default)
254
+ Flow from Client to Server of Request
255
+
256
+ // Server streaming
257
+ Flow @streaming from Client to Server of EventStream
258
+
259
+ // Client streaming
260
+ Flow @client_streaming from Client to Server of DataChunks
261
+
262
+ // Bidirectional
263
+ Flow @bidirectional from Client to Server of ChatMessage
264
+ ```
265
+
266
+ Generated proto:
267
+
268
+ ```protobuf
269
+ service ServerService {
270
+ rpc ProcessRequest(Request) returns (RequestResponse);
271
+ rpc StreamEvents(EventStreamRequest) returns (stream EventStream);
272
+ rpc UploadChunks(stream DataChunks) returns (DataChunksResponse);
273
+ rpc Chat(stream ChatMessage) returns (stream ChatMessage);
274
+ }
275
+ ```
276
+
277
+ ## Troubleshooting
278
+
279
+ ### Missing Well-Known Types
280
+
281
+ If you see errors about missing `google.protobuf.*` types:
282
+
283
+ 1. Ensure your protoc includes path has the Google WKT:
284
+
285
+ ```bash
286
+ protoc -I /usr/include -I . --go_out=. output.proto
287
+ ```
288
+
289
+ 2. Or install the WKT package for your language.
290
+
291
+ ### Field Number Stability
292
+
293
+ Field numbers are assigned deterministically by alphabetical order of field names. To maintain backward compatibility:
294
+
295
+ - Don't rename fields
296
+ - Don't remove fields without using `reserved`
297
+ - Add new fields at the end (they'll get higher numbers)
298
+
299
+ ### Import Errors
300
+
301
+ For multi-file output, ensure your import paths match the generated structure:
302
+
303
+ ```bash
304
+ protoc -I ./proto --go_out=. proto/**/*.proto
305
+ ```
306
+
307
+ ## See Also
308
+
309
+ - [SDS-001: Protobuf Projection Engine](../specs/SDS-001-protobuf-projection-engine.md) - System design spec
310
+ - [ADR-003: Protobuf as Projection Target](../specs/ADR-003-protobuf-projection-target.md) - Architecture decision
311
+ - [Protobuf Advanced Features Plan](../plans/protobuf_advanced_features_plan.md) - Roadmap
312
+ - [CLI Commands Reference](../reference/cli-commands.md) - All CLI options
@@ -0,0 +1,133 @@
1
+ # Extend Grammar
2
+
3
+ Goal: Extend the SEA grammar in `domainforge-core/grammar/sea.pest`, update the parser/AST, and refresh tests across languages.
4
+
5
+ ## Prerequisites
6
+
7
+ - Rust toolchain with `cargo` and `just` available.
8
+ - Familiarity with Pest grammar syntax and the existing rules in `domainforge-core/grammar/sea.pest`.
9
+ - Ability to run Rust/Python/TypeScript tests (`just all-tests`) to ensure binding parity.
10
+
11
+ ## Steps (be concise)
12
+
13
+ 1. **Plan the syntax change**
14
+
15
+ - Identify the new construct (e.g., `Constraint`, `Annotation`).
16
+ - Decide whether it is a statement, expression, or modifier of existing rules.
17
+ - Sketch the EBNF and how it should appear in AST structs.
18
+
19
+ 2. **Update the grammar**
20
+
21
+ ```bash
22
+ sed -n '1,160p' domainforge-core/grammar/sea.pest # review nearby rules
23
+ ```
24
+
25
+ - Add or modify rules using Pest syntax. Prefer `silent` rules (`_`) for whitespace handling.
26
+ - Keep tokens unambiguous; if you add keywords, update `identifier` to prevent collisions.
27
+
28
+ 3. **Regenerate parser expectations**
29
+
30
+ - If the change affects parsing order, adjust combinators in `domainforge-core/src/parser.rs` or helpers in `domainforge-core/src/ast.rs`.
31
+ - Update AST types to include new fields (e.g., add `Annotation` struct) and ensure `FromStr` implementations parse them.
32
+
33
+ 4. **Propagate to projections**
34
+
35
+ - **CALM/KG/SBVR**: Update projectors (`domainforge-core/src/calm/mod.rs`, `domainforge-core/src/kg.rs`, `domainforge-core/src/sbvr.rs`) so the new construct is emitted.
36
+ - **Validation**: Add semantic checks in `domainforge-core/src/validator.rs` to keep error reporting meaningful.
37
+
38
+ 5. **Expose through bindings**
39
+
40
+ - Python: Add new fields/classes in `domainforge-core/src/python/primitives.rs` and wire them into `domainforge-core/src/python/lib.rs` or `graph.rs` if they are part of the `Graph` API.
41
+ - TypeScript: Mirror changes in `domainforge-core/src/typescript/primitives.rs` and adjust `domainforge-core/src/typescript/index.d.ts` typing.
42
+ - WASM: Update `domainforge-core/src/wasm/mod.rs` (or `domainforge-core/src/wasm/lib.rs`) exports to expose the new types if browser consumers need the feature.
43
+
44
+ 6. **Add parser tests (Rust)**
45
+
46
+ ```bash
47
+ cargo test -p domainforge-core parser_tests -- --nocapture
48
+ ```
49
+
50
+ - Create or edit fixtures under `domainforge-core/tests/` or `domainforge-core/examples/` to cover the new syntax and failure cases.
51
+ - Add golden tests if the construct affects export formats.
52
+
53
+ 7. **Add binding tests (Python + TypeScript)**
54
+
55
+ - Python: write a `tests/test_<feature>.py` that parses the DSL snippet and asserts field values.
56
+ - TypeScript: add a Vitest case under `typescript-tests/` that mirrors the Python assertion to maintain parity.
57
+
58
+ 8. **Run cross-language suites**
59
+
60
+ ```bash
61
+ just rust-test
62
+ just python-test
63
+ just ts-test
64
+ ```
65
+
66
+ - Use `just all-tests` to run everything sequentially before committing.
67
+
68
+ 9. **Document the new syntax**
69
+
70
+ - Update `docs/new_docs/reference/grammar-spec.md` with the new rule and an example.
71
+ - Add a short section to the relevant how-to or tutorial to show usage.
72
+
73
+ ## Cross-Bindings and Snapshots
74
+
75
+ - Keep serialized forms stable; if the new construct appears in CALM, adjust mapping tables and fixtures.
76
+ - Update `index.d.ts` and Python type hints to match the Rust structs so auto-completion remains accurate.
77
+ - Regenerate any snapshot tests that capture textual output (e.g., KG/Turtle strings) after confirming the change is intentional.
78
+
79
+ ## Spec and Example Tests
80
+
81
+ - Write minimal DSL examples that highlight the new rule with and without namespaces.
82
+ - Add negative tests for malformed input to ensure errors are descriptive (use error codes from `validation_error.rs`).
83
+ - If the rule impacts policies, add evaluation tests in `domainforge-core/src/policy` or binding-specific test suites.
84
+
85
+ ## Common Pitfalls / Troubleshooting
86
+
87
+ - Forgetting to update one binding often leads to runtime errors (`AttributeError` in Python, `undefined` in TS). Keep a checklist per language.
88
+ - Grammar precedence issues: if a new rule causes existing tests to fail, inspect operator precedence and adjust via Pest ordering or explicit `_` separators.
89
+ - When changing keywords, ensure backwards compatibility or document the breaking change with a migration note.
90
+
91
+ ## Links
92
+
93
+ - Tutorials: [Extend Grammar Walkthrough](../tutorials/getting-started.md)
94
+ - Reference: [Grammar Spec](../reference/grammar-spec.md), [Primitives API](../reference/primitives-api.md), [Cross-Language Binding Strategy](../explanations/cross-language-binding-strategy.md)
95
+
96
+ ## Verification Checklist
97
+
98
+ - [ ] Parser accepts the new syntax (Rust tests passing).
99
+ - [ ] CALM/KG/SBVR exports reflect the construct without dropping fields.
100
+ - [ ] Python and TypeScript bindings expose the new fields with the same naming.
101
+ - [ ] Documentation updated (how-to + grammar spec) with a runnable example.
102
+ - [ ] Version bumped or changelog entry added if the change is user-visible.
103
+
104
+ ## Example Workflow (adding a `Note` keyword)
105
+
106
+ 1. Add grammar rule:
107
+
108
+ ```pest
109
+ note = { "Note" ~ string }
110
+ statement = { role_decl | relation_decl | note | flow_decl | resource_decl | entity_decl }
111
+ ```
112
+
113
+ 2. Update AST:
114
+
115
+ ```rust
116
+ pub struct Note { pub text: String }
117
+ ```
118
+
119
+ 3. Wire projection:
120
+
121
+ - CALM: add `notes` array under model metadata.
122
+ - KG: emit as annotation triples.
123
+
124
+ 4. Add tests:
125
+
126
+ - Rust: `tests/note_tests.rs` covering parse success/failure.
127
+ - Python: assert `graph.notes()[0].text == "Payment delayed"`.
128
+ - TypeScript: similar Vitest assertion.
129
+
130
+ 5. Document:
131
+
132
+ - Add a snippet to `grammar-spec.md` and this how-to.
133
+ - Mention migration steps if the keyword conflicts with existing identifiers.
@@ -0,0 +1,106 @@
1
+ # Generate RDF/Turtle
2
+
3
+ Goal: Output SEA models as RDF/Turtle (or RDF/XML) for knowledge graph pipelines and validate them before loading into a triple store.
4
+
5
+ ## Prerequisites
6
+
7
+ - SEA CLI installed with `cli` feature.
8
+ - Rust toolchain and optional SHACL feature if you need RDF/XML import validation (`cargo test -p domainforge-core --features "cli shacl"`).
9
+ - Optional bindings: Python/TypeScript packages built locally for programmatic export.
10
+ - A `.sea` file (e.g., `domainforge-core/examples/basic.sea`).
11
+
12
+ ## Steps (be concise)
13
+
14
+ 1. **Export to Turtle using the CLI**
15
+
16
+ ```bash
17
+ domainforge project --format kg domainforge-core/examples/basic.sea /tmp/basic.ttl
18
+ ```
19
+
20
+ - The `project` command parses the DSL, builds a graph, and writes Turtle by default.
21
+ - The CLI prints `Projected to KG: /tmp/basic.ttl` on success.
22
+
23
+ 2. **Export to RDF/XML instead of Turtle**
24
+
25
+ ```bash
26
+ domainforge project --format kg domainforge-core/examples/basic.sea /tmp/basic.rdf
27
+ ```
28
+
29
+ - The exporter inspects the output extension; `.rdf` or `.xml` triggers RDF/XML formatting.
30
+
31
+ 3. **Export programmatically in Rust**
32
+
33
+ ```rust
34
+ use domainforge_core::{KnowledgeGraph, parser::parse_to_graph};
35
+
36
+ let source = std::fs::read_to_string("domainforge-core/examples/basic.sea")?;
37
+ let graph = parse_to_graph(&source)?;
38
+ let kg = KnowledgeGraph::from_graph(&graph)?;
39
+ let turtle = kg.to_turtle();
40
+ std::fs::write("/tmp/basic.ttl", turtle)?;
41
+ ```
42
+
43
+ - Use `kg.to_rdf_xml()` if you need XML output for SHACL validators.
44
+
45
+ 4. **Export programmatically in Python**
46
+
47
+ ```python
48
+ from domainforge import Graph
49
+ import json
50
+
51
+ graph = Graph.parse(open("domainforge-core/examples/basic.sea").read())
52
+ calm = graph.export_calm()
53
+ print("CALM length", len(calm))
54
+ # Convert to Turtle via the CLI or call Rust from Python if you need KG directly
55
+ ```
56
+
57
+ - Python bindings expose CALM export; convert CALM to Turtle using the CLI (`domainforge import --format kg /tmp/basic.calm.json`) if you need a one-liner.
58
+
59
+ 5. **Export programmatically in TypeScript**
60
+
61
+ ```ts
62
+ import { Graph } from "@godspeedai/domainforge";
63
+ import { writeFileSync } from "fs";
64
+
65
+ const graph = Graph.parse(require("fs").readFileSync("domainforge-core/examples/basic.sea", "utf8"));
66
+ const calm = graph.exportCalm();
67
+ writeFileSync("/tmp/basic.calm.json", calm);
68
+ ```
69
+
70
+ - Feed the CALM output to the CLI or a Rust helper to generate Turtle. Direct KG export is currently provided by the Rust core.
71
+
72
+ 6. **Validate the Turtle with SHACL (optional)**
73
+
74
+ ```bash
75
+ domainforge validate-kg --file /tmp/basic.ttl
76
+ ```
77
+
78
+ - Requires building with `--features shacl`. Validation fails if the KG violates the SEA SHACL shapes.
79
+
80
+ 7. **Load into a triple store**
81
+
82
+ - Use `riot --validate /tmp/basic.ttl` (Apache Jena) to check syntax.
83
+ - Load into GraphDB or Blazegraph with the namespace you expect; Turtle output uses CURIE prefixes derived from namespaces in the source DSL.
84
+
85
+ ## Metadata and Namespaces
86
+
87
+ - Default namespace resolves from `.sea-registry.toml` if present. If you do not set one, resources/entities use the `default` namespace prefix.
88
+ - Custom prefixes appear in the Turtle header. Use consistent namespace configuration to avoid collisions when merging multiple models.
89
+ - CALM metadata fields (`sea:version`, `sea:timestamp`) are not embedded directly in Turtle; store them alongside the graph in your catalog.
90
+
91
+ ## Post-processing and Validation Tips
92
+
93
+ - **Minify or canonicalize**: Run `riot --out=N-TRIPLE /tmp/basic.ttl` to flatten prefixes for diff-friendly output.
94
+ - **SHACL diagnostics**: When `domainforge validate-kg` fails, inspect the error for the offending triple and fix the originating DSL element (often a missing role or flow ID).
95
+ - **Round-trip**: Convert DSL → Turtle → Import (`domainforge import --format kg`) → Export CALM to ensure no information loss before loading to production stores.
96
+
97
+ ## Common Pitfalls / Troubleshooting
98
+
99
+ - Missing namespaces lead to verbose IRIs; define them in the registry to keep triples stable.
100
+ - Ensure flows have UUIDs; the KG exporter relies on deterministic IDs for edges.
101
+ - If you see `Failed to convert to Knowledge Graph`, re-run `domainforge validate` first—semantic errors in the DSL often surface during KG projection.
102
+
103
+ ## Links
104
+
105
+ - Tutorials: [Getting Started](../tutorials/getting-started.md)
106
+ - Reference: [CALM Mapping](../reference/calm-mapping.md), [CLI Commands](../reference/cli-commands.md), [Grammar Spec](../reference/grammar-spec.md)