История изменений
Что менялось в elemctl от версии к версии, с разбивкой по дням.
Заметные изменения elemctl, свежие сверху. Записи сгруппированы по дням; версии, вышедшие в этот день, перечислены в заголовке. Формат основан на Keep a Changelog, проект следует семантическому версионированию.
06.09.2026 – 0.35.0
Добавлено
projects list --nameи--include-deleted; те же фильтры принимает инструмент MCPlist_projects. Платформа держит удалённые проекты в перечне с признаком, и стенд, живущий не первый месяц, отвечал на проверку имени проекта сотней с лишним карточек, почти сплошь удалённых. Теперь удалённые скрыты, пока их не попросят, аnameсужает перечень по подстроке без учёта регистра на клиенте – так, как это давно делаетapps list.
05.09.2026 – 0.34.0
Исправлено
- Приложение адресуется и позиционно, и ключом
--app-id. Командыapps get,apply,delete,start,stopиdebugпринимали только позицию, аdeployиapps ensure– только ключ, и вызов, написанный не в той форме, отвечал справкой вместо работы. Две РАЗНЫЕ ссылки в одной команде отвергаются: молчаливое предпочтение одной отправило бы команду в чужое приложение.
31.08.2026 – 0.33.0
Добавлено
- Сторож схемы видит измерения регистра. По ним ключуются записи, поэтому смена типа измерения – или его удаление – заставляет платформу конвертировать записи, значения схлопываются, и применение падает на неуникальности ключей, а следом идёт тихий откат. Пробник этого не предскажет: в пустом приложении конвертировать нечего.
- Описание клиента SOAP-сервиса попадает в сборку.
<ИмяКлиента>.Wsdl.<n>и<ИмяКлиента>.Xsdлежат рядом с элементом проекта, а не вРесурсы, и их расширения вне списка разрешённых – архив терял их молча. Клиент, у которого описания нет, называется до загрузки. apps list --status running(несколько статусов через запятую). На стенде, живущем не первый месяц, приложений сотни, а живых единицы, и вопрос “что здесь работает” не должен стоить полного перечня.- Отчёт деплоя несёт отказ построчно. В
problems-linesлежит текст платформы, разобранный на строки: JSON экранирует многострочный отказ вировно там, где его надо читать, – какой объект, какие ключи стали неуникальными.
Исправлено
- Применение пережидает занятое приложение вместо отказа. Деплой сразу после предыдущего падал с “приложение занято” уже ПОСЛЕ загрузки сборки; ожидание короткое и включается только на этой формулировке, так что несуществующее приложение по-прежнему отказывает сразу.
- Пробник обрывается на непринятом режиме совместимости. Стенд старше проекта отказывает проекту целиком, а следом жалуется на типы и свойства этого режима в файлах, которых правка не касалась, – сотни строк, читающихся как приговор коду. Теперь отказ назван тем, чем он является, а производное от него считается, а не разбирается.
30.08.2026 – 0.32.3
Изменено
- Описание пакета называет пробник. Сводка на карточке PyPI и описания сайта перечисляли приложения, сборки и деплой, но молчали про проверку компиляции на сервере без риска для рабочего приложения – а это отдельная причина ставить elemctl.
27.08.2026 – 0.32.2
Добавлено
- Релиз оставляет карточку на GitHub. После успешной публикации на PyPI конвейер создаёт GitHub-релиз, телом которого становится раздел этой истории изменений за выпущенные версии, – подписчики репозитория видят в ленте, что нового, а не голый тег.
26.08.2026 – 0.32.1
Изменено
- Пример локального облака в документации указывает на домен-плацедержатель в
зарезервированной зоне
.example: пример конфигурации не должен называть настоящий сервер. - Журнал изменений сокращён до двух-четырёх строк на запись: что изменилось и почему это важно; история находок остаётся в коммитах и документации.
24.08.2026 – 0.32.0
Добавлено
apps apply [APP_ID] VERSION_ID– применить загруженную сборку и проверить результат. Прежде применение было доступно только инструментом MCP, а долгие операции просят запускать CLI фоном. При сбое платформа молча откатывает приложение на прежнюю сборку и запускает его, поэтому команда сверяет применённое и отвечает кодом возврата 1, если сборка не встала.apps ensureотвечает и про сборку. Флаги создания действуют только при создании, поэтому--version-idсуществующему приложению не применялся – молча. Теперь в ответе естьappliedиapplied-version-id, stderr называет команду, доводящую приложение до нужной сборки, а флаг--applyделает это сразу; то же поле получил MCP-инструментensure_app.
Исправлено
builds uploadбольше не отвергает сборку своего проекта. Сверялись разные вещи: техническоеИмяиз манифеста иПредставление, под которым проект показан в панели, – совпасть они могли только случайно, и правильная загрузка выглядела переименованием. Теперь сравнивается представление проекта из дескриптора внутри архива; чужая сборка отвергается по-прежнему.- Отказ загрузки объясняет
--new-project. Формулировка “заведёт отдельный проект” отпугивала от рабочего пути: платформа опознаёт проект по паре поставщик плюс имя из манифеста, поэтому сборка своего проекта попадает в существующий проект.
18.08.2026 – 0.31.0, 0.31.1
Добавлено
- Подключение с отключённой проверкой TLS предупреждает о себе на каждом запуске.
ELEMENT_TLS_VERIFY=falseпрописывают в.envоднажды, а вызов без проверки выглядит ровно как прошедший её. Предупреждение идёт в stderr, поэтому вывод JSON по конвейеру не портится. - TLS настраивается: частный CA и строгость проверок. Строгий профиль RFC 5280, включённый в
Python 3.13, отверг внутренний CA частного облака.
ELEMENT_CA_FILEдобавляет PEM-файл к хранилищу доверия,ELEMENT_TLS_STRICT=falseснимает только строгий профиль, аELEMENT_TLS_VERIFY=falseостаётся крайней мерой; опечатка в значении даёт ошибку конфигурации, а не молча ослабленный TLS. Вклад @dvkuchin (запрос на слияние #4).
14.08.2026 – 0.30.0
Изменено
builds listотвечает десятью свежими сборками. У давнего проекта их накапливаются тысячи, и вопрос “из какого коммита применённая сборка” решался усечением полного списка. Срез задаёт--limit(0– все), stderr называет, сколько из скольких показано, а--briefоставляет ид, версии, дату, ветку и коммит; те же параметры получил MCP-инструментlist_builds.
Исправлено
- Сборка пробника больше не может победить в выборе последней. Случайный токен её версии
примерно раз в сорок розыгрышей выпадает целиком числовым, и такая версия читается огромным
счётчиком –
--latest-buildвыбрал бы пробную сборку вместо настоящей. Числовой токен теперь перевыбирается; поймано вживую в CI.
11.08.2026 – 0.29.0
Изменено
- Отсутствующий
.env-файл называется абсолютным путём и текущим каталогом. Относительный--env-fileразрешается от текущего каталога, а не от--project-dir, и в фоновом запуске отказ читался как недоступный стенд. probeописывает требование к раскладке проекта. Каталог обязан лежать по схеме{репозиторий}/{Поставщик}/{Имя}/Проект.yaml– прежде об этом узнавали из ошибки постфактум.
10.08.2026 – 0.28.0
Документация
- Перечень инструментов MCP полон. Семь из двадцати четырёх не были названы нигде, кроме исходников: страница обходилась фразой “и другие”.
- Переменные окружения описаны полностью – вместе с
ELEMCTL_NO_PLUGINS, переменными CI, из которых сборка берёт номер прогона, и системнымиLC_ALL/LANG. - Устаревшие утверждения исправлены: общие флаги принимаются в любой позиции,
.htmвходит в расширения архива, а внутри каталогаРесурсыотбора по расширению нет вовсе. - Один источник на текст. Разделы README, повторяющие страницы сайта, разошлись в обе
стороны; теперь источник – страница, а
scripts/sync-docs.mjsвставляет её раздел в README между маркерами. - Схема устройства
docs/architecture.svg– поверхности, движок, цикл деплоя с молчаливым откатом и пробник; палитра следует теме читателя. - Сторож
scripts/docsguard.pyи джобаdocsв CI. Он судит проверяемое механически: инструмент без строки в таблице, переменную окружения, которую код читает и никто не описал, протухшее зеркало чейнджлога. Каждый класс находки провоцируется тестом.
Добавлено
deployпринимает имя приложения наравне с ид – как это давно делаютapps get,apps start,apps stopиapps debug.
Изменено
- Расширение VS Code уехало из этого репозитория. Отладка приложений 1С:Элемент – часть
расширения XBSL с его версии 0.57.0, вместе с кнопкой
деплоя: из-за разделения путь к elemctl и ид приложения приходилось задавать дважды. Здесь
осталась сторона elemctl –
apps debug,debug-adapterи точка расширенияelemctl.debug_adapter.
07.08.2026 – 0.26.0, 0.27.0
Добавлено
- Проекты с английскими артефактами собираются и деплоятся.
build,deployиprobeнаходят дескрипторProject.yamlнаравне сПроект.yaml, разбор архива читает английские ключи и значения, а страж схемы знает, что два написания имени примитивного типа – один тип: перевод описания не выглядит изменением, разрушающим данные.
Изменено
- Загрузка сборки не отправляет коммит и ветку. Документированный метод их не принимает, а отправленные сервер игнорирует: коммит в карточке сборки проставляется только связью проекта с репозиторием. Внутри архива ветка и коммит едут по-прежнему – сборка пишет их в манифест.
- Пропущенная сверка схемы названа в отчёте. Поле
schema-checkотвечаетclean,allowedилиskipped:<причина>: пропущенная проверка не должна читаться как пройденная.
03.08.2026 – 0.25.0
Изменено
- Сборка с чужим именем отвергается, а не сопровождается предупреждением. Панель показывает
проект под именем последней залитой сборки, и удаление сборки прежнее имя не возвращает.
Выходы названы в самом сообщении:
--force-rename, если так и задумано,--new-project, если сборка чужая.
31.07.2026 – 0.23.0, 0.24.0
Исправлено
self-updateсразу после релиза больше не пропускает его. Список файлов брался из JSON-метаданных PyPI, а они догоняют публикацию минутами: в этом окне команда отвечала “уже актуально”. Теперь список берётся из simple-индекса (PEP 691), а версии ранжируются численно.
Изменено
- MCP-сервер работает с обоими мажорами пакета
mcp, пин снят. Вmcp 2.0.0класс сервера переехал, не оставив псевдонима, и свежая установка не поднималась вовсе. Импорт пробует оба расположения, разницу в чтении ответов прячут две функции, а CI гоняет набор тестов на обоих мажорах. serverInfoназывает версию самого elemctl, а не версию пакетаmcp.
30.07.2026 – 0.22.0
Добавлено
- Сборка приложения забирает библиотечные проекты, лежащие рядом, включая транзитивные зависимости; объявленная библиотека без локального проекта остаётся внешней зависимостью платформы. Вклад @dvkuchin (запрос на слияние #3).
Исправлено
- Прокси в окружении больше не выдаёт живой стенд за мёртвый. Прокси, которому до стенда не
дотянуться, отказывает ровно так же, как отказал бы лежащий стенд. Заведомо бесполезный прокси
теперь обходится,
ELEMCTL_NO_PROXY=1обходит его везде, а неудавшийся вызов через прокси называет его. self-update --stop-holdersбольше не снимает собственное дерево процессов. Команда работает потомком лаунчера, по имени неотличимым от держателя, и предлагала снять саму себя, обрывая обновление на полпути.
28.07.2026 – 0.20.0, 0.21.1
Добавлено
- Создание приложения заканчивается способом в него войти. У
apps createиapps ensure(и у их двойников в MCP) появилось полеsign-in. Новое приложение получает свой пустой список пользователей, поэтому учётные записи, которыми входят в другие приложения, здесь не работают: войти можно учётной записью панели управления. Перебирать нельзя – у пользователя есть счётчик неудачных попыток входа.
Изменено
self-updateбольше не меняет рабочую установку на пустое место.pip install --upgradeупёрся в занятый живой сессией файл, удалил пакет, не распаковал новый и промолчал. Теперь установленный пакет сначала переименовывается, держатели называются по имени и pid, а прежняя установка возвращается на место, пока новая не докажет, что импортируется.
27.07.2026 – 0.19.0
Добавлено
user-lists calculation-rules– переприменить правила, по которым из ответа провайдера собирается пользователь. Пересоздание сервиса входа их сбрасывает, а чтение не возвращает, поэтому отчёт говорит прямо: что отправлено, что запрос принят и что подтвердить значение через API нельзя – это отвечает панель управления или живой вход.
Исправлено
- Сборка, сделанная на раннере CI, записывала ветку
HEAD. Раннер выкладывает коммит, а не ветку. Имя теперь берётся из окружения CI, а если ветку не называет никто, поле остаётся пустым: честный пробел лучше слова, похожего на имя ветки.
26.07.2026 – 0.15.0, 0.16.0, 0.17.0, 0.18.0
Добавлено
deployназывает цель и то, откуда она взялась. В отчёте появилисьapp-name,app-id-sourceиproject-id-source, а цель объявляется первой строкой прогресса – до сборки, пока деплой не в то приложение ещё можно прервать.- Сборка называет файлы, которые в неё не вошли (
skipped-filesи предупреждение). Файл с расширением вне списка разрешённых попадает в архив, только если лежит в каталогеРесурсы; в любом другом месте он теряется молча, и платформа сообщает об этом лишь на применении. - Страж разрушающих изменений схемы. Сужение длины реквизита и смена его типа пересоздают
данные объекта, поэтому
deployсверяет исходники с состоянием на коммите применённой сборки и отказывается работать до сборки; пропустить – флагом--allow-data-loss. Сравнить нечем – страж говорит об этом и деплою не мешает: невозможность сравнить не есть доказательство опасности. user-lists– настройки входа списка пользователей, за которыми обычно ходят в панель:list,get,self-registrationиpassword-login. Без флага обе команды-настройки только читают состояние; со стороны MCP –list_user_listsиconfigure_user_list.- Точки расширения
elemctl.commands– пакет-плагин приносит собственные команды, и одно объявление становится сразу подкомандой CLI и инструментом MCP. Там место команде, которая знает про чужое окружение и потому в публичном ядре жить не может. elemctl probe– изолированная проверка компиляции. Компиляция у платформы серверная и происходит на применении сборки, поэтому пробник собирает архив, создаёт из него одноразовое приложение и убирает созданное за собой. Ошибки приходят разобранными: файл, строка, колонка, окружение и текст.
Исправлено
- Глобальная опция принимается и после подкоманды –
elemctl deploy --env-file .envбольше не падает argparse-фразой “unrecognized arguments”. - Отвергнутый сервером токен больше не живёт в кэше. Негодный токен этот сервер отвергает
400, а не 401, называя причину в
error_description; такой отказ теперь сбрасывает файл кэша и повторяет запрос один раз. - Сборка удаляется после того, как исчезло приложение. Платформа отклоняет удаление, пока живо созданное из этой сборки приложение, поэтому пробник сначала дожидается его исчезновения.
Документация
- Контракт Console API пополнился списками пользователей (п. 4.7) и тем, чего в API нет вовсе: состава форм аутентификации и настройки автоматического подключения пользователей.
- Проект платформы опознаётся парой
VendorплюсNameманифеста, а неИдизПроект.yaml: второй проект под ту же пару отклоняется с 409ALREADY_EXISTS.
25.07.2026 – 0.14.0
Добавлено
- Суффикс версии берётся из номера прогона CI (
CI_PIPELINE_IID,GITHUB_RUN_NUMBER,BUILD_NUMBER), когда нет ни явной версии, ни прежней сборки: чистый рабочий каталог CI больше не даёт-1на каждом прогоне. buildиdeploy --dry-runвыводят состав сборки –name,vendor,version,version-source,kind,branch,commitиdirty, – и CI больше не выковыривает версию из имени файла.apps get/delete/start/stop/debugпринимают точное имя приложения наравне с ид (в MCP тоже); несколько совпадений – ошибка с перечнем ид, разрушающие команды не угадывают.apps list --brief– краткие карточки: вопрос “жив ли acme-crm-dev” решается парой сотен байт вместо десятков килобайт.- Незакоммиченные изменения каталога проекта видны в отчёте (
dirty,dirty-files), а флаг--require-cleanпрерывает работу до сборки.
Изменено
apps list --nameфильтрует на клиенте: платформа query-параметр игнорирует, поэтому прежний сквозной фильтр не фильтровал ничего.- Ключи дескриптора
Проект.yamlчитаются в обоих написаниях – двуязычие исходников заявлено платформой, и раньше такой проект отвергался. - Ожидания статусов считают
Errorтерминальным: деплой падает сразу с ошибками компиляции, а не ждёт полный таймаут.
Исправлено
--lang enтеперь английский везде. Около сорока строк, обращённых к пользователю, были зашиты русскими литералами мимо каталога сообщений; тест обходит модули и не даёт им появиться снова.
24.07.2026 – 0.12.0, 0.13.0, 0.13.1
Исправлено
- Файлы каталогов
Ресурсыпопадают в архив независимо от расширения. Прежде на них действовал общий список разрешённых расширений, файлы молча выпадали из сборки, и применение падало с ошибкой “Неизвестный ресурс”. Вне каталогов ресурсов список действует по-прежнему и пополнился.htm.
Изменено
- MCP:
list_projectsпо умолчанию отдаёт краткие карточки – какlist_apps; полные карточки возвращаетbrief=false.
Добавлено
builds uploadсообщает цель загрузки (project-idиproject-id-source): раньше сборка молча ложилась в проект из окружения, когда задумывался новый.builds upload --new-projectзагружает сборку новым проектом, игнорируяELEMENT_PROJECT_ID.builds uploadпредупреждает о чужом имени сборки: панель показывает проект под именем последней залитой сборки.- Справочник команд и его генератор под тестами (
tests/test_cli_docs.py): каждая команда отвечает на--helpи покрыта разделом справочника, а две языковые версии действительно различаются.
22.07.2026 – 0.11.0
Добавлено
- Сайт документации (docs.keyfire.ru/elemctl), полный справочник команд и справка – целиком на русском и английском.
21.07.2026 – 0.10.0
Изменено
- MCP: окружение задаётся на вызов,
apps listпо умолчанию краткий. - Ошибка “нет источника приложения” подсказывает, как завести проект.
Исправлено
- Справка CLI переводится: язык определяется до построения парсера аргументов.
apps createпоказывает собственные ошибки задачи компиляции вместо обобщённого “Неизвестная ошибка. Обратитесь к администратору”.
19.07.2026 – 0.9.1
Изменено
- Раздел команд в справке назван “команды”, а версия читается из одного источника.
17.07.2026 – 0.9.0
Добавлено
inspect– разбор готового архива сборки.builds getиbuilds deleteпринимают версию сборки и резолвят её в id.
15.07.2026 – 0.5.0, 0.6.0, 0.7.0, 0.8.0
Добавлено
self-update– обновление распаковкой колеса, безопасно даже когда запущенный исполняемый файл занят (0.7.0).- Система плагинов: адаптер отладки платформы подключается через точки расширения (0.5.0).
Изменено
verifyподтверждает деплой по id применённой сборки, а не по строке версии (0.8.0).- Подсказка MCP отмечает, что долгие операции асинхронны – гонять CLI в фоне (0.5.0).
- Ссылки проекта на PyPI (Homepage / Repository / Issues) в метаданных пакета (0.6.0).
Исправлено
- MCP-сервер учитывает глобальные аргументы конфигурации (
--env-fileи прочие) (0.7.0).
12.07.2026 – 0.4.0, 0.4.1
Добавлено
- Полное двуязычие ru/en: i18n рантайма (
--lang/ELEMCTL_LANG), README и спецификация на двух языках. apps debug– данные для сессии отладки платформы (POST /actions/debug).
Изменено
- Релизы публикуются на PyPI по тегу
v*через Trusted Publishing, с подписанными аттестациями происхождения; тегиvscode-v*при этом не задеваются.
10.07.2026 – 0.2.0, 0.2.1, 0.3.0
Добавлено
- Первый релиз: клиент документированного Console API v2, сборка
.xasm/.xlibиз исходников, деплой одной командой с честной проверкой, что изменение применилось, CLI и MCP-сервер – написано clean-room, по спецификации вdocs/SPEC.md(0.2.0). apps ensure– создать приложение только если его нет (0.3.0).
Изменено
apps findпропускает удалённые приложения;--include-deletedвозвращает прежнее поведение (0.3.0).
Исправлено
apps findвозвращает 0, когда приложение отсутствует, вместо ошибки (0.2.1).