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,373 @@
1
+ #!/usr/bin/env bash
2
+ # release.sh - Master release orchestration script for DomainForge
3
+ # Usage: ./scripts/release.sh [major|minor|patch|X.Y.Z] [OPTIONS]
4
+ #
5
+ # Orchestrates the complete release process:
6
+ # 1. Pre-release checks
7
+ # 2. Version bump
8
+ # 3. Changelog generation
9
+ # 4. Release notes generation
10
+ # 5. Git tag creation
11
+ # 6. Build artifacts
12
+ # 7. Push and create GitHub release
13
+
14
+ set -euo pipefail
15
+
16
+ # ============================================================================
17
+ # Configuration
18
+ # ============================================================================
19
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
20
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
21
+
22
+ # Colors
23
+ RED='\033[0;31m'
24
+ GREEN='\033[0;32m'
25
+ YELLOW='\033[1;33m'
26
+ BLUE='\033[0;34m'
27
+ CYAN='\033[0;36m'
28
+ NC='\033[0m'
29
+
30
+ # Flags
31
+ DRY_RUN=false
32
+ SKIP_TESTS=false
33
+ SKIP_BUILD=false
34
+ AUTO_CONFIRM=false
35
+
36
+ # ============================================================================
37
+ # Helper Functions
38
+ # ============================================================================
39
+ log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
40
+ log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
41
+ log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
42
+ log_error() { echo -e "${RED}[✗]${NC} $1"; }
43
+ log_step() { echo -e "${CYAN}[STEP]${NC} $1"; }
44
+
45
+ banner() {
46
+ echo ""
47
+ echo -e "${CYAN}=============================================="
48
+ echo " 🚀 DomainForge Release Process"
49
+ echo "==============================================${NC}"
50
+ echo ""
51
+ }
52
+
53
+ usage() {
54
+ cat <<EOF
55
+ Usage: $(basename "$0") [VERSION_TYPE] [OPTIONS]
56
+
57
+ Complete release orchestration for DomainForge.
58
+
59
+ VERSION_TYPE:
60
+ major Bump major version (X.0.0)
61
+ minor Bump minor version (x.Y.0)
62
+ patch Bump patch version (x.y.Z) [default]
63
+ X.Y.Z Set explicit version (e.g., 1.2.3)
64
+
65
+ OPTIONS:
66
+ --dry-run Run through all steps without making changes
67
+ --skip-tests Skip running test suites (faster, less safe)
68
+ --skip-build Skip building release artifacts
69
+ --yes, -y Auto-confirm push and release creation
70
+ -h, --help Show this help message
71
+
72
+ RELEASE PROCESS:
73
+ Run this from main after merging the release changes.
74
+ 1. Run pre-release checks (git status, tests, version sync)
75
+ 2. Bump version in all package files
76
+ 3. Generate changelog from commits
77
+ 4. Generate release notes for GitHub
78
+ 5. Commit version changes
79
+ 6. Create annotated git tag
80
+ 7. Build release artifacts (CLI, Python, WASM)
81
+ 8. Push to remote (with confirmation)
82
+ 9. Create GitHub release with artifacts
83
+
84
+ EXAMPLES:
85
+ $(basename "$0") # Patch release (0.6.2 -> 0.6.3)
86
+ $(basename "$0") minor # Minor release (0.6.2 -> 0.7.0)
87
+ $(basename "$0") major # Major release (0.6.2 -> 1.0.0)
88
+ $(basename "$0") --dry-run # Preview full release process
89
+ $(basename "$0") patch --yes # Patch release with auto-confirm
90
+
91
+ REQUIREMENTS:
92
+ - git
93
+ - cargo (Rust toolchain)
94
+ - just (optional, for tests)
95
+ - maturin (for Python wheels)
96
+ - wasm-pack (for WASM bundle)
97
+ - gh (GitHub CLI, for release creation)
98
+
99
+ ROLLBACK:
100
+ If the release fails after version bump:
101
+ git reset --hard HEAD~1
102
+ git tag -d v{VERSION}
103
+ EOF
104
+ }
105
+
106
+ confirm() {
107
+ local prompt="$1"
108
+ local default="${2:-n}"
109
+
110
+ if $AUTO_CONFIRM; then
111
+ return 0
112
+ fi
113
+
114
+ if $DRY_RUN; then
115
+ log_info "Would prompt: $prompt"
116
+ return 0
117
+ fi
118
+
119
+ local answer
120
+ read -r -p "$prompt [y/N] " answer
121
+ [[ "$answer" =~ ^[Yy]$ ]]
122
+ }
123
+
124
+ run_script() {
125
+ local script="$1"
126
+ shift
127
+ local args=("$@")
128
+
129
+ if $DRY_RUN; then
130
+ args+=("--dry-run")
131
+ fi
132
+
133
+ if [[ -x "$SCRIPT_DIR/$script" ]]; then
134
+ "$SCRIPT_DIR/$script" "${args[@]}"
135
+ else
136
+ log_error "Script not found or not executable: $script"
137
+ exit 1
138
+ fi
139
+ }
140
+
141
+ # ============================================================================
142
+ # Parse Arguments
143
+ # ============================================================================
144
+ VERSION_TYPE="patch"
145
+
146
+ while [[ $# -gt 0 ]]; do
147
+ case $1 in
148
+ --dry-run)
149
+ DRY_RUN=true
150
+ shift
151
+ ;;
152
+ --skip-tests)
153
+ SKIP_TESTS=true
154
+ shift
155
+ ;;
156
+ --skip-build)
157
+ SKIP_BUILD=true
158
+ shift
159
+ ;;
160
+ --yes|-y)
161
+ AUTO_CONFIRM=true
162
+ shift
163
+ ;;
164
+ -h|--help)
165
+ usage
166
+ exit 0
167
+ ;;
168
+ -*)
169
+ log_error "Unknown option: $1"
170
+ usage
171
+ exit 1
172
+ ;;
173
+ *)
174
+ VERSION_TYPE="$1"
175
+ shift
176
+ ;;
177
+ esac
178
+ done
179
+
180
+ # ============================================================================
181
+ # Main
182
+ # ============================================================================
183
+ cd "$PROJECT_ROOT"
184
+
185
+ banner
186
+
187
+ CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
188
+
189
+ if [[ "$CURRENT_BRANCH" != "main" ]]; then
190
+ log_error "Release execution must start from main. Current branch: $CURRENT_BRANCH"
191
+ log_info "Merge or fast-forward the intended release commit onto main, then rerun this script from main."
192
+ exit 1
193
+ fi
194
+
195
+ if $DRY_RUN; then
196
+ log_warn "DRY RUN MODE - No changes will be made"
197
+ echo ""
198
+ fi
199
+
200
+ log_info "Release type: $VERSION_TYPE"
201
+ echo ""
202
+
203
+ # ============================================================================
204
+ # Step 1: Pre-release checks
205
+ # ============================================================================
206
+ log_step "Step 1/9: Running pre-release checks..."
207
+ echo ""
208
+
209
+ PRE_CHECK_ARGS=()
210
+ if $SKIP_TESTS; then
211
+ PRE_CHECK_ARGS+=("--skip-tests")
212
+ fi
213
+ if $DRY_RUN; then
214
+ PRE_CHECK_ARGS+=("--dry-run")
215
+ fi
216
+
217
+ if ! "$SCRIPT_DIR/pre-release-check.sh" "${PRE_CHECK_ARGS[@]}"; then
218
+ log_error "Pre-release checks failed. Fix issues before releasing."
219
+ exit 1
220
+ fi
221
+ echo ""
222
+
223
+ # ============================================================================
224
+ # Step 2: Bump version
225
+ # ============================================================================
226
+ log_step "Step 2/9: Bumping version..."
227
+ echo ""
228
+
229
+ BUMP_ARGS=("$VERSION_TYPE" "--no-commit")
230
+ if $DRY_RUN; then
231
+ BUMP_ARGS+=("--dry-run")
232
+ fi
233
+
234
+ # Capture new version from bump script
235
+ NEW_VERSION=$("$SCRIPT_DIR/bump-version.sh" "${BUMP_ARGS[@]}" | tail -1)
236
+ log_success "New version: $NEW_VERSION"
237
+ echo ""
238
+
239
+ # ============================================================================
240
+ # Step 3: Generate changelog
241
+ # ============================================================================
242
+ log_step "Step 3/9: Generating changelog..."
243
+ echo ""
244
+
245
+ CHANGELOG_ARGS=("$NEW_VERSION" "--no-commit")
246
+ if $DRY_RUN; then
247
+ CHANGELOG_ARGS+=("--dry-run")
248
+ fi
249
+
250
+ "$SCRIPT_DIR/generate-changelog.sh" "${CHANGELOG_ARGS[@]}"
251
+ echo ""
252
+
253
+ # ============================================================================
254
+ # Step 4: Generate release notes
255
+ # ============================================================================
256
+ log_step "Step 4/9: Generating release notes..."
257
+ echo ""
258
+
259
+ NOTES_ARGS=("$NEW_VERSION")
260
+ if $DRY_RUN; then
261
+ NOTES_ARGS+=("--dry-run")
262
+ fi
263
+
264
+ "$SCRIPT_DIR/generate-release-notes.sh" "${NOTES_ARGS[@]}"
265
+ echo ""
266
+
267
+ # ============================================================================
268
+ # Step 5: Commit version changes
269
+ # ============================================================================
270
+ log_step "Step 5/9: Committing changes..."
271
+ echo ""
272
+
273
+ if $DRY_RUN; then
274
+ log_info "Would commit: chore: release v$NEW_VERSION"
275
+ else
276
+ git add -A
277
+ git commit -m "chore: release v$NEW_VERSION" || log_warn "Nothing to commit or commit failed"
278
+ log_success "Created commit: chore: release v$NEW_VERSION"
279
+ fi
280
+ echo ""
281
+
282
+ # ============================================================================
283
+ # Step 6: Create git tag
284
+ # ============================================================================
285
+ log_step "Step 6/9: Creating git tag..."
286
+ echo ""
287
+
288
+ TAG_ARGS=("$NEW_VERSION")
289
+ if $DRY_RUN; then
290
+ TAG_ARGS+=("--dry-run")
291
+ fi
292
+
293
+ "$SCRIPT_DIR/create-tag.sh" "${TAG_ARGS[@]}"
294
+ echo ""
295
+
296
+ # ============================================================================
297
+ # Step 7: Build artifacts
298
+ # ============================================================================
299
+ if ! $SKIP_BUILD; then
300
+ log_step "Step 7/9: Building release artifacts..."
301
+ echo ""
302
+
303
+ BUILD_ARGS=()
304
+ if $DRY_RUN; then
305
+ BUILD_ARGS+=("--dry-run")
306
+ fi
307
+
308
+ "$SCRIPT_DIR/build-release.sh" "${BUILD_ARGS[@]}"
309
+ echo ""
310
+ else
311
+ log_step "Step 7/9: Skipping build (--skip-build)"
312
+ echo ""
313
+ fi
314
+
315
+ # ============================================================================
316
+ # Step 8: Push to remote
317
+ # ============================================================================
318
+ log_step "Step 8/9: Preparing to push..."
319
+ echo ""
320
+
321
+ BRANCH="$CURRENT_BRANCH"
322
+ TAG_NAME="v$NEW_VERSION"
323
+
324
+ log_warn "Ready to push the following:"
325
+ echo " - Branch: $BRANCH"
326
+ echo " - Tag: $TAG_NAME"
327
+ echo ""
328
+
329
+ if $DRY_RUN; then
330
+ log_info "Would push: git push origin $BRANCH"
331
+ log_info "Would push: git push origin $TAG_NAME"
332
+ else
333
+ if confirm "Push to remote and create GitHub release?"; then
334
+ log_info "Pushing branch..."
335
+ git push origin "$BRANCH"
336
+ log_success "Pushed branch: $BRANCH"
337
+
338
+ log_info "Pushing tag..."
339
+ git push origin "$TAG_NAME"
340
+ log_success "Pushed tag: $TAG_NAME"
341
+ echo ""
342
+
343
+ # ============================================================================
344
+ # Step 9: Create GitHub release
345
+ # ============================================================================
346
+ log_step "Step 9/9: Creating GitHub release..."
347
+ echo ""
348
+
349
+ GH_ARGS=("$NEW_VERSION")
350
+ "$SCRIPT_DIR/create-github-release.sh" "${GH_ARGS[@]}"
351
+
352
+ echo ""
353
+ echo -e "${GREEN}=============================================="
354
+ echo " ✨ Release v$NEW_VERSION completed!"
355
+ echo "==============================================${NC}"
356
+ echo ""
357
+ log_success "All release steps completed successfully"
358
+ echo ""
359
+ log_info "Next steps:"
360
+ echo " 1. Verify GitHub release: https://github.com/GodSpeedAI/DomainForge/releases"
361
+ echo " 2. Wait for CI to publish to npm, PyPI, and crates.io"
362
+ echo " 3. Announce the release"
363
+ else
364
+ echo ""
365
+ log_warn "Release cancelled. To undo local changes:"
366
+ echo " git reset --hard HEAD~1"
367
+ echo " git tag -d $TAG_NAME"
368
+ exit 1
369
+ fi
370
+ fi
371
+
372
+ echo ""
373
+ log_success "Release process complete"
@@ -0,0 +1,230 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Locate a compiled Rust binary under the workspace `target/` directories.
4
+
5
+ Supports both workspace-level targets (e.g., `target/x86_64-unknown-linux-gnu/release/sea`)
6
+ and crate-local targets (e.g., `domainforge-core/target/release/domainforge`). The script can match
7
+ by exact name, prefix, or substring and falls back to alternate match modes when
8
+ requested. Designed for both CI (finding the built CLI) and editor automation
9
+ (finding hashed test binaries for codelldb).
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import argparse
15
+ import os
16
+ import sys
17
+ from dataclasses import dataclass
18
+ from typing import Iterable, List, Optional, Sequence, Tuple
19
+
20
+ MATCH_CHOICES = ("exact", "prefix", "contains")
21
+ DEFAULT_SEARCH_ROOTS = ["target", os.path.join("domainforge-core", "target")]
22
+
23
+
24
+ @dataclass(frozen=True)
25
+ class SearchOptions:
26
+ names: Sequence[str]
27
+ match_mode: str
28
+ require_executable: bool
29
+
30
+
31
+ def parse_args() -> argparse.Namespace:
32
+ parser = argparse.ArgumentParser(description="Find a compiled Rust binary path.")
33
+ parser.add_argument(
34
+ "--name", required=True, help="Base name of the binary (stem without hash)."
35
+ )
36
+ parser.add_argument(
37
+ "--profile",
38
+ choices=["debug", "release"],
39
+ default="debug",
40
+ help="Cargo profile directory to search (default: debug).",
41
+ )
42
+ parser.add_argument(
43
+ "--target-triple",
44
+ help="Optional target triple (searches target/<triple>/<profile>).",
45
+ )
46
+ parser.add_argument(
47
+ "--deps-subdir",
48
+ help="Optional additional subdirectory (e.g., 'deps' for test binaries).",
49
+ )
50
+ parser.add_argument(
51
+ "--match-mode",
52
+ choices=MATCH_CHOICES,
53
+ default="exact",
54
+ help="Primary match mode for filenames (default: exact).",
55
+ )
56
+ parser.add_argument(
57
+ "--fallback-mode",
58
+ choices=MATCH_CHOICES,
59
+ help="Optional secondary match mode if the primary fails.",
60
+ )
61
+ parser.add_argument(
62
+ "--extension",
63
+ action="append",
64
+ dest="extensions",
65
+ help=(
66
+ "Explicit filename extensions to consider. Provide multiple times for "
67
+ "multiple extensions. Defaults to ['', '.exe']."
68
+ ),
69
+ )
70
+ parser.add_argument(
71
+ "--search-root",
72
+ action="append",
73
+ dest="search_roots",
74
+ help=(
75
+ "Override search roots (relative to workspace). Provide multiple times "
76
+ "to search several directories. Defaults to workspace 'target/' and "
77
+ "'domainforge-core/target/'."
78
+ ),
79
+ )
80
+ parser.add_argument(
81
+ "--workspace",
82
+ default=".",
83
+ help="Workspace root (defaults to current working directory).",
84
+ )
85
+ parser.add_argument(
86
+ "--require-executable",
87
+ action="store_true",
88
+ help="Only consider paths that are executable.",
89
+ )
90
+ return parser.parse_args()
91
+
92
+
93
+ def canonical_workspace(path: str) -> str:
94
+ return os.path.abspath(os.path.expanduser(path))
95
+
96
+
97
+ def candidate_directories(
98
+ workspace: str, roots: Sequence[str], target: Optional[str], profile: str, deps: Optional[str]
99
+ ) -> List[str]:
100
+ seen = set()
101
+ directories: List[str] = []
102
+
103
+ for root in roots:
104
+ base = os.path.join(workspace, root)
105
+ targets: Tuple[str, ...]
106
+ if target:
107
+ targets = (
108
+ os.path.join(base, target, profile),
109
+ os.path.join(base, profile),
110
+ )
111
+ else:
112
+ targets = (os.path.join(base, profile),)
113
+
114
+ for target_dir in targets:
115
+ if deps:
116
+ target_dir = os.path.join(target_dir, deps)
117
+ normalized = os.path.normpath(target_dir)
118
+ if normalized not in seen:
119
+ seen.add(normalized)
120
+ directories.append(normalized)
121
+ return directories
122
+
123
+
124
+ def build_candidate_names(name: str, extensions: Sequence[str]) -> List[str]:
125
+ if extensions:
126
+ return [f"{name}{ext}" for ext in extensions]
127
+ return [name, f"{name}.exe"]
128
+
129
+
130
+ def iter_sorted_files(directory: str) -> Iterable[str]:
131
+ try:
132
+ entries = os.listdir(directory)
133
+ except FileNotFoundError:
134
+ return []
135
+ except NotADirectoryError:
136
+ return []
137
+ entries.sort(
138
+ key=lambda entry: os.path.getmtime(os.path.join(directory, entry)),
139
+ reverse=True,
140
+ )
141
+ return entries
142
+
143
+
144
+ def match_entry(entry: str, names: Sequence[str], mode: str) -> bool:
145
+ entry_cmp = entry.lower()
146
+ if mode == "exact":
147
+ lowered = [n.lower() for n in names]
148
+ return entry_cmp in lowered
149
+ if mode == "prefix":
150
+ lowered = [n.lower() for n in names]
151
+ return any(entry_cmp.startswith(n) for n in lowered)
152
+ if mode == "contains":
153
+ lowered = [n.lower() for n in names]
154
+ return any(n in entry_cmp for n in lowered)
155
+ raise ValueError(f"Unsupported match mode: {mode}")
156
+
157
+
158
+ def find_binary(
159
+ directories: Sequence[str],
160
+ options: SearchOptions,
161
+ ) -> Optional[str]:
162
+ for directory in directories:
163
+ for entry in iter_sorted_files(directory):
164
+ path = os.path.join(directory, entry)
165
+ if not os.path.isfile(path):
166
+ continue
167
+ if options.require_executable and not os.access(path, os.X_OK):
168
+ continue
169
+ if match_entry(entry, options.names, options.match_mode):
170
+ return os.path.abspath(path)
171
+ return None
172
+
173
+
174
+ def fail_with_diagnostics(
175
+ name: str, directories: Sequence[str], match_mode: str, fallback_mode: Optional[str]
176
+ ) -> None:
177
+ rel_dirs = [os.path.relpath(d) for d in directories]
178
+ print(
179
+ "Unable to locate compiled binary.\n"
180
+ f" name: {name}\n"
181
+ f" match_mode: {match_mode}\n"
182
+ f" fallback_mode: {fallback_mode or 'none'}\n"
183
+ f" searched directories:\n - " + "\n - ".join(rel_dirs),
184
+ file=sys.stderr,
185
+ )
186
+ sys.exit(1)
187
+
188
+
189
+ def main() -> None:
190
+ args = parse_args()
191
+ workspace = canonical_workspace(args.workspace)
192
+ roots = args.search_roots or DEFAULT_SEARCH_ROOTS
193
+ extensions = args.extensions or ["", ".exe"]
194
+
195
+ directories = candidate_directories(
196
+ workspace=workspace,
197
+ roots=roots,
198
+ target=args.target_triple,
199
+ profile=args.profile,
200
+ deps=args.deps_subdir,
201
+ )
202
+
203
+ options = SearchOptions(
204
+ names=build_candidate_names(args.name, extensions),
205
+ match_mode=args.match_mode,
206
+ require_executable=args.require_executable,
207
+ )
208
+
209
+ result = find_binary(directories, options)
210
+ if not result and args.fallback_mode:
211
+ fallback_options = SearchOptions(
212
+ names=options.names,
213
+ match_mode=args.fallback_mode,
214
+ require_executable=options.require_executable,
215
+ )
216
+ result = find_binary(directories, fallback_options)
217
+
218
+ if not result:
219
+ fail_with_diagnostics(
220
+ name=args.name,
221
+ directories=directories,
222
+ match_mode=args.match_mode,
223
+ fallback_mode=args.fallback_mode,
224
+ )
225
+
226
+ print(result)
227
+
228
+
229
+ if __name__ == "__main__":
230
+ main()
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env sh
2
+ set -eu
3
+
4
+ if [ "$#" -ne 1 ]; then
5
+ echo "Usage: $0 <commit_message_file>" >&2
6
+ exit 2
7
+ fi
8
+
9
+ msg_file="$1"
10
+
11
+ if [ -x "./node_modules/.bin/commitlint" ]; then
12
+ exec ./node_modules/.bin/commitlint --edit "$msg_file"
13
+ fi
14
+
15
+ if command -v bunx >/dev/null 2>&1; then
16
+ exec bunx --yes commitlint --edit "$msg_file"
17
+ fi
18
+
19
+ if command -v npx >/dev/null 2>&1; then
20
+ exec npx --yes commitlint --edit "$msg_file"
21
+ fi
22
+
23
+ if command -v npm >/dev/null 2>&1; then
24
+ exec npm exec --yes commitlint -- --edit "$msg_file"
25
+ fi
26
+
27
+ echo "commitlint is required but no compatible runner was found (node_modules/.bin, bunx, npx, npm)." >&2
28
+ echo "Run 'just setup' or install Node.js/Bun, then retry." >&2
29
+ exit 1
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ echo "========================================"
5
+ echo " DomainForge SEA DSL - Test Suite"
6
+ echo "========================================"
7
+ echo ""
8
+
9
+ # Colors for output
10
+ RED='\033[0;31m'
11
+ GREEN='\033[0;32m'
12
+ YELLOW='\033[1;33m'
13
+ NC='\033[0m' # No Color
14
+
15
+ FAILED=0
16
+
17
+ # Rust tests
18
+ echo "==> Running Rust tests..."
19
+ if cargo test --manifest-path domainforge-core/Cargo.toml; then
20
+ echo -e "${GREEN}✓ Rust tests passed${NC}"
21
+ else
22
+ echo -e "${RED}✗ Rust tests failed${NC}"
23
+ FAILED=1
24
+ fi
25
+ echo ""
26
+
27
+ # Python tests
28
+ echo "==> Running Python tests..."
29
+ if [ -f "tests/test_primitives.py" ]; then
30
+ # Build Python bindings if not already built
31
+ if [ ! -d ".venv" ] || ! .venv/bin/python -c "import domainforge" 2>/dev/null; then
32
+ echo "Building Python bindings..."
33
+ bash scripts/build-python.sh
34
+ fi
35
+
36
+ # Activate virtual environment and run tests
37
+ source .venv/bin/activate
38
+ if pytest tests/ -v; then
39
+ echo -e "${GREEN}✓ Python tests passed${NC}"
40
+ else
41
+ echo -e "${RED}✗ Python tests failed${NC}"
42
+ FAILED=1
43
+ fi
44
+ deactivate
45
+ else
46
+ echo -e "${YELLOW}⚠ No Python tests found${NC}"
47
+ fi
48
+ echo ""
49
+
50
+ # TypeScript tests
51
+ echo "==> Running TypeScript tests..."
52
+ if [ -f "vitest.config.ts" ]; then
53
+ # Build TypeScript bindings if not already built
54
+ if [ ! -f "domainforge-core.linux-x64-gnu.node" ] && [ ! -f "index.node" ]; then
55
+ echo "Building TypeScript bindings..."
56
+ bash scripts/build-typescript.sh
57
+ fi
58
+
59
+ if npm test; then
60
+ echo -e "${GREEN}✓ TypeScript tests passed${NC}"
61
+ else
62
+ echo -e "${RED}✗ TypeScript tests failed${NC}"
63
+ FAILED=1
64
+ fi
65
+ else
66
+ echo -e "${YELLOW}⚠ No TypeScript tests found${NC}"
67
+ fi
68
+ echo ""
69
+
70
+ echo "========================================"
71
+ if [ $FAILED -eq 0 ]; then
72
+ echo -e "${GREEN}✓ All tests passed!${NC}"
73
+ exit 0
74
+ else
75
+ echo -e "${RED}✗ Some tests failed${NC}"
76
+ exit 1
77
+ fi