From 9b906823cd871a5d9415328c3ca268362d8b87c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D1=82=D0=B0=D0=BB=D0=B8=D0=B9=20=D0=9D=D0=B8?= =?UTF-8?q?=D0=BA=D0=B8=D1=82=D0=B5=D0=BD=D0=BA=D0=BE?= Date: Tue, 30 Jun 2026 09:26:41 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20ai-cursor=20=D0=BB=D0=B0=D1=83=D0=BD=D1=87=D0=B5?= =?UTF-8?q?=D1=80=20(=D0=BD=D0=B0=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D0=B9=20Cu?= =?UTF-8?q?rsor=20CLI=20agent)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Генерация нативного лаунчера ai-cursor для Cursor CLI (agent) с автоустановкой через cursor.com/install, интеграцией proxychains4 в VLESS-режиме, обновлением ~/.cursorrules и флагом --force (--yolo). Очистка старого ai-cursor из ~/.local/bin при нестандартном BIN_DIR. Добавлены тест генерации и упоминания в EFFORT_MAPPING/QUICK_START/README. Co-Authored-By: Claude --- EFFORT_MAPPING.md | 5 +++-- QUICK_START.md | 2 +- README.md | 2 ++ scripts/ai-setup.sh | 48 ++++++++++++++++++++++++++++++++++++++++++++- tests/test_fixes.sh | 12 ++++++++++++ 5 files changed, 65 insertions(+), 4 deletions(-) diff --git a/EFFORT_MAPPING.md b/EFFORT_MAPPING.md index df09d8d..f9666fb 100644 --- a/EFFORT_MAPPING.md +++ b/EFFORT_MAPPING.md @@ -5,8 +5,9 @@ `/effort` и `AI_EFFORT` относятся к лаунчерам, которые запускают Claude Code: `ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-glm`, `ai-openrouter`, `ai-opencode`. -Нативные лаунчеры `ai-gpt` (OpenAI Codex) и `ai-gemini` (Antigravity `agy`) не используют -эту схему. У них свои настройки reasoning внутри соответствующего CLI. +Нативные лаунчеры `ai-gpt` (OpenAI Codex), `ai-gemini` (Antigravity `agy`) и `ai-cursor` +(Cursor CLI `agent`) не используют эту схему. У них свои настройки reasoning внутри +соответствующего CLI. Документ отражает текущую реализацию `scripts/ai-setup.sh`. diff --git a/QUICK_START.md b/QUICK_START.md index 6d99f5a..51fc6a2 100644 --- a/QUICK_START.md +++ b/QUICK_START.md @@ -7,7 +7,7 @@ bash setup.sh ``` Спросит про VLESS-прокси (по умолчанию `Y`; если не нужен, ответь `n`), затем установит лаунчеры -`ai-claude`, `ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-glm`, `ai-openrouter`, `ai-opencode`, `ai-gemini` +`ai-claude`, `ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-glm`, `ai-openrouter`, `ai-opencode`, `ai-gemini`, `ai-cursor` в `~/bin`, если он уже есть в `PATH`, иначе в `~/.local/bin/`, и запишет API-ключи. После установки, если команды не видны: diff --git a/README.md b/README.md index fe8b06a..9a650e1 100644 --- a/README.md +++ b/README.md @@ -161,6 +161,7 @@ bash tests/test_network.sh # полные тесты - `ai-openrouter` - Claude Code через OpenRouter (GPT-5.5, Grok, Qwen, GLM 5.2 и др.) - `ai-opencode` - Claude Code через OpenCode Go + routatic-proxy (DeepSeek, Kimi, Qwen, GLM, MiniMax, MiMo) - `ai-gemini` - нативный Antigravity CLI `agy` +- `ai-cursor` - нативный Cursor CLI `agent` - `ai-api-helpers.sh` - вспомогательные функции для лаунчеров - `claude-gpt-effort-proxy.py` - совместимый helper для старого GPT/claude-code-proxy backend @@ -238,6 +239,7 @@ android init - `ai-gpt` использует `--dangerously-bypass-approvals-and-sandbox` - `ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-glm`, `ai-openrouter`, `ai-opencode`, `ai-gemini` используют `--dangerously-skip-permissions` +- `ai-cursor` использует `--force` (алиас `--yolo`) Удобно для локального coding workflow, но это не sandbox для недоверенного кода. diff --git a/scripts/ai-setup.sh b/scripts/ai-setup.sh index b901482..cde1349 100755 --- a/scripts/ai-setup.sh +++ b/scripts/ai-setup.sh @@ -2179,6 +2179,50 @@ chmod +x "$BIN_DIR/ai-gemini" # Подменяем путь к agy, если BIN_DIR отличается от ~/.local/bin [ "$BIN_DIR" != "$HOME/.local/bin" ] && sed -i "s|\$HOME/\.local/bin|\$HOME/${BIN_DIR#$HOME/}|g" "$BIN_DIR/ai-gemini" +# === ai-cursor === +cat > "$BIN_DIR/ai-cursor" << 'CURSOREOF' +#!/usr/bin/env bash +# ============================================================ +# ai-cursor - запуск нативного Cursor CLI (agent) +# ============================================================ + +cursor_bin="$HOME/.local/bin/agent" +[ ! -f "$cursor_bin" ] && cursor_bin="$(command -v agent 2>/dev/null)" + +if [ -z "$cursor_bin" ] || [ ! -f "$cursor_bin" ]; then + echo "Cursor CLI (agent) не найден. Устанавливаю..." + curl -fsSL https://cursor.com/install -fsS | bash + cursor_bin="$HOME/.local/bin/agent" + [ ! -f "$cursor_bin" ] && cursor_bin="$(command -v agent 2>/dev/null)" +fi + +if [ -z "$cursor_bin" ] || [ ! -f "$cursor_bin" ]; then + echo "Ошибка: не удалось установить Cursor CLI." + exit 1 +fi + +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/ai-api-helpers.sh" 2>/dev/null || true + +# Cursor CLI нативно подтягивает ~/.cursorrules и проектные правила. +# Обновляем ~/.cursorrules актуальными глобальными правилами (как AGENTS.md для codex). +_build_ai_sys_prompt > /dev/null + +# --force (alias --yolo) — авто-одобрение правок и команд, аналог +# --dangerously-skip-permissions. Логин аккаунтом Cursor (OAuth при первом запуске); +# опционально CURSOR_API_KEY прокидывается через env для headless/скриптов. +"$cursor_bin" --force "$@" +cursor_exit=$? +( + paplay /usr/share/sounds/freedesktop/stereo/complete.oga 2>/dev/null || + pw-play --volume=1 /usr/share/sounds/freedesktop/stereo/complete.oga 2>/dev/null || + aplay /usr/share/sounds/freedesktop/stereo/complete.oga 2>/dev/null +) & +exit $cursor_exit +CURSOREOF +chmod +x "$BIN_DIR/ai-cursor" +# Подменяем путь к agent, если BIN_DIR отличается от ~/.local/bin +[ "$BIN_DIR" != "$HOME/.local/bin" ] && sed -i "s|\$HOME/\.local/bin|\$HOME/${BIN_DIR#$HOME/}|g" "$BIN_DIR/ai-cursor" + # === ai-claude === cat > "$BIN_DIR/ai-claude" << 'CLAUDEEOF' #!/usr/bin/env bash @@ -2285,6 +2329,7 @@ if [ "$USE_VLESS" -eq 1 ]; then sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-glm" sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-openrouter" sed -i 's|^\([[:space:]]*\)"\$agy_bin" --dangerously-skip-permissions "\$@"|\1proxychains4 -f "\$HOME/.proxychains-xray.conf" "\$agy_bin" --dangerously-skip-permissions "\$@"|' "$BIN_DIR/ai-gemini" + sed -i 's|^\([[:space:]]*\)"\$cursor_bin" --force "\$@"|\1proxychains4 -f "\$HOME/.proxychains-xray.conf" "\$cursor_bin" --force "\$@"|' "$BIN_DIR/ai-cursor" sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-claude" sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-opencode" success "proxychains4 интегрирован" @@ -2307,7 +2352,7 @@ rm -f "$BIN_DIR/claude_gpt" "$BIN_DIR/claude_deepseek" "$BIN_DIR/claude_kimi" "$ if [ "$BIN_DIR" != "$HOME/.local/bin" ]; then warn "BIN_DIR=$BIN_DIR — удаляю старые скрипты из ~/.local/bin/ ..." rm -f "$HOME/.local/bin/ai-gpt" "$HOME/.local/bin/ai-deepseek" "$HOME/.local/bin/ai-kimi" \ - "$HOME/.local/bin/ai-glm" "$HOME/.local/bin/ai-openrouter" "$HOME/.local/bin/ai-gemini" "$HOME/.local/bin/ai-claude" \ + "$HOME/.local/bin/ai-glm" "$HOME/.local/bin/ai-openrouter" "$HOME/.local/bin/ai-gemini" "$HOME/.local/bin/ai-cursor" "$HOME/.local/bin/ai-claude" \ "$HOME/.local/bin/ai-opencode" \ "$HOME/.local/bin/ai-api-helpers.sh" "$HOME/.local/bin/claude-gpt-effort-proxy.py" fi @@ -2333,6 +2378,7 @@ echo "" echo " Нативные CLI:" echo -e " ${CYAN}ai-gpt${NC} - OpenAI Codex (нативный CLI, автоустановка)" echo -e " ${CYAN}ai-gemini${NC} - Gemini (нативный agy CLI, автоустановка)" +echo -e " ${CYAN}ai-cursor${NC} - Cursor (нативный Cursor CLI, автоустановка)" echo "" echo " Android CLI:" echo -e " ${CYAN}android${NC} - Google Android CLI (SDK, эмулятор, проекты)" diff --git a/tests/test_fixes.sh b/tests/test_fixes.sh index 4829492..5677613 100755 --- a/tests/test_fixes.sh +++ b/tests/test_fixes.sh @@ -18,6 +18,7 @@ KIMI_SECTION=$(awk '/^cat > "\$BIN_DIR\/ai-kimi"/,/^KIMIEOF/' "$SCRIPT") GLM_SECTION=$(awk '/^cat > "\$BIN_DIR\/ai-glm"/,/^GLMEOF/' "$SCRIPT") GEMINI_SECTION=$(awk '/^cat > "\$BIN_DIR\/ai-gemini"/,/^GEMINIEOF/' "$SCRIPT") OPENCODE_SECTION=$(awk '/^cat > "\$BIN_DIR\/ai-opencode"/,/^OPENCODEEOF/' "$SCRIPT") +CURSOR_SECTION=$(awk '/^cat > "\$BIN_DIR\/ai-cursor"/,/^CURSOREOF/' "$SCRIPT") HELPERS_SECTION=$(awk '/^cat > "\$HELPERS_FILE"/,/^HELPEREOF/' "$SCRIPT") # ── ai-gpt: auto-install codex ──────────────────────────────────────────── @@ -101,6 +102,16 @@ test_gemini_native_launcher() { fi } +# ── ai-cursor: native launcher generation ────────────────────────────────── +test_cursor_native_launcher() { + if echo "$CURSOR_SECTION" | grep -q 'Cursor CLI (agent)' \ + && echo "$CURSOR_SECTION" | grep -q 'https://cursor.com/install'; then + ok "ai-cursor: native Cursor CLI (agent) launcher is generated" + else + fail "ai-cursor: missing native Cursor CLI launcher generation" + fi +} + # ── global rules: Karpathy-style guidelines and native rule files ─────────── test_global_rules_include_quality_guidelines() { karpathy_line=$(grep -n '^## 1\. Think Before Coding$' "$GLOBAL_RULES_SOURCE" | head -1 | cut -d: -f1) @@ -247,6 +258,7 @@ test_kimi_no_artemox test_glm_claude_launcher test_glm_official_api test_gemini_native_launcher +test_cursor_native_launcher test_global_rules_include_quality_guidelines test_native_rule_files_generated test_fix7_trap_tmp