refactor(mcp): дедупликация конвертер-смежных хелперов — форк node-ops.ts, legacy footnote-*, parse-node-arg #414
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Мотивация
Аудит при подготовке блочного markdown-редактирования (#413) нашёл реальные дубли конвертер-смежной логики между
packages/mcpиpackages/prosemirror-markdown. AGENTS.md запрещает per-package копии конвертера (#293) — эти хелперы формально за периметром того правила, но дрейфуют точно так же.Находки
packages/mcp/src/lib/node-ops.ts(963 строки) ↔packages/prosemirror-markdown/src/lib/node-ops.ts(897 строк; НЕ экспортируется из barrel, используется только тестами пакета). Набор экспортов идентичен (blockPlainText,buildOutline,getNodeByRef,replaceNodeById,deleteNodeById,sanitizeForYjs,findUnstorableAttr,insertNodeRelative,readTable,insertTableRow,deleteTableRow,updateTableCell; в mcp дополнительноassertUnambiguousMatch), уже ~90 разошедшихся строк. Питает patchNode/insertNode/deleteNode/все table-тулы/getOutline/getNode — самый дрейфоопасный форк в репе.[^id]:, который канонический импортёр теперь оставляет литералом; их собственные заголовки называют это «vestigial».assembleFootnotesиз пакетногоfootnote.ts(одна идея — content-key дедуп + последовательные id — в двух местах).apps/server/src/core/ai-chat/tools/parse-node-arg.ts↔packages/mcp/src/lib/parse-node-arg.ts.Что сделать
prosemirror-markdown: живая mcp-версия выигрывает; ~90 строк диффа выверить явно (по коммит-истории, не «на глаз»); экспорт из barrel; mcp импортирует; тесты пакета переезжают на ту же копию. Координация: #409 добавляет в node-opsfindInvalidNode, #413 добавляет сплайс-варианты — делать вместе или строго после.[^id]:не парсится, используйте^[...]» в результатах create/update/import (решить при реализации; предупреждение полезно ровно для класса инцидента #410).footnote.ts(или перенести authoring-хелперы в пакет рядом с ними) — одна реализация конвенции.@docmost/mcp, in-app копию удалить.НЕ трогать
canonicalizeFootnotesвнутриmarkdownToProseMirrorCanonical— задокументированный идемпотентный no-op на импорте, несущий на JSON-путях; ENFORCEMENT RULE #228 в шапкеfootnote-canonicalize.ts(per-call-site, фрагментные записи не канонизируют, комментарии не канонизируют) остаётся как есть.comment-anchor.ts/json-edit.ts/text-normalize.ts— не дубли конвертера (другая задача: якорение plain-text выделения в живой doc и хирургический find/replace). NB: #408 предлагает вынести из json-edit «closest-block hint» в общий хелпер — независимая работа.Definition of done
tsc/тестов mcp).Связано
#293 (правило «одна копия»), #409 (findInvalidNode в node-ops — координация), #413 (блочное markdown-редактирование — использует те же node-ops), #408 (hint-хелпер из json-edit — независимо).