ADR 0131: /editor select code — selection в редакторе по bracket-ссылке [F:… M:…]¶
Статус: Accepted · In progress
Дата: 2026-05-19
Связанные ADR¶
| ADR | Роль |
|---|---|
| 0124 | /editor line select 5 10 — select по номерам строк |
| 0128 | Грамматика F/M/L/S в […] (§5.1); L2 ; — attach в Intercom; общий parse tree |
| 0130 | Reveal без selection; MCP member_key / syntax_scope (JSON) |
| 0058 | Roslyn resolve member |
| 0119 | Slash в composer Intercom |
| 0120 | Forward / editor как рабочая поверхность |
Резюме¶
Добавить editor-действие (меняет Selection в буфере), вводимое из той же bracket-грамматики, что attach в 0128, но без сообщения в Intercom:
- Slash:
/editor select code [M:GetUserAsync],/editor select code [Foo.cs M:Bar],/editor select code [M:Run S:for:2], L2[F:path; M:name; L:50-100]/[F:…; M:…; S:for:2](0128 §5.1). - Опционально паритет:
/editor reveal code […]— тот же parse + resolve, эффект 0130 (рамка, не selection).
Не attach: не создаёт chip, не пишет в event log чата. Не заменяет /editor line select — дополняет смысловым якорем вместо сырых строк.
Зависимости: общий BracketReferenceParser (или слой из фазы 2 0128); AttachmentAnchorRoslynResolver / тот же resolve pipeline, что 0130 фаза 2.
Контекст¶
Сегодня select в редакторе из чата/палитры:
| Путь | Ограничение |
|---|---|
/editor line select 5 10 0124 |
Нужны номера строк |
go_to_position (MCP) |
То же + агент |
| Клик attach + Shift | Только из ленты Intercom |
Оператор в редакторе или в composer уже мыслит [M:Foo] (0128 H1). Логично набрать в slash то же выражение и получить select в активном буфере — симметрия attach, другой эффект (как file open vs attach file).
Reveal и select не XOR (0130 §6.1): две команды с одним parse, разным command_id.
Решение (черновик)¶
1. Slash-поверхность¶
| Slash | command_id (черновик) |
Эффект |
|---|---|---|
/editor select code <bracket-ref> |
editor.select_code |
Parse bracket → re-resolve → SelectInEditor |
/editor reveal code <bracket-ref> (опционально v1) |
editor.reveal_code |
Parse → re-resolve → EditorAgentRangeReveal |
<bracket-ref> — один токен или quoted tail по правилам 0128 §5 (пробелы в path — кавычки / completion).
Где выполняется: Intercom composer и command palette с контекстом редактора (0120); при primary_work_surface = editor якорь F: может опускаться (active file), как в 0128 H1.
2. Parse → resolve → act¶
BracketRef (shared with attach)
→ AttachmentAnchor-shaped resolve @ invoke (Roslyn, lines fallback)
→ editor.select_code → SelectInEditor
→ editor.reveal_code → EditorAgentRangeReveal
MCP не обязан парсить prose [M:…] — только structured args (0130 фаза 2). Slash может принимать bracket в хвосте, потому что это явный UI-ввод оператора, не тело сообщения агента.
3. Ортогональность¶
| Действие | Меняет selection? | Attach в чат? |
|---|---|---|
/attach … + [M:…] |
нет | да |
/editor select code [M:…] |
да | нет |
/editor reveal code [M:…] |
нет | нет |
/editor line select 5 10 |
да | нет |
reveal_editor_range (MCP) |
нет | нет |
4. Фазы (предварительно)¶
| Фаза | Содержание |
|---|---|
| 0 | ADR; согласовать command_id и tail в intent-catalog.toml |
| 1 (done) | BracketCodeReferenceParser (F/M/L); /editor select code, /editor reveal code; editor.select_code / editor.reveal_code |
| 2 (частично) | Parse S:kind:n в bracket (→ syntaxScope) — done (BracketCodeReferenceParser); паритет melody c:esc / c:erc — done; autocomplete member/path/scope — позже |
| 3 | Паритет hotkey / palette melody рядом с c:els |
Открытые вопросы¶
- Один
wire_classeditor_code_refvs отдельные binders для select/reveal. - Ошибки resolve (member_not_found) — toast как в 0128 §9.1 или тихий fallback на L:.
- Выполнять ли команду, если целевой файл ≠ active file (open + select vs только active).
История¶
| Дата | Изменение |
|---|---|
| 2026-05-19 | Proposed: идея /editor select code [F:/M:…]; ортогонально attach и 0124 line select. |
| 2026-05-19 | Фаза 2: ось S: (syntax scope) в bracket — канон 0128 §5.1. |
| 2026-05-20 | Фаза 2 (часть): ParametricIntentMelody для bracket_code_ref (c:esc, c:erc). |
| 2026-05-20 | Кластер ADR: 0128 (attach UX) · 0129 (fenced) · 0130 (reveal) · этот ADR (select/reveal slash). |