diff --git a/locales/en.json b/locales/en.json index 8992374..2176245 100644 --- a/locales/en.json +++ b/locales/en.json @@ -388,7 +388,15 @@ "removing_electron_localstorage_files": "Removing Electron localStorage files", "electron_localstorage_files_removed": "Electron localStorage files removed", "electron_localstorage_files_removal_error": "Error removing Electron localStorage files: {error}", - "removing_electron_localstorage_files_completed": "Electron localStorage files removal completed" + "removing_electron_localstorage_files_completed": "Electron localStorage files removal completed", + "warning_title": "WARNING", + "warning_1": "This action will delete all Cursor AI settings,", + "warning_2": "configurations, and cached data. This action cannot be undone.", + "warning_3": "Your code files will NOT be affected, and the tool is designed", + "warning_4": "to only target Cursor AI editor files and trial detection mechanisms.", + "warning_5": "Other applications on your system will not be affected.", + "warning_6": "You will need to set up Cursor AI again after running this tool.", + "warning_7": "Use at your own risk" }, "github_register": { "title": "GitHub + Cursor AI Registration Automation", diff --git a/locales/zh_cn.json b/locales/zh_cn.json index cc085c9..291a64c 100644 --- a/locales/zh_cn.json +++ b/locales/zh_cn.json @@ -382,7 +382,15 @@ "removing_electron_localstorage_files": "正在移除 Electron localStorage 文件", "electron_localstorage_files_removed": "Electron localStorage 文件已移除", "electron_localstorage_files_removal_error": "移除 Electron localStorage 文件时出错:{error}", - "removing_electron_localstorage_files_completed": "Electron localStorage 文件移除完成" + "removing_electron_localstorage_files_completed": "Electron localStorage 文件移除完成", + "warning_title": "警告", + "warning_1": "此操作将删除所有 Cursor AI 设置、", + "warning_2": "配置和缓存数据。此操作无法撤销。", + "warning_3": "您的代码文件 **不会** 受到影响,工具设计为", + "warning_4": "仅针对 Cursor AI 编辑器文件和试用检测机制。", + "warning_5": "系统中的其他应用程序不会受到影响。", + "warning_6": "运行此工具后,您需要重新设置 Cursor AI。", + "warning_7": "请自行承担风险" }, "github_register": { "title": "GitHub + Cursor AI 注册自动化", diff --git a/locales/zh_tw.json b/locales/zh_tw.json index efb2a68..125f6e7 100644 --- a/locales/zh_tw.json +++ b/locales/zh_tw.json @@ -361,7 +361,15 @@ "removing_electron_localstorage_files": "正在移除 Electron localStorage 檔案", "electron_localstorage_files_removed": "已移除 Electron localStorage 檔案", "electron_localstorage_files_removal_error": "移除 Electron localStorage 檔案時出錯:{error}", - "removing_electron_localstorage_files_completed": "Electron localStorage 檔案移除完成" + "removing_electron_localstorage_files_completed": "Electron localStorage 檔案移除完成", + "warning_title": "警告", + "warning_1": "此操作將刪除所有 Cursor AI 設定、", + "warning_2": "配置與快取資料。此操作無法還原。", + "warning_3": "您的程式碼檔案將 **不會** 受到影響,且此工具僅針對", + "warning_4": "Cursor AI 編輯器檔案與試用偵測機制。", + "warning_5": "系統中的其他應用程式不會受到影響。", + "warning_6": "執行此工具後,您需要重新設定 Cursor AI。", + "warning_7": "請自行承擔風險" }, "github_register": { "title": "GitHub + Cursor AI 注册自动化", diff --git a/main.py b/main.py index c9c2c53..1f1f5c9 100644 --- a/main.py +++ b/main.py @@ -498,7 +498,7 @@ def main(): print_menu() elif choice == "10": import totally_reset_cursor - totally_reset_cursor.run(translator) + totally_reset_cursor.main(translator) print_menu() else: print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('menu.invalid_choice')}{Style.RESET_ALL}") diff --git a/totally_reset_cursor.py b/totally_reset_cursor.py index ebe2859..bc2f2f0 100644 --- a/totally_reset_cursor.py +++ b/totally_reset_cursor.py @@ -4,30 +4,41 @@ import platform import time import uuid import subprocess +from colorama import Fore, Style, init -def delete_directory(path): +init() + +EMOJI = { + "SUCCESS": "✅", + "ERROR": "❌", + "INFO": "ℹ️", + "RESET": "🔄", + "MENU": "📋", +} + +def delete_directory(path, translator=None): """Deletes a directory and all its contents.""" if os.path.exists(path): try: shutil.rmtree(path) - print(f"✅ Removed: {path}") + print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('totally_reset.removed', path=path)}{Style.RESET_ALL}") except Exception as e: - print(f"❌ Failed to remove: {path} -> {e}") + print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('totally_reset.failed_to_remove', path=path, error=e)}{Style.RESET_ALL}") else: - print(f"🔍 Not found: {path}") + print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('totally_reset.not_found', path=path)}{Style.RESET_ALL}") -def delete_file(path): +def delete_file(path, translator=None): """Deletes a file if it exists.""" if os.path.isfile(path): try: os.remove(path) - print(f"✅ Removed file: {path}") + print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('totally_reset.removed', path=path)}{Style.RESET_ALL}") except Exception as e: - print(f"❌ Failed to remove file: {path} -> {e}") + print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('totally_reset.failed_to_remove', path=path, error=e)}{Style.RESET_ALL}") else: - print(f"🔍 Not found: {path}") + print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('totally_reset.not_found', path=path)}{Style.RESET_ALL}") -def reset_machine_id(): +def reset_machine_id(translator=None): """Resets the machine ID to a new UUID.""" new_id = str(uuid.uuid4()) if platform.system() == "Windows": @@ -38,9 +49,9 @@ def reset_machine_id(): stdout=subprocess.PIPE, stderr=subprocess.PIPE ) - print(f"✅ MachineGuid reset to: {new_id}") + print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('totally_reset.machine_guid_reset', new_id=new_id)}{Style.RESET_ALL}") except subprocess.CalledProcessError as e: - print(f"❌ Failed to reset MachineGuid: {e}") + print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('totally_reset.failed_to_reset_machine_guid', error=e)}{Style.RESET_ALL}") elif platform.system() == "Linux": machine_id_paths = ["/etc/machine-id", "/var/lib/dbus/machine-id"] for path in machine_id_paths: @@ -48,44 +59,51 @@ def reset_machine_id(): try: with open(path, 'w') as f: f.write(new_id) - print(f"✅ Reset machine ID at: {path}") + print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('totally_reset.machine_id_reset', path=path)}{Style.RESET_ALL}") except Exception as e: - print(f"❌ Failed to reset machine ID at {path}: {e}") + print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('totally_reset.failed_to_reset_machine_id', path=path, error=e)}{Style.RESET_ALL}") elif platform.system() == "Darwin": # macOS print("ℹ️ macOS does not use a machine-id file. Skipping machine ID reset.") else: - print("❌ Unsupported operating system for machine ID reset.") + print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('totally_reset.unsupported_os')}{Style.RESET_ALL}") -def display_features_and_warnings(): +def display_features_and_warnings(translator=None): """Displays features and warnings before proceeding.""" - print("\n🚀 Cursor AI Reset Script") + print(f"\n{Fore.GREEN}{EMOJI['MENU']} {translator.get('totally_reset.title')}") print("=====================================") - print("Features:") - print(" - Removes Cursor AI configuration directories and files.") - print(" - Cleans up cache, preferences, and application data.") - print(" - Performs a deep scan for hidden Cursor-related files.") - print(" - Resets the machine ID to a new UUID (where applicable).") - print(" - Supports Windows, Linux, and macOS.") - print("\n⚠️ Warnings:") - print(" - This action is IRREVERSIBLE. All Cursor AI data will be deleted.") - print(" - Requires administrative privileges for some operations (e.g., machine ID reset on Windows/Linux).") - print(" - May disrupt Cursor AI functionality until reinstalled or reconfigured.") - print(" - Backup any important Cursor data before proceeding.") + print(f"{translator.get('totally_reset.features')}") + print(f"{Fore.GREEN}{translator.get('totally_reset.feature_1')}") + print(f"{Fore.GREEN}{translator.get('totally_reset.feature_2')}") + print(f"{Fore.GREEN}{translator.get('totally_reset.feature_3')}") + print(f"{Fore.GREEN}{translator.get('totally_reset.feature_4')}") + print(f"{Fore.GREEN}{translator.get('totally_reset.feature_5')}") + print(f"{Fore.GREEN}{translator.get('totally_reset.feature_6')}") + print(f"{Fore.GREEN}{translator.get('totally_reset.feature_7')}") + print(f"{Fore.GREEN}{translator.get('totally_reset.feature_8')}") + print(f"{Fore.GREEN}{translator.get('totally_reset.feature_9')}") + print(f"\n{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('totally_reset.warnings')}") + print(f"{Fore.YELLOW}{translator.get('totally_reset.warning_1')}") + print(f"{Fore.YELLOW}{translator.get('totally_reset.warning_2')}") + print(f"{Fore.YELLOW}{translator.get('totally_reset.warning_3')}") + print(f"{Fore.YELLOW}{translator.get('totally_reset.warning_4')}") + print(f"{Fore.YELLOW}{translator.get('totally_reset.warning_5')}") + print(f"{Fore.YELLOW}{translator.get('totally_reset.warning_6')}") + print(f"{Fore.YELLOW}{translator.get('totally_reset.warning_7')}") print("=====================================\n") -def get_user_confirmation(): +def get_user_confirmation(translator=None): """Prompts the user for confirmation to proceed.""" while True: - response = input("Do you want to proceed with resetting Cursor AI? (yes/no): ").lower().strip() + response = input(f"{Fore.YELLOW} {translator.get('totally_reset.confirm_title')}: ").lower().strip() if response in ['yes', 'y']: return True elif response in ['no', 'n']: return False else: - print("Please enter 'yes' or 'no'.") + print(f"{Fore.RED}{translator.get('totally_reset.invalid_choice')}{Style.RESET_ALL}") -def reset_cursor(): - print("\n🚀 Resetting Cursor AI...\n") +def reset_cursor(translator=None): + print(f"\n{Fore.GREEN}{EMOJI['RESET']} {translator.get('totally_reset.resetting_cursor')}\n") # Platform-specific paths paths = [] @@ -139,7 +157,7 @@ def reset_cursor(): delete_file(file) # Extra cleanup (wildcard search) - print("\n🔍 Deep scanning for hidden Cursor files...") + print(f"\n{Fore.YELLOW}{EMOJI['INFO']} {translator.get('totally_reset.deep_scanning')}") base_dirs = ["/tmp", "/var/tmp", os.path.expanduser("~")] # Linux and macOS if platform.system() == "Windows": base_dirs = ["C:\\Temp", "C:\\Windows\\Temp", os.path.expanduser("~")] # Windows @@ -156,21 +174,21 @@ def reset_cursor(): # Reset machine ID reset_machine_id() - print("\n✅ Cursor AI has been completely reset!") + print(f"\n{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('totally_reset.cursor_reset')}") -def main(): +def main(translator=None): start_time = time.time() # Display features and warnings - display_features_and_warnings() + display_features_and_warnings(translator) # Get user confirmation - if get_user_confirmation(): - reset_cursor() + if get_user_confirmation(translator): + reset_cursor(translator) end_time = time.time() - print(f"\n⏱️ Completed in {end_time - start_time:.2f} seconds.") + print(f"\n{Fore.GREEN}⏱️ {translator.get('reset.completed_in', time=f'{end_time - start_time:.2f} seconds')}{Style.RESET_ALL}") else: - print("\n❌ Operation cancelled by user.") + print(f"\n{Fore.RED}❌ {translator.get('reset.operation_cancelled')}{Style.RESET_ALL}") if __name__ == '__main__': - main() + main(translator=None)