diff --git a/.editorconfig b/.editorconfig index 6b63cde..50b9f4d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -7,7 +7,9 @@ root = true indent_style = space insert_final_newline = true trim_trailing_whitespace = true -charset = utf-8-bom +# Без BOM: так сохранено большинство файлов (и так пишут редакторы по умолчанию); +# компилятор C# и без BOM читает исходники как UTF-8. +charset = utf-8 [*.{yml,yaml,json,jsonc}] indent_size = 2 @@ -76,4 +78,7 @@ dotnet_diagnostic.RCS1001.severity = none dotnet_diagnostic.RCS1003.severity = none # IDE0028 — стиль collection-инициализаторов, чистая косметика. dotnet_diagnostic.IDE0028.severity = none +# RCS1139 — «добавь »: doc-комментарий члена часто состоит из одного — +# смысл члена ясен из имени, пояснять нужно только аргумент. +dotnet_diagnostic.RCS1139.severity = none # ===================================================================================== diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 18f8283..e231e5d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,9 +36,20 @@ jobs: run: dotnet test XiControl.sln -c Release --no-build --nologo # Информационный шаг: показывает дрейф стиля, но НЕ роняет CI — и это - # осознанно навсегда (решение Фазы 4): в Loc.cs и OsdForm.cs намеренное - # колоночное выравнивание, которое dotnet format схлопывает. Правила же - # анализаторов и так жёсткие — они входят в Build через TreatWarningsAsErrors. + # осознанно навсегда (решение Фазы 4). Правила анализаторов и так жёсткие — + # они входят в Build через TreatWarningsAsErrors. + # --severity warn: info-подсказки анализаторов (LibraryImport, абзацы в doc- + # комментариях…) — это советы IDE, а не дрейф стиля; шаг ловит пробелы/кодировку. + # --exclude — файлы с намеренным ручным выравниванием (колонки, таблицы, + # плотные инициализаторы), которое dotnet format схлопывает. Список держать + # в синхроне с CLAUDE.md («не гонять dotnet format»), XIC-52. - name: Format check (non-blocking) continue-on-error: true - run: dotnet format XiControl.sln --verify-no-changes --severity info + run: > + dotnet format XiControl.sln --verify-no-changes --severity warn + --exclude src/Ui/OsdForm.cs + --exclude src/Wmi/Mifs.cs + --exclude src/Ui/TrayApp.cs + --exclude src/Ui/Settings/SettingsToolkit.cs + --exclude src/SystemIntegration/AlsSensor.cs + --exclude src/SystemIntegration/PowerProfileGuard.cs diff --git a/CLAUDE.md b/CLAUDE.md index d512945..b2259d7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -67,9 +67,13 @@ MSR.** Это не техническое ограничение, а осозн `dotnet test XiControl.sln` — все зелёные; чистую логику покрывай тестом (образцы — в `tests/XiControl.Tests`, фейки в `Fakes.cs`), UI и железо — глазами. Иконки — глазами (см. ниже). Группируй изменения, не перезапускай приложение по мелочи. -- **`dotnet format` не гонять по `OsdForm.cs`** — там намеренное колоночное выравнивание - (маппинг иконок), формат его схлопывает. (`Loc.cs` больше не в этом списке: строки уехали - в JSON, сам файл — обычный загрузчик.) +- **`dotnet format` не гонять по файлам с ручным выравниванием** — формат его схлопывает: + `src/Ui/OsdForm.cs` (колоночный маппинг иконок), `src/Wmi/Mifs.cs` (таблицы «код ↔ процент»), + `src/Ui/TrayApp.cs` (висячий отступ лямбд), `src/Ui/Settings/SettingsToolkit.cs` (плотные + инициализаторы), `src/SystemIntegration/AlsSensor.cs` (колонка комментариев COM-интерфейса), + `src/SystemIntegration/PowerProfileGuard.cs` (`else` под `if`). Тот же список стоит в + `--exclude` шага Format check в `ci.yml` — держать их в синхроне (XIC-52). Исходники — + UTF-8 **без BOM** (`.editorconfig`). Внешние PR (в т.ч. от других вайб-кодеров с нейронками) — приветствуются, но проходят через тот же фильтр: driver-free, не усложняем, локализация на месте, собирается чисто. Ветки ребейзим на diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 71f1ba4..4453499 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -33,14 +33,18 @@ Exe после sln-сборки лежит в `src\bin\x64\Release\net8.0-window - Деградируйте мягко: железо-зависимые вызовы — в try/catch с `Log.Ex`, приложение не падает на несовместимой модели. - UI-поток не блокируем: долгие WMI/PnP-вызовы — в `Task.Run`. -- В таблице иконок `OsdForm` — намеренное колоночное выравнивание; - `dotnet format` по этому файлу не гонять. +- В нескольких файлах намеренное ручное выравнивание (таблица иконок `OsdForm`, таблицы + `Mifs` и др.) — `dotnet format` по ним не гонять; полный список — в `--exclude` шага + Format check в `.github/workflows/ci.yml`. ## Процесс 1. Синхронизируйте форк с `main` (кнопка «Sync fork») — `main` здесь часто уходит вперёд. 2. Фича — в отдельной ветке от свежего `main`, не в форк-`main`. 3. PR должен собираться чисто и проходить CI (build + tests — жёсткие гейты). + Красная проверка `security/snyk` на PR из форка, который трогает `.csproj`, — + ожидаема и мержу не мешает: Snyk не может склонировать чужой форк («failed to clone»), + это сбой доступа, а не найденная уязвимость. 4. Проверка на железе приветствуется, но не обязательна: мейнтейнер проверяет на Xiaomi Book Pro 14 (TM2424). Укажите в PR, на какой модели тестировали вы. diff --git a/src/Config/AppConfig.cs b/src/Config/AppConfig.cs index e1576e1..1eab828 100644 --- a/src/Config/AppConfig.cs +++ b/src/Config/AppConfig.cs @@ -1,4 +1,4 @@ -using System.Text.Json.Serialization; +using System.Text.Json.Serialization; using XiControl.Wmi; namespace XiControl.Config; diff --git a/src/Program.cs b/src/Program.cs index fb36a2c..58b8809 100644 --- a/src/Program.cs +++ b/src/Program.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using XiControl.Config; using XiControl.Localization; using XiControl.SystemIntegration; diff --git a/src/SystemIntegration/TouchpadHaptics.cs b/src/SystemIntegration/TouchpadHaptics.cs index 4100192..3e688c2 100644 --- a/src/SystemIntegration/TouchpadHaptics.cs +++ b/src/SystemIntegration/TouchpadHaptics.cs @@ -189,10 +189,10 @@ private struct HIDP_CAPS } [DllImport("hid.dll")] private static extern void HidD_GetHidGuid(out Guid guid); - [DllImport("hid.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.U1)] private static extern bool HidD_SetOutputReport(SafeFileHandle h, byte[] buf, int len); - [DllImport("hid.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.U1)] private static extern bool HidD_GetInputReport(SafeFileHandle h, byte[] buf, int len); - [DllImport("hid.dll")] [return: MarshalAs(UnmanagedType.U1)] private static extern bool HidD_GetPreparsedData(SafeFileHandle h, out IntPtr pp); - [DllImport("hid.dll")] [return: MarshalAs(UnmanagedType.U1)] private static extern bool HidD_FreePreparsedData(IntPtr pp); + [DllImport("hid.dll", SetLastError = true)][return: MarshalAs(UnmanagedType.U1)] private static extern bool HidD_SetOutputReport(SafeFileHandle h, byte[] buf, int len); + [DllImport("hid.dll", SetLastError = true)][return: MarshalAs(UnmanagedType.U1)] private static extern bool HidD_GetInputReport(SafeFileHandle h, byte[] buf, int len); + [DllImport("hid.dll")][return: MarshalAs(UnmanagedType.U1)] private static extern bool HidD_GetPreparsedData(SafeFileHandle h, out IntPtr pp); + [DllImport("hid.dll")][return: MarshalAs(UnmanagedType.U1)] private static extern bool HidD_FreePreparsedData(IntPtr pp); [DllImport("hid.dll")] private static extern int HidP_GetCaps(IntPtr pp, out HIDP_CAPS caps); [DllImport("setupapi.dll", SetLastError = true)] private static extern IntPtr SetupDiGetClassDevsW(ref Guid g, IntPtr enumerator, IntPtr hwnd, int flags); diff --git a/src/Ui/AppController.cs b/src/Ui/AppController.cs index 1513ec8..af8f8fa 100644 --- a/src/Ui/AppController.cs +++ b/src/Ui/AppController.cs @@ -1,4 +1,4 @@ -using XiControl.Config; +using XiControl.Config; using XiControl.Localization; using XiControl.SystemIntegration; using XiControl.Wmi; diff --git a/src/Ui/FlyoutForm.cs b/src/Ui/FlyoutForm.cs index 940425c..d25d878 100644 --- a/src/Ui/FlyoutForm.cs +++ b/src/Ui/FlyoutForm.cs @@ -1,4 +1,4 @@ -using System.Drawing.Drawing2D; +using System.Drawing.Drawing2D; namespace XiControl.Ui; diff --git a/src/Ui/FormChrome.cs b/src/Ui/FormChrome.cs index 5262473..6912f24 100644 --- a/src/Ui/FormChrome.cs +++ b/src/Ui/FormChrome.cs @@ -1,4 +1,4 @@ -using System.Runtime.InteropServices; +using System.Runtime.InteropServices; namespace XiControl.Ui; diff --git a/src/Ui/ModeUi.cs b/src/Ui/ModeUi.cs index 2b15358..cdec20c 100644 --- a/src/Ui/ModeUi.cs +++ b/src/Ui/ModeUi.cs @@ -1,4 +1,4 @@ -using XiControl.Wmi; +using XiControl.Wmi; namespace XiControl.Ui; diff --git a/src/Ui/MonitorForm.cs b/src/Ui/MonitorForm.cs index a2204c1..50340e7 100644 --- a/src/Ui/MonitorForm.cs +++ b/src/Ui/MonitorForm.cs @@ -1,4 +1,4 @@ -using System.Drawing.Drawing2D; +using System.Drawing.Drawing2D; using System.Management; using XiControl.Config; using XiControl.Localization; diff --git a/src/Ui/QuickPanelForm.cs b/src/Ui/QuickPanelForm.cs index 1a5a4ef..4042d5e 100644 --- a/src/Ui/QuickPanelForm.cs +++ b/src/Ui/QuickPanelForm.cs @@ -1,4 +1,4 @@ -using System.Runtime.InteropServices; +using System.Runtime.InteropServices; using XiControl.Config; using XiControl.Localization; using XiControl.SystemIntegration; diff --git a/src/Ui/Settings/AboutTab.cs b/src/Ui/Settings/AboutTab.cs index fe0ce61..17450d7 100644 --- a/src/Ui/Settings/AboutTab.cs +++ b/src/Ui/Settings/AboutTab.cs @@ -1,4 +1,4 @@ -using System.Diagnostics; +using System.Diagnostics; using XiControl.Config; using XiControl.Localization; using XiControl.SystemIntegration; diff --git a/src/Ui/Settings/BatteryTab.cs b/src/Ui/Settings/BatteryTab.cs index 34695dc..0d55f81 100644 --- a/src/Ui/Settings/BatteryTab.cs +++ b/src/Ui/Settings/BatteryTab.cs @@ -1,4 +1,4 @@ -using XiControl.Config; +using XiControl.Config; using XiControl.Localization; namespace XiControl.Ui.Settings; diff --git a/src/Ui/Settings/GeneralTab.cs b/src/Ui/Settings/GeneralTab.cs index 76aea27..1dbdb32 100644 --- a/src/Ui/Settings/GeneralTab.cs +++ b/src/Ui/Settings/GeneralTab.cs @@ -1,4 +1,4 @@ -using XiControl.Config; +using XiControl.Config; using XiControl.Localization; namespace XiControl.Ui.Settings; diff --git a/src/Ui/Settings/KeysTab.cs b/src/Ui/Settings/KeysTab.cs index d13126a..d4323fb 100644 --- a/src/Ui/Settings/KeysTab.cs +++ b/src/Ui/Settings/KeysTab.cs @@ -1,4 +1,4 @@ -using XiControl.Config; +using XiControl.Config; using XiControl.Localization; namespace XiControl.Ui.Settings; diff --git a/src/Ui/Settings/NavStrip.cs b/src/Ui/Settings/NavStrip.cs index 447ce9b..31e72cb 100644 --- a/src/Ui/Settings/NavStrip.cs +++ b/src/Ui/Settings/NavStrip.cs @@ -1,4 +1,4 @@ -using System.Drawing.Drawing2D; +using System.Drawing.Drawing2D; using XiControl.Localization; namespace XiControl.Ui.Settings; diff --git a/src/Ui/Settings/PerfTab.cs b/src/Ui/Settings/PerfTab.cs index 5e92898..3f26bf7 100644 --- a/src/Ui/Settings/PerfTab.cs +++ b/src/Ui/Settings/PerfTab.cs @@ -1,4 +1,4 @@ -using System.Drawing.Drawing2D; +using System.Drawing.Drawing2D; using XiControl.Config; using XiControl.Localization; using XiControl.Wmi; diff --git a/src/Ui/Settings/SettingsPane.cs b/src/Ui/Settings/SettingsPane.cs index c3900d2..d766910 100644 --- a/src/Ui/Settings/SettingsPane.cs +++ b/src/Ui/Settings/SettingsPane.cs @@ -1,4 +1,4 @@ -namespace XiControl.Ui.Settings; +namespace XiControl.Ui.Settings; /// /// Базовая панель вкладки настроек: вертикальный поток карточек с прокруткой. diff --git a/src/Ui/Settings/SettingsTheme.cs b/src/Ui/Settings/SettingsTheme.cs index a54a185..39a0e1f 100644 --- a/src/Ui/Settings/SettingsTheme.cs +++ b/src/Ui/Settings/SettingsTheme.cs @@ -1,4 +1,4 @@ -namespace XiControl.Ui.Settings; +namespace XiControl.Ui.Settings; /// /// Палитра окна настроек (Win11-стиль). Читается из системной темы на каждую пересборку diff --git a/src/Ui/Settings/SettingsToolkit.cs b/src/Ui/Settings/SettingsToolkit.cs index ba8649f..ccf011b 100644 --- a/src/Ui/Settings/SettingsToolkit.cs +++ b/src/Ui/Settings/SettingsToolkit.cs @@ -1,4 +1,4 @@ -using System.Drawing.Drawing2D; +using System.Drawing.Drawing2D; using XiControl.Localization; namespace XiControl.Ui.Settings; diff --git a/src/Ui/SettingsActions.cs b/src/Ui/SettingsActions.cs index 4cd73db..ff9986c 100644 --- a/src/Ui/SettingsActions.cs +++ b/src/Ui/SettingsActions.cs @@ -1,4 +1,4 @@ -using XiControl.Localization; +using XiControl.Localization; using XiControl.SystemIntegration; using XiControl.Wmi; diff --git a/src/Ui/SettingsForm.cs b/src/Ui/SettingsForm.cs index 3aa1278..5b59066 100644 --- a/src/Ui/SettingsForm.cs +++ b/src/Ui/SettingsForm.cs @@ -1,4 +1,4 @@ -using Microsoft.Win32; +using Microsoft.Win32; using XiControl.Config; using XiControl.Localization; using XiControl.SystemIntegration; diff --git a/src/Ui/SvgIcons.cs b/src/Ui/SvgIcons.cs index 33327d4..ccf5e93 100644 --- a/src/Ui/SvgIcons.cs +++ b/src/Ui/SvgIcons.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System.Reflection; using Svg; namespace XiControl.Ui; diff --git a/src/Ui/ToggleSwitch.cs b/src/Ui/ToggleSwitch.cs index 35a526e..4f02f03 100644 --- a/src/Ui/ToggleSwitch.cs +++ b/src/Ui/ToggleSwitch.cs @@ -1,4 +1,4 @@ -using System.Drawing.Drawing2D; +using System.Drawing.Drawing2D; namespace XiControl.Ui; diff --git a/src/Ui/TrayApp.cs b/src/Ui/TrayApp.cs index 6ae6d17..412a5c9 100644 --- a/src/Ui/TrayApp.cs +++ b/src/Ui/TrayApp.cs @@ -1,4 +1,4 @@ -using System.Diagnostics; +using System.Diagnostics; using Microsoft.Win32; using XiControl.Config; using XiControl.Input; diff --git a/src/Ui/TrayIconController.cs b/src/Ui/TrayIconController.cs index 1859d44..df5180a 100644 --- a/src/Ui/TrayIconController.cs +++ b/src/Ui/TrayIconController.cs @@ -1,4 +1,4 @@ -using XiControl.SystemIntegration; +using XiControl.SystemIntegration; using XiControl.Wmi; namespace XiControl.Ui; diff --git a/tests/XiControl.Tests/AppConfigMigrationTests.cs b/tests/XiControl.Tests/AppConfigMigrationTests.cs index 6c9ff89..2a734e6 100644 --- a/tests/XiControl.Tests/AppConfigMigrationTests.cs +++ b/tests/XiControl.Tests/AppConfigMigrationTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using XiControl.Config; using XiControl.Wmi; using Xunit; diff --git a/tests/XiControl.Tests/AppControllerTests.cs b/tests/XiControl.Tests/AppControllerTests.cs index aa90d0b..0a0929e 100644 --- a/tests/XiControl.Tests/AppControllerTests.cs +++ b/tests/XiControl.Tests/AppControllerTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using XiControl.Config; using XiControl.Localization; using XiControl.SystemIntegration; diff --git a/tests/XiControl.Tests/Fakes.cs b/tests/XiControl.Tests/Fakes.cs index 5adf141..a31a06a 100644 --- a/tests/XiControl.Tests/Fakes.cs +++ b/tests/XiControl.Tests/Fakes.cs @@ -1,4 +1,4 @@ -using Microsoft.Win32; +using Microsoft.Win32; using XiControl.SystemIntegration; using XiControl.Wmi; diff --git a/tests/XiControl.Tests/FlyoutPaletteTests.cs b/tests/XiControl.Tests/FlyoutPaletteTests.cs index 4047817..3898943 100644 --- a/tests/XiControl.Tests/FlyoutPaletteTests.cs +++ b/tests/XiControl.Tests/FlyoutPaletteTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using XiControl.Ui; using Xunit; diff --git a/tests/XiControl.Tests/ModeUiTests.cs b/tests/XiControl.Tests/ModeUiTests.cs index 958e39b..b1035b6 100644 --- a/tests/XiControl.Tests/ModeUiTests.cs +++ b/tests/XiControl.Tests/ModeUiTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using XiControl.Ui; using Xunit; diff --git a/tests/XiControl.Tests/TrayIconControllerTests.cs b/tests/XiControl.Tests/TrayIconControllerTests.cs index ca9a60b..6cad647 100644 --- a/tests/XiControl.Tests/TrayIconControllerTests.cs +++ b/tests/XiControl.Tests/TrayIconControllerTests.cs @@ -1,4 +1,4 @@ -using FluentAssertions; +using FluentAssertions; using XiControl.Ui; using XiControl.Wmi; using Xunit;