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,9 @@
1
+ pub mod export;
2
+ pub mod import;
3
+ pub mod models;
4
+ pub mod sbvr_import;
5
+
6
+ pub use export::export;
7
+ pub use import::import;
8
+ pub use models::{CalmModel, CalmNode, CalmRelationship};
9
+ pub use sbvr_import::import_sbvr_xmi;
@@ -0,0 +1,108 @@
1
+ use serde::{Deserialize, Serialize};
2
+ use serde_json::Value;
3
+ use std::collections::HashMap;
4
+
5
+ #[derive(Debug, Clone, Serialize, Deserialize)]
6
+ pub struct CalmModel {
7
+ #[serde(default = "default_version")]
8
+ pub version: String,
9
+
10
+ pub metadata: CalmMetadata,
11
+ pub nodes: Vec<CalmNode>,
12
+ pub relationships: Vec<CalmRelationship>,
13
+ }
14
+
15
+ fn default_version() -> String {
16
+ "2.0".to_string()
17
+ }
18
+
19
+ #[derive(Debug, Clone, Serialize, Deserialize)]
20
+ pub struct CalmMetadata {
21
+ #[serde(rename = "sea:exported")]
22
+ pub sea_exported: bool,
23
+
24
+ #[serde(rename = "sea:version")]
25
+ pub sea_version: String,
26
+
27
+ #[serde(rename = "sea:timestamp", skip_serializing_if = "Option::is_none")]
28
+ pub sea_timestamp: Option<String>,
29
+ }
30
+
31
+ #[derive(Debug, Clone, Serialize, Deserialize)]
32
+ pub struct CalmNode {
33
+ #[serde(rename = "unique-id")]
34
+ pub unique_id: String,
35
+
36
+ #[serde(rename = "node-type")]
37
+ pub node_type: NodeType,
38
+
39
+ pub name: String,
40
+
41
+ #[serde(skip_serializing_if = "Option::is_none")]
42
+ pub namespace: Option<String>,
43
+
44
+ #[serde(default)]
45
+ pub metadata: HashMap<String, Value>,
46
+ }
47
+
48
+ #[derive(Debug, Clone, Serialize, Deserialize)]
49
+ #[serde(rename_all = "lowercase")]
50
+ pub enum NodeType {
51
+ Actor,
52
+ Location,
53
+ Resource,
54
+ Instance,
55
+ Constraint,
56
+ }
57
+
58
+ #[derive(Debug, Clone, Serialize, Deserialize)]
59
+ pub struct CalmRelationship {
60
+ #[serde(rename = "unique-id")]
61
+ pub unique_id: String,
62
+
63
+ #[serde(rename = "relationship-type")]
64
+ pub relationship_type: RelationshipType,
65
+
66
+ pub parties: Parties,
67
+ }
68
+
69
+ #[derive(Debug, Clone, Serialize, Deserialize)]
70
+ #[serde(untagged)]
71
+ pub enum RelationshipType {
72
+ Flow { flow: FlowDetails },
73
+ Simple(String),
74
+ }
75
+
76
+ #[derive(Debug, Clone, Serialize, Deserialize)]
77
+ pub struct FlowDetails {
78
+ pub resource: String,
79
+ pub quantity: String,
80
+ }
81
+
82
+ #[derive(Debug, Clone, Serialize, Deserialize)]
83
+ #[serde(untagged)]
84
+ pub enum Parties {
85
+ SourceDestination { source: String, destination: String },
86
+ OwnerOwned { owner: String, owned: String },
87
+ }
88
+
89
+ impl CalmModel {
90
+ pub fn new() -> Self {
91
+ CalmModel {
92
+ version: "2.0".to_string(),
93
+ metadata: CalmMetadata {
94
+ sea_exported: true,
95
+ sea_version: crate::VERSION.to_string(),
96
+ sea_timestamp: None,
97
+ },
98
+ nodes: Vec::new(),
99
+ relationships: Vec::new(),
100
+ }
101
+ }
102
+ }
103
+
104
+ impl Default for CalmModel {
105
+ fn default() -> Self {
106
+ Self::new()
107
+ }
108
+ }
@@ -0,0 +1,9 @@
1
+ use crate::graph::Graph;
2
+ use crate::sbvr::SbvrModel;
3
+
4
+ pub fn import_sbvr_xmi(xmi: &str) -> Result<Graph, String> {
5
+ let model = SbvrModel::from_xmi(xmi).map_err(|e| format!("Failed to parse SBVR XMI: {}", e))?;
6
+ model
7
+ .to_graph()
8
+ .map_err(|e| format!("Failed to convert SBVR to Graph: {}", e))
9
+ }
@@ -0,0 +1,149 @@
1
+ //! CLI module for the `sea authority` command.
2
+ //!
3
+ //! Provides authority evaluation from the command line.
4
+
5
+ use crate::authority::{
6
+ AuthorityEnvironment, AuthorityEnvironmentConfig, AuthorityRequest, FactEnvelope,
7
+ };
8
+ use clap::Args;
9
+
10
+ /// Arguments for the `authority` subcommand.
11
+ #[derive(Args, Debug)]
12
+ pub struct AuthorityArgs {
13
+ /// Path to authority environment config JSON file
14
+ #[arg(help = "Path to authority environment config JSON")]
15
+ pub config: String,
16
+
17
+ /// Path to authority request JSON file
18
+ #[arg(help = "Path to authority request JSON")]
19
+ pub request: String,
20
+
21
+ /// Path to facts JSON file (optional)
22
+ #[arg(long, value_name = "FILE", help = "Path to facts JSON file")]
23
+ pub facts: Option<String>,
24
+
25
+ /// Output result as JSON
26
+ #[arg(long, help = "Output as JSON object")]
27
+ pub json: bool,
28
+ }
29
+
30
+ /// Result of authority evaluation for JSON output.
31
+ #[derive(serde::Serialize)]
32
+ struct AuthorityResult {
33
+ decision_id: String,
34
+ request_id: String,
35
+ final_decision: String,
36
+ reason_code: String,
37
+ trace_ref: String,
38
+ #[serde(skip_serializing_if = "Option::is_none")]
39
+ operator_action_hint: Option<String>,
40
+ }
41
+
42
+ /// Run the authority command.
43
+ pub fn run(args: AuthorityArgs) -> anyhow::Result<()> {
44
+ run_with_writer(args, &mut std::io::stdout())
45
+ }
46
+
47
+ /// Run the authority command with a specific writer for output capture.
48
+ pub fn run_with_writer<W: std::io::Write>(
49
+ args: AuthorityArgs,
50
+ mut writer: W,
51
+ ) -> anyhow::Result<()> {
52
+ // Validate and canonicalize user-supplied paths
53
+ let config_path = std::path::Path::new(&args.config);
54
+ if !config_path.exists() {
55
+ return Err(anyhow::anyhow!(
56
+ "Config file '{}' does not exist",
57
+ args.config
58
+ ));
59
+ }
60
+
61
+ let request_path = std::path::Path::new(&args.request);
62
+ if !request_path.exists() {
63
+ return Err(anyhow::anyhow!(
64
+ "Request file '{}' does not exist",
65
+ args.request
66
+ ));
67
+ }
68
+
69
+ if let Some(ref facts) = args.facts {
70
+ let facts_path = std::path::Path::new(facts);
71
+ if !facts_path.exists() {
72
+ return Err(anyhow::anyhow!("Facts file '{}' does not exist", facts));
73
+ }
74
+ }
75
+
76
+ // Load config
77
+ let config_str = std::fs::read_to_string(&args.config)
78
+ .map_err(|e| anyhow::anyhow!("Failed to read config file '{}': {}", args.config, e))?;
79
+ let config: AuthorityEnvironmentConfig = serde_json::from_str(&config_str)
80
+ .map_err(|e| anyhow::anyhow!("Failed to parse config JSON: {}", e))?;
81
+
82
+ // Create and validate environment
83
+ let mut env = AuthorityEnvironment::new(config)
84
+ .map_err(|e| anyhow::anyhow!("Failed to create authority environment: {}", e))?;
85
+ env.validate()
86
+ .map_err(|e| anyhow::anyhow!("Environment validation failed: {}", e))?;
87
+
88
+ // Load request
89
+ let request_str = std::fs::read_to_string(&args.request)
90
+ .map_err(|e| anyhow::anyhow!("Failed to read request file '{}': {}", args.request, e))?;
91
+ let request: AuthorityRequest = serde_json::from_str(&request_str)
92
+ .map_err(|e| anyhow::anyhow!("Failed to parse request JSON: {}", e))?;
93
+
94
+ // Load facts (optional)
95
+ let facts: Vec<FactEnvelope> = if let Some(ref facts_path) = args.facts {
96
+ let facts_str = std::fs::read_to_string(facts_path)
97
+ .map_err(|e| anyhow::anyhow!("Failed to read facts file '{}': {}", facts_path, e))?;
98
+ serde_json::from_str(&facts_str)
99
+ .map_err(|e| anyhow::anyhow!("Failed to parse facts JSON: {}", e))?
100
+ } else {
101
+ vec![]
102
+ };
103
+
104
+ // Evaluate
105
+ let (trace, decision) = env
106
+ .evaluate(&request, &facts)
107
+ .map_err(|e| anyhow::anyhow!("Authority evaluation failed: {}", e))?;
108
+
109
+ if args.json {
110
+ let result = AuthorityResult {
111
+ decision_id: decision.decision_id,
112
+ request_id: decision.request_id,
113
+ final_decision: format!("{:?}", decision.final_decision),
114
+ reason_code: decision.reason_code,
115
+ trace_ref: decision.trace_ref,
116
+ operator_action_hint: decision.operator_action_hint,
117
+ };
118
+ let json = serde_json::to_string_pretty(&result)
119
+ .map_err(|e| anyhow::anyhow!("Failed to serialize result: {}", e))?;
120
+ writeln!(writer, "{}", json)?;
121
+ } else {
122
+ writeln!(writer, "Authority Decision")?;
123
+ writeln!(writer, " Decision ID: {}", decision.decision_id)?;
124
+ writeln!(writer, " Request ID: {}", decision.request_id)?;
125
+ writeln!(writer, " Decision: {:?}", decision.final_decision)?;
126
+ writeln!(writer, " Reason: {}", decision.reason_code)?;
127
+ writeln!(writer, " Trace Ref: {}", decision.trace_ref)?;
128
+ if let Some(ref hint) = decision.operator_action_hint {
129
+ writeln!(writer, " Action Hint: {}", hint)?;
130
+ }
131
+ writeln!(writer)?;
132
+ writeln!(writer, "Trace Details")?;
133
+ writeln!(
134
+ writer,
135
+ " Semantics: {} ({})",
136
+ trace.resolver_semantics_version, trace.resolver_semantics_hash
137
+ )?;
138
+ writeln!(
139
+ writer,
140
+ " Profile: {} ({})",
141
+ trace.specificity_profile_id, trace.specificity_profile_hash
142
+ )?;
143
+ writeln!(writer, " Packs: {:?}", trace.pack_hashes)?;
144
+ writeln!(writer, " Claim Level: {:?}", trace.claim_level)?;
145
+ writeln!(writer, " Created: {}", trace.created_at)?;
146
+ }
147
+
148
+ Ok(())
149
+ }
@@ -0,0 +1,85 @@
1
+ use crate::formatter::{format, FormatConfig, IndentStyle};
2
+ use anyhow::{Context, Result};
3
+ use clap::Parser;
4
+ use std::fs::{read_to_string, write};
5
+ use std::io::{self, Write};
6
+ use std::path::PathBuf;
7
+
8
+ #[derive(Parser)]
9
+ pub struct FormatArgs {
10
+ /// SEA file to format
11
+ pub file: PathBuf,
12
+
13
+ /// Output file (defaults to stdout)
14
+ #[arg(long)]
15
+ pub out: Option<PathBuf>,
16
+
17
+ /// Number of spaces per indentation level
18
+ #[arg(long, default_value = "4")]
19
+ pub indent_width: usize,
20
+
21
+ /// Use tabs instead of spaces for indentation
22
+ #[arg(long)]
23
+ pub use_tabs: bool,
24
+
25
+ /// Check if file would be reformatted (exit 1 if changes needed)
26
+ #[arg(long)]
27
+ pub check: bool,
28
+
29
+ /// Sort imports alphabetically
30
+ #[arg(long, default_value = "true")]
31
+ pub sort_imports: bool,
32
+ }
33
+
34
+ pub fn run(args: FormatArgs) -> Result<()> {
35
+ let source = read_to_string(&args.file)
36
+ .with_context(|| format!("Failed to read file {}", args.file.display()))?;
37
+
38
+ let config = FormatConfig {
39
+ indent_width: args.indent_width,
40
+ indent_style: if args.use_tabs {
41
+ IndentStyle::Tabs
42
+ } else {
43
+ IndentStyle::Spaces
44
+ },
45
+ sort_imports: args.sort_imports,
46
+ ..Default::default()
47
+ };
48
+
49
+ let formatted = format(&source, config)
50
+ .map_err(|e| anyhow::anyhow!("Format failed for {}: {}", args.file.display(), e))?;
51
+
52
+ if args.check {
53
+ // Check mode: exit with error if file would change
54
+ if source != formatted {
55
+ // Show diff summary
56
+ let source_lines = source.lines().count();
57
+ let formatted_lines = formatted.lines().count();
58
+ eprintln!(
59
+ "Would reformat {} ({} -> {} lines)",
60
+ args.file.display(),
61
+ source_lines,
62
+ formatted_lines
63
+ );
64
+ anyhow::bail!("File would be reformatted: {}", args.file.display());
65
+ } else {
66
+ println!("{}: already formatted", args.file.display());
67
+ }
68
+ } else if let Some(out_path) = args.out {
69
+ // Write to specified output file
70
+ write(&out_path, &formatted)
71
+ .with_context(|| format!("Failed to write to {}", out_path.display()))?;
72
+ println!(
73
+ "Formatted {} -> {}",
74
+ args.file.display(),
75
+ out_path.display()
76
+ );
77
+ } else {
78
+ // Write to stdout
79
+ io::stdout()
80
+ .write_all(formatted.as_bytes())
81
+ .context("Failed to write to stdout")?;
82
+ }
83
+
84
+ Ok(())
85
+ }
@@ -0,0 +1,133 @@
1
+ use crate::import_kg_turtle;
2
+ use anyhow::{Context, Result};
3
+ use clap::{Parser, ValueEnum};
4
+ use std::fs::read_to_string;
5
+ use std::path::PathBuf;
6
+
7
+ #[cfg(feature = "shacl")]
8
+ use crate::kg_import::ImportError;
9
+
10
+ #[derive(Parser)]
11
+ pub struct ImportArgs {
12
+ #[arg(long, value_enum)]
13
+ pub format: ImportFormat,
14
+
15
+ pub file: PathBuf,
16
+ }
17
+
18
+ #[derive(ValueEnum, Clone, Debug, Copy)]
19
+ pub enum ImportFormat {
20
+ Sbvr,
21
+ Kg,
22
+ }
23
+
24
+ /// Helper function to print import success message with graph statistics
25
+ fn print_import_success(graph: &crate::Graph, format_desc: &str) {
26
+ println!(
27
+ "Imported {} to Graph: entities={} resources={} flows={}",
28
+ format_desc,
29
+ graph.entity_count(),
30
+ graph.resource_count(),
31
+ graph.flow_count()
32
+ );
33
+ }
34
+
35
+ pub fn run(args: ImportArgs) -> Result<()> {
36
+ let source = read_to_string(&args.file)
37
+ .with_context(|| format!("Failed to read file {}", args.file.display()))?;
38
+
39
+ match args.format {
40
+ ImportFormat::Sbvr => match crate::SbvrModel::from_xmi(&source) {
41
+ Ok(model) => match model.to_graph() {
42
+ Ok(graph) => {
43
+ print_import_success(&graph, "SBVR");
44
+ Ok(())
45
+ }
46
+ Err(e) => Err(anyhow::anyhow!("Failed to convert SBVR to Graph: {}", e)),
47
+ },
48
+ Err(e) => Err(anyhow::anyhow!("Failed to parse SBVR XMI: {}", e)),
49
+ },
50
+ ImportFormat::Kg => {
51
+ let src_trim = source.trim_start();
52
+ // More specific RDF/XML detection: check for XML declaration or RDF namespace
53
+ let is_likely_rdfxml = src_trim.starts_with("<?xml")
54
+ || src_trim.starts_with("<rdf:")
55
+ || src_trim.starts_with("<rdf ")
56
+ || src_trim.contains("xmlns:rdf");
57
+
58
+ if is_likely_rdfxml {
59
+ #[cfg(feature = "shacl")]
60
+ {
61
+ match crate::import_kg_rdfxml(&source) {
62
+ Ok(graph) => {
63
+ print_import_success(&graph, "KG (RDF/XML)");
64
+ Ok(())
65
+ }
66
+ Err(err_rdf) => match err_rdf {
67
+ ImportError::ShaclValidation(msg) => Err(anyhow::anyhow!("{}", msg)),
68
+ other => {
69
+ let err_rdf_msg = other.to_string();
70
+ match import_kg_turtle(&source) {
71
+ Ok(graph) => {
72
+ print_import_success(&graph, "KG (Turtle)");
73
+ Ok(())
74
+ }
75
+ Err(err_turtle) => Err(anyhow::anyhow!(
76
+ "Failed to import KG as RDF/XML: {}; as Turtle: {}",
77
+ err_rdf_msg,
78
+ err_turtle
79
+ )),
80
+ }
81
+ }
82
+ },
83
+ }
84
+ }
85
+ #[cfg(not(feature = "shacl"))]
86
+ {
87
+ match import_kg_turtle(&source) {
88
+ Ok(graph) => {
89
+ print_import_success(&graph, "KG (Turtle)");
90
+ Ok(())
91
+ }
92
+ Err(err) => {
93
+ Err(anyhow::anyhow!("Failed to import KG: {}. Consider enabling the 'shacl' feature for RDF/XML support.", err))
94
+ }
95
+ }
96
+ }
97
+ } else {
98
+ match import_kg_turtle(&source) {
99
+ Ok(graph) => {
100
+ print_import_success(&graph, "KG (Turtle)");
101
+ Ok(())
102
+ }
103
+ Err(err_turtle) => {
104
+ #[cfg(feature = "shacl")]
105
+ {
106
+ match crate::import_kg_rdfxml(&source) {
107
+ Ok(graph) => {
108
+ print_import_success(&graph, "KG (RDF/XML)");
109
+ Ok(())
110
+ }
111
+ Err(err_rdf) => {
112
+ match err_rdf {
113
+ ImportError::ShaclValidation(msg) => {
114
+ Err(anyhow::anyhow!("{}", msg))
115
+ }
116
+ other => {
117
+ let err_rdf_msg = other.to_string();
118
+ Err(anyhow::anyhow!("Failed to import KG as Turtle: {}; and as RDF/XML: {}", err_turtle, err_rdf_msg))
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
124
+ #[cfg(not(feature = "shacl"))]
125
+ {
126
+ Err(anyhow::anyhow!("Failed to import KG (Turtle): {}. To try RDF/XML, enable feature 'shacl' in the build.", err_turtle))
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
@@ -0,0 +1,64 @@
1
+ use clap::{Parser, Subcommand, ValueEnum};
2
+
3
+ pub mod authority;
4
+ pub mod format;
5
+ pub mod import;
6
+ pub mod normalize;
7
+ pub mod pack;
8
+ pub mod parse;
9
+ pub mod project;
10
+ pub mod registry;
11
+ pub mod test;
12
+ pub mod validate;
13
+ pub mod validate_kg;
14
+
15
+ #[derive(Parser)]
16
+ #[command(name = "domainforge", version, about = "SEA DSL CLI")]
17
+ pub struct Cli {
18
+ #[command(subcommand)]
19
+ pub command: Commands,
20
+
21
+ #[arg(long, global = true, conflicts_with = "quiet")]
22
+ pub verbose: bool,
23
+
24
+ #[arg(long, global = true, conflicts_with = "verbose")]
25
+ pub quiet: bool,
26
+
27
+ #[arg(long, global = true, value_enum, default_value_t = ColorChoice::Auto)]
28
+ pub color: ColorChoice,
29
+ }
30
+
31
+ #[derive(Subcommand)]
32
+ pub enum Commands {
33
+ /// Parse SEA files and output AST or Graph
34
+ Parse(parse::ParseArgs),
35
+ /// Validate SEA files
36
+ Validate(validate::ValidateArgs),
37
+ /// Import from other formats
38
+ Import(import::ImportArgs),
39
+ /// Project/Export to other formats
40
+ Project(project::ProjectArgs),
41
+ /// Format SEA files
42
+ #[command(name = "format", alias = "fmt")]
43
+ Format(format::FormatArgs),
44
+ /// Run tests
45
+ Test(test::TestArgs),
46
+ /// Validate Knowledge Graph files
47
+ #[command(name = "validate-kg")]
48
+ ValidateKg(validate_kg::ValidateKgArgs),
49
+ /// Normalize a policy expression
50
+ Normalize(normalize::NormalizeArgs),
51
+ /// Registry management commands
52
+ Registry(registry::RegistryArgs),
53
+ /// Evaluate authority decisions
54
+ Authority(authority::AuthorityArgs),
55
+ /// Semantic pack management commands
56
+ Pack(pack::PackArgs),
57
+ }
58
+
59
+ #[derive(ValueEnum, Clone, Debug, Copy)]
60
+ pub enum ColorChoice {
61
+ Auto,
62
+ Always,
63
+ Never,
64
+ }