atdd 0.4.0__py3-none-any.whl → 0.4.2__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.
Files changed (33) hide show
  1. atdd/coach/commands/registry.py +2 -2
  2. atdd/coach/validators/shared_fixtures.py +24 -16
  3. atdd/coder/conventions/commons.convention.yaml +1 -1
  4. atdd/coder/conventions/tests/test_component_urn_naming.py +6 -2
  5. atdd/coder/validators/test_commons_structure.py +6 -1
  6. atdd/coder/validators/test_dto_testing_patterns.py +6 -1
  7. atdd/coder/validators/test_green_cross_stack_layers.py +6 -2
  8. atdd/coder/validators/test_green_layer_dependencies.py +6 -2
  9. atdd/coder/validators/test_green_python_layer_structure.py +5 -1
  10. atdd/coder/validators/test_green_supabase_layer_structure.py +6 -2
  11. atdd/coder/validators/test_python_architecture.py +6 -1
  12. atdd/coder/validators/test_train_infrastructure.py +6 -1
  13. atdd/coder/validators/test_train_urns.py +6 -1
  14. atdd/coder/validators/test_typescript_architecture.py +7 -2
  15. atdd/coder/validators/test_wagon_boundaries.py +6 -1
  16. atdd/planner/validators/test_plan_cross_refs.py +4 -2
  17. atdd/planner/validators/test_train_validation.py +10 -8
  18. atdd/planner/validators/test_wmbt_vocabulary.py +6 -1
  19. atdd/tester/validators/test_acceptance_urn_filename_mapping.py +6 -2
  20. atdd/tester/validators/test_acceptance_urn_separator.py +6 -2
  21. atdd/tester/validators/test_contract_schema_compliance.py +6 -1
  22. atdd/tester/validators/test_dual_ac_reference.py +3 -1
  23. atdd/tester/validators/test_isolation.py +6 -1
  24. atdd/tester/validators/test_red_layer_validation.py +5 -1
  25. atdd/tester/validators/test_red_python_layer_structure.py +5 -1
  26. atdd/tester/validators/test_red_supabase_layer_structure.py +5 -1
  27. atdd/tester/validators/test_telemetry_structure.py +6 -1
  28. {atdd-0.4.0.dist-info → atdd-0.4.2.dist-info}/METADATA +1 -1
  29. {atdd-0.4.0.dist-info → atdd-0.4.2.dist-info}/RECORD +33 -33
  30. {atdd-0.4.0.dist-info → atdd-0.4.2.dist-info}/WHEEL +0 -0
  31. {atdd-0.4.0.dist-info → atdd-0.4.2.dist-info}/entry_points.txt +0 -0
  32. {atdd-0.4.0.dist-info → atdd-0.4.2.dist-info}/licenses/LICENSE +0 -0
  33. {atdd-0.4.0.dist-info → atdd-0.4.2.dist-info}/top_level.txt +0 -0
@@ -1555,6 +1555,6 @@ def main(repo_root: Path):
1555
1555
 
1556
1556
 
1557
1557
  if __name__ == "__main__":
1558
- from pathlib import Path
1559
- repo_root = Path(__file__).resolve().parents[4]
1558
+ from atdd.coach.utils.repo import find_repo_root
1559
+ repo_root = find_repo_root()
1560
1560
  main(repo_root)
@@ -3,8 +3,13 @@ Shared fixtures for platform tests.
3
3
 
4
4
  Provides schemas, file discovery, and validation utilities for E2E platform tests.
5
5
 
6
- All validators should use find_repo_root() to locate the consumer repository,
7
- NOT Path(__file__).parents[N] which points to the installed package location.
6
+ Path resolution strategy:
7
+ - REPO_ROOT (via find_repo_root()) = consumer repository artifacts (plan/, contracts/, etc.)
8
+ - ATDD_PKG_DIR (via atdd.__file__) = installed package resources (schemas, conventions)
9
+
10
+ Validators should use:
11
+ - REPO_ROOT for consumer repo artifacts (plan/, contracts/, telemetry/, web/, python/)
12
+ - ATDD_PKG_DIR for package-bundled resources (schemas, conventions, templates)
8
13
  """
9
14
  import json
10
15
  import yaml
@@ -12,53 +17,56 @@ from pathlib import Path
12
17
  from typing import Dict, Any, List, Tuple
13
18
  import pytest
14
19
 
20
+ import atdd
15
21
  from atdd.coach.utils.repo import find_repo_root
16
22
 
17
23
 
18
- # Path constants - use find_repo_root() to locate consumer repo
19
- # This works both when running from source AND when installed as a package
24
+ # Path constants
25
+ # Consumer repo artifacts - use find_repo_root() to locate consumer repository
20
26
  REPO_ROOT = find_repo_root()
21
27
  PLAN_DIR = REPO_ROOT / "plan"
22
- ATDD_DIR = REPO_ROOT / "atdd"
23
28
  CONTRACTS_DIR = REPO_ROOT / "contracts"
24
29
  TELEMETRY_DIR = REPO_ROOT / "telemetry"
25
30
  WEB_DIR = REPO_ROOT / "web"
26
31
 
32
+ # Package resources - use atdd.__file__ to locate installed package
33
+ ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
34
+
27
35
 
28
- # Schema fixtures - Planner schemas
36
+ # Schema fixtures - Planner schemas (loaded from installed package)
29
37
  @pytest.fixture(scope="module")
30
38
  def wagon_schema() -> Dict[str, Any]:
31
39
  """Load wagon.schema.json for validation."""
32
- with open(ATDD_DIR / "planner/schemas/wagon.schema.json") as f:
40
+ with open(ATDD_PKG_DIR / "planner/schemas/wagon.schema.json") as f:
33
41
  return json.load(f)
34
42
 
35
43
 
36
44
  @pytest.fixture(scope="module")
37
45
  def wmbt_schema() -> Dict[str, Any]:
38
46
  """Load wmbt.schema.json for validation."""
39
- with open(ATDD_DIR / "planner/schemas/wmbt.schema.json") as f:
47
+ with open(ATDD_PKG_DIR / "planner/schemas/wmbt.schema.json") as f:
40
48
  return json.load(f)
41
49
 
42
50
 
43
51
  @pytest.fixture(scope="module")
44
52
  def feature_schema() -> Dict[str, Any]:
45
53
  """Load feature.schema.json for validation."""
46
- with open(ATDD_DIR / "planner/schemas/feature.schema.json") as f:
54
+ with open(ATDD_PKG_DIR / "planner/schemas/feature.schema.json") as f:
47
55
  return json.load(f)
48
56
 
49
57
 
50
58
  @pytest.fixture(scope="module")
51
59
  def acceptance_schema() -> Dict[str, Any]:
52
60
  """Load acceptance.schema.json for validation."""
53
- with open(ATDD_DIR / "planner/schemas/acceptance.schema.json") as f:
61
+ with open(ATDD_PKG_DIR / "planner/schemas/acceptance.schema.json") as f:
54
62
  return json.load(f)
55
63
 
56
64
 
57
- # Schema fixtures - Tester schemas
65
+ # Schema fixtures - Tester schemas (loaded from installed package)
58
66
  @pytest.fixture(scope="module")
59
67
  def telemetry_signal_schema() -> Dict[str, Any]:
60
68
  """Load telemetry_signal.schema.json for validation."""
61
- schema_path = ATDD_DIR / "tester/schemas/telemetry_signal.schema.json"
69
+ schema_path = ATDD_PKG_DIR / "tester/schemas/telemetry_signal.schema.json"
62
70
  if schema_path.exists():
63
71
  with open(schema_path) as f:
64
72
  return json.load(f)
@@ -68,20 +76,20 @@ def telemetry_signal_schema() -> Dict[str, Any]:
68
76
  @pytest.fixture(scope="module")
69
77
  def telemetry_tracking_manifest_schema() -> Dict[str, Any]:
70
78
  """Load telemetry_tracking_manifest.schema.json for validation."""
71
- schema_path = ATDD_DIR / "tester/schemas/telemetry_tracking_manifest.schema.json"
79
+ schema_path = ATDD_PKG_DIR / "tester/schemas/telemetry_tracking_manifest.schema.json"
72
80
  if schema_path.exists():
73
81
  with open(schema_path) as f:
74
82
  return json.load(f)
75
83
  return {}
76
84
 
77
85
 
78
- # Generic schema loader
86
+ # Generic schema loader (loads from installed package)
79
87
  @pytest.fixture(scope="module")
80
88
  def load_schema():
81
89
  """Factory fixture to load any schema by path."""
82
90
  def _loader(agent: str, schema_name: str) -> Dict[str, Any]:
83
91
  """
84
- Load a schema from atdd/{agent}/schemas/{schema_name}.
92
+ Load a schema from the installed atdd package.
85
93
 
86
94
  Args:
87
95
  agent: Agent name (planner, tester, coach, coder)
@@ -90,7 +98,7 @@ def load_schema():
90
98
  Returns:
91
99
  Parsed JSON schema
92
100
  """
93
- schema_path = ATDD_DIR / agent / "schemas" / schema_name
101
+ schema_path = ATDD_PKG_DIR / agent / "schemas" / schema_name
94
102
  if not schema_path.exists():
95
103
  raise FileNotFoundError(f"Schema not found: {schema_path}")
96
104
  with open(schema_path) as f:
@@ -457,4 +457,4 @@ migration:
457
457
  commands:
458
458
  - "cd web && npx tsc --noEmit"
459
459
  - "cd web && npm test"
460
- - "./atdd/atdd.py --test coder -k commons"
460
+ - "atdd validate coder -k commons"
@@ -7,11 +7,15 @@ import pytest
7
7
  import yaml
8
8
  from pathlib import Path
9
9
 
10
+ import atdd
10
11
  from atdd.coach.utils.repo import find_repo_root
11
12
 
12
13
  REPO_ROOT = find_repo_root()
13
- COMPONENT_NAMING_PATH = REPO_ROOT / "atdd/coder/conventions/component-naming.convention.yaml"
14
- GREEN_CONV_PATH = REPO_ROOT / "atdd/coder/conventions/green.convention.yaml"
14
+
15
+ # Package resources (conventions, schemas)
16
+ ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
17
+ COMPONENT_NAMING_PATH = ATDD_PKG_DIR / "coder/conventions/component-naming.convention.yaml"
18
+ GREEN_CONV_PATH = ATDD_PKG_DIR / "coder/conventions/green.convention.yaml"
15
19
 
16
20
 
17
21
  def test_coder_convention_uses_colon_hierarchy():
@@ -18,14 +18,19 @@ import re
18
18
  from pathlib import Path
19
19
  from typing import List
20
20
 
21
+ import atdd
21
22
  from atdd.coach.utils.repo import find_repo_root
22
23
 
23
24
 
25
+ # Consumer repo artifacts
24
26
  REPO_ROOT = find_repo_root()
25
27
  PYTHON_COMMONS = REPO_ROOT / "python" / "commons"
26
28
  WEB_COMMONS = REPO_ROOT / "web" / "src" / "commons"
27
29
  WEB_SRC = REPO_ROOT / "web" / "src"
28
30
 
31
+ # Package resources (conventions, schemas)
32
+ ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
33
+
29
34
 
30
35
  # ============================================================================
31
36
  # CROSS-STACK VALIDATION
@@ -459,7 +464,7 @@ def test_structural_patterns_documented():
459
464
 
460
465
  Validates: Convention documents intentional divergence
461
466
  """
462
- convention_file = REPO_ROOT / "atdd" / "coder" / "conventions" / "commons.convention.yaml"
467
+ convention_file = ATDD_PKG_DIR / "coder" / "conventions" / "commons.convention.yaml"
463
468
 
464
469
  if not convention_file.exists():
465
470
  pytest.fail(
@@ -25,13 +25,18 @@ import ast
25
25
  from pathlib import Path
26
26
  from typing import List, Tuple, Set
27
27
 
28
+ import atdd
28
29
  from atdd.coach.utils.repo import find_repo_root
29
30
 
30
31
 
31
32
  # Path constants
33
+ # Consumer repo artifacts
32
34
  REPO_ROOT = find_repo_root()
33
35
  PYTHON_DIR = REPO_ROOT / "python"
34
- DTO_CONVENTION = REPO_ROOT / "atdd" / "coder" / "conventions" / "dto.convention.yaml"
36
+
37
+ # Package resources (conventions, schemas)
38
+ ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
39
+ DTO_CONVENTION = ATDD_PKG_DIR / "coder" / "conventions" / "dto.convention.yaml"
35
40
 
36
41
 
37
42
  def find_integration_test_files() -> List[Path]:
@@ -8,12 +8,16 @@ import pytest
8
8
  from pathlib import Path
9
9
  import yaml
10
10
 
11
+ import atdd
11
12
  from atdd.coach.utils.repo import find_repo_root
12
13
 
13
14
 
14
15
  REPO_ROOT = find_repo_root()
15
- BACKEND_CONVENTION = REPO_ROOT / "atdd" / "coder" / "conventions" / "backend.convention.yaml"
16
- FRONTEND_CONVENTION = REPO_ROOT / "atdd" / "coder" / "conventions" / "frontend.convention.yaml"
16
+
17
+ # Package resources (conventions, schemas)
18
+ ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
19
+ BACKEND_CONVENTION = ATDD_PKG_DIR / "coder" / "conventions" / "backend.convention.yaml"
20
+ FRONTEND_CONVENTION = ATDD_PKG_DIR / "coder" / "conventions" / "frontend.convention.yaml"
17
21
 
18
22
 
19
23
  @pytest.mark.coder
@@ -8,12 +8,16 @@ import pytest
8
8
  from pathlib import Path
9
9
  import yaml
10
10
 
11
+ import atdd
11
12
  from atdd.coach.utils.repo import find_repo_root
12
13
 
13
14
 
14
15
  REPO_ROOT = find_repo_root()
15
- BACKEND_CONVENTION = REPO_ROOT / "atdd" / "coder" / "conventions" / "backend.convention.yaml"
16
- FRONTEND_CONVENTION = REPO_ROOT / "atdd" / "coder" / "conventions" / "frontend.convention.yaml"
16
+
17
+ # Package resources (conventions, schemas)
18
+ ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
19
+ BACKEND_CONVENTION = ATDD_PKG_DIR / "coder" / "conventions" / "backend.convention.yaml"
20
+ FRONTEND_CONVENTION = ATDD_PKG_DIR / "coder" / "conventions" / "frontend.convention.yaml"
17
21
 
18
22
 
19
23
  @pytest.mark.coder
@@ -8,11 +8,15 @@ import pytest
8
8
  from pathlib import Path
9
9
  import yaml
10
10
 
11
+ import atdd
11
12
  from atdd.coach.utils.repo import find_repo_root
12
13
 
13
14
 
14
15
  REPO_ROOT = find_repo_root()
15
- BACKEND_CONVENTION = REPO_ROOT / "atdd" / "coder" / "conventions" / "backend.convention.yaml"
16
+
17
+ # Package resources (conventions, schemas)
18
+ ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
19
+ BACKEND_CONVENTION = ATDD_PKG_DIR / "coder" / "conventions" / "backend.convention.yaml"
16
20
 
17
21
 
18
22
  @pytest.mark.coder
@@ -8,11 +8,15 @@ import pytest
8
8
  from pathlib import Path
9
9
  import yaml
10
10
 
11
+ import atdd
11
12
  from atdd.coach.utils.repo import find_repo_root
12
13
 
13
14
  REPO_ROOT = find_repo_root()
14
- BACKEND_CONVENTION = REPO_ROOT / "atdd" / "coder" / "conventions" / "backend.convention.yaml"
15
- FRONTEND_CONVENTION = REPO_ROOT / "atdd" / "coder" / "conventions" / "frontend.convention.yaml"
15
+
16
+ # Package resources (conventions, schemas)
17
+ ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
18
+ BACKEND_CONVENTION = ATDD_PKG_DIR / "coder" / "conventions" / "backend.convention.yaml"
19
+ FRONTEND_CONVENTION = ATDD_PKG_DIR / "coder" / "conventions" / "frontend.convention.yaml"
16
20
 
17
21
 
18
22
  @pytest.mark.coder
@@ -22,13 +22,18 @@ import yaml
22
22
  from pathlib import Path
23
23
  from typing import Dict, List, Tuple
24
24
 
25
+ import atdd
25
26
  from atdd.coach.utils.repo import find_repo_root
26
27
 
27
28
 
28
29
  # Path constants
30
+ # Consumer repo artifacts
29
31
  REPO_ROOT = find_repo_root()
30
32
  PYTHON_DIR = REPO_ROOT / "python"
31
- BACKEND_CONVENTION = REPO_ROOT / "atdd" / "coder" / "conventions" / "backend.convention.yaml"
33
+
34
+ # Package resources (conventions, schemas)
35
+ ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
36
+ BACKEND_CONVENTION = ATDD_PKG_DIR / "coder" / "conventions" / "backend.convention.yaml"
32
37
 
33
38
 
34
39
  def determine_layer_from_path(file_path: Path) -> str:
@@ -24,17 +24,22 @@ import re
24
24
  from pathlib import Path
25
25
  from typing import List, Dict, Set, Tuple
26
26
 
27
+ import atdd
27
28
  from atdd.coach.utils.repo import find_repo_root
28
29
 
29
30
 
30
31
  # Path constants
32
+ # Consumer repo artifacts
31
33
  REPO_ROOT = find_repo_root()
32
34
  TRAINS_DIR = REPO_ROOT / "python" / "trains"
33
35
  WAGONS_DIR = REPO_ROOT / "python"
34
36
  GAME_PY = REPO_ROOT / "python" / "game.py"
35
37
  E2E_CONFTEST = REPO_ROOT / "e2e" / "conftest.py"
36
38
  CONTRACT_VALIDATOR = REPO_ROOT / "e2e" / "shared" / "fixtures" / "contract_validator.py"
37
- TRAIN_CONVENTION = REPO_ROOT / "atdd" / "coder" / "conventions" / "train.convention.yaml"
39
+
40
+ # Package resources (conventions, schemas)
41
+ ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
42
+ TRAIN_CONVENTION = ATDD_PKG_DIR / "coder" / "conventions" / "train.convention.yaml"
38
43
 
39
44
 
40
45
  def find_wagons() -> List[Path]:
@@ -21,14 +21,19 @@ import yaml
21
21
  from pathlib import Path
22
22
  from typing import List, Dict, Set, Tuple
23
23
 
24
+ import atdd
24
25
  from atdd.coach.utils.repo import find_repo_root
25
26
 
26
27
 
27
28
  # Path constants
29
+ # Consumer repo artifacts
28
30
  REPO_ROOT = find_repo_root()
29
31
  PYTHON_SHARED_DIR = REPO_ROOT / "python" / "shared"
30
32
  TRAINS_DIR = REPO_ROOT / "plan" / "_trains"
31
- TRAIN_CONVENTION = REPO_ROOT / "atdd" / "planner" / "conventions" / "train.convention.yaml"
33
+
34
+ # Package resources (conventions, schemas)
35
+ ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
36
+ TRAIN_CONVENTION = ATDD_PKG_DIR / "planner" / "conventions" / "train.convention.yaml"
32
37
 
33
38
 
34
39
  def find_theme_orchestrators() -> List[Path]:
@@ -23,10 +23,12 @@ import yaml
23
23
  from pathlib import Path
24
24
  from typing import Dict, List, Set, Tuple
25
25
 
26
+ import atdd
26
27
  from atdd.coach.utils.repo import find_repo_root
27
28
 
28
29
 
29
30
  # Path constants
31
+ # Consumer repo artifacts
30
32
  REPO_ROOT = find_repo_root()
31
33
  TS_DIRS = [
32
34
  REPO_ROOT / "supabase" / "functions",
@@ -34,8 +36,11 @@ TS_DIRS = [
34
36
  REPO_ROOT / "frontend",
35
37
  REPO_ROOT / "web",
36
38
  ]
37
- FRONTEND_CONVENTION = REPO_ROOT / "atdd" / "coder" / "conventions" / "frontend.convention.yaml"
38
- BACKEND_CONVENTION = REPO_ROOT / "atdd" / "coder" / "conventions" / "backend.convention.yaml"
39
+
40
+ # Package resources (conventions, schemas)
41
+ ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
42
+ FRONTEND_CONVENTION = ATDD_PKG_DIR / "coder" / "conventions" / "frontend.convention.yaml"
43
+ BACKEND_CONVENTION = ATDD_PKG_DIR / "coder" / "conventions" / "backend.convention.yaml"
39
44
 
40
45
 
41
46
  def load_conventions() -> Tuple[Dict, Dict]:
@@ -27,13 +27,18 @@ from pathlib import Path
27
27
  from typing import List, Tuple, Set
28
28
  import ast
29
29
 
30
+ import atdd
30
31
  from atdd.coach.utils.repo import find_repo_root
31
32
 
32
33
  # Path constants
34
+ # Consumer repo artifacts
33
35
  REPO_ROOT = find_repo_root()
34
36
  PYTHON_DIR = REPO_ROOT / "python"
35
37
  PYPROJECT_TOML = PYTHON_DIR / "pyproject.toml"
36
- BOUNDARIES_CONVENTION = REPO_ROOT / "atdd" / "coder" / "conventions" / "boundaries.convention.yaml"
38
+
39
+ # Package resources (conventions, schemas)
40
+ ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
41
+ BOUNDARIES_CONVENTION = ATDD_PKG_DIR / "coder" / "conventions" / "boundaries.convention.yaml"
37
42
 
38
43
 
39
44
  def find_test_files() -> List[Path]:
@@ -5,8 +5,11 @@ Validates that cross-references between wagons, trains, and artifacts are cohere
5
5
  Tests ensure that consume references point to valid produce artifacts.
6
6
  """
7
7
  import pytest
8
+ from pathlib import Path
8
9
  from typing import Dict, Set, List, Tuple, Any
9
10
 
11
+ from atdd.coach.utils.repo import find_repo_root
12
+
10
13
 
11
14
  @pytest.mark.platform
12
15
  @pytest.mark.e2e
@@ -117,8 +120,7 @@ def test_trains_reference_valid_wagons(trains_registry, wagon_manifests):
117
120
  # Load individual train file if path exists
118
121
  if train_path:
119
122
  import yaml
120
- from pathlib import Path
121
- train_file = Path(__file__).resolve().parents[4] / train_path
123
+ train_file = find_repo_root() / train_path
122
124
 
123
125
  if train_file.exists():
124
126
  with open(train_file) as f:
@@ -13,6 +13,8 @@ import yaml
13
13
  from pathlib import Path
14
14
  from typing import Dict, List, Set, Tuple
15
15
 
16
+ from atdd.coach.utils.repo import find_repo_root
17
+
16
18
 
17
19
  @pytest.mark.platform
18
20
  def test_train_ids_follow_numbering_convention(trains_registry):
@@ -91,7 +93,7 @@ def test_train_files_exist_for_registry_entries(trains_registry):
91
93
  When: Checking for train files
92
94
  Then: Each train has a file at plan/_trains/{train_id}.yaml
93
95
  """
94
- repo_root = Path(__file__).resolve().parents[4]
96
+ repo_root = find_repo_root()
95
97
  trains_dir = repo_root / "plan" / "_trains"
96
98
 
97
99
  missing_files = []
@@ -121,7 +123,7 @@ def test_all_train_files_registered(trains_registry):
121
123
  When: Checking registry
122
124
  Then: Each file is registered in plan/_trains.yaml
123
125
  """
124
- repo_root = Path(__file__).resolve().parents[4]
126
+ repo_root = find_repo_root()
125
127
  trains_dir = repo_root / "plan" / "_trains"
126
128
 
127
129
  # Get all registered train IDs
@@ -153,7 +155,7 @@ def test_train_id_matches_filename(trains_registry):
153
155
  When: Loading train data
154
156
  Then: train_id field matches filename (without .yaml)
155
157
  """
156
- repo_root = Path(__file__).resolve().parents[4]
158
+ repo_root = find_repo_root()
157
159
  trains_dir = repo_root / "plan" / "_trains"
158
160
 
159
161
  mismatches = []
@@ -183,7 +185,7 @@ def test_train_wagons_exist(trains_registry, wagon_manifests):
183
185
  When: Checking wagon references
184
186
  Then: Each wagon exists in registry or has a manifest in plan/*
185
187
  """
186
- repo_root = Path(__file__).resolve().parents[4]
188
+ repo_root = find_repo_root()
187
189
  trains_dir = repo_root / "plan" / "_trains"
188
190
 
189
191
  # Build wagon name set from manifests
@@ -231,7 +233,7 @@ def test_train_dependencies_are_valid(trains_registry):
231
233
  When: Checking dependency references
232
234
  Then: Each dependency points to a valid train_id
233
235
  """
234
- repo_root = Path(__file__).resolve().parents[4]
236
+ repo_root = find_repo_root()
235
237
  trains_dir = repo_root / "plan" / "_trains"
236
238
 
237
239
  # Get all valid train IDs
@@ -287,7 +289,7 @@ def test_train_artifacts_follow_naming_convention(trains_registry):
287
289
  """
288
290
  import re
289
291
 
290
- repo_root = Path(__file__).resolve().parents[4]
292
+ repo_root = find_repo_root()
291
293
  trains_dir = repo_root / "plan" / "_trains"
292
294
 
293
295
  pattern = re.compile(r"^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*)+(?:\.[a-z][a-z0-9-]*)*$")
@@ -355,7 +357,7 @@ def test_train_artifacts_exist_in_wagons(trains_registry, wagon_manifests):
355
357
  Then: Each artifact should be in wagon produce/consume lists
356
358
  Note: Soft check - external/system artifacts are allowed
357
359
  """
358
- repo_root = Path(__file__).resolve().parents[4]
360
+ repo_root = find_repo_root()
359
361
  trains_dir = repo_root / "plan" / "_trains"
360
362
 
361
363
  # Build artifact index from wagons
@@ -488,7 +490,7 @@ def test_trains_match_schema(trains_registry):
488
490
  from jsonschema import Draft7Validator
489
491
  import json
490
492
 
491
- repo_root = Path(__file__).resolve().parents[4]
493
+ repo_root = find_repo_root()
492
494
  schema_path = repo_root / ".claude" / "schemas" / "planner" / "train.schema.json"
493
495
  trains_dir = repo_root / "plan" / "_trains"
494
496
 
@@ -23,12 +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
26
27
  from atdd.coach.utils.repo import find_repo_root
27
28
 
28
29
  # Path constants
30
+ # Consumer repo artifacts
29
31
  REPO_ROOT = find_repo_root()
30
32
  PLAN_DIR = REPO_ROOT / "plan"
31
- WMBT_CONVENTION = REPO_ROOT / "atdd" / "planner" / "conventions" / "wmbt.convention.yaml"
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"
32
37
 
33
38
 
34
39
  # Authorized vocabulary from convention
@@ -13,11 +13,15 @@ import re
13
13
  from pathlib import Path
14
14
  import pytest
15
15
 
16
+ import atdd
16
17
  from atdd.coach.utils.repo import find_repo_root
17
18
 
18
19
 
19
20
  REPO_ROOT = find_repo_root()
20
21
 
22
+ # Package resources
23
+ ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
24
+
21
25
 
22
26
  # SPEC-TESTER-CONV-0069: Dart URN to filename mapping
23
27
  def test_dart_urn_to_filename():
@@ -299,8 +303,8 @@ def test_python_files_match_convention():
299
303
 
300
304
  test_dirs = [
301
305
  REPO_ROOT / "tests",
302
- REPO_ROOT / "atdd" / "coach" / "validators",
303
- REPO_ROOT / "atdd" / "tester" / "validators",
306
+ ATDD_PKG_DIR / "coach" / "validators",
307
+ ATDD_PKG_DIR / "tester" / "validators",
304
308
  ]
305
309
 
306
310
  violations = []
@@ -24,12 +24,16 @@ import yaml
24
24
  import re
25
25
  from pathlib import Path
26
26
 
27
+ import atdd
27
28
  from atdd.coach.utils.repo import find_repo_root
28
29
 
29
30
  # Path constants
30
31
  REPO_ROOT = find_repo_root()
31
- CONVENTIONS_DIR = REPO_ROOT / "atdd" / "planner" / "conventions"
32
- SCHEMAS_DIR = REPO_ROOT / "atdd" / "planner" / "schemas"
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"
33
37
 
34
38
 
35
39
  # SPEC-COACH-UTILS-0282
@@ -12,13 +12,18 @@ import re
12
12
  from pathlib import Path
13
13
  from jsonschema import validate, ValidationError, Draft7Validator
14
14
 
15
+ import atdd
15
16
  from atdd.coach.utils.repo import find_repo_root
16
17
 
17
18
  # Path constants
19
+ # Consumer repo artifacts
18
20
  REPO_ROOT = find_repo_root()
19
21
  CONTRACTS_DIR = REPO_ROOT / "contracts"
20
22
  PLAN_DIR = REPO_ROOT / "plan"
21
- META_SCHEMA_PATH = REPO_ROOT / "atdd" / "tester" / "schemas" / "contract.schema.json"
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"
22
27
 
23
28
 
24
29
  @pytest.fixture
@@ -15,8 +15,10 @@ import pytest
15
15
  import re
16
16
  from pathlib import Path
17
17
 
18
+ from atdd.coach.utils.repo import find_repo_root
19
+
18
20
 
19
- # Path constants
21
+ # Path constants - consumer repo artifacts
20
22
  REPO_ROOT = find_repo_root()
21
23
  PYTHON_DIR = REPO_ROOT / "python"
22
24
 
@@ -17,15 +17,20 @@ import ast
17
17
  from pathlib import Path
18
18
  from typing import List, Set, Tuple
19
19
 
20
+ import atdd
20
21
  from atdd.coach.utils.repo import find_repo_root
21
22
 
22
23
 
23
24
  # Path constants
24
25
  REPO_ROOT = find_repo_root()
26
+
27
+ # Package resources
28
+ ATDD_PKG_DIR = Path(atdd.__file__).resolve().parent
29
+
25
30
  TEST_DIRS = [
26
31
  REPO_ROOT / "test",
27
32
  REPO_ROOT / "tests",
28
- REPO_ROOT / "atdd",
33
+ ATDD_PKG_DIR, # Validators in installed package
29
34
  ]
30
35
 
31
36
 
@@ -8,10 +8,14 @@ import pytest
8
8
  from pathlib import Path
9
9
  import yaml
10
10
 
11
+ import atdd
11
12
  from atdd.coach.utils.repo import find_repo_root
12
13
 
13
14
  REPO_ROOT = find_repo_root()
14
- RED_CONVENTION = REPO_ROOT / "atdd" / "tester" / "conventions" / "red.convention.yaml"
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"
15
19
 
16
20
 
17
21
  @pytest.mark.tester
@@ -8,10 +8,14 @@ import pytest
8
8
  from pathlib import Path
9
9
  import yaml
10
10
 
11
+ import atdd
11
12
  from atdd.coach.utils.repo import find_repo_root
12
13
 
13
14
  REPO_ROOT = find_repo_root()
14
- RED_CONVENTION = REPO_ROOT / "atdd" / "tester" / "conventions" / "red.convention.yaml"
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"
15
19
 
16
20
 
17
21
  @pytest.mark.tester
@@ -8,11 +8,15 @@ import pytest
8
8
  from pathlib import Path
9
9
  import yaml
10
10
 
11
+ import atdd
11
12
  from atdd.coach.utils.repo import find_repo_root
12
13
 
13
14
 
14
15
  REPO_ROOT = find_repo_root()
15
- RED_CONVENTION = REPO_ROOT / "atdd" / "tester" / "conventions" / "red.convention.yaml"
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"
16
20
 
17
21
 
18
22
  @pytest.mark.tester
@@ -10,14 +10,19 @@ import re
10
10
  import json
11
11
  from jsonschema import validate, ValidationError
12
12
 
13
+ import atdd
13
14
  from atdd.coach.utils.repo import find_repo_root
14
15
 
15
16
  # Path constants
17
+ # Consumer repo artifacts
16
18
  REPO_ROOT = find_repo_root()
17
19
  TELEMETRY_DIR = REPO_ROOT / "telemetry"
18
20
  CONTRACTS_DIR = REPO_ROOT / "contracts"
19
21
  PLAN_DIR = REPO_ROOT / "plan"
20
- META_SCHEMA_PATH = REPO_ROOT / "atdd" / "tester" / "schemas" / "telemetry.schema.json"
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"
21
26
 
22
27
 
23
28
  @pytest.fixture
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atdd
3
- Version: 0.4.0
3
+ Version: 0.4.2
4
4
  Summary: ATDD Platform - Acceptance Test Driven Development toolkit
5
5
  License: MIT
6
6
  Requires-Python: >=3.10
@@ -14,7 +14,7 @@ atdd/coach/commands/initializer.py,sha256=s7NnITF4c6xGlN6ZJVjyv4a4jxGMjK9OPG1C-O
14
14
  atdd/coach/commands/interface.py,sha256=FwBrJpWkfSL9n4n0HT_EC-alseXgU0bweKD4TImyHN0,40483
15
15
  atdd/coach/commands/inventory.py,sha256=qU42MnkXt1JSBh5GU7pPSKmCO27Zfga7XwMT19RquJE,20969
16
16
  atdd/coach/commands/migration.py,sha256=wRxU7emvvHqWt1MvXKkNTkPBjp0sU9g8F5Uy5yV2YfI,8177
17
- atdd/coach/commands/registry.py,sha256=r1QWg841eK6bS4vEbYEviylDCpFkInUVMTsf5h4ArrQ,58344
17
+ atdd/coach/commands/registry.py,sha256=76-Pe3_cN483JR1pXUdDIE5WSZjWtVV0Jl8dRtRw_9Y,58349
18
18
  atdd/coach/commands/session.py,sha256=MhuWXd5TR6bB3w0t8vANeZx3L476qwLT6EUQMwg-wQA,14268
19
19
  atdd/coach/commands/sync.py,sha256=4HNzg8AVaePDwhyBlQcywvNVZDP5NIW8TBsEPbqmJuQ,12545
20
20
  atdd/coach/commands/test_interface.py,sha256=a7ut2Hhk0PnQ5LfJZkoQwfkfkVuB5OHA4QBwOS0-jcg,16870
@@ -34,7 +34,7 @@ atdd/coach/utils/repo.py,sha256=0kiF5WpVTen0nO14u5T0RflznZhgGco2i9CwKobOh38,3757
34
34
  atdd/coach/utils/graph/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  atdd/coach/utils/graph/urn.py,sha256=O2AHIB_CmmMUvXzyejc_oFReNW_rOcw7m4qaqSYcnNQ,33558
36
36
  atdd/coach/validators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- atdd/coach/validators/shared_fixtures.py,sha256=ZWZl6vyny8bv4BehJwPAz_Czld1mR3u_SLgC8uL4bhc,12142
37
+ atdd/coach/validators/shared_fixtures.py,sha256=tdqAb4675P-oOCL08mvSCG9XpmwMCjL9iSq1W5U7-wk,12558
38
38
  atdd/coach/validators/test_enrich_wagon_registry.py,sha256=WeTwYJqoNY6mEYc-QAvQo7YVagSOjaNKxB6Q6dpWqIM,6561
39
39
  atdd/coach/validators/test_registry.py,sha256=ffN70yA_1xxL3R8gdpGbY2M8dQXyuajIZhBZ-ylNiNs,17845
40
40
  atdd/coach/validators/test_session_validation.py,sha256=0VszXtFwRTO04b5CxDPO3klk0VfiqlpdbNpshjMn-qU,39079
@@ -45,7 +45,7 @@ atdd/coder/__init__.py,sha256=Rmi5S7Pzx7qsRe5MC66GduNGmkssWWnElkVvvNHFDgU,45
45
45
  atdd/coder/conventions/adapter.recipe.yaml,sha256=Ss9OJJ-FEP8TU_D-N6X_1nO-Karb-Cg5OopL9_gLjMI,3039
46
46
  atdd/coder/conventions/backend.convention.yaml,sha256=fWUUph6iGeItRBrL-Hhma2e7dLSwzI4NgpAkb7985Wg,16600
47
47
  atdd/coder/conventions/boundaries.convention.yaml,sha256=FTv9V-67g-CM2SvopQuA8sMXufiIDRJT4CAIzKcDPYc,25513
48
- atdd/coder/conventions/commons.convention.yaml,sha256=9bjnbijIbm5kAY7LAiM_dBPBJXSATyhAnsZxlHRoLHo,17317
48
+ atdd/coder/conventions/commons.convention.yaml,sha256=zwfO4dYNrFjy4MLZ9RLK3Yd7gotTWYdFfXMPp3EfU0A,17309
49
49
  atdd/coder/conventions/complexity.recipe.yaml,sha256=fjVnsb0kGGstTDKTaeYO_1XJ3408wE0lheAxf02Hm3s,3636
50
50
  atdd/coder/conventions/component-naming.convention.yaml,sha256=w1LKJM7lhmpFqBCpRAvx03Z_Ugujd3P6rFfmp5xbhg0,7444
51
51
  atdd/coder/conventions/design.convention.yaml,sha256=HfuuAmAnFa2cALsxcdDp1DOTJFZ05PAw2Vi9ycXGC0k,11484
@@ -63,31 +63,31 @@ atdd/coder/conventions/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
63
63
  atdd/coder/conventions/tests/test_adapter_recipe.py,sha256=293CU9rj7z6bj_1Wh02VhVCslaHfK-KeMJFgKgK7cvM,9370
64
64
  atdd/coder/conventions/tests/test_complexity_recipe.py,sha256=xz-SbIjPRLRdiydRhX1rkHg1aszWyxjo5bJVa5gGohU,9123
65
65
  atdd/coder/conventions/tests/test_component_taxonomy.py,sha256=ur_vVh_4G30cYcUEF_Lo0-F9Szno3qNHMuOQyxj7pSI,14037
66
- atdd/coder/conventions/tests/test_component_urn_naming.py,sha256=XAROfe-fpkY49vIRf8w-4ivj7hvYomrmWKmJ2uZ6Snk,6367
66
+ atdd/coder/conventions/tests/test_component_urn_naming.py,sha256=lYrHzBtSpjfVS0Dd57_2Xvnvf2qky_diXPv2eJ1Ys-Q,6471
67
67
  atdd/coder/conventions/tests/test_thinness_recipe.py,sha256=cO2BpGnlN62rwje43e-zoh1mADqrtQadPeqRARM9_YE,8702
68
68
  atdd/coder/schemas/design_system.schema.json,sha256=KgHxYa3DeNZdXwn17WniTPN-T-ALdHJpk96YZv4WapU,10101
69
69
  atdd/coder/validators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
- atdd/coder/validators/test_commons_structure.py,sha256=MSoofMREjdWXsaoy2zvloiBzxk1J80FEOcpd7ed22fs,15449
70
+ atdd/coder/validators/test_commons_structure.py,sha256=vxNa0-BIOr30Nb4WcmzDS5aJVE9ozJpGeplSdzjalMs,15577
71
71
  atdd/coder/validators/test_complexity.py,sha256=jWDLOUfs66L4vrzWJ41qJTA_AVOeZzXKW94SqMz80I4,12310
72
72
  atdd/coder/validators/test_cross_language_consistency.py,sha256=FTHJByvA_zJmJyK8VAK9h0EZaKafP6FmQn9wuoySlks,13204
73
73
  atdd/coder/validators/test_design_system_compliance.py,sha256=UA9UwzbayiXnIgYwcQmb4Z7wbntN2oCxOc7eaAeFK6U,14541
74
- atdd/coder/validators/test_dto_testing_patterns.py,sha256=JMdUWsn0yviOVtMo7zbJ6r3lZbj4SkhSBIIIQ940pE8,9429
75
- atdd/coder/validators/test_green_cross_stack_layers.py,sha256=OS337t0x3yEITYqS0Q-qCXS9jT_Izz9ctvW3McF90zo,6822
76
- atdd/coder/validators/test_green_layer_dependencies.py,sha256=xovqlIygF6PTwtflXxPIkWMfwQsbkgqLwsFVFzq3s3E,5530
77
- atdd/coder/validators/test_green_python_layer_structure.py,sha256=NCOd7X-TzDP-EnF08CR8NZLG-91tFVwLWMag2I2jgTA,4287
78
- atdd/coder/validators/test_green_supabase_layer_structure.py,sha256=Sn2PK6DfrzJPzXH7Sp24qIs-YtTKtkIbmLrNU_mR7Jg,4275
74
+ atdd/coder/validators/test_dto_testing_patterns.py,sha256=usD2xA14mvYIa_piUF9-PLmjKXcpBXqrz5Z6LRo83Nk,9557
75
+ atdd/coder/validators/test_green_cross_stack_layers.py,sha256=xBgAL4bWLZl0acG60lU2MNI7gYiRWsi8gAsNbIQo1eQ,6918
76
+ atdd/coder/validators/test_green_layer_dependencies.py,sha256=8TWuTD3RrDBqp9LUCSU1gnRzT5c_PG2MD74_k9XtxyI,5626
77
+ atdd/coder/validators/test_green_python_layer_structure.py,sha256=WXo1VA5-WprgtAQgC8ekhuIRJR47b_qgTYTjPn7svms,4389
78
+ atdd/coder/validators/test_green_supabase_layer_structure.py,sha256=cLj85acLX6Knewk9AWbiJDwEzoaE-NBNollyJCvRUD0,4371
79
79
  atdd/coder/validators/test_import_boundaries.py,sha256=3kzVMKIwZU9FcS0YLU8gsuHSDRlRr2rU3UPgoraV2FU,11811
80
80
  atdd/coder/validators/test_init_file_urns.py,sha256=uDJ2MgfJNFcjzoIKItn73n9V08m3ZBkt1SAZgHWdXPs,17914
81
81
  atdd/coder/validators/test_preact_layer_boundaries.py,sha256=rabXY9gif3b8QH9_Kz5Pu6FZSvDpfQKDm_SKjdpLD44,7766
82
82
  atdd/coder/validators/test_presentation_convention.py,sha256=ceAtg_sTEJiPkHVfnwBEDTzTH44nKQIiukIEvZz8r18,10037
83
- atdd/coder/validators/test_python_architecture.py,sha256=NCMUPqgaUUPAvpkzLYb1mgjnznjhXnu5Mw0njRawexI,25115
83
+ atdd/coder/validators/test_python_architecture.py,sha256=USnSujKVu7_BC2ij-pTSHyiFi4iBMBemIPR7oXYQ3B4,25243
84
84
  atdd/coder/validators/test_quality_metrics.py,sha256=vLWPfL0x9sfCvKXO4uECW61RnJTsjbmuEUjCsBcUmuA,12551
85
85
  atdd/coder/validators/test_station_master_pattern.py,sha256=biYwXAftpXdhIhDjn2RrVTdEdvTWPW5ddm2gQubJBXQ,9280
86
- atdd/coder/validators/test_train_infrastructure.py,sha256=lABiut9zV5IQP_E-41aOOeSXasuNtZz_XXBEwsAj0yI,16073
87
- atdd/coder/validators/test_train_urns.py,sha256=rDz6YHtJx3RWZrBNB0AOuRkWwbr3mvDIIk9z_V1Qmzk,9971
88
- atdd/coder/validators/test_typescript_architecture.py,sha256=Idnx1Ux551TcC5DVFquz_DHSpcTI9yy13Y0UKxQbl54,22054
86
+ atdd/coder/validators/test_train_infrastructure.py,sha256=e9oyWjGR7YoEQZPza8xHzLHN-wrqiJTbNc9Y0BLlGLw,16201
87
+ atdd/coder/validators/test_train_urns.py,sha256=TvSNHbvG8SAtAPaS2K8mMgzE8GbJtrTaF4iEgkJEIIk,10099
88
+ atdd/coder/validators/test_typescript_architecture.py,sha256=gi76IwlqX_MpWsr8CXWH7v16KAoud-1OY92iuN-0BpU,22176
89
89
  atdd/coder/validators/test_usecase_structure.py,sha256=nAeqmLWRCstXT8fDuxqk6iVcH4TLHjTvlaGDpanD9sM,14077
90
- atdd/coder/validators/test_wagon_boundaries.py,sha256=dxVCXRWK6Cc_CknRwoGC2y8-JOLq3Q_UsFJDT_N4oqA,20562
90
+ atdd/coder/validators/test_wagon_boundaries.py,sha256=SgqGfQKR91qf7fkPl7Ye1RKQ5CcqoyukAdWK3xqV3Ns,20690
91
91
  atdd/planner/__init__.py,sha256=ZXzKPNqP_JgEeFnwwUAKfIwz2e1i2gwrmz1SyC65sl4,47
92
92
  atdd/planner/conventions/acceptance.convention.yaml,sha256=q_1hm-uJ2Sbh6VqGHQ543L9NTnOuS2UGWT-n9uAdfmM,21918
93
93
  atdd/planner/conventions/appendix.convention.yaml,sha256=wuv9mnSZ-L1vUp2xx0OmyOsYurApitsmO_MilLVGcOc,9394
@@ -110,14 +110,14 @@ atdd/planner/schemas/wmbt.schema.json,sha256=KU_D6r0kQTJod-XHQT5QiiHcUUPJrLgg3aP
110
110
  atdd/planner/validators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
111
  atdd/planner/validators/conftest.py,sha256=CVr3m9mv4xc8G6azcdbZ1VArVvLZw2Utqt2EIOyYdbQ,155
112
112
  atdd/planner/validators/test_draft_wagon_registry.py,sha256=Bt4xTjgKddEnnxNOMh8jWhvb3aqRaWGBd227Vv3rWz0,13798
113
- atdd/planner/validators/test_plan_cross_refs.py,sha256=MlRMuM_eo3h8Q1pOdcvxyRNqRie9xPiYamOeofwiKaM,9505
113
+ atdd/planner/validators/test_plan_cross_refs.py,sha256=kxlq1uZ2u4mn3r8wHJjXVJsB8nmzwsvSzOlRapJ9pBY,9520
114
114
  atdd/planner/validators/test_plan_uniqueness.py,sha256=rlC5khAoBkgpTZJdyHi1JbDUj14v1JiGBFv2iV_AP_Y,7735
115
115
  atdd/planner/validators/test_plan_urn_resolution.py,sha256=GoxFiRjOfp69FUmIyKGnsGgpYalOz3qfp6qjyCkga44,9440
116
116
  atdd/planner/validators/test_plan_wagons.py,sha256=l4jbHf9Kg-Fy8Gz5O8BO7PDQKbbeLN0uctoErPK_YKI,7357
117
- atdd/planner/validators/test_train_validation.py,sha256=13j5hx_bcBhf3xFeqCJGo79y8lN9xpNEXXRzjV17tHQ,16972
117
+ atdd/planner/validators/test_train_validation.py,sha256=KsAMxtuyipHse02x91k4rLWUxRiHW29sYBWZ6KNbfJ4,16870
118
118
  atdd/planner/validators/test_wagon_urn_chain.py,sha256=KY_0vrj6CoiQJ80WbqfCGCYbup13cVssaxbNO0eVf74,26697
119
119
  atdd/planner/validators/test_wmbt_consistency.py,sha256=jdfu4xWEozzBGwplKDXxuDQNLBDxB_AC96NHLkyHqQ8,10875
120
- atdd/planner/validators/test_wmbt_vocabulary.py,sha256=BWXxa2yUIVFC467Jui88ORmlE8lWulqY7vmGr8usZhc,18675
120
+ atdd/planner/validators/test_wmbt_vocabulary.py,sha256=PCivTzV7ntlZBa-PVzpBwEiKqLumsEZXfj1r2xl9usM,18803
121
121
  atdd/tester/__init__.py,sha256=Y08g-sPqui6fz9ziRFyH5EFt_cGN9-_qrgBLXTy0tSs,46
122
122
  atdd/tester/conventions/artifact.convention.yaml,sha256=6OJHM3scQeVOrSM3DVJH_D6DTGJ8Mdd7gQhf5hGoRvQ,8434
123
123
  atdd/tester/conventions/contract.convention.yaml,sha256=oByzcBZivn-xUHbMg0OeebHeNx5-gwQJwfUDZ_OUgxA,34832
@@ -161,29 +161,29 @@ atdd/tester/validators/conftest.py,sha256=0kQ1VXYWQArkWMB97eTBuviTmEYx69bHhMt4rl
161
161
  atdd/tester/validators/coverage_gap_report.py,sha256=rNztpPLYl8zf61xVGE-C_cPJ6sOWc3Ji2R0lUQUDjw0,10183
162
162
  atdd/tester/validators/fix_dual_ac_references.py,sha256=AlkM7Gj0Bg0Mr2x6tPmzD8pg_6aZygOmsRuQ0xQh4SY,4906
163
163
  atdd/tester/validators/remove_duplicate_lines.py,sha256=BdU33gziYYlJQPRXm69XWg-K2zz7J4QZ8BNXQYR7Yp8,2525
164
- atdd/tester/validators/test_acceptance_urn_filename_mapping.py,sha256=_LjJIq3jvpk7zE-3uvsVd2icyCgEG9HjP-7xn3VzVs4,12854
165
- atdd/tester/validators/test_acceptance_urn_separator.py,sha256=auCuztjpS0qnP82J7gBYoCX6HhxxVZkvC4PNb1rLOCg,6878
164
+ atdd/tester/validators/test_acceptance_urn_filename_mapping.py,sha256=7nANiDY7tbqNuUCmRvuzbIKJx1lQIt2fEcjGSkILOGE,12927
165
+ atdd/tester/validators/test_acceptance_urn_separator.py,sha256=bzRk-CtWtfy87Tf8i0z5LovnA0TqNzztAzmud5HGE50,6974
166
166
  atdd/tester/validators/test_artifact_naming_category.py,sha256=V7AOamSUIbpl6bO_Qj3h_46vc2hsh6OVPCMco1H7zTc,12541
167
- atdd/tester/validators/test_contract_schema_compliance.py,sha256=rzBisGK0cbjU4hFUNBpW6RWSe-hKfRXkKlKW65ucbNI,26134
167
+ atdd/tester/validators/test_contract_schema_compliance.py,sha256=9kWmg1Kb1GJZpt8n3L8DEPZGh9_vaMZ86n3_MAtQW1g,26262
168
168
  atdd/tester/validators/test_contract_security.py,sha256=fKNaevmbSAoGyOKBhPnHw5xSGXptG0ciS0__qtO9Qac,19541
169
169
  atdd/tester/validators/test_contracts_structure.py,sha256=RRmIzcbwwBtZDVio558TQt-SBjiVOgb79j8aFR4FRbw,9815
170
170
  atdd/tester/validators/test_coverage_adequacy.py,sha256=gIaz1LJahSGSn-t-42hTeJochVBJFA4kE7Z_LBg7dtk,27057
171
- atdd/tester/validators/test_dual_ac_reference.py,sha256=5llpy4gFn0VtWn8KCPFHdE3EoWewB2orjcwrtk5XInU,8919
171
+ atdd/tester/validators/test_dual_ac_reference.py,sha256=LDhIqXyVxgWVCgj7FneDTLt6DrZe0lAtCtAKqFlAPck,8995
172
172
  atdd/tester/validators/test_fixture_validity.py,sha256=Fp4AWwhvZlos1ik_d7NbP030Qq-klZLnCmc12ylptqs,12101
173
- atdd/tester/validators/test_isolation.py,sha256=0Dw4ERL5xKrSscSXLdYaZNemFLmonrWrXAtSenp2aLE,16374
173
+ atdd/tester/validators/test_isolation.py,sha256=NYrqJcVDZH0SDRWHlPdazG6THT4w3XEvz_xn4PBxU4E,16489
174
174
  atdd/tester/validators/test_migration_coverage.py,sha256=LOx0L9KLH4gVisNHXhxKrzHLgCgj4PVZxeZ-2gg-SQk,7344
175
175
  atdd/tester/validators/test_migration_criteria.py,sha256=YDGvWjkVSjUVVNv4RJWLdy4iLoG1EXzmm_ficD0Gt3Q,7896
176
176
  atdd/tester/validators/test_migration_generation.py,sha256=wpTmuxvM13OfSgC-3SJBdtB2XaPjBYyD-jXVYWi7Z9Q,4064
177
177
  atdd/tester/validators/test_python_test_naming.py,sha256=4dXlHYTeTt34r5AjXIeGbZuMy6_Eh73kq1ksmQhI5qo,14413
178
- atdd/tester/validators/test_red_layer_validation.py,sha256=R5aDBxgwUGI6-rQKMhRSHakXLT95stHRpBljtRyrodE,3495
179
- atdd/tester/validators/test_red_python_layer_structure.py,sha256=_UHi5VMbYkRAWFMULZsAjHEUY5F2kU50rlxaP-mvJWk,3365
180
- atdd/tester/validators/test_red_supabase_layer_structure.py,sha256=Sm9zycJCLsaMLT-NuDIXC8gLXBLomvKNVWlShHRsowA,3734
181
- atdd/tester/validators/test_telemetry_structure.py,sha256=i22GY0C6X9or8ErRfPn8Dsge0MfwvkgONVs_24vch-4,22498
178
+ atdd/tester/validators/test_red_layer_validation.py,sha256=otqohLMayIK4nPPF2fl-O2dFvVmbmfFNT7HugbGZ3lA,3597
179
+ atdd/tester/validators/test_red_python_layer_structure.py,sha256=5p6mTieijO7MpZGuVODYm9acKkMJ1XeMYDZ3gxPGW0k,3467
180
+ atdd/tester/validators/test_red_supabase_layer_structure.py,sha256=zbUjsMWSJE1MPnLQx6Hk2lvMgNmMVUKq8a0rwKnp7Lo,3836
181
+ atdd/tester/validators/test_telemetry_structure.py,sha256=uU5frZnxSlOn60iHyqhe7Pg9b0wrOV7N14D4S6Aw6TE,22626
182
182
  atdd/tester/validators/test_typescript_test_naming.py,sha256=E-TyGv_GVlTfsbyuxrtv9sOWSZS_QcpH6rrJFbWoeeU,11280
183
183
  atdd/tester/validators/test_typescript_test_structure.py,sha256=eV89SD1RaKtchBZupqhnJmaruoROosf3LwB4Fwe4UJI,2612
184
- atdd-0.4.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
185
- atdd-0.4.0.dist-info/METADATA,sha256=fp4vKeLQzjbW1xNKx56BH2raEnIce4OEhX9Sy8N5MaA,8013
186
- atdd-0.4.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
187
- atdd-0.4.0.dist-info/entry_points.txt,sha256=-C3yrA1WQQfN3iuGmSzPapA5cKVBEYU5Q1HUffSJTbY,38
188
- atdd-0.4.0.dist-info/top_level.txt,sha256=VKkf6Uiyrm4RS6ULCGM-v8AzYN8K2yg8SMqwJLoO-xs,5
189
- atdd-0.4.0.dist-info/RECORD,,
184
+ atdd-0.4.2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
185
+ atdd-0.4.2.dist-info/METADATA,sha256=u367DyQRsEduvaTko1XLLX7sfVQZSmvC8Gmrr5tRSVE,8013
186
+ atdd-0.4.2.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
187
+ atdd-0.4.2.dist-info/entry_points.txt,sha256=-C3yrA1WQQfN3iuGmSzPapA5cKVBEYU5Q1HUffSJTbY,38
188
+ atdd-0.4.2.dist-info/top_level.txt,sha256=VKkf6Uiyrm4RS6ULCGM-v8AzYN8K2yg8SMqwJLoO-xs,5
189
+ atdd-0.4.2.dist-info/RECORD,,
File without changes