atdd 0.1.0__tar.gz → 0.2.6__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.1.0/src/atdd.egg-info → atdd-0.2.6}/PKG-INFO +106 -13
- {atdd-0.1.0 → atdd-0.2.6}/README.md +105 -12
- {atdd-0.1.0 → atdd-0.2.6}/pyproject.toml +2 -2
- atdd-0.2.6/src/atdd/__init__.py +6 -0
- atdd-0.2.6/src/atdd/__main__.py +4 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/cli.py +35 -1
- atdd-0.2.6/src/atdd/coach/commands/gate.py +168 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/templates/ATDD.md +36 -0
- atdd-0.2.6/src/atdd/version_check.py +126 -0
- {atdd-0.1.0 → atdd-0.2.6/src/atdd.egg-info}/PKG-INFO +106 -13
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd.egg-info/SOURCES.txt +3 -0
- atdd-0.2.6/src/atdd.egg-info/entry_points.txt +2 -0
- atdd-0.1.0/src/atdd/tester/validators/__init__.py +0 -0
- atdd-0.1.0/src/atdd.egg-info/entry_points.txt +0 -2
- {atdd-0.1.0 → atdd-0.2.6}/LICENSE +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/setup.cfg +0 -0
- {atdd-0.1.0/src/atdd → atdd-0.2.6/src/atdd/coach}/__init__.py +0 -0
- {atdd-0.1.0/src/atdd/coach → atdd-0.2.6/src/atdd/coach/commands}/__init__.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/add_persistence_metadata.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/analyze_migrations.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/consumers.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/infer_governance_status.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/initializer.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/interface.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/inventory.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/migration.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/registry.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/session.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/sync.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/test_interface.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/test_runner.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/tests/__init__.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/tests/test_telemetry_array_validation.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/commands/traceability.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/conventions/session.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/overlays/__init__.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/overlays/claude.md +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/schemas/config.schema.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/schemas/manifest.schema.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/templates/SESSION-TEMPLATE.md +0 -0
- {atdd-0.1.0/src/atdd/coach/commands → atdd-0.2.6/src/atdd/coach/utils}/__init__.py +0 -0
- {atdd-0.1.0/src/atdd/coach/utils → atdd-0.2.6/src/atdd/coach/utils/graph}/__init__.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/utils/graph/urn.py +0 -0
- {atdd-0.1.0/src/atdd/coach/utils/graph → atdd-0.2.6/src/atdd/coach/validators}/__init__.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/validators/shared_fixtures.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/validators/test_enrich_wagon_registry.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/validators/test_registry.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/validators/test_session_validation.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/validators/test_traceability.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/validators/test_update_feature_paths.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coach/validators/test_validate_contract_consumers.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/__init__.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/adapter.recipe.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/backend.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/boundaries.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/commons.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/complexity.recipe.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/component-naming.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/design.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/design.recipe.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/dto.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/frontend.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/green.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/presentation.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/refactor.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/technology.convention.yaml +0 -0
- {atdd-0.1.0/src/atdd/coach/validators → atdd-0.2.6/src/atdd/coder/conventions/tests}/__init__.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/tests/test_adapter_recipe.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/tests/test_complexity_recipe.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/tests/test_component_taxonomy.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/tests/test_component_urn_naming.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/tests/test_thinness_recipe.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/thinness.recipe.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/train.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/conventions/verification.protocol.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/schemas/design_system.schema.json +0 -0
- {atdd-0.1.0/src/atdd/coder/conventions/tests → atdd-0.2.6/src/atdd/coder/validators}/__init__.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_commons_structure.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_complexity.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_cross_language_consistency.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_design_system_compliance.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_dto_testing_patterns.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_green_cross_stack_layers.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_green_layer_dependencies.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_green_python_layer_structure.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_green_supabase_layer_structure.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_import_boundaries.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_init_file_urns.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_preact_layer_boundaries.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_presentation_convention.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_python_architecture.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_quality_metrics.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_station_master_pattern.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_train_infrastructure.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_train_urns.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_typescript_architecture.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_usecase_structure.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/coder/validators/test_wagon_boundaries.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/conftest.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/__init__.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/conventions/acceptance.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/conventions/appendix.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/conventions/artifact-naming.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/conventions/component.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/conventions/criteria.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/conventions/feature.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/conventions/interface.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/conventions/steps.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/conventions/train.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/conventions/wagon.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/conventions/wmbt.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/schemas/acceptance.schema.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/schemas/appendix.schema.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/schemas/component.schema.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/schemas/feature.schema.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/schemas/train.schema.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/schemas/wagon.schema.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/schemas/wmbt.schema.json +0 -0
- {atdd-0.1.0/src/atdd/coder → atdd-0.2.6/src/atdd/planner}/validators/__init__.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/validators/conftest.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/validators/test_draft_wagon_registry.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/validators/test_plan_cross_refs.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/validators/test_plan_uniqueness.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/validators/test_plan_urn_resolution.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/validators/test_plan_wagons.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/validators/test_train_validation.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/validators/test_wagon_urn_chain.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/validators/test_wmbt_consistency.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/planner/validators/test_wmbt_vocabulary.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/__init__.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/conventions/artifact.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/conventions/contract.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/conventions/filename.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/conventions/migration.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/conventions/red.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/conventions/routing.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/conventions/telemetry.convention.yaml +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/a11y.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/artifact.schema.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/contract.schema.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/contract.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/db.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/e2e.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/edge_function.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/event.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/http.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/job.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/load.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/metric.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/pack.schema.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/realtime.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/rls.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/script.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/sec.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/storage.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/telemetry.schema.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/telemetry_tracking_manifest.schema.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/test_filename.schema.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/test_intent.schema.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/unit.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/visual.tmpl.json +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/schemas/ws.tmpl.json +0 -0
- {atdd-0.1.0/src/atdd/planner/validators → atdd-0.2.6/src/atdd/tester/utils}/__init__.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/utils/filename.py +0 -0
- {atdd-0.1.0/src/atdd/tester/utils → atdd-0.2.6/src/atdd/tester/validators}/__init__.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/cleanup_duplicate_headers.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/cleanup_duplicate_headers_v2.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/conftest.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/coverage_gap_report.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/fix_dual_ac_references.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/remove_duplicate_lines.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_acceptance_urn_filename_mapping.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_acceptance_urn_separator.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_artifact_naming_category.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_contract_schema_compliance.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_contracts_structure.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_coverage_adequacy.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_dual_ac_reference.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_fixture_validity.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_isolation.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_migration_coverage.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_migration_criteria.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_migration_generation.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_python_test_naming.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_red_layer_validation.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_red_python_layer_structure.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_red_supabase_layer_structure.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_telemetry_structure.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_typescript_test_naming.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd/tester/validators/test_typescript_test_structure.py +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd.egg-info/dependency_links.txt +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/src/atdd.egg-info/requires.txt +0 -0
- {atdd-0.1.0 → atdd-0.2.6}/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.
|
|
3
|
+
Version: 0.2.6
|
|
4
4
|
Summary: ATDD Platform - Acceptance Test Driven Development toolkit
|
|
5
5
|
License: MIT
|
|
6
6
|
Requires-Python: >=3.10
|
|
@@ -18,10 +18,10 @@ Acceptance Test Driven Development toolkit for structured planning and conventio
|
|
|
18
18
|
|
|
19
19
|
## Installation
|
|
20
20
|
|
|
21
|
-
### From
|
|
21
|
+
### From PyPI
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
pip install
|
|
24
|
+
pip install atdd
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
### For Development
|
|
@@ -38,13 +38,6 @@ pip install -e ".[dev]"
|
|
|
38
38
|
atdd --help
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
### Future: PyPI
|
|
42
|
-
|
|
43
|
-
Once published to PyPI:
|
|
44
|
-
```bash
|
|
45
|
-
pip install atdd
|
|
46
|
-
```
|
|
47
|
-
|
|
48
41
|
## Quick Start
|
|
49
42
|
|
|
50
43
|
```bash
|
|
@@ -57,6 +50,9 @@ atdd session new my-feature
|
|
|
57
50
|
# List sessions
|
|
58
51
|
atdd session list
|
|
59
52
|
|
|
53
|
+
# Sync ATDD rules to agent config files
|
|
54
|
+
atdd sync
|
|
55
|
+
|
|
60
56
|
# Run validators
|
|
61
57
|
atdd --test all
|
|
62
58
|
```
|
|
@@ -68,24 +64,27 @@ ATDD provides:
|
|
|
68
64
|
1. **Session Management** - Structured planning documents with templates and tracking
|
|
69
65
|
2. **Convention Enforcement** - YAML-based conventions validated via pytest
|
|
70
66
|
3. **ATDD Lifecycle** - Planner → Tester → Coder phase gates
|
|
67
|
+
4. **Agent Config Sync** - Keep ATDD rules in sync across AI agent config files
|
|
71
68
|
|
|
72
69
|
## Commands
|
|
73
70
|
|
|
74
71
|
### Project Initialization
|
|
75
72
|
|
|
76
73
|
```bash
|
|
77
|
-
atdd init # Create atdd-sessions
|
|
74
|
+
atdd init # Create atdd-sessions/, .atdd/, and CLAUDE.md
|
|
78
75
|
atdd init --force # Reinitialize (overwrites existing)
|
|
79
76
|
```
|
|
80
77
|
|
|
81
78
|
Creates:
|
|
82
79
|
```
|
|
83
80
|
your-project/
|
|
81
|
+
├── CLAUDE.md # With managed ATDD block
|
|
84
82
|
├── atdd-sessions/
|
|
85
83
|
│ ├── SESSION-TEMPLATE.md
|
|
86
84
|
│ └── archive/
|
|
87
85
|
└── .atdd/
|
|
88
|
-
|
|
86
|
+
├── manifest.yaml # Session tracking
|
|
87
|
+
└── config.yaml # Agent sync configuration
|
|
89
88
|
```
|
|
90
89
|
|
|
91
90
|
### Session Management
|
|
@@ -100,6 +99,99 @@ atdd session sync # Sync manifest with files
|
|
|
100
99
|
|
|
101
100
|
Session types: `implementation`, `migration`, `refactor`, `analysis`, `planning`, `cleanup`, `tracking`
|
|
102
101
|
|
|
102
|
+
### Agent Config Sync
|
|
103
|
+
|
|
104
|
+
Sync ATDD rules to agent config files using managed blocks that preserve user content:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
atdd sync # Sync all enabled agents from config
|
|
108
|
+
atdd sync --agent claude # Sync specific agent only
|
|
109
|
+
atdd sync --verify # Check if files are in sync (for CI)
|
|
110
|
+
atdd sync --status # Show sync status for all agents
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Supported agents:
|
|
114
|
+
| Agent | File |
|
|
115
|
+
|-------|------|
|
|
116
|
+
| claude | CLAUDE.md |
|
|
117
|
+
| codex | AGENTS.md |
|
|
118
|
+
| gemini | GEMINI.md |
|
|
119
|
+
| qwen | QWEN.md |
|
|
120
|
+
|
|
121
|
+
Configure which agents to sync in `.atdd/config.yaml`:
|
|
122
|
+
```yaml
|
|
123
|
+
version: "1.0"
|
|
124
|
+
sync:
|
|
125
|
+
agents:
|
|
126
|
+
- claude # Enabled by default
|
|
127
|
+
# - codex # Uncomment to sync AGENTS.md
|
|
128
|
+
# - gemini # Uncomment to sync GEMINI.md
|
|
129
|
+
# - qwen # Uncomment to sync QWEN.md
|
|
130
|
+
```
|
|
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 (Bootstrap Protocol)
|
|
148
|
+
|
|
149
|
+
Agents often skip instruction files. The gate solves this by injecting rules via mandatory tool output.
|
|
150
|
+
|
|
151
|
+
**Protocol:**
|
|
152
|
+
|
|
153
|
+
1. Run this command first:
|
|
154
|
+
```bash
|
|
155
|
+
atdd gate
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
2. Agent must paste output and confirm:
|
|
159
|
+
- Which file(s) were loaded
|
|
160
|
+
- The reported hash
|
|
161
|
+
- The key constraints
|
|
162
|
+
|
|
163
|
+
3. If files are missing/unsynced:
|
|
164
|
+
```bash
|
|
165
|
+
atdd sync
|
|
166
|
+
atdd gate # Re-verify
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Example output:**
|
|
170
|
+
```
|
|
171
|
+
============================================================
|
|
172
|
+
ATDD Gate Verification
|
|
173
|
+
============================================================
|
|
174
|
+
|
|
175
|
+
Loaded files:
|
|
176
|
+
- CLAUDE.md (hash: d04f897c6691dc13...)
|
|
177
|
+
|
|
178
|
+
Key constraints:
|
|
179
|
+
1. No ad-hoc tests - follow ATDD conventions
|
|
180
|
+
2. Domain layer NEVER imports from other layers
|
|
181
|
+
3. Phase transitions require quality gates
|
|
182
|
+
|
|
183
|
+
------------------------------------------------------------
|
|
184
|
+
Before starting work, confirm you have loaded these rules.
|
|
185
|
+
------------------------------------------------------------
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**Why this works:**
|
|
189
|
+
- Gate output is mandatory tool output - agent can't ignore it
|
|
190
|
+
- Proves which ATDD files were actually loaded
|
|
191
|
+
- Forces consistency across all agents
|
|
192
|
+
|
|
193
|
+
**Rule:** If ATDD rules matter, start with `atdd gate`. No gate = no guarantees.
|
|
194
|
+
|
|
103
195
|
### Validation
|
|
104
196
|
|
|
105
197
|
```bash
|
|
@@ -126,8 +218,9 @@ src/atdd/
|
|
|
126
218
|
├── coach/
|
|
127
219
|
│ ├── commands/ # CLI command implementations
|
|
128
220
|
│ ├── conventions/ # Coach conventions (YAML)
|
|
221
|
+
│ ├── overlays/ # Agent-specific additions
|
|
129
222
|
│ ├── schemas/ # JSON schemas
|
|
130
|
-
│ ├── templates/ # Session templates
|
|
223
|
+
│ ├── templates/ # Session templates, ATDD.md
|
|
131
224
|
│ └── validators/ # Coach validators
|
|
132
225
|
├── planner/
|
|
133
226
|
│ ├── conventions/ # Planning conventions
|
|
@@ -4,10 +4,10 @@ Acceptance Test Driven Development toolkit for structured planning and conventio
|
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
|
-
### From
|
|
7
|
+
### From PyPI
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
pip install
|
|
10
|
+
pip install atdd
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
### For Development
|
|
@@ -24,13 +24,6 @@ pip install -e ".[dev]"
|
|
|
24
24
|
atdd --help
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
### Future: PyPI
|
|
28
|
-
|
|
29
|
-
Once published to PyPI:
|
|
30
|
-
```bash
|
|
31
|
-
pip install atdd
|
|
32
|
-
```
|
|
33
|
-
|
|
34
27
|
## Quick Start
|
|
35
28
|
|
|
36
29
|
```bash
|
|
@@ -43,6 +36,9 @@ atdd session new my-feature
|
|
|
43
36
|
# List sessions
|
|
44
37
|
atdd session list
|
|
45
38
|
|
|
39
|
+
# Sync ATDD rules to agent config files
|
|
40
|
+
atdd sync
|
|
41
|
+
|
|
46
42
|
# Run validators
|
|
47
43
|
atdd --test all
|
|
48
44
|
```
|
|
@@ -54,24 +50,27 @@ ATDD provides:
|
|
|
54
50
|
1. **Session Management** - Structured planning documents with templates and tracking
|
|
55
51
|
2. **Convention Enforcement** - YAML-based conventions validated via pytest
|
|
56
52
|
3. **ATDD Lifecycle** - Planner → Tester → Coder phase gates
|
|
53
|
+
4. **Agent Config Sync** - Keep ATDD rules in sync across AI agent config files
|
|
57
54
|
|
|
58
55
|
## Commands
|
|
59
56
|
|
|
60
57
|
### Project Initialization
|
|
61
58
|
|
|
62
59
|
```bash
|
|
63
|
-
atdd init # Create atdd-sessions
|
|
60
|
+
atdd init # Create atdd-sessions/, .atdd/, and CLAUDE.md
|
|
64
61
|
atdd init --force # Reinitialize (overwrites existing)
|
|
65
62
|
```
|
|
66
63
|
|
|
67
64
|
Creates:
|
|
68
65
|
```
|
|
69
66
|
your-project/
|
|
67
|
+
├── CLAUDE.md # With managed ATDD block
|
|
70
68
|
├── atdd-sessions/
|
|
71
69
|
│ ├── SESSION-TEMPLATE.md
|
|
72
70
|
│ └── archive/
|
|
73
71
|
└── .atdd/
|
|
74
|
-
|
|
72
|
+
├── manifest.yaml # Session tracking
|
|
73
|
+
└── config.yaml # Agent sync configuration
|
|
75
74
|
```
|
|
76
75
|
|
|
77
76
|
### Session Management
|
|
@@ -86,6 +85,99 @@ atdd session sync # Sync manifest with files
|
|
|
86
85
|
|
|
87
86
|
Session types: `implementation`, `migration`, `refactor`, `analysis`, `planning`, `cleanup`, `tracking`
|
|
88
87
|
|
|
88
|
+
### Agent Config Sync
|
|
89
|
+
|
|
90
|
+
Sync ATDD rules to agent config files using managed blocks that preserve user content:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
atdd sync # Sync all enabled agents from config
|
|
94
|
+
atdd sync --agent claude # Sync specific agent only
|
|
95
|
+
atdd sync --verify # Check if files are in sync (for CI)
|
|
96
|
+
atdd sync --status # Show sync status for all agents
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Supported agents:
|
|
100
|
+
| Agent | File |
|
|
101
|
+
|-------|------|
|
|
102
|
+
| claude | CLAUDE.md |
|
|
103
|
+
| codex | AGENTS.md |
|
|
104
|
+
| gemini | GEMINI.md |
|
|
105
|
+
| qwen | QWEN.md |
|
|
106
|
+
|
|
107
|
+
Configure which agents to sync in `.atdd/config.yaml`:
|
|
108
|
+
```yaml
|
|
109
|
+
version: "1.0"
|
|
110
|
+
sync:
|
|
111
|
+
agents:
|
|
112
|
+
- claude # Enabled by default
|
|
113
|
+
# - codex # Uncomment to sync AGENTS.md
|
|
114
|
+
# - gemini # Uncomment to sync GEMINI.md
|
|
115
|
+
# - qwen # Uncomment to sync QWEN.md
|
|
116
|
+
```
|
|
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 (Bootstrap Protocol)
|
|
134
|
+
|
|
135
|
+
Agents often skip instruction files. The gate solves this by injecting rules via mandatory tool output.
|
|
136
|
+
|
|
137
|
+
**Protocol:**
|
|
138
|
+
|
|
139
|
+
1. Run this command first:
|
|
140
|
+
```bash
|
|
141
|
+
atdd gate
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
2. Agent must paste output and confirm:
|
|
145
|
+
- Which file(s) were loaded
|
|
146
|
+
- The reported hash
|
|
147
|
+
- The key constraints
|
|
148
|
+
|
|
149
|
+
3. If files are missing/unsynced:
|
|
150
|
+
```bash
|
|
151
|
+
atdd sync
|
|
152
|
+
atdd gate # Re-verify
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Example output:**
|
|
156
|
+
```
|
|
157
|
+
============================================================
|
|
158
|
+
ATDD Gate Verification
|
|
159
|
+
============================================================
|
|
160
|
+
|
|
161
|
+
Loaded files:
|
|
162
|
+
- CLAUDE.md (hash: d04f897c6691dc13...)
|
|
163
|
+
|
|
164
|
+
Key constraints:
|
|
165
|
+
1. No ad-hoc tests - follow ATDD conventions
|
|
166
|
+
2. Domain layer NEVER imports from other layers
|
|
167
|
+
3. Phase transitions require quality gates
|
|
168
|
+
|
|
169
|
+
------------------------------------------------------------
|
|
170
|
+
Before starting work, confirm you have loaded these rules.
|
|
171
|
+
------------------------------------------------------------
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**Why this works:**
|
|
175
|
+
- Gate output is mandatory tool output - agent can't ignore it
|
|
176
|
+
- Proves which ATDD files were actually loaded
|
|
177
|
+
- Forces consistency across all agents
|
|
178
|
+
|
|
179
|
+
**Rule:** If ATDD rules matter, start with `atdd gate`. No gate = no guarantees.
|
|
180
|
+
|
|
89
181
|
### Validation
|
|
90
182
|
|
|
91
183
|
```bash
|
|
@@ -112,8 +204,9 @@ src/atdd/
|
|
|
112
204
|
├── coach/
|
|
113
205
|
│ ├── commands/ # CLI command implementations
|
|
114
206
|
│ ├── conventions/ # Coach conventions (YAML)
|
|
207
|
+
│ ├── overlays/ # Agent-specific additions
|
|
115
208
|
│ ├── schemas/ # JSON schemas
|
|
116
|
-
│ ├── templates/ # Session templates
|
|
209
|
+
│ ├── templates/ # Session templates, ATDD.md
|
|
117
210
|
│ └── validators/ # Coach validators
|
|
118
211
|
├── planner/
|
|
119
212
|
│ ├── conventions/ # Planning conventions
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "atdd"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.2.6"
|
|
8
8
|
description = "ATDD Platform - Acceptance Test Driven Development toolkit"
|
|
9
9
|
requires-python = ">=3.10"
|
|
10
10
|
readme = "README.md"
|
|
@@ -15,7 +15,7 @@ dependencies = ["pyyaml"]
|
|
|
15
15
|
dev = ["pytest", "pytest-xdist"]
|
|
16
16
|
|
|
17
17
|
[project.scripts]
|
|
18
|
-
atdd = "atdd.cli:
|
|
18
|
+
atdd = "atdd.cli:cli"
|
|
19
19
|
|
|
20
20
|
[tool.setuptools.packages.find]
|
|
21
21
|
where = ["src"]
|
|
@@ -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,8 @@ 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
|
|
47
|
+
from atdd.version_check import print_update_notice
|
|
44
48
|
|
|
45
49
|
|
|
46
50
|
class ATDDCoach:
|
|
@@ -156,6 +160,10 @@ Examples:
|
|
|
156
160
|
%(prog)s sync --agent claude Sync specific agent only
|
|
157
161
|
%(prog)s sync --status Show sync status
|
|
158
162
|
|
|
163
|
+
# ATDD gate verification
|
|
164
|
+
%(prog)s gate Show gate verification info
|
|
165
|
+
%(prog)s gate --json Output as JSON
|
|
166
|
+
|
|
159
167
|
# Existing flag-based commands (backwards compatible)
|
|
160
168
|
%(prog)s --inventory Generate full inventory (YAML)
|
|
161
169
|
%(prog)s --inventory --format json Generate inventory (JSON)
|
|
@@ -268,6 +276,18 @@ Phase descriptions:
|
|
|
268
276
|
help="Show sync status for all agents"
|
|
269
277
|
)
|
|
270
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
|
+
|
|
271
291
|
# ----- Existing flag-based arguments (backwards compatible) -----
|
|
272
292
|
|
|
273
293
|
# Main command groups
|
|
@@ -367,6 +387,11 @@ Phase descriptions:
|
|
|
367
387
|
return syncer.verify()
|
|
368
388
|
return syncer.sync(agents=[args.agent] if args.agent else None)
|
|
369
389
|
|
|
390
|
+
# atdd gate
|
|
391
|
+
elif args.command == "gate":
|
|
392
|
+
gate = ATDDGate()
|
|
393
|
+
return gate.verify(json=args.json)
|
|
394
|
+
|
|
370
395
|
# ----- Handle flag-based commands (backwards compatible) -----
|
|
371
396
|
|
|
372
397
|
# Create coach instance
|
|
@@ -400,5 +425,14 @@ Phase descriptions:
|
|
|
400
425
|
return 0
|
|
401
426
|
|
|
402
427
|
|
|
428
|
+
def cli() -> int:
|
|
429
|
+
"""CLI entry point with version check."""
|
|
430
|
+
try:
|
|
431
|
+
result = main()
|
|
432
|
+
finally:
|
|
433
|
+
print_update_notice()
|
|
434
|
+
return result
|
|
435
|
+
|
|
436
|
+
|
|
403
437
|
if __name__ == "__main__":
|
|
404
|
-
sys.exit(
|
|
438
|
+
sys.exit(cli())
|
|
@@ -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,42 @@ missions:
|
|
|
4
4
|
validate_phase_transitions: "Phase transitions and quality gates per conventions and schemas"
|
|
5
5
|
required: true
|
|
6
6
|
|
|
7
|
+
# =============================================================================
|
|
8
|
+
# ATDD AGENT BOOTSTRAP PROTOCOL (REQUIRED)
|
|
9
|
+
# =============================================================================
|
|
10
|
+
#
|
|
11
|
+
# Problem: Agents often skip instruction files and work without ATDD context.
|
|
12
|
+
# Solution: Coercive context - inject rules via mandatory tool output.
|
|
13
|
+
#
|
|
14
|
+
# PROTOCOL:
|
|
15
|
+
# ---------
|
|
16
|
+
# 1. Run this command FIRST:
|
|
17
|
+
#
|
|
18
|
+
# atdd gate
|
|
19
|
+
#
|
|
20
|
+
# 2. Paste the output and confirm:
|
|
21
|
+
# - Which file(s) were loaded
|
|
22
|
+
# - The reported hash
|
|
23
|
+
# - The key ATDD constraints
|
|
24
|
+
#
|
|
25
|
+
# 3. If output shows missing/unsynced files, run:
|
|
26
|
+
#
|
|
27
|
+
# atdd sync
|
|
28
|
+
#
|
|
29
|
+
# Then re-run: atdd gate
|
|
30
|
+
#
|
|
31
|
+
# WHY THIS WORKS:
|
|
32
|
+
# - Gate output is mandatory tool output - agent can't ignore it
|
|
33
|
+
# - Proves which ATDD files were actually loaded
|
|
34
|
+
# - Forces consistency across all agents
|
|
35
|
+
#
|
|
36
|
+
# FAILURE MODE:
|
|
37
|
+
# - If agent skips the gate: STOP and run atdd gate again
|
|
38
|
+
# - Don't proceed until gate confirmation is posted
|
|
39
|
+
#
|
|
40
|
+
# RULE: If ATDD rules matter, start with `atdd gate`. No gate = no guarantees.
|
|
41
|
+
# =============================================================================
|
|
42
|
+
|
|
7
43
|
manifest:
|
|
8
44
|
- trains: "plan/_trains.yaml"
|
|
9
45
|
- wagons: "plan/_wagons.yaml"
|