Індекс журналуDockup / польова нотатка
Note / cli-design-for-ai-agents

Проєктування CLI для AI-агентів: JSON, коди завершення та очікування

Проєктування CLI для AI-агентів потребує структурованого JSON, реальних кодів завершення, очікування кінцевого стану, стабільних помилок і безпечного підтвердження для production-автоматизації.

CLI для AI-агентів — це не просто інструмент командного рядка для людей, який випадково можна викликати з моделі. Це операційний протокол. Агенту потрібні детерміновані вхідні дані, структуровані результати, змістовні коди завершення, стабільні категорії помилок і спосіб очікувати, доки асинхронна інфраструктура не досягне кінцевого стану.

Без такого контракту агент змушений визначати успіх за текстом на кшталт «розгортання розпочато». Це небезпечно, адже прийнятий запит може згодом завершитися помилкою під час збірки, перевірок працездатності, запуску контейнера або перемикання трафіку.

Чому небезпечно вважати розгортання успішним?

Більшість операцій з інфраструктурою є асинхронними. API може прийняти розгортання та повернути ID за мілісекунди, тоді як фактична збірка триватиме кілька хвилин. Якщо агент повідомляє про успіх одразу після прийняття запиту, кожен наступний крок ґрунтується на хибній передумові.

Порівняймо:

ПодіяЩо вона підтверджуєЧого вона не підтверджує
Запит прийнятоПлатформа зрозуміла запитКод успішно зібрано
Збірку завершеноСтворено image або артефактЗастосунок запущено
Перевірку працездатності пройденоНовий інстанс відповідає вимогамБізнес-сценарії працюють
Трафік перемкненоРеліз став активнимВін залишатиметься працездатним
Спостереження за uptimeСервіс залишається доступнимКожна функція працює коректно

Людина може помітити цю різницю на дашборді. Агент, який працює через текстовий інтерфейс, потребує її явного кодування в інтерфейсі.

Контракт команд Dockup розділяє постановку в чергу та завершення операції. Команда deploy без --wait повертається одразу з waited:false, а deploy із --wait блокується до успіху, помилки або тайм-ауту:

dockup deploy production/api --wait --json

Стандартний тайм-аут становить 900 секунд. Команда завершується з кодом 0 лише після успішного кінцевого стану. Якщо результатом не є успіх, вона завершується з ненульовим кодом і повертає deploy_failed або deploy_timeout.

Що структурований JSON CLI дає AI-агенту?

Структурований JSON замінює інтерпретацію тексту доступом до іменованих полів. Агент може безпосередньо знайти status, deploymentId, target або code, не покладаючись на пунктуацію, кольори, ширину стовпців чи формулювання.

Успішний результат можна обробляти як дані:

{
  "ok": true,
  "target": "production/api",
  "deploymentId": "dep_123",
  "waited": true,
  "status": "success",
  "durationMs": 142381,
  "url": "https://api.dockup.tech"
}

Помилка використовує ту саму транспортну структуру:

{
  "ok": false,
  "error": "Deployment failed",
  "code": "deploy_failed"
}

Важливе правило проєктування: JSON записується в stdout, а попередження, які не мають пошкоджувати парсинг, — у stderr. Логи в режимі follow використовують NDJSON — один JSON-об’єкт у кожному рядку, — щоб викликач міг обробляти потік поступово, не очікуючи на одну величезну array.

Dockup застосовує --json до всього набору команд. Маючи 135 команд, було б ненадійно вимагати від агента запам’ятовувати прапорці. Довідник CLI та упакований skill містять узгоджені з версією інструкції щодо команд, яких має дотримуватися агент.

Важлива властивість такого підходу — не кмітливе виявлення можливостей. Важливо, що агент отримує актуальні структуровані операційні інструкції та не вигадує прапорець зі старого prompt.

Як реальні коди завершення керують автоматизацією розгортання?

Код завершення операційної системи — це найпереносиміший доступний сигнал успіху для shell-скриптів, CI-раннерів і coding agent. Код 0 означає, що команда досягла визначеного результату. Ненульовий код означає, що викликач має перейти до відновлення, ескалації або завершення роботи.

Цей фрагмент shell навмисно простий:

if dockup deploy production/api --wait --json > result.json; then
  echo "deployment reached success"
else
  dockup logs production/api --build --json
  exit 1
fi

Він не шукає слово “success” у stdout. Він не припускає, що відповідь HTTP 202 означає готовність production. Він делегує визначення успіху CLI та передає помилку батьківському процесу.

Реальні коди завершення так само важливі для одноразових команд усередині контейнера. Команда Dockup PRO exec повертає stdout, stderr і фактичний код завершення команди:

dockup exec "npm run migrate" \
  -s production/api \
  --json

Тож агент може відрізнити завершену міграцію від команди, яка лише запустилася. Це фундаментальний принцип захисних механізмів production для AI-агентів.

Як очікування кінцевого стану замінює крихкий polling?

Власноруч написані цикли polling приховують політичні рішення: як часто надсилати запити, які стани є кінцевими, скільки чекати, чи має тимчасова мережева помилка скидати таймер і що робити під час перезапуску контейнера.

Агент особливо легко помилиться в таких рішеннях, оскільки може не знати повної state machine платформи. Платформа має сама керувати семантикою очікування.

Dockup надає два корисні патерни:

dockup deploy production/api --wait --timeout 1800 --json
dockup push --json

deploy --wait явно очікує завершення. push за замовчуванням очікує після надсилання змін і запуску релізу; --no-wait вимикає це очікування. Обидві команди повертають код завершення, що відображає кінцевий результат.

Слідування за логами працює за тим самим принципом:

dockup logs production/api --build -f --json

Потік завершується, коли збірка досягає стану успіху або помилки. Фінальний об’єкт NDJSON позначає done:true, а збірка з помилкою завершується з ненульовим кодом. Викликачеві не потрібно реалізовувати ще одну версію polling.

Для перевірки доступності застосунку після розгортання команда Dockup uptime повертає похвилинні перевірки, середній час відповіді та p95:

dockup uptime production/api --hours 24 --json

Очікування та моніторинг — різні поняття. --wait відповідає на питання, чи досягло це розгортання кінцевого результату; uptime показує, як запущений сервіс поводився протягом певного часу.

Які коди помилок має розуміти агент?

Стабільні категорії помилок дають агенту змогу виконати обмежену дію, не інтерпретуючи кожне можливе повідомлення. Dockup надає такі коди:

Код помилкиЗначенняБезпечна реакція агента
not_logged_inНемає дійсного токенаЗупинитися та запросити автентифікацію
not_linkedДля push немає цілі .dockupВизначити ціль або передати її явно
no_targetНе вдалося ідентифікувати сервісВиконати services --json
needs_confirmДля руйнівної дії немає підтвердженняЗапитати людину
deploy_trigger_failedНе вдалося розпочати розгортанняПовідомити про помилку API
deploy_failedЗбірка або розгортання завершилися помилкоюПереглянути логи збірки
deploy_timeoutОперація все ще виконується після завершення ліміту очікуванняПовідомити про невизначеність або свідомо збільшити ліміт

Повідомлення про помилку залишається корисним контекстом, але саме код визначає першу гілку обробки. Завдяки цьому автоматизація не залежить від точнішого формулювання чи локалізації.

Підтвердження також є частиною протоколу. Руйнівна команда не має мовчки виконуватися лише тому, що викликач працює в неінтерактивному режимі. Dockup відхиляє такі операції без --yes і повертає needs_confirm. Автономний агент бачить запитання, а не перешкоду, яку потрібно обійти.

Модель безпеки докладніше розглянуто в матеріалі найкращі практики безпеки.

Який мінімальний контракт потрібен CLI для production?

Готовий до production CLI для AI-агентів має відповідати невеликому, але суворому контракту:

  1. Кожна операція читання та запису має машиночитаний вивід.
  2. Помилка призводить до ненульового коду завершення процесу.
  3. Асинхронні зміни можуть очікувати документований кінцевий стан.
  4. Значення секретів ніколи не повертаються командами читання.
  5. Руйнівні дії потребують явного підтвердження.
  6. Помилки мають стабільні коди, придатні для розгалуження логіки.
  7. Пакет CLI та інструкції для агента залишаються узгодженими з версією.
  8. Зміни фіксуються в audit trail.

Skill Dockup перетворює ці правила на стандартну поведінку для Claude Code і Codex. Він інструктує агента використовувати JSON, автентифікуватися через DOCKUP_TOKEN, знаходити точні цілі, виконувати розгортання з --wait, захищати облікові дані та зупинятися на needs_confirm.

Порівняйте цю модель із ширшими концепціями в матеріалі skills для агентів проти MCP. Skill надає операційні знання, а CLI залишається виконуваним інтерфейсом, чиї статус завершення та вивід визначають істину.

Матриця тестування команди, орієнтованої на агента

Перш ніж відкривати будь-яку інфраструктурну команду для агента, перевірте не лише успішний сценарій:

ТестОчікувана поведінка
Дійсний запитРезультат у JSON і код завершення 0
Недійсний токенСтабільний код автентифікації та ненульовий код завершення
Невідома цільСтабільний код цілі та відсутність змін
Тривале розгортанняОчікування до кінцевого стану або тайм-ауту
Невдале розгортанняНенульовий код завершення та ідентифікатор розгортання для діагностики
Відсутнє підтвердження руйнівної діїneeds_confirm, видалення не виконано
Читання секретуМетадані ключа видимі, значення замасковане
Попередження під час виводу JSONПопередження у stderr, коректний JSON у stdout

Ця матриця цінніша за бездоганно оформлений progress spinner. Людське форматування можна додати поверх; детермінований машинний контракт неможливо відновити постфактум.

Документація Dockup CLI показує конкретні команди, що реалізують цю модель, а матеріал розроблення за допомогою AI пояснює ширший перехід від ручного використання інструментів до workflow, керованих агентами.

Вважайте observability частиною контракту команди

Операція, орієнтована на агента, має повертати ідентифікатори, які дають змогу розслідувати події надалі. Відповідь на розгортання повинна містити ціль та ID розгортання; створена база даних — стабільний slug; snapshot volume — ID snapshot. Без цих посилань агент може описати подію, але не зможе надійно перевірити її, повторити спробу або скасувати результат.

Audit trail завершує контракт. Структурований вивід пояснює один виклик, а записи аудиту пов’язують численні виклики в часі. Разом вони дають операторам змогу визначити, чи діяв агент із потрібним ресурсом і чи стосувалася подальша команда відновлення тієї самої production-події.

Інтерфейс має залишатися простим

Надійний CLI для AI-агентів має бути передбачуваним під час успіху, помилки, тайм-ауту та повторної спроби.

Фінальна перевірка інтерфейсу

CLI для AI-агентів має правдиво повідомляти про помилки.

Перенесіть workflow у production

Спочатку протестуйте контракт із shell: перевірте парсинг JSON, успішне завершення, примусову помилку, тайм-аут і заблоковану руйнівну операцію, перш ніж делегувати доступ до production.

npm install -g dockup-cli
dockup skill install

Перша команда встановлює CLI. Друга встановлює відповідний skill Dockup для Claude Code і Codex. Почніть безкоштовно на app.dockup.ai.

FAQ

Що робить CLI придатним для AI-агентів?

Йому потрібні структурований вивід, реальні коди завершення, очікування кінцевого стану, стабільні коди помилок, маскування секретів і явне підтвердження руйнівних операцій.

Чому JSON кращий за форматований для людей вивід CLI для агентів?

JSON надає стабільні назви полів і типи даних. Агенту не потрібно визначати значення за кольорами, таблицями, пунктуацією чи змінним текстом.

Чому прийнятий запит на розгортання не означає успіх?

Прийняття лише підтверджує, що платформа поставила операцію в чергу. Подальші збірка, запуск, перевірка працездатності та перемикання трафіку все ще можуть завершитися помилкою.

Який стандартний тайм-аут очікування розгортання Dockup?

Стандартний тайм-аут для dockup deploy --wait становить 900 секунд. Його можна змінити за допомогою документованої опції --timeout.

Як агент має реагувати на needs_confirm?

Він має зупинитися та запросити явне підтвердження. Цей код означає, що запитана дія є руйнівною і навмисно не була виконана.