From e8e93b53c0379527ad17f21fb2fddc462b5ef34e Mon Sep 17 00:00:00 2001 From: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Date: Tue, 7 Apr 2026 16:36:27 -0700 Subject: [PATCH] fix: allow mining directories without local mempalace.yaml When no mempalace.yaml or mempal.yaml exists in the source directory, return a default config (wing = directory name, room = general) instead of calling sys.exit(1). This lets users mine any directory into their palace without requiring init first. Closes #14. --- mempalace/miner.py | 22 +++++++++++++++++----- tests/test_miner.py | 16 +++++++++++++++- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/mempalace/miner.py b/mempalace/miner.py index 73fe0c4..e07b257 100644 --- a/mempalace/miner.py +++ b/mempalace/miner.py @@ -264,16 +264,28 @@ def load_config(project_dir: str) -> dict: """Load mempalace.yaml from project directory (falls back to mempal.yaml).""" import yaml - config_path = Path(project_dir).expanduser().resolve() / "mempalace.yaml" + resolved_project_dir = Path(project_dir).expanduser().resolve() + config_path = resolved_project_dir / "mempalace.yaml" if not config_path.exists(): # Fallback to legacy name - legacy_path = Path(project_dir).expanduser().resolve() / "mempal.yaml" + legacy_path = resolved_project_dir / "mempal.yaml" if legacy_path.exists(): config_path = legacy_path else: - print(f"ERROR: No mempalace.yaml found in {project_dir}") - print(f"Run: mempalace init {project_dir}") - sys.exit(1) + print( + f" No mempalace.yaml found in {resolved_project_dir} " + "— using auto-detected defaults" + ) + return { + "wing": resolved_project_dir.name, + "rooms": [ + { + "name": "general", + "description": "All project files", + "keywords": ["general"], + } + ], + } with open(config_path) as f: return yaml.safe_load(f) diff --git a/tests/test_miner.py b/tests/test_miner.py index d16c97c..e2a3a85 100644 --- a/tests/test_miner.py +++ b/tests/test_miner.py @@ -6,7 +6,7 @@ from pathlib import Path import chromadb import yaml -from mempalace.miner import mine, scan_project, status +from mempalace.miner import load_config, mine, scan_project, status from mempalace.palace import NORMALIZE_VERSION, file_already_mined @@ -52,6 +52,20 @@ def test_project_mining(): shutil.rmtree(tmpdir, ignore_errors=True) +def test_load_config_uses_defaults_when_yaml_missing(): + tmpdir = tempfile.mkdtemp() + try: + project_root = Path(tmpdir).resolve() + config = load_config(str(project_root)) + + assert isinstance(config, dict) + assert "wing" in config + assert "rooms" in config + assert config["wing"] == project_root.name + finally: + shutil.rmtree(tmpdir) + + def test_scan_project_respects_gitignore(): tmpdir = tempfile.mkdtemp() try: