Forge
markdowndeeb25a2
1# Реестр команд IDE для палитры и MCP (чертёж v1)
2
3**Статус:** чертёж (полный `IdeCommandUiMeta` и т.д. — по плану); **реализация v1 (частично) — Implemented в коде:** partial `Services/IdeCommandRegistry*.cs` (палитра, `CommandAccessibleFrom`, хоткеи окна); жесты только в `hotkeys.toml`. Согласуется с [ADR 0013](../adr/0013-command-surface-and-discoverability.md), [ADR 0010](../adr/0010-ui-modes-toml-configuration.md), [ADR 0030](../adr/0030-command-ids-hotkeys-and-ui-registry-layers.md) (**Accepted · Implemented**).
4**Задача:** один **идентификатор команды** (`command_id`) для MCP, `ide_execute_command`, меню и палитры; отдельно — **метаданные для человека** (имя, группа, фильтр по режиму) и **хоткеи** из файлов.
5
6---
7
8## 1. Что уже есть (не переписываем)
9
10| Слой | Роль |
11|------|------|
12| `IdeCommands` | Стабильные строковые **`command_id`** + XML-summary для MCP/доков. Контракт summary/линта для ProtocolDocGen: [ide-commands-protocol-docgen-contract.md](../dev/ide-commands-protocol-docgen-contract.md). |
13| `IdeMcpCommandExecutor` | Регистрация **`command_id` → обработчик**. |
14| `IdeCommandsArgs` (генерация) | Схема аргументов по id. |
15| `MCP-PROTOCOL.md` | Таблица команд, генерируемая из XML. |
16
17Это уже **единый реестр исполнения** и контракт для агента. Палитре не хватает **UI-метаданных** и явного «показывать / не показывать».
18
19---
20
21## 2. Что добавляем: каталог метаданных (не второй список id)
22
23Новый тип — например **`IdeCommandUiMeta`** (или строка в одном **`IdeCommandCatalog`**), **по одному на команду, которая может попасть в палитру** (и опционально — строка «только для валидации» на все id из `IdeCommands` — см. §8).
24
25Минимальные поля:
26
27| Поле | Назначение |
28|------|------------|
29| **`CommandId`** | Строка = `IdeCommands.*` (один источник констант). |
30| **`Category`** | Группа в списке палитры: `File`, `View`, `Build`, `Git`, `Debug`, `Agent`, `Documents`, `Settings`, … (enum или строковые константы в одном месте). |
31| **`TitleKey`** | Ключ локализованной строки (`IdeCmd.open_file`) **или** литерал v1; для поиска в палитре используется **разрешённый** заголовок. |
32| **`PaletteVisibility`** | `Normal` \| `Hidden` — скрыть низкоуровневые команды (`click_control`, `set_control_layout`, …) из палитры; в MCP они остаются. |
33| **`ModeRule`** | Правило доступности в текущем UI-режиме (см. §4). |
34
35Не дублируем здесь: **args** (уже в `IdeCommandsArgs`), **описание для MCP** (уже в XML-summary), **хоткей** (берётся из мерджа `Hotkeys/*.toml`, ключ = `command_id` в snake_case как в [UX §9](../ui-ux/command-palette-ux-concept-v1.md)).
36
37---
38
39## 3. Хоткеи
40
41- Разрешённая строка жеста: **`IHotkeyMap.TryGetGesture(command_id)`** после мерджа шип + AppData.
42- В **`IdeCommandUiMeta` хоткей не храним** — иначе два источника правды; в VM палитры: `meta + resolvedGesture`.
43
44---
45
46## 4. Доступность в режиме (`ModeRule`)
47
48Варианты от простого к точному (выбрать один стиль на v1):
49
501. **`AllModes`** — команда всегда в списке (может быть серая, если исполнение всё равно отклонит — по желанию).
512. **`AllowedFamilies(UiModeFamily[])`** — например только `Focus` для `focus_checkpoint`, только `Power` для части автономки; соответствие с продуктовыми семьями из [0010](../adr/0010-ui-modes-toml-configuration.md).
523. **`AllowedModeIds(string[])`** — если удобнее оперировать id из `UiModes/index.toml`, а не семьёй.
53
54Палитра при смене режима: фильтрует или помечает пункт **серым** + «недоступно в режиме …» ([UX](../ui-ux/command-palette-ux-concept-v1.md)).
55
56Тонкая связка с **`UiModeCapabilities`** (показывать quick action только если capability включена) — **опционально v2**: отдельное поле или подмножество команд с `WhenCapability(...)`.
57
58---
59
60## 5. Локализация
61
62- **`TitleKey`** → ресурсы `.resx` / существующий механизм Cascade; fallback: ключ или английская строка.
63- Категории для подзаголовка в списке — тоже ключи (`IdeCmdCategory.View`).
64
65---
66
67## 6. Поток данных (палитра)
68
691. Загрузить **`IReadOnlyList<IdeCommandUiMeta>`** где `PaletteVisibility == Normal`.
702. Сопоставить с **`IHotkeyMap`** по `CommandId`.
713. Текущий **`ResolvedMode`** / семья из VM → вычислить `IsAvailable` по `ModeRule`.
724. Поиск по **Title** (+ опционально `command_id`, категория).
735. Выполнение: **`ide_execute_command`** с `command_id` и пустыми/дефолтными `args` (для команд без обязательных аргументов) или открыть мастер (если когда-нибудь понадобится).
74
75---
76
77## 7. Валидация и дрейф
78
79- **Тест:** каждый **`IdeCommandUiMeta.CommandId`** существует в регистрации `IdeMcpCommandExecutor` (рефлексия или общий список констант `IdeCommands`).
80- **Тест (мягче):** каждый **публичный** `IdeCommands` константа либо имеет meta с `Hidden`, либо `Normal` — чтобы новая команда не забылась в палитре/скрытии осознанно.
81- Ключи в **`hotkeys.toml`**: опционально проверка «неизвестный `command_id`» в CI (предупреждение).
82
83---
84
85## 8. Почему не один гигантский enum «все команды»
86
87Сейчас **сотни** констант в `IdeCommands`, часть — чисто для автоматизации UI. Каталог метаданных:
88
89- либо **только для команд с `Normal`** (короткий список),
90- либо полный перечень с явным **`Hidden`** для каждой «не-палитровой» команды.
91
92Рекомендация v1: **явный список палитровых** + тест «новый id без meta не ломает сборку, но падает предупреждающий тест optional» — на выбор команды.
93
94---
95
96## 9. Связь с ADR 0013
97
98Формулировка «потребуется единый реестр» в [0013 § Последствия](../adr/0013-command-surface-and-discoverability.md) при этом означает:
99
100- **id + исполнение** — уже есть (`IdeCommands` + executor);
101- **единый реестр для UX палитры** — этот документ: **`IdeCommandUiMeta` + `Category` + `ModeRule` + локализация**, хоткеи снаружи.
102
103После реализации палитры можно добавить одну строку-отсылку из ADR 0013 на этот файл.
104
105---
106
107*Версия: 2026-04.*
108
View only · write via MCP/CIDE