Forge
markdowndeeb25a2
1# Concept → Implementation Map v1 (CascadeIDE)
2
3Scope: **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
12This 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
911. **Dependency mini-map** (Balanced): опциональная панель графа зависимостей / solution graph.
922. **Task queue feed**: наполнение `PowerTaskQueueItemViewModel` из MCP при мульти-задачной оркестрации.
933. **Бейджи глубже:** цикломатика / реально «затронутые» тесты по графу изменений — отдельный pipeline (сейчас эвристики).
944. **Живая сложность при редактировании:** при необходимости обновлять proxy сложности по `EditorText` с debounce (сейчас — при смене файла с диска).
955. **Хром дерева решения (Power):** сделано стилями на `TreeViewItem` + кисти; при необходимости — **полный** кастомный шаблон `TreeViewItem`, если тема Fluent перекрывает `Background`/`BorderThickness`.
966. **Редактор / трасса / 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
View only · write via MCP/CIDE