atdd 0.4.2__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.
- {atdd-0.4.2/src/atdd.egg-info → atdd-0.4.3}/PKG-INFO +15 -1
- {atdd-0.4.2 → atdd-0.4.3}/README.md +14 -0
- {atdd-0.4.2 → atdd-0.4.3}/pyproject.toml +1 -1
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/initializer.py +4 -0
- atdd-0.4.3/src/atdd/coach/schemas/config.schema.json +65 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/templates/ATDD.md +4 -1
- atdd-0.4.3/src/atdd/coach/validators/test_release_versioning.py +178 -0
- {atdd-0.4.2 → atdd-0.4.3/src/atdd.egg-info}/PKG-INFO +15 -1
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd.egg-info/SOURCES.txt +1 -0
- atdd-0.4.2/src/atdd/coach/schemas/config.schema.json +0 -34
- {atdd-0.4.2 → atdd-0.4.3}/LICENSE +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/setup.cfg +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/__main__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/cli.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/add_persistence_metadata.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/analyze_migrations.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/consumers.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/gate.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/infer_governance_status.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/interface.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/inventory.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/migration.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/registry.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/session.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/sync.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/test_interface.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/test_runner.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/tests/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/tests/test_telemetry_array_validation.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/commands/traceability.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/conventions/session.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/overlays/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/overlays/claude.md +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/schemas/manifest.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/templates/SESSION-TEMPLATE.md +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/utils/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/utils/graph/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/utils/graph/urn.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/utils/repo.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/validators/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/validators/shared_fixtures.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/validators/test_enrich_wagon_registry.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/validators/test_registry.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/validators/test_session_validation.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/validators/test_traceability.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/validators/test_update_feature_paths.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coach/validators/test_validate_contract_consumers.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/adapter.recipe.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/backend.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/boundaries.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/commons.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/complexity.recipe.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/component-naming.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/design.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/design.recipe.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/dto.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/frontend.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/green.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/presentation.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/refactor.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/technology.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/tests/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/tests/test_adapter_recipe.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/tests/test_complexity_recipe.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/tests/test_component_taxonomy.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/tests/test_component_urn_naming.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/tests/test_thinness_recipe.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/thinness.recipe.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/train.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/conventions/verification.protocol.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/schemas/design_system.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_commons_structure.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_complexity.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_cross_language_consistency.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_design_system_compliance.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_dto_testing_patterns.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_green_cross_stack_layers.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_green_layer_dependencies.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_green_python_layer_structure.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_green_supabase_layer_structure.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_import_boundaries.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_init_file_urns.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_preact_layer_boundaries.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_presentation_convention.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_python_architecture.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_quality_metrics.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_station_master_pattern.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_train_infrastructure.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_train_urns.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_typescript_architecture.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_usecase_structure.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/coder/validators/test_wagon_boundaries.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/conftest.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/conventions/acceptance.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/conventions/appendix.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/conventions/artifact-naming.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/conventions/component.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/conventions/criteria.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/conventions/feature.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/conventions/interface.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/conventions/steps.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/conventions/train.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/conventions/wagon.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/conventions/wmbt.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/schemas/acceptance.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/schemas/appendix.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/schemas/component.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/schemas/feature.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/schemas/train.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/schemas/wagon.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/schemas/wmbt.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/validators/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/validators/conftest.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/validators/test_draft_wagon_registry.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/validators/test_plan_cross_refs.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/validators/test_plan_uniqueness.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/validators/test_plan_urn_resolution.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/validators/test_plan_wagons.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/validators/test_train_validation.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/validators/test_wagon_urn_chain.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/validators/test_wmbt_consistency.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/planner/validators/test_wmbt_vocabulary.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/conventions/artifact.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/conventions/contract.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/conventions/filename.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/conventions/migration.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/conventions/red.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/conventions/routing.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/conventions/security.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/conventions/telemetry.convention.yaml +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/a11y.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/artifact.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/contract.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/contract.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/db.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/e2e.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/edge_function.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/event.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/http.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/job.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/load.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/metric.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/pack.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/realtime.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/rls.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/script.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/sec.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/storage.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/telemetry.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/telemetry_tracking_manifest.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/test_filename.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/test_intent.schema.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/unit.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/visual.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/schemas/ws.tmpl.json +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/utils/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/utils/filename.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/__init__.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/cleanup_duplicate_headers.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/cleanup_duplicate_headers_v2.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/conftest.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/coverage_gap_report.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/fix_dual_ac_references.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/remove_duplicate_lines.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_acceptance_urn_filename_mapping.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_acceptance_urn_separator.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_artifact_naming_category.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_contract_schema_compliance.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_contract_security.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_contracts_structure.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_coverage_adequacy.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_dual_ac_reference.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_fixture_validity.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_isolation.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_migration_coverage.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_migration_criteria.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_migration_generation.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_python_test_naming.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_red_layer_validation.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_red_python_layer_structure.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_red_supabase_layer_structure.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_telemetry_structure.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_typescript_test_naming.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_typescript_test_structure.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd/version_check.py +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd.egg-info/dependency_links.txt +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd.egg-info/entry_points.txt +0 -0
- {atdd-0.4.2 → atdd-0.4.3}/src/atdd.egg-info/requires.txt +0 -0
- {atdd-0.4.2 → 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.
|
|
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
|
|
@@ -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
|
-
#
|
|
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
|
+
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atdd
|
|
3
|
-
Version: 0.4.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{atdd-0.4.2 → atdd-0.4.3}/src/atdd/tester/validators/test_acceptance_urn_filename_mapping.py
RENAMED
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|