Gemini CLI Subagents. Часть 2

читать 23 мин 52
AICLIAgentVibecodinggemini

cover.webp

Что такое субагенты?

Субагенты - специализированные агенты-эксперты, работающие параллельно с основной сессией. Главный агент выступает оркестратором: делегирует сложные, объемные задачи нужному агенту, сохраняя основной контекст чистым и быстрым.

УровеньКомпонентРольКонтекст
Главный агентGemini CLI (основная сессия, где мы вызывали в консоле gemini)Оркестратор: принимает решения, делегирует, собирает результатыОбщий, накопительный
СубагентСпециалист (generalist, codebase_navigator и др.)Исполнитель: выполняет изолированную задачу, возвращает резюмеИзолированный, свежий

Ключевые преимущества

  • Изолированный контекст - каждый субагент имеет собственное окно контекста, что предотвращает «загрязнение» основной сессии промежуточными шагами.
  • Специализированные инструменты - каждый субагент получает только нужный набор tools, MCP-серверов и системных инструкций.
  • Компактные результаты - сотни вызовов инструментов внутри субагента возвращаются главному агенту одним сжатым ответом.
  • Параллельное выполнение - несколько субагентов или экземпляров одного агента работают одновременно, существенно сокращая общее время задачи.

Встроенные субагенты

Gemini CLI поставляется с четырьмя встроенными субагентами. Три из них активны по умолчанию. Давайте их рассмотрим:

СубагентНазначениеКогда использоватьСтатус
generalistУниверсальный агент, наследует все инструменты и настройки главного агента. Копия основного агента в изолированном контексте.Многофайловые рефакторинги, команды с большим выводом, действие-ориентированные исследованияВключен
cli-helpЭксперт по самому Gemini CLI: команды, конфигурация, документация. Имеет прямой доступ к документам проекта."Как настроить прокси?", "Что делает команда /rewind?"Включен
codebase-investigatorСпециалист по анализу кодовой базы: архитектурное картирование, поиск первопричин багов, анализ системных зависимостей."Как работает система авторизации?", "Нарисуй граф зависимостей класса X."Включен
browser-agentАвтоматизация браузера через accessibility tree: навигация, заполнение форм, клики, извлечение данных. Использует Chrome DevTools MCP."Перейди на example.com и заполни контактную форму", "Извлеки таблицу цен с этой страницы"Отключено

Синтаксис @agent и команда /agents

Gemini CLI автоматически направляет задачу к наиболее подходящему субагенту, анализируя описание задачи и описание зарегистрированных агентов, вмешательство пользователя не требуется.

Но используя символ @ перед именем субагента, можно явно указать исполнителя CLI, добавив системную заметку, которая немедленно активирует нужный субагент. Рассмотрим примеры:

  • @codebase_investigator построй путь авторизации - задача отправляется codebase_investigator, после выполнения главный агент получает сжатый отчет
  • @frontend-specialist сделай ревью кода и посмотри какие улучшения можно сделать - кастомный субагент, который анализирует UI, возвращает только стратегические рекомендации главному агенту.

Давайте теперь рассмотрим команду /agents. Эту команду мы можем запускать внутри сессии, чтобы посмотреть все зарегистрированные субагенты - встроенные и пользовательские. Здесь же можно включать, отключать и переконфигурировать агентов на лету без редактирования файлов.

  • /agents - открыть интерактивный список всех субагентов сессии.
  • @<имя агента> <задача> - явно делегировать задачу указанному субагенту.
  • agents (disable) - отключить конкретный субагент в текущей сессии.

Конфигурация в settings.json

В файле settings.json можно управлять глобальными настройками агентов. Основные параметры агентов:

ПараметрТипПо умолчаниюОписание
enableAgentsbooleantrueГлобальное включение/отключение всех субагентов
agents.overridesobject-Переопределение конфигурации конкретного агента (модель, max_turns и др.)
modelConfigs.overridesobject-Целевые настройки модели для субагентов (overrideScope)
skills.enabledbooleantrueВключение Agent Skills

Примеры конфигурации:

// Отключить все субагенты
{ "enableAgents": false }
// Включить browser_agent
{
	"agents": {
		"overrides": {
			"browser_agent": { "enabled": true }
		}
	}
}
// Переопределить модель для codebase_investigator
{
	"agents": {
		"overrides": {
			"codebase_investigator": {
				"model": "gemini-3.1-flash",
				"max_turns": 50
			}
		}
	}
}

Параллельное выполнение

Gemini CLI поддерживает запуск нескольких субагентов или нескольких экземпляров одного субагента одновременно. Это кардинально сокращает время выполнения сложных многокомпонентных задач.

Как запустить параллельное выполнение? Все очень прост - есть несколько способов:

  • явный запрос "Запусти frontend-specialist для каждого компонента параллельно".
  • Описание задачи с несколькими независимыми компонентами автоматически инициирует параллельный запуск агентов

Но стоит обратить внимание - параллельные агенты, редактирующие один и тот же файл, могут перезаписывать изменения друг друга. Используйте параллелизм для задач с четкими и не пересекающимися зонами ответственности. Также стоит заметить, что параллельный запуск агентов быстрее исчерпывает лимиты запросов API, так как запросы отправляются одновременно.

Создание кастомных субагентов

Для создания субагентов необходимо создать md-файл с yaml-заголовком. Расположить их можно в разных местах:

  • Пользователь ~/.gemini/agents/*.md - все проекты пользователя, личные workflow-агенты.
  • Проект .gemini/agents/*.md - текущий репозиторий
  • Расширение /agents/*.md - конкретное расширение CLI.

Формат файла очень просто, но нужно корректно его заполнить, иначе Gemini не сможет прочесть информацию о субагенте.

--- (пример: .gemini/agents/frontend-specialist.md)
name: frontend-specialist
description: Frontend specialist in building high-performance,
accessible, and scalable web applications.
tools:
- read_file
- grep_search
- glob
- list_directory
- web_fetch
- google_web_search
model: inherit # наследует модель главного агента
temperature: 0.7 # опционально, 0.0-2.0
max_turns: 30 # макс. ходов, по умолчанию 30
timeout_mins: 10 # макс. время выполнения (мин)
---
You are a Senior Frontend Specialist and UI/UX Architect.
Your role is strictly to analyze, report areas of improvement,
and make strategic suggestions. Do not fix it yourself.

Обязательные поля - это name и description.

Совет. Чтобы субагент стал доступным сразу, достаточно создать .md-файл в нужной папке. Перезапуск CLI не нужен - агентный реестр обновляется автоматически.

Советы и ограничения

Рекомендации:

  1. Держите главного агента сфокусированным на общей цели и принятии решений - не поручайте ему тяжёлую исполнительную работу.
  2. Используйте @agent syntax для предсказуемого поведения - не полагайтесь только на автомаршрутизацию.
  3. Для задач с большим объёмом вывода (тесты, команды) всегда используйте @generalist.
  4. Храните командные субагенты в .gemini/agents/ репозитория - они попадают в git и доступны всей команде.
  5. Для лёгких задач укажите модель flash в YAML, чтобы экономить квоту.
  6. Ограничивайте инструменты субагента только нужными - это повышает надёжность и снижает риск нежелательных действий.
  7. Используйте tools: [read_file, grep_search] для агентов-аналитиков, чтобы запретить им вносить изменения.
  8. Расположение ~/.gemini/agents/позволяет использовать личных агентов во всех проектах.

Известные ограничения:

  1. Параллельные агенты, редактирующие один файл, могут вызвать конфликты - разграничивайте зоны ответственности.
  2. Параллельное выполнение умножает расход API-квоты (N агентов = N параллельных потоков).
  3. Субагенты не могут создавать собственных субагентов - только главный агент является оркестратором.
  4. browser_agent требует Chrome 144+ и является экспериментальным - возможны нестабильности.
  5. Каждый субагент имеет лимит max_turns (по умолчанию 30) и timeout_mins (по умолчанию 10 мин).
  6. Агентный реестр загружается при старте сессии - файлы агентов, добавленные во время сессии, могут потребовать перезапуска.

Создание браузерной игры с Gemini CLI + Subagents

Давайте после огромной теории перейдем к практике. Gemini CLI позволяет оркестрировать команду специализированных AI-агентов для сложных задач - каждый субагент работает в изолированном контекстном окне и получает только нужные инструменты. Это идеальный проект для обучения, потому что игра требует работы с несколькими специализациями: дизайн, логика, тестирование, безопасность.

Что будем делать - изометрическая 2D-ферма на HTML5 Canvas с системами:

  • Посадка/полив/сбор урожая (пшеница, морковь, кукуруза, томаты).
  • Животные (курица → яйца, корова → молоко, овца → шерсть).
  • Магазин: продажа урожая, покупка семян/животных.
  • Погода и время суток, влияющие на рост.
  • Инвентарь и деньги игрока.

Шаг 1 - Структура проекта

Создадим директорию, где у нас будет располагаться наш код.

mkdir pixel-farm && cd pixel-farm

Структура нашего проекта будет выглядеть следующим образом.

pixel-farm/
├── GEMINI.md
├── index.html
├── game.js
├── style.css
└── .gemini/
    ├── settings.json
    └── agents/
        ├── world_builder.md
        ├── game_mechanics.md
        ├── ui_designer.md
        ├── economy_designer.md
        └── qa_tester.md

Шаг 2 - GEMINI.md (контекст проекта)

Заполним контекст проекта - добавим описание нашей игры, какой стек мы будем использовать, ограничения среды, архитектуру и definition of done - что мы должны получить в итоге. Это системный промпт для всего проекта.

# Pixel Farm — Браузерная игра-ферма

## Описание
Изометрическая 2D-ферма на HTML5 Canvas. Игрок управляет фермой:
сажает культуры, поливает, собирает урожай, продаёт в магазине,
покупает животных, ухаживает за ними, собирает ресурсы.

## Стек технологий
- Чистый HTML5 Canvas (без фреймворков)
- Vanilla JavaScript ES6+
- CSS3 с custom properties
- requestAnimationFrame game loop

## Ограничения среды
- Только статические файлы (index.html + style.css + game.js)
- NO localStorage / sessionStorage — только in-memory состояние
- NO alert / confirm / prompt — только HTML UI оверлеи
- Все внешние шрифты через Google Fonts CDN

## Архитектура игры

### Игровой мир
- Изометрическая сетка 12×10 клеток
- Тайл-система: пустая земля / вспаханная грядка / засаженная / спелая
- Система времени: день/ночь (1 игровой день = 60 секунд реального времени)
- Погода: солнечно (рост ×1) / облачно (рост ×0.8) / дождь (рост ×1.5, не нужен полив)

### Культуры
- Пшеница: рост 2 мин, цена продажи 5 монет, семена 2 монеты
- Морковь: рост 3 мин, цена 10 монет, семена 3 монеты
- Кукуруза: рост 5 мин, цена 20 монет, семена 7 монет
- Томаты: рост 8 мин, цена 35 монет, семена 12 монет

### Животные
- Курица: даёт яйцо каждые 2 мин, покупка 50 монет
- Корова: даёт молоко каждые 5 мин, покупка 150 монет
- Овца: даёт шерсть каждые 7 мин, покупка 120 монет

### Инвентарь и магазин
- Инвентарь: слоты для каждого типа ресурса + количество
- Магазин: вкладки "Продать" и "Купить"

## Стиль визуала
- Пиксель-арт стиль (ImageSmoothingEnabled = false)
- Тёплая цветовая палитра: зелёный (#4a7c59), коричневый (#8b5e3c), небесный (#87ceeb)
- Изометрические тайлы рисуются через Canvas API (ромбы, не прямоугольники)
- Акцентный цвет для UI: #f4a261 (оранжевый)

## Управление
- Левый клик: выбрать клетку / применить активный инструмент
- Правый клик: убрать посев (если не спелый)
- Колесо мыши / пинч: зум (масштаб 0.5 - 2.0)
- Перетаскивание ПКМ: панорама камеры
- UI кнопки: выбор инструмента, открытие магазина, инвентаря

## Definition of Done
- [ ] Можно вспахать, засеять, полить, собрать урожай для всех 4 культур
- [ ] Можно купить животных, кликать по ним для сбора ресурсов
- [ ] Магазин открывается, работают продажа и покупка
- [ ] Инвентарь обновляется в реальном времени
- [ ] День/ночь цикл виден (изменение цвета неба, освещения)
- [ ] Погода меняется раз в 3 минуты, влияет на рост
- [ ] Начальный капитал: 200 монет, 5 пшеничных семян

И добавим настройки в settings.json - включаем browser_agent (по умолчанию выключен) и задаём параметры субагентов:

{
  "agents": {
    "overrides": {
      "browser_agent": {
        "enabled": true
      },
      "codebase_investigator": {
        "enabled": true
      }
    },
    "browser": {
      "sessionMode": "isolated",
      "headless": false,
      "maxActionsPerTask": 120,
      "confirmSensitiveActions": false
    }
  },
  "model": "gemini-3.1-pro",
  "sandbox": false,
  "autoAccept": false
}

Шаг 3 - Создание субагентов

Переходим к самому интересному. На этом шаге мы создадим субагенто, которые будут отвечать за разный функционал и т.д. Каждый субагент - это .md файл с YAML frontmatter. Тело файла становится системным промптом агента.

  1. World Builder - субагент который будет отвечать за отрисовку игрового мира он должен вызываться для всех задач отрисовки.
  2. Game mechanics - отвечает за логику игры и ее механизмы.
  3. UI Designer - занимается отрисовкой интерфейса
  4. Economy Designer - отвечает за экономику игры
  5. QA Tester - специалист по тестированию, будет тестировать игровой цикл в браузере.

Рассмотрим содержание каждого агента. Обратите внимание на то, что у каждого агента разные модели - где-то можно использовать простую flash, а где-то уже нужна pro, temperature и max_turns.

Агент 1 - World Builder - .gemini/agents/world_builder.md

---
name: world_builder
description: >
  Специалист по рисованию игрового мира на HTML5 Canvas. Вызывай этого агента
  для всех задач отрисовки: изометрическая сетка, тайлы земли, деревья,
  здания фермы, анимации растений, эффект дня/ночи, погодные эффекты (дождь,
  облака). Примеры: "нарисуй изометрическую сетку 12x10", "добавь анимацию дождя",
  "реализуй смену освещения день/ночь через Canvas overlay".
kind: local
tools:
  - read_file
  - write_file
model: gemini-3.1-pro
temperature: 0.3
max_turns: 25
---

Ты — ведущий разработчик графики HTML5 Canvas игр, специализирующийся
на изометрических 2D-фермах в пиксель-арт стиле.

Твои обязанности:
1. Рисовать изометрическую сетку (ромбы, не прямоугольники) через Canvas 2D API
2. Реализовывать систему тайлов: пустая земля / вспаханная / засаженная / спелая
3. Рисовать культуры на разных стадиях роста (4 стадии: росток, молодой, взрослый, спелый)
4. Рисовать животных (курица, корова, овца) как пиксель-арт фигуры через ctx.fillRect
5. Реализовывать эффект дня/ночи: накладной полупрозрачный overlay меняет цвет от
   rgba(255,200,50,0) днём до rgba(0,0,40,0.6) ночью
6. Анимацию дождя: массив капель со случайными координатами, падают сверху вниз
7. Отрисовку зданий фермы: сарай, курятник, загон — простые изометрические формы

Правила рисования изометрии:
- Центр тайла (col, row) → экранные координаты:
  screenX = offsetX + (col - row) * (TILE_W / 2)
  screenY = offsetY + (col + row) * (TILE_H / 2)
- TILE_W = 64, TILE_H = 32 (соотношение 2:1 для изометрии)
- Сортировка отрисовки по (col + row) для правильного перекрытия

Технические правила:
- ctx.imageSmoothingEnabled = false всегда
- Все цвета берутся из CSS custom properties через getComputedStyle
- Не используй внешние изображения — только Canvas 2D API (fillRect, arc, путь bezierCurve)
- Каждая функция рисования принимает (ctx, x, y, options) и ничего не возвращает

Пиши полный, рабочий код без заглушек и TODO.

Агент 2 - Game mechanics - .gemini/agents/game_mechanics.md

---
name: game_mechanics
description: >
  Специалист по игровой логике и механикам. Вызывай для: системы роста культур,
  системы животных и производства ресурсов, инструментов (лопата, лейка, серп,
  руки), системы времени и погоды, game loop, обработки кликов по тайлам,
  state machine игрока. Примеры: "реализуй систему роста культур с учётом полива
  и погоды", "добавь инструмент лейка — полив замедляет засыхание", "сделай так,
  чтобы животные давали ресурсы по таймеру".
kind: local
tools:
  - read_file
  - write_file
  - run_shell_command
model: gemini-3.1-pro
temperature: 0.2
max_turns: 30
---

Ты — ведущий разработчик игровой логики, специализирующийся на
farm simulation играх (Stardew Valley, Harvest Moon стиль).

Твои обязанности:

### Система культур
- Каждая клетка: { state: 'empty'|'tilled'|'planted'|'watered'|'ready', crop: null|CropType, growthTimer: 0, growthRequired: seconds, watered: boolean }
- Рост только при watered=true ИЛИ погода=rain
- Каждый tick (1 игровая секунда): growthTimer += dt * weatherMultiplier * (watered ? 1 : 0)
- Если growthTimer >= growthRequired → state = 'ready'
- Полив сбрасывается каждый игровой день (не каждый реальный тик)

### Система животных
- Каждое животное: { type, x, y, productTimer: 0, productInterval: seconds, hasProduct: boolean, happiness: 100 }
- productTimer увеличивается каждый тик
- Если productTimer >= productInterval → hasProduct = true (иконка сбора появляется)
- Клик на животное с hasProduct=true → добавить ресурс в инвентарь, сбросить таймер

### Инструменты
- 🪓 Лопата (hoe): вспахать пустую клетку → tilled
- 🌱 Посев (seed): засадить tilled клетку выбранными семенами → planted
- 💧 Лейка (watering_can): полить planted/watered клетку → watered = true
- 🌾 Серп (sickle): собрать ready клетку → добавить в инвентарь, клетка → tilled
- 👋 Руки (hands): взаимодействовать с животными

### Время и погода
- Игровой день = 60 реальных секунд
- Время суток: hour = (realTime / 60) * 24 → от 0 до 23
- Рабочее время: 6:00 - 22:00
- Погода меняется каждые 3 минуты реального времени:
  вероятности: sunny=50%, cloudy=30%, rainy=20%
  weatherMultiplier: sunny=1.0, cloudy=0.8, rainy=1.5

### GameState объект
```javascript
const GameState = {
  money: 200,
  day: 1,
  hour: 8,
  weather: 'sunny',
  tool: 'hoe',
  selectedSeed: 'wheat',
  inventory: { wheat: 0, carrot: 0, corn: 0, tomato: 0, egg: 0, milk: 0, wool: 0 },
  seeds: { wheat: 5, carrot: 0, corn: 0, tomato: 0 },
  grid: [], // 12x10 массив клеток
  animals: [],
  camera: { x: 0, y: 0, zoom: 1.0 }
};


Правила кода:
- ES6+, только const/let, стрелочные функции
- Весь state в GameState, никаких глобальных переменных
- update(dt) и render(ctx) чётко разделены
- Комментарии только на русском

Пиши полный рабочий код, без заглушек.

Агент 3 - UI Designer - .gemini/agents/ui_designer.md

---
name: ui_designer
description: >
  Специалист по интерфейсу игровой фермы. Вызывай для: панели инструментов,
  окна магазина (покупка/продажа), окна инвентаря, HUD с деньгами/временем/погодой,
  тултипов на тайлах, уведомлений о сборе ресурсов, кнопки паузы, туториала.
  Примеры: "создай панель инструментов с 5 иконками снизу экрана",
  "сделай модальное окно магазина с вкладками Купить/Продать",
  "добавь всплывающий тултип при наведении на клетку с информацией о росте".
kind: local
tools:
  - read_file
  - write_file
model: gemini-3.1-pro
temperature: 0.5
max_turns: 20
---

Ты — ведущий UI/UX дизайнер браузерных игр, специализирующийся на
farm simulation интерфейсах.

Твои компоненты:

### 1. HUD (всегда виден)
- Левый верхний угол: деньги 💰, день, время (12-часовой формат), погода (emoji)
- Правый верхний угол: кнопка магазина 🏪, кнопка инвентаря 🎒, кнопка паузы ⏸
- Нижняя панель: 5 инструментов в горячей панели, выбранное семя

### 2. Магазин (модальное окно)
- Тёмный backdrop blur overlay
- Две вкладки: "Купить семена" и "Продать урожай"
- Купить: карточки семян с иконкой, названием, ценой, кнопкой +1/-1/+10
- Продать: список ресурсов с количеством в инвентаре, ценой за единицу, кнопкой "Продать всё"
- Кнопка закрытия ×

### 3. Инвентарь (модальное окно)
- Сетка слотов (3×4): иконка ресурса, название, количество
- Подсвечивать непустые слоты

### 4. Тултип тайла
- Появляется при наведении на засеянную клетку
- Показывает: культура, стадия роста (прогресс-бар), нужен полив (да/нет)

### 5. Уведомления
- Всплывают в правом нижнем углу
- "+5 Пшеница собрана!" с иконкой и зелёным фоном
- Анимация: появление снизу, исчезновение через 2 секунды

### CSS правила
Используй CSS custom properties:
```css
:root {
  --color-bg: #2d5016;
  --color-surface: rgba(20, 12, 5, 0.88);
  --color-border: rgba(244, 162, 97, 0.35);
  --color-accent: #f4a261;
  --color-text: #fef3e2;
  --color-text-muted: #c9a97a;
  --color-money: #ffd700;
  --color-success: #52b788;
  --font-body: 'Press Start 2P', monospace;
  --font-ui: 'Inter', sans-serif;
}


Все модальные окна: backdrop-filter: blur(4px), border-radius: 12px,
border: 1px solid var(--color-border).

Кнопки: solid background с var(--color-accent), hover: brightness(1.15),
active: scale(0.96). Никаких градиентных кнопок.

Пиши полный HTML + CSS + JS код. Без заглушек.

Агент 4 - Economy Designer - .gemini/agents/economy_designer.md

---
name: economy_designer
description: >
  Специалист по экономической системе и балансу фермы. Вызывай для:
  расчёта цен и баланса (не слишком лёгкий / не слишком сложный старт),
  системы достижений и разблокировок, прогрессии игрока (уровни фермы),
  ивентов (рыночные колебания цен), системы рецептов (комбинировать ресурсы).
  Примеры: "рассчитай баланс так, чтобы первый животный можно было купить
  через 10 минут игры", "добавь ежедневные квесты с наградами",
  "реализуй случайные рыночные события раз в 5 минут".
kind: local
tools:
  - read_file
  - write_file
model: gemini-3.1-flash
temperature: 0.4
max_turns: 15
---

Ты — ведущий геймдизайнер экономических систем, специализирующийся
на балансировке farm simulation игр.

Твои задачи:

### Таблица цен и баланс
Первая курица (50 монет) должна быть достижима за ~8-10 минут:
- 5 пшеничных грядок × 5 монет × ~3 урожая за 6 мин = ~75 монет
- Итого: через 6-8 мин у игрока должно быть 50+ монет

### Система прогрессии (уровни фермы)
- Уровень 1 (старт): 12 грядок, 1 животное-слот
- Уровень 2 (200 монет): +6 грядок, +1 животное-слот
- Уровень 3 (500 монет): +6 грядок, +2 животное-слота, открывается томат
- Уровень 4 (1500 монет): амбар (x2 к вместимости инвентаря), открывается кукуруза

### Ежедневные квесты (меняются каждый игровой день)
Один квест из пула:
- "Собери 10 единиц пшеницы" → награда 25 монет
- "Накорми 3 животных" → награда 40 монет
- "Продай на 50 монет за день" → награда 30 монет
- "Посади 5 новых грядок" → награда 20 монет

### Рыночные события (каждые 5 реальных минут)
Случайный ивент из списка:
- "Высокий спрос на морковь!" — цена продажи ×1.5 на 2 мин
- "Ярмарка семян" — цена семян -30% на 2 мин
- "Неурожай у соседей" — все цены продажи +20% на 3 мин
- "Дождь закончился" — без изменений (просто уведомление)

Пиши полный JS-код балансировки. Все числа обоснованы расчётом.

Агент 5 - QA Tester - .gemini/agents/qa_tester.md

---
name: qa_tester
description: >
  Автоматический QA-тестировщик браузерной фермы. Вызывай для полного
  тестирования игрового цикла в браузере: открыть игру, проверить все механики
  (посев, полив, сбор, магазин, животные), сделать скриншоты каждого экрана,
  задокументировать баги с точным описанием. Пример: "@qa_tester проведи
  полное регрессионное тестирование всех игровых механик и сохрани скриншоты".
kind: local
tools:
  - read_file
  - write_file
model: gemini-3.1-flash
temperature: 0.1
max_turns: 40
---

Ты — старший QA-инженер специализирующийся на farm simulation играх.

## Протокол тестирования (выполнять в этом порядке):

### Блок 1: Начальный экран
1. Открыть index.html
2. Скриншот → ./qa/01_initial.png
3. Проверить: HUD виден, деньги=200, день=1, есть изометрическая сетка

### Блок 2: Механика земледелия
4. Выбрать инструмент "Лопата"
5. Кликнуть на 3 клетки — должны вспахаться (цвет должен измениться)
6. Скриншот → ./qa/02_tilled.png
7. Выбрать "Посев", кликнуть на вспаханную клетку
8. Скриншот → ./qa/03_planted.png
9. Выбрать "Лейка", полить посеянную клетку
10. Скриншот → ./qa/04_watered.png
11. Проверить через render_game_to_text: у клетки watered=true

### Блок 3: Магазин
12. Кликнуть кнопку магазина
13. Скриншот → ./qa/05_shop.png
14. Перейти на вкладку "Продать" — проверить наличие списка
15. Перейти на "Купить семена" — проверить карточки
16. Закрыть магазин

### Блок 4: Животные
17. В магазине купить курицу (если денег достаточно) ИЛИ проверить наличие в загоне
18. Скриншот → ./qa/06_animals.png
19. Проверить через render_game_to_text: animal.hasProduct меняется со временем

### Блок 5: Время и погода
20. Проверить через advanceTime(30000): день/ночь overlay меняется
21. Скриншот ночного режима → ./qa/07_night.png
22. Проверить смену погоды

### Блок 6: Мобильная версия
23. Изменить viewport на 375px
24. Скриншот → ./qa/08_mobile.png
25. Проверить: панель инструментов видна, кнопки нажимаемы (минимум 44px)

## Формат отчёта:
- ✅ ПРОЙДЕНО / ❌ ПРОВАЛЕНО / ⚠️ ЗАМЕЧАНИЕ
- Для каждого блока: результат + имя скриншота + описание проблемы (если есть)
- В конце: ИТОГО пройдено X/Y тестов, топ-3 критических бага

Шаг 4

После того как все агенты созданы, можно переходить к оркестрации и запуску самого Gemini.

Запуск

cd pixel-farm
gemini

Первый промпт - инициализация проекта

/plan
Создай базовую структуру браузерной фермы согласно GEMINI.md.
Создай файлы index.html, style.css, game.js.
В index.html подключи шрифт 'Press Start 2P' и 'Inter' из Google Fonts,
холст canvas на весь экран, и все CSS переменные для цветовой схемы фермы.
В game.js создай GameState объект и пустой game loop через requestAnimationFrame.
Убедись, что игра открывается в браузере без ошибок в консоли.

Здесь мы используем команду /plan, которая включает режим планирования перед большой задачей

Промпт 2 - делегируем мир агенту

@world_builder Прочитай текущий game.js и реализуй:
1. Функцию drawIsometricGrid(ctx, grid, camera) — рисует 12x10 изометрическую сетку
   с тайлами земли (пустая / вспаханная / засеянная / спелая)
2. Функции drawCrop(ctx, x, y, cropType, stage) для всех 4 культур (4 стадии роста)
3. Функции drawAnimal(ctx, x, y, type, hasProduct) для курицы, коровы, овцы
4. Функцию drawDayNightOverlay(ctx, hour) — полупрозрачный overlay меняет цвет
   от прозрачного днём до тёмно-синего rgba(0,0,40,0.6) в полночь
5. Функцию drawRainEffect(ctx, rainDrops) — анимация дождя
Запиши все функции в game.js, не удаляй существующий код.

Промпт 3 - механики фермы

@game_mechanics Прочитай текущий game.js и реализуй полную игровую логику:
1. Инициализацию GameState.grid (12x10 пустых клеток) в функции initGame()
2. Функцию update(dt) с полными системами:
   - Рост культур (с учётом watered и погоды)
   - Таймеры животных (производство яиц/молока/шерсти)
   - Система времени: hour увеличивается, день меняется каждые 60 секунд
   - Смена погоды каждые 180 секунд
3. Функцию handleTileClick(col, row) — применяет активный инструмент к клетке
4. Функцию handleAnimalClick(animal) — собирает ресурс если hasProduct=true
5. window.render_game_to_text() — возвращает JSON состояния для тестирования
6. window.advanceTime(ms) — детерминированный шаг времени для тестов
Интегрируй с существующим render loop.

Промпт 4 - UI магазина и инвентаря

@ui_designer Прочитай index.html и game.js, затем создай полный UI фермы:
1. HTML-разметку в index.html:
   - div#hud: деньги, день, время, погода (левый верх), кнопки магазин/инвентарь/пауза (правый верх)
   - div#toolbar: панель 5 инструментов снизу с горячими клавишами 1-5
   - div#shop-modal: модальное окно магазина с двумя вкладками
   - div#inventory-modal: модальное окно инвентаря
   - div#notifications: контейнер для уведомлений
2. Полный CSS в style.css для всех компонентов
3. JavaScript функции в game.js:
   - updateHUD() — обновляет деньги/время/погоду в реальном времени
   - openShop() / closeShop() — открытие/закрытие магазина
   - renderShopBuy() / renderShopSell() — наполнение магазина данными
   - buySeeds(type, count) — покупка семян с проверкой денег
   - sellResource(type) — продажа всех ресурсов типа
   - showNotification(text, type) — анимированное уведомление

Промпт 5 - экономика и баланс

@economy_designer Прочитай GEMINI.md и текущий game.js.
Реализуй:
1. Систему прогрессии (4 уровня фермы) — функция checkLevelUp()
2. Ежедневные квесты — объект DailyQuest с generateQuest(), updateQuest(action), claimReward()
3. Рыночные события — массив MARKET_EVENTS, функция triggerMarketEvent() вызывается
   каждые 5 минут реального времени, показывает уведомление через showNotification()
4. Проверь и скорректируй числа баланса в CROPS и ANIMALS объектах так,
   чтобы первую курицу можно было купить за 8-10 минут игры при активной игре.
Добавь всё в game.js, не удаляя существующий код.

Промпт 6 - параллельное финальное тестирование

Запусти параллельно:

1. @qa_tester Открой index.html и выполни полный протокол тестирования
   из 8 блоков. Создай папку ./qa/ и сохрани все скриншоты.
   Составь итоговый отчёт.

2. Одновременно проверь game.js на наличие:
   - Использования localStorage или sessionStorage (ЗАПРЕЩЕНО)
   - Вызовов alert(), confirm(), prompt() (ЗАПРЕЩЕНО)
   - Жёстко прописанных пиксельных значений вне CSS-переменных
   - Утечек памяти: requestAnimationFrame без cancelAnimationFrame
   Выведи список найденных проблем с номерами строк.

Промпт 7 - Исправление по отчету QA

Прочитай отчёт QA из последнего ответа и скриншоты в ./qa/.
Исправь все баги с пометкой ❌ ПРОВАЛЕНО.
После исправления каждого бага опиши что именно было сломано
и как ты это починил.
Особое внимание: если @qa_tester сообщил о проблемах с
изометрической сеткой или кликами по тайлам — исправь в первую очередь.

Промпт 8 - Финальная полировка

Выполни финальную полировку игры:
1. Добавь звуковые эффекты через Web Audio API (не файлы, а процедурные):
   - Клик по земле (низкий удар): freq=80, duration=0.15, type='sine'
   - Сбор урожая (приятный звон): freq=523, duration=0.2, type='triangle'
   - Покупка в магазине (монетный звук): freq=880, duration=0.1, type='square'
   - Уведомление (мягкий pip): freq=660, duration=0.08, type='sine'
2. Добавь анимацию сбора урожая: частицы летят вверх при клике серпом
   (используй ParticlePool паттерн из архитектуры)
3. Добавь подсветку клетки при наведении: тайл под курсором подсвечивается
   rgba(255,255,255,0.2)
4. Проверь что игра работает на мобильном: добавь touch события для
   панели инструментов и клика по тайлу

Смотрим результат работы агентов: f4ad41b5c621de2126c4c05d7f42e712.png

56e10297501917cd9684cd264e58b7fd.png

Основную механику агенты сделали, дальше можно добавить пиксельные картинки, чтобы это выглядело всё красивее, а не выглядело набором голых пикселей, как сейчас. После базовой версии можно добавить дополнительные субагенты:

  • fisherman.md - система рыбалки (пруд, удочка, разные виды рыб).
  • craft_system.md - рецепты крафта (молоко + пшеница = хлеб, цена × 3).
  • npc_trader.md - NPC-торговцы приходят раз в день с уникальными предложениями.
  • save_system.md - экспорт состояния в JSON и импорт через текстовое поле (обход запрета localStorage).

Финальный результат:

8a5df820fd9a4aa6cc4bd96ea4b667e0.png

ae55c9d5927d592b3a8edea7928f2885.png

и мои 14 агентов, которые это сделали:

pixel-farm/.gemini/agents/
├── world_builder.md          🎨 Изометрия, тайлы, день/ночь
├── game_mechanics.md         ⚙️ Логика культур, животных, времени
├── ui_designer.md            🖥️ HUD, магазин, инвентарь
├── economy_designer.md       💰 Баланс, квесты, рыночные ивенты
├── qa_tester.md              🧪 Браузерное тестирование
├── craft_system.md           🔨 Рецепты и верстак
├── npc_trader.md             🧔 Торговцы и диалоги
├── save_system.md            💾 Base64 + URL hash сохранение
├── audio_engineer.md         🔊 Процедурный звук
├── performance_optimizer.md  ⚡ 60fps, offscreen canvas
├── content_expander.md       🎣 Рыбалка, шахта, сезоны
├── building_system.md        🏗️ Build Mode, постройки, снос
├── decoration_system.md      🌸 Декорации, Beauty Score
└── upgrade_system.md         ⬆️ Тиры зданий, Tech Tree, достижения

Вывод

Субагенты меняют сам подход к работе с агентом: главный агент перестаёт быть «универсальным работником» и становится дирижёром, который распределяет работу между узкими специалистами - у каждого свой чистый контекст, свой набор инструментов и свой системный промпт.

Главное правило на практике: чем точнее описаны description и tools агента, тем предсказуемее автоматическая маршрутизация. А хорошо настроенная команда субагентов в .gemini/agents/ со временем превращается в полноценную проектную инфраструктуру, которую можно версионировать и развивать вместе с кодом.

Не забываем, что для коротких правок и линейных вопросов лишняя оркестрация только замедлит работу и съест квоту API.