hecks 2.8.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/exe/hecks +50 -7
- data/lib/hecks/adapters/driven/claude_code.rb +4 -104
- data/lib/hecks/adapters/driven/d1.rb +44 -237
- data/lib/hecks/adapters/driven/folder.rb +17 -76
- data/lib/hecks/adapters/driven/google_authentication.rb +15 -49
- data/lib/hecks/adapters/driven/governance_authorization.rb +23 -70
- data/lib/hecks/adapters/driven/heki/journal.rb +8 -41
- data/lib/hecks/adapters/driven/heki/saga_store.rb +12 -54
- data/lib/hecks/adapters/driven/heki/snapshot.rb +4 -12
- data/lib/hecks/adapters/driven/heki.rb +13 -42
- data/lib/hecks/adapters/driven/identity_registry.rb +3 -14
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +9 -26
- data/lib/hecks/adapters/driven/in_process_key_vault.rb +2 -14
- data/lib/hecks/adapters/driven/lambda/client.rb +10 -51
- data/lib/hecks/adapters/driven/lambda.rb +10 -84
- data/lib/hecks/adapters/driven/local_storage.rb +5 -40
- data/lib/hecks/adapters/driven/memory.rb +32 -100
- data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +5 -21
- data/lib/hecks/adapters/driven/postgres/codec.rb +6 -28
- data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -12
- data/lib/hecks/adapters/driven/postgres/reconnect.rb +10 -32
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
- data/lib/hecks/adapters/driven/postgres/shared_connection.rb +180 -0
- data/lib/hecks/adapters/driven/postgres.rb +149 -136
- data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
- data/lib/hecks/adapters/driven/prism.rb +48 -38
- data/lib/hecks/adapters/driven/sql_query_builder.rb +21 -121
- data/lib/hecks/adapters/driven/sqlite/codec.rb +8 -40
- data/lib/hecks/adapters/driven/sqlite/projection.rb +26 -82
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +40 -84
- data/lib/hecks/adapters/driven/sqlite.rb +128 -65
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +76 -62
- data/lib/hecks/adapters/driven.rb +5 -36
- data/lib/hecks/adapters/driving/github_webhook.rb +8 -76
- data/lib/hecks/behaviors/dsl.rb +7 -25
- data/lib/hecks/behaviors/expectations.rb +32 -142
- data/lib/hecks/behaviors/ir.rb +7 -20
- data/lib/hecks/behaviors/rspec.rb +6 -17
- data/lib/hecks/behaviors/runner.rb +10 -34
- data/lib/hecks/behaviors.rb +4 -8
- data/lib/hecks/bench/cli.rb +62 -0
- data/lib/hecks/bench/environment.rb +71 -0
- data/lib/hecks/bench/postgres_probe.rb +30 -0
- data/lib/hecks/bench/report.rb +76 -0
- data/lib/hecks/bench/ruby_runner.rb +93 -0
- data/lib/hecks/bench/run.rb +55 -0
- data/lib/hecks/bench/rust_runner.rb +101 -0
- data/lib/hecks/bench/stats.rb +46 -0
- data/lib/hecks/bench/suite.rb +98 -0
- data/lib/hecks/bench/workload.rb +89 -0
- data/lib/hecks/bench.rb +17 -0
- data/lib/hecks/bluebook/aggregate.rb +9 -75
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +9 -38
- data/lib/hecks/bluebook/assembly/build.rb +4 -15
- data/lib/hecks/bluebook/assembly/contract.rb +15 -136
- data/lib/hecks/bluebook/assembly/contracts.rb +56 -174
- data/lib/hecks/bluebook/assembly/marks.rb +31 -223
- data/lib/hecks/bluebook/assembly/specializer.rb +6 -52
- data/lib/hecks/bluebook/assembly.rb +6 -45
- data/lib/hecks/bluebook/attribute.rb +12 -61
- data/lib/hecks/bluebook/behaviour/aggregate.rb +39 -39
- data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
- data/lib/hecks/bluebook/behaviour/chapter.rb +14 -42
- data/lib/hecks/bluebook/behaviour/command.rb +14 -66
- data/lib/hecks/bluebook/behaviour/domain_port.rb +11 -20
- data/lib/hecks/bluebook/behaviour/entity.rb +7 -27
- data/lib/hecks/bluebook/behaviour/hexagon.rb +23 -41
- data/lib/hecks/bluebook/behaviour/lifecycle.rb +15 -40
- data/lib/hecks/bluebook/behaviour/policy.rb +23 -52
- data/lib/hecks/bluebook/behaviour/process_manager.rb +30 -57
- data/lib/hecks/bluebook/behaviour/read_model.rb +25 -31
- data/lib/hecks/bluebook/behaviour/traits.rb +27 -64
- data/lib/hecks/bluebook/behaviour/value_object.rb +5 -24
- data/lib/hecks/bluebook/capabilities.rb +17 -49
- data/lib/hecks/bluebook/chapter.rb +16 -50
- data/lib/hecks/bluebook/command.rb +23 -81
- data/lib/hecks/bluebook/domain_port.rb +49 -67
- data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +50 -229
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +50 -377
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +33 -204
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +16 -69
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +96 -708
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +63 -169
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +3 -1
- data/lib/hecks/bluebook/dsl/command_builder.rb +74 -546
- data/lib/hecks/bluebook/dsl/const_shim.rb +8 -41
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +42 -89
- data/lib/hecks/bluebook/dsl/entity_builder.rb +44 -330
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +20 -269
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +148 -197
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +13 -88
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +6 -20
- data/lib/hecks/bluebook/dsl/policy_builder.rb +16 -88
- data/lib/hecks/bluebook/dsl/port_builder.rb +2 -6
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +22 -96
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +31 -184
- data/lib/hecks/bluebook/dsl/query_builder.rb +38 -43
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +75 -201
- data/lib/hecks/bluebook/dsl/rule_reference.rb +22 -163
- data/lib/hecks/bluebook/dsl/translation_builder.rb +28 -114
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +10 -124
- data/lib/hecks/bluebook/dsl/word_gate.rb +16 -162
- data/lib/hecks/bluebook/dsl/world_builder.rb +46 -111
- data/lib/hecks/bluebook/entity.rb +13 -71
- data/lib/hecks/bluebook/expression/ast_json.rb +24 -190
- data/lib/hecks/bluebook/expression/ast_reader.rb +12 -54
- data/lib/hecks/bluebook/expression/canonical_form.rb +11 -88
- data/lib/hecks/bluebook/expression/evaluator.rb +47 -295
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +30 -147
- data/lib/hecks/bluebook/expression/resolver.rb +39 -661
- data/lib/hecks/bluebook/hexagon.rb +18 -33
- data/lib/hecks/bluebook/lifecycle.rb +5 -16
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -7
- data/lib/hecks/bluebook/meta_validator/judge.rb +111 -361
- data/lib/hecks/bluebook/meta_validator/plan.rb +33 -162
- data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -7
- data/lib/hecks/bluebook/meta_validator/readings.rb +56 -342
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +25 -176
- data/lib/hecks/bluebook/meta_validator/shapes.rb +53 -267
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +47 -306
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
- data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +246 -0
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
- data/lib/hecks/bluebook/meta_validator.rb +87 -352
- data/lib/hecks/bluebook/model_check/client_profile.rb +6 -21
- data/lib/hecks/bluebook/model_check.rb +122 -596
- data/lib/hecks/bluebook/pattern_subset.rb +49 -69
- data/lib/hecks/bluebook/process_manager.rb +13 -83
- data/lib/hecks/bluebook/project_loader.rb +3 -39
- data/lib/hecks/bluebook/project_register.rb +12 -60
- data/lib/hecks/bluebook/query.rb +27 -51
- data/lib/hecks/bluebook/read_model.rb +57 -81
- data/lib/hecks/bluebook/reference.rb +7 -41
- data/lib/hecks/bluebook/smoke_test.rb +9 -99
- data/lib/hecks/bluebook/synthesizer.rb +13 -62
- data/lib/hecks/bluebook/translation.rb +26 -62
- data/lib/hecks/bluebook/value_object.rb +11 -36
- data/lib/hecks/bluebook.rb +5 -22
- data/lib/hecks/cache_dir.rb +4 -23
- data/lib/hecks/canonical_json.rb +30 -0
- data/lib/hecks/chapters.rb +102 -0
- data/lib/hecks/cli/behaviors.rb +61 -0
- data/lib/hecks/cli/canonicalise.rb +25 -0
- data/lib/hecks/cli/check_engine_agreement.rb +32 -0
- data/lib/hecks/cli/check_era.rb +88 -0
- data/lib/hecks/cli/console.rb +66 -0
- data/lib/hecks/cli/deploy_template_diff.rb +40 -0
- data/lib/hecks/cli/doc_coverage.rb +32 -0
- data/lib/hecks/cli/document.rb +5 -23
- data/lib/hecks/cli/expression_projection.rb +41 -0
- data/lib/hecks/cli/follow.rb +88 -0
- data/lib/hecks/cli/history.rb +44 -0
- data/lib/hecks/cli/ir.rb +4 -6
- data/lib/hecks/cli/mcp.rb +5 -6
- data/lib/hecks/cli/model_check.rb +24 -88
- data/lib/hecks/cli/pattern_cases.rb +47 -0
- data/lib/hecks/cli/present.rb +39 -0
- data/lib/hecks/cli/project_cli.rb +223 -64
- data/lib/hecks/cli/project_diagrams.rb +4 -10
- data/lib/hecks/cli/project_glossary.rb +44 -0
- data/lib/hecks/cli/reference.rb +46 -0
- data/lib/hecks/cli/refresh_projections.rb +44 -0
- data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +150 -0
- data/lib/hecks/cli/release.rb +70 -0
- data/lib/hecks/cli/release_gem.rb +59 -0
- data/lib/hecks/cli/rspec_io_parallel_files.rb +137 -0
- data/lib/hecks/cli/rspec_shard_files.rb +66 -0
- data/lib/hecks/cli/run.rb +15 -61
- data/lib/hecks/cli/seed_semantics_corpus.rb +71 -0
- data/lib/hecks/cli/serve_query_ir_mcp.rb +30 -0
- data/lib/hecks/cli/shape.rb +70 -0
- data/lib/hecks/cli/smoke_http.rb +230 -0
- data/lib/hecks/cli/smoke_test.rb +7 -19
- data/lib/hecks/cli/spec_example.rb +27 -0
- data/lib/hecks/cli/statements.rb +32 -0
- data/lib/hecks/cli/stores.rb +4 -6
- data/lib/hecks/cli/stress_concurrency_specs.rb +177 -0
- data/lib/hecks/cli.rb +216 -73
- data/lib/hecks/codemod.rb +324 -0
- data/lib/hecks/construct.rb +8 -34
- data/lib/hecks/corpus.rb +423 -0
- data/lib/hecks/deploy/bluebook/deploy.bluebook +617 -158
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +41 -11
- data/lib/hecks/deploy/oidc.json +82 -2
- data/lib/hecks/doc/reference.rb +351 -0
- data/lib/hecks/doors/cli_door.rb +196 -0
- data/lib/hecks/doors/cli_runner.rb +297 -0
- data/lib/hecks/{facade → doors}/command_request.rb +14 -34
- data/lib/hecks/doors/handle.rb +206 -0
- data/lib/hecks/doors/json_door.rb +132 -0
- data/lib/hecks/doors/launcher_options.rb +129 -0
- data/lib/hecks/{cli → doors}/mcp_door.rb +25 -120
- data/lib/hecks/doors/mcp_door_scope.rb +97 -0
- data/lib/hecks/doors/ruby_door/aggregate_door.rb +162 -0
- data/lib/hecks/doors/ruby_door/chapter.rb +72 -0
- data/lib/hecks/doors/ruby_door.rb +77 -0
- data/lib/hecks/doors.rb +61 -0
- data/lib/hecks/embryonaut_bluebook/lock.rb +3 -35
- data/lib/hecks/embryonaut_bluebook/shape.rb +1 -17
- data/lib/hecks/embryonaut_bluebook/vendor.rb +8 -53
- data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +4 -19
- data/lib/hecks/embryonaut_bluebook.rb +5 -72
- data/lib/hecks/engine_agreement.rb +156 -0
- data/lib/hecks/facade.rb +23 -51
- data/lib/hecks/forms/app.rb +21 -76
- data/lib/hecks/forms/banking_presentation.rb +50 -0
- data/lib/hecks/forms/command_form_renderer.rb +10 -29
- data/lib/hecks/forms/field_renderer.rb +17 -156
- data/lib/hecks/forms/field_shape.rb +31 -222
- data/lib/hecks/forms/html.rb +12 -47
- data/lib/hecks/forms/index_renderer.rb +1 -4
- data/lib/hecks/forms/page.rb +3 -9
- data/lib/hecks/forms/params.rb +14 -60
- data/lib/hecks/forms/port_argument.rb +2 -19
- data/lib/hecks/forms/query_form_renderer.rb +4 -79
- data/lib/hecks/forms/record_renderer.rb +8 -75
- data/lib/hecks/forms/record_table.rb +7 -50
- data/lib/hecks/forms/reference_options.rb +3 -30
- data/lib/hecks/forms/value_object_shape.rb +8 -35
- data/lib/hecks/forms.rb +5 -33
- data/lib/hecks/fqn.rb +5 -12
- data/lib/hecks/framework/bluebook/compliance.bluebook +16 -65
- data/lib/hecks/framework/bluebook/console_settings.bluebook +47 -134
- data/lib/hecks/framework/bluebook/framework.hecksagon +5 -14
- data/lib/hecks/framework/bluebook/governance.bluebook +13 -34
- data/lib/hecks/framework/bluebook/identity.bluebook +11 -26
- data/lib/hecks/framework/bluebook/privacy.bluebook +8 -33
- data/lib/hecks/framework.rb +11 -80
- data/lib/hecks/freezer.rb +5 -39
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +393 -0
- data/lib/hecks/fuzzing/combination_miner.rb +86 -0
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +214 -0
- data/lib/hecks/fuzzing/coverage_campaign.rb +143 -0
- data/lib/hecks/fuzzing/differential.rb +156 -0
- data/lib/hecks/fuzzing/domain_generator.rb +615 -0
- data/lib/hecks/fuzzing/era_boundary.rb +71 -0
- data/lib/hecks/fuzzing/form_census.rb +136 -0
- data/lib/hecks/fuzzing/generated_domain_check.rb +93 -0
- data/lib/hecks/fuzzing/invalid_value_generator.rb +64 -0
- data/lib/hecks/fuzzing/isolated_boot.rb +301 -0
- data/lib/hecks/fuzzing/nondeterministic.rb +51 -0
- data/lib/hecks/fuzzing/outside_world.rb +45 -0
- data/lib/hecks/fuzzing/persistence_parity.rb +102 -0
- data/lib/hecks/fuzzing/properties/corrections.rb +88 -0
- data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +314 -0
- data/lib/hecks/fuzzing/properties/guards.rb +190 -0
- data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +300 -0
- data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +93 -0
- data/lib/hecks/fuzzing/properties/outbox.rb +89 -0
- data/lib/hecks/fuzzing/properties/querying.rb +175 -0
- data/lib/hecks/fuzzing/properties.rb +162 -0
- data/lib/hecks/fuzzing/qa_settings.rb +123 -0
- data/lib/hecks/fuzzing/replay.rb +505 -0
- data/lib/hecks/fuzzing/rotation_priority.rb +48 -0
- data/lib/hecks/fuzzing/rust_gap_manifest.rb +108 -0
- data/lib/hecks/fuzzing/self_consistency.rb +339 -0
- data/lib/hecks/fuzzing/sequence_generator/adversary.rb +385 -0
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +132 -0
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +95 -0
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +77 -0
- data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +109 -0
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +237 -0
- data/lib/hecks/fuzzing/sequence_generator.rb +189 -0
- data/lib/hecks/fuzzing/shrinker.rb +166 -0
- data/lib/hecks/fuzzing/structural_skips.rb +33 -0
- data/lib/hecks/fuzzing/sweep_depth.rb +43 -0
- data/lib/hecks/fuzzing/target_capabilities.rb +163 -0
- data/lib/hecks/fuzzing/value_generator.rb +216 -0
- data/lib/hecks/fuzzing.rb +23 -0
- data/lib/hecks/grammar/evolve.rb +336 -0
- data/lib/hecks/grammar/expression.bluebook +15 -40
- data/lib/hecks/grammar/translation.bluebook +3 -6
- data/lib/hecks/grammar.rb +16 -41
- data/lib/hecks/hecks/adapters/codebase/codemods.rb +45 -0
- data/lib/hecks/hecks/adapters/codebase/conformance.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +202 -0
- data/lib/hecks/hecks/adapters/codebase/gem_registry.rb +80 -0
- data/lib/hecks/hecks/adapters/codebase/kernel_tables.rb +54 -0
- data/lib/hecks/hecks/adapters/codebase/language.rb +240 -0
- data/lib/hecks/hecks/adapters/codebase/npm_registry.rb +102 -0
- data/lib/hecks/hecks/adapters/codebase/publishing.rb +142 -0
- data/lib/hecks/hecks/adapters/codebase/regeneration.rb +67 -0
- data/lib/hecks/hecks/adapters/codebase/release_facts.rb +90 -0
- data/lib/hecks/hecks/adapters/codebase/ruby_child.rb +83 -0
- data/lib/hecks/hecks/adapters/codebase/secret_vault.rb +36 -0
- data/lib/hecks/hecks/adapters/codebase/source_tree.adapter +7 -0
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +189 -0
- data/lib/hecks/hecks/adapters/codebase/sqlite_fixture.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/style.rb +171 -0
- data/lib/hecks/hecks/adapters/codebase/test_runner.rb +55 -0
- data/lib/hecks/hecks/adapters/codebase/test_suite.rb +165 -0
- data/lib/hecks/hecks/adapters/codebase/tree.rb +111 -0
- data/lib/hecks/hecks/adapters/console_capture.rb +79 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain.adapter +7 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain.rb +108 -0
- data/lib/hecks/hecks/adapters/git.adapter +7 -0
- data/lib/hecks/hecks/adapters/git.rb +102 -0
- data/lib/hecks/hecks/adapters/host_http.adapter +7 -0
- data/lib/hecks/hecks/adapters/host_http.rb +65 -0
- data/lib/hecks/hecks/adapters/in_process_boot.adapter +7 -0
- data/lib/hecks/hecks/adapters/in_process_boot.rb +197 -0
- data/lib/hecks/hecks/adapters/in_process_operations.rb +202 -0
- data/lib/hecks/hecks/adapters/journal_store/changes.rb +143 -0
- data/lib/hecks/hecks/adapters/journal_store/compaction.rb +145 -0
- data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +132 -0
- data/lib/hecks/hecks/adapters/journal_store/examination.rb +135 -0
- data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +163 -0
- data/lib/hecks/hecks/adapters/journal_store/readings.rb +187 -0
- data/lib/hecks/hecks/adapters/journal_store.adapter +7 -0
- data/lib/hecks/hecks/adapters/journal_store.rb +64 -0
- data/lib/hecks/hecks/adapters/local_files.adapter +7 -0
- data/lib/hecks/hecks/adapters/local_files.rb +46 -0
- data/lib/hecks/hecks/adapters/pg_admin.adapter +7 -0
- data/lib/hecks/hecks/adapters/pg_admin.rb +245 -0
- data/lib/hecks/hecks/adapters/process_pool.adapter +7 -0
- data/lib/hecks/hecks/adapters/process_pool.rb +119 -0
- data/lib/hecks/hecks/adapters/rust_toolchain.adapter +7 -0
- data/lib/hecks/hecks/adapters/rust_toolchain.rb +179 -0
- data/lib/hecks/hecks/adapters/rust_workspace.rb +150 -0
- data/lib/hecks/hecks/adapters/shell.adapter +7 -0
- data/lib/hecks/hecks/adapters/shell.rb +49 -0
- data/lib/hecks/hecks/adapters/terminal.adapter +7 -0
- data/lib/hecks/hecks/adapters/terminal.rb +74 -0
- data/lib/hecks/hecks/codebase.behaviors +172 -0
- data/lib/hecks/hecks/codebase.bluebook +2453 -0
- data/lib/hecks/hecks/context_map.hecksagon +13 -0
- data/lib/hecks/hecks/custodian.behaviors +179 -0
- data/lib/hecks/hecks/custodian.bluebook +1847 -0
- data/lib/hecks/hecks/deploy.behaviors +74 -0
- data/lib/hecks/hecks/deploy.world +12 -0
- data/lib/hecks/hecks/environments/memory.world +10 -0
- data/lib/hecks/hecks/governance.world +7 -0
- data/lib/hecks/hecks/hecks.behaviors +62 -0
- data/lib/hecks/hecks/hecks.bluebook +124 -0
- data/lib/hecks/hecks/hecks.hecksagon +390 -0
- data/lib/hecks/hecks/hecks.world +42 -0
- data/lib/hecks/ir.rb +14 -83
- data/lib/hecks/kernel_capabilities.rb +194 -0
- data/lib/hecks/language/adapter.bluebook +2 -7
- data/lib/hecks/language/bluebook/aggregate.bluebook +56 -221
- data/lib/hecks/language/bluebook/attaches/paging.bluebook +6 -15
- data/lib/hecks/language/bluebook/bluebook.bluebook +26 -83
- data/lib/hecks/language/bluebook/bluebook.hecksagon +3 -15
- data/lib/hecks/language/bluebook/command.bluebook +27 -144
- data/lib/hecks/language/bluebook/entity.bluebook +24 -97
- data/lib/hecks/language/bluebook/policy.bluebook +16 -67
- data/lib/hecks/language/bluebook/process_manager.bluebook +28 -151
- data/lib/hecks/language/bluebook/projection.bluebook +126 -60
- data/lib/hecks/language/bluebook/query.bluebook +19 -43
- data/lib/hecks/language/bluebook/shape.bluebook +23 -73
- data/lib/hecks/language/bluebook/syntax.bluebook +51 -262
- data/lib/hecks/language/bluebook/vocabulary.bluebook +83 -198
- data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
- data/lib/hecks/language/hecksagon/domain_port.bluebook +14 -19
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +26 -25
- data/lib/hecks/language/hecksagon/port_operation.bluebook +3 -14
- data/lib/hecks/language/oidc.json +35 -0
- data/lib/hecks/language/port.bluebook +4 -17
- data/lib/hecks/language/translation/translation.bluebook +3 -9
- data/lib/hecks/language/translation/translation_aggregate.bluebook +5 -24
- data/lib/hecks/language/world/wiring.bluebook +1 -3
- data/lib/hecks/language/world/world.bluebook +5 -7
- data/lib/hecks/literal.rb +8 -50
- data/lib/hecks/mcp_stdio_guard.rb +4 -41
- data/lib/hecks/naming.rb +29 -137
- data/lib/hecks/persistence_legacy_fixture/regenerate.rb +161 -0
- data/lib/hecks/persistence_legacy_fixture.rb +113 -0
- data/lib/hecks/ports/access_control.rb +7 -23
- data/lib/hecks/ports/agent/answers.rb +5 -23
- data/lib/hecks/ports/agent.rb +47 -172
- data/lib/hecks/ports/authentication.rb +12 -39
- data/lib/hecks/ports/authorization.rb +16 -43
- data/lib/hecks/ports/clock.rb +5 -45
- data/lib/hecks/ports/extraction.rb +7 -12
- data/lib/hecks/ports/identity_assignment.rb +8 -29
- data/lib/hecks/ports/identity_generation.rb +6 -29
- data/lib/hecks/ports/identity_resolution.rb +2 -10
- data/lib/hecks/ports/key_vault.rb +9 -45
- data/lib/hecks/ports/persistence/append_only.rb +61 -64
- data/lib/hecks/ports/persistence/binding_policy.rb +4 -14
- data/lib/hecks/ports/persistence/codec_boundary.rb +20 -80
- data/lib/hecks/ports/persistence/null_saga_store.rb +4 -20
- data/lib/hecks/ports/persistence/plugin.rb +13 -42
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +44 -144
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +20 -85
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +6 -25
- data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +18 -24
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +55 -181
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +77 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +12 -122
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +28 -128
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +73 -474
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +31 -124
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +45 -219
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +13 -108
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +19 -76
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +9 -49
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +6 -123
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +23 -55
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +14 -72
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +7 -16
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +43 -127
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +131 -555
- data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
- data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +227 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +2 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +3 -14
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +13 -58
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -26
- data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +50 -47
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +18 -124
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +34 -123
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +5 -12
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +3 -9
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -14
- data/lib/hecks/ports/persistence/plugins/era/translation.rb +1 -0
- data/lib/hecks/ports/persistence/plugins/era.rb +4 -23
- data/lib/hecks/ports/persistence/postgres_dump/connection.rb +7 -23
- data/lib/hecks/ports/persistence/postgres_dump.rb +4 -35
- data/lib/hecks/ports/persistence/remote_runtime.rb +2 -24
- data/lib/hecks/ports/persistence/repository_factory.rb +8 -27
- data/lib/hecks/ports/persistence/state_codec.rb +47 -108
- data/lib/hecks/ports/persistence.rb +7 -14
- data/lib/hecks/ports/projection.rb +42 -84
- data/lib/hecks/ports/query/in_memory.rb +10 -58
- data/lib/hecks/ports/query/ordering.rb +11 -32
- data/lib/hecks/ports/query.rb +14 -37
- data/lib/hecks/ports.rb +2 -8
- data/lib/hecks/projection_files.rb +285 -0
- data/lib/hecks/projections/bootstrap_table.rb +12 -44
- data/lib/hecks/projections/deploy/fargate/assembly.rb +2 -15
- data/lib/hecks/projections/deploy/fargate/cdn.rb +1 -48
- data/lib/hecks/projections/deploy/fargate/cdn_default.rb +2 -11
- data/lib/hecks/projections/deploy/fargate/check.rb +5 -14
- data/lib/hecks/projections/deploy/fargate/containers.rb +3 -78
- data/lib/hecks/projections/deploy/fargate/extras.rb +3 -44
- data/lib/hecks/projections/deploy/fargate/monitoring.rb +0 -44
- data/lib/hecks/projections/deploy/fargate/settings.rb +2 -54
- data/lib/hecks/projections/deploy/fargate/yaml.rb +13 -58
- data/lib/hecks/projections/deploy/fargate.rb +40 -207
- data/lib/hecks/projections/deploy/lambda.rb +191 -708
- data/lib/hecks/projections/deploy/preview/access_yaml.rb +1 -33
- data/lib/hecks/projections/deploy/preview/containers.rb +6 -111
- data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
- data/lib/hecks/projections/deploy/preview/routing_yaml.rb +4 -56
- data/lib/hecks/projections/deploy/preview/script.rb +2 -14
- data/lib/hecks/projections/deploy/preview/settings.rb +3 -33
- data/lib/hecks/projections/deploy/preview/task_yaml.rb +2 -38
- data/lib/hecks/projections/deploy/preview/template.rb +3 -59
- data/lib/hecks/projections/deploy/preview.rb +2 -67
- data/lib/hecks/projections/deploy/scripts/deploy-service.sh.tmpl +1 -1
- data/lib/hecks/projections/deploy/scripts/expected-era.header +1 -1
- data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +3 -3
- data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
- data/lib/hecks/projections/deploy/scripts/smoke-after-deploy.sh.tmpl +1 -1
- data/lib/hecks/projections/deploy/scripts.rb +4 -57
- data/lib/hecks/projections/deploy/shared.rb +48 -147
- data/lib/hecks/projections/deploy/smoke.rb +4 -61
- data/lib/hecks/projections/deploy/template_diff/comparer.rb +3 -25
- data/lib/hecks/projections/deploy/template_diff/loader.rb +2 -11
- data/lib/hecks/projections/deploy/template_diff.rb +5 -57
- data/lib/hecks/projections/diagrams.rb +22 -584
- data/lib/hecks/projections/glossary/html.rb +14 -130
- data/lib/hecks/projections/glossary/markdown.rb +8 -69
- data/lib/hecks/projections/glossary/mermaid.rb +9 -66
- data/lib/hecks/projections/glossary/sensitivity.rb +5 -34
- data/lib/hecks/projections/glossary/sentences.rb +14 -159
- data/lib/hecks/projections/glossary.rb +30 -222
- data/lib/hecks/projections/ir.rb +3 -10
- data/lib/hecks/projections/model/deviations.rb +16 -43
- data/lib/hecks/projections/model.rb +12 -51
- data/lib/hecks/projections/oidc.rb +12 -56
- data/lib/hecks/projections/parser_table.rb +13 -32
- data/lib/hecks/projections/reference.rb +4 -18
- data/lib/hecks/projections/rust_vocabulary.rb +13 -251
- data/lib/hecks/projections/shape.rb +3 -29
- data/lib/hecks/projections/statements.rb +7 -86
- data/lib/hecks/projections/vocabulary.rb +6 -22
- data/lib/hecks/projections.rb +2 -16
- data/lib/hecks/projector/cli_projector.rb +154 -400
- data/lib/hecks/projector/docs_projector.rb +10 -201
- data/lib/hecks/projector/exporter.rb +42 -134
- data/lib/hecks/projector/ir_projector.rb +2 -9
- data/lib/hecks/projector/narrate_projector.rb +15 -189
- data/lib/hecks/projector/target.rb +13 -76
- data/lib/hecks/projector.rb +30 -121
- data/lib/hecks/quality_control/adapters/agent.adapter +7 -0
- data/lib/hecks/quality_control/adapters/agent.rb +58 -0
- data/lib/hecks/quality_control/adapters/angle_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/angle_tools.rb +15 -0
- data/lib/hecks/quality_control/adapters/clearance_recorder.rb +36 -0
- data/lib/hecks/quality_control/adapters/clearance_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/clearance_tools.rb +17 -0
- data/lib/hecks/quality_control/adapters/git_pr.adapter +7 -0
- data/lib/hecks/quality_control/adapters/git_pr.rb +226 -0
- data/lib/hecks/quality_control/adapters/github_checks.adapter +9 -0
- data/lib/hecks/quality_control/adapters/github_checks.rb +83 -0
- data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +56 -0
- data/lib/hecks/quality_control/adapters/github_issues.adapter +7 -0
- data/lib/hecks/quality_control/adapters/github_issues.rb +49 -0
- data/lib/hecks/quality_control/adapters/qa_tool.rb +59 -0
- data/lib/hecks/quality_control/adapters/sweep_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/sweep_tools.rb +51 -0
- data/lib/hecks/quality_control/adapters/target_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/target_tools.rb +43 -0
- data/lib/hecks/quality_control/cli/child.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_concurrency_racer.rb +45 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +248 -0
- data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +163 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains.rb +450 -0
- data/lib/hecks/quality_control/cli/qa_log_bug.rb +195 -0
- data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +220 -0
- data/lib/hecks/quality_control/cli/qa_open_pr.rb +305 -0
- data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +154 -0
- data/lib/hecks/quality_control/cli/qa_postgres_role.rb +159 -0
- data/lib/hecks/quality_control/cli/qa_pr_check.rb +232 -0
- data/lib/hecks/quality_control/cli/qa_seed_angles.rb +142 -0
- data/lib/hecks/quality_control/cli/qa_seed_targets.rb +69 -0
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +280 -0
- data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +329 -0
- data/lib/hecks/quality_control/cli/qa_sweep/dials.rb +92 -0
- data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +117 -0
- data/lib/hecks/quality_control/cli/qa_sweep/parsing.rb +175 -0
- data/lib/hecks/quality_control/cli/qa_sweep/release_mode.rb +60 -0
- data/lib/hecks/quality_control/cli/qa_sweep.rb +611 -0
- data/lib/hecks/quality_control/cli/qa_tick.rb +274 -0
- data/lib/hecks/quality_control/quality_control.bluebook +2224 -0
- data/lib/hecks/quality_control/quality_control.hecksagon +13 -0
- data/lib/hecks/quality_control/quality_control.ports.hecksagon +54 -0
- data/lib/hecks/query_ir.rb +346 -0
- data/lib/hecks/query_ir_mcp.rb +198 -0
- data/lib/hecks/query_specification/common/comparators.rb +5 -26
- data/lib/hecks/query_specification/common/comparison.rb +35 -143
- data/lib/hecks/query_specification/common/dsl.rb +8 -24
- data/lib/hecks/query_specification/common/null_policy.rb +20 -70
- data/lib/hecks/query_specification/common/options.rb +2 -6
- data/lib/hecks/query_specification/common/where_clause.rb +2 -10
- data/lib/hecks/query_specification/field_path.rb +37 -77
- data/lib/hecks/query_specification/hop_path.rb +12 -76
- data/lib/hecks/release/gem_pin.rb +2 -26
- data/lib/hecks/release/runner/ci_publisher.rb +5 -8
- data/lib/hecks/release/runner/clean_tree.rb +42 -0
- data/lib/hecks/release/runner/commands.rb +2 -4
- data/lib/hecks/release/runner/console.rb +6 -0
- data/lib/hecks/release/runner/gem_publisher.rb +15 -9
- data/lib/hecks/release/runner/npm_publisher.rb +9 -53
- data/lib/hecks/release/runner/preflight.rb +29 -20
- data/lib/hecks/release/runner/published.rb +8 -26
- data/lib/hecks/release/runner/tagger.rb +31 -23
- data/lib/hecks/release/runner.rb +60 -38
- data/lib/hecks/rendering.rb +4 -26
- data/lib/hecks/router/namespace_installer.rb +15 -39
- data/lib/hecks/router.rb +4 -8
- data/lib/hecks/runtime/adapter_lookup.rb +124 -0
- data/lib/hecks/runtime/aggregate_lock.rb +8 -33
- data/lib/hecks/runtime/boot_gates.rb +3 -18
- data/lib/hecks/runtime/caller.rb +19 -59
- data/lib/hecks/runtime/capability_graph.rb +5 -21
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +27 -160
- data/lib/hecks/runtime/command_interpreter.rb +124 -306
- data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
- data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
- data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
- data/lib/hecks/runtime/command_rules/emission.rb +8 -21
- data/lib/hecks/runtime/command_rules/references.rb +23 -202
- data/lib/hecks/runtime/dependency_planning.rb +50 -104
- data/lib/hecks/runtime/dispatcher.rb +134 -243
- data/lib/hecks/runtime/entity_element.rb +40 -462
- data/lib/hecks/runtime/entity_interpreter.rb +64 -219
- data/lib/hecks/runtime/errors.rb +32 -115
- data/lib/hecks/runtime/event.rb +3 -25
- data/lib/hecks/runtime/identity.rb +18 -154
- data/lib/hecks/runtime/instance.rb +18 -150
- data/lib/hecks/runtime/interpreting.rb +14 -70
- data/lib/hecks/runtime/invocation.rb +28 -164
- data/lib/hecks/runtime/loader.rb +109 -194
- data/lib/hecks/runtime/outbox.rb +39 -262
- data/lib/hecks/runtime/policy_interpreter.rb +43 -202
- data/lib/hecks/runtime/port_operation_interpreter.rb +28 -97
- data/lib/hecks/runtime/query_interpreter.rb +122 -187
- data/lib/hecks/runtime/reaction_invocation.rb +36 -138
- data/lib/hecks/runtime/reaction_outcome.rb +89 -0
- data/lib/hecks/runtime/read_model_interpreter.rb +117 -208
- data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
- data/lib/hecks/runtime/reference_hop.rb +8 -81
- data/lib/hecks/runtime/refusal_wording.rb +28 -87
- data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
- data/lib/hecks/runtime/registry/verification.rb +213 -227
- data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
- data/lib/hecks/runtime/registry.rb +156 -247
- data/lib/hecks/runtime/remote_dispatcher.rb +68 -154
- data/lib/hecks/runtime/routing.rb +4 -15
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
- data/lib/hecks/runtime/saga_interpreter.rb +79 -263
- data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
- data/lib/hecks/runtime/tenant_check.rb +6 -68
- data/lib/hecks/runtime/tenant_scope.rb +3 -28
- data/lib/hecks/runtime/value/admission.rb +16 -67
- data/lib/hecks/runtime/value/coercion.rb +162 -760
- data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
- data/lib/hecks/runtime/value/field_checks.rb +172 -0
- data/lib/hecks/runtime/value.rb +15 -84
- data/lib/hecks/runtime.rb +35 -69
- data/lib/hecks/rust_build/conformance.rb +158 -0
- data/lib/hecks/rust_build/conformance_fuzz.rb +71 -0
- data/lib/hecks/rust_build/coverage.rb +218 -0
- data/lib/hecks/rust_build/native_build.rb +124 -0
- data/lib/hecks/rust_build/project_rust/root_mod.rb +120 -0
- data/lib/hecks/rust_build/project_rust.rb +332 -0
- data/lib/hecks/rust_build/wasm.rb +105 -0
- data/lib/hecks/rust_build/wasm_browser.rb +113 -0
- data/lib/hecks/rust_build.rb +144 -0
- data/lib/hecks/storehouse.rb +155 -582
- data/lib/hecks/tenancy/bluebook/tenancy.bluebook +10 -34
- data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
- data/lib/hecks/three_zero/forms.yml +127 -0
- data/lib/hecks/three_zero.rb +12 -0
- data/lib/hecks/tools/argument_gate_matrix.rb +316 -0
- data/lib/hecks/tools/comment_style.rb +1070 -0
- data/lib/hecks/tools/corpus_report.rb +87 -0
- data/lib/hecks/tools/deploy_recipe.rb +255 -0
- data/lib/hecks/tools/deploy_recipe_lint.rb +282 -0
- data/lib/hecks/tools/drop_implicit_append_fields.rb +95 -0
- data/lib/hecks/tools/era_projection_backfill.rb +94 -0
- data/lib/hecks/tools/era_reattest.rb +146 -0
- data/lib/hecks/tools/evolve_run.rb +189 -0
- data/lib/hecks/tools/fuzz_sweep.rb +373 -0
- data/lib/hecks/tools/heki_compaction.rb +100 -0
- data/lib/hecks/tools/hoist_local_givens.rb +246 -0
- data/lib/hecks/tools/journal_compaction.rb +89 -0
- data/lib/hecks/tools/oidc_manifests.rb +70 -0
- data/lib/hecks/tools/query_ir_run.rb +81 -0
- data/lib/hecks/tools/regeneration_run.rb +166 -0
- data/lib/hecks/tools/rust_comment_style.rb +642 -0
- data/lib/hecks/tools/sequence_script.rb +62 -0
- data/lib/hecks/tools/tail_merge.rb +117 -0
- data/lib/hecks/tools/tenant_provisioning.rb +142 -0
- data/lib/hecks/tools/translation_audit.rb +208 -0
- data/lib/hecks/tools/translation_scaffold.rb +131 -0
- data/lib/hecks/tools.rb +86 -0
- data/lib/hecks/vendoring/git_environment.rb +2 -8
- data/lib/hecks/vendoring/git_source.rb +4 -10
- data/lib/hecks/vendoring.rb +7 -46
- data/lib/hecks/version.rb +3 -14
- data/lib/hecks.rb +52 -90
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
- data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
- data/qa/settings.yml +66 -0
- data/rust/.cargo/config.toml +6 -0
- data/rust/.gitignore +2 -0
- data/rust/Cargo.lock +54 -0
- data/rust/Cargo.toml +61 -0
- data/rust/build/.cargo/config.toml +3 -0
- data/rust/build/.gitignore +1 -0
- data/rust/build/Cargo.lock +7 -0
- data/rust/build/Cargo.toml +19 -0
- data/rust/build/src/build_artifact.rs +47 -0
- data/rust/build/src/cargo_sync.rs +248 -0
- data/rust/build/src/json.rs +421 -0
- data/rust/build/src/lineage_pass.rs +285 -0
- data/rust/build/src/main.rs +51 -0
- data/rust/build/src/optional_pass.rs +150 -0
- data/rust/build/src/pipeline.rs +264 -0
- data/rust/build/src/reserved_names.rs +76 -0
- data/rust/build/src/resolve.rs +124 -0
- data/rust/build/src/root.rs +25 -0
- data/rust/build/src/sidecars.rs +73 -0
- data/rust/build/src/subprocess.rs +51 -0
- data/rust/build/src/tmp.rs +31 -0
- data/rust/codegen/.cargo/config.toml +3 -0
- data/rust/codegen/.gitignore +1 -0
- data/rust/codegen/Cargo.lock +7 -0
- data/rust/codegen/Cargo.toml +20 -0
- data/rust/codegen/src/attr.rs +32 -0
- data/rust/codegen/src/bridging.rs +481 -0
- data/rust/codegen/src/commands.rs +1226 -0
- data/rust/codegen/src/constraints.rs +109 -0
- data/rust/codegen/src/dependency_planning.rs +209 -0
- data/rust/codegen/src/domain_generator.rs +1288 -0
- data/rust/codegen/src/exemplar.rs +230 -0
- data/rust/codegen/src/expr_emitter.rs +87 -0
- data/rust/codegen/src/fielded.rs +192 -0
- data/rust/codegen/src/hecks_naming.rs +33 -0
- data/rust/codegen/src/json.rs +335 -0
- data/rust/codegen/src/json_codec.rs +697 -0
- data/rust/codegen/src/literal.rs +207 -0
- data/rust/codegen/src/main.rs +290 -0
- data/rust/codegen/src/manifest.rs +227 -0
- data/rust/codegen/src/mutations.rs +784 -0
- data/rust/codegen/src/naming.rs +286 -0
- data/rust/codegen/src/ports.rs +208 -0
- data/rust/codegen/src/prelude.rs +116 -0
- data/rust/codegen/src/queries.rs +786 -0
- data/rust/codegen/src/reactions.rs +532 -0
- data/rust/codegen/src/read_models.rs +697 -0
- data/rust/codegen/src/reference_specs.rs +40 -0
- data/rust/codegen/src/registry.rs +966 -0
- data/rust/codegen/src/reserved_names.rs +76 -0
- data/rust/codegen/src/shared.rs +93 -0
- data/rust/codegen/src/skip_reason.rs +25 -0
- data/rust/codegen/src/types.rs +362 -0
- data/rust/host/.cargo/config.toml +3 -0
- data/rust/host/.gitignore +1 -0
- data/rust/host/Cargo.lock +4297 -0
- data/rust/host/Cargo.toml +61 -0
- data/rust/host/HECKS_RELEASE +1 -0
- data/rust/host/rds-ca-bundle.pem +2736 -0
- data/rust/host/src/api.rs +1596 -0
- data/rust/host/src/approval.rs +652 -0
- data/rust/host/src/auth.rs +1287 -0
- data/rust/host/src/bin/expr_harness.rs +46 -0
- data/rust/host/src/bin/lineage_harness.rs +119 -0
- data/rust/host/src/bin/mint_harness.rs +135 -0
- data/rust/host/src/checkout.rs +265 -0
- data/rust/host/src/dispatch.rs +1443 -0
- data/rust/host/src/expr_json.rs +1117 -0
- data/rust/host/src/field_hints.rs +52 -0
- data/rust/host/src/ir.rs +733 -0
- data/rust/host/src/journal.rs +874 -0
- data/rust/host/src/lambda_client.rs +378 -0
- data/rust/host/src/log.rs +147 -0
- data/rust/host/src/main.rs +474 -0
- data/rust/host/src/mint.rs +1865 -0
- data/rust/host/src/payments/keystore.rs +330 -0
- data/rust/host/src/payments/tests.rs +1400 -0
- data/rust/host/src/payments.rs +767 -0
- data/rust/host/src/presentation.rs +698 -0
- data/rust/host/src/presentation_write.rs +1431 -0
- data/rust/host/src/query_step.rs +149 -0
- data/rust/host/src/rate_limit.rs +904 -0
- data/rust/host/src/reference_transform.rs +241 -0
- data/rust/host/src/reference_validate.rs +338 -0
- data/rust/host/src/resend.rs +296 -0
- data/rust/host/src/secrets.rs +106 -0
- data/rust/host/src/server.rs +663 -0
- data/rust/host/src/storage_shape.rs +175 -0
- data/rust/host/src/test_pg.rs +40 -0
- data/rust/host/src/ui_schema.rs +1351 -0
- data/rust/host/src/wasm_runner.rs +191 -0
- data/rust/host/src/web/newsletter/cooldown.rs +126 -0
- data/rust/host/src/web/newsletter/tests.rs +104 -0
- data/rust/host/src/web/newsletter.rs +310 -0
- data/rust/host/src/web/newsletter_send.rs +357 -0
- data/rust/host/src/web/registrations.rs +1505 -0
- data/rust/host/src/web.rs +2937 -0
- data/rust/lsp/.gitignore +1 -0
- data/rust/lsp/Cargo.lock +7 -0
- data/rust/lsp/Cargo.toml +16 -0
- data/rust/lsp/README.md +133 -0
- data/rust/lsp/src/diagnostics.rs +165 -0
- data/rust/lsp/src/json.rs +385 -0
- data/rust/lsp/src/main.rs +399 -0
- data/rust/lsp/src/outline.rs +177 -0
- data/rust/lsp/src/rpc.rs +67 -0
- data/rust/parser/.cargo/config.toml +5 -0
- data/rust/parser/.gitignore +1 -0
- data/rust/parser/Cargo.lock +7 -0
- data/rust/parser/Cargo.toml +21 -0
- data/rust/parser/src/build/closed_sets.rs +27 -0
- data/rust/parser/src/build/identity.rs +276 -0
- data/rust/parser/src/build/mod.rs +12 -0
- data/rust/parser/src/build/naming.rs +141 -0
- data/rust/parser/src/build/pattern_subset.rs +161 -0
- data/rust/parser/src/build/query_derive.rs +72 -0
- data/rust/parser/src/build/query_inference.rs +269 -0
- data/rust/parser/src/build/query_options.rs +100 -0
- data/rust/parser/src/build/read_model.rs +94 -0
- data/rust/parser/src/build/references.rs +32 -0
- data/rust/parser/src/canonical.rs +114 -0
- data/rust/parser/src/diag.rs +55 -0
- data/rust/parser/src/emit.rs +953 -0
- data/rust/parser/src/expr/ast_json.rs +147 -0
- data/rust/parser/src/expr/evaluator.rs +81 -0
- data/rust/parser/src/expr/mod.rs +84 -0
- data/rust/parser/src/expr/resolver.rs +497 -0
- data/rust/parser/src/ir.rs +387 -0
- data/rust/parser/src/keywords.rs +585 -0
- data/rust/parser/src/lex.rs +662 -0
- data/rust/parser/src/main.rs +252 -0
- data/rust/parser/src/parse/aggregate.rs +612 -0
- data/rust/parser/src/parse/chapter.rs +517 -0
- data/rust/parser/src/parse/command.rs +637 -0
- data/rust/parser/src/parse/domain_port.rs +127 -0
- data/rust/parser/src/parse/entity.rs +527 -0
- data/rust/parser/src/parse/file.rs +67 -0
- data/rust/parser/src/parse/hecksagon.rs +231 -0
- data/rust/parser/src/parse/lifecycle.rs +162 -0
- data/rust/parser/src/parse/mod.rs +1262 -0
- data/rust/parser/src/parse/policy.rs +87 -0
- data/rust/parser/src/parse/process_manager.rs +305 -0
- data/rust/parser/src/parse/query.rs +100 -0
- data/rust/parser/src/parse/read_model.rs +214 -0
- data/rust/parser/src/parse/value_object.rs +250 -0
- data/rust/parser/src/ruby_value.rs +422 -0
- data/rust/project/bridging.rb +257 -0
- data/rust/project/commands.rb +877 -0
- data/rust/project/constraints.rb +86 -0
- data/rust/project/dependency_planning.rb +178 -0
- data/rust/project/domain_generator.rb +980 -0
- data/rust/project/exemplar.rb +148 -0
- data/rust/project/expr_emitter.rb +72 -0
- data/rust/project/fielded.rb +141 -0
- data/rust/project/json_codec.rb +641 -0
- data/rust/project/mutations.rb +721 -0
- data/rust/project/naming.rb +205 -0
- data/rust/project/ports.rb +65 -0
- data/rust/project/queries.rb +493 -0
- data/rust/project/reactions.rb +317 -0
- data/rust/project/read_models.rb +690 -0
- data/rust/project/reference_specs.rb +27 -0
- data/rust/project/registry.rb +396 -0
- data/rust/project/skip_reason.rb +29 -0
- data/rust/project/types.rb +225 -0
- data/rust/project/write_if_changed.rb +83 -0
- data/rust/project.rb +30 -0
- data/rust/project_rust_pipeline.rb +383 -0
- data/rust/src/exemplar/commands.rs +279 -0
- data/rust/src/exemplar/constraints.rs +18 -0
- data/rust/src/exemplar/fielded.rs +280 -0
- data/rust/src/exemplar/json.rs +277 -0
- data/rust/src/exemplar/mod.rs +17 -0
- data/rust/src/exemplar/mutations.rs +80 -0
- data/rust/src/exemplar/queries.rs +33 -0
- data/rust/src/exemplar/reactions.rs +88 -0
- data/rust/src/exemplar/read_models.rs +48 -0
- data/rust/src/exemplar/registry.rs +166 -0
- data/rust/src/exemplar/types.rs +44 -0
- data/rust/src/kernel/attribute_shapes/composite.rs +88 -0
- data/rust/src/kernel/attribute_shapes/list.rs +18 -0
- data/rust/src/kernel/attribute_shapes/mod.rs +44 -0
- data/rust/src/kernel/attribute_shapes/optional.rs +9 -0
- data/rust/src/kernel/attribute_shapes/scalar.rs +39 -0
- data/rust/src/kernel/cli.rs +585 -0
- data/rust/src/kernel/dispatch.rs +1090 -0
- data/rust/src/kernel/expr.rs +458 -0
- data/rust/src/kernel/expression_operators/arithmetic.rs +128 -0
- data/rust/src/kernel/expression_operators/comparison.rs +48 -0
- data/rust/src/kernel/expression_operators/enumeration.rs +232 -0
- data/rust/src/kernel/expression_operators/logical.rs +13 -0
- data/rust/src/kernel/expression_operators/membership.rs +18 -0
- data/rust/src/kernel/expression_operators/mod.rs +68 -0
- data/rust/src/kernel/expression_operators/pattern_match.rs +73 -0
- data/rust/src/kernel/expression_operators/positional.rs +126 -0
- data/rust/src/kernel/expression_operators/presence.rs +101 -0
- data/rust/src/kernel/expression_operators/sign_test.rs +16 -0
- data/rust/src/kernel/expression_operators/sized.rs +35 -0
- data/rust/src/kernel/expression_operators/text.rs +79 -0
- data/rust/src/kernel/expression_operators/to_string.rs +18 -0
- data/rust/src/kernel/json.rs +779 -0
- data/rust/src/kernel/mod.rs +133 -0
- data/rust/src/kernel/named_query.rs +219 -0
- data/rust/src/kernel/orchestrate.rs +1810 -0
- data/rust/src/kernel/pattern.rs +307 -0
- data/rust/src/kernel/query_comparators.rs +206 -0
- data/rust/src/kernel/query_ordering.rs +103 -0
- data/rust/src/kernel/read_model.rs +914 -0
- data/rust/src/kernel/reference_lookup.rs +149 -0
- data/rust/src/kernel/repository.rs +468 -0
- data/rust/src/kernel/routing.rs +612 -0
- data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +118 -0
- data/rust/src/kernel/vocab/entity_dispatch_order.rs +114 -0
- data/rust/src/kernel/vocab/field_hint.rs +70 -0
- data/rust/src/kernel/vocab/mod.rs +20 -0
- data/rust/src/kernel/vocab/query_comparator.rs +65 -0
- data/rust/src/kernel/vocab/refusal_template.rs +1592 -0
- data/rust/src/lib.rs +8 -0
- data/rust/src/main.rs +16 -0
- data/rust/web/.gitignore +1 -0
- data/rust/web/Cargo.lock +119 -0
- data/rust/web/Cargo.toml +18 -0
- data/rust/web/src/lib.rs +8 -0
- metadata +478 -12
- data/lib/hecks/facade/cli_door.rb +0 -178
- data/lib/hecks/facade/cli_runner.rb +0 -271
- data/lib/hecks/facade/handle.rb +0 -293
- data/lib/hecks/facade/json_door.rb +0 -247
- data/lib/hecks/facade/surface/aggregate_door.rb +0 -222
- data/lib/hecks/facade/surface/chapter.rb +0 -116
- data/lib/hecks/facade/surface.rb +0 -61
- data/lib/hecks/mcp_door_scope.rb +0 -176
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "fileutils"
|
|
4
|
+
require "json"
|
|
5
|
+
require "tempfile"
|
|
6
|
+
|
|
7
|
+
module Hecks
|
|
8
|
+
# What each `project_*` generator of the language writes, held as data: absolute path to text.
|
|
9
|
+
#
|
|
10
|
+
# The tables of the language (the model's holding half, the vocabulary, the parser's keywords, the
|
|
11
|
+
# Rust vocabulary, reserved names, field hints, the expression tables and the DSL reference) are
|
|
12
|
+
# projected from the Bluebook chapter's own declarations. Building them apart from writing them
|
|
13
|
+
# lets a caller compare a projection with the tree before anything is changed: a
|
|
14
|
+
# `hecks project_*` verb writes the answer, and the Hecks domain's Language commands report
|
|
15
|
+
# drift and write only when confirmed.
|
|
16
|
+
module ProjectionFiles
|
|
17
|
+
# The repository root this file lives in.
|
|
18
|
+
ROOT = File.expand_path("../..", __dir__)
|
|
19
|
+
|
|
20
|
+
# Raised when a projection would leave the language unable to boot.
|
|
21
|
+
class Refused < StandardError; end
|
|
22
|
+
|
|
23
|
+
# The files a projection writes, and the ones it leaves stale.
|
|
24
|
+
#
|
|
25
|
+
# @!attribute [r] content
|
|
26
|
+
# @return [Hash{String => String}] absolute path to the text it should hold
|
|
27
|
+
# @!attribute [r] stale
|
|
28
|
+
# @return [Array<String>] absolute paths the projection does not emit and removes
|
|
29
|
+
Result = Struct.new(:content, :stale)
|
|
30
|
+
|
|
31
|
+
# Rust keyword and Cargo name tables, by the constant each becomes.
|
|
32
|
+
RESERVED_TABLES = {
|
|
33
|
+
"RUST_KEYWORDS" => "RustReservedWord",
|
|
34
|
+
"CARGO_RESERVED_DOMAIN_NAMES" => "CargoReservedName"
|
|
35
|
+
}.freeze
|
|
36
|
+
|
|
37
|
+
# Names of the projections, in the order a full regeneration runs them.
|
|
38
|
+
NAMES = %i[model vocabulary rust_vocabulary reserved_names parser_table bootstrap_table
|
|
39
|
+
field_hints expression_tables reference].freeze
|
|
40
|
+
|
|
41
|
+
module_function
|
|
42
|
+
|
|
43
|
+
# Builds one projection without writing anything.
|
|
44
|
+
#
|
|
45
|
+
# @param name [Symbol] one of `NAMES`
|
|
46
|
+
# @param root [String] the checkout the projection is for
|
|
47
|
+
# @return [Result] what it would write and remove
|
|
48
|
+
# @raise [ArgumentError] if the projection is not known
|
|
49
|
+
# @raise [Refused] if the projection would leave the language unable to boot
|
|
50
|
+
def build(name, root: ROOT)
|
|
51
|
+
raise ArgumentError, "no projection named #{name.inspect}" unless NAMES.include?(name.to_sym)
|
|
52
|
+
|
|
53
|
+
public_send(name, root)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Writes one projection, each file through a temporary file and a rename so a reader never sees
|
|
57
|
+
# a partial file, and removes what it does not emit.
|
|
58
|
+
#
|
|
59
|
+
# @param name [Symbol] one of `NAMES`
|
|
60
|
+
# @param root [String] the checkout the projection is for
|
|
61
|
+
# @return [Array<String>] one `wrote <path>` or `removed <path>` line for each change
|
|
62
|
+
def write(name, root: ROOT)
|
|
63
|
+
result = build(name, root: root)
|
|
64
|
+
lines = result.content.map { |path, text| write_atomically(path, text) }
|
|
65
|
+
lines + result.stale.map { |path| File.delete(path) && "removed #{path}" }
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Writes one projection and prints what changed, as the `project_*` commands do.
|
|
69
|
+
#
|
|
70
|
+
# @param name [Symbol] one of `NAMES`
|
|
71
|
+
# @param root [String] the checkout the projection is for
|
|
72
|
+
# @return [void] the `wrote`/`removed` lines go to stdout
|
|
73
|
+
# @raise [SystemExit] with the reason on stderr when the projection is refused
|
|
74
|
+
def run(name, root: ROOT)
|
|
75
|
+
puts write(name, root: root)
|
|
76
|
+
rescue Refused => e
|
|
77
|
+
abort e.message
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Replaces a file through a same-directory temporary file and a rename.
|
|
81
|
+
#
|
|
82
|
+
# @param target [String] the file to write
|
|
83
|
+
# @param text [String] what it holds afterwards
|
|
84
|
+
# @return [String] the `wrote <path>` line
|
|
85
|
+
def write_atomically(target, text)
|
|
86
|
+
FileUtils.mkdir_p(File.dirname(target))
|
|
87
|
+
Tempfile.create(File.basename(target), File.dirname(target)) do |tmp|
|
|
88
|
+
tmp.write(text)
|
|
89
|
+
tmp.flush
|
|
90
|
+
File.rename(tmp.path, target)
|
|
91
|
+
end
|
|
92
|
+
"wrote #{target}"
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# @param root [String] the checkout
|
|
96
|
+
# @return [Result] the model's holding half, one file for each thing the chapter holds
|
|
97
|
+
def model(root)
|
|
98
|
+
require "hecks"
|
|
99
|
+
files = Projector.call(:model, bluebook: chapter)
|
|
100
|
+
out = File.join(root, "lib/hecks/bluebook")
|
|
101
|
+
Result.new(files.to_h { |relative, text| [File.join(out, relative), text] }, [])
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# @param root [String] the checkout
|
|
105
|
+
# @return [Result] `lib/hecks/vocabulary.rb`, the language's closed sets
|
|
106
|
+
def vocabulary(root)
|
|
107
|
+
require "hecks"
|
|
108
|
+
Result.new({ File.join(root, "lib/hecks/vocabulary.rb") => artifact_text(:vocabulary) }, [])
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# @param root [String] the checkout
|
|
112
|
+
# @return [Result] one Rust enum a table under `rust/src/kernel/vocab/`; files it does
|
|
113
|
+
# not emit are stale
|
|
114
|
+
def rust_vocabulary(root)
|
|
115
|
+
require "hecks"
|
|
116
|
+
kernel = File.join(root, "rust/src/kernel")
|
|
117
|
+
files = Projector.call(:rust_vocabulary, bluebook: chapter)
|
|
118
|
+
content = files.to_h { |relative, text| [File.join(kernel, relative), text] }
|
|
119
|
+
Result.new(content, Dir.glob(File.join(kernel, "vocab", "*.rs")) - content.keys)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# @param root [String] the checkout
|
|
123
|
+
# @return [Result] `reserved_names.rs` for the codegen and build crates, which share no library
|
|
124
|
+
# @raise [Refused] if a vocabulary declares no members
|
|
125
|
+
def reserved_names(root)
|
|
126
|
+
require "hecks/vocabulary"
|
|
127
|
+
consts = RESERVED_TABLES.map do |const, vocabulary|
|
|
128
|
+
words = Hecks::Vocabulary.fetch(vocabulary)
|
|
129
|
+
raise Refused, "vocabulary #{vocabulary} declares no members" if words.empty?
|
|
130
|
+
|
|
131
|
+
lines = words.map { |word| " #{word.inspect}," }.join("\n")
|
|
132
|
+
"/// The `#{vocabulary}` vocabulary, #{words.size} entries.\n" \
|
|
133
|
+
"pub const #{const}: &[&str] = &[\n#{lines}\n];"
|
|
134
|
+
end
|
|
135
|
+
text = reserved_names_text(consts)
|
|
136
|
+
targets = %w[rust/codegen/src/reserved_names.rs rust/build/src/reserved_names.rs]
|
|
137
|
+
Result.new(targets.to_h { |target| [File.join(root, target), text] }, [])
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# @param root [String] the checkout
|
|
141
|
+
# @return [Result] the Rust parser's keyword table
|
|
142
|
+
def parser_table(root)
|
|
143
|
+
require "hecks"
|
|
144
|
+
Result.new({ File.join(root, "rust/parser/src/keywords.rs") => artifact_text(:parser_table) }, [])
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# @param root [String] the checkout
|
|
148
|
+
# @return [Result] the DSL's bootstrap-window fallbacks
|
|
149
|
+
def bootstrap_table(root)
|
|
150
|
+
require "hecks"
|
|
151
|
+
path = File.join(root, "lib/hecks/bluebook/dsl/bootstrap_table.rb")
|
|
152
|
+
Result.new({ path => artifact_text(:bootstrap_table) }, [])
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# @param root [String] the checkout
|
|
156
|
+
# @return [Result] `rust/host/src/field_hints.rs`, the hints the host's form fields guess from
|
|
157
|
+
def field_hints(root)
|
|
158
|
+
require "hecks"
|
|
159
|
+
vocabulary = chapter.aggregates.find { |aggregate| aggregate.hecks_name == "Vocabulary" }
|
|
160
|
+
field_hint = vocabulary.value_objects.find { |value_object| value_object.hecks_name == "FieldHint" }
|
|
161
|
+
hints = field_hint.members.map(&:to_h)
|
|
162
|
+
Result.new({ File.join(root, "rust/host/src/field_hints.rs") => field_hints_text(hints) }, [])
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# @param root [String] the checkout
|
|
166
|
+
# @return [Result] `lib/hecks/bluebook/expression/projection.json`
|
|
167
|
+
# @raise [Refused] if an admitted operator has no declared algebra, or the projection drops an
|
|
168
|
+
# operator the language's own guards evaluate through
|
|
169
|
+
def expression_tables(root)
|
|
170
|
+
require "hecks"
|
|
171
|
+
require "hecks/grammar"
|
|
172
|
+
operators = expression_operators(Grammar.expression)
|
|
173
|
+
dropped = Grammar.self_bearing_operators.except(*operators.map { |row| row[:symbol] })
|
|
174
|
+
raise Refused, dropped_message(dropped) unless dropped.empty?
|
|
175
|
+
|
|
176
|
+
dispatcher = Grammar.expression
|
|
177
|
+
text = "#{JSON.pretty_generate(operators: operators, normalisations: Grammar.admitted_normalisations(dispatcher))}\n"
|
|
178
|
+
Result.new({ File.join(root, "lib/hecks/bluebook/expression/projection.json") => text }, [])
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# The DSL reference pages and the README regions generated from the same declarations.
|
|
182
|
+
#
|
|
183
|
+
# @param root [String] the checkout
|
|
184
|
+
# @return [Result] every page of `docs/implemented/reference/` and `README.md`
|
|
185
|
+
def reference(root)
|
|
186
|
+
require "hecks"
|
|
187
|
+
directory = File.join(root, "docs/implemented/reference")
|
|
188
|
+
pages = Projector.call(:reference, bluebook: chapter, options: { from: directory })
|
|
189
|
+
content = pages.to_h { |relative, text| [File.join(directory, relative), text] }
|
|
190
|
+
readme = File.join(root, "README.md")
|
|
191
|
+
content[readme] = Doc::Reference.render_readme(root, File.read(readme))
|
|
192
|
+
Result.new(content, [])
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# @param projection [Symbol] a projection registered with the projector
|
|
196
|
+
# @return [String] what it projects from the Bluebook chapter, as the text a file holds
|
|
197
|
+
def artifact_text(projection)
|
|
198
|
+
artifact = Projector.call(projection, bluebook: chapter)
|
|
199
|
+
artifact.is_a?(String) ? artifact : "#{JSON.pretty_generate(artifact)}\n"
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
# @return [Bluebook::Aggregate] the Bluebook chapter, which every projection reads
|
|
203
|
+
def chapter
|
|
204
|
+
Bluebook::MetaValidator.grammar_registry.bluebook("Bluebook")
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# @param dispatcher [Object] the expression dispatcher
|
|
208
|
+
# @return [Array<Hash>] each admitted operator, with the algebra a comparison declares
|
|
209
|
+
# @raise [Refused] if a comparison has no declared algebra
|
|
210
|
+
def expression_operators(dispatcher)
|
|
211
|
+
vocabulary = chapter.aggregates.find { |aggregate| aggregate.name == "Vocabulary" }
|
|
212
|
+
algebra = vocabulary.value_objects.find { |value_object| value_object.hecks_name == "Comparison" }
|
|
213
|
+
.members.to_h { |row| [row.to_h.values.first, row.to_h] }
|
|
214
|
+
Grammar.admitted_operators(dispatcher).map do |op|
|
|
215
|
+
row = { symbol: op[:symbol], category: op[:category], precedence: op[:precedence], arity: op[:arity] }
|
|
216
|
+
next row unless op[:category] == "comparison"
|
|
217
|
+
|
|
218
|
+
declared = algebra.fetch(op[:symbol]) do
|
|
219
|
+
raise Refused, "#{op[:symbol]} is admitted but Vocabulary::Comparison declares no algebra for it"
|
|
220
|
+
end
|
|
221
|
+
row.merge(compares_less_than: declared[:compares_less_than],
|
|
222
|
+
compares_equal: declared[:compares_equal], negated: declared[:negated])
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# @param dropped [Hash{String => Array<String>}] operator to the guards evaluating through it
|
|
227
|
+
# @return [String] one line for each operator a projection would strand
|
|
228
|
+
def dropped_message(dropped)
|
|
229
|
+
dropped.map do |symbol, sites|
|
|
230
|
+
"#{symbol} is self-bearing — the language's own predicates evaluate through it " \
|
|
231
|
+
"(#{sites.first(3).join('; ')}) — rewrite those guards before retiring it"
|
|
232
|
+
end.join("\n")
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
# @param consts [Array<String>] the rendered Rust constants
|
|
236
|
+
# @return [String] the whole `reserved_names.rs`
|
|
237
|
+
def reserved_names_text(consts)
|
|
238
|
+
<<~RUST
|
|
239
|
+
// GENERATED by hecks project_reserved_names from the RustReservedWord and
|
|
240
|
+
// CargoReservedName vocabularies (lib/hecks/language/bluebook/
|
|
241
|
+
// vocabulary.bluebook). Do not hand-edit — re-run hecks project_reserved_names.
|
|
242
|
+
|
|
243
|
+
#{consts.join("\n\n")}
|
|
244
|
+
RUST
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
# @param hints [Array<Hash>] the rows of `Vocabulary::FieldHint`
|
|
248
|
+
# @return [String] the whole `field_hints.rs`
|
|
249
|
+
def field_hints_text(hints)
|
|
250
|
+
consts = hints.map { |hint| field_hint_constant(hint) }.join("\n")
|
|
251
|
+
<<~RUST
|
|
252
|
+
// GENERATED by hecks project_field_hints from Vocabulary::FieldHint
|
|
253
|
+
// (lib/hecks/language/bluebook/vocabulary.bluebook). Do not
|
|
254
|
+
// hand-edit — re-run hecks project_field_hints instead.
|
|
255
|
+
//
|
|
256
|
+
// web.rs's `text_field` matches these in the SAME precedence Ruby's
|
|
257
|
+
// own `text_field` does: EMAIL_HINT, then URL_HINT, then TEL_HINT —
|
|
258
|
+
// against `html_type`, first match wins — then, only if `html_type`
|
|
259
|
+
// stayed "text", TEXTAREA_HINT against `kind`.
|
|
260
|
+
|
|
261
|
+
use regex::Regex;
|
|
262
|
+
use std::sync::LazyLock;
|
|
263
|
+
|
|
264
|
+
#{consts}
|
|
265
|
+
RUST
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
# @param hint [Hash] one `FieldHint` row: its name, pattern and what it resolves to
|
|
269
|
+
# @return [String] the Rust `static` for it
|
|
270
|
+
def field_hint_constant(hint)
|
|
271
|
+
name = "#{hint[:name].upcase}_HINT"
|
|
272
|
+
<<~RUST
|
|
273
|
+
/// #{hint[:name].capitalize} hint, resolving to `#{hint[:resolves_to]}` on a match —
|
|
274
|
+
/// Vocabulary::FieldHint's own declared pattern, unmodified (the
|
|
275
|
+
/// same text `Regexp#source` reads off FieldShape's own
|
|
276
|
+
/// #{name}, which is built from this same row).
|
|
277
|
+
/// `(?i)` up front is this crate's spelling
|
|
278
|
+
/// of Ruby's trailing `/i` — the WHOLE pattern is case-insensitive
|
|
279
|
+
/// on both sides, never partially.
|
|
280
|
+
pub static #{name}: LazyLock<Regex> =
|
|
281
|
+
LazyLock::new(|| Regex::new(r#"(?i)#{hint[:pattern]}"#).expect("declared field-hint pattern must compile"));
|
|
282
|
+
RUST
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
end
|
|
@@ -2,28 +2,12 @@ require_relative "../projector"
|
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
4
|
module Projections
|
|
5
|
-
#
|
|
6
|
-
#
|
|
5
|
+
# Projects lib/hecks/bluebook/dsl/bootstrap_table.rb from the chapter's Keyword rows.
|
|
6
|
+
# Committed, not built at boot: it is read before the grammar table exists.
|
|
7
7
|
#
|
|
8
8
|
# Projector.call(:bootstrap_table, bluebook: <the Bluebook chapter>)
|
|
9
9
|
#
|
|
10
|
-
#
|
|
11
|
-
# yet, so `WordGate#method_missing` and `RuleReference#lookup` cannot
|
|
12
|
-
# read `calls:`/`resolves_via:`/`disambiguator:` off it — this table is
|
|
13
|
-
# what they read instead.
|
|
14
|
-
#
|
|
15
|
-
# A partition, not a filter: every live row lands in the table, not only
|
|
16
|
-
# the ones a bootstrap chapter happens to call. Picking a subset by
|
|
17
|
-
# grepping which words the core chapters use during bootstrap would risk
|
|
18
|
-
# quietly dropping any word a chapter starts using later. Including
|
|
19
|
-
# every row instead costs nothing: a builder with its own `def` never
|
|
20
|
-
# reaches `method_missing` at all, so a row no bootstrap chapter calls
|
|
21
|
-
# is simply never read.
|
|
22
|
-
#
|
|
23
|
-
# The table cannot be built at boot for the same reason it exists: it
|
|
24
|
-
# is read before the grammar it comes from has been assembled. So it is
|
|
25
|
-
# committed, like lib/hecks/vocabulary.rb, and spec/bootstrap_table_
|
|
26
|
-
# spec.rb re-projects it in memory and refuses a diff.
|
|
10
|
+
# Every live row is included, not only those a bootstrap chapter calls.
|
|
27
11
|
module BootstrapTable
|
|
28
12
|
extend Projector::Target
|
|
29
13
|
|
|
@@ -37,7 +21,7 @@ module Hecks
|
|
|
37
21
|
# KeywordSeed under lib/hecks/language/).
|
|
38
22
|
#
|
|
39
23
|
# Do not edit. spec/bootstrap_table_spec.rb re-projects this in memory
|
|
40
|
-
# and refuses a diff — run
|
|
24
|
+
# and refuses a diff — run hecks project_bootstrap_table instead.
|
|
41
25
|
#
|
|
42
26
|
# Plain data, no requires: this is read while the grammar table it was
|
|
43
27
|
# projected from is still being built (`MetaValidator.bootstrapping?`).
|
|
@@ -45,20 +29,13 @@ module Hecks
|
|
|
45
29
|
|
|
46
30
|
module_function
|
|
47
31
|
|
|
48
|
-
# Projects the bootstrap fallback table
|
|
49
|
-
#
|
|
50
|
-
# not any one chapter's.
|
|
32
|
+
# Projects the bootstrap fallback table; both arguments are ignored (the table is
|
|
33
|
+
# the whole grammar) and exist for the `Projector::Target` calling convention.
|
|
51
34
|
#
|
|
52
|
-
# @param bluebook [Bluebook::Chapter] ignored; present to satisfy the
|
|
53
|
-
# `Projector::Target` calling convention
|
|
54
|
-
# @param options [Hash{Symbol => Object}] ignored; present to satisfy the
|
|
55
|
-
# `Projector::Target` calling convention
|
|
56
35
|
# @return [String] the rendered `lib/hecks/bluebook/dsl/bootstrap_table.rb` source
|
|
57
36
|
def call(bluebook:, options: {}) = render(bluebook)
|
|
58
37
|
|
|
59
|
-
#
|
|
60
|
-
# still dispatch — the same `status != "retired"` reading
|
|
61
|
-
# `GenericDispatch.shape_for` gives the live table.
|
|
38
|
+
# Every keyword row that is not retired; admitted and deprecated rows still dispatch.
|
|
62
39
|
#
|
|
63
40
|
# @return [Array<Hash{Symbol => String}>] every non-retired keyword row, each with
|
|
64
41
|
# at least `:context`, `:word`, `:status`, `:calls`, `:resolves_via` and
|
|
@@ -67,11 +44,8 @@ module Hecks
|
|
|
67
44
|
Bluebook::MetaValidator::SyntaxBoot.call[:keywords].reject { |row| row[:status] == "retired" }
|
|
68
45
|
end
|
|
69
46
|
|
|
70
|
-
# `[context, word] => :method
|
|
71
|
-
#
|
|
72
|
-
# An overloaded word has one row per argument shape, and they all
|
|
73
|
-
# name the same method. Two that don't would make the table keep
|
|
74
|
-
# whichever came last, so that is refused instead.
|
|
47
|
+
# `[context, word] => :method`, in WordGate's key order.
|
|
48
|
+
# Overloaded rows must all name the same method; a mismatch raises rather than last-wins.
|
|
75
49
|
#
|
|
76
50
|
# @param rows [Array<Hash{Symbol => String}>] the keyword rows to build from,
|
|
77
51
|
# defaulting to every live one
|
|
@@ -90,9 +64,7 @@ module Hecks
|
|
|
90
64
|
end
|
|
91
65
|
end
|
|
92
66
|
|
|
93
|
-
# `[word, context] => { resolves_via:, disambiguator: }
|
|
94
|
-
# RuleReference's own key order, blank columns omitted, the same
|
|
95
|
-
# shape its live `lookup` answers.
|
|
67
|
+
# `[word, context] => { resolves_via:, disambiguator: }`, in RuleReference's key order.
|
|
96
68
|
#
|
|
97
69
|
# @param rows [Array<Hash{Symbol => String}>] the keyword rows to build from,
|
|
98
70
|
# defaulting to every live one
|
|
@@ -106,13 +78,9 @@ module Hecks
|
|
|
106
78
|
end
|
|
107
79
|
end
|
|
108
80
|
|
|
109
|
-
# Renders the
|
|
110
|
-
# `RESOLVES` frozen Hash literals under the generated-file header.
|
|
81
|
+
# Renders the `CALLS` and `RESOLVES` frozen Hash literals as Ruby source.
|
|
111
82
|
#
|
|
112
|
-
# @
|
|
113
|
-
# language's grammar, not this argument
|
|
114
|
-
# @return [String] the full `lib/hecks/bluebook/dsl/bootstrap_table.rb` source,
|
|
115
|
-
# ready to write to disk
|
|
83
|
+
# @return [String] the full `lib/hecks/bluebook/dsl/bootstrap_table.rb` source
|
|
116
84
|
def render(_bluebook)
|
|
117
85
|
rows = live_keywords
|
|
118
86
|
calls_lines = calls(rows).map { |key, target| " #{key.inspect} => #{target.inspect}" }
|
|
@@ -5,25 +5,12 @@ module Hecks
|
|
|
5
5
|
module Projections
|
|
6
6
|
module Deploy
|
|
7
7
|
module Fargate
|
|
8
|
-
# Fills the optional sections of a rendered Fargate template
|
|
9
|
-
#
|
|
10
|
-
# The template text carries `# TMPL:<name>` marker lines where an
|
|
11
|
-
# optional section belongs. `apply` replaces each with what the stack's
|
|
12
|
-
# `Settings::Plan` calls for, and with nothing when the plan sets
|
|
13
|
-
# nothing there, so a world that uses none of the optional settings
|
|
14
|
-
# renders the template it always did.
|
|
8
|
+
# Fills the optional `# TMPL:<name>` sections of a rendered Fargate template with
|
|
9
|
+
# what the plan calls for, or nothing when a world uses none of them.
|
|
15
10
|
module Assembly
|
|
16
11
|
module_function
|
|
17
12
|
|
|
18
13
|
# Replaces every optional-section marker in a rendered template.
|
|
19
|
-
#
|
|
20
|
-
# @param template [String] the rendered template holding `# TMPL:` marker lines
|
|
21
|
-
# @param plan [Settings::Plan] the stack's checked optional settings
|
|
22
|
-
# @param context [Hash{Symbol => Object}] `:stack_name`, `:vpc_ref`, `:listener_id`,
|
|
23
|
-
# `:alb_id`, `:distribution_id` and `:db_secret_ref`
|
|
24
|
-
# @return [String] the template with the markers replaced
|
|
25
|
-
# @raise [ArgumentError] if `domain_env` removes a variable the generator does not set, or
|
|
26
|
-
# the finished template declares one logical id or parameter twice
|
|
27
14
|
def apply(template, plan, context)
|
|
28
15
|
text = override_domain_env(template, plan.domain_env)
|
|
29
16
|
sections(plan, context).each { |marker, block| text = Yaml.splice(text, marker, block) }
|
|
@@ -7,38 +7,7 @@ module Hecks
|
|
|
7
7
|
module Deploy
|
|
8
8
|
module Fargate
|
|
9
9
|
# The CloudFront distribution in front of the load balancer.
|
|
10
|
-
#
|
|
11
|
-
# With no `cdn` setting the stack gets `default_yaml`: the default
|
|
12
|
-
# certificate, one origin, and one behavior that caches nothing. A
|
|
13
|
-
# `cdn` setting replaces that with a distribution described by the
|
|
14
|
-
# world.
|
|
15
|
-
#
|
|
16
|
-
# ## Settings
|
|
17
|
-
#
|
|
18
|
-
# `cdn` is a hash with these optional keys:
|
|
19
|
-
#
|
|
20
|
-
# - `aliases`: hostnames the distribution answers to. Needs `certificate_arn`.
|
|
21
|
-
# - `certificate_arn`: an `ACM` certificate in us-east-1, or an intrinsic such as
|
|
22
|
-
# `"!Ref CertArn"`.
|
|
23
|
-
# - `minimum_protocol`: the TLS policy for the certificate; `TLSv1.2_2021` by default.
|
|
24
|
-
# - `origin_id`: the id of the load-balancer origin; `<AlbId>Origin` by default.
|
|
25
|
-
# - `origin_ssl_protocols`: the TLS versions CloudFront may use to reach the origin, such
|
|
26
|
-
# as `["TLSv1.2"]`.
|
|
27
|
-
# - `explicit_origin_ports`: false leaves `HTTPPort` and `HTTPSPort` unset; true by
|
|
28
|
-
# default.
|
|
29
|
-
# - `origin_secret`: `{header:, parameter:}` sends a secret header to the origin, filled
|
|
30
|
-
# from a `NoEcho` template parameter the stack declares under that name.
|
|
31
|
-
# - `extra_origins`: S3 origins, each `{id:, domain_name:, origin_access_control_id:}`.
|
|
32
|
-
# - `default_behavior`: `{origin:, viewer_protocol:, methods:, compress:, cache_policy:,
|
|
33
|
-
# origin_request_policy:}`.
|
|
34
|
-
# - `behaviors`: entries of the same shape with a required `path`; the first match wins,
|
|
35
|
-
# so order matters.
|
|
36
|
-
# - `retain`: true keeps the distribution when the stack is deleted or replaces it.
|
|
37
|
-
#
|
|
38
|
-
# A cache or origin-request policy is a managed policy's name (`caching_disabled`,
|
|
39
|
-
# `caching_optimized`, `all_viewer`, `all_viewer_except_host`, or `none` to omit an origin
|
|
40
|
-
# request policy) or the id of a policy in the account. `methods` is `all`, `read` or
|
|
41
|
-
# `get_head`.
|
|
10
|
+
# With no `cdn` setting the stack gets `default_yaml`; settings are in the DSL reference.
|
|
42
11
|
module Cdn
|
|
43
12
|
module_function
|
|
44
13
|
|
|
@@ -64,14 +33,6 @@ module Hecks
|
|
|
64
33
|
HOSTNAME = /\A(\*\.)?([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z]{2,}\z/
|
|
65
34
|
|
|
66
35
|
# Reads and checks the `cdn` setting.
|
|
67
|
-
#
|
|
68
|
-
# @param setting [Hash, nil] the world's `cdn` value, or nil when it sets none
|
|
69
|
-
# @param default_origin_id [String] the load-balancer origin's id when `origin_id` is not
|
|
70
|
-
# set
|
|
71
|
-
# @return [Hash{Symbol => Object}, nil] the checked options with defaults applied, or nil
|
|
72
|
-
# for none
|
|
73
|
-
# @raise [ArgumentError] if an option is unknown, malformed, or names an origin that does
|
|
74
|
-
# not exist
|
|
75
36
|
def normalize(setting, default_origin_id:)
|
|
76
37
|
return nil if setting.nil?
|
|
77
38
|
|
|
@@ -87,9 +48,6 @@ module Hecks
|
|
|
87
48
|
end
|
|
88
49
|
|
|
89
50
|
# Lists the template parameters the options need.
|
|
90
|
-
#
|
|
91
|
-
# @param options [Hash, nil] the checked options from `normalize`
|
|
92
|
-
# @return [String] flush-left parameter text, or empty
|
|
93
51
|
def parameters_yaml(options)
|
|
94
52
|
secret = options && options[:origin_secret]
|
|
95
53
|
return "" unless secret
|
|
@@ -103,11 +61,6 @@ module Hecks
|
|
|
103
61
|
end
|
|
104
62
|
|
|
105
63
|
# Renders the distribution for a set of checked options.
|
|
106
|
-
#
|
|
107
|
-
# @param options [Hash] the checked options from `normalize`
|
|
108
|
-
# @param distribution_id [String] the logical id the distribution is given
|
|
109
|
-
# @param alb_id [String] the logical id of the load balancer the origin points at
|
|
110
|
-
# @return [String] the flush-left resource text ending in a newline
|
|
111
64
|
def yaml(options, distribution_id:, alb_id:)
|
|
112
65
|
lines = ["#{distribution_id}:", " Type: AWS::CloudFront::Distribution"]
|
|
113
66
|
lines.push(" DeletionPolicy: Retain", " UpdateReplacePolicy: Retain") if options[:retain]
|
|
@@ -6,17 +6,8 @@ module Hecks
|
|
|
6
6
|
module Cdn
|
|
7
7
|
module_function
|
|
8
8
|
|
|
9
|
-
# The distribution a stack gets when its world sets no `cdn` options
|
|
10
|
-
#
|
|
11
|
-
# Real HTTPS in front of the load balancer's HTTP-only listener, and
|
|
12
|
-
# the one safe caching default the generator can offer: every route
|
|
13
|
-
# is treated as session-driven, so nothing is cached. The comment
|
|
14
|
-
# inside the rendered block explains why, and reaches the generated
|
|
15
|
-
# template unchanged.
|
|
16
|
-
#
|
|
17
|
-
# @param alb_id [String] the logical id of the load balancer
|
|
18
|
-
# @param distribution_id [String] the logical id the distribution is given
|
|
19
|
-
# @return [String] the flush-left resource text with its comments, ending in a newline
|
|
9
|
+
# The distribution a stack gets when its world sets no `cdn` options: HTTPS in
|
|
10
|
+
# front of the HTTP-only ALB, caching disabled since every route is session-driven.
|
|
20
11
|
def default_yaml(alb_id:, distribution_id:)
|
|
21
12
|
<<~DEFAULT
|
|
22
13
|
# Real HTTPS (the ALB's own Listener above is HTTP-only —
|
|
@@ -2,15 +2,8 @@ module Hecks
|
|
|
2
2
|
module Projections
|
|
3
3
|
module Deploy
|
|
4
4
|
module Fargate
|
|
5
|
-
# Validation for the optional settings
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
# `FargateTarget.Declare` in deploy.bluebook owns the baseline
|
|
9
|
-
# settings (`cpu`, `memory`, `port`, `database`, `web`). The keys added
|
|
10
|
-
# for multi-container stacks are nested shapes (lists of hashes, maps),
|
|
11
|
-
# which that aggregate's flat attributes cannot describe, so they are
|
|
12
|
-
# checked here. Every check raises `ArgumentError` naming the setting
|
|
13
|
-
# it was reading, so a mistake in a `.world` file points at its line.
|
|
5
|
+
# Validation for the optional Fargate settings beyond the baseline ones.
|
|
6
|
+
# Every check raises `ArgumentError` naming the setting it was reading.
|
|
14
7
|
module Check
|
|
15
8
|
module_function
|
|
16
9
|
|
|
@@ -71,7 +64,7 @@ module Hecks
|
|
|
71
64
|
"(letters and digits, starting with a letter), got #{value.inspect}"
|
|
72
65
|
end
|
|
73
66
|
|
|
74
|
-
# Checks that a value is a name AWS accepts for a container, repository or stack
|
|
67
|
+
# Checks that a value is a name AWS accepts for a container, repository or stack.
|
|
75
68
|
#
|
|
76
69
|
# @param value [Object] the name as written in the world file
|
|
77
70
|
# @param where [String] the setting's name, used in the error message
|
|
@@ -116,7 +109,7 @@ module Hecks
|
|
|
116
109
|
# @param min [Integer] the fewest entries allowed
|
|
117
110
|
# @param max [Integer, nil] the most entries allowed, or nil for no limit
|
|
118
111
|
# @return [Array<String>] the entries as strings
|
|
119
|
-
# @raise [ArgumentError] if the value is not a list of strings or
|
|
112
|
+
# @raise [ArgumentError] if the value is not a list of strings or is out of size range
|
|
120
113
|
def strings!(value, where, min: 0, max: nil)
|
|
121
114
|
list = value.is_a?(Array) ? value : nil
|
|
122
115
|
ok = list&.all? { |item| (item.is_a?(String) || item.is_a?(Symbol)) && !item.to_s.empty? }
|
|
@@ -128,9 +121,7 @@ module Hecks
|
|
|
128
121
|
end
|
|
129
122
|
|
|
130
123
|
# Checks that a value is a map of names to strings and returns it string-keyed.
|
|
131
|
-
#
|
|
132
|
-
# A `nil` value is kept: for the domain container's environment it
|
|
133
|
-
# removes a default variable.
|
|
124
|
+
# A `nil` value is kept: the domain container's env setting removes a variable with it.
|
|
134
125
|
#
|
|
135
126
|
# @param value [Object] the map as written in the world file
|
|
136
127
|
# @param where [String] the setting's name, used in the error message
|