@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.
Files changed (876) hide show
  1. package/HOOK_AUDIT.md +22 -0
  2. package/PLANNER_PORT.md +55 -0
  3. package/README.md +256 -0
  4. package/bunfig.toml +2 -0
  5. package/conventions/coder.bun/coder.bun.boundaries-http-client.convention.yaml +43 -0
  6. package/conventions/coder.bun/coder.bun.commons-application-no-integration.convention.yaml +40 -0
  7. package/conventions/coder.bun/coder.bun.commons-cross-feature-imports-in.convention.yaml +39 -0
  8. package/conventions/coder.bun/coder.bun.commons-domain-no-framework-import.convention.yaml +40 -0
  9. package/conventions/coder.bun/coder.bun.commons-domain-no-outbound.convention.yaml +41 -0
  10. package/conventions/coder.bun/coder.bun.complexity-cyclomatic.convention.yaml +51 -0
  11. package/conventions/coder.bun/coder.bun.complexity-length.convention.yaml +43 -0
  12. package/conventions/coder.bun/coder.bun.complexity-nesting.convention.yaml +49 -0
  13. package/conventions/coder.bun/coder.bun.composition-consumer.convention.yaml +40 -0
  14. package/conventions/coder.bun/coder.bun.composition-root.convention.yaml +42 -0
  15. package/conventions/coder.bun/coder.bun.dead-code-reachability.convention.yaml +49 -0
  16. package/conventions/coder.bun/coder.bun.design-hierarchy-import.convention.yaml +42 -0
  17. package/conventions/coder.bun/coder.bun.dto-mapper.convention.yaml +38 -0
  18. package/conventions/coder.bun/coder.bun.dto-placement.convention.yaml +39 -0
  19. package/conventions/coder.bun/coder.bun.dto-purity.convention.yaml +40 -0
  20. package/conventions/coder.bun/coder.bun.duplication-intra-layer.convention.yaml +47 -0
  21. package/conventions/coder.bun/coder.bun.error-response-bare-string.convention.yaml +47 -0
  22. package/conventions/coder.bun/coder.bun.error-response-code-format.convention.yaml +46 -0
  23. package/conventions/coder.bun/coder.bun.green-header-order.convention.yaml +61 -0
  24. package/conventions/coder.bun/coder.bun.green-header-purpose.convention.yaml +55 -0
  25. package/conventions/coder.bun/coder.bun.green-header-runtime.convention.yaml +56 -0
  26. package/conventions/coder.bun/coder.bun.green-header-tested-by.convention.yaml +63 -0
  27. package/conventions/coder.bun/coder.bun.green-urn-layer.convention.yaml +53 -0
  28. package/conventions/coder.bun/coder.bun.green-urn-marker.convention.yaml +67 -0
  29. package/conventions/coder.bun/coder.bun.green-urn-name-matches.convention.yaml +57 -0
  30. package/conventions/coder.bun/coder.bun.green-urn-pattern.convention.yaml +56 -0
  31. package/conventions/coder.bun/coder.bun.green-urn-side.convention.yaml +54 -0
  32. package/conventions/coder.bun/coder.bun.green-urn-wagon-feature.convention.yaml +56 -0
  33. package/conventions/coder.bun/coder.bun.interlocking-bilateral-binding.convention.yaml +132 -0
  34. package/conventions/coder.bun/coder.bun.interlocking-delegates-to-trainrunner.convention.yaml +56 -0
  35. package/conventions/coder.bun/coder.bun.interlocking-does-not-carry-cargo.convention.yaml +53 -0
  36. package/conventions/coder.bun/coder.bun.interlocking-resolution-model-exists.convention.yaml +61 -0
  37. package/conventions/coder.bun/coder.bun.interlocking-runner-exists.convention.yaml +64 -0
  38. package/conventions/coder.bun/coder.bun.journey-runner-boundary.convention.yaml +55 -0
  39. package/conventions/coder.bun/coder.bun.layer-naming.convention.yaml +41 -0
  40. package/conventions/coder.bun/coder.bun.logging-console.convention.yaml +47 -0
  41. package/conventions/coder.bun/coder.bun.logging-structured.convention.yaml +49 -0
  42. package/conventions/coder.bun/coder.bun.quality-comments.convention.yaml +44 -0
  43. package/conventions/coder.bun/coder.bun.quality-mi.convention.yaml +47 -0
  44. package/conventions/coder.bun/coder.bun.runtime-executes-the-declaration.convention.yaml +104 -0
  45. package/conventions/coder.bun/coder.bun.runtime-server-is-bun-serve.convention.yaml +64 -0
  46. package/conventions/coder.bun/coder.bun.runtime-single-lockfile.convention.yaml +56 -0
  47. package/conventions/coder.bun/coder.bun.runtime-typecheck-enforced.convention.yaml +91 -0
  48. package/conventions/coder.bun/coder.bun.security-hardcoded-secret.convention.yaml +50 -0
  49. package/conventions/coder.bun/coder.bun.security-missing-auth.convention.yaml +53 -0
  50. package/conventions/coder.bun/coder.bun.security-sql-injection.convention.yaml +54 -0
  51. package/conventions/coder.bun/coder.bun.station-master-interlocking-routing.convention.yaml +62 -0
  52. package/conventions/coder.bun/coder.bun.station-master-journey-routing.convention.yaml +49 -0
  53. package/conventions/coder.bun/coder.bun.wagon-honours-its-contract.convention.yaml +64 -0
  54. package/conventions/coder.htmx/coder.htmx.fragment-escapes-interpolation.convention.yaml +72 -0
  55. package/conventions/coder.htmx/coder.htmx.swap-no-inline-handler.convention.yaml +59 -0
  56. package/conventions/coder.htmx/coder.htmx.swap-oob-carries-id.convention.yaml +56 -0
  57. package/conventions/coder.htmx/coder.htmx.verb-destructive-confirms.convention.yaml +56 -0
  58. package/conventions/coder.htmx/coder.htmx.verb-endpoint-is-routed.convention.yaml +73 -0
  59. package/conventions/coder.htmx/coder.htmx.verb-endpoint-same-origin.convention.yaml +58 -0
  60. package/conventions/coder.htmx/coder.htmx.verb-mutation-signals-progress.convention.yaml +59 -0
  61. package/conventions/planner.docs/planner.docs.adr-registry-derived.convention.yaml +83 -0
  62. package/conventions/planner.docs/planner.docs.area-index-required.convention.yaml +67 -0
  63. package/conventions/planner.docs/planner.docs.artifact-path-shape.convention.yaml +82 -0
  64. package/conventions/planner.docs/planner.docs.asciidoc-only.convention.yaml +71 -0
  65. package/conventions/planner.docs/planner.docs.doc-id-unique.convention.yaml +65 -0
  66. package/conventions/planner.docs/planner.docs.graph-target-resolves.convention.yaml +87 -0
  67. package/conventions/planner.docs/planner.docs.identity-required.convention.yaml +68 -0
  68. package/conventions/planner.docs/planner.docs.reference-integrity.convention.yaml +74 -0
  69. package/conventions/planner.docs/planner.docs.undeclared-change.convention.yaml +80 -0
  70. package/conventions/tester.bun/tester.bun.acceptance-binding-declared.convention.yaml +49 -0
  71. package/conventions/tester.bun/tester.bun.acceptance-covers-tag-well-formed.convention.yaml +50 -0
  72. package/conventions/tester.bun/tester.bun.acceptance-resolves-to-declared.convention.yaml +61 -0
  73. package/conventions/tester.bun/tester.bun.interlocking-production-runner-used.convention.yaml +76 -0
  74. package/conventions/tester.bun/tester.bun.interlocking-route-coverage.convention.yaml +66 -0
  75. package/conventions/tester.bun/tester.bun.interlocking-smoke-coverage-for-station-master.convention.yaml +76 -0
  76. package/conventions/tester.bun/tester.bun.interlocking-trace-binds-declared-route.convention.yaml +74 -0
  77. package/conventions/tester.bun/tester.bun.interlocking-train-sequence-is-exercised.convention.yaml +77 -0
  78. package/conventions/tester.bun/tester.bun.red-behavioral-assertion.convention.yaml +51 -0
  79. package/conventions/tester.bun/tester.bun.red-fails-first.convention.yaml +52 -0
  80. package/conventions/tester.bun/tester.bun.routing-runtime-family.convention.yaml +41 -0
  81. package/conventions/tester.bun/tester.bun.security-auth.convention.yaml +46 -0
  82. package/conventions/tester.bun/tester.bun.security-input.convention.yaml +45 -0
  83. package/conventions/tester.bun/tester.bun.smoke-no-collaborator-substitution.convention.yaml +45 -0
  84. package/conventions/tester.bun/tester.bun.smoke-observable-assertion.convention.yaml +54 -0
  85. package/conventions/tester.bun/tester.bun.telemetry-emit.convention.yaml +46 -0
  86. package/conventions/tester.bun/tester.bun.test-carries-urn-identity.convention.yaml +51 -0
  87. package/conventions/tester.bun/tester.bun.test-imports-bun-test.convention.yaml +55 -0
  88. package/conventions/tester.bun/tester.bun.test-isolation-no-live-state.convention.yaml +50 -0
  89. package/conventions/tester.bun/tester.bun.test-no-self-skip.convention.yaml +46 -0
  90. package/conventions/tester.bun/tester.bun.test-phase-declared.convention.yaml +45 -0
  91. package/conventions/tester.htmx/tester.htmx.fragment-asserts-returned-markup.convention.yaml +52 -0
  92. package/conventions/tester.htmx/tester.htmx.swap-oob-asserts-destination-id.convention.yaml +48 -0
  93. package/conventions/tester.htmx/tester.htmx.verb-endpoint-coverage.convention.yaml +54 -0
  94. package/conventions/traceability/traceability.plan.executable-acceptance-has-test.convention.yaml +2 -0
  95. package/conventions/traceability/traceability.source.tested-by-present.convention.yaml +2 -0
  96. package/conventions/traceability/traceability.source.tested-by-resolves.convention.yaml +2 -0
  97. package/conventions/traceability/traceability.test.binding-resolves.convention.yaml +2 -0
  98. package/detectors/atdd_traceability_closure/atdd.implementation.yaml +8 -0
  99. package/detectors/atdd_traceability_closure/detect.mjs +84 -0
  100. package/detectors/atdd_traceability_closure/fixtures/clean/plan/orders/E001.yaml +4 -0
  101. package/detectors/atdd_traceability_closure/fixtures/clean/src/order.ts +4 -0
  102. package/detectors/atdd_traceability_closure/fixtures/clean/test/order.test.ts +4 -0
  103. package/detectors/atdd_traceability_closure/fixtures/dirty/plan/orders/E001.yaml +6 -0
  104. package/detectors/atdd_traceability_closure/fixtures/dirty/src/missing-test.ts +2 -0
  105. package/detectors/atdd_traceability_closure/fixtures/dirty/src/unknown-test.ts +4 -0
  106. package/detectors/atdd_traceability_closure/fixtures/dirty/test/bad-binding.test.ts +4 -0
  107. package/detectors/atdd_traceability_closure/fixtures/dirty/test/no-binding.test.ts +3 -0
  108. package/detectors/bun_clean_architecture_detector/atdd.implementation.yaml +42 -0
  109. package/detectors/bun_clean_architecture_detector/checks/_map.json +14 -0
  110. package/detectors/bun_clean_architecture_detector/checks/a_boundaries_http_client.mjs +36 -0
  111. package/detectors/bun_clean_architecture_detector/checks/a_commons_application_no_integration.mjs +37 -0
  112. package/detectors/bun_clean_architecture_detector/checks/a_commons_cross_feature.mjs +41 -0
  113. package/detectors/bun_clean_architecture_detector/checks/a_commons_domain_no_outbound.mjs +40 -0
  114. package/detectors/bun_clean_architecture_detector/checks/a_composition_consumer.mjs +33 -0
  115. package/detectors/bun_clean_architecture_detector/checks/a_composition_root.mjs +35 -0
  116. package/detectors/bun_clean_architecture_detector/checks/a_domain_no_framework.mjs +47 -0
  117. package/detectors/bun_clean_architecture_detector/checks/a_dto_mapper.mjs +31 -0
  118. package/detectors/bun_clean_architecture_detector/checks/a_dto_placement.mjs +30 -0
  119. package/detectors/bun_clean_architecture_detector/checks/a_dto_purity.mjs +59 -0
  120. package/detectors/bun_clean_architecture_detector/checks/a_hierarchy_import.mjs +48 -0
  121. package/detectors/bun_clean_architecture_detector/checks/a_layer_naming.mjs +41 -0
  122. package/detectors/bun_clean_architecture_detector/detect.mjs +46 -0
  123. package/detectors/bun_clean_architecture_detector/fixtures/clean/contracts/order.ts +5 -0
  124. package/detectors/bun_clean_architecture_detector/fixtures/clean/features/orders/application/place.ts +3 -0
  125. package/detectors/bun_clean_architecture_detector/fixtures/clean/features/orders/composition.ts +4 -0
  126. package/detectors/bun_clean_architecture_detector/fixtures/clean/features/orders/domain/total.ts +2 -0
  127. package/detectors/bun_clean_architecture_detector/fixtures/clean/features/orders/integration/order-mapper.ts +3 -0
  128. package/detectors/bun_clean_architecture_detector/fixtures/clean/features/orders/presentation/api.ts +3 -0
  129. package/detectors/bun_clean_architecture_detector/fixtures/dirty/commons/application/flow.ts +2 -0
  130. package/detectors/bun_clean_architecture_detector/fixtures/dirty/commons/domain/billing/rules.ts +1 -0
  131. package/detectors/bun_clean_architecture_detector/fixtures/dirty/commons/domain/orders/rules.ts +5 -0
  132. package/detectors/bun_clean_architecture_detector/fixtures/dirty/commons/integration/http.ts +1 -0
  133. package/detectors/bun_clean_architecture_detector/fixtures/dirty/features/billing/application/pay.ts +2 -0
  134. package/detectors/bun_clean_architecture_detector/fixtures/dirty/features/billing/domain/rules.ts +2 -0
  135. package/detectors/bun_clean_architecture_detector/fixtures/dirty/features/billing/helper.ts +1 -0
  136. package/detectors/bun_clean_architecture_detector/fixtures/dirty/features/billing/integration/client.ts +1 -0
  137. package/detectors/bun_clean_architecture_detector/fixtures/dirty/features/billing/presentation/api.ts +2 -0
  138. package/detectors/bun_fullstack_detector/atdd.implementation.yaml +23 -0
  139. package/detectors/bun_fullstack_detector/checks/_map.json +5 -0
  140. package/detectors/bun_fullstack_detector/checks/bun_runtime_server_is_bun_serve.mjs +39 -0
  141. package/detectors/bun_fullstack_detector/checks/bun_runtime_single_lockfile.mjs +40 -0
  142. package/detectors/bun_fullstack_detector/checks/bun_runtime_typecheck_enforced.mjs +133 -0
  143. package/detectors/bun_fullstack_detector/detect.mjs +46 -0
  144. package/detectors/bun_fullstack_detector/fixtures/clean/bun_runtime_server_is_bun_serve/server.ts +7 -0
  145. package/detectors/bun_fullstack_detector/fixtures/clean/bun_runtime_single_lockfile/bun.lock +1 -0
  146. package/detectors/bun_fullstack_detector/fixtures/clean/bun_runtime_typecheck_enforced/package.json +5 -0
  147. package/detectors/bun_fullstack_detector/fixtures/clean/bun_runtime_typecheck_enforced/server.ts +3 -0
  148. package/detectors/bun_fullstack_detector/fixtures/clean/bun_runtime_typecheck_enforced/tsconfig.json +1 -0
  149. package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_server_is_bun_serve/server.ts +5 -0
  150. package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_single_lockfile/bun.lock +1 -0
  151. package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_single_lockfile/package-lock.json +1 -0
  152. package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_typecheck_enforced/package.json +4 -0
  153. package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_typecheck_enforced/packages/second/index.ts +8 -0
  154. package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_typecheck_enforced/packages/second/package.json +1 -0
  155. package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_typecheck_enforced/server.ts +3 -0
  156. package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_typecheck_enforced/tsconfig.json +1 -0
  157. package/detectors/bun_green_traceability_detector/atdd.implementation.yaml +35 -0
  158. package/detectors/bun_green_traceability_detector/checks/_map.json +12 -0
  159. package/detectors/bun_green_traceability_detector/checks/green_header_order.mjs +24 -0
  160. package/detectors/bun_green_traceability_detector/checks/green_header_purpose.mjs +18 -0
  161. package/detectors/bun_green_traceability_detector/checks/green_header_runtime.mjs +25 -0
  162. package/detectors/bun_green_traceability_detector/checks/green_header_tested_by.mjs +15 -0
  163. package/detectors/bun_green_traceability_detector/checks/green_urn_layer.mjs +17 -0
  164. package/detectors/bun_green_traceability_detector/checks/green_urn_marker.mjs +18 -0
  165. package/detectors/bun_green_traceability_detector/checks/green_urn_name_matches.mjs +26 -0
  166. package/detectors/bun_green_traceability_detector/checks/green_urn_pattern.mjs +17 -0
  167. package/detectors/bun_green_traceability_detector/checks/green_urn_side.mjs +20 -0
  168. package/detectors/bun_green_traceability_detector/checks/green_urn_wagon_feature.mjs +20 -0
  169. package/detectors/bun_green_traceability_detector/detect.mjs +46 -0
  170. package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_order/OrderPanel.html +7 -0
  171. package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_order/OrderRow.ts +7 -0
  172. package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_purpose/OrderPanel.html +7 -0
  173. package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_purpose/OrderRow.ts +7 -0
  174. package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_runtime/OrderPanel.html +7 -0
  175. package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_runtime/OrderRow.ts +7 -0
  176. package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_tested_by/OrderPanel.html +7 -0
  177. package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_tested_by/OrderRow.ts +7 -0
  178. package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_layer/OrderPanel.html +7 -0
  179. package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_layer/OrderRow.ts +7 -0
  180. package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_marker/OrderPanel.html +7 -0
  181. package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_marker/OrderRow.ts +7 -0
  182. package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_name_matches/OrderPanel.html +7 -0
  183. package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_name_matches/OrderRow.ts +7 -0
  184. package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_pattern/OrderPanel.html +7 -0
  185. package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_pattern/OrderRow.ts +7 -0
  186. package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_side/OrderPanel.html +7 -0
  187. package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_side/OrderRow.ts +7 -0
  188. package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_wagon_feature/OrderPanel.html +7 -0
  189. package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_wagon_feature/OrderRow.ts +7 -0
  190. package/detectors/bun_green_traceability_detector/fixtures/dirty/green_header_order/OrderRow.ts +6 -0
  191. package/detectors/bun_green_traceability_detector/fixtures/dirty/green_header_purpose/OrderRow.ts +5 -0
  192. package/detectors/bun_green_traceability_detector/fixtures/dirty/green_header_runtime/OrderRow.ts +6 -0
  193. package/detectors/bun_green_traceability_detector/fixtures/dirty/green_header_tested_by/OrderPanel.html +5 -0
  194. package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_layer/OrderRow.ts +6 -0
  195. package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_marker/OrderRow.ts +3 -0
  196. package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_name_matches/OrderRow.ts +6 -0
  197. package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_pattern/OrderRow.ts +6 -0
  198. package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_side/OrderRow.ts +6 -0
  199. package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_wagon_feature/OrderRow.ts +6 -0
  200. package/detectors/bun_green_traceability_detector/urn_header.mjs +191 -0
  201. package/detectors/bun_interlocking_binding/atdd.implementation.yaml +31 -0
  202. package/detectors/bun_interlocking_binding/checks/interlocking_runtime_executes.mjs +168 -0
  203. package/detectors/bun_interlocking_binding/detect.mjs +608 -0
  204. package/detectors/bun_interlocking_binding/fixtures/clean/e2e/interlockings/match-resolution/trace.test.ts +10 -0
  205. package/detectors/bun_interlocking_binding/fixtures/clean/plan/_trains/_interlockings/match-resolution.yaml +51 -0
  206. package/detectors/bun_interlocking_binding/fixtures/clean/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
  207. package/detectors/bun_interlocking_binding/fixtures/clean/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
  208. package/detectors/bun_interlocking_binding/fixtures/clean/server.ts +19 -0
  209. package/detectors/bun_interlocking_binding/fixtures/clean/src/trains/interlocking.ts +66 -0
  210. package/detectors/bun_interlocking_binding/fixtures/clean/src/trains/runner.ts +7 -0
  211. package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/e2e/interlockings/match-resolution/trace.test.ts +10 -0
  212. package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/plan/_trains/_interlockings/match-resolution.yaml +57 -0
  213. package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
  214. package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
  215. package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/server.ts +19 -0
  216. package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/src/trains/interlocking.ts +28 -0
  217. package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/src/trains/runner.ts +7 -0
  218. package/detectors/bun_interlocking_binding/fixtures/dirty/e2e/interlockings/match-resolution/trace.test.ts +10 -0
  219. package/detectors/bun_interlocking_binding/fixtures/dirty/plan/_trains/_interlockings/match-resolution.yaml +51 -0
  220. package/detectors/bun_interlocking_binding/fixtures/dirty/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
  221. package/detectors/bun_interlocking_binding/fixtures/dirty/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
  222. package/detectors/bun_interlocking_binding/fixtures/dirty/server.ts +19 -0
  223. package/detectors/bun_interlocking_binding/fixtures/dirty/src/trains/interlocking.ts +28 -0
  224. package/detectors/bun_interlocking_binding/fixtures/dirty/src/trains/runner.ts +7 -0
  225. package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/e2e/interlockings/match-resolution/trace.test.ts +10 -0
  226. package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/plan/_trains/_interlockings/match-resolution.yaml +54 -0
  227. package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
  228. package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
  229. package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/server.ts +19 -0
  230. package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/src/trains/interlocking.ts +28 -0
  231. package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/src/trains/runner.ts +7 -0
  232. package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/e2e/interlockings/match-resolution/trace.test.ts +10 -0
  233. package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/plan/_trains/_interlockings/match-resolution.yaml +51 -0
  234. package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
  235. package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
  236. package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/server.ts +19 -0
  237. package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/src/trains/interlocking.ts +28 -0
  238. package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/src/trains/runner.ts +7 -0
  239. package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/e2e/interlockings/match-resolution/trace.test.ts +19 -0
  240. package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/plan/_trains/_interlockings/match-resolution.yaml +51 -0
  241. package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
  242. package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
  243. package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/server.ts +19 -0
  244. package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/src/trains/interlocking.ts +28 -0
  245. package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/src/trains/runner.ts +7 -0
  246. package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/e2e/interlockings/match-resolution/trace.test.ts +10 -0
  247. package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/plan/_trains/_interlockings/match-resolution.yaml +51 -0
  248. package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
  249. package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
  250. package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/server.ts +19 -0
  251. package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/src/trains/interlocking.ts +30 -0
  252. package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/src/trains/runner.ts +7 -0
  253. package/detectors/bun_interlocking_coverage/_shared/interlocking.mjs +389 -0
  254. package/detectors/bun_interlocking_coverage/atdd.implementation.yaml +27 -0
  255. package/detectors/bun_interlocking_coverage/checks/_map.json +7 -0
  256. package/detectors/bun_interlocking_coverage/checks/interlocking_production_runner.mjs +82 -0
  257. package/detectors/bun_interlocking_coverage/checks/interlocking_route_coverage.mjs +58 -0
  258. package/detectors/bun_interlocking_coverage/checks/interlocking_smoke_coverage.mjs +68 -0
  259. package/detectors/bun_interlocking_coverage/checks/interlocking_trace_binds.mjs +64 -0
  260. package/detectors/bun_interlocking_coverage/checks/interlocking_train_sequence.mjs +110 -0
  261. package/detectors/bun_interlocking_coverage/detect.mjs +46 -0
  262. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/e2e/interlockings/match-resolution/routes.test.ts +21 -0
  263. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/e2e/interlockings/match-resolution/trace.test.ts +17 -0
  264. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/e2e/smoke/resolve-match.smoke.test.ts +13 -0
  265. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/plan/_trains/_interlockings/match-resolution.yaml +51 -0
  266. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/e2e/interlockings/match-resolution/routes.test.ts +21 -0
  267. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/e2e/interlockings/match-resolution/trace.test.ts +17 -0
  268. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/e2e/smoke/resolve-match.smoke.test.ts +13 -0
  269. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/plan/_trains/_interlockings/match-resolution.yaml +51 -0
  270. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/e2e/interlockings/match-resolution/routes.test.ts +21 -0
  271. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/e2e/interlockings/match-resolution/trace.test.ts +17 -0
  272. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/e2e/smoke/resolve-match.smoke.test.ts +13 -0
  273. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/plan/_trains/_interlockings/match-resolution.yaml +51 -0
  274. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/e2e/interlockings/match-resolution/routes.test.ts +21 -0
  275. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/e2e/interlockings/match-resolution/trace.test.ts +17 -0
  276. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/e2e/smoke/resolve-match.smoke.test.ts +19 -0
  277. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/plan/_trains/_interlockings/match-resolution.yaml +51 -0
  278. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/e2e/interlockings/match-resolution/routes.test.ts +21 -0
  279. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/e2e/interlockings/match-resolution/trace.test.ts +17 -0
  280. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/e2e/smoke/resolve-match.smoke.test.ts +13 -0
  281. package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/plan/_trains/_interlockings/match-resolution.yaml +51 -0
  282. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_production_runner/e2e/interlockings/match-resolution/routes.test.ts +23 -0
  283. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_production_runner/e2e/interlockings/match-resolution/trace.test.ts +17 -0
  284. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_production_runner/e2e/smoke/resolve-match.smoke.test.ts +13 -0
  285. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_production_runner/plan/_trains/_interlockings/match-resolution.yaml +51 -0
  286. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_route_coverage/e2e/interlockings/match-resolution/routes.test.ts +12 -0
  287. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_route_coverage/e2e/interlockings/match-resolution/trace.test.ts +17 -0
  288. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_route_coverage/e2e/smoke/resolve-match.smoke.test.ts +13 -0
  289. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_route_coverage/plan/_trains/_interlockings/match-resolution.yaml +51 -0
  290. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_smoke_coverage/e2e/interlockings/match-resolution/routes.test.ts +21 -0
  291. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_smoke_coverage/e2e/interlockings/match-resolution/trace.test.ts +17 -0
  292. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_smoke_coverage/plan/_trains/_interlockings/match-resolution.yaml +51 -0
  293. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_trace_binds/e2e/interlockings/match-resolution/routes.test.ts +21 -0
  294. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_trace_binds/e2e/interlockings/match-resolution/trace.test.ts +13 -0
  295. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_trace_binds/e2e/smoke/resolve-match.smoke.test.ts +13 -0
  296. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_trace_binds/plan/_trains/_interlockings/match-resolution.yaml +51 -0
  297. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_train_sequence/e2e/interlockings/match-resolution/routes.test.ts +16 -0
  298. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_train_sequence/plan/_trains/_interlockings/match-resolution.yaml +51 -0
  299. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_train_sequence/plan/_trains/train:match:match-resolution-standard.yaml +8 -0
  300. package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_train_sequence/plan/_trains/train:match:match-resolution-timeout.yaml +5 -0
  301. package/detectors/bun_interlocking_infrastructure/_shared/interlocking.mjs +477 -0
  302. package/detectors/bun_interlocking_infrastructure/atdd.implementation.yaml +32 -0
  303. package/detectors/bun_interlocking_infrastructure/checks/_map.json +10 -0
  304. package/detectors/bun_interlocking_infrastructure/checks/interlocking_delegates.mjs +70 -0
  305. package/detectors/bun_interlocking_infrastructure/checks/interlocking_no_cargo.mjs +62 -0
  306. package/detectors/bun_interlocking_infrastructure/checks/interlocking_resolution_model.mjs +64 -0
  307. package/detectors/bun_interlocking_infrastructure/checks/interlocking_runner_exists.mjs +73 -0
  308. package/detectors/bun_interlocking_infrastructure/checks/interlocking_station_routing.mjs +62 -0
  309. package/detectors/bun_interlocking_infrastructure/checks/journey_runner_boundary.mjs +153 -0
  310. package/detectors/bun_interlocking_infrastructure/checks/journey_station_routing.mjs +119 -0
  311. package/detectors/bun_interlocking_infrastructure/checks/wagon_contract_honoured.mjs +149 -0
  312. package/detectors/bun_interlocking_infrastructure/detect.mjs +46 -0
  313. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_delegates/server.ts +22 -0
  314. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_delegates/src/match/wagon.ts +6 -0
  315. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_delegates/src/trains/interlocking.ts +41 -0
  316. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_delegates/src/trains/runner.ts +28 -0
  317. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_no_cargo/server.ts +22 -0
  318. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_no_cargo/src/match/wagon.ts +6 -0
  319. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_no_cargo/src/trains/interlocking.ts +41 -0
  320. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_no_cargo/src/trains/runner.ts +28 -0
  321. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_resolution_model/server.ts +22 -0
  322. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_resolution_model/src/match/wagon.ts +6 -0
  323. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_resolution_model/src/trains/interlocking.ts +41 -0
  324. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_resolution_model/src/trains/runner.ts +28 -0
  325. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_runner_exists/server.ts +22 -0
  326. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_runner_exists/src/match/wagon.ts +6 -0
  327. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_runner_exists/src/trains/interlocking.ts +41 -0
  328. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_runner_exists/src/trains/runner.ts +28 -0
  329. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_station_routing/server.ts +22 -0
  330. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_station_routing/src/match/wagon.ts +6 -0
  331. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_station_routing/src/trains/interlocking.ts +41 -0
  332. package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_station_routing/src/trains/runner.ts +28 -0
  333. package/detectors/bun_interlocking_infrastructure/fixtures/clean/journey_runner_boundary/plan/_journeys/example.yaml +16 -0
  334. package/detectors/bun_interlocking_infrastructure/fixtures/clean/journey_runner_boundary/src/trains/journey.ts +15 -0
  335. package/detectors/bun_interlocking_infrastructure/fixtures/clean/journey_station_routing/plan/_journeys/public.yaml +16 -0
  336. package/detectors/bun_interlocking_infrastructure/fixtures/clean/journey_station_routing/server.ts +13 -0
  337. package/detectors/bun_interlocking_infrastructure/fixtures/clean/journey_station_routing/src/trains/journey.ts +14 -0
  338. package/detectors/bun_interlocking_infrastructure/fixtures/clean/wagon_contract_honoured/plan/orders/_orders.yaml +17 -0
  339. package/detectors/bun_interlocking_infrastructure/fixtures/clean/wagon_contract_honoured/src/orders/wagon.ts +15 -0
  340. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_delegates/server.ts +22 -0
  341. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_delegates/src/match/wagon.ts +6 -0
  342. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_delegates/src/trains/interlocking.ts +49 -0
  343. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_delegates/src/trains/runner.ts +28 -0
  344. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_no_cargo/server.ts +22 -0
  345. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_no_cargo/src/match/wagon.ts +11 -0
  346. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_no_cargo/src/trains/interlocking.ts +42 -0
  347. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_no_cargo/src/trains/runner.ts +28 -0
  348. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_resolution_model/server.ts +22 -0
  349. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_resolution_model/src/match/wagon.ts +6 -0
  350. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_resolution_model/src/trains/interlocking.ts +21 -0
  351. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_resolution_model/src/trains/runner.ts +28 -0
  352. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_runner_exists/server.ts +22 -0
  353. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_runner_exists/src/match/wagon.ts +6 -0
  354. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_runner_exists/src/trains/interlocking.ts +16 -0
  355. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_runner_exists/src/trains/runner.ts +28 -0
  356. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_station_routing/server.ts +19 -0
  357. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_station_routing/src/match/wagon.ts +6 -0
  358. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_station_routing/src/trains/interlocking.ts +41 -0
  359. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_station_routing/src/trains/runner.ts +28 -0
  360. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/journey_runner_boundary/plan/_journeys/example.yaml +16 -0
  361. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/journey_runner_boundary/src/trains/journey.ts +14 -0
  362. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/journey_station_routing/plan/_journeys/public.yaml +16 -0
  363. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/journey_station_routing/server.ts +10 -0
  364. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/journey_station_routing/src/trains/journey.ts +14 -0
  365. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/wagon_contract_honoured/plan/orders/_orders.yaml +17 -0
  366. package/detectors/bun_interlocking_infrastructure/fixtures/dirty/wagon_contract_honoured/src/orders/wagon.ts +13 -0
  367. package/detectors/bun_security_hygiene_detector/atdd.implementation.yaml +33 -0
  368. package/detectors/bun_security_hygiene_detector/checks/_map.json +9 -0
  369. package/detectors/bun_security_hygiene_detector/checks/err_bare_string.mjs +38 -0
  370. package/detectors/bun_security_hygiene_detector/checks/err_code_format.mjs +36 -0
  371. package/detectors/bun_security_hygiene_detector/checks/log_console.mjs +33 -0
  372. package/detectors/bun_security_hygiene_detector/checks/log_structured.mjs +36 -0
  373. package/detectors/bun_security_hygiene_detector/checks/sec_hardcoded_secret.mjs +43 -0
  374. package/detectors/bun_security_hygiene_detector/checks/sec_missing_auth.mjs +63 -0
  375. package/detectors/bun_security_hygiene_detector/checks/sec_sql_injection.mjs +56 -0
  376. package/detectors/bun_security_hygiene_detector/detect.mjs +46 -0
  377. package/detectors/bun_security_hygiene_detector/fixtures/clean/server.ts +24 -0
  378. package/detectors/bun_security_hygiene_detector/fixtures/dirty/db.ts +6 -0
  379. package/detectors/bun_security_hygiene_detector/fixtures/dirty/errors.ts +6 -0
  380. package/detectors/bun_security_hygiene_detector/fixtures/dirty/logging.ts +4 -0
  381. package/detectors/bun_security_hygiene_detector/fixtures/dirty/routes.ts +10 -0
  382. package/detectors/bun_security_hygiene_detector/fixtures/dirty/secrets.ts +3 -0
  383. package/detectors/bun_tester_discipline_detector/atdd.implementation.yaml +46 -0
  384. package/detectors/bun_tester_discipline_detector/checks/_map.json +18 -0
  385. package/detectors/bun_tester_discipline_detector/checks/t_acceptance_binding.mjs +19 -0
  386. package/detectors/bun_tester_discipline_detector/checks/t_acceptance_covers_tag.mjs +25 -0
  387. package/detectors/bun_tester_discipline_detector/checks/t_acceptance_resolves.mjs +106 -0
  388. package/detectors/bun_tester_discipline_detector/checks/t_isolation_no_live_state.mjs +40 -0
  389. package/detectors/bun_tester_discipline_detector/checks/t_red_behavioral.mjs +35 -0
  390. package/detectors/bun_tester_discipline_detector/checks/t_red_fails_first.mjs +30 -0
  391. package/detectors/bun_tester_discipline_detector/checks/t_routing_runtime.mjs +22 -0
  392. package/detectors/bun_tester_discipline_detector/checks/t_security_auth.mjs +26 -0
  393. package/detectors/bun_tester_discipline_detector/checks/t_security_input.mjs +25 -0
  394. package/detectors/bun_tester_discipline_detector/checks/t_smoke_no_substitution.mjs +25 -0
  395. package/detectors/bun_tester_discipline_detector/checks/t_smoke_observable.mjs +28 -0
  396. package/detectors/bun_tester_discipline_detector/checks/t_telemetry_emit.mjs +27 -0
  397. package/detectors/bun_tester_discipline_detector/checks/t_test_imports_bun_test.mjs +31 -0
  398. package/detectors/bun_tester_discipline_detector/checks/t_test_no_self_skip.mjs +34 -0
  399. package/detectors/bun_tester_discipline_detector/checks/t_test_phase_declared.mjs +21 -0
  400. package/detectors/bun_tester_discipline_detector/checks/t_urn_identity.mjs +18 -0
  401. package/detectors/bun_tester_discipline_detector/detect.mjs +46 -0
  402. package/detectors/bun_tester_discipline_detector/fixtures/clean/audit.sec.test.ts +15 -0
  403. package/detectors/bun_tester_discipline_detector/fixtures/clean/checkout.red.test.ts +16 -0
  404. package/detectors/bun_tester_discipline_detector/fixtures/clean/emit.telemetry.test.ts +15 -0
  405. package/detectors/bun_tester_discipline_detector/fixtures/clean/marked.red.test.ts +14 -0
  406. package/detectors/bun_tester_discipline_detector/fixtures/clean/orders.smoke.test.ts +16 -0
  407. package/detectors/bun_tester_discipline_detector/fixtures/clean/payload.input.test.ts +13 -0
  408. package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E001.yaml +9 -0
  409. package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E002.yaml +9 -0
  410. package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E020.yaml +9 -0
  411. package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E021.yaml +9 -0
  412. package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E022.yaml +9 -0
  413. package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E023.yaml +9 -0
  414. package/detectors/bun_tester_discipline_detector/fixtures/dirty/badcovers.test.ts +7 -0
  415. package/detectors/bun_tester_discipline_detector/fixtures/dirty/badphase.test.ts +6 -0
  416. package/detectors/bun_tester_discipline_detector/fixtures/dirty/foreign_harness.test.ts +6 -0
  417. package/detectors/bun_tester_discipline_detector/fixtures/dirty/happy.auth.test.ts +9 -0
  418. package/detectors/bun_tester_discipline_detector/fixtures/dirty/happy.input.test.ts +9 -0
  419. package/detectors/bun_tester_discipline_detector/fixtures/dirty/internal.smoke.test.ts +10 -0
  420. package/detectors/bun_tester_discipline_detector/fixtures/dirty/no_header.test.ts +2 -0
  421. package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E004.yaml +9 -0
  422. package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E005.yaml +9 -0
  423. package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E006.yaml +9 -0
  424. package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E007.yaml +9 -0
  425. package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E008.yaml +9 -0
  426. package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E009.yaml +9 -0
  427. package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E010.yaml +9 -0
  428. package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E024.yaml +9 -0
  429. package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E025.yaml +9 -0
  430. package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E026.yaml +9 -0
  431. package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E027.yaml +9 -0
  432. package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E028.yaml +9 -0
  433. package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E030.yaml +9 -0
  434. package/detectors/bun_tester_discipline_detector/fixtures/dirty/polluting.test.ts +11 -0
  435. package/detectors/bun_tester_discipline_detector/fixtures/dirty/quiet.telemetry.test.ts +9 -0
  436. package/detectors/bun_tester_discipline_detector/fixtures/dirty/skipped.test.ts +6 -0
  437. package/detectors/bun_tester_discipline_detector/fixtures/dirty/substituted.smoke.test.ts +13 -0
  438. package/detectors/bun_tester_discipline_detector/fixtures/dirty/unbound.test.ts +5 -0
  439. package/detectors/bun_tester_discipline_detector/fixtures/dirty/unmarked.red.test.ts +7 -0
  440. package/detectors/bun_tester_discipline_detector/fixtures/dirty/unresolvable_binding.test.ts +17 -0
  441. package/detectors/bun_tester_discipline_detector/fixtures/dirty/vacuous.red.test.ts +7 -0
  442. package/detectors/bun_tester_discipline_detector/fixtures/dirty/wrongruntime.test.ts +7 -0
  443. package/detectors/bun_tester_discipline_detector/test_header.mjs +160 -0
  444. package/detectors/bun_ts_metrics_detector/atdd.implementation.yaml +34 -0
  445. package/detectors/bun_ts_metrics_detector/checks/_map.json +9 -0
  446. package/detectors/bun_ts_metrics_detector/checks/ts_complexity_cyclomatic.mjs +36 -0
  447. package/detectors/bun_ts_metrics_detector/checks/ts_complexity_length.mjs +36 -0
  448. package/detectors/bun_ts_metrics_detector/checks/ts_complexity_nesting.mjs +36 -0
  449. package/detectors/bun_ts_metrics_detector/checks/ts_dead_code.mjs +58 -0
  450. package/detectors/bun_ts_metrics_detector/checks/ts_duplication.mjs +70 -0
  451. package/detectors/bun_ts_metrics_detector/checks/ts_quality_comments.mjs +30 -0
  452. package/detectors/bun_ts_metrics_detector/checks/ts_quality_mi.mjs +30 -0
  453. package/detectors/bun_ts_metrics_detector/detect.mjs +46 -0
  454. package/detectors/bun_ts_metrics_detector/fixtures/clean/domain/label.ts +6 -0
  455. package/detectors/bun_ts_metrics_detector/fixtures/clean/domain/total.ts +8 -0
  456. package/detectors/bun_ts_metrics_detector/fixtures/clean/index.ts +7 -0
  457. package/detectors/bun_ts_metrics_detector/fixtures/dirty/bare.ts +2 -0
  458. package/detectors/bun_ts_metrics_detector/fixtures/dirty/big.ts +600 -0
  459. package/detectors/bun_ts_metrics_detector/fixtures/dirty/consumer.ts +2 -0
  460. package/detectors/bun_ts_metrics_detector/fixtures/dirty/domain/a.ts +9 -0
  461. package/detectors/bun_ts_metrics_detector/fixtures/dirty/domain/b.ts +9 -0
  462. package/detectors/bun_ts_metrics_detector/fixtures/dirty/gnarly.ts +22 -0
  463. package/detectors/bun_ts_metrics_detector/fixtures/dirty/index.ts +8 -0
  464. package/detectors/bun_ts_metrics_detector/fixtures/dirty/long.ts +64 -0
  465. package/detectors/bun_ts_metrics_detector/fixtures/dirty/orphan.ts +1 -0
  466. package/detectors/bun_ts_metrics_detector/fixtures/dirty/typed.ts +1 -0
  467. package/detectors/bun_ts_metrics_detector/ts_metrics.mjs +310 -0
  468. package/detectors/htmx_hypermedia_detector/atdd.implementation.yaml +28 -0
  469. package/detectors/htmx_hypermedia_detector/checks/_map.json +9 -0
  470. package/detectors/htmx_hypermedia_detector/checks/htmx_fragment_escapes_interpolation.mjs +66 -0
  471. package/detectors/htmx_hypermedia_detector/checks/htmx_swap_no_inline_handler.mjs +40 -0
  472. package/detectors/htmx_hypermedia_detector/checks/htmx_swap_oob_carries_id.mjs +37 -0
  473. package/detectors/htmx_hypermedia_detector/checks/htmx_verb_destructive_confirms.mjs +36 -0
  474. package/detectors/htmx_hypermedia_detector/checks/htmx_verb_endpoint_is_routed.mjs +133 -0
  475. package/detectors/htmx_hypermedia_detector/checks/htmx_verb_endpoint_same_origin.mjs +33 -0
  476. package/detectors/htmx_hypermedia_detector/checks/htmx_verb_mutation_signals_progress.mjs +43 -0
  477. package/detectors/htmx_hypermedia_detector/detect.mjs +46 -0
  478. package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_fragment_escapes_interpolation/render.ts +6 -0
  479. package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_swap_no_inline_handler/row.html +1 -0
  480. package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_swap_oob_carries_id/fragment.html +1 -0
  481. package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_verb_destructive_confirms/delete.html +1 -0
  482. package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_verb_endpoint_is_routed/server.ts +10 -0
  483. package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_verb_endpoint_is_routed/src/OrderRow.ts +7 -0
  484. package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_verb_endpoint_same_origin/panel.html +3 -0
  485. package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_verb_mutation_signals_progress/form.html +4 -0
  486. package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_fragment_escapes_interpolation/render.ts +3 -0
  487. package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_swap_no_inline_handler/row.html +1 -0
  488. package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_swap_oob_carries_id/fragment.html +1 -0
  489. package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_verb_destructive_confirms/delete.html +1 -0
  490. package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_verb_endpoint_is_routed/server.ts +10 -0
  491. package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_verb_endpoint_is_routed/src/OrderRow.ts +9 -0
  492. package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_verb_endpoint_same_origin/panel.html +3 -0
  493. package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_verb_mutation_signals_progress/form.html +3 -0
  494. package/detectors/htmx_tester_detector/atdd.implementation.yaml +21 -0
  495. package/detectors/htmx_tester_detector/checks/_map.json +5 -0
  496. package/detectors/htmx_tester_detector/checks/t_fragment_asserts_returned_markup.mjs +40 -0
  497. package/detectors/htmx_tester_detector/checks/t_swap_oob_asserts_destination_id.mjs +38 -0
  498. package/detectors/htmx_tester_detector/checks/t_verb_endpoint_coverage.mjs +59 -0
  499. package/detectors/htmx_tester_detector/detect.mjs +46 -0
  500. package/detectors/htmx_tester_detector/fixtures/clean/orders.test.ts +23 -0
  501. package/detectors/htmx_tester_detector/fixtures/clean/panel.html +7 -0
  502. package/detectors/htmx_tester_detector/fixtures/dirty/orders.test.ts +20 -0
  503. package/detectors/htmx_tester_detector/fixtures/dirty/panel.html +7 -0
  504. package/detectors/htmx_tester_detector/fixtures/dirty/statusonly.test.ts +9 -0
  505. package/detectors/htmx_tester_detector/test_header.mjs +4 -0
  506. package/detectors/planner_docs_capability/README.md +34 -0
  507. package/detectors/planner_docs_capability/atdd.implementation.yaml +57 -0
  508. package/detectors/planner_docs_capability/detect.mjs +10 -0
  509. package/detectors/planner_docs_capability/fixtures/clean/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
  510. package/detectors/planner_docs_capability/fixtures/clean/docs/architecture/decisions/index.adoc +7 -0
  511. package/detectors/planner_docs_capability/fixtures/clean/docs/architecture/index.adoc +5 -0
  512. package/detectors/planner_docs_capability/fixtures/clean/docs/architecture/shared-control-root.adoc +8 -0
  513. package/detectors/planner_docs_capability/fixtures/clean/docs/architecture/state-store.adoc +5 -0
  514. package/detectors/planner_docs_capability/fixtures/clean/docs/archive/2025-control-root.adoc +5 -0
  515. package/detectors/planner_docs_capability/fixtures/clean/docs/archive/index.adoc +5 -0
  516. package/detectors/planner_docs_capability/fixtures/clean/docs/delivery/index.adoc +5 -0
  517. package/detectors/planner_docs_capability/fixtures/clean/docs/dist/index.md +1 -0
  518. package/detectors/planner_docs_capability/fixtures/clean/docs/index.adoc +5 -0
  519. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/index.adoc +5 -0
  520. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/worktrees.adoc +5 -0
  521. package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
  522. package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/decisions/index.adoc +7 -0
  523. package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/index.adoc +5 -0
  524. package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/notes.md +3 -0
  525. package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/shared-control-root.adoc +8 -0
  526. package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/state-store.adoc +5 -0
  527. package/detectors/planner_docs_capability/fixtures/dirty/docs/archive/2025-control-root.adoc +5 -0
  528. package/detectors/planner_docs_capability/fixtures/dirty/docs/archive/index.adoc +5 -0
  529. package/detectors/planner_docs_capability/fixtures/dirty/docs/delivery/index.adoc +5 -0
  530. package/detectors/planner_docs_capability/fixtures/dirty/docs/dist/index.md +1 -0
  531. package/detectors/planner_docs_capability/fixtures/dirty/docs/index.adoc +5 -0
  532. package/detectors/planner_docs_capability/fixtures/dirty/docs/purpose/index.adoc +5 -0
  533. package/detectors/planner_docs_capability/fixtures/dirty/docs/purpose/worktrees.adoc +5 -0
  534. package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
  535. package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/decisions/adr-20260906-002-documentation-system.adoc +8 -0
  536. package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/decisions/index.adoc +7 -0
  537. package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/index.adoc +5 -0
  538. package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/shared-control-root.adoc +8 -0
  539. package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/state-store.adoc +5 -0
  540. package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/archive/2025-control-root.adoc +5 -0
  541. package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/archive/index.adoc +5 -0
  542. package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/delivery/index.adoc +5 -0
  543. package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/dist/index.md +1 -0
  544. package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/index.adoc +5 -0
  545. package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/purpose/index.adoc +5 -0
  546. package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/purpose/worktrees.adoc +5 -0
  547. package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
  548. package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/architecture/decisions/index.adoc +7 -0
  549. package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/architecture/index.adoc +5 -0
  550. package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/architecture/shared-control-root.adoc +8 -0
  551. package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/architecture/state-store.adoc +5 -0
  552. package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/archive/2025-control-root.adoc +5 -0
  553. package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/archive/index.adoc +5 -0
  554. package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/delivery/index.adoc +5 -0
  555. package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/delivery/worktrees.adoc +5 -0
  556. package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/dist/index.md +1 -0
  557. package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/index.adoc +5 -0
  558. package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/purpose/index.adoc +5 -0
  559. package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/purpose/worktrees.adoc +5 -0
  560. package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
  561. package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/architecture/decisions/index.adoc +7 -0
  562. package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/architecture/index.adoc +5 -0
  563. package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/architecture/shared-control-root.adoc +8 -0
  564. package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/architecture/state-store.adoc +5 -0
  565. package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/archive/2025-control-root.adoc +5 -0
  566. package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/archive/index.adoc +5 -0
  567. package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/delivery/index.adoc +5 -0
  568. package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/delivery/release.adoc +3 -0
  569. package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/dist/index.md +1 -0
  570. package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/index.adoc +5 -0
  571. package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/purpose/index.adoc +5 -0
  572. package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/purpose/worktrees.adoc +5 -0
  573. package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
  574. package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/decisions/index.adoc +7 -0
  575. package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/index.adoc +5 -0
  576. package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/notes.md +3 -0
  577. package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/shared-control-root.adoc +8 -0
  578. package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/state-store.adoc +5 -0
  579. package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/archive/2025-control-root.adoc +5 -0
  580. package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/archive/index.adoc +5 -0
  581. package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/delivery/index.adoc +5 -0
  582. package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/dist/index.md +1 -0
  583. package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/index.adoc +5 -0
  584. package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/purpose/index.adoc +5 -0
  585. package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/purpose/worktrees.adoc +5 -0
  586. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
  587. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/decisions/index.adoc +7 -0
  588. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/index.adoc +5 -0
  589. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/shared-control-root.adoc +8 -0
  590. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/state-store.adoc +5 -0
  591. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/archive/2025-control-root.adoc +5 -0
  592. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/archive/index.adoc +5 -0
  593. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/delivery/release.adoc +10 -0
  594. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/dist/index.md +1 -0
  595. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/index.adoc +5 -0
  596. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/purpose/index.adoc +5 -0
  597. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/purpose/worktrees.adoc +5 -0
  598. package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
  599. package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/decisions/index.adoc +7 -0
  600. package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/index.adoc +5 -0
  601. package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/shared-control-root.adoc +8 -0
  602. package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/state-store.adoc +5 -0
  603. package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/archive/2025-control-root.adoc +5 -0
  604. package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/archive/index.adoc +5 -0
  605. package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/delivery/index.adoc +5 -0
  606. package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/dist/index.md +1 -0
  607. package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/index.adoc +5 -0
  608. package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/purpose/index.adoc +5 -0
  609. package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/purpose/worktrees.adoc +5 -0
  610. package/detectors/planner_plan_integrity/atdd.implementation.yaml +18 -0
  611. package/detectors/planner_plan_integrity/detect.mjs +23 -0
  612. package/detectors/planner_plan_integrity/fixtures/clean/README.md +1 -0
  613. package/detectors/planner_plan_integrity/fixtures/dirty/plan/broken.yaml +1 -0
  614. package/detectors/planner_schema_validation/atdd.implementation.yaml +20 -0
  615. package/detectors/planner_schema_validation/detect.mjs +9 -0
  616. package/detectors/planner_schema_validation/fixtures/clean/contracts/_contracts.yaml +6 -0
  617. package/detectors/planner_schema_validation/fixtures/clean/contracts/orders/placed.schema.json +4 -0
  618. package/detectors/planner_schema_validation/fixtures/clean/plan/_themes.yaml +3 -0
  619. package/detectors/planner_schema_validation/fixtures/clean/plan/_trains/orders.yaml +11 -0
  620. package/detectors/planner_schema_validation/fixtures/clean/plan/orders/_orders.yaml +16 -0
  621. package/detectors/planner_schema_validation/fixtures/dirty/contracts/_contracts.yaml +3 -0
  622. package/detectors/planner_schema_validation/fixtures/dirty/plan/_themes.yaml +2 -0
  623. package/detectors/planner_schema_validation/fixtures/dirty/plan/_trains/orders.yaml +11 -0
  624. package/detectors/planner_static_validators/atdd.implementation.yaml +36 -0
  625. package/detectors/planner_static_validators/detect.mjs +9 -0
  626. package/detectors/planner_static_validators/fixtures/clean/contracts/_contracts.yaml +6 -0
  627. package/detectors/planner_static_validators/fixtures/clean/contracts/orders/placed.schema.json +4 -0
  628. package/detectors/planner_static_validators/fixtures/clean/plan/_themes.yaml +3 -0
  629. package/detectors/planner_static_validators/fixtures/clean/plan/orders/E001.yaml +10 -0
  630. package/detectors/planner_static_validators/fixtures/clean/plan/orders/_orders.yaml +19 -0
  631. package/detectors/planner_static_validators/fixtures/clean/plan/orders/features/place-order.yaml +4 -0
  632. package/detectors/planner_static_validators/fixtures/dirty/plan/_journeys/broken.yaml +22 -0
  633. package/detectors/planner_static_validators/fixtures/dirty/plan/_themes.yaml +3 -0
  634. package/detectors/planner_static_validators/fixtures/dirty/plan/_trains/_interlockings/journey-a.yaml +4 -0
  635. package/detectors/planner_static_validators/fixtures/dirty/plan/_trains/journey-a.yaml +7 -0
  636. package/detectors/planner_static_validators/fixtures/dirty/plan/_trains/probe/legacy.yaml +3 -0
  637. package/detectors/planner_static_validators/fixtures/dirty/plan/_trains/probe/orphan.yaml +3 -0
  638. package/detectors/planner_static_validators/fixtures/dirty/plan/_trains.yaml +5 -0
  639. package/detectors/planner_static_validators/fixtures/dirty/plan/also_dup/_also_dup.yaml +15 -0
  640. package/detectors/planner_static_validators/fixtures/dirty/plan/dup/E001.yaml +3 -0
  641. package/detectors/planner_static_validators/fixtures/dirty/plan/dup/_dup.yaml +27 -0
  642. package/detectors/planner_static_validators/fixtures/dirty/plan/dup/features/bad.yaml +2 -0
  643. package/lib/imports.mjs +83 -0
  644. package/lib/scan.mjs +246 -0
  645. package/package.json +35 -0
  646. package/planner-nodes/ENFORCEMENT_SCOPE.yaml +117 -0
  647. package/planner-nodes/nodes/planner.acceptance.abstract-fields-required.convention.yaml +44 -0
  648. package/planner-nodes/nodes/planner.acceptance.authoring-guidelines.convention.yaml +29 -0
  649. package/planner-nodes/nodes/planner.acceptance.boundary-kind-vocabulary.convention.yaml +38 -0
  650. package/planner-nodes/nodes/planner.acceptance.execution-kind.convention.yaml +30 -0
  651. package/planner-nodes/nodes/planner.acceptance.extraction-no-inference.convention.yaml +23 -0
  652. package/planner-nodes/nodes/planner.acceptance.generator-prompts.convention.yaml +34 -0
  653. package/planner-nodes/nodes/planner.acceptance.given-when-then-structure.convention.yaml +53 -0
  654. package/planner-nodes/nodes/planner.acceptance.harness-vocabulary.convention.yaml +99 -0
  655. package/planner-nodes/nodes/planner.acceptance.harness.convention.yaml +36 -0
  656. package/planner-nodes/nodes/planner.acceptance.hermetic-fake-contract.convention.yaml +35 -0
  657. package/planner-nodes/nodes/planner.acceptance.id-pattern.convention.yaml +34 -0
  658. package/planner-nodes/nodes/planner.acceptance.max-per-wmbt.convention.yaml +29 -0
  659. package/planner-nodes/nodes/planner.acceptance.plane-keywords.convention.yaml +87 -0
  660. package/planner-nodes/nodes/planner.acceptance.route-construction.convention.yaml +55 -0
  661. package/planner-nodes/nodes/planner.acceptance.signal-telemetry-naming.convention.yaml +61 -0
  662. package/planner-nodes/nodes/planner.acceptance.urn-generation.convention.yaml +39 -0
  663. package/planner-nodes/nodes/planner.acceptance.well-formed.convention.yaml +57 -0
  664. package/planner-nodes/nodes/planner.appendix.llm-guidelines.convention.yaml +81 -0
  665. package/planner-nodes/nodes/planner.appendix.naming-pattern.convention.yaml +45 -0
  666. package/planner-nodes/nodes/planner.appendix.storage.convention.yaml +44 -0
  667. package/planner-nodes/nodes/planner.appendix.structure.convention.yaml +17 -0
  668. package/planner-nodes/nodes/planner.appendix.types.convention.yaml +123 -0
  669. package/planner-nodes/nodes/planner.artifact-naming.anti-patterns.convention.yaml +31 -0
  670. package/planner-nodes/nodes/planner.artifact-naming.cardinality-from-aspect.convention.yaml +32 -0
  671. package/planner-nodes/nodes/planner.artifact-naming.colon-for-hierarchy.convention.yaml +25 -0
  672. package/planner-nodes/nodes/planner.artifact-naming.contract-file-mapping.convention.yaml +26 -0
  673. package/planner-nodes/nodes/planner.artifact-naming.depth-guidelines.convention.yaml +27 -0
  674. package/planner-nodes/nodes/planner.artifact-naming.dot-for-variant.convention.yaml +25 -0
  675. package/planner-nodes/nodes/planner.artifact-naming.logical-physical-mapping.convention.yaml +36 -0
  676. package/planner-nodes/nodes/planner.artifact-naming.migration-guide.convention.yaml +29 -0
  677. package/planner-nodes/nodes/planner.artifact-naming.naming-pattern.convention.yaml +44 -0
  678. package/planner-nodes/nodes/planner.artifact-naming.path-mirrors-identity.convention.yaml +40 -0
  679. package/planner-nodes/nodes/planner.artifact-naming.planner-artifacts-use-stable.convention.yaml +28 -0
  680. package/planner-nodes/nodes/planner.artifact-naming.pluralization.convention.yaml +27 -0
  681. package/planner-nodes/nodes/planner.artifact-naming.schema-identifier.convention.yaml +31 -0
  682. package/planner-nodes/nodes/planner.artifact-naming.separator-semantics.convention.yaml +42 -0
  683. package/planner-nodes/nodes/planner.artifact-naming.theme-first-identity.convention.yaml +39 -0
  684. package/planner-nodes/nodes/planner.artifact-naming.urn-structure.convention.yaml +26 -0
  685. package/planner-nodes/nodes/planner.artifact-naming.validation-rules.convention.yaml +33 -0
  686. package/planner-nodes/nodes/planner.artifact-naming.verb-object-corpus-drift.convention.yaml +49 -0
  687. package/planner-nodes/nodes/planner.artifact.definition.convention.yaml +30 -0
  688. package/planner-nodes/nodes/planner.component.artifact-derivation.convention.yaml +139 -0
  689. package/planner-nodes/nodes/planner.component.business-focus.convention.yaml +65 -0
  690. package/planner-nodes/nodes/planner.component.count-limit.convention.yaml +64 -0
  691. package/planner-nodes/nodes/planner.component.derivation.convention.yaml +117 -0
  692. package/planner-nodes/nodes/planner.component.io-alignment.convention.yaml +65 -0
  693. package/planner-nodes/nodes/planner.component.layer-assignment.convention.yaml +83 -0
  694. package/planner-nodes/nodes/planner.component.layer-consistency.convention.yaml +91 -0
  695. package/planner-nodes/nodes/planner.component.method-limit.convention.yaml +35 -0
  696. package/planner-nodes/nodes/planner.component.structure.convention.yaml +77 -0
  697. package/planner-nodes/nodes/planner.component.type-catalog.convention.yaml +436 -0
  698. package/planner-nodes/nodes/planner.component.urn.convention.yaml +86 -0
  699. package/planner-nodes/nodes/planner.contract.registry-coherence.convention.yaml +36 -0
  700. package/planner-nodes/nodes/planner.convention.remedy-must-be-followable.convention.yaml +92 -0
  701. package/planner-nodes/nodes/planner.coverage.bidirectional-coverage-between-trains.convention.yaml +33 -0
  702. package/planner-nodes/nodes/planner.coverage.bidirectional-coverage-between-wagons.convention.yaml +33 -0
  703. package/planner-nodes/nodes/planner.coverage.coverage-graph.convention.yaml +31 -0
  704. package/planner-nodes/nodes/planner.coverage.every-wmbt-must-be.convention.yaml +29 -0
  705. package/planner-nodes/nodes/planner.coverage.every-wmbt-must-have.convention.yaml +33 -0
  706. package/planner-nodes/nodes/planner.coverage.exception-handling.convention.yaml +32 -0
  707. package/planner-nodes/nodes/planner.criteria.defaults.convention.yaml +30 -0
  708. package/planner-nodes/nodes/planner.criteria.harness-templates.convention.yaml +159 -0
  709. package/planner-nodes/nodes/planner.criteria.metric-mapping.convention.yaml +136 -0
  710. package/planner-nodes/nodes/planner.criteria.plane-keywords.convention.yaml +53 -0
  711. package/planner-nodes/nodes/planner.criteria.sequence-routing.convention.yaml +26 -0
  712. package/planner-nodes/nodes/planner.criteria.shape.convention.yaml +27 -0
  713. package/planner-nodes/nodes/planner.decomposition.canonical-steps.convention.yaml +14 -0
  714. package/planner-nodes/nodes/planner.decomposition.document-trouble-obligation.convention.yaml +12 -0
  715. package/planner-nodes/nodes/planner.decomposition.domain-vs-technology.convention.yaml +13 -0
  716. package/planner-nodes/nodes/planner.decomposition.jtbd-vs-odi-grammar.convention.yaml +18 -0
  717. package/planner-nodes/nodes/planner.decomposition.keep-pivot-kill.convention.yaml +23 -0
  718. package/planner-nodes/nodes/planner.decomposition.local-scope.convention.yaml +15 -0
  719. package/planner-nodes/nodes/planner.decomposition.natural-language-normalization.convention.yaml +12 -0
  720. package/planner-nodes/nodes/planner.decomposition.train-journey.convention.yaml +13 -0
  721. package/planner-nodes/nodes/planner.decomposition.wagon-rationale.convention.yaml +12 -0
  722. package/planner-nodes/nodes/planner.definition.anchor-required.convention.yaml +34 -0
  723. package/planner-nodes/nodes/planner.feature.artifact-seeded-naming.convention.yaml +30 -0
  724. package/planner-nodes/nodes/planner.feature.definition.convention.yaml +27 -0
  725. package/planner-nodes/nodes/planner.feature.estimation.convention.yaml +29 -0
  726. package/planner-nodes/nodes/planner.feature.feedback-loop-close-the-loop.convention.yaml +33 -0
  727. package/planner-nodes/nodes/planner.feature.feedback-loop-kind.convention.yaml +30 -0
  728. package/planner-nodes/nodes/planner.feature.feedback-loop-suppression.convention.yaml +23 -0
  729. package/planner-nodes/nodes/planner.feature.footprint-scoring.convention.yaml +119 -0
  730. package/planner-nodes/nodes/planner.feature.grouping-strategy.convention.yaml +37 -0
  731. package/planner-nodes/nodes/planner.feature.hard-limits.convention.yaml +29 -0
  732. package/planner-nodes/nodes/planner.feature.name-is-verb-object.convention.yaml +40 -0
  733. package/planner-nodes/nodes/planner.feature.shape.convention.yaml +27 -0
  734. package/planner-nodes/nodes/planner.feature.size-max-rule.convention.yaml +41 -0
  735. package/planner-nodes/nodes/planner.feature.urn-naming.convention.yaml +29 -0
  736. package/planner-nodes/nodes/planner.feature.validation-rules.convention.yaml +28 -0
  737. package/planner-nodes/nodes/planner.feature.verb-selection-by-artifact-type.convention.yaml +264 -0
  738. package/planner-nodes/nodes/planner.feature.wagon-link.convention.yaml +27 -0
  739. package/planner-nodes/nodes/planner.interface.api-mapping.convention.yaml +70 -0
  740. package/planner-nodes/nodes/planner.interface.artifact-transformation.convention.yaml +103 -0
  741. package/planner-nodes/nodes/planner.interface.contract-urn.convention.yaml +119 -0
  742. package/planner-nodes/nodes/planner.interface.naming-patterns.convention.yaml +73 -0
  743. package/planner-nodes/nodes/planner.interface.orphan-detection.convention.yaml +46 -0
  744. package/planner-nodes/nodes/planner.interface.ownership-rules.convention.yaml +54 -0
  745. package/planner-nodes/nodes/planner.interface.structure-rules.convention.yaml +112 -0
  746. package/planner-nodes/nodes/planner.interface.tests-subdirectory.convention.yaml +61 -0
  747. package/planner-nodes/nodes/planner.interlocking.definition.convention.yaml +36 -0
  748. package/planner-nodes/nodes/planner.interlocking.registry-mirrors-document.convention.yaml +38 -0
  749. package/planner-nodes/nodes/planner.issue-body.dependency-entries-must-be-classified.convention.yaml +21 -0
  750. package/planner-nodes/nodes/planner.issue-body.graph-context-required.convention.yaml +21 -0
  751. package/planner-nodes/nodes/planner.journey.continuation-closure.convention.yaml +51 -0
  752. package/planner-nodes/nodes/planner.journey.definition.convention.yaml +39 -0
  753. package/planner-nodes/nodes/planner.plan.confirm-before-author.convention.yaml +28 -0
  754. package/planner-nodes/nodes/planner.plan.confirm-binds-an-issue.convention.yaml +39 -0
  755. package/planner-nodes/nodes/planner.plan.confirm-requires-interlocking-sanity.convention.yaml +30 -0
  756. package/planner-nodes/nodes/planner.plan.granularity-completeness.convention.yaml +38 -0
  757. package/planner-nodes/nodes/planner.plan.session-lifecycle.convention.yaml +23 -0
  758. package/planner-nodes/nodes/planner.plan.spec-is-schema-valid.convention.yaml +61 -0
  759. package/planner-nodes/nodes/planner.relationship.no-orphan-nodes.convention.yaml +32 -0
  760. package/planner-nodes/nodes/planner.smoke.feedback-loop-close-the-loop.convention.yaml +39 -0
  761. package/planner-nodes/nodes/planner.smoke.synthetic-fixture-bypass.convention.yaml +44 -0
  762. package/planner-nodes/nodes/planner.steps.architecture-routing.convention.yaml +109 -0
  763. package/planner-nodes/nodes/planner.steps.jtbd-taxonomy.convention.yaml +227 -0
  764. package/planner-nodes/nodes/planner.steps.linguistic-patterns.convention.yaml +81 -0
  765. package/planner-nodes/nodes/planner.steps.sequence.convention.yaml +17 -0
  766. package/planner-nodes/nodes/planner.subject.invariants.convention.yaml +34 -0
  767. package/planner-nodes/nodes/planner.theme.definition.convention.yaml +23 -0
  768. package/planner-nodes/nodes/planner.theme.must-be-canonical.convention.yaml +38 -0
  769. package/planner-nodes/nodes/planner.theme.theme-zero-mandatory.convention.yaml +39 -0
  770. package/planner-nodes/nodes/planner.theme.urn-namespace-matches.convention.yaml +34 -0
  771. package/planner-nodes/nodes/planner.train.acceptance-commit-failures-covered.convention.yaml +10 -0
  772. package/planner-nodes/nodes/planner.train.acceptances.convention.yaml +85 -0
  773. package/planner-nodes/nodes/planner.train.artifact-flow.convention.yaml +31 -0
  774. package/planner-nodes/nodes/planner.train.categories.convention.yaml +34 -0
  775. package/planner-nodes/nodes/planner.train.definition.convention.yaml +34 -0
  776. package/planner-nodes/nodes/planner.train.dependencies.convention.yaml +28 -0
  777. package/planner-nodes/nodes/planner.train.dispatch-composite-key-exceptional.convention.yaml +17 -0
  778. package/planner-nodes/nodes/planner.train.dispatch-map-is-registry.convention.yaml +17 -0
  779. package/planner-nodes/nodes/planner.train.family-matches-terminal-contract.convention.yaml +17 -0
  780. package/planner-nodes/nodes/planner.train.family.convention.yaml +17 -0
  781. package/planner-nodes/nodes/planner.train.initial-cargo-inputs-declared.convention.yaml +10 -0
  782. package/planner-nodes/nodes/planner.train.interlocking-does-not-carry-cargo.convention.yaml +28 -0
  783. package/planner-nodes/nodes/planner.train.interlocking-entrypoint-shape.convention.yaml +30 -0
  784. package/planner-nodes/nodes/planner.train.interlocking-fragment-acceptance-binding.convention.yaml +30 -0
  785. package/planner-nodes/nodes/planner.train.interlocking-guard-coverage.convention.yaml +29 -0
  786. package/planner-nodes/nodes/planner.train.interlocking-guard-grammar.convention.yaml +31 -0
  787. package/planner-nodes/nodes/planner.train.interlocking-home.convention.yaml +29 -0
  788. package/planner-nodes/nodes/planner.train.interlocking-message-payload-typed.convention.yaml +28 -0
  789. package/planner-nodes/nodes/planner.train.interlocking-payload-contract-body-required.convention.yaml +28 -0
  790. package/planner-nodes/nodes/planner.train.interlocking-payload-contract-registered.convention.yaml +31 -0
  791. package/planner-nodes/nodes/planner.train.interlocking-projection-equivalence.convention.yaml +32 -0
  792. package/planner-nodes/nodes/planner.train.interlocking-route-category-matches-train-id.convention.yaml +32 -0
  793. package/planner-nodes/nodes/planner.train.interlocking-route-resolution-deterministic.convention.yaml +30 -0
  794. package/planner-nodes/nodes/planner.train.interlocking-structural-residual-explicit.convention.yaml +30 -0
  795. package/planner-nodes/nodes/planner.train.interlocking-wmbt-surface-or-residual.convention.yaml +30 -0
  796. package/planner-nodes/nodes/planner.train.linearity.convention.yaml +28 -0
  797. package/planner-nodes/nodes/planner.train.naming.convention.yaml +26 -0
  798. package/planner-nodes/nodes/planner.train.participants.convention.yaml +27 -0
  799. package/planner-nodes/nodes/planner.train.production-implementation.convention.yaml +24 -0
  800. package/planner-nodes/nodes/planner.train.registry-coherence.convention.yaml +69 -0
  801. package/planner-nodes/nodes/planner.train.registry.convention.yaml +39 -0
  802. package/planner-nodes/nodes/planner.train.route-category-assessment.convention.yaml +43 -0
  803. package/planner-nodes/nodes/planner.train.route-space-admission.convention.yaml +41 -0
  804. package/planner-nodes/nodes/planner.train.scope.convention.yaml +38 -0
  805. package/planner-nodes/nodes/planner.train.sequence.convention.yaml +34 -0
  806. package/planner-nodes/nodes/planner.train.terminal-contract.convention.yaml +10 -0
  807. package/planner-nodes/nodes/planner.train.theme-alignment.convention.yaml +25 -0
  808. package/planner-nodes/nodes/planner.train.theme-orchestrator-urn.convention.yaml +27 -0
  809. package/planner-nodes/nodes/planner.train.theme-ranges.convention.yaml +28 -0
  810. package/planner-nodes/nodes/planner.train.validation-rules.convention.yaml +31 -0
  811. package/planner-nodes/nodes/planner.train.variation-strategies.convention.yaml +26 -0
  812. package/planner-nodes/nodes/planner.wagon.artifact-contracts.convention.yaml +29 -0
  813. package/planner-nodes/nodes/planner.wagon.complexity-model.convention.yaml +33 -0
  814. package/planner-nodes/nodes/planner.wagon.coupling-complexity.convention.yaml +32 -0
  815. package/planner-nodes/nodes/planner.wagon.definition.convention.yaml +30 -0
  816. package/planner-nodes/nodes/planner.wagon.features-format.convention.yaml +28 -0
  817. package/planner-nodes/nodes/planner.wagon.features.convention.yaml +27 -0
  818. package/planner-nodes/nodes/planner.wagon.logical-vs-filesystem-naming.convention.yaml +34 -0
  819. package/planner-nodes/nodes/planner.wagon.name-is-verb-object.convention.yaml +39 -0
  820. package/planner-nodes/nodes/planner.wagon.no-consume-cycle.convention.yaml +30 -0
  821. package/planner-nodes/nodes/planner.wagon.produce-consume-artifacts.convention.yaml +46 -0
  822. package/planner-nodes/nodes/planner.wagon.refinement-extraction.convention.yaml +49 -0
  823. package/planner-nodes/nodes/planner.wagon.semantic-coherence.convention.yaml +30 -0
  824. package/planner-nodes/nodes/planner.wagon.separability.convention.yaml +33 -0
  825. package/planner-nodes/nodes/planner.wagon.slug-dirname-conversion.convention.yaml +26 -0
  826. package/planner-nodes/nodes/planner.wagon.telemetry-filesystem.convention.yaml +52 -0
  827. package/planner-nodes/nodes/planner.wagon.urn-naming.convention.yaml +28 -0
  828. package/planner-nodes/nodes/planner.wagon.urn.convention.yaml +29 -0
  829. package/planner-nodes/nodes/planner.wmbt.context-clarifier.convention.yaml +24 -0
  830. package/planner-nodes/nodes/planner.wmbt.definition.convention.yaml +29 -0
  831. package/planner-nodes/nodes/planner.wmbt.dimension-selection.convention.yaml +37 -0
  832. package/planner-nodes/nodes/planner.wmbt.direction-selection.convention.yaml +41 -0
  833. package/planner-nodes/nodes/planner.wmbt.filename-pattern.convention.yaml +27 -0
  834. package/planner-nodes/nodes/planner.wmbt.lens-selection.convention.yaml +44 -0
  835. package/planner-nodes/nodes/planner.wmbt.must-have-smoke-acceptance.convention.yaml +55 -0
  836. package/planner-nodes/nodes/planner.wmbt.object-of-control.convention.yaml +26 -0
  837. package/planner-nodes/nodes/planner.wmbt.shape.convention.yaml +29 -0
  838. package/planner-nodes/nodes/planner.wmbt.splitting-rules.convention.yaml +37 -0
  839. package/planner-nodes/nodes/planner.wmbt.statement-template.convention.yaml +23 -0
  840. package/planner-nodes/nodes/planner.wmbt.step-code-vocabulary.convention.yaml +31 -0
  841. package/planner-nodes/nodes/planner.wmbt.urn-naming.convention.yaml +31 -0
  842. package/planner-schemas/acceptance.schema.json +396 -0
  843. package/planner-schemas/appendix.schema.json +78 -0
  844. package/planner-schemas/author/convention-node.schema.json +134 -0
  845. package/planner-schemas/author/gate.schema.json +36 -0
  846. package/planner-schemas/author/issue.schema.json +72 -0
  847. package/planner-schemas/author/relationship.schema.json +19 -0
  848. package/planner-schemas/author/scope.schema.json +28 -0
  849. package/planner-schemas/binding-lock.schema.json +38 -0
  850. package/planner-schemas/component.schema.json +114 -0
  851. package/planner-schemas/contract-registry.schema.json +47 -0
  852. package/planner-schemas/feature.schema.json +208 -0
  853. package/planner-schemas/journey.schema.json +225 -0
  854. package/planner-schemas/registry-index.schema.json +54 -0
  855. package/planner-schemas/substrate-lock.schema.json +41 -0
  856. package/planner-schemas/substrate.schema.json +38 -0
  857. package/planner-schemas/theme-registry.schema.json +28 -0
  858. package/planner-schemas/train-interlocking-registry.schema.json +49 -0
  859. package/planner-schemas/train-interlocking.schema.json +459 -0
  860. package/planner-schemas/train.schema.json +361 -0
  861. package/planner-schemas/wagon.schema.json +283 -0
  862. package/planner-schemas/wmbt.schema.json +68 -0
  863. package/src/ci.ts +9 -0
  864. package/src/cli.ts +91 -0
  865. package/src/docs-capability.ts +156 -0
  866. package/src/enforce.ts +103 -0
  867. package/src/hooks.ts +48 -0
  868. package/src/index.ts +13 -0
  869. package/src/planner-kernel.ts +112 -0
  870. package/src/planner-schema-validator.ts +101 -0
  871. package/src/planner-validators.ts +288 -0
  872. package/src/register.ts +8 -0
  873. package/src/release.ts +9 -0
  874. package/src/setup.ts +15 -0
  875. package/templates/github/atdd-bun-release.yml +16 -0
  876. package/templates/github/atdd-bun.yml +26 -0
@@ -0,0 +1,2 @@
1
+ export type InvoiceDTO = { id: string; total(): number };
2
+ export const toInvoiceDTO = (x: any) => x;
@@ -0,0 +1,2 @@
1
+ import { client } from "../integration/client";
2
+ export const rules = client;
@@ -0,0 +1,2 @@
1
+ class InvoiceRepository { save() {} }
2
+ export const handler = () => { const repo = new InvoiceRepository(); return fetch('/x'); };
@@ -0,0 +1,23 @@
1
+ schema_version: 1.1.0
2
+ kind: implementation
3
+ subtype: validator
4
+ implementation_id: bun_fullstack_detector
5
+ targets_workspace: atdd.workspace.bun
6
+ contract_version: 1.1.0
7
+ # Bun RUNTIME discipline: the server primitive and the package manager.
8
+ #
9
+ # `test-imports-bun-test` used to live here and was moved to
10
+ # bun_tester_discipline_detector: it reads TEST files, and conformance
11
+ # (test_persona_scoping.py) proved that broke the persona boundary this provider
12
+ # claims — coder families never open a test file. Its own normative text makes a
13
+ # coverage-gate argument, which is tester territory.
14
+ emits_rule_ids:
15
+ - coder.bun.runtime-server-is-bun-serve
16
+ - coder.bun.runtime-single-lockfile
17
+ - coder.bun.runtime-typecheck-enforced
18
+ entrypoint: detect.mjs
19
+ report: detect.mjs
20
+ realizes_convention:
21
+ - coder.bun.runtime-server-is-bun-serve
22
+ - coder.bun.runtime-single-lockfile
23
+ - coder.bun.runtime-typecheck-enforced
@@ -0,0 +1,5 @@
1
+ {
2
+ "bun_runtime_server_is_bun_serve": "coder.bun.runtime-server-is-bun-serve",
3
+ "bun_runtime_single_lockfile": "coder.bun.runtime-single-lockfile",
4
+ "bun_runtime_typecheck_enforced": "coder.bun.runtime-typecheck-enforced"
5
+ }
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env bun
2
+ // Detector: coder.bun.runtime-server-is-bun-serve (disposition: strict)
3
+ //
4
+ // A full-stack Bun app serves HTTP with `Bun.serve`, not with Express, Fastify,
5
+ // Koa or `node:http`. This is not taste. `Bun.serve` is the only server in this
6
+ // stack that gets Bun's native routing, WebSocket upgrade, streaming and
7
+ // `HTMLRewriter` — the last of which is how htmx fragments are transformed
8
+ // server-side. Running Express under Bun silently opts the app back onto the
9
+ // node-compat path: you keep the whole npm middleware dependency surface, lose
10
+ // the native primitives, and the deployment story ("bun run server.ts", no
11
+ // bundle, no node_modules) stops being true.
12
+ //
13
+ // Masked source is scanned, so a framework name inside a comment or a string
14
+ // (a doc line, an error message, a migration note) never trips the rule.
15
+ import { walk, readRoots, readExcludes, readText, emit, locate, maskLiteralsAndComments, SOURCE_EXT } from "../../../lib/scan.mjs";
16
+
17
+ const RULE_ID = "coder.bun.runtime-server-is-bun-serve";
18
+ const FOREIGN_SERVER_RE =
19
+ /\b(?:express\s*\(\s*\)|fastify\s*\(|new\s+Koa\s*\(|http\.createServer\s*\(|https\.createServer\s*\(|createServer\s*\()/g;
20
+
21
+ const violations = [];
22
+ const excludes = readExcludes();
23
+ for (const root of readRoots()) {
24
+ for (const file of walk(root, excludes, SOURCE_EXT)) {
25
+ const text = readText(file);
26
+ if (!text) continue;
27
+ const masked = maskLiteralsAndComments(text);
28
+ for (const m of masked.matchAll(FOREIGN_SERVER_RE)) {
29
+ violations.push({
30
+ rule_id: RULE_ID,
31
+ file,
32
+ ...locate(text, m.index),
33
+ evidence: `HTTP server created with ${m[0].replace(/\s*\($/, "").trim()} instead of Bun.serve; the app falls back to node-compat and loses Bun's native routing/HTMLRewriter`,
34
+ });
35
+ }
36
+ }
37
+ }
38
+ process.stderr.write(`bun-detector[server-uses-bun-serve]: ${violations.length} violation(s)\n`);
39
+ emit(violations);
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env bun
2
+ // Detector: coder.bun.runtime-single-lockfile (disposition: strict)
3
+ //
4
+ // Bun is this stack's package manager, so `bun.lock` (or `bun.lockb`) is the ONE
5
+ // resolution source of truth. A `package-lock.json`, `yarn.lock` or
6
+ // `pnpm-lock.yaml` left beside it means two resolvers disagree about the
7
+ // dependency graph, and which one wins is decided by whichever command a
8
+ // developer or a CI step happens to run. That is the exact shape of the
9
+ // "works locally, breaks in CI" dependency drift, and it is invisible in review
10
+ // because nobody reads a lockfile diff.
11
+ //
12
+ // A repo-hygiene rule: the FILE is the fact, so it reports at line 1 of the
13
+ // offending lockfile.
14
+ import { walkByName, readRoots, readExcludes, emit } from "../../../lib/scan.mjs";
15
+
16
+ const RULE_ID = "coder.bun.runtime-single-lockfile";
17
+ const FOREIGN_LOCKFILES = new Map([
18
+ ["package-lock.json", "npm"],
19
+ ["yarn.lock", "Yarn"],
20
+ ["pnpm-lock.yaml", "pnpm"],
21
+ ["pnpm-lock.yml", "pnpm"],
22
+ ]);
23
+
24
+ const violations = [];
25
+ const excludes = readExcludes();
26
+ for (const root of readRoots()) {
27
+ for (const file of walkByName(root, excludes, new Set(FOREIGN_LOCKFILES.keys()))) {
28
+ const name = file.split("/").pop();
29
+ violations.push({
30
+ rule_id: RULE_ID,
31
+ file,
32
+ line: 1,
33
+ col: 1,
34
+ source_line: name,
35
+ evidence: `${FOREIGN_LOCKFILES.get(name)} lockfile ${name} coexists with Bun's; two resolvers disagree and the winner depends on which command runs`,
36
+ });
37
+ }
38
+ }
39
+ process.stderr.write(`bun-detector[single-lockfile]: ${violations.length} violation(s)\n`);
40
+ emit(violations);
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env bun
2
+ // Detector: coder.bun.runtime-typecheck-enforced (disposition: advisory)
3
+ //
4
+ // THE GAP THIS CLOSES. Bun runs `.ts` by STRIPPING types — it transpiles, it does not
5
+ // typecheck. No `tsc` is bundled. So a Bun app is, by default, less type-safe than a
6
+ // tsc-based one: `resolveTrain()` can return something structurally wrong and Bun will
7
+ // run it happily. Real typechecking means TypeScript as a dependency and a no-emit
8
+ // typecheck wired into the check path.
9
+ //
10
+ // This is COMPLEMENTARY to the interlocking detectors, not overlapping. Those are
11
+ // regex-over-source and verify SHAPE — that an `InterlockingResolution` declaring the
12
+ // eight fields exists. They cannot verify that what `resolveTrain` actually returns
13
+ // conforms to it. Only a typechecker can, and only if one is run.
14
+ //
15
+ // DELIBERATELY UNFORCED, in four ways, because this rule states a stack norm rather
16
+ // than a single blessed incantation:
17
+ //
18
+ // 1. SCOPE. Only a tree that is actually a TypeScript project carries the obligation
19
+ // — a package.json AND at least one .ts/.tsx file. A JS-only Bun app is silent.
20
+ // 2. HOW. Any recognised no-emit typechecker in any script satisfies it: tsc
21
+ // --noEmit, tsgo --noEmit, vue-tsc, svelte-check, astro check, bunx tsc, or a
22
+ // script named typecheck/check-types/check:types. The obligation is that types
23
+ // ARE checked, never that they are checked one particular way.
24
+ // 3. WHERE. TypeScript counts from devDependencies OR dependencies.
25
+ // 4. STRICTNESS. Reported ONLY when demonstrably off — an explicit `"strict": false`,
26
+ // or no strict family flag at all in a config that extends nothing. A tsconfig
27
+ // that `extends` a base is NOT flagged: this detector cannot resolve the base, and
28
+ // reporting what it cannot see would be a false positive. That is the same
29
+ // discipline the rest of this hub applies to could-not-determine.
30
+ import { readRoots, readExcludes, emit, readText } from "../../../lib/scan.mjs";
31
+ import { readdirSync, statSync } from "node:fs";
32
+ import { join, sep } from "node:path";
33
+
34
+ const RULE_ID = "coder.bun.runtime-typecheck-enforced";
35
+
36
+ // A no-emit typechecker invocation, in any script. Permissive by design (see 2 above).
37
+ const TYPECHECK_CMD =
38
+ /\b(?:tsc|tsgo)\b[^&|;]*--?noEmit\b|\bvue-tsc\b|\bsvelte-check\b|\bastro\s+check\b|\btsc\s+--build\b/;
39
+ const TYPECHECK_SCRIPT_NAME = /^(?:typecheck|type-check|check[:-]types|types)$/i;
40
+
41
+ function* walkFiles(dir, excludes, depth = 0) {
42
+ if (depth > 6) return;
43
+ let entries;
44
+ try { entries = readdirSync(dir).sort(); } catch { return; }
45
+ // SORTED. readdirSync order is filesystem-dependent, and an unsorted walk made
46
+ // this check non-deterministic: with several packages in one tree, WHICH one got
47
+ // checked varied by machine, so CI and a laptop could disagree about a clean repo.
48
+ for (const name of entries) {
49
+ if (excludes.some((e) => name === e)) continue;
50
+ const full = join(dir, name);
51
+ let st;
52
+ try { st = statSync(full); } catch { continue; }
53
+ if (st.isDirectory()) yield* walkFiles(full, excludes, depth + 1);
54
+ else yield full;
55
+ }
56
+ }
57
+
58
+ const violations = [];
59
+ const excludes = [...readExcludes(), "node_modules", "dist", "build", ".next", ".git"];
60
+
61
+ for (const root of readRoots()) {
62
+ const files = [...walkFiles(root, excludes)].sort();
63
+ // EVERY package.json is a project root, not just the first one found. Checking
64
+ // only the first meant a monorepo — a common Bun shape — had one package audited
65
+ // and the rest silently ignored, and which one it was depended on readdir order.
66
+ const pkgPaths = files.filter((f) => f.endsWith(sep + "package.json") || f.endsWith("/package.json"));
67
+
68
+ for (const pkgPath of pkgPaths) {
69
+ const projectDir = pkgPath.slice(0, pkgPath.length - "package.json".length - 1);
70
+ // Files belonging to THIS package: under its directory, and not under a nested
71
+ // package (which is its own project root and gets its own pass).
72
+ const nested = pkgPaths.filter((o) => o !== pkgPath && o.startsWith(projectDir + sep));
73
+ const nestedDirs = nested.map((o) => o.slice(0, o.length - "package.json".length - 1) + sep);
74
+ const owned = files.filter(
75
+ (f) => f.startsWith(projectDir + sep) && !nestedDirs.some((n) => f.startsWith(n)),
76
+ );
77
+ const hasTs = owned.some((f) => /\.tsx?$/.test(f) && !f.endsWith(".d.ts"));
78
+ if (!hasTs) continue; // JS-only Bun app: no obligation
79
+
80
+ let pkg;
81
+ try { pkg = JSON.parse(readText(pkgPath)); } catch { continue; } // unreadable: say nothing
82
+ const rel = (p) => p.slice(root.length).replace(/^[/\\]/, "");
83
+ const deps = { ...(pkg.dependencies || {}), ...(pkg.devDependencies || {}) };
84
+ const scripts = pkg.scripts || {};
85
+
86
+ const hasTypescript = Object.keys(deps).some((d) => d === "typescript" || d === "@typescript/native-preview");
87
+ const wired = Object.entries(scripts).some(
88
+ ([name, cmd]) => TYPECHECK_CMD.test(String(cmd)) || TYPECHECK_SCRIPT_NAME.test(name),
89
+ );
90
+
91
+ if (!hasTypescript) {
92
+ violations.push({
93
+ rule_id: RULE_ID, file: rel(pkgPath), line: 1, col: 1, source_line: '"devDependencies"',
94
+ evidence:
95
+ "typescript is not a dependency, so nothing in this project can typecheck it — " +
96
+ "bun strips types to run .ts and never checks them",
97
+ });
98
+ }
99
+ if (!wired) {
100
+ violations.push({
101
+ rule_id: RULE_ID, file: rel(pkgPath), line: 1, col: 1, source_line: '"scripts"',
102
+ evidence:
103
+ "no script runs a no-emit typecheck (tsc --noEmit, vue-tsc, svelte-check, astro check, " +
104
+ "or a typecheck script), so types are never checked in the check path",
105
+ });
106
+ }
107
+
108
+ const tsconfigPath = owned.find((f) => /(?:^|[/\\])tsconfig\.json$/.test(f));
109
+ if (!tsconfigPath) {
110
+ violations.push({
111
+ rule_id: RULE_ID, file: rel(pkgPath), line: 1, col: 1, source_line: '"typescript"',
112
+ evidence: "no tsconfig.json, so a typecheck would run with unpinned compiler options",
113
+ });
114
+ continue;
115
+ }
116
+ const raw = readText(tsconfigPath);
117
+ const extendsBase = /"extends"\s*:/.test(raw);
118
+ const strictOff = /"strict"\s*:\s*false/.test(raw);
119
+ const strictFamily = /"strict(?:NullChecks|FunctionTypes|BindCallApply|PropertyInitialization)?"\s*:\s*true/.test(raw);
120
+ if (strictOff || (!strictFamily && !extendsBase)) {
121
+ violations.push({
122
+ rule_id: RULE_ID,
123
+ file: rel(tsconfigPath), line: 1, col: 1, source_line: '"compilerOptions"',
124
+ evidence: strictOff
125
+ ? 'tsconfig sets "strict": false, so the typecheck that does run accepts implicit any and unchecked null'
126
+ : 'tsconfig enables no strict flag and extends no base, so the typecheck that does run accepts implicit any and unchecked null',
127
+ });
128
+ }
129
+ }
130
+ }
131
+
132
+ process.stderr.write(`bun-detector[typecheck-enforced]: ${violations.length} violation(s)\n`);
133
+ emit(violations);
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env bun
2
+ // FAMILY validator: bun_fullstack_detector
3
+ // Runs each member check (checks/*.mjs) VERBATIM as a subprocess and merges their
4
+ // RAW v1.1 reports into one — ONE implementation realizing a family of rule_ids
5
+ // (the Core pattern; see frontend.workspace.runtime's families).
6
+ //
7
+ // Members are spawned with `process.execPath`, which under this provider IS the
8
+ // bun binary, so a member may be authored as .mjs OR .ts with no build step.
9
+ // Files whose name begins with `_` are skipped: they are shared helpers, not
10
+ // checks. (The node-runtime families have no such convention because each of
11
+ // their checks re-implements its own walker; this provider factors the walk into
12
+ // lib/scan.mjs instead.)
13
+ import { execFileSync } from "node:child_process";
14
+ import { readFileSync, writeFileSync, mkdtempSync, readdirSync } from "node:fs";
15
+ import { tmpdir } from "node:os";
16
+ import { join, dirname } from "node:path";
17
+ import { fileURLToPath } from "node:url";
18
+
19
+ const here = dirname(fileURLToPath(import.meta.url));
20
+ const reportPath = process.env.ATDD_VIOLATIONS_REPORT;
21
+ if (!reportPath) {
22
+ process.stderr.write("family: ATDD_VIOLATIONS_REPORT not set\n");
23
+ process.exit(2);
24
+ }
25
+ const checks = readdirSync(join(here, "checks"))
26
+ .filter((f) => (f.endsWith(".mjs") || f.endsWith(".ts")) && !f.startsWith("_"))
27
+ .sort();
28
+ const td = mkdtempSync(join(tmpdir(), "atdd-bun-fam-"));
29
+ const out = [];
30
+ for (const c of checks) {
31
+ const rep = join(td, c + ".json");
32
+ try {
33
+ execFileSync(process.execPath, [join(here, "checks", c)], {
34
+ env: { ...process.env, ATDD_VIOLATIONS_REPORT: rep },
35
+ stdio: ["ignore", "ignore", "inherit"],
36
+ });
37
+ } catch {
38
+ /* a member may exit non-zero; still try to read its report */
39
+ }
40
+ try {
41
+ out.push(...JSON.parse(readFileSync(rep, "utf8")).violations);
42
+ } catch {}
43
+ }
44
+ writeFileSync(reportPath, JSON.stringify({ violations: out }, null, 2), "utf8");
45
+ process.stderr.write("family bun_fullstack_detector: " + out.length + " violation(s)\n");
46
+ process.exit(0);
@@ -0,0 +1,7 @@
1
+ // Full-stack Bun: native server, no middleware stack, no node_modules at runtime.
2
+ Bun.serve({
3
+ port: 3000,
4
+ routes: {
5
+ "/orders": (req) => new Response(renderOrders(), { headers: { "content-type": "text/html" } }),
6
+ },
7
+ });
@@ -0,0 +1 @@
1
+ { "lockfileVersion": 1, "workspaces": {} }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "clean-typecheck",
3
+ "scripts": { "check": "bun run typecheck && bun test", "typecheck": "tsc --noEmit" },
4
+ "devDependencies": { "typescript": "^5.6.0" }
5
+ }
@@ -0,0 +1,3 @@
1
+ // A TypeScript Bun app that actually typechecks: typescript is a devDependency,
2
+ // `tsc --noEmit` is wired into the check path, and tsconfig is strict.
3
+ export default { fetch: () => new Response("ok") };
@@ -0,0 +1 @@
1
+ { "compilerOptions": { "strict": true, "moduleResolution": "bundler", "noEmit": true } }
@@ -0,0 +1,5 @@
1
+ import express from "express";
2
+
3
+ const app = express();
4
+ app.get("/orders", (req, res) => res.send(renderOrders()));
5
+ app.listen(3000);
@@ -0,0 +1 @@
1
+ { "lockfileVersion": 1, "workspaces": {} }
@@ -0,0 +1 @@
1
+ { "lockfileVersion": 3, "name": "app" }
@@ -0,0 +1,4 @@
1
+ {
2
+ "name": "dirty-typecheck",
3
+ "scripts": { "check": "bun test", "start": "bun run server.ts" }
4
+ }
@@ -0,0 +1,8 @@
1
+ // A SECOND package in the same tree, also without a typechecker.
2
+ //
3
+ // It exists because the check originally examined only the FIRST package.json it
4
+ // walked into, so a monorepo — a common Bun shape — had one package audited and the
5
+ // rest silently ignored. Worse, `readdirSync` is unsorted, so WHICH package got
6
+ // checked varied by filesystem: CI and a laptop could disagree about a clean repo.
7
+ // Every package.json is now its own project root, and the walk is sorted.
8
+ export const second = 1;
@@ -0,0 +1 @@
1
+ { "name": "second-package-no-typecheck", "scripts": { "start": "bun run index.ts" } }
@@ -0,0 +1,3 @@
1
+ // DIRTY — a TypeScript Bun app with no typescript dependency, no typecheck script, and
2
+ // "strict": false. Bun runs this happily; nothing ever checks that the types hold.
3
+ export default { fetch: () => new Response("ok") };
@@ -0,0 +1 @@
1
+ { "compilerOptions": { "strict": false, "moduleResolution": "bundler" } }
@@ -0,0 +1,35 @@
1
+ schema_version: 1.1.0
2
+ kind: implementation
3
+ subtype: validator
4
+ implementation_id: bun_green_traceability_detector
5
+ targets_workspace: atdd.workspace.bun
6
+ contract_version: 1.1.0
7
+ emits_rule_ids:
8
+ - coder.bun.green-header-order
9
+ - coder.bun.green-header-purpose
10
+ - coder.bun.green-header-runtime
11
+ - coder.bun.green-header-tested-by
12
+ - coder.bun.green-urn-layer
13
+ - coder.bun.green-urn-marker
14
+ - coder.bun.green-urn-name-matches
15
+ - coder.bun.green-urn-pattern
16
+ - coder.bun.green-urn-side
17
+ - coder.bun.green-urn-wagon-feature
18
+ entrypoint: detect.mjs
19
+ report: detect.mjs
20
+ realizes_convention:
21
+ # All ten, as a LIST. The Vite sibling declares a SCALAR here
22
+ # (`realizes_convention: coder.vite.green-urn-marker`) while emitting ten rule ids,
23
+ # so its binder indexes ONE convention and the other nine bind to nothing — they
24
+ # are authored, admitted, and silently unenforced. Verified against this same
25
+ # binder: a scalar yielded "2 bound" for a 9-rule package, a list yielded "9 bound".
26
+ - coder.bun.green-header-order
27
+ - coder.bun.green-header-purpose
28
+ - coder.bun.green-header-runtime
29
+ - coder.bun.green-header-tested-by
30
+ - coder.bun.green-urn-layer
31
+ - coder.bun.green-urn-marker
32
+ - coder.bun.green-urn-name-matches
33
+ - coder.bun.green-urn-pattern
34
+ - coder.bun.green-urn-side
35
+ - coder.bun.green-urn-wagon-feature
@@ -0,0 +1,12 @@
1
+ {
2
+ "green_urn_marker": "coder.bun.green-urn-marker",
3
+ "green_urn_pattern": "coder.bun.green-urn-pattern",
4
+ "green_urn_wagon_feature": "coder.bun.green-urn-wagon-feature",
5
+ "green_urn_name_matches": "coder.bun.green-urn-name-matches",
6
+ "green_urn_side": "coder.bun.green-urn-side",
7
+ "green_urn_layer": "coder.bun.green-urn-layer",
8
+ "green_header_runtime": "coder.bun.green-header-runtime",
9
+ "green_header_purpose": "coder.bun.green-header-purpose",
10
+ "green_header_tested_by": "coder.bun.green-header-tested-by",
11
+ "green_header_order": "coder.bun.green-header-order"
12
+ }
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env bun
2
+ // Member check: coder.bun.green-header-order (GREEN/URN traceability family)
3
+ //
4
+ // CONTRACT (v1.1): reads ATDD_SCAN_ROOTS / ATDD_SCAN_EXCLUDES, writes RAW
5
+ // {rule_id,file,line,col,evidence,source_line} violations to ATDD_VIOLATIONS_REPORT,
6
+ // exits 0 regardless of violation count. Zero deps; shared parsing lives in
7
+ // ../urn_header.mjs. Evaluates ONE rule over each file's parsed header.
8
+ import { runCheck } from "../urn_header.mjs";
9
+
10
+ runCheck("coder.bun.green-header-order", (H) => {
11
+ if (!H.urn) return null; // nothing to order against; the marker rule owns that
12
+ const seq = [["URN", H.urn.no]];
13
+ if (H.testedBy) seq.push(["Tested-By", H.testedBy.no]);
14
+ if (H.runtime) seq.push(["Runtime", H.runtime.no]);
15
+ if (H.purpose) seq.push(["Purpose", H.purpose.no]);
16
+ for (let i = 1; i < seq.length; i++) {
17
+ if (seq[i][1] < seq[i - 1][1]) {
18
+ return { line: seq[i][1], col: 1,
19
+ evidence: `header out of order: ${seq[i][0]} appears before ${seq[i - 1][0]} (expected URN -> Tested-By -> Runtime -> Purpose)`,
20
+ source_line: (H.lines[seq[i][1] - 1] || "").trim() };
21
+ }
22
+ }
23
+ return null;
24
+ });
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env bun
2
+ // Member check: coder.bun.green-header-purpose (GREEN/URN traceability family)
3
+ //
4
+ // CONTRACT (v1.1): reads ATDD_SCAN_ROOTS / ATDD_SCAN_EXCLUDES, writes RAW
5
+ // {rule_id,file,line,col,evidence,source_line} violations to ATDD_VIOLATIONS_REPORT,
6
+ // exits 0 regardless of violation count. Zero deps; shared parsing lives in
7
+ // ../urn_header.mjs. Evaluates ONE rule over each file's parsed header.
8
+ import { runCheck } from "../urn_header.mjs";
9
+
10
+ runCheck("coder.bun.green-header-purpose", (H) => {
11
+ if (!H.purpose) return { line: H.urn ? H.urn.no : (H.firstMeaningfulNo || 1), col: 1,
12
+ evidence: "missing `Purpose:` description in the file header",
13
+ source_line: H.firstMeaningfulText };
14
+ if (H.purpose.value.length <= 80) return null;
15
+ return { line: H.purpose.no, col: 1,
16
+ evidence: `Purpose description is ${H.purpose.value.length} chars (max 80)`,
17
+ source_line: H.purpose.raw };
18
+ });
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env bun
2
+ // Member check: coder.bun.green-header-runtime (GREEN/URN traceability family)
3
+ //
4
+ // CONTRACT (v1.1): reads ATDD_SCAN_ROOTS / ATDD_SCAN_EXCLUDES, writes RAW
5
+ // {rule_id,file,line,col,evidence,source_line} violations to ATDD_VIOLATIONS_REPORT,
6
+ // exits 0 regardless of violation count. Zero deps; shared parsing lives in
7
+ // ../urn_header.mjs. Evaluates ONE rule over each file's parsed header.
8
+ import { runCheck } from "../urn_header.mjs";
9
+
10
+ runCheck("coder.bun.green-header-runtime", (H) => {
11
+ // Bun's runtime vocabulary, where Vite reads vite|browser|node. `bun` is the
12
+ // server half, `browser` the htmx-driven half, and `isomorphic` the modules a
13
+ // full-stack Bun app genuinely runs in BOTH — a fragment renderer used on the
14
+ // server and again after a client-side swap. Vite has no such value because a
15
+ // bundler stack draws that line at build time; Bun draws it at runtime, so the
16
+ // header has to be able to say it.
17
+ const ALLOWED = new Set(["bun", "browser", "isomorphic"]);
18
+ if (!H.runtime) return { line: H.urn ? H.urn.no : (H.firstMeaningfulNo || 1), col: 1,
19
+ evidence: "missing `Runtime:` declaration in the file header",
20
+ source_line: H.firstMeaningfulText };
21
+ if (ALLOWED.has(H.runtime.value)) return null;
22
+ return { line: H.runtime.no, col: 1,
23
+ evidence: `Runtime "${H.runtime.value}" is not one of ${[...ALLOWED].join("|")}`,
24
+ source_line: H.runtime.raw };
25
+ });
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env bun
2
+ // Member check: coder.bun.green-header-tested-by (GREEN/URN traceability family)
3
+ //
4
+ // CONTRACT (v1.1): reads ATDD_SCAN_ROOTS / ATDD_SCAN_EXCLUDES, writes RAW
5
+ // {rule_id,file,line,col,evidence,source_line} violations to ATDD_VIOLATIONS_REPORT,
6
+ // exits 0 regardless of violation count. Zero deps; shared parsing lives in
7
+ // ../urn_header.mjs. Evaluates ONE rule over each file's parsed header.
8
+ import { runCheck } from "../urn_header.mjs";
9
+
10
+ runCheck("coder.bun.green-header-tested-by", (H) => {
11
+ if (H.testedBy && H.testedEntries >= 1) return null;
12
+ return { line: H.urn ? H.urn.no : (H.firstMeaningfulNo || 1), col: 1,
13
+ evidence: "missing `Tested-By:` block with at least one `- test:` acceptance URN",
14
+ source_line: H.firstMeaningfulText };
15
+ });
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env bun
2
+ // Member check: coder.bun.green-urn-layer (GREEN/URN traceability family)
3
+ //
4
+ // CONTRACT (v1.1): reads ATDD_SCAN_ROOTS / ATDD_SCAN_EXCLUDES, writes RAW
5
+ // {rule_id,file,line,col,evidence,source_line} violations to ATDD_VIOLATIONS_REPORT,
6
+ // exits 0 regardless of violation count. Zero deps; shared parsing lives in
7
+ // ../urn_header.mjs. Evaluates ONE rule over each file's parsed header.
8
+ import { runCheck } from "../urn_header.mjs";
9
+
10
+ runCheck("coder.bun.green-urn-layer", (H) => {
11
+ if (!H.urn || H.segs.length !== 6) return null;
12
+ const LAYERS = new Set(["domain", "application", "integration", "presentation", "assembly"]);
13
+ if (LAYERS.has(H.segs[5])) return null;
14
+ return { line: H.urn.no, col: H.urn.col,
15
+ evidence: `URN layer segment "${H.segs[5]}" is not one of domain|application|integration|presentation|assembly`,
16
+ source_line: H.urn.raw };
17
+ });
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env bun
2
+ // Member check: coder.bun.green-urn-marker (GREEN/URN traceability family)
3
+ //
4
+ // CONTRACT (v1.1): reads ATDD_SCAN_ROOTS / ATDD_SCAN_EXCLUDES, writes RAW
5
+ // {rule_id,file,line,col,evidence,source_line} violations to ATDD_VIOLATIONS_REPORT,
6
+ // exits 0 regardless of violation count. Zero deps; shared parsing lives in
7
+ // ../urn_header.mjs. Evaluates ONE rule over each file's parsed header.
8
+ import { runCheck } from "../urn_header.mjs";
9
+
10
+ runCheck("coder.bun.green-urn-marker", (H) => {
11
+ if (!H.urn) return { line: H.firstMeaningfulNo || 1, col: 1,
12
+ evidence: "missing `URN:` component marker (must be the first meaningful line of the file)",
13
+ source_line: H.firstMeaningfulText };
14
+ if (H.urn.no !== H.firstMeaningfulNo) return { line: H.firstMeaningfulNo, col: 1,
15
+ evidence: "`URN:` marker is not the first meaningful line of the file",
16
+ source_line: H.firstMeaningfulText };
17
+ return null;
18
+ });
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env bun
2
+ // Member check: coder.bun.green-urn-name-matches (GREEN/URN traceability family)
3
+ //
4
+ // CONTRACT (v1.1): reads ATDD_SCAN_ROOTS / ATDD_SCAN_EXCLUDES, writes RAW
5
+ // {rule_id,file,line,col,evidence,source_line} violations to ATDD_VIOLATIONS_REPORT,
6
+ // exits 0 regardless of violation count. Zero deps; shared parsing lives in
7
+ // ../urn_header.mjs. Evaluates ONE rule over each file's parsed header.
8
+ import { runCheck } from "../urn_header.mjs";
9
+
10
+ runCheck("coder.bun.green-urn-name-matches", (H, file) => {
11
+ if (!H.urn || H.segs.length !== 6) return null;
12
+ const name = H.segs[3];
13
+ // Structural filenames name a ROLE, not a component, so the name segment is
14
+ // free to name what the file assembles. The Vite set plus the Bun/htmx idioms:
15
+ // a full-stack Bun app's entrypoint is `server`, its route table `routes`, and
16
+ // its htmx fragments `partial`/`fragment`/`layout`.
17
+ const SPECIAL = new Set(["composition", "wagon", "entrypoint", "http", "index", "schema",
18
+ "router", "routes", "server", "layout", "partial", "fragment", "middleware"]);
19
+ if (SPECIAL.has(name.toLowerCase())) return null;
20
+ const base = file.split(/[\\/]/).pop().replace(/\.[^.]+$/, "");
21
+ const norm = (x) => x.toLowerCase().replace(/[^a-z0-9]/g, "");
22
+ if (norm(name) === norm(base)) return null;
23
+ return { line: H.urn.no, col: H.urn.col,
24
+ evidence: `URN name segment "${name}" does not match filename "${base}"`,
25
+ source_line: H.urn.raw };
26
+ });
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env bun
2
+ // Member check: coder.bun.green-urn-pattern (GREEN/URN traceability family)
3
+ //
4
+ // CONTRACT (v1.1): reads ATDD_SCAN_ROOTS / ATDD_SCAN_EXCLUDES, writes RAW
5
+ // {rule_id,file,line,col,evidence,source_line} violations to ATDD_VIOLATIONS_REPORT,
6
+ // exits 0 regardless of violation count. Zero deps; shared parsing lives in
7
+ // ../urn_header.mjs. Evaluates ONE rule over each file's parsed header.
8
+ import { runCheck } from "../urn_header.mjs";
9
+
10
+ runCheck("coder.bun.green-urn-pattern", (H) => {
11
+ if (!H.urn) return null; // absence is the marker rule's finding, not this one's
12
+ const s = H.segs;
13
+ if (s.length === 6 && s[0] === "component" && s.every((x) => x.length > 0)) return null;
14
+ return { line: H.urn.no, col: H.urn.col,
15
+ evidence: `URN "${H.urn.value}" does not match component:{wagon}:{feature}:{name}:{side}:{layer}`,
16
+ source_line: H.urn.raw };
17
+ });
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env bun
2
+ // Member check: coder.bun.green-urn-side (GREEN/URN traceability family)
3
+ //
4
+ // CONTRACT (v1.1): reads ATDD_SCAN_ROOTS / ATDD_SCAN_EXCLUDES, writes RAW
5
+ // {rule_id,file,line,col,evidence,source_line} violations to ATDD_VIOLATIONS_REPORT,
6
+ // exits 0 regardless of violation count. Zero deps; shared parsing lives in
7
+ // ../urn_header.mjs. Evaluates ONE rule over each file's parsed header.
8
+ import { runCheck } from "../urn_header.mjs";
9
+
10
+ runCheck("coder.bun.green-urn-side", (H) => {
11
+ if (!H.urn || H.segs.length !== 6) return null;
12
+ // Unchanged from the Python and Vite realizations: `side` is a stack-neutral
13
+ // axis. A full-stack Bun app spans both halves, which is precisely why the
14
+ // segment has to be declared per file rather than inferred from the stack.
15
+ const SIDES = new Set(["frontend", "backend"]);
16
+ if (SIDES.has(H.segs[4])) return null;
17
+ return { line: H.urn.no, col: H.urn.col,
18
+ evidence: `URN side segment "${H.segs[4]}" is not one of frontend|backend`,
19
+ source_line: H.urn.raw };
20
+ });