feat: добавить ai-cursor лаунчер (нативный Cursor CLI agent)

Генерация нативного лаунчера 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 <noreply@anthropic.com>
This commit is contained in:
Виталий Никитенко
2026-06-30 09:26:41 +03:00
parent 5038b4f8c6
commit 9b906823cd
5 changed files with 65 additions and 4 deletions

View File

@@ -5,8 +5,9 @@
`/effort` и `AI_EFFORT` относятся к лаунчерам, которые запускают Claude Code: `/effort` и `AI_EFFORT` относятся к лаунчерам, которые запускают Claude Code:
`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-glm`, `ai-openrouter`, `ai-opencode`. `ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-glm`, `ai-openrouter`, `ai-opencode`.
Нативные лаунчеры `ai-gpt` (OpenAI Codex) и `ai-gemini` (Antigravity `agy`) не используют Нативные лаунчеры `ai-gpt` (OpenAI Codex), `ai-gemini` (Antigravity `agy`) и `ai-cursor`
эту схему. У них свои настройки reasoning внутри соответствующего CLI. (Cursor CLI `agent`) не используют эту схему. У них свои настройки reasoning внутри
соответствующего CLI.
Документ отражает текущую реализацию `scripts/ai-setup.sh`. Документ отражает текущую реализацию `scripts/ai-setup.sh`.

View File

@@ -7,7 +7,7 @@ bash setup.sh
``` ```
Спросит про VLESS-прокси (по умолчанию `Y`; если не нужен, ответь `n`), затем установит лаунчеры Спросит про 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-ключи. в `~/bin`, если он уже есть в `PATH`, иначе в `~/.local/bin/`, и запишет API-ключи.
После установки, если команды не видны: После установки, если команды не видны:

View File

@@ -161,6 +161,7 @@ bash tests/test_network.sh # полные тесты
- `ai-openrouter` - Claude Code через OpenRouter (GPT-5.5, Grok, Qwen, GLM 5.2 и др.) - `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-opencode` - Claude Code через OpenCode Go + routatic-proxy (DeepSeek, Kimi, Qwen, GLM, MiniMax, MiMo)
- `ai-gemini` - нативный Antigravity CLI `agy` - `ai-gemini` - нативный Antigravity CLI `agy`
- `ai-cursor` - нативный Cursor CLI `agent`
- `ai-api-helpers.sh` - вспомогательные функции для лаунчеров - `ai-api-helpers.sh` - вспомогательные функции для лаунчеров
- `claude-gpt-effort-proxy.py` - совместимый helper для старого GPT/claude-code-proxy backend - `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-gpt` использует `--dangerously-bypass-approvals-and-sandbox`
- `ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-glm`, `ai-openrouter`, `ai-opencode`, `ai-gemini` используют `--dangerously-skip-permissions` - `ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-glm`, `ai-openrouter`, `ai-opencode`, `ai-gemini` используют `--dangerously-skip-permissions`
- `ai-cursor` использует `--force` (алиас `--yolo`)
Удобно для локального coding workflow, но это не sandbox для недоверенного кода. Удобно для локального coding workflow, но это не sandbox для недоверенного кода.

View File

@@ -2179,6 +2179,50 @@ chmod +x "$BIN_DIR/ai-gemini"
# Подменяем путь к agy, если BIN_DIR отличается от ~/.local/bin # Подменяем путь к 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" [ "$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 === # === ai-claude ===
cat > "$BIN_DIR/ai-claude" << 'CLAUDEEOF' cat > "$BIN_DIR/ai-claude" << 'CLAUDEEOF'
#!/usr/bin/env bash #!/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-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/^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:]]*\)"\$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-claude"
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-opencode" sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-opencode"
success "proxychains4 интегрирован" 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 if [ "$BIN_DIR" != "$HOME/.local/bin" ]; then
warn "BIN_DIR=$BIN_DIR — удаляю старые скрипты из ~/.local/bin/ ..." warn "BIN_DIR=$BIN_DIR — удаляю старые скрипты из ~/.local/bin/ ..."
rm -f "$HOME/.local/bin/ai-gpt" "$HOME/.local/bin/ai-deepseek" "$HOME/.local/bin/ai-kimi" \ 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-opencode" \
"$HOME/.local/bin/ai-api-helpers.sh" "$HOME/.local/bin/claude-gpt-effort-proxy.py" "$HOME/.local/bin/ai-api-helpers.sh" "$HOME/.local/bin/claude-gpt-effort-proxy.py"
fi fi
@@ -2333,6 +2378,7 @@ echo ""
echo " Нативные CLI:" echo " Нативные CLI:"
echo -e " ${CYAN}ai-gpt${NC} - OpenAI Codex (нативный CLI, автоустановка)" echo -e " ${CYAN}ai-gpt${NC} - OpenAI Codex (нативный CLI, автоустановка)"
echo -e " ${CYAN}ai-gemini${NC} - Gemini (нативный agy CLI, автоустановка)" echo -e " ${CYAN}ai-gemini${NC} - Gemini (нативный agy CLI, автоустановка)"
echo -e " ${CYAN}ai-cursor${NC} - Cursor (нативный Cursor CLI, автоустановка)"
echo "" echo ""
echo " Android CLI:" echo " Android CLI:"
echo -e " ${CYAN}android${NC} - Google Android CLI (SDK, эмулятор, проекты)" echo -e " ${CYAN}android${NC} - Google Android CLI (SDK, эмулятор, проекты)"

View File

@@ -18,6 +18,7 @@ KIMI_SECTION=$(awk '/^cat > "\$BIN_DIR\/ai-kimi"/,/^KIMIEOF/' "$SCRIPT")
GLM_SECTION=$(awk '/^cat > "\$BIN_DIR\/ai-glm"/,/^GLMEOF/' "$SCRIPT") GLM_SECTION=$(awk '/^cat > "\$BIN_DIR\/ai-glm"/,/^GLMEOF/' "$SCRIPT")
GEMINI_SECTION=$(awk '/^cat > "\$BIN_DIR\/ai-gemini"/,/^GEMINIEOF/' "$SCRIPT") GEMINI_SECTION=$(awk '/^cat > "\$BIN_DIR\/ai-gemini"/,/^GEMINIEOF/' "$SCRIPT")
OPENCODE_SECTION=$(awk '/^cat > "\$BIN_DIR\/ai-opencode"/,/^OPENCODEEOF/' "$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") HELPERS_SECTION=$(awk '/^cat > "\$HELPERS_FILE"/,/^HELPEREOF/' "$SCRIPT")
# ── ai-gpt: auto-install codex ──────────────────────────────────────────── # ── ai-gpt: auto-install codex ────────────────────────────────────────────
@@ -101,6 +102,16 @@ test_gemini_native_launcher() {
fi 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 ─────────── # ── global rules: Karpathy-style guidelines and native rule files ───────────
test_global_rules_include_quality_guidelines() { test_global_rules_include_quality_guidelines() {
karpathy_line=$(grep -n '^## 1\. Think Before Coding$' "$GLOBAL_RULES_SOURCE" | head -1 | cut -d: -f1) 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_claude_launcher
test_glm_official_api test_glm_official_api
test_gemini_native_launcher test_gemini_native_launcher
test_cursor_native_launcher
test_global_rules_include_quality_guidelines test_global_rules_include_quality_guidelines
test_native_rule_files_generated test_native_rule_files_generated
test_fix7_trap_tmp test_fix7_trap_tmp