refactor(proxy-client): упростить клиент до личного инструмента #1

Merged
ddmitry merged 9 commits from proxy-client-simplify into master 2026-09-28 17:58:39 +03:00
Owner

Summary

proxy-client — личный клиент для себя и друзей. Убрана защита от сценариев, которые на личной машине не случаются; оставлена защита от реальных. Принцип записан в начале спецификации.

 proxy-client start
-  проверка «тот ли процесс»: boot_id + время старта + /proc/PID/exe + argv супервизора
+  проверка «тот ли процесс»: /proc/PID/exe у Xray, cmdline у супервизора
-  состояние «не удалось подтвердить, удалите файлы вручную»
+  state.json: pid'ы, путь к xray, адрес и порт

 proxy-client install
-  три уровня ограничений размера, строгий разбор .dgst, блокировка, отказ при работающем Xray
   SHA-256 по .dgst, атомарная замена, --replace не пишет через симлинк
+  при работающем Xray — напоминание перезапустить start

 proxy-client/install.sh
-  Stow или ln -s, отказ при ~/.local-симлинке, разбор «повреждённого» блока .bashrc
+  три прямые ссылки; чужие файлы не трогает; блок в .bashrc, если нет маркера

Ошибки о файлах называют полный путь и готовую команду: файл профиля /home/…/default.url доступен другим пользователям; выполните: chmod 600 /home/…/default.url.

Файл Было Стало
proxy-client/.local/bin/proxy-client 1569 944
proxy-client/install.sh 216 93
Python-тесты 2479 988
Shell-тесты 592 322
Спецификация 578 220

Тесты живут только в пяти местах: команда proxy-client, разбор ссылки (parse_vless + build_xray_config), установка Xray с подставным скачивателем, функции Bash с поддельным PROXY_CLIENT_BIN, установщик пакета во временном HOME. Подмена внутренних функций и проверки порядка вызовов убраны.

Evidence

  • Before: tests/test_proxy_client_full.sh — около 2,5 мин, требует uv и stow; 25 тестов managed-режима по ~60 с, разбор ссылок через полный запуск Xray.
    After: 36 с всего: 48 Python-тестов на текущем python3 и 48 под Python 3.8 (через uv, если есть), обе shell-сюиты — PASS; stow не нужен.
  • Слепое ревью Codex (gpt-6-astra, high): 5 находок — смена порта в конфиге при работающем Xray (status врал), три сохраняемые гарантии без тестов, тесты конфига в обход CLI, зависимость теста от доступности Hiddify, ошибки разбора без пути к файлу. Все исправлены, перепроверка: RECHECK: ALL_CLOSED.
  • Каждый новый тест проверен порчей кода:
убрать check_xray_version из start       -> test_wrong_xray_version_is_refused_before_launch: красный
печатать pbk в сводке                     -> test_reality_secrets_stay_out_of_start_output: красный
не узнавать «xray (deleted)»              -> test_replaced_xray_file_is_still_recognised_and_stopped: красный
не сверять порт конфига и state.json      -> test_changed_machine_port_is_refused_while_xray_runs: красный
  • Настоящий Xray 26.3.27: сгенерированные конфиги REALITY и XHTTP с mlkem768x25519plus проходят xray run -test; start → status → stop и Ctrl+C отработаны вживую.

Merge Danger

Door: two-way

Откат — git revert merge-коммита. state.json совместим в обе стороны по нужным ключам: Xray, запущенный старой версией, новая видит и останавливает. Новый код применяется при следующем start.

Blast Radius: proxy-client

Затронуты только пакет proxy-client, его тесты и спецификация. Машинный конфиг и профили прежние; Stow корневого установщика dotfiles не менялся.

## Summary proxy-client — личный клиент для себя и друзей. Убрана защита от сценариев, которые на личной машине не случаются; оставлена защита от реальных. Принцип записан в начале спецификации. ```diff proxy-client start - проверка «тот ли процесс»: boot_id + время старта + /proc/PID/exe + argv супервизора + проверка «тот ли процесс»: /proc/PID/exe у Xray, cmdline у супервизора - состояние «не удалось подтвердить, удалите файлы вручную» + state.json: pid'ы, путь к xray, адрес и порт proxy-client install - три уровня ограничений размера, строгий разбор .dgst, блокировка, отказ при работающем Xray SHA-256 по .dgst, атомарная замена, --replace не пишет через симлинк + при работающем Xray — напоминание перезапустить start proxy-client/install.sh - Stow или ln -s, отказ при ~/.local-симлинке, разбор «повреждённого» блока .bashrc + три прямые ссылки; чужие файлы не трогает; блок в .bashrc, если нет маркера ``` Ошибки о файлах называют полный путь и готовую команду: `файл профиля /home/…/default.url доступен другим пользователям; выполните: chmod 600 /home/…/default.url`. | Файл | Было | Стало | |---|---:|---:| | `proxy-client/.local/bin/proxy-client` | 1569 | 944 | | `proxy-client/install.sh` | 216 | 93 | | Python-тесты | 2479 | 988 | | Shell-тесты | 592 | 322 | | Спецификация | 578 | 220 | Тесты живут только в пяти местах: команда `proxy-client`, разбор ссылки (`parse_vless` + `build_xray_config`), установка Xray с подставным скачивателем, функции Bash с поддельным `PROXY_CLIENT_BIN`, установщик пакета во временном HOME. Подмена внутренних функций и проверки порядка вызовов убраны. ## Evidence - **Before:** `tests/test_proxy_client_full.sh` — около 2,5 мин, требует `uv` и `stow`; 25 тестов managed-режима по ~60 с, разбор ссылок через полный запуск Xray. **After:** 36 с всего: 48 Python-тестов на текущем python3 и 48 под Python 3.8 (через `uv`, если есть), обе shell-сюиты — PASS; `stow` не нужен. - Слепое ревью Codex (`gpt-6-astra`, high): 5 находок — смена порта в конфиге при работающем Xray (`status` врал), три сохраняемые гарантии без тестов, тесты конфига в обход CLI, зависимость теста от доступности Hiddify, ошибки разбора без пути к файлу. Все исправлены, перепроверка: `RECHECK: ALL_CLOSED`. - Каждый новый тест проверен порчей кода: ```text убрать check_xray_version из start -> test_wrong_xray_version_is_refused_before_launch: красный печатать pbk в сводке -> test_reality_secrets_stay_out_of_start_output: красный не узнавать «xray (deleted)» -> test_replaced_xray_file_is_still_recognised_and_stopped: красный не сверять порт конфига и state.json -> test_changed_machine_port_is_refused_while_xray_runs: красный ``` - Настоящий Xray 26.3.27: сгенерированные конфиги REALITY и XHTTP с `mlkem768x25519plus` проходят `xray run -test`; start → status → stop и Ctrl+C отработаны вживую. ## Merge Danger **Door:** two-way Откат — `git revert` merge-коммита. `state.json` совместим в обе стороны по нужным ключам: Xray, запущенный старой версией, новая видит и останавливает. Новый код применяется при следующем `start`. **Blast Radius:** proxy-client Затронуты только пакет proxy-client, его тесты и спецификация. Машинный конфиг и профили прежние; Stow корневого установщика dotfiles не менялся.
ddmitry added 9 commits 2026-09-28 17:39:17 +03:00
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Отдельный ADR дублировал спецификацию и оставлял в ней устаревшие места.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- install.sh ставит три прямые ссылки без Stow; чужие файлы не трогает
  и перечисляет все конфликты сразу; ~/.local и ~/.config могут быть
  ссылками; блок в ~/.bashrc дописывается, если нет маркера.
- proxy_on читает вывод proxy-client env без временного файла.
- Тесты Bash-функций работают через поддельный PROXY_CLIENT_BIN.
- test_proxy_client_full.sh запускает только тесты proxy-client,
  прогон под Python 3.8 — если есть uv.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Проверка «тот ли процесс»: /proc/PID/exe для Xray и cmdline для
  супервизора вместо boot_id, времени старта и разбора argv; нет больше
  состояния «не удалось подтвердить, удалите файлы вручную».
- Установка Xray: SHA-256 и атомарная замена остаются; без ограничений
  размера, строгого разбора .dgst и блокировки на время установки.
- Разбор ссылки: extra — обычный json.loads; allowInsecure/insecure
  игнорируются с предупреждением.
- Ошибки о файлах называют полный путь и готовую команду
  (chmod 600 для профиля, rm для битого state.json).
- Тесты: разбор ссылок — табличные без запуска процессов, по одному
  запуску на сценарий управляемого Xray; без подмены внутренних функций.
  Код 1569 → 925 строк, тесты 2479 → 895, прогон 63 → 9 с.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Спецификация 603 → 220 строк: без описаний снятых защит и без пересказа
кода и README; остались задача, границы, решения с причинами и риски.
В README раздел «Изменение кода» ведёт к спецификации и тестам.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- state.json снова хранит адрес и порт: при смене конфига у работающего
  Xray status/env/run отказывают и советуют перезапустить start.
- Ошибки разбора ссылки называют файл профиля.
- Тесты: отказ start при чужой версии Xray, ключи REALITY не попадают
  в вывод, Xray узнаётся после замены файла; машинный конфиг проверяется
  через CLI; тест пути по умолчанию не зависит от доступности Hiddify.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ddmitry merged commit fa9a93aa0c into master 2026-09-28 17:58:39 +03:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ddmitry/dotfiles#1