refactor(proxy-client): переименован интерфейс прокси

- Зачем:
  - прежнее имя выпячивало Xray, хотя клиент поддерживает также внешний прокси, а два каталога конфигурации были неочевидны.
- Что:
  - пакет, CLI, конфигурация, состояние, тесты и документация переименованы в proxy-client.
  - машинный конфиг, профиль и два явных примера собраны в одном пользовательском каталоге.
  - свежая установка защищена от сворачивания каталога конфигурации внутрь репозитория.
- Проверка:
  - bash tests/test_proxy_client_full.sh.
  - bash tests/test_install.sh.
  - ручные start, status и xray run -test; незавершённая сетевая приёмка записана в handoff.
This commit is contained in:
ddadmin committed 2026-07-21 09:31:21 -04:00
1 parent e5323284a8
commit 6e431d875e
25 files changed
+310 -227

No files matched your search

@@ -1,8 +1,8 @@
# Headless Xray-прокси для агентских CLI
# `proxy-client` для агентских CLI
Дата: 2026-07-15
Статус: дизайн утверждён, реализация не начата
Статус: реализация готова к ручной приёмке; публичное имя уточнено 2026-07-21
## Проблема
@@ -93,9 +93,12 @@ Bash нужен только там, где необходимо изменит
### Границы компонентов
`xray-proxy` — один исполняемый файл на Python 3.8+ без внешних библиотек. Он
`proxy-client` — один исполняемый файл на Python 3.8+ без внешних библиотек. Он
отвечает за установку Xray, запуск и остановку процесса, диагностику,
преобразование VLESS и запуск произвольной дочерней команды через прокси.
Нейтральное публичное имя описывает клиентскую прокси-подсистему целиком:
внешний прокси и управляемый Xray. Название `xray` остаётся у конкретного
движка и значения `type = xray`, где оно действительно важно.
Переносимый `shell.bash` — единственный владелец `proxy_on`, `proxy_off`,
`pclaude`, `pcodex`, `myip` и внутренних proxy-помощников. При реализации они
@@ -105,18 +108,18 @@ Bash нужен только там, где необходимо изменит
машинный конфиг самостоятельно:
- `pclaude` и `pcodex` делегируют запуск форме
`xray-proxy run -- COMMAND ARG...`, где `--` отделяет параметры клиента;
- `proxy_on` получает от `xray-proxy env` проверенный набор proxy-переменных и
`proxy-client run -- COMMAND ARG...`, где `--` отделяет параметры клиента;
- `proxy_on` получает от `proxy-client env` проверенный набор proxy-переменных и
применяет его к текущей Bash-сессии;
- `proxy_off` очищает верхний и нижний регистр proxy-переменных.
Общий `bash/.bash_functions` и модуль Xray не зависят друг от друга. В составе
Общий `bash/.bash_functions` и модуль клиента не зависят друг от друга. В составе
dotfiles `.bash_custom` подключает их двумя независимыми строками. Без
остальных dotfiles пользователь добавляет только один `source` модуля Xray в
остальных dotfiles пользователь добавляет только один `source` модуля клиента в
`.bashrc`. Для неинтерактивных сценариев и других оболочек остаётся прямой
`xray-proxy run`.
`proxy-client run`.
`xray-proxy env` сначала выполняет ту же проверку доступности, что и `run`, а
`proxy-client env` сначала выполняет ту же проверку доступности, что и `run`, а
затем печатает восемь строк `KEY=value`: HTTP, HTTPS, ALL и NO_PROXY в верхнем
и нижнем регистре. `shell.bash` сначала целиком получает успешный ответ, затем
разбирает строки по первому `=`, принимает только известные ключи и лишь после
@@ -131,17 +134,17 @@ dotfiles `.bash_custom` подключает их двумя независим
набора переменных, fail-fast перед `pclaude`/`pcodex` и изоляции окружения
дочернего процесса. Автоматический запрос внешнего IP из `proxy_on` и
`proxy_off` удаляется: он замедляет переключение и смешивает изменение
окружения с диагностикой. Для проверки остаются `myip` и `xray-proxy status`.
окружения с диагностикой. Для проверки остаются `myip` и `proxy-client status`.
### Два независимых файла настройки
Машинный файл `~/.config/proxy/config` хранит несекретное описание активного
прокси: явный тип `xray` или `external`, отображаемое имя, адрес, порт и
добавку к `NO_PROXY`. Формат — INI из стандартной библиотеки Python. Если файла
нет, прокси-подсистема сохраняет прежний внешний адрес
Машинный файл `~/.config/proxy-client/config` хранит несекретное описание
активного прокси: явный тип `xray` или `external`, отображаемое имя, адрес, порт
и добавку к `NO_PROXY`. Формат — INI из стандартной библиотеки Python. Если
файла нет, прокси-подсистема сохраняет прежний внешний адрес
`hproxy.local:12334` ради обратной совместимости.
Секретный `~/.config/xray-proxy/default.url` содержит одну VLESS-ссылку.
Секретный `~/.config/proxy-client/default.url` содержит одну VLESS-ссылку.
Команда запуска принимает другой файл через `-f`. Профили можно хранить в
нескольких файлах, но активным у пользователя бывает только один.
CLI следует за симлинком, но проверяет права конечного файла: доступ группы или
@@ -156,8 +159,8 @@ CLI следует за симлинком, но проверяет права
### Явная семантика прокси
Тип `xray` означает, что `pclaude` и `pcodex` требуют запущенный процесс,
которым управляет `xray-proxy`. Если его нет, агент не запускается, а сообщение
предлагает выполнить `xray-proxy start`.
которым управляет `proxy-client`. Если его нет, агент не запускается, а сообщение
предлагает выполнить `proxy-client start`.
Тип `external` означает внешний процесс, например Hiddify. Проверяется только
доступность явно заданного адреса и порта. Ни один тип не переходит на другой
@@ -264,7 +267,7 @@ Hiddify Manager может добавлять `allowInsecure=true` и `insecure=
### Установка Xray
`xray-proxy install` — отдельная явная операция. Она устанавливает Xray в
`proxy-client install` — отдельная явная операция. Она устанавливает Xray в
`~/.local/bin`, скачивает официальный архив и файл контрольной суммы, затем
проверяет SHA-256. Поддерживается только зафиксированный релиз 26.3.27;
параметра версии нет. Официальные релизы публикуют необходимые файлы `.dgst`:
@@ -301,7 +304,7 @@ Start-lock берётся до проверки назначения и удер
из содержимого VLESS-ссылки.
`start` никогда не скачивает бинарник. Если `xray` отсутствует в `PATH`, команда
завершается с подсказкой выполнить `xray-proxy install`.
завершается с подсказкой выполнить `proxy-client install`.
### Жизненный цикл
@@ -317,7 +320,7 @@ CLI предоставляет `install`, `start`, `stop`, `status`, `env` и `r
достаточно истории tmux.
Супервизор на всё время работы удерживает неблокирующую эксклюзивную блокировку
`fcntl.flock` в служебном каталоге `~/.local/state/xray-proxy/`. Второй `start`
`fcntl.flock` в служебном каталоге `~/.local/state/proxy-client/`. Второй `start`
отказывает до запуска процессов и изменения state или сгенерированного
конфига. `state.json` нужен для восстановления после сбоя, но не служит
блокировкой.
@@ -364,12 +367,14 @@ UUID, ключи, short ID и другие уникальные секретны
### Доставка
Компоненты образуют отдельный stow-совместимый каталог `xray-proxy/`. Он
доставляет CLI, Bash-модуль и два шаблона: машинного INI и файла VLESS-ссылки.
Компоненты образуют отдельный stow-совместимый каталог `proxy-client/`. Он
доставляет CLI, Bash-модуль и три шаблона: машинного INI для внешнего прокси,
машинного INI для Xray и файла VLESS-ссылки.
Реальные пользовательские файлы не управляются stow и не входят в Git.
CLI раскладывается как `~/.local/bin/xray-proxy`, а модуль — как
`~/.config/xray-proxy/shell.bash`. Шаблоны лежат рядом с модулем в подкаталоге
`examples/` и не подменяют настоящие пользовательские файлы.
CLI раскладывается как `~/.local/bin/proxy-client`. Машинный конфиг, профиль,
модуль `shell.bash` и каталог `examples/` находятся вместе в
`~/.config/proxy-client/`. Шаблоны не подменяют настоящие пользовательские
файлы.
В корне этого каталога находится самостоятельный `README.md`. Он является
основной инструкцией клиента и исключается из раскладки stow. README остаётся
@@ -391,6 +396,12 @@ README репозитория только кратко описывает по
Python 3.11, что исключило бы штатный Python 3.10 в Ubuntu 22.04.
- Bash оставлен отдельным тонким модулем, потому что дочерний Python-процесс не
может изменить окружение родительской shell-сессии.
- Выбрано публичное имя `proxy-client`, потому что подсистема обслуживает и
внешний прокси, и управляемый Xray. `xray-proxy` отклонено как имя,
выпячивающее одну реализацию, а `proxyctl` — как менее понятное пользователю.
- Все пользовательские файлы собраны в `~/.config/proxy-client/`. Разделение
между общим машинным конфигом и Xray-профилем остаётся логическим, но не
требует помнить два каталога.
- Машинный прокси и VLESS-ссылка разделены: первый файл описывает локальную
политику shell, второй содержит секрет и меняется независимо.
- Выбран один порт, потому что SOCKS-вход Xray совместим с HTTP и не требует
@@ -459,7 +470,7 @@ README репозитория только кратко описывает по
## Влияние на документацию
Основная инструкция создаётся как `xray-proxy/README.md` одновременно с
Основная инструкция находится в `proxy-client/README.md` рядом с
реализацией. Она должна описывать:
- различие внешнего Hiddify и управляемого Xray;