Гайд · TNWS AI

Как получить JSONL из Copilot CLI через --output-format=json

6 мин

Программный запуск Copilot CLI с -p и --output-format=json: поток JSONL, валидация строк, stderr, exit code и resume hint.

Задача и когда применять

Практическая задача этого руководства — получить машиночитаемый поток событий Copilot CLI для скрипта или CI, не разбирая декоративный терминальный текст. Материал рассчитан на разработчика или администратора, который уже установил GitHub Copilot CLI и хочет получить проверяемый результат, а не просто скопировать команду из справки.

Команды CLI исполняются в контексте текущего пользователя, рабочего каталога и активной политики организации. Перед началом сохраните вывод copilot version, pwd и git status --short, если работаете в репозитории. Не вставляйте в prompt, аргументы и диагностические файлы токены, закрытые ключи или содержимое .env.

Что подтверждено официально

Проверено 13 сентября 2026 года. -p PROMPT/--prompt=PROMPT выполняет prompt программно и завершает процесс. --output-format=json выдаёт JSONL — по одному JSON-объекту на строку; text остаётся форматом по умолчанию. Exit summary содержит подсказку copilot --resume=SESSION-ID.

Первоисточник — GitHub Copilot CLI command reference. Для MCP-сценария дополнительно используйте официальную настройку MCP servers. Цены, квоты и список доступных моделей здесь не приводятся: они не нужны для процедуры и могут меняться. Названия команд и параметров взяты из текущей официальной справки.

У CLI есть три разных уровня результата: команда может быть синтаксически принята, фактически выполнена и дать ожидаемый эффект. Проверяйте все три. Нулевой exit code без проверки файла или интерфейса недостаточен; красивый текст ответа при ненулевом exit code тоже нельзя считать успехом.

Перед тестом запишите точную гипотезу в одном предложении: «после команды появится такой-то файл, источник, запрет или набор подсказок». Затем определите независимый способ проверки, который не опирается на объяснение самого ассистента. Для файла это просмотр содержимого и diff, для разрешения — намеренно безопасная попытка запрещённого действия, для списка — сравнение структурированного вывода. Такой подход помогает обнаружить ситуацию, когда команда отработала, но не в том каталоге, не для того пользователя или не в той конфигурации.

Подготовка безопасной среды

Для первого запуска используйте тестовый репозиторий, временный каталог или read-only задачу. Сохраните baseline: существующие файлы конфигурации, список источников, текущий completion или разрешения. Если команда пишет файл, заранее определите точный путь и сделайте резервную копию только этого файла. Если команда предоставляет доступ, перечислите разрешённые и контрольные запрещённые объекты.

Не используйте глобальные разрешения ради удобства, когда задачу решает точный флаг. В CI разделяйте stdout, stderr и exit code. В интерактивной сессии читайте запросы разрешений и не подтверждайте действие только потому, что его предложил Copilot. Любой сгенерированный код или конфигурацию просматривайте как обычный внешний patch.

Пошаговые действия

  1. Сформулируйте read-only prompt с однозначным результатом и без секретов.
  2. Запустите из нужного каталога, например copilot -C ./repo -p "Перечисли test-команды без запуска" --output-format=json > events.jsonl.
  3. Сохраните stderr отдельно, если скрипту важно отличать диагностику от JSONL.
  4. Проверьте exit code процесса до чтения результата.
  5. Валидируйте каждую непустую строку как отдельный JSON-объект; не пытайтесь разобрать весь файл одним JSON.parse.
  6. Обрабатывайте неизвестные event types устойчиво: логируйте и пропускайте, а не ломайте pipeline без необходимости.
  7. Найдите итоговое сообщение и, если нужно продолжение, сохраните только session ID из подтверждённой структуры/summary.
  8. Удалите JSONL после обработки, если в событиях есть внутренний код или пути.

После выполнения повторите диагностическую команду или откройте новую shell/CLI-сессию, если эффект должен пережить перезапуск. Сравните результат с baseline. Если изменилось больше файлов или источников, чем ожидалось, остановитесь, сохраните diff и выполните откат до продолжения.

Готовый шаблон для копирования

Заполните эту карточку перед изменением. Её можно вставить в issue или change request:

Programmatic Copilot run
Working directory: <repo>
Prompt: <read-only точная задача>
Output: events.jsonl
Формат: один JSON object на строку
Проверки: exit code, JSON каждой строки, ожидаемое финальное событие
stderr: отдельный файл
Session ID: хранить только при необходимости resume
Секреты в prompt/output: отсутствуют
Дата проверки документации: 13.09.2026
Официальный источник: https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-command-reference

Для подготовки проверки можно скопировать prompt ниже. Он не разрешает ассистенту придумывать состояние окружения:

Составь план безопасной проверки команды GitHub Copilot CLI по карточке ниже.
Не выполняй запись, сетевую публикацию и изменение прав.
Не придумывай версию, файлы, exit code или успешный результат.
Верни: предпосылки, точную команду, позитивный тест, негативный тест,
наблюдаемые критерии успеха, откат и данные, которые нельзя логировать.

<вставьте заполненную карточку>

Реалистичный пример

Входные условия. CI должен получить перечень test-команд без их запуска и передать итог следующему безопасному шагу.

Ожидаемый результат. Файл содержит JSONL, а не один JSON-массив. Парсер читает построчно, проверяет exit code и извлекает подтверждённый итог; при ошибке процесс не выдаётся за успешный.

Пример считается успешным только после наблюдаемой проверки: существования и содержимого файла, нового completion в отдельной сессии, записи JSON, списка источников либо явного запрета действия. Не подменяйте ожидаемый результат пересказом документации — зафиксируйте фактический вывод вашей среды.

Позитивный и негативный тест

В позитивном тесте используйте минимальный безопасный объект: одну известную подкоманду, один каталог, один источник или один JSONL-файл. Сначала предскажите наблюдаемый результат, затем запустите действие и сохраните exit code. Если вывод содержит внутренние пути, не публикуйте сырой лог.

Негативный тест должен менять ровно одно условие: запретить конкретную команду, выбрать файл вне scope, убрать сессионный флаг или открыть новый shell. Такой тест доказывает границу настройки. Не используйте production remote, реальные секреты и необратимые операции для демонстрации отказа.

Если позитивный тест не прошёл, проверьте working directory, кавычки shell, версию CLI, организационную policy и права на целевой путь. Если негативный тест неожиданно прошёл, считайте конфигурацию небезопасной, завершите сессию и сузьте разрешения.

Типичные ошибки

  • Разбирать JSONL как один JSON document.
  • Игнорировать exit code.
  • Смешивать stderr с stdout.
  • Передавать token внутри prompt.
  • Предполагать стабильный неизвестный event schema без defensive parsing.

Отдельная ошибка — копировать команду между Bash, Zsh, Fish, PowerShell и CI без адаптации кавычек и перенаправлений. Сначала определите shell. Не сохраняйте секретные аргументы в history; используйте поддерживаемые переменные окружения или защищённое хранилище конкретной CI-системы.

Чек-лист финальной проверки

  • copilot version и рабочий каталог записаны.
  • Команда и названия флагов сверены с официальной документацией на 13.09.2026.
  • В prompt, history и временных файлах нет секретов.
  • Baseline сохранён до изменения.
  • Позитивный тест дал заранее описанный наблюдаемый результат.
  • Негативный тест подтвердил границу настройки.
  • Проверены exit code, stdout и stderr, где это применимо.
  • Неожиданные изменения файлов отсутствуют либо разобраны.
  • Временные логи и конфигурации удалены или защищены.
  • Откат выполнен на тесте или подробно записан.

FAQ

Чем JSONL отличается от JSON-массива?

Каждая строка — самостоятельный JSON-объект; весь файл не обязан быть одним массивом.

Зачем -p?

Он запускает prompt программно и завершает процесс после выполнения.

Как продолжить сессию?

Официальная справка сообщает resume hint в exit summary; сохраняйте идентификатор только из фактического вывода.

Можно ли игнорировать exit code при валидном JSON?

Нет. Валидное событие может описывать ошибку; статус процесса остаётся обязательной проверкой.

Итог

Рабочая настройка — это команда плюс доказательство её эффекта и границы. Храните заполненную карточку рядом с issue, а повторяемую команду — в проверенном wrapper script без секретов. Перед переносом в другую машину или организацию снова проверьте официальную справку: CLI обновляется, а доступность функций может зависеть от политики владельца Copilot.

Читайте также

Комментарии

Пока тихо. Скажите первое слово