s-xray-gate 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,14 @@
1
+ __pycache__/
2
+ *.pyc
3
+ *.egg-info/
4
+ build/
5
+ dist/
6
+ .venv/
7
+ .pytest_cache/
8
+ .ruff_cache/
9
+ *.log
10
+ *.pid
11
+ *.tmp
12
+ # рантайм-указатели/состояние шлюза (НЕ публиковать — могут нести приватные подписки/ноды)
13
+ .sh-xray.json
14
+ .sh-gateway.json
@@ -0,0 +1,35 @@
1
+ # Changelog
2
+
3
+ Все заметные изменения s-xray-gate. Формат — по мотивам Keep a Changelog; версии — SemVer.
4
+
5
+ ## [0.2.0] — 2026-07-08
6
+
7
+ ### Added
8
+ - **TROJAN-поддержка в egress-пуле.** Ядро `_core.py`:
9
+ - `_parse_trojan(url)` — парсер `trojan://password@host:port?params#name` (userinfo =
10
+ url-decoded пароль, `proto="trojan"`, `uuid=None`, security по умолчанию `tls`,
11
+ type `tcp`); устойчив к URL без `?params` и без `#frag`. Полный transport-парсер
12
+ (reality/tls/ws/grpc/xhttp/alpn) общий с vless.
13
+ - `_make_config` собирает trojan-outbound (`protocol:"trojan"`, `settings.servers[].password`)
14
+ поверх той же `streamSettings`; тег outbound остаётся `vless-out` (routing по порядку,
15
+ не по имени тега — обратная совместимость).
16
+ - `refresh_profiles` парсит и `trojan://`-строки подписки.
17
+ - **Разметка подписки (source).** Каждому профилю проставляется `p["subscription"]` —
18
+ короткая метка подписки-источника через `_sub_label(url)` (`panel.pragmati.ru`→`pragmati`,
19
+ `oversub.cloud`→`oversecure`, generic → SLD). Dedup-ключ теперь `(host, port, uuid|password)`
20
+ — корректен для trojan (uuid=None).
21
+ - **Пул: фильтр по подписке + PIN на конкретный хост.** `pool.resolve_hosts`:
22
+ - `selector.subscription` → только профили этой подписки (нет таких → пусто, изоляция
23
+ подписок, last-known-good у вызывающего).
24
+ - `selector.host` → PIN на КОНКРЕТНУЮ ноду по имени или `host:port` (без ранга); высший
25
+ приоритет над subscription/geo/rank.
26
+ - `pool_add(..., host=...)` и CLI `xray-gate pool add --host … --subscription …`.
27
+ - `make_pool_config` (BAL) и `_proxy_outbound` собирают набор и из trojan-хостов
28
+ (`_vless_outbound` оставлен тонким алиасом для обратной совместимости).
29
+
30
+ ### Changed
31
+ - Версия ядра/CLI `0.1.0` → `0.2.0`.
32
+
33
+ ### Compatibility
34
+ - VLESS-путь, легаси-egress `default` (алиас `state.json`), существующий CLI и pool.json —
35
+ без изменений формата. Профили без ключа `subscription` читаются штатно (get с дефолтом).
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Dmitry
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,109 @@
1
+ Metadata-Version: 2.4
2
+ Name: s-xray-gate
3
+ Version: 0.2.0
4
+ Summary: Единый VLESS-шлюз (xray-core): один не-RU egress со smart-routing для проброса прокси в любой проект/сервис; обход гео-блокировок и РКН-DPI. Импорт подписки, авто-обновление, пинг/выбор лучших нод, self-heal, autostart; фасад Gateway + адаптеры httpx/requests/playwright/telethon.
5
+ Author: Dmitry
6
+ License: MIT
7
+ License-File: LICENSE
8
+ Keywords: egress,geo-bypass,proxy,reality,socks5,subscription,vless,xray
9
+ Classifier: Environment :: Console
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: Topic :: Internet :: Proxy Servers
17
+ Classifier: Topic :: System :: Networking
18
+ Requires-Python: >=3.11
19
+ Requires-Dist: s-clikit>=0.1.0
20
+ Requires-Dist: s-librarykit>=0.1.8
21
+ Provides-Extra: adapters
22
+ Requires-Dist: httpx[socks]>=0.27; extra == 'adapters'
23
+ Requires-Dist: requests[socks]>=2.31; extra == 'adapters'
24
+ Provides-Extra: dev
25
+ Requires-Dist: pytest>=8; extra == 'dev'
26
+ Provides-Extra: socks
27
+ Requires-Dist: httpx[socks]>=0.27; extra == 'socks'
28
+ Requires-Dist: pysocks>=1.7; extra == 'socks'
29
+ Description-Content-Type: text/markdown
30
+
31
+ # sh-xray — единый VPN-шлюз (skill-hub xray) для всех AI-навыков
32
+
33
+ Один общий SOCKS5-прокси (xray-core) с НЕ-российской нодой и smart-routing
34
+ (РУ/CN → напрямую, остальное → за рубеж). Пишет общий указатель
35
+ **`~/.sh-xray.json`**, который читают ВСЕ навыки (паттерн `open_client._apply_proxy`).
36
+ Системный трафик НЕ трогает (только opt-in инструменты через `ALL_PROXY`) — РУ-сервисы не ломаются.
37
+
38
+ ## Команды
39
+ CLI `xray-gate` — на [clikit](https://gitlab.com/S-kits/clikit) (даёт `--json`/`--help`/`--version`):
40
+ ```
41
+ xray-gate install # xray binary + geoip/geosite (качает с GitHub-релиза XTLS/Xray-core)
42
+ xray-gate test # выбрать рабочую НЕ-RU ноду (проверка реального выхода через ipinfo.io)
43
+ xray-gate start [--port N] # поднять + записать ~/.sh-xray.json (порт по умолч. 10810)
44
+ xray-gate status # alive + live exit country
45
+ xray-gate stop
46
+ xray-gate ensure # self-heal: поднять, если процесс умер (после reboot/краша)
47
+ xray-gate autostart # Windows Task Scheduler: ensure каждые 10 мин (переживает reboot)
48
+ xray-gate autostart --remove
49
+ xray-gate add-sub <url> # своя VLESS-подписка (vless/base64; авто-обновление по интервалу подписки)
50
+ ```
51
+ Без установки китов (свежая машина, handoff-бандл) — тот же набор через **dep-free ядро**:
52
+ `python xray_gate/_core.py <команда>` (чистый stdlib, никаких зависимостей). Именно его
53
+ дёргает watchdog (`ensure` каждые 10 мин), чтобы self-heal не зависел от китов.
54
+
55
+ ## Построен на Китах (S-kits)
56
+ sh-xray — НЕ кит, а супернавык/сервис, который *строится* на [китах](https://gitlab.com/S-kits):
57
+ **clikit** даёт человеческий CLI (`xray_gate/cli.py`), **librarykit.config_util** — атомарную
58
+ запись общих указателей (`~/.sh-xray.json`, `~/.sh-gateway.json`). Ядро-движок
59
+ (`xray_gate/_core.py`, бывший top-level `gateway.py`) намеренно остаётся на чистом stdlib —
60
+ у обоих kit-обращений есть stdlib-фолбэк, поэтому self-heal работает даже без китов.
61
+ gateway-роутер потребляет egress sh-xray через свой `ProxyProvider` (читает `~/.sh-xray.json`).
62
+
63
+ ## Переживает перезагрузку
64
+ `autostart` ставит задачу планировщика (`ensure` каждые 10 мин, `StartWhenAvailable`). После reboot
65
+ старый pid мёртв → `ensure` поднимает xray заново (при старте/в течение ~10 мин). `~/.sh-xray.json`
66
+ обновляется новым pid, все навыки снова ходят через прокси. Без `autostart` — поднимать вручную `start`.
67
+
68
+ ## Общий указатель `~/.xray-gate/state.json`
69
+ ```json
70
+ {"http_proxy": "http://127.0.0.1:10811", "all_proxy": "socks5h://127.0.0.1:10810", "node": "...", "backend": "xray-gate"}
71
+ ```
72
+ Потребители читают его и ходят через ОДИН egress (важно: один IP для логина И API, иначе Google убивает сессию).
73
+ Всё хозяйство рантайма — под `~/.xray-gate/` (state.json/routing.json/byedpi/zapret/бинарь).
74
+
75
+ ## Потребление в проектах (egress «из коробки»)
76
+ xray-gate — **источник пути** (его знает он, не нейтральный librarykit-корень). Потребитель ставит
77
+ его как egress-расширение и берёт прокси у его адаптеров. Установка (на PyPI НЕТ — из git):
78
+ ```bash
79
+ uv add --optional egress "s-xray-gate @ git+https://gitlab.com/s-skills/s-xray-gate.git" # запишет в pyproject+lock
80
+ uv sync --extra egress # или: pip install git+https://gitlab.com/s-skills/s-xray-gate.git
81
+ ```
82
+ 4 способа взять прокси (нет указателя/шлюз не поднят → `None` → проект идёт напрямую):
83
+ ```python
84
+ import xray_gate.adapters as eg
85
+ httpx.Client(proxy=eg.httpx_proxy()) # socks5h://127.0.0.1:10810
86
+ sess = eg.requests_session() # requests.Session с прокси
87
+ browser.launch(proxy=eg.playwright_proxy()) # {"server":"socks5://..."}
88
+ TelegramClient(s, api_id, api_hash, proxy=eg.telethon_proxy())
89
+
90
+ # через нейтральный librarykit-транспорт (проект на китах):
91
+ from librarykit import HttpClient, HttpxTransport
92
+ HttpClient(HttpxTransport(proxy=eg.httpx_proxy()), auth, errmap)
93
+
94
+ # env-wide (subprocess/curl/любой ALL_PROXY-клиент):
95
+ from xray_gate import apply_to_env; apply_to_env("notebooklm") # по карте ~/.xray-gate/routing.json
96
+
97
+ # zero-dep (без установки пакета — просто JSON):
98
+ import json, pathlib
99
+ proxy = json.loads((pathlib.Path.home()/".xray-gate"/"state.json").read_text())["all_proxy"]
100
+ ```
101
+ Реальный пример-потребитель — bublictr (`adapters/_common/browser.py`): `BUBLICTR_BROWSER_PROXY=shxray`
102
+ → `xray_gate.adapters.playwright_proxy()`.
103
+
104
+ ## Портативность / другие устройства
105
+ `install` качает xray-core сам. `add-sub <url>` + `test` подберёт не-RU ноду. Так работает на любой машине/агенте.
106
+
107
+ ## Замечание по нодам
108
+ Качество зависит от подписки. Нестабильная нода → таймауты (xray ретраит, но лучше иметь несколько не-RU нод).
109
+ `status` показывает live exit; `test` перевыбирает рабочую.
@@ -0,0 +1,79 @@
1
+ # sh-xray — единый VPN-шлюз (skill-hub xray) для всех AI-навыков
2
+
3
+ Один общий SOCKS5-прокси (xray-core) с НЕ-российской нодой и smart-routing
4
+ (РУ/CN → напрямую, остальное → за рубеж). Пишет общий указатель
5
+ **`~/.sh-xray.json`**, который читают ВСЕ навыки (паттерн `open_client._apply_proxy`).
6
+ Системный трафик НЕ трогает (только opt-in инструменты через `ALL_PROXY`) — РУ-сервисы не ломаются.
7
+
8
+ ## Команды
9
+ CLI `xray-gate` — на [clikit](https://gitlab.com/S-kits/clikit) (даёт `--json`/`--help`/`--version`):
10
+ ```
11
+ xray-gate install # xray binary + geoip/geosite (качает с GitHub-релиза XTLS/Xray-core)
12
+ xray-gate test # выбрать рабочую НЕ-RU ноду (проверка реального выхода через ipinfo.io)
13
+ xray-gate start [--port N] # поднять + записать ~/.sh-xray.json (порт по умолч. 10810)
14
+ xray-gate status # alive + live exit country
15
+ xray-gate stop
16
+ xray-gate ensure # self-heal: поднять, если процесс умер (после reboot/краша)
17
+ xray-gate autostart # Windows Task Scheduler: ensure каждые 10 мин (переживает reboot)
18
+ xray-gate autostart --remove
19
+ xray-gate add-sub <url> # своя VLESS-подписка (vless/base64; авто-обновление по интервалу подписки)
20
+ ```
21
+ Без установки китов (свежая машина, handoff-бандл) — тот же набор через **dep-free ядро**:
22
+ `python xray_gate/_core.py <команда>` (чистый stdlib, никаких зависимостей). Именно его
23
+ дёргает watchdog (`ensure` каждые 10 мин), чтобы self-heal не зависел от китов.
24
+
25
+ ## Построен на Китах (S-kits)
26
+ sh-xray — НЕ кит, а супернавык/сервис, который *строится* на [китах](https://gitlab.com/S-kits):
27
+ **clikit** даёт человеческий CLI (`xray_gate/cli.py`), **librarykit.config_util** — атомарную
28
+ запись общих указателей (`~/.sh-xray.json`, `~/.sh-gateway.json`). Ядро-движок
29
+ (`xray_gate/_core.py`, бывший top-level `gateway.py`) намеренно остаётся на чистом stdlib —
30
+ у обоих kit-обращений есть stdlib-фолбэк, поэтому self-heal работает даже без китов.
31
+ gateway-роутер потребляет egress sh-xray через свой `ProxyProvider` (читает `~/.sh-xray.json`).
32
+
33
+ ## Переживает перезагрузку
34
+ `autostart` ставит задачу планировщика (`ensure` каждые 10 мин, `StartWhenAvailable`). После reboot
35
+ старый pid мёртв → `ensure` поднимает xray заново (при старте/в течение ~10 мин). `~/.sh-xray.json`
36
+ обновляется новым pid, все навыки снова ходят через прокси. Без `autostart` — поднимать вручную `start`.
37
+
38
+ ## Общий указатель `~/.xray-gate/state.json`
39
+ ```json
40
+ {"http_proxy": "http://127.0.0.1:10811", "all_proxy": "socks5h://127.0.0.1:10810", "node": "...", "backend": "xray-gate"}
41
+ ```
42
+ Потребители читают его и ходят через ОДИН egress (важно: один IP для логина И API, иначе Google убивает сессию).
43
+ Всё хозяйство рантайма — под `~/.xray-gate/` (state.json/routing.json/byedpi/zapret/бинарь).
44
+
45
+ ## Потребление в проектах (egress «из коробки»)
46
+ xray-gate — **источник пути** (его знает он, не нейтральный librarykit-корень). Потребитель ставит
47
+ его как egress-расширение и берёт прокси у его адаптеров. Установка (на PyPI НЕТ — из git):
48
+ ```bash
49
+ uv add --optional egress "s-xray-gate @ git+https://gitlab.com/s-skills/s-xray-gate.git" # запишет в pyproject+lock
50
+ uv sync --extra egress # или: pip install git+https://gitlab.com/s-skills/s-xray-gate.git
51
+ ```
52
+ 4 способа взять прокси (нет указателя/шлюз не поднят → `None` → проект идёт напрямую):
53
+ ```python
54
+ import xray_gate.adapters as eg
55
+ httpx.Client(proxy=eg.httpx_proxy()) # socks5h://127.0.0.1:10810
56
+ sess = eg.requests_session() # requests.Session с прокси
57
+ browser.launch(proxy=eg.playwright_proxy()) # {"server":"socks5://..."}
58
+ TelegramClient(s, api_id, api_hash, proxy=eg.telethon_proxy())
59
+
60
+ # через нейтральный librarykit-транспорт (проект на китах):
61
+ from librarykit import HttpClient, HttpxTransport
62
+ HttpClient(HttpxTransport(proxy=eg.httpx_proxy()), auth, errmap)
63
+
64
+ # env-wide (subprocess/curl/любой ALL_PROXY-клиент):
65
+ from xray_gate import apply_to_env; apply_to_env("notebooklm") # по карте ~/.xray-gate/routing.json
66
+
67
+ # zero-dep (без установки пакета — просто JSON):
68
+ import json, pathlib
69
+ proxy = json.loads((pathlib.Path.home()/".xray-gate"/"state.json").read_text())["all_proxy"]
70
+ ```
71
+ Реальный пример-потребитель — bublictr (`adapters/_common/browser.py`): `BUBLICTR_BROWSER_PROXY=shxray`
72
+ → `xray_gate.adapters.playwright_proxy()`.
73
+
74
+ ## Портативность / другие устройства
75
+ `install` качает xray-core сам. `add-sub <url>` + `test` подберёт не-RU ноду. Так работает на любой машине/агенте.
76
+
77
+ ## Замечание по нодам
78
+ Качество зависит от подписки. Нестабильная нода → таймауты (xray ретраит, но лучше иметь несколько не-RU нод).
79
+ `status` показывает live exit; `test` перевыбирает рабочую.
@@ -0,0 +1,98 @@
1
+ ---
2
+ name: xray-gate
3
+ version: 0.1.0
4
+ description: "Единый VLESS-шлюз (xray-core) для всех AI-навыков/проектов: один не-RU egress со smart-routing (РУ/CN→direct, остальное→за рубеж). Обходит ГЕО-блокировки (NotebookLM, Gemini, OpenAI/ChatGPT) и РКН-DPI (Telegram, Reality/VLESS). CLI `xray-gate` (install/test/start/status/ensure/autostart) + Python-фасад Gateway.ensure() + адаптеры httpx/requests/playwright/telethon. Пишет общий указатель ~/.sh-xray.json — навыки ходят через ОДИН IP (Google не убивает сессию на прыжках). Не трогает системный трафик (opt-in через ALL_PROXY). EN triggers: proxy for skill, bypass geo-block, geo blocked NotebookLM/Gemini/OpenAI, VLESS reality proxy, xray gateway, single egress proxy, socks5 for httpx/playwright/telethon, RKN DPI bypass, ensure proxy up, autostart proxy, rotate node, proxy health check, sh-xray, one shared proxy. RU triggers: прокси для навыка, обход блокировок, гео-блокировка, обход гео, NotebookLM/Gemini/OpenAI заблокированы из РФ, vless reality прокси, xray шлюз, единый прокси для всех навыков, socks5 для httpx/playwright/telethon, обход РКН DPI, подними прокси, автозапуск прокси, ротация ноды, проверить прокси, sh-xray, один общий egress."
5
+ kind: tooling
6
+ ---
7
+
8
+ # xray-gate
9
+
10
+ Respond in the user's language.
11
+
12
+ > Один общий не-RU SOCKS5-egress (xray-core, VLESS/Reality) для ВСЕХ навыков и проектов. Гео-блокировки и РКН-DPI обходятся в одном месте; навыки читают `~/.sh-xray.json` и ходят через единый IP.
13
+
14
+ ## When activated (router)
15
+
16
+ Определи задачу и иди в нужную секцию:
17
+
18
+ - **«Навык/код не достаёт гео-сервис» (NotebookLM, Gemini, OpenAI/ChatGPT, заблокировано из РФ)** → раздел **1. Быстрый старт** (подними шлюз) + **2. Из кода** (адаптер под клиента).
19
+ - **«Подключить прокси к httpx / requests / playwright / telethon»** → раздел **2. Из кода (адаптеры)**.
20
+ - **«Проверить/поднять/перезапустить прокси, ротация ноды, health»** → раздел **3. Жизненный цикл и self-heal**.
21
+ - **«Чтобы прокси сам поднимался после reboot»** → раздел **4. Автозапуск (Win/Linux/macOS)**.
22
+ - **«Своя подписка / другое устройство / выбор ноды»** → раздел **5. Подписки, ноды, портативность**.
23
+
24
+ Особенно: **если упоминается гео-блокировка, обход блокировок, VLESS/Reality, «прокси для навыка», sh-xray → это здесь.**
25
+
26
+ ## Instructions
27
+
28
+ ### 1. Быстрый старт
29
+
30
+ ```bash
31
+ # установка пакета (CLI xray-gate + Python-фасад)
32
+ pip install s-xray-gate # PyPI; либо из репо: pip install -e . ; extras: "s-xray-gate[socks]"
33
+
34
+ xray-gate add-sub '<vless-sub>' # своя VLESS-подписка (vless/base64)
35
+ xray-gate install # xray-core + geoip/geosite (качает с GitHub-релиза XTLS/Xray-core)
36
+ xray-gate test # подобрать рабочую НЕ-RU ноду (реальный выход через ipinfo.io)
37
+ xray-gate start # поднять + записать ~/.sh-xray.json (socks 10810 + http 10811)
38
+ xray-gate status # alive + живая страна выхода
39
+ ```
40
+
41
+ После `start` любой навык, читающий `~/.sh-xray.json`, автоматически ходит через не-RU egress. РУ/CN-домены и приватные IP идут напрямую (smart-routing), системный трафик не затрагивается.
42
+
43
+ ### 2. Из кода (адаптеры)
44
+
45
+ Один egress — разные форматы под библиотеки. Импорт `from xray_gate import Gateway, adapters`.
46
+
47
+ ```python
48
+ from xray_gate import Gateway, adapters
49
+
50
+ gw = Gateway.ensure() # idempotent: жив+рабочий → как есть; иначе поднять
51
+ # gw.proxies() -> {'http','https','all'} gw.httpx_proxy() -> 'socks5h://127.0.0.1:10810'
52
+
53
+ import httpx
54
+ httpx.Client(proxy=gw.httpx_proxy()) # httpx (нужен extra [socks])
55
+
56
+ sess = adapters.requests_session() # requests.Session с примонтированным прокси
57
+ pw = adapters.playwright_proxy() # {'server': 'socks5://127.0.0.1:10810'} → browser.launch(proxy=pw)
58
+ tg = adapters.telethon_proxy() # ('socks5','127.0.0.1',10810) → TelegramClient(proxy=tg)
59
+ ```
60
+
61
+ Если шлюз не поднят (`~/.sh-xray.json` нет), адаптеры возвращают `None` — код ходит напрямую (то же поведение, что `xray_gate.proxy_for`). Для гарантии egress сначала `Gateway.ensure()`.
62
+
63
+ Per-service маршрут (когда часть сервисов direct, часть через xray) — `xray_gate.apply_to_env("notebooklm")` по карте `~/.sh-gateway.json` (см. onboard).
64
+
65
+ ### 3. Жизненный цикл и self-heal
66
+
67
+ ```python
68
+ gw = Gateway.ensure() # подними при необходимости (install+start) или ротация при флапе
69
+ gw.health() # {'alive': True, 'country': 'FI', 'ip': '...', 'latency_ms': 312}
70
+ gw.rotate() # → следующая рабочая нода из ранга
71
+ gw.stop()
72
+ ```
73
+
74
+ `Gateway.ensure()` идемпотентен: если процесс жив И реальный выход рабочий — ничего не делает. Если pid мёртв — поднимает; если живой, но выход глушится/флапает — ротация ноды (двойная проверка против транзиента). То же из CLI: `xray-gate ensure`.
75
+
76
+ ### 4. Автозапуск (переживает reboot)
77
+
78
+ ```bash
79
+ xray-gate autostart # Win → Task Scheduler; Linux → systemd --user timer; macOS → launchd
80
+ xray-gate autostart --remove
81
+ ```
82
+
83
+ Все три варианта **без прав администратора/sudo** (`ensure` каждые 10 мин + на boot). На Linux при headless без активной user-сессии: `loginctl enable-linger $USER`, чтобы таймер пережил logout. Без autostart — поднимать вручную через `start`/`ensure`.
84
+
85
+ ### 5. Подписки, ноды, портативность
86
+
87
+ ```bash
88
+ xray-gate add-sub '<vless-subscription-URL>' # своя подписка (vless/base64; авто-обновление по интервалу)
89
+ xray-gate test # ранжирует ноды по latency, выбирает лучшую
90
+ ```
91
+
92
+ Парсер VLESS понимает Reality/TCP и транспорты **ws / grpc / xhttp** (+ tls alpn) — подойдут разные провайдеры. `install` качает xray-core сам → работает на любой машине/агенте.
93
+
94
+ ## Notes / risks
95
+
96
+ - Приватные токены подписки в репозитории навыка НЕ хранятся — задавай свою через `add-sub` или env.
97
+ - Качество egress зависит от подписки: нестабильная нода → таймауты; `status`/`rotate`/`test` лечат.
98
+ - Ядро использует системный `curl` для health-проб (есть на Win10+/Linux/macOS).
@@ -0,0 +1,41 @@
1
+ # Hub publishing manifest для навыка xray-gate.
2
+ # Читается skills-hub client/manifest_builder.py (description/triggers/tags/dependencies)
3
+ # + расширенные поля модели навыков (kind/has_cli/[[cli]]/runtime_dependencies, E6).
4
+
5
+ kind = "tooling"
6
+ has_cli = true
7
+ has_mcp = false
8
+
9
+ description = "Единый VLESS-шлюз (xray-core) для всех навыков: один не-RU egress со smart-routing, обход гео-блокировок (NotebookLM/Gemini/OpenAI) и РКН-DPI (Telegram/Reality). CLI xray-gate + Python-фасад Gateway + адаптеры httpx/requests/playwright/telethon."
10
+
11
+ # Триггеры для роутинга/поиска в хабе (RU+EN).
12
+ triggers = [
13
+ "прокси для навыка", "обход блокировок", "гео-блокировка", "обход гео",
14
+ "vless reality прокси", "xray шлюз", "единый прокси для всех навыков",
15
+ "обход ркн dpi", "подними прокси", "автозапуск прокси", "ротация ноды",
16
+ "socks5 для httpx", "socks5 для playwright", "socks5 для telethon", "sh-xray",
17
+ "proxy for skill", "bypass geo-block", "geo blocked notebooklm gemini openai",
18
+ "vless reality proxy", "xray gateway", "single egress proxy", "rkn dpi bypass",
19
+ "ensure proxy up", "autostart proxy", "rotate node", "proxy health check",
20
+ "socks5 for httpx playwright telethon", "one shared proxy",
21
+ ]
22
+
23
+ tags = ["proxy", "xray", "vless", "geo-bypass", "rkn", "networking", "tooling"]
24
+
25
+ # Установленный консольный скрипт (project.scripts.xray-gate → xray_gate.cli:main, на clikit).
26
+ [[cli]]
27
+ command = "xray-gate"
28
+ description = "Единый VLESS-шлюз: install/test/start/status/stop/ensure/rotate/autostart"
29
+ entrypoint = "xray_gate.cli:main"
30
+
31
+ # Рантайм-зависимости (опциональные extras пакета xray-gate).
32
+ [runtime_dependencies]
33
+ python = ">=3.11"
34
+ # socks-egress для httpx/requests (extra [socks] / [adapters]):
35
+ optional = ["httpx[socks]>=0.27", "PySocks>=1.7", "requests[socks]>=2.31"]
36
+ # системный бинарь, используемый ядром для health-проб:
37
+ system = ["curl"]
38
+ # xray-core НЕ декларируется как pip-зависимость — `xray-gate install` качает его сам.
39
+
40
+ # Зависимости от других навыков хаба (нет).
41
+ dependencies = []