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,74 @@
1
+ # Security Model
2
+
3
+ This document describes the DomainForge security model, focusing on how untrusted input is handled.
4
+
5
+ ## Threat Model: Untrusted .sea Input
6
+
7
+ DomainForge processes `.sea` DSL files that may originate from untrusted sources. The primary threat vectors are:
8
+
9
+ - **Malformed input** designed to trigger panics or resource exhaustion in the parser
10
+ - **Path traversal** via import paths or namespace declarations
11
+ - **Archive extraction** exploits when unpacking semantic packs
12
+ - **Injection** of executable content through DSL constructs
13
+
14
+ The parser is the primary attack surface. It must handle arbitrary input without panicking, exhausting memory, or executing external processes.
15
+
16
+ ## Parser Limits
17
+
18
+ The Pest-based parser processes input through a PEG grammar. Known behaviors:
19
+
20
+ - **Deeply nested expressions**: Excessive nesting (hundreds of levels) may hit recursion limits. The parser returns a `ParseError` rather than panicking.
21
+ - **Large input**: Files with hundreds of thousands of declarations are accepted. Memory usage scales linearly with input size.
22
+ - **Null bytes**: Input containing null bytes is handled gracefully and produces a parse error.
23
+ - **Long strings**: Individual string literals up to at least 1 MB are processed without panicking.
24
+
25
+ Test coverage for these limits lives in `domainforge-core/tests/parser_resource_limits_tests.rs`.
26
+
27
+ ## Namespace and Import Path Restrictions
28
+
29
+ The module resolver enforces the following restrictions:
30
+
31
+ - **No path separators** in namespace declarations. Forward slashes (`/`) and backslashes (`\`) are rejected.
32
+ - **No path traversal** sequences (`..`) in namespace or import paths.
33
+ - **No absolute paths** in namespace declarations.
34
+ - **Circular imports** are detected and reported as `E505: CircularDependency` with the full cycle path.
35
+
36
+ These checks are implemented in `domainforge_core::projection::protobuf::validate_proto_package_namespace` and `domainforge_core::module::resolver::ModuleResolver`.
37
+
38
+ ## Safe Archive Extraction
39
+
40
+ When extracting semantic packs (`.sea-pack` archives), the following protections apply:
41
+
42
+ - **Path traversal prevention**: Archive entries with paths containing `..` or absolute paths are rejected.
43
+ - **Size limits**: Archive entries exceeding configured size thresholds are rejected before extraction.
44
+ - **Symlink handling**: Symlinks within archives are not followed during extraction.
45
+
46
+ ## No Process Execution from Model Content
47
+
48
+ DomainForge does **not** execute external processes based on the content of `.sea` files. Specifically:
49
+
50
+ - DSL declarations (Entity, Resource, Flow, Policy, etc.) are data declarations only
51
+ - Annotations and metadata are parsed as structured data, never evaluated as code
52
+ - The `export` keyword controls visibility within the DSL namespace system
53
+ - No `eval()`, `system()`, or subprocess invocation exists in the parser or graph construction pipeline
54
+ - CLI commands operate on files and produce structured output (JSON, Turtle, Protobuf) without interpreting DSL content as executable instructions
55
+
56
+ ## Cargo Supply Chain Security
57
+
58
+ Dependency auditing is enforced through:
59
+
60
+ - **cargo-audit**: Scans for known vulnerabilities in dependencies
61
+ - **cargo-deny**: Enforces license allowlists, bans duplicate versions, and denies wildcard dependencies
62
+ - **Configuration**: `deny.toml` at the workspace root defines the policy
63
+
64
+ Run `just audit` to check dependencies locally, or `just enterprise-verify` for the full release verification pipeline.
65
+
66
+ ## Release Workflow Linting
67
+
68
+ Three Python scripts validate CI/CD workflow files for security issues:
69
+
70
+ | Script | Checks |
71
+ |--------|--------|
72
+ | `scripts/lint_release_workflows.py` | Unfrozen npm installs, curl without checksums, continue-on-error on publish |
73
+ | `scripts/lint_release_security.py` | curl pipe to shell, publish failure masking, token exposure during builds |
74
+ | `scripts/lint_workflow_gates.py` | Artifact upload jobs gated by create-release, dependabot empty-check handling |
@@ -0,0 +1,508 @@
1
+ # @godspeedai/domainforge
2
+
3
+ TypeScript/Node.js bindings for the SEA (Semantic Enterprise Architecture) DSL.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ # From source (npm package coming soon)
9
+ git clone https://github.com/GodSpeedAI/DomainForge.git
10
+ cd DomainForge
11
+ npm install
12
+ npm run build
13
+
14
+ # The build produces native .node bindings
15
+ ```
16
+
17
+ ## Quick Start
18
+
19
+ ```typescript
20
+ import { Graph, Entity, Resource, Flow } from "@godspeedai/domainforge";
21
+
22
+ // Create a graph programmatically
23
+ const graph = new Graph();
24
+
25
+ // Constructor patterns - new() for default namespace, newWithNamespace() for explicit
26
+ const warehouse = Entity.new("Warehouse"); // Default namespace
27
+ const factory = Entity.newWithNamespace("Factory", "manufacturing");
28
+
29
+ // Namespace is always a string (not undefined), defaults to "default"
30
+ console.log(warehouse.namespace()); // "default"
31
+ console.log(factory.namespace()); // "manufacturing"
32
+
33
+ const cameras = Resource.new("Cameras", "units");
34
+
35
+ graph.addEntity(warehouse);
36
+ graph.addEntity(factory);
37
+ graph.addResource(cameras);
38
+
39
+ // Flow constructor takes ConceptId values - clone before passing
40
+ const flow = Flow.new(
41
+ cameras.id().clone(),
42
+ warehouse.id().clone(),
43
+ factory.id().clone(),
44
+ 100
45
+ );
46
+ graph.addFlow(flow);
47
+
48
+ console.log(`Graph has ${graph.entityCount()} entities`);
49
+ console.log(`Graph has ${graph.flowCount()} flows`);
50
+ ```
51
+
52
+ ## Parsing SEA DSL
53
+
54
+ ```typescript
55
+ import { Graph } from "@godspeedai/domainforge";
56
+
57
+ // Supports multiline strings with """ syntax
58
+ const source = `
59
+ Entity "Warehouse" in logistics
60
+ Entity """Multi-line
61
+ Factory Name""" in manufacturing
62
+ Resource "Cameras" units
63
+ Flow "Cameras" from "Warehouse" to "Multi-line\\nFactory Name" quantity 100
64
+ `;
65
+
66
+ const graph = Graph.parse(source);
67
+
68
+ console.log(`Parsed ${graph.entityCount()} entities`);
69
+ console.log(`Parsed ${graph.flowCount()} flows`);
70
+ ```
71
+
72
+ ### Error Handling
73
+
74
+ `Graph.parse(source: string)` may throw an `Error` on invalid input. The binding typically surfaces syntax issues as a standard `Error` with a message that includes parser details (line/column); some runtimes may implement a specific `ParseError` subclass. Callers should wrap parsing in a try/catch and handle errors accordingly:
75
+
76
+ ```ts
77
+ try {
78
+ const g = Graph.parse(source);
79
+ } catch (e) {
80
+ // `e` typically includes a message and a line/column in the text
81
+ console.error("Failed to parse", e);
82
+ }
83
+ ```
84
+
85
+ ## Formatting Source Code
86
+
87
+ ```typescript
88
+ import { formatSource, checkFormat } from "@godspeedai/domainforge";
89
+
90
+ // Format SEA-DSL source with default settings
91
+ const source = 'Entity "Foo" in bar';
92
+ const formatted = formatSource(source);
93
+ console.log(formatted); // Entity "Foo" in bar
94
+
95
+ // Format with custom options
96
+ const formatted2 = formatSource(source, {
97
+ indentWidth: 2,
98
+ useTabs: false,
99
+ preserveComments: true,
100
+ sortImports: true,
101
+ });
102
+
103
+ // Check if source is already formatted
104
+ const isFormatted = checkFormat(source);
105
+ console.log(isFormatted); // false
106
+
107
+ // Check with formatted content
108
+ const isFormatted2 = checkFormat('Entity "Foo" in bar\n');
109
+ console.log(isFormatted2); // true
110
+ ```
111
+
112
+ ## API Reference
113
+
114
+ ### Formatter Functions
115
+
116
+ ```typescript
117
+ // Format SEA-DSL source code
118
+ function formatSource(source: string, options?: FormatOptions): string;
119
+
120
+ // Check if source is already formatted
121
+ function checkFormat(source: string, options?: FormatOptions): boolean;
122
+
123
+ interface FormatOptions {
124
+ indentWidth?: number; // Default: 4
125
+ useTabs?: boolean; // Default: false
126
+ preserveComments?: boolean; // Default: true
127
+ sortImports?: boolean; // Default: true
128
+ }
129
+ ```
130
+
131
+ ### Entity
132
+
133
+ ```typescript
134
+ class Entity {
135
+ static new(name: string): Entity; // Default namespace
136
+ static newWithNamespace(name: string, namespace: string): Entity; // Explicit namespace
137
+
138
+ id(): ConceptId;
139
+ name(): string;
140
+ namespace(): string; // Always returns string, never undefined (defaults to "default")
141
+ setAttribute(key: string, value: any): void;
142
+ getAttribute(key: string): any;
143
+ }
144
+ ```
145
+
146
+ ### Resource
147
+
148
+ ```typescript
149
+ class Resource {
150
+ // Constructor patterns (November 2025)
151
+ static new(name: string, unit: string): Resource; // Default namespace
152
+ static newWithNamespace(
153
+ name: string,
154
+ unit: string,
155
+ namespace: string
156
+ ): Resource;
157
+
158
+ id(): ConceptId;
159
+ name(): string;
160
+ unit(): string;
161
+ namespace(): string; // Always returns string (defaults to "default")
162
+ setAttribute(key: string, value: any): void;
163
+ getAttribute(key: string): any;
164
+ }
165
+ ```
166
+
167
+ ### Flow
168
+
169
+ ```typescript
170
+ class Flow {
171
+ // Constructor takes ConceptId values (not references) - clone before passing
172
+ static new(
173
+ resourceId: ConceptId,
174
+ fromId: ConceptId,
175
+ toId: ConceptId,
176
+ quantity: number
177
+ ): Flow;
178
+
179
+ id(): ConceptId;
180
+ resourceId(): ConceptId;
181
+ fromId(): ConceptId;
182
+ toId(): ConceptId;
183
+ quantity(): number;
184
+ namespace(): string;
185
+ setAttribute(key: string, value: any): void;
186
+ getAttribute(key: string): any;
187
+ }
188
+ ```
189
+
190
+ ### Instance
191
+
192
+ ```typescript
193
+ class Instance {
194
+ static new(resourceId: ConceptId, entityId: ConceptId): Instance; // Default namespace
195
+ static newWithNamespace(
196
+ resourceId: ConceptId,
197
+ entityId: ConceptId,
198
+ namespace: string
199
+ ): Instance;
200
+
201
+ id(): ConceptId;
202
+ resourceId(): ConceptId;
203
+ entityId(): ConceptId;
204
+ namespace(): string; // Always returns string (defaults to "default")
205
+ setAttribute(key: string, value: any): void;
206
+ getAttribute(key: string): any;
207
+ }
208
+ ```
209
+
210
+ ### Graph
211
+
212
+ ```typescript
213
+ class Graph {
214
+ constructor();
215
+
216
+ // Add primitives (validates referential integrity)
217
+ addEntity(entity: Entity): void;
218
+ addResource(resource: Resource): void;
219
+ addFlow(flow: Flow): void; // Throws if Entity/Resource references invalid
220
+ addInstance(instance: Instance): void;
221
+
222
+ // Counts
223
+ entityCount(): number;
224
+ resourceCount(): number;
225
+ flowCount(): number;
226
+ instanceCount(): number;
227
+
228
+ // Lookup by ID
229
+ hasEntity(id: ConceptId): boolean;
230
+ getEntity(id: ConceptId): Entity | null;
231
+ getResource(id: ConceptId): Resource | null;
232
+ getFlow(id: ConceptId): Flow | null;
233
+ getInstance(id: ConceptId): Instance | null;
234
+
235
+ // Lookup by name
236
+ findEntityByName(name: string): ConceptId | null;
237
+ findResourceByName(name: string): ConceptId | null;
238
+
239
+ // Flow queries
240
+ flowsFrom(entityId: ConceptId): Flow[];
241
+ flowsTo(entityId: ConceptId): Flow[];
242
+
243
+ // Get all (IndexMap ensures deterministic iteration order)
244
+ allEntities(): Entity[];
245
+ allResources(): Resource[];
246
+ allFlows(): Flow[];
247
+ allInstances(): Instance[];
248
+
249
+ // Parsing (supports multiline strings with """)
250
+ static parse(source: string): Graph;
251
+
252
+ // CALM integration (architecture-as-code)
253
+ exportCalm(): string; // Returns CALM JSON string
254
+ static importCalm(json: string): Graph; // Import from CALM JSON
255
+ }
256
+
257
+ `Graph.importCalm` will throw if the JSON is invalid or violates schema constraints; callers should also wrap `importCalm` in try/catch and inspect error messages for details.
258
+ ```
259
+
260
+ ### Expression API (December 2025)
261
+
262
+ ```typescript
263
+ import { Expression, BinaryOp } from "@godspeedai/domainforge";
264
+
265
+ // Factory methods
266
+ const expr = Expression.binary(
267
+ BinaryOp.And,
268
+ Expression.variable("b"),
269
+ Expression.variable("a")
270
+ );
271
+
272
+ // Normalization
273
+ const normalized = expr.normalize();
274
+ console.log(normalized.toStringRepr()); // "(a AND b)"
275
+ console.log(normalized.stableHashHex()); // Stable hash
276
+ ```
277
+
278
+ ### Expression and BinaryOp
279
+
280
+ ```typescript
281
+ enum BinaryOp {
282
+ And,
283
+ Or,
284
+ Equal,
285
+ NotEqual,
286
+ GreaterThan,
287
+ LessThan,
288
+ GreaterThanOrEqual,
289
+ LessThanOrEqual,
290
+ Plus,
291
+ Minus,
292
+ Multiply,
293
+ Divide,
294
+ Contains,
295
+ StartsWith,
296
+ EndsWith,
297
+ Matches,
298
+ HasRole,
299
+ Before,
300
+ After,
301
+ During,
302
+ }
303
+
304
+ class Expression {
305
+ // Factories
306
+ static literal(valueJson: string): Expression;
307
+ static literalBool(value: boolean): Expression;
308
+ static literalNumber(value: number): Expression;
309
+ static literalString(value: string): Expression;
310
+ static variable(name: string): Expression;
311
+ static binary(op: BinaryOp, left: Expression, right: Expression): Expression;
312
+
313
+ // Methods
314
+ normalize(): NormalizedExpression;
315
+ isEquivalent(other: Expression): boolean;
316
+ toStringRepr(): string;
317
+ equals(other: Expression): boolean;
318
+ }
319
+
320
+ class NormalizedExpression {
321
+ stableHash(): string;
322
+ stableHashHex(): string;
323
+ innerExpression(): Expression;
324
+ toStringRepr(): string;
325
+ equals(other: NormalizedExpression): boolean;
326
+ }
327
+ ```
328
+
329
+ ### NamespaceRegistry (Workspace)
330
+
331
+ ```typescript
332
+ import { NamespaceRegistry } from "@godspeedai/domainforge";
333
+
334
+ // Load a registry by path to the file
335
+ const reg = NamespaceRegistry.from_file("./.sea-registry.toml");
336
+
337
+ // Expand files and get bindings
338
+ const files = reg.resolve_files(); // or reg.resolve_files(true) to fail on ambiguity via the failOnAmbiguity flag
339
+ for (const f of files) {
340
+ console.log(f.path, "=>", f.namespace);
341
+ }
342
+
343
+ // Query namespace for a single file
344
+ const ns = reg.namespace_for("/path/to/file.sea"); // or pass true as the failOnAmbiguity flag to error on ambiguous matches
345
+ console.log("Namespace:", ns);
346
+ ```
347
+
348
+ ## Advanced Usage
349
+
350
+ ### Working with Attributes
351
+
352
+ ```typescript
353
+ // Use new() for default namespace
354
+ const entity = Entity.new("Warehouse");
355
+ entity.setAttribute("capacity", JSON.stringify(10000));
356
+ entity.setAttribute("location", JSON.stringify({ lat: 40.7128, lng: -74.006 }));
357
+
358
+ const capacity = JSON.parse(entity.getAttribute("capacity")!); // 10000
359
+ const location = JSON.parse(entity.getAttribute("location")!); // { lat: 40.7128, lng: -74.0060 }
360
+
361
+ // Namespace is always present (not undefined)
362
+ console.log(entity.namespace()); // "default"
363
+ ```
364
+
365
+ ### Querying Flow Networks
366
+
367
+ ```typescript
368
+ const graph = Graph.parse(`
369
+ Entity "Supplier"
370
+ Entity "Warehouse"
371
+ Entity "Retailer"
372
+ Resource "Products" units
373
+ Flow "Products" from "Supplier" to "Warehouse" quantity 1000
374
+ Flow "Products" from "Warehouse" to "Retailer" quantity 800
375
+ `);
376
+
377
+ const warehouseId = graph.findEntityByName("Warehouse");
378
+ const inboundFlows = graph.flowsTo(warehouseId!);
379
+ const outboundFlows = graph.flowsFrom(warehouseId!);
380
+
381
+ console.log(`Warehouse receives ${inboundFlows.length} flows`);
382
+ console.log(`Warehouse sends ${outboundFlows.length} flows`);
383
+ ```
384
+
385
+ ## Building from Source
386
+
387
+ ```bash
388
+ # Install dependencies
389
+ npm install
390
+
391
+ # Build the native module
392
+ npm run build
393
+
394
+ # Run tests
395
+ npm test
396
+ ```
397
+
398
+ ## Platform Support
399
+
400
+ Pre-built binaries are available for:
401
+
402
+ - Linux x64
403
+ - macOS ARM64 (Apple Silicon)
404
+ - Windows x64
405
+
406
+ Build from source for other platforms using `npm run build`.
407
+
408
+ ## Semantic Pack API
409
+
410
+ The `@godspeedai/domainforge` module exposes semantic pack enums and functions for building, validating, signing, and inspecting packs programmatically.
411
+
412
+ ### Enums
413
+
414
+ ```typescript
415
+ import {
416
+ SemanticTruth, // Valid = 0, Invalid = 1, Unknown = 2
417
+ DiagnosticSeverity, // Error = 0, Warning = 1, Info = 2, Hint = 3
418
+ ValidationMode, // Off = 0, Warn = 1, Strict = 2
419
+ ApprovalState, // Candidate = 0, Approved = 1, Rejected = 2
420
+ SignatureState, // Unsigned = 0, Signed = 1, InvalidSignature = 2
421
+ ConceptStatus, // Active = 0, Proposed = 1, Deprecated = 2, Rejected = 3, ExternalOnly = 4
422
+ ConceptKind, // Entity = 0, Resource = 1, Role = 2, Flow = 3, Policy = 4, Metric = 5, Dimension = 6, Unit = 7, External = 8
423
+ AliasStatus, // Approved = 0, Deprecated = 1, Ambiguous = 2, Blocked = 3
424
+ SemanticValidationStatus, // Passed = 0, Failed = 1, Unknown = 2, Blocked = 3
425
+ } from "@godspeedai/domainforge";
426
+ ```
427
+
428
+ ### Functions
429
+
430
+ #### semanticPackBuild
431
+
432
+ Build a semantic pack from input JSON. Returns a JSON string with `pack`, `pack_content_hash`, `meaning_fingerprint`, `pre_pack_diagnostics`, and `build_warnings`.
433
+
434
+ ```typescript
435
+ const result = semanticPackBuild(inputJson);
436
+ const { pack, pack_content_hash, meaning_fingerprint } = JSON.parse(result);
437
+ ```
438
+
439
+ #### semanticPackValidate
440
+
441
+ Validate a pack's internal consistency. Returns a JSON array of diagnostics.
442
+
443
+ ```typescript
444
+ const diagnosticsJson = semanticPackValidate(packJson);
445
+ ```
446
+
447
+ #### semanticPackValidateGraph
448
+
449
+ Validate a source against a pack with options. Returns a JSON validation result.
450
+
451
+ ```typescript
452
+ const resultJson = semanticPackValidateGraph(packJson, "source_uri", optionsJson);
453
+ ```
454
+
455
+ #### semanticPackSign
456
+
457
+ Sign a pack with an Ed25519 private key (PEM string). Returns the signed pack JSON.
458
+
459
+ ```typescript
460
+ const signedJson = semanticPackSign(packJson, privateKeyPem);
461
+ ```
462
+
463
+ #### semanticPackVerify
464
+
465
+ Verify a pack's Ed25519 signature. Returns `true` if valid, throws on failure.
466
+
467
+ ```typescript
468
+ const isValid: boolean = semanticPackVerify(packJson, publicKeyPem);
469
+ ```
470
+
471
+ #### semanticPackDiff
472
+
473
+ Compare two packs. Returns a JSON diff with entries and summary.
474
+
475
+ ```typescript
476
+ const diffJson = semanticPackDiff(oldPackJson, newPackJson);
477
+ ```
478
+
479
+ #### semanticPackHash
480
+
481
+ Compute the content hash of a pack (excluding signature fields).
482
+
483
+ ```typescript
484
+ const hash: string = semanticPackHash(packJson);
485
+ ```
486
+
487
+ #### semanticNormalizeKey
488
+
489
+ Normalize a term for lookup (NFC, case-fold, whitespace collapse).
490
+
491
+ ```typescript
492
+ const normalized: string = semanticNormalizeKey(" Hello World "); // "hello world"
493
+ ```
494
+
495
+ #### semanticResolveConcept
496
+
497
+ Resolve a term against a pack. Returns a JSON object with `resolved_concept_id`, `semantic_truth`, `diagnostic_code`, `diagnostic_severity`, `message`, and `suggestions`.
498
+
499
+ ```typescript
500
+ const resultJson = semanticResolveConcept("Supplier", packJson, optionsJson);
501
+ const result = JSON.parse(resultJson);
502
+ console.log(result.resolved_concept_id); // "supplier" or null
503
+ console.log(result.semantic_truth); // "valid", "invalid", or "unknown"
504
+ ```
505
+
506
+ ## License
507
+
508
+ Apache-2.0