hecks 6.0.0 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/exe/hecks +19 -12
- data/lib/hecks/adapters/driven/claude_code.rb +2 -2
- data/lib/hecks/adapters/driven/folder.rb +10 -1
- data/lib/hecks/adapters/driven/folder_overlay.rb +15 -0
- data/lib/hecks/adapters/driven/heki.rb +1 -1
- data/lib/hecks/adapters/driven/in_process_key_vault.rb +1 -1
- data/lib/hecks/adapters/driven/memory/outbox_rows.rb +2 -2
- data/lib/hecks/adapters/driven/postgres/name_guard.rb +25 -0
- data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -3
- data/lib/hecks/adapters/driven/postgres/repository.rb +1 -1
- data/lib/hecks/adapters/driven/postgres/shared_connection.rb +1 -1
- data/lib/hecks/adapters/driven/postgres.rb +3 -0
- data/lib/hecks/adapters/driven/postgres_era/boot.rb +28 -16
- data/lib/hecks/adapters/driven/postgres_era/class_methods.rb +27 -7
- data/lib/hecks/adapters/driven/postgres_era/dialect.rb +10 -5
- data/lib/hecks/adapters/driven/postgres_era/field_cache_provisioner.rb +39 -0
- data/lib/hecks/adapters/driven/postgres_era/journal.rb +52 -13
- data/lib/hecks/adapters/driven/postgres_era/lineage/chain_sql.rb +29 -49
- data/lib/hecks/adapters/driven/postgres_era/lineage/direct_sql.rb +73 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/direct_verified.json +10 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/direct_verified.rb +65 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/domain_rename.rb +77 -25
- data/lib/hecks/adapters/driven/postgres_era/lineage/domain_rename_state.rb +108 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/era_integrity.rb +11 -6
- data/lib/hecks/adapters/driven/postgres_era/lineage/era_store.rb +63 -5
- data/lib/hecks/adapters/driven/postgres_era/lineage/layered_sql.rb +64 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/ledger_reset.rb +150 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/mint_provisioning.rb +85 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/mint_transaction.rb +11 -7
- data/lib/hecks/adapters/driven/postgres_era/lineage/provisioning.rb +11 -5
- data/lib/hecks/adapters/driven/postgres_era/lineage/split_sql.rb +76 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/sql_templates.rb +9 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage.rb +10 -2
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/context.rb +23 -3
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/coverage_check.rb +3 -1
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/disposable_ledger.rb +119 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolution.rb +219 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolver.rb +68 -71
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/held_era.rb +68 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/ledger_change.rb +63 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/merge_coordinator.rb +1 -1
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/mint_decision.rb +163 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/mint_request.rb +24 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/minter.rb +59 -21
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/refusals.rb +24 -11
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager.rb +40 -6
- data/lib/hecks/adapters/driven/postgres_era/shared_tables.rb +32 -0
- data/lib/hecks/adapters/driven/postgres_era.adapter +12 -0
- data/lib/hecks/adapters/driven/postgres_era.rb +25 -10
- data/lib/hecks/adapters/driven/prism.rb +0 -1
- data/lib/hecks/adapters/driven/sql_query_builder.rb +1 -0
- data/lib/hecks/adapters/driven/sqlite/dispatch_claims.rb +1 -1
- data/lib/hecks/adapters/driven/sqlite/name_guard.rb +25 -0
- data/lib/hecks/adapters/driven/sqlite/outbox.rb +2 -2
- data/lib/hecks/adapters/driven/sqlite/repository.rb +1 -1
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +20 -0
- data/lib/hecks/adapters/driven/sqlite.rb +9 -1
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +1 -1
- data/lib/hecks/adapters/driven/worktree_overlay.rb +117 -0
- data/lib/hecks/adapters/driving/cli/shorthand.rb +5 -1
- data/lib/hecks/adapters/driving/cli.rb +1 -1
- data/lib/hecks/adapters/driving/cli_runner/answers.rb +77 -22
- data/lib/hecks/adapters/driving/cli_runner/bang_rule.rb +35 -0
- data/lib/hecks/adapters/driving/cli_runner/completion_words.rb +36 -0
- data/lib/hecks/adapters/driving/cli_runner/json_words.rb +55 -0
- data/lib/hecks/adapters/driving/cli_runner/name_index.rb +63 -0
- data/lib/hecks/adapters/driving/cli_runner/read_context.rb +32 -0
- data/lib/hecks/adapters/driving/cli_runner/renamed_names.rb +49 -0
- data/lib/hecks/adapters/driving/cli_runner/resolution.rb +43 -17
- data/lib/hecks/adapters/driving/cli_runner/resume_words.rb +63 -0
- data/lib/hecks/adapters/driving/cli_runner/run_reference.rb +66 -0
- data/lib/hecks/adapters/driving/cli_runner/run_replay.rb +118 -0
- data/lib/hecks/adapters/driving/cli_runner/search_words.rb +35 -0
- data/lib/hecks/adapters/driving/cli_runner/settling.rb +6 -5
- data/lib/hecks/adapters/driving/cli_runner/streaming.rb +11 -10
- data/lib/hecks/adapters/driving/cli_runner/suggestions.rb +1 -1
- data/lib/hecks/adapters/driving/cli_runner/tour_words.rb +77 -0
- data/lib/hecks/adapters/driving/cli_runner/verb_names.rb +36 -4
- data/lib/hecks/adapters/driving/cli_runner/verbosity.rb +75 -0
- data/lib/hecks/adapters/driving/cli_runner.rb +106 -7
- data/lib/hecks/adapters/driving/context_line.rb +85 -0
- data/lib/hecks/adapters/driving/exit_status.rb +31 -0
- data/lib/hecks/adapters/driving/launcher_options.rb +7 -5
- data/lib/hecks/adapters/driving/mcp/progress_sink.rb +45 -0
- data/lib/hecks/adapters/driving/mcp/tool_calls.rb +7 -5
- data/lib/hecks/adapters/driving/mcp.rb +25 -5
- data/lib/hecks/adapters/driving/mcp_scope/argument_policy.rb +40 -7
- data/lib/hecks/adapters/driving/mcp_scope.rb +8 -7
- data/lib/hecks/adapters/driving/ruby/aggregate_module/hooks.rb +154 -0
- data/lib/hecks/adapters/driving/ruby/aggregate_module.rb +64 -93
- data/lib/hecks/adapters/driving/usage_log.rb +146 -0
- data/lib/hecks/adapters/driving/write_guard.rb +55 -0
- data/lib/hecks/adapters/driving.rb +0 -1
- data/lib/hecks/behaviors/dsl.rb +5 -1
- data/lib/hecks/behaviors/expectations/boot.rb +0 -1
- data/lib/hecks/bluebook/acknowledgements.rb +1 -1
- data/lib/hecks/bluebook/aggregate.rb +21 -18
- data/lib/hecks/bluebook/assembly/contracts/sagas.rb +2 -0
- data/lib/hecks/bluebook/assembly/contracts/structure.rb +18 -13
- data/lib/hecks/bluebook/behaviour/aggregate.rb +27 -3
- data/lib/hecks/bluebook/command.rb +16 -5
- data/lib/hecks/bluebook/declaration.rb +32 -4
- data/lib/hecks/bluebook/domain_port.rb +7 -3
- data/lib/hecks/bluebook/dsl/aggregate_builder/relationships.rb +0 -2
- data/lib/hecks/bluebook/dsl/aggregate_builder/renaming.rb +25 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +3 -0
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +0 -1
- data/lib/hecks/bluebook/dsl/audience_word.rb +40 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/metadata.rb +56 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/modules.rb +80 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/correlation_keys.rb +51 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +1 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +17 -34
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +8 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +13 -3
- data/lib/hecks/bluebook/dsl/entity_builder.rb +0 -2
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +6 -4
- data/lib/hecks/bluebook/dsl/kinds.rb +53 -0
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +9 -2
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +25 -15
- data/lib/hecks/bluebook/dsl/translation_builder.rb +16 -1
- data/lib/hecks/bluebook/dsl/word_gate.rb +1 -1
- data/lib/hecks/bluebook/dsl.rb +1 -0
- data/lib/hecks/bluebook/meta_validator/judge/identity.rb +9 -4
- data/lib/hecks/bluebook/meta_validator/plan/category.rb +10 -2
- data/lib/hecks/bluebook/meta_validator/plan/verbs.rb +9 -0
- data/lib/hecks/bluebook/meta_validator/plan.rb +2 -1
- data/lib/hecks/bluebook/meta_validator/reconstruction/heads.rb +3 -1
- data/lib/hecks/bluebook/meta_validator/reconstruction/reading.rb +7 -0
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +7 -2
- data/lib/hecks/bluebook/meta_validator/shapes.rb +3 -0
- data/lib/hecks/bluebook/meta_validator/syntax_boot/disk_cache.rb +1 -1
- data/lib/hecks/bluebook/model_check/aggregate_checks.rb +27 -0
- data/lib/hecks/bluebook/model_check/ask_checks.rb +25 -0
- data/lib/hecks/bluebook/model_check/reaction_chains.rb +114 -0
- data/lib/hecks/bluebook/model_check/reaction_cycles.rb +53 -0
- data/lib/hecks/bluebook/model_check/reaction_depth_checks.rb +58 -0
- data/lib/hecks/bluebook/model_check/reaction_walk.rb +62 -0
- data/lib/hecks/bluebook/model_check.rb +5 -27
- data/lib/hecks/bluebook/process_manager.rb +20 -3
- data/lib/hecks/bluebook/translation.rb +5 -3
- data/lib/hecks/bluebook/translation_plan.rb +9 -2
- data/lib/hecks/ci_pipeline/adapters/ci_cache.adapter +7 -0
- data/lib/hecks/ci_pipeline/adapters/ci_cache.rb +39 -0
- data/lib/hecks/ci_pipeline/adapters/ci_runner.adapter +7 -0
- data/lib/hecks/ci_pipeline/adapters/ci_runner.rb +55 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.behaviors +322 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.bluebook +938 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.hecksagon +12 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.ports.hecksagon +16 -0
- data/lib/hecks/ci_speed/adapters/ci_reader.adapter +7 -0
- data/lib/hecks/ci_speed/adapters/ci_reader.rb +141 -0
- data/lib/hecks/ci_speed/adapters/local_runner/answer.rb +41 -0
- data/lib/hecks/ci_speed/adapters/local_runner/catalog.rb +89 -0
- data/lib/hecks/ci_speed/adapters/local_runner/checkouts.rb +89 -0
- data/lib/hecks/ci_speed/adapters/local_runner/launcher.rb +69 -0
- data/lib/hecks/ci_speed/adapters/local_runner/load_average.rb +38 -0
- data/lib/hecks/ci_speed/adapters/local_runner/refs.rb +39 -0
- data/lib/hecks/ci_speed/adapters/local_runner/refused.rb +11 -0
- data/lib/hecks/ci_speed/adapters/local_runner/verdict.rb +71 -0
- data/lib/hecks/ci_speed/adapters/local_runner.adapter +7 -0
- data/lib/hecks/ci_speed/adapters/local_runner.rb +168 -0
- data/lib/hecks/ci_speed/adapters/replayed_runner.rb +39 -0
- data/lib/hecks/ci_speed/ci_speed.behaviors +341 -0
- data/lib/hecks/ci_speed/ci_speed.bluebook +1073 -0
- data/lib/hecks/ci_speed/ci_speed.hecksagon +11 -0
- data/lib/hecks/ci_speed/ci_speed.ports.hecksagon +21 -0
- data/lib/hecks/ci_workflows/ci_workflows.behaviors +13 -0
- data/lib/hecks/ci_workflows/ci_workflows.bluebook +173 -0
- data/lib/hecks/ci_workflows/ci_workflows.hecksagon +15 -0
- data/lib/hecks/coder/coder.bluebook +385 -0
- data/lib/hecks/coder/coder.hecksagon +12 -0
- data/lib/hecks/command_names/check.rb +39 -0
- data/lib/hecks/command_names/extractor.rb +67 -0
- data/lib/hecks/command_names/index.rb +40 -0
- data/lib/hecks/command_names/resolution.rb +81 -0
- data/lib/hecks/command_names/scan.rb +54 -0
- data/lib/hecks/command_names/sources.rb +73 -0
- data/lib/hecks/command_names.rb +26 -0
- data/lib/hecks/composer/jobs.rb +1 -1
- data/lib/hecks/composer/toolbox.rb +8 -1
- data/lib/hecks/corpus/generated_key.rb +205 -0
- data/lib/hecks/corpus/listing.rb +34 -0
- data/lib/hecks/corpus/rust.rb +27 -11
- data/lib/hecks/corpus/sources.rb +2 -1
- data/lib/hecks/corpus.rb +37 -42
- data/lib/hecks/deprecation.rb +23 -0
- data/lib/hecks/doc/reference/readme.rb +1 -1
- data/lib/hecks/doc/reference/rendering.rb +2 -2
- data/lib/hecks/doc/reference.rb +1 -1
- data/lib/hecks/embryonaut_bluebook/manifest.rb +1 -1
- data/lib/hecks/fixer/fixer.bluebook +240 -0
- data/lib/hecks/fixer/fixer.hecksagon +17 -0
- data/lib/hecks/framework_bluebooks.rb +32 -7
- data/lib/hecks/fuzzing/concurrent_dispatch/world_copy.rb +1 -0
- data/lib/hecks/fuzzing/isolated_boot/postgres_scratch.rb +11 -12
- data/lib/hecks/fuzzing/isolated_boot/worlds.rb +23 -5
- data/lib/hecks/fuzzing/isolated_boot.rb +1 -1
- data/lib/hecks/fuzzing/mutation/checks.rb +3 -3
- data/lib/hecks/grammar/translation.bluebook +1 -1
- data/lib/hecks/grammar/translation_rules.json +64 -0
- data/lib/hecks/hecks/adapter_words.json +7 -0
- data/lib/hecks/hecks/adapters/area_overlap.rb +156 -0
- data/lib/hecks/hecks/adapters/claude_agents.rb +8 -3
- data/lib/hecks/hecks/adapters/codebase/batch_runs.rb +60 -0
- data/lib/hecks/hecks/adapters/codebase/changed_specs.rb +52 -0
- data/lib/hecks/hecks/adapters/codebase/codemods.rb +3 -2
- data/lib/hecks/hecks/adapters/codebase/conformance.rb +14 -1
- data/lib/hecks/hecks/adapters/codebase/corpus_queries.rb +53 -0
- data/lib/hecks/hecks/adapters/codebase/generated_keys.rb +31 -0
- data/lib/hecks/hecks/adapters/codebase/impacted_specs.rb +110 -0
- data/lib/hecks/hecks/adapters/codebase/language.rb +2 -2
- data/lib/hecks/hecks/adapters/codebase/launcher_text.rb +39 -0
- data/lib/hecks/hecks/adapters/codebase/minitest_runs.rb +52 -0
- data/lib/hecks/hecks/adapters/codebase/regeneration.rb +51 -8
- data/lib/hecks/hecks/adapters/codebase/run_options.rb +35 -0
- data/lib/hecks/hecks/adapters/codebase/scripting.rb +39 -0
- data/lib/hecks/hecks/adapters/codebase/search.rb +1 -1
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +79 -51
- data/lib/hecks/hecks/adapters/codebase/spec_files/report.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/spec_files/shared_run.rb +73 -0
- data/lib/hecks/hecks/adapters/codebase/spec_files.rb +95 -0
- data/lib/hecks/hecks/adapters/codebase/test_runner.rb +53 -4
- data/lib/hecks/hecks/adapters/codebase/test_scope.rb +105 -0
- data/lib/hecks/hecks/adapters/codebase/test_suite.rb +48 -34
- data/lib/hecks/hecks/adapters/console_capture.rb +1 -1
- data/lib/hecks/hecks/adapters/cost_explorer.rb +9 -1
- data/lib/hecks/hecks/adapters/dispatching/brief_text.rb +51 -0
- data/lib/hecks/hecks/adapters/dispatching/launcher.rb +97 -0
- data/lib/hecks/hecks/adapters/dispatching/plan.rb +82 -0
- data/lib/hecks/hecks/adapters/dispatching/rows.rb +66 -0
- data/lib/hecks/hecks/adapters/dispatching/settings.rb +81 -0
- data/lib/hecks/hecks/adapters/dispatching/settler.rb +40 -0
- data/lib/hecks/hecks/adapters/dispatching.adapter +7 -0
- data/lib/hecks/hecks/adapters/dispatching.rb +93 -0
- data/lib/hecks/hecks/adapters/doctor_reading/report.rb +27 -0
- data/lib/hecks/hecks/adapters/doctor_reading.adapter +7 -0
- data/lib/hecks/hecks/adapters/doctor_reading.rb +161 -0
- data/lib/hecks/hecks/adapters/git_checkout.rb +1 -1
- data/lib/hecks/hecks/adapters/git_commit.adapter +7 -0
- data/lib/hecks/hecks/adapters/git_commit.rb +61 -0
- data/lib/hecks/hecks/adapters/git_landing/finisher.rb +82 -0
- data/lib/hecks/hecks/adapters/git_landing/foreign_hold.rb +111 -0
- data/lib/hecks/hecks/adapters/git_landing/line.rb +171 -0
- data/lib/hecks/hecks/adapters/git_landing/lineup.rb +98 -0
- data/lib/hecks/hecks/adapters/git_landing/merger.rb +1 -1
- data/lib/hecks/hecks/adapters/git_landing/numbering.rb +54 -0
- data/lib/hecks/hecks/adapters/git_landing/rivals.rb +59 -0
- data/lib/hecks/hecks/adapters/git_landing/ticket.rb +156 -0
- data/lib/hecks/hecks/adapters/git_landing/tidy.rb +147 -0
- data/lib/hecks/hecks/adapters/git_landing/train.rb +104 -0
- data/lib/hecks/hecks/adapters/git_landing/verdict.rb +64 -0
- data/lib/hecks/hecks/adapters/git_landing/waiting.rb +120 -0
- data/lib/hecks/hecks/adapters/git_landing.rb +106 -20
- data/lib/hecks/hecks/adapters/git_main_pull.rb +99 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/bench.rb +82 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/due.rb +84 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/impacted/skips.rb +47 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/impacted/spec_run.rb +75 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/impacted.rb +181 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/line.rb +76 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/reading.rb +24 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/record.rb +146 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/spec_map/corpus.rb +25 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/spec_map/needles.rb +61 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/spec_map.rb +105 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/stages.rb +118 -0
- data/lib/hecks/hecks/adapters/git_rehearsal.adapter +7 -0
- data/lib/hecks/hecks/adapters/git_rehearsal.rb +141 -0
- data/lib/hecks/hecks/adapters/git_train/bench.rb +15 -15
- data/lib/hecks/hecks/adapters/git_train/branch_guard.rb +62 -0
- data/lib/hecks/hecks/adapters/git_train/carriage.rb +27 -28
- data/lib/hecks/hecks/adapters/git_train/launcher_shape.rb +75 -0
- data/lib/hecks/hecks/adapters/git_train/mint_step.rb +47 -0
- data/lib/hecks/hecks/adapters/git_train/settlement.rb +167 -0
- data/lib/hecks/hecks/adapters/git_train.rb +73 -15
- data/lib/hecks/hecks/adapters/git_worktree_add.adapter +7 -0
- data/lib/hecks/hecks/adapters/git_worktree_add.rb +68 -0
- data/lib/hecks/hecks/adapters/github_pull_requests.adapter +7 -0
- data/lib/hecks/hecks/adapters/github_pull_requests.rb +109 -0
- data/lib/hecks/hecks/adapters/host_http.rb +6 -6
- data/lib/hecks/hecks/adapters/in_process_boot.rb +10 -8
- data/lib/hecks/hecks/adapters/in_process_operations.rb +11 -17
- data/lib/hecks/hecks/adapters/in_process_undo.rb +17 -0
- data/lib/hecks/hecks/adapters/journal_store/changes.rb +13 -4
- data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +28 -15
- data/lib/hecks/hecks/adapters/journal_store/examination.rb +17 -1
- data/lib/hecks/hecks/adapters/journal_store/held_domain/renaming.rb +45 -0
- data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +31 -5
- data/lib/hecks/hecks/adapters/journal_store/held_mint.rb +128 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/attestation.rb +1 -1
- data/lib/hecks/hecks/adapters/journal_store/readings/boot_status.rb +58 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/composition.rb +39 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/outcomes.rb +76 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/postgres_reader.rb +44 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/reader.rb +64 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/report.rb +102 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/sqlite_reader.rb +43 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/stores.rb +80 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/subscribers.rb +72 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/summary.rb +39 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace.rb +39 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/command_line.rb +57 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/edge_guards.rb +107 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/inspection.rb +94 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/plan.rb +66 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/report.rb +72 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/store.rb +34 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/watermark_guards.rb +86 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/world.rb +66 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan.rb +36 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/projection_audit.rb +64 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/scaffolding.rb +3 -3
- data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status/database_reading.rb +113 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status/read_only.rb +33 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status.rb +32 -0
- data/lib/hecks/hecks/adapters/journal_store/readings.rb +13 -1
- data/lib/hecks/hecks/adapters/journal_store/reconcile_report.rb +60 -0
- data/lib/hecks/hecks/adapters/journal_store/reconciliation.rb +121 -0
- data/lib/hecks/hecks/adapters/journal_store/translation_write/shape_edge.rb +59 -0
- data/lib/hecks/hecks/adapters/journal_store/translation_write.rb +123 -0
- data/lib/hecks/hecks/adapters/journal_store.rb +16 -0
- data/lib/hecks/hecks/adapters/landed_work.adapter +7 -0
- data/lib/hecks/hecks/adapters/landed_work.rb +52 -0
- data/lib/hecks/hecks/adapters/local_files.rb +6 -6
- data/lib/hecks/hecks/adapters/process_pool.rb +3 -2
- data/lib/hecks/hecks/adapters/push_size.rb +57 -0
- data/lib/hecks/hecks/adapters/qa_quiescing.adapter +7 -0
- data/lib/hecks/hecks/adapters/qa_quiescing.rb +57 -0
- data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +30 -3
- data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +63 -3
- data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +29 -6
- data/lib/hecks/hecks/adapters/rehearsal/subject.rb +11 -5
- data/lib/hecks/hecks/adapters/rust_toolchain.rb +10 -1
- data/lib/hecks/hecks/adapters/rust_workspace.rb +1 -1
- data/lib/hecks/hecks/adapters/settings_reading/disposable_ledger.rb +32 -0
- data/lib/hecks/hecks/adapters/settings_reading/push_nudge.rb +26 -0
- data/lib/hecks/hecks/adapters/settings_reading/stores.rb +76 -0
- data/lib/hecks/hecks/adapters/settings_reading/test_scope.rb +28 -0
- data/lib/hecks/hecks/adapters/settings_reading.rb +28 -2
- data/lib/hecks/hecks/adapters/started_work.rb +42 -0
- data/lib/hecks/hecks/adapters/terminal.rb +12 -10
- data/lib/hecks/hecks/adapters/where_reading.adapter +7 -0
- data/lib/hecks/hecks/adapters/where_reading.rb +64 -0
- data/lib/hecks/hecks/adapters/work_areas.rb +57 -0
- data/lib/hecks/hecks/adapters/work_limits.rb +57 -0
- data/lib/hecks/hecks/build/build.bluebook +576 -0
- data/lib/hecks/hecks/check/check.bluebook +966 -0
- data/lib/hecks/hecks/codebase.behaviors +61 -5
- data/lib/hecks/hecks/composer.behaviors +1 -1
- data/lib/hecks/hecks/context_map.hecksagon +1 -1
- data/lib/hecks/hecks/custodian.behaviors +33 -7
- data/lib/hecks/hecks/delegate/delegate.bluebook +355 -0
- data/lib/hecks/hecks/deliver/deliver.bluebook +945 -0
- data/lib/hecks/hecks/deploy.behaviors +1 -1
- data/lib/hecks/hecks/evolve/evolve.bluebook +788 -0
- data/lib/hecks/hecks/find/find.bluebook +81 -0
- data/lib/hecks/hecks/hecks.behaviors +1 -1
- data/lib/hecks/hecks/hecks.bluebook +0 -133
- data/lib/hecks/hecks/hecks.contextmap +2 -0
- data/lib/hecks/hecks/hecks.hecksagon +185 -29
- data/lib/hecks/hecks/hecks.world +35 -9
- data/lib/hecks/hecks/implicit_moves.json +24 -0
- data/lib/hecks/hecks/migrate/migrate.bluebook +1066 -0
- data/lib/hecks/hecks/operate/operate.bluebook +695 -0
- data/lib/hecks/hecks/quiesce/quiesce.bluebook +117 -0
- data/lib/hecks/hecks/rehearse/rehearse.bluebook +133 -0
- data/lib/hecks/hecks/release/release.bluebook +916 -0
- data/lib/hecks/hecks/serve/serve.bluebook +134 -0
- data/lib/hecks/hecks/shapes.json +1 -15
- data/lib/hecks/hecks/site.behaviors +1 -1
- data/lib/hecks/hecks/start/start.bluebook +194 -0
- data/lib/hecks/hecks/test/test.bluebook +638 -0
- data/lib/hecks/hecks/tickets.world +14 -0
- data/lib/hecks/language/bluebook/aggregate.bluebook +22 -0
- data/lib/hecks/language/bluebook/bluebook.bluebook +34 -0
- data/lib/hecks/language/bluebook/command.bluebook +35 -0
- data/lib/hecks/language/bluebook/process_manager.bluebook +14 -1
- data/lib/hecks/language/bluebook/vocabulary.bluebook +174 -54
- data/lib/hecks/language/hecksagon/domain_port.bluebook +1 -0
- data/lib/hecks/language/hecksagon/port_operation.bluebook +14 -0
- data/lib/hecks/language/kinds/run.kind +120 -0
- data/lib/hecks/language/oidc.json +10 -0
- data/lib/hecks/language/translation/translation_aggregate.bluebook +24 -0
- data/lib/hecks/module_folders.rb +31 -0
- data/lib/hecks/ports/key_vault.rb +1 -1
- data/lib/hecks/ports/persistence/append_only.rb +26 -8
- data/lib/hecks/ports/persistence/binding_policy.rb +3 -1
- data/lib/hecks/ports/persistence/codec_boundary.rb +1 -1
- data/lib/hecks/ports/persistence/mint_door.rb +74 -0
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +6 -5
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +5 -1
- data/lib/hecks/ports/persistence/plugins/era/era_status.rb +48 -0
- data/lib/hecks/ports/persistence/plugins/era/projected_bluebook.rb +127 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/additive_shape.rb +107 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/compose.rb +155 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/compose_render.rb +79 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/edge_files.rb +49 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/edge_route.rb +61 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/implicit_edge.rb +67 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/reconcile.rb +130 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/reconcile_files.rb +35 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +13 -5
- data/lib/hecks/ports/persistence/plugins/era/translation.rb +5 -0
- data/lib/hecks/ports/persistence/plugins/era.rb +1 -0
- data/lib/hecks/ports/persistence/repository_factory.rb +11 -3
- data/lib/hecks/ports/persistence/stored_name_guard.rb +36 -0
- data/lib/hecks/ports/persistence.rb +2 -0
- data/lib/hecks/projections/ci_pipeline/table/checks.rb +137 -0
- data/lib/hecks/projections/ci_pipeline/table/lookup.rb +59 -0
- data/lib/hecks/projections/ci_pipeline/table/refusals.rb +58 -0
- data/lib/hecks/projections/ci_pipeline/table/rows.rb +119 -0
- data/lib/hecks/projections/ci_pipeline/table/tree.rb +30 -0
- data/lib/hecks/projections/ci_pipeline/table/typing.rb +92 -0
- data/lib/hecks/projections/ci_pipeline/table.rb +112 -0
- data/lib/hecks/projections/ci_pipeline/workflows.rb +162 -0
- data/lib/hecks/projections/ci_pipeline/yaml_text.rb +104 -0
- data/lib/hecks/projections/deploy/box/hosting.rb +1 -1
- data/lib/hecks/projections/deploy/box/roll_recipe.rb +1 -1
- data/lib/hecks/projections/deploy/box/roll_scripts.rb +1 -1
- data/lib/hecks/projections/deploy/box.rb +1 -1
- data/lib/hecks/projections/deploy/templates/fargate/Makefile.tmpl +1 -1
- data/lib/hecks/projections/deploy/templates/lambda/Makefile.tmpl +3 -3
- data/lib/hecks/projections/undo.rb +46 -0
- data/lib/hecks/projections.rb +2 -0
- data/lib/hecks/projector/cli_projector/claims.rb +11 -0
- data/lib/hecks/projector/cli_projector/command_help.rb +6 -1
- data/lib/hecks/projector/cli_projector/command_specs.rb +11 -1
- data/lib/hecks/projector/cli_projector/completion.rb +87 -0
- data/lib/hecks/projector/cli_projector/everyday.rb +40 -0
- data/lib/hecks/projector/cli_projector/json_listing.rb +77 -0
- data/lib/hecks/projector/cli_projector/listing.rb +1 -1
- data/lib/hecks/projector/cli_projector/modules.rb +39 -0
- data/lib/hecks/projector/cli_projector/query_specs.rb +1 -0
- data/lib/hecks/projector/cli_projector/renames.rb +58 -0
- data/lib/hecks/projector/cli_projector/search.rb +74 -0
- data/lib/hecks/projector/cli_projector/usage.rb +23 -6
- data/lib/hecks/projector/cli_projector.rb +24 -1
- data/lib/hecks/quality_control/adapters/ci_head.adapter +8 -0
- data/lib/hecks/quality_control/adapters/image_roll.adapter +9 -0
- data/lib/hecks/quality_control/adapters/image_roll.rb +158 -0
- data/lib/hecks/quality_control/adapters/main_maintenance.adapter +8 -0
- data/lib/hecks/quality_control/adapters/main_maintenance.rb +275 -0
- data/lib/hecks/quality_control/adapters/pump_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/pump_tools.rb +18 -0
- data/lib/hecks/quality_control/adapters/push_due_reader.adapter +8 -0
- data/lib/hecks/quality_control/adapters/push_due_reader.rb +99 -0
- data/lib/hecks/quality_control/adapters/qa_auto_mint.rb +183 -0
- data/lib/hecks/quality_control/adapters/qa_era_mint.rb +94 -0
- data/lib/hecks/quality_control/adapters/qa_quiesce_marker.rb +126 -0
- data/lib/hecks/quality_control/adapters/run_keys.rb +36 -0
- data/lib/hecks/quality_control/adapters/run_reader.adapter +7 -0
- data/lib/hecks/quality_control/adapters/run_reader.rb +188 -0
- data/lib/hecks/quality_control/cli/child.rb +1 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains/scanning.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +3 -3
- data/lib/hecks/quality_control/cli/qa_event_pump/attached.rb +67 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/consumer.rb +103 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/cursors.rb +60 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/reactions.rb +46 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/reader.rb +30 -0
- data/lib/hecks/quality_control/cli/qa_event_pump.rb +76 -0
- data/lib/hecks/quality_control/cli/qa_fix_main_bug/publishing.rb +79 -0
- data/lib/hecks/quality_control/cli/qa_fix_main_bug.rb +167 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/evaluation.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_generated_domains/promotion.rb +3 -3
- data/lib/hecks/quality_control/cli/qa_main_gate/gate_run.rb +52 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/logging.rb +70 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/shell.rb +47 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/sweeping.rb +59 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/worktree.rb +62 -0
- data/lib/hecks/quality_control/cli/qa_main_gate.rb +135 -0
- data/lib/hecks/quality_control/cli/qa_postgres_role.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_pr_check/checking.rb +2 -3
- data/lib/hecks/quality_control/cli/qa_push_nudge.rb +48 -0
- data/lib/hecks/quality_control/cli/qa_seed_angles/seed.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_sweep/seat.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_tick/event_pump_step.rb +34 -0
- data/lib/hecks/quality_control/cli/qa_tick/output.rb +16 -1
- data/lib/hecks/quality_control/cli/qa_tick/push_nudge_step.rb +28 -0
- data/lib/hecks/quality_control/cli/qa_tick/quiesce_guard.rb +51 -0
- data/lib/hecks/quality_control/cli/qa_tick.rb +36 -8
- data/lib/hecks/quality_control/quality_control.behaviors +65 -0
- data/lib/hecks/quality_control/quality_control.bluebook +1131 -11
- data/lib/hecks/quality_control/quality_control.hecksagon +11 -0
- data/lib/hecks/quality_control/quality_control.ports.hecksagon +138 -0
- data/lib/hecks/query_ir/touchpoints.rb +5 -7
- data/lib/hecks/refused.rb +21 -0
- data/lib/hecks/release/approval.rb +6 -3
- data/lib/hecks/release/conditions.rb +46 -0
- data/lib/hecks/release/runner/gem_publisher.rb +4 -4
- data/lib/hecks/release/version_commit.rb +48 -0
- data/lib/hecks/runtime/command_interpreter/hydration.rb +5 -4
- data/lib/hecks/runtime/command_interpreter/persisting.rb +11 -3
- data/lib/hecks/runtime/command_interpreter.rb +2 -2
- data/lib/hecks/runtime/command_rules/admissibility.rb +0 -2
- data/lib/hecks/runtime/command_rules/emission.rb +0 -1
- data/lib/hecks/runtime/dependency_planning/expression_reads.rb +0 -1
- data/lib/hecks/runtime/dispatcher/planning.rb +24 -0
- data/lib/hecks/runtime/dispatcher/routing.rb +6 -0
- data/lib/hecks/runtime/dispatcher/value_routing.rb +54 -0
- data/lib/hecks/runtime/dispatcher.rb +7 -1
- data/lib/hecks/runtime/dry_run_plan.rb +60 -0
- data/lib/hecks/runtime/entity_element/location.rb +0 -1
- data/lib/hecks/runtime/entity_element/mutations.rb +0 -1
- data/lib/hecks/runtime/entity_interpreter/locating.rb +5 -0
- data/lib/hecks/runtime/entity_interpreter.rb +0 -1
- data/lib/hecks/runtime/errors.rb +26 -0
- data/lib/hecks/runtime/instance.rb +0 -1
- data/lib/hecks/runtime/invocation_builder.rb +0 -1
- data/lib/hecks/runtime/outbox/consumer_runner.rb +9 -1
- data/lib/hecks/runtime/outbox/relay.rb +25 -4
- data/lib/hecks/runtime/outbox/runnable.rb +3 -1
- data/lib/hecks/runtime/outbox.rb +6 -2
- data/lib/hecks/runtime/policy_interpreter/fan_out.rb +18 -2
- data/lib/hecks/runtime/policy_interpreter.rb +17 -9
- data/lib/hecks/runtime/port_operation_interpreter.rb +21 -7
- data/lib/hecks/runtime/query_interpreter/arguments.rb +6 -5
- data/lib/hecks/runtime/reaction_invocation.rb +0 -1
- data/lib/hecks/runtime/refusal_wording.rb +12 -1
- data/lib/hecks/runtime/registry/context_maps.rb +1 -5
- data/lib/hecks/runtime/registry/declarations.rb +34 -4
- data/lib/hecks/runtime/registry/hecksagon_rules.rb +15 -1
- data/lib/hecks/runtime/registry/runtime_state.rb +10 -0
- data/lib/hecks/runtime/registry/world_defaults.rb +24 -2
- data/lib/hecks/runtime/registry/world_names.rb +99 -0
- data/lib/hecks/runtime/registry.rb +33 -27
- data/lib/hecks/runtime/saga_interpreter/compensation.rb +10 -0
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +29 -3
- data/lib/hecks/runtime/saga_interpreter/delivery.rb +0 -1
- data/lib/hecks/runtime/saga_interpreter/lifecycle.rb +1 -1
- data/lib/hecks/runtime/saga_interpreter.rb +46 -2
- data/lib/hecks/runtime/value/coercion.rb +36 -8
- data/lib/hecks/rust_build/conformance.rb +16 -5
- data/lib/hecks/rust_build/parser.rb +25 -0
- data/lib/hecks/rust_build/project_rust/codegen_run.rb +45 -12
- data/lib/hecks/rust_build/project_rust/declared.rb +80 -0
- data/lib/hecks/rust_build/project_rust/features_header.rb +22 -0
- data/lib/hecks/rust_build/project_rust/manifest.rb +96 -0
- data/lib/hecks/rust_build/project_rust/meta.rb +36 -0
- data/lib/hecks/rust_build/project_rust.rb +28 -90
- data/lib/hecks/rust_build/write_if_changed.rb +19 -4
- data/lib/hecks/rust_build.rb +2 -1
- data/lib/hecks/rust_format.rb +32 -2
- data/lib/hecks/secrets.rb +111 -0
- data/lib/hecks/shape_ledger/edge_hygiene.rb +170 -0
- data/lib/hecks/shape_ledger/scope.rb +51 -0
- data/lib/hecks/shape_ledger/status.rb +89 -0
- data/lib/hecks/shape_ledger.rb +78 -33
- data/lib/hecks/site/bluebook/site.bluebook +1 -0
- data/lib/hecks/storehouse/audit.rb +34 -4
- data/lib/hecks/storehouse/callers.rb +8 -0
- data/lib/hecks/storehouse/dispatching.rb +14 -3
- data/lib/hecks/storehouse/identity.rb +41 -0
- data/lib/hecks/storehouse/querying.rb +7 -7
- data/lib/hecks/storehouse.rb +28 -10
- data/lib/hecks/tickets/bluebook/adapters/work_areas.adapter +7 -0
- data/lib/hecks/tickets/bluebook/adapters/work_limits.adapter +7 -0
- data/lib/hecks/tickets/bluebook/tickets.behaviors +70 -0
- data/lib/hecks/tickets/bluebook/tickets.bluebook +323 -28
- data/lib/hecks/tickets/bluebook/tickets.hecksagon +7 -0
- data/lib/hecks/tickets/bluebook/tickets.ports.hecksagon +17 -0
- data/lib/hecks/{cli → tools}/behaviors.rb +1 -1
- data/lib/hecks/{cli → tools}/canonicalise.rb +1 -1
- data/lib/hecks/{cli → tools}/check_engine_agreement.rb +1 -1
- data/lib/hecks/{cli → tools}/check_era.rb +6 -6
- data/lib/hecks/tools/ci_gates.rb +8 -2
- data/lib/hecks/tools/ci_workflows.rb +98 -0
- data/lib/hecks/{cli → tools}/console.rb +1 -1
- data/lib/hecks/{cli → tools}/deploy_template_diff.rb +1 -1
- data/lib/hecks/{cli → tools}/doc_coverage.rb +2 -2
- data/lib/hecks/{cli → tools}/document.rb +1 -1
- data/lib/hecks/{cli → tools}/domain_stub.rb +1 -1
- data/lib/hecks/{cli → tools}/domain_writer.rb +1 -1
- data/lib/hecks/tools/downstream_model_check.rb +122 -0
- data/lib/hecks/tools/evolve_run.rb +2 -2
- data/lib/hecks/{cli → tools}/expected_era.rb +1 -1
- data/lib/hecks/{cli → tools}/expression_projection.rb +1 -1
- data/lib/hecks/{cli → tools}/follow.rb +1 -1
- data/lib/hecks/tools/fuzz_sweep/options.rb +40 -5
- data/lib/hecks/tools/fuzz_sweep/pool.rb +12 -1
- data/lib/hecks/tools/fuzz_sweep/shards.rb +155 -0
- data/lib/hecks/tools/fuzz_sweep.rb +11 -5
- data/lib/hecks/tools/gate.rb +38 -29
- data/lib/hecks/tools/gate_memo/local_files.rb +33 -0
- data/lib/hecks/tools/gate_memo/rehearsal.rb +54 -0
- data/lib/hecks/tools/gate_memo/ruby_files.rb +152 -0
- data/lib/hecks/tools/gate_memo/session.rb +114 -0
- data/lib/hecks/tools/gate_memo/standalone.rb +67 -0
- data/lib/hecks/tools/gate_memo.rb +196 -0
- data/lib/hecks/tools/gate_report.rb +56 -0
- data/lib/hecks/{cli → tools}/history.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_agent.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_aggregate.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_draft.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_record.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_run.rb +2 -2
- data/lib/hecks/{cli → tools}/interview_session/agent_state.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session/catalog.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session/manual_findings.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session/proposals.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session.rb +2 -2
- data/lib/hecks/{cli → tools}/interview_shape/lifecycle.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_shape.rb +1 -1
- data/lib/hecks/{cli → tools}/ir.rb +1 -1
- data/lib/hecks/tools/lanes/files.rb +1 -1
- data/lib/hecks/tools/lanes/watch_workflow.rb +6 -8
- data/lib/hecks/tools/lanes/workflow.rb +1 -1
- data/lib/hecks/tools/lanes.rb +1 -1
- data/lib/hecks/{cli → tools}/mcp.rb +1 -1
- data/lib/hecks/{cli → tools}/model_check/examination.rb +1 -1
- data/lib/hecks/{cli → tools}/model_check/sources.rb +1 -1
- data/lib/hecks/{cli → tools}/model_check.rb +1 -1
- data/lib/hecks/tools/move_disables/reasons.rb +35 -0
- data/lib/hecks/tools/move_disables.rb +211 -0
- data/lib/hecks/tools/move_former_name.rb +105 -0
- data/lib/hecks/{cli → tools}/pattern_cases.rb +1 -1
- data/lib/hecks/{cli → tools}/persistence_notice.rb +1 -1
- data/lib/hecks/{cli → tools}/present.rb +1 -1
- data/lib/hecks/{cli → tools}/project_cli/launcher_source.rb +32 -22
- data/lib/hecks/{cli → tools}/project_cli/templates.rb +22 -15
- data/lib/hecks/{cli → tools}/project_cli.rb +11 -7
- data/lib/hecks/{cli → tools}/project_diagrams.rb +3 -3
- data/lib/hecks/{cli → tools}/project_glossary.rb +2 -2
- data/lib/hecks/{cli → tools}/reference.rb +2 -2
- data/lib/hecks/{cli → tools}/refresh_projections.rb +1 -1
- data/lib/hecks/{cli → tools}/refresh_rspec_runtime_baseline.rb +1 -1
- data/lib/hecks/tools/regeneration_run/pool.rb +148 -0
- data/lib/hecks/tools/regeneration_run/scratch.rb +76 -0
- data/lib/hecks/tools/regeneration_run.rb +125 -103
- data/lib/hecks/{cli → tools}/release.rb +1 -1
- data/lib/hecks/{cli → tools}/release_gem.rb +1 -1
- data/lib/hecks/{cli → tools}/rspec_io_parallel_files.rb +1 -1
- data/lib/hecks/{cli → tools}/rspec_shard_files.rb +1 -1
- data/lib/hecks/{cli → tools}/run.rb +9 -2
- data/lib/hecks/{cli → tools}/run_expectations.rb +1 -1
- data/lib/hecks/{cli → tools}/seed_semantics_corpus.rb +4 -4
- data/lib/hecks/{cli → tools}/serve_query_ir_mcp.rb +1 -1
- data/lib/hecks/{cli → tools}/shape.rb +3 -2
- data/lib/hecks/{cli → tools}/smoke_http/checks.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_http/settings.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_http/transport.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_http.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_test.rb +1 -1
- data/lib/hecks/{cli → tools}/spec_example.rb +1 -1
- data/lib/hecks/tools/stage_progress.rb +54 -0
- data/lib/hecks/{cli → tools}/statements.rb +1 -1
- data/lib/hecks/{cli → tools}/stores.rb +1 -1
- data/lib/hecks/{cli → tools}/stress_concurrency_specs/reporting.rb +1 -1
- data/lib/hecks/{cli → tools}/stress_concurrency_specs/usage.rb +4 -4
- data/lib/hecks/{cli → tools}/stress_concurrency_specs.rb +3 -3
- data/lib/hecks/tools/tenant_provisioning.rb +23 -0
- data/lib/hecks/tools/tools_doc.rb +10 -8
- data/lib/hecks/tools/translation_audit/edges.rb +21 -16
- data/lib/hecks/tools/translation_audit/verdicts.rb +1 -1
- data/lib/hecks/tools/translation_audit.rb +1 -1
- data/lib/hecks/tools/translation_scaffold.rb +1 -1
- data/lib/hecks/tools.rb +4 -1
- data/lib/hecks/version.rb +1 -1
- data/lib/hecks/vocabulary.rb +61 -31
- data/lib/hecks/workflow_pagination/judge.rb +48 -0
- data/lib/hecks/workflow_pagination/statement.rb +50 -0
- data/lib/hecks/workflow_pagination.rb +58 -0
- data/lib/hecks.rb +2 -0
- data/lib/rubocop/cop/hecks/bare_event_and_query_names.rb +58 -0
- data/lib/rubocop/cop/hecks/correlates_by_aggregate.rb +39 -0
- data/lib/rubocop/cop/hecks/creating_command_sets.rb +75 -0
- data/lib/rubocop/cop/hecks/invariant_expression_language.rb +47 -0
- data/lib/rubocop/cop/hecks/lifecycle_needs_attribute.rb +58 -0
- data/lib/rubocop/cop/hecks/no_id_string_attribute.rb +49 -0
- data/lib/rubocop/cop/hecks/one_terminal_mark_per_lifecycle.rb +47 -0
- data/lib/rubocop/cop/hecks/value_object_shorthand.rb +56 -0
- data/prebuilt/13c04bdc5970295b310f0a980d397ba722232c8da99cc1a0cdb383249921e871.marshal +0 -0
- data/prebuilt/e3857b77f47d9ecc1787b2e1f5136364f3cb3444ef4aea5479f3b98167affea2.marshal +0 -0
- data/qa/settings.yml +23 -0
- data/rust/.gitignore +0 -6
- data/rust/Cargo.toml +2 -1
- data/rust/build/Cargo.toml +1 -1
- data/rust/build/src/binding_pass.rs +57 -4
- data/rust/build/src/pipeline.rs +6 -4
- data/rust/build/src/resolve.rs +1 -0
- data/rust/codegen/Cargo.toml +1 -1
- data/rust/codegen/src/domain_generator.rs +3 -0
- data/rust/codegen/src/json_codec.rs +182 -23
- data/rust/codegen/src/one_of_references.rs +1 -0
- data/rust/codegen/src/queries.rs +20 -2
- data/rust/codegen/src/registry.rs +21 -5
- data/rust/expr/Cargo.toml +1 -1
- data/rust/host/Cargo.toml +1 -1
- data/rust/host/HECKS_RELEASE +1 -1
- data/rust/host/core/Cargo.toml +1 -1
- data/rust/host/src/bin/mint_harness.rs +1 -0
- data/rust/host/src/boot.rs +1 -0
- data/rust/host/src/store/mint.rs +40 -6
- data/rust/lsp/Cargo.toml +1 -1
- data/rust/parser/Cargo.toml +1 -1
- data/rust/parser/src/build/correlation_keys.rs +125 -0
- data/rust/parser/src/build/mod.rs +1 -0
- data/rust/parser/src/emit.rs +55 -3
- data/rust/parser/src/ir.rs +33 -1
- data/rust/parser/src/keywords.rs +289 -1
- data/rust/parser/src/main.rs +2 -0
- data/rust/parser/src/parse/aggregate.rs +10 -1
- data/rust/parser/src/parse/audience.rs +65 -0
- data/rust/parser/src/parse/command.rs +14 -0
- data/rust/parser/src/parse/declaration.rs +97 -0
- data/rust/parser/src/parse/domain_port.rs +6 -0
- data/rust/parser/src/parse/mod.rs +1 -0
- data/rust/parser/src/parse/process_manager.rs +17 -10
- data/rust/parser/src/parse/world.rs +12 -8
- data/rust/parser/src/render_ruby.rs +9 -0
- data/rust/parser/src/sentence/format.rs +3 -0
- data/rust/parser/src/sentence/process.rs +6 -2
- data/rust/src/exemplar/json.rs +17 -0
- data/rust/src/kernel/cli.rs +27 -3
- data/rust/src/kernel/dispatch.rs +4 -2
- data/rust/src/kernel/json.rs +62 -0
- data/rust/src/kernel/orchestrate.rs +28 -3
- data/rust/src/kernel/orchestrate_guard_tests.rs +12 -12
- data/rust/web/Cargo.toml +1 -1
- metadata +389 -96
- data/lib/hecks/cli/command_table.rb +0 -72
- data/lib/hecks/cli/launcher_words.rb +0 -168
- data/lib/hecks/cli.rb +0 -133
- data/lib/hecks/hecks/agents.bluebook +0 -246
- data/lib/hecks/hecks/codebase.bluebook +0 -3209
- data/lib/hecks/hecks/custodian.bluebook +0 -1300
- data/lib/hecks/hecks/ledger.bluebook +0 -190
- data/lib/hecks/hecks/rehearsal.bluebook +0 -437
- data/lib/hecks/hecks/tooling.bluebook +0 -1234
- data/lib/hecks/hecks/translations/2-148748.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-15a2e4.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-1b447c.bluebook +0 -5
- data/lib/hecks/hecks/translations/2-240474.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-44446d.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-46ca26.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-473eab.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-75cc28.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-781c07.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-84c18b.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-aa5fff.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-bfdb48.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-cd96d8.bluebook +0 -10
- data/lib/hecks/hecks/translations/2-d43f71.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-eea577.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-f53248.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-fbb677.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-ffdf12.bluebook +0 -6
- data/lib/hecks/quality_control/adapters/clearance_recorder.rb +0 -36
- data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +0 -56
- data/prebuilt/31cf81e12f16236ad26249be590cfea3799c9db67432e6a4ef54b801c355b6ae.marshal +0 -0
- data/prebuilt/68ecb2bd3abb1a221007db4f2b0375834c13aaccac8f2b99778e8517f11aa113.marshal +0 -0
- data/prebuilt/verdicts-0328c2403383837d780ad5ed81d1da351c56436b894cf9015b5d56b8f1f1bf10.json +0 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
module Hecks
|
|
2
|
+
module Projector
|
|
3
|
+
module CliProjector
|
|
4
|
+
# `hecks completion <shell>` (ADR 0163, plan step 7): the words a shell completes, read from
|
|
5
|
+
# the same listing the help prints, and the script that registers them. Nothing here is typed
|
|
6
|
+
# by hand: a renamed command or a new module reaches the completions with the next projection.
|
|
7
|
+
module Completion
|
|
8
|
+
# The shells a completion script is written for. PowerShell is not among them (step 48).
|
|
9
|
+
SHELLS = %w[bash zsh fish].freeze
|
|
10
|
+
|
|
11
|
+
# The words a completion offers: the first word of a line (modules, the everyday names and
|
|
12
|
+
# the launcher's own words), and per aggregate, its calls with the bang on commands.
|
|
13
|
+
#
|
|
14
|
+
# @param bluebook [Bluebook::Declaration] the bluebook whose modules are offered
|
|
15
|
+
# @param cli [Hash] the projection (`:commands`, `:questions`)
|
|
16
|
+
# @param options [Hash] the listing's options, which decide the calls shown (`:everyday`)
|
|
17
|
+
# @return [Hash{Symbol => Object}] `:first` (the words of the first place), `:calls` (the
|
|
18
|
+
# calls per aggregate name) and `:all` (every call, for a shell that filters by prefix)
|
|
19
|
+
def completion_words(bluebook, cli, options)
|
|
20
|
+
calls = shown_calls(cli, options).group_by { |spec| spec[:group] }
|
|
21
|
+
.transform_values { |specs| specs.map { |spec| label(spec) } }
|
|
22
|
+
{ first: first_words(bluebook, options) + calls.keys.map { |name| "#{name}." },
|
|
23
|
+
calls: calls, all: calls.values.flatten }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# The script a shell sources to complete the words, registered for the program's first word.
|
|
27
|
+
#
|
|
28
|
+
# @param shell [String] one of `SHELLS`
|
|
29
|
+
# @param program [String] the launcher's name, such as `hecks`
|
|
30
|
+
# @param words [Hash] what `completion_words` returned
|
|
31
|
+
# @return [String, nil] the script, or nil for a shell this projection does not write
|
|
32
|
+
def completion_script(shell, program, words)
|
|
33
|
+
name = program.split.first
|
|
34
|
+
case shell
|
|
35
|
+
when "bash" then bash_script(name, words)
|
|
36
|
+
when "zsh" then zsh_script(name, words)
|
|
37
|
+
when "fish" then fish_script(name, words)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# The calls the audience is shown, internal ones left out.
|
|
42
|
+
def shown_calls(cli, options)
|
|
43
|
+
[cli[:commands], cli[:questions]].flat_map do |table|
|
|
44
|
+
CliAudience.audience_specs(table, options).values.reject { |spec| spec[:internal] }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# The module names, the everyday names and the launcher's own words.
|
|
49
|
+
def first_words(bluebook, options)
|
|
50
|
+
modules = bluebook.modules.map { |row| Naming.snake(row.name) }.uniq
|
|
51
|
+
modules + Array(options[:everyday]) + %w[search completion help --all --maintainer]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# A bash script: a function completing the current word, registered for the program.
|
|
55
|
+
def bash_script(name, words)
|
|
56
|
+
fn = "_#{name.tr("^A-Za-z0-9_", "_")}_complete"
|
|
57
|
+
lines = ["#{fn}() {", %( local cur="${COMP_WORDS[COMP_CWORD]}"), " COMPREPLY=()", %( case "$cur" in)]
|
|
58
|
+
lines += words[:calls].map { |agg, calls| " #{agg}.*) #{bash_reply(calls, "$cur")} ;;" }
|
|
59
|
+
lines += [" *) #{bash_reply(words[:first], "$cur")} ;;", " esac", "}", "complete -F #{fn} #{name}"]
|
|
60
|
+
"#{lines.join("\n")}\n"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# The bash assignment offering a list of words that start with the current one.
|
|
64
|
+
def bash_reply(list, cur)
|
|
65
|
+
%{COMPREPLY=( $(compgen -W '#{list.join(" ")}' -- "#{cur}") )}
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# A zsh script: a function offering the same words through `compadd`.
|
|
69
|
+
def zsh_script(name, words)
|
|
70
|
+
lines = [
|
|
71
|
+
"_#{name.tr("^A-Za-z0-9_", "_")}() {", " local cur=$words[CURRENT]", " case $cur in"
|
|
72
|
+
]
|
|
73
|
+
lines += words[:calls].map { |agg, calls| " #{agg}.*) compadd -- #{calls.map { |c| "'#{c}'" }.join(" ")} ;;" }
|
|
74
|
+
lines += [" *) compadd -- #{words[:first].map { |w| "'#{w}'" }.join(" ")} ;;", " esac", "}"]
|
|
75
|
+
lines << "compdef _#{name.tr("^A-Za-z0-9_", "_")} #{name}"
|
|
76
|
+
"#{lines.join("\n")}\n"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# A fish script: every word offered for the program, fish filtering them by prefix.
|
|
80
|
+
def fish_script(name, words)
|
|
81
|
+
offered = (words[:first] + words[:all]).join(" ")
|
|
82
|
+
"complete -c #{name} -f -a '#{offered}'\n"
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Hecks
|
|
2
|
+
module Projector
|
|
3
|
+
module CliProjector
|
|
4
|
+
# The lines the help opens with: the commands and queries a person types most, which the
|
|
5
|
+
# launcher setting names as `everyday`, each line the call to type (ADR 0163).
|
|
6
|
+
module Everyday
|
|
7
|
+
# The `everyday` section: a heading, then one row per named command or query the audience
|
|
8
|
+
# is shown, in the setting's order, each spelled in full. A name the audience is not shown,
|
|
9
|
+
# or that names nothing, is left out; nothing is listed for a newcomer, whose help lists
|
|
10
|
+
# only the newcomer commands.
|
|
11
|
+
#
|
|
12
|
+
# @param commands [Hash{String => Hash}] the command specs the audience is shown
|
|
13
|
+
# @param questions [Hash{String => Hash}] the query specs the audience is shown
|
|
14
|
+
# @param options [Hash] the projection's options; `:everyday` names the lines, `:only`
|
|
15
|
+
# marks a newcomer's help
|
|
16
|
+
# @return [Array<String>] the section's lines, or none
|
|
17
|
+
def everyday_lines(commands, questions, options)
|
|
18
|
+
return [] if Array(options[:only]).any?
|
|
19
|
+
|
|
20
|
+
specs = Array(options[:everyday]).filter_map { |name| commands[name] || questions[name] }
|
|
21
|
+
return [] if specs.empty?
|
|
22
|
+
|
|
23
|
+
["everyday:", *everyday_rows(specs), ""]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# How much of what a line does fits beside its call on one terminal line.
|
|
27
|
+
EVERYDAY_TEXT = 72
|
|
28
|
+
|
|
29
|
+
# One row per spec: its full call padded to the widest, then the first sentence of what it
|
|
30
|
+
# does, cut at a word to fit one line.
|
|
31
|
+
def everyday_rows(specs)
|
|
32
|
+
row = row_formatter(specs.to_h { |spec| [spec, label(spec, real: true)] }) do |spec|
|
|
33
|
+
CliAudience.clipped(first_sentence(spec[:summary]), EVERYDAY_TEXT)
|
|
34
|
+
end
|
|
35
|
+
specs.map { |spec| row.call(spec, " ") }
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
require_relative "../../naming"
|
|
3
|
+
|
|
4
|
+
module Hecks
|
|
5
|
+
module Projector
|
|
6
|
+
module CliProjector
|
|
7
|
+
# `hecks --json` and `hecks <module> --json` (ADR 0163, plan step 9): the same entries the
|
|
8
|
+
# help lists, as JSON, so the MCP door, the docs and scripts read one projection. Each entry
|
|
9
|
+
# is one command or query, with the call to type and the module it sits under.
|
|
10
|
+
module JsonListing
|
|
11
|
+
# The JSON document for the listing: one array of entries, in the order the help lists them.
|
|
12
|
+
#
|
|
13
|
+
# @param bluebook [Bluebook::Declaration] the bluebook whose modules name each entry
|
|
14
|
+
# @param commands [Hash{Symbol => Hash}] the projected command specs
|
|
15
|
+
# @param questions [Hash{Symbol => Hash}] the projected query specs
|
|
16
|
+
# @param options [Hash{Symbol => Object}] the listing's options: `:all` includes the
|
|
17
|
+
# internal entries; `:module` limits the entries to one module's name; `:everyday` names
|
|
18
|
+
# the calls the everyday section lists
|
|
19
|
+
# @return [String] the JSON text
|
|
20
|
+
def json_listing(bluebook, commands, questions, options)
|
|
21
|
+
entries = [commands, questions].flat_map { |specs| json_entries(bluebook, specs, options) }
|
|
22
|
+
JSON.generate(entries)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# The entries of one table the audience is shown, internal ones only with `:all`, and
|
|
26
|
+
# limited to a module when one is named.
|
|
27
|
+
def json_entries(bluebook, specs, options)
|
|
28
|
+
shown = CliAudience.audience_specs(specs, options).reject { |_, spec| hidden?(spec, options) }
|
|
29
|
+
entries = shown.map { |key, spec| json_entry(bluebook, spec, key, options) }
|
|
30
|
+
entries.select { |entry| in_requested_module?(entry, options) }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Whether an entry is internal and the listing leaves internal entries out.
|
|
34
|
+
def hidden?(spec, options)
|
|
35
|
+
spec[:internal] && !options[:all]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Whether an entry sits in the module the listing was asked for, or in any when none was.
|
|
39
|
+
def in_requested_module?(entry, options)
|
|
40
|
+
options[:module].nil? || entry["module"] == Naming.snake(options[:module])
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# One entry: its call, its qualified name, its verb, its kind, the module and aggregate it
|
|
44
|
+
# sits under, its description, its audience, and whether it is in the everyday section.
|
|
45
|
+
def json_entry(bluebook, spec, key, options)
|
|
46
|
+
call = label(spec)
|
|
47
|
+
{
|
|
48
|
+
"call" => call,
|
|
49
|
+
"everyday" => Array(options[:everyday]).include?(key),
|
|
50
|
+
"module" => group_name(bluebook, spec),
|
|
51
|
+
**entry_identity(spec),
|
|
52
|
+
**entry_flags(spec)
|
|
53
|
+
}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# What an entry is called: its call, qualified name, verb, kind and aggregate.
|
|
57
|
+
def entry_identity(spec)
|
|
58
|
+
{
|
|
59
|
+
"name" => spec[:command],
|
|
60
|
+
"verb" => spec[:short].to_s,
|
|
61
|
+
"kind" => spec[:kind].to_s,
|
|
62
|
+
"aggregate" => spec[:group]
|
|
63
|
+
}
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# What an entry says about itself: its description, audience and whether it is internal.
|
|
67
|
+
def entry_flags(spec)
|
|
68
|
+
{
|
|
69
|
+
"description" => spec[:summary].to_s,
|
|
70
|
+
"audience" => Array(spec[:audience]).map(&:to_s),
|
|
71
|
+
"internal" => spec[:internal] ? true : false
|
|
72
|
+
}
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -58,7 +58,7 @@ module Hecks
|
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
# A launcher name in the bluebook's verb form: the aggregate as the bluebook spells it, then
|
|
61
|
-
# the rest of the name (`
|
|
61
|
+
# the rest of the name (`send_train.board` as `SendTrain.board`). A name that does not start
|
|
62
62
|
# with its aggregate, such as a short name a bluebook gave a command, is left as it is.
|
|
63
63
|
def verb_form(spec, name)
|
|
64
64
|
group = spec[:group]
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module Hecks
|
|
2
|
+
module Projector
|
|
3
|
+
module CliProjector
|
|
4
|
+
# The help of one module of a bluebook (ADR 0163): the commands and queries of the
|
|
5
|
+
# aggregates the module groups, listed under the module's name and vision.
|
|
6
|
+
module Modules
|
|
7
|
+
# The module a word names, in the bluebook's own spelling: `deliver` for `Deliver`.
|
|
8
|
+
#
|
|
9
|
+
# @param bluebook [Bluebook::Declaration] the bluebook whose modules are searched
|
|
10
|
+
# @param word [String, nil] a word of the command line
|
|
11
|
+
# @return [String, nil] the module's name, or nil when the bluebook has none by that word
|
|
12
|
+
def module_named(bluebook, word)
|
|
13
|
+
module_names(bluebook).find { |name| Naming.snake(name) == word }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Each module's name once, in declaration order.
|
|
17
|
+
def module_names(bluebook)
|
|
18
|
+
bluebook.modules.map(&:name).uniq
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# The specs of the aggregates `name` groups; every spec when no module is asked for.
|
|
22
|
+
def in_module(bluebook, specs, name)
|
|
23
|
+
return specs unless name
|
|
24
|
+
|
|
25
|
+
members = bluebook.modules.select { |row| row.name == name }.map(&:aggregate)
|
|
26
|
+
specs.select { |_, spec| members.include?(spec[:group]) }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# A module's heading: its word and its vision, then the two ways to call what it lists.
|
|
30
|
+
def module_header(bluebook, name, program)
|
|
31
|
+
vision = bluebook.modules.find { |row| row.name == name }.vision
|
|
32
|
+
["#{Naming.snake(name)} — #{vision}", "",
|
|
33
|
+
" #{program} <Aggregate.command>! [name=value …] do something",
|
|
34
|
+
" #{program} <Aggregate.query> [name=value …] read something", ""]
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -49,6 +49,7 @@ module Hecks
|
|
|
49
49
|
# The spec of one query of an aggregate or of one of its entities.
|
|
50
50
|
def query_spec(bluebook, aggregate, entity, query)
|
|
51
51
|
{ command: fqn(bluebook, aggregate, query, entity), kind: :query, group: aggregate.hecks_name,
|
|
52
|
+
formerly: aggregate.former_name,
|
|
52
53
|
internal: entity.nil? && bookkeeping_query?(aggregate, query),
|
|
53
54
|
summary: query.description, arguments: query_arguments(query, aggregate, entity),
|
|
54
55
|
returns: query.returns }
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module Hecks
|
|
2
|
+
module Projector
|
|
3
|
+
module CliProjector
|
|
4
|
+
# The launcher's rename table: the old command names a bluebook's `launcher` setting lists as
|
|
5
|
+
# `renamed`, each mapped to the command it became. An old spelling resolves to the new command
|
|
6
|
+
# and the launcher prints the new spelling once; an entry may also translate old argument names.
|
|
7
|
+
#
|
|
8
|
+
# The table resolves through 8.0; its removal is recorded in docs/compatibility.md.
|
|
9
|
+
module Renames
|
|
10
|
+
# The old spellings a `renamed` table maps to the commands they became, in the snake form
|
|
11
|
+
# the name index uses.
|
|
12
|
+
#
|
|
13
|
+
# @param commands [Hash{String => Hash}] the projected commands, keyed by snake-form name
|
|
14
|
+
# @param renamed [Hash{String => String, Hash}, nil] old name to new name, or to a hash
|
|
15
|
+
# with `to:` and `arguments:` (old argument name to new)
|
|
16
|
+
# @return [Hash{Symbol => Hash{String => String}}] `:command` and `:question`, each mapping an
|
|
17
|
+
# old spelling to the name it became
|
|
18
|
+
# @raise [Bluebook::DSL::Malformed] if an entry names no projected command
|
|
19
|
+
def renamed_aliases(commands, questions, renamed)
|
|
20
|
+
Hash(renamed).each_with_object({ command: {}, question: {} }) do |(old, target), map|
|
|
21
|
+
to = renamed_target(target)
|
|
22
|
+
space = renamed_space(commands, questions, to, old)
|
|
23
|
+
map[space][old.to_s] = to
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# The namespace a renamed name's target belongs to: a command, or a query when no command
|
|
28
|
+
# has that name.
|
|
29
|
+
#
|
|
30
|
+
# @raise [Bluebook::DSL::Malformed] if the target is neither a command nor a query
|
|
31
|
+
def renamed_space(commands, questions, to, old)
|
|
32
|
+
return :command if commands.key?(to)
|
|
33
|
+
return :question if questions.key?(to)
|
|
34
|
+
|
|
35
|
+
raise Bluebook::DSL::Malformed, "renamed #{old.inspect} names no command or query"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# The argument renames of each old spelling, read by the launcher to translate `old=value`.
|
|
39
|
+
#
|
|
40
|
+
# @return [Hash{String => Hash{String => String}}] old spelling to its argument renames
|
|
41
|
+
def renamed_arguments(renamed)
|
|
42
|
+
Hash(renamed).each_with_object({}) do |(old, target), map|
|
|
43
|
+
map[old.to_s] = renamed_entry(target)[:arguments].to_h.transform_keys(&:to_s)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# The new command name an entry names.
|
|
48
|
+
def renamed_target(target) = renamed_entry(target)[:to].to_s
|
|
49
|
+
|
|
50
|
+
# An entry as a hash with symbol keys: a bare string names the command, and a hash gives
|
|
51
|
+
# `to:` and, optionally, `arguments:`.
|
|
52
|
+
def renamed_entry(target)
|
|
53
|
+
target.is_a?(Hash) ? target.transform_keys(&:to_sym) : { to: target }
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
module Hecks
|
|
2
|
+
module Projector
|
|
3
|
+
module CliProjector
|
|
4
|
+
# `hecks search <word>` (ADR 0163, plan step 20): the commands and queries whose call or
|
|
5
|
+
# description holds a word, each as the call to type, grouped by module when the bluebook
|
|
6
|
+
# declares one and by aggregate otherwise. It reads the listing's own specs and labels, so
|
|
7
|
+
# a renamed command is found under its new name without a second index.
|
|
8
|
+
module Search
|
|
9
|
+
# The lines answering a search, or nil when nothing matches.
|
|
10
|
+
#
|
|
11
|
+
# @param bluebook [Bluebook::Declaration] the bluebook whose modules group the hits
|
|
12
|
+
# @param commands [Hash{Symbol => Hash}] the projected command specs
|
|
13
|
+
# @param questions [Hash{Symbol => Hash}] the projected query specs
|
|
14
|
+
# @param options [Hash{Symbol => Object}] the listing's options; `:all` includes the
|
|
15
|
+
# internal commands and queries, as `--all` does
|
|
16
|
+
# @param word [String] the word to find, matched case-insensitively
|
|
17
|
+
# @return [Array<String>, nil] the lines to print, or nil when no command or query matches
|
|
18
|
+
def search_lines(bluebook, commands, questions, options, word)
|
|
19
|
+
hits = [commands, questions].flat_map { |specs| hits_in(specs, options, word.downcase) }
|
|
20
|
+
return if hits.empty?
|
|
21
|
+
|
|
22
|
+
ranked_lines(bluebook, hits)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# The hits in rank order, name matches first, each rank under its module or aggregate.
|
|
26
|
+
def ranked_lines(bluebook, hits)
|
|
27
|
+
width = hits.map { |hit| label(hit[:spec]).length }.max
|
|
28
|
+
hits.sort_by { |hit| [hit[:rank], label(hit[:spec])] }
|
|
29
|
+
.partition { |hit| hit[:rank].zero? }
|
|
30
|
+
.flat_map { |part| grouped_lines(bluebook, part, width) }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# The hits of one rank, under a heading per module or aggregate, in the order they appear.
|
|
34
|
+
def grouped_lines(bluebook, hits, width)
|
|
35
|
+
hits.group_by { |hit| group_name(bluebook, hit[:spec]) }.flat_map do |group, members|
|
|
36
|
+
["#{group}:", *members.map { |hit| hit_line(hit[:spec], width) }]
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# The matching specs of one table with the rank of each: 0 for a match on the call,
|
|
41
|
+
# 1 for a match on the description only. Internal specs stay out unless `:all` is given.
|
|
42
|
+
def hits_in(specs, options, needle)
|
|
43
|
+
CliAudience.audience_specs(specs, options).values.filter_map do |spec|
|
|
44
|
+
next if spec[:internal] && !options[:all]
|
|
45
|
+
|
|
46
|
+
rank = rank_of(spec, needle)
|
|
47
|
+
{ spec: spec, rank: rank } if rank
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Where a spec matches the needle: its call (0), its description (1), or nowhere (nil).
|
|
52
|
+
def rank_of(spec, needle)
|
|
53
|
+
return 0 if label(spec).downcase.include?(needle)
|
|
54
|
+
return 1 if spec[:summary].to_s.downcase.include?(needle)
|
|
55
|
+
|
|
56
|
+
nil
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# The heading a hit sits under: its module's name when a module of the bluebook groups its
|
|
60
|
+
# aggregate, else the aggregate's own name.
|
|
61
|
+
def group_name(bluebook, spec)
|
|
62
|
+
row = bluebook.modules.find { |module_row| module_row.aggregate == spec[:group] }
|
|
63
|
+
row ? Naming.snake(row.name) : spec[:group]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# One hit: the call to type, padded to the widest, then what it does in one sentence.
|
|
67
|
+
def hit_line(spec, width)
|
|
68
|
+
text = spec[:kind] == :command ? spec[:summary].to_s : first_sentence(spec[:summary].to_s)
|
|
69
|
+
" #{label(spec).ljust(width)} #{text}"
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require_relative "../../naming"
|
|
2
|
+
require_relative "../../adapters/driving/exit_status"
|
|
2
3
|
|
|
3
4
|
module Hecks
|
|
4
5
|
module Projector
|
|
@@ -35,10 +36,13 @@ module Hecks
|
|
|
35
36
|
pool[key] || questions[key]
|
|
36
37
|
end
|
|
37
38
|
|
|
38
|
-
# The whole help: the two tables, the bluebooks, then the hints.
|
|
39
|
+
# The whole help: the everyday lines, the two tables, the bluebooks, then the hints.
|
|
39
40
|
def full_usage(bluebook, commands, questions, options, program)
|
|
40
|
-
shown = [commands, questions].map
|
|
41
|
-
|
|
41
|
+
shown = [commands, questions].map do |specs|
|
|
42
|
+
in_module(bluebook, CliAudience.audience_specs(specs, options), options[:module])
|
|
43
|
+
end
|
|
44
|
+
[header_for(bluebook, program, options[:module]),
|
|
45
|
+
everyday_lines(*shown, options),
|
|
42
46
|
tables(*shown, all: options[:all], notes: aggregate_notes(bluebook)),
|
|
43
47
|
CliAudience.bluebook_lines(program, options[:declarations]),
|
|
44
48
|
usage_footer(program, shown, options, left_out(commands, questions, shown))].flatten(1).join("\n")
|
|
@@ -49,9 +53,14 @@ module Hecks
|
|
|
49
53
|
commands.size + questions.size - shown.sum(&:size)
|
|
50
54
|
end
|
|
51
55
|
|
|
52
|
-
# The bluebook's
|
|
56
|
+
# The heading of the help: the bluebook's, or the module's when one is asked for.
|
|
57
|
+
def header_for(bluebook, program, module_name)
|
|
58
|
+
module_name ? module_header(bluebook, module_name, program) : usage_header(bluebook, program)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# The bluebook's vision, the release of the gem this launcher runs, and the two ways to call it.
|
|
53
62
|
def usage_header(bluebook, program)
|
|
54
|
-
["#{bluebook.name} — #{bluebook.vision}", "",
|
|
63
|
+
["#{bluebook.name} — #{bluebook.vision}", " hecks #{Hecks::VERSION}", "",
|
|
55
64
|
" #{program} <command>! [name=value …] do something",
|
|
56
65
|
" #{program} query <query> [name=value …] read something", ""]
|
|
57
66
|
end
|
|
@@ -66,7 +75,15 @@ module Hecks
|
|
|
66
75
|
|
|
67
76
|
out.concat(all_hint(program, *shown)) unless options[:all]
|
|
68
77
|
out.concat(CliAudience.maintainer_hint(program, hidden_count))
|
|
69
|
-
out
|
|
78
|
+
out.concat(closing_lines(shown, options))
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# The example call and, for a launcher that opted in, the line naming the three exit
|
|
82
|
+
# statuses. A launcher that did not opt in keeps the text every earlier generator wrote,
|
|
83
|
+
# which exits 1 for every line it could not read, so it claims nothing.
|
|
84
|
+
def closing_lines(shown, options)
|
|
85
|
+
lines = [" a command is called with its aggregate — #{example_qualified(shown.first)}"]
|
|
86
|
+
options[:opted] ? lines << " #{Adapters::Driving::ExitStatus::HELP_LINE}" : lines
|
|
70
87
|
end
|
|
71
88
|
|
|
72
89
|
# The commands table then the queries table.
|
|
@@ -3,9 +3,15 @@ require_relative "cli_projector/claims"
|
|
|
3
3
|
require_relative "cli_projector/command_specs"
|
|
4
4
|
require_relative "cli_projector/query_specs"
|
|
5
5
|
require_relative "cli_projector/option_specs"
|
|
6
|
+
require_relative "cli_projector/renames"
|
|
6
7
|
require_relative "cli_projector/usage"
|
|
7
8
|
require_relative "cli_projector/listing"
|
|
9
|
+
require_relative "cli_projector/everyday"
|
|
8
10
|
require_relative "cli_projector/command_help"
|
|
11
|
+
require_relative "cli_projector/modules"
|
|
12
|
+
require_relative "cli_projector/search"
|
|
13
|
+
require_relative "cli_projector/completion"
|
|
14
|
+
require_relative "cli_projector/json_listing"
|
|
9
15
|
|
|
10
16
|
module Hecks
|
|
11
17
|
module Projector
|
|
@@ -17,6 +23,17 @@ module Hecks
|
|
|
17
23
|
module CliProjector
|
|
18
24
|
module_function
|
|
19
25
|
|
|
26
|
+
# The alias tables: each command and query under its short name and its old spellings, and
|
|
27
|
+
# the renamed table's old names routed to the namespace of their targets.
|
|
28
|
+
#
|
|
29
|
+
# @return [Hash{Symbol => Object}] `:command` and `:question` alias tables, and `:renamed`
|
|
30
|
+
# (the old spellings and their argument renames)
|
|
31
|
+
def launcher_names(commands, questions, renamed)
|
|
32
|
+
table = renamed_aliases(commands, questions, renamed)
|
|
33
|
+
{ command: aliases(commands).merge(table[:command]), question: aliases(questions).merge(table[:question]),
|
|
34
|
+
renamed: { spellings: Hash(renamed).keys.map(&:to_s), arguments: renamed_arguments(renamed) } }
|
|
35
|
+
end
|
|
36
|
+
|
|
20
37
|
# Projects the command and question tables and the usage text. Commands and queries are
|
|
21
38
|
# separate namespaces (a bluebook may declare both under one name); ask a query with `ask`.
|
|
22
39
|
#
|
|
@@ -41,17 +58,23 @@ module Hecks
|
|
|
41
58
|
display_names([commands, questions], options[:names])
|
|
42
59
|
|
|
43
60
|
{ commands: commands, questions: questions,
|
|
44
|
-
names:
|
|
61
|
+
names: launcher_names(commands, questions, options[:renamed]),
|
|
45
62
|
usage: usage(bluebook, commands, questions, options) }
|
|
46
63
|
end
|
|
47
64
|
|
|
48
65
|
extend Claims
|
|
66
|
+
extend Renames
|
|
49
67
|
extend CommandSpecs
|
|
50
68
|
extend QuerySpecs
|
|
51
69
|
extend OptionSpecs
|
|
52
70
|
extend Usage
|
|
53
71
|
extend Listing
|
|
72
|
+
extend Everyday
|
|
54
73
|
extend CommandHelp
|
|
74
|
+
extend Modules
|
|
75
|
+
extend Search
|
|
76
|
+
extend Completion
|
|
77
|
+
extend JsonListing
|
|
55
78
|
end
|
|
56
79
|
end
|
|
57
80
|
end
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Binds the `CiHead` port to `CiRunner`, which answers `Head`'s `Check` from the verdict GitHub
|
|
2
|
+
# reports for a commit.
|
|
3
|
+
# Required by name, not relative, so a copy of this directory shares the one implementation loaded.
|
|
4
|
+
require "hecks/ci_pipeline/adapters/ci_runner"
|
|
5
|
+
|
|
6
|
+
Hecks.adapter "CiRunner" do
|
|
7
|
+
port "CiHead"
|
|
8
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Binds the `ImageRoll` port to `ImageRoll`, which classifies a green commit of embryonaut_platform
|
|
2
|
+
# and rolls its
|
|
3
|
+
# console image. Required by name, not relative, so a copy of this directory shares the one
|
|
4
|
+
# implementation loaded.
|
|
5
|
+
require "hecks/quality_control/adapters/image_roll"
|
|
6
|
+
|
|
7
|
+
Hecks.adapter "ImageRoll" do
|
|
8
|
+
port "ImageRoll"
|
|
9
|
+
end
|