@goodandready/dsh-cron 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,83 +0,0 @@
1
- # DESIGN.md — dsh-cron
2
-
3
- ## Product / Purpose
4
- - Назначение: Интегрированный планировщик cron-задач и фоновой автоматизации для DeepSeek Harness. Позволяет запускать агентские сессии по расписанию, выполнять автоматические проверки и предоставлять визуальный интерфейс управления задачами.
5
- - Аудитория: Пользователи и операторы DeepSeek Harness, автоматизирующие периодические процессы (утренние сводки, проверка тикетов, мониторинг серверов).
6
- - Статус: Active, публичный npm-пакет @goodandready/dsh-cron (линия 0.2.x).
7
-
8
- ## User Surfaces
9
- - Web/UI:
10
- - Экран «Запланированные задачи» (полноэкранный оверлей в центральной колонке интерфейса DSH, аналогично dsh-kanban).
11
- - Раздел «Активные задачи» в сайдбаре под кнопкой плагина: сворачиваемый (свёрнут по умолчанию, состояние запоминается), до пяти строк с названием и временем следующего запуска или живым статусом, строка «и ещё N»; клик открывает панель и подсвечивает задачу (#34).
12
- - Панель фильтров в списке задач: тип, модель, канал; фильтрация мгновенная на клиенте, есть сброс, счётчик «показано N из M» и понятное пустое состояние (#40).
13
- - Кнопка вызова в боковой панели (sidebar-entry) рядом с новой сессией + иконка в шапке сессии (utilities slot).
14
- - Кнопка «Создать ⌄» с дропдауном:
15
- - 💬 «Создать с DSH» (запуск интерактивного диалога постановки задачи агенту).
16
- - ✏️ «Настроить вручную» (модальная форма: тип и параметры рантайма, расписание, таймаут, overlap, промпт, модель, каналы доставки, шаблон сообщения).
17
- - Табы фильтрации: «Все», «Активные», «На паузе», «Завершённые».
18
- - Поисковая строка; сводная статистика (активные задачи, запуски, токены, стоимость).
19
- - Карточки задач: статус-переключатель, название, расписание (человекочитаемое + raw cron), действия (запуск, редактирование, удаление).
20
- - Блок «Рекомендуемые задачи»: подсказки из встроенного каталога рецептов (`lib/recipes.js`, 10 рецептов в 5 категориях), клик открывает форму с заполненными типом, каналом и правилом тишины; ничего не создаётся без сохранения (#48).
21
- - Карточка настроек в слоте settings.plugin.item, key = namespace `dsh-cron`; отдельный раздел настроек не используется (#102).
22
- - LLM Tools: cron_create_task (+ alias cron_schedule_task), cron_list_tasks, cron_pause_task, cron_resume_task, cron_delete_task, cron_run_task, cron_get_task (полная конфигурация задачи), cron_update_task (правка существующей задачи; переключение в код-исполняющий тип требует явного `confirmCodeSwitch`) (#49). Параметры задачи включают рантайм (`type`), `channels` (список каналов доставки) и `template` (шаблон сообщения).
23
- - API: `GET /dsh-cron/recipes` (каталог рецептов) (#48); HTTP эндпоинты /dsh-cron/* (tasks, models, chat/start, settings, telegram/test, kanban/test, tasks/:id/actions, legacy action/:id/:action). Мутирующие эндпоинты отклоняют cross-origin запросы; script-задачи по HTTP требуют заголовок x-dsh-cron-confirm. Настройки доставки принимаются как плоские ключи (webhook URL, топики, base URL) и `channelTemplates` — карта шаблонов по каналам.
24
- - Chat / Slash Commands: отсутствуют (ранее заявленные /cron-команды не были реализованы и удалены из документации; решение 2026-09-09).
25
-
26
- ## Visual Direction
27
- - Атмосфера: Строгий утилитарный интерфейс в нативном стиле DeepSeek Harness.
28
- - Использование нативных токенов темы DSH: --dsw-alias-bg-base, --dsw-alias-bg-layer-*, --dsw-alias-border-l1/l2, --dsw-alias-label-primary/secondary/tertiary, --dsw-alias-interactive-bg-hover.
29
- - Семантические статусы объявляются один раз через plugin-переменные --dsh-cron-success/danger/info/accent/warning (токен ядра при наличии, иначе фолбэк); рассыпанных hex в инлайн-стилях нет.
30
- - Иерархия: читаемые карточки с чётким акцентом на статусе и времени следующего запуска.
31
-
32
- ## Foundations
33
- - Семантические цвета статусов:
34
- - Зелёный/активный: рабочее расписание, успех.
35
- - Серый/приостановленный: на паузе.
36
- - Синий/информационный: шаблоны, Shell-тип, Telegram-акценты.
37
- - Красный: ошибка/таймаут последнего запуска.
38
- - Фиолетовый: разовая (one-shot) задача; жёлтый: skipped/missed.
39
- - Доступность: aria-label у иконок и действий, роль button + управление с клавиатуры (Enter/Space) для строк списков, Escape закрывает модалки, autofocus первого поля формы.
40
- - Язык: канонические строки — английские (словарь STRINGS.en, namespace dsh-cron, регистрация через ctx.locale.register); русский и другие языки предоставляет translation-плагин в рантайме.
41
-
42
- ## Components And States
43
- - Components:
44
- - CronSidebarButton: кнопка в левом сайдбаре DSH.
45
- - CronScreen: основной оверлей со списком, табами, статистикой и рекомендациями.
46
- - CreateDropdown: всплывающее меню выбора способа создания.
47
- - ManualTaskModal: модальная форма создания/редактирования (вкладки «Параметры» / «История запусков»); блок каналов доставки — сетка чекбоксов (Telegram, dsh-kanban, Discord, Slack, ntfy, Bark, PushPlus, Voice, Gitea) и поле шаблона сообщения с подсказкой по переменным.
48
- - SettingsModal: настройки доставки с тестами; секции «Credentials (references)», «Delivery channels», «Automation models» (модели для правила тишины и диагностики), «Message templates» — сворачиваемые, шапка-кнопка с aria-expanded.
49
- - DeliverySettingsForm: общая форма настроек доставки, одна реализация для SettingsModal и CronSettingsCard; секреты вводятся только по имени credential-ссылки.
50
- - TaskItem: строка задачи с переключателем состояния и действиями (запуск, редактирование, дублирование, удаление); адресуется атрибутом data-task-id для подсветки из сайдбара.
51
- - ImportModal: сводка по файлу (сколько добавится, заменится, пропустится) и выбор стратегии add/replace/skip до применения (#42).
52
- - RecommendationCard: плашка с готовым шаблоном.
53
- - CronSettingsCard: карточка параметров плагина в настройках; свёрнута по умолчанию, шапка-кнопка с шевроном разворачивает тело (aria-expanded), кнопка «Открыть панель задач» — внутри раскрытого тела (решение 2026-09-10, #100).
54
- - States:
55
- - Loading: индикатор загрузки списка/истории.
56
- - Empty: дружелюбный пустой экран со списком рекомендаций.
57
- - Error: баннер с ошибкой и кнопкой повтора (в панели), статус-баннеры в модалках.
58
- - Success: статус-баннеры тестов доставки, «✓ Сохранено».
59
- - Опасные действия: удаление задачи — через confirm(); переключение типа на script по HTTP требует confirm-заголовок.
60
-
61
- ## User Flows
62
- 1. Создание через DSH-чат: «напоминай каждый день в 9 утра...» → «Создать с DSH» → агент уточняет тип (LLM/NO-LLM), расписание, модель, Silent Rule → после подтверждения вызывает cron_create_task → задача появляется на экране.
63
- 2. Создание вручную: кнопка сайдбара → «Создать ⌄» → «Настроить вручную» → форма → сохранение.
64
- 3. Выполнение по расписанию: croner/таймер one-shot → запуск по выбранному рантайму (агентская сессия, shell, node, python, http, ssh, docker) → запись в историю → доставка отчёта в выбранные каналы (Telegram, Kanban, Discord, Slack, ntfy, Bark, PushPlus, Voice, Gitea) с учётом `onlyOnFailure`.
65
- 4. Разбор инцидента: история запусков в карточке задачи → статус, длительность, вывод/ошибка.
66
-
67
- ## Locked Design Decisions
68
-
69
- - 2026-09-11 — Блок B (0.2.6): рецепты (#48), инструменты чтения и правки задачи (#49), каскад моделей (#45), правило тишины (#44), диагностика сбоев (#43), разбивка обработчиков (#97). Модельные вспомогательные вызовы идут через `ctx.llm.stream` с жёстким дедлайном и fail-open: недоступная или неуверенная модель означает «доставить отчёт», а не тишину. Переключение задачи в код-исполняющий тип подтверждается структурно на обеих поверхностях (HTTP-заголовок и `confirmCodeSwitch` инструмента).
70
- - 2026-09-11 — Доставка вынесена в отдельный слой: сообщение рендерится шаблоном `{var}` (#25), транспорт — адаптеры каналов с чистым builder'ом payload и инжектируемым fetch, маршрутизатор собирает ошибки каналов и не роняет запуск (#26, #20–#23, #28, #47). Явно выбранные каналы задачи перекрывают legacy-флаги `notifyTelegram`/`kanbanMode`.
71
- - 2026-09-11 — Доставка не может заблокировать планировщик: каждый канал ограничен таймаутом (`deliveryTimeoutMs`, по умолчанию 15 с), каналы отправляются параллельно, а ошибки (включая таймаут) собираются в `failures`. Причина: `protect: true` в croner пропускал бы следующие тики, пока висит незавершённая доставка (находка независимого review PR #114).
72
- - 2026-09-11 — Блок A (0.2.5): список активных задач в сайдбаре (#34), фильтры по типу/модели/каналу (#40), адаптив до 375 px без скрытия информации (#39), дублирование задачи серверным маршрутом с принудительной паузой и сбросом состояния (#41), экспорт/импорт конфигурации задач в JSON со стратегиями и dry-run (#42), нормализация и нижняя граница таймаута доставки (#115). Экспорт — только JSON: YAML-парсера в проекте нет, а зависимость ради формата не добавляется.
73
- - 2026-09-11 — Значения с секретом внутри (webhook-URL Discord/Slack, ключ Bark) маскируются при отдаче в браузер, а замаскированное значение, вернувшееся от UI, не перезаписывает сохранённое; сырые credential-ключи отклоняются и в store, и на входе `/dsh-cron/settings`.
74
- - 2026-09-11 — Секреты доставки хранятся только как credential-ссылки (#51): настройки содержат имя credential, значение резолвится в момент отправки через DSH credentials-сервис с фолбэком на ENV; store отказывается сохранять сырые secret-ключи.
75
- - 2026-09-11 — Каталог данных плагина: `DSH_DATA_DIR` → `DSH_HOME/data` → `~/.dsh/data`. Причина: изолированный профиль не должен писать в чужой домашний каталог (issue #112, найдено на приёмке в тест-контуре).
76
- - 2026-09-09 — Пакет надёжности ядра (v0.1.24): буфер shell-задач 10МБ, атомарное сохранение с PID, аудит пропущенных запусков при рестарте (missed), фоновый поллинг UI (8с).
77
- - 2026-09-03 — Публичный скоуп @goodandready/dsh-cron; оверлей через mountSidebarEntry/mountScreen аналогично dsh-kanban; двойная кнопка «Создать ⌄».
78
- - 2026-09-09 — Слот карточки настроек: settings.plugin.item с key/namespace `dsh-cron` (совпадение с серверной регистрацией). Причина: контракт слота настроек (#85). Changed 2026-09-10 (#102): settings.section fallback удалён — карточка только во вкладке плагинов.
79
- - 2026-09-10 — Значения настроек пишутся через зарегистрированный settings-скоуп (`scope.set` → `watch` → store); REST /dsh-cron/settings остаётся транспортом для карточки и headless-сценариев; карточка проверяет статус снапшота и не рисует поля до его получения (#102).
80
- - 2026-09-09 — Английский — канонический язык строк; словарь STRINGS.en регистрируется в ctx.locale; русский — через translation-плагин. Причина: стандарт DSH-плагинов (#87).
81
- - 2026-09-09 — Same-origin проверка мутирующих эндпоинтов, лимит тела 1 МБ, confirm-заголовок для script-задач. Причина: закрытие CSRF→RCE поверхности (#86).
82
- - 2026-09-09 — Стилевая изоляция: динамические <style> с data-dsh-plugin="dsh-cron"; цвета только через токены темы + единый блок plugin-переменных. Причина: защита от очистки стилей соседями и поддержка светлой темы (#91).
83
- - 2026-09-09 — /cron slash-команды удалены из документации (не были реализованы); при появлении продукта — отдельная feature-issue и согласование. Причина: документация = истина (#84).
@@ -1,50 +0,0 @@
1
- # План: блок A — пользовательские поверхности (0.2.5)
2
-
3
- Живой план блока. Обновляется по факту работы; источник истины по задачам —
4
- Gitea (`goodandready/dsh-cron`), milestone `0.2.5`.
5
-
6
- ## Состав блока (согласован владельцем)
7
-
8
- | Issue | Задача | Сложность |
9
- |:--|:--|:--|
10
- | #34 | Сворачиваемый раздел активных задач в сайдбаре | H |
11
- | #40 | Поиск и фильтры списка задач | M |
12
- | #39 | Адаптив под узкие экраны | M |
13
- | #41 | Клонирование задачи | L |
14
- | #42 | Экспорт/импорт задач (JSON/YAML) | L |
15
- | #115 | Поле «Delivery timeout»: сброс и нижняя граница | L |
16
-
17
- Дальше по согласованию: блок B (0.2.6) — #45, #44, #43, #49, #48;
18
- блок C (0.2.7) — #54, #50, #53, #97, #121.
19
-
20
- ## Границы и инварианты
21
-
22
- - Один блок → одна ветка `feat/0.2.5-ui-block` → один PR → один релиз 0.2.5.
23
- - В релиз 0.2.5 также входит уже смёрженное удаление email-канала (#23, PR #120).
24
- - Клиентская половина остаётся single-file (`lib/client.js`) — требование загрузчика DSH.
25
- - Новых зависимостей блок не добавляет; экспорт/импорт использует существующие средства разбора.
26
- - Публичные экспорты `lib/index.js` и контракты маршрутов не ломаются: новые поля — только additive.
27
- - Секреты в экспортируемом файле отсутствуют: переносятся лишь имена credential-ссылок.
28
-
29
- ## Вне scope
30
-
31
- - Серверная авторизация и внешний API (блок C).
32
- - Изменения в путях исполнения и работе с моделью (блок B).
33
- - `#117` (мажор croner), `#95` (scope токена), `#113` (инфраструктура тест-контура) — вне блоков.
34
-
35
- ## План проверки блока
36
-
37
- - `npm test` + новые тесты на каждый пункт (контракт разметки, фильтрация, сериализация, клонирование, клампинг таймаута).
38
- - `bash deploy.sh check` — тесты, гейт размера пакета, сборка кандидата.
39
- - Приёмка на изолированном MiniPC: установка кандидата, проверка списка/фильтров/дублей/экспорта-импорта и геометрии на 375/768/1280 в браузере.
40
- - Независимое ревью PR перед merge.
41
-
42
- ## Журнал
43
-
44
- - 2026-09-11 — блок согласован (A=0.2.5, B=0.2.6, C=0.2.7), созданы milestones и ТЗ по каждой задаче.
45
- - 2026-09-11 — реализовано: #115 (клампинг таймаута), #41 (дублирование серверным маршрутом), #42 (экспорт/импорт JSON), #40 (фильтры), #39 (адаптив), #34 (аккордеон в сайдбаре). 123/123 тестов, гейт размера 23 файла.
46
- - Приёмка на MiniPC (изолированный профиль, кандидат из ветки): дубликат — копия `disk-check (copy)` в статусе paused, настройки скопированы, история и счётчики пусты; экспорт — 4 задачи, поля только конфигурации (нет status/totalTokens/lastRunAt/nextRunAt); dry-run импорта — `{add:0, replace:0, skip:4}`, импорт со стратегией add — 4 задачи, все на паузе; битый документ → 400 без изменений в хранилище. В браузере: секция «Active jobs» свёрнута по умолчанию, раскрывается, показывает 3 активные задачи с временем следующего запуска, состояние сохраняется; клик по задаче открывает панель и подсвечивает её; фильтры — 8 → 6 (type=script) → 2 (+channel=ntfy) с подписью «Showing N of 8» и сбросом; дублирование из строки — 9 задач и подтверждение «copy created and paused»; поле таймаута доставки: ввод 4000 сохраняется, очистка возвращает 15000.
47
- - Ограничение приёмки: смена ширины окна в текущем браузерном транспорте недоступна, поэтому адаптив (#39) проверен наличием и разбором media-query-правил и тестами, а не визуально на 375 px. Это единственный пункт блока без живой визуальной проверки.
48
- - 2026-09-11 — после независимого ревью (FAIL): импорт переведён на жёсткий whitelist (статус из файла игнорируется, лишние ключи отбрасываются), добавлен confirm-заголовок для документов с code-задачами, зарезервированы id `export`/`import` на создании и импорте, добавлен откат при частичном сбое записи, сайдбар и панель разведены разными атрибутами, добавлен 16px для полей на телефоне, `mountSidebarJobs` разбит на мелкие функции. Проверено живьём: без заголовка 403, с заголовком задача приходит paused с обнулёнными счётчиками и отброшенными лишними ключами; подсветка из сайдбара указывает на строку панели (`.dsh-cron-container .dsh-cron-task-highlight`). 127/127 тестов.
49
- - 2026-09-11 — релиз: bump 0.2.4 → 0.2.5, тег v0.2.5, npm publish, GitHub Release, установка точной версии в production web-профиль MiniAI и production-проверки. Закрыты #34, #39, #40, #41, #42, #115.
50
- - Отклонения от первоначального ТЗ (зафиксированы в issue): #41 — сделан отдельный маршрут вместо клиентской сборки payload (сервер знает, что конфигурация, а что состояние запуска, и это тестируемо); #42 — только JSON вместо JSON/YAML (парсера YAML в проекте нет, зависимость ради формата не добавляется); состояние фильтров не пишется в URL-хеш, чтобы не конфликтовать с роутингом SPA.
@@ -1,61 +0,0 @@
1
- # План: блок B — экономия и меньше шума (0.2.6)
2
-
3
- Живой план блока. Обновляется по факту работы; источник истины по задачам —
4
- Gitea (`goodandready/dsh-cron`), milestone `0.2.6`.
5
-
6
- ## Состав блока (согласован владельцем)
7
-
8
- | Issue | Задача | Сложность |
9
- |:--|:--|:--|
10
- | #45 | Каскад моделей Flash → Pro при сбое | H |
11
- | #44 | «Правило тишины» на базе LLM для задач с внешним выводом | M |
12
- | #43 | Инспектор сбоев: диагноз и предложение правки промпта | M |
13
- | #49 | Подстройка задачи через диалог (`cron_get_task`, `cron_update_task`) | M |
14
- | #48 | Хаб готовых рецептов мониторинга | M |
15
- | #97 | Техдолг: разбить разросшиеся обработчики (пункт 3 issue) | L |
16
-
17
- Следующий по согласованию блок C (0.2.7) — #54, #50, #53, #97(остатки), #121.
18
-
19
- ## Границы и инварианты
20
-
21
- - Один блок → одна ветка `feat/0.2.6-economy-block` → один PR → один релиз 0.2.6.
22
- - Новых зависимостей блок не добавляет; вызовы модели идут через сервис харнесса.
23
- - **Все обращения к модели fail-open:** ошибка, таймаут или невалидный ответ LLM
24
- не приводят к потере отчёта, зависанию запуска или ложной тишине.
25
- - Секреты — только credential-ссылки. Ключи и токены в рецептах и промптах не
26
- хранятся.
27
- - Публичные экспорты `lib/index.js` не ломаются; поведение существующих
28
- маршрутов не меняется.
29
- - Рефакторинг (#97) идёт первым коммитом блока: новые фичи ложатся в уже
30
- разобранную структуру, а не наоборот.
31
- - `lib/client.js` остаётся single-file (требование загрузчика DSH).
32
-
33
- ## Вне scope
34
-
35
- - Внешний REST API и декларативный конфиг (блок C).
36
- - Новые каналы доставки и изменения существующих.
37
- - Обновление зависимостей (`#117` — отдельная ветка).
38
-
39
- ## План проверки блока
40
-
41
- - `npm test` до и после каждого пункта; базовый результат на старте — 128/128.
42
- - Новые тесты: каскад моделей с подставным исполнителем, вердикты правила тишины
43
- (тихо/громко/ошибка/невалидный JSON), разбор диагноза инспектора, инструменты
44
- подстройки, валидность всех рецептов и отсутствие деструктивных команд.
45
- - `bash deploy.sh check` (тесты + гейт размера + кандидат).
46
- - Приёмка на изолированном MiniPC: установка кандидата, проверка новых полей и
47
- инструментов через API, отображение в браузере.
48
- - Независимое ревью PR перед merge.
49
-
50
- ## Журнал
51
-
52
- - 2026-09-11 — #97 закрыт первым коммитом: `lib/api.js` (диспетчер + обработчики по областям), `http-utils` получил общие `sendJson`/`rejectCrossOrigin`/`readBody`, `runTask` → `beginRun`/`executeOnce`/`completeRun`, `_run` → диспетчер + подготовка/ход/уборка. `index.js` 1024 → 671 строк; полный набор тестов зелёный без правок ожиданий, добавлен тест на контракты item-маршрутов. **Уточнение после ревью:** утверждение «все затронутые функции ≤ 50 строк» на тот момент было неверным — `completeRun` и `buildTaskRecord` превышали ориентир и разбиты отдельным коммитом.
53
- - 2026-09-11 — #43 готов: `lib/failure-inspector.js` (промпт, разбор диагноза, fail-open), планировщик диагностирует сбой до записи, история хранит `diagnosis`/`suggestion`/`confidence`, в UI — чекбокс, настройка `inspectorModel`, блок диагноза в истории с кнопкой подстановки правки, переменная `{diagnosis}`. 164/164 тестов.
54
- - 2026-09-11 — #44 готов: `lib/llm-ask.js` (обёртка над `ctx.llm.stream` со сбором текста, таймаутом и fail-open) и `lib/silent-rule.js` (правило словами → вердикт `{notify, reason}`); планировщик решает о доставке до записи запуска, история хранит `silentSkip`/`silentReason`, в UI есть поле правила и маркер в истории, настройка `silentRuleModel`. 156/156 тестов, включая четыре сценария fail-open.
55
- - 2026-09-11 — #49 готов: инструменты `cron_get_task`/`cron_update_task`, общий модуль `lib/task-patch.js` (один код для HTTP PATCH и инструмента), действие «Настроить с DSH» в строке задачи, которое открывает сессию с контекстом задачи и предписанием подтверждать code-изменения. 145/145 тестов.
56
- - 2026-09-11 — #48 готов: каталог `lib/recipes.js` (10 рецептов в 5 категориях, только read-only команды), маршрут `GET /dsh-cron/recipes`, панель подсказок переведена на каталог, пресет рецепта заполняет форму вместе с типом и каналами; тест проверяет валидность каждого рецепта и отсутствие деструктивных команд.
57
- - 2026-09-11 — #45 готов: `fallbackProvider`/`fallbackModel` у задачи, ровно одна повторная попытка на fallback-модели при `error`/`timeout` (только агентские типы), сумма usage и стоимости обеих попыток, `model` и `fallback` в записи истории, переменная шаблона `{model}`, поле в UI. 134/134 тестов.
58
- - 2026-09-11 — блок согласован (блок B + #97 → 0.2.6), ТЗ по каждой задаче
59
- записаны в Gitea, все шесть задач переведены в milestone 0.2.6.
60
- - 2026-09-11 — независимое ревью блока B дало FAIL и нашло: `cron_update_task` обходил подтверждение переключения в код-исполняющий тип (закрыто структурным гейтом `allowCodeSwitch`/`confirmCodeSwitch` с поведенческими тестами), помощники моделей всегда шли на модель харнесса вместо модели задачи (исправлено передачей задачи в `ask`), дедлайн вызова модели держался только на abort-сигнале (добавлена жёсткая гонка в `lib/llm-ask.js`), чёрный список деструктивных команд обходился `find -delete`, `shred`, `apt purge`, `mv /etc/...` и др. (расширен, те же пробы теперь блокируются), две функции превышали ориентир 50 строк (`completeRun`, `buildTaskRecord` — разбиты), документация отстала (DESIGN.md, index.md, AGENTS.md, RU §14 обновлены). Тестов стало 175.
61
- - 2026-09-11 — релиз `0.2.6`: bump 0.2.5 → 0.2.6, тег `v0.2.6`, npm publish, GitHub Release, установка точной версии в production web-профиль MiniAI и production-проверки; закрыты #43, #44, #45, #48, #49, #97.