hecks 2.9.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 +51 -6
- data/lib/hecks/adapters/driven/heki/journal.rb +1 -1
- data/lib/hecks/adapters/driven/lambda/client.rb +1 -1
- data/lib/hecks/adapters/driven/lambda.rb +1 -1
- data/lib/hecks/adapters/driven/memory.rb +16 -3
- data/lib/hecks/adapters/driven/postgres/reconnect.rb +6 -2
- data/lib/hecks/adapters/driven/postgres/shared_connection.rb +180 -0
- data/lib/hecks/adapters/driven/postgres.rb +4 -2
- data/lib/hecks/adapters/driven/prism.rb +41 -8
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +73 -16
- data/lib/hecks/behaviors/expectations.rb +1 -1
- data/lib/hecks/behaviors.rb +1 -1
- 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/assembly/contracts.rb +2 -0
- data/lib/hecks/bluebook/attribute.rb +1 -1
- data/lib/hecks/bluebook/behaviour/aggregate.rb +30 -1
- data/lib/hecks/bluebook/behaviour/domain_port.rb +7 -0
- data/lib/hecks/bluebook/chapter.rb +6 -2
- data/lib/hecks/bluebook/domain_port.rb +36 -5
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +10 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +8 -0
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +2 -1
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +31 -3
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +122 -3
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +1 -1
- data/lib/hecks/bluebook/dsl/query_builder.rb +27 -1
- data/lib/hecks/bluebook/dsl/rule_reference.rb +1 -1
- data/lib/hecks/bluebook/dsl/world_builder.rb +29 -2
- data/lib/hecks/bluebook/expression/canonical_form.rb +1 -1
- data/lib/hecks/bluebook/expression/resolver.rb +3 -2
- data/lib/hecks/bluebook/hexagon.rb +13 -5
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +1 -0
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +4 -1
- data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +246 -0
- data/lib/hecks/bluebook/meta_validator.rb +9 -4
- data/lib/hecks/bluebook/model_check.rb +23 -0
- data/lib/hecks/bluebook/pattern_subset.rb +38 -0
- data/lib/hecks/bluebook/query.rb +20 -5
- data/lib/hecks/bluebook/smoke_test.rb +1 -1
- 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 +2 -2
- 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 +1 -1
- data/lib/hecks/cli/mcp.rb +3 -3
- data/lib/hecks/cli/model_check.rb +7 -4
- data/lib/hecks/cli/pattern_cases.rb +47 -0
- data/lib/hecks/cli/present.rb +39 -0
- data/lib/hecks/cli/project_cli.rb +224 -32
- data/lib/hecks/cli/project_diagrams.rb +4 -3
- 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 +3 -3
- 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 +5 -3
- data/lib/hecks/cli/spec_example.rb +27 -0
- data/lib/hecks/cli/statements.rb +32 -0
- data/lib/hecks/cli/stores.rb +4 -5
- data/lib/hecks/cli/stress_concurrency_specs.rb +177 -0
- data/lib/hecks/cli.rb +201 -52
- data/lib/hecks/codemod.rb +324 -0
- data/lib/hecks/corpus.rb +423 -0
- data/lib/hecks/deploy/bluebook/deploy.bluebook +591 -23
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +41 -4
- 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 +1 -1
- data/lib/hecks/{facade → doors}/handle.rb +2 -2
- data/lib/hecks/{facade → doors}/json_door.rb +4 -4
- data/lib/hecks/doors/launcher_options.rb +129 -0
- data/lib/hecks/{cli → doors}/mcp_door.rb +7 -7
- data/lib/hecks/doors/mcp_door_scope.rb +97 -0
- data/lib/hecks/{facade/surface → doors/ruby_door}/aggregate_door.rb +8 -3
- data/lib/hecks/{facade/surface → doors/ruby_door}/chapter.rb +3 -3
- data/lib/hecks/{facade/surface.rb → doors/ruby_door.rb} +36 -5
- data/lib/hecks/doors.rb +61 -0
- data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +1 -1
- data/lib/hecks/embryonaut_bluebook.rb +1 -1
- data/lib/hecks/engine_agreement.rb +156 -0
- data/lib/hecks/facade.rb +24 -37
- data/lib/hecks/forms/app.rb +6 -6
- data/lib/hecks/forms/banking_presentation.rb +50 -0
- data/lib/hecks/forms/field_shape.rb +2 -1
- data/lib/hecks/forms/port_argument.rb +1 -1
- 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/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/kernel_capabilities.rb +194 -0
- data/lib/hecks/language/bluebook/bluebook.bluebook +11 -0
- data/lib/hecks/language/bluebook/query.bluebook +7 -0
- data/lib/hecks/language/bluebook/vocabulary.bluebook +4 -4
- data/lib/hecks/language/hecksagon/domain_port.bluebook +10 -0
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +20 -0
- data/lib/hecks/mcp_stdio_guard.rb +2 -2
- data/lib/hecks/persistence_legacy_fixture/regenerate.rb +161 -0
- data/lib/hecks/persistence_legacy_fixture.rb +113 -0
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +8 -5
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +4 -1
- data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +15 -2
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +1 -1
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +1 -1
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +1 -1
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +32 -15
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +6 -3
- 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 +1 -1
- data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +43 -24
- data/lib/hecks/ports/persistence/plugins/era/translation.rb +1 -0
- data/lib/hecks/ports/persistence/state_codec.rb +24 -5
- data/lib/hecks/projection_files.rb +285 -0
- data/lib/hecks/projections/bootstrap_table.rb +1 -1
- data/lib/hecks/projections/deploy/fargate.rb +5 -5
- data/lib/hecks/projections/deploy/lambda.rb +43 -32
- data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
- data/lib/hecks/projections/deploy/preview/template.rb +1 -1
- 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/smoke-after-deploy.sh.tmpl +1 -1
- data/lib/hecks/projections/deploy/shared.rb +1 -1
- data/lib/hecks/projections/diagrams.rb +3 -3
- data/lib/hecks/projections/model/deviations.rb +1 -1
- data/lib/hecks/projections/parser_table.rb +4 -4
- data/lib/hecks/projections/reference.rb +2 -3
- data/lib/hecks/projections/rust_vocabulary.rb +1 -1
- data/lib/hecks/projector/cli_projector.rb +106 -37
- data/lib/hecks/projector.rb +1 -1
- 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/release/runner/ci_publisher.rb +2 -2
- data/lib/hecks/release/runner/clean_tree.rb +42 -0
- data/lib/hecks/release/runner/console.rb +6 -0
- data/lib/hecks/release/runner/gem_publisher.rb +14 -7
- data/lib/hecks/release/runner/npm_publisher.rb +6 -36
- data/lib/hecks/release/runner/preflight.rb +26 -2
- data/lib/hecks/release/runner/published.rb +8 -26
- data/lib/hecks/release/runner/tagger.rb +30 -15
- data/lib/hecks/release/runner.rb +57 -6
- data/lib/hecks/router/namespace_installer.rb +3 -3
- data/lib/hecks/runtime/adapter_lookup.rb +124 -0
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +4 -0
- data/lib/hecks/runtime/dependency_planning.rb +20 -2
- data/lib/hecks/runtime/dispatcher.rb +53 -3
- data/lib/hecks/runtime/interpreting.rb +3 -0
- data/lib/hecks/runtime/loader.rb +65 -12
- data/lib/hecks/runtime/outbox.rb +1 -1
- data/lib/hecks/runtime/policy_interpreter.rb +5 -2
- data/lib/hecks/runtime/port_operation_interpreter.rb +2 -10
- data/lib/hecks/runtime/query_interpreter.rb +77 -0
- data/lib/hecks/runtime/reaction_outcome.rb +89 -0
- data/lib/hecks/runtime/refusal_wording.rb +23 -1
- data/lib/hecks/runtime/registry/verification.rb +163 -4
- data/lib/hecks/runtime/registry.rb +57 -3
- data/lib/hecks/runtime/remote_dispatcher.rb +31 -2
- data/lib/hecks/runtime/value/coercion.rb +23 -135
- data/lib/hecks/runtime/value/field_checks.rb +172 -0
- data/lib/hecks/runtime/value.rb +4 -1
- data/lib/hecks/runtime.rb +20 -6
- 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 +16 -16
- data/lib/hecks/tenancy/bluebook/tenancy.bluebook +2 -2
- data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +1 -1
- 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/version.rb +1 -1
- data/lib/hecks.rb +32 -15
- 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 +477 -12
- data/lib/hecks/facade/cli_door.rb +0 -96
- data/lib/hecks/facade/cli_runner.rb +0 -127
- data/lib/hecks/mcp_door_scope.rb +0 -95
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
//! IR structs mirroring `lib/hecks/bluebook/ir/*.rb`'s `to_h`, in Ruby's key order.
|
|
2
|
+
//! Their JSON must byte-match `JSON.pretty_generate(Exporter.call(...))`.
|
|
3
|
+
|
|
4
|
+
/// A captured Ruby value, rendered through `Hecks::Literal` where Ruby does (see ruby_value.rs).
|
|
5
|
+
pub type Literal = Option<crate::ruby_value::Value>;
|
|
6
|
+
|
|
7
|
+
#[derive(Debug, Clone, Default)]
|
|
8
|
+
pub struct Attribute {
|
|
9
|
+
pub name: String,
|
|
10
|
+
pub type_name: String, // `Reference<Target>` spelling for a reference, else the bare type name
|
|
11
|
+
pub list: bool,
|
|
12
|
+
// The raw author value, passed through with no `Literal.render`.
|
|
13
|
+
pub default: Option<crate::ruby_value::Value>,
|
|
14
|
+
pub optional: bool,
|
|
15
|
+
pub pattern: Option<String>,
|
|
16
|
+
pub admits: Option<String>,
|
|
17
|
+
// `has_many`, `has_one` or `belongs_to`, kept apart from `Reference<Target>` and `list`.
|
|
18
|
+
pub relationship: Option<String>,
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
impl Attribute {
|
|
22
|
+
/// The target of a `"Reference<Target>"`-spelled `type_name`, else `None`.
|
|
23
|
+
pub fn reference_target(&self) -> Option<&str> {
|
|
24
|
+
self.type_name
|
|
25
|
+
.strip_prefix("Reference<")
|
|
26
|
+
.and_then(|rest| rest.strip_suffix('>'))
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
#[derive(Debug, Clone, Default)]
|
|
31
|
+
pub struct Given {
|
|
32
|
+
pub description: Option<String>,
|
|
33
|
+
pub canonical: String,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
pub type Ensures = Given;
|
|
37
|
+
pub type Invariant = Given;
|
|
38
|
+
|
|
39
|
+
// `projects :name, from: :"reference.remote_field"` (ADR 0025); all three are plain identifiers.
|
|
40
|
+
#[derive(Debug, Clone, Default)]
|
|
41
|
+
pub struct ProjectedField {
|
|
42
|
+
pub name: String,
|
|
43
|
+
pub reference: String,
|
|
44
|
+
pub remote_field: String,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// One state or several, stored as the plain captured value rather than a `Given`-shaped rule.
|
|
48
|
+
// `None` when the command has no `from:` guard.
|
|
49
|
+
#[derive(Debug, Clone, PartialEq)]
|
|
50
|
+
pub enum CommandFrom {
|
|
51
|
+
Single(String),
|
|
52
|
+
Multiple(Vec<String>),
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Argument sources emit `{kind: "argument", name}`; literal sources emit
|
|
56
|
+
// `{kind: "literal", value}` raw, not `Literal.render`-ed (only `append` fields are rendered).
|
|
57
|
+
#[derive(Debug, Clone)]
|
|
58
|
+
pub enum MutationSource {
|
|
59
|
+
Argument(String),
|
|
60
|
+
Literal(crate::ruby_value::Value),
|
|
61
|
+
/// `state(:field)`: the record's own field, read from the pre-dispatch state.
|
|
62
|
+
State(String),
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
#[derive(Debug, Clone)]
|
|
66
|
+
pub enum Mutation {
|
|
67
|
+
Append {
|
|
68
|
+
target: String,
|
|
69
|
+
fields: Vec<(String, String)>,
|
|
70
|
+
}, // field -> Literal::render spelling
|
|
71
|
+
// Shares `Append`'s multi-binding `fields` shape with `op: "delegate"` and a dotted
|
|
72
|
+
// "Entity.Command" target; its own variant keeps the emitter's match exhaustive.
|
|
73
|
+
Delegate {
|
|
74
|
+
target: String,
|
|
75
|
+
fields: Vec<(String, String)>,
|
|
76
|
+
},
|
|
77
|
+
// `corrects "Event", ...`: same `fields` shape; `op` is "corrects", target is the event.
|
|
78
|
+
Correction {
|
|
79
|
+
target: String,
|
|
80
|
+
fields: Vec<(String, String)>,
|
|
81
|
+
},
|
|
82
|
+
// `sign` mirrors `Vocabulary::MutationOp` ("1" increment, "-1" decrement, "" otherwise),
|
|
83
|
+
// computed by `parse::command::mutation_sign` because the parser has no live table to read.
|
|
84
|
+
Other {
|
|
85
|
+
target: String,
|
|
86
|
+
op: String,
|
|
87
|
+
sign: String,
|
|
88
|
+
source: Option<MutationSource>,
|
|
89
|
+
},
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
#[derive(Debug, Clone, Default)]
|
|
93
|
+
pub struct Command {
|
|
94
|
+
pub name: String,
|
|
95
|
+
pub role: Option<String>,
|
|
96
|
+
pub goal: Option<String>,
|
|
97
|
+
pub references: Option<String>,
|
|
98
|
+
pub attributes: Vec<Attribute>,
|
|
99
|
+
pub givens: Vec<Given>,
|
|
100
|
+
pub ensures: Vec<Ensures>,
|
|
101
|
+
pub mutations: Vec<Mutation>,
|
|
102
|
+
pub emits: Vec<String>,
|
|
103
|
+
// The lifecycle state this command is admissible from; see `CommandFrom`.
|
|
104
|
+
pub from: Option<CommandFrom>,
|
|
105
|
+
// The raw captured `provenance from: { ... }` Hash, emitted without `Literal.render`.
|
|
106
|
+
pub provenance: Literal,
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
#[derive(Debug, Clone, Default)]
|
|
110
|
+
pub struct StateTransitionRow {
|
|
111
|
+
pub command: String,
|
|
112
|
+
pub to_state: String,
|
|
113
|
+
pub from_state: Option<String>,
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
#[derive(Debug, Clone, Default)]
|
|
117
|
+
pub struct Lifecycle {
|
|
118
|
+
pub field: String,
|
|
119
|
+
pub default: String,
|
|
120
|
+
pub transitions: Vec<StateTransitionRow>,
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
#[derive(Debug, Clone, Default)]
|
|
124
|
+
pub struct Query {
|
|
125
|
+
pub name: String,
|
|
126
|
+
pub description: Option<String>,
|
|
127
|
+
pub attributes: Vec<Attribute>,
|
|
128
|
+
pub wheres: Vec<WhereClause>,
|
|
129
|
+
pub order_by: Option<OrderBy>,
|
|
130
|
+
pub limit: Option<LimitSpec>,
|
|
131
|
+
pub options: QueryOptions,
|
|
132
|
+
/// `returns Name` or `returns list_of(Name)`, spelled as `Query#returns` holds it.
|
|
133
|
+
pub returns: Option<String>,
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/// `AuthorizationSpec#to_h`: both fields are bare `.to_s`, never Literal-rendered.
|
|
137
|
+
#[derive(Debug, Clone, Default)]
|
|
138
|
+
pub struct AuthorizationSpec {
|
|
139
|
+
pub policy: String,
|
|
140
|
+
pub tenant: Option<String>,
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/// Mirrors `extra_options_to_h`. A typed struct, not a `BTreeMap`, because Ruby's declared
|
|
144
|
+
/// field order must be preserved. Shared by `Query` and `ReadModel`.
|
|
145
|
+
#[derive(Debug, Clone, Default)]
|
|
146
|
+
pub struct QueryOptions {
|
|
147
|
+
pub offset: Option<OffsetSpec>,
|
|
148
|
+
// Already-rendered text; cursor never gets ADR 0055's `on:` (out of scope — see this
|
|
149
|
+
// struct's own callers).
|
|
150
|
+
pub cursor: Option<String>,
|
|
151
|
+
pub authorization: Option<AuthorizationSpec>,
|
|
152
|
+
// `None` both when never declared and when `:native`; Ruby drops the default mode key.
|
|
153
|
+
pub null_semantics: Option<String>,
|
|
154
|
+
pub inspection: Option<String>,
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/// ADR 0055's `on:` — which many-side `include`d aggregate (by TYPE, demodulised, not by its
|
|
158
|
+
/// `as:` alias) this clause/option applies to. `None` for an untargeted where/order_by/limit/
|
|
159
|
+
/// offset (Query context, or a ReadModel with a single many-side head); real only in ReadModel
|
|
160
|
+
/// context, where a `report` with several many-side heads needs it to say which one.
|
|
161
|
+
#[derive(Debug, Clone, Default)]
|
|
162
|
+
pub struct WhereClause {
|
|
163
|
+
pub field: String,
|
|
164
|
+
pub op: String,
|
|
165
|
+
pub value: String, // Literal::render spelling
|
|
166
|
+
pub target: Option<String>,
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
#[derive(Debug, Clone, Default)]
|
|
170
|
+
pub struct OrderBy {
|
|
171
|
+
pub field: String,
|
|
172
|
+
pub direction: String,
|
|
173
|
+
pub target: Option<String>,
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
#[derive(Debug, Clone, Default)]
|
|
177
|
+
pub struct LimitSpec {
|
|
178
|
+
pub value: String, // Literal::render spelling
|
|
179
|
+
pub target: Option<String>,
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
#[derive(Debug, Clone, Default)]
|
|
183
|
+
pub struct OffsetSpec {
|
|
184
|
+
pub value: String, // Literal::render spelling
|
|
185
|
+
pub target: Option<String>,
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
#[derive(Debug, Clone, Default)]
|
|
189
|
+
pub struct Entity {
|
|
190
|
+
pub name: String,
|
|
191
|
+
pub description: Option<String>,
|
|
192
|
+
pub identified_by: Vec<String>,
|
|
193
|
+
pub attributes: Vec<Attribute>,
|
|
194
|
+
pub commands: Vec<Command>,
|
|
195
|
+
pub queries: Vec<Query>,
|
|
196
|
+
// A piece nested inside a piece, like an Aggregate's own `entities`.
|
|
197
|
+
pub entities: Vec<Entity>,
|
|
198
|
+
// A precondition shared across this piece's commands; declaration-only, like `Aggregate`.
|
|
199
|
+
pub preconditions: Vec<Given>,
|
|
200
|
+
// A shape rule checked against every instance of this piece.
|
|
201
|
+
pub invariants: Vec<Invariant>,
|
|
202
|
+
pub lifecycle: Option<Lifecycle>,
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
#[derive(Debug, Clone, Default)]
|
|
206
|
+
pub struct Aggregate {
|
|
207
|
+
pub name: String,
|
|
208
|
+
pub description: Option<String>,
|
|
209
|
+
pub identified_by: Vec<String>,
|
|
210
|
+
pub attributes: Vec<Attribute>,
|
|
211
|
+
pub value_objects: Vec<ValueObject>,
|
|
212
|
+
pub commands: Vec<Command>,
|
|
213
|
+
// Checked after every command, before save.
|
|
214
|
+
pub invariants: Vec<Invariant>,
|
|
215
|
+
// Named `given`s shared across commands. Declaration-only: Rust never resolves a command's
|
|
216
|
+
// block-less `given("...")` against them (see `parse::command`).
|
|
217
|
+
pub preconditions: Vec<Given>,
|
|
218
|
+
// `projects :name, from: :"reference.remote_field"`. Kept out of `attributes` because
|
|
219
|
+
// `EraGuard::ShapeDiff` walks only `attributes` to detect missing data.
|
|
220
|
+
pub projected_fields: Vec<ProjectedField>,
|
|
221
|
+
pub lifecycle: Option<Lifecycle>,
|
|
222
|
+
pub entities: Vec<Entity>,
|
|
223
|
+
pub queries: Vec<Query>,
|
|
224
|
+
pub ports: Vec<DomainPort>,
|
|
225
|
+
// Same raw-captured-Hash shape as `Command.provenance`.
|
|
226
|
+
pub provenance: Literal,
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
#[derive(Debug, Clone, Default)]
|
|
230
|
+
pub struct ValueObject {
|
|
231
|
+
pub name: String,
|
|
232
|
+
pub attributes: Vec<Attribute>,
|
|
233
|
+
pub invariants: Vec<Invariant>,
|
|
234
|
+
pub closed_set: bool,
|
|
235
|
+
// Ordered (field, typed-value) pairs, typed so numbers and bools keep their JSON type.
|
|
236
|
+
pub members: Vec<Vec<(String, crate::ruby_value::Value)>>,
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/// A read model's aggregate head row (`{aggregate:, as:, many:}`); `many` is a real JSON boolean.
|
|
240
|
+
#[derive(Debug, Clone)]
|
|
241
|
+
pub struct AggregateHead {
|
|
242
|
+
pub aggregate: String,
|
|
243
|
+
pub as_name: String,
|
|
244
|
+
pub many: bool,
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
#[derive(Debug, Clone, Default)]
|
|
248
|
+
pub struct ReadModel {
|
|
249
|
+
pub name: String,
|
|
250
|
+
pub description: Option<String>,
|
|
251
|
+
pub reference_name: Option<String>,
|
|
252
|
+
pub reference_target: Option<String>,
|
|
253
|
+
pub query_name: String,
|
|
254
|
+
// `wheres`/`order_by`/`limit` are spelled explicitly, as in `IR::Query#to_h`.
|
|
255
|
+
pub wheres: Vec<WhereClause>,
|
|
256
|
+
pub order_by: Option<OrderBy>,
|
|
257
|
+
pub limit: Option<LimitSpec>,
|
|
258
|
+
pub aggregate_heads: Vec<AggregateHead>,
|
|
259
|
+
// One `{"field": ...}` row per name, re-wrapped by `read_model_json`.
|
|
260
|
+
pub group_by: Vec<String>,
|
|
261
|
+
// `group_by`'s siblings; every one is omitted from the wire when absent, not `null`
|
|
262
|
+
// (ADR 0078 — a read model reports one shape, so at most one is ever set).
|
|
263
|
+
pub count: bool,
|
|
264
|
+
pub median_field: Option<String>,
|
|
265
|
+
pub sum_field: Option<String>,
|
|
266
|
+
pub avg_field: Option<String>,
|
|
267
|
+
pub min_field: Option<String>,
|
|
268
|
+
pub max_field: Option<String>,
|
|
269
|
+
pub percentile_field: Option<String>,
|
|
270
|
+
// Kept as text (Ruby's own self-hosted grammar wraps it in `ReadModelText`), coerced
|
|
271
|
+
// by `Bluebook::ReadModel#initialize`'s own `&.to_f` on the Ruby side.
|
|
272
|
+
pub percentile_at: Option<String>,
|
|
273
|
+
pub any_field: Option<String>,
|
|
274
|
+
pub all_field: Option<String>,
|
|
275
|
+
// Same shape as `Query.options`.
|
|
276
|
+
pub options: QueryOptions,
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
#[derive(Debug, Clone, Default)]
|
|
280
|
+
pub struct Policy {
|
|
281
|
+
pub name: String,
|
|
282
|
+
pub on_event: Option<String>,
|
|
283
|
+
pub trigger_command: Option<String>,
|
|
284
|
+
pub target_domain: Option<String>,
|
|
285
|
+
// `across "X", expect_undelivered: true`; emitted as a boolean, `false` when not declared.
|
|
286
|
+
pub expect_undelivered: bool,
|
|
287
|
+
// `where`/`for_each` (`PolicyBuilder`); named `where_clause`/`for_each_query` because `where`
|
|
288
|
+
// is reserved. `policy_json` still emits the keys `where`/`for_each` and derives `where_ast`.
|
|
289
|
+
pub where_clause: Option<String>,
|
|
290
|
+
pub for_each_query: Option<String>,
|
|
291
|
+
// `trigger ... with:` bindings as `(key, Literal::render)` pairs; a Symbol keeps its colon.
|
|
292
|
+
pub with_spec: Vec<(String, String)>,
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
#[derive(Debug, Clone, Default)]
|
|
296
|
+
pub struct DispatchSpec {
|
|
297
|
+
pub command_name: String,
|
|
298
|
+
pub with_spec: Vec<(String, String)>, // Literal::render spelling per value
|
|
299
|
+
// A shape-identical `DispatchSpec` naming the command that undoes this dispatch. Field order
|
|
300
|
+
// (`command_name`, `with_spec`, `compensates`) is the wire order `dispatch_spec_json` emits.
|
|
301
|
+
// One level only: a compensation is not itself compensable.
|
|
302
|
+
pub compensates: Option<Box<DispatchSpec>>,
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
#[derive(Debug, Clone, Default)]
|
|
306
|
+
pub struct ProcessManagerHandler {
|
|
307
|
+
pub event_type: String,
|
|
308
|
+
pub from_state: String,
|
|
309
|
+
pub to_state: String,
|
|
310
|
+
pub dispatches: Vec<DispatchSpec>,
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
#[derive(Debug, Clone, Default)]
|
|
314
|
+
pub struct ProcessManager {
|
|
315
|
+
pub name: String,
|
|
316
|
+
pub correlates_by: String,
|
|
317
|
+
pub starts_on: Option<String>,
|
|
318
|
+
pub ends_on: Option<String>,
|
|
319
|
+
pub states: Vec<String>,
|
|
320
|
+
pub handlers: Vec<ProcessManagerHandler>,
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
#[derive(Debug, Clone, Default)]
|
|
324
|
+
pub struct PortOperation {
|
|
325
|
+
pub name: String,
|
|
326
|
+
pub attributes: Vec<Attribute>,
|
|
327
|
+
pub emits: Vec<String>,
|
|
328
|
+
/// The receiving aggregate as routing metadata (`to: Payment`), not an attribute.
|
|
329
|
+
pub to: Option<String>,
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
#[derive(Debug, Clone, Default)]
|
|
333
|
+
pub struct DomainPort {
|
|
334
|
+
pub name: String,
|
|
335
|
+
pub operations: Vec<PortOperation>,
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/// `IR::Bluebook#to_h`: the top of the construct chain, emitted as `ir.json`.
|
|
339
|
+
#[derive(Debug, Clone)]
|
|
340
|
+
pub struct Bluebook {
|
|
341
|
+
pub ir_version: u32, // IR::Bluebook::IR_VERSION, pinned at 1 as of Stage 0
|
|
342
|
+
pub name: String,
|
|
343
|
+
pub version: Option<String>,
|
|
344
|
+
pub vision: Option<String>,
|
|
345
|
+
pub classification: Option<String>,
|
|
346
|
+
// `formerly_known_as "OldName"`: always `None` today because `parse/chapter.rs` refuses it,
|
|
347
|
+
// but the key is emitted on every chapter.
|
|
348
|
+
pub formerly_known_as: Option<String>,
|
|
349
|
+
// `namespace "Hecks::Domain"`: the Ruby module the chapter installs under (ADR 0080).
|
|
350
|
+
pub namespace: Option<String>,
|
|
351
|
+
pub aggregates: Vec<Aggregate>,
|
|
352
|
+
pub read_models: Vec<ReadModel>,
|
|
353
|
+
pub policies: Vec<Policy>,
|
|
354
|
+
pub process_managers: Vec<ProcessManager>,
|
|
355
|
+
// Core contexts this chapter attaches to (`attaches_to "Query", "ReadModel"`).
|
|
356
|
+
pub attaches_to: Vec<String>,
|
|
357
|
+
// `provides "authorization", grant: "..."`: one row per key, in source order.
|
|
358
|
+
pub provides: Vec<Provision>,
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
impl Default for Bluebook {
|
|
362
|
+
fn default() -> Self {
|
|
363
|
+
Self {
|
|
364
|
+
ir_version: 1,
|
|
365
|
+
name: String::new(),
|
|
366
|
+
version: None,
|
|
367
|
+
vision: None,
|
|
368
|
+
classification: None,
|
|
369
|
+
formerly_known_as: None,
|
|
370
|
+
namespace: None,
|
|
371
|
+
aggregates: Vec::new(),
|
|
372
|
+
read_models: Vec::new(),
|
|
373
|
+
policies: Vec::new(),
|
|
374
|
+
process_managers: Vec::new(),
|
|
375
|
+
attaches_to: Vec::new(),
|
|
376
|
+
provides: Vec::new(),
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/// One row of a declared capability, emitted as `{"capability", "key", "verb"}`.
|
|
382
|
+
#[derive(Debug, Clone, Default)]
|
|
383
|
+
pub struct Provision {
|
|
384
|
+
pub capability: String,
|
|
385
|
+
pub key: String,
|
|
386
|
+
pub verb: String,
|
|
387
|
+
}
|