atdd 0.2.3__tar.gz → 0.2.5__tar.gz

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 (191) hide show
  1. {atdd-0.2.3/src/atdd.egg-info → atdd-0.2.5}/PKG-INFO +48 -1
  2. {atdd-0.2.3 → atdd-0.2.5}/README.md +47 -0
  3. {atdd-0.2.3 → atdd-0.2.5}/pyproject.toml +1 -1
  4. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/cli.py +24 -0
  5. atdd-0.2.5/src/atdd/coach/commands/gate.py +168 -0
  6. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/templates/ATDD.md +15 -0
  7. {atdd-0.2.3 → atdd-0.2.5/src/atdd.egg-info}/PKG-INFO +48 -1
  8. {atdd-0.2.3 → atdd-0.2.5}/src/atdd.egg-info/SOURCES.txt +1 -0
  9. {atdd-0.2.3 → atdd-0.2.5}/LICENSE +0 -0
  10. {atdd-0.2.3 → atdd-0.2.5}/setup.cfg +0 -0
  11. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/__init__.py +0 -0
  12. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/__main__.py +0 -0
  13. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/__init__.py +0 -0
  14. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/__init__.py +0 -0
  15. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/add_persistence_metadata.py +0 -0
  16. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/analyze_migrations.py +0 -0
  17. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/consumers.py +0 -0
  18. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/infer_governance_status.py +0 -0
  19. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/initializer.py +0 -0
  20. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/interface.py +0 -0
  21. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/inventory.py +0 -0
  22. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/migration.py +0 -0
  23. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/registry.py +0 -0
  24. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/session.py +0 -0
  25. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/sync.py +0 -0
  26. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/test_interface.py +0 -0
  27. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/test_runner.py +0 -0
  28. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/tests/__init__.py +0 -0
  29. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/tests/test_telemetry_array_validation.py +0 -0
  30. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/commands/traceability.py +0 -0
  31. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/conventions/session.convention.yaml +0 -0
  32. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/overlays/__init__.py +0 -0
  33. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/overlays/claude.md +0 -0
  34. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/schemas/config.schema.json +0 -0
  35. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/schemas/manifest.schema.json +0 -0
  36. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/templates/SESSION-TEMPLATE.md +0 -0
  37. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/utils/__init__.py +0 -0
  38. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/utils/graph/__init__.py +0 -0
  39. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/utils/graph/urn.py +0 -0
  40. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/validators/__init__.py +0 -0
  41. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/validators/shared_fixtures.py +0 -0
  42. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/validators/test_enrich_wagon_registry.py +0 -0
  43. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/validators/test_registry.py +0 -0
  44. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/validators/test_session_validation.py +0 -0
  45. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/validators/test_traceability.py +0 -0
  46. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/validators/test_update_feature_paths.py +0 -0
  47. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coach/validators/test_validate_contract_consumers.py +0 -0
  48. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/__init__.py +0 -0
  49. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/adapter.recipe.yaml +0 -0
  50. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/backend.convention.yaml +0 -0
  51. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/boundaries.convention.yaml +0 -0
  52. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/commons.convention.yaml +0 -0
  53. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/complexity.recipe.yaml +0 -0
  54. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/component-naming.convention.yaml +0 -0
  55. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/design.convention.yaml +0 -0
  56. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/design.recipe.yaml +0 -0
  57. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/dto.convention.yaml +0 -0
  58. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/frontend.convention.yaml +0 -0
  59. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/green.convention.yaml +0 -0
  60. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/presentation.convention.yaml +0 -0
  61. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/refactor.convention.yaml +0 -0
  62. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/technology.convention.yaml +0 -0
  63. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/tests/__init__.py +0 -0
  64. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/tests/test_adapter_recipe.py +0 -0
  65. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/tests/test_complexity_recipe.py +0 -0
  66. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/tests/test_component_taxonomy.py +0 -0
  67. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/tests/test_component_urn_naming.py +0 -0
  68. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/tests/test_thinness_recipe.py +0 -0
  69. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/thinness.recipe.yaml +0 -0
  70. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/train.convention.yaml +0 -0
  71. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/conventions/verification.protocol.yaml +0 -0
  72. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/schemas/design_system.schema.json +0 -0
  73. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/__init__.py +0 -0
  74. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_commons_structure.py +0 -0
  75. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_complexity.py +0 -0
  76. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_cross_language_consistency.py +0 -0
  77. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_design_system_compliance.py +0 -0
  78. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_dto_testing_patterns.py +0 -0
  79. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_green_cross_stack_layers.py +0 -0
  80. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_green_layer_dependencies.py +0 -0
  81. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_green_python_layer_structure.py +0 -0
  82. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_green_supabase_layer_structure.py +0 -0
  83. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_import_boundaries.py +0 -0
  84. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_init_file_urns.py +0 -0
  85. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_preact_layer_boundaries.py +0 -0
  86. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_presentation_convention.py +0 -0
  87. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_python_architecture.py +0 -0
  88. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_quality_metrics.py +0 -0
  89. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_station_master_pattern.py +0 -0
  90. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_train_infrastructure.py +0 -0
  91. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_train_urns.py +0 -0
  92. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_typescript_architecture.py +0 -0
  93. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_usecase_structure.py +0 -0
  94. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/coder/validators/test_wagon_boundaries.py +0 -0
  95. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/conftest.py +0 -0
  96. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/__init__.py +0 -0
  97. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/conventions/acceptance.convention.yaml +0 -0
  98. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/conventions/appendix.convention.yaml +0 -0
  99. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/conventions/artifact-naming.convention.yaml +0 -0
  100. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/conventions/component.convention.yaml +0 -0
  101. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/conventions/criteria.convention.yaml +0 -0
  102. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/conventions/feature.convention.yaml +0 -0
  103. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/conventions/interface.convention.yaml +0 -0
  104. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/conventions/steps.convention.yaml +0 -0
  105. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/conventions/train.convention.yaml +0 -0
  106. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/conventions/wagon.convention.yaml +0 -0
  107. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/conventions/wmbt.convention.yaml +0 -0
  108. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/schemas/acceptance.schema.json +0 -0
  109. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/schemas/appendix.schema.json +0 -0
  110. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/schemas/component.schema.json +0 -0
  111. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/schemas/feature.schema.json +0 -0
  112. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/schemas/train.schema.json +0 -0
  113. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/schemas/wagon.schema.json +0 -0
  114. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/schemas/wmbt.schema.json +0 -0
  115. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/validators/__init__.py +0 -0
  116. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/validators/conftest.py +0 -0
  117. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/validators/test_draft_wagon_registry.py +0 -0
  118. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/validators/test_plan_cross_refs.py +0 -0
  119. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/validators/test_plan_uniqueness.py +0 -0
  120. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/validators/test_plan_urn_resolution.py +0 -0
  121. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/validators/test_plan_wagons.py +0 -0
  122. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/validators/test_train_validation.py +0 -0
  123. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/validators/test_wagon_urn_chain.py +0 -0
  124. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/validators/test_wmbt_consistency.py +0 -0
  125. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/planner/validators/test_wmbt_vocabulary.py +0 -0
  126. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/__init__.py +0 -0
  127. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/conventions/artifact.convention.yaml +0 -0
  128. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/conventions/contract.convention.yaml +0 -0
  129. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/conventions/filename.convention.yaml +0 -0
  130. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/conventions/migration.convention.yaml +0 -0
  131. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/conventions/red.convention.yaml +0 -0
  132. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/conventions/routing.convention.yaml +0 -0
  133. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/conventions/telemetry.convention.yaml +0 -0
  134. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/a11y.tmpl.json +0 -0
  135. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/artifact.schema.json +0 -0
  136. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/contract.schema.json +0 -0
  137. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/contract.tmpl.json +0 -0
  138. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/db.tmpl.json +0 -0
  139. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/e2e.tmpl.json +0 -0
  140. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/edge_function.tmpl.json +0 -0
  141. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/event.tmpl.json +0 -0
  142. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/http.tmpl.json +0 -0
  143. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/job.tmpl.json +0 -0
  144. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/load.tmpl.json +0 -0
  145. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/metric.tmpl.json +0 -0
  146. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/pack.schema.json +0 -0
  147. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/realtime.tmpl.json +0 -0
  148. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/rls.tmpl.json +0 -0
  149. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/script.tmpl.json +0 -0
  150. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/sec.tmpl.json +0 -0
  151. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/storage.tmpl.json +0 -0
  152. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/telemetry.schema.json +0 -0
  153. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/telemetry_tracking_manifest.schema.json +0 -0
  154. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/test_filename.schema.json +0 -0
  155. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/test_intent.schema.json +0 -0
  156. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/unit.tmpl.json +0 -0
  157. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/visual.tmpl.json +0 -0
  158. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/schemas/ws.tmpl.json +0 -0
  159. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/utils/__init__.py +0 -0
  160. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/utils/filename.py +0 -0
  161. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/__init__.py +0 -0
  162. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/cleanup_duplicate_headers.py +0 -0
  163. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/cleanup_duplicate_headers_v2.py +0 -0
  164. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/conftest.py +0 -0
  165. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/coverage_gap_report.py +0 -0
  166. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/fix_dual_ac_references.py +0 -0
  167. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/remove_duplicate_lines.py +0 -0
  168. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_acceptance_urn_filename_mapping.py +0 -0
  169. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_acceptance_urn_separator.py +0 -0
  170. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_artifact_naming_category.py +0 -0
  171. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_contract_schema_compliance.py +0 -0
  172. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_contracts_structure.py +0 -0
  173. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_coverage_adequacy.py +0 -0
  174. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_dual_ac_reference.py +0 -0
  175. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_fixture_validity.py +0 -0
  176. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_isolation.py +0 -0
  177. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_migration_coverage.py +0 -0
  178. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_migration_criteria.py +0 -0
  179. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_migration_generation.py +0 -0
  180. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_python_test_naming.py +0 -0
  181. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_red_layer_validation.py +0 -0
  182. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_red_python_layer_structure.py +0 -0
  183. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_red_supabase_layer_structure.py +0 -0
  184. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_telemetry_structure.py +0 -0
  185. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_typescript_test_naming.py +0 -0
  186. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/tester/validators/test_typescript_test_structure.py +0 -0
  187. {atdd-0.2.3 → atdd-0.2.5}/src/atdd/version_check.py +0 -0
  188. {atdd-0.2.3 → atdd-0.2.5}/src/atdd.egg-info/dependency_links.txt +0 -0
  189. {atdd-0.2.3 → atdd-0.2.5}/src/atdd.egg-info/entry_points.txt +0 -0
  190. {atdd-0.2.3 → atdd-0.2.5}/src/atdd.egg-info/requires.txt +0 -0
  191. {atdd-0.2.3 → atdd-0.2.5}/src/atdd.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atdd
3
- Version: 0.2.3
3
+ Version: 0.2.5
4
4
  Summary: ATDD Platform - Acceptance Test Driven Development toolkit
5
5
  License: MIT
6
6
  Requires-Python: >=3.10
@@ -129,6 +129,53 @@ sync:
129
129
  # - qwen # Uncomment to sync QWEN.md
130
130
  ```
131
131
 
132
+ **Multi-agent setup:** To use multiple agents with consistent rules, enable them all in config and run sync:
133
+
134
+ ```yaml
135
+ sync:
136
+ agents:
137
+ - claude
138
+ - codex
139
+ - gemini
140
+ - qwen
141
+ ```
142
+
143
+ ```bash
144
+ atdd sync # Creates/updates CLAUDE.md, AGENTS.md, GEMINI.md, QWEN.md
145
+ ```
146
+
147
+ ### ATDD Gate
148
+
149
+ Verify agents have loaded ATDD rules before starting work:
150
+
151
+ ```bash
152
+ atdd gate # Show gate verification info
153
+ atdd gate --json # Output as JSON for programmatic use
154
+ ```
155
+
156
+ Example output:
157
+ ```
158
+ ============================================================
159
+ ATDD Gate Verification
160
+ ============================================================
161
+
162
+ Loaded files:
163
+ - CLAUDE.md (hash: d04f897c6691dc13...)
164
+
165
+ Key constraints:
166
+ 1. No ad-hoc tests - follow ATDD conventions
167
+ 2. Domain layer NEVER imports from other layers
168
+ 3. Phase transitions require quality gates
169
+
170
+ ------------------------------------------------------------
171
+ Before starting work, confirm you have loaded these rules.
172
+ ------------------------------------------------------------
173
+ ```
174
+
175
+ Agents should confirm at the start of each session:
176
+ - Which ATDD file(s) they loaded
177
+ - The key constraints they will follow
178
+
132
179
  ### Validation
133
180
 
134
181
  ```bash
@@ -115,6 +115,53 @@ sync:
115
115
  # - qwen # Uncomment to sync QWEN.md
116
116
  ```
117
117
 
118
+ **Multi-agent setup:** To use multiple agents with consistent rules, enable them all in config and run sync:
119
+
120
+ ```yaml
121
+ sync:
122
+ agents:
123
+ - claude
124
+ - codex
125
+ - gemini
126
+ - qwen
127
+ ```
128
+
129
+ ```bash
130
+ atdd sync # Creates/updates CLAUDE.md, AGENTS.md, GEMINI.md, QWEN.md
131
+ ```
132
+
133
+ ### ATDD Gate
134
+
135
+ Verify agents have loaded ATDD rules before starting work:
136
+
137
+ ```bash
138
+ atdd gate # Show gate verification info
139
+ atdd gate --json # Output as JSON for programmatic use
140
+ ```
141
+
142
+ Example output:
143
+ ```
144
+ ============================================================
145
+ ATDD Gate Verification
146
+ ============================================================
147
+
148
+ Loaded files:
149
+ - CLAUDE.md (hash: d04f897c6691dc13...)
150
+
151
+ Key constraints:
152
+ 1. No ad-hoc tests - follow ATDD conventions
153
+ 2. Domain layer NEVER imports from other layers
154
+ 3. Phase transitions require quality gates
155
+
156
+ ------------------------------------------------------------
157
+ Before starting work, confirm you have loaded these rules.
158
+ ------------------------------------------------------------
159
+ ```
160
+
161
+ Agents should confirm at the start of each session:
162
+ - Which ATDD file(s) they loaded
163
+ - The key constraints they will follow
164
+
118
165
  ### Validation
119
166
 
120
167
  ```bash
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "atdd"
7
- version = "0.2.3"
7
+ version = "0.2.5"
8
8
  description = "ATDD Platform - Acceptance Test Driven Development toolkit"
9
9
  requires-python = ">=3.10"
10
10
  readme = "README.md"
@@ -10,6 +10,7 @@ The coach orchestrates all ATDD lifecycle operations:
10
10
  - Init: Initialize ATDD structure in consumer repos
11
11
  - Session: Manage session files
12
12
  - Sync: Sync ATDD rules to agent config files
13
+ - Gate: Verify agents loaded ATDD rules
13
14
 
14
15
  Usage:
15
16
  atdd init # Initialize ATDD in consumer repo
@@ -19,6 +20,7 @@ Usage:
19
20
  atdd sync # Sync ATDD rules to agent configs
20
21
  atdd sync --verify # Check if files are in sync
21
22
  atdd sync --agent claude # Sync specific agent only
23
+ atdd gate # Show ATDD gate verification
22
24
  atdd --inventory # Generate inventory
23
25
  atdd --test all # Run all meta-tests
24
26
  atdd --test planner # Run planner phase tests
@@ -41,6 +43,7 @@ from atdd.coach.commands.registry import RegistryUpdater
41
43
  from atdd.coach.commands.initializer import ProjectInitializer
42
44
  from atdd.coach.commands.session import SessionManager
43
45
  from atdd.coach.commands.sync import AgentConfigSync
46
+ from atdd.coach.commands.gate import ATDDGate
44
47
  from atdd.version_check import print_update_notice
45
48
 
46
49
 
@@ -157,6 +160,10 @@ Examples:
157
160
  %(prog)s sync --agent claude Sync specific agent only
158
161
  %(prog)s sync --status Show sync status
159
162
 
163
+ # ATDD gate verification
164
+ %(prog)s gate Show gate verification info
165
+ %(prog)s gate --json Output as JSON
166
+
160
167
  # Existing flag-based commands (backwards compatible)
161
168
  %(prog)s --inventory Generate full inventory (YAML)
162
169
  %(prog)s --inventory --format json Generate inventory (JSON)
@@ -269,6 +276,18 @@ Phase descriptions:
269
276
  help="Show sync status for all agents"
270
277
  )
271
278
 
279
+ # ----- atdd gate -----
280
+ gate_parser = subparsers.add_parser(
281
+ "gate",
282
+ help="Show ATDD gate verification info",
283
+ description="Verify agents have loaded ATDD rules before starting work"
284
+ )
285
+ gate_parser.add_argument(
286
+ "--json",
287
+ action="store_true",
288
+ help="Output as JSON for programmatic use"
289
+ )
290
+
272
291
  # ----- Existing flag-based arguments (backwards compatible) -----
273
292
 
274
293
  # Main command groups
@@ -368,6 +387,11 @@ Phase descriptions:
368
387
  return syncer.verify()
369
388
  return syncer.sync(agents=[args.agent] if args.agent else None)
370
389
 
390
+ # atdd gate
391
+ elif args.command == "gate":
392
+ gate = ATDDGate()
393
+ return gate.verify(json=args.json)
394
+
371
395
  # ----- Handle flag-based commands (backwards compatible) -----
372
396
 
373
397
  # Create coach instance
@@ -0,0 +1,168 @@
1
+ """
2
+ ATDD Gate verification command.
3
+
4
+ Ensures agents have loaded and confirmed ATDD rules before starting work.
5
+ Outputs the expected hash and key constraints for verification.
6
+
7
+ Usage:
8
+ atdd gate # Show gate verification info
9
+ atdd gate --json # Output as JSON for programmatic use
10
+ """
11
+ import hashlib
12
+ import json as json_module
13
+ from pathlib import Path
14
+ from typing import Dict, List, Optional
15
+
16
+ from atdd.coach.commands.sync import AgentConfigSync
17
+
18
+
19
+ class ATDDGate:
20
+ """ATDD Gate verification."""
21
+
22
+ # Key constraints agents must acknowledge
23
+ KEY_CONSTRAINTS = [
24
+ "No ad-hoc tests - follow ATDD conventions",
25
+ "Domain layer NEVER imports from other layers",
26
+ "Phase transitions require quality gates (INIT → PLANNED → RED → GREEN → REFACTOR)",
27
+ ]
28
+
29
+ def __init__(self, target_dir: Optional[Path] = None):
30
+ """
31
+ Initialize the ATDDGate.
32
+
33
+ Args:
34
+ target_dir: Target directory containing agent config files.
35
+ """
36
+ self.target_dir = target_dir or Path.cwd()
37
+ self.syncer = AgentConfigSync(self.target_dir)
38
+
39
+ def _compute_block_hash(self, content: str) -> Optional[str]:
40
+ """
41
+ Compute SHA256 hash of the managed block in content.
42
+
43
+ Args:
44
+ content: File content.
45
+
46
+ Returns:
47
+ SHA256 hash or None if no managed block found.
48
+ """
49
+ block, _, _ = self.syncer._extract_managed_block(content)
50
+ if block is None:
51
+ return None
52
+
53
+ return hashlib.sha256(block.encode()).hexdigest()
54
+
55
+ def _get_synced_files(self) -> Dict[str, Dict]:
56
+ """
57
+ Get info about synced agent config files.
58
+
59
+ Returns:
60
+ Dict mapping agent name to file info.
61
+ """
62
+ agents = self.syncer._get_enabled_agents()
63
+ result = {}
64
+
65
+ for agent in agents:
66
+ target_file = self.syncer.AGENT_FILES.get(agent)
67
+ if not target_file:
68
+ continue
69
+
70
+ target_path = self.target_dir / target_file
71
+ if not target_path.exists():
72
+ result[agent] = {
73
+ "file": target_file,
74
+ "exists": False,
75
+ "hash": None,
76
+ }
77
+ continue
78
+
79
+ content = target_path.read_text()
80
+ block_hash = self._compute_block_hash(content)
81
+
82
+ result[agent] = {
83
+ "file": target_file,
84
+ "exists": True,
85
+ "has_block": block_hash is not None,
86
+ "hash": block_hash[:16] if block_hash else None, # Short hash for display
87
+ "hash_full": block_hash,
88
+ }
89
+
90
+ return result
91
+
92
+ def verify(self, json: bool = False) -> int:
93
+ """
94
+ Output gate verification info.
95
+
96
+ Args:
97
+ json: If True, output as JSON.
98
+
99
+ Returns:
100
+ 0 on success, 1 if no synced files found.
101
+ """
102
+ files = self._get_synced_files()
103
+
104
+ if not files:
105
+ print("No agent config files configured.")
106
+ print("Run 'atdd init' to set up ATDD in this repo.")
107
+ return 1
108
+
109
+ if json:
110
+ output = {
111
+ "files": files,
112
+ "constraints": self.KEY_CONSTRAINTS,
113
+ }
114
+ print(json_module.dumps(output, indent=2))
115
+ return 0
116
+
117
+ # Human-readable output
118
+ print("=" * 60)
119
+ print("ATDD Gate Verification")
120
+ print("=" * 60)
121
+
122
+ print("\nLoaded files:")
123
+ for agent, info in files.items():
124
+ if info["exists"] and info.get("has_block"):
125
+ print(f" - {info['file']} (hash: {info['hash']}...)")
126
+ elif info["exists"]:
127
+ print(f" - {info['file']} (no managed block)")
128
+ else:
129
+ print(f" - {info['file']} (missing)")
130
+
131
+ print("\nKey constraints:")
132
+ for i, constraint in enumerate(self.KEY_CONSTRAINTS, 1):
133
+ print(f" {i}. {constraint}")
134
+
135
+ print("\n" + "-" * 60)
136
+ print("Before starting work, confirm you have loaded these rules.")
137
+ print("-" * 60)
138
+
139
+ return 0
140
+
141
+ def get_confirmation_template(self) -> str:
142
+ """
143
+ Get a template agents can use to confirm gate compliance.
144
+
145
+ Returns:
146
+ Markdown template for gate confirmation.
147
+ """
148
+ files = self._get_synced_files()
149
+
150
+ lines = [
151
+ "## ATDD Gate Confirmation",
152
+ "",
153
+ "**Files loaded:**",
154
+ ]
155
+
156
+ for agent, info in files.items():
157
+ if info["exists"] and info.get("has_block"):
158
+ lines.append(f"- {info['file']} (hash: `{info['hash']}...`)")
159
+
160
+ lines.extend([
161
+ "",
162
+ "**Key constraints acknowledged:**",
163
+ ])
164
+
165
+ for constraint in self.KEY_CONSTRAINTS:
166
+ lines.append(f"- {constraint}")
167
+
168
+ return "\n".join(lines)
@@ -4,6 +4,21 @@ missions:
4
4
  validate_phase_transitions: "Phase transitions and quality gates per conventions and schemas"
5
5
  required: true
6
6
 
7
+ # ATDD Gate (REQUIRED before any work)
8
+ # =====================================
9
+ # Before starting ANY task, you MUST confirm you have loaded these rules.
10
+ # Provide this confirmation at the start of your first response:
11
+ #
12
+ # ## ATDD Gate Confirmation
13
+ # - **File loaded:** CLAUDE.md (or AGENTS.md, etc.)
14
+ # - **Key constraints:**
15
+ # 1. No ad-hoc tests - follow ATDD conventions
16
+ # 2. Domain layer NEVER imports from other layers
17
+ # 3. Phase transitions require quality gates
18
+ #
19
+ # If you cannot provide this confirmation, STOP and reload the rules.
20
+ # Run `atdd gate` to verify the expected values.
21
+
7
22
  manifest:
8
23
  - trains: "plan/_trains.yaml"
9
24
  - wagons: "plan/_wagons.yaml"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atdd
3
- Version: 0.2.3
3
+ Version: 0.2.5
4
4
  Summary: ATDD Platform - Acceptance Test Driven Development toolkit
5
5
  License: MIT
6
6
  Requires-Python: >=3.10
@@ -129,6 +129,53 @@ sync:
129
129
  # - qwen # Uncomment to sync QWEN.md
130
130
  ```
131
131
 
132
+ **Multi-agent setup:** To use multiple agents with consistent rules, enable them all in config and run sync:
133
+
134
+ ```yaml
135
+ sync:
136
+ agents:
137
+ - claude
138
+ - codex
139
+ - gemini
140
+ - qwen
141
+ ```
142
+
143
+ ```bash
144
+ atdd sync # Creates/updates CLAUDE.md, AGENTS.md, GEMINI.md, QWEN.md
145
+ ```
146
+
147
+ ### ATDD Gate
148
+
149
+ Verify agents have loaded ATDD rules before starting work:
150
+
151
+ ```bash
152
+ atdd gate # Show gate verification info
153
+ atdd gate --json # Output as JSON for programmatic use
154
+ ```
155
+
156
+ Example output:
157
+ ```
158
+ ============================================================
159
+ ATDD Gate Verification
160
+ ============================================================
161
+
162
+ Loaded files:
163
+ - CLAUDE.md (hash: d04f897c6691dc13...)
164
+
165
+ Key constraints:
166
+ 1. No ad-hoc tests - follow ATDD conventions
167
+ 2. Domain layer NEVER imports from other layers
168
+ 3. Phase transitions require quality gates
169
+
170
+ ------------------------------------------------------------
171
+ Before starting work, confirm you have loaded these rules.
172
+ ------------------------------------------------------------
173
+ ```
174
+
175
+ Agents should confirm at the start of each session:
176
+ - Which ATDD file(s) they loaded
177
+ - The key constraints they will follow
178
+
132
179
  ### Validation
133
180
 
134
181
  ```bash
@@ -17,6 +17,7 @@ src/atdd/coach/commands/__init__.py
17
17
  src/atdd/coach/commands/add_persistence_metadata.py
18
18
  src/atdd/coach/commands/analyze_migrations.py
19
19
  src/atdd/coach/commands/consumers.py
20
+ src/atdd/coach/commands/gate.py
20
21
  src/atdd/coach/commands/infer_governance_status.py
21
22
  src/atdd/coach/commands/initializer.py
22
23
  src/atdd/coach/commands/interface.py
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes