atdd 0.4.1__tar.gz → 0.4.7__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 (203) hide show
  1. {atdd-0.4.1/src/atdd.egg-info → atdd-0.4.7}/PKG-INFO +25 -3
  2. {atdd-0.4.1 → atdd-0.4.7}/README.md +24 -2
  3. {atdd-0.4.1 → atdd-0.4.7}/pyproject.toml +1 -1
  4. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/cli.py +71 -12
  5. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/initializer.py +4 -0
  6. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/inventory.py +91 -3
  7. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/registry.py +477 -204
  8. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/sync.py +35 -8
  9. atdd-0.4.7/src/atdd/coach/schemas/config.schema.json +65 -0
  10. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/templates/ATDD.md +4 -1
  11. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/templates/SESSION-TEMPLATE.md +1 -1
  12. atdd-0.4.7/src/atdd/coach/utils/config.py +131 -0
  13. atdd-0.4.7/src/atdd/coach/utils/train_spec_phase.py +97 -0
  14. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/shared_fixtures.py +68 -1
  15. atdd-0.4.7/src/atdd/coach/validators/test_release_versioning.py +190 -0
  16. atdd-0.4.7/src/atdd/coach/validators/test_train_registry.py +189 -0
  17. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_train_infrastructure.py +236 -2
  18. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/schemas/train.schema.json +125 -2
  19. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_plan_cross_refs.py +4 -2
  20. atdd-0.4.7/src/atdd/planner/validators/test_train_validation.py +1181 -0
  21. atdd-0.4.7/src/atdd/tester/validators/test_train_backend_e2e.py +371 -0
  22. atdd-0.4.7/src/atdd/tester/validators/test_train_frontend_e2e.py +292 -0
  23. atdd-0.4.7/src/atdd/tester/validators/test_train_frontend_python.py +282 -0
  24. {atdd-0.4.1 → atdd-0.4.7/src/atdd.egg-info}/PKG-INFO +25 -3
  25. {atdd-0.4.1 → atdd-0.4.7}/src/atdd.egg-info/SOURCES.txt +7 -0
  26. atdd-0.4.1/src/atdd/coach/schemas/config.schema.json +0 -34
  27. atdd-0.4.1/src/atdd/planner/validators/test_train_validation.py +0 -514
  28. {atdd-0.4.1 → atdd-0.4.7}/LICENSE +0 -0
  29. {atdd-0.4.1 → atdd-0.4.7}/setup.cfg +0 -0
  30. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/__init__.py +0 -0
  31. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/__main__.py +0 -0
  32. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/__init__.py +0 -0
  33. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/__init__.py +0 -0
  34. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/add_persistence_metadata.py +0 -0
  35. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/analyze_migrations.py +0 -0
  36. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/consumers.py +0 -0
  37. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/gate.py +0 -0
  38. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/infer_governance_status.py +0 -0
  39. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/interface.py +0 -0
  40. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/migration.py +0 -0
  41. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/session.py +0 -0
  42. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/test_interface.py +0 -0
  43. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/test_runner.py +0 -0
  44. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/tests/__init__.py +0 -0
  45. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/tests/test_telemetry_array_validation.py +0 -0
  46. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/traceability.py +0 -0
  47. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/conventions/session.convention.yaml +0 -0
  48. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/overlays/__init__.py +0 -0
  49. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/overlays/claude.md +0 -0
  50. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/schemas/manifest.schema.json +0 -0
  51. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/utils/__init__.py +0 -0
  52. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/utils/graph/__init__.py +0 -0
  53. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/utils/graph/urn.py +0 -0
  54. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/utils/repo.py +0 -0
  55. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/__init__.py +0 -0
  56. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/test_enrich_wagon_registry.py +0 -0
  57. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/test_registry.py +0 -0
  58. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/test_session_validation.py +0 -0
  59. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/test_traceability.py +0 -0
  60. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/test_update_feature_paths.py +0 -0
  61. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/test_validate_contract_consumers.py +0 -0
  62. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/__init__.py +0 -0
  63. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/adapter.recipe.yaml +0 -0
  64. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/backend.convention.yaml +0 -0
  65. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/boundaries.convention.yaml +0 -0
  66. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/commons.convention.yaml +0 -0
  67. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/complexity.recipe.yaml +0 -0
  68. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/component-naming.convention.yaml +0 -0
  69. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/design.convention.yaml +0 -0
  70. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/design.recipe.yaml +0 -0
  71. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/dto.convention.yaml +0 -0
  72. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/frontend.convention.yaml +0 -0
  73. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/green.convention.yaml +0 -0
  74. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/presentation.convention.yaml +0 -0
  75. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/refactor.convention.yaml +0 -0
  76. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/technology.convention.yaml +0 -0
  77. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/tests/__init__.py +0 -0
  78. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/tests/test_adapter_recipe.py +0 -0
  79. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/tests/test_complexity_recipe.py +0 -0
  80. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/tests/test_component_taxonomy.py +0 -0
  81. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/tests/test_component_urn_naming.py +0 -0
  82. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/tests/test_thinness_recipe.py +0 -0
  83. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/thinness.recipe.yaml +0 -0
  84. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/train.convention.yaml +0 -0
  85. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/verification.protocol.yaml +0 -0
  86. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/schemas/design_system.schema.json +0 -0
  87. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/__init__.py +0 -0
  88. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_commons_structure.py +0 -0
  89. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_complexity.py +0 -0
  90. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_cross_language_consistency.py +0 -0
  91. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_design_system_compliance.py +0 -0
  92. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_dto_testing_patterns.py +0 -0
  93. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_green_cross_stack_layers.py +0 -0
  94. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_green_layer_dependencies.py +0 -0
  95. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_green_python_layer_structure.py +0 -0
  96. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_green_supabase_layer_structure.py +0 -0
  97. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_import_boundaries.py +0 -0
  98. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_init_file_urns.py +0 -0
  99. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_preact_layer_boundaries.py +0 -0
  100. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_presentation_convention.py +0 -0
  101. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_python_architecture.py +0 -0
  102. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_quality_metrics.py +0 -0
  103. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_station_master_pattern.py +0 -0
  104. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_train_urns.py +0 -0
  105. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_typescript_architecture.py +0 -0
  106. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_usecase_structure.py +0 -0
  107. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_wagon_boundaries.py +0 -0
  108. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/conftest.py +0 -0
  109. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/__init__.py +0 -0
  110. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/acceptance.convention.yaml +0 -0
  111. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/appendix.convention.yaml +0 -0
  112. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/artifact-naming.convention.yaml +0 -0
  113. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/component.convention.yaml +0 -0
  114. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/criteria.convention.yaml +0 -0
  115. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/feature.convention.yaml +0 -0
  116. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/interface.convention.yaml +0 -0
  117. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/steps.convention.yaml +0 -0
  118. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/train.convention.yaml +0 -0
  119. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/wagon.convention.yaml +0 -0
  120. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/wmbt.convention.yaml +0 -0
  121. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/schemas/acceptance.schema.json +0 -0
  122. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/schemas/appendix.schema.json +0 -0
  123. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/schemas/component.schema.json +0 -0
  124. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/schemas/feature.schema.json +0 -0
  125. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/schemas/wagon.schema.json +0 -0
  126. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/schemas/wmbt.schema.json +0 -0
  127. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/__init__.py +0 -0
  128. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/conftest.py +0 -0
  129. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_draft_wagon_registry.py +0 -0
  130. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_plan_uniqueness.py +0 -0
  131. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_plan_urn_resolution.py +0 -0
  132. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_plan_wagons.py +0 -0
  133. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_wagon_urn_chain.py +0 -0
  134. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_wmbt_consistency.py +0 -0
  135. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_wmbt_vocabulary.py +0 -0
  136. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/__init__.py +0 -0
  137. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/artifact.convention.yaml +0 -0
  138. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/contract.convention.yaml +0 -0
  139. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/filename.convention.yaml +0 -0
  140. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/migration.convention.yaml +0 -0
  141. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/red.convention.yaml +0 -0
  142. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/routing.convention.yaml +0 -0
  143. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/security.convention.yaml +0 -0
  144. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/telemetry.convention.yaml +0 -0
  145. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/a11y.tmpl.json +0 -0
  146. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/artifact.schema.json +0 -0
  147. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/contract.schema.json +0 -0
  148. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/contract.tmpl.json +0 -0
  149. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/db.tmpl.json +0 -0
  150. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/e2e.tmpl.json +0 -0
  151. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/edge_function.tmpl.json +0 -0
  152. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/event.tmpl.json +0 -0
  153. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/http.tmpl.json +0 -0
  154. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/job.tmpl.json +0 -0
  155. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/load.tmpl.json +0 -0
  156. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/metric.tmpl.json +0 -0
  157. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/pack.schema.json +0 -0
  158. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/realtime.tmpl.json +0 -0
  159. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/rls.tmpl.json +0 -0
  160. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/script.tmpl.json +0 -0
  161. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/sec.tmpl.json +0 -0
  162. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/storage.tmpl.json +0 -0
  163. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/telemetry.schema.json +0 -0
  164. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/telemetry_tracking_manifest.schema.json +0 -0
  165. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/test_filename.schema.json +0 -0
  166. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/test_intent.schema.json +0 -0
  167. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/unit.tmpl.json +0 -0
  168. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/visual.tmpl.json +0 -0
  169. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/ws.tmpl.json +0 -0
  170. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/utils/__init__.py +0 -0
  171. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/utils/filename.py +0 -0
  172. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/__init__.py +0 -0
  173. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/cleanup_duplicate_headers.py +0 -0
  174. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/cleanup_duplicate_headers_v2.py +0 -0
  175. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/conftest.py +0 -0
  176. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/coverage_gap_report.py +0 -0
  177. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/fix_dual_ac_references.py +0 -0
  178. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/remove_duplicate_lines.py +0 -0
  179. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_acceptance_urn_filename_mapping.py +0 -0
  180. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_acceptance_urn_separator.py +0 -0
  181. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_artifact_naming_category.py +0 -0
  182. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_contract_schema_compliance.py +0 -0
  183. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_contract_security.py +0 -0
  184. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_contracts_structure.py +0 -0
  185. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_coverage_adequacy.py +0 -0
  186. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_dual_ac_reference.py +0 -0
  187. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_fixture_validity.py +0 -0
  188. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_isolation.py +0 -0
  189. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_migration_coverage.py +0 -0
  190. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_migration_criteria.py +0 -0
  191. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_migration_generation.py +0 -0
  192. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_python_test_naming.py +0 -0
  193. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_red_layer_validation.py +0 -0
  194. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_red_python_layer_structure.py +0 -0
  195. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_red_supabase_layer_structure.py +0 -0
  196. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_telemetry_structure.py +0 -0
  197. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_typescript_test_naming.py +0 -0
  198. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_typescript_test_structure.py +0 -0
  199. {atdd-0.4.1 → atdd-0.4.7}/src/atdd/version_check.py +0 -0
  200. {atdd-0.4.1 → atdd-0.4.7}/src/atdd.egg-info/dependency_links.txt +0 -0
  201. {atdd-0.4.1 → atdd-0.4.7}/src/atdd.egg-info/entry_points.txt +0 -0
  202. {atdd-0.4.1 → atdd-0.4.7}/src/atdd.egg-info/requires.txt +0 -0
  203. {atdd-0.4.1 → atdd-0.4.7}/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.7
4
4
  Summary: ATDD Platform - Acceptance Test Driven Development toolkit
5
5
  License: MIT
6
6
  Requires-Python: >=3.10
@@ -58,14 +58,20 @@ atdd --help
58
58
  ```bash
59
59
  atdd init # Initialize ATDD in your project
60
60
  atdd gate # ⚠️ START EVERY SESSION WITH THIS
61
- atdd session new <capability> # Create a planning session
61
+ atdd session new <task> # Create a planning session
62
62
  atdd sync # Sync rules to agent config files
63
63
  atdd validate # Run all validators
64
64
  ```
65
65
 
66
66
  > **⚠️ `atdd gate` is required.**
67
67
  > 🤖 Tell your agent: "Run `atdd gate` and follow ATDD rigorously."
68
- > Agents skip instruction files but can't ignore tool output. No gate = no ATDD guarantees.
68
+ > Agents skip instruction files but can't ignore tool ou
69
+
70
+
71
+
72
+
73
+
74
+ tput. No gate = no ATDD guarantees.
69
75
 
70
76
  ## What It Does
71
77
 
@@ -230,6 +236,22 @@ atdd validate --coverage # With coverage report
230
236
  atdd validate --html # With HTML report
231
237
  ```
232
238
 
239
+ ### Release Versioning
240
+
241
+ ATDD enforces release versioning via coach validators. Recommended: keep a single root `VERSION` file as the canonical source (first line like `1.2.3 - short summary`; trailing summary is ignored). Configure the version file and tag prefix in `.atdd/config.yaml`:
242
+
243
+ ```yaml
244
+ release:
245
+ version_file: "VERSION" # recommended single source of truth
246
+ tag_prefix: "v"
247
+ ```
248
+
249
+ If you also publish with language-specific manifests (e.g., `pyproject.toml`, `package.json`), keep their version fields in sync with `VERSION`.
250
+
251
+ Validation (`atdd validate coach` or `atdd validate`) requires:
252
+ - Version file exists and contains a version
253
+ - Git tag on HEAD matches `{tag_prefix}{version}`
254
+
233
255
  ### Other Commands
234
256
 
235
257
  ```bash
@@ -44,14 +44,20 @@ atdd --help
44
44
  ```bash
45
45
  atdd init # Initialize ATDD in your project
46
46
  atdd gate # ⚠️ START EVERY SESSION WITH THIS
47
- atdd session new <capability> # Create a planning session
47
+ atdd session new <task> # Create a planning session
48
48
  atdd sync # Sync rules to agent config files
49
49
  atdd validate # Run all validators
50
50
  ```
51
51
 
52
52
  > **⚠️ `atdd gate` is required.**
53
53
  > 🤖 Tell your agent: "Run `atdd gate` and follow ATDD rigorously."
54
- > Agents skip instruction files but can't ignore tool output. No gate = no ATDD guarantees.
54
+ > Agents skip instruction files but can't ignore tool ou
55
+
56
+
57
+
58
+
59
+
60
+ tput. No gate = no ATDD guarantees.
55
61
 
56
62
  ## What It Does
57
63
 
@@ -216,6 +222,22 @@ atdd validate --coverage # With coverage report
216
222
  atdd validate --html # With HTML report
217
223
  ```
218
224
 
225
+ ### Release Versioning
226
+
227
+ ATDD enforces release versioning via coach validators. Recommended: keep a single root `VERSION` file as the canonical source (first line like `1.2.3 - short summary`; trailing summary is ignored). Configure the version file and tag prefix in `.atdd/config.yaml`:
228
+
229
+ ```yaml
230
+ release:
231
+ version_file: "VERSION" # recommended single source of truth
232
+ tag_prefix: "v"
233
+ ```
234
+
235
+ If you also publish with language-specific manifests (e.g., `pyproject.toml`, `package.json`), keep their version fields in sync with `VERSION`.
236
+
237
+ Validation (`atdd validate coach` or `atdd validate`) requires:
238
+ - Version file exists and contains a version
239
+ - Git tag on HEAD matches `{tag_prefix}{version}`
240
+
219
241
  ### Other Commands
220
242
 
221
243
  ```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.7"
8
8
  description = "ATDD Platform - Acceptance Test Driven Development toolkit"
9
9
  requires-python = ">=3.10"
10
10
  readme = "README.md"
@@ -110,16 +110,60 @@ class ATDDCoach:
110
110
  parallel=True
111
111
  )
112
112
 
113
- def update_registries(self, registry_type: str = "all") -> int:
114
- """Update registries from source files."""
115
- if registry_type == "wagons":
116
- self.registry_updater.update_wagon_registry()
117
- elif registry_type == "contracts":
118
- self.registry_updater.update_contract_registry()
119
- elif registry_type == "telemetry":
120
- self.registry_updater.update_telemetry_registry()
121
- else: # all
122
- self.registry_updater.update_all()
113
+ def update_registries(
114
+ self,
115
+ registry_type: str = "all",
116
+ apply: bool = False,
117
+ check: bool = False
118
+ ) -> int:
119
+ """Update registries from source files.
120
+
121
+ Args:
122
+ registry_type: Which registry to update (all, wagons, trains, contracts, etc.)
123
+ apply: If True, apply changes without prompting (CI mode)
124
+ check: If True, only check for drift without applying (exit 1 if drift)
125
+
126
+ Returns:
127
+ 0 on success, 1 if --check and drift detected
128
+ """
129
+ # Convert flags to mode string
130
+ if check:
131
+ mode = "check"
132
+ elif apply:
133
+ mode = "apply"
134
+ else:
135
+ mode = "interactive"
136
+
137
+ # Registry type handlers
138
+ handlers = {
139
+ "wagons": self.registry_updater.update_wagon_registry,
140
+ "trains": self.registry_updater.build_trains,
141
+ "contracts": self.registry_updater.update_contract_registry,
142
+ "telemetry": self.registry_updater.update_telemetry_registry,
143
+ "tester": self.registry_updater.build_tester,
144
+ "coder": self.registry_updater.build_coder,
145
+ "supabase": self.registry_updater.build_supabase,
146
+ }
147
+
148
+ if registry_type == "all":
149
+ result = self.registry_updater.build_all(mode=mode)
150
+ # In check mode, return 1 if any registry has changes
151
+ if check:
152
+ has_changes = any(
153
+ r.get("has_changes", False) or r.get("new", 0) > 0 or len(r.get("changes", [])) > 0
154
+ for r in result.values()
155
+ )
156
+ return 1 if has_changes else 0
157
+ elif registry_type in handlers:
158
+ result = handlers[registry_type](mode=mode)
159
+ # In check mode, return 1 if this registry has changes
160
+ if check:
161
+ has_changes = result.get("has_changes", False) or result.get("new", 0) > 0 or len(result.get("changes", [])) > 0
162
+ return 1 if has_changes else 0
163
+ else:
164
+ print(f"Unknown registry type: {registry_type}")
165
+ return 1
166
+
123
167
  return 0
124
168
 
125
169
  def show_status(self) -> int:
@@ -285,9 +329,20 @@ Phase descriptions:
285
329
  nargs="?",
286
330
  type=str,
287
331
  default="all",
288
- choices=["all", "wagons", "contracts", "telemetry"],
332
+ choices=["all", "wagons", "trains", "contracts", "telemetry", "tester", "coder", "supabase"],
289
333
  help="Registry type to update (default: all)"
290
334
  )
335
+ registry_update_parser.add_argument(
336
+ "--yes", "--apply",
337
+ action="store_true",
338
+ dest="apply",
339
+ help="Apply changes without prompting (for CI/automation)"
340
+ )
341
+ registry_update_parser.add_argument(
342
+ "--check",
343
+ action="store_true",
344
+ help="Check for drift without applying (exit 1 if changes detected)"
345
+ )
291
346
 
292
347
  # ----- atdd init -----
293
348
  init_parser = subparsers.add_parser(
@@ -497,7 +552,11 @@ Phase descriptions:
497
552
  coach = ATDDCoach(repo_root=repo_path)
498
553
 
499
554
  if args.registry_command == "update":
500
- return coach.update_registries(registry_type=args.type)
555
+ return coach.update_registries(
556
+ registry_type=args.type,
557
+ apply=args.apply,
558
+ check=args.check
559
+ )
501
560
  else:
502
561
  registry_parser.print_help()
503
562
  return 0
@@ -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
  },
@@ -75,11 +75,32 @@ class RepositoryInventory:
75
75
  }
76
76
 
77
77
  def scan_trains(self) -> Dict[str, Any]:
78
- """Scan plan/ for train manifests (aggregations of wagons)."""
78
+ """
79
+ Scan plan/ for train manifests (aggregations of wagons).
80
+
81
+ Train First-Class Spec v0.6 Section 14: Gap Reporting
82
+ Reports missing test/code for each platform (backend/frontend/frontend_python).
83
+ """
79
84
  plan_dir = self.repo_root / "plan"
80
85
 
81
86
  if not plan_dir.exists():
82
- return {"total": 0, "trains": []}
87
+ return {
88
+ "total": 0,
89
+ "trains": [],
90
+ "by_theme": {},
91
+ "train_ids": [],
92
+ "detail_files": 0,
93
+ "missing_test_backend": [],
94
+ "missing_test_frontend": [],
95
+ "missing_test_frontend_python": [],
96
+ "missing_code_backend": [],
97
+ "missing_code_frontend": [],
98
+ "missing_code_frontend_python": [],
99
+ "gaps": {
100
+ "test": {"backend": 0, "frontend": 0, "frontend_python": 0},
101
+ "code": {"backend": 0, "frontend": 0, "frontend_python": 0}
102
+ }
103
+ }
83
104
 
