/code-patch — безопасная вставка и замена BSL
MCP routing
- Preferred path: use MCP
unicatoolunica.applyс операциямиcode.insertиcode.replace. - Do not call internal MCP/CLI adapters directly. They are hidden behind
unicaand synchronized by the orchestrator. - Всегда сначала
dryRun: true. ПрименяйdryRun: falseтолько после того, как пользователь явно попросил внести именно эту правку, и только сifRevиз предпросмотра.
Селектор — это адрес. Отдельного selector с method или anchor нет:
что править, называет args.at. У объекта с несколькими модулями роль входит в
адрес: узел метода — …Module.Object.Method.<Имя>, тело модуля целиком —
…Module.Object.Body. Общий модуль сам себе модуль, и сегмента роли у него нет
вовсе: CommonModule.<Имя>.Method.<Имя> и CommonModule.<Имя>.Body. Адрес и
точнее селектора, и переживает переименование файла, и уже проверен чтением.
Правится модуль существующего объекта метаданных в допущенном наборе
исходников формата платформы. Физический путь к *Module.bsl остаётся
внутренней деталью: наружу его отдаёт только аварийный unica.resolve, и в
обычном ходе работы он не нужен. Создать объект метаданных, удалить модуль
целиком, править EDT или внешние файлы, синхронизировать исходники с базой
этим путём нельзя.
Если правку нельзя выразить одной безопасной операцией, остановись: прочитай
предмет через unica.view {at} на узле модуля — ветвь Method перечисляет
методы, ветвь Body отдаёт строки парами {line, text} — и вернись с более
узкой операцией.
Операции
| Операция | Что делает | args |
|---|---|---|
code.insert |
Вставляет текст в узел по адресу | at, text |
code.replace |
Заменяет содержимое узла по адресу | at, text |
Несколько операций одного вызова применяются как одна правка: либо все, либо ни одной.
Порядок
- Найди адрес:
unica.search {corpus: "names"}по имени объекта, затемunica.view {at}вниз по ветвямModuleиMethod. - Прочти предмет:
unica.view {at}на узле метода даёт подпись, контекст компиляции и собственные строки. - Предпросмотр:
unica.applyсdryRun: true. Ответ несёт план правки иnextс готовымifRev. - Применение: тот же вызов с
dryRun: falseи этимifRev. Без него правка отказывает — забор ревизии связывает предпросмотр с применением. - Проверка:
unica.check {at}на модуле. Новые находки важностиerrorблокируют.
MCP examples
Предпросмотр замены тела метода
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "unica.apply",
"arguments": {
"at": "main:CommonModule.Пример",
"ops": [
{
"op": "code.replace",
"args": {
"at": "main:CommonModule.Пример.Method.Выполнить.Body",
"text": " Возврат Истина;"
}
}
],
"dryRun": true
}
}
}
Применение с забором ревизии
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "unica.apply",
"arguments": {
"at": "main:CommonModule.Пример",
"ops": [
{
"op": "code.insert",
"args": {
"at": "main:CommonModule.Пример.Body",
"text": "Процедура Выполнить() Экспорт\nКонецПроцедуры"
}
}
],
"dryRun": false,
"ifRev": "<rev из предпросмотра>"
}
}
}