---
name: cehoproxy_two_repos
description: "CehoProxy: один публичный репозиторий CodoCeh/CehoProxy с открытым кодом; как выкладывается релиз и какие тут грабли"
metadata:
  node_type: memory
  type: project
---

Публикация [[cehoproxy_overview]], итог на 07.08.2026.

**Репозиторий один: `CodoCeh/CehoProxy`, публичный, Apache 2.0.** Сначала было двое — публичная витрина без кода и приватный `CehoProxy-source` с кодом; владелец решил, что приватный проекту не нужен. Код перенесён **одним коммитом** (релизы и ссылки на них не трогались, история не переписывалась), приватный репозиторий **заархивирован** — в нём остались 14 коммитов исходной истории. Локальная папка `~/Разработки/proxycage` смотрит на публичный, прежняя история лежит в ветке `main-private`.

Лицензия прошла круг Apache 2.0 → собственное закрытое соглашение → снова Apache 2.0. При закрытии/открытии кода обязательно править ВСЕ три места: `LICENSE`, `NOTICE` и раздел лицензии в README — иначе документ противоречит сам себе.

**Перед публикацией — поиск секретов по ВСЕЙ истории, а не по рабочей копии** (`git rev-list --all` + `git grep` по каждому коммиту). У CehoProxy чисто: настоящая подписка была заменена на синтетическую до первого `git init`.

**Грабли релизов, все пойманы живьём:**
- **Имена файлов только ASCII.** «Установить CehoProxy.cmd» превратился в `CehoProxy.cmd`. Поэтому для людей выкладываются zip-архивы с нормальными именами внутри.
- **Архивы собирает только `scripts/make-release.py`.** Его первая версия правила переводы строк у всех файлов подряд, включая программу: `0D 0A` внутри исполняемого — это код, и «нормализация» отъедала пару тысяч байт, после чего macOS убивал программу сигналом. Теперь текст правится только у текстовых файлов, а скрипт после сборки сверяет программу в архиве с собранной и падает при расхождении.
- **Заменять файлы в готовом релизе нельзя.** После `delete-asset`+`upload` адрес `releases/latest/download/...` ещё несколько минут отдаёт старую копию (через API по id приходит новая — то есть кеш раздачи). Правильный путь — новый выпуск.
- **Zip собирать питоновским `zipfile`, а не `zip`:** он ставит флаг UTF-8, иначе Проводник Windows покажет кракозябры.
- Отдельные `cehoproxy-<os>-<arch>` в релизе обязательны: по этим именам ищет `chp update` и качает `install.sh`.

**Версия — в `Directory.Build.props`, одна на все проекты.** Стояла только в Cli, а `Updater.CurrentVersion` читал сборку Core — продукт показывал бы старый номер и не видел своего обновления.

**Установщик Windows собирается на ноутбуке владельца** (192.168.0.101): Inno Setup 6.7.3 поставлен вручную с github.com/jrsoftware/issrc (winget до своего источника не достаёт), раскладка в `C:\CehoProxy-build`, сборка `ISCC.exe scripts\cehoproxy.iss`. В `.iss` обязательны `skipifsilent` у постустановочного шага (иначе тихая установка открывает окно мастера) и `DefaultGroupName` (иначе ярлыки уезжают в папку «(Default)»).

**Фирменный знак** — наковальня с `codoceh.ru/kodoceh-icon.png`; чёрный фон по углам сделан прозрачным заливкой от углов, `assets/cehoproxy.ico` на семь размеров, подключён через `ApplicationIcon` в csproj и `SetupIconFile` в .iss.

**Проверять выложенное надо скачиванием**, а не чтением кода: именно так нашлась испорченная программа в архиве. Порядок: скачать архив по публичной ссылке, распаковать, запустить, сверить размер с собранным.

`gh` поставлен через brew, владелец авторизовался сам (`gh auth login`, аккаунт `cebers227-cmd`) — токен я не запрашивал и не вводил.
