Деплой из AI-агентов
Layero CLI задизайнен так, чтобы AI-агент (Cursor, Claude Code, Aider, Continue и т.д.) мог задеплоить сайт за один разговор, без git-инициализации, без push'а в GitHub и без визарда в дашборде. Единственное действие от пользователя — один клик по URL для логина.
CLI деплоит существующий проект. Если задача наоборот — собрать лендинг
с нуля по описанию — посмотри @layero MCP-плагин:
один клик установки, серия квизов в чате, готовая страница на Layero.
Целевой сценарий
Пользователь: задеплой этот лендинг через layero
Агент: Сейчас. Открой https://app.layero.ru/cli?code=ABCD-1234 и подтверди.
(юзер открывает ссылку, кликает «Authorize», возвращается в чат)
Агент: ✓ Live at https://my-landing-abc123.layero.app
Никаких git init, никаких gh repo create, никаких походов в дашборд. После этого юзер может попросить агента «поменяй кнопку на красную» и снова «задеплой» — сайт обновится на том же адресе.
Чтобы агент знал что делать
Способ 1 — проектный файл (главный)
В директории проекта запустите один раз:
npx layero@latest init
Команда дописывает блок в существующие AGENTS.md / CLAUDE.md / .cursorrules (или создаёт AGENTS.md). Блок содержит: device-flow рецепт логина (auth_required → клик → poll), таблицу JSON-событий с пояснениями (detected / project_created / build_log / ready / error), список кодов ошибок с remediation (auth_required, auth_expired, cli_deploys_disabled, ...), правила для --prod. Посмотреть точный текст проще всего по факту: запустите npx layero@latest init в пустой папке и откройте созданный AGENTS.md.
Любой современный агент читает эти файлы в начале сессии и точно знает что делать без подсказок.
Способ 2 — cold-start (агент видит Layero впервые)
Если в проекте нет AGENTS.md, агент догадывается из контекста запроса юзера. Когда пользователь говорит «задеплой через layero», агент:
- Делает WebFetch на
https://layero.ru/llms.txt— каноническая страница для AI-агентов с готовым рецептом. - Или WebSearch «layero deploy» — попадает в эту страницу документации.
Оба пути ведут к одной команде: npx layero@latest deploy.
JSON-режим
Когда CLI запущен внутри AI-агента, он автоматически переключается в JSON-lines режим. Триггеры:
- Не-TTY stdout (всегда так в Cursor / Claude Code / любом subprocess)
- Env vars:
CURSOR_AGENT,CLAUDECODE,LAYERO_AGENT,LAYERO_JSON=1 - Явный флаг
--json
В этом режиме CLI:
- Не задаёт никаких вопросов
- Печатает на stdout строки вида
{"event":"...","..."}— по одной на действие - Ошибки приходят со стабильным
codeиnext_action— агент знает что делать без парсинга prose
Стрим событий
{"event":"auth_required","url":"https://app.layero.ru/cli?code=ABCD-1234","user_code":"ABCD-1234"}
{"event":"authorized","user":"alice"}
{"event":"detected","framework":"vite","build_cmd":"npm run build","output_dir":"dist","confident":true}
{"event":"project_created","project_id":"...","slug":"my-site","organization":"alice"}
{"event":"packing","files":124,"bytes":2401234,"sha256":"abc123..."}
{"event":"uploading"}
{"event":"uploaded","archive_key":"..."}
{"event":"setup_applied"}
{"event":"deploy_started","deploy_id":"..."}
{"event":"stage","name":"install"}
{"event":"build_log","line":"npm install ...","stream":"stdout"}
{"event":"stage","name":"build"}
{"event":"build_log","line":"vite v5.0.0 building...","stream":"stdout"}
{"event":"ready","url":"https://my-site.layero.app/","dashboard_url":"https://app.layero.ru/projects/...","deploy_id":"..."}
url — живой публичный сайт (apex; CLI-загрузки авто-промоутятся в него),
доступен сразу — его и показывайте пользователю. dashboard_url — страница
управления, не сайт. Поля preview_url / edge_ready — legacy времён CDN,
гейтить показ ссылки на них не нужно (см. JSON-events схема).
Коды ошибок
Полный канонический список — JSON-events схема. Кратко:
code | next_action | Когда |
|---|---|---|
auth_required | layero login или LAYERO_TOKEN | Токена нет ни в ~/.layero/config.json, ни в переменной |
auth_expired / auth_timeout | run: layero login | Пользователь не подтвердил код за 15 минут |
invalid_type | valid types: vite, next, ... | --type с неизвестным значением |
project_unknown | запустить из каталога проекта или --project | Команда вызвана вне проекта |
project_not_found | run layero projects list | --project указывает на несуществующий проект |
cli_deploys_disabled | enable in project settings | Админ выключил CLI-деплои |
prebuilt_no_dir / prebuilt_no_index | указать --prebuilt ./dist | Каталога сборки нет или в нём нет index.html |
deploy_not_started | повторить layero deploy | Сборка не стартовала |
deploy_failed | inspect logs at ... | Сборка не дошла до ready |
internal | перезапустить с --debug | Непредвиденная ошибка CLI |
Полный список — на странице JSON-события. Кодов
not_logged_in, project_unlinked, username_missing,
org_membership_missing, no_organization, deploy_error и
deploy_timed_out не существует — они были в ранних версиях CLI и удалены.
Cold-start: что ваш агент должен делать
Если вы пишете системный промпт для агента (Cursor rules, Claude Code skills, CLAUDE.md), включите примерно такое:
## Deployment
If the user asks to deploy a site to Layero:
1. Do NOT create a git repository or push to GitHub. Layero deploys local
files directly.
2. Run `npx layero@latest deploy --json` from the project root.
3. If output contains `{"event":"auth_required","url":"..."}` — render the
URL as a clickable link in chat and wait. The user will click it once.
4. Continue waiting for additional JSON events. When you see
`{"event":"ready","url":"..."}` — show `url` (the live site) to the user.
It is reachable right away; do not gate on `edge_ready`. Then stop.
5. If you see `{"event":"error","code":"...","next_action":"..."}` —
follow next_action verbatim.
Что НЕ делать
- ❌
git init+gh repo createперед деплоем — это лишний путь, агент часто туда сваливается по аналогии с Vercel/Netlify - ❌
npm install -g layero— глобальная установка часто фейлится в песочнице агента. Используйтеnpx layero@latestилиnpm install -D layero - ❌ Открывать дашборд для «дописать setup» —
layero deployсейчас полностью inline, никакой ручной настройки в браузере между «upload» и «build» нет - ❌ Просить пользователя запустить
layero loginотдельно —layero deployсам стартует device-flow (auth_required), если токена нет - ❌ Добавлять
--prod/ отдельныйpromoteдля CLI-проекта — прямая загрузка и так публикуется в apex автоматически,--prodтут ничего не меняет. Важнее обратное следствие: обычныйdeploy— не безобидное превью, он заменяет то, что видят посетители. И обойти это из CLI нечем:--branchдля архивной загрузки игнорируется (см.layero deploy). Если пользователю нужна версия «на посмотреть», не трогающая живой адрес, — этого сценария у CLI-проекта сейчас нет, он делается через подключённый репозиторий и пуш в ветку
Полная цепочка для агента
Самодостаточный рецепт, который работает с нуля (полностью cold-start, ничего не настроено):
# 1. Создать .layero/project.json + AGENTS.md (опционально, но удобно для будущих сессий)
npx layero@latest init
# 2. Авторизоваться (один раз на машину; токен в ~/.layero/config.json)
npx layero@latest login
# 3. Задеплоить
npx layero@latest deploy --json
После ready показать юзеру URL и закончить. Дальнейшие правки → снова npx layero@latest deploy → новый URL.