diff --git a/AGENTS.md b/AGENTS.md
index 369af2b..dc582d5 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -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). Скрипт обязан привести все генерируемые файлы к эталонному виду, однозначно определяемому текущей конфигурацией.
diff --git a/EFFORT_MAPPING.md b/EFFORT_MAPPING.md
index 2018073..026e44b 100644
--- a/EFFORT_MAPPING.md
+++ b/EFFORT_MAPPING.md
@@ -1,116 +1,112 @@
-# Effort Mapping — Соответствие уровней для всех провайдеров
+# Effort Mapping - соответствие уровней для Claude Code лаунчеров
## Как это работает
-Когда вы меняете effort в Claude Code (через `/effort` или `--effort`), значение передаётся
-в API провайдера. Каждый провайдер поддерживает свой набор уровней reasoning effort.
-Если выбранного уровня нет у провайдера — он автоматически маппится на ближайший
-**более высокий** нативный уровень.
+`/effort` и `AI_EFFORT` относятся к лаунчерам, которые запускают Claude Code:
+`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
`/effort` | Anthropic
(Claude) | GPT-5.5
(ChatGPT) | DeepSeek V4 | Kimi K2.7
(Moonshot) | Gemini 3.x |
-|:---:|:---:|:---:|:---:|:---:|:---:|
-| `low` | ✅ `low` | ✅ `low` | ⬆ `high` | 🔛 thinking on | ✅ `LOW` |
-| `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`
+Для OpenRouter текущий лаунчер не делает локального преобразования effort и отправляет
+значение дальше через Claude Code/OpenRouter. Конкретная интерпретация зависит от выбранной
+модели и backend-а OpenRouter.
## Нативные уровни каждого провайдера
-### Anthropic (Claude) — эталон
-```
-low → medium → high → xhigh → max
-```
-- 5 уровней, полное соответствие с Claude Code
-- По умолчанию: `xhigh`
-- `max` — максимальный бюджет на thinking, для самых сложных задач
+### Anthropic (Claude)
-### GPT-5.5 (через claude-code-proxy)
+```text
+low -> medium -> high -> xhigh -> max
```
-low → medium → high → xhigh
-```
-- 4 основных уровня (также существуют `none` и `minimal`)
-- Нет `max` → маппится в `xhigh`
-- По умолчанию: `medium`
-- Маппинг выполняется effort-proxy на стороне лаунчера
+
+- 5 уровней, полное соответствие с Claude Code.
+- Дефолт `ai-claude`: `xhigh`.
+- `max` - максимальный бюджет thinking для самых сложных задач.
### 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
```
-- Бинарный режим — thinking либо включён, либо выключен
-- Все уровни effort = thinking включён
-- Нет градаций глубины reasoning
-- Маппинг выполняется на стороне Moonshot API
-### Gemini 3.x (через antigravity-claude-proxy)
-```
-MINIMAL → LOW → MEDIUM → HIGH
-```
-- 4 уровня
-- Нет `xhigh` и `max` → оба маппятся в `HIGH`
-- Pro-модели: по умолчанию `HIGH`
-- Flash-модели: по умолчанию `MEDIUM`
-- Маппинг выполняется на стороне antigravity-claude-proxy
+- Бинарный режим: thinking либо включен, либо выключен.
+- Все уровни Claude Code effort в текущем лаунчере означают thinking on.
+- Градаций глубины reasoning нет.
+- Дефолт `ai-kimi`: `high`.
+
+### OpenRouter / GPT-5.5
+
+Текущий `ai-openrouter` работает через Claude Code с `ANTHROPIC_BASE_URL=https://openrouter.ai/api`
+и не вызывает локальный 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 | Не нужен | — |
-| GPT-5.5 | effort-proxy (наш) | `~/.local/bin/claude-gpt-effort-proxy.py` |
+| Anthropic | Не нужен | - |
| DeepSeek V4 | DeepSeek API | На стороне сервера |
-| Kimi K2.7 | Moonshot API | На стороне сервера |
-| Gemini 3.x | antigravity-claude-proxy | npm пакет |
+| Kimi K2.7/K2.6 | Moonshot API | На стороне сервера |
+| 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 между сессиями
-Каждый лаунчер (`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`) запоминает свой
-уровень effort отдельно. Логика гибридная:
+Каждый Claude Code лаунчер (`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`)
+запоминает свой уровень effort отдельно. Логика гибридная:
-- **`low` / `medium` / `high` / `xhigh`** живут нативно в `settings.json` лаунчера.
+- `low` / `medium` / `high` / `xhigh` живут нативно в `settings.json` лаунчера.
`/effort` внутри сессии работает как обычно, уровень сохраняется между сессиями.
-- **`max`** — единственный, который Claude Code **не сохраняет** в `settings.json`
+- `max` - единственный уровень, который Claude Code не сохраняет в `settings.json`
(он session-only). Поэтому его восстанавливаем через `CLAUDE_CODE_EFFORT_LEVEL`.
- Текущий уровень (включая `max`) статусбар пишет в `~/.cache/ai-setup/effort_`.
+ Текущий уровень, включая `max`, лаунчер записывает в `~/.cache/ai-setup/effort_`.
-**Важное следствие (только для `max`):** когда восстановлена `max`-сессия, выставлена
-`CLAUDE_CODE_EFFORT_LEVEL=max`, и `/effort` внутри неё **не сменит** уровень
-(env-переменная — жёсткий override Claude Code). На остальных уровнях `/effort` свободен.
+Важное следствие только для `max`: когда восстановлена `max`-сессия, выставлена
+`CLAUDE_CODE_EFFORT_LEVEL=max`, и `/effort` внутри нее не сменит уровень, потому что
+env-переменная работает как жесткий override Claude Code.
-**Как выйти из `max` (или форсить любой уровень):** перезапусти лаунчер с `AI_EFFORT`:
+Как выйти из `max` или форсить любой уровень:
```bash
AI_EFFORT=max ai-deepseek # включить и запомнить max
-AI_EFFORT=high ai-deepseek # вернуться на high (выйти из max)
-ai-deepseek # без флага - восстанавливает последний уровень
+AI_EFFORT=high ai-deepseek # вернуться на high
+ai-deepseek # без флага - восстановить последний уровень
```
-Дефолты при пустом кэше: `xhigh` для `ai-claude`, `high` для остальных.
+Дефолты при пустом кеше: `xhigh` для `ai-claude`, `high` для остальных Claude Code лаунчеров.
## Рекомендации
-- **Для повседневной работы:** `high` или `xhigh` — работает одинаково хорошо у всех провайдеров
-- **`max` effort:** имеет реальный эффект только у **Anthropic** и **DeepSeek**. Для GPT маппится в `xhigh`, для Gemini и Kimi — в их максимальный уровень
-- **`low`/`medium`:** у DeepSeek и Kimi фактически не снижают reasoning — DeepSeek поднимет до `high`, Kimi просто включит thinking
-- **Смена уровня:** на `low..xhigh` обычным `/effort`; из `max` — через `AI_EFFORT= ai-` (в max-сессии `/effort` залочен env-переменной, см. «Persistence effort»)
+- Для повседневной работы: `high` или `xhigh`.
+- `max` effort имеет реальный эффект у Anthropic и DeepSeek; у Kimi это все тот же thinking on.
+- `low`/`medium` у DeepSeek и Kimi фактически не снижают reasoning.
+- Смена уровня на `low`..`xhigh`: обычным `/effort`; выход из `max`: через `AI_EFFORT= ai-`.
diff --git a/QUICK_START.md b/QUICK_START.md
index 6d96851..d040def 100644
--- a/QUICK_START.md
+++ b/QUICK_START.md
@@ -6,9 +6,9 @@
bash setup.sh
```
-Спросит про VLESS-прокси (можно пропустить — `n`), затем установит лаунчеры
+Спросит про VLESS-прокси (по умолчанию `Y`; если не нужен, ответь `n`), затем установит лаунчеры
`ai-claude`, `ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`, `ai-gemini`
-в `~/.local/bin/` и запишет API-ключи.
+в `~/bin`, если он уже есть в `PATH`, иначе в `~/.local/bin/`, и запишет API-ключи.
После установки, если команды не видны:
```bash
@@ -20,25 +20,24 @@ exec bash
Нужно один раз на каждой машине. .ru трафик идёт напрямую,
остальное — через Amnezia. Если Amnezia падает, не-.ru блокируется.
-```bash
-# Запустить Amnezia, затем узнать gateway и интерфейс:
-ip route show default
-# Пример: default via 192.168.1.1 dev wlp1s0
+Запускай через `bash setup.sh` и выбери пункт `2) Сеть: ru-bypass + kill switch`.
+Меню само предложит `GATEWAY` и `DEV` из `ip route show default`, даст выбрать профиль
+(`home`, `office`, имя хоста и т.д.) и сохранит настройки в
+`~/.config/ai-setup/network_.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/домены, которые должны ходить напрямую
-# Если параметры отличаются:
-sudo GATEWAY=10.0.0.1 DEV=enp3s0 bash scripts/ru-bypass.sh
-```
-
-После первого запуска systemd-сервисы установлены — при перезагрузке всё поднимается само.
+После первого запуска systemd-сервисы и timer установлены - при перезагрузке всё поднимается само,
+а RIPE-список обновляется ежедневно.
## Проверка сети
```bash
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 (напрямую)
bash tests/test_network.sh
```
diff --git a/README.md b/README.md
index 07533f6..5e14d48 100644
--- a/README.md
+++ b/README.md
@@ -9,14 +9,17 @@
```
setup.sh # мастер-скрипт с меню
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 для остального
├── ks-off.sh # временно отключить kill switch
└── ks-on.sh # восстановить kill switch
home-configs/
├── GLOBAL_RULES.md # глобальные правила для всех агентов
├── claude/
-│ └── skills/ # кастомные скиллы для Claude Code (и Gemini)
+│ ├── hooks/ # хуки аккаунтов Claude Code
+│ ├── skills/ # кастомные скиллы для Claude Code (и Gemini)
+│ └── statusline-command.sh # статусная строка Claude Code
├── network/
│ └── README.md # подробная документация по сетевой настройке
├── vless/
@@ -27,6 +30,7 @@ tests/
├── test_fixes.sh # юнит-тесты структуры ai-setup.sh
└── test_network.sh # тесты маршрутизации
test_isolated.sh # проверка автоустановки ai-gpt и ai-kimi
+test_sigint.sh # ручной тест поведения SIGINT
```
## Установка
@@ -49,6 +53,7 @@ bash setup.sh
4) Включить kill switch
5) Статус
6) Проверить сеть
+ 7) Обновить # git pull + перегенерация AI-лаунчеров
```
После установки, если shell ещё не видит новые команды:
@@ -85,7 +90,8 @@ before.rules: RFC1918 — 10/8, 172.16/12, 192.168/16 тоже напр
### Первый запуск
Через меню (`bash setup.sh` → пункт 2) - он автоматически определит GATEWAY и DEV
-из `ip route show default` и сохранит их в `~/.config/ai-setup/network_$(hostname).conf`.
+из `ip route show default`, предложит профиль и сохранит настройки в
+`~/.config/ai-setup/network_.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`
- `ru-ipset-restore.service` - восстанавливает ipset из файла **до старта UFW** при загрузке
- `ru-bypass.service` - обновляет RIPE-список и маршруты после network-online
+- `ru-bypass.timer` - ежедневно запускает обновление RIPE-списка и маршрутов
- 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`)
- Обновляет ipset `ru-direct` (~11000 записей)
+- Добавляет в ipset встроенные и пользовательские kill switch исключения
- Сохраняет ipset в `/etc/ipset.conf` для восстановления после ребута
- Добавляет маршруты через GATEWAY для всех .ru блоков и RFC1918
+- Обновляет UFW `before.rules`, добавляет прямые iptables-правила и отключает IPv6 при активном kill switch
### ks-off / ks-on
@@ -130,8 +141,8 @@ sudo bash scripts/ks-on.sh
```bash
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 10.10.0.1 # -> dev wlp1s0 (*.loc напрямую)
+ip route get 77.88.8.8 # -> dev (ya.ru напрямую)
+ip route get 10.10.0.1 # -> dev (*.loc напрямую)
bash tests/test_network.sh # полные тесты
```
@@ -139,16 +150,17 @@ bash tests/test_network.sh # полные тесты
`scripts/ai-setup.sh` устанавливает и настраивает все AI CLI.
-После запуска генерируются или обновляются в `~/.local/bin`:
+После запуска генерируются или обновляются в выбранном `BIN_DIR`: `~/bin`, если он уже есть
+в `PATH`, иначе `~/.local/bin`.
- `ai-claude` - Claude Code (Anthropic API)
- `ai-gpt` - нативный OpenAI Codex CLI
- `ai-deepseek` - Claude Code через DeepSeek API
- `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-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`.
@@ -166,7 +178,8 @@ bash tests/test_network.sh # полные тесты
- Устанавливает Xray, генерирует конфиг, создаёт systemd сервис
- Все лаунчеры оборачиваются в `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/openrouter_key` - OpenRouter API key (права 600)
- `~/.config/ai-setup/global_rules.md` - глобальные правила агентов
-- `~/.config/ai-setup/network_$(hostname).conf` - сохранённые GATEWAY/DEV для текущей машины
+- `~/.config/ai-setup/network_.conf` - сохранённые сетевые профили (`GATEWAY`, `DEV`, `LOCAL_DNS`, `AMNEZIA_SERVER`, `KILL_SWITCH_EXCEPTIONS`)
## Права запуска агентов
@@ -193,10 +206,12 @@ Surgical Changes, Goal-Driven Execution) плюс пользовательски
## Effort Mapping
-`EFFORT_MAPPING.md` - таблица маппинга effort-уровней (`low`/`medium`/`high`/`xhigh`/`max`)
-между провайдерами (Anthropic, GPT-5.5, DeepSeek V4, Kimi K2.6, Gemini 3.x).
+`EFFORT_MAPPING.md` - таблица effort-уровней (`low`/`medium`/`high`/`xhigh`/`max`)
+для 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 test_isolated.sh # автоустановка ai-gpt и ai-kimi через mock curl
bash tests/test_network.sh # маршрутизация (нужен активный ru-bypass)
+# test_sigint.sh # ручной диагностический тест SIGINT
```
diff --git a/home-configs/network/README.md b/home-configs/network/README.md
index 3e33dde..29c0553 100644
--- a/home-configs/network/README.md
+++ b/home-configs/network/README.md
@@ -16,7 +16,9 @@
| `ks-off.sh` | Временно отключить UFW kill switch (доступ без VPN) |
| `ks-on.sh` | Восстановить UFW kill switch |
-Все скрипты запускаются явно от root. Никакой автоустановки нет.
+Сетевые скрипты запускаются от root. Обычно их дергает `setup.sh` через `sudo` и сохраняет
+профиль в `~/.config/ai-setup/network_.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`
`ru-bypass.sh` добавляет тысячи **более специфичных** маршрутов для .ru IP-блоков через
-локальный роутер (например `95.173.0.0/16 via 192.168.1.1 dev wlp1s0`). Ядро Linux
+локальный роутер (например `95.173.0.0/16 via dev `). Ядро Linux
выбирает самый специфичный маршрут - .ru уходит напрямую, всё остальное - в amn0.
### UFW kill switch
@@ -37,13 +39,13 @@ Amnezia поднимает интерфейс `amn0` и захватывает
```
default deny outgoing — запрещено всё по умолчанию
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,
- 192.168/16 — RFC1918 (*.loc) разрешён прямой выход на wlp1s0
+ 192.168/16 — RFC1918 (*.loc) разрешён прямой выход на DEV
```
Если 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`
4. Добавляет маршруты через локальный роутер для всех .ru блоков
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`.
- `ru-bypass.service` - запускается после network-online, качает свежий RIPE-список и
добавляет маршруты.
+- `ru-bypass.timer` - ежедневно запускает `ru-bypass.service` для обновления RIPE-списка.
- NM dispatcher `/etc/NetworkManager/dispatcher.d/99-ru-bypass` - автоматически перезапускает
скрипт когда 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
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
-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.
-Amnezia там тоже поднимает `amn0`, так что остальное работает одинаково.
+Если в офисе другой gateway и другой сетевой интерфейс - создай отдельный профиль через
+пункт 2 в `setup.sh` или передай значения через env. Amnezia там тоже поднимает `amn0`,
+так что остальное работает одинаково.
Пример (офис с проводным интерфейсом):
```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. Трафик пойдёт напрямую через
провайдера (российский IP).
+**Примечание:** IPv6 остаётся отключённым после `ks-off.sh` (если он был выключен `ks-on.sh`
+или `ru-bypass.sh`). Он восстановится автоматически при следующем `ks-on.sh` или перезагрузке.
+
**Важно:** выйди из Claude Code перед этим - сессия будет идти с другого IP.
### ks-on.sh - восстановить kill switch
@@ -150,7 +180,7 @@ sudo bash scripts/ks-on.sh
```bash
# Эти команды без sudo:
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 (ozon.ru напрямую)
ip route get $(dig +short api.anthropic.com A | head -1) # -> dev amn0
# Полные тесты:
diff --git a/scripts/ai-setup.sh b/scripts/ai-setup.sh
index d009ec6..71fd2b7 100755
--- a/scripts/ai-setup.sh
+++ b/scripts/ai-setup.sh
@@ -1,6 +1,6 @@
#!/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
# ============================================================
@@ -1663,7 +1663,7 @@ echo " На базе Claude Code:"
echo -e " ${CYAN}ai-claude${NC} - Оригинальный Claude Code (Anthropic)"
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-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 " Нативные CLI:"
echo -e " ${CYAN}ai-gpt${NC} - OpenAI Codex (нативный CLI, автоустановка)"
diff --git a/scripts/ru-bypass.sh b/scripts/ru-bypass.sh
index fcbbbfa..a0b3222 100644
--- a/scripts/ru-bypass.sh
+++ b/scripts/ru-bypass.sh
@@ -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"
# Добавляем правила заново с актуальным 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 "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_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_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)."
diff --git a/setup.sh b/setup.sh
index d20088c..4f4d1e7 100755
--- a/setup.sh
+++ b/setup.sh
@@ -113,7 +113,7 @@ case "$choice" in
read -rp "DEV (интерфейс) [${auto_dev}]: " dev
read -rp "LOCAL_DNS (DNS для *.loc) [${saved_local_dns:-пусто}]: " local_dns
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}"
dev="${dev:-$auto_dev}"
[ "$local_dns" = "пусто" ] && local_dns=""