When writing complex features or significant refactors, use an ExecPlan (as described in PLANS.md) from design to implementation.
When creating or changing an ExecPlan, follow PLANS.md completely. An ExecPlan must be self-contained, living, understandable to a novice, and must describe demonstrably working behavior. Keep Progress, Surprises & Discoveries, Decision Log, and Outcomes & Retrospective current as work proceeds; record decisions and surprising findings in the plan instead of relying on chat history.
AiteBar — desktop-утилита для Windows: скрываемая edge-панель быстрого доступа с кнопками пользовательских действий, встроенными утилитами, контекстами и системной интеграцией через tray/hotkeys. Лицензия: MIT.
Репозиторий содержит:
- основное приложение
AiteBar - тестовый проект
AiteBar.Tests - артефакты publish/installer в
artifacts - скрипт сборки инсталлятора в
installer
- Платформа:
.NET 10,net10.0-windows - UI:
WPF - Системная интеграция:
Windows Forms NotifyIconи Win32 interop - Solution:
AiteBar.slnс двумя проектами:AiteBarAiteBar.Tests
- Тестовый стек:
xUnitMicrosoft.NET.Test.Sdkcoverlet.collector
- Поставка:
dotnet publishInno Setup- сборка инсталлятора через
installer/Build-Installer.ps1
Текущая архитектурная практика:
- основная логика UI и системного поведения остается в
MainWindow, но часть обработчиков вынесена в partial-файлыMainWindow.*.cs - чистую расчетную или нормализующую логику лучше выносить в отдельные helper-классы
- для layout панели нужно использовать централизованную layout-математику, а не локальные правки контейнеров “по месту”
dotnet build .\AiteBar.sln -c ReleaseОсновной вариант:
dotnet test .\AiteBar.Tests\AiteBar.Tests.csproj -c ReleaseFallback для случаев, когда WPF/MSBuild временно ломает dotnet test на wpftmp/obj:
dotnet vstest .\AiteBar.Tests\bin\Release\net10.0-windows\AiteBar.Tests.dll.\installer\Build-Installer.ps1Важно:
- скрипт сам вызывает
dotnet publish, если не передан-SkipPublish - publish уходит в
artifacts\publish\win-x64 - installer уходит в
artifacts\installer
- Не придумывать новые стандарты поверх текущего проекта. Опираться на уже существующую структуру и стиль.
- При ответах о текущем состоянии реализации отвечать только по текущему коду. Не использовать
README,docs,CHANGELOGили ExecPlan как источник истины для фактического поведения, если пользователь явно не просит ответ по документации. - Перед таким ответом проверять конкретные файлы реализации (
AiteBar/*.cs, XAML, тесты или другие релевантные исходники) и указывать ссылки на файлы/строки, на которых основан вывод. - Если код не был проверен, прямо сказать об этом вместо уверенного ответа. Если документация расходится с кодом, считать источником истины код и отдельно отметить расхождение.
- Не рассинхронизировать версии приложения, publish и installer.
- Если логика может быть протестирована отдельно от UI, добавлять или обновлять unit-тесты.
- При добавлении или изменении встроенной утилиты синхронизировать связанные места:
UnifiedButtonService,Models,AppSettingsService,ActionService/UtilityRegistry, XAML настроек, локализацииResources/Strings*.resx, README/docs/functions и focused tests для non-UI логики.
- Не ломать минималистичный вид панели
MainWindow. - Не ломать плавную анимацию появления/скрытия панели.
- Смена стороны панели теперь поддерживается напрямую на рабочей панели через drag-and-drop за handle; при правках
MainWindowнужно сохранять этот сценарий и проверять, что после drop корректно сохраняются и край, и монитор. - Изменения layout панели вносить через централизованную layout-логику и расчетные helper-ы, а не случайными правками
WrapPanel/DockPanel/Margin. - При изменениях панели обязательно проверять все 4 стороны:
TopBottomLeftRight
- При изменениях контекстов проверять переключение, перенос кнопок между контекстами и поведение панели на коротком и длинном контексте.
SettingsWindowсейчас является компактной single-form разметкой для параметров одной кнопки, без фактическогоTabControl.- Не превращать
SettingsWindowв перегруженный мастер-настройщик приложения; общие параметры, hotkeys, контексты и порядок встроенных утилит должны оставаться вAppSettingsWindow. - Если возвращается вкладчатая структура
SettingsWindow, делать это как отдельное осознанное UI-изменение с проверкой размера окна и сценариев создания/редактирования кнопки.
- Если изменение затрагивает геометрию, отступы, размеры или позиционирование панели, проверять не только XAML, но и связанную кодовую логику в
MainWindow.xaml.cs,MainWindow.*.cspartial handlers и helper-ах расчета. - Не оставлять “временные” визуальные решения без проверки на всех ориентациях панели.
- Не ломать Quick Note как легкое single-note окно поверх текущей архитектуры
QuickNoteUtility,QuickNoteWindow,QuickNoteService,QuickNoteMarkdown,QuickNoteDocumentHelper,QuickNoteLayoutHelperиQuickNoteTheme. - При правках Quick Note сохранять сценарии: pin toggle удерживает окно открытым при потере фокуса, unpinned-режим закрывает окно при потере фокуса, размер и позиция запоминаются и clamp-ятся в рабочую область монитора.
- Не ломать Undo/Redo через
Ctrl+Z/Ctrl+Yи видимые команды окна. - Не ломать открытие URL обычным кликом, обработку conflict-copy, статус для длинной заметки при ограничении link highlighting и round-trip underline через Markdown-compatible
<u>...</u>. - Форматирование, которое доступно в toolbar, должно сохраняться после save/reload; если меняется Markdown serialization/parsing, добавлять focused unit-тесты.
- Не ломать Clipboard Manager как легкую runtime-history утилиту поверх
ClipboardManagerUtility,ClipboardManagerWindowиClipboardHistoryService. - При правках сохранять сценарии: подписка на
WM_CLIPBOARDUPDATE, копирование записи обратно в clipboard без немедленного дублирования, очистка истории, поиск/фильтрация, текстовые и image-записи. - Не увеличивать без явной причины лимиты истории и текста (
MaxEntries,MaxTextLength), чтобы не создавать скрытое потребление памяти и privacy-риск. - Clipboard history не должна становиться persistent storage без отдельного решения по privacy, настройкам очистки и документации пользователя.
- Собрать
Release:
dotnet build .\AiteBar.sln -c Release- Прогнать тесты:
dotnet test .\AiteBar.Tests\AiteBar.Tests.csproj -c Release- Если
dotnet testпадает из-за WPF/MSBuild temp-файлов (wpftmp,obj,*.g.cs), прогнать fallback:
dotnet vstest .\AiteBar.Tests\bin\Release\net10.0-windows\AiteBar.Tests.dll- Если менялся UI панели или настройки, вручную проверить:
- показ панели
- скрытие панели
- позиционирование панели
- все 4 стороны панели:
Top,Bottom,Left,Right - поведение контекстов
- hotkeys
- доступ к функциям из tray
- Если менялись версия, publish-логика, installer-логика или пути артефактов:
.\installer\Build-Installer.ps1После этого проверить, что актуальный инсталлятор действительно лежит в:
artifacts\installer
При расхождении между этим файлом и проектными файлами считать источниками правды сами проектные файлы:
- README.md — возможности, установка и release quality summary.
- CHANGELOG.md — история изменений и release notes.
- PLANS.md — шаблон и правила ExecPlan (использовать при крупных фичах и рефакторингах).
- ZEN_EDITOR_EXECPLAN.md — живой пример ExecPlan по Дзен-редактору.
- docs/technical-reference.md — стек, команды, CI/CD и техническая справка.
- docs/architecture.md — архитектура приложения и workflow.
- docs/functions.md — карта функций.
- docs/USER_MANUAL.md — пользовательское поведение.
- docs/AI_PROVIDERS.md — подключение и параметры AI-провайдеров.
- docs/UTILITIES.md — как устроены утилиты и процесс добавления новой.
- docs/creating-ai-utilities.md — гайдлайн AI-based утилит.
- docs/button-map.md — карта расположения preset-кнопок.
- docs/DESIGN.md — гайдлайн UI-дизайна, цвета, типографика и стили.
- docs/MARKETING_DESCRIPTION.md — маркетинговые описания и лендинг-тексты.
- docs/README.md — навигация по документации docs/.
- docs/SENTRY_SETUP.md — включение Sentry и приоритет конфигурации.
- SECURITY.md — политика безопасности и поддерживаемые версии.
- PRIVACY.md — политика конфиденциальности и обработка данных.
- THIRD_PARTY_NOTICES.md — сторонние компоненты и лицензии.
- LICENSE — лицензия проекта (MIT).
Не добавлять в AGENTS.md ссылки на файлы, которых нет в репозитории. Не фиксировать здесь быстро устаревающие числа вроде количества тестов или текущей версии без явной необходимости.
.github/workflows/build-test.ymlсобираетRelease, запускает тесты, публикует coverage summary и сохраняет coverage artifact для push/PR вmainиmaster..github/workflows/codeql.ymlзапускает CodeQL security-and-quality analysis для C#..github/dependabot.ymlобновляет NuGet и GitHub Actions зависимости.- Lock-файлы пакетов должны оставаться согласованными с проектами; не обновлять их случайно.
- Если добавляется новая non-UI логика, покрывать ее unit-тестами. UI-сценарии, которые трудно автоматизировать, описывать в ручной проверке.
- Версия release tag
vX.Y.Zдолжна совпадать с<Version>вAiteBar/AiteBar.csproj. - При изменении версии синхронизировать
AiteBar/AiteBar.csproj,AiteBar/AssemblyInfo.cs, installer metadata иCHANGELOG.md, если соответствующие файлы участвуют в релизе. .github/workflows/release.ymlсобирает installer, проверяет changelog section, требует один непустой installer artifact и публикуетSHA256SUMS.txt.- Code signing включается только при наличии GitHub Secrets
WINDOWS_SIGNING_CERT_BASE64иWINDOWS_SIGNING_CERT_PASSWORD; без них installer остается unsigned. - Built-in update check открывает GitHub Release page после URL validation. Auto-install не реализовывать без отдельного решения по signing и безопасному обновлению.
- Sentry отключен по умолчанию.
- Production/support включение:
AITEBAR_SENTRY_DSNилиSENTRY_DSN. - Тестовое включение возможно через
%APPDATA%\Codebdbd\Aite Bar\settings.json, как описано вdocs/SENTRY_SETUP.md. - Не включать отправку PII по умолчанию. Любые изменения telemetry/privacy должны быть отражены в
docs/USER_MANUAL.mdиdocs/SENTRY_SETUP.md.
- Повышать coverage постепенно, только после добавления тестов для реальной non-UI логики.
- Рассмотреть SonarQube или расширение текущих CodeQL rules/quality gates.
- Поддерживать существующий
.editorconfigи не расходиться с текущим стилем кода. - API documentation, встроенный auto-updater и usage analytics считать отдельными крупными задачами, требующими ExecPlan.
- Цветовая палитра: Использовать приглушенные темные тона (Background:
#1A1A1C, Panels:#252526). Избегать чрезмерного контраста. - Акценты: Основной акцентный цвет — профессиональный синий (
#007ACC). - Компоновка:
AppSettingsWindowдолжно оставаться компактным и разделенным на логические вкладки (Tabs);SettingsWindowдолжно оставаться компактной формой редактирования одной кнопки. - Отсутствие скролла: Основные интерфейсы должны вписываться в фиксированную высоту окна без вертикальной прокрутки всего окна. Локальный scroll внутри перегруженной вкладки допустим, если иначе окно становится слишком высоким.
- Закругления: Использовать
CornerRadius="4"для кнопок и полей ввода, и6-8для панелей.
SettingsWindow: Должно оставаться компактной single-form разметкой редактирования одной кнопки; не переносить в него общие настройки приложения.MainWindow: Панель должна сохранять минималистичный вид и плавную анимацию появления.