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:
@@ -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`.
|
||||||
|
|
||||||
|
|||||||
@@ -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-ключи.
|
||||||
|
|
||||||
После установки, если команды не видны:
|
После установки, если команды не видны:
|
||||||
|
|||||||
@@ -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 для недоверенного кода.
|
||||||
|
|
||||||
|
|||||||
@@ -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, эмулятор, проекты)"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user