hecks 6.0.0 → 7.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 +19 -12
- data/lib/hecks/adapters/driven/claude_code.rb +2 -2
- data/lib/hecks/adapters/driven/folder.rb +10 -1
- data/lib/hecks/adapters/driven/folder_overlay.rb +15 -0
- data/lib/hecks/adapters/driven/heki.rb +1 -1
- data/lib/hecks/adapters/driven/in_process_key_vault.rb +1 -1
- data/lib/hecks/adapters/driven/memory/outbox_rows.rb +2 -2
- data/lib/hecks/adapters/driven/postgres/name_guard.rb +25 -0
- data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -3
- data/lib/hecks/adapters/driven/postgres/repository.rb +1 -1
- data/lib/hecks/adapters/driven/postgres/shared_connection.rb +1 -1
- data/lib/hecks/adapters/driven/postgres.rb +3 -0
- data/lib/hecks/adapters/driven/postgres_era/boot.rb +28 -16
- data/lib/hecks/adapters/driven/postgres_era/class_methods.rb +27 -7
- data/lib/hecks/adapters/driven/postgres_era/dialect.rb +10 -5
- data/lib/hecks/adapters/driven/postgres_era/field_cache_provisioner.rb +39 -0
- data/lib/hecks/adapters/driven/postgres_era/journal.rb +52 -13
- data/lib/hecks/adapters/driven/postgres_era/lineage/chain_sql.rb +29 -49
- data/lib/hecks/adapters/driven/postgres_era/lineage/direct_sql.rb +73 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/direct_verified.json +10 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/direct_verified.rb +65 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/domain_rename.rb +77 -25
- data/lib/hecks/adapters/driven/postgres_era/lineage/domain_rename_state.rb +108 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/era_integrity.rb +11 -6
- data/lib/hecks/adapters/driven/postgres_era/lineage/era_store.rb +63 -5
- data/lib/hecks/adapters/driven/postgres_era/lineage/layered_sql.rb +64 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/ledger_reset.rb +150 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/mint_provisioning.rb +85 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/mint_transaction.rb +11 -7
- data/lib/hecks/adapters/driven/postgres_era/lineage/provisioning.rb +11 -5
- data/lib/hecks/adapters/driven/postgres_era/lineage/split_sql.rb +76 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/sql_templates.rb +9 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage.rb +10 -2
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/context.rb +23 -3
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/coverage_check.rb +3 -1
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/disposable_ledger.rb +119 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolution.rb +219 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolver.rb +68 -71
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/held_era.rb +68 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/ledger_change.rb +63 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/merge_coordinator.rb +1 -1
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/mint_decision.rb +163 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/mint_request.rb +24 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/minter.rb +59 -21
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/refusals.rb +24 -11
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager.rb +40 -6
- data/lib/hecks/adapters/driven/postgres_era/shared_tables.rb +32 -0
- data/lib/hecks/adapters/driven/postgres_era.adapter +12 -0
- data/lib/hecks/adapters/driven/postgres_era.rb +25 -10
- data/lib/hecks/adapters/driven/prism.rb +0 -1
- data/lib/hecks/adapters/driven/sql_query_builder.rb +1 -0
- data/lib/hecks/adapters/driven/sqlite/dispatch_claims.rb +1 -1
- data/lib/hecks/adapters/driven/sqlite/name_guard.rb +25 -0
- data/lib/hecks/adapters/driven/sqlite/outbox.rb +2 -2
- data/lib/hecks/adapters/driven/sqlite/repository.rb +1 -1
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +20 -0
- data/lib/hecks/adapters/driven/sqlite.rb +9 -1
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +1 -1
- data/lib/hecks/adapters/driven/worktree_overlay.rb +117 -0
- data/lib/hecks/adapters/driving/cli/shorthand.rb +5 -1
- data/lib/hecks/adapters/driving/cli.rb +1 -1
- data/lib/hecks/adapters/driving/cli_runner/answers.rb +77 -22
- data/lib/hecks/adapters/driving/cli_runner/bang_rule.rb +35 -0
- data/lib/hecks/adapters/driving/cli_runner/completion_words.rb +36 -0
- data/lib/hecks/adapters/driving/cli_runner/json_words.rb +55 -0
- data/lib/hecks/adapters/driving/cli_runner/name_index.rb +63 -0
- data/lib/hecks/adapters/driving/cli_runner/read_context.rb +32 -0
- data/lib/hecks/adapters/driving/cli_runner/renamed_names.rb +49 -0
- data/lib/hecks/adapters/driving/cli_runner/resolution.rb +43 -17
- data/lib/hecks/adapters/driving/cli_runner/resume_words.rb +63 -0
- data/lib/hecks/adapters/driving/cli_runner/run_reference.rb +66 -0
- data/lib/hecks/adapters/driving/cli_runner/run_replay.rb +118 -0
- data/lib/hecks/adapters/driving/cli_runner/search_words.rb +35 -0
- data/lib/hecks/adapters/driving/cli_runner/settling.rb +6 -5
- data/lib/hecks/adapters/driving/cli_runner/streaming.rb +11 -10
- data/lib/hecks/adapters/driving/cli_runner/suggestions.rb +1 -1
- data/lib/hecks/adapters/driving/cli_runner/tour_words.rb +77 -0
- data/lib/hecks/adapters/driving/cli_runner/verb_names.rb +36 -4
- data/lib/hecks/adapters/driving/cli_runner/verbosity.rb +75 -0
- data/lib/hecks/adapters/driving/cli_runner.rb +106 -7
- data/lib/hecks/adapters/driving/context_line.rb +85 -0
- data/lib/hecks/adapters/driving/exit_status.rb +31 -0
- data/lib/hecks/adapters/driving/launcher_options.rb +7 -5
- data/lib/hecks/adapters/driving/mcp/progress_sink.rb +45 -0
- data/lib/hecks/adapters/driving/mcp/tool_calls.rb +7 -5
- data/lib/hecks/adapters/driving/mcp.rb +25 -5
- data/lib/hecks/adapters/driving/mcp_scope/argument_policy.rb +40 -7
- data/lib/hecks/adapters/driving/mcp_scope.rb +8 -7
- data/lib/hecks/adapters/driving/ruby/aggregate_module/hooks.rb +154 -0
- data/lib/hecks/adapters/driving/ruby/aggregate_module.rb +64 -93
- data/lib/hecks/adapters/driving/usage_log.rb +146 -0
- data/lib/hecks/adapters/driving/write_guard.rb +55 -0
- data/lib/hecks/adapters/driving.rb +0 -1
- data/lib/hecks/behaviors/dsl.rb +5 -1
- data/lib/hecks/behaviors/expectations/boot.rb +0 -1
- data/lib/hecks/bluebook/acknowledgements.rb +1 -1
- data/lib/hecks/bluebook/aggregate.rb +21 -18
- data/lib/hecks/bluebook/assembly/contracts/sagas.rb +2 -0
- data/lib/hecks/bluebook/assembly/contracts/structure.rb +18 -13
- data/lib/hecks/bluebook/behaviour/aggregate.rb +27 -3
- data/lib/hecks/bluebook/command.rb +16 -5
- data/lib/hecks/bluebook/declaration.rb +32 -4
- data/lib/hecks/bluebook/domain_port.rb +7 -3
- data/lib/hecks/bluebook/dsl/aggregate_builder/relationships.rb +0 -2
- data/lib/hecks/bluebook/dsl/aggregate_builder/renaming.rb +25 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +3 -0
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +0 -1
- data/lib/hecks/bluebook/dsl/audience_word.rb +40 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/metadata.rb +56 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/modules.rb +80 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/correlation_keys.rb +51 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +1 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +17 -34
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +8 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +13 -3
- data/lib/hecks/bluebook/dsl/entity_builder.rb +0 -2
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +6 -4
- data/lib/hecks/bluebook/dsl/kinds.rb +53 -0
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +9 -2
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +25 -15
- data/lib/hecks/bluebook/dsl/translation_builder.rb +16 -1
- data/lib/hecks/bluebook/dsl/word_gate.rb +1 -1
- data/lib/hecks/bluebook/dsl.rb +1 -0
- data/lib/hecks/bluebook/meta_validator/judge/identity.rb +9 -4
- data/lib/hecks/bluebook/meta_validator/plan/category.rb +10 -2
- data/lib/hecks/bluebook/meta_validator/plan/verbs.rb +9 -0
- data/lib/hecks/bluebook/meta_validator/plan.rb +2 -1
- data/lib/hecks/bluebook/meta_validator/reconstruction/heads.rb +3 -1
- data/lib/hecks/bluebook/meta_validator/reconstruction/reading.rb +7 -0
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +7 -2
- data/lib/hecks/bluebook/meta_validator/shapes.rb +3 -0
- data/lib/hecks/bluebook/meta_validator/syntax_boot/disk_cache.rb +1 -1
- data/lib/hecks/bluebook/model_check/aggregate_checks.rb +27 -0
- data/lib/hecks/bluebook/model_check/ask_checks.rb +25 -0
- data/lib/hecks/bluebook/model_check/reaction_chains.rb +114 -0
- data/lib/hecks/bluebook/model_check/reaction_cycles.rb +53 -0
- data/lib/hecks/bluebook/model_check/reaction_depth_checks.rb +58 -0
- data/lib/hecks/bluebook/model_check/reaction_walk.rb +62 -0
- data/lib/hecks/bluebook/model_check.rb +5 -27
- data/lib/hecks/bluebook/process_manager.rb +20 -3
- data/lib/hecks/bluebook/translation.rb +5 -3
- data/lib/hecks/bluebook/translation_plan.rb +9 -2
- data/lib/hecks/ci_pipeline/adapters/ci_cache.adapter +7 -0
- data/lib/hecks/ci_pipeline/adapters/ci_cache.rb +39 -0
- data/lib/hecks/ci_pipeline/adapters/ci_runner.adapter +7 -0
- data/lib/hecks/ci_pipeline/adapters/ci_runner.rb +55 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.behaviors +322 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.bluebook +938 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.hecksagon +12 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.ports.hecksagon +16 -0
- data/lib/hecks/ci_speed/adapters/ci_reader.adapter +7 -0
- data/lib/hecks/ci_speed/adapters/ci_reader.rb +141 -0
- data/lib/hecks/ci_speed/adapters/local_runner/answer.rb +41 -0
- data/lib/hecks/ci_speed/adapters/local_runner/catalog.rb +89 -0
- data/lib/hecks/ci_speed/adapters/local_runner/checkouts.rb +89 -0
- data/lib/hecks/ci_speed/adapters/local_runner/launcher.rb +69 -0
- data/lib/hecks/ci_speed/adapters/local_runner/load_average.rb +38 -0
- data/lib/hecks/ci_speed/adapters/local_runner/refs.rb +39 -0
- data/lib/hecks/ci_speed/adapters/local_runner/refused.rb +11 -0
- data/lib/hecks/ci_speed/adapters/local_runner/verdict.rb +71 -0
- data/lib/hecks/ci_speed/adapters/local_runner.adapter +7 -0
- data/lib/hecks/ci_speed/adapters/local_runner.rb +168 -0
- data/lib/hecks/ci_speed/adapters/replayed_runner.rb +39 -0
- data/lib/hecks/ci_speed/ci_speed.behaviors +341 -0
- data/lib/hecks/ci_speed/ci_speed.bluebook +1073 -0
- data/lib/hecks/ci_speed/ci_speed.hecksagon +11 -0
- data/lib/hecks/ci_speed/ci_speed.ports.hecksagon +21 -0
- data/lib/hecks/ci_workflows/ci_workflows.behaviors +13 -0
- data/lib/hecks/ci_workflows/ci_workflows.bluebook +173 -0
- data/lib/hecks/ci_workflows/ci_workflows.hecksagon +15 -0
- data/lib/hecks/coder/coder.bluebook +385 -0
- data/lib/hecks/coder/coder.hecksagon +12 -0
- data/lib/hecks/command_names/check.rb +39 -0
- data/lib/hecks/command_names/extractor.rb +67 -0
- data/lib/hecks/command_names/index.rb +40 -0
- data/lib/hecks/command_names/resolution.rb +81 -0
- data/lib/hecks/command_names/scan.rb +54 -0
- data/lib/hecks/command_names/sources.rb +73 -0
- data/lib/hecks/command_names.rb +26 -0
- data/lib/hecks/composer/jobs.rb +1 -1
- data/lib/hecks/composer/toolbox.rb +8 -1
- data/lib/hecks/corpus/generated_key.rb +205 -0
- data/lib/hecks/corpus/listing.rb +34 -0
- data/lib/hecks/corpus/rust.rb +27 -11
- data/lib/hecks/corpus/sources.rb +2 -1
- data/lib/hecks/corpus.rb +37 -42
- data/lib/hecks/deprecation.rb +23 -0
- data/lib/hecks/doc/reference/readme.rb +1 -1
- data/lib/hecks/doc/reference/rendering.rb +2 -2
- data/lib/hecks/doc/reference.rb +1 -1
- data/lib/hecks/embryonaut_bluebook/manifest.rb +1 -1
- data/lib/hecks/fixer/fixer.bluebook +240 -0
- data/lib/hecks/fixer/fixer.hecksagon +17 -0
- data/lib/hecks/framework_bluebooks.rb +32 -7
- data/lib/hecks/fuzzing/concurrent_dispatch/world_copy.rb +1 -0
- data/lib/hecks/fuzzing/isolated_boot/postgres_scratch.rb +11 -12
- data/lib/hecks/fuzzing/isolated_boot/worlds.rb +23 -5
- data/lib/hecks/fuzzing/isolated_boot.rb +1 -1
- data/lib/hecks/fuzzing/mutation/checks.rb +3 -3
- data/lib/hecks/grammar/translation.bluebook +1 -1
- data/lib/hecks/grammar/translation_rules.json +64 -0
- data/lib/hecks/hecks/adapter_words.json +7 -0
- data/lib/hecks/hecks/adapters/area_overlap.rb +156 -0
- data/lib/hecks/hecks/adapters/claude_agents.rb +8 -3
- data/lib/hecks/hecks/adapters/codebase/batch_runs.rb +60 -0
- data/lib/hecks/hecks/adapters/codebase/changed_specs.rb +52 -0
- data/lib/hecks/hecks/adapters/codebase/codemods.rb +3 -2
- data/lib/hecks/hecks/adapters/codebase/conformance.rb +14 -1
- data/lib/hecks/hecks/adapters/codebase/corpus_queries.rb +53 -0
- data/lib/hecks/hecks/adapters/codebase/generated_keys.rb +31 -0
- data/lib/hecks/hecks/adapters/codebase/impacted_specs.rb +110 -0
- data/lib/hecks/hecks/adapters/codebase/language.rb +2 -2
- data/lib/hecks/hecks/adapters/codebase/launcher_text.rb +39 -0
- data/lib/hecks/hecks/adapters/codebase/minitest_runs.rb +52 -0
- data/lib/hecks/hecks/adapters/codebase/regeneration.rb +51 -8
- data/lib/hecks/hecks/adapters/codebase/run_options.rb +35 -0
- data/lib/hecks/hecks/adapters/codebase/scripting.rb +39 -0
- data/lib/hecks/hecks/adapters/codebase/search.rb +1 -1
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +79 -51
- data/lib/hecks/hecks/adapters/codebase/spec_files/report.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/spec_files/shared_run.rb +73 -0
- data/lib/hecks/hecks/adapters/codebase/spec_files.rb +95 -0
- data/lib/hecks/hecks/adapters/codebase/test_runner.rb +53 -4
- data/lib/hecks/hecks/adapters/codebase/test_scope.rb +105 -0
- data/lib/hecks/hecks/adapters/codebase/test_suite.rb +48 -34
- data/lib/hecks/hecks/adapters/console_capture.rb +1 -1
- data/lib/hecks/hecks/adapters/cost_explorer.rb +9 -1
- data/lib/hecks/hecks/adapters/dispatching/brief_text.rb +51 -0
- data/lib/hecks/hecks/adapters/dispatching/launcher.rb +97 -0
- data/lib/hecks/hecks/adapters/dispatching/plan.rb +82 -0
- data/lib/hecks/hecks/adapters/dispatching/rows.rb +66 -0
- data/lib/hecks/hecks/adapters/dispatching/settings.rb +81 -0
- data/lib/hecks/hecks/adapters/dispatching/settler.rb +40 -0
- data/lib/hecks/hecks/adapters/dispatching.adapter +7 -0
- data/lib/hecks/hecks/adapters/dispatching.rb +93 -0
- data/lib/hecks/hecks/adapters/doctor_reading/report.rb +27 -0
- data/lib/hecks/hecks/adapters/doctor_reading.adapter +7 -0
- data/lib/hecks/hecks/adapters/doctor_reading.rb +161 -0
- data/lib/hecks/hecks/adapters/git_checkout.rb +1 -1
- data/lib/hecks/hecks/adapters/git_commit.adapter +7 -0
- data/lib/hecks/hecks/adapters/git_commit.rb +61 -0
- data/lib/hecks/hecks/adapters/git_landing/finisher.rb +82 -0
- data/lib/hecks/hecks/adapters/git_landing/foreign_hold.rb +111 -0
- data/lib/hecks/hecks/adapters/git_landing/line.rb +171 -0
- data/lib/hecks/hecks/adapters/git_landing/lineup.rb +98 -0
- data/lib/hecks/hecks/adapters/git_landing/merger.rb +1 -1
- data/lib/hecks/hecks/adapters/git_landing/numbering.rb +54 -0
- data/lib/hecks/hecks/adapters/git_landing/rivals.rb +59 -0
- data/lib/hecks/hecks/adapters/git_landing/ticket.rb +156 -0
- data/lib/hecks/hecks/adapters/git_landing/tidy.rb +147 -0
- data/lib/hecks/hecks/adapters/git_landing/train.rb +104 -0
- data/lib/hecks/hecks/adapters/git_landing/verdict.rb +64 -0
- data/lib/hecks/hecks/adapters/git_landing/waiting.rb +120 -0
- data/lib/hecks/hecks/adapters/git_landing.rb +106 -20
- data/lib/hecks/hecks/adapters/git_main_pull.rb +99 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/bench.rb +82 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/due.rb +84 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/impacted/skips.rb +47 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/impacted/spec_run.rb +75 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/impacted.rb +181 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/line.rb +76 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/reading.rb +24 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/record.rb +146 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/spec_map/corpus.rb +25 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/spec_map/needles.rb +61 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/spec_map.rb +105 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/stages.rb +118 -0
- data/lib/hecks/hecks/adapters/git_rehearsal.adapter +7 -0
- data/lib/hecks/hecks/adapters/git_rehearsal.rb +141 -0
- data/lib/hecks/hecks/adapters/git_train/bench.rb +15 -15
- data/lib/hecks/hecks/adapters/git_train/branch_guard.rb +62 -0
- data/lib/hecks/hecks/adapters/git_train/carriage.rb +27 -28
- data/lib/hecks/hecks/adapters/git_train/launcher_shape.rb +75 -0
- data/lib/hecks/hecks/adapters/git_train/mint_step.rb +47 -0
- data/lib/hecks/hecks/adapters/git_train/settlement.rb +167 -0
- data/lib/hecks/hecks/adapters/git_train.rb +73 -15
- data/lib/hecks/hecks/adapters/git_worktree_add.adapter +7 -0
- data/lib/hecks/hecks/adapters/git_worktree_add.rb +68 -0
- data/lib/hecks/hecks/adapters/github_pull_requests.adapter +7 -0
- data/lib/hecks/hecks/adapters/github_pull_requests.rb +109 -0
- data/lib/hecks/hecks/adapters/host_http.rb +6 -6
- data/lib/hecks/hecks/adapters/in_process_boot.rb +10 -8
- data/lib/hecks/hecks/adapters/in_process_operations.rb +11 -17
- data/lib/hecks/hecks/adapters/in_process_undo.rb +17 -0
- data/lib/hecks/hecks/adapters/journal_store/changes.rb +13 -4
- data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +28 -15
- data/lib/hecks/hecks/adapters/journal_store/examination.rb +17 -1
- data/lib/hecks/hecks/adapters/journal_store/held_domain/renaming.rb +45 -0
- data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +31 -5
- data/lib/hecks/hecks/adapters/journal_store/held_mint.rb +128 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/attestation.rb +1 -1
- data/lib/hecks/hecks/adapters/journal_store/readings/boot_status.rb +58 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/composition.rb +39 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/outcomes.rb +76 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/postgres_reader.rb +44 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/reader.rb +64 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/report.rb +102 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/sqlite_reader.rb +43 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/stores.rb +80 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/subscribers.rb +72 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/summary.rb +39 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace.rb +39 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/command_line.rb +57 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/edge_guards.rb +107 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/inspection.rb +94 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/plan.rb +66 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/report.rb +72 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/store.rb +34 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/watermark_guards.rb +86 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/world.rb +66 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan.rb +36 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/projection_audit.rb +64 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/scaffolding.rb +3 -3
- data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status/database_reading.rb +113 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status/read_only.rb +33 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status.rb +32 -0
- data/lib/hecks/hecks/adapters/journal_store/readings.rb +13 -1
- data/lib/hecks/hecks/adapters/journal_store/reconcile_report.rb +60 -0
- data/lib/hecks/hecks/adapters/journal_store/reconciliation.rb +121 -0
- data/lib/hecks/hecks/adapters/journal_store/translation_write/shape_edge.rb +59 -0
- data/lib/hecks/hecks/adapters/journal_store/translation_write.rb +123 -0
- data/lib/hecks/hecks/adapters/journal_store.rb +16 -0
- data/lib/hecks/hecks/adapters/landed_work.adapter +7 -0
- data/lib/hecks/hecks/adapters/landed_work.rb +52 -0
- data/lib/hecks/hecks/adapters/local_files.rb +6 -6
- data/lib/hecks/hecks/adapters/process_pool.rb +3 -2
- data/lib/hecks/hecks/adapters/push_size.rb +57 -0
- data/lib/hecks/hecks/adapters/qa_quiescing.adapter +7 -0
- data/lib/hecks/hecks/adapters/qa_quiescing.rb +57 -0
- data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +30 -3
- data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +63 -3
- data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +29 -6
- data/lib/hecks/hecks/adapters/rehearsal/subject.rb +11 -5
- data/lib/hecks/hecks/adapters/rust_toolchain.rb +10 -1
- data/lib/hecks/hecks/adapters/rust_workspace.rb +1 -1
- data/lib/hecks/hecks/adapters/settings_reading/disposable_ledger.rb +32 -0
- data/lib/hecks/hecks/adapters/settings_reading/push_nudge.rb +26 -0
- data/lib/hecks/hecks/adapters/settings_reading/stores.rb +76 -0
- data/lib/hecks/hecks/adapters/settings_reading/test_scope.rb +28 -0
- data/lib/hecks/hecks/adapters/settings_reading.rb +28 -2
- data/lib/hecks/hecks/adapters/started_work.rb +42 -0
- data/lib/hecks/hecks/adapters/terminal.rb +12 -10
- data/lib/hecks/hecks/adapters/where_reading.adapter +7 -0
- data/lib/hecks/hecks/adapters/where_reading.rb +64 -0
- data/lib/hecks/hecks/adapters/work_areas.rb +57 -0
- data/lib/hecks/hecks/adapters/work_limits.rb +57 -0
- data/lib/hecks/hecks/build/build.bluebook +576 -0
- data/lib/hecks/hecks/check/check.bluebook +966 -0
- data/lib/hecks/hecks/codebase.behaviors +61 -5
- data/lib/hecks/hecks/composer.behaviors +1 -1
- data/lib/hecks/hecks/context_map.hecksagon +1 -1
- data/lib/hecks/hecks/custodian.behaviors +33 -7
- data/lib/hecks/hecks/delegate/delegate.bluebook +355 -0
- data/lib/hecks/hecks/deliver/deliver.bluebook +945 -0
- data/lib/hecks/hecks/deploy.behaviors +1 -1
- data/lib/hecks/hecks/evolve/evolve.bluebook +788 -0
- data/lib/hecks/hecks/find/find.bluebook +81 -0
- data/lib/hecks/hecks/hecks.behaviors +1 -1
- data/lib/hecks/hecks/hecks.bluebook +0 -133
- data/lib/hecks/hecks/hecks.contextmap +2 -0
- data/lib/hecks/hecks/hecks.hecksagon +185 -29
- data/lib/hecks/hecks/hecks.world +35 -9
- data/lib/hecks/hecks/implicit_moves.json +24 -0
- data/lib/hecks/hecks/migrate/migrate.bluebook +1066 -0
- data/lib/hecks/hecks/operate/operate.bluebook +695 -0
- data/lib/hecks/hecks/quiesce/quiesce.bluebook +117 -0
- data/lib/hecks/hecks/rehearse/rehearse.bluebook +133 -0
- data/lib/hecks/hecks/release/release.bluebook +916 -0
- data/lib/hecks/hecks/serve/serve.bluebook +134 -0
- data/lib/hecks/hecks/shapes.json +1 -15
- data/lib/hecks/hecks/site.behaviors +1 -1
- data/lib/hecks/hecks/start/start.bluebook +194 -0
- data/lib/hecks/hecks/test/test.bluebook +638 -0
- data/lib/hecks/hecks/tickets.world +14 -0
- data/lib/hecks/language/bluebook/aggregate.bluebook +22 -0
- data/lib/hecks/language/bluebook/bluebook.bluebook +34 -0
- data/lib/hecks/language/bluebook/command.bluebook +35 -0
- data/lib/hecks/language/bluebook/process_manager.bluebook +14 -1
- data/lib/hecks/language/bluebook/vocabulary.bluebook +174 -54
- data/lib/hecks/language/hecksagon/domain_port.bluebook +1 -0
- data/lib/hecks/language/hecksagon/port_operation.bluebook +14 -0
- data/lib/hecks/language/kinds/run.kind +120 -0
- data/lib/hecks/language/oidc.json +10 -0
- data/lib/hecks/language/translation/translation_aggregate.bluebook +24 -0
- data/lib/hecks/module_folders.rb +31 -0
- data/lib/hecks/ports/key_vault.rb +1 -1
- data/lib/hecks/ports/persistence/append_only.rb +26 -8
- data/lib/hecks/ports/persistence/binding_policy.rb +3 -1
- data/lib/hecks/ports/persistence/codec_boundary.rb +1 -1
- data/lib/hecks/ports/persistence/mint_door.rb +74 -0
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +6 -5
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +5 -1
- data/lib/hecks/ports/persistence/plugins/era/era_status.rb +48 -0
- data/lib/hecks/ports/persistence/plugins/era/projected_bluebook.rb +127 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/additive_shape.rb +107 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/compose.rb +155 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/compose_render.rb +79 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/edge_files.rb +49 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/edge_route.rb +61 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/implicit_edge.rb +67 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/reconcile.rb +130 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/reconcile_files.rb +35 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +13 -5
- data/lib/hecks/ports/persistence/plugins/era/translation.rb +5 -0
- data/lib/hecks/ports/persistence/plugins/era.rb +1 -0
- data/lib/hecks/ports/persistence/repository_factory.rb +11 -3
- data/lib/hecks/ports/persistence/stored_name_guard.rb +36 -0
- data/lib/hecks/ports/persistence.rb +2 -0
- data/lib/hecks/projections/ci_pipeline/table/checks.rb +137 -0
- data/lib/hecks/projections/ci_pipeline/table/lookup.rb +59 -0
- data/lib/hecks/projections/ci_pipeline/table/refusals.rb +58 -0
- data/lib/hecks/projections/ci_pipeline/table/rows.rb +119 -0
- data/lib/hecks/projections/ci_pipeline/table/tree.rb +30 -0
- data/lib/hecks/projections/ci_pipeline/table/typing.rb +92 -0
- data/lib/hecks/projections/ci_pipeline/table.rb +112 -0
- data/lib/hecks/projections/ci_pipeline/workflows.rb +162 -0
- data/lib/hecks/projections/ci_pipeline/yaml_text.rb +104 -0
- data/lib/hecks/projections/deploy/box/hosting.rb +1 -1
- data/lib/hecks/projections/deploy/box/roll_recipe.rb +1 -1
- data/lib/hecks/projections/deploy/box/roll_scripts.rb +1 -1
- data/lib/hecks/projections/deploy/box.rb +1 -1
- data/lib/hecks/projections/deploy/templates/fargate/Makefile.tmpl +1 -1
- data/lib/hecks/projections/deploy/templates/lambda/Makefile.tmpl +3 -3
- data/lib/hecks/projections/undo.rb +46 -0
- data/lib/hecks/projections.rb +2 -0
- data/lib/hecks/projector/cli_projector/claims.rb +11 -0
- data/lib/hecks/projector/cli_projector/command_help.rb +6 -1
- data/lib/hecks/projector/cli_projector/command_specs.rb +11 -1
- data/lib/hecks/projector/cli_projector/completion.rb +87 -0
- data/lib/hecks/projector/cli_projector/everyday.rb +40 -0
- data/lib/hecks/projector/cli_projector/json_listing.rb +77 -0
- data/lib/hecks/projector/cli_projector/listing.rb +1 -1
- data/lib/hecks/projector/cli_projector/modules.rb +39 -0
- data/lib/hecks/projector/cli_projector/query_specs.rb +1 -0
- data/lib/hecks/projector/cli_projector/renames.rb +58 -0
- data/lib/hecks/projector/cli_projector/search.rb +74 -0
- data/lib/hecks/projector/cli_projector/usage.rb +23 -6
- data/lib/hecks/projector/cli_projector.rb +24 -1
- data/lib/hecks/quality_control/adapters/ci_head.adapter +8 -0
- data/lib/hecks/quality_control/adapters/image_roll.adapter +9 -0
- data/lib/hecks/quality_control/adapters/image_roll.rb +158 -0
- data/lib/hecks/quality_control/adapters/main_maintenance.adapter +8 -0
- data/lib/hecks/quality_control/adapters/main_maintenance.rb +275 -0
- data/lib/hecks/quality_control/adapters/pump_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/pump_tools.rb +18 -0
- data/lib/hecks/quality_control/adapters/push_due_reader.adapter +8 -0
- data/lib/hecks/quality_control/adapters/push_due_reader.rb +99 -0
- data/lib/hecks/quality_control/adapters/qa_auto_mint.rb +183 -0
- data/lib/hecks/quality_control/adapters/qa_era_mint.rb +94 -0
- data/lib/hecks/quality_control/adapters/qa_quiesce_marker.rb +126 -0
- data/lib/hecks/quality_control/adapters/run_keys.rb +36 -0
- data/lib/hecks/quality_control/adapters/run_reader.adapter +7 -0
- data/lib/hecks/quality_control/adapters/run_reader.rb +188 -0
- data/lib/hecks/quality_control/cli/child.rb +1 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains/scanning.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +3 -3
- data/lib/hecks/quality_control/cli/qa_event_pump/attached.rb +67 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/consumer.rb +103 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/cursors.rb +60 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/reactions.rb +46 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/reader.rb +30 -0
- data/lib/hecks/quality_control/cli/qa_event_pump.rb +76 -0
- data/lib/hecks/quality_control/cli/qa_fix_main_bug/publishing.rb +79 -0
- data/lib/hecks/quality_control/cli/qa_fix_main_bug.rb +167 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/evaluation.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_generated_domains/promotion.rb +3 -3
- data/lib/hecks/quality_control/cli/qa_main_gate/gate_run.rb +52 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/logging.rb +70 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/shell.rb +47 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/sweeping.rb +59 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/worktree.rb +62 -0
- data/lib/hecks/quality_control/cli/qa_main_gate.rb +135 -0
- data/lib/hecks/quality_control/cli/qa_postgres_role.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_pr_check/checking.rb +2 -3
- data/lib/hecks/quality_control/cli/qa_push_nudge.rb +48 -0
- data/lib/hecks/quality_control/cli/qa_seed_angles/seed.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_sweep/seat.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_tick/event_pump_step.rb +34 -0
- data/lib/hecks/quality_control/cli/qa_tick/output.rb +16 -1
- data/lib/hecks/quality_control/cli/qa_tick/push_nudge_step.rb +28 -0
- data/lib/hecks/quality_control/cli/qa_tick/quiesce_guard.rb +51 -0
- data/lib/hecks/quality_control/cli/qa_tick.rb +36 -8
- data/lib/hecks/quality_control/quality_control.behaviors +65 -0
- data/lib/hecks/quality_control/quality_control.bluebook +1131 -11
- data/lib/hecks/quality_control/quality_control.hecksagon +11 -0
- data/lib/hecks/quality_control/quality_control.ports.hecksagon +138 -0
- data/lib/hecks/query_ir/touchpoints.rb +5 -7
- data/lib/hecks/refused.rb +21 -0
- data/lib/hecks/release/approval.rb +6 -3
- data/lib/hecks/release/conditions.rb +46 -0
- data/lib/hecks/release/runner/gem_publisher.rb +4 -4
- data/lib/hecks/release/version_commit.rb +48 -0
- data/lib/hecks/runtime/command_interpreter/hydration.rb +5 -4
- data/lib/hecks/runtime/command_interpreter/persisting.rb +11 -3
- data/lib/hecks/runtime/command_interpreter.rb +2 -2
- data/lib/hecks/runtime/command_rules/admissibility.rb +0 -2
- data/lib/hecks/runtime/command_rules/emission.rb +0 -1
- data/lib/hecks/runtime/dependency_planning/expression_reads.rb +0 -1
- data/lib/hecks/runtime/dispatcher/planning.rb +24 -0
- data/lib/hecks/runtime/dispatcher/routing.rb +6 -0
- data/lib/hecks/runtime/dispatcher/value_routing.rb +54 -0
- data/lib/hecks/runtime/dispatcher.rb +7 -1
- data/lib/hecks/runtime/dry_run_plan.rb +60 -0
- data/lib/hecks/runtime/entity_element/location.rb +0 -1
- data/lib/hecks/runtime/entity_element/mutations.rb +0 -1
- data/lib/hecks/runtime/entity_interpreter/locating.rb +5 -0
- data/lib/hecks/runtime/entity_interpreter.rb +0 -1
- data/lib/hecks/runtime/errors.rb +26 -0
- data/lib/hecks/runtime/instance.rb +0 -1
- data/lib/hecks/runtime/invocation_builder.rb +0 -1
- data/lib/hecks/runtime/outbox/consumer_runner.rb +9 -1
- data/lib/hecks/runtime/outbox/relay.rb +25 -4
- data/lib/hecks/runtime/outbox/runnable.rb +3 -1
- data/lib/hecks/runtime/outbox.rb +6 -2
- data/lib/hecks/runtime/policy_interpreter/fan_out.rb +18 -2
- data/lib/hecks/runtime/policy_interpreter.rb +17 -9
- data/lib/hecks/runtime/port_operation_interpreter.rb +21 -7
- data/lib/hecks/runtime/query_interpreter/arguments.rb +6 -5
- data/lib/hecks/runtime/reaction_invocation.rb +0 -1
- data/lib/hecks/runtime/refusal_wording.rb +12 -1
- data/lib/hecks/runtime/registry/context_maps.rb +1 -5
- data/lib/hecks/runtime/registry/declarations.rb +34 -4
- data/lib/hecks/runtime/registry/hecksagon_rules.rb +15 -1
- data/lib/hecks/runtime/registry/runtime_state.rb +10 -0
- data/lib/hecks/runtime/registry/world_defaults.rb +24 -2
- data/lib/hecks/runtime/registry/world_names.rb +99 -0
- data/lib/hecks/runtime/registry.rb +33 -27
- data/lib/hecks/runtime/saga_interpreter/compensation.rb +10 -0
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +29 -3
- data/lib/hecks/runtime/saga_interpreter/delivery.rb +0 -1
- data/lib/hecks/runtime/saga_interpreter/lifecycle.rb +1 -1
- data/lib/hecks/runtime/saga_interpreter.rb +46 -2
- data/lib/hecks/runtime/value/coercion.rb +36 -8
- data/lib/hecks/rust_build/conformance.rb +16 -5
- data/lib/hecks/rust_build/parser.rb +25 -0
- data/lib/hecks/rust_build/project_rust/codegen_run.rb +45 -12
- data/lib/hecks/rust_build/project_rust/declared.rb +80 -0
- data/lib/hecks/rust_build/project_rust/features_header.rb +22 -0
- data/lib/hecks/rust_build/project_rust/manifest.rb +96 -0
- data/lib/hecks/rust_build/project_rust/meta.rb +36 -0
- data/lib/hecks/rust_build/project_rust.rb +28 -90
- data/lib/hecks/rust_build/write_if_changed.rb +19 -4
- data/lib/hecks/rust_build.rb +2 -1
- data/lib/hecks/rust_format.rb +32 -2
- data/lib/hecks/secrets.rb +111 -0
- data/lib/hecks/shape_ledger/edge_hygiene.rb +170 -0
- data/lib/hecks/shape_ledger/scope.rb +51 -0
- data/lib/hecks/shape_ledger/status.rb +89 -0
- data/lib/hecks/shape_ledger.rb +78 -33
- data/lib/hecks/site/bluebook/site.bluebook +1 -0
- data/lib/hecks/storehouse/audit.rb +34 -4
- data/lib/hecks/storehouse/callers.rb +8 -0
- data/lib/hecks/storehouse/dispatching.rb +14 -3
- data/lib/hecks/storehouse/identity.rb +41 -0
- data/lib/hecks/storehouse/querying.rb +7 -7
- data/lib/hecks/storehouse.rb +28 -10
- data/lib/hecks/tickets/bluebook/adapters/work_areas.adapter +7 -0
- data/lib/hecks/tickets/bluebook/adapters/work_limits.adapter +7 -0
- data/lib/hecks/tickets/bluebook/tickets.behaviors +70 -0
- data/lib/hecks/tickets/bluebook/tickets.bluebook +323 -28
- data/lib/hecks/tickets/bluebook/tickets.hecksagon +7 -0
- data/lib/hecks/tickets/bluebook/tickets.ports.hecksagon +17 -0
- data/lib/hecks/{cli → tools}/behaviors.rb +1 -1
- data/lib/hecks/{cli → tools}/canonicalise.rb +1 -1
- data/lib/hecks/{cli → tools}/check_engine_agreement.rb +1 -1
- data/lib/hecks/{cli → tools}/check_era.rb +6 -6
- data/lib/hecks/tools/ci_gates.rb +8 -2
- data/lib/hecks/tools/ci_workflows.rb +98 -0
- data/lib/hecks/{cli → tools}/console.rb +1 -1
- data/lib/hecks/{cli → tools}/deploy_template_diff.rb +1 -1
- data/lib/hecks/{cli → tools}/doc_coverage.rb +2 -2
- data/lib/hecks/{cli → tools}/document.rb +1 -1
- data/lib/hecks/{cli → tools}/domain_stub.rb +1 -1
- data/lib/hecks/{cli → tools}/domain_writer.rb +1 -1
- data/lib/hecks/tools/downstream_model_check.rb +122 -0
- data/lib/hecks/tools/evolve_run.rb +2 -2
- data/lib/hecks/{cli → tools}/expected_era.rb +1 -1
- data/lib/hecks/{cli → tools}/expression_projection.rb +1 -1
- data/lib/hecks/{cli → tools}/follow.rb +1 -1
- data/lib/hecks/tools/fuzz_sweep/options.rb +40 -5
- data/lib/hecks/tools/fuzz_sweep/pool.rb +12 -1
- data/lib/hecks/tools/fuzz_sweep/shards.rb +155 -0
- data/lib/hecks/tools/fuzz_sweep.rb +11 -5
- data/lib/hecks/tools/gate.rb +38 -29
- data/lib/hecks/tools/gate_memo/local_files.rb +33 -0
- data/lib/hecks/tools/gate_memo/rehearsal.rb +54 -0
- data/lib/hecks/tools/gate_memo/ruby_files.rb +152 -0
- data/lib/hecks/tools/gate_memo/session.rb +114 -0
- data/lib/hecks/tools/gate_memo/standalone.rb +67 -0
- data/lib/hecks/tools/gate_memo.rb +196 -0
- data/lib/hecks/tools/gate_report.rb +56 -0
- data/lib/hecks/{cli → tools}/history.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_agent.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_aggregate.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_draft.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_record.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_run.rb +2 -2
- data/lib/hecks/{cli → tools}/interview_session/agent_state.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session/catalog.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session/manual_findings.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session/proposals.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session.rb +2 -2
- data/lib/hecks/{cli → tools}/interview_shape/lifecycle.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_shape.rb +1 -1
- data/lib/hecks/{cli → tools}/ir.rb +1 -1
- data/lib/hecks/tools/lanes/files.rb +1 -1
- data/lib/hecks/tools/lanes/watch_workflow.rb +6 -8
- data/lib/hecks/tools/lanes/workflow.rb +1 -1
- data/lib/hecks/tools/lanes.rb +1 -1
- data/lib/hecks/{cli → tools}/mcp.rb +1 -1
- data/lib/hecks/{cli → tools}/model_check/examination.rb +1 -1
- data/lib/hecks/{cli → tools}/model_check/sources.rb +1 -1
- data/lib/hecks/{cli → tools}/model_check.rb +1 -1
- data/lib/hecks/tools/move_disables/reasons.rb +35 -0
- data/lib/hecks/tools/move_disables.rb +211 -0
- data/lib/hecks/tools/move_former_name.rb +105 -0
- data/lib/hecks/{cli → tools}/pattern_cases.rb +1 -1
- data/lib/hecks/{cli → tools}/persistence_notice.rb +1 -1
- data/lib/hecks/{cli → tools}/present.rb +1 -1
- data/lib/hecks/{cli → tools}/project_cli/launcher_source.rb +32 -22
- data/lib/hecks/{cli → tools}/project_cli/templates.rb +22 -15
- data/lib/hecks/{cli → tools}/project_cli.rb +11 -7
- data/lib/hecks/{cli → tools}/project_diagrams.rb +3 -3
- data/lib/hecks/{cli → tools}/project_glossary.rb +2 -2
- data/lib/hecks/{cli → tools}/reference.rb +2 -2
- data/lib/hecks/{cli → tools}/refresh_projections.rb +1 -1
- data/lib/hecks/{cli → tools}/refresh_rspec_runtime_baseline.rb +1 -1
- data/lib/hecks/tools/regeneration_run/pool.rb +148 -0
- data/lib/hecks/tools/regeneration_run/scratch.rb +76 -0
- data/lib/hecks/tools/regeneration_run.rb +125 -103
- data/lib/hecks/{cli → tools}/release.rb +1 -1
- data/lib/hecks/{cli → tools}/release_gem.rb +1 -1
- data/lib/hecks/{cli → tools}/rspec_io_parallel_files.rb +1 -1
- data/lib/hecks/{cli → tools}/rspec_shard_files.rb +1 -1
- data/lib/hecks/{cli → tools}/run.rb +9 -2
- data/lib/hecks/{cli → tools}/run_expectations.rb +1 -1
- data/lib/hecks/{cli → tools}/seed_semantics_corpus.rb +4 -4
- data/lib/hecks/{cli → tools}/serve_query_ir_mcp.rb +1 -1
- data/lib/hecks/{cli → tools}/shape.rb +3 -2
- data/lib/hecks/{cli → tools}/smoke_http/checks.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_http/settings.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_http/transport.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_http.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_test.rb +1 -1
- data/lib/hecks/{cli → tools}/spec_example.rb +1 -1
- data/lib/hecks/tools/stage_progress.rb +54 -0
- data/lib/hecks/{cli → tools}/statements.rb +1 -1
- data/lib/hecks/{cli → tools}/stores.rb +1 -1
- data/lib/hecks/{cli → tools}/stress_concurrency_specs/reporting.rb +1 -1
- data/lib/hecks/{cli → tools}/stress_concurrency_specs/usage.rb +4 -4
- data/lib/hecks/{cli → tools}/stress_concurrency_specs.rb +3 -3
- data/lib/hecks/tools/tenant_provisioning.rb +23 -0
- data/lib/hecks/tools/tools_doc.rb +10 -8
- data/lib/hecks/tools/translation_audit/edges.rb +21 -16
- data/lib/hecks/tools/translation_audit/verdicts.rb +1 -1
- data/lib/hecks/tools/translation_audit.rb +1 -1
- data/lib/hecks/tools/translation_scaffold.rb +1 -1
- data/lib/hecks/tools.rb +4 -1
- data/lib/hecks/version.rb +1 -1
- data/lib/hecks/vocabulary.rb +61 -31
- data/lib/hecks/workflow_pagination/judge.rb +48 -0
- data/lib/hecks/workflow_pagination/statement.rb +50 -0
- data/lib/hecks/workflow_pagination.rb +58 -0
- data/lib/hecks.rb +2 -0
- data/lib/rubocop/cop/hecks/bare_event_and_query_names.rb +58 -0
- data/lib/rubocop/cop/hecks/correlates_by_aggregate.rb +39 -0
- data/lib/rubocop/cop/hecks/creating_command_sets.rb +75 -0
- data/lib/rubocop/cop/hecks/invariant_expression_language.rb +47 -0
- data/lib/rubocop/cop/hecks/lifecycle_needs_attribute.rb +58 -0
- data/lib/rubocop/cop/hecks/no_id_string_attribute.rb +49 -0
- data/lib/rubocop/cop/hecks/one_terminal_mark_per_lifecycle.rb +47 -0
- data/lib/rubocop/cop/hecks/value_object_shorthand.rb +56 -0
- data/prebuilt/13c04bdc5970295b310f0a980d397ba722232c8da99cc1a0cdb383249921e871.marshal +0 -0
- data/prebuilt/e3857b77f47d9ecc1787b2e1f5136364f3cb3444ef4aea5479f3b98167affea2.marshal +0 -0
- data/qa/settings.yml +23 -0
- data/rust/.gitignore +0 -6
- data/rust/Cargo.toml +2 -1
- data/rust/build/Cargo.toml +1 -1
- data/rust/build/src/binding_pass.rs +57 -4
- data/rust/build/src/pipeline.rs +6 -4
- data/rust/build/src/resolve.rs +1 -0
- data/rust/codegen/Cargo.toml +1 -1
- data/rust/codegen/src/domain_generator.rs +3 -0
- data/rust/codegen/src/json_codec.rs +182 -23
- data/rust/codegen/src/one_of_references.rs +1 -0
- data/rust/codegen/src/queries.rs +20 -2
- data/rust/codegen/src/registry.rs +21 -5
- data/rust/expr/Cargo.toml +1 -1
- data/rust/host/Cargo.toml +1 -1
- data/rust/host/HECKS_RELEASE +1 -1
- data/rust/host/core/Cargo.toml +1 -1
- data/rust/host/src/bin/mint_harness.rs +1 -0
- data/rust/host/src/boot.rs +1 -0
- data/rust/host/src/store/mint.rs +40 -6
- data/rust/lsp/Cargo.toml +1 -1
- data/rust/parser/Cargo.toml +1 -1
- data/rust/parser/src/build/correlation_keys.rs +125 -0
- data/rust/parser/src/build/mod.rs +1 -0
- data/rust/parser/src/emit.rs +55 -3
- data/rust/parser/src/ir.rs +33 -1
- data/rust/parser/src/keywords.rs +289 -1
- data/rust/parser/src/main.rs +2 -0
- data/rust/parser/src/parse/aggregate.rs +10 -1
- data/rust/parser/src/parse/audience.rs +65 -0
- data/rust/parser/src/parse/command.rs +14 -0
- data/rust/parser/src/parse/declaration.rs +97 -0
- data/rust/parser/src/parse/domain_port.rs +6 -0
- data/rust/parser/src/parse/mod.rs +1 -0
- data/rust/parser/src/parse/process_manager.rs +17 -10
- data/rust/parser/src/parse/world.rs +12 -8
- data/rust/parser/src/render_ruby.rs +9 -0
- data/rust/parser/src/sentence/format.rs +3 -0
- data/rust/parser/src/sentence/process.rs +6 -2
- data/rust/src/exemplar/json.rs +17 -0
- data/rust/src/kernel/cli.rs +27 -3
- data/rust/src/kernel/dispatch.rs +4 -2
- data/rust/src/kernel/json.rs +62 -0
- data/rust/src/kernel/orchestrate.rs +28 -3
- data/rust/src/kernel/orchestrate_guard_tests.rs +12 -12
- data/rust/web/Cargo.toml +1 -1
- metadata +389 -96
- data/lib/hecks/cli/command_table.rb +0 -72
- data/lib/hecks/cli/launcher_words.rb +0 -168
- data/lib/hecks/cli.rb +0 -133
- data/lib/hecks/hecks/agents.bluebook +0 -246
- data/lib/hecks/hecks/codebase.bluebook +0 -3209
- data/lib/hecks/hecks/custodian.bluebook +0 -1300
- data/lib/hecks/hecks/ledger.bluebook +0 -190
- data/lib/hecks/hecks/rehearsal.bluebook +0 -437
- data/lib/hecks/hecks/tooling.bluebook +0 -1234
- data/lib/hecks/hecks/translations/2-148748.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-15a2e4.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-1b447c.bluebook +0 -5
- data/lib/hecks/hecks/translations/2-240474.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-44446d.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-46ca26.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-473eab.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-75cc28.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-781c07.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-84c18b.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-aa5fff.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-bfdb48.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-cd96d8.bluebook +0 -10
- data/lib/hecks/hecks/translations/2-d43f71.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-eea577.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-f53248.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-fbb677.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-ffdf12.bluebook +0 -6
- data/lib/hecks/quality_control/adapters/clearance_recorder.rb +0 -36
- data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +0 -56
- data/prebuilt/31cf81e12f16236ad26249be590cfea3799c9db67432e6a4ef54b801c355b6ae.marshal +0 -0
- data/prebuilt/68ecb2bd3abb1a221007db4f2b0375834c13aaccac8f2b99778e8517f11aa113.marshal +0 -0
- data/prebuilt/verdicts-0328c2403383837d780ad5ed81d1da351c56436b894cf9015b5d56b8f1f1bf10.json +0 -1
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "open3"
|
|
4
|
+
require_relative "reading"
|
|
5
|
+
require_relative "branch_guard"
|
|
6
|
+
|
|
7
|
+
module Hecks
|
|
8
|
+
module Adapters
|
|
9
|
+
class GitTrain
|
|
10
|
+
# What a boarding does to a checkout before its carriage carries it: brings the branch up to
|
|
11
|
+
# its remote, and settles an additive shape change into a commit the carriage then pushes.
|
|
12
|
+
#
|
|
13
|
+
# It works on the boarded branch only: to change anything, the checkout must have that branch
|
|
14
|
+
# checked out and clean, and the branch must still name the boarded commit. Its own commit
|
|
15
|
+
# names the ledger paths it wrote, so nothing already staged is swept in.
|
|
16
|
+
#
|
|
17
|
+
# A rebase stops only on the ledger file, which is regenerated rather than merged: the
|
|
18
|
+
# upstream copy is taken and the ledger is settled after. Any other conflict aborts the
|
|
19
|
+
# rebase and is reported by path.
|
|
20
|
+
class Settlement
|
|
21
|
+
include Reading
|
|
22
|
+
|
|
23
|
+
# The shape ledger a Hecks checkout keeps, beside the bluebooks it records.
|
|
24
|
+
LEDGER = "lib/hecks/hecks/shapes.json"
|
|
25
|
+
|
|
26
|
+
# The translation edges an additive settlement writes.
|
|
27
|
+
EDGES = "lib/hecks/hecks/translations"
|
|
28
|
+
|
|
29
|
+
# The ledger's own command for an additive change, run from the checkout.
|
|
30
|
+
SETTLE = %w[bundle exec exe/hecks conformance_run.check_shape_ledger! --confirm --additive --wait].freeze
|
|
31
|
+
|
|
32
|
+
# The drift checks CI runs after a push lands, run here in check mode before the push: the
|
|
33
|
+
# generated Rust must match a regeneration, and the reserved-name tables and the CI gate
|
|
34
|
+
# rows must match their projections. Each only compares; none rewrites a file.
|
|
35
|
+
DRIFT = [
|
|
36
|
+
%w[bundle exec exe/hecks regeneration_run.regenerate_corpus! --check --wait],
|
|
37
|
+
%w[bundle exec exe/hecks gate_run.gate! stage=ci only=vocabulary_drift --wait],
|
|
38
|
+
%w[bundle exec exe/hecks gate_run.gate! stage=ci only=ci_gates --wait]
|
|
39
|
+
].freeze
|
|
40
|
+
|
|
41
|
+
# How many rebase steps are tried before the rebase is given up as stuck.
|
|
42
|
+
STEPS = 50
|
|
43
|
+
|
|
44
|
+
# @param git [Git] the adapter every git call goes through
|
|
45
|
+
# @param checkout [String] the repository's top level
|
|
46
|
+
# @param branch [String] the branch being boarded
|
|
47
|
+
# @param remote [String] the remote the branch is pushed to
|
|
48
|
+
# @param drift [Array<Array<String>>] the drift checks a Hecks checkout must pass; the
|
|
49
|
+
# `DRIFT` list by default, and a spec replaces it
|
|
50
|
+
def initialize(git, checkout, branch:, remote:, drift: DRIFT)
|
|
51
|
+
@git = git
|
|
52
|
+
@checkout = checkout
|
|
53
|
+
@branch = branch
|
|
54
|
+
@remote = remote
|
|
55
|
+
@drift = drift
|
|
56
|
+
@guard = BranchGuard.new(git, checkout, branch)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# @param boarded [String] the commit the branch named at boarding
|
|
60
|
+
# @return [String] the commit the branch names now, which the carriage then carries
|
|
61
|
+
# @raise [ConsoleCapture::Failure] when the branch moved since boarding, the checkout is not
|
|
62
|
+
# on the branch or not clean, the rebase conflicts outside the ledger, or the ledger
|
|
63
|
+
# cannot be settled
|
|
64
|
+
def run(boarded)
|
|
65
|
+
fetch
|
|
66
|
+
@expected = boarded
|
|
67
|
+
@guard.unmoved!(boarded)
|
|
68
|
+
rebasing = !ancestor?(tracking, @branch)
|
|
69
|
+
@guard.checked_out! if rebasing || ledger? || hecks_checkout?
|
|
70
|
+
rebase if rebasing
|
|
71
|
+
settle_ledger if ledger?
|
|
72
|
+
check_drift if hecks_checkout?
|
|
73
|
+
@guard.unmoved!(@expected)
|
|
74
|
+
@expected
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
def tracking = "#{@remote}/#{@branch}"
|
|
80
|
+
|
|
81
|
+
def fetch = read("fetch", "--quiet", @remote, "+refs/heads/#{@branch}:refs/remotes/#{tracking}")
|
|
82
|
+
|
|
83
|
+
def ledger? = File.exist?(File.join(@checkout, LEDGER))
|
|
84
|
+
|
|
85
|
+
def hecks_checkout? = File.exist?(File.join(@checkout, "exe", "hecks"))
|
|
86
|
+
|
|
87
|
+
# Rebases the local branch onto its remote. Stops on the ledger, takes the remote's copy of
|
|
88
|
+
# it, and continues; any other conflicted path aborts the rebase.
|
|
89
|
+
def rebase
|
|
90
|
+
@guard.clean!
|
|
91
|
+
rebase_onto_remote
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def rebase_onto_remote
|
|
95
|
+
result = git(["rebase", tracking])
|
|
96
|
+
STEPS.times do
|
|
97
|
+
return @expected = @guard.head if result.ok?
|
|
98
|
+
|
|
99
|
+
conflicted = read("diff", "--name-only", "--diff-filter=U").lines.map(&:strip)
|
|
100
|
+
return abort_rebase!(conflicted) unless conflicted == [LEDGER]
|
|
101
|
+
|
|
102
|
+
read("checkout", "--ours", "--", LEDGER)
|
|
103
|
+
read("add", "--", LEDGER)
|
|
104
|
+
result = git(["-c", "core.editor=true", "rebase", "--continue"])
|
|
105
|
+
end
|
|
106
|
+
raise ConsoleCapture::Failure, "rebase onto #{tracking} did not finish in #{STEPS} steps"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def abort_rebase!(conflicted)
|
|
110
|
+
git(["rebase", "--abort"])
|
|
111
|
+
raise ConsoleCapture::Failure,
|
|
112
|
+
"#{@branch} does not rebase onto #{tracking}: conflict in #{conflicted.join(", ")}; resolve them by hand"
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Runs the ledger's own settlement for an additive change, and commits what it wrote. A
|
|
116
|
+
# change that is not additive is refused by the settlement, and the refusal stops it.
|
|
117
|
+
def settle_ledger
|
|
118
|
+
ledger_untouched!
|
|
119
|
+
out, err, status = Open3.capture3(*SETTLE, chdir: @checkout)
|
|
120
|
+
refusal = out.lines.find { |line| line.include?('"refusal": "') }
|
|
121
|
+
raise ConsoleCapture::Failure, "the shape ledger was not settled: #{refusal.strip}" if refusal
|
|
122
|
+
raise ConsoleCapture::Failure, "the shape ledger command failed: #{err.strip}" unless status.success?
|
|
123
|
+
|
|
124
|
+
commit_ledger
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# The ledger files must hold no edits of anyone's before the settlement writes its own.
|
|
128
|
+
def ledger_untouched!
|
|
129
|
+
return if read("status", "--porcelain", "--", LEDGER, EDGES).empty?
|
|
130
|
+
|
|
131
|
+
raise ConsoleCapture::Failure, "#{LEDGER} or #{EDGES} has uncommitted changes; commit or discard them before boarding"
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Runs each drift check in check mode. The first that finds drift refuses the boarding and
|
|
135
|
+
# names the check and the end of what it printed; nothing is rewritten here.
|
|
136
|
+
def check_drift
|
|
137
|
+
@drift.each do |argv|
|
|
138
|
+
out, status = Open3.capture2e(*argv, chdir: @checkout)
|
|
139
|
+
next if status.success?
|
|
140
|
+
|
|
141
|
+
raise ConsoleCapture::Failure, "#{argv.drop(2).join(" ")} found drift; regenerate and commit it first: #{tail(out)}"
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# The last three lines of what a check printed, as one line.
|
|
146
|
+
def tail(out)
|
|
147
|
+
last = out.lines.last(3)
|
|
148
|
+
last.join.strip
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def commit_ledger
|
|
152
|
+
changed = read("status", "--porcelain", "--", LEDGER, EDGES)
|
|
153
|
+
return if changed.empty?
|
|
154
|
+
|
|
155
|
+
@guard.clean!(except: [LEDGER, EDGES])
|
|
156
|
+
|
|
157
|
+
written = [LEDGER, EDGES].select { |path| File.exist?(File.join(@checkout, path)) }
|
|
158
|
+
read("add", "--", *written)
|
|
159
|
+
read("commit", "-q", "-m", "Settle the shape ledger before boarding", "--", *written)
|
|
160
|
+
@expected = @guard.head
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def git(args) = @git.capture(*args, chdir: @checkout)
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative "git"
|
|
4
4
|
require_relative "console_capture"
|
|
5
|
+
require_relative "push_size"
|
|
5
6
|
require_relative "git_train/reading"
|
|
6
7
|
require_relative "git_train/bench"
|
|
7
8
|
require_relative "git_train/local_branch"
|
|
8
9
|
require_relative "git_train/carriage"
|
|
9
10
|
require_relative "git_train/survey"
|
|
11
|
+
require_relative "git_train/settlement"
|
|
12
|
+
require_relative "git_train/mint_step"
|
|
13
|
+
require_relative "git_train/launcher_shape"
|
|
10
14
|
|
|
11
15
|
module Hecks
|
|
12
16
|
module Adapters
|
|
@@ -15,37 +19,55 @@ module Hecks
|
|
|
15
19
|
# A boarding takes an exclusive `flock` on a file in the repository's common git directory, so
|
|
16
20
|
# every worktree of one repository waits in the same line, and holds it until its push ends.
|
|
17
21
|
# Waiting costs nothing: the pre-push checks of one push run at a time instead of all at once.
|
|
22
|
+
#
|
|
23
|
+
# Holding the line, a boarding names the commit the branch holds (`boarded`), checks that the
|
|
24
|
+
# train runs that commit's shape (`LauncherShape`), runs the Hecks mint (`MintStep`), then
|
|
25
|
+
# settles and pushes: one step after the other, so a refusal stops the boarding before
|
|
26
|
+
# anything is pushed. What is pushed is that commit, settled, and nothing else: a branch that
|
|
27
|
+
# moved meanwhile is refused.
|
|
18
28
|
class GitTrain
|
|
19
29
|
include Reading
|
|
20
30
|
|
|
21
31
|
# The lock's file, in the repository's common git directory.
|
|
22
32
|
LOCK_FILE = "hecks-push-train.lock"
|
|
23
33
|
|
|
24
|
-
# Accepts the arguments every driven adapter is built with
|
|
34
|
+
# Accepts the arguments every driven adapter is built with.
|
|
25
35
|
#
|
|
26
36
|
# @param aggregate [Object, nil] unused
|
|
27
37
|
# @param settings [Hash] unused
|
|
28
38
|
# @param root [String, nil] unused
|
|
29
|
-
|
|
39
|
+
# @param options [Hash] `mint:` the mint a boarding runs first (the Hecks domain's if none);
|
|
40
|
+
# `domain:` the launcher's Hecks domain directory the train's shape is read from (the one
|
|
41
|
+
# this code runs from by default); `registry:` the booted registry whose world names the
|
|
42
|
+
# push size
|
|
43
|
+
def initialize(aggregate: nil, settings: {}, root: nil, **options)
|
|
44
|
+
@registry = options.delete(:registry)
|
|
45
|
+
@mint = options.delete(:mint) || MintStep.new
|
|
46
|
+
@domain = options.delete(:domain) || JournalStore::HeldMint::DOMAIN
|
|
30
47
|
@git = Git.new
|
|
31
48
|
end
|
|
32
49
|
|
|
33
|
-
# Waits for the push ahead in the same repository, then carries the
|
|
50
|
+
# Waits for the push ahead in the same repository, runs the Hecks mint, then carries the
|
|
51
|
+
# boarded commit.
|
|
34
52
|
#
|
|
35
|
-
# @param held [Hash] the `
|
|
36
|
-
# inside the repository; the current directory when none is named) and
|
|
37
|
-
#
|
|
38
|
-
# @return [Hash{Symbol => Hash}] `outcome
|
|
39
|
-
# `pushed:` and `report
|
|
40
|
-
# @raise [ConsoleCapture::Failure] when the checkout is not a repository, the branch
|
|
41
|
-
#
|
|
53
|
+
# @param held [Hash] the `SendTrain` record: `run`, `confirm`, `branch`, `remote`, `checkout`
|
|
54
|
+
# (a directory inside the repository; the current directory when none is named) and
|
|
55
|
+
# `full_gate` (the whole pre-push stage, which the hook reads as `hecks.fullGate`)
|
|
56
|
+
# @return [Hash{Symbol => Hash}] `outcome:`, `checkout:`, `boarded:` (the commit named at
|
|
57
|
+
# boarding), `pushed:` and `report:`, which opens with what the mint did
|
|
58
|
+
# @raise [ConsoleCapture::Failure] when the checkout is not a repository, the branch moved
|
|
59
|
+
# since boarding, the train is not at the boarded commit, the branch and the remote's
|
|
60
|
+
# conflict, or the push is refused
|
|
61
|
+
# @raise [Runtime::WiringError] when the mint refuses, before anything is pushed
|
|
42
62
|
def carry(**held)
|
|
43
63
|
@checkout = toplevel(plain(held[:checkout]) || Dir.pwd)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
64
|
+
in_turn do
|
|
65
|
+
size = push_size(held)
|
|
66
|
+
boarded = boarded_commit(held)
|
|
67
|
+
LauncherShape.new(@git, @checkout, domain: @domain).check!(boarded)
|
|
68
|
+
minted = @mint.run(run: plain(held[:run]), confirm: plain(held[:confirm]))
|
|
69
|
+
after_mint(minted, boarded, settle_and_carry(held, boarded), size)
|
|
70
|
+
end
|
|
49
71
|
end
|
|
50
72
|
|
|
51
73
|
# Lists every checkout under a directory whose default branch has commits its remote does
|
|
@@ -64,6 +86,42 @@ module Hecks
|
|
|
64
86
|
|
|
65
87
|
private
|
|
66
88
|
|
|
89
|
+
# The commit the branch names as the boarding begins, read once the line is held.
|
|
90
|
+
def boarded_commit(held)
|
|
91
|
+
Carriage.new(@git, @checkout, branch: branch_of(held), remote: remote_of(held)).local_head
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Brings the branch up to its remote and settles the shape ledger, then carries the settled
|
|
95
|
+
# commit.
|
|
96
|
+
def settle_and_carry(held, boarded)
|
|
97
|
+
branch = branch_of(held)
|
|
98
|
+
remote = remote_of(held)
|
|
99
|
+
settled = Settlement.new(@git, @checkout, branch: branch, remote: remote).run(boarded)
|
|
100
|
+
carriage = Carriage.new(@git, @checkout, branch: branch, remote: remote, config: gate_config(held))
|
|
101
|
+
[carriage.carry(settled), settled]
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# What the push is, said before it is made: how many commits go and, past the world's
|
|
105
|
+
# threshold, the size sentence. It only says; a push of any size is carried.
|
|
106
|
+
def push_size(held)
|
|
107
|
+
ahead = read("rev-list", "--count", "#{remote_of(held)}/#{branch_of(held)}..#{branch_of(held)}").to_i
|
|
108
|
+
sentence = PushSize.sentence(ahead, PushSize.thresholds(@registry))
|
|
109
|
+
sentence.empty? ? "pushing #{ahead} commits" : "pushing #{ahead} commits; #{sentence}"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def branch_of(held) = plain(held[:branch]) || "main"
|
|
113
|
+
|
|
114
|
+
def remote_of(held) = plain(held[:remote]) || "origin"
|
|
115
|
+
|
|
116
|
+
# The carriage's answer, its report opened with what the mint did and naming the boarded
|
|
117
|
+
# commit (and the settled one when settlement moved the branch).
|
|
118
|
+
def after_mint(minted, boarded, carried, size = nil)
|
|
119
|
+
answer, settled = carried
|
|
120
|
+
named = settled == boarded ? "boarded #{boarded[0, 9]}" : "boarded #{boarded[0, 9]}, settled to #{settled[0, 9]}"
|
|
121
|
+
report = "#{"#{size}\n" if size}#{minted}, then #{named}: #{answer.dig(:report, :value)}"
|
|
122
|
+
answer.merge(boarded: { value: boarded }, report: { value: report })
|
|
123
|
+
end
|
|
124
|
+
|
|
67
125
|
# A git hook takes no arguments, so the argument reaches the pre-push hook as git
|
|
68
126
|
# configuration, for this push only (`git -c`).
|
|
69
127
|
def gate_config(held) = plain(held[:full_gate]) == true ? ["-c", "hecks.fullGate=true"] : []
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Required by name, not relative to this file: a fuzz or model check boots a copy of this directory,
|
|
2
|
+
# and the implementation must load once, from `lib/`, not from the copy.
|
|
3
|
+
require "hecks/hecks/adapters/git_worktree_add"
|
|
4
|
+
|
|
5
|
+
Hecks.adapter "GitWorktreeAdd" do
|
|
6
|
+
port "WorktreeAdding"
|
|
7
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "git_worktrees"
|
|
4
|
+
require_relative "git_main_pull"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module Adapters
|
|
8
|
+
# The `WorktreeAdding` port's adapter for `Worktree`: opens a linked worktree on a new branch cut from
|
|
9
|
+
# `main` (pulled first, see {GitMainPull}), at the path named or under the checkout's
|
|
10
|
+
# `.claude/worktrees`.
|
|
11
|
+
#
|
|
12
|
+
# It never checks out `main` in a worktree, never pushes, and never forces. A branch that already exists
|
|
13
|
+
# is declined by git, and the reason travels back on the record.
|
|
14
|
+
class GitWorktreeAdd
|
|
15
|
+
include GitWorktrees
|
|
16
|
+
include GitMainPull
|
|
17
|
+
|
|
18
|
+
# Accepts the arguments every driven adapter is built with and keeps none of them.
|
|
19
|
+
#
|
|
20
|
+
# @param aggregate [Object, nil] unused
|
|
21
|
+
# @param settings [Hash] unused
|
|
22
|
+
# @param root [String, nil] unused
|
|
23
|
+
def initialize(aggregate: nil, settings: {}, root: nil)
|
|
24
|
+
@git = Git.new
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Opens the worktree, then reads the sha it stands on.
|
|
28
|
+
#
|
|
29
|
+
# @param held [Hash] the `Worktree` record: `checkout` (a directory inside the repository; the current
|
|
30
|
+
# directory when absent), `branch` (a new branch name), and `path` (optional)
|
|
31
|
+
# @return [Hash{Symbol => Hash}] `sha:` the commit it stands on, `report:` where it is
|
|
32
|
+
# @raise [ConsoleCapture::Failure] on a missing branch, a branch named main, or a directory outside a repository
|
|
33
|
+
def create(**held)
|
|
34
|
+
repo = settle(held)
|
|
35
|
+
branch = branch_named(held)
|
|
36
|
+
path = plain(held[:path]).to_s.strip
|
|
37
|
+
path = File.join(repo, ".claude", "worktrees", branch) if path.empty?
|
|
38
|
+
pulled = pull_main
|
|
39
|
+
read("worktree", "add", "-b", branch, path, "main")
|
|
40
|
+
sha = read("rev-parse", "--short", "HEAD", dir: path)
|
|
41
|
+
{ path: { value: path }, sha: { value: sha }, report: { value: "opened #{path} on #{branch}; #{pulled}" } }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Brings local `main` up to date with `origin/main`: a fast-forward, or a rebase of its
|
|
45
|
+
# unpushed commits when both moved. Refuses a dirty checkout or a rebase in progress.
|
|
46
|
+
#
|
|
47
|
+
# @param held [Hash] the `LinkedTree` record: `checkout` (a directory inside the repository)
|
|
48
|
+
# @return [Hash{Symbol => Hash}] `sha:` where `main` stands, `report:` what was done
|
|
49
|
+
# @raise [ConsoleCapture::Failure] `cannot pull main: ...` with the reason
|
|
50
|
+
def pull(**held)
|
|
51
|
+
settle(held)
|
|
52
|
+
said = pull_main
|
|
53
|
+
{ sha: { value: read("rev-parse", "--short", "main") }, report: { value: said } }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
# The branch a worktree is cut on: a name, and never main.
|
|
59
|
+
def branch_named(held)
|
|
60
|
+
branch = plain(held[:branch]).to_s.strip
|
|
61
|
+
raise ConsoleCapture::Failure, "a worktree needs a branch" if branch.empty?
|
|
62
|
+
raise ConsoleCapture::Failure, "a worktree is not opened on main" if branch == "main"
|
|
63
|
+
|
|
64
|
+
branch
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Required by name, not relative to this file: a fuzz or model check boots a copy of this directory,
|
|
2
|
+
# and the implementation must load once, from `lib/`, not from the copy.
|
|
3
|
+
require "hecks/hecks/adapters/github_pull_requests"
|
|
4
|
+
|
|
5
|
+
Hecks.adapter "GithubPullRequests" do
|
|
6
|
+
port "GitHubPullRequests"
|
|
7
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
require "open3"
|
|
5
|
+
require_relative "console_capture"
|
|
6
|
+
|
|
7
|
+
module Hecks
|
|
8
|
+
module Adapters
|
|
9
|
+
# The `GitHubPullRequests` port's adapter: opens, squash-merges and reads pull requests of the
|
|
10
|
+
# repository the current directory is in, through `gh`.
|
|
11
|
+
#
|
|
12
|
+
# The aggregate has already recorded the request. Nothing here decides whether a pull request
|
|
13
|
+
# should be opened or merged; it only asks GitHub and reports what GitHub answered. A merge is
|
|
14
|
+
# always a squash, and `--admin` is never passed, so a branch protection rule is not bypassed.
|
|
15
|
+
class GithubPullRequests
|
|
16
|
+
# A pull request number: digits only.
|
|
17
|
+
NUMBER = /\A\d+\z/
|
|
18
|
+
|
|
19
|
+
# @param aggregate [Object, nil] unused
|
|
20
|
+
# @param settings [Hash] unused
|
|
21
|
+
# @param root [String, nil] unused
|
|
22
|
+
# @param runner [#call, nil] runs `gh` with its arguments, answering `[stdout, stderr, success]`;
|
|
23
|
+
# the real `gh` when nil. A spec replaces it.
|
|
24
|
+
def initialize(aggregate: nil, settings: {}, root: nil, runner: nil)
|
|
25
|
+
@runner = runner || method(:run_gh)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Opens a pull request from a branch onto a base, its title and body taken from the commits.
|
|
29
|
+
#
|
|
30
|
+
# @param held [Hash] the `PullRequest` record: `branch` (required), `base` (`main` when absent)
|
|
31
|
+
# @return [Hash{Symbol => Hash}] `outcome:` (`opened`), `number:`, `url:` and `report:`
|
|
32
|
+
# @raise [ConsoleCapture::Failure] when no branch is named, or GitHub refuses
|
|
33
|
+
def create(**held)
|
|
34
|
+
branch = plain(held[:branch]) or raise ConsoleCapture::Failure, "no branch to open a pull request from"
|
|
35
|
+
base = plain(held[:base]) || "main"
|
|
36
|
+
out = gh!("pr", "create", "--head", branch, "--base", base, "--fill")
|
|
37
|
+
url = pull_request_url(out)
|
|
38
|
+
number = url&.split("/")&.last
|
|
39
|
+
raise ConsoleCapture::Failure, "gh pr create printed no pull request URL: #{out.strip.inspect}" unless number
|
|
40
|
+
|
|
41
|
+
{ outcome: { value: "opened" }, number: { value: number }, url: { value: url },
|
|
42
|
+
report: { value: "opened ##{number} from #{branch} onto #{base}: #{url}" } }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Squash-merges one open pull request by its number.
|
|
46
|
+
#
|
|
47
|
+
# @param held [Hash] the `PullRequest` record: `number` (required)
|
|
48
|
+
# @return [Hash{Symbol => Hash}] `outcome:` (`merged`), `number:` and `report:`
|
|
49
|
+
# @raise [ConsoleCapture::Failure] when no number is named, or GitHub refuses
|
|
50
|
+
def squash(**held)
|
|
51
|
+
number = pull_request_number(held[:number], "merge")
|
|
52
|
+
gh!("pr", "merge", number, "--squash")
|
|
53
|
+
|
|
54
|
+
{ outcome: { value: "merged" }, number: { value: number },
|
|
55
|
+
report: { value: "squash-merged ##{number}" } }
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# The state of one pull request, as text: its number, state, URL and checks.
|
|
59
|
+
#
|
|
60
|
+
# @param held [Hash] the query's arguments: `number` (required)
|
|
61
|
+
# @return [Hash{Symbol => String}] `text:` one `name: value` line each
|
|
62
|
+
# @raise [ConsoleCapture::Failure] when no number is named, or GitHub refuses
|
|
63
|
+
def status(**held)
|
|
64
|
+
number = pull_request_number(held[:number], "read")
|
|
65
|
+
view = JSON.parse(gh!("pr", "view", number, "--json", "number,state,url,mergedAt,statusCheckRollup"))
|
|
66
|
+
{ text: "#{status_lines(view).join("\n")}\n" }
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
private
|
|
70
|
+
|
|
71
|
+
def plain(argument) = argument.is_a?(Hash) ? argument[:value] : argument
|
|
72
|
+
|
|
73
|
+
# A pull request's number, digits only: gh reads a value that starts with a dash as an option.
|
|
74
|
+
def pull_request_number(argument, verb)
|
|
75
|
+
number = plain(argument)
|
|
76
|
+
return number if number.to_s.match?(NUMBER)
|
|
77
|
+
|
|
78
|
+
raise ConsoleCapture::Failure, "no pull request number to #{verb}, or it is not a number: #{number.inspect}"
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# The first line of gh's output that is a URL; `gh pr create` prints the new pull request's.
|
|
82
|
+
def pull_request_url(out) = out.lines.find { |line| line.start_with?("https://") }&.strip
|
|
83
|
+
|
|
84
|
+
def status_lines(view)
|
|
85
|
+
checks = Array(view["statusCheckRollup"]).map { |check| "#{check["name"]}=#{check_state(check)}" }
|
|
86
|
+
["number: #{view["number"]}", "state: #{view["state"]}", "url: #{view["url"]}",
|
|
87
|
+
"merged: #{view["mergedAt"] || "no"}", "checks: #{checks.empty? ? "none" : checks.join(", ")}"]
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# A check's conclusion once it has one, and its state while it is still pending.
|
|
91
|
+
def check_state(check) = check["conclusion"].to_s.empty? ? check["state"] : check["conclusion"]
|
|
92
|
+
|
|
93
|
+
# Runs `gh` and returns its stdout, or raises `ConsoleCapture::Failure` with its reason.
|
|
94
|
+
def gh!(*arguments)
|
|
95
|
+
out, err, ok = @runner.call(arguments)
|
|
96
|
+
return out if ok
|
|
97
|
+
|
|
98
|
+
raise ConsoleCapture::Failure, "gh #{arguments.first(2).join(" ")} failed: #{err.strip.empty? ? out.strip : err.strip}"
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def run_gh(arguments)
|
|
102
|
+
out, err, status = Open3.capture3("gh", *arguments)
|
|
103
|
+
[out, err, status.success?]
|
|
104
|
+
rescue Errno::ENOENT
|
|
105
|
+
["", "gh is not installed", false]
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
require "stringio"
|
|
4
4
|
require_relative "console_capture"
|
|
5
|
-
require "hecks/
|
|
6
|
-
require "hecks/
|
|
5
|
+
require "hecks/tools/smoke_http"
|
|
6
|
+
require "hecks/tools/check_era"
|
|
7
7
|
|
|
8
8
|
module Hecks
|
|
9
9
|
module Adapters
|
|
@@ -29,7 +29,7 @@ module Hecks
|
|
|
29
29
|
# @raise [ConsoleCapture::Failure] when any check failed
|
|
30
30
|
def probe(**held)
|
|
31
31
|
out = StringIO.new
|
|
32
|
-
status =
|
|
32
|
+
status = Tools::SmokeHttp.new(Tools::SmokeHttp.resolve(probe_options(held).compact, ENV), out: out).run
|
|
33
33
|
raise ConsoleCapture::Failure, out.string.strip unless status.zero?
|
|
34
34
|
|
|
35
35
|
{ output: { value: out.string } }
|
|
@@ -44,12 +44,12 @@ module Hecks
|
|
|
44
44
|
# `mismatch`) and `report:` (the sentence `hecks check_era` prints)
|
|
45
45
|
# @raise [ArgumentError] if no allow-list file or timeout was given
|
|
46
46
|
# @raise [Errno::ENOENT] if the allow-list file cannot be read
|
|
47
|
-
# @raise [
|
|
48
|
-
# @raise [
|
|
47
|
+
# @raise [Tools::ExpectedEra::Unreachable] if the host cannot be reached
|
|
48
|
+
# @raise [Tools::ExpectedEra::BadResponse] if it answers no era
|
|
49
49
|
def fetch(**held)
|
|
50
50
|
file = required(held[:expected], "no allow-list file to compare the era with")
|
|
51
51
|
timeout = required(held[:timeout], "no timeout to wait for the host with")
|
|
52
|
-
finding =
|
|
52
|
+
finding = Tools::CheckEra.assess(plain(held[:host]), file, timeout: timeout.to_f)
|
|
53
53
|
verdict = finding.verdict
|
|
54
54
|
|
|
55
55
|
{ era: { value: verdict.era }, version: { value: finding.version },
|
|
@@ -5,11 +5,12 @@ require "hecks"
|
|
|
5
5
|
# A domain wired to PostgresEra needs this plugin loaded explicitly, and the `:shape` projection
|
|
6
6
|
# reads `Runtime::StorageShape` from it (ADR 0033).
|
|
7
7
|
require_relative "../../ports/persistence/plugins/era"
|
|
8
|
-
require_relative "../../
|
|
9
|
-
require_relative "../../
|
|
10
|
-
require_relative "../../
|
|
8
|
+
require_relative "../../tools/stores"
|
|
9
|
+
require_relative "../../tools/shape"
|
|
10
|
+
require_relative "../../tools/history"
|
|
11
11
|
require_relative "../../projections/context_map_diagram"
|
|
12
12
|
require_relative "in_process_operations"
|
|
13
|
+
require_relative "in_process_undo"
|
|
13
14
|
require_relative "in_process_access"
|
|
14
15
|
|
|
15
16
|
module Hecks
|
|
@@ -28,6 +29,7 @@ module Hecks
|
|
|
28
29
|
class InProcessBoot
|
|
29
30
|
include InProcessOperations
|
|
30
31
|
include InProcessAccess
|
|
32
|
+
include InProcessUndo
|
|
31
33
|
|
|
32
34
|
# Accepts the arguments every driven adapter is built with and keeps none of them.
|
|
33
35
|
#
|
|
@@ -56,7 +58,7 @@ module Hecks
|
|
|
56
58
|
# one `<Domain> <label>` line per domain for a directory
|
|
57
59
|
# @raise [Runtime::NotFound] if the path does not exist or holds no bluebook
|
|
58
60
|
def shape(domain:)
|
|
59
|
-
report(
|
|
61
|
+
report(Tools::Shape.render(plain(domain)))
|
|
60
62
|
end
|
|
61
63
|
|
|
62
64
|
# @param domain [Hash, String] a domain directory
|
|
@@ -68,8 +70,8 @@ module Hecks
|
|
|
68
70
|
# @raise [Runtime::NotFound] if the domain, aggregate or record cannot be found
|
|
69
71
|
def stores(domain:, aggregate: nil, record: nil, flat: nil)
|
|
70
72
|
registry = boot(domain).registry
|
|
71
|
-
|
|
72
|
-
report(JSON.generate(
|
|
73
|
+
Tools::PersistenceNotice.announce(registry, program: "hecks stores")
|
|
74
|
+
report(JSON.generate(Tools::Stores.read(registry, plain(aggregate), plain(record), flat: plain(flat) == true)))
|
|
73
75
|
end
|
|
74
76
|
|
|
75
77
|
# @param domain [Hash, String] a domain directory
|
|
@@ -78,8 +80,8 @@ module Hecks
|
|
|
78
80
|
# @raise [Runtime::NotFound] if the domain cannot be found
|
|
79
81
|
def history(domain:)
|
|
80
82
|
registry = boot(domain).registry
|
|
81
|
-
|
|
82
|
-
report(JSON.generate(
|
|
83
|
+
Tools::PersistenceNotice.announce(registry, program: "hecks history")
|
|
84
|
+
report(JSON.generate(Tools::History.document(registry)))
|
|
83
85
|
end
|
|
84
86
|
|
|
85
87
|
# @param domain [Hash, String] a domain directory
|