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
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require "fileutils"
|
|
4
4
|
require "json"
|
|
5
|
+
require "open3"
|
|
5
6
|
require "tmpdir"
|
|
6
7
|
require_relative "../write_if_changed"
|
|
7
8
|
|
|
@@ -41,11 +42,10 @@ module Hecks
|
|
|
41
42
|
|
|
42
43
|
# @param rust_dir [String] the workspace being generated into
|
|
43
44
|
# @param out_root [String] the crate's `src/generated`
|
|
44
|
-
# @param target [
|
|
45
|
-
# @param
|
|
46
|
-
# @param meta [Hash, nil] the self-hosted language's IR; nil leaves
|
|
47
|
-
|
|
48
|
-
def initialize(rust_dir:, out_root:, target:, declarations:, meta:)
|
|
45
|
+
# @param target [Declaration, nil] the domain being projected; nil for a run of `meta` alone
|
|
46
|
+
# @param declarations [Array<Declaration>] every other bluebook the target attached
|
|
47
|
+
# @param meta [Hash, nil] the self-hosted language's IR; nil leaves `meta` as it is on disk
|
|
48
|
+
def initialize(rust_dir:, out_root:, meta: nil, target: nil, declarations: [])
|
|
49
49
|
@rust_dir = rust_dir
|
|
50
50
|
@out_root = out_root
|
|
51
51
|
@target = target
|
|
@@ -61,18 +61,49 @@ module Hecks
|
|
|
61
61
|
stage = File.join(tmp, "generated")
|
|
62
62
|
FileUtils.mkdir_p(stage)
|
|
63
63
|
generate_meta(stage, tmp) if @meta
|
|
64
|
-
generate_target(stage, tmp)
|
|
64
|
+
generate_target(stage, tmp) if @target
|
|
65
65
|
sync(stage)
|
|
66
66
|
end
|
|
67
67
|
end
|
|
68
68
|
|
|
69
|
+
# Builds the binary once, then holds the build as done while the block runs. Each `cargo
|
|
70
|
+
# build` replaces the binary with a fresh link, so children forked to generate side by side
|
|
71
|
+
# would each leave a moment when a sibling finds no binary to start; the parent builds
|
|
72
|
+
# instead, before the fork, and the children skip it.
|
|
73
|
+
#
|
|
74
|
+
# @param rust_dir [String] the workspace being generated into
|
|
75
|
+
# @yield the work that forks the children
|
|
76
|
+
# @return [Object] the block's value
|
|
77
|
+
# @raise [Failure] when `hecks-codegen` cannot be built
|
|
78
|
+
def self.prebuilt(rust_dir)
|
|
79
|
+
dir = crate_dir(rust_dir)
|
|
80
|
+
build(dir)
|
|
81
|
+
@prebuilt = dir
|
|
82
|
+
yield
|
|
83
|
+
ensure
|
|
84
|
+
@prebuilt = nil
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# @param dir [String] the `hecks-codegen` crate's directory
|
|
88
|
+
# @return [Boolean] whether a parent process built it for the children it forked
|
|
89
|
+
def self.prebuilt?(dir) = @prebuilt == dir
|
|
90
|
+
|
|
91
|
+
# @param dir [String] the `hecks-codegen` crate's directory
|
|
92
|
+
# @return [void]
|
|
93
|
+
# @raise [Failure] when Cargo cannot build it
|
|
94
|
+
def self.build(dir)
|
|
95
|
+
output, status = Open3.capture2e("cargo", "build", "--quiet", chdir: dir)
|
|
96
|
+
$stdout.write(output)
|
|
97
|
+
return if status.success?
|
|
98
|
+
|
|
99
|
+
raise Failure, "hecks project_rust: cargo build failed in #{dir} — run it there directly to see why"
|
|
100
|
+
end
|
|
101
|
+
|
|
69
102
|
private
|
|
70
103
|
|
|
71
104
|
def build_binary
|
|
72
105
|
dir = self.class.crate_dir(@rust_dir)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
raise Failure, "hecks project_rust: cargo build failed in #{dir} — run it there directly to see why"
|
|
106
|
+
self.class.build(dir) unless self.class.prebuilt?(dir)
|
|
76
107
|
end
|
|
77
108
|
|
|
78
109
|
def generate_meta(stage, tmp)
|
|
@@ -114,9 +145,11 @@ module Hecks
|
|
|
114
145
|
end
|
|
115
146
|
|
|
116
147
|
def copy_changed(source, dest)
|
|
117
|
-
Dir.children(source).sort.
|
|
118
|
-
|
|
119
|
-
|
|
148
|
+
texts = Dir.children(source).sort.to_h do |file|
|
|
149
|
+
[File.join(dest, file), File.read(File.join(source, file), encoding: "UTF-8")]
|
|
150
|
+
end
|
|
151
|
+
RustFormat.files(texts).each do |path, text|
|
|
152
|
+
wrote = WriteIfChanged.call(path, text, formatted: true, atomic: true)
|
|
120
153
|
puts(wrote ? "wrote #{path}" : "#{path} unchanged")
|
|
121
154
|
end
|
|
122
155
|
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module RustBuild
|
|
5
|
+
class ProjectRust
|
|
6
|
+
# The corpus's declared domains, which a corpus run hands every `hecks project_rust` it
|
|
7
|
+
# makes. Given them, a run writes `mod.rs` and Cargo's features for exactly these domains and
|
|
8
|
+
# leaves Cargo's `default` on `default`, so what a domain generates does not depend on which
|
|
9
|
+
# domains ran before it. Without them (a workspace of one's own) a run follows the domains on
|
|
10
|
+
# disk and points `default` at the domain it generated.
|
|
11
|
+
#
|
|
12
|
+
# A run that regenerates only some of the declared domains says so with `--partial`. It writes
|
|
13
|
+
# those domains and leaves `mod.rs` and Cargo's features to a run of the whole corpus: the
|
|
14
|
+
# bluebooks `mod.rs` lists are the ones on disk, so a few domains' run would drop the rest.
|
|
15
|
+
#
|
|
16
|
+
# hecks project_rust examples/pizzas --declared=banking,pizzas --default=pizzas --partial
|
|
17
|
+
class Declared
|
|
18
|
+
# The flag naming the declared domains, comma-separated.
|
|
19
|
+
DOMAINS_FLAG = "--declared="
|
|
20
|
+
# The flag naming the declared feature Cargo's `default` stays on.
|
|
21
|
+
DEFAULT_FLAG = "--default="
|
|
22
|
+
# The flag saying this run is one of some, not of the whole corpus.
|
|
23
|
+
PARTIAL_FLAG = "--partial"
|
|
24
|
+
|
|
25
|
+
# @return [Array<String>] the declared domains' feature names
|
|
26
|
+
attr_reader :domains
|
|
27
|
+
# @return [String] the one of them Cargo's `default` stays on
|
|
28
|
+
attr_reader :default
|
|
29
|
+
|
|
30
|
+
# Takes the declared flags out of a command line.
|
|
31
|
+
#
|
|
32
|
+
# @param argv [Array<String>] the arguments of `hecks project_rust`
|
|
33
|
+
# @return [Array(Declared, Array<String>), Array(nil, Array<String>)] what the flags
|
|
34
|
+
# declared (nil when there are none) and the arguments left
|
|
35
|
+
# @raise [Failure] when one flag is given without the other, or `default` is not declared
|
|
36
|
+
def self.split(argv)
|
|
37
|
+
flags, rest = argv.partition { |arg| arg.start_with?(DOMAINS_FLAG, DEFAULT_FLAG) || arg == PARTIAL_FLAG }
|
|
38
|
+
return [nil, rest] if flags.empty?
|
|
39
|
+
|
|
40
|
+
[read(flags), rest]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @param flags [Array<String>] the declared flags of a command line
|
|
44
|
+
# @return [Declared] what they declare
|
|
45
|
+
# @raise [Failure] when one flag is given without the other, or `default` is not declared
|
|
46
|
+
def self.read(flags)
|
|
47
|
+
domains = value(flags, DOMAINS_FLAG)&.split(",")
|
|
48
|
+
default = value(flags, DEFAULT_FLAG)
|
|
49
|
+
unless domains && default && domains.include?(default)
|
|
50
|
+
raise Failure, "hecks project_rust: #{DOMAINS_FLAG}<a,b,...> and #{DEFAULT_FLAG}<one of them> go together"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
new(domains, default, partial: flags.include?(PARTIAL_FLAG))
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def self.value(flags, flag)
|
|
57
|
+
flags.find { |arg| arg.start_with?(flag) }&.delete_prefix(flag)
|
|
58
|
+
end
|
|
59
|
+
private_class_method :value, :read
|
|
60
|
+
|
|
61
|
+
# @param domains [Array<String>] the declared domains' feature names
|
|
62
|
+
# @param default [String] the declared domain Cargo's `default` stays on
|
|
63
|
+
# @param partial [Boolean] whether this run generates only some of them
|
|
64
|
+
def initialize(domains, default, partial: false)
|
|
65
|
+
@domains = domains
|
|
66
|
+
@default = default
|
|
67
|
+
@partial = partial
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# @return [Boolean] whether this run leaves `mod.rs` and Cargo's features to a whole run
|
|
71
|
+
def partial? = @partial
|
|
72
|
+
|
|
73
|
+
# @return [Array<String>] the flags that declare these domains to `hecks project_rust`
|
|
74
|
+
def flags
|
|
75
|
+
["#{DOMAINS_FLAG}#{domains.join(",")}", "#{DEFAULT_FLAG}#{default}", *(PARTIAL_FLAG if partial?)]
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module RustBuild
|
|
5
|
+
class ProjectRust
|
|
6
|
+
# What a Cargo manifest with no `[features]` table is given in front of its text.
|
|
7
|
+
FEATURES_HEADER = <<~TOML
|
|
8
|
+
# One feature per generated domain: it selects which domain's own
|
|
9
|
+
# generated::<domain>::merged module `generated::active` re-exports
|
|
10
|
+
# (rust/src/generated/mod.rs). `hecks project_rust` adds a feature when a new domain is
|
|
11
|
+
# generated and never removes one (the domain's own generated/<name>/ directory is the
|
|
12
|
+
# source of truth for whether it exists). `default` tracks the domain generated most
|
|
13
|
+
# recently, so a bare `cargo build` keeps working; any other still-generated domain stays
|
|
14
|
+
# reachable via `--no-default-features --features <name>`.
|
|
15
|
+
[features]
|
|
16
|
+
default = []
|
|
17
|
+
|
|
18
|
+
TOML
|
|
19
|
+
private_constant :FEATURES_HEADER
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../write_if_changed"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
module RustBuild
|
|
7
|
+
class ProjectRust
|
|
8
|
+
# The two files every domain's generation shares: `src/generated/mod.rs` and the workspace's
|
|
9
|
+
# `Cargo.toml` features. A run of one domain writes them after its own files; a corpus run
|
|
10
|
+
# that generates its domains side by side tells each `--partial` and writes them once, here,
|
|
11
|
+
# after the last domain is done, so no two processes ever write them.
|
|
12
|
+
class Manifest
|
|
13
|
+
# The `default = [...]` line of a Cargo manifest's `[features]` table.
|
|
14
|
+
DEFAULT_FEATURE = /^default\s*=.*$/
|
|
15
|
+
# The `[features]` table of a Cargo manifest, up to the next table header.
|
|
16
|
+
FEATURES_TABLE = /^\[features\](?:\n(?!\[).*)*$/
|
|
17
|
+
|
|
18
|
+
# @param rust_dir [String] the workspace, which holds `Cargo.toml` and `src/generated`
|
|
19
|
+
# @param declared [Declared, nil] the corpus's declared domains; nil follows the domains on
|
|
20
|
+
# disk
|
|
21
|
+
# @param default [String] the feature `mod.rs` treats as the default and Cargo's `default`
|
|
22
|
+
# points at
|
|
23
|
+
def initialize(rust_dir, declared, default)
|
|
24
|
+
@rust_dir = rust_dir
|
|
25
|
+
@out_root = File.join(rust_dir, "src/generated")
|
|
26
|
+
@declared = declared
|
|
27
|
+
@default = default
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Writes `mod.rs` and syncs Cargo's features, each only when its bytes change.
|
|
31
|
+
#
|
|
32
|
+
# @return [void]
|
|
33
|
+
def call
|
|
34
|
+
write_root_mod
|
|
35
|
+
sync_cargo_features
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
# `src/generated/mod.rs`. A directory is a selectable domain exactly when it carries its own
|
|
41
|
+
# `merged.rs`; a framework bluebook has none and is always compiled in. The domains are
|
|
42
|
+
# scanned off disk, or, for the corpus, taken from its declared list.
|
|
43
|
+
def write_root_mod
|
|
44
|
+
all_dirs = generated_directories
|
|
45
|
+
@domains = domains_among(all_dirs)
|
|
46
|
+
path = File.join(@out_root, "mod.rs")
|
|
47
|
+
wrote = WriteIfChanged.block(path) do |file|
|
|
48
|
+
RootMod.new(file, all_dirs, @domains, @default).write
|
|
49
|
+
end
|
|
50
|
+
puts(wrote ? "wrote #{path}" : "#{path} unchanged")
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Every directory under `src/generated`. Under a declared list, its domains are named
|
|
54
|
+
# even when not generated here yet, and a leftover domain directory it does not declare is
|
|
55
|
+
# dropped.
|
|
56
|
+
def generated_directories
|
|
57
|
+
dirs = Dir.children(@out_root).select { |name| File.directory?(File.join(@out_root, name)) }
|
|
58
|
+
return dirs.sort unless @declared
|
|
59
|
+
|
|
60
|
+
bluebooks = dirs.reject { |name| File.exist?(File.join(@out_root, name, "merged.rs")) }
|
|
61
|
+
(bluebooks | @declared.domains).sort
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def domains_among(directories)
|
|
65
|
+
return @declared.domains.sort if @declared
|
|
66
|
+
|
|
67
|
+
directories.select { |name| File.exist?(File.join(@out_root, name, "merged.rs")) }
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# One Cargo feature per domain (added when missing, never removed), with `default` set to
|
|
71
|
+
# the default feature so a bare `cargo build` builds it. A feature is inserted right after
|
|
72
|
+
# `default = [...]`, not appended: past `[[bin]]` it would parse into that table.
|
|
73
|
+
def sync_cargo_features
|
|
74
|
+
path = File.join(@rust_dir, "Cargo.toml")
|
|
75
|
+
manifest = File.read(path)
|
|
76
|
+
manifest = "#{FEATURES_HEADER}#{manifest}" unless manifest.include?("[features]")
|
|
77
|
+
@domains.each { |name| manifest = add_feature(manifest, name) }
|
|
78
|
+
manifest = manifest.sub(DEFAULT_FEATURE, "default = [#{@default.inspect}]")
|
|
79
|
+
# An unchanged manifest is not rewritten: a new mtime makes Cargo rebuild the whole crate.
|
|
80
|
+
return puts("#{path} unchanged (default feature already #{@default})") unless WriteIfChanged.call(path, manifest)
|
|
81
|
+
|
|
82
|
+
puts "wrote #{path} (default feature: #{@default})"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Checked against the `[features]` table only: `[package]`'s `name` or a `[[bin]]` path can
|
|
86
|
+
# share a word with a domain name.
|
|
87
|
+
def add_feature(manifest, name)
|
|
88
|
+
table = manifest[FEATURES_TABLE] || ""
|
|
89
|
+
return manifest if table =~ /^#{Regexp.escape(name)}\s*=/
|
|
90
|
+
|
|
91
|
+
manifest.sub(DEFAULT_FEATURE) { "#{Regexp.last_match(0)}\n#{name} = []" }
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "fileutils"
|
|
4
|
+
require_relative "../../bluebook/meta_validator"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module RustBuild
|
|
8
|
+
class ProjectRust
|
|
9
|
+
# The self-hosted language's Rust, `src/generated/meta`. It is generated from the grammar
|
|
10
|
+
# registry alone, so it is the same whichever domain a run projects: a corpus run generates it
|
|
11
|
+
# once here and tells each of its `hecks project_rust` children to skip it (`SKIP_FLAG`),
|
|
12
|
+
# instead of every child writing the identical files again.
|
|
13
|
+
module Meta
|
|
14
|
+
# The flag telling a `hecks project_rust` run that `meta` is already generated.
|
|
15
|
+
SKIP_FLAG = "--skip-meta"
|
|
16
|
+
|
|
17
|
+
# @return [Hash] the self-hosted language's IR, shaped for `hecks-codegen`
|
|
18
|
+
def self.ir
|
|
19
|
+
bluebook = Hecks::Projector::Exporter.call(Hecks::Bluebook::MetaValidator.grammar_registry).fetch("Bluebook")
|
|
20
|
+
TargetIr.json_shaped(bluebook)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Generates `meta` into the workspace, writing only the files whose bytes changed.
|
|
24
|
+
#
|
|
25
|
+
# @param rust_dir [String] the workspace being generated into
|
|
26
|
+
# @return [void]
|
|
27
|
+
# @raise [Failure] when `hecks-codegen` cannot be built or exits non-zero
|
|
28
|
+
def self.generate(rust_dir = RustBuild.rust_dir)
|
|
29
|
+
out_root = File.join(rust_dir, "src/generated")
|
|
30
|
+
FileUtils.mkdir_p(out_root)
|
|
31
|
+
CodegenRun.new(rust_dir: rust_dir, out_root: out_root, meta: ir).call
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -22,25 +22,28 @@ module Hecks
|
|
|
22
22
|
# The era plugin is required unconditionally so the generator works for any domain, lineage
|
|
23
23
|
# capable or not; `pg` stays lazy inside it, so nothing here opens a database connection.
|
|
24
24
|
class ProjectRust
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
SKIP_META = "--skip-meta"
|
|
28
|
-
|
|
29
|
-
# @param argv [Array<String>] the domain's directory, and `--skip-meta` to leave `meta/` alone
|
|
25
|
+
# @param argv [Array<String>] the domain's directory, then optionally the corpus run's
|
|
26
|
+
# `Declared` flags
|
|
30
27
|
# @return [Integer] the exit status
|
|
31
28
|
# @raise [Failure] when the domain's name cannot be a Rust module and Cargo feature name
|
|
32
29
|
def self.call(argv)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
skip_meta, argv = argv.partition { |arg| arg == Meta::SKIP_FLAG }
|
|
31
|
+
declared, rest = Declared.split(argv)
|
|
32
|
+
domain = rest.first or raise Failure, "usage: hecks project_rust <domain>"
|
|
33
|
+
new(domain, declared: declared, meta: skip_meta.empty?).call
|
|
36
34
|
end
|
|
37
35
|
|
|
38
36
|
# @param domain [String] the domain's directory
|
|
39
|
-
# @param
|
|
40
|
-
|
|
37
|
+
# @param declared [Declared, nil] the corpus's declared domains; nil for a workspace of one's
|
|
38
|
+
# own, where `mod.rs` and Cargo's features follow the domains on disk and `default` the
|
|
39
|
+
# domain this run generated
|
|
40
|
+
# @param meta [Boolean] whether this run generates `meta`; a corpus run that has done so once
|
|
41
|
+
# says `Meta::SKIP_FLAG` to each domain
|
|
42
|
+
def initialize(domain, declared: nil, meta: true)
|
|
41
43
|
@domain = domain
|
|
42
44
|
@mod_name = File.basename(domain)
|
|
43
|
-
@
|
|
45
|
+
@declared = declared
|
|
46
|
+
@meta = meta
|
|
44
47
|
end
|
|
45
48
|
|
|
46
49
|
# @return [Integer] the exit status
|
|
@@ -73,8 +76,9 @@ module Hecks
|
|
|
73
76
|
@ir = TargetIr.new(@registry, @domain_name, loader.bluebook_dir).call
|
|
74
77
|
FileUtils.rm_rf(File.join(@out_root, "active"))
|
|
75
78
|
generate_with_codegen
|
|
76
|
-
|
|
77
|
-
|
|
79
|
+
return puts("mod.rs and Cargo.toml left to a run of the whole corpus (--partial)") if @declared&.partial?
|
|
80
|
+
|
|
81
|
+
Manifest.new(@rust_dir, @declared, default_feature).call
|
|
78
82
|
end
|
|
79
83
|
|
|
80
84
|
def prepare_output
|
|
@@ -87,98 +91,32 @@ module Hecks
|
|
|
87
91
|
# registry, so a domain's persistence, seams, translations and source text reach `ir.json`.
|
|
88
92
|
def generate_with_codegen
|
|
89
93
|
CodegenRun.new(
|
|
90
|
-
rust_dir: @rust_dir, out_root: @out_root, meta:
|
|
94
|
+
rust_dir: @rust_dir, out_root: @out_root, meta: (Meta.ir if @meta), declarations: declarations,
|
|
91
95
|
target: CodegenRun::Declaration.new(@mod_name, @domain, @ir)
|
|
92
96
|
).call
|
|
93
97
|
end
|
|
94
98
|
|
|
95
|
-
#
|
|
96
|
-
|
|
97
|
-
return nil if @skip_meta
|
|
98
|
-
|
|
99
|
-
meta = Hecks::Projector::Exporter.call(Hecks::Bluebook::MetaValidator.grammar_registry).fetch("Bluebook")
|
|
100
|
-
TargetIr.json_shaped(meta)
|
|
101
|
-
end
|
|
102
|
-
|
|
99
|
+
# A declaration is labelled by its own name: its files read the same whoever attached it, so
|
|
100
|
+
# regenerating one domain never changes what another domain's files contain.
|
|
103
101
|
def declarations
|
|
104
|
-
vendored = @registry.hecksagons.values.flat_map(&:vendored_packages)
|
|
105
102
|
(@registry.bluebooks.keys - [@domain_name]).map do |name|
|
|
106
103
|
ir = Hecks::Projector::Exporter.call(@registry).fetch(name)
|
|
107
|
-
|
|
108
|
-
CodegenRun::Declaration.new(name.downcase, label, TargetIr.json_shaped(ir))
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
# How the target attached a bluebook, across every hecksagon the registry loaded: a bluebook a
|
|
113
|
-
# sibling hecksagon vendors in is labelled as vendored.
|
|
114
|
-
def attachment(declaration_name, vendored)
|
|
115
|
-
name = vendored.find { |candidate| Hecks::Naming.pascal(candidate.to_s) == declaration_name }
|
|
116
|
-
name ? "attaches #{name.inspect}, from: :vendor" : "attaches #{declaration_name.inspect}"
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# `src/generated/mod.rs`: every domain ever generated, scanned off disk. A directory is a
|
|
120
|
-
# selectable domain exactly when it carries its own `merged.rs`; a framework bluebook has
|
|
121
|
-
# none and is always compiled in.
|
|
122
|
-
def write_root_mod
|
|
123
|
-
all_dirs = Dir.children(@out_root).select { |name| File.directory?(File.join(@out_root, name)) }.sort
|
|
124
|
-
@domains = all_dirs.select { |name| File.exist?(File.join(@out_root, name, "merged.rs")) }
|
|
125
|
-
path = File.join(@out_root, "mod.rs")
|
|
126
|
-
wrote = WriteIfChanged.block(path) do |file|
|
|
127
|
-
RootMod.new(file, all_dirs, @domains, @mod_name).write
|
|
104
|
+
CodegenRun::Declaration.new(name.downcase, name, TargetIr.json_shaped(ir))
|
|
128
105
|
end
|
|
129
|
-
puts(wrote ? "wrote #{path}" : "#{path} unchanged")
|
|
130
106
|
end
|
|
131
107
|
|
|
132
|
-
#
|
|
133
|
-
#
|
|
134
|
-
|
|
135
|
-
def sync_cargo_features
|
|
136
|
-
path = File.join(@rust_dir, "Cargo.toml")
|
|
137
|
-
manifest = File.read(path)
|
|
138
|
-
manifest = "#{FEATURES_HEADER}#{manifest}" unless manifest.include?("[features]")
|
|
139
|
-
@domains.each { |name| manifest = add_feature(manifest, name) }
|
|
140
|
-
manifest = manifest.sub(DEFAULT_FEATURE, "default = [#{@mod_name.inspect}]")
|
|
141
|
-
# An unchanged manifest is not rewritten: a new mtime makes Cargo rebuild the whole crate.
|
|
142
|
-
if WriteIfChanged.call(path, manifest)
|
|
143
|
-
puts "wrote #{path} (default feature: #{@mod_name})"
|
|
144
|
-
else
|
|
145
|
-
puts "#{path} unchanged (default feature already #{@mod_name})"
|
|
146
|
-
end
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
# Checked against the `[features]` table only: `[package]`'s `name` or a `[[bin]]` path can
|
|
150
|
-
# share a word with a domain name.
|
|
151
|
-
def add_feature(manifest, name)
|
|
152
|
-
table = manifest[FEATURES_TABLE] || ""
|
|
153
|
-
return manifest if table =~ /^#{Regexp.escape(name)}\s*=/
|
|
154
|
-
|
|
155
|
-
manifest.sub(DEFAULT_FEATURE) { "#{Regexp.last_match(0)}\n#{name} = []" }
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
FEATURES_HEADER = <<~TOML
|
|
159
|
-
# One feature per generated domain: it selects which domain's own
|
|
160
|
-
# generated::<domain>::merged module `generated::active` re-exports
|
|
161
|
-
# (rust/src/generated/mod.rs). `hecks project_rust` adds a feature when a new domain is
|
|
162
|
-
# generated and never removes one (the domain's own generated/<name>/ directory is the
|
|
163
|
-
# source of truth for whether it exists). `default` tracks the domain generated most
|
|
164
|
-
# recently, so a bare `cargo build` keeps working; any other still-generated domain stays
|
|
165
|
-
# reachable via `--no-default-features --features <name>`.
|
|
166
|
-
[features]
|
|
167
|
-
default = []
|
|
168
|
-
|
|
169
|
-
TOML
|
|
170
|
-
private_constant :FEATURES_HEADER
|
|
171
|
-
|
|
172
|
-
# The `default = [...]` line of a Cargo manifest's `[features]` table.
|
|
173
|
-
DEFAULT_FEATURE = /^default\s*=.*$/
|
|
174
|
-
# The `[features]` table of a Cargo manifest, up to the next table header.
|
|
175
|
-
FEATURES_TABLE = /^\[features\](?:\n(?!\[).*)*$/
|
|
176
|
-
private_constant :DEFAULT_FEATURE, :FEATURES_TABLE
|
|
108
|
+
# The feature `default` points at, and the one `mod.rs` treats as the default: the corpus's
|
|
109
|
+
# fixed one, else the domain this run generated.
|
|
110
|
+
def default_feature = @declared ? @declared.default : @mod_name
|
|
177
111
|
end
|
|
178
112
|
end
|
|
179
113
|
end
|
|
180
114
|
|
|
115
|
+
require_relative "project_rust/declared"
|
|
116
|
+
require_relative "project_rust/features_header"
|
|
181
117
|
require_relative "project_rust/root_mod"
|
|
182
118
|
require_relative "project_rust/codegen_run"
|
|
119
|
+
require_relative "project_rust/meta"
|
|
183
120
|
require_relative "project_rust/domain_loader"
|
|
184
121
|
require_relative "project_rust/target_ir"
|
|
122
|
+
require_relative "project_rust/manifest"
|
|
@@ -45,18 +45,33 @@ module Hecks
|
|
|
45
45
|
private_class_method :record_touch
|
|
46
46
|
|
|
47
47
|
# Writes `content` to `path` unless it already holds identical bytes.
|
|
48
|
-
# Returns whether it wrote.
|
|
49
|
-
|
|
48
|
+
# Returns whether it wrote. `formatted` says the caller already ran `content` through rustfmt.
|
|
49
|
+
# `atomic` writes a sibling temp file and renames it into place, so a process reading `path`
|
|
50
|
+
# while others write the same bytes never sees a truncated or half-written file.
|
|
51
|
+
def call(path, content, formatted: false, atomic: false)
|
|
50
52
|
record_touch(path)
|
|
51
|
-
content = RustFormat.call(content) if RustFormat.rust?(path)
|
|
53
|
+
content = RustFormat.call(content) if RustFormat.rust?(path) && !formatted
|
|
52
54
|
# `.b` on both sides: String#== is encoding-aware, so UTF-8 vs ASCII-8BIT
|
|
53
55
|
# content can compare unequal even when the bytes are identical.
|
|
54
56
|
return false if File.exist?(path) && File.binread(path) == content.b
|
|
55
57
|
|
|
56
|
-
File.write(path, content)
|
|
58
|
+
atomic ? replace(path, content) : File.write(path, content)
|
|
57
59
|
true
|
|
58
60
|
end
|
|
59
61
|
|
|
62
|
+
# Puts `content` at `path` by renaming a finished temp file over it. The temp file is hidden
|
|
63
|
+
# (a leading dot), so a directory's `*` listing, which prunes what a run did not write, never
|
|
64
|
+
# sees it, and it keeps the existing file's permissions.
|
|
65
|
+
def replace(path, content)
|
|
66
|
+
tmp = File.join(File.dirname(path), ".#{File.basename(path)}.tmp-#{Process.pid}")
|
|
67
|
+
File.write(tmp, content)
|
|
68
|
+
File.chmod(File.stat(path).mode & 0o7777, tmp) if File.exist?(path)
|
|
69
|
+
File.rename(tmp, path)
|
|
70
|
+
ensure
|
|
71
|
+
FileUtils.rm_f(tmp)
|
|
72
|
+
end
|
|
73
|
+
private_class_method :replace
|
|
74
|
+
|
|
60
75
|
# Fills `tmp` from the block, then lays it out with rustfmt when `path` is Rust source.
|
|
61
76
|
def write_formatted(tmp, path, &)
|
|
62
77
|
File.open(tmp, "w", &)
|
data/lib/hecks/rust_build.rb
CHANGED
|
@@ -35,7 +35,8 @@ module Hecks
|
|
|
35
35
|
"project_wasm_browser" => ["rust_build/wasm_browser", :WasmBrowser],
|
|
36
36
|
"rust_conformance" => ["rust_build/conformance", :Conformance],
|
|
37
37
|
"rust_conformance_fuzz" => ["rust_build/conformance_fuzz", :ConformanceFuzz],
|
|
38
|
-
"rust_coverage" => ["rust_build/coverage", :Coverage]
|
|
38
|
+
"rust_coverage" => ["rust_build/coverage", :Coverage],
|
|
39
|
+
"build_parser" => ["rust_build/parser", :Parser]
|
|
39
40
|
}.freeze
|
|
40
41
|
|
|
41
42
|
# The process-wide lock a call holds while it swaps `ENV`, `$stdout` and `$stderr`; the same
|
data/lib/hecks/rust_format.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "etc"
|
|
3
4
|
require "open3"
|
|
4
5
|
|
|
5
6
|
module Hecks
|
|
@@ -21,6 +22,10 @@ module Hecks
|
|
|
21
22
|
# The most passes `call` makes; a text still changing after them keeps the last result.
|
|
22
23
|
PASSES = 3
|
|
23
24
|
|
|
25
|
+
# Serializes the rustfmt children of this process. In a whole-suite run, worker threads capturing
|
|
26
|
+
# at once end with `Errno::EBADF` in `Open3.popen_run`, so each capture waits for this lock.
|
|
27
|
+
SPAWN_LOCK = Mutex.new
|
|
28
|
+
|
|
24
29
|
module_function
|
|
25
30
|
|
|
26
31
|
# @param path [String] where the text will be written
|
|
@@ -56,7 +61,9 @@ module Hecks
|
|
|
56
61
|
# @return [String] the source after one pass, or unchanged when rustfmt cannot parse it
|
|
57
62
|
# @raise [Failed] when rustfmt fails for a reason other than the text
|
|
58
63
|
def pass(text)
|
|
59
|
-
out, err, status =
|
|
64
|
+
out, err, status = SPAWN_LOCK.synchronize do
|
|
65
|
+
Open3.capture3("rustfmt", "--edition", EDITION, "--emit", "stdout", stdin_data: text)
|
|
66
|
+
end
|
|
60
67
|
return out if status.success?
|
|
61
68
|
raise Failed, "rustfmt failed: #{err.lines.first&.strip}" unless err.include?("<stdin>")
|
|
62
69
|
|
|
@@ -71,7 +78,30 @@ module Hecks
|
|
|
71
78
|
# @param content [Hash{String => String}] absolute path to text
|
|
72
79
|
# @return [Hash{String => String}] the same map with each `.rs` text formatted
|
|
73
80
|
def files(content)
|
|
74
|
-
content.
|
|
81
|
+
rust = content.select { |path, _| rust?(path) }
|
|
82
|
+
formatted = parallel_map(rust.values) { |text| call(text) }
|
|
83
|
+
content.to_h { |path, text| [path, rust.key?(path) ? formatted.shift : text] }
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Maps `items` through the block on one thread per core. rustfmt runs as a child process, so
|
|
87
|
+
# the threads wait on it rather than on the interpreter lock; order is kept.
|
|
88
|
+
#
|
|
89
|
+
# @param items [Array] the inputs
|
|
90
|
+
# @return [Array] the block's result for each input, in order
|
|
91
|
+
def parallel_map(items)
|
|
92
|
+
results = Array.new(items.size)
|
|
93
|
+
queue = closed_queue(items.size)
|
|
94
|
+
workers = Array.new([Etc.nprocessors, items.size].min) do
|
|
95
|
+
Thread.new { while (index = queue.pop) do results[index] = yield(items[index]) end }
|
|
96
|
+
end
|
|
97
|
+
workers.each(&:join)
|
|
98
|
+
results
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# @param size [Integer] how many indexes to hold
|
|
102
|
+
# @return [Queue] the indexes 0...size, closed, so a pop past the last returns nil
|
|
103
|
+
def closed_queue(size)
|
|
104
|
+
Queue.new((0...size).to_a).tap(&:close)
|
|
75
105
|
end
|
|
76
106
|
end
|
|
77
107
|
end
|