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,146 @@
1
+ /// TypeScript-native error handling for domainforge
2
+ ///
3
+ /// This module provides error conversion that creates native JavaScript/TypeScript
4
+ /// Error objects with typed properties. TypeScript users should never see Rust errors.
5
+ use crate::validation_error::ValidationError;
6
+ use napi::bindgen_prelude::*;
7
+
8
+ /// Convert ValidationError to napi Error with custom properties
9
+ pub fn to_napi_error(err: ValidationError) -> Error {
10
+ let code = err.error_code().as_str().to_string();
11
+ let error_type = match &err {
12
+ ValidationError::SyntaxError { .. } => "SyntaxError",
13
+ ValidationError::TypeError { .. } => "TypeError",
14
+ ValidationError::UnitError { .. } => "UnitError",
15
+ ValidationError::UndefinedReference { .. } => "ReferenceError",
16
+ ValidationError::ScopeError { .. } => "ScopeError",
17
+ ValidationError::DuplicateDeclaration { .. } => "DuplicateDeclaration",
18
+ ValidationError::DeterminismError { .. } => "DeterminismError",
19
+ ValidationError::InvalidExpression { .. } => "InvalidExpression",
20
+ };
21
+
22
+ let message = err.to_string();
23
+ let mut error = Error::from_reason(message);
24
+
25
+ // Add error-specific properties based on variant
26
+ match err {
27
+ ValidationError::SyntaxError {
28
+ line,
29
+ column,
30
+ end_line,
31
+ end_column,
32
+ ..
33
+ } => {
34
+ // Store as JSON string since napi Error doesn't support arbitrary properties directly
35
+ let metadata = serde_json::json!({
36
+ "code": code,
37
+ "errorType": error_type,
38
+ "line": line,
39
+ "column": column,
40
+ "endLine": end_line,
41
+ "endColumn": end_column,
42
+ });
43
+ attach_metadata(&mut error, metadata);
44
+ }
45
+ ValidationError::TypeError {
46
+ expected_type,
47
+ found_type,
48
+ suggestion,
49
+ ..
50
+ } => {
51
+ let metadata = serde_json::json!({
52
+ "code": code,
53
+ "errorType": error_type,
54
+ "expected": expected_type,
55
+ "found": found_type,
56
+ "suggestion": suggestion,
57
+ });
58
+ attach_metadata(&mut error, metadata);
59
+ }
60
+ ValidationError::UnitError {
61
+ expected,
62
+ found,
63
+ suggestion,
64
+ ..
65
+ } => {
66
+ let metadata = serde_json::json!({
67
+ "code": code,
68
+ "errorType": error_type,
69
+ "expectedDimension": format!("{}", expected),
70
+ "foundDimension": format!("{}", found),
71
+ "suggestion": suggestion,
72
+ });
73
+ attach_metadata(&mut error, metadata);
74
+ }
75
+ ValidationError::UndefinedReference {
76
+ reference_type,
77
+ name,
78
+ suggestion,
79
+ ..
80
+ } => {
81
+ let metadata = serde_json::json!({
82
+ "code": code,
83
+ "errorType": error_type,
84
+ "referenceType": reference_type.to_string(),
85
+ "name": name,
86
+ "suggestion": suggestion,
87
+ });
88
+ attach_metadata(&mut error, metadata);
89
+ }
90
+ ValidationError::ScopeError {
91
+ variable,
92
+ available_in,
93
+ suggestion,
94
+ ..
95
+ } => {
96
+ let metadata = serde_json::json!({
97
+ "code": code,
98
+ "errorType": error_type,
99
+ "variable": variable,
100
+ "availableIn": available_in,
101
+ "suggestion": suggestion,
102
+ });
103
+ attach_metadata(&mut error, metadata);
104
+ }
105
+ ValidationError::DuplicateDeclaration {
106
+ name,
107
+ first_location,
108
+ second_location,
109
+ } => {
110
+ let metadata = serde_json::json!({
111
+ "code": code,
112
+ "errorType": error_type,
113
+ "name": name,
114
+ "firstLocation": first_location,
115
+ "secondLocation": second_location,
116
+ });
117
+ attach_metadata(&mut error, metadata);
118
+ }
119
+ ValidationError::DeterminismError { hint, .. } => {
120
+ let metadata = serde_json::json!({
121
+ "code": code,
122
+ "errorType": error_type,
123
+ "hint": hint,
124
+ });
125
+ attach_metadata(&mut error, metadata);
126
+ }
127
+ ValidationError::InvalidExpression { suggestion, .. } => {
128
+ let metadata = serde_json::json!({
129
+ "code": code,
130
+ "errorType": error_type,
131
+ "suggestion": suggestion,
132
+ });
133
+ attach_metadata(&mut error, metadata);
134
+ }
135
+ }
136
+
137
+ error
138
+ }
139
+
140
+ fn attach_metadata(error: &mut Error, metadata: serde_json::Value) {
141
+ error.reason = format!(
142
+ "{}\n__metadata__: {}",
143
+ error.reason,
144
+ serde_json::to_string(&metadata).unwrap_or_else(|e| format!("serialization_error: {}", e))
145
+ );
146
+ }
@@ -0,0 +1,76 @@
1
+ //! TypeScript bindings for the SEA formatter.
2
+
3
+ use crate::formatter::{format, FormatConfig, IndentStyle};
4
+ use napi::bindgen_prelude::*;
5
+ use napi_derive::napi;
6
+
7
+ /// Configuration options for the formatter.
8
+ #[napi(object)]
9
+ pub struct FormatOptions {
10
+ /// Number of spaces per indent level (default: 4)
11
+ pub indent_width: Option<u32>,
12
+ /// Use tabs instead of spaces for indentation (default: false)
13
+ pub use_tabs: Option<bool>,
14
+ /// Preserve comments in output (default: true)
15
+ pub preserve_comments: Option<bool>,
16
+ /// Sort imports alphabetically (default: true)
17
+ pub sort_imports: Option<bool>,
18
+ }
19
+
20
+ /// Format SEA-DSL source code.
21
+ ///
22
+ /// @param source - The SEA-DSL source code to format
23
+ /// @param options - Optional formatting configuration
24
+ /// @returns The formatted source code
25
+ /// @throws Error if the source code cannot be parsed
26
+ ///
27
+ /// @example
28
+ /// ```typescript
29
+ /// import { formatSource } from '@godspeedai/domainforge';
30
+ ///
31
+ /// const formatted = formatSource('Entity "Foo" in bar');
32
+ /// console.log(formatted); // Entity "Foo" in bar
33
+ /// ```
34
+ #[napi]
35
+ pub fn format_source(source: String, options: Option<FormatOptions>) -> Result<String> {
36
+ let opts = options.unwrap_or(FormatOptions {
37
+ indent_width: None,
38
+ use_tabs: None,
39
+ preserve_comments: None,
40
+ sort_imports: None,
41
+ });
42
+
43
+ let config = FormatConfig {
44
+ indent_width: opts.indent_width.unwrap_or(4) as usize,
45
+ indent_style: if opts.use_tabs.unwrap_or(false) {
46
+ IndentStyle::Tabs
47
+ } else {
48
+ IndentStyle::Spaces
49
+ },
50
+ preserve_comments: opts.preserve_comments.unwrap_or(true),
51
+ sort_imports: opts.sort_imports.unwrap_or(true),
52
+ ..Default::default()
53
+ };
54
+
55
+ format(&source, config).map_err(|e| Error::from_reason(e.to_string()))
56
+ }
57
+
58
+ /// Check if SEA-DSL source code is already formatted.
59
+ ///
60
+ /// @param source - The SEA-DSL source code to check
61
+ /// @param options - Optional formatting configuration
62
+ /// @returns True if the source is already formatted, false otherwise
63
+ /// @throws Error if the source code cannot be parsed
64
+ ///
65
+ /// @example
66
+ /// ```typescript
67
+ /// import { checkFormat } from '@godspeedai/domainforge';
68
+ ///
69
+ /// console.log(checkFormat('Entity "Foo" in bar\n')); // true
70
+ /// console.log(checkFormat('Entity "Foo" in bar')); // false
71
+ /// ```
72
+ #[napi]
73
+ pub fn check_format(source: String, options: Option<FormatOptions>) -> Result<bool> {
74
+ let formatted = format_source(source.clone(), options)?;
75
+ Ok(source == formatted)
76
+ }
@@ -0,0 +1,391 @@
1
+ #![allow(clippy::new_without_default, clippy::inherent_to_string)]
2
+
3
+ use crate::graph::Graph as RustGraph;
4
+ use crate::parser;
5
+ use napi::bindgen_prelude::*;
6
+ use napi_derive::napi;
7
+ use std::str::FromStr;
8
+ use uuid::Uuid;
9
+
10
+ use super::primitives::{Entity, Flow, Relation, Resource, ResourceInstance, Role};
11
+
12
+ #[napi]
13
+ pub struct Graph {
14
+ inner: RustGraph,
15
+ }
16
+
17
+ /// Helper function to parse a UUID string into a ConceptId
18
+ fn parse_concept_id(id: &str) -> Result<crate::ConceptId> {
19
+ let uuid =
20
+ Uuid::from_str(id).map_err(|e| Error::from_reason(format!("Invalid UUID: {}", e)))?;
21
+ Ok(crate::ConceptId::from(uuid))
22
+ }
23
+
24
+ #[napi]
25
+ impl Graph {
26
+ #[napi(constructor)]
27
+ pub fn new() -> Self {
28
+ Self {
29
+ inner: RustGraph::new(),
30
+ }
31
+ }
32
+
33
+ #[napi]
34
+ pub fn add_entity(&mut self, entity: &Entity) -> Result<()> {
35
+ self.inner
36
+ .add_entity(entity.inner_ref().clone())
37
+ .map_err(Error::from_reason)
38
+ }
39
+
40
+ #[napi]
41
+ pub fn add_resource(&mut self, resource: &Resource) -> Result<()> {
42
+ self.inner
43
+ .add_resource(resource.inner_ref().clone())
44
+ .map_err(Error::from_reason)
45
+ }
46
+
47
+ #[napi]
48
+ pub fn add_flow(&mut self, flow: &Flow) -> Result<()> {
49
+ self.inner
50
+ .add_flow(flow.inner_ref().clone())
51
+ .map_err(Error::from_reason)
52
+ }
53
+
54
+ #[napi]
55
+ pub fn add_instance(&mut self, instance: &ResourceInstance) -> Result<()> {
56
+ self.inner
57
+ .add_instance(instance.inner_ref().clone())
58
+ .map_err(Error::from_reason)
59
+ }
60
+
61
+ #[napi]
62
+ pub fn add_role(&mut self, role: &Role) -> Result<()> {
63
+ self.inner
64
+ .add_role(role.inner_ref().clone())
65
+ .map_err(Error::from_reason)
66
+ }
67
+
68
+ #[napi]
69
+ pub fn add_relation(&mut self, relation: &Relation) -> Result<()> {
70
+ self.inner
71
+ .add_relation_type(relation.inner_ref().clone())
72
+ .map_err(Error::from_reason)
73
+ }
74
+
75
+ #[napi]
76
+ pub fn entity_count(&self) -> u32 {
77
+ self.inner.entity_count() as u32
78
+ }
79
+
80
+ #[napi]
81
+ pub fn resource_count(&self) -> u32 {
82
+ self.inner.resource_count() as u32
83
+ }
84
+
85
+ #[napi]
86
+ pub fn flow_count(&self) -> u32 {
87
+ self.inner.flow_count() as u32
88
+ }
89
+
90
+ #[napi]
91
+ pub fn instance_count(&self) -> u32 {
92
+ self.inner.instance_count() as u32
93
+ }
94
+
95
+ #[napi]
96
+ pub fn pattern_count(&self) -> u32 {
97
+ self.inner.pattern_count() as u32
98
+ }
99
+
100
+ #[napi]
101
+ pub fn role_count(&self) -> u32 {
102
+ self.inner.role_count() as u32
103
+ }
104
+
105
+ #[napi]
106
+ pub fn relation_count(&self) -> u32 {
107
+ self.inner.relation_count() as u32
108
+ }
109
+
110
+ #[napi]
111
+ pub fn has_entity(&self, id: String) -> Result<bool> {
112
+ let cid = parse_concept_id(&id)?;
113
+ Ok(self.inner.has_entity(&cid))
114
+ }
115
+
116
+ #[napi]
117
+ pub fn has_resource(&self, id: String) -> Result<bool> {
118
+ let cid = parse_concept_id(&id)?;
119
+ Ok(self.inner.has_resource(&cid))
120
+ }
121
+
122
+ #[napi]
123
+ pub fn has_flow(&self, id: String) -> Result<bool> {
124
+ let cid = parse_concept_id(&id)?;
125
+ Ok(self.inner.has_flow(&cid))
126
+ }
127
+
128
+ #[napi]
129
+ pub fn has_instance(&self, id: String) -> Result<bool> {
130
+ let cid = parse_concept_id(&id)?;
131
+ Ok(self.inner.has_instance(&cid))
132
+ }
133
+
134
+ #[napi]
135
+ pub fn get_entity(&self, id: String) -> Result<Option<Entity>> {
136
+ let cid = parse_concept_id(&id)?;
137
+ Ok(self
138
+ .inner
139
+ .get_entity(&cid)
140
+ .map(|e| Entity::from_rust(e.clone())))
141
+ }
142
+
143
+ #[napi]
144
+ pub fn get_resource(&self, id: String) -> Result<Option<Resource>> {
145
+ let cid = parse_concept_id(&id)?;
146
+ Ok(self
147
+ .inner
148
+ .get_resource(&cid)
149
+ .map(|r| Resource::from_rust(r.clone())))
150
+ }
151
+
152
+ #[napi]
153
+ pub fn get_flow(&self, id: String) -> Result<Option<Flow>> {
154
+ let cid = parse_concept_id(&id)?;
155
+ Ok(self
156
+ .inner
157
+ .get_flow(&cid)
158
+ .map(|f| Flow::from_rust(f.clone())))
159
+ }
160
+
161
+ #[napi]
162
+ pub fn get_instance(&self, id: String) -> Result<Option<ResourceInstance>> {
163
+ let cid = parse_concept_id(&id)?;
164
+ Ok(self
165
+ .inner
166
+ .get_instance(&cid)
167
+ .map(|i| ResourceInstance::from_rust(i.clone())))
168
+ }
169
+
170
+ #[napi]
171
+ pub fn find_role_by_name(&self, name: String) -> Option<String> {
172
+ self.inner
173
+ .find_role_by_name(&name)
174
+ .map(|uuid| uuid.to_string())
175
+ }
176
+
177
+ #[napi]
178
+ pub fn find_entity_by_name(&self, name: String) -> Option<String> {
179
+ self.inner
180
+ .find_entity_by_name(&name)
181
+ .map(|uuid| uuid.to_string())
182
+ }
183
+
184
+ #[napi]
185
+ pub fn find_resource_by_name(&self, name: String) -> Option<String> {
186
+ self.inner
187
+ .find_resource_by_name(&name)
188
+ .map(|uuid| uuid.to_string())
189
+ }
190
+
191
+ #[napi]
192
+ pub fn flows_from(&self, entity_id: String) -> Result<Vec<Flow>> {
193
+ let cid = parse_concept_id(&entity_id)?;
194
+ Ok(self
195
+ .inner
196
+ .flows_from(&cid)
197
+ .into_iter()
198
+ .map(|f| Flow::from_rust(f.clone()))
199
+ .collect())
200
+ }
201
+
202
+ #[napi]
203
+ pub fn flows_to(&self, entity_id: String) -> Result<Vec<Flow>> {
204
+ let cid = parse_concept_id(&entity_id)?;
205
+ Ok(self
206
+ .inner
207
+ .flows_to(&cid)
208
+ .into_iter()
209
+ .map(|f| Flow::from_rust(f.clone()))
210
+ .collect())
211
+ }
212
+
213
+ #[napi]
214
+ pub fn all_entities(&self) -> Vec<Entity> {
215
+ self.inner
216
+ .all_entities()
217
+ .into_iter()
218
+ .map(|e| Entity::from_rust(e.clone()))
219
+ .collect()
220
+ }
221
+
222
+ #[napi]
223
+ pub fn all_resources(&self) -> Vec<Resource> {
224
+ self.inner
225
+ .all_resources()
226
+ .into_iter()
227
+ .map(|r| Resource::from_rust(r.clone()))
228
+ .collect()
229
+ }
230
+
231
+ #[napi]
232
+ pub fn all_flows(&self) -> Vec<Flow> {
233
+ self.inner
234
+ .all_flows()
235
+ .into_iter()
236
+ .map(|f| Flow::from_rust(f.clone()))
237
+ .collect()
238
+ }
239
+
240
+ #[napi]
241
+ pub fn all_instances(&self) -> Vec<ResourceInstance> {
242
+ self.inner
243
+ .all_instances()
244
+ .into_iter()
245
+ .map(|i| ResourceInstance::from_rust(i.clone()))
246
+ .collect()
247
+ }
248
+
249
+ #[napi]
250
+ pub fn all_roles(&self) -> Vec<Role> {
251
+ self.inner
252
+ .all_roles()
253
+ .into_iter()
254
+ .map(|r| Role::from_rust(r.clone()))
255
+ .collect()
256
+ }
257
+
258
+ #[napi]
259
+ pub fn all_relations(&self) -> Vec<Relation> {
260
+ self.inner
261
+ .all_relations()
262
+ .into_iter()
263
+ .map(|relation| Relation::from_rust(relation.clone()))
264
+ .collect()
265
+ }
266
+
267
+ #[napi(factory)]
268
+ pub fn parse(source: String) -> Result<Self> {
269
+ let graph = parser::parse_to_graph(&source)
270
+ .map_err(|e| Error::from_reason(format!("Parse error: {}", e)))?;
271
+
272
+ Ok(Self { inner: graph })
273
+ }
274
+
275
+ #[napi]
276
+ pub fn export_calm(&self) -> Result<String> {
277
+ crate::calm::export(&self.inner)
278
+ .and_then(|value| {
279
+ serde_json::to_string_pretty(&value)
280
+ .map_err(|e| format!("Serialization error: {}", e))
281
+ })
282
+ .map_err(Error::from_reason)
283
+ }
284
+
285
+ #[napi(factory)]
286
+ pub fn import_calm(calm_json: String) -> Result<Self> {
287
+ let value: serde_json::Value = serde_json::from_str(&calm_json)
288
+ .map_err(|e| Error::from_reason(format!("Invalid JSON: {}", e)))?;
289
+
290
+ let graph = crate::calm::import(value)
291
+ .map_err(|e| Error::from_reason(format!("Import error: {}", e)))?;
292
+
293
+ Ok(Self { inner: graph })
294
+ }
295
+
296
+ /// Export the graph to Protobuf .proto text format.
297
+ ///
298
+ /// @param package - The Protobuf package name (e.g., "com.example.api")
299
+ /// @param namespace - Optional namespace filter (undefined = all namespaces)
300
+ /// @param projectionName - Optional name for the projection (used in comments)
301
+ /// @param includeGovernance - Whether to include governance messages (PolicyViolation, MetricEvent)
302
+ /// @param includeServices - Whether to generate gRPC service definitions from Flow patterns
303
+ /// @returns The generated .proto file content as a string
304
+ #[napi]
305
+ pub fn export_protobuf(
306
+ &self,
307
+ package: String,
308
+ namespace: Option<String>,
309
+ projection_name: Option<String>,
310
+ include_governance: Option<bool>,
311
+ include_services: Option<bool>,
312
+ ) -> String {
313
+ let ns = namespace.as_deref().unwrap_or("");
314
+ let proj_name = projection_name.as_deref().unwrap_or("");
315
+ let include_gov = include_governance.unwrap_or(false);
316
+ let include_svc = include_services.unwrap_or(false);
317
+
318
+ let proto = crate::projection::ProtobufEngine::project_with_full_options(
319
+ &self.inner,
320
+ ns,
321
+ &package,
322
+ proj_name,
323
+ include_gov,
324
+ include_svc,
325
+ );
326
+ proto.to_proto_string()
327
+ }
328
+
329
+ #[napi]
330
+ pub fn add_policy(&mut self, policy_json: String) -> Result<()> {
331
+ let policy: crate::policy::Policy = serde_json::from_str(&policy_json)
332
+ .map_err(|e| Error::from_reason(format!("Invalid Policy JSON: {}", e)))?;
333
+ self.inner.add_policy(policy).map_err(Error::from_reason)
334
+ }
335
+
336
+ #[napi]
337
+ pub fn add_association(
338
+ &mut self,
339
+ owner: String,
340
+ owned: String,
341
+ rel_type: String,
342
+ ) -> Result<()> {
343
+ let owner_cid = parse_concept_id(&owner)?;
344
+ let owned_cid = parse_concept_id(&owned)?;
345
+ self.inner
346
+ .add_association(&owner_cid, &owned_cid, &rel_type)
347
+ .map_err(Error::from_reason)
348
+ }
349
+
350
+ /// Evaluate a Policy JSON payload against this Graph.
351
+ ///
352
+ /// The `policy_json` argument must be the JSON representation of `crate::policy::Policy`
353
+ /// (including fields like `id`, `name`, `modality`, `kind`, `version`, and `expression`).
354
+ /// Returns `EvaluationResult` exposed to TypeScript via napi, or an error if the policy JSON
355
+ /// is invalid or evaluation fails.
356
+ #[napi]
357
+ pub fn evaluate_policy(&self, policy_json: String) -> Result<super::policy::EvaluationResult> {
358
+ let policy: crate::policy::Policy = serde_json::from_str(&policy_json)
359
+ .map_err(|e| Error::from_reason(format!("Invalid Policy JSON: {}", e)))?;
360
+ let result = policy
361
+ .evaluate(&self.inner)
362
+ .map_err(|e| Error::from_reason(format!("Policy evaluation error: {}", e)))?;
363
+ Ok(result.into())
364
+ }
365
+
366
+ /// Set the evaluation mode for policy evaluation.
367
+ /// When `useThreeValuedLogic` is true, policies will use three-valued logic (true, false, null).
368
+ /// When false, policies will use strict boolean logic (true, false).
369
+ #[napi]
370
+ pub fn set_evaluation_mode(&mut self, use_three_valued_logic: bool) {
371
+ self.inner.set_evaluation_mode(use_three_valued_logic);
372
+ }
373
+
374
+ /// Get the current evaluation mode.
375
+ /// Returns true if three-valued logic is enabled, false otherwise.
376
+ #[napi]
377
+ pub fn use_three_valued_logic(&self) -> bool {
378
+ self.inner.use_three_valued_logic()
379
+ }
380
+
381
+ #[napi]
382
+ pub fn to_string(&self) -> String {
383
+ format!(
384
+ "Graph(entities={}, resources={}, flows={}, instances={})",
385
+ self.inner.entity_count(),
386
+ self.inner.resource_count(),
387
+ self.inner.flow_count(),
388
+ self.inner.instance_count()
389
+ )
390
+ }
391
+ }
@@ -0,0 +1,9 @@
1
+ pub mod authority;
2
+ pub mod error;
3
+ pub mod formatter;
4
+ pub mod graph;
5
+ pub mod policy;
6
+ pub mod primitives;
7
+ pub mod registry;
8
+ pub mod semantic_pack;
9
+ pub mod units;