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.
- {atdd-0.4.1/src/atdd.egg-info → atdd-0.4.7}/PKG-INFO +25 -3
- {atdd-0.4.1 → atdd-0.4.7}/README.md +24 -2
- {atdd-0.4.1 → atdd-0.4.7}/pyproject.toml +1 -1
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/cli.py +71 -12
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/initializer.py +4 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/inventory.py +91 -3
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/registry.py +477 -204
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/sync.py +35 -8
- atdd-0.4.7/src/atdd/coach/schemas/config.schema.json +65 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/templates/ATDD.md +4 -1
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/templates/SESSION-TEMPLATE.md +1 -1
- atdd-0.4.7/src/atdd/coach/utils/config.py +131 -0
- atdd-0.4.7/src/atdd/coach/utils/train_spec_phase.py +97 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/shared_fixtures.py +68 -1
- atdd-0.4.7/src/atdd/coach/validators/test_release_versioning.py +190 -0
- atdd-0.4.7/src/atdd/coach/validators/test_train_registry.py +189 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_train_infrastructure.py +236 -2
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/schemas/train.schema.json +125 -2
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_plan_cross_refs.py +4 -2
- atdd-0.4.7/src/atdd/planner/validators/test_train_validation.py +1181 -0
- atdd-0.4.7/src/atdd/tester/validators/test_train_backend_e2e.py +371 -0
- atdd-0.4.7/src/atdd/tester/validators/test_train_frontend_e2e.py +292 -0
- atdd-0.4.7/src/atdd/tester/validators/test_train_frontend_python.py +282 -0
- {atdd-0.4.1 → atdd-0.4.7/src/atdd.egg-info}/PKG-INFO +25 -3
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd.egg-info/SOURCES.txt +7 -0
- atdd-0.4.1/src/atdd/coach/schemas/config.schema.json +0 -34
- atdd-0.4.1/src/atdd/planner/validators/test_train_validation.py +0 -514
- {atdd-0.4.1 → atdd-0.4.7}/LICENSE +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/setup.cfg +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/__main__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/add_persistence_metadata.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/analyze_migrations.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/consumers.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/gate.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/infer_governance_status.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/interface.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/migration.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/session.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/test_interface.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/test_runner.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/tests/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/tests/test_telemetry_array_validation.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/commands/traceability.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/conventions/session.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/overlays/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/overlays/claude.md +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/schemas/manifest.schema.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/utils/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/utils/graph/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/utils/graph/urn.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/utils/repo.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/test_enrich_wagon_registry.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/test_registry.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/test_session_validation.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/test_traceability.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/test_update_feature_paths.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coach/validators/test_validate_contract_consumers.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/adapter.recipe.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/backend.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/boundaries.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/commons.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/complexity.recipe.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/component-naming.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/design.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/design.recipe.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/dto.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/frontend.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/green.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/presentation.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/refactor.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/technology.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/tests/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/tests/test_adapter_recipe.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/tests/test_complexity_recipe.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/tests/test_component_taxonomy.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/tests/test_component_urn_naming.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/tests/test_thinness_recipe.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/thinness.recipe.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/train.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/conventions/verification.protocol.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/schemas/design_system.schema.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_commons_structure.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_complexity.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_cross_language_consistency.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_design_system_compliance.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_dto_testing_patterns.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_green_cross_stack_layers.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_green_layer_dependencies.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_green_python_layer_structure.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_green_supabase_layer_structure.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_import_boundaries.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_init_file_urns.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_preact_layer_boundaries.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_presentation_convention.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_python_architecture.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_quality_metrics.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_station_master_pattern.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_train_urns.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_typescript_architecture.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_usecase_structure.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/coder/validators/test_wagon_boundaries.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/conftest.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/acceptance.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/appendix.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/artifact-naming.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/component.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/criteria.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/feature.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/interface.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/steps.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/train.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/wagon.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/conventions/wmbt.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/schemas/acceptance.schema.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/schemas/appendix.schema.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/schemas/component.schema.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/schemas/feature.schema.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/schemas/wagon.schema.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/schemas/wmbt.schema.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/conftest.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_draft_wagon_registry.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_plan_uniqueness.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_plan_urn_resolution.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_plan_wagons.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_wagon_urn_chain.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_wmbt_consistency.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/planner/validators/test_wmbt_vocabulary.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/artifact.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/contract.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/filename.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/migration.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/red.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/routing.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/security.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/conventions/telemetry.convention.yaml +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/a11y.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/artifact.schema.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/contract.schema.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/contract.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/db.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/e2e.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/edge_function.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/event.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/http.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/job.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/load.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/metric.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/pack.schema.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/realtime.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/rls.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/script.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/sec.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/storage.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/telemetry.schema.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/telemetry_tracking_manifest.schema.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/test_filename.schema.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/test_intent.schema.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/unit.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/visual.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/schemas/ws.tmpl.json +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/utils/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/utils/filename.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/__init__.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/cleanup_duplicate_headers.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/cleanup_duplicate_headers_v2.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/conftest.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/coverage_gap_report.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/fix_dual_ac_references.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/remove_duplicate_lines.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_acceptance_urn_filename_mapping.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_acceptance_urn_separator.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_artifact_naming_category.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_contract_schema_compliance.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_contract_security.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_contracts_structure.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_coverage_adequacy.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_dual_ac_reference.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_fixture_validity.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_isolation.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_migration_coverage.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_migration_criteria.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_migration_generation.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_python_test_naming.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_red_layer_validation.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_red_python_layer_structure.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_red_supabase_layer_structure.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_telemetry_structure.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_typescript_test_naming.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/tester/validators/test_typescript_test_structure.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd/version_check.py +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd.egg-info/dependency_links.txt +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd.egg-info/entry_points.txt +0 -0
- {atdd-0.4.1 → atdd-0.4.7}/src/atdd.egg-info/requires.txt +0 -0
- {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.
|
|
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 <
|
|
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
|
|
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 <
|
|
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
|
|
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
|
|
@@ -110,16 +110,60 @@ class ATDDCoach:
|
|
|
110
110
|
parallel=True
|
|
111
111
|
)
|
|
112
112
|
|
|
113
|
-
def update_registries(
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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(
|
|
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
|
|
@@ -75,11 +75,32 @@ class RepositoryInventory:
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
def scan_trains(self) -> Dict[str, Any]:
|
|
78
|
-
"""
|
|
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 {
|
|
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]:
|