# SMS Task Two — редактор переменных среды Десктопное приложение на **Avalonia** (.NET 8) для чтения и изменения пользовательских переменных среды. Ядро, ViewModels и модуль окружения вынесены в переносимые проекты для последующего порта на **WPF**. ## Solution Файл решения: [`Sms.TaskTwo.slnx`](Sms.TaskTwo.slnx) (формат XML solution). ## Структура проектов | Проект | Назначение | |--------|------------| | `Sms.Environment` | Интерфейс `IEnvironmentVariableStore` | | `Sms.Environment.Windows` | User env через реестр `HKCU\Environment` | | `Sms.Environment.Linux` | `~/.config/environment.d/99-sms-task-two.conf` | | `Sms.TaskTwo.Core` | Конфигурация, сервис, логирование | | `Sms.TaskTwo.ViewModels` | MVVM (`CommunityToolkit.Mvvm`) | | `Sms.TaskTwo.Avalonia` | UI-хост | ## Сборка и запуск ```bash dotnet restore Sms.TaskTwo.slnx dotnet build Sms.TaskTwo.slnx dotnet run --project src/Sms.TaskTwo.Avalonia/Sms.TaskTwo.Avalonia.csproj ``` ## Конфигурация [`src/Sms.TaskTwo.Avalonia/appsettings.json`](src/Sms.TaskTwo.Avalonia/appsettings.json): - `EnvironmentVariables:Names` — массив имён переменных (обязательно по ТЗ). - `EnvironmentVariables:CommentsVariableName` — служебная переменная с JSON-комментариями (`имя → текст`). - `EnvironmentVariables:Defaults` — значения по умолчанию, если переменная ещё не существует в ОС. - `Logging:LogDirectory` — каталог логов (по умолчанию `logs`). ## Комментарии Комментарии к полям хранятся в одной переменной среды (например `SMS_TASK_TWO_COMMENTS`) в формате JSON: ```json {"SMS_MEAL_SERVER_URL":"URL сервера","SMS_MEAL_API_KEY":"ключ API"} ``` Переменная записывается тем же механизмом, что и остальные, и доступна другим процессам после применения окружения ОС. ## Логирование Класс `Sms.TaskTwo.Core.Logging.ConsoleLog` — дублирует записи в консоль и файл. По умолчанию для GUI: `logs/test-sms-wpf-app-yyyyMMdd-hh:mm:ss.log` (на Windows двоеточия во времени заменяются на `-`). При вызове `ConsoleLog.Open()` без имени — `test-sms-console-app-yyyyMMdd_HHmmss.log`. Пример строки: ``` 2026-06-04 18:30:01 [INFO] Changed value: SMS_MEAL_SERVER_URL=https://example.com (previous: ) ``` ## UI - **Добавить** — создаёт пользовательскую переменную (имя + значение); список имён хранится в env-переменной `SMS_TASK_TWO_CUSTOM_VARS` (JSON-массив). Пользовательские строки подсвечиваются жёлтым, идут после переменных из конфига. **Удалить** у пользовательской переменной убирает её из списка и из user store. - При старте переменные из `appsettings.json`, отсутствующие в пользовательском хранилище, **создаются автоматически** (со значением из `Defaults` или пустой строкой). - Строки из конфига **всегда вверху** таблицы (в порядке из `Names`), остальные — ниже по алфавиту. - Изменение одной строки обновляет только её ViewModel (без пересборки всей таблицы); при переключении «все переменные» строки добавляются/удаляются/переставляются инкрементально. - **Отображать все переменные** — показывает все переменные процесса; значения можно записать в пользовательское хранилище (реестр / `environment.d`). - Строки из `appsettings.json` подсвечиваются голубым (`#E3F2FD`). - Переменные в пользовательском хранилище помечаются **USER** и зелёной полосой; кнопка **Удалить** снимает их из HKCU / `environment.d`. - Совпадение обоих признаков — фон `#C8E6C9`. ## Платформы ### Windows - Чтение/запись: реестр `HKEY_CURRENT_USER\Environment`. - **Применить к сессии** (`ReloadEnvironment`): обновляет env текущего процесса и рассылает `WM_SETTINGCHANGE` для других GUI-приложений. ### Linux - Запись в `~/.config/environment.d/` (systemd `KEY=value`). - **Применить к сессии** не поддерживается: переменные подхватываются после перезапуска login-сессии. ## Предположения (ТЗ) 1. Колонка «Поле» — только имена из `appsettings.json`, без добавления новых строк вручную. 2. Значения по умолчанию показываются в UI, в ОС записываются при первом изменении пользователем. 3. Pixel-perfect вёрстка не требуется; элементы стилизованы по макету (заголовок, DataGrid, кнопки «−» / «×»). ## Порт на WPF Создать `Sms.TaskTwo.Wpf`, подключить `Sms.TaskTwo.Core`, `Sms.TaskTwo.ViewModels`, зарегистрировать `IEnvironmentVariableStore` так же, как в `App.axaml.cs` Avalonia-проекта.