From ae36275153cac7f80ddb68afb4b3ad3baaf7efcb Mon Sep 17 00:00:00 2001 From: root Date: Tue, 24 Feb 2026 21:20:37 -0600 Subject: [PATCH] feat: Add v1 detection to installer - Detect v1 installation (folder, cron, systemd service) - Warn user that upgrade is not supported - Explain removal steps clearly - Allow continue-at-own-risk option - Exit if user declines --- install.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/install.py b/install.py index 5628a8e..b4cb76f 100755 --- a/install.py +++ b/install.py @@ -269,6 +269,73 @@ def write_config(): return config_path +def detect_v1(): + """Detect if TrueRecall v1 is installed and warn user.""" + v1_indicators = [] + + # Check for v1 folder + v1_paths = [ + Path.home() / ".openclaw" / "workspace" / ".projects" / "true-recall", + Path.home() / ".openclaw" / "workspace" / ".projects" / "true-recall" / "tr-daily", + ] + for p in v1_paths: + if p.exists(): + v1_indicators.append(f"Found v1 folder: {p}") + + # Check for v1 cron jobs + cron_file = Path.home() / ".openclaw" / "tr-daily" / "crontab.txt" + if cron_file.exists(): + v1_indicators.append(f"Found v1 cron file: {cron_file}") + + # Check for v1 systemd service + v1_service_paths = [ + Path("/etc/systemd/system/memories-qdrant.service"), + Path.home() / ".config" / "systemd" / "user" / "memories-qdrant.service", + ] + for s in v1_service_paths: + if s.exists(): + v1_indicators.append(f"Found v1 service: {s}") + + if not v1_indicators: + return False + + print("\n" + "=" * 60) + print("⚠️ TRUE-RECALL V1 DETECTED") + print("=" * 60) + print("\nTrueRecall v1 is already installed on this system:") + for indicator in v1_indicators: + print(f" • {indicator}") + + print("\n⚠️ UPGRADE NOT SUPPORTED") + print("-" * 60) + print("TrueRecall v2 cannot upgrade from v1 automatically.") + print("You MUST remove v1 completely before installing v2.") + print("\nTo remove v1:") + print(" 1. Stop v1 services: sudo systemctl stop memories-qdrant") + print(" 2. Remove v1 cron jobs from crontab") + print(" 3. Archive or delete v1 folder: ~/.openclaw/workspace/.projects/true-recall/") + print(" 4. v1 data in Qdrant 'memories' collection will remain (separate from v2)") + + print("\n" + "-" * 60) + print("If you continue WITHOUT removing v1:") + print(" • Both v1 and v2 may run simultaneously") + print(" • Duplicate cron jobs may cause conflicts") + print(" • System resource usage will be doubled") + print(" • Data integrity is NOT guaranteed") + print("=" * 60) + + while True: + choice = input("\nContinue installation at your own risk? [y/N]: ").strip().lower() + if choice in ("y", "yes"): + print("\n⚠️ Proceeding with installation — v1 conflicts possible.") + return True + elif choice in ("n", "no", ""): + print("\n❌ Installation cancelled.") + print("Please remove v1 first, then run this installer again.") + return False + else: + print("Invalid choice. Enter 'y' to continue or 'n' to abort.") + def show_summary(): """Display configuration summary.""" print("\n" + "=" * 60) @@ -300,6 +367,10 @@ def main(): print("TrueRecall v2 - Interactive Installation") print("=" * 60) + # Check for v1 + if not detect_v1(): + sys.exit(1) + # Mode selection while True: print("\nSelect installation mode:")