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,14 @@
1
+ # Explanation Template
2
+
3
+ Title:
4
+ Summary: (Explain the concept, context and why it matters)
5
+
6
+ ## Details
7
+
8
+ - Provide diagrams and examples
9
+ - Clarify tradeoffs and design decisions
10
+
11
+ ## Links
12
+
13
+ - Deeper reference pages
14
+ - How-Tos that use the concept
@@ -0,0 +1,21 @@
1
+ # How-To Template
2
+
3
+ Title:
4
+ Summary: (1-line)
5
+ Goal: (outcome)
6
+
7
+ ## Prerequisites
8
+
9
+ - None
10
+
11
+ ## Steps (be concise)
12
+
13
+ 1.
14
+ 2.
15
+
16
+ ## Common pitfalls / Troubleshooting
17
+
18
+ Links:
19
+
20
+ - Tutorials
21
+ - Reference
@@ -0,0 +1,21 @@
1
+ # Playbook Template
2
+
3
+ Title:
4
+ Scope: (What incidents or workflows this covers)
5
+
6
+ ## Prerequisites and safety checks
7
+
8
+ -
9
+
10
+ ## Step-by-step runbook
11
+
12
+ 1.
13
+ 2.
14
+
15
+ ## Rollback steps
16
+
17
+ ## Contacts & Escalation
18
+
19
+ ## Links
20
+
21
+ - Related How-Tos and Reference
@@ -0,0 +1,17 @@
1
+ # Reference Template
2
+
3
+ ## Title
4
+ Replace with the title of this reference.
5
+
6
+ ## Summary
7
+ What this reference covers.
8
+
9
+ ## Shape & Schema
10
+
11
+ - JSON/YAML examples if applicable
12
+ - Code samples for API usage
13
+
14
+ ## Notes & Links
15
+
16
+ - Backwards compatibility
17
+ - Related APIs
@@ -0,0 +1,24 @@
1
+ # Tutorial Template
2
+
3
+ Title:
4
+ Audience:
5
+ Goal:
6
+
7
+ ## Prerequisites
8
+
9
+ - List the required tools, versions, and any environment setup.
10
+
11
+ ## Steps
12
+
13
+ 1. Step 1: Briefly describe the first action readers must take.
14
+ 2. Step 2: Explain the next key change or command to run.
15
+ 3. Step 3: Note how to verify the step or transition to the next phase.
16
+
17
+ ## Result / Verify
18
+
19
+ ## Troubleshooting
20
+
21
+ ## Links
22
+
23
+ - Related How-Tos
24
+ - Reference pages
@@ -0,0 +1,12 @@
1
+ # Tutorials — DomainForge
2
+
3
+ Purpose: Provide task-based, goal-oriented walkthroughs for users who want to accomplish a larger goal and learn by doing.
4
+
5
+ MECE checklist for tutorials:
6
+
7
+ - Audience: beginner/experienced
8
+ - Learning outcome: what users will be able to do
9
+ - Prerequisites: environment and tools
10
+ - Step-by-step instructions with example inputs and outputs
11
+ - Troubleshooting/FAQ
12
+ - Links to related How-Tos and Reference docs
@@ -0,0 +1,85 @@
1
+ # Building Your First Complete SEA Model
2
+
3
+ In this tutorial, we will build a comprehensive domain model for a fictional E-Commerce system. We will cover Entities, Resources, Flows, and Instances.
4
+
5
+ ## The Scenario
6
+
7
+ We are modeling "ShopEasy", an online store. It has:
8
+ - A **Storefront** (Web App)
9
+ - An **Order Service** (Backend API)
10
+ - A **Payment Gateway** (External Service)
11
+ - An **Order Database** (Storage)
12
+
13
+ ## Step 1: Define Entities
14
+
15
+ Create a file `shopeasy.sea`. Start by defining the active components.
16
+
17
+ ```sea
18
+ @namespace "shopeasy"
19
+
20
+ Entity "Storefront"
21
+ Entity "OrderService"
22
+ Entity "PaymentGateway"
23
+ Entity "OrderDatabase"
24
+ ```
25
+
26
+ ## Step 2: Define Resources
27
+
28
+ Now define the passive infrastructure.
29
+
30
+ ```sea
31
+ Resource "OrderRequest" units
32
+ Resource "OrderRecord" units
33
+ Resource "PaymentIntent" units
34
+ Resource "ConfirmationMessage" units
35
+ ```
36
+
37
+ ## Step 3: Connect with Flows
38
+
39
+ Model how these components interact.
40
+
41
+ ```sea
42
+ Flow "OrderRequest" from "Storefront" to "OrderService"
43
+ Flow "OrderRecord" from "OrderService" to "OrderDatabase"
44
+ Flow "PaymentIntent" from "OrderService" to "PaymentGateway"
45
+ Flow "ConfirmationMessage" from "OrderService" to "Storefront"
46
+ ```
47
+
48
+ ## Step 4: Define Instances
49
+
50
+ Model the physical deployment in the production environment.
51
+
52
+ ```sea
53
+ Instance prod_order_service of "OrderService" {
54
+ env: "production",
55
+ replicas: 3
56
+ }
57
+
58
+ Instance prod_db of "OrderDatabase" {
59
+ env: "production",
60
+ region: "us-west-2"
61
+ }
62
+ ```
63
+
64
+ ## Step 5: Validate
65
+
66
+ Run the CLI to verify your model structure.
67
+
68
+ ```bash
69
+ sea-cli parse shopeasy.sea
70
+ ```
71
+
72
+ ## Understanding the Output
73
+
74
+ The parser confirms that:
75
+ 1. All references are valid (e.g., `Flow "OrderRequest" from "Storefront"` points to declared entities).
76
+ 2. The syntax is correct.
77
+ 3. The graph is connected.
78
+
79
+ ## Conclusion
80
+
81
+ You have successfully modeled a microservices architecture with data flows and infrastructure definitions. This model can now be used to generate diagrams, Terraform code, or validate security policies.
82
+
83
+ ## See Also
84
+
85
+ - [Semantic Modeling Concepts](../explanations/semantic-modeling-concepts.md)
@@ -0,0 +1,98 @@
1
+ # Getting Started with DomainForge
2
+
3
+ This tutorial will guide you through installing the DomainForge CLI, writing your first Semantic Enterprise Architecture (SEA) model, and validating it.
4
+
5
+ **Time to complete**: 15 minutes
6
+
7
+ ## Prerequisites
8
+
9
+ - **Rust**: You need Rust and Cargo installed. [Install Rust](https://rustup.rs/).
10
+
11
+ ## Step 1: Install the CLI
12
+
13
+ Build and install the CLI tool directly from the source.
14
+
15
+ ```bash
16
+ # From the root of the domainforge repository
17
+ cargo install --path . --features cli
18
+ ```
19
+
20
+ Verify the installation:
21
+
22
+ ```bash
23
+ sea-cli --version
24
+ # Output: sea-cli 0.1.0 (or current version)
25
+ ```
26
+
27
+ ## Step 2: Create Your First Model
28
+
29
+ Create a new file named `hello.sea` in your favorite text editor. We will model a simple "Hello World" system with a Web Server and a Database.
30
+
31
+ ```sea
32
+ @namespace "hello.world"
33
+
34
+ Entity "WebServer"
35
+ Entity "UserDatabase"
36
+ Resource "UserData" units
37
+ Flow "UserData" from "WebServer" to "UserDatabase" quantity 1
38
+ ```
39
+
40
+ ## Step 3: Parse and Validate
41
+
42
+ Run the CLI to parse your file. This checks for syntax errors and builds the internal graph.
43
+
44
+ ```bash
45
+ sea-cli parse hello.sea
46
+ ```
47
+
48
+ **Expected Output:**
49
+ ```text
50
+ Successfully parsed hello.sea
51
+ Found:
52
+ - 1 Entities
53
+ - 1 Resources
54
+ - 1 Flows
55
+ ```
56
+
57
+ ## Step 4: Add a Policy
58
+
59
+ Let's add a rule to ensure our architecture is secure. Append this to `hello.sea`:
60
+
61
+ ```sea
62
+ Policy secure_db_access as:
63
+ forall f in flows: (f.to = "UserDatabase" and f.quantity <= 1)
64
+ ```
65
+
66
+ Run the parser again. The CLI automatically evaluates policies.
67
+
68
+ ```bash
69
+ sea-cli parse hello.sea
70
+ ```
71
+
72
+ **Expected Output:**
73
+ ```text
74
+ ...
75
+ Policy Results:
76
+ [PASS] secure_db_access
77
+ ```
78
+
79
+ ## Step 5: Break the Policy
80
+
81
+ Increase the quantity on the flow and re-validate to see the policy fail.
82
+
83
+ ```sea
84
+ Flow "UserData" from "WebServer" to "UserDatabase" quantity 5
85
+ ```
86
+
87
+ **Expected Output:**
88
+ ```text
89
+ ...
90
+ Policy Results:
91
+ [FAIL] secure_db_access
92
+ -> Violation at Flow("UserData")
93
+ ```
94
+
95
+ ## Next Steps
96
+
97
+ - Learn more about [Semantic Modeling Concepts](../explanations/semantic-modeling-concepts.md).
98
+ - Try the [Python Binding Quickstart](python-binding-quickstart.md).
@@ -0,0 +1,107 @@
1
+ # Python Binding Quickstart
2
+
3
+ This guide shows how to use DomainForge programmatically using Python. This is useful for writing custom analysis scripts, generating reports, or integrating SEA into Python-based tooling.
4
+
5
+ ## Prerequisites
6
+
7
+ - Python 3.8+
8
+ - `maturin` (for building bindings locally, or install from PyPI if available)
9
+
10
+ ## Step 1: Installation
11
+
12
+ If you are working in the repo:
13
+
14
+ ```bash
15
+ # Create venv
16
+ python -m venv .venv
17
+ source .venv/bin/activate
18
+
19
+ # Install dependencies and build bindings
20
+ pip install maturin
21
+ maturin develop --features python
22
+ ```
23
+
24
+ ## Step 2: Create a Script
25
+
26
+ Create `analyze_model.py`.
27
+
28
+ ```python
29
+ import domainforge
30
+ from domainforge import Entity, Flow
31
+
32
+ # 1. Define a simple model string (or load from file)
33
+ sea_content = """
34
+ entity Web { type = "service" }
35
+ resource DB { type = "database" }
36
+ flow f1 { from = Web, to = DB, interaction = "read" }
37
+ """
38
+
39
+ # 2. Parse the content
40
+ try:
41
+ model = domainforge.parse(sea_content)
42
+ print("Parse successful!")
43
+ except Exception as e:
44
+ print(f"Error: {e}")
45
+ exit(1)
46
+
47
+ # 3. Inspect the graph
48
+ print(f"Entities: {len(model.entities)}") # Entities includes only entity objects (resources are separate)
49
+ print(f"Flows: {len(model.flows)}")
50
+
51
+ # 4. Iterate and analyze
52
+ for flow in model.flows:
53
+ source = flow.from_entity
54
+ target = flow.to_entity
55
+ print(f"Flow: {source.name} -> {target.name} ({flow.interaction})")
56
+
57
+ # 5. Programmatic Modification (Hypothetical API)
58
+ # new_entity = Entity(name="Cache", type="redis")
59
+ # model.add_entity(new_entity)
60
+ ```
61
+
62
+ ## Step 3: Run the Script
63
+
64
+ ```bash
65
+ python analyze_model.py
66
+ ```
67
+
68
+ **Expected Output:**
69
+ ```text
70
+ Parse successful!
71
+ Entities: 1
72
+ Flows: 1
73
+ Flow: Web -> DB (read)
74
+ ```
75
+
76
+ ## Integration with Pytest
77
+
78
+ You can use DomainForge to test your architecture definitions.
79
+
80
+ ```python
81
+ # test_architecture.py
82
+ import pytest
83
+ import domainforge
84
+
85
+ def test_no_plaintext_passwords():
86
+ # Use parse_file if provided by the API; otherwise fallback to parse(file.contents)
87
+ if hasattr(domainforge, 'parse_file'):
88
+ model = domainforge.parse_file("production.sea")
89
+ else:
90
+ with open("production.sea") as f:
91
+ model = domainforge.parse(f.read())
92
+ for flow in model.flows:
93
+ # Only check properties that are part of the confirmed public API to avoid relying on internal fields.
94
+ payload = getattr(flow, 'payload', '')
95
+ encrypted = getattr(flow, 'encrypted', None)
96
+ if payload and "password" in str(payload).lower():
97
+ # Only assert encrypted if the API exposes the field; otherwise log for debugging.
98
+ if encrypted is not None:
99
+ assert encrypted == True, f"Flow {getattr(flow, 'name', '<unnamed>')} sends passwords in plain text!"
100
+ else:
101
+ # If `encrypted` is not provided, check the flow name and warn instead of failing the test
102
+ pytest.skip("Encrypted attribute not exposed by this API/binding; skip strict assertion")
103
+ ```
104
+
105
+ ## See Also
106
+
107
+ - [Cross-Language Binding Strategy](../explanations/cross-language-binding-strategy.md)
@@ -0,0 +1,91 @@
1
+ # TypeScript Binding Quickstart
2
+
3
+ This guide demonstrates how to use DomainForge in a Node.js/TypeScript environment.
4
+
5
+ ## Prerequisites
6
+
7
+ - Node.js 16+
8
+ - npm or yarn
9
+
10
+ ## Step 1: Installation
11
+
12
+ ```bash
13
+ npm install @godspeedai/domainforge
14
+ # Or if building locally:
15
+ # npm install ../domainforge-core/typescript
16
+ ```
17
+
18
+ ## Step 2: Create a Script
19
+
20
+ Create `index.ts`.
21
+
22
+ ```typescript
23
+ import { parse, Model, Flow } from '@godspeedai/domainforge';
24
+
25
+ const seaContent = `
26
+ entity API { type = "service" }
27
+ resource Bucket { type = "storage" }
28
+ flow upload { from = API, to = Bucket, interaction = "write" }
29
+ `;
30
+
31
+ async function main() {
32
+ try {
33
+ // 1. Parse
34
+ const model: Model = parse(seaContent);
35
+ console.log(`Parsed model with ${model.entities.length} entities.`);
36
+
37
+ // 2. Analyze
38
+ model.flows.forEach((flow: Flow) => {
39
+ console.log(`Found flow: ${flow.name}`);
40
+ console.log(` From: ${flow.from.name}`);
41
+ console.log(` To: ${flow.to.name}`);
42
+ });
43
+
44
+ } catch (error) {
45
+ console.error("Failed to parse SEA model:", error);
46
+ }
47
+ }
48
+
49
+ main();
50
+ ```
51
+
52
+ ## Step 3: Run
53
+
54
+ ```bash
55
+ npx ts-node index.ts
56
+ ```
57
+
58
+ **Expected Output:**
59
+ ```text
60
+ Parsed model with 1 entities.
61
+ Found flow: upload
62
+ From: API
63
+ To: Bucket
64
+ ```
65
+
66
+ ## Integration with Vitest
67
+
68
+ ```typescript
69
+ // architecture.test.ts
70
+ import { describe, it, expect, beforeAll } from 'vitest';
71
+ import { parse } from '@godspeedai/domainforge';
72
+ import * as fs from 'fs';
73
+
74
+ describe('Architecture Rules', () => {
75
+ let model;
76
+ beforeAll(() => {
77
+ model = parse(fs.readFileSync('./system.sea', 'utf-8'));
78
+ });
79
+
80
+ it('should have all databases encrypted', () => {
81
+ const dbs = model.resources.filter(r => r.type === 'database');
82
+ dbs.forEach(db => {
83
+ expect(db.properties.encrypted).toBe(true);
84
+ });
85
+ });
86
+ });
87
+ ```
88
+
89
+ ## See Also
90
+
91
+ - [Cross-Language Binding Strategy](../explanations/cross-language-binding-strategy.md)
@@ -0,0 +1,75 @@
1
+ # Running DomainForge in the Browser (WASM)
2
+
3
+ DomainForge can run entirely client-side using WebAssembly. This allows for building interactive editors or visualizers without a backend.
4
+
5
+ ## Prerequisites
6
+
7
+ - Rust with `wasm32-unknown-unknown` target
8
+ - `wasm-pack`
9
+
10
+ ## Step 1: Build WASM
11
+
12
+ ```bash
13
+ # From the project root, build the WASM bundle into an example folder
14
+ mkdir -p examples/wasm-demo
15
+ wasm-pack build domainforge-core --target web --out-dir examples/wasm-demo/pkg --features wasm
16
+ ```
17
+
18
+ ## Step 2: HTML Setup
19
+
20
+ Create `examples/wasm-demo/index.html`.
21
+
22
+ ```html
23
+ <!DOCTYPE html>
24
+ <html>
25
+ <head>
26
+ <title>SEA WASM Demo</title>
27
+ </head>
28
+ <body>
29
+ <h1>SEA Parser</h1>
30
+ <textarea id="input" rows="10" cols="50">
31
+ entity Web { type = "service" }
32
+ </textarea>
33
+ <button id="parseBtn">Parse</button>
34
+ <pre id="output"></pre>
35
+
36
+ <script type="module">
37
+ import init, { Graph } from './pkg/domainforge_core.js';
38
+
39
+ async function run() {
40
+ await init(); // Initialize WASM module
41
+
42
+ document.getElementById('parseBtn').onclick = () => {
43
+ const input = document.getElementById('input').value;
44
+ try {
45
+ const graph = Graph.parse(input);
46
+ document.getElementById('output').textContent =
47
+ JSON.stringify(graph.toJSON(), null, 2);
48
+ } catch (e) {
49
+ document.getElementById('output').textContent = "Error: " + e;
50
+ }
51
+ };
52
+ }
53
+
54
+ run();
55
+ </script>
56
+ </body>
57
+ </html>
58
+ ```
59
+
60
+ ## Step 3: Serve
61
+
62
+ You need a local web server to serve the WASM file (due to CORS).
63
+
64
+ ```bash
65
+ # Using python
66
+ python3 -m http.server 8000
67
+ ```
68
+
69
+ Open `http://localhost:8000` in your browser (use `python3 -m http.server <port>` if you prefer another port). Click "Parse". You should see the JSON representation of the parsed model.
70
+
71
+ > If you rename the crate or output path, check the generated `pkg/` folder for the exact `.js` wrapper name and exported functions, then adjust the import accordingly.
72
+
73
+ ## See Also
74
+
75
+ - [Cross-Language Binding Strategy](../explanations/cross-language-binding-strategy.md)