hecks 3.10.0 → 3.12.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 (542) hide show
  1. checksums.yaml +4 -4
  2. data/examples/pizzas/bluebook/pizzas.bluebook +29 -0
  3. data/examples/pizzas/bluebook/pizzas.hecksagon +7 -0
  4. data/exe/hecks +4 -4
  5. data/lib/hecks/adapters/driven/d1.rb +2 -10
  6. data/lib/hecks/adapters/driven/heki.adapter +1 -1
  7. data/lib/hecks/adapters/driven/heki.rb +2 -12
  8. data/lib/hecks/adapters/driven/lambda.adapter +1 -1
  9. data/lib/hecks/adapters/driven/lambda.rb +3 -18
  10. data/lib/hecks/adapters/driven/postgres.rb +4 -11
  11. data/lib/hecks/adapters/driven/sqlite.adapter +1 -1
  12. data/lib/hecks/adapters/driven/sqlite.rb +2 -10
  13. data/lib/hecks/adapters/driving/admission.rb +46 -0
  14. data/lib/hecks/adapters/driving/cli/nesting.rb +36 -0
  15. data/lib/hecks/adapters/driving/cli/shorthand.rb +88 -0
  16. data/lib/hecks/adapters/driving/cli.rb +127 -0
  17. data/lib/hecks/adapters/driving/cli_runner/answers.rb +160 -0
  18. data/lib/hecks/adapters/driving/cli_runner/resolution.rb +158 -0
  19. data/lib/hecks/adapters/driving/cli_runner/settling.rb +120 -0
  20. data/lib/hecks/adapters/driving/cli_runner/streaming.rb +93 -0
  21. data/lib/hecks/adapters/driving/cli_runner/suggestions.rb +47 -0
  22. data/lib/hecks/adapters/driving/cli_runner.rb +70 -0
  23. data/lib/hecks/adapters/driving/command_request.rb +121 -0
  24. data/lib/hecks/adapters/driving/handle.rb +214 -0
  25. data/lib/hecks/adapters/driving/json.rb +136 -0
  26. data/lib/hecks/adapters/driving/launcher_options.rb +267 -0
  27. data/lib/hecks/adapters/driving/mcp/properties.rb +49 -0
  28. data/lib/hecks/adapters/driving/mcp/tool_calls.rb +116 -0
  29. data/lib/hecks/adapters/driving/mcp/tool_definitions/auditing.rb +53 -0
  30. data/lib/hecks/adapters/driving/mcp/tool_definitions/calling.rb +71 -0
  31. data/lib/hecks/adapters/driving/mcp/tool_definitions/reading.rb +99 -0
  32. data/lib/hecks/adapters/driving/mcp/tool_definitions.rb +18 -0
  33. data/lib/hecks/adapters/driving/mcp.rb +159 -0
  34. data/lib/hecks/adapters/driving/mcp_guide_cache.rb +78 -0
  35. data/lib/hecks/adapters/driving/mcp_scope/argument_policy.rb +97 -0
  36. data/lib/hecks/adapters/driving/mcp_scope/env_problems.rb +69 -0
  37. data/lib/hecks/adapters/driving/mcp_scope/presenter.rb +83 -0
  38. data/lib/hecks/adapters/driving/mcp_scope.rb +213 -0
  39. data/lib/hecks/adapters/driving/newcomer.rb +50 -0
  40. data/lib/hecks/adapters/driving/ruby/aggregate_module.rb +171 -0
  41. data/lib/hecks/adapters/driving/ruby/chapter.rb +91 -0
  42. data/lib/hecks/adapters/driving/ruby.rb +83 -0
  43. data/lib/hecks/adapters/driving/usage_cache.rb +144 -0
  44. data/lib/hecks/{doors.rb → adapters/driving.rb} +10 -6
  45. data/lib/hecks/behaviors/expectations/boot.rb +1 -1
  46. data/lib/hecks/bench/ruby_runner.rb +1 -1
  47. data/lib/hecks/bluebook/ask_resolution.rb +130 -0
  48. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +8 -2
  49. data/lib/hecks/bluebook/assembly/contracts/read_models.rb +1 -1
  50. data/lib/hecks/bluebook/assembly/contracts/rules.rb +4 -2
  51. data/lib/hecks/bluebook/assembly/contracts/structure.rb +3 -1
  52. data/lib/hecks/bluebook/assembly/marks.rb +4 -15
  53. data/lib/hecks/bluebook/assembly/scalars.rb +39 -0
  54. data/lib/hecks/bluebook/attribute.rb +1 -1
  55. data/lib/hecks/bluebook/behaviour/command.rb +13 -8
  56. data/lib/hecks/bluebook/behaviour/policy.rb +30 -0
  57. data/lib/hecks/bluebook/capabilities/attribute_values.rb +72 -0
  58. data/lib/hecks/bluebook/capabilities.rb +91 -9
  59. data/lib/hecks/bluebook/domain_port.rb +16 -4
  60. data/lib/hecks/bluebook/dsl/adapter_builder.rb +18 -6
  61. data/lib/hecks/bluebook/dsl/binding_proxy.rb +13 -0
  62. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/computed_sources.rb +98 -0
  63. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/fan_out_rows.rb +42 -0
  64. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/projected_fields.rb +14 -2
  65. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/provisions.rb +69 -3
  66. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/with_projections.rb +17 -10
  67. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +5 -0
  68. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +2 -0
  69. data/lib/hecks/bluebook/dsl/command_builder/mutations.rb +8 -1
  70. data/lib/hecks/bluebook/dsl/command_builder/operands.rb +121 -0
  71. data/lib/hecks/bluebook/dsl/command_builder.rb +2 -0
  72. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +10 -1
  73. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +45 -2
  74. data/lib/hecks/bluebook/dsl/policy_builder.rb +47 -10
  75. data/lib/hecks/bluebook/dsl/rule_reference.rb +7 -4
  76. data/lib/hecks/bluebook/dsl/world_builder.rb +1 -1
  77. data/lib/hecks/bluebook/expression/ast_json/emitters.rb +6 -0
  78. data/lib/hecks/bluebook/expression/ast_json.rb +9 -6
  79. data/lib/hecks/bluebook/expression/ast_reader.rb +14 -9
  80. data/lib/hecks/bluebook/expression/projection.json +36 -0
  81. data/lib/hecks/bluebook/expression/resolver/operations.rb +31 -0
  82. data/lib/hecks/bluebook/expression/resolver/parsing.rb +38 -5
  83. data/lib/hecks/bluebook/expression/resolver/scanning.rb +22 -5
  84. data/lib/hecks/bluebook/expression/resolver/values.rb +10 -0
  85. data/lib/hecks/bluebook/expression/resolver.rb +20 -1
  86. data/lib/hecks/bluebook/hecksagon.rb +23 -3
  87. data/lib/hecks/bluebook/lifecycle.rb +22 -3
  88. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +13 -1
  89. data/lib/hecks/bluebook/meta_validator/modes.rb +4 -1
  90. data/lib/hecks/bluebook/meta_validator/readings.rb +24 -1
  91. data/lib/hecks/bluebook/meta_validator/reconstruction/heads.rb +2 -1
  92. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +6 -3
  93. data/lib/hecks/bluebook/meta_validator/shapes.rb +5 -0
  94. data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +1 -1
  95. data/lib/hecks/bluebook/meta_validator.rb +12 -12
  96. data/lib/hecks/bluebook/model_check/ask_checks.rb +71 -0
  97. data/lib/hecks/bluebook/model_check/policy_checks.rb +2 -1
  98. data/lib/hecks/bluebook/model_check/reference_checks.rb +70 -0
  99. data/lib/hecks/bluebook/model_check.rb +8 -2
  100. data/lib/hecks/bluebook/policy.rb +4 -2
  101. data/lib/hecks/bluebook/smoke_test.rb +1 -1
  102. data/lib/hecks/bluebook/synthesizer.rb +2 -0
  103. data/lib/hecks/bluebook.rb +2 -0
  104. data/lib/hecks/cli/command_table.rb +1 -1
  105. data/lib/hecks/cli/console.rb +2 -1
  106. data/lib/hecks/cli/document.rb +1 -1
  107. data/lib/hecks/cli/launcher_words.rb +4 -4
  108. data/lib/hecks/cli/mcp.rb +4 -4
  109. data/lib/hecks/cli/project_cli/launcher_source.rb +2 -2
  110. data/lib/hecks/cli/project_cli/templates.rb +5 -5
  111. data/lib/hecks/cli/project_cli.rb +9 -6
  112. data/lib/hecks/cli/run.rb +2 -2
  113. data/lib/hecks/cli/smoke_http/checks.rb +4 -1
  114. data/lib/hecks/cli/smoke_http/transport.rb +3 -3
  115. data/lib/hecks/cli/smoke_http.rb +3 -0
  116. data/lib/hecks/codemod.rb +5 -2
  117. data/lib/hecks/corpus/routes.rb +7 -0
  118. data/lib/hecks/corpus/rust.rb +3 -2
  119. data/lib/hecks/deploy/bluebook/deploy.bluebook +34 -4
  120. data/lib/hecks/doc/reference/rendering.rb +6 -3
  121. data/lib/hecks/forms/app/commands.rb +8 -7
  122. data/lib/hecks/forms/app/queries.rb +2 -1
  123. data/lib/hecks/forms/app.rb +1 -1
  124. data/lib/hecks/forms/record_renderer.rb +1 -1
  125. data/lib/hecks/framework/bluebook/privacy.bluebook +11 -0
  126. data/lib/hecks/fuzzing/concurrent_dispatch.rb +4 -1
  127. data/lib/hecks/fuzzing/failure_triage.rb +2 -1
  128. data/lib/hecks/fuzzing/mutation/run.rb +11 -4
  129. data/lib/hecks/fuzzing/properties/catalog.rb +6 -4
  130. data/lib/hecks/fuzzing/properties/guaranteed_by_construction.rb +18 -11
  131. data/lib/hecks/fuzzing/properties/guards.rb +1 -1
  132. data/lib/hecks/fuzzing/self_consistency/saga_redelivery.rb +1 -1
  133. data/lib/hecks/fuzzing/self_consistency.rb +6 -2
  134. data/lib/hecks/fuzzing/shrinker.rb +3 -1
  135. data/lib/hecks/fuzzing/value_generator.rb +19 -5
  136. data/lib/hecks/gate/stages.yml +33 -7
  137. data/lib/hecks/grammar/evolve.rb +1 -1
  138. data/lib/hecks/grammar/expression_operators.json +372 -0
  139. data/lib/hecks/grammar/operators.rb +3 -1
  140. data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +10 -10
  141. data/lib/hecks/hecks/adapters/codebase/inspection/rubycritic.rb +35 -0
  142. data/lib/hecks/hecks/adapters/codebase/inspection.rb +104 -0
  143. data/lib/hecks/hecks/adapters/codebase/publishing.rb +2 -1
  144. data/lib/hecks/hecks/adapters/codebase/release_facts.rb +12 -2
  145. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +2 -1
  146. data/lib/hecks/hecks/adapters/codebase/test_runner.rb +1 -1
  147. data/lib/hecks/hecks/adapters/cost_explorer.rb +8 -5
  148. data/lib/hecks/hecks/adapters/deploy_toolchain/statuses.rb +2 -1
  149. data/lib/hecks/hecks/adapters/finding_github.rb +13 -6
  150. data/lib/hecks/hecks/adapters/first_admin.rb +2 -2
  151. data/lib/hecks/hecks/adapters/github_rulesets.rb +6 -3
  152. data/lib/hecks/hecks/adapters/in_process_boot.rb +1 -1
  153. data/lib/hecks/hecks/adapters/journal_store/compaction.rb +1 -1
  154. data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +10 -20
  155. data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +28 -5
  156. data/lib/hecks/hecks/adapters/local_files.rb +2 -2
  157. data/lib/hecks/hecks/adapters/rehearsal/audit_report.rb +107 -0
  158. data/lib/hecks/hecks/adapters/rehearsal/census.rb +71 -0
  159. data/lib/hecks/hecks/adapters/rehearsal/declaration.rb +133 -0
  160. data/lib/hecks/hecks/adapters/rehearsal/environment.rb +83 -0
  161. data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +142 -0
  162. data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +96 -0
  163. data/lib/hecks/hecks/adapters/rehearsal/postgres_census.rb +100 -0
  164. data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +69 -0
  165. data/lib/hecks/hecks/adapters/rehearsal/postgres_store.rb +133 -0
  166. data/lib/hecks/hecks/adapters/rehearsal/rows.rb +41 -0
  167. data/lib/hecks/hecks/adapters/rehearsal/rust_audit.rb +83 -0
  168. data/lib/hecks/hecks/adapters/rehearsal/subject.rb +104 -0
  169. data/lib/hecks/hecks/adapters/rehearsal.rb +54 -0
  170. data/lib/hecks/hecks/adapters/rehearsal_store.adapter +7 -0
  171. data/lib/hecks/hecks/adapters/rehearsal_store.rb +81 -0
  172. data/lib/hecks/hecks/adapters/terminal.rb +13 -11
  173. data/lib/hecks/hecks/codebase.behaviors +13 -1
  174. data/lib/hecks/hecks/codebase.bluebook +239 -5
  175. data/lib/hecks/hecks/custodian.behaviors +24 -6
  176. data/lib/hecks/hecks/custodian.bluebook +6 -1227
  177. data/lib/hecks/hecks/deploy.behaviors +1 -1
  178. data/lib/hecks/hecks/deploy.world +1 -3
  179. data/lib/hecks/hecks/hecks.behaviors +1 -1
  180. data/lib/hecks/hecks/hecks.hecksagon +53 -18
  181. data/lib/hecks/hecks/hecks.world +13 -10
  182. data/lib/hecks/hecks/rehearsal.bluebook +477 -0
  183. data/lib/hecks/hecks/site.behaviors +1 -1
  184. data/lib/hecks/hecks/site.world +0 -1
  185. data/lib/hecks/hecks/tooling.bluebook +1238 -0
  186. data/lib/hecks/indifferent_key.rb +20 -0
  187. data/lib/hecks/language/adapter.bluebook +13 -3
  188. data/lib/hecks/language/bluebook/aggregate.bluebook +23 -0
  189. data/lib/hecks/language/bluebook/bluebook.behaviors +23 -0
  190. data/lib/hecks/language/bluebook/bluebook.bluebook +15 -0
  191. data/lib/hecks/language/bluebook/entity.bluebook +18 -0
  192. data/lib/hecks/language/bluebook/policy.behaviors +19 -0
  193. data/lib/hecks/language/bluebook/policy.bluebook +9 -1
  194. data/lib/hecks/language/bluebook/query.bluebook +1 -1
  195. data/lib/hecks/language/bluebook/vocabulary.bluebook +63 -4
  196. data/lib/hecks/language/hecksagon/domain_port.bluebook +1 -1
  197. data/lib/hecks/language/hecksagon/hecksagon.bluebook +22 -0
  198. data/lib/hecks/language/oidc.json +10 -0
  199. data/lib/hecks/language/port.bluebook +4 -4
  200. data/lib/hecks/literal.rb +12 -3
  201. data/lib/hecks/ports/key_vault.rb +7 -2
  202. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +21 -10
  203. data/lib/hecks/ports/persistence/plugins/era/postgres_era/boot.rb +4 -2
  204. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +2 -1
  205. data/lib/hecks/ports/persistence/repository_factory.rb +6 -3
  206. data/lib/hecks/projection_files/expression_tables.rb +7 -2
  207. data/lib/hecks/projections/deploy/box/compose.rb +6 -4
  208. data/lib/hecks/projections/deploy/box/edge.rb +62 -0
  209. data/lib/hecks/projections/deploy/box/logging.rb +99 -0
  210. data/lib/hecks/projections/deploy/box/roll_scripts.rb +16 -8
  211. data/lib/hecks/projections/deploy/box/settings/cdn.rb +40 -0
  212. data/lib/hecks/projections/deploy/box/settings/logs.rb +40 -0
  213. data/lib/hecks/projections/deploy/box/settings/patterns.rb +11 -0
  214. data/lib/hecks/projections/deploy/box/settings/types.rb +16 -1
  215. data/lib/hecks/projections/deploy/box/settings.rb +6 -2
  216. data/lib/hecks/projections/deploy/box/stack_yaml.rb +5 -2
  217. data/lib/hecks/projections/deploy/box/templates/Makefile.tmpl +16 -0
  218. data/lib/hecks/projections/deploy/box/templates/box.yaml.tmpl +8 -4
  219. data/lib/hecks/projections/deploy/box/templates/deploy-box.sh.tmpl +32 -0
  220. data/lib/hecks/projections/deploy/box/templates/deploy-service.sh.tmpl +1 -1
  221. data/lib/hecks/projections/deploy/box/templates/edge.mk.tmpl +17 -0
  222. data/lib/hecks/projections/deploy/box/templates/edge.yaml.tmpl +65 -0
  223. data/lib/hecks/projections/deploy/box/templates/log-group.yaml.tmpl +12 -0
  224. data/lib/hecks/projections/deploy/box/templates/log-policy.yaml.tmpl +7 -0
  225. data/lib/hecks/projections/deploy/box/templates/render-compose-taskdef.sh.tmpl +5 -4
  226. data/lib/hecks/projections/deploy/box/templates/render-compose.sh.tmpl +5 -4
  227. data/lib/hecks/projections/deploy/box.rb +15 -3
  228. data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
  229. data/lib/hecks/projections/deploy/shared.rb +5 -2
  230. data/lib/hecks/projections/model/deviations.rb +2 -2
  231. data/lib/hecks/projections/model.rb +2 -2
  232. data/lib/hecks/projections/oidc.rb +13 -1
  233. data/lib/hecks/projections/shape.rb +5 -2
  234. data/lib/hecks/projections/site/cms_editor/attributes.rb +26 -6
  235. data/lib/hecks/projections/site/cms_editor/blocks.rb +157 -0
  236. data/lib/hecks/projections/site/cms_editor/checks.rb +14 -1
  237. data/lib/hecks/projections/site/cms_editor/clearing.rb +70 -0
  238. data/lib/hecks/projections/site/cms_editor/color.rb +124 -0
  239. data/lib/hecks/projections/site/cms_editor/composition.rb +42 -0
  240. data/lib/hecks/projections/site/cms_editor/destructive.rb +61 -0
  241. data/lib/hecks/projections/site/cms_editor/drafts.rb +102 -0
  242. data/lib/hecks/projections/site/cms_editor/hints.rb +74 -0
  243. data/lib/hecks/projections/site/cms_editor/icons.rb +86 -0
  244. data/lib/hecks/projections/site/cms_editor/key_kinds.rb +31 -0
  245. data/lib/hecks/projections/site/cms_editor/limits.rb +72 -0
  246. data/lib/hecks/projections/site/cms_editor/media.rb +1 -1
  247. data/lib/hecks/projections/site/cms_editor/moment.rb +34 -0
  248. data/lib/hecks/projections/site/cms_editor/palette.rb +115 -0
  249. data/lib/hecks/projections/site/cms_editor/pickers.rb +85 -0
  250. data/lib/hecks/projections/site/cms_editor/preview.rb +91 -0
  251. data/lib/hecks/projections/site/cms_editor/relations.rb +92 -0
  252. data/lib/hecks/projections/site/cms_editor/scale_checks.rb +66 -0
  253. data/lib/hecks/projections/site/cms_editor/scheduling.rb +150 -0
  254. data/lib/hecks/projections/site/cms_editor/schema.rb +96 -19
  255. data/lib/hecks/projections/site/cms_editor/setting.rb +52 -9
  256. data/lib/hecks/projections/site/cms_editor/targets.rb +86 -0
  257. data/lib/hecks/projections/site/cms_editor/templates/package.json.tmpl +18 -1
  258. data/lib/hecks/projections/site/cms_editor/templates/src/app.ts.tmpl +251 -57
  259. data/lib/hecks/projections/site/cms_editor/templates/src/assets.ts.tmpl +98 -0
  260. data/lib/hecks/projections/site/cms_editor/templates/src/auth/membership.ts.tmpl +32 -24
  261. data/lib/hecks/projections/site/cms_editor/templates/src/browser/app.css.tmpl +412 -0
  262. data/lib/hecks/projections/site/cms_editor/templates/src/browser/autosave.js.tmpl +144 -0
  263. data/lib/hecks/projections/site/cms_editor/templates/src/browser/blocks.js.tmpl +500 -0
  264. data/lib/hecks/projections/site/cms_editor/templates/src/browser/body_doc.js.tmpl +175 -0
  265. data/lib/hecks/projections/site/cms_editor/templates/src/browser/body_editor.js.tmpl +418 -0
  266. data/lib/hecks/projections/site/cms_editor/templates/src/browser/epoch.js.tmpl +61 -0
  267. data/lib/hecks/projections/site/cms_editor/templates/src/browser/forms.js.tmpl +210 -0
  268. data/lib/hecks/projections/site/cms_editor/templates/src/browser/lists.js.tmpl +40 -0
  269. data/lib/hecks/projections/site/cms_editor/templates/src/browser/main.js.tmpl +26 -0
  270. data/lib/hecks/projections/site/cms_editor/templates/src/browser/media_picker.js.tmpl +232 -0
  271. data/lib/hecks/projections/site/cms_editor/templates/src/browser/moments.js.tmpl +73 -0
  272. data/lib/hecks/projections/site/cms_editor/templates/src/browser/pickers.js.tmpl +152 -0
  273. data/lib/hecks/projections/site/cms_editor/templates/src/browser/preview.js.tmpl +98 -0
  274. data/lib/hecks/projections/site/cms_editor/templates/src/browser/shell.js.tmpl +140 -0
  275. data/lib/hecks/projections/site/cms_editor/templates/src/browser/toast.js.tmpl +66 -0
  276. data/lib/hecks/projections/site/cms_editor/templates/src/choices.ts.tmpl +99 -0
  277. data/lib/hecks/projections/site/cms_editor/templates/src/commands.ts.tmpl +78 -24
  278. data/lib/hecks/projections/site/cms_editor/templates/src/config.ts.tmpl +6 -0
  279. data/lib/hecks/projections/site/cms_editor/templates/src/flash.ts.tmpl +52 -0
  280. data/lib/hecks/projections/site/cms_editor/templates/src/host.ts.tmpl +19 -2
  281. data/lib/hecks/projections/site/cms_editor/templates/src/media/handler.ts.tmpl +31 -8
  282. data/lib/hecks/projections/site/cms_editor/templates/src/names.ts.tmpl +36 -0
  283. data/lib/hecks/projections/site/cms_editor/templates/src/schema.ts.tmpl +131 -2
  284. data/lib/hecks/projections/site/cms_editor/templates/src/ui/availability.ts.tmpl +15 -0
  285. data/lib/hecks/projections/site/cms_editor/templates/src/ui/block_list.js.tmpl +213 -0
  286. data/lib/hecks/projections/site/cms_editor/templates/src/ui/blocks.ts.tmpl +275 -0
  287. data/lib/hecks/projections/site/cms_editor/templates/src/ui/body_model.js.tmpl +8 -5
  288. data/lib/hecks/projections/site/cms_editor/templates/src/ui/detail.ts.tmpl +88 -0
  289. data/lib/hecks/projections/site/cms_editor/templates/src/ui/dialogs.ts.tmpl +43 -0
  290. data/lib/hecks/projections/site/cms_editor/templates/src/ui/fields.ts.tmpl +229 -34
  291. data/lib/hecks/projections/site/cms_editor/templates/src/ui/html.ts.tmpl +40 -81
  292. data/lib/hecks/projections/site/cms_editor/templates/src/ui/icons.ts.tmpl +15 -0
  293. data/lib/hecks/projections/site/cms_editor/templates/src/ui/input.ts.tmpl +29 -12
  294. data/lib/hecks/projections/site/cms_editor/templates/src/ui/links.ts.tmpl +100 -0
  295. data/lib/hecks/projections/site/cms_editor/templates/src/ui/moments.ts.tmpl +44 -0
  296. data/lib/hecks/projections/site/cms_editor/templates/src/ui/outline.ts.tmpl +53 -17
  297. data/lib/hecks/projections/site/cms_editor/templates/src/ui/pages.ts.tmpl +178 -88
  298. data/lib/hecks/projections/site/cms_editor/templates/src/ui/paging.ts.tmpl +82 -0
  299. data/lib/hecks/projections/site/cms_editor/templates/src/ui/pickers.ts.tmpl +110 -0
  300. data/lib/hecks/projections/site/cms_editor/templates/src/ui/preview.ts.tmpl +87 -0
  301. data/lib/hecks/projections/site/cms_editor/templates/src/ui/related.ts.tmpl +97 -0
  302. data/lib/hecks/projections/site/cms_editor/templates/src/ui/schedule.ts.tmpl +160 -0
  303. data/lib/hecks/projections/site/cms_editor/templates/src/ui/shell.ts.tmpl +211 -0
  304. data/lib/hecks/projections/site/cms_editor/templates/src/ui/table.ts.tmpl +151 -0
  305. data/lib/hecks/projections/site/cms_editor/templates/src/ui/theme.js.tmpl +16 -0
  306. data/lib/hecks/projections/site/cms_editor/templates/src/ui/values.ts.tmpl +69 -0
  307. data/lib/hecks/projections/site/cms_editor/templates/src/ui/words.ts.tmpl +97 -0
  308. data/lib/hecks/projections/site/cms_editor/templates/src/ui/world.ts.tmpl +35 -0
  309. data/lib/hecks/projections/site/cms_editor/templates/tsconfig.json.tmpl +2 -1
  310. data/lib/hecks/projections/site/cms_editor/theme.rb +29 -0
  311. data/lib/hecks/projections/site/cms_editor/theme_checks.rb +57 -0
  312. data/lib/hecks/projections/site/cms_editor.rb +49 -23
  313. data/lib/hecks/projections/site/role_probe.rb +2 -0
  314. data/lib/hecks/projections/site/site_root/workflow.rb +5 -0
  315. data/lib/hecks/projector/cli_audience.rb +22 -1
  316. data/lib/hecks/projector/cli_projector/listing.rb +1 -1
  317. data/lib/hecks/projector/cli_projector/option_specs.rb +1 -1
  318. data/lib/hecks/projector/cli_projector/usage.rb +15 -4
  319. data/lib/hecks/projector/docs_projector/closing.rb +1 -1
  320. data/lib/hecks/projector/docs_projector.rb +1 -1
  321. data/lib/hecks/projector/exporter/bindings.rb +40 -10
  322. data/lib/hecks/projector/exporter/capability_values.rb +55 -0
  323. data/lib/hecks/projector/narrate_projector/reactions.rb +1 -1
  324. data/lib/hecks/projector/target.rb +11 -0
  325. data/lib/hecks/projector.rb +32 -5
  326. data/lib/hecks/quality_control/adapters/github_checks.rb +12 -8
  327. data/lib/hecks/quality_control/adapters/github_issues.rb +8 -4
  328. data/lib/hecks/quality_control/cli/qa_open_pr.rb +2 -2
  329. data/lib/hecks/quality_control/cli/qa_sweep/checks/shrinking.rb +1 -1
  330. data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +1 -1
  331. data/lib/hecks/quality_control/cli/qa_sweep.rb +1 -1
  332. data/lib/hecks/quality_control/quality_control.bluebook +6 -2
  333. data/lib/hecks/release/approval.rb +64 -0
  334. data/lib/hecks/router/{door.rb → aggregate_reader.rb} +5 -4
  335. data/lib/hecks/router/namespace_installer.rb +16 -16
  336. data/lib/hecks/router.rb +1 -1
  337. data/lib/hecks/runtime/best_effort.rb +22 -0
  338. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +12 -2
  339. data/lib/hecks/runtime/command_interpreter.rb +3 -2
  340. data/lib/hecks/runtime/command_rules/emission.rb +1 -1
  341. data/lib/hecks/runtime/dispatcher.rb +4 -4
  342. data/lib/hecks/runtime/entity_element/location.rb +1 -1
  343. data/lib/hecks/runtime/event.rb +5 -0
  344. data/lib/hecks/runtime/identity.rb +7 -6
  345. data/lib/hecks/runtime/interpreting.rb +2 -1
  346. data/lib/hecks/runtime/invocation_builder.rb +1 -1
  347. data/lib/hecks/runtime/loader/boot_steps.rb +8 -5
  348. data/lib/hecks/runtime/loader.rb +10 -10
  349. data/lib/hecks/runtime/policy_interpreter/arguments.rb +7 -4
  350. data/lib/hecks/runtime/policy_interpreter/fan_out.rb +3 -3
  351. data/lib/hecks/runtime/policy_interpreter.rb +6 -6
  352. data/lib/hecks/runtime/port_operation_interpreter.rb +1 -1
  353. data/lib/hecks/runtime/reaction_invocation.rb +1 -1
  354. data/lib/hecks/runtime/rebuild_sweep.rb +11 -1
  355. data/lib/hecks/runtime/registry/ask_verification.rb +35 -0
  356. data/lib/hecks/runtime/registry/hecksagon_rules.rb +10 -0
  357. data/lib/hecks/runtime/registry/merging.rb +1 -1
  358. data/lib/hecks/runtime/registry/providers.rb +16 -0
  359. data/lib/hecks/runtime/registry/read_repository.rb +6 -4
  360. data/lib/hecks/runtime/registry/verification.rb +4 -1
  361. data/lib/hecks/runtime/registry/world_defaults.rb +29 -0
  362. data/lib/hecks/runtime/registry.rb +1 -1
  363. data/lib/hecks/runtime/saga_interpreter/compensation.rb +1 -1
  364. data/lib/hecks/runtime/saga_interpreter/delivery.rb +4 -4
  365. data/lib/hecks/runtime/saga_interpreter/transitions.rb +1 -1
  366. data/lib/hecks/runtime/saga_interpreter.rb +3 -3
  367. data/lib/hecks/runtime/tenant_check.rb +5 -4
  368. data/lib/hecks/runtime/value/coercion.rb +2 -2
  369. data/lib/hecks/runtime/value/validation.rb +16 -4
  370. data/lib/hecks/runtime.rb +9 -9
  371. data/lib/hecks/rust_build/host.rb +11 -4
  372. data/lib/hecks/rust_build/prebuilt_binary.rb +101 -0
  373. data/lib/hecks/rust_build/project_rust/target_ir.rb +1 -1
  374. data/lib/hecks/rust_build/wasm.rb +1 -1
  375. data/lib/hecks/rust_build/wasm_browser.rb +1 -1
  376. data/lib/hecks/rust_build.rb +11 -0
  377. data/lib/hecks/served_options.rb +53 -0
  378. data/lib/hecks/site/bluebook/site.bluebook +1 -0
  379. data/lib/hecks/storehouse/audit.rb +1 -1
  380. data/lib/hecks/storehouse/dispatching.rb +8 -6
  381. data/lib/hecks/storehouse/introspection.rb +2 -2
  382. data/lib/hecks/storehouse/querying.rb +6 -4
  383. data/lib/hecks/storehouse.rb +4 -4
  384. data/lib/hecks/tools/ci_gate_decision.rb +35 -0
  385. data/lib/hecks/tools/ci_gates.rb +20 -1
  386. data/lib/hecks/tools/comment_style/source_file.rb +4 -1
  387. data/lib/hecks/tools/deploy_recipe_lint/fixtures.rb +4 -1
  388. data/lib/hecks/tools/lanes/files.rb +8 -0
  389. data/lib/hecks/tools/lanes/prebuilt_workflow.rb +81 -0
  390. data/lib/hecks/tools/lanes/rows.rb +6 -0
  391. data/lib/hecks/tools/lanes.rb +1 -0
  392. data/lib/hecks/tools/oidc_manifests.rb +4 -5
  393. data/lib/hecks/tools/regeneration_run.rb +11 -4
  394. data/lib/hecks/tools/release_only.rb +111 -0
  395. data/lib/hecks/tools/site_routes/editor_files.rb +12 -5
  396. data/lib/hecks/tools/tenant_provisioning.rb +2 -2
  397. data/lib/hecks/tools/tools_doc.rb +4 -4
  398. data/lib/hecks/version.rb +1 -1
  399. data/lib/hecks/vocabulary.rb +19 -5
  400. data/lib/hecks.rb +15 -15
  401. data/lib/rubocop/cop/hecks/env_dump.rb +69 -0
  402. data/lib/rubocop/cop/hecks/monotonic_duration.rb +53 -0
  403. data/lib/rubocop/cop/hecks/no_wall_clock_in_runtime.rb +34 -0
  404. data/lib/rubocop/cop/hecks/raw_shell_interpolation.rb +79 -0
  405. data/lib/rubocop/cop/hecks/sleep_in_spec.rb +34 -0
  406. data/lib/rubocop/cop/hecks/swallowed_rescue.rb +37 -0
  407. data/lib/rubocop/cop/hecks/symbol_string_key_mix.rb +50 -0
  408. data/lib/rubocop/cop/hecks/untyped_raise.rb +37 -0
  409. data/prebuilt/9ee54e2f0d4d6d3fe046827779b221e02de665fba911a048ae5dd8b8fbfb7d90.marshal +0 -0
  410. data/prebuilt/d74a00e996222c1d8b676d5959092effc46b4dc59e0555f3bf9554ac58e3094a.marshal +0 -0
  411. data/prebuilt/verdicts-df19f35868d3284a70f55e42dcef87ef4e65e6a678e5135f72e1f6cff4c1357b.json +1 -0
  412. data/rust/.gitignore +6 -0
  413. data/rust/Cargo.toml +6 -0
  414. data/rust/build/src/binding_pass.rs +103 -0
  415. data/rust/build/src/cargo_sync.rs +6 -0
  416. data/rust/build/src/lineage_pass.rs +3 -3
  417. data/rust/build/src/main.rs +17 -5
  418. data/rust/build/src/pipeline.rs +48 -5
  419. data/rust/build/src/seams_pass.rs +123 -0
  420. data/rust/build/src/translation_pass.rs +167 -0
  421. data/rust/codegen/src/asks.rs +103 -0
  422. data/rust/codegen/src/commands.rs +13 -8
  423. data/rust/codegen/src/constraints.rs +25 -0
  424. data/rust/codegen/src/domain_generator.rs +2 -0
  425. data/rust/codegen/src/expr_emitter.rs +13 -0
  426. data/rust/codegen/src/json_codec.rs +54 -15
  427. data/rust/codegen/src/main.rs +1 -0
  428. data/rust/codegen/src/mutations.rs +128 -3
  429. data/rust/codegen/src/queries.rs +11 -2
  430. data/rust/codegen/src/reactions.rs +1 -1
  431. data/rust/codegen/src/types.rs +166 -8
  432. data/rust/host/HECKS_RELEASE +1 -1
  433. data/rust/host/src/api.rs +4 -4
  434. data/rust/host/src/bin/validate_harness.rs +43 -0
  435. data/rust/host/src/boundary_fuzz/expr_json.rs +2 -2
  436. data/rust/host/src/boundary_fuzz/ir.rs +1 -0
  437. data/rust/host/src/boundary_fuzz/server.rs +1 -1
  438. data/rust/host/src/checkout.rs +35 -19
  439. data/rust/host/src/commerce_ir.rs +408 -2
  440. data/rust/host/src/expr_json.rs +118 -0
  441. data/rust/host/src/extension.rs +13 -1
  442. data/rust/host/src/lib.rs +1 -0
  443. data/rust/host/src/mint.rs +1 -1
  444. data/rust/host/src/payments/tests.rs +27 -1
  445. data/rust/host/src/payments.rs +12 -4
  446. data/rust/host/src/platform_signin/attack_tests.rs +1100 -0
  447. data/rust/host/src/platform_signin/config.rs +512 -0
  448. data/rust/host/src/platform_signin/cookie.rs +237 -0
  449. data/rust/host/src/platform_signin/extension.rs +190 -0
  450. data/rust/host/src/platform_signin/fetcher.rs +322 -0
  451. data/rust/host/src/platform_signin/handler.rs +251 -0
  452. data/rust/host/src/platform_signin/handler_tests.rs +554 -0
  453. data/rust/host/src/platform_signin/jti.rs +196 -0
  454. data/rust/host/src/platform_signin/jwks.rs +542 -0
  455. data/rust/host/src/platform_signin/jws.rs +249 -0
  456. data/rust/host/src/platform_signin/known_answer_tests.rs +237 -0
  457. data/rust/host/src/platform_signin/mapping_tests.rs +254 -0
  458. data/rust/host/src/platform_signin/mod.rs +75 -0
  459. data/rust/host/src/platform_signin/mode_tests.rs +382 -0
  460. data/rust/host/src/platform_signin/pages.rs +204 -0
  461. data/rust/host/src/platform_signin/query.rs +233 -0
  462. data/rust/host/src/platform_signin/session.rs +151 -0
  463. data/rust/host/src/platform_signin/settings.rs +385 -0
  464. data/rust/host/src/platform_signin/strict_json.rs +351 -0
  465. data/rust/host/src/platform_signin/test_support.rs +235 -0
  466. data/rust/host/src/platform_signin/ttl_tests.rs +94 -0
  467. data/rust/host/src/platform_signin/verify.rs +604 -0
  468. data/rust/host/src/platform_signin/wiring_support.rs +319 -0
  469. data/rust/host/src/query_step.rs +22 -4
  470. data/rust/host/src/reference_validate.rs +653 -108
  471. data/rust/host/src/resend.rs +2 -0
  472. data/rust/host/src/server.rs +19 -6
  473. data/rust/host/src/ui_schema.rs +132 -5
  474. data/rust/host/src/web/newsletter.rs +7 -8
  475. data/rust/host/src/web/newsletter_send.rs +38 -13
  476. data/rust/host/src/web/registrations.rs +229 -26
  477. data/rust/host/src/web.rs +53 -9
  478. data/rust/parser/src/emit.rs +38 -6
  479. data/rust/parser/src/expr/ast_json.rs +7 -1
  480. data/rust/parser/src/expr/resolver.rs +171 -6
  481. data/rust/parser/src/ir.rs +7 -0
  482. data/rust/parser/src/keywords.rs +24 -0
  483. data/rust/parser/src/main.rs +3 -0
  484. data/rust/parser/src/parse/aggregate.rs +2 -1
  485. data/rust/parser/src/parse/chapter.rs +2 -2
  486. data/rust/parser/src/parse/command.rs +2 -0
  487. data/rust/parser/src/parse/hecksagon.rs +5 -2
  488. data/rust/parser/src/parse/lifecycle.rs +81 -0
  489. data/rust/parser/src/parse/mod.rs +15 -1
  490. data/rust/parser/src/parse/policy.rs +13 -2
  491. data/rust/parser/src/parse/value_object.rs +34 -17
  492. data/rust/parser/src/ruby_value.rs +1 -1
  493. data/rust/src/exemplar/commands.rs +4 -4
  494. data/rust/src/exemplar/constraints.rs +1 -1
  495. data/rust/src/exemplar/json.rs +43 -1
  496. data/rust/src/kernel/cli.rs +7 -5
  497. data/rust/src/kernel/dispatch.rs +2 -2
  498. data/rust/src/kernel/dispatch_guard_tests.rs +1 -1
  499. data/rust/src/kernel/expr.rs +66 -3
  500. data/rust/src/kernel/expression_operators/arithmetic.rs +130 -5
  501. data/rust/src/kernel/expression_operators/text.rs +26 -2
  502. data/rust/src/kernel/json.rs +15 -0
  503. data/rust/src/kernel/mod.rs +1 -1
  504. data/rust/src/kernel/orchestrate.rs +54 -5
  505. data/rust/src/kernel/orchestrate_guard_tests.rs +67 -0
  506. data/rust/src/kernel/pattern.rs +60 -0
  507. data/rust/src/kernel/reference_lookup.rs +90 -7
  508. metadata +178 -38
  509. data/lib/hecks/doors/cli_door/nesting.rb +0 -34
  510. data/lib/hecks/doors/cli_door/shorthand.rb +0 -85
  511. data/lib/hecks/doors/cli_door.rb +0 -124
  512. data/lib/hecks/doors/cli_runner/answers.rb +0 -138
  513. data/lib/hecks/doors/cli_runner/resolution.rb +0 -146
  514. data/lib/hecks/doors/cli_runner/settling.rb +0 -115
  515. data/lib/hecks/doors/cli_runner/streaming.rb +0 -90
  516. data/lib/hecks/doors/cli_runner/suggestions.rb +0 -43
  517. data/lib/hecks/doors/cli_runner.rb +0 -66
  518. data/lib/hecks/doors/command_request.rb +0 -119
  519. data/lib/hecks/doors/handle.rb +0 -208
  520. data/lib/hecks/doors/json_door.rb +0 -132
  521. data/lib/hecks/doors/launcher_options.rb +0 -247
  522. data/lib/hecks/doors/mcp_door/properties.rb +0 -47
  523. data/lib/hecks/doors/mcp_door/tool_calls.rb +0 -113
  524. data/lib/hecks/doors/mcp_door/tool_definitions/auditing.rb +0 -51
  525. data/lib/hecks/doors/mcp_door/tool_definitions/calling.rb +0 -69
  526. data/lib/hecks/doors/mcp_door/tool_definitions/reading.rb +0 -97
  527. data/lib/hecks/doors/mcp_door/tool_definitions.rb +0 -15
  528. data/lib/hecks/doors/mcp_door.rb +0 -156
  529. data/lib/hecks/doors/mcp_door_scope/argument_policy.rb +0 -92
  530. data/lib/hecks/doors/mcp_door_scope/env_problems.rb +0 -55
  531. data/lib/hecks/doors/mcp_door_scope/presenter.rb +0 -78
  532. data/lib/hecks/doors/mcp_door_scope.rb +0 -201
  533. data/lib/hecks/doors/mcp_guide_cache.rb +0 -75
  534. data/lib/hecks/doors/ruby_door/aggregate_door.rb +0 -162
  535. data/lib/hecks/doors/ruby_door/chapter.rb +0 -89
  536. data/lib/hecks/doors/ruby_door.rb +0 -80
  537. data/lib/hecks/doors/usage_cache.rb +0 -139
  538. data/lib/hecks/projections/site/cms_editor/templates/src/ui/body_widget.js.tmpl +0 -282
  539. data/lib/hecks/projections/site/cms_editor/templates/src/ui/media_picker.js.tmpl +0 -109
  540. data/prebuilt/c28d6d9db14eea3e17161e9d9c262efee30b256cf97693a7cfd552bce24b2f7f.marshal +0 -0
  541. data/prebuilt/cb375cba61ca0dbe8ddb9739c306510fe05e5f4b7a9b6955caff8224c63ea0e0.marshal +0 -0
  542. data/prebuilt/verdicts-d6d584ad43b5f3cebf88aafbbdbf024c38574acf18e06adffbc555f7786b1c2f.json +0 -1
@@ -1902,6 +1902,378 @@
1902
1902
  "value": ".unset?"
1903
1903
  }
1904
1904
  }
1905
+ },
1906
+ {
1907
+ "verb": "Expression::Operator.Propose",
1908
+ "args": {
1909
+ "symbol": {
1910
+ "value": ".strip"
1911
+ },
1912
+ "category": {
1913
+ "value": "text"
1914
+ },
1915
+ "precedence": {
1916
+ "value": 7
1917
+ },
1918
+ "arity": {
1919
+ "value": 1
1920
+ },
1921
+ "grammar": {
1922
+ "value": "inner"
1923
+ },
1924
+ "strategy": {
1925
+ "value": "suffix_match"
1926
+ },
1927
+ "position": {
1928
+ "value": 23
1929
+ }
1930
+ }
1931
+ },
1932
+ {
1933
+ "verb": "Expression::Operator.Render",
1934
+ "args": {
1935
+ "symbol": {
1936
+ "value": ".strip"
1937
+ },
1938
+ "target": {
1939
+ "value": "ruby"
1940
+ },
1941
+ "form": {
1942
+ "value": "a.strip"
1943
+ }
1944
+ }
1945
+ },
1946
+ {
1947
+ "verb": "Expression::Operator.Render",
1948
+ "args": {
1949
+ "symbol": {
1950
+ "value": ".strip"
1951
+ },
1952
+ "target": {
1953
+ "value": "rust"
1954
+ },
1955
+ "form": {
1956
+ "value": "a.strip -> a without leading and trailing whitespace"
1957
+ }
1958
+ }
1959
+ },
1960
+ {
1961
+ "verb": "Expression::Operator.Admit",
1962
+ "args": {
1963
+ "symbol": {
1964
+ "value": ".strip"
1965
+ }
1966
+ }
1967
+ },
1968
+ {
1969
+ "verb": "Expression::Operator.Propose",
1970
+ "args": {
1971
+ "symbol": {
1972
+ "value": ".lstrip"
1973
+ },
1974
+ "category": {
1975
+ "value": "text"
1976
+ },
1977
+ "precedence": {
1978
+ "value": 7
1979
+ },
1980
+ "arity": {
1981
+ "value": 1
1982
+ },
1983
+ "grammar": {
1984
+ "value": "inner"
1985
+ },
1986
+ "strategy": {
1987
+ "value": "suffix_match"
1988
+ },
1989
+ "position": {
1990
+ "value": 24
1991
+ }
1992
+ }
1993
+ },
1994
+ {
1995
+ "verb": "Expression::Operator.Render",
1996
+ "args": {
1997
+ "symbol": {
1998
+ "value": ".lstrip"
1999
+ },
2000
+ "target": {
2001
+ "value": "ruby"
2002
+ },
2003
+ "form": {
2004
+ "value": "a.lstrip"
2005
+ }
2006
+ }
2007
+ },
2008
+ {
2009
+ "verb": "Expression::Operator.Render",
2010
+ "args": {
2011
+ "symbol": {
2012
+ "value": ".lstrip"
2013
+ },
2014
+ "target": {
2015
+ "value": "rust"
2016
+ },
2017
+ "form": {
2018
+ "value": "a.lstrip -> a without leading whitespace"
2019
+ }
2020
+ }
2021
+ },
2022
+ {
2023
+ "verb": "Expression::Operator.Admit",
2024
+ "args": {
2025
+ "symbol": {
2026
+ "value": ".lstrip"
2027
+ }
2028
+ }
2029
+ },
2030
+ {
2031
+ "verb": "Expression::Operator.Propose",
2032
+ "args": {
2033
+ "symbol": {
2034
+ "value": ".rstrip"
2035
+ },
2036
+ "category": {
2037
+ "value": "text"
2038
+ },
2039
+ "precedence": {
2040
+ "value": 7
2041
+ },
2042
+ "arity": {
2043
+ "value": 1
2044
+ },
2045
+ "grammar": {
2046
+ "value": "inner"
2047
+ },
2048
+ "strategy": {
2049
+ "value": "suffix_match"
2050
+ },
2051
+ "position": {
2052
+ "value": 25
2053
+ }
2054
+ }
2055
+ },
2056
+ {
2057
+ "verb": "Expression::Operator.Render",
2058
+ "args": {
2059
+ "symbol": {
2060
+ "value": ".rstrip"
2061
+ },
2062
+ "target": {
2063
+ "value": "ruby"
2064
+ },
2065
+ "form": {
2066
+ "value": "a.rstrip"
2067
+ }
2068
+ }
2069
+ },
2070
+ {
2071
+ "verb": "Expression::Operator.Render",
2072
+ "args": {
2073
+ "symbol": {
2074
+ "value": ".rstrip"
2075
+ },
2076
+ "target": {
2077
+ "value": "rust"
2078
+ },
2079
+ "form": {
2080
+ "value": "a.rstrip -> a without trailing whitespace"
2081
+ }
2082
+ }
2083
+ },
2084
+ {
2085
+ "verb": "Expression::Operator.Admit",
2086
+ "args": {
2087
+ "symbol": {
2088
+ "value": ".rstrip"
2089
+ }
2090
+ }
2091
+ },
2092
+ {
2093
+ "verb": "Expression::Operator.Propose",
2094
+ "args": {
2095
+ "symbol": {
2096
+ "value": "-"
2097
+ },
2098
+ "category": {
2099
+ "value": "arithmetic"
2100
+ },
2101
+ "precedence": {
2102
+ "value": 6
2103
+ },
2104
+ "arity": {
2105
+ "value": 2
2106
+ },
2107
+ "grammar": {
2108
+ "value": "inner"
2109
+ },
2110
+ "strategy": {
2111
+ "value": "top_level_split"
2112
+ },
2113
+ "position": {
2114
+ "value": 26
2115
+ }
2116
+ }
2117
+ },
2118
+ {
2119
+ "verb": "Expression::Operator.Render",
2120
+ "args": {
2121
+ "symbol": {
2122
+ "value": "-"
2123
+ },
2124
+ "target": {
2125
+ "value": "ruby"
2126
+ },
2127
+ "form": {
2128
+ "value": "a - b"
2129
+ }
2130
+ }
2131
+ },
2132
+ {
2133
+ "verb": "Expression::Operator.Render",
2134
+ "args": {
2135
+ "symbol": {
2136
+ "value": "-"
2137
+ },
2138
+ "target": {
2139
+ "value": "rust"
2140
+ },
2141
+ "form": {
2142
+ "value": "a - b -> checked i64 arithmetic, refusing on overflow"
2143
+ }
2144
+ }
2145
+ },
2146
+ {
2147
+ "verb": "Expression::Operator.Admit",
2148
+ "args": {
2149
+ "symbol": {
2150
+ "value": "-"
2151
+ }
2152
+ }
2153
+ },
2154
+ {
2155
+ "verb": "Expression::Operator.Propose",
2156
+ "args": {
2157
+ "symbol": {
2158
+ "value": "*"
2159
+ },
2160
+ "category": {
2161
+ "value": "arithmetic"
2162
+ },
2163
+ "precedence": {
2164
+ "value": 7
2165
+ },
2166
+ "arity": {
2167
+ "value": 2
2168
+ },
2169
+ "grammar": {
2170
+ "value": "inner"
2171
+ },
2172
+ "strategy": {
2173
+ "value": "top_level_split"
2174
+ },
2175
+ "position": {
2176
+ "value": 27
2177
+ }
2178
+ }
2179
+ },
2180
+ {
2181
+ "verb": "Expression::Operator.Render",
2182
+ "args": {
2183
+ "symbol": {
2184
+ "value": "*"
2185
+ },
2186
+ "target": {
2187
+ "value": "ruby"
2188
+ },
2189
+ "form": {
2190
+ "value": "a * b"
2191
+ }
2192
+ }
2193
+ },
2194
+ {
2195
+ "verb": "Expression::Operator.Render",
2196
+ "args": {
2197
+ "symbol": {
2198
+ "value": "*"
2199
+ },
2200
+ "target": {
2201
+ "value": "rust"
2202
+ },
2203
+ "form": {
2204
+ "value": "a * b -> checked i64 arithmetic, refusing on overflow"
2205
+ }
2206
+ }
2207
+ },
2208
+ {
2209
+ "verb": "Expression::Operator.Admit",
2210
+ "args": {
2211
+ "symbol": {
2212
+ "value": "*"
2213
+ }
2214
+ }
2215
+ },
2216
+ {
2217
+ "verb": "Expression::Operator.Propose",
2218
+ "args": {
2219
+ "symbol": {
2220
+ "value": "/"
2221
+ },
2222
+ "category": {
2223
+ "value": "arithmetic"
2224
+ },
2225
+ "precedence": {
2226
+ "value": 7
2227
+ },
2228
+ "arity": {
2229
+ "value": 2
2230
+ },
2231
+ "grammar": {
2232
+ "value": "inner"
2233
+ },
2234
+ "strategy": {
2235
+ "value": "top_level_split"
2236
+ },
2237
+ "position": {
2238
+ "value": 28
2239
+ }
2240
+ }
2241
+ },
2242
+ {
2243
+ "verb": "Expression::Operator.Render",
2244
+ "args": {
2245
+ "symbol": {
2246
+ "value": "/"
2247
+ },
2248
+ "target": {
2249
+ "value": "ruby"
2250
+ },
2251
+ "form": {
2252
+ "value": "a / b"
2253
+ }
2254
+ }
2255
+ },
2256
+ {
2257
+ "verb": "Expression::Operator.Render",
2258
+ "args": {
2259
+ "symbol": {
2260
+ "value": "/"
2261
+ },
2262
+ "target": {
2263
+ "value": "rust"
2264
+ },
2265
+ "form": {
2266
+ "value": "a / b -> floor division on integers, refusing a zero divisor and overflow"
2267
+ }
2268
+ }
2269
+ },
2270
+ {
2271
+ "verb": "Expression::Operator.Admit",
2272
+ "args": {
2273
+ "symbol": {
2274
+ "value": "/"
2275
+ }
2276
+ }
1905
2277
  }
1906
2278
  ]
1907
2279
  }
@@ -96,7 +96,9 @@ module Hecks
96
96
  [[evaluator::Or, "||", %i[left right]], [evaluator::And, "&&", %i[left right]],
97
97
  [evaluator::Not, "!", %i[node]], [evaluator::Compare, ->(node) { node.operator.symbol }, %i[left right]],
98
98
  [evaluator::Include, ".include?", %i[haystack needle]], [evaluator::Resolve, nil, %i[expr]],
99
- [resolver::Addition, "+", %i[left right]], [resolver::Modulo, ".modulo", %i[receiver divisor]]]
99
+ [resolver::Addition, "+", %i[left right]], [resolver::Subtraction, "-", %i[left right]],
100
+ [resolver::Multiplication, "*", %i[left right]], [resolver::Division, "/", %i[left right]],
101
+ [resolver::Modulo, ".modulo", %i[receiver divisor]]]
100
102
  end
101
103
 
102
104
  # @return [Array<String>] operators found in the members of a Struct node; none for any
@@ -11,12 +11,12 @@ module Hecks
11
11
  module Adapters
12
12
  module Codebase
13
13
  # What Codebase's `CorpusRun` asks of the working tree: which committed domains have a Rust
14
- # feature, what the language's IR holds, and the two doors that serve it.
14
+ # feature, what the language's IR holds, and the two servers that serve it.
15
15
  #
16
16
  # The questions are pure reads and run in this process, with the code `hecks rust_domains` and
17
17
  # `hecks ir_constructs` run (`Hecks::Corpus`, `Hecks::QueryIR`); the coverage question runs
18
18
  # `Hecks::RustBuild`'s coverage tool over each generated module, also in this process. The
19
- # two doors run until they are closed: the query MCP server on stdio, and the forms app on a
19
+ # two servers run until they are closed: the query MCP server on stdio, and the forms app on a
20
20
  # local port.
21
21
  module CorpusTasks
22
22
  # Every operation this family carries out.
@@ -26,7 +26,7 @@ module Hecks
26
26
  DEFAULT_PORT = 4567
27
27
 
28
28
  class << self
29
- # @return [#call, nil] serves the MCP door; `Hecks::QueryIrMcp.start` when nil. A spec
29
+ # @return [#call, nil] serves the MCP server; `Hecks::QueryIrMcp.start` when nil. A spec
30
30
  # replaces it so no stdio has to be held.
31
31
  attr_accessor :mcp_server
32
32
 
@@ -41,14 +41,14 @@ module Hecks
41
41
 
42
42
  module_function
43
43
 
44
- # Opens one of the doors.
44
+ # Opens one of the servers.
45
45
  #
46
46
  # @param operation [String] `serve_query_ir_mcp` or `present`
47
47
  # @param held [Hash] the `CorpusRun` record's fields: `port`
48
48
  # @param tree [Tree] the working tree, already known to be a hecks checkout
49
49
  # @param shell [#capture, nil] unused
50
- # @return [String] a note that the door closed
51
- # @raise [ConsoleCapture::Failure] when the MCP door refuses the process's setup
50
+ # @return [String] a note that the server closed
51
+ # @raise [ConsoleCapture::Failure] when the MCP server refuses the process's setup
52
52
  def call(operation, held, tree, shell: nil)
53
53
  _ = shell
54
54
  return serve_mcp if operation == "serve_query_ir_mcp"
@@ -78,14 +78,14 @@ module Hecks
78
78
  # @return [Hash] the same fields as plain values
79
79
  def plain(held) = held.transform_values { |value| value.is_a?(Hash) ? value[:value] : value }
80
80
 
81
- # @return [String] a note that the MCP door closed
82
- # @raise [ConsoleCapture::Failure] when the door refuses to start
81
+ # @return [String] a note that the MCP server closed
82
+ # @raise [ConsoleCapture::Failure] when the server refuses to start
83
83
  def serve_mcp
84
84
  server = CorpusTasks.mcp_server || ->(**options) { QueryIrMcp.start(**options) }
85
85
  server.call(argv: [])
86
- "query ir mcp door closed"
86
+ "query ir mcp server closed"
87
87
  rescue SystemExit => e
88
- raise ConsoleCapture::Failure, "the query ir mcp door refused to start (status #{e.status}); see stderr"
88
+ raise ConsoleCapture::Failure, "the query ir mcp server refused to start (status #{e.status}); see stderr"
89
89
  end
90
90
 
91
91
  # @param port [Integer] the port to listen on
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Runs rubycritic with its git root taken from git.
4
+ #
5
+ # rubycritic finds the repository root by walking up to the first `.git` directory. A linked
6
+ # worktree has a `.git` file instead, so inside one nested in its main checkout the walk passes the
7
+ # worktree and stops at the main checkout's directory. Churn is then read from the wrong tree and
8
+ # comes back 0 for every file. Asking git for the top level answers right in either layout.
9
+ #
10
+ # Started as a program by `Inspection`: `ruby rubycritic.rb <rubycritic arguments>`. Required, it
11
+ # installs the churn fix and runs nothing, so it loads standalone like every other lib file.
12
+ require "rubycritic/cli/application"
13
+
14
+ module Hecks
15
+ module Adapters
16
+ module Codebase
17
+ module Inspection
18
+ # Gives rubycritic's churn the root git reports for the directory it runs in.
19
+ module GitToplevel
20
+ private
21
+
22
+ # @return [String] the top level of the working tree the current directory is in
23
+ def find_git_root
24
+ root = `git rev-parse --show-toplevel`.strip
25
+ root.empty? ? super : root
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ RubyCritic::SourceControlSystem::Git::Churn.prepend(Hecks::Adapters::Codebase::Inspection::GitToplevel)
34
+
35
+ exit RubyCritic::Cli::Application.new(ARGV).execute if File.expand_path($PROGRAM_NAME) == File.expand_path(__FILE__)
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+ require_relative "tree"
5
+ require_relative "../shell"
6
+ require_relative "../console_capture"
7
+
8
+ module Hecks
9
+ module Adapters
10
+ module Codebase
11
+ # What Codebase's `InspectionRun` asks of the working tree: ranking its Ruby by complexity
12
+ # (flog), finding copied code (flay), listing design smells (reek), and writing the combined
13
+ # report with git churn (rubycritic).
14
+ #
15
+ # The tools take no exclude list of their own, so the files are listed here first and the
16
+ # ones `.rubocop.yml` excludes (generated output, vendored code) are left out: a finding in
17
+ # one belongs to its generator. Each tool then runs from the checkout's root through
18
+ # `bundle exec`, and what it printed is the report.
19
+ module Inspection
20
+ # Every operation this family carries out, one for each tool.
21
+ OPERATIONS = %w[flog flay reek rubycritic].freeze
22
+
23
+ # rubycritic starts through a launcher that finds the git root right inside a worktree.
24
+ RUBYCRITIC = ["ruby", File.join(__dir__, "inspection", "rubycritic.rb"), "--no-browser"].freeze
25
+
26
+ # The program and flags each operation starts, before the files.
27
+ PROGRAMS = { "flog" => %w[flog --methods-only],
28
+ "flay" => %w[flay],
29
+ "reek" => %w[reek],
30
+ "rubycritic" => RUBYCRITIC }.freeze
31
+
32
+ # The statuses that still mean the tool reported: reek ends 2 when it found smells.
33
+ REPORTING = { "reek" => [0, 2] }.freeze
34
+
35
+ # Searched when no path is named.
36
+ DEFAULT_PATHS = "lib"
37
+
38
+ module_function
39
+
40
+ # Carries out one operation.
41
+ #
42
+ # @param operation [String] one of `OPERATIONS`
43
+ # @param held [Hash] the `InspectionRun` record's fields: `paths` and `top`
44
+ # @param tree [Tree] the working tree, already known to be a hecks checkout
45
+ # @param shell [#capture, nil] starts the tool; a `Shell` when nil
46
+ # @return [String] what the tool printed, cut to `top` lines when that is named
47
+ # @raise [ConsoleCapture::Failure] when no Ruby file is named, or the tool is missing
48
+ # or fails
49
+ def call(operation, held, tree, shell: nil)
50
+ args = held.transform_values { |value| value.is_a?(Hash) ? value[:value] : value }
51
+ files = ruby_files(tree, args[:paths] || DEFAULT_PATHS)
52
+ raise ConsoleCapture::Failure, "no Ruby file under #{args[:paths] || DEFAULT_PATHS}" if files.empty?
53
+
54
+ result = (shell || Shell.new).capture("bundle", "exec", *PROGRAMS.fetch(operation), *files,
55
+ chdir: tree.root)
56
+ shorten(report(operation, result), args[:top])
57
+ end
58
+
59
+ # @param operation [String] the tool's name
60
+ # @param result [Shell::Result] what the tool said
61
+ # @return [String] its output
62
+ # @raise [ConsoleCapture::Failure] when it ended in a status that is not a report
63
+ def report(operation, result)
64
+ return result.out if REPORTING.fetch(operation, [0]).include?(result.status.exitstatus)
65
+
66
+ raise ConsoleCapture::Failure,
67
+ "#{operation} ended with status #{result.status.exitstatus}: #{result.err}#{result.out}".strip
68
+ end
69
+
70
+ # @param text [String] a report
71
+ # @param top [Integer, nil] how many lines to keep
72
+ # @return [String] the first `top` lines, or the whole text
73
+ def shorten(text, top)
74
+ top ? text.lines.first(top).join : text
75
+ end
76
+
77
+ # The Ruby files under the named paths, less those the style config excludes.
78
+ #
79
+ # @param tree [Tree] the checkout
80
+ # @param paths [String] comma-separated files or directories, relative to the root
81
+ # @return [Array<String>] the files, relative to the root and sorted
82
+ def ruby_files(tree, paths)
83
+ excluded = exclusions(tree)
84
+ paths.split(",").flat_map { |path| listing(tree, path) }.uniq.sort.reject do |file|
85
+ excluded.any? { |glob| File.fnmatch?(glob, file, File::FNM_PATHNAME | File::FNM_EXTGLOB) }
86
+ end
87
+ end
88
+
89
+ # @return [Array<String>] the files at one path: itself when a file, else every `.rb` below
90
+ def listing(tree, path)
91
+ return [path] if File.file?(tree.path(path))
92
+
93
+ Dir.glob("#{path}/**/*.rb", base: tree.root)
94
+ end
95
+
96
+ # @return [Array<String>] the globs `.rubocop.yml` excludes from every cop
97
+ def exclusions(tree)
98
+ config = YAML.safe_load_file(tree.path(".rubocop.yml"), permitted_classes: [Symbol])
99
+ Array(config.dig("AllCops", "Exclude"))
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -46,7 +46,8 @@ module Hecks
46
46
  none = { value: "none" }
47
47
  { operation: { value: operation }, version: { value: "0.0.0" }, client_version: { value: "0.0.0" },
48
48
  ir_version: { value: "0.0.0" }, ships_from: { path: "none" }, branch: none, head: none, release_lane: none,
49
- tag_state: none, on_origin: { value: false }, clean: { value: false }, changelog: { value: false } }
49
+ tag_state: none, on_origin: { value: false }, clean: { value: false }, changelog: { value: false },
50
+ approved: { value: false } }
50
51
  end
51
52
 
52
53
  # Carries out an accepted request.
@@ -3,6 +3,7 @@
3
3
  require "json"
4
4
  require "hecks/release/runner"
5
5
  require "hecks/release/lane"
6
+ require "hecks/release/approval"
6
7
  require_relative "tree"
7
8
  require_relative "../console_capture"
8
9
 
@@ -15,8 +16,9 @@ module Hecks
15
16
  # It reads the branch, the lane a release is cut from (the `Lane` row that feeds a tag),
16
17
  # whether `HEAD` is that lane's `origin/` branch (after a fetch), whether the tree is
17
18
  # clean, the gem's version and the client package's, whether the changelog has a heading for
18
- # the version, and where a tag for the version already points. Nothing is changed but the
19
- # remote-tracking refs a fetch updates.
19
+ # the version, whether the commit that set the version carries the owner's approval trailer,
20
+ # and where a tag for the version already points. Nothing is changed but the remote-tracking
21
+ # refs a fetch updates.
20
22
  class ReleaseFacts
21
23
  # The line of `lib/hecks/version.rb` that declares the version.
22
24
  VERSION_LINE = /^\s*VERSION\s*=\s*"(?<version>[^"]+)"/
@@ -54,6 +56,7 @@ module Hecks
54
56
  fetch_origin!
55
57
  head = read("rev-parse", "HEAD")
56
58
  lane_facts(head).merge(clean: flag(read("status", "--porcelain").empty?),
59
+ approved: flag(approved?),
57
60
  tag_state: word(tag_state("v#{version}", head)))
58
61
  end
59
62
 
@@ -69,6 +72,13 @@ module Hecks
69
72
  on_origin: flag(head == read("rev-parse", "origin/#{lane}")) }
70
73
  end
71
74
 
75
+ # Whether the newest commit on this checkout that set the version names who approved the
76
+ # release in its message (the trailer the `Lane` row names).
77
+ def approved?
78
+ message = read("log", "--first-parent", "-1", "--format=%B", "-G^ *VERSION = ", "--", "lib/hecks/version.rb")
79
+ !Release::Approval.approver(message).nil?
80
+ end
81
+
72
82
  def tag_state(tag, head)
73
83
  tagger = Release::Runner::Tagger.new(git: @git, console: nil, dry_run: true)
74
84
  commits = [tagger.local_commit(tag), tagger.remote_commit(tag)].compact
@@ -7,6 +7,7 @@ require_relative "conformance"
7
7
  require_relative "regeneration"
8
8
  require_relative "gate"
9
9
  require_relative "style"
10
+ require_relative "inspection"
10
11
  require_relative "codemods"
11
12
  require_relative "test_suite"
12
13
  require_relative "corpus_tasks"
@@ -181,7 +182,7 @@ module Hecks
181
182
 
182
183
  # The task families, each carrying out the operations it lists.
183
184
  FAMILIES = [Codebase::Language, Codebase::KernelTables, Codebase::Conformance, Codebase::Regeneration,
184
- Codebase::Gate, Codebase::Style, Codebase::Codemods, Codebase::TestSuite,
185
+ Codebase::Gate, Codebase::Style, Codebase::Inspection, Codebase::Codemods, Codebase::TestSuite,
185
186
  Codebase::CorpusTasks, Codebase::Publishing, Codebase::Promotion].freeze
186
187
  private_constant :FAMILIES
187
188
 
@@ -55,7 +55,7 @@ module Hecks
55
55
  return self.class.runner if self.class.runner
56
56
 
57
57
  require "rspec/core"
58
- # A process that runs one example after another, as a resident door does, has to reset
58
+ # A process that runs one example after another, as a resident server does, has to reset
59
59
  # RSpec between runs: its reporter keeps the first run's output stream, so a later run
60
60
  # would write into that and answer an empty report.
61
61
  lambda do |args, err, out|