From 90e9a5b287289767041fd62aea8dd2002066a70a Mon Sep 17 00:00:00 2001 From: yeongpin Date: Mon, 10 Mar 2025 11:18:21 +0800 Subject: [PATCH] feat: Enhance Configuration Management for Cursor Paths - Add OS-specific path configurations for Cursor storage, SQLite, and machine ID files - Integrate configuration file management in `new_signup.py` and `reset_machine_manual.py` - Remove Workbench Cursor path and main.js modification steps - Improve cross-platform path detection and configuration handling - Update version to 1.7.02 --- .env | 4 +- CHANGELOG.md | 6 ++ new_signup.py | 23 +++++++ reset_machine_manual.py | 144 +++++++++++++++++++++++++++++----------- 4 files changed, 135 insertions(+), 42 deletions(-) diff --git a/.env b/.env index 162f08a..0f2b1d7 100644 --- a/.env +++ b/.env @@ -1,2 +1,2 @@ -version=1.7.01 -VERSION=1.7.01 +version=1.7.02 +VERSION=1.7.02 diff --git a/CHANGELOG.md b/CHANGELOG.md index d940331..6d2a155 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## v1.7.02 +1. Fix: Cursor Path | 修復Cursor路徑 +2. Add: Config File | 增加配置文件 +3. Remove: Workbench Cursor Path | 移除Workbench Cursor路徑 +4. Remove: Cursor Main JS | 移除Cursor main.js + ## v1.7.01 - Refactoring: Extract configuration-related code from the `setup_driver` function to an independent `setup_config` function - Optimization: Improve code maintainability and make configuration management and browser settings more clear diff --git a/new_signup.py b/new_signup.py index 37b3538..e24c157 100644 --- a/new_signup.py +++ b/new_signup.py @@ -170,6 +170,29 @@ def setup_config(translator=None): } } + # Add OS-specific path configurations + if sys.platform == "win32": + appdata = os.getenv("APPDATA") + default_config['WindowsPaths'] = { + 'storage_path': os.path.join(appdata, "Cursor", "User", "globalStorage", "storage.json"), + 'sqlite_path': os.path.join(appdata, "Cursor", "User", "globalStorage", "state.vscdb"), + 'machine_id_path': os.path.join(os.getenv("APPDATA"), "Cursor", "machineId") + } + elif sys.platform == "darwin": + default_config['MacPaths'] = { + 'storage_path': os.path.abspath(os.path.expanduser("~/Library/Application Support/Cursor/User/globalStorage/storage.json")), + 'sqlite_path': os.path.abspath(os.path.expanduser("~/Library/Application Support/Cursor/User/globalStorage/state.vscdb")), + 'machine_id_path': os.path.expanduser("~/Library/Application Support/Cursor/machineId") + } + elif sys.platform == "linux": + sudo_user = os.environ.get('SUDO_USER') + actual_home = f"/home/{sudo_user}" if sudo_user else os.path.expanduser("~") + default_config['LinuxPaths'] = { + 'storage_path': os.path.abspath(os.path.join(actual_home, ".config/Cursor/User/globalStorage/storage.json")), + 'sqlite_path': os.path.abspath(os.path.join(actual_home, ".config/Cursor/User/globalStorage/state.vscdb")), + 'machine_id_path': os.path.expanduser("~/.config/Cursor/machineId") + } + if os.path.exists(config_file): config.read(config_file) config_modified = False diff --git a/reset_machine_manual.py b/reset_machine_manual.py index fafedc9..65d28c1 100644 --- a/reset_machine_manual.py +++ b/reset_machine_manual.py @@ -10,6 +10,8 @@ import re import tempfile from colorama import Fore, Style, init from typing import Tuple +import configparser +from new_signup import get_user_documents_path # Initialize colorama init() @@ -70,15 +72,42 @@ def get_cursor_machine_id_path(translator=None) -> str: Returns: str: Path to machineId file """ + # Read configuration + config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip") + config_file = os.path.join(config_dir, "config.ini") + config = configparser.ConfigParser() + + if os.path.exists(config_file): + config.read(config_file) + if sys.platform == "win32": # Windows - return os.path.join(os.getenv("APPDATA"), "Cursor", "machineId") + if not config.has_section('WindowsPaths'): + config.add_section('WindowsPaths') + config.set('WindowsPaths', 'machine_id_path', + os.path.join(os.getenv("APPDATA"), "Cursor", "machineId")) + return config.get('WindowsPaths', 'machine_id_path') + elif sys.platform == "linux": # Linux - return os.path.expanduser("~/.config/Cursor/machineId") + if not config.has_section('LinuxPaths'): + config.add_section('LinuxPaths') + config.set('LinuxPaths', 'machine_id_path', + os.path.expanduser("~/.config/Cursor/machineId")) + return config.get('LinuxPaths', 'machine_id_path') + elif sys.platform == "darwin": # macOS - return os.path.expanduser("~/Library/Application Support/Cursor/machineId") + if not config.has_section('MacPaths'): + config.add_section('MacPaths') + config.set('MacPaths', 'machine_id_path', + os.path.expanduser("~/Library/Application Support/Cursor/machineId")) + return config.get('MacPaths', 'machine_id_path') + else: raise OSError(f"Unsupported operating system: {sys.platform}") + # Save any changes to config file + with open(config_file, 'w', encoding='utf-8') as f: + config.write(f) + def get_workbench_cursor_path(translator=None) -> str: """Get Cursor workbench.desktop.main.js path""" system = platform.system() @@ -318,43 +347,73 @@ class MachineIDResetter: def __init__(self, translator=None): self.translator = translator + # Read configuration + config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip") + config_file = os.path.join(config_dir, "config.ini") + config = configparser.ConfigParser() + + if not os.path.exists(config_file): + raise FileNotFoundError(f"Config file not found: {config_file}") + + config.read(config_file) + # Check operating system if sys.platform == "win32": # Windows appdata = os.getenv("APPDATA") if appdata is None: raise EnvironmentError("APPDATA Environment Variable Not Set") - self.db_path = os.path.join( - appdata, "Cursor", "User", "globalStorage", "storage.json" - ) - self.sqlite_path = os.path.join( - appdata, "Cursor", "User", "globalStorage", "state.vscdb" - ) - elif sys.platform == "darwin": # macOS - self.db_path = os.path.abspath(os.path.expanduser( - "~/Library/Application Support/Cursor/User/globalStorage/storage.json" - )) - self.sqlite_path = os.path.abspath(os.path.expanduser( - "~/Library/Application Support/Cursor/User/globalStorage/state.vscdb" - )) - elif sys.platform == "linux": # Linux - # 获取实际用户的主目录 - sudo_user = os.environ.get('SUDO_USER') - if sudo_user: - actual_home = f"/home/{sudo_user}" - else: - actual_home = os.path.expanduser("~") + + if not config.has_section('WindowsPaths'): + config.add_section('WindowsPaths') + config.set('WindowsPaths', 'storage_path', os.path.join( + appdata, "Cursor", "User", "globalStorage", "storage.json" + )) + config.set('WindowsPaths', 'sqlite_path', os.path.join( + appdata, "Cursor", "User", "globalStorage", "state.vscdb" + )) - self.db_path = os.path.abspath(os.path.join( - actual_home, - ".config/Cursor/User/globalStorage/storage.json" - )) - self.sqlite_path = os.path.abspath(os.path.join( - actual_home, - ".config/Cursor/User/globalStorage/state.vscdb" - )) + self.db_path = config.get('WindowsPaths', 'storage_path') + self.sqlite_path = config.get('WindowsPaths', 'sqlite_path') + + elif sys.platform == "darwin": # macOS + if not config.has_section('MacPaths'): + config.add_section('MacPaths') + config.set('MacPaths', 'storage_path', os.path.abspath(os.path.expanduser( + "~/Library/Application Support/Cursor/User/globalStorage/storage.json" + ))) + config.set('MacPaths', 'sqlite_path', os.path.abspath(os.path.expanduser( + "~/Library/Application Support/Cursor/User/globalStorage/state.vscdb" + ))) + + self.db_path = config.get('MacPaths', 'storage_path') + self.sqlite_path = config.get('MacPaths', 'sqlite_path') + + elif sys.platform == "linux": # Linux + if not config.has_section('LinuxPaths'): + config.add_section('LinuxPaths') + # 获取实际用户的主目录 + sudo_user = os.environ.get('SUDO_USER') + actual_home = f"/home/{sudo_user}" if sudo_user else os.path.expanduser("~") + + config.set('LinuxPaths', 'storage_path', os.path.abspath(os.path.join( + actual_home, + ".config/Cursor/User/globalStorage/storage.json" + ))) + config.set('LinuxPaths', 'sqlite_path', os.path.abspath(os.path.join( + actual_home, + ".config/Cursor/User/globalStorage/state.vscdb" + ))) + + self.db_path = config.get('LinuxPaths', 'storage_path') + self.sqlite_path = config.get('LinuxPaths', 'sqlite_path') + else: raise NotImplementedError(f"Not Supported OS: {sys.platform}") + # Save any changes to config file + with open(config_file, 'w', encoding='utf-8') as f: + config.write(f) + def generate_new_ids(self): """Generate new machine ID""" # Generate new UUID @@ -507,17 +566,22 @@ class MachineIDResetter: # Update system IDs self.update_system_ids(new_ids) - # Modify workbench.desktop.main.js - workbench_path = get_workbench_cursor_path(self.translator) - modify_workbench_js(workbench_path, self.translator) + ### Remove In v1.7.02 + # Modify workbench.desktop.main.js + + # workbench_path = get_workbench_cursor_path(self.translator) + # modify_workbench_js(workbench_path, self.translator) + + ### Remove In v1.7.02 # Check Cursor version and perform corresponding actions - greater_than_0_45 = check_cursor_version(self.translator) - if greater_than_0_45: - print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('reset.detecting_version')} >= 0.45.0,{self.translator.get('reset.patching_getmachineid')}{Style.RESET_ALL}") - patch_cursor_get_machine_id(self.translator) - else: - print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('reset.version_less_than_0_45')}{Style.RESET_ALL}") + + # greater_than_0_45 = check_cursor_version(self.translator) + # if greater_than_0_45: + # print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('reset.detecting_version')} >= 0.45.0,{self.translator.get('reset.patching_getmachineid')}{Style.RESET_ALL}") + # patch_cursor_get_machine_id(self.translator) + # else: + # print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('reset.version_less_than_0_45')}{Style.RESET_ALL}") print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.success')}{Style.RESET_ALL}") print(f"\n{Fore.CYAN}{self.translator.get('reset.new_id')}:{Style.RESET_ALL}")