Первая часть:
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 = 42flag: bool = True✅ Коллекции и сложные типы:from typing import Any, Optional, Callable, TypeAliascoordinates: 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, GenericT = TypeVar("T")class Container(Generic[T]):def __init__(self, value: T) -> None:self.value = valuedef get(self) -> T:return self.value5. ПрочееИспользуй 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 — инструкции для создания документации.
life-create-code.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 или другую библиотеку для графики, если это возможно.
life-create-test.md:
Внутри директории `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-create-doc.md:
Проанализируй файлы @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, установи необходимые зависимости и запусти испонение кода игры
Даем необходимые разрешения на запуск скриптов
pip
и наконец gemini-cli запускает игру:
Шаг 3: Создание тестов
Даем разрешение на запуск pytest
Ошибка
gemini-cli пытается решить проблему
Последний шаг — создание документации
Вуаля! Документация создана:
Проект на github
Статья на github
Полезно? Подпишись.
Понравилось — ставь «+»
Удачи! 🚀
#Python, #Программирование, #IT, #нструкция, #Искусственный интеллект, #GeminiCli, #Gemini, #Команданая строка