| 1 | # Миграция к архитектурной политике CascadeIDE |
| 2 | |
| 3 | **Связь:** [architecture-policy.md](architecture-policy.md). |
| 4 | **Подход:** strangler — по фазам, без остановки разработки. |
| 5 | |
| 6 | ## Стратегия: опора на целевой каркас (CDS · CCU · DAL · IDS) |
| 7 | |
| 8 | Геометрия **канал→композитор кабины (CDS)** ([ADR 0036](adr/0036-cds-channel-compositor-surface-pipeline.md)), **вычислительных блоков кабины (CCU)** ([ADR 0097](adr/0097-cockpit-compute-units-transport-to-channel-dto.md)), **DAL vs Application vs UI** ([ADR 0102](adr/0102-data-acquisition-layer-boundary-and-contract.md)) и **IDS** ([ADR 0079](adr/0079-ide-display-system-ids-overlay-pipeline.md)) уже **устоялась** как целевая линия: новые возможности смешиваем с нею, а не с параллельными локальными «мини-архитектурами» в главном окне. |
| 9 | |
| 10 | Иначе неизбежное **наполнение `MainWindowViewModel` новыми фичами** съест запас времени на приведение к этому каркасу. Поэтому: |
| 11 | |
| 12 | 1. **Держим активный упрощающий буфер** вокруг MW: последовательное сужение крупных partial-кластеров (MCP, `Presentation*` / `ShellState`, карта workspace и др.) через оркестраторы и политики в `Features/<домен>/` — см. ниже Wave 1 (MCP / UI clusters). |
| 13 | 2. **Новая логика по умолчанию** живёт в `Features/` по слоям DAL → Application/CCU-потребители → биндинг на VM; главный VM — **тонкий композитор** там, где уместно уже зафиксировано таблицей «Целевая карта срезов» и [ADR 0006](adr/0006-presentation-layers-and-feature-slices.md). |
| 14 | 3. **[ADR 0009](adr/0009-strangler-migration-and-exceptions.md)** остаётся в силе: полное стирание исторического монолита по дедлайну не обязательно — но без пункта 1 можно соблюдать strangler формально и при этом **не приблизиться к каркасу**, если главный узел только разрастается новыми фичами без выносов. |
| 15 | |
| 16 | ## Текущее состояние |
| 17 | |
| 18 | <!-- AUTO:MAIN-WINDOW-SLICE:SUMMARY:BEGIN --> |
| 19 | |
| 20 | `MainWindowViewModel` — **композитор окна**: конструктор, подписки, мост `IIdeMcpActions` → `IdeMcpCommandExecutor`, оркестрация решения/сборки/LSP/MCP. Объём **~5.2k строк** суммарно по partial-классу `MainWindowViewModel*.cs` (**~5.2k**) плюс диспетчер `IdeMcpCommandExecutor*.cs` и `Generated/IdeMcpCommandExecutor.Generated.g.cs` (**~0k**); счётчики — ориентир по состоянию репозитория (авто: 2026-07). Чат, Git, терминал, сборка, инструментирование и т.д. — в **`Features/*`** как дочерние VM; цель дальше — **сужать** главный VM по мере доработок (вынос в сервисы, план B). |
| 21 | |
| 22 | <!-- AUTO:MAIN-WINDOW-SLICE:SUMMARY:END --> |
| 23 | |
| 24 | ### Срез `MainWindowViewModel` (карта partial-файлов) |
| 25 | |
| 26 | Имена **по алфавиту** — для поиска; строки — `Measure-Object -Line` по `.cs` (пересчёт: `tools/Update-ArchitectureMigrationMainWindowSlice.ps1`). |
| 27 | |
| 28 | <!-- AUTO:MAIN-WINDOW-SLICE:MWVM-TABLE:BEGIN --> |
| 29 | |
| 30 | | Файл | Строк (≈) | Содержание | |
| 31 | |------|------------|------------| |
| 32 | | `MainWindowViewModel.AgentEnvironment.cs` | 121 | AEE: PFD Verify Epoch instrument, chat trace, epoch stale on write (ADR 0148 W3–W5). | |
| 33 | | `MainWindowViewModel.AgentHarness.cs` | 39 | Agent harness: auto-verify coalescing after .cs writes (ADR 0166 interim). | |
| 34 | | `MainWindowViewModel.AutonomousAgent.cs` | 113 | Автономный агент (Power). | |
| 35 | | `MainWindowViewModel.Capabilities.cs` | 23 | Реестр capabilities. | |
| 36 | | `MainWindowViewModel.CascadeChord.cs` | 107 | Аккордный слой ADR 0060: корень `cascade_chord` из hotkeys.toml (по умолчанию Ctrl+K), затем тот же хвост мелодии, что после `c:`. Однозначный обычный alias (например `so`) исполняется без Enter при отсутствии более длинного alias-префикса; параметрические (`wai:`, `els:`:…) — только по Enter или из палитры. При конфликте префиксов (`gs` vs `gsu`) — точный хвост или Enter. | |
| 37 | | `MainWindowViewModel.CockpitCommandLine.cs` | 24 | Cockpit Command Line на Forward host: `primary=intercom` — Skia в ChatPanel; `primary=editor` — оверлей `CockpitCommandLineOverlayView` (ADR 0120). | |
| 38 | | `MainWindowViewModel.CommandPalette.cs` | 166 | Палитра команд. | |
| 39 | | `MainWindowViewModel.CompactIdeLayout.cs` | 85 | Compact tier IDE-scan presentation (ADR 0171 §2.3): Forward center, PFD/Intercom right or bottom, MFD bottom. | |
| 40 | | `MainWindowViewModel.CorrespondenceShell.cs` | 24 | Страница Correspondence (CRS) в оболочке Mfd (ADR 0156). | |
| 41 | | `MainWindowViewModel.cs` | 376 | Главный композитор окна (partial-класс, несколько `MainWindowViewModel*.cs`). Карта файлов и ответственности — `docs/architecture-migration.md`, раздел «Срез MainWindowViewModel». | |
| 42 | | `MainWindowViewModel.CSharpLsp.cs` | 138 | Запуск/перезапуск C# LSP. | |
| 43 | | `MainWindowViewModel.CursorAcp.cs` | 36 | Путь Cursor ACP и предпочитаемая модель. | |
| 44 | | `MainWindowViewModel.DebugStackUi.cs` | 35 | Выбор кадра в панели «Стек» Mfd: подгрузка Locals для выбранного кадра (DAP). | |
| 45 | | `MainWindowViewModel.DockInstrumentSlots.cs` | 34 | Какой инструмент показан в слотах PFD/MFD главного окна — по `InstrumentPlacementRuntime` и `DisplaySettings` (в т.ч. `[display.instrument_routing]` и merge `workspace.toml`). Логика — `MainWindowDockedGridInstrumentSlots`. | |
| 46 | | `MainWindowViewModel.DocumentsDock.cs` | 29 | Документы / dock. | |
| 47 | | `MainWindowViewModel.EditorNavigation.cs` | 9 | Monaco editor navigation service wiring for MainWindow. | |
| 48 | | `MainWindowViewModel.EditorOllama.cs` | 30 | Состояние редактора, Markdown и выбора модели Ollama. | |
| 49 | | `MainWindowViewModel.EditorSession.cs` | 129 | Wave 2: `EditorWorkspaceViewModel` + прокси на MWVM для существующих привязок и MCP. | |
| 50 | | `MainWindowViewModel.Eicas.cs` | 17 | Канал EICAS / CAS — отдельно от полосы телеметрии контура работы (ADR 0021, вариант A). | |
| 51 | | `MainWindowViewModel.EnvironmentReadiness.cs` | 48 | Снимок «готовность окружения» (ADR 0023), отдельно от Workspace Health. | |
| 52 | | `MainWindowViewModel.FeatureCommandProxies.cs` | 66 | Wave 2: прокси RelayCommand на feature VMs (XAML, MCP, hotkeys без смены привязок). | |
| 53 | | `MainWindowViewModel.FeatureSessions.cs` | 13 | Wave 2 этап 5: application shell, debug, build session VMs. | |
| 54 | | `MainWindowViewModel.HybridIndex.cs` | 145 | Hybrid Codebase Index (HCI): status projection and UI commands for the HIS (MFD) page. | |
| 55 | | `MainWindowViewModel.HybridIndexSettings.cs` | 18 | Привязки окна настроек к `HybridIndex` (ADR 0106). | |
| 56 | | `MainWindowViewModel.IdeHealth.cs` | 95 | Связка с Workspace Health. | |
| 57 | | `MainWindowViewModel.IdeMcpHostLifecycle.cs` | 20 | Жизненный цикл IDE MCP-хоста: `ide_ping`, перезапуск внешних MCP и stdio-сессии Cursor ACP. | |
| 58 | | `MainWindowViewModel.IntercomAttachAffordances.cs` | 69 | Intercom attach affordances: selection hotkey, drag-to-composer (ADR 0128). | |
| 59 | | `MainWindowViewModel.IntercomAttachmentReveal.cs` | 44 | Reveal вложения Intercom из чата: загрузка решения при необходимости, затем навигация в редактор (ADR 0128). | |
| 60 | | `MainWindowViewModel.IntercomFeedMetrics.cs` | 26 | `[intercom] feed_metrics` — плотность Skia-ленты (comfortable / compact). | |
| 61 | | `MainWindowViewModel.IntercomTransport.cs` | 34 | Координатор team transport Intercom: подключение SSE/HTTP ingest и делегирование в ChatPanel. | |
| 62 | | `MainWindowViewModel.IntercomTransportSettings.cs` | 35 | Привязки `[intercom.transport]` и Connect/Disconnect (ADR 0144). | |
| 63 | | `MainWindowViewModel.LaunchProfiles.cs` | 90 | Селектор launch profile, импорт `launchSettings.json` (ADR 0090). | |
| 64 | | `MainWindowViewModel.LayoutNotifications.cs` | 17 | Инвалидация производных высот `MainGrid` без длинных цепочек `NotifyPropertyChangedFor` в ShellState. | |
| 65 | | `MainWindowViewModel.MagicLink.cs` | 54 | Magic link: pipe-сервер single-instance и обработка URI. | |
| 66 | | `MainWindowViewModel.MarkdownExport.cs` | 31 | Экспорт Markdown. | |
| 67 | | `MainWindowViewModel.MarkdownLsp.cs` | 103 | Запуск/перезапуск Markdown LSP. | |
| 68 | | `MainWindowViewModel.McpBreakpointReveal.cs` | 49 | MCP: постановка брейкпоинта с загрузкой решения и показом строки в редакторе. | |
| 69 | | `MainWindowViewModel.McpHostBridge.cs` | 54 | Внутренний мост для `MainWindowIdeMcpHost` (Wave 2 Big Bang). | |
| 70 | | `MainWindowViewModel.MfdShell.cs` | 62 | Оболочка Mfd: одна активная страница; навигация — команды и палитра. Якорь на экране задаётся presentation (зона Mfd в main и/или окно-хост). | |
| 71 | | `MainWindowViewModel.PfdBackgroundStatus.cs` | 235 | Компактная полоса статуса над PFD/Forward: Verify Epoch (AEE W3) и solution warm-up (ADR 0141). | |
| 72 | | `MainWindowViewModel.Presentation.cs` | 287 | Вычисляемые свойства разметки, Workspace Health и видимости панелей (режимы UI). | |
| 73 | | `MainWindowViewModel.PresentationLayout.CockpitSurfaceSnapshot.cs` | 8 | Сборка `CockpitSurfaceState` главного окна (`Build`). | |
| 74 | | `MainWindowViewModel.PresentationLayout.cs` | 113 | ADR 0017: строка `presentation` и второй `TopLevel` — `MfdHostWindow` с полным вторичным контуром (п. 8). | |
| 75 | | `MainWindowViewModel.PresentationLayout.HostShell.cs` | 47 | События «окно-хост открыло полный контур» — скрытие колонок в main (`PresentationLayout`). | |
| 76 | | `MainWindowViewModel.PresentationLayout.HostWindowBounds.cs` | 84 | Персистенция геометрии окон-хостов пресета `presentation` (ADR 0017). | |
| 77 | | `MainWindowViewModel.PresentationLayoutAuthority.cs` | 14 | Запись intent видимости панелей (семантика «хочу»); фактическая поверхность — `MainWindowShellSurfaceCompositor`. | |
| 78 | | `MainWindowViewModel.PresentationTier.cs` | 75 | Presentation tier compact vs cockpit (ADR 0171). | |
| 79 | | `MainWindowViewModel.PrimaryWorkSurface.cs` | 77 | Переключатель лобового якоря Intercom / Editor (ADR 0120). | |
| 80 | | `MainWindowViewModel.SettingsReactive.cs` | 228 | Реакции на изменение полей настроек и ключей API: диск, автономный агент, панели. | |
| 81 | | `MainWindowViewModel.ShellConstruction.cs` | 272 | Конструктор и композиция shell: дочерние VM, шина, DAP/HCI, топология presentation (ADR 0017). | |
| 82 | | `MainWindowViewModel.ShellSession.cs` | 192 | Wave 2 этап 3: `ShellChromeViewModel` + прокси на MWVM для привязок и presentation. | |
| 83 | | `MainWindowViewModel.ShellState.AiProviders.cs` | 58 | Часть `ShellState`: режим ИИ и облачные ключи привязаны к нижнему приложению/чату. | |
| 84 | | `MainWindowViewModel.ShellState.AutonomousAgentStripe.cs` | 64 | Часть `ShellState`: полоса/карточки автономной задачи агента, безопасности, LOC и сводки тестов для IDE Health. | |
| 85 | | `MainWindowViewModel.ShellState.ChatAndSessionConfig.cs` | 34 | Часть `ShellState`: ввод чата и конфиг MCP/ACP для автономной сессии. | |
| 86 | | `MainWindowViewModel.ShellState.cs` | 12 | Состояние раскладки главного окна: три зоны внимания в `MainGrid` (PFD · Forward · MFD), см. ADR 0021 и `docs/ui-ux/cascade-ide-ui-layout-v1.md`. Терминал, сборка, Git и пр. — во вторичном контуре колонки MFD (`MfdShellView` / `MfdShellPageStack`); отдельной строки «нижней панели» на всю ширину под сеткой нет. Режим ИИ и облачные ключи — `MainWindowViewModel.ShellState.AiProviders.cs`; чат и MCP/ACP — `MainWindowViewModel.ShellState.ChatAndSessionConfig.cs`; полоса агента / тесты для IDE Health — `MainWindowViewModel.ShellState.AutonomousAgentStripe.cs`; регион MFD/PFD и страницы контура — `ShellState.RegionAndContour.cs`; режим/UI-сессия и полосы — `ShellState.UiSessionChrome.cs`; модель/Kroki — `ShellState.ModelPullMarkdown.cs`. | |
| 87 | | `MainWindowViewModel.ShellState.ModelPullMarkdown.cs` | 20 | Часть `MainWindowViewModel`: pull модели и превью Markdown / Kroki. | |
| 88 | | `MainWindowViewModel.SolutionBuild.cs` | 125 | Загрузка решения, Ollama install; сборка — `MainWindowBuildSessionViewModel`. | |
| 89 | | `MainWindowViewModel.SolutionExplorer.cs` | 112 | Solution Explorer: фильтр, compact, track active, индекс файлов (ADR 0167). | |
| 90 | | `MainWindowViewModel.SolutionWarmup.cs` | 61 | Solution warm-up: оркестратор фаз загрузки решения, лампа статуса и подписка на DataBus (ADR 0141). | |
| 91 | | `MainWindowViewModel.StartupProject.cs` | 140 | Стартовый проект. | |
| 92 | | `MainWindowViewModel.UiGitWorkspace.cs` | 126 | Git + workspace UI. | |
| 93 | | `MainWindowViewModel.ViewBridge.cs` | 68 | Колбэки и провайдеры, которые View подставляет в главный VM (диалоги, UI automation). | |
| 94 | | `MainWindowViewModel.WebAiPortal.cs` | 29 | Страница MFD «веб-портал» (ADR 0108): URL, результат последнего вызова моста, `WebAiPortalCommandBridge`. | |
| 95 | | `MainWindowViewModel.WorkspaceNavigationMap.Bridge.cs` | 50 | Мост к `WorkspaceNavigationMapViewModel` (ADR 0039): host + lifecycle, без прокси-привязок. | |
| 96 | | `MainWindowViewModel.WorkspaceSplitters.cs` | 23 | Сплиттеры рабочей области (MainGrid, обозреватель решения, Git и т.д.): режим «взлёт» — блокировка перетаскивания. | |
| 97 | |
| 98 | <!-- AUTO:MAIN-WINDOW-SLICE:MWVM-TABLE:END --> |
| 99 | |
| 100 | ### `IdeMcpCommandExecutor` (диспетчер MCP → `IIdeMcpActions`) |
| 101 | |
| 102 | <!-- AUTO:MAIN-WINDOW-SLICE:EXEC-TABLE:BEGIN --> |
| 103 | |
| 104 | | Файл | Строк (≈) | Содержание | |
| 105 | |------|------------|------------| |
| 106 | |
| 107 | <!-- AUTO:MAIN-WINDOW-SLICE:EXEC-TABLE:END --> |
| 108 | |
| 109 | **Техдолг по главному VM (не блокирует развитие):** крупные куски MCP по-прежнему рядом с VM (`IdeMcpActions.*`); дальнейший вынос — по мере изменений. **Странглер-фасад и уведомления UI:** связка списка `HybridIndexDependentPresentationNames` и `[NotifyPropertyChangedFor]` у `_hybridIndexLast` закреплена тестом `HybridIndexPresentationNotificationsConsistencyTests`; пачечные вызовы `OnPropertyChanged` для Workspace Health IDE, док-инструментов в слотах и глифов брейкпоинтов сведены к статическим массивам имён и циклу в partial-файлах главного VM. **План B по примитивам MCP для текущего объёма закрыт:** координаты/пути редактора (`EditorTextCoordinateUtilities`), разбор JSON панели отладки (`McpDebugPayloadParsing`), чтение полей args MCP (`McpCommandJsonArgs` в `Services/`) — вне `ViewModels/`. **Готовность окружения ([ADR 0023](adr/0023-environment-readiness-glance.md)):** полный список строк — `EnvironmentReadinessSnapshotBuilder.BuildAllRowsAsync` в `Features/EnvironmentReadiness/Application/` (DAL/канал CCU, ADR 0102); обновление страницы — `EnvironmentReadinessRefreshOrchestrator` (канал → compositor на UI), главный VM вызывает только оркестратор. **Cursor ACP (ADR 0102):** разрешение пути к `cursor-agent`, stdio-процесс и fs в пределах workspace — `Features/CursorAcp/DataAcquisition/`; сессия ACP и `IAcpClient` — `Services/CursorAcp/CursorAcpChatConnection`. **Настройки (ADR 0102):** пути к `%LocalAppData%\CascadeIDE\`, hotkeys и чтение внешнего JSON MCP — `Features/Settings/DataAcquisition/` (`UserSettingsPaths`, `TextFileReadWrite`, `HotkeyTomlLoader`); сериализация и merge display — `Services/SettingsService`. **Workspace (ADR 0102):** загрузка .sln/.csproj, дерево проекта, поиск .sln у файла, папка-workspace, разрешение `workspace_path` для отладки — `Features/Workspace/DataAcquisition/`; обход `SolutionItem` для MCP/JSON — `Features/Workspace/Application/McpSolutionTree`. |
| 110 | |
| 111 | ## Целевая карта срезов |
| 112 | |
| 113 | | Срез | Что сейчас (где живёт) | Целевое размещение | Примечание | |
| 114 | |------|------------------------|-------------------|------------| |
| 115 | | **Git** | Оркестрация и MCP на `MainWindowViewModel`; вкладка — `GitPanelViewModel` | `Features/Git/GitPanelViewModel` + `GitStatusRow` в `Models/` | `MainWindow` передаёт workspace, `LoadSolution`, MCP commit/push; телеметрия полосы частично в `UiGitWorkspace` / `ShellState` | |
| 116 | | **Инфраструктура git** | `Process` + `git` внутри VM | `Services/IGitCommandRunner` / `GitCommandRunner` | Общий для панели, полосы телеметрии, MCP `GitCommit`/`GitStatus` | |
| 117 | | **Сборка / вывод** | Текст вывода в `BuildOutputPanelViewModel`; оркестрация сборки в `MainWindowViewModel` | `Features/Build/BuildOutputPanelViewModel` | Вкладка Build output | |
| 118 | | **Терминал** | `TerminalPanelViewModel` | `Features/Terminal/TerminalPanelViewModel` | Вкладка Terminal (телеметрия Power на той же вкладке — пока на главном VM) | |
| 119 | | **Чат** | История, ввод, `SendChat`, стриминг в `ChatPanelViewModel` | `Features/Chat/ChatPanelViewModel` + `ChatMessageViewModel` | Правая колонка; провайдер/модель и контекст редактора — замыкания на `MainWindowViewModel` | |
| 120 | | **Инструментирование** | События, таймлайн, агент, тесты, MCP-отладка | `Features/Instrumentation/InstrumentationPanelViewModel` | В разметке — `DataContext="{Binding InstrumentationPanel}"` + `x:DataType`; главный VM не дублирует поля | |
| 121 | | **Решение и документы** | `SolutionRoots`, `OpenDocuments`, dock | **`SolutionWorkspaceViewModel`** + **`DocumentsWorkspaceViewModel`** (`Features/Workspace`, `Features/Documents`); MWVM — композитор и `SolutionLoadSessionApplyProjection.IHost` | Ядро сессии IDE | |
| 122 | | **MCP-мост** | `IIdeMcpActions` на `MainWindowViewModel` | Остаётся на главном VM; делегирование в сервисы/дочерние VM | Контракт стабилен | |
| 123 | |
| 124 | ## Фазы |
| 125 | |
| 126 | ### Фаза 0 — инфраструктура (**сделано**) |
| 127 | |
| 128 | - **`IGitCommandRunner` + `GitCommandRunner`:** единая точка запуска `git` по рабочему каталогу. `MainWindowViewModel` использует runner для телеметрии и MCP (`RunGitCommandAsync`). |
| 129 | |
| 130 | ### Фаза 1 — Git-панель (**сделано**) |
| 131 | |
| 132 | - Состояние и команды вкладки **Git** — в **`Features/Git/GitPanelViewModel`**. Зависимости: `IGitCommandRunner`, `GetWorkspacePath`, `IIdeMcpActions`, `LoadSolution`, `RefreshGitSummaryAsync`. |
| 133 | - `MainWindowViewModel`: свойство **`GitPanel`**, видимость вкладки (`IsGitPanelVisible`) и настройки остаются на главном VM; при смене `SolutionPath` вызываются `GitPanel.RefreshRepositoryFlagAsync()` и при открытой вкладке — `RefreshGitPanelAsync()`. |
| 134 | - **Страница Git в MFD** (`MfdShellPageStack`): контент страницы с `DataContext="{Binding GitPanel}"` (нет отдельного `BottomPanelView` во Flight). |
| 135 | |
| 136 | ### Фаза 2 — Build output и Terminal (**сделано**) |
| 137 | |
| 138 | - **`Features/Build/BuildOutputPanelViewModel`** — текст вывода сборки и связанных операций (`BuildOutput`). Видимость вкладки и команды сборки остаются в `MainWindowViewModel`; он по-прежнему заполняет `BuildOutputPanel.BuildOutput` (как для Git — оркестрация снаружи). |
| 139 | - **`Features/Terminal/TerminalPanelViewModel`** — `TerminalControlModel` (AvaloniaTerminal), `EnsureSessionStarted()`, `AppendOutput()` для ACP; ConPTY/redirected через `IntegratedTerminalSessionHost`. |
| 140 | - **Страницы Terminal и Build output в колонке MFD** (`MfdShellPageStack`): `DataContext="{Binding TerminalPanel}"` и `DataContext="{Binding BuildOutputPanel}"`; телеметрия Power на странице Terminal остаётся на `MainWindowViewModel`. *(В старой топологии использовались привязки в `BottomPanelView`.)* |
| 141 | |
| 142 | ### Фаза 3 — Chat (**сделано**) |
| 143 | |
| 144 | - **`Features/Chat/ChatPanelViewModel`** — `ChatMessages`, `ChatInput`, `IsChatLoading`, `SendChatCommand`, стриминг через `AiProviderManager`. В конструктор передаются замыкания: активный провайдер, модель Ollama, минимальный контекст, `CurrentFilePath`, `EditorText`. |
| 145 | - **`MainWindowViewModel`:** свойство **`ChatPanel`**, `IsChatPanelExpanded`, выбор провайдера/модели и быстрые команды, подставляющие текст в `ChatPanel.ChatInput`. |
| 146 | - **`ChatPanelView`:** блоки сообщений и ввода с `DataContext="{Binding ChatPanel}"` (свёртка панели и пр. — по-прежнему на главном VM). |
| 147 | |
| 148 | ### Фаза 4 — Instrumentation (**сделано**) |
| 149 | |
| 150 | - **`Features/Instrumentation/InstrumentationPanelViewModel`** — `AgentToolCalls`, `AgentTraceSteps`, `EventTimeline`, `PowerTaskQueueItems`, `TestResultsOutput`, стек/переменные MCP-отладки; `AppendAgentTraceStep` (потокобезопасно). |
| 151 | - **`ViewModels/`** — `DebugStackFrameViewModel`, `DebugVariableViewModel`, `AgentTraceStepViewModel` вынесены в отдельные файлы (типы для `x:DataType` без изменений). |
| 152 | - **`MainWindowViewModel`:** свойство **`InstrumentationPanel`**, подписка на `IsDebugPanelVisible` для строк телеметрии полосы; `IIdeMcpActions.ShowDebugState` и `RunTests` пишут в `InstrumentationPanel`. Дочерние виды биндят блоки к `InstrumentationPanel`, без прокси на главном VM. |
| 153 | |
| 154 | ### Фаза 5 — события, UI-поток, нагрузка (**основное сделано**) |
| 155 | |
| 156 | Цель и порядок шагов зафиксированы в ADR: [0004](adr/0004-ui-thread-marshaling.md) (маршалинг UI), [0007](adr/0007-signals-coupling-and-ui-backpressure.md) (сигналы, батчинг), [0005](adr/0005-defer-dynamic-plugins-mef.md) (отложенные идеи расширяемости). Краткий навигатор — [architecture-policy.md](architecture-policy.md). Кратко: |
| 157 | |
| 158 | <a id="arch-migration-phase5-p1"></a> |
| 159 | 1. Явные границы между источниками сигналов и подписчиками (без лишней связности между подсистемами). |
| 160 | <a id="arch-migration-phase5-p2"></a> |
| 161 | 2. Единая политика маршалинга на UI-поток для обновлений после фона. |
| 162 | <a id="arch-migration-phase5-p3"></a> |
| 163 | 3. Точечно — очереди/батчинг там, где поток данных давит на UI. |
| 164 | |
| 165 | **Сделано по [п. 2](#arch-migration-phase5-p2):** контракт **`IUiScheduler`**, реализация **`AvaloniaUiScheduler`** (единственное место с прямым `Dispatcher.UIThread`), доступ из кода через **`UiScheduler.Default`**. Вызовы переведены с размазанного `Dispatcher.UIThread` на `UiScheduler.Default`; для удобства — **`GlobalUsings.cs`** с `global using CascadeIDE.Services`. |
| 166 | |
| 167 | **Сделано по [п. 3](#arch-migration-phase5-p3) (диагностики):** **`WorkspaceDiagnosticsCoordinator`** — debounce для Roslyn без LSP; **`CSharpLspDiagnosticsHost`** — коалесcing **`DiagnosticsChanged`** (один `Post` на серию `textDocument/publishDiagnostics`, по тому же принципу, что **`BuildOutputPanelViewModel.Append`**). |
| 168 | |
| 169 | **Опционально позже по фазе 5:** при профилировании — ещё батчинг на стороне подписчиков Problems; шина событий / слабее связность ([п. 1](#arch-migration-phase5-p1)) — только если вырастет число кросс-подсистемных подписок. |
| 170 | |
| 171 | **Сделано по MCP и UI-потоку (дыра закрыта):** единый вход `IIdeMcpActions.ExecuteCommandAsync` в `MainWindowViewModel` маршалит выполнение на UI через `IUiScheduler.InvokeAsync(Func<Task<string>>)`; добавлен перегруз `InvokeAsync<T>(Func<Task<T>>)` в `IUiScheduler` / `AvaloniaUiScheduler`. Так MCP stdio и автономный агент не вызывают хендлеры `IdeMcpCommandExecutor` с фонового потока. Долгие операции по-прежнему не блокируют UI: внутри `IIdeMcpActions` используются `ConfigureAwait(false)`, `Task.Run`, `Post` на панели вывода и т.д. |
| 172 | |
| 173 | ### План: связность `MainWindowViewModel` / MCP (не фаза 5, отдельная дорожка) |
| 174 | |
| 175 | | Шаг | Смысл | |
| 176 | |-----|--------| |
| 177 | | **A — сделано** | Один канал маршалинга MCP → UI (`ExecuteCommandAsync` + `InvokeAsync<Task<string>>`), документация на входе executor. | |
| 178 | | **B — примитивы (текущий объём закрыт)** | Разбор аргументов JSON и вспомогательная логика без UI — в `Services/` (`EditorTextCoordinateUtilities`, `McpDebugPayloadParsing`, `McpCommandJsonArgs`); `IdeMcpCommandExecutor` остаётся диспетчером к `IIdeMcpActions`. | |
| 179 | | **B — дальше по мере роста** | Новые фичи по возможности — в сервисы с узким интерфейсом; VM — оркестратор и `IIdeMcpActions`, без раздувания «командными» методами. | |
| 180 | |
| 181 | **Не блокирует продукт:** выделение **`SolutionWorkspaceViewModel`**, MEF/плагины, опциональный дополнительный батчинг Problems — см. политику и таблицу срезов выше. |
| 182 | |
| 183 | **Сделано:** коалесcing обновлений **`BuildOutput`** в **`BuildOutputPanelViewModel.Append`** (один `Post` на серию вызовов; `Set`/`Clear`/`FlushPending` инвалидируют отложенный flush); после **`BuildSolutionAsync`** вызывается **`FlushPending`**, чтобы текст и флаг сборки были согласованы до чтения MCP. |
| 184 | |
| 185 | **Не в этой фазе:** MEF и загрузка плагинов из каталога — зафиксировано как отложенная идея в политике. |
| 186 | |
| 187 | ## Feature archetype v1 (DoD новой фичи) |
| 188 | |
| 189 | Чеклист «куда класть код» и шаблон каталогов — **[design/feature-archetype-v1.md](design/feature-archetype-v1.md)**. IDE chrome tokens — **[design/ide-chrome-tokens-v1.md](design/ide-chrome-tokens-v1.md)**. Цель: развитие в том же ритме, что CDS/CCU/DAL/IDS, без роста MWVM по умолчанию. |
| 190 | |
| 191 | ## Правила на время миграции |
| 192 | |
| 193 | 1. Новый код фич — **в срезе** `Features/<Имя>/`, не в конец `MainWindowViewModel`. См. [feature-archetype-v1.md](design/feature-archetype-v1.md). Панельный VM вешаем на UI через **`DataContext="{Binding ИмяПанели}"`** (и при compiled bindings — **`x:DataType`** на том же элементе), а не через десятки прокси-свойств на главном VM. |
| 194 | 2. Повторное использование **git** — только через `IGitCommandRunner` (или обёртки), не копировать `Process`. |
| 195 | 3. Изменения в `MainWindowViewModel` по старым фичам — по возможности сопровождать **микро-выносом** в сервис/панельный VM. |
| 196 | 4. Добыча внешних данных (fs/process/json/toml/wire) — в **Data Acquisition Layer** (`Features/<Feature>/DataAcquisition`), а не в `Cockpit/ComputingUnits/*` (см. ADR 0102). |
| 197 | 5. Крупную бизнес-логику в `MainWindowViewModel` не наращивать: сначала оркестратор/политика в `Features/<>` с узким контрактом; MV — только проверки контекста окна, вызов и обновление UI/шины (см. раздел «Стратегия: опора на целевой каркас» выше). |
| 198 | |
| 199 | ## Wave 1: MCP thinning (практический срез) |
| 200 | |
| 201 | Цель волны: уменьшить плотность логики в `MainWindowViewModel.IdeMcpActions.*`, сохранив `MainWindowViewModel` как orchestration-слой. |
| 202 | |
| 203 | - Вынести из `IdeMcpActions.*` подготовку payload/парсинг/валидацию в feature-application сервисы с узкими интерфейсами. |
| 204 | - Оставить в `MainWindowViewModel` только: |
| 205 | - проверку preconditions контекста окна; |
| 206 | - вызов соответствующего application-сервиса; |
| 207 | - публикацию DataBus/UI обновлений. |
| 208 | - Порядок первой волны: `IdeMcpActions.Editor` -> `IdeMcpActions.Navigation` -> `IdeMcpActions.BuildTest`. |
| 209 | - Первый срез выполнен: JSON для `get_open_document_text` (поиск вкладки по пути через `IdeMcpEditorOrchestrator.BuildGetOpenDocumentTextResponse`), якорь control-flow для `get_code_navigation_context` (`IdeMcpNavigationOrchestrator.ResolveControlFlowLineColumn`), payload `get_solution_files` (`IdeMcpBuildTestOrchestrator.BuildSolutionFilesJson`). |
| 210 | - Второй срез: `HybridIndexScopeResolver` в `Features/HybridIndex/Application/` и `IdeMcpHybridIndexScope` для MCP `codebase_index_*` (`TryResolveForCodebaseIndexCommand` — без дубля логики в VM); MCP agent-notes через `IdeMcpAgentNotesOrchestrator`; `ResolveHybridIndexScope` в VM — делегирует ресолверу. Ошибки HCI и ping/rebuild хоста вынесены в оркестраторы (**v1.38**); дальнейший вынос build/test/UI — точечно при росте API. |
| 211 | - Третий срез: `Services.IdeMcpSolutionPathAvailability.IsRunnableSolutionFile` для MCP build/test/code-cleanup (I/O вне статического оркестратора, CASCOPE031); мутации UI тестов — `IdeMcpBuildTestOrchestrator.IdeMcpTestRunInstrumentationMutation`. |
| 212 | - Четвёртый срез: единый контур **`BuildStateChanged` → DataBus → `RebuildIdeHealth`** (ADR 0099): локальная сборка решения и MCP code cleanup не шлют «сырой» `_ideDataBus.Publish` без пересборки полосы; MCP-пути после `ConfigureAwait(false)` используют `PublishIdeBuildStateOnUiAsync`. |
| 213 | - Пятый срез: MCP git целиком на **`IdeMcpGitWorkspaceSession`** (`Features/IdeMcp/Application/`), VM — только workspace + `RefreshGitSummaryAsync`; список команд preflight-fix — приватная константа в сессии (CASCOPE030: не статическое поле в оркестраторе). |
| 214 | - Шестой срез: **`IdeMcpIdeStateUiCapture`** + `BuildIdeStatePayload(capture, diagnostics)`; `get_ide_state` — diagnostics вне UI, снимок UI одним `CaptureIdeMcpIdeStateUi` (включая CDS через `BuildCockpitSurfaceSnapshot`). |
| 215 | - Седьмой срез: **`IdeMcpDapSnapshotUiPlan`** / `IdeMcpDebugOrchestrator.BuildDapSnapshotUiPlan` для `ApplyDapDebugSnapshotToUi` (без `File.Exists` в Application, CASCOPE031); **`get_debug_snapshot`** — сериализация без очереди на UI (`GetSnapshot` под lock). |
| 216 | |
| 217 | ## Wave 1: UI clusters thinning |
| 218 | |
| 219 | Цель волны: сократить связность крупных partial-кластеров `MainWindowViewModel` без big-bang. |
| 220 | |
| 221 | - Кластер `Presentation*`: |
| 222 | - удерживать вычисления раскладки/видимости в compositor/policy-сервисах; |
| 223 | - на VM оставить свойства-проекции и orchestration вызовы. |
| 224 | - первый срез (**v1.40**): **`MainWindowPresentationSurfaceProjection`** (`Features/Shell/Application`) — заголовок окна, mount-style/топология, контур MFD, телеметрия-подписи, безопасность агента, mount-контекст IDE Health; плейсхолдеры риска/результата и дефолты в **ShellState.AutonomousAgentStripe** через константу проекции. |
| 225 | - второй срез (**v1.40b**): **`IdeHealthStripPresentationProjection`** — строки полосы IDE Health (build/tests/debug line + cockpit-short) из **`IdeHealthInputSnapshot?`**; геттеры **`MainWindowViewModel.Presentation`** только проксируют последний снимок. |
| 226 | - третий срез (**v1.40c**): кластер **`PresentationLayout`** разнесён на partial: топология/MainGrid (**`PresentationLayout.cs`**), **`PresentationLayout.HostShell`**, **`PresentationLayout.HostWindowBounds`**, **`PresentationLayout.CockpitSurfaceSnapshot`** (CDS-сборка без изменения логики). |
| 227 | - четвёртый срез (**v1.40d**): **`MainWindowPresentationCapabilitiesProjection`** — булевы цепочки и подписи из **`UiModeCapabilities`** (IDE Health strip / EICAS chrome / instrumentation / risk-result карточки / Skia overlay / safety ordinal / LOC-бейдж); тесты **`MainWindowPresentationCapabilitiesProjectionTests`**. |
| 228 | - Кластер `ShellState`: |
| 229 | - состояния панелей и режимов — в отдельные state-модули по доменам, не в один monolith-файл. |
| 230 | - четвёртый срез: **`MainWindowViewModel.ShellState.AiProviders.cs`** — режим ИИ (`AiMode`, облачный провайдер, вычисляемые флаги выбора) и поля API-ключей; геометрия регионов и видимость страниц MFD после v1.39 — **`ShellState.RegionAndContour`**. |
| 231 | - пятый срез: **`MainWindowViewModel.ShellState.ChatAndSessionConfig.cs`** — клавиша отправки чата, thinking/минимальный контекст, JSON внешних MCP, `AcpAutoInjectIdeMcp`. |
| 232 | - шестой срез: **`MainWindowViewModel.ShellState.AutonomousAgentStripe.cs`** — активная задача агента, риск/результат/шаг, `SafetyLevel`, LOC-бейдж, сводка/бейдж тестов для полосы IDE Health. |
| 233 | - седьмой срез (**v1.39**): enum **`CascadeIDE.Models.Shell.CommandPaletteHost`** и partial **`ShellState.RegionAndContour`** / **`ShellState.UiSessionChrome`** / **`ShellState.ModelPullMarkdown`**; «базовый» **`ShellState.cs`** сведён к краткой сводке + привязкам текстов вторичных групп редакторов. |
| 234 | - Кластер `WorkspaceNavigationMap`: |
| 235 | - graph/data трансформации — в сервисы/CCU; |
| 236 | - в VM оставить binding-state и команды поверхности. |
| 237 | - Первый срез (карта PFD): **`CodeNavigationMapPresentationProjection`** + статические `CodeNavigationMapSettings.ViewWantsList` / `ViewWantsGraph`; биндинги list/graph/бейдж/has-related в `MainWindowViewModel.WorkspaceNavigationMap` делегируют в проекцию. |
| 238 | - Второй срез: **`WorkspaceNavigationMapContextJsonBuilder`** (ветвление related / subgraph / control-flow JSON внутри фонового refresh) и **`CodeNavigationMapViewportPolicy`** (пороги ширины viewport мини-карты); тесты `WorkspaceNavigationMapContextAndViewportTests`. |
| 239 | - Третий срез: **`WorkspaceNavigationMapRefreshComposer`** — разбор JSON refresh, композиция сцены + trace-flow, related-строки; **снимок CDS для control-flow** собирается на **UI-потоке** вместе с контекстом refresh и передаётся в композитор как `CockpitSurfaceState` (без чтения VM с пула); тесты `WorkspaceNavigationMapRefreshComposerTests`. |
| 240 | - Четвёртый срез (**v1.40e**): partial **`MainWindowViewModel.WorkspaceNavigationMap.Refresh`** — debounce、`RunWorkspaceNavigationMapRefreshAsync` и viewport width; файл привязок/команд карты (**`WorkspaceNavigationMap.cs`**) укорочен до состояния и проекций. |
| 241 | - пятый срез (**v1.40f**): **`MainWindowPresentationSurfaceProjection`** — видимость сплита main grid (`IsMainGridSplitColumnVisible`), флаги Skia-mount IDE Health (колонка / окно-хост), **`ResolveInstrumentMountStyleForSlot`**; отдельно **`MainWindowPresentationDapProjection`** для паузы/«running» DAP; геттеры **`MainWindowViewModel.Presentation`** только делегируют; тесты **`MainWindowPresentationDapProjectionTests`** и доп. кейсы в **`MainWindowPresentationSurfaceProjectionTests`**. |
| 242 | - шестой срез (**v1.40g**): **`IMainWindowHostSurfaceInput`** (`Cockpit/Composition/HostSurface`) — **`MainWindowHostSurfaceProjection`** принимает контракт вместо ссылки на **`MainWindowViewModel`**; реализация на VM через partial; тест **`MainWindowHostSurfaceProjectionTests`**. |
| 243 | - Кластер **Solution / Build / Startup / UiMode** (завершение Wave 1 UI, **v1.45–v1.48**): |
| 244 | - **`StartupProjectRefreshProjection`** — восстановление стартового `.csproj` после `LoadSolution`; **`MainWindowViewModel.StartupProject`** — делегирование. |
| 245 | - **`SolutionLoadUiApplyProjection`** — первая страница MFD после загрузки решения; **`MainWindowViewModel.SolutionBuild`** (`LoadSolutionAsync`). |
| 246 | - **`MainWindowBuildSolutionPrepProjection`** — `CanBuild` / prep заголовка и страницы Build; сборка по-прежнему через **`DotnetSolutionChunkedBuildOrchestrator`**. |
| 247 | - **`UiModeLayoutApplyProjection`** — план раскладки + persist workspace; **`ApplyUiModeLayout`** в **`UiGitWorkspace`**. |
| 248 | |
| 249 | ### Wave 1 — статус (текущий объём **закрыт**) |
| 250 | |
| 251 | Фазы **0–5** и Wave 1 (**MCP thinning** + **UI clusters thinning** по плану v1.15–v1.48) считаются **выполненными** для зафиксированного scope strangler: главный VM остаётся композитором (подписки, дочерние VM, `IdeMcp` property), но крупные кластеры вынесены в `Features/*/Application` оркестраторами/проекциями. |
| 252 | |
| 253 | ### Wave 2 — Big Bang MCP (v1.53, этап 1) |
| 254 | |
| 255 | **Цель:** убрать реализацию `IIdeMcpActions` с `MainWindowViewModel` — только композиция и `public IIdeMcpActions IdeMcp => _ideMcpHost`. |
| 256 | |
| 257 | **Сделано (этап 1):** |
| 258 | |
| 259 | - **`MainWindowIdeMcpHost`** (`Features/IdeMcp/Application/`, partial’ы бывших `MainWindowViewModel.IdeMcpActions.*`) — единственная реализация `IIdeMcpActions`. |
| 260 | - **`MainWindowViewModel.McpHostBridge`** — internal-доступ к приватным полям/методам VM для host (git, editor providers, DataBus, breakpoints, debug stack). |
| 261 | - **`IdeMcpCommandExecutor`** принимает `(MainWindowViewModel vm, IIdeMcpActions actions)`; generated/handlers вызывают `_actions`, не cast VM. |
| 262 | - **`ProtocolDocGen`** генерирует `_actions` в pass-through хендлерах. |
| 263 | - Call sites: `App.axaml.cs` (MCP stdio), `AgentContractHeadlessRuntime`, hotkeys, command palette, Intercom, Git panel (`IdeMcp`), DAP callback → `_ideMcpHost.ApplyDapDebugSnapshotToUi`. |
| 264 | - RelayCommand превью Markdown остались на MWVM (`MainWindowViewModel.IdeMcpUiRelayCommands.cs`). |
| 265 | |
| 266 | **Этап 2 (v1.54):** |
| 267 | |
| 268 | - **`EditorWorkspaceViewModel`** (`Features/Editor/`) — `CurrentFilePath`, `EditorText`, selection, `IsLoadingCurrentFile`, markdown preview flags. |
| 269 | - MWVM — прокси-свойства + ретрансляция `PropertyChanged` (Views/MCP без массовой правки). |
| 270 | |
| 271 | **Этап 3 (v1.55):** |
| 272 | |
| 273 | - **`ShellChromeViewModel`** (`Features/Shell/`) — регионы MainGrid, видимость MFD-страниц, `UiMode`, `EditorGroupCount`, `IsBuilding`, `CurrentMfdShellPage`, … |
| 274 | - **`ShellChromePresentationNotifyMap`** — presentation-зависимости на MWVM (бывшие `NotifyPropertyChangedFor` на shell-полях). |
| 275 | - MWVM — `Shell` + прокси + `OnShellChromePropertyChanged`; reactive side-effects (настройки, MFD-навигация, bloom UI mode) в `MainWindowViewModel.ShellSession`. |
| 276 | - Удалены `MainWindowViewModel.ShellState.RegionAndContour` / `UiSessionChrome` (поля перенесены). |
| 277 | |
| 278 | **Этап 4 (v1.56):** |
| 279 | |
| 280 | - **Shell:** layout/MFD/UI mode RelayCommand → `ShellChromeViewModel.Commands.*`; MWVM — `MainWindowViewModel.FeatureCommandProxies` (палитра, MCP, hotkeys без смены имён команд). |
| 281 | - **Documents:** вкладки/группы → `DocumentsWorkspaceViewModel.Commands`; `CloseDocument` API → `CloseDocumentByPath`. |
| 282 | - **Safety L1–L3** — пока на MWVM (`RelayCommands.UiMode`). |
| 283 | - Удалены `RelayCommands.Layout` / `RelayCommands.Documents`; `ToggleMfdRegionExpanded` убран из `SolutionBuild`. |
| 284 | |
| 285 | **Этап 5 (v1.57):** |
| 286 | |
| 287 | - **Application shell:** `MainWindowApplicationShellViewModel` — меню (открыть решение/папку/файл), темы, язык UI, окна-хосты; прокси команд на MWVM. |
| 288 | - **Debug:** `MainWindowDebugSessionViewModel` — F5/attach/step/stop; `DebugLaunchInteractiveAsync` → `Debug.*`; `StateChanged` → `Debug.NotifyRelayCommandsChanged()`. |
| 289 | - **Build:** `MainWindowBuildSessionViewModel` — `BuildSolutionAsync`, `HideBuildOutput`; bridge `HostDotnetRunner`. |
| 290 | - **Editor slice:** `EditorWorkspaceViewModel.DebugGlyphs` (брейкпоинты, `DebugPosition*`), `EditorWorkspaceViewModel.Hud` (баннер диагностик/вхождений); прокси на MWVM. |
| 291 | - Удалены `RelayCommands.Shell`, `RelayCommands.Debug`; build-команды убраны из `SolutionBuild`; удалены `Breakpoints.cs`, `EditorHud.cs` на MWVM. |
| 292 | - `ShowDebugInfoAsync`, `GetWorkspacePath` — internal на host; тесты MCP → `vm.IdeMcp`. |
| 293 | |
| 294 | **Этап 6 (v1.58):** |
| 295 | |
| 296 | - **Shell:** `ShellChromeViewModel.Commands.Safety` (L1–L3), `Commands.MarkdownPreview` (MFD preview / отдельное окно). |
| 297 | - **Editor:** `EditorWorkspaceViewModel.DebugHints`, `InlineHints`, `StabilizedInput`; прокси на MWVM. |
| 298 | - Удалены `RelayCommands.UiMode`, `IdeMcpUiRelayCommands`, `EditorDebugHints` / `EditorInlineHints` / `EditorStabilizedInput` на MWVM. |
| 299 | - Bridge: `HostUpdateCodeNavigationMapCaretOffset`. |
| 300 | |
| 301 | **Дальше:** метрики LOC в таблице partial MWVM; крупные кластеры (navigation map, HCI) — Plan B по мере фич. |
| 302 | |
| 303 | **Backlog MWVM (закрыт, v1.49–v1.52):** |
| 304 | |
| 305 | - **v1.49** — **`SolutionWorkspaceViewModel`** в `Features/Workspace/`; **`SolutionLoadSessionApplyProjection`** — применение загрузки решения (дерево + сброс редактора + MFD); тесты **`SolutionLoadSessionApplyProjectionTests`**. |
| 306 | - **v1.50** — **`IdeMcpCommandExecutor`** перенесён в **`Features/IdeMcp/Execution/`** (диспетчер вне `ViewModels/`; генератор **`ProtocolDocGen`** и **`CascadeIDE.csproj`** синхронизированы). MWVM по-прежнему владеет экземпляром и маршалит UI. |
| 307 | - **v1.51** — Точечный вынос MCP/UI при росте API — **правило на поддержку** ([feature-archetype-v1.md](design/feature-archetype-v1.md)); не big-bang. |
| 308 | - **v1.52** — MEF/плагины и опциональный дополнительный батчинг Problems — **вне scope** (политика ADR 0009 / фаза 5 «основное сделано»); коалесcing BuildOutput и Diagnostics уже в продукте. |
| 309 | |
| 310 | Новые фичи — по **feature-archetype**; MWVM не раздуваем без выноса. |
| 311 | |
| 312 | ## Версионирование |
| 313 | |
| 314 | - **v1** — карта срезов и фазы 0–4. |
| 315 | - **v1.1** — фаза 1 (Git-панель) отмечена как выполненная. |
| 316 | - **v1.2** — фаза 2 (Build output / Terminal как отдельные VM + привязки во Flight — страницы `MfdShellPageStack`; исторически упоминался `BottomPanelView`). |
| 317 | - **v1.3** — фаза 3 (`ChatPanelViewModel`, привязки в `ChatPanelView` + `MainWindow.axaml.cs`). |
| 318 | - **v1.4** — фаза 4 (`InstrumentationPanelViewModel`, модели трассы/отладки в отдельных файлах, прокси на главном VM). |
| 319 | - **v1.5** — инструментирование без прокси: разметка с `DataContext` на `InstrumentationPanel`, правила миграции уточнены. |
| 320 | - **v1.6** — фаза 5 (события, UI-поток, батчинг); MEF/плагины вынесены в отложенные идеи политики. |
| 321 | - **v1.7** — фаза 5: введены `IUiScheduler` / `UiScheduler.Default`, маршалинг UI сосредоточен в `AvaloniaUiScheduler`. |
| 322 | - **v1.8** — фаза 5: `BuildOutputPanelViewModel.Append` коалесит обновления привязки; `FlushPending` после сборки решения. |
| 323 | - **v1.9** — фаза 5: `IUiScheduler.InvokeAsync<T>(Func<Task<T>>)`; MCP `ExecuteCommandAsync` всегда на UI; план шага B по выносу логики из VM. |
| 324 | - **v1.10** — фаза 5: коалесcing `DiagnosticsChanged` в `CSharpLspDiagnosticsHost`; фаза 5 отмечена как «основное сделано», опциональные пункты вынесены отдельно. |
| 325 | - **v1.11** — раздел «Срез MainWindowViewModel»: карта partial-файлов и уточнение текущего состояния (не один `.cs` на ~3k строк). |
| 326 | - **v1.12** — обозреватель решения: вложенность файлов как в VS — `<DependentUpon>` из `.csproj` + эвристика для SDK-glob (`Stem.*.cs` → родитель `Stem.cs` в той же папке). Формат `.sln` вложенность не задаёт. |
| 327 | - **v1.13** — рефакторинг: дерево файлов проекта вынесено в `Services/ProjectFileTreeBuilder.cs`, `SolutionParser` — только загрузка решения и сортировка узлов. |
| 328 | - **v1.14** — план B (примитивы MCP): `McpCommandJsonArgs` в `Services/` вместо вложенного класса в `IdeMcpCommandExecutor`; генератор `ProtocolDocGen` и `IdeMcpCommandExecutor.Generated.g.cs` синхронизированы; тесты на контракт чтения args. |
| 329 | - **v1.15** — зафиксирован слой **Data Acquisition Layer** (fs/process/parse outside CCU), добавлены wave-планы `MCP thinning` и `UI clusters thinning` для следующей итерации strangler. |
| 330 | - **v1.16** — готовность окружения: `EnvironmentReadinessSnapshotBuilder` и `EnvironmentReadinessRefreshOrchestrator` в `Features/EnvironmentReadiness/Application/`; сценарий refresh вынесен из `MainWindowViewModel`; **CASCOPE020** / **CASCOPE021** (граница CCU) — severity **Error** при чистом baseline. |
| 331 | - **v1.17** — DAL-завершение среза Environment Readiness (ADR 0102): `EnvironmentReadinessExecutablePathProbe`, `EnvironmentReadinessEnvSnapshot` / `WellKnownEnv`, `EnvironmentReadinessPathAcquisition`, `EnvironmentReadinessFileFacts` в `Features/EnvironmentReadiness/DataAcquisition/`; I/O и классификация путей вне `Application/`. |
| 332 | - **v1.18** — Cursor ACP DAL: `CursorAcpAgentPath`, `CursorAcpWorkspaceFileAccess` в `Features/CursorAcp/DataAcquisition/`; `global using` для этого пространства имён; `CursorAcpChatConnection` без прямого I/O путей агента и workspace-файлов в обработчиках ACP. |
| 333 | - **v1.19** — Settings DAL: `UserSettingsPaths`, `TextFileReadWrite`, `HotkeyTomlLoader` в `Features/Settings/DataAcquisition/`; `McpExternalServersJsonResolver` читает файл через DAL. Workspace: `SolutionParser`, `ProjectFileTreeBuilder`, `SolutionFileLocator`, `FolderWorkspaceTreeBuilder`, `DebugWorkspacePath` — `Features/Workspace/DataAcquisition/`; `McpSolutionTree` — `Features/Workspace/Application/`; `global using` для Settings и Workspace; `SolutionFileLocator` не зависит от `EditorTextCoordinateUtilities` (локальное сравнение путей). |
| 334 | - **v1.20** — Wave MCP thinning (первый срез): оркестраторы `IdeMcpEditorOrchestrator` / `IdeMcpNavigationOrchestrator` / `IdeMcpBuildTestOrchestrator` + тесты `IdeMcpOrchestratorThinningTests`. |
| 335 | - **v1.21** — MCP thinning второй заход: `HybridIndexScopeResolver`, `IdeMcpHybridIndexScope`, `IdeMcpAgentNotesOrchestrator`; тесты `HybridIndexScopeAndIdeMcpScopeTests`. |
| 336 | - **v1.22** — `IdeMcpSolutionPathAvailability`, `IdeMcpTestRunInstrumentationMutation`; тесты `IdeMcpSolutionPathAvailabilityTests`. |
| 337 | - **v1.23** — `PublishIdeBuildStateOnUiAsync`; MCP `RunCodeCleanupAsync` обрамлён `BuildStateChanged`; `BuildSolutionAsync` — `PublishToIdeDataBusAndRebuild` вместо «тихой» публикации в шину. |
| 338 | - **v1.24** — `IdeMcpGitWorkspaceSession` (+ тесты `IdeMcpGitWorkspaceSessionTests`); `MainWindowViewModel.IdeMcpActions.Git` — делегирование в сессию. |
| 339 | - **v1.25** — `IdeMcpIdeStateUiCapture`; `IdeMcpWorkspaceOrchestrator.BuildIdeStatePayload` по снимку; тест в `IdeMcpOrchestratorThinningTests`. |
| 340 | - **v1.26** — DAP UI-план + MCP `GetDebugSnapshotAsync` без `UiScheduler.InvokeAsync`. |
| 341 | - **v1.27** — Wave UI clusters: `CodeNavigationMapPresentationProjection`, `CodeNavigationMapSettings.ViewWants*`; тесты `CodeNavigationMapPresentationProjectionTests`. |
| 342 | - **v1.28** — Wave UI clusters: `WorkspaceNavigationMapContextJsonBuilder`, `CodeNavigationMapViewportPolicy`; тесты `WorkspaceNavigationMapContextAndViewportTests`. |
| 343 | - **v1.29** — Явная **стратегия целевого каркаса** (CDS / CCU / DAL / IDS), приоритет упрощающего буфера вокруг `MainWindowViewModel` и правило 5 раздела «Правила на время миграции» — чтобы strangler совпадал с реальным приближением к устоявшейся линии слоёв, а не откладывался потоком фич. |
| 344 | - **v1.30** — Wave UI clusters: `WorkspaceNavigationMapRefreshComposer` (пост-JSON конвейер карты PFD); тесты `WorkspaceNavigationMapRefreshComposerTests`. |
| 345 | - **v1.31** — Тот же срез: **CDS-снимок для trace-flow** на карте захватывается на UI до фонового парсинга/компоновки, контракт `Compose(.., CockpitSurfaceState?)` без `Func` с пула. |
| 346 | - **v1.32** — Wave UI clusters: вынесен partial **`MainWindowViewModel.ShellState.AiProviders`** (режим ИИ и облачные ключи) из `ShellState.cs`. |
| 347 | - **v1.33** — Wave UI clusters: **`MainWindowViewModel.ShellState.ChatAndSessionConfig`** (чат + MCP/ACP конфиг автономной сессии). |
| 348 | - **v1.34** — Wave UI clusters: **`MainWindowViewModel.ShellState.AutonomousAgentStripe`** (полоса автономного агента + тесты/LOC для IDE Health). |
| 349 | - **v1.35** — Терминология раскладки: **три зоны** (PFD · Forward · MFD); терминал/сборка/Git — **вторичный контур колонки MFD**, не отдельная «нижняя панель». Уточнены xmldoc `ShellState` и флаги страниц MFD. |
| 350 | - **v1.36** — Переименование: `IsBottomPanelVisible` → **`IsMfdContourContentVisible`** (флаги контента стека вторичного контура MFD). |
| 351 | - **v1.37** — Разметка и снимки: `Border#BottomPanelShell` → **`MfdContourStackHost`** (`MfdShellView.axaml`); ключ **`layout_regions`** в MCP/DeepSnapshot обновлён; доки без отсылки к вымышленной «нижней панели» главного окна во Flight. |
| 352 | - **v1.38** — Wave MCP thinning (завершение волны в текущем объёме): **`IdeMcpBuildTestOrchestrator`** — поверхность панели при missing solution / ошибке сборки; **`IdeMcpHostOrchestrator`** — JSON `ping`/рестарт MCP; **`IdeMcpHybridCodebaseIndexOrchestrator`** — литералы ошибок и `SerializeReindexFailed`; дедуп **`PublishIdeMcpTestRunMutation`** в `IdeMcpActions.BuildTest`. |
| 353 | - **v1.39** — Wave UI clusters: доменное разнесение **`MainWindowViewModel.ShellState`**: регион/контур MFD (**`ShellState.RegionAndContour.cs`**), режим UI и сборка (**`UiSessionChrome.cs`**), Kroki/modelfetch (**`ModelPullMarkdown.cs`**); enum палитры в **`Models/Shell/CommandPaletteHost.cs`** (хост-окна + тесты пользуются из `CascadeIDE.Models.Shell`). |
| 354 | - **v1.40** — Wave UI clusters, кластер **Presentation**: статическая проекция **`MainWindowPresentationSurfaceProjection`** для вычисляемых свойств **`MainWindowViewModel.Presentation`**, тесты **`MainWindowPresentationSurfaceProjectionTests`**. |
| 355 | - **v1.40b** — тот же кластер: **`IdeHealthStripPresentationProjection`** + тесты **`IdeHealthStripPresentationProjectionTests`**; VM не дублирует разбор вложенного снимка в шести геттерах. |
| 356 | - **v1.40c** — **`MainWindowViewModel.PresentationLayout`**: несколько **`PresentationLayout.*`** partial-файлов (топология, host-shell инвалидация, сохранённые bounds окон-хостов, CDS snapshot). |
| 357 | - **v1.40d** — **`MainWindowPresentationCapabilitiesProjection`** + тесты; геттеры **`Presentation`** делегируют цепочки capabilities/Skia/safety/LOC. |
| 358 | - **v1.40e** — **`MainWindowViewModel.WorkspaceNavigationMap.Refresh`**: поток обновления карты отделён от partial с привязками PFD. |
| 359 | - **v1.40f** — расширение **`MainWindowPresentationSurfaceProjection`** (split/Mount-style/IDE Health mount) + **`MainWindowPresentationDapProjection`**; VM без локальных помощников резолва mount-style. |
| 360 | - **v1.40g** — **`IMainWindowHostSurfaceInput`** + проекция host surface без типа VM; связность Cockpit → ViewModels ослаблена на границе shell/host кадра. |
| 361 | - **v1.40h** — MCP **`BuildAsync`** / **`RunCodeCleanupAsync`**: общий каркас **`WithIdeMcpPublishedBuildStateAsync`** (пара **`BuildStateChanged`** на шину IDE Health, ADR 0099) вместо дублирующего try/finally в **`MainWindowViewModel.IdeMcpActions.BuildTest`**. |
| 362 | - **v1.40i** — MCP UI automation: **`IdeMcpUiAutomationOrchestrator`** — **`TryGetRemoveBreakpointNormalizedPath`**, **`ShouldSkipToggleBreakpointInEditor`**, **`InvokeStringResultOnUiAsync`**, **`EditChatAssistantMessageOnUiAsync`**; **`MainWindowViewModel.IdeMcpActions.UiAutomation`** короче. |
| 363 | - **v1.40j** — палитра команд: типы строки списка **`IdeCommandPaletteRowKind`** / **`IdeCommandPaletteRowViewModel`** вынесены в **`ViewModels/IdeCommandPaletteRowViewModel.cs`**; **`MainWindowViewModel.CommandPalette.cs`** остаётся логикой фильтрации и исполнения. |
| 364 | - **v1.40k** — Launch / MCP: **`DebugLaunchByProfileMcpOrchestrator`** (`Features/Launch/Application`) — сценарий **`debug_launch`** по `target_path` или профилю без длинного тела в **`MainWindowViewModel.StartupProject`**; HCI: **`HybridIndexHisPresentationProjection.LampItem`** + тесты, **`MainWindowViewModel.HybridIndex`** — однострочный геттер. |
| 365 | - **v1.40l** — Workspace: **`SolutionLoadCrashLog`** (`Features/Workspace/Application`) — запись **`LoadSolution`** crash в **`.cascade-ide/crash-log.txt`** вне **`MainWindowViewModel.SolutionBuild`**; штамп UTC через **`InvariantCulture`**. |
| 366 | - **v1.41a** — Launch / F5: **`DebugLaunchForF5Orchestrator`** (`Features/Launch/Application`) — pre-resolve + MSBuild для F5 вне **`MainWindowViewModel.StartupProject`**; **`LaunchProjectPathResolver.NormalizeExistingProjectFileFullPath`** (DAL) — проверка существования стартового `.csproj` без `File.Exists` в Application-оркестраторе (CASCOPE031). |
| 367 | - **v1.41b** — Палитра команд: **`IdeCommandPaletteFilterOrchestrator`** / **`IdeCommandPaletteExecutionOrchestrator`** + **`CommandPaletteGoToAsyncHandle`** (`Features/Search/Application`) — фильтрация (каталог / melody / go-to + ripgrep) и исполнение выбора вне **`MainWindowViewModel.CommandPalette`**. |
| 368 | - **v1.41c** — CascadeChord (ADR 0060): **`CascadeChordIntentSession`** (`Features/Shell/Application`) — фаза, хвост, таймер и разбор клавиш; **`MainWindowViewModel.CascadeChord`** — привязки и туннель к сессии. |
| 369 | - **v1.41d** — Presentation: **`MainWindowPresentationSurfaceProjection.ComposeHostSurfaceFrame`** — сборка **`MainWindowHostSurfaceFrame`** по **`IMainWindowHostSurfaceInput`** и нормализованному UI-режиму вне **`MainWindowViewModel.Presentation`**. |
| 370 | - **v1.41e** — Настройки: **`ShellSettingsReactiveSideEffects`** (`Features/Settings/Application`) — длинные цепочки **внешний MCP / autonomous**, **AI mode / cloud provider**, **HCI index dir + scope** вместо тел в **`MainWindowViewModel.SettingsReactive`**. |
| 371 | - **v1.41f** — Relay-команды: нарезка **`MainWindowViewModel.RelayCommands`** на **`RelayCommands.Shell`** / **`Layout`** / **`Documents`** / **`UiMode`** (+ **`RelayCommands.Debug`** без изменений логики); **`ApplyMfdRegionExpanded`** / **`ApplyPfdRegionExpanded`** вместо прямых присваиваний (CASCOPE003). |
| 372 | - **v1.41g** — MCP executor: **`IdeMcpCommandExecutor.Handlers.Chrome`** разнесён на **`Chrome.OutputFocus`** / **`Chrome.UiVisibility`** / **`Chrome.MenuToolbar`** (регистрация хендлеров без изменения поведения). |
| 373 | - **v1.41h** — Главное окно: тело конструктора вынесено в **`MainWindowViewModel.ShellConstruction`**; **CASCOPE003** — в белом списке **`ShellConstruction`** (наряду с `MainWindowViewModel.cs`). |
| 374 | - **v1.41i** — MCP executor: **`IdeMcpCommandExecutor.Handlers.PowerDocuments`** разнесён на **`PowerDocuments.FocusPowerAgent`** (фокус, автономность, чат, Ollama) и **`PowerDocuments.Documents`** (вкладки документов). |
| 375 | - **v1.41j** — MCP **`IIdeMcpActions`**: **`IdeMcpActions.BuildTest`** разнесён на **`BuildTest.Build`** (диагностики, дерево решения, сборка, structured, code cleanup) и **`BuildTest.Tests`** (тесты и **`PublishIdeMcpTestRunMutation`**). |
| 376 | - **v1.41k** — MCP UI automation: **`IdeMcpActions.UiAutomation`** разнесён на **`UiAutomation.EditorPreview`** (редактор, брейкпоинты, превью) и **`UiAutomation.Providers`** (подтверждения, тема, провайдеры контролов и чата). |
| 377 | - **v1.41l** — MCP executor: **`Handlers.DapDebug`** → **`DapDebug.LaunchAttach`** / **`DapDebug.Stepping`**; **`Handlers.Editor`** → **`Editor.ToolCatalog`** (статический **`RegisterCore`**), **`FilesAndChat`**, **`StateContent`**, **`EditNavigation`**; **`Chrome.MenuToolbar`** → **`MenuToolbar.DialogsApp`**, **`ThemeLanguage`**, **`PanelsLayout`**; **`CascadeIDE.csproj`** — **`DependentUpon`** для вложенных partial. |
| 378 | - **v1.41m** — Workspace: **`BlankSolutionCreator`** (`Features/Workspace/Application`) — новое пустое **`.sln`** через **`dotnet new sln`**; меню **Файл → Создать новое решение…**, MCP **`create_new_solution_dialog`**, тесты **`BlankSolutionCreatorTests`**; **`MainWindowViewModel.TryCreateBlankSolutionAtPathAsync`**. |
| 379 | - **v1.41n** — Роли слоёв: атрибут **`[PresentationProjection]`** (`CascadeIDE.Contracts`), анализатор **`LayerRoleConsistencyAnalyzer`** (**CASCOPE032–042**); проекции в `Features/*/Application` переведены с `[ComputingUnit]` на `[PresentationProjection]`; оркестраторы палитры/F5/debug — `[ApplicationOrchestrator]`; I/O-исключения (`ExpandedMarkdownFileExportProjection`, `StartupProjectDebugInferenceProjection`) остаются на `[ComputingUnit]`. |
| 380 | - **v1.41o** — **`ShellSettingsPresentationProjection`** (был `ShellSettingsOrchestrator`); **CASCOPE039** не предупреждает MCP/application-фасады с `[ApplicationOrchestrator]` и делегированием в `*Service` (и разбором `JsonElement`/`GraphDocument`). |
| 381 | - **v1.42** — [design/feature-archetype-v1.md](design/feature-archetype-v1.md) + [design/ide-chrome-tokens-v1.md](design/ide-chrome-tokens-v1.md); глобальные стили `cascadeSection` / UiKit **`CascadeSection`**, **`CascadeStatusChip`**; ADR **0076**, **0121** → Accepted. |
| 382 | - **v1.43** — ADR **0120** (primary work surface Intercom/Editor) → Accepted · Implemented; IOP manifest синхронизирован. |
| 383 | - **v1.44** — ADR **0119** (chat slash commands) → Accepted · Implemented (фазы A, A′, B); **0121** таблица зрелости обновлена. |
| 384 | - **v1.45** — Strangler UI: **`StartupProjectRefreshProjection`**; MWVM **`StartupProject`** укорочен. |
| 385 | - **v1.46** — **`SolutionLoadUiApplyProjection`** + **`MainWindowBuildSolutionPrepProjection`**; MWVM **`SolutionBuild`** без прямого `File.Exists` для CanBuild. |
| 386 | - **v1.47** — **`UiModeLayoutApplyProjection`**; **`ApplyUiModeLayout`** в **`UiGitWorkspace`**. |
| 387 | - **v1.48** — Wave 1 strangler MWVM (текущий объём) отмечен **закрытым**; backlog зафиксирован в разделе «Wave 1 — статус». |
| 388 | - **v1.49** — **`SolutionWorkspaceViewModel`** + **`SolutionLoadSessionApplyProjection`** (см. backlog MWVM). |
| 389 | - **v1.50** — **`IdeMcpCommandExecutor`** → **`Features/IdeMcp/Execution/`**. |
| 390 | |