| 1 | # Протокол MCP: агент ↔ IDE |
| 2 | |
| 3 | Идея зафиксирована в каноне заметок (`knowledge/work/projects/door-to-singularity/cascade-ide/README.md` в репозитории **agent-notes**): IDE — тонкий клиент, которым управляет агент через MCP. Агент (в Cursor или во встроенном чате) вызывает инструменты MCP; IDE отображает результат и выполняет действия. |
| 4 | |
| 5 | ## Роль сторон |
| 6 | |
| 7 | - **Агент** — клиент MCP (Cursor, встроенный чат с моделью с tool calling и т.п.). |
| 8 | - **CascadeIDE** — MCP-сервер: предоставляет инструменты для управления редактором, брейкпоинтами, превью, подтверждениями. |
| 9 | |
| 10 | **Принцип по отладке:** состояние брейкпоинтов и останова, которое видит агент через тулы, должно в перспективе совпадать с тем, что видит человек в UI (единый слой). Подробнее: [debug-human-agent-parity-v1.md](debug-human-agent-parity-v1.md). |
| 11 | |
| 12 | Тулы-действия (ide_set_ui_theme, ide_click_control, ide_set_control_text и т.д.) при успехе возвращают строку `OK`, при ошибке — текст причины («Control not found», «Invalid JSON», «Missing argument: …» и т.п.). В ответе вызова при ошибке выставляется `IsError: true`, чтобы агент однозначно видел сбой и мог по сообщению скорректировать запрос. |
| 13 | |
| 14 | ## Транспорт |
| 15 | |
| 16 | - **stdio**: агент или **ProcessHost** (внешний процесс вроде Cursor, поднимающий процесс IDE) запускает CascadeIDE с аргументом `--mcp-stdio`. Обмен идёт по stdin/stdout процесса IDE. Так Cursor может добавить CascadeIDE как MCP-сервер в настройках и вызывать тулы от имени агента. **ProcessHost** здесь — про жизненный цикл процесса и транспорт, не про контролы кокпита (`EicasAlertsBarView` и т.д.); словарь: [ADR 0021 §1.1](adr/0021-pfd-mfd-cockpit-attention-model.md#glossary-channel-presentation). |
| 17 | |
| 18 | ### CLI контракта без MCP (ADR 0052) |
| 19 | |
| 20 | Без GUI и без stdio можно вывести **тот же JSON**, что вернул бы соответствующий тул: `CascadeIDE.exe --agent-contract [--workspace <dir>] <command>`. Команды без workspace: `get_ui_modes_diagnostics`, `get_supported_editor_languages`, `get_solution_info` (краткая сводка решения, паритет с `ide_get_solution_info`), `get_cockpit_surface` (только CDS — тот же объект, что поле `cockpit_surface` в ответе ниже), `get_ide_state` (полная сводка, паритет с `ide_get_ide_state`). Read-only git (тот же JSON, что `ide_git_*`): `git_status`, `git_diff`, `git_log`, `git_branch` (list), `git_show` — для них `--workspace` задаёт корень репозитория (по умолчанию текущий каталог). В CI: см. `.gitlab-ci.yml` (Windows runner), плюс привычный **`dotnet script`** — [`docs/samples/agent-contract-ci.csx`](samples/agent-contract-ci.csx); вариант на PowerShell: [`docs/samples/agent-contract-ci.ps1`](samples/agent-contract-ci.ps1). Подробности и снапшот-тесты: [ADR 0052](adr/0052-agent-contract-cli-and-snapshot-tests.md). |
| 21 | |
| 22 | ### Видимость MCP для агента (на будущее: свои MCP в IDE) |
| 23 | |
| 24 | У внешних хостов (например Cursor) встречается рассинхрон: сервер **подключён** (список тулов в UI есть), а **конкретный чат с ассистентом** не получает те же MCP в tool calling. Это не обязательно ошибка транспорта — разные контуры: глобальные настройки, воркспейс, режим Agent/Composer. |
| 25 | |
| 26 | **При проработке линии «пользователь подключает свои MCP в Cascade IDE»** имеет смысл заложить явно: |
| 27 | |
| 28 | 1. **Семантика состояния** — отдельно: «транспорт жив, `tools/list` отвечает» и «выбранный агент/сессия может вызывать эти серверы». |
| 29 | 2. **UI** — не опираться только на индикатор «подключено»; показывать, для **какого** контура (встроенный агент, чат, автономный режим) сервер разрешён. |
| 30 | 3. **Диагностика** — возможность увидеть тот же набор тулов, что увидит агент (тот же путь кода, что и при вызове), чтобы не гадать. |
| 31 | |
| 32 | **Паритет восстановления транспорта** (человек перезапускает MCP в хосте vs что может агент) — отдельная ось от паритета отладки; границы хоста и направление решений: [ADR 0043](adr/0043-mcp-transport-recovery-human-agent-parity.md). |
| 33 | |
| 34 | ### Внешние MCP в IDE (`settings.toml`): inline JSON или отдельный файл |
| 35 | |
| 36 | В `%LocalAppData%\CascadeIDE\settings.toml` в секции **`[mcp]`** задаётся inline JSON массива серверов (`external_servers_json`). В той же секции опционально **`external_servers_json_path`** — путь к **JSON-файлу** того же формата (массив объектов с `name`, `command`, `arguments`, `enabled`, опционально `toolPrefix`). Если путь непустой и файл **успешно читается**, его содержимое **подставляется вместо** inline JSON для `McpClientService` и Cursor ACP; иначе используется inline. Относительные пути считаются от каталога настроек (`…\CascadeIDE\`). Пример: [samples/settings.toml](samples/settings.toml). (Ранний вариант с отдельной секцией `[mcp_external_file]` заменён: ключ перенесён в `[mcp]`.) |
| 37 | |
| 38 | ### Переопубликация для Cursor (`mcp.json`) |
| 39 | |
| 40 | Чтобы процесс в Cursor указывал на свежий бинарник **без пробелов в пути**, в корне каталога **CascadeIDE** (рядом с `CascadeIDE.csproj`; в монорепе обычно `Financial/software/open/cascade-ide/`): |
| 41 | |
| 42 | - **`scripts/deploy/publish-debug.ps1`** — `dotnet publish` **Debug**, self-contained **win-x64**, вывод в `publish-debug/`, затем зеркалирование в **`D:\cascade-ide-debug`** по умолчанию (удобная цель для `command` в `mcp.json`). |
| 43 | - **`scripts/deploy/publish-release.ps1`** — то же для **Release** и цели **`D:\cascade-ide`** по умолчанию. |
| 44 | |
| 45 | Запуск из каталога проекта CascadeIDE: `.\scripts\deploy\publish-debug.ps1`. Опции **`-SkipDocGen`** и **`-Target`** — в комментариях у скриптов; пример фрагмента конфигурации — [mcp-cursor-example.json](mcp-cursor-example.json). |
| 46 | |
| 47 | ## Инструменты IDE (tools) |
| 48 | |
| 49 | | Имя | Описание | Аргументы | |
| 50 | |-----|----------|-----------| |
| 51 | | `ide_open_file` | Открыть файл в редакторе | `path` — полный путь к файлу | |
| 52 | | `ide_load_solution` | Загрузить workspace: решение (.sln/.slnx/.slnf), проект (.csproj/.fsproj) или каталог; обновить обозреватель | `path` — полный путь | |
| 53 | | `ide_select` | Выделить диапазон в редакторе | `file_path`, `start_line`, `start_column`, `end_line`, `end_column` (1-based) | |
| 54 | | `ide_get_editor_state` | Состояние редактора (файл, каретка, выделение) | —; возвращает JSON | |
| 55 | | `ide_get_open_document_text` | Полный текст любой **открытой** вкладки из модели документа (не только активной) | опционально `file_path` (иначе текущий), `max_chars` для обрезки; JSON: `file_path`, `length`, `truncated`, `is_dirty`, `text` или `error` | |
| 56 | | `ide_apply_edit` | Применить правку в открытом файле | `file_path`, `start_line`, `start_column`, `end_line`, `end_column`, `new_text` (1-based) | |
| 57 | | `ide_go_to_position` | Перейти на позицию (и опционально выделить) | `file_path`, `line`, `column`; опционально `end_line`, `end_column` | |
| 58 | | `ide_get_solution_info` | Информация о решении и открытом файле | —; возвращает JSON (solution_path, current_file_path, project_paths) | |
| 59 | | `ide_get_ide_state` | Единая сводка состояния IDE: solution/current file/selection/debug/build output/diagnostics; **`cockpit_surface`** — CDS-снимок кабины (тот же `CockpitSurfaceState`, что `BuildCockpitSurfaceSnapshot` / Skia) | —; возвращает JSON | |
| 60 | | `ide_get_ui_modes_diagnostics` | Диагностика загрузки UI-режимов: путь к `UiModes`, наличие `index.toml`/`Flight.toml`, источник бандла (TOML vs встроенный fallback), `ordered_mode_ids`, признак Flight в меню | —; возвращает JSON | |
| 61 | | `ide_build` | Запустить сборку решения (dotnet build). **Структурированный результат:** JSON: success, exit_code, errors[] (file, line, column?, code?, message), warnings[], raw_output (обрезано). Агент получает ошибки без парсинга лога. | —; возвращает JSON | |
| 62 | | `ide_get_build_output` | Текст панели «Вывод сборки» и цвета (background, foreground) | —; возвращает JSON: text, theme | |
| 63 | | `ide_run_tests` | Запустить тесты решения (dotnet test; при необходимости выполняет сборку). **Структурированный результат:** JSON: success, total, passed, failed, skipped, failed_tests[] (name, message?, duration_ms?). Агент получает упавшие тесты без парсинга лога. | —; возвращает JSON | |
| 64 | | `ide_run_affected_tests` | Запустить затронутые тесты по `changed_paths` (фильтр `FullyQualifiedName~...`). Если токены не извлечены — fallback на полный прогон. Возвращает JSON: `success`, `total`, `passed`, `failed`, `skipped`, `failed_tests[]`, `mode`, `filter`, `tokens`. | опционально `changed_paths` (массив путей) | |
| 65 | | `ide_run_code_cleanup` | Запустить code cleanup через `dotnet format` для текущего решения. Возвращает JSON: `success`, `exit_code`, `raw_output` (обрезано). | опционально `include_path` для точечной чистки через `--include` | |
| 66 | | `ide_get_code_metrics` | Метрики кода (LOC, class_count, method_count, cyclomatic complexity) для `current_file/file/path/solution` | опционально `scope`, `path`; возвращает JSON | |
| 67 | | `ide_git_status` | Git status в каталоге решения/workspace | —; возвращает JSON: success, exit_code, output | |
| 68 | | `ide_git_diff` | Git diff в каталоге решения/workspace | опционально `path`, `staged`; возвращает JSON | |
| 69 | | `ide_git_commit` | Git commit в каталоге решения/workspace | `message`, опционально `paths`; возвращает JSON | |
| 70 | | `ide_git_push` | Git push в каталоге решения/workspace | опционально `remote`, `branch`; возвращает JSON | |
| 71 | | `ide_focus_editor` | Передать фокус в редактор | — | |
| 72 | | `ide_get_ui_theme` | Параметры темы UI + глубокий снимок (resolved-тема, окно, регионы, **dock_open_documents**, **dock_text_editors**, **top_levels** — все открытые `Window`: `role` main/mfd_host/other, позиция, размер, активность) | —; возвращает JSON | |
| 73 | | `ide_set_ui_theme` | Применить тему UI на лету (JSON в формате get_ui_theme) | `theme` — JSON-строка | |
| 74 | | `ide_get_ui_layout` | Дерево элементов UI: тип, имя, видимость, границы (x,y,w,h), контент, дети | —; возвращает JSON | |
| 75 | | `ide_get_colors_under_cursor` | Цвета под курсором: background, foreground и effective_background, effective_foreground (как на экране) | —; возвращает JSON | |
| 76 | | `ide_get_control_appearance` | Снимок любого контрола: содержимое, фон, цвет текста, границы, шрифт, рамка. Без аргументов — под курсором; с `name` — по имени из layout | опционально `name`; возвращает JSON | |
| 77 | | `ide_set_control_layout` | Изменить положение и видимость контрола (margin, grid_row/column, canvas_left/top, dock, **visible** — true/false). После выбора layout — сохранить в БД/настройки и восстанавливать при запуске | `name`, `layout` (JSON) | |
| 78 | | `ide_set_control_text` | Установить текст в контрол с вводом (TextBox по имени) | `name`, `text` | |
| 79 | | `ide_click_control` | Клик по кнопке: без name — элемент под курсором (Button), с name — по имени | опционально `name` | |
| 80 | | `ide_send_keys` | Отправить сочетание клавиш в эффективный контрол (под курсором или по name). keys — текст: Ctrl+Enter, Alt+F4 | `keys`; опционально `name` | |
| 81 | | `ide_set_focus` | Передать фокус на эффективный контрол (по имени или под курсором); далее клавиши идут в него | опционально `name` | |
| 82 | | `ide_highlight_control` | Подсветить эффективный контрол рамкой (как в Comet), чтобы пользователь видел, где агент | опционально `name` | |
| 83 | | `ide_set_panel_size` | Изменить размер панели: pfd_region/mfd_region — width (px); build_output/terminal — height (px) | `panel`; опционально `width`, `height` | |
| 84 | | `ide_add_control` | **(Только Debug)** Добавить контрол в конец панели: Button, TextBlock или Border. parent_name, control_type, content, опционально name | `parent_name`, `control_type`; опционально `content`, `name` | |
| 85 | | `ide_set_breakpoint` | Поставить брейкпоинт: при необходимости загрузить найденное решение над файлом, записать точку для отладки MCP, открыть файл и перейти к строке | `file_path`, `line` (1-based), опционально `condition` | |
| 86 | | `ide_remove_breakpoint` | Снять брейкпоинт | `file_path`, `line` (1-based) | |
| 87 | | `ide_show_preview` | Показать Markdown в отдельном окне превью (планы, заметки, отчёты) | `title`, `content` (Markdown) | |
| 88 | | `ide_show_editor_preview` | Показать превью **текущего файла из редактора** в отдельном окне. Контент берётся из IDE (не передаётся по MCP) — удобно для длинных .md с таблицами. | — | |
| 89 | | `ide_request_confirmation` | Запросить подтверждение у пользователя (модальный диалог в UI) | `message`; возвращает `ok` или `cancel` | |
| 90 | | `ide_write_agent_notes` | Записать заметки агента. Агент сам решает, когда, что и в каком формате (markdown, json, текст). Хранятся в каталоге решения в `.cascade-ide/agent-notes.md`. Без открытого решения — ошибка. Для непрерывности между сессиями и до суммаризации. | `content` — полное содержимое (перезаписывает файл); при успехе — `OK` | |
| 91 | | `ide_read_agent_notes` | Прочитать заметки агента из `.cascade-ide/agent-notes.md`. Возвращает содержимое или пустую строку. Агент восстанавливает контекст в новом чате. | —; возвращает текст файла или `""` | |
| 92 | | `ide_execute_command` | Унифицированный вызов IDE-команды по коду (`command_id`) с аргументами (`args`) в формате выбранного инструмента. Нужен для единой точки входа (MCP/меню/хоткеи). | `command_id`, опционально `args` (JSON object) | |
| 93 | |
| 94 | **AEE (`ide_agent_*`) и `shell_escape_tier`:** в `settings.toml`, секция `[agent.environment]`, ключ `shell_escape_tier`: `deny` (по умолчанию), `l3_only`, `allow_with_audit`. При `deny` команды **`build`** / **`build_structured`** / **`run_tests`** / **`run_affected_tests`** / **`run_code_cleanup`**, если идут через `ide_execute_command` (или совместимые тулы вроде `ide_build`), возвращают JSON с **`error: shell_escape_blocked`**; для сборки и verify используй **`ide_agent_verify`**. В `l3_only` допускаются только прямые вызовы тестов; `allow_with_audit` всё пропускает и пишет аудит в trace. |
| 95 | |
| 96 | **`ide_agent_status`:** JSON включает `sandbox_run_directory`, `execution_channel` (очередь `BuildTestJobCoordinator`), `writes_invalidated_verify_epoch` (были сохранённые правки .cs/workspace во время активного verify). |
| 97 | |
| 98 | **Меню, тулбар, task bar и чат через `ide_execute_command`:** те же `command_id`, что заданы в частичном классе `IdeCommands` (`Services/IdeCommands.cs`, `Services/IdeCommands.*.cs`). |
| 99 | |
| 100 | **Имена MCP-тулов (Cursor):** только `A–Z`, `a–z`, `0–9`, `_`; точки в `command_id` на wire → `_` (`intercom.reveal_attachment` → `ide_intercom_reveal_attachment`). Длина `server`+`tool` ≤ 60 — длинные команды получают короткий alias (`chat_toggle_product_spine_in_agent_context` → `ide_chat_toggle_spine_ctx`). Канон: `Services/IdeMcpToolNaming.cs`. |
| 101 | |
| 102 | ### Подведение итогов сессии чата |
| 103 | |
| 104 | Агенту **не нужно** притворяться, что «всё помнит без сжатия»: для длинного треда нормально **предложить** явное подведение итогов. Поддерживаемый сценарий: |
| 105 | |
| 106 | 1. Вызвать `ide_execute_command` с `command_id` **`chat_export_readable`** и при необходимости `args`: `write_file` (boolean, по умолчанию false), `file_name` (string, опционально). При `write_file: true` файл попадает в `.cascade-ide/chat-sessions/exports/`; иначе содержимое приходит в ответе JSON. |
| 107 | 2. По экспорту (или по прочитанному файлу) дать **краткое смысловое резюме** — решения, открытые вопросы, следующие шаги. |
| 108 | 3. **Согласовать** с пользователем формулировку итога; при необходимости зафиксировать в `.cascade-ide/agent-notes.md` (`ide_write_agent_notes` / `ide_append_agent_notes`) или в KB по правилам канона (репозиторий agent-notes, `knowledge/`), а не подменять прозрачный экспорт непрозрачным «внутренним» сжатием истории. |
| 109 | |
| 110 | Пошаговый плейбук для агента: `knowledge/playbook-session-summary-and-chat-export-v1.md` (в каноне agent-notes — тот же путь под `knowledge/`). Если **MCP Cascade IDE в сессии нет**, тот же смысл (экспорт → резюме → согласование) выполняется **вне IDE**: поиск нужного `*.jsonl` в доступных `agent-transcripts` через `rg`/grep по запомненной фразе, затем читаемый экспорт скриптом **`tools/Export-CursorJsonlTranscript.ps1`** (в корне репозитория / в каноне agent-notes — каталог `tools/`; опционально отдельный архив вроде `cursor-agent-transcripts-archive`) — детали в том же плейбуке, **ветка B**. |
| 111 | |
| 112 | <!-- GENERATED:IdeCommands START --> |
| 113 | |
| 114 | > Этот блок сгенерирован из XML-doc в частичном классе `IdeCommands`: `Services/IdeCommands.cs` и `Services/IdeCommands.*.cs` (склейка как в генераторе). |
| 115 | |
| 116 | ### Core |
| 117 | |
| 118 | | command_id | Описание | |
| 119 | |-----------:|----------| |
| 120 | | `append_agent_notes` | Добавить блок в конец заметок агента. args: content:string; returns: text; example: {"content":"\\n# Update\\n..."}. | |
| 121 | | `build` | Сборка решения (структурированный результат). returns: json. | |
| 122 | | `build_structured` | Сборка решения (структурированный результат). То же, что `build`; выделено для совместимости/алиасов. returns: json. | |
| 123 | | `casa_field_infer` | CASA native hot path (decode + SN/CEN in C#). args: query?:string; returns: json; example: {"query":"согласно приказу"}. | |
| 124 | | `casa_field_query` | CASA field query: match KB concepts → doc_path + section. args: query:string, open?:boolean; returns: json; example: {"query":"import knowledge delta","open":true}. | |
| 125 | | `compact_hot_context` | Ужать hot-context (preview/apply). args: apply?:boolean; returns: json; example: {"apply":false}. | |
| 126 | | `extract_from_archive` | Поиск по архивной ревизии заметок с контекстом строк. args: query:string, revision_file?:string, head_limit?:integer, context_lines?:integer; returns: json; example: {"query":"ActiveProjectId","head_limit":10,"context_lines":2}. | |
| 127 | | `get_build_output` | Текст панели «Вывод сборки» + цвета оформления. returns: json. | |
| 128 | | `get_code_metrics` | Метрики кода (LOC/классы/методы/цикломатика). args: scope?:string, path?:string; returns: json; example: {"scope":"solution","path":"."}. | |
| 129 | | `ide_agent_cancel` | Cancel active verify. returns: json. | |
| 130 | | `ide_agent_last` | Last verify run summary. returns: json. | |
| 131 | | `ide_agent_sandbox_prepare` | Prepare sandbox. args: profile:string, workspace_root:string; returns: json; example: {"profile":"agent_ephemeral"}. | |
| 132 | | `ide_agent_status` | AEE status snapshot: active, run_id, verify_snapshot_id, policy, sandbox_profile, sandbox_run_directory, execution_channel (supervised build host kind), writes_invalidated_verify_epoch. returns: json. | |
| 133 | | `ide_agent_verify` | Verification ladder. args: policy:string, sandbox_profile:string, solution_path:string; returns: json; example: {"policy":"standard"}. | |
| 134 | | `ide_agent_verify_batch` | Batch verify (W6): policy, sandbox_profile, solution_path, use_worktree. returns: json. | |
| 135 | | `list_agent_notes_revisions` | Список ревизий заметок агента. args: limit?:integer; returns: json; example: {"limit":20}. | |
| 136 | | `memory_health` | Health-check памяти: размер hot-context и рекомендации. args: active_scope?:string; returns: json; example: {"active_scope":"door-to-singularity"}. | |
| 137 | | `read_agent_notes` | Прочитать заметки агента из каталога решения. returns: text. | |
| 138 | | `read_hot_context` | Прочитать только hot-context (L0/L1) без архивного хвоста. args: active_scope?:string; returns: json; example: {"active_scope":"door-to-singularity"}. | |
| 139 | | `rollback_agent_notes` | Откатить заметки к ревизии (или к последней). args: revision_file?:string; returns: text; example: {"revision_file":"20260402-120000-write-acde123.md"}. | |
| 140 | | `route_context` | Router-first контекст пакет по запросу. args: query:string, active_scope?:string, max_sections?:integer, max_chars?:integer; returns: json; example: {"query":"CascadeIDE notes structure","max_sections":5,"max_chars":12000}. | |
| 141 | | `run_affected_tests` | Запустить затронутые тесты по changed_paths (или fallback на полный прогон). args: changed_paths?:string[]; returns: json; example: {"changed_paths":["a.cs","b.cs"]}. | |
| 142 | | `run_code_cleanup` | Запустить code cleanup (`dotnet format`). args: include_path?:string; returns: json; example: {"include_path":"src"}. | |
| 143 | | `run_tests` | Запустить тесты решения. returns: json. | |
| 144 | | `search_agent_notes` | Поиск по заметкам агента (case-insensitive) с возвратом совпадающих строк. args: query:string, head_limit?:integer; returns: json; example: {"query":"ActiveProjectId","head_limit":20}. | |
| 145 | | `upsert_agent_notes_section` | Вставить/обновить секцию заметок агента по section_id (маркерный блок). args: section_id:string, content:string; returns: text; example: {"section_id":"active","content":"ActiveProjectId: cascade-ide"}. | |
| 146 | | `write_agent_notes` | Записать заметки агента в каталог решения. args: content:string; returns: text; example: {"content":"notes"}. | |
| 147 | |
| 148 | ### Меню «Файл» / приложение (те же RelayCommand, что в UI) |
| 149 | |
| 150 | | command_id | Описание | |
| 151 | |-----------:|----------| |
| 152 | | `create_new_solution_dialog` | Создать новое пустое решение: диалог «Сохранить как» для `.sln`, затем `dotnet new sln` (шаблон SDK, не пакеты из NuGet). returns: text. | |
| 153 | | `exit_application` | Закрыть приложение (как меню Файл → Выход). returns: none. | |
| 154 | | `open_file_dialog` | Открыть диалог выбора файла и показать его в редакторе (как меню Файл → Открыть файл...). returns: text. | |
| 155 | | `open_folder_dialog` | Открыть диалог выбора папки как workspace (как меню Файл → Открыть папку...). returns: text. | |
| 156 | | `open_solution_dialog` | Открыть диалог выбора решения (как меню Файл → Открыть решение...). returns: text. | |
| 157 | |
| 158 | ### Вид: панели (явная установка + переключатели) |
| 159 | |
| 160 | | command_id | Описание | |
| 161 | |-----------:|----------| |
| 162 | | `set_git_panel_visible` | Показать/скрыть панель Git (нижняя вкладка). args: visible:boolean; returns: text; example: {"visible":true}. | |
| 163 | | `set_instrumentation_dock_visible` | Показать/скрыть док инструментирования (Events/Tests/Debug). args: visible:boolean; returns: text; example: {"visible":true}. | |
| 164 | | `set_mfd_region_expanded` | Развернуть/свернуть регион Mfd в main grid. args: visible:boolean; returns: text; example: {"visible":true}. | |
| 165 | | `set_pfd_region_expanded` | Развернуть/свернуть регион Pfd в main grid (карта намерений в зоне Pfd). args: visible:boolean; returns: text; example: {"visible":true}. | |
| 166 | | `toggle_git_panel` | Переключить видимость панели Git (toggle). returns: text. | |
| 167 | | `toggle_instrumentation_dock` | Переключить видимость дока инструментирования (toggle). returns: text. | |
| 168 | | `toggle_mfd_region_expanded` | Переключить развёрнут/свёрнут регион Mfd (toggle). returns: text. | |
| 169 | |
| 170 | ### Вид: режим |
| 171 | |
| 172 | | command_id | Описание | |
| 173 | |-----------:|----------| |
| 174 | | `close_correspondence_page` | Закрыть страницу Correspondence (CRS) — первая другая разрешённая страница Mfd. returns: text. | |
| 175 | | `close_environment_readiness_page` | Перейти с страницы «готовность окружения» на первую другую разрешённую страницу вторичного контура. returns: text. | |
| 176 | | `cycle_ui_mode` | Циклически переключить UI mode (hotkey). returns: text. | |
| 177 | | `focus_solution_explorer_filter` | Фокус в фильтр Solution Explorer на MFD (Ctrl+;). returns: text. | |
| 178 | | `set_mfd_shell_page` | Активная страница оболочки Mfd: имя значения MfdShellPage (Chat, Terminal, …). Якорь на экране — пресет (v1 — колонка зоны Mfd). args: page:string; returns: text; example: {"page":"Chat"}. | |
| 179 | | `set_secondary_shell_page` | Устаревший идентификатор MCP-команды; поведение совпадает с `set_mfd_shell_page`. args: page:string; returns: text; example: {"page":"Chat"}. | |
| 180 | | `show_correspondence_page` | Показать страницу Correspondence (CRS) во вторичном контуре (ADR 0156). Разворачивает регион Mfd при необходимости. returns: text. | |
| 181 | | `show_environment_readiness_page` | Показать страницу «готовность окружения» во вторичном контуре (зона Mfd; ADR 0023). Разворачивает регион Mfd при необходимости. returns: text. | |
| 182 | | `show_hybrid_index_page` | Показать страницу Hybrid Codebase Index (HCI) во вторичном контуре/MFD. Разворачивает регион Mfd при необходимости. returns: text. | |
| 183 | | `show_markdown_preview_page` | Показать Markdown preview как страницу во вторичном контуре/MFD. returns: text. | |
| 184 | | `show_web_ai_portal_page` | Показать страницу веб-портала (WebView + мост инструментов ADR 0108) во вторичном контуре/MFD. Разворачивает регион Mfd при необходимости. returns: text. | |
| 185 | | `toggle_command_palette` | Открыть или закрыть палитру команд (как Ctrl+Q / пункт меню «Вид»). returns: text. | |
| 186 | | `workspace_go_to_file` | Go to File — палитра с префиксом `f:` (Ctrl+P). returns: text. | |
| 187 | |
| 188 | ### Вид: тема |
| 189 | |
| 190 | | command_id | Описание | |
| 191 | |-----------:|----------| |
| 192 | | `apply_cursor_like_theme` | Применить тему «как Cursor». returns: text. | |
| 193 | | `apply_dark_theme` | Применить тёмную тему. returns: text. | |
| 194 | | `apply_light_theme` | Применить светлую тему. returns: text. | |
| 195 | | `apply_power_classic_theme` | Применить классическую Power-тему (циан). returns: text. | |
| 196 | | `export_expanded_markdown` | Экспортировать текущий Markdown с развёрнутыми include-директивами. returns: text. | |
| 197 | | `open_theme_file_dialog` | Открыть диалог выбора файла темы. returns: text. | |
| 198 | |
| 199 | ### Вид: язык UI |
| 200 | |
| 201 | | command_id | Описание | |
| 202 | |-----------:|----------| |
| 203 | | `reset_ui_language_to_system` | Сбросить язык UI к системному. returns: text. | |
| 204 | | `set_ui_language` | Установить язык UI. args: culture:string; returns: text; example: {"culture":"ru-RU"}. | |
| 205 | |
| 206 | ### Меню: превью, настройки, справка |
| 207 | |
| 208 | | command_id | Описание | |
| 209 | |-----------:|----------| |
| 210 | | `about` | Показать диалог «О программе». returns: text. | |
| 211 | | `open_preview_window` | Открыть отдельное окно превью (Markdown). returns: text. | |
| 212 | | `open_settings` | Открыть окно настроек. returns: text. | |
| 213 | | `toggle_mfd_host_window` | Открыть или активировать окно-хост зоны Mfd, если строка `presentation` / `zone_screen_layout` задаёт топологию с выносом Mfd (ADR 0017); иначе не выполняется. Отдельного пункта меню нет — источник истины раскладка. returns: text. | |
| 214 | | `toggle_pm_split_host_window` | Открыть или активировать окно сплита P+M при пресете `(xP+yM)(F)` / `(F)(xP+yM)` (ADR 0017). returns: text. | |
| 215 | |
| 216 | ### Тулбар: показать панели / скрыть вывод сборки |
| 217 | |
| 218 | | command_id | Описание | |
| 219 | |-----------:|----------| |
| 220 | | `hide_build_output_panel` | Скрыть панель вывода сборки (toolbar). returns: text. | |
| 221 | | `show_build_output_panel` | Явно показать панель вывода сборки (toolbar). returns: text. | |
| 222 | | `show_chat_page` | Развернуть регион Mfd и перейти на страницу Chat (toolbar). returns: text. | |
| 223 | | `show_pfd_region_panel` | Развернуть регион Pfd / карту намерений (toolbar). returns: text. | |
| 224 | | `show_related_files_mfd_page` | Развернуть регион Mfd и открыть страницу «Связанные файлы» (related; workspace). returns: text. | |
| 225 | | `show_solution_explorer_page` | Развернуть регион Mfd и перейти на страницу обозревателя решения (toolbar). returns: text. | |
| 226 | | `show_terminal_panel` | Явно показать терминал (toolbar). returns: text. | |
| 227 | |
| 228 | ### Тулбар: группы редакторов |
| 229 | |
| 230 | | command_id | Описание | |
| 231 | |-----------:|----------| |
| 232 | | `build_solution_ui` | Кнопка «Собрать» в тулбаре: dotnet build в панель вывода (не structured build). returns: text. | |
| 233 | | `cockpit.open_command_line` | Открыть Cockpit Command Line активного Forward host (Intercom: полоса над composer). args: initial_text?:string; returns: text; example: {"initial_text":"/intercom message anchors list"}. | |
| 234 | | `get_correspondence_context` | JSON: слои correspondence, feature, forward ADR, reverse anchors для файла (ADR 0156). args: file_path?:string; returns: json; example: {"file_path":"Features/WorkspaceNavigation/Application/DocReverseAnchorResolver.cs"}. | |
| 235 | | `open_docs_template` | Открыть шаблон документации из `docs/templates` в Markdown Preview. args: path?:string; returns: text; example: {"path":"docs/templates/feature.md"}. | |
| 236 | | `open_workspace_adr_correspondence` | Открыть correspondence ADR для текущего файла (как клик по строке ADR на PFD). returns: text. | |
| 237 | | `open_workspace_feature_docs` | Открыть документацию фичи для текущего файла (как клик по строке Feature на PFD); при множестве docs — pick. returns: text. | |
| 238 | | `set_dual_editor_group` | Две группы редакторов (2-up). returns: text. | |
| 239 | | `set_single_editor_group` | Одна группа редакторов (1-up). returns: text. | |
| 240 | | `set_triple_editor_group` | Три группы редакторов (3-up). returns: text. | |
| 241 | |
| 242 | ### DAP / netcoredbg (паритет с dotnet-debug-mcp) |
| 243 | |
| 244 | | command_id | Описание | |
| 245 | |-----------:|----------| |
| 246 | | `add_control` | Добавить контрол в UI (Debug). args: parent_name:string, control_type:string, content?:string, name?:string; returns: text; example: {"parent_name":"Root","control_type":"TextBlock","content":"Hi"}. | |
| 247 | | `click_control` | Клик по кнопке (под курсором или по имени). args: name?:string; returns: text; example: {"name":"BuildButton"}. | |
| 248 | | `debug_attach` | Подключиться к процессу по PID. args: workspace_path:string, process_id:integer, target_path?:string, netcoredbg_path?:string; returns: text; example: {"workspace_path":"D:\\\\proj","process_id":12345}. | |
| 249 | | `debug_continue` | Продолжить выполнение (DAP continue). returns: text. | |
| 250 | | `debug_launch` | Запустить отладку (netcoredbg DAP). args: workspace_path?:string, target_path?:string, profile_name?:string, netcoredbg_path?:string, program_args?:string[] . returns: text; example: {"workspace_path":"D:\\\\proj","target_path":"samples\\\\DebugTarget\\\\bin\\\\Debug\\\\net10.0\\\\DebugTarget.dll"}. | |
| 251 | | `debug_ping` | Проверка доступности встроенной отладки. returns: text. | |
| 252 | | `debug_stack_trace` | Стек вызовов (DAP stackTrace). returns: text. | |
| 253 | | `debug_step_into` | Шаг с заходом (DAP stepIn). returns: text. | |
| 254 | | `debug_step_out` | Шаг с выходом (DAP stepOut). returns: text. | |
| 255 | | `debug_step_over` | Шаг через строку (DAP next). returns: text. | |
| 256 | | `debug_stop` | Завершить сессию отладки (dispose DAP). returns: text. | |
| 257 | | `debug_stop_context` | Один снимок после stopped: meta + stack + variables (Core DapStopContext). args: frame_index?:integer, fast?:boolean, max_depth?:integer, max_children_per_node?:integer, time_budget_ms?:integer, format?:string, json_indented?:boolean; returns: text; example: {"frame_index":0,"fast":true}. | |
| 258 | | `debug_variables` | Переменные кадра. args: frame_index?:integer; returns: text; example: {"frame_index":0}. | |
| 259 | | `fetch_web_public_url` | Загрузить публичный HTTPS-документ по URL и вернуть тело как читаемый текст (HTML упрощается до текста, поле extraction в JSON). Запрос из машины оператора; только https; локальные/частные хосты блокируются базово (не полная SSRF-защита). args: url:string, max_chars?:integer; returns: json; example: {\"url\":\"https://learn.microsoft.com/en-us/dotnet/\"}. | |
| 260 | | `forge.artifact.goto` | Открыть forge artifact по bracket `[FRG:…]` (DOI forge.artifact.goto). args: bracket:string, base_url?:string, select_code?:boolean; returns: text; example: {"bracket":"[FRG:issue:1]","select_code":true}. | |
| 261 | | `forge_lens.auth_status` | Статус Forge Lens auth для host. args: base_url?:string; returns: text; example: {"base_url":"http://127.0.0.1:8770"}. | |
| 262 | | `forge_lens.connect` | Device login к forge (браузер + approve, как Intercom OAuth). args: base_url?:string; returns: text; example: {"base_url":"http://127.0.0.1:8770"}. | |
| 263 | | `forge_lens.create_issue` | Создать issue в Forge (write gate B). args: title:string, body?:string, repo?:string, base_url?:string, file_path?:string, line_start?:integer, line_end?:integer, member_key?:string; returns: text; example: {"title":"Zone leak","file_path":"src/Zones.cs","line_start":10}. | |
| 264 | | `forge_lens.create_merge_request` | Создать merge request в Forge. args: title:string, source_branch:string, target_branch?:string, repo?:string, base_url?:string, file_path?:string, line_start?:integer, line_end?:integer; returns: text; example: {"title":"feat: zones","source_branch":"feat/zones"}. | |
| 265 | | `forge_lens.disconnect` | Удалить сохранённый Bearer для forge host. args: base_url?:string; returns: text; example: {"base_url":"http://127.0.0.1:8770"}. | |
| 266 | | `get_colors_under_cursor` | Цвета под курсором (прямые и effective). returns: json. | |
| 267 | | `get_control_appearance` | Снимок внешнего вида контрола (под курсором или по имени). args: name?:string; returns: json; example: {"name":"BuildButton"}. | |
| 268 | | `get_debug_snapshot` | JSON: канонический снимок встроенной DAP-сессии (ADR 0002). returns: json. | |
| 269 | | `get_supported_editor_languages` | Список поддерживаемых языков подсветки редактора. returns: json. | |
| 270 | | `get_ui_layout` | Дерево UI по всем окнам верхнего уровня: JSON с массивом windows (role, window_type, title, is_active, root — то же дерево, что раньше для MainWindow). returns: json. | |
| 271 | | `get_ui_theme` | Снимок темы UI и лэйаута (включая resolved-ресурсы). returns: json. | |
| 272 | | `git_branch` | Git branch в каталоге решения/workspace. args: action?:string, name?:string, start_point?:string, force?:boolean; returns: json; example: {"action":"list"}. | |
| 273 | | `git_commit` | Git commit в каталоге решения/workspace. args: message:string, paths?:string[]; returns: text; example: {"message":"chore: update","paths":["a.txt"]}. | |
| 274 | | `git_diff` | Git diff в каталоге решения/workspace. args: path?:string, staged?:boolean; returns: json; example: {"path":"README.md","staged":false}. | |
| 275 | | `git_fetch` | Git fetch в каталоге решения/workspace. args: remote?:string, all?:boolean, prune?:boolean, dry_run?:boolean; returns: json; example: {"prune":true,"dry_run":true}. | |
| 276 | | `git_log` | Git log в каталоге решения/workspace. args: n?:integer; returns: json; example: {"n":20}. | |
| 277 | | `git_preflight` | Git preflight в каталоге решения/workspace. args: staged?:boolean, include_untracked?:boolean, include_patches?:boolean; returns: json; example: {"staged":false,"include_untracked":true,"include_patches":true}. | |
| 278 | | `git_preflight_fix_safe` | Git preflight safe-fix (renormalize) в каталоге решения/workspace. args: include_patches?:boolean; returns: json; example: {"include_patches":true}. | |
| 279 | | `git_pull` | Git pull в каталоге решения/workspace. args: remote?:string, branch?:string, ff_only?:boolean, dry_run?:boolean; returns: json; example: {"ff_only":true}. | |
| 280 | | `git_push` | Git push в каталоге решения/workspace. args: remote?:string, branch?:string, dry_run?:boolean; returns: text; example: {"remote":"origin","branch":"main","dry_run":true}. | |
| 281 | | `git_show` | Git show в каталоге решения/workspace. args: rev:string, path?:string, stat_only?:boolean; returns: json; example: {"rev":"HEAD","stat_only":true}. | |
| 282 | | `git_status` | Git status в каталоге решения/workspace (git status --short --branch). returns: json. | |
| 283 | | `git_submodule` | Git submodule в каталоге решения/workspace. args: action?:string, path?:string, recursive?:boolean; returns: json; example: {"action":"status"}. | |
| 284 | | `highlight_control` | Подсветить контрол рамкой в том окне, где он находится (главное, окно-хост Mfd и т.д.). args: name?:string; returns: text; example: {"name":"BuildButton"}. | |
| 285 | | `search_web_public_query` | Краткая веб-справка через открытый Instant Answer DuckDuckGo (запрос уходит во внешнюю сеть; не замена полнотекстового поиска). args: query:string; returns: json; example: {\"query\":\"C# file scoped types\"}. | |
| 286 | | `send_keys` | Отправить хоткей в контрол. args: keys:string, name?:string; returns: text; example: {"keys":"Ctrl+S"}. | |
| 287 | | `set_control_layout` | Изменить раскладку/позицию контрола. args: name:string, layout:string; returns: text; example: {"name":"BuildButton","layout":"{}"}. | |
| 288 | | `set_control_text` | Установить текст в контроле ввода. args: name:string, text:string; returns: text; example: {"name":"ChatInput","text":"hi"}. | |
| 289 | | `set_focus` | Передать фокус контролу (под курсором или по имени). args: name?:string; returns: text; example: {"name":"Editor"}. | |
| 290 | | `set_panel_size` | Изменить размер панели. args: panel:string, width?:integer, height?:integer; returns: text; example: {"panel":"terminal","height":300}. | |
| 291 | | `set_ui_theme` | Применить тему UI из JSON. args: theme:string; returns: text; example: {"theme":"{}"}. | |
| 292 | |
| 293 | ### Hybrid Codebase Index (паритет tool name с внешним MCP) |
| 294 | |
| 295 | | command_id | Описание | |
| 296 | |-----------:|----------| |
| 297 | | `append_knowledge_file` | Добавить блок в конец knowledge-файла. args: file_path:string, content:string, knowledge_path?:string, knowledge_root_id?:string, save_revision?:boolean; returns: text; example: {"file_path":"META/x.md","content":"more","save_revision":true}. | |
| 298 | | `codebase_index_explain` | Explain одного hit (как tool `codebase_index_explain`). hit_id обязателен. args: workspace_path?:string, solution_path?:string, hit_id:integer; returns: json; example: {"hit_id":1}. | |
| 299 | | `codebase_index_reindex` | Переиндексация: по умолчанию инкремент (как tool `codebase_index_reindex`); full_rebuild=true — полная перестройка. args: workspace_path?:string, solution_path?:string, full_rebuild?:boolean; returns: json; example: {}. | |
| 300 | | `codebase_index_search` | Гибридный поиск по индексу (как tool `codebase_index_search`). query обязателен; workspace/solution по умолчанию — текущее решение. args: workspace_path?:string, solution_path?:string, query:string, top_n?:integer, semantic?:boolean, alpha?:number, beta?:number, vec_top_k?:integer, path_prefix?:string, exclude_path_prefixes?:string[], extensions?:string[]; returns: json; example: {"query":"HybridIndexOrchestrator"}. | |
| 301 | | `codebase_index_status` | Статус локального индекса (как tool `codebase_index_status`). workspace_path и solution_path опциональны — по умолчанию текущее открытое решение. args: workspace_path?:string, solution_path?:string; returns: json; example: {"workspace_path":"D:\\repo"}. | |
| 302 | | `delete_knowledge_file` | Удалить knowledge-файл. args: file_path:string, knowledge_path?:string, knowledge_root_id?:string; returns: text; example: {"file_path":"tmp.md"}. | |
| 303 | | `delete_knowledge_section` | Удалить секцию из knowledge-файла. args: file_path:string, section_id:string, knowledge_path?:string, knowledge_root_id?:string; returns: text; example: {"file_path":"index.md","section_id":"foo"}. | |
| 304 | | `editor.reveal_code` | Reveal в редакторе по bracket-ссылке (ADR 0131). args: code_ref:string, active_file?:string, duration_ms?:integer; returns: text; example: {"code_ref":"[M:Run]","active_file":"src/Foo.cs","duration_ms":4000}. | |
| 305 | | `editor.select_code` | Select в редакторе по bracket-ссылке (ADR 0131). args: code_ref:string, active_file?:string, duration_ms?:integer; returns: text; example: {"code_ref":"[M:Run]","active_file":"src/Foo.cs"}. | |
| 306 | | `intercom.agent_provision` | Provision agent account. args: display_name:string; returns: text; example: {"display_name":"Nova"}. | |
| 307 | | `intercom.attach_diagnostic` | Прикрепить диагностику @ caret к черновику. returns: text. | |
| 308 | | `intercom.attach_scope` | Прикрепить syntax scope @ caret к черновику (ADR 0128 H0b). returns: text. | |
| 309 | | `intercom.attach_selection` | Прикрепить выделение редактора к черновику Intercom (ADR 0128 H0). returns: text. | |
| 310 | | `intercom.connect_team` | OAuth Connect к team Intercom service (ADR 0144). returns: text. | |
| 311 | | `intercom.disconnect_team` | Disconnect team transport и очистка JWT. returns: text. | |
| 312 | | `intercom.message_relate` | Явная связь диапазона gutter-сообщений с кодом (ADR 0137). args: start_ordinal:integer, end_ordinal?:integer, use_selection?:boolean, code_ref?:string, anchor_json?:object, file?:string, line_start?:integer, line_end?:integer; returns: json; example: {"start_ordinal":3,"end_ordinal":5,"use_selection":true}. | |
| 313 | | `intercom.messages_for_code` | Сообщения активной detail-ветки по фрагменту кода (ADR 0137 inferred + explicit relate). args: use_selection?:boolean, code_ref?:string, anchor_json?:object, file?:string, line_start?:integer, line_end?:integer; returns: json; example: {"use_selection":true}. | |
| 314 | | `intercom.reveal_attachment` | Reveal из ленты по AttachmentAnchor: open + re-resolve + highlight (ADR 0128 §8, 0130). args: anchor_json?:object, file?:string, line_start?:integer, line_end?:integer, member_key?:string, syntax_scope?:object, duration_ms?:integer, select?:boolean; если select опущен — дефолт из settings [intercom.attachments.code].navigate; returns: text; example: {"file":"src/Foo.cs","line_start":10,"line_end":25}. | |
| 315 | | `intercom.server_start` | Запустить intercom-service. args: base_url?:string; returns: text; example: {"base_url":"http://127.0.0.1:5080"}. | |
| 316 | | `intercom.server_status` | Статус локального intercom-service (ADR 0147). returns: text. | |
| 317 | | `intercom.server_stop` | Остановить intercom-service. returns: text. | |
| 318 | | `intercom.team_members` | Список members team. returns: text. | |
| 319 | | `list_knowledge_files` | Список knowledge-файлов. args: subdir?:string, knowledge_path?:string, knowledge_root_id?:string; returns: json; example: {"subdir":"work","knowledge_root_id":"group"}. | |
| 320 | | `read_knowledge_file` | Прочитать knowledge-файл. Корень: knowledge_path, knowledge_root_id (group, …) или primary из TOML. args: file_path:string, knowledge_path?:string, knowledge_root_id?:string, offset?:integer, limit?:integer; returns: text; example: {"file_path":"META/integrity-core.md","offset":2,"limit":20}. | |
| 321 | | `upsert_knowledge_section` | Вставить/обновить секцию в knowledge-файле по section_id. args: file_path:string, section_id:string, content:string, knowledge_path?:string, knowledge_root_id?:string, save_revision?:boolean; returns: text; example: {"file_path":"index.md","section_id":"foo","content":"body"}. | |
| 322 | | `write_knowledge_file` | Записать knowledge-файл (полная замена). Запись только в primary; read-only roots отклоняются. args: file_path:string, content:string, knowledge_path?:string, knowledge_root_id?:string, save_revision?:boolean; returns: text; example: {"file_path":"META/x.md","content":"# Hi","save_revision":true}. | |
| 323 | |
| 324 | ### MCP / редактор |
| 325 | |
| 326 | | command_id | Описание | |
| 327 | |-----------:|----------| |
| 328 | | `apply_edit` | Применить текстовую правку в открытом документе. args: file_path:string, start_line:integer, start_column:integer, end_line:integer, end_column:integer, new_text:string; returns: text; example: {"file_path":"C:\\tmp\\a.cs","start_line":1,"start_column":1,"end_line":1,"end_column":1,"new_text":"// hi\n"}. | |
| 329 | | `get_editor_content_range` | Текст активного редактора по диапазону строк (1-based). args: start_line:integer, end_line:integer; returns: json; example: {"start_line":1,"end_line":40}. | |
| 330 | | `get_editor_state` | Состояние активного редактора: файл, каретка, выделение. args: max_preview_chars?:integer; returns: json; example: {"max_preview_chars":0}. | |
| 331 | | `get_open_document_text` | Полный текст открытого документа по пути (или текущего). Модель вкладки, не снимок темы. returns: text. | |
| 332 | | `go_to_position` | Перейти на позицию (и опционально выделить диапазон). args: file_path:string, line:integer, column:integer, end_line?:integer, end_column?:integer; returns: text; example: {"file_path":"C:\\tmp\\a.cs","line":10,"column":1}. | |
| 333 | | `list_tools` | Список MCP-тулов, которые IDE публикует (name/description/inputSchema). returns: json. | |
| 334 | | `load_solution` | Загрузить решение (.sln/.slnx/.slnf), один проект (.csproj/.fsproj) или каталог как workspace (дерево без .sln) — обновить обозреватель. args: path:string; returns: text; example: {"path":"D:\\repo\\MyApp.csproj"}. | |
| 335 | | `open_file` | Открыть файл в редакторе IDE. args: path:string; returns: text; example: {"path":"C:\\tmp\\a.txt"}. | |
| 336 | | `ping` | Живость MCP-хоста IDE (без аргументов). Имя MCP-тула: `ide_ping`. returns: json. | |
| 337 | | `read_workspace_file` | Прочитать файл workspace с диска (не только открытые вкладки). args: file_path:string, offset?:integer, limit?:integer, max_chars?:integer; returns: json; example: {"file_path":"src/Program.cs"}. | |
| 338 | | `remove_breakpoint` | Снять брейкпоинт. args: file_path:string, line:integer; returns: text; example: {"file_path":"C:\\tmp\\a.cs","line":42}. | |
| 339 | | `request_confirmation` | Запросить подтверждение у пользователя. args: message:string; returns: text; example: {"message":"Продолжить?"}. Возвращает `ok`/`cancel`. | |
| 340 | | `restart_mcp_clients` | Пересоздать клиентов внешних MCP и сбросить сессию Cursor ACP (после сбоев транспорта). Имя MCP-тула: `ide_restart_mcp_clients`. returns: json. | |
| 341 | | `reveal_editor_range` | Показать диапазон строк в редакторе transient-подсветкой без изменения selection (ADR 0130). args: file_path:string, start_line?:integer, end_line?:integer, member_key?:string, syntax_scope?:object, duration_ms?:integer; returns: text; example: {"file_path":"C:\\tmp\\a.cs","start_line":10,"end_line":25,"duration_ms":4000}. | |
| 342 | | `save_document` | Сохранить документ на диск: буфер открытой вкладки или полная замена content. args: file_path?:string, content?:string; returns: json; example: {"file_path":"src/Program.cs"}. | |
| 343 | | `select` | Выделить диапазон в редакторе (1-based). args: file_path:string, start_line:integer, start_column:integer, end_line:integer, end_column:integer; returns: text; example: {"file_path":"C:\\tmp\\a.cs","start_line":1,"start_column":1,"end_line":1,"end_column":10}. | |
| 344 | | `set_breakpoint` | Поставить брейкпоинт: при необходимости загрузка найденного .sln/.slnx/.slnf, запись в JSON отладки, открытие файла и переход к строке. args: file_path:string, line:integer, condition?:string; returns: text; example: {"file_path":"C:\\tmp\\a.cs","line":42}. | |
| 345 | | `show_editor_preview` | Показать превью текущего файла из редактора в отдельном окне (контент берётся из IDE). returns: text. | |
| 346 | | `show_preview` | Показать Markdown-превью в отдельном окне. args: title:string, content:string; returns: text; example: {"title":"Plan","content":"- step 1\n- step 2"}. | |
| 347 | |
| 348 | ### Focus / Power / автономка / чат |
| 349 | |
| 350 | | command_id | Описание | |
| 351 | |-----------:|----------| |
| 352 | | `cancel_focus_step` | Отменить текущий шаг плана (Focus). returns: text. | |
| 353 | | `confirm_focus_step` | Подтвердить текущий шаг плана (Focus). returns: text. | |
| 354 | | `emergency_stop` | Экстренно остановить автономные действия/выполнение (Emergency stop). returns: text. | |
| 355 | | `explain_current_step` | Пояснить текущий шаг (Focus/Power). returns: text. | |
| 356 | | `explain_trace_step` | Шаг трассы по индексу в AgentTraceSteps (0 — самый старый). args: step_index:integer; returns: text; example: {"step_index":0}. | |
| 357 | | `fix_failing_tests` | Quick action: починить упавшие тесты. returns: text. | |
| 358 | | `focus_checkpoint` | Создать контрольную точку (Focus). returns: text. | |
| 359 | | `focus_rollback` | Откатить к последней контрольной точке (Focus). returns: text. | |
| 360 | | `fork_chat_thread` | Новая ветка чата: args: parent_message_id?:string, display_title?:string, title?:string. Пишет thread_forked; переключает активную ветку. returns: text; example: {"display_title":"ADR review"} | |
| 361 | | `install_ollama_model` | Скачать модель Ollama (как в настройках). args: model:string; returns: text; example: {"model":"qwen2.5-coder:7b"}. | |
| 362 | | `investigate_nullref` | Quick action: расследовать NullReferenceException. returns: text. | |
| 363 | | `open_chat_clarification_batch` | Открыть structured clarification batch в чате. args: batch_json:string. returns: text; example: {"batch_json":"{\"id\":\"...\",\"title\":\"Нужно уточнить\",\"items\":[]}"}. | |
| 364 | | `pause_autonomous` | Поставить автономный режим на паузу. returns: text. | |
| 365 | | `prepare_commit` | Quick action: подготовить коммит (сводка/план/проверки). returns: text. | |
| 366 | | `refresh_workspace_snapshot` | Обновить снимок рабочего состояния (Power cockpit). returns: text. | |
| 367 | | `resume_autonomous` | Продолжить автономный режим после паузы. returns: text. | |
| 368 | | `rollback_trace_step` | Откатить состояние по шагу трассы. args: step_index:integer; returns: text; example: {"step_index":0}. | |
| 369 | | `safety.autonomous` | Установить safety.autonomous. returns: text. | |
| 370 | | `safety.confirm` | Установить safety.confirm. returns: text. | |
| 371 | | `safety.observe` | Установить safety.observe. returns: text. | |
| 372 | | `send_chat` | Чат: args: message?:string, role?:string. role assistant — только строка ассистента из MCP; иначе user и отправка; при ai.mode = mcp_only встроенный LLM не вызывается. returns: text; example: {"message":"hello"}. | |
| 373 | | `start_autonomous` | Запустить автономный режим (agent run). returns: text. | |
| 374 | | `submit_chat_clarification_response` | Отправить structured clarification response для активного batch. args: response_json:string. returns: text; example: {"response_json":"{\"batchId\":\"...\",\"answersByItemId\":{\"scope\":\"mfd\"}}"}. | |
| 375 | |
| 376 | ### Документы |
| 377 | |
| 378 | | command_id | Описание | |
| 379 | |-----------:|----------| |
| 380 | | `activate_document` | Активировать документ (переключить вкладку). args: file_path:string; returns: text; example: {"file_path":"C:\\\\tmp\\\\a.cs"}. | |
| 381 | | `capture_window` | Снимок окон IDE в PNG (по умолчанию главное окно; при scope=all — все top-level, в т.ч. окно-хост Mfd и прочие). args: scope?:string, workspace_path?:string, output_path?:string; returns: json. example: {"scope":"all","workspace_path":"D:\\\\tmp\\\\ws","output_path":".cascade-ide/window-{n}.png"}. | |
| 382 | | `chat_edit_message` | Заменить текст ответа ассистента по стабильному message_id; в лог пишется message_edited. args: message_id:string, new_content:string, reason?:string; returns: json; example: {"message_id":"a1b2c3d4e5f6789012345678901234ab","new_content":"fixed text"}. | |
| 383 | | `chat_export_readable` | Экспорт текущего чата в читаемый Markdown (роли, индексы, message_id). Поддерживаемый сценарий — явно подвести итоги длинной сессии: экспорт, затем краткое смысловое резюме и согласование с пользователем (см. MCP-PROTOCOL.md, раздел «Подведение итогов сессии чата»). args: write_file?:boolean, file_name?:string; returns: json; example: {"write_file":true}. | |
| 384 | | `chat_get_product_spine` | Прочитать сквозную линию продукта (spine) сессии. returns: json. | |
| 385 | | `chat_get_sedm_scope` | SEDM scope strip one-liner активной workline (T2+T1). returns: json; example: {}. | |
| 386 | | `chat_get_selected_message` | Получить выбранное сообщение чата в JSON. returns: json. Поля: selected_index, feed_ordinal, branch_message_count, message_id, role, content. | |
| 387 | | `chat_open_selected_thread` | Открыть detail выбранной темы. returns: text. | |
| 388 | | `chat_record_sedm_decision` | Записать decision_recorded (агент). args: outcome:string, chosen_approach?:string, selection_rationale?:string, considered?:object[], findings?:object[], touched_paths?:string[], revision?:string; returns: text; example: {"outcome":"S1 events in log","chosen_approach":"append-only","touched_paths":["Features/Chat/Foo.cs"]}. | |
| 389 | | `chat_record_sedm_intent` | Записать intent card (T1) в event log. args: outcome:string, trigger?:string, chosen_approach?:string, selection_rationale?:string, considered?:object[]; returns: text; example: {"outcome":"scope strip shows open worklines","chosen_approach":"meta projection","considered":[{"approach":"New Chat","rejected_because":"flat chat"}]}. | |
| 390 | | `chat_select_message` | Выбрать сообщение в чате. args: ordinal?:integer, end_ordinal?:integer, index?:integer; returns: text; example: {"ordinal":3}. ordinal/end_ordinal — 1-based gutter активной detail-ветки; index — 0-based глобальный ChatMessages. | |
| 391 | | `chat_select_next_message` | Сместить выбор на следующее сообщение чата (keyboard-first). returns: text. | |
| 392 | | `chat_select_next_thread` | Выбрать следующую тему в overview (циклически). returns: text. | |
| 393 | | `chat_select_prev_message` | Сместить выбор на предыдущее сообщение чата (keyboard-first). returns: text. | |
| 394 | | `chat_select_prev_thread` | Выбрать предыдущую тему в overview (циклически). returns: text. | |
| 395 | | `chat_set_product_spine` | Обновить spine (частично): переданные поля перезаписываются; milestones — многострочный текст (веха на строку). args: line_title?:string, current_focus?:string, milestones?:string, include_in_agent_context?:boolean; returns: text; example: {"current_focus":"Topic cards + spine MCP","milestones":"ADR 0096\\nMCP get/set"}. | |
| 396 | | `chat_show_thread_overview` | Вернуться в overview тем (карточки). returns: text. | |
| 397 | | `chat_toggle_product_spine_in_agent_context` | Включить/выключить сжатый spine в исходящих сообщениях агенту. returns: text. | |
| 398 | | `chat_toggle_selected_thinking` | Переключить у выбранного thinking-сообщения свёрнутый/полный вид. returns: text. | |
| 399 | | `chat_toggle_show_thinking_in_history` | Переключить настройку show_thinking_in_history (keyboard-first toggle). returns: text. | |
| 400 | | `close_document` | Закрыть документ. args: file_path:string; returns: text; example: {"file_path":"C:\\\\tmp\\\\a.cs"}. | |
| 401 | | `create_project_in_solution` | Добавить проект в открытое решение: `dotnet new` (console\|classlib\|webapi) + `dotnet sln add`. args: template:string, project_name:string; returns: json; example: {"template":"console","project_name":"MyApp"}. | |
| 402 | | `cycle_code_navigation_map_detail_level` | Карта намерений: цикл детализации glance → normal → inspect (Ctrl+K → S → D). returns: text. | |
| 403 | | `cycle_code_navigation_map_level` | Карта намерений: переключить уровень file ↔ controlFlow (Ctrl+K → S → F). returns: text. | |
| 404 | | `cycle_code_navigation_map_presentation` | Карта намерений: цикл вида list → graph → both (палитра; быстрый путь — Ctrl+K → S → P). returns: text. | |
| 405 | | `cycle_code_navigation_map_related_graph_layout` | Карта намерений: цикл укладки related-files radial → top_down → bottom_up. returns: text. | |
| 406 | | `focus_editor` | Передать фокус в редактор (чтобы клавиши/ввод шли в него). returns: text. | |
| 407 | | `get_cockpit_surface` | Только CDS (`CockpitSurfaceState`): тот же payload, что поле `cockpit_surface` в `get_ide_state`. returns: json. Для `--agent-contract` без полной сводки. | |
| 408 | | `get_code_navigation_context` | Контекст навигации по коду (ADR 0039, CNC): связанные файлы или мини-подграф. Виды связей — partial_peer project_peer xaml_codebehind_pair test_counterpart same_namespace same_directory. Имена preset — из settings.toml `[code_navigation]` / `[[code_navigation.presets]]`. args: mode:string, file_path?:string, line?:integer, column?:integer, max_related?:integer, max_nodes?:integer, max_edges?:integer, preset?:string, include_kinds?:string[], exclude_kinds?:string[], level?:string; returns: json; example: {"mode":"related","file_path":"src/Foo.cs","preset":"no_namespace_noise","level":"controlFlow"}. | |
| 409 | | `get_current_file_diagnostics` | Диагностики текущего открытого .cs (ошибки/предупреждения). returns: json. | |
| 410 | | `get_ide_state` | Единая сводка состояния IDE (solution/editor/build/diagnostics...). returns: json. | |
| 411 | | `get_solution_files` | Список файлов и дерево решения (Solution Explorer). returns: json. | |
| 412 | | `get_solution_info` | Короткая информация о текущем решении/файле/выделении в дереве. returns: json. | |
| 413 | | `get_ui_modes_diagnostics` | Диагностика загрузки UI-режимов: пути к UiModes, TOML vs встроенный fallback, список id в меню (почему может не быть Flight). returns: json. | |
| 414 | | `move_document_to_group_1` | Переместить документ в группу 1. args: file_path:string; returns: text; example: {"file_path":"C:\\\\tmp\\\\a.cs"}. | |
| 415 | | `move_document_to_group_2` | Переместить документ в группу 2. args: file_path:string; returns: text; example: {"file_path":"C:\\\\tmp\\\\a.cs"}. | |
| 416 | | `move_document_to_group_3` | Переместить документ в группу 3. args: file_path:string; returns: text; example: {"file_path":"C:\\\\tmp\\\\a.cs"}. | |
| 417 | | `reopen_closed_document` | Переоткрыть недавно закрытый документ. returns: text. | |
| 418 | | `search_workspace_text` | Поиск текста по workspace через ripgrep: вызывается команда `rg` из PATH (Windows/Linux/macOS — поставь пакетом или с релиза). Явный путь: только `rg_path`. args: pattern:string, subpath?:string, fixed_string?:boolean, glob?:string, max_matches?:integer, rg_path?:string; returns: json; example: {\"pattern\":\"LoadSolution\",\"glob\":\"*.cs\",\"max_matches\":50}. | |
| 419 | | `set_build_output_visible` | Явно показать/скрыть журнал сборки. args: visible:boolean; returns: text; example: {"visible":true}. | |
| 420 | | `set_code_navigation_map_level` | Карта намерений: установить уровень `file` или `controlFlow` (слэш `/map type …`). args: level:string; returns: text; example: {"level":"file"}. | |
| 421 | | `set_primary_work_surface` | Установить якорь Forward: `intercom` \| `editor`. args: surface:string; returns: text; example: {"surface":"intercom"}. | |
| 422 | | `set_terminal_visible` | Явно показать/скрыть терминал (без переключения). args: visible:boolean; returns: text; example: {"visible":true}. | |
| 423 | | `set_ui_mode` | Режим UI (как меню «Вид → Режим интерфейса»). args: mode:string; returns: text; example: {"mode":"Flight"}. | |
| 424 | | `toggle_build_output` | Как меню «Вид → Вывод сборки». returns: text. | |
| 425 | | `toggle_pfd_region_expanded` | Переключить развёрнут/свёрнут регион Pfd (как меню «Вид → Карта намерений (PFD)»). returns: text. | |
| 426 | | `toggle_pin_document` | Закрепить/открепить документ (pin). args: file_path:string; returns: text; example: {"file_path":"C:\\\\tmp\\\\a.cs"}. | |
| 427 | | `toggle_primary_work_surface` | Переключить `primary_work_surface` intercom ↔ editor (ADR 0120). returns: text. | |
| 428 | | `toggle_terminal` | Как меню «Вид → Терминал» (переключатель). returns: text. | |
| 429 | | `toggle_workspace_splitters_lock` | Сплиттеры рабочей области: переключить ON GND / IN AIR (мелодия tol, лампа TOL в task cockpit). returns: text. | |
| 430 | <!-- GENERATED:IdeCommands END --> |
| 431 | |
| 432 | **Семантическая навигация (`get_code_navigation_context`):** пресеты задаются в `%LocalAppData%\CascadeIDE\settings.toml` в секции `[code_navigation]` (`[[code_navigation.presets]]` в TOML). В ответе смотри `kind_filter` (эффективные списки) и в режиме `subgraph` — `kind` на узлах и `related_kind` на рёбрах. Для **control-flow** subgraph зерно графа — **`[code_navigation_map].control_flow_grain`** (`intent` \| `detailed`, см. [ADR 0151](adr/0151-control-flow-subgraph-intent-vs-detailed-grain.md)). Подробный cookbook: [workspace-navigation-mcp-cookbook.md](design/workspace-navigation-mcp-cookbook.md). |
| 433 | |
| 434 | Проверка: `ide_get_ide_state` — помимо `terminal.is_visible`, `ui_mode`, есть `panels` (видимость колонок), `safety_level`, `editor_group_count`, `agent_trace_step_count`, `is_autonomous_running`, **`cockpit_surface`** (CDS: `schema_version`, зоны, топология, `instruments` и т.д., см. `docs/design/cds-contract-v0.md`). |
| 435 | |
| 436 | ## Подключение из Cursor |
| 437 | |
| 438 | 1. **Self-contained exe (рекомендуется):** в корне проекта заданы `RuntimeIdentifier=win-x64` и `SelfContained=true`. |
| 439 | - **Release:** из каталога `cascade-ide` запусти **`.\scripts\deploy\publish-release.ps1`** — публикует в `publish` и зеркалит в **`D:\cascade-ide`** (копирование; путь без пробелов для Cursor). В конце печатается фрагмент для `mcp.json`. Без регенерации MCP-док из `IdeCommands`: **`.\scripts\deploy\publish-release.ps1 -SkipDocGen`**. Вручную то же самое: `dotnet publish -c Release -r win-x64 --self-contained true -o publish` и копирование в `D:\cascade-ide` (или junction на каталог `publish`). |
| 440 | - **Debug (отладка MCP-обработчиков):** **`.\scripts\deploy\publish-debug.ps1`** — вывод в `publish-debug`, зеркало **`D:\cascade-ide-debug`**. В Cursor: `command` — `D:\cascade-ide-debug\CascadeIDE.exe`, **`args`: `["--mcp-stdio"]`**. Ускоренная сборка: **`.\scripts\deploy\publish-debug.ps1 -SkipDocGen`**. |
| 441 | |
| 442 | 2. В настройках MCP Cursor (например, `.cursor/mcp.json` или глобальные настройки) добавьте сервер: |
| 443 | |
| 444 | ```json |
| 445 | { |
| 446 | "mcpServers": { |
| 447 | "cascade-ide": { |
| 448 | "command": "<полный_путь_к_CascadeIDE.exe>", |
| 449 | "args": ["--mcp-stdio"] |
| 450 | } |
| 451 | } |
| 452 | } |
| 453 | ``` |
| 454 | |
| 455 | Вариант через `dotnet run` (из каталога решения/репо): |
| 456 | |
| 457 | ```json |
| 458 | { |
| 459 | "mcpServers": { |
| 460 | "cascade-ide": { |
| 461 | "command": "dotnet", |
| 462 | "args": [ |
| 463 | "run", |
| 464 | "--project", |
| 465 | "D:/path/to/cascade-ide/CascadeIDE.csproj", |
| 466 | "--", |
| 467 | "--mcp-stdio" |
| 468 | ] |
| 469 | } |
| 470 | } |
| 471 | } |
| 472 | ``` |
| 473 | |
| 474 | 3. Запустите CascadeIDE с `--mcp-stdio` (или позвольте Cursor запустить его по этой команде). После подключения агент в Cursor сможет вызывать `ide_open_file`, `ide_set_breakpoint` и др. |
| 475 | |
| 476 | ## Запуск «сначала IDE, потом MCP» |
| 477 | |
| 478 | Сейчас Cursor при включении сервера сам запускает процесс (`CascadeIDE.exe --mcp-stdio`). Вариант «сначала запускаешь IDE сама, потом включаешь MCP в Cursor» без доработок не поддерживается. **Доработки** могли бы быть: |
| 479 | |
| 480 | - **Со стороны Cursor (клиент):** поддержка подключения к уже запущенному MCP-серверу (attach), а не только запуск процесса. Тогда пользователь стартует IDE вручную, Cursor подключается к существующему процессу (например по сокету или именованному каналу). |
| 481 | - **Со стороны Cascade IDE (сервер):** второй транспорт — не только stdio, но и, например, TCP/socket. IDE при старте открывает порт и ждёт подключения; в настройках Cursor указывается URL вместо command. Тогда «сначала IDE, потом включить MCP» работало бы без изменений в Cursor. |
| 482 | |
| 483 | Пока достаточно сценария «клиент (Cursor, ACP и т.д.) запускает IDE» с `--mcp-stdio`: открывается **главное окно** Cascade IDE — так Pilot Monitoring может смотреть в ту же IDE, куда стучится агент по MCP. Параллельно поднимается MCP на stdin/stdout (включается **только** флагом `--mcp-stdio`, отдельной настройки «включить stdio» нет). В окне отображается подсказка: «Управляется агентом (MCP). Не закрывайте окно — подключение будет потеряно.» |
| 484 | |
| 485 | ## Пример тёмной темы (ide_set_ui_theme) |
| 486 | |
| 487 | Валидный JSON для переключения на тёмную тему (передать в `theme`): |
| 488 | |
| 489 | ```json |
| 490 | {"main_window":{"background":"#1E1E1E"},"menu":{"background":"#252526","foreground":"#CCCCCC"},"button":{"background":"#3C3C3C","foreground":"#CCCCCC","border_brush":"#555","hover_background":"#505050","disabled_background":"#2D2D2D","disabled_foreground":"#858585"},"toolbar":{"background":"#2D2D2D"},"toolbar_text":{"foreground":"#CCCCCC","error_foreground":"#F48771"},"editor":{"background":"#1E1E1E","foreground":"#D4D4D4"},"editor_column":{"border_brush":"#3F3F46","background":"#1E1E1E","current_file_foreground":"#9D9D9D"},"workspace_layout":{"border_brush":"#3F3F46"},"markdown_preview_panel":{"background":"#252526","border_brush":"#3F3F46"},"solution_explorer":{"border_brush":"#3F3F46","header_foreground":"#CCCCCC"},"build_output":{"background":"#252526","foreground":"#D4D4D4","border_brush":"#3F3F46"},"chat_panel":{"background":"#252526","label_foreground":"#CCCCCC","message_bubble_background":"#2D2D2D","message_content_foreground":"#D4D4D4","send_button_background":"#0E639C","send_button_foreground":"#FFF"},"terminal":{"background":"#1E1E1E","foreground":"#CCCCCC","input_background":"#2D2D2D"},"mcp_banner":{"background":"#094771","foreground":"#6CB6F0"},"preview_window":{"background":"#252526"}} |
| 491 | ``` |
| 492 | |
| 493 | Секция **`workspace_layout.border_brush`** задаёт рамки трёх колонок (PFD / Forward / MFD), вертикальные сплиттеры и шов между зонами (`CascadeTheme.WorkspacePanelBorderBrush`). Если секции нет, используется `editor_column.border_brush`. |
| 494 | |
| 495 | Тул возвращает «OK» при успехе или текст ошибки при невалидном JSON (например, `Invalid JSON: ...`) — агент видит причину в ответе вызова. |
| 496 | |
| 497 | ## Связка с другими MCP |
| 498 | |
| 499 | Агент может одновременно использовать: |
| 500 | |
| 501 | - **CascadeIDE** (MCP-сервер) — управление IDE: открытие файлов, брейкпоинты, превью. |
| 502 | - **dotnet-debug-mcp** — отладка .NET (launch, breakpoints, step, variables). |
| 503 | - **roslyn-mcp** — рефакторинг и анализ C# (find usages, rename, code actions). |
| 504 | |
| 505 | Один и тот же workspace: агент в Cursor вызывает CascadeIDE для отображения и dotnet-debug/roslyn для отладки и кода. |
| 506 | |