hecks 3.0.4 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/exe/hecks +25 -7
- data/lib/hecks/adapters/driven/lambda/client.rb +1 -1
- data/lib/hecks/adapters/driven/lambda.rb +1 -1
- data/lib/hecks/adapters/driven/tenant_provisioner.rb +2 -2
- data/lib/hecks/bluebook/dsl/hecksagon_builder.rb +59 -32
- data/lib/hecks/bluebook/hexagon.rb +45 -25
- data/lib/hecks/bluebook/model_check.rb +7 -7
- data/lib/hecks/chapters.rb +31 -3
- data/lib/hecks/cli/check_era.rb +1 -1
- data/lib/hecks/cli/console.rb +24 -8
- data/lib/hecks/cli/deploy_template_diff.rb +1 -1
- data/lib/hecks/cli/doc_coverage.rb +1 -1
- data/lib/hecks/cli/domain_stub.rb +128 -0
- data/lib/hecks/cli/interview_draft.rb +246 -0
- data/lib/hecks/cli/model_check.rb +1 -1
- data/lib/hecks/cli/project_cli.rb +69 -18
- data/lib/hecks/cli/reference.rb +2 -1
- data/lib/hecks/cli/refresh_rspec_runtime_baseline.rb +1 -1
- data/lib/hecks/cli/seed_semantics_corpus.rb +38 -9
- data/lib/hecks/cli/spec_example.rb +1 -1
- data/lib/hecks/cli/stress_concurrency_specs.rb +14 -5
- data/lib/hecks/corpus.rb +11 -8
- data/lib/hecks/deploy/bluebook/deploy.bluebook +85 -12
- data/lib/hecks/deploy/oidc.json +5 -0
- data/lib/hecks/doc/reference.rb +4 -3
- data/lib/hecks/doors/cli_door.rb +13 -13
- data/lib/hecks/doors/cli_runner.rb +52 -32
- data/lib/hecks/doors/launcher_options.rb +23 -5
- data/lib/hecks/doors/mcp_door.rb +40 -18
- data/lib/hecks/doors/mcp_door_scope.rb +244 -24
- data/lib/hecks/doors.rb +1 -1
- data/lib/hecks/embryonaut_bluebook.rb +2 -2
- data/lib/hecks/forms/banking_presentation.rb +1 -1
- data/lib/hecks/framework/bluebook/compliance.bluebook +1 -1
- data/lib/hecks/framework/bluebook/console_settings.bluebook +1 -1
- data/lib/hecks/framework/bluebook/framework.hecksagon +4 -4
- data/lib/hecks/framework.rb +1 -1
- data/lib/hecks/fuzzing/combination_miner.rb +1 -1
- data/lib/hecks/fuzzing/concurrent_dispatch.rb +1 -1
- data/lib/hecks/fuzzing/differential.rb +4 -2
- data/lib/hecks/fuzzing/era_boundary.rb +1 -1
- data/lib/hecks/fuzzing/form_census.rb +2 -2
- data/lib/hecks/fuzzing/generated_domain_check.rb +1 -1
- data/lib/hecks/fuzzing/isolated_boot.rb +10 -3
- data/lib/hecks/fuzzing/persistence_parity.rb +2 -2
- data/lib/hecks/fuzzing/target_capabilities.rb +3 -3
- data/lib/hecks/gate/stages.yml +8 -4
- data/lib/hecks/grammar/grammar.hecksagon +2 -2
- data/lib/hecks/hecks/adapters/deploy_toolchain.rb +4 -4
- data/lib/hecks/hecks/adapters/host_http.rb +4 -3
- data/lib/hecks/hecks/adapters/local_files.rb +59 -0
- data/lib/hecks/hecks/adapters/site_toolchain.adapter +7 -0
- data/lib/hecks/hecks/adapters/site_toolchain.rb +54 -0
- data/lib/hecks/hecks/codebase.bluebook +4 -3
- data/lib/hecks/hecks/context_map.hecksagon +2 -2
- data/lib/hecks/hecks/custodian.bluebook +45 -3
- data/lib/hecks/hecks/hecks.hecksagon +10 -4
- data/lib/hecks/hecks/hecks.world +7 -4
- data/lib/hecks/hecks/site.behaviors +17 -0
- data/lib/hecks/hecks/site.world +10 -0
- data/lib/hecks/language/bluebook/bluebook.hecksagon +1 -1
- data/lib/hecks/language/hecksagon/hecksagon.bluebook +24 -47
- data/lib/hecks/ports/persistence/plugins/era/era_check.rb +4 -4
- data/lib/hecks/ports/persistence/plugins/era/postgres_era.rb +2 -1
- data/lib/hecks/projections/deploy/box/settings.rb +248 -0
- data/lib/hecks/projections/deploy/box/templates/box.yaml.tmpl +267 -0
- data/lib/hecks/projections/deploy/box/templates/deploy-box.sh.tmpl +70 -0
- data/lib/hecks/projections/deploy/box/templates/fetch-secrets.sh +21 -0
- data/lib/hecks/projections/deploy/box/templates/rds.yaml.tmpl +165 -0
- data/lib/hecks/projections/deploy/box/templates/render-compose.sh.tmpl +43 -0
- data/lib/hecks/projections/deploy/box.rb +387 -0
- data/lib/hecks/projections/deploy/fargate/cdn.rb +13 -1
- data/lib/hecks/projections/deploy/fargate.rb +1 -1
- data/lib/hecks/projections/deploy/lambda.rb +11 -10
- data/lib/hecks/projections/deploy/scripts/hosting.mk.tmpl +1 -1
- data/lib/hecks/projections/diagrams.rb +2 -2
- data/lib/hecks/projections/site/edge/behaviours.rb +107 -0
- data/lib/hecks/projections/site/edge/checks.rb +137 -0
- data/lib/hecks/projections/site/edge/pattern.rb +50 -0
- data/lib/hecks/projections/site/edge/rules.rb +128 -0
- data/lib/hecks/projections/site/edge.rb +136 -0
- data/lib/hecks/projections/site/regions.rb +44 -0
- data/lib/hecks/projections/site/routes_ts.rb +284 -0
- data/lib/hecks/projections/site/site_cdn.rb +78 -0
- data/lib/hecks/projections/site/table/checks.rb +124 -0
- data/lib/hecks/projections/site/table/row_builder.rb +155 -0
- data/lib/hecks/projections/site/table.rb +98 -0
- data/lib/hecks/projections.rb +2 -0
- data/lib/hecks/projector/cli_projector.rb +172 -95
- data/lib/hecks/quality_control/adapters/agent.adapter +1 -1
- data/lib/hecks/quality_control/adapters/agent.rb +2 -2
- data/lib/hecks/quality_control/cli/qa_concurrency_racer.rb +3 -3
- data/lib/hecks/quality_control/cli/qa_discover_external_domains.rb +8 -8
- data/lib/hecks/quality_control/cli/qa_domain_novelty.rb +3 -3
- data/lib/hecks/quality_control/cli/qa_generated_domains.rb +4 -4
- data/lib/hecks/quality_control/cli/qa_log_bug.rb +2 -2
- data/lib/hecks/quality_control/cli/qa_mine_combinations.rb +6 -5
- data/lib/hecks/quality_control/cli/qa_postgres_migrate.rb +2 -2
- data/lib/hecks/quality_control/cli/qa_postgres_role.rb +5 -5
- data/lib/hecks/quality_control/cli/qa_pr_check.rb +3 -3
- data/lib/hecks/quality_control/cli/qa_sweep/all_mode.rb +3 -3
- data/lib/hecks/quality_control/cli/qa_sweep/checks.rb +2 -2
- data/lib/hecks/quality_control/cli/qa_sweep.rb +10 -9
- data/lib/hecks/quality_control/cli/qa_tick.rb +3 -3
- data/lib/hecks/quality_control/quality_control.bluebook +18 -18
- data/lib/hecks/quality_control/quality_control.hecksagon +1 -1
- data/lib/hecks/runtime/command_interpreter.rb +2 -0
- data/lib/hecks/runtime/interpreting.rb +21 -0
- data/lib/hecks/runtime/invocation.rb +5 -3
- data/lib/hecks/runtime/registry/verification.rb +15 -29
- data/lib/hecks/runtime/registry.rb +14 -20
- data/lib/hecks/rust_build/append_optionals.rb +79 -0
- data/lib/hecks/rust_build/conformance_fuzz.rb +2 -1
- data/lib/hecks/rust_build/domain_name.rb +26 -0
- data/lib/hecks/rust_build/kernel_input.rb +58 -0
- data/lib/hecks/rust_build/project_rust/codegen_run.rb +143 -0
- data/lib/hecks/rust_build/project_rust/root_mod.rb +1 -1
- data/lib/hecks/rust_build/project_rust.rb +57 -24
- data/lib/hecks/rust_build/rust_literal.rb +33 -0
- data/lib/hecks/rust_build/write_if_changed.rb +86 -0
- data/lib/hecks/site/bluebook/site.bluebook +205 -0
- data/lib/hecks/site/bluebook/site.hecksagon +5 -0
- data/lib/hecks/site/bluebook/site.ports.hecksagon +15 -0
- data/lib/hecks/sme/bluebook/sme.bluebook +336 -0
- data/lib/hecks/sme/bluebook/sme.hecksagon +5 -0
- data/lib/hecks/storehouse.rb +37 -7
- data/lib/hecks/tenancy/bluebook/tenancy.bluebook +1 -1
- data/lib/hecks/three_zero/forms.yml +88 -88
- data/lib/hecks/tools/ci_gates.rb +1 -1
- data/lib/hecks/tools/deploy_recipe.rb +14 -6
- data/lib/hecks/tools/oidc_manifests.rb +2 -1
- data/lib/hecks/tools/sequence_script.rb +2 -2
- data/lib/hecks/tools/site_routes.rb +152 -0
- data/lib/hecks/tools/tenant_provisioning.rb +1 -1
- data/lib/hecks/tools.rb +1 -0
- data/lib/hecks/version.rb +1 -1
- data/rust/build/src/cargo_sync.rs +1 -1
- data/rust/build/src/pipeline.rs +23 -16
- data/rust/build/src/resolve.rs +39 -6
- data/rust/host/HECKS_RELEASE +1 -1
- data/rust/host/src/api.rs +1 -1
- data/rust/host/src/dispatch.rs +87 -7
- data/rust/host/src/needs.rs +111 -0
- data/rust/host/src/web/newsletter/template.rs +69 -0
- data/rust/host/src/web/newsletter/tests.rs +43 -0
- data/rust/host/src/web/newsletter.rs +6 -1
- data/rust/host/src/web/newsletter_send.rs +1 -1
- data/rust/parser/src/keywords.rs +7 -6
- data/rust/parser/src/main.rs +4 -3
- data/rust/parser/src/parse/chapter.rs +1 -1
- data/rust/parser/src/parse/hecksagon.rs +25 -10
- data/rust/project/mutations.rb +4 -30
- data/rust/project/naming.rb +8 -28
- data/rust/project/write_if_changed.rb +4 -80
- data/rust/project_rust_pipeline.rb +16 -12
- data/rust/src/kernel/cli.rs +2 -0
- data/rust/src/kernel/needs.rs +74 -1
- metadata +39 -2
|
@@ -1,127 +1,127 @@
|
|
|
1
1
|
# Each bin/ script and exe/hecks route, and the hecks 3.0 form that replaces it: the verb spelling the
|
|
2
2
|
# 3.0 launcher answers to (ADR 0080, section 7), with QualityControl verbs after `hecks quality_control`.
|
|
3
3
|
---
|
|
4
|
-
argument_gate_matrix: hecks argument_gate_matrix [--confirm] (writes only with --confirm)
|
|
5
|
-
backfill_era_projections: hecks backfill_projections <domain>
|
|
6
|
-
behaviors: hecks run_behaviors subject=<path>
|
|
7
|
-
bench: hecks bench [domains=pizzas,banking] [targets=] [iterations=1000] [warmup=200]
|
|
4
|
+
argument_gate_matrix: hecks conformance_run.argument_gate_matrix [--confirm] (writes only with --confirm)
|
|
5
|
+
backfill_era_projections: hecks era.backfill_projections <domain>
|
|
6
|
+
behaviors: hecks operation.run_behaviors subject=<path>
|
|
7
|
+
bench: hecks fuzz_run.bench [domains=pizzas,banking] [targets=] [iterations=1000] [warmup=200]
|
|
8
8
|
[runs=3] [rust_binary=] [format=markdown] [output=]
|
|
9
|
-
canonicalise: hecks canonicalise <file.json>
|
|
10
|
-
check_engine_agreement: hecks check_engine_agreement
|
|
11
|
-
check_era: hecks check_era <url> expected=era-file [timeout=
|
|
12
|
-
codemod_hoist_local_givens: hecks hoist_local_givens --confirm
|
|
13
|
-
codemod_implicit_append_fields: hecks drop_implicit_append_fields --confirm
|
|
14
|
-
compact: hecks compact <domain> [aggregates=A,B] --confirm
|
|
9
|
+
canonicalise: hecks style_run.canonicalise <file.json>
|
|
10
|
+
check_engine_agreement: hecks conformance_run.check_engine_agreement
|
|
11
|
+
check_era: hecks host.check_era <url> expected=era-file [timeout=]
|
|
12
|
+
codemod_hoist_local_givens: hecks codemod_run.hoist_local_givens --confirm
|
|
13
|
+
codemod_implicit_append_fields: hecks codemod_run.drop_implicit_append_fields --confirm
|
|
14
|
+
compact: hecks era.compact <domain> [aggregates=A,B] --confirm
|
|
15
15
|
console: hecks console [subject=<domain>]
|
|
16
|
-
corpus: hecks rust_domains; hecks regen_order; hecks corpus_rust_coverage
|
|
17
|
-
deploy_template_diff: hecks deploy diff before=a.yaml after=b.yaml [--json] [--strict]
|
|
18
|
-
doc_coverage: hecks measure_doc_coverage
|
|
16
|
+
corpus: hecks corpus_run.rust_domains; hecks corpus_run.regen_order; hecks corpus_run.corpus_rust_coverage
|
|
17
|
+
deploy_template_diff: hecks deploy template_comparison.diff before=a.yaml after=b.yaml [--json] [--strict]
|
|
18
|
+
doc_coverage: hecks conformance_run.measure_doc_coverage
|
|
19
19
|
docs: hecks docs [domain-path] [aggregate]
|
|
20
|
-
evolve: hecks word_status; hecks propose <word> context=X [body=none] [inner=] [opens=]
|
|
21
|
-
[fills=]; hecks admit|deprecate|retire <word> context=X; hecks rename <word> context=X
|
|
22
|
-
new_name=Y; hecks propose_argument <word> context=X kind=K [required=false] [at=N]
|
|
23
|
-
[named=] [fills=] [pairs_shape=]; hecks admit_argument|deprecate_argument|retire_argument
|
|
20
|
+
evolve: hecks language_run.word_status; hecks language_run.propose <word> context=X [body=none] [inner=] [opens=]
|
|
21
|
+
[fills=]; hecks language_run.admit|deprecate|retire <word> context=X; hecks language_run.rename <word> context=X
|
|
22
|
+
new_name=Y; hecks language_run.propose_argument <word> context=X kind=K [required=false] [at=N]
|
|
23
|
+
[named=] [fills=] [pairs_shape=]; hecks language_run.admit_argument|deprecate_argument|retire_argument
|
|
24
24
|
<word> context=X [at=N] [named=]
|
|
25
|
-
expression_projection: hecks project_expression_tables [--stdout]
|
|
26
|
-
follow: hecks follow <domain> [aggregate=Name] [since=N] [interval=0.5] [wait=N] [--from-now] [--stream]
|
|
27
|
-
fuzz: hecks fuzz [domain] [seeds=20] [steps=30] [workers=] [adapter=memory]
|
|
28
|
-
generate: hecks generate_sequence <domain> [seed=1] [steps=30] [adversarial=0.0]
|
|
25
|
+
expression_projection: hecks language_run.project_expression_tables [--stdout]
|
|
26
|
+
follow: hecks operation.follow <domain> [aggregate=Name] [since=N] [interval=0.5] [wait=N] [--from-now] [--stream]
|
|
27
|
+
fuzz: hecks fuzz_run.fuzz [domain] [seeds=20] [steps=30] [workers=] [adapter=memory]
|
|
28
|
+
generate: hecks fuzz_run.generate_sequence <domain> [seed=1] [steps=30] [adversarial=0.0]
|
|
29
29
|
hecks_mcp_door: hecks mcp [--stdio]
|
|
30
|
-
hecks_query_ir_mcp: hecks serve_query_ir_mcp
|
|
31
|
-
heki_compact: hecks compact_heki <domain> [aggregates=A,B] --confirm
|
|
32
|
-
history: hecks history <domain>
|
|
30
|
+
hecks_query_ir_mcp: hecks corpus_run.serve_query_ir_mcp
|
|
31
|
+
heki_compact: hecks era.compact_heki <domain> [aggregates=A,B] --confirm
|
|
32
|
+
history: hecks introspection.history <domain>
|
|
33
33
|
ir: hecks ir <domain> [--translations] | hecks ir --meta
|
|
34
|
-
lint_deploy_recipes: hecks deploy lint [makefiles=a,b]
|
|
35
|
-
merge_tail: hecks merge_tail <domain> winners=id:old,id:new --confirm
|
|
34
|
+
lint_deploy_recipes: hecks deploy makefile_check.lint [makefiles=a,b]
|
|
35
|
+
merge_tail: hecks era.merge_tail <domain> winners=id:old,id:new --confirm
|
|
36
36
|
model_check: hecks model_check [--strict] [--profile client] [<domain> …]
|
|
37
37
|
narrate: hecks narrate [domain-path] [aggregate]
|
|
38
|
-
pattern-cases: hecks record_pattern_cases
|
|
39
|
-
present: hecks present [port=4567]
|
|
40
|
-
project: hecks refresh_projections subject=<domain>
|
|
41
|
-
project_bootstrap_table: hecks project_bootstrap_table
|
|
38
|
+
pattern-cases: hecks test_suite_run.record_pattern_cases
|
|
39
|
+
present: hecks corpus_run.present [port=4567]
|
|
40
|
+
project: hecks operation.refresh_projections subject=<domain>
|
|
41
|
+
project_bootstrap_table: hecks language_run.project_bootstrap_table
|
|
42
42
|
project_cli: hecks project_cli [domain-path …]
|
|
43
|
-
project_deploy: hecks deploy project <domain> [tenant=] [schema=] [out=] [environment=]
|
|
43
|
+
project_deploy: hecks deploy recipe.project <domain> [tenant=] [schema=] [out=] [environment=]
|
|
44
44
|
project_diagrams: hecks project_diagrams <domain-path> <ChapterName>
|
|
45
|
-
project_field_hints: hecks project_field_hints
|
|
46
|
-
project_glossary: hecks glossary <domain> chapter=Name
|
|
47
|
-
project_kernel_capabilities: hecks project_kernel_capabilities
|
|
48
|
-
project_model: hecks project_model
|
|
49
|
-
project_oidc: hecks deploy project_oidc [domains=a,b]
|
|
50
|
-
project_parser_table: hecks project_parser_table
|
|
51
|
-
project_refusal_wording: hecks project_refusal_wording
|
|
52
|
-
project_reserved_names: hecks project_reserved_names
|
|
53
|
-
project_rust: hecks project_rust <domain>
|
|
54
|
-
project_rust_vocabulary: hecks project_rust_vocabulary
|
|
55
|
-
project_tenant: hecks deploy provision <domain_dir> slug=s domain= realm= schema=
|
|
56
|
-
database= [adapter=PostgresEra]; hecks deploy reprovision <tenant> directory= database=
|
|
45
|
+
project_field_hints: hecks language_run.project_field_hints
|
|
46
|
+
project_glossary: hecks introspection.glossary <domain> chapter=Name
|
|
47
|
+
project_kernel_capabilities: hecks kernel_run.project_kernel_capabilities
|
|
48
|
+
project_model: hecks language_run.project_model
|
|
49
|
+
project_oidc: hecks deploy oidc_manifest.project_oidc [domains=a,b]
|
|
50
|
+
project_parser_table: hecks language_run.project_parser_table
|
|
51
|
+
project_refusal_wording: hecks language_run.project_refusal_wording
|
|
52
|
+
project_reserved_names: hecks language_run.project_reserved_names
|
|
53
|
+
project_rust: hecks build.project_rust <domain>
|
|
54
|
+
project_rust_vocabulary: hecks language_run.project_rust_vocabulary
|
|
55
|
+
project_tenant: hecks deploy tenant.provision <domain_dir> slug=s domain= realm= schema=
|
|
56
|
+
database= [adapter=PostgresEra]; hecks deploy tenant.reprovision <tenant> directory= database=
|
|
57
57
|
[adapter=PostgresEra]
|
|
58
|
-
project_vocabulary: hecks project_vocabulary
|
|
59
|
-
project_wasm: hecks build_wasm <domain>
|
|
60
|
-
project_wasm_browser: hecks build_browser_wasm <domain>
|
|
58
|
+
project_vocabulary: hecks language_run.project_vocabulary
|
|
59
|
+
project_wasm: hecks build.build_wasm <domain>
|
|
60
|
+
project_wasm_browser: hecks build.build_browser_wasm <domain>
|
|
61
61
|
qa_concurrency_racer: not user-facing; ProcessPool starts it as hecks quality_control
|
|
62
|
-
race domain= database= schema= verb= step_arguments=
|
|
63
|
-
qa_discover_external_domains: hecks quality_control discover_external_domains [arguments="--projects-dir
|
|
62
|
+
sweep.race domain= database= schema= verb= step_arguments=
|
|
63
|
+
qa_discover_external_domains: hecks quality_control target.discover_external_domains [arguments="--projects-dir
|
|
64
64
|
~/Projects --max-depth 3 --known-path PATH …"]
|
|
65
|
-
qa_domain_novelty: hecks quality_control judge_novelty <domain> [arguments="--against
|
|
65
|
+
qa_domain_novelty: hecks quality_control target.judge_novelty <domain> [arguments="--against
|
|
66
66
|
PATH …"]
|
|
67
|
-
qa_generated_domains: hecks quality_control check_generated_domains [arguments="--domains
|
|
67
|
+
qa_generated_domains: hecks quality_control target.check_generated_domains [arguments="--domains
|
|
68
68
|
3 --start N --forms a,b --seeds 5 --steps 25 --adversarial 0.3 --rust --shrink-budget
|
|
69
69
|
200 --domain-shrink-budget 40 --promote dir --name N --from-dials --blueprint F
|
|
70
70
|
--source F"]
|
|
71
|
-
qa_log_bug: hecks quality_control log sweep=<sweep id> reference= sequence=N title=
|
|
71
|
+
qa_log_bug: hecks quality_control bug.log sweep=<sweep id> reference= sequence=N title=
|
|
72
72
|
demonstration= symptom= expectation= submitter= [tags=a,b] [name=] [reproduced=yes|no]
|
|
73
|
-
qa_mine_combinations: hecks quality_control mine_combinations [arguments="--candidates
|
|
73
|
+
qa_mine_combinations: hecks quality_control target.mine_combinations [arguments="--candidates
|
|
74
74
|
3 --rust --seeds 5 --steps 25 --adversarial 0.3 --repair-rounds 1 --agent CMD --from
|
|
75
75
|
DIR --against PATH --brief"]
|
|
76
76
|
qa_open_pr: hecks quality_control patch.open bug=BUG#n number=N url=… branch=… commit=SHA
|
|
77
77
|
title=… [now=]; hecks quality_control improvement.open [angle=ANGLE-n] number=N
|
|
78
78
|
url=… branch=… title=… [now=]
|
|
79
|
-
qa_postgres_migrate: hecks quality_control migrate_ledger_from_heki domain=<domain_dir>
|
|
79
|
+
qa_postgres_migrate: hecks quality_control sweep.migrate_ledger_from_heki domain=<domain_dir>
|
|
80
80
|
data=<heki_dir> [arguments="[aggregate …] --force"] (a dry run without --force)
|
|
81
|
-
qa_postgres_role: hecks quality_control create_ledger_role <database> [role=hecks_qa]
|
|
82
|
-
qa_pr_check: hecks quality_control check_pull_requests
|
|
81
|
+
qa_postgres_role: hecks quality_control sweep.create_ledger_role <database> [role=hecks_qa]
|
|
82
|
+
qa_pr_check: hecks quality_control clearance.check_pull_requests
|
|
83
83
|
qa_seed_angles: hecks quality_control angle.seed
|
|
84
84
|
qa_seed_targets: hecks quality_control target.seed
|
|
85
|
-
qa_sweep: hecks quality_control
|
|
85
|
+
qa_sweep: hecks quality_control query sweep.run [target=] [arguments="--all --seeds N --steps
|
|
86
86
|
N --adversarial F --role-draw F --dry-run F --self-consistency BOOL --modes a,b
|
|
87
|
-
--persistence-parity --no-parity"]; hecks quality_control release <target> [now=]
|
|
87
|
+
--persistence-parity --no-parity"]; hecks quality_control target.release <target> [now=]
|
|
88
88
|
[next_streak=] [capabilities=] [yield_score=]
|
|
89
|
-
qa_tick: hecks quality_control tick
|
|
90
|
-
query_ir: hecks ir_constructs [names=a,b]; hecks ir_duplicates [domains=a,b] [--meta];
|
|
91
|
-
hecks ir_impact name=N field=F
|
|
92
|
-
reattest_era: hecks reattest <domain> era=N --confirm
|
|
93
|
-
reference: hecks project_reference
|
|
94
|
-
refresh_rspec_runtime_baseline: hecks refresh_runtime_baseline [workers=
|
|
95
|
-
regen_codegen_domains: hecks regenerate_corpus [--check]
|
|
96
|
-
regenerate_persistence_legacy_fixtures: hecks regenerate_legacy_fixtures --confirm
|
|
97
|
-
release: hecks publish [--gem-only] [--npm-only] [--npm-local] [--no-wait] --confirm
|
|
89
|
+
qa_tick: hecks quality_control sweep.tick
|
|
90
|
+
query_ir: hecks corpus_run.ir_constructs [names=a,b]; hecks corpus_run.ir_duplicates [domains=a,b] [--meta];
|
|
91
|
+
hecks corpus_run.ir_impact name=N field=F
|
|
92
|
+
reattest_era: hecks era.reattest <domain> era=N --confirm
|
|
93
|
+
reference: hecks language_run.project_reference
|
|
94
|
+
refresh_rspec_runtime_baseline: hecks test_suite_run.refresh_runtime_baseline [workers=] [from_run=ID]
|
|
95
|
+
regen_codegen_domains: hecks regeneration_run.regenerate_corpus [--check]
|
|
96
|
+
regenerate_persistence_legacy_fixtures: hecks test_suite_run.regenerate_legacy_fixtures --confirm
|
|
97
|
+
release: hecks publishing_run.publish [--gem-only] [--npm-only] [--npm-local] [--no-wait] --confirm
|
|
98
98
|
(without --confirm, the old --dry-run)
|
|
99
|
-
release_gem: hecks publish_gem --confirm
|
|
100
|
-
rspec_io_parallel_files: hecks list_io_parallel_specs exclude=REGEX [tags=] [check=file];
|
|
101
|
-
hecks write_io_parallel_spec_list exclude=REGEX [tags=] write=file --confirm
|
|
102
|
-
rspec_shard_files: hecks shard_specs group=1 groups=N [runtime_log=]
|
|
99
|
+
release_gem: hecks publishing_run.publish_gem --confirm
|
|
100
|
+
rspec_io_parallel_files: hecks test_suite_run.list_io_parallel_specs exclude=REGEX [tags=] [check=file];
|
|
101
|
+
hecks test_suite_run.write_io_parallel_spec_list exclude=REGEX [tags=] write=file --confirm
|
|
102
|
+
rspec_shard_files: hecks test_suite_run.shard_specs group=1 groups=N [runtime_log=]
|
|
103
103
|
run: hecks run [domain] <verb [name=value …] | script.json | - | '{"steps":[…]}'>
|
|
104
|
-
rust_conformance: hecks check_conformance <domain> script=steps.json [artifact=native]
|
|
105
|
-
rust_conformance_fuzz: hecks fuzz_conformance <domain> artifact=native [seeds=10]
|
|
104
|
+
rust_conformance: hecks build.check_conformance <domain> script=steps.json [artifact=native]
|
|
105
|
+
rust_conformance_fuzz: hecks build.fuzz_conformance <domain> artifact=native [seeds=10]
|
|
106
106
|
[steps=25]
|
|
107
|
-
rust_coverage: hecks rust_coverage <module> [codegen=ruby]; hecks check_coverage_allowlist
|
|
108
|
-
rust_kernel_coverage: hecks measure_kernel_coverage
|
|
109
|
-
scaffold_translation: hecks scaffold_translation <domain>
|
|
110
|
-
seed_semantics_corpus: hecks seed_semantics_corpus [fixture=name]
|
|
111
|
-
shape: hecks shape <domain>
|
|
112
|
-
smoke_http: hecks smoke_http path=/p [url=] [header=] [scheme=timestamped]
|
|
107
|
+
rust_coverage: hecks build.rust_coverage <module> [codegen=ruby]; hecks build.check_coverage_allowlist
|
|
108
|
+
rust_kernel_coverage: hecks kernel_run.measure_kernel_coverage
|
|
109
|
+
scaffold_translation: hecks era.scaffold_translation <domain>
|
|
110
|
+
seed_semantics_corpus: hecks test_suite_run.seed_semantics_corpus [fixture=name]
|
|
111
|
+
shape: hecks introspection.shape <domain>
|
|
112
|
+
smoke_http: hecks operation.smoke_http path=/p [url=] [header=] [scheme=timestamped]
|
|
113
113
|
[payload=] [payload_file=] [health_path=] [state_path=]
|
|
114
114
|
smoke_test: hecks smoke_test [domain]
|
|
115
|
-
spec_example: hecks run_spec_example file=path example=text
|
|
116
|
-
standardize_comments: hecks report_comments paths=a,b [only=] [--json] [top=20]; hecks
|
|
117
|
-
check_comments paths=…; hecks fix_comments paths=… --confirm; hecks write_comment_baseline
|
|
118
|
-
--confirm; hecks check_comments_unchanged ref=REF
|
|
119
|
-
standardize_comments_rust: hecks report_rust_comments paths=a,b [only=] [--json] [top=N];
|
|
120
|
-
hecks check_rust_comments paths=… [only=]; hecks fix_rust_comments paths=… [only=]
|
|
115
|
+
spec_example: hecks test_suite_run.run_spec_example file=path example=text
|
|
116
|
+
standardize_comments: hecks style_run.report_comments paths=a,b [only=] [--json] [top=20]; hecks
|
|
117
|
+
style_run.check_comments paths=…; hecks style_run.fix_comments paths=… --confirm; hecks style_run.write_comment_baseline
|
|
118
|
+
--confirm; hecks style_run.check_comments_unchanged ref=REF
|
|
119
|
+
standardize_comments_rust: hecks style_run.report_rust_comments paths=a,b [only=] [--json] [top=N];
|
|
120
|
+
hecks style_run.check_rust_comments paths=… [only=]; hecks style_run.fix_rust_comments paths=… [only=]
|
|
121
121
|
--confirm
|
|
122
|
-
statements: hecks statements <domain> chapter=Name
|
|
122
|
+
statements: hecks introspection.statements <domain> chapter=Name
|
|
123
123
|
stores: hecks stores <domain>
|
|
124
|
-
stress_concurrency_specs: hecks stress_concurrency [runs=
|
|
125
|
-
translation_audit: hecks audit_translation <domain>; hecks approve_translation <domain>
|
|
124
|
+
stress_concurrency_specs: hecks test_suite_run.stress_concurrency [runs=] [parallel=] [seed_start=]
|
|
125
|
+
translation_audit: hecks era.audit_translation <domain>; hecks era.approve_translation <domain>
|
|
126
126
|
[snapshot=] [host_version=] [rehearsal=pass|fail] [rehearsed_at=] --confirm
|
|
127
|
-
vendor_bluebook: hecks vendor <package[@version]> [from=path] [root=path]
|
|
127
|
+
vendor_bluebook: hecks package.vendor <package[@version]> [from=path] [root=path]
|
data/lib/hecks/tools/ci_gates.rb
CHANGED
|
@@ -102,7 +102,7 @@ module Hecks
|
|
|
102
102
|
" - uses: ./.github/actions/hecks-environment",
|
|
103
103
|
" - id: diff",
|
|
104
104
|
" name: #{quoted(gate.fetch('label'))}",
|
|
105
|
-
" run: bundle exec exe/hecks decide_ci_gate gate=#{name} --wait",
|
|
105
|
+
" run: bundle exec exe/hecks regeneration_run.decide_ci_gate gate=#{name} --wait",
|
|
106
106
|
" # END GENERATED ci_gate #{name}"
|
|
107
107
|
].join("\n")
|
|
108
108
|
end
|
|
@@ -11,7 +11,7 @@ module Hecks
|
|
|
11
11
|
# target and dispatches to the matching `Projector` export, writing the recipe (template,
|
|
12
12
|
# scripts and Makefile) under `deploy/<stack>/` of the checkout.
|
|
13
13
|
#
|
|
14
|
-
# hecks deploy project <domain> [--tenant=<slug>] [--schema=<name>]
|
|
14
|
+
# hecks deploy recipe.project <domain> [--tenant=<slug>] [--schema=<name>]
|
|
15
15
|
# [--out=<dir>] [--environment=<name>]
|
|
16
16
|
#
|
|
17
17
|
# `--environment` layers an overlay `.world` file over the base one; a missing overlay is an
|
|
@@ -96,7 +96,7 @@ module Hecks
|
|
|
96
96
|
|
|
97
97
|
File.exist?(world_file) or
|
|
98
98
|
abort "#{world_file} does not exist — a domain needs a .world file to declare " \
|
|
99
|
-
"deployed_to(\"AwsLambda\") or deployed_to(\"
|
|
99
|
+
"deployed_to(\"AwsLambda\"), deployed_to(\"AwsFargate\") or deployed_to(\"AwsBox\")"
|
|
100
100
|
world_file
|
|
101
101
|
end
|
|
102
102
|
|
|
@@ -150,7 +150,7 @@ module Hecks
|
|
|
150
150
|
# Loads the whole registry a domain boots with, not just its own `.bluebook`, because a
|
|
151
151
|
# cross-domain invoke grant can live in any attached chapter. A domain with no bluebook of
|
|
152
152
|
# its own (the QA ledger) gets its chapter from the hecksagon's `Chapters.load!`. `root:` is
|
|
153
|
-
# required or `
|
|
153
|
+
# required or `attaches ... from: :vendor` refuses with "needs a registry with a root to
|
|
154
154
|
# vendor from".
|
|
155
155
|
#
|
|
156
156
|
# @param domain [String] the domain directory
|
|
@@ -176,15 +176,16 @@ module Hecks
|
|
|
176
176
|
# @param deploy_settings [Hash] the world's `deployed_to` settings
|
|
177
177
|
# @param world_file [String] the `.world` file, named in the refusal
|
|
178
178
|
# @param domain [String] the domain directory, named in the refusal
|
|
179
|
-
# @return [Symbol] `:aws_lambda` or `:
|
|
180
|
-
# @raise [SystemExit] with an example block when the world declares
|
|
179
|
+
# @return [Symbol] `:aws_lambda`, `:aws_fargate` or `:aws_box`
|
|
180
|
+
# @raise [SystemExit] with an example block when the world declares none of them
|
|
181
181
|
def target_key(deploy_settings, world_file, domain)
|
|
182
182
|
case deploy_settings[:adapter]
|
|
183
183
|
when "AwsLambda" then :aws_lambda
|
|
184
184
|
when "AwsFargate" then :aws_fargate
|
|
185
|
+
when "AwsBox" then :aws_box
|
|
185
186
|
else
|
|
186
187
|
abort <<~MSG
|
|
187
|
-
#{world_file} declares no deployed_to("AwsLambda") or deployed_to("
|
|
188
|
+
#{world_file} declares no deployed_to("AwsLambda"), deployed_to("AwsFargate") or deployed_to("AwsBox") block. Add one, e.g.:
|
|
188
189
|
|
|
189
190
|
deployed_to("AwsLambda") do
|
|
190
191
|
region "us-east-1"
|
|
@@ -201,6 +202,13 @@ module Hecks
|
|
|
201
202
|
port 8080
|
|
202
203
|
end
|
|
203
204
|
|
|
205
|
+
or:
|
|
206
|
+
|
|
207
|
+
deployed_to("AwsBox") do
|
|
208
|
+
region "us-east-1"
|
|
209
|
+
containers [{ name: "web", port: 8080 }]
|
|
210
|
+
end
|
|
211
|
+
|
|
204
212
|
then re-run hecks deploy project #{domain}.
|
|
205
213
|
MSG
|
|
206
214
|
end
|
|
@@ -9,7 +9,8 @@ module Hecks
|
|
|
9
9
|
# `oidc.json` beside the domain.
|
|
10
10
|
#
|
|
11
11
|
# A domain that has no bluebook is skipped and one that cannot be projected is reported, so a
|
|
12
|
-
# sweep over the whole checkout carries on past either. `hecks deploy
|
|
12
|
+
# sweep over the whole checkout carries on past either. `hecks deploy
|
|
13
|
+
# oidc_manifest.project_oidc` loads
|
|
13
14
|
# `bundler/setup` first, which pins the `json` gem: newer releases pretty-print an empty array
|
|
14
15
|
# as `[\n\n]`, a diff spec/oidc_manifest_spec.rb would report as drift.
|
|
15
16
|
module OidcManifests
|
|
@@ -10,8 +10,8 @@ module Hecks
|
|
|
10
10
|
#
|
|
11
11
|
# hecks generate_sequence <domain> [--seed N] [--steps N] [--adversarial fraction]
|
|
12
12
|
#
|
|
13
|
-
# `--adversarial` mutates the sequence as `hecks quality_control
|
|
14
|
-
# default.
|
|
13
|
+
# `--adversarial` mutates the sequence as `hecks quality_control query sweep.run` does; 0 (off)
|
|
14
|
+
# by default.
|
|
15
15
|
module SequenceScript
|
|
16
16
|
USAGE = "usage: hecks generate_sequence <domain> [--seed N] [--steps N] [--adversarial FRACTION]"
|
|
17
17
|
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "hecks"
|
|
4
|
+
require "fileutils"
|
|
5
|
+
require "optparse"
|
|
6
|
+
require_relative "../tools"
|
|
7
|
+
require_relative "../projections/site/routes_ts"
|
|
8
|
+
require_relative "../projections/site/site_cdn"
|
|
9
|
+
require_relative "../projections/site/regions"
|
|
10
|
+
|
|
11
|
+
module Hecks
|
|
12
|
+
module Tools
|
|
13
|
+
# Projects a project's route table into `routes.ts` (`Projections::Site::RoutesTs`) and, when
|
|
14
|
+
# it declares an edge, into the behaviours and listener rules of its template
|
|
15
|
+
# (`Projections::Site::SiteCdn`).
|
|
16
|
+
#
|
|
17
|
+
# hecks site site_projection.project_site [<project>] [--out=<dir>] [--check]
|
|
18
|
+
#
|
|
19
|
+
# `<project>` is the directory whose `bluebook/` holds the chapter that declares the rows and a
|
|
20
|
+
# hecksagon that attaches Site; it defaults to the checkout. `routes.ts` is written to
|
|
21
|
+
# `<project>/generated` unless `--out` names another directory. The template is rewritten in
|
|
22
|
+
# place between its `BEGIN`/`END GENERATED site_cdn` markers, or under `--out` a copy of it is
|
|
23
|
+
# written at the same relative path. With `--check` nothing is written: the tool answers 1 and
|
|
24
|
+
# names each file that differs from the table.
|
|
25
|
+
module SiteRoutes
|
|
26
|
+
# Where the files go, relative to the project, when `--out` names no directory.
|
|
27
|
+
DEFAULT_OUT = "generated"
|
|
28
|
+
|
|
29
|
+
USAGE = "usage: hecks site site_projection.project_site [<project>] [--out=<dir>] [--check]"
|
|
30
|
+
|
|
31
|
+
module_function
|
|
32
|
+
|
|
33
|
+
# Projects the route table, writes what differs and prints a line for each file written.
|
|
34
|
+
#
|
|
35
|
+
# @param argv [Array<String>] the project directory, then the flags
|
|
36
|
+
# @param root [String] the checkout, used as the project when `argv` names none
|
|
37
|
+
# @return [Integer] 0, or 1 when `--check` finds a file out of date
|
|
38
|
+
# @raise [SystemExit] with the reason on stderr when the project declares no route table or
|
|
39
|
+
# the table is refused
|
|
40
|
+
def main(argv, root: Tools::ROOT)
|
|
41
|
+
argv = argv.dup
|
|
42
|
+
out = nil
|
|
43
|
+
check = false
|
|
44
|
+
OptionParser.new do |parser|
|
|
45
|
+
parser.on("--out=DIR") { |value| out = value }
|
|
46
|
+
parser.on("--check") { check = true }
|
|
47
|
+
end.parse!(argv)
|
|
48
|
+
project = argv.empty? ? root : File.expand_path(argv.shift)
|
|
49
|
+
abort USAGE unless argv.empty?
|
|
50
|
+
|
|
51
|
+
files = projection(project, out: out)
|
|
52
|
+
stale = files.reject { |path, text| File.file?(path) && File.read(path) == text }.keys
|
|
53
|
+
return report(stale, project, check) if check
|
|
54
|
+
|
|
55
|
+
stale.each do |path|
|
|
56
|
+
FileUtils.mkdir_p(File.dirname(path))
|
|
57
|
+
File.write(path, files.fetch(path))
|
|
58
|
+
puts "wrote #{display(path, project)}"
|
|
59
|
+
end
|
|
60
|
+
puts "project_site: #{files.size} #{files.size == 1 ? 'file' : 'files'}, current" if stale.empty?
|
|
61
|
+
0
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# @param root [String] the project directory
|
|
65
|
+
# @param out [String, nil] the directory to write to; `generated/` of the project when nil
|
|
66
|
+
# @return [Hash{String => String}] each file's absolute path to the text it should hold
|
|
67
|
+
# @raise [SystemExit] when the project declares no route table or the table is refused
|
|
68
|
+
def projection(root, out: nil)
|
|
69
|
+
registry = registry_for(root)
|
|
70
|
+
chapter = Projections::Site::Table.chapter(registry)
|
|
71
|
+
table = Projections::Site::Table.read(chapter, registry: registry)
|
|
72
|
+
files = Projector.call(:site_routes_ts, bluebook: chapter, options: { table: table })
|
|
73
|
+
dir = out ? File.expand_path(out) : File.join(root, DEFAULT_OUT)
|
|
74
|
+
written = files.to_h { |name, text| [File.join(dir, name), text] }
|
|
75
|
+
written.merge(template_files(root, out, chapter, table, registry))
|
|
76
|
+
rescue Projections::Site::Table::Invalid => e
|
|
77
|
+
abort "project_site: #{e.message}"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# The template with the edge's regions rewritten, when the project declares an edge.
|
|
81
|
+
#
|
|
82
|
+
# @param root [String] the project directory
|
|
83
|
+
# @param out [String, nil] the directory to write to, or nil to rewrite the template in place
|
|
84
|
+
# @param chapter [Bluebook::Chapter] the chapter that declares the route table
|
|
85
|
+
# @param table [Projections::Site::Table] the checked table
|
|
86
|
+
# @param registry [Hecks::Runtime::Registry] the registry the project booted into
|
|
87
|
+
# @return [Hash{String => String}] the template's path to its text; empty with no edge
|
|
88
|
+
# @raise [SystemExit] when the template is missing or lacks a region
|
|
89
|
+
def template_files(root, out, chapter, table, registry)
|
|
90
|
+
edge = Projections::Site::Edge.read(chapter, table: table, vocabulary: Projections::Site::Table.vocabulary(registry))
|
|
91
|
+
return {} unless edge
|
|
92
|
+
|
|
93
|
+
regions = Projector.call(:site_cdn, bluebook: chapter, options: { table: table, edge: edge })
|
|
94
|
+
relative = edge.setting.template
|
|
95
|
+
source = File.join(root, relative)
|
|
96
|
+
abort "project_site: the template #{relative} does not exist in #{root}" unless File.file?(source)
|
|
97
|
+
|
|
98
|
+
text = regions.reduce(File.read(source)) do |current, (name, block)|
|
|
99
|
+
unless Projections::Site::Regions.region?(current, name)
|
|
100
|
+
abort "project_site: #{relative} has no BEGIN/END GENERATED site_cdn #{name} region"
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
Projections::Site::Regions.replace(current, name, block)
|
|
104
|
+
end
|
|
105
|
+
{ (out ? File.join(File.expand_path(out), relative) : source) => text }
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Loads the project's chapters the way a deploy does: the bluebooks, then the hecksagons that
|
|
109
|
+
# attach the chapters they need.
|
|
110
|
+
#
|
|
111
|
+
# @param root [String] the project directory
|
|
112
|
+
# @return [Hecks::Runtime::Registry] the registry
|
|
113
|
+
# @raise [SystemExit] when the project has no `bluebook/` directory
|
|
114
|
+
def registry_for(root)
|
|
115
|
+
dir = File.join(root, "bluebook")
|
|
116
|
+
unless Dir.exist?(dir)
|
|
117
|
+
abort "project_site: #{dir} does not exist; a project declares its route table in a bluebook/ directory"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
registry = Hecks::Runtime::Registry.new(root: root)
|
|
121
|
+
lib_hecks = File.expand_path("..", __dir__)
|
|
122
|
+
Hecks.with_registry(registry) do
|
|
123
|
+
%w[ports/persistence.port ports/extraction.port adapters/driven/memory.adapter
|
|
124
|
+
adapters/driven/prism.adapter].each { |file| Kernel.load(File.join(lib_hecks, file)) }
|
|
125
|
+
Dir.glob(File.join(dir, "*.bluebook")).each { |file| Kernel.load(file) }
|
|
126
|
+
Dir.glob(File.join(dir, "*.hecksagon")).each { |file| Kernel.load(file) }
|
|
127
|
+
end
|
|
128
|
+
registry
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# @param stale [Array<String>] absolute paths whose text differs from the table
|
|
132
|
+
# @param project [String] the project directory
|
|
133
|
+
# @param check [Boolean] whether this is a `--check` run
|
|
134
|
+
# @return [Integer] 0 when current, else 1 with the stale files on stderr
|
|
135
|
+
def report(stale, project, _check)
|
|
136
|
+
if stale.empty?
|
|
137
|
+
puts "project_site: every file current"
|
|
138
|
+
return 0
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
warn "project_site: out of date: #{stale.map { |path| display(path, project) }.join(', ')} " \
|
|
142
|
+
"(run hecks site site_projection.project_site)"
|
|
143
|
+
1
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# @param path [String] an absolute path
|
|
147
|
+
# @param project [String] the project directory
|
|
148
|
+
# @return [String] the path relative to the project when it lies beneath it
|
|
149
|
+
def display(path, project) = path.delete_prefix("#{project}/")
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
@@ -16,7 +16,7 @@ module Hecks
|
|
|
16
16
|
# merge) the base `persisted_by` settings, so `--database` is required. A policy's refusal is
|
|
17
17
|
# swallowed by `PolicyInterpreter#deliver`, so success is confirmed by query.
|
|
18
18
|
#
|
|
19
|
-
# hecks deploy provision <domain-directory> <slug> --domain=name --realm=name \
|
|
19
|
+
# hecks deploy tenant.provision <domain-directory> <slug> --domain=name --realm=name \
|
|
20
20
|
# --schema=name --database=name [--adapter=PostgresEra]
|
|
21
21
|
module TenantProvisioning
|
|
22
22
|
USAGE = "usage: hecks deploy provision <domain-directory> <slug> --domain=NAME --realm=NAME " \
|
data/lib/hecks/tools.rb
CHANGED
|
@@ -24,6 +24,7 @@ module Hecks
|
|
|
24
24
|
"project_ci_gates" => ["tools/ci_gates", "CiGates"],
|
|
25
25
|
"decide_ci_gate" => ["tools/ci_gate_decision", "CiGateDecision"],
|
|
26
26
|
"project_deploy" => ["tools/deploy_recipe", "DeployRecipe"],
|
|
27
|
+
"project_site" => ["tools/site_routes", "SiteRoutes"],
|
|
27
28
|
"lint_deploy_recipes" => ["tools/deploy_recipe_lint", "DeployRecipeLint"],
|
|
28
29
|
"project_oidc" => ["tools/oidc_manifests", "OidcManifests"],
|
|
29
30
|
"project_tenant" => ["tools/tenant_provisioning", "TenantProvisioning"],
|
data/lib/hecks/version.rb
CHANGED
|
@@ -50,7 +50,7 @@ fn write_root_mod(out_root: &Path, all_dirs: &[String], domains: &[String], targ
|
|
|
50
50
|
out.push_str("// chapter (governance/identity — no merged.rs of its own, so absent\n");
|
|
51
51
|
out.push_str("// from `domains`) stays unconditional: it has no single feature of its\n");
|
|
52
52
|
out.push_str("// own to gate behind, and is compiled in by whichever domain(s) attach\n");
|
|
53
|
-
out.push_str("// it via `
|
|
53
|
+
out.push_str("// it via `attaches`.\n");
|
|
54
54
|
for name in all_dirs {
|
|
55
55
|
if domains.iter().any(|d| d == name) {
|
|
56
56
|
out.push_str(&format!("#[cfg(feature = {name:?})]\n"));
|
data/rust/build/src/pipeline.rs
CHANGED
|
@@ -66,10 +66,10 @@ pub fn run(root: &Path, domain: &str, opts: &Options) -> Result<(), String> {
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
let (
|
|
69
|
+
let (gem_chapter_names, vendored_package_names) = match &hecksagon_path {
|
|
70
70
|
Some(p) => (
|
|
71
|
-
resolve::
|
|
72
|
-
resolve::
|
|
71
|
+
resolve::resolve_gem_chapters(&parser_bin, &target_chapter_name, p)?,
|
|
72
|
+
resolve::resolve_vendored_packages(&parser_bin, &target_chapter_name, p)?,
|
|
73
73
|
),
|
|
74
74
|
None => (Vec::new(), Vec::new()),
|
|
75
75
|
};
|
|
@@ -85,45 +85,52 @@ pub fn run(root: &Path, domain: &str, opts: &Options) -> Result<(), String> {
|
|
|
85
85
|
lineage_pass::run(&mut target_ir, hecksagon_path.as_deref(), world_path.as_deref(), root)?;
|
|
86
86
|
let target_ir_text = crate::json::write(&target_ir);
|
|
87
87
|
|
|
88
|
-
// Every other chapter
|
|
88
|
+
// Every other chapter the gem supplies by `attaches "Name"`, resolved through the
|
|
89
89
|
// same directory listing (`resolve::framework_members`) the Ruby
|
|
90
|
-
// pipeline itself calls.
|
|
90
|
+
// pipeline itself calls. A gem chapter that is not a framework member (the language,
|
|
91
|
+
// Tenancy, Deploy) is loaded by the Ruby runtime alone, so it is checked and skipped.
|
|
91
92
|
let framework_members = resolve::framework_members(root)?;
|
|
93
|
+
let other_gem_chapters = resolve::other_gem_chapter_names(root)?;
|
|
92
94
|
let mut chapters: Vec<Chapter> = Vec::new();
|
|
93
|
-
for fw_name in &
|
|
95
|
+
for fw_name in &gem_chapter_names {
|
|
96
|
+
if other_gem_chapters.contains(fw_name) && !framework_members.iter().any(|(name, _)| name == fw_name) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
94
99
|
let fw_path = framework_members
|
|
95
100
|
.iter()
|
|
96
101
|
.find(|(name, _)| name == fw_name)
|
|
97
102
|
.map(|(_, path)| path.clone())
|
|
98
103
|
.ok_or_else(|| {
|
|
99
|
-
let known: Vec<&str> = framework_members.iter().map(|(n, _)| n.as_str()).collect();
|
|
100
|
-
|
|
104
|
+
let mut known: Vec<&str> = framework_members.iter().map(|(n, _)| n.as_str()).collect();
|
|
105
|
+
known.extend(other_gem_chapters.iter().map(String::as_str));
|
|
106
|
+
known.sort();
|
|
107
|
+
format!("hecks-build: attaches {fw_name:?} names no chapter the gem carries — known: {}", known.join(", "))
|
|
101
108
|
})?;
|
|
102
109
|
let fw_chapter_name = resolve::header_chapter_name(&fw_path)?;
|
|
103
110
|
if &fw_chapter_name != fw_name {
|
|
104
111
|
return Err(format!(
|
|
105
|
-
"hecks-build: {} declares chapter {fw_chapter_name:?}, but
|
|
112
|
+
"hecks-build: {} declares chapter {fw_chapter_name:?}, but attaches named {fw_name:?}",
|
|
106
113
|
fw_path.display()
|
|
107
114
|
));
|
|
108
115
|
}
|
|
109
116
|
let fw_ir_text = parse_chapter_with_optionals(&parser_bin, &fw_chapter_name, std::slice::from_ref(&fw_path))?;
|
|
110
117
|
chapters.push(Chapter {
|
|
111
118
|
mod_name: fw_name.to_lowercase(),
|
|
112
|
-
source_label: format!("{domain} (
|
|
119
|
+
source_label: format!("{domain} (attaches {fw_name:?})"),
|
|
113
120
|
ir_text: fw_ir_text,
|
|
114
121
|
});
|
|
115
122
|
}
|
|
116
123
|
|
|
117
|
-
// Every vendored package's `
|
|
124
|
+
// Every vendored package's `attaches ... from: :vendor` names, resolved the
|
|
118
125
|
// same way `EmbryonautBluebook.load!` (Ruby) resolves them — without this,
|
|
119
126
|
// a vendored chapter would silently drop from the output.
|
|
120
|
-
for pkg_name in &
|
|
127
|
+
for pkg_name in &vendored_package_names {
|
|
121
128
|
let pkg_files = resolve::vendored_bluebook_files(&domain_path, pkg_name)?;
|
|
122
129
|
let pkg_chapter_name = resolve::header_chapter_name(&pkg_files[0])?;
|
|
123
130
|
let expected_chapter_name = resolve::pascal(pkg_name);
|
|
124
131
|
if pkg_chapter_name != expected_chapter_name {
|
|
125
132
|
return Err(format!(
|
|
126
|
-
"hecks-build: {} declares chapter {pkg_chapter_name:?}, but
|
|
133
|
+
"hecks-build: {} declares chapter {pkg_chapter_name:?}, but attaches {pkg_name:?}, from: :vendor \
|
|
127
134
|
expects {expected_chapter_name:?}",
|
|
128
135
|
pkg_files[0].display()
|
|
129
136
|
));
|
|
@@ -140,13 +147,13 @@ pub fn run(root: &Path, domain: &str, opts: &Options) -> Result<(), String> {
|
|
|
140
147
|
// `expected_chapter_name` above), not the raw `pkg_name` — that
|
|
141
148
|
// would diverge the moment a package name has an underscore.
|
|
142
149
|
mod_name: expected_chapter_name.to_lowercase(),
|
|
143
|
-
source_label: format!("{domain} (
|
|
150
|
+
source_label: format!("{domain} (attaches {pkg_name:?}, from: :vendor)"),
|
|
144
151
|
ir_text: pkg_ir_text,
|
|
145
152
|
});
|
|
146
153
|
}
|
|
147
154
|
|
|
148
|
-
// Guards against a
|
|
149
|
-
//
|
|
155
|
+
// Guards against a gem-chapter and a vendored-package
|
|
156
|
+
// entry sharing a `mod_name`, which would silently overwrite one
|
|
150
157
|
// chapter's sidecars with another's.
|
|
151
158
|
{
|
|
152
159
|
let mut seen: Vec<&str> = Vec::new();
|