История изменений
Что менялось в EDT-Bridge от версии к версии, с разбивкой по дням.
Заметные изменения EDT-Bridge, свежие сверху. Записи сгруппированы по дням; версии, вышедшие в
этот день, перечислены в заголовке. Формат основан на
Keep a Changelog, проект следует
семантическому версионированию. Jar плагина и обвязка
edt-bridge-mcp используют один номер версии.
06.09.2026 – 0.21.0
Добавлено
edt_project_errorsговорит, что маркер старше своего файла. Маркер – снимок, который переживает код, ради которого был записан, и отчёт по старым маркерам читался как свежий – узнать правду можно было только черезedt_clean_projectс полной пересборкой: минуты на большой конфигурации ради одного модуля. Теперь у каждой выведенной проблемы естьstale, если маркер старше последнего изменения файла на диске, иunsynchronized, если рабочая область это изменение ещё не прочитала; сводка их считает, аhintговорит, что делать.refresh=trueперечитывает суженную область и делает инкрементальную сборку перед чтением маркеров: секунды и на месте – там, где очистка пересобирала всё.
05.09.2026 – 0.20.0
Исправлено
edt_project_errorsоставляет НЕСКОЛЬКО важностей:severity: "ERROR,WARNING". Одна важность – не тот вопрос, который задают: вызов несуществующего метода EDT считает предупреждением, и проверка с фильтромERRORчитается чистой над сломанным кодом. Хуже того, форма с запятой не совпадала ни с одной важностью: на живой рабочей области из 13 698 проблем она отвечала нулём – неотличимо от чистой конфигурации.
02.09.2026 – 0.19.0
Добавлено
edt_validate_queryследит за временными таблицами пакета. Валидатор EDT проверяет каждый запрос против метаданных, а пакет – ни против чего, поэтому запрос, читающийПОМЕСТИТЬ-таблицу, которую ни один предыдущий запрос не создаёт или которую предыдущий уничтожил, признавался валидным и падал только на платформе. Теперь мост ведёт учёт того, что каждый запрос создаёт и уничтожает, и сообщает о таком чтении с позицией: ошибка дляqueryText, чей текст считается самодостаточным пакетом; заметка INFO для литерала модуля, где таблицу обычно даёт общий менеджер временных таблиц или другой литерал – на большой рабочей конфигурации все 195 таких чтений в 3125 литералах оказались законными.- У
edt_project_errorsпоявилась краткая формаbrief. По одной текстовой строке на проблему – важность, ресурс со строкой, сообщение, идентификатор проверки – под сводкой в одну строку, вместо полных объектов сextraInfoи путями, которыми прежде оплачивался вопрос “чист ли этот объект”.
Изменено
- Страница инструментов говорит, что видит
edt_project_errors. Вызов метода, которого нет в другом модуле, для EDT предупреждение (SU239), а не ошибка – ошибка только у неопределённого вызова без имени модуля, – аmodulePathдостаёт одни маркеры Eclipse, поэтому проверка сгенерированного кода читает предупреждения и сужает черезfqn. Замерено на живой модели, где такой вызов выглядел чистым.
30.08.2026 – 0.18.1
Изменено
- Описание пакета называет то, что даёт мост. Сводка на карточке PyPI описывала одну обвязку – посредника до работающей EDT – и молчала про диагностики, метаданные, валидацию запросов, инструменты записи, информационные базы и отладчик за ней.
28.08.2026 – 0.18.0
Добавлено
- Плагинам доступен живой мост. Обработчик плагина, объявивший параметр
bridge–handler(arguments, bridge), – получает функцию: один вызов инструмента работающего моста, в ответе текст его результата. EDT ради этого не запускается: без моста функция поднимает исключение с внятным сообщением, и плагин отвечает запиской, а не вешает вызвавшего на минуты headless-старта. Функцию передают оба пути диспетчеризации – MCP-сервер иcallиз командной строки. Именно это позволяет плагину документации искать по обоим корпусам сразу: книги, которые он несёт с собой, плюс синтакс-помощник за мостом – одним поиском. self-updateобновляет и плагины обвязки. Каждый пакет с точками расширенияedt_bridge.toolsобновляется через pip из источника своей установки – git-репозитория (читается изdirect_url.jsonпо PEP 610) либо реестра пакетов по имени проекта; адрес реестра задаётEDT_BRIDGE_PLUGIN_INDEX. Дорога к pip выбирается по окружению:pipx runpipдля pipx-окружения (работает и на venv от uv, где модуля pip нет), иначе собственный pip окружения; в отличие от самой обвязки, у плагина нет exe, который держал бы работающий клиент, поэтому путь через pip здесь безопасен.--plugins-onlyограничивает запуск плагинами; по каждому печатаетсяимя: было -> стало.
27.08.2026 – 0.17.0
Добавлено
- Обвязка принимает плагины. Внешние пакеты, установленные в окружение обвязки
(
pipx inject edt-bridge-mcp <пакет>), объявляют инструменты MCP через группу точек расширенияedt_bridge.tools; обвязка перечисляет их рядом с инструментами моста и выполняет сама – они отвечают даже тогда, когда ни одна EDT не запущена. Это дом для того, чему не место в публичном репозитории: справочных материалов под чужой лицензией, инструментов, завязанных на внутренний сервис. Командаpluginsпоказывает, что подключено и почему сломанный плагин не загрузился;EDT_BRIDGE_NO_PLUGINS=1выключает поиск. Несработавшая точка расширения, повтор имени инструмента и имя, затеняющее собственные инструменты обвязки, громко отвергаются при обнаружении – кроме самого MCP-сервера, который продолжает обслуживать мост и сообщает о сбое в stderr, а не умирает вместе со всеми инструментами.
26.08.2026
Добавлено
edt_validate_queryберёт запрос из самого модуля. Вместо вставки текста можно назвать модуль (modulePath, при желании одинmethod): мост достаёт из живой модели литералы запросов с обрамлением|, снимает обрамление и проверяет каждый – проверенный текст не может разойтись с тем, что лежит в модуле, а один вызов покрывает все запросы модуля. Что считается запросом, сужено сознательно: многострочный литерал с обрамлением, чьё первое слово – ВЫБРАТЬ или SELECT; однострочная подпись до валидатора не доходит, куски запроса, собираемого конкатенацией, не подходят никогда.
23.08.2026 – 0.15.0, 0.16.0
Добавлено
edt_add_form_handlerрегистрирует обработчик события формы или её элемента – ту записьhandlersвForm.form, без которой платформа процедуру не вызывает. Список допустимых событий берётся у EDT, а заготовка, которую инструмент может записать, несёт сигнатуру и директиву самого события.edt_modify_form_itemпереименовывает элемент (newName) – раньше это было нечем сделать:edt_renameработает по метаданным, а не по частям формы.- Учётные данные информационной базы – в схеме
edt_infobase_sessions:infobaseUserиinfobasePasswordчитались, но не объявлялись, и найти их вызывающему было негде.
Изменено
- Инструменты форм сошлись на одном имени параметра –
formFqn.edt_form_structureиedt_form_renderзвали егоfqn, а всё, что форму пишет, –formFqn; расхождение было косметическим, пока аргумент вне схемы не начал отменять вызов. Прежнее имя по-прежнему читается, а в ответах рядом со старым ключомfqnпоявилсяformFqn.
Исправлено
shutdownвидит сеанс, у которого замолчал порт. CLI переживает framework, который в нём работал, и держит блокировку воркспейса, а ответ был “нечего останавливать” – следующий запуск падал на блокировке, которую никто не искал.--json-fileпринимает файл с меткой порядка байтов – именно такой пишут оболочки Windows по умолчанию.edt_dump_external_objectуходит на дисковый маршрут, когда отказал штатный дампер – на объекте, привязанном к базовой конфигурации, всё кончалось отказом, – и возвращает автогенерацию выгрузок, если отказ её выключил.routeзадаёт маршрут явно.scripts/sync-docs.mjsпереносит перевод строки CRLF – раньше начальный блок страницы попадал в блок README, и тот выглядел устаревшим.- Аргумент, которого нет в схеме, отменяет вызов. Раньше он молча отбрасывался: удаление,
заказанное с
deleteContents, оставляло файлы на диске и отвечало как о сделанном. Отказ называет близкое имя и перечисляет принимаемые аргументы. - Скрипты запуска называют установку, из которой стартуют. Установок EDT на машине
несколько, скрипт выбирает её сам, а подменённый jar лежит в dropins той, которую записали:
правка, ушедшая в другую установку, выглядела как несобравшийся jar.
run-headless.ps1иrun-gui.ps1печатают установку, её dropins, имя и время jar моста, предупреждают, когда jar два (Equinox грузит произвольный) и когда собранный вbuild/новее установленного.
17.08.2026 – 0.14.0
Добавлено
- Объектные типы в грамматике реквизита формы –
ВнешняяОбработкаОбъект.X,СправочникОбъект.Xи остальная семья теперь разбираются, то есть основной реквизит формы можно добавить инструментом. Раньше разбирались только ссылочные типы, аedt_add_form_attributeотвечал “type does not parse”: реквизит, через который форма дотягивается до модуля объекта, приходилось дописывать вForm.formруками.
Исправлено
- Заголовок таблицы больше не тиражируется в каждую сгенерированную колонку. EDT передаёт дескриптор нового элемента каждой колонке, которую порождает из связанного реквизита, поэтому таблица с заголовком “Курсы валют” выходила с этой же надписью у всех колонок. Теперь таблица создаётся без заголовка и получает его следом, а колонки сохраняют штатный заголовок EDT.
16.08.2026 – 0.13.0
Добавлено
edt_import_project– зарегистрировать в workspace СУЩЕСТВУЮЩИЙ каталог проекта, программный аналог “Импорт существующего проекта”. Этого шага не хватало в цикле создать–поработать–удалить: второй проект – БАЗОВЫЙ, с которым сверяется расширение в режиме изменения и контроля, взятый из worktree целевого релиза, – добавлялся только руками в интерфейсе. Своё имя позволяет держать рядом два чекаута одного репозитория, на диске ничего не переписывается.- Все переменные
EDT_BRIDGE_*описаны – двумя таблицами на странице установки: что читает обвязка при своём запуске и что читает плагин внутри EDT, у каждой строки флаг или свойство запуска и значение по умолчанию.EDT_BRIDGE_PORT_SCANиEDT_BRIDGE_WINDOW_WAITне были названы вообще нигде, остальные жили только в README обвязки, вне сайта. - Сторож документации –
scripts/docsguard.py, его гоняет набор тестов обвязки, а значит и CI. Он валится на инструменте без строки на странице инструментов, на упоминании инструмента, которого больше нет, на переменной, которую код читает, а документация не называет, на протухшем блоке в README и на картинке, за которой нет файла. Каждое замечание провоцируется тестом: проверка, тихо переставшая что-либо находить, выглядит ровно как чистый репозиторий.
Изменено
- У каталога инструментов один источник. Он вёлся руками и в README, и на странице сайта;
теперь источник –
docs/tools*.md, аscripts/sync-docs.mjsвставляет его в README между маркерами, на обоих языках. - Схемы следуют теме читателя. Палитра переехала в переменные CSS с ветвью
prefers-color-scheme, поэтому на сайте картинка совпадает со страницей вокруг неё. README по-прежнему получает PNG, но какую палитру несёт этот PNG, больше не решает машина, которая его рисует:scripts/render-diagrams.py(взаменrender-diagrams.sh) закрепляет палитру перед снимком. - Схема архитектуры открывает главную страницу – раньше до неё можно было добраться только из README на GitHub, странное место для картинки, объясняющей всё устройство.
- Страница безопасности перестала повторять себя. На ней был список из README, а следом модель угроз, пересказывающая его же, и ссылка обратно в README “за полной картиной”. Список теперь один, а настройки порта ведут к переменным окружения.
Исправлено
edt_clean_projectбольше не объявляет число замечаний окончательным до того, как отработали проверки. Он ждал, пока счётчик перестанет меняться, но проверки EDT не входят в семейства заданий сборки, которых он дожидается: сразу после очистки счётчик стоит на нуле просто потому, что ничего ещё не сообщено, а “0 замечаний, устаканилось” – худший из возможных ответов: за этим числом и звали очистку. Теперь ожидание требует ещё и покоя workspace, а в ответе видно, работали ли проверки вообще.edt_build_extensionсоздаёт каталог файла, который пишет.ibcmdего не создаёт, а его отказ читается как проблема сборки, а не как отсутствующая папка. В сухом прогоне теперь названо, какой каталог будет создан.- Схема поставки не понимала тему читателя на странице инструментов. Страница вставляла PNG –
тот файл, у которого палитра закреплена ради README, – и читателю в светлой теме доставалась
тёмная картинка. Теперь страница показывает SVG, а вставляемая в README копия получает PNG
подменой в
scripts/sync-docs.mjs: источник один, на каждой поверхности свой файл. Сторож это судит – такую оплошность не видно, пока кто-нибудь не откроет страницу в другой теме. - Копия каталога инструментов в README разошлась со страницей сайта – у
edt_designer_agentпоявились уборка и остановка по простою, а собственный инструмент обвязкиedt_open_guiтам не значился вовсе. И то, и другое было только на сайте; теперь это один текст.
07.08.2026 – 0.12.0
Добавлено
edt_project_errorsназывает каталог диска за каждым проверенным проектом (объектlocationsотчёта; о нём же говорит описание инструмента). Модель проверяет ЗАРЕГИСТРИРОВАННЫЙ каталог, и правящий параллельный чекаут тех же исходников получал правдоподобный отчёт про ЧУЖОЕ дерево – молча, имена файлов ведь совпадают. Теперь расхождение видно в самом отчёте.edt_symbol_infoотвечает вычисленными типами локальной переменной. Ссылка на переменную (даже присвоенную строкой выше) давалаtypes: [], хотя ховер редактора типы показывал: переменная половина системы типов ВЫВОДИТСЯ, а голая загрузка ресурса состояний типов не несёт. Инструмент теперь ставит древесную систему типов на модуль по требованию (один проход вывода на запрос) и считает по фактическим окружениям модуля. На имени вызываемого метода ответ несёт ещё иinvocationTypes– вычисленные типы самого вызова рядом с ОБЪЯВЛЕННЫМ типом возврата доступа; ровно до них раньше добирались, тыкая в запятые и закрывающие скобки.
Изменено
- Сборка из исходников сама подбирает JDK под бандлы EDT. Новые версии EDT несут class-файлы Java 25, и компиляция против такого пула требует JDK, умеющего их читать: скрипт сборки теперь читает уровень class-файлов из пула и сам находит подходящий JDK – включая установленный рядом с EDT, – а не умирает на слишком старом JAVA_HOME. Jar по-прежнему собирается под Java 17, поэтому одна сборка грузится и в версиях EDT на Java 17.
31.07.2026 – 0.11.2
Исправлено
self-updateсразу после релиза больше не пропускает его. Список файлов обвязки брался из JSON-метаданных PyPI – кэша, который догоняет публикацию минутами: в этом окне команда отвечала “уже актуально”, а с явной версией – “нет колеса”, потому что файлы читались из того же отстающего документа. Теперь список берётся из SIMPLE-индекса (PEP 691), последняя версия ранжируется численно (0.9.0раньше0.11.1, без предрелизов и отозванных файлов), а JSON остался запасным путём для индекса, который PEP 691 не понимает. Затронута только половина с обвязкой – jar по-прежнему приходит из ассетов релиза GitHub, а там такого кэша нет.
31.07.2026 – 0.11.1
Исправлено
self-update --fromпринимает корень репозитория. Обвязка живёт в подкаталогеpython/, и команда требовала именно его: переданный корень - а его передают естественно - получал ответ “no edt_bridge_mcp package”, и очевидная команда превращалась во вторую попытку. Теперь проверяются все три расположения, а каталог без пакета сообщает, где именно искали.
30.07.2026 – 0.11.0
Добавлено
edt_open_gui– передача воркспейса от headless EDT к клиентской. Чтобы получить окно EDT, приходилось искать 1cedtcli в диспетчере задач, снимать его и запускать EDT руками: мост умел остановить свою EDT, но не открыть следующую. Инструмент останавливает headless, дожидается, пока его процессы действительно исчезнут, и запускает клиентскую EDT на том же воркспейсе. Один/shutdownтакую сессию не завершает, что показала живая проба: каркас OSGi останавливается, порт замолкает, а 1cedtcli продолжает работать - он запущен с keepalive-трубой на stdin. Поэтому следом закрывается keepalive-обёртка: это не убийство EDT (та уже остановила себя сама), а закрытие трубы, которой держится процесс, после чего CLI получает EOF и выходит. Ждать порт недостаточно – он замолкает, пока среда ещё держит блокировку воркспейса, и именно этот остаток потом ищут руками;forceснимает то, что не завершилось в срок, первой - keepalive-обёртку: она родитель CLI, и убийство дерева снизу до неё не достаёт. Инструмент отдаёт ОБВЯЗКА, а не мост: инструмент внутри EDT не может отчитаться об EDT, которую сам же завершил. В шелле –edt-bridge-mcp gui.- Окно выводится ВПЕРЁД, а повторный вызов команды поднимает его снова. У отсоединённого
процесса нет прав на передний план: рабочее место открывалось позади всех окон, и это
неотличимо от “не запустилось вовсе”. Запуск больше не отсоединяется, а окно ищется обходом
дерева процессов запускателя: оно принадлежит javaw, которую тот поднимает, а javaw живёт в
том JDK, который разрешила установка, – вовсе не обязательно внутри каталога EDT. Большой
воркспейс грузится минутами, поэтому ожидание окна ограничено (
EDT_BRIDGE_WINDOW_WAIT, 90 секунд), и промах сообщается, а не пережидается.
Исправлено
- На локализованной Windows обвязка не видела ни одного процесса EDT.
tasklistотвечает в OEM-кодировке консоли, а обвязка декодировала вывод как UTF-8: декодирование падало в потоке чтения и оставляло список ПУСТЫМ, что все вызывающие читали как “процесса нет”. Поэтому защита, запрещающая поднимать headless при запущенной клиентской EDT, на такой машине не срабатывала никогда, и вторая EDT стартовала на заблокированный воркспейс. Вывод декодируется кодировкой консоли.
27.07.2026 – 0.10.0
Добавлено
- Агенты конфигуратора убирают за собой. Каждый агент пишет в свой
/AgentBaseDir– каталог, который штатная остановка удаляет, а падение оставляет, – след с именем базы, процессом и идентификатором сеанса, который он открыл в кластере. Найдя такой след с мёртвым процессом, мост завершает ИМЕННО ЭТОТ сеанс и убирает каталог: сеанс упавшего агента держит БЛОКИРОВКУ КОНФИГУРИРОВАНИЯ базы, и до сих пор следующий вызов падал с “Ошибка блокировки информационной базы для конфигурирования”, пока сеанс не находили и не снимали руками. Принадлежность ДОКАЗЫВАЕТСЯ следом, а не угадывается по хосту и пользователю сеанса: EDT поднимает собственных агентов конфигуратора, со стороны кластера они неотличимы от наших, и очевидная эвристика завершила бы конфигуратор самого разработчика. Уборка идёт перед каждым запуском агента и по требованию –edt_designer_agent action=sweep;action=listпоказывает остатки, аstopRunning=trueостанавливает и живых агентов прежнего запуска моста (по умолчанию выключено). - Простаивающий агент останавливается сам. Стоящий агент серверной базы всё время своей жизни
занимает клиентскую лицензию и сеанс конфигуратора, а на стенде с малым пулом это место, отнятое
у человека. Настраивается через
edt.bridge.agent-idle-minutes/EDT_BRIDGE_AGENT_IDLE_MINUTES/ настройкуagentIdleMinutes: по умолчанию 30 минут,offили0выключают – как и НЕРАСПОЗНАННОЕ значение, сознательно: опечатка не должна молча сокращать жизнь агента. Вызов в работе всегда важнее: жнец берёт блокировку агента и держит её всю остановку, поэтому операцию нельзя оборвать на середине.edt_designer_agent action=listпоказывает время простоя каждого агента и настроенный таймаут.
Исправлено
- Остановка агента больше не оставляет его сеанс в кластере. Вежливое завершение запрашивалось, и процесс тут же убивался, не успевая закрыть соединение с базой, – то есть каждая остановка производила ровно ту сироту, о которой сказано выше; убитый процесс вдобавок держал открытым собственный лог, и каталог агента тоже оставался. Теперь процессу дают уйти самому (20 с) и убивают только после этого, а если убить всё же пришлось – сеанс завершается явно.
24.07.2026 – 0.9.0
Добавлено
edt_infobase_maintenance– окно обслуживания вокруг обновления конфигурации базы данных, черезrac:beginподнимаетscheduled-jobs-deny(по запросу иsessions-denyс кодом доступа), ждёт, пока в списке сеансов останутся только разрешённые приложения, и отвечает “clear to update”;endопускает флаги;statusтолько отчитывается. Смысл: на живой базе сеансы BackgroundJob пересоздаются каждую минуту, и завершать их бесполезно – с поднятым флагом они иссякают сами за минуту, убивать никого не нужно. Проверено вживую на кластерной базе: поднятый флаг остановил пересоздание и задания иссякли сами; опущенный вернул очередь за секунды. Агент конфигуратора этого не умеет вовсе – в его SSH-клиенте нет операции для флагов запрета, – поэтому путьrac, и инструменту нужен администратор базы.- Справочник команд и его генератор под тестами (
python/tests/test_cli_docs.py): каждый аргумент описан, русский прогон действительно русский, языковые версии различаются, каждая команда покрыта разделом страницы и отвечает на--helpза отведённое время, а закоммиченные страницы равны выводу генератора. Сам генератор получил недостающий таймаут – команда, не разбирающая--help, поднимает сервер и виснет. edt_add_routeпредупреждает о конструкции, которая не загрузится: СОБСТВЕННЫЙ шаблон URL у ЗАИМСТВОВАННОГО сервиса расширения EDT принимает и молча сериализует, но платформа отказывается загружать его в режиме совместимости расширения 8.5.1 и ниже. Ответ теперь несётserviceAdopted,compatibilityModeрасширения и предупреждение ровно об этом – раньше отказ всплывал только на загрузке в базу, далеко от инструмента, писавшего маршрут.edt-bridge-mcp shutdown– штатное завершение EDT, обслуживающей мост, вместо убийства её процессов. Обвязка шлёт мосту новый/shutdown(под токеном), тот останавливает OSGi-фреймворк по порядку:.lockрабочей области освобождается для запуска GUI, а агенты конфигуратора, которые держит сама EDT, закрываются корректно – их сеансы уходят из кластера вместе с ними, тогда как убитый процесс оставляет сеанс держать конфигурационную блокировку. GUI EDT без--forceполучает отказ, чтобы скрипт случайно не закрыл чьё-то окно; shutdown без работающего моста – тихая пустая операция.
Изменено
- Применённое
edt_infobase_sessions terminateотвечает идентификаторами завершённых сеансов (иterminatedCount) вместо полного списка: список снимался до завершения, и завершённые сеансы выглядели в нём живыми – а на живом кластере ответ тонул в шуме.list, dry-run и частичный сбой список сохраняют. edt_delete_objectговорит в описании то, чему научил живой прогон: построение каскада удаления анализирует ссылки по всем открытым проектам – в workspace с большой конфигурацией это минуты, и операция доходит до конца, даже когда клиент перестал ждать. Пятиминутное “зависание” первого удаления в проекте расширения было ровно этим: каскад доработал в фоне и оставил модель чистой.edt_update_infobase(transport=edt) говорит, что поедет следом: у синхронизации EDT нет границы “один проект” – база приводится в соответствие ВСЕМ ассоциированным с ней проектам workspace, а конфигурационный проект тянет свои проекты-расширения по зависимости. Ответ перечисляет их вsyncProjects, план называет поимённо, а обновление нескольких проектов несёт предупреждение со ссылкой на transport=agent для загрузки одного. Раньше обновление из основной конфигурации молча утаскивало два посторонних проекта-расширения.- Агент конфигуратора ФАЙЛОВОЙ базы останавливается сразу после операции: живущий агент держал базу открытой, и следующий пакетный конфигуратор – или человек, открывающий Конфигуратор, – получал отказ “база уже открыта”. Серверная база держит агента между вызовами, как раньше; переподключение к локальному файлу дёшево, блокировка – нет.
- Отказ “Ошибка блокировки информационной базы для конфигурирования” несёт подсказку: обычный
виновник – Designer-сеанс погибшего агента (кластер хранит сеанс, сеанс держит блокировку,
а текст платформы туда не указывает). Подсказка называет
edt_infobase_sessionsкак выход.
Исправлено
- Агент сам переподключается, когда реструктуризация базы роняет соединение процесса с ИБ: “Соединение с информационной базой не установлено” – это отказ ДО выполнения команды, поэтому каждая операция через агента теперь один раз переподключается и повторяет себя, а не падает – прежде этот ответ стоил ручного повтора после каждой тяжёлой операции (замерено: пять раз за вечер). Прочие ошибки проходят как раньше.
edt_infobase_sessionsпадал “Ошибка разбора параметра: –infobase-user”, когда передавались реквизиты информационной базы:rac session listпринимает только--infobaseи--licenses, аутентификации базы у него нет вовсе. Реквизиты туда больше не передаются (и инструментом не объявляются) – они принадлежат операциям, которым действительно нужны.- Сообщения об ошибках агента больше не топят диагноз в лицензионном дампе платформы: один отказ приезжал десятками килобайт – полный перечень оборудования, повторённый на каждый файл лицензии и каждую стадию поиска, и ещё раз обёрнутый SSH-клиентом. Шлюзы теперь выбрасывают инвентарные строки и повторы (с пометкой “N строк опущено”); обычные сообщения проходят нетронутыми. Замер вживую: ~25 КБ -> 2.4 КБ, первая строка сразу говорит “нет лицензии”.
- Платформа говорит на двух языках, и мост теперь слышит оба: каждый распознаваемый ответ – отказ конфигурационной блокировки, ответ агента “соединение не установлено” (он запускает автопереподключение), “расширение не найдено”, запрос учётных данных ibcmd – сверяется и с английской формулировкой, и с русской; обе взяты из ресурсных файлов самой платформы. Прежняя английская догадка распознавателя ibcmd (“authentication is required”) исправлена на настоящую строку платформы (“Authentication in the infobase is required…”), мимо которой она промахивалась.
22.07.2026 – 0.8.0
Добавлено
- Справка CLI обвязки стала двуязычной. Каталог i18n (
ru/en, язык изEDT_BRIDGE_LANG, иначе локаль) покрывает описания флагов и команд, usage, эпилог, встроенные строки argparse и рукописную справкуself-update. Ответы инструментов агенту остались английскими – это протокольная поверхность плагина, а не текст для человека. edt_project_errorsсообщаетsourceTypeмаркера и егоextraInfo– именно это различает два семейства проверок: документированные приходят из фреймворка стандартов, а короткий код вродеSU200– из собственной проверки метаданных EDT.edt_check_infoраспознаёт короткий код и объясняет, что это, вместо ответа “ничего не найдено”. Никакого соответствия “код – идентификатор” внутри движка проверок, как предполагалось в 0.7.1, нет: семейства просто разные, и путь к описанию – совпадение по заголовку.
Исправлено
run-headless.ps1отказывался стартовать, если существовал любой процесс графической EDT, включая уже закрываемый. Теперь проверяются настоящие конфликты – порт, замок воркспейса, общий каталогdropins. Рядом всплыли два:-Portменял только опрашиваемый порт, поэтому нестандартный порт поднимал второй сервер на 8770; и воркспейс без проектов объявлялся неготовым, хотя сервер работал.
21.07.2026 – 0.6.0, 0.7.0, 0.7.1
Добавлено
- Агент конфигуратора как третий транспорт к информационной базе. Запущенный с
/AgentMode, он держит открытый сеанс и принимает команды по SSH – и входит в базу под учётной записью пользователя, чего не могут ни синхронизация EDT, ниibcmd. Серверная база, спрашивающая, кто к ней пришёл, стала достижима, вместе с расширениями. Один агент на базу, переиспользуется;edt_designer_agentпоказывает и останавливает. edt_infobase_config_state– ждёт ли обновление конфигурации базы данных? Отвечает сама платформа: обновление запускается, а подтверждение ему отказывается, поэтому ничего не применяется, а ожидающие изменения возвращаются списком.edt_update_database_config– применяет конфигурацию базы данных. Загрузка проекта этого не делает, и до применения каждый сеанс выполняет прежний код – именно так выглядит свежий HTTP-маршрут, отвечающий 404.sessionTermination=forceпроходит запрет / завершение / применение одним вызовом.edt_infobase_sessions– сеансы кластера черезrac: перечислить и завершить. Ни агент, ниibcmdдо них не дотягиваются. Понадобилось из-за тупика: убитый, а не закрытый конфигуратор держит замок конфигурации, и дальше любая операция падает так, будто базу конфигурирует кто-то ещё.edt_delete_extension– снять расширение с базы, шаг, замкнувший односторонний жизненный цикл. Требуетforceповерхapply.edt_infobase_dump– выгрузить базу в.dtчерезibcmd: та самая резервная копия, которой место перед применением конфигурации.edt_update_infobaseпринимаетtransport=agent: XML конфигуратора уходит прямо в базу, без временной базы и без.cfпосередине – это и делает путь пригодным для конфигурации на миллион объектов.edt_extension_propertiesпринимаетinfobaseи идёт через агента – только так расширения серверной базы вообще достижимы.edt_add_route– добавить маршрут вHTTPService. Раньше это означало править.mdoруками и сочинять uuid блокаurlTemplatesи вложенногоmethods.- Инструменты поверх ibcmd принимают учётные данные информационной базы рядом с данными СУБД. Без них ibcmd спрашивает имя пользователя в стандартном вводе – для неинтерактивного вызова это зависание, а не ошибка, и EOF он игнорирует (134 МБ приглашений за 60 секунд, замерено). Вывод теперь читается порциями, а процесс снимается, как только приглашение появилось.
- Инструменты поверх агента адресуют базу, которой EDT не знает:
srv\базаили каталог файловой. - У каждого вызова ibcmd свой рабочий каталог; иначе они запирают один и тот же, и следующий вызов где угодно падает.
Изменено
edt_project_errorsумеет отвечать на вопрос “что не так с модулем, который я только что правил”. Раньше он принимал имя проекта и возвращал всё – на большой конфигурации это 13 850 замечаний и ~5 МБ. Появилисьfqn/modulePath,severityиcountOnly, а такжеtotal,bySeverity,bySourceи ограничение списка.edt_module_textпринимаетincludeMethods(по умолчанию true): запрос одного метода больше не тянет за собой весь перечень модуля – 147 методов на одном рабочем модуле, и так при каждом чтении.edt_module_text,edt_add_methodиedt_delete_methodпонимаютHTTPService.XиWebService.X: все три страдали от одного пробела в карте каталогов.- В таблицах инструментов README появился раздел про всё, что говорит с запущенной базой, с явным указанием транспорта – что чем достижимо, читателю нужно в первую очередь. Обе схемы перерисованы.
- Набор тестов обвязки и workflow
ci(Linux и Windows, 3.10 и 3.12), который оба релизных workflow вызывают первым, поэтому красные тесты останавливают релиз. Ядро набора – три регрессии, которые реально уехали в релиз. - Тесты JUnit для той части плагина, что не зависит от EDT: она вынесена в
...edtbridge.core, поэтому её собирает и проверяет обычный JDK.
Исправлено
self-updateоставлял старый jar вdropins, когда релизный уже лежал там, – а две копии одного бандла и заставляют Equinox взять произвольный.- Схемы потеряли прозрачные углы;
scripts/render-diagrams.shтеперь фиксирует флаги, которые это решают, – рецепт до сих пор нигде не жил.
19.07.2026 – 0.3.0, 0.3.1, 0.4.0, 0.4.1, 0.5.0
Добавлено
- Формы целиком:
edt_add_formсоздаёт управляемую форму штатным генератором EDT – тем самым, что стоит за мастером “Новая форма”. Элементы (edt_add_form_itemи пара на изменение и удаление) идут через службу, которую вызывает сам редактор форм, поэтому имена, идентификаторы, фактический тип поля и автозаполнение колонок таблицы решает EDT. Так же и реквизиты с командами:edt_add_form_attributeиedt_add_form_commandсо своими парами, идентификаторы из штатной службы, заготовка обработчика пишется в модуль формы. Удаление перечисляет, что ещё ссылается, и требуетforce. edt_adopt_object– заимствовать объект базовой конфигурации в расширение штатным адаптером EDT. Без него созданный проект расширения останавливался на полпути: перехват метода требует, чтобы владелец был заимствован.edt_search_modules– полнотекстовый поиск по модулям проекта. Чтение идёт через буферы Eclipse, поэтому открытый в редакторе модуль ищется в том виде, в каком он сейчас, вместе с несохранённым.edt_clean_project– сбросить результаты сборки, чтобы проверки прошли заново, программный аналог “Очистить” в EDT. Иначе устаревший маркер переживает код, который его вызвал.edt_delete_project– удалить проект из воркспейса через Eclipse, чтобы обновилось дерево ресурсов; удаление папки руками оставляет призрачный проект, занимающий имя.edt_extension_properties– читать и задавать то, что расширение несёт внутри базы (безопасный режим, защита от опасных действий, активность, область). Свежезарегистрированное расширение получает безопасный режим и защиту включёнными, а расширение, меняющее методы базовой конфигурации, ни под тем, ни под другим не работает.edt_build_extensionиedt_update_infobaseсообщаютchangesMethodsи, если он истинен, называют два флага, которые должны быть сняты.- Обвязкой
edt-bridge-mcpможно управлять из шелла:call <инструмент>,tools,status. Раньше всё вне MCP-клиента означало писать своего клиента к порту 8770. Коды возврата разводят “вызов не состоялся” (1) и “инструмент отработал и вернул ошибку” (2). self-update --from <каталог>ставит обвязку из локальной сборки вместо PyPI.- Инструменты платформы и баз:
edt_platform_installations,edt_register_platform,edt_create_infobase,edt_build_extension(сборка.cfeчерезibcmd). edt_metadata_detailsсообщает флаги компиляции общего модуля и состав плана обмена – за тем и другим раньше приходилось идти в.mdoна диске.edt_create_external_objectпринимаетscriptVariant: EDT по умолчанию делает отдельный проект английским, из-за чего сгенерированные члены выходили какObject, а неОбъект.- Страница настроек EDT-Bridge (токен, порт, переключатель evaluate), чтобы графическая EDT, запущенная обычным ярлыком, умела пускать инструменты записи.
Исправлено
edt_create_extensionсоздавал проект, который не принимала ни одна база: загрузка падала с “Загрузка не должна менять принадлежность основного объекта конфигурации”. КорневойConfigurationстроился фабрикой метаданных, а она даёт обычную полную конфигурацию. Теперь корень – заимствованная базовая конфигурация, тот же шаг, что делает штатный мастер, и движок пишет всё, что расширению положено. Заодно закрылись два следствия: заимствованные объекты несут uuid-связь с базовым объектом вместо привязки по имени, а язык базовой конфигурации приходит вместе с ней.edt_dump_external_objectснова собирает.epf/.erfтам, где EDT не может: она берёт самую свежую сборку линейки, поэтому линейка с тонкими клиентами наверху падала сMatchingRuntimeNotFound. Появился путь через диск, а сухой прогон перестал врать про него.- Модули внешних объектов разрешаются по FQN –
ExternalDataProcessorиExternalReportпросто отсутствовали в карте каталогов. self-updateне мог обновить обвязку на свежем pipx: в venv, собранном через uv, вообще нет pip. Установщик больше не используется – колесо распаковывается поверх пакета средствами стандартной библиотеки.- Обвязка два релиза сообщала устаревшую версию:
__init__.pyнёс литерал, которыйpyproject.tomlне использовал. Теперь версия пакета берётся из этого одного атрибута. - MCP-сервер сообщает собственную версию плагина из манифеста бандла, а не захардкоженную строку, поэтому дашборд и хендшейк не могут разойтись.
- Обвязка фиксирует UTF-8 в стандартных потоках. На Windows они по умолчанию брали кодовую страницу
ANSI, и “→” в описании инструмента рвал
tools/list– клиент не регистрировал ни одного инструмента. edt_infobasesраскрывает группы, поэтому сгруппированные и серверные базы больше не теряются.
Изменено
- Внутреннее: единый шлюз к модели разбит на шлюзы по областям (проект, чтение и запись метаданных, формы, платформа, отладка, BSL, документация). Чистый рефакторинг.
18.07.2026 – 0.1.0, 0.1.1, 0.2.0, 0.2.1
Добавлено
- Полный цикл создать / разработать / собрать / доставить по MCP, инструменты записи – с сухим прогоном по умолчанию.
- Обвязка
edt-bridge-mcp(pipx): перенаправляет в запущенную EDT, сама поднимает headless, если ни одна не открыта, и доставляет jar плагина вdropins/. edt_platform_help– Синтакс-помощник платформы из поставки EDT: настоящий справочник по API, с поиском, на русском и английском.- Многопоточный MCP-сервер и фолбэк по порту: если 8770 занят, берётся следующий свободный, и обвязка его находит.
Исправлено
applyпри создании проектов работает надёжно: собирается и присоединяется отдельная Configuration или внешняя обработка, вместо того чтобы спорить с жизненным циклом headless EDT.
Изменено
- Типографика по правилам проекта во всём репозитории – среднее тире вместо длинного, три точки вместо символа многоточия, – включая описания инструментов и обвязку.
11.07.2026 – 0.0.1
Добавлено
- Первый выпуск: инструменты чтения по MCP (проекты, проблемы валидации, детали и списки метаданных, ссылки, валидация запросов, формы), встроенная панель и MCP-сервер на localhost.