| 1 | # Concept → Implementation Map v1 (CascadeIDE) |
| 2 | |
| 3 | Scope: **CascadeIDE UI concepts** (Focus/Balanced/Power) mapped to current implementation in: |
| 4 | |
| 5 | - `Views/MainWindow.axaml` |
| 6 | - `Views/MainWindow.axaml.cs` (+ `MainWindow.PresentationHostWindows.axaml.cs` — вторичные `TopLevel` PFD/MFD) |
| 7 | - `ViewModels/MainWindowViewModel.cs` (partial-классы) |
| 8 | - `Views/TaskCockpitView.axaml`, `Views/ChatPanelView.axaml`, `Views/SolutionExplorerView.axaml`, `Views/IdeHealthStripView.axaml`, `Views/MfdShellView.axaml` (+ страницы `MfdShellPageStack`; **`BottomPanelView` в Flight нет** — старая топология) |
| 9 | |
| 10 | Отдельно [§6](#6-мультиоконность-adr-0017--второй-toplevel-mfd): **ADR 0017** — `presentation`, хосты `PfdHostWindow` / `MfdHostWindow`, топология мониторов. |
| 11 | |
| 12 | This map is intended to drive incremental alignment work with clear acceptance checks. |
| 13 | |
| 14 | ## Legend |
| 15 | |
| 16 | - **Status** |
| 17 | - ✅ implemented |
| 18 | - 🟨 partial / heuristic data |
| 19 | - ❌ missing |
| 20 | |
| 21 | --- |
| 22 | |
| 23 | ## 1) Global layout / docking |
| 24 | |
| 25 | | Concept element | XAML control (x:Name / binding) | VM property/command | Status | Notes | |
| 26 | |---|---|---|---|---| |
| 27 | | Main grid columns (left / center / right) | `MainGrid` `ColumnDefinitions="220,4,*,4,340"` | `IsSolutionExplorerVisible`, `IsChatPanelExpanded` | ✅ | Ширина чата: рантайм + правила семьи; глобальные числа — `UiModes/workspace.toml` / `UiWorkspaceLayoutRuntimeMetrics` (см. ADR 0010). | |
| 28 | | Mode hotkeys | `<Window.KeyBindings>` | `SetUiModeByIndexCommand` (порядок из `UiModeCatalog.OrderedModeIds`), `CycleUiModeCommand` | ✅ | `Alt+1`…`Alt+9` — 1…9-й режим в каталоге; `Ctrl+Alt+M` — цикл. | |
| 29 | | Mode switch UI | Toolbar ComboBox + menu radio items | `UiMode`, `UiModeOptionsList` | ✅ | `ModeBadge`: классы `.power` / `.agentchat` / `.debug` от **`UiModeFamily`** (`UiModeFamilyEq` + параметр enum). | |
| 30 | |
| 31 | --- |
| 32 | |
| 33 | ## 2) Focus concept (`concept-generated/cascadeide-ui-concept-focus.png`) |
| 34 | |
| 35 | | Concept element | XAML control | VM property/command | Status | Notes | |
| 36 | |---|---|---|---|---| |
| 37 | | Top bar: task title + status pill | `TaskCockpitView` (`Grid.Row="2"`) | `ActiveTaskTitle`, `ActiveTaskStatus`, `ActiveTaskProgress` | ✅ | `ShowTaskBar => true` — полоска видна в Focus. | |
| 38 | | Minimal left navigation | `SolutionExplorerBorder` | `IsSolutionExplorerVisible` | ✅ | Toggle via menu. | |
| 39 | | Dominant editor | `Editor` (`AvaloniaEdit`) | `EditorText`, `CurrentFilePath` | ✅ | Inline markdown preview (`InlinePreviewBorder`). | |
| 40 | | Agent panel (plan / next / confirmation) | `ChatPanelView` rows 0–1, 3 | `FocusPlanItems`, `NextActionSummary`, confirm commands | ✅ | Отдельные карточки в Focus; полный блок «Agent Operations» — в Balanced (`ShowAgentOperationsBlock`). | |
| 41 | | Bottom status pills (Build/Test/Debug/Git) | `IdeHealthStripView` (`UiModeFamilyNe` + `Power`) | `IdeHealthBuildText`, `IdeHealthTestsText`, `IdeHealthDebugText`, `WorkspaceHealthGitText` (хром) | ✅ | Компактная полоса под редактором, когда семья **не** Power (Focus/Balanced/AgentChat/Debug и т.д.). | |
| 42 | | Док инструментирования (События / Тесты / Отладка) | страницы MFD в `MfdShellPageStack` (`EventsMfdPageView`, `TestsMfdPageView`, `DebugStackMfdPageView`, …) | `ShowInstrumentationTabs`, `IsInstrumentationDockVisible` | ✅ | В Focus доступны при включённом доке (меню «Док инструментирования»); сводка — полоса IDE Health. | |
| 43 | | Карточка safety (observe/confirm/autonomous) | `ChatPanelView` row 5 (`modeCard` / Power: `safetyLevelIsland`) | `ShowSafetyControls`, `SetSafety*Command` | ✅ | Focus/Balanced — компактные кнопки; Power — отдельная панель-док с semantic ids. | |
| 44 | |
| 45 | --- |
| 46 | |
| 47 | ## 3) Balanced concept (`concept-generated/cascadeide-ui-concept-balanced.png`) |
| 48 | |
| 49 | | Concept element | XAML control | VM property/command | Status | Notes | |
| 50 | |---|---|---|---|---| |
| 51 | | Quick actions | `TaskCockpitView` | `FixFailingTestsCommand`, …, `QuickActions` | ✅ | **`QuickActions`** на VM из **`Capabilities.QuickActions`** (TOML `quick_actions`, дефолты по семье; у Balanced обычно true). | |
| 52 | | Editor badges (LOC / Impacted / Files) | `TaskCockpitView` | `LocBadgeSummary` (`LocBadge` + Low/Medium/High), `ImpactedTestsBadge`, `FilesChangedBadge` | 🟨 | **LOC:** непустые строки (как `get_code_metrics` `loc`); ось размера по `[loc_limits]` в `workspace.toml` (`medium_min`, `high_min`). Остальное: упавшие тесты последнего `dotnet test`; число путей из `git status --short`. | |
| 53 | | Agent operations card | `ChatPanelView` row 2 | `ShowAgentOperationsBlock` | ✅ | Balanced only. | |
| 54 | | Build/Test/Debug + event timeline | `IdeHealthStripView` (Power cockpit) + вкладка «События» | `EventTimeline`, `IsTerminalVisible` | ✅ | В Power дубль IDE Health на вкладке «Терминал» отключён (`IdeHealthOnTerminalTab`), чтобы не сжимать консоль; лента — «События». | |
| 55 | | Dependency mini-map / solution graph | — | — | ❌ | Не реализовано; см. шаг 4 в «Next steps». | |
| 56 | |
| 57 | --- |
| 58 | |
| 59 | ## 4) Power concept (“cockpit”) (`concept-generated/cascadeide-ui-concept-power.png`) |
| 60 | |
| 61 | | Concept element | XAML control | VM property/command | Status | Notes | |
| 62 | |---|---|---|---|---| |
| 63 | | Task bar / status cockpit | `TaskCockpitView` | `ShowTaskBar` | ✅ | Включая блок Autonomous (Power). | |
| 64 | | Terminal / cockpit output control (Power) | Toolbar + hint in cockpit | `TelemetryButtonText`, `ToggleTerminalCommand`, `ShowTelemetryHiddenHint` | ✅ | Не путать с каналом IDE Health — это явный доступ к выводу (терминал). | |
| 65 | | Agent Trace Timeline | `ChatPanelView` | `ShowAgentTrace`, `AgentTraceSteps`, … | ✅ | | |
| 66 | | Safety Level + Emergency Stop | `ChatPanelView` row 5: отдельный док `safetyLevelIsland` (Power) + `modeCard` (Focus/Balanced) | L1/L2/L3 (`powerSafetyTierFace`, кольцо активного уровня); Power: **EMERGENCY STOP** в `PanelChromeHeader` (`ShowEmergencyStop`), Focus/Balanced — кнопка под L1–L3 | ✅ UI / 🟨 enforcement | Фон дока: `PowerSafetyDockBackground` ← `safety_dock_background`. Политика инструментов — отдельно. | |
| 67 | | Bottom IDE Health strip (cockpit + JSON) | `IdeHealthStripView` (Power) | `WorkspaceHealth*CockpitShort`, `WorkspaceSnapshotJson` | ✅ | | |
| 68 | | Task queue list | `SolutionExplorerView` (Power) | `PowerTaskQueueItems` | 🟨 | Заполняется при появлении очереди от агента. | |
| 69 | | Window title | `MainWindow` `Title` | `WindowTitle` | ✅ | | |
| 70 | | **Panel headers** (полоса + разделитель + ⋯) | `Views/PanelChromeHeader.axaml`, стили в `App.axaml` | `panel_chrome` в JSON темы | 🟨 | Меню по ⋯: заглушка + «Копировать заголовок»; `UppercaseTitle` для коротких меток. Glow / декоративные дуги — вне scope. | |
| 71 | | **Рамки рабочей области** (три колонки, сплиттеры, шов зон, карточки `modeCard`) | `CascadeTheme.WorkspacePanelBorderBrush` в `App.axaml`; `MainWindow`, `SolutionExplorerView`, `DocumentsDockView`, `ChatPanelView`, `MfdShellView` | `workspace_layout.border_brush` (если нет — `editor_column.border_brush`) | ✅ | Power: чуть ярче кайма колонок (`#00C8E8`) vs внутренние линии редактора. | |
| 72 | | **Power: IDE Health в полосе хрома** | `WorkspaceChromeBandView`: `IdeHealthStripView` на всю ширину контейнера (раньше планировался `Grid.ColumnSpan` по колонкам main grid — свойство удалено). Чат — одна строка с редактором (`ChatPanelMainGridRowSpan` = 1). | `MainWindowViewModel`, `Capabilities.IdeHealthMainColumnSpan` в TOML режимов (`ide_health_main_column_span`) | ✅ | Ширина сегментов кокпита по-прежнему из capabilities; не через отдельное свойство VM для span главной сетки. | |
| 73 | | **Power: острова, gutter, градиентные каймы** | `App.axaml`: `PowerEditorIslandFrameBrush`, `PowerChatIslandFrameBrush`, `PowerSolutionIslandFrameBrush`; `DocumentsDockView`, `SolutionExplorerView`, `ChatPanelView` — `Panel` + внутренний `Border` (`#…IslandInner`) с `Classes.power`, `Margin` 6–8 у `UserControl.power`; полоса хрома (IDE Health) — `CornerRadius` 14, усиленный `BoxShadow`; низ — `MfdContourStackHost` скругление сверху в Power | — | ✅ | Focus/Balanced: без градиентных рамок, скругления ~10px у колонок. | |
| 74 | |
| 75 | ### 4.1) Визуальный хром Power: концепт (PNG) vs текущий XAML |
| 76 | |
| 77 | Речь не о отсутствии функций, а о **внешнем виде строк, выделения, плотности** — как на крупном референсе дерева: `concept-screens/power-project-explorer-tree-concept.png` (рядом см. автогенерацию `concept-generated/cascadeide-ui-concept-power.png`). |
| 78 | |
| 79 | | Элемент концепта | Где в коде | Status | Notes | |
| 80 | |---|---|---|---| |
| 81 | | **Дерево решения / Project Explorer** | `SolutionExplorerView.axaml` + `App.axaml`: в Power — тёмный фон острова (`PowerSolutionTreePanelBackground`), строки `TreeViewItem` (padding, `MinHeight`, hover/selected фоны, **левый акцент** `PowerNeonBorder` 3px), иконки **20×20** (`solutionExplorerTreeIcon`), заголовки `PanelChromeHeader` с классом **`powerSolutionExplorer`** (полоса как у IDE Health, светлый текст). Очередь задач в том же визуальном ряду. | 🟨 | Остаётся **Fluent-шаблон** `TreeViewItem` (не полная замена control theme); если акцент/фон не пробиваются в рантайме — точечный `ControlTheme` / копия шаблона. | |
| 82 | | **Центр: редактор** | `DocumentsDockView` + AvaloniaEdit | 🟨 | Концепт: выразительный gutter, inline diagnostics / блок предупреждений в теле. Сейчас — возможности редактора по умолчанию, без полного «кино»-хрома макета. | |
| 83 | | **Правая колонка: карточки трассы** | `ChatPanelView` (trace / safety) | 🟨 | Состав блоков и кнопки соответствуют идее; **плотность, неон, типографика** карточек могут отличаться от PNG. | |
| 84 | | **Нижняя полоса IDE Health** | `IdeHealthStripView` | 🟨 | Данные кокпита и JSON есть; **спарклайны / капс-лейблы / «глянец»** из концепта — частично или упрощённо. | |
| 85 | | **Заголовки панелей (⋯, полоса)** | `PanelChromeHeader` | 🟨 | Уже в таблице выше; детали glow / дуг — вне текущего scope. | |
| 86 | |
| 87 | --- |
| 88 | |
| 89 | ## 5) Concrete next alignment steps (remaining) |
| 90 | |
| 91 | 1. **Dependency mini-map** (Balanced): опциональная панель графа зависимостей / solution graph. |
| 92 | 2. **Task queue feed**: наполнение `PowerTaskQueueItemViewModel` из MCP при мульти-задачной оркестрации. |
| 93 | 3. **Бейджи глубже:** цикломатика / реально «затронутые» тесты по графу изменений — отдельный pipeline (сейчас эвристики). |
| 94 | 4. **Живая сложность при редактировании:** при необходимости обновлять proxy сложности по `EditorText` с debounce (сейчас — при смене файла с диска). |
| 95 | 5. **Хром дерева решения (Power):** сделано стилями на `TreeViewItem` + кисти; при необходимости — **полный** кастомный шаблон `TreeViewItem`, если тема Fluent перекрывает `Background`/`BorderThickness`. |
| 96 | 6. **Редактор / трасса / IDE Health:** точечное выравнивание с PNG-концептами по приоритету (см. §4.1). |
| 97 | |
| 98 | --- |
| 99 | |
| 100 | <a id="6-мультиоконность-adr-0017--второй-toplevel-mfd"></a> |
| 101 | |
| 102 | ## 6) Мультиоконность (ADR 0017) — вторичные `TopLevel` (PFD / MFD) |
| 103 | |
| 104 | Норматив: [ADR 0017](../adr/0017-multi-window-workspace-and-agent-surfaces.md), подробная таблица «что в коде» — [«Состояние реализации»](../adr/0017-multi-window-workspace-and-agent-surfaces.md#adr0017-implementation-status). |
| 105 | |
| 106 | | Элемент | Где в коде | VM / настройки | Status | Notes | |
| 107 | |---|---|---|---|---| |
| 108 | | Строка `presentation` / `zone_screen_layout` + `[presentation_grammar]` | `CascadeIdeSettings`, merge в VM | `GetEffectivePresentationLine()`, `PresentationParse` | ✅ | Парсер: `Services/Presentation/PresentationParser.cs`, внутри экрана — `PresentationInnerEtoGrammar` (Eto.Parse). | |
| 109 | | Главное окно на весь экран по топологии `presentation` | `MainWindow` `Loaded` | `PresentationRequestsMainWindowMaximized` ← `PresentationLayoutAnalyzer.ShouldMaximizeMainWindowAtStartup` (P+F на первом экране — в т.ч. `(P+F+M)`; `(P)(F)(M)` на трёх экранах) | ✅ | `WindowState.Maximized`; иначе дефолт размера из XAML. | |
| 110 | | Второе окно зоны Mfd (полный вторичный контур) | `Views/MfdHostWindow.axaml` → `MfdShellView` | `DataContext` = `MainWindowViewModel` (тот же, что у `MainWindow`) | ✅ | ADR п. 8: не «узкий» одностраничный хост. | |
| 111 | | Окно зоны Pfd (Semantic Map / PFD) | `Views/PfdHostWindow.axaml` | тот же `MainWindowViewModel` | ✅ | Тройной пресет `(P)(F)(M)` — PFD на отдельном экране; см. ADR 0017. | |
| 112 | | Автозапуск и переключение хостов; MCP `toggle_mfd_host_window` при топологии с выносом Mfd | `MainWindow.PresentationHostWindows.axaml.cs` | MFD: `ToggleMfdHostWindowCommand` (`CanExecute` ← `PresentationRequestsMfdHostWindow`), `TryOpenMfdHostWindowOnStartup`, `OpenMfdHostWindowOnStartup`. PFD: `TogglePfdHostWindow` / `TryOpenPfdHostWindowOnStartup`, `OpenPfdHostWindowOnStartup` | ✅ | Отдельного пункта меню нет — раскладка в `settings.toml`. | |
| 113 | | Колонки Pfd/Mfd в главном окне при открытых хостах | `MainWindow` / layout | `SetPfdHostWindowShellOpen` / `SetMfdHostWindowShellOpen` → скрыть дубль колонки | ✅ | `AttentionLayoutSurfaceKind.MainWindowPlusPfdHostTopLevel`, `MainWindowPlusMfdHostTopLevel`, `MainWindowPlusPfdMfdHostTopLevel`. | |
| 114 | | Плейсмент на дисплее (общий для обоих хостов) | `PresentationHostWindowPlacement.PlaceOrRestore` / `PlaceNearMain` | `PfdHostPresentationScreenIndex` / `MfdHostPresentationScreenIndex` из разбора `presentation`; `[display]` `maximize_presentation_host_windows_on_dedicated_screens` | ✅ | Топология экранов: `PresentationMonitorTopology.OrderScreensForPresentation`. Fallback: «другой экран», не главный. При `false` — заполнение рабочей области без `Maximized`. | |
| 115 | | Сохранение геометрии хостов | `Closing` → `PersistPfdHostWindowBounds` / `PersistMfdHostWindowBounds` | `PfdHostWindow*` / `MfdHostWindow*` (пиксели и размер) в `settings.toml` | ✅ | Восстановление с clamp к `WorkingArea`. | |
| 116 | | MCP / агент | `UiLayoutSnapshot`, highlight | роли `pfd_host` / `mfd_host`, паритет подсветки | ✅ | `ide_get_ui_layout` — все top-level. | |
| 117 | | Параметры AI и чата в зоне Mfd | `MfdShellView` → страница `AiChatSettings` → `AiChatSettingsPanelView` | `OpenSettingsCommand` → `TryNavigateToSecondaryShellPage` при `ai_chat_settings_presentation = mfd` в `settings.toml`; иначе `SettingsWindow` | ✅ | Палитра: «Вторичный контур: Параметры AI…»; полное окно — кнопка на странице или `window`. | |
| 118 | |
| 119 | **Остаётся вне этой таблицы (roadmap ADR):** продуктовая доводка UX на втором экране, полнота fallback при смене мониторов, детали подтверждений агента при двух окнах — см. [открытые вопросы 0017](../adr/0017-multi-window-workspace-and-agent-surfaces.md#adr0017-open-questions). |
| 120 | |
| 121 | --- |
| 122 | |
| 123 | Версия карты: **2026-04-02** (термины режима: `UiModeFamily` / capabilities вместо `Is*Mode`; §4.1 без изменений по смыслу). **2026-04-11** — в русских таблицах канон терминов: **IDE Health** (ранее *Workspace Health*) вместо разговорной «телеметрии» для этого канала; см. [ADR 0089](../adr/0089-ide-omnibus-naming-and-ide-health-channel-rename.md). **2026-04-11** — [ADR 0017](../adr/0017-multi-window-workspace-and-agent-surfaces.md) **Accepted**. **2026-04-11** — добавлен **§6** (второй `TopLevel`, `MfdHostWindow`, сервисы топологии/плейсмента); устаревшая оговорка «в репозитории ещё нет второго окна» снята. **2026-04-11** — §6: страница **AI и чата** во вторичном контуре (`SecondaryShellPage.AiChatSettings`), ключ `ai_chat_settings_presentation` (`mfd` / `window`). **2026-04-17** — §6: `PfdHostWindow`, общий `PresentationHostWindows` partial и `PresentationHostWindowPlacement`; роли `pfd_host` / `mfd_host` в снимках. **2026-04-24** — в таблицах: продуктовое имя **IDE Health**, представление `IdeHealthStripView.axaml` (CLR-класс в XAML может ещё совпадать со старым именем). |
| 124 | |