ever-brain / brain /paths.py
AlexKurian's picture
feat: implement core system status, configuration management, and workspace-to-brain attachment functionality
37b748e
Raw
History Blame Contribute Delete
3.55 kB
"""Cross-platform path resolution for Brain - Local First."""
from pathlib import Path
# ── Constants ──────────────────────────────────────────────
BRAINS_DIR_NAME = ".brains"
WORKSPACE_DIR_NAME = ".brain"
CONFIG_FILE_NAME = "config" # Inside .brain/
# ── Resolvers ──────────────────────────────────────────────
def get_project_root() -> Path:
"""Find the project root by looking for .brain/ or .ever-brain marker."""
curr = Path.cwd().resolve()
home = Path.home().resolve()
for parent in [curr] + list(curr.parents):
# Stop at filesystem root
if parent.parent == parent:
break
# 1. Check for designated workspace folder (.brain/)
if (parent / WORKSPACE_DIR_NAME).exists() and (parent / WORKSPACE_DIR_NAME).is_dir():
return parent
# 2. Check for global marker file (.ever-brain)
if (parent / ".ever-brain").exists() and (parent / ".ever-brain").is_file():
return parent
# 3. Stop at Git boundary (don't search outside the repo)
if (parent / ".git").exists():
return parent
# 4. Stop at User Home
if parent == home:
break
return curr
def get_global_brains_dir() -> Path:
"""Return ~/.ever-brain/brains/. Creates if missing."""
p = Path.home() / ".ever-brain" / "brains"
p.mkdir(parents=True, exist_ok=True)
return p
def get_brains_dir() -> Path:
"""Return ./.brains/ if it exists, otherwise ~/.ever-brain/brains/."""
# Check if a project-specific .brains folder exists in the hierarchy
curr = Path.cwd()
for parent in [curr] + list(curr.parents):
local_brains = parent / BRAINS_DIR_NAME
if local_brains.exists() and local_brains.is_dir():
return local_brains
# Fallback to global
return get_global_brains_dir()
def get_brain_path(name: str) -> Path:
"""Return ./.brains/<name>/."""
return get_brains_dir() / name
def get_workspace_dir(cwd: Path | None = None) -> Path:
"""Return <root>/.brain/ or a global path if in global mode."""
root = get_project_root()
# Check if this is a global project
marker = root / ".ever-brain"
if marker.exists() and marker.is_file():
# It's a global project. Store metadata in ~/.ever-brain/workspaces/
# Use root name as a safe identifier
p = Path.home() / ".ever-brain" / "workspaces" / root.name
p.mkdir(parents=True, exist_ok=True)
return p
p = root / WORKSPACE_DIR_NAME
p.mkdir(parents=True, exist_ok=True)
return p
def get_global_projects_dir() -> Path:
"""Return ~/.ever-brain/projects/. Creates if missing."""
p = Path.home() / ".ever-brain" / "projects"
p.mkdir(parents=True, exist_ok=True)
return p
def get_personas_dir() -> Path:
"""Return ~/.ever-brain/personas/. Creates if missing."""
p = Path.home() / ".ever-brain" / "personas"
p.mkdir(parents=True, exist_ok=True)
return p
def get_persona_path(name: str) -> Path:
"""Return ~/.ever-brain/personas/<name>.md."""
if not name.endswith(".md"):
name += ".md"
return get_personas_dir() / name
def get_config_path() -> Path:
"""Return <root>/.brain/config."""
return get_workspace_dir() / CONFIG_FILE_NAME