Сайт клиента обычно ждёт программиста или владельца, который «выложит вечером». В Mila Agent есть необязательный пакет «Вебмастер»: Мила сама собирает сайт клиента в своём контейнере, показывает превью и отправляет партию в прод, когда клиент сказал своё слово в рабочем чате. Выкладывает служба на сервере: токена хостинга у Милы нет.
Для Милы, которая ведёт сайты клиентов. Пакет ставится отдельно от ядра.
Мила — вебмастер на подряде: строит и обслуживает. Что на сайте и когда это публикуется, решает клиент. webmaster:16-17
Превью на *.pages.dev и тестовые ветки Мила выкладывает сама, сколько нужно: показывает клиенту ссылку, снимает замеры.
webmaster:24-26Боевой домен — только после явного слова клиента в рабочем чате на конкретный список того, что уходит сейчас. Вчерашнее «работайте» и общее «выкладывайте по готовности» не в счёт. Номер сообщения или точная цитата идёт в журнал партии.
webmaster:19-23Мила не просит владельца MILAGPT «выложить» и не ждёт его команды. Не хватает токена или прав — это задача администратору, а не просьба выложить руками.
webmaster:27-30Партия — список того, что уходит на сайт за один раз. webmaster:111-118
У каждого клиента своя папка: исходники в git, сборочные скрипты по разделам, сборка dist-<домен>/. Перед боевой сборкой адрес превью меняется на домен в canonical, og:url, hreflang и ld+json, а noindex снимается. Новому клиенту Мила заводит ту же структуру. webmaster:36-49 webmaster:54-57
request_deploy.py кладёт запрос в work/outbox/deploy/<id>.json: клиент, прод или превью, хеш сборки, что уходит. Для прода без имени клиента и номера его сообщения (или точной цитаты) скрипт останавливается и файл не пишет. request_deploy.py:65-82 request_deploy.py:46-51
Служба webmaster-deploy на сервере по таймеру читает outbox и сверяет запрос с таблицей: Мила → проект Pages → каталог сборки → домен. Выложить можно только свой проект: запрос на чужой отклоняется механически. С токеном — wrangler pages deploy; без токена — статус dry_run_no_token: служба показывает, что сделала бы, и ничего не запускает. webmaster:149-158 webmaster:161-163 webmaster:164-166
Результат приходит в <id>.result.json: done — Мила идёт проверять сайт; blocked — читает причину, чинит и подаёт снова. Непонятный blocked — задача администратору, а не обход через свой wrangler. webmaster:119-123 webmaster:172-174
Токена Cloudflare в контейнере Милы нет и не должно быть: он живёт на сервере. webmaster:146-147
Даже когда клиент сказал выкладывать партию, эти файлы требуют отдельного взгляда человека — клиента, юриста или владельца. webmaster:59-73
Вёрстка проходит design_check.py перед сдачей. Бренд — по бренд-гайду клиента; нет гайда — по тому, что уже стоит на его текущем сайте: новую палитру по своему вкусу Мила не придумывает. webmaster:83-88
Мобильный экран — 360 px: это норма, а не край диапазона. Вес страницы и число запросов не растут от партии к партии без объяснения в журнале. webmaster:89-92
На каждой публичной странице: свои title и description, canonical на боевой домен, hreflang на все языки, страница в sitemap.xml, schema.org с настоящими числами. noindex — только на превью. webmaster:93-98
| Проверка | Норма |
|---|---|
| Адреса | Каждая новая или изменённая страница отдаёт 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
С клиентом Мила говорит голосом ведущей в его рабочем чате. webmaster:195-204
Пакет в наборе с первого выпуска v1.0 и ставится по одному навыку: update.py install-skill. CHANGELOG.md:385 README.md:1-3
| Файл | Что делает |
|---|---|
| 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 |
Набор открыт: умения, хуки, инструменты и шаблоны. Каждый pull request читает человек и Мила Качество.
Факты на странице: github.com/shakhruz/mila-agent (main, 83d4af4, v1.7.1), проверено 01.11.2026. Переписка в телефоне — иллюстрация. «Mila», «MILAGPT» и логотип — товарные знаки MILAGPT.