Gemini CLI. Часть 1

Что такое Gemini CLI
Gemini CLI - это инструмент с открытым исходным кодом, выпущенный Google. Он работает как диалоговый агент прямо в терминале: принимает команды на естественном языке, анализирует вашу кодовую базу, выполняет shell-команды и решает многошаговые задачи. По сути, это ответ Google на Claude Code от Anthropic.
Gemini CLI использует архитектуру ReAct (Reason and Act) - он рассуждает, выбирает нужный инструмент и действует. Инструмент поддерживает интерфейс в стиле REPL с двумя типами команд:
- Slash-команды (/ – префикс) – управление сессией, инструментами и настройками.
- Bang-команды (! – префикс) – прямое выполнение shell-команд.
Ключевые возможности:
- Анализ и рефакторинг кода – понимает существующий проект, объясняет сложные участки, генерирует функции.
- Отладка – находит баги, предлагает исправления, автоматически создаёт тесты.
- Выполнение команд – запускает git, npm, pip и другие утилиты прямо из CLI.
- Интеграция с Google Search – получает актуальную информацию из сети в реальном времени.
- Поддержка MCP (Model Context Protocol) – подключается к внешним базам данных и сторонним инструментам
- Работа с Google Drive, Docs, Sheets – подтягивает данные по ссылке без ручного копирования.
- Работа с вашей Gmail-почтой.
- Умеет читать разные файлы, даже PDF.
По лимитам пока так, но эти лимиты могут измениться и пока вы читаете эту статью возможно они уже изменились.
| Характеристика | Значение |
|---|---|
| Контекстное окно | 1 миллион токенов |
| Запросов в минуту | 60 |
| Запросов в день | 1 000 |
| Цена | Бесплатно (личный Google-аккаунт) |
| Платформы | Windows, macOS, Linux |
Чтобы просмотреть статистику использования можно вызвать команду
/stats
Установка
Установка достаточно простая, если у вас есть homebrew (кстати, доступен не только на macOS, но и на linux), то просто можете выполнить команду:
brew install gemini-cli
Если нет, то нужно установить Node.js и вызвать команду:
npm install -g @google/gemini-cli
После того как установили Gemini, его можно запустить командой:
gemini
Инструмент предложит авторизоваться через личный Google-аккаунт, после чего вы сразу получаете бесплатный доступ. Затем получите что-то такое:

По умолчанию Gemini CLI работает в безопасном режиме: любые действия, которые могут изменить систему (запись файлов, выполнение команд и т. д.), требуют подтверждения. Перед выполнением инструмент покажет diff или команду и спросит разрешение (Y/n). Это защищает от нежелательных изменений.
Конфигурирование
Вы можете настроить Gemini CLI под себя командой /settings. Откроется большой список настроек.

Также можно настроить через файл settings.json. Настройки применяются в следующем порядке приоритета:
- Проект: .gemini/settings.json (переопределяет пользовательские).
- Пользователь: ~/.gemini/settings.json.
- Система: /etc/gemini-cli/settings.json (применяется ко всем пользователям, имеет наивысший приоритет).
Пример settings.json:
{
"theme": "GitHub",
"autoAccept": false,
"sandbox": "docker",
"vimMode": true,
"checkpointing": { "enabled": true },
"fileFiltering": { "respectGitIgnore": true },
"usageStatisticsEnabled": true,
"includeDirectories": ["../shared-library", "~/common-utils"],
"chatCompression": { "contextPercentageThreshold": 0.6 },
"customThemes": {
"MyCustomTheme": {
"name": "MyCustomTheme", "type": "custom",
"Background": "#181818", "Foreground": "#F8F8F2",
"LightBlue": "#82AAFF", "AccentBlue": "#61AFEF", "AccentPurple": "#C678DD",
"AccentCyan": "#56B6C2", "AccentGreen": "#98C379", "AccentYellow": "#E5C07B",
"AccentRed": "#E06C75", "Comment": "#5C6370", "Gray": "#ABB2BF"
}
}
}
Подробнее о настройке можно узнать в документации
API-ключ и лимиты
По умолчанию Gemini CLI работает через ваш личный Google-аккаунт с бесплатными лимитами. Если вам нужно больше запросов или вы хотите использовать корпоративный аккаунт, можно подключить собственный API-ключ через Google AI Studio. Получив ключ, установите переменную окружения:
# Linux / macOS
export GEMINI_API_KEY="ваш_ключ"
# Windows (PowerShell)
$env:GEMINI_API_KEY="ваш_ключ"
Или добавьте её в settings.json:
{
"apiKey": "ваш_ключ"
}
При использовании собственного ключа лимиты определяются вашим тарифным планом в Google AI Studio, а не бесплатными ограничениями личного аккаунта.
Советы по использованию
Рассмотрим советы по использованию инструмента и его скрытые возможности.
Используем GEMINI.md
Используйте файл GEMINI.md, чтобы предоставлять инструкции модели и адаптировать её под ваш проект. Используйте команду /init для создания начального файла GEMINI.md для вашего проекта.
CLI объединяет файлы GEMINI.md из нескольких расположений. Более специфичные файлы переопределяют общие. Порядок загрузки следующий:
- Глобальный контекст:
~/.gemini/GEMINI.md(для инструкций, которые применяются ко всем вашим проектам). - Контекст проекта / Родительских директорий: CLI ищет файлы
GEMINI.mdначиная с вашей текущей директории и вверх до корневой папки проекта. - Контекст поддиректорий: CLI также сканирует поддиректории на наличие файлов
GEMINI.md, что позволяет задавать инструкции для конкретных компонентов.
Примечание: Используйте команду
/memory show, чтобы увидеть итоговый объединенный контекст, который отправляется модели.
Пример GEMINI.md с использованием импортов:
# Главный контекст проекта: My Awesome App
## Общие инструкции
- Весь код на Python должен соответствовать стандарту PEP 8.
- Используйте отступ в 2 пробела для всех новых файлов.
## Руководства по стилю для конкретных компонентов
@./src/frontend/react-style-guide.md
@./src/backend/fastapi-style-guide.md
Не забывайте добавлять .geminiignore
Создайте файл .geminiignore в корне вашего проекта, чтобы исключить файлы и директории из инструментов Gemini, аналогично .gitignore.
/backups/
*.log
secret-config.json
.env
Создаем кастомные команды
Мы познакомились с командой /settings, но мы можем создавать кастомные команды сами. Например, можно сделать команду /test:gen, которая генерирует юнит-тесты по описанию, или /db:reset, которая удаляет и заново создаёт тестовую базу данных.
Gemini CLI поддерживает кастомные slash-команды, которые задаются в простых конфигурационных файлах. По сути, это заранее подготовленные шаблоны промптов. Чтобы создать такую команду, добавьте каталог commands/ либо в ~/.gemini/ (для глобальных команд), либо в .gemini/ вашего проекта.
Внутри commands/ создавайте отдельный TOML-файл на каждую новую команду. Имя файла определяет имя команды: например, файл test/gen.toml создаёт команду /test:gen.
Рассмотрим пример. Пусть вам нужна команда, генерирующая юнит-тест по текстовому описанию требования. Создайте файл:
# Invoked as: /test:gen "Description of the test"
description = "Generates a unit test based on a requirement."
prompt = """
You are an expert test engineer. Based on the following requirement, please write a comprehensive unit test using the Jest framework.
Requirement: {{args}}
"""
Теперь, после перезагрузки или перезапуска Gemini CLI вы можете просто ввести:
/test:gen "Ensure the login button redirects to the dashboard upon success"
Gemini CLI распознает /test:gen и подставит {{args}} из шаблона промпта в виде переданного аргумента. Команд может быть множество, дайте волю фантазии.
Песочница (Sandbox)
В примере settings.json выше есть параметр "sandbox": "docker" – разберём, что он делает.
По умолчанию Gemini CLI выполняет shell-команды напрямую на вашей системе. Это удобно, но потенциально опасно: агент с широкими правами может случайно (или не случайно) изменить что-то важное. Режим sandbox решает эту проблему - все команды выполняются внутри изолированного Docker-контейнера, а не на хост-системе.
Чтобы включить:
{
"sandbox": "docker"
}
Для этого на машине должен быть установлен и запущен Docker (как установить можно почитать тут). После включения Gemini будет запускать все shell-команды внутри контейнера - ваша файловая система и системные настройки останутся нетронутыми. Это особенно полезно, если вы даёте агенту широкие задачи или используете режим --yolo, который описан ниже.
Расширяем возможности с MCP
MCP позволяют расширить возможности Gemini. Gemini CLI поставляется с несколькими MCP-серверами по умолчанию (например, дающими доступ к Google Search, песочницам для выполнения кода и т.п.), также можно добавить свои.
Например, через Figma MCP можно подключить агента к вашему проекту, чтобы он мог получать данные напрямую из макетов. Чтобы добавить MCP сервер необходимо открыть settings.json и добавить туда:
"mcpServers": {
"myserver": {
"command": "python3",
"args": ["-m", "my_mcp_server", "--port", "8080"],
"cwd": "./mcp_tools/python",
"timeout": 15000
}
}
или через команду:
gemini mcp add myserver --command "python3 my_mcp_server.py" --port 8080
Инструменты сервера становятся доступны в Gemini CLI сразу после его запуска. Полезные команды:
# Проверить все настроенные MCP-серверы (внутри сессии Gemini CLI)
/mcp
# Посмотреть список серверов и их инструменты
gemini mcp list
# Удалить сервер
gemini mcp remove <name>
После изменения конфигурации нужно перезапустить Gemini CLI, чтобы новые настройки вступили в силу. Главные площадки для поиска готовых серверов:
- mcpservers.org – агрегатор с поиском по категориям и тегам
- mcp.so – крупнейшая коллекция, включает серверы из awesome-mcp-servers
- glama.ai/mcp/servers – актуальный реестр, обновляется ежедневно
- pulsemcp.com – популярный агрегатор с рейтингами
- mcpserverhub.net – есть русский интерфейс
Читаем Google Docs и многое другое
Допустим, нам нужно передать агенту данные из документа. Вместо того чтобы копировать текст вручную, мы можем просто отправить ссылку. Если Workspace MCP-сервер уже настроен, Gemini CLI самостоятельно получит и прочитает файл. Например:
Резюмируй требования из этого дизайн-документа: https://docs.google.com/document/d/<id>
Также мы можем читать файлы из нашего Google Drive. Есть два основных варианта:
felores/gdrive-mcp-server
- open-source, read-only доступ, автоматически конвертирует Google Docs → Markdown, Sheets → CSV, Presentations → Text
sonickarnati/gemini-mcp-google-tools
- комплексный сервер: Drive + Gmail + Google Calendar + Scholar
Для простого чтения файлов рекомендуется gdrive-mcp-server - он легче и сфокусирован именно на Google Drive.
@ - передаем файлы и изображения
Чтобы не описывать содержимое файла или изображения словами, можно указать его напрямую нашему агенту с помощью символа @.
Объясни мне что происходит в этом коде: @./src/main.js
Несколько замечаний о том, как эффективно использовать @:
- Ограничения по размеру файлов – обладает огромным контекстом (до 1 млн токенов), поэтому можно включать довольно крупные файлы или много файлов одновременно. Но очень большие файлы могут быть усечены.
- Автоматическое игнорирование: По умолчанию Gemini CLI учитывает
.gitignoreи.geminiignoreпри сборе содержимого директорий. - Можно указывать несколько ссылок сразу:
Сравни @./foo.py и @./bar.py и скажи мне в чем разница.
Используйте Gemini CLI для настройки системы
Если у вас возникают проблемы с ОС вы можете открыть терминал и попросить Gemini устранить проблему.
Примеры:
- найти и исправить проблему в
.bashrc; - попросить поправить
PATHесли команда не запускается; - диагностика ошибок в системе;
- настройка рабочей станции – попросить установить программы и настроить их например
docker,gitи пр
Но будьте аккуратны, нужно смотреть, что делает Gemini. Если он просит вас подтвердить какую-то команду, но вы не знаете, что она делает – попросите объяснить вам эту команду и что она делает.
Отключаем подтверждение запросов
В Gemini есть режим который позволяет выполнять действия без вашего участия – YOLO (You Only Live Once) - включается флагом --yolo.
gemini --yolo
Важно помнить, что Gemini может выполнить абсолютно любую команду – в том числе опасную вроде rm -rf / - не спрашивая вас.
Запускаем Gemini в фоне
Headless-режим позволяет запускть Gemini CLI в фоновом режиме чтобы использовать возможности нейросети в автоматизированных задачах, скриптах и CI/CD-пайплайнах без участия человека.
Вот пример – автоматическая генерация Commit Message. Вместо того чтобы придумывать описание коммита, можно попросить Gemini прочитать ваши проиндексированные изменения и написать сообщение за вас.
git diff --staged | gemini -p "Напиши лаконичный commit message на английском языке в формате Conventional Commits для этих изменений."
или еще вот – ревью кода перед отправкой:
cat server.js | gemini -p "Сделай ревью этого Node.js кода. Укажи на потенциальные уязвимости, проблемы с производительностью и предложи рефакторинг."
Сохраняем и возобновляем чат сессии
Gemini CLI позволяет сохранять чаты и возвращаться к ним позже. Основные команды управления сессиями:
-
/chat save <имя_сессии>– cохранить текущую сессию. Сохраняет всю текущую историю переписки (контекст) под заданным тегом/именем. Если такое имя уже существует, оно будет перезаписано. Пример:/chat save fix-docker-bug -
/chat list– Посмотреть список сохраненных сессий. Выводит список всех ранее сохраненных чатов (чекпоинтов), которые доступны для загрузки. -
/chat resume <имя_сессии>– Возобновить сессию. Загружает выбранную историю сообщений в ваш текущий контекст. Вы сможете продолжить диалог с того же места. Пример:/chat resume fix-docker-bug -
/chat delete <имя_сессии>– Удалить сессию. Удаляет сохраненный чекпоинт, чтобы он не занимал место и не засорял список. Пример:/chat delete fix-docker-bug
Несколько директорий
Если ваш проект состоит из нескольких папок, например frontend и backend, вы можете запустить Gemini так, чтобы он получил доступ не к одной папке, а к двум. Есть два варианта:
- Флаг
--include-directoriesпри запуске
gemini --include-directories "../backend:../frontend"
- Постоянная настройка в проекте в settings.json -
includeDirectories
Когда включён режим нескольких директорий, Gemini учитывает файлы во всех подключённых локациях. Команда /directory show отображает, какие директории используются в рабочем пространстве.
Также можно добавлять директории во время сессии с помощью команды /directory add <path>.
Сжимаем переписку
Если вы долго общаетесь с Gemini, то можете упереться в предел длины контекста. Помните, что у языковых моделей есть фиксированное окно контекста – если выйти за его пределы, модель забывает ранние сообщения. Используйте /compress, чтобы кратко пересказать переписку и заменить всю историю компактным резюме.
Мультимодальность
Помните, что Gemini работает не только с текстом – он также может работать с изображениями, диаграммами и PDF-файлами. Чтобы обратиться к файлу, в промпте можно использовать символ @.
Что изображено на этой картинке @./picture.png
Также мы можем передать результат её работы как изображение и указать на ошибки, которые она допустила, – что очень удобно.
Используйте чекпоинты и /restore как кнопку “Отменить”
Иногда Gemini может вносить изменения в файлах, которые вас не устраивают, – в таком случае вы можете откатиться к предыдущему состоянию. Чекпоинты можно включить в настройках или при запуске Gemini.
gemini --checkpointing
или в настройках "checkpointing": { "enabled": true } в settings.json.
И использовать команду /restore – возврощает рабочую директорию к сохраненному чекпоинту.
Еще полезные команды:
-
/restore list(или просто /restore без аргументов), чтобы увидеть список недавних чекпоинтов с отметками времени и описаниями. -
/restore <id>, чтобы откатиться к конкретному чекпоинту. Если id не указан и есть только один доступный чекпоинт, он будет восстановлен по умолчанию.
Память
Команды /memory позволяют сохранять важную информацию в долговременную память ИИ (в файл GEMINI.md), чтобы он учитывал её в текущих и будущих сессиях. Функция памяти работает как растущая база знаний. Она компенсирует "забывчивость" модели в длинных диалогах и избавляет вас от необходимости повторять одни и те же вводные данные.
Основные команды:
/memory add "<текст>"- сохранить факт, настройку или договоренность./memory show- вывести всё содержимое памяти./memory refresh- обновить контекст, если вы редактировали файл GEMINI.md вручную.
Для чего это полезно:
- Технические данные: быстрое сохранение портов, токенов и критичных настроек конфигурации.
- Журнал решений: фиксация стиля кода или выбранных библиотек, чтобы ИИ не противоречил принятым правилам.
- Глобальные настройки: сохранение личных предпочтений общения (например, вашего имени и тона) в глобальный файл ~/.gemini/GEMINI.md, который работает для всех проектов.
Реальный воркфлоу
Допустим, нам нужно с нуля написать небольшой REST API на NestJS – простой сервис задач (To-Do) с Prisma и SQLite. Пройдём весь путь: от запуска Gemini CLI и настройки контекста до отката изменений и автоматической генерации commit message.
Шаг 1. Готовим проект
Создадим NestJS-приложение через официальный CLI и сразу подключаем Prisma:
npx @nestjs/cli new todo-api --package-manager npm --skip-git=false
cd todo-api
npm install prisma @prisma/client class-validator class-transformer
npx prisma init --datasource-provider sqlite
Шаг 2. Конфигурируем Gemini для проекта
Заранее положим конфиги, чтобы при первом запуске сразу работали песочница и чекпоинты. .gemini/settings.json:
{
"theme": "GitHub",
"sandbox": "docker",
"checkpointing": { "enabled": true },
"fileFiltering": { "respectGitIgnore": true },
"chatCompression": { "contextPercentageThreshold": 0.7 }
}
Создаем .geminiignore – отрезаем от агента то, что ему трогать не нужно:
node_modules/
dist/
coverage/
*.log
.env
*.db
prisma/migrations/
Кастомная команда для генерации тестов – .gemini/commands/test/gen.toml:
description = "Генерирует Jest-тест по описанию требования."
prompt = """
Ты — опытный QA-инженер. Напиши Jest-тест по требованию ниже.
Для unit-тестов используй @nestjs/testing (Test.createTestingModule) и моки PrismaService.
Для e2e — supertest поверх INestApplication.
Покрой happy path и хотя бы один негативный сценарий.
Требование: {{args}}
"""
Шаг 3. Первый запуск и GEMINI.md
Запускаем агента, в консоли вводим:
gemini
Внутри сессии вызываем /init – Gemini осмотрит папку и сгенерирует базовый GEMINI.md. Дополним его правилами проекта, чтобы агент сразу понимал стиль:
# Todo API
Небольшой REST API на NestJS + Prisma + SQLite.
## Соглашения
- TypeScript strict mode, никаких `any`.
- Все эндпоинты префиксуем `/api/v1`.
- ID задач — `cuid` через Prisma, не autoincrement.
- Даты — UTC, ISO 8601.
- Валидация — `class-validator` + `ValidationPipe` глобально (`whitelist: true`, `forbidNonWhitelisted: true`).
- Бизнес-логика — в сервисах, контроллер только разруливает HTTP.
- Тесты — Jest, юнит-тесты рядом с файлом (`*.spec.ts`), e2e — в `/test`.
- Коммиты — Conventional Commits.
## Структура
- `/src` — модули, контроллеры, сервисы
- `/prisma` — `schema.prisma` и миграции
- `/test` — e2e-тесты
Проверяем:
/memory show
Шаг 4. Разработка скелета
Даём Gemini первое крупное задание со ссылкой на контекст через @:
Сгенерируй ресурс tasks через `nest g resource tasks --no-spec` и реализуй CRUD
по правилам из @./GEMINI.md.
В @./prisma/schema.prisma добавь модель Task:
id (String, cuid), title (String), description (String?), done (Boolean, @default(false)),
createdAt (DateTime, @default(now())).
Создай PrismaModule + PrismaService, подключи в TasksModule.
DTO — с class-validator. Контроллер — под /api/v1/tasks.
Не забудь миграцию: `npx prisma migrate dev --name init`.
Gemini покажет план, дифы и попросит подтверждение на каждый файл. Внутри Docker-песочницы он же выполнит установку зависимостей и миграцию. Запускаем сервер прямо из CLI командой:
!npm run start:dev
Если что-то падает – просим исправить, не выходя из сессии:
Сервер ругается на DI при старте — посмотри логи и поправь.
Шаг 5. Тесты через кастомную команду
Используем заранее подготовленную команду:
/test:gen "POST /api/v1/tasks создаёт задачу и возвращает 201 с cuid в теле"
/test:gen "GET /api/v1/tasks/:id для несуществующего id возвращает 404"
/test:gen "PATCH /api/v1/tasks/:id с done=true меняет статус и возвращает обновлённую задачу"
Запускаем оба слоя:
!npm run test
!npm run test:e2e
Шаг 6. Сохраняем важное в память
Чтобы в будущих сессиях агент не задавал одни и те же вопросы, фиксируем ключевые решения:
/memory add "ORM — только Prisma, TypeORM не используем."
/memory add "Ошибки отдаём в формате RFC 7807 через кастомный exception filter."
/memory add "Логирование — pino через nestjs-pino, console.log запрещён."
Эти записи попадут в ~/.gemini/GEMINI.md или в локальный GEMINI.md и подтянутся автоматически при следующем запуске.
Шаг 7. Сохраняем чат-сессию
Закончили большой кусок работы – фиксируем переписку, чтобы можно было вернуться:
/chat save todo-api-mvp
Шаг 8. Эксперимент и откат через /restore
Решили проверить гипотезу, что на Fastify будет быстрее и красивее, чем на дефолтном Express. Просим:
Переведи приложение с Express на Fastify-адаптер NestJS.
Обнови main.ts, типы Request/Response, middleware и e2e-тесты.
Агент массово правит файлы – но e2e-тесты падают из-за разницы в supertest, сторонняя либа не поддерживает Fastify, профит сомнительный. Откатываемся:
/restore list
/restore <id_до_эксперимента>
Рабочая директория возвращается к состоянию до изменений – без git reset --hard и ручного восстановления файлов. Это и есть та самая «кнопка Отменить».
Шаг 9. Коммит через headless-режим
Изменения, которые остались, нас устраивают. Коммит делаем, но текст пусть пишет Gemini:
git add .
git diff --staged | gemini -p "Напиши лаконичный commit message в формате Conventional Commits на английском. Только сообщение, без пояснений и markdown."
Удобно завернуть в git alias или pre-commit hook – больше никогда не придётся придумывать chore: stuff.
Шаг 10. Сжимаем контекст и продолжаем
Сессия разрослась, лимит токенов поджимает. Ужимаем историю:
/compress
Gemini заменит длинную переписку компактным резюме, и можно работать дальше - например, попросить добавить JWT-аутентификацию через @nestjs/passport или прикрутить Swagger через @nestjs/swagger.
Шаг 11. На следующий день - возврат к работе
Открываем терминал, идём в проект, запускаем:
gemini
Внутри:
/chat list
/chat resume todo-api-mvp
Контекст загружен, GEMINI.md подтянулся, память на месте, кастомные команды доступны – можно сразу продолжать с того же места, где закончили.
Мы разобрали основы Gemini CLI: установку, первые команды и ключевые возможности инструмента. Главный вывод - это мощный способ работать с моделями Google прямо из терминала, не переключаясь в браузер и не прерывая рабочий процесс.
В следующей статье разберём субагентов – один из самых интересных механизмов Gemini CLI, который позволяет делегировать задачи и строить сложные автоматизированные цепочки.
Устанавливаем и экспериментируем перед следующей частью!