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
|
@@ -5,7 +5,7 @@ require_relative "../../hecks"
|
|
|
5
5
|
require_relative "persistence_notice"
|
|
6
6
|
|
|
7
7
|
module Hecks
|
|
8
|
-
module
|
|
8
|
+
module Tools
|
|
9
9
|
# The command behind `hecks history` and `hecks history`: every journal entry a domain's
|
|
10
10
|
# append-only adapters hold, as JSON, the full write history rather than the current head.
|
|
11
11
|
module History
|
|
@@ -2,7 +2,7 @@ require_relative "../runtime/registry"
|
|
|
2
2
|
require_relative "../ports/agent"
|
|
3
3
|
|
|
4
4
|
module Hecks
|
|
5
|
-
module
|
|
5
|
+
module Tools
|
|
6
6
|
# The interviewer an interview session talks to: the agent port, resolved against a registry
|
|
7
7
|
# that holds one adapter (ADR 0088). The session never sees the adapter, only validated
|
|
8
8
|
# questions and proposals, so a spec can stand a scripted adapter in for the real one.
|
|
@@ -2,7 +2,7 @@ require_relative "../naming"
|
|
|
2
2
|
require_relative "interview_shape"
|
|
3
3
|
|
|
4
4
|
module Hecks
|
|
5
|
-
module
|
|
5
|
+
module Tools
|
|
6
6
|
# The bluebook text of one accepted thing: its aggregate, with its value objects, commands and
|
|
7
7
|
# lifecycle. `InterviewDraft` extends it, and supplies the naming and citing helpers it calls.
|
|
8
8
|
module InterviewAggregate
|
|
@@ -5,7 +5,7 @@ require_relative "interview_record"
|
|
|
5
5
|
require_relative "interview_aggregate"
|
|
6
6
|
|
|
7
7
|
module Hecks
|
|
8
|
-
module
|
|
8
|
+
module Tools
|
|
9
9
|
# Turns an interview's accepted findings into the files of a first domain (ADR 0088).
|
|
10
10
|
#
|
|
11
11
|
# Pure: it answers the text of each file and writes none, so the command that runs an interview
|
|
@@ -5,7 +5,7 @@ require_relative "interview_agent"
|
|
|
5
5
|
require_relative "interview_session"
|
|
6
6
|
|
|
7
7
|
module Hecks
|
|
8
|
-
module
|
|
8
|
+
module Tools
|
|
9
9
|
# The command behind `hecks interview <Name>` (ADR 0088): boots the SME bluebook on demand,
|
|
10
10
|
# holds the interview at the terminal, then writes the first domain, or the next interview's
|
|
11
11
|
# proposed additions, and says what to type next. Nothing is written unless the interview
|
|
@@ -26,7 +26,7 @@ module Hecks
|
|
|
26
26
|
# @param runtime [Runtime, nil] a booted SME bluebook to use instead of booting one
|
|
27
27
|
# @return [String] the report that was printed, or "" when nothing was written
|
|
28
28
|
# @raise [ArgumentError] when the name or adapter is refused, or a file would be replaced
|
|
29
|
-
def call(name:, adapter: nil, dir: nil, expert: nil, use_ai: true, input: $stdin, output: $stdout, agent: nil,
|
|
29
|
+
def call(name:, adapter: nil, dir: nil, expert: nil, use_ai: true, input: $stdin, output: $stdout, agent: nil,
|
|
30
30
|
runtime: nil)
|
|
31
31
|
DomainStub.support_files(name: name, adapter: adapter)
|
|
32
32
|
target = File.expand_path(dir || DomainStub.directory(name), Dir.pwd)
|
|
@@ -6,7 +6,7 @@ require_relative "interview_session/manual_findings"
|
|
|
6
6
|
require_relative "interview_session/agent_state"
|
|
7
7
|
|
|
8
8
|
module Hecks
|
|
9
|
-
module
|
|
9
|
+
module Tools
|
|
10
10
|
# One interview, held at a terminal (ADR 0088).
|
|
11
11
|
#
|
|
12
12
|
# hecks drives: it asks the agent for a question, shows it, reads the answer the developer typed
|
|
@@ -28,7 +28,7 @@ module Hecks
|
|
|
28
28
|
# @param reference [String] the interview's reference, such as `INT-1`
|
|
29
29
|
# @param subject [String] the domain being discovered, as its bluebook will spell it
|
|
30
30
|
# @param expert [String] who is being interviewed
|
|
31
|
-
def initialize(runtime:, agent:, input:, output:, reference:, subject:, expert:)
|
|
31
|
+
def initialize(runtime:, agent:, input:, output:, reference:, subject:, expert:)
|
|
32
32
|
@runtime = runtime
|
|
33
33
|
@agent = agent
|
|
34
34
|
@input = input
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require_relative "../../text"
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
|
-
module
|
|
4
|
+
module Tools
|
|
5
5
|
module InterviewShape
|
|
6
6
|
# The lifecycle an interview's accepted transitions describe, and the state words it is
|
|
7
7
|
# written in. `InterviewShape` extends it, so each method answers on `InterviewShape`.
|
|
@@ -3,7 +3,7 @@ require_relative "../text"
|
|
|
3
3
|
require_relative "interview_shape/lifecycle"
|
|
4
4
|
|
|
5
5
|
module Hecks
|
|
6
|
-
module
|
|
6
|
+
module Tools
|
|
7
7
|
# What an interview's fields, command inputs and state changes become in a drafted aggregate
|
|
8
8
|
# (ADR 0088): its attributes and their value objects, the fields a command is told, a note of
|
|
9
9
|
# who does it, and the lifecycle.
|
|
@@ -4,7 +4,7 @@ require_relative "../../hecks"
|
|
|
4
4
|
require_relative "../ports/persistence/plugins/era"
|
|
5
5
|
|
|
6
6
|
module Hecks
|
|
7
|
-
module
|
|
7
|
+
module Tools
|
|
8
8
|
# The command behind `hecks ir`: a booted domain's IR as JSON, the
|
|
9
9
|
# same `to_h` the golden specs pin and `StorageShape` hashes into an era.
|
|
10
10
|
module Ir
|
|
@@ -5,8 +5,8 @@ module Hecks
|
|
|
5
5
|
module Lanes
|
|
6
6
|
# The workflow that watches each lane with an alert threshold: every hour it asks
|
|
7
7
|
# `PromotionRun` whether the lane has stood behind the lane it follows for longer than its
|
|
8
|
-
# `Lane` row allows. A late lane faults the run, and
|
|
9
|
-
#
|
|
8
|
+
# `Lane` row allows. A late lane faults the run, and GitHub's failed-run status
|
|
9
|
+
# and email say so.
|
|
10
10
|
module WatchWorkflow
|
|
11
11
|
HEADER = <<~YAML.chomp
|
|
12
12
|
name: Watch lanes
|
|
@@ -15,7 +15,7 @@ module Hecks
|
|
|
15
15
|
#
|
|
16
16
|
# Every hour, asks `PromotionRun` whether a lane has stood behind the lane it follows for
|
|
17
17
|
# longer than its Lane row allows (`alert_after`, in hours). The rule is decided there, not
|
|
18
|
-
# here. A late lane fails the run
|
|
18
|
+
# here. A late lane fails the run and asks Promote to try
|
|
19
19
|
# again: a promotion that was dropped is picked up within the hour, and one that still
|
|
20
20
|
# cannot go says why in its own run.
|
|
21
21
|
on:
|
|
@@ -31,7 +31,6 @@ module Hecks
|
|
|
31
31
|
permissions:
|
|
32
32
|
contents: read
|
|
33
33
|
checks: read
|
|
34
|
-
issues: write
|
|
35
34
|
actions: write
|
|
36
35
|
|
|
37
36
|
jobs:
|
|
@@ -71,10 +70,9 @@ module Hecks
|
|
|
71
70
|
|
|
72
71
|
def watch_step(name)
|
|
73
72
|
[" - name: Watch #{name}", " env:", " GH_TOKEN: ${{ github.token }}",
|
|
74
|
-
"
|
|
75
|
-
" bundle exec exe/hecks promotion_run.watch lane=#{name}",
|
|
76
|
-
" run=watch-#{name}-${{ github.run_id }}-${{ github.run_attempt }}"
|
|
77
|
-
" alert_key=#{name}-lag-$(date -u +%Y-%m-%d) --wait"]
|
|
73
|
+
" run: >-",
|
|
74
|
+
" bundle exec exe/hecks promotion_run.watch! lane=#{name}",
|
|
75
|
+
" run=watch-#{name}-${{ github.run_id }}-${{ github.run_attempt }} --wait"]
|
|
78
76
|
end
|
|
79
77
|
end
|
|
80
78
|
end
|
|
@@ -70,7 +70,7 @@ module Hecks
|
|
|
70
70
|
def promote_step(name)
|
|
71
71
|
[" - name: Promote #{name}", " env:", " GH_TOKEN: ${{ github.token }}",
|
|
72
72
|
" run: >-",
|
|
73
|
-
" bundle exec exe/hecks promotion_run.promote lane=#{name}",
|
|
73
|
+
" bundle exec exe/hecks promotion_run.promote! lane=#{name}",
|
|
74
74
|
" run=#{name}-${{ github.event.workflow_run.head_sha || github.run_id }} --confirm --wait"]
|
|
75
75
|
end
|
|
76
76
|
end
|
data/lib/hecks/tools/lanes.rb
CHANGED
|
@@ -10,7 +10,7 @@ module Hecks
|
|
|
10
10
|
# ruleset for each guarded lane (`.github/rulesets/<lane>.json`), one for the tag such a lane
|
|
11
11
|
# feeds (`.github/rulesets/tag-<tag>.json`), and the workflow that promotes
|
|
12
12
|
# each lane that follows another (`.github/workflows/promote.yml`). The workflow only runs
|
|
13
|
-
# `hecks promotion_run.promote
|
|
13
|
+
# `hecks promotion_run.promote!`; the rule that decides a promotion is `PromotionRun.Accept`.
|
|
14
14
|
#
|
|
15
15
|
# Without a flag the files are written. `--check` writes nothing and answers 1 for each file
|
|
16
16
|
# that differs, which is the drift gate. `--live` compares the rulesets GitHub holds with the
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require_relative "../../projections/context_relationships"
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
|
-
module
|
|
4
|
+
module Tools
|
|
5
5
|
module ModelCheck
|
|
6
6
|
# Examining booted domains: each one's findings against the allowlist, then the language's
|
|
7
7
|
# own bluebooks, printed as the check goes. `ModelCheck` extends it.
|
|
@@ -4,7 +4,7 @@ require_relative "model_check/sources"
|
|
|
4
4
|
require_relative "model_check/examination"
|
|
5
5
|
|
|
6
6
|
module Hecks
|
|
7
|
-
module
|
|
7
|
+
module Tools
|
|
8
8
|
# The command behind `hecks model_check`: static analysis
|
|
9
9
|
# over the IR, printed per domain, exiting non-zero when any error-severity
|
|
10
10
|
# finding is left — unreachable lifecycle states, dead transitions, unreached
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module Tools
|
|
5
|
+
module MoveDisables
|
|
6
|
+
# Why each cop is departed from, written once in the config. A cop moved without an entry here
|
|
7
|
+
# refuses the move, so a reason is never left out.
|
|
8
|
+
REASONS = {
|
|
9
|
+
"Metrics/AbcSize" => "spec boot helpers wire a whole runtime; splitting them hides the wiring",
|
|
10
|
+
"Metrics/MethodLength" => "spec boot helpers wire a whole runtime; splitting them hides the wiring",
|
|
11
|
+
"Metrics/CyclomaticComplexity" => "spec boot helpers wire a whole runtime; splitting them hides the wiring",
|
|
12
|
+
"Metrics/PerceivedComplexity" => "spec boot helpers wire a whole runtime; splitting them hides the wiring",
|
|
13
|
+
"Metrics/ParameterLists" => "keyword and positional signatures callers spell out; a parameter object hides them",
|
|
14
|
+
"Naming/PredicateMethod" => "returns the operation's outcome, a row, value or verdict; the name is the verb",
|
|
15
|
+
"Naming/PredicatePrefix" => "the DSL verb is the name a bluebook author writes",
|
|
16
|
+
"Style/MutableConstant" => "registries and caches are mutable by design (see the ThreadSafety override)",
|
|
17
|
+
"Style/GlobalStdStream" => "a forked child reopens the standard streams to capture its output",
|
|
18
|
+
"Style/FormatStringToken" => "the text is curl's own token or table row text, not a Ruby format string",
|
|
19
|
+
"Style/EvalWithLocation" => "deliberately without file and line: exercises the untraceable-source refusal",
|
|
20
|
+
"Style/ComparableBetween" => "the bluebook expression language refuses between?; the spelling is under test",
|
|
21
|
+
"Lint/UnusedBlockArgument" => "the block parameter's name is read by reflection",
|
|
22
|
+
"Lint/RescueException" => "rolls back, then re-raises",
|
|
23
|
+
"Lint/InheritException" => "deliberately escapes `rescue => e`, which catches StandardError only",
|
|
24
|
+
"Lint/IneffectiveAccessModifier" => "`private` does not reach `def self.`; the entry point is public on purpose",
|
|
25
|
+
"Lint/StructNewOverride" => "the member shadows a Struct or Enumerable method on purpose; the file says which",
|
|
26
|
+
"RSpec/Output" => "the spec exercises console output",
|
|
27
|
+
"RSpec/RemoveConst" => "the probe constant must not outlive the example",
|
|
28
|
+
"RSpec/ExampleLength" => "a scenario example carries its whole bluebook fixture",
|
|
29
|
+
"Security/MarshalLoad" => "reads our own cache or the gem's own file, never external input",
|
|
30
|
+
"Layout/LineLength" => "characterization tables with one long row per line",
|
|
31
|
+
"Layout/HashAlignment" => "the multi-line procs overrun LineLength under table alignment"
|
|
32
|
+
}.freeze
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "hecks"
|
|
4
|
+
require_relative "../tools"
|
|
5
|
+
require_relative "move_disables/reasons"
|
|
6
|
+
|
|
7
|
+
module Hecks
|
|
8
|
+
module Tools
|
|
9
|
+
# Moves justified inline RuboCop disables into `.rubocop.yml`, one entry per cop, each carrying
|
|
10
|
+
# its reason once. A file in `SKIP` keeps its inline disables until someone decides or refactors
|
|
11
|
+
# it; the move does not touch them.
|
|
12
|
+
#
|
|
13
|
+
# hecks ScriptRun.plan_script! script=move_disables # what would move, writing nothing
|
|
14
|
+
# hecks ScriptRun.apply_script! script=move_disables confirm=true
|
|
15
|
+
module MoveDisables
|
|
16
|
+
CONFIG = ".rubocop.yml"
|
|
17
|
+
|
|
18
|
+
CONFIG_HEADING = "# Overrides moved from inline `rubocop:disable` comments; each cop states its reason once."
|
|
19
|
+
|
|
20
|
+
# Files whose disables need a decision or a refactor first.
|
|
21
|
+
SKIP = %w[
|
|
22
|
+
lib/hecks/runtime/registry.rb
|
|
23
|
+
lib/hecks/runtime/registry/context_maps.rb
|
|
24
|
+
lib/hecks/adapters/driving/ruby/aggregate_module.rb
|
|
25
|
+
lib/hecks/bluebook/dsl/generic_dispatch.rb
|
|
26
|
+
lib/hecks/query_ir/touchpoints.rb
|
|
27
|
+
spec/adapters/driven/postgres_era/era_resolver_role_spec.rb
|
|
28
|
+
].freeze
|
|
29
|
+
|
|
30
|
+
DIRECTIVE = /^\s*#\s*rubocop:(disable-next|disable)\s+(.+)$/
|
|
31
|
+
TRAILING = /\s+#\s*rubocop:disable(?:-next)?\s+(.+)$/
|
|
32
|
+
TRAILING_COMMENT = /\s+#\s*rubocop:disable.*$/
|
|
33
|
+
ENABLE = /^\s*#\s*rubocop:enable\s+(.+)$/
|
|
34
|
+
|
|
35
|
+
# A cop that would move has no reason written in `REASONS`.
|
|
36
|
+
class MissingReason < StandardError; end
|
|
37
|
+
|
|
38
|
+
module_function
|
|
39
|
+
|
|
40
|
+
# Runs from a checkout's root, as a script: `hecks ... move_disables [--apply]`.
|
|
41
|
+
#
|
|
42
|
+
# @param argv [Array<String>] `--apply` writes the files; without it, the plan only
|
|
43
|
+
# @param root [String] the checkout to work on
|
|
44
|
+
# @return [Integer] 0
|
|
45
|
+
def main(argv, root: ROOT)
|
|
46
|
+
puts transform(root: root, apply: argv.include?("--apply"))
|
|
47
|
+
0
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Plans the move, and writes it when `apply` is true.
|
|
51
|
+
#
|
|
52
|
+
# @param root [String] the checkout to work on
|
|
53
|
+
# @param apply [Boolean] whether to write the files and the config
|
|
54
|
+
# @return [String] the plan: each cop with the files it moves from, and what was written
|
|
55
|
+
# @raise [MissingReason] when a cop that would move has no reason in `REASONS`
|
|
56
|
+
def transform(root:, apply:)
|
|
57
|
+
edits, moves = scan(root)
|
|
58
|
+
refuse_missing_reasons(moves)
|
|
59
|
+
|
|
60
|
+
config, merged, blocks = config_with(root, moves)
|
|
61
|
+
report = plan_report(edits, moves, merged)
|
|
62
|
+
return "#{report}\ndry run; apply with confirm=true" unless apply
|
|
63
|
+
|
|
64
|
+
write(root, edits, written_config(config, blocks))
|
|
65
|
+
"#{report}\napplied"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# @param moves [Hash{String => Array<String>}] the files each cop moves from
|
|
69
|
+
# @raise [MissingReason] when a cop that would move has no reason in `REASONS`
|
|
70
|
+
def refuse_missing_reasons(moves)
|
|
71
|
+
missing = moves.keys - REASONS.keys
|
|
72
|
+
raise MissingReason, "no reason written for: #{missing.join(", ")}" unless missing.empty?
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# @param root [String] the checkout
|
|
76
|
+
# @param edits [Hash{String => String}] the new text of each file that changes
|
|
77
|
+
# @param config [String] the config's new text
|
|
78
|
+
# @return [void]
|
|
79
|
+
def write(root, edits, config)
|
|
80
|
+
edits.each { |path, text| File.write(File.join(root, path), text) }
|
|
81
|
+
File.write(File.join(root, CONFIG), config)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# @param edits [Hash{String => String}] the new text of each file that changes
|
|
85
|
+
# @param moves [Hash{String => Array<String>}] the files each cop moves from
|
|
86
|
+
# @param merged [Array<String>] the cops merged into blocks already in the config
|
|
87
|
+
# @return [String] one line per cop, with its file count
|
|
88
|
+
def plan_report(edits, moves, merged)
|
|
89
|
+
lines = ["files to edit: #{edits.size}"]
|
|
90
|
+
moves.keys.sort.each do |cop|
|
|
91
|
+
lines << format(" %<cop>-32s %<count>2d file(s)", cop: cop, count: moves[cop].uniq.size)
|
|
92
|
+
end
|
|
93
|
+
lines << "merged into existing blocks: #{merged.join(", ")}" unless merged.empty?
|
|
94
|
+
lines.join("\n")
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Each Ruby file under lib and spec with a directive to move, with the text it becomes.
|
|
98
|
+
#
|
|
99
|
+
# @param root [String] the checkout
|
|
100
|
+
# @return [Array(Hash{String => String}, Hash{String => Array<String>})] the new text of each
|
|
101
|
+
# file, and the files each cop moves from
|
|
102
|
+
def scan(root)
|
|
103
|
+
moves = Hash.new { |hash, cop| hash[cop] = [] }
|
|
104
|
+
edits = {}
|
|
105
|
+
scanned_paths(root).each do |path|
|
|
106
|
+
touched, text = strip(File.readlines(File.join(root, path), chomp: true))
|
|
107
|
+
next if touched.empty?
|
|
108
|
+
|
|
109
|
+
touched.uniq.each { |cop| moves[cop] << path }
|
|
110
|
+
edits[path] = text
|
|
111
|
+
end
|
|
112
|
+
[edits, moves]
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# @param root [String] the checkout
|
|
116
|
+
# @return [Array<String>] the Ruby files under lib and spec, in order, outside `SKIP`
|
|
117
|
+
def scanned_paths(root)
|
|
118
|
+
Dir.glob(%w[lib/**/*.rb spec/**/*.rb], base: root).sort.reject { |path| SKIP.include?(path) }
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Removes the directives from one file's lines.
|
|
122
|
+
#
|
|
123
|
+
# @param lines [Array<String>] the file's lines, without their newlines
|
|
124
|
+
# @return [Array(Array<String>, String)] the cops the directives named, and the file's new text
|
|
125
|
+
def strip(lines)
|
|
126
|
+
touched = []
|
|
127
|
+
out = lines.filter_map { |line| keep_line(line, touched) }
|
|
128
|
+
out = out.reject { |line| closes_removed?(line, touched) }
|
|
129
|
+
[touched, "#{out.join("\n")}\n"]
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# @param line [String] one line of the file
|
|
133
|
+
# @param touched [Array<String>] the cops removed so far; this line's cops are added to it
|
|
134
|
+
# @return [String, nil] the line without its directive, or nil when the line is a directive
|
|
135
|
+
def keep_line(line, touched)
|
|
136
|
+
if (match = DIRECTIVE.match(line))
|
|
137
|
+
touched.concat(cops_from(match[2]))
|
|
138
|
+
return nil
|
|
139
|
+
end
|
|
140
|
+
return line unless (match = TRAILING.match(line))
|
|
141
|
+
|
|
142
|
+
touched.concat(cops_from(match[1]))
|
|
143
|
+
line.sub(TRAILING_COMMENT, "")
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# A block-form enable is closed by a disable that was removed; it goes once its cops are gone.
|
|
147
|
+
#
|
|
148
|
+
# @param line [String] one line of the file
|
|
149
|
+
# @param touched [Array<String>] the cops the file's removed directives named
|
|
150
|
+
# @return [Boolean] whether the line is an enable whose cops were all removed
|
|
151
|
+
def closes_removed?(line, touched)
|
|
152
|
+
match = ENABLE.match(line)
|
|
153
|
+
match && (cops_from(match[1]) - touched).empty?
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# @param text [String] the cops of one directive, possibly followed by a ` -- reason`
|
|
157
|
+
# @return [Array<String>] the cop names
|
|
158
|
+
def cops_from(text)
|
|
159
|
+
reason_free = text.split(" -- ").first
|
|
160
|
+
reason_free.split(",").map(&:strip).reject(&:empty?)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# Adds each moved cop to the config: a new block, or an `Exclude` under an existing one.
|
|
164
|
+
#
|
|
165
|
+
# @param root [String] the checkout
|
|
166
|
+
# @param moves [Hash{String => Array<String>}] the files each cop moves from
|
|
167
|
+
# @return [Array(String, Array<String>, Array<String>)] the config text with the existing
|
|
168
|
+
# blocks filled, the cops merged into existing blocks, and the new blocks to append
|
|
169
|
+
def config_with(root, moves)
|
|
170
|
+
config = File.read(File.join(root, CONFIG))
|
|
171
|
+
merged, added = moves.keys.sort.partition { |cop| config.match?(header_line(cop)) }
|
|
172
|
+
[fill_blocks(config, merged, moves), merged, added.map { |cop| new_block(cop, excluded_paths(moves[cop])) }]
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# @param config [String] the config's text
|
|
176
|
+
# @param merged [Array<String>] the cops whose blocks already exist in the config
|
|
177
|
+
# @param moves [Hash{String => Array<String>}] the files each cop moves from
|
|
178
|
+
# @return [String] the config with each existing block given its `Exclude`
|
|
179
|
+
def fill_blocks(config, merged, moves)
|
|
180
|
+
merged.inject(config) { |text, cop| text.sub(header_line(cop)) { merged_block(cop, excluded_paths(moves[cop])) } }
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# @param cop [String] a cop name
|
|
184
|
+
# @return [Regexp] the config line that opens the cop's block
|
|
185
|
+
def header_line(cop) = /^#{Regexp.escape("#{cop}:")}$/
|
|
186
|
+
|
|
187
|
+
# @param files [Array<String>] the files a cop moves from
|
|
188
|
+
# @return [Array<String>] the `Exclude` entries, sorted and unique
|
|
189
|
+
def excluded_paths(files) = files.uniq.sort.map { |path| %( - "#{path}") }
|
|
190
|
+
|
|
191
|
+
# @param cop [String] a cop name
|
|
192
|
+
# @param paths [Array<String>] the `Exclude` entries
|
|
193
|
+
# @return [String] the cop's header, its reason, and its `Exclude`, to replace an existing header
|
|
194
|
+
def merged_block(cop, paths) = ["#{cop}:", " # #{REASONS.fetch(cop)}", " Exclude:", *paths].join("\n")
|
|
195
|
+
|
|
196
|
+
# @param cop [String] a cop name
|
|
197
|
+
# @param paths [Array<String>] the `Exclude` entries
|
|
198
|
+
# @return [String] a new block for the cop, with its reason above it
|
|
199
|
+
def new_block(cop, paths) = ["# #{REASONS.fetch(cop)}", "#{cop}:", " Exclude:", *paths].join("\n")
|
|
200
|
+
|
|
201
|
+
# @param config [String] the config as it stands, with existing blocks filled
|
|
202
|
+
# @param blocks [Array<String>] the new blocks to append
|
|
203
|
+
# @return [String] the config with the new blocks appended under a heading
|
|
204
|
+
def written_config(config, blocks)
|
|
205
|
+
return config if blocks.empty?
|
|
206
|
+
|
|
207
|
+
"#{config.rstrip}\n\n#{CONFIG_HEADING}\n#{blocks.join("\n\n")}\n"
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../tools"
|
|
4
|
+
require_relative "../naming"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module Tools
|
|
8
|
+
# Moves an aggregate's `formerly_known_as "Old"` out of the bluebook and into the world that
|
|
9
|
+
# names the domain, as `stored_as Name: "old"`: the physical name an aggregate's rows are
|
|
10
|
+
# stored under is a storage fact, so the world says it. The bluebook line is removed, the world
|
|
11
|
+
# line is added (the world file is created beside the bluebook when the domain has none), and
|
|
12
|
+
# nothing else changes: a translation edge already carries the rename for the data.
|
|
13
|
+
#
|
|
14
|
+
# hecks move_former_name [--dry-run]
|
|
15
|
+
module MoveFormerName
|
|
16
|
+
# One aggregate-level `formerly_known_as` found in a bluebook.
|
|
17
|
+
Candidate = Struct.new(:file, :domain, :aggregate, :former, keyword_init: true)
|
|
18
|
+
|
|
19
|
+
SKIPPED = %r{(^|/)(\.claude|\.git|node_modules|rust|spec|tmp|vendor)/}
|
|
20
|
+
DOMAIN_LINE = /^\s*Hecks\.bluebook\s+"([^"]+)"/
|
|
21
|
+
AGGREGATE_LINE = /^\s*aggregate\s+"([^"]+)"/
|
|
22
|
+
FORMERLY_LINE = /^\s*formerly_known_as\s+"([^"]+)"\s*$/
|
|
23
|
+
WORLD_LINE_START = /^(\s*Hecks\.world\s+"%<domain>s"\s+do\n)/
|
|
24
|
+
BLUEBOOK_EXT = /\.bluebook\z/
|
|
25
|
+
|
|
26
|
+
module_function
|
|
27
|
+
|
|
28
|
+
# @param argv [Array<String>] `--dry-run` to print what would change and write nothing
|
|
29
|
+
# @param root [String] the checkout whose bluebooks are read
|
|
30
|
+
# @return [Integer] 0
|
|
31
|
+
def main(argv, root: Tools::ROOT)
|
|
32
|
+
dry_run = argv.include?("--dry-run")
|
|
33
|
+
found = candidates(root)
|
|
34
|
+
puts "no aggregate-level formerly_known_as found" if found.empty?
|
|
35
|
+
found.group_by(&:file).each { |file, group| move(file, group, root, dry_run) }
|
|
36
|
+
0
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @param root [String] the checkout
|
|
40
|
+
# @return [Array<Candidate>] every aggregate-level `formerly_known_as` under the root
|
|
41
|
+
def candidates(root) = files_under(root, "bluebook").flat_map { |file| in_file(file) }
|
|
42
|
+
|
|
43
|
+
# @param root [String] the checkout
|
|
44
|
+
# @param extension [String] `bluebook` or `world`
|
|
45
|
+
# @return [Array<String>] the files with that extension, outside the folders left alone
|
|
46
|
+
def files_under(root, extension)
|
|
47
|
+
Dir.glob(File.join(root, "**/*.#{extension}")).reject { |file| file.delete_prefix("#{root}/").match?(SKIPPED) }
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# @param file [String] a bluebook
|
|
51
|
+
# @return [Array<Candidate>] its aggregates that carry the word
|
|
52
|
+
def in_file(file)
|
|
53
|
+
text = File.read(file)
|
|
54
|
+
domain = text[DOMAIN_LINE, 1]
|
|
55
|
+
return [] unless domain
|
|
56
|
+
|
|
57
|
+
owner = nil
|
|
58
|
+
text.each_line.filter_map do |line|
|
|
59
|
+
owner = Regexp.last_match(1) if line =~ AGGREGATE_LINE
|
|
60
|
+
next unless owner && line =~ FORMERLY_LINE
|
|
61
|
+
|
|
62
|
+
Candidate.new(file: file, domain: domain, aggregate: owner, former: Regexp.last_match(1))
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Rewrites one bluebook and writes or prints the world lines that replace its words.
|
|
67
|
+
def move(file, group, root, dry_run)
|
|
68
|
+
world = world_file_for(file, group.first.domain, root)
|
|
69
|
+
lines = group.map { |c| "#{c.aggregate}: #{Naming.snake(c.former).inspect}" }
|
|
70
|
+
puts "#{rel(file, root)}: remove #{group.size} formerly_known_as line(s)"
|
|
71
|
+
puts "#{rel(world, root)}: add `stored_as #{lines.join(", ")}`"
|
|
72
|
+
write(file, world, group, lines) unless dry_run
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def write(file, world, group, lines)
|
|
76
|
+
File.write(file, strip(File.read(file), group))
|
|
77
|
+
File.write(world, with_stored_as(world, group.first.domain, lines))
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def strip(text, group)
|
|
81
|
+
group.reduce(text) { |t, c| t.sub(/^[ \t]*formerly_known_as\s+"#{Regexp.escape(c.former)}"[ \t]*\n/, "") }
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# The world file that already names the domain, else `<bluebook>.world` beside the bluebook.
|
|
85
|
+
def world_file_for(file, domain, root)
|
|
86
|
+
named = files_under(root, "world").sort.find { |world| names_domain?(world, domain) }
|
|
87
|
+
named || file.sub(BLUEBOOK_EXT, ".world")
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def names_domain?(world, domain)
|
|
91
|
+
!world.include?(".local.") && File.read(world).match?(/^\s*Hecks\.world\s+"#{Regexp.escape(domain)}"/)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def with_stored_as(world, domain, lines)
|
|
95
|
+
statement = " stored_as #{lines.join(", ")}\n"
|
|
96
|
+
return "Hecks.world #{domain.inspect} do\n#{statement}end\n" unless File.exist?(world)
|
|
97
|
+
|
|
98
|
+
start = Regexp.new(format(WORLD_LINE_START.source, domain: Regexp.escape(domain)))
|
|
99
|
+
File.read(world).sub(start) { "#{Regexp.last_match(1)}#{statement}" }
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def rel(path, root) = path.delete_prefix("#{root}/")
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require_relative "../../hecks"
|
|
2
2
|
|
|
3
3
|
module Hecks
|
|
4
|
-
module
|
|
4
|
+
module Tools
|
|
5
5
|
# The notice `hecks stores` and `hecks history` print when nothing is persisted. Hecks is in
|
|
6
6
|
# Memory unless a local hecksagon opts it in (ADR 0136), so a fresh process holds no records and
|
|
7
7
|
# no journal, and the plain JSON they print would read as an empty store rather than as a store
|
|
@@ -4,7 +4,7 @@ require_relative "../forms"
|
|
|
4
4
|
require_relative "../forms/banking_presentation"
|
|
5
5
|
|
|
6
6
|
module Hecks
|
|
7
|
-
module
|
|
7
|
+
module Tools
|
|
8
8
|
# The command behind `hecks present` and `hecks present`: serves the banking example's rendered
|
|
9
9
|
# forms and views, backed by the in-memory adapter
|
|
10
10
|
# (docs/command-form-and-query-form-bluebook.md).
|