hecks 0.2.0 → 0.3.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 (408) hide show
  1. checksums.yaml +5 -5
  2. data/lib/hecks/adapters/driven/claude_code.adapter +3 -0
  3. data/lib/hecks/adapters/driven/claude_code.rb +127 -0
  4. data/lib/hecks/adapters/driven/d1.adapter +12 -0
  5. data/lib/hecks/adapters/driven/d1.rb +403 -0
  6. data/lib/hecks/adapters/driven/folder.adapter +3 -0
  7. data/lib/hecks/adapters/driven/folder.rb +199 -0
  8. data/lib/hecks/adapters/driven/google_authentication.adapter +3 -0
  9. data/lib/hecks/adapters/driven/google_authentication.rb +100 -0
  10. data/lib/hecks/adapters/driven/governance_authorization.adapter +3 -0
  11. data/lib/hecks/adapters/driven/governance_authorization.rb +62 -0
  12. data/lib/hecks/adapters/driven/heki/journal.rb +51 -0
  13. data/lib/hecks/adapters/driven/heki/saga_store.rb +0 -0
  14. data/lib/hecks/adapters/driven/heki/snapshot.rb +38 -0
  15. data/lib/hecks/adapters/driven/heki.adapter +4 -0
  16. data/lib/hecks/adapters/driven/heki.rb +148 -0
  17. data/lib/hecks/adapters/driven/identity_registry.adapter +3 -0
  18. data/lib/hecks/adapters/driven/identity_registry.rb +26 -0
  19. data/lib/hecks/adapters/driven/in_memory_ordering.rb +51 -0
  20. data/lib/hecks/adapters/driven/lambda/client.rb +63 -0
  21. data/lib/hecks/adapters/driven/lambda.adapter +4 -0
  22. data/lib/hecks/adapters/driven/lambda.rb +131 -0
  23. data/lib/hecks/adapters/driven/memory.adapter +3 -0
  24. data/lib/hecks/adapters/driven/memory.rb +103 -0
  25. data/lib/hecks/adapters/driven/mock_stripe_adapter.adapter +3 -0
  26. data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +28 -0
  27. data/lib/hecks/adapters/driven/postgres/codec.rb +80 -0
  28. data/lib/hecks/adapters/driven/postgres/schema_builder.rb +168 -0
  29. data/lib/hecks/adapters/driven/postgres.adapter +5 -0
  30. data/lib/hecks/adapters/driven/postgres.rb +391 -0
  31. data/lib/hecks/adapters/driven/postgres_era/lineage/era_store.rb +171 -0
  32. data/lib/hecks/adapters/driven/postgres_era/lineage/field_cache.rb +190 -0
  33. data/lib/hecks/adapters/driven/postgres_era/lineage/head_compiler.rb +429 -0
  34. data/lib/hecks/adapters/driven/postgres_era/lineage/mint_transaction.rb +166 -0
  35. data/lib/hecks/adapters/driven/postgres_era/lineage/provisioning.rb +286 -0
  36. data/lib/hecks/adapters/driven/postgres_era/lineage/resumable_backfill.rb +168 -0
  37. data/lib/hecks/adapters/driven/postgres_era/lineage/tail_merge.rb +163 -0
  38. data/lib/hecks/adapters/driven/postgres_era/lineage/transform_installer.rb +114 -0
  39. data/lib/hecks/adapters/driven/postgres_era/lineage.rb +137 -0
  40. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/coverage_check.rb +89 -0
  41. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolver.rb +82 -0
  42. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/merge_coordinator.rb +43 -0
  43. data/lib/hecks/adapters/driven/postgres_era/lineage_manager/minter.rb +132 -0
  44. data/lib/hecks/adapters/driven/postgres_era/lineage_manager.rb +74 -0
  45. data/lib/hecks/adapters/driven/postgres_era.adapter +6 -0
  46. data/lib/hecks/adapters/driven/postgres_era.rb +671 -0
  47. data/lib/hecks/adapters/driven/prism.adapter +3 -0
  48. data/lib/hecks/adapters/driven/prism.rb +80 -0
  49. data/lib/hecks/adapters/driven/secure_random_identity.adapter +3 -0
  50. data/lib/hecks/adapters/driven/secure_random_identity.rb +14 -0
  51. data/lib/hecks/adapters/driven/sql_query_builder.rb +221 -0
  52. data/lib/hecks/adapters/driven/sqlite/codec.rb +63 -0
  53. data/lib/hecks/adapters/driven/sqlite/projection.rb +105 -0
  54. data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +180 -0
  55. data/lib/hecks/adapters/driven/sqlite.adapter +9 -0
  56. data/lib/hecks/adapters/driven/sqlite.rb +285 -0
  57. data/lib/hecks/adapters/driven/system_clock.adapter +3 -0
  58. data/lib/hecks/adapters/driven/system_clock.rb +14 -0
  59. data/lib/hecks/adapters/driven.rb +36 -0
  60. data/lib/hecks/adapters.rb +6 -0
  61. data/lib/hecks/behaviors/dsl.rb +96 -0
  62. data/lib/hecks/behaviors/expectations.rb +280 -0
  63. data/lib/hecks/behaviors/ir.rb +31 -0
  64. data/lib/hecks/behaviors/rspec.rb +42 -0
  65. data/lib/hecks/behaviors/runner.rb +96 -0
  66. data/lib/hecks/behaviors.rb +25 -0
  67. data/lib/hecks/bluebook/aggregate.rb +108 -0
  68. data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +134 -0
  69. data/lib/hecks/bluebook/assembly/build.rb +48 -0
  70. data/lib/hecks/bluebook/assembly/contract.rb +112 -0
  71. data/lib/hecks/bluebook/assembly/contracts.rb +409 -0
  72. data/lib/hecks/bluebook/assembly/marks.rb +227 -0
  73. data/lib/hecks/bluebook/assembly/specializer.rb +70 -0
  74. data/lib/hecks/bluebook/assembly.rb +78 -0
  75. data/lib/hecks/bluebook/attribute.rb +96 -0
  76. data/lib/hecks/bluebook/behaviour/aggregate.rb +83 -0
  77. data/lib/hecks/bluebook/behaviour/attribute.rb +27 -0
  78. data/lib/hecks/bluebook/behaviour/chapter.rb +72 -0
  79. data/lib/hecks/bluebook/behaviour/command.rb +116 -0
  80. data/lib/hecks/bluebook/behaviour/domain_port.rb +25 -0
  81. data/lib/hecks/bluebook/behaviour/entity.rb +59 -0
  82. data/lib/hecks/bluebook/behaviour/hexagon.rb +50 -0
  83. data/lib/hecks/bluebook/behaviour/lifecycle.rb +51 -0
  84. data/lib/hecks/bluebook/behaviour/policy.rb +52 -0
  85. data/lib/hecks/bluebook/behaviour/process_manager.rb +38 -0
  86. data/lib/hecks/bluebook/behaviour/query.rb +10 -0
  87. data/lib/hecks/bluebook/behaviour/read_model.rb +29 -0
  88. data/lib/hecks/bluebook/behaviour/traits.rb +81 -0
  89. data/lib/hecks/bluebook/behaviour/value_object.rb +33 -0
  90. data/lib/hecks/bluebook/chapter.rb +68 -0
  91. data/lib/hecks/bluebook/command.rb +124 -0
  92. data/lib/hecks/bluebook/domain_port.rb +102 -0
  93. data/lib/hecks/bluebook/dsl/adapter_builder.rb +34 -0
  94. data/lib/hecks/bluebook/dsl/aggregate_builder.rb +906 -0
  95. data/lib/hecks/bluebook/dsl/attribute_collector.rb +327 -0
  96. data/lib/hecks/bluebook/dsl/binding_proxy.rb +71 -0
  97. data/lib/hecks/bluebook/dsl/bluebook_builder.rb +1018 -0
  98. data/lib/hecks/bluebook/dsl/command_builder.rb +626 -0
  99. data/lib/hecks/bluebook/dsl/const_shim.rb +81 -0
  100. data/lib/hecks/bluebook/dsl/domain_port_builder.rb +79 -0
  101. data/lib/hecks/bluebook/dsl/entity_builder.rb +305 -0
  102. data/lib/hecks/bluebook/dsl/generic_dispatch.rb +366 -0
  103. data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +163 -0
  104. data/lib/hecks/bluebook/dsl/identity_declaration.rb +191 -0
  105. data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +44 -0
  106. data/lib/hecks/bluebook/dsl/malformed.rb +7 -0
  107. data/lib/hecks/bluebook/dsl/policy_builder.rb +120 -0
  108. data/lib/hecks/bluebook/dsl/port_builder.rb +30 -0
  109. data/lib/hecks/bluebook/dsl/port_operation_builder.rb +142 -0
  110. data/lib/hecks/bluebook/dsl/process_manager_builder.rb +207 -0
  111. data/lib/hecks/bluebook/dsl/query_builder.rb +113 -0
  112. data/lib/hecks/bluebook/dsl/read_model_builder.rb +233 -0
  113. data/lib/hecks/bluebook/dsl/rule_reference.rb +172 -0
  114. data/lib/hecks/bluebook/dsl/translation_builder.rb +243 -0
  115. data/lib/hecks/bluebook/dsl/value_object_builder.rb +178 -0
  116. data/lib/hecks/bluebook/dsl/word_gate.rb +221 -0
  117. data/lib/hecks/bluebook/dsl/world_builder.rb +77 -0
  118. data/lib/hecks/bluebook/dsl.rb +45 -0
  119. data/lib/hecks/bluebook/entity.rb +103 -0
  120. data/lib/hecks/bluebook/expression/canonical_form.rb +55 -0
  121. data/lib/hecks/bluebook/expression/evaluator.rb +261 -0
  122. data/lib/hecks/bluebook/expression/projection.json +170 -0
  123. data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +233 -0
  124. data/lib/hecks/bluebook/expression/resolver.rb +630 -0
  125. data/lib/hecks/bluebook/expression.rb +13 -0
  126. data/lib/hecks/bluebook/hexagon.rb +60 -0
  127. data/lib/hecks/bluebook/lifecycle.rb +42 -0
  128. data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +54 -0
  129. data/lib/hecks/bluebook/meta_validator/judge.rb +559 -0
  130. data/lib/hecks/bluebook/meta_validator/plan.rb +332 -0
  131. data/lib/hecks/bluebook/meta_validator/port_judge.rb +47 -0
  132. data/lib/hecks/bluebook/meta_validator/readings.rb +350 -0
  133. data/lib/hecks/bluebook/meta_validator/reconstruction.rb +312 -0
  134. data/lib/hecks/bluebook/meta_validator/shapes.rb +246 -0
  135. data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +255 -0
  136. data/lib/hecks/bluebook/meta_validator/translation_judge.rb +138 -0
  137. data/lib/hecks/bluebook/meta_validator/world_judge.rb +78 -0
  138. data/lib/hecks/bluebook/meta_validator.rb +452 -0
  139. data/lib/hecks/bluebook/model_check.rb +318 -0
  140. data/lib/hecks/bluebook/pattern_subset.rb +120 -0
  141. data/lib/hecks/bluebook/policy.rb +41 -0
  142. data/lib/hecks/bluebook/process_manager.rb +86 -0
  143. data/lib/hecks/bluebook/project_discovery.rb +30 -0
  144. data/lib/hecks/bluebook/project_loader.rb +40 -0
  145. data/lib/hecks/bluebook/project_register.rb +82 -0
  146. data/lib/hecks/bluebook/query.rb +61 -0
  147. data/lib/hecks/bluebook/read_model.rb +109 -0
  148. data/lib/hecks/bluebook/reference.rb +74 -0
  149. data/lib/hecks/bluebook/smoke_test.rb +166 -0
  150. data/lib/hecks/bluebook/synthesizer.rb +95 -0
  151. data/lib/hecks/bluebook/translation.rb +92 -0
  152. data/lib/hecks/bluebook/value_object.rb +58 -0
  153. data/lib/hecks/bluebook.rb +74 -0
  154. data/lib/hecks/codemod.rb +342 -0
  155. data/lib/hecks/construct.rb +71 -0
  156. data/lib/hecks/deploy/bluebook/deploy.bluebook +219 -0
  157. data/lib/hecks/deploy/bluebook/deploy.hecksagon +4 -0
  158. data/lib/hecks/deploy/oidc.json +18 -0
  159. data/lib/hecks/doc/reference.rb +389 -0
  160. data/lib/hecks/embryonaut_bluebook.rb +75 -0
  161. data/lib/hecks/facade/cli_door.rb +116 -0
  162. data/lib/hecks/facade/cli_runner.rb +190 -0
  163. data/lib/hecks/facade/command_request.rb +105 -0
  164. data/lib/hecks/facade/handle.rb +173 -0
  165. data/lib/hecks/facade/json_door.rb +154 -0
  166. data/lib/hecks/facade/surface/aggregate_door.rb +185 -0
  167. data/lib/hecks/facade/surface/chapter.rb +107 -0
  168. data/lib/hecks/facade/surface.rb +48 -0
  169. data/lib/hecks/facade.rb +44 -0
  170. data/lib/hecks/forms/app.rb +300 -0
  171. data/lib/hecks/forms/command_form_renderer.rb +113 -0
  172. data/lib/hecks/forms/examples/banking_console.bluebook +3 -0
  173. data/lib/hecks/forms/field_renderer.rb +170 -0
  174. data/lib/hecks/forms/field_shape.rb +232 -0
  175. data/lib/hecks/forms/html.rb +53 -0
  176. data/lib/hecks/forms/index_renderer.rb +35 -0
  177. data/lib/hecks/forms/page.rb +157 -0
  178. data/lib/hecks/forms/params.rb +132 -0
  179. data/lib/hecks/forms/query_form_renderer.rb +114 -0
  180. data/lib/hecks/forms/record_renderer.rb +115 -0
  181. data/lib/hecks/forms/record_table.rb +63 -0
  182. data/lib/hecks/forms/reference_options.rb +30 -0
  183. data/lib/hecks/forms/value_object_shape.rb +46 -0
  184. data/lib/hecks/forms.rb +54 -0
  185. data/lib/hecks/fqn.rb +94 -0
  186. data/lib/hecks/framework/bluebook/compliance.bluebook +1 -0
  187. data/lib/hecks/framework/bluebook/console_settings.bluebook +489 -0
  188. data/lib/hecks/framework/bluebook/framework.hecksagon +32 -0
  189. data/lib/hecks/framework/bluebook/governance.bluebook +130 -0
  190. data/lib/hecks/framework/bluebook/identity.bluebook +90 -0
  191. data/lib/hecks/framework/oidc.json +39 -0
  192. data/lib/hecks/framework.rb +90 -0
  193. data/lib/hecks/freezer.rb +67 -0
  194. data/lib/hecks/fuzzing/invalid_value_generator.rb +86 -0
  195. data/lib/hecks/fuzzing/isolated_boot.rb +92 -0
  196. data/lib/hecks/fuzzing/properties.rb +1146 -0
  197. data/lib/hecks/fuzzing/replay.rb +635 -0
  198. data/lib/hecks/fuzzing/sequence_generator/catalog.rb +93 -0
  199. data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +54 -0
  200. data/lib/hecks/fuzzing/sequence_generator/picker.rb +96 -0
  201. data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +185 -0
  202. data/lib/hecks/fuzzing/sequence_generator.rb +130 -0
  203. data/lib/hecks/fuzzing/value_generator.rb +177 -0
  204. data/lib/hecks/fuzzing.rb +12 -0
  205. data/lib/hecks/grammar/evolve.rb +291 -0
  206. data/lib/hecks/grammar/expression.bluebook +417 -0
  207. data/lib/hecks/grammar/expression_operators.json +1152 -0
  208. data/lib/hecks/grammar/grammar.hecksagon +20 -0
  209. data/lib/hecks/grammar/oidc.json +69 -0
  210. data/lib/hecks/grammar/translation.bluebook +203 -0
  211. data/lib/hecks/grammar.rb +178 -0
  212. data/lib/hecks/ir.rb +126 -0
  213. data/lib/hecks/language/adapter.bluebook +116 -0
  214. data/lib/hecks/language/bluebook/aggregate.bluebook +581 -0
  215. data/lib/hecks/language/bluebook/attaches/paging.bluebook +76 -0
  216. data/lib/hecks/language/bluebook/bluebook.bluebook +256 -0
  217. data/lib/hecks/language/bluebook/bluebook.hecksagon +24 -0
  218. data/lib/hecks/language/bluebook/command.bluebook +437 -0
  219. data/lib/hecks/language/bluebook/entity.bluebook +316 -0
  220. data/lib/hecks/language/bluebook/policy.bluebook +172 -0
  221. data/lib/hecks/language/bluebook/process_manager.bluebook +264 -0
  222. data/lib/hecks/language/bluebook/projection.bluebook +267 -0
  223. data/lib/hecks/language/bluebook/query.bluebook +245 -0
  224. data/lib/hecks/language/bluebook/shape.bluebook +292 -0
  225. data/lib/hecks/language/bluebook/syntax.bluebook +447 -0
  226. data/lib/hecks/language/bluebook/vocabulary.bluebook +364 -0
  227. data/lib/hecks/language/hecksagon/adapter_binding.bluebook +51 -0
  228. data/lib/hecks/language/hecksagon/domain_port.bluebook +76 -0
  229. data/lib/hecks/language/hecksagon/hecksagon.bluebook +131 -0
  230. data/lib/hecks/language/hecksagon/port_operation.bluebook +102 -0
  231. data/lib/hecks/language/oidc.json +313 -0
  232. data/lib/hecks/language/port.bluebook +92 -0
  233. data/lib/hecks/language/translation/translation.bluebook +110 -0
  234. data/lib/hecks/language/translation/translation_aggregate.bluebook +267 -0
  235. data/lib/hecks/language/world/wiring.bluebook +62 -0
  236. data/lib/hecks/language/world/world.bluebook +84 -0
  237. data/lib/hecks/literal.rb +125 -0
  238. data/lib/hecks/naming.rb +121 -0
  239. data/lib/hecks/ports/access_control.port +4 -0
  240. data/lib/hecks/ports/access_control.rb +62 -0
  241. data/lib/hecks/ports/agent/answers.rb +104 -0
  242. data/lib/hecks/ports/agent.port +4 -0
  243. data/lib/hecks/ports/agent.rb +167 -0
  244. data/lib/hecks/ports/authentication.port +4 -0
  245. data/lib/hecks/ports/authentication.rb +50 -0
  246. data/lib/hecks/ports/authorization.port +4 -0
  247. data/lib/hecks/ports/authorization.rb +59 -0
  248. data/lib/hecks/ports/clock.port +4 -0
  249. data/lib/hecks/ports/clock.rb +62 -0
  250. data/lib/hecks/ports/extraction.port +4 -0
  251. data/lib/hecks/ports/extraction.rb +37 -0
  252. data/lib/hecks/ports/identity_assignment.port +4 -0
  253. data/lib/hecks/ports/identity_assignment.rb +45 -0
  254. data/lib/hecks/ports/identity_generation.port +4 -0
  255. data/lib/hecks/ports/identity_generation.rb +49 -0
  256. data/lib/hecks/ports/identity_resolution.port +4 -0
  257. data/lib/hecks/ports/identity_resolution.rb +40 -0
  258. data/lib/hecks/ports/loading.port +4 -0
  259. data/lib/hecks/ports/loading.rb +13 -0
  260. data/lib/hecks/ports/persistence/append_only.rb +102 -0
  261. data/lib/hecks/ports/persistence/binding_policy.rb +56 -0
  262. data/lib/hecks/ports/persistence/execution.rb +18 -0
  263. data/lib/hecks/ports/persistence/lineage.rb +277 -0
  264. data/lib/hecks/ports/persistence/null_saga_store.rb +25 -0
  265. data/lib/hecks/ports/persistence/remote_runtime.rb +42 -0
  266. data/lib/hecks/ports/persistence/repository_factory.rb +30 -0
  267. data/lib/hecks/ports/persistence.port +4 -0
  268. data/lib/hecks/ports/persistence.rb +39 -0
  269. data/lib/hecks/ports/projection.port +4 -0
  270. data/lib/hecks/ports/projection.rb +76 -0
  271. data/lib/hecks/ports/query/in_memory.rb +60 -0
  272. data/lib/hecks/ports/query/ordering.rb +41 -0
  273. data/lib/hecks/ports/query.rb +36 -0
  274. data/lib/hecks/ports.rb +27 -0
  275. data/lib/hecks/projections/diagrams.rb +413 -0
  276. data/lib/hecks/projections/ir.rb +18 -0
  277. data/lib/hecks/projections/model/deviations.rb +98 -0
  278. data/lib/hecks/projections/model.rb +145 -0
  279. data/lib/hecks/projections/oidc.rb +110 -0
  280. data/lib/hecks/projections/parser_table.rb +159 -0
  281. data/lib/hecks/projections/reference.rb +38 -0
  282. data/lib/hecks/projections/shape.rb +31 -0
  283. data/lib/hecks/projections/statements.rb +110 -0
  284. data/lib/hecks/projections/vocabulary.rb +100 -0
  285. data/lib/hecks/projections.rb +32 -0
  286. data/lib/hecks/projector/cli_projector.rb +437 -0
  287. data/lib/hecks/projector/docs_projector.rb +321 -0
  288. data/lib/hecks/projector/exporter.rb +141 -0
  289. data/lib/hecks/projector/ir_projector.rb +18 -0
  290. data/lib/hecks/projector/narrate_projector.rb +243 -0
  291. data/lib/hecks/projector/target.rb +97 -0
  292. data/lib/hecks/projector.rb +186 -0
  293. data/lib/hecks/query_ir.rb +392 -0
  294. data/lib/hecks/query_specification/common/authorization_spec.rb +9 -0
  295. data/lib/hecks/query_specification/common/comparators.rb +25 -0
  296. data/lib/hecks/query_specification/common/comparison.rb +174 -0
  297. data/lib/hecks/query_specification/common/cursor_spec.rb +9 -0
  298. data/lib/hecks/query_specification/common/dsl.rb +58 -0
  299. data/lib/hecks/query_specification/common/inspection_spec.rb +9 -0
  300. data/lib/hecks/query_specification/common/limit_spec.rb +9 -0
  301. data/lib/hecks/query_specification/common/null_policy.rb +80 -0
  302. data/lib/hecks/query_specification/common/null_semantics.rb +11 -0
  303. data/lib/hecks/query_specification/common/offset_spec.rb +9 -0
  304. data/lib/hecks/query_specification/common/options.rb +32 -0
  305. data/lib/hecks/query_specification/common/order_by.rb +9 -0
  306. data/lib/hecks/query_specification/common/specification.rb +10 -0
  307. data/lib/hecks/query_specification/common/where_clause.rb +9 -0
  308. data/lib/hecks/query_specification/field_path.rb +89 -0
  309. data/lib/hecks/query_specification/hop_path.rb +130 -0
  310. data/lib/hecks/query_specification/read_model/specification.rb +18 -0
  311. data/lib/hecks/query_specification.rb +14 -0
  312. data/lib/hecks/rendering.rb +48 -0
  313. data/lib/hecks/router/namespace_installer.rb +157 -0
  314. data/lib/hecks/router.rb +70 -0
  315. data/lib/hecks/runtime/caller.rb +50 -0
  316. data/lib/hecks/runtime/capability_graph.rb +44 -0
  317. data/lib/hecks/runtime/command_interpreter/argument_gate.rb +124 -0
  318. data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +248 -0
  319. data/lib/hecks/runtime/command_interpreter.rb +413 -0
  320. data/lib/hecks/runtime/command_rules/admissibility.rb +307 -0
  321. data/lib/hecks/runtime/command_rules/arithmetic.rb +254 -0
  322. data/lib/hecks/runtime/command_rules/authorization.rb +64 -0
  323. data/lib/hecks/runtime/command_rules/emission.rb +34 -0
  324. data/lib/hecks/runtime/command_rules/references.rb +181 -0
  325. data/lib/hecks/runtime/command_rules.rb +28 -0
  326. data/lib/hecks/runtime/dependency_planning.rb +231 -0
  327. data/lib/hecks/runtime/dispatcher.rb +286 -0
  328. data/lib/hecks/runtime/entity_element.rb +253 -0
  329. data/lib/hecks/runtime/entity_interpreter.rb +228 -0
  330. data/lib/hecks/runtime/era_check.rb +136 -0
  331. data/lib/hecks/runtime/era_guard/shape_diff.rb +128 -0
  332. data/lib/hecks/runtime/era_guard.rb +193 -0
  333. data/lib/hecks/runtime/era_tamper.rb +61 -0
  334. data/lib/hecks/runtime/errors.rb +100 -0
  335. data/lib/hecks/runtime/event.rb +51 -0
  336. data/lib/hecks/runtime/identity.rb +128 -0
  337. data/lib/hecks/runtime/instance.rb +120 -0
  338. data/lib/hecks/runtime/interpreting.rb +69 -0
  339. data/lib/hecks/runtime/loader.rb +143 -0
  340. data/lib/hecks/runtime/policy_interpreter.rb +366 -0
  341. data/lib/hecks/runtime/port_operation_interpreter.rb +210 -0
  342. data/lib/hecks/runtime/query_interpreter.rb +254 -0
  343. data/lib/hecks/runtime/reaction_invocation.rb +245 -0
  344. data/lib/hecks/runtime/read_model_interpreter.rb +266 -0
  345. data/lib/hecks/runtime/rebuild_sweep.rb +74 -0
  346. data/lib/hecks/runtime/reference_hop.rb +99 -0
  347. data/lib/hecks/runtime/refusal_wording.rb +124 -0
  348. data/lib/hecks/runtime/registry/saga_persistence.rb +70 -0
  349. data/lib/hecks/runtime/registry/verification.rb +158 -0
  350. data/lib/hecks/runtime/registry.rb +218 -0
  351. data/lib/hecks/runtime/remote_dispatcher.rb +143 -0
  352. data/lib/hecks/runtime/routing.rb +96 -0
  353. data/lib/hecks/runtime/saga_interpreter/correlation.rb +97 -0
  354. data/lib/hecks/runtime/saga_interpreter.rb +301 -0
  355. data/lib/hecks/runtime/storage_shape.rb +120 -0
  356. data/lib/hecks/runtime/tenant_check.rb +84 -0
  357. data/lib/hecks/runtime/tenant_scope.rb +55 -0
  358. data/lib/hecks/runtime/value/admission.rb +112 -0
  359. data/lib/hecks/runtime/value/coercion.rb +500 -0
  360. data/lib/hecks/runtime/value/invariant_violation.rb +5 -0
  361. data/lib/hecks/runtime/value.rb +125 -0
  362. data/lib/hecks/runtime.rb +95 -0
  363. data/lib/hecks/translation/audit/approval_digest.rb +31 -0
  364. data/lib/hecks/translation/audit/layer_one.rb +37 -0
  365. data/lib/hecks/translation/audit/layer_two.rb +77 -0
  366. data/lib/hecks/translation/audit/unfed_report.rb +42 -0
  367. data/lib/hecks/translation/audit.rb +70 -0
  368. data/lib/hecks/translation/reattest.rb +72 -0
  369. data/lib/hecks/translation/rule_compiler.rb +120 -0
  370. data/lib/hecks/translation/scaffold/differ.rb +183 -0
  371. data/lib/hecks/translation/scaffold/renderer.rb +41 -0
  372. data/lib/hecks/translation/scaffold/writer.rb +28 -0
  373. data/lib/hecks/translation/scaffold.rb +30 -0
  374. data/lib/hecks/translation.rb +11 -0
  375. data/lib/hecks/version.rb +16 -0
  376. data/lib/hecks/vocabulary.rb +213 -0
  377. data/lib/hecks.rb +118 -6
  378. metadata +401 -222
  379. data/bin/hecks +0 -7
  380. data/bin/hecks-package +0 -65
  381. data/bin/hecks_console +0 -12
  382. data/bin/hecks_serverless +0 -6
  383. data/lib/cli/build.rb +0 -14
  384. data/lib/cli/command_runner.rb +0 -28
  385. data/lib/cli/console.rb +0 -10
  386. data/lib/cli/generate.rb +0 -37
  387. data/lib/cli/hecks-cli.rb +0 -27
  388. data/lib/cli/test.rb +0 -57
  389. data/lib/console/commands.rb +0 -8
  390. data/lib/console/hecks-console.rb +0 -1
  391. data/lib/packager/README.md +0 -0
  392. data/lib/packager/app_runner.rb +0 -21
  393. data/lib/packager/args.rb +0 -26
  394. data/lib/packager/compatibility/fixnum.rb +0 -6
  395. data/lib/packager/hecks.rb +0 -39
  396. data/lib/packager/query_runner.rb +0 -21
  397. data/lib/packager/resources/Dockerfile +0 -11
  398. data/lib/packager/resources/app_binary +0 -7
  399. data/lib/packager/resources/bundle_config +0 -3
  400. data/lib/packager/resources/traveling-ruby-20150715-2.2.2-linux-x86_64.tar.gz +0 -0
  401. data/lib/packager/resources/traveling-ruby-20150715-2.2.2-osx.tar.gz +0 -0
  402. data/lib/serverless/Domain +0 -32
  403. data/lib/serverless/cli.rb +0 -75
  404. data/lib/serverless/resources/command_name.js +0 -5
  405. data/lib/serverless/resources/environment.js +0 -7
  406. data/lib/serverless/resources/handler.js.tt +0 -28
  407. data/lib/serverless/resources/run_binary.js +0 -22
  408. data/lib/serverless/resources/serverless.yml +0 -20
@@ -0,0 +1,437 @@
1
+ Hecks.bluebook "Bluebook" do
2
+ aggregate "Command" do
3
+ description "One command declared on an aggregate — its arguments, its rules, and what it announces."
4
+
5
+ reference_to Aggregate
6
+
7
+ # WHICH PIECE DECLARED IT, when a piece did. A command argument with no
8
+ # attribute to land in does not persist — the same lesson `disputed_by` taught
9
+ # on CardPayment — so the field has to exist here for Command.Declare's
10
+ # `entity_id` to be held at all.
11
+ reference_to Entity, as: :entity_id, optional: true
12
+
13
+ # SPELLED AS THE IR SPELLS THEM. The judge walks a built IR and offers each
14
+ # field by name, so a field named differently here would need a translation
15
+ # table between two vocabularies for the same thing — and a table is a place
16
+ # to be wrong quietly. One spelling, and the walk reads straight through.
17
+ # THE IMMEDIATE OWNER, AND ITS NAME. Almost every chapter declares a
18
+ # `Declare` ; the owner is what tells one from another.
19
+ #
20
+ # `owner_id` NOT `aggregate_id` : a command declared on an ENTITY is that
21
+ # entity's, not its aggregate's — `Banking:Account:LedgerEntry:Amend` is
22
+ # LedgerEntry's Amend, and `Banking:Account:LedgerEntry` is what tells it
23
+ # apart from a same-named command on some OTHER entity of the same
24
+ # aggregate. `aggregate_id` (kept, below, as data) still names the true
25
+ # root, for the DeclaredIn walk that gathers every command under a
26
+ # chapter’s aggregate whichever piece declared it ; `owner_id` names only
27
+ # whichever declared THIS one. `owner_id` is not a declared attribute —
28
+ # it is the WALK's immediate parent, read the same way `position` is.
29
+ identified_by :owner_id, :name
30
+
31
+ attribute :name, CommandName
32
+ attribute :role, Actor
33
+ attribute :goal, Goal
34
+ attribute :emits, list_of(Announcement)
35
+ attribute :references, EventName, optional: true
36
+ attribute :attributes, list_of(Argument)
37
+ attribute :givens, list_of(Rule)
38
+ # THE POSTCONDITIONS — same Rule shape as givens, checked on the other
39
+ # side of the mutations: a given says what must hold to begin, an
40
+ # ensures says what must hold to have finished. Meyer's third leg.
41
+ attribute :ensures, list_of(Rule)
42
+ attribute :mutations, list_of(Change)
43
+ attribute :provenance, CommandText
44
+ # LIFECYCLE STATE AS A COMMAND GUARD (S10, ADR 0025) — a LITERAL,
45
+ # the same shape `provenance`/`default:` already carry (`from:
46
+ # "open"` or `from: ["open", "frozen"]`, encoded and decoded the
47
+ # same way any other Ruby literal on this construct is), not a
48
+ # dedicated list-of-value-object the way `givens` is — the guard
49
+ # names no target state and moves nothing, so it needs no Rule-
50
+ # shaped predicate at all, only the states it admits.
51
+ attribute :from, CommandText, optional: true
52
+
53
+ value_object "CommandName" do
54
+ attribute :value, String
55
+ invariant("a command is named") { !value.to_s.empty? }
56
+ end
57
+
58
+ value_object "Actor" do
59
+ attribute :value, String
60
+ # RELAXED for the experiment : banking leaves 19 of 40 commands without a
61
+ # role, and the hand-written CommandBuilder never required one. Whether
62
+ # role/goal are mandatory is a language decision — the meta-domain found
63
+ # the drift the moment it enforced uniformly.
64
+ end
65
+
66
+ value_object "Goal" do
67
+ attribute :value, String
68
+ # RELAXED — see Actor above.
69
+ end
70
+
71
+ value_object "EventName" do
72
+ attribute :value, String
73
+ end
74
+
75
+ value_object "Announcement" do
76
+ attribute :name, String
77
+ end
78
+
79
+ value_object "Argument" do
80
+ attribute :name, String
81
+ attribute :type, String
82
+ attribute :list, String
83
+ attribute :optional, String, optional: true
84
+ attribute :pattern, String, optional: true
85
+ attribute :default, String
86
+ # The closed set this value must belong to — see Aggregate::Field, which is
87
+ # the same declaration, spelled for a command's arguments.
88
+ attribute :admits, String, optional: true
89
+ attribute :relationship, String, optional: true
90
+ end
91
+
92
+ value_object "Rule" do
93
+ attribute :description, String
94
+ attribute :canonical, String
95
+ end
96
+
97
+ value_object "Change" do
98
+ attribute :target, String
99
+ # The same word, one aggregate over. `OpName` used to carry
100
+ # `set || append || increment || decrement` in an invariant — Vocabulary's
101
+ # MutationOp written out a second time, one level in, with nothing
102
+ # comparing the two. Naming the set is the whole of what that invariant was
103
+ # trying to say, and it says it where the set actually lives.
104
+ attribute :op, String, admits: "Vocabulary::MutationOp"
105
+ attribute :field, String
106
+ attribute :kind, String
107
+ attribute :source, String
108
+ end
109
+
110
+ # A plain string holder, for the id of the aggregate above. Command had no
111
+ # generic text value object and the alternatives all meant something else —
112
+ # RuleText is a predicate, FieldRef is a field, ArgType is a type. Reusing one
113
+ # of those would read as a lie, the way `bluebook_id` typed AggregateName did.
114
+ value_object "CommandText" do
115
+ attribute :value, String
116
+ end
117
+ # The way back: everything DECLARED IN the aggregate above. The parent
118
+ # reference IS the query.
119
+ # WHERE IT SITS AMONG ITS SIBLINGS. Declaration order is a FACT ABOUT THE
120
+ # SOURCE — the IR is a contract read straight from this file,
121
+ # field for field AND INDEX FOR INDEX. So the language HOLDS it, instead of
122
+ # inheriting it from whatever order a store happens to iterate: an ask that
123
+ # does not say how it is ordered is answered in identity order, which is
124
+ # right for every other ask and fatal for the one that is the SOURCE.
125
+ value_object "Position" do
126
+ attribute :value, Integer
127
+ end
128
+
129
+ attribute :position, Position
130
+
131
+ query "DeclaredIn" do
132
+ attribute :aggregate, CommandText
133
+ where(aggregate: :aggregate)
134
+ order_by :position
135
+ end
136
+ command "Declare" do
137
+ role "Language"
138
+ goal "Open a command on an aggregate"
139
+
140
+ reference_to Aggregate
141
+ # DECLARED ON AN AGGREGATE, or on one of its ENTITIES. The IR uses the same
142
+ # Command for both — an entity's commands are Command objects — so the
143
+ # language uses the same Command, and says which piece declared it when a piece
144
+ # did. Absent for an aggregate's own commands, and ABSENT is not EMPTY.
145
+ reference_to Entity, as: :entity_id, optional: true
146
+ attribute :name, CommandName
147
+ attribute :role, Actor, optional: true
148
+ attribute :goal, Goal, optional: true
149
+ # See Aggregate.Declare's own `provenance` — identical shape, one
150
+ # level down.
151
+ attribute :provenance, CommandText, optional: true
152
+ # See this aggregate's own `from` field comment, above.
153
+ attribute :from, CommandText, optional: true
154
+
155
+ attribute :position, Position, optional: true
156
+ sets :aggregate
157
+ sets :entity_id
158
+ sets :name
159
+ sets :role
160
+ sets :goal
161
+ sets :provenance
162
+ sets :from
163
+ sets :position
164
+ emits "VerbDeclared"
165
+ end
166
+
167
+ command "Argument" do
168
+ role "Language"
169
+ goal "Attach one argument to the command"
170
+
171
+ attribute :name, ArgName
172
+ attribute :type, ArgType
173
+ attribute :list, ArgType
174
+ attribute :optional, ArgType, optional: true
175
+ attribute :pattern, ArgType, optional: true
176
+ attribute :default, ArgType, optional: true
177
+ # The closed set this argument's value must belong to — see
178
+ # Aggregate.Attribute, which carries the same word for a head's attributes.
179
+ attribute :admits, ArgType, optional: true
180
+ # Whether this argument was minted verbatim from the owning aggregate/
181
+ # entity's own reference-typed attribute (`sets :field` importing a
182
+ # `reference_to`/`has_many`/`has_one`/`belongs_to` field rather than
183
+ # retyping it) — see Aggregate.Attribute, which carries the same word
184
+ # for a head's own attributes. Missing here, a round trip through the
185
+ # self-hosted meta-domain silently dropped it for every command
186
+ # argument, even though the live DSL builder set it correctly in
187
+ # memory (CommandBuilder#resolve_bare_set!) — the wire just never
188
+ # carried it back.
189
+ attribute :relationship, ArgType, optional: true
190
+
191
+ sets :attributes, append: { name: :name, type: :type, list: :list, default: :default, optional: :optional, pattern: :pattern, admits: :admits, relationship: :relationship }
192
+
193
+ emits "ArgumentAttached"
194
+ end
195
+
196
+ # An argument that points at ANOTHER aggregate's head — the same word
197
+ # `reference_to`, written on a command instead of on the head.
198
+ #
199
+ # `Argument` types its type as text, so a reference argument arrived as the
200
+ # STRING "Reference<Customer>" and the language held a spelling rather than a
201
+ # reference. That left "a reference points at a declared head" enforceable
202
+ # only by a `raise Malformed` in the DSL, for three of the four places the
203
+ # word can be written. As a reference it is a consequence of the model here
204
+ # too, exactly as Aggregate.Reference made it one on a head.
205
+ command "Reference" do
206
+ role "Language"
207
+ goal "Attach an argument that points at another aggregate's head"
208
+
209
+ reference_to Aggregate, as: :points_at
210
+ # No `given` that the name is present : ArgName already carries that
211
+ # invariant, and a value object's invariant fires during coercion — before
212
+ # any given is reached. A rule that cannot be the one to refuse is
213
+ # decoration, and this language has paid for that mistake before.
214
+ attribute :name, ArgName
215
+ attribute :list, ArgType
216
+ attribute :optional, ArgType, optional: true
217
+ attribute :pattern, ArgType, optional: true
218
+ attribute :default, ArgType, optional: true
219
+ attribute :admits, ArgType, optional: true
220
+ # See Argument's own :relationship, just above — the same gap, one
221
+ # verb over.
222
+ attribute :relationship, ArgType, optional: true
223
+
224
+ sets :attributes, append: { name: :name, type: :points_at, list: :list, default: :default, optional: :optional, pattern: :pattern, admits: :admits, relationship: :relationship }
225
+
226
+ emits "ArgumentReferenceAttached"
227
+ end
228
+
229
+ value_object "ArgName" do
230
+ attribute :value, String
231
+ invariant("an argument is named") { !value.to_s.empty? }
232
+ end
233
+
234
+ value_object "ArgType" do
235
+ attribute :value, String
236
+ # list / default reuse this shape and are legitimately empty
237
+ end
238
+
239
+ command "Rule" do
240
+ role "Language"
241
+ goal "Attach one given to the command"
242
+
243
+ attribute :description, RuleText, optional: true
244
+ attribute :canonical, RuleText
245
+
246
+ given("a rule says what it means") { !description.value.to_s.empty? }
247
+ given("a rule survives extraction") { !canonical.value.to_s.empty? }
248
+
249
+ sets :givens, append: { description: :description, canonical: :canonical }
250
+
251
+ emits "RuleAttached"
252
+ end
253
+
254
+ command "Ensure" do
255
+ role "Language"
256
+ goal "Attach one postcondition to the command"
257
+
258
+ attribute :description, RuleText, optional: true
259
+ attribute :canonical, RuleText
260
+
261
+ given("a rule says what it means") { !description.value.to_s.empty? }
262
+ given("a rule survives extraction") { !canonical.value.to_s.empty? }
263
+
264
+ sets :ensures, append: { description: :description, canonical: :canonical }
265
+
266
+ emits "EnsureAttached"
267
+ end
268
+
269
+ value_object "RuleText" do
270
+ attribute :value, String
271
+ end
272
+
273
+ command "Change" do
274
+ role "Language"
275
+ goal "Attach one mutation to the command"
276
+
277
+ attribute :target, FieldRef
278
+ # NAMED ON THE ARGUMENT, not only on the Change row it fills. The row is
279
+ # what the IR holds ; THIS is what a caller hands in, so this is where a
280
+ # bad op has to be refused — `OpName`'s deleted invariant was refusing
281
+ # exactly here, and the link has to reach the same door to replace it.
282
+ attribute :op, OpName, admits: "Vocabulary::MutationOp"
283
+ attribute :field, FieldRef
284
+ attribute :kind, FieldRef
285
+ attribute :source, FieldRef
286
+
287
+ given("a mutation names a target") { !target.value.to_s.empty? }
288
+ given("a mutation does something") { !op.value.to_s.empty? }
289
+
290
+ sets :mutations, append: { target: :target, op: :op, field: :field, kind: :kind, source: :source }
291
+
292
+ emits "ChangeAttached"
293
+ end
294
+
295
+ value_object "FieldRef" do
296
+ attribute :value, String
297
+ end
298
+
299
+ # THE SET IT ADMITS IS NAMED, NOT RESTATED. This carried
300
+ # `set || append || increment || decrement` — Vocabulary::MutationOp written
301
+ # out a second time, one level in, which is exactly the kind of copy
302
+ # that drifts. `Change.op` now says `admits:
303
+ # Vocabulary::MutationOp`, so there is no second list left to drift.
304
+ value_object "OpName" do
305
+ attribute :value, String
306
+ end
307
+
308
+ command "ActsOn" do
309
+ role "Language"
310
+ goal "Name the aggregate this command reaches through"
311
+
312
+ # NAMED `root`, not `references` : a command argument SHADOWS the aggregate
313
+ # field of the same name inside a given, so a once-only rule cannot read
314
+ # the state it guards unless the two differ.
315
+ attribute :root, EventName
316
+
317
+ given("a command names what it acts on") { !root.value.to_s.empty? }
318
+ given("a command acts on ONE root") { references.value.to_s.empty? }
319
+
320
+ sets :references, to: :root
321
+
322
+ emits "ReferenceNamed"
323
+ end
324
+
325
+ command "Announce" do
326
+ role "Language"
327
+ goal "Name the event this command emits"
328
+
329
+ attribute :announces, EventName
330
+
331
+ given("an event is named") { !announces.value.to_s.empty? }
332
+
333
+ sets :emits, append: { name: :announces }
334
+
335
+ emits "AnnouncementNamed"
336
+ end
337
+
338
+ # HOW COMMAND IS SPELLED. These rows live with the concept
339
+ # they describe; SyntaxBoot discovers every aggregate-local seed table.
340
+ # Contexts represented here: Command.
341
+ value_object "KeywordSeed" do
342
+ attribute :word, String
343
+ attribute :context, String, admits: "Syntax::Context"
344
+ attribute :body, String, admits: "Syntax::Body"
345
+ attribute :inner, String
346
+ attribute :opens, String
347
+ attribute :fills, String
348
+ attribute :status, String, default: "admitted", admits: "Syntax::Status"
349
+ attribute :was, String
350
+ attribute :resolves_via, String, default: "", admits: "Syntax::ResolutionScope"
351
+ attribute :disambiguator, String, default: "", admits: "Syntax::Disambiguator"
352
+
353
+ member word: "role", context: "Command", body: "none", inner: "", opens: "", fills: "role", calls: "role_impl"
354
+ member word: "goal", context: "Command", body: "none", inner: "", opens: "", fills: "goal"
355
+ member word: "provenance", context: "Command", body: "none", inner: "", opens: "", fills: "provenance", calls: "provenance_impl"
356
+ member word: "reference_to", context: "Command", body: "none", inner: "", opens: "", fills: "references", calls: "reference_to_impl"
357
+ member word: "given", context: "Command", body: "source", inner: "", opens: "", fills: "givens", resolves_via: "hash_chain", calls: "given_impl"
358
+ member word: "sets", context: "Command", body: "none", inner: "", opens: "", fills: "mutations", calls: "sets_impl"
359
+ # RENAMED spelling of `sets`, above — its own dedicated, deprecated row
360
+ # (not `sets`'s own `was:`, syntax_conformance_spec.rb's own "no
361
+ # renamed-away spelling as a row of its own AND a was:" rule), kept
362
+ # here refusing live ONLY so `MetaValidator.shadow_parsing?` can still
363
+ # read frozen era text that used it (CommandBuilder#then_set_impl's
364
+ # own comment).
365
+ member word: "then_set", context: "Command", body: "none", inner: "", opens: "", fills: "mutations", status: "deprecated", calls: "then_set_impl"
366
+ # A command's synchronous handoff into one nested entity command
367
+ # (CommandBuilder#delegates_to_impl's own comment gives the full
368
+ # reasoning) — a new word, not a migrated one.
369
+ member word: "delegates_to", context: "Command", body: "none", inner: "", opens: "", fills: "mutations", calls: "delegates_to_impl"
370
+ member word: "emits", context: "Command", body: "none", inner: "", opens: "", fills: "emits"
371
+ # A VALUE, NOT A DECLARATION — `state(:field)` is written INSIDE a
372
+ # `sets` (`append: { knights: state(:knights) }`, `to: state(:ply)`)
373
+ # and names the record's own field as that mutation's source; it
374
+ # fills nothing of its own, the `sets` it sits in fills `mutations`.
375
+ member word: "state", context: "Command", body: "none", inner: "", opens: "", fills: "mutations"
376
+ member word: "attribute", context: "Command", body: "none", inner: "", opens: "", fills: "attributes", calls: "attribute_impl"
377
+ member word: "ensures", context: "Command", body: "source", inner: "", opens: "", fills: "ensures"
378
+
379
+ end
380
+
381
+ value_object "ArgumentSeed" do
382
+ attribute :keyword, String
383
+ attribute :context, String, admits: "Syntax::Context"
384
+ attribute :at, String
385
+ attribute :named, String
386
+ attribute :kind, String, admits: "Syntax::ArgumentKind"
387
+ attribute :required, String
388
+ attribute :fills, String
389
+ attribute :selects, String
390
+ attribute :pair_key_fills, String
391
+ attribute :pair_value_fills, String
392
+ attribute :pairs_shape, String, admits: "Syntax::PairsShape"
393
+ attribute :status, String, default: "admitted", admits: "Syntax::Status"
394
+ attribute :variadic, String
395
+ attribute :coerce, String
396
+ attribute :blank_message, String
397
+
398
+ member keyword: "role", context: "Command", at: "1", named: "", kind: "text", required: "true", fills: "role"
399
+ member keyword: "goal", context: "Command", at: "1", named: "", kind: "text", required: "true", fills: "goal", coerce: "false"
400
+ member keyword: "provenance", context: "Command", at: "", named: "from", kind: "literal", required: "true", fills: "provenance"
401
+ member keyword: "reference_to", context: "Command", at: "1", named: "", kind: "constant", required: "true", fills: "type"
402
+ member keyword: "reference_to", context: "Command", at: "", named: "as", kind: "symbol", required: "false", fills: "name"
403
+ member keyword: "reference_to", context: "Command", at: "", named: "optional", kind: "flag", required: "false", fills: "optional"
404
+ member keyword: "given", context: "Command", at: "1", named: "", kind: "text", required: "true", fills: "description"
405
+ member keyword: "ensures", context: "Command", at: "1", named: "", kind: "text", required: "true", fills: "description"
406
+ member keyword: "sets", context: "Command", at: "1", named: "", kind: "symbol", required: "true", fills: "target"
407
+ member keyword: "sets", context: "Command", at: "", named: "to", kind: "literal", required: "false", fills: "source", selects: "op=set"
408
+ member keyword: "sets", context: "Command", at: "", named: "append", kind: "literal", required: "false", fills: "source", selects: "op=append"
409
+ member keyword: "sets", context: "Command", at: "", named: "increment", kind: "literal", required: "false", fills: "source", selects: "op=increment"
410
+ member keyword: "sets", context: "Command", at: "", named: "decrement", kind: "literal", required: "false", fills: "source", selects: "op=decrement"
411
+ member keyword: "sets", context: "Command", at: "", named: "multiply", kind: "literal", required: "false", fills: "source", selects: "op=multiply"
412
+ member keyword: "sets", context: "Command", at: "", named: "clamp", kind: "literal", required: "false", fills: "source", selects: "op=clamp"
413
+ member keyword: "sets", context: "Command", at: "", named: "remove", kind: "literal", required: "false", fills: "source", selects: "op=remove"
414
+ member keyword: "then_set", context: "Command", at: "1", named: "", kind: "symbol", required: "true", fills: "target"
415
+ member keyword: "then_set", context: "Command", at: "", named: "to", kind: "literal", required: "false", fills: "source", selects: "op=set"
416
+ member keyword: "then_set", context: "Command", at: "", named: "from", kind: "literal", required: "false", fills: "source", selects: "op=set"
417
+ member keyword: "then_set", context: "Command", at: "", named: "append", kind: "literal", required: "false", fills: "source", selects: "op=append"
418
+ member keyword: "then_set", context: "Command", at: "", named: "increment", kind: "literal", required: "false", fills: "source", selects: "op=increment"
419
+ member keyword: "then_set", context: "Command", at: "", named: "decrement", kind: "literal", required: "false", fills: "source", selects: "op=decrement"
420
+ member keyword: "then_set", context: "Command", at: "", named: "multiply", kind: "literal", required: "false", fills: "source", selects: "op=multiply"
421
+ member keyword: "then_set", context: "Command", at: "", named: "clamp", kind: "literal", required: "false", fills: "source", selects: "op=clamp"
422
+ member keyword: "then_set", context: "Command", at: "", named: "remove", kind: "literal", required: "false", fills: "source", selects: "op=remove"
423
+ member keyword: "delegates_to", context: "Command", at: "1", named: "", kind: "text", required: "true", fills: "target"
424
+ member keyword: "delegates_to", context: "Command", at: "", named: "with", kind: "literal", required: "false", fills: "source", selects: "op=delegate"
425
+ member keyword: "emits", context: "Command", at: "1", named: "", kind: "text", required: "true", fills: "emits"
426
+ member keyword: "state", context: "Command", at: "1", named: "", kind: "symbol", required: "true", fills: "source"
427
+ member keyword: "attribute", context: "Command", at: "1", named: "", kind: "symbol", required: "true", fills: "name"
428
+ member keyword: "attribute", context: "Command", at: "2", named: "", kind: "constant", required: "true", fills: "type"
429
+ member keyword: "attribute", context: "Command", at: "", named: "default", kind: "literal", required: "false", fills: "default"
430
+ member keyword: "attribute", context: "Command", at: "", named: "optional", kind: "flag", required: "false", fills: "optional"
431
+ member keyword: "attribute", context: "Command", at: "", named: "pattern", kind: "text", required: "false", fills: "pattern"
432
+ member keyword: "attribute", context: "Command", at: "", named: "admits", kind: "text", required: "false", fills: "admits"
433
+ member keyword: "attribute", context: "Command", at: "", named: "one_of", kind: "list", required: "false", fills: "one_of"
434
+
435
+ end
436
+ end
437
+ end