atdd 0.3.3__py3-none-any.whl → 0.4.1__py3-none-any.whl
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/cli.py +223 -76
- atdd/coach/commands/add_persistence_metadata.py +3 -1
- atdd/coach/commands/infer_governance_status.py +3 -1
- atdd/coach/commands/interface.py +3 -1
- atdd/coach/commands/inventory.py +2 -2
- atdd/coach/commands/migration.py +11 -6
- atdd/coach/commands/test_runner.py +66 -27
- atdd/coach/commands/traceability.py +3 -1
- atdd/coach/conventions/session.convention.yaml +26 -26
- atdd/coach/templates/ATDD.md +15 -15
- atdd/coach/templates/SESSION-TEMPLATE.md +12 -12
- atdd/coach/utils/repo.py +24 -8
- atdd/coach/validators/shared_fixtures.py +27 -14
- atdd/coach/validators/test_session_validation.py +4 -4
- atdd/coder/conventions/commons.convention.yaml +1 -1
- atdd/coder/conventions/tests/test_component_taxonomy.py +4 -3
- atdd/coder/conventions/tests/test_component_urn_naming.py +9 -3
- atdd/coder/validators/test_commons_structure.py +9 -2
- atdd/coder/validators/test_complexity.py +3 -1
- atdd/coder/validators/test_cross_language_consistency.py +3 -1
- atdd/coder/validators/test_design_system_compliance.py +3 -1
- atdd/coder/validators/test_dto_testing_patterns.py +10 -3
- atdd/coder/validators/test_green_cross_stack_layers.py +9 -3
- atdd/coder/validators/test_green_layer_dependencies.py +9 -3
- atdd/coder/validators/test_green_python_layer_structure.py +8 -2
- atdd/coder/validators/test_green_supabase_layer_structure.py +8 -3
- atdd/coder/validators/test_import_boundaries.py +3 -1
- atdd/coder/validators/test_init_file_urns.py +3 -1
- atdd/coder/validators/test_preact_layer_boundaries.py +3 -1
- atdd/coder/validators/test_presentation_convention.py +3 -1
- atdd/coder/validators/test_python_architecture.py +9 -2
- atdd/coder/validators/test_quality_metrics.py +2 -1
- atdd/coder/validators/test_station_master_pattern.py +4 -2
- atdd/coder/validators/test_train_infrastructure.py +9 -2
- atdd/coder/validators/test_train_urns.py +9 -2
- atdd/coder/validators/test_typescript_architecture.py +10 -3
- atdd/coder/validators/test_usecase_structure.py +3 -1
- atdd/coder/validators/test_wagon_boundaries.py +8 -2
- atdd/planner/validators/test_plan_urn_resolution.py +3 -1
- atdd/planner/validators/test_wagon_urn_chain.py +3 -1
- atdd/planner/validators/test_wmbt_consistency.py +3 -1
- atdd/planner/validators/test_wmbt_vocabulary.py +8 -2
- atdd/tester/conventions/contract.convention.yaml +1 -1
- atdd/tester/conventions/migration.convention.yaml +5 -5
- atdd/tester/validators/cleanup_duplicate_headers.py +3 -1
- atdd/tester/validators/cleanup_duplicate_headers_v2.py +3 -1
- atdd/tester/validators/coverage_gap_report.py +3 -1
- atdd/tester/validators/fix_dual_ac_references.py +3 -1
- atdd/tester/validators/remove_duplicate_lines.py +3 -1
- atdd/tester/validators/test_acceptance_urn_filename_mapping.py +9 -3
- atdd/tester/validators/test_acceptance_urn_separator.py +9 -3
- atdd/tester/validators/test_contract_schema_compliance.py +9 -2
- atdd/tester/validators/test_contracts_structure.py +3 -1
- atdd/tester/validators/test_coverage_adequacy.py +3 -1
- atdd/tester/validators/test_dual_ac_reference.py +6 -2
- atdd/tester/validators/test_fixture_validity.py +2 -1
- atdd/tester/validators/test_isolation.py +9 -2
- atdd/tester/validators/test_migration_coverage.py +4 -2
- atdd/tester/validators/test_migration_generation.py +3 -1
- atdd/tester/validators/test_python_test_naming.py +3 -1
- atdd/tester/validators/test_red_layer_validation.py +7 -2
- atdd/tester/validators/test_red_python_layer_structure.py +7 -2
- atdd/tester/validators/test_red_supabase_layer_structure.py +8 -2
- atdd/tester/validators/test_telemetry_structure.py +9 -2
- {atdd-0.3.3.dist-info → atdd-0.4.1.dist-info}/METADATA +41 -12
- {atdd-0.3.3.dist-info → atdd-0.4.1.dist-info}/RECORD +70 -70
- {atdd-0.3.3.dist-info → atdd-0.4.1.dist-info}/WHEEL +0 -0
- {atdd-0.3.3.dist-info → atdd-0.4.1.dist-info}/entry_points.txt +0 -0
- {atdd-0.3.3.dist-info → atdd-0.4.1.dist-info}/licenses/LICENSE +0 -0
- {atdd-0.3.3.dist-info → atdd-0.4.1.dist-info}/top_level.txt +0 -0
|
@@ -23,11 +23,17 @@ import re
|
|
|
23
23
|
from pathlib import Path
|
|
24
24
|
from typing import Dict, List, Tuple, Set, Optional
|
|
25
25
|
|
|
26
|
+
import atdd
|
|
27
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
26
28
|
|
|
27
29
|
# Path constants
|
|
28
|
-
|
|
30
|
+
# Consumer repo artifacts
|
|
31
|
+
REPO_ROOT = find_repo_root()
|
|
29
32
|
PLAN_DIR = REPO_ROOT / "plan"
|
|
30
|
-
|
|
33
|
+
|
|
34
|
+
# Package resources (conventions, schemas)
|
|
35
|
+
ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
|
|
36
|
+
WMBT_CONVENTION = ATDD_PKG_DIR / "planner" / "conventions" / "wmbt.convention.yaml"
|
|
31
37
|
|
|
32
38
|
|
|
33
39
|
# Authorized vocabulary from convention
|
|
@@ -444,7 +444,7 @@ persistence_traceability:
|
|
|
444
444
|
|
|
445
445
|
workflow:
|
|
446
446
|
1_identify_persistent_contracts:
|
|
447
|
-
command: "python atdd
|
|
447
|
+
command: "python -m atdd.coach.commands.migration"
|
|
448
448
|
output: "List of contracts needing persistence"
|
|
449
449
|
|
|
450
450
|
2_create_migration:
|
|
@@ -16,7 +16,7 @@ workflow:
|
|
|
16
16
|
automation_level: "template_generation"
|
|
17
17
|
requires_human_review: true
|
|
18
18
|
|
|
19
|
-
command: "python atdd
|
|
19
|
+
command: "python -m atdd.coach.commands.migration"
|
|
20
20
|
|
|
21
21
|
# Table Naming Convention
|
|
22
22
|
table_naming:
|
|
@@ -171,16 +171,16 @@ references:
|
|
|
171
171
|
# Command Usage
|
|
172
172
|
usage: |
|
|
173
173
|
# Generate all missing migrations
|
|
174
|
-
python atdd
|
|
174
|
+
python -m atdd.coach.commands.migration
|
|
175
175
|
|
|
176
176
|
# Generate for specific contract
|
|
177
|
-
python atdd
|
|
177
|
+
python -m atdd.coach.commands.migration --contract contracts/match/dilemma/current.schema.json
|
|
178
178
|
|
|
179
179
|
# Validate coverage
|
|
180
|
-
python atdd
|
|
180
|
+
python -m atdd.coach.commands.migration --validate
|
|
181
181
|
|
|
182
182
|
# Check for unreviewed TODOs
|
|
183
|
-
|
|
183
|
+
atdd validate tester
|
|
184
184
|
|
|
185
185
|
# JSONB-First Storage Strategy
|
|
186
186
|
jsonb_strategy:
|
|
@@ -9,8 +9,10 @@ and keeps only the new standardized ones.
|
|
|
9
9
|
import re
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
|
|
15
|
+
REPO_ROOT = find_repo_root()
|
|
14
16
|
PYTHON_DIR = REPO_ROOT / "python"
|
|
15
17
|
|
|
16
18
|
|
|
@@ -9,8 +9,10 @@ keeping only the new standardized header at the top.
|
|
|
9
9
|
import re
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
|
|
15
|
+
REPO_ROOT = find_repo_root()
|
|
14
16
|
PYTHON_DIR = REPO_ROOT / "python"
|
|
15
17
|
|
|
16
18
|
|
|
@@ -17,9 +17,11 @@ from pathlib import Path
|
|
|
17
17
|
from collections import defaultdict
|
|
18
18
|
from typing import Dict, List, Set, Tuple
|
|
19
19
|
|
|
20
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
21
|
+
|
|
20
22
|
|
|
21
23
|
# Path constants
|
|
22
|
-
REPO_ROOT =
|
|
24
|
+
REPO_ROOT = find_repo_root()
|
|
23
25
|
PLAN_DIR = REPO_ROOT / "plan"
|
|
24
26
|
PYTHON_DIR = REPO_ROOT / "python"
|
|
25
27
|
LIB_DIR = REPO_ROOT / "lib"
|
|
@@ -5,8 +5,10 @@ Simple script to remove consecutive duplicate lines in test files.
|
|
|
5
5
|
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
|
|
8
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
|
|
11
|
+
REPO_ROOT = find_repo_root()
|
|
10
12
|
PYTHON_DIR = REPO_ROOT / "python"
|
|
11
13
|
|
|
12
14
|
|
|
@@ -13,8 +13,14 @@ import re
|
|
|
13
13
|
from pathlib import Path
|
|
14
14
|
import pytest
|
|
15
15
|
|
|
16
|
+
import atdd
|
|
17
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
16
18
|
|
|
17
|
-
|
|
19
|
+
|
|
20
|
+
REPO_ROOT = find_repo_root()
|
|
21
|
+
|
|
22
|
+
# Package resources
|
|
23
|
+
ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
|
|
18
24
|
|
|
19
25
|
|
|
20
26
|
# SPEC-TESTER-CONV-0069: Dart URN to filename mapping
|
|
@@ -297,8 +303,8 @@ def test_python_files_match_convention():
|
|
|
297
303
|
|
|
298
304
|
test_dirs = [
|
|
299
305
|
REPO_ROOT / "tests",
|
|
300
|
-
|
|
301
|
-
|
|
306
|
+
ATDD_PKG_DIR / "coach" / "validators",
|
|
307
|
+
ATDD_PKG_DIR / "tester" / "validators",
|
|
302
308
|
]
|
|
303
309
|
|
|
304
310
|
violations = []
|
|
@@ -24,10 +24,16 @@ import yaml
|
|
|
24
24
|
import re
|
|
25
25
|
from pathlib import Path
|
|
26
26
|
|
|
27
|
+
import atdd
|
|
28
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
29
|
+
|
|
27
30
|
# Path constants
|
|
28
|
-
REPO_ROOT =
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
REPO_ROOT = find_repo_root()
|
|
32
|
+
|
|
33
|
+
# Package resources (conventions, schemas)
|
|
34
|
+
ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
|
|
35
|
+
CONVENTIONS_DIR = ATDD_PKG_DIR / "planner" / "conventions"
|
|
36
|
+
SCHEMAS_DIR = ATDD_PKG_DIR / "planner" / "schemas"
|
|
31
37
|
|
|
32
38
|
|
|
33
39
|
# SPEC-COACH-UTILS-0282
|
|
@@ -12,11 +12,18 @@ import re
|
|
|
12
12
|
from pathlib import Path
|
|
13
13
|
from jsonschema import validate, ValidationError, Draft7Validator
|
|
14
14
|
|
|
15
|
+
import atdd
|
|
16
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
17
|
+
|
|
15
18
|
# Path constants
|
|
16
|
-
|
|
19
|
+
# Consumer repo artifacts
|
|
20
|
+
REPO_ROOT = find_repo_root()
|
|
17
21
|
CONTRACTS_DIR = REPO_ROOT / "contracts"
|
|
18
22
|
PLAN_DIR = REPO_ROOT / "plan"
|
|
19
|
-
|
|
23
|
+
|
|
24
|
+
# Package resources (conventions, schemas)
|
|
25
|
+
ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
|
|
26
|
+
META_SCHEMA_PATH = ATDD_PKG_DIR / "tester" / "schemas" / "contract.schema.json"
|
|
20
27
|
|
|
21
28
|
|
|
22
29
|
@pytest.fixture
|
|
@@ -9,8 +9,10 @@ import re
|
|
|
9
9
|
from pathlib import Path
|
|
10
10
|
from typing import Optional
|
|
11
11
|
|
|
12
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
13
|
+
|
|
12
14
|
# Path constants
|
|
13
|
-
REPO_ROOT =
|
|
15
|
+
REPO_ROOT = find_repo_root()
|
|
14
16
|
CONTRACTS_DIR = REPO_ROOT / "contracts"
|
|
15
17
|
|
|
16
18
|
|
|
@@ -25,9 +25,11 @@ from typing import Dict, List, Set, Tuple, Optional
|
|
|
25
25
|
from dataclasses import dataclass, field
|
|
26
26
|
from collections import defaultdict
|
|
27
27
|
|
|
28
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
29
|
+
|
|
28
30
|
|
|
29
31
|
# Path constants
|
|
30
|
-
REPO_ROOT =
|
|
32
|
+
REPO_ROOT = find_repo_root()
|
|
31
33
|
PLAN_DIR = REPO_ROOT / "plan"
|
|
32
34
|
PYTHON_DIR = REPO_ROOT / "python"
|
|
33
35
|
LIB_DIR = REPO_ROOT / "lib"
|
|
@@ -15,9 +15,11 @@ import pytest
|
|
|
15
15
|
import re
|
|
16
16
|
from pathlib import Path
|
|
17
17
|
|
|
18
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
|
|
21
|
+
# Path constants - consumer repo artifacts
|
|
22
|
+
REPO_ROOT = find_repo_root()
|
|
21
23
|
PYTHON_DIR = REPO_ROOT / "python"
|
|
22
24
|
|
|
23
25
|
|
|
@@ -210,6 +212,8 @@ Purpose: Verify timebank decrements during active decision
|
|
|
210
212
|
|
|
211
213
|
import pytest
|
|
212
214
|
|
|
215
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
216
|
+
|
|
213
217
|
|
|
214
218
|
def test_e001_unit_001_timebank_decrements_during_decision():
|
|
215
219
|
"""Test implementation..."""
|
|
@@ -17,9 +17,10 @@ import yaml
|
|
|
17
17
|
from pathlib import Path
|
|
18
18
|
from typing import Dict, List, Any
|
|
19
19
|
|
|
20
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
20
21
|
|
|
21
22
|
# Path constants
|
|
22
|
-
REPO_ROOT =
|
|
23
|
+
REPO_ROOT = find_repo_root()
|
|
23
24
|
PYTHON_DIR = REPO_ROOT / "python"
|
|
24
25
|
CONTRACTS_DIR = REPO_ROOT / "contracts"
|
|
25
26
|
|
|
@@ -17,13 +17,20 @@ import ast
|
|
|
17
17
|
from pathlib import Path
|
|
18
18
|
from typing import List, Set, Tuple
|
|
19
19
|
|
|
20
|
+
import atdd
|
|
21
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
22
|
+
|
|
20
23
|
|
|
21
24
|
# Path constants
|
|
22
|
-
REPO_ROOT =
|
|
25
|
+
REPO_ROOT = find_repo_root()
|
|
26
|
+
|
|
27
|
+
# Package resources
|
|
28
|
+
ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
|
|
29
|
+
|
|
23
30
|
TEST_DIRS = [
|
|
24
31
|
REPO_ROOT / "test",
|
|
25
32
|
REPO_ROOT / "tests",
|
|
26
|
-
|
|
33
|
+
ATDD_PKG_DIR, # Validators in installed package
|
|
27
34
|
]
|
|
28
35
|
|
|
29
36
|
|
|
@@ -7,8 +7,10 @@ SPEC-TESTER-CONV-0032: Reject migrations with unresolved TODOs
|
|
|
7
7
|
import pytest
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
|
|
10
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
11
|
+
|
|
10
12
|
# Path constants
|
|
11
|
-
REPO_ROOT =
|
|
13
|
+
REPO_ROOT = find_repo_root()
|
|
12
14
|
CONTRACTS_DIR = REPO_ROOT / "contracts"
|
|
13
15
|
MIGRATIONS_DIR = REPO_ROOT / "supabase" / "migrations"
|
|
14
16
|
|
|
@@ -145,7 +147,7 @@ def test_all_contracts_have_migrations():
|
|
|
145
147
|
error_msg += f"\n ... and {len(missing) - 20} more"
|
|
146
148
|
if skipped > 0:
|
|
147
149
|
error_msg += f"\n\nℹ️ Skipped {skipped} internal/transient contracts"
|
|
148
|
-
error_msg += "\n\nRun: python atdd
|
|
150
|
+
error_msg += "\n\nRun: python -m atdd.coach.commands.migration to generate"
|
|
149
151
|
pytest.fail(error_msg)
|
|
150
152
|
|
|
151
153
|
|
|
@@ -9,8 +9,10 @@ import json
|
|
|
9
9
|
import tempfile
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
13
|
+
|
|
12
14
|
# Path constants
|
|
13
|
-
REPO_ROOT =
|
|
15
|
+
REPO_ROOT = find_repo_root()
|
|
14
16
|
CONTRACTS_DIR = REPO_ROOT / "contracts"
|
|
15
17
|
|
|
16
18
|
|
|
@@ -16,9 +16,11 @@ import pytest
|
|
|
16
16
|
import re
|
|
17
17
|
from pathlib import Path
|
|
18
18
|
|
|
19
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
20
|
+
|
|
19
21
|
|
|
20
22
|
# Path constants
|
|
21
|
-
REPO_ROOT =
|
|
23
|
+
REPO_ROOT = find_repo_root()
|
|
22
24
|
PYTHON_DIR = REPO_ROOT / "python"
|
|
23
25
|
|
|
24
26
|
|
|
@@ -8,9 +8,14 @@ import pytest
|
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
import yaml
|
|
10
10
|
|
|
11
|
+
import atdd
|
|
12
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
11
13
|
|
|
12
|
-
REPO_ROOT =
|
|
13
|
-
|
|
14
|
+
REPO_ROOT = find_repo_root()
|
|
15
|
+
|
|
16
|
+
# Package resources (conventions, schemas)
|
|
17
|
+
ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
|
|
18
|
+
RED_CONVENTION = ATDD_PKG_DIR / "tester" / "conventions" / "red.convention.yaml"
|
|
14
19
|
|
|
15
20
|
|
|
16
21
|
@pytest.mark.tester
|
|
@@ -8,9 +8,14 @@ import pytest
|
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
import yaml
|
|
10
10
|
|
|
11
|
+
import atdd
|
|
12
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
11
13
|
|
|
12
|
-
REPO_ROOT =
|
|
13
|
-
|
|
14
|
+
REPO_ROOT = find_repo_root()
|
|
15
|
+
|
|
16
|
+
# Package resources (conventions, schemas)
|
|
17
|
+
ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
|
|
18
|
+
RED_CONVENTION = ATDD_PKG_DIR / "tester" / "conventions" / "red.convention.yaml"
|
|
14
19
|
|
|
15
20
|
|
|
16
21
|
@pytest.mark.tester
|
|
@@ -8,9 +8,15 @@ import pytest
|
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
import yaml
|
|
10
10
|
|
|
11
|
+
import atdd
|
|
12
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
11
13
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
|
|
15
|
+
REPO_ROOT = find_repo_root()
|
|
16
|
+
|
|
17
|
+
# Package resources (conventions, schemas)
|
|
18
|
+
ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
|
|
19
|
+
RED_CONVENTION = ATDD_PKG_DIR / "tester" / "conventions" / "red.convention.yaml"
|
|
14
20
|
|
|
15
21
|
|
|
16
22
|
@pytest.mark.tester
|
|
@@ -10,12 +10,19 @@ import re
|
|
|
10
10
|
import json
|
|
11
11
|
from jsonschema import validate, ValidationError
|
|
12
12
|
|
|
13
|
+
import atdd
|
|
14
|
+
from atdd.coach.utils.repo import find_repo_root
|
|
15
|
+
|
|
13
16
|
# Path constants
|
|
14
|
-
|
|
17
|
+
# Consumer repo artifacts
|
|
18
|
+
REPO_ROOT = find_repo_root()
|
|
15
19
|
TELEMETRY_DIR = REPO_ROOT / "telemetry"
|
|
16
20
|
CONTRACTS_DIR = REPO_ROOT / "contracts"
|
|
17
21
|
PLAN_DIR = REPO_ROOT / "plan"
|
|
18
|
-
|
|
22
|
+
|
|
23
|
+
# Package resources (conventions, schemas)
|
|
24
|
+
ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
|
|
25
|
+
META_SCHEMA_PATH = ATDD_PKG_DIR / "tester" / "schemas" / "telemetry.schema.json"
|
|
19
26
|
|
|
20
27
|
|
|
21
28
|
@pytest.fixture
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atdd
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.1
|
|
4
4
|
Summary: ATDD Platform - Acceptance Test Driven Development toolkit
|
|
5
5
|
License: MIT
|
|
6
6
|
Requires-Python: >=3.10
|
|
@@ -16,6 +16,15 @@ Dynamic: license-file
|
|
|
16
16
|
|
|
17
17
|
Acceptance Test Driven Development toolkit for structured planning and convention enforcement.
|
|
18
18
|
|
|
19
|
+
ATDD covers the full software lifecycle, not just code. It starts from a job to be done (e.g., user problem or goal), turns it into deterministic requirements, validates them with tests, and then drives implementation.
|
|
20
|
+
|
|
21
|
+
```mermaid
|
|
22
|
+
flowchart LR
|
|
23
|
+
A[Job to be Done] -->|Planner| B[Wagon + Acceptance Criteria]
|
|
24
|
+
B -->|Tester| C[RED Tests]
|
|
25
|
+
C -->|Coder| D[GREEN Code]
|
|
26
|
+
```
|
|
27
|
+
|
|
19
28
|
## Installation
|
|
20
29
|
|
|
21
30
|
### From PyPI
|
|
@@ -49,9 +58,9 @@ atdd --help
|
|
|
49
58
|
```bash
|
|
50
59
|
atdd init # Initialize ATDD in your project
|
|
51
60
|
atdd gate # ⚠️ START EVERY SESSION WITH THIS
|
|
52
|
-
atdd session new
|
|
61
|
+
atdd session new <capability> # Create a planning session
|
|
53
62
|
atdd sync # Sync rules to agent config files
|
|
54
|
-
atdd
|
|
63
|
+
atdd validate # Run all validators
|
|
55
64
|
```
|
|
56
65
|
|
|
57
66
|
> **⚠️ `atdd gate` is required.**
|
|
@@ -67,6 +76,22 @@ ATDD provides:
|
|
|
67
76
|
3. **ATDD Lifecycle** - Planner → Tester → Coder phase gates
|
|
68
77
|
4. **Agent Config Sync** - Keep ATDD rules in sync across AI agent config files
|
|
69
78
|
|
|
79
|
+
```mermaid
|
|
80
|
+
flowchart LR
|
|
81
|
+
A[Job to be Done] -->|Planner| B[Wagon + Acceptance Criteria]
|
|
82
|
+
B -->|Tester| C[RED Tests]
|
|
83
|
+
C -->|Coder| D[GREEN Code]
|
|
84
|
+
D -->|Coder| E[REFACTOR]
|
|
85
|
+
E -.->|feedback| B
|
|
86
|
+
|
|
87
|
+
subgraph "ATDD Lifecycle"
|
|
88
|
+
B
|
|
89
|
+
C
|
|
90
|
+
D
|
|
91
|
+
E
|
|
92
|
+
end
|
|
93
|
+
```
|
|
94
|
+
|
|
70
95
|
## Commands
|
|
71
96
|
|
|
72
97
|
### Project Initialization
|
|
@@ -196,19 +221,23 @@ Before starting work, confirm you have loaded these rules.
|
|
|
196
221
|
### Validation
|
|
197
222
|
|
|
198
223
|
```bash
|
|
199
|
-
atdd
|
|
200
|
-
atdd
|
|
201
|
-
atdd
|
|
202
|
-
atdd
|
|
203
|
-
atdd --quick
|
|
224
|
+
atdd validate # Run all validators
|
|
225
|
+
atdd validate planner # Planning validators only
|
|
226
|
+
atdd validate tester # Testing validators only
|
|
227
|
+
atdd validate coder # Implementation validators only
|
|
228
|
+
atdd validate --quick # Fast smoke test
|
|
229
|
+
atdd validate --coverage # With coverage report
|
|
230
|
+
atdd validate --html # With HTML report
|
|
204
231
|
```
|
|
205
232
|
|
|
206
233
|
### Other Commands
|
|
207
234
|
|
|
208
235
|
```bash
|
|
209
|
-
atdd
|
|
210
|
-
atdd
|
|
211
|
-
atdd --
|
|
236
|
+
atdd status # Platform status
|
|
237
|
+
atdd inventory # Generate artifact inventory
|
|
238
|
+
atdd inventory --format json # Inventory as JSON
|
|
239
|
+
atdd registry update # Update all registries
|
|
240
|
+
atdd --help # Full help
|
|
212
241
|
```
|
|
213
242
|
|
|
214
243
|
## Project Structure
|
|
@@ -264,7 +293,7 @@ pytest --cov=atdd --cov-report=html
|
|
|
264
293
|
|
|
265
294
|
1. Create `src/atdd/{phase}/validators/test_{name}.py`
|
|
266
295
|
2. Write pytest test functions
|
|
267
|
-
3. Run `atdd
|
|
296
|
+
3. Run `atdd validate {phase}`
|
|
268
297
|
|
|
269
298
|
Validators are auto-discovered by pytest.
|
|
270
299
|
|