"""In-process caches for runtime data (applications, users, domains).

Domain modules:

- ``utils.cache.base``         — cross-cutting helpers (constants,
  deep-merge, signatures, render machinery).
- ``utils.cache.applications`` — variants + ``get_merged_applications``
  (ansible-free at import time, runner-host friendly).
- ``utils.cache.users``        — ``get_user_defaults``, ``get_merged_users``.
- ``utils.cache.domains``      — ``get_merged_domains``.
- ``utils.cache.yaml``         — process-wide ``load_yaml`` /
  ``load_yaml_any`` parser cache shared by everything that reads YAML
  off-disk.
- ``utils.cache.files``        — process-wide project-tree walk +
  file-content cache (``read_text``, ``iter_project_files``,
  ``iter_non_ignored_files``).
- ``utils.cache.gitignore``    — cached ``.gitignore`` pattern loader
  + path matcher used by lint/integration tests that need a
  "files git would track" view without spawning git.

Use the domain module directly. ``utils.cache.reset._reset_cache_for_tests``
clears every domain's caches plus the shared fingerprint memo in one
call, preferred over hand-rolling N ``_reset()`` calls per test fixture.

``PROJECT_ROOT`` is the single source of truth for the repository root.
Every callsite that needs it — CLI tools, plugins, tests — MUST import
this value rather than re-derive it via ``Path(__file__).parents[N]`` or
``os.pardir`` chains; ``tests/lint/repository/test_project_root_import.py``
enforces that.
"""

from __future__ import annotations

from pathlib import Path

PROJECT_ROOT: Path = Path(__file__).resolve().parents[2]
ROLES_DIR: Path = PROJECT_ROOT / "roles"
