docs: sync README/QUICK_START/EFFORT_MAPPING with current code

- Update ai-openrouter models in ai-setup.sh output and header
- Fix effort persistence wording (statusbar -> launcher)
- Unify KS_EXCEPTIONS -> KILL_SWITCH_EXCEPTIONS in docs and setup.sh prompt
- Clarify menu item 7 only updates AI launchers
- Add IPv6 note after ks-off.sh
- Scope UFW before.rules insertion to *filter section

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-14 09:16:37 +03:00
parent 6c2844ce92
commit 38b5f2710c
8 changed files with 164 additions and 123 deletions

View File

@@ -2,4 +2,4 @@
Данные правила применяются ко всем агентам, работающим конкретно в этом репозитории. Данные правила применяются ко всем агентам, работающим конкретно в этом репозитории.
1. **Полная перегенерация standalone-скриптов при запуске сетап-скрипта (Full regeneration of standalone scripts on setup run):** При каждом запуске `ai-setup.sh` все генерируемые скрипты в `~/.local/bin/` (`ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`, `ai-gemini`, `ai-api-helpers.sh`, `ai-claude`) должны быть **полностью перезаписаны** актуальными версиями. Запрещено выполнять слияние (merge) старого и нового содержимого или дополнение (append). Скрипт обязан привести все генерируемые файлы к эталонному виду, однозначно определяемому текущей конфигурацией. 1. **Полная перегенерация standalone-скриптов при запуске сетап-скрипта (Full regeneration of standalone scripts on setup run):** При каждом запуске `ai-setup.sh` все генерируемые скрипты в выбранном `BIN_DIR` (`~/bin`, если он уже есть в `PATH`, иначе `~/.local/bin`: `ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`, `ai-gemini`, `ai-api-helpers.sh`, `ai-claude`, `claude-gpt-effort-proxy.py`) должны быть **полностью перезаписаны** актуальными версиями. Запрещено выполнять слияние (merge) старого и нового содержимого или дополнение (append). Скрипт обязан привести все генерируемые файлы к эталонному виду, однозначно определяемому текущей конфигурацией.

View File

@@ -1,116 +1,112 @@
# Effort Mapping Соответствие уровней для всех провайдеров # Effort Mapping - соответствие уровней для Claude Code лаунчеров
## Как это работает ## Как это работает
Когда вы меняете effort в Claude Code (через `/effort` или `--effort`), значение передаётся `/effort` и `AI_EFFORT` относятся к лаунчерам, которые запускают Claude Code:
в API провайдера. Каждый провайдер поддерживает свой набор уровней reasoning effort. `ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`.
Если выбранного уровня нет у провайдера — он автоматически маппится на ближайший
**более высокий** нативный уровень. Нативные лаунчеры `ai-gpt` (OpenAI Codex) и `ai-gemini` (Antigravity `agy`) не используют
эту схему. У них свои настройки reasoning внутри соответствующего CLI.
Документ отражает текущую реализацию `scripts/ai-setup.sh`.
## Таблица маппинга ## Таблица маппинга
> Актуально на 12 июня 2026 г. | Claude Code `/effort` | Anthropic (`ai-claude`) | DeepSeek V4 (`ai-deepseek`) | Kimi K2.7/K2.6 (`ai-kimi`) | OpenRouter/GPT-5.5 (`ai-openrouter`) |
|:---:|:---:|:---:|:---:|:---:|
| `low` | нативно `low` | провайдер поднимает до `high` | thinking on | без локального маппинга |
| `medium` | нативно `medium` | провайдер поднимает до `high` | thinking on | без локального маппинга |
| `high` | нативно `high` | нативно `high` | thinking on | без локального маппинга |
| `xhigh` | нативно `xhigh` | провайдер поднимает до `max` | thinking on | без локального маппинга |
| `max` | нативно `max` | нативно `max` | thinking on | без локального маппинга |
| Claude Code<br>`/effort` | Anthropic<br>(Claude) | GPT-5.5<br>(ChatGPT) | DeepSeek V4 | Kimi K2.7<br>(Moonshot) | Gemini 3.x | Для OpenRouter текущий лаунчер не делает локального преобразования effort и отправляет
|:---:|:---:|:---:|:---:|:---:|:---:| значение дальше через Claude Code/OpenRouter. Конкретная интерпретация зависит от выбранной
| `low` | ✅ `low` | ✅ `low` | ⬆ `high` | 🔛 thinking on | ✅ `LOW` | модели и backend-а OpenRouter.
| `medium` | ✅ `medium` | ✅ `medium` | ⬆ `high` | 🔛 thinking on | ✅ `MEDIUM` |
| `high` | ✅ `high` | ✅ `high` | ✅ `high` | 🔛 thinking on | ✅ `HIGH` |
| `xhigh` | ✅ `xhigh` | ✅ `xhigh` | ⬆ `max` | 🔛 thinking on | ⬆ `HIGH` |
| `max` | ✅ `max` | ⬆ `xhigh` ¹ | ✅ `max` | 🔛 thinking on | ⬆ `HIGH` |
**Обозначения:**
- ✅ — нативная поддержка (1:1 соответствие)
- ⬆ — маппинг на ближайший доступный уровень вверх
- 🔛 — бинарный режим (thinking вкл/выкл, без градаций)
¹ GPT-5.5 не имеет уровня `max` — effort-proxy (`claude-gpt-effort-proxy.py`) маппит `max``xhigh`
## Нативные уровни каждого провайдера ## Нативные уровни каждого провайдера
### Anthropic (Claude) — эталон ### Anthropic (Claude)
```
low → medium → high → xhigh → max
```
- 5 уровней, полное соответствие с Claude Code
- По умолчанию: `xhigh`
- `max` — максимальный бюджет на thinking, для самых сложных задач
### GPT-5.5 (через claude-code-proxy) ```text
low -> medium -> high -> xhigh -> max
``` ```
low → medium → high → xhigh
``` - 5 уровней, полное соответствие с Claude Code.
- 4 основных уровня (также существуют `none` и `minimal`) - Дефолт `ai-claude`: `xhigh`.
- Нет `max` маппится в `xhigh` - `max` - максимальный бюджет thinking для самых сложных задач.
- По умолчанию: `medium`
- Маппинг выполняется effort-proxy на стороне лаунчера
### DeepSeek V4 ### DeepSeek V4
```
high → max
```
- Всего 2 реальных уровня
- `low` и `medium` → автоматически поднимаются до `high`
- `xhigh` → автоматически поднимается до `max`
- Маппинг выполняется на стороне DeepSeek API
### Kimi K2.7 (Moonshot AI) ```text
high -> max
``` ```
- 2 реальных уровня.
- `low` и `medium` фактически поднимаются до `high`.
- `xhigh` фактически поднимается до `max`.
- Маппинг выполняется на стороне DeepSeek API.
- Дефолт `ai-deepseek`: `high`.
### Kimi K2.7/K2.6 (Moonshot AI)
```text
on / off on / off
``` ```
- Бинарный режим — thinking либо включён, либо выключен
- Все уровни effort = thinking включён
- Нет градаций глубины reasoning
- Маппинг выполняется на стороне Moonshot API
### Gemini 3.x (через antigravity-claude-proxy) - Бинарный режим: thinking либо включен, либо выключен.
``` - Все уровни Claude Code effort в текущем лаунчере означают thinking on.
MINIMAL → LOW → MEDIUM → HIGH - Градаций глубины reasoning нет.
``` - Дефолт `ai-kimi`: `high`.
- 4 уровня
- Нет `xhigh` и `max`оба маппятся в `HIGH` ### OpenRouter / GPT-5.5
- Pro-модели: по умолчанию `HIGH`
- Flash-модели: по умолчанию `MEDIUM` Текущий `ai-openrouter` работает через Claude Code с `ANTHROPIC_BASE_URL=https://openrouter.ai/api`
- Маппинг выполняется на стороне antigravity-claude-proxy и не вызывает локальный effort proxy. Поэтому `low`/`medium`/`high`/`xhigh`/`max` не
преобразуются в shell-лаунчере.
`claude-gpt-effort-proxy.py` все еще генерируется как совместимый helper для старого
`claude-code-proxy` backend-а. Если использовать его вручную, он маппит только
`xhigh` -> `high`, потому что `claude-code-proxy` принимает `low`, `medium`, `high`, `max`.
## Где выполняется маппинг ## Где выполняется маппинг
| Провайдер | Кто маппит | Файл/компонент | | Провайдер | Кто маппит | Файл/компонент |
|:---|:---|:---| |:---|:---|:---|
| Anthropic | Не нужен | | | Anthropic | Не нужен | - |
| GPT-5.5 | effort-proxy (наш) | `~/.local/bin/claude-gpt-effort-proxy.py` |
| DeepSeek V4 | DeepSeek API | На стороне сервера | | DeepSeek V4 | DeepSeek API | На стороне сервера |
| Kimi K2.7 | Moonshot API | На стороне сервера | | Kimi K2.7/K2.6 | Moonshot API | На стороне сервера |
| Gemini 3.x | antigravity-claude-proxy | npm пакет | | OpenRouter/GPT-5.5 | Локального маппинга нет | `ai-openrouter` отправляет значение как есть |
| Legacy GPT proxy | helper-маппинг `xhigh` -> `high` | `~/bin/claude-gpt-effort-proxy.py` или `~/.local/bin/claude-gpt-effort-proxy.py` |
## Persistence effort между сессиями ## Persistence effort между сессиями
Каждый лаунчер (`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`) запоминает свой Каждый Claude Code лаунчер (`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`)
уровень effort отдельно. Логика гибридная: запоминает свой уровень effort отдельно. Логика гибридная:
- **`low` / `medium` / `high` / `xhigh`** живут нативно в `settings.json` лаунчера. - `low` / `medium` / `high` / `xhigh` живут нативно в `settings.json` лаунчера.
`/effort` внутри сессии работает как обычно, уровень сохраняется между сессиями. `/effort` внутри сессии работает как обычно, уровень сохраняется между сессиями.
- **`max`** — единственный, который Claude Code **не сохраняет** в `settings.json` - `max` - единственный уровень, который Claude Code не сохраняет в `settings.json`
(он session-only). Поэтому его восстанавливаем через `CLAUDE_CODE_EFFORT_LEVEL`. (он session-only). Поэтому его восстанавливаем через `CLAUDE_CODE_EFFORT_LEVEL`.
Текущий уровень (включая `max`) статусбар пишет в `~/.cache/ai-setup/effort_<launcher>`. Текущий уровень, включая `max`, лаунчер записывает в `~/.cache/ai-setup/effort_<launcher>`.
**Важное следствие (только для `max`):** когда восстановлена `max`-сессия, выставлена Важное следствие только для `max`: когда восстановлена `max`-сессия, выставлена
`CLAUDE_CODE_EFFORT_LEVEL=max`, и `/effort` внутри неё **не сменит** уровень `CLAUDE_CODE_EFFORT_LEVEL=max`, и `/effort` внутри нее не сменит уровень, потому что
(env-переменная жёсткий override Claude Code). На остальных уровнях `/effort` свободен. env-переменная работает как жесткий override Claude Code.
**Как выйти из `max` (или форсить любой уровень):** перезапусти лаунчер с `AI_EFFORT`: Как выйти из `max` или форсить любой уровень:
```bash ```bash
AI_EFFORT=max ai-deepseek # включить и запомнить max AI_EFFORT=max ai-deepseek # включить и запомнить max
AI_EFFORT=high ai-deepseek # вернуться на high (выйти из max) AI_EFFORT=high ai-deepseek # вернуться на high
ai-deepseek # без флага - восстанавливает последний уровень ai-deepseek # без флага - восстановить последний уровень
``` ```
Дефолты при пустом кэше: `xhigh` для `ai-claude`, `high` для остальных. Дефолты при пустом кеше: `xhigh` для `ai-claude`, `high` для остальных Claude Code лаунчеров.
## Рекомендации ## Рекомендации
- **Для повседневной работы:** `high` или `xhigh` — работает одинаково хорошо у всех провайдеров - Для повседневной работы: `high` или `xhigh`.
- **`max` effort:** имеет реальный эффект только у **Anthropic** и **DeepSeek**. Для GPT маппится в `xhigh`, для Gemini и Kimi — в их максимальный уровень - `max` effort имеет реальный эффект у Anthropic и DeepSeek; у Kimi это все тот же thinking on.
- **`low`/`medium`:** у DeepSeek и Kimi фактически не снижают reasoning — DeepSeek поднимет до `high`, Kimi просто включит thinking - `low`/`medium` у DeepSeek и Kimi фактически не снижают reasoning.
- **Смена уровня:** на `low..xhigh` обычным `/effort`; из `max` через `AI_EFFORT=<lvl> ai-<launcher>` (в max-сессии `/effort` залочен env-переменной, см. «Persistence effort») - Смена уровня на `low`..`xhigh`: обычным `/effort`; выход из `max`: через `AI_EFFORT=<lvl> ai-<launcher>`.

View File

@@ -6,9 +6,9 @@
bash setup.sh bash setup.sh
``` ```
Спросит про VLESS-прокси (можно пропустить — `n`), затем установит лаунчеры Спросит про VLESS-прокси (по умолчанию `Y`; если не нужен, ответь `n`), затем установит лаунчеры
`ai-claude`, `ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`, `ai-gemini` `ai-claude`, `ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`, `ai-gemini`
в `~/.local/bin/` и запишет API-ключи. в `~/bin`, если он уже есть в `PATH`, иначе в `~/.local/bin/`, и запишет API-ключи.
После установки, если команды не видны: После установки, если команды не видны:
```bash ```bash
@@ -20,25 +20,24 @@ exec bash
Нужно один раз на каждой машине. .ru трафик идёт напрямую, Нужно один раз на каждой машине. .ru трафик идёт напрямую,
остальное — через Amnezia. Если Amnezia падает, не-.ru блокируется. остальное — через Amnezia. Если Amnezia падает, не-.ru блокируется.
```bash Запускай через `bash setup.sh` и выбери пункт `2) Сеть: ru-bypass + kill switch`.
# Запустить Amnezia, затем узнать gateway и интерфейс: Меню само предложит `GATEWAY` и `DEV` из `ip route show default`, даст выбрать профиль
ip route show default (`home`, `office`, имя хоста и т.д.) и сохранит настройки в
# Пример: default via 192.168.1.1 dev wlp1s0 `~/.config/ai-setup/network_<profile>.conf`.
# Запустить скрипт (дефолты: GATEWAY=192.168.1.1, DEV=wlp1s0) Дополнительные поля можно оставить пустыми:
sudo bash scripts/ru-bypass.sh - `LOCAL_DNS` - DNS для `*.loc`
- `AMNEZIA_SERVER` - IP/домен сервера Amnezia, чтобы VPN мог подняться при kill switch
- `KILL_SWITCH_EXCEPTIONS` - IP/домены, которые должны ходить напрямую
# Если параметры отличаются: После первого запуска systemd-сервисы и timer установлены - при перезагрузке всё поднимается само,
sudo GATEWAY=10.0.0.1 DEV=enp3s0 bash scripts/ru-bypass.sh а RIPE-список обновляется ежедневно.
```
После первого запуска systemd-сервисы установлены — при перезагрузке всё поднимается само.
## Проверка сети ## Проверка сети
```bash ```bash
ip route get 8.8.8.8 # -> dev amn0 (через VPN) ip route get 8.8.8.8 # -> dev amn0 (через VPN)
ip route get $(dig +short ya.ru A | head -1) # -> dev wlp1s0 (напрямую) ip route get $(dig +short ya.ru A | head -1) # -> dev <DEV> (напрямую)
bash tests/test_network.sh bash tests/test_network.sh
``` ```

View File

@@ -9,14 +9,17 @@
``` ```
setup.sh # мастер-скрипт с меню setup.sh # мастер-скрипт с меню
scripts/ scripts/
├── ai-setup.sh # устанавливает AI-инструменты в ~/.local/bin ├── ai-setup.sh # устанавливает AI-инструменты в выбранный BIN_DIR
├── fuck-rkn.sh # серверный установщик nginx + telemt + xray
├── ru-bypass.sh # .ru трафик напрямую, kill switch для остального ├── ru-bypass.sh # .ru трафик напрямую, kill switch для остального
├── ks-off.sh # временно отключить kill switch ├── ks-off.sh # временно отключить kill switch
└── ks-on.sh # восстановить kill switch └── ks-on.sh # восстановить kill switch
home-configs/ home-configs/
├── GLOBAL_RULES.md # глобальные правила для всех агентов ├── GLOBAL_RULES.md # глобальные правила для всех агентов
├── claude/ ├── claude/
── skills/ # кастомные скиллы для Claude Code (и Gemini) ── hooks/ # хуки аккаунтов Claude Code
│ ├── skills/ # кастомные скиллы для Claude Code (и Gemini)
│ └── statusline-command.sh # статусная строка Claude Code
├── network/ ├── network/
│ └── README.md # подробная документация по сетевой настройке │ └── README.md # подробная документация по сетевой настройке
├── vless/ ├── vless/
@@ -27,6 +30,7 @@ tests/
├── test_fixes.sh # юнит-тесты структуры ai-setup.sh ├── test_fixes.sh # юнит-тесты структуры ai-setup.sh
└── test_network.sh # тесты маршрутизации └── test_network.sh # тесты маршрутизации
test_isolated.sh # проверка автоустановки ai-gpt и ai-kimi test_isolated.sh # проверка автоустановки ai-gpt и ai-kimi
test_sigint.sh # ручной тест поведения SIGINT
``` ```
## Установка ## Установка
@@ -49,6 +53,7 @@ bash setup.sh
4) Включить kill switch 4) Включить kill switch
5) Статус 5) Статус
6) Проверить сеть 6) Проверить сеть
7) Обновить # git pull + перегенерация AI-лаунчеров
``` ```
После установки, если shell ещё не видит новые команды: После установки, если shell ещё не видит новые команды:
@@ -85,7 +90,8 @@ before.rules: RFC1918 — 10/8, 172.16/12, 192.168/16 тоже напр
### Первый запуск ### Первый запуск
Через меню (`bash setup.sh` → пункт 2) - он автоматически определит GATEWAY и DEV Через меню (`bash setup.sh` → пункт 2) - он автоматически определит GATEWAY и DEV
из `ip route show default` и сохранит их в `~/.config/ai-setup/network_$(hostname).conf`. из `ip route show default`, предложит профиль и сохранит настройки в
`~/.config/ai-setup/network_<profile>.conf` (по умолчанию профиль равен `$(hostname)`).
Или напрямую: Или напрямую:
@@ -101,14 +107,19 @@ sudo GATEWAY=10.0.0.1 DEV=eth0 bash scripts/ru-bypass.sh
- Скрипт копируется в `/usr/local/bin/ru-bypass.sh` - Скрипт копируется в `/usr/local/bin/ru-bypass.sh`
- `ru-ipset-restore.service` - восстанавливает ipset из файла **до старта UFW** при загрузке - `ru-ipset-restore.service` - восстанавливает ipset из файла **до старта UFW** при загрузке
- `ru-bypass.service` - обновляет RIPE-список и маршруты после network-online - `ru-bypass.service` - обновляет RIPE-список и маршруты после network-online
- `ru-bypass.timer` - ежедневно запускает обновление RIPE-списка и маршрутов
- NM dispatcher `/etc/NetworkManager/dispatcher.d/99-ru-bypass` - перезапускает скрипт при поднятии amn0 - NM dispatcher `/etc/NetworkManager/dispatcher.d/99-ru-bypass` - перезапускает скрипт при поднятии amn0
- `/etc/ru-bypass.conf` - root-конфиг для запусков из systemd/NM dispatcher
- `/etc/hosts` блок для локальных Eltex-доменов
При каждом запуске: При каждом запуске:
- Скачивает список .ru IP-блоков из RIPE (кэш 24ч, `/var/cache/ru-delegations.txt`) - Скачивает список .ru IP-блоков из RIPE (кэш 24ч, `/var/cache/ru-delegations.txt`)
- Обновляет ipset `ru-direct` (~11000 записей) - Обновляет ipset `ru-direct` (~11000 записей)
- Добавляет в ipset встроенные и пользовательские kill switch исключения
- Сохраняет ipset в `/etc/ipset.conf` для восстановления после ребута - Сохраняет ipset в `/etc/ipset.conf` для восстановления после ребута
- Добавляет маршруты через GATEWAY для всех .ru блоков и RFC1918 - Добавляет маршруты через GATEWAY для всех .ru блоков и RFC1918
- Обновляет UFW `before.rules`, добавляет прямые iptables-правила и отключает IPv6 при активном kill switch
### ks-off / ks-on ### ks-off / ks-on
@@ -130,8 +141,8 @@ sudo bash scripts/ks-on.sh
```bash ```bash
ip route get 8.8.8.8 # -> dev amn0 (Google через VPN) ip route get 8.8.8.8 # -> dev amn0 (Google через VPN)
ip route get 77.88.8.8 # -> dev wlp1s0 (ya.ru напрямую) ip route get 77.88.8.8 # -> dev <DEV> (ya.ru напрямую)
ip route get 10.10.0.1 # -> dev wlp1s0 (*.loc напрямую) ip route get 10.10.0.1 # -> dev <DEV> (*.loc напрямую)
bash tests/test_network.sh # полные тесты bash tests/test_network.sh # полные тесты
``` ```
@@ -139,16 +150,17 @@ bash tests/test_network.sh # полные тесты
`scripts/ai-setup.sh` устанавливает и настраивает все AI CLI. `scripts/ai-setup.sh` устанавливает и настраивает все AI CLI.
После запуска генерируются или обновляются в `~/.local/bin`: После запуска генерируются или обновляются в выбранном `BIN_DIR`: `~/bin`, если он уже есть
в `PATH`, иначе `~/.local/bin`.
- `ai-claude` - Claude Code (Anthropic API) - `ai-claude` - Claude Code (Anthropic API)
- `ai-gpt` - нативный OpenAI Codex CLI - `ai-gpt` - нативный OpenAI Codex CLI
- `ai-deepseek` - Claude Code через DeepSeek API - `ai-deepseek` - Claude Code через DeepSeek API
- `ai-kimi` - Claude Code через официальный Kimi Code API (`api.kimi.com/coding`) - `ai-kimi` - Claude Code через официальный Kimi Code API (`api.kimi.com/coding`)
- `ai-openrouter` - Claude Code через OpenRouter (GPT-5.5, Claude и др.) - `ai-openrouter` - Claude Code через OpenRouter (GPT-5.5, Grok, Qwen, MiniMax, Llama и др.)
- `ai-gemini` - нативный Antigravity CLI `agy` - `ai-gemini` - нативный Antigravity CLI `agy`
- `ai-api-helpers.sh` - вспомогательные функции для лаунчеров - `ai-api-helpers.sh` - вспомогательные функции для лаунчеров
- `claude-gpt-effort-proxy.py` - прокси для маппинга effort-уровней (GPT backend) - `claude-gpt-effort-proxy.py` - совместимый helper для старого GPT/claude-code-proxy backend
Все генерируемые скрипты полностью перезаписываются при каждом запуске `scripts/ai-setup.sh`. Все генерируемые скрипты полностью перезаписываются при каждом запуске `scripts/ai-setup.sh`.
@@ -166,7 +178,8 @@ bash tests/test_network.sh # полные тесты
- Устанавливает Xray, генерирует конфиг, создаёт systemd сервис - Устанавливает Xray, генерирует конфиг, создаёт systemd сервис
- Все лаунчеры оборачиваются в `proxychains4` - Все лаунчеры оборачиваются в `proxychains4`
Если выбрать **n** - VLESS отключается, прокси и IPv6 сбрасываются в дефолт. Если выбрать **n** - VLESS отключается, xray останавливается, системный/Firefox прокси
сбрасываются в direct. IPv6 включается обратно только если UFW kill switch не активен.
## Ключи и конфиги ## Ключи и конфиги
@@ -174,7 +187,7 @@ bash tests/test_network.sh # полные тесты
- `~/.config/ai-setup/kimi_key` - Kimi API key (права 600) - `~/.config/ai-setup/kimi_key` - Kimi API key (права 600)
- `~/.config/ai-setup/openrouter_key` - OpenRouter API key (права 600) - `~/.config/ai-setup/openrouter_key` - OpenRouter API key (права 600)
- `~/.config/ai-setup/global_rules.md` - глобальные правила агентов - `~/.config/ai-setup/global_rules.md` - глобальные правила агентов
- `~/.config/ai-setup/network_$(hostname).conf` - сохранённые GATEWAY/DEV для текущей машины - `~/.config/ai-setup/network_<profile>.conf` - сохранённые сетевые профили (`GATEWAY`, `DEV`, `LOCAL_DNS`, `AMNEZIA_SERVER`, `KILL_SWITCH_EXCEPTIONS`)
## Права запуска агентов ## Права запуска агентов
@@ -193,10 +206,12 @@ Surgical Changes, Goal-Driven Execution) плюс пользовательски
## Effort Mapping ## Effort Mapping
`EFFORT_MAPPING.md` - таблица маппинга effort-уровней (`low`/`medium`/`high`/`xhigh`/`max`) `EFFORT_MAPPING.md` - таблица effort-уровней (`low`/`medium`/`high`/`xhigh`/`max`)
между провайдерами (Anthropic, GPT-5.5, DeepSeek V4, Kimi K2.6, Gemini 3.x). для Claude Code лаунчеров (`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`).
Нативные `ai-gpt` и `ai-gemini` живут отдельно.
`claude-gpt-effort-proxy.py` маппит `xhigh` `high` для GPT-бэкенда (нет нативного `xhigh` у GPT). `claude-gpt-effort-proxy.py` маппит `xhigh` -> `high` для совместимости со старым
GPT/claude-code-proxy backend; текущие лаунчеры его напрямую не вызывают.
## Требования ## Требования
@@ -212,4 +227,5 @@ Surgical Changes, Goal-Driven Execution) плюс пользовательски
bash tests/test_fixes.sh # структура ai-setup.sh и синтаксис bash bash tests/test_fixes.sh # структура ai-setup.sh и синтаксис bash
bash test_isolated.sh # автоустановка ai-gpt и ai-kimi через mock curl bash test_isolated.sh # автоустановка ai-gpt и ai-kimi через mock curl
bash tests/test_network.sh # маршрутизация (нужен активный ru-bypass) bash tests/test_network.sh # маршрутизация (нужен активный ru-bypass)
# test_sigint.sh # ручной диагностический тест SIGINT
``` ```

View File

@@ -16,7 +16,9 @@
| `ks-off.sh` | Временно отключить UFW kill switch (доступ без VPN) | | `ks-off.sh` | Временно отключить UFW kill switch (доступ без VPN) |
| `ks-on.sh` | Восстановить UFW kill switch | | `ks-on.sh` | Восстановить UFW kill switch |
Все скрипты запускаются явно от root. Никакой автоустановки нет. Сетевые скрипты запускаются от root. Обычно их дергает `setup.sh` через `sudo` и сохраняет
профиль в `~/.config/ai-setup/network_<profile>.conf`; сам `ru-bypass.sh` дополнительно
пишет root-конфиг `/etc/ru-bypass.conf` для systemd и NetworkManager dispatcher.
--- ---
@@ -29,7 +31,7 @@ Amnezia поднимает интерфейс `amn0` и захватывает
- `128.0.0.0/1 dev amn0` - `128.0.0.0/1 dev amn0`
`ru-bypass.sh` добавляет тысячи **более специфичных** маршрутов для .ru IP-блоков через `ru-bypass.sh` добавляет тысячи **более специфичных** маршрутов для .ru IP-блоков через
локальный роутер (например `95.173.0.0/16 via 192.168.1.1 dev wlp1s0`). Ядро Linux локальный роутер (например `95.173.0.0/16 via <GATEWAY> dev <DEV>`). Ядро Linux
выбирает самый специфичный маршрут - .ru уходит напрямую, всё остальное - в amn0. выбирает самый специфичный маршрут - .ru уходит напрямую, всё остальное - в amn0.
### UFW kill switch ### UFW kill switch
@@ -37,13 +39,13 @@ Amnezia поднимает интерфейс `amn0` и захватывает
``` ```
default deny outgoing — запрещено всё по умолчанию default deny outgoing — запрещено всё по умолчанию
allow out on amn0 — через Amnezia можно всё allow out on amn0 — через Amnezia можно всё
before.rules: ipset ru-direct — для .ru IP разрешён прямой выход на wlp1s0 before.rules: ipset ru-direct — для .ru IP разрешён прямой выход на DEV
before.rules: 10/8, 172.16/12, before.rules: 10/8, 172.16/12,
192.168/16 — RFC1918 (*.loc) разрешён прямой выход на wlp1s0 192.168/16 — RFC1918 (*.loc) разрешён прямой выход на DEV
``` ```
Если Amnezia падает: `amn0` исчезает, не-.ru трафик блокируется UFW. Маршруты .ru Если Amnezia падает: `amn0` исчезает, не-.ru трафик блокируется UFW. Маршруты .ru
через wlp1s0 и правило UFW для ipset остаются - .ru работает. через `DEV` и правило UFW для ipset остаются - .ru работает.
### Что делает скрипт при запуске ### Что делает скрипт при запуске
@@ -52,7 +54,12 @@ before.rules: 10/8, 172.16/12,
3. Сохраняет ipset в `/etc/ipset.conf` 3. Сохраняет ipset в `/etc/ipset.conf`
4. Добавляет маршруты через локальный роутер для всех .ru блоков 4. Добавляет маршруты через локальный роутер для всех .ru блоков
5. Добавляет маршруты для RFC1918 диапазонов (`10/8`, `172.16/12`, `192.168/16`) - нужно для `*.loc` 5. Добавляет маршруты для RFC1918 диапазонов (`10/8`, `172.16/12`, `192.168/16`) - нужно для `*.loc`
6. При первом запуске: добавляет правила в `/etc/ufw/before.rules` и устанавливает systemd сервисы 6. Добавляет встроенные исключения kill switch (`mattermost.eltex-co.ru`, `elph.eltex-co.ru`, `10.80.0.15`)
7. Добавляет пользовательские исключения из `AMNEZIA_SERVER` и `KILL_SWITCH_EXCEPTIONS`
8. Обновляет блок локальных Eltex-хостов в `/etc/hosts`
9. Если задан `LOCAL_DNS`, настраивает `resolvectl` для `~loc` на интерфейсе `DEV`
10. Обновляет `/etc/ufw/before.rules`, прямые iptables-правила и отключает IPv6 при активном kill switch
11. При первом запуске: устанавливает systemd service/timer и NetworkManager dispatcher
### Сервисы (устанавливаются однократно) ### Сервисы (устанавливаются однократно)
@@ -60,6 +67,7 @@ before.rules: 10/8, 172.16/12,
Нужен потому что UFW стартует рано и не знает об ipset `ru-direct`. Нужен потому что UFW стартует рано и не знает об ipset `ru-direct`.
- `ru-bypass.service` - запускается после network-online, качает свежий RIPE-список и - `ru-bypass.service` - запускается после network-online, качает свежий RIPE-список и
добавляет маршруты. добавляет маршруты.
- `ru-bypass.timer` - ежедневно запускает `ru-bypass.service` для обновления RIPE-списка.
- NM dispatcher `/etc/NetworkManager/dispatcher.d/99-ru-bypass` - автоматически перезапускает - NM dispatcher `/etc/NetworkManager/dispatcher.d/99-ru-bypass` - автоматически перезапускает
скрипт когда amn0 поднимается (Amnezia переподключилась). скрипт когда amn0 поднимается (Amnezia переподключилась).
@@ -67,21 +75,39 @@ before.rules: 10/8, 172.16/12,
## Запуск ## Запуск
### Первый запуск / обновление ### Первый запуск / обновление через меню
```bash
bash setup.sh
# выбери пункт 2) Сеть: ru-bypass + kill switch
```
Меню предложит значения из `ip route show default`, даст выбрать профиль (`home`, `office`,
`$(hostname)` и т.д.) и сохранит:
```bash
GATEWAY=...
DEV=...
LOCAL_DNS=...
AMNEZIA_SERVER=...
KILL_SWITCH_EXCEPTIONS=...
```
### Прямой запуск скрипта
```bash ```bash
sudo bash scripts/ru-bypass.sh sudo bash scripts/ru-bypass.sh
``` ```
Скрипт сам установит сервисы, добавит правило UFW и настроит NM dispatcher. Если env-переменные не переданы, скрипт сначала читает `/etc/ru-bypass.conf`, а потом
использует legacy-дефолты `GATEWAY=192.168.1.1`, `DEV=wlp1s0`.
### Параметры для другой сети ### Параметры для другой сети
По умолчанию используется домашняя сеть (`GATEWAY=192.168.1.1`, `DEV=wlp1s0`). Для другой сети передай параметры через env:
Для другой машины передай параметры через env:
```bash ```bash
sudo GATEWAY=10.0.0.1 DEV=enp3s0 bash ru-bypass.sh sudo GATEWAY=10.0.0.1 DEV=enp3s0 LOCAL_DNS=10.0.0.53 bash scripts/ru-bypass.sh
``` ```
Чтобы узнать нужные значения: Чтобы узнать нужные значения:
@@ -94,12 +120,13 @@ ip route show default
### Офисная машина ### Офисная машина
Если в офисе другой gateway и другой сетевой интерфейс - просто передай их через env. Если в офисе другой gateway и другой сетевой интерфейс - создай отдельный профиль через
Amnezia там тоже поднимает `amn0`, так что остальное работает одинаково. пункт 2 в `setup.sh` или передай значения через env. Amnezia там тоже поднимает `amn0`,
так что остальное работает одинаково.
Пример (офис с проводным интерфейсом): Пример (офис с проводным интерфейсом):
```bash ```bash
sudo GATEWAY=192.168.0.1 DEV=eth0 bash ru-bypass.sh sudo GATEWAY=192.168.0.1 DEV=eth0 LOCAL_DNS=192.168.0.53 bash scripts/ru-bypass.sh
``` ```
--- ---
@@ -118,6 +145,9 @@ sudo bash scripts/ks-off.sh
Отключает UFW. После этого - отключить Amnezia через GUI. Трафик пойдёт напрямую через Отключает UFW. После этого - отключить Amnezia через GUI. Трафик пойдёт напрямую через
провайдера (российский IP). провайдера (российский IP).
**Примечание:** IPv6 остаётся отключённым после `ks-off.sh` (если он был выключен `ks-on.sh`
или `ru-bypass.sh`). Он восстановится автоматически при следующем `ks-on.sh` или перезагрузке.
**Важно:** выйди из Claude Code перед этим - сессия будет идти с другого IP. **Важно:** выйди из Claude Code перед этим - сессия будет идти с другого IP.
### ks-on.sh - восстановить kill switch ### ks-on.sh - восстановить kill switch
@@ -150,7 +180,7 @@ sudo bash scripts/ks-on.sh
```bash ```bash
# Эти команды без sudo: # Эти команды без sudo:
ip route get 8.8.8.8 # -> dev amn0 (Google через VPN) ip route get 8.8.8.8 # -> dev amn0 (Google через VPN)
ip route get 95.173.136.1 # -> dev wlp1s0 (ozon.ru напрямую) ip route get 95.173.136.1 # -> dev <DEV> (ozon.ru напрямую)
ip route get $(dig +short api.anthropic.com A | head -1) # -> dev amn0 ip route get $(dig +short api.anthropic.com A | head -1) # -> dev amn0
# Полные тесты: # Полные тесты:

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# ============================================================ # ============================================================
# AI Setup - Claude / GPT-5.5 / DeepSeek / Kimi / Gemini # AI Setup - Claude / GPT-5.5 / Grok / Qwen / DeepSeek / Kimi / MiniMax / Llama / Gemini
# Запуск: bash ai-setup.sh # Запуск: bash ai-setup.sh
# ============================================================ # ============================================================
@@ -1663,7 +1663,7 @@ echo " На базе Claude Code:"
echo -e " ${CYAN}ai-claude${NC} - Оригинальный Claude Code (Anthropic)" echo -e " ${CYAN}ai-claude${NC} - Оригинальный Claude Code (Anthropic)"
echo -e " ${CYAN}ai-deepseek${NC} - DeepSeek (через Claude Code, API ключ сохраняется)" echo -e " ${CYAN}ai-deepseek${NC} - DeepSeek (через Claude Code, API ключ сохраняется)"
echo -e " ${CYAN}ai-kimi${NC} - Kimi K2.7 Code (через Claude Code, API ключ сохраняется)" echo -e " ${CYAN}ai-kimi${NC} - Kimi K2.7 Code (через Claude Code, API ключ сохраняется)"
echo -e " ${CYAN}ai-openrouter${NC} - OpenRouter (через Claude Code: GPT-5.5, Opus 4.8, Sonnet 4.6)" echo -e " ${CYAN}ai-openrouter${NC} - OpenRouter (через Claude Code: GPT-5.5, Grok, Qwen, MiniMax, Llama и др.)"
echo "" echo ""
echo " Нативные CLI:" echo " Нативные CLI:"
echo -e " ${CYAN}ai-gpt${NC} - OpenAI Codex (нативный CLI, автоустановка)" echo -e " ${CYAN}ai-gpt${NC} - OpenAI Codex (нативный CLI, автоустановка)"

View File

@@ -335,8 +335,8 @@ sed -i "/-A ufw-before-output -d 172\.16\.0\.0\/12 -o/d" "$UFW_BEFORE"
sed -i "/-A ufw-before-output -d 192\.168\.0\.0\/16 -o/d" "$UFW_BEFORE" sed -i "/-A ufw-before-output -d 192\.168\.0\.0\/16 -o/d" "$UFW_BEFORE"
# Добавляем правила заново с актуальным DEV # Добавляем правила заново с актуальным DEV
sed -i "0,/^COMMIT/{s/^COMMIT/# $UFW_IPSET_MARKER\n-A ufw-before-output -m set --match-set $SETNAME dst -o $DEV -j ACCEPT\nCOMMIT/}" "$UFW_BEFORE" sed -i "/^\\*filter/,/^COMMIT/{s/^COMMIT/# $UFW_IPSET_MARKER\\n-A ufw-before-output -m set --match-set $SETNAME dst -o $DEV -j ACCEPT\\nCOMMIT/}" "$UFW_BEFORE"
sed -i "0,/^COMMIT/{s/^COMMIT/# $UFW_LOCAL_MARKER\n-A ufw-before-output -d 10.0.0.0\/8 -o $DEV -j ACCEPT\n-A ufw-before-output -d 172.16.0.0\/12 -o $DEV -j ACCEPT\n-A ufw-before-output -d 192.168.0.0\/16 -o $DEV -j ACCEPT\nCOMMIT/}" "$UFW_BEFORE" sed -i "/^\\*filter/,/^COMMIT/{s/^COMMIT/# $UFW_LOCAL_MARKER\\n-A ufw-before-output -d 10.0.0.0\\/8 -o $DEV -j ACCEPT\\n-A ufw-before-output -d 172.16.0.0\\/12 -o $DEV -j ACCEPT\\n-A ufw-before-output -d 192.168.0.0\\/16 -o $DEV -j ACCEPT\\nCOMMIT/}" "$UFW_BEFORE"
echo "UFW before.rules обновлён (ipset + локальные сети, DEV=$DEV)." echo "UFW before.rules обновлён (ipset + локальные сети, DEV=$DEV)."

