/cfe-diff — Анализ расширения конфигурации
MCP routing
- Расширение — такой же набор исходников, как конфигурация, и читается тем же
MCP
unica:unica.viewпо адресу<набор>:Configurationи ниже,unica.checkдля валидации,unica.diffдля сверки узла с конфигурацией. - Не вызывай внутренние MCP/CLI-адаптеры и не подменяй набор исходников путём к каталогу выгрузки.
- Чтение расширения ничего не меняет. Правку веди через
unica.apply: BSL — операциямиcode.insertиcode.replace, предметные описания — операциями своего семейства. СначалаdryRun: true, затемdryRun: falseсifRevиз предпросмотра и только после явного подтверждения.
1. Какие наборы есть
unica.view {} называет каждый набор рабочего пространства и его вид. Набор с
видом EXTENSION — расширение; его имя и есть префикс адреса.
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": { "name": "unica.view", "arguments": { "cwd": "<workspace>" } }
}
2. Что содержит расширение
Корень расширения отвечает его идентичностью и составом.
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "unica.view",
"arguments": { "cwd": "<workspace>", "at": "ext:Configuration" }
}
}
| Что | Где в ответе |
|---|---|
| Имя, синоним, версия, поставщик | props.name, props.synonym, props.version, props.vendor |
| Назначение расширения | props.extensionPurpose |
| Префикс имён | props.properties.namePrefix |
| Режим совместимости расширения | props.properties.extensionCompatibilityMode |
| Сколько объектов в расширении | props.totalObjects |
| Состав по видам | branches — по ветви на вид с числом объектов |
props.support.state у расширения — extension: это его собственный статус
поддержки, а не поддержка объекта конфигурации.
Спуск по ветви даёт объекты вида, дальше — их модули и методы, как у обычного
набора: ext:Role → роль, ext:Module → модули расширения.
3. Валидация расширения
Вид набора выбирает валидатор: на корне расширения работает cfe, на его
объектах — валидатор вида узла.
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "unica.check",
"arguments": { "cwd": "<workspace>", "at": "ext:Configuration" }
}
}
Ответ несёт status, validators — какие валидаторы отработали — и
diagnostics. Узел, у которого валидаторов нет, отвечает status: "readable"
с пустым списком: это утверждение о читаемости, а не отсутствие проверки.
4. Чем объект расширения отличается от объекта конфигурации
unica.diff сравнивает один и тот же логический адрес в двух наборах.
Заимствованный объект есть в обоих, и различие приходит списком путей.
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "unica.diff",
"arguments": {
"cwd": "<workspace>",
"left": "main:Catalog.Валюты",
"right": "ext:Catalog.Валюты"
}
}
}
data.equal отвечает на вопрос целиком, data.changes[] перечисляет
расхождения с path, left и right. Собственный объект расширения в
конфигурации не зарегистрирован, и сравнение отказывает кодом not_found —
это и есть ответ «объект собственный, а не заимствованный».
5. Перехватчики
Перехватчик — метод модуля расширения с директивой &ИзменениеИКонтроль,
&Перед, &После или &Вместо. Он виден в проекции модуля расширения:
спустись до ext:<объект>.Module.<Роль>.Method и читай методы. Текст директивы
приходит вместе с телом метода по адресу ...Method.<Имя>.Body.
Поиск по тексту дешевле обхода модулей, но он литеральный: одного запроса
мало. Пройди по всем четырём директивам и считай набор полным только после
последней — &ИзменениеИКонтроль, &Перед, &После, &Вместо.
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "unica.search",
"arguments": { "cwd": "<workspace>", "query": "&ИзменениеИКонтроль", "scope": "ext:Configuration" }
}
}
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "unica.search",
"arguments": { "cwd": "<workspace>", "query": "&Вместо", "scope": "ext:Configuration" }
}
}
Чего поверхность не отвечает
Автоматической сверки «перенесена ли вставка &ИзменениеИКонтроль в
конфигурацию» на канонической поверхности нет. Проверяй перенос вручную:
найди вставку поиском в расширении, затем тем же поиском в наборе конфигурации
и сравни найденные места. Вывод о переносе делает читатель, а не инструмент.