You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
255 lines
6.4 KiB
255 lines
6.4 KiB
#!/bin/bash
|
|
|
|
# ========================================
|
|
# Cursor Hook 注入脚本 (macOS/Linux)
|
|
# ========================================
|
|
#
|
|
# 🎯 功能:将 cursor_hook.js 注入到 Cursor 的 main.js 文件顶部
|
|
#
|
|
# 📦 使用方式:
|
|
# chmod +x inject_hook_unix.sh
|
|
# ./inject_hook_unix.sh
|
|
#
|
|
# 参数:
|
|
# --rollback 回滚到原始版本
|
|
# --force 强制重新注入
|
|
# --debug 启用调试模式
|
|
#
|
|
# ========================================
|
|
|
|
set -e
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
# 参数解析
|
|
ROLLBACK=false
|
|
FORCE=false
|
|
DEBUG=false
|
|
|
|
for arg in "$@"; do
|
|
case $arg in
|
|
--rollback) ROLLBACK=true ;;
|
|
--force) FORCE=true ;;
|
|
--debug) DEBUG=true ;;
|
|
esac
|
|
done
|
|
|
|
# 日志函数
|
|
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() { if $DEBUG; then echo -e "${BLUE}[DEBUG]${NC} $1"; fi; }
|
|
|
|
# 获取脚本所在目录
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
HOOK_SCRIPT="$SCRIPT_DIR/cursor_hook.js"
|
|
|
|
# 获取 Cursor main.js 路径
|
|
get_cursor_path() {
|
|
local paths=()
|
|
|
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
# macOS
|
|
paths=(
|
|
"/Applications/Cursor.app/Contents/Resources/app/out/main.js"
|
|
"$HOME/Applications/Cursor.app/Contents/Resources/app/out/main.js"
|
|
)
|
|
else
|
|
# Linux
|
|
paths=(
|
|
"/opt/Cursor/resources/app/out/main.js"
|
|
"/usr/share/cursor/resources/app/out/main.js"
|
|
"$HOME/.local/share/cursor/resources/app/out/main.js"
|
|
"/snap/cursor/current/resources/app/out/main.js"
|
|
)
|
|
fi
|
|
|
|
for path in "${paths[@]}"; do
|
|
if [[ -f "$path" ]]; then
|
|
echo "$path"
|
|
return 0
|
|
fi
|
|
done
|
|
|
|
return 1
|
|
}
|
|
|
|
# 检查是否已注入
|
|
check_already_injected() {
|
|
local main_js="$1"
|
|
grep -q "__cursor_patched__" "$main_js" 2>/dev/null
|
|
}
|
|
|
|
# 备份原始文件
|
|
backup_main_js() {
|
|
local main_js="$1"
|
|
local backup_dir="$(dirname "$main_js")/backups"
|
|
|
|
mkdir -p "$backup_dir"
|
|
|
|
local timestamp=$(date +%Y%m%d_%H%M%S)
|
|
local backup_path="$backup_dir/main.js.backup_$timestamp"
|
|
local original_backup="$backup_dir/main.js.original"
|
|
|
|
# 创建原始备份(如果不存在)
|
|
if [[ ! -f "$original_backup" ]]; then
|
|
cp "$main_js" "$original_backup"
|
|
log_info "已创建原始备份: $original_backup"
|
|
fi
|
|
|
|
cp "$main_js" "$backup_path"
|
|
log_info "已创建时间戳备份: $backup_path"
|
|
|
|
echo "$original_backup"
|
|
}
|
|
|
|
# 回滚到原始版本
|
|
restore_main_js() {
|
|
local main_js="$1"
|
|
local backup_dir="$(dirname "$main_js")/backups"
|
|
local original_backup="$backup_dir/main.js.original"
|
|
|
|
if [[ -f "$original_backup" ]]; then
|
|
cp "$original_backup" "$main_js"
|
|
log_info "已回滚到原始版本"
|
|
return 0
|
|
else
|
|
log_error "未找到原始备份文件"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# 关闭 Cursor 进程
|
|
stop_cursor_process() {
|
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
# macOS
|
|
pkill -x "Cursor" 2>/dev/null || true
|
|
pkill -x "Cursor Helper" 2>/dev/null || true
|
|
else
|
|
# Linux
|
|
pkill -f "cursor" 2>/dev/null || true
|
|
fi
|
|
|
|
sleep 2
|
|
log_info "Cursor 进程已关闭"
|
|
}
|
|
|
|
# 注入 Hook 代码
|
|
inject_hook() {
|
|
local main_js="$1"
|
|
local hook_script="$2"
|
|
|
|
# 读取 Hook 脚本内容
|
|
local hook_content=$(cat "$hook_script")
|
|
|
|
# 创建临时文件
|
|
local temp_file=$(mktemp)
|
|
|
|
# 读取 main.js 并注入 Hook
|
|
# 在版权声明之后注入
|
|
awk -v hook="$hook_content" '
|
|
/^\*\// && !injected {
|
|
print
|
|
print ""
|
|
print "// ========== Cursor Hook 注入开始 =========="
|
|
print hook
|
|
print "// ========== Cursor Hook 注入结束 =========="
|
|
print ""
|
|
injected = 1
|
|
next
|
|
}
|
|
{ print }
|
|
' "$main_js" > "$temp_file"
|
|
|
|
# 替换原文件
|
|
mv "$temp_file" "$main_js"
|
|
|
|
return 0
|
|
}
|
|
|
|
# 主函数
|
|
main() {
|
|
echo ""
|
|
echo -e "${BLUE}========================================${NC}"
|
|
echo -e "${BLUE} Cursor Hook 注入工具 (Unix) ${NC}"
|
|
echo -e "${BLUE}========================================${NC}"
|
|
echo ""
|
|
|
|
# 获取 Cursor main.js 路径
|
|
local main_js
|
|
main_js=$(get_cursor_path) || {
|
|
log_error "未找到 Cursor 安装路径"
|
|
log_error "请确保 Cursor 已正确安装"
|
|
exit 1
|
|
}
|
|
log_info "找到 Cursor main.js: $main_js"
|
|
|
|
# 回滚模式
|
|
if $ROLLBACK; then
|
|
log_info "执行回滚操作..."
|
|
stop_cursor_process
|
|
if restore_main_js "$main_js"; then
|
|
log_info "回滚成功!"
|
|
else
|
|
log_error "回滚失败!"
|
|
exit 1
|
|
fi
|
|
exit 0
|
|
fi
|
|
|
|
# 检查是否已注入
|
|
if check_already_injected "$main_js" && ! $FORCE; then
|
|
log_warn "Hook 已经注入,无需重复操作"
|
|
log_info "如需强制重新注入,请使用 --force 参数"
|
|
exit 0
|
|
fi
|
|
|
|
# 检查 Hook 脚本是否存在
|
|
if [[ ! -f "$HOOK_SCRIPT" ]]; then
|
|
log_error "未找到 cursor_hook.js 文件"
|
|
log_error "请确保 cursor_hook.js 与此脚本在同一目录"
|
|
exit 1
|
|
fi
|
|
log_info "找到 Hook 脚本: $HOOK_SCRIPT"
|
|
|
|
# 关闭 Cursor 进程
|
|
stop_cursor_process
|
|
|
|
# 备份原始文件
|
|
log_info "正在备份原始文件..."
|
|
backup_main_js "$main_js"
|
|
|
|
# 注入 Hook 代码
|
|
log_info "正在注入 Hook 代码..."
|
|
if inject_hook "$main_js" "$HOOK_SCRIPT"; then
|
|
log_info "Hook 注入成功!"
|
|
else
|
|
log_error "Hook 注入失败!"
|
|
log_warn "正在回滚..."
|
|
restore_main_js "$main_js"
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${GREEN}========================================${NC}"
|
|
echo -e "${GREEN} ✅ Hook 注入完成! ${NC}"
|
|
echo -e "${GREEN}========================================${NC}"
|
|
echo ""
|
|
log_info "现在可以启动 Cursor 了"
|
|
log_info "ID 配置文件位置: ~/.cursor_ids.json"
|
|
echo ""
|
|
echo -e "${YELLOW}提示:${NC}"
|
|
echo " - 如需回滚,请运行: ./inject_hook_unix.sh --rollback"
|
|
echo " - 如需强制重新注入,请运行: ./inject_hook_unix.sh --force"
|
|
echo " - 如需启用调试日志,请运行: ./inject_hook_unix.sh --debug"
|
|
echo ""
|
|
}
|
|
|
|
# 执行主函数
|
|
main
|
|
|