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
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative "git_worktrees"
|
|
4
|
+
require_relative "git_main_pull"
|
|
4
5
|
require_relative "git_landing/merger"
|
|
6
|
+
require_relative "git_landing/tidy"
|
|
7
|
+
require_relative "git_landing/rivals"
|
|
8
|
+
require_relative "git_landing/finisher"
|
|
9
|
+
require_relative "git_landing/lineup"
|
|
10
|
+
require_relative "../../indifferent_key"
|
|
5
11
|
|
|
6
12
|
module Hecks
|
|
7
13
|
module Adapters
|
|
@@ -12,17 +18,24 @@ module Hecks
|
|
|
12
18
|
# that holds uncommitted work or a branch with commits `main` lacks, so no unpushed work goes.
|
|
13
19
|
class GitLanding
|
|
14
20
|
include GitWorktrees
|
|
21
|
+
include GitMainPull
|
|
15
22
|
|
|
16
|
-
# Accepts the arguments every driven adapter is built with
|
|
23
|
+
# Accepts the arguments every driven adapter is built with; only the registry and the
|
|
24
|
+
# overrides are kept.
|
|
17
25
|
#
|
|
18
26
|
# @param aggregate [Object, nil] unused
|
|
19
27
|
# @param settings [Hash] unused
|
|
20
28
|
# @param root [String, nil] unused
|
|
21
|
-
|
|
29
|
+
# @param registry [Runtime::Registry, nil] where the started Work rows are read
|
|
30
|
+
# @param tune [Hash] overrides of the line's limits and collaborators (see `Lineup`)
|
|
31
|
+
def initialize(aggregate: nil, settings: {}, root: nil, registry: nil, **tune)
|
|
22
32
|
@git = Git.new
|
|
33
|
+
@registry = registry
|
|
34
|
+
@tune = tune
|
|
23
35
|
end
|
|
24
36
|
|
|
25
|
-
# Lands a worktree's branch onto another branch (local `main` by default)
|
|
37
|
+
# Lands a worktree's branch onto another branch (local `main` by default), then removes the
|
|
38
|
+
# linked worktree and branch it landed from when they hold nothing main lacks.
|
|
26
39
|
#
|
|
27
40
|
# @param held [Hash] the `Landing` record: `checkout` (a directory inside the worktree; the
|
|
28
41
|
# current directory when absent), `branch` (its checked-out branch when absent), `onto`
|
|
@@ -34,8 +47,45 @@ module Hecks
|
|
|
34
47
|
onto = plain(held[:onto]) || "main"
|
|
35
48
|
raise ConsoleCapture::Failure, "#{branch} is the branch to land onto" if branch == onto
|
|
36
49
|
|
|
37
|
-
|
|
38
|
-
|
|
50
|
+
lineup.stand(branch, onto: onto, checkout: @checkout) { |note| land_alone(branch, onto, note) }
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Takes the front place in the line and lands every branch whose landing is waiting behind
|
|
54
|
+
# it, in ticket order, without giving the place up: each is rebased onto the moving `onto`,
|
|
55
|
+
# run through the quick gate and landed. One that conflicts, fails the gate or overlaps
|
|
56
|
+
# another started row's area is skipped with its reason, and its own waiting `land!` is told.
|
|
57
|
+
#
|
|
58
|
+
# @param held [Hash] the `Landing` record: `checkout` (any directory in the repository) and
|
|
59
|
+
# `onto`
|
|
60
|
+
# @return [Hash{Symbol => Hash}] `outcome:` (`trained`), `checkout:`, `branch:` and `report:`
|
|
61
|
+
# @raise [ConsoleCapture::Failure] when the checkout is not a repository or the wait runs out
|
|
62
|
+
def convene(**held)
|
|
63
|
+
settle(held)
|
|
64
|
+
onto = plain(held[:onto]) || "main"
|
|
65
|
+
land = ->(checkout, branch, target) { land_for(checkout, branch, target) }
|
|
66
|
+
said = lineup.convoy(@git, @checkout, onto: onto, land: land)
|
|
67
|
+
{ outcome: { value: "trained" }, checkout: { value: primary.path }, branch: { value: "train" }, report: { value: said } }
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Finishes a branch in one step: refuses unsaved work, rebases it onto `onto`, runs the quick
|
|
71
|
+
# gate in its worktree, lands it through the queue and tidies the worktree.
|
|
72
|
+
#
|
|
73
|
+
# @param held [Hash] the `Landing` record, as for {#merge}; `gate:` (a callable) replaces the
|
|
74
|
+
# gate run, for a spec
|
|
75
|
+
# @return [Hash{Symbol => Hash}] the answer {#merge} gives
|
|
76
|
+
# @raise [ConsoleCapture::Failure] at the first step that fails, naming it: unsaved work,
|
|
77
|
+
# conflict, gate red, or the queue busy
|
|
78
|
+
def finish_branch(**held)
|
|
79
|
+
settle(held)
|
|
80
|
+
branch = plain(held[:branch]) || current_branch
|
|
81
|
+
onto = plain(held[:onto]) || "main"
|
|
82
|
+
raise ConsoleCapture::Failure, "#{branch} is the branch to land onto" if branch == onto
|
|
83
|
+
|
|
84
|
+
Finisher.new(@git, @checkout, branch: branch, onto: onto, gate: held[:gate]).prepare
|
|
85
|
+
@retiring = true
|
|
86
|
+
merge(**held)
|
|
87
|
+
ensure
|
|
88
|
+
@retiring = false
|
|
39
89
|
end
|
|
40
90
|
|
|
41
91
|
# Removes a linked worktree and deletes its branch, once the branch is on `onto`.
|
|
@@ -43,19 +93,19 @@ module Hecks
|
|
|
43
93
|
# @param held [Hash] the `Landing` record: `checkout` (the worktree to remove), `branch`
|
|
44
94
|
# (its checked-out branch when absent), `onto`
|
|
45
95
|
# @return [Hash{Symbol => Hash}] `outcome:` (`retired`), `checkout:`, `branch:`, `report:`
|
|
46
|
-
# @raise [ConsoleCapture::Failure] when it
|
|
47
|
-
#
|
|
96
|
+
# @raise [ConsoleCapture::Failure] when anything makes keeping it the safe answer: the primary
|
|
97
|
+
# worktree, one the process stands in, any file not tracked and clean (ignored included), a
|
|
98
|
+
# branch with commits `onto` lacks or a protected branch, or git refusing the removal
|
|
48
99
|
def remove(**held)
|
|
49
100
|
settle(held)
|
|
50
101
|
branch = plain(held[:branch]) || current_branch
|
|
51
102
|
onto = plain(held[:onto]) || "main"
|
|
52
103
|
gone = @checkout
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
read("branch", "-D", ref(branch), dir: home)
|
|
104
|
+
kept, said = Tidy.new(@git, @checkout, branch: branch, onto: onto, retiring: true).retire
|
|
105
|
+
raise ConsoleCapture::Failure, "#{gone} is kept: #{said}" if kept
|
|
106
|
+
|
|
57
107
|
{ outcome: { value: "retired" }, checkout: { value: gone }, branch: { value: branch },
|
|
58
|
-
report: { value:
|
|
108
|
+
report: { value: said } }
|
|
59
109
|
end
|
|
60
110
|
|
|
61
111
|
# The branches whose commits are not on a branch, or that hold uncommitted work.
|
|
@@ -74,20 +124,56 @@ module Hecks
|
|
|
74
124
|
|
|
75
125
|
private
|
|
76
126
|
|
|
127
|
+
# One landing from another worktree, as the train makes it for a waiting branch.
|
|
128
|
+
def land_for(checkout, branch, onto)
|
|
129
|
+
mine = @checkout
|
|
130
|
+
@checkout = checkout
|
|
131
|
+
land_alone(branch, onto, nil)
|
|
132
|
+
ensure
|
|
133
|
+
@checkout = mine
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def land_alone(branch, onto, note)
|
|
137
|
+
refuse_unsaved(branch)
|
|
138
|
+
refuse_stale_base(branch) if onto == "main"
|
|
139
|
+
refuse_rival(branch, onto)
|
|
140
|
+
said = tidy(Merger.new(@git, @checkout, branch: branch, onto: onto).land, branch, onto)
|
|
141
|
+
note ? said.merge(report: { value: "#{said[:report][:value]}; #{note}" }) : said
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def common_git_dir = read("rev-parse", "--path-format=absolute", "--git-common-dir")
|
|
145
|
+
|
|
146
|
+
# The line of this repository, with the limits of the world's `landing "Queue"` setting.
|
|
147
|
+
def lineup
|
|
148
|
+
setting = (@registry&.world("Hecks")&.settings || {})["landing"]
|
|
149
|
+
Lineup.new(common_git_dir, setting: setting, **@tune)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def refuse_rival(branch, onto)
|
|
153
|
+
clash = Rivals.new(@git, @checkout, @registry).refusal(branch, onto)
|
|
154
|
+
raise ConsoleCapture::Failure, clash if clash
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def tidy(landed, branch, onto)
|
|
158
|
+
said = @retiring ? retire_from_primary(branch, onto) : Tidy.new(@git, @checkout, branch: branch, onto: onto).call
|
|
159
|
+
landed.merge(report: { value: "#{landed[:report][:value]}; #{said}" })
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# A finish runs inside the worktree it retires, so the process leaves it first; a worktree that
|
|
163
|
+
# holds ignored files is kept and said so.
|
|
164
|
+
def retire_from_primary(branch, onto)
|
|
165
|
+
Dir.chdir(primary.path) do
|
|
166
|
+
kept, said = Tidy.new(@git, @checkout, branch: branch, onto: onto, retiring: true).retire
|
|
167
|
+
kept ? "kept #{branch}: #{said}" : said
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
77
171
|
def refuse_unsaved(branch)
|
|
78
172
|
tree = worktree_on(branch)
|
|
79
173
|
changed = tree ? dirty(tree.path) : []
|
|
80
174
|
raise ConsoleCapture::Failure, "#{tree.path} holds uncommitted work: #{changed.join(", ")}" unless changed.empty?
|
|
81
175
|
end
|
|
82
176
|
|
|
83
|
-
def refuse_unretirable(branch, onto)
|
|
84
|
-
raise ConsoleCapture::Failure, "#{@checkout} is the primary worktree" if @checkout == primary.path
|
|
85
|
-
|
|
86
|
-
refuse_unsaved(branch)
|
|
87
|
-
behind = count("#{ref(onto)}..#{ref(branch)}")
|
|
88
|
-
raise ConsoleCapture::Failure, "#{branch} has #{behind} commit(s) not on #{onto}" if behind.positive?
|
|
89
|
-
end
|
|
90
|
-
|
|
91
177
|
def branches = read("for-each-ref", "--format=%(refname:short)", "refs/heads").split("\n")
|
|
92
178
|
|
|
93
179
|
def unlanded_line(name, onto)
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "git_worktrees"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module Adapters
|
|
7
|
+
# Bringing local `main` up to date with `origin/main`: the one operation `LinkedTree.PullMain`
|
|
8
|
+
# is, and that `LinkedTree.Add`, `Landing.Land` and `Landing.Finish` lean on, so a branch is
|
|
9
|
+
# never cut or landed from a stale base.
|
|
10
|
+
#
|
|
11
|
+
# One fetch, then a fast-forward when local `main` is behind, or a rebase of its unpushed
|
|
12
|
+
# commits (merge commits kept) when both moved. It never forces, never pushes, never discards
|
|
13
|
+
# a commit and never merges onto `main`. A repository without an `origin` (or with no
|
|
14
|
+
# `origin/main`) has nothing to be behind, and the answer says so.
|
|
15
|
+
#
|
|
16
|
+
# An includer has the `GitWorktrees` helpers and sets `@git`.
|
|
17
|
+
module GitMainPull
|
|
18
|
+
REMOTE_MAIN = "origin/main"
|
|
19
|
+
|
|
20
|
+
# The files git keeps while a rebase or merge is unfinished, and what each is called.
|
|
21
|
+
MIDWAY = { "rebase-merge" => "rebase", "rebase-apply" => "rebase", "MERGE_HEAD" => "merge" }.freeze
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
# @return [String] what was done, one line
|
|
26
|
+
# @raise [ConsoleCapture::Failure] naming `cannot pull main` and why
|
|
27
|
+
def pull_main
|
|
28
|
+
return "no origin/main to pull" unless fetched_origin_main?
|
|
29
|
+
|
|
30
|
+
behind = count("main..#{REMOTE_MAIN}")
|
|
31
|
+
return "main is up to date with #{REMOTE_MAIN}" if behind.zero?
|
|
32
|
+
|
|
33
|
+
host = worktree_on("main")
|
|
34
|
+
refuse_unready(host)
|
|
35
|
+
ahead = count("#{REMOTE_MAIN}..main")
|
|
36
|
+
return fast_forward(host, behind) if ahead.zero?
|
|
37
|
+
|
|
38
|
+
rebase_main(host, ahead, behind)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Fetches `origin` once; false when there is no origin or no `origin/main` to compare with.
|
|
42
|
+
def fetched_origin_main?
|
|
43
|
+
return false unless @git.capture("remote", "get-url", "origin", chdir: @checkout).ok?
|
|
44
|
+
|
|
45
|
+
fetched = @git.capture("fetch", "--quiet", "origin", chdir: @checkout)
|
|
46
|
+
raise ConsoleCapture::Failure, "cannot pull main: git fetch origin failed: #{fetched.err.strip}" unless fetched.ok?
|
|
47
|
+
|
|
48
|
+
@git.capture("rev-parse", "--verify", "--quiet", "refs/remotes/#{REMOTE_MAIN}", chdir: @checkout).ok?
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Refuses a `main` checkout that is dirty or in the middle of a rebase or merge.
|
|
52
|
+
def refuse_unready(host)
|
|
53
|
+
return unless host
|
|
54
|
+
|
|
55
|
+
midway = MIDWAY.find { |name, _| File.exist?(git_path(host.path, name)) }
|
|
56
|
+
raise ConsoleCapture::Failure, "cannot pull main: the checkout is in the middle of a #{midway.last}" if midway
|
|
57
|
+
|
|
58
|
+
changed = read("status", "--porcelain", "--untracked-files=no", dir: host.path)
|
|
59
|
+
raise ConsoleCapture::Failure, "cannot pull main: the checkout has uncommitted changes" unless changed.empty?
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def git_path(dir, name) = read("rev-parse", "--path-format=absolute", "--git-path", name, dir: dir)
|
|
63
|
+
|
|
64
|
+
def fast_forward(host, behind)
|
|
65
|
+
if host
|
|
66
|
+
read("merge", "--ff-only", REMOTE_MAIN, dir: host.path)
|
|
67
|
+
else
|
|
68
|
+
read("fetch", "--quiet", "origin", "main:main")
|
|
69
|
+
end
|
|
70
|
+
"main fast-forwarded #{behind} commit#{"s" unless behind == 1} to #{short(read("rev-parse", "main"))}"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def rebase_main(host, ahead, behind)
|
|
74
|
+
raise ConsoleCapture::Failure, "cannot pull main: main is diverged and is checked out nowhere to rebase it in" unless host
|
|
75
|
+
|
|
76
|
+
result = @git.capture("rebase", "--rebase-merges", REMOTE_MAIN, chdir: host.path)
|
|
77
|
+
unless result.ok?
|
|
78
|
+
conflicts = @git.capture("diff", "--name-only", "--diff-filter=U", chdir: host.path).out.split
|
|
79
|
+
@git.capture("rebase", "--abort", chdir: host.path)
|
|
80
|
+
raise ConsoleCapture::Failure,
|
|
81
|
+
"cannot pull main: rebasing main's #{ahead} unpushed commits onto #{REMOTE_MAIN} conflicts in " \
|
|
82
|
+
"#{conflicts.join(", ")}; nothing changed"
|
|
83
|
+
end
|
|
84
|
+
"main rebased #{ahead} unpushed commits onto #{REMOTE_MAIN} (#{behind} new) at #{short(read("rev-parse", "main"))}"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Refuses landing a branch onto `main` while it lacks what `origin/main` has.
|
|
88
|
+
def refuse_stale_base(branch)
|
|
89
|
+
return unless fetched_origin_main?
|
|
90
|
+
|
|
91
|
+
lacking = count("#{branch_tip(branch)}..#{REMOTE_MAIN}")
|
|
92
|
+
return if lacking.zero? || ancestor?(branch_tip(branch), branch_tip("main"))
|
|
93
|
+
|
|
94
|
+
raise ConsoleCapture::Failure, "main is behind origin/main by #{lacking} commit#{"s" unless lacking == 1}: " \
|
|
95
|
+
"pull main first (LinkedTree.pull_main!) and rebase the branch"
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "tmpdir"
|
|
4
|
+
require "fileutils"
|
|
5
|
+
require_relative "reading"
|
|
6
|
+
|
|
7
|
+
module Hecks
|
|
8
|
+
module Adapters
|
|
9
|
+
class GitRehearsal
|
|
10
|
+
# A detached copy of a commit a rehearsal runs in, removed once it ends, so the stages check
|
|
11
|
+
# the very commit a push would carry and not whatever a checkout holds.
|
|
12
|
+
class Bench
|
|
13
|
+
include Reading
|
|
14
|
+
|
|
15
|
+
# @param git [Git] the adapter every git call goes through
|
|
16
|
+
# @param checkout [String] the repository's top level
|
|
17
|
+
# @param scope [String] a scope sweeps and names only its own benches, so a quick rehearsal
|
|
18
|
+
# never removes the live bench of a deep one
|
|
19
|
+
def initialize(git, checkout, scope: "quick")
|
|
20
|
+
@git = git
|
|
21
|
+
@checkout = checkout
|
|
22
|
+
@scope = scope
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# The prefix of the scratch directory every bench is made in, which tells a bench of this
|
|
26
|
+
# adapter from any other worktree.
|
|
27
|
+
PREFIX = "hecks-push-rehearsal"
|
|
28
|
+
|
|
29
|
+
# The prefix of a `quick` rehearsal's bench.
|
|
30
|
+
QUICK = "#{PREFIX}-quick".freeze
|
|
31
|
+
|
|
32
|
+
# A worktree's line in `git worktree list --porcelain`.
|
|
33
|
+
LISTED = /\Aworktree /
|
|
34
|
+
|
|
35
|
+
# Removes benches an earlier rehearsal left registered (it was killed before it cleaned up):
|
|
36
|
+
# only worktrees named `<tmp>/hecks-push-rehearsal*/bench`, so no other worktree is touched.
|
|
37
|
+
# Call it only while no rehearsal runs, which the caller's lock ensures.
|
|
38
|
+
#
|
|
39
|
+
# @return [Integer] how many stale benches were removed
|
|
40
|
+
def sweep
|
|
41
|
+
stale = benches
|
|
42
|
+
stale.each do |directory|
|
|
43
|
+
@git.capture("worktree", "remove", "--force", directory, chdir: @checkout)
|
|
44
|
+
FileUtils.rm_rf(File.dirname(directory))
|
|
45
|
+
end
|
|
46
|
+
@git.capture("worktree", "prune", chdir: @checkout) unless stale.empty?
|
|
47
|
+
stale.size
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# @param commit [String] the commit to check out
|
|
51
|
+
# @yieldparam directory [String] the copy
|
|
52
|
+
# @return [Object] what the block returned
|
|
53
|
+
def rehearse(commit)
|
|
54
|
+
Dir.mktmpdir(@scope == "quick" ? QUICK : PREFIX) do |scratch|
|
|
55
|
+
directory = File.join(scratch, "bench")
|
|
56
|
+
read("worktree", "add", "--quiet", "--detach", directory, commit)
|
|
57
|
+
begin
|
|
58
|
+
yield directory
|
|
59
|
+
ensure
|
|
60
|
+
@git.capture("worktree", "remove", "--force", directory, chdir: @checkout)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
# The registered worktrees that are benches of this adapter.
|
|
68
|
+
def benches
|
|
69
|
+
listed = read("worktree", "list", "--porcelain").lines.grep(LISTED)
|
|
70
|
+
listed.map { |line| line.delete_prefix("worktree ").strip }.select { |directory| bench?(directory) }
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def bench?(directory)
|
|
74
|
+
return false unless File.basename(directory) == "bench"
|
|
75
|
+
|
|
76
|
+
name = File.basename(File.dirname(directory))
|
|
77
|
+
@scope == "quick" ? name.start_with?(QUICK) : (name.start_with?(PREFIX) && !name.start_with?(QUICK))
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../push_size"
|
|
4
|
+
require "hecks/runtime/asking"
|
|
5
|
+
require_relative "reading"
|
|
6
|
+
require_relative "record"
|
|
7
|
+
|
|
8
|
+
module Hecks
|
|
9
|
+
module Adapters
|
|
10
|
+
class GitRehearsal
|
|
11
|
+
# Whether a push is due, read from refs git already holds: how many commits local `main` is
|
|
12
|
+
# ahead of `origin/main`, how old the oldest of them is, and how the last quick rehearsal
|
|
13
|
+
# ended.
|
|
14
|
+
class Due
|
|
15
|
+
include Reading
|
|
16
|
+
|
|
17
|
+
# Seconds in an hour.
|
|
18
|
+
HOUR = 3600.0
|
|
19
|
+
|
|
20
|
+
# @param git [Git] the adapter every git call goes through
|
|
21
|
+
# @param checkout [String] the repository's top level
|
|
22
|
+
# @param place [Hash] `branch:` the local branch ("main"), `remote:` it is pushed to
|
|
23
|
+
# @param limits [Hash, nil] the push size thresholds; the booted world's when nil
|
|
24
|
+
# @param clock [#now] where the age of the oldest commit is read from
|
|
25
|
+
def initialize(git, checkout, limits: nil, clock: Time, **place)
|
|
26
|
+
@limits = limits || PushSize.thresholds(Runtime::Asking.registry)
|
|
27
|
+
@clock = clock
|
|
28
|
+
@git = git
|
|
29
|
+
@checkout = checkout
|
|
30
|
+
@branch = place.fetch(:branch, "main")
|
|
31
|
+
@tracking = "#{place.fetch(:remote, "origin")}/#{@branch}"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# @return [String] one line:
|
|
35
|
+
# whether a push is due, the count, the age, the last rehearsal
|
|
36
|
+
# @raise [ConsoleCapture::Failure] when there is no such branch or remote-tracking branch
|
|
37
|
+
def report
|
|
38
|
+
ahead = read("rev-list", "--count", "#{@tracking}..#{@branch}").to_i
|
|
39
|
+
return "push due: no; #{@branch} is level with #{@tracking}; #{last_rehearsal}" if ahead.zero?
|
|
40
|
+
|
|
41
|
+
"push due: yes; #{ahead} commit(s) ahead of #{@tracking}; oldest unpushed #{age} hours old; " \
|
|
42
|
+
"#{size(ahead)}#{last_rehearsal}#{gate_note}"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
# The size sentence and its separator once past the threshold, else nothing.
|
|
48
|
+
def size(ahead)
|
|
49
|
+
sentence = PushSize.sentence(ahead, @limits)
|
|
50
|
+
sentence.empty? ? "" : "#{sentence}; "
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def age
|
|
54
|
+
oldest = read("log", "--reverse", "--format=%ct", "#{@tracking}..#{@branch}").lines.first.to_i
|
|
55
|
+
format("%.1f", (@clock.now.to_i - oldest) / HOUR)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def last_rehearsal = last_of("quick")
|
|
59
|
+
|
|
60
|
+
# The train's quick gate is the push gate; say so when no green rehearsal of it is current.
|
|
61
|
+
def gate_note
|
|
62
|
+
entry = Record.new(@git, @checkout).last("quick")
|
|
63
|
+
return "" if entry && entry.verdict == "green" && current?(entry)
|
|
64
|
+
|
|
65
|
+
"; the train's quick gate is the push gate and runs at the push: push_rehearsal.rehearse! " \
|
|
66
|
+
"runs it ahead (scope.value=deep also runs the impacted specs; opt-in)"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def last_of(scope)
|
|
70
|
+
entry = Record.new(@git, @checkout).last(scope)
|
|
71
|
+
return "last #{scope}: none yet" unless entry
|
|
72
|
+
|
|
73
|
+
"last #{scope}: #{entry.verdict}#{failed(entry)} on #{short(entry.commit)} (#{currency(entry)})"
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def failed(entry) = entry.failed.empty? ? "" : " (#{entry.failed.tr(",", ", ")})"
|
|
77
|
+
|
|
78
|
+
def currency(entry) = current?(entry) ? "the current #{@branch}" : "#{@branch} has moved since"
|
|
79
|
+
|
|
80
|
+
def current?(entry) = read("rev-parse", "--verify", "refs/heads/#{@branch}^{commit}") == entry.commit
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module Adapters
|
|
5
|
+
class GitRehearsal
|
|
6
|
+
class Impacted
|
|
7
|
+
# Which specs a rehearsal cannot run here: those that need `cargo`, `gh` or the network, and
|
|
8
|
+
# those tagged `:io` when no scratch Postgres answers.
|
|
9
|
+
class Skips
|
|
10
|
+
NEEDS = {
|
|
11
|
+
"cargo" => /\bcargo (?:build|test|run|check)|["']cargo["']/,
|
|
12
|
+
"gh" => /["'`]gh["'`]|`gh |\bgh (?:pr|run|api|workflow|issue)\b/,
|
|
13
|
+
"network" => /Net::HTTP|URI\.open|open-uri|\bcurl\b/
|
|
14
|
+
}.freeze
|
|
15
|
+
TAGGED_IO = /\bio: true\b|,\s*:io\b/
|
|
16
|
+
NO_POSTGRES = "no scratch Postgres"
|
|
17
|
+
|
|
18
|
+
# @param root [String] the tree the specs are read from
|
|
19
|
+
# @param scratch [#call] says whether a scratch Postgres is reachable
|
|
20
|
+
def initialize(root, scratch:)
|
|
21
|
+
@root = root
|
|
22
|
+
@scratch = scratch
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @param spec [String] a spec file relative to the root
|
|
26
|
+
# @return [String, nil] why it cannot run here, or nil
|
|
27
|
+
def call(spec)
|
|
28
|
+
text = File.read(File.join(@root, spec)).scrub
|
|
29
|
+
found = NEEDS.find { |_need, pattern| pattern.match?(text) }
|
|
30
|
+
return "needs #{found.first}" if found
|
|
31
|
+
|
|
32
|
+
NO_POSTGRES if tagged_io?(text) && !reachable?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @return [Boolean] whether the spec has `:io` examples
|
|
36
|
+
def io?(spec) = tagged_io?(File.read(File.join(@root, spec)).scrub)
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
def tagged_io?(text) = TAGGED_IO.match?(text)
|
|
41
|
+
|
|
42
|
+
def reachable? = @reachable.nil? ? (@reachable = @scratch.call) : @reachable
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module Adapters
|
|
7
|
+
class GitRehearsal
|
|
8
|
+
class Impacted
|
|
9
|
+
# Runs one spec file through the launcher and reads how it ended.
|
|
10
|
+
class SpecRun
|
|
11
|
+
# How one spec file ended.
|
|
12
|
+
#
|
|
13
|
+
# @!attribute [r] spec
|
|
14
|
+
# @return [String] the spec file
|
|
15
|
+
# @!attribute [r] passed
|
|
16
|
+
# @return [Boolean] whether every example passed
|
|
17
|
+
# @!attribute [r] failures
|
|
18
|
+
# @return [Array<String>] the failing examples, `./spec/a_spec.rb:12 # description`
|
|
19
|
+
Outcome = Struct.new(:spec, :passed, :failures) do
|
|
20
|
+
# @return [String] the spec and its first failing example, for the report
|
|
21
|
+
def line = "failing spec: #{failures.first || spec}"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
LAUNCHER = %w[exe/hecks test_suite_run.run_spec_example!].freeze
|
|
25
|
+
GREEN = /\b[1-9]\d* examples?, 0 failures\b(?!, \d+ errors? occurred outside)/
|
|
26
|
+
JSON_FROM = /^\{.*\z/m
|
|
27
|
+
FAILED = %r{^rspec (\./\S+)(?: # (.*))?$}
|
|
28
|
+
|
|
29
|
+
# @param capture [#call] given a command and `env:`, runs it in a directory and returns a
|
|
30
|
+
# `Shell::Result`; the directory is the first argument
|
|
31
|
+
def initialize(capture)
|
|
32
|
+
@capture = capture
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @param directory [String] the copy to run in
|
|
36
|
+
# @param spec [String] the spec file, relative to it
|
|
37
|
+
# @param io [Boolean] whether the file's `:io` examples are to run
|
|
38
|
+
# @return [Outcome]
|
|
39
|
+
def call(directory, spec, io: false)
|
|
40
|
+
env = io ? { "CI" => "true" } : {}
|
|
41
|
+
result = @capture.call(directory, *LAUNCHER, "file.value=#{spec}", "example.value= ", "--wait", env: env)
|
|
42
|
+
answer = answer(result)
|
|
43
|
+
report = said(answer)
|
|
44
|
+
Outcome.new(spec, settled?(result, answer) && GREEN.match?(report), failures(report, result))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def answer(result)
|
|
50
|
+
json = result.out[JSON_FROM]
|
|
51
|
+
json ? JSON.parse(json) : {}
|
|
52
|
+
rescue JSON::ParserError
|
|
53
|
+
{}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# The launcher exits non-zero when reactions the spec's own domains refused or crashed
|
|
57
|
+
# surface in its run, though every example passed; a run it recorded as completed counts.
|
|
58
|
+
def settled?(result, answer) = result.ok? || answer.dig("state", "status") == "completed"
|
|
59
|
+
|
|
60
|
+
# A red run is refused, with the output in the refusal and none in the report.
|
|
61
|
+
def said(answer) = (answer.dig("state", "report") || answer.dig("state", "refusal")).to_s
|
|
62
|
+
|
|
63
|
+
def failures(report, result)
|
|
64
|
+
listed = report.scan(FAILED).map { |where, what| [where, what].compact.join(" # ") }
|
|
65
|
+
return listed unless listed.empty?
|
|
66
|
+
|
|
67
|
+
report.empty? ? ["exit #{result.exit_code}: #{printed(result.err).last}"] : []
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def printed(text) = text.lines.map(&:strip).reject(&:empty?)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|