| 1 | # ADR 0110: Рефакторинги Roslyn по диапазону — мост Intent Melody / IDE и Roslyn MCP |
| 2 | |
| 3 | **Статус:** Proposed |
| 4 | **Дата:** 2026-05-11 |
| 5 | ## Связанные ADR |
| 6 | |
| 7 | | ADR | Роль | |
| 8 | |-----|------| |
| 9 | | [0081](0081-parametric-intent-melodies-editor-line-ranges.md) | параметрический хвост `:start:end`, §3 про рефакторинги | |
| 10 | | [0109](0109-declarative-parametric-melody-catalog-toml-and-code-binders.md) | каталог `[[melody_root]]`, сборка args в коде | |
| 11 | | [0058](0058-agent-roslyn-mcp-coupling-settings-toml.md) | сопряжение агента с Roslyn MCP | |
| 12 | | [0030](0030-command-ids-hotkeys-and-ui-registry-layers.md) | `command_id` | |
| 13 | |
| 14 | ### Вне ADR |
| 15 | |
| 16 | | Документ | Роль | |
| 17 | |----------|------| |
| 18 | | [roslyn-mcp](../../../roslyn-mcp/README.md) | отдельный MCP-сервер | |
| 19 | |
| 20 | --- |
| 21 | ## Контекст |
| 22 | |
| 23 | Полноценные рефакторинги C# (Extract Method, Extract Interface и т.д.) в экосистеме Cascade реализованы **в процессе Roslyn MCP**: `roslyn_get_code_actions` и `roslyn_apply_code_action` с опциональным **диапазоном** (`end_line`, `end_column`) — см. схемы тулов и `ServiceLayer/CodeActions.cs` в репозитории **roslyn-mcp**. |
| 24 | |
| 25 | В **ядре CascadeIDE** не дублируется стек **Microsoft.CodeAnalysis.CSharp.Features** и MSBuildWorkspace для тех же операций: in-process редактор использует упрощённую семантику ([`CSharpLanguageService`](../../Services/CSharp/CSharpLanguageService.cs)) без полноценного конвейера code actions. |
| 26 | |
| 27 | Ранее обсуждались mnemonic вида `rmx` / `rix` ([0081](0081-parametric-intent-melodies-editor-line-ranges.md)); в коде **не хранить** заглушки без реального `command_id` — это рассинхрон с каталогом и палитрой. |
| 28 | |
| 29 | --- |
| 30 | |
| 31 | ## Проблема |
| 32 | |
| 33 | 1. Пользователь ожидает **одну строку** `c:…` или **IdeCommands**, ведущую к тому же результату, что ручной вызов Roslyn MCP. |
| 34 | 2. Дублировать реализацию рефакторингов внутри **CascadeIDE.exe** — дорого и расходится с единственным источником правды в **roslyn-mcp**. |
| 35 | 3. Нужно явное **архитектурное место** для будущего решения (мост, делегирование, настройки), без фиктивных записей в TOML. |
| 36 | |
| 37 | --- |
| 38 | |
| 39 | ## Решение (направление) |
| 40 | |
| 41 | 1. **Канон операций по диапазону в ядре IDE** на сегодня: уже реализованные слои — **выделить** (`select`), **заменить текст** (`apply_edit`), URL-портал и т.д. через каталог [0109](0109-declarative-parametric-melody-catalog-toml-and-code-binders.md). |
| 42 | 2. **Extract Method / Extract Interface и аналоги** до отдельного ADR **Accepted** не объявлять обязательными slug’ами в [`intent-melody-aliases.toml`](../../IntentMelody/intent-melody-aliases.toml). Варианты следующей итерации (взаимоисключающие или комбинируемые — решить при реализации): |
| 43 | - **Агент / внешний хост** вызывает **Roslyn MCP** с тем же solution/project path и диапазоном после того, как IDE выставила выделение (`c:els:…` или эквивалент). |
| 44 | - **Опциональный мост** в IDE: конфигурируемый путь (localhost MCP, stdio, будущий in-proc host) и тонкий `command_id`, который сериализует intent + диапазон и делегирует **roslyn-mcp** — см. [0058](0058-agent-roslyn-mcp-coupling-settings-toml.md). |
| 45 | - **Отказ от отдельных мнемоник** `rmx`/`rix` в пользу документированного сценария «выделить диапазон → code actions в Roslyn MCP». |
| 46 | |
| 47 | 3. Заглушки каталога **без** `command_id` в бандле **не использовать** — нарушают инвариант [0109](0109-declarative-parametric-melody-catalog-toml-and-code-binders.md) (исполнение через `command_id` + args). |
| 48 | |
| 49 | --- |
| 50 | |
| 51 | ## Последствия |
| 52 | |
| 53 | - Документ **0081** ссылкой на этот ADR фиксирует границу: **el\*** — в зоне продукта ядра; **r\*** и Roslyn-рефакторинги — **после** явного моста или только через внешний MCP. |
| 54 | - Реализация моста — отдельные коммиты: контракт args, настройки, тесты, при необходимости новые `IdeCommands` и регенерация ProtocolDocGen. |
| 55 | |
| 56 | --- |
| 57 | |
| 58 | ## Отклонённые альтернативы (кратко) |
| 59 | |
| 60 | | Альтернатива | Почему не сейчас | |
| 61 | |--------------|------------------| |
| 62 | | Встроить **CSharp.Features** + MSBuildWorkspace целиком в CascadeIDE | Дублирование **roslyn-mcp**, тяжёлый конвейер, размер деплоя | |
| 63 | | Оставить **rmx**/**rix** в TOML без исполнения | Путает палитру и аккорд ([0060](0060-keyboard-chord-stack-fms-tactical-strategic.md)) | |
| 64 | |