| """Helper to auto-load .env from project root when running CLI / eval entry points. |
| |
| Intentionally placed at entry points (multitool/cli.py, multitool/eval/run.py) |
| rather than in library modules like llm_client.py. Loading environment side |
| effects from a library would surprise programmatic consumers of GroqClient; |
| .env loading is an entry-point convenience. |
| """ |
| from __future__ import annotations |
|
|
| from pathlib import Path |
|
|
| from dotenv import load_dotenv |
|
|
|
|
| def load_project_env() -> None: |
| """Load .env from the nearest parent directory containing one. |
| |
| Searches upward from CWD for a .env file (so it works whether the user |
| runs `multitool ask` from the repo root or a subdirectory). Silently |
| no-ops if no .env is found — keeps existing os.environ behavior intact. |
| """ |
| env_path = _find_dotenv() |
| if env_path: |
| load_dotenv(env_path, override=False) |
|
|
|
|
| def _find_dotenv() -> Path | None: |
| """Walk up from CWD looking for a .env file. Return path or None.""" |
| cwd = Path.cwd().resolve() |
| for parent in (cwd, *cwd.parents): |
| candidate = parent / ".env" |
| if candidate.is_file(): |
| return candidate |
| return None |
|
|