hecks 3.10.0 → 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. 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 +155 -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 +69 -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/ruby/aggregate_module.rb +171 -0
  40. data/lib/hecks/adapters/driving/ruby/chapter.rb +91 -0
  41. data/lib/hecks/adapters/driving/ruby.rb +83 -0
  42. data/lib/hecks/adapters/driving/usage_cache.rb +144 -0
  43. data/lib/hecks/{doors.rb → adapters/driving.rb} +10 -6
  44. data/lib/hecks/behaviors/expectations/boot.rb +1 -1
  45. data/lib/hecks/bench/ruby_runner.rb +1 -1
  46. data/lib/hecks/bluebook/ask_resolution.rb +130 -0
  47. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +8 -2
  48. data/lib/hecks/bluebook/assembly/contracts/rules.rb +4 -2
  49. data/lib/hecks/bluebook/assembly/contracts/structure.rb +3 -1
  50. data/lib/hecks/bluebook/assembly/marks.rb +1 -0
  51. data/lib/hecks/bluebook/attribute.rb +1 -1
  52. data/lib/hecks/bluebook/behaviour/command.rb +13 -8
  53. data/lib/hecks/bluebook/behaviour/policy.rb +30 -0
  54. data/lib/hecks/bluebook/capabilities/attribute_values.rb +72 -0
  55. data/lib/hecks/bluebook/capabilities.rb +91 -9
  56. data/lib/hecks/bluebook/domain_port.rb +16 -4
  57. data/lib/hecks/bluebook/dsl/adapter_builder.rb +18 -6
  58. data/lib/hecks/bluebook/dsl/binding_proxy.rb +13 -0
  59. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/computed_sources.rb +98 -0
  60. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/fan_out_rows.rb +42 -0
  61. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/projected_fields.rb +14 -2
  62. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/provisions.rb +69 -3
  63. data/lib/hecks/bluebook/dsl/bluebook_builder/validation/with_projections.rb +17 -10
  64. data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +5 -0
  65. data/lib/hecks/bluebook/dsl/bootstrap_table.rb +2 -0
  66. data/lib/hecks/bluebook/dsl/command_builder/mutations.rb +8 -1
  67. data/lib/hecks/bluebook/dsl/command_builder/operands.rb +121 -0
  68. data/lib/hecks/bluebook/dsl/command_builder.rb +2 -0
  69. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +10 -1
  70. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +45 -2
  71. data/lib/hecks/bluebook/dsl/policy_builder.rb +47 -10
  72. data/lib/hecks/bluebook/dsl/rule_reference.rb +7 -4
  73. data/lib/hecks/bluebook/dsl/world_builder.rb +1 -1
  74. data/lib/hecks/bluebook/expression/ast_json/emitters.rb +6 -0
  75. data/lib/hecks/bluebook/expression/ast_json.rb +9 -6
  76. data/lib/hecks/bluebook/expression/ast_reader.rb +14 -9
  77. data/lib/hecks/bluebook/expression/projection.json +36 -0
  78. data/lib/hecks/bluebook/expression/resolver/operations.rb +31 -0
  79. data/lib/hecks/bluebook/expression/resolver/parsing.rb +38 -5
  80. data/lib/hecks/bluebook/expression/resolver/scanning.rb +22 -5
  81. data/lib/hecks/bluebook/expression/resolver/values.rb +10 -0
  82. data/lib/hecks/bluebook/expression/resolver.rb +20 -1
  83. data/lib/hecks/bluebook/hecksagon.rb +23 -3
  84. data/lib/hecks/bluebook/lifecycle.rb +22 -3
  85. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +13 -1
  86. data/lib/hecks/bluebook/meta_validator/modes.rb +4 -1
  87. data/lib/hecks/bluebook/meta_validator/readings.rb +18 -1
  88. data/lib/hecks/bluebook/meta_validator/reconstruction/heads.rb +2 -1
  89. data/lib/hecks/bluebook/meta_validator/shapes.rb +5 -0
  90. data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +1 -1
  91. data/lib/hecks/bluebook/meta_validator.rb +12 -12
  92. data/lib/hecks/bluebook/model_check/ask_checks.rb +71 -0
  93. data/lib/hecks/bluebook/model_check/policy_checks.rb +2 -1
  94. data/lib/hecks/bluebook/model_check/reference_checks.rb +70 -0
  95. data/lib/hecks/bluebook/model_check.rb +8 -2
  96. data/lib/hecks/bluebook/policy.rb +4 -2
  97. data/lib/hecks/bluebook/smoke_test.rb +1 -1
  98. data/lib/hecks/bluebook/synthesizer.rb +2 -0
  99. data/lib/hecks/bluebook.rb +1 -0
  100. data/lib/hecks/cli/command_table.rb +1 -1
  101. data/lib/hecks/cli/console.rb +2 -1
  102. data/lib/hecks/cli/document.rb +1 -1
  103. data/lib/hecks/cli/launcher_words.rb +4 -4
  104. data/lib/hecks/cli/mcp.rb +4 -4
  105. data/lib/hecks/cli/project_cli/launcher_source.rb +2 -2
  106. data/lib/hecks/cli/project_cli/templates.rb +5 -5
  107. data/lib/hecks/cli/project_cli.rb +9 -6
  108. data/lib/hecks/cli/run.rb +2 -2
  109. data/lib/hecks/cli/smoke_http/checks.rb +4 -1
  110. data/lib/hecks/cli/smoke_http/transport.rb +3 -3
  111. data/lib/hecks/cli/smoke_http.rb +3 -0
  112. data/lib/hecks/codemod.rb +5 -2
  113. data/lib/hecks/corpus/routes.rb +7 -0
  114. data/lib/hecks/corpus/rust.rb +3 -2
  115. data/lib/hecks/deploy/bluebook/deploy.bluebook +18 -2
  116. data/lib/hecks/doc/reference/rendering.rb +6 -3
  117. data/lib/hecks/forms/app/commands.rb +8 -7
  118. data/lib/hecks/forms/app/queries.rb +2 -1
  119. data/lib/hecks/forms/app.rb +1 -1
  120. data/lib/hecks/forms/record_renderer.rb +1 -1
  121. data/lib/hecks/framework/bluebook/privacy.bluebook +11 -0
  122. data/lib/hecks/fuzzing/concurrent_dispatch.rb +4 -1
  123. data/lib/hecks/fuzzing/failure_triage.rb +2 -1
  124. data/lib/hecks/fuzzing/mutation/run.rb +11 -4
  125. data/lib/hecks/fuzzing/properties/catalog.rb +6 -4
  126. data/lib/hecks/fuzzing/properties/guaranteed_by_construction.rb +18 -11
  127. data/lib/hecks/fuzzing/properties/guards.rb +1 -1
  128. data/lib/hecks/fuzzing/self_consistency/saga_redelivery.rb +1 -1
  129. data/lib/hecks/fuzzing/self_consistency.rb +6 -2
  130. data/lib/hecks/fuzzing/shrinker.rb +3 -1
  131. data/lib/hecks/fuzzing/value_generator.rb +19 -5
  132. data/lib/hecks/gate/stages.yml +4 -10
  133. data/lib/hecks/grammar/evolve.rb +1 -1
  134. data/lib/hecks/grammar/expression_operators.json +372 -0
  135. data/lib/hecks/grammar/operators.rb +3 -1
  136. data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +10 -10
  137. data/lib/hecks/hecks/adapters/codebase/inspection/rubycritic.rb +35 -0
  138. data/lib/hecks/hecks/adapters/codebase/inspection.rb +104 -0
  139. data/lib/hecks/hecks/adapters/codebase/publishing.rb +2 -1
  140. data/lib/hecks/hecks/adapters/codebase/release_facts.rb +12 -2
  141. data/lib/hecks/hecks/adapters/codebase/source_tree.rb +2 -1
  142. data/lib/hecks/hecks/adapters/codebase/test_runner.rb +1 -1
  143. data/lib/hecks/hecks/adapters/cost_explorer.rb +8 -5
  144. data/lib/hecks/hecks/adapters/deploy_toolchain/statuses.rb +2 -1
  145. data/lib/hecks/hecks/adapters/finding_github.rb +13 -6
  146. data/lib/hecks/hecks/adapters/first_admin.rb +2 -2
  147. data/lib/hecks/hecks/adapters/github_rulesets.rb +6 -3
  148. data/lib/hecks/hecks/adapters/in_process_boot.rb +1 -1
  149. data/lib/hecks/hecks/adapters/journal_store/compaction.rb +1 -1
  150. data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +10 -20
  151. data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +28 -5
  152. data/lib/hecks/hecks/adapters/local_files.rb +2 -2
  153. data/lib/hecks/hecks/adapters/rehearsal/audit_report.rb +107 -0
  154. data/lib/hecks/hecks/adapters/rehearsal/census.rb +71 -0
  155. data/lib/hecks/hecks/adapters/rehearsal/declaration.rb +133 -0
  156. data/lib/hecks/hecks/adapters/rehearsal/environment.rb +83 -0
  157. data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +142 -0
  158. data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +96 -0
  159. data/lib/hecks/hecks/adapters/rehearsal/postgres_census.rb +100 -0
  160. data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +69 -0
  161. data/lib/hecks/hecks/adapters/rehearsal/postgres_store.rb +129 -0
  162. data/lib/hecks/hecks/adapters/rehearsal/rows.rb +41 -0
  163. data/lib/hecks/hecks/adapters/rehearsal/rust_audit.rb +83 -0
  164. data/lib/hecks/hecks/adapters/rehearsal/subject.rb +104 -0
  165. data/lib/hecks/hecks/adapters/rehearsal.rb +54 -0
  166. data/lib/hecks/hecks/adapters/rehearsal_store.adapter +7 -0
  167. data/lib/hecks/hecks/adapters/rehearsal_store.rb +81 -0
  168. data/lib/hecks/hecks/adapters/terminal.rb +13 -11
  169. data/lib/hecks/hecks/codebase.behaviors +13 -1
  170. data/lib/hecks/hecks/codebase.bluebook +239 -5
  171. data/lib/hecks/hecks/custodian.behaviors +24 -6
  172. data/lib/hecks/hecks/custodian.bluebook +6 -1227
  173. data/lib/hecks/hecks/deploy.behaviors +1 -1
  174. data/lib/hecks/hecks/deploy.world +1 -3
  175. data/lib/hecks/hecks/hecks.behaviors +1 -1
  176. data/lib/hecks/hecks/hecks.hecksagon +53 -18
  177. data/lib/hecks/hecks/hecks.world +10 -10
  178. data/lib/hecks/hecks/rehearsal.bluebook +477 -0
  179. data/lib/hecks/hecks/site.behaviors +1 -1
  180. data/lib/hecks/hecks/site.world +0 -1
  181. data/lib/hecks/hecks/tooling.bluebook +1238 -0
  182. data/lib/hecks/indifferent_key.rb +20 -0
  183. data/lib/hecks/language/adapter.bluebook +13 -3
  184. data/lib/hecks/language/bluebook/aggregate.bluebook +23 -0
  185. data/lib/hecks/language/bluebook/bluebook.bluebook +15 -0
  186. data/lib/hecks/language/bluebook/entity.bluebook +18 -0
  187. data/lib/hecks/language/bluebook/policy.bluebook +9 -1
  188. data/lib/hecks/language/bluebook/query.bluebook +1 -1
  189. data/lib/hecks/language/bluebook/vocabulary.bluebook +11 -4
  190. data/lib/hecks/language/hecksagon/domain_port.bluebook +1 -1
  191. data/lib/hecks/language/hecksagon/hecksagon.bluebook +22 -0
  192. data/lib/hecks/language/oidc.json +10 -0
  193. data/lib/hecks/language/port.bluebook +4 -4
  194. data/lib/hecks/literal.rb +12 -3
  195. data/lib/hecks/ports/key_vault.rb +7 -2
  196. data/lib/hecks/ports/persistence/plugins/era/era_check.rb +21 -10
  197. data/lib/hecks/ports/persistence/plugins/era/postgres_era/boot.rb +4 -2
  198. data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +2 -1
  199. data/lib/hecks/ports/persistence/repository_factory.rb +6 -3
  200. data/lib/hecks/projections/deploy/box/templates/deploy-box.sh.tmpl +29 -0
  201. data/lib/hecks/projections/deploy/box/templates/deploy-service.sh.tmpl +1 -1
  202. data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
  203. data/lib/hecks/projections/deploy/shared.rb +5 -2
  204. data/lib/hecks/projections/model/deviations.rb +2 -2
  205. data/lib/hecks/projections/model.rb +2 -2
  206. data/lib/hecks/projections/oidc.rb +13 -1
  207. data/lib/hecks/projections/shape.rb +5 -2
  208. data/lib/hecks/projections/site/cms_editor/attributes.rb +26 -6
  209. data/lib/hecks/projections/site/cms_editor/blocks.rb +157 -0
  210. data/lib/hecks/projections/site/cms_editor/checks.rb +14 -1
  211. data/lib/hecks/projections/site/cms_editor/clearing.rb +70 -0
  212. data/lib/hecks/projections/site/cms_editor/color.rb +124 -0
  213. data/lib/hecks/projections/site/cms_editor/composition.rb +42 -0
  214. data/lib/hecks/projections/site/cms_editor/destructive.rb +61 -0
  215. data/lib/hecks/projections/site/cms_editor/drafts.rb +102 -0
  216. data/lib/hecks/projections/site/cms_editor/hints.rb +74 -0
  217. data/lib/hecks/projections/site/cms_editor/icons.rb +86 -0
  218. data/lib/hecks/projections/site/cms_editor/key_kinds.rb +31 -0
  219. data/lib/hecks/projections/site/cms_editor/limits.rb +72 -0
  220. data/lib/hecks/projections/site/cms_editor/media.rb +1 -1
  221. data/lib/hecks/projections/site/cms_editor/moment.rb +34 -0
  222. data/lib/hecks/projections/site/cms_editor/palette.rb +115 -0
  223. data/lib/hecks/projections/site/cms_editor/pickers.rb +85 -0
  224. data/lib/hecks/projections/site/cms_editor/preview.rb +91 -0
  225. data/lib/hecks/projections/site/cms_editor/relations.rb +92 -0
  226. data/lib/hecks/projections/site/cms_editor/scale_checks.rb +66 -0
  227. data/lib/hecks/projections/site/cms_editor/scheduling.rb +150 -0
  228. data/lib/hecks/projections/site/cms_editor/schema.rb +96 -19
  229. data/lib/hecks/projections/site/cms_editor/setting.rb +52 -9
  230. data/lib/hecks/projections/site/cms_editor/targets.rb +86 -0
  231. data/lib/hecks/projections/site/cms_editor/templates/package.json.tmpl +18 -1
  232. data/lib/hecks/projections/site/cms_editor/templates/src/app.ts.tmpl +251 -57
  233. data/lib/hecks/projections/site/cms_editor/templates/src/assets.ts.tmpl +98 -0
  234. data/lib/hecks/projections/site/cms_editor/templates/src/auth/membership.ts.tmpl +32 -24
  235. data/lib/hecks/projections/site/cms_editor/templates/src/browser/app.css.tmpl +412 -0
  236. data/lib/hecks/projections/site/cms_editor/templates/src/browser/autosave.js.tmpl +144 -0
  237. data/lib/hecks/projections/site/cms_editor/templates/src/browser/blocks.js.tmpl +500 -0
  238. data/lib/hecks/projections/site/cms_editor/templates/src/browser/body_doc.js.tmpl +175 -0
  239. data/lib/hecks/projections/site/cms_editor/templates/src/browser/body_editor.js.tmpl +418 -0
  240. data/lib/hecks/projections/site/cms_editor/templates/src/browser/epoch.js.tmpl +61 -0
  241. data/lib/hecks/projections/site/cms_editor/templates/src/browser/forms.js.tmpl +210 -0
  242. data/lib/hecks/projections/site/cms_editor/templates/src/browser/lists.js.tmpl +40 -0
  243. data/lib/hecks/projections/site/cms_editor/templates/src/browser/main.js.tmpl +26 -0
  244. data/lib/hecks/projections/site/cms_editor/templates/src/browser/media_picker.js.tmpl +232 -0
  245. data/lib/hecks/projections/site/cms_editor/templates/src/browser/moments.js.tmpl +73 -0
  246. data/lib/hecks/projections/site/cms_editor/templates/src/browser/pickers.js.tmpl +152 -0
  247. data/lib/hecks/projections/site/cms_editor/templates/src/browser/preview.js.tmpl +98 -0
  248. data/lib/hecks/projections/site/cms_editor/templates/src/browser/shell.js.tmpl +140 -0
  249. data/lib/hecks/projections/site/cms_editor/templates/src/browser/toast.js.tmpl +66 -0
  250. data/lib/hecks/projections/site/cms_editor/templates/src/choices.ts.tmpl +99 -0
  251. data/lib/hecks/projections/site/cms_editor/templates/src/commands.ts.tmpl +78 -24
  252. data/lib/hecks/projections/site/cms_editor/templates/src/config.ts.tmpl +6 -0
  253. data/lib/hecks/projections/site/cms_editor/templates/src/flash.ts.tmpl +52 -0
  254. data/lib/hecks/projections/site/cms_editor/templates/src/host.ts.tmpl +19 -2
  255. data/lib/hecks/projections/site/cms_editor/templates/src/media/handler.ts.tmpl +31 -8
  256. data/lib/hecks/projections/site/cms_editor/templates/src/names.ts.tmpl +36 -0
  257. data/lib/hecks/projections/site/cms_editor/templates/src/schema.ts.tmpl +131 -2
  258. data/lib/hecks/projections/site/cms_editor/templates/src/ui/availability.ts.tmpl +15 -0
  259. data/lib/hecks/projections/site/cms_editor/templates/src/ui/block_list.js.tmpl +213 -0
  260. data/lib/hecks/projections/site/cms_editor/templates/src/ui/blocks.ts.tmpl +275 -0
  261. data/lib/hecks/projections/site/cms_editor/templates/src/ui/body_model.js.tmpl +8 -5
  262. data/lib/hecks/projections/site/cms_editor/templates/src/ui/detail.ts.tmpl +88 -0
  263. data/lib/hecks/projections/site/cms_editor/templates/src/ui/dialogs.ts.tmpl +43 -0
  264. data/lib/hecks/projections/site/cms_editor/templates/src/ui/fields.ts.tmpl +229 -34
  265. data/lib/hecks/projections/site/cms_editor/templates/src/ui/html.ts.tmpl +40 -81
  266. data/lib/hecks/projections/site/cms_editor/templates/src/ui/icons.ts.tmpl +15 -0
  267. data/lib/hecks/projections/site/cms_editor/templates/src/ui/input.ts.tmpl +29 -12
  268. data/lib/hecks/projections/site/cms_editor/templates/src/ui/links.ts.tmpl +100 -0
  269. data/lib/hecks/projections/site/cms_editor/templates/src/ui/moments.ts.tmpl +44 -0
  270. data/lib/hecks/projections/site/cms_editor/templates/src/ui/outline.ts.tmpl +53 -17
  271. data/lib/hecks/projections/site/cms_editor/templates/src/ui/pages.ts.tmpl +178 -88
  272. data/lib/hecks/projections/site/cms_editor/templates/src/ui/paging.ts.tmpl +82 -0
  273. data/lib/hecks/projections/site/cms_editor/templates/src/ui/pickers.ts.tmpl +110 -0
  274. data/lib/hecks/projections/site/cms_editor/templates/src/ui/preview.ts.tmpl +87 -0
  275. data/lib/hecks/projections/site/cms_editor/templates/src/ui/related.ts.tmpl +97 -0
  276. data/lib/hecks/projections/site/cms_editor/templates/src/ui/schedule.ts.tmpl +160 -0
  277. data/lib/hecks/projections/site/cms_editor/templates/src/ui/shell.ts.tmpl +211 -0
  278. data/lib/hecks/projections/site/cms_editor/templates/src/ui/table.ts.tmpl +151 -0
  279. data/lib/hecks/projections/site/cms_editor/templates/src/ui/theme.js.tmpl +16 -0
  280. data/lib/hecks/projections/site/cms_editor/templates/src/ui/values.ts.tmpl +69 -0
  281. data/lib/hecks/projections/site/cms_editor/templates/src/ui/words.ts.tmpl +97 -0
  282. data/lib/hecks/projections/site/cms_editor/templates/src/ui/world.ts.tmpl +35 -0
  283. data/lib/hecks/projections/site/cms_editor/templates/tsconfig.json.tmpl +2 -1
  284. data/lib/hecks/projections/site/cms_editor/theme.rb +29 -0
  285. data/lib/hecks/projections/site/cms_editor/theme_checks.rb +57 -0
  286. data/lib/hecks/projections/site/cms_editor.rb +49 -23
  287. data/lib/hecks/projections/site/role_probe.rb +2 -0
  288. data/lib/hecks/projector/cli_audience.rb +2 -1
  289. data/lib/hecks/projector/cli_projector/listing.rb +1 -1
  290. data/lib/hecks/projector/cli_projector/option_specs.rb +1 -1
  291. data/lib/hecks/projector/docs_projector/closing.rb +1 -1
  292. data/lib/hecks/projector/docs_projector.rb +1 -1
  293. data/lib/hecks/projector/exporter/bindings.rb +40 -10
  294. data/lib/hecks/projector/exporter/capability_values.rb +55 -0
  295. data/lib/hecks/projector/narrate_projector/reactions.rb +1 -1
  296. data/lib/hecks/projector/target.rb +11 -0
  297. data/lib/hecks/projector.rb +32 -5
  298. data/lib/hecks/quality_control/adapters/github_checks.rb +12 -8
  299. data/lib/hecks/quality_control/adapters/github_issues.rb +8 -4
  300. data/lib/hecks/quality_control/cli/qa_open_pr.rb +2 -2
  301. data/lib/hecks/quality_control/cli/qa_sweep/checks/shrinking.rb +1 -1
  302. data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +1 -1
  303. data/lib/hecks/quality_control/cli/qa_sweep.rb +1 -1
  304. data/lib/hecks/quality_control/quality_control.bluebook +6 -2
  305. data/lib/hecks/release/approval.rb +64 -0
  306. data/lib/hecks/router/{door.rb → aggregate_reader.rb} +5 -4
  307. data/lib/hecks/router/namespace_installer.rb +16 -16
  308. data/lib/hecks/router.rb +1 -1
  309. data/lib/hecks/runtime/best_effort.rb +22 -0
  310. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +12 -2
  311. data/lib/hecks/runtime/command_interpreter.rb +3 -2
  312. data/lib/hecks/runtime/command_rules/emission.rb +1 -1
  313. data/lib/hecks/runtime/dispatcher.rb +4 -4
  314. data/lib/hecks/runtime/entity_element/location.rb +1 -1
  315. data/lib/hecks/runtime/event.rb +5 -0
  316. data/lib/hecks/runtime/identity.rb +7 -6
  317. data/lib/hecks/runtime/interpreting.rb +2 -1
  318. data/lib/hecks/runtime/invocation_builder.rb +1 -1
  319. data/lib/hecks/runtime/loader/boot_steps.rb +8 -5
  320. data/lib/hecks/runtime/loader.rb +10 -10
  321. data/lib/hecks/runtime/policy_interpreter/arguments.rb +7 -4
  322. data/lib/hecks/runtime/policy_interpreter/fan_out.rb +3 -3
  323. data/lib/hecks/runtime/policy_interpreter.rb +6 -6
  324. data/lib/hecks/runtime/port_operation_interpreter.rb +1 -1
  325. data/lib/hecks/runtime/reaction_invocation.rb +1 -1
  326. data/lib/hecks/runtime/rebuild_sweep.rb +11 -1
  327. data/lib/hecks/runtime/registry/ask_verification.rb +35 -0
  328. data/lib/hecks/runtime/registry/hecksagon_rules.rb +10 -0
  329. data/lib/hecks/runtime/registry/merging.rb +1 -1
  330. data/lib/hecks/runtime/registry/providers.rb +16 -0
  331. data/lib/hecks/runtime/registry/read_repository.rb +6 -4
  332. data/lib/hecks/runtime/registry/verification.rb +4 -1
  333. data/lib/hecks/runtime/registry/world_defaults.rb +29 -0
  334. data/lib/hecks/runtime/registry.rb +1 -1
  335. data/lib/hecks/runtime/saga_interpreter/compensation.rb +1 -1
  336. data/lib/hecks/runtime/saga_interpreter/delivery.rb +4 -4
  337. data/lib/hecks/runtime/saga_interpreter/transitions.rb +1 -1
  338. data/lib/hecks/runtime/saga_interpreter.rb +3 -3
  339. data/lib/hecks/runtime/tenant_check.rb +5 -4
  340. data/lib/hecks/runtime/value/coercion.rb +2 -2
  341. data/lib/hecks/runtime/value/validation.rb +16 -4
  342. data/lib/hecks/runtime.rb +9 -9
  343. data/lib/hecks/rust_build/project_rust/target_ir.rb +1 -1
  344. data/lib/hecks/rust_build/wasm.rb +1 -1
  345. data/lib/hecks/rust_build/wasm_browser.rb +1 -1
  346. data/lib/hecks/rust_build.rb +11 -0
  347. data/lib/hecks/served_options.rb +53 -0
  348. data/lib/hecks/site/bluebook/site.bluebook +1 -0
  349. data/lib/hecks/storehouse/audit.rb +1 -1
  350. data/lib/hecks/storehouse/dispatching.rb +8 -6
  351. data/lib/hecks/storehouse/introspection.rb +2 -2
  352. data/lib/hecks/storehouse/querying.rb +6 -4
  353. data/lib/hecks/storehouse.rb +4 -4
  354. data/lib/hecks/tools/comment_style/source_file.rb +4 -1
  355. data/lib/hecks/tools/deploy_recipe_lint/fixtures.rb +4 -1
  356. data/lib/hecks/tools/lanes/rows.rb +6 -0
  357. data/lib/hecks/tools/oidc_manifests.rb +4 -5
  358. data/lib/hecks/tools/regeneration_run.rb +11 -4
  359. data/lib/hecks/tools/site_routes/editor_files.rb +12 -5
  360. data/lib/hecks/tools/tenant_provisioning.rb +2 -2
  361. data/lib/hecks/tools/tools_doc.rb +4 -4
  362. data/lib/hecks/version.rb +1 -1
  363. data/lib/hecks/vocabulary.rb +4 -4
  364. data/lib/hecks.rb +15 -15
  365. data/lib/rubocop/cop/hecks/env_dump.rb +69 -0
  366. data/lib/rubocop/cop/hecks/monotonic_duration.rb +53 -0
  367. data/lib/rubocop/cop/hecks/no_wall_clock_in_runtime.rb +34 -0
  368. data/lib/rubocop/cop/hecks/raw_shell_interpolation.rb +79 -0
  369. data/lib/rubocop/cop/hecks/sleep_in_spec.rb +34 -0
  370. data/lib/rubocop/cop/hecks/swallowed_rescue.rb +37 -0
  371. data/lib/rubocop/cop/hecks/symbol_string_key_mix.rb +50 -0
  372. data/lib/rubocop/cop/hecks/untyped_raise.rb +37 -0
  373. data/prebuilt/05c358d38d661a3774f813d49c66f5b68939af94432d66257a56f49ee2598994.marshal +0 -0
  374. data/prebuilt/26c40c61f09b09b11651c64668eda3ceb180f83cf2a3802d3033d2fd99ac841b.marshal +0 -0
  375. data/prebuilt/verdicts-230ac18c25abfd3d92ede032bee2661a4c2cd2773ab0cf0e2ae52546ba2f7af9.json +1 -0
  376. data/rust/.gitignore +6 -0
  377. data/rust/Cargo.toml +6 -0
  378. data/rust/build/src/binding_pass.rs +103 -0
  379. data/rust/build/src/cargo_sync.rs +6 -0
  380. data/rust/build/src/lineage_pass.rs +3 -3
  381. data/rust/build/src/main.rs +17 -5
  382. data/rust/build/src/pipeline.rs +48 -5
  383. data/rust/build/src/seams_pass.rs +123 -0
  384. data/rust/build/src/translation_pass.rs +167 -0
  385. data/rust/codegen/src/asks.rs +103 -0
  386. data/rust/codegen/src/commands.rs +13 -8
  387. data/rust/codegen/src/constraints.rs +25 -0
  388. data/rust/codegen/src/domain_generator.rs +2 -0
  389. data/rust/codegen/src/expr_emitter.rs +13 -0
  390. data/rust/codegen/src/json_codec.rs +54 -15
  391. data/rust/codegen/src/main.rs +1 -0
  392. data/rust/codegen/src/mutations.rs +128 -3
  393. data/rust/codegen/src/queries.rs +11 -2
  394. data/rust/codegen/src/reactions.rs +1 -1
  395. data/rust/codegen/src/types.rs +166 -8
  396. data/rust/host/HECKS_RELEASE +1 -1
  397. data/rust/host/src/api.rs +4 -4
  398. data/rust/host/src/bin/validate_harness.rs +43 -0
  399. data/rust/host/src/boundary_fuzz/expr_json.rs +2 -2
  400. data/rust/host/src/boundary_fuzz/ir.rs +1 -0
  401. data/rust/host/src/boundary_fuzz/server.rs +1 -1
  402. data/rust/host/src/checkout.rs +35 -19
  403. data/rust/host/src/commerce_ir.rs +408 -2
  404. data/rust/host/src/expr_json.rs +118 -0
  405. data/rust/host/src/mint.rs +1 -1
  406. data/rust/host/src/payments/tests.rs +27 -1
  407. data/rust/host/src/payments.rs +12 -4
  408. data/rust/host/src/query_step.rs +22 -4
  409. data/rust/host/src/reference_validate.rs +653 -108
  410. data/rust/host/src/resend.rs +2 -0
  411. data/rust/host/src/server.rs +19 -6
  412. data/rust/host/src/ui_schema.rs +132 -5
  413. data/rust/host/src/web/newsletter.rs +7 -8
  414. data/rust/host/src/web/newsletter_send.rs +38 -13
  415. data/rust/host/src/web/registrations.rs +229 -26
  416. data/rust/host/src/web.rs +3 -3
  417. data/rust/parser/src/emit.rs +38 -6
  418. data/rust/parser/src/expr/ast_json.rs +7 -1
  419. data/rust/parser/src/expr/resolver.rs +171 -6
  420. data/rust/parser/src/ir.rs +7 -0
  421. data/rust/parser/src/keywords.rs +24 -0
  422. data/rust/parser/src/main.rs +3 -0
  423. data/rust/parser/src/parse/aggregate.rs +2 -1
  424. data/rust/parser/src/parse/chapter.rs +2 -2
  425. data/rust/parser/src/parse/command.rs +2 -0
  426. data/rust/parser/src/parse/hecksagon.rs +5 -2
  427. data/rust/parser/src/parse/lifecycle.rs +81 -0
  428. data/rust/parser/src/parse/mod.rs +15 -1
  429. data/rust/parser/src/parse/policy.rs +13 -2
  430. data/rust/parser/src/parse/value_object.rs +13 -8
  431. data/rust/parser/src/ruby_value.rs +1 -1
  432. data/rust/src/exemplar/commands.rs +4 -4
  433. data/rust/src/exemplar/constraints.rs +1 -1
  434. data/rust/src/exemplar/json.rs +43 -1
  435. data/rust/src/kernel/cli.rs +7 -5
  436. data/rust/src/kernel/dispatch.rs +2 -2
  437. data/rust/src/kernel/dispatch_guard_tests.rs +1 -1
  438. data/rust/src/kernel/expr.rs +66 -3
  439. data/rust/src/kernel/expression_operators/arithmetic.rs +130 -5
  440. data/rust/src/kernel/expression_operators/text.rs +26 -2
  441. data/rust/src/kernel/json.rs +15 -0
  442. data/rust/src/kernel/mod.rs +1 -1
  443. data/rust/src/kernel/orchestrate.rs +54 -5
  444. data/rust/src/kernel/orchestrate_guard_tests.rs +67 -0
  445. data/rust/src/kernel/pattern.rs +60 -0
  446. data/rust/src/kernel/reference_lookup.rs +90 -7
  447. metadata +140 -38
  448. data/lib/hecks/doors/cli_door/nesting.rb +0 -34
  449. data/lib/hecks/doors/cli_door/shorthand.rb +0 -85
  450. data/lib/hecks/doors/cli_door.rb +0 -124
  451. data/lib/hecks/doors/cli_runner/answers.rb +0 -138
  452. data/lib/hecks/doors/cli_runner/resolution.rb +0 -146
  453. data/lib/hecks/doors/cli_runner/settling.rb +0 -115
  454. data/lib/hecks/doors/cli_runner/streaming.rb +0 -90
  455. data/lib/hecks/doors/cli_runner/suggestions.rb +0 -43
  456. data/lib/hecks/doors/cli_runner.rb +0 -66
  457. data/lib/hecks/doors/command_request.rb +0 -119
  458. data/lib/hecks/doors/handle.rb +0 -208
  459. data/lib/hecks/doors/json_door.rb +0 -132
  460. data/lib/hecks/doors/launcher_options.rb +0 -247
  461. data/lib/hecks/doors/mcp_door/properties.rb +0 -47
  462. data/lib/hecks/doors/mcp_door/tool_calls.rb +0 -113
  463. data/lib/hecks/doors/mcp_door/tool_definitions/auditing.rb +0 -51
  464. data/lib/hecks/doors/mcp_door/tool_definitions/calling.rb +0 -69
  465. data/lib/hecks/doors/mcp_door/tool_definitions/reading.rb +0 -97
  466. data/lib/hecks/doors/mcp_door/tool_definitions.rb +0 -15
  467. data/lib/hecks/doors/mcp_door.rb +0 -156
  468. data/lib/hecks/doors/mcp_door_scope/argument_policy.rb +0 -92
  469. data/lib/hecks/doors/mcp_door_scope/env_problems.rb +0 -55
  470. data/lib/hecks/doors/mcp_door_scope/presenter.rb +0 -78
  471. data/lib/hecks/doors/mcp_door_scope.rb +0 -201
  472. data/lib/hecks/doors/mcp_guide_cache.rb +0 -75
  473. data/lib/hecks/doors/ruby_door/aggregate_door.rb +0 -162
  474. data/lib/hecks/doors/ruby_door/chapter.rb +0 -89
  475. data/lib/hecks/doors/ruby_door.rb +0 -80
  476. data/lib/hecks/doors/usage_cache.rb +0 -139
  477. data/lib/hecks/projections/site/cms_editor/templates/src/ui/body_widget.js.tmpl +0 -282
  478. data/lib/hecks/projections/site/cms_editor/templates/src/ui/media_picker.js.tmpl +0 -109
  479. data/prebuilt/c28d6d9db14eea3e17161e9d9c262efee30b256cf97693a7cfd552bce24b2f7f.marshal +0 -0
  480. data/prebuilt/cb375cba61ca0dbe8ddb9739c306510fe05e5f4b7a9b6955caff8224c63ea0e0.marshal +0 -0
  481. data/prebuilt/verdicts-d6d584ad43b5f3cebf88aafbbdbf024c38574acf18e06adffbc555f7786b1c2f.json +0 -1
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.10.0
4
+ version: 3.11.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-08 00:00:00.000000000 Z
11
+ date: 2026-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: prism
@@ -117,7 +117,38 @@ files:
117
117
  - lib/hecks/adapters/driven/system_clock.rb
118
118
  - lib/hecks/adapters/driven/tenant_provisioner.adapter
119
119
  - lib/hecks/adapters/driven/tenant_provisioner.rb
120
+ - lib/hecks/adapters/driving.rb
121
+ - lib/hecks/adapters/driving/admission.rb
122
+ - lib/hecks/adapters/driving/cli.rb
123
+ - lib/hecks/adapters/driving/cli/nesting.rb
124
+ - lib/hecks/adapters/driving/cli/shorthand.rb
125
+ - lib/hecks/adapters/driving/cli_runner.rb
126
+ - lib/hecks/adapters/driving/cli_runner/answers.rb
127
+ - lib/hecks/adapters/driving/cli_runner/resolution.rb
128
+ - lib/hecks/adapters/driving/cli_runner/settling.rb
129
+ - lib/hecks/adapters/driving/cli_runner/streaming.rb
130
+ - lib/hecks/adapters/driving/cli_runner/suggestions.rb
131
+ - lib/hecks/adapters/driving/command_request.rb
120
132
  - lib/hecks/adapters/driving/github_webhook.rb
133
+ - lib/hecks/adapters/driving/handle.rb
134
+ - lib/hecks/adapters/driving/json.rb
135
+ - lib/hecks/adapters/driving/launcher_options.rb
136
+ - lib/hecks/adapters/driving/mcp.rb
137
+ - lib/hecks/adapters/driving/mcp/properties.rb
138
+ - lib/hecks/adapters/driving/mcp/tool_calls.rb
139
+ - lib/hecks/adapters/driving/mcp/tool_definitions.rb
140
+ - lib/hecks/adapters/driving/mcp/tool_definitions/auditing.rb
141
+ - lib/hecks/adapters/driving/mcp/tool_definitions/calling.rb
142
+ - lib/hecks/adapters/driving/mcp/tool_definitions/reading.rb
143
+ - lib/hecks/adapters/driving/mcp_guide_cache.rb
144
+ - lib/hecks/adapters/driving/mcp_scope.rb
145
+ - lib/hecks/adapters/driving/mcp_scope/argument_policy.rb
146
+ - lib/hecks/adapters/driving/mcp_scope/env_problems.rb
147
+ - lib/hecks/adapters/driving/mcp_scope/presenter.rb
148
+ - lib/hecks/adapters/driving/ruby.rb
149
+ - lib/hecks/adapters/driving/ruby/aggregate_module.rb
150
+ - lib/hecks/adapters/driving/ruby/chapter.rb
151
+ - lib/hecks/adapters/driving/usage_cache.rb
121
152
  - lib/hecks/behaviors.rb
122
153
  - lib/hecks/behaviors/dsl.rb
123
154
  - lib/hecks/behaviors/expectations.rb
@@ -141,6 +172,7 @@ files:
141
172
  - lib/hecks/bench/workload.rb
142
173
  - lib/hecks/bluebook.rb
143
174
  - lib/hecks/bluebook/aggregate.rb
175
+ - lib/hecks/bluebook/ask_resolution.rb
144
176
  - lib/hecks/bluebook/assembly.rb
145
177
  - lib/hecks/bluebook/assembly/aggregate_assembly.rb
146
178
  - lib/hecks/bluebook/assembly/build.rb
@@ -168,6 +200,7 @@ files:
168
200
  - lib/hecks/bluebook/behaviour/traits.rb
169
201
  - lib/hecks/bluebook/behaviour/value_object.rb
170
202
  - lib/hecks/bluebook/capabilities.rb
203
+ - lib/hecks/bluebook/capabilities/attribute_values.rb
171
204
  - lib/hecks/bluebook/chapter.rb
172
205
  - lib/hecks/bluebook/command.rb
173
206
  - lib/hecks/bluebook/domain_port.rb
@@ -187,8 +220,10 @@ files:
187
220
  - lib/hecks/bluebook/dsl/bluebook_builder.rb
188
221
  - lib/hecks/bluebook/dsl/bluebook_builder/pending_givens.rb
189
222
  - lib/hecks/bluebook/dsl/bluebook_builder/validation.rb
223
+ - lib/hecks/bluebook/dsl/bluebook_builder/validation/computed_sources.rb
190
224
  - lib/hecks/bluebook/dsl/bluebook_builder/validation/correlation_keys.rb
191
225
  - lib/hecks/bluebook/dsl/bluebook_builder/validation/event_shapes.rb
226
+ - lib/hecks/bluebook/dsl/bluebook_builder/validation/fan_out_rows.rb
192
227
  - lib/hecks/bluebook/dsl/bluebook_builder/validation/hop_tails.rb
193
228
  - lib/hecks/bluebook/dsl/bluebook_builder/validation/projected_fields.rb
194
229
  - lib/hecks/bluebook/dsl/bluebook_builder/validation/provisions.rb
@@ -199,6 +234,7 @@ files:
199
234
  - lib/hecks/bluebook/dsl/command_builder.rb
200
235
  - lib/hecks/bluebook/dsl/command_builder/implicit_attributes.rb
201
236
  - lib/hecks/bluebook/dsl/command_builder/mutations.rb
237
+ - lib/hecks/bluebook/dsl/command_builder/operands.rb
202
238
  - lib/hecks/bluebook/dsl/command_builder/owner.rb
203
239
  - lib/hecks/bluebook/dsl/command_builder/rules.rb
204
240
  - lib/hecks/bluebook/dsl/const_shim.rb
@@ -275,9 +311,11 @@ files:
275
311
  - lib/hecks/bluebook/meta_validator/verdict_cache/tagging.rb
276
312
  - lib/hecks/bluebook/meta_validator/world_judge.rb
277
313
  - lib/hecks/bluebook/model_check.rb
314
+ - lib/hecks/bluebook/model_check/ask_checks.rb
278
315
  - lib/hecks/bluebook/model_check/client_profile.rb
279
316
  - lib/hecks/bluebook/model_check/lifecycle_checks.rb
280
317
  - lib/hecks/bluebook/model_check/policy_checks.rb
318
+ - lib/hecks/bluebook/model_check/reference_checks.rb
281
319
  - lib/hecks/bluebook/model_check/saga_checks.rb
282
320
  - lib/hecks/bluebook/model_check/verbs.rb
283
321
  - lib/hecks/bluebook/pattern_subset.rb
@@ -376,36 +414,6 @@ files:
376
414
  - lib/hecks/doc/reference/harvester.rb
377
415
  - lib/hecks/doc/reference/readme.rb
378
416
  - lib/hecks/doc/reference/rendering.rb
379
- - lib/hecks/doors.rb
380
- - lib/hecks/doors/cli_door.rb
381
- - lib/hecks/doors/cli_door/nesting.rb
382
- - lib/hecks/doors/cli_door/shorthand.rb
383
- - lib/hecks/doors/cli_runner.rb
384
- - lib/hecks/doors/cli_runner/answers.rb
385
- - lib/hecks/doors/cli_runner/resolution.rb
386
- - lib/hecks/doors/cli_runner/settling.rb
387
- - lib/hecks/doors/cli_runner/streaming.rb
388
- - lib/hecks/doors/cli_runner/suggestions.rb
389
- - lib/hecks/doors/command_request.rb
390
- - lib/hecks/doors/handle.rb
391
- - lib/hecks/doors/json_door.rb
392
- - lib/hecks/doors/launcher_options.rb
393
- - lib/hecks/doors/mcp_door.rb
394
- - lib/hecks/doors/mcp_door/properties.rb
395
- - lib/hecks/doors/mcp_door/tool_calls.rb
396
- - lib/hecks/doors/mcp_door/tool_definitions.rb
397
- - lib/hecks/doors/mcp_door/tool_definitions/auditing.rb
398
- - lib/hecks/doors/mcp_door/tool_definitions/calling.rb
399
- - lib/hecks/doors/mcp_door/tool_definitions/reading.rb
400
- - lib/hecks/doors/mcp_door_scope.rb
401
- - lib/hecks/doors/mcp_door_scope/argument_policy.rb
402
- - lib/hecks/doors/mcp_door_scope/env_problems.rb
403
- - lib/hecks/doors/mcp_door_scope/presenter.rb
404
- - lib/hecks/doors/mcp_guide_cache.rb
405
- - lib/hecks/doors/ruby_door.rb
406
- - lib/hecks/doors/ruby_door/aggregate_door.rb
407
- - lib/hecks/doors/ruby_door/chapter.rb
408
- - lib/hecks/doors/usage_cache.rb
409
417
  - lib/hecks/embryonaut_bluebook.rb
410
418
  - lib/hecks/embryonaut_bluebook/lock.rb
411
419
  - lib/hecks/embryonaut_bluebook/manifest.rb
@@ -575,6 +583,8 @@ files:
575
583
  - lib/hecks/hecks/adapters/codebase/corpus_tasks.rb
576
584
  - lib/hecks/hecks/adapters/codebase/gate.rb
577
585
  - lib/hecks/hecks/adapters/codebase/gem_registry.rb
586
+ - lib/hecks/hecks/adapters/codebase/inspection.rb
587
+ - lib/hecks/hecks/adapters/codebase/inspection/rubycritic.rb
578
588
  - lib/hecks/hecks/adapters/codebase/kernel_tables.rb
579
589
  - lib/hecks/hecks/adapters/codebase/language.rb
580
590
  - lib/hecks/hecks/adapters/codebase/language/edits.rb
@@ -638,6 +648,21 @@ files:
638
648
  - lib/hecks/hecks/adapters/pg_admin/ownership.rb
639
649
  - lib/hecks/hecks/adapters/process_pool.adapter
640
650
  - lib/hecks/hecks/adapters/process_pool.rb
651
+ - lib/hecks/hecks/adapters/rehearsal.rb
652
+ - lib/hecks/hecks/adapters/rehearsal/audit_report.rb
653
+ - lib/hecks/hecks/adapters/rehearsal/census.rb
654
+ - lib/hecks/hecks/adapters/rehearsal/declaration.rb
655
+ - lib/hecks/hecks/adapters/rehearsal/environment.rb
656
+ - lib/hecks/hecks/adapters/rehearsal/inquiry.rb
657
+ - lib/hecks/hecks/adapters/rehearsal/memory_store.rb
658
+ - lib/hecks/hecks/adapters/rehearsal/postgres_census.rb
659
+ - lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb
660
+ - lib/hecks/hecks/adapters/rehearsal/postgres_store.rb
661
+ - lib/hecks/hecks/adapters/rehearsal/rows.rb
662
+ - lib/hecks/hecks/adapters/rehearsal/rust_audit.rb
663
+ - lib/hecks/hecks/adapters/rehearsal/subject.rb
664
+ - lib/hecks/hecks/adapters/rehearsal_store.adapter
665
+ - lib/hecks/hecks/adapters/rehearsal_store.rb
641
666
  - lib/hecks/hecks/adapters/rust_toolchain.adapter
642
667
  - lib/hecks/hecks/adapters/rust_toolchain.rb
643
668
  - lib/hecks/hecks/adapters/rust_workspace.rb
@@ -663,8 +688,11 @@ files:
663
688
  - lib/hecks/hecks/hecks.bluebook
664
689
  - lib/hecks/hecks/hecks.hecksagon
665
690
  - lib/hecks/hecks/hecks.world
691
+ - lib/hecks/hecks/rehearsal.bluebook
666
692
  - lib/hecks/hecks/site.behaviors
667
693
  - lib/hecks/hecks/site.world
694
+ - lib/hecks/hecks/tooling.bluebook
695
+ - lib/hecks/indifferent_key.rb
668
696
  - lib/hecks/ir.rb
669
697
  - lib/hecks/kernel_capabilities.rb
670
698
  - lib/hecks/kernel_capabilities/templates.rb
@@ -1048,35 +1076,91 @@ files:
1048
1076
  - lib/hecks/projections/site/admin_cms/templates/users.rb
1049
1077
  - lib/hecks/projections/site/cms_editor.rb
1050
1078
  - lib/hecks/projections/site/cms_editor/attributes.rb
1079
+ - lib/hecks/projections/site/cms_editor/blocks.rb
1051
1080
  - lib/hecks/projections/site/cms_editor/checks.rb
1081
+ - lib/hecks/projections/site/cms_editor/clearing.rb
1082
+ - lib/hecks/projections/site/cms_editor/color.rb
1083
+ - lib/hecks/projections/site/cms_editor/composition.rb
1084
+ - lib/hecks/projections/site/cms_editor/destructive.rb
1085
+ - lib/hecks/projections/site/cms_editor/drafts.rb
1086
+ - lib/hecks/projections/site/cms_editor/hints.rb
1087
+ - lib/hecks/projections/site/cms_editor/icons.rb
1088
+ - lib/hecks/projections/site/cms_editor/key_kinds.rb
1089
+ - lib/hecks/projections/site/cms_editor/limits.rb
1052
1090
  - lib/hecks/projections/site/cms_editor/media.rb
1091
+ - lib/hecks/projections/site/cms_editor/moment.rb
1092
+ - lib/hecks/projections/site/cms_editor/palette.rb
1093
+ - lib/hecks/projections/site/cms_editor/pickers.rb
1053
1094
  - lib/hecks/projections/site/cms_editor/pretty.rb
1095
+ - lib/hecks/projections/site/cms_editor/preview.rb
1096
+ - lib/hecks/projections/site/cms_editor/relations.rb
1097
+ - lib/hecks/projections/site/cms_editor/scale_checks.rb
1098
+ - lib/hecks/projections/site/cms_editor/scheduling.rb
1054
1099
  - lib/hecks/projections/site/cms_editor/schema.rb
1055
1100
  - lib/hecks/projections/site/cms_editor/setting.rb
1101
+ - lib/hecks/projections/site/cms_editor/targets.rb
1056
1102
  - lib/hecks/projections/site/cms_editor/templates/package.json.tmpl
1057
1103
  - lib/hecks/projections/site/cms_editor/templates/src/app.ts.tmpl
1104
+ - lib/hecks/projections/site/cms_editor/templates/src/assets.ts.tmpl
1058
1105
  - lib/hecks/projections/site/cms_editor/templates/src/auth/membership.ts.tmpl
1059
1106
  - lib/hecks/projections/site/cms_editor/templates/src/auth/session.ts.tmpl
1060
1107
  - lib/hecks/projections/site/cms_editor/templates/src/auth/sso.ts.tmpl
1108
+ - lib/hecks/projections/site/cms_editor/templates/src/browser/app.css.tmpl
1109
+ - lib/hecks/projections/site/cms_editor/templates/src/browser/autosave.js.tmpl
1110
+ - lib/hecks/projections/site/cms_editor/templates/src/browser/blocks.js.tmpl
1111
+ - lib/hecks/projections/site/cms_editor/templates/src/browser/body_doc.js.tmpl
1112
+ - lib/hecks/projections/site/cms_editor/templates/src/browser/body_editor.js.tmpl
1113
+ - lib/hecks/projections/site/cms_editor/templates/src/browser/epoch.js.tmpl
1114
+ - lib/hecks/projections/site/cms_editor/templates/src/browser/forms.js.tmpl
1115
+ - lib/hecks/projections/site/cms_editor/templates/src/browser/lists.js.tmpl
1116
+ - lib/hecks/projections/site/cms_editor/templates/src/browser/main.js.tmpl
1117
+ - lib/hecks/projections/site/cms_editor/templates/src/browser/media_picker.js.tmpl
1118
+ - lib/hecks/projections/site/cms_editor/templates/src/browser/moments.js.tmpl
1119
+ - lib/hecks/projections/site/cms_editor/templates/src/browser/pickers.js.tmpl
1120
+ - lib/hecks/projections/site/cms_editor/templates/src/browser/preview.js.tmpl
1121
+ - lib/hecks/projections/site/cms_editor/templates/src/browser/shell.js.tmpl
1122
+ - lib/hecks/projections/site/cms_editor/templates/src/browser/toast.js.tmpl
1123
+ - lib/hecks/projections/site/cms_editor/templates/src/choices.ts.tmpl
1061
1124
  - lib/hecks/projections/site/cms_editor/templates/src/commands.ts.tmpl
1062
1125
  - lib/hecks/projections/site/cms_editor/templates/src/config.ts.tmpl
1126
+ - lib/hecks/projections/site/cms_editor/templates/src/flash.ts.tmpl
1063
1127
  - lib/hecks/projections/site/cms_editor/templates/src/host.ts.tmpl
1064
1128
  - lib/hecks/projections/site/cms_editor/templates/src/media/handler.ts.tmpl
1065
1129
  - lib/hecks/projections/site/cms_editor/templates/src/media/multipart.ts.tmpl
1066
1130
  - lib/hecks/projections/site/cms_editor/templates/src/media/sniff.ts.tmpl
1067
1131
  - lib/hecks/projections/site/cms_editor/templates/src/media/storage.ts.tmpl
1132
+ - lib/hecks/projections/site/cms_editor/templates/src/names.ts.tmpl
1068
1133
  - lib/hecks/projections/site/cms_editor/templates/src/schema.ts.tmpl
1069
1134
  - lib/hecks/projections/site/cms_editor/templates/src/server.ts.tmpl
1135
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/availability.ts.tmpl
1136
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/block_list.js.tmpl
1137
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/blocks.ts.tmpl
1070
1138
  - lib/hecks/projections/site/cms_editor/templates/src/ui/body_model.js.tmpl
1071
1139
  - lib/hecks/projections/site/cms_editor/templates/src/ui/body_parse.js.tmpl
1072
- - lib/hecks/projections/site/cms_editor/templates/src/ui/body_widget.js.tmpl
1140
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/detail.ts.tmpl
1141
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/dialogs.ts.tmpl
1073
1142
  - lib/hecks/projections/site/cms_editor/templates/src/ui/fields.ts.tmpl
1074
1143
  - lib/hecks/projections/site/cms_editor/templates/src/ui/html.ts.tmpl
1144
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/icons.ts.tmpl
1075
1145
  - lib/hecks/projections/site/cms_editor/templates/src/ui/input.ts.tmpl
1076
- - lib/hecks/projections/site/cms_editor/templates/src/ui/media_picker.js.tmpl
1146
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/links.ts.tmpl
1147
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/moments.ts.tmpl
1077
1148
  - lib/hecks/projections/site/cms_editor/templates/src/ui/outline.ts.tmpl
1078
1149
  - lib/hecks/projections/site/cms_editor/templates/src/ui/pages.ts.tmpl
1150
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/paging.ts.tmpl
1151
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/pickers.ts.tmpl
1152
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/preview.ts.tmpl
1153
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/related.ts.tmpl
1154
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/schedule.ts.tmpl
1155
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/shell.ts.tmpl
1156
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/table.ts.tmpl
1157
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/theme.js.tmpl
1158
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/values.ts.tmpl
1159
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/words.ts.tmpl
1160
+ - lib/hecks/projections/site/cms_editor/templates/src/ui/world.ts.tmpl
1079
1161
  - lib/hecks/projections/site/cms_editor/templates/tsconfig.json.tmpl
1162
+ - lib/hecks/projections/site/cms_editor/theme.rb
1163
+ - lib/hecks/projections/site/cms_editor/theme_checks.rb
1080
1164
  - lib/hecks/projections/site/edge.rb
1081
1165
  - lib/hecks/projections/site/edge/behaviours.rb
1082
1166
  - lib/hecks/projections/site/edge/checks.rb
@@ -1137,6 +1221,7 @@ files:
1137
1221
  - lib/hecks/projector/docs_projector/closing.rb
1138
1222
  - lib/hecks/projector/exporter.rb
1139
1223
  - lib/hecks/projector/exporter/bindings.rb
1224
+ - lib/hecks/projector/exporter/capability_values.rb
1140
1225
  - lib/hecks/projector/exporter/translations.rb
1141
1226
  - lib/hecks/projector/ir_projector.rb
1142
1227
  - lib/hecks/projector/narrate_projector.rb
@@ -1250,6 +1335,7 @@ files:
1250
1335
  - lib/hecks/query_specification/field_path.rb
1251
1336
  - lib/hecks/query_specification/hop_path.rb
1252
1337
  - lib/hecks/query_specification/read_model/specification.rb
1338
+ - lib/hecks/release/approval.rb
1253
1339
  - lib/hecks/release/gem_pin.rb
1254
1340
  - lib/hecks/release/gem_pin/published_versions.rb
1255
1341
  - lib/hecks/release/lane.rb
@@ -1268,12 +1354,13 @@ files:
1268
1354
  - lib/hecks/release/runner/tagger.rb
1269
1355
  - lib/hecks/rendering.rb
1270
1356
  - lib/hecks/router.rb
1271
- - lib/hecks/router/door.rb
1357
+ - lib/hecks/router/aggregate_reader.rb
1272
1358
  - lib/hecks/router/namespace_installer.rb
1273
1359
  - lib/hecks/router/options_proxy.rb
1274
1360
  - lib/hecks/runtime.rb
1275
1361
  - lib/hecks/runtime/adapter_lookup.rb
1276
1362
  - lib/hecks/runtime/aggregate_lock.rb
1363
+ - lib/hecks/runtime/best_effort.rb
1277
1364
  - lib/hecks/runtime/boot_gates.rb
1278
1365
  - lib/hecks/runtime/caller.rb
1279
1366
  - lib/hecks/runtime/capability_graph.rb
@@ -1348,6 +1435,7 @@ files:
1348
1435
  - lib/hecks/runtime/reference_hop.rb
1349
1436
  - lib/hecks/runtime/refusal_wording.rb
1350
1437
  - lib/hecks/runtime/registry.rb
1438
+ - lib/hecks/runtime/registry/ask_verification.rb
1351
1439
  - lib/hecks/runtime/registry/chapter_verification.rb
1352
1440
  - lib/hecks/runtime/registry/declarations.rb
1353
1441
  - lib/hecks/runtime/registry/durability_warnings.rb
@@ -1402,6 +1490,7 @@ files:
1402
1490
  - lib/hecks/rust_build/wasm.rb
1403
1491
  - lib/hecks/rust_build/wasm_browser.rb
1404
1492
  - lib/hecks/rust_build/write_if_changed.rb
1493
+ - lib/hecks/served_options.rb
1405
1494
  - lib/hecks/site/bluebook/site.bluebook
1406
1495
  - lib/hecks/site/bluebook/site.hecksagon
1407
1496
  - lib/hecks/site/bluebook/site.ports.hecksagon
@@ -1507,12 +1596,20 @@ files:
1507
1596
  - lib/hecks/vendoring/git_source.rb
1508
1597
  - lib/hecks/version.rb
1509
1598
  - lib/hecks/vocabulary.rb
1599
+ - lib/rubocop/cop/hecks/env_dump.rb
1510
1600
  - lib/rubocop/cop/hecks/fallback_hash_lookup.rb
1601
+ - lib/rubocop/cop/hecks/monotonic_duration.rb
1602
+ - lib/rubocop/cop/hecks/no_wall_clock_in_runtime.rb
1603
+ - lib/rubocop/cop/hecks/raw_shell_interpolation.rb
1511
1604
  - lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb
1605
+ - lib/rubocop/cop/hecks/sleep_in_spec.rb
1606
+ - lib/rubocop/cop/hecks/swallowed_rescue.rb
1607
+ - lib/rubocop/cop/hecks/symbol_string_key_mix.rb
1512
1608
  - lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb
1513
- - prebuilt/c28d6d9db14eea3e17161e9d9c262efee30b256cf97693a7cfd552bce24b2f7f.marshal
1514
- - prebuilt/cb375cba61ca0dbe8ddb9739c306510fe05e5f4b7a9b6955caff8224c63ea0e0.marshal
1515
- - prebuilt/verdicts-d6d584ad43b5f3cebf88aafbbdbf024c38574acf18e06adffbc555f7786b1c2f.json
1609
+ - lib/rubocop/cop/hecks/untyped_raise.rb
1610
+ - prebuilt/05c358d38d661a3774f813d49c66f5b68939af94432d66257a56f49ee2598994.marshal
1611
+ - prebuilt/26c40c61f09b09b11651c64668eda3ceb180f83cf2a3802d3033d2fd99ac841b.marshal
1612
+ - prebuilt/verdicts-230ac18c25abfd3d92ede032bee2661a4c2cd2773ab0cf0e2ae52546ba2f7af9.json
1516
1613
  - qa/settings.yml
1517
1614
  - rust/.cargo/config.toml
1518
1615
  - rust/.cargo/mutants.toml
@@ -1523,6 +1620,7 @@ files:
1523
1620
  - rust/build/.gitignore
1524
1621
  - rust/build/Cargo.lock
1525
1622
  - rust/build/Cargo.toml
1623
+ - rust/build/src/binding_pass.rs
1526
1624
  - rust/build/src/build_artifact.rs
1527
1625
  - rust/build/src/cargo_sync.rs
1528
1626
  - rust/build/src/lineage_pass.rs
@@ -1531,12 +1629,15 @@ files:
1531
1629
  - rust/build/src/reserved_names.rs
1532
1630
  - rust/build/src/resolve.rs
1533
1631
  - rust/build/src/root.rs
1632
+ - rust/build/src/seams_pass.rs
1534
1633
  - rust/build/src/subprocess.rs
1535
1634
  - rust/build/src/tmp.rs
1635
+ - rust/build/src/translation_pass.rs
1536
1636
  - rust/codegen/.cargo/config.toml
1537
1637
  - rust/codegen/.gitignore
1538
1638
  - rust/codegen/Cargo.lock
1539
1639
  - rust/codegen/Cargo.toml
1640
+ - rust/codegen/src/asks.rs
1540
1641
  - rust/codegen/src/attr.rs
1541
1642
  - rust/codegen/src/bridging.rs
1542
1643
  - rust/codegen/src/commands.rs
@@ -1579,6 +1680,7 @@ files:
1579
1680
  - rust/host/src/bin/expr_harness.rs
1580
1681
  - rust/host/src/bin/lineage_harness.rs
1581
1682
  - rust/host/src/bin/mint_harness.rs
1683
+ - rust/host/src/bin/validate_harness.rs
1582
1684
  - rust/host/src/boot.rs
1583
1685
  - rust/host/src/boundary_fuzz/api.rs
1584
1686
  - rust/host/src/boundary_fuzz/auth.rs
@@ -1,34 +0,0 @@
1
- module Hecks
2
- module Doors
3
- module CliDoor
4
- # Sets values into the nested argument Hash a dotted path names, creating the intermediate
5
- # Hashes on the way.
6
- module Nesting
7
- module_function
8
-
9
- # Appends one element to a list argument, creating the list on first use.
10
- #
11
- # Repeats must grow the list (`bury` would silently keep only the last), and a single
12
- # element is still a one-item list, since a `list_of` attribute must never see a bare
13
- # object. Multi-field elements are left to `JsonDoor`: a flat command line cannot say
14
- # which `a.x=` pairs with which `a.y=`.
15
- def append(hash, path, value)
16
- *branches, leaf = path.map(&:to_sym)
17
- holder = branches[0..-2].reduce(hash) { |node, key| node[key] ||= {} }
18
- list = holder[branches.last] ||= []
19
-
20
- list << { leaf => value }
21
- hash
22
- end
23
-
24
- # Sets one value at a nested path, creating intermediate Hashes and overwriting the leaf.
25
- def bury(hash, path, value)
26
- *branches, leaf = path.map(&:to_sym)
27
- target = branches.reduce(hash) { |node, key| node[key] ||= {} }
28
- target[leaf] = value
29
- hash
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,85 +0,0 @@
1
- module Hecks
2
- module Doors
3
- module CliDoor
4
- # Rewrites the shorthand spellings of a command line into plain `name=value` words.
5
- module Shorthand
6
- module_function
7
-
8
- # Rewrites the short forms into `name=value`: `--name` for a Boolean (a following `yes`,
9
- # `no`, `true`, `false`, `on`, `off`, `1` or `0` is that flag's value, not an argument),
10
- # `--name=value` as `name=value`, and one bare word as the command's first argument
11
- # (`to` for a command on an existing aggregate, the first attribute for one that creates).
12
- def normalize(spec, words, options)
13
- pairs, bare = collect(words, options)
14
- raise Runtime::NotFound, too_many_bare(bare) if bare.length > 1
15
-
16
- pairs.map { |pair| bare.include?(pair) && !pair.include?("=") ? positional(pair, spec) : pair }
17
- end
18
-
19
- # Every word as a pair, and the words that were neither a flag nor a pair.
20
- def collect(words, options)
21
- queue = words.dup
22
- pairs = []
23
- bare = []
24
- until queue.empty?
25
- word = queue.shift
26
- pairs << pair_for(word, queue, options)
27
- bare << word if bare_word?(word)
28
- end
29
- [pairs, bare]
30
- end
31
-
32
- # A word that is neither a `--flag` nor a `name=value` pair.
33
- def bare_word?(word)
34
- !word.start_with?("--") && !word.include?("=")
35
- end
36
-
37
- # One word as a `name=value` pair; a `--flag` takes the Boolean word that follows it from
38
- # `queue`.
39
- def pair_for(word, queue, options)
40
- return word unless word.start_with?("--")
41
- return underscored(word.delete_prefix("--"), options) if word.include?("=")
42
-
43
- path = flag(word.delete_prefix("--"), options)
44
- value = BOOLEAN_WORDS.key?(queue.first.to_s.downcase) ? queue.shift : "true"
45
- "#{path}=#{value}"
46
- end
47
-
48
- # A `name=value` pair whose name is spelled with dashes (`seed-start=3`), as the argument
49
- # spelled with underscores, unless an argument is named with the dashes.
50
- def underscored(pair, options)
51
- name, value = pair.split("=", 2)
52
- options.key?(name) ? pair : "#{name.tr("-", "_")}=#{value}"
53
- end
54
-
55
- # A `--name` flag, as the path of the Boolean argument it stands for. A dashed name
56
- # (`--gem-only`) is the argument spelled with underscores (`gem_only`).
57
- def flag(name, options)
58
- name = name.tr("-", "_") unless options.key?(name) || options.keys.any? { |key| key.start_with?("#{name}.") }
59
- path = options.key?(name) ? name : CliDoor.expand(name, options)
60
- return path if options.dig(path, :type) == "Boolean"
61
-
62
- raise Runtime::NotFound, "--#{name} is a flag, but this command has no Boolean argument #{name.inspect}"
63
- end
64
-
65
- # The one bare word, as a pair for the command's first argument the launcher does not mint.
66
- def positional(word, spec)
67
- first = spec[:arguments].find { |argument| !argument[:minted] }
68
- return "#{first[:path]}=#{word}" if first
69
-
70
- if spec[:arguments].any?
71
- raise Runtime::NotFound, "#{word.inspect} is not name=value; this command's only argument is its run " \
72
- "key, which is minted when omitted (run=<key> names one)"
73
- end
74
-
75
- raise Runtime::NotFound, "#{word.inspect} is not name=value, and this command takes no arguments"
76
- end
77
-
78
- # Words the refusal for more than one unnamed argument.
79
- def too_many_bare(bare)
80
- "only one argument may go unnamed, not #{bare.map(&:inspect).join(", ")}; name the rest as name=value"
81
- end
82
- end
83
- end
84
- end
85
- end
@@ -1,124 +0,0 @@
1
- require_relative "../runtime/errors"
2
-
3
- module Hecks
4
- module Doors
5
- # Turns `path=value` command-line words into a nested, typed argument Hash.
6
- # Types come from the projection, never from guessing at the value ("99" may be a String).
7
- module CliDoor
8
- # The words a Boolean is spelled with, and what each means.
9
- BOOLEAN_WORDS = { "true" => true, "yes" => true, "1" => true, "on" => true,
10
- "false" => false, "no" => false, "0" => false, "off" => false }.freeze
11
-
12
- module_function
13
-
14
- # Builds a command's nested, typed argument Hash from its `name=value` words.
15
- #
16
- # arguments(spec, ["reference.value=A-1", "sequence.value=99"])
17
- # # => { reference: { value: "A-1" }, sequence: { value: 99 } }
18
- #
19
- # @param spec [Hash{Symbol => Object}] one command's entry from `Projector::CliProjector`
20
- # @param pairs [Array<String>] the words after the command: `name=value` pairs, where a path
21
- # may be the short form of a single-field value object (`reference` for `reference.value`);
22
- # `--name` for a Boolean; and at most one bare word, which fills the first argument
23
- # @return [Hash{Symbol => Object}] the arguments nested by path, leaves cast to type
24
- # @raise [Runtime::NotFound] if a path, flag or bare word does not fit the command
25
- # @raise [Runtime::TypeMismatch] if a value does not parse as its Integer or Float
26
- def arguments(spec, pairs)
27
- options = declared_options(spec)
28
- Shorthand.normalize(spec, pairs, options).each_with_object({}) { |pair, args| store(args, pair, options) }
29
- end
30
-
31
- # Every argument the command accepts, by path. Extra accepted arguments stay out of help,
32
- # which teaches only to=....
33
- def declared_options(spec)
34
- (spec[:arguments] + Array(spec[:legacy_arguments])).to_h { |argument| [argument[:path], argument] }
35
- end
36
-
37
- # Casts the value of one `name=value` pair and sets it into `args` at its path.
38
- def store(args, pair, options)
39
- path, value = split(pair)
40
- full, argument = declared_argument(path, options)
41
- keys = full.split(".")
42
- return words(args, keys, value, argument[:type]) if argument[:words]
43
- return Nesting.append(args, keys, cast(value, argument[:type])) if argument[:list]
44
-
45
- Nesting.bury(args, keys, cast(value, argument[:type]))
46
- end
47
-
48
- # The full path and declaration of the argument `path` names, expanding a value object's
49
- # short form. `key?` rather than `||`, so the lookup honors the same spelling `full` chose.
50
- def declared_argument(path, options)
51
- full = options.key?(path) ? path : expand(path, options)
52
- return [full, options[full]] if options.key?(full)
53
-
54
- raise Runtime::NotFound, unknown(path, options.keys)
55
- end
56
-
57
- # Cuts one word at its first `=`, so a value may itself contain `=`.
58
- def split(pair)
59
- name, value = pair.split("=", 2)
60
- raise Runtime::NotFound, "#{pair.inspect} is not name=value" if value.nil?
61
-
62
- [name, value]
63
- end
64
-
65
- # Expands a bare value-object name into the path of its only field.
66
- # Left unchanged when several fields match, since guessing which was meant is worse.
67
- def expand(path, options)
68
- candidates = options.keys.select { |key| key.start_with?("#{path}.") }
69
- candidates.length == 1 ? candidates.first : path
70
- end
71
-
72
- # Converts one value to its declared type; only Integer, Float and Boolean convert.
73
- def cast(value, type)
74
- case type
75
- when "Integer" then Integer(value)
76
- when "Float" then Float(value)
77
- when "Boolean" then boolean(value)
78
- else value
79
- end
80
- rescue ArgumentError
81
- raise Runtime::TypeMismatch, "#{value.inspect} is not #{type} — the chapter declares this field as #{type}"
82
- end
83
-
84
- # Reads a Boolean word: `true`, `yes`, `1` or `on` is true; `false`, `no`, `0` or `off` is
85
- # false; case does not matter. Anything else is refused, since guessing would turn a typo
86
- # (`dry_run=ture`) into a silent false.
87
- #
88
- # @param value [String] the word
89
- # @return [Boolean]
90
- # @raise [Runtime::TypeMismatch] if the word is not one of those eight
91
- def boolean(value)
92
- BOOLEAN_WORDS.fetch(value.to_s.downcase) do
93
- raise Runtime::TypeMismatch,
94
- "#{value.inspect} is not Boolean — use true, false, yes, no, 1, 0, on or off"
95
- end
96
- end
97
-
98
- # Adds the words of a `list_of` scalar argument to its Array: a comma-separated value is
99
- # several elements and a repeated name adds more, each cast to the element type. The
100
- # runtime refuses a lone scalar for a list, so the door is where every spelling becomes an
101
- # Array.
102
- #
103
- # @param hash [Hash{Symbol => Object}] the arguments built so far
104
- # @param path [Array<String>] the argument's dotted path
105
- # @param value [String] the word after `=`
106
- # @param type [String] the element type
107
- # @return [Hash{Symbol => Object}] `hash`
108
- def words(hash, path, value, type)
109
- *branches, leaf = path.map(&:to_sym)
110
- holder = branches.reduce(hash) { |node, key| node[key] ||= {} }
111
- list = holder[leaf] ||= []
112
- list.concat(value.split(",").map { |word| cast(word.strip, type) })
113
- hash
114
- end
115
-
116
- # Words the refusal for an argument the command does not take, listing what it does.
117
- def unknown(path, known)
118
- "no argument #{path.inspect} — this command takes #{known.sort.join(", ")}"
119
- end
120
- end
121
- end
122
- end
123
- require_relative "cli_door/nesting"
124
- require_relative "cli_door/shorthand"