hecks 2.7.0 → 2.9.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 (463) hide show
  1. checksums.yaml +4 -4
  2. data/exe/hecks +11 -0
  3. data/lib/hecks/adapters/driven/claude_code.rb +4 -104
  4. data/lib/hecks/adapters/driven/d1.rb +44 -237
  5. data/lib/hecks/adapters/driven/folder.rb +17 -76
  6. data/lib/hecks/adapters/driven/google_authentication.rb +15 -49
  7. data/lib/hecks/adapters/driven/governance_authorization.rb +23 -70
  8. data/lib/hecks/adapters/driven/heki/journal.rb +8 -41
  9. data/lib/hecks/adapters/driven/heki/saga_store.rb +12 -54
  10. data/lib/hecks/adapters/driven/heki/snapshot.rb +4 -12
  11. data/lib/hecks/adapters/driven/heki.rb +13 -42
  12. data/lib/hecks/adapters/driven/identity_registry.rb +3 -14
  13. data/lib/hecks/adapters/driven/in_memory_ordering.rb +9 -26
  14. data/lib/hecks/adapters/driven/in_process_key_vault.rb +2 -14
  15. data/lib/hecks/adapters/driven/lambda/client.rb +10 -51
  16. data/lib/hecks/adapters/driven/lambda.rb +10 -84
  17. data/lib/hecks/adapters/driven/local_storage.rb +5 -40
  18. data/lib/hecks/adapters/driven/memory.rb +18 -99
  19. data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +5 -21
  20. data/lib/hecks/adapters/driven/postgres/codec.rb +6 -28
  21. data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -12
  22. data/lib/hecks/adapters/driven/postgres/reconnect.rb +4 -30
  23. data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
  24. data/lib/hecks/adapters/driven/postgres.rb +145 -134
  25. data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
  26. data/lib/hecks/adapters/driven/prism.rb +7 -30
  27. data/lib/hecks/adapters/driven/sql_query_builder.rb +21 -121
  28. data/lib/hecks/adapters/driven/sqlite/codec.rb +8 -40
  29. data/lib/hecks/adapters/driven/sqlite/projection.rb +26 -82
  30. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +40 -84
  31. data/lib/hecks/adapters/driven/sqlite.rb +128 -65
  32. data/lib/hecks/adapters/driven/tenant_provisioner.rb +15 -37
  33. data/lib/hecks/adapters/driven.rb +5 -36
  34. data/lib/hecks/adapters/driving/github_webhook.rb +8 -76
  35. data/lib/hecks/behaviors/dsl.rb +7 -25
  36. data/lib/hecks/behaviors/expectations.rb +32 -142
  37. data/lib/hecks/behaviors/ir.rb +7 -20
  38. data/lib/hecks/behaviors/rspec.rb +6 -17
  39. data/lib/hecks/behaviors/runner.rb +10 -34
  40. data/lib/hecks/behaviors.rb +4 -8
  41. data/lib/hecks/bluebook/aggregate.rb +9 -75
  42. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +9 -38
  43. data/lib/hecks/bluebook/assembly/build.rb +4 -15
  44. data/lib/hecks/bluebook/assembly/contract.rb +15 -136
  45. data/lib/hecks/bluebook/assembly/contracts.rb +54 -174
  46. data/lib/hecks/bluebook/assembly/marks.rb +31 -223
  47. data/lib/hecks/bluebook/assembly/specializer.rb +6 -52
  48. data/lib/hecks/bluebook/assembly.rb +6 -45
  49. data/lib/hecks/bluebook/attribute.rb +12 -61
  50. data/lib/hecks/bluebook/behaviour/aggregate.rb +10 -39
  51. data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
  52. data/lib/hecks/bluebook/behaviour/chapter.rb +17 -42
  53. data/lib/hecks/bluebook/behaviour/command.rb +14 -66
  54. data/lib/hecks/bluebook/behaviour/domain_port.rb +4 -20
  55. data/lib/hecks/bluebook/behaviour/entity.rb +7 -27
  56. data/lib/hecks/bluebook/behaviour/hexagon.rb +23 -41
  57. data/lib/hecks/bluebook/behaviour/lifecycle.rb +15 -40
  58. data/lib/hecks/bluebook/behaviour/policy.rb +23 -52
  59. data/lib/hecks/bluebook/behaviour/process_manager.rb +30 -57
  60. data/lib/hecks/bluebook/behaviour/read_model.rb +38 -26
  61. data/lib/hecks/bluebook/behaviour/traits.rb +27 -64
  62. data/lib/hecks/bluebook/behaviour/value_object.rb +5 -24
  63. data/lib/hecks/bluebook/capabilities.rb +17 -49
  64. data/lib/hecks/bluebook/chapter.rb +10 -48
  65. data/lib/hecks/bluebook/command.rb +23 -81
  66. data/lib/hecks/bluebook/domain_port.rb +14 -63
  67. data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +50 -229
  68. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +50 -377
  69. data/lib/hecks/bluebook/dsl/attribute_collector.rb +33 -204
  70. data/lib/hecks/bluebook/dsl/binding_proxy.rb +17 -65
  71. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +86 -708
  72. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +56 -170
  73. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +1 -0
  74. data/lib/hecks/bluebook/dsl/command_builder.rb +74 -546
  75. data/lib/hecks/bluebook/dsl/const_shim.rb +8 -41
  76. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +12 -87
  77. data/lib/hecks/bluebook/dsl/entity_builder.rb +44 -330
  78. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +20 -269
  79. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +26 -189
  80. data/lib/hecks/bluebook/dsl/identity_declaration.rb +13 -88
  81. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +6 -20
  82. data/lib/hecks/bluebook/dsl/policy_builder.rb +16 -88
  83. data/lib/hecks/bluebook/dsl/port_builder.rb +2 -6
  84. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +22 -96
  85. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +31 -184
  86. data/lib/hecks/bluebook/dsl/query_builder.rb +11 -42
  87. data/lib/hecks/bluebook/dsl/read_model_builder.rb +75 -201
  88. data/lib/hecks/bluebook/dsl/rule_reference.rb +22 -163
  89. data/lib/hecks/bluebook/dsl/translation_builder.rb +28 -114
  90. data/lib/hecks/bluebook/dsl/value_object_builder.rb +10 -124
  91. data/lib/hecks/bluebook/dsl/word_gate.rb +16 -162
  92. data/lib/hecks/bluebook/dsl/world_builder.rb +19 -106
  93. data/lib/hecks/bluebook/entity.rb +13 -71
  94. data/lib/hecks/bluebook/expression/ast_json.rb +24 -190
  95. data/lib/hecks/bluebook/expression/ast_reader.rb +12 -54
  96. data/lib/hecks/bluebook/expression/canonical_form.rb +11 -88
  97. data/lib/hecks/bluebook/expression/evaluator.rb +47 -295
  98. data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +30 -147
  99. data/lib/hecks/bluebook/expression/resolver.rb +37 -660
  100. data/lib/hecks/bluebook/hexagon.rb +5 -28
  101. data/lib/hecks/bluebook/lifecycle.rb +5 -16
  102. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -7
  103. data/lib/hecks/bluebook/meta_validator/judge.rb +111 -361
  104. data/lib/hecks/bluebook/meta_validator/plan.rb +33 -162
  105. data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -7
  106. data/lib/hecks/bluebook/meta_validator/readings.rb +56 -342
  107. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +24 -176
  108. data/lib/hecks/bluebook/meta_validator/shapes.rb +54 -268
  109. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +47 -308
  110. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
  111. data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
  112. data/lib/hecks/bluebook/meta_validator.rb +79 -349
  113. data/lib/hecks/bluebook/model_check/client_profile.rb +10 -91
  114. data/lib/hecks/bluebook/model_check.rb +102 -600
  115. data/lib/hecks/bluebook/pattern_subset.rb +11 -69
  116. data/lib/hecks/bluebook/process_manager.rb +13 -83
  117. data/lib/hecks/bluebook/project_loader.rb +3 -39
  118. data/lib/hecks/bluebook/project_register.rb +12 -60
  119. data/lib/hecks/bluebook/query.rb +9 -48
  120. data/lib/hecks/bluebook/read_model.rb +57 -81
  121. data/lib/hecks/bluebook/reference.rb +7 -41
  122. data/lib/hecks/bluebook/smoke_test.rb +8 -98
  123. data/lib/hecks/bluebook/synthesizer.rb +13 -62
  124. data/lib/hecks/bluebook/translation.rb +26 -62
  125. data/lib/hecks/bluebook/value_object.rb +11 -36
  126. data/lib/hecks/bluebook.rb +5 -22
  127. data/lib/hecks/cache_dir.rb +84 -0
  128. data/lib/hecks/cli/document.rb +86 -0
  129. data/lib/hecks/cli/ir.rb +45 -0
  130. data/lib/hecks/cli/mcp.rb +31 -0
  131. data/lib/hecks/cli/mcp_door.rb +366 -0
  132. data/lib/hecks/cli/model_check.rb +203 -0
  133. data/lib/hecks/cli/project_cli.rb +90 -0
  134. data/lib/hecks/cli/project_diagrams.rb +36 -0
  135. data/lib/hecks/cli/run.rb +173 -0
  136. data/lib/hecks/cli/smoke_test.rb +45 -0
  137. data/lib/hecks/cli/stores.rb +53 -0
  138. data/lib/hecks/cli.rb +160 -0
  139. data/lib/hecks/construct.rb +8 -34
  140. data/lib/hecks/deploy/bluebook/deploy.bluebook +33 -142
  141. data/lib/hecks/deploy/bluebook/deploy.hecksagon +2 -9
  142. data/lib/hecks/embryonaut_bluebook/lock.rb +3 -35
  143. data/lib/hecks/embryonaut_bluebook/shape.rb +1 -17
  144. data/lib/hecks/embryonaut_bluebook/vendor.rb +8 -53
  145. data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +4 -19
  146. data/lib/hecks/embryonaut_bluebook.rb +4 -71
  147. data/lib/hecks/facade/cli_door.rb +24 -106
  148. data/lib/hecks/facade/cli_runner.rb +28 -172
  149. data/lib/hecks/facade/command_request.rb +13 -33
  150. data/lib/hecks/facade/handle.rb +34 -121
  151. data/lib/hecks/facade/json_door.rb +31 -146
  152. data/lib/hecks/facade/surface/aggregate_door.rb +39 -104
  153. data/lib/hecks/facade/surface/chapter.rb +10 -54
  154. data/lib/hecks/facade/surface.rb +8 -23
  155. data/lib/hecks/facade.rb +10 -25
  156. data/lib/hecks/forms/app.rb +15 -70
  157. data/lib/hecks/forms/command_form_renderer.rb +10 -29
  158. data/lib/hecks/forms/field_renderer.rb +17 -156
  159. data/lib/hecks/forms/field_shape.rb +30 -222
  160. data/lib/hecks/forms/html.rb +12 -47
  161. data/lib/hecks/forms/index_renderer.rb +1 -4
  162. data/lib/hecks/forms/page.rb +3 -9
  163. data/lib/hecks/forms/params.rb +14 -60
  164. data/lib/hecks/forms/port_argument.rb +2 -19
  165. data/lib/hecks/forms/query_form_renderer.rb +4 -79
  166. data/lib/hecks/forms/record_renderer.rb +8 -75
  167. data/lib/hecks/forms/record_table.rb +7 -50
  168. data/lib/hecks/forms/reference_options.rb +3 -30
  169. data/lib/hecks/forms/value_object_shape.rb +8 -35
  170. data/lib/hecks/forms.rb +5 -33
  171. data/lib/hecks/fqn.rb +5 -12
  172. data/lib/hecks/framework/bluebook/compliance.bluebook +16 -65
  173. data/lib/hecks/framework/bluebook/console_settings.bluebook +47 -134
  174. data/lib/hecks/framework/bluebook/framework.hecksagon +5 -14
  175. data/lib/hecks/framework/bluebook/governance.bluebook +13 -34
  176. data/lib/hecks/framework/bluebook/identity.bluebook +11 -26
  177. data/lib/hecks/framework/bluebook/privacy.bluebook +8 -33
  178. data/lib/hecks/framework.rb +11 -80
  179. data/lib/hecks/freezer.rb +5 -39
  180. data/lib/hecks/grammar/expression.bluebook +15 -40
  181. data/lib/hecks/grammar/translation.bluebook +3 -6
  182. data/lib/hecks/grammar.rb +16 -41
  183. data/lib/hecks/ir.rb +14 -83
  184. data/lib/hecks/language/adapter.bluebook +2 -7
  185. data/lib/hecks/language/bluebook/aggregate.bluebook +56 -221
  186. data/lib/hecks/language/bluebook/attaches/paging.bluebook +6 -15
  187. data/lib/hecks/language/bluebook/bluebook.bluebook +15 -83
  188. data/lib/hecks/language/bluebook/bluebook.hecksagon +3 -15
  189. data/lib/hecks/language/bluebook/command.bluebook +27 -144
  190. data/lib/hecks/language/bluebook/entity.bluebook +24 -97
  191. data/lib/hecks/language/bluebook/policy.bluebook +16 -67
  192. data/lib/hecks/language/bluebook/process_manager.bluebook +28 -151
  193. data/lib/hecks/language/bluebook/projection.bluebook +126 -60
  194. data/lib/hecks/language/bluebook/query.bluebook +12 -43
  195. data/lib/hecks/language/bluebook/shape.bluebook +23 -73
  196. data/lib/hecks/language/bluebook/syntax.bluebook +51 -262
  197. data/lib/hecks/language/bluebook/vocabulary.bluebook +98 -197
  198. data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
  199. data/lib/hecks/language/hecksagon/domain_port.bluebook +4 -19
  200. data/lib/hecks/language/hecksagon/hecksagon.bluebook +6 -25
  201. data/lib/hecks/language/hecksagon/port_operation.bluebook +3 -14
  202. data/lib/hecks/language/oidc.json +35 -0
  203. data/lib/hecks/language/port.bluebook +4 -17
  204. data/lib/hecks/language/translation/translation.bluebook +3 -9
  205. data/lib/hecks/language/translation/translation_aggregate.bluebook +5 -24
  206. data/lib/hecks/language/world/wiring.bluebook +1 -3
  207. data/lib/hecks/language/world/world.bluebook +5 -7
  208. data/lib/hecks/literal.rb +8 -50
  209. data/lib/hecks/mcp_door_scope.rb +95 -0
  210. data/lib/hecks/mcp_stdio_guard.rb +4 -41
  211. data/lib/hecks/naming.rb +29 -137
  212. data/lib/hecks/ports/access_control.rb +7 -23
  213. data/lib/hecks/ports/agent/answers.rb +5 -23
  214. data/lib/hecks/ports/agent.rb +47 -172
  215. data/lib/hecks/ports/authentication.rb +12 -39
  216. data/lib/hecks/ports/authorization.rb +16 -43
  217. data/lib/hecks/ports/clock.rb +5 -45
  218. data/lib/hecks/ports/extraction.rb +7 -12
  219. data/lib/hecks/ports/identity_assignment.rb +8 -29
  220. data/lib/hecks/ports/identity_generation.rb +6 -29
  221. data/lib/hecks/ports/identity_resolution.rb +2 -10
  222. data/lib/hecks/ports/key_vault.rb +9 -45
  223. data/lib/hecks/ports/persistence/append_only.rb +62 -65
  224. data/lib/hecks/ports/persistence/binding_policy.rb +4 -14
  225. data/lib/hecks/ports/persistence/codec_boundary.rb +20 -80
  226. data/lib/hecks/ports/persistence/null_saga_store.rb +4 -20
  227. data/lib/hecks/ports/persistence/plugin.rb +13 -42
  228. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +38 -141
  229. data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
  230. data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +16 -84
  231. data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +7 -26
  232. data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +3 -22
  233. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +55 -181
  234. data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +77 -0
  235. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +12 -122
  236. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +28 -128
  237. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +73 -474
  238. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +31 -124
  239. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +45 -219
  240. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +13 -108
  241. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +18 -75
  242. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +9 -49
  243. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +6 -123
  244. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +23 -55
  245. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +14 -72
  246. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +7 -16
  247. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +14 -115
  248. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
  249. data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +127 -554
  250. data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
  251. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +2 -17
  252. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +3 -14
  253. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +13 -58
  254. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -17
  255. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -26
  256. data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +9 -25
  257. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +22 -122
  258. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +34 -123
  259. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +5 -12
  260. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +3 -9
  261. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -14
  262. data/lib/hecks/ports/persistence/plugins/era.rb +4 -23
  263. data/lib/hecks/ports/persistence/postgres_dump/connection.rb +7 -23
  264. data/lib/hecks/ports/persistence/postgres_dump.rb +4 -35
  265. data/lib/hecks/ports/persistence/remote_runtime.rb +2 -24
  266. data/lib/hecks/ports/persistence/repository_factory.rb +8 -27
  267. data/lib/hecks/ports/persistence/state_codec.rb +23 -103
  268. data/lib/hecks/ports/persistence.rb +7 -14
  269. data/lib/hecks/ports/projection.rb +42 -84
  270. data/lib/hecks/ports/query/in_memory.rb +10 -58
  271. data/lib/hecks/ports/query/ordering.rb +11 -32
  272. data/lib/hecks/ports/query.rb +14 -37
  273. data/lib/hecks/ports.rb +2 -8
  274. data/lib/hecks/projections/bootstrap_table.rb +11 -43
  275. data/lib/hecks/projections/deploy/fargate/assembly.rb +2 -15
  276. data/lib/hecks/projections/deploy/fargate/cdn.rb +1 -48
  277. data/lib/hecks/projections/deploy/fargate/cdn_default.rb +2 -11
  278. data/lib/hecks/projections/deploy/fargate/check.rb +5 -14
  279. data/lib/hecks/projections/deploy/fargate/containers.rb +3 -78
  280. data/lib/hecks/projections/deploy/fargate/extras.rb +3 -44
  281. data/lib/hecks/projections/deploy/fargate/monitoring.rb +0 -44
  282. data/lib/hecks/projections/deploy/fargate/settings.rb +2 -54
  283. data/lib/hecks/projections/deploy/fargate/yaml.rb +13 -58
  284. data/lib/hecks/projections/deploy/fargate.rb +35 -202
  285. data/lib/hecks/projections/deploy/lambda.rb +151 -679
  286. data/lib/hecks/projections/deploy/preview/access_yaml.rb +1 -33
  287. data/lib/hecks/projections/deploy/preview/containers.rb +6 -111
  288. data/lib/hecks/projections/deploy/preview/routing_yaml.rb +4 -56
  289. data/lib/hecks/projections/deploy/preview/script.rb +2 -14
  290. data/lib/hecks/projections/deploy/preview/settings.rb +3 -33
  291. data/lib/hecks/projections/deploy/preview/task_yaml.rb +2 -38
  292. data/lib/hecks/projections/deploy/preview/template.rb +2 -58
  293. data/lib/hecks/projections/deploy/preview.rb +2 -67
  294. data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
  295. data/lib/hecks/projections/deploy/scripts.rb +4 -57
  296. data/lib/hecks/projections/deploy/shared.rb +47 -146
  297. data/lib/hecks/projections/deploy/smoke.rb +4 -61
  298. data/lib/hecks/projections/deploy/template_diff/comparer.rb +3 -25
  299. data/lib/hecks/projections/deploy/template_diff/loader.rb +2 -11
  300. data/lib/hecks/projections/deploy/template_diff.rb +5 -57
  301. data/lib/hecks/projections/diagrams.rb +20 -582
  302. data/lib/hecks/projections/glossary/html.rb +14 -130
  303. data/lib/hecks/projections/glossary/markdown.rb +8 -69
  304. data/lib/hecks/projections/glossary/mermaid.rb +9 -66
  305. data/lib/hecks/projections/glossary/sensitivity.rb +5 -34
  306. data/lib/hecks/projections/glossary/sentences.rb +14 -159
  307. data/lib/hecks/projections/glossary.rb +30 -222
  308. data/lib/hecks/projections/ir.rb +3 -10
  309. data/lib/hecks/projections/model/deviations.rb +15 -42
  310. data/lib/hecks/projections/model.rb +12 -51
  311. data/lib/hecks/projections/oidc.rb +12 -56
  312. data/lib/hecks/projections/parser_table.rb +9 -28
  313. data/lib/hecks/projections/reference.rb +9 -16
  314. data/lib/hecks/projections/rust_vocabulary.rb +12 -250
  315. data/lib/hecks/projections/shape.rb +3 -29
  316. data/lib/hecks/projections/statements.rb +7 -86
  317. data/lib/hecks/projections/vocabulary.rb +6 -22
  318. data/lib/hecks/projections.rb +2 -16
  319. data/lib/hecks/projector/cli_projector.rb +60 -375
  320. data/lib/hecks/projector/docs_projector.rb +10 -201
  321. data/lib/hecks/projector/exporter.rb +46 -138
  322. data/lib/hecks/projector/ir_projector.rb +2 -9
  323. data/lib/hecks/projector/narrate_projector.rb +15 -189
  324. data/lib/hecks/projector/target.rb +13 -76
  325. data/lib/hecks/projector.rb +30 -121
  326. data/lib/hecks/query_specification/common/comparators.rb +5 -26
  327. data/lib/hecks/query_specification/common/comparison.rb +35 -143
  328. data/lib/hecks/query_specification/common/dsl.rb +8 -24
  329. data/lib/hecks/query_specification/common/null_policy.rb +20 -70
  330. data/lib/hecks/query_specification/common/options.rb +2 -6
  331. data/lib/hecks/query_specification/common/where_clause.rb +2 -10
  332. data/lib/hecks/query_specification/field_path.rb +37 -77
  333. data/lib/hecks/query_specification/hop_path.rb +12 -76
  334. data/lib/hecks/release/gem_pin.rb +2 -26
  335. data/lib/hecks/release/runner/ci_publisher.rb +93 -0
  336. data/lib/hecks/release/runner/commands.rb +66 -0
  337. data/lib/hecks/release/runner/console.rb +52 -0
  338. data/lib/hecks/release/runner/gem_publisher.rb +43 -0
  339. data/lib/hecks/release/runner/git.rb +48 -0
  340. data/lib/hecks/release/runner/npm_publisher.rb +75 -0
  341. data/lib/hecks/release/runner/preflight.rb +104 -0
  342. data/lib/hecks/release/runner/published.rb +55 -0
  343. data/lib/hecks/release/runner/tagger.rb +80 -0
  344. data/lib/hecks/release/runner.rb +215 -0
  345. data/lib/hecks/rendering.rb +4 -26
  346. data/lib/hecks/router/namespace_installer.rb +12 -36
  347. data/lib/hecks/router.rb +4 -8
  348. data/lib/hecks/runtime/aggregate_lock.rb +8 -33
  349. data/lib/hecks/runtime/boot_gates.rb +3 -18
  350. data/lib/hecks/runtime/caller.rb +19 -59
  351. data/lib/hecks/runtime/capability_graph.rb +5 -21
  352. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
  353. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +23 -160
  354. data/lib/hecks/runtime/command_interpreter.rb +125 -307
  355. data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
  356. data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
  357. data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
  358. data/lib/hecks/runtime/command_rules/emission.rb +8 -21
  359. data/lib/hecks/runtime/command_rules/references.rb +23 -202
  360. data/lib/hecks/runtime/dependency_planning.rb +30 -102
  361. data/lib/hecks/runtime/dispatcher.rb +82 -241
  362. data/lib/hecks/runtime/entity_element.rb +40 -462
  363. data/lib/hecks/runtime/entity_interpreter.rb +65 -220
  364. data/lib/hecks/runtime/errors.rb +32 -115
  365. data/lib/hecks/runtime/event.rb +3 -25
  366. data/lib/hecks/runtime/identity.rb +18 -154
  367. data/lib/hecks/runtime/instance.rb +18 -150
  368. data/lib/hecks/runtime/interpreting.rb +11 -70
  369. data/lib/hecks/runtime/invocation.rb +28 -164
  370. data/lib/hecks/runtime/loader.rb +48 -186
  371. data/lib/hecks/runtime/outbox.rb +38 -261
  372. data/lib/hecks/runtime/policy_interpreter.rb +38 -200
  373. data/lib/hecks/runtime/port_operation_interpreter.rb +26 -87
  374. data/lib/hecks/runtime/query_interpreter.rb +45 -187
  375. data/lib/hecks/runtime/reaction_invocation.rb +36 -138
  376. data/lib/hecks/runtime/read_model_interpreter.rb +139 -208
  377. data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
  378. data/lib/hecks/runtime/reference_hop.rb +8 -81
  379. data/lib/hecks/runtime/refusal_wording.rb +8 -89
  380. data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
  381. data/lib/hecks/runtime/registry/verification.rb +52 -225
  382. data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
  383. data/lib/hecks/runtime/registry.rb +103 -244
  384. data/lib/hecks/runtime/remote_dispatcher.rb +37 -152
  385. data/lib/hecks/runtime/routing.rb +4 -15
  386. data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
  387. data/lib/hecks/runtime/saga_interpreter.rb +79 -263
  388. data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
  389. data/lib/hecks/runtime/tenant_check.rb +6 -68
  390. data/lib/hecks/runtime/tenant_scope.rb +3 -28
  391. data/lib/hecks/runtime/value/admission.rb +16 -67
  392. data/lib/hecks/runtime/value/coercion.rb +155 -641
  393. data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
  394. data/lib/hecks/runtime/value.rb +12 -84
  395. data/lib/hecks/runtime.rb +17 -65
  396. data/lib/hecks/storehouse.rb +146 -567
  397. data/lib/hecks/tenancy/bluebook/tenancy.bluebook +8 -32
  398. data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
  399. data/lib/hecks/vendoring/git_environment.rb +2 -8
  400. data/lib/hecks/vendoring/git_source.rb +4 -10
  401. data/lib/hecks/vendoring.rb +7 -46
  402. data/lib/hecks/version.rb +3 -14
  403. data/lib/hecks/vocabulary.rb +5 -0
  404. data/lib/hecks.rb +32 -82
  405. data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
  406. data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
  407. data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
  408. metadata +30 -59
  409. data/lib/hecks/bench/cli.rb +0 -74
  410. data/lib/hecks/bench/environment.rb +0 -100
  411. data/lib/hecks/bench/postgres_probe.rb +0 -41
  412. data/lib/hecks/bench/report.rb +0 -116
  413. data/lib/hecks/bench/ruby_runner.rb +0 -151
  414. data/lib/hecks/bench/run.rb +0 -55
  415. data/lib/hecks/bench/rust_runner.rb +0 -165
  416. data/lib/hecks/bench/stats.rb +0 -75
  417. data/lib/hecks/bench/suite.rb +0 -172
  418. data/lib/hecks/bench/workload.rb +0 -137
  419. data/lib/hecks/bench.rb +0 -28
  420. data/lib/hecks/codemod.rb +0 -443
  421. data/lib/hecks/corpus.rb +0 -479
  422. data/lib/hecks/doc/reference.rb +0 -585
  423. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +0 -684
  424. data/lib/hecks/fuzzing/combination_miner.rb +0 -178
  425. data/lib/hecks/fuzzing/concurrent_dispatch.rb +0 -469
  426. data/lib/hecks/fuzzing/coverage_campaign.rb +0 -161
  427. data/lib/hecks/fuzzing/differential.rb +0 -192
  428. data/lib/hecks/fuzzing/domain_generator.rb +0 -871
  429. data/lib/hecks/fuzzing/era_boundary.rb +0 -154
  430. data/lib/hecks/fuzzing/form_census.rb +0 -285
  431. data/lib/hecks/fuzzing/generated_domain_check.rb +0 -171
  432. data/lib/hecks/fuzzing/invalid_value_generator.rb +0 -125
  433. data/lib/hecks/fuzzing/isolated_boot.rb +0 -658
  434. data/lib/hecks/fuzzing/nondeterministic.rb +0 -79
  435. data/lib/hecks/fuzzing/persistence_parity.rb +0 -253
  436. data/lib/hecks/fuzzing/properties/corrections.rb +0 -125
  437. data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +0 -688
  438. data/lib/hecks/fuzzing/properties/guards.rb +0 -398
  439. data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +0 -399
  440. data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +0 -137
  441. data/lib/hecks/fuzzing/properties/outbox.rb +0 -180
  442. data/lib/hecks/fuzzing/properties/querying.rb +0 -260
  443. data/lib/hecks/fuzzing/properties.rb +0 -267
  444. data/lib/hecks/fuzzing/qa_settings.rb +0 -164
  445. data/lib/hecks/fuzzing/replay.rb +0 -930
  446. data/lib/hecks/fuzzing/rotation_priority.rb +0 -114
  447. data/lib/hecks/fuzzing/rust_gap_manifest.rb +0 -139
  448. data/lib/hecks/fuzzing/self_consistency.rb +0 -825
  449. data/lib/hecks/fuzzing/sequence_generator/adversary.rb +0 -532
  450. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +0 -171
  451. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +0 -127
  452. data/lib/hecks/fuzzing/sequence_generator/picker.rb +0 -116
  453. data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +0 -138
  454. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +0 -344
  455. data/lib/hecks/fuzzing/sequence_generator.rb +0 -311
  456. data/lib/hecks/fuzzing/shrinker.rb +0 -309
  457. data/lib/hecks/fuzzing/structural_skips.rb +0 -53
  458. data/lib/hecks/fuzzing/sweep_depth.rb +0 -61
  459. data/lib/hecks/fuzzing/target_capabilities.rb +0 -255
  460. data/lib/hecks/fuzzing/value_generator.rb +0 -340
  461. data/lib/hecks/fuzzing.rb +0 -23
  462. data/lib/hecks/grammar/evolve.rb +0 -524
  463. data/lib/hecks/query_ir.rb +0 -482
@@ -5,48 +5,25 @@ module Hecks
5
5
  module Bluebook
6
6
  Invariant = Struct.new(:description, :canonical, :predicate, :ast, keyword_init: true)
7
7
 
8
- # A value object — a declaration holder, never instantiated.
9
- #
10
- # `ValueObjectBuilder` returns an anonymous subclass whose singleton
11
- # carries the declaration : attributes, invariants, members. Nothing ever
12
- # calls `.new` on one — coercion builds `Runtime::Value` wrappers, and
13
- # invariants run as canonical text through the Evaluator. The runtime
14
- # reaches a shape through `aggregate.value_object(name)`, the IR's own
15
- # finder ; there is no constant nesting and no second index.
16
- #
17
- # `to_h` does not move. It is a byte-for-byte contract pinned by the
18
- # golden fixtures, so it keeps spelling the short declared name, which
19
- # is what `hecks_name` carries. Declarations in the graph, strings in the
20
- # export.
8
+ # A value object: a declaration holder, never instantiated.
9
+ # `ValueObjectBuilder` returns a subclass carrying attributes, invariants and members;
10
+ # reach one through `aggregate.value_object(name)`.
11
+ # `to_h` spells the short declared name (`hecks_name`), a contract pinned by golden fixtures.
21
12
  class ValueObject
