Перейти к содержимому

История изменений (Changelog)

Все важные изменения в этом проекте документируются в данном файле.

Формат основан на Keep a Changelog, и проект следует семантическому версионированию.

  • Импорт URL socks4:// и socks4a:// сохраняет этот протокол. Раньше любой URL socks* записывался как socks5, и SOCKS4-прокси открывался рукопожатием SOCKS5.
  • Shell-обёртки сохраняют код завершения команды и дочернего процесса после обработки файла передачи из дашборда. Ошибки env on также возвращаются вызывающей оболочке.
  • Команда переименована в tspm, в том числе при установке через Homebrew и cargo install tspm. В файле запуска оболочки используйте eval "$(tspm init zsh)" (или bash). Имена функции proxy и переменных TSPM_* сохранены.
  • Конфигурация хранится в ~/Library/Application Support/tspm/ на macOS и ${XDG_CONFIG_HOME:-~/.config}/tspm/ на Linux. Программа не читает и не переносит прежний каталог. Чтобы сохранить профили, перенесите его вручную и обновите абсолютный config_path в settings.json, если он задан. Явное указание путей к конфигу и настройкам продолжает работать.
  • Файлы передачи команд оболочке и отладки — ~/.tspm-eval, ~/.tspm-debug-enabled и ~/.tspm-debug.log. Прежние файлы игнорируются. Архивы релиза и формула Homebrew используют имя tspm; импорт библиотеки Rust — tspm.
  • Homebrew выбирает нативный архив для macOS или Linux и arm64 или x86_64. Перед созданием тега workflow проверяет все четыре архива и их контрольные суммы, затем обновляет в формуле все четыре варианта загрузки вместе.
  • dirs обновлён с 6 до 7; обе версии используют dirs-sys 0.5.
  • Зафиксированы обновления clap 4.6.7, clap_complete 4.6.11, futures 0.3.34, reqwest 0.13.5, serde_json 1.0.154, thiserror 2.0.21 и tokio 1.53.3.
  • Зафиксированный rustls обновлён с 0.23.45 до 0.23.46 из-за RUSTSEC-2026-0346, RUSTSEC-2026-0347, RUSTSEC-2026-0348 и RUSTSEC-2026-0349. В них описаны вывод секретов TLS через Debug, отправка данных приложения внешнему серверу после отказа Encrypted Client Hello, большое выделение памяти при распаковке сертификата до аутентификации и понижение обмена ключами из-за неаутентифицированного ServerHello.
  • Установка: cargo install tspm ставит этот релиз из crates.io. Команда по-прежнему terminal-session-proxy-manager. Прежняя установка cargo install --git занимает тот же бинарник; перед cargo install tspm удалите её командой cargo uninstall terminal-session-proxy-manager.

Диаграммы в документации, более надёжная навигация и переключение темы сайта, а также исправления безопасности зависимостей.

  • Зафиксированная версия quinn-proto обновлена с 0.11.17 до 0.11.18 для устранения RUSTSEC-2026-0338, RUSTSEC-2026-0340 и RUSTSEC-2026-0343: паник при обработке QUIC-потоков, задержки ACK и дейтаграмм. Эта необязательная зависимость не включена в текущем наборе возможностей CLI.
  • Сайт: Уязвимая зависимость braces (GHSA-vfj7-8cjw-p6xm) исключена из сборки документации: для отбора страниц в starlight-llms-txt используется Picomatch, совместимость проверяется тестами.
  • Docs: Двуязычные диаграммы показывают, где применяются настройки прокси, как proxy on меняет окружение текущей оболочки и как дашборд передаёт выбранный профиль обратно в оболочку.
  • Сайт: Диаграммы Mermaid следуют активной теме и открываются в диалоге с масштабированием, вписыванием, перетаскиванием, сенсорными жестами и управлением с клавиатуры. После закрытия фокус возвращается к кнопке открытия; сочетания клавиш масштабирования браузера остаются доступны.
  • Docs: URL изображения счётчика Views обновлён в обеих README, чтобы GitHub запрашивал свежий бейдж вместо прежней записи в кеше изображений.
  • Сайт: Документация остаётся видимой после переходов назад и вперёд, включая страницы, восстановленные из кеша истории браузера. Отменённые переходы больше не оставляют содержимое уходящей страницы скрытым.
  • Сайт: Выбор светлой, тёмной или автоматической темы синхронизируется между переключателями страницы, вкладками браузера и переходами по истории; переключение работает и при блокировке хранилища. Быстрые смены темы безопасно заменяют незавершённый переход; настройка уменьшения движения учитывается.
  • Сайт: Шапка документации на компьютерах использует логотип и название главной страницы. Мобильная навигация и оглавление имеют общий стеклянный фон; расположение переключателей темы и языка, кнопок GitHub, групп меню и пунктов оглавления стало чётче.
  • Contributing: Инструкции агентов ссылаются на отдельные правила и скиллы; описание восстановления релиза, проверок и владельцев соответствует текущим процессам. Архивы завершённых планов удалены.

Релиз, в котором у проекта появился собственный сайт. Двуязычный сайт документации публикуется из собственного Markdown репозитория и одинаково работает на телефонах и на компьютерах. Вывод CLI переработан для терминалов и скриптов, которым оформление только мешает, и закрыта уязвимость в TLS.

Обновляетесь? Три изменения вывода могут затронуть скрипты, которые читают то, что печатает утилита, — в разделе Изменено они помечены Ломает скрипты. В config.json, settings.json, именах команд, флагах и кодах завершения ничего не меняется.

  • CLI: rustls обновлён до 0.23.45 из-за RUSTSEC-2026-0285: сообщения рукопожатия TLS 1.3, пересекающие границу уровня шифрования, принимались, а не отклонялись. reqwest использует его во всех HTTPS-запросах утилиты — status, ping, speedtest, monitor, импорт по URL.
  • Сайт: Зависимости сборки сайта обновлены до версий, в которых закрыты уязвимости в astro (критическая: удалённое выполнение кода через оптимизацию AVIF-изображений), sharp, svgo и js-yaml. Astro обновлён до 7.3.2. Это касается только сборки сайта, не CLI.
  • Сайт: Сайт документации по адресу lebedevkondakovsergeyvach.github.io/Terminal-Session-Proxy-Manager, на русском (/ru/) и английском, на Astro Starlight. Страницы генерируются при сборке из README*.md, docs/*.md, CONTRIBUTING.md и changelog, поэтому сайт и файлы на GitHub не могут разойтись.
  • Сайт: Главная страница: возможности проекта рядом со скриншотами терминала в светлом и тёмном вариантах и плитки быстрого старта.
  • Сайт: Оформление в стиле Material Design 3, вся палитра которого выведена из фирменного ржаво-оранжевого цвета проекта, в светлой и тёмной теме, с плавными переходами между страницами — при включённом «уменьшении движения» страница просто сменяется.
  • Сайт: Переключатель темы на три положения — светлая, авто (как в системе) и тёмная — с круговым раскрытием при смене темы.
  • Сайт: Полнотекстовый поиск с быстрыми ссылками на основные руководства, пока строка поиска пуста, и интерфейсом поиска на русском.
  • Сайт: Инструкции по установке во вкладках (Homebrew, Cargo, готовая сборка), пошаговые руководства, цветные блоки-подсказки, блоки кода в рамке терминала с кнопкой копирования и скриншоты, которые увеличиваются по клику или касанию.
  • Сайт: Работает на телефонах и сенсорных экранах:
    • широкие таблицы прокручиваются вбок, а не обрезаются;
    • подписи вкладок на узких экранах переносятся, а не уходят за край;
    • кнопки, вкладки и списки — не ниже 44px, чтобы в них было легко попасть пальцем;
    • эффекты наведения работают только с мышью, поэтому карточка после касания больше не остаётся «приподнятой»;
    • шапка помещается на экране шириной 320px;
    • на телефоне переключатели темы и языка страницы документации находятся в меню.
  • Сайт: Круглая кнопка «домой» рядом с названием сайта на каждой странице документации — на телефонах и на компьютерах, с подписью «На главную» / «Home» для программ экранного доступа.
  • Сайт: Логотип проекта в шапке главной страницы, собственный favicon и иконка для закладок на экране «Домой» в iOS.
  • Сайт: Собственная страница 404 на обоих языках — со ссылками на документацию и переходом на главную при любой ширине экрана.
  • Сайт: Картинка-превью для ссылок в соцсетях и мессенджерах и llms.txt для машинного чтения.
  • Сайт: Сборка падает на битой внутренней ссылке, поэтому мёртвая ссылка не может попасть на опубликованный сайт.
  • Docs: CHANGELOG.ru.md — история изменений на русском, публикуется по /ru/changelog/. README.ru.md теперь ведёт на неё, а не на английский файл.
  • Docs: В docs/SHELL_INTEGRATION.md появилось объяснение, зачем нужна shell-функция, с диаграммой последовательности; docs/USAGE.md начинается с разбивки подкоманд на четыре категории.
  • Docs: В README появился бейдж со ссылкой на сайт документации.
  • Config: OpenAI (https://status.openai.com/api/v2/status.json) и Anthropic (https://www.anthropic.com) добавлены в стандартный список ping_targets. Существующие конфиги сохраняют свой список.
  • CLI: После переключения proxy switch и proxy use <key> заканчивают строку подтверждения тегом [ON] или [OFF] — заданы ли в этой оболочке переменные прокси. При вызове через shell-функцию proxy тег [ON] значит, что новый профиль уже применён, а [OFF] — что он сохранён и ждёт proxy on.
  • CLI: Меню proxy switch убирается с экрана при закрытии — и после выбора профиля, и после отмены.
  • CLI: proxy ping печатает ответы HTTP 2xx зелёным, остальные — жёлтым.
  • CI: website.yml проверяет каждый pull request, затрагивающий сайт или документы, из которых он собирается: запускает тесты генератора, собирает сайт и падает на битой внутренней ссылке. pages.yml публикует сайт из main.
  • CI: Dependabot следит и за npm-зависимостями сайта, а не только за Cargo и GitHub Actions.
  • CI: Политика веток требует менять CHANGELOG.ru.md всякий раз, когда меняется CHANGELOG.md, — публикуются оба.
  • Contributing: Git-хуки в .githooks/, включаются один раз на клон командой git config core.hooksPath .githooks. commit-msg отклоняет строки авторства инструментов (Co-Authored-By:, «Generated with …»), pre-push запрещает пуш в main и пуш тегов: публикует релиз слияние релизной ветки.
  • Contributing: Единый набор инструкций для ИИ-агентов. AGENTS.md — общий контракт; CLAUDE.md и .cursor/rules/ — точки входа для Claude Code и Cursor; правила по областям лежат в .claude/rules/. К скиллам в .claude/skills/ добавились starlight-website — для работы над сайтом — и agent-docs-audit, который проверяет набор инструкций на расхождения. .mcp.json объявляет серверы документации context7 и astro-docs.
  • CLI — Ломает скрипты: proxy on и proxy off больше не печатают строку подтверждения. Выводятся только shell-выражения для eval, поэтому eval "$(proxy env on)" теперь молчит. Скрипт, искавший это подтверждение, нужно поправить.
  • CLI — Ломает скрипты: строка, которую proxy use <key> и proxy switch печатают после переключения, заканчивается новым тегом [ON] / [OFF], то есть её форма изменилась.
  • CLI — Ломает скрипты: proxy ping помечает ответ не из диапазона 2xx как WARN (… ms) жёлтым; раньше это было OK зелёным, как успех.
  • CLI: Эмодзи убраны из строк локализации и из заголовков отчётных команд — ping, diagnose, monitor, git, import, benchmark, speedtest — и из индикатора порта в дашборде. У маркера приглашения и у заголовка дашборда они остались. Статусы, которые печатает proxy ping, теперь переводятся, а не зашиты по-английски.
  • CLI: Разделитель между блоками отчёта — обычная линия из - вместо жирной голубой из =, а заголовки отчётов больше не начинаются с пробелов.
  • Docs: docs/*.md и CONTRIBUTING.md — обычный CommonMark и, как и раньше, читаются на GitHub. Вкладки, карточки, шаги и подсказки сайта записаны комментариями <!--site:…-->: GitHub их не показывает, а генератор сайта разворачивает.
  • Docs: В docs/CONFIGURATION.md приведён полный список ping_targets по умолчанию, а таблица полей называет все команды, которые его читают.
  • Docs: Исправлены описания того, что делают некоторые команды:
    • benchmark проверяет профили по очереди, опрашивая все цели одного профиля одновременно, — а не все профили параллельно;
    • Space в proxy dash сохраняет выбранный профиль активным без выхода; переменные оболочки он не обновляет — это делает только Enter;
    • monitor при неудачной проверке или без заданной переменной прокси сохраняет самый быстрый доступный профиль активным, но не меняет переменные оболочки, в которой запущен;
    • profile set делает профиль активным, не переприменяя переменные оболочки;
    • diagnose показывает основные переменные прокси, а не все, что устанавливает proxy on.
  • Docs: Описание релиза в .ai/GIT_WORKFLOW.md соответствует тому, как работает пайплайн: тег создаётся после сборки бинарников, поэтому упавшая сборка не оставляет тега, и шаги восстановления исходят из этого.
  • CLI: chacha20 0.10.1, отозванный (yanked) с crates.io, заменён на 0.10.2.
  • Contributing: Изменение в docs/, README, CONTRIBUTING.md или changelog должно проходить и сборку сайта (cd website && npm ci && npm test && npm run build), потому что эти файлы — содержимое сайта.
  • Contributing: Правило про changelog в CONTRIBUTING.md совпадает с проверкой CI: запись нужна и для изменений в shell/ и configs/, причём в обоих файлах — CHANGELOG.md и CHANGELOG.ru.md. Шаблон pull request использует те же проверки с --locked и npm ci, что и остальная документация.
  • Contributing: CLAUDE.md импортирует AGENTS.md, а не только ссылается на него, — теперь Claude Code действительно загружает правила проекта. Скиллы переехали из .agents/skills/ (там остались симлинки) в .claude/skills/, где их находит Claude Code. Скилл release-manager обновляет блок ссылок в конце changelog, а cargo-audit спрашивает, куда отнести запись о безопасности, если версия релизной ветки уже зафиксирована.
  • CI: Политика веток сравнивает pull request с его merge base, поэтому pull request только с документацией больше не блокируется другими коммитами релизной ветки.
  • CI: У workflow по умолчанию доступ к репозиторию только на чтение; задача cargo audit получает лишь то дополнительное разрешение, которое нужно ей, чтобы публиковать результаты, — раньше это у неё не получалось.
  • CLI: Ключи перевода env_on_msg и env_off_msg — не используются с тех пор, как proxy on и proxy off перестали печатать подтверждение.
  • Contributing: Скилл aur-packager — пакета в AUR у проекта нет — и неиспользуемый .agents/mcp_config.json.
  • Автоматизация релизов: Повторная попытка обновления Homebrew tap с исправленной ссылкой на имя тега.
  • Автоматизация релизов: Исправлена ошибка релиза, из-за которой формула Homebrew не обновилась при выпуске версии v2.2.0. Запущен патч-релиз для корректного выполнения mislav/bump-homebrew-formula-action и синхронизации tap.

Релиз, направленный на повышение надежности и корректности работы. Исправлен ряд давних ошибок, включая ту, которая могла привести к потере сохраненных профилей пользователя, а также уязвимость с shell-инъекцией. Два изменения влияют на скрипты — см. раздел Изменено.

  • Некорректный config.json больше не удаляет ваши профили. Первая попытка исправления была неполной и была выявлена в ходе ревью: функция load() перестала перезаписывать файл, однако следующая команда, выполняющая сохранение (profile set/use/remove, import или нажатие Enter в дашборде), по-прежнему записывала дефолтные значения прямо поверх него. Теперь некорректно спарсенный конфигурационный файл помечается соответствующим образом, а любая попытка сохранить изменения поверх него завершается ошибкой с пояснением. Команды только для чтения продолжают работать, что позволяет диагностировать проблему с файлом. То же самое относится и к settings.json, где перезапись также неявно сбрасывала config_path и перенаправляла утилиту на другой файл конфигурации.
  • env on возвращает ненулевой код завершения при отсутствии активного профиля. Ранее выводилось сообщение об ошибке, но код возврата был 0, из-за чего цепочка proxy_on && deploy продолжала выполняться в терминале без прокси.
  • profile set больше не сбрасывает протокол существующего профиля. Для флага --protocol было задано значение по умолчанию, из-за чего изменение только порта неявно перезаписывало протокол http-профиля на socks5.
  • IPv6-профили теперь генерируют валидные URL. Запись вида ::1 принималась, но преобразовывалась в http://::1:1080, что не может разобрать ни один клиент. Теперь литералы заключаются в квадратные скобки в URL и остаются без скобок в параметрах JVM -Dhttp.proxyHost=, в соответствии с требованиями каждого из форматов.
  • Ошибка применения URL прокси больше не расценивается как успех. Ошибка создания прокси игнорировалась, из-за чего запрос отправлялся напрямую: monitor сообщал о неработающем туннеле как об исправном, benchmark помещал неработающий профиль на первое место по скорости, после чего best выбирал его, а status и дашборд отображали реальный IP-адрес машины так, будто это IP прокси.
  • Дашборд больше не искажает собственное отображение. Нажатие s запускало бенчмарк, чей спиннер прогресса выводит данные в stderr по таймеру, перекрываясь с кадрами ratatui.
  • Выбор в дашборде больше не сбивается при поступлении результатов бенчмарка. Список сортировался заново без пересчета положения курсора, из-за чего нажатие Enter применяло тот профиль, который случайно оказался под курсором.
  • Shell-обёртка возвращает реальный статус завершения. Шаг повторного применения настроек становился собственным статусом функции и инвертировал его: proxy use work возвращал ошибку при успехе при выключенном прокси, а proxy use nope возвращал успех при ошибке при включенном.
  • run больше не позволяет дочерней команде переопределять настройки самого менеджера. Предварительный парсер сканировал всю командную строку, поэтому proxy run mytool --lang en изменял конфигурационный файл, загружаемый самим менеджером.
  • speedtest сообщает об обрыве соединения вместо некорректно рассчитанной скорости. Ошибка передачи данных посреди потока была неотличима от штатного завершения тела ответа.
  • diagnose разрешает доменные имена (DNS). Проверка сокетов принимала только IP-литералы, поэтому профиль с доменным именем всегда отображался с закрытым портом. Функция load() перезаписывала нечитаемый конфиг дефолтными значениями, поэтому одна случайная запятая приводила к незаметному удалению всех профилей. Файл, который существует, но не может быть спарсен, теперь выводится в stderr и сохраняется байт-в-байт. То же самое относится к settings.json.
  • proxy --help больше не выводит необработанный ключ cmd_debug. Для подкоманды debug отсутствовал перевод. Теперь тест проверяет наличие описания для каждой подкоманды на обоих языках.
  • proxy run корректно принимает флаги для дочерней команды. Вызов proxy run curl -sS URL завершался ошибкой «unexpected argument ‘-s’»; теперь аргументы после имени программы передаются без изменений.
  • Флаг -h снова везде означает --help. В команде profile set он был привязан к --host, перекрывая флаг вызова справки для этой подкоманды.
  • Дашборд больше не паникует при пустом списке профилей. Нажатие клавиши со стрелкой вычисляло len() - 1 для пустого списка, что вызывало панику на альтернативном экране и оставляло терминал в неработоспособном состоянии.
  • Терминал корректно восстанавливается при любом выходе из дашборда. RAII-гард в сочетании с перехватчиком паник (panic hook) заменили прежнюю очистку, работавшую только при успешном завершении, из-за чего пользователи оставались в raw-режиме на альтернативном экране при любой ошибке или панике.
  • Дашборд экспортирует те же переменные, что и env on. Ранее он устанавливал только HTTP_PROXY, HTTPS_PROXY и ALL_PROXY, опуская имена в нижнем регистре и параметры для JVM.
  • Импорт постороннего JSON-файла больше не создаёт фиктивные профили. Поскольку каждое поле конфигурации имеет значение по умолчанию в serde, любой JSON-объект успешно парсился и «импортировал» два встроенных профиля по умолчанию.
  • git on / git off сообщают об ошибках. Статус завершения команды git config игнорировался, поэтому при отсутствии установленного git всё равно выводилось сообщение об успешном выполнении.
  • monitor больше не считает статус 404 успешным. Теперь он опрашивает настраиваемый health_check_url, возвращающий 204, вместо специальной обработки ошибочного ответа конкретного API.
  • Результаты бенчмарка теперь отличают недоступный прокси от просто медленного; ранее специальное значение-маркер 9999 объединяло оба случая.
  • Переменная NO_COLOR обрабатывается в соответствии со спецификацией (любое непустое значение), а не только при ее наличии в окружении.
  • Shell-инъекция в env on и механизме передачи состояния дашборда. Вывод, передаваемый в eval "$(...)", интерполировал поля профиля без экранирования, что позволяло значению хоста из отредактированного или импортированного конфига выполнять произвольные команды. Теперь все значения экранируются одинарными кавычками POSIX, что подтверждено тестом, выполняющим сгенерированный скрипт в реальном shell.
  • Профили проходят валидацию перед сохранением как в profile set, так и при импорте: хост проверяется по белому списку символов, порт должен быть ненулевым, а протокол — поддерживаться утилитой.
  • Документированная модель ветвления: main <- release/X.Y.Z <- task-ветки, описанная в .ai/GIT_WORKFLOW.md и контролируемая .github/workflows/branch-policy.yml. Pull request’ы проверяются на соответствие именования веток, валидность пары head/base и наличие записи в changelog.
  • Автоматическая публикация релизов. Слияние релизной ветки в main запускает CI-проверку сборки, создание тега vX.Y.Z, сборку бинарных файлов под четыре целевые платформы и обновление Homebrew tap. Создание тегов вручную по-прежнему поддерживается и использует тот же процесс.
  • Глобальные флаги --config-file, --settings-file и --lang с соответствующими переменными окружения TSPM_CONFIG, TSPM_SETTINGS и TSPM_LANG. Это обеспечивает возможность автоматизации через скрипты и запуск тестов в полной изоляции.
  • Настраиваемые эндпоинты в config.json: ipv4_api, ipv6_api, health_check_url и speedtest_url, которые ранее были жестко захардкожены.
  • Полная локализация для speedtest, monitor, git и TUI-дашборда, которые ранее выводили текст на английском языке независимо от выбранного языка.
  • Файлы CONTRIBUTING.md, SECURITY.md, AGENTS.md, CLAUDE.md, шаблоны issues и pull requests, а также конфигурация Dependabot.
  • Количество тестов выросло с 9 до 126, включая набор сквозных (end-to-end) тестов в tests/cli.rs, тестирующий реальный бинарник в изолированной конфигурации.

Два изменения могут повлиять на существующие скрипты:

  • profile use и profile remove возвращают ненулевой код завершения при передаче неизвестного ключа. Ранее они выводили ошибку и завершались с кодом 0, из-за чего конструкция proxy profile use "$p" || fallback всегда шла по ветке успешного выполнения.
  • У флага profile set --host удалена короткая форма -h. Используйте --host.

Также изменено:

  • Команда export завершается с ошибкой вместо пустого вывода, если нет активного профиля, поэтому proxy export envfile > .env не может случайно очистить файл.
  • settings set --lang отклоняет неизвестный язык вместо автоматического выбора русского.
  • Неиспользуемое поле enabled удалено из config.json. Существующие конфиги продолжают загружаться, поле просто игнорируется.
  • run в точности транслирует код завершения дочернего процесса.
  • Переход на редакцию Edition 2024, MSRV 1.88 и обновление зависимостей: clap 4.6, tokio 1.48, reqwest 0.13, thiserror 2.0, dirs 6.0, colored 3.1, indicatif 0.18, dialoguer 0.12. Директория конфигурации macOS не изменилась при обновлении dirs.
  • Релизные сборки используют Fat LTO, одну единицу кодогенерации (codegen unit) и очистку отладочных символов (stripped symbols).
  • Процесс публикации релиза проставляет тег только после успешной сборки всех бинарных файлов. Ранее создание тега в самом начале приводило к тому, что при сбое сборки создавался тег без опубликованных файлов, а последующие попытки видели существующий тег и навсегда пропускали релиз.
  • В CI добавлены проверка MSRV, аудит безопасности cargo audit, сборки с флагом --locked и проверка сборки документации. Релизы теперь проверяют соответствие тега версии крейта, формируют бинарные файлы для Linux aarch64 и публикуют контрольные суммы SHA-256.
  • Двуязычные сообщения справки CLI.
  • Конфигурация по умолчанию использует безопасные стандартные профили.

Схема

Перетаскивайте схему. Масштаб — двумя пальцами или колесом. Клавиши: стрелки, +, −, 0.