# 01. Упростить CLI proxy-client и его Python-тесты Status: ready-for-agent Спецификация: `../spec.md` (читать целиком — там список того, что сохраняем). ## Файлы - `proxy-client/.local/bin/proxy-client` - `tests/test_proxy_client.py`, `tests/test_proxy_client_managed.py` (можно слить, переименовать или разнести по-новому — как станет проще) - `proxy-client/README.md` — все разделы, **кроме** «Установка» и «Ручное подключение без установщика» (их правит задача 02; при конфликте правки перечитай файл и повтори). - `proxy-client/.config/proxy-client/examples/` — если нужно. Не трогать: `proxy-client/install.sh`, `shell.bash`, shell-тесты. ## Что сделать Пункты 1–4 и 6 спецификации для CLI. Затем привести тесты к пяти местам проверок из спецификации: - Все проверки разбора ссылки (ALPN, legacy insecure, некорректные ссылки, соответствие полей REALITY/XHTTP, pcs/vcn, extra, шифрование) — табличные тесты `parse_vless`/`build_xray_config`, без запуска процессов. - CLI-тесты управляемого Xray: один полный жизненный цикл (start → status/env/ run → stop → файлы удалены, права 600/700, секретов нет в выводе), Ctrl+C, SIGKILL супервизора → `stop` добивает Xray, устаревшие файлы после смерти процессов, занятый порт, не-loopback адрес, права профиля (с новой подсказкой), сбой `xray run -test` не оставляет файлов, сбой определения внешнего IP — лишь предупреждение, второй `start` при работающем — отказ. Каждый сценарий — один запуск. Готовность ждать по строке вывода, а не опросом `status` в цикле, если это упрощает. - Удалить тесты-пустышки: проверку тестовой подделки сокета, проверку, что поддельный xray отвергает не-JSON, тесты порядка внутренних вызовов, всё, что подменяет функции модуля через `__globals__`. Подделку сокета (`checking_socket_setup`/`run_cli_with_socket_setup` через runpy) заменить настоящим слушающим сокетом на 127.0.0.1 (и закрытым портом для «недоступен»). - Тесты удалённых возможностей (ограничения размера, строгий `.dgst`, запрет заглавных букв в хеше, «каталог установки внутри HOME», boot_id, повторный PID, подмена xray_path, способы вызова супервизора и т. п.) уходят вместе с возможностями. - Новая подсказка о правах — тест первым (красный → зелёный). Упрощай и сам код: если функция после правок становится проходной — встрой. Сообщения об ошибках — на русском, коротко, с путём к файлу там, где речь о файле. Сохраняй совместимость с Python 3.8 (без `match`, `str.removeprefix`, `|` в типах и т. п.). ## Готово, когда - `python3 -m unittest discover -s tests` зелёный; прогон Python-тестов proxy-client заметно быстрее нынешних ~75 с. - Если есть `uv`: `uv run --python 3.8 python -m unittest discover -s tests` тоже зелёный. - Реальная проверка: сгенерированный конфиг для синтетических ссылок REALITY и XHTTP с шифрованием проходит `xray run -test` (xray 26.3.27 есть в `~/.local/bin/xray`). - README описывает текущее поведение, без упоминаний удалённого. - Не коммитить: коммиты делает оркестратор. Отчёт: что удалено из кода и тестов (строки до/после, время прогона до/после), какие решения принял сам, что осталось спорным.