2e6f1c3de5
Два структурных слепых пятна: (1) сервер грузит СКОМПИЛИРОВАННЫЙ
packages/mcp/build/index.js, а серверные guard-тесты читают src/tool-specs.ts —
правка src без пересборки оставляет тесты зелёными, но рантайм расходится со
спеками; (2) спеки добавляют в packages/mcp, а parity-тесты живут в jest-сьюте
apps/server — PR, трогающий только пакет, проходит зелёным, сломанная in-app-
проводка всплывает уже на develop (кейс f46d89ea).
- REGISTRY_STAMP: codegen (scripts/gen-registry-stamp.mjs) считает sha256 от
нормализованного (CRLF→LF, один хвостовой \n снят) сырого текста
src/tool-specs.ts, пишет src/registry-stamp.generated.ts (gitignored),
index.ts реэкспортит → попадает в build/. Вшит в build/pretest/watch ДО tsc.
- Loader (dev/test): computeSrcRegistryStamp пересчитывает стамп из src рядом с
build/index.js (dev-vs-prod по existsSync, любая ошибка → null), сверяет с
build-стампом → при рассинхроне бросает «build is stale — rebuild». В prod
(src нет) и на pre-#447 билдах (нет REGISTRY_STAMP) — чистый no-op.
- CI: job mcp-server-parity собирает shared-deps+mcp (регенерит стамп) и гоняет
ОБА сьюта вместе (mcp node:test + server guard-спеки) — именованный гейт, его
нельзя случайно расщепить.
- AGENTS.md: правка спеков требует ребилда @docmost/mcp.
Тесты (20): mcp-сайд (детерминизм, нормализация, desync-гард стамп-vs-билд) +
server-сайд (null при отсутствии src = prod no-op; mismatch → throw точного
сообщения; pre-#447 no-op). Кросс-импл equality-гард: один фиксированный вход →
один хэш на ОБЕИХ сторонах, ловит рассинхрон двух нормализаций. Внутреннее
ревью: APPROVE WITH SUGGESTIONS (обе — покрытие guard'а — закрыты этим тестом).
Мутационно: любой из двух normalize-имплов расходится → equality-тест краснеет.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
72 lines
1.6 KiB
Plaintext
72 lines
1.6 KiB
Plaintext
.env
|
|
.env.dev
|
|
.env.prod
|
|
data
|
|
# compiled output
|
|
/dist
|
|
node_modules
|
|
|
|
# git-sync compiled output (built in CI/Docker via `pnpm build`, never committed,
|
|
# so src/ and prod can never silently diverge).
|
|
packages/git-sync/build/
|
|
|
|
# prosemirror-markdown compiled output (built in CI/Docker via `pnpm build`,
|
|
# never committed, so src/ and prod can never silently diverge).
|
|
packages/prosemirror-markdown/build/
|
|
|
|
# mcp compiled output (built in CI/Docker via `pnpm build`, never committed, so
|
|
# src/ and prod can never silently diverge). Matches the git-sync/prosemirror-
|
|
# markdown convention; the package is private and rebuilt at deploy.
|
|
packages/mcp/build/
|
|
|
|
# mcp REGISTRY_STAMP codegen output (issue #447). Regenerated into src/ by
|
|
# scripts/gen-registry-stamp.mjs on every `build`/`pretest` (before tsc), so it
|
|
# is a build artifact like build/ — never committed, always fresh.
|
|
packages/mcp/src/registry-stamp.generated.ts
|
|
|
|
# Logs
|
|
logs
|
|
*.log
|
|
npm-debug.log*
|
|
pnpm-debug.log*
|
|
yarn-debug.log*
|
|
yarn-error.log*
|
|
lerna-debug.log*
|
|
|
|
# OS
|
|
.DS_Store
|
|
|
|
# Tests
|
|
/coverage
|
|
/.nyc_output
|
|
|
|
# IDEs and editors
|
|
/.idea
|
|
.project
|
|
.classpath
|
|
.c9/
|
|
*.launch
|
|
.settings/
|
|
*.sublime-workspace
|
|
|
|
# IDE - VSCode
|
|
.vscode/*
|
|
!.vscode/settings.json
|
|
!.vscode/tasks.json
|
|
!.vscode/launch.json
|
|
!.vscode/extensions.json
|
|
|
|
.nx
|
|
.nx/installation
|
|
.nx/cache
|
|
.claude/worktrees/
|
|
.claude/tmp/
|
|
# Local Chrome performance traces recorded by the AI-chat perf harness
|
|
.claude/perf-traces/
|
|
|
|
# TypeScript incremental build artifacts
|
|
*.tsbuildinfo
|
|
|
|
# Self-hosted VAD / onnxruntime-web assets (copied from node_modules at dev/build time)
|
|
apps/client/public/vad/
|