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
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
require_relative "../../bluebook/dsl/hecksagon_builder"
|
|
2
|
-
require_relative "../../bluebook/dsl/domain_port_builder"
|
|
3
|
-
require_relative "../../bluebook/dsl/const_shim"
|
|
4
|
-
require_relative "../../bluebook/dsl/binding_proxy"
|
|
5
|
-
require_relative "../../bluebook/hexagon"
|
|
6
|
-
require_relative "../handle"
|
|
7
|
-
require_relative "../../naming"
|
|
8
|
-
|
|
9
|
-
module Hecks
|
|
10
|
-
module Facade
|
|
11
|
-
module Surface
|
|
12
|
-
# One aggregate's door: creating verbs as module methods returning
|
|
13
|
-
# the record in hand, CRUD delegation to the repository, the
|
|
14
|
-
# `persisted_by`-style binding collector a `.hecksagon` lands on, and
|
|
15
|
-
# the aggregate-scoped `port` a `.hecksagon` lands on beside it.
|
|
16
|
-
module AggregateDoor
|
|
17
|
-
# Builds the anonymous module that is one aggregate's door: a `name!` method per
|
|
18
|
-
# creating command, a bare method per query, `find`/`all`/`count`/`events`,
|
|
19
|
-
# `project`/`docs`/`narrate`, and the `.hecksagon` binding hooks.
|
|
20
|
-
#
|
|
21
|
-
# Warns once for each attribute whose name is in `RESERVED`.
|
|
22
|
-
#
|
|
23
|
-
# One method building one `door` module's ~20 singleton methods
|
|
24
|
-
# looks like it splits along each `define_singleton_method` call,
|
|
25
|
-
# but three of those blocks (`:port`, `:method_missing`,
|
|
26
|
-
# `:const_missing`) are a single cross-referencing essay on the
|
|
27
|
-
# stale-facade-across-boots hazard — each one's comment explicitly
|
|
28
|
-
# points at "below"/"above" as part of the same method. Splitting
|
|
29
|
-
# into helper methods wouldn't break anything at runtime (no
|
|
30
|
-
# shared mutable state beyond the closed-over args, which just
|
|
31
|
-
# become parameters), but it would sever that narrative across
|
|
32
|
-
# method boundaries for no functional gain.
|
|
33
|
-
#
|
|
34
|
-
# @param dispatcher [Runtime::Dispatcher, Runtime::RemoteDispatcher] the booted
|
|
35
|
-
# dispatcher the door's methods dispatch, query and read repositories through
|
|
36
|
-
# @param domain [String] the owning chapter's name, the first half of the
|
|
37
|
-
# aggregate's FQN (`"Pizzas"` in `"Pizzas::Pizza"`)
|
|
38
|
-
# @param aggregate [Bluebook::Aggregate] the aggregate to build a door for
|
|
39
|
-
# @return [Module] a fresh, unnamed module carrying the door's singleton methods
|
|
40
|
-
# @raise [Bluebook::DSL::Malformed] never while building; the returned door's
|
|
41
|
-
# `port` raises it when called with no boot in progress
|
|
42
|
-
# rubocop:disable-next Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
43
|
-
def aggregate_module(dispatcher, domain, aggregate)
|
|
44
|
-
fqn = "#{domain}::#{aggregate.hecks_name}"
|
|
45
|
-
door = Module.new
|
|
46
|
-
|
|
47
|
-
aggregate.attributes.each do |attribute|
|
|
48
|
-
next unless RESERVED.include?(attribute.name.to_sym)
|
|
49
|
-
|
|
50
|
-
warn "[hecks] #{aggregate.hecks_name}##{attribute.name} shadows a built-in — no reader defined"
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
# A creating verb is a module method returning the new record in hand ;
|
|
54
|
-
# a verb that reaches an existing record lives on the Handle. `!` —
|
|
55
|
-
# a command does something (mutates, may refuse), Ruby's own
|
|
56
|
-
# convention for that ; `Naming.snake` alone would leave a
|
|
57
|
-
# creating command's bare name claiming the exact spelling a
|
|
58
|
-
# query of the same business name also wants (`Account`'s own
|
|
59
|
-
# "Open" — the creating command and a query listing open
|
|
60
|
-
# accounts, a real same-aggregate collision this corpus already
|
|
61
|
-
# has) — the suffix is what makes both nameable at all, not
|
|
62
|
-
# merely a style choice.
|
|
63
|
-
aggregate.commands.select(&:creates?).each do |command|
|
|
64
|
-
door.define_singleton_method("#{Naming.snake(command.hecks_name)}!") do |**args|
|
|
65
|
-
Handle.new(dispatcher: dispatcher, domain: domain, aggregate: aggregate,
|
|
66
|
-
instance: dispatcher.dispatch("#{fqn}.#{command.hecks_name}", with: args).instance)
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
# A query is a module method too — same level as a creating
|
|
71
|
-
# command, since neither needs an existing record in hand — but
|
|
72
|
-
# bare: a query reads and returns, nothing to warn a caller
|
|
73
|
-
# about the way `!` does for a command. Answers the raw row
|
|
74
|
-
# array `dispatcher.query` itself answers, the same shape
|
|
75
|
-
# `runtime.query("#{fqn}.Name")` already gave.
|
|
76
|
-
aggregate.queries.each do |query|
|
|
77
|
-
door.define_singleton_method(Naming.snake(query.hecks_name)) do |**args|
|
|
78
|
-
dispatcher.query("#{fqn}.#{query.hecks_name}", **args)
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
door.define_singleton_method(:fqn) { fqn }
|
|
83
|
-
door.define_singleton_method(:ir) { aggregate }
|
|
84
|
-
|
|
85
|
-
# The same verb the chapter answers, one level down. Every
|
|
86
|
-
# construct emits its own IR (Hecks::IR), so an aggregate
|
|
87
|
-
# is a legitimate thing to project — `Pizzas::Order.project(
|
|
88
|
-
# Projections::IR)` is this aggregate's IR, not the chapter's.
|
|
89
|
-
#
|
|
90
|
-
# A chapter-scoped target refuses here rather than inventing an
|
|
91
|
-
# answer: `Projector.admits!` is what tells `Projections::IR`
|
|
92
|
-
# (`from: :any`) apart from `Projections::Shape`
|
|
93
|
-
# (`from: :chapter`), which would otherwise answer a confidently
|
|
94
|
-
# empty `{"aggregates" => []}` for an aggregate.
|
|
95
|
-
door.define_singleton_method(:project) do |target, out: nil, **options|
|
|
96
|
-
key = Projector.key_for(target)
|
|
97
|
-
artifact = Projector.call(key, bluebook: aggregate, options: options)
|
|
98
|
-
return artifact unless out
|
|
99
|
-
|
|
100
|
-
Projector.write(artifact, out, as: Projector.emits_for(key))
|
|
101
|
-
end
|
|
102
|
-
door.define_singleton_method(:repository) { dispatcher.registry.repository(domain, aggregate) }
|
|
103
|
-
door.define_singleton_method(:commands) do
|
|
104
|
-
aggregate.commands.map { |c| "#{Naming.snake(c.hecks_name)}!" }.sort
|
|
105
|
-
end
|
|
106
|
-
door.define_singleton_method(:queries) { aggregate.queries.map { |q| Naming.snake(q.hecks_name) }.sort }
|
|
107
|
-
# **One aggregate's usage document** — the same projection the chapter
|
|
108
|
-
# answers with, narrowed to this head. `commands` above already
|
|
109
|
-
# answers "what can I call"; this answers "and what does each one
|
|
110
|
-
# want, refuse, and guarantee", which is the rest of the question.
|
|
111
|
-
door.define_singleton_method(:docs) do |**options|
|
|
112
|
-
Projector.call(:docs, bluebook: dispatcher.registry.bluebook(domain),
|
|
113
|
-
options: options.merge(aggregate: aggregate.hecks_name))
|
|
114
|
-
end
|
|
115
|
-
# **One aggregate, read back in english** — the same narrowing `:docs`
|
|
116
|
-
# takes, aimed at `:narrate` instead.
|
|
117
|
-
door.define_singleton_method(:narrate) do |**options|
|
|
118
|
-
Projector.call(:narrate, bluebook: dispatcher.registry.bluebook(domain),
|
|
119
|
-
options: options.merge(aggregate: aggregate.hecks_name))
|
|
120
|
-
end
|
|
121
|
-
door.define_singleton_method(:count) { dispatcher.registry.repository(domain, aggregate).count }
|
|
122
|
-
door.define_singleton_method(:events) { dispatcher.events.select { |event| event.aggregate == fqn } }
|
|
123
|
-
|
|
124
|
-
door.define_singleton_method(:find) do |id|
|
|
125
|
-
found = dispatcher.registry.repository(domain, aggregate).find(id)
|
|
126
|
-
found && Handle.new(dispatcher: dispatcher, domain: domain, aggregate: aggregate, instance: found)
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
door.define_singleton_method(:all) do |**opts|
|
|
130
|
-
dispatcher.registry.repository(domain, aggregate).all(**opts).map do |instance|
|
|
131
|
-
Handle.new(dispatcher: dispatcher, domain: domain, aggregate: aggregate, instance: instance)
|
|
132
|
-
end
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
# The same reason `method_missing` below exists at all — a facade
|
|
136
|
-
# left over from a previous boot in this process shadows the fresh
|
|
137
|
-
# `BindingProxy` a `.hecksagon` would otherwise reach through
|
|
138
|
-
# `ConstShim`/`const_missing`, so `Pizzas::Pizza.port(...)` lands
|
|
139
|
-
# here instead once any boot has run before.
|
|
140
|
-
#
|
|
141
|
-
# Re-resolved, not the closed-over `aggregate` — this door can be a
|
|
142
|
-
# stale one, built by a boot from earlier in this same process,
|
|
143
|
-
# sitting on the `Pizzas`/`Pizza` constants only because nothing
|
|
144
|
-
# has re-installed them since. Attaching to this door's own
|
|
145
|
-
# `aggregate` would attach the port to a discarded aggregate from
|
|
146
|
-
# that old boot, invisible to the current one actually being
|
|
147
|
-
# loaded — silently, the exact way `method_missing` below already
|
|
148
|
-
# has to avoid it for a plain bind, via `HecksagonBuilder.collector`
|
|
149
|
-
# rather than anything this door closes over. `Hecks.current_registry`
|
|
150
|
-
# is the same "whichever boot is actually in progress" indirection,
|
|
151
|
-
# and `BindingProxy#port` already re-resolves through it the same
|
|
152
|
-
# way — this is that door's fallback twin, not a shortcut past it.
|
|
153
|
-
door.define_singleton_method(:port) do |name, &block|
|
|
154
|
-
current = Hecks.current_registry&.bluebook(domain)&.aggregate(aggregate.hecks_name) or
|
|
155
|
-
raise Bluebook::DSL::Malformed, "#{fqn}.port(#{name.inspect}) called outside a boot"
|
|
156
|
-
|
|
157
|
-
domain_port = Bluebook::DSL::ConstShim.with(->(const) { const }) do
|
|
158
|
-
Bluebook::DSL::DomainPortBuilder.build(name, owner: current.hecks_name, &block)
|
|
159
|
-
end
|
|
160
|
-
domain_port.operations.each do |operation|
|
|
161
|
-
operation.attributes.select(&:reference?).each { |attribute| attribute.type.declared_in = current }
|
|
162
|
-
end
|
|
163
|
-
current.add_port(domain_port)
|
|
164
|
-
self
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
door.define_singleton_method(:method_missing) do |verb, *args, **kwargs, &block|
|
|
168
|
-
# A bare call starts a Privacy marking chain — see
|
|
169
|
-
# `Bluebook::DSL::BindingProxy#method_missing`'s own header;
|
|
170
|
-
# this is the same mechanism, reached when the constant is
|
|
171
|
-
# already a real, installed door (a second boot in-process)
|
|
172
|
-
# rather than a `.hecksagon`-parse-time `BindingProxy`.
|
|
173
|
-
return Bluebook::DSL::AttributePath.new(fqn, [verb.to_s]) if args.empty? && kwargs.empty? && !block
|
|
174
|
-
|
|
175
|
-
collector = Bluebook::DSL::HecksagonBuilder.collector
|
|
176
|
-
return super(verb, *args, **kwargs, &block) unless collector
|
|
177
|
-
|
|
178
|
-
collector << Bluebook::Bind.new(
|
|
179
|
-
aggregate: fqn,
|
|
180
|
-
verb: verb.to_s,
|
|
181
|
-
adapter: args.first.to_s,
|
|
182
|
-
role: kwargs[:role]&.to_s
|
|
183
|
-
)
|
|
184
|
-
block&.call
|
|
185
|
-
self
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
door.define_singleton_method(:respond_to_missing?) do |name, include_private = false|
|
|
189
|
-
!Bluebook::DSL::HecksagonBuilder.collector.nil? || super(name, include_private)
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
# The same stale-facade hazard `method_missing`/`port` above already
|
|
193
|
-
# document, one door lower — `Surface.install` installs an aggregate's
|
|
194
|
-
# own name as a bare top-level constant too (`Namespace.install(Object,
|
|
195
|
-
# aggregate.hecks_name, ...)`, surface.rb's own `install`), not only
|
|
196
|
-
# nested under its chapter. So once any domain has booted once in this
|
|
197
|
-
# process, `Account::Debit` written while declaring some other
|
|
198
|
-
# bluebook — same domain or a different one — reaches this door's
|
|
199
|
-
# const_missing directly, never `Object.const_missing`/`ConstShim::
|
|
200
|
-
# Hook` at all: real modules resolve without ever calling that.
|
|
201
|
-
#
|
|
202
|
-
# `aggregate.hecks_name`, not the qualified `fqn` — a scoped
|
|
203
|
-
# reference has to read the same either way, whether or not a stale
|
|
204
|
-
# door happens to be sitting on this process from an earlier boot;
|
|
205
|
-
# qualifying it here would make `Account::Debit`'s own meaning
|
|
206
|
-
# depend on incidental process history, which is the exact
|
|
207
|
-
# instability S0b exists to remove (docs/dsl-work-slices.md — "two
|
|
208
|
-
# domains in one registry" is this file's own reason for being
|
|
209
|
-
# owned by that slice).
|
|
210
|
-
door.define_singleton_method(:const_missing) do |name|
|
|
211
|
-
resolver = Bluebook::DSL::ConstShim.resolver
|
|
212
|
-
return resolver.call("#{aggregate.hecks_name}::#{name}") if resolver
|
|
213
|
-
|
|
214
|
-
super(name)
|
|
215
|
-
end
|
|
216
|
-
|
|
217
|
-
door
|
|
218
|
-
end
|
|
219
|
-
end
|
|
220
|
-
end
|
|
221
|
-
end
|
|
222
|
-
end
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
require_relative "../../bluebook/dsl/binding_proxy"
|
|
2
|
-
require_relative "../../bluebook/dsl/const_shim"
|
|
3
|
-
require_relative "../../bluebook/dsl/hecksagon_builder"
|
|
4
|
-
|
|
5
|
-
module Hecks
|
|
6
|
-
module Facade
|
|
7
|
-
module Surface
|
|
8
|
-
# One chapter's module: vision and aggregate roll-call on the
|
|
9
|
-
# singleton, one aggregate door per declared head, and the
|
|
10
|
-
# declaration hook for names the door does not carry.
|
|
11
|
-
module Chapter
|
|
12
|
-
# Builds the anonymous module that stands for one booted chapter: `vision`,
|
|
13
|
-
# `aggregates`, `docs`, `narrate` and `project` as singleton methods, plus one
|
|
14
|
-
# nested constant per aggregate holding that aggregate's door.
|
|
15
|
-
#
|
|
16
|
-
# @param dispatcher [Runtime::Dispatcher, Runtime::RemoteDispatcher] the booted
|
|
17
|
-
# dispatcher each aggregate door closes over
|
|
18
|
-
# @param bluebook [Bluebook::Chapter] the chapter to project into a module
|
|
19
|
-
# @return [Module] a fresh, unnamed module; `Surface.install` gives it its
|
|
20
|
-
# top-level name
|
|
21
|
-
# @raise [NameError] if an aggregate's name is not a valid constant name
|
|
22
|
-
def chapter_module(dispatcher, bluebook)
|
|
23
|
-
chapter = Module.new
|
|
24
|
-
chapter.define_singleton_method(:vision) { bluebook.vision }
|
|
25
|
-
chapter.define_singleton_method(:aggregates) { bluebook.aggregates.map(&:name).sort }
|
|
26
|
-
|
|
27
|
-
# **The chapter, explaining itself**. `Projector::DocsProjector` reads
|
|
28
|
-
# nothing but this bluebook's own IR, so the document cannot drift
|
|
29
|
-
# from the domain — the same guarantee `bin/reference` gives the DSL
|
|
30
|
-
# reference by generating it from the Syntax chapter.
|
|
31
|
-
#
|
|
32
|
-
# A method rather than only a script because that is what gets it
|
|
33
|
-
# read: `QualityControl.docs` in a console, beside `vision` and
|
|
34
|
-
# `aggregates`, at the moment somebody is wondering what a verb
|
|
35
|
-
# wants. Projected on each call rather than memoised — it is a pure
|
|
36
|
-
# read of the IR, and a stale document is the entire thing this
|
|
37
|
-
# exists to prevent.
|
|
38
|
-
chapter.define_singleton_method(:docs) do |**options|
|
|
39
|
-
Projector.call(:docs, bluebook: bluebook, options: options)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
# **The chapter, read back in english** — `Projector::NarrateProjector`
|
|
43
|
-
# beside `:docs`, for the reader who needs to confirm the domain is
|
|
44
|
-
# right rather than call it: `QualityControl.narrate` in a console.
|
|
45
|
-
chapter.define_singleton_method(:narrate) do |**options|
|
|
46
|
-
Projector.call(:narrate, bluebook: bluebook, options: options)
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
# **The domain's own IR, projected**. `Projector` has taken
|
|
50
|
-
# `call(name, bluebook:, options:)` since §30, but nothing could
|
|
51
|
-
# reach it from a booted domain — this module already closes
|
|
52
|
-
# over the one `Bluebook` every projector wants and simply
|
|
53
|
-
# never handed it out, so every bin/ projector rebuilt a
|
|
54
|
-
# Registry and reloaded the files to recover what was already
|
|
55
|
-
# sitting here.
|
|
56
|
-
#
|
|
57
|
-
# Pizzas.project(Projections::OIDC)
|
|
58
|
-
# Pizzas.project(Projections::Shape, out: "shape.json")
|
|
59
|
-
#
|
|
60
|
-
# No `to_ir` companion: `project(Projections::IR)` already
|
|
61
|
-
# answers with the canonical serialized form, and handing out
|
|
62
|
-
# the live graph as well would be a second way to say the same
|
|
63
|
-
# thing. Anything genuinely needing the graph is a projector,
|
|
64
|
-
# and a projector is given it.
|
|
65
|
-
#
|
|
66
|
-
# `out:` writes and everything else is passed through to the
|
|
67
|
-
# target — so `options` stays the projector's own vocabulary
|
|
68
|
-
# (`audience:` for OIDC) rather than a fixed set this method
|
|
69
|
-
# would have to know about.
|
|
70
|
-
chapter.define_singleton_method(:project) do |target, out: nil, **options|
|
|
71
|
-
key = Projector.key_for(target)
|
|
72
|
-
artifact = Projector.call(key, bluebook: bluebook, options: options)
|
|
73
|
-
return artifact unless out
|
|
74
|
-
|
|
75
|
-
Projector.write(artifact, out, as: Projector.emits_for(key))
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
bluebook.aggregates.each do |aggregate|
|
|
79
|
-
chapter.const_set(aggregate.hecks_name, aggregate_module(dispatcher, bluebook.name, aggregate))
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
# Inside a hecksagon, a name is a declaration, not a lookup. A
|
|
83
|
-
# `.hecksagon` may name an aggregate this door does not carry — a stale
|
|
84
|
-
# door from an earlier boot resolving another registry's chapter, which
|
|
85
|
-
# can happen because the facade is installed once a boot finishes, not
|
|
86
|
-
# on every load. With a collector open, the name becomes a `BindingProxy`
|
|
87
|
-
# recording the same bind the aggregate module would ; without one, it
|
|
88
|
-
# is a genuine NameError.
|
|
89
|
-
#
|
|
90
|
-
# The other reader of a miss is S0b's own bridge (docs/dsl-work-
|
|
91
|
-
# slices.md, const_shim.rb's `ScopedConstant`): a bluebook still being
|
|
92
|
-
# declared that names `#{bluebook.name}::Something` — an event, a
|
|
93
|
-
# command reference, an `admits:` — reaches here, not
|
|
94
|
-
# `Object.const_missing`, the moment this chapter's own facade already
|
|
95
|
-
# exists (a previous boot in the same process, or this same chapter
|
|
96
|
-
# re-entering its own name). `ConstShim.active?` is exactly as true
|
|
97
|
-
# here as it is at the top level, mid-declaration, and consulting the
|
|
98
|
-
# same resolver is what makes a scoped reference resolve identically
|
|
99
|
-
# whether or not a facade happens to be built yet — a bridge consulted
|
|
100
|
-
# only at the top level works only before any facade exists.
|
|
101
|
-
chapter.define_singleton_method(:const_missing) do |name|
|
|
102
|
-
collector = Bluebook::DSL::HecksagonBuilder.collector
|
|
103
|
-
return Bluebook::DSL::BindingProxy.new("#{bluebook.name}::#{name}", collector) if collector
|
|
104
|
-
|
|
105
|
-
resolver = Bluebook::DSL::ConstShim.resolver
|
|
106
|
-
return resolver.call("#{bluebook.name}::#{name}") if resolver
|
|
107
|
-
|
|
108
|
-
super(name)
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
chapter
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
end
|
data/lib/hecks/facade/surface.rb
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
require_relative "surface/chapter"
|
|
2
|
-
require_relative "surface/aggregate_door"
|
|
3
|
-
|
|
4
|
-
module Hecks
|
|
5
|
-
module Facade
|
|
6
|
-
# **The door, without the classes**.
|
|
7
|
-
#
|
|
8
|
-
# `Pizzas::Pizza.create_pizza!(...)` is the public surface (handover rule 3),
|
|
9
|
-
# and this is what serves it now : anonymous per-boot modules whose
|
|
10
|
-
# singleton methods close over the dispatcher and dispatch by FQN — the
|
|
11
|
-
# same shape `Router::NamespaceInstaller` proved. Nothing here is a domain
|
|
12
|
-
# class ; the IR is the only graph, and the door is a projection of it,
|
|
13
|
-
# installed by `Loader.bind_runtime` and re-installed whole on the next
|
|
14
|
-
# boot. How a chapter's module is built is surface/chapter.rb; how one
|
|
15
|
-
# aggregate's door is built is surface/aggregate_door.rb.
|
|
16
|
-
#
|
|
17
|
-
# The hexagon-binding door rides along : `Pizzas::Pizza.persisted_by("Heki")`
|
|
18
|
-
# in a `.hecksagon` file lands on the module's `method_missing`, which
|
|
19
|
-
# records an `Bind` into whatever `HecksagonBuilder.collector` is open
|
|
20
|
-
# at call time — so even a facade left over from a previous boot records
|
|
21
|
-
# into the current builder, and a chapter with no constant at all falls
|
|
22
|
-
# through to `ConstShim` → `BindingProxy`, which mints byte-identical binds.
|
|
23
|
-
module Surface
|
|
24
|
-
# These would shadow the machinery a Handle runs on, so a field named one
|
|
25
|
-
# of them gets no reader and says so — the same warning the class door gave.
|
|
26
|
-
RESERVED = %i[id state events reload inspect to_h hash class].freeze
|
|
27
|
-
|
|
28
|
-
extend Chapter
|
|
29
|
-
extend AggregateDoor
|
|
30
|
-
|
|
31
|
-
module_function
|
|
32
|
-
|
|
33
|
-
# Installs one top-level module per booted chapter, and one per aggregate, each
|
|
34
|
-
# closing over `dispatcher`, so `Pizzas::Pizza` and the bare `Pizza` both open the
|
|
35
|
-
# door of the boot that ran last.
|
|
36
|
-
#
|
|
37
|
-
# An aggregate sharing its chapter's name gets no second constant: the chapter
|
|
38
|
-
# module already holds that name. A name that user code or the stdlib already owns
|
|
39
|
-
# is left alone with a warning (see `Namespace.install`).
|
|
40
|
-
#
|
|
41
|
-
# @param dispatcher [Runtime::Dispatcher, Runtime::RemoteDispatcher] the booted
|
|
42
|
-
# dispatcher every installed door dispatches and queries through
|
|
43
|
-
# @return [Runtime::Dispatcher, Runtime::RemoteDispatcher] the same `dispatcher`,
|
|
44
|
-
# so a boot can return the call's result
|
|
45
|
-
# @raise [NameError] if a chapter or aggregate name is not a valid constant name
|
|
46
|
-
def install(dispatcher)
|
|
47
|
-
dispatcher.registry.bluebooks.each_value do |bluebook|
|
|
48
|
-
chapter = chapter_module(dispatcher, bluebook)
|
|
49
|
-
Namespace.install(Object, bluebook.name, chapter)
|
|
50
|
-
|
|
51
|
-
bluebook.aggregates.each do |aggregate|
|
|
52
|
-
next if aggregate.hecks_name == bluebook.name
|
|
53
|
-
|
|
54
|
-
Namespace.install(Object, aggregate.hecks_name, chapter.const_get(aggregate.hecks_name, false))
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
dispatcher
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
data/lib/hecks/mcp_door_scope.rb
DELETED
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
require_relative "runtime/errors"
|
|
2
|
-
|
|
3
|
-
module Hecks
|
|
4
|
-
# What one spawned `bin/hecks_mcp_door` may do: every tool against any domain under
|
|
5
|
-
# `Storehouse::BOOT_ROOT` (the default), or, in reader mode, only the reader tools
|
|
6
|
-
# against the domains its spawner named. ADR 0072, decision 2.
|
|
7
|
-
#
|
|
8
|
-
# ## Reach, not identity
|
|
9
|
-
#
|
|
10
|
-
# This is a capability allowlist, not authentication. It identifies no one and adds no
|
|
11
|
-
# secret: whoever can spawn the door chooses its mode, and whoever can write to its stdin
|
|
12
|
-
# gets whatever that mode allows. What it buys is a smaller surface per agent. A reader
|
|
13
|
-
# door cannot dispatch, cannot run `.behaviors` files, and cannot `Kernel.load` Ruby from
|
|
14
|
-
# a domain its spawner did not name.
|
|
15
|
-
#
|
|
16
|
-
# ## Why `HECKS_DOOR_*` and not `HECKS_MCP_*`
|
|
17
|
-
#
|
|
18
|
-
# `McpStdioGuard` refuses every `HECKS_MCP_*` variable except
|
|
19
|
-
# `HECKS_MCP_TRANSPORT=stdio`, and every argument except `--stdio`, so that no option can
|
|
20
|
-
# ask a server for another transport. Those refusals belong to ADR 0062. The settings
|
|
21
|
-
# here live under their own prefix so the guard stays exactly as that ADR describes it,
|
|
22
|
-
# and an unknown `HECKS_DOOR_*` name is refused here, the same fail-closed way.
|
|
23
|
-
#
|
|
24
|
-
# ## The settings
|
|
25
|
-
#
|
|
26
|
-
# - `HECKS_DOOR_TOOLS=readers` turns reader mode on. Unset means every tool, as before.
|
|
27
|
-
# Any other value refuses to start.
|
|
28
|
-
# - `HECKS_DOOR_DOMAINS` lists the domains a reader door may name, separated by
|
|
29
|
-
# `File::PATH_SEPARATOR` (`:` on Unix), each resolved against `Storehouse::BOOT_ROOT`.
|
|
30
|
-
# Required in reader mode and refused without it.
|
|
31
|
-
#
|
|
32
|
-
# ## The allowed set is named, not loaded
|
|
33
|
-
#
|
|
34
|
-
# The door boots a domain afresh on every call and keeps nothing loaded between calls,
|
|
35
|
-
# so there is no set of already-loaded domains to check against. The allowed set is the
|
|
36
|
-
# list the spawner named, resolved to absolute paths at startup. A call's `domain:` is
|
|
37
|
-
# resolved the same way and compared before anything boots, so a path outside the set
|
|
38
|
-
# never reaches `Kernel.load`. The comparison is on resolved path text: a symlink under a
|
|
39
|
-
# named path is followed when that domain boots, as it is for every domain today.
|
|
40
|
-
class McpDoorScope
|
|
41
|
-
ENV_PREFIX = "HECKS_DOOR_".freeze
|
|
42
|
-
TOOLS_VARIABLE = "HECKS_DOOR_TOOLS".freeze
|
|
43
|
-
DOMAINS_VARIABLE = "HECKS_DOOR_DOMAINS".freeze
|
|
44
|
-
READERS = "readers".freeze
|
|
45
|
-
EXIT_STATUS = 2
|
|
46
|
-
|
|
47
|
-
# The tools a reader door serves. Each reads a domain or the door's own audit log and
|
|
48
|
-
# writes no domain state. `query` and `state` still append their call to that audit
|
|
49
|
-
# log. `validate` boots the domain it is given, so it is held to the allowed set like
|
|
50
|
-
# every other domain-scoped tool. `domains` lists directories and loads nothing.
|
|
51
|
-
READER_TOOLS = %w[query events state catalog describe validate domains history follow].freeze
|
|
52
|
-
|
|
53
|
-
# Reads the door's mode from its environment.
|
|
54
|
-
#
|
|
55
|
-
# @param env [Hash{String => String}] the process environment
|
|
56
|
-
# @return [McpDoorScope] an unrestricted scope when no `HECKS_DOOR_*` variable is set;
|
|
57
|
-
# otherwise a reader scope over the named domains
|
|
58
|
-
# @raise [ArgumentError] with every problem found, one per line, when the settings are
|
|
59
|
-
# not a mode this door knows
|
|
60
|
-
# @raise [Runtime::TypeMismatch] if a named domain resolves outside
|
|
61
|
-
# `Storehouse::BOOT_ROOT`
|
|
62
|
-
def self.from_env(env = ENV)
|
|
63
|
-
problems = setting_problems(env)
|
|
64
|
-
raise ArgumentError, problems.join("\n") unless problems.empty?
|
|
65
|
-
return new(allowed_domains: nil) unless env[TOOLS_VARIABLE]
|
|
66
|
-
|
|
67
|
-
new(allowed_domains: env[DOMAINS_VARIABLE].split(File::PATH_SEPARATOR).reject(&:empty?))
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
# Reads the door's mode, or refuses to start on settings it does not know.
|
|
71
|
-
#
|
|
72
|
-
# Everything goes to `stderr`, because stdout carries the MCP protocol.
|
|
73
|
-
#
|
|
74
|
-
# @param server [String] the server's name, used as the line prefix
|
|
75
|
-
# @param env [Hash{String => String}] the process environment
|
|
76
|
-
# @param stderr [IO] where a refusal is written
|
|
77
|
-
# @return [McpDoorScope] the door's scope
|
|
78
|
-
# @raise [SystemExit] with status `EXIT_STATUS` when `from_env` refuses the settings
|
|
79
|
-
def self.start!(server:, env: ENV, stderr: $stderr)
|
|
80
|
-
from_env(env)
|
|
81
|
-
rescue ArgumentError, Runtime::TypeMismatch => e
|
|
82
|
-
e.message.each_line { |line| stderr.puts("#{server}: refusing to start: #{line.chomp}") }
|
|
83
|
-
exit(EXIT_STATUS)
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
# @api private
|
|
87
|
-
def self.setting_problems(env)
|
|
88
|
-
unknown = env.keys.select { |name| name.start_with?(ENV_PREFIX) } - [TOOLS_VARIABLE, DOMAINS_VARIABLE]
|
|
89
|
-
problems = unknown.map do |name|
|
|
90
|
-
"environment #{name} is not accepted; the door takes only #{TOOLS_VARIABLE} and #{DOMAINS_VARIABLE}"
|
|
91
|
-
end
|
|
92
|
-
problems + mode_problems(env[TOOLS_VARIABLE], env[DOMAINS_VARIABLE])
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# @api private
|
|
96
|
-
def self.mode_problems(tools, domains)
|
|
97
|
-
if tools.nil?
|
|
98
|
-
domains.nil? ? [] : ["#{DOMAINS_VARIABLE} is set without #{TOOLS_VARIABLE}=#{READERS}; it only narrows a reader door"]
|
|
99
|
-
elsif tools != READERS
|
|
100
|
-
["#{TOOLS_VARIABLE}=#{tools.inspect} is not accepted; the only value is #{READERS.inspect}"]
|
|
101
|
-
elsif domains.to_s.split(File::PATH_SEPARATOR).none? { |path| !path.empty? }
|
|
102
|
-
["#{TOOLS_VARIABLE}=#{READERS} needs #{DOMAINS_VARIABLE}, the domains this door may read"]
|
|
103
|
-
else
|
|
104
|
-
[]
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
# The named domains, resolved against `Storehouse::BOOT_ROOT`; nil when unrestricted.
|
|
109
|
-
#
|
|
110
|
-
# @return [Array<String>, nil]
|
|
111
|
-
attr_reader :allowed_domains
|
|
112
|
-
|
|
113
|
-
# @param allowed_domains [Array<String>, nil] the domains a reader door may name, as
|
|
114
|
-
# given; nil for an unrestricted door
|
|
115
|
-
# @raise [Runtime::TypeMismatch] if a named domain resolves outside `Storehouse::BOOT_ROOT`
|
|
116
|
-
def initialize(allowed_domains:)
|
|
117
|
-
@allowed_domains = allowed_domains&.map { |path| Storehouse.confine!(path, DOMAINS_VARIABLE) }.freeze
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
# Tells whether this door runs in reader mode.
|
|
121
|
-
#
|
|
122
|
-
# @return [Boolean] true when the spawner set `HECKS_DOOR_TOOLS=readers`
|
|
123
|
-
def restricted?
|
|
124
|
-
!@allowed_domains.nil?
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
# Tells whether this door serves a tool.
|
|
128
|
-
#
|
|
129
|
-
# @param name [String] the tool name from a `tools/call` request
|
|
130
|
-
# @return [Boolean] true for every name on an unrestricted door; on a reader door, true
|
|
131
|
-
# only for `READER_TOOLS`
|
|
132
|
-
def permits_tool?(name)
|
|
133
|
-
!restricted? || READER_TOOLS.include?(name)
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
# Builds the answer to a call for a tool this door does not serve.
|
|
137
|
-
#
|
|
138
|
-
# @param name [String] the tool name from a `tools/call` request
|
|
139
|
-
# @return [Hash{Symbol => Object}] `{ok: false, error:}`, the error naming the mode and
|
|
140
|
-
# the tools it serves
|
|
141
|
-
def refusal(name)
|
|
142
|
-
{ ok: false,
|
|
143
|
-
error: "#{name.inspect} is refused: this door runs in reader mode (#{TOOLS_VARIABLE}=#{READERS}), " \
|
|
144
|
-
"which serves only #{READER_TOOLS.join(', ')}" }
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
# Checks a call's `domain:` against the allowed set, before anything boots.
|
|
148
|
-
#
|
|
149
|
-
# @param domain [String, nil] the caller's `domain:` argument
|
|
150
|
-
# @return [String, nil] `domain` unchanged, so an unrestricted door boots exactly what
|
|
151
|
-
# it did before
|
|
152
|
-
# @raise [Runtime::TypeMismatch] on a reader door, if `domain` resolves outside
|
|
153
|
-
# `Storehouse::BOOT_ROOT` or to a path its spawner did not name
|
|
154
|
-
def admit_domain!(domain)
|
|
155
|
-
return domain unless restricted?
|
|
156
|
-
return domain if @allowed_domains.include?(Storehouse.confine!(domain, "domain"))
|
|
157
|
-
|
|
158
|
-
raise Runtime::TypeMismatch,
|
|
159
|
-
"domain: #{domain.inspect} is refused: this door runs in reader mode (#{TOOLS_VARIABLE}=#{READERS}) " \
|
|
160
|
-
"and reads only #{DOMAINS_VARIABLE}: #{@allowed_domains.join(', ')}"
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
# The startup warning lines that describe this door's mode.
|
|
164
|
-
#
|
|
165
|
-
# @return [Array<String>] empty when unrestricted; on a reader door, what it serves,
|
|
166
|
-
# what it refuses, the domains it reads, and that it identifies no one
|
|
167
|
-
def notes
|
|
168
|
-
return [] unless restricted?
|
|
169
|
-
|
|
170
|
-
["Reader mode (#{TOOLS_VARIABLE}=#{READERS}): serves #{READER_TOOLS.join(', ')}; " \
|
|
171
|
-
"refuses dispatch (with dry_run and steps), behaviors and every other tool.",
|
|
172
|
-
"domain: boots only #{DOMAINS_VARIABLE}: #{@allowed_domains.join(', ')}.",
|
|
173
|
-
"Reader mode limits reach and identifies no one; it is not authentication."]
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
end
|