diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 2af6908..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,53 +0,0 @@ -# ๐Ÿ“ Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [0.1.23] - 2024-12-29 ๐Ÿš€ - -### โœจ Features -- **Initial Release**: First public release of Cursor ID Modifier -- **Multi-Platform Support**: - - ๐ŸชŸ Windows (x64, x86) - - ๐ŸŽ macOS (Intel & Apple Silicon) - - ๐Ÿง Linux (x64, x86, ARM64) -- **Installation**: - - Automated installation scripts for all platforms - - One-line installation commands - - Secure download and verification -- **Core Functionality**: - - Telemetry ID modification for Cursor IDE - - Automatic process management - - Secure configuration handling - -### ๐Ÿ› Bug Fixes -- **Installation**: - - Fixed environment variable preservation in sudo operations - - Enhanced error handling during installation - - Improved binary download reliability -- **Process Management**: - - Improved Cursor process detection accuracy - - Enhanced process termination reliability - - Better handling of edge cases -- **User Experience**: - - Enhanced error messages and user feedback - - Improved progress indicators - - Better handling of system permissions - -### ๐Ÿ”ง Technical Improvements -- Optimized binary size with proper build flags -- Enhanced cross-platform compatibility -- Improved error handling and logging -- Better system resource management - -### ๐Ÿ“š Documentation -- Added comprehensive installation instructions -- Included platform-specific guidelines -- Enhanced error troubleshooting guide - ---- -*For more details about the changes, please refer to the [commit history](https://github.com/yuaotian/go-cursor-help/commits/main).* - -[0.1.22]: https://github.com/yuaotian/go-cursor-help/releases/tag/v0.1.23 \ No newline at end of file diff --git a/README.md b/README.md index 675a505..609d025 100644 --- a/README.md +++ b/README.md @@ -62,11 +62,18 @@ this is a mistake. ```bash curl -fsSL https://raw.githubusercontent.com/yuaotian/go-cursor-help/master/scripts/install.sh | sudo bash ``` +**ๅ›ฝๅ†…Linux/macOS็”จๆˆทไปฃ็†ไธ‹่ฝฝๆ‰ง่กŒ** +```bash +curl -fsSL https://ghgo.xyz/https://raw.githubusercontent.com/yuaotian/go-cursor-help/master/scripts/run/cursor_mac_id_modifier.sh | sudo bash **Windows**: Copy and paste in PowerShell ```powershell irm https://raw.githubusercontent.com/yuaotian/go-cursor-help/master/scripts/install.ps1 | iex ``` +**ๅ›ฝๅ†…็”จๆˆทไปฃ็†ไธ‹่ฝฝๆ‰ง่กŒ** +```powershell +curl -fsSL https://ghgo.xyz/https://raw.githubusercontent.com/yuaotian/go-cursor-help/master/scripts/run/cursor_win_id_modifier.bat | cmd +``` #### Windows Installation Features: - ๐Ÿ” Automatically detects and uses PowerShell 7 if available @@ -204,11 +211,19 @@ this is a mistake. ```bash curl -fsSL https://raw.githubusercontent.com/yuaotian/go-cursor-help/master/scripts/install.sh | sudo bash ``` +**ๅ›ฝๅ†…Linux/macOS็”จๆˆทไปฃ็†ไธ‹่ฝฝๆ‰ง่กŒ** +```bash +curl -fsSL https://ghgo.xyz/https://raw.githubusercontent.com/yuaotian/go-cursor-help/master/scripts/run/cursor_mac_id_modifier.sh | sudo bash +``` **Windows**: ๅœจPowerShellไธญๅคๅˆถ็ฒ˜่ดด ```powershell irm https://raw.githubusercontent.com/yuaotian/go-cursor-help/master/scripts/install.ps1 | iex ``` +**ๅ›ฝๅ†…Windows็”จๆˆทไปฃ็†ไธ‹่ฝฝๆ‰ง่กŒ** +```powershell +curl -fsSL https://ghgo.xyz/https://raw.githubusercontent.com/yuaotian/go-cursor-help/master/scripts/run/cursor_win_id_modifier.bat | cmd +``` #### Windows ๅฎ‰่ฃ…็‰นๆ€ง: - ๐Ÿ” ่‡ชๅŠจๆฃ€ๆต‹ๅนถไฝฟ็”จ PowerShell 7๏ผˆๅฆ‚ๆžœๅฏ็”จ๏ผ‰ diff --git a/scripts/run/cursor_linux_id_modifier.sh b/scripts/run/cursor_linux_id_modifier.sh new file mode 100644 index 0000000..88779fa --- /dev/null +++ b/scripts/run/cursor_linux_id_modifier.sh @@ -0,0 +1,241 @@ +#!/bin/bash + +# ่ฎพ็ฝฎ้”™่ฏฏๅค„็† +set -e + +# ้ขœ่‰ฒๅฎšไน‰ +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# ๆ—ฅๅฟ—ๅ‡ฝๆ•ฐ +log_info() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +log_warn() { + echo -e "${YELLOW}[WARN]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +log_debug() { + echo -e "${BLUE}[DEBUG]${NC} $1" +} + +# ่Žทๅ–ๅฝ“ๅ‰็”จๆˆท +get_current_user() { + if [ "$EUID" -eq 0 ]; then + echo "$SUDO_USER" + else + echo "$USER" + fi +} + +CURRENT_USER=$(get_current_user) +if [ -z "$CURRENT_USER" ]; then + log_error "ๆ— ๆณ•่Žทๅ–็”จๆˆทๅ" + exit 1 +fi + +# ๅฎšไน‰้…็ฝฎๆ–‡ไปถ่ทฏๅพ„ (Linux ่ทฏๅพ„) +STORAGE_FILE="/home/$CURRENT_USER/.config/Cursor/User/globalStorage/storage.json" +BACKUP_DIR="/home/$CURRENT_USER/.config/Cursor/User/globalStorage/backups" + +# ๆฃ€ๆŸฅๆƒ้™ +check_permissions() { + if [ "$EUID" -ne 0 ]; then + log_error "่ฏทไฝฟ็”จ sudo ่ฟ่กŒๆญค่„šๆœฌ" + echo "็คบไพ‹: sudo $0" + exit 1 + fi +} + +# ๆฃ€ๆŸฅๅนถๅ…ณ้—ญ Cursor ่ฟ›็จ‹ +check_and_kill_cursor() { + log_info "ๆฃ€ๆŸฅ Cursor ่ฟ›็จ‹..." + + local attempt=1 + local max_attempts=5 + + # ๅ‡ฝๆ•ฐ๏ผš่Žทๅ–่ฟ›็จ‹่ฏฆ็ป†ไฟกๆฏ + get_process_details() { + local process_name="$1" + log_debug "ๆญฃๅœจ่Žทๅ– $process_name ่ฟ›็จ‹่ฏฆ็ป†ไฟกๆฏ๏ผš" + ps aux | grep -i "$process_name" | grep -v grep + } + + while [ $attempt -le $max_attempts ]; do + CURSOR_PIDS=$(pgrep -i "cursor" || true) + + if [ -z "$CURSOR_PIDS" ]; then + log_info "ๆœชๅ‘็Žฐ่ฟ่กŒไธญ็š„ Cursor ่ฟ›็จ‹" + return 0 + fi + + log_warn "ๅ‘็Žฐ Cursor ่ฟ›็จ‹ๆญฃๅœจ่ฟ่กŒ" + get_process_details "cursor" + + log_warn "ๅฐ่ฏ•ๅ…ณ้—ญ Cursor ่ฟ›็จ‹..." + + if [ $attempt -eq $max_attempts ]; then + log_warn "ๅฐ่ฏ•ๅผบๅˆถ็ปˆๆญข่ฟ›็จ‹..." + kill -9 $CURSOR_PIDS 2>/dev/null || true + else + kill $CURSOR_PIDS 2>/dev/null || true + fi + + sleep 1 + + if ! pgrep -i "cursor" > /dev/null; then + log_info "Cursor ่ฟ›็จ‹ๅทฒๆˆๅŠŸๅ…ณ้—ญ" + return 0 + fi + + log_warn "็ญ‰ๅพ…่ฟ›็จ‹ๅ…ณ้—ญ๏ผŒๅฐ่ฏ• $attempt/$max_attempts..." + ((attempt++)) + done + + log_error "ๅœจ $max_attempts ๆฌกๅฐ่ฏ•ๅŽไปๆ— ๆณ•ๅ…ณ้—ญ Cursor ่ฟ›็จ‹" + get_process_details "cursor" + log_error "่ฏทๆ‰‹ๅŠจๅ…ณ้—ญ่ฟ›็จ‹ๅŽ้‡่ฏ•" + exit 1 +} + +# ๅค‡ไปฝ้…็ฝฎๆ–‡ไปถ +backup_config() { + if [ ! -f "$STORAGE_FILE" ]; then + log_warn "้…็ฝฎๆ–‡ไปถไธๅญ˜ๅœจ๏ผŒ่ทณ่ฟ‡ๅค‡ไปฝ" + return 0 + fi + + mkdir -p "$BACKUP_DIR" + local backup_file="$BACKUP_DIR/storage.json.backup_$(date +%Y%m%d_%H%M%S)" + + if cp "$STORAGE_FILE" "$backup_file"; then + chmod 644 "$backup_file" + chown "$CURRENT_USER:$CURRENT_USER" "$backup_file" + log_info "้…็ฝฎๅทฒๅค‡ไปฝๅˆฐ: $backup_file" + else + log_error "ๅค‡ไปฝๅคฑ่ดฅ" + exit 1 + fi +} + +# ็”Ÿๆˆ้šๆœบ ID +generate_random_id() { + # Linux ๅฏไปฅไฝฟ็”จ /dev/urandom + head -c 32 /dev/urandom | xxd -p +} + +# ็”Ÿๆˆ้šๆœบ UUID +generate_uuid() { + # Linux ไฝฟ็”จ uuidgen ๅ‘ฝไปค + uuidgen | tr '[:upper:]' '[:lower:]' +} + +# ็”Ÿๆˆๆ–ฐ็š„้…็ฝฎ +generate_new_config() { + local machine_id="auth0|user_$(generate_random_id)" + local mac_machine_id=$(generate_random_id) + local device_id=$(generate_uuid | tr '[:upper:]' '[:lower:]') + local sqm_id="{$(generate_uuid | tr '[:lower:]' '[:upper:]')}" + + if [ -f "$STORAGE_FILE" ]; then + # ็›ดๆŽฅไฟฎๆ”น็Žฐๆœ‰ๆ–‡ไปถ (Linux sed ไธ้œ€่ฆ '') + sed -i "s/\"telemetry\.machineId\":[[:space:]]*\"[^\"]*\"/\"telemetry.machineId\": \"$machine_id\"/" "$STORAGE_FILE" + sed -i "s/\"telemetry\.macMachineId\":[[:space:]]*\"[^\"]*\"/\"telemetry.macMachineId\": \"$mac_machine_id\"/" "$STORAGE_FILE" + sed -i "s/\"telemetry\.devDeviceId\":[[:space:]]*\"[^\"]*\"/\"telemetry.devDeviceId\": \"$device_id\"/" "$STORAGE_FILE" + sed -i "s/\"telemetry\.sqmId\":[[:space:]]*\"[^\"]*\"/\"telemetry.sqmId\": \"$sqm_id\"/" "$STORAGE_FILE" + else + # ๅˆ›ๅปบๆ–ฐๆ–‡ไปถ + echo "{" > "$STORAGE_FILE" + echo " \"telemetry.machineId\": \"$machine_id\"," >> "$STORAGE_FILE" + echo " \"telemetry.macMachineId\": \"$mac_machine_id\"," >> "$STORAGE_FILE" + echo " \"telemetry.devDeviceId\": \"$device_id\"," >> "$STORAGE_FILE" + echo " \"telemetry.sqmId\": \"$sqm_id\"" >> "$STORAGE_FILE" + echo "}" >> "$STORAGE_FILE" + fi + + chmod 644 "$STORAGE_FILE" + chown "$CURRENT_USER:$CURRENT_USER" "$STORAGE_FILE" + + echo + log_info "ๅทฒๆ›ดๆ–ฐ้…็ฝฎ:" + log_debug "machineId: $machine_id" + log_debug "macMachineId: $mac_machine_id" + log_debug "devDeviceId: $device_id" + log_debug "sqmId: $sqm_id" +} + +# ๆ˜พ็คบๆ–‡ไปถๆ ‘็ป“ๆž„ +show_file_tree() { + local base_dir=$(dirname "$STORAGE_FILE") + echo + log_info "ๆ–‡ไปถ็ป“ๆž„:" + echo -e "${BLUE}$base_dir${NC}" + echo "โ”œโ”€โ”€ globalStorage" + echo "โ”‚ โ”œโ”€โ”€ storage.json (ๅทฒไฟฎๆ”น)" + echo "โ”‚ โ””โ”€โ”€ backups" + + # ๅˆ—ๅ‡บๅค‡ไปฝๆ–‡ไปถ + if [ -d "$BACKUP_DIR" ]; then + local backup_files=("$BACKUP_DIR"/*) + if [ ${#backup_files[@]} -gt 0 ]; then + for file in "${backup_files[@]}"; do + if [ -f "$file" ]; then + echo "โ”‚ โ””โ”€โ”€ $(basename "$file")" + fi + done + else + echo "โ”‚ โ””โ”€โ”€ (็ฉบ)" + fi + fi + echo +} + +# ๆ˜พ็คบๅ…ฌไผ—ๅทไฟกๆฏ +show_follow_info() { + echo + echo -e "${GREEN}================================${NC}" + echo -e "${YELLOW} ๅ…ณๆณจๅ…ฌไผ—ๅทใ€็…Ž้ฅผๆžœๅญAIใ€‘ไธ€่ตทไบคๆตๆ›ดๅคšCursorๆŠ€ๅทงๅ’ŒAI็Ÿฅ่ฏ† ${NC}" + echo -e "${GREEN}================================${NC}" + echo +} + +# ไธปๅ‡ฝๆ•ฐ +main() { + clear + # ๆ˜พ็คบ CURSOR Logo + echo -e " + โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— + โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•— + โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ• + โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ•šโ•โ•โ•โ•โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•— + โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ + โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ• โ•šโ•โ•โ•šโ•โ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ• โ•šโ•โ• + " + echo -e "${BLUE}================================${NC}" + echo -e "${GREEN} Cursor ID ไฟฎๆ”นๅทฅๅ…ท${NC}" + echo -e "${BLUE}================================${NC}" + echo + + check_permissions + check_and_kill_cursor + backup_config + generate_new_config + + echo + log_info "ๆ“ไฝœๅฎŒๆˆ๏ผ" + show_follow_info + show_file_tree + log_info "่ฏท้‡ๅฏ Cursor ไปฅๅบ”็”จๆ–ฐ็š„้…็ฝฎ" + echo +} + +# ๆ‰ง่กŒไธปๅ‡ฝๆ•ฐ +main diff --git a/scripts/run/cursor_mac_id_modifier.sh b/scripts/run/cursor_mac_id_modifier.sh new file mode 100644 index 0000000..5c897bf --- /dev/null +++ b/scripts/run/cursor_mac_id_modifier.sh @@ -0,0 +1,239 @@ +#!/bin/bash + +# ่ฎพ็ฝฎ้”™่ฏฏๅค„็† +set -e + +# ้ขœ่‰ฒๅฎšไน‰ +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# ๆ—ฅๅฟ—ๅ‡ฝๆ•ฐ +log_info() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +log_warn() { + echo -e "${YELLOW}[WARN]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +log_debug() { + echo -e "${BLUE}[DEBUG]${NC} $1" +} + +# ่Žทๅ–ๅฝ“ๅ‰็”จๆˆท +get_current_user() { + if [ "$EUID" -eq 0 ]; then + echo "$SUDO_USER" + else + echo "$USER" + fi +} + +CURRENT_USER=$(get_current_user) +if [ -z "$CURRENT_USER" ]; then + log_error "ๆ— ๆณ•่Žทๅ–็”จๆˆทๅ" + exit 1 +fi + +# ๅฎšไน‰้…็ฝฎๆ–‡ไปถ่ทฏๅพ„ +STORAGE_FILE="$HOME/Library/Application Support/Cursor/User/globalStorage/storage.json" +BACKUP_DIR="$HOME/Library/Application Support/Cursor/User/globalStorage/backups" + +# ๆฃ€ๆŸฅๆƒ้™ +check_permissions() { + if [ "$EUID" -ne 0 ]; then + log_error "่ฏทไฝฟ็”จ sudo ่ฟ่กŒๆญค่„šๆœฌ" + echo "็คบไพ‹: sudo $0" + exit 1 + fi +} + +# ๆฃ€ๆŸฅๅนถๅ…ณ้—ญ Cursor ่ฟ›็จ‹ +check_and_kill_cursor() { + log_info "ๆฃ€ๆŸฅ Cursor ่ฟ›็จ‹..." + + local attempt=1 + local max_attempts=5 + + # ๅ‡ฝๆ•ฐ๏ผš่Žทๅ–่ฟ›็จ‹่ฏฆ็ป†ไฟกๆฏ + get_process_details() { + local process_name="$1" + log_debug "ๆญฃๅœจ่Žทๅ– $process_name ่ฟ›็จ‹่ฏฆ็ป†ไฟกๆฏ๏ผš" + ps aux | grep -i "$process_name" | grep -v grep + } + + while [ $attempt -le $max_attempts ]; do + CURSOR_PIDS=$(pgrep -i "cursor" || true) + + if [ -z "$CURSOR_PIDS" ]; then + log_info "ๆœชๅ‘็Žฐ่ฟ่กŒไธญ็š„ Cursor ่ฟ›็จ‹" + return 0 + fi + + log_warn "ๅ‘็Žฐ Cursor ่ฟ›็จ‹ๆญฃๅœจ่ฟ่กŒ" + get_process_details "cursor" + + log_warn "ๅฐ่ฏ•ๅ…ณ้—ญ Cursor ่ฟ›็จ‹..." + + if [ $attempt -eq $max_attempts ]; then + log_warn "ๅฐ่ฏ•ๅผบๅˆถ็ปˆๆญข่ฟ›็จ‹..." + kill -9 $CURSOR_PIDS 2>/dev/null || true + else + kill $CURSOR_PIDS 2>/dev/null || true + fi + + sleep 1 + + if ! pgrep -i "cursor" > /dev/null; then + log_info "Cursor ่ฟ›็จ‹ๅทฒๆˆๅŠŸๅ…ณ้—ญ" + return 0 + fi + + log_warn "็ญ‰ๅพ…่ฟ›็จ‹ๅ…ณ้—ญ๏ผŒๅฐ่ฏ• $attempt/$max_attempts..." + ((attempt++)) + done + + log_error "ๅœจ $max_attempts ๆฌกๅฐ่ฏ•ๅŽไปๆ— ๆณ•ๅ…ณ้—ญ Cursor ่ฟ›็จ‹" + get_process_details "cursor" + log_error "่ฏทๆ‰‹ๅŠจๅ…ณ้—ญ่ฟ›็จ‹ๅŽ้‡่ฏ•" + exit 1 +} + +# ๅค‡ไปฝ้…็ฝฎๆ–‡ไปถ +backup_config() { + if [ ! -f "$STORAGE_FILE" ]; then + log_warn "้…็ฝฎๆ–‡ไปถไธๅญ˜ๅœจ๏ผŒ่ทณ่ฟ‡ๅค‡ไปฝ" + return 0 + fi + + mkdir -p "$BACKUP_DIR" + local backup_file="$BACKUP_DIR/storage.json.backup_$(date +%Y%m%d_%H%M%S)" + + if cp "$STORAGE_FILE" "$backup_file"; then + chmod 644 "$backup_file" + chown "$CURRENT_USER" "$backup_file" + log_info "้…็ฝฎๅทฒๅค‡ไปฝๅˆฐ: $backup_file" + else + log_error "ๅค‡ไปฝๅคฑ่ดฅ" + exit 1 + fi +} + +# ็”Ÿๆˆ้šๆœบ ID +generate_random_id() { + openssl rand -hex 32 +} + +# ็”Ÿๆˆ้šๆœบ UUID +generate_uuid() { + uuidgen | tr '[:upper:]' '[:lower:]' +} + +# ็”Ÿๆˆๆ–ฐ็š„้…็ฝฎ +generate_new_config() { + local machine_id="auth0|user_$(generate_random_id)" + local mac_machine_id=$(generate_random_id) + local device_id=$(generate_uuid | tr '[:upper:]' '[:lower:]') + local sqm_id="{$(generate_uuid | tr '[:lower:]' '[:upper:]')}" + + if [ -f "$STORAGE_FILE" ]; then + # ็›ดๆŽฅไฟฎๆ”น็Žฐๆœ‰ๆ–‡ไปถ + sed -i '' -e "s/\"telemetry\.machineId\":[[:space:]]*\"[^\"]*\"/\"telemetry.machineId\": \"$machine_id\"/" "$STORAGE_FILE" + sed -i '' -e "s/\"telemetry\.macMachineId\":[[:space:]]*\"[^\"]*\"/\"telemetry.macMachineId\": \"$mac_machine_id\"/" "$STORAGE_FILE" + sed -i '' -e "s/\"telemetry\.devDeviceId\":[[:space:]]*\"[^\"]*\"/\"telemetry.devDeviceId\": \"$device_id\"/" "$STORAGE_FILE" + sed -i '' -e "s/\"telemetry\.sqmId\":[[:space:]]*\"[^\"]*\"/\"telemetry.sqmId\": \"$sqm_id\"/" "$STORAGE_FILE" + else + # ๅˆ›ๅปบๆ–ฐๆ–‡ไปถ + echo "{" > "$STORAGE_FILE" + echo " \"telemetry.machineId\": \"$machine_id\"," >> "$STORAGE_FILE" + echo " \"telemetry.macMachineId\": \"$mac_machine_id\"," >> "$STORAGE_FILE" + echo " \"telemetry.devDeviceId\": \"$device_id\"," >> "$STORAGE_FILE" + echo " \"telemetry.sqmId\": \"$sqm_id\"" >> "$STORAGE_FILE" + echo "}" >> "$STORAGE_FILE" + fi + + chmod 644 "$STORAGE_FILE" + chown "$CURRENT_USER" "$STORAGE_FILE" + + echo + log_info "ๅทฒๆ›ดๆ–ฐ้…็ฝฎ:" + log_debug "machineId: $machine_id" + log_debug "macMachineId: $mac_machine_id" + log_debug "devDeviceId: $device_id" + log_debug "sqmId: $sqm_id" +} + +# ๆ˜พ็คบๆ–‡ไปถๆ ‘็ป“ๆž„ +show_file_tree() { + local base_dir=$(dirname "$STORAGE_FILE") + echo + log_info "ๆ–‡ไปถ็ป“ๆž„:" + echo -e "${BLUE}$base_dir${NC}" + echo "โ”œโ”€โ”€ globalStorage" + echo "โ”‚ โ”œโ”€โ”€ storage.json (ๅทฒไฟฎๆ”น)" + echo "โ”‚ โ””โ”€โ”€ backups" + + # ๅˆ—ๅ‡บๅค‡ไปฝๆ–‡ไปถ + if [ -d "$BACKUP_DIR" ]; then + local backup_files=("$BACKUP_DIR"/*) + if [ ${#backup_files[@]} -gt 0 ]; then + for file in "${backup_files[@]}"; do + if [ -f "$file" ]; then + echo "โ”‚ โ””โ”€โ”€ $(basename "$file")" + fi + done + else + echo "โ”‚ โ””โ”€โ”€ (็ฉบ)" + fi + fi + echo +} + +# ๆ˜พ็คบๅ…ฌไผ—ๅทไฟกๆฏ +show_follow_info() { + echo + echo -e "${GREEN}================================${NC}" + echo -e "${YELLOW} ๅ…ณๆณจๅ…ฌไผ—ๅทใ€็…Ž้ฅผๆžœๅญAIใ€‘ไธ€่ตทไบคๆตๆ›ดๅคšCursorๆŠ€ๅทงๅ’ŒAI็Ÿฅ่ฏ† ${NC}" + echo -e "${GREEN}================================${NC}" + echo +} + +# ไธปๅ‡ฝๆ•ฐ +main() { + clear + # ๆ˜พ็คบ CURSOR Logo + echo -e " + โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— + โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•— + โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ• + โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ•šโ•โ•โ•โ•โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•— + โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ + โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ• โ•šโ•โ•โ•šโ•โ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ• โ•šโ•โ• + " + echo -e "${BLUE}================================${NC}" + echo -e "${GREEN} Cursor ID ไฟฎๆ”นๅทฅๅ…ท${NC}" + echo -e "${BLUE}================================${NC}" + echo + + check_permissions + check_and_kill_cursor + backup_config + generate_new_config + + echo + log_info "ๆ“ไฝœๅฎŒๆˆ๏ผ" + show_follow_info + show_file_tree + log_info "่ฏท้‡ๅฏ Cursor ไปฅๅบ”็”จๆ–ฐ็š„้…็ฝฎ" + echo +} + +# ๆ‰ง่กŒไธปๅ‡ฝๆ•ฐ +main diff --git a/scripts/run/cursor_win_id_modifier.bat b/scripts/run/cursor_win_id_modifier.bat new file mode 100644 index 0000000..fb3e7f2 --- /dev/null +++ b/scripts/run/cursor_win_id_modifier.bat @@ -0,0 +1,224 @@ +@echo off +chcp 65001 >nul +setlocal EnableDelayedExpansion + +:: ้ขœ่‰ฒๅฎšไน‰ +set "RED=[31m" +set "GREEN=[32m" +set "YELLOW=[33m" +set "BLUE=[34m" +set "NC=[0m" + +:: ้…็ฝฎๆ–‡ไปถ่ทฏๅพ„ +set "STORAGE_FILE=%APPDATA%\Cursor\User\globalStorage\storage.json" +set "BACKUP_DIR=%APPDATA%\Cursor\User\globalStorage\backups" + +:: ๆฃ€ๆŸฅ็ฎก็†ๅ‘˜ๆƒ้™ +net session >nul 2>&1 +if %errorLevel% neq 0 ( + echo %RED%[้”™่ฏฏ]%NC% ่ฏทไปฅ็ฎก็†ๅ‘˜่บซไปฝ่ฟ่กŒๆญค่„šๆœฌ + echo ่ฏทๅณ้”ฎ็‚นๅ‡ป่„šๆœฌ๏ผŒ้€‰ๆ‹ฉ"ไปฅ็ฎก็†ๅ‘˜่บซไปฝ่ฟ่กŒ" + pause + exit /b 1 +) + +:: ๆ˜พ็คบ Logo +cls +echo. +echo โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— +echo โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•— +echo โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ• +echo โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ•šโ•โ•โ•โ•โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•— +echo โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ +echo โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ• โ•šโ•โ•โ•šโ•โ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ• โ•šโ•โ• +echo. +echo %BLUE%================================%NC% +echo %GREEN% Cursor ID ไฟฎๆ”นๅทฅๅ…ท%NC% +echo %BLUE%================================%NC% +echo. + +:: ๆฃ€ๆŸฅๅนถๅ…ณ้—ญ Cursor ่ฟ›็จ‹ +:: ๅฎšไน‰ๆœ€ๅคง้‡่ฏ•ๆฌกๆ•ฐๅ’Œ็ญ‰ๅพ…ๆ—ถ้—ด +set "MAX_RETRIES=5" +set "WAIT_TIME=1" + +echo %GREEN%[ไฟกๆฏ]%NC% ๆฃ€ๆŸฅ Cursor ่ฟ›็จ‹... + +goto :main + +:check_process +setlocal +set "process_name=%~1" +tasklist /FI "IMAGENAME eq %process_name%" 2>NUL | find /I "%process_name%" >NUL +endlocal & exit /b %ERRORLEVEL% + +:get_process_details +setlocal +set "process_name=%~1" +echo %BLUE%[่ฐƒ่ฏ•]%NC% ๆญฃๅœจ่Žทๅ– %process_name% ่ฟ›็จ‹่ฏฆ็ป†ไฟกๆฏ๏ผš +wmic process where "name='%process_name%'" get ProcessId,ExecutablePath,CommandLine /format:list +endlocal +exit /b + +:main + +:: ๅค„็† Cursor.exe +call :check_process "Cursor.exe" +if %ERRORLEVEL% equ 0 ( + echo %YELLOW%[่ญฆๅ‘Š]%NC% ๅ‘็Žฐ Cursor.exe ๆญฃๅœจ่ฟ่กŒ + call :get_process_details "Cursor.exe" + + echo %YELLOW%[่ญฆๅ‘Š]%NC% ๅฐ่ฏ•ๅ…ณ้—ญ Cursor.exe... + taskkill /F /IM "Cursor.exe" >NUL 2>&1 + + :: ๅพช็Žฏๆฃ€ๆต‹่ฟ›็จ‹ๆ˜ฏๅฆ็œŸๆญฃๅ…ณ้—ญ + set "retry_count=0" + :retry_cursor + call :check_process "Cursor.exe" + if %ERRORLEVEL% equ 0 ( + set /a "retry_count+=1" + if !retry_count! geq %MAX_RETRIES% ( + echo %RED%[้”™่ฏฏ]%NC% ๅœจ %MAX_RETRIES% ๆฌกๅฐ่ฏ•ๅŽไปๆ— ๆณ•ๅ…ณ้—ญ Cursor.exe + call :get_process_details "Cursor.exe" + echo %RED%[้”™่ฏฏ]%NC% ่ฏทๆ‰‹ๅŠจๅ…ณ้—ญ่ฟ›็จ‹ๅŽ้‡่ฏ• + pause + exit /b 1 + ) + echo %YELLOW%[่ญฆๅ‘Š]%NC% ็ญ‰ๅพ…่ฟ›็จ‹ๅ…ณ้—ญ๏ผŒๅฐ่ฏ• !retry_count!/%MAX_RETRIES%... + timeout /t %WAIT_TIME% /nobreak >NUL + goto retry_cursor + ) + echo %GREEN%[ไฟกๆฏ]%NC% Cursor.exe ๅทฒๆˆๅŠŸๅ…ณ้—ญ +) + +:: ๅค„็† cursor.exe +call :check_process "cursor.exe" +if %ERRORLEVEL% equ 0 ( + echo %YELLOW%[่ญฆๅ‘Š]%NC% ๅ‘็Žฐ cursor.exe ๆญฃๅœจ่ฟ่กŒ + call :get_process_details "cursor.exe" + + echo %YELLOW%[่ญฆๅ‘Š]%NC% ๅฐ่ฏ•ๅ…ณ้—ญ cursor.exe... + taskkill /F /IM "cursor.exe" >NUL 2>&1 + + :: ๅพช็Žฏๆฃ€ๆต‹่ฟ›็จ‹ๆ˜ฏๅฆ็œŸๆญฃๅ…ณ้—ญ + set "retry_count=0" + :retry_cursor_lower + call :check_process "cursor.exe" + if %ERRORLEVEL% equ 0 ( + set /a "retry_count+=1" + if !retry_count! geq %MAX_RETRIES% ( + echo %RED%[้”™่ฏฏ]%NC% ๅœจ %MAX_RETRIES% ๆฌกๅฐ่ฏ•ๅŽไปๆ— ๆณ•ๅ…ณ้—ญ cursor.exe + call :get_process_details "cursor.exe" + echo %RED%[้”™่ฏฏ]%NC% ่ฏทๆ‰‹ๅŠจๅ…ณ้—ญ่ฟ›็จ‹ๅŽ้‡่ฏ• + pause + exit /b 1 + ) + echo %YELLOW%[่ญฆๅ‘Š]%NC% ็ญ‰ๅพ…่ฟ›็จ‹ๅ…ณ้—ญ๏ผŒๅฐ่ฏ• !retry_count!/%MAX_RETRIES%... + timeout /t %WAIT_TIME% /nobreak >NUL + goto retry_cursor_lower + ) + echo %GREEN%[ไฟกๆฏ]%NC% cursor.exe ๅทฒๆˆๅŠŸๅ…ณ้—ญ +) + +:: ๆœ€็ปˆ็กฎ่ฎคๆ‰€ๆœ‰่ฟ›็จ‹้ƒฝๅทฒๅ…ณ้—ญ +echo %GREEN%[ไฟกๆฏ]%NC% ๆญฃๅœจ่ฟ›่กŒๆœ€็ปˆ็กฎ่ฎค... +call :check_process "Cursor.exe" +if %ERRORLEVEL% equ 0 ( + echo %RED%[้”™่ฏฏ]%NC% ไป็„ถๆฃ€ๆต‹ๅˆฐ Cursor.exe ่ฟ›็จ‹ + call :get_process_details "Cursor.exe" + pause + exit /b 1 +) +call :check_process "cursor.exe" +if %ERRORLEVEL% equ 0 ( + echo %RED%[้”™่ฏฏ]%NC% ไป็„ถๆฃ€ๆต‹ๅˆฐ cursor.exe ่ฟ›็จ‹ + call :get_process_details "cursor.exe" + pause + exit /b 1 +) + +echo %GREEN%[ไฟกๆฏ]%NC% ๆ‰€ๆœ‰ Cursor ่ฟ›็จ‹ๅทฒ็กฎ่ฎคๅ…ณ้—ญ + +:: ๅˆ›ๅปบๅค‡ไปฝ็›ฎๅฝ• +if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%" + +:: ๅค‡ไปฝ็Žฐๆœ‰้…็ฝฎ +if exist "%STORAGE_FILE%" ( + echo %GREEN%[ไฟกๆฏ]%NC% ๆญฃๅœจๅค‡ไปฝ้…็ฝฎๆ–‡ไปถ... + copy "%STORAGE_FILE%" "%BACKUP_DIR%\storage.json.backup_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%" >NUL + if !errorlevel! neq 0 ( + echo %RED%[้”™่ฏฏ]%NC% ๅค‡ไปฝๅคฑ่ดฅ + pause + exit /b 1 + ) +) + +:: ็”Ÿๆˆๆ–ฐ็š„ ID +echo %GREEN%[ไฟกๆฏ]%NC% ๆญฃๅœจ็”Ÿๆˆๆ–ฐ็š„ ID... + +:: ็”Ÿๆˆ้šๆœบ ID +for /f "delims=" %%a in ('powershell -Command "[System.Guid]::NewGuid().ToString()"') do set "UUID=%%a" +for /f "delims=" %%a in ('powershell -Command "$bytes = New-Object Byte[] 32; (New-Object Security.Cryptography.RNGCryptoServiceProvider).GetBytes($bytes); -join($bytes | ForEach-Object { $_.ToString('x2') })"') do set "MACHINE_ID=%%a" +for /f "delims=" %%a in ('powershell -Command "$bytes = New-Object Byte[] 32; (New-Object Security.Cryptography.RNGCryptoServiceProvider).GetBytes($bytes); -join($bytes | ForEach-Object { $_.ToString('x2') })"') do set "MAC_MACHINE_ID=%%a" +for /f "delims=" %%a in ('powershell -Command "[System.Guid]::NewGuid().ToString().ToUpper()"') do set "SQM_ID={%%a}" + +:: ๅˆ›ๅปบๆˆ–ๆ›ดๆ–ฐ้…็ฝฎๆ–‡ไปถ +echo %GREEN%[ไฟกๆฏ]%NC% ๆญฃๅœจๆ›ดๆ–ฐ้…็ฝฎ... + +:: ็›ดๆŽฅๆ›ดๆ–ฐ JSON ๆ–‡ไปถ +if not exist "%STORAGE_FILE%" ( + echo {> "%STORAGE_FILE%" + echo "telemetry.machineId": "%MACHINE_ID%",>> "%STORAGE_FILE%" + echo "telemetry.macMachineId": "%MAC_MACHINE_ID%",>> "%STORAGE_FILE%" + echo "telemetry.devDeviceId": "%UUID%",>> "%STORAGE_FILE%" + echo "telemetry.sqmId": "%SQM_ID%">> "%STORAGE_FILE%" + echo }>> "%STORAGE_FILE%" +) else ( + :: ไฝฟ็”จ PowerShell ๆ›ดๆ–ฐ็Žฐๆœ‰ JSON ๆ–‡ไปถ + powershell -Command "$json = Get-Content '%STORAGE_FILE%' | ConvertFrom-Json; $json.'telemetry.machineId' = '%MACHINE_ID%'; $json.'telemetry.macMachineId' = '%MAC_MACHINE_ID%'; $json.'telemetry.devDeviceId' = '%UUID%'; $json.'telemetry.sqmId' = '%SQM_ID%'; $json | ConvertTo-Json -Depth 10 | Set-Content '%STORAGE_FILE%'" +) + +:: ่ฎพ็ฝฎๆ–‡ไปถๆƒ้™ +icacls "%STORAGE_FILE%" /grant:r "%USERNAME%":F >NUL + +:: ๆ˜พ็คบ็ป“ๆžœ +echo. +echo %GREEN%[ไฟกๆฏ]%NC% ๅทฒๆ›ดๆ–ฐ้…็ฝฎ: +echo %BLUE%[่ฐƒ่ฏ•]%NC% machineId: %MACHINE_ID% +echo %BLUE%[่ฐƒ่ฏ•]%NC% macMachineId: %MAC_MACHINE_ID% +echo %BLUE%[่ฐƒ่ฏ•]%NC% devDeviceId: %UUID% +echo %BLUE%[่ฐƒ่ฏ•]%NC% sqmId: %SQM_ID% +echo. +echo %GREEN%[ไฟกๆฏ]%NC% ๆ“ไฝœๅฎŒๆˆ๏ผ + +:: ๆ˜พ็คบๅ…ฌไผ—ๅทไฟกๆฏ +echo. +echo %GREEN%================================%NC% +echo %YELLOW% ๅ…ณๆณจๅ…ฌไผ—ๅทใ€็…Ž้ฅผๆžœๅญAIใ€‘ไธ€่ตทไบคๆตๆ›ดๅคšCursorๆŠ€ๅทงๅ’ŒAI็Ÿฅ่ฏ† %NC% +echo %GREEN%================================%NC% +echo. + +:: ๆ˜พ็คบๆ–‡ไปถๆ ‘็ป“ๆž„ +echo. +echo %GREEN%[ไฟกๆฏ]%NC% ๆ–‡ไปถ็ป“ๆž„: +echo %BLUE%%APPDATA%\Cursor\User%NC% +echo โ”œโ”€โ”€ globalStorage +echo โ”‚ โ”œโ”€โ”€ storage.json (ๅทฒไฟฎๆ”น) +echo โ”‚ โ””โ”€โ”€ backups + +:: ๅˆ—ๅ‡บๅค‡ไปฝๆ–‡ไปถ +if exist "%BACKUP_DIR%\*" ( + for %%F in ("%BACKUP_DIR%\*") do ( + echo โ”‚ โ””โ”€โ”€ %%~nxF + ) +) else ( + echo โ”‚ โ””โ”€โ”€ (็ฉบ) +) +echo. + +echo %GREEN%[ไฟกๆฏ]%NC% ่ฏท้‡ๅฏ Cursor ไปฅๅบ”็”จๆ–ฐ็š„้…็ฝฎ + +echo. + +pause +exit /b 0