cf — единый CLI от Cloudflare для всего публичного API
📂 Исходный код на GitHubЕдиный CLI от Cloudflare, сгенерированный из публичного OpenAPI-описания платформы. Покрывает Workers, Pages, R2, D1, KV, Queues, Durable Objects, туннели и Zero Trust. Конфиг проекта переехал в cloudflare.config.ts, Vite стал сборщиком по умолчанию, есть локальный режим через Miniflare. Открытая бета 1.0, лицензия MIT или Apache-2.0.
Cloudflare выпустил cf — единый CLI ко всему публичному API платформы. Отличие от привычных инструментов в том, что им можно пользоваться не только человеку, но и AI-агенту: нужную команду агент находит поиском, а ответ по умолчанию получает в JSON. Ставится пакетом cf из npm, требует Node.js 22 или новее. Сейчас это открытая бета-версия 1.0.
Что внутри
cf — не набор команд, написанных вручную, а результат генерации из публичного OpenAPI-описания Cloudflare. Отсюда два практических свойства:
- покрытие платформы большое: Workers, Pages, R2, D1, KV, Queues, Durable Objects, Vectorize, туннели, Zero Trust, AI Gateway, аналитика, WAF, DNS;
- набор команд меняется вместе с привязанной версией OpenAPI, поэтому список лучше смотреть через
cf --help, а не запоминать.
Формат команд единый: cf <продукт> [группа…] <операция>. Секреты Workers лежат в cf workers secrets, туннели — в cf tunnels.
Установка
npm install -g cf
Пакет ставится глобально и даёт две равнозначные команды — cf и cloudflare. Нужен Node.js 22 или новее.
Автодополнение для shell подключается так:
cf complete bash >> ~/.bashrc
Первые шаги
cf auth login # login into Cloudflare
cf --help # list all commands
cf <command> --help # help for a single command
Отдельная команда cf cli search ищет по всему каталогу команд, включая скрытые, и возвращает пять подходящих вариантов с короткими пояснениями. Если CLI понимает, что перед ним агент, он показывает подсказки по поиску команд перед выводом справки. Точные детали запроса по API-командам лежат в cf schema.
Аутентификация
Ключи берутся в таком порядке:
- переменная окружения
CLOUDFLARE_API_TOKEN; - OAuth-профиль, выбранный флагом
--profile, привязанный к ближайшему каталогу либо профиль по умолчанию — он обновляется автоматически.
Именованные профили создаются и переключаются командами cf auth create, cf auth activate, cf auth deactivate, cf auth list и cf auth delete. Профиль по умолчанию живёт под cf auth login и cf auth logout.
Телеметрию можно отключить переменными DO_NOT_TRACK=1 и CF_QUIET=1.
Проекты и cloudflare.config.ts
cloudflare.config.ts — новый формат конфигурации Cloudflare. Файл написан на TypeScript, поэтому редактор и языковой сервер подсказывают поля, а агент читает готовые типы вместо того, чтобы угадывать названия.
Команда cf init my-worker создаёт заготовку: Worker на hello-world, файлы cloudflare.config.ts, vite.config.ts, src/index.ts, tsconfig.json, package.json и .gitignore. Дальше она ставит зависимости тем пакетным менеджером, который вы выбрали (--package-manager, либо --no-install, чтобы пропустить установку), и генерирует типы в .cloudflare/types/index.d.ts. С флагом --no-install типы создаются позже — их сделает cf dev или скрипт typecheck в новом проекте, который выполняет cf workers types && tsc.
Если в каталоге уже есть файлы, cf init не создаёт новый проект, а автоматически настраивает существующий. В README этот режим называется autoconfig.
Пример конфигурации с контейнером и Durable Object:
import {
bindings,
defineConfig,
defineContainer,
exports as configExports,
} from "cf/config";
import * as entrypoint from "./src/worker" with { type: "cf-worker" };
const workerName = "cf-vite-container-fixture";
const fixtureContainer = defineContainer({
name: "cf-vite-container-fixture-app",
image: {
dockerfile: "./Dockerfile",
},
instanceType: "lite",
maxInstances: 1,
});
export default defineConfig({
worker: {
name: workerName,
entrypoint,
compatibilityDate: "2026-09-12",
exports: {
ContainerDO: configExports.durableObject({
storage: "sqlite",
container: fixtureContainer,
}),
},
env: {
CONTAINER: bindings.durableObject({
worker: workerName,
exportName: "ContainerDO",
}),
},
observability: { enabled: true },
},
containers: [fixtureContainer],
});
Команды cf dev и cf build сами определяют тип проекта, при необходимости запускают настройку и вызывают штатную команду фреймворка или установленную реализацию Cloudflare. Успешная сборка даёт стандартный Build Output.
Деплой, версии и триггеры
cf deploy # build, then upload
cf workers versions create # upload a version without deploying
cf workers triggers deploy # apply routes and cron schedules
К любой из этих команд можно добавить --prebuilt, чтобы взять уже готовый Build Output и не пересобирать.
Для проектов на wrangler есть cf migrate: команда переводит конфиг wrangler (JSON, JSONC или TOML) в cloudflare.config.ts через @cloudflare/codemods. Поддерживает Vite и Wrangler как сборщики, пробный запуск и защиту от изменений при нечистом рабочем дереве, а в конце перечисляет, что осталось поправить руками.
Локальные ресурсы
К поддерживаемым командам можно добавить флаг --local — тогда команда выполняется против недолговещего экземпляра Miniflare, который работает поверх сохранённого локального состояния. Прямо из состояния на диске работают операции KV (получить, список, обновить, удалить и массовое получение), D1 (сырой запрос и применение миграций) и R2 (получить, загрузить, список объектов и массовое удаление по массиву). Часть операций Durable Objects и Workflow дополнительно требует совместимый живой узел реестра, который объявляет нужные биндинги.
Каталог состояния меняется флагом --persist-to <directory>; он имеет смысл только вместе с --local. У команды без локального аналога вы получите ошибку, а не неожиданный запрос к боевому окружению.
Вывод в терминал
Структурированные ответы API печатаются в stdout как JSON с отступами. Ответы типов binary и text пишутся в stdout напрямую, чтобы бинарный вывод можно было перенаправить в файл; у части команд есть флаг --text для расшифровки в UTF-8. Служебные отметки об успехе с пустым результатом уходят в stderr.
Если нужно отфильтровать вывод:
cf d1 execute my-db --command "select 1" --local | jq '.result[0]'
Анимация прогресса идёт через stdout на интерактивном терминале с цветом и отключается для пайпов, для терминалов без цвета и при CF_QUIET=1. Цвета отключаются переменной NO_COLOR=1. В поддерживаемых терминалах прогресс дублируется в названии вкладки и в панели задач — это выключается через CF_NO_OSC_PROGRESS=1 и включается принудительно через CF_FORCE_OSC_PROGRESS=1.
Статус и лицензия
Проект в открытой бете 1.0: версии выходят под тегом beta в npm. Перед сборкой CLI требует Vite-плагин второй версии, тоже в бете; первая версия плагина больше не подходит как локальная реализация для запуска. Лицензия двойная — MIT или Apache-2.0, на ваш выбор.
Подробное описание команд и состав телеметрии собраны в README пакета CLI и в файле про телеметрию.
Ссылки
- Репозиторий: https://github.com/cloudflare/cf
- README пакета CLI: https://github.com/cloudflare/cf/blob/main/packages/cli/README.md
- Что собирается в телеметрию: https://github.com/cloudflare/cf/blob/main/packages/cli/telemetry.md
- Пример cloudflare.config.ts: https://github.com/cloudflare/cf/blob/main/fixtures/vite-container-project/cloudflare.config.ts
- Документация Cloudflare для разработчиков: https://developers.cloudflare.com/
- Анонс CLI: https://blog.cloudflare.com/cf-cli-local-explorer/
Источник: https://github.com/cloudflare/cf