CLI Cursor Agent поддерживает несколько форматов вывода с опцией --output-format в сочетании с --print. Доступны структурированные форматы для программного использования (json, stream-json) и упрощённый текстовый формат для удобного отслеживания прогресса.
Значение по умолчанию для --output-formatstream-json. Эта опция работает только при печати (--print) или когда режим печати определяется автоматически (не TTY stdout или передача в конвейере через stdin).

Формат JSON

Формат вывода json при успешном завершении выполнения возвращает один объект JSON (с завершающим переводом строки). Дельты и события инструментов не выводятся; текст собирается в итоговый результат. При ошибке процесс завершается с ненулевым кодом и записывает сообщение об ошибке в stderr. В случае ошибки корректный объект JSON не выводится.

Успешный ответ

При успешном выполнении CLI выводит объект JSON со следующей структурой:
{
  "type": "result",
  "subtype": "success",
  "is_error": false,
  "duration_ms": 1234,
  "duration_api_ms": 1234,
  "result": "<full assistant text>",
  "session_id": "<uuid>",
  "request_id": "<optional request id>"
}
FieldDescription
typeВсегда "result" для финальных результатов
subtypeВсегда "success" для успешных завершений
is_errorВсегда false для успешных ответов
duration_msОбщее время выполнения в миллисекундах
duration_api_msВремя запроса к API в миллисекундах (сейчас равно duration_ms)
resultПолный текст ответа ассистента (конкатенация всех текстовых дельт)
session_idУникальный идентификатор сеанса
request_idНеобязательный идентификатор запроса (может быть опущен)

Формат Stream JSON

Формат вывода stream-json генерирует JSON, разделенный переводами строк (NDJSON). Каждая строка содержит один JSON-объект, представляющий событие в реальном времени во время выполнения. Поток завершается терминальным событием result при успешном выполнении. При ошибке процесс завершается с ненулевым кодом, и поток может завершиться досрочно без терминального события; сообщение об ошибке записывается в stderr.

Типы событий

Инициализация системы

Генерируется один раз в начале каждой сессии:
{
  "type": "system",
  "subtype": "init",
  "apiKeySource": "env|flag|login",
  "cwd": "/absolute/path",
  "session_id": "<uuid>",
  "model": "<model display name>",
  "permissionMode": "default"
}
В будущем к этому событию могут быть добавлены поля типа tools и mcp_servers.

Сообщение пользователя

Содержит входной промпт пользователя:
{
  "type": "user",
  "message": {
    "role": "user",
    "content": [{ "type": "text", "text": "<prompt>" }]
  },
  "session_id": "<uuid>"
}

Дельта текста ассистента

Генерируется несколько раз, пока ассистент создает свой ответ. Эти события содержат инкрементальные фрагменты текста:
{
  "type": "assistant",
  "message": {
    "role": "assistant",
    "content": [{ "type": "text", "text": "<delta chunk>" }]
  },
  "session_id": "<uuid>"
}
Объедини все значения message.content[].text по порядку, чтобы восстановить полный ответ ассистента.

События вызова инструментов

Вызовы инструментов отслеживаются событиями начала и завершения: Вызов инструмента начат:
{
  "type": "tool_call",
  "subtype": "started",
  "call_id": "<string id>",
  "tool_call": {
    "readToolCall": {
      "args": { "path": "file.txt" }
    }
  },
  "session_id": "<uuid>"
}
Вызов инструмента завершен:
{
  "type": "tool_call",
  "subtype": "completed",
  "call_id": "<string id>",
  "tool_call": {
    "readToolCall": {
      "args": { "path": "file.txt" },
      "result": {
        "success": {
          "content": "содержимое файла...",
          "isEmpty": false,
          "exceededLimit": false,
          "totalLines": 54,
          "totalChars": 1254
        }
      }
    }
  },
  "session_id": "<uuid>"
}

Типы вызовов инструментов

Инструмент чтения файла:
  • Начат: tool_call.readToolCall.args содержит { "path": "file.txt" }
  • Завершен: tool_call.readToolCall.result.success содержит метаданные файла и содержимое
Инструмент записи файла:
  • Начат: tool_call.writeToolCall.args содержит { "path": "file.txt", "fileText": "content...", "toolCallId": "id" }
  • Завершен: tool_call.writeToolCall.result.success содержит { "path": "/absolute/path", "linesCreated": 19, "fileSize": 942 }
Другие инструменты:
  • Могут использовать структуру tool_call.function с { "name": "tool_name", "arguments": "..." }

Терминальный результат

Финальное событие, генерируемое при успешном завершении:
{
  "type": "result",
  "subtype": "success",
  "duration_ms": 1234,
  "duration_api_ms": 1234,
  "is_error": false,
  "result": "<полный текст ассистента>",
  "session_id": "<uuid>",
  "request_id": "<optional request id>"
}

Пример последовательности

Вот репрезентативная NDJSON-последовательность, показывающая типичный поток событий:
{"type":"system","subtype":"init","apiKeySource":"login","cwd":"/Users/user/project","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","model":"Claude 4 Sonnet","permissionMode":"default"}
{"type":"user","message":{"role":"user","content":[{"type":"text","text":"Прочитай README.md и создай резюме"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"Я "}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"прочитаю файл README.md"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"},"result":{"success":{"content":"# Project\n\nThis is a sample project...","isEmpty":false,"exceededLimit":false,"totalLines":54,"totalChars":1254}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":" и создам резюме"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# README Summary\n\nThis project contains...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# README Summary\n\nThis project contains...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"},"result":{"success":{"path":"/Users/user/project/summary.txt","linesCreated":19,"fileSize":942}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"result","subtype":"success","duration_ms":5234,"duration_api_ms":5234,"is_error":false,"result":"Я прочитаю файл README.md и создам резюме","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","request_id":"10e11780-df2f-45dc-a1ff-4540af32e9c0"}

Текстовый формат

Формат вывода text предоставляет упрощённый, удобочитаемый поток действий агента. Вместо детализированных JSON-событий он выводит короткие текстовые описания того, что агент делает в реальном времени. Этот формат удобен для мониторинга прогресса агента без накладных расходов на парсинг структурированных данных, что делает его идеальным для логирования, отладки или простого трекинга прогресса.

Пример вывода

Read file
Edited file
Ran terminal command
Created new file
Каждое действие выводится на новой строке по мере выполнения агентом, обеспечивая мгновенную обратную связь о ходе выполнения задачи.

Заметки по реализации

  • Каждое событие передается как одна строка, завершающаяся символом \n
  • События thinking подавляются в режиме печати и не будут отображаться ни в одном из форматов вывода
  • Добавление полей может происходить со временем обратно-совместимым способом (потребители должны игнорировать неизвестные поля)
  • Формат потока обеспечивает обновления в реальном времени, в то время как формат JSON ожидает завершения перед выводом результатов
  • Объедини все дельты сообщений assistant, чтобы восстановить полный ответ
  • ID вызовов инструментов можно использовать для сопоставления событий запуска/завершения
  • ID сессий остаются неизменными на протяжении всего выполнения одного агента