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