hecks 3.4.2 → 3.6.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.
- checksums.yaml +4 -4
- data/examples/pizzas/bluebook/hecksagon/mock_stripe_payment_adapter.rb +1 -1
- data/lib/hecks/adapters/driven/claude_code.rb +11 -7
- data/lib/hecks/adapters/driven/d1/connection.rb +90 -0
- data/lib/hecks/adapters/driven/d1.rb +48 -314
- data/lib/hecks/adapters/driven/folder.rb +20 -10
- data/lib/hecks/adapters/driven/google_authentication.rb +18 -4
- data/lib/hecks/adapters/driven/governance_authorization.rb +2 -2
- data/lib/hecks/adapters/driven/heki/journal.rb +11 -10
- data/lib/hecks/adapters/driven/heki/saga_store.rb +4 -6
- data/lib/hecks/adapters/driven/heki/sagas.rb +55 -0
- data/lib/hecks/adapters/driven/heki.rb +21 -66
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +37 -12
- data/lib/hecks/adapters/driven/lambda/client.rb +1 -1
- data/lib/hecks/adapters/driven/lambda.rb +1 -8
- data/lib/hecks/adapters/driven/memory/outbox_rows.rb +76 -0
- data/lib/hecks/adapters/driven/memory/shared_elements/values.rb +117 -0
- data/lib/hecks/adapters/driven/memory/shared_elements.rb +10 -97
- data/lib/hecks/adapters/driven/memory.rb +3 -65
- data/lib/hecks/adapters/driven/postgres/codec.rb +29 -26
- data/lib/hecks/adapters/driven/postgres/ddl.rb +50 -0
- data/lib/hecks/adapters/driven/postgres/dialect.rb +93 -0
- data/lib/hecks/adapters/driven/postgres/events.rb +57 -0
- data/lib/hecks/adapters/driven/postgres/journal.rb +127 -0
- data/lib/hecks/adapters/driven/postgres/outbox.rb +39 -31
- data/lib/hecks/adapters/driven/postgres/repository.rb +190 -0
- data/lib/hecks/adapters/driven/postgres/sagas.rb +72 -0
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +13 -41
- data/lib/hecks/adapters/driven/postgres.rb +61 -528
- data/lib/hecks/adapters/driven/prism.rb +1 -1
- data/lib/hecks/adapters/driven/sql_query_builder.rb +45 -53
- data/lib/hecks/adapters/driven/sql_value_members.rb +57 -0
- data/lib/hecks/adapters/driven/sqlite/codec.rb +32 -29
- data/lib/hecks/adapters/driven/sqlite/ddl.rb +68 -0
- data/lib/hecks/adapters/driven/sqlite/dialect.rb +55 -0
- data/lib/hecks/adapters/driven/sqlite/events.rb +61 -0
- data/lib/hecks/adapters/driven/sqlite/journal.rb +125 -0
- data/lib/hecks/adapters/driven/sqlite/outbox.rb +98 -0
- data/lib/hecks/adapters/driven/sqlite/projection.rb +82 -63
- data/lib/hecks/adapters/driven/sqlite/repository.rb +146 -0
- data/lib/hecks/adapters/driven/sqlite/sagas.rb +69 -0
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +8 -55
- data/lib/hecks/adapters/driven/sqlite.rb +36 -513
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +13 -7
- data/lib/hecks/adapters/driving/github_webhook.rb +11 -8
- data/lib/hecks/behaviors/dsl.rb +17 -12
- data/lib/hecks/behaviors/expectations/boot.rb +81 -0
- data/lib/hecks/behaviors/expectations/checks.rb +178 -0
- data/lib/hecks/behaviors/expectations/dispatching.rb +93 -0
- data/lib/hecks/behaviors/expectations/qualify.rb +81 -0
- data/lib/hecks/behaviors/expectations.rb +39 -355
- data/lib/hecks/behaviors/rspec.rb +12 -12
- data/lib/hecks/behaviors/runner.rb +20 -11
- data/lib/hecks/bench/cli.rb +16 -13
- data/lib/hecks/bench/environment.rb +1 -1
- data/lib/hecks/bench/report.rb +11 -7
- data/lib/hecks/bench/ruby_runner.rb +13 -8
- data/lib/hecks/bench/rust_runner.rb +19 -11
- data/lib/hecks/bench/suite.rb +48 -20
- data/lib/hecks/bench/workload.rb +42 -31
- data/lib/hecks/bluebook/aggregate.rb +15 -21
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +18 -21
- data/lib/hecks/bluebook/assembly/build.rb +12 -7
- data/lib/hecks/bluebook/assembly/contracts/read_models.rb +70 -0
- data/lib/hecks/bluebook/assembly/contracts/rules.rb +84 -0
- data/lib/hecks/bluebook/assembly/contracts/sagas.rb +109 -0
- data/lib/hecks/bluebook/assembly/contracts/structure.rb +91 -0
- data/lib/hecks/bluebook/assembly/contracts.rb +9 -319
- data/lib/hecks/bluebook/assembly/marks.rb +9 -8
- data/lib/hecks/bluebook/attribute.rb +13 -10
- data/lib/hecks/bluebook/behaviour/aggregate.rb +10 -3
- data/lib/hecks/bluebook/behaviour/read_model.rb +26 -13
- data/lib/hecks/bluebook/chapter.rb +22 -14
- data/lib/hecks/bluebook/command.rb +14 -18
- data/lib/hecks/bluebook/domain_port.rb +11 -8
- data/lib/hecks/bluebook/dsl/aggregate_builder/correction_sealing.rb +78 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/draining.rb +74 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/query_field_sealing.rb +105 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/query_sealing.rb +121 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/relationships.rb +128 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/rules.rb +84 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +61 -249
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +51 -285
- data/lib/hecks/bluebook/dsl/attribute_collector/identity_resolution.rb +113 -0
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +58 -117
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +24 -19
- data/lib/hecks/bluebook/dsl/bluebook_builder/pending_givens.rb +109 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/correlation_keys.rb +105 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/event_shapes.rb +126 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/hop_tails.rb +79 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/projected_fields.rb +76 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/provisions.rb +65 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/query_hops.rb +123 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/references.rb +112 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/with_projections.rb +126 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +34 -595
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +18 -107
- data/lib/hecks/bluebook/dsl/command_builder/implicit_attributes.rb +132 -0
- data/lib/hecks/bluebook/dsl/command_builder/mutations.rb +190 -0
- data/lib/hecks/bluebook/dsl/command_builder/owner.rb +22 -0
- data/lib/hecks/bluebook/dsl/command_builder/rules.rb +57 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +60 -360
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +19 -13
- data/lib/hecks/bluebook/dsl/entity_builder/rules.rb +96 -0
- data/lib/hecks/bluebook/dsl/entity_builder/scope.rb +25 -0
- data/lib/hecks/bluebook/dsl/entity_builder/sealing.rb +94 -0
- data/lib/hecks/bluebook/dsl/entity_builder.rb +35 -169
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +53 -24
- data/lib/hecks/bluebook/dsl/hecksagon_builder/chapter_scope.rb +133 -0
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +3 -97
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +73 -73
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +7 -3
- data/lib/hecks/bluebook/dsl/need_word.rb +1 -1
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +34 -29
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +57 -41
- data/lib/hecks/bluebook/dsl/query_builder.rb +12 -15
- data/lib/hecks/bluebook/dsl/read_model_builder/sealing.rb +116 -0
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +25 -102
- data/lib/hecks/bluebook/dsl/rule_reference.rb +26 -12
- data/lib/hecks/bluebook/dsl/translation_builder.rb +24 -14
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +29 -19
- data/lib/hecks/bluebook/dsl/word_gate.rb +34 -27
- data/lib/hecks/bluebook/entity.rb +13 -17
- data/lib/hecks/bluebook/expression/ast_json/emitters.rb +93 -0
- data/lib/hecks/bluebook/expression/ast_json/emitters.rb-e +88 -0
- data/lib/hecks/bluebook/expression/ast_json.rb +49 -76
- data/lib/hecks/bluebook/expression/ast_reader.rb +95 -28
- data/lib/hecks/bluebook/expression/canonical_form.rb +6 -26
- data/lib/hecks/bluebook/expression/evaluator/parser.rb +62 -0
- data/lib/hecks/bluebook/expression/evaluator/scanning.rb +122 -0
- data/lib/hecks/bluebook/expression/evaluator.rb +11 -111
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +28 -44
- data/lib/hecks/bluebook/expression/resolver/lookups.rb +77 -0
- data/lib/hecks/bluebook/expression/resolver/operations.rb +78 -0
- data/lib/hecks/bluebook/expression/resolver/parsing.rb +110 -0
- data/lib/hecks/bluebook/expression/resolver/scanning.rb +139 -0
- data/lib/hecks/bluebook/expression/resolver/values.rb +115 -0
- data/lib/hecks/bluebook/expression/resolver.rb +16 -414
- data/lib/hecks/bluebook/{hexagon.rb → hecksagon.rb} +22 -14
- data/lib/hecks/bluebook/keyword_fields.rb +42 -0
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +7 -6
- data/lib/hecks/bluebook/meta_validator/judge/cells.rb +99 -0
- data/lib/hecks/bluebook/meta_validator/judge/dispatching.rb +111 -0
- data/lib/hecks/bluebook/meta_validator/judge/identity.rb +108 -0
- data/lib/hecks/bluebook/meta_validator/judge/walking.rb +141 -0
- data/lib/hecks/bluebook/meta_validator/judge.rb +31 -376
- data/lib/hecks/bluebook/meta_validator/modes.rb +137 -0
- data/lib/hecks/bluebook/meta_validator/plan/category.rb +44 -0
- data/lib/hecks/bluebook/meta_validator/plan/verbs.rb +73 -0
- data/lib/hecks/bluebook/meta_validator/plan.rb +38 -122
- data/lib/hecks/bluebook/meta_validator/readings/fields.rb +100 -0
- data/lib/hecks/bluebook/meta_validator/readings.rb +10 -95
- data/lib/hecks/bluebook/meta_validator/reconstruction/heads.rb +89 -0
- data/lib/hecks/bluebook/meta_validator/reconstruction/reading.rb +96 -0
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +25 -151
- data/lib/hecks/bluebook/meta_validator/shapes/helpers.rb +83 -0
- data/lib/hecks/bluebook/meta_validator/shapes.rb +8 -75
- data/lib/hecks/bluebook/meta_validator/syntax_boot/disk_cache.rb +77 -0
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +31 -95
- data/lib/hecks/bluebook/meta_validator/translation_judge/rules.rb +74 -0
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +15 -65
- data/lib/hecks/bluebook/meta_validator/verdict_cache/tagging.rb +63 -0
- data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +22 -43
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +8 -4
- data/lib/hecks/bluebook/meta_validator.rb +59 -175
- data/lib/hecks/bluebook/model_check/lifecycle_checks.rb +122 -0
- data/lib/hecks/bluebook/model_check/policy_checks.rb +129 -0
- data/lib/hecks/bluebook/model_check/saga_checks.rb +134 -0
- data/lib/hecks/bluebook/model_check/verbs.rb +69 -0
- data/lib/hecks/bluebook/model_check.rb +73 -413
- data/lib/hecks/bluebook/pattern_subset/refusals.rb +54 -0
- data/lib/hecks/bluebook/pattern_subset/scan.rb +58 -0
- data/lib/hecks/bluebook/pattern_subset.rb +93 -134
- data/lib/hecks/bluebook/process_manager.rb +10 -9
- data/lib/hecks/bluebook/project_discovery.rb +10 -7
- data/lib/hecks/bluebook/project_register.rb +42 -41
- data/lib/hecks/bluebook/query.rb +19 -12
- data/lib/hecks/bluebook/read_model.rb +41 -39
- data/lib/hecks/bluebook/smoke_test.rb +51 -36
- data/lib/hecks/bluebook/synthesizer.rb +13 -5
- data/lib/hecks/bluebook/translation.rb +12 -12
- data/lib/hecks/bluebook.rb +1 -1
- data/lib/hecks/chapters.rb +32 -16
- data/lib/hecks/cli/behaviors.rb +22 -15
- data/lib/hecks/cli/check_era.rb +2 -2
- data/lib/hecks/cli/command_table.rb +72 -0
- data/lib/hecks/cli/console.rb +10 -7
- data/lib/hecks/cli/deploy_template_diff.rb +22 -9
- data/lib/hecks/cli/document.rb +14 -10
- data/lib/hecks/cli/domain_stub.rb +1 -1
- data/lib/hecks/cli/domain_writer.rb +1 -1
- data/lib/hecks/cli/expression_projection.rb +8 -6
- data/lib/hecks/cli/follow.rb +10 -4
- data/lib/hecks/cli/interview_aggregate.rb +132 -0
- data/lib/hecks/cli/interview_draft.rb +16 -200
- data/lib/hecks/cli/interview_record.rb +130 -0
- data/lib/hecks/cli/interview_run.rb +19 -8
- data/lib/hecks/cli/interview_session/agent_state.rb +70 -0
- data/lib/hecks/cli/interview_session/catalog.rb +76 -0
- data/lib/hecks/cli/interview_session/manual_findings.rb +48 -0
- data/lib/hecks/cli/interview_session/proposals.rb +90 -0
- data/lib/hecks/cli/interview_session.rb +8 -205
- data/lib/hecks/cli/interview_shape.rb +13 -6
- data/lib/hecks/cli/ir.rb +8 -11
- data/lib/hecks/cli/launcher_words.rb +168 -0
- data/lib/hecks/cli/model_check/examination.rb +93 -0
- data/lib/hecks/cli/model_check/sources.rb +57 -0
- data/lib/hecks/cli/model_check.rb +28 -134
- data/lib/hecks/cli/project_cli/launcher_source.rb +177 -0
- data/lib/hecks/cli/project_cli/templates.rb +106 -0
- data/lib/hecks/cli/project_cli.rb +57 -236
- data/lib/hecks/cli/project_diagrams.rb +26 -4
- data/lib/hecks/cli/project_glossary.rb +19 -9
- data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +29 -13
- data/lib/hecks/cli/release.rb +29 -22
- data/lib/hecks/cli/release_gem.rb +12 -6
- data/lib/hecks/cli/rspec_io_parallel_files.rb +87 -30
- data/lib/hecks/cli/rspec_shard_files.rb +24 -9
- data/lib/hecks/cli/run.rb +25 -44
- data/lib/hecks/cli/run_expectations.rb +63 -0
- data/lib/hecks/cli/seed_semantics_corpus.rb +37 -17
- data/lib/hecks/cli/smoke_http/checks.rb +66 -0
- data/lib/hecks/cli/smoke_http/settings.rb +63 -0
- data/lib/hecks/cli/smoke_http/transport.rb +45 -0
- data/lib/hecks/cli/smoke_http.rb +8 -142
- data/lib/hecks/cli/smoke_test.rb +18 -4
- data/lib/hecks/cli/stores.rb +7 -4
- data/lib/hecks/cli/stress_concurrency_specs/reporting.rb +44 -0
- data/lib/hecks/cli/stress_concurrency_specs/usage.rb +28 -0
- data/lib/hecks/cli/stress_concurrency_specs.rb +82 -80
- data/lib/hecks/cli.rb +32 -208
- data/lib/hecks/codemod/runner.rb +92 -0
- data/lib/hecks/codemod/sweep.rb +94 -0
- data/lib/hecks/codemod.rb +22 -165
- data/lib/hecks/corpus/routes.rb +34 -0
- data/lib/hecks/corpus/rust.rb +193 -0
- data/lib/hecks/corpus/sources.rb +46 -0
- data/lib/hecks/corpus.rb +28 -265
- data/lib/hecks/deploy/bluebook/deploy.bluebook +1510 -3
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +57 -0
- data/lib/hecks/deploy/oidc.json +225 -0
- data/lib/hecks/doc/reference/coverage.rb +70 -0
- data/lib/hecks/doc/reference/harvester.rb +55 -0
- data/lib/hecks/doc/reference/readme.rb +89 -0
- data/lib/hecks/doc/reference/rendering.rb +149 -0
- data/lib/hecks/doc/reference.rb +14 -273
- data/lib/hecks/doors/cli_door/nesting.rb +34 -0
- data/lib/hecks/doors/cli_door/shorthand.rb +85 -0
- data/lib/hecks/doors/cli_door.rb +23 -95
- data/lib/hecks/doors/cli_runner/answers.rb +138 -0
- data/lib/hecks/doors/cli_runner/resolution.rb +146 -0
- data/lib/hecks/doors/cli_runner/settling.rb +115 -0
- data/lib/hecks/doors/cli_runner/streaming.rb +90 -0
- data/lib/hecks/doors/cli_runner/suggestions.rb +43 -0
- data/lib/hecks/doors/cli_runner.rb +12 -336
- data/lib/hecks/doors/command_request.rb +42 -31
- data/lib/hecks/doors/handle.rb +32 -30
- data/lib/hecks/doors/launcher_options.rb +62 -7
- data/lib/hecks/doors/mcp_door/properties.rb +47 -0
- data/lib/hecks/doors/mcp_door/tool_calls.rb +113 -0
- data/lib/hecks/doors/mcp_door/tool_definitions/auditing.rb +51 -0
- data/lib/hecks/doors/mcp_door/tool_definitions/calling.rb +69 -0
- data/lib/hecks/doors/mcp_door/tool_definitions/reading.rb +97 -0
- data/lib/hecks/doors/mcp_door/tool_definitions.rb +15 -0
- data/lib/hecks/doors/mcp_door.rb +55 -301
- data/lib/hecks/doors/mcp_door_scope/argument_policy.rb +92 -0
- data/lib/hecks/doors/mcp_door_scope/env_problems.rb +55 -0
- data/lib/hecks/doors/mcp_door_scope/presenter.rb +78 -0
- data/lib/hecks/doors/mcp_door_scope.rb +16 -172
- data/lib/hecks/doors/ruby_door/aggregate_door.rb +1 -1
- data/lib/hecks/doors/ruby_door/chapter.rb +33 -16
- data/lib/hecks/doors/ruby_door.rb +14 -11
- data/lib/hecks/doors/usage_cache.rb +14 -8
- data/lib/hecks/doors.rb +10 -4
- data/lib/hecks/embryonaut_bluebook/manifest.rb +11 -3
- data/lib/hecks/embryonaut_bluebook/registry/changelog.rb +26 -0
- data/lib/hecks/embryonaut_bluebook/registry/versions.rb +27 -0
- data/lib/hecks/embryonaut_bluebook/registry.rb +27 -37
- data/lib/hecks/embryonaut_bluebook/vendor/acceptance.rb +37 -0
- data/lib/hecks/embryonaut_bluebook/vendor.rb +22 -36
- data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +9 -6
- data/lib/hecks/embryonaut_bluebook.rb +16 -11
- data/lib/hecks/engine_agreement.rb +24 -17
- data/lib/hecks/forms/app/commands.rb +98 -0
- data/lib/hecks/forms/app/queries.rb +62 -0
- data/lib/hecks/forms/app/records.rb +67 -0
- data/lib/hecks/forms/app/responses.rb +46 -0
- data/lib/hecks/forms/app.rb +33 -221
- data/lib/hecks/forms/banking_presentation.rb +5 -0
- data/lib/hecks/forms/command_form_renderer.rb +55 -14
- data/lib/hecks/forms/field_controls.rb +95 -0
- data/lib/hecks/forms/field_renderer.rb +34 -88
- data/lib/hecks/forms/field_shape.rb +9 -34
- data/lib/hecks/forms/html.rb +1 -1
- data/lib/hecks/forms/index_renderer.rb +14 -9
- data/lib/hecks/forms/page.rb +2 -106
- data/lib/hecks/forms/page_assets.rb +88 -0
- data/lib/hecks/forms/page_script.rb +28 -0
- data/lib/hecks/forms/params.rb +17 -8
- data/lib/hecks/forms/query_form_renderer.rb +11 -7
- data/lib/hecks/forms/record_renderer.rb +28 -19
- data/lib/hecks/forms/reference_options.rb +1 -1
- data/lib/hecks/forms/text_shape.rb +40 -0
- data/lib/hecks/fqn.rb +64 -32
- data/lib/hecks/framework.rb +10 -3
- data/lib/hecks/freezer.rb +10 -1
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions/fragments.rb +61 -0
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions/productions.rb +217 -0
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +5 -194
- data/lib/hecks/fuzzing/combination_miner.rb +23 -12
- data/lib/hecks/fuzzing/concurrent_dispatch/racing.rb +64 -0
- data/lib/hecks/fuzzing/concurrent_dispatch/world_copy.rb +66 -0
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +31 -107
- data/lib/hecks/fuzzing/coverage_campaign.rb +7 -7
- data/lib/hecks/fuzzing/differential/wire_comparison.rb +74 -0
- data/lib/hecks/fuzzing/differential.rb +59 -84
- data/lib/hecks/fuzzing/domain_generator/block_rendering.rb +70 -0
- data/lib/hecks/fuzzing/domain_generator/builder/attribute_shapes.rb +105 -0
- data/lib/hecks/fuzzing/domain_generator/builder/shapes.rb +97 -0
- data/lib/hecks/fuzzing/domain_generator/builder/wiring.rb +128 -0
- data/lib/hecks/fuzzing/domain_generator/builder.rb +105 -0
- data/lib/hecks/fuzzing/domain_generator/pruning.rb +90 -0
- data/lib/hecks/fuzzing/domain_generator/removals.rb +62 -0
- data/lib/hecks/fuzzing/domain_generator/rendering.rb +94 -0
- data/lib/hecks/fuzzing/domain_generator/tokens.rb +38 -0
- data/lib/hecks/fuzzing/domain_generator.rb +7 -555
- data/lib/hecks/fuzzing/era_boundary.rb +34 -24
- data/lib/hecks/fuzzing/form_census.rb +18 -8
- data/lib/hecks/fuzzing/generated_domain_check.rb +23 -11
- data/lib/hecks/fuzzing/isolated_boot/copying.rb +62 -0
- data/lib/hecks/fuzzing/isolated_boot/postgres_scratch.rb +133 -0
- data/lib/hecks/fuzzing/isolated_boot/worlds.rb +102 -0
- data/lib/hecks/fuzzing/isolated_boot.rb +25 -252
- data/lib/hecks/fuzzing/persistence_parity.rb +5 -5
- data/lib/hecks/fuzzing/properties/aggregation_recompute.rb +121 -0
- data/lib/hecks/fuzzing/properties/catalog.rb +138 -0
- data/lib/hecks/fuzzing/properties/corrections.rb +23 -20
- data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +64 -185
- data/lib/hecks/fuzzing/properties/group_by_recompute.rb +69 -0
- data/lib/hecks/fuzzing/properties/guards.rb +76 -108
- data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +66 -227
- data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +46 -35
- data/lib/hecks/fuzzing/properties/mutation_recompute.rb +162 -0
- data/lib/hecks/fuzzing/properties/outbox.rb +41 -24
- data/lib/hecks/fuzzing/properties/piece_invariants.rb +61 -0
- data/lib/hecks/fuzzing/properties/policy_wiring.rb +140 -0
- data/lib/hecks/fuzzing/properties/query_rows.rb +67 -0
- data/lib/hecks/fuzzing/properties/querying.rb +69 -90
- data/lib/hecks/fuzzing/properties/references.rb +100 -0
- data/lib/hecks/fuzzing/properties/tenant_scope.rb +84 -0
- data/lib/hecks/fuzzing/properties.rb +6 -119
- data/lib/hecks/fuzzing/qa_settings.rb +23 -17
- data/lib/hecks/fuzzing/replay/fan_out.rb +78 -0
- data/lib/hecks/fuzzing/replay/filters.rb +72 -0
- data/lib/hecks/fuzzing/replay/guard_check.rb +88 -0
- data/lib/hecks/fuzzing/replay/mutation_trace.rb +117 -0
- data/lib/hecks/fuzzing/replay/observation.rb +60 -0
- data/lib/hecks/fuzzing/replay/read_only_steps.rb +84 -0
- data/lib/hecks/fuzzing/replay/session.rb +151 -0
- data/lib/hecks/fuzzing/replay.rb +35 -442
- data/lib/hecks/fuzzing/rust_gap_manifest.rb +3 -4
- data/lib/hecks/fuzzing/self_consistency/saga_redelivery.rb +133 -0
- data/lib/hecks/fuzzing/self_consistency/sagas.rb +93 -0
- data/lib/hecks/fuzzing/self_consistency/value_objects.rb +87 -0
- data/lib/hecks/fuzzing/self_consistency.rb +8 -213
- data/lib/hecks/fuzzing/sequence_generator/adversary/argument_mutations.rb +116 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary/caller_draw.rb +68 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary/identity_mutations.rb +62 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary/precedence_mutations.rb +126 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary.rb +23 -283
- data/lib/hecks/fuzzing/sequence_generator/argument_drawing.rb +78 -0
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +69 -53
- data/lib/hecks/fuzzing/sequence_generator/identity_shaping.rb +85 -0
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +20 -16
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +12 -6
- data/lib/hecks/fuzzing/sequence_generator/prefixing.rb +45 -0
- data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +19 -8
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +43 -144
- data/lib/hecks/fuzzing/sequence_generator.rb +65 -63
- data/lib/hecks/fuzzing/shrinker.rb +33 -29
- data/lib/hecks/fuzzing/target_capabilities.rb +10 -4
- data/lib/hecks/fuzzing/value_generator.rb +27 -17
- data/lib/hecks/gate/stages.yml +10 -0
- data/lib/hecks/grammar/evolve/arguments.rb +90 -0
- data/lib/hecks/grammar/evolve/keywords.rb +81 -0
- data/lib/hecks/grammar/evolve/seeds.rb +172 -0
- data/lib/hecks/grammar/evolve.rb +22 -263
- data/lib/hecks/grammar/operators.rb +111 -0
- data/lib/hecks/grammar.rb +53 -126
- data/lib/hecks/hecks/adapters/bluebook_report.rb +91 -0
- data/lib/hecks/hecks/adapters/codebase/codemods.rb +1 -1
- data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +23 -9
- data/lib/hecks/hecks/adapters/codebase/language/edits.rb +75 -0
- data/lib/hecks/hecks/adapters/codebase/language.rb +30 -72
- data/lib/hecks/hecks/adapters/codebase/promotion/candidates.rb +54 -0
- data/lib/hecks/hecks/adapters/codebase/promotion/gate.rb +50 -0
- data/lib/hecks/hecks/adapters/codebase/promotion/move.rb +70 -0
- data/lib/hecks/hecks/adapters/codebase/promotion/standing.rb +88 -0
- data/lib/hecks/hecks/adapters/codebase/promotion/watch.rb +83 -0
- data/lib/hecks/hecks/adapters/codebase/promotion.rb +115 -0
- data/lib/hecks/hecks/adapters/codebase/publishing.rb +31 -12
- data/lib/hecks/hecks/adapters/codebase/regeneration.rb +43 -6
- data/lib/hecks/hecks/adapters/codebase/release_facts.rb +16 -5
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +9 -1
- data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +1 -1
- data/lib/hecks/hecks/adapters/codebase/style.rb +1 -1
- data/lib/hecks/hecks/adapters/codebase/test_runner.rb +11 -5
- data/lib/hecks/hecks/adapters/codebase/test_suite.rb +27 -8
- data/lib/hecks/hecks/adapters/console_capture.rb +21 -17
- data/lib/hecks/hecks/adapters/cost_explorer.rb +11 -6
- data/lib/hecks/hecks/adapters/deploy_plans.rb +49 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain/answers.rb +141 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain/scripts.rb +95 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain/statuses.rb +74 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain.rb +122 -59
- data/lib/hecks/hecks/adapters/finding_github.rb +2 -2
- data/lib/hecks/hecks/adapters/first_admin.rb +22 -8
- data/lib/hecks/hecks/adapters/git.rb +18 -5
- data/lib/hecks/hecks/adapters/git_refs.rb +144 -0
- data/lib/hecks/hecks/adapters/github_rulesets.rb +126 -0
- data/lib/hecks/hecks/adapters/host_http.rb +16 -6
- data/lib/hecks/hecks/adapters/in_process_boot.rb +9 -5
- data/lib/hecks/hecks/adapters/in_process_operations/tailing.rb +61 -0
- data/lib/hecks/hecks/adapters/in_process_operations.rb +39 -37
- data/lib/hecks/hecks/adapters/journal_store/changes.rb +21 -15
- data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +29 -12
- data/lib/hecks/hecks/adapters/journal_store/readings/attestation.rb +52 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/scaffolding.rb +52 -0
- data/lib/hecks/hecks/adapters/journal_store/readings.rb +5 -62
- data/lib/hecks/hecks/adapters/local_files.rb +27 -10
- data/lib/hecks/hecks/adapters/pg_admin/ownership.rb +115 -0
- data/lib/hecks/hecks/adapters/pg_admin.rb +14 -87
- data/lib/hecks/hecks/adapters/process_pool.rb +54 -22
- data/lib/hecks/hecks/adapters/rust_toolchain.rb +12 -4
- data/lib/hecks/hecks/adapters/site_toolchain.rb +19 -10
- data/lib/hecks/hecks/adapters/terminal.rb +13 -9
- data/lib/hecks/hecks/codebase.bluebook +322 -5
- data/lib/hecks/hecks/custodian.bluebook +12 -2
- data/lib/hecks/hecks/hecks.hecksagon +73 -0
- data/lib/hecks/hecks/hecks.world +15 -3
- data/lib/hecks/kernel_capabilities/templates.rb +92 -0
- data/lib/hecks/kernel_capabilities.rb +18 -85
- data/lib/hecks/language/bluebook/vocabulary.bluebook +43 -1
- data/lib/hecks/literal/item_splitter.rb +50 -0
- data/lib/hecks/literal.rb +29 -38
- data/lib/hecks/mcp_stdio_guard.rb +8 -8
- data/lib/hecks/naming.rb +9 -3
- data/lib/hecks/persistence_legacy_fixture/postgres_stores.rb +81 -0
- data/lib/hecks/persistence_legacy_fixture/regenerate.rb +26 -66
- data/lib/hecks/persistence_legacy_fixture.rb +13 -10
- data/lib/hecks/ports/access_control.rb +13 -10
- data/lib/hecks/ports/agent/answers.rb +2 -2
- data/lib/hecks/ports/agent.rb +13 -10
- data/lib/hecks/ports/authentication.rb +13 -10
- data/lib/hecks/ports/authorization.rb +13 -10
- data/lib/hecks/ports/clock.rb +13 -10
- data/lib/hecks/ports/extraction.rb +13 -12
- data/lib/hecks/ports/identity_assignment.rb +13 -10
- data/lib/hecks/ports/identity_generation.rb +13 -10
- data/lib/hecks/ports/identity_resolution.rb +13 -10
- data/lib/hecks/ports/key_vault.rb +13 -10
- data/lib/hecks/ports/persistence/append_only.rb +5 -5
- data/lib/hecks/ports/persistence/binding_policy.rb +33 -9
- data/lib/hecks/ports/persistence/codec_boundary.rb +22 -11
- data/lib/hecks/ports/persistence/constants.rb +10 -0
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +18 -16
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +27 -18
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +52 -23
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +14 -8
- data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +17 -6
- data/lib/hecks/ports/persistence/plugins/era/lineage/coverage.rb +58 -0
- data/lib/hecks/ports/persistence/plugins/era/lineage/rewrite.rb +130 -0
- data/lib/hecks/ports/persistence/plugins/era/lineage/rules.rb +25 -0
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +20 -180
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/boot.rb +41 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/class_methods.rb +105 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/dialect.rb +137 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +25 -28
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/head_writes.rb +62 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/journal.rb +128 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/base_sql.rb +74 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/chain_sql.rb +169 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/domain_rename.rb +91 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_integrity.rb +99 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +0 -73
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +55 -39
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +51 -222
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/merge_writes.rb +120 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +85 -60
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +97 -181
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +19 -19
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/sql_templates.rb +88 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +77 -118
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +3 -117
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_sql.rb +116 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +3 -1
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/context.rb +38 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +43 -25
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +62 -38
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +21 -16
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +66 -86
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/refusals.rb +75 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +27 -9
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/query_phases.rb +63 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/sagas.rb +78 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +28 -482
- data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +40 -12
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +22 -15
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +39 -19
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +16 -16
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +48 -25
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +60 -99
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/path_diff.rb +57 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +21 -11
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +13 -4
- data/lib/hecks/ports/persistence/postgres_dump/connection.rb +4 -2
- data/lib/hecks/ports/persistence/postgres_dump.rb +13 -7
- data/lib/hecks/ports/persistence/repository_factory.rb +35 -11
- data/lib/hecks/ports/persistence/state_codec.rb +10 -0
- data/lib/hecks/ports/persistence.rb +1 -10
- data/lib/hecks/ports/projection.rb +34 -21
- data/lib/hecks/ports/query/in_memory.rb +16 -8
- data/lib/hecks/projection_files/expression_tables.rb +64 -0
- data/lib/hecks/projection_files/texts.rb +67 -0
- data/lib/hecks/projection_files.rb +19 -103
- data/lib/hecks/projections/bootstrap_table.rb +43 -29
- data/lib/hecks/projections/deploy/bastion_lines.rb +32 -0
- data/lib/hecks/projections/deploy/box/access.rb +73 -0
- data/lib/hecks/projections/deploy/box/caddy.rb +87 -0
- data/lib/hecks/projections/deploy/box/compose.rb +70 -0
- data/lib/hecks/projections/deploy/box/hosting.rb +16 -108
- data/lib/hecks/projections/deploy/box/hosting_parts.rb +97 -0
- data/lib/hecks/projections/deploy/box/hosting_settings.rb +1 -1
- data/lib/hecks/projections/deploy/box/roll_recipe.rb +62 -0
- data/lib/hecks/projections/deploy/box/roll_scripts.rb +135 -0
- data/lib/hecks/projections/deploy/box/settings/checks.rb +38 -0
- data/lib/hecks/projections/deploy/box/settings/containers.rb +123 -0
- data/lib/hecks/projections/deploy/box/settings/origin.rb +56 -0
- data/lib/hecks/projections/deploy/box/settings/patterns.rb +43 -0
- data/lib/hecks/projections/deploy/box/settings/types.rb +72 -0
- data/lib/hecks/projections/deploy/box/settings.rb +58 -263
- data/lib/hecks/projections/deploy/box/stack_yaml.rb +107 -0
- data/lib/hecks/projections/deploy/box/templates/MIGRATION.md.tmpl +39 -0
- data/lib/hecks/projections/deploy/box/templates/Makefile.tmpl +24 -0
- data/lib/hecks/projections/deploy/box/templates/deploy-box.sh.tmpl +51 -4
- data/lib/hecks/projections/deploy/box/templates/deploy-service.services-roll.part +4 -3
- data/lib/hecks/projections/deploy/box/templates/deploy-service.sh.tmpl +16 -4
- data/lib/hecks/projections/deploy/box/templates/deploy-service.taskdef-roll.part +8 -7
- data/lib/hecks/projections/deploy/box/templates/deploy-service.taskdef.part +1 -1
- data/lib/hecks/projections/deploy/box/templates/deploy-usage-services.tmpl +4 -0
- data/lib/hecks/projections/deploy/box/templates/deploy-usage-taskdef.tmpl +5 -0
- data/lib/hecks/projections/deploy/box/templates/ecr-repository.yaml.tmpl +9 -0
- data/lib/hecks/projections/deploy/box/templates/hosting.mk.tmpl +6 -3
- data/lib/hecks/projections/deploy/box/templates/mode-summary-services.tmpl +2 -0
- data/lib/hecks/projections/deploy/box/templates/mode-summary-taskdef.tmpl +4 -0
- data/lib/hecks/projections/deploy/box/templates/restore-to-rds.sh.tmpl +8 -3
- data/lib/hecks/projections/deploy/box/templates/services-block.tmpl +9 -0
- data/lib/hecks/projections/deploy/box/templates/tunnel-egress.yaml.tmpl +11 -0
- data/lib/hecks/projections/deploy/box/templates/verify-copy.sh.tmpl +2 -2
- data/lib/hecks/projections/deploy/box/templates/writable-secrets.yaml.tmpl +7 -0
- data/lib/hecks/projections/deploy/box.rb +37 -503
- data/lib/hecks/projections/deploy/fargate/assembly.rb +13 -142
- data/lib/hecks/projections/deploy/fargate/cdn/behaviors.rb +76 -0
- data/lib/hecks/projections/deploy/fargate/cdn/lines.rb +112 -0
- data/lib/hecks/projections/deploy/fargate/cdn/options.rb +85 -0
- data/lib/hecks/projections/deploy/fargate/cdn.rb +23 -215
- data/lib/hecks/projections/deploy/fargate/check.rb +16 -6
- data/lib/hecks/projections/deploy/fargate/containers/definition_lines.rb +61 -0
- data/lib/hecks/projections/deploy/fargate/containers/reading.rb +86 -0
- data/lib/hecks/projections/deploy/fargate/containers/rendering.rb +132 -0
- data/lib/hecks/projections/deploy/fargate/containers/routing.rb +93 -0
- data/lib/hecks/projections/deploy/fargate/containers.rb +10 -286
- data/lib/hecks/projections/deploy/fargate/extras/reading.rb +90 -0
- data/lib/hecks/projections/deploy/fargate/extras/rendering.rb +81 -0
- data/lib/hecks/projections/deploy/fargate/extras.rb +9 -158
- data/lib/hecks/projections/deploy/fargate/monitoring/alarms.rb +115 -0
- data/lib/hecks/projections/deploy/fargate/monitoring/reading.rb +84 -0
- data/lib/hecks/projections/deploy/fargate/monitoring/topic.rb +59 -0
- data/lib/hecks/projections/deploy/fargate/monitoring/warmer.rb +90 -0
- data/lib/hecks/projections/deploy/fargate/monitoring/warmer_roles.rb +76 -0
- data/lib/hecks/projections/deploy/fargate/monitoring.rb +14 -348
- data/lib/hecks/projections/deploy/fargate/sections.rb +115 -0
- data/lib/hecks/projections/deploy/fargate/settings/ids.rb +55 -0
- data/lib/hecks/projections/deploy/fargate/settings/tuning.rb +77 -0
- data/lib/hecks/projections/deploy/fargate/settings.rb +17 -104
- data/lib/hecks/projections/deploy/fargate/stack/blocks.rb +91 -0
- data/lib/hecks/projections/deploy/fargate/stack/readers.rb +87 -0
- data/lib/hecks/projections/deploy/fargate/stack/recipes.rb +106 -0
- data/lib/hecks/projections/deploy/fargate/stack.rb +146 -0
- data/lib/hecks/projections/deploy/fargate/task_sections.rb +56 -0
- data/lib/hecks/projections/deploy/fargate/yaml.rb +1 -1
- data/lib/hecks/projections/deploy/fargate.rb +51 -756
- data/lib/hecks/projections/deploy/lambda/pii.rb +49 -0
- data/lib/hecks/projections/deploy/lambda/stack/blocks.rb +118 -0
- data/lib/hecks/projections/deploy/lambda/stack/checks.rb +64 -0
- data/lib/hecks/projections/deploy/lambda/stack/deploy_chain.rb +119 -0
- data/lib/hecks/projections/deploy/lambda/stack/readers.rb +62 -0
- data/lib/hecks/projections/deploy/lambda/stack/reading.rb +170 -0
- data/lib/hecks/projections/deploy/lambda/stack/reading_web.rb +53 -0
- data/lib/hecks/projections/deploy/lambda/stack/recipes.rb +112 -0
- data/lib/hecks/projections/deploy/lambda/stack/web.rb +57 -0
- data/lib/hecks/projections/deploy/lambda/stack.rb +54 -0
- data/lib/hecks/projections/deploy/lambda.rb +77 -1885
- data/lib/hecks/projections/deploy/preview/access_yaml.rb +8 -74
- data/lib/hecks/projections/deploy/preview/containers.rb +18 -7
- data/lib/hecks/projections/deploy/preview/routing_yaml.rb +15 -87
- data/lib/hecks/projections/deploy/preview/settings.rb +7 -4
- data/lib/hecks/projections/deploy/preview/task_yaml.rb +42 -106
- data/lib/hecks/projections/deploy/preview/template.rb +11 -106
- data/lib/hecks/projections/deploy/preview/yaml_text.rb +1 -1
- data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +1 -1
- data/lib/hecks/projections/deploy/scripts/settings.rb +14 -6
- data/lib/hecks/projections/deploy/scripts.rb +11 -9
- data/lib/hecks/projections/deploy/shared/rows.rb +48 -0
- data/lib/hecks/projections/deploy/shared.rb +89 -449
- data/lib/hecks/projections/deploy/smoke.rb +15 -10
- data/lib/hecks/projections/deploy/template_diff/comparer.rb +21 -147
- data/lib/hecks/projections/deploy/template_diff/normalizer.rb +60 -0
- data/lib/hecks/projections/deploy/template_diff/value_diff.rb +136 -0
- data/lib/hecks/projections/deploy/template_diff.rb +8 -3
- data/lib/hecks/projections/deploy/templates/fargate/Dockerfile.tmpl +28 -0
- data/lib/hecks/projections/deploy/templates/fargate/Makefile.tmpl +63 -0
- data/lib/hecks/projections/deploy/templates/fargate/always_params.tmpl +4 -0
- data/lib/hecks/projections/deploy/templates/fargate/deploy_plain.tmpl +1 -0
- data/lib/hecks/projections/deploy/templates/fargate/deploy_shared.tmpl +11 -0
- data/lib/hecks/projections/deploy/templates/fargate/mint_era_own.tmpl +44 -0
- data/lib/hecks/projections/deploy/templates/fargate/mint_era_shared.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/fargate/missing_owner.tmpl +9 -0
- data/lib/hecks/projections/deploy/templates/fargate/oauth_params.tmpl +7 -0
- data/lib/hecks/projections/deploy/templates/fargate/oauth_task_env.tmpl +4 -0
- data/lib/hecks/projections/deploy/templates/fargate/oauth_task_policy.tmpl +7 -0
- data/lib/hecks/projections/deploy/templates/fargate/owning_params.tmpl +33 -0
- data/lib/hecks/projections/deploy/templates/fargate/template.yaml.tmpl +281 -0
- data/lib/hecks/projections/deploy/templates/lambda/Makefile.tmpl +218 -0
- data/lib/hecks/projections/deploy/templates/lambda/aurora_depends.tmpl +18 -0
- data/lib/hecks/projections/deploy/templates/lambda/build_dispatch_none.tmpl +10 -0
- data/lib/hecks/projections/deploy/templates/lambda/build_pg.tmpl +15 -0
- data/lib/hecks/projections/deploy/templates/lambda/build_plain.tmpl +2 -0
- data/lib/hecks/projections/deploy/templates/lambda/build_web.tmpl +11 -0
- data/lib/hecks/projections/deploy/templates/lambda/env_blind_guard.tmpl +4 -0
- data/lib/hecks/projections/deploy/templates/lambda/mint_era_own.tmpl +122 -0
- data/lib/hecks/projections/deploy/templates/lambda/mint_era_shared.tmpl +47 -0
- data/lib/hecks/projections/deploy/templates/lambda/missing_owner.tmpl +9 -0
- data/lib/hecks/projections/deploy/templates/lambda/nat_comment_oauth.tmpl +14 -0
- data/lib/hecks/projections/deploy/templates/lambda/nat_comment_plain.tmpl +3 -0
- data/lib/hecks/projections/deploy/templates/lambda/oauth_note.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/lambda/params_oauth.tmpl +13 -0
- data/lib/hecks/projections/deploy/templates/lambda/params_shared.tmpl +33 -0
- data/lib/hecks/projections/deploy/templates/lambda/pg_native.tmpl +71 -0
- data/lib/hecks/projections/deploy/templates/lambda/pii_oac.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/lambda/pii_permission.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/lambda/pii_resources.tmpl +116 -0
- data/lib/hecks/projections/deploy/templates/lambda/predeploy_bridge.tmpl +30 -0
- data/lib/hecks/projections/deploy/templates/lambda/predeploy_bridge_oauth.tmpl +12 -0
- data/lib/hecks/projections/deploy/templates/lambda/predeploy_bridge_plain.tmpl +7 -0
- data/lib/hecks/projections/deploy/templates/lambda/rename_schema_own.tmpl +93 -0
- data/lib/hecks/projections/deploy/templates/lambda/rename_schema_shared.tmpl +7 -0
- data/lib/hecks/projections/deploy/templates/lambda/rust_oauth_env.tmpl +17 -0
- data/lib/hecks/projections/deploy/templates/lambda/rust_oauth_policy.tmpl +16 -0
- data/lib/hecks/projections/deploy/templates/lambda/rust_session_secret.tmpl +13 -0
- data/lib/hecks/projections/deploy/templates/lambda/samconfig.toml.tmpl +12 -0
- data/lib/hecks/projections/deploy/templates/lambda/shared_note.tmpl +6 -0
- data/lib/hecks/projections/deploy/templates/lambda/sync_oauth.tmpl +23 -0
- data/lib/hecks/projections/deploy/templates/lambda/template.yaml.tmpl +187 -0
- data/lib/hecks/projections/deploy/templates/lambda/translation_own.tmpl +46 -0
- data/lib/hecks/projections/deploy/templates/lambda/translation_shared.tmpl +2 -0
- data/lib/hecks/projections/deploy/templates/lambda/web_function.tmpl +207 -0
- data/lib/hecks/projections/deploy/templates/lambda/web_google_oauth_env.tmpl +12 -0
- data/lib/hecks/projections/deploy/templates/lambda/web_no_oauth_env.tmpl +7 -0
- data/lib/hecks/projections/deploy/templates/lambda/web_oauth_policy.tmpl +4 -0
- data/lib/hecks/projections/deploy/templates/lambda/webhook_secret_resource.tmpl +20 -0
- data/lib/hecks/projections/deploy/templates/preview/alb.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/preview/alb_security_group.tmpl +11 -0
- data/lib/hecks/projections/deploy/templates/preview/assume_role.tmpl +6 -0
- data/lib/hecks/projections/deploy/templates/preview/base_parameters.tmpl +24 -0
- data/lib/hecks/projections/deploy/templates/preview/cluster.tmpl +4 -0
- data/lib/hecks/projections/deploy/templates/preview/container_secret.tmpl +9 -0
- data/lib/hecks/projections/deploy/templates/preview/db_init_script.sh.tmpl +23 -0
- data/lib/hecks/projections/deploy/templates/preview/db_init_secrets.tmpl +5 -0
- data/lib/hecks/projections/deploy/templates/preview/db_init_task.tmpl +39 -0
- data/lib/hecks/projections/deploy/templates/preview/desired_count.tmpl +5 -0
- data/lib/hecks/projections/deploy/templates/preview/distribution.tmpl +24 -0
- data/lib/hecks/projections/deploy/templates/preview/execution_role.tmpl +16 -0
- data/lib/hecks/projections/deploy/templates/preview/header.tmpl +16 -0
- data/lib/hecks/projections/deploy/templates/preview/ingress.tmpl +8 -0
- data/lib/hecks/projections/deploy/templates/preview/listener.tmpl +9 -0
- data/lib/hecks/projections/deploy/templates/preview/listener_rule.tmpl +11 -0
- data/lib/hecks/projections/deploy/templates/preview/log_group.tmpl +5 -0
- data/lib/hecks/projections/deploy/templates/preview/log_options.tmpl +5 -0
- data/lib/hecks/projections/deploy/templates/preview/outputs.tmpl +14 -0
- data/lib/hecks/projections/deploy/templates/preview/service.tmpl +17 -0
- data/lib/hecks/projections/deploy/templates/preview/session_secret.tmpl +11 -0
- data/lib/hecks/projections/deploy/templates/preview/target_group.tmpl +9 -0
- data/lib/hecks/projections/deploy/templates/preview/task_definition.tmpl +15 -0
- data/lib/hecks/projections/deploy/templates/preview/task_role.tmpl +22 -0
- data/lib/hecks/projections/deploy/templates/shared/aurora_db.tmpl +52 -0
- data/lib/hecks/projections/deploy/templates/shared/bastion.tmpl +74 -0
- data/lib/hecks/projections/deploy/templates/shared/bastion_own_public.tmpl +41 -0
- data/lib/hecks/projections/deploy/templates/shared/bastion_reuse_public.tmpl +10 -0
- data/lib/hecks/projections/deploy/templates/shared/nat_gateway.tmpl +102 -0
- data/lib/hecks/projections/deploy/templates/shared/oauth_egress.tmpl +17 -0
- data/lib/hecks/projections/deploy/templates/shared/plain_db.tmpl +16 -0
- data/lib/hecks/projections/deploy/templates/shared/vpc_and_database.tmpl +67 -0
- data/lib/hecks/projections/deploy/text_template.rb +35 -0
- data/lib/hecks/projections/diagrams/dispatch.rb +114 -0
- data/lib/hecks/projections/diagrams/statecharts.rb +59 -0
- data/lib/hecks/projections/diagrams/structure.rb +114 -0
- data/lib/hecks/projections/diagrams.rb +33 -256
- data/lib/hecks/projections/glossary/entries.rb +140 -0
- data/lib/hecks/projections/glossary/html/page.rb +96 -0
- data/lib/hecks/projections/glossary/html/parser.rb +66 -0
- data/lib/hecks/projections/glossary/html/sections.rb +78 -0
- data/lib/hecks/projections/glossary/html.rb +7 -179
- data/lib/hecks/projections/glossary/index.rb +45 -0
- data/lib/hecks/projections/glossary/markdown.rb +22 -11
- data/lib/hecks/projections/glossary/mermaid.rb +44 -31
- data/lib/hecks/projections/glossary/sensitivity.rb +7 -4
- data/lib/hecks/projections/glossary/sentences/value_objects.rb +77 -0
- data/lib/hecks/projections/glossary/sentences.rb +42 -81
- data/lib/hecks/projections/glossary/slugs.rb +33 -0
- data/lib/hecks/projections/glossary.rb +22 -190
- data/lib/hecks/projections/model.rb +20 -14
- data/lib/hecks/projections/rust_vocabulary/arguments/support.rb +33 -0
- data/lib/hecks/projections/rust_vocabulary/arguments.rb +171 -0
- data/lib/hecks/projections/rust_vocabulary/enum_body.rb +114 -0
- data/lib/hecks/projections/rust_vocabulary/tests.rb +144 -0
- data/lib/hecks/projections/rust_vocabulary.rb +24 -293
- data/lib/hecks/projections/site/admin.rb +146 -0
- data/lib/hecks/projections/site/admin_cms/templates/membership.rb +115 -0
- data/lib/hecks/projections/site/admin_cms/templates/session_strategy.rb +90 -0
- data/lib/hecks/projections/site/admin_cms/templates/sso.rb +101 -0
- data/lib/hecks/projections/site/admin_cms/templates/sso_tail.rb +54 -0
- data/lib/hecks/projections/site/admin_cms/templates/users.rb +83 -0
- data/lib/hecks/projections/site/admin_cms/templates.rb +33 -0
- data/lib/hecks/projections/site/admin_cms.rb +78 -0
- data/lib/hecks/projections/site/edge/behaviours.rb +10 -6
- data/lib/hecks/projections/site/edge/checks.rb +30 -80
- data/lib/hecks/projections/site/edge/findings.rb +28 -0
- data/lib/hecks/projections/site/edge/route_checks.rb +110 -0
- data/lib/hecks/projections/site/edge/row_reader.rb +52 -0
- data/lib/hecks/projections/site/edge/rules.rb +28 -26
- data/lib/hecks/projections/site/edge.rb +20 -31
- data/lib/hecks/projections/site/live_edge.rb +9 -7
- data/lib/hecks/projections/site/payload/fields/definitions.rb +90 -0
- data/lib/hecks/projections/site/payload/fields/readers.rb +69 -0
- data/lib/hecks/projections/site/payload/fields.rb +137 -0
- data/lib/hecks/projections/site/payload/lifecycle/text.rb +84 -0
- data/lib/hecks/projections/site/payload/lifecycle/text_tail.rb +106 -0
- data/lib/hecks/projections/site/payload/lifecycle.rb +33 -0
- data/lib/hecks/projections/site/payload/model.rb +128 -0
- data/lib/hecks/projections/site/payload/specs/wire.rb +69 -0
- data/lib/hecks/projections/site/payload/specs.rb +135 -0
- data/lib/hecks/projections/site/payload_driver.rb +95 -0
- data/lib/hecks/projections/site/root_rows.rb +67 -0
- data/lib/hecks/projections/site/routes_ts/helpers.rb +79 -0
- data/lib/hecks/projections/site/routes_ts/listings.rb +75 -0
- data/lib/hecks/projections/site/routes_ts/navigation.rb +79 -0
- data/lib/hecks/projections/site/routes_ts.rb +27 -175
- data/lib/hecks/projections/site/site_admin/access.rb +104 -0
- data/lib/hecks/projections/site/site_admin/session.rb +127 -0
- data/lib/hecks/projections/site/site_admin.rb +85 -0
- data/lib/hecks/projections/site/site_cdn.rb +12 -7
- data/lib/hecks/projections/site/site_host/dockerfile.rb +75 -0
- data/lib/hecks/projections/site/site_host/templates.rb +109 -0
- data/lib/hecks/projections/site/site_host.rb +58 -0
- data/lib/hecks/projections/site/site_root/workflow.rb +65 -0
- data/lib/hecks/projections/site/site_root.rb +128 -0
- data/lib/hecks/projections/site/table/checks.rb +28 -57
- data/lib/hecks/projections/site/table/link_builder.rb +14 -5
- data/lib/hecks/projections/site/table/navigation_checks.rb +75 -0
- data/lib/hecks/projections/site/table/row_builder.rb +31 -53
- data/lib/hecks/projections/site/table/row_defaults.rb +65 -0
- data/lib/hecks/projections/site/table.rb +9 -5
- data/lib/hecks/projections/vocabulary.rb +34 -31
- data/lib/hecks/projector/cli_audience.rb +42 -0
- data/lib/hecks/projector/cli_projector/claims.rb +149 -0
- data/lib/hecks/projector/cli_projector/command_help.rb +65 -0
- data/lib/hecks/projector/cli_projector/command_specs.rb +133 -0
- data/lib/hecks/projector/cli_projector/listing.rb +100 -0
- data/lib/hecks/projector/cli_projector/option_specs.rb +116 -0
- data/lib/hecks/projector/cli_projector/query_specs.rb +67 -0
- data/lib/hecks/projector/cli_projector/usage.rb +101 -0
- data/lib/hecks/projector/cli_projector.rb +15 -532
- data/lib/hecks/projector/docs_projector/attributes.rb +78 -0
- data/lib/hecks/projector/docs_projector/behaviour.rb +127 -0
- data/lib/hecks/projector/docs_projector/closing.rb +40 -0
- data/lib/hecks/projector/docs_projector.rb +58 -192
- data/lib/hecks/projector/exporter/bindings.rb +174 -0
- data/lib/hecks/projector/exporter/translations.rb +127 -0
- data/lib/hecks/projector/exporter.rb +8 -279
- data/lib/hecks/projector/narrate_projector/commands.rb +108 -0
- data/lib/hecks/projector/narrate_projector/reactions.rb +33 -0
- data/lib/hecks/projector/narrate_projector.rb +60 -160
- data/lib/hecks/projector.rb +22 -13
- data/lib/hecks/quality_control/adapters/agent_profile.rb +25 -16
- data/lib/hecks/quality_control/adapters/github_checks.rb +42 -6
- data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +1 -1
- data/lib/hecks/quality_control/adapters/github_issues.rb +22 -10
- data/lib/hecks/quality_control/cli/qa_discover_external_domains/parsing.rb +54 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains/reporting.rb +44 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains/scanning.rb +119 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +28 -155
- data/lib/hecks/quality_control/cli/qa_domain_novelty/verdict.rb +76 -0
- data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +33 -66
- data/lib/hecks/quality_control/cli/qa_generated_domains/arguments.rb +62 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/blueprints.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/evaluation.rb +107 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/promotion.rb +107 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/reporting.rb +97 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/shrinking.rb +70 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains.rb +43 -327
- data/lib/hecks/quality_control/cli/qa_log_bug/arguments.rb +55 -0
- data/lib/hecks/quality_control/cli/qa_log_bug/proof.rb +65 -0
- data/lib/hecks/quality_control/cli/qa_log_bug.rb +18 -81
- data/lib/hecks/quality_control/cli/qa_mine_combinations/arguments.rb +54 -0
- data/lib/hecks/quality_control/cli/qa_mine_combinations/booting.rb +96 -0
- data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +45 -109
- data/lib/hecks/quality_control/cli/qa_open_pr/arguments.rb +55 -0
- data/lib/hecks/quality_control/cli/qa_open_pr/recording.rb +79 -0
- data/lib/hecks/quality_control/cli/qa_open_pr/rules.rb +122 -0
- data/lib/hecks/quality_control/cli/qa_open_pr.rb +41 -200
- data/lib/hecks/quality_control/cli/qa_postgres_migrate/copying.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_postgres_migrate/reporting.rb +33 -0
- data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +37 -63
- data/lib/hecks/quality_control/cli/qa_postgres_role/ownership.rb +57 -0
- data/lib/hecks/quality_control/cli/qa_postgres_role.rb +66 -71
- data/lib/hecks/quality_control/cli/qa_pr_check/checking.rb +118 -0
- data/lib/hecks/quality_control/cli/qa_pr_check/reporting.rb +54 -0
- data/lib/hecks/quality_control/cli/qa_pr_check.rb +28 -145
- data/lib/hecks/quality_control/cli/qa_seed_angles/seed.rb +80 -0
- data/lib/hecks/quality_control/cli/qa_seed_angles.rb +13 -86
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode/children.rb +80 -0
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode/report.rb +125 -0
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +63 -193
- data/lib/hecks/quality_control/cli/qa_sweep/checks/boundary.rb +92 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks/engines.rb +92 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks/seeds.rb +86 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks/shrinking.rb +69 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +10 -248
- data/lib/hecks/quality_control/cli/qa_sweep/conclusion.rb +60 -0
- data/lib/hecks/quality_control/cli/qa_sweep/depth.rb +61 -0
- data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +26 -13
- data/lib/hecks/quality_control/cli/qa_sweep/finding_report/shrunk.rb +42 -0
- data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +40 -41
- data/lib/hecks/quality_control/cli/qa_sweep/parsing/validation.rb +70 -0
- data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +35 -65
- data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +41 -22
- data/lib/hecks/quality_control/cli/qa_sweep/scratch.rb +67 -0
- data/lib/hecks/quality_control/cli/qa_sweep/seat.rb +94 -0
- data/lib/hecks/quality_control/cli/qa_sweep/seed_loop.rb +149 -0
- data/lib/hecks/quality_control/cli/qa_sweep/target_setup.rb +115 -0
- data/lib/hecks/quality_control/cli/qa_sweep.rb +22 -445
- data/lib/hecks/quality_control/cli/qa_tick/output.rb +107 -0
- data/lib/hecks/quality_control/cli/qa_tick/preflight.rb +95 -0
- data/lib/hecks/quality_control/cli/qa_tick.rb +42 -175
- data/lib/hecks/query_ir/formatting.rb +86 -0
- data/lib/hecks/query_ir/rules.rb +132 -0
- data/lib/hecks/query_ir/touchpoints.rb +104 -0
- data/lib/hecks/query_ir.rb +33 -281
- data/lib/hecks/query_ir_mcp/tools.rb +68 -0
- data/lib/hecks/query_ir_mcp.rb +27 -71
- data/lib/hecks/query_specification/common/comparison.rb +25 -5
- data/lib/hecks/query_specification/common/dsl.rb +1 -1
- data/lib/hecks/query_specification/common/null_policy.rb +9 -6
- data/lib/hecks/query_specification/common/options.rb +21 -14
- data/lib/hecks/query_specification/field_path.rb +5 -2
- data/lib/hecks/query_specification/hop_path.rb +15 -18
- data/lib/hecks/release/lane.rb +22 -0
- data/lib/hecks/release/runner/clean_tree.rb +2 -2
- data/lib/hecks/release/runner/commands.rb +1 -1
- data/lib/hecks/release/runner/options.rb +82 -0
- data/lib/hecks/release/runner/preflight.rb +12 -7
- data/lib/hecks/release/runner/publishing.rb +86 -0
- data/lib/hecks/release/runner/tagger.rb +8 -3
- data/lib/hecks/release/runner.rb +40 -156
- data/lib/hecks/rendering.rb +13 -9
- data/lib/hecks/router/door.rb +37 -0
- data/lib/hecks/router/namespace_installer.rb +45 -83
- data/lib/hecks/router/options_proxy.rb +44 -0
- data/lib/hecks/runtime/adapter_lookup.rb +45 -24
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -8
- data/lib/hecks/runtime/command_interpreter/delegation.rb +116 -0
- data/lib/hecks/runtime/command_interpreter/enforcement.rb +38 -0
- data/lib/hecks/runtime/command_interpreter/hydration.rb +139 -0
- data/lib/hecks/runtime/command_interpreter/list_mutations.rb +98 -0
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +67 -114
- data/lib/hecks/runtime/command_interpreter/persisting.rb +96 -0
- data/lib/hecks/runtime/command_interpreter.rb +57 -352
- data/lib/hecks/runtime/command_rules/admissibility.rb +64 -147
- data/lib/hecks/runtime/command_rules/arithmetic.rb +13 -72
- data/lib/hecks/runtime/command_rules/authorization.rb +9 -9
- data/lib/hecks/runtime/command_rules/emission.rb +13 -14
- data/lib/hecks/runtime/command_rules/guard_state.rb +49 -0
- data/lib/hecks/runtime/command_rules/invariants.rb +84 -0
- data/lib/hecks/runtime/command_rules/operands.rb +88 -0
- data/lib/hecks/runtime/command_rules/references.rb +59 -57
- data/lib/hecks/runtime/command_rules/tenant_boundary.rb +69 -0
- data/lib/hecks/runtime/dependency_planning/analyzer.rb +90 -0
- data/lib/hecks/runtime/dependency_planning/expression_reads.rb +73 -0
- data/lib/hecks/runtime/dependency_planning/mutation_analysis.rb +89 -0
- data/lib/hecks/runtime/dependency_planning/rule_analysis.rb +82 -0
- data/lib/hecks/runtime/dependency_planning.rb +3 -250
- data/lib/hecks/runtime/dispatcher/queries.rb +62 -0
- data/lib/hecks/runtime/dispatcher/result.rb +55 -0
- data/lib/hecks/runtime/dispatcher/routing.rb +107 -0
- data/lib/hecks/runtime/dispatcher.rb +64 -209
- data/lib/hecks/runtime/entity_element/location.rb +124 -0
- data/lib/hecks/runtime/entity_element/mutations.rb +150 -0
- data/lib/hecks/runtime/entity_element.rb +5 -177
- data/lib/hecks/runtime/entity_interpreter/enforcement.rb +51 -0
- data/lib/hecks/runtime/entity_interpreter/locating.rb +62 -0
- data/lib/hecks/runtime/entity_interpreter/resolution.rb +42 -0
- data/lib/hecks/runtime/entity_interpreter/saving.rb +49 -0
- data/lib/hecks/runtime/entity_interpreter.rb +45 -164
- data/lib/hecks/runtime/identity.rb +15 -9
- data/lib/hecks/runtime/instance.rb +11 -7
- data/lib/hecks/runtime/interpreting.rb +16 -8
- data/lib/hecks/runtime/invocation.rb +3 -155
- data/lib/hecks/runtime/invocation_builder.rb +132 -0
- data/lib/hecks/runtime/invocation_facts.rb +87 -0
- data/lib/hecks/runtime/loader/boot_steps.rb +96 -0
- data/lib/hecks/runtime/loader/described.rb +27 -0
- data/lib/hecks/runtime/loader.rb +27 -114
- data/lib/hecks/runtime/outbox/consumer_runner.rb +40 -0
- data/lib/hecks/runtime/outbox/fanout.rb +82 -0
- data/lib/hecks/runtime/outbox/relay.rb +149 -0
- data/lib/hecks/runtime/outbox.rb +3 -214
- data/lib/hecks/runtime/policy_interpreter/arguments.rb +67 -0
- data/lib/hecks/runtime/policy_interpreter/fan_out.rb +96 -0
- data/lib/hecks/runtime/policy_interpreter.rb +22 -137
- data/lib/hecks/runtime/port_operation_interpreter.rb +18 -17
- data/lib/hecks/runtime/query_interpreter/arguments.rb +51 -0
- data/lib/hecks/runtime/query_interpreter/entity_rows.rb +82 -0
- data/lib/hecks/runtime/query_interpreter/outside_answer.rb +89 -0
- data/lib/hecks/runtime/query_interpreter.rb +43 -191
- data/lib/hecks/runtime/reaction_invocation/identities.rb +92 -0
- data/lib/hecks/runtime/reaction_invocation/target_resolution.rb +88 -0
- data/lib/hecks/runtime/reaction_invocation.rb +66 -183
- data/lib/hecks/runtime/reaction_outcome.rb +7 -3
- data/lib/hecks/runtime/read_model_interpreter/head_ordering.rb +49 -0
- data/lib/hecks/runtime/read_model_interpreter/reductions.rb +123 -0
- data/lib/hecks/runtime/read_model_interpreter/shaping.rb +100 -0
- data/lib/hecks/runtime/read_model_interpreter.rb +71 -214
- data/lib/hecks/runtime/reference_hop.rb +11 -11
- data/lib/hecks/runtime/refusal_wording.rb +11 -8
- data/lib/hecks/runtime/registry/chapter_verification.rb +84 -0
- data/lib/hecks/runtime/registry/declarations.rb +17 -0
- data/lib/hecks/runtime/registry/durability_warnings.rb +71 -0
- data/lib/hecks/runtime/registry/hecksagon_rules.rb +124 -0
- data/lib/hecks/runtime/registry/merging.rb +49 -0
- data/lib/hecks/runtime/registry/providers.rb +139 -0
- data/lib/hecks/runtime/registry/query_verification.rb +144 -0
- data/lib/hecks/runtime/registry/read_repository.rb +61 -0
- data/lib/hecks/runtime/registry/runtime_state.rb +27 -0
- data/lib/hecks/runtime/registry/saga_persistence.rb +12 -8
- data/lib/hecks/runtime/registry/verification.rb +45 -389
- data/lib/hecks/runtime/registry/world_defaults.rb +3 -3
- data/lib/hecks/runtime/registry.rb +58 -296
- data/lib/hecks/runtime/remote_dispatcher.rb +47 -31
- data/lib/hecks/runtime/saga_interpreter/compensation.rb +90 -0
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +19 -10
- data/lib/hecks/runtime/saga_interpreter/delivery.rb +147 -0
- data/lib/hecks/runtime/saga_interpreter/lifecycle.rb +63 -0
- data/lib/hecks/runtime/saga_interpreter/transitions.rb +112 -0
- data/lib/hecks/runtime/saga_interpreter.rb +41 -320
- data/lib/hecks/runtime/tenant_check.rb +14 -9
- data/lib/hecks/runtime/value/admission.rb +28 -19
- data/lib/hecks/runtime/value/coercion.rb +55 -404
- data/lib/hecks/runtime/value/entity_list_coercion.rb +27 -29
- data/lib/hecks/runtime/value/field_checks.rb +57 -100
- data/lib/hecks/runtime/value/flags.rb +65 -0
- data/lib/hecks/runtime/value/identifiers.rb +64 -0
- data/lib/hecks/runtime/value/references.rb +195 -0
- data/lib/hecks/runtime/value/shape_checks.rb +61 -0
- data/lib/hecks/runtime/value/validation.rb +125 -0
- data/lib/hecks/runtime/value.rb +18 -6
- data/lib/hecks/rust_build/conformance/surface.rb +75 -0
- data/lib/hecks/rust_build/conformance.rb +27 -59
- data/lib/hecks/rust_build/conformance_fuzz.rb +26 -15
- data/lib/hecks/rust_build/coverage.rb +32 -104
- data/lib/hecks/rust_build/coverage_parts/expected.rb +68 -0
- data/lib/hecks/rust_build/coverage_parts/printer.rb +75 -0
- data/lib/hecks/rust_build/host.rb +23 -13
- data/lib/hecks/rust_build/kernel_input.rb +19 -12
- data/lib/hecks/rust_build/native_build.rb +19 -15
- data/lib/hecks/rust_build/project_rust/domain_loader.rb +75 -0
- data/lib/hecks/rust_build/project_rust/root_mod/notes.rb +66 -0
- data/lib/hecks/rust_build/project_rust/root_mod.rb +22 -55
- data/lib/hecks/rust_build/project_rust/target_ir.rb +74 -0
- data/lib/hecks/rust_build/project_rust.rb +21 -89
- data/lib/hecks/rust_build/wasm.rb +11 -4
- data/lib/hecks/rust_build/wasm_browser.rb +7 -7
- data/lib/hecks/rust_build/write_if_changed.rb +3 -6
- data/lib/hecks/rust_build.rb +7 -3
- data/lib/hecks/site/bluebook/site.bluebook +7 -1
- data/lib/hecks/storehouse/audit.rb +106 -0
- data/lib/hecks/storehouse/callers.rb +73 -0
- data/lib/hecks/storehouse/dispatching.rb +149 -0
- data/lib/hecks/storehouse/introspection.rb +145 -0
- data/lib/hecks/storehouse/querying.rb +78 -0
- data/lib/hecks/storehouse.rb +43 -451
- data/lib/hecks/tickets/bluebook/tickets.bluebook +29 -0
- data/lib/hecks/tools/argument_gate_matrix/dispatching.rb +69 -0
- data/lib/hecks/tools/argument_gate_matrix/rows.rb +121 -0
- data/lib/hecks/tools/argument_gate_matrix/violations.rb +108 -0
- data/lib/hecks/tools/argument_gate_matrix.rb +43 -212
- data/lib/hecks/tools/ci_gate_decision.rb +21 -14
- data/lib/hecks/tools/ci_gates.rb +40 -26
- data/lib/hecks/tools/comment_style/baseline.rb +41 -0
- data/lib/hecks/tools/comment_style/caps_words.rb +104 -0
- data/lib/hecks/tools/comment_style/cli.rb +121 -0
- data/lib/hecks/tools/comment_style/dictionary.rb +60 -0
- data/lib/hecks/tools/comment_style/fixing.rb +119 -0
- data/lib/hecks/tools/comment_style/long_blocks.rb +51 -0
- data/lib/hecks/tools/comment_style/masking.rb +94 -0
- data/lib/hecks/tools/comment_style/patterns.rb +61 -0
- data/lib/hecks/tools/comment_style/run.rb +161 -0
- data/lib/hecks/tools/comment_style/signature.rb +59 -0
- data/lib/hecks/tools/comment_style/source_file.rb +105 -0
- data/lib/hecks/tools/comment_style/structure_checks.rb +113 -0
- data/lib/hecks/tools/comment_style/text_checks.rb +67 -0
- data/lib/hecks/tools/comment_style/vocabulary.rb +55 -0
- data/lib/hecks/tools/comment_style/walker.rb +136 -0
- data/lib/hecks/tools/comment_style.rb +17 -1000
- data/lib/hecks/tools/corpus_report.rb +26 -16
- data/lib/hecks/tools/deploy_recipe/targets.rb +61 -0
- data/lib/hecks/tools/deploy_recipe/worlds.rb +114 -0
- data/lib/hecks/tools/deploy_recipe.rb +60 -174
- data/lib/hecks/tools/deploy_recipe_lint/checks.rb +78 -0
- data/lib/hecks/tools/deploy_recipe_lint/fixtures.rb +88 -0
- data/lib/hecks/tools/deploy_recipe_lint/makefile.rb +84 -0
- data/lib/hecks/tools/deploy_recipe_lint.rb +29 -192
- data/lib/hecks/tools/drop_implicit_append_fields.rb +20 -12
- data/lib/hecks/tools/era_projection_backfill.rb +50 -33
- data/lib/hecks/tools/era_reattest/reporting.rb +55 -0
- data/lib/hecks/tools/era_reattest.rb +32 -43
- data/lib/hecks/tools/evolve_run/arguments.rb +49 -0
- data/lib/hecks/tools/evolve_run/words.rb +60 -0
- data/lib/hecks/tools/evolve_run.rb +43 -90
- data/lib/hecks/tools/fuzz_sweep/findings.rb +106 -0
- data/lib/hecks/tools/fuzz_sweep/options.rb +69 -0
- data/lib/hecks/tools/fuzz_sweep/pool.rb +74 -0
- data/lib/hecks/tools/fuzz_sweep/reporting.rb +88 -0
- data/lib/hecks/tools/fuzz_sweep.rb +75 -273
- data/lib/hecks/tools/gate.rb +31 -16
- data/lib/hecks/tools/heki_compaction.rb +63 -42
- data/lib/hecks/tools/hoist_local_givens/rewriting.rb +119 -0
- data/lib/hecks/tools/hoist_local_givens.rb +89 -157
- data/lib/hecks/tools/journal_compaction.rb +40 -31
- data/lib/hecks/tools/lanes/files.rb +82 -0
- data/lib/hecks/tools/lanes/live.rb +41 -0
- data/lib/hecks/tools/lanes/rows.rb +45 -0
- data/lib/hecks/tools/lanes/ruleset.rb +44 -0
- data/lib/hecks/tools/lanes/watch_workflow.rb +82 -0
- data/lib/hecks/tools/lanes/workflow.rb +79 -0
- data/lib/hecks/tools/lanes.rb +71 -0
- data/lib/hecks/tools/oidc_manifests.rb +10 -9
- data/lib/hecks/tools/query_ir_run.rb +7 -3
- data/lib/hecks/tools/regeneration_run.rb +40 -26
- data/lib/hecks/tools/rust_comment_style/caps_words.rb +98 -0
- data/lib/hecks/tools/rust_comment_style/fixing.rb +102 -0
- data/lib/hecks/tools/rust_comment_style/masking.rb +85 -0
- data/lib/hecks/tools/rust_comment_style/run.rb +94 -0
- data/lib/hecks/tools/rust_comment_style/source_file.rb +71 -0
- data/lib/hecks/tools/rust_comment_style/structure.rb +79 -0
- data/lib/hecks/tools/rust_comment_style/text_checks.rb +63 -0
- data/lib/hecks/tools/rust_comment_style/tokenizer.rb +102 -0
- data/lib/hecks/tools/rust_comment_style.rb +38 -535
- data/lib/hecks/tools/sequence_script.rb +20 -14
- data/lib/hecks/tools/site_routes/cli.rb +70 -0
- data/lib/hecks/tools/site_routes/root_files.rb +59 -0
- data/lib/hecks/tools/site_routes/templates.rb +77 -0
- data/lib/hecks/tools/site_routes.rb +102 -108
- data/lib/hecks/tools/tail_merge.rb +45 -37
- data/lib/hecks/tools/tenant_provisioning.rb +45 -31
- data/lib/hecks/tools/tools_doc.rb +42 -19
- data/lib/hecks/tools/translation_audit/domain_loading.rb +71 -0
- data/lib/hecks/tools/translation_audit/edges.rb +71 -0
- data/lib/hecks/tools/translation_audit/verdicts.rb +107 -0
- data/lib/hecks/tools/translation_audit.rb +30 -161
- data/lib/hecks/tools/translation_scaffold/reporting.rb +40 -0
- data/lib/hecks/tools/translation_scaffold.rb +77 -60
- data/lib/hecks/tools.rb +1 -0
- data/lib/hecks/vendoring.rb +37 -11
- data/lib/hecks/version.rb +1 -1
- data/lib/hecks/vocabulary.rb +16 -1
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +7 -9
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +8 -6
- data/rust/.cargo/mutants.toml +8 -0
- data/rust/host/Cargo.toml +5 -0
- data/rust/host/HECKS_RELEASE +1 -1
- data/rust/host/src/auth.rs +32 -0
- data/rust/host/src/web.rs +2 -3
- data/rust/src/kernel/dispatch.rs +4 -0
- data/rust/src/kernel/dispatch_guard_tests.rs +506 -0
- data/rust/src/kernel/orchestrate.rs +4 -0
- data/rust/src/kernel/orchestrate_guard_tests.rs +708 -0
- metadata +607 -3
- /data/lib/hecks/bluebook/behaviour/{hexagon.rb → hecksagon.rb} +0 -0
|
@@ -5,6 +5,11 @@ require_relative "json_door"
|
|
|
5
5
|
require_relative "launcher_options"
|
|
6
6
|
require_relative "../projector"
|
|
7
7
|
require_relative "../ports/clock"
|
|
8
|
+
require_relative "cli_runner/answers"
|
|
9
|
+
require_relative "cli_runner/resolution"
|
|
10
|
+
require_relative "cli_runner/settling"
|
|
11
|
+
require_relative "cli_runner/streaming"
|
|
12
|
+
require_relative "cli_runner/suggestions"
|
|
8
13
|
|
|
9
14
|
module Hecks
|
|
10
15
|
module Doors
|
|
@@ -16,6 +21,12 @@ module Hecks
|
|
|
16
21
|
# The words that open the query namespace; `ask` is the older spelling.
|
|
17
22
|
QUERY_WORDS = %w[query ask].freeze
|
|
18
23
|
|
|
24
|
+
extend Resolution
|
|
25
|
+
extend Suggestions
|
|
26
|
+
extend Answers
|
|
27
|
+
extend Settling
|
|
28
|
+
extend Streaming
|
|
29
|
+
|
|
19
30
|
module_function
|
|
20
31
|
|
|
21
32
|
# Runs one command line against a booted domain and answers the text to print.
|
|
@@ -36,62 +47,6 @@ module Hecks
|
|
|
36
47
|
bluebook: plan[:bluebook], launcher: plan[:launcher])
|
|
37
48
|
end
|
|
38
49
|
|
|
39
|
-
# Tails a question: asks, prints each new entry as one JSON line, and asks again from the
|
|
40
|
-
# cursor the answer gave, until the reader interrupts. Only for a question the `launcher`
|
|
41
|
-
# setting lists under `streams`, given `--stream`; `from_now` applies to the first ask only.
|
|
42
|
-
#
|
|
43
|
-
# @param runtime [Runtime::Dispatcher, Runtime::RemoteDispatcher] the booted domain
|
|
44
|
-
# @param argv [Array<String>] as for `call`, with `--stream`
|
|
45
|
-
# @param program [String] how the caller was invoked
|
|
46
|
-
# @param out [IO] where each entry's line goes
|
|
47
|
-
# @param err [IO] where a refusal goes
|
|
48
|
-
# @param max_polls [Integer, nil] stop after this many asks; unbounded when nil
|
|
49
|
-
# @return [Integer, nil] 0 or 1 for a stream, nil when `call` should run the line
|
|
50
|
-
def stream(runtime:, argv:, program: "hecks run", out: $stdout, err: $stderr, max_polls: nil)
|
|
51
|
-
plan = resolve(runtime, argv, program)
|
|
52
|
-
return if plan[:answer] || !LauncherOptions.streams?(plan[:launcher], plan[:spec])
|
|
53
|
-
|
|
54
|
-
words, streaming = LauncherOptions.take_stream(plan[:rest])
|
|
55
|
-
return unless streaming
|
|
56
|
-
|
|
57
|
-
tail(runtime, plan[:spec], CliDoor.arguments(plan[:spec], words), out, max_polls)
|
|
58
|
-
0
|
|
59
|
-
rescue Interrupt, Errno::EPIPE
|
|
60
|
-
0
|
|
61
|
-
rescue Runtime::NotFound, Runtime::TypeMismatch => e
|
|
62
|
-
err.puts("#{e.message}\n\n #{program} #{plan[:name]} --help")
|
|
63
|
-
1
|
|
64
|
-
rescue *Runtime::DOMAIN_REFUSALS => e
|
|
65
|
-
err.puts(e.message)
|
|
66
|
-
1
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# One ask after another, each from the cursor the last gave.
|
|
70
|
-
def tail(runtime, spec, args, out, max_polls)
|
|
71
|
-
args = args.merge(wait: { value: 30 }) unless args.key?(:wait)
|
|
72
|
-
polls = 0
|
|
73
|
-
cursor = nil
|
|
74
|
-
loop do
|
|
75
|
-
ask = cursor ? args.except(:from_now).merge(since: { value: cursor }) : args
|
|
76
|
-
rows = runtime.query(spec[:command], **ask)
|
|
77
|
-
row = rows.first || {}
|
|
78
|
-
Array(row[:events]).each { |event| out.puts(JSON.generate(entry_line(JsonDoor.materialize(event)))) }
|
|
79
|
-
out.flush
|
|
80
|
-
cursor = row[:cursor]
|
|
81
|
-
polls += 1
|
|
82
|
-
break if cursor.nil? || (max_polls && polls >= max_polls)
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
# An entry as a line: its payload, which the answer holds as JSON text, back as an object.
|
|
87
|
-
def entry_line(event)
|
|
88
|
-
line = JSON.parse(JSON.generate(event))
|
|
89
|
-
line["payload"] = JSON.parse(line["payload"]) if line["payload"].is_a?(String)
|
|
90
|
-
line
|
|
91
|
-
rescue JSON::ParserError
|
|
92
|
-
line
|
|
93
|
-
end
|
|
94
|
-
|
|
95
50
|
# Answers a command line that asks only for usage, from the projection alone.
|
|
96
51
|
#
|
|
97
52
|
# Needs a registry and no bound adapter, so a `Runtime::Loader::Described` serves: the
|
|
@@ -104,286 +59,7 @@ module Hecks
|
|
|
104
59
|
# @return [Array(String, Integer), nil] the text and status, or nil when the line would
|
|
105
60
|
# run a command or question and so needs a booted domain
|
|
106
61
|
def usage(runtime:, argv:, program: "hecks run")
|
|
107
|
-
UsageCache.fetch(runtime, argv, program) { resolve(runtime, argv, program)[:answer] }
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
# Parses a command line against the projection: either the answer it gives without
|
|
111
|
-
# running anything, or the command it would run.
|
|
112
|
-
#
|
|
113
|
-
# @return [Hash] `{answer: [text, status]}`, or `{spec:, name:, rest:, asking:, program:,
|
|
114
|
-
# bluebook:, launcher:}` for a command to dispatch
|
|
115
|
-
def resolve(runtime, argv, program)
|
|
116
|
-
bluebook, argv, program = chapter_for(runtime, argv, program)
|
|
117
|
-
launcher = LauncherOptions.settings(runtime, bluebook.name)
|
|
118
|
-
options = LauncherOptions.projection(launcher, program)
|
|
119
|
-
cli = Projector.call(:cli, bluebook: bluebook, options: options)
|
|
120
|
-
|
|
121
|
-
name = argv.first
|
|
122
|
-
return { answer: [cli[:usage], 0] } if name.nil? || %w[--help -h help].include?(name)
|
|
123
|
-
return { answer: [all_usage(bluebook, options), 0] } if name == "--all"
|
|
124
|
-
|
|
125
|
-
asking, name, argv = entry_word(cli, argv)
|
|
126
|
-
return { answer: [cli[:usage], 1] } if name.nil?
|
|
127
|
-
|
|
128
|
-
# The alias map lets `create_pizza` and `order.create_pizza` reach the same command.
|
|
129
|
-
pool = asking ? cli[:questions] : cli[:commands]
|
|
130
|
-
key = cli[:names][asking ? :question : :command][name]
|
|
131
|
-
spec = pool[key]
|
|
132
|
-
return { answer: [unknown(cli, name, asking, program), 1] } unless spec
|
|
133
|
-
|
|
134
|
-
rest = argv[1..]
|
|
135
|
-
if rest.include?("--help")
|
|
136
|
-
help = Projector.call(:cli, bluebook: bluebook,
|
|
137
|
-
options: options.merge(command: name, ask: asking))[:usage]
|
|
138
|
-
return { answer: [help, 0] }
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
{ spec: spec, name: name, rest: rest, asking: asking, program: program, bluebook: bluebook,
|
|
142
|
-
launcher: launcher }
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
# The usage with the internal commands and queries listed too, which `--all` asks for.
|
|
146
|
-
def all_usage(bluebook, options)
|
|
147
|
-
Projector.call(:cli, bluebook: bluebook, options: options.merge(all: true))[:usage]
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
# Reads the entry words of a line: whether it asks a query, the bare name, and the words
|
|
151
|
-
# from the name on.
|
|
152
|
-
#
|
|
153
|
-
# `query` gives queries their own namespace (`ask` is its older spelling); a chapter may
|
|
154
|
-
# declare a command and a query of one name. A trailing `!` says the word is a command and
|
|
155
|
-
# is not part of the name. A query answers to its bare name too; `query` is needed only when
|
|
156
|
-
# a command shares it.
|
|
157
|
-
#
|
|
158
|
-
# @return [Array(Boolean, String, Array<String>)] `asking`, `name` (nil when absent), `argv`
|
|
159
|
-
def entry_word(cli, argv)
|
|
160
|
-
asking = QUERY_WORDS.include?(argv.first)
|
|
161
|
-
argv = argv[1..] if asking
|
|
162
|
-
name = argv.first
|
|
163
|
-
return [asking, nil, argv] if name.nil?
|
|
164
|
-
|
|
165
|
-
bang = name.end_with?("!")
|
|
166
|
-
name = name.chomp("!") if bang
|
|
167
|
-
asking ||= !bang && !cli[:names][:command].key?(name) && cli[:names][:question].key?(name)
|
|
168
|
-
[asking, name, argv]
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
# The chapter a command line speaks to: the booted domain's own, or, when the first word
|
|
172
|
-
# names a chapter its hecksagon attaches or uses as a framework member (`deploy`,
|
|
173
|
-
# `governance`), that chapter, with the word dropped and added to the program name.
|
|
174
|
-
def chapter_for(runtime, argv, program)
|
|
175
|
-
own = runtime.registry.bluebooks.values.first
|
|
176
|
-
attached = Array(runtime.registry.hecksagon(own.name)&.member_chapters)
|
|
177
|
-
target = attached.find { |name| Naming.snake(name) == argv.first }
|
|
178
|
-
return [own, argv, program] unless target
|
|
179
|
-
|
|
180
|
-
[runtime.registry.bluebook(target), argv[1..], "#{program} #{argv.first}"]
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
# Parses one resolved command's arguments, runs it as a query or command, and turns the
|
|
184
|
-
# outcome, or the domain's refusal, into `[json_or_message, status]`. With `--wait`, a
|
|
185
|
-
# question whose report names a gap (`LauncherOptions.gap_reported?`) answers status 1.
|
|
186
|
-
#
|
|
187
|
-
# @param bluebook [Bluebook::Chapter] the chapter the command belongs to
|
|
188
|
-
# @param launcher [Hash, nil] the chapter's `launcher` world setting; nil when not opted in
|
|
189
|
-
def dispatch(runtime, spec, name, rest, program, asking, bluebook: nil, launcher: nil)
|
|
190
|
-
rest, wait = LauncherOptions.take_wait(spec, rest) if launcher
|
|
191
|
-
wait ||= LauncherOptions.settled?(launcher, spec)
|
|
192
|
-
args = CliDoor.arguments(spec, rest)
|
|
193
|
-
|
|
194
|
-
return answer_query(runtime, spec, args, wait) if spec[:kind] == :query
|
|
195
|
-
|
|
196
|
-
args, minted = LauncherOptions.run_key(runtime, spec, args, launcher)
|
|
197
|
-
# Answers with only this command's outcome; a full store dump is every record there is.
|
|
198
|
-
request = CommandRequest.normalize(args, receiver: spec[:receiver],
|
|
199
|
-
legacy_receiver: spec[:legacy_receiver])
|
|
200
|
-
handle = runtime.dispatch_flat(spec[:command], request)
|
|
201
|
-
extra = refused_answer(handle)
|
|
202
|
-
extra = { run: minted }.merge(extra) if minted
|
|
203
|
-
return settled(runtime, spec, handle, bluebook, launcher, extra) if wait
|
|
204
|
-
return [JSON.pretty_generate(answered(handle).merge(extra)), 0] if handle.state.nil?
|
|
205
|
-
|
|
206
|
-
[JSON.pretty_generate({ id: handle.id,
|
|
207
|
-
state: JsonDoor.materialize(handle.state),
|
|
208
|
-
events: handle.events.map(&:name) }.merge(extra)), 0]
|
|
209
|
-
rescue Runtime::NotFound, Runtime::TypeMismatch => e
|
|
210
|
-
# A bad argument and a missing record both need the same next step: read the help.
|
|
211
|
-
["#{e.message}\n\n #{program} #{'query ' if asking}#{name} --help", 1]
|
|
212
|
-
rescue *Runtime::DOMAIN_REFUSALS => e
|
|
213
|
-
# The refusal is the chapter's own sentence, verbatim.
|
|
214
|
-
[e.message, 1]
|
|
215
|
-
rescue StandardError => e
|
|
216
|
-
# So is a wrapped tool's, when a question's adapter refuses to answer. Matched by name: the
|
|
217
|
-
# adapters belong to the Hecks chapter, which a client's runtime never loads.
|
|
218
|
-
raise unless e.class.ancestors.map(&:name).include?(TOOL_REFUSAL)
|
|
219
|
-
|
|
220
|
-
[e.message, 1]
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
# Runs a question and answers its rows, or its text when an adapter answered in text.
|
|
224
|
-
#
|
|
225
|
-
# @param wait [Boolean, nil] whether `--wait` was given: a report naming a gap then fails
|
|
226
|
-
# @return [Array(String, Integer)] the answer and the status
|
|
227
|
-
def answer_query(runtime, spec, args, wait)
|
|
228
|
-
rows = runtime.query(spec[:command], **args)
|
|
229
|
-
text = text_answer(spec, rows)
|
|
230
|
-
[text || JSON.pretty_generate(rows.map { |row| JsonDoor.materialize(row) }),
|
|
231
|
-
wait && LauncherOptions.gap_reported?(text) ? 1 : 0]
|
|
232
|
-
end
|
|
233
|
-
|
|
234
|
-
# The answer `--wait` gives: the record re-read after every reaction has run, with all its
|
|
235
|
-
# events, and a status of 1 when its lifecycle ended in a failure state, a refused reaction
|
|
236
|
-
# blocks the run or a reaction crashed.
|
|
237
|
-
#
|
|
238
|
-
# A refusal blocks unless a sibling reaction delivered another command on the same
|
|
239
|
-
# aggregate (`Runtime::ReactionOutcome`). The settled record is always the text, so a failed
|
|
240
|
-
# run pipes like a passing one; the reason a human reads is a third element.
|
|
241
|
-
#
|
|
242
|
-
# @return [Array(String, Integer)] the JSON and the status, plus (Array(String, Integer,
|
|
243
|
-
# String)) why the run failed when it did
|
|
244
|
-
def settled(runtime, spec, handle, bluebook, launcher, extra)
|
|
245
|
-
why = reactions_failed(handle)
|
|
246
|
-
return finish(JSON.pretty_generate(answered(handle).merge(extra)), why) if handle.state.nil?
|
|
247
|
-
|
|
248
|
-
aggregate = aggregate_of(bluebook, spec)
|
|
249
|
-
state = reread(runtime, bluebook, aggregate, handle) || handle.state
|
|
250
|
-
fqn = "#{bluebook.name}::#{aggregate&.hecks_name}"
|
|
251
|
-
events = runtime.events.select { |event| event.aggregate == fqn && event.id == handle.id }
|
|
252
|
-
answer = { id: handle.id, state: JsonDoor.materialize(state),
|
|
253
|
-
events: (events.empty? ? handle.events : events).map(&:name) }.merge(extra)
|
|
254
|
-
failed = LauncherOptions.failed?(aggregate, state, launcher)
|
|
255
|
-
why += [failure_sentence(aggregate, state, aggregate.lifecycle.field)] if failed
|
|
256
|
-
return report_of(answer[:state], why) if LauncherOptions.report?(launcher, spec)
|
|
257
|
-
|
|
258
|
-
finish(JSON.pretty_generate(answer), why)
|
|
259
|
-
end
|
|
260
|
-
|
|
261
|
-
# The answer of a command the launcher prints as its report: the text it recorded, with
|
|
262
|
-
# the status 1 when the run failed, and nothing else.
|
|
263
|
-
def report_of(state, why)
|
|
264
|
-
text = state[why.empty? ? :output : :refusal]
|
|
265
|
-
text = text[:value] if text.is_a?(Hash)
|
|
266
|
-
text = why.join("\n") if text.to_s.strip.empty?
|
|
267
|
-
[text.to_s, why.empty? ? 0 : 1]
|
|
268
|
-
end
|
|
269
|
-
|
|
270
|
-
# The sentence for a record that ended in a failure state: the state, then the record's own
|
|
271
|
-
# `refusal` when it keeps one, without the class name an adapter's failure carries.
|
|
272
|
-
def failure_sentence(aggregate, state, field)
|
|
273
|
-
sentence = "#{aggregate.hecks_name} ended in the failure state #{state[field.to_sym].to_s.inspect}"
|
|
274
|
-
refusal = state[:refusal]
|
|
275
|
-
refusal = refusal.value if refusal.respond_to?(:value)
|
|
276
|
-
refusal = refusal[:value] if refusal.is_a?(Hash)
|
|
277
|
-
return sentence if refusal.to_s.strip.empty?
|
|
278
|
-
|
|
279
|
-
"#{sentence}: #{refusal.to_s.strip.sub(/\A(\w+::)+\w+: /, '')}"
|
|
280
|
-
end
|
|
281
|
-
|
|
282
|
-
# The answer and its status: 0 when nothing failed, else 1 with the reasons joined.
|
|
283
|
-
def finish(text, reasons)
|
|
284
|
-
reasons.empty? ? [text, 0] : [text, 1, reasons.join("\n")]
|
|
285
|
-
end
|
|
286
|
-
|
|
287
|
-
# What the reactions of the run the handle reports did wrong: each refusal that blocks it
|
|
288
|
-
# and each crash, as one sentence apiece.
|
|
289
|
-
def reactions_failed(handle)
|
|
290
|
-
blocking = handle.respond_to?(:blocking_reactions) ? handle.blocking_reactions : []
|
|
291
|
-
crashed = handle.respond_to?(:reaction_defects) ? handle.reaction_defects : []
|
|
292
|
-
blocking.map { |row| "reaction #{row[:policy]} was refused (#{row[:trigger]}): #{row[:reason]}" } +
|
|
293
|
-
crashed.map { |row| "reaction #{row[:policy]} crashed (#{row[:error_class]}): #{row[:reason]}" }
|
|
294
|
-
end
|
|
295
|
-
|
|
296
|
-
# Whether a reaction the domain refused blocks the run the handle reports.
|
|
297
|
-
def blocked?(handle)
|
|
298
|
-
handle.respond_to?(:blocking_reactions) && !handle.blocking_reactions.empty?
|
|
299
|
-
end
|
|
300
|
-
|
|
301
|
-
# The aggregate a top-level command belongs to; nil for an entity command or a port.
|
|
302
|
-
def aggregate_of(bluebook, spec)
|
|
303
|
-
head = spec[:command].split("::", 2).last
|
|
304
|
-
return if head.count(".") != 1
|
|
305
|
-
|
|
306
|
-
bluebook.aggregates.find { |aggregate| aggregate.hecks_name == head.split(".").first }
|
|
307
|
-
end
|
|
308
|
-
|
|
309
|
-
# The record as its repository holds it now, or nil when it cannot be read.
|
|
310
|
-
def reread(runtime, bluebook, aggregate, handle)
|
|
311
|
-
return unless aggregate && runtime.respond_to?(:registry)
|
|
312
|
-
|
|
313
|
-
runtime.registry.repository(bluebook.name, aggregate)&.find(handle.id)&.to_h
|
|
314
|
-
end
|
|
315
|
-
|
|
316
|
-
# The text a query answered by a port gave, when that is the whole answer.
|
|
317
|
-
#
|
|
318
|
-
# A query declared `returns Document` (one value object of the single String attribute
|
|
319
|
-
# `text`) answers one document; printing it raw keeps the document (JSON, Markdown,
|
|
320
|
-
# sentences) readable and pipeable instead of quoted inside another JSON document. What a
|
|
321
|
-
# query declares decides it, not how many rows came back: any other query prints JSON,
|
|
322
|
-
# so a script reading it sees an array whether it held one row or two.
|
|
323
|
-
#
|
|
324
|
-
# @param spec [Hash] the question's projected spec
|
|
325
|
-
# @param rows [Array<Hash>] the query's rows
|
|
326
|
-
# @return [String, nil] the text, or nil when the query does not return a Document
|
|
327
|
-
def text_answer(spec, rows)
|
|
328
|
-
return unless spec[:returns] == "Document" && rows.length == 1 && rows.first.keys == [:text]
|
|
329
|
-
return unless rows.first[:text].is_a?(String)
|
|
330
|
-
|
|
331
|
-
rows.first[:text]
|
|
332
|
-
end
|
|
333
|
-
|
|
334
|
-
# The reactions one dispatch caused that the domain refused, as `refused_reactions:`.
|
|
335
|
-
#
|
|
336
|
-
# A policy's trigger that a `given` refuses is not the command's own refusal: the command
|
|
337
|
-
# has already persisted. The dispatch result carries them (`Result#refused_reactions`);
|
|
338
|
-
# without this the answer would say nothing of it. A defect (a crash) is shown apart, as
|
|
339
|
-
# `reaction_defects:`, and fails `--wait`.
|
|
340
|
-
#
|
|
341
|
-
# @param handle [Runtime::Dispatcher::Result, Runtime::RemoteDispatcher::Result] the outcome
|
|
342
|
-
# @return [Hash] `refused_reactions:` each with the `policy`, its `trigger` and the `reason`;
|
|
343
|
-
# empty when every reaction was delivered (or a remote host sent no per-step log), plus
|
|
344
|
-
# `reaction_defects:` when one crashed
|
|
345
|
-
def refused_answer(handle)
|
|
346
|
-
refused = handle.respond_to?(:refused_reactions) ? handle.refused_reactions : []
|
|
347
|
-
defects = handle.respond_to?(:reaction_defects) ? handle.reaction_defects : []
|
|
348
|
-
answer = refused.empty? ? {} : { refused_reactions: refused }
|
|
349
|
-
defects.empty? ? answer : answer.merge(reaction_defects: defects)
|
|
350
|
-
end
|
|
351
|
-
|
|
352
|
-
# Shapes a port operation's outcome, which has no state: each event with its full payload.
|
|
353
|
-
#
|
|
354
|
-
# The answer lives only in the payloads, so names alone would drop it. Exit status stays 0
|
|
355
|
-
# for refusal events too, since a healthy no is an answer, not a misuse.
|
|
356
|
-
def answered(handle)
|
|
357
|
-
# A port operation hydrates no instance, so the handle's `id` is nil by design.
|
|
358
|
-
{ id: handle.id || handle.events.first&.id,
|
|
359
|
-
events: handle.events.map do |event|
|
|
360
|
-
{ name: event.name, payload: JsonDoor.materialize(event.payload) }
|
|
361
|
-
end }
|
|
362
|
-
end
|
|
363
|
-
|
|
364
|
-
# Words the answer for an unknown command or question, suggesting up to five near names.
|
|
365
|
-
# Ranked by shared prefix, which survives a dropped letter where a substring match would not.
|
|
366
|
-
def unknown(cli, name, asking, program)
|
|
367
|
-
# Both spellings are candidates: `order.create_piza` shares no prefix with `create_pizza`.
|
|
368
|
-
pool = cli[:names][asking ? :question : :command].keys
|
|
369
|
-
# A bare name is the commonest slip now that the aggregate is required: its homes first.
|
|
370
|
-
homes = (pool + cli[:names][asking ? :command : :question].keys)
|
|
371
|
-
.select { |candidate| candidate.split(".").last == name }.uniq
|
|
372
|
-
similar = pool.map { |candidate| [shared_prefix(candidate, name), candidate] }
|
|
373
|
-
.select { |shared, _| shared >= [name.length / 2, 3].max }
|
|
374
|
-
.sort_by { |shared, candidate| [-shared, candidate] }
|
|
375
|
-
.map(&:last)
|
|
376
|
-
near = homes + (similar - homes)
|
|
377
|
-
|
|
378
|
-
lines = ["no such #{asking ? 'query' : 'command'}: #{name}"]
|
|
379
|
-
lines += ["", "did you mean:", *near.first(5).map { |candidate| " #{candidate}" }] unless near.empty?
|
|
380
|
-
lines += ["", " #{program}#{' query' if asking} for the full list"]
|
|
381
|
-
lines.join("\n")
|
|
382
|
-
end
|
|
383
|
-
|
|
384
|
-
def shared_prefix(one, other)
|
|
385
|
-
length = [one.length, other.length].min
|
|
386
|
-
(0...length).find { |index| one[index] != other[index] } || length
|
|
62
|
+
UsageCache.fetch(runtime, argv, program, audience: audience_key) { resolve(runtime, argv, program)[:answer] }
|
|
387
63
|
end
|
|
388
64
|
end
|
|
389
65
|
end
|
|
@@ -34,18 +34,7 @@ module Hecks
|
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
def split(request, receiver:, legacy_receiver:)
|
|
37
|
-
if request.key?(:with)
|
|
38
|
-
loose = request.keys - [:to, :with]
|
|
39
|
-
unless loose.empty?
|
|
40
|
-
raise Runtime::TypeMismatch,
|
|
41
|
-
"an explicit command envelope takes routing in to: and facts in with:, not loose #{loose.sort.join(', ')}"
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
facts = request[:with]
|
|
45
|
-
raise Runtime::TypeMismatch, "with: must be a hash of command facts" unless facts.is_a?(Hash)
|
|
46
|
-
|
|
47
|
-
return [request[:to], facts]
|
|
48
|
-
end
|
|
37
|
+
return split_envelope(request) if request.key?(:with)
|
|
49
38
|
|
|
50
39
|
flat = request.dup
|
|
51
40
|
route = flat.delete(:to)
|
|
@@ -54,6 +43,20 @@ module Hecks
|
|
|
54
43
|
end
|
|
55
44
|
private_class_method :split
|
|
56
45
|
|
|
46
|
+
def split_envelope(request)
|
|
47
|
+
loose = request.keys - [:to, :with]
|
|
48
|
+
unless loose.empty?
|
|
49
|
+
raise Runtime::TypeMismatch,
|
|
50
|
+
"an explicit command envelope takes routing in to: and facts in with:, not loose #{loose.sort.join(", ")}"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
facts = request[:with]
|
|
54
|
+
raise Runtime::TypeMismatch, "with: must be a hash of command facts" unless facts.is_a?(Hash)
|
|
55
|
+
|
|
56
|
+
[request[:to], facts]
|
|
57
|
+
end
|
|
58
|
+
private_class_method :split_envelope
|
|
59
|
+
|
|
57
60
|
def take_legacy_route(flat, receiver, legacy_receiver)
|
|
58
61
|
return unless legacy_receiver
|
|
59
62
|
|
|
@@ -70,31 +73,39 @@ module Hecks
|
|
|
70
73
|
private_class_method :take_legacy_route
|
|
71
74
|
|
|
72
75
|
# One self-contained check per closed receiver kind, plus a backstop.
|
|
73
|
-
# rubocop:disable-next Metrics/CyclomaticComplexity
|
|
74
76
|
def validate_route!(route, receiver)
|
|
75
77
|
case receiver
|
|
76
|
-
when nil
|
|
77
|
-
|
|
78
|
-
when :
|
|
79
|
-
|
|
80
|
-
raise Runtime::TypeMismatch,
|
|
81
|
-
"to: must name the receiving aggregate identity"
|
|
82
|
-
end
|
|
83
|
-
when :entity
|
|
84
|
-
raise Runtime::TypeMismatch, "to: for an entity command must contain aggregate: and entity:" unless route.is_a?(Hash)
|
|
85
|
-
|
|
86
|
-
extra = route.keys - [:aggregate, :entity]
|
|
87
|
-
missing = [:aggregate, :entity].select { |key| route[key].nil? || route[key].to_s.empty? }
|
|
88
|
-
unless extra.empty? && missing.empty?
|
|
89
|
-
raise Runtime::TypeMismatch,
|
|
90
|
-
"to: for an entity command must contain only aggregate: and entity:"
|
|
91
|
-
end
|
|
92
|
-
else
|
|
93
|
-
raise ArgumentError, "unknown receiver kind #{receiver.inspect}"
|
|
78
|
+
when nil then refuse_receiver(route)
|
|
79
|
+
when :aggregate then require_identity(route)
|
|
80
|
+
when :entity then require_entity_route(route)
|
|
81
|
+
else raise ArgumentError, "unknown receiver kind #{receiver.inspect}"
|
|
94
82
|
end
|
|
95
83
|
end
|
|
96
84
|
private_class_method :validate_route!
|
|
97
85
|
|
|
86
|
+
def refuse_receiver(route)
|
|
87
|
+
raise Runtime::TypeMismatch, "this command does not take a receiver in to:" unless route.nil?
|
|
88
|
+
end
|
|
89
|
+
private_class_method :refuse_receiver
|
|
90
|
+
|
|
91
|
+
def require_identity(route)
|
|
92
|
+
return unless route.nil? || route.to_s.empty? || route.is_a?(Hash)
|
|
93
|
+
|
|
94
|
+
raise Runtime::TypeMismatch, "to: must name the receiving aggregate identity"
|
|
95
|
+
end
|
|
96
|
+
private_class_method :require_identity
|
|
97
|
+
|
|
98
|
+
def require_entity_route(route)
|
|
99
|
+
raise Runtime::TypeMismatch, "to: for an entity command must contain aggregate: and entity:" unless route.is_a?(Hash)
|
|
100
|
+
|
|
101
|
+
extra = route.keys - [:aggregate, :entity]
|
|
102
|
+
missing = [:aggregate, :entity].select { |key| route[key].nil? || route[key].to_s.empty? }
|
|
103
|
+
return if extra.empty? && missing.empty?
|
|
104
|
+
|
|
105
|
+
raise Runtime::TypeMismatch, "to: for an entity command must contain only aggregate: and entity:"
|
|
106
|
+
end
|
|
107
|
+
private_class_method :require_entity_route
|
|
108
|
+
|
|
98
109
|
def symbolize(value)
|
|
99
110
|
case value
|
|
100
111
|
when Hash then value.to_h { |key, nested| [key.to_sym, symbolize(nested)] }
|
data/lib/hecks/doors/handle.rb
CHANGED
|
@@ -110,24 +110,27 @@ module Hecks
|
|
|
110
110
|
# commands allow). Nesting is masked one level deep only.
|
|
111
111
|
def redacted(field)
|
|
112
112
|
raw = @state[field]
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
rows.each do |row|
|
|
117
|
-
path = row[:attribute_path][:value].to_s
|
|
118
|
-
next if authorized_for?(row[:readable_by][:value].to_s)
|
|
119
|
-
|
|
120
|
-
segments = path.split(".", 2)
|
|
121
|
-
if segments.size == 1
|
|
122
|
-
raw = "[redacted]"
|
|
123
|
-
elsif raw.is_a?(Runtime::Value)
|
|
124
|
-
raw = raw.with(segments[1], "[redacted]")
|
|
125
|
-
end
|
|
113
|
+
marked_rows(field).each do |row|
|
|
114
|
+
raw = masked(raw, row) unless authorized_for?(row[:readable_by][:value].to_s)
|
|
126
115
|
end
|
|
127
116
|
|
|
128
117
|
raw
|
|
129
118
|
end
|
|
130
119
|
|
|
120
|
+
# The privacy markings that name `field` or a path beneath it.
|
|
121
|
+
def marked_rows(field)
|
|
122
|
+
marked_paths.select { |row| row[:attribute_path][:value].to_s.split(".", 2).first == field.to_s }
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# `raw` with the marked leaf masked: the whole value for a marked field, one nested leaf of a
|
|
126
|
+
# value object for a marked path beneath it.
|
|
127
|
+
def masked(raw, row)
|
|
128
|
+
segments = row[:attribute_path][:value].to_s.split(".", 2)
|
|
129
|
+
return "[redacted]" if segments.size == 1
|
|
130
|
+
|
|
131
|
+
raw.is_a?(Runtime::Value) ? raw.with(segments[1], "[redacted]") : raw
|
|
132
|
+
end
|
|
133
|
+
|
|
131
134
|
# Cached per handle so an unattached-Privacy domain never pays for a query
|
|
132
135
|
# dispatch on every read.
|
|
133
136
|
def marked_paths
|
|
@@ -182,23 +185,22 @@ module Hecks
|
|
|
182
185
|
# (ADR 0025) — `piece.account` and `piece[:account]` (bracket access,
|
|
183
186
|
# the raw id) never collide despite sharing a name.
|
|
184
187
|
def define_reference_accessors
|
|
185
|
-
@ir.attributes.select(&:reference?).each
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
end
|
|
188
|
+
@ir.attributes.select(&:reference?).each { |attribute| define_reference_accessor(attribute) }
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# One lazy reader for a reference attribute.
|
|
192
|
+
def define_reference_accessor(attribute)
|
|
193
|
+
target = attribute.type.resolve
|
|
194
|
+
# Cross-domain, or otherwise unresolvable — no accessor rather than a guess.
|
|
195
|
+
return unless target
|
|
196
|
+
|
|
197
|
+
target_fqn = "#{@domain}::#{target.hecks_name}"
|
|
198
|
+
define_singleton_method(attribute.name) do
|
|
199
|
+
value = self[attribute.name]
|
|
200
|
+
door = Object.const_get(target_fqn)
|
|
201
|
+
next Array(value).map { |identity| door.find(identity) } if attribute.list?
|
|
202
|
+
|
|
203
|
+
value && door.find(value)
|
|
202
204
|
end
|
|
203
205
|
end
|
|
204
206
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
require "pathname"
|
|
1
2
|
require "stringio"
|
|
2
3
|
require_relative "../ports/identity_generation"
|
|
3
4
|
require_relative "../runtime/errors"
|
|
@@ -12,16 +13,21 @@ module Hecks
|
|
|
12
13
|
#
|
|
13
14
|
# - **run_keys** mints the `run` key of a creating command that was given none.
|
|
14
15
|
# - **failure_states** are the lifecycle states `--wait` reports as a failure (exit 1).
|
|
15
|
-
# - **settled** lists the commands (`aggregate.command`) that always
|
|
16
|
-
# was given, so a script gets their outcome in its exit status.
|
|
16
|
+
# - **settled** lists the commands (`aggregate.command`) that always act as if given `--wait`.
|
|
17
17
|
# - **report** lists the settled commands whose answer is the report they recorded, as text.
|
|
18
18
|
# - **names** maps a launcher name to the command it stands for (see `CliProjector`).
|
|
19
19
|
# - **streams** lists the questions `--stream` may tail, one JSON line per new entry.
|
|
20
|
+
# - **maintainer**, **chapters**, **maintainer_chapters** shape the help for its audience.
|
|
20
21
|
module LauncherOptions
|
|
21
22
|
SETTING = "launcher".freeze
|
|
22
23
|
WAIT = "--wait".freeze
|
|
23
24
|
STREAM = "--stream".freeze
|
|
24
25
|
RUN_KEY = "run.value".freeze
|
|
26
|
+
# What makes a directory a hecks checkout: this file stands beside `lib/`, the same test
|
|
27
|
+
# the Codebase aggregate's `Accept` applies before it runs anything.
|
|
28
|
+
CHECKOUT_MARKER = "hecks.gemspec".freeze
|
|
29
|
+
# `HECKS_MAINTAINER=1` shows the maintainer help anywhere, `0` hides it even in a checkout.
|
|
30
|
+
MAINTAINER_VARIABLE = "HECKS_MAINTAINER".freeze
|
|
25
31
|
|
|
26
32
|
module_function
|
|
27
33
|
|
|
@@ -47,6 +53,36 @@ module Hecks
|
|
|
47
53
|
{ program: program, names: settings && settings[:names], mint_run_keys: settings && settings[:run_keys] }
|
|
48
54
|
end
|
|
49
55
|
|
|
56
|
+
# Whether the person is working on a hecks checkout: `dir` or a directory above it holds
|
|
57
|
+
# `hecks.gemspec` beside `lib/`. `HECKS_MAINTAINER` overrides the look.
|
|
58
|
+
#
|
|
59
|
+
# @param dir [String] where the command line was typed
|
|
60
|
+
# @param env [#[]] the environment
|
|
61
|
+
# @return [Boolean] true for the maintainer's view of the help
|
|
62
|
+
def maintainer?(dir = Dir.pwd, env = ENV)
|
|
63
|
+
forced = env[MAINTAINER_VARIABLE].to_s
|
|
64
|
+
return forced != "0" unless forced.empty?
|
|
65
|
+
|
|
66
|
+
Pathname.new(File.expand_path(dir)).ascend.any? do |root|
|
|
67
|
+
root.join(CHECKOUT_MARKER).exist? && root.join("lib").directory?
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# The help options one audience gets: the aggregates left out of the lists (`maintainer`,
|
|
72
|
+
# shown only in a hecks checkout or to `--maintainer`) and the chapters pointed at
|
|
73
|
+
# (`chapters`, plus `maintainer_chapters` in a checkout). A chapter that did not opt in
|
|
74
|
+
# gets neither.
|
|
75
|
+
#
|
|
76
|
+
# @param settings [Hash, nil] the chapter's `launcher` setting
|
|
77
|
+
# @param maintainer [Boolean] whether the help is for someone working on a hecks checkout
|
|
78
|
+
# @return [Hash{Symbol => Object}] `:hide` and `:chapters`, to merge into the projection
|
|
79
|
+
def audience(settings, maintainer)
|
|
80
|
+
return {} unless settings
|
|
81
|
+
|
|
82
|
+
chapters = Array(settings[:chapters]) + (maintainer ? Array(settings[:maintainer_chapters]) : [])
|
|
83
|
+
{ hide: maintainer ? [] : Array(settings[:maintainer]).map(&:to_s), chapters: chapters.map(&:to_s) }
|
|
84
|
+
end
|
|
85
|
+
|
|
50
86
|
# Runs the block with standard error held back, so the wiring notes hecks prints about its own
|
|
51
87
|
# chapters (a Memory journal loses sagas on restart) do not open a console session. They are
|
|
52
88
|
# for an operator running a stored journal. A raised error still surfaces, unchanged.
|
|
@@ -74,9 +110,20 @@ module Hecks
|
|
|
74
110
|
# @return [Array(Array<String>, Boolean)] the remaining words, and whether `--wait` was given
|
|
75
111
|
# @raise [Runtime::TypeMismatch] if `--wait=` carries something that is not a Boolean word
|
|
76
112
|
def take_wait(spec, words)
|
|
77
|
-
return [words, false] unless words.any? { |word| wait_word?(word) }
|
|
78
|
-
return [words, false] if spec[:arguments].any? { |argument| argument[:path].split(".").first == "wait" }
|
|
113
|
+
return [words, false] unless words.any? { |word| wait_word?(word) } && !declares_wait?(spec)
|
|
79
114
|
|
|
115
|
+
split_wait(words)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Whether the command declares an argument of its own named `wait`.
|
|
119
|
+
# @api private
|
|
120
|
+
def declares_wait?(spec)
|
|
121
|
+
spec[:arguments].any? { |argument| argument[:path].split(".").first == "wait" }
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# The words without `--wait`, and whether it was given.
|
|
125
|
+
# @api private
|
|
126
|
+
def split_wait(words)
|
|
80
127
|
wait = false
|
|
81
128
|
rest = []
|
|
82
129
|
queue = words.dup
|
|
@@ -165,9 +212,7 @@ module Hecks
|
|
|
165
212
|
# @return [Array(Hash, String)] the arguments, and the key minted (nil when none was)
|
|
166
213
|
# @raise [Runtime::NotFound] if a key is owed but no identity adapter is bound
|
|
167
214
|
def run_key(runtime, spec, args, settings)
|
|
168
|
-
return [args, nil] unless
|
|
169
|
-
return [args, nil] unless spec[:arguments].any? { |argument| argument[:path] == RUN_KEY }
|
|
170
|
-
return [args, nil] if args.key?(:run) || !runtime.respond_to?(:registry)
|
|
215
|
+
return [args, nil] unless key_owed?(runtime, spec, args, settings)
|
|
171
216
|
|
|
172
217
|
key = Ports::IdentityGeneration.uuid(runtime.registry)
|
|
173
218
|
[args.merge(run: { value: key }), key]
|
|
@@ -175,6 +220,16 @@ module Hecks
|
|
|
175
220
|
raise Runtime::NotFound, "cannot mint a run key (#{e.message.lines.first.strip}); name one with run=<key>"
|
|
176
221
|
end
|
|
177
222
|
|
|
223
|
+
# Whether the command is a creating one of an opted-in chapter, takes a run key and was
|
|
224
|
+
# given none.
|
|
225
|
+
# @api private
|
|
226
|
+
def key_owed?(runtime, spec, args, settings)
|
|
227
|
+
return false unless settings && settings[:run_keys] && spec[:creates]
|
|
228
|
+
return false unless spec[:arguments].any? { |argument| argument[:path] == RUN_KEY }
|
|
229
|
+
|
|
230
|
+
!args.key?(:run) && runtime.respond_to?(:registry)
|
|
231
|
+
end
|
|
232
|
+
|
|
178
233
|
# Whether a settled record sits in one of the chapter's failure states.
|
|
179
234
|
#
|
|
180
235
|
# @param aggregate [Bluebook::Aggregate, nil] the record's aggregate
|