refactor(mcp): declaration:true + вывод DocmostClientLike из реального типа клиента — восстановленный отложенный долг #294 #446
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?
Зачем (история потерянного долга)
В #294 вторая половина фикса — «вывод
DocmostClientLikeиз реального типа (type-only import / генерация), а не копировать руками» — была явно помечена «⏳ отложены… делать инкрементально». Реестр спеков сделали (PR #367), ишью закрыли 05.07 — и отложенная половина исчезла из трекера. Это ишью её восстанавливает.Текущее состояние (почему это источник багов)
@docmost/mcpне отдаёт.d.ts: вpackages/mcp/tsconfig.jsonнетdeclaration, вpackage.jsonнетtypes-экспорта. Через ESM(mcp)/CJS(server)-границу тип импортировать нечего.DocmostClientLike(apps/server/src/core/ai-chat/tools/docmost-client.loader.ts) — ручное зеркало ~45 сигнатур изpackages/mcp/src/client.ts. Рядом второе ручное зеркало — интерфейсSharedToolSpec(копия одноимённого изtool-specs.ts).HOST_CONTRACT_METHODS(packages/mcp/test/unit/client-host-contract.test.mjs) проверяет только имена, не сигнатуры (в шапке теста об этом сказано прямо) — и сам является третьей ручной копией тех же имён.client.drawioGet(pageId, node, format ?? 'xml')) — перестановка/смена типа параметра вclient.tsдоезжает до продакшена как рантайм-ошибка без единого сигнала на компиляции или в тестах.Механика
"declaration": true(+declarationMap) вpackages/mcp/tsconfig.json;typesвexportspackage.json.DocmostClientLike→import type { DocmostClient }(или деривацияPick<DocmostClient, …>); ручное зеркало удалить.SharedToolSpecв loader'е → type-only import из пакета.HOST_CONTRACT_METHODSудалить целиком — его работу берёт на себя tsc.(result?.data ?? {}) as {…}) вai-chat-tools.service.ts. Мигрировать инкрементально: сначалаsatisfies DocmostClientContractрядом с существующим интерфейсом (компилятор сверяет, ничего не ломая), затем замена кастов по одному.Критерии приёмки
apps/serverноль ручных копий типов из@docmost/mcp(grep поDocmostClientLike, локальномуSharedToolSpec).client.ts→ ошибка компиляции сервера, не рантайм-падение тула.client-host-contract.test.mjsудалён (имена + сигнатуры проверяет tsc).Связано: #294 (источник долга), #416 (роадмап), #445 (execute-в-спеке — использует типизированный
DocmostClientLikeв сигнатуреexecute).