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,271 @@
1
+ #!/usr/bin/env bash
2
+ # generate-changelog.sh - Generate changelog entries from git commits
3
+ # Usage: ./scripts/generate-changelog.sh [VERSION] [OPTIONS]
4
+ #
5
+ # Parses conventional commits and updates CHANGELOG.md
6
+
7
+ set -euo pipefail
8
+
9
+ # ============================================================================
10
+ # Configuration
11
+ # ============================================================================
12
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
14
+
15
+ # Colors
16
+ RED='\033[0;31m'
17
+ GREEN='\033[0;32m'
18
+ YELLOW='\033[1;33m'
19
+ BLUE='\033[0;34m'
20
+ NC='\033[0m'
21
+
22
+ # Flags
23
+ DRY_RUN=false
24
+ NO_COMMIT=false
25
+
26
+ # ============================================================================
27
+ # Helper Functions
28
+ # ============================================================================
29
+ log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
30
+ log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
31
+ log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
32
+ log_error() { echo -e "${RED}[✗]${NC} $1"; }
33
+
34
+ usage() {
35
+ cat <<EOF
36
+ Usage: $(basename "$0") [VERSION] [OPTIONS]
37
+
38
+ Generate changelog entries from git commits using conventional commit format.
39
+
40
+ ARGUMENTS:
41
+ VERSION Version number for the changelog entry (e.g., 0.7.0)
42
+ If not provided, reads from domainforge-core/Cargo.toml
43
+
44
+ OPTIONS:
45
+ --dry-run Show what would be generated without modifying files
46
+ --no-commit Update CHANGELOG.md but don't create git commit
47
+ -h, --help Show this help message
48
+
49
+ COMMIT CATEGORIES:
50
+ feat: -> 🎉 Added
51
+ fix: -> 🐛 Fixed
52
+ docs: -> 📚 Documentation
53
+ refactor: -> ✨ Changed
54
+ perf: -> ⚡ Performance
55
+ test: -> 🧪 Testing
56
+ chore: -> 🔧 Maintenance
57
+
58
+ EXAMPLES:
59
+ $(basename "$0") # Generate for current version
60
+ $(basename "$0") 0.7.0 # Generate for specific version
61
+ $(basename "$0") --dry-run # Preview without changes
62
+ EOF
63
+ }
64
+
65
+ get_last_tag() {
66
+ git describe --tags --abbrev=0 2>/dev/null || echo ""
67
+ }
68
+
69
+ get_current_version() {
70
+ grep -m1 '^version = ' "$PROJECT_ROOT/domainforge-core/Cargo.toml" | sed 's/version = "\(.*\)"/\1/'
71
+ }
72
+
73
+ # ============================================================================
74
+ # Parse Arguments
75
+ # ============================================================================
76
+ VERSION=""
77
+
78
+ while [[ $# -gt 0 ]]; do
79
+ case $1 in
80
+ --dry-run)
81
+ DRY_RUN=true
82
+ shift
83
+ ;;
84
+ --no-commit)
85
+ NO_COMMIT=true
86
+ shift
87
+ ;;
88
+ -h|--help)
89
+ usage
90
+ exit 0
91
+ ;;
92
+ -*)
93
+ log_error "Unknown option: $1"
94
+ usage
95
+ exit 1
96
+ ;;
97
+ *)
98
+ if [[ -z "$VERSION" ]]; then
99
+ VERSION="$1"
100
+ fi
101
+ shift
102
+ ;;
103
+ esac
104
+ done
105
+
106
+ # Default to current version
107
+ if [[ -z "$VERSION" ]]; then
108
+ VERSION=$(get_current_version)
109
+ fi
110
+
111
+ # ============================================================================
112
+ # Main
113
+ # ============================================================================
114
+ cd "$PROJECT_ROOT"
115
+
116
+ echo ""
117
+ echo "=============================================="
118
+ echo " DomainForge Changelog Generator"
119
+ echo "=============================================="
120
+ echo ""
121
+
122
+ if $DRY_RUN; then
123
+ log_warn "DRY RUN MODE - No files will be modified"
124
+ echo ""
125
+ fi
126
+
127
+ log_info "Generating changelog for version: $VERSION"
128
+
129
+ # Get commit range
130
+ LAST_TAG=$(get_last_tag)
131
+ if [[ -n "$LAST_TAG" ]]; then
132
+ log_info "Commits since tag: $LAST_TAG"
133
+ COMMIT_RANGE="$LAST_TAG..HEAD"
134
+ else
135
+ log_warn "No previous tags found, using all commits"
136
+ COMMIT_RANGE=""
137
+ fi
138
+
139
+ # Parse commits into categories
140
+ declare -a ADDED=()
141
+ declare -a FIXED=()
142
+ declare -a CHANGED=()
143
+ declare -a DOCS=()
144
+ declare -a OTHER=()
145
+
146
+ while IFS= read -r line; do
147
+ [[ -z "$line" ]] && continue
148
+
149
+ # Extract commit message (format: hash subject)
150
+ subject="${line#* }"
151
+
152
+ # Categorize by conventional commit prefix
153
+ case "$subject" in
154
+ feat:*|feat\(*)
155
+ ADDED+=("${subject#feat:} ")
156
+ ADDED+=("${subject#feat(*)}")
157
+ ;;
158
+ fix:*|fix\(*)
159
+ FIXED+=("${subject#fix:} ")
160
+ ;;
161
+ docs:*|docs\(*)
162
+ DOCS+=("${subject#docs:} ")
163
+ ;;
164
+ refactor:*|perf:*|style:*)
165
+ CHANGED+=("$subject")
166
+ ;;
167
+ chore:*|test:*|ci:*|build:*)
168
+ # Skip maintenance commits from changelog
169
+ ;;
170
+ *)
171
+ # Include non-conventional commits in other
172
+ if [[ ! "$subject" =~ ^(Merge|chore|test|ci|build) ]]; then
173
+ OTHER+=("$subject")
174
+ fi
175
+ ;;
176
+ esac
177
+ done < <(git log $COMMIT_RANGE --oneline --no-merges 2>/dev/null || true)
178
+
179
+ # Generate changelog entry
180
+ DATE=$(date +%Y-%m-%d)
181
+ ENTRY="## [$VERSION] - $DATE"
182
+ ENTRY+="\n"
183
+
184
+ if [[ ${#ADDED[@]} -gt 0 ]]; then
185
+ ENTRY+="\n### 🎉 Added\n"
186
+ for item in "${ADDED[@]}"; do
187
+ # Clean up the commit message
188
+ clean_item=$(echo "$item" | sed 's/^[[:space:]]*//' | sed 's/[[:space:]]*$//')
189
+ [[ -n "$clean_item" ]] && ENTRY+="- $clean_item\n"
190
+ done
191
+ fi
192
+
193
+ if [[ ${#CHANGED[@]} -gt 0 ]]; then
194
+ ENTRY+="\n### ✨ Changed\n"
195
+ for item in "${CHANGED[@]}"; do
196
+ clean_item=$(echo "$item" | sed 's/^[a-z]*:[[:space:]]*//')
197
+ [[ -n "$clean_item" ]] && ENTRY+="- $clean_item\n"
198
+ done
199
+ fi
200
+
201
+ if [[ ${#FIXED[@]} -gt 0 ]]; then
202
+ ENTRY+="\n### 🐛 Fixed\n"
203
+ for item in "${FIXED[@]}"; do
204
+ clean_item=$(echo "$item" | sed 's/^[[:space:]]*//' | sed 's/[[:space:]]*$//')
205
+ [[ -n "$clean_item" ]] && ENTRY+="- $clean_item\n"
206
+ done
207
+ fi
208
+
209
+ if [[ ${#DOCS[@]} -gt 0 ]]; then
210
+ ENTRY+="\n### 📚 Documentation\n"
211
+ for item in "${DOCS[@]}"; do
212
+ clean_item=$(echo "$item" | sed 's/^[[:space:]]*//' | sed 's/[[:space:]]*$//')
213
+ [[ -n "$clean_item" ]] && ENTRY+="- $clean_item\n"
214
+ done
215
+ fi
216
+
217
+ # If no categorized commits, add placeholder
218
+ if [[ ${#ADDED[@]} -eq 0 && ${#CHANGED[@]} -eq 0 && ${#FIXED[@]} -eq 0 && ${#DOCS[@]} -eq 0 ]]; then
219
+ ENTRY+="\n### Added\n- (Add new features here)\n"
220
+ ENTRY+="\n### Changed\n- (Add changes here)\n"
221
+ ENTRY+="\n### Fixed\n- (Add bug fixes here)\n"
222
+ fi
223
+
224
+ ENTRY+="\n"
225
+
226
+ # Show preview
227
+ echo ""
228
+ log_info "Generated changelog entry:"
229
+ echo "---"
230
+ echo -e "$ENTRY"
231
+ echo "---"
232
+
233
+ # Update CHANGELOG.md
234
+ if $DRY_RUN; then
235
+ log_info "Would insert above entry into CHANGELOG.md"
236
+ else
237
+ if [[ -f "CHANGELOG.md" ]]; then
238
+ # Find first version heading and insert before it
239
+ FIRST_VERSION_LINE=$(grep -n "^## \[" CHANGELOG.md | head -1 | cut -d: -f1 || echo "")
240
+
241
+ if [[ -n "$FIRST_VERSION_LINE" ]]; then
242
+ head -n $((FIRST_VERSION_LINE - 1)) CHANGELOG.md > /tmp/changelog_new.md
243
+ echo -e "$ENTRY" >> /tmp/changelog_new.md
244
+ tail -n "+$FIRST_VERSION_LINE" CHANGELOG.md >> /tmp/changelog_new.md
245
+ mv /tmp/changelog_new.md CHANGELOG.md
246
+ else
247
+ # No existing version entries, append
248
+ echo -e "$ENTRY" >> CHANGELOG.md
249
+ fi
250
+
251
+ log_success "Updated CHANGELOG.md"
252
+ else
253
+ # Create new CHANGELOG.md
254
+ echo "# Changelog" > CHANGELOG.md
255
+ echo "" >> CHANGELOG.md
256
+ echo -e "$ENTRY" >> CHANGELOG.md
257
+ log_success "Created CHANGELOG.md"
258
+ fi
259
+
260
+ # Create git commit
261
+ if ! $NO_COMMIT; then
262
+ git add CHANGELOG.md
263
+ git commit -m "docs: update changelog for v$VERSION" --quiet
264
+ log_success "Created commit: docs: update changelog for v$VERSION"
265
+ fi
266
+ fi
267
+
268
+ echo ""
269
+ echo "=============================================="
270
+ log_success "Changelog generation complete"
271
+ echo "=============================================="
@@ -0,0 +1,205 @@
1
+ #!/usr/bin/env bash
2
+ # generate-release-notes.sh - Generate GitHub release notes
3
+ # Usage: ./scripts/generate-release-notes.sh [VERSION] [OPTIONS]
4
+ #
5
+ # Extracts content from CHANGELOG.md and generates RELEASE_NOTES.md
6
+
7
+ set -euo pipefail
8
+
9
+ # ============================================================================
10
+ # Configuration
11
+ # ============================================================================
12
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
14
+
15
+ # Colors
16
+ RED='\033[0;31m'
17
+ GREEN='\033[0;32m'
18
+ YELLOW='\033[1;33m'
19
+ BLUE='\033[0;34m'
20
+ NC='\033[0m'
21
+
22
+ # Flags
23
+ DRY_RUN=false
24
+
25
+ # ============================================================================
26
+ # Helper Functions
27
+ # ============================================================================
28
+ log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
29
+ log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
30
+ log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
31
+ log_error() { echo -e "${RED}[✗]${NC} $1"; }
32
+
33
+ usage() {
34
+ cat <<EOF
35
+ Usage: $(basename "$0") [VERSION] [OPTIONS]
36
+
37
+ Generate GitHub release notes from CHANGELOG.md.
38
+
39
+ ARGUMENTS:
40
+ VERSION Version number (e.g., 0.7.0)
41
+ If not provided, reads from domainforge-core/Cargo.toml
42
+
43
+ OPTIONS:
44
+ --dry-run Show what would be generated without creating file
45
+ -h, --help Show this help message
46
+
47
+ OUTPUT:
48
+ Creates RELEASE_NOTES.md with:
49
+ - Version header
50
+ - What's Changed section (from CHANGELOG)
51
+ - Breaking Changes (if any BREAKING CHANGE: footers found)
52
+ - Contributors list
53
+
54
+ EXAMPLES:
55
+ $(basename "$0") # Generate for current version
56
+ $(basename "$0") 0.7.0 # Generate for specific version
57
+ $(basename "$0") --dry-run # Preview without creating file
58
+ EOF
59
+ }
60
+
61
+ get_current_version() {
62
+ grep -m1 '^version = ' "$PROJECT_ROOT/domainforge-core/Cargo.toml" | sed 's/version = "\(.*\)"/\1/'
63
+ }
64
+
65
+ get_last_tag() {
66
+ git describe --tags --abbrev=0 2>/dev/null || echo ""
67
+ }
68
+
69
+ # ============================================================================
70
+ # Parse Arguments
71
+ # ============================================================================
72
+ VERSION=""
73
+
74
+ while [[ $# -gt 0 ]]; do
75
+ case $1 in
76
+ --dry-run)
77
+ DRY_RUN=true
78
+ shift
79
+ ;;
80
+ -h|--help)
81
+ usage
82
+ exit 0
83
+ ;;
84
+ -*)
85
+ log_error "Unknown option: $1"
86
+ usage
87
+ exit 1
88
+ ;;
89
+ *)
90
+ if [[ -z "$VERSION" ]]; then
91
+ VERSION="$1"
92
+ fi
93
+ shift
94
+ ;;
95
+ esac
96
+ done
97
+
98
+ if [[ -z "$VERSION" ]]; then
99
+ VERSION=$(get_current_version)
100
+ fi
101
+
102
+ # ============================================================================
103
+ # Main
104
+ # ============================================================================
105
+ cd "$PROJECT_ROOT"
106
+
107
+ echo ""
108
+ echo "=============================================="
109
+ echo " DomainForge Release Notes Generator"
110
+ echo "=============================================="
111
+ echo ""
112
+
113
+ if $DRY_RUN; then
114
+ log_warn "DRY RUN MODE - No files will be created"
115
+ echo ""
116
+ fi
117
+
118
+ log_info "Generating release notes for version: $VERSION"
119
+
120
+ DATE=$(date +%Y-%m-%d)
121
+
122
+ # Start building release notes
123
+ NOTES="# Release v$VERSION ($DATE)\n\n"
124
+
125
+ # Extract changelog section for this version
126
+ if [[ -f "CHANGELOG.md" ]]; then
127
+ log_info "Extracting changes from CHANGELOG.md..."
128
+
129
+ # Find the section for this version
130
+ CHANGELOG_SECTION=$(awk -v version="$VERSION" '
131
+ /^## \[/ {
132
+ if (found) exit;
133
+ if ($0 ~ "\\[" version "\\]") found=1;
134
+ }
135
+ found { print }
136
+ ' CHANGELOG.md | tail -n +2)
137
+
138
+ if [[ -n "$CHANGELOG_SECTION" ]]; then
139
+ NOTES+="## What's Changed\n\n"
140
+ NOTES+="$CHANGELOG_SECTION\n"
141
+ else
142
+ log_warn "No changelog section found for version $VERSION"
143
+ NOTES+="## What's Changed\n\n"
144
+ NOTES+="See [CHANGELOG.md](./CHANGELOG.md) for details.\n\n"
145
+ fi
146
+ else
147
+ log_warn "CHANGELOG.md not found"
148
+ NOTES+="## What's Changed\n\n"
149
+ NOTES+="See commit history for details.\n\n"
150
+ fi
151
+
152
+ # Check for breaking changes in commits
153
+ LAST_TAG=$(get_last_tag)
154
+ if [[ -n "$LAST_TAG" ]]; then
155
+ BREAKING_CHANGES=$(git log "$LAST_TAG..HEAD" --grep="BREAKING CHANGE" --pretty=format:"- %s" 2>/dev/null || true)
156
+
157
+ if [[ -n "$BREAKING_CHANGES" ]]; then
158
+ NOTES+="## ⚠️ Breaking Changes\n\n"
159
+ NOTES+="$BREAKING_CHANGES\n\n"
160
+ fi
161
+ fi
162
+
163
+ # Get contributors
164
+ log_info "Collecting contributors..."
165
+ if [[ -n "$LAST_TAG" ]]; then
166
+ CONTRIBUTORS=$(git log "$LAST_TAG..HEAD" --format="%an" 2>/dev/null | sort -u | head -20 || true)
167
+ else
168
+ CONTRIBUTORS=$(git log --format="%an" -20 2>/dev/null | sort -u | head -10 || true)
169
+ fi
170
+
171
+ if [[ -n "$CONTRIBUTORS" ]]; then
172
+ NOTES+="## Contributors\n\n"
173
+ while IFS= read -r contributor; do
174
+ [[ -n "$contributor" ]] && NOTES+="- @$contributor\n"
175
+ done <<< "$CONTRIBUTORS"
176
+ NOTES+="\n"
177
+ fi
178
+
179
+ # Add links
180
+ NOTES+="## Links\n\n"
181
+ NOTES+="- [Full Changelog](./CHANGELOG.md)\n"
182
+ NOTES+="- [Documentation](./docs/)\n"
183
+
184
+ if [[ -n "$LAST_TAG" ]]; then
185
+ NOTES+="- [Compare with previous version](https://github.com/GodSpeedAI/DomainForge/compare/$LAST_TAG...v$VERSION)\n"
186
+ fi
187
+
188
+ # Preview or write
189
+ echo ""
190
+ log_info "Generated release notes:"
191
+ echo "---"
192
+ echo -e "$NOTES"
193
+ echo "---"
194
+
195
+ if $DRY_RUN; then
196
+ log_info "Would write above content to RELEASE_NOTES.md"
197
+ else
198
+ echo -e "$NOTES" > RELEASE_NOTES.md
199
+ log_success "Created RELEASE_NOTES.md"
200
+ fi
201
+
202
+ echo ""
203
+ echo "=============================================="
204
+ log_success "Release notes generation complete"
205
+ echo "=============================================="
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env python3
2
+ """Lint release workflows for publish safety and security."""
3
+ import sys
4
+ from pathlib import Path
5
+
6
+ try:
7
+ import yaml
8
+ except ImportError:
9
+ print("PyYAML is required: pip install pyyaml")
10
+ sys.exit(1)
11
+
12
+
13
+ def lint_release_security(path):
14
+ errors = []
15
+ try:
16
+ with open(path) as f:
17
+ wf = yaml.safe_load(f)
18
+ except Exception as e:
19
+ return [f"{path.name}: failed to parse YAML: {e}"]
20
+
21
+ if wf is None:
22
+ return []
23
+
24
+ for job_name, job in wf.get("jobs", {}).items():
25
+ steps = job.get("steps", [])
26
+ for i, step in enumerate(steps):
27
+ run = step.get("run", "")
28
+ name = step.get("name", step.get("uses", "unnamed"))
29
+
30
+ if isinstance(run, str) and "curl" in run:
31
+ piped = run.split("|")[-1].strip() if "|" in run else ""
32
+ if piped.endswith("sh") or piped.endswith("bash"):
33
+ if "sha256" not in run.lower() and "checksum" not in run.lower():
34
+ errors.append(
35
+ f"{path.name}:{job_name}/step[{i}]: "
36
+ f"curl | sh without checksum verification"
37
+ )
38
+
39
+ if step.get("continue-on-error"):
40
+ name_lower = str(name).lower()
41
+ run_lower = str(run).lower()
42
+ if "publish" in name_lower or "publish" in run_lower or "release" in name_lower:
43
+ errors.append(
44
+ f"{path.name}:{job_name}/step[{i}]: "
45
+ f"continue-on-error on publish/release step '{name}'"
46
+ )
47
+
48
+ if isinstance(run, str) and "publish" in run.lower():
49
+ if "|| echo" in run or "|| true" in run:
50
+ if "already" not in run.lower() and "skip" not in run.lower():
51
+ errors.append(
52
+ f"{path.name}:{job_name}/step[{i}]: "
53
+ f"publish failure masked by || echo/|| true in '{name}'"
54
+ )
55
+
56
+ env_block = step.get("env", {})
57
+ uses = step.get("uses", "")
58
+ is_build = isinstance(run, str) and any(
59
+ kw in run for kw in ["cargo build", "npm run build", "wasm-pack build"]
60
+ )
61
+ is_publish = isinstance(run, str) and "publish" in run.lower()
62
+ if is_build and not is_publish:
63
+ token_keys = [k for k in env_block if "token" in k.lower() or "key" in k.lower()]
64
+ if token_keys:
65
+ errors.append(
66
+ f"{path.name}:{job_name}/step[{i}]: "
67
+ f"secret env ({', '.join(token_keys)}) exposed during build step '{name}'"
68
+ )
69
+
70
+ return errors
71
+
72
+
73
+ def main():
74
+ workflows_dir = Path(".github/workflows")
75
+ if not workflows_dir.exists():
76
+ print("No .github/workflows directory found")
77
+ sys.exit(0)
78
+
79
+ all_errors = []
80
+ for wf in sorted(workflows_dir.glob("*.yml")):
81
+ all_errors.extend(lint_release_security(wf))
82
+ for wf in sorted(workflows_dir.glob("*.yaml")):
83
+ all_errors.extend(lint_release_security(wf))
84
+
85
+ if all_errors:
86
+ print("Release security lint FAILURES:")
87
+ for e in all_errors:
88
+ print(f" - {e}")
89
+ sys.exit(1)
90
+ else:
91
+ print("All release security lints passed")
92
+ sys.exit(0)
93
+
94
+
95
+ if __name__ == "__main__":
96
+ main()
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env python3
2
+ """Lint release workflows for security best practices."""
3
+ import sys
4
+ from pathlib import Path
5
+
6
+ try:
7
+ import yaml
8
+ except ImportError:
9
+ print("PyYAML is required: pip install pyyaml")
10
+ sys.exit(1)
11
+
12
+
13
+ def lint_workflow(path):
14
+ errors = []
15
+ try:
16
+ with open(path) as f:
17
+ wf = yaml.safe_load(f)
18
+ except Exception as e:
19
+ return [f"{path.name}: failed to parse YAML: {e}"]
20
+
21
+ if wf is None:
22
+ return []
23
+
24
+ for job_name, job in wf.get("jobs", {}).items():
25
+ steps = job.get("steps", [])
26
+ for i, step in enumerate(steps):
27
+ run = step.get("run", "")
28
+ name = step.get("name", step.get("uses", "unnamed"))
29
+
30
+ if step.get("continue-on-error"):
31
+ run_lower = str(run).lower()
32
+ name_lower = str(name).lower()
33
+ if "publish" in name_lower or "publish" in run_lower:
34
+ errors.append(
35
+ f"{path.name}:{job_name}/step[{i}]: "
36
+ f"continue-on-error on publish step '{name}'"
37
+ )
38
+
39
+ if isinstance(run, str) and "curl" in run:
40
+ piped = run.split("|")[-1].strip() if "|" in run else ""
41
+ if piped.endswith("sh") or "sops" in run:
42
+ if "sha256" not in run.lower() and "checksum" not in run.lower():
43
+ errors.append(
44
+ f"{path.name}:{job_name}/step[{i}]: "
45
+ f"curl download without checksum verification"
46
+ )
47
+
48
+ if isinstance(run, str) and "npm install" in run:
49
+ if "--frozen" not in run and "npm ci" not in run:
50
+ if "release" in path.name:
51
+ errors.append(
52
+ f"{path.name}:{job_name}/step[{i}]: "
53
+ f"unfrozen npm install in release workflow"
54
+ )
55
+
56
+ return errors
57
+
58
+
59
+ def main():
60
+ workflows_dir = Path(".github/workflows")
61
+ if not workflows_dir.exists():
62
+ print("No .github/workflows directory found")
63
+ sys.exit(0)
64
+
65
+ all_errors = []
66
+ for wf in sorted(workflows_dir.glob("*.yml")):
67
+ all_errors.extend(lint_workflow(wf))
68
+ for wf in sorted(workflows_dir.glob("*.yaml")):
69
+ all_errors.extend(lint_workflow(wf))
70
+
71
+ if all_errors:
72
+ print("Release workflow lint FAILURES:")
73
+ for e in all_errors:
74
+ print(f" - {e}")
75
+ sys.exit(1)
76
+ else:
77
+ print("All release workflow lints passed")
78
+ sys.exit(0)
79
+
80
+
81
+ if __name__ == "__main__":
82
+ main()