hecks 3.9.1 → 3.11.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/examples/pizzas/bluebook/pizzas.bluebook +29 -0
- data/examples/pizzas/bluebook/pizzas.hecksagon +7 -0
- data/exe/hecks +4 -4
- data/lib/hecks/adapters/driven/d1.rb +2 -10
- data/lib/hecks/adapters/driven/heki.adapter +1 -1
- data/lib/hecks/adapters/driven/heki.rb +2 -12
- data/lib/hecks/adapters/driven/lambda.adapter +1 -1
- data/lib/hecks/adapters/driven/lambda.rb +3 -18
- data/lib/hecks/adapters/driven/postgres.rb +4 -11
- data/lib/hecks/adapters/driven/sqlite.adapter +1 -1
- data/lib/hecks/adapters/driven/sqlite.rb +2 -10
- data/lib/hecks/adapters/driving/admission.rb +46 -0
- data/lib/hecks/adapters/driving/cli/nesting.rb +36 -0
- data/lib/hecks/adapters/driving/cli/shorthand.rb +88 -0
- data/lib/hecks/adapters/driving/cli.rb +127 -0
- data/lib/hecks/adapters/driving/cli_runner/answers.rb +160 -0
- data/lib/hecks/adapters/driving/cli_runner/resolution.rb +155 -0
- data/lib/hecks/adapters/driving/cli_runner/settling.rb +120 -0
- data/lib/hecks/adapters/driving/cli_runner/streaming.rb +93 -0
- data/lib/hecks/adapters/driving/cli_runner/suggestions.rb +47 -0
- data/lib/hecks/adapters/driving/cli_runner.rb +69 -0
- data/lib/hecks/adapters/driving/command_request.rb +121 -0
- data/lib/hecks/adapters/driving/handle.rb +214 -0
- data/lib/hecks/adapters/driving/json.rb +136 -0
- data/lib/hecks/adapters/driving/launcher_options.rb +267 -0
- data/lib/hecks/adapters/driving/mcp/properties.rb +49 -0
- data/lib/hecks/adapters/driving/mcp/tool_calls.rb +116 -0
- data/lib/hecks/adapters/driving/mcp/tool_definitions/auditing.rb +53 -0
- data/lib/hecks/adapters/driving/mcp/tool_definitions/calling.rb +71 -0
- data/lib/hecks/adapters/driving/mcp/tool_definitions/reading.rb +99 -0
- data/lib/hecks/adapters/driving/mcp/tool_definitions.rb +18 -0
- data/lib/hecks/adapters/driving/mcp.rb +159 -0
- data/lib/hecks/adapters/driving/mcp_guide_cache.rb +78 -0
- data/lib/hecks/adapters/driving/mcp_scope/argument_policy.rb +97 -0
- data/lib/hecks/adapters/driving/mcp_scope/env_problems.rb +69 -0
- data/lib/hecks/adapters/driving/mcp_scope/presenter.rb +83 -0
- data/lib/hecks/adapters/driving/mcp_scope.rb +213 -0
- data/lib/hecks/adapters/driving/ruby/aggregate_module.rb +171 -0
- data/lib/hecks/adapters/driving/ruby/chapter.rb +91 -0
- data/lib/hecks/adapters/driving/ruby.rb +83 -0
- data/lib/hecks/adapters/driving/usage_cache.rb +144 -0
- data/lib/hecks/{doors.rb → adapters/driving.rb} +10 -6
- data/lib/hecks/behaviors/expectations/boot.rb +1 -1
- data/lib/hecks/bench/ruby_runner.rb +1 -1
- data/lib/hecks/bluebook/ask_resolution.rb +130 -0
- data/lib/hecks/bluebook/assembly/aggregate_assembly.rb +8 -2
- data/lib/hecks/bluebook/assembly/contracts/rules.rb +4 -2
- data/lib/hecks/bluebook/assembly/contracts/structure.rb +3 -1
- data/lib/hecks/bluebook/assembly/marks.rb +1 -0
- data/lib/hecks/bluebook/attribute.rb +1 -1
- data/lib/hecks/bluebook/behaviour/command.rb +13 -8
- data/lib/hecks/bluebook/behaviour/policy.rb +30 -0
- data/lib/hecks/bluebook/capabilities/attribute_values.rb +72 -0
- data/lib/hecks/bluebook/capabilities.rb +91 -9
- data/lib/hecks/bluebook/domain_port.rb +16 -4
- data/lib/hecks/bluebook/dsl/adapter_builder.rb +18 -6
- data/lib/hecks/bluebook/dsl/binding_proxy.rb +13 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/computed_sources.rb +98 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/fan_out_rows.rb +42 -0
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/projected_fields.rb +14 -2
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/provisions.rb +69 -3
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation/with_projections.rb +17 -10
- data/lib/hecks/bluebook/dsl/bluebook_builder/validation.rb +5 -0
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +2 -0
- data/lib/hecks/bluebook/dsl/command_builder/mutations.rb +8 -1
- data/lib/hecks/bluebook/dsl/command_builder/operands.rb +121 -0
- data/lib/hecks/bluebook/dsl/command_builder.rb +2 -0
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +10 -1
- data/lib/hecks/bluebook/dsl/lifecycle_builder.rb +45 -2
- data/lib/hecks/bluebook/dsl/policy_builder.rb +47 -10
- data/lib/hecks/bluebook/dsl/rule_reference.rb +7 -4
- data/lib/hecks/bluebook/dsl/world_builder.rb +1 -1
- data/lib/hecks/bluebook/expression/ast_json/emitters.rb +6 -0
- data/lib/hecks/bluebook/expression/ast_json.rb +9 -6
- data/lib/hecks/bluebook/expression/ast_reader.rb +14 -9
- data/lib/hecks/bluebook/expression/projection.json +36 -0
- data/lib/hecks/bluebook/expression/resolver/operations.rb +31 -0
- data/lib/hecks/bluebook/expression/resolver/parsing.rb +38 -5
- data/lib/hecks/bluebook/expression/resolver/scanning.rb +22 -5
- data/lib/hecks/bluebook/expression/resolver/values.rb +10 -0
- data/lib/hecks/bluebook/expression/resolver.rb +20 -1
- data/lib/hecks/bluebook/hecksagon.rb +23 -3
- data/lib/hecks/bluebook/lifecycle.rb +22 -3
- data/lib/hecks/bluebook/meta_validator/adapter_judge.rb +13 -1
- data/lib/hecks/bluebook/meta_validator/modes.rb +4 -1
- data/lib/hecks/bluebook/meta_validator/readings.rb +18 -1
- data/lib/hecks/bluebook/meta_validator/reconstruction/heads.rb +2 -1
- data/lib/hecks/bluebook/meta_validator/shapes.rb +5 -0
- data/lib/hecks/bluebook/meta_validator/verdict_cache.rb +1 -1
- data/lib/hecks/bluebook/meta_validator.rb +12 -12
- data/lib/hecks/bluebook/model_check/ask_checks.rb +71 -0
- data/lib/hecks/bluebook/model_check/policy_checks.rb +2 -1
- data/lib/hecks/bluebook/model_check/reference_checks.rb +70 -0
- data/lib/hecks/bluebook/model_check.rb +8 -2
- data/lib/hecks/bluebook/policy.rb +4 -2
- data/lib/hecks/bluebook/smoke_test.rb +1 -1
- data/lib/hecks/bluebook/synthesizer.rb +2 -0
- data/lib/hecks/bluebook.rb +1 -0
- data/lib/hecks/cli/command_table.rb +1 -1
- data/lib/hecks/cli/console.rb +2 -1
- data/lib/hecks/cli/document.rb +1 -1
- data/lib/hecks/cli/launcher_words.rb +4 -4
- data/lib/hecks/cli/mcp.rb +4 -4
- data/lib/hecks/cli/project_cli/launcher_source.rb +2 -2
- data/lib/hecks/cli/project_cli/templates.rb +5 -5
- data/lib/hecks/cli/project_cli.rb +9 -6
- data/lib/hecks/cli/run.rb +2 -2
- data/lib/hecks/cli/smoke_http/checks.rb +4 -1
- data/lib/hecks/cli/smoke_http/transport.rb +3 -3
- data/lib/hecks/cli/smoke_http.rb +3 -0
- data/lib/hecks/codemod.rb +5 -2
- data/lib/hecks/corpus/routes.rb +7 -0
- data/lib/hecks/corpus/rust.rb +3 -2
- data/lib/hecks/deploy/bluebook/deploy.bluebook +124 -2
- data/lib/hecks/deploy/bluebook/deploy.hecksagon +8 -0
- data/lib/hecks/deploy/oidc.json +16 -3
- data/lib/hecks/doc/reference/rendering.rb +6 -3
- data/lib/hecks/forms/app/commands.rb +8 -7
- data/lib/hecks/forms/app/queries.rb +2 -1
- data/lib/hecks/forms/app.rb +1 -1
- data/lib/hecks/forms/record_renderer.rb +1 -1
- data/lib/hecks/framework/bluebook/privacy.bluebook +11 -0
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +4 -1
- data/lib/hecks/fuzzing/failure_triage.rb +2 -1
- data/lib/hecks/fuzzing/mutation/run.rb +11 -4
- data/lib/hecks/fuzzing/properties/catalog.rb +6 -4
- data/lib/hecks/fuzzing/properties/guaranteed_by_construction.rb +18 -11
- data/lib/hecks/fuzzing/properties/guards.rb +1 -1
- data/lib/hecks/fuzzing/self_consistency/saga_redelivery.rb +1 -1
- data/lib/hecks/fuzzing/self_consistency.rb +6 -2
- data/lib/hecks/fuzzing/shrinker.rb +3 -1
- data/lib/hecks/fuzzing/value_generator.rb +19 -5
- data/lib/hecks/gate/stages.yml +4 -10
- data/lib/hecks/grammar/evolve.rb +1 -1
- data/lib/hecks/grammar/expression_operators.json +372 -0
- data/lib/hecks/grammar/operators.rb +3 -1
- data/lib/hecks/hecks/adapters/codebase/corpus_tasks.rb +10 -10
- data/lib/hecks/hecks/adapters/codebase/inspection/rubycritic.rb +35 -0
- data/lib/hecks/hecks/adapters/codebase/inspection.rb +104 -0
- data/lib/hecks/hecks/adapters/codebase/publishing.rb +2 -1
- data/lib/hecks/hecks/adapters/codebase/release_facts.rb +12 -2
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +2 -1
- data/lib/hecks/hecks/adapters/codebase/test_runner.rb +1 -1
- data/lib/hecks/hecks/adapters/cost_explorer.rb +8 -5
- data/lib/hecks/hecks/adapters/deploy_toolchain/clearing.rb +51 -0
- data/lib/hecks/hecks/adapters/deploy_toolchain/statuses.rb +2 -1
- data/lib/hecks/hecks/adapters/deploy_toolchain.rb +2 -0
- data/lib/hecks/hecks/adapters/finding_github.rb +13 -6
- data/lib/hecks/hecks/adapters/first_admin.rb +2 -2
- data/lib/hecks/hecks/adapters/github_rulesets.rb +6 -3
- data/lib/hecks/hecks/adapters/in_process_boot.rb +1 -1
- data/lib/hecks/hecks/adapters/journal_store/compaction.rb +1 -1
- data/lib/hecks/hecks/adapters/journal_store/edge_audit.rb +10 -20
- data/lib/hecks/hecks/adapters/journal_store/held_domain.rb +28 -5
- data/lib/hecks/hecks/adapters/local_files.rb +2 -2
- data/lib/hecks/hecks/adapters/rehearsal/audit_report.rb +107 -0
- data/lib/hecks/hecks/adapters/rehearsal/census.rb +71 -0
- data/lib/hecks/hecks/adapters/rehearsal/declaration.rb +133 -0
- data/lib/hecks/hecks/adapters/rehearsal/environment.rb +83 -0
- data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +142 -0
- data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +96 -0
- data/lib/hecks/hecks/adapters/rehearsal/postgres_census.rb +100 -0
- data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +69 -0
- data/lib/hecks/hecks/adapters/rehearsal/postgres_store.rb +129 -0
- data/lib/hecks/hecks/adapters/rehearsal/rows.rb +41 -0
- data/lib/hecks/hecks/adapters/rehearsal/rust_audit.rb +83 -0
- data/lib/hecks/hecks/adapters/rehearsal/subject.rb +104 -0
- data/lib/hecks/hecks/adapters/rehearsal.rb +54 -0
- data/lib/hecks/hecks/adapters/rehearsal_store.adapter +7 -0
- data/lib/hecks/hecks/adapters/rehearsal_store.rb +81 -0
- data/lib/hecks/hecks/adapters/site_toolchain/role_prober.rb +78 -0
- data/lib/hecks/hecks/adapters/site_toolchain.rb +29 -4
- data/lib/hecks/hecks/adapters/terminal.rb +13 -11
- data/lib/hecks/hecks/adapters/world_clearing.rb +65 -0
- data/lib/hecks/hecks/codebase.behaviors +13 -1
- data/lib/hecks/hecks/codebase.bluebook +239 -5
- data/lib/hecks/hecks/custodian.behaviors +24 -6
- data/lib/hecks/hecks/custodian.bluebook +6 -1227
- data/lib/hecks/hecks/deploy.behaviors +1 -1
- data/lib/hecks/hecks/deploy.world +1 -3
- data/lib/hecks/hecks/hecks.behaviors +1 -1
- data/lib/hecks/hecks/hecks.hecksagon +61 -18
- data/lib/hecks/hecks/hecks.world +11 -10
- data/lib/hecks/hecks/rehearsal.bluebook +477 -0
- data/lib/hecks/hecks/site.behaviors +1 -1
- data/lib/hecks/hecks/site.world +0 -1
- data/lib/hecks/hecks/tooling.bluebook +1238 -0
- data/lib/hecks/indifferent_key.rb +20 -0
- data/lib/hecks/language/adapter.bluebook +13 -3
- data/lib/hecks/language/bluebook/aggregate.bluebook +23 -0
- data/lib/hecks/language/bluebook/bluebook.bluebook +15 -0
- data/lib/hecks/language/bluebook/entity.bluebook +18 -0
- data/lib/hecks/language/bluebook/policy.bluebook +9 -1
- data/lib/hecks/language/bluebook/query.bluebook +1 -1
- data/lib/hecks/language/bluebook/vocabulary.bluebook +11 -4
- data/lib/hecks/language/hecksagon/domain_port.bluebook +1 -1
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +22 -0
- data/lib/hecks/language/oidc.json +10 -0
- data/lib/hecks/language/port.bluebook +4 -4
- data/lib/hecks/literal.rb +12 -3
- data/lib/hecks/ports/key_vault.rb +7 -2
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +21 -10
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/boot.rb +4 -2
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/era_resolver.rb +2 -1
- data/lib/hecks/ports/persistence/repository_factory.rb +6 -3
- data/lib/hecks/projections/deploy/box/templates/deploy-box.sh.tmpl +29 -0
- data/lib/hecks/projections/deploy/box/templates/deploy-service.sh.tmpl +1 -1
- data/lib/hecks/projections/deploy/fargate/settings/tuning.rb +15 -0
- data/lib/hecks/projections/deploy/fargate/settings.rb +3 -1
- data/lib/hecks/projections/deploy/fargate/stack/readers.rb +1 -0
- data/lib/hecks/projections/deploy/preview/preview.sh.erb +1 -1
- data/lib/hecks/projections/deploy/shared.rb +5 -2
- data/lib/hecks/projections/deploy/templates/fargate/Makefile.tmpl +7 -4
- data/lib/hecks/projections/model/deviations.rb +2 -2
- data/lib/hecks/projections/model.rb +2 -2
- data/lib/hecks/projections/oidc.rb +13 -1
- data/lib/hecks/projections/shape.rb +5 -2
- data/lib/hecks/projections/site/cms_editor/attributes.rb +95 -0
- data/lib/hecks/projections/site/cms_editor/blocks.rb +157 -0
- data/lib/hecks/projections/site/cms_editor/checks.rb +77 -0
- data/lib/hecks/projections/site/cms_editor/clearing.rb +70 -0
- data/lib/hecks/projections/site/cms_editor/color.rb +124 -0
- data/lib/hecks/projections/site/cms_editor/composition.rb +42 -0
- data/lib/hecks/projections/site/cms_editor/destructive.rb +61 -0
- data/lib/hecks/projections/site/cms_editor/drafts.rb +102 -0
- data/lib/hecks/projections/site/cms_editor/hints.rb +74 -0
- data/lib/hecks/projections/site/cms_editor/icons.rb +86 -0
- data/lib/hecks/projections/site/cms_editor/key_kinds.rb +31 -0
- data/lib/hecks/projections/site/cms_editor/limits.rb +72 -0
- data/lib/hecks/projections/site/cms_editor/media.rb +85 -0
- data/lib/hecks/projections/site/cms_editor/moment.rb +34 -0
- data/lib/hecks/projections/site/cms_editor/palette.rb +115 -0
- data/lib/hecks/projections/site/cms_editor/pickers.rb +85 -0
- data/lib/hecks/projections/site/cms_editor/pretty.rb +40 -0
- data/lib/hecks/projections/site/cms_editor/preview.rb +91 -0
- data/lib/hecks/projections/site/cms_editor/relations.rb +92 -0
- data/lib/hecks/projections/site/cms_editor/scale_checks.rb +66 -0
- data/lib/hecks/projections/site/cms_editor/scheduling.rb +150 -0
- data/lib/hecks/projections/site/cms_editor/schema.rb +161 -0
- data/lib/hecks/projections/site/cms_editor/setting.rb +130 -0
- data/lib/hecks/projections/site/cms_editor/targets.rb +86 -0
- data/lib/hecks/projections/site/cms_editor/templates/package.json.tmpl +36 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/app.ts.tmpl +370 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/assets.ts.tmpl +98 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/auth/membership.ts.tmpl +87 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/auth/session.ts.tmpl +36 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/auth/sso.ts.tmpl +20 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/browser/app.css.tmpl +412 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/browser/autosave.js.tmpl +144 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/browser/blocks.js.tmpl +500 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/browser/body_doc.js.tmpl +175 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/browser/body_editor.js.tmpl +418 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/browser/epoch.js.tmpl +61 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/browser/forms.js.tmpl +210 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/browser/lists.js.tmpl +40 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/browser/main.js.tmpl +26 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/browser/media_picker.js.tmpl +232 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/browser/moments.js.tmpl +73 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/browser/pickers.js.tmpl +152 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/browser/preview.js.tmpl +98 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/browser/shell.js.tmpl +140 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/browser/toast.js.tmpl +66 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/choices.ts.tmpl +99 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/commands.ts.tmpl +133 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/config.ts.tmpl +29 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/flash.ts.tmpl +52 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/host.ts.tmpl +43 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/media/handler.ts.tmpl +177 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/media/multipart.ts.tmpl +53 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/media/sniff.ts.tmpl +94 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/media/storage.ts.tmpl +50 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/names.ts.tmpl +36 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/schema.ts.tmpl +214 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/server.ts.tmpl +65 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/availability.ts.tmpl +15 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/block_list.js.tmpl +213 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/blocks.ts.tmpl +275 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/body_model.js.tmpl +123 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/body_parse.js.tmpl +320 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/detail.ts.tmpl +88 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/dialogs.ts.tmpl +43 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/fields.ts.tmpl +275 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/html.ts.tmpl +61 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/icons.ts.tmpl +15 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/input.ts.tmpl +92 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/links.ts.tmpl +100 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/moments.ts.tmpl +44 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/outline.ts.tmpl +63 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/pages.ts.tmpl +213 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/paging.ts.tmpl +82 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/pickers.ts.tmpl +110 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/preview.ts.tmpl +87 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/related.ts.tmpl +97 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/schedule.ts.tmpl +160 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/shell.ts.tmpl +211 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/table.ts.tmpl +151 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/theme.js.tmpl +16 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/values.ts.tmpl +69 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/words.ts.tmpl +97 -0
- data/lib/hecks/projections/site/cms_editor/templates/src/ui/world.ts.tmpl +35 -0
- data/lib/hecks/projections/site/cms_editor/templates/tsconfig.json.tmpl +17 -0
- data/lib/hecks/projections/site/cms_editor/theme.rb +29 -0
- data/lib/hecks/projections/site/cms_editor/theme_checks.rb +57 -0
- data/lib/hecks/projections/site/cms_editor.rb +133 -0
- data/lib/hecks/projections/site/role_probe.rb +74 -0
- data/lib/hecks/projector/cli_audience.rb +2 -1
- data/lib/hecks/projector/cli_projector/listing.rb +1 -1
- data/lib/hecks/projector/cli_projector/option_specs.rb +1 -1
- data/lib/hecks/projector/docs_projector/closing.rb +1 -1
- data/lib/hecks/projector/docs_projector.rb +1 -1
- data/lib/hecks/projector/exporter/bindings.rb +40 -10
- data/lib/hecks/projector/exporter/capability_values.rb +55 -0
- data/lib/hecks/projector/narrate_projector/reactions.rb +1 -1
- data/lib/hecks/projector/target.rb +11 -0
- data/lib/hecks/projector.rb +32 -5
- data/lib/hecks/quality_control/adapters/github_checks.rb +12 -8
- data/lib/hecks/quality_control/adapters/github_issues.rb +8 -4
- data/lib/hecks/quality_control/cli/qa_open_pr.rb +2 -2
- data/lib/hecks/quality_control/cli/qa_sweep/checks/shrinking.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_sweep/finding_report.rb +1 -1
- data/lib/hecks/quality_control/cli/qa_sweep.rb +1 -1
- data/lib/hecks/quality_control/quality_control.bluebook +6 -2
- data/lib/hecks/release/approval.rb +64 -0
- data/lib/hecks/router/{door.rb → aggregate_reader.rb} +5 -4
- data/lib/hecks/router/namespace_installer.rb +16 -16
- data/lib/hecks/router.rb +1 -1
- data/lib/hecks/runtime/best_effort.rb +22 -0
- data/lib/hecks/runtime/command_interpreter/mutation_applier.rb +12 -2
- data/lib/hecks/runtime/command_interpreter.rb +3 -2
- data/lib/hecks/runtime/command_rules/emission.rb +1 -1
- data/lib/hecks/runtime/dispatcher.rb +4 -4
- data/lib/hecks/runtime/entity_element/location.rb +1 -1
- data/lib/hecks/runtime/event.rb +5 -0
- data/lib/hecks/runtime/identity.rb +7 -6
- data/lib/hecks/runtime/interpreting.rb +2 -1
- data/lib/hecks/runtime/invocation_builder.rb +1 -1
- data/lib/hecks/runtime/loader/boot_steps.rb +8 -5
- data/lib/hecks/runtime/loader.rb +10 -10
- data/lib/hecks/runtime/policy_interpreter/arguments.rb +7 -4
- data/lib/hecks/runtime/policy_interpreter/fan_out.rb +3 -3
- data/lib/hecks/runtime/policy_interpreter.rb +6 -6
- data/lib/hecks/runtime/port_operation_interpreter.rb +1 -1
- data/lib/hecks/runtime/reaction_invocation.rb +1 -1
- data/lib/hecks/runtime/rebuild_sweep.rb +11 -1
- data/lib/hecks/runtime/registry/ask_verification.rb +35 -0
- data/lib/hecks/runtime/registry/hecksagon_rules.rb +10 -0
- data/lib/hecks/runtime/registry/merging.rb +1 -1
- data/lib/hecks/runtime/registry/providers.rb +16 -0
- data/lib/hecks/runtime/registry/read_repository.rb +6 -4
- data/lib/hecks/runtime/registry/verification.rb +4 -1
- data/lib/hecks/runtime/registry/world_defaults.rb +29 -0
- data/lib/hecks/runtime/registry.rb +1 -1
- data/lib/hecks/runtime/saga_interpreter/compensation.rb +1 -1
- data/lib/hecks/runtime/saga_interpreter/delivery.rb +4 -4
- data/lib/hecks/runtime/saga_interpreter/transitions.rb +1 -1
- data/lib/hecks/runtime/saga_interpreter.rb +3 -3
- data/lib/hecks/runtime/tenant_check.rb +5 -4
- data/lib/hecks/runtime/value/coercion.rb +2 -2
- data/lib/hecks/runtime/value/validation.rb +16 -4
- data/lib/hecks/runtime.rb +9 -9
- data/lib/hecks/rust_build/project_rust/target_ir.rb +1 -1
- data/lib/hecks/rust_build/wasm.rb +1 -1
- data/lib/hecks/rust_build/wasm_browser.rb +1 -1
- data/lib/hecks/rust_build.rb +11 -0
- data/lib/hecks/served_options.rb +53 -0
- data/lib/hecks/site/bluebook/site.bluebook +29 -1
- data/lib/hecks/site/bluebook/site.ports.hecksagon +6 -0
- data/lib/hecks/storehouse/audit.rb +1 -1
- data/lib/hecks/storehouse/dispatching.rb +8 -6
- data/lib/hecks/storehouse/introspection.rb +2 -2
- data/lib/hecks/storehouse/querying.rb +6 -4
- data/lib/hecks/storehouse.rb +4 -4
- data/lib/hecks/tools/comment_style/source_file.rb +4 -1
- data/lib/hecks/tools/deploy_recipe_lint/fixtures.rb +4 -1
- data/lib/hecks/tools/lanes/rows.rb +6 -0
- data/lib/hecks/tools/oidc_manifests.rb +4 -5
- data/lib/hecks/tools/regeneration_run.rb +11 -4
- data/lib/hecks/tools/site_routes/cli.rb +1 -1
- data/lib/hecks/tools/site_routes/editor_files.rb +45 -0
- data/lib/hecks/tools/site_routes.rb +14 -7
- data/lib/hecks/tools/tenant_provisioning.rb +2 -2
- data/lib/hecks/tools/tools_doc.rb +4 -4
- data/lib/hecks/version.rb +1 -1
- data/lib/hecks/vocabulary.rb +4 -4
- data/lib/hecks.rb +15 -15
- data/lib/rubocop/cop/hecks/env_dump.rb +69 -0
- data/lib/rubocop/cop/hecks/monotonic_duration.rb +53 -0
- data/lib/rubocop/cop/hecks/no_wall_clock_in_runtime.rb +34 -0
- data/lib/rubocop/cop/hecks/raw_shell_interpolation.rb +79 -0
- data/lib/rubocop/cop/hecks/sleep_in_spec.rb +34 -0
- data/lib/rubocop/cop/hecks/swallowed_rescue.rb +37 -0
- data/lib/rubocop/cop/hecks/symbol_string_key_mix.rb +50 -0
- data/lib/rubocop/cop/hecks/untyped_raise.rb +37 -0
- data/prebuilt/05c358d38d661a3774f813d49c66f5b68939af94432d66257a56f49ee2598994.marshal +0 -0
- data/prebuilt/26c40c61f09b09b11651c64668eda3ceb180f83cf2a3802d3033d2fd99ac841b.marshal +0 -0
- data/prebuilt/verdicts-230ac18c25abfd3d92ede032bee2661a4c2cd2773ab0cf0e2ae52546ba2f7af9.json +1 -0
- data/rust/.gitignore +6 -0
- data/rust/Cargo.toml +9 -1
- data/rust/build/src/binding_pass.rs +103 -0
- data/rust/build/src/cargo_sync.rs +6 -0
- data/rust/build/src/lineage_pass.rs +3 -3
- data/rust/build/src/main.rs +17 -5
- data/rust/build/src/pipeline.rs +48 -5
- data/rust/build/src/seams_pass.rs +123 -0
- data/rust/build/src/translation_pass.rs +167 -0
- data/rust/codegen/src/asks.rs +103 -0
- data/rust/codegen/src/bridging.rs +1 -1
- data/rust/codegen/src/commands.rs +13 -8
- data/rust/codegen/src/constraints.rs +25 -0
- data/rust/codegen/src/domain_generator.rs +11 -9
- data/rust/codegen/src/expr_emitter.rs +13 -0
- data/rust/codegen/src/json_codec.rs +54 -15
- data/rust/codegen/src/main.rs +2 -1
- data/rust/codegen/src/mutations.rs +174 -4
- data/rust/codegen/src/naming.rs +30 -0
- data/rust/codegen/src/queries.rs +11 -2
- data/rust/codegen/src/reactions.rs +1 -1
- data/rust/codegen/src/types.rs +166 -8
- data/rust/host/HECKS_RELEASE +1 -1
- data/rust/host/src/api.rs +4 -4
- data/rust/host/src/bin/validate_harness.rs +43 -0
- data/rust/host/src/boundary_fuzz/expr_json.rs +2 -2
- data/rust/host/src/boundary_fuzz/ir.rs +1 -0
- data/rust/host/src/boundary_fuzz/server.rs +1 -1
- data/rust/host/src/checkout.rs +35 -19
- data/rust/host/src/commerce_ir.rs +408 -2
- data/rust/host/src/expr_json.rs +118 -0
- data/rust/host/src/mint.rs +1 -1
- data/rust/host/src/payments/tests.rs +27 -1
- data/rust/host/src/payments.rs +12 -4
- data/rust/host/src/query_step.rs +22 -4
- data/rust/host/src/reference_validate.rs +653 -108
- data/rust/host/src/resend.rs +2 -0
- data/rust/host/src/server.rs +19 -6
- data/rust/host/src/ui_schema.rs +132 -5
- data/rust/host/src/web/newsletter.rs +7 -8
- data/rust/host/src/web/newsletter_send.rs +38 -13
- data/rust/host/src/web/registrations.rs +229 -26
- data/rust/host/src/web.rs +3 -3
- data/rust/parser/src/emit.rs +38 -6
- data/rust/parser/src/expr/ast_json.rs +7 -1
- data/rust/parser/src/expr/resolver.rs +171 -6
- data/rust/parser/src/ir.rs +7 -0
- data/rust/parser/src/keywords.rs +24 -0
- data/rust/parser/src/main.rs +3 -0
- data/rust/parser/src/parse/aggregate.rs +2 -1
- data/rust/parser/src/parse/chapter.rs +2 -2
- data/rust/parser/src/parse/command.rs +2 -0
- data/rust/parser/src/parse/hecksagon.rs +5 -2
- data/rust/parser/src/parse/lifecycle.rs +81 -0
- data/rust/parser/src/parse/mod.rs +15 -1
- data/rust/parser/src/parse/policy.rs +13 -2
- data/rust/parser/src/parse/value_object.rs +13 -8
- data/rust/parser/src/ruby_value.rs +1 -1
- data/rust/src/exemplar/commands.rs +4 -4
- data/rust/src/exemplar/constraints.rs +1 -1
- data/rust/src/exemplar/json.rs +43 -1
- data/rust/src/kernel/cli.rs +7 -5
- data/rust/src/kernel/dispatch.rs +2 -2
- data/rust/src/kernel/dispatch_guard_tests.rs +1 -1
- data/rust/src/kernel/expr.rs +73 -4
- data/rust/src/kernel/expression_operators/arithmetic.rs +130 -5
- data/rust/src/kernel/expression_operators/presence.rs +41 -3
- data/rust/src/kernel/expression_operators/text.rs +26 -2
- data/rust/src/kernel/json.rs +15 -0
- data/rust/src/kernel/mod.rs +1 -1
- data/rust/src/kernel/orchestrate.rs +54 -5
- data/rust/src/kernel/orchestrate_guard_tests.rs +67 -0
- data/rust/src/kernel/pattern.rs +60 -0
- data/rust/src/kernel/reference_lookup.rs +90 -7
- metadata +174 -36
- data/lib/hecks/doors/cli_door/nesting.rb +0 -34
- data/lib/hecks/doors/cli_door/shorthand.rb +0 -85
- data/lib/hecks/doors/cli_door.rb +0 -124
- data/lib/hecks/doors/cli_runner/answers.rb +0 -138
- data/lib/hecks/doors/cli_runner/resolution.rb +0 -146
- data/lib/hecks/doors/cli_runner/settling.rb +0 -115
- data/lib/hecks/doors/cli_runner/streaming.rb +0 -90
- data/lib/hecks/doors/cli_runner/suggestions.rb +0 -43
- data/lib/hecks/doors/cli_runner.rb +0 -66
- data/lib/hecks/doors/command_request.rb +0 -119
- data/lib/hecks/doors/handle.rb +0 -208
- data/lib/hecks/doors/json_door.rb +0 -132
- data/lib/hecks/doors/launcher_options.rb +0 -247
- data/lib/hecks/doors/mcp_door/properties.rb +0 -47
- data/lib/hecks/doors/mcp_door/tool_calls.rb +0 -113
- data/lib/hecks/doors/mcp_door/tool_definitions/auditing.rb +0 -51
- data/lib/hecks/doors/mcp_door/tool_definitions/calling.rb +0 -69
- data/lib/hecks/doors/mcp_door/tool_definitions/reading.rb +0 -97
- data/lib/hecks/doors/mcp_door/tool_definitions.rb +0 -15
- data/lib/hecks/doors/mcp_door.rb +0 -156
- data/lib/hecks/doors/mcp_door_scope/argument_policy.rb +0 -92
- data/lib/hecks/doors/mcp_door_scope/env_problems.rb +0 -55
- data/lib/hecks/doors/mcp_door_scope/presenter.rb +0 -78
- data/lib/hecks/doors/mcp_door_scope.rb +0 -201
- data/lib/hecks/doors/mcp_guide_cache.rb +0 -75
- data/lib/hecks/doors/ruby_door/aggregate_door.rb +0 -162
- data/lib/hecks/doors/ruby_door/chapter.rb +0 -89
- data/lib/hecks/doors/ruby_door.rb +0 -80
- data/lib/hecks/doors/usage_cache.rb +0 -139
- data/prebuilt/0ee7f83cba59ce7d1c45c65ba166b071779f70143449f584f33ff7989f64eccb.marshal +0 -0
- data/prebuilt/6e4a6bcf0aa880e2e6b056e1846b70e5a768090b9dc998bbadeaf5d6bcfd3db8.marshal +0 -0
- data/prebuilt/verdicts-91aaf93ce8981bd9a754948f075d95650dc2ec6435015376f5c60992b36a24b1.json +0 -1
|
@@ -6,7 +6,7 @@ require "hecks/cli/console"
|
|
|
6
6
|
module Hecks
|
|
7
7
|
module Adapters
|
|
8
8
|
# The `Terminal` port's adapter: the sessions an operator or a program drives through stdin and
|
|
9
|
-
# stdout, an IRB console (`open`) or the stdio MCP
|
|
9
|
+
# stdout, an IRB console (`open`) or the stdio MCP server (`serve`).
|
|
10
10
|
#
|
|
11
11
|
# The journal records that a session was opened and how it ended, not what was said in it.
|
|
12
12
|
# Each starts here and nowhere else; a caller that must not open a real session (a spec)
|
|
@@ -43,26 +43,28 @@ module Hecks
|
|
|
43
43
|
{ output: { value: "console session ended (#{domain || "pizzas"})" } }
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
-
# Hands the process over to the MCP
|
|
46
|
+
# Hands the process over to the MCP server until the client closes stdin. The server writes
|
|
47
|
+
# its
|
|
47
48
|
# JSON-RPC on stdout, so nothing here is captured, and the launcher's own answer follows
|
|
48
49
|
# only once the client is gone.
|
|
49
50
|
#
|
|
50
|
-
# @param held [Hash] the `
|
|
51
|
-
# @return [Hash{Symbol => Hash}] `output:` a one-line note that the
|
|
52
|
-
# @raise [ConsoleCapture::Failure] when the process is not set up for stdio: the
|
|
51
|
+
# @param held [Hash] the `Launch` record: `stdio` (whether `--stdio` was given)
|
|
52
|
+
# @return [Hash{Symbol => Hash}] `output:` a one-line note that the server closed
|
|
53
|
+
# @raise [ConsoleCapture::Failure] when the process is not set up for stdio: the server
|
|
53
54
|
# refused to start, and said why on stderr
|
|
54
55
|
def serve(**held)
|
|
55
|
-
|
|
56
|
+
run_server(plain(held[:stdio]) ? ["--stdio"] : [])
|
|
56
57
|
|
|
57
|
-
{ output: { value: "mcp
|
|
58
|
+
{ output: { value: "mcp server closed" } }
|
|
58
59
|
rescue SystemExit => e
|
|
59
|
-
raise ConsoleCapture::Failure, "the mcp
|
|
60
|
+
raise ConsoleCapture::Failure, "the mcp server refused to start (status #{e.status}); see stderr"
|
|
60
61
|
end
|
|
61
62
|
|
|
62
63
|
# Holds an interview at the terminal and writes the domain it drafts (ADR 0088). Asking is IO,
|
|
63
64
|
# so it happens here and nowhere else; the journal records that one was held, not its words.
|
|
64
65
|
#
|
|
65
|
-
# @param held [Hash] the `
|
|
66
|
+
# @param held [Hash] the `Launch` record: `name`; optionally `adapter`, `dir`, `expert`,
|
|
67
|
+
# `no_ai`
|
|
66
68
|
# @return [Hash{Symbol => Hash}] `output:` what the interview wrote, or that it wrote nothing
|
|
67
69
|
# @raise [ConsoleCapture::Failure] when the name or adapter is refused, or a file is there
|
|
68
70
|
def converse(**held)
|
|
@@ -76,8 +78,8 @@ module Hecks
|
|
|
76
78
|
|
|
77
79
|
private
|
|
78
80
|
|
|
79
|
-
# Hands the process to the server a spec set, or else to the real MCP
|
|
80
|
-
def
|
|
81
|
+
# Hands the process to the server a spec set, or else to the real MCP server.
|
|
82
|
+
def run_server(argv)
|
|
81
83
|
server = self.class.server
|
|
82
84
|
if server
|
|
83
85
|
server.call(argv)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hecks
|
|
4
|
+
module Adapters
|
|
5
|
+
# Empties the `deployed_to(...) do ... end` blocks of a `.world` file's text: the region,
|
|
6
|
+
# stacks, secrets, domain and buckets a host deploys with, which a project handed to a client
|
|
7
|
+
# must not carry. Each block keeps its opening and closing lines and holds one comment naming
|
|
8
|
+
# the settings it held, so the file still loads and shows what to set.
|
|
9
|
+
#
|
|
10
|
+
# A block closes at the first `end` at its own indent, and a setting is a line one indent
|
|
11
|
+
# step inside it that starts with its name. A block that holds only comments is already clear
|
|
12
|
+
# and is left as it is, so clearing twice changes nothing the second time.
|
|
13
|
+
class WorldClearing
|
|
14
|
+
BLOCK = /^(?<indent>[ \t]*)deployed_to\b[^\n]*[ \t]do\b[^\n]*\n(?<body>.*?)^\k<indent>end\b[^\n]*\n/m
|
|
15
|
+
|
|
16
|
+
# What clearing one world's text produced.
|
|
17
|
+
#
|
|
18
|
+
# @!attribute [r] text
|
|
19
|
+
# @return [String] the text with every block emptied
|
|
20
|
+
# @!attribute [r] settings
|
|
21
|
+
# @return [Array<String>] the setting names removed, in order, without repeats
|
|
22
|
+
Result = Struct.new(:text, :settings) do
|
|
23
|
+
# @return [Boolean] whether any block was emptied
|
|
24
|
+
def changed? = !settings.empty?
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @param text [String] the contents of a `.world` file
|
|
28
|
+
# @return [Result] the cleared text and the settings that were in the blocks
|
|
29
|
+
def self.call(text)
|
|
30
|
+
names = []
|
|
31
|
+
cleared = text.gsub(BLOCK) { |block| empty(Regexp.last_match, block, names) }
|
|
32
|
+
Result.new(cleared, names.uniq)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @param match [MatchData] one `deployed_to` block
|
|
36
|
+
# @param block [String] the block's text
|
|
37
|
+
# @param names [Array<String>] collects the setting names removed
|
|
38
|
+
# @return [String] the block's replacement
|
|
39
|
+
def self.empty(match, block, names)
|
|
40
|
+
indent = match[:indent]
|
|
41
|
+
held = match[:body].scan(/^#{indent} {2}([a-z_]\w*)/).flatten
|
|
42
|
+
return block if held.empty?
|
|
43
|
+
|
|
44
|
+
names.concat(held)
|
|
45
|
+
"#{block.lines.first}#{comment(indent, note(held.uniq))}#{indent}end\n"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# @param held [Array<String>] the setting names the block held
|
|
49
|
+
# @return [String] the comment that stands where the settings were
|
|
50
|
+
def self.note(held)
|
|
51
|
+
"The host's deployment settings were removed from this handoff. Set your own: #{held.join(", ")}."
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# @param indent [String] the block's indent
|
|
55
|
+
# @param note [String] the sentence to put in the block
|
|
56
|
+
# @return [String] the sentence as comment lines inside the block, folded under 100 columns
|
|
57
|
+
def self.comment(indent, note)
|
|
58
|
+
width = 96 - indent.size
|
|
59
|
+
note.scan(/(.{1,#{width}})(?:\s+|\z)/).flatten.map { |line| "#{indent} # #{line}\n" }.join
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private_class_method :empty, :note, :comment
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Hecks.behaviors "Codebase" do
|
|
2
2
|
vision "A request to work on this repository is recorded, the tree is examined, and only a hecks checkout lets it through."
|
|
3
3
|
|
|
4
|
-
loads "hecks.bluebook", "custodian.bluebook", "codebase.bluebook", "context_map.hecksagon", "hecks.hecksagon", "environments/memory.world"
|
|
4
|
+
loads "hecks.bluebook", "custodian.bluebook", "tooling.bluebook", "rehearsal.bluebook", "codebase.bluebook", "context_map.hecksagon", "hecks.hecksagon", "environments/memory.world"
|
|
5
5
|
|
|
6
6
|
test "ProjectModel reports what the language projects, and keeps the answer" do
|
|
7
7
|
tests "ProjectModel", on: "LanguageRun"
|
|
@@ -187,4 +187,16 @@ Hecks.behaviors "Codebase" do
|
|
|
187
187
|
input run: { value: "" }
|
|
188
188
|
expect refused: "must match"
|
|
189
189
|
end
|
|
190
|
+
|
|
191
|
+
test "Flog refuses a list of paths that is not one" do
|
|
192
|
+
tests "Flog", on: "InspectionRun"
|
|
193
|
+
input paths: { value: "lib, spec" }, run: { value: "paths" }
|
|
194
|
+
expect refused: "must match"
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
test "Reek refuses a count that is not positive" do
|
|
198
|
+
tests "Reek", on: "InspectionRun"
|
|
199
|
+
input top: { value: 0 }, run: { value: "top" }
|
|
200
|
+
expect refused: "positive"
|
|
201
|
+
end
|
|
190
202
|
end
|
|
@@ -98,6 +98,7 @@ Hecks.bluebook "Hecks" do
|
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
lifecycle :status, default: "requested" do
|
|
101
|
+
mark :failure, "faulted"
|
|
101
102
|
transition "Accept" => "accepted", from: "requested"
|
|
102
103
|
transition "Complete" => "completed", from: "accepted"
|
|
103
104
|
transition "Fault" => "faulted", from: %w[requested accepted]
|
|
@@ -658,6 +659,7 @@ Hecks.bluebook "Hecks" do
|
|
|
658
659
|
end
|
|
659
660
|
|
|
660
661
|
lifecycle :status, default: "requested" do
|
|
662
|
+
mark :failure, "faulted"
|
|
661
663
|
transition "Accept" => "accepted", from: "requested"
|
|
662
664
|
transition "Complete" => "completed", from: "accepted"
|
|
663
665
|
transition "Fault" => "faulted", from: %w[requested accepted]
|
|
@@ -812,6 +814,7 @@ Hecks.bluebook "Hecks" do
|
|
|
812
814
|
end
|
|
813
815
|
|
|
814
816
|
lifecycle :status, default: "requested" do
|
|
817
|
+
mark :failure, "faulted"
|
|
815
818
|
transition "Accept" => "accepted", from: "requested"
|
|
816
819
|
transition "Complete" => "completed", from: "accepted"
|
|
817
820
|
transition "Fault" => "faulted", from: %w[requested accepted]
|
|
@@ -991,6 +994,7 @@ Hecks.bluebook "Hecks" do
|
|
|
991
994
|
end
|
|
992
995
|
|
|
993
996
|
lifecycle :status, default: "requested" do
|
|
997
|
+
mark :failure, "faulted"
|
|
994
998
|
transition "Accept" => "accepted", from: "requested"
|
|
995
999
|
transition "Complete" => "completed", from: "accepted"
|
|
996
1000
|
transition "Fault" => "faulted", from: %w[requested accepted]
|
|
@@ -1225,6 +1229,7 @@ Hecks.bluebook "Hecks" do
|
|
|
1225
1229
|
end
|
|
1226
1230
|
|
|
1227
1231
|
lifecycle :status, default: "requested" do
|
|
1232
|
+
mark :failure, "faulted"
|
|
1228
1233
|
transition "Accept" => "accepted", from: "requested"
|
|
1229
1234
|
transition "Complete" => "completed", from: "accepted"
|
|
1230
1235
|
transition "Fault" => "faulted", from: %w[requested accepted]
|
|
@@ -1397,6 +1402,7 @@ Hecks.bluebook "Hecks" do
|
|
|
1397
1402
|
end
|
|
1398
1403
|
|
|
1399
1404
|
lifecycle :status, default: "requested" do
|
|
1405
|
+
mark :failure, "faulted"
|
|
1400
1406
|
transition "Accept" => "accepted", from: "requested"
|
|
1401
1407
|
transition "Complete" => "completed", from: "accepted"
|
|
1402
1408
|
transition "Fault" => "faulted", from: %w[requested accepted]
|
|
@@ -1654,6 +1660,222 @@ Hecks.bluebook "Hecks" do
|
|
|
1654
1660
|
trigger StyleRun::Fault, with: { refusal: :refusal }
|
|
1655
1661
|
end
|
|
1656
1662
|
|
|
1663
|
+
# Inspection: ranking the Ruby by complexity, finding copied code, listing design smells and
|
|
1664
|
+
# writing the combined report. A read of the tree: nothing is rewritten. The files the style
|
|
1665
|
+
# config excludes (generated output, vendored code) are left out of every tool.
|
|
1666
|
+
aggregate "InspectionRun" do
|
|
1667
|
+
description "One inspection of the Ruby by flog, flay, reek or rubycritic."
|
|
1668
|
+
|
|
1669
|
+
attribute :run, RunKey
|
|
1670
|
+
attribute :operation, Operation, optional: true
|
|
1671
|
+
attribute :paths, PathList, optional: true
|
|
1672
|
+
attribute :top, Top, optional: true
|
|
1673
|
+
attribute :checkout, Switch, optional: true
|
|
1674
|
+
attribute :report, Report, optional: true
|
|
1675
|
+
attribute :refusal, Report, optional: true
|
|
1676
|
+
identified_by :run
|
|
1677
|
+
|
|
1678
|
+
value_object "RunKey" do
|
|
1679
|
+
attribute :value, String, pattern: '[^ \t\n\r]'
|
|
1680
|
+
|
|
1681
|
+
invariant("a run is named") { !value.to_s.empty? }
|
|
1682
|
+
end
|
|
1683
|
+
|
|
1684
|
+
value_object "Operation" do
|
|
1685
|
+
attribute :value, String, pattern: '[^ \t\n\r]'
|
|
1686
|
+
end
|
|
1687
|
+
|
|
1688
|
+
value_object "Switch" do
|
|
1689
|
+
attribute :value, Boolean
|
|
1690
|
+
end
|
|
1691
|
+
|
|
1692
|
+
value_object "Report" do
|
|
1693
|
+
attribute :value, String
|
|
1694
|
+
end
|
|
1695
|
+
|
|
1696
|
+
# Files or directories, comma separated; lib when none is named.
|
|
1697
|
+
value_object "PathList" do
|
|
1698
|
+
attribute :value, String, pattern: '^[^ \t\n\r,]+(,[^ \t\n\r,]+)*$'
|
|
1699
|
+
end
|
|
1700
|
+
|
|
1701
|
+
# How many lines of the report are kept.
|
|
1702
|
+
value_object "Top" do
|
|
1703
|
+
attribute :value, Integer
|
|
1704
|
+
|
|
1705
|
+
invariant("a count is positive") { value > 0 }
|
|
1706
|
+
end
|
|
1707
|
+
|
|
1708
|
+
lifecycle :status, default: "requested" do
|
|
1709
|
+
mark :failure, "faulted"
|
|
1710
|
+
transition "Accept" => "accepted", from: "requested"
|
|
1711
|
+
transition "Complete" => "completed", from: "accepted"
|
|
1712
|
+
transition "Fault" => "faulted", from: %w[requested accepted]
|
|
1713
|
+
end
|
|
1714
|
+
|
|
1715
|
+
command "Flog" do
|
|
1716
|
+
role "Maintainer"
|
|
1717
|
+
goal "Rank the Ruby methods by complexity, worst first"
|
|
1718
|
+
|
|
1719
|
+
attribute :paths, PathList, optional: true
|
|
1720
|
+
attribute :top, Top, optional: true
|
|
1721
|
+
attribute :run, RunKey
|
|
1722
|
+
|
|
1723
|
+
sets :paths
|
|
1724
|
+
sets :top
|
|
1725
|
+
sets :run
|
|
1726
|
+
sets :operation, to: "flog"
|
|
1727
|
+
|
|
1728
|
+
emits FlogRequested
|
|
1729
|
+
end
|
|
1730
|
+
|
|
1731
|
+
command "Flay" do
|
|
1732
|
+
role "Maintainer"
|
|
1733
|
+
goal "Find Ruby code that is copied or nearly copied"
|
|
1734
|
+
|
|
1735
|
+
attribute :paths, PathList, optional: true
|
|
1736
|
+
attribute :top, Top, optional: true
|
|
1737
|
+
attribute :run, RunKey
|
|
1738
|
+
|
|
1739
|
+
sets :paths
|
|
1740
|
+
sets :top
|
|
1741
|
+
sets :run
|
|
1742
|
+
sets :operation, to: "flay"
|
|
1743
|
+
|
|
1744
|
+
emits FlayRequested
|
|
1745
|
+
end
|
|
1746
|
+
|
|
1747
|
+
command "Reek" do
|
|
1748
|
+
role "Maintainer"
|
|
1749
|
+
goal "List the design smells in the Ruby"
|
|
1750
|
+
|
|
1751
|
+
attribute :paths, PathList, optional: true
|
|
1752
|
+
attribute :top, Top, optional: true
|
|
1753
|
+
attribute :run, RunKey
|
|
1754
|
+
|
|
1755
|
+
sets :paths
|
|
1756
|
+
sets :top
|
|
1757
|
+
sets :run
|
|
1758
|
+
sets :operation, to: "reek"
|
|
1759
|
+
|
|
1760
|
+
emits ReekRequested
|
|
1761
|
+
end
|
|
1762
|
+
|
|
1763
|
+
command "Rubycritic" do
|
|
1764
|
+
role "Maintainer"
|
|
1765
|
+
goal "Write the combined quality report, with git churn"
|
|
1766
|
+
|
|
1767
|
+
attribute :paths, PathList, optional: true
|
|
1768
|
+
attribute :top, Top, optional: true
|
|
1769
|
+
attribute :run, RunKey
|
|
1770
|
+
|
|
1771
|
+
sets :paths
|
|
1772
|
+
sets :top
|
|
1773
|
+
sets :run
|
|
1774
|
+
sets :operation, to: "rubycritic"
|
|
1775
|
+
|
|
1776
|
+
emits RubycriticRequested
|
|
1777
|
+
end
|
|
1778
|
+
|
|
1779
|
+
# What the tree reported about itself, held against every request: nothing here runs
|
|
1780
|
+
# outside a hecks checkout (hecks.gemspec beside lib/).
|
|
1781
|
+
command "Accept" do
|
|
1782
|
+
role "System"
|
|
1783
|
+
goal "Let a request through only when the working tree is a hecks checkout"
|
|
1784
|
+
|
|
1785
|
+
reference_to InspectionRun
|
|
1786
|
+
attribute :checkout, Switch
|
|
1787
|
+
|
|
1788
|
+
given("needs a hecks checkout: hecks.gemspec stands beside lib/") { checkout.value }
|
|
1789
|
+
|
|
1790
|
+
sets :checkout
|
|
1791
|
+
|
|
1792
|
+
emits InspectionAccepted
|
|
1793
|
+
end
|
|
1794
|
+
|
|
1795
|
+
command "Complete" do
|
|
1796
|
+
role "System"
|
|
1797
|
+
goal "Record that the inspection was carried out, and what it reported"
|
|
1798
|
+
|
|
1799
|
+
reference_to InspectionRun
|
|
1800
|
+
attribute :report, Report
|
|
1801
|
+
|
|
1802
|
+
sets :report
|
|
1803
|
+
|
|
1804
|
+
emits InspectionCompleted
|
|
1805
|
+
end
|
|
1806
|
+
|
|
1807
|
+
command "Fault" do
|
|
1808
|
+
role "System"
|
|
1809
|
+
goal "Record that the inspection was refused or could not be carried out, and why"
|
|
1810
|
+
|
|
1811
|
+
reference_to InspectionRun
|
|
1812
|
+
attribute :refusal, Report
|
|
1813
|
+
|
|
1814
|
+
sets :refusal
|
|
1815
|
+
|
|
1816
|
+
emits InspectionFaulted
|
|
1817
|
+
end
|
|
1818
|
+
|
|
1819
|
+
query "InspectionOutcome" do
|
|
1820
|
+
description "How one inspection ended: its status, and what it reported or why it failed."
|
|
1821
|
+
attribute :run, RunKey
|
|
1822
|
+
where(run: :run)
|
|
1823
|
+
order_by :run
|
|
1824
|
+
end
|
|
1825
|
+
|
|
1826
|
+
query "InspectionsFaulted" do
|
|
1827
|
+
description "Every inspection that was refused or could not be carried out."
|
|
1828
|
+
where(status: "faulted")
|
|
1829
|
+
order_by :run
|
|
1830
|
+
end
|
|
1831
|
+
end
|
|
1832
|
+
|
|
1833
|
+
policy "ExamineWhenFlogRequested" do
|
|
1834
|
+
on "InspectionRun.FlogRequested"
|
|
1835
|
+
trigger InspectionRun::SourceTree::Examine, with: { run: :run }
|
|
1836
|
+
end
|
|
1837
|
+
|
|
1838
|
+
policy "ExamineWhenFlayRequested" do
|
|
1839
|
+
on "InspectionRun.FlayRequested"
|
|
1840
|
+
trigger InspectionRun::SourceTree::Examine, with: { run: :run }
|
|
1841
|
+
end
|
|
1842
|
+
|
|
1843
|
+
policy "ExamineWhenReekRequested" do
|
|
1844
|
+
on "InspectionRun.ReekRequested"
|
|
1845
|
+
trigger InspectionRun::SourceTree::Examine, with: { run: :run }
|
|
1846
|
+
end
|
|
1847
|
+
|
|
1848
|
+
policy "ExamineWhenRubycriticRequested" do
|
|
1849
|
+
on "InspectionRun.RubycriticRequested"
|
|
1850
|
+
trigger InspectionRun::SourceTree::Examine, with: { run: :run }
|
|
1851
|
+
end
|
|
1852
|
+
|
|
1853
|
+
policy "AcceptInspectionWhenExamined" do
|
|
1854
|
+
on "InspectionRun.InspectionExamined"
|
|
1855
|
+
trigger InspectionRun::Accept, with: { checkout: :checkout }
|
|
1856
|
+
end
|
|
1857
|
+
|
|
1858
|
+
policy "FaultInspectionWhenNotAccepted" do
|
|
1859
|
+
on "InspectionRun.InspectionExamined"
|
|
1860
|
+
where { !checkout.value }
|
|
1861
|
+
trigger InspectionRun::Fault, with: { refusal: "needs a hecks checkout: hecks.gemspec stands beside lib/" }
|
|
1862
|
+
end
|
|
1863
|
+
|
|
1864
|
+
policy "PerformInspectionWhenAccepted" do
|
|
1865
|
+
on "InspectionRun.InspectionAccepted"
|
|
1866
|
+
trigger InspectionRun::SourceTree::Perform, with: { run: :run }
|
|
1867
|
+
end
|
|
1868
|
+
|
|
1869
|
+
policy "RecordInspectionOutcome" do
|
|
1870
|
+
on "InspectionRun.InspectionAnswered"
|
|
1871
|
+
trigger InspectionRun::Complete, with: { report: :report }
|
|
1872
|
+
end
|
|
1873
|
+
|
|
1874
|
+
policy "RecordInspectionFault" do
|
|
1875
|
+
on "InspectionRun.InspectionRefused"
|
|
1876
|
+
trigger InspectionRun::Fault, with: { refusal: :refusal }
|
|
1877
|
+
end
|
|
1878
|
+
|
|
1657
1879
|
# Codemod: the mechanical rewrites of the example bluebooks. Each one edits tracked files, so
|
|
1658
1880
|
# unconfirmed it rehearses the edit (the script reboots every bluebook and puts the files back)
|
|
1659
1881
|
# and reports what it would change; the files stay changed only when it is confirmed.
|
|
@@ -1687,6 +1909,7 @@ Hecks.bluebook "Hecks" do
|
|
|
1687
1909
|
end
|
|
1688
1910
|
|
|
1689
1911
|
lifecycle :status, default: "requested" do
|
|
1912
|
+
mark :failure, "faulted"
|
|
1690
1913
|
transition "Accept" => "accepted", from: "requested"
|
|
1691
1914
|
transition "Complete" => "completed", from: "accepted"
|
|
1692
1915
|
transition "Fault" => "faulted", from: %w[requested accepted]
|
|
@@ -1900,6 +2123,7 @@ Hecks.bluebook "Hecks" do
|
|
|
1900
2123
|
end
|
|
1901
2124
|
|
|
1902
2125
|
lifecycle :status, default: "requested" do
|
|
2126
|
+
mark :failure, "faulted"
|
|
1903
2127
|
transition "Accept" => "accepted", from: "requested"
|
|
1904
2128
|
transition "Complete" => "completed", from: "accepted"
|
|
1905
2129
|
transition "Fault" => "faulted", from: %w[requested accepted]
|
|
@@ -2145,7 +2369,7 @@ Hecks.bluebook "Hecks" do
|
|
|
2145
2369
|
# Corpus: what this repository's committed domains are, and what the language's own IR holds.
|
|
2146
2370
|
# Every question about them is a pure read, answered by the SourceTree port: which domains carry
|
|
2147
2371
|
# a Rust feature, the order they regenerate in, whether each generated module is covered, and the
|
|
2148
|
-
# structural queries over the IR. Two commands open a long-running
|
|
2372
|
+
# structural queries over the IR. Two commands open a long-running server: the query MCP server
|
|
2149
2373
|
# on stdio and the forms app on a local port; each is recorded, runs until it is closed, and
|
|
2150
2374
|
# answers when it ends.
|
|
2151
2375
|
aggregate "CorpusRun" do
|
|
@@ -2211,6 +2435,7 @@ Hecks.bluebook "Hecks" do
|
|
|
2211
2435
|
end
|
|
2212
2436
|
|
|
2213
2437
|
lifecycle :status, default: "requested" do
|
|
2438
|
+
mark :failure, "faulted"
|
|
2214
2439
|
transition "Accept" => "accepted", from: "requested"
|
|
2215
2440
|
transition "Complete" => "completed", from: "accepted"
|
|
2216
2441
|
transition "Fault" => "faulted", from: %w[requested accepted]
|
|
@@ -2395,6 +2620,7 @@ Hecks.bluebook "Hecks" do
|
|
|
2395
2620
|
attribute :version, Version, optional: true
|
|
2396
2621
|
attribute :client_version, Version, optional: true
|
|
2397
2622
|
attribute :changelog, Switch, optional: true
|
|
2623
|
+
attribute :approved, Switch, optional: true
|
|
2398
2624
|
attribute :tag_state, Word, optional: true
|
|
2399
2625
|
attribute :head, Word, optional: true
|
|
2400
2626
|
attribute :ir_version, Version, optional: true
|
|
@@ -2439,6 +2665,7 @@ Hecks.bluebook "Hecks" do
|
|
|
2439
2665
|
end
|
|
2440
2666
|
|
|
2441
2667
|
lifecycle :status, default: "requested" do
|
|
2668
|
+
mark :failure, "faulted"
|
|
2442
2669
|
transition "Accept" => "accepted", from: "requested"
|
|
2443
2670
|
transition "AcceptGem" => "accepted", from: "requested"
|
|
2444
2671
|
transition "Complete" => "completed", from: "accepted"
|
|
@@ -2496,6 +2723,7 @@ Hecks.bluebook "Hecks" do
|
|
|
2496
2723
|
attribute :version, Version
|
|
2497
2724
|
attribute :client_version, Version
|
|
2498
2725
|
attribute :changelog, Switch
|
|
2726
|
+
attribute :approved, Switch
|
|
2499
2727
|
attribute :tag_state, Word
|
|
2500
2728
|
attribute :head, Word
|
|
2501
2729
|
attribute :ir_version, Version
|
|
@@ -2511,6 +2739,9 @@ Hecks.bluebook "Hecks" do
|
|
|
2511
2739
|
client_version.value == version.value
|
|
2512
2740
|
end
|
|
2513
2741
|
given("CHANGELOG.md has a heading for the version: add the release entry") { changelog.value }
|
|
2742
|
+
given("the commit that set the version carries a Release-Approved-By line: the owner decides when a release happens") do
|
|
2743
|
+
approved.value || tag_state.value == "at_release_commit"
|
|
2744
|
+
end
|
|
2514
2745
|
given("a tag for the version points at the release commit, not elsewhere") do
|
|
2515
2746
|
tag_state.value != "elsewhere"
|
|
2516
2747
|
end
|
|
@@ -2523,6 +2754,7 @@ Hecks.bluebook "Hecks" do
|
|
|
2523
2754
|
sets :version
|
|
2524
2755
|
sets :client_version
|
|
2525
2756
|
sets :changelog
|
|
2757
|
+
sets :approved
|
|
2526
2758
|
sets :tag_state
|
|
2527
2759
|
sets :head
|
|
2528
2760
|
sets :ir_version
|
|
@@ -2617,8 +2849,8 @@ Hecks.bluebook "Hecks" do
|
|
|
2617
2849
|
trigger PublishingRun::Accept, with: { checkout: :checkout, branch: :branch, release_lane: :release_lane,
|
|
2618
2850
|
on_origin: :on_origin, clean: :clean, version: :version,
|
|
2619
2851
|
client_version: :client_version,
|
|
2620
|
-
changelog: :changelog,
|
|
2621
|
-
ir_version: :ir_version, ships_from: :ships_from }
|
|
2852
|
+
changelog: :changelog, approved: :approved, tag_state: :tag_state,
|
|
2853
|
+
head: :head, ir_version: :ir_version, ships_from: :ships_from }
|
|
2622
2854
|
end
|
|
2623
2855
|
|
|
2624
2856
|
policy "AcceptTheGemWhenExamined" do
|
|
@@ -2634,9 +2866,10 @@ Hecks.bluebook "Hecks" do
|
|
|
2634
2866
|
where do
|
|
2635
2867
|
operation.value == "publish" &&
|
|
2636
2868
|
(!checkout.value || branch.value != release_lane.value || !on_origin.value || !clean.value ||
|
|
2637
|
-
client_version.value != version.value || !changelog.value || tag_state.value == "elsewhere"
|
|
2869
|
+
client_version.value != version.value || !changelog.value || tag_state.value == "elsewhere" ||
|
|
2870
|
+
(!approved.value && tag_state.value != "at_release_commit"))
|
|
2638
2871
|
end
|
|
2639
|
-
trigger PublishingRun::Fault, with: { refusal: "a release rule is not met: check the branch, tree, versions, CHANGELOG and
|
|
2872
|
+
trigger PublishingRun::Fault, with: { refusal: "a release rule is not met: check the branch, tree, versions, CHANGELOG, tag and the Release-Approved-By line" }
|
|
2640
2873
|
end
|
|
2641
2874
|
|
|
2642
2875
|
policy "FaultTheGemWhenNotAccepted" do
|
|
@@ -2763,6 +2996,7 @@ Hecks.bluebook "Hecks" do
|
|
|
2763
2996
|
end
|
|
2764
2997
|
|
|
2765
2998
|
lifecycle :status, default: "requested" do
|
|
2999
|
+
mark :failure, "faulted"
|
|
2766
3000
|
transition "Accept" => "accepted", from: "requested"
|
|
2767
3001
|
transition "Observe" => "observed", from: "requested"
|
|
2768
3002
|
transition "Complete" => "completed", from: %w[accepted observed]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Hecks.behaviors "Custodian" do
|
|
2
2
|
vision "A check and an operation are recorded as requested before anything outside is asked."
|
|
3
3
|
|
|
4
|
-
loads "hecks.bluebook", "custodian.bluebook", "codebase.bluebook", "context_map.hecksagon", "hecks.hecksagon", "environments/memory.world"
|
|
4
|
+
loads "hecks.bluebook", "custodian.bluebook", "tooling.bluebook", "rehearsal.bluebook", "codebase.bluebook", "context_map.hecksagon", "hecks.hecksagon", "environments/memory.world"
|
|
5
5
|
|
|
6
6
|
test "ModelCheck records the request, runs the analysis and keeps a clean verdict" do
|
|
7
7
|
tests "ModelCheck", on: "ModelCheckRun"
|
|
@@ -69,14 +69,14 @@ Hecks.behaviors "Custodian" do
|
|
|
69
69
|
expect emits: %w[VendorRequested PinRefused VendoringRefused]
|
|
70
70
|
end
|
|
71
71
|
|
|
72
|
-
test "ProjectCli keeps a domain it cannot boot as a stopped
|
|
73
|
-
tests "ProjectCli", on: "
|
|
72
|
+
test "ProjectCli keeps a domain it cannot boot as a stopped launch, and writes nothing" do
|
|
73
|
+
tests "ProjectCli", on: "Launch"
|
|
74
74
|
input run: { value: "launchers" }, domains: { value: "no/such/domain" }
|
|
75
|
-
expect emits: %w[LaunchersRequested
|
|
75
|
+
expect emits: %w[LaunchersRequested LaunchRefused LaunchStopped]
|
|
76
76
|
end
|
|
77
77
|
|
|
78
|
-
test "ServeMcp refuses a
|
|
79
|
-
tests "ServeMcp", on: "
|
|
78
|
+
test "ServeMcp refuses a launch that is not named" do
|
|
79
|
+
tests "ServeMcp", on: "Launch"
|
|
80
80
|
input run: { value: "" }
|
|
81
81
|
expect refused: "must match"
|
|
82
82
|
end
|
|
@@ -188,4 +188,22 @@ Hecks.behaviors "Custodian" do
|
|
|
188
188
|
input domain: { value: "examples/pizzas" }, run: { value: "host" }, target: { value: "arm64" }
|
|
189
189
|
expect refused: "must match"
|
|
190
190
|
end
|
|
191
|
+
|
|
192
|
+
test "Request refuses a rehearsal that is not named" do
|
|
193
|
+
tests "Request", on: "RehearsalRun"
|
|
194
|
+
input run: { value: "" }, domain: { value: "examples/pizzas" }
|
|
195
|
+
expect refused: "must match"
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
test "Request refuses a pin that is neither a release nor a commit" do
|
|
199
|
+
tests "Request", on: "RehearsalRun"
|
|
200
|
+
input run: { value: "rehearse" }, domain: { value: "examples/pizzas" }, pin: { value: "main" }
|
|
201
|
+
expect refused: "must match"
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
test "Request keeps a domain that is not there as a withheld rehearsal" do
|
|
205
|
+
tests "Request", on: "RehearsalRun"
|
|
206
|
+
input run: { value: "rehearse" }, domain: { value: "/tmp/hecks-behaviors-absent/shop" }
|
|
207
|
+
expect emits: %w[RehearsalRequested StoreSurveyed RehearsalWithheld]
|
|
208
|
+
end
|
|
191
209
|
end
|