refactor(tools): переименовать тул updatePageContent → updatePageMarkdown; внешний MCP: + updatePageMarkdown, − import_page_markdown #411

Open
opened 2026-07-07 20:53:42 +03:00 by agent_vscode · 0 comments
Collaborator

Мотивация

Вскрылось при разборе инцидента со сносками (#410): поверхности записи «целым телом» несимметричны и невнятно названы.

  • У in-app агента полная замена тела markdown называется updatePageContent — имя не говорит о формате, тогда как парный структурный тул называется updatePageJson. Пара должна быть updatePageMarkdown / updatePageJson.
  • У внешнего MCP тула полной замены тела голым markdown нет вообще: есть только import_page_markdown, который на самом деле не «plain-body replace», а парный к export_page_markdown разбор self-contained Docmost-файла (meta-блок + метаданные комментариев + восстановление inline-меток) — client.importPageMarkdown @ packages/mcp/src/client.ts:1856.

Решение (зафиксировано владельцем)

  1. Тул updatePageContentupdatePageMarkdown (замена тела страницы markdown'ом, ^[...]-сноски парсятся — путь client.updatePageupdatePageContentRealtimemarkdownToProseMirrorCanonical).
  2. Внешнему MCP добавить updatePageMarkdown (общая спека, тот же execute → docmostClient.updatePage(pageId, content, title)).
  3. import_page_markdown с внешнего MCP убрать. Принято осознанно: export_page_markdown становится односторонним, round-trip «экспорт → правка файла → реимпорт с комментариями/meta» с внешней стороны перестаёт поддерживаться.

Скоуп правок

  • packages/mcp/src/tool-specs.ts: новая спека updatePageMarkdown (pageId, content, title?). Спеку importPageMarkdown (строка ~423) пока НЕ удалять — её использует in-app агент (importPageMarkdown остаётся у агента); убрать только MCP-регистрацию. Если решим убирать и у агента — отдельным решением.
  • packages/mcp/src/index.ts: registerShared(SHARED_TOOL_SPECS.updatePageMarkdown, …); удалить регистрацию import_page_markdown (строка ~325); обновить guide-текст (строка ~50) — убрать import_page_markdown, добавить updatePageMarkdown в раздел «Bulk/structural rewrite».
  • apps/server/src/core/ai-chat/tools/ai-chat-tools.service.ts:371: updatePageContent: tool({...})updatePageMarkdown через sharedTool(SHARED_TOOL_SPECS.updatePageMarkdown, …).
  • apps/server/src/core/ai-chat/tools/tool-tiers.ts:119: ключ updatePageContentupdatePageMarkdown + catalogLine.
  • apps/server/src/core/ai-chat/chat-markdown.util.ts:78,99: ключи мапы лейблов действий (en «Updated page» / ru «Обновил страницу»).
  • Промпт исследователя (agent-roles-catalog/bundles/research/*.yaml) — если там упоминается имя тула, синхронизировать (сейчас координируется с #410 п.5).
  • Тесты: shared-tool-specs.contract.spec.ts, tool-tiers.spec.ts, ai-chat-tools.service.spec.ts, packages/mcp/test/* (там есть моки full-doc-write).
  • Доки: README.md, README.ru.md, packages/mcp/README.md, CHANGELOG.md.

⚠️ НЕ трогать (одноимённые внутренности — не тулы)

  • PageService.updatePageContent (apps/server/src/core/page/services/page.service.ts:346) — внутренний метод REST-пути.
  • updatePageContentRealtime (packages/mcp/src/lib/collaboration.ts:480) — collab-путь записи.
  • collaboration.handler.ts:145 — обработчик collab-действия.

Это ядро записи; переименовывается только имя тула на обеих поверхностях.

Breaking

Для внешних MCP-клиентов: исчезает import_page_markdown, появляется updatePageMarkdown. Отразить в CHANGELOG как BREAKING, дать миграционную заметку. Согласуется с общим переименованием в camelCase (отдельное issue) — лучше выпускать одним релизом, чтобы внешние конфиги ломались один раз.

Критерии приёмки

  • На обеих поверхностях есть updatePageMarkdown + updatePageJson; имени updatePageContent как тула больше нет.
  • import_page_markdown на внешнем MCP отсутствует; guide-текст и доки не упоминают его.
  • ^[...] в теле, переданном в updatePageMarkdown, материализуется в сноски (существующий тест-контур канонизации проходит).

Связано: #410 (тулы агенту), camelCase-переименование — следующее issue.

## Мотивация Вскрылось при разборе инцидента со сносками (#410): поверхности записи «целым телом» несимметричны и невнятно названы. - У in-app агента полная замена тела markdown называется `updatePageContent` — имя не говорит о формате, тогда как парный структурный тул называется `updatePageJson`. Пара должна быть `updatePageMarkdown` / `updatePageJson`. - У внешнего MCP тула полной замены тела **голым markdown нет вообще**: есть только `import_page_markdown`, который на самом деле не «plain-body replace», а парный к `export_page_markdown` разбор self-contained Docmost-файла (meta-блок + метаданные комментариев + восстановление inline-меток) — `client.importPageMarkdown` @ `packages/mcp/src/client.ts:1856`. ## Решение (зафиксировано владельцем) 1. Тул `updatePageContent` → **`updatePageMarkdown`** (замена тела страницы markdown'ом, `^[...]`-сноски парсятся — путь `client.updatePage` → `updatePageContentRealtime` → `markdownToProseMirrorCanonical`). 2. Внешнему MCP **добавить** `updatePageMarkdown` (общая спека, тот же execute → `docmostClient.updatePage(pageId, content, title)`). 3. `import_page_markdown` с внешнего MCP **убрать**. Принято осознанно: `export_page_markdown` становится односторонним, round-trip «экспорт → правка файла → реимпорт с комментариями/meta» с внешней стороны перестаёт поддерживаться. ## Скоуп правок - **`packages/mcp/src/tool-specs.ts`**: новая спека `updatePageMarkdown` (pageId, content, title?). Спеку `importPageMarkdown` (строка ~423) пока НЕ удалять — её использует in-app агент (`importPageMarkdown` остаётся у агента); убрать только MCP-регистрацию. Если решим убирать и у агента — отдельным решением. - **`packages/mcp/src/index.ts`**: `registerShared(SHARED_TOOL_SPECS.updatePageMarkdown, …)`; удалить регистрацию `import_page_markdown` (строка ~325); обновить guide-текст (строка ~50) — убрать import_page_markdown, добавить updatePageMarkdown в раздел «Bulk/structural rewrite». - **`apps/server/src/core/ai-chat/tools/ai-chat-tools.service.ts:371`**: `updatePageContent: tool({...})` → `updatePageMarkdown` через `sharedTool(SHARED_TOOL_SPECS.updatePageMarkdown, …)`. - **`apps/server/src/core/ai-chat/tools/tool-tiers.ts:119`**: ключ `updatePageContent` → `updatePageMarkdown` + catalogLine. - **`apps/server/src/core/ai-chat/chat-markdown.util.ts:78,99`**: ключи мапы лейблов действий (en «Updated page» / ru «Обновил страницу»). - **Промпт исследователя** (`agent-roles-catalog/bundles/research/*.yaml`) — если там упоминается имя тула, синхронизировать (сейчас координируется с #410 п.5). - Тесты: `shared-tool-specs.contract.spec.ts`, `tool-tiers.spec.ts`, `ai-chat-tools.service.spec.ts`, `packages/mcp/test/*` (там есть моки full-doc-write). - Доки: `README.md`, `README.ru.md`, `packages/mcp/README.md`, `CHANGELOG.md`. ## ⚠️ НЕ трогать (одноимённые внутренности — не тулы) - `PageService.updatePageContent` (`apps/server/src/core/page/services/page.service.ts:346`) — внутренний метод REST-пути. - `updatePageContentRealtime` (`packages/mcp/src/lib/collaboration.ts:480`) — collab-путь записи. - `collaboration.handler.ts:145` — обработчик collab-действия. Это ядро записи; переименовывается только **имя тула** на обеих поверхностях. ## Breaking Для внешних MCP-клиентов: исчезает `import_page_markdown`, появляется `updatePageMarkdown`. Отразить в CHANGELOG как BREAKING, дать миграционную заметку. Согласуется с общим переименованием в camelCase (отдельное issue) — лучше выпускать одним релизом, чтобы внешние конфиги ломались один раз. ## Критерии приёмки - На обеих поверхностях есть `updatePageMarkdown` + `updatePageJson`; имени `updatePageContent` как тула больше нет. - `import_page_markdown` на внешнем MCP отсутствует; guide-текст и доки не упоминают его. - `^[...]` в теле, переданном в `updatePageMarkdown`, материализуется в сноски (существующий тест-контур канонизации проходит). Связано: #410 (тулы агенту), camelCase-переименование — следующее issue.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#411