Forge
markdowndeeb25a2
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
331. Пользователь ожидает **одну строку** `c:…` или **IdeCommands**, ведущую к тому же результату, что ручной вызов Roslyn MCP.
342. Дублировать реализацию рефакторингов внутри **CascadeIDE.exe** — дорого и расходится с единственным источником правды в **roslyn-mcp**.
353. Нужно явное **архитектурное место** для будущего решения (мост, делегирование, настройки), без фиктивных записей в TOML.
36
37---
38
39## Решение (направление)
40
411. **Канон операций по диапазону в ядре IDE** на сегодня: уже реализованные слои — **выделить** (`select`), **заменить текст** (`apply_edit`), URL-портал и т.д. через каталог [0109](0109-declarative-parametric-melody-catalog-toml-and-code-binders.md).
422. **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
473. Заглушки каталога **без** `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
View only · write via MCP/CIDE