Перейти к содержимому
davidka.net > 💻 🧠 Код 1001 > Gemini CLI > Сценарий для Gemini CLI: Игра «Жизнь» Конвея.

Сценарий для Gemini CLI: Игра «Жизнь» Конвея.

  • автор:

Шаг 1: Создание системной инструкции GEMINI.md

Создайте директорию .gemini в рабочей папке проекта. Внутри .gemini создайте файл GEMINI.md и впишите в него системную инструкцию. Хранение GEMINI.md в .gemini является стандартной практикой для модели. Пример инструкции:

## 📘 Инструкция для генерации Python-кода

### 1. Общие правила

* Используй **Python 3.10+**.
* Соблюдай **четкий, читаемый и однозначный стиль** кодирования.
* **Каждая функция, метод и класс** должны иметь:

  * Аннотацию типов (`type hints`)
  * Полную и корректную документацию в формате `docstring` (см. раздел 3)
  * Внутренние комментарии (`#`), где необходимо

---

### 2. Комментарии

* Комментарии должны быть **точными** и описывать **что делает код**, а не «что мы делаем».
* **Запрещено** использовать местоимения: `делаем`, `возвращаем`, `отправляем`, `переходим` и т.п.
* **Разрешены** только термины: `извлечение`, `выполнение`, `вызов`, `замена`, `проверка`, `отправка`, `Функция выполняет`, `Функция изменяет значение` и т.д.

#### ❌ Пример неправильного комментария:

```python
# Получаем значение параметра
```

#### ✅ Пример правильного комментария:

```python
# Функция извлекает значение параметра
```

---

### 3. Docstring (формат документации)

Каждая функция/метод/класс должна содержать `docstring` в следующем формате:

```python
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` и т.д.
* Примеры корректных аннотаций:

#### ✅ Простые типы:

```python
name: str = "John"
count: int = 42
flag: bool = True
```

#### ✅ Коллекции и сложные типы:

```python
from typing import Any, Optional, Callable, TypeAlias

coordinates: tuple[float, float] = (55.75, 37.61)
metadata: dict[str, Any] = {"debug": True}
UserId: TypeAlias = int
```

#### ✅ Функции и методы:

```python
def get_user_name(user_id: int) -> str:
    """Возвращает имя пользователя по его идентификатору."""
    ...
```

#### ✅ Асинхронные функции:

```python
async def fetch_users() -> AsyncIterator[dict[str, int | str]]:
    ...
```

#### ✅ Обобщённые типы:

```python
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`.

---
📌 <strong>Подсказка:</strong> При генерации кода всегда включай аннотацию типов, <code>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` создай файл test_life.py, используя контекст из файла @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/GEMINI.md.

  1. Даем разрешение на создание файла.
  2. Gemini CLI сгенерирует файл life.py в директории game.
  3. Создаём виртуальную среду venv, устанавливаем зависимости и запускаем игру.

Шаг 3: Создание тестов

  1. Gemini CLI генерирует файл test_life.py в директории game.
  2. Тестируем простые сценарии, например, осциллятор «Блинкер».
  3. Исправляем ошибки при необходимости.

Шаг 4: Создание документации

  1. Gemini CLI анализирует life.py и test_life.py.
  2. Генерирует файл doc.md с описанием проекта, инструкциями по запуску игры и тестов.

Вуаля! Проект готов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *