"""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//.""" return get_brains_dir() / name def get_workspace_dir(cwd: Path | None = None) -> Path: """Return /.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/.md.""" if not name.endswith(".md"): name += ".md" return get_personas_dir() / name def get_config_path() -> Path: """Return /.brain/config.""" return get_workspace_dir() / CONFIG_FILE_NAME