22
13
  extend Construct
23
- # Extended, not included — this construct is a class, so its
24
- # emission is a class method. See Hecks::IR's own note on
25
- # the two shapes.
14
+ # Extended, not included: this construct is a class, so emission is a class method.
26
15
  extend Hecks::IR
27
16
  extend Behaviour::ValueObject
28
17
 
29
18
  emits_ir(
30
19
  name: :hecks_name,
31
20
  attributes: many(:attributes),
32
- # `ast:` — a JSON-serializable rendering of the same predicate
33
- # `canonical` already spells as text, alongside it rather than
34
- # replacing it (`canonical` stays the human-facing/doctest-facing
35
- # form; parsing it back would just re-derive what `ast` already
36
- # states directly). Ground truth and the full reasoning:
37
- # `Expression::AstJson`'s own header — built for `rust/host`'s
38
- # own mint-time invariant check (`reference_validate.rs`), which
39
- # has no kernel crate to parse `canonical` with.
21
+ # `ast` sits beside `canonical` because rust/host's mint-time invariant check
22
+ # has no kernel crate to parse `canonical` with (see `Expression::AstJson`).
40
23
  invariants: -> { invariants.map { |rule| Expression::AstJson.rule_row(rule) } },
41
24
  closed_set: :closed_set?,
42
- # The field name is stringified, never the value. A `member` row can
43
- # hold any of the scalar types an attribute declares — `Integer 84`
44
- # (`StatementFrequency#retention_months`, statements.bluebook), not
45
- # only `String` — and stringifying it on the way out would erase
46
- # that: `84` and `"84"` (a member some other row might legitimately
47
- # spell as text) would become indistinguishable once they reached
48
- # `to_h`. The declared name still moves (`field.to_s`) — that half
49
- # was never a Ruby object with a type to lose.
25
+ # Only the field name is stringified: a member value can be an Integer, and
26
+ # stringifying it would make `84` and `"84"` indistinguishable in `to_h`.
50
27
  members: -> { members.map { |member| member.map { |field, value| [field.to_s, value] } } }
51
28
  )
52
29
 
@@ -57,10 +34,8 @@ module Hecks
57
34
  # the bluebook declares and the thing Ruby holds are one object.
58
35
  #
59
36
  # @param name [String, Symbol] the value object's declared type name
60
- # @param attributes [Array<Bluebook::Attribute>] the value object's declared
61
- # fields
62
- # @param invariants [Array<Bluebook::Invariant>] the rules checked against every
63
- # instance of this value object
37
+ # @param attributes [Array<Bluebook::Attribute>] the value object's declared fields
38
+ # @param invariants [Array<Bluebook::Invariant>] the rules checked against every instance
64
39
  # @param members [Array<Hash{Symbol => Object}>] the declared `one_of` members, one
65
40
  # row of field values per member
66
41
  # @param closed_set [Boolean] whether a `one_of` was declared, even with no
@@ -1,36 +1,19 @@
1
- # Hecks::Bluebook
2
- #
3
- # Everything a .bluebook file becomes on its way to running: the expression
4
- # language (expression/), the model itself (the chapter class plus
5
- # everything it declares), the assembly that turns
6
- # declarations back into that graph (assembly.rb + assembly/), the authoring
7
- # DSL (dsl/), and the meta-validator that judges a chapter against the
8
- # language's own grammar (meta_validator.rb + meta_validator/).
9
- #
10
- # The require order below matters: expression and IR load first (pure
11
- # declarations), assembly's collaborators load before its face, and the DSL
12
- # loads before the meta-validator that its builders call at build time.
1
+ # Everything a .bluebook file becomes on its way to running: expression language, model,
2
+ # assembly, authoring DSL and meta-validator.
13
3
 
14
4
  module Hecks
15
- # Declared as a class, not a module — `Hecks::Bluebook` is a
16
- # chapter (bluebook/chapter.rb carries its body). Everything a chapter
17
- # declares nests under it, as do the ways to build one (`DSL`) and to
18
- # judge one (`MetaValidator`). Reopening this anywhere must say `class`.
5
+ # `Hecks::Bluebook` is a class defined in bluebook/chapter.rb; reopen it with `class`.
19
6
  module Bluebook
20
7
  end
21
8
  end
22
9
 
23
- # What the chapter's own files lean on at class-body level (`extend
24
- # Construct`, the assembly's QuerySpecification marks) — required here
25
- # because those files' contents are frozen and cannot say so themselves.
10
+ # Required here because the chapter's frozen files lean on these at class-body level.
11
+ # Load order: expression and IR first, assembly's collaborators before its face, DSL last.
26
12
  require_relative "construct"
27
13
  require_relative "literal"
28
14
  require_relative "query_specification"
29
15
 
30
16
  require_relative "bluebook/expression"
31
- # **The model itself** — the chapter class's own body first, then everything
32
- # a chapter declares. Order matters only for reading: each is a bag of
33
- # declarations with no load-time cross-references.
34
17
  require_relative "bluebook/chapter"
35
18
  require_relative "bluebook/reference"
36
19
  require_relative "bluebook/attribute"
@@ -0,0 +1,84 @@
1
+ require "etc"
2
+ require "fileutils"
3
+ require "tmpdir"
4
+
5
+ module Hecks
6
+ # The one place the runtime's own scratch files live, outside the gem: an
7
+ # installed gem is read-only, and a checkout's `tmp/` isn't this library's to assume.
8
+ #
9
+ # A candidate root is used only if it is private to the current user, since the
10
+ # syntax-boot cache it holds is read back with `Marshal.load`.
11
+ module CacheDir
12
+ module_function
13
+
14
+ # The directory a named piece of scratch state lives in.
15
+ #
16
+ # @param name [String] the subdirectory, such as `"storehouse"`
17
+ # @return [String] the absolute path of `name` under the cache root; the
18
+ # directory itself is created by whoever writes to it
19
+ def path(name)
20
+ File.join(root, name)
21
+ end
22
+
23
+ # The cache root, resolved once per process.
24
+ #
25
+ # @return [String] the absolute path of the directory every `path` lives under
26
+ def root
27
+ @root ||= resolve
28
+ end
29
+
30
+ # Forgets the resolved root so the next call resolves again.
31
+ #
32
+ # @return [void]
33
+ def reset!
34
+ @root = nil
35
+ end
36
+
37
+ # Picks the cache root from the environment.
38
+ #
39
+ # @param env [Hash{String => String}] the environment to read
40
+ # `XDG_CACHE_HOME` and `HOME` from
41
+ # @param tmpdir [String] the system temp directory
42
+ # @param uid [Integer] the current user id, used in the temp fallback's name
43
+ # @return [String] the absolute path of the first candidate that is a
44
+ # private directory owned by this user, else a per-process directory
45
+ def resolve(env: ENV, tmpdir: Dir.tmpdir, uid: Process.uid)
46
+ candidates(env, tmpdir, uid).each do |candidate|
47
+ return candidate if private_dir?(candidate)
48
+ end
49
+ Dir.mktmpdir("hecks-", tmpdir)
50
+ rescue StandardError
51
+ File.join(tmpdir, "hecks-#{uid}")
52
+ end
53
+
54
+ # The roots to try, most preferred first.
55
+ #
56
+ # @param env [Hash{String => String}] the environment
57
+ # @param tmpdir [String] the system temp directory
58
+ # @param uid [Integer] the current user id
59
+ # @return [Array<String>] absolute candidate paths
60
+ def candidates(env, tmpdir, uid)
61
+ xdg = env["XDG_CACHE_HOME"].to_s
62
+ home = env["HOME"].to_s
63
+ list = []
64
+ list << File.join(xdg, "hecks") if File.absolute_path?(xdg)
65
+ list << File.join(home, ".cache", "hecks") if File.absolute_path?(home)
66
+ list << File.join(tmpdir, "hecks-#{uid}")
67
+ end
68
+ private_class_method :candidates
69
+
70
+ # Creates `dir` if needed and says whether it is private to this user.
71
+ #
72
+ # @param dir [String] the candidate directory
73
+ # @return [Boolean] true when `dir` is a directory owned by this user that
74
+ # no other user can write to; false on any failure
75
+ def private_dir?(dir)
76
+ FileUtils.mkdir_p(dir, mode: 0o700)
77
+ stat = File.stat(dir)
78
+ stat.directory? && stat.owned? && stat.mode.nobits?(0o022) && File.writable?(dir)
79
+ rescue StandardError
80
+ false
81
+ end
82
+ private_class_method :private_dir?
83
+ end
84
+ end
@@ -0,0 +1,86 @@
1
+ require_relative "../../hecks"
2
+
3
+ module Hecks
4
+ module CLI
5
+ # The command behind `bin/docs`, `bin/narrate`, `hecks docs` and `hecks narrate`:
6
+ # one domain's document, projected from its own bluebook, to stdout.
7
+ #
8
+ # Nothing is written for the caller: redirect it, so git decides whether it drifted.
9
+ module Document
10
+ # Build output and other trees under a root that hold no domain a caller means.
11
+ # Matched against the path relative to the root, because a substring test
12
+ # against an absolute path tests wherever somebody happened to clone.
13
+ IGNORED = %r{\A(rust|deploy|tmp|coverage)/}
14
+
15
+ module_function
16
+
17
+ # Prints `projection` for the domain and optional aggregate `argv` names.
18
+ #
19
+ # @param argv [Array<String>] an optional domain directory, then an optional
20
+ # aggregate name
21
+ # @param projection [Symbol] `:docs` or `:narrate`
22
+ # @param program [String] the name the usage message calls this command by
23
+ # @param root [String] the directory whose domains are listed when no domain
24
+ # is found
25
+ # @return [void]
26
+ # @raise [SystemExit] when no domain is found, it cannot boot, it loads no
27
+ # bluebook, or the aggregate does not exist
28
+ def call(argv, projection:, program:, root:)
29
+ here = Adapters::Folder.new.domain_root
30
+ path, aggregate = target(argv, here)
31
+ refuse_without_domain(program, root) unless path
32
+
33
+ begin
34
+ runtime = Hecks.boot(path, install_facade: false)
35
+ rescue StandardError => e
36
+ abort "cannot read #{path}: #{e.message.lines.first.strip}"
37
+ end
38
+
39
+ # The domain's own chapter, not a framework member it attached: insertion
40
+ # order, the same distinction `Runtime::Loader.dispatcher_for` draws.
41
+ bluebook = runtime.registry.bluebooks.values.first
42
+ abort "#{path} loaded no bluebook" unless bluebook
43
+
44
+ begin
45
+ puts Projector.call(projection, bluebook: bluebook, options: aggregate ? { aggregate: aggregate } : {})
46
+ rescue Runtime::NotFound => e
47
+ abort e.message
48
+ end
49
+ end
50
+
51
+ # Lists every directory under `root` that `Hecks.boot` would accept.
52
+ #
53
+ # Found by their wiring, not their chapters: a `.hecksagon` says this is a
54
+ # domain, while most `.bluebook` files (era translations, grammar, fixtures) are not.
55
+ #
56
+ # @param root [String] the directory to search under
57
+ # @return [Array<String>] domain directory paths relative to `root`,
58
+ # deduplicated and sorted
59
+ def domains(root)
60
+ Dir.glob(File.join(root, "**/*.hecksagon"))
61
+ .map { |path| File.basename(File.dirname(path)) == "bluebook" ? File.dirname(path, 2) : File.dirname(path) }
62
+ .map { |path| path.delete_prefix("#{root}/") }
63
+ .grep_v(IGNORED)
64
+ .uniq.sort
65
+ end
66
+
67
+ # @api private
68
+ def target(argv, here)
69
+ if argv.empty? then [here, nil]
70
+ elsif argv.length > 1 then [argv[0], argv[1]]
71
+ elsif File.directory?(argv[0]) then [argv[0], nil]
72
+ else [here, argv[0]]
73
+ end
74
+ end
75
+
76
+ # @api private
77
+ def refuse_without_domain(program, root)
78
+ warn "usage: #{program} [domain-path] [aggregate]"
79
+ warn ""
80
+ warn "No bluebook here — #{Dir.pwd} is not inside a domain. Name one:"
81
+ domains(root).each { |candidate| warn " #{candidate}" }
82
+ exit 1
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,45 @@
1
+ require_relative "../../hecks"
2
+ # ADR 0033 — a domain wired to PostgresEra needs this plugin loaded
3
+ # explicitly; the era/lineage subsystem does not load with core.
4
+ require_relative "../ports/persistence/plugins/era"
5
+
6
+ module Hecks
7
+ module CLI
8
+ # The command behind `bin/ir` and `hecks ir`: a booted domain's IR as JSON, the
9
+ # same `to_h` the golden specs pin and `StorageShape` hashes into an era.
10
+ module Ir
11
+ module_function
12
+
13
+ # Prints the IR `argv` asks for.
14
+ #
15
+ # `--meta` prints the language's own IR, reached through
16
+ # `Bluebook::MetaValidator.grammar_registry`, the real boot sequence, so it
17
+ # can't drift from what `MetaValidator` loads.
18
+ #
19
+ # @param argv [Array<String>] a domain path and `--translations`, or `--meta`
20
+ # @param program [String] the name the usage message calls this command by
21
+ # @param default_domain [String, nil] the domain booted when `argv` names none;
22
+ # nil makes a domain argument required
23
+ # @return [void]
24
+ # @raise [SystemExit] when no domain is named and there is no default
25
+ def call(argv, program:, default_domain: nil)
26
+ argv = argv.dup
27
+ if argv.delete("--meta")
28
+ require_relative "../bluebook/meta_validator"
29
+ puts Projector::Exporter.json(Bluebook::MetaValidator.grammar_registry)
30
+ return
31
+ end
32
+
33
+ translations_only = argv.delete("--translations")
34
+ domain = argv.shift || default_domain or abort "usage: #{program} <domain> [--translations] | #{program} --meta"
35
+ runtime = Hecks.boot(domain)
36
+
37
+ if translations_only
38
+ puts Projector::Exporter.translations_json(runtime.registry)
39
+ else
40
+ puts Projector::Exporter.json(runtime.registry)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,31 @@
1
+ require_relative "../mcp_stdio_guard"
2
+
3
+ module Hecks
4
+ module CLI
5
+ # The command behind `bin/hecks_mcp_door` and `hecks mcp`: the MCP door onto the
6
+ # storehouse bus, over stdio only.
7
+ #
8
+ # This file loads nothing but `McpStdioGuard`, so the transport check runs
9
+ # before the framework does.
10
+ module Mcp
11
+ # The server name the guard's refusals and warnings carry.
12
+ SERVER = "hecks-mcp-door".freeze
13
+
14
+ module_function
15
+
16
+ # Refuses any transport but stdio, then serves JSON-RPC requests from stdin
17
+ # until it closes.
18
+ #
19
+ # @param argv [Array<String>] the arguments after the command; only `--stdio`
20
+ # is accepted
21
+ # @return [void]
22
+ # @raise [SystemExit] with `McpStdioGuard::EXIT_STATUS` when the process is not
23
+ # set up for stdio
24
+ def call(argv)
25
+ McpStdioGuard.enforce_stdio!(server: SERVER, argv: argv)
26
+ require_relative "mcp_door"
27
+ McpDoor.serve
28
+ end
29
+ end
30
+ end
31
+ end