hecks 6.0.0 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/exe/hecks +19 -12
- data/lib/hecks/adapters/driven/claude_code.rb +2 -2
- data/lib/hecks/adapters/driven/folder.rb +10 -1
- data/lib/hecks/adapters/driven/folder_overlay.rb +15 -0
- data/lib/hecks/adapters/driven/heki.rb +1 -1
- data/lib/hecks/adapters/driven/in_process_key_vault.rb +1 -1
- data/lib/hecks/adapters/driven/memory/outbox_rows.rb +2 -2
- data/lib/hecks/adapters/driven/postgres/name_guard.rb +25 -0
- data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -3
- data/lib/hecks/adapters/driven/postgres/repository.rb +1 -1
- data/lib/hecks/adapters/driven/postgres/shared_connection.rb +1 -1
- data/lib/hecks/adapters/driven/postgres.rb +3 -0
- data/lib/hecks/adapters/driven/postgres_era/boot.rb +28 -16
- data/lib/hecks/adapters/driven/postgres_era/class_methods.rb +27 -7
- data/lib/hecks/adapters/driven/postgres_era/dialect.rb +10 -5
- data/lib/hecks/adapters/driven/postgres_era/field_cache_provisioner.rb +39 -0
- data/lib/hecks/adapters/driven/postgres_era/journal.rb +52 -13
- data/lib/hecks/adapters/driven/postgres_era/lineage/chain_sql.rb +29 -49
- data/lib/hecks/adapters/driven/postgres_era/lineage/direct_sql.rb +73 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/direct_verified.json +10 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/direct_verified.rb +65 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/domain_rename.rb +77 -25
- data/lib/hecks/adapters/driven/postgres_era/lineage/domain_rename_state.rb +108 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/era_integrity.rb +11 -6
- data/lib/hecks/adapters/driven/postgres_era/lineage/era_store.rb +63 -5
- data/lib/hecks/adapters/driven/postgres_era/lineage/layered_sql.rb +64 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/ledger_reset.rb +150 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/mint_provisioning.rb +85 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/mint_transaction.rb +11 -7
- data/lib/hecks/adapters/driven/postgres_era/lineage/provisioning.rb +11 -5
- data/lib/hecks/adapters/driven/postgres_era/lineage/split_sql.rb +76 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage/sql_templates.rb +9 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage.rb +10 -2
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/context.rb +23 -3
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/coverage_check.rb +3 -1
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/disposable_ledger.rb +119 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolution.rb +219 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/era_resolver.rb +68 -71
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/held_era.rb +68 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/ledger_change.rb +63 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/merge_coordinator.rb +1 -1
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/mint_decision.rb +163 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/mint_request.rb +24 -0
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/minter.rb +59 -21
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager/refusals.rb +24 -11
- data/lib/hecks/adapters/driven/postgres_era/lineage_manager.rb +40 -6
- data/lib/hecks/adapters/driven/postgres_era/shared_tables.rb +32 -0
- data/lib/hecks/adapters/driven/postgres_era.adapter +12 -0
- data/lib/hecks/adapters/driven/postgres_era.rb +25 -10
- data/lib/hecks/adapters/driven/prism.rb +0 -1
- data/lib/hecks/adapters/driven/sql_query_builder.rb +1 -0
- data/lib/hecks/adapters/driven/sqlite/dispatch_claims.rb +1 -1
- data/lib/hecks/adapters/driven/sqlite/name_guard.rb +25 -0
- data/lib/hecks/adapters/driven/sqlite/outbox.rb +2 -2
- data/lib/hecks/adapters/driven/sqlite/repository.rb +1 -1
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +20 -0
- data/lib/hecks/adapters/driven/sqlite.rb +9 -1
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +1 -1
- data/lib/hecks/adapters/driven/worktree_overlay.rb +117 -0
- data/lib/hecks/adapters/driving/cli/shorthand.rb +5 -1
- data/lib/hecks/adapters/driving/cli.rb +1 -1
- data/lib/hecks/adapters/driving/cli_runner/answers.rb +77 -22
- data/lib/hecks/adapters/driving/cli_runner/bang_rule.rb +35 -0
- data/lib/hecks/adapters/driving/cli_runner/completion_words.rb +36 -0
- data/lib/hecks/adapters/driving/cli_runner/json_words.rb +55 -0
- data/lib/hecks/adapters/driving/cli_runner/name_index.rb +63 -0
- data/lib/hecks/adapters/driving/cli_runner/read_context.rb +32 -0
- data/lib/hecks/adapters/driving/cli_runner/renamed_names.rb +49 -0
- data/lib/hecks/adapters/driving/cli_runner/resolution.rb +43 -17
- data/lib/hecks/adapters/driving/cli_runner/resume_words.rb +63 -0
- data/lib/hecks/adapters/driving/cli_runner/run_reference.rb +66 -0
- data/lib/hecks/adapters/driving/cli_runner/run_replay.rb +118 -0
- data/lib/hecks/adapters/driving/cli_runner/search_words.rb +35 -0
- data/lib/hecks/adapters/driving/cli_runner/settling.rb +6 -5
- data/lib/hecks/adapters/driving/cli_runner/streaming.rb +11 -10
- data/lib/hecks/adapters/driving/cli_runner/suggestions.rb +1 -1
- data/lib/hecks/adapters/driving/cli_runner/tour_words.rb +77 -0
- data/lib/hecks/adapters/driving/cli_runner/verb_names.rb +36 -4
- data/lib/hecks/adapters/driving/cli_runner/verbosity.rb +75 -0
- data/lib/hecks/adapters/driving/cli_runner.rb +106 -7
- data/lib/hecks/adapters/driving/context_line.rb +85 -0
- data/lib/hecks/adapters/driving/exit_status.rb +31 -0
- data/lib/hecks/adapters/driving/launcher_options.rb +7 -5
- data/lib/hecks/adapters/driving/mcp/progress_sink.rb +45 -0
- data/lib/hecks/adapters/driving/mcp/tool_calls.rb +7 -5
- data/lib/hecks/adapters/driving/mcp.rb +25 -5
- data/lib/hecks/adapters/driving/mcp_scope/argument_policy.rb +40 -7
- data/lib/hecks/adapters/driving/mcp_scope.rb +8 -7
- data/lib/hecks/adapters/driving/ruby/aggregate_module/hooks.rb +154 -0
- data/lib/hecks/adapters/driving/ruby/aggregate_module.rb +64 -93
- data/lib/hecks/adapters/driving/usage_log.rb +146 -0
- data/lib/hecks/adapters/driving/write_guard.rb +55 -0
- data/lib/hecks/adapters/driving.rb +0 -1
- data/lib/hecks/behaviors/dsl.rb +5 -1
- data/lib/hecks/behaviors/expectations/boot.rb +0 -1
- data/lib/hecks/bluebook/acknowledgements.rb +1 -1
- data/lib/hecks/bluebook/aggregate.rb +21 -18
- data/lib/hecks/bluebook/assembly/contracts/sagas.rb +2 -0
- data/lib/hecks/bluebook/assembly/contracts/structure.rb +18 -13
- data/lib/hecks/bluebook/behaviour/aggregate.rb +27 -3
- data/lib/hecks/bluebook/command.rb +16 -5
- data/lib/hecks/bluebook/declaration.rb +32 -4
- data/lib/hecks/bluebook/domain_port.rb +7 -3
- data/lib/hecks/bluebook/dsl/aggregate_builder/relationships.rb +0 -2
- data/lib/hecks/bluebook/dsl/aggregate_builder/renaming.rb +25 -0
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +3 -0
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +0 -1
- data/lib/hecks/bluebook/dsl/audience_word.rb +40 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/metadata.rb +56 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/modules.rb +80 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/correlation_keys.rb +51 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +1 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +17 -34
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +8 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +13 -3
- data/lib/hecks/bluebook/dsl/entity_builder.rb +0 -2
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +6 -4
- data/lib/hecks/bluebook/dsl/kinds.rb +53 -0
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +9 -2
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +25 -15
- data/lib/hecks/bluebook/dsl/translation_builder.rb +16 -1
- data/lib/hecks/bluebook/dsl/word_gate.rb +1 -1
- data/lib/hecks/bluebook/dsl.rb +1 -0
- data/lib/hecks/bluebook/meta_validator/judge/identity.rb +9 -4
- data/lib/hecks/bluebook/meta_validator/plan/category.rb +10 -2
- data/lib/hecks/bluebook/meta_validator/plan/verbs.rb +9 -0
- data/lib/hecks/bluebook/meta_validator/plan.rb +2 -1
- data/lib/hecks/bluebook/meta_validator/reconstruction/heads.rb +3 -1
- data/lib/hecks/bluebook/meta_validator/reconstruction/reading.rb +7 -0
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +7 -2
- data/lib/hecks/bluebook/meta_validator/shapes.rb +3 -0
- data/lib/hecks/bluebook/meta_validator/syntax_boot/disk_cache.rb +1 -1
- data/lib/hecks/bluebook/model_check/aggregate_checks.rb +27 -0
- data/lib/hecks/bluebook/model_check/ask_checks.rb +25 -0
- data/lib/hecks/bluebook/model_check/reaction_chains.rb +114 -0
- data/lib/hecks/bluebook/model_check/reaction_cycles.rb +53 -0
- data/lib/hecks/bluebook/model_check/reaction_depth_checks.rb +58 -0
- data/lib/hecks/bluebook/model_check/reaction_walk.rb +62 -0
- data/lib/hecks/bluebook/model_check.rb +5 -27
- data/lib/hecks/bluebook/process_manager.rb +20 -3
- data/lib/hecks/bluebook/translation.rb +5 -3
- data/lib/hecks/bluebook/translation_plan.rb +9 -2
- data/lib/hecks/ci_pipeline/adapters/ci_cache.adapter +7 -0
- data/lib/hecks/ci_pipeline/adapters/ci_cache.rb +39 -0
- data/lib/hecks/ci_pipeline/adapters/ci_runner.adapter +7 -0
- data/lib/hecks/ci_pipeline/adapters/ci_runner.rb +55 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.behaviors +322 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.bluebook +938 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.hecksagon +12 -0
- data/lib/hecks/ci_pipeline/ci_pipeline.ports.hecksagon +16 -0
- data/lib/hecks/ci_speed/adapters/ci_reader.adapter +7 -0
- data/lib/hecks/ci_speed/adapters/ci_reader.rb +141 -0
- data/lib/hecks/ci_speed/adapters/local_runner/answer.rb +41 -0
- data/lib/hecks/ci_speed/adapters/local_runner/catalog.rb +89 -0
- data/lib/hecks/ci_speed/adapters/local_runner/checkouts.rb +89 -0
- data/lib/hecks/ci_speed/adapters/local_runner/launcher.rb +69 -0
- data/lib/hecks/ci_speed/adapters/local_runner/load_average.rb +38 -0
- data/lib/hecks/ci_speed/adapters/local_runner/refs.rb +39 -0
- data/lib/hecks/ci_speed/adapters/local_runner/refused.rb +11 -0
- data/lib/hecks/ci_speed/adapters/local_runner/verdict.rb +71 -0
- data/lib/hecks/ci_speed/adapters/local_runner.adapter +7 -0
- data/lib/hecks/ci_speed/adapters/local_runner.rb +168 -0
- data/lib/hecks/ci_speed/adapters/replayed_runner.rb +39 -0
- data/lib/hecks/ci_speed/ci_speed.behaviors +341 -0
- data/lib/hecks/ci_speed/ci_speed.bluebook +1073 -0
- data/lib/hecks/ci_speed/ci_speed.hecksagon +11 -0
- data/lib/hecks/ci_speed/ci_speed.ports.hecksagon +21 -0
- data/lib/hecks/ci_workflows/ci_workflows.behaviors +13 -0
- data/lib/hecks/ci_workflows/ci_workflows.bluebook +173 -0
- data/lib/hecks/ci_workflows/ci_workflows.hecksagon +15 -0
- data/lib/hecks/coder/coder.bluebook +385 -0
- data/lib/hecks/coder/coder.hecksagon +12 -0
- data/lib/hecks/command_names/check.rb +39 -0
- data/lib/hecks/command_names/extractor.rb +67 -0
- data/lib/hecks/command_names/index.rb +40 -0
- data/lib/hecks/command_names/resolution.rb +81 -0
- data/lib/hecks/command_names/scan.rb +54 -0
- data/lib/hecks/command_names/sources.rb +73 -0
- data/lib/hecks/command_names.rb +26 -0
- data/lib/hecks/composer/jobs.rb +1 -1
- data/lib/hecks/composer/toolbox.rb +8 -1
- data/lib/hecks/corpus/generated_key.rb +205 -0
- data/lib/hecks/corpus/listing.rb +34 -0
- data/lib/hecks/corpus/rust.rb +27 -11
- data/lib/hecks/corpus/sources.rb +2 -1
- data/lib/hecks/corpus.rb +37 -42
- data/lib/hecks/deprecation.rb +23 -0
- data/lib/hecks/doc/reference/readme.rb +1 -1
- data/lib/hecks/doc/reference/rendering.rb +2 -2
- data/lib/hecks/doc/reference.rb +1 -1
- data/lib/hecks/embryonaut_bluebook/manifest.rb +1 -1
- data/lib/hecks/fixer/fixer.bluebook +240 -0
- data/lib/hecks/fixer/fixer.hecksagon +17 -0
- data/lib/hecks/framework_bluebooks.rb +32 -7
- data/lib/hecks/fuzzing/concurrent_dispatch/world_copy.rb +1 -0
- data/lib/hecks/fuzzing/isolated_boot/postgres_scratch.rb +11 -12
- data/lib/hecks/fuzzing/isolated_boot/worlds.rb +23 -5
- data/lib/hecks/fuzzing/isolated_boot.rb +1 -1
- data/lib/hecks/fuzzing/mutation/checks.rb +3 -3
- data/lib/hecks/grammar/translation.bluebook +1 -1
- data/lib/hecks/grammar/translation_rules.json +64 -0
- data/lib/hecks/hecks/adapter_words.json +7 -0
- data/lib/hecks/hecks/adapters/area_overlap.rb +156 -0
- data/lib/hecks/hecks/adapters/claude_agents.rb +8 -3
- data/lib/hecks/hecks/adapters/codebase/batch_runs.rb +60 -0
- data/lib/hecks/hecks/adapters/codebase/changed_specs.rb +52 -0
- data/lib/hecks/hecks/adapters/codebase/codemods.rb +3 -2
- data/lib/hecks/hecks/adapters/codebase/conformance.rb +14 -1
- data/lib/hecks/hecks/adapters/codebase/corpus_queries.rb +53 -0
- data/lib/hecks/hecks/adapters/codebase/generated_keys.rb +31 -0
- data/lib/hecks/hecks/adapters/codebase/impacted_specs.rb +110 -0
- data/lib/hecks/hecks/adapters/codebase/language.rb +2 -2
- data/lib/hecks/hecks/adapters/codebase/launcher_text.rb +39 -0
- data/lib/hecks/hecks/adapters/codebase/minitest_runs.rb +52 -0
- data/lib/hecks/hecks/adapters/codebase/regeneration.rb +51 -8
- data/lib/hecks/hecks/adapters/codebase/run_options.rb +35 -0
- data/lib/hecks/hecks/adapters/codebase/scripting.rb +39 -0
- data/lib/hecks/hecks/adapters/codebase/search.rb +1 -1
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +79 -51
- data/lib/hecks/hecks/adapters/codebase/spec_files/report.rb +71 -0
- data/lib/hecks/hecks/adapters/codebase/spec_files/shared_run.rb +73 -0
- data/lib/hecks/hecks/adapters/codebase/spec_files.rb +95 -0
- data/lib/hecks/hecks/adapters/codebase/test_runner.rb +53 -4
- data/lib/hecks/hecks/adapters/codebase/test_scope.rb +105 -0
- data/lib/hecks/hecks/adapters/codebase/test_suite.rb +48 -34
- data/lib/hecks/hecks/adapters/console_capture.rb +1 -1
- data/lib/hecks/hecks/adapters/cost_explorer.rb +9 -1
- data/lib/hecks/hecks/adapters/dispatching/brief_text.rb +51 -0
- data/lib/hecks/hecks/adapters/dispatching/launcher.rb +97 -0
- data/lib/hecks/hecks/adapters/dispatching/plan.rb +82 -0
- data/lib/hecks/hecks/adapters/dispatching/rows.rb +66 -0
- data/lib/hecks/hecks/adapters/dispatching/settings.rb +81 -0
- data/lib/hecks/hecks/adapters/dispatching/settler.rb +40 -0
- data/lib/hecks/hecks/adapters/dispatching.adapter +7 -0
- data/lib/hecks/hecks/adapters/dispatching.rb +93 -0
- data/lib/hecks/hecks/adapters/doctor_reading/report.rb +27 -0
- data/lib/hecks/hecks/adapters/doctor_reading.adapter +7 -0
- data/lib/hecks/hecks/adapters/doctor_reading.rb +161 -0
- data/lib/hecks/hecks/adapters/git_checkout.rb +1 -1
- data/lib/hecks/hecks/adapters/git_commit.adapter +7 -0
- data/lib/hecks/hecks/adapters/git_commit.rb +61 -0
- data/lib/hecks/hecks/adapters/git_landing/finisher.rb +82 -0
- data/lib/hecks/hecks/adapters/git_landing/foreign_hold.rb +111 -0
- data/lib/hecks/hecks/adapters/git_landing/line.rb +171 -0
- data/lib/hecks/hecks/adapters/git_landing/lineup.rb +98 -0
- data/lib/hecks/hecks/adapters/git_landing/merger.rb +1 -1
- data/lib/hecks/hecks/adapters/git_landing/numbering.rb +54 -0
- data/lib/hecks/hecks/adapters/git_landing/rivals.rb +59 -0
- data/lib/hecks/hecks/adapters/git_landing/ticket.rb +156 -0
- data/lib/hecks/hecks/adapters/git_landing/tidy.rb +147 -0
- data/lib/hecks/hecks/adapters/git_landing/train.rb +104 -0
- data/lib/hecks/hecks/adapters/git_landing/verdict.rb +64 -0
- data/lib/hecks/hecks/adapters/git_landing/waiting.rb +120 -0
- data/lib/hecks/hecks/adapters/git_landing.rb +106 -20
- data/lib/hecks/hecks/adapters/git_main_pull.rb +99 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/bench.rb +82 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/due.rb +84 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/impacted/skips.rb +47 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/impacted/spec_run.rb +75 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/impacted.rb +181 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/line.rb +76 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/reading.rb +24 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/record.rb +146 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/spec_map/corpus.rb +25 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/spec_map/needles.rb +61 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/spec_map.rb +105 -0
- data/lib/hecks/hecks/adapters/git_rehearsal/stages.rb +118 -0
- data/lib/hecks/hecks/adapters/git_rehearsal.adapter +7 -0
- data/lib/hecks/hecks/adapters/git_rehearsal.rb +141 -0
- data/lib/hecks/hecks/adapters/git_train/bench.rb +15 -15
- data/lib/hecks/hecks/adapters/git_train/branch_guard.rb +62 -0
- data/lib/hecks/hecks/adapters/git_train/carriage.rb +27 -28
- data/lib/hecks/hecks/adapters/git_train/launcher_shape.rb +75 -0
- data/lib/hecks/hecks/adapters/git_train/mint_step.rb +47 -0
- data/lib/hecks/hecks/adapters/git_train/settlement.rb +167 -0
- data/lib/hecks/hecks/adapters/git_train.rb +73 -15
- data/lib/hecks/hecks/adapters/git_worktree_add.adapter +7 -0
- data/lib/hecks/hecks/adapters/git_worktree_add.rb +68 -0
- data/lib/hecks/hecks/adapters/github_pull_requests.adapter +7 -0
- data/lib/hecks/hecks/adapters/github_pull_requests.rb +109 -0
- data/lib/hecks/hecks/adapters/host_http.rb +6 -6
- data/lib/hecks/hecks/adapters/in_process_boot.rb +10 -8
- data/lib/hecks/hecks/adapters/in_process_operations.rb +11 -17
- data/lib/hecks/hecks/adapters/in_process_undo.rb +17 -0
- data/lib/hecks/hecks/adapters/journal_store/changes.rb +13 -4
- data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +28 -15
- data/lib/hecks/hecks/adapters/journal_store/examination.rb +17 -1
- data/lib/hecks/hecks/adapters/journal_store/held_domain/renaming.rb +45 -0
- data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +31 -5
- data/lib/hecks/hecks/adapters/journal_store/held_mint.rb +128 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/attestation.rb +1 -1
- data/lib/hecks/hecks/adapters/journal_store/readings/boot_status.rb +58 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/composition.rb +39 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/outcomes.rb +76 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/postgres_reader.rb +44 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/reader.rb +64 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/report.rb +102 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/sqlite_reader.rb +43 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/stores.rb +80 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/subscribers.rb +72 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace/summary.rb +39 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/event_trace.rb +39 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/command_line.rb +57 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/edge_guards.rb +107 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/inspection.rb +94 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/plan.rb +66 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/report.rb +72 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/store.rb +34 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/watermark_guards.rb +86 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan/world.rb +66 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/mint_plan.rb +36 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/projection_audit.rb +64 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/scaffolding.rb +3 -3
- data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status/database_reading.rb +113 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status/read_only.rb +33 -0
- data/lib/hecks/hecks/adapters/journal_store/readings/sqlite_status.rb +32 -0
- data/lib/hecks/hecks/adapters/journal_store/readings.rb +13 -1
- data/lib/hecks/hecks/adapters/journal_store/reconcile_report.rb +60 -0
- data/lib/hecks/hecks/adapters/journal_store/reconciliation.rb +121 -0
- data/lib/hecks/hecks/adapters/journal_store/translation_write/shape_edge.rb +59 -0
- data/lib/hecks/hecks/adapters/journal_store/translation_write.rb +123 -0
- data/lib/hecks/hecks/adapters/journal_store.rb +16 -0
- data/lib/hecks/hecks/adapters/landed_work.adapter +7 -0
- data/lib/hecks/hecks/adapters/landed_work.rb +52 -0
- data/lib/hecks/hecks/adapters/local_files.rb +6 -6
- data/lib/hecks/hecks/adapters/process_pool.rb +3 -2
- data/lib/hecks/hecks/adapters/push_size.rb +57 -0
- data/lib/hecks/hecks/adapters/qa_quiescing.adapter +7 -0
- data/lib/hecks/hecks/adapters/qa_quiescing.rb +57 -0
- data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +30 -3
- data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +63 -3
- data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +29 -6
- data/lib/hecks/hecks/adapters/rehearsal/subject.rb +11 -5
- data/lib/hecks/hecks/adapters/rust_toolchain.rb +10 -1
- data/lib/hecks/hecks/adapters/rust_workspace.rb +1 -1
- data/lib/hecks/hecks/adapters/settings_reading/disposable_ledger.rb +32 -0
- data/lib/hecks/hecks/adapters/settings_reading/push_nudge.rb +26 -0
- data/lib/hecks/hecks/adapters/settings_reading/stores.rb +76 -0
- data/lib/hecks/hecks/adapters/settings_reading/test_scope.rb +28 -0
- data/lib/hecks/hecks/adapters/settings_reading.rb +28 -2
- data/lib/hecks/hecks/adapters/started_work.rb +42 -0
- data/lib/hecks/hecks/adapters/terminal.rb +12 -10
- data/lib/hecks/hecks/adapters/where_reading.adapter +7 -0
- data/lib/hecks/hecks/adapters/where_reading.rb +64 -0
- data/lib/hecks/hecks/adapters/work_areas.rb +57 -0
- data/lib/hecks/hecks/adapters/work_limits.rb +57 -0
- data/lib/hecks/hecks/build/build.bluebook +576 -0
- data/lib/hecks/hecks/check/check.bluebook +966 -0
- data/lib/hecks/hecks/codebase.behaviors +61 -5
- data/lib/hecks/hecks/composer.behaviors +1 -1
- data/lib/hecks/hecks/context_map.hecksagon +1 -1
- data/lib/hecks/hecks/custodian.behaviors +33 -7
- data/lib/hecks/hecks/delegate/delegate.bluebook +355 -0
- data/lib/hecks/hecks/deliver/deliver.bluebook +945 -0
- data/lib/hecks/hecks/deploy.behaviors +1 -1
- data/lib/hecks/hecks/evolve/evolve.bluebook +788 -0
- data/lib/hecks/hecks/find/find.bluebook +81 -0
- data/lib/hecks/hecks/hecks.behaviors +1 -1
- data/lib/hecks/hecks/hecks.bluebook +0 -133
- data/lib/hecks/hecks/hecks.contextmap +2 -0
- data/lib/hecks/hecks/hecks.hecksagon +185 -29
- data/lib/hecks/hecks/hecks.world +35 -9
- data/lib/hecks/hecks/implicit_moves.json +24 -0
- data/lib/hecks/hecks/migrate/migrate.bluebook +1066 -0
- data/lib/hecks/hecks/operate/operate.bluebook +695 -0
- data/lib/hecks/hecks/quiesce/quiesce.bluebook +117 -0
- data/lib/hecks/hecks/rehearse/rehearse.bluebook +133 -0
- data/lib/hecks/hecks/release/release.bluebook +916 -0
- data/lib/hecks/hecks/serve/serve.bluebook +134 -0
- data/lib/hecks/hecks/shapes.json +1 -15
- data/lib/hecks/hecks/site.behaviors +1 -1
- data/lib/hecks/hecks/start/start.bluebook +194 -0
- data/lib/hecks/hecks/test/test.bluebook +638 -0
- data/lib/hecks/hecks/tickets.world +14 -0
- data/lib/hecks/language/bluebook/aggregate.bluebook +22 -0
- data/lib/hecks/language/bluebook/bluebook.bluebook +34 -0
- data/lib/hecks/language/bluebook/command.bluebook +35 -0
- data/lib/hecks/language/bluebook/process_manager.bluebook +14 -1
- data/lib/hecks/language/bluebook/vocabulary.bluebook +174 -54
- data/lib/hecks/language/hecksagon/domain_port.bluebook +1 -0
- data/lib/hecks/language/hecksagon/port_operation.bluebook +14 -0
- data/lib/hecks/language/kinds/run.kind +120 -0
- data/lib/hecks/language/oidc.json +10 -0
- data/lib/hecks/language/translation/translation_aggregate.bluebook +24 -0
- data/lib/hecks/module_folders.rb +31 -0
- data/lib/hecks/ports/key_vault.rb +1 -1
- data/lib/hecks/ports/persistence/append_only.rb +26 -8
- data/lib/hecks/ports/persistence/binding_policy.rb +3 -1
- data/lib/hecks/ports/persistence/codec_boundary.rb +1 -1
- data/lib/hecks/ports/persistence/mint_door.rb +74 -0
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +6 -5
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +5 -1
- data/lib/hecks/ports/persistence/plugins/era/era_status.rb +48 -0
- data/lib/hecks/ports/persistence/plugins/era/projected_bluebook.rb +127 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/additive_shape.rb +107 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/compose.rb +155 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/compose_render.rb +79 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/edge_files.rb +49 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/edge_route.rb +61 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/implicit_edge.rb +67 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/reconcile.rb +130 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/reconcile_files.rb +35 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +13 -5
- data/lib/hecks/ports/persistence/plugins/era/translation.rb +5 -0
- data/lib/hecks/ports/persistence/plugins/era.rb +1 -0
- data/lib/hecks/ports/persistence/repository_factory.rb +11 -3
- data/lib/hecks/ports/persistence/stored_name_guard.rb +36 -0
- data/lib/hecks/ports/persistence.rb +2 -0
- data/lib/hecks/projections/ci_pipeline/table/checks.rb +137 -0
- data/lib/hecks/projections/ci_pipeline/table/lookup.rb +59 -0
- data/lib/hecks/projections/ci_pipeline/table/refusals.rb +58 -0
- data/lib/hecks/projections/ci_pipeline/table/rows.rb +119 -0
- data/lib/hecks/projections/ci_pipeline/table/tree.rb +30 -0
- data/lib/hecks/projections/ci_pipeline/table/typing.rb +92 -0
- data/lib/hecks/projections/ci_pipeline/table.rb +112 -0
- data/lib/hecks/projections/ci_pipeline/workflows.rb +162 -0
- data/lib/hecks/projections/ci_pipeline/yaml_text.rb +104 -0
- data/lib/hecks/projections/deploy/box/hosting.rb +1 -1
- data/lib/hecks/projections/deploy/box/roll_recipe.rb +1 -1
- data/lib/hecks/projections/deploy/box/roll_scripts.rb +1 -1
- data/lib/hecks/projections/deploy/box.rb +1 -1
- data/lib/hecks/projections/deploy/templates/fargate/Makefile.tmpl +1 -1
- data/lib/hecks/projections/deploy/templates/lambda/Makefile.tmpl +3 -3
- data/lib/hecks/projections/undo.rb +46 -0
- data/lib/hecks/projections.rb +2 -0
- data/lib/hecks/projector/cli_projector/claims.rb +11 -0
- data/lib/hecks/projector/cli_projector/command_help.rb +6 -1
- data/lib/hecks/projector/cli_projector/command_specs.rb +11 -1
- data/lib/hecks/projector/cli_projector/completion.rb +87 -0
- data/lib/hecks/projector/cli_projector/everyday.rb +40 -0
- data/lib/hecks/projector/cli_projector/json_listing.rb +77 -0
- data/lib/hecks/projector/cli_projector/listing.rb +1 -1
- data/lib/hecks/projector/cli_projector/modules.rb +39 -0
- data/lib/hecks/projector/cli_projector/query_specs.rb +1 -0
- data/lib/hecks/projector/cli_projector/renames.rb +58 -0
- data/lib/hecks/projector/cli_projector/search.rb +74 -0
- data/lib/hecks/projector/cli_projector/usage.rb +23 -6
- data/lib/hecks/projector/cli_projector.rb +24 -1
- data/lib/hecks/quality_control/adapters/ci_head.adapter +8 -0
- data/lib/hecks/quality_control/adapters/image_roll.adapter +9 -0
- data/lib/hecks/quality_control/adapters/image_roll.rb +158 -0
- data/lib/hecks/quality_control/adapters/main_maintenance.adapter +8 -0
- data/lib/hecks/quality_control/adapters/main_maintenance.rb +275 -0
- data/lib/hecks/quality_control/adapters/pump_tools.adapter +7 -0
- data/lib/hecks/quality_control/adapters/pump_tools.rb +18 -0
- data/lib/hecks/quality_control/adapters/push_due_reader.adapter +8 -0
- data/lib/hecks/quality_control/adapters/push_due_reader.rb +99 -0
- data/lib/hecks/quality_control/adapters/qa_auto_mint.rb +183 -0
- data/lib/hecks/quality_control/adapters/qa_era_mint.rb +94 -0
- data/lib/hecks/quality_control/adapters/qa_quiesce_marker.rb +126 -0
- data/lib/hecks/quality_control/adapters/run_keys.rb +36 -0
- data/lib/hecks/quality_control/adapters/run_reader.adapter +7 -0
- data/lib/hecks/quality_control/adapters/run_reader.rb +188 -0
- data/lib/hecks/quality_control/cli/child.rb +1 -0
- data/lib/hecks/quality_control/cli/qa_discover_external_domains/scanning.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +3 -3
- data/lib/hecks/quality_control/cli/qa_event_pump/attached.rb +67 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/consumer.rb +103 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/cursors.rb +60 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/reactions.rb +46 -0
- data/lib/hecks/quality_control/cli/qa_event_pump/reader.rb +30 -0
- data/lib/hecks/quality_control/cli/qa_event_pump.rb +76 -0
- data/lib/hecks/quality_control/cli/qa_fix_main_bug/publishing.rb +79 -0
- data/lib/hecks/quality_control/cli/qa_fix_main_bug.rb +167 -0
- data/lib/hecks/quality_control/cli/qa_generated_domains/evaluation.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_generated_domains/promotion.rb +3 -3
- data/lib/hecks/quality_control/cli/qa_main_gate/gate_run.rb +52 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/logging.rb +70 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/shell.rb +47 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/sweeping.rb +59 -0
- data/lib/hecks/quality_control/cli/qa_main_gate/worktree.rb +62 -0
- data/lib/hecks/quality_control/cli/qa_main_gate.rb +135 -0
- data/lib/hecks/quality_control/cli/qa_postgres_role.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_pr_check/checking.rb +2 -3
- data/lib/hecks/quality_control/cli/qa_push_nudge.rb +48 -0
- data/lib/hecks/quality_control/cli/qa_seed_angles/seed.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_sweep/seat.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_tick/event_pump_step.rb +34 -0
- data/lib/hecks/quality_control/cli/qa_tick/output.rb +16 -1
- data/lib/hecks/quality_control/cli/qa_tick/push_nudge_step.rb +28 -0
- data/lib/hecks/quality_control/cli/qa_tick/quiesce_guard.rb +51 -0
- data/lib/hecks/quality_control/cli/qa_tick.rb +36 -8
- data/lib/hecks/quality_control/quality_control.behaviors +65 -0
- data/lib/hecks/quality_control/quality_control.bluebook +1131 -11
- data/lib/hecks/quality_control/quality_control.hecksagon +11 -0
- data/lib/hecks/quality_control/quality_control.ports.hecksagon +138 -0
- data/lib/hecks/query_ir/touchpoints.rb +5 -7
- data/lib/hecks/refused.rb +21 -0
- data/lib/hecks/release/approval.rb +6 -3
- data/lib/hecks/release/conditions.rb +46 -0
- data/lib/hecks/release/runner/gem_publisher.rb +4 -4
- data/lib/hecks/release/version_commit.rb +48 -0
- data/lib/hecks/runtime/command_interpreter/hydration.rb +5 -4
- data/lib/hecks/runtime/command_interpreter/persisting.rb +11 -3
- data/lib/hecks/runtime/command_interpreter.rb +2 -2
- data/lib/hecks/runtime/command_rules/admissibility.rb +0 -2
- data/lib/hecks/runtime/command_rules/emission.rb +0 -1
- data/lib/hecks/runtime/dependency_planning/expression_reads.rb +0 -1
- data/lib/hecks/runtime/dispatcher/planning.rb +24 -0
- data/lib/hecks/runtime/dispatcher/routing.rb +6 -0
- data/lib/hecks/runtime/dispatcher/value_routing.rb +54 -0
- data/lib/hecks/runtime/dispatcher.rb +7 -1
- data/lib/hecks/runtime/dry_run_plan.rb +60 -0
- data/lib/hecks/runtime/entity_element/location.rb +0 -1
- data/lib/hecks/runtime/entity_element/mutations.rb +0 -1
- data/lib/hecks/runtime/entity_interpreter/locating.rb +5 -0
- data/lib/hecks/runtime/entity_interpreter.rb +0 -1
- data/lib/hecks/runtime/errors.rb +26 -0
- data/lib/hecks/runtime/instance.rb +0 -1
- data/lib/hecks/runtime/invocation_builder.rb +0 -1
- data/lib/hecks/runtime/outbox/consumer_runner.rb +9 -1
- data/lib/hecks/runtime/outbox/relay.rb +25 -4
- data/lib/hecks/runtime/outbox/runnable.rb +3 -1
- data/lib/hecks/runtime/outbox.rb +6 -2
- data/lib/hecks/runtime/policy_interpreter/fan_out.rb +18 -2
- data/lib/hecks/runtime/policy_interpreter.rb +17 -9
- data/lib/hecks/runtime/port_operation_interpreter.rb +21 -7
- data/lib/hecks/runtime/query_interpreter/arguments.rb +6 -5
- data/lib/hecks/runtime/reaction_invocation.rb +0 -1
- data/lib/hecks/runtime/refusal_wording.rb +12 -1
- data/lib/hecks/runtime/registry/context_maps.rb +1 -5
- data/lib/hecks/runtime/registry/declarations.rb +34 -4
- data/lib/hecks/runtime/registry/hecksagon_rules.rb +15 -1
- data/lib/hecks/runtime/registry/runtime_state.rb +10 -0
- data/lib/hecks/runtime/registry/world_defaults.rb +24 -2
- data/lib/hecks/runtime/registry/world_names.rb +99 -0
- data/lib/hecks/runtime/registry.rb +33 -27
- data/lib/hecks/runtime/saga_interpreter/compensation.rb +10 -0
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +29 -3
- data/lib/hecks/runtime/saga_interpreter/delivery.rb +0 -1
- data/lib/hecks/runtime/saga_interpreter/lifecycle.rb +1 -1
- data/lib/hecks/runtime/saga_interpreter.rb +46 -2
- data/lib/hecks/runtime/value/coercion.rb +36 -8
- data/lib/hecks/rust_build/conformance.rb +16 -5
- data/lib/hecks/rust_build/parser.rb +25 -0
- data/lib/hecks/rust_build/project_rust/codegen_run.rb +45 -12
- data/lib/hecks/rust_build/project_rust/declared.rb +80 -0
- data/lib/hecks/rust_build/project_rust/features_header.rb +22 -0
- data/lib/hecks/rust_build/project_rust/manifest.rb +96 -0
- data/lib/hecks/rust_build/project_rust/meta.rb +36 -0
- data/lib/hecks/rust_build/project_rust.rb +28 -90
- data/lib/hecks/rust_build/write_if_changed.rb +19 -4
- data/lib/hecks/rust_build.rb +2 -1
- data/lib/hecks/rust_format.rb +32 -2
- data/lib/hecks/secrets.rb +111 -0
- data/lib/hecks/shape_ledger/edge_hygiene.rb +170 -0
- data/lib/hecks/shape_ledger/scope.rb +51 -0
- data/lib/hecks/shape_ledger/status.rb +89 -0
- data/lib/hecks/shape_ledger.rb +78 -33
- data/lib/hecks/site/bluebook/site.bluebook +1 -0
- data/lib/hecks/storehouse/audit.rb +34 -4
- data/lib/hecks/storehouse/callers.rb +8 -0
- data/lib/hecks/storehouse/dispatching.rb +14 -3
- data/lib/hecks/storehouse/identity.rb +41 -0
- data/lib/hecks/storehouse/querying.rb +7 -7
- data/lib/hecks/storehouse.rb +28 -10
- data/lib/hecks/tickets/bluebook/adapters/work_areas.adapter +7 -0
- data/lib/hecks/tickets/bluebook/adapters/work_limits.adapter +7 -0
- data/lib/hecks/tickets/bluebook/tickets.behaviors +70 -0
- data/lib/hecks/tickets/bluebook/tickets.bluebook +323 -28
- data/lib/hecks/tickets/bluebook/tickets.hecksagon +7 -0
- data/lib/hecks/tickets/bluebook/tickets.ports.hecksagon +17 -0
- data/lib/hecks/{cli → tools}/behaviors.rb +1 -1
- data/lib/hecks/{cli → tools}/canonicalise.rb +1 -1
- data/lib/hecks/{cli → tools}/check_engine_agreement.rb +1 -1
- data/lib/hecks/{cli → tools}/check_era.rb +6 -6
- data/lib/hecks/tools/ci_gates.rb +8 -2
- data/lib/hecks/tools/ci_workflows.rb +98 -0
- data/lib/hecks/{cli → tools}/console.rb +1 -1
- data/lib/hecks/{cli → tools}/deploy_template_diff.rb +1 -1
- data/lib/hecks/{cli → tools}/doc_coverage.rb +2 -2
- data/lib/hecks/{cli → tools}/document.rb +1 -1
- data/lib/hecks/{cli → tools}/domain_stub.rb +1 -1
- data/lib/hecks/{cli → tools}/domain_writer.rb +1 -1
- data/lib/hecks/tools/downstream_model_check.rb +122 -0
- data/lib/hecks/tools/evolve_run.rb +2 -2
- data/lib/hecks/{cli → tools}/expected_era.rb +1 -1
- data/lib/hecks/{cli → tools}/expression_projection.rb +1 -1
- data/lib/hecks/{cli → tools}/follow.rb +1 -1
- data/lib/hecks/tools/fuzz_sweep/options.rb +40 -5
- data/lib/hecks/tools/fuzz_sweep/pool.rb +12 -1
- data/lib/hecks/tools/fuzz_sweep/shards.rb +155 -0
- data/lib/hecks/tools/fuzz_sweep.rb +11 -5
- data/lib/hecks/tools/gate.rb +38 -29
- data/lib/hecks/tools/gate_memo/local_files.rb +33 -0
- data/lib/hecks/tools/gate_memo/rehearsal.rb +54 -0
- data/lib/hecks/tools/gate_memo/ruby_files.rb +152 -0
- data/lib/hecks/tools/gate_memo/session.rb +114 -0
- data/lib/hecks/tools/gate_memo/standalone.rb +67 -0
- data/lib/hecks/tools/gate_memo.rb +196 -0
- data/lib/hecks/tools/gate_report.rb +56 -0
- data/lib/hecks/{cli → tools}/history.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_agent.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_aggregate.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_draft.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_record.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_run.rb +2 -2
- data/lib/hecks/{cli → tools}/interview_session/agent_state.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session/catalog.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session/manual_findings.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session/proposals.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_session.rb +2 -2
- data/lib/hecks/{cli → tools}/interview_shape/lifecycle.rb +1 -1
- data/lib/hecks/{cli → tools}/interview_shape.rb +1 -1
- data/lib/hecks/{cli → tools}/ir.rb +1 -1
- data/lib/hecks/tools/lanes/files.rb +1 -1
- data/lib/hecks/tools/lanes/watch_workflow.rb +6 -8
- data/lib/hecks/tools/lanes/workflow.rb +1 -1
- data/lib/hecks/tools/lanes.rb +1 -1
- data/lib/hecks/{cli → tools}/mcp.rb +1 -1
- data/lib/hecks/{cli → tools}/model_check/examination.rb +1 -1
- data/lib/hecks/{cli → tools}/model_check/sources.rb +1 -1
- data/lib/hecks/{cli → tools}/model_check.rb +1 -1
- data/lib/hecks/tools/move_disables/reasons.rb +35 -0
- data/lib/hecks/tools/move_disables.rb +211 -0
- data/lib/hecks/tools/move_former_name.rb +105 -0
- data/lib/hecks/{cli → tools}/pattern_cases.rb +1 -1
- data/lib/hecks/{cli → tools}/persistence_notice.rb +1 -1
- data/lib/hecks/{cli → tools}/present.rb +1 -1
- data/lib/hecks/{cli → tools}/project_cli/launcher_source.rb +32 -22
- data/lib/hecks/{cli → tools}/project_cli/templates.rb +22 -15
- data/lib/hecks/{cli → tools}/project_cli.rb +11 -7
- data/lib/hecks/{cli → tools}/project_diagrams.rb +3 -3
- data/lib/hecks/{cli → tools}/project_glossary.rb +2 -2
- data/lib/hecks/{cli → tools}/reference.rb +2 -2
- data/lib/hecks/{cli → tools}/refresh_projections.rb +1 -1
- data/lib/hecks/{cli → tools}/refresh_rspec_runtime_baseline.rb +1 -1
- data/lib/hecks/tools/regeneration_run/pool.rb +148 -0
- data/lib/hecks/tools/regeneration_run/scratch.rb +76 -0
- data/lib/hecks/tools/regeneration_run.rb +125 -103
- data/lib/hecks/{cli → tools}/release.rb +1 -1
- data/lib/hecks/{cli → tools}/release_gem.rb +1 -1
- data/lib/hecks/{cli → tools}/rspec_io_parallel_files.rb +1 -1
- data/lib/hecks/{cli → tools}/rspec_shard_files.rb +1 -1
- data/lib/hecks/{cli → tools}/run.rb +9 -2
- data/lib/hecks/{cli → tools}/run_expectations.rb +1 -1
- data/lib/hecks/{cli → tools}/seed_semantics_corpus.rb +4 -4
- data/lib/hecks/{cli → tools}/serve_query_ir_mcp.rb +1 -1
- data/lib/hecks/{cli → tools}/shape.rb +3 -2
- data/lib/hecks/{cli → tools}/smoke_http/checks.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_http/settings.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_http/transport.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_http.rb +1 -1
- data/lib/hecks/{cli → tools}/smoke_test.rb +1 -1
- data/lib/hecks/{cli → tools}/spec_example.rb +1 -1
- data/lib/hecks/tools/stage_progress.rb +54 -0
- data/lib/hecks/{cli → tools}/statements.rb +1 -1
- data/lib/hecks/{cli → tools}/stores.rb +1 -1
- data/lib/hecks/{cli → tools}/stress_concurrency_specs/reporting.rb +1 -1
- data/lib/hecks/{cli → tools}/stress_concurrency_specs/usage.rb +4 -4
- data/lib/hecks/{cli → tools}/stress_concurrency_specs.rb +3 -3
- data/lib/hecks/tools/tenant_provisioning.rb +23 -0
- data/lib/hecks/tools/tools_doc.rb +10 -8
- data/lib/hecks/tools/translation_audit/edges.rb +21 -16
- data/lib/hecks/tools/translation_audit/verdicts.rb +1 -1
- data/lib/hecks/tools/translation_audit.rb +1 -1
- data/lib/hecks/tools/translation_scaffold.rb +1 -1
- data/lib/hecks/tools.rb +4 -1
- data/lib/hecks/version.rb +1 -1
- data/lib/hecks/vocabulary.rb +61 -31
- data/lib/hecks/workflow_pagination/judge.rb +48 -0
- data/lib/hecks/workflow_pagination/statement.rb +50 -0
- data/lib/hecks/workflow_pagination.rb +58 -0
- data/lib/hecks.rb +2 -0
- data/lib/rubocop/cop/hecks/bare_event_and_query_names.rb +58 -0
- data/lib/rubocop/cop/hecks/correlates_by_aggregate.rb +39 -0
- data/lib/rubocop/cop/hecks/creating_command_sets.rb +75 -0
- data/lib/rubocop/cop/hecks/invariant_expression_language.rb +47 -0
- data/lib/rubocop/cop/hecks/lifecycle_needs_attribute.rb +58 -0
- data/lib/rubocop/cop/hecks/no_id_string_attribute.rb +49 -0
- data/lib/rubocop/cop/hecks/one_terminal_mark_per_lifecycle.rb +47 -0
- data/lib/rubocop/cop/hecks/value_object_shorthand.rb +56 -0
- data/prebuilt/13c04bdc5970295b310f0a980d397ba722232c8da99cc1a0cdb383249921e871.marshal +0 -0
- data/prebuilt/e3857b77f47d9ecc1787b2e1f5136364f3cb3444ef4aea5479f3b98167affea2.marshal +0 -0
- data/qa/settings.yml +23 -0
- data/rust/.gitignore +0 -6
- data/rust/Cargo.toml +2 -1
- data/rust/build/Cargo.toml +1 -1
- data/rust/build/src/binding_pass.rs +57 -4
- data/rust/build/src/pipeline.rs +6 -4
- data/rust/build/src/resolve.rs +1 -0
- data/rust/codegen/Cargo.toml +1 -1
- data/rust/codegen/src/domain_generator.rs +3 -0
- data/rust/codegen/src/json_codec.rs +182 -23
- data/rust/codegen/src/one_of_references.rs +1 -0
- data/rust/codegen/src/queries.rs +20 -2
- data/rust/codegen/src/registry.rs +21 -5
- data/rust/expr/Cargo.toml +1 -1
- data/rust/host/Cargo.toml +1 -1
- data/rust/host/HECKS_RELEASE +1 -1
- data/rust/host/core/Cargo.toml +1 -1
- data/rust/host/src/bin/mint_harness.rs +1 -0
- data/rust/host/src/boot.rs +1 -0
- data/rust/host/src/store/mint.rs +40 -6
- data/rust/lsp/Cargo.toml +1 -1
- data/rust/parser/Cargo.toml +1 -1
- data/rust/parser/src/build/correlation_keys.rs +125 -0
- data/rust/parser/src/build/mod.rs +1 -0
- data/rust/parser/src/emit.rs +55 -3
- data/rust/parser/src/ir.rs +33 -1
- data/rust/parser/src/keywords.rs +289 -1
- data/rust/parser/src/main.rs +2 -0
- data/rust/parser/src/parse/aggregate.rs +10 -1
- data/rust/parser/src/parse/audience.rs +65 -0
- data/rust/parser/src/parse/command.rs +14 -0
- data/rust/parser/src/parse/declaration.rs +97 -0
- data/rust/parser/src/parse/domain_port.rs +6 -0
- data/rust/parser/src/parse/mod.rs +1 -0
- data/rust/parser/src/parse/process_manager.rs +17 -10
- data/rust/parser/src/parse/world.rs +12 -8
- data/rust/parser/src/render_ruby.rs +9 -0
- data/rust/parser/src/sentence/format.rs +3 -0
- data/rust/parser/src/sentence/process.rs +6 -2
- data/rust/src/exemplar/json.rs +17 -0
- data/rust/src/kernel/cli.rs +27 -3
- data/rust/src/kernel/dispatch.rs +4 -2
- data/rust/src/kernel/json.rs +62 -0
- data/rust/src/kernel/orchestrate.rs +28 -3
- data/rust/src/kernel/orchestrate_guard_tests.rs +12 -12
- data/rust/web/Cargo.toml +1 -1
- metadata +389 -96
- data/lib/hecks/cli/command_table.rb +0 -72
- data/lib/hecks/cli/launcher_words.rb +0 -168
- data/lib/hecks/cli.rb +0 -133
- data/lib/hecks/hecks/agents.bluebook +0 -246
- data/lib/hecks/hecks/codebase.bluebook +0 -3209
- data/lib/hecks/hecks/custodian.bluebook +0 -1300
- data/lib/hecks/hecks/ledger.bluebook +0 -190
- data/lib/hecks/hecks/rehearsal.bluebook +0 -437
- data/lib/hecks/hecks/tooling.bluebook +0 -1234
- data/lib/hecks/hecks/translations/2-148748.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-15a2e4.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-1b447c.bluebook +0 -5
- data/lib/hecks/hecks/translations/2-240474.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-44446d.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-46ca26.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-473eab.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-75cc28.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-781c07.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-84c18b.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-aa5fff.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-bfdb48.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-cd96d8.bluebook +0 -10
- data/lib/hecks/hecks/translations/2-d43f71.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-eea577.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-f53248.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-fbb677.bluebook +0 -2
- data/lib/hecks/hecks/translations/2-ffdf12.bluebook +0 -6
- data/lib/hecks/quality_control/adapters/clearance_recorder.rb +0 -36
- data/lib/hecks/quality_control/adapters/github_ci_webhook.rb +0 -56
- data/prebuilt/31cf81e12f16236ad26249be590cfea3799c9db67432e6a4ef54b801c355b6ae.marshal +0 -0
- data/prebuilt/68ecb2bd3abb1a221007db4f2b0375834c13aaccac8f2b99778e8517f11aa113.marshal +0 -0
- data/prebuilt/verdicts-0328c2403383837d780ad5ed81d1da351c56436b894cf9015b5d56b8f1f1bf10.json +0 -1
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
module Hecks
|
|
2
|
-
module CLI
|
|
3
|
-
# One subcommand: a one-line summary, its usage line, the file that holds it and the
|
|
4
|
-
# call that runs it (given the argv after the name, its program name and its own name).
|
|
5
|
-
Command = Struct.new(:summary, :usage, :file, :run)
|
|
6
|
-
|
|
7
|
-
# Every subcommand, in the order the help lists them.
|
|
8
|
-
COMMANDS = {
|
|
9
|
-
"run" => Command.new(
|
|
10
|
-
"Dispatch a verb, or run a JSON step list, against a domain.",
|
|
11
|
-
"hecks run [domain] <verb [name=value …] | script.json | - | '{\"steps\":[…]}'>",
|
|
12
|
-
"cli/run",
|
|
13
|
-
->(argv, program, _name) { Run.call(argv, program: program) }
|
|
14
|
-
),
|
|
15
|
-
"docs" => Command.new(
|
|
16
|
-
"Print a domain's usage document, projected from its bluebook.",
|
|
17
|
-
"hecks docs [domain-path] [aggregate]",
|
|
18
|
-
"cli/document",
|
|
19
|
-
->(argv, program, name) { Document.call(argv, projection: name.to_sym, program: program, root: Dir.pwd) }
|
|
20
|
-
),
|
|
21
|
-
"narrate" => Command.new(
|
|
22
|
-
"Print a domain read back in English, projected from its bluebook.",
|
|
23
|
-
"hecks narrate [domain-path] [aggregate]",
|
|
24
|
-
"cli/document",
|
|
25
|
-
->(argv, program, name) { Document.call(argv, projection: name.to_sym, program: program, root: Dir.pwd) }
|
|
26
|
-
),
|
|
27
|
-
"ir" => Command.new(
|
|
28
|
-
"Print a booted domain's IR as JSON.",
|
|
29
|
-
"hecks ir <domain> [--translations] | hecks ir --meta",
|
|
30
|
-
"cli/ir",
|
|
31
|
-
->(argv, program, _name) { Ir.call(argv, program: program) }
|
|
32
|
-
),
|
|
33
|
-
"stores" => Command.new(
|
|
34
|
-
"Print every aggregate's current records as JSON.",
|
|
35
|
-
"hecks stores <domain>",
|
|
36
|
-
"cli/stores",
|
|
37
|
-
->(argv, program, _name) { Stores.call(argv, program: program) }
|
|
38
|
-
),
|
|
39
|
-
"model_check" => Command.new(
|
|
40
|
-
"Statically check a domain's IR for dead states and unreachable steps.",
|
|
41
|
-
"hecks model_check [--strict] [--profile client] [--wait] [<domain> …]",
|
|
42
|
-
"cli/model_check",
|
|
43
|
-
->(argv, program, _name) { ModelCheck.call(argv, program: program, root: checkout_root) }
|
|
44
|
-
),
|
|
45
|
-
"smoke_test" => Command.new(
|
|
46
|
-
"Boot a domain and dispatch every declared command and report once.",
|
|
47
|
-
"hecks smoke_test [domain]",
|
|
48
|
-
"cli/smoke_test",
|
|
49
|
-
->(argv, _program, _name) { SmokeTest.call(argv, root: Dir.pwd) }
|
|
50
|
-
),
|
|
51
|
-
"project_diagrams" => Command.new(
|
|
52
|
-
"Write a domain's Mermaid diagrams under ./docs/generated/diagrams/ (positional form only).",
|
|
53
|
-
"hecks project_diagrams <domain-path> <BluebookName> (writes) | " \
|
|
54
|
-
"hecks project_diagrams domain=<path> bluebook=<Name> (prints; writes nothing)",
|
|
55
|
-
"cli/project_diagrams",
|
|
56
|
-
->(argv, program, _name) { ProjectDiagrams.call(argv, program: program, root: Dir.pwd) }
|
|
57
|
-
),
|
|
58
|
-
"project_cli" => Command.new(
|
|
59
|
-
"Write a command-line launcher beside each domain, named after its bluebook.",
|
|
60
|
-
"hecks project_cli [domain-path …]",
|
|
61
|
-
"cli/project_cli",
|
|
62
|
-
->(argv, program, _name) { ProjectCli.call(argv, program: program, root: Dir.pwd, remove_stale_bin: false) }
|
|
63
|
-
),
|
|
64
|
-
"mcp" => Command.new(
|
|
65
|
-
"Serve the MCP server over stdio (no authentication; stdio only).",
|
|
66
|
-
"hecks mcp [--stdio]",
|
|
67
|
-
"cli/mcp",
|
|
68
|
-
->(argv, _program, _name) { Mcp.call(argv) }
|
|
69
|
-
)
|
|
70
|
-
}.freeze
|
|
71
|
-
end
|
|
72
|
-
end
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
module Hecks
|
|
2
|
-
module CLI
|
|
3
|
-
# The launcher's `name=value` spellings of a subcommand's arguments, rewritten into the words
|
|
4
|
-
# the subcommand reads. `CLI` extends it.
|
|
5
|
-
module LauncherWords
|
|
6
|
-
# The launcher's flags that mean the same for every subcommand here: `--wait` (a subcommand
|
|
7
|
-
# exits with its own verdict, so waiting changes nothing) and `--confirm` (nothing here asks
|
|
8
|
-
# for one). Each may carry a Boolean word, as at the launcher.
|
|
9
|
-
GENERIC_FLAGS = ["--wait", "--confirm"].freeze
|
|
10
|
-
|
|
11
|
-
# A launcher word: `name=value`, where the name has no path characters.
|
|
12
|
-
NAME_VALUE = /\A[A-Za-z_][\w-]*=/
|
|
13
|
-
|
|
14
|
-
# The launcher's `name=value` spellings of a subcommand's positional arguments.
|
|
15
|
-
#
|
|
16
|
-
# `slots` lists, in positional order, the names that fill each place (`domain` before
|
|
17
|
-
# `aggregate`); `many` lets the first slot repeat and take a comma list; `exists` makes
|
|
18
|
-
# the first slot's values paths that must exist; `flags` and `options` are `--name`
|
|
19
|
-
# switches and `--name value` pairs; `ignored` names a launcher argument this form has no
|
|
20
|
-
# use for. A subcommand absent here (`run`, whose pairs are the verb's own, `mcp`, and
|
|
21
|
-
# `project_diagrams`, whose launcher form answers instead of writing) keeps its words.
|
|
22
|
-
LAUNCHER_FORMS = {
|
|
23
|
-
"docs" => { slots: [%w[domain], %w[aggregate]], exists: true },
|
|
24
|
-
"narrate" => { slots: [%w[domain], %w[aggregate]], exists: true },
|
|
25
|
-
"ir" => { slots: [%w[domain]], flags: %w[translations meta], exists: true },
|
|
26
|
-
"stores" => { slots: [%w[domain]], exists: true },
|
|
27
|
-
"model_check" => { slots: [%w[domains domain]], many: true, flags: %w[strict],
|
|
28
|
-
options: %w[profile], ignored: %w[run] },
|
|
29
|
-
"smoke_test" => { slots: [%w[subject domain]], ignored: %w[run] },
|
|
30
|
-
"project_cli" => { slots: [%w[domain]], many: true }
|
|
31
|
-
}.freeze
|
|
32
|
-
|
|
33
|
-
# Subcommands whose words are their own: `run`'s pairs and `mcp`'s flags are not the
|
|
34
|
-
# launcher's.
|
|
35
|
-
UNTOUCHED = %w[run mcp].freeze
|
|
36
|
-
|
|
37
|
-
# Subcommands whose `name=value` form is the launcher's own question, which answers
|
|
38
|
-
# differently from the positional form: `project_diagrams` writes files, the question prints.
|
|
39
|
-
LAUNCHER_ANSWERS = ["project_diagrams"].freeze
|
|
40
|
-
|
|
41
|
-
# Whether a command line is the launcher's own form of a subcommand that answers differently
|
|
42
|
-
# from its positional form, so the executable leaves it to the launcher.
|
|
43
|
-
#
|
|
44
|
-
# @param argv [Array<String>] the command line, subcommand first
|
|
45
|
-
# @return [Boolean]
|
|
46
|
-
def launcher_form?(argv)
|
|
47
|
-
LAUNCHER_ANSWERS.include?(argv.first) && argv.drop(1).any? { |word| word.match?(NAME_VALUE) }
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# Rewrites the launcher's spellings into the subcommand's own: drops the generic flags and
|
|
51
|
-
# turns `name=value` words into the positionals and flags the subcommand reads.
|
|
52
|
-
#
|
|
53
|
-
# @param name [String] a key of `COMMANDS`
|
|
54
|
-
# @param rest [Array<String>] the words after the subcommand
|
|
55
|
-
# @return [Array(Array<String>, String)] the words to run with, and a refusal (nil when
|
|
56
|
-
# there is none)
|
|
57
|
-
def launcher_words(name, rest)
|
|
58
|
-
return [rest, nil] if UNTOUCHED.include?(name)
|
|
59
|
-
|
|
60
|
-
require_relative "../adapters/driving/cli"
|
|
61
|
-
words = strip_generic(rest)
|
|
62
|
-
form = LAUNCHER_FORMS[name]
|
|
63
|
-
return [words, nil] unless form && words.any? { |word| word.match?(NAME_VALUE) }
|
|
64
|
-
|
|
65
|
-
bind_launcher_words(form, words)
|
|
66
|
-
rescue Runtime::TypeMismatch => e
|
|
67
|
-
[nil, e.message]
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
# Binds the `name=value` words of `words` into the form's slots and flags.
|
|
71
|
-
# @api private
|
|
72
|
-
#
|
|
73
|
-
# @param form [Hash] an entry of `LAUNCHER_FORMS`
|
|
74
|
-
# @param words [Array<String>] the words after the subcommand, generic flags removed
|
|
75
|
-
# @return [Array(Array<String>, String)] the words to run with, and a refusal (nil when
|
|
76
|
-
# there is none)
|
|
77
|
-
def bind_launcher_words(form, words)
|
|
78
|
-
slots, extra, refusal = bind_named_words(form, words)
|
|
79
|
-
return [nil, refusal] if refusal
|
|
80
|
-
|
|
81
|
-
missing = slots.first.find { |path| !File.exist?(path) } if form[:exists]
|
|
82
|
-
return [nil, "no such domain #{missing.inspect}"] if missing
|
|
83
|
-
|
|
84
|
-
[words.grep_v(NAME_VALUE) + extra + slots.flatten, nil]
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# Sorts the `name=value` words of `words` into the form's positional slots and its flags.
|
|
88
|
-
# @api private
|
|
89
|
-
#
|
|
90
|
-
# @param form [Hash] an entry of `LAUNCHER_FORMS`
|
|
91
|
-
# @param words [Array<String>] the words after the subcommand, generic flags removed
|
|
92
|
-
# @return [Array(Array<Array<String>>, Array<String>, String)] the slot contents, the extra
|
|
93
|
-
# flag words, and a refusal (nil when there is none)
|
|
94
|
-
def bind_named_words(form, words)
|
|
95
|
-
slots = Array.new(form[:slots].length) { [] }
|
|
96
|
-
extra = []
|
|
97
|
-
words.grep(NAME_VALUE).each do |word|
|
|
98
|
-
refusal = bind_word(form, word, slots, extra)
|
|
99
|
-
return [nil, nil, refusal] if refusal
|
|
100
|
-
end
|
|
101
|
-
[slots, extra, nil]
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
# Files one `name=value` word into its slot, or as a flag or option.
|
|
105
|
-
# @api private
|
|
106
|
-
#
|
|
107
|
-
# @return [String, nil] a refusal when the form takes no such argument
|
|
108
|
-
def bind_word(form, word, slots, extra)
|
|
109
|
-
key, value = word.split("=", 2)
|
|
110
|
-
key = key.tr("-", "_")
|
|
111
|
-
slot = form[:slots].index { |names| names.include?(key) }
|
|
112
|
-
return bind_flag_or_option(form, key, value, extra) unless slot
|
|
113
|
-
|
|
114
|
-
slots[slot].concat(form[:many] ? value.split(",") : [value])
|
|
115
|
-
nil
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
# Appends the flag or option word for one `name=value` into `extra`.
|
|
119
|
-
# @api private
|
|
120
|
-
#
|
|
121
|
-
# @return [String, nil] a refusal when the form takes no such argument
|
|
122
|
-
def bind_flag_or_option(form, key, value, extra)
|
|
123
|
-
return add_flag(key, value, extra) if listed?(form, :flags, key)
|
|
124
|
-
return add_option(key, value, extra) if listed?(form, :options, key)
|
|
125
|
-
return if listed?(form, :ignored, key)
|
|
126
|
-
|
|
127
|
-
known = form[:slots].flatten + Array(form[:flags]) + Array(form[:options])
|
|
128
|
-
"no argument #{key.inspect} — this verb takes #{known.sort.join(", ")}"
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
# @api private
|
|
132
|
-
def listed?(form, kind, key) = Array(form[kind]).include?(key)
|
|
133
|
-
|
|
134
|
-
# @api private
|
|
135
|
-
def add_flag(key, value, extra)
|
|
136
|
-
extra << "--#{key.tr("_", "-")}" if Adapters::Driving::Cli.boolean(value)
|
|
137
|
-
nil
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
# @api private
|
|
141
|
-
def add_option(key, value, extra)
|
|
142
|
-
extra.push("--#{key}", value)
|
|
143
|
-
nil
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
# Takes `--wait` and `--confirm`, each with an optional Boolean word, out of `words`.
|
|
147
|
-
# @api private
|
|
148
|
-
def strip_generic(words)
|
|
149
|
-
queue = words.dup
|
|
150
|
-
kept = []
|
|
151
|
-
until queue.empty?
|
|
152
|
-
word = queue.shift
|
|
153
|
-
flag, value = word.split("=", 2)
|
|
154
|
-
next kept << word unless GENERIC_FLAGS.include?(flag)
|
|
155
|
-
|
|
156
|
-
Adapters::Driving::Cli.boolean(value || generic_value(queue))
|
|
157
|
-
end
|
|
158
|
-
kept
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
# The Boolean word that follows a generic flag, or "true" when none does.
|
|
162
|
-
# @api private
|
|
163
|
-
def generic_value(queue)
|
|
164
|
-
Adapters::Driving::Cli::BOOLEAN_WORDS.key?(queue.first.to_s.downcase) ? queue.shift : "true"
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
end
|
data/lib/hecks/cli.rb
DELETED
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
require_relative "cli/command_table"
|
|
2
|
-
require_relative "cli/launcher_words"
|
|
3
|
-
|
|
4
|
-
module Hecks
|
|
5
|
-
# The `hecks` command an installed gem puts on the path: one router over the
|
|
6
|
-
# domain-operator tools, each also runnable from a checkout as `exe/hecks <name>`.
|
|
7
|
-
#
|
|
8
|
-
# Every subcommand's logic lives under `cli/`, and `exe/hecks` routes to it.
|
|
9
|
-
#
|
|
10
|
-
# See `docs/decisions/0066-the-gem-ships-a-hecks-executable-and-dev-tooling-stays-in-the-repo.md`.
|
|
11
|
-
module CLI
|
|
12
|
-
HELP_FLAGS = ["--help", "-h"].freeze
|
|
13
|
-
|
|
14
|
-
# Printed above the usage line by `overview`, on every path that reaches it
|
|
15
|
-
# (a bare `hecks`, `hecks --help`, and an unknown subcommand alike).
|
|
16
|
-
HERO = <<~BANNER.freeze
|
|
17
|
-
# # ##### #### # # ####
|
|
18
|
-
# # # # # # #
|
|
19
|
-
##### #### # ## ###
|
|
20
|
-
# # # # # # #
|
|
21
|
-
# # ##### #### # # ####
|
|
22
|
-
|
|
23
|
-
It's all about the specs
|
|
24
|
-
BANNER
|
|
25
|
-
|
|
26
|
-
# Exit status for a missing or unknown subcommand.
|
|
27
|
-
USAGE_STATUS = 2
|
|
28
|
-
|
|
29
|
-
include LauncherWords
|
|
30
|
-
extend LauncherWords
|
|
31
|
-
|
|
32
|
-
module_function
|
|
33
|
-
|
|
34
|
-
# The checkout this library is loaded from, which a corpus sweep needs; an installed gem has
|
|
35
|
-
# none.
|
|
36
|
-
#
|
|
37
|
-
# @return [String, nil] the repository root, or nil when `hecks.gemspec` is not beside `lib/`
|
|
38
|
-
def checkout_root
|
|
39
|
-
root = File.expand_path("../..", __dir__)
|
|
40
|
-
root if File.exist?(File.join(root, "hecks.gemspec"))
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Routes `argv` to its subcommand and runs it.
|
|
44
|
-
#
|
|
45
|
-
# A subcommand followed only by `--help`/`-h` prints its usage without
|
|
46
|
-
# running it; other arguments still reach the verb itself.
|
|
47
|
-
#
|
|
48
|
-
# @param argv [Array<String>] the command line, subcommand first
|
|
49
|
-
# @param out [#puts] where help goes
|
|
50
|
-
# @param err [#puts] where usage errors go
|
|
51
|
-
# @return [Integer] the process exit status: 2 for a bad command, 1 for a bad word, the
|
|
52
|
-
# subcommand's own Integer when it returns one, else 0; a subcommand that fails exits
|
|
53
|
-
# the process itself
|
|
54
|
-
def start(argv, out: $stdout, err: $stderr)
|
|
55
|
-
Encoding.default_external = Encoding::UTF_8
|
|
56
|
-
Encoding.default_internal = Encoding::UTF_8
|
|
57
|
-
name, *rest = argv
|
|
58
|
-
return refuse_command(name, out, err) unless COMMANDS.key?(name)
|
|
59
|
-
return command_help(name, out) if help_asked?(name, rest)
|
|
60
|
-
|
|
61
|
-
words, problem = launcher_words(name, rest)
|
|
62
|
-
return refuse_words(name, problem, err) if problem
|
|
63
|
-
|
|
64
|
-
result = dispatch(name, words)
|
|
65
|
-
result.is_a?(Integer) ? result : 0
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# Answers an absent or unknown subcommand with the overview.
|
|
69
|
-
# @api private
|
|
70
|
-
# @return [Integer] 0 when help was asked for, else the usage status
|
|
71
|
-
def refuse_command(name, out, err)
|
|
72
|
-
asked = HELP_FLAGS.include?(name) || name == "help"
|
|
73
|
-
err.puts "hecks: unknown command #{name.inspect}" unless asked || name.nil?
|
|
74
|
-
overview(asked ? out : err)
|
|
75
|
-
asked ? 0 : USAGE_STATUS
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# Prints one subcommand's usage.
|
|
79
|
-
# @api private
|
|
80
|
-
# @return [Integer] 0
|
|
81
|
-
def command_help(name, out)
|
|
82
|
-
help(COMMANDS.fetch(name), out)
|
|
83
|
-
0
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
# Says why a subcommand's words were refused.
|
|
87
|
-
# @api private
|
|
88
|
-
# @return [Integer] 1
|
|
89
|
-
def refuse_words(name, problem, err)
|
|
90
|
-
err.puts "hecks #{name}: #{problem}"
|
|
91
|
-
1
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
# Whether the words ask for a subcommand's usage: a lone flag for `run`, whose other words are
|
|
95
|
-
# the verb's own, and the flag anywhere for the rest.
|
|
96
|
-
# @api private
|
|
97
|
-
def help_asked?(name, rest)
|
|
98
|
-
return rest.length == 1 && HELP_FLAGS.include?(rest.first) if name == "run"
|
|
99
|
-
|
|
100
|
-
rest.any? { |word| HELP_FLAGS.include?(word) }
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
# Runs one known subcommand with the working directory as its root.
|
|
104
|
-
#
|
|
105
|
-
# @param name [String] a key of `COMMANDS`
|
|
106
|
-
# @param argv [Array<String>] the arguments after the subcommand
|
|
107
|
-
# @return [void]
|
|
108
|
-
# @raise [SystemExit] when the subcommand exits the process itself
|
|
109
|
-
def dispatch(name, argv)
|
|
110
|
-
command = COMMANDS.fetch(name)
|
|
111
|
-
require_relative command.file
|
|
112
|
-
command.run.call(argv, "hecks #{name}", name)
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
# @api private
|
|
116
|
-
def overview(io)
|
|
117
|
-
io.puts HERO
|
|
118
|
-
io.puts "usage: hecks <command> [arguments]"
|
|
119
|
-
io.puts ""
|
|
120
|
-
width = COMMANDS.keys.map(&:length).max
|
|
121
|
-
COMMANDS.each { |name, command| io.puts " #{name.ljust(width)} #{command.summary}" }
|
|
122
|
-
io.puts ""
|
|
123
|
-
io.puts "Run `hecks <command> --help` for one command's usage."
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# @api private
|
|
127
|
-
def help(command, io)
|
|
128
|
-
io.puts "usage: #{command.usage}"
|
|
129
|
-
io.puts ""
|
|
130
|
-
io.puts command.summary
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
end
|
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
Hecks.bluebook "Hecks" do
|
|
2
|
-
# Agents: handing one brief to a background Claude session (ADR 0141). A dispatch is a run like
|
|
3
|
-
# the Custodian `*Run`s: it is requested, the outside is asked, and what came back is judged by
|
|
4
|
-
# the givens and reactions below.
|
|
5
|
-
#
|
|
6
|
-
# The bluebook decides everything: a brief must say something, an agent name cannot be mistaken
|
|
7
|
-
# for a flag, the directory must be one the `Agents` port finds, and a session that reports
|
|
8
|
-
# `done` or `stopped` has finished while `busy` and `idle` have not. The port only looks and
|
|
9
|
-
# starts: it finds a directory, starts the session, and reports the state the session is in.
|
|
10
|
-
|
|
11
|
-
aggregate "AgentRun" do
|
|
12
|
-
description "One brief handed to a background Claude session: started and tracked, or refused with the reason."
|
|
13
|
-
|
|
14
|
-
attribute :run, RunKey
|
|
15
|
-
attribute :repo, Path
|
|
16
|
-
attribute :brief, Brief
|
|
17
|
-
attribute :agent, AgentName, optional: true
|
|
18
|
-
attribute :session, SessionId, optional: true
|
|
19
|
-
attribute :condition, Condition, optional: true
|
|
20
|
-
attribute :refusal, Report, optional: true
|
|
21
|
-
attribute :tidied_at, Moment, optional: true
|
|
22
|
-
identified_by :run
|
|
23
|
-
|
|
24
|
-
value_object "RunKey" do
|
|
25
|
-
attribute :value, String, matches: :present
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
# The directory the session works in.
|
|
29
|
-
value_object "Path" do
|
|
30
|
-
attribute :value, String, matches: :not_empty
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# What the session is asked to do. It may span lines; the dispatch refuses one that is blank.
|
|
34
|
-
value_object "Brief" do
|
|
35
|
-
attribute :value, String
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# A custom agent's name. It starts with a letter or digit, so it cannot be taken for a flag.
|
|
39
|
-
value_object "AgentName" do
|
|
40
|
-
attribute :value, String, pattern: '\A[A-Za-z0-9][A-Za-z0-9._-]*\z'
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
value_object "SessionId" do
|
|
44
|
-
attribute :value, String, matches: :present
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# What a session reported about itself the last time it was asked.
|
|
48
|
-
value_object "Condition" do
|
|
49
|
-
attribute :value, String
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
value_object "Report" do
|
|
53
|
-
attribute :value, String
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
# When the outside removed a session, as the port reports it.
|
|
57
|
-
value_object "Moment" do
|
|
58
|
-
attribute :value, String
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
lifecycle :status, default: "requested" do
|
|
62
|
-
mark :failure, "refused"
|
|
63
|
-
transition "Begin" => "started", from: "requested"
|
|
64
|
-
transition "Decline" => "refused", from: "requested"
|
|
65
|
-
transition "Finish" => "finished", from: "started"
|
|
66
|
-
transition "Tidied" => "tidied", from: "finished"
|
|
67
|
-
mark :terminal, "tidied", "refused"
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
command "Dispatch" do
|
|
71
|
-
role "Operator"
|
|
72
|
-
goal "Hand one brief to a background Claude session working in a directory"
|
|
73
|
-
|
|
74
|
-
attribute :run, RunKey, sets: true
|
|
75
|
-
attribute :repo, Path, sets: true
|
|
76
|
-
attribute :brief, Brief, sets: true
|
|
77
|
-
attribute :agent, AgentName, optional: true, sets: true
|
|
78
|
-
|
|
79
|
-
given("a brief says something") { !brief.value.to_s.strip.empty? }
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
emits AgentRunRequested
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
command "Begin" do
|
|
86
|
-
role "System"
|
|
87
|
-
goal "Record the session the directory's agent started"
|
|
88
|
-
|
|
89
|
-
reference_to AgentRun
|
|
90
|
-
attribute :session, SessionId, sets: true
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
emits AgentRunStarted
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
command "Decline" do
|
|
97
|
-
role "System"
|
|
98
|
-
goal "Record why no session was started"
|
|
99
|
-
|
|
100
|
-
reference_to AgentRun
|
|
101
|
-
attribute :refusal, Report, sets: true
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
emits AgentRunDeclined
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
command "Check", from: "started" do
|
|
108
|
-
role "Operator"
|
|
109
|
-
goal "Ask whether a started session is still working"
|
|
110
|
-
|
|
111
|
-
reference_to AgentRun
|
|
112
|
-
|
|
113
|
-
emits AgentCheckRequested
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
command "Finish" do
|
|
117
|
-
role "System"
|
|
118
|
-
goal "Record that the session has ended, and how it ended"
|
|
119
|
-
|
|
120
|
-
reference_to AgentRun
|
|
121
|
-
attribute :condition, Condition, sets: true
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
emits AgentRunFinished
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
# A finished run's session is removed only when it ended `done`; a session still `working`,
|
|
128
|
-
# `blocked` or `stopped` is kept, and so is one a person has taken over (the port says so).
|
|
129
|
-
command "Tidy", from: "finished" do
|
|
130
|
-
role "Operator"
|
|
131
|
-
goal "Remove the finished session of one run, unless it is unfinished or a person took it over"
|
|
132
|
-
|
|
133
|
-
reference_to AgentRun
|
|
134
|
-
|
|
135
|
-
given("the session ended done: a working, blocked or stopped session is kept") { condition.value == "done" }
|
|
136
|
-
|
|
137
|
-
emits TidyRequested
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
command "Tidied" do
|
|
141
|
-
role "System"
|
|
142
|
-
goal "Record that the session was removed, and when"
|
|
143
|
-
|
|
144
|
-
reference_to AgentRun
|
|
145
|
-
attribute :tidied_at, Moment, sets: true
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
emits AgentRunTidied
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
command "Retain" do
|
|
152
|
-
role "System"
|
|
153
|
-
goal "Record why a finished session was kept"
|
|
154
|
-
|
|
155
|
-
reference_to AgentRun
|
|
156
|
-
attribute :refusal, Report, sets: true
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
emits AgentRunRetained
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
query "Tidyable" do
|
|
163
|
-
description "Every finished run, oldest key first; `Tidy` keeps those that did not end done."
|
|
164
|
-
where(status: "finished")
|
|
165
|
-
order_by :run
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
query "Running" do
|
|
169
|
-
description "Every run whose session was started and is not known to have ended, oldest key first."
|
|
170
|
-
where(status: "started")
|
|
171
|
-
order_by :run
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
query "Declined" do
|
|
175
|
-
description "Every run that no session was started for, with the reason."
|
|
176
|
-
where(status: "refused")
|
|
177
|
-
order_by :run
|
|
178
|
-
end
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
# The directory is looked for first, so a brief is never handed to a session that has nowhere to work.
|
|
182
|
-
policy "LocateTheRepo" do
|
|
183
|
-
on "AgentRun.AgentRunRequested"
|
|
184
|
-
ask :locate, with: { run: :run }
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
policy "StartWhenTheRepoIsThere" do
|
|
188
|
-
on "AgentRun.RepoLocated"
|
|
189
|
-
ask :start, with: { run: :run }
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
policy "RecordTheSession" do
|
|
193
|
-
on "AgentRun.AgentStarted"
|
|
194
|
-
trigger AgentRun::Begin, with: { session: :session }
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
policy "RecordTheMissingRepo" do
|
|
198
|
-
on "AgentRun.RepoMissing"
|
|
199
|
-
trigger AgentRun::Decline, with: { refusal: :refusal }
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
policy "RecordTheRefusedStart" do
|
|
203
|
-
on "AgentRun.StartRefused"
|
|
204
|
-
trigger AgentRun::Decline, with: { refusal: :refusal }
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
policy "AskTheSession" do
|
|
208
|
-
on "AgentRun.AgentCheckRequested"
|
|
209
|
-
ask :examine, with: { run: :run }
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
# The session is looked at before it is removed; the port says whether a person took it over.
|
|
213
|
-
policy "ReviewBeforeTidy" do
|
|
214
|
-
on "AgentRun.TidyRequested"
|
|
215
|
-
ask :review, with: { run: :run }
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
policy "RemoveWhenNobodyTookOver" do
|
|
219
|
-
on "AgentRun.SessionReviewed"
|
|
220
|
-
where { taken_over == false }
|
|
221
|
-
ask :remove, with: { run: :run }
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
policy "KeepWhenAPersonTookOver" do
|
|
225
|
-
on "AgentRun.SessionReviewed"
|
|
226
|
-
where { taken_over != false }
|
|
227
|
-
trigger AgentRun::Retain, with: { refusal: :note }
|
|
228
|
-
end
|
|
229
|
-
|
|
230
|
-
policy "RecordTheRemoval" do
|
|
231
|
-
on "AgentRun.SessionRemoved"
|
|
232
|
-
trigger AgentRun::Tidied, with: { tidied_at: :removed_at }
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
policy "RecordTheKeptSession" do
|
|
236
|
-
on "AgentRun.RemoveRefused"
|
|
237
|
-
trigger AgentRun::Retain, with: { refusal: :refusal }
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
# `done` and `stopped` are a session's two ways of ending; `busy` and `idle` are not.
|
|
241
|
-
policy "FinishWhenTheSessionEnded" do
|
|
242
|
-
on "AgentRun.SessionChecked"
|
|
243
|
-
where { condition == "done" || condition == "stopped" }
|
|
244
|
-
trigger AgentRun::Finish, with: { condition: :condition }
|
|
245
|
-
end
|
|
246
|
-
end
|