hecks 2.7.0 → 2.9.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 +11 -0
- data/lib/hecks/adapters/driven/claude_code.rb +4 -104
- data/lib/hecks/adapters/driven/d1.rb +44 -237
- data/lib/hecks/adapters/driven/folder.rb +17 -76
- data/lib/hecks/adapters/driven/google_authentication.rb +15 -49
- data/lib/hecks/adapters/driven/governance_authorization.rb +23 -70
- data/lib/hecks/adapters/driven/heki/journal.rb +8 -41
- data/lib/hecks/adapters/driven/heki/saga_store.rb +12 -54
- data/lib/hecks/adapters/driven/heki/snapshot.rb +4 -12
- data/lib/hecks/adapters/driven/heki.rb +13 -42
- data/lib/hecks/adapters/driven/identity_registry.rb +3 -14
- data/lib/hecks/adapters/driven/in_memory_ordering.rb +9 -26
- data/lib/hecks/adapters/driven/in_process_key_vault.rb +2 -14
- data/lib/hecks/adapters/driven/lambda/client.rb +10 -51
- data/lib/hecks/adapters/driven/lambda.rb +10 -84
- data/lib/hecks/adapters/driven/local_storage.rb +5 -40
- data/lib/hecks/adapters/driven/memory.rb +18 -99
- data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +5 -21
- data/lib/hecks/adapters/driven/postgres/codec.rb +6 -28
- data/lib/hecks/adapters/driven/postgres/outbox.rb +3 -12
- data/lib/hecks/adapters/driven/postgres/reconnect.rb +4 -30
- data/lib/hecks/adapters/driven/postgres/schema_builder.rb +34 -108
- data/lib/hecks/adapters/driven/postgres.rb +145 -134
- data/lib/hecks/adapters/driven/postgres_era.adapter +4 -15
- data/lib/hecks/adapters/driven/prism.rb +7 -30
- data/lib/hecks/adapters/driven/sql_query_builder.rb +21 -121
- data/lib/hecks/adapters/driven/sqlite/codec.rb +8 -40
- data/lib/hecks/adapters/driven/sqlite/projection.rb +26 -82
- data/lib/hecks/adapters/driven/sqlite/schema_builder.rb +40 -84
- data/lib/hecks/adapters/driven/sqlite.rb +128 -65
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +15 -37
- data/lib/hecks/adapters/driven.rb +5 -36
- data/lib/hecks/adapters/driving/github_webhook.rb +8 -76
- data/lib/hecks/behaviors/dsl.rb +7 -25
- data/lib/hecks/behaviors/expectations.rb +32 -142
- data/lib/hecks/behaviors/ir.rb +7 -20
- data/lib/hecks/behaviors/rspec.rb +6 -17
- data/lib/hecks/behaviors/runner.rb +10 -34
- data/lib/hecks/behaviors.rb +4 -8
- data/lib/hecks/bluebook/aggregate.rb +9 -75
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +9 -38
- data/lib/hecks/bluebook/assembly/build.rb +4 -15
- data/lib/hecks/bluebook/assembly/contract.rb +15 -136
- data/lib/hecks/bluebook/assembly/contracts.rb +54 -174
- data/lib/hecks/bluebook/assembly/marks.rb +31 -223
- data/lib/hecks/bluebook/assembly/specializer.rb +6 -52
- data/lib/hecks/bluebook/assembly.rb +6 -45
- data/lib/hecks/bluebook/attribute.rb +12 -61
- data/lib/hecks/bluebook/behaviour/aggregate.rb +10 -39
- data/lib/hecks/bluebook/behaviour/attribute.rb +3 -14
- data/lib/hecks/bluebook/behaviour/chapter.rb +17 -42
- data/lib/hecks/bluebook/behaviour/command.rb +14 -66
- data/lib/hecks/bluebook/behaviour/domain_port.rb +4 -20
- data/lib/hecks/bluebook/behaviour/entity.rb +7 -27
- data/lib/hecks/bluebook/behaviour/hexagon.rb +23 -41
- data/lib/hecks/bluebook/behaviour/lifecycle.rb +15 -40
- data/lib/hecks/bluebook/behaviour/policy.rb +23 -52
- data/lib/hecks/bluebook/behaviour/process_manager.rb +30 -57
- data/lib/hecks/bluebook/behaviour/read_model.rb +38 -26
- data/lib/hecks/bluebook/behaviour/traits.rb +27 -64
- data/lib/hecks/bluebook/behaviour/value_object.rb +5 -24
- data/lib/hecks/bluebook/capabilities.rb +17 -49
- data/lib/hecks/bluebook/chapter.rb +10 -48
- data/lib/hecks/bluebook/command.rb +23 -81
- data/lib/hecks/bluebook/domain_port.rb +14 -63
- data/lib/hecks/bluebook/dsl/aggregate_builder/sealing.rb +50 -229
- data/lib/hecks/bluebook/dsl/aggregate_builder.rb +50 -377
- data/lib/hecks/bluebook/dsl/attribute_collector.rb +33 -204
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +17 -65
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +86 -708
- data/lib/hecks/bluebook/dsl/bluebook_builder.rb +56 -170
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +1 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +74 -546
- data/lib/hecks/bluebook/dsl/const_shim.rb +8 -41
- data/lib/hecks/bluebook/dsl/domain_port_builder.rb +12 -87
- data/lib/hecks/bluebook/dsl/entity_builder.rb +44 -330
- data/lib/hecks/bluebook/dsl/generic_dispatch.rb +20 -269
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +26 -189
- data/lib/hecks/bluebook/dsl/identity_declaration.rb +13 -88
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +6 -20
- data/lib/hecks/bluebook/dsl/policy_builder.rb +16 -88
- data/lib/hecks/bluebook/dsl/port_builder.rb +2 -6
- data/lib/hecks/bluebook/dsl/port_operation_builder.rb +22 -96
- data/lib/hecks/bluebook/dsl/process_manager_builder.rb +31 -184
- data/lib/hecks/bluebook/dsl/query_builder.rb +11 -42
- data/lib/hecks/bluebook/dsl/read_model_builder.rb +75 -201
- data/lib/hecks/bluebook/dsl/rule_reference.rb +22 -163
- data/lib/hecks/bluebook/dsl/translation_builder.rb +28 -114
- data/lib/hecks/bluebook/dsl/value_object_builder.rb +10 -124
- data/lib/hecks/bluebook/dsl/word_gate.rb +16 -162
- data/lib/hecks/bluebook/dsl/world_builder.rb +19 -106
- data/lib/hecks/bluebook/entity.rb +13 -71
- data/lib/hecks/bluebook/expression/ast_json.rb +24 -190
- data/lib/hecks/bluebook/expression/ast_reader.rb +12 -54
- data/lib/hecks/bluebook/expression/canonical_form.rb +11 -88
- data/lib/hecks/bluebook/expression/evaluator.rb +47 -295
- data/lib/hecks/bluebook/expression/resolver/block_predicates.rb +30 -147
- data/lib/hecks/bluebook/expression/resolver.rb +37 -660
- data/lib/hecks/bluebook/hexagon.rb +5 -28
- data/lib/hecks/bluebook/lifecycle.rb +5 -16
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +1 -7
- data/lib/hecks/bluebook/meta_validator/judge.rb +111 -361
- data/lib/hecks/bluebook/meta_validator/plan.rb +33 -162
- data/lib/hecks/bluebook/meta_validator/port_judge.rb +2 -7
- data/lib/hecks/bluebook/meta_validator/readings.rb +56 -342
- data/lib/hecks/bluebook/meta_validator/reconstruction.rb +24 -176
- data/lib/hecks/bluebook/meta_validator/shapes.rb +54 -268
- data/lib/hecks/bluebook/meta_validator/syntax_boot.rb +47 -308
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +7 -43
- data/lib/hecks/bluebook/meta_validator/world_judge.rb +6 -18
- data/lib/hecks/bluebook/meta_validator.rb +79 -349
- data/lib/hecks/bluebook/model_check/client_profile.rb +10 -91
- data/lib/hecks/bluebook/model_check.rb +102 -600
- data/lib/hecks/bluebook/pattern_subset.rb +11 -69
- data/lib/hecks/bluebook/process_manager.rb +13 -83
- data/lib/hecks/bluebook/project_loader.rb +3 -39
- data/lib/hecks/bluebook/project_register.rb +12 -60
- data/lib/hecks/bluebook/query.rb +9 -48
- data/lib/hecks/bluebook/read_model.rb +57 -81
- data/lib/hecks/bluebook/reference.rb +7 -41
- data/lib/hecks/bluebook/smoke_test.rb +8 -98
- data/lib/hecks/bluebook/synthesizer.rb +13 -62
- data/lib/hecks/bluebook/translation.rb +26 -62
- data/lib/hecks/bluebook/value_object.rb +11 -36
- data/lib/hecks/bluebook.rb +5 -22
- data/lib/hecks/cache_dir.rb +84 -0
- data/lib/hecks/cli/document.rb +86 -0
- data/lib/hecks/cli/ir.rb +45 -0
- data/lib/hecks/cli/mcp.rb +31 -0
- data/lib/hecks/cli/mcp_door.rb +366 -0
- data/lib/hecks/cli/model_check.rb +203 -0
- data/lib/hecks/cli/project_cli.rb +90 -0
- data/lib/hecks/cli/project_diagrams.rb +36 -0
- data/lib/hecks/cli/run.rb +173 -0
- data/lib/hecks/cli/smoke_test.rb +45 -0
- data/lib/hecks/cli/stores.rb +53 -0
- data/lib/hecks/cli.rb +160 -0
- data/lib/hecks/construct.rb +8 -34
- data/lib/hecks/deploy/bluebook/deploy.bluebook +33 -142
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +2 -9
- data/lib/hecks/embryonaut_bluebook/lock.rb +3 -35
- data/lib/hecks/embryonaut_bluebook/shape.rb +1 -17
- data/lib/hecks/embryonaut_bluebook/vendor.rb +8 -53
- data/lib/hecks/embryonaut_bluebook/vendor_cli.rb +4 -19
- data/lib/hecks/embryonaut_bluebook.rb +4 -71
- data/lib/hecks/facade/cli_door.rb +24 -106
- data/lib/hecks/facade/cli_runner.rb +28 -172
- data/lib/hecks/facade/command_request.rb +13 -33
- data/lib/hecks/facade/handle.rb +34 -121
- data/lib/hecks/facade/json_door.rb +31 -146
- data/lib/hecks/facade/surface/aggregate_door.rb +39 -104
- data/lib/hecks/facade/surface/chapter.rb +10 -54
- data/lib/hecks/facade/surface.rb +8 -23
- data/lib/hecks/facade.rb +10 -25
- data/lib/hecks/forms/app.rb +15 -70
- data/lib/hecks/forms/command_form_renderer.rb +10 -29
- data/lib/hecks/forms/field_renderer.rb +17 -156
- data/lib/hecks/forms/field_shape.rb +30 -222
- data/lib/hecks/forms/html.rb +12 -47
- data/lib/hecks/forms/index_renderer.rb +1 -4
- data/lib/hecks/forms/page.rb +3 -9
- data/lib/hecks/forms/params.rb +14 -60
- data/lib/hecks/forms/port_argument.rb +2 -19
- data/lib/hecks/forms/query_form_renderer.rb +4 -79
- data/lib/hecks/forms/record_renderer.rb +8 -75
- data/lib/hecks/forms/record_table.rb +7 -50
- data/lib/hecks/forms/reference_options.rb +3 -30
- data/lib/hecks/forms/value_object_shape.rb +8 -35
- data/lib/hecks/forms.rb +5 -33
- data/lib/hecks/fqn.rb +5 -12
- data/lib/hecks/framework/bluebook/compliance.bluebook +16 -65
- data/lib/hecks/framework/bluebook/console_settings.bluebook +47 -134
- data/lib/hecks/framework/bluebook/framework.hecksagon +5 -14
- data/lib/hecks/framework/bluebook/governance.bluebook +13 -34
- data/lib/hecks/framework/bluebook/identity.bluebook +11 -26
- data/lib/hecks/framework/bluebook/privacy.bluebook +8 -33
- data/lib/hecks/framework.rb +11 -80
- data/lib/hecks/freezer.rb +5 -39
- data/lib/hecks/grammar/expression.bluebook +15 -40
- data/lib/hecks/grammar/translation.bluebook +3 -6
- data/lib/hecks/grammar.rb +16 -41
- data/lib/hecks/ir.rb +14 -83
- data/lib/hecks/language/adapter.bluebook +2 -7
- data/lib/hecks/language/bluebook/aggregate.bluebook +56 -221
- data/lib/hecks/language/bluebook/attaches/paging.bluebook +6 -15
- data/lib/hecks/language/bluebook/bluebook.bluebook +15 -83
- data/lib/hecks/language/bluebook/bluebook.hecksagon +3 -15
- data/lib/hecks/language/bluebook/command.bluebook +27 -144
- data/lib/hecks/language/bluebook/entity.bluebook +24 -97
- data/lib/hecks/language/bluebook/policy.bluebook +16 -67
- data/lib/hecks/language/bluebook/process_manager.bluebook +28 -151
- data/lib/hecks/language/bluebook/projection.bluebook +126 -60
- data/lib/hecks/language/bluebook/query.bluebook +12 -43
- data/lib/hecks/language/bluebook/shape.bluebook +23 -73
- data/lib/hecks/language/bluebook/syntax.bluebook +51 -262
- data/lib/hecks/language/bluebook/vocabulary.bluebook +98 -197
- data/lib/hecks/language/hecksagon/adapter_binding.bluebook +3 -10
- data/lib/hecks/language/hecksagon/domain_port.bluebook +4 -19
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +6 -25
- data/lib/hecks/language/hecksagon/port_operation.bluebook +3 -14
- data/lib/hecks/language/oidc.json +35 -0
- data/lib/hecks/language/port.bluebook +4 -17
- data/lib/hecks/language/translation/translation.bluebook +3 -9
- data/lib/hecks/language/translation/translation_aggregate.bluebook +5 -24
- data/lib/hecks/language/world/wiring.bluebook +1 -3
- data/lib/hecks/language/world/world.bluebook +5 -7
- data/lib/hecks/literal.rb +8 -50
- data/lib/hecks/mcp_door_scope.rb +95 -0
- data/lib/hecks/mcp_stdio_guard.rb +4 -41
- data/lib/hecks/naming.rb +29 -137
- data/lib/hecks/ports/access_control.rb +7 -23
- data/lib/hecks/ports/agent/answers.rb +5 -23
- data/lib/hecks/ports/agent.rb +47 -172
- data/lib/hecks/ports/authentication.rb +12 -39
- data/lib/hecks/ports/authorization.rb +16 -43
- data/lib/hecks/ports/clock.rb +5 -45
- data/lib/hecks/ports/extraction.rb +7 -12
- data/lib/hecks/ports/identity_assignment.rb +8 -29
- data/lib/hecks/ports/identity_generation.rb +6 -29
- data/lib/hecks/ports/identity_resolution.rb +2 -10
- data/lib/hecks/ports/key_vault.rb +9 -45
- data/lib/hecks/ports/persistence/append_only.rb +62 -65
- data/lib/hecks/ports/persistence/binding_policy.rb +4 -14
- data/lib/hecks/ports/persistence/codec_boundary.rb +20 -80
- data/lib/hecks/ports/persistence/null_saga_store.rb +4 -20
- data/lib/hecks/ports/persistence/plugin.rb +13 -42
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +38 -141
- data/lib/hecks/ports/persistence/plugins/era/era_guard/shape_diff.rb +15 -115
- data/lib/hecks/ports/persistence/plugins/era/era_guard.rb +16 -84
- data/lib/hecks/ports/persistence/plugins/era/era_tamper.rb +7 -26
- data/lib/hecks/ports/persistence/plugins/era/expected_era.rb +3 -22
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +55 -181
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/events.rb +77 -0
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +12 -122
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/field_cache.rb +28 -128
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/head_compiler.rb +73 -474
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/mint_transaction.rb +31 -124
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +45 -219
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/resumable_backfill.rb +13 -108
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/tail_merge.rb +18 -75
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/transform_installer.rb +9 -49
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +6 -123
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/coverage_check.rb +23 -55
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +14 -72
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/merge_coordinator.rb +7 -16
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +14 -115
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager.rb +13 -45
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +127 -554
- data/lib/hecks/ports/persistence/plugins/era/storage_shape.rb +13 -63
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +2 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb +3 -14
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +13 -58
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -17
- data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +9 -26
- data/lib/hecks/ports/persistence/plugins/era/translation/reattest.rb +9 -25
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +22 -122
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/differ.rb +34 -123
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/renderer.rb +5 -12
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold/writer.rb +3 -9
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +2 -14
- data/lib/hecks/ports/persistence/plugins/era.rb +4 -23
- data/lib/hecks/ports/persistence/postgres_dump/connection.rb +7 -23
- data/lib/hecks/ports/persistence/postgres_dump.rb +4 -35
- data/lib/hecks/ports/persistence/remote_runtime.rb +2 -24
- data/lib/hecks/ports/persistence/repository_factory.rb +8 -27
- data/lib/hecks/ports/persistence/state_codec.rb +23 -103
- data/lib/hecks/ports/persistence.rb +7 -14
- data/lib/hecks/ports/projection.rb +42 -84
- data/lib/hecks/ports/query/in_memory.rb +10 -58
- data/lib/hecks/ports/query/ordering.rb +11 -32
- data/lib/hecks/ports/query.rb +14 -37
- data/lib/hecks/ports.rb +2 -8
- data/lib/hecks/projections/bootstrap_table.rb +11 -43
- data/lib/hecks/projections/deploy/fargate/assembly.rb +2 -15
- data/lib/hecks/projections/deploy/fargate/cdn.rb +1 -48
- data/lib/hecks/projections/deploy/fargate/cdn_default.rb +2 -11
- data/lib/hecks/projections/deploy/fargate/check.rb +5 -14
- data/lib/hecks/projections/deploy/fargate/containers.rb +3 -78
- data/lib/hecks/projections/deploy/fargate/extras.rb +3 -44
- data/lib/hecks/projections/deploy/fargate/monitoring.rb +0 -44
- data/lib/hecks/projections/deploy/fargate/settings.rb +2 -54
- data/lib/hecks/projections/deploy/fargate/yaml.rb +13 -58
- data/lib/hecks/projections/deploy/fargate.rb +35 -202
- data/lib/hecks/projections/deploy/lambda.rb +151 -679
- data/lib/hecks/projections/deploy/preview/access_yaml.rb +1 -33
- data/lib/hecks/projections/deploy/preview/containers.rb +6 -111
- data/lib/hecks/projections/deploy/preview/routing_yaml.rb +4 -56
- data/lib/hecks/projections/deploy/preview/script.rb +2 -14
- data/lib/hecks/projections/deploy/preview/settings.rb +3 -33
- data/lib/hecks/projections/deploy/preview/task_yaml.rb +2 -38
- data/lib/hecks/projections/deploy/preview/template.rb +2 -58
- data/lib/hecks/projections/deploy/preview.rb +2 -67
- data/lib/hecks/projections/deploy/scripts/settings.rb +3 -25
- data/lib/hecks/projections/deploy/scripts.rb +4 -57
- data/lib/hecks/projections/deploy/shared.rb +47 -146
- data/lib/hecks/projections/deploy/smoke.rb +4 -61
- data/lib/hecks/projections/deploy/template_diff/comparer.rb +3 -25
- data/lib/hecks/projections/deploy/template_diff/loader.rb +2 -11
- data/lib/hecks/projections/deploy/template_diff.rb +5 -57
- data/lib/hecks/projections/diagrams.rb +20 -582
- data/lib/hecks/projections/glossary/html.rb +14 -130
- data/lib/hecks/projections/glossary/markdown.rb +8 -69
- data/lib/hecks/projections/glossary/mermaid.rb +9 -66
- data/lib/hecks/projections/glossary/sensitivity.rb +5 -34
- data/lib/hecks/projections/glossary/sentences.rb +14 -159
- data/lib/hecks/projections/glossary.rb +30 -222
- data/lib/hecks/projections/ir.rb +3 -10
- data/lib/hecks/projections/model/deviations.rb +15 -42
- data/lib/hecks/projections/model.rb +12 -51
- data/lib/hecks/projections/oidc.rb +12 -56
- data/lib/hecks/projections/parser_table.rb +9 -28
- data/lib/hecks/projections/reference.rb +9 -16
- data/lib/hecks/projections/rust_vocabulary.rb +12 -250
- data/lib/hecks/projections/shape.rb +3 -29
- data/lib/hecks/projections/statements.rb +7 -86
- data/lib/hecks/projections/vocabulary.rb +6 -22
- data/lib/hecks/projections.rb +2 -16
- data/lib/hecks/projector/cli_projector.rb +60 -375
- data/lib/hecks/projector/docs_projector.rb +10 -201
- data/lib/hecks/projector/exporter.rb +46 -138
- data/lib/hecks/projector/ir_projector.rb +2 -9
- data/lib/hecks/projector/narrate_projector.rb +15 -189
- data/lib/hecks/projector/target.rb +13 -76
- data/lib/hecks/projector.rb +30 -121
- data/lib/hecks/query_specification/common/comparators.rb +5 -26
- data/lib/hecks/query_specification/common/comparison.rb +35 -143
- data/lib/hecks/query_specification/common/dsl.rb +8 -24
- data/lib/hecks/query_specification/common/null_policy.rb +20 -70
- data/lib/hecks/query_specification/common/options.rb +2 -6
- data/lib/hecks/query_specification/common/where_clause.rb +2 -10
- data/lib/hecks/query_specification/field_path.rb +37 -77
- data/lib/hecks/query_specification/hop_path.rb +12 -76
- data/lib/hecks/release/gem_pin.rb +2 -26
- data/lib/hecks/release/runner/ci_publisher.rb +93 -0
- data/lib/hecks/release/runner/commands.rb +66 -0
- data/lib/hecks/release/runner/console.rb +52 -0
- data/lib/hecks/release/runner/gem_publisher.rb +43 -0
- data/lib/hecks/release/runner/git.rb +48 -0
- data/lib/hecks/release/runner/npm_publisher.rb +75 -0
- data/lib/hecks/release/runner/preflight.rb +104 -0
- data/lib/hecks/release/runner/published.rb +55 -0
- data/lib/hecks/release/runner/tagger.rb +80 -0
- data/lib/hecks/release/runner.rb +215 -0
- data/lib/hecks/rendering.rb +4 -26
- data/lib/hecks/router/namespace_installer.rb +12 -36
- data/lib/hecks/router.rb +4 -8
- data/lib/hecks/runtime/aggregate_lock.rb +8 -33
- data/lib/hecks/runtime/boot_gates.rb +3 -18
- data/lib/hecks/runtime/caller.rb +19 -59
- data/lib/hecks/runtime/capability_graph.rb +5 -21
- data/lib/hecks/runtime/command_interpreter/argument_gate.rb +16 -78
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +23 -160
- data/lib/hecks/runtime/command_interpreter.rb +125 -307
- data/lib/hecks/runtime/command_rules/admissibility.rb +95 -366
- data/lib/hecks/runtime/command_rules/arithmetic.rb +66 -196
- data/lib/hecks/runtime/command_rules/authorization.rb +13 -45
- data/lib/hecks/runtime/command_rules/emission.rb +8 -21
- data/lib/hecks/runtime/command_rules/references.rb +23 -202
- data/lib/hecks/runtime/dependency_planning.rb +30 -102
- data/lib/hecks/runtime/dispatcher.rb +82 -241
- data/lib/hecks/runtime/entity_element.rb +40 -462
- data/lib/hecks/runtime/entity_interpreter.rb +65 -220
- data/lib/hecks/runtime/errors.rb +32 -115
- data/lib/hecks/runtime/event.rb +3 -25
- data/lib/hecks/runtime/identity.rb +18 -154
- data/lib/hecks/runtime/instance.rb +18 -150
- data/lib/hecks/runtime/interpreting.rb +11 -70
- data/lib/hecks/runtime/invocation.rb +28 -164
- data/lib/hecks/runtime/loader.rb +48 -186
- data/lib/hecks/runtime/outbox.rb +38 -261
- data/lib/hecks/runtime/policy_interpreter.rb +38 -200
- data/lib/hecks/runtime/port_operation_interpreter.rb +26 -87
- data/lib/hecks/runtime/query_interpreter.rb +45 -187
- data/lib/hecks/runtime/reaction_invocation.rb +36 -138
- data/lib/hecks/runtime/read_model_interpreter.rb +139 -208
- data/lib/hecks/runtime/rebuild_sweep.rb +8 -54
- data/lib/hecks/runtime/reference_hop.rb +8 -81
- data/lib/hecks/runtime/refusal_wording.rb +8 -89
- data/lib/hecks/runtime/registry/saga_persistence.rb +10 -102
- data/lib/hecks/runtime/registry/verification.rb +52 -225
- data/lib/hecks/runtime/registry/world_defaults.rb +4 -53
- data/lib/hecks/runtime/registry.rb +103 -244
- data/lib/hecks/runtime/remote_dispatcher.rb +37 -152
- data/lib/hecks/runtime/routing.rb +4 -15
- data/lib/hecks/runtime/saga_interpreter/correlation.rb +14 -61
- data/lib/hecks/runtime/saga_interpreter.rb +79 -263
- data/lib/hecks/runtime/saga_pending_dispatch.rb +2 -43
- data/lib/hecks/runtime/tenant_check.rb +6 -68
- data/lib/hecks/runtime/tenant_scope.rb +3 -28
- data/lib/hecks/runtime/value/admission.rb +16 -67
- data/lib/hecks/runtime/value/coercion.rb +155 -641
- data/lib/hecks/runtime/value/entity_list_coercion.rb +26 -219
- data/lib/hecks/runtime/value.rb +12 -84
- data/lib/hecks/runtime.rb +17 -65
- data/lib/hecks/storehouse.rb +146 -567
- data/lib/hecks/tenancy/bluebook/tenancy.bluebook +8 -32
- data/lib/hecks/tenancy/bluebook/tenancy.hecksagon +6 -23
- data/lib/hecks/vendoring/git_environment.rb +2 -8
- data/lib/hecks/vendoring/git_source.rb +4 -10
- data/lib/hecks/vendoring.rb +7 -46
- data/lib/hecks/version.rb +3 -14
- data/lib/hecks/vocabulary.rb +5 -0
- data/lib/hecks.rb +32 -82
- data/lib/rubocop/cop/hecks/fallback_hash_lookup.rb +8 -46
- data/lib/rubocop/cop/hecks/sequential_hash_rename_in_loop.rb +11 -80
- data/lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb +10 -99
- metadata +30 -59
- data/lib/hecks/bench/cli.rb +0 -74
- data/lib/hecks/bench/environment.rb +0 -100
- data/lib/hecks/bench/postgres_probe.rb +0 -41
- data/lib/hecks/bench/report.rb +0 -116
- data/lib/hecks/bench/ruby_runner.rb +0 -151
- data/lib/hecks/bench/run.rb +0 -55
- data/lib/hecks/bench/rust_runner.rb +0 -165
- data/lib/hecks/bench/stats.rb +0 -75
- data/lib/hecks/bench/suite.rb +0 -172
- data/lib/hecks/bench/workload.rb +0 -137
- data/lib/hecks/bench.rb +0 -28
- data/lib/hecks/codemod.rb +0 -443
- data/lib/hecks/corpus.rb +0 -479
- data/lib/hecks/doc/reference.rb +0 -585
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +0 -684
- data/lib/hecks/fuzzing/combination_miner.rb +0 -178
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +0 -469
- data/lib/hecks/fuzzing/coverage_campaign.rb +0 -161
- data/lib/hecks/fuzzing/differential.rb +0 -192
- data/lib/hecks/fuzzing/domain_generator.rb +0 -871
- data/lib/hecks/fuzzing/era_boundary.rb +0 -154
- data/lib/hecks/fuzzing/form_census.rb +0 -285
- data/lib/hecks/fuzzing/generated_domain_check.rb +0 -171
- data/lib/hecks/fuzzing/invalid_value_generator.rb +0 -125
- data/lib/hecks/fuzzing/isolated_boot.rb +0 -658
- data/lib/hecks/fuzzing/nondeterministic.rb +0 -79
- data/lib/hecks/fuzzing/persistence_parity.rb +0 -253
- data/lib/hecks/fuzzing/properties/corrections.rb +0 -125
- data/lib/hecks/fuzzing/properties/dispatch_and_mutations.rb +0 -688
- data/lib/hecks/fuzzing/properties/guards.rb +0 -398
- data/lib/hecks/fuzzing/properties/invariants_and_aggregation.rb +0 -399
- data/lib/hecks/fuzzing/properties/lifecycle_and_replay.rb +0 -137
- data/lib/hecks/fuzzing/properties/outbox.rb +0 -180
- data/lib/hecks/fuzzing/properties/querying.rb +0 -260
- data/lib/hecks/fuzzing/properties.rb +0 -267
- data/lib/hecks/fuzzing/qa_settings.rb +0 -164
- data/lib/hecks/fuzzing/replay.rb +0 -930
- data/lib/hecks/fuzzing/rotation_priority.rb +0 -114
- data/lib/hecks/fuzzing/rust_gap_manifest.rb +0 -139
- data/lib/hecks/fuzzing/self_consistency.rb +0 -825
- data/lib/hecks/fuzzing/sequence_generator/adversary.rb +0 -532
- data/lib/hecks/fuzzing/sequence_generator/catalog.rb +0 -171
- data/lib/hecks/fuzzing/sequence_generator/outcome_tracker.rb +0 -127
- data/lib/hecks/fuzzing/sequence_generator/picker.rb +0 -116
- data/lib/hecks/fuzzing/sequence_generator/query_binding.rb +0 -138
- data/lib/hecks/fuzzing/sequence_generator/step_builder.rb +0 -344
- data/lib/hecks/fuzzing/sequence_generator.rb +0 -311
- data/lib/hecks/fuzzing/shrinker.rb +0 -309
- data/lib/hecks/fuzzing/structural_skips.rb +0 -53
- data/lib/hecks/fuzzing/sweep_depth.rb +0 -61
- data/lib/hecks/fuzzing/target_capabilities.rb +0 -255
- data/lib/hecks/fuzzing/value_generator.rb +0 -340
- data/lib/hecks/fuzzing.rb +0 -23
- data/lib/hecks/grammar/evolve.rb +0 -524
- data/lib/hecks/query_ir.rb +0 -482
|
@@ -5,48 +5,25 @@ module Hecks
|
|
|
5
5
|
module Bluebook
|
|
6
6
|
Invariant = Struct.new(:description, :canonical, :predicate, :ast, keyword_init: true)
|
|
7
7
|
|
|
8
|
-
# A value object
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
# calls `.new` on one — coercion builds `Runtime::Value` wrappers, and
|
|
13
|
-
# invariants run as canonical text through the Evaluator. The runtime
|
|
14
|
-
# reaches a shape through `aggregate.value_object(name)`, the IR's own
|
|
15
|
-
# finder ; there is no constant nesting and no second index.
|
|
16
|
-
#
|
|
17
|
-
# `to_h` does not move. It is a byte-for-byte contract pinned by the
|
|
18
|
-
# golden fixtures, so it keeps spelling the short declared name, which
|
|
19
|
-
# is what `hecks_name` carries. Declarations in the graph, strings in the
|
|
20
|
-
# export.
|
|
8
|
+
# A value object: a declaration holder, never instantiated.
|
|
9
|
+
# `ValueObjectBuilder` returns a subclass carrying attributes, invariants and members;
|
|
10
|
+
# reach one through `aggregate.value_object(name)`.
|
|
11
|
+
# `to_h` spells the short declared name (`hecks_name`), a contract pinned by golden fixtures.
|
|
21
12
|
class ValueObject
|
|
22
13
|
extend Construct
|
|
23
|
-
# Extended, not included
|
|
24
|
-
# emission is a class method. See Hecks::IR's own note on
|
|
25
|
-
# the two shapes.
|
|
14
|
+
# Extended, not included: this construct is a class, so emission is a class method.
|
|
26
15
|
extend Hecks::IR
|
|
27
16
|
extend Behaviour::ValueObject
|
|
28
17
|
|
|
29
18
|
emits_ir(
|
|
30
19
|
name: :hecks_name,
|
|
31
20
|
attributes: many(:attributes),
|
|
32
|
-
# `ast
|
|
33
|
-
#
|
|
34
|
-
# replacing it (`canonical` stays the human-facing/doctest-facing
|
|
35
|
-
# form; parsing it back would just re-derive what `ast` already
|
|
36
|
-
# states directly). Ground truth and the full reasoning:
|
|
37
|
-
# `Expression::AstJson`'s own header — built for `rust/host`'s
|
|
38
|
-
# own mint-time invariant check (`reference_validate.rs`), which
|
|
39
|
-
# has no kernel crate to parse `canonical` with.
|
|
21
|
+
# `ast` sits beside `canonical` because rust/host's mint-time invariant check
|
|
22
|
+
# has no kernel crate to parse `canonical` with (see `Expression::AstJson`).
|
|
40
23
|
invariants: -> { invariants.map { |rule| Expression::AstJson.rule_row(rule) } },
|
|
41
24
|
closed_set: :closed_set?,
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
# (`StatementFrequency#retention_months`, statements.bluebook), not
|
|
45
|
-
# only `String` — and stringifying it on the way out would erase
|
|
46
|
-
# that: `84` and `"84"` (a member some other row might legitimately
|
|
47
|
-
# spell as text) would become indistinguishable once they reached
|
|
48
|
-
# `to_h`. The declared name still moves (`field.to_s`) — that half
|
|
49
|
-
# was never a Ruby object with a type to lose.
|
|
25
|
+
# Only the field name is stringified: a member value can be an Integer, and
|
|
26
|
+
# stringifying it would make `84` and `"84"` indistinguishable in `to_h`.
|
|
50
27
|
members: -> { members.map { |member| member.map { |field, value| [field.to_s, value] } } }
|
|
51
28
|
)
|
|
52
29
|
|
|
@@ -57,10 +34,8 @@ module Hecks
|
|
|
57
34
|
# the bluebook declares and the thing Ruby holds are one object.
|
|
58
35
|
#
|
|
59
36
|
# @param name [String, Symbol] the value object's declared type name
|
|
60
|
-
# @param attributes [Array<Bluebook::Attribute>] the value object's declared
|
|
61
|
-
#
|
|
62
|
-
# @param invariants [Array<Bluebook::Invariant>] the rules checked against every
|
|
63
|
-
# instance of this value object
|
|
37
|
+
# @param attributes [Array<Bluebook::Attribute>] the value object's declared fields
|
|
38
|
+
# @param invariants [Array<Bluebook::Invariant>] the rules checked against every instance
|
|
64
39
|
# @param members [Array<Hash{Symbol => Object}>] the declared `one_of` members, one
|
|
65
40
|
# row of field values per member
|
|
66
41
|
# @param closed_set [Boolean] whether a `one_of` was declared, even with no
|
data/lib/hecks/bluebook.rb
CHANGED
|
@@ -1,36 +1,19 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
# Everything a .bluebook file becomes on its way to running: the expression
|
|
4
|
-
# language (expression/), the model itself (the chapter class plus
|
|
5
|
-
# everything it declares), the assembly that turns
|
|
6
|
-
# declarations back into that graph (assembly.rb + assembly/), the authoring
|
|
7
|
-
# DSL (dsl/), and the meta-validator that judges a chapter against the
|
|
8
|
-
# language's own grammar (meta_validator.rb + meta_validator/).
|
|
9
|
-
#
|
|
10
|
-
# The require order below matters: expression and IR load first (pure
|
|
11
|
-
# declarations), assembly's collaborators load before its face, and the DSL
|
|
12
|
-
# loads before the meta-validator that its builders call at build time.
|
|
1
|
+
# Everything a .bluebook file becomes on its way to running: expression language, model,
|
|
2
|
+
# assembly, authoring DSL and meta-validator.
|
|
13
3
|
|
|
14
4
|
module Hecks
|
|
15
|
-
#
|
|
16
|
-
# chapter (bluebook/chapter.rb carries its body). Everything a chapter
|
|
17
|
-
# declares nests under it, as do the ways to build one (`DSL`) and to
|
|
18
|
-
# judge one (`MetaValidator`). Reopening this anywhere must say `class`.
|
|
5
|
+
# `Hecks::Bluebook` is a class defined in bluebook/chapter.rb; reopen it with `class`.
|
|
19
6
|
module Bluebook
|
|
20
7
|
end
|
|
21
8
|
end
|
|
22
9
|
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
# because those files' contents are frozen and cannot say so themselves.
|
|
10
|
+
# Required here because the chapter's frozen files lean on these at class-body level.
|
|
11
|
+
# Load order: expression and IR first, assembly's collaborators before its face, DSL last.
|
|
26
12
|
require_relative "construct"
|
|
27
13
|
require_relative "literal"
|
|
28
14
|
require_relative "query_specification"
|
|
29
15
|
|
|
30
16
|
require_relative "bluebook/expression"
|
|
31
|
-
# **The model itself** — the chapter class's own body first, then everything
|
|
32
|
-
# a chapter declares. Order matters only for reading: each is a bag of
|
|
33
|
-
# declarations with no load-time cross-references.
|
|
34
17
|
require_relative "bluebook/chapter"
|
|
35
18
|
require_relative "bluebook/reference"
|
|
36
19
|
require_relative "bluebook/attribute"
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
require "etc"
|
|
2
|
+
require "fileutils"
|
|
3
|
+
require "tmpdir"
|
|
4
|
+
|
|
5
|
+
module Hecks
|
|
6
|
+
# The one place the runtime's own scratch files live, outside the gem: an
|
|
7
|
+
# installed gem is read-only, and a checkout's `tmp/` isn't this library's to assume.
|
|
8
|
+
#
|
|
9
|
+
# A candidate root is used only if it is private to the current user, since the
|
|
10
|
+
# syntax-boot cache it holds is read back with `Marshal.load`.
|
|
11
|
+
module CacheDir
|
|
12
|
+
module_function
|
|
13
|
+
|
|
14
|
+
# The directory a named piece of scratch state lives in.
|
|
15
|
+
#
|
|
16
|
+
# @param name [String] the subdirectory, such as `"storehouse"`
|
|
17
|
+
# @return [String] the absolute path of `name` under the cache root; the
|
|
18
|
+
# directory itself is created by whoever writes to it
|
|
19
|
+
def path(name)
|
|
20
|
+
File.join(root, name)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# The cache root, resolved once per process.
|
|
24
|
+
#
|
|
25
|
+
# @return [String] the absolute path of the directory every `path` lives under
|
|
26
|
+
def root
|
|
27
|
+
@root ||= resolve
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Forgets the resolved root so the next call resolves again.
|
|
31
|
+
#
|
|
32
|
+
# @return [void]
|
|
33
|
+
def reset!
|
|
34
|
+
@root = nil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Picks the cache root from the environment.
|
|
38
|
+
#
|
|
39
|
+
# @param env [Hash{String => String}] the environment to read
|
|
40
|
+
# `XDG_CACHE_HOME` and `HOME` from
|
|
41
|
+
# @param tmpdir [String] the system temp directory
|
|
42
|
+
# @param uid [Integer] the current user id, used in the temp fallback's name
|
|
43
|
+
# @return [String] the absolute path of the first candidate that is a
|
|
44
|
+
# private directory owned by this user, else a per-process directory
|
|
45
|
+
def resolve(env: ENV, tmpdir: Dir.tmpdir, uid: Process.uid)
|
|
46
|
+
candidates(env, tmpdir, uid).each do |candidate|
|
|
47
|
+
return candidate if private_dir?(candidate)
|
|
48
|
+
end
|
|
49
|
+
Dir.mktmpdir("hecks-", tmpdir)
|
|
50
|
+
rescue StandardError
|
|
51
|
+
File.join(tmpdir, "hecks-#{uid}")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# The roots to try, most preferred first.
|
|
55
|
+
#
|
|
56
|
+
# @param env [Hash{String => String}] the environment
|
|
57
|
+
# @param tmpdir [String] the system temp directory
|
|
58
|
+
# @param uid [Integer] the current user id
|
|
59
|
+
# @return [Array<String>] absolute candidate paths
|
|
60
|
+
def candidates(env, tmpdir, uid)
|
|
61
|
+
xdg = env["XDG_CACHE_HOME"].to_s
|
|
62
|
+
home = env["HOME"].to_s
|
|
63
|
+
list = []
|
|
64
|
+
list << File.join(xdg, "hecks") if File.absolute_path?(xdg)
|
|
65
|
+
list << File.join(home, ".cache", "hecks") if File.absolute_path?(home)
|
|
66
|
+
list << File.join(tmpdir, "hecks-#{uid}")
|
|
67
|
+
end
|
|
68
|
+
private_class_method :candidates
|
|
69
|
+
|
|
70
|
+
# Creates `dir` if needed and says whether it is private to this user.
|
|
71
|
+
#
|
|
72
|
+
# @param dir [String] the candidate directory
|
|
73
|
+
# @return [Boolean] true when `dir` is a directory owned by this user that
|
|
74
|
+
# no other user can write to; false on any failure
|
|
75
|
+
def private_dir?(dir)
|
|
76
|
+
FileUtils.mkdir_p(dir, mode: 0o700)
|
|
77
|
+
stat = File.stat(dir)
|
|
78
|
+
stat.directory? && stat.owned? && stat.mode.nobits?(0o022) && File.writable?(dir)
|
|
79
|
+
rescue StandardError
|
|
80
|
+
false
|
|
81
|
+
end
|
|
82
|
+
private_class_method :private_dir?
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
require_relative "../../hecks"
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module CLI
|
|
5
|
+
# The command behind `bin/docs`, `bin/narrate`, `hecks docs` and `hecks narrate`:
|
|
6
|
+
# one domain's document, projected from its own bluebook, to stdout.
|
|
7
|
+
#
|
|
8
|
+
# Nothing is written for the caller: redirect it, so git decides whether it drifted.
|
|
9
|
+
module Document
|
|
10
|
+
# Build output and other trees under a root that hold no domain a caller means.
|
|
11
|
+
# Matched against the path relative to the root, because a substring test
|
|
12
|
+
# against an absolute path tests wherever somebody happened to clone.
|
|
13
|
+
IGNORED = %r{\A(rust|deploy|tmp|coverage)/}
|
|
14
|
+
|
|
15
|
+
module_function
|
|
16
|
+
|
|
17
|
+
# Prints `projection` for the domain and optional aggregate `argv` names.
|
|
18
|
+
#
|
|
19
|
+
# @param argv [Array<String>] an optional domain directory, then an optional
|
|
20
|
+
# aggregate name
|
|
21
|
+
# @param projection [Symbol] `:docs` or `:narrate`
|
|
22
|
+
# @param program [String] the name the usage message calls this command by
|
|
23
|
+
# @param root [String] the directory whose domains are listed when no domain
|
|
24
|
+
# is found
|
|
25
|
+
# @return [void]
|
|
26
|
+
# @raise [SystemExit] when no domain is found, it cannot boot, it loads no
|
|
27
|
+
# bluebook, or the aggregate does not exist
|
|
28
|
+
def call(argv, projection:, program:, root:)
|
|
29
|
+
here = Adapters::Folder.new.domain_root
|
|
30
|
+
path, aggregate = target(argv, here)
|
|
31
|
+
refuse_without_domain(program, root) unless path
|
|
32
|
+
|
|
33
|
+
begin
|
|
34
|
+
runtime = Hecks.boot(path, install_facade: false)
|
|
35
|
+
rescue StandardError => e
|
|
36
|
+
abort "cannot read #{path}: #{e.message.lines.first.strip}"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# The domain's own chapter, not a framework member it attached: insertion
|
|
40
|
+
# order, the same distinction `Runtime::Loader.dispatcher_for` draws.
|
|
41
|
+
bluebook = runtime.registry.bluebooks.values.first
|
|
42
|
+
abort "#{path} loaded no bluebook" unless bluebook
|
|
43
|
+
|
|
44
|
+
begin
|
|
45
|
+
puts Projector.call(projection, bluebook: bluebook, options: aggregate ? { aggregate: aggregate } : {})
|
|
46
|
+
rescue Runtime::NotFound => e
|
|
47
|
+
abort e.message
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Lists every directory under `root` that `Hecks.boot` would accept.
|
|
52
|
+
#
|
|
53
|
+
# Found by their wiring, not their chapters: a `.hecksagon` says this is a
|
|
54
|
+
# domain, while most `.bluebook` files (era translations, grammar, fixtures) are not.
|
|
55
|
+
#
|
|
56
|
+
# @param root [String] the directory to search under
|
|
57
|
+
# @return [Array<String>] domain directory paths relative to `root`,
|
|
58
|
+
# deduplicated and sorted
|
|
59
|
+
def domains(root)
|
|
60
|
+
Dir.glob(File.join(root, "**/*.hecksagon"))
|
|
61
|
+
.map { |path| File.basename(File.dirname(path)) == "bluebook" ? File.dirname(path, 2) : File.dirname(path) }
|
|
62
|
+
.map { |path| path.delete_prefix("#{root}/") }
|
|
63
|
+
.grep_v(IGNORED)
|
|
64
|
+
.uniq.sort
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# @api private
|
|
68
|
+
def target(argv, here)
|
|
69
|
+
if argv.empty? then [here, nil]
|
|
70
|
+
elsif argv.length > 1 then [argv[0], argv[1]]
|
|
71
|
+
elsif File.directory?(argv[0]) then [argv[0], nil]
|
|
72
|
+
else [here, argv[0]]
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# @api private
|
|
77
|
+
def refuse_without_domain(program, root)
|
|
78
|
+
warn "usage: #{program} [domain-path] [aggregate]"
|
|
79
|
+
warn ""
|
|
80
|
+
warn "No bluebook here — #{Dir.pwd} is not inside a domain. Name one:"
|
|
81
|
+
domains(root).each { |candidate| warn " #{candidate}" }
|
|
82
|
+
exit 1
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
data/lib/hecks/cli/ir.rb
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require_relative "../../hecks"
|
|
2
|
+
# ADR 0033 — a domain wired to PostgresEra needs this plugin loaded
|
|
3
|
+
# explicitly; the era/lineage subsystem does not load with core.
|
|
4
|
+
require_relative "../ports/persistence/plugins/era"
|
|
5
|
+
|
|
6
|
+
module Hecks
|
|
7
|
+
module CLI
|
|
8
|
+
# The command behind `bin/ir` and `hecks ir`: a booted domain's IR as JSON, the
|
|
9
|
+
# same `to_h` the golden specs pin and `StorageShape` hashes into an era.
|
|
10
|
+
module Ir
|
|
11
|
+
module_function
|
|
12
|
+
|
|
13
|
+
# Prints the IR `argv` asks for.
|
|
14
|
+
#
|
|
15
|
+
# `--meta` prints the language's own IR, reached through
|
|
16
|
+
# `Bluebook::MetaValidator.grammar_registry`, the real boot sequence, so it
|
|
17
|
+
# can't drift from what `MetaValidator` loads.
|
|
18
|
+
#
|
|
19
|
+
# @param argv [Array<String>] a domain path and `--translations`, or `--meta`
|
|
20
|
+
# @param program [String] the name the usage message calls this command by
|
|
21
|
+
# @param default_domain [String, nil] the domain booted when `argv` names none;
|
|
22
|
+
# nil makes a domain argument required
|
|
23
|
+
# @return [void]
|
|
24
|
+
# @raise [SystemExit] when no domain is named and there is no default
|
|
25
|
+
def call(argv, program:, default_domain: nil)
|
|
26
|
+
argv = argv.dup
|
|
27
|
+
if argv.delete("--meta")
|
|
28
|
+
require_relative "../bluebook/meta_validator"
|
|
29
|
+
puts Projector::Exporter.json(Bluebook::MetaValidator.grammar_registry)
|
|
30
|
+
return
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
translations_only = argv.delete("--translations")
|
|
34
|
+
domain = argv.shift || default_domain or abort "usage: #{program} <domain> [--translations] | #{program} --meta"
|
|
35
|
+
runtime = Hecks.boot(domain)
|
|
36
|
+
|
|
37
|
+
if translations_only
|
|
38
|
+
puts Projector::Exporter.translations_json(runtime.registry)
|
|
39
|
+
else
|
|
40
|
+
puts Projector::Exporter.json(runtime.registry)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require_relative "../mcp_stdio_guard"
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module CLI
|
|
5
|
+
# The command behind `bin/hecks_mcp_door` and `hecks mcp`: the MCP door onto the
|
|
6
|
+
# storehouse bus, over stdio only.
|
|
7
|
+
#
|
|
8
|
+
# This file loads nothing but `McpStdioGuard`, so the transport check runs
|
|
9
|
+
# before the framework does.
|
|
10
|
+
module Mcp
|
|
11
|
+
# The server name the guard's refusals and warnings carry.
|
|
12
|
+
SERVER = "hecks-mcp-door".freeze
|
|
13
|
+
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
# Refuses any transport but stdio, then serves JSON-RPC requests from stdin
|
|
17
|
+
# until it closes.
|
|
18
|
+
#
|
|
19
|
+
# @param argv [Array<String>] the arguments after the command; only `--stdio`
|
|
20
|
+
# is accepted
|
|
21
|
+
# @return [void]
|
|
22
|
+
# @raise [SystemExit] with `McpStdioGuard::EXIT_STATUS` when the process is not
|
|
23
|
+
# set up for stdio
|
|
24
|
+
def call(argv)
|
|
25
|
+
McpStdioGuard.enforce_stdio!(server: SERVER, argv: argv)
|
|
26
|
+
require_relative "mcp_door"
|
|
27
|
+
McpDoor.serve
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|