View File

@@ -113,7 +113,7 @@ case "$choice" in
read -rp "DEV (интерфейс) [${auto_dev}]: " dev read -rp "DEV (интерфейс) [${auto_dev}]: " dev
read -rp "LOCAL_DNS (DNS для *.loc) [${saved_local_dns:-пусто}]: " local_dns read -rp "LOCAL_DNS (DNS для *.loc) [${saved_local_dns:-пусто}]: " local_dns
read -rp "AMNEZIA_SERVER (IP/домен сервера Amnezia) [${saved_amn_srv:-пусто}]: " amn_srv read -rp "AMNEZIA_SERVER (IP/домен сервера Amnezia) [${saved_amn_srv:-пусто}]: " amn_srv
read -e -rp "KS_EXCEPTIONS (исключения kill switch: IP/домены через пробел): " -i "${saved_ks_exc}" ks_exc read -e -rp "KILL_SWITCH_EXCEPTIONS (исключения kill switch: IP/домены через пробел): " -i "${saved_ks_exc}" ks_exc
gw="${gw:-$auto_gw}" gw="${gw:-$auto_gw}"
dev="${dev:-$auto_dev}" dev="${dev:-$auto_dev}"
[ "$local_dns" = "пусто" ] && local_dns="" [ "$local_dns" = "пусто" ] && local_dns=""