In Questo Articolo
Шаг 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.
- Даем разрешение на создание файла.
- Gemini CLI сгенерирует файл
life.pyв директорииgame. - Создаём виртуальную среду venv, устанавливаем зависимости и запускаем игру.
Шаг 3: Создание тестов
- Gemini CLI генерирует файл
test_life.pyв директорииgame. - Тестируем простые сценарии, например, осциллятор «Блинкер».
- Исправляем ошибки при необходимости.
Шаг 4: Создание документации
- Gemini CLI анализирует
life.pyиtest_life.py. - Генерирует файл
doc.mdс описанием проекта, инструкциями по запуску игры и тестов.
Вуаля! Проект готов.