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,366 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>SEA DSL WASM Browser Example</title>
7
+ <style>
8
+ body {
9
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
10
+ max-width: 1200px;
11
+ margin: 0 auto;
12
+ padding: 20px;
13
+ background: #f5f5f5;
14
+ }
15
+ h1 {
16
+ color: #333;
17
+ border-bottom: 2px solid #4CAF50;
18
+ padding-bottom: 10px;
19
+ }
20
+ .container {
21
+ display: grid;
22
+ grid-template-columns: 1fr 1fr;
23
+ gap: 20px;
24
+ margin-top: 20px;
25
+ }
26
+ .panel {
27
+ background: white;
28
+ padding: 20px;
29
+ border-radius: 8px;
30
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
31
+ }
32
+ .panel h2 {
33
+ margin-top: 0;
34
+ color: #4CAF50;
35
+ font-size: 1.2em;
36
+ }
37
+ textarea {
38
+ width: 100%;
39
+ min-height: 300px;
40
+ padding: 10px;
41
+ font-family: 'Courier New', monospace;
42
+ font-size: 14px;
43
+ border: 1px solid #ddd;
44
+ border-radius: 4px;
45
+ resize: vertical;
46
+ }
47
+ button {
48
+ background: #4CAF50;
49
+ color: white;
50
+ border: none;
51
+ padding: 12px 24px;
52
+ border-radius: 4px;
53
+ cursor: pointer;
54
+ font-size: 16px;
55
+ margin-top: 10px;
56
+ transition: background 0.3s;
57
+ }
58
+ button:hover {
59
+ background: #45a049;
60
+ }
61
+ button:disabled {
62
+ background: #ccc;
63
+ cursor: not-allowed;
64
+ }
65
+ .output {
66
+ background: #f9f9f9;
67
+ padding: 15px;
68
+ border-radius: 4px;
69
+ border: 1px solid #e0e0e0;
70
+ margin-top: 10px;
71
+ min-height: 100px;
72
+ max-height: 400px;
73
+ overflow-y: auto;
74
+ }
75
+ pre {
76
+ margin: 0;
77
+ white-space: pre-wrap;
78
+ word-wrap: break-word;
79
+ font-family: 'Courier New', monospace;
80
+ font-size: 13px;
81
+ }
82
+ .stats {
83
+ display: flex;
84
+ gap: 20px;
85
+ margin: 10px 0;
86
+ }
87
+ .stat {
88
+ flex: 1;
89
+ background: #e8f5e9;
90
+ padding: 10px;
91
+ border-radius: 4px;
92
+ text-align: center;
93
+ }
94
+ .stat-value {
95
+ font-size: 24px;
96
+ font-weight: bold;
97
+ color: #2e7d32;
98
+ }
99
+ .stat-label {
100
+ font-size: 12px;
101
+ color: #666;
102
+ text-transform: uppercase;
103
+ }
104
+ .error {
105
+ color: #d32f2f;
106
+ background: #ffebee;
107
+ padding: 10px;
108
+ border-radius: 4px;
109
+ margin-top: 10px;
110
+ }
111
+ .success {
112
+ color: #2e7d32;
113
+ background: #e8f5e9;
114
+ padding: 10px;
115
+ border-radius: 4px;
116
+ margin-top: 10px;
117
+ }
118
+ .loading {
119
+ color: #1976d2;
120
+ font-style: italic;
121
+ }
122
+ </style>
123
+ </head>
124
+ <body>
125
+ <h1>🧭 SEA DSL WebAssembly Browser Demo</h1>
126
+
127
+ <div class="container">
128
+ <div class="panel">
129
+ <h2>Input: SEA DSL Code</h2>
130
+ <textarea id="input" placeholder="Enter SEA DSL code here...">Entity "Warehouse" in logistics
131
+ Entity "Factory" in manufacturing
132
+ Entity "Store" in retail
133
+
134
+ Resource "Cameras" units
135
+ Resource "Steel" kg
136
+
137
+ Flow "Cameras" from "Warehouse" to "Factory" quantity 100
138
+ Flow "Cameras" from "Factory" to "Store" quantity 80
139
+ Flow "Steel" from "Warehouse" to "Factory" quantity 500</textarea>
140
+ <button id="parseBtn" onclick="parseAndAnalyze()">Parse & Analyze</button>
141
+ <button id="buildBtn" onclick="buildProgrammatically()">Build Programmatically</button>
142
+ </div>
143
+
144
+ <div class="panel">
145
+ <h2>Output: Analysis Results</h2>
146
+ <div class="stats" id="stats" style="display: none;">
147
+ <div class="stat">
148
+ <div class="stat-value" id="entityCount">0</div>
149
+ <div class="stat-label">Entities</div>
150
+ </div>
151
+ <div class="stat">
152
+ <div class="stat-value" id="resourceCount">0</div>
153
+ <div class="stat-label">Resources</div>
154
+ </div>
155
+ <div class="stat">
156
+ <div class="stat-value" id="flowCount">0</div>
157
+ <div class="stat-label">Flows</div>
158
+ </div>
159
+ <div class="stat">
160
+ <div class="stat-value" id="instanceCount">0</div>
161
+ <div class="stat-label">Instances</div>
162
+ </div>
163
+ </div>
164
+ <div class="output" id="output">
165
+ <p class="loading">Ready to parse. Click "Parse & Analyze" or "Build Programmatically".</p>
166
+ </div>
167
+ </div>
168
+ </div>
169
+
170
+ <script type="module">
171
+ import { Graph, Entity, Resource, Flow, preloadWasm } from '../pkg/index.js';
172
+
173
+ // HTML escaping utility
174
+ function escapeHtml(text) {
175
+ const div = document.createElement('div');
176
+ div.textContent = text;
177
+ return div.innerHTML;
178
+ }
179
+
180
+ let wasmReady = false;
181
+
182
+ async function initialize() {
183
+ // Show loading indicator and disable buttons
184
+ const output = document.getElementById('output');
185
+ const parseBtn = document.getElementById('parseBtn');
186
+ const buildBtn = document.getElementById('buildBtn');
187
+
188
+ output.innerHTML = '<div class="loading">Loading WASM module...</div>';
189
+ parseBtn.disabled = true;
190
+ buildBtn.disabled = true;
191
+
192
+ try {
193
+ await preloadWasm();
194
+ wasmReady = true;
195
+ console.log('WASM module loaded successfully');
196
+ output.innerHTML = '<p class="loading">Ready to parse. Click "Parse & Analyze" or "Build Programmatically".</p>';
197
+ parseBtn.disabled = false;
198
+ buildBtn.disabled = false;
199
+ } catch (error) {
200
+ console.error('Failed to load WASM:', error);
201
+ output.innerHTML =
202
+ `<div class="error">Failed to load WASM module: ${escapeHtml(error?.message ?? String(error))}</div>`;
203
+ // Keep buttons disabled on error
204
+ }
205
+ }
206
+
207
+ // Initialize asynchronously
208
+ (async () => {
209
+ await initialize();
210
+ })();
211
+ if (!wasmReady) {
212
+ document.getElementById('output').innerHTML =
213
+ '<div class="error">WASM module not ready. Please wait...</div>';
214
+ return;
215
+ }
216
+
217
+ const input = document.getElementById('input').value;
218
+ const output = document.getElementById('output');
219
+ const parseBtn = document.getElementById('parseBtn');
220
+
221
+ parseBtn.disabled = true;
222
+ output.innerHTML = '<p class="loading">Parsing...</p>';
223
+
224
+ try {
225
+ const graph = await Graph.parse(input);
226
+
227
+ const entityCount = graph.entityCount();
228
+ const resourceCount = graph.resourceCount();
229
+ const flowCount = graph.flowCount();
230
+ const instanceCount = graph.instanceCount();
231
+
232
+ document.getElementById('entityCount').textContent = entityCount;
233
+ document.getElementById('resourceCount').textContent = resourceCount;
234
+ document.getElementById('flowCount').textContent = flowCount;
235
+ document.getElementById('instanceCount').textContent = instanceCount;
236
+ document.getElementById('stats').style.display = 'flex';
237
+
238
+ let result = '<div class="success">✓ Parsing successful!</div>';
239
+
240
+ result += '<h3>Graph Structure:</h3>';
241
+ const graphJson = graph.toJSON();
242
+ result += `<pre>${JSON.stringify(graphJson, null, 2)}</pre>`;
243
+
244
+ if (entityCount > 0) {
245
+ result += '<h3>Entities:</h3>';
246
+ const entities = graph.allEntities();
247
+ entities.forEach(entity => {
248
+ const ns = entity.namespace ? ` (namespace: ${escapeHtml(entity.namespace)})` : '';
249
+ result += `<p>• <strong>${escapeHtml(entity.name)}</strong>${ns}<br>ID: ${entity.id}</p>`;
250
+ });
251
+ }
252
+
253
+ if (resourceCount > 0) {
254
+ result += '<h3>Resources:</h3>';
255
+ const resources = graph.allResources();
256
+ resources.forEach(resource => {
257
+ result += `<p>• <strong>${escapeHtml(resource.name)}</strong> (${escapeHtml(resource.unit)})<br>ID: ${resource.id}</p>`;
258
+ });
259
+ }
260
+
261
+ if (flowCount > 0) {
262
+ result += '<h3>Flows:</h3>';
263
+ const flows = graph.allFlows();
264
+ flows.forEach(flow => {
265
+ const fromEntity = graph.getEntity(flow.fromId);
266
+ const toEntity = graph.getEntity(flow.toId);
267
+ const resource = graph.getResource(flow.resourceId);
268
+ result += `<p>• ${flow.quantity} ${resource ? escapeHtml(resource.unit) : 'units'} of <strong>${resource ? escapeHtml(resource.name) : 'unknown'}</strong><br>`;
269
+ result += ` From: ${fromEntity ? escapeHtml(fromEntity.name) : 'unknown'} → To: ${toEntity ? escapeHtml(toEntity.name) : 'unknown'}</p>`;
270
+ });
271
+ }
272
+
273
+ output.innerHTML = result;
274
+ } catch (error) {
275
+ output.innerHTML = `<div class="error"><strong>Parse Error:</strong><br>${escapeHtml(error?.message ?? String(error))}</div>`;
276
+ document.getElementById('stats').style.display = 'none';
277
+ } finally {
278
+ parseBtn.disabled = false;
279
+ }
280
+ };
281
+
282
+ window.buildProgrammatically = async function() {
283
+ if (!wasmReady) {
284
+ document.getElementById('output').innerHTML =
285
+ '<div class="error">WASM module not ready. Please wait...</div>';
286
+ return;
287
+ }
288
+
289
+ const output = document.getElementById('output');
290
+ const buildBtn = document.getElementById('buildBtn');
291
+
292
+ buildBtn.disabled = true;
293
+ output.innerHTML = '<p class="loading">Building graph...</p>';
294
+
295
+ try {
296
+ const graph = new Graph();
297
+
298
+ const warehouse = new Entity('Warehouse', 'logistics');
299
+ const factory = new Entity('Factory', 'manufacturing');
300
+ const store = new Entity('Store', 'retail');
301
+
302
+ await graph.addEntity(warehouse);
303
+ await graph.addEntity(factory);
304
+ await graph.addEntity(store);
305
+
306
+ const cameras = new Resource('Cameras', 'units', null);
307
+ const steel = new Resource('Steel', 'kg', null);
308
+
309
+ await graph.addResource(cameras);
310
+ await graph.addResource(steel);
311
+
312
+ const flow1 = new Flow(cameras.id, warehouse.id, factory.id, '100');
313
+ const flow2 = new Flow(cameras.id, factory.id, store.id, '80');
314
+ const flow3 = new Flow(steel.id, warehouse.id, factory.id, '500');
315
+
316
+ await graph.addFlow(flow1);
317
+ await graph.addFlow(flow2);
318
+ await graph.addFlow(flow3);
319
+
320
+ document.getElementById('entityCount').textContent = graph.entityCount();
321
+ document.getElementById('resourceCount').textContent = graph.resourceCount();
322
+ document.getElementById('flowCount').textContent = graph.flowCount();
323
+ document.getElementById('instanceCount').textContent = graph.instanceCount();
324
+ document.getElementById('stats').style.display = 'flex';
325
+
326
+ let result = '<div class="success">✓ Graph built successfully!</div>';
327
+ result += '<h3>Programmatically Created:</h3>';
328
+ result += `<p>• 3 Entities: Warehouse, Factory, Store</p>`;
329
+ result += `<p>• 2 Resources: Cameras (units), Steel (kg)</p>`;
330
+ result += `<p>• 3 Flows:</p>`;
331
+ result += `<ul>
332
+ <li>100 units of Cameras: Warehouse → Factory</li>
333
+ <li>80 units of Cameras: Factory → Store</li>
334
+ <li>500 kg of Steel: Warehouse → Factory</li>
335
+ </ul>`;
336
+
337
+ result += '<h3>Graph Traversal Example:</h3>';
338
+ const warehouseFlows = await graph.flowsFrom(warehouse.id);
339
+ result += `<p>Flows from Warehouse: ${warehouseFlows.length}</p>`;
340
+
341
+ const factoryUpstream = await graph.upstreamEntities(factory.id);
342
+ result += `<p>Upstream entities of Factory: ${factoryUpstream.map(e => escapeHtml(e.name)).join(', ')}</p>`;
343
+
344
+ const factoryDownstream = await graph.downstreamEntities(factory.id);
345
+ result += `<p>Downstream entities of Factory: ${factoryDownstream.map(e => escapeHtml(e.name)).join(', ')}</p>`;
346
+
347
+ result += '<h3>Complete Graph JSON:</h3>';
348
+ const graphJson = graph.toJSON();
349
+ result += `<pre>${JSON.stringify(graphJson, null, 2)}</pre>`;
350
+
351
+ output.innerHTML = result;
352
+ } catch (error) {
353
+ output.innerHTML = `<div class="error"><strong>Build Error:</strong><br>${escapeHtml(error?.message ?? String(error))}</div>`;
354
+ document.getElementById('stats').style.display = 'none';
355
+ } finally {
356
+ buildBtn.disabled = false;
357
+ }
358
+ };
359
+
360
+ // Initialize asynchronously
361
+ (async () => {
362
+ await initialize();
363
+ })();
364
+ </script>
365
+ </body>
366
+ </html>
@@ -0,0 +1,5 @@
1
+ Entity "Accounts Payable" in finance
2
+ Entity "Accounts Receivable" in finance
3
+ Entity "Customer" in finance
4
+ Resource "Invoice" units in finance
5
+ Flow "Invoice" from "Customer" to "Accounts Receivable" quantity 5
@@ -0,0 +1,7 @@
1
+ Entity "Warehouse"
2
+ Entity "Factory"
3
+ Resource "Camera" units
4
+ Flow "Camera" from "Warehouse" to "Factory" quantity 100
5
+
6
+ Policy logistics_flow as:
7
+ Entity.name != ""
@@ -0,0 +1,38 @@
1
+ // Example: Observability Semantics with Metrics
2
+ // This example demonstrates how to define metrics for monitoring and alerting
3
+
4
+ @namespace "com.example.payments"
5
+ @namespace "com.example.finance"
6
+
7
+ // Define entities
8
+ Entity "PaymentProcessor" in com.example.payments
9
+ Entity "Customer" in com.example.payments
10
+
11
+ // Define resources
12
+ Resource "Money" USD in com.example.finance
13
+
14
+ // Define flows
15
+ Flow "Money" from "Customer" to "PaymentProcessor" quantity 1000
16
+
17
+ // Metric: Total payment volume
18
+ // Tracks the total amount of money flowing through the system
19
+ Metric "total_payment_volume" as:
20
+ sum(f in flows where f.resource = "Money": f.quantity as "USD")
21
+ @refresh_interval 60 "seconds"
22
+ @unit "USD"
23
+
24
+ // Metric: Payment count
25
+ // Counts all money flows
26
+ Metric "payment_count" as:
27
+ count(f in flows where f.resource = "Money": f.quantity)
28
+ @threshold 100
29
+ @severity "warning"
30
+ @refresh_interval 300 "seconds"
31
+
32
+ // Metric: Average payment value
33
+ // Monitors the average value of payments
34
+ Metric "avg_payment_value" as:
35
+ avg(f in flows where f.resource = "Money": f.quantity as "USD")
36
+ @unit "USD"
37
+ @refresh_interval 120 "seconds"
38
+ @target 5000
@@ -0,0 +1,39 @@
1
+ namespace acme.procurement
2
+
3
+ entity Supplier {
4
+ description: "A party that provides goods or services to the organization"
5
+ owner: "procurement-team@acme.com"
6
+ }
7
+
8
+ entity PurchaseOrder {
9
+ description: "A formal request to a supplier to deliver goods or services"
10
+ owner: "procurement-team@acme.com"
11
+ }
12
+
13
+ entity MaterialLot {
14
+ description: "A specific batch of physical materials received from a supplier"
15
+ owner: "warehouse-team@acme.com"
16
+ }
17
+
18
+ entity InspectionRecord {
19
+ description: "A record of quality inspection performed on received materials"
20
+ owner: "quality-team@acme.com"
21
+ }
22
+
23
+ entity CorrectiveAction {
24
+ description: "An action taken to address a quality issue identified during inspection"
25
+ owner: "quality-team@acme.com"
26
+ }
27
+
28
+ entity InventoryItem {
29
+ description: "An item tracked in the organization's inventory system"
30
+ owner: "warehouse-team@acme.com"
31
+ }
32
+
33
+ entity CashRegister {
34
+ description: "A point-of-sale terminal for processing financial transactions"
35
+ owner: "finance-team@acme.com"
36
+ }
37
+
38
+ alias Vendor for Supplier
39
+ alias PO for PurchaseOrder
@@ -0,0 +1,11 @@
1
+ namespace acme.procurement
2
+
3
+ metric SupplierOnTimeDeliveryRate {
4
+ unit: percent
5
+ threshold: 95.0
6
+ }
7
+
8
+ metric DefectRate {
9
+ unit: percent
10
+ threshold: 2.0
11
+ }
@@ -0,0 +1,7 @@
1
+ namespace acme.procurement
2
+
3
+ relation Supplier supplies MaterialLot
4
+ relation PurchaseOrder orders MaterialLot
5
+ relation MaterialLot requires InspectionRecord
6
+ relation InspectionRecord triggers CorrectiveAction
7
+ relation MaterialLot stored_as InventoryItem
@@ -0,0 +1,9 @@
1
+ namespace acme.procurement
2
+
3
+ resource Goods {
4
+ description: "Physical items provided by a supplier"
5
+ }
6
+
7
+ resource Payment {
8
+ description: "Financial transfer from buyer to supplier"
9
+ }
@@ -0,0 +1,7 @@
1
+ {"decision_id":"rev_2026_0001","subject_type":"concept","subject_id":"supplier","decision":"approve","rationale":"Supplier is the canonical procurement party providing goods or services.","reviewer":"domain-owner@acme.com","reviewed_at":"2026-06-07T00:00:00Z","definition_hash":"sha256:dad17cd9b0d34bbcc7f8213a10860cb628abbc3c59d74759e375511581b4b51b"}
2
+ {"decision_id":"rev_2026_0002","subject_type":"concept","subject_id":"purchase_order","decision":"approve","rationale":"PurchaseOrder represents a formal procurement request.","reviewer":"domain-owner@acme.com","reviewed_at":"2026-06-07T00:00:00Z","definition_hash":"sha256:b1d61945b7b26747803ada9aa3394ab766a6fc6822c1b507d7a75b3e2f632ec4"}
3
+ {"decision_id":"rev_2026_0003","subject_type":"concept","subject_id":"material_lot","decision":"approve","rationale":"MaterialLot tracks physical material batches from suppliers.","reviewer":"domain-owner@acme.com","reviewed_at":"2026-06-07T00:00:00Z","definition_hash":"sha256:b1723b2722dc65b42f645f2bf0e4a8e22c9e7eed26f8d3eab4274044c3f30b93"}
4
+ {"decision_id":"rev_2026_0004","subject_type":"concept","subject_id":"inspection_record","decision":"approve","rationale":"InspectionRecord documents quality inspection results.","reviewer":"domain-owner@acme.com","reviewed_at":"2026-06-07T00:00:00Z","definition_hash":"sha256:4701f7289c0ab380a4ff245dc2eeb0d2cf79f48b5e7b9051c1b7cf5b510379f1"}
5
+ {"decision_id":"rev_2026_0005","subject_type":"concept","subject_id":"corrective_action","decision":"approve","rationale":"CorrectiveAction addresses quality issues from inspections.","reviewer":"domain-owner@acme.com","reviewed_at":"2026-06-07T00:00:00Z","definition_hash":"sha256:0f0f71a37817c37e9b77a918e880394f2314b2898a3321f4a39805f8fd44d0a2"}
6
+ {"decision_id":"rev_2026_0006","subject_type":"concept","subject_id":"inventory_item","decision":"approve","rationale":"InventoryItem tracks items in the organization's inventory system.","reviewer":"domain-owner@acme.com","reviewed_at":"2026-06-07T00:00:00Z","definition_hash":"sha256:a2851ab66737267068f9f3582b2b9073e89424f55d3e9c7b67f9b98e4ded189f"}
7
+ {"decision_id":"rev_2026_0007","subject_type":"concept","subject_id":"cash_register","decision":"approve","rationale":"CashRegister handles point-of-sale financial transactions.","reviewer":"domain-owner@acme.com","reviewed_at":"2026-06-07T00:00:00Z","definition_hash":"sha256:d522a36889d8ea4bb2fbb616d14042a4aa31fcfd4b1c6c6b0797432c52c859ae"}
@@ -0,0 +1,8 @@
1
+ namespace acme.procurement
2
+
3
+ policy AmbiguousVendorAlias {
4
+ description: "A policy using the ambiguous Provider alias"
5
+ subject: Provider
6
+ object: PurchaseOrder
7
+ predicate: "can create"
8
+ }
@@ -0,0 +1,8 @@
1
+ namespace acme.procurement
2
+
3
+ policy DeprecatedVendorAlias {
4
+ description: "A policy using the deprecated Vendor alias"
5
+ subject: Vendor
6
+ object: PurchaseOrder
7
+ predicate: "can create"
8
+ }
@@ -0,0 +1,3 @@
1
+ namespace acme.procurement
2
+
3
+ relation NonExistentEntity supplies PhantomConcept
@@ -0,0 +1,8 @@
1
+ namespace acme.procurement
2
+
3
+ policy ProposedConceptPolicy {
4
+ description: "A policy referencing a proposed concept"
5
+ subject: ProposedSupplier
6
+ object: PurchaseOrder
7
+ predicate: "can create"
8
+ }
@@ -0,0 +1,8 @@
1
+ namespace acme.procurement
2
+
3
+ policy RejectedConceptPolicy {
4
+ description: "A policy referencing a rejected concept"
5
+ subject: RejectedEntity
6
+ object: PurchaseOrder
7
+ predicate: "can create"
8
+ }
@@ -0,0 +1,7 @@
1
+ namespace acme.procurement
2
+
3
+ metric UnitMismatchMetric {
4
+ unit: kilograms
5
+ threshold: 100.0
6
+ compare_with: percent
7
+ }
@@ -0,0 +1,8 @@
1
+ namespace acme.procurement
2
+
3
+ policy UnknownVendorPolicy {
4
+ description: "A policy referencing an unknown concept"
5
+ subject: UnknownWidget
6
+ object: PurchaseOrder
7
+ predicate: "can create"
8
+ }
@@ -0,0 +1,8 @@
1
+ namespace acme.procurement
2
+
3
+ policy ValidPurchasePolicy {
4
+ description: "A purchase policy using only approved concepts"
5
+ subject: Supplier
6
+ object: PurchaseOrder
7
+ predicate: "can create"
8
+ }
package/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ // Re-export type declarations from the canonical napi build.
2
+ export * from './domainforge-typescript/index';
package/index.js ADDED
@@ -0,0 +1,8 @@
1
+ // Root test entry point.
2
+ //
3
+ // The canonical napi build lives in domainforge-typescript/ (generated by
4
+ // `npm run build` / `bun run build`). typescript-tests import '../index', and
5
+ // `example.js` requires './index', so this file simply re-exports the canonical
6
+ // loader instead of duplicating it. This keeps a single source of truth and
7
+ // avoids drift between a root-level loader and the real package loader.
8
+ module.exports = require('./domainforge-typescript/index.js');