---
type: JS Module
title: mirror-parity.mjs
resource: npm/scripts/lib/mirror-parity.mjs
docgen:
  crc: 9d197800
  model: openai-codex/gpt-5.4-mini
  tier: cloud-min
  score: 90
  judgeModel: openai-codex/gpt-5.4-mini
---

## Огляд

Parity дзеркала правил: `.cursor/rules/n-<id>.mdc` має дорівнювати канонічному
`main.mdc` правила з inlined-шаблонами — тим самим трансформом, що його
застосовує синк (`readBundledRuleContent` → `inlineTemplateLinks` → mixin-extras).
Дрейф виникає, коли канонічний `.mdc` змінюють, не регенерувавши дзеркало.

Multi-dir: власник правила шукається у `npm/rules/<id>` і `plugins/<p>/rules/<id>`
(перший з `main.mdc`); решта тек `rules/<id>` інших джерел — mixin-extras, їхні
concern-mdc доінлайнюються після концернів власника (як у синку).

Використовується і тестом-гардом (drift === []), і разовою регенерацією.

## Поведінка

`listManagedMirrors` повертає лише ті дзеркала, для яких у репозиторії є канонічне джерело; зовнішні дзеркала без власника не потрапляють у результат. Для вибору джерела враховуються активні плагіни з `.n-rules.json`, тож склад і пріоритет списку залежать від цієї конфігурації.

`expectedMirrorContent` дає еталонний вміст дзеркала для конкретного канону з урахуванням пов’язаних mixin-джерел. Результат призначений для порівняння з реальним файлом дзеркала; якщо канон або пов’язані джерела змінюються, очікуваний вміст змінюється разом із ними.

`findMirrorDrift` повертає відсортований список ідентифікаторів дзеркал, які розійшлися з каноном. Порожній список означає відсутність дрейфу; помилки читання файлів не маскуються й переривають перевірку.

## Публічний API

- listManagedMirrors — Керовані дзеркала `.cursor/rules/n-<id>.mdc` з канонічним джерелом у ядрі або плагіні.
Дзеркала без канону (зовнішні) пропускаються.
- expectedMirrorContent — Очікуваний вміст дзеркала = канон з inlined-шаблонами + concern-mdc mixin-джерел
(той самий трансформ, що у синку).
- findMirrorDrift — Id дзеркал, що розійшлися з каноном (actual ≠ expected).

## Сценарії використання

- `npm/scripts/lib/tests/mirror-parity.test.mjs` (findMirrorDrift; live parity (цей репо)) — mirror == канон (без шаблонів) → без дрейфу; mirror ≠ канон → дрейф [x]; дзеркало без канону пропускається (не дрейф); .cursor/rules/n-*.mdc == inlined-канон (нема дрейфу)

## Гарантії поведінки

- Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
