MILAGPT
Документация · Вебмастер

Сайт клиента: Мила собирает, клиент решает про прод

Сайт клиента обычно ждёт программиста или владельца, который «выложит вечером». В Mila Agent есть необязательный пакет «Вебмастер»: Мила сама собирает сайт клиента в своём контейнере, показывает превью и отправляет партию в прод, когда клиент сказал своё слово в рабочем чате. Выкладывает служба на сервере: токена хостинга у Милы нет.

Для Милы, которая ведёт сайты клиентов. Пакет ставится отдельно от ядра.

Кто решает

Сайт — клиента, а не Милы

Мила — вебмастер на подряде: строит и обслуживает. Что на сайте и когда это публикуется, решает клиент. webmaster:16-17

01 · ПРЕВЬЮ

Рабочая зона Милы

Превью на *.pages.dev и тестовые ветки Мила выкладывает сама, сколько нужно: показывает клиенту ссылку, снимает замеры.

webmaster:24-26
02 · ПРОД

По слову клиента — на эту партию

Боевой домен — только после явного слова клиента в рабочем чате на конкретный список того, что уходит сейчас. Вчерашнее «работайте» и общее «выкладывайте по готовности» не в счёт. Номер сообщения или точная цитата идёт в журнал партии.

webmaster:19-23
03 · ВЛАДЕЛЕЦ MILAGPT

Не в цепочке

Мила не просит владельца MILAGPT «выложить» и не ждёт его команды. Не хватает токена или прав — это задача администратору, а не просьба выложить руками.

webmaster:27-30
Путь партии

От сборки до проверки на боевом домене

Партия — список того, что уходит на сайт за один раз. webmaster:111-118

01 · СБОРКА

Исходники в git, сборка — в dist

У каждого клиента своя папка: исходники в git, сборочные скрипты по разделам, сборка dist-<домен>/. Перед боевой сборкой адрес превью меняется на домен в canonical, og:url, hreflang и ld+json, а noindex снимается. Новому клиенту Мила заводит ту же структуру. webmaster:36-49 webmaster:54-57

02 · ЗАПРОС

Файл в своём outbox

request_deploy.py кладёт запрос в work/outbox/deploy/<id>.json: клиент, прод или превью, хеш сборки, что уходит. Для прода без имени клиента и номера его сообщения (или точной цитаты) скрипт останавливается и файл не пишет. request_deploy.py:65-82 request_deploy.py:46-51

03 · ХОСТ

Выкладывает служба, а не Мила

Служба webmaster-deploy на сервере по таймеру читает outbox и сверяет запрос с таблицей: Мила → проект Pages → каталог сборки → домен. Выложить можно только свой проект: запрос на чужой отклоняется механически. С токеном — wrangler pages deploy; без токена — статус dry_run_no_token: служба показывает, что сделала бы, и ничего не запускает. webmaster:149-158 webmaster:161-163 webmaster:164-166

04 · ИТОГ

Ответ — файлом рядом

Результат приходит в <id>.result.json: done — Мила идёт проверять сайт; blocked — читает причину, чинит и подаёт снова. Непонятный blocked — задача администратору, а не обход через свой wrangler. webmaster:119-123 webmaster:172-174

Токена Cloudflare в контейнере Милы нет и не должно быть: он живёт на сервере. webmaster:146-147

Взгляд человека

Три вещи не уходят в прод сами

Даже когда клиент сказал выкладывать партию, эти файлы требуют отдельного взгляда человека — клиента, юриста или владельца. webmaster:59-73

Дизайн, SEO/GEO

Норма — телефон 360 px

Вёрстка проходит design_check.py перед сдачей. Бренд — по бренд-гайду клиента; нет гайда — по тому, что уже стоит на его текущем сайте: новую палитру по своему вкусу Мила не придумывает. webmaster:83-88

Мобильный экран — 360 px: это норма, а не край диапазона. Вес страницы и число запросов не растут от партии к партии без объяснения в журнале. webmaster:89-92

На каждой публичной странице: свои title и description, canonical на боевой домен, hreflang на все языки, страница в sitemap.xml, schema.org с настоящими числами. noindex — только на превью. webmaster:93-98

Картинки без искажений
  • В CSS у картинки height:auto или aspect-ratio с object-fit:cover; width и height в разметке — настоящие размеры файла. webmaster:101-105
  • img_proportsii.js в браузере на 390 и 1440 px: картинка искажена больше чем на 2 % без object-fit cover или contain — партия не уходит. webmaster:106 img_proportsii.js:8-13
После выкладки

«Готово» — числом, а не «кажется»

Проверки после выкладки
ПроверкаНорма
АдресаКаждая новая или изменённая страница отдаёт 200, а не 301, 308 или 404
Цены и текстыСходятся с тем, что клиент видел до своего слова
360 pxНет прокрутки вбок, цели касания не мельче 12 px, заголовок первого экрана — не больше 3 строк
ФормыТестовая отправка с utm_source=test дошла, куда должна, и видно, что это тест
ЖурналЗапись на партию: что ушло, слово клиента, хеш, статус, итоги проверок

Первый быстрый проход — check_deploy.py: 200 по списку адресов, viewport, canonical не на pages.dev, нет noindex в проде; код возврата 1, если хоть один адрес не прошёл. Партия без записи в журнале — как будто её не было. webmaster:129-139 check_deploy.py:12-14 check_deploy.py:44 webmaster:178-191

Клиенту

Без слов «wrangler» и «HEAD»

С клиентом Мила говорит голосом ведущей в его рабочем чате. webmaster:195-204

Честно

Чего эта страница не обещает

В репозитории

Каждую строку можно прочитать самому

Пакет в наборе с первого выпуска v1.0 и ставится по одному навыку: update.py install-skill. CHANGELOG.md:385 README.md:1-3

Файлы пакета «Вебмастер» в репозитории mila-agent
ФайлЧто делает
packs/webmaster/README.mdчто в пакете и как его поставить
webmaster/SKILL.mdнавык: кто решает, путь партии, проверки, журнал, разговор с клиентом
webmaster/request_deploy.pyзапрос на выкладку в свой outbox; прод без слова клиента не пишется
webmaster/check_deploy.pyбыстрая проверка после выкладки: 200, viewport, canonical, noindex
webmaster/img_proportsii.jsпроба пропорций картинок на 390 и 1440 px
Открытый код · Apache-2.0

Форкните, научите, пришлите PR

Набор открыт: умения, хуки, инструменты и шаблоны. Каждый pull request читает человек и Мила Качество.

Факты на странице: github.com/shakhruz/mila-agent (main, 83d4af4, v1.7.1), проверено 01.11.2026. Переписка в телефоне — иллюстрация. «Mila», «MILAGPT» и логотип — товарные знаки MILAGPT.