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,597 @@
1
+ # Protobuf Advanced Features Implementation Plan
2
+
3
+ This plan covers the implementation of advanced Protobuf projection features for `domainforge-core`.
4
+
5
+ ## Overview
6
+
7
+ | Feature | Priority | Effort | Dependencies |
8
+ | ------------------------------------------- | -------- | ------ | -------------- |
9
+ | gRPC Service Definitions from Flow Patterns | HIGH | Medium | Flow primitive |
10
+ | Protobuf Well-Known Types | HIGH | Low | None |
11
+ | Custom Proto Options | MEDIUM | Low | None |
12
+ | Buf.build Integration | MEDIUM | Medium | External CLI |
13
+ | Multiple File Output per Namespace | LOW | Medium | None |
14
+
15
+ ---
16
+
17
+ ## Phase 1: Protobuf Well-Known Types
18
+
19
+ > [!IMPORTANT]
20
+ > This is the easiest win and should be done first as it improves type fidelity.
21
+
22
+ ### Goal
23
+
24
+ Map SEA types to Google's well-known types (WKT) for better interoperability.
25
+
26
+ ### Changes
27
+
28
+ #### [MODIFY] [protobuf.rs](file:///home/sprime01/projects/domainforge/domainforge-core/src/projection/protobuf.rs)
29
+
30
+ 1. **Add WKT imports automatically**:
31
+
32
+ ```rust
33
+ impl ProtoFile {
34
+ pub fn add_wkt_imports(&mut self) {
35
+ let wkt_imports = [
36
+ "google/protobuf/timestamp.proto",
37
+ "google/protobuf/duration.proto",
38
+ "google/protobuf/any.proto",
39
+ "google/protobuf/wrappers.proto",
40
+ ];
41
+ // Add only imports that are actually used
42
+ }
43
+ }
44
+ ```
45
+
46
+ 2. **Extend `map_sea_type_to_proto()`**:
47
+
48
+ ```rust
49
+ pub fn map_sea_type_to_proto(sea_type: &str) -> ProtoType {
50
+ match sea_type.to_lowercase().as_str() {
51
+ // Existing mappings...
52
+ "timestamp" | "datetime" => ProtoType::Message("google.protobuf.Timestamp".to_string()),
53
+ "duration" | "timespan" => ProtoType::Message("google.protobuf.Duration".to_string()),
54
+ "any" | "dynamic" => ProtoType::Message("google.protobuf.Any".to_string()),
55
+ "optional_int" => ProtoType::Message("google.protobuf.Int64Value".to_string()),
56
+ "optional_string" => ProtoType::Message("google.protobuf.StringValue".to_string()),
57
+ // ...
58
+ }
59
+ }
60
+ ```
61
+
62
+ 3. **Add `WellKnownType` enum**:
63
+ ```rust
64
+ pub enum WellKnownType {
65
+ Timestamp,
66
+ Duration,
67
+ Any,
68
+ Struct,
69
+ Value,
70
+ ListValue,
71
+ Int32Value, Int64Value, UInt32Value, UInt64Value,
72
+ FloatValue, DoubleValue, BoolValue, StringValue, BytesValue,
73
+ }
74
+ ```
75
+
76
+ ### Tests
77
+
78
+ - Test timestamp field generates correct import
79
+ - Test duration field generates correct import
80
+ - Test multiple WKT fields consolidate imports
81
+
82
+ ---
83
+
84
+ ## Phase 2: gRPC Service Definitions from Flow Patterns
85
+
86
+ > [!IMPORTANT]
87
+ > This is the most impactful feature, enabling RPC generation from semantic flows.
88
+
89
+ ### Goal
90
+
91
+ Generate gRPC service definitions from SEA Flow patterns, where:
92
+
93
+ - **Flow.from** → Request message source
94
+ - **Flow.to** → Response message destination
95
+ - **Flow.resource** → Request/Response payload type
96
+
97
+ ### Semantic Mapping
98
+
99
+ | SEA Concept | gRPC Concept |
100
+ | ------------------------- | ------------------------ |
101
+ | Entity (service provider) | Service |
102
+ | Flow (from → to) | RPC method |
103
+ | Flow's Resource | Request/Response message |
104
+ | Flow direction | Unary/Streaming |
105
+
106
+ ### New IR Types
107
+
108
+ #### [MODIFY] [protobuf.rs](file:///home/sprime01/projects/domainforge/domainforge-core/src/projection/protobuf.rs)
109
+
110
+ ```rust
111
+ /// Represents a gRPC service definition.
112
+ #[derive(Debug, Clone, Serialize, Deserialize)]
113
+ pub struct ProtoService {
114
+ /// Service name (e.g., "PaymentService")
115
+ pub name: String,
116
+ /// RPC methods
117
+ pub methods: Vec<ProtoRpcMethod>,
118
+ /// Documentation comments
119
+ pub comments: Vec<String>,
120
+ }
121
+
122
+ /// Represents an RPC method definition.
123
+ #[derive(Debug, Clone, Serialize, Deserialize)]
124
+ pub struct ProtoRpcMethod {
125
+ /// Method name (e.g., "ProcessPayment")
126
+ pub name: String,
127
+ /// Request message type
128
+ pub request_type: String,
129
+ /// Response message type
130
+ pub response_type: String,
131
+ /// Whether request is streaming
132
+ pub client_streaming: bool,
133
+ /// Whether response is streaming
134
+ pub server_streaming: bool,
135
+ /// Documentation comments
136
+ pub comments: Vec<String>,
137
+ }
138
+ ```
139
+
140
+ ### Engine Extension
141
+
142
+ ```rust
143
+ impl ProtobufEngine {
144
+ /// Generate services from Flows.
145
+ ///
146
+ /// Groups flows by their destination entity (service provider)
147
+ /// and creates RPC methods for each flow.
148
+ pub fn flows_to_services(graph: &Graph) -> Vec<ProtoService> {
149
+ let mut services: BTreeMap<String, ProtoService> = BTreeMap::new();
150
+
151
+ for flow in graph.all_flows() {
152
+ let to_entity = graph.get_entity(flow.to_id());
153
+ let service_name = format!("{}Service", to_pascal_case(to_entity.name()));
154
+
155
+ // Create RPC method from flow
156
+ let method = ProtoRpcMethod {
157
+ name: derive_method_name(flow),
158
+ request_type: derive_request_type(flow, graph),
159
+ response_type: derive_response_type(flow, graph),
160
+ client_streaming: false,
161
+ server_streaming: false,
162
+ comments: vec![],
163
+ };
164
+
165
+ services.entry(service_name).or_insert_with(|| ProtoService::new(service_name))
166
+ .methods.push(method);
167
+ }
168
+
169
+ services.into_values().collect()
170
+ }
171
+ }
172
+ ```
173
+
174
+ ### Example Transformation
175
+
176
+ **SEA Input:**
177
+
178
+ ```sea
179
+ Entity "Customer"
180
+ Entity "PaymentProcessor"
181
+ Resource "PaymentRequest" USD
182
+
183
+ Flow from Customer to PaymentProcessor of PaymentRequest
184
+ ```
185
+
186
+ **Generated `.proto`:**
187
+
188
+ ```protobuf
189
+ service PaymentProcessorService {
190
+ rpc ProcessPaymentRequest(PaymentRequest) returns (PaymentRequestResponse);
191
+ }
192
+
193
+ message PaymentRequest {
194
+ string id = 1;
195
+ // ...
196
+ }
197
+
198
+ message PaymentRequestResponse {
199
+ bool success = 1;
200
+ string transaction_id = 2;
201
+ }
202
+ ```
203
+
204
+ ### CLI Flag
205
+
206
+ ```bash
207
+ domainforge project --format protobuf --include-services model.sea output.proto
208
+ ```
209
+
210
+ ### Tests
211
+
212
+ - Test single flow generates single service with one method
213
+ - Test multiple flows to same entity grouped into one service
214
+ - Test flow attributes become method options
215
+
216
+ ---
217
+
218
+ ## Phase 3: Custom Proto Options
219
+
220
+ ### Goal
221
+
222
+ Allow users to specify custom proto options via SEA projections or attributes.
223
+
224
+ ### Grammar Extension
225
+
226
+ #### [MODIFY] [sea.pest](file:///home/sprime01/projects/domainforge/domainforge-core/grammar/sea.pest)
227
+
228
+ ```pest
229
+ proto_option = {
230
+ "option" ~ proto_option_name ~ "=" ~ proto_option_value
231
+ }
232
+
233
+ proto_option_name = { identifier ~ ("." ~ identifier)* }
234
+ proto_option_value = { string_literal | number | boolean_literal }
235
+ ```
236
+
237
+ ### IR Extension
238
+
239
+ ```rust
240
+ /// Custom proto option
241
+ #[derive(Debug, Clone, Serialize, Deserialize)]
242
+ pub struct ProtoCustomOption {
243
+ /// Full option name (e.g., "java_package" or "(myopt).foo")
244
+ pub name: String,
245
+ /// Option value
246
+ pub value: ProtoOptionValue,
247
+ }
248
+
249
+ #[derive(Debug, Clone, Serialize, Deserialize)]
250
+ pub enum ProtoOptionValue {
251
+ String(String),
252
+ Number(f64),
253
+ Bool(bool),
254
+ }
255
+ ```
256
+
257
+ ### Usage in SEA
258
+
259
+ ```sea
260
+ Projection "api" for protobuf {
261
+ @option java_package = "com.example.api"
262
+ @option java_multiple_files = true
263
+ @option go_package = "github.com/example/api"
264
+
265
+ Entity "Customer" {
266
+ @option deprecated = true
267
+ }
268
+ }
269
+ ```
270
+
271
+ ---
272
+
273
+ ## Phase 4: Buf.build Integration
274
+
275
+ ### Goal
276
+
277
+ Integrate with [buf.build](https://buf.build) CLI for linting, breaking change detection, and registry publishing.
278
+
279
+ ### Components
280
+
281
+ #### [NEW] [buf.rs](file:///home/sprime01/projects/domainforge/domainforge-core/src/projection/buf.rs)
282
+
283
+ ```rust
284
+ /// Buf.build integration for proto linting and management.
285
+ pub struct BufIntegration {
286
+ buf_path: PathBuf, // Path to buf binary
287
+ }
288
+
289
+ impl BufIntegration {
290
+ /// Generate buf.yaml configuration file.
291
+ pub fn generate_buf_yaml(proto_files: &[PathBuf]) -> String;
292
+
293
+ /// Run buf lint on generated protos.
294
+ pub fn lint(&self, proto_dir: &Path) -> Result<BufLintResult, BufError>;
295
+
296
+ /// Run buf breaking check against schema history.
297
+ pub fn breaking_check(&self, new_dir: &Path, old_dir: &Path) -> Result<BufBreakingResult, BufError>;
298
+
299
+ /// Generate buf.gen.yaml for code generation.
300
+ pub fn generate_buf_gen_yaml(languages: &[Language]) -> String;
301
+ }
302
+ ```
303
+
304
+ ### CLI Integration
305
+
306
+ ```bash
307
+ # Lint generated protos
308
+ domainforge project --format protobuf --buf-lint model.sea output.proto
309
+
310
+ # Check breaking changes
311
+ domainforge project --format protobuf --buf-breaking --against ./previous model.sea output.proto
312
+
313
+ # Full buf workflow
314
+ domainforge project --format protobuf --buf-generate --languages rust,go,ts model.sea output/
315
+ ```
316
+
317
+ ### Buf Configuration Generation
318
+
319
+ ```yaml
320
+ # Generated buf.yaml
321
+ version: v1
322
+ breaking:
323
+ use:
324
+ - FILE
325
+ lint:
326
+ use:
327
+ - DEFAULT
328
+ except:
329
+ - PACKAGE_VERSION_SUFFIX
330
+ ```
331
+
332
+ ---
333
+
334
+ ## Phase 5: Multiple File Output per Namespace
335
+
336
+ ### Goal
337
+
338
+ Generate separate `.proto` files per namespace for better organization.
339
+
340
+ ### Changes
341
+
342
+ #### [MODIFY] [protobuf.rs](file:///home/sprime01/projects/domainforge/domainforge-core/src/projection/protobuf.rs)
343
+
344
+ ```rust
345
+ impl ProtobufEngine {
346
+ /// Project to multiple files, one per namespace.
347
+ pub fn project_multi_file(
348
+ graph: &Graph,
349
+ base_package: &str,
350
+ ) -> BTreeMap<String, ProtoFile> {
351
+ let mut files: BTreeMap<String, ProtoFile> = BTreeMap::new();
352
+
353
+ // Group entities by namespace
354
+ for entity in graph.all_entities() {
355
+ let ns = entity.namespace();
356
+ let package = format!("{}.{}", base_package, ns);
357
+
358
+ files.entry(ns.to_string())
359
+ .or_insert_with(|| ProtoFile::new(&package))
360
+ .messages.push(Self::entity_to_message(entity));
361
+ }
362
+
363
+ // Add cross-namespace imports
364
+ for file in files.values_mut() {
365
+ Self::add_cross_namespace_imports(file, &files);
366
+ }
367
+
368
+ files
369
+ }
370
+ }
371
+ ```
372
+
373
+ ### Output Structure
374
+
375
+ ```
376
+ output/
377
+ ├── buf.yaml
378
+ ├── common/
379
+ │ └── common.proto
380
+ ├── orders/
381
+ │ └── orders.proto
382
+ ├── payments/
383
+ │ └── payments.proto
384
+ └── customers/
385
+ └── customers.proto
386
+ ```
387
+
388
+ ### CLI Flag
389
+
390
+ ```bash
391
+ domainforge project --format protobuf --multi-file --output-dir ./proto model.sea
392
+ ```
393
+
394
+ ---
395
+
396
+ ## Implementation Order
397
+
398
+ ```mermaid
399
+ gantt
400
+ title Protobuf Advanced Features
401
+ dateFormat YYYY-MM-DD
402
+ section Phase 1
403
+ Well-Known Types :p1, 2024-01-01, 2d
404
+ section Phase 2
405
+ gRPC Services :p2, after p1, 5d
406
+ section Phase 3
407
+ Custom Options :p3, after p2, 3d
408
+ section Phase 4
409
+ Buf Integration :p4, after p3, 4d
410
+ section Phase 5
411
+ Multi-File Output :p5, after p4, 3d
412
+ ```
413
+
414
+ ---
415
+
416
+ ## Verification Plan
417
+
418
+ ### Automated Tests
419
+
420
+ | Phase | Test Coverage |
421
+ | ----- | ---------------------------------------------- |
422
+ | 1 | WKT type mapping, import generation |
423
+ | 2 | Flow→Service mapping, method generation |
424
+ | 3 | Option parsing, serialization |
425
+ | 4 | Buf CLI invocation (mocked), config generation |
426
+ | 5 | Multi-file output, import resolution |
427
+
428
+ ### Integration Tests
429
+
430
+ - Generate protos for `examples/ecommerce.sea`
431
+ - Validate with `protoc --decode_raw`
432
+ - Validate with `buf lint`
433
+ - Generate code with `buf generate`
434
+
435
+ ### Manual Verification
436
+
437
+ - Review generated `.proto` files for readability
438
+ - Test generated code compiles in target languages
439
+
440
+ ---
441
+
442
+ ## Design Decisions (Resolved)
443
+
444
+ > [!NOTE]
445
+ > These decisions were made based on user input and gRPC/Protobuf best practices.
446
+
447
+ ### 1. gRPC Streaming Support ✅
448
+
449
+ **Decision**: Support streaming via Flow attributes.
450
+
451
+ **Syntax**:
452
+
453
+ ```sea
454
+ // Unary RPC (default)
455
+ Flow from Client to Server of Request
456
+
457
+ // Server streaming
458
+ Flow @streaming from Client to Server of EventStream
459
+
460
+ // Client streaming
461
+ Flow @client_streaming from Client to Server of DataChunks
462
+
463
+ // Bidirectional streaming
464
+ Flow @bidirectional from Client to Server of ChatMessage
465
+ ```
466
+
467
+ **Rationale**: Streaming is essential for real-time use cases (event sourcing, log tailing, chat).
468
+
469
+ ---
470
+
471
+ ### 2. Service Naming Convention ✅
472
+
473
+ **Decision**: Use `{DestinationEntity}Service` naming.
474
+
475
+ **Example**:
476
+
477
+ ```protobuf
478
+ // Entity "PaymentProcessor" becomes:
479
+ service PaymentProcessorService { ... }
480
+
481
+ // Entity "OrderManager" becomes:
482
+ service OrderManagerService { ... }
483
+ ```
484
+
485
+ **Rationale**: This is the standard gRPC naming convention:
486
+
487
+ - Google APIs use `FooService` pattern
488
+ - Idiomatic and predictable
489
+ - Self-describing (service named after the capability provider)
490
+ - Matches `grpc-gateway` and `protoc-gen-*` expectations
491
+
492
+ ---
493
+
494
+ ### 3. Buf.build Integration ✅
495
+
496
+ **Decision**: Make `buf` CLI **optional** with graceful degradation.
497
+
498
+ **Behavior**:
499
+
500
+ ```bash
501
+ # If buf is installed - runs linting
502
+ domainforge project --format protobuf --buf-lint input.sea output.proto
503
+ # Output: "✓ buf lint passed (12 files, 0 issues)"
504
+
505
+ # If buf is NOT installed - warns and continues
506
+ domainforge project --format protobuf --buf-lint input.sea output.proto
507
+ # Output: "⚠ buf CLI not found. Skipping lint. Install: https://buf.build/docs/installation"
508
+ ```
509
+
510
+ **Rationale**:
511
+
512
+ - Lowers barrier to entry (works without buf)
513
+ - Power users get enhanced validation
514
+ - No hard dependency on external tooling
515
+
516
+ ---
517
+
518
+ ### 4. Cross-Namespace Imports ✅
519
+
520
+ **Decision**: Use **fully qualified imports**.
521
+
522
+ **Example**:
523
+
524
+ ```protobuf
525
+ // In payments/payments.proto
526
+ syntax = "proto3";
527
+ package com.example.payments;
528
+
529
+ import "com/example/common/money.proto";
530
+ import "com/example/customers/customer.proto";
531
+
532
+ message PaymentRequest {
533
+ com.example.common.Money amount = 1;
534
+ com.example.customers.CustomerId customer_id = 2;
535
+ }
536
+ ```
537
+
538
+ **Rationale**:
539
+
540
+ - **Toolchain-agnostic**: Works with `protoc`, `buf`, `grpc-tools` without configuration
541
+ - **Self-documenting**: Imports show exact dependency paths
542
+ - **No aliasing issues**: No risk of name collisions
543
+ - **Mono-repo standard**: Google, Uber, and other large-scale Protobuf users prefer this
544
+ - **IDE support**: Better autocomplete and navigation
545
+
546
+ ---
547
+
548
+ ## Updated Implementation Summary
549
+
550
+ | Phase | Feature | Key Design Choice |
551
+ | ----- | ---------------- | ----------------------------------------- |
552
+ | 1 | Well-Known Types | Auto-add imports only when WKT used |
553
+ | 2 | gRPC Services | `{Entity}Service` + streaming annotations |
554
+ | 3 | Custom Options | Via `@option` in projections |
555
+ | 4 | Buf.build | Optional CLI, graceful degradation |
556
+ | 5 | Multi-File | Fully qualified imports |
557
+
558
+ ---
559
+
560
+ ## Grammar Changes for Streaming
561
+
562
+ #### [MODIFY] [sea.pest](file:///home/sprime01/projects/domainforge/domainforge-core/grammar/sea.pest)
563
+
564
+ ```pest
565
+ flow_modifier = @{ "@" ~ ("streaming" | "client_streaming" | "bidirectional") }
566
+
567
+ flow_statement = {
568
+ flow_modifier* ~ "Flow" ~ "from" ~ identifier ~ "to" ~ identifier ~ "of" ~ identifier
569
+ }
570
+ ```
571
+
572
+ #### Streaming Enum in IR
573
+
574
+ ```rust
575
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
576
+ pub enum StreamingMode {
577
+ #[default]
578
+ Unary,
579
+ ServerStreaming,
580
+ ClientStreaming,
581
+ Bidirectional,
582
+ }
583
+ ```
584
+
585
+ ---
586
+
587
+ ## Next Steps
588
+
589
+ After approval, I will implement in this order:
590
+
591
+ 1. **Phase 1 (Well-Known Types)** — ~2 hours
592
+ 2. **Phase 2 (gRPC Services + Streaming)** — ~4 hours
593
+ 3. **Phase 3 (Custom Options)** — ~2 hours
594
+ 4. **Phase 4 (Buf.build Optional)** — ~3 hours
595
+ 5. **Phase 5 (Multi-File Output)** — ~3 hours
596
+
597
+ **Total estimated effort**: ~14 hours