84
105
  # Load trains registry
85
106
  trains_file = plan_dir / "_trains.yaml"
@@ -103,6 +124,14 @@ class RepositoryInventory:
103
124
  by_theme = defaultdict(int)
104
125
  train_ids = []
105
126
 
127
+ # Gap tracking (Section 14)
128
+ missing_test_backend = []
129
+ missing_test_frontend = []
130
+ missing_test_frontend_python = []
131
+ missing_code_backend = []
132
+ missing_code_frontend = []
133
+ missing_code_frontend_python = []
134
+
106
135
  for train in all_trains:
107
136
  train_id = train.get("train_id", "unknown")
108
137
  train_ids.append(train_id)
@@ -118,6 +147,46 @@ class RepositoryInventory:
118
147
  theme = theme_map.get(theme_digit, "unknown")
119
148
  by_theme[theme] += 1
120
149
 
150
+ # Gap analysis
151
+ expectations = train.get("expectations", {})
152
+ test_fields = train.get("test", {})
153
+ code_fields = train.get("code", {})
154
+
155
+ # Normalize test/code to dict form
156
+ if isinstance(test_fields, str):
157
+ test_fields = {"backend": [test_fields]}
158
+ elif isinstance(test_fields, list):
159
+ test_fields = {"backend": test_fields}
160
+
161
+ if isinstance(code_fields, str):
162
+ code_fields = {"backend": [code_fields]}
163
+ elif isinstance(code_fields, list):
164
+ code_fields = {"backend": code_fields}
165
+
166
+ # Check backend gaps (default expectation is True for backend)
167
+ expects_backend = expectations.get("backend", True)
168
+ if expects_backend:
169
+ if not test_fields.get("backend"):
170
+ missing_test_backend.append(train_id)
171
+ if not code_fields.get("backend"):
172
+ missing_code_backend.append(train_id)
173
+
174
+ # Check frontend gaps
175
+ expects_frontend = expectations.get("frontend", False)
176
+ if expects_frontend:
177
+ if not test_fields.get("frontend"):
178
+ missing_test_frontend.append(train_id)
179
+ if not code_fields.get("frontend"):
180
+ missing_code_frontend.append(train_id)
181
+
182
+ # Check frontend_python gaps
183
+ expects_frontend_python = expectations.get("frontend_python", False)
184
+ if expects_frontend_python:
185
+ if not test_fields.get("frontend_python"):
186
+ missing_test_frontend_python.append(train_id)
187
+ if not code_fields.get("frontend_python"):
188
+ missing_code_frontend_python.append(train_id)
189
+
121
190
  # Find train detail files
122
191
  train_detail_files = list((plan_dir / "_trains").glob("*.yaml")) if (plan_dir / "_trains").exists() else []
123
192
 
@@ -125,7 +194,26 @@ class RepositoryInventory:
125
194
  "total": len(all_trains),
126
195
  "by_theme": dict(by_theme),
127
196
  "train_ids": train_ids,
128
- "detail_files": len(train_detail_files)
197
+ "detail_files": len(train_detail_files),
198
+ # Gap reporting (Section 14)
199
+ "missing_test_backend": missing_test_backend,
200
+ "missing_test_frontend": missing_test_frontend,
201
+ "missing_test_frontend_python": missing_test_frontend_python,
202
+ "missing_code_backend": missing_code_backend,
203
+ "missing_code_frontend": missing_code_frontend,
204
+ "missing_code_frontend_python": missing_code_frontend_python,
205
+ "gaps": {
206
+ "test": {
207
+ "backend": len(missing_test_backend),
208
+ "frontend": len(missing_test_frontend),
209
+ "frontend_python": len(missing_test_frontend_python)
210
+ },
211
+ "code": {
212
+ "backend": len(missing_code_backend),
213
+ "frontend": len(missing_code_frontend),
214
+ "frontend_python": len(missing_code_frontend_python)
215
+ }
216
+ }
129
217
  }
130
218
 
131
219
  def scan_wagons(self) -> Dict[str, Any]: