Skip to content

Портативный режим: данные рядом с exe (XIC-34) - #33

Merged
Oksion merged 1 commit into
mainfrom
feat/xic-34-portable
Aug 7, 2026
Merged

Портативный режим: данные рядом с exe (XIC-34)#33
Oksion merged 1 commit into
mainfrom
feat/xic-34-portable

Conversation

@Oksion

@Oksion Oksion commented Aug 7, 2026

Copy link
Copy Markdown
Owner

Закрывает #32 (запрос @jintaxi).

Правила выбора каталога

  1. Рядом с exe лежит config.json → работаем с ним (метка не нужна — раз положили, значит хотели).
  2. Рядом лежит метка .portable или portable.txt → каталог программы; прежние настройки из %APPDATA% копируются при первом старте, чтобы включение режима не выглядело как «всё сбросилось».
  3. Иначе — прежнее поведение (%APPDATA%\XiControl).

Почему два имени метки. .portable — как в VS Code и Windows Terminal, но Проводник Windows не даёт создать файл, имя которого начинается с точки. С одним лишь .portable фича упёрлась бы в юзабилити, поэтому portable.txt — равноправный вариант (правый клик → Создать → Текстовый документ).

Каталог программы может быть только для чтения (Program Files, WinGet\Packages): проверяем пробной записью и откатываемся в %APPDATA% с причиной в логе. Молча терять настройки установленной через winget копии — недопустимо.

Что переехало, а что нет

  • config.json, log.txt — переезжают.
  • api.json — намеренно остаётся в %ProgramData% под ACL «только администраторы»: на этом держится то, что HTTP API нельзя включить или подменить его токен правкой пользовательского конфига (XIC-13). Перенос рядом с exe сломал бы модель безопасности.
  • Автозапуск — задача Планировщика, системный объект по природе.

Грабля, на которую стоит посмотреть в ревью

Log пишет в каталог из AppPaths, а AppPaths во время определения каталога не может логировать — вышла бы рекурсия (LogAppPaths.DataDir → инициализация → Log). Поэтому причина отката копится в поле FallbackReason, а печатает её Program уже после инициализации.

Проверка

dotnet build 0/0, dotnet test375 зелёных (+7: конфиг рядом без метки, обе метки, откат при read-only, неизвестный каталог exe, отсутствие пробной записи при обычном запуске).

Живьём: развёрнута портативная копия с portable.txt → настройки из %APPDATA% подхватились полностью (кривые авто-яркости, лимиты, порог заряда, язык), config.json и log.txt легли рядом с exe, первой строкой лога — AppPaths: портативный режим, данные в …, api.json остался в %ProgramData%.

🤖 Generated with Claude Code

)

Запрос jintaxi: настройки в AppData теряются при переустановке Windows,
хочется держать их рядом с программой (как .portable в VS Code / Terminal).

Правила выбора каталога (AppPaths):
- рядом с exe лежит config.json → работаем с ним, метка не нужна;
- лежит метка .portable или portable.txt → каталог программы, а прежние
  настройки из %APPDATA% копируются при первом старте (включение режима не
  должно выглядеть как «всё сбросилось»);
- иначе прежнее поведение.

Два имени метки не прихоть: Проводник Windows не даёт создать файл с именем,
начинающимся с точки, — с одним лишь .portable фича упёрлась бы в юзабилити.

Каталог программы бывает только для чтения (Program Files, WinGet\Packages):
проверяем пробной записью и откатываемся в %APPDATA% с причиной в логе —
иначе установленная копия молча теряла бы настройки. Причина копится полем,
а не пишется сразу: Log сам спрашивает AppPaths.DataDir, и запись во время
инициализации вошла бы в рекурсию.

log.txt следует за конфигом; api.json намеренно остаётся в %ProgramData%
под ACL — на этом держится невозможность включить HTTP API правкой
пользовательского конфига (XIC-13). «О программе» показывает фактические
пути и признак режима.

Проверено вживую: портативная копия с portable.txt подхватила настройки из
%APPDATA% (кривые, лимиты, язык — всё на месте), config.json и log.txt легли
рядом, api.json остался в ProgramData.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Oksion
Oksion merged commit 5d152b4 into main Aug 7, 2026
5 checks passed
@Oksion
Oksion deleted the feat/xic-34-portable branch August 7, 2026 06:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant