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,68 @@
1
+ # Adding a New Primitive
2
+
3
+ This playbook outlines the steps required to add a new primitive (e.g., `Zone`, `Cluster`) to the DomainForge language.
4
+
5
+ **Warning**: This is a cross-cutting change that affects Core, Grammar, and all Bindings.
6
+
7
+ ## Checklist
8
+
9
+ ### 1. Rust Core (`domainforge-core`)
10
+
11
+ - [ ] **Grammar**: Update `domainforge-core/grammar/sea.pest`. Add the new keyword and syntax rules.
12
+ - [ ] **AST**: Update `domainforge-core/src/parser/ast.rs` to include the new node type.
13
+ - [ ] **Primitive Struct**: Create `domainforge-core/src/primitives/new_primitive.rs`. Implement `Debug`, `Clone`, `Serialize`.
14
+ - [ ] **Module Exports**: Add the new module to `domainforge-core/src/primitives/mod.rs` and export it (`pub mod new_primitive;` and `pub use` if needed).
15
+ - [ ] **Graph**: Update `domainforge-core/src/graph/mod.rs`. Add an `IndexMap` for the new primitive, expose it with `pub mod`/`pub use`, and wire the new collection into Graph.
16
+ - [ ] **Parser Logic**: Update `domainforge-core/src/parser/mod.rs` to transform the AST node into the Primitive struct, add the module to the `mod` list, and export it.
17
+
18
+ ### 2. Bindings
19
+
20
+ - [ ] **Python**: Update `domainforge-core/src/python/lib.rs` and `domainforge-core/src/python/primitives.rs` to add the `#[pyclass]` wrapper and register it in `lib.rs`.
21
+ - [ ] **TypeScript**: Update `domainforge-core/src/typescript/primitives.rs` and `domainforge-core/src/typescript/index.ts` to add the napi-compatible struct and export it.
22
+ - [ ] **WASM**: Update `domainforge-core/src/wasm/primitives.rs` and `domainforge-core/src/wasm/lib.rs` if the primitive needs specific exposure.
23
+
24
+ ### 3. Testing
25
+
26
+ - [ ] **Rust Tests**: Add a test case in `domainforge-core/tests/parser_tests.rs`.
27
+ - [ ] **Python Tests**: Add a test in `tests/test_primitives.py`.
28
+ - [ ] **TypeScript Tests**: Add a test in `typescript-tests/primitives.test.ts`.
29
+
30
+ ### 4. Documentation
31
+
32
+ - [ ] Update `semantic-modeling-concepts.md`.
33
+ - [ ] Update `sea.pest` comments.
34
+
35
+ ## Example: Adding "Zone"
36
+
37
+ 1. **Grammar**:
38
+
39
+ ```pest
40
+ zone_decl = { "zone" ~ identifier ~ "{" ~ (property)* ~ "}" }
41
+ ```
42
+
43
+ 2. **Struct**:
44
+
45
+ ```rust
46
+ #[derive(Debug, Clone, Serialize, Deserialize)]
47
+ pub struct Zone {
48
+ pub id: ConceptId,
49
+ pub properties: IndexMap<String, Value>,
50
+ }
51
+ ```
52
+
53
+ 3. **Graph**:
54
+
55
+ ```rust
56
+ pub struct Graph {
57
+ pub zones: IndexMap<ConceptId, Zone>,
58
+ // ... other primitive collections (entities, resources, flows, roles, relations, instances)
59
+ }
60
+ ```
61
+
62
+ ## Verification
63
+
64
+ Run the full suite to ensure no regressions:
65
+
66
+ ```bash
67
+ just all-tests
68
+ ```
@@ -0,0 +1,42 @@
1
+ # Debugging Parser Failures
2
+
3
+ When the parser fails to process a `.sea` file, follow these steps to diagnose the issue.
4
+
5
+ ## 1. Read the Error Message
6
+
7
+ Pest provides detailed error locations.
8
+ ```text
9
+ Error: --> 3:12
10
+ |
11
+ 3 | entity Foo { type = "service"
12
+ | ^--- expected "}"
13
+ ```
14
+ *Interpretation*: Missing closing brace.
15
+
16
+ ## 2. Common Syntax Mistakes
17
+
18
+ - **Missing Quotes**: Strings must be double-quoted. `type = service` is wrong; `type = "service"` is right.
19
+ - **Trailing Commas**: SEA does not use commas between properties. Use newlines.
20
+ - **Keywords**: Ensure you aren't using a reserved keyword as an identifier.
21
+
22
+ ## 3. Using the Pest Debugger
23
+
24
+ If you are modifying the grammar, you can use either the web-based playground or the command-line debugger depending on your workflow:
25
+
26
+ - Web playground (fast, visual):
27
+ 1. Go to [pest.rs](https://pest.rs/).
28
+ 2. Paste the content of `domainforge-core/grammar/sea.pest` into the grammar box.
29
+ 3. Paste your failing input into the input box.
30
+ 4. Watch the rule matching visualization to see where it diverges.
31
+
32
+ - CLI debugger (`pest_debugger`) — useful for iterative debugging locally:
33
+ 1. Install the CLI via cargo: `cargo install pest_debugger` or via `cargo install --git https://github.com/pest-parser/pest` if you prefer the latest.
34
+ 2. Run the CLI against your grammar and failing input: `pest_debugger --grammar domainforge-core/grammar/sea.pest --input test.repro.sea`.
35
+ 3. Use the interactive prompt to step rules and inspect matches.
36
+
37
+ ## 4. Reporting Grammar Bugs
38
+
39
+ If valid syntax is rejected:
40
+ 1. Create a minimal reproduction file (`repro.sea`).
41
+ 2. Open an issue with the file content and the error output.
42
+ 3. Tag with `area/parser`.
@@ -0,0 +1,139 @@
1
+ # Local Release Preparation
2
+
3
+ This playbook describes how to prepare a release locally using the just recipes, allowing you to preview changes, generate replay scripts, and test the release process before triggering the GitHub Actions workflow.
4
+
5
+ ## Available Recipes
6
+
7
+ | Recipe | Purpose |
8
+ | ------------------------------ | --------------------------------------------------------------- |
9
+ | `just release-preview [bump]` | Preview all changes + generate replay script (no modifications) |
10
+ | `just prepare-release [bump]` | Apply version bump to all files |
11
+ | `just changelog-entry VERSION` | Add a changelog entry for a specific version |
12
+ | `just test-changelog-logic` | Test changelog insertion logic (restores original) |
13
+
14
+ Where `[bump]` is one of: `patch`, `minor`, `major`
15
+
16
+ ## Prerequisites
17
+
18
+ - `jq` installed (for JSON processing)
19
+ - `just` command runner
20
+ - Clean git working directory (recommended)
21
+
22
+ ## Workflow
23
+
24
+ ### 1. Create a Release Branch
25
+
26
+ Always create a dedicated branch for the release. This allows you to group the changelog updates, version bumps, and any other release-related changes (like updating this playbook!) into a single PR.
27
+
28
+ ```bash
29
+ # From main
30
+ git checkout -b release/x.y.z main
31
+ # Example
32
+ git checkout -b release/0.7.0 main
33
+ ```
34
+
35
+ ### 2. Preview Changes (Recommended)
36
+
37
+ ```bash
38
+ just release-preview minor
39
+ ```
40
+
41
+ This will:
42
+
43
+ - Calculate the new version based on bump type
44
+ - Show unified diffs for all affected files:
45
+ - `domainforge-core/Cargo.toml`
46
+ - `pyproject.toml`
47
+ - `package.json`
48
+ - `CHANGELOG.md`
49
+ - Generate an executable replay script (e.g., `release-0.5.0.sh`)
50
+
51
+ **No files are modified** - this is purely a preview.
52
+
53
+ ### 3. Apply Changes
54
+
55
+ You have two options:
56
+
57
+ **Option A: Run the generated script**
58
+
59
+ ```bash
60
+ ./release-0.7.0.sh
61
+ ```
62
+
63
+ **Option B: Use the just recipe directly**
64
+
65
+ ```bash
66
+ just prepare-release minor
67
+ ```
68
+
69
+ Both approaches produce identical results.
70
+
71
+ ### 4. Review and Commit
72
+
73
+ ```bash
74
+ # Review the changes
75
+ git diff
76
+
77
+ # Edit CHANGELOG.md with actual release notes
78
+ vim CHANGELOG.md
79
+
80
+ # Commit
81
+ git add -A
82
+ git commit -m "chore: bump version to 0.5.0"
83
+ ```
84
+
85
+ ### 5. Continue with Release
86
+
87
+ After preparing locally, you can either:
88
+
89
+ 1. **Push and let CI handle it**: Push the release branch, merge to `main`, create a tag
90
+ 2. **Use the GitHub workflow**: Trigger `prepare-release.yml` which will create a PR
91
+
92
+ ## Pre-release Versions
93
+
94
+ To create a pre-release (e.g., `0.5.0-beta.1`):
95
+
96
+ ```bash
97
+ # Preview
98
+ just release-preview minor beta.1
99
+
100
+ # Apply
101
+ just prepare-release minor beta.1
102
+ ```
103
+
104
+ ## Debugging
105
+
106
+ ### Test Changelog Logic Only
107
+
108
+ ```bash
109
+ just test-changelog-logic
110
+ ```
111
+
112
+ This adds a test entry to CHANGELOG.md, displays the result, then restores the original file.
113
+
114
+ ### Verbose Diff
115
+
116
+ The `release-preview` recipe shows diffs for all files. If you need to inspect a specific file more closely:
117
+
118
+ ```bash
119
+ just release-preview patch 2>&1 | grep -A 50 "Cargo.toml"
120
+ ```
121
+
122
+ ## Integration with GitHub Actions
123
+
124
+ The local recipes mirror the logic in `.github/workflows/prepare-release.yml`:
125
+
126
+ | GitHub Action Step | Local Equivalent |
127
+ | --------------------- | ----------------------------------------------------- |
128
+ | Calculate new version | Same algorithm in `release-preview`/`prepare-release` |
129
+ | Bump Cargo.toml | `sed` replacement |
130
+ | Sync pyproject.toml | `sed` replacement |
131
+ | Sync package.json | `jq` replacement |
132
+ | Update CHANGELOG.md | `just changelog-entry` |
133
+
134
+ This ensures you can validate the release logic locally before triggering the workflow.
135
+
136
+ ## See Also
137
+
138
+ - [Releasing Beta](./releasing-beta.md) - Full release process
139
+ - [Secret Management](./secret-management.md) - Managing release tokens
@@ -0,0 +1,43 @@
1
+ # Migrating Schema Versions
2
+
3
+ As DomainForge evolves, the `.sea` file format may change. This guide explains how to handle migrations.
4
+
5
+ ## Detection
6
+
7
+ The CLI will warn if you are using deprecated syntax.
8
+
9
+ ```text
10
+ Warning: 'interface' keyword is deprecated. Use 'flow' instead.
11
+ ```
12
+
13
+ ## Breaking Changes Strategy
14
+
15
+ ### 1. Automated Migration (Future)
16
+
17
+ We plan to add `sea-cli migrate <file>` to automatically update syntax.
18
+
19
+ ### 2. Manual Migration
20
+
21
+ For now, manual updates are required.
22
+
23
+ **Example: Renaming `connection` to `flow`**
24
+ *Old:*
25
+ ```sea
26
+ connection "c1" from "A" to "B"
27
+ ```
28
+ *New:*
29
+ ```sea
30
+ flow "Data" from "A" to "B"
31
+ ```
32
+
33
+ ## Backward Compatibility
34
+
35
+ We strive to support the previous MAJOR version's syntax for one release cycle.
36
+
37
+ - **v0.4**: Introduces `flow`, deprecates `connection`. Both work.
38
+ - **v0.5**: Removes `connection`.
39
+
40
+ ## Best Practices
41
+
42
+ - Pin the CLI version in your CI pipeline to avoid unexpected breakages.
43
+ - Read the `CHANGELOG.md` before upgrading.
@@ -0,0 +1,64 @@
1
+ # Onboarding Contributors
2
+
3
+ Welcome to the DomainForge team! This guide will get you set up and ready to contribute.
4
+
5
+ ## 1. Development Environment
6
+
7
+ You need:
8
+
9
+ - **Rust**: Latest stable (`rustup update`)
10
+ - **Python**: 3.8+
11
+ - **Node.js**: 16+
12
+ - **Just**: Command runner (`cargo install just`)
13
+
14
+ ## 2. Initial Setup
15
+
16
+ Run the setup script to install dependencies for all languages.
17
+
18
+ ```bash
19
+ just setup
20
+ ```
21
+
22
+ ## 3. Codebase Tour
23
+
24
+ - **`domainforge-core/`**: The brain. Start here.
25
+ - `grammar/`: The syntax definition.
26
+ - `primitives/`: The data structures.
27
+ - **`tests/`**: Integration tests.
28
+ - **`docs/`**: You are here.
29
+
30
+ ## 4. Running Tests
31
+
32
+ Before submitting a PR, ensure everything passes.
33
+
34
+ ```bash
35
+ just all-tests
36
+ ```
37
+
38
+ This runs:
39
+
40
+ 1. `cargo test` (Core)
41
+ 2. `pytest` (Python bindings)
42
+ 3. `vitest` (TypeScript bindings)
43
+
44
+ ## 5. Your First Issue
45
+
46
+ Look for issues labeled `good first issue`.
47
+
48
+ - **Documentation**: Fix typos or add examples.
49
+ - **Parser**: Add a small syntax feature.
50
+ - **CLI**: Improve output formatting.
51
+
52
+ ## 6. PR Process
53
+
54
+ 1. Fork the repo.
55
+ 2. Create a feature branch.
56
+ 3. Make changes.
57
+ 4. Add tests! (We love tests).
58
+ 5. Run `cargo fmt` and `cargo clippy`.
59
+ 6. Submit PR.
60
+
61
+ ## See Also
62
+
63
+ - [Architecture Overview](../explanations/architecture-overview.md)
64
+ - [Developer Commands](../../../justfile)
@@ -0,0 +1,86 @@
1
+ # Releasing Beta
2
+
3
+ This playbook describes the process for releasing a new beta version of DomainForge.
4
+
5
+ ## Prerequisites
6
+
7
+ - Clean git working directory.
8
+ - Passing CI (`just all-tests`).
9
+ - Write access to crates.io, PyPI, and NPM.
10
+
11
+ ## Steps
12
+
13
+ 1. **Version Bump**:
14
+
15
+ > **Recommended**: Use `just release-preview minor` to preview changes first, then `just prepare-release minor` to apply them. See [Local Release Preparation](./local-release-preparation.md) for details.
16
+
17
+ > **Automated (GitHub)**: Use the `prepare-release.yml` workflow (Actions → Prepare Release → Run workflow) to bump all versions and create a PR automatically.
18
+
19
+ If bumping manually, update version in all files (they must stay in sync):
20
+
21
+ - `domainforge-core/Cargo.toml` (source of truth)
22
+ - `pyproject.toml`
23
+ - `package.json`
24
+
25
+ > Note: WASM `pkg/package.json` is auto-generated from `domainforge-core/Cargo.toml` during build.
26
+
27
+ 1. **Changelog**:
28
+
29
+ Update `CHANGELOG.md` with new features and breaking changes.
30
+
31
+ 1. **Build & Test**:
32
+
33
+ ```bash
34
+ just setup
35
+ just all-tests
36
+ ```
37
+
38
+ 1. **Git Tag**:
39
+
40
+ ```bash
41
+ git tag -a v0.x.0 -m "Release v0.x.0"
42
+ git push origin v0.x.0
43
+ ```
44
+
45
+ 1. **Publish Rust Core**:
46
+
47
+ ```bash
48
+ cargo publish -p domainforge-core
49
+ ```
50
+
51
+ 1. **Publish Python**:
52
+
53
+ ```bash
54
+ maturin publish
55
+ ```
56
+
57
+ 1. **Publish TypeScript**:
58
+
59
+ ```bash
60
+ npm publish
61
+ ```
62
+
63
+ 1. **GitHub Release**:
64
+
65
+ Draft a new release on GitHub using the changelog notes.
66
+
67
+ If a critical bug is found immediately:
68
+
69
+ - **Rust**: Yank the crate (`cargo yank --vers <version>`).
70
+
71
+ - **NPM**: Deprecate the package version and suggest replacement:
72
+
73
+ ```bash
74
+ npm deprecate @godspeedai/domainforge@0.x.0 "Critical security bug; use @godspeedai/domainforge@0.x.1"
75
+ ```
76
+
77
+ - **PyPI**: Yank/unyank through standard tooling (e.g., `twine` or `maturin publish --yank`) or publish a hotfix patch:
78
+
79
+ ```bash
80
+ # Publish a hotfix
81
+ git checkout -b hotfix/0.x.1
82
+ bumpversion patch
83
+ git push origin hotfix/0.x.1
84
+ # Create release and upload via twine/maturin
85
+ maturin publish --skip-existing
86
+ ```
@@ -0,0 +1,64 @@
1
+ # Secret Management with SOPS + age
2
+
3
+ Scope: securely manage project secrets under `secrets/` using SOPS and age; keep encrypted files in git and avoid plaintext leaks.
4
+
5
+ ## Preconditions
6
+
7
+ - age key pair available (or generate one).
8
+ - `sops` installed locally/CI.
9
+ - `secrets/secrets.template.yaml` present as a placeholder.
10
+
11
+ ## Steps
12
+
13
+ 1. **Create editable copy**
14
+
15
+ ```bash
16
+ cp secrets/secrets.template.yaml secrets/secrets.yaml
17
+ # fill in real values
18
+ ```
19
+
20
+ 2. **Encrypt in place**
21
+
22
+ ```bash
23
+ # replace AGE_PUBLIC_KEY with your age public key
24
+ sops --encrypt --age "AGE_PUBLIC_KEY" --in-place secrets/secrets.yaml
25
+ ```
26
+
27
+ - Verify encryption (`head -n 5 secrets/secrets.yaml` shows a `sops:` section).
28
+
29
+ 3. **Commit only encrypted files**
30
+
31
+ ```bash
32
+ git add secrets/secrets.yaml .sops.yaml
33
+ git commit -m "Add encrypted secrets"
34
+ ```
35
+
36
+ 4. **Decrypt when needed (local only)**
37
+
38
+ ```bash
39
+ sops --decrypt secrets/secrets.yaml > /tmp/decrypted-secrets.yaml
40
+ # or edit inline
41
+ sops secrets/secrets.yaml
42
+ ```
43
+
44
+ 5. **Rotate or add recipients**
45
+
46
+ ```bash
47
+ sops --add-recipients "AGE_PUBLIC_KEY" --in-place secrets/secrets.yaml
48
+ # remove a key by re-encrypting without it
49
+ ```
50
+
51
+ 6. **Use in CI**
52
+
53
+ - Provide `SOPS_AGE_KEY` (private key) as a CI secret.
54
+ - Decrypt with `sops --decrypt secrets/secrets.yaml > /tmp/secrets.yaml` before publishing packages.
55
+
56
+ ## Security notes
57
+
58
+ - Never commit plaintext secrets or private age keys.
59
+ - Keep `.sops.yaml` aligned with repository paths; use per-environment keys when possible.
60
+
61
+ ## See also
62
+
63
+ - [Configuration](../reference/configuration.md) for registry/environment flags
64
+ - [.sops.yaml](../../.sops.yaml) for creation rules