6 changed files with 878 additions and 65 deletions
-
143README.md
-
50install.sh
-
128scripts/build_all.bat
-
155scripts/build_all.sh
-
216scripts/install.ps1
-
251scripts/install.sh
@ -1,50 +0,0 @@ |
|||||
#!/usr/bin/env bash |
|
||||
|
|
||||
# Error handling |
|
||||
error() { |
|
||||
echo -e "\033[31m\033[1mError:\033[0m $1" >&2 |
|
||||
exit 1 |
|
||||
} |
|
||||
|
|
||||
# Detect platform |
|
||||
OS=$(uname -s | tr '[:upper:]' '[:lower:]') |
|
||||
ARCH=$(uname -m) |
|
||||
|
|
||||
# Get latest version |
|
||||
VERSION=$(curl -sL "https://api.github.com/repos/realies/go-cursor-help/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') |
|
||||
[ -z "$VERSION" ] && error "Could not determine latest version" |
|
||||
|
|
||||
# Get binary name based on platform |
|
||||
case "$OS" in |
|
||||
linux*) |
|
||||
case "$ARCH" in |
|
||||
x86_64) BINARY="cursor_id_modifier_${VERSION}_linux_amd64" ;; |
|
||||
aarch64|arm64) BINARY="cursor_id_modifier_${VERSION}_linux_arm64" ;; |
|
||||
*) error "Unsupported Linux architecture: $ARCH" ;; |
|
||||
esac |
|
||||
;; |
|
||||
darwin*) |
|
||||
case "$ARCH" in |
|
||||
x86_64) BINARY="cursor_id_modifier_${VERSION}_darwin_amd64" ;; |
|
||||
arm64) BINARY="cursor_id_modifier_${VERSION}_darwin_arm64" ;; |
|
||||
*) error "Unsupported macOS architecture: $ARCH" ;; |
|
||||
esac |
|
||||
;; |
|
||||
*) error "Unsupported operating system: $OS" ;; |
|
||||
esac |
|
||||
|
|
||||
# Set up cleanup trap |
|
||||
trap 'rm -f "./${BINARY}"' EXIT |
|
||||
|
|
||||
# Download and run |
|
||||
DOWNLOAD_URL="https://github.com/realies/go-cursor-help/releases/download/v${VERSION}/${BINARY}" |
|
||||
echo "Downloading from: ${DOWNLOAD_URL}" |
|
||||
|
|
||||
# Download with error checking |
|
||||
if ! curl -fL "$DOWNLOAD_URL" -o "./${BINARY}"; then |
|
||||
error "Download failed. HTTP error from GitHub" |
|
||||
fi |
|
||||
|
|
||||
chmod +x "./${BINARY}" |
|
||||
echo "Running cursor-id-modifier..." |
|
||||
sudo "./${BINARY}" |
|
@ -0,0 +1,128 @@ |
|||||
|
@echo off |
||||
|
setlocal EnableDelayedExpansion |
||||
|
|
||||
|
:: Messages / 消息 |
||||
|
set "EN_MESSAGES[0]=Starting build process for version" |
||||
|
set "EN_MESSAGES[1]=Using optimization flags:" |
||||
|
set "EN_MESSAGES[2]=Cleaning old builds..." |
||||
|
set "EN_MESSAGES[3]=Cleanup completed" |
||||
|
set "EN_MESSAGES[4]=bin directory does not exist, no cleanup needed" |
||||
|
set "EN_MESSAGES[5]=Starting builds for all platforms..." |
||||
|
set "EN_MESSAGES[6]=Building for" |
||||
|
set "EN_MESSAGES[7]=Build successful:" |
||||
|
set "EN_MESSAGES[8]=Build failed for" |
||||
|
set "EN_MESSAGES[9]=All builds completed! Total time:" |
||||
|
set "EN_MESSAGES[10]=seconds" |
||||
|
|
||||
|
set "CN_MESSAGES[0]=开始构建版本" |
||||
|
set "CN_MESSAGES[1]=使用优化标志:" |
||||
|
set "CN_MESSAGES[2]=正在清理旧的构建文件..." |
||||
|
set "CN_MESSAGES[3]=清理完成" |
||||
|
set "CN_MESSAGES[4]=bin 目录不存在,无需清理" |
||||
|
set "CN_MESSAGES[5]=开始编译所有平台..." |
||||
|
set "CN_MESSAGES[6]=正在构建" |
||||
|
set "CN_MESSAGES[7]=构建成功:" |
||||
|
set "CN_MESSAGES[8]=构建失败:" |
||||
|
set "CN_MESSAGES[9]=所有构建完成!总耗时:" |
||||
|
set "CN_MESSAGES[10]=秒" |
||||
|
|
||||
|
:: 设置版本信息 / Set version |
||||
|
set VERSION=2.0.0 |
||||
|
|
||||
|
:: 设置颜色代码 / Set color codes |
||||
|
set "GREEN=[32m" |
||||
|
set "RED=[31m" |
||||
|
set "YELLOW=[33m" |
||||
|
set "RESET=[0m" |
||||
|
|
||||
|
:: 设置编译优化标志 / Set build optimization flags |
||||
|
set "LDFLAGS=-s -w" |
||||
|
set "BUILDMODE=pie" |
||||
|
set "GCFLAGS=-N -l" |
||||
|
|
||||
|
:: 设置 CGO / Set CGO |
||||
|
set CGO_ENABLED=0 |
||||
|
|
||||
|
:: 检测系统语言 / Detect system language |
||||
|
for /f "tokens=2 delims==" %%a in ('wmic os get OSLanguage /value') do set OSLanguage=%%a |
||||
|
if "%OSLanguage%"=="2052" (set LANG=cn) else (set LANG=en) |
||||
|
|
||||
|
:: 显示编译信息 / Display build info |
||||
|
echo %YELLOW%!%LANG%_MESSAGES[0]! %VERSION%%RESET% |
||||
|
echo %YELLOW%!%LANG%_MESSAGES[1]! LDFLAGS=%LDFLAGS%, BUILDMODE=%BUILDMODE%%RESET% |
||||
|
echo %YELLOW%CGO_ENABLED=%CGO_ENABLED%%RESET% |
||||
|
|
||||
|
:: 清理旧的构建文件 / Clean old builds |
||||
|
echo %YELLOW%!%LANG%_MESSAGES[2]!%RESET% |
||||
|
if exist "..\bin" ( |
||||
|
rd /s /q "..\bin" |
||||
|
echo %GREEN%!%LANG%_MESSAGES[3]!%RESET% |
||||
|
) else ( |
||||
|
echo %YELLOW%!%LANG%_MESSAGES[4]!%RESET% |
||||
|
) |
||||
|
|
||||
|
:: 创建输出目录 / Create output directory |
||||
|
mkdir "..\bin" 2>nul |
||||
|
|
||||
|
:: 定义目标平台数组 / Define target platforms array |
||||
|
set platforms[0].os=windows |
||||
|
set platforms[0].arch=amd64 |
||||
|
set platforms[0].ext=.exe |
||||
|
set platforms[0].suffix= |
||||
|
|
||||
|
set platforms[1].os=darwin |
||||
|
set platforms[1].arch=amd64 |
||||
|
set platforms[1].ext= |
||||
|
set platforms[1].suffix=_intel |
||||
|
|
||||
|
set platforms[2].os=darwin |
||||
|
set platforms[2].arch=arm64 |
||||
|
set platforms[2].ext= |
||||
|
set platforms[2].suffix=_m1 |
||||
|
|
||||
|
set platforms[3].os=linux |
||||
|
set platforms[3].arch=amd64 |
||||
|
set platforms[3].ext= |
||||
|
set platforms[3].suffix= |
||||
|
|
||||
|
:: 设置开始时间 / Set start time |
||||
|
set start_time=%time% |
||||
|
|
||||
|
:: 编译所有目标 / Build all targets |
||||
|
echo !%LANG%_MESSAGES[5]! |
||||
|
|
||||
|
for /L %%i in (0,1,3) do ( |
||||
|
set "os=!platforms[%%i].os!" |
||||
|
set "arch=!platforms[%%i].arch!" |
||||
|
set "ext=!platforms[%%i].ext!" |
||||
|
set "suffix=!platforms[%%i].suffix!" |
||||
|
|
||||
|
echo. |
||||
|
echo !%LANG%_MESSAGES[6]! !os! !arch!... |
||||
|
|
||||
|
set GOOS=!os! |
||||
|
set GOARCH=!arch! |
||||
|
|
||||
|
:: 构建输出文件名 / Build output filename |
||||
|
set "outfile=..\bin\cursor_id_modifier_v%VERSION%_!os!_!arch!!suffix!!ext!" |
||||
|
|
||||
|
:: 执行构建 / Execute build |
||||
|
go build -trimpath -buildmode=%BUILDMODE% -ldflags="%LDFLAGS%" -gcflags="%GCFLAGS%" -o "!outfile!" ..\main.go |
||||
|
|
||||
|
if !errorlevel! equ 0 ( |
||||
|
echo %GREEN%!%LANG%_MESSAGES[7]! !outfile!%RESET% |
||||
|
) else ( |
||||
|
echo %RED%!%LANG%_MESSAGES[8]! !os! !arch!%RESET% |
||||
|
) |
||||
|
) |
||||
|
|
||||
|
:: 计算总耗时 / Calculate total time |
||||
|
set end_time=%time% |
||||
|
set /a duration = %end_time:~0,2% * 3600 + %end_time:~3,2% * 60 + %end_time:~6,2% - (%start_time:~0,2% * 3600 + %start_time:~3,2% * 60 + %start_time:~6,2%) |
||||
|
|
||||
|
echo. |
||||
|
echo %GREEN%!%LANG%_MESSAGES[9]! %duration% !%LANG%_MESSAGES[10]!%RESET% |
||||
|
if exist "..\bin" dir /b "..\bin" |
||||
|
|
||||
|
pause |
||||
|
endlocal |
@ -0,0 +1,155 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
# 设置颜色代码 / Set color codes |
||||
|
GREEN='\033[0;32m' |
||||
|
RED='\033[0;31m' |
||||
|
NC='\033[0m' # No Color / 无颜色 |
||||
|
|
||||
|
# Messages / 消息 |
||||
|
EN_MESSAGES=( |
||||
|
"Starting build process for version" |
||||
|
"Cleaning old builds..." |
||||
|
"Creating bin directory..." |
||||
|
"Failed to create bin directory" |
||||
|
"Building for" |
||||
|
"Successfully built:" |
||||
|
"Failed to build for" |
||||
|
"Build Summary:" |
||||
|
"Successful builds:" |
||||
|
"Failed builds:" |
||||
|
"Generated files:" |
||||
|
"Build process interrupted" |
||||
|
"Error:" |
||||
|
) |
||||
|
|
||||
|
CN_MESSAGES=( |
||||
|
"开始构建版本" |
||||
|
"正在清理旧的构建文件..." |
||||
|
"正在创建bin目录..." |
||||
|
"创建bin目录失败" |
||||
|
"正在构建" |
||||
|
"构建成功:" |
||||
|
"构建失败:" |
||||
|
"构建摘要:" |
||||
|
"成功构建数:" |
||||
|
"失败构建数:" |
||||
|
"生成的文件:" |
||||
|
"构建过程被中断" |
||||
|
"错误:" |
||||
|
) |
||||
|
|
||||
|
# 版本信息 / Version info |
||||
|
VERSION="1.0.0" |
||||
|
|
||||
|
# Detect system language / 检测系统语言 |
||||
|
detect_language() { |
||||
|
if [[ $(locale | grep "LANG=zh_CN") ]]; then |
||||
|
echo "cn" |
||||
|
else |
||||
|
echo "en" |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
# Get message based on language / 根据语言获取消息 |
||||
|
get_message() { |
||||
|
local index=$1 |
||||
|
local lang=$(detect_language) |
||||
|
|
||||
|
if [[ "$lang" == "cn" ]]; then |
||||
|
echo "${CN_MESSAGES[$index]}" |
||||
|
else |
||||
|
echo "${EN_MESSAGES[$index]}" |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
# 错误处理函数 / Error handling function |
||||
|
handle_error() { |
||||
|
echo -e "${RED}$(get_message 12) $1${NC}" |
||||
|
exit 1 |
||||
|
} |
||||
|
|
||||
|
# 清理函数 / Cleanup function |
||||
|
cleanup() { |
||||
|
echo "$(get_message 1)" |
||||
|
rm -rf ../bin |
||||
|
} |
||||
|
|
||||
|
# 创建输出目录 / Create output directory |
||||
|
create_output_dir() { |
||||
|
echo "$(get_message 2)" |
||||
|
mkdir -p ../bin || handle_error "$(get_message 3)" |
||||
|
} |
||||
|
|
||||
|
# 构建函数 / Build function |
||||
|
build() { |
||||
|
local os=$1 |
||||
|
local arch=$2 |
||||
|
local suffix=$3 |
||||
|
|
||||
|
echo -e "\n$(get_message 4) $os ($arch)..." |
||||
|
|
||||
|
output_name="../bin/cursor_id_modifier_v${VERSION}_${os}_${arch}${suffix}" |
||||
|
|
||||
|
GOOS=$os GOARCH=$arch go build -o "$output_name" ../main.go |
||||
|
|
||||
|
if [ $? -eq 0 ]; then |
||||
|
echo -e "${GREEN}✓ $(get_message 5) ${output_name}${NC}" |
||||
|
else |
||||
|
echo -e "${RED}✗ $(get_message 6) $os $arch${NC}" |
||||
|
return 1 |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
# 主函数 / Main function |
||||
|
main() { |
||||
|
# 显示构建信息 / Display build info |
||||
|
echo "$(get_message 0) ${VERSION}" |
||||
|
|
||||
|
# 清理旧文件 / Clean old files |
||||
|
cleanup |
||||
|
|
||||
|
# 创建输出目录 / Create output directory |
||||
|
create_output_dir |
||||
|
|
||||
|
# 定义构建目标 / Define build targets |
||||
|
declare -A targets=( |
||||
|
["windows_amd64"]=".exe" |
||||
|
["darwin_amd64"]="" |
||||
|
["darwin_arm64"]="" |
||||
|
["linux_amd64"]="" |
||||
|
) |
||||
|
|
||||
|
# 构建计数器 / Build counters |
||||
|
local success_count=0 |
||||
|
local fail_count=0 |
||||
|
|
||||
|
# 遍历所有目标进行构建 / Build all targets |
||||
|
for target in "${!targets[@]}"; do |
||||
|
os=${target%_*} |
||||
|
arch=${target#*_} |
||||
|
suffix=${targets[$target]} |
||||
|
|
||||
|
if build "$os" "$arch" "$suffix"; then |
||||
|
((success_count++)) |
||||
|
else |
||||
|
((fail_count++)) |
||||
|
fi |
||||
|
done |
||||
|
|
||||
|
# 显示构建结果 / Display build results |
||||
|
echo -e "\n$(get_message 7)" |
||||
|
echo -e "${GREEN}$(get_message 8) $success_count${NC}" |
||||
|
if [ $fail_count -gt 0 ]; then |
||||
|
echo -e "${RED}$(get_message 9) $fail_count${NC}" |
||||
|
fi |
||||
|
|
||||
|
# 显示生成的文件列表 / Display generated files |
||||
|
echo -e "\n$(get_message 10)" |
||||
|
ls -1 ../bin |
||||
|
} |
||||
|
|
||||
|
# 捕获错误信号 / Catch error signals |
||||
|
trap 'echo -e "\n${RED}$(get_message 11)${NC}"; exit 1' INT TERM |
||||
|
|
||||
|
# 执行主函数 / Execute main function |
||||
|
main |
@ -0,0 +1,216 @@ |
|||||
|
# Auto-elevate to admin rights if not already running as admin |
||||
|
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { |
||||
|
Write-Host "Requesting administrator privileges..." |
||||
|
Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs |
||||
|
Exit |
||||
|
} |
||||
|
|
||||
|
# Set TLS to 1.2 / 设置 TLS 为 1.2 |
||||
|
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 |
||||
|
|
||||
|
# Colors for output / 输出颜色 |
||||
|
$Red = "`e[31m" |
||||
|
$Green = "`e[32m" |
||||
|
$Blue = "`e[36m" |
||||
|
$Yellow = "`e[33m" |
||||
|
$Reset = "`e[0m" |
||||
|
|
||||
|
# Messages / 消息 |
||||
|
$EN_MESSAGES = @( |
||||
|
"Starting installation...", |
||||
|
"Detected architecture:", |
||||
|
"Only 64-bit Windows is supported", |
||||
|
"Latest version:", |
||||
|
"Creating installation directory...", |
||||
|
"Downloading latest release from:", |
||||
|
"Failed to download binary:", |
||||
|
"Downloaded file not found", |
||||
|
"Installing binary...", |
||||
|
"Failed to install binary:", |
||||
|
"Adding to PATH...", |
||||
|
"Cleaning up...", |
||||
|
"Installation completed successfully!", |
||||
|
"You can now use 'cursor-id-modifier' from any terminal (you may need to restart your terminal first)", |
||||
|
"Checking for running Cursor instances...", |
||||
|
"Found running Cursor processes. Attempting to close them...", |
||||
|
"Successfully closed all Cursor instances", |
||||
|
"Failed to close Cursor instances. Please close them manually", |
||||
|
"Backing up storage.json...", |
||||
|
"Backup created at:" |
||||
|
) |
||||
|
|
||||
|
$CN_MESSAGES = @( |
||||
|
"开始安装...", |
||||
|
"检测到架构:", |
||||
|
"仅支持64位Windows系统", |
||||
|
"最新版本:", |
||||
|
"正在创建安装目录...", |
||||
|
"正在从以下地址下载最新版本:", |
||||
|
"下载二进制文件失败:", |
||||
|
"未找到下载的文件", |
||||
|
"正在安装程序...", |
||||
|
"安装二进制文件失败:", |
||||
|
"正在添加到PATH...", |
||||
|
"正在清理...", |
||||
|
"安装成功完成!", |
||||
|
"现在可以在任何终端中使用 'cursor-id-modifier' 了(可能需要重启终端)", |
||||
|
"正在检查运行中的Cursor进程...", |
||||
|
"发现正在运行的Cursor进程,尝试关闭...", |
||||
|
"成功关闭所有Cursor实例", |
||||
|
"无法关闭Cursor实例,请手动关闭", |
||||
|
"正在备份storage.json...", |
||||
|
"备份已创建于:" |
||||
|
) |
||||
|
|
||||
|
# Detect system language / 检测系统语言 |
||||
|
function Get-SystemLanguage { |
||||
|
if ((Get-Culture).Name -like "zh-CN") { |
||||
|
return "cn" |
||||
|
} |
||||
|
return "en" |
||||
|
} |
||||
|
|
||||
|
# Get message based on language / 根据语言获取消息 |
||||
|
function Get-Message($Index) { |
||||
|
$lang = Get-SystemLanguage |
||||
|
if ($lang -eq "cn") { |
||||
|
return $CN_MESSAGES[$Index] |
||||
|
} |
||||
|
return $EN_MESSAGES[$Index] |
||||
|
} |
||||
|
|
||||
|
# Functions for colored output / 彩色输出函数 |
||||
|
function Write-Status($Message) { |
||||
|
Write-Host "${Blue}[*]${Reset} $Message" |
||||
|
} |
||||
|
|
||||
|
function Write-Success($Message) { |
||||
|
Write-Host "${Green}[✓]${Reset} $Message" |
||||
|
} |
||||
|
|
||||
|
function Write-Warning($Message) { |
||||
|
Write-Host "${Yellow}[!]${Reset} $Message" |
||||
|
} |
||||
|
|
||||
|
function Write-Error($Message) { |
||||
|
Write-Host "${Red}[✗]${Reset} $Message" |
||||
|
Exit 1 |
||||
|
} |
||||
|
|
||||
|
# Close Cursor instances / 关闭Cursor实例 |
||||
|
function Close-CursorInstances { |
||||
|
Write-Status (Get-Message 14) |
||||
|
$cursorProcesses = Get-Process "Cursor" -ErrorAction SilentlyContinue |
||||
|
|
||||
|
if ($cursorProcesses) { |
||||
|
Write-Status (Get-Message 15) |
||||
|
try { |
||||
|
$cursorProcesses | ForEach-Object { $_.CloseMainWindow() | Out-Null } |
||||
|
Start-Sleep -Seconds 2 |
||||
|
$cursorProcesses | Where-Object { !$_.HasExited } | Stop-Process -Force |
||||
|
Write-Success (Get-Message 16) |
||||
|
} catch { |
||||
|
Write-Error (Get-Message 17) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
# Backup storage.json / 备份storage.json |
||||
|
function Backup-StorageJson { |
||||
|
Write-Status (Get-Message 18) |
||||
|
$storageJsonPath = "$env:APPDATA\Cursor\User\globalStorage\storage.json" |
||||
|
if (Test-Path $storageJsonPath) { |
||||
|
$backupPath = "$storageJsonPath.backup" |
||||
|
Copy-Item -Path $storageJsonPath -Destination $backupPath -Force |
||||
|
Write-Success "$(Get-Message 19) $backupPath" |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
# Get latest release version from GitHub / 从GitHub获取最新版本 |
||||
|
function Get-LatestVersion { |
||||
|
$repo = "yuaotian/go-cursor-help" |
||||
|
$release = Invoke-RestMethod -Uri "https://api.github.com/repos/$repo/releases/latest" |
||||
|
return $release.tag_name |
||||
|
} |
||||
|
|
||||
|
# Main installation process / 主安装过程 |
||||
|
Write-Status (Get-Message 0) |
||||
|
|
||||
|
# Close any running Cursor instances |
||||
|
Close-CursorInstances |
||||
|
|
||||
|
# Backup storage.json |
||||
|
Backup-StorageJson |
||||
|
|
||||
|
# Get system architecture / 获取系统架构 |
||||
|
$arch = if ([Environment]::Is64BitOperatingSystem) { "amd64" } else { "386" } |
||||
|
Write-Status "$(Get-Message 1) $arch" |
||||
|
|
||||
|
if ($arch -ne "amd64") { |
||||
|
Write-Error (Get-Message 2) |
||||
|
} |
||||
|
|
||||
|
# Get latest version / 获取最新版本 |
||||
|
$version = Get-LatestVersion |
||||
|
Write-Status "$(Get-Message 3) $version" |
||||
|
|
||||
|
# Set up paths / 设置路径 |
||||
|
$installDir = "$env:ProgramFiles\cursor-id-modifier" |
||||
|
$binaryName = "cursor_id_modifier_${version}_windows_amd64.exe" |
||||
|
$downloadUrl = "https://github.com/yuaotian/go-cursor-help/releases/download/$version/$binaryName" |
||||
|
$tempFile = "$env:TEMP\$binaryName" |
||||
|
|
||||
|
# Create installation directory / 创建安装目录 |
||||
|
Write-Status (Get-Message 4) |
||||
|
if (-not (Test-Path $installDir)) { |
||||
|
New-Item -ItemType Directory -Path $installDir -Force | Out-Null |
||||
|
} |
||||
|
|
||||
|
# Download binary / 下载二进制文件 |
||||
|
Write-Status "$(Get-Message 5) $downloadUrl" |
||||
|
try { |
||||
|
Invoke-WebRequest -Uri $downloadUrl -OutFile $tempFile |
||||
|
} catch { |
||||
|
Write-Error "$(Get-Message 6) $_" |
||||
|
} |
||||
|
|
||||
|
# Verify download / 验证下载 |
||||
|
if (-not (Test-Path $tempFile)) { |
||||
|
Write-Error (Get-Message 7) |
||||
|
} |
||||
|
|
||||
|
# Install binary / 安装二进制文件 |
||||
|
Write-Status (Get-Message 8) |
||||
|
try { |
||||
|
Move-Item -Force $tempFile "$installDir\cursor-id-modifier.exe" |
||||
|
} catch { |
||||
|
Write-Error "$(Get-Message 9) $_" |
||||
|
} |
||||
|
|
||||
|
# Add to PATH if not already present / 如果尚未添加则添加到PATH |
||||
|
$userPath = [Environment]::GetEnvironmentVariable("Path", "User") |
||||
|
if ($userPath -notlike "*$installDir*") { |
||||
|
Write-Status (Get-Message 10) |
||||
|
[Environment]::SetEnvironmentVariable( |
||||
|
"Path", |
||||
|
"$userPath;$installDir", |
||||
|
"User" |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
# Create shortcut in Start Menu / 在开始菜单创建快捷方式 |
||||
|
$startMenuPath = "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\cursor-id-modifier.lnk" |
||||
|
$shell = New-Object -ComObject WScript.Shell |
||||
|
$shortcut = $shell.CreateShortcut($startMenuPath) |
||||
|
$shortcut.TargetPath = "$installDir\cursor-id-modifier.exe" |
||||
|
$shortcut.Save() |
||||
|
|
||||
|
# Cleanup / 清理 |
||||
|
Write-Status (Get-Message 11) |
||||
|
if (Test-Path $tempFile) { |
||||
|
Remove-Item -Force $tempFile |
||||
|
} |
||||
|
|
||||
|
Write-Success (Get-Message 12) |
||||
|
Write-Success (Get-Message 13) |
||||
|
Write-Host "" |
@ -0,0 +1,251 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
set -e |
||||
|
|
||||
|
# Colors for output / 输出颜色 |
||||
|
RED='\033[0;31m' |
||||
|
GREEN='\033[0;32m' |
||||
|
BLUE='\033[0;36m' |
||||
|
YELLOW='\033[0;33m' |
||||
|
NC='\033[0m' # No Color / 无颜色 |
||||
|
|
||||
|
# Messages / 消息 |
||||
|
EN_MESSAGES=( |
||||
|
"Starting installation..." |
||||
|
"Detected OS:" |
||||
|
"Downloading latest release..." |
||||
|
"URL:" |
||||
|
"Installing binary..." |
||||
|
"Cleaning up..." |
||||
|
"Installation completed successfully!" |
||||
|
"You can now use 'sudo %s' from your terminal" |
||||
|
"Failed to download binary from:" |
||||
|
"Failed to download the binary" |
||||
|
"curl is required but not installed. Please install curl first." |
||||
|
"sudo is required but not installed. Please install sudo first." |
||||
|
"Unsupported operating system" |
||||
|
"Unsupported architecture:" |
||||
|
"Checking for running Cursor instances..." |
||||
|
"Found running Cursor processes. Attempting to close them..." |
||||
|
"Successfully closed all Cursor instances" |
||||
|
"Failed to close Cursor instances. Please close them manually" |
||||
|
"Backing up storage.json..." |
||||
|
"Backup created at:" |
||||
|
"This script requires root privileges. Requesting sudo access..." |
||||
|
) |
||||
|
|
||||
|
CN_MESSAGES=( |
||||
|
"开始安装..." |
||||
|
"检测到操作系统:" |
||||
|
"正在下载最新版本..." |
||||
|
"下载地址:" |
||||
|
"正在安装程序..." |
||||
|
"正在清理..." |
||||
|
"安装成功完成!" |
||||
|
"现在可以在终端中使用 'sudo %s' 了" |
||||
|
"从以下地址下载二进制文件失败:" |
||||
|
"下载二进制文件失败" |
||||
|
"需要 curl 但未安装。请先安装 curl。" |
||||
|
"需要 sudo 但未安装。请先安装 sudo。" |
||||
|
"不支持的操作系统" |
||||
|
"不支持的架构:" |
||||
|
"正在检查运行中的Cursor进程..." |
||||
|
"发现正在运行的Cursor进程,尝试关闭..." |
||||
|
"成功关闭所有Cursor实例" |
||||
|
"无法关闭Cursor实例,请手动关闭" |
||||
|
"正在备份storage.json..." |
||||
|
"备份已创建于:" |
||||
|
"此脚本需要root权限。正在请求sudo访问..." |
||||
|
) |
||||
|
|
||||
|
# Detect system language / 检测系统语言 |
||||
|
detect_language() { |
||||
|
if [[ $(locale | grep "LANG=zh_CN") ]]; then |
||||
|
echo "cn" |
||||
|
else |
||||
|
echo "en" |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
# Get message based on language / 根据语言获取消息 |
||||
|
get_message() { |
||||
|
local index=$1 |
||||
|
local lang=$(detect_language) |
||||
|
|
||||
|
if [[ "$lang" == "cn" ]]; then |
||||
|
echo "${CN_MESSAGES[$index]}" |
||||
|
else |
||||
|
echo "${EN_MESSAGES[$index]}" |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
# Print with color / 带颜色打印 |
||||
|
print_status() { |
||||
|
echo -e "${BLUE}[*]${NC} $1" |
||||
|
} |
||||
|
|
||||
|
print_success() { |
||||
|
echo -e "${GREEN}[✓]${NC} $1" |
||||
|
} |
||||
|
|
||||
|
print_warning() { |
||||
|
echo -e "${YELLOW}[!]${NC} $1" |
||||
|
} |
||||
|
|
||||
|
print_error() { |
||||
|
echo -e "${RED}[✗]${NC} $1" |
||||
|
exit 1 |
||||
|
} |
||||
|
|
||||
|
# Check and request root privileges / 检查并请求root权限 |
||||
|
check_root() { |
||||
|
if [ "$EUID" -ne 0 ]; then |
||||
|
print_status "$(get_message 20)" |
||||
|
if command -v sudo >/dev/null 2>&1; then |
||||
|
exec sudo bash "$0" "$@" |
||||
|
else |
||||
|
print_error "$(get_message 11)" |
||||
|
fi |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
# Close Cursor instances / 关闭Cursor实例 |
||||
|
close_cursor_instances() { |
||||
|
print_status "$(get_message 14)" |
||||
|
|
||||
|
if pgrep -x "Cursor" >/dev/null; then |
||||
|
print_status "$(get_message 15)" |
||||
|
if pkill -x "Cursor" 2>/dev/null; then |
||||
|
sleep 2 |
||||
|
print_success "$(get_message 16)" |
||||
|
else |
||||
|
print_error "$(get_message 17)" |
||||
|
fi |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
# Backup storage.json / 备份storage.json |
||||
|
backup_storage_json() { |
||||
|
print_status "$(get_message 18)" |
||||
|
local storage_path |
||||
|
|
||||
|
if [ "$(uname)" == "Darwin" ]; then |
||||
|
storage_path="$HOME/Library/Application Support/Cursor/User/globalStorage/storage.json" |
||||
|
else |
||||
|
storage_path="$HOME/.config/Cursor/User/globalStorage/storage.json" |
||||
|
fi |
||||
|
|
||||
|
if [ -f "$storage_path" ]; then |
||||
|
cp "$storage_path" "${storage_path}.backup" |
||||
|
print_success "$(get_message 19) ${storage_path}.backup" |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
# Detect OS / 检测操作系统 |
||||
|
detect_os() { |
||||
|
if [[ "$OSTYPE" == "darwin"* ]]; then |
||||
|
echo "macos" |
||||
|
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then |
||||
|
echo "linux" |
||||
|
else |
||||
|
print_error "$(get_message 12)" |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
# Get latest release version from GitHub / 从GitHub获取最新版本 |
||||
|
get_latest_version() { |
||||
|
local repo="yuaotian/go-cursor-help" |
||||
|
curl -s "https://api.github.com/repos/${repo}/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' |
||||
|
} |
||||
|
|
||||
|
# Get the binary name based on OS and architecture / 根据操作系统和架构获取二进制文件名 |
||||
|
get_binary_name() { |
||||
|
OS=$(detect_os) |
||||
|
ARCH=$(uname -m) |
||||
|
VERSION=$(get_latest_version) |
||||
|
|
||||
|
case "$ARCH" in |
||||
|
x86_64) |
||||
|
echo "cursor_id_modifier_${VERSION}_${OS}_amd64" |
||||
|
;; |
||||
|
aarch64|arm64) |
||||
|
echo "cursor_id_modifier_${VERSION}_${OS}_arm64" |
||||
|
;; |
||||
|
*) |
||||
|
print_error "$(get_message 13) $ARCH" |
||||
|
;; |
||||
|
esac |
||||
|
} |
||||
|
|
||||
|
# Install the binary / 安装二进制文件 |
||||
|
install_binary() { |
||||
|
OS=$(detect_os) |
||||
|
BINARY_NAME=$(get_binary_name) |
||||
|
REPO="yuaotian/go-cursor-help" |
||||
|
VERSION=$(get_latest_version) |
||||
|
DOWNLOAD_URL="https://github.com/${REPO}/releases/download/${VERSION}/${BINARY_NAME}" |
||||
|
TMP_DIR=$(mktemp -d) |
||||
|
FINAL_BINARY_NAME="cursor-id-modifier" |
||||
|
|
||||
|
print_status "$(get_message 2)" |
||||
|
print_status "$(get_message 3) ${DOWNLOAD_URL}" |
||||
|
|
||||
|
if ! curl -L -f "$DOWNLOAD_URL" -o "$TMP_DIR/$BINARY_NAME"; then |
||||
|
print_error "$(get_message 8) $DOWNLOAD_URL" |
||||
|
fi |
||||
|
|
||||
|
if [ ! -f "$TMP_DIR/$BINARY_NAME" ]; then |
||||
|
print_error "$(get_message 9)" |
||||
|
fi |
||||
|
|
||||
|
print_status "$(get_message 4)" |
||||
|
INSTALL_DIR="/usr/local/bin" |
||||
|
|
||||
|
# Create directory if it doesn't exist / 如果目录不存在则创建 |
||||
|
mkdir -p "$INSTALL_DIR" |
||||
|
|
||||
|
# Move binary to installation directory / 移动二进制文件到安装目录 |
||||
|
mv "$TMP_DIR/$BINARY_NAME" "$INSTALL_DIR/$FINAL_BINARY_NAME" |
||||
|
chmod +x "$INSTALL_DIR/$FINAL_BINARY_NAME" |
||||
|
|
||||
|
# Cleanup / 清理 |
||||
|
print_status "$(get_message 5)" |
||||
|
rm -rf "$TMP_DIR" |
||||
|
|
||||
|
print_success "$(get_message 6)" |
||||
|
printf "${GREEN}[✓]${NC} $(get_message 7)\n" "$FINAL_BINARY_NAME" |
||||
|
} |
||||
|
|
||||
|
# Check for required tools / 检查必需工具 |
||||
|
check_requirements() { |
||||
|
if ! command -v curl >/dev/null 2>&1; then |
||||
|
print_error "$(get_message 10)" |
||||
|
fi |
||||
|
|
||||
|
if ! command -v sudo >/dev/null 2>&1; then |
||||
|
print_error "$(get_message 11)" |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
# Main installation process / 主安装过程 |
||||
|
main() { |
||||
|
print_status "$(get_message 0)" |
||||
|
|
||||
|
# Check root privileges / 检查root权限 |
||||
|
check_root "$@" |
||||
|
|
||||
|
# Close Cursor instances / 关闭Cursor实例 |
||||
|
close_cursor_instances |
||||
|
|
||||
|
# Backup storage.json / 备份storage.json |
||||
|
backup_storage_json |
||||
|
|
||||
|
OS=$(detect_os) |
||||
|
print_status "$(get_message 1) $OS" |
||||
|
|
||||
|
check_requirements |
||||
|
install_binary |
||||
|
} |
||||
|
|
||||
|
# Run main function / 运行主函数 |
||||
|
main "$@" |
Write
Preview
Loading…
Cancel
Save
Reference in new issue