66 from tomlkit .toml_document import TOMLDocument
77
88import asyncio
9+ from pathlib import Path
910
1011from pyproject_metadata import StandardMetadata
1112
@@ -27,6 +28,41 @@ def read_metadata() -> StandardMetadata:
2728 return StandardMetadata .from_pyproject (read_pyproject ())
2829
2930
31+ def find_package_directory () -> Path :
32+ """Find the user's package directory.
33+
34+ Supports both common Python project layouts:
35+ - src layout: user_project/src/package_name/__init__.py
36+ - flat layout: user_project/package_name/__init__.py
37+
38+ Returns:
39+ Path to the package directory containing __init__.py
40+
41+ Raises:
42+ FileNotFoundError: If package directory cannot be found in either layout
43+ """
44+ metadata = read_metadata ()
45+ package_name = metadata .name
46+ project_root = ap .paths .user_path
47+
48+ # Try src layout first (recommended layout)
49+ src_layout_dir = project_root / "src" / package_name
50+ if (src_layout_dir / "__init__.py" ).exists ():
51+ return src_layout_dir
52+
53+ # Try flat layout
54+ flat_layout_dir = project_root / package_name
55+ if (flat_layout_dir / "__init__.py" ).exists ():
56+ return flat_layout_dir
57+
58+ # Package not found in either location
59+ raise FileNotFoundError (
60+ f"Could not find package '{ package_name } ' in either src layout "
61+ f"({ src_layout_dir } ) or flat layout ({ flat_layout_dir } ). "
62+ f"Expected to find __init__.py in one of these locations."
63+ )
64+
65+
3066def init_pyproject ():
3167 """Initialize pyproject.toml with sensible defaults
3268 - add [build-system] section with uv build backend (same as `uv init --package`)
0 commit comments