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
data/lib/hecks/cli/document.rb
CHANGED
|
@@ -2,26 +2,10 @@ require_relative "../../hecks"
|
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
4
|
module CLI
|
|
5
|
-
# The command behind `
|
|
5
|
+
# The command behind `hecks docs` and `hecks narrate`:
|
|
6
6
|
# one domain's document, projected from its own bluebook, to stdout.
|
|
7
7
|
#
|
|
8
|
-
#
|
|
9
|
-
# answers the same chapter read back in English, for the subject-matter expert
|
|
10
|
-
# (`Projector::NarrateProjector`). Nothing is written for the caller: redirect it,
|
|
11
|
-
# so the caller decides where a generated file lands and git decides whether it
|
|
12
|
-
# drifted.
|
|
13
|
-
#
|
|
14
|
-
# ## Every failure is a sentence
|
|
15
|
-
#
|
|
16
|
-
# A misspelled aggregate refuses by name rather than printing nothing and exiting
|
|
17
|
-
# 0. A caller cannot tell an empty document from an empty domain, so this refuses
|
|
18
|
-
# instead and names what is actually there.
|
|
19
|
-
#
|
|
20
|
-
# ## Standing in a domain is enough
|
|
21
|
-
#
|
|
22
|
-
# `Adapters::Folder#domain_root` walks up for the nearest `.hecksagon`, which makes
|
|
23
|
-
# the first argument ambiguous. The rule: a directory is a domain, anything else
|
|
24
|
-
# is an aggregate name, and the two-argument form says which is which.
|
|
8
|
+
# Nothing is written for the caller: redirect it, so git decides whether it drifted.
|
|
25
9
|
module Document
|
|
26
10
|
# Build output and other trees under a root that hold no domain a caller means.
|
|
27
11
|
# Matched against the path relative to the root, because a substring test
|
|
@@ -47,7 +31,7 @@ module Hecks
|
|
|
47
31
|
refuse_without_domain(program, root) unless path
|
|
48
32
|
|
|
49
33
|
begin
|
|
50
|
-
runtime = Hecks.boot(path,
|
|
34
|
+
runtime = Hecks.boot(path, install_doors: false)
|
|
51
35
|
rescue StandardError => e
|
|
52
36
|
abort "cannot read #{path}: #{e.message.lines.first.strip}"
|
|
53
37
|
end
|
|
@@ -66,10 +50,8 @@ module Hecks
|
|
|
66
50
|
|
|
67
51
|
# Lists every directory under `root` that `Hecks.boot` would accept.
|
|
68
52
|
#
|
|
69
|
-
# Found by their wiring, not their chapters: a `.hecksagon`
|
|
70
|
-
#
|
|
71
|
-
# `.bluebook` files (era translations, the language's own grammar,
|
|
72
|
-
# `spec/fixtures`) are not domains anybody boots.
|
|
53
|
+
# Found by their wiring, not their chapters: a `.hecksagon` says this is a
|
|
54
|
+
# domain, while most `.bluebook` files (era translations, grammar, fixtures) are not.
|
|
73
55
|
#
|
|
74
56
|
# @param root [String] the directory to search under
|
|
75
57
|
# @return [Array<String>] domain directory paths relative to `root`,
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../projection_files"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module CLI
|
|
7
|
+
# The command behind `hecks project_expression_tables`: projects the expression machinery's
|
|
8
|
+
# operator and normalisation tables from the grammar chapter into
|
|
9
|
+
# `lib/hecks/bluebook/expression/projection.json`.
|
|
10
|
+
#
|
|
11
|
+
# It never redirects with `>`: the shell would truncate the file the framework requires at
|
|
12
|
+
# boot. The default mode replaces the file atomically, and it refuses a projection that drops
|
|
13
|
+
# a self-bearing operator (one the chapter's own `status != "retired"` givens evaluate
|
|
14
|
+
# through), since that would wedge every later boot. Recover a broken file with
|
|
15
|
+
# `git checkout -- lib/hecks/bluebook/expression/projection.json`.
|
|
16
|
+
module ExpressionProjection
|
|
17
|
+
module_function
|
|
18
|
+
|
|
19
|
+
# Rewrites the projection file, or with `--stdout` prints it instead.
|
|
20
|
+
#
|
|
21
|
+
# @param argv [Array<String>] `--stdout` for the diff mode
|
|
22
|
+
# @param out [IO] where the result goes
|
|
23
|
+
# @return [Integer] the exit status, 0 once written or printed
|
|
24
|
+
# @raise [SystemExit] with the refusal when the projection drops a self-bearing operator
|
|
25
|
+
def call(argv, out: $stdout)
|
|
26
|
+
result = begin
|
|
27
|
+
Hecks::ProjectionFiles.build(:expression_tables)
|
|
28
|
+
rescue Hecks::ProjectionFiles::Refused => e
|
|
29
|
+
abort e.message
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
if argv.include?("--stdout")
|
|
33
|
+
out.print result.content.values.first
|
|
34
|
+
else
|
|
35
|
+
out.puts Hecks::ProjectionFiles.write(:expression_tables)
|
|
36
|
+
end
|
|
37
|
+
0
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
require "optparse"
|
|
5
|
+
require_relative "../../hecks"
|
|
6
|
+
|
|
7
|
+
module Hecks
|
|
8
|
+
module CLI
|
|
9
|
+
# The command behind `hecks follow`: live-tails a domain's persisted event log as JSON lines.
|
|
10
|
+
#
|
|
11
|
+
# Events are one table per domain, so this polls the first repository that answers `:events`
|
|
12
|
+
# and diffs its size each tick, filtering client-side when `--aggregate` is given.
|
|
13
|
+
module Follow
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
# Tails until interrupted.
|
|
17
|
+
#
|
|
18
|
+
# @param argv [Array<String>] `<domain> [--aggregate name] [--interval seconds] [--from-now]`
|
|
19
|
+
# @param program [String] the name the usage message calls this command by
|
|
20
|
+
# @return [void]
|
|
21
|
+
# @raise [SystemExit] when no domain is named or no adapter persists an event log
|
|
22
|
+
def call(argv, program: "hecks follow")
|
|
23
|
+
argv = argv.dup
|
|
24
|
+
domain_name = argv.shift or abort "usage: #{program} <domain> [options]"
|
|
25
|
+
options = parse(argv, program)
|
|
26
|
+
repository = event_repository(Hecks.boot(domain_name), domain_name, program)
|
|
27
|
+
tail(repository, options)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @param argv [Array<String>] the options after the domain; consumed in place
|
|
31
|
+
# @param program [String] the name the usage banner calls this command by
|
|
32
|
+
# @return [Hash] `:interval`, `:from_now` and, when given, `:aggregate`
|
|
33
|
+
def parse(argv, program)
|
|
34
|
+
options = { interval: 0.5, from_now: false }
|
|
35
|
+
OptionParser.new do |parser|
|
|
36
|
+
parser.banner = "usage: #{program} <domain> [options]"
|
|
37
|
+
parser.on("-a", "--aggregate=NAME", "Only follow events for this aggregate (e.g. Order)") do |name|
|
|
38
|
+
options[:aggregate] = name
|
|
39
|
+
end
|
|
40
|
+
parser.on("-i", "--interval=SECONDS", Float, "Poll interval in seconds (default: 0.5)") { |v| options[:interval] = v }
|
|
41
|
+
parser.on("--from-now", "Skip existing events; only print ones emitted from now on") { options[:from_now] = true }
|
|
42
|
+
end.parse!(argv)
|
|
43
|
+
options
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @param runtime [Runtime] a booted domain
|
|
47
|
+
# @param domain_name [String] its name, for the refusal
|
|
48
|
+
# @param program [String] the name the refusal calls this command by
|
|
49
|
+
# @return [Object] the first repository that answers `:events`
|
|
50
|
+
# @raise [SystemExit] when none does
|
|
51
|
+
def event_repository(runtime, domain_name, program)
|
|
52
|
+
repositories = runtime.registry.bluebooks.flat_map do |bluebook_domain, bluebook|
|
|
53
|
+
bluebook.aggregates.map { |aggregate| runtime.registry.repository(bluebook_domain, aggregate) }
|
|
54
|
+
end
|
|
55
|
+
repositories.find { |repo| repo.respond_to?(:events) } or
|
|
56
|
+
abort "#{program}: no adapter in #{domain_name} persists an event log"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Says whether `event` passes the `--aggregate` filter: a bare name matched
|
|
60
|
+
# case-insensitively, or the exact name.
|
|
61
|
+
#
|
|
62
|
+
# @param event [Object] a logged event
|
|
63
|
+
# @param filter [String, nil] the aggregate name asked for
|
|
64
|
+
# @return [Boolean]
|
|
65
|
+
def matches?(event, filter)
|
|
66
|
+
filter.nil? || event.aggregate.to_s.split("::").last.casecmp?(filter) || event.aggregate == filter
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# @param repository [Object] answers `events`
|
|
70
|
+
# @param options [Hash] the parsed options
|
|
71
|
+
# @return [void]
|
|
72
|
+
def tail(repository, options)
|
|
73
|
+
seen = options[:from_now] ? repository.events.size : 0
|
|
74
|
+
$stdout.sync = true
|
|
75
|
+
trap("INT") { exit }
|
|
76
|
+
|
|
77
|
+
loop do
|
|
78
|
+
events = repository.events
|
|
79
|
+
if events.size > seen
|
|
80
|
+
events[seen..].each { |event| puts JSON.generate(event.to_h) if matches?(event, options[:aggregate]) }
|
|
81
|
+
seen = events.size
|
|
82
|
+
end
|
|
83
|
+
sleep options[:interval]
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
require_relative "../../hecks"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module CLI
|
|
8
|
+
# The command behind `hecks history` and `hecks history`: every journal entry a domain's
|
|
9
|
+
# append-only adapters hold, as JSON, the full write history rather than the current head.
|
|
10
|
+
module History
|
|
11
|
+
module_function
|
|
12
|
+
|
|
13
|
+
# Boots the domain `argv` names and prints its history as one JSON document.
|
|
14
|
+
#
|
|
15
|
+
# @param argv [Array<String>] the domain directory, first
|
|
16
|
+
# @param program [String] the name the usage message calls this command by
|
|
17
|
+
# @return [void]
|
|
18
|
+
# @raise [SystemExit] when `argv` is empty
|
|
19
|
+
def call(argv, program: "hecks history")
|
|
20
|
+
domain = argv.first or abort "usage: #{program} <domain>"
|
|
21
|
+
puts JSON.generate(document(Hecks.boot(domain).registry))
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @param registry [Runtime::Registry] a booted domain's registry
|
|
25
|
+
# @return [Hash{String => Array<Hash>}] each aggregate's storage name mapped to its entries
|
|
26
|
+
def document(registry)
|
|
27
|
+
registry.bluebooks.each_with_object({}) do |(name, bluebook), all|
|
|
28
|
+
bluebook.aggregates.each do |aggregate|
|
|
29
|
+
all[aggregate.storage_name] = entries(registry.repository(name, aggregate))
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# @param repository [Object] an aggregate's repository
|
|
35
|
+
# @return [Array<Hash{String => Object}>] its journal entries; empty
|
|
36
|
+
# when it is not append-only
|
|
37
|
+
def entries(repository)
|
|
38
|
+
return [] unless repository.is_a?(Ports::Persistence::AppendOnly)
|
|
39
|
+
|
|
40
|
+
repository.entries.map { |entry| { "operation" => entry.operation, "id" => entry.id, "state" => entry.state } }
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
data/lib/hecks/cli/ir.rb
CHANGED
|
@@ -5,18 +5,16 @@ require_relative "../ports/persistence/plugins/era"
|
|
|
5
5
|
|
|
6
6
|
module Hecks
|
|
7
7
|
module CLI
|
|
8
|
-
# The command behind `
|
|
9
|
-
# same `to_h` the golden specs pin and `StorageShape` hashes into an era
|
|
10
|
-
# reading rather than asserting on.
|
|
8
|
+
# The command behind `hecks ir`: a booted domain's IR as JSON, the
|
|
9
|
+
# same `to_h` the golden specs pin and `StorageShape` hashes into an era.
|
|
11
10
|
module Ir
|
|
12
11
|
module_function
|
|
13
12
|
|
|
14
13
|
# Prints the IR `argv` asks for.
|
|
15
14
|
#
|
|
16
|
-
# `--meta` prints the language's own IR,
|
|
17
|
-
# `lib/hecks/language/bluebook/` merged into one. It is reached through
|
|
15
|
+
# `--meta` prints the language's own IR, reached through
|
|
18
16
|
# `Bluebook::MetaValidator.grammar_registry`, the real boot sequence, so it
|
|
19
|
-
#
|
|
17
|
+
# can't drift from what `MetaValidator` loads.
|
|
20
18
|
#
|
|
21
19
|
# @param argv [Array<String>] a domain path and `--translations`, or `--meta`
|
|
22
20
|
# @param program [String] the name the usage message calls this command by
|
data/lib/hecks/cli/mcp.rb
CHANGED
|
@@ -2,12 +2,11 @@ require_relative "../mcp_stdio_guard"
|
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
4
|
module CLI
|
|
5
|
-
# The command behind `
|
|
5
|
+
# The command behind `hecks mcp`: the MCP door onto the
|
|
6
6
|
# storehouse bus, over stdio only.
|
|
7
7
|
#
|
|
8
|
-
# This file loads nothing but `McpStdioGuard`, so the transport check runs
|
|
9
|
-
# the framework does.
|
|
10
|
-
# passes.
|
|
8
|
+
# This file loads nothing but `McpStdioGuard`, so the transport check runs
|
|
9
|
+
# before the framework does.
|
|
11
10
|
module Mcp
|
|
12
11
|
# The server name the guard's refusals and warnings carry.
|
|
13
12
|
SERVER = "hecks-mcp-door".freeze
|
|
@@ -24,8 +23,8 @@ module Hecks
|
|
|
24
23
|
# set up for stdio
|
|
25
24
|
def call(argv)
|
|
26
25
|
McpStdioGuard.enforce_stdio!(server: SERVER, argv: argv)
|
|
27
|
-
require_relative "mcp_door"
|
|
28
|
-
McpDoor.serve
|
|
26
|
+
require_relative "../doors/mcp_door"
|
|
27
|
+
Doors::McpDoor.serve
|
|
29
28
|
end
|
|
30
29
|
end
|
|
31
30
|
end
|
|
@@ -3,28 +3,15 @@ require_relative "../bluebook/model_check"
|
|
|
3
3
|
|
|
4
4
|
module Hecks
|
|
5
5
|
module CLI
|
|
6
|
-
# The command behind `
|
|
6
|
+
# The command behind `hecks model_check`: static analysis
|
|
7
7
|
# over the IR, printed per domain, exiting non-zero when any error-severity
|
|
8
|
-
# finding is left
|
|
8
|
+
# finding is left — unreachable lifecycle states, dead transitions, unreached
|
|
9
|
+
# saga states, dispatches to a nonexistent command, handlers for an event
|
|
10
|
+
# nothing emits. The runtime checks none of these; a dead transition never
|
|
11
|
+
# fires, in silence.
|
|
9
12
|
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
# unreachable, dispatches to a command that does not exist, and handlers
|
|
13
|
-
# listening for an event nothing emits. The runtime checks none of these: a dead
|
|
14
|
-
# transition never fires, in silence.
|
|
15
|
-
#
|
|
16
|
-
# ## Named domains, or the whole corpus
|
|
17
|
-
#
|
|
18
|
-
# Given domain paths, it boots each and runs one cross-domain check across all
|
|
19
|
-
# of them. Given none, it sweeps the repository's corpus (`Corpus.model_check_members`)
|
|
20
|
-
# and the language's own chapters; that needs `root:`, the repository, so an
|
|
21
|
-
# installed gem without one asks for a domain path instead.
|
|
22
|
-
#
|
|
23
|
-
# ## Options
|
|
24
|
-
#
|
|
25
|
-
# `--strict` makes a `rust_reserved_name` finding an error for every target, not
|
|
26
|
-
# only for those with a Cargo feature under `root`'s `rust/Cargo.toml`.
|
|
27
|
-
# `--profile client` adds `Bluebook::ModelCheck::ClientProfile`'s error findings.
|
|
13
|
+
# Given domain paths it checks just those, cross-domain; given none it sweeps
|
|
14
|
+
# the repository's corpus and the language's own chapters, which needs `root:`.
|
|
28
15
|
module ModelCheck
|
|
29
16
|
# The directory the framework's own `.port` and `.adapter` files live under.
|
|
30
17
|
HECKS_DIR = File.expand_path("..", __dir__)
|
|
@@ -37,7 +24,8 @@ module Hecks
|
|
|
37
24
|
|
|
38
25
|
# Runs the model check `argv` describes and exits with its verdict.
|
|
39
26
|
#
|
|
40
|
-
# @param argv [Array<String>] `--strict`, `--profile NAME` and domain paths
|
|
27
|
+
# @param argv [Array<String>] `--strict`, `--profile NAME`, `--wait` and domain paths;
|
|
28
|
+
# `--wait` is accepted for the launcher's sake, as the verdict is always the exit status
|
|
41
29
|
# @param program [String] the name the usage message calls this command by
|
|
42
30
|
# @param root [String, nil] the repository root, for the corpus sweep and the
|
|
43
31
|
# Rust-target check; nil when there is no checkout
|
|
@@ -47,6 +35,7 @@ module Hecks
|
|
|
47
35
|
def call(argv, program:, root: nil)
|
|
48
36
|
argv = argv.dup
|
|
49
37
|
strict = !argv.delete("--strict").nil?
|
|
38
|
+
argv.delete("--wait")
|
|
50
39
|
profile = take_profile(argv)
|
|
51
40
|
unless profile.nil? || Bluebook::ModelCheck::PROFILES.include?(profile)
|
|
52
41
|
warn "unknown profile #{profile.inspect} (known: #{Bluebook::ModelCheck::PROFILES.join(', ')})"
|
|
@@ -64,10 +53,6 @@ module Hecks
|
|
|
64
53
|
exit(ok ? 0 : 1)
|
|
65
54
|
end
|
|
66
55
|
|
|
67
|
-
# Reads `--profile client` or `--profile=client` and removes it from `argv`.
|
|
68
|
-
#
|
|
69
|
-
# @param argv [Array<String>] the arguments, changed in place
|
|
70
|
-
# @return [Symbol, nil] the requested profile, or nil when none was asked for
|
|
71
56
|
def take_profile(argv)
|
|
72
57
|
inline = argv.find { |arg| arg.start_with?("--profile=") }
|
|
73
58
|
index = argv.index("--profile")
|
|
@@ -79,13 +64,8 @@ module Hecks
|
|
|
79
64
|
name.to_sym
|
|
80
65
|
end
|
|
81
66
|
|
|
82
|
-
#
|
|
83
|
-
#
|
|
84
|
-
# is checked.
|
|
85
|
-
#
|
|
86
|
-
# @param domain_args [Array<String>] domain directory paths
|
|
87
|
-
# @param options [Options] the run's configuration
|
|
88
|
-
# @return [Boolean] true when every domain passes
|
|
67
|
+
# Examines every named domain against one shared set of known domains and
|
|
68
|
+
# emitted events, so a cross-domain reaction between two of them is checked.
|
|
89
69
|
def check_domains(domain_args, options)
|
|
90
70
|
booted = domain_args.map do |domain_arg|
|
|
91
71
|
[File.basename(domain_arg.chomp("/")), boot(bluebook_dir(domain_arg.chomp("/")) || domain_arg)]
|
|
@@ -93,15 +73,8 @@ module Hecks
|
|
|
93
73
|
examine_all(booted, options)
|
|
94
74
|
end
|
|
95
75
|
|
|
96
|
-
# Boots every corpus member once, then examines each against the set of names
|
|
97
|
-
# every member declares, then examines the language itself.
|
|
98
|
-
#
|
|
99
76
|
# Two passes over the same boots, because a single boot's own registry cannot
|
|
100
77
|
# answer whether a target domain exists anywhere in the corpus.
|
|
101
|
-
#
|
|
102
|
-
# @param root [String] the repository root
|
|
103
|
-
# @param options [Options] the run's configuration
|
|
104
|
-
# @return [Boolean] true when every member and the language pass
|
|
105
78
|
def check_corpus(root, options)
|
|
106
79
|
require_relative "../corpus"
|
|
107
80
|
targets = Corpus.model_check_members(root: root).map { |member| [member.stem, Corpus.source_of(member)] }
|
|
@@ -110,17 +83,8 @@ module Hecks
|
|
|
110
83
|
examine_language(options) && ok
|
|
111
84
|
end
|
|
112
85
|
|
|
113
|
-
#
|
|
114
|
-
#
|
|
115
|
-
#
|
|
116
|
-
# `root:` is the source's parent: a directory source is already the domain's
|
|
117
|
-
# own `bluebook/` folder, and without a root a member declaring
|
|
118
|
-
# `uses_embryonaut_bluebook` refuses with "needs a registry with a root to
|
|
119
|
-
# vendor from".
|
|
120
|
-
#
|
|
121
|
-
# @param source [String] a directory to boot (every bluebook within), or a
|
|
122
|
-
# single `.bluebook` file path
|
|
123
|
-
# @return [Runtime::Registry] the registry populated with the booted bluebooks
|
|
86
|
+
# `root:` is the source's parent, so a member declaring
|
|
87
|
+
# `uses_embryonaut_bluebook` can vendor from it.
|
|
124
88
|
def boot(source)
|
|
125
89
|
root = File.directory?(source) ? File.dirname(source) : nil
|
|
126
90
|
registry = Runtime::Registry.new(root: root)
|
|
@@ -142,14 +106,13 @@ module Hecks
|
|
|
142
106
|
end
|
|
143
107
|
|
|
144
108
|
# A port attaches to its aggregate from the hecksagon, not the bluebook, so a
|
|
145
|
-
# deaf-policy check that
|
|
146
|
-
#
|
|
147
|
-
#
|
|
148
|
-
# resolve here.
|
|
109
|
+
# deaf-policy check that skipped it would miss a policy reacting to an event
|
|
110
|
+
# nothing emits. Recording a bind builds IR only; no adapter resolves here. A chapter
|
|
111
|
+
# that ships its ports beside its bluebook (`<name>.ports.hecksagon`) is read with them.
|
|
149
112
|
hecksagons = if File.directory?(source)
|
|
150
113
|
Dir.glob(File.join(source, "*.hecksagon"))
|
|
151
114
|
else
|
|
152
|
-
[source.sub(/\.bluebook\z/,
|
|
115
|
+
[".hecksagon", ".ports.hecksagon"].map { |suffix| source.sub(/\.bluebook\z/, suffix) }
|
|
153
116
|
end
|
|
154
117
|
hecksagons.each { |hecksagon| Kernel.load(hecksagon) if File.exist?(hecksagon) }
|
|
155
118
|
end
|
|
@@ -167,17 +130,6 @@ module Hecks
|
|
|
167
130
|
end
|
|
168
131
|
end
|
|
169
132
|
|
|
170
|
-
# Runs `Bluebook::ModelCheck` over one booted domain's chapters, prints its
|
|
171
|
-
# findings against the allowlist, and reports whether it passes.
|
|
172
|
-
#
|
|
173
|
-
# @param name [String] the domain's display name, for the header and the
|
|
174
|
-
# `ALLOWED_FINDINGS` lookup
|
|
175
|
-
# @param registry [Runtime::Registry] a booted registry holding the domain's chapters
|
|
176
|
-
# @param options [Options] the run's configuration
|
|
177
|
-
# @param known_domains [Set<String>] every bluebook and hecksagon name booted this run
|
|
178
|
-
# @param global_emitted_events [Set<String>] every event any booted chapter emits
|
|
179
|
-
# @return [Boolean] false if an allowlist entry is stale; otherwise true when no
|
|
180
|
-
# error-severity finding is left
|
|
181
133
|
def domain_passes?(name, registry, options, known_domains:, global_emitted_events:)
|
|
182
134
|
puts "── #{name}"
|
|
183
135
|
|
|
@@ -203,12 +155,9 @@ module Hecks
|
|
|
203
155
|
passes?(findings, " clean — #{chapters.size} chapter(s), no dead states, no unreachable protocol steps")
|
|
204
156
|
end
|
|
205
157
|
|
|
206
|
-
#
|
|
207
|
-
#
|
|
208
|
-
#
|
|
209
|
-
#
|
|
210
|
-
# @param options [Options] the run's configuration
|
|
211
|
-
# @return [Boolean] true when neither chapter has an error-severity finding
|
|
158
|
+
# Checked through `MetaValidator.grammar_registry`, the judged graph its
|
|
159
|
+
# conformance specs use, because any one grammar file booted alone is a
|
|
160
|
+
# fraction of the language.
|
|
212
161
|
def examine_language(options)
|
|
213
162
|
ok = true
|
|
214
163
|
["Bluebook", "World"].each do |name|
|
|
@@ -235,16 +184,8 @@ module Hecks
|
|
|
235
184
|
errors.empty?
|
|
236
185
|
end
|
|
237
186
|
|
|
238
|
-
#
|
|
239
|
-
# `
|
|
240
|
-
#
|
|
241
|
-
# The check reads `rust/Cargo.toml` through the repository-only fuzzing
|
|
242
|
-
# tooling, so it is loaded only when there is a `rust/` to read.
|
|
243
|
-
#
|
|
244
|
-
# @param name [String] the domain's display name
|
|
245
|
-
# @param rust_dir [String, nil] the repository's `rust/` directory; nil without a
|
|
246
|
-
# checkout
|
|
247
|
-
# @return [Boolean] true when `rust_dir` declares a feature named after the domain
|
|
187
|
+
# The repository-only fuzzing tooling is loaded lazily, only when there is a
|
|
188
|
+
# `rust/` to read.
|
|
248
189
|
def rust_target?(name, rust_dir)
|
|
249
190
|
return false unless rust_dir
|
|
250
191
|
|
|
@@ -252,12 +193,7 @@ module Hecks
|
|
|
252
193
|
Fuzzing::TargetCapabilities.rust_feature?(name, rust_dir)
|
|
253
194
|
end
|
|
254
195
|
|
|
255
|
-
# The
|
|
256
|
-
# domain directory itself, the same rule `Corpus.bluebook_dir` applies.
|
|
257
|
-
#
|
|
258
|
-
# @param domain_path [String] a domain directory path
|
|
259
|
-
# @return [String, nil] the directory of the first `.bluebook` found, or nil when
|
|
260
|
-
# neither place holds one
|
|
196
|
+
# The same rule `Corpus.bluebook_dir` applies.
|
|
261
197
|
def bluebook_dir(domain_path)
|
|
262
198
|
[File.join(domain_path, "bluebook"), domain_path].each do |dir|
|
|
263
199
|
files = Dir[File.join(dir, "*.bluebook")]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module CLI
|
|
7
|
+
# The command behind `hecks record_pattern_cases`: records the expected match results for
|
|
8
|
+
# `pattern:` cases, which `spec/pattern_subset_spec.rb` reads from
|
|
9
|
+
# `spec/corpus/fixtures/patterns.json`.
|
|
10
|
+
#
|
|
11
|
+
# The inputs cover embedded and trailing newlines and non-ASCII digits and word characters.
|
|
12
|
+
module PatternCases
|
|
13
|
+
# Each pattern with the inputs it is matched against.
|
|
14
|
+
CASES = [
|
|
15
|
+
["^[A-Z]{3}-[0-9]{4}$", ["ABC-1234", "abc-1234", "xx\nABC-1234\nyy", "ABC-1234\n", "ABC-١٢٣٤"]],
|
|
16
|
+
["^[0-9]{5}(-[0-9]{4})?$", ["12345", "12345-6789", "1234", "12345\nx", "١٢٣٤٥"]],
|
|
17
|
+
['^[^@ ]+@[^@ ]+\.[^@ ]+$', ["a@b.co", "a b@c.co", "no-at-sign", "a@b.co\nevil", "\na@b.co", "café@x.co"]],
|
|
18
|
+
["^(red|green|blue)$", ["red", "purple", "red\ngreen", "RED", "x\nred"]],
|
|
19
|
+
["^[A-Za-z0-9_]+$", ["abc_1", "a b", "café", "abc\ndef"]],
|
|
20
|
+
['^[ \t]*$', ["", " ", " ", "a", "\n", "\t"]],
|
|
21
|
+
["^[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}$", ["12345678-1234-1234-1234-123456789abc", "nope"]],
|
|
22
|
+
['^\+?[0-9 ()-]{7,20}$', ["+44 20 1234", "abc", "+44 20 1234\nx"]],
|
|
23
|
+
['\Aonly\z', ["only", "only\n", "x\nonly"]],
|
|
24
|
+
["^a.c$", ["abc", "a\nc", "a\tc", "aéc"]]
|
|
25
|
+
].freeze
|
|
26
|
+
|
|
27
|
+
module_function
|
|
28
|
+
|
|
29
|
+
# @return [Array<Hash{String => Object}>] one row per pattern and input, with its match result
|
|
30
|
+
def rows
|
|
31
|
+
CASES.flat_map do |pattern, inputs|
|
|
32
|
+
regexp = Regexp.new(pattern)
|
|
33
|
+
inputs.map { |input| { "pattern" => pattern, "input" => input, "matches" => regexp.match?(input) } }
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Prints the rows as pretty JSON.
|
|
38
|
+
#
|
|
39
|
+
# @param out [IO] where the JSON goes
|
|
40
|
+
# @return [Integer] the exit status, always 0
|
|
41
|
+
def call(out: $stdout)
|
|
42
|
+
out.puts JSON.pretty_generate(rows)
|
|
43
|
+
0
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../forms"
|
|
4
|
+
require_relative "../forms/banking_presentation"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module CLI
|
|
8
|
+
# The command behind `hecks present` and `hecks present`: serves the banking example's rendered
|
|
9
|
+
# forms and views, backed by the in-memory adapter
|
|
10
|
+
# (docs/command-form-and-query-form-bluebook.md).
|
|
11
|
+
#
|
|
12
|
+
# Then, for example, `http://localhost:4567/` lists every exposed chapter,
|
|
13
|
+
# `/Banking/Customer.html` every Customer plus Register, `/Banking/Account/Overdrawn.html` a
|
|
14
|
+
# query view, and `/Banking/Account/Debit` answers the command's shape as JSON.
|
|
15
|
+
module Present
|
|
16
|
+
ROOT = File.expand_path("../../..", __dir__)
|
|
17
|
+
|
|
18
|
+
module_function
|
|
19
|
+
|
|
20
|
+
# Starts a development server and blocks until it stops.
|
|
21
|
+
#
|
|
22
|
+
# @param argv [Array<String>] `[-p port]`
|
|
23
|
+
# @param program [String] the name the refusal calls this command by
|
|
24
|
+
# @param root [String] the checkout whose examples are served
|
|
25
|
+
# @return [void]
|
|
26
|
+
# @raise [SystemExit] when the port argument is refused
|
|
27
|
+
def call(argv, program: "hecks present", root: ROOT)
|
|
28
|
+
require "rackup"
|
|
29
|
+
port, error = Hecks::Forms::PortArgument.parse(argv)
|
|
30
|
+
abort "#{program}: #{error}" if error
|
|
31
|
+
|
|
32
|
+
app = Hecks::Forms::BankingPresentation.app(root: root)
|
|
33
|
+
puts "command_form.bluebook/query_form.bluebook — Banking, in memory — http://localhost:#{port}/"
|
|
34
|
+
puts "development server: no authentication, no CSRF protection, no caller identity — do not expose beyond localhost"
|
|
35
|
+
Rackup::Server.start(app: app, Port: port, server: "webrick")
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|