@afokapu/atdd-bun 0.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.
- package/HOOK_AUDIT.md +22 -0
- package/PLANNER_PORT.md +55 -0
- package/README.md +256 -0
- package/bunfig.toml +2 -0
- package/conventions/coder.bun/coder.bun.boundaries-http-client.convention.yaml +43 -0
- package/conventions/coder.bun/coder.bun.commons-application-no-integration.convention.yaml +40 -0
- package/conventions/coder.bun/coder.bun.commons-cross-feature-imports-in.convention.yaml +39 -0
- package/conventions/coder.bun/coder.bun.commons-domain-no-framework-import.convention.yaml +40 -0
- package/conventions/coder.bun/coder.bun.commons-domain-no-outbound.convention.yaml +41 -0
- package/conventions/coder.bun/coder.bun.complexity-cyclomatic.convention.yaml +51 -0
- package/conventions/coder.bun/coder.bun.complexity-length.convention.yaml +43 -0
- package/conventions/coder.bun/coder.bun.complexity-nesting.convention.yaml +49 -0
- package/conventions/coder.bun/coder.bun.composition-consumer.convention.yaml +40 -0
- package/conventions/coder.bun/coder.bun.composition-root.convention.yaml +42 -0
- package/conventions/coder.bun/coder.bun.dead-code-reachability.convention.yaml +49 -0
- package/conventions/coder.bun/coder.bun.design-hierarchy-import.convention.yaml +42 -0
- package/conventions/coder.bun/coder.bun.dto-mapper.convention.yaml +38 -0
- package/conventions/coder.bun/coder.bun.dto-placement.convention.yaml +39 -0
- package/conventions/coder.bun/coder.bun.dto-purity.convention.yaml +40 -0
- package/conventions/coder.bun/coder.bun.duplication-intra-layer.convention.yaml +47 -0
- package/conventions/coder.bun/coder.bun.error-response-bare-string.convention.yaml +47 -0
- package/conventions/coder.bun/coder.bun.error-response-code-format.convention.yaml +46 -0
- package/conventions/coder.bun/coder.bun.green-header-order.convention.yaml +61 -0
- package/conventions/coder.bun/coder.bun.green-header-purpose.convention.yaml +55 -0
- package/conventions/coder.bun/coder.bun.green-header-runtime.convention.yaml +56 -0
- package/conventions/coder.bun/coder.bun.green-header-tested-by.convention.yaml +63 -0
- package/conventions/coder.bun/coder.bun.green-urn-layer.convention.yaml +53 -0
- package/conventions/coder.bun/coder.bun.green-urn-marker.convention.yaml +67 -0
- package/conventions/coder.bun/coder.bun.green-urn-name-matches.convention.yaml +57 -0
- package/conventions/coder.bun/coder.bun.green-urn-pattern.convention.yaml +56 -0
- package/conventions/coder.bun/coder.bun.green-urn-side.convention.yaml +54 -0
- package/conventions/coder.bun/coder.bun.green-urn-wagon-feature.convention.yaml +56 -0
- package/conventions/coder.bun/coder.bun.interlocking-bilateral-binding.convention.yaml +132 -0
- package/conventions/coder.bun/coder.bun.interlocking-delegates-to-trainrunner.convention.yaml +56 -0
- package/conventions/coder.bun/coder.bun.interlocking-does-not-carry-cargo.convention.yaml +53 -0
- package/conventions/coder.bun/coder.bun.interlocking-resolution-model-exists.convention.yaml +61 -0
- package/conventions/coder.bun/coder.bun.interlocking-runner-exists.convention.yaml +64 -0
- package/conventions/coder.bun/coder.bun.journey-runner-boundary.convention.yaml +55 -0
- package/conventions/coder.bun/coder.bun.layer-naming.convention.yaml +41 -0
- package/conventions/coder.bun/coder.bun.logging-console.convention.yaml +47 -0
- package/conventions/coder.bun/coder.bun.logging-structured.convention.yaml +49 -0
- package/conventions/coder.bun/coder.bun.quality-comments.convention.yaml +44 -0
- package/conventions/coder.bun/coder.bun.quality-mi.convention.yaml +47 -0
- package/conventions/coder.bun/coder.bun.runtime-executes-the-declaration.convention.yaml +104 -0
- package/conventions/coder.bun/coder.bun.runtime-server-is-bun-serve.convention.yaml +64 -0
- package/conventions/coder.bun/coder.bun.runtime-single-lockfile.convention.yaml +56 -0
- package/conventions/coder.bun/coder.bun.runtime-typecheck-enforced.convention.yaml +91 -0
- package/conventions/coder.bun/coder.bun.security-hardcoded-secret.convention.yaml +50 -0
- package/conventions/coder.bun/coder.bun.security-missing-auth.convention.yaml +53 -0
- package/conventions/coder.bun/coder.bun.security-sql-injection.convention.yaml +54 -0
- package/conventions/coder.bun/coder.bun.station-master-interlocking-routing.convention.yaml +62 -0
- package/conventions/coder.bun/coder.bun.station-master-journey-routing.convention.yaml +49 -0
- package/conventions/coder.bun/coder.bun.wagon-honours-its-contract.convention.yaml +64 -0
- package/conventions/coder.htmx/coder.htmx.fragment-escapes-interpolation.convention.yaml +72 -0
- package/conventions/coder.htmx/coder.htmx.swap-no-inline-handler.convention.yaml +59 -0
- package/conventions/coder.htmx/coder.htmx.swap-oob-carries-id.convention.yaml +56 -0
- package/conventions/coder.htmx/coder.htmx.verb-destructive-confirms.convention.yaml +56 -0
- package/conventions/coder.htmx/coder.htmx.verb-endpoint-is-routed.convention.yaml +73 -0
- package/conventions/coder.htmx/coder.htmx.verb-endpoint-same-origin.convention.yaml +58 -0
- package/conventions/coder.htmx/coder.htmx.verb-mutation-signals-progress.convention.yaml +59 -0
- package/conventions/planner.docs/planner.docs.adr-registry-derived.convention.yaml +83 -0
- package/conventions/planner.docs/planner.docs.area-index-required.convention.yaml +67 -0
- package/conventions/planner.docs/planner.docs.artifact-path-shape.convention.yaml +82 -0
- package/conventions/planner.docs/planner.docs.asciidoc-only.convention.yaml +71 -0
- package/conventions/planner.docs/planner.docs.doc-id-unique.convention.yaml +65 -0
- package/conventions/planner.docs/planner.docs.graph-target-resolves.convention.yaml +87 -0
- package/conventions/planner.docs/planner.docs.identity-required.convention.yaml +68 -0
- package/conventions/planner.docs/planner.docs.reference-integrity.convention.yaml +74 -0
- package/conventions/planner.docs/planner.docs.undeclared-change.convention.yaml +80 -0
- package/conventions/tester.bun/tester.bun.acceptance-binding-declared.convention.yaml +49 -0
- package/conventions/tester.bun/tester.bun.acceptance-covers-tag-well-formed.convention.yaml +50 -0
- package/conventions/tester.bun/tester.bun.acceptance-resolves-to-declared.convention.yaml +61 -0
- package/conventions/tester.bun/tester.bun.interlocking-production-runner-used.convention.yaml +76 -0
- package/conventions/tester.bun/tester.bun.interlocking-route-coverage.convention.yaml +66 -0
- package/conventions/tester.bun/tester.bun.interlocking-smoke-coverage-for-station-master.convention.yaml +76 -0
- package/conventions/tester.bun/tester.bun.interlocking-trace-binds-declared-route.convention.yaml +74 -0
- package/conventions/tester.bun/tester.bun.interlocking-train-sequence-is-exercised.convention.yaml +77 -0
- package/conventions/tester.bun/tester.bun.red-behavioral-assertion.convention.yaml +51 -0
- package/conventions/tester.bun/tester.bun.red-fails-first.convention.yaml +52 -0
- package/conventions/tester.bun/tester.bun.routing-runtime-family.convention.yaml +41 -0
- package/conventions/tester.bun/tester.bun.security-auth.convention.yaml +46 -0
- package/conventions/tester.bun/tester.bun.security-input.convention.yaml +45 -0
- package/conventions/tester.bun/tester.bun.smoke-no-collaborator-substitution.convention.yaml +45 -0
- package/conventions/tester.bun/tester.bun.smoke-observable-assertion.convention.yaml +54 -0
- package/conventions/tester.bun/tester.bun.telemetry-emit.convention.yaml +46 -0
- package/conventions/tester.bun/tester.bun.test-carries-urn-identity.convention.yaml +51 -0
- package/conventions/tester.bun/tester.bun.test-imports-bun-test.convention.yaml +55 -0
- package/conventions/tester.bun/tester.bun.test-isolation-no-live-state.convention.yaml +50 -0
- package/conventions/tester.bun/tester.bun.test-no-self-skip.convention.yaml +46 -0
- package/conventions/tester.bun/tester.bun.test-phase-declared.convention.yaml +45 -0
- package/conventions/tester.htmx/tester.htmx.fragment-asserts-returned-markup.convention.yaml +52 -0
- package/conventions/tester.htmx/tester.htmx.swap-oob-asserts-destination-id.convention.yaml +48 -0
- package/conventions/tester.htmx/tester.htmx.verb-endpoint-coverage.convention.yaml +54 -0
- package/conventions/traceability/traceability.plan.executable-acceptance-has-test.convention.yaml +2 -0
- package/conventions/traceability/traceability.source.tested-by-present.convention.yaml +2 -0
- package/conventions/traceability/traceability.source.tested-by-resolves.convention.yaml +2 -0
- package/conventions/traceability/traceability.test.binding-resolves.convention.yaml +2 -0
- package/detectors/atdd_traceability_closure/atdd.implementation.yaml +8 -0
- package/detectors/atdd_traceability_closure/detect.mjs +84 -0
- package/detectors/atdd_traceability_closure/fixtures/clean/plan/orders/E001.yaml +4 -0
- package/detectors/atdd_traceability_closure/fixtures/clean/src/order.ts +4 -0
- package/detectors/atdd_traceability_closure/fixtures/clean/test/order.test.ts +4 -0
- package/detectors/atdd_traceability_closure/fixtures/dirty/plan/orders/E001.yaml +6 -0
- package/detectors/atdd_traceability_closure/fixtures/dirty/src/missing-test.ts +2 -0
- package/detectors/atdd_traceability_closure/fixtures/dirty/src/unknown-test.ts +4 -0
- package/detectors/atdd_traceability_closure/fixtures/dirty/test/bad-binding.test.ts +4 -0
- package/detectors/atdd_traceability_closure/fixtures/dirty/test/no-binding.test.ts +3 -0
- package/detectors/bun_clean_architecture_detector/atdd.implementation.yaml +42 -0
- package/detectors/bun_clean_architecture_detector/checks/_map.json +14 -0
- package/detectors/bun_clean_architecture_detector/checks/a_boundaries_http_client.mjs +36 -0
- package/detectors/bun_clean_architecture_detector/checks/a_commons_application_no_integration.mjs +37 -0
- package/detectors/bun_clean_architecture_detector/checks/a_commons_cross_feature.mjs +41 -0
- package/detectors/bun_clean_architecture_detector/checks/a_commons_domain_no_outbound.mjs +40 -0
- package/detectors/bun_clean_architecture_detector/checks/a_composition_consumer.mjs +33 -0
- package/detectors/bun_clean_architecture_detector/checks/a_composition_root.mjs +35 -0
- package/detectors/bun_clean_architecture_detector/checks/a_domain_no_framework.mjs +47 -0
- package/detectors/bun_clean_architecture_detector/checks/a_dto_mapper.mjs +31 -0
- package/detectors/bun_clean_architecture_detector/checks/a_dto_placement.mjs +30 -0
- package/detectors/bun_clean_architecture_detector/checks/a_dto_purity.mjs +59 -0
- package/detectors/bun_clean_architecture_detector/checks/a_hierarchy_import.mjs +48 -0
- package/detectors/bun_clean_architecture_detector/checks/a_layer_naming.mjs +41 -0
- package/detectors/bun_clean_architecture_detector/detect.mjs +46 -0
- package/detectors/bun_clean_architecture_detector/fixtures/clean/contracts/order.ts +5 -0
- package/detectors/bun_clean_architecture_detector/fixtures/clean/features/orders/application/place.ts +3 -0
- package/detectors/bun_clean_architecture_detector/fixtures/clean/features/orders/composition.ts +4 -0
- package/detectors/bun_clean_architecture_detector/fixtures/clean/features/orders/domain/total.ts +2 -0
- package/detectors/bun_clean_architecture_detector/fixtures/clean/features/orders/integration/order-mapper.ts +3 -0
- package/detectors/bun_clean_architecture_detector/fixtures/clean/features/orders/presentation/api.ts +3 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/commons/application/flow.ts +2 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/commons/domain/billing/rules.ts +1 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/commons/domain/orders/rules.ts +5 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/commons/integration/http.ts +1 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/features/billing/application/pay.ts +2 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/features/billing/domain/rules.ts +2 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/features/billing/helper.ts +1 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/features/billing/integration/client.ts +1 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/features/billing/presentation/api.ts +2 -0
- package/detectors/bun_fullstack_detector/atdd.implementation.yaml +23 -0
- package/detectors/bun_fullstack_detector/checks/_map.json +5 -0
- package/detectors/bun_fullstack_detector/checks/bun_runtime_server_is_bun_serve.mjs +39 -0
- package/detectors/bun_fullstack_detector/checks/bun_runtime_single_lockfile.mjs +40 -0
- package/detectors/bun_fullstack_detector/checks/bun_runtime_typecheck_enforced.mjs +133 -0
- package/detectors/bun_fullstack_detector/detect.mjs +46 -0
- package/detectors/bun_fullstack_detector/fixtures/clean/bun_runtime_server_is_bun_serve/server.ts +7 -0
- package/detectors/bun_fullstack_detector/fixtures/clean/bun_runtime_single_lockfile/bun.lock +1 -0
- package/detectors/bun_fullstack_detector/fixtures/clean/bun_runtime_typecheck_enforced/package.json +5 -0
- package/detectors/bun_fullstack_detector/fixtures/clean/bun_runtime_typecheck_enforced/server.ts +3 -0
- package/detectors/bun_fullstack_detector/fixtures/clean/bun_runtime_typecheck_enforced/tsconfig.json +1 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_server_is_bun_serve/server.ts +5 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_single_lockfile/bun.lock +1 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_single_lockfile/package-lock.json +1 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_typecheck_enforced/package.json +4 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_typecheck_enforced/packages/second/index.ts +8 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_typecheck_enforced/packages/second/package.json +1 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_typecheck_enforced/server.ts +3 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_typecheck_enforced/tsconfig.json +1 -0
- package/detectors/bun_green_traceability_detector/atdd.implementation.yaml +35 -0
- package/detectors/bun_green_traceability_detector/checks/_map.json +12 -0
- package/detectors/bun_green_traceability_detector/checks/green_header_order.mjs +24 -0
- package/detectors/bun_green_traceability_detector/checks/green_header_purpose.mjs +18 -0
- package/detectors/bun_green_traceability_detector/checks/green_header_runtime.mjs +25 -0
- package/detectors/bun_green_traceability_detector/checks/green_header_tested_by.mjs +15 -0
- package/detectors/bun_green_traceability_detector/checks/green_urn_layer.mjs +17 -0
- package/detectors/bun_green_traceability_detector/checks/green_urn_marker.mjs +18 -0
- package/detectors/bun_green_traceability_detector/checks/green_urn_name_matches.mjs +26 -0
- package/detectors/bun_green_traceability_detector/checks/green_urn_pattern.mjs +17 -0
- package/detectors/bun_green_traceability_detector/checks/green_urn_side.mjs +20 -0
- package/detectors/bun_green_traceability_detector/checks/green_urn_wagon_feature.mjs +20 -0
- package/detectors/bun_green_traceability_detector/detect.mjs +46 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_order/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_order/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_purpose/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_purpose/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_runtime/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_runtime/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_tested_by/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_tested_by/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_layer/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_layer/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_marker/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_marker/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_name_matches/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_name_matches/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_pattern/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_pattern/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_side/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_side/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_wagon_feature/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_wagon_feature/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_header_order/OrderRow.ts +6 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_header_purpose/OrderRow.ts +5 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_header_runtime/OrderRow.ts +6 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_header_tested_by/OrderPanel.html +5 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_layer/OrderRow.ts +6 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_marker/OrderRow.ts +3 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_name_matches/OrderRow.ts +6 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_pattern/OrderRow.ts +6 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_side/OrderRow.ts +6 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_wagon_feature/OrderRow.ts +6 -0
- package/detectors/bun_green_traceability_detector/urn_header.mjs +191 -0
- package/detectors/bun_interlocking_binding/atdd.implementation.yaml +31 -0
- package/detectors/bun_interlocking_binding/checks/interlocking_runtime_executes.mjs +168 -0
- package/detectors/bun_interlocking_binding/detect.mjs +608 -0
- package/detectors/bun_interlocking_binding/fixtures/clean/e2e/interlockings/match-resolution/trace.test.ts +10 -0
- package/detectors/bun_interlocking_binding/fixtures/clean/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_binding/fixtures/clean/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/clean/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/clean/server.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/clean/src/trains/interlocking.ts +66 -0
- package/detectors/bun_interlocking_binding/fixtures/clean/src/trains/runner.ts +7 -0
- package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/e2e/interlockings/match-resolution/trace.test.ts +10 -0
- package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/plan/_trains/_interlockings/match-resolution.yaml +57 -0
- package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/server.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/src/trains/interlocking.ts +28 -0
- package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/src/trains/runner.ts +7 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty/e2e/interlockings/match-resolution/trace.test.ts +10 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty/server.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty/src/trains/interlocking.ts +28 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty/src/trains/runner.ts +7 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/e2e/interlockings/match-resolution/trace.test.ts +10 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/plan/_trains/_interlockings/match-resolution.yaml +54 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/server.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/src/trains/interlocking.ts +28 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/src/trains/runner.ts +7 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/e2e/interlockings/match-resolution/trace.test.ts +10 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/server.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/src/trains/interlocking.ts +28 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/src/trains/runner.ts +7 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/e2e/interlockings/match-resolution/trace.test.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/server.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/src/trains/interlocking.ts +28 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/src/trains/runner.ts +7 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/e2e/interlockings/match-resolution/trace.test.ts +10 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/server.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/src/trains/interlocking.ts +30 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/src/trains/runner.ts +7 -0
- package/detectors/bun_interlocking_coverage/_shared/interlocking.mjs +389 -0
- package/detectors/bun_interlocking_coverage/atdd.implementation.yaml +27 -0
- package/detectors/bun_interlocking_coverage/checks/_map.json +7 -0
- package/detectors/bun_interlocking_coverage/checks/interlocking_production_runner.mjs +82 -0
- package/detectors/bun_interlocking_coverage/checks/interlocking_route_coverage.mjs +58 -0
- package/detectors/bun_interlocking_coverage/checks/interlocking_smoke_coverage.mjs +68 -0
- package/detectors/bun_interlocking_coverage/checks/interlocking_trace_binds.mjs +64 -0
- package/detectors/bun_interlocking_coverage/checks/interlocking_train_sequence.mjs +110 -0
- package/detectors/bun_interlocking_coverage/detect.mjs +46 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/e2e/interlockings/match-resolution/routes.test.ts +21 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/e2e/smoke/resolve-match.smoke.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/e2e/interlockings/match-resolution/routes.test.ts +21 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/e2e/smoke/resolve-match.smoke.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/e2e/interlockings/match-resolution/routes.test.ts +21 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/e2e/smoke/resolve-match.smoke.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/e2e/interlockings/match-resolution/routes.test.ts +21 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/e2e/smoke/resolve-match.smoke.test.ts +19 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/e2e/interlockings/match-resolution/routes.test.ts +21 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/e2e/smoke/resolve-match.smoke.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_production_runner/e2e/interlockings/match-resolution/routes.test.ts +23 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_production_runner/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_production_runner/e2e/smoke/resolve-match.smoke.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_production_runner/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_route_coverage/e2e/interlockings/match-resolution/routes.test.ts +12 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_route_coverage/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_route_coverage/e2e/smoke/resolve-match.smoke.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_route_coverage/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_smoke_coverage/e2e/interlockings/match-resolution/routes.test.ts +21 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_smoke_coverage/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_smoke_coverage/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_trace_binds/e2e/interlockings/match-resolution/routes.test.ts +21 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_trace_binds/e2e/interlockings/match-resolution/trace.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_trace_binds/e2e/smoke/resolve-match.smoke.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_trace_binds/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_train_sequence/e2e/interlockings/match-resolution/routes.test.ts +16 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_train_sequence/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_train_sequence/plan/_trains/train:match:match-resolution-standard.yaml +8 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_train_sequence/plan/_trains/train:match:match-resolution-timeout.yaml +5 -0
- package/detectors/bun_interlocking_infrastructure/_shared/interlocking.mjs +477 -0
- package/detectors/bun_interlocking_infrastructure/atdd.implementation.yaml +32 -0
- package/detectors/bun_interlocking_infrastructure/checks/_map.json +10 -0
- package/detectors/bun_interlocking_infrastructure/checks/interlocking_delegates.mjs +70 -0
- package/detectors/bun_interlocking_infrastructure/checks/interlocking_no_cargo.mjs +62 -0
- package/detectors/bun_interlocking_infrastructure/checks/interlocking_resolution_model.mjs +64 -0
- package/detectors/bun_interlocking_infrastructure/checks/interlocking_runner_exists.mjs +73 -0
- package/detectors/bun_interlocking_infrastructure/checks/interlocking_station_routing.mjs +62 -0
- package/detectors/bun_interlocking_infrastructure/checks/journey_runner_boundary.mjs +153 -0
- package/detectors/bun_interlocking_infrastructure/checks/journey_station_routing.mjs +119 -0
- package/detectors/bun_interlocking_infrastructure/checks/wagon_contract_honoured.mjs +149 -0
- package/detectors/bun_interlocking_infrastructure/detect.mjs +46 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_delegates/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_delegates/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_delegates/src/trains/interlocking.ts +41 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_delegates/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_no_cargo/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_no_cargo/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_no_cargo/src/trains/interlocking.ts +41 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_no_cargo/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_resolution_model/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_resolution_model/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_resolution_model/src/trains/interlocking.ts +41 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_resolution_model/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_runner_exists/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_runner_exists/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_runner_exists/src/trains/interlocking.ts +41 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_runner_exists/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_station_routing/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_station_routing/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_station_routing/src/trains/interlocking.ts +41 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_station_routing/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/journey_runner_boundary/plan/_journeys/example.yaml +16 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/journey_runner_boundary/src/trains/journey.ts +15 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/journey_station_routing/plan/_journeys/public.yaml +16 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/journey_station_routing/server.ts +13 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/journey_station_routing/src/trains/journey.ts +14 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/wagon_contract_honoured/plan/orders/_orders.yaml +17 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/wagon_contract_honoured/src/orders/wagon.ts +15 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_delegates/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_delegates/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_delegates/src/trains/interlocking.ts +49 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_delegates/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_no_cargo/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_no_cargo/src/match/wagon.ts +11 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_no_cargo/src/trains/interlocking.ts +42 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_no_cargo/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_resolution_model/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_resolution_model/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_resolution_model/src/trains/interlocking.ts +21 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_resolution_model/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_runner_exists/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_runner_exists/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_runner_exists/src/trains/interlocking.ts +16 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_runner_exists/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_station_routing/server.ts +19 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_station_routing/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_station_routing/src/trains/interlocking.ts +41 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_station_routing/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/journey_runner_boundary/plan/_journeys/example.yaml +16 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/journey_runner_boundary/src/trains/journey.ts +14 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/journey_station_routing/plan/_journeys/public.yaml +16 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/journey_station_routing/server.ts +10 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/journey_station_routing/src/trains/journey.ts +14 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/wagon_contract_honoured/plan/orders/_orders.yaml +17 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/wagon_contract_honoured/src/orders/wagon.ts +13 -0
- package/detectors/bun_security_hygiene_detector/atdd.implementation.yaml +33 -0
- package/detectors/bun_security_hygiene_detector/checks/_map.json +9 -0
- package/detectors/bun_security_hygiene_detector/checks/err_bare_string.mjs +38 -0
- package/detectors/bun_security_hygiene_detector/checks/err_code_format.mjs +36 -0
- package/detectors/bun_security_hygiene_detector/checks/log_console.mjs +33 -0
- package/detectors/bun_security_hygiene_detector/checks/log_structured.mjs +36 -0
- package/detectors/bun_security_hygiene_detector/checks/sec_hardcoded_secret.mjs +43 -0
- package/detectors/bun_security_hygiene_detector/checks/sec_missing_auth.mjs +63 -0
- package/detectors/bun_security_hygiene_detector/checks/sec_sql_injection.mjs +56 -0
- package/detectors/bun_security_hygiene_detector/detect.mjs +46 -0
- package/detectors/bun_security_hygiene_detector/fixtures/clean/server.ts +24 -0
- package/detectors/bun_security_hygiene_detector/fixtures/dirty/db.ts +6 -0
- package/detectors/bun_security_hygiene_detector/fixtures/dirty/errors.ts +6 -0
- package/detectors/bun_security_hygiene_detector/fixtures/dirty/logging.ts +4 -0
- package/detectors/bun_security_hygiene_detector/fixtures/dirty/routes.ts +10 -0
- package/detectors/bun_security_hygiene_detector/fixtures/dirty/secrets.ts +3 -0
- package/detectors/bun_tester_discipline_detector/atdd.implementation.yaml +46 -0
- package/detectors/bun_tester_discipline_detector/checks/_map.json +18 -0
- package/detectors/bun_tester_discipline_detector/checks/t_acceptance_binding.mjs +19 -0
- package/detectors/bun_tester_discipline_detector/checks/t_acceptance_covers_tag.mjs +25 -0
- package/detectors/bun_tester_discipline_detector/checks/t_acceptance_resolves.mjs +106 -0
- package/detectors/bun_tester_discipline_detector/checks/t_isolation_no_live_state.mjs +40 -0
- package/detectors/bun_tester_discipline_detector/checks/t_red_behavioral.mjs +35 -0
- package/detectors/bun_tester_discipline_detector/checks/t_red_fails_first.mjs +30 -0
- package/detectors/bun_tester_discipline_detector/checks/t_routing_runtime.mjs +22 -0
- package/detectors/bun_tester_discipline_detector/checks/t_security_auth.mjs +26 -0
- package/detectors/bun_tester_discipline_detector/checks/t_security_input.mjs +25 -0
- package/detectors/bun_tester_discipline_detector/checks/t_smoke_no_substitution.mjs +25 -0
- package/detectors/bun_tester_discipline_detector/checks/t_smoke_observable.mjs +28 -0
- package/detectors/bun_tester_discipline_detector/checks/t_telemetry_emit.mjs +27 -0
- package/detectors/bun_tester_discipline_detector/checks/t_test_imports_bun_test.mjs +31 -0
- package/detectors/bun_tester_discipline_detector/checks/t_test_no_self_skip.mjs +34 -0
- package/detectors/bun_tester_discipline_detector/checks/t_test_phase_declared.mjs +21 -0
- package/detectors/bun_tester_discipline_detector/checks/t_urn_identity.mjs +18 -0
- package/detectors/bun_tester_discipline_detector/detect.mjs +46 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/audit.sec.test.ts +15 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/checkout.red.test.ts +16 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/emit.telemetry.test.ts +15 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/marked.red.test.ts +14 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/orders.smoke.test.ts +16 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/payload.input.test.ts +13 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E001.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E002.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E020.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E021.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E022.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E023.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/badcovers.test.ts +7 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/badphase.test.ts +6 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/foreign_harness.test.ts +6 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/happy.auth.test.ts +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/happy.input.test.ts +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/internal.smoke.test.ts +10 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/no_header.test.ts +2 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E004.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E005.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E006.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E007.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E008.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E009.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E010.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E024.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E025.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E026.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E027.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E028.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E030.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/polluting.test.ts +11 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/quiet.telemetry.test.ts +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/skipped.test.ts +6 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/substituted.smoke.test.ts +13 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/unbound.test.ts +5 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/unmarked.red.test.ts +7 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/unresolvable_binding.test.ts +17 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/vacuous.red.test.ts +7 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/wrongruntime.test.ts +7 -0
- package/detectors/bun_tester_discipline_detector/test_header.mjs +160 -0
- package/detectors/bun_ts_metrics_detector/atdd.implementation.yaml +34 -0
- package/detectors/bun_ts_metrics_detector/checks/_map.json +9 -0
- package/detectors/bun_ts_metrics_detector/checks/ts_complexity_cyclomatic.mjs +36 -0
- package/detectors/bun_ts_metrics_detector/checks/ts_complexity_length.mjs +36 -0
- package/detectors/bun_ts_metrics_detector/checks/ts_complexity_nesting.mjs +36 -0
- package/detectors/bun_ts_metrics_detector/checks/ts_dead_code.mjs +58 -0
- package/detectors/bun_ts_metrics_detector/checks/ts_duplication.mjs +70 -0
- package/detectors/bun_ts_metrics_detector/checks/ts_quality_comments.mjs +30 -0
- package/detectors/bun_ts_metrics_detector/checks/ts_quality_mi.mjs +30 -0
- package/detectors/bun_ts_metrics_detector/detect.mjs +46 -0
- package/detectors/bun_ts_metrics_detector/fixtures/clean/domain/label.ts +6 -0
- package/detectors/bun_ts_metrics_detector/fixtures/clean/domain/total.ts +8 -0
- package/detectors/bun_ts_metrics_detector/fixtures/clean/index.ts +7 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/bare.ts +2 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/big.ts +600 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/consumer.ts +2 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/domain/a.ts +9 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/domain/b.ts +9 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/gnarly.ts +22 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/index.ts +8 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/long.ts +64 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/orphan.ts +1 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/typed.ts +1 -0
- package/detectors/bun_ts_metrics_detector/ts_metrics.mjs +310 -0
- package/detectors/htmx_hypermedia_detector/atdd.implementation.yaml +28 -0
- package/detectors/htmx_hypermedia_detector/checks/_map.json +9 -0
- package/detectors/htmx_hypermedia_detector/checks/htmx_fragment_escapes_interpolation.mjs +66 -0
- package/detectors/htmx_hypermedia_detector/checks/htmx_swap_no_inline_handler.mjs +40 -0
- package/detectors/htmx_hypermedia_detector/checks/htmx_swap_oob_carries_id.mjs +37 -0
- package/detectors/htmx_hypermedia_detector/checks/htmx_verb_destructive_confirms.mjs +36 -0
- package/detectors/htmx_hypermedia_detector/checks/htmx_verb_endpoint_is_routed.mjs +133 -0
- package/detectors/htmx_hypermedia_detector/checks/htmx_verb_endpoint_same_origin.mjs +33 -0
- package/detectors/htmx_hypermedia_detector/checks/htmx_verb_mutation_signals_progress.mjs +43 -0
- package/detectors/htmx_hypermedia_detector/detect.mjs +46 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_fragment_escapes_interpolation/render.ts +6 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_swap_no_inline_handler/row.html +1 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_swap_oob_carries_id/fragment.html +1 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_verb_destructive_confirms/delete.html +1 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_verb_endpoint_is_routed/server.ts +10 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_verb_endpoint_is_routed/src/OrderRow.ts +7 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_verb_endpoint_same_origin/panel.html +3 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_verb_mutation_signals_progress/form.html +4 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_fragment_escapes_interpolation/render.ts +3 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_swap_no_inline_handler/row.html +1 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_swap_oob_carries_id/fragment.html +1 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_verb_destructive_confirms/delete.html +1 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_verb_endpoint_is_routed/server.ts +10 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_verb_endpoint_is_routed/src/OrderRow.ts +9 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_verb_endpoint_same_origin/panel.html +3 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_verb_mutation_signals_progress/form.html +3 -0
- package/detectors/htmx_tester_detector/atdd.implementation.yaml +21 -0
- package/detectors/htmx_tester_detector/checks/_map.json +5 -0
- package/detectors/htmx_tester_detector/checks/t_fragment_asserts_returned_markup.mjs +40 -0
- package/detectors/htmx_tester_detector/checks/t_swap_oob_asserts_destination_id.mjs +38 -0
- package/detectors/htmx_tester_detector/checks/t_verb_endpoint_coverage.mjs +59 -0
- package/detectors/htmx_tester_detector/detect.mjs +46 -0
- package/detectors/htmx_tester_detector/fixtures/clean/orders.test.ts +23 -0
- package/detectors/htmx_tester_detector/fixtures/clean/panel.html +7 -0
- package/detectors/htmx_tester_detector/fixtures/dirty/orders.test.ts +20 -0
- package/detectors/htmx_tester_detector/fixtures/dirty/panel.html +7 -0
- package/detectors/htmx_tester_detector/fixtures/dirty/statusonly.test.ts +9 -0
- package/detectors/htmx_tester_detector/test_header.mjs +4 -0
- package/detectors/planner_docs_capability/README.md +34 -0
- package/detectors/planner_docs_capability/atdd.implementation.yaml +57 -0
- package/detectors/planner_docs_capability/detect.mjs +10 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/delivery/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/notes.md +3 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/delivery/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/decisions/adr-20260906-002-documentation-system.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/delivery/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/delivery/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/delivery/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/delivery/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/delivery/release.adoc +3 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/notes.md +3 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/delivery/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/delivery/release.adoc +10 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/delivery/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_plan_integrity/atdd.implementation.yaml +18 -0
- package/detectors/planner_plan_integrity/detect.mjs +23 -0
- package/detectors/planner_plan_integrity/fixtures/clean/README.md +1 -0
- package/detectors/planner_plan_integrity/fixtures/dirty/plan/broken.yaml +1 -0
- package/detectors/planner_schema_validation/atdd.implementation.yaml +20 -0
- package/detectors/planner_schema_validation/detect.mjs +9 -0
- package/detectors/planner_schema_validation/fixtures/clean/contracts/_contracts.yaml +6 -0
- package/detectors/planner_schema_validation/fixtures/clean/contracts/orders/placed.schema.json +4 -0
- package/detectors/planner_schema_validation/fixtures/clean/plan/_themes.yaml +3 -0
- package/detectors/planner_schema_validation/fixtures/clean/plan/_trains/orders.yaml +11 -0
- package/detectors/planner_schema_validation/fixtures/clean/plan/orders/_orders.yaml +16 -0
- package/detectors/planner_schema_validation/fixtures/dirty/contracts/_contracts.yaml +3 -0
- package/detectors/planner_schema_validation/fixtures/dirty/plan/_themes.yaml +2 -0
- package/detectors/planner_schema_validation/fixtures/dirty/plan/_trains/orders.yaml +11 -0
- package/detectors/planner_static_validators/atdd.implementation.yaml +36 -0
- package/detectors/planner_static_validators/detect.mjs +9 -0
- package/detectors/planner_static_validators/fixtures/clean/contracts/_contracts.yaml +6 -0
- package/detectors/planner_static_validators/fixtures/clean/contracts/orders/placed.schema.json +4 -0
- package/detectors/planner_static_validators/fixtures/clean/plan/_themes.yaml +3 -0
- package/detectors/planner_static_validators/fixtures/clean/plan/orders/E001.yaml +10 -0
- package/detectors/planner_static_validators/fixtures/clean/plan/orders/_orders.yaml +19 -0
- package/detectors/planner_static_validators/fixtures/clean/plan/orders/features/place-order.yaml +4 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/_journeys/broken.yaml +22 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/_themes.yaml +3 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/_trains/_interlockings/journey-a.yaml +4 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/_trains/journey-a.yaml +7 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/_trains/probe/legacy.yaml +3 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/_trains/probe/orphan.yaml +3 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/_trains.yaml +5 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/also_dup/_also_dup.yaml +15 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/dup/E001.yaml +3 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/dup/_dup.yaml +27 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/dup/features/bad.yaml +2 -0
- package/lib/imports.mjs +83 -0
- package/lib/scan.mjs +246 -0
- package/package.json +35 -0
- package/planner-nodes/ENFORCEMENT_SCOPE.yaml +117 -0
- package/planner-nodes/nodes/planner.acceptance.abstract-fields-required.convention.yaml +44 -0
- package/planner-nodes/nodes/planner.acceptance.authoring-guidelines.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.acceptance.boundary-kind-vocabulary.convention.yaml +38 -0
- package/planner-nodes/nodes/planner.acceptance.execution-kind.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.acceptance.extraction-no-inference.convention.yaml +23 -0
- package/planner-nodes/nodes/planner.acceptance.generator-prompts.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.acceptance.given-when-then-structure.convention.yaml +53 -0
- package/planner-nodes/nodes/planner.acceptance.harness-vocabulary.convention.yaml +99 -0
- package/planner-nodes/nodes/planner.acceptance.harness.convention.yaml +36 -0
- package/planner-nodes/nodes/planner.acceptance.hermetic-fake-contract.convention.yaml +35 -0
- package/planner-nodes/nodes/planner.acceptance.id-pattern.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.acceptance.max-per-wmbt.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.acceptance.plane-keywords.convention.yaml +87 -0
- package/planner-nodes/nodes/planner.acceptance.route-construction.convention.yaml +55 -0
- package/planner-nodes/nodes/planner.acceptance.signal-telemetry-naming.convention.yaml +61 -0
- package/planner-nodes/nodes/planner.acceptance.urn-generation.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.acceptance.well-formed.convention.yaml +57 -0
- package/planner-nodes/nodes/planner.appendix.llm-guidelines.convention.yaml +81 -0
- package/planner-nodes/nodes/planner.appendix.naming-pattern.convention.yaml +45 -0
- package/planner-nodes/nodes/planner.appendix.storage.convention.yaml +44 -0
- package/planner-nodes/nodes/planner.appendix.structure.convention.yaml +17 -0
- package/planner-nodes/nodes/planner.appendix.types.convention.yaml +123 -0
- package/planner-nodes/nodes/planner.artifact-naming.anti-patterns.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.artifact-naming.cardinality-from-aspect.convention.yaml +32 -0
- package/planner-nodes/nodes/planner.artifact-naming.colon-for-hierarchy.convention.yaml +25 -0
- package/planner-nodes/nodes/planner.artifact-naming.contract-file-mapping.convention.yaml +26 -0
- package/planner-nodes/nodes/planner.artifact-naming.depth-guidelines.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.artifact-naming.dot-for-variant.convention.yaml +25 -0
- package/planner-nodes/nodes/planner.artifact-naming.logical-physical-mapping.convention.yaml +36 -0
- package/planner-nodes/nodes/planner.artifact-naming.migration-guide.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.artifact-naming.naming-pattern.convention.yaml +44 -0
- package/planner-nodes/nodes/planner.artifact-naming.path-mirrors-identity.convention.yaml +40 -0
- package/planner-nodes/nodes/planner.artifact-naming.planner-artifacts-use-stable.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.artifact-naming.pluralization.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.artifact-naming.schema-identifier.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.artifact-naming.separator-semantics.convention.yaml +42 -0
- package/planner-nodes/nodes/planner.artifact-naming.theme-first-identity.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.artifact-naming.urn-structure.convention.yaml +26 -0
- package/planner-nodes/nodes/planner.artifact-naming.validation-rules.convention.yaml +33 -0
- package/planner-nodes/nodes/planner.artifact-naming.verb-object-corpus-drift.convention.yaml +49 -0
- package/planner-nodes/nodes/planner.artifact.definition.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.component.artifact-derivation.convention.yaml +139 -0
- package/planner-nodes/nodes/planner.component.business-focus.convention.yaml +65 -0
- package/planner-nodes/nodes/planner.component.count-limit.convention.yaml +64 -0
- package/planner-nodes/nodes/planner.component.derivation.convention.yaml +117 -0
- package/planner-nodes/nodes/planner.component.io-alignment.convention.yaml +65 -0
- package/planner-nodes/nodes/planner.component.layer-assignment.convention.yaml +83 -0
- package/planner-nodes/nodes/planner.component.layer-consistency.convention.yaml +91 -0
- package/planner-nodes/nodes/planner.component.method-limit.convention.yaml +35 -0
- package/planner-nodes/nodes/planner.component.structure.convention.yaml +77 -0
- package/planner-nodes/nodes/planner.component.type-catalog.convention.yaml +436 -0
- package/planner-nodes/nodes/planner.component.urn.convention.yaml +86 -0
- package/planner-nodes/nodes/planner.contract.registry-coherence.convention.yaml +36 -0
- package/planner-nodes/nodes/planner.convention.remedy-must-be-followable.convention.yaml +92 -0
- package/planner-nodes/nodes/planner.coverage.bidirectional-coverage-between-trains.convention.yaml +33 -0
- package/planner-nodes/nodes/planner.coverage.bidirectional-coverage-between-wagons.convention.yaml +33 -0
- package/planner-nodes/nodes/planner.coverage.coverage-graph.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.coverage.every-wmbt-must-be.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.coverage.every-wmbt-must-have.convention.yaml +33 -0
- package/planner-nodes/nodes/planner.coverage.exception-handling.convention.yaml +32 -0
- package/planner-nodes/nodes/planner.criteria.defaults.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.criteria.harness-templates.convention.yaml +159 -0
- package/planner-nodes/nodes/planner.criteria.metric-mapping.convention.yaml +136 -0
- package/planner-nodes/nodes/planner.criteria.plane-keywords.convention.yaml +53 -0
- package/planner-nodes/nodes/planner.criteria.sequence-routing.convention.yaml +26 -0
- package/planner-nodes/nodes/planner.criteria.shape.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.decomposition.canonical-steps.convention.yaml +14 -0
- package/planner-nodes/nodes/planner.decomposition.document-trouble-obligation.convention.yaml +12 -0
- package/planner-nodes/nodes/planner.decomposition.domain-vs-technology.convention.yaml +13 -0
- package/planner-nodes/nodes/planner.decomposition.jtbd-vs-odi-grammar.convention.yaml +18 -0
- package/planner-nodes/nodes/planner.decomposition.keep-pivot-kill.convention.yaml +23 -0
- package/planner-nodes/nodes/planner.decomposition.local-scope.convention.yaml +15 -0
- package/planner-nodes/nodes/planner.decomposition.natural-language-normalization.convention.yaml +12 -0
- package/planner-nodes/nodes/planner.decomposition.train-journey.convention.yaml +13 -0
- package/planner-nodes/nodes/planner.decomposition.wagon-rationale.convention.yaml +12 -0
- package/planner-nodes/nodes/planner.definition.anchor-required.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.feature.artifact-seeded-naming.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.feature.definition.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.feature.estimation.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.feature.feedback-loop-close-the-loop.convention.yaml +33 -0
- package/planner-nodes/nodes/planner.feature.feedback-loop-kind.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.feature.feedback-loop-suppression.convention.yaml +23 -0
- package/planner-nodes/nodes/planner.feature.footprint-scoring.convention.yaml +119 -0
- package/planner-nodes/nodes/planner.feature.grouping-strategy.convention.yaml +37 -0
- package/planner-nodes/nodes/planner.feature.hard-limits.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.feature.name-is-verb-object.convention.yaml +40 -0
- package/planner-nodes/nodes/planner.feature.shape.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.feature.size-max-rule.convention.yaml +41 -0
- package/planner-nodes/nodes/planner.feature.urn-naming.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.feature.validation-rules.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.feature.verb-selection-by-artifact-type.convention.yaml +264 -0
- package/planner-nodes/nodes/planner.feature.wagon-link.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.interface.api-mapping.convention.yaml +70 -0
- package/planner-nodes/nodes/planner.interface.artifact-transformation.convention.yaml +103 -0
- package/planner-nodes/nodes/planner.interface.contract-urn.convention.yaml +119 -0
- package/planner-nodes/nodes/planner.interface.naming-patterns.convention.yaml +73 -0
- package/planner-nodes/nodes/planner.interface.orphan-detection.convention.yaml +46 -0
- package/planner-nodes/nodes/planner.interface.ownership-rules.convention.yaml +54 -0
- package/planner-nodes/nodes/planner.interface.structure-rules.convention.yaml +112 -0
- package/planner-nodes/nodes/planner.interface.tests-subdirectory.convention.yaml +61 -0
- package/planner-nodes/nodes/planner.interlocking.definition.convention.yaml +36 -0
- package/planner-nodes/nodes/planner.interlocking.registry-mirrors-document.convention.yaml +38 -0
- package/planner-nodes/nodes/planner.issue-body.dependency-entries-must-be-classified.convention.yaml +21 -0
- package/planner-nodes/nodes/planner.issue-body.graph-context-required.convention.yaml +21 -0
- package/planner-nodes/nodes/planner.journey.continuation-closure.convention.yaml +51 -0
- package/planner-nodes/nodes/planner.journey.definition.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.plan.confirm-before-author.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.plan.confirm-binds-an-issue.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.plan.confirm-requires-interlocking-sanity.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.plan.granularity-completeness.convention.yaml +38 -0
- package/planner-nodes/nodes/planner.plan.session-lifecycle.convention.yaml +23 -0
- package/planner-nodes/nodes/planner.plan.spec-is-schema-valid.convention.yaml +61 -0
- package/planner-nodes/nodes/planner.relationship.no-orphan-nodes.convention.yaml +32 -0
- package/planner-nodes/nodes/planner.smoke.feedback-loop-close-the-loop.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.smoke.synthetic-fixture-bypass.convention.yaml +44 -0
- package/planner-nodes/nodes/planner.steps.architecture-routing.convention.yaml +109 -0
- package/planner-nodes/nodes/planner.steps.jtbd-taxonomy.convention.yaml +227 -0
- package/planner-nodes/nodes/planner.steps.linguistic-patterns.convention.yaml +81 -0
- package/planner-nodes/nodes/planner.steps.sequence.convention.yaml +17 -0
- package/planner-nodes/nodes/planner.subject.invariants.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.theme.definition.convention.yaml +23 -0
- package/planner-nodes/nodes/planner.theme.must-be-canonical.convention.yaml +38 -0
- package/planner-nodes/nodes/planner.theme.theme-zero-mandatory.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.theme.urn-namespace-matches.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.train.acceptance-commit-failures-covered.convention.yaml +10 -0
- package/planner-nodes/nodes/planner.train.acceptances.convention.yaml +85 -0
- package/planner-nodes/nodes/planner.train.artifact-flow.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.train.categories.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.train.definition.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.train.dependencies.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.train.dispatch-composite-key-exceptional.convention.yaml +17 -0
- package/planner-nodes/nodes/planner.train.dispatch-map-is-registry.convention.yaml +17 -0
- package/planner-nodes/nodes/planner.train.family-matches-terminal-contract.convention.yaml +17 -0
- package/planner-nodes/nodes/planner.train.family.convention.yaml +17 -0
- package/planner-nodes/nodes/planner.train.initial-cargo-inputs-declared.convention.yaml +10 -0
- package/planner-nodes/nodes/planner.train.interlocking-does-not-carry-cargo.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.train.interlocking-entrypoint-shape.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.train.interlocking-fragment-acceptance-binding.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.train.interlocking-guard-coverage.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.train.interlocking-guard-grammar.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.train.interlocking-home.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.train.interlocking-message-payload-typed.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.train.interlocking-payload-contract-body-required.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.train.interlocking-payload-contract-registered.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.train.interlocking-projection-equivalence.convention.yaml +32 -0
- package/planner-nodes/nodes/planner.train.interlocking-route-category-matches-train-id.convention.yaml +32 -0
- package/planner-nodes/nodes/planner.train.interlocking-route-resolution-deterministic.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.train.interlocking-structural-residual-explicit.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.train.interlocking-wmbt-surface-or-residual.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.train.linearity.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.train.naming.convention.yaml +26 -0
- package/planner-nodes/nodes/planner.train.participants.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.train.production-implementation.convention.yaml +24 -0
- package/planner-nodes/nodes/planner.train.registry-coherence.convention.yaml +69 -0
- package/planner-nodes/nodes/planner.train.registry.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.train.route-category-assessment.convention.yaml +43 -0
- package/planner-nodes/nodes/planner.train.route-space-admission.convention.yaml +41 -0
- package/planner-nodes/nodes/planner.train.scope.convention.yaml +38 -0
- package/planner-nodes/nodes/planner.train.sequence.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.train.terminal-contract.convention.yaml +10 -0
- package/planner-nodes/nodes/planner.train.theme-alignment.convention.yaml +25 -0
- package/planner-nodes/nodes/planner.train.theme-orchestrator-urn.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.train.theme-ranges.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.train.validation-rules.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.train.variation-strategies.convention.yaml +26 -0
- package/planner-nodes/nodes/planner.wagon.artifact-contracts.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.wagon.complexity-model.convention.yaml +33 -0
- package/planner-nodes/nodes/planner.wagon.coupling-complexity.convention.yaml +32 -0
- package/planner-nodes/nodes/planner.wagon.definition.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.wagon.features-format.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.wagon.features.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.wagon.logical-vs-filesystem-naming.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.wagon.name-is-verb-object.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.wagon.no-consume-cycle.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.wagon.produce-consume-artifacts.convention.yaml +46 -0
- package/planner-nodes/nodes/planner.wagon.refinement-extraction.convention.yaml +49 -0
- package/planner-nodes/nodes/planner.wagon.semantic-coherence.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.wagon.separability.convention.yaml +33 -0
- package/planner-nodes/nodes/planner.wagon.slug-dirname-conversion.convention.yaml +26 -0
- package/planner-nodes/nodes/planner.wagon.telemetry-filesystem.convention.yaml +52 -0
- package/planner-nodes/nodes/planner.wagon.urn-naming.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.wagon.urn.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.wmbt.context-clarifier.convention.yaml +24 -0
- package/planner-nodes/nodes/planner.wmbt.definition.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.wmbt.dimension-selection.convention.yaml +37 -0
- package/planner-nodes/nodes/planner.wmbt.direction-selection.convention.yaml +41 -0
- package/planner-nodes/nodes/planner.wmbt.filename-pattern.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.wmbt.lens-selection.convention.yaml +44 -0
- package/planner-nodes/nodes/planner.wmbt.must-have-smoke-acceptance.convention.yaml +55 -0
- package/planner-nodes/nodes/planner.wmbt.object-of-control.convention.yaml +26 -0
- package/planner-nodes/nodes/planner.wmbt.shape.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.wmbt.splitting-rules.convention.yaml +37 -0
- package/planner-nodes/nodes/planner.wmbt.statement-template.convention.yaml +23 -0
- package/planner-nodes/nodes/planner.wmbt.step-code-vocabulary.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.wmbt.urn-naming.convention.yaml +31 -0
- package/planner-schemas/acceptance.schema.json +396 -0
- package/planner-schemas/appendix.schema.json +78 -0
- package/planner-schemas/author/convention-node.schema.json +134 -0
- package/planner-schemas/author/gate.schema.json +36 -0
- package/planner-schemas/author/issue.schema.json +72 -0
- package/planner-schemas/author/relationship.schema.json +19 -0
- package/planner-schemas/author/scope.schema.json +28 -0
- package/planner-schemas/binding-lock.schema.json +38 -0
- package/planner-schemas/component.schema.json +114 -0
- package/planner-schemas/contract-registry.schema.json +47 -0
- package/planner-schemas/feature.schema.json +208 -0
- package/planner-schemas/journey.schema.json +225 -0
- package/planner-schemas/registry-index.schema.json +54 -0
- package/planner-schemas/substrate-lock.schema.json +41 -0
- package/planner-schemas/substrate.schema.json +38 -0
- package/planner-schemas/theme-registry.schema.json +28 -0
- package/planner-schemas/train-interlocking-registry.schema.json +49 -0
- package/planner-schemas/train-interlocking.schema.json +459 -0
- package/planner-schemas/train.schema.json +361 -0
- package/planner-schemas/wagon.schema.json +283 -0
- package/planner-schemas/wmbt.schema.json +68 -0
- package/src/ci.ts +9 -0
- package/src/cli.ts +91 -0
- package/src/docs-capability.ts +156 -0
- package/src/enforce.ts +103 -0
- package/src/hooks.ts +48 -0
- package/src/index.ts +13 -0
- package/src/planner-kernel.ts +112 -0
- package/src/planner-schema-validator.ts +101 -0
- package/src/planner-validators.ts +288 -0
- package/src/register.ts +8 -0
- package/src/release.ts +9 -0
- package/src/setup.ts +15 -0
- package/templates/github/atdd-bun-release.yml +16 -0
- package/templates/github/atdd-bun.yml +26 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.runtime-single-lockfile
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Bun's lockfile is the only lockfile
|
|
6
|
+
statement: >-
|
|
7
|
+
A repository whose package manager is Bun MUST NOT carry `package-lock.json`, `yarn.lock` or
|
|
8
|
+
`pnpm-lock.yaml` alongside `bun.lock`/`bun.lockb`. Two lockfiles mean two resolvers disagree about
|
|
9
|
+
the dependency graph, and which one wins is decided by whichever command a developer or CI step
|
|
10
|
+
happens to run. This is the Bun-stack realization of the agnostic "dependency resolution has one
|
|
11
|
+
source of truth" obligation, enforced by the `bun_fullstack_detector` family implementation on
|
|
12
|
+
`atdd.workspace.bun`.
|
|
13
|
+
terms:
|
|
14
|
+
- term_id: foreign_lockfile
|
|
15
|
+
text: >-
|
|
16
|
+
`package-lock.json` (npm), `yarn.lock` (Yarn), `pnpm-lock.yaml`/`.yml` (pnpm) — a resolution record
|
|
17
|
+
written by a package manager that is not this stack's.
|
|
18
|
+
- term_id: resolution_drift
|
|
19
|
+
text: >-
|
|
20
|
+
the state where two lockfiles pin different versions of the same transitive dependency, so the
|
|
21
|
+
installed tree depends on which tool ran last. It is invisible in review because nobody reads a
|
|
22
|
+
lockfile diff.
|
|
23
|
+
content:
|
|
24
|
+
summary: >-
|
|
25
|
+
A "one lockfile" repo-hygiene obligation. The realization is a zero-dependency Bun detector that
|
|
26
|
+
walks the declared scan roots for foreign lockfile BASENAMES and reports each at line 1 — the file
|
|
27
|
+
itself is the fact, so there is no line to point at.
|
|
28
|
+
normative_text: |
|
|
29
|
+
This is the cheapest rule in the extension to satisfy and one of the most expensive to violate,
|
|
30
|
+
because its failure mode is the "works on my machine, breaks in CI" class that costs hours per
|
|
31
|
+
occurrence and is never attributed to its actual cause.
|
|
32
|
+
It also matters more during a migration than after one. A repo moving to Bun will pass through a
|
|
33
|
+
window where the old lockfile is still committed, and that window is exactly when the two graphs
|
|
34
|
+
diverge — someone runs `npm install` out of habit, the trees fork, and the divergence is discovered
|
|
35
|
+
much later in a failing deploy.
|
|
36
|
+
fix_hint: |
|
|
37
|
+
Delete the foreign lockfile and let Bun own resolution:
|
|
38
|
+
|
|
39
|
+
rm package-lock.json # or yarn.lock / pnpm-lock.yaml
|
|
40
|
+
bun install # regenerates bun.lock from package.json
|
|
41
|
+
|
|
42
|
+
Add the foreign names to `.gitignore` so a stray `npm install` cannot reintroduce one. `strict`.
|
|
43
|
+
exceptions:
|
|
44
|
+
- A vendored or fixture lockfile inside an excluded tree (`node_modules`, `dist`, `build`,
|
|
45
|
+
`_generated`) is never scanned.
|
|
46
|
+
- A monorepo package that is deliberately NOT on Bun should be scoped out via the consumer scope map,
|
|
47
|
+
not suppressed here.
|
|
48
|
+
metadata:
|
|
49
|
+
aliases:
|
|
50
|
+
- BUN-SINGLE-LOCKFILE-001
|
|
51
|
+
severity: 3
|
|
52
|
+
disposition: strict
|
|
53
|
+
introduced_in: 0.1.0
|
|
54
|
+
implementation:
|
|
55
|
+
type: validator
|
|
56
|
+
ref: bun_fullstack_detector
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.runtime-typecheck-enforced
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: A TypeScript Bun project actually typechecks its types
|
|
6
|
+
statement: >-
|
|
7
|
+
A Bun project containing TypeScript sources MUST have a typechecker it can run and MUST wire a
|
|
8
|
+
no-emit typecheck into its check path — TypeScript (or an equivalent native preview) as a
|
|
9
|
+
dependency, a `tsconfig.json`, and some script that runs a no-emit typecheck. Bun executes `.ts`
|
|
10
|
+
by STRIPPING types; it transpiles and never checks, and it bundles no `tsc`. Absent this, a Bun
|
|
11
|
+
stack is by default less type-safe than a tsc-based one.
|
|
12
|
+
terms:
|
|
13
|
+
- term_id: typechecker
|
|
14
|
+
text: >-
|
|
15
|
+
a tool that verifies types without emitting output — `tsc --noEmit`, `tsgo --noEmit`,
|
|
16
|
+
`vue-tsc`, `svelte-check`, `astro check`, or `tsc --build`. The obligation is that types ARE
|
|
17
|
+
checked; WHICH checker is the project's business.
|
|
18
|
+
- term_id: check_path
|
|
19
|
+
text: >-
|
|
20
|
+
the scripts a developer or CI runs to validate the project. A typecheck that exists but is
|
|
21
|
+
never invoked is not wired in — it is a tool sitting beside the build, not part of it.
|
|
22
|
+
- term_id: demonstrably_not_strict
|
|
23
|
+
text: >-
|
|
24
|
+
a `tsconfig.json` that either sets `"strict": false` outright, or enables no flag of the strict
|
|
25
|
+
family AND extends no base config. A tsconfig that `extends` something is NOT judged: this
|
|
26
|
+
rule's detector cannot resolve the base, and reporting what it cannot see would be a false
|
|
27
|
+
positive.
|
|
28
|
+
- term_id: disposition_rationale
|
|
29
|
+
text: >-
|
|
30
|
+
advisory because this states a stack norm rather than a defect, and because the consuming
|
|
31
|
+
projects have not been surveyed. The measurement below was TAKEN on 2026-09-06, not recalled.
|
|
32
|
+
values:
|
|
33
|
+
measured_2026_09_06: >-
|
|
34
|
+
0 consumer Bun projects surveyed. This hub is a package repository and contains no Bun
|
|
35
|
+
application to measure — its own .ts files are deliberately-wrong detector fixtures, which
|
|
36
|
+
is exactly why this rule is authored for consumers and never run against the hub.
|
|
37
|
+
measurement_target: afokapu/atdd-extensions @ main (the hub itself — deliberately not a consumer)
|
|
38
|
+
measurement_command: "find official -name '*.ts' -not -path '*/fixtures/*' | wc -l"
|
|
39
|
+
escalate_when: >-
|
|
40
|
+
A consumer Bun project has been surveyed, typescript + a wired no-emit typecheck are present,
|
|
41
|
+
and the team accepts blocking on it. Escalating to strict is a MAJOR change class.
|
|
42
|
+
content:
|
|
43
|
+
summary: >-
|
|
44
|
+
Bun's own gap, stated as a convention. `bun test`, `bun install`, `bun build`, `Bun.serve` and a
|
|
45
|
+
TS/JSX transpiler all ship; a typechecker does not. So `resolveTrain()` can return something
|
|
46
|
+
structurally wrong and Bun will run it happily.
|
|
47
|
+
normative_text: |
|
|
48
|
+
THIS IS COMPLEMENTARY TO THE OTHER BUN DETECTORS, NOT OVERLAPPING, and the distinction is the
|
|
49
|
+
reason the rule exists. Every detector in this stack is regex-over-source: they verify SHAPE.
|
|
50
|
+
`coder.bun.interlocking-resolution-model-exists` confirms an `InterlockingResolution` declaring
|
|
51
|
+
its eight fields is present — it cannot confirm that what `resolveTrain` actually returns
|
|
52
|
+
conforms to it. Only a typechecker can, and only if one is actually run.
|
|
53
|
+
|
|
54
|
+
DELIBERATELY UNFORCED, in four ways. This rule states a norm, not a blessed incantation:
|
|
55
|
+
|
|
56
|
+
SCOPE only a tree that is genuinely a TypeScript project — a package.json AND at
|
|
57
|
+
least one .ts/.tsx source. A JS-only Bun app carries no obligation at all.
|
|
58
|
+
HOW any recognised no-emit typechecker in any script satisfies it, as does a
|
|
59
|
+
script simply named `typecheck` / `check-types` / `types`.
|
|
60
|
+
WHERE TypeScript counts from `dependencies` or `devDependencies`.
|
|
61
|
+
STRICTNESS reported only when demonstrably off. A tsconfig that `extends` a base is left
|
|
62
|
+
alone, because the detector cannot resolve the base and a rule that reports
|
|
63
|
+
what it cannot see is worse than one that stays quiet.
|
|
64
|
+
|
|
65
|
+
WHERE IT APPLIES. The consumer repository, never this hub. The hub is a package repository: it
|
|
66
|
+
has no Bun application, its detectors are `.mjs`, and its `.ts` files are deliberately-wrong
|
|
67
|
+
fixtures that must NOT typecheck — `fixtures/dirty/interlocking_resolution_model/...` exists
|
|
68
|
+
precisely to be malformed.
|
|
69
|
+
fix_hint: |
|
|
70
|
+
Three small additions to a consumer project:
|
|
71
|
+
|
|
72
|
+
package.json "devDependencies": { "typescript": "^5.6.0" }
|
|
73
|
+
"scripts": { "typecheck": "tsc --noEmit",
|
|
74
|
+
"check": "bun run typecheck && bun test" }
|
|
75
|
+
tsconfig.json { "compilerOptions": { "strict": true, "noEmit": true } }
|
|
76
|
+
|
|
77
|
+
Any equivalent satisfies it — `svelte-check`, `astro check`, `vue-tsc`, or extending a strict
|
|
78
|
+
base config. What must not happen is types being stripped and never checked anywhere.
|
|
79
|
+
exceptions:
|
|
80
|
+
- A Bun project with no TypeScript sources is out of scope entirely.
|
|
81
|
+
- A tsconfig that `extends` a base config is never reported for strictness (see terms).
|
|
82
|
+
- This hub is not a consumer and is never scanned by this rule; its .ts files are fixtures.
|
|
83
|
+
metadata:
|
|
84
|
+
aliases:
|
|
85
|
+
- BUN-TYPECHECK-ENFORCED-001
|
|
86
|
+
severity: 2
|
|
87
|
+
disposition: advisory
|
|
88
|
+
introduced_in: 0.1.0
|
|
89
|
+
implementation:
|
|
90
|
+
type: validator
|
|
91
|
+
ref: coder.bun.runtime-typecheck-enforced
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.security-hardcoded-secret
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: No secret literals in source
|
|
6
|
+
statement: >-
|
|
7
|
+
Source MUST NOT contain a secret literal — an AWS access key id, a PEM private-key header, or a password
|
|
8
|
+
/ api-key / token assigned a literal string. Stack-neutral obligation, and one of only two rules in this
|
|
9
|
+
family that PORTS verbatim: the five patterns in the python-pytest sibling `coder.security.hardcoded-
|
|
10
|
+
secret` are language-neutral, because `password = "..."` and a PEM header look identical in Python and
|
|
11
|
+
TypeScript. Realized by `bun_security_hygiene_detector` (core alias SECURITY-HARDCODED-SECRET-001).
|
|
12
|
+
terms:
|
|
13
|
+
- term_id: secret_literal
|
|
14
|
+
text: >-
|
|
15
|
+
a credential written into source: an AWS key id, a PEM private-key header, or a password /
|
|
16
|
+
api-key / token assigned a literal string.
|
|
17
|
+
- term_id: rotation_not_deletion
|
|
18
|
+
text: >-
|
|
19
|
+
the actual remedy. Git keeps a committed secret, so removing the line does not fix it.
|
|
20
|
+
content:
|
|
21
|
+
summary: >-
|
|
22
|
+
Scans source and templates for the five transcribed secret patterns. `.example` / `.sample` /
|
|
23
|
+
`.template` files are documentation and are skipped.
|
|
24
|
+
normative_text: |
|
|
25
|
+
A committed secret is not fixed by deleting it, because git keeps it. It is fixed by ROTATING it, which is why detection has to happen before the commit rather than in review.
|
|
26
|
+
The rule reads assignment shape rather than entropy, so it catches the realistic case — someone pasting a working key to get unblocked — and deliberately does not attempt to judge whether a random-looking string is secret.
|
|
27
|
+
fix_hint: |
|
|
28
|
+
Move the value to the environment and read it at the edge:
|
|
29
|
+
|
|
30
|
+
const apiKey = "sk_live_0123456789abcdef"; // wrong
|
|
31
|
+
const apiKey = process.env.API_KEY; // right
|
|
32
|
+
|
|
33
|
+
If the literal was ever committed, rotate it — removing the line is not enough.
|
|
34
|
+
exceptions:
|
|
35
|
+
- "`.example`, `.sample` and `.template` files are placeholders, not secrets."
|
|
36
|
+
- Vendored and build directories are never scanned.
|
|
37
|
+
- Values read from `process.env` are never literals and are not matched.
|
|
38
|
+
metadata:
|
|
39
|
+
aliases:
|
|
40
|
+
# SECURITY-HARDCODED-SECRET-001 is the SHARED core alias, also carried by the agnostic node and its
|
|
41
|
+
# python-pytest realization.
|
|
42
|
+
- SECURITY-HARDCODED-SECRET-001
|
|
43
|
+
severity: 4
|
|
44
|
+
# PORTED verbatim from the python-pytest sibling — the pattern is
|
|
45
|
+
# language-neutral, so both providers produce the same findings.
|
|
46
|
+
disposition: strict
|
|
47
|
+
introduced_in: 0.1.0
|
|
48
|
+
implementation:
|
|
49
|
+
type: validator
|
|
50
|
+
ref: bun_security_hygiene_detector
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.security-missing-auth
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: State-changing routes perform an authorisation check
|
|
6
|
+
statement: >-
|
|
7
|
+
A route handler for POST, PUT, PATCH or DELETE MUST perform an authorisation check in its body. Stack-
|
|
8
|
+
neutral obligation, RE-REALIZED for Bun: the python-pytest sibling matches a FastAPI decorator whose
|
|
9
|
+
signature carries `Depends(get_current_user)`. Bun has neither decorators nor a DI container — routes
|
|
10
|
+
are entries in the `routes` object of `Bun.serve` or branches of a `fetch` handler, and authorisation is
|
|
11
|
+
an ordinary call. Realized by `bun_security_hygiene_detector` (core alias SECURITY-MISSING-AUTH-001).
|
|
12
|
+
terms:
|
|
13
|
+
- term_id: mutating_route
|
|
14
|
+
text: >-
|
|
15
|
+
a POST, PUT, PATCH or DELETE handler. GET is out of scope: a public read is normal in a
|
|
16
|
+
hypermedia app.
|
|
17
|
+
- term_id: authorisation_step
|
|
18
|
+
text: >-
|
|
19
|
+
a recognisable guard call inside the handler body. The rule asks whether the author
|
|
20
|
+
considered auth here at all, not which helper they used.
|
|
21
|
+
content:
|
|
22
|
+
summary: >-
|
|
23
|
+
Finds each mutating route entry or `req.method === "POST"` guard, brace-matches ITS handler body, and
|
|
24
|
+
reports the handler when no recognisable authorisation call appears inside it.
|
|
25
|
+
normative_text: |
|
|
26
|
+
Mutating methods only, deliberately. A public GET is normal in an htmx application — it is how fragments load — so requiring auth on reads would produce noise on the most common route in the codebase. A mutating handler with no auth call is the shape that leaks writes.
|
|
27
|
+
The set of recognised auth calls is broad on purpose. The rule asks whether the author thought about authorisation at this handler at all; it is not trying to enforce one blessed helper, and a project with its own guard should add that name rather than suppress the rule.
|
|
28
|
+
fix_hint: |
|
|
29
|
+
Call the guard first, and let it throw or return early:
|
|
30
|
+
|
|
31
|
+
POST: async (req) => {
|
|
32
|
+
const user = await requireUser(req); // authorise before any write
|
|
33
|
+
...
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
The check must be inside THIS handler — auth performed in a sibling route protects nothing.
|
|
37
|
+
exceptions:
|
|
38
|
+
- GET and HEAD handlers are out of scope (reads).
|
|
39
|
+
- A handler delegating to a wrapper that authorises internally should call it by a recognised name, or the wrapper name should be added to the rule.
|
|
40
|
+
- Test files are excluded.
|
|
41
|
+
metadata:
|
|
42
|
+
aliases:
|
|
43
|
+
# SECURITY-MISSING-AUTH-001 is the SHARED core alias, also carried by the agnostic node and its
|
|
44
|
+
# python-pytest realization.
|
|
45
|
+
- SECURITY-MISSING-AUTH-001
|
|
46
|
+
severity: 4
|
|
47
|
+
# RE-REALIZED, not ported: the python-pytest sibling inspects a Python
|
|
48
|
+
# AST for constructs this stack does not have. Same obligation, new detector.
|
|
49
|
+
disposition: strict
|
|
50
|
+
introduced_in: 0.1.0
|
|
51
|
+
implementation:
|
|
52
|
+
type: validator
|
|
53
|
+
ref: bun_security_hygiene_detector
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.security-sql-injection
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: SQL is parameterised, never interpolated or concatenated
|
|
6
|
+
statement: >-
|
|
7
|
+
SQL passed to a query sink MUST NOT be built by interpolating a template literal or concatenating
|
|
8
|
+
strings. Stack-neutral obligation, RE-REALIZED for Bun: the python-pytest sibling walks a Python AST for
|
|
9
|
+
`execute` / `executemany` / `raw` / `execute_sql` and its own manifest scopes it "python stack only".
|
|
10
|
+
Bun's sinks are `bun:sqlite` (`query` / `run` / `exec` / `prepare`), `Bun.sql` and the postgres/mysql
|
|
11
|
+
clients. Realized by `bun_security_hygiene_detector` (core alias SECURITY-SQL-INJECTION-001).
|
|
12
|
+
terms:
|
|
13
|
+
- term_id: query_sink
|
|
14
|
+
text: >-
|
|
15
|
+
a call that executes SQL: bun:sqlite's query / run / exec / prepare, or a postgres/mysql
|
|
16
|
+
client method.
|
|
17
|
+
- term_id: tagged_template
|
|
18
|
+
text: >-
|
|
19
|
+
`sql`…`` — a template invoking a function that PARAMETERISES each substitution. Safe by
|
|
20
|
+
construction, and visually almost identical to the untagged form that is not.
|
|
21
|
+
content:
|
|
22
|
+
summary: >-
|
|
23
|
+
Flags a query-sink call whose first argument is a template literal containing both a SQL keyword and a
|
|
24
|
+
`${}` interpolation, or a quoted SQL string followed by `+`.
|
|
25
|
+
normative_text: |
|
|
26
|
+
The load-bearing subtlety is that a TAGGED template is safe and an untagged one is not, and they look almost identical:
|
|
27
|
+
|
|
28
|
+
sql`SELECT * FROM orders WHERE id = ${id}` // safe — Bun.sql BINDS the value
|
|
29
|
+
db.query(`SELECT * FROM orders WHERE id = ${id}`) // injectable — the value is spliced
|
|
30
|
+
|
|
31
|
+
A tagged template invokes a function that parameterises each substitution; an untagged one produces a string before the sink ever sees it. The detector therefore flags only the second shape. This distinction has no Python analogue at all, which is why the rule had to be re-realized rather than translated.
|
|
32
|
+
fix_hint: |
|
|
33
|
+
Use the tagged template or explicit parameters:
|
|
34
|
+
|
|
35
|
+
db.query(`SELECT * FROM orders WHERE id = ${id}`) // wrong
|
|
36
|
+
db.query("SELECT * FROM orders WHERE id = ?").get(id) // right — bound parameter
|
|
37
|
+
await sql`SELECT * FROM orders WHERE id = ${id}` // right — Bun.sql binds
|
|
38
|
+
exceptions:
|
|
39
|
+
- Tagged templates (`sql`...``) are parameterised by construction and are never flagged.
|
|
40
|
+
- Template literals with no SQL keyword are not SQL and are skipped.
|
|
41
|
+
- Static SQL with no interpolation is not injectable.
|
|
42
|
+
metadata:
|
|
43
|
+
aliases:
|
|
44
|
+
# SECURITY-SQL-INJECTION-001 is the SHARED core alias, also carried by the agnostic node and its
|
|
45
|
+
# python-pytest realization.
|
|
46
|
+
- SECURITY-SQL-INJECTION-001
|
|
47
|
+
severity: 4
|
|
48
|
+
# RE-REALIZED, not ported: the python-pytest sibling inspects a Python
|
|
49
|
+
# AST for constructs this stack does not have. Same obligation, new detector.
|
|
50
|
+
disposition: strict
|
|
51
|
+
introduced_in: 0.1.0
|
|
52
|
+
implementation:
|
|
53
|
+
type: validator
|
|
54
|
+
ref: bun_security_hygiene_detector
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.station-master-interlocking-routing
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Station Master routes both direct and interlocking journeys, delegating to TrainRunner (Bun)
|
|
6
|
+
statement: >-
|
|
7
|
+
The Station Master composition root (`server.ts`) MUST support both direct train routing and
|
|
8
|
+
interlocking-enabled routing: its `JOURNEY_MAP` MUST admit a direct `trainId` string AND an
|
|
9
|
+
`{interlockingId, path}` route object, and when an interlocking route is present the Station Master MUST
|
|
10
|
+
reference `InterlockingRunner` and ultimately reference `TrainRunner` for the selected train. This is
|
|
11
|
+
the Bun-stack realization of the agnostic core obligation
|
|
12
|
+
`coder.train.station-master-interlocking-routing` (core afokapu/atdd#1251); the JS detector that
|
|
13
|
+
enforces it is the atdd.workspace.bun implementation referenced below.
|
|
14
|
+
implementation:
|
|
15
|
+
type: validator
|
|
16
|
+
ref: coder.bun.station-master-interlocking-routing
|
|
17
|
+
content:
|
|
18
|
+
summary: >-
|
|
19
|
+
An agnostic "Station Master is wired for interlocking" obligation, rendered for the Bun application.
|
|
20
|
+
The JS realization scans `server.ts`: when JOURNEY_MAP declares an interlocking route object, the
|
|
21
|
+
module MUST reference `InterlockingRunner` (else unlinked) and `TrainRunner` (else no delegation).
|
|
22
|
+
Member of the `bun_interlocking_infrastructure` FAMILY detector (checks/interlocking_station_routing.mjs).
|
|
23
|
+
normative_text: |
|
|
24
|
+
Core runtime spec afokapu/atdd#1251 — the additive call model:
|
|
25
|
+
|
|
26
|
+
Station Master -> InterlockingRunner.resolveTrain(action, inputs, state)
|
|
27
|
+
-> TrainRunner.execute(selectedTrainId, ...)
|
|
28
|
+
|
|
29
|
+
The existing direct mapping (`JOURNEY_MAP[action] = "<trainId>"`) remains valid; the interlocking
|
|
30
|
+
mapping (`{interlockingId, path}`) is additive. In BOTH cases the final train execution is performed
|
|
31
|
+
by TrainRunner. A Station Master that declares an interlocking route but never routes through
|
|
32
|
+
InterlockingRunner, or never reaches TrainRunner, breaks the contract. WHICH entrypoint is inspected
|
|
33
|
+
and HOW the routing is recognized is the per-stack detector's concern.
|
|
34
|
+
fix_hint: |
|
|
35
|
+
Route through the runner and delegate:
|
|
36
|
+
|
|
37
|
+
import { InterlockingRunner } from "./trains/interlocking";
|
|
38
|
+
import { TrainRunner } from "./trains/runner";
|
|
39
|
+
export const JOURNEY_MAP = {
|
|
40
|
+
start_match: "train:match:solo-match-complete", // direct
|
|
41
|
+
resolve_match: { interlockingId: "...", path: "...yaml" }, // interlocking
|
|
42
|
+
};
|
|
43
|
+
// interlocking branch: new InterlockingRunner(path).execute(...) -> TrainRunner.execute(...)
|
|
44
|
+
|
|
45
|
+
This rule is `strict`: an unlinked or non-delegating Station Master is not suppressible and fails CI.
|
|
46
|
+
exceptions:
|
|
47
|
+
- Applies only when JOURNEY_MAP declares at least one interlocking route object; a pure direct-train
|
|
48
|
+
Station Master carries no interlocking obligation.
|
|
49
|
+
metadata:
|
|
50
|
+
aliases:
|
|
51
|
+
- BUN-STATION-MASTER-INTERLOCKING-ROUTING-001
|
|
52
|
+
severity: 4
|
|
53
|
+
disposition: strict
|
|
54
|
+
introduced_in: 0.1.0
|
|
55
|
+
core_design_refs:
|
|
56
|
+
- afokapu/atdd#1246
|
|
57
|
+
- afokapu/atdd#1251
|
|
58
|
+
terms:
|
|
59
|
+
- term_id: station_master
|
|
60
|
+
text: >-
|
|
61
|
+
the composition root (`server.ts`) whose JOURNEY_MAP routes both direct trainId strings and
|
|
62
|
+
interlocking route objects, referencing InterlockingRunner and ultimately calling TrainRunner.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.station-master-journey-routing
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Station Master reaches exposed journey topology through JourneyRunner (Bun)
|
|
6
|
+
statement: >-
|
|
7
|
+
Every journey document with entrypoint.exposed=true MUST be reachable from the Bun Station Master
|
|
8
|
+
composition root. Each declared entrypoint action MUST appear in server.ts JOURNEY_MAP as a
|
|
9
|
+
{journeyId, path} mapping to that journey document, and the Station Master MUST reference
|
|
10
|
+
JourneyRunner. Internal journeys (entrypoint.exposed=false) carry no Station Master reachability
|
|
11
|
+
obligation. This closes the public entry direction for the higher-order journey topology without
|
|
12
|
+
weakening the existing direct-train or direct-interlocking mappings.
|
|
13
|
+
implementation:
|
|
14
|
+
type: validator
|
|
15
|
+
ref: coder.bun.station-master-journey-routing
|
|
16
|
+
content:
|
|
17
|
+
summary: >-
|
|
18
|
+
Binds journey declaration -> Station Master reachability -> JourneyRunner. It reads
|
|
19
|
+
plan/_journeys/**/*.yaml, selects exposed journeys, and verifies that each declared action maps
|
|
20
|
+
to the same journey_id/path in JOURNEY_MAP and that server.ts references JourneyRunner.
|
|
21
|
+
normative_text: |
|
|
22
|
+
The Station Master admits three additive route forms:
|
|
23
|
+
|
|
24
|
+
action -> "train:<subject>:<slug>"
|
|
25
|
+
action -> { interlockingId, path }
|
|
26
|
+
action -> { journeyId, path: "plan/_journeys/<id>.yaml" }
|
|
27
|
+
|
|
28
|
+
For a journey route the call boundary is:
|
|
29
|
+
|
|
30
|
+
Station Master -> JourneyRunner(journeyPath) -> InterlockingRunner -> TrainRunner
|
|
31
|
+
|
|
32
|
+
The journey document is authoritative for continuation topology. JOURNEY_MAP only establishes
|
|
33
|
+
external reachability; it must not restate continuation edges.
|
|
34
|
+
fix_hint: |
|
|
35
|
+
For every exposed journey action, add a JOURNEY_MAP entry whose journeyId and path point to the
|
|
36
|
+
declared journey document and dispatch it through JourneyRunner.
|
|
37
|
+
exceptions:
|
|
38
|
+
- Journeys with entrypoint.exposed:false are intentionally not Station-Master-reachable.
|
|
39
|
+
metadata:
|
|
40
|
+
aliases:
|
|
41
|
+
- BUN-STATION-MASTER-JOURNEY-ROUTING-001
|
|
42
|
+
severity: 4
|
|
43
|
+
disposition: strict
|
|
44
|
+
introduced_in: 0.1.0
|
|
45
|
+
terms:
|
|
46
|
+
- term_id: journey_reachability
|
|
47
|
+
text: the declaration-to-composition-root binding that makes an exposed journey executable.
|
|
48
|
+
- term_id: journey_mapping
|
|
49
|
+
text: a Station Master JOURNEY_MAP value carrying journeyId and the canonical journey YAML path.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.wagon-honours-its-contract
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: A wagon's implementation moves the artifacts its plan document declares (Bun)
|
|
6
|
+
statement: >-
|
|
7
|
+
A wagon document declares a DATA CONTRACT: `produce[]` are the artifacts the wagon owns and
|
|
8
|
+
`consume[]` the ones it takes from other wagons (core `wagon.schema.json` requires both). The Bun
|
|
9
|
+
implementation MUST name each declared artifact where it moves Cargo, so the declaration and the
|
|
10
|
+
data actually carried cannot drift apart. Core validates that the contract is well formed; only a
|
|
11
|
+
per-stack detector can see whether this stack's code honours it.
|
|
12
|
+
implementation:
|
|
13
|
+
type: validator
|
|
14
|
+
ref: coder.bun.wagon-honours-its-contract
|
|
15
|
+
content:
|
|
16
|
+
summary: >-
|
|
17
|
+
Binds a wagon's declared artifact contract to the Bun code that moves Cargo. The JS realization
|
|
18
|
+
reads every wagon document under `plan/**`, collects the `produce[].name` and `consume[].name`
|
|
19
|
+
artifact names, and flags any that no Cargo-moving module names. Member of the
|
|
20
|
+
`bun_interlocking_infrastructure` FAMILY detector (checks/wagon_contract_honoured.mjs).
|
|
21
|
+
normative_text: |
|
|
22
|
+
Core `wagon.schema.json` requires `produce` and `consume`, each entry carrying an artifact `name`
|
|
23
|
+
(and, for produce, a `contract` and `telemetry` URN). Core validates that shape wherever the plan
|
|
24
|
+
lives; it cannot know whether a Bun module puts those artifacts into Cargo, because that means
|
|
25
|
+
reading Bun source and this stack's Cargo idiom.
|
|
26
|
+
|
|
27
|
+
The wagon implementation is recognised STRUCTURALLY — a module that moves artifacts through Cargo
|
|
28
|
+
— not by filename. A `wagon.ts` naming heuristic is the kind of fitted check this hub has had to
|
|
29
|
+
unpick more than once, and a consumer is free to name its modules as it likes.
|
|
30
|
+
|
|
31
|
+
NOT_APPLICABLE, deliberately, in two cases. A consumer that declares no wagon contract has nothing
|
|
32
|
+
to honour. A contract declared with no wagon implementation at all is an unimplemented feature,
|
|
33
|
+
not a broken contract, and belongs to whatever rule governs unimplemented plan; reporting it here
|
|
34
|
+
would fire on every freshly planned repository.
|
|
35
|
+
fix_hint: |
|
|
36
|
+
Name each declared artifact where the wagon moves it, so the two cannot drift:
|
|
37
|
+
|
|
38
|
+
export const CONSUMES = "orders:priced-basket"; // plan: consume[].name
|
|
39
|
+
export const PRODUCES = "orders:confirmed-order"; // plan: produce[].name
|
|
40
|
+
|
|
41
|
+
export function runWagon(step: string, cargo: Cargo): void {
|
|
42
|
+
const basket = cargo.get(CONSUMES);
|
|
43
|
+
cargo.put(PRODUCES, { confirmed: true, basket });
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
Or correct the plan if the wagon no longer owns that artifact. This rule is `strict`: a wagon
|
|
47
|
+
whose declared contract nothing implements is not suppressible and fails CI.
|
|
48
|
+
exceptions:
|
|
49
|
+
- A wagon declared in the plan with no implementation anywhere is NOT reported here; the rule
|
|
50
|
+
judges code that exists against the contract it claims, not the absence of code.
|
|
51
|
+
metadata:
|
|
52
|
+
aliases:
|
|
53
|
+
- BUN-WAGON-CONTRACT-001
|
|
54
|
+
severity: 4
|
|
55
|
+
disposition: strict
|
|
56
|
+
introduced_in: 0.2.0
|
|
57
|
+
core_design_refs:
|
|
58
|
+
- afokapu/atdd#1246
|
|
59
|
+
- afokapu/atdd#1251
|
|
60
|
+
terms:
|
|
61
|
+
- term_id: wagon_data_contract
|
|
62
|
+
text: >-
|
|
63
|
+
the artifacts a wagon document declares under `produce[]` and `consume[]`, each identified by an
|
|
64
|
+
artifact `name`, which the wagon's Cargo-moving code must name.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.htmx.fragment-escapes-interpolation
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: HTML fragments escape interpolated values before htmx swaps them into the DOM
|
|
6
|
+
statement: >-
|
|
7
|
+
A template literal that emits HTML MUST NOT interpolate a bare variable or property chain
|
|
8
|
+
(`${user.name}`) directly into the markup; the value MUST pass through an escaping helper first. In a
|
|
9
|
+
full-stack Bun + htmx application the server renders fragments as template literals and htmx inserts
|
|
10
|
+
them into the live DOM via `innerHTML`, so there is no framework auto-escaping anywhere in the path.
|
|
11
|
+
This is the Bun/htmx-stack realization of the agnostic "untrusted data is escaped at the rendering
|
|
12
|
+
boundary" obligation, enforced by the `htmx_hypermedia_detector` family implementation on
|
|
13
|
+
`atdd.workspace.bun`.
|
|
14
|
+
terms:
|
|
15
|
+
- term_id: html_bearing_template
|
|
16
|
+
text: >-
|
|
17
|
+
a backtick template literal whose text contains an opening tag (`<div`, `<li …`). That is the
|
|
18
|
+
signal the literal is markup rather than a log line or a SQL string.
|
|
19
|
+
- term_id: bare_interpolation
|
|
20
|
+
text: >-
|
|
21
|
+
an interpolation whose expression is only an identifier or a property chain — `${title}`,
|
|
22
|
+
`${order.customer.name}`. No call, no operator, no literal. This is raw data reaching markup.
|
|
23
|
+
- term_id: composition
|
|
24
|
+
text: >-
|
|
25
|
+
an interpolation that is a CALL — `${escapeHtml(x)}`, `${rows.map(row).join("")}`. Either an escape
|
|
26
|
+
helper or fragment nesting; deliberately out of scope, because flagging it would bury the rule in
|
|
27
|
+
false positives on legitimate composition.
|
|
28
|
+
content:
|
|
29
|
+
summary: >-
|
|
30
|
+
A "fragments escape their data" obligation, and the security-critical rule of this extension. The
|
|
31
|
+
realization is a zero-dependency Bun detector that extracts every template literal (brace-depth
|
|
32
|
+
aware, so a nested object inside an interpolation does not end it early), keeps the ones containing
|
|
33
|
+
an opening tag, and flags interpolations whose expression is a bare identifier or property chain.
|
|
34
|
+
normative_text: |
|
|
35
|
+
This obligation is IMPLICIT in a JSX stack and EXPLICIT here, and that shift is the whole reason the
|
|
36
|
+
rule exists. React escapes `{value}` in JSX automatically; a team moving to htmx carries over the
|
|
37
|
+
habit of interpolating values into markup without carrying over the escaping that used to happen
|
|
38
|
+
invisibly underneath. The result is stored XSS in exactly the code that looks most like what they
|
|
39
|
+
wrote before.
|
|
40
|
+
The rule is deliberately narrow so that it is precise rather than noisy: it catches the shape that
|
|
41
|
+
is ALWAYS wrong — raw data dropped straight into markup — and says nothing about calls, which may
|
|
42
|
+
be escaping helpers or nested fragments. A call that neither escapes nor nests (`${format(bio)}`)
|
|
43
|
+
passes this rule and must be caught by review; narrowing was the price of a signal a team will not
|
|
44
|
+
switch off.
|
|
45
|
+
fix_hint: |
|
|
46
|
+
Route the value through an escaping helper at the interpolation site:
|
|
47
|
+
|
|
48
|
+
`<li class="order">${order.title}</li>` // ✗ raw data into markup
|
|
49
|
+
`<li class="order">${escapeHtml(order.title)}</li>` // ✓ escaped at the boundary
|
|
50
|
+
|
|
51
|
+
Escape at the RENDER site, never at the storage or fetch site: a value escaped early is
|
|
52
|
+
double-escaped when it reaches a non-HTML sink, and a value escaped late is escaped exactly once,
|
|
53
|
+
in the one place its destination is known. `strict` — this is the extension's security rule.
|
|
54
|
+
exceptions:
|
|
55
|
+
- Template literals containing no opening tag are not markup and are never scanned.
|
|
56
|
+
- Interpolations that are calls are treated as escaping or composition (see `composition`).
|
|
57
|
+
- Test files (`*.test.*`, `*.spec.*`) are excluded.
|
|
58
|
+
metadata:
|
|
59
|
+
aliases:
|
|
60
|
+
# SECURITY-XSS-001 is the SHARED core alias — the same one carried by
|
|
61
|
+
# coder.security.xss (core) and coder.vite.security-xss (the Vite realization).
|
|
62
|
+
# Carrying it is how a stack realization declares lineage in this hub: the three
|
|
63
|
+
# rules are one obligation with three per-stack detectors, and tooling that
|
|
64
|
+
# reasons about the obligation finds them through the shared alias.
|
|
65
|
+
- HTMX-FRAGMENT-ESCAPE-001
|
|
66
|
+
- SECURITY-XSS-001
|
|
67
|
+
severity: 1
|
|
68
|
+
disposition: strict
|
|
69
|
+
introduced_in: 0.1.0
|
|
70
|
+
implementation:
|
|
71
|
+
type: validator
|
|
72
|
+
ref: htmx_hypermedia_detector
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.htmx.swap-no-inline-handler
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: htmx-driven markup declares behaviour with hx-attributes, not inline handlers
|
|
6
|
+
statement: >-
|
|
7
|
+
Markup that uses htmx MUST NOT carry inline HTML event handlers (`onclick="…"`, `onsubmit="…"`,
|
|
8
|
+
`onchange="…"`, …). Behaviour in a hypermedia application is declared with `hx-trigger` and `hx-on`,
|
|
9
|
+
which participate in htmx's event and swap lifecycle; an inline handler does not. This is the
|
|
10
|
+
Bun/htmx-stack realization of the agnostic "behaviour is declared where the framework can see it"
|
|
11
|
+
obligation, enforced by the `htmx_hypermedia_detector` family implementation on
|
|
12
|
+
`atdd.workspace.bun`.
|
|
13
|
+
terms:
|
|
14
|
+
- term_id: htmx_driven_markup
|
|
15
|
+
text: >-
|
|
16
|
+
a file that contains at least one `hx-` attribute. The rule is SELF-SCOPING to these files: a plain
|
|
17
|
+
non-htmx page elsewhere in the repo is not this rule's business.
|
|
18
|
+
- term_id: inline_event_handler
|
|
19
|
+
text: >-
|
|
20
|
+
a lowercase HTML attribute of the form `on<event>="…"` carrying JavaScript in markup. Deliberately
|
|
21
|
+
lowercase-only, so React's camelCase JSX prop `onClick={…}` — a different mechanism with different
|
|
22
|
+
lifecycle semantics — is never flagged.
|
|
23
|
+
content:
|
|
24
|
+
summary: >-
|
|
25
|
+
A "no inline JS handlers in hypermedia markup" obligation. The realization is a zero-dependency Bun
|
|
26
|
+
detector that first confirms the file contains an `hx-` attribute, then flags any lowercase
|
|
27
|
+
`on<event>="` attribute in it.
|
|
28
|
+
normative_text: |
|
|
29
|
+
An inline handler is destroyed the moment htmx swaps the element that carries it, and any state it
|
|
30
|
+
closed over goes with it. Worse, the reverse also happens: a handler attached to an element that is
|
|
31
|
+
swapped OUT can remain live on a detached node, so a stale click keeps firing against markup the
|
|
32
|
+
user can no longer see. htmx has an explicit answer for both — `hx-on` for element-scoped
|
|
33
|
+
behaviour, `hx-trigger` for the request itself — and those survive swaps because htmx re-processes
|
|
34
|
+
the new content.
|
|
35
|
+
Mixing the two models is also why htmx codebases drift back toward a JS layer: each inline handler
|
|
36
|
+
is a small piece of behaviour that is invisible to the hypermedia lifecycle, and they accumulate.
|
|
37
|
+
fix_hint: |
|
|
38
|
+
Move the behaviour onto an htmx attribute:
|
|
39
|
+
|
|
40
|
+
<button hx-get="/rows/1" onclick="track('open')">Open</button> <!-- ✗ dies on swap -->
|
|
41
|
+
<button hx-get="/rows/1" hx-on::after-request="track('open')">Open</button> <!-- ✓ -->
|
|
42
|
+
|
|
43
|
+
For behaviour that is genuinely presentational and not request-related, attach it in a delegated
|
|
44
|
+
listener on a stable ancestor that is never swapped. Disposition is `suppress-and-clean`: existing
|
|
45
|
+
handlers are held flat by a ratchet baseline while they are migrated.
|
|
46
|
+
exceptions:
|
|
47
|
+
- Files containing no `hx-` attribute are never scanned (self-scoping).
|
|
48
|
+
- React/JSX camelCase props (`onClick={…}`, `onSubmit={…}`) are a different mechanism and are out of
|
|
49
|
+
scope.
|
|
50
|
+
- Test files (`*.test.*`, `*.spec.*`) are excluded.
|
|
51
|
+
metadata:
|
|
52
|
+
aliases:
|
|
53
|
+
- HTMX-NO-INLINE-HANDLER-001
|
|
54
|
+
severity: 3
|
|
55
|
+
disposition: suppress-and-clean
|
|
56
|
+
introduced_in: 0.1.0
|
|
57
|
+
implementation:
|
|
58
|
+
type: validator
|
|
59
|
+
ref: htmx_hypermedia_detector
|