hecks 3.14.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/examples/pizzas/adapters/fake_processor.rb +34 -0
- data/examples/pizzas/adapters/payment_signature.rb +66 -0
- data/examples/pizzas/adapters/payment_webhook.rb +87 -0
- data/examples/pizzas/bluebook/pizzas.behaviors +33 -0
- data/examples/pizzas/bluebook/pizzas.hecksagon +5 -3
- data/examples/pizzas/config.ru +22 -0
- data/lib/hecks/adapters/driven/prism.rb +0 -2
- data/lib/hecks/adapters/driven.rb +0 -2
- data/lib/hecks/adapters/driving/json.rb +1 -7
- data/lib/hecks/bluebook/dsl/bootstrap_table.rb +2 -2
- data/lib/hecks/bluebook/dsl/derivation_words.rb +58 -0
- data/lib/hecks/bluebook/dsl/translation_builder.rb +6 -37
- data/lib/hecks/bluebook/expression/ast_json.rb +0 -9
- data/lib/hecks/bluebook/hecksagon.rb +1 -1
- data/lib/hecks/bluebook/meta_validator/translation_judge/rules.rb +7 -10
- data/lib/hecks/bluebook/meta_validator/translation_judge.rb +4 -8
- data/lib/hecks/bluebook/meta_validator.rb +0 -11
- data/lib/hecks/bluebook/translation.rb +18 -10
- data/lib/hecks/bluebook/translation_expression/evaluator.rb +63 -0
- data/lib/hecks/bluebook/translation_expression/parser.rb +127 -0
- data/lib/hecks/bluebook/translation_expression.rb +39 -0
- data/lib/hecks/bluebook/translation_plan.rb +70 -0
- data/lib/hecks/bluebook.rb +2 -0
- data/lib/hecks/chapters.rb +3 -3
- data/lib/hecks/composer/adapters/claude_composer.adapter +3 -0
- data/lib/hecks/composer/adapters/claude_composer.rb +83 -0
- data/lib/hecks/composer/adapters/fake_agent.adapter +3 -0
- data/lib/hecks/composer/adapters/fake_agent.rb +55 -0
- data/lib/hecks/composer/adapters/jev.adapter +3 -0
- data/lib/hecks/composer/adapters/jev.rb +66 -0
- data/lib/hecks/composer/agent.rb +113 -0
- data/lib/hecks/composer/assistant.rb +110 -0
- data/lib/hecks/composer/behavior_run.rb +53 -0
- data/lib/hecks/composer/bluebook/composer.bluebook +178 -0
- data/lib/hecks/composer/bluebook/composer.hecksagon +16 -0
- data/lib/hecks/composer/board.rb +65 -0
- data/lib/hecks/composer/board_edit/command_text.rb +39 -0
- data/lib/hecks/composer/board_edit/source.rb +84 -0
- data/lib/hecks/composer/board_edit.rb +144 -0
- data/lib/hecks/composer/check.rb +89 -0
- data/lib/hecks/composer/domains.rb +81 -0
- data/lib/hecks/composer/jobs.rb +134 -0
- data/lib/hecks/composer/layout.rb +37 -0
- data/lib/hecks/composer/live.rb +150 -0
- data/lib/hecks/composer/outline.rb +48 -0
- data/lib/hecks/composer/page.html +989 -0
- data/lib/hecks/composer/panels.rb +142 -0
- data/lib/hecks/composer/parse.rb +83 -0
- data/lib/hecks/composer/plain.rb +28 -0
- data/lib/hecks/composer/ports/composer_agent.port +7 -0
- data/lib/hecks/composer/session.rb +141 -0
- data/lib/hecks/composer/toolbox.rb +166 -0
- data/lib/hecks/composer/web.rb +156 -0
- data/lib/hecks/composer/workbench.rb +51 -0
- data/lib/hecks/composer/workspace.rb +81 -0
- data/lib/hecks/composer.rb +17 -0
- data/lib/hecks/corpus/adapters.rb +22 -0
- data/lib/hecks/corpus/rust.rb +1 -1
- data/lib/hecks/corpus/worlds.rb +19 -0
- data/lib/hecks/corpus.rb +5 -0
- data/lib/hecks/forms/app/commands.rb +2 -3
- data/lib/hecks/forms/app/queries.rb +2 -3
- data/lib/hecks/forms/app/records.rb +17 -5
- data/lib/hecks/forms/command_form_renderer.rb +42 -16
- data/lib/hecks/forms/field_controls.rb +2 -2
- data/lib/hecks/forms/field_renderer.rb +1 -1
- data/lib/hecks/forms/field_shape.rb +36 -17
- data/lib/hecks/forms/index_renderer.rb +2 -1
- data/lib/hecks/forms/page.rb +1 -1
- data/lib/hecks/forms/params.rb +0 -13
- data/lib/hecks/forms/query_form_renderer.rb +7 -6
- data/lib/hecks/forms/record_renderer.rb +11 -7
- data/lib/hecks/forms/rule_words.rb +100 -0
- data/lib/hecks/forms/value_object_shape.rb +2 -1
- data/lib/hecks/fuzzing/bounded_exhaustive_expressions.rb +0 -3
- data/lib/hecks/fuzzing/isolated_boot/worlds.rb +3 -6
- data/lib/hecks/fuzzing/replay/filters.rb +2 -6
- data/lib/hecks/gate/stages.yml +25 -0
- data/lib/hecks/grammar/evolve/seeds.rb +0 -6
- data/lib/hecks/grammar/evolve.rb +0 -3
- data/lib/hecks/grammar/translation.bluebook +1 -1
- data/lib/hecks/hecks/adapters/codebase/composing.rb +56 -0
- data/lib/hecks/hecks/adapters/codebase/source_tree.rb +3 -1
- data/lib/hecks/hecks/adapters/journal_store/changes.rb +0 -26
- data/lib/hecks/hecks/adapters/journal_store/examination.rb +2 -23
- data/lib/hecks/hecks/adapters/journal_store/readings.rb +3 -11
- data/lib/hecks/hecks/adapters/journal_store.rb +0 -11
- data/lib/hecks/hecks/adapters/rehearsal/inquiry.rb +4 -11
- data/lib/hecks/hecks/adapters/rehearsal/memory_store.rb +0 -9
- data/lib/hecks/hecks/adapters/rehearsal/postgres_reading.rb +0 -4
- data/lib/hecks/hecks/codebase.behaviors +6 -0
- data/lib/hecks/hecks/codebase.bluebook +21 -0
- data/lib/hecks/hecks/composer.behaviors +68 -0
- data/lib/hecks/hecks/context_map.hecksagon +1 -1
- data/lib/hecks/hecks/custodian.behaviors +0 -6
- data/lib/hecks/hecks/custodian.bluebook +3 -80
- data/lib/hecks/hecks/hecks.hecksagon +2 -2
- data/lib/hecks/hecks/hecks.world +1 -1
- data/lib/hecks/hecks/rehearsal.bluebook +7 -13
- data/lib/hecks/kernel_capabilities/templates.rb +4 -4
- data/lib/hecks/kernel_capabilities.rb +1 -1
- data/lib/hecks/language/bluebook/vocabulary.bluebook +2 -3
- data/lib/hecks/language/translation/translation_aggregate.bluebook +21 -24
- data/lib/hecks/ports/access_control.rb +2 -2
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +3 -41
- data/lib/hecks/ports/persistence/plugins/era/lineage/coverage.rb +7 -7
- data/lib/hecks/ports/persistence/plugins/era/lineage/rewrite.rb +25 -2
- data/lib/hecks/ports/persistence/plugins/era/lineage/rules.rb +4 -4
- data/lib/hecks/ports/persistence/plugins/era/lineage.rb +17 -25
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/base_sql.rb +0 -12
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/domain_rename.rb +1 -1
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/era_store.rb +2 -22
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage/provisioning.rb +0 -1
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage.rb +9 -3
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/minter.rb +3 -29
- data/lib/hecks/ports/persistence/plugins/era/postgres_era/lineage_manager/refusals.rb +2 -26
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb +6 -33
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb +3 -3
- data/lib/hecks/ports/persistence/plugins/era/translation/audit.rb +2 -4
- data/lib/hecks/ports/persistence/plugins/era/translation/expression_sql.rb +52 -0
- data/lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb +23 -29
- data/lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb +1 -1
- data/lib/hecks/ports/persistence/plugins/era/translation.rb +0 -1
- data/lib/hecks/ports/persistence/plugins/era.rb +3 -6
- data/lib/hecks/ports.rb +0 -1
- data/lib/hecks/projection_files.rb +3 -1
- data/lib/hecks/projections/deploy/templates/lambda/nat_comment_oauth.tmpl +1 -1
- data/lib/hecks/projections/glossary/entries.rb +10 -4
- data/lib/hecks/projections/glossary/groups.rb +42 -0
- data/lib/hecks/projections/glossary/html/page.rb +7 -2
- data/lib/hecks/projections/glossary/html/parser.rb +1 -1
- data/lib/hecks/projections/glossary/html/sections.rb +31 -11
- data/lib/hecks/projections/glossary/html.rb +1 -2
- data/lib/hecks/projections/glossary/markdown.rb +31 -28
- data/lib/hecks/projections/glossary/mermaid.rb +3 -0
- data/lib/hecks/projections/glossary/page.css +143 -153
- data/lib/hecks/projections/glossary/page.js +63 -3
- data/lib/hecks/projections/glossary/sentences/actions.rb +88 -0
- data/lib/hecks/projections/glossary/sentences/paths.rb +77 -0
- data/lib/hecks/projections/glossary/sentences/queries.rb +90 -0
- data/lib/hecks/projections/glossary/sentences/value_objects.rb +32 -5
- data/lib/hecks/projections/glossary/sentences.rb +13 -3
- data/lib/hecks/projections/glossary/slugs.rb +4 -1
- data/lib/hecks/projections/glossary.rb +2 -1
- data/lib/hecks/projections/plain_english.rb +97 -0
- data/lib/hecks/projections/rust_vocabulary/arguments.rb +2 -2
- data/lib/hecks/projections/rust_vocabulary/enum_body.rb +20 -25
- data/lib/hecks/projections/rust_vocabulary/tests.rb +2 -2
- data/lib/hecks/projections/rust_vocabulary.rb +14 -6
- data/lib/hecks/projections/site/cms_editor/color.rb +0 -6
- data/lib/hecks/projections/statements/actions.rb +99 -0
- data/lib/hecks/projections/statements/relationships.rb +86 -0
- data/lib/hecks/projections/statements.rb +15 -24
- data/lib/hecks/projector/exporter/adapters.rb +112 -0
- data/lib/hecks/projector/exporter/translations.rb +18 -35
- data/lib/hecks/projector/exporter/worlds.rb +103 -0
- data/lib/hecks/projector/exporter.rb +5 -1
- data/lib/hecks/quality_control/adapters/agent.rb +6 -7
- data/lib/hecks/quality_control/adapters/agent_profile.rb +16 -114
- data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +1 -1
- data/lib/hecks/runtime/loader/boot_steps.rb +0 -20
- data/lib/hecks/runtime/outbox.rb +2 -9
- data/lib/hecks/runtime/port_operation_interpreter.rb +1 -9
- data/lib/hecks/runtime/remote_dispatcher.rb +2 -2
- data/lib/hecks/runtime/value.rb +13 -0
- data/lib/hecks/rust_build/project_rust/target_ir.rb +23 -4
- data/lib/hecks/rust_build/wasm.rb +0 -12
- data/lib/hecks/rust_build/write_if_changed.rb +12 -12
- data/lib/hecks/rust_format.rb +77 -0
- data/lib/hecks/tools/fuzz_sweep/findings.rb +3 -9
- data/lib/hecks/tools/fuzz_sweep.rb +1 -3
- data/lib/hecks/tools/translation_audit/verdicts.rb +3 -28
- data/lib/hecks/tools/translation_audit.rb +8 -10
- data/lib/hecks/tools/translation_scaffold/reporting.rb +1 -1
- data/lib/hecks/version.rb +1 -1
- data/lib/hecks/vocabulary.rb +2 -1
- data/lib/hecks.rb +3 -0
- data/prebuilt/{a883a7e568667aa5ac904c82daff356bdf9e996252a36af6def4a4a43efb967e.marshal → 02c09c73b272c1fb5a9ae6d87bb5e5e529208e00f6b4b597dc2c0fd70a9c0964.marshal} +0 -0
- data/prebuilt/{1a6f596be124228be93eba1d86dbc9d2933190fa389b284331241cb9f27115a0.marshal → bb84a835cf6a15136bad5ca03aa5bf93a5b92f5f72444618d3ef2412b987fb32.marshal} +0 -0
- data/prebuilt/{verdicts-872993b1aa26d73fe48f28251374b8585fed145d02aab42be0f00de386b6ff80.json → verdicts-f1f10da14c8e8f01b4c9b7e3e2d74be8cd2bf4676364ed17fa16975d2a076d75.json} +1 -1
- data/rust/Cargo.toml +40 -0
- data/rust/build/Cargo.toml +36 -0
- data/rust/build/clippy.toml +4 -0
- data/rust/build/src/adapters_pass.rs +196 -0
- data/rust/build/src/binding_pass.rs +54 -13
- data/rust/build/src/build_artifact.rs +23 -5
- data/rust/build/src/cargo_sync.rs +69 -26
- data/rust/build/src/lineage_pass.rs +101 -87
- data/rust/build/src/main.rs +11 -2
- data/rust/build/src/pipeline.rs +80 -19
- data/rust/build/src/reserved_names.rs +6 -50
- data/rust/build/src/resolve.rs +82 -35
- data/rust/build/src/rustfmt.rs +100 -0
- data/rust/build/src/seams_pass.rs +85 -16
- data/rust/build/src/subprocess.rs +30 -6
- data/rust/build/src/tmp.rs +5 -2
- data/rust/build/src/translation_pass.rs +72 -22
- data/rust/build/src/world_pass.rs +109 -0
- data/rust/clippy.toml +4 -0
- data/rust/codegen/Cargo.toml +36 -0
- data/rust/codegen/clippy.toml +4 -0
- data/rust/codegen/src/asks.rs +40 -14
- data/rust/codegen/src/attr.rs +2 -2
- data/rust/codegen/src/bridging.rs +676 -117
- data/rust/codegen/src/commands.rs +979 -373
- data/rust/codegen/src/constraints.rs +88 -25
- data/rust/codegen/src/dependency_planning.rs +128 -34
- data/rust/codegen/src/domain_generator.rs +300 -170
- data/rust/codegen/src/exemplar.rs +87 -32
- data/rust/codegen/src/expr_emitter.rs +54 -6
- data/rust/codegen/src/fielded.rs +193 -41
- data/rust/codegen/src/hecks_naming.rs +124 -16
- data/rust/codegen/src/hecks_naming_tests.rs +81 -0
- data/rust/codegen/src/json.rs +80 -44
- data/rust/codegen/src/json_codec.rs +585 -149
- data/rust/codegen/src/literal.rs +104 -138
- data/rust/codegen/src/main.rs +145 -52
- data/rust/codegen/src/manifest.rs +76 -14
- data/rust/codegen/src/mutations.rs +1212 -239
- data/rust/codegen/src/naming.rs +111 -60
- data/rust/codegen/src/optional_pass.rs +90 -28
- data/rust/codegen/src/ports.rs +5 -4
- data/rust/codegen/src/prelude.rs +139 -49
- data/rust/codegen/src/queries.rs +601 -226
- data/rust/codegen/src/reactions.rs +268 -74
- data/rust/codegen/src/read_models.rs +606 -205
- data/rust/codegen/src/reference_specs.rs +16 -3
- data/rust/codegen/src/registry.rs +128 -79
- data/rust/codegen/src/reserved_names.rs +6 -50
- data/rust/codegen/src/shared.rs +71 -22
- data/rust/codegen/src/sidecars.rs +15 -5
- data/rust/codegen/src/skip_reason.rs +8 -2
- data/rust/codegen/src/types.rs +306 -108
- data/rust/host/Cargo.lock +1 -0
- data/rust/host/Cargo.toml +40 -4
- data/rust/host/HECKS_RELEASE +1 -1
- data/rust/host/clippy.toml +4 -0
- data/rust/host/src/api.rs +698 -218
- data/rust/host/src/auth.rs +491 -214
- data/rust/host/src/b64.rs +91 -0
- data/rust/host/src/bin/expr_harness.rs +6 -2
- data/rust/host/src/bin/lineage_harness.rs +47 -11
- data/rust/host/src/bin/mint_harness.rs +70 -37
- data/rust/host/src/bin/validate_harness.rs +16 -8
- data/rust/host/src/boot.rs +144 -68
- data/rust/host/src/boundary_fuzz/api.rs +130 -32
- data/rust/host/src/boundary_fuzz/auth.rs +108 -23
- data/rust/host/src/boundary_fuzz/expr_json.rs +85 -11
- data/rust/host/src/boundary_fuzz/ir.rs +164 -12
- data/rust/host/src/boundary_fuzz/server.rs +283 -36
- data/rust/host/src/boundary_fuzz/web.rs +56 -8
- data/rust/host/src/checkout.rs +78 -32
- data/rust/host/src/clock.rs +8 -0
- data/rust/host/src/commerce_ir.rs +333 -95
- data/rust/host/src/crypto.rs +33 -0
- data/rust/host/src/dispatch.rs +990 -331
- data/rust/host/src/expr_json.rs +1021 -273
- data/rust/host/src/extension.rs +24 -4
- data/rust/host/src/field_hints.rs +11 -7
- data/rust/host/src/fuzz_support.rs +85 -13
- data/rust/host/src/host.rs +100 -0
- data/rust/host/src/http.rs +22 -0
- data/rust/host/src/ir.rs +326 -16
- data/rust/host/src/journal.rs +277 -176
- data/rust/host/src/lambda_client.rs +219 -53
- data/rust/host/src/lib.rs +16 -4
- data/rust/host/src/log.rs +62 -11
- data/rust/host/src/mint.rs +1153 -326
- data/rust/host/src/needs.rs +185 -44
- data/rust/host/src/payments/keystore.rs +197 -45
- data/rust/host/src/payments/roles.rs +39 -7
- data/rust/host/src/payments/tests.rs +1427 -282
- data/rust/host/src/payments.rs +391 -112
- data/rust/host/src/platform_signin/attack_tests.rs +5 -5
- data/rust/host/src/platform_signin/config.rs +11 -11
- data/rust/host/src/platform_signin/cookie.rs +2 -2
- data/rust/host/src/platform_signin/extension.rs +2 -1
- data/rust/host/src/platform_signin/handler.rs +9 -8
- data/rust/host/src/platform_signin/jti.rs +4 -2
- data/rust/host/src/platform_signin/jwks.rs +2 -1
- data/rust/host/src/platform_signin/jws.rs +2 -37
- data/rust/host/src/platform_signin/known_answer_tests.rs +5 -1
- data/rust/host/src/platform_signin/mode_tests.rs +5 -3
- data/rust/host/src/platform_signin/pages.rs +20 -20
- data/rust/host/src/platform_signin/session.rs +8 -1
- data/rust/host/src/platform_signin/settings.rs +6 -6
- data/rust/host/src/platform_signin/strict_json.rs +12 -9
- data/rust/host/src/platform_signin/verify.rs +41 -41
- data/rust/host/src/platform_signin/wiring_support.rs +13 -18
- data/rust/host/src/presentation.rs +207 -63
- data/rust/host/src/presentation_write.rs +502 -187
- data/rust/host/src/query_step.rs +69 -18
- data/rust/host/src/rate_limit.rs +541 -142
- data/rust/host/src/reference_transform.rs +77 -25
- data/rust/host/src/reference_validate.rs +443 -104
- data/rust/host/src/resend.rs +190 -55
- data/rust/host/src/secrets.rs +116 -21
- data/rust/host/src/server.rs +483 -104
- data/rust/host/src/storage_shape.rs +88 -21
- data/rust/host/src/test_pg.rs +17 -7
- data/rust/host/src/ui_schema.rs +495 -207
- data/rust/host/src/wasm_runner.rs +21 -6
- data/rust/host/src/web/commerce.rs +101 -23
- data/rust/host/src/web/newsletter/cooldown.rs +10 -3
- data/rust/host/src/web/newsletter/template.rs +26 -7
- data/rust/host/src/web/newsletter/tests.rs +112 -23
- data/rust/host/src/web/newsletter.rs +209 -59
- data/rust/host/src/web/newsletter_send.rs +251 -79
- data/rust/host/src/web/registration_receipt/tests.rs +16 -4
- data/rust/host/src/web/registration_receipt.rs +100 -24
- data/rust/host/src/web/registrations.rs +1384 -332
- data/rust/host/src/web/resend_webhook.rs +138 -80
- data/rust/host/src/web.rs +2416 -508
- data/rust/lsp/Cargo.toml +36 -0
- data/rust/lsp/clippy.toml +4 -0
- data/rust/lsp/src/json.rs +29 -22
- data/rust/lsp/src/main.rs +81 -31
- data/rust/lsp/src/outline.rs +23 -7
- data/rust/lsp/src/rpc.rs +17 -4
- data/rust/parser/Cargo.toml +36 -0
- data/rust/parser/clippy.toml +4 -0
- data/rust/parser/src/build/closed_sets.rs +6 -1
- data/rust/parser/src/build/identity.rs +4 -3
- data/rust/parser/src/build/mod.rs +1 -1
- data/rust/parser/src/build/named_pattern.rs +4 -1
- data/rust/parser/src/build/naming.rs +2 -80
- data/rust/parser/src/build/pattern_subset.rs +6 -8
- data/rust/parser/src/build/query_derive.rs +3 -1
- data/rust/parser/src/build/query_inference.rs +14 -5
- data/rust/parser/src/build/read_model.rs +4 -1
- data/rust/parser/src/build/references.rs +4 -3
- data/rust/parser/src/canonical.rs +34 -15
- data/rust/parser/src/emit.rs +187 -105
- data/rust/parser/src/expr/ast_json.rs +134 -42
- data/rust/parser/src/expr/evaluator.rs +27 -9
- data/rust/parser/src/expr/mod.rs +54 -13
- data/rust/parser/src/expr/resolver.rs +299 -92
- data/rust/parser/src/ir.rs +35 -3
- data/rust/parser/src/keywords.rs +7168 -516
- data/rust/parser/src/lex.rs +11 -25
- data/rust/parser/src/lib.rs +1 -0
- data/rust/parser/src/main.rs +65 -6
- data/rust/parser/src/parse/adapter.rs +157 -0
- data/rust/parser/src/parse/aggregate.rs +19 -10
- data/rust/parser/src/parse/chapter.rs +16 -17
- data/rust/parser/src/parse/command.rs +35 -16
- data/rust/parser/src/parse/domain_port.rs +4 -7
- data/rust/parser/src/parse/entity.rs +21 -11
- data/rust/parser/src/parse/hecksagon.rs +10 -4
- data/rust/parser/src/parse/lifecycle.rs +9 -5
- data/rust/parser/src/parse/mod.rs +22 -91
- data/rust/parser/src/parse/needs.rs +21 -12
- data/rust/parser/src/parse/policy.rs +2 -2
- data/rust/parser/src/parse/process_manager.rs +9 -11
- data/rust/parser/src/parse/query.rs +8 -4
- data/rust/parser/src/parse/read_model.rs +57 -16
- data/rust/parser/src/parse/value_object.rs +7 -2
- data/rust/parser/src/parse/world.rs +322 -0
- data/rust/parser/src/ruby_value.rs +7 -6
- data/rust/src/exemplar/json.rs +4 -4
- data/rust/src/exemplar/mutations.rs +18 -0
- data/rust/src/exemplar/read_models.rs +1 -10
- data/rust/src/kernel/attribute_shapes/composite.rs +54 -14
- data/rust/src/kernel/attribute_shapes/list.rs +2 -2
- data/rust/src/kernel/attribute_shapes/mod.rs +8 -8
- data/rust/src/kernel/attribute_shapes/scalar.rs +2 -2
- data/rust/src/kernel/cli.rs +229 -112
- data/rust/src/kernel/dispatch.rs +323 -115
- data/rust/src/kernel/dispatch_guard_tests.rs +327 -65
- data/rust/src/kernel/expr.rs +203 -86
- data/rust/src/kernel/expression_operators/arithmetic.rs +138 -25
- data/rust/src/kernel/expression_operators/comparison.rs +87 -2
- data/rust/src/kernel/expression_operators/enumeration.rs +106 -22
- data/rust/src/kernel/expression_operators/logical.rs +9 -3
- data/rust/src/kernel/expression_operators/membership.rs +3 -1
- data/rust/src/kernel/expression_operators/mod.rs +34 -21
- data/rust/src/kernel/expression_operators/pattern_match.rs +46 -11
- data/rust/src/kernel/expression_operators/positional.rs +84 -30
- data/rust/src/kernel/expression_operators/presence.rs +52 -13
- data/rust/src/kernel/expression_operators/sign_test.rs +3 -1
- data/rust/src/kernel/expression_operators/sized.rs +24 -8
- data/rust/src/kernel/expression_operators/text.rs +120 -27
- data/rust/src/kernel/expression_operators/to_string.rs +10 -4
- data/rust/src/kernel/json.rs +230 -148
- data/rust/src/kernel/mod.rs +46 -33
- data/rust/src/kernel/named_query.rs +63 -15
- data/rust/src/kernel/needs.rs +112 -25
- data/rust/src/kernel/orchestrate.rs +980 -581
- data/rust/src/kernel/orchestrate_guard_tests.rs +538 -140
- data/rust/src/kernel/pattern.rs +107 -34
- data/rust/src/kernel/query_comparators.rs +118 -41
- data/rust/src/kernel/query_ordering.rs +13 -5
- data/rust/src/kernel/read_model.rs +479 -181
- data/rust/src/kernel/reference_lookup.rs +122 -26
- data/rust/src/kernel/repository.rs +293 -66
- data/rust/src/kernel/routing.rs +58 -42
- data/rust/src/kernel/ruby_float.rs +139 -0
- data/rust/src/kernel/vocab/aggregate_dispatch_order.rs +57 -57
- data/rust/src/kernel/vocab/entity_dispatch_order.rs +54 -54
- data/rust/src/kernel/vocab/field_hint.rs +19 -25
- data/rust/src/kernel/vocab/mod.rs +6 -6
- data/rust/src/kernel/vocab/query_comparator.rs +23 -24
- data/rust/src/kernel/vocab/refusal_template.rs +501 -297
- data/rust/src/lib.rs +50 -0
- data/rust/src/main.rs +4 -1
- data/rust/web/Cargo.toml +36 -0
- data/rust/web/clippy.toml +4 -0
- metadata +82 -15
- data/examples/pizzas/bluebook/hecksagon/mock_stripe_payment_adapter.rb +0 -36
- data/lib/hecks/adapters/driven/google_authentication.adapter +0 -3
- data/lib/hecks/adapters/driven/google_authentication.rb +0 -99
- data/lib/hecks/adapters/driven/mock_stripe_adapter.adapter +0 -3
- data/lib/hecks/adapters/driven/mock_stripe_adapter.rb +0 -32
- data/lib/hecks/ports/authentication.port +0 -6
- data/lib/hecks/ports/authentication.rb +0 -67
- data/lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb +0 -255
- data/lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb +0 -22
- data/rust/host/src/approval.rs +0 -652
data/rust/src/lib.rs
CHANGED
|
@@ -1,8 +1,58 @@
|
|
|
1
1
|
//! Library face of the crate, shared by the native/WASI binary and the rust/web browser cdylib.
|
|
2
2
|
//! Std-only, zero Cargo dependencies (ADR 0012); wasm-bindgen lives in rust/web.
|
|
3
|
+
|
|
4
|
+
// Generated code keeps one shape for every domain, so a domain with no arms still has its `match`,
|
|
5
|
+
// a store still has its `new()`, a chapter may hold an aggregate named like itself
|
|
6
|
+
// (identity::identity), and every command gets the same signature whether or not it uses all of
|
|
7
|
+
// it. Clippy's complaints about that shape are not bugs to fix per file; the generators fix the
|
|
8
|
+
// ones that are real (see the emitters in rust/codegen/src).
|
|
9
|
+
#[allow(
|
|
10
|
+
clippy::match_single_binding,
|
|
11
|
+
clippy::match_like_matches_macro,
|
|
12
|
+
clippy::new_without_default,
|
|
13
|
+
clippy::module_inception,
|
|
14
|
+
clippy::needless_pass_by_value,
|
|
15
|
+
clippy::needless_pass_by_ref_mut,
|
|
16
|
+
clippy::unused_self,
|
|
17
|
+
clippy::unnecessary_wraps,
|
|
18
|
+
clippy::trivially_copy_pass_by_ref,
|
|
19
|
+
clippy::no_effect_underscore_binding,
|
|
20
|
+
clippy::missing_const_for_fn,
|
|
21
|
+
clippy::derive_partial_eq_without_eq,
|
|
22
|
+
clippy::single_match_else,
|
|
23
|
+
clippy::needless_continue,
|
|
24
|
+
clippy::implicit_clone,
|
|
25
|
+
clippy::assigning_clones,
|
|
26
|
+
clippy::doc_link_with_quotes,
|
|
27
|
+
clippy::redundant_closure_for_method_calls
|
|
28
|
+
)]
|
|
3
29
|
pub mod generated;
|
|
4
30
|
pub mod kernel;
|
|
5
31
|
|
|
6
32
|
// Test-only: rust/codegen/src/exemplar.rs slices shapes out of this; never in a release build.
|
|
33
|
+
// The files are templates with placeholder bodies, named after their placeholders, so they are
|
|
34
|
+
// neither formatted nor linted as code.
|
|
7
35
|
#[cfg(test)]
|
|
36
|
+
#[rustfmt::skip]
|
|
37
|
+
#[allow(
|
|
38
|
+
clippy::match_single_binding,
|
|
39
|
+
clippy::match_like_matches_macro,
|
|
40
|
+
clippy::new_without_default,
|
|
41
|
+
clippy::ptr_arg,
|
|
42
|
+
clippy::borrow_deref_ref,
|
|
43
|
+
clippy::needless_pass_by_value,
|
|
44
|
+
clippy::needless_pass_by_ref_mut,
|
|
45
|
+
clippy::unused_self,
|
|
46
|
+
clippy::unnecessary_wraps,
|
|
47
|
+
clippy::trivially_copy_pass_by_ref,
|
|
48
|
+
clippy::no_effect_underscore_binding,
|
|
49
|
+
clippy::missing_const_for_fn,
|
|
50
|
+
clippy::derive_partial_eq_without_eq,
|
|
51
|
+
clippy::use_self,
|
|
52
|
+
clippy::uninlined_format_args,
|
|
53
|
+
clippy::redundant_closure_for_method_calls,
|
|
54
|
+
clippy::map_unwrap_or,
|
|
55
|
+
clippy::doc_link_with_quotes,
|
|
56
|
+
unused_mut
|
|
57
|
+
)]
|
|
8
58
|
pub mod exemplar;
|
data/rust/src/main.rs
CHANGED
|
@@ -11,6 +11,9 @@ fn main() {
|
|
|
11
11
|
return;
|
|
12
12
|
}
|
|
13
13
|
let mut input = String::new();
|
|
14
|
-
std::io::stdin().read_to_string(&mut input)
|
|
14
|
+
if let Err(error) = std::io::stdin().read_to_string(&mut input) {
|
|
15
|
+
eprintln!("failed to read stdin: {error}");
|
|
16
|
+
std::process::exit(1);
|
|
17
|
+
}
|
|
15
18
|
println!("{}", rust::kernel::cli::run(&input));
|
|
16
19
|
}
|
data/rust/web/Cargo.toml
CHANGED
|
@@ -16,3 +16,39 @@ crate-type = ["cdylib"]
|
|
|
16
16
|
[dependencies]
|
|
17
17
|
rust = { path = ".." }
|
|
18
18
|
wasm-bindgen = "=0.2.126"
|
|
19
|
+
|
|
20
|
+
# Clippy beyond its defaults: pedantic and nursery, plus the restriction lints that keep a panic
|
|
21
|
+
# out of library code. `hecks gate_run.gate stage=ci only=rust_clippy` makes each of these an error.
|
|
22
|
+
# The same table is in every crate's Cargo.toml; change them together.
|
|
23
|
+
[lints.clippy]
|
|
24
|
+
pedantic = { level = "warn", priority = -1 }
|
|
25
|
+
nursery = { level = "warn", priority = -1 }
|
|
26
|
+
unwrap_used = "warn"
|
|
27
|
+
expect_used = "warn"
|
|
28
|
+
panic = "warn"
|
|
29
|
+
dbg_macro = "warn"
|
|
30
|
+
todo = "warn"
|
|
31
|
+
unimplemented = "warn"
|
|
32
|
+
# Lints that ask for prose or an attribute on every item rather than for better code.
|
|
33
|
+
missing_errors_doc = "allow"
|
|
34
|
+
missing_panics_doc = "allow"
|
|
35
|
+
must_use_candidate = "allow"
|
|
36
|
+
return_self_not_must_use = "allow"
|
|
37
|
+
module_name_repetitions = "allow"
|
|
38
|
+
too_many_lines = "allow"
|
|
39
|
+
too_long_first_doc_paragraph = "allow"
|
|
40
|
+
doc_markdown = "allow"
|
|
41
|
+
# Numeric conversions here are deliberate: JSON numbers are f64 and ids are small.
|
|
42
|
+
cast_possible_truncation = "allow"
|
|
43
|
+
cast_possible_wrap = "allow"
|
|
44
|
+
cast_precision_loss = "allow"
|
|
45
|
+
cast_sign_loss = "allow"
|
|
46
|
+
# Naming heuristics that fire on ordinary short names.
|
|
47
|
+
similar_names = "allow"
|
|
48
|
+
many_single_char_names = "allow"
|
|
49
|
+
struct_field_names = "allow"
|
|
50
|
+
# Heuristics that cost more clarity than they buy here.
|
|
51
|
+
redundant_pub_crate = "allow"
|
|
52
|
+
future_not_send = "allow"
|
|
53
|
+
significant_drop_tightening = "allow"
|
|
54
|
+
match_same_arms = "allow"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: hecks
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 4.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Chris Young
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-10-
|
|
11
|
+
date: 2026-10-23 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: prism
|
|
@@ -35,12 +35,15 @@ executables:
|
|
|
35
35
|
extensions: []
|
|
36
36
|
extra_rdoc_files: []
|
|
37
37
|
files:
|
|
38
|
-
- examples/pizzas/
|
|
38
|
+
- examples/pizzas/adapters/fake_processor.rb
|
|
39
|
+
- examples/pizzas/adapters/payment_signature.rb
|
|
40
|
+
- examples/pizzas/adapters/payment_webhook.rb
|
|
39
41
|
- examples/pizzas/bluebook/pizzas.behaviors
|
|
40
42
|
- examples/pizzas/bluebook/pizzas.bluebook
|
|
41
43
|
- examples/pizzas/bluebook/pizzas.hecksagon
|
|
42
44
|
- examples/pizzas/bluebook/pizzas.world
|
|
43
45
|
- examples/pizzas/bluebook/translations/2-77625c.bluebook
|
|
46
|
+
- examples/pizzas/config.ru
|
|
44
47
|
- examples/pizzas/oidc.json
|
|
45
48
|
- examples/pizzas/pizzas_behaviors.hecksagon
|
|
46
49
|
- exe/hecks
|
|
@@ -54,8 +57,6 @@ files:
|
|
|
54
57
|
- lib/hecks/adapters/driven/d1/connection.rb
|
|
55
58
|
- lib/hecks/adapters/driven/folder.adapter
|
|
56
59
|
- lib/hecks/adapters/driven/folder.rb
|
|
57
|
-
- lib/hecks/adapters/driven/google_authentication.adapter
|
|
58
|
-
- lib/hecks/adapters/driven/google_authentication.rb
|
|
59
60
|
- lib/hecks/adapters/driven/governance_authorization.adapter
|
|
60
61
|
- lib/hecks/adapters/driven/governance_authorization.rb
|
|
61
62
|
- lib/hecks/adapters/driven/heki.adapter
|
|
@@ -79,8 +80,6 @@ files:
|
|
|
79
80
|
- lib/hecks/adapters/driven/memory/outbox_rows.rb
|
|
80
81
|
- lib/hecks/adapters/driven/memory/shared_elements.rb
|
|
81
82
|
- lib/hecks/adapters/driven/memory/shared_elements/values.rb
|
|
82
|
-
- lib/hecks/adapters/driven/mock_stripe_adapter.adapter
|
|
83
|
-
- lib/hecks/adapters/driven/mock_stripe_adapter.rb
|
|
84
83
|
- lib/hecks/adapters/driven/postgres.adapter
|
|
85
84
|
- lib/hecks/adapters/driven/postgres.rb
|
|
86
85
|
- lib/hecks/adapters/driven/postgres/codec.rb
|
|
@@ -242,6 +241,7 @@ files:
|
|
|
242
241
|
- lib/hecks/bluebook/dsl/command_builder/owner.rb
|
|
243
242
|
- lib/hecks/bluebook/dsl/command_builder/rules.rb
|
|
244
243
|
- lib/hecks/bluebook/dsl/const_shim.rb
|
|
244
|
+
- lib/hecks/bluebook/dsl/derivation_words.rb
|
|
245
245
|
- lib/hecks/bluebook/dsl/domain_port_builder.rb
|
|
246
246
|
- lib/hecks/bluebook/dsl/entity_builder.rb
|
|
247
247
|
- lib/hecks/bluebook/dsl/entity_builder/rules.rb
|
|
@@ -337,6 +337,10 @@ files:
|
|
|
337
337
|
- lib/hecks/bluebook/smoke_test.rb
|
|
338
338
|
- lib/hecks/bluebook/synthesizer.rb
|
|
339
339
|
- lib/hecks/bluebook/translation.rb
|
|
340
|
+
- lib/hecks/bluebook/translation_expression.rb
|
|
341
|
+
- lib/hecks/bluebook/translation_expression/evaluator.rb
|
|
342
|
+
- lib/hecks/bluebook/translation_expression/parser.rb
|
|
343
|
+
- lib/hecks/bluebook/translation_plan.rb
|
|
340
344
|
- lib/hecks/bluebook/value_object.rb
|
|
341
345
|
- lib/hecks/cache_dir.rb
|
|
342
346
|
- lib/hecks/canonical_json.rb
|
|
@@ -406,11 +410,45 @@ files:
|
|
|
406
410
|
- lib/hecks/codemod.rb
|
|
407
411
|
- lib/hecks/codemod/runner.rb
|
|
408
412
|
- lib/hecks/codemod/sweep.rb
|
|
413
|
+
- lib/hecks/composer.rb
|
|
414
|
+
- lib/hecks/composer/adapters/claude_composer.adapter
|
|
415
|
+
- lib/hecks/composer/adapters/claude_composer.rb
|
|
416
|
+
- lib/hecks/composer/adapters/fake_agent.adapter
|
|
417
|
+
- lib/hecks/composer/adapters/fake_agent.rb
|
|
418
|
+
- lib/hecks/composer/adapters/jev.adapter
|
|
419
|
+
- lib/hecks/composer/adapters/jev.rb
|
|
420
|
+
- lib/hecks/composer/agent.rb
|
|
421
|
+
- lib/hecks/composer/assistant.rb
|
|
422
|
+
- lib/hecks/composer/behavior_run.rb
|
|
423
|
+
- lib/hecks/composer/bluebook/composer.bluebook
|
|
424
|
+
- lib/hecks/composer/bluebook/composer.hecksagon
|
|
425
|
+
- lib/hecks/composer/board.rb
|
|
426
|
+
- lib/hecks/composer/board_edit.rb
|
|
427
|
+
- lib/hecks/composer/board_edit/command_text.rb
|
|
428
|
+
- lib/hecks/composer/board_edit/source.rb
|
|
429
|
+
- lib/hecks/composer/check.rb
|
|
430
|
+
- lib/hecks/composer/domains.rb
|
|
431
|
+
- lib/hecks/composer/jobs.rb
|
|
432
|
+
- lib/hecks/composer/layout.rb
|
|
433
|
+
- lib/hecks/composer/live.rb
|
|
434
|
+
- lib/hecks/composer/outline.rb
|
|
435
|
+
- lib/hecks/composer/page.html
|
|
436
|
+
- lib/hecks/composer/panels.rb
|
|
437
|
+
- lib/hecks/composer/parse.rb
|
|
438
|
+
- lib/hecks/composer/plain.rb
|
|
439
|
+
- lib/hecks/composer/ports/composer_agent.port
|
|
440
|
+
- lib/hecks/composer/session.rb
|
|
441
|
+
- lib/hecks/composer/toolbox.rb
|
|
442
|
+
- lib/hecks/composer/web.rb
|
|
443
|
+
- lib/hecks/composer/workbench.rb
|
|
444
|
+
- lib/hecks/composer/workspace.rb
|
|
409
445
|
- lib/hecks/construct.rb
|
|
410
446
|
- lib/hecks/corpus.rb
|
|
447
|
+
- lib/hecks/corpus/adapters.rb
|
|
411
448
|
- lib/hecks/corpus/routes.rb
|
|
412
449
|
- lib/hecks/corpus/rust.rb
|
|
413
450
|
- lib/hecks/corpus/sources.rb
|
|
451
|
+
- lib/hecks/corpus/worlds.rb
|
|
414
452
|
- lib/hecks/deploy/bluebook/deploy.bluebook
|
|
415
453
|
- lib/hecks/deploy/bluebook/deploy.hecksagon
|
|
416
454
|
- lib/hecks/deploy/oidc.json
|
|
@@ -453,6 +491,7 @@ files:
|
|
|
453
491
|
- lib/hecks/forms/record_renderer.rb
|
|
454
492
|
- lib/hecks/forms/record_table.rb
|
|
455
493
|
- lib/hecks/forms/reference_options.rb
|
|
494
|
+
- lib/hecks/forms/rule_words.rb
|
|
456
495
|
- lib/hecks/forms/text_shape.rb
|
|
457
496
|
- lib/hecks/forms/value_object_shape.rb
|
|
458
497
|
- lib/hecks/fqn.rb
|
|
@@ -593,6 +632,7 @@ files:
|
|
|
593
632
|
- lib/hecks/grammar/translation.oidc.json
|
|
594
633
|
- lib/hecks/hecks/adapters/bluebook_report.rb
|
|
595
634
|
- lib/hecks/hecks/adapters/codebase/codemods.rb
|
|
635
|
+
- lib/hecks/hecks/adapters/codebase/composing.rb
|
|
596
636
|
- lib/hecks/hecks/adapters/codebase/conformance.rb
|
|
597
637
|
- lib/hecks/hecks/adapters/codebase/corpus_tasks.rb
|
|
598
638
|
- lib/hecks/hecks/adapters/codebase/gate.rb
|
|
@@ -691,6 +731,7 @@ files:
|
|
|
691
731
|
- lib/hecks/hecks/adapters/world_clearing.rb
|
|
692
732
|
- lib/hecks/hecks/codebase.behaviors
|
|
693
733
|
- lib/hecks/hecks/codebase.bluebook
|
|
734
|
+
- lib/hecks/hecks/composer.behaviors
|
|
694
735
|
- lib/hecks/hecks/context_map.hecksagon
|
|
695
736
|
- lib/hecks/hecks/custodian.behaviors
|
|
696
737
|
- lib/hecks/hecks/custodian.bluebook
|
|
@@ -749,8 +790,6 @@ files:
|
|
|
749
790
|
- lib/hecks/ports/agent.port
|
|
750
791
|
- lib/hecks/ports/agent.rb
|
|
751
792
|
- lib/hecks/ports/agent/answers.rb
|
|
752
|
-
- lib/hecks/ports/authentication.port
|
|
753
|
-
- lib/hecks/ports/authentication.rb
|
|
754
793
|
- lib/hecks/ports/authorization.port
|
|
755
794
|
- lib/hecks/ports/authorization.rb
|
|
756
795
|
- lib/hecks/ports/clock.port
|
|
@@ -820,12 +859,11 @@ files:
|
|
|
820
859
|
- lib/hecks/ports/persistence/plugins/era/postgres_era/sagas.rb
|
|
821
860
|
- lib/hecks/ports/persistence/plugins/era/storage_shape.rb
|
|
822
861
|
- lib/hecks/ports/persistence/plugins/era/translation.rb
|
|
823
|
-
- lib/hecks/ports/persistence/plugins/era/translation/approval_file.rb
|
|
824
862
|
- lib/hecks/ports/persistence/plugins/era/translation/audit.rb
|
|
825
|
-
- lib/hecks/ports/persistence/plugins/era/translation/audit/approval_digest.rb
|
|
826
863
|
- lib/hecks/ports/persistence/plugins/era/translation/audit/layer_one.rb
|
|
827
864
|
- lib/hecks/ports/persistence/plugins/era/translation/audit/layer_two.rb
|
|
828
865
|
- lib/hecks/ports/persistence/plugins/era/translation/audit/unfed_report.rb
|
|
866
|
+
- lib/hecks/ports/persistence/plugins/era/translation/expression_sql.rb
|
|
829
867
|
- lib/hecks/ports/persistence/plugins/era/translation/reattest.rb
|
|
830
868
|
- lib/hecks/ports/persistence/plugins/era/translation/rule_compiler.rb
|
|
831
869
|
- lib/hecks/ports/persistence/plugins/era/translation/scaffold.rb
|
|
@@ -1064,6 +1102,7 @@ files:
|
|
|
1064
1102
|
- lib/hecks/projections/diagrams/structure.rb
|
|
1065
1103
|
- lib/hecks/projections/glossary.rb
|
|
1066
1104
|
- lib/hecks/projections/glossary/entries.rb
|
|
1105
|
+
- lib/hecks/projections/glossary/groups.rb
|
|
1067
1106
|
- lib/hecks/projections/glossary/html.rb
|
|
1068
1107
|
- lib/hecks/projections/glossary/html/page.rb
|
|
1069
1108
|
- lib/hecks/projections/glossary/html/parser.rb
|
|
@@ -1076,6 +1115,9 @@ files:
|
|
|
1076
1115
|
- lib/hecks/projections/glossary/sections.rb
|
|
1077
1116
|
- lib/hecks/projections/glossary/sensitivity.rb
|
|
1078
1117
|
- lib/hecks/projections/glossary/sentences.rb
|
|
1118
|
+
- lib/hecks/projections/glossary/sentences/actions.rb
|
|
1119
|
+
- lib/hecks/projections/glossary/sentences/paths.rb
|
|
1120
|
+
- lib/hecks/projections/glossary/sentences/queries.rb
|
|
1079
1121
|
- lib/hecks/projections/glossary/sentences/value_objects.rb
|
|
1080
1122
|
- lib/hecks/projections/glossary/slugs.rb
|
|
1081
1123
|
- lib/hecks/projections/ir.rb
|
|
@@ -1083,6 +1125,7 @@ files:
|
|
|
1083
1125
|
- lib/hecks/projections/model/deviations.rb
|
|
1084
1126
|
- lib/hecks/projections/oidc.rb
|
|
1085
1127
|
- lib/hecks/projections/parser_table.rb
|
|
1128
|
+
- lib/hecks/projections/plain_english.rb
|
|
1086
1129
|
- lib/hecks/projections/reference.rb
|
|
1087
1130
|
- lib/hecks/projections/rust_vocabulary.rb
|
|
1088
1131
|
- lib/hecks/projections/rust_vocabulary/arguments.rb
|
|
@@ -1231,6 +1274,8 @@ files:
|
|
|
1231
1274
|
- lib/hecks/projections/site/table/row_builder.rb
|
|
1232
1275
|
- lib/hecks/projections/site/table/row_defaults.rb
|
|
1233
1276
|
- lib/hecks/projections/statements.rb
|
|
1277
|
+
- lib/hecks/projections/statements/actions.rb
|
|
1278
|
+
- lib/hecks/projections/statements/relationships.rb
|
|
1234
1279
|
- lib/hecks/projections/vocabulary.rb
|
|
1235
1280
|
- lib/hecks/projector.rb
|
|
1236
1281
|
- lib/hecks/projector/cli_audience.rb
|
|
@@ -1247,9 +1292,11 @@ files:
|
|
|
1247
1292
|
- lib/hecks/projector/docs_projector/behaviour.rb
|
|
1248
1293
|
- lib/hecks/projector/docs_projector/closing.rb
|
|
1249
1294
|
- lib/hecks/projector/exporter.rb
|
|
1295
|
+
- lib/hecks/projector/exporter/adapters.rb
|
|
1250
1296
|
- lib/hecks/projector/exporter/bindings.rb
|
|
1251
1297
|
- lib/hecks/projector/exporter/capability_values.rb
|
|
1252
1298
|
- lib/hecks/projector/exporter/translations.rb
|
|
1299
|
+
- lib/hecks/projector/exporter/worlds.rb
|
|
1253
1300
|
- lib/hecks/projector/ir_projector.rb
|
|
1254
1301
|
- lib/hecks/projector/narrate_projector.rb
|
|
1255
1302
|
- lib/hecks/projector/narrate_projector/commands.rb
|
|
@@ -1518,6 +1565,7 @@ files:
|
|
|
1518
1565
|
- lib/hecks/rust_build/wasm.rb
|
|
1519
1566
|
- lib/hecks/rust_build/wasm_browser.rb
|
|
1520
1567
|
- lib/hecks/rust_build/write_if_changed.rb
|
|
1568
|
+
- lib/hecks/rust_format.rb
|
|
1521
1569
|
- lib/hecks/served_options.rb
|
|
1522
1570
|
- lib/hecks/site/bluebook/site.bluebook
|
|
1523
1571
|
- lib/hecks/site/bluebook/site.hecksagon
|
|
@@ -1637,9 +1685,9 @@ files:
|
|
|
1637
1685
|
- lib/rubocop/cop/hecks/symbol_string_key_mix.rb
|
|
1638
1686
|
- lib/rubocop/cop/hecks/thread_shared_ivar_mutation.rb
|
|
1639
1687
|
- lib/rubocop/cop/hecks/untyped_raise.rb
|
|
1640
|
-
- prebuilt/
|
|
1641
|
-
- prebuilt/
|
|
1642
|
-
- prebuilt/verdicts-
|
|
1688
|
+
- prebuilt/02c09c73b272c1fb5a9ae6d87bb5e5e529208e00f6b4b597dc2c0fd70a9c0964.marshal
|
|
1689
|
+
- prebuilt/bb84a835cf6a15136bad5ca03aa5bf93a5b92f5f72444618d3ef2412b987fb32.marshal
|
|
1690
|
+
- prebuilt/verdicts-f1f10da14c8e8f01b4c9b7e3e2d74be8cd2bf4676364ed17fa16975d2a076d75.json
|
|
1643
1691
|
- qa/settings.yml
|
|
1644
1692
|
- rust/.cargo/config.toml
|
|
1645
1693
|
- rust/.cargo/mutants.toml
|
|
@@ -1650,6 +1698,8 @@ files:
|
|
|
1650
1698
|
- rust/build/.gitignore
|
|
1651
1699
|
- rust/build/Cargo.lock
|
|
1652
1700
|
- rust/build/Cargo.toml
|
|
1701
|
+
- rust/build/clippy.toml
|
|
1702
|
+
- rust/build/src/adapters_pass.rs
|
|
1653
1703
|
- rust/build/src/binding_pass.rs
|
|
1654
1704
|
- rust/build/src/build_artifact.rs
|
|
1655
1705
|
- rust/build/src/cargo_sync.rs
|
|
@@ -1659,14 +1709,18 @@ files:
|
|
|
1659
1709
|
- rust/build/src/reserved_names.rs
|
|
1660
1710
|
- rust/build/src/resolve.rs
|
|
1661
1711
|
- rust/build/src/root.rs
|
|
1712
|
+
- rust/build/src/rustfmt.rs
|
|
1662
1713
|
- rust/build/src/seams_pass.rs
|
|
1663
1714
|
- rust/build/src/subprocess.rs
|
|
1664
1715
|
- rust/build/src/tmp.rs
|
|
1665
1716
|
- rust/build/src/translation_pass.rs
|
|
1717
|
+
- rust/build/src/world_pass.rs
|
|
1718
|
+
- rust/clippy.toml
|
|
1666
1719
|
- rust/codegen/.cargo/config.toml
|
|
1667
1720
|
- rust/codegen/.gitignore
|
|
1668
1721
|
- rust/codegen/Cargo.lock
|
|
1669
1722
|
- rust/codegen/Cargo.toml
|
|
1723
|
+
- rust/codegen/clippy.toml
|
|
1670
1724
|
- rust/codegen/src/asks.rs
|
|
1671
1725
|
- rust/codegen/src/attr.rs
|
|
1672
1726
|
- rust/codegen/src/bridging.rs
|
|
@@ -1678,6 +1732,7 @@ files:
|
|
|
1678
1732
|
- rust/codegen/src/expr_emitter.rs
|
|
1679
1733
|
- rust/codegen/src/fielded.rs
|
|
1680
1734
|
- rust/codegen/src/hecks_naming.rs
|
|
1735
|
+
- rust/codegen/src/hecks_naming_tests.rs
|
|
1681
1736
|
- rust/codegen/src/json.rs
|
|
1682
1737
|
- rust/codegen/src/json_codec.rs
|
|
1683
1738
|
- rust/codegen/src/literal.rs
|
|
@@ -1703,10 +1758,11 @@ files:
|
|
|
1703
1758
|
- rust/host/Cargo.lock
|
|
1704
1759
|
- rust/host/Cargo.toml
|
|
1705
1760
|
- rust/host/HECKS_RELEASE
|
|
1761
|
+
- rust/host/clippy.toml
|
|
1706
1762
|
- rust/host/rds-ca-bundle.pem
|
|
1707
1763
|
- rust/host/src/api.rs
|
|
1708
|
-
- rust/host/src/approval.rs
|
|
1709
1764
|
- rust/host/src/auth.rs
|
|
1765
|
+
- rust/host/src/b64.rs
|
|
1710
1766
|
- rust/host/src/bin/expr_harness.rs
|
|
1711
1767
|
- rust/host/src/bin/lineage_harness.rs
|
|
1712
1768
|
- rust/host/src/bin/mint_harness.rs
|
|
@@ -1719,12 +1775,16 @@ files:
|
|
|
1719
1775
|
- rust/host/src/boundary_fuzz/server.rs
|
|
1720
1776
|
- rust/host/src/boundary_fuzz/web.rs
|
|
1721
1777
|
- rust/host/src/checkout.rs
|
|
1778
|
+
- rust/host/src/clock.rs
|
|
1722
1779
|
- rust/host/src/commerce_ir.rs
|
|
1780
|
+
- rust/host/src/crypto.rs
|
|
1723
1781
|
- rust/host/src/dispatch.rs
|
|
1724
1782
|
- rust/host/src/expr_json.rs
|
|
1725
1783
|
- rust/host/src/extension.rs
|
|
1726
1784
|
- rust/host/src/field_hints.rs
|
|
1727
1785
|
- rust/host/src/fuzz_support.rs
|
|
1786
|
+
- rust/host/src/host.rs
|
|
1787
|
+
- rust/host/src/http.rs
|
|
1728
1788
|
- rust/host/src/ir.rs
|
|
1729
1789
|
- rust/host/src/journal.rs
|
|
1730
1790
|
- rust/host/src/lambda_client.rs
|
|
@@ -1788,6 +1848,7 @@ files:
|
|
|
1788
1848
|
- rust/lsp/Cargo.lock
|
|
1789
1849
|
- rust/lsp/Cargo.toml
|
|
1790
1850
|
- rust/lsp/README.md
|
|
1851
|
+
- rust/lsp/clippy.toml
|
|
1791
1852
|
- rust/lsp/src/diagnostics.rs
|
|
1792
1853
|
- rust/lsp/src/json.rs
|
|
1793
1854
|
- rust/lsp/src/main.rs
|
|
@@ -1797,6 +1858,7 @@ files:
|
|
|
1797
1858
|
- rust/parser/.gitignore
|
|
1798
1859
|
- rust/parser/Cargo.lock
|
|
1799
1860
|
- rust/parser/Cargo.toml
|
|
1861
|
+
- rust/parser/clippy.toml
|
|
1800
1862
|
- rust/parser/fuzz/.gitignore
|
|
1801
1863
|
- rust/parser/fuzz/Cargo.lock
|
|
1802
1864
|
- rust/parser/fuzz/Cargo.toml
|
|
@@ -1824,7 +1886,9 @@ files:
|
|
|
1824
1886
|
- rust/parser/src/ir.rs
|
|
1825
1887
|
- rust/parser/src/keywords.rs
|
|
1826
1888
|
- rust/parser/src/lex.rs
|
|
1889
|
+
- rust/parser/src/lib.rs
|
|
1827
1890
|
- rust/parser/src/main.rs
|
|
1891
|
+
- rust/parser/src/parse/adapter.rs
|
|
1828
1892
|
- rust/parser/src/parse/aggregate.rs
|
|
1829
1893
|
- rust/parser/src/parse/chapter.rs
|
|
1830
1894
|
- rust/parser/src/parse/command.rs
|
|
@@ -1840,6 +1904,7 @@ files:
|
|
|
1840
1904
|
- rust/parser/src/parse/query.rs
|
|
1841
1905
|
- rust/parser/src/parse/read_model.rs
|
|
1842
1906
|
- rust/parser/src/parse/value_object.rs
|
|
1907
|
+
- rust/parser/src/parse/world.rs
|
|
1843
1908
|
- rust/parser/src/ruby_value.rs
|
|
1844
1909
|
- rust/src/exemplar/commands.rs
|
|
1845
1910
|
- rust/src/exemplar/constraints.rs
|
|
@@ -1887,6 +1952,7 @@ files:
|
|
|
1887
1952
|
- rust/src/kernel/reference_lookup.rs
|
|
1888
1953
|
- rust/src/kernel/repository.rs
|
|
1889
1954
|
- rust/src/kernel/routing.rs
|
|
1955
|
+
- rust/src/kernel/ruby_float.rs
|
|
1890
1956
|
- rust/src/kernel/vocab/aggregate_dispatch_order.rs
|
|
1891
1957
|
- rust/src/kernel/vocab/entity_dispatch_order.rs
|
|
1892
1958
|
- rust/src/kernel/vocab/field_hint.rs
|
|
@@ -1898,6 +1964,7 @@ files:
|
|
|
1898
1964
|
- rust/web/.gitignore
|
|
1899
1965
|
- rust/web/Cargo.lock
|
|
1900
1966
|
- rust/web/Cargo.toml
|
|
1967
|
+
- rust/web/clippy.toml
|
|
1901
1968
|
- rust/web/src/lib.rs
|
|
1902
1969
|
homepage: https://github.com/heckslabs/hecks
|
|
1903
1970
|
licenses:
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
# Driving adapter standing in for a Stripe webhook handler: boots Pizzas and calls
|
|
4
|
-
# Dispatcher#dispatch_port, which translates the payment into PizzaPaymentReceived.
|
|
5
|
-
#
|
|
6
|
-
# examples/pizzas/bluebook/hecksagon/mock_stripe_payment_adapter.rb
|
|
7
|
-
|
|
8
|
-
$LOAD_PATH.unshift File.expand_path("../../../../lib", __dir__)
|
|
9
|
-
|
|
10
|
-
require "hecks"
|
|
11
|
-
|
|
12
|
-
DOMAIN = File.expand_path("../..", __dir__)
|
|
13
|
-
RUNTIME = Hecks.boot(DOMAIN)
|
|
14
|
-
|
|
15
|
-
# Unique per run: identity is never minted, so a repeated name would be refused as AlreadyExists.
|
|
16
|
-
NAME = "StripeDemoMargherita-#{Process.pid}-#{rand(10_000)}".freeze
|
|
17
|
-
|
|
18
|
-
# Set the stage: an order Purchase's `given` rules will accept.
|
|
19
|
-
order = Order.create_pizza(name: { value: NAME }, pizza: { price_cents: { cents: 1200 }, size: { value: "large" } })
|
|
20
|
-
order.add_topping(topping: { value: "Basil" }, amount: { value: 3 })
|
|
21
|
-
|
|
22
|
-
puts "Before payment: #{order.status}, customer=#{order.customer_name.inspect}"
|
|
23
|
-
|
|
24
|
-
# The webhook: a real handler would verify a Stripe signature; a reference is always a bare id.
|
|
25
|
-
RUNTIME.dispatch_port(
|
|
26
|
-
"Pizzas", "Order", "PaymentGateway", "Receive",
|
|
27
|
-
flat: {
|
|
28
|
-
name: NAME,
|
|
29
|
-
customer_name: { value: "Chris" },
|
|
30
|
-
amount: { cents: 1200 }
|
|
31
|
-
}
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
sold = Order.find(NAME)
|
|
35
|
-
puts "After payment: #{sold.status}, customer=#{sold.customer_name.to_h}"
|
|
36
|
-
puts "Events: #{sold.events.map(&:name).join(", ")}"
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
require "securerandom"
|
|
2
|
-
|
|
3
|
-
require_relative "../../ports/authentication"
|
|
4
|
-
|
|
5
|
-
module Hecks
|
|
6
|
-
module Adapters
|
|
7
|
-
# Google's OIDC handshake — the `authentication` port's adapter for Google
|
|
8
|
-
# sign-in, via `oauth2` (code exchange) and `google-id-token` (verification).
|
|
9
|
-
#
|
|
10
|
-
# `oauth2`/`google-id-token` load lazily, inside the methods that use
|
|
11
|
-
# them, so a domain that never binds this adapter never needs them installed.
|
|
12
|
-
#
|
|
13
|
-
# `GOOGLE_CLIENT_ID`/`GOOGLE_CLIENT_SECRET`/`GOOGLE_REDIRECT_URI` have no
|
|
14
|
-
# defaults, on purpose: a half-configured login should refuse to boot.
|
|
15
|
-
module GoogleAuthentication
|
|
16
|
-
ISSUER = "https://accounts.google.com".freeze
|
|
17
|
-
|
|
18
|
-
module_function
|
|
19
|
-
|
|
20
|
-
# Builds the OAuth2 client for Google's token endpoints.
|
|
21
|
-
#
|
|
22
|
-
# @return [OAuth2::Client] a client configured for Google's OAuth2/OIDC endpoints
|
|
23
|
-
# @raise [KeyError] if `GOOGLE_CLIENT_ID` or `GOOGLE_CLIENT_SECRET` is unset
|
|
24
|
-
def client
|
|
25
|
-
require "oauth2"
|
|
26
|
-
OAuth2::Client.new(
|
|
27
|
-
ENV.fetch("GOOGLE_CLIENT_ID"), ENV.fetch("GOOGLE_CLIENT_SECRET"),
|
|
28
|
-
site: "https://oauth2.googleapis.com",
|
|
29
|
-
authorize_url: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
30
|
-
token_url: "/token"
|
|
31
|
-
)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# The URL to send a browser to, carrying a fresh CSRF `state` the caller
|
|
35
|
-
# must stash (typically in a session) and check again in `verify`.
|
|
36
|
-
#
|
|
37
|
-
# @return [Array(String, String)] the URL to send the browser to, and the fresh CSRF
|
|
38
|
-
# `state` embedded in it
|
|
39
|
-
# @raise [KeyError] if `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` or
|
|
40
|
-
# `GOOGLE_REDIRECT_URI` is unset
|
|
41
|
-
def authorization_url
|
|
42
|
-
state = SecureRandom.hex(24)
|
|
43
|
-
url = client.auth_code.authorize_url(
|
|
44
|
-
redirect_uri: ENV.fetch("GOOGLE_REDIRECT_URI"),
|
|
45
|
-
scope: "openid email profile",
|
|
46
|
-
state: state
|
|
47
|
-
)
|
|
48
|
-
[url, state]
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# Exchanges `code` for tokens and verifies the ID token against Google's
|
|
52
|
-
# JWKS; `email_verified` tells a caller if Google actually checked the email.
|
|
53
|
-
# @param code [String] the authorization code the provider sent back
|
|
54
|
-
# @param state [String, nil] the state parameter the provider returned; nil is refused
|
|
55
|
-
# @param expected_state [String, nil] the state `authorization_url` handed out before
|
|
56
|
-
# the redirect; nil is refused
|
|
57
|
-
# @return [Hash{Symbol => Object}] `issuer:` and `subject:` (String), `email:` (String,
|
|
58
|
-
# or nil if the token carries none), `email_verified:` (Boolean)
|
|
59
|
-
# @raise [Ports::Authentication::ValidationError] if the state check, code exchange, or
|
|
60
|
-
# ID token verification fails
|
|
61
|
-
# @raise [KeyError] if `GOOGLE_CLIENT_ID` or `GOOGLE_REDIRECT_URI` is unset, or a
|
|
62
|
-
# verified token lacks an `iss` or `sub` claim
|
|
63
|
-
def verify(code:, state:, expected_state:)
|
|
64
|
-
# Both requires happen up front: the rescue below matches
|
|
65
|
-
# GoogleIDToken::ValidationError, resolved only when caught, so
|
|
66
|
-
# requiring it lazily after an OAuth2::Error would mask the real failure.
|
|
67
|
-
require "oauth2"
|
|
68
|
-
require "google-id-token"
|
|
69
|
-
|
|
70
|
-
raise Ports::Authentication::ValidationError, "state mismatch" unless state && expected_state && state == expected_state
|
|
71
|
-
|
|
72
|
-
identity(GoogleIDToken::Validator.new.check(exchange(code), ENV.fetch("GOOGLE_CLIENT_ID")))
|
|
73
|
-
rescue OAuth2::Error, GoogleIDToken::ValidationError => e
|
|
74
|
-
raise Ports::Authentication::ValidationError, e.message
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
# Exchanges an authorization code for the provider's raw ID token.
|
|
78
|
-
#
|
|
79
|
-
# @param code [String] the authorization code the provider sent back
|
|
80
|
-
# @return [String] the unverified ID token
|
|
81
|
-
# @raise [Ports::Authentication::ValidationError] if the response carries no ID token
|
|
82
|
-
def exchange(code)
|
|
83
|
-
token = client.auth_code.get_token(code, redirect_uri: ENV.fetch("GOOGLE_REDIRECT_URI"))
|
|
84
|
-
token.params["id_token"] or raise Ports::Authentication::ValidationError, "no id_token in the response"
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# Reads the identity claims out of a verified ID token payload.
|
|
88
|
-
#
|
|
89
|
-
# @param payload [Hash{String => Object}] the verified token claims
|
|
90
|
-
# @return [Hash{Symbol => Object}] the same shape `verify` returns
|
|
91
|
-
def identity(payload)
|
|
92
|
-
{
|
|
93
|
-
issuer: payload.fetch("iss"), subject: payload.fetch("sub"),
|
|
94
|
-
email: payload["email"], email_verified: [true, "true"].include?(payload["email_verified"])
|
|
95
|
-
}
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
end
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Hecks
|
|
4
|
-
module Adapters
|
|
5
|
-
# A network-free stand-in for a Checkout-Session-style payment adapter, matching it by
|
|
6
|
-
# method shape alone. The returned URL carries `registration_id`, as webhook metadata would.
|
|
7
|
-
class MockStripeAdapter
|
|
8
|
-
# Accepts and discards the shared adapter constructor arguments; this adapter holds no
|
|
9
|
-
# state of its own.
|
|
10
|
-
#
|
|
11
|
-
# @param aggregate [Bluebook::Aggregate, nil] accepted for the shared adapter
|
|
12
|
-
# constructor shape and ignored
|
|
13
|
-
# @param settings [Hash] accepted for the shared adapter constructor shape and ignored
|
|
14
|
-
# @param root [String, nil] accepted for the shared adapter constructor shape and ignored
|
|
15
|
-
def initialize(aggregate: nil, settings: {}, root: nil); end
|
|
16
|
-
|
|
17
|
-
# Builds a fake checkout URL carrying `registration_id`, standing in for a real
|
|
18
|
-
# Checkout-Session call.
|
|
19
|
-
#
|
|
20
|
-
# @param event [Object] the record data a real adapter would read; never read here
|
|
21
|
-
# @param registration_id [String] embedded in the returned URL, never read otherwise
|
|
22
|
-
# @param success_url [String] the base URL to redirect a successful payer to
|
|
23
|
-
# @param cancel_url [String] accepted for the shared call shape and never read
|
|
24
|
-
# @return [String] `success_url` with `mock_checkout=1` and `mock_registration_id`
|
|
25
|
-
# query parameters appended
|
|
26
|
-
def create_session(event:, registration_id:, success_url:, cancel_url:)
|
|
27
|
-
separator = success_url.include?("?") ? "&" : "?"
|
|
28
|
-
"#{success_url}#{separator}mock_checkout=1&mock_registration_id=#{registration_id}"
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|