hecks 3.13.0 → 4.0.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 (440) hide show
  1. checksums.yaml +4 -4
  2. data/examples/pizzas/adapters/fake_processor.rb +34 -0
  3. data/examples/pizzas/adapters/payment_signature.rb +66 -0
  4. data/examples/pizzas/adapters/payment_webhook.rb +87 -0
  5. data/examples/pizzas/bluebook/pizzas.behaviors +33 -0
  6. data/examples/pizzas/bluebook/pizzas.bluebook +4 -4
  7. data/examples/pizzas/bluebook/pizzas.hecksagon +5 -3
  8. data/examples/pizzas/config.ru +22 -0
  9. data/lib/hecks/adapters/driven/prism.rb +0 -2
  10. data/lib/hecks/adapters/driven.rb +0 -2
  11. data/lib/hecks/adapters/driving/json.rb +1 -7
  12. data/lib/hecks/bluebook/dsl/attribute_collector.rb +15 -5
  13. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +2 -2
  14. data/lib/hecks/bluebook/dsl/derivation_words.rb +58 -0
  15. data/lib/hecks/bluebook/dsl/translation_builder.rb +6 -37
  16. data/lib/hecks/bluebook/expression/ast_json.rb +0 -9
  17. data/lib/hecks/bluebook/hecksagon.rb +1 -1
  18. data/lib/hecks/bluebook/meta_validator/translation_judge/rules.rb +7 -10
  19. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +4 -8
  20. data/lib/hecks/bluebook/meta_validator.rb +0 -11
  21. data/lib/hecks/bluebook/named_pattern.rb +33 -0
  22. data/lib/hecks/bluebook/translation.rb +18 -10
  23. data/lib/hecks/bluebook/translation_expression/evaluator.rb +63 -0
  24. data/lib/hecks/bluebook/translation_expression/parser.rb +127 -0
  25. data/lib/hecks/bluebook/translation_expression.rb +39 -0
  26. data/lib/hecks/bluebook/translation_plan.rb +70 -0
  27. data/lib/hecks/bluebook.rb +3 -0
  28. data/lib/hecks/chapters.rb +3 -3
  29. data/lib/hecks/cli/domain_stub.rb +1 -1
  30. data/lib/hecks/cli/interview_aggregate.rb +4 -4
  31. data/lib/hecks/composer/adapters/claude_composer.adapter +3 -0
  32. data/lib/hecks/composer/adapters/claude_composer.rb +83 -0
  33. data/lib/hecks/composer/adapters/fake_agent.adapter +3 -0
  34. data/lib/hecks/composer/adapters/fake_agent.rb +55 -0
  35. data/lib/hecks/composer/adapters/jev.adapter +3 -0
  36. data/lib/hecks/composer/adapters/jev.rb +66 -0
  37. data/lib/hecks/composer/agent.rb +113 -0
  38. data/lib/hecks/composer/assistant.rb +110 -0
  39. data/lib/hecks/composer/behavior_run.rb +53 -0
  40. data/lib/hecks/composer/bluebook/composer.bluebook +178 -0
  41. data/lib/hecks/composer/bluebook/composer.hecksagon +16 -0
  42. data/lib/hecks/composer/board.rb +65 -0
  43. data/lib/hecks/composer/board_edit/command_text.rb +39 -0
  44. data/lib/hecks/composer/board_edit/source.rb +84 -0
  45. data/lib/hecks/composer/board_edit.rb +144 -0
  46. data/lib/hecks/composer/check.rb +89 -0
  47. data/lib/hecks/composer/domains.rb +81 -0
  48. data/lib/hecks/composer/jobs.rb +134 -0
  49. data/lib/hecks/composer/layout.rb +37 -0
  50. data/lib/hecks/composer/live.rb +150 -0
  51. data/lib/hecks/composer/outline.rb +48 -0
  52. data/lib/hecks/composer/page.html +989 -0
  53. data/lib/hecks/composer/panels.rb +142 -0
  54. data/lib/hecks/composer/parse.rb +83 -0
  55. data/lib/hecks/composer/plain.rb +28 -0
  56. data/lib/hecks/composer/ports/composer_agent.port +7 -0
  57. data/lib/hecks/composer/session.rb +141 -0
  58. data/lib/hecks/composer/toolbox.rb +166 -0
  59. data/lib/hecks/composer/web.rb +156 -0
  60. data/lib/hecks/composer/workbench.rb +51 -0
  61. data/lib/hecks/composer/workspace.rb +81 -0
  62. data/lib/hecks/composer.rb +17 -0
  63. data/lib/hecks/corpus/adapters.rb +22 -0
  64. data/lib/hecks/corpus/rust.rb +1 -1
  65. data/lib/hecks/corpus/worlds.rb +19 -0
  66. data/lib/hecks/corpus.rb +5 -0
  67. data/lib/hecks/deploy/bluebook/deploy.bluebook +34 -34
  68. data/lib/hecks/forms/app/commands.rb +2 -3
  69. data/lib/hecks/forms/app/queries.rb +2 -3
  70. data/lib/hecks/forms/app/records.rb +17 -5
  71. data/lib/hecks/forms/command_form_renderer.rb +42 -16
  72. data/lib/hecks/forms/field_controls.rb +2 -2
  73. data/lib/hecks/forms/field_renderer.rb +1 -1
  74. data/lib/hecks/forms/field_shape.rb +36 -17
  75. data/lib/hecks/forms/index_renderer.rb +2 -1
  76. data/lib/hecks/forms/page.rb +1 -1
  77. data/lib/hecks/forms/params.rb +0 -13
  78. data/lib/hecks/forms/query_form_renderer.rb +7 -6
  79. data/lib/hecks/forms/record_renderer.rb +11 -7
  80. data/lib/hecks/forms/rule_words.rb +100 -0
  81. data/lib/hecks/forms/value_object_shape.rb +2 -1
  82. data/lib/hecks/framework/bluebook/change.bluebook +2 -2
  83. data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +0 -3
  84. data/lib/hecks/fuzzing/domain_generator/block_rendering.rb +1 -1
  85. data/lib/hecks/fuzzing/isolated_boot/worlds.rb +3 -6
  86. data/lib/hecks/fuzzing/replay/filters.rb +2 -6
  87. data/lib/hecks/gate/stages.yml +25 -0
  88. data/lib/hecks/grammar/evolve/seeds.rb +0 -6
  89. data/lib/hecks/grammar/evolve.rb +0 -3
  90. data/lib/hecks/grammar/translation.bluebook +1 -1
  91. data/lib/hecks/hecks/adapters/codebase/composing.rb +56 -0
  92. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +3 -1
  93. data/lib/hecks/hecks/adapters/journal_store/changes.rb +0 -26
  94. data/lib/hecks/hecks/adapters/journal_store/examination.rb +2 -23
  95. data/lib/hecks/hecks/adapters/journal_store/readings.rb +3 -11
  96. data/lib/hecks/hecks/adapters/journal_store.rb +0 -11
  97. data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +4 -11
  98. data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +0 -9
  99. data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +0 -4
  100. data/lib/hecks/hecks/codebase.behaviors +6 -0
  101. data/lib/hecks/hecks/codebase.bluebook +58 -37
  102. data/lib/hecks/hecks/composer.behaviors +68 -0
  103. data/lib/hecks/hecks/context_map.hecksagon +1 -1
  104. data/lib/hecks/hecks/custodian.behaviors +0 -6
  105. data/lib/hecks/hecks/custodian.bluebook +15 -92
  106. data/lib/hecks/hecks/hecks.bluebook +2 -2
  107. data/lib/hecks/hecks/hecks.hecksagon +2 -2
  108. data/lib/hecks/hecks/hecks.world +1 -1
  109. data/lib/hecks/hecks/rehearsal.bluebook +10 -16
  110. data/lib/hecks/hecks/tooling.bluebook +22 -22
  111. data/lib/hecks/kernel_capabilities/templates.rb +4 -4
  112. data/lib/hecks/kernel_capabilities.rb +1 -1
  113. data/lib/hecks/language/bluebook/aggregate.bluebook +1 -0
  114. data/lib/hecks/language/bluebook/command.bluebook +1 -0
  115. data/lib/hecks/language/bluebook/entity.bluebook +1 -0
  116. data/lib/hecks/language/bluebook/query.bluebook +1 -0
  117. data/lib/hecks/language/bluebook/shape.bluebook +8 -7
  118. data/lib/hecks/language/bluebook/vocabulary.bluebook +2 -3
  119. data/lib/hecks/language/hecksagon/port_operation.bluebook +1 -0
  120. data/lib/hecks/language/translation/translation_aggregate.bluebook +21 -24
  121. data/lib/hecks/ports/access_control.rb +2 -2
  122. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +3 -41
  123. data/lib/hecks/ports/persistence/plugins/era/lineage/coverage.rb +7 -7
  124. data/lib/hecks/ports/persistence/plugins/era/lineage/rewrite.rb +25 -2
  125. data/lib/hecks/ports/persistence/plugins/era/lineage/rules.rb +4 -4
  126. data/lib/hecks/ports/persistence/plugins/era/lineage.rb +17 -25
  127. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/base_sql.rb +0 -12
  128. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/domain_rename.rb +1 -1
  129. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +2 -22
  130. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +0 -1
  131. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +9 -3
  132. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +3 -29
  133. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/refusals.rb +2 -26
  134. data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +6 -33
  135. data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -3
  136. data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +2 -4
  137. data/lib/hecks/ports/persistence/plugins/era/translation/expression_sql.rb +52 -0
  138. data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +23 -29
  139. data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +1 -1
  140. data/lib/hecks/ports/persistence/plugins/era/translation.rb +0 -1
  141. data/lib/hecks/ports/persistence/plugins/era.rb +3 -6
  142. data/lib/hecks/ports.rb +0 -1
  143. data/lib/hecks/projection_files.rb +3 -1
  144. data/lib/hecks/projections/deploy/templates/lambda/nat_comment_oauth.tmpl +1 -1
  145. data/lib/hecks/projections/glossary/entries.rb +10 -4
  146. data/lib/hecks/projections/glossary/groups.rb +42 -0
  147. data/lib/hecks/projections/glossary/html/page.rb +7 -2
  148. data/lib/hecks/projections/glossary/html/parser.rb +1 -1
  149. data/lib/hecks/projections/glossary/html/sections.rb +31 -11
  150. data/lib/hecks/projections/glossary/html.rb +1 -2
  151. data/lib/hecks/projections/glossary/markdown.rb +31 -28
  152. data/lib/hecks/projections/glossary/mermaid.rb +3 -0
  153. data/lib/hecks/projections/glossary/page.css +143 -153
  154. data/lib/hecks/projections/glossary/page.js +63 -3
  155. data/lib/hecks/projections/glossary/sentences/actions.rb +88 -0
  156. data/lib/hecks/projections/glossary/sentences/paths.rb +77 -0
  157. data/lib/hecks/projections/glossary/sentences/queries.rb +90 -0
  158. data/lib/hecks/projections/glossary/sentences/value_objects.rb +32 -5
  159. data/lib/hecks/projections/glossary/sentences.rb +13 -3
  160. data/lib/hecks/projections/glossary/slugs.rb +4 -1
  161. data/lib/hecks/projections/glossary.rb +2 -1
  162. data/lib/hecks/projections/plain_english.rb +97 -0
  163. data/lib/hecks/projections/rust_vocabulary/arguments.rb +2 -2
  164. data/lib/hecks/projections/rust_vocabulary/enum_body.rb +20 -25
  165. data/lib/hecks/projections/rust_vocabulary/tests.rb +2 -2
  166. data/lib/hecks/projections/rust_vocabulary.rb +14 -6
  167. data/lib/hecks/projections/site/cms_editor/color.rb +0 -6
  168. data/lib/hecks/projections/statements/actions.rb +99 -0
  169. data/lib/hecks/projections/statements/relationships.rb +86 -0
  170. data/lib/hecks/projections/statements.rb +15 -24
  171. data/lib/hecks/projector/exporter/adapters.rb +112 -0
  172. data/lib/hecks/projector/exporter/translations.rb +18 -35
  173. data/lib/hecks/projector/exporter/worlds.rb +103 -0
  174. data/lib/hecks/projector/exporter.rb +5 -1
  175. data/lib/hecks/quality_control/adapters/agent.rb +6 -7
  176. data/lib/hecks/quality_control/adapters/agent_profile.rb +16 -114
  177. data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +1 -1
  178. data/lib/hecks/quality_control/quality_control.bluebook +51 -51
  179. data/lib/hecks/runtime/loader/boot_steps.rb +0 -20
  180. data/lib/hecks/runtime/outbox.rb +2 -9
  181. data/lib/hecks/runtime/port_operation_interpreter.rb +1 -9
  182. data/lib/hecks/runtime/remote_dispatcher.rb +2 -2
  183. data/lib/hecks/runtime/value.rb +13 -0
  184. data/lib/hecks/rust_build/project_rust/target_ir.rb +23 -4
  185. data/lib/hecks/rust_build/wasm.rb +0 -12
  186. data/lib/hecks/rust_build/write_if_changed.rb +12 -12
  187. data/lib/hecks/rust_format.rb +77 -0
  188. data/lib/hecks/site/bluebook/site.bluebook +5 -5
  189. data/lib/hecks/sme/bluebook/sme.bluebook +12 -12
  190. data/lib/hecks/tickets/bluebook/tickets.bluebook +3 -3
  191. data/lib/hecks/tools/fuzz_sweep/findings.rb +3 -9
  192. data/lib/hecks/tools/fuzz_sweep.rb +1 -3
  193. data/lib/hecks/tools/translation_audit/verdicts.rb +3 -28
  194. data/lib/hecks/tools/translation_audit.rb +8 -10
  195. data/lib/hecks/tools/translation_scaffold/reporting.rb +1 -1
  196. data/lib/hecks/version.rb +1 -1
  197. data/lib/hecks/vocabulary.rb +2 -1
  198. data/lib/hecks.rb +3 -0
  199. data/prebuilt/{58208399bada10b0db99928c48e38789288fc58f7b71a72b21bfa386680e32ed.marshal → 02c09c73b272c1fb5a9ae6d87bb5e5e529208e00f6b4b597dc2c0fd70a9c0964.marshal} +0 -0
  200. data/prebuilt/{2b59737fbdbd5f44edda0fddce2611f45d76087b3a7c782d1f1a17ea58c77948.marshal → bb84a835cf6a15136bad5ca03aa5bf93a5b92f5f72444618d3ef2412b987fb32.marshal} +0 -0
  201. data/prebuilt/verdicts-f1f10da14c8e8f01b4c9b7e3e2d74be8cd2bf4676364ed17fa16975d2a076d75.json +1 -0
  202. data/rust/Cargo.toml +40 -0
  203. data/rust/build/Cargo.toml +36 -0
  204. data/rust/build/clippy.toml +4 -0
  205. data/rust/build/src/adapters_pass.rs +196 -0
  206. data/rust/build/src/binding_pass.rs +54 -13
  207. data/rust/build/src/build_artifact.rs +23 -5
  208. data/rust/build/src/cargo_sync.rs +69 -26
  209. data/rust/build/src/lineage_pass.rs +101 -87
  210. data/rust/build/src/main.rs +11 -2
  211. data/rust/build/src/pipeline.rs +80 -19
  212. data/rust/build/src/reserved_names.rs +6 -50
  213. data/rust/build/src/resolve.rs +82 -35
  214. data/rust/build/src/rustfmt.rs +100 -0
  215. data/rust/build/src/seams_pass.rs +85 -16
  216. data/rust/build/src/subprocess.rs +30 -6
  217. data/rust/build/src/tmp.rs +5 -2
  218. data/rust/build/src/translation_pass.rs +72 -22
  219. data/rust/build/src/world_pass.rs +109 -0
  220. data/rust/clippy.toml +4 -0
  221. data/rust/codegen/Cargo.toml +36 -0
  222. data/rust/codegen/clippy.toml +4 -0
  223. data/rust/codegen/src/asks.rs +40 -14
  224. data/rust/codegen/src/attr.rs +2 -2
  225. data/rust/codegen/src/bridging.rs +676 -117
  226. data/rust/codegen/src/commands.rs +979 -373
  227. data/rust/codegen/src/constraints.rs +88 -25
  228. data/rust/codegen/src/dependency_planning.rs +128 -34
  229. data/rust/codegen/src/domain_generator.rs +300 -170
  230. data/rust/codegen/src/exemplar.rs +87 -32
  231. data/rust/codegen/src/expr_emitter.rs +54 -6
  232. data/rust/codegen/src/fielded.rs +193 -41
  233. data/rust/codegen/src/hecks_naming.rs +124 -16
  234. data/rust/codegen/src/hecks_naming_tests.rs +81 -0
  235. data/rust/codegen/src/json.rs +80 -44
  236. data/rust/codegen/src/json_codec.rs +585 -149
  237. data/rust/codegen/src/literal.rs +104 -138
  238. data/rust/codegen/src/main.rs +145 -52
  239. data/rust/codegen/src/manifest.rs +76 -14
  240. data/rust/codegen/src/mutations.rs +1212 -239
  241. data/rust/codegen/src/naming.rs +111 -60
  242. data/rust/codegen/src/optional_pass.rs +90 -28
  243. data/rust/codegen/src/ports.rs +5 -4
  244. data/rust/codegen/src/prelude.rs +139 -49
  245. data/rust/codegen/src/queries.rs +601 -226
  246. data/rust/codegen/src/reactions.rs +268 -74
  247. data/rust/codegen/src/read_models.rs +606 -205
  248. data/rust/codegen/src/reference_specs.rs +16 -3
  249. data/rust/codegen/src/registry.rs +128 -79
  250. data/rust/codegen/src/reserved_names.rs +6 -50
  251. data/rust/codegen/src/shared.rs +71 -22
  252. data/rust/codegen/src/sidecars.rs +15 -5
  253. data/rust/codegen/src/skip_reason.rs +8 -2
  254. data/rust/codegen/src/types.rs +306 -108
  255. data/rust/host/Cargo.lock +1 -0
  256. data/rust/host/Cargo.toml +40 -4
  257. data/rust/host/HECKS_RELEASE +1 -1
  258. data/rust/host/clippy.toml +4 -0
  259. data/rust/host/src/api.rs +698 -218
  260. data/rust/host/src/auth.rs +491 -214
  261. data/rust/host/src/b64.rs +91 -0
  262. data/rust/host/src/bin/expr_harness.rs +6 -2
  263. data/rust/host/src/bin/lineage_harness.rs +47 -11
  264. data/rust/host/src/bin/mint_harness.rs +70 -37
  265. data/rust/host/src/bin/validate_harness.rs +16 -8
  266. data/rust/host/src/boot.rs +144 -68
  267. data/rust/host/src/boundary_fuzz/api.rs +130 -32
  268. data/rust/host/src/boundary_fuzz/auth.rs +108 -23
  269. data/rust/host/src/boundary_fuzz/expr_json.rs +85 -11
  270. data/rust/host/src/boundary_fuzz/ir.rs +164 -12
  271. data/rust/host/src/boundary_fuzz/server.rs +283 -36
  272. data/rust/host/src/boundary_fuzz/web.rs +56 -8
  273. data/rust/host/src/checkout.rs +78 -32
  274. data/rust/host/src/clock.rs +8 -0
  275. data/rust/host/src/commerce_ir.rs +333 -95
  276. data/rust/host/src/crypto.rs +33 -0
  277. data/rust/host/src/dispatch.rs +990 -331
  278. data/rust/host/src/expr_json.rs +1021 -273
  279. data/rust/host/src/extension.rs +24 -4
  280. data/rust/host/src/field_hints.rs +11 -7
  281. data/rust/host/src/fuzz_support.rs +85 -13
  282. data/rust/host/src/host.rs +100 -0
  283. data/rust/host/src/http.rs +22 -0
  284. data/rust/host/src/ir.rs +326 -16
  285. data/rust/host/src/journal.rs +277 -176
  286. data/rust/host/src/lambda_client.rs +219 -53
  287. data/rust/host/src/lib.rs +16 -4
  288. data/rust/host/src/log.rs +62 -11
  289. data/rust/host/src/mint.rs +1153 -326
  290. data/rust/host/src/needs.rs +185 -44
  291. data/rust/host/src/payments/keystore.rs +197 -45
  292. data/rust/host/src/payments/roles.rs +191 -0
  293. data/rust/host/src/payments/tests.rs +1445 -275
  294. data/rust/host/src/payments.rs +409 -121
  295. data/rust/host/src/platform_signin/attack_tests.rs +5 -5
  296. data/rust/host/src/platform_signin/config.rs +11 -11
  297. data/rust/host/src/platform_signin/cookie.rs +2 -2
  298. data/rust/host/src/platform_signin/extension.rs +2 -1
  299. data/rust/host/src/platform_signin/handler.rs +9 -8
  300. data/rust/host/src/platform_signin/jti.rs +4 -2
  301. data/rust/host/src/platform_signin/jwks.rs +2 -1
  302. data/rust/host/src/platform_signin/jws.rs +2 -37
  303. data/rust/host/src/platform_signin/known_answer_tests.rs +5 -1
  304. data/rust/host/src/platform_signin/mode_tests.rs +5 -3
  305. data/rust/host/src/platform_signin/pages.rs +20 -20
  306. data/rust/host/src/platform_signin/session.rs +8 -1
  307. data/rust/host/src/platform_signin/settings.rs +6 -6
  308. data/rust/host/src/platform_signin/strict_json.rs +12 -9
  309. data/rust/host/src/platform_signin/verify.rs +41 -41
  310. data/rust/host/src/platform_signin/wiring_support.rs +13 -18
  311. data/rust/host/src/presentation.rs +207 -63
  312. data/rust/host/src/presentation_write.rs +502 -187
  313. data/rust/host/src/query_step.rs +69 -18
  314. data/rust/host/src/rate_limit.rs +541 -142
  315. data/rust/host/src/reference_transform.rs +77 -25
  316. data/rust/host/src/reference_validate.rs +443 -104
  317. data/rust/host/src/resend.rs +190 -55
  318. data/rust/host/src/secrets.rs +116 -21
  319. data/rust/host/src/server.rs +483 -104
  320. data/rust/host/src/storage_shape.rs +88 -21
  321. data/rust/host/src/test_pg.rs +17 -7
  322. data/rust/host/src/ui_schema.rs +495 -207
  323. data/rust/host/src/wasm_runner.rs +21 -6
  324. data/rust/host/src/web/commerce.rs +101 -23
  325. data/rust/host/src/web/newsletter/cooldown.rs +10 -3
  326. data/rust/host/src/web/newsletter/template.rs +26 -7
  327. data/rust/host/src/web/newsletter/tests.rs +112 -23
  328. data/rust/host/src/web/newsletter.rs +209 -59
  329. data/rust/host/src/web/newsletter_send.rs +251 -79
  330. data/rust/host/src/web/registration_receipt/tests.rs +16 -4
  331. data/rust/host/src/web/registration_receipt.rs +100 -24
  332. data/rust/host/src/web/registrations.rs +1384 -332
  333. data/rust/host/src/web/resend_webhook.rs +138 -80
  334. data/rust/host/src/web.rs +2416 -508
  335. data/rust/lsp/Cargo.toml +36 -0
  336. data/rust/lsp/clippy.toml +4 -0
  337. data/rust/lsp/src/json.rs +29 -22
  338. data/rust/lsp/src/main.rs +81 -31
  339. data/rust/lsp/src/outline.rs +23 -7
  340. data/rust/lsp/src/rpc.rs +17 -4
  341. data/rust/parser/Cargo.toml +36 -0
  342. data/rust/parser/clippy.toml +4 -0
  343. data/rust/parser/src/build/closed_sets.rs +6 -1
  344. data/rust/parser/src/build/identity.rs +4 -3
  345. data/rust/parser/src/build/mod.rs +1 -0
  346. data/rust/parser/src/build/named_pattern.rs +26 -0
  347. data/rust/parser/src/build/naming.rs +2 -80
  348. data/rust/parser/src/build/pattern_subset.rs +6 -8
  349. data/rust/parser/src/build/query_derive.rs +3 -1
  350. data/rust/parser/src/build/query_inference.rs +14 -5
  351. data/rust/parser/src/build/read_model.rs +4 -1
  352. data/rust/parser/src/build/references.rs +4 -3
  353. data/rust/parser/src/canonical.rs +34 -15
  354. data/rust/parser/src/emit.rs +187 -105
  355. data/rust/parser/src/expr/ast_json.rs +134 -42
  356. data/rust/parser/src/expr/evaluator.rs +27 -9
  357. data/rust/parser/src/expr/mod.rs +54 -13
  358. data/rust/parser/src/expr/resolver.rs +299 -92
  359. data/rust/parser/src/ir.rs +35 -3
  360. data/rust/parser/src/keywords.rs +7168 -510
  361. data/rust/parser/src/lex.rs +11 -25
  362. data/rust/parser/src/lib.rs +1 -0
  363. data/rust/parser/src/main.rs +65 -6
  364. data/rust/parser/src/parse/adapter.rs +157 -0
  365. data/rust/parser/src/parse/aggregate.rs +19 -10
  366. data/rust/parser/src/parse/chapter.rs +16 -17
  367. data/rust/parser/src/parse/command.rs +35 -16
  368. data/rust/parser/src/parse/domain_port.rs +4 -7
  369. data/rust/parser/src/parse/entity.rs +21 -11
  370. data/rust/parser/src/parse/hecksagon.rs +10 -4
  371. data/rust/parser/src/parse/lifecycle.rs +9 -5
  372. data/rust/parser/src/parse/mod.rs +43 -91
  373. data/rust/parser/src/parse/needs.rs +21 -12
  374. data/rust/parser/src/parse/policy.rs +2 -2
  375. data/rust/parser/src/parse/process_manager.rs +9 -11
  376. data/rust/parser/src/parse/query.rs +8 -4
  377. data/rust/parser/src/parse/read_model.rs +57 -16
  378. data/rust/parser/src/parse/value_object.rs +7 -2
  379. data/rust/parser/src/parse/world.rs +322 -0
  380. data/rust/parser/src/ruby_value.rs +7 -6
  381. data/rust/src/exemplar/json.rs +4 -4
  382. data/rust/src/exemplar/mutations.rs +18 -0
  383. data/rust/src/exemplar/read_models.rs +1 -10
  384. data/rust/src/kernel/attribute_shapes/composite.rs +54 -14
  385. data/rust/src/kernel/attribute_shapes/list.rs +2 -2
  386. data/rust/src/kernel/attribute_shapes/mod.rs +8 -8
  387. data/rust/src/kernel/attribute_shapes/scalar.rs +2 -2
  388. data/rust/src/kernel/cli.rs +229 -112
  389. data/rust/src/kernel/dispatch.rs +323 -115
  390. data/rust/src/kernel/dispatch_guard_tests.rs +327 -65
  391. data/rust/src/kernel/expr.rs +203 -86
  392. data/rust/src/kernel/expression_operators/arithmetic.rs +138 -25
  393. data/rust/src/kernel/expression_operators/comparison.rs +87 -2
  394. data/rust/src/kernel/expression_operators/enumeration.rs +106 -22
  395. data/rust/src/kernel/expression_operators/logical.rs +9 -3
  396. data/rust/src/kernel/expression_operators/membership.rs +3 -1
  397. data/rust/src/kernel/expression_operators/mod.rs +34 -21
  398. data/rust/src/kernel/expression_operators/pattern_match.rs +46 -11
  399. data/rust/src/kernel/expression_operators/positional.rs +84 -30
  400. data/rust/src/kernel/expression_operators/presence.rs +52 -13
  401. data/rust/src/kernel/expression_operators/sign_test.rs +3 -1
  402. data/rust/src/kernel/expression_operators/sized.rs +24 -8
  403. data/rust/src/kernel/expression_operators/text.rs +120 -27
  404. data/rust/src/kernel/expression_operators/to_string.rs +10 -4
  405. data/rust/src/kernel/json.rs +230 -148
  406. data/rust/src/kernel/mod.rs +46 -33
  407. data/rust/src/kernel/named_query.rs +63 -15
  408. data/rust/src/kernel/needs.rs +112 -25
  409. data/rust/src/kernel/orchestrate.rs +980 -581
  410. data/rust/src/kernel/orchestrate_guard_tests.rs +538 -140
  411. data/rust/src/kernel/pattern.rs +107 -34
  412. data/rust/src/kernel/query_comparators.rs +118 -41
  413. data/rust/src/kernel/query_ordering.rs +13 -5
  414. data/rust/src/kernel/read_model.rs +479 -181
  415. data/rust/src/kernel/reference_lookup.rs +122 -26
  416. data/rust/src/kernel/repository.rs +293 -66
  417. data/rust/src/kernel/routing.rs +58 -42
  418. data/rust/src/kernel/ruby_float.rs +139 -0
  419. data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +57 -57
  420. data/rust/src/kernel/vocab/entity_dispatch_order.rs +54 -54
  421. data/rust/src/kernel/vocab/field_hint.rs +19 -25
  422. data/rust/src/kernel/vocab/mod.rs +6 -6
  423. data/rust/src/kernel/vocab/query_comparator.rs +23 -24
  424. data/rust/src/kernel/vocab/refusal_template.rs +501 -297
  425. data/rust/src/lib.rs +50 -0
  426. data/rust/src/main.rs +4 -1
  427. data/rust/web/Cargo.toml +36 -0
  428. data/rust/web/clippy.toml +4 -0
  429. metadata +85 -15
  430. data/examples/pizzas/bluebook/hecksagon/mock_stripe_payment_adapter.rb +0 -36
  431. data/lib/hecks/adapters/driven/google_authentication.adapter +0 -3
  432. data/lib/hecks/adapters/driven/google_authentication.rb +0 -99
  433. data/lib/hecks/adapters/driven/mock_stripe_adapter.adapter +0 -3
  434. data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +0 -32
  435. data/lib/hecks/ports/authentication.port +0 -6
  436. data/lib/hecks/ports/authentication.rb +0 -67
  437. data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +0 -255
  438. data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +0 -22
  439. data/prebuilt/verdicts-48318ca172edd21443b1ad02801c697fff100b746e828f09db987647641a5df2.json +0 -1
  440. data/rust/host/src/approval.rs +0 -652
data/rust/src/lib.rs CHANGED
@@ -1,8 +1,58 @@
1
1
  //! Library face of the crate, shared by the native/WASI binary and the rust/web browser cdylib.
2
2
  //! Std-only, zero Cargo dependencies (ADR 0012); wasm-bindgen lives in rust/web.
3
+
4
+ // Generated code keeps one shape for every domain, so a domain with no arms still has its `match`,
5
+ // a store still has its `new()`, a chapter may hold an aggregate named like itself
6
+ // (identity::identity), and every command gets the same signature whether or not it uses all of
7
+ // it. Clippy's complaints about that shape are not bugs to fix per file; the generators fix the
8
+ // ones that are real (see the emitters in rust/codegen/src).
9
+ #[allow(
10
+ clippy::match_single_binding,
11
+ clippy::match_like_matches_macro,
12
+ clippy::new_without_default,
13
+ clippy::module_inception,
14
+ clippy::needless_pass_by_value,
15
+ clippy::needless_pass_by_ref_mut,
16
+ clippy::unused_self,
17
+ clippy::unnecessary_wraps,
18
+ clippy::trivially_copy_pass_by_ref,
19
+ clippy::no_effect_underscore_binding,
20
+ clippy::missing_const_for_fn,
21
+ clippy::derive_partial_eq_without_eq,
22
+ clippy::single_match_else,
23
+ clippy::needless_continue,
24
+ clippy::implicit_clone,
25
+ clippy::assigning_clones,
26
+ clippy::doc_link_with_quotes,
27
+ clippy::redundant_closure_for_method_calls
28
+ )]
3
29
  pub mod generated;
4
30
  pub mod kernel;
5
31
 
6
32
  // Test-only: rust/codegen/src/exemplar.rs slices shapes out of this; never in a release build.
33
+ // The files are templates with placeholder bodies, named after their placeholders, so they are
34
+ // neither formatted nor linted as code.
7
35
  #[cfg(test)]
36
+ #[rustfmt::skip]
37
+ #[allow(
38
+ clippy::match_single_binding,
39
+ clippy::match_like_matches_macro,
40
+ clippy::new_without_default,
41
+ clippy::ptr_arg,
42
+ clippy::borrow_deref_ref,
43
+ clippy::needless_pass_by_value,
44
+ clippy::needless_pass_by_ref_mut,
45
+ clippy::unused_self,
46
+ clippy::unnecessary_wraps,
47
+ clippy::trivially_copy_pass_by_ref,
48
+ clippy::no_effect_underscore_binding,
49
+ clippy::missing_const_for_fn,
50
+ clippy::derive_partial_eq_without_eq,
51
+ clippy::use_self,
52
+ clippy::uninlined_format_args,
53
+ clippy::redundant_closure_for_method_calls,
54
+ clippy::map_unwrap_or,
55
+ clippy::doc_link_with_quotes,
56
+ unused_mut
57
+ )]
8
58
  pub mod exemplar;
data/rust/src/main.rs CHANGED
@@ -11,6 +11,9 @@ fn main() {
11
11
  return;
12
12
  }
13
13
  let mut input = String::new();
14
- std::io::stdin().read_to_string(&mut input).expect("failed to read stdin");
14
+ if let Err(error) = std::io::stdin().read_to_string(&mut input) {
15
+ eprintln!("failed to read stdin: {error}");
16
+ std::process::exit(1);
17
+ }
15
18
  println!("{}", rust::kernel::cli::run(&input));
16
19
  }
data/rust/web/Cargo.toml CHANGED
@@ -16,3 +16,39 @@ crate-type = ["cdylib"]
16
16
  [dependencies]
17
17
  rust = { path = ".." }
18
18
  wasm-bindgen = "=0.2.126"
19
+
20
+ # Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
21
+ # out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
22
+ # The same table is in every crate's Cargo.toml; change them together.
23
+ [lints.clippy]
24
+ pedantic = { level = "warn", priority = -1 }
25
+ nursery = { level = "warn", priority = -1 }
26
+ unwrap_used = "warn"
27
+ expect_used = "warn"
28
+ panic = "warn"
29
+ dbg_macro = "warn"
30
+ todo = "warn"
31
+ unimplemented = "warn"
32
+ # Lints that ask for prose or an attribute on every item rather than for better code.
33
+ missing_errors_doc = "allow"
34
+ missing_panics_doc = "allow"
35
+ must_use_candidate = "allow"
36
+ return_self_not_must_use = "allow"
37
+ module_name_repetitions = "allow"
38
+ too_many_lines = "allow"
39
+ too_long_first_doc_paragraph = "allow"
40
+ doc_markdown = "allow"
41
+ # Numeric conversions here are deliberate: JSON numbers are f64 and ids are small.
42
+ cast_possible_truncation = "allow"
43
+ cast_possible_wrap = "allow"
44
+ cast_precision_loss = "allow"
45
+ cast_sign_loss = "allow"
46
+ # Naming heuristics that fire on ordinary short names.
47
+ similar_names = "allow"
48
+ many_single_char_names = "allow"
49
+ struct_field_names = "allow"
50
+ # Heuristics that cost more clarity than they buy here.
51
+ redundant_pub_crate = "allow"
52
+ future_not_send = "allow"
53
+ significant_drop_tightening = "allow"
54
+ match_same_arms = "allow"
@@ -0,0 +1,4 @@
1
+ # The restriction lints (unwrap, expect, panic) guard library code; a test panics to fail.
2
+ allow-unwrap-in-tests = true
3
+ allow-expect-in-tests = true
4
+ allow-panic-in-tests = true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hecks
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.13.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Young
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-10-17 00:00:00.000000000 Z
11
+ date: 2026-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: prism
@@ -35,12 +35,15 @@ executables:
35
35
  extensions: []
36
36
  extra_rdoc_files: []
37
37
  files:
38
- - examples/pizzas/bluebook/hecksagon/mock_stripe_payment_adapter.rb
38
+ - examples/pizzas/adapters/fake_processor.rb
39
+ - examples/pizzas/adapters/payment_signature.rb
40
+ - examples/pizzas/adapters/payment_webhook.rb
39
41
  - examples/pizzas/bluebook/pizzas.behaviors
40
42
  - examples/pizzas/bluebook/pizzas.bluebook
41
43
  - examples/pizzas/bluebook/pizzas.hecksagon
42
44
  - examples/pizzas/bluebook/pizzas.world
43
45
  - examples/pizzas/bluebook/translations/2-77625c.bluebook
46
+ - examples/pizzas/config.ru
44
47
  - examples/pizzas/oidc.json
45
48
  - examples/pizzas/pizzas_behaviors.hecksagon
46
49
  - exe/hecks
@@ -54,8 +57,6 @@ files:
54
57
  - lib/hecks/adapters/driven/d1/connection.rb
55
58
  - lib/hecks/adapters/driven/folder.adapter
56
59
  - lib/hecks/adapters/driven/folder.rb
57
- - lib/hecks/adapters/driven/google_authentication.adapter
58
- - lib/hecks/adapters/driven/google_authentication.rb
59
60
  - lib/hecks/adapters/driven/governance_authorization.adapter
60
61
  - lib/hecks/adapters/driven/governance_authorization.rb
61
62
  - lib/hecks/adapters/driven/heki.adapter
@@ -79,8 +80,6 @@ files:
79
80
  - lib/hecks/adapters/driven/memory/outbox_rows.rb
80
81
  - lib/hecks/adapters/driven/memory/shared_elements.rb
81
82
  - lib/hecks/adapters/driven/memory/shared_elements/values.rb
82
- - lib/hecks/adapters/driven/mock_stripe_adapter.adapter
83
- - lib/hecks/adapters/driven/mock_stripe_adapter.rb
84
83
  - lib/hecks/adapters/driven/postgres.adapter
85
84
  - lib/hecks/adapters/driven/postgres.rb
86
85
  - lib/hecks/adapters/driven/postgres/codec.rb
@@ -242,6 +241,7 @@ files:
242
241
  - lib/hecks/bluebook/dsl/command_builder/owner.rb
243
242
  - lib/hecks/bluebook/dsl/command_builder/rules.rb
244
243
  - lib/hecks/bluebook/dsl/const_shim.rb
244
+ - lib/hecks/bluebook/dsl/derivation_words.rb
245
245
  - lib/hecks/bluebook/dsl/domain_port_builder.rb
246
246
  - lib/hecks/bluebook/dsl/entity_builder.rb
247
247
  - lib/hecks/bluebook/dsl/entity_builder/rules.rb
@@ -322,6 +322,7 @@ files:
322
322
  - lib/hecks/bluebook/model_check/reference_checks.rb
323
323
  - lib/hecks/bluebook/model_check/saga_checks.rb
324
324
  - lib/hecks/bluebook/model_check/verbs.rb
325
+ - lib/hecks/bluebook/named_pattern.rb
325
326
  - lib/hecks/bluebook/pattern_subset.rb
326
327
  - lib/hecks/bluebook/pattern_subset/refusals.rb
327
328
  - lib/hecks/bluebook/pattern_subset/scan.rb
@@ -336,6 +337,10 @@ files:
336
337
  - lib/hecks/bluebook/smoke_test.rb
337
338
  - lib/hecks/bluebook/synthesizer.rb
338
339
  - lib/hecks/bluebook/translation.rb
340
+ - lib/hecks/bluebook/translation_expression.rb
341
+ - lib/hecks/bluebook/translation_expression/evaluator.rb
342
+ - lib/hecks/bluebook/translation_expression/parser.rb
343
+ - lib/hecks/bluebook/translation_plan.rb
339
344
  - lib/hecks/bluebook/value_object.rb
340
345
  - lib/hecks/cache_dir.rb
341
346
  - lib/hecks/canonical_json.rb
@@ -405,11 +410,45 @@ files:
405
410
  - lib/hecks/codemod.rb
406
411
  - lib/hecks/codemod/runner.rb
407
412
  - lib/hecks/codemod/sweep.rb
413
+ - lib/hecks/composer.rb
414
+ - lib/hecks/composer/adapters/claude_composer.adapter
415
+ - lib/hecks/composer/adapters/claude_composer.rb
416
+ - lib/hecks/composer/adapters/fake_agent.adapter
417
+ - lib/hecks/composer/adapters/fake_agent.rb
418
+ - lib/hecks/composer/adapters/jev.adapter
419
+ - lib/hecks/composer/adapters/jev.rb
420
+ - lib/hecks/composer/agent.rb
421
+ - lib/hecks/composer/assistant.rb
422
+ - lib/hecks/composer/behavior_run.rb
423
+ - lib/hecks/composer/bluebook/composer.bluebook
424
+ - lib/hecks/composer/bluebook/composer.hecksagon
425
+ - lib/hecks/composer/board.rb
426
+ - lib/hecks/composer/board_edit.rb
427
+ - lib/hecks/composer/board_edit/command_text.rb
428
+ - lib/hecks/composer/board_edit/source.rb
429
+ - lib/hecks/composer/check.rb
430
+ - lib/hecks/composer/domains.rb
431
+ - lib/hecks/composer/jobs.rb
432
+ - lib/hecks/composer/layout.rb
433
+ - lib/hecks/composer/live.rb
434
+ - lib/hecks/composer/outline.rb
435
+ - lib/hecks/composer/page.html
436
+ - lib/hecks/composer/panels.rb
437
+ - lib/hecks/composer/parse.rb
438
+ - lib/hecks/composer/plain.rb
439
+ - lib/hecks/composer/ports/composer_agent.port
440
+ - lib/hecks/composer/session.rb
441
+ - lib/hecks/composer/toolbox.rb
442
+ - lib/hecks/composer/web.rb
443
+ - lib/hecks/composer/workbench.rb
444
+ - lib/hecks/composer/workspace.rb
408
445
  - lib/hecks/construct.rb
409
446
  - lib/hecks/corpus.rb
447
+ - lib/hecks/corpus/adapters.rb
410
448
  - lib/hecks/corpus/routes.rb
411
449
  - lib/hecks/corpus/rust.rb
412
450
  - lib/hecks/corpus/sources.rb
451
+ - lib/hecks/corpus/worlds.rb
413
452
  - lib/hecks/deploy/bluebook/deploy.bluebook
414
453
  - lib/hecks/deploy/bluebook/deploy.hecksagon
415
454
  - lib/hecks/deploy/oidc.json
@@ -452,6 +491,7 @@ files:
452
491
  - lib/hecks/forms/record_renderer.rb
453
492
  - lib/hecks/forms/record_table.rb
454
493
  - lib/hecks/forms/reference_options.rb
494
+ - lib/hecks/forms/rule_words.rb
455
495
  - lib/hecks/forms/text_shape.rb
456
496
  - lib/hecks/forms/value_object_shape.rb
457
497
  - lib/hecks/fqn.rb
@@ -592,6 +632,7 @@ files:
592
632
  - lib/hecks/grammar/translation.oidc.json
593
633
  - lib/hecks/hecks/adapters/bluebook_report.rb
594
634
  - lib/hecks/hecks/adapters/codebase/codemods.rb
635
+ - lib/hecks/hecks/adapters/codebase/composing.rb
595
636
  - lib/hecks/hecks/adapters/codebase/conformance.rb
596
637
  - lib/hecks/hecks/adapters/codebase/corpus_tasks.rb
597
638
  - lib/hecks/hecks/adapters/codebase/gate.rb
@@ -690,6 +731,7 @@ files:
690
731
  - lib/hecks/hecks/adapters/world_clearing.rb
691
732
  - lib/hecks/hecks/codebase.behaviors
692
733
  - lib/hecks/hecks/codebase.bluebook
734
+ - lib/hecks/hecks/composer.behaviors
693
735
  - lib/hecks/hecks/context_map.hecksagon
694
736
  - lib/hecks/hecks/custodian.behaviors
695
737
  - lib/hecks/hecks/custodian.bluebook
@@ -748,8 +790,6 @@ files:
748
790
  - lib/hecks/ports/agent.port
749
791
  - lib/hecks/ports/agent.rb
750
792
  - lib/hecks/ports/agent/answers.rb
751
- - lib/hecks/ports/authentication.port
752
- - lib/hecks/ports/authentication.rb
753
793
  - lib/hecks/ports/authorization.port
754
794
  - lib/hecks/ports/authorization.rb
755
795
  - lib/hecks/ports/clock.port
@@ -819,12 +859,11 @@ files:
819
859
  - lib/hecks/ports/persistence/plugins/era/postgres_era/sagas.rb
820
860
  - lib/hecks/ports/persistence/plugins/era/storage_shape.rb
821
861
  - lib/hecks/ports/persistence/plugins/era/translation.rb
822
- - lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb
823
862
  - lib/hecks/ports/persistence/plugins/era/translation/audit.rb
824
- - lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb
825
863
  - lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb
826
864
  - lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb
827
865
  - lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb
866
+ - lib/hecks/ports/persistence/plugins/era/translation/expression_sql.rb
828
867
  - lib/hecks/ports/persistence/plugins/era/translation/reattest.rb
829
868
  - lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb
830
869
  - lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb
@@ -1063,6 +1102,7 @@ files:
1063
1102
  - lib/hecks/projections/diagrams/structure.rb
1064
1103
  - lib/hecks/projections/glossary.rb
1065
1104
  - lib/hecks/projections/glossary/entries.rb
1105
+ - lib/hecks/projections/glossary/groups.rb
1066
1106
  - lib/hecks/projections/glossary/html.rb
1067
1107
  - lib/hecks/projections/glossary/html/page.rb
1068
1108
  - lib/hecks/projections/glossary/html/parser.rb
@@ -1075,6 +1115,9 @@ files:
1075
1115
  - lib/hecks/projections/glossary/sections.rb
1076
1116
  - lib/hecks/projections/glossary/sensitivity.rb
1077
1117
  - lib/hecks/projections/glossary/sentences.rb
1118
+ - lib/hecks/projections/glossary/sentences/actions.rb
1119
+ - lib/hecks/projections/glossary/sentences/paths.rb
1120
+ - lib/hecks/projections/glossary/sentences/queries.rb
1078
1121
  - lib/hecks/projections/glossary/sentences/value_objects.rb
1079
1122
  - lib/hecks/projections/glossary/slugs.rb
1080
1123
  - lib/hecks/projections/ir.rb
@@ -1082,6 +1125,7 @@ files:
1082
1125
  - lib/hecks/projections/model/deviations.rb
1083
1126
  - lib/hecks/projections/oidc.rb
1084
1127
  - lib/hecks/projections/parser_table.rb
1128
+ - lib/hecks/projections/plain_english.rb
1085
1129
  - lib/hecks/projections/reference.rb
1086
1130
  - lib/hecks/projections/rust_vocabulary.rb
1087
1131
  - lib/hecks/projections/rust_vocabulary/arguments.rb
@@ -1230,6 +1274,8 @@ files:
1230
1274
  - lib/hecks/projections/site/table/row_builder.rb
1231
1275
  - lib/hecks/projections/site/table/row_defaults.rb
1232
1276
  - lib/hecks/projections/statements.rb
1277
+ - lib/hecks/projections/statements/actions.rb
1278
+ - lib/hecks/projections/statements/relationships.rb
1233
1279
  - lib/hecks/projections/vocabulary.rb
1234
1280
  - lib/hecks/projector.rb
1235
1281
  - lib/hecks/projector/cli_audience.rb
@@ -1246,9 +1292,11 @@ files:
1246
1292
  - lib/hecks/projector/docs_projector/behaviour.rb
1247
1293
  - lib/hecks/projector/docs_projector/closing.rb
1248
1294
  - lib/hecks/projector/exporter.rb
1295
+ - lib/hecks/projector/exporter/adapters.rb
1249
1296
  - lib/hecks/projector/exporter/bindings.rb
1250
1297
  - lib/hecks/projector/exporter/capability_values.rb
1251
1298
  - lib/hecks/projector/exporter/translations.rb
1299
+ - lib/hecks/projector/exporter/worlds.rb
1252
1300
  - lib/hecks/projector/ir_projector.rb
1253
1301
  - lib/hecks/projector/narrate_projector.rb
1254
1302
  - lib/hecks/projector/narrate_projector/commands.rb
@@ -1517,6 +1565,7 @@ files:
1517
1565
  - lib/hecks/rust_build/wasm.rb
1518
1566
  - lib/hecks/rust_build/wasm_browser.rb
1519
1567
  - lib/hecks/rust_build/write_if_changed.rb
1568
+ - lib/hecks/rust_format.rb
1520
1569
  - lib/hecks/served_options.rb
1521
1570
  - lib/hecks/site/bluebook/site.bluebook
1522
1571
  - lib/hecks/site/bluebook/site.hecksagon
@@ -1636,9 +1685,9 @@ files:
1636
1685
  - lib/rubocop/cop/hecks/symbol_string_key_mix.rb
1637
1686
  - lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb
1638
1687
  - lib/rubocop/cop/hecks/untyped_raise.rb
1639
- - prebuilt/2b59737fbdbd5f44edda0fddce2611f45d76087b3a7c782d1f1a17ea58c77948.marshal
1640
- - prebuilt/58208399bada10b0db99928c48e38789288fc58f7b71a72b21bfa386680e32ed.marshal
1641
- - prebuilt/verdicts-48318ca172edd21443b1ad02801c697fff100b746e828f09db987647641a5df2.json
1688
+ - prebuilt/02c09c73b272c1fb5a9ae6d87bb5e5e529208e00f6b4b597dc2c0fd70a9c0964.marshal
1689
+ - prebuilt/bb84a835cf6a15136bad5ca03aa5bf93a5b92f5f72444618d3ef2412b987fb32.marshal
1690
+ - prebuilt/verdicts-f1f10da14c8e8f01b4c9b7e3e2d74be8cd2bf4676364ed17fa16975d2a076d75.json
1642
1691
  - qa/settings.yml
1643
1692
  - rust/.cargo/config.toml
1644
1693
  - rust/.cargo/mutants.toml
@@ -1649,6 +1698,8 @@ files:
1649
1698
  - rust/build/.gitignore
1650
1699
  - rust/build/Cargo.lock
1651
1700
  - rust/build/Cargo.toml
1701
+ - rust/build/clippy.toml
1702
+ - rust/build/src/adapters_pass.rs
1652
1703
  - rust/build/src/binding_pass.rs
1653
1704
  - rust/build/src/build_artifact.rs
1654
1705
  - rust/build/src/cargo_sync.rs
@@ -1658,14 +1709,18 @@ files:
1658
1709
  - rust/build/src/reserved_names.rs
1659
1710
  - rust/build/src/resolve.rs
1660
1711
  - rust/build/src/root.rs
1712
+ - rust/build/src/rustfmt.rs
1661
1713
  - rust/build/src/seams_pass.rs
1662
1714
  - rust/build/src/subprocess.rs
1663
1715
  - rust/build/src/tmp.rs
1664
1716
  - rust/build/src/translation_pass.rs
1717
+ - rust/build/src/world_pass.rs
1718
+ - rust/clippy.toml
1665
1719
  - rust/codegen/.cargo/config.toml
1666
1720
  - rust/codegen/.gitignore
1667
1721
  - rust/codegen/Cargo.lock
1668
1722
  - rust/codegen/Cargo.toml
1723
+ - rust/codegen/clippy.toml
1669
1724
  - rust/codegen/src/asks.rs
1670
1725
  - rust/codegen/src/attr.rs
1671
1726
  - rust/codegen/src/bridging.rs
@@ -1677,6 +1732,7 @@ files:
1677
1732
  - rust/codegen/src/expr_emitter.rs
1678
1733
  - rust/codegen/src/fielded.rs
1679
1734
  - rust/codegen/src/hecks_naming.rs
1735
+ - rust/codegen/src/hecks_naming_tests.rs
1680
1736
  - rust/codegen/src/json.rs
1681
1737
  - rust/codegen/src/json_codec.rs
1682
1738
  - rust/codegen/src/literal.rs
@@ -1702,10 +1758,11 @@ files:
1702
1758
  - rust/host/Cargo.lock
1703
1759
  - rust/host/Cargo.toml
1704
1760
  - rust/host/HECKS_RELEASE
1761
+ - rust/host/clippy.toml
1705
1762
  - rust/host/rds-ca-bundle.pem
1706
1763
  - rust/host/src/api.rs
1707
- - rust/host/src/approval.rs
1708
1764
  - rust/host/src/auth.rs
1765
+ - rust/host/src/b64.rs
1709
1766
  - rust/host/src/bin/expr_harness.rs
1710
1767
  - rust/host/src/bin/lineage_harness.rs
1711
1768
  - rust/host/src/bin/mint_harness.rs
@@ -1718,12 +1775,16 @@ files:
1718
1775
  - rust/host/src/boundary_fuzz/server.rs
1719
1776
  - rust/host/src/boundary_fuzz/web.rs
1720
1777
  - rust/host/src/checkout.rs
1778
+ - rust/host/src/clock.rs
1721
1779
  - rust/host/src/commerce_ir.rs
1780
+ - rust/host/src/crypto.rs
1722
1781
  - rust/host/src/dispatch.rs
1723
1782
  - rust/host/src/expr_json.rs
1724
1783
  - rust/host/src/extension.rs
1725
1784
  - rust/host/src/field_hints.rs
1726
1785
  - rust/host/src/fuzz_support.rs
1786
+ - rust/host/src/host.rs
1787
+ - rust/host/src/http.rs
1727
1788
  - rust/host/src/ir.rs
1728
1789
  - rust/host/src/journal.rs
1729
1790
  - rust/host/src/lambda_client.rs
@@ -1734,6 +1795,7 @@ files:
1734
1795
  - rust/host/src/needs.rs
1735
1796
  - rust/host/src/payments.rs
1736
1797
  - rust/host/src/payments/keystore.rs
1798
+ - rust/host/src/payments/roles.rs
1737
1799
  - rust/host/src/payments/tests.rs
1738
1800
  - rust/host/src/platform_signin/attack_tests.rs
1739
1801
  - rust/host/src/platform_signin/config.rs
@@ -1786,6 +1848,7 @@ files:
1786
1848
  - rust/lsp/Cargo.lock
1787
1849
  - rust/lsp/Cargo.toml
1788
1850
  - rust/lsp/README.md
1851
+ - rust/lsp/clippy.toml
1789
1852
  - rust/lsp/src/diagnostics.rs
1790
1853
  - rust/lsp/src/json.rs
1791
1854
  - rust/lsp/src/main.rs
@@ -1795,6 +1858,7 @@ files:
1795
1858
  - rust/parser/.gitignore
1796
1859
  - rust/parser/Cargo.lock
1797
1860
  - rust/parser/Cargo.toml
1861
+ - rust/parser/clippy.toml
1798
1862
  - rust/parser/fuzz/.gitignore
1799
1863
  - rust/parser/fuzz/Cargo.lock
1800
1864
  - rust/parser/fuzz/Cargo.toml
@@ -1804,6 +1868,7 @@ files:
1804
1868
  - rust/parser/src/build/closed_sets.rs
1805
1869
  - rust/parser/src/build/identity.rs
1806
1870
  - rust/parser/src/build/mod.rs
1871
+ - rust/parser/src/build/named_pattern.rs
1807
1872
  - rust/parser/src/build/naming.rs
1808
1873
  - rust/parser/src/build/pattern_subset.rs
1809
1874
  - rust/parser/src/build/query_derive.rs
@@ -1821,7 +1886,9 @@ files:
1821
1886
  - rust/parser/src/ir.rs
1822
1887
  - rust/parser/src/keywords.rs
1823
1888
  - rust/parser/src/lex.rs
1889
+ - rust/parser/src/lib.rs
1824
1890
  - rust/parser/src/main.rs
1891
+ - rust/parser/src/parse/adapter.rs
1825
1892
  - rust/parser/src/parse/aggregate.rs
1826
1893
  - rust/parser/src/parse/chapter.rs
1827
1894
  - rust/parser/src/parse/command.rs
@@ -1837,6 +1904,7 @@ files:
1837
1904
  - rust/parser/src/parse/query.rs
1838
1905
  - rust/parser/src/parse/read_model.rs
1839
1906
  - rust/parser/src/parse/value_object.rs
1907
+ - rust/parser/src/parse/world.rs
1840
1908
  - rust/parser/src/ruby_value.rs
1841
1909
  - rust/src/exemplar/commands.rs
1842
1910
  - rust/src/exemplar/constraints.rs
@@ -1884,6 +1952,7 @@ files:
1884
1952
  - rust/src/kernel/reference_lookup.rs
1885
1953
  - rust/src/kernel/repository.rs
1886
1954
  - rust/src/kernel/routing.rs
1955
+ - rust/src/kernel/ruby_float.rs
1887
1956
  - rust/src/kernel/vocab/aggregate_dispatch_order.rs
1888
1957
  - rust/src/kernel/vocab/entity_dispatch_order.rs
1889
1958
  - rust/src/kernel/vocab/field_hint.rs
@@ -1895,6 +1964,7 @@ files:
1895
1964
  - rust/web/.gitignore
1896
1965
  - rust/web/Cargo.lock
1897
1966
  - rust/web/Cargo.toml
1967
+ - rust/web/clippy.toml
1898
1968
  - rust/web/src/lib.rs
1899
1969
  homepage: https://github.com/heckslabs/hecks
1900
1970
  licenses:
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Driving adapter standing in for a Stripe webhook handler: boots Pizzas and calls
4
- # Dispatcher#dispatch_port, which translates the payment into PizzaPaymentReceived.
5
- #
6
- # examples/pizzas/bluebook/hecksagon/mock_stripe_payment_adapter.rb
7
-
8
- $LOAD_PATH.unshift File.expand_path("../../../../lib", __dir__)
9
-
10
- require "hecks"
11
-
12
- DOMAIN = File.expand_path("../..", __dir__)
13
- RUNTIME = Hecks.boot(DOMAIN)
14
-
15
- # Unique per run: identity is never minted, so a repeated name would be refused as AlreadyExists.
16
- NAME = "StripeDemoMargherita-#{Process.pid}-#{rand(10_000)}".freeze
17
-
18
- # Set the stage: an order Purchase's `given` rules will accept.
19
- order = Order.create_pizza(name: { value: NAME }, pizza: { price_cents: { cents: 1200 }, size: { value: "large" } })
20
- order.add_topping(topping: { value: "Basil" }, amount: { value: 3 })
21
-
22
- puts "Before payment: #{order.status}, customer=#{order.customer_name.inspect}"
23
-
24
- # The webhook: a real handler would verify a Stripe signature; a reference is always a bare id.
25
- RUNTIME.dispatch_port(
26
- "Pizzas", "Order", "PaymentGateway", "Receive",
27
- flat: {
28
- name: NAME,
29
- customer_name: { value: "Chris" },
30
- amount: { cents: 1200 }
31
- }
32
- )
33
-
34
- sold = Order.find(NAME)
35
- puts "After payment: #{sold.status}, customer=#{sold.customer_name.to_h}"
36
- puts "Events: #{sold.events.map(&:name).join(", ")}"
@@ -1,3 +0,0 @@
1
- Hecks.adapter "GoogleAuthentication" do
2
- port "authentication"
3
- end
@@ -1,99 +0,0 @@
1
- require "securerandom"
2
-
3
- require_relative "../../ports/authentication"
4
-
5
- module Hecks
6
- module Adapters
7
- # Google's OIDC handshake — the `authentication` port's adapter for Google
8
- # sign-in, via `oauth2` (code exchange) and `google-id-token` (verification).
9
- #
10
- # `oauth2`/`google-id-token` load lazily, inside the methods that use
11
- # them, so a domain that never binds this adapter never needs them installed.
12
- #
13
- # `GOOGLE_CLIENT_ID`/`GOOGLE_CLIENT_SECRET`/`GOOGLE_REDIRECT_URI` have no
14
- # defaults, on purpose: a half-configured login should refuse to boot.
15
- module GoogleAuthentication
16
- ISSUER = "https://accounts.google.com".freeze
17
-
18
- module_function
19
-
20
- # Builds the OAuth2 client for Google's token endpoints.
21
- #
22
- # @return [OAuth2::Client] a client configured for Google's OAuth2/OIDC endpoints
23
- # @raise [KeyError] if `GOOGLE_CLIENT_ID` or `GOOGLE_CLIENT_SECRET` is unset
24
- def client
25
- require "oauth2"
26
- OAuth2::Client.new(
27
- ENV.fetch("GOOGLE_CLIENT_ID"), ENV.fetch("GOOGLE_CLIENT_SECRET"),
28
- site: "https://oauth2.googleapis.com",
29
- authorize_url: "https://accounts.google.com/o/oauth2/v2/auth",
30
- token_url: "/token"
31
- )
32
- end
33
-
34
- # The URL to send a browser to, carrying a fresh CSRF `state` the caller
35
- # must stash (typically in a session) and check again in `verify`.
36
- #
37
- # @return [Array(String, String)] the URL to send the browser to, and the fresh CSRF
38
- # `state` embedded in it
39
- # @raise [KeyError] if `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` or
40
- # `GOOGLE_REDIRECT_URI` is unset
41
- def authorization_url
42
- state = SecureRandom.hex(24)
43
- url = client.auth_code.authorize_url(
44
- redirect_uri: ENV.fetch("GOOGLE_REDIRECT_URI"),
45
- scope: "openid email profile",
46
- state: state
47
- )
48
- [url, state]
49
- end
50
-
51
- # Exchanges `code` for tokens and verifies the ID token against Google's
52
- # JWKS; `email_verified` tells a caller if Google actually checked the email.
53
- # @param code [String] the authorization code the provider sent back
54
- # @param state [String, nil] the state parameter the provider returned; nil is refused
55
- # @param expected_state [String, nil] the state `authorization_url` handed out before
56
- # the redirect; nil is refused
57
- # @return [Hash{Symbol => Object}] `issuer:` and `subject:` (String), `email:` (String,
58
- # or nil if the token carries none), `email_verified:` (Boolean)
59
- # @raise [Ports::Authentication::ValidationError] if the state check, code exchange, or
60
- # ID token verification fails
61
- # @raise [KeyError] if `GOOGLE_CLIENT_ID` or `GOOGLE_REDIRECT_URI` is unset, or a
62
- # verified token lacks an `iss` or `sub` claim
63
- def verify(code:, state:, expected_state:)
64
- # Both requires happen up front: the rescue below matches
65
- # GoogleIDToken::ValidationError, resolved only when caught, so
66
- # requiring it lazily after an OAuth2::Error would mask the real failure.
67
- require "oauth2"
68
- require "google-id-token"
69
-
70
- raise Ports::Authentication::ValidationError, "state mismatch" unless state && expected_state && state == expected_state
71
-
72
- identity(GoogleIDToken::Validator.new.check(exchange(code), ENV.fetch("GOOGLE_CLIENT_ID")))
73
- rescue OAuth2::Error, GoogleIDToken::ValidationError => e
74
- raise Ports::Authentication::ValidationError, e.message
75
- end
76
-
77
- # Exchanges an authorization code for the provider's raw ID token.
78
- #
79
- # @param code [String] the authorization code the provider sent back
80
- # @return [String] the unverified ID token
81
- # @raise [Ports::Authentication::ValidationError] if the response carries no ID token
82
- def exchange(code)
83
- token = client.auth_code.get_token(code, redirect_uri: ENV.fetch("GOOGLE_REDIRECT_URI"))
84
- token.params["id_token"] or raise Ports::Authentication::ValidationError, "no id_token in the response"
85
- end
86
-
87
- # Reads the identity claims out of a verified ID token payload.
88
- #
89
- # @param payload [Hash{String => Object}] the verified token claims
90
- # @return [Hash{Symbol => Object}] the same shape `verify` returns
91
- def identity(payload)
92
- {
93
- issuer: payload.fetch("iss"), subject: payload.fetch("sub"),
94
- email: payload["email"], email_verified: [true, "true"].include?(payload["email_verified"])
95
- }
96
- end
97
- end
98
- end
99
- end
@@ -1,3 +0,0 @@
1
- Hecks.adapter "MockStripeAdapter" do
2
- port "checkout"
3
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Hecks
4
- module Adapters
5
- # A network-free stand-in for a Checkout-Session-style payment adapter, matching it by
6
- # method shape alone. The returned URL carries `registration_id`, as webhook metadata would.
7
- class MockStripeAdapter
8
- # Accepts and discards the shared adapter constructor arguments; this adapter holds no
9
- # state of its own.
10
- #
11
- # @param aggregate [Bluebook::Aggregate, nil] accepted for the shared adapter
12
- # constructor shape and ignored
13
- # @param settings [Hash] accepted for the shared adapter constructor shape and ignored
14
- # @param root [String, nil] accepted for the shared adapter constructor shape and ignored
15
- def initialize(aggregate: nil, settings: {}, root: nil); end
16
-
17
- # Builds a fake checkout URL carrying `registration_id`, standing in for a real
18
- # Checkout-Session call.
19
- #
20
- # @param event [Object] the record data a real adapter would read; never read here
21
- # @param registration_id [String] embedded in the returned URL, never read otherwise
22
- # @param success_url [String] the base URL to redirect a successful payer to
23
- # @param cancel_url [String] accepted for the shared call shape and never read
24
- # @return [String] `success_url` with `mock_checkout=1` and `mock_registration_id`
25
- # query parameters appended
26
- def create_session(event:, registration_id:, success_url:, cancel_url:)
27
- separator = success_url.include?("?") ? "&" : "?"
28
- "#{success_url}#{separator}mock_checkout=1&mock_registration_id=#{registration_id}"
29
- end
30
- end
31
- end
32
- end
@@ -1,6 +0,0 @@
1
- Hecks.port "authentication" do
2
- verb "authenticated_by"
3
- signal :reply
4
- answers :authorization_url
5
- answers :verify
6
- end