Gemini-cli. Часть 3. Интеграция с vs code
Первая часть:
Gemini CLI: Знакомство и первые шаги
Вторая часть:
Gemini CLI: Продвинутые техники и автоматизация сценариев (Часть 2)
В этой части мы попросим gemini-cli написать код игры life, создать тесты и документацию.
Шаг 1: Создание системной инструкции `GEMINI.MD
В рабочей директории создайте файл GEMINI.md и вставьте в него системную инструкцию. Пример инструкции:
## 📘 Инструкция для генерации Python-кода
### 1. Общие правила
* Используй **Python 3.10+**.
* Соблюдай **четкий, читаемый и однозначный стиль** кодирования.
* **Каждая функция, метод и класс** должны иметь:
* Аннотацию типов (`type hints`)
* Полную и корректную документацию в формате `docstring` (см. раздел 3)
* Внутренние комментарии (`#`), где необходимо
---
### 2. Комментарии
* Комментарии должны быть **точными** и описывать **что делает код**, а не «что мы делаем».
* **Запрещено** использовать местоимения: `делаем`, `возвращаем`, `отправляем`, `переходим` и т.п.
* **Разрешены** только термины: `извлечение`, `выполнение`, `вызов`, `замена`, `проверка`, `отправка`, `Функция выполняет`, `Функция изменяет значение` и т.д.
#### ❌ Пример неправильного комментария:
```python
# Получаем значение параметра
✅ Пример правильного комментария:
# Функция извлекает значение параметра
3. Docstring (формат документации)
Каждая функция/метод/класс должна содержать docstring в следующем формате:
def function(param: str, param1: Optional[str | dict | str] = None) -> dict | None:
"""
Args:
param (str): Описание параметра `param`.
param1 (Optional[str | dict | str], optional): Описание параметра `param1`. По умолчанию `None`.
Returns:
dict | None: Описание возвращаемого значения. Возвращает словарь или `None`.
Raises:
SomeError: Описание ситуации, в которой возникает исключение `SomeError`.
Example:
>>> function('param', 'param1')
{'param': 'param1'}
"""
Все параметры и возвращаемые значения должны быть описаны.
Формулировки должны быть лаконичными, точными и однозначными.
Не допускается пропуск описания параметров/возвращаемых значений/исключений.
4. Аннотация типов
Все переменные, параметры и возвращаемые значения должны быть аннотированы.
Используй синтаксис Python 3.10+: list[int], dict[str, Any], str | None и т.д.
Примеры корректных аннотаций:
✅ Простые типы:
name: str = "John"
count: int = 42
flag: bool = True
✅ Коллекции и сложные типы:
from typing import Any, Optional, Callable, TypeAlias
coordinates: tuple[float, float] = (55.75, 37.61)
metadata: dict[str, Any] = {"debug": True}
UserId: TypeAlias = int
✅ Функции и методы:
def get_user_name(user_id: int) -> str:
"""Возвращает имя пользователя по его идентификатору."""
...
✅ Асинхронные функции:
async def fetch_users() -> AsyncIterator[dict[str, int | str]]:
...
✅ Обобщённые типы:
from typing import TypeVar, Generic
T = TypeVar("T")
class Container(Generic[T]):
def __init__(self, value: T) -> None:
self.value = value
def get(self) -> T:
return self.value
5. Прочее
Используй default_factory в dataclass для изменяемых значений (list, dict).
Для Optional значений указывай T | None (Python 3.10+) или Optional[T].
Для сложных структур — используй TypeAlias.
📌 Подсказка: При генерации кода всегда включай аннотацию типов, docstring, и избегай субъективных формулировок в комментариях. Цель — максимально точная, воспроизводимая и формализованная структура кода.
Для удобства создадим директорию `game`, в которой будут храниться файлы проекта, и директорию `scenarios`, где будут храниться сценарии для Gemini CLI.
файл scenarios/life-create-code.md будет содержать инструкции для создания кода игры "Жизнь",
файл scenarios/life-create-test.md — инструкции для создания тестов,
а файл scenarios/life-create-doc.md — инструкции для создания документации.
Внутри директории `game` Создай файл life.py.Внутри напиши реализацию "Игры Жизнь" Конвея на Python, используя объектно-ориентированный подход.
используй библиотеки: `numpy`, `pygame` (для графики).
Требования:
1. Создай класс `Game`.
2. В `__init__` класс должен принимать размеры сетки (ширину, высоту) и создавать случайное начальное поле.
3. Создай метод `step()`, который обновляет состояние игры на один шаг в соответствии с правилами:
- Живая клетка с < 2 живыми соседями умирает (одиночество).
- Живая клетка с 2 или 3 живыми соседями выживает.
- Живая клетка с > 3 живыми соседями умирает (перенаселение).
- Мёртвая клетка с ровно 3 живыми соседями становится живой (рождение).
4. Создай метод `display()` или переопредели `__str__`, чтобы выводить поле в консоль. Используй символы, например '■' для живой клетки и ' ' для мертвой.
5. Используй библиотеку `numpy` для эффективной работы с сеткой.
6. В блоке `if __name__ == '__main__':` добавь пример, который создает игру, и в цикле запускает симуляцию с небольшой задержкой между шагами.
7. Для визуализации игры используй pygame или другую библиотеку для графики, если это возможно.
Внутри директории `game` используя контекст из файла @life.py, создай файл с тестами test_life.py. Используй фреймворк pytest. Тест должен проверять правильность эволюции простого осциллятора "Блинкер" (три клетки в ряд).
Сценарий теста:
1. Импортируй класс `Game` из `life`.
2. Создай функцию теста, например `test_blinker_oscillation`.
3. Внутри теста создай экземпляр `Game` с фиксированным размером (например, 5x5).
4. Вручную установи начальное состояние поля так, чтобы в центре была горизонтальная линия из трех живых клеток (Блинкер).
5. Вызови метод `game.step()`.
6. С помощью `assert` и `numpy.array_equal` проверь, что поле изменилось на вертикальную линию из трех клеток.
7. Вызови метод `game.step()` еще раз.
8. Проверь, что поле вернулось в исходное горизонтальное состояние.
Проанализируй файлы @life.py и @test_life.py внутри директории `game` и на их основе создай файл документации doc.md. Структура документации должна быть следующей: - **Заголовок:**
# Проект "Игра Жизнь" -
**Краткое описание:** Объяснение, что это за проект (реализация клеточного автомата Конвея). -
**Структура файлов:** Краткое описание назначения файлов `life.py` и `test_life.py`. - **Как запустить симуляцию:** Раздел с командой для запуска основного файла (`python life.py`). -
**Как запустить тесты:** Раздел с командой для запуска тестов (`pip install pytest numpy`, а затем `pytest`).
Структура директорий будет выглядеть следующим образом:
Шаг 2: Создание кода игры "Жизнь"
Запускаем gemini-cli в терминале:
Важно! Убедитесь, что вы находитесь в директории, где находится файл GEMINI.md.
GEMINI.md обнаружен
После этого gemini-cli сгенерирует файл life.py в директории game:
Продолжаем:
Создай виртуальную среду venv, установи необходимые зависимости и запусти испонение кода игры
и наконец gemini-cli запускает игру:
Шаг 3: Создание тестов
Ошибка
gemini-cli пытается решить проблему
Последний шаг — создание документации
Вуаля! Документация создана:
Проект на github
Полезно? Подпишись.
Понравилось — ставь «+»
Удачи! 🚀

















Лига программистов
2.2K пост11.9K подписчиков
Правила сообщества
- Будьте взаимовежливы, аргументируйте критику
- Приветствуются любые посты по тематике программирования
- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества