atdd 0.4.1__tar.gz → 0.4.3__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 (196) hide show
  1. {atdd-0.4.1/src/atdd.egg-info → atdd-0.4.3}/PKG-INFO +15 -1
  2. {atdd-0.4.1 → atdd-0.4.3}/README.md +14 -0
  3. {atdd-0.4.1 → atdd-0.4.3}/pyproject.toml +1 -1
  4. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/initializer.py +4 -0
  5. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/registry.py +2 -2
  6. atdd-0.4.3/src/atdd/coach/schemas/config.schema.json +65 -0
  7. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/templates/ATDD.md +4 -1
  8. atdd-0.4.3/src/atdd/coach/validators/test_release_versioning.py +178 -0
  9. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/validators/test_plan_cross_refs.py +4 -2
  10. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/validators/test_train_validation.py +10 -8
  11. {atdd-0.4.1 → atdd-0.4.3/src/atdd.egg-info}/PKG-INFO +15 -1
  12. {atdd-0.4.1 → atdd-0.4.3}/src/atdd.egg-info/SOURCES.txt +1 -0
  13. atdd-0.4.1/src/atdd/coach/schemas/config.schema.json +0 -34
  14. {atdd-0.4.1 → atdd-0.4.3}/LICENSE +0 -0
  15. {atdd-0.4.1 → atdd-0.4.3}/setup.cfg +0 -0
  16. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/__init__.py +0 -0
  17. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/__main__.py +0 -0
  18. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/cli.py +0 -0
  19. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/__init__.py +0 -0
  20. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/__init__.py +0 -0
  21. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/add_persistence_metadata.py +0 -0
  22. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/analyze_migrations.py +0 -0
  23. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/consumers.py +0 -0
  24. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/gate.py +0 -0
  25. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/infer_governance_status.py +0 -0
  26. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/interface.py +0 -0
  27. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/inventory.py +0 -0
  28. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/migration.py +0 -0
  29. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/session.py +0 -0
  30. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/sync.py +0 -0
  31. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/test_interface.py +0 -0
  32. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/test_runner.py +0 -0
  33. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/tests/__init__.py +0 -0
  34. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/tests/test_telemetry_array_validation.py +0 -0
  35. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/commands/traceability.py +0 -0
  36. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/conventions/session.convention.yaml +0 -0
  37. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/overlays/__init__.py +0 -0
  38. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/overlays/claude.md +0 -0
  39. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/schemas/manifest.schema.json +0 -0
  40. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/templates/SESSION-TEMPLATE.md +0 -0
  41. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/utils/__init__.py +0 -0
  42. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/utils/graph/__init__.py +0 -0
  43. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/utils/graph/urn.py +0 -0
  44. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/utils/repo.py +0 -0
  45. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/validators/__init__.py +0 -0
  46. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/validators/shared_fixtures.py +0 -0
  47. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/validators/test_enrich_wagon_registry.py +0 -0
  48. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/validators/test_registry.py +0 -0
  49. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/validators/test_session_validation.py +0 -0
  50. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/validators/test_traceability.py +0 -0
  51. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/validators/test_update_feature_paths.py +0 -0
  52. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coach/validators/test_validate_contract_consumers.py +0 -0
  53. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/__init__.py +0 -0
  54. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/adapter.recipe.yaml +0 -0
  55. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/backend.convention.yaml +0 -0
  56. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/boundaries.convention.yaml +0 -0
  57. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/commons.convention.yaml +0 -0
  58. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/complexity.recipe.yaml +0 -0
  59. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/component-naming.convention.yaml +0 -0
  60. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/design.convention.yaml +0 -0
  61. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/design.recipe.yaml +0 -0
  62. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/dto.convention.yaml +0 -0
  63. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/frontend.convention.yaml +0 -0
  64. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/green.convention.yaml +0 -0
  65. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/presentation.convention.yaml +0 -0
  66. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/refactor.convention.yaml +0 -0
  67. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/technology.convention.yaml +0 -0
  68. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/tests/__init__.py +0 -0
  69. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/tests/test_adapter_recipe.py +0 -0
  70. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/tests/test_complexity_recipe.py +0 -0
  71. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/tests/test_component_taxonomy.py +0 -0
  72. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/tests/test_component_urn_naming.py +0 -0
  73. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/tests/test_thinness_recipe.py +0 -0
  74. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/thinness.recipe.yaml +0 -0
  75. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/train.convention.yaml +0 -0
  76. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/conventions/verification.protocol.yaml +0 -0
  77. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/schemas/design_system.schema.json +0 -0
  78. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/__init__.py +0 -0
  79. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_commons_structure.py +0 -0
  80. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_complexity.py +0 -0
  81. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_cross_language_consistency.py +0 -0
  82. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_design_system_compliance.py +0 -0
  83. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_dto_testing_patterns.py +0 -0
  84. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_green_cross_stack_layers.py +0 -0
  85. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_green_layer_dependencies.py +0 -0
  86. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_green_python_layer_structure.py +0 -0
  87. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_green_supabase_layer_structure.py +0 -0
  88. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_import_boundaries.py +0 -0
  89. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_init_file_urns.py +0 -0
  90. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_preact_layer_boundaries.py +0 -0
  91. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_presentation_convention.py +0 -0
  92. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_python_architecture.py +0 -0
  93. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_quality_metrics.py +0 -0
  94. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_station_master_pattern.py +0 -0
  95. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_train_infrastructure.py +0 -0
  96. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_train_urns.py +0 -0
  97. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_typescript_architecture.py +0 -0
  98. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_usecase_structure.py +0 -0
  99. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/coder/validators/test_wagon_boundaries.py +0 -0
  100. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/conftest.py +0 -0
  101. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/__init__.py +0 -0
  102. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/conventions/acceptance.convention.yaml +0 -0
  103. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/conventions/appendix.convention.yaml +0 -0
  104. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/conventions/artifact-naming.convention.yaml +0 -0
  105. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/conventions/component.convention.yaml +0 -0
  106. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/conventions/criteria.convention.yaml +0 -0
  107. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/conventions/feature.convention.yaml +0 -0
  108. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/conventions/interface.convention.yaml +0 -0
  109. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/conventions/steps.convention.yaml +0 -0
  110. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/conventions/train.convention.yaml +0 -0
  111. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/conventions/wagon.convention.yaml +0 -0
  112. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/conventions/wmbt.convention.yaml +0 -0
  113. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/schemas/acceptance.schema.json +0 -0
  114. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/schemas/appendix.schema.json +0 -0
  115. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/schemas/component.schema.json +0 -0
  116. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/schemas/feature.schema.json +0 -0
  117. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/schemas/train.schema.json +0 -0
  118. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/schemas/wagon.schema.json +0 -0
  119. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/schemas/wmbt.schema.json +0 -0
  120. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/validators/__init__.py +0 -0
  121. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/validators/conftest.py +0 -0
  122. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/validators/test_draft_wagon_registry.py +0 -0
  123. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/validators/test_plan_uniqueness.py +0 -0
  124. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/validators/test_plan_urn_resolution.py +0 -0
  125. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/validators/test_plan_wagons.py +0 -0
  126. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/validators/test_wagon_urn_chain.py +0 -0
  127. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/validators/test_wmbt_consistency.py +0 -0
  128. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/planner/validators/test_wmbt_vocabulary.py +0 -0
  129. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/__init__.py +0 -0
  130. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/conventions/artifact.convention.yaml +0 -0
  131. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/conventions/contract.convention.yaml +0 -0
  132. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/conventions/filename.convention.yaml +0 -0
  133. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/conventions/migration.convention.yaml +0 -0
  134. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/conventions/red.convention.yaml +0 -0
  135. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/conventions/routing.convention.yaml +0 -0
  136. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/conventions/security.convention.yaml +0 -0
  137. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/conventions/telemetry.convention.yaml +0 -0
  138. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/a11y.tmpl.json +0 -0
  139. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/artifact.schema.json +0 -0
  140. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/contract.schema.json +0 -0
  141. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/contract.tmpl.json +0 -0
  142. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/db.tmpl.json +0 -0
  143. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/e2e.tmpl.json +0 -0
  144. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/edge_function.tmpl.json +0 -0
  145. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/event.tmpl.json +0 -0
  146. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/http.tmpl.json +0 -0
  147. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/job.tmpl.json +0 -0
  148. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/load.tmpl.json +0 -0
  149. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/metric.tmpl.json +0 -0
  150. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/pack.schema.json +0 -0
  151. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/realtime.tmpl.json +0 -0
  152. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/rls.tmpl.json +0 -0
  153. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/script.tmpl.json +0 -0
  154. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/sec.tmpl.json +0 -0
  155. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/storage.tmpl.json +0 -0
  156. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/telemetry.schema.json +0 -0
  157. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/telemetry_tracking_manifest.schema.json +0 -0
  158. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/test_filename.schema.json +0 -0
  159. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/test_intent.schema.json +0 -0
  160. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/unit.tmpl.json +0 -0
  161. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/visual.tmpl.json +0 -0
  162. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/schemas/ws.tmpl.json +0 -0
  163. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/utils/__init__.py +0 -0
  164. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/utils/filename.py +0 -0
  165. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/__init__.py +0 -0
  166. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/cleanup_duplicate_headers.py +0 -0
  167. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/cleanup_duplicate_headers_v2.py +0 -0
  168. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/conftest.py +0 -0
  169. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/coverage_gap_report.py +0 -0
  170. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/fix_dual_ac_references.py +0 -0
  171. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/remove_duplicate_lines.py +0 -0
  172. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_acceptance_urn_filename_mapping.py +0 -0
  173. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_acceptance_urn_separator.py +0 -0
  174. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_artifact_naming_category.py +0 -0
  175. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_contract_schema_compliance.py +0 -0
  176. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_contract_security.py +0 -0
  177. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_contracts_structure.py +0 -0
  178. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_coverage_adequacy.py +0 -0
  179. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_dual_ac_reference.py +0 -0
  180. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_fixture_validity.py +0 -0
  181. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_isolation.py +0 -0
  182. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_migration_coverage.py +0 -0
  183. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_migration_criteria.py +0 -0
  184. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_migration_generation.py +0 -0
  185. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_python_test_naming.py +0 -0
  186. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_red_layer_validation.py +0 -0
  187. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_red_python_layer_structure.py +0 -0
  188. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_red_supabase_layer_structure.py +0 -0
  189. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_telemetry_structure.py +0 -0
  190. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_typescript_test_naming.py +0 -0
  191. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/tester/validators/test_typescript_test_structure.py +0 -0
  192. {atdd-0.4.1 → atdd-0.4.3}/src/atdd/version_check.py +0 -0
  193. {atdd-0.4.1 → atdd-0.4.3}/src/atdd.egg-info/dependency_links.txt +0 -0
  194. {atdd-0.4.1 → atdd-0.4.3}/src/atdd.egg-info/entry_points.txt +0 -0
  195. {atdd-0.4.1 → atdd-0.4.3}/src/atdd.egg-info/requires.txt +0 -0
  196. {atdd-0.4.1 → atdd-0.4.3}/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.4.1
3
+ Version: 0.4.3
4
4
  Summary: ATDD Platform - Acceptance Test Driven Development toolkit
5
5
  License: MIT
6
6
  Requires-Python: >=3.10
@@ -230,6 +230,20 @@ atdd validate --coverage # With coverage report
230
230
  atdd validate --html # With HTML report
231
231
  ```
232
232
 
233
+ ### Release Versioning
234
+
235
+ ATDD enforces release versioning via coach validators. Configure the version file and tag prefix in `.atdd/config.yaml`:
236
+
237
+ ```yaml
238
+ release:
239
+ version_file: "pyproject.toml" # or package.json, VERSION, etc.
240
+ tag_prefix: "v"
241
+ ```
242
+
243
+ Validation (`atdd validate coach` or `atdd validate`) requires:
244
+ - Version file exists and contains a version
245
+ - Git tag on HEAD matches `{tag_prefix}{version}`
246
+
233
247
  ### Other Commands
234
248
 
235
249
  ```bash
@@ -216,6 +216,20 @@ atdd validate --coverage # With coverage report
216
216
  atdd validate --html # With HTML report
217
217
  ```
218
218
 
219
+ ### Release Versioning
220
+
221
+ ATDD enforces release versioning via coach validators. Configure the version file and tag prefix in `.atdd/config.yaml`:
222
+
223
+ ```yaml
224
+ release:
225
+ version_file: "pyproject.toml" # or package.json, VERSION, etc.
226
+ tag_prefix: "v"
227
+ ```
228
+
229
+ Validation (`atdd validate coach` or `atdd validate`) requires:
230
+ - Version file exists and contains a version
231
+ - Git tag on HEAD matches `{tag_prefix}{version}`
232
+
219
233
  ### Other Commands
220
234
 
221
235
  ```bash
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "atdd"
7
- version = "0.4.1"
7
+ version = "0.4.3"
8
8
  description = "ATDD Platform - Acceptance Test Driven Development toolkit"
9
9
  requires-python = ">=3.10"
10
10
  readme = "README.md"
@@ -169,6 +169,10 @@ class ProjectInitializer:
169
169
 
170
170
  config = {
171
171
  "version": "1.0",
172
+ "release": {
173
+ "version_file": "VERSION",
174
+ "tag_prefix": "v",
175
+ },
172
176
  "sync": {
173
177
  "agents": ["claude"], # Default: only Claude
174
178
  },
@@ -1555,6 +1555,6 @@ def main(repo_root: Path):
1555
1555
 
1556
1556
 
1557
1557
  if __name__ == "__main__":
1558
- from pathlib import Path
1559
- repo_root = Path(__file__).resolve().parents[4]
1558
+ from atdd.coach.utils.repo import find_repo_root
1559
+ repo_root = find_repo_root()
1560
1560
  main(repo_root)
@@ -0,0 +1,65 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://atdd.dev/schemas/config.schema.json",
4
+ "title": "ATDD Config",
5
+ "description": "Schema for .atdd/config.yaml configuration file",
6
+ "type": "object",
7
+ "properties": {
8
+ "version": {
9
+ "type": "string",
10
+ "description": "Configuration schema version",
11
+ "pattern": "^[0-9]+\\.[0-9]+$",
12
+ "examples": ["1.0"]
13
+ },
14
+ "release": {
15
+ "type": "object",
16
+ "description": "Release/versioning settings",
17
+ "properties": {
18
+ "version_file": {
19
+ "type": "string",
20
+ "description": "Path to version file (relative to repo root)",
21
+ "examples": ["pyproject.toml", "package.json", "VERSION"]
22
+ },
23
+ "tag_prefix": {
24
+ "type": "string",
25
+ "description": "Prefix for git tags",
26
+ "default": "v",
27
+ "examples": ["v", ""]
28
+ }
29
+ },
30
+ "required": ["version_file"],
31
+ "additionalProperties": false
32
+ },
33
+ "sync": {
34
+ "type": "object",
35
+ "description": "Agent config file sync settings",
36
+ "properties": {
37
+ "agents": {
38
+ "type": "array",
39
+ "description": "List of agents to sync ATDD rules to",
40
+ "items": {
41
+ "type": "string",
42
+ "enum": ["claude", "codex", "gemini", "qwen"]
43
+ },
44
+ "uniqueItems": true,
45
+ "default": ["claude"]
46
+ }
47
+ },
48
+ "additionalProperties": false
49
+ },
50
+ "toolkit": {
51
+ "type": "object",
52
+ "description": "ATDD toolkit metadata",
53
+ "properties": {
54
+ "last_version": {
55
+ "type": "string",
56
+ "description": "Last installed ATDD toolkit version"
57
+ }
58
+ },
59
+ "required": ["last_version"],
60
+ "additionalProperties": false
61
+ }
62
+ },
63
+ "required": ["version", "release"],
64
+ "additionalProperties": false
65
+ }
@@ -225,7 +225,9 @@ release:
225
225
  mandatory: true
226
226
 
227
227
  rules:
228
+ - "Version file is required (configured in .atdd/config.yaml)"
228
229
  - "Tag must match version exactly: v{version}"
230
+ - "Tag must be on HEAD"
229
231
  - "No tag without version bump"
230
232
  - "No version bump without tag"
231
233
  - "Every repo MUST have versioning"
@@ -243,10 +245,11 @@ release:
243
245
  - "Push with tags: git push origin {branch} --tags"
244
246
  - "Record in Session Log: 'Released: v{version}'"
245
247
 
246
- # Consumer repos configure version file location in .atdd/config.yaml:
248
+ # Config (required in .atdd/config.yaml):
247
249
  # release:
248
250
  # version_file: "pyproject.toml" # or package.json, VERSION, etc.
249
251
  # tag_prefix: "v"
252
+ # Validator: atdd validate coach enforces version file + tag on HEAD
250
253
 
251
254
  # Agent Coordination (Detailed in action files)
252
255
  agents:
@@ -0,0 +1,178 @@
1
+ """
2
+ Release versioning validation.
3
+
4
+ Ensures:
5
+ - .atdd/config.yaml defines release.version_file
6
+ - Version file exists and contains a version
7
+ - Git tag on HEAD matches tag_prefix + version
8
+ """
9
+
10
+ import json
11
+ import re
12
+ import subprocess
13
+ from pathlib import Path
14
+ from typing import Optional
15
+
16
+ import pytest
17
+ import yaml
18
+
19
+ from atdd.coach.utils.repo import find_repo_root
20
+
21
+
22
+ REPO_ROOT = find_repo_root()
23
+ CONFIG_FILE = REPO_ROOT / ".atdd" / "config.yaml"
24
+
25
+
26
+ def _load_config() -> dict:
27
+ if not CONFIG_FILE.exists():
28
+ pytest.skip(f"Config not found: {CONFIG_FILE}. Run 'atdd init' first.")
29
+
30
+ with open(CONFIG_FILE) as f:
31
+ return yaml.safe_load(f) or {}
32
+
33
+
34
+ def _get_release_config(config: dict) -> tuple[str, str]:
35
+ release = config.get("release")
36
+ if not isinstance(release, dict):
37
+ pytest.fail(
38
+ "Missing release config in .atdd/config.yaml. "
39
+ "Add release.version_file and release.tag_prefix."
40
+ )
41
+
42
+ version_file = release.get("version_file")
43
+ if not version_file or not isinstance(version_file, str):
44
+ pytest.fail("Missing release.version_file in .atdd/config.yaml.")
45
+
46
+ tag_prefix = release.get("tag_prefix", "v")
47
+ if tag_prefix is None:
48
+ tag_prefix = ""
49
+ if not isinstance(tag_prefix, str):
50
+ pytest.fail("release.tag_prefix must be a string.")
51
+
52
+ return version_file, tag_prefix
53
+
54
+
55
+ def _read_version_from_file(path: Path) -> str:
56
+ if not path.exists():
57
+ pytest.fail(f"Version file not found: {path}")
58
+
59
+ if path.name == "pyproject.toml":
60
+ version = _parse_pyproject_version(path)
61
+ elif path.name == "package.json":
62
+ version = _parse_package_json_version(path)
63
+ else:
64
+ version = _parse_plain_version(path)
65
+
66
+ if not version:
67
+ pytest.fail(f"Could not read version from {path}")
68
+
69
+ return version
70
+
71
+
72
+ def _parse_pyproject_version(path: Path) -> Optional[str]:
73
+ text = path.read_text()
74
+
75
+ # Try tomllib/tomli first for correctness
76
+ data = _load_toml(text)
77
+ if isinstance(data, dict):
78
+ project = data.get("project", {})
79
+ if isinstance(project, dict) and project.get("version"):
80
+ return str(project["version"]).strip()
81
+ tool = data.get("tool", {})
82
+ if isinstance(tool, dict):
83
+ poetry = tool.get("poetry", {})
84
+ if isinstance(poetry, dict) and poetry.get("version"):
85
+ return str(poetry["version"]).strip()
86
+
87
+ # Fallback to lightweight parsing
88
+ return _parse_pyproject_version_text(text)
89
+
90
+
91
+ def _load_toml(text: str) -> Optional[dict]:
92
+ try:
93
+ import tomllib # type: ignore[attr-defined]
94
+ return tomllib.loads(text)
95
+ except Exception:
96
+ try:
97
+ import tomli # type: ignore
98
+ return tomli.loads(text)
99
+ except Exception:
100
+ return None
101
+
102
+
103
+ def _parse_pyproject_version_text(text: str) -> Optional[str]:
104
+ current_section = None
105
+ for line in text.splitlines():
106
+ stripped = line.strip()
107
+ if not stripped or stripped.startswith("#"):
108
+ continue
109
+ if stripped.startswith("[") and stripped.endswith("]"):
110
+ current_section = stripped.strip("[]").strip()
111
+ continue
112
+ if current_section in {"project", "tool.poetry"}:
113
+ match = re.match(r'version\s*=\s*["\']([^"\']+)["\']', stripped)
114
+ if match:
115
+ return match.group(1).strip()
116
+ return None
117
+
118
+
119
+ def _parse_package_json_version(path: Path) -> Optional[str]:
120
+ try:
121
+ data = json.loads(path.read_text())
122
+ except json.JSONDecodeError:
123
+ return None
124
+
125
+ version = data.get("version")
126
+ return str(version).strip() if version else None
127
+
128
+
129
+ def _parse_plain_version(path: Path) -> Optional[str]:
130
+ for line in path.read_text().splitlines():
131
+ stripped = line.strip()
132
+ if not stripped or stripped.startswith("#"):
133
+ continue
134
+ return stripped
135
+ return None
136
+
137
+
138
+ def _git_tags_on_head(repo_root: Path) -> list[str]:
139
+ result = subprocess.run(
140
+ ["git", "tag", "--points-at", "HEAD"],
141
+ cwd=str(repo_root),
142
+ capture_output=True,
143
+ text=True,
144
+ )
145
+ if result.returncode != 0:
146
+ stderr = result.stderr.strip() or "git tag --points-at HEAD failed"
147
+ pytest.fail(stderr)
148
+
149
+ tags = [line.strip() for line in result.stdout.splitlines() if line.strip()]
150
+ return tags
151
+
152
+
153
+ def test_release_version_file_and_tag_on_head():
154
+ """
155
+ SPEC-RELEASE-0001: Version file exists and tag on HEAD matches version.
156
+ """
157
+ config = _load_config()
158
+ version_file, tag_prefix = _get_release_config(config)
159
+
160
+ version_path = Path(version_file)
161
+ if not version_path.is_absolute():
162
+ version_path = (REPO_ROOT / version_path).resolve()
163
+
164
+ version = _read_version_from_file(version_path)
165
+ expected_tag = f"{tag_prefix}{version}"
166
+
167
+ tags = _git_tags_on_head(REPO_ROOT)
168
+ if not tags:
169
+ pytest.fail(
170
+ "No git tag found on HEAD. "
171
+ f"Create tag: git tag {expected_tag}"
172
+ )
173
+
174
+ if expected_tag not in tags:
175
+ found = ", ".join(tags) if tags else "none"
176
+ pytest.fail(
177
+ f"Expected tag '{expected_tag}' on HEAD, found: {found}"
178
+ )
@@ -5,8 +5,11 @@ Validates that cross-references between wagons, trains, and artifacts are cohere
5
5
  Tests ensure that consume references point to valid produce artifacts.
6
6
  """
7
7
  import pytest
8
+ from pathlib import Path
8
9
  from typing import Dict, Set, List, Tuple, Any
9
10
 
11
+ from atdd.coach.utils.repo import find_repo_root
12
+
10
13
 
11
14
  @pytest.mark.platform
12
15
  @pytest.mark.e2e
@@ -117,8 +120,7 @@ def test_trains_reference_valid_wagons(trains_registry, wagon_manifests):
117
120
  # Load individual train file if path exists
118
121
  if train_path:
119
122
  import yaml
120
- from pathlib import Path
121
- train_file = Path(__file__).resolve().parents[4] / train_path
123
+ train_file = find_repo_root() / train_path
122
124
 
123
125
  if train_file.exists():
124
126
  with open(train_file) as f:
@@ -13,6 +13,8 @@ import yaml
13
13
  from pathlib import Path
14
14
  from typing import Dict, List, Set, Tuple
15
15
 
16
+ from atdd.coach.utils.repo import find_repo_root
17
+
16
18
 
17
19
  @pytest.mark.platform
18
20
  def test_train_ids_follow_numbering_convention(trains_registry):
@@ -91,7 +93,7 @@ def test_train_files_exist_for_registry_entries(trains_registry):
91
93
  When: Checking for train files
92
94
  Then: Each train has a file at plan/_trains/{train_id}.yaml
93
95
  """
94
- repo_root = Path(__file__).resolve().parents[4]
96
+ repo_root = find_repo_root()
95
97
  trains_dir = repo_root / "plan" / "_trains"
96
98
 
97
99
  missing_files = []
@@ -121,7 +123,7 @@ def test_all_train_files_registered(trains_registry):
121
123
  When: Checking registry
122
124
  Then: Each file is registered in plan/_trains.yaml
123
125
  """
124
- repo_root = Path(__file__).resolve().parents[4]
126
+ repo_root = find_repo_root()
125
127
  trains_dir = repo_root / "plan" / "_trains"
126
128
 
127
129
  # Get all registered train IDs
@@ -153,7 +155,7 @@ def test_train_id_matches_filename(trains_registry):
153
155
  When: Loading train data
154
156
  Then: train_id field matches filename (without .yaml)
155
157
  """
156
- repo_root = Path(__file__).resolve().parents[4]
158
+ repo_root = find_repo_root()
157
159
  trains_dir = repo_root / "plan" / "_trains"
158
160
 
159
161
  mismatches = []
@@ -183,7 +185,7 @@ def test_train_wagons_exist(trains_registry, wagon_manifests):
183
185
  When: Checking wagon references
184
186
  Then: Each wagon exists in registry or has a manifest in plan/*
185
187
  """
186
- repo_root = Path(__file__).resolve().parents[4]
188
+ repo_root = find_repo_root()
187
189
  trains_dir = repo_root / "plan" / "_trains"
188
190
 
189
191
  # Build wagon name set from manifests
@@ -231,7 +233,7 @@ def test_train_dependencies_are_valid(trains_registry):
231
233
  When: Checking dependency references
232
234
  Then: Each dependency points to a valid train_id
233
235
  """
234
- repo_root = Path(__file__).resolve().parents[4]
236
+ repo_root = find_repo_root()
235
237
  trains_dir = repo_root / "plan" / "_trains"
236
238
 
237
239
  # Get all valid train IDs
@@ -287,7 +289,7 @@ def test_train_artifacts_follow_naming_convention(trains_registry):
287
289
  """
288
290
  import re
289
291
 
290
- repo_root = Path(__file__).resolve().parents[4]
292
+ repo_root = find_repo_root()
291
293
  trains_dir = repo_root / "plan" / "_trains"
292
294
 
293
295
  pattern = re.compile(r"^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)+(?:\.[a-z][a-z0-9-]*)*$")
@@ -355,7 +357,7 @@ def test_train_artifacts_exist_in_wagons(trains_registry, wagon_manifests):
355
357
  Then: Each artifact should be in wagon produce/consume lists
356
358
  Note: Soft check - external/system artifacts are allowed
357
359
  """
358
- repo_root = Path(__file__).resolve().parents[4]
360
+ repo_root = find_repo_root()
359
361
  trains_dir = repo_root / "plan" / "_trains"
360
362
 
361
363
  # Build artifact index from wagons
@@ -488,7 +490,7 @@ def test_trains_match_schema(trains_registry):
488
490
  from jsonschema import Draft7Validator
489
491
  import json
490
492
 
491
- repo_root = Path(__file__).resolve().parents[4]
493
+ repo_root = find_repo_root()
492
494
  schema_path = repo_root / ".claude" / "schemas" / "planner" / "train.schema.json"
493
495
  trains_dir = repo_root / "plan" / "_trains"
494
496
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atdd
3
- Version: 0.4.1
3
+ Version: 0.4.3
4
4
  Summary: ATDD Platform - Acceptance Test Driven Development toolkit
5
5
  License: MIT
6
6
  Requires-Python: >=3.10
@@ -230,6 +230,20 @@ atdd validate --coverage # With coverage report
230
230
  atdd validate --html # With HTML report
231
231
  ```
232
232
 
233
+ ### Release Versioning
234
+
235
+ ATDD enforces release versioning via coach validators. Configure the version file and tag prefix in `.atdd/config.yaml`:
236
+
237
+ ```yaml
238
+ release:
239
+ version_file: "pyproject.toml" # or package.json, VERSION, etc.
240
+ tag_prefix: "v"
241
+ ```
242
+
243
+ Validation (`atdd validate coach` or `atdd validate`) requires:
244
+ - Version file exists and contains a version
245
+ - Git tag on HEAD matches `{tag_prefix}{version}`
246
+
233
247
  ### Other Commands
234
248
 
235
249
  ```bash
@@ -46,6 +46,7 @@ src/atdd/coach/validators/__init__.py
46
46
  src/atdd/coach/validators/shared_fixtures.py
47
47
  src/atdd/coach/validators/test_enrich_wagon_registry.py
48
48
  src/atdd/coach/validators/test_registry.py
49
+ src/atdd/coach/validators/test_release_versioning.py
49
50
  src/atdd/coach/validators/test_session_validation.py
50
51
  src/atdd/coach/validators/test_traceability.py
51
52
  src/atdd/coach/validators/test_update_feature_paths.py
@@ -1,34 +0,0 @@
1
- {
2
- "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://atdd.dev/schemas/config.schema.json",
4
- "title": "ATDD Config",
5
- "description": "Schema for .atdd/config.yaml configuration file",
6
- "type": "object",
7
- "properties": {
8
- "version": {
9
- "type": "string",
10
- "description": "Configuration schema version",
11
- "pattern": "^[0-9]+\\.[0-9]+$",
12
- "examples": ["1.0"]
13
- },
14
- "sync": {
15
- "type": "object",
16
- "description": "Agent config file sync settings",
17
- "properties": {
18
- "agents": {
19
- "type": "array",
20
- "description": "List of agents to sync ATDD rules to",
21
- "items": {
22
- "type": "string",
23
- "enum": ["claude", "codex", "gemini", "qwen"]
24
- },
25
- "uniqueItems": true,
26
- "default": ["claude"]
27
- }
28
- },
29
- "additionalProperties": false
30
- }
31
- },
32
- "required": ["version"],
33
- "additionalProperties": false
34
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes