<p align="center">
  <img src="./docs/images/dsh-game-studio-logo.png" alt="DSH Game Studio" width="120" />
</p>

<h1 align="center">DSH Game Studio</h1>

<p align="center">
  <strong>Опишите небольшую игру в одном предложении — играйте в неё на боковой панели диалога <a href="https://github.com/deepseek-ai/deepseek-harness">DeepSeek Harness</a>, заменяйте графику на сгенерированную ИИ и экспортируйте в один HTML-файл.</strong><br />
  <sub>10 инструментов агента &bull; живой предпросмотр на боковой панели &bull; 2D- и воксельные 3D-шаблоны &bull; графика от OpenAI или Codex с предварительной проверкой стоимости &bull; автоматические плейтесты &bull; история версий &bull; экспорт в один файл</sub>
</p>

<p align="center">
  <a href="./README.md">English</a> &middot; <a href="./README.zh.md">简体中文</a> &middot; <a href="./README.zh-TW.md">繁體中文</a> &middot; <a href="./README.ja.md">日本語</a> &middot; <a href="./README.ko.md">한국어</a> &middot; <a href="./README.fr.md">Français</a> &middot; <a href="./README.es.md">Español</a> &middot; <a href="./README.de.md">Deutsch</a> &middot; <a href="./README.pt.md">Português</a> &middot; <b>Русский</b> &middot; <a href="./README.hi.md">हिन्दी</a> &middot; <a href="./README.tr.md">Türkçe</a> &middot; <a href="./README.th.md">ไทย</a> &middot; <a href="./README.vi.md">Tiếng Việt</a> &middot; <a href="./README.id.md">Bahasa Indonesia</a>
</p>

<p align="center">
  <sub>Пакет: <code>@zseven-w/dsh-game-studio</code> &middot; Текущий релиз плагина: <code>0.1.0-rc.5</code> &middot; Протестировано с DSH <code>0.2.1-rc.5</code></sub>
</p>

<br />

<p align="center">
  <img src="./docs/images/dsh-game-studio-banner.png" alt="DSH Game Studio — одно предложение, одна готовая игра" width="100%" />
</p>

<p align="center">
  <img src="./docs/images/dsh-game-studio-overview.png" alt="3D-игра, запущенная на боковой панели Game Studio, с готовыми к применению вариантами ИИ-графики" width="100%" />
</p>
<p align="center"><sub>Игра работает на правой боковой панели, пока агент продолжает работу; под ней ждут пронумерованные варианты ИИ-графики на ваш выбор</sub></p>

## Почему DSH Game Studio

Попросите агента создать игру простыми словами — «3D-игра: красная панда собирает побеги бамбука в лесу и уворачивается от диких кабанов» — и он соберёт её из шаблона, сам сыграет в неё для проверки работоспособности и покажет на боковой панели, где в неё можно сразу поиграть. Изначально персонажи рисуются кодом; когда вам понадобится настоящая графика, агент сгенерирует варианты через OpenAI или вашу учётную запись Codex, вы выберете нужный по номеру, и игра подставит его. Каждое изменение сохраняется как версия, к которой можно вернуться, а готовая игра экспортируется в виде единого автономного HTML-файла.

| | |
| --- | --- |
| 🎮 **Можно играть с первого же ответа** | Два шаблона — 2D-игра с видом сверху и тот же игровой цикл в воксельном 3D-мире (three.js), — которые агент перестраивает под описанную вами игру: персонажи, правила, уровни, экраны. |
| 🖥️ **Живой предпросмотр на боковой панели** | Игра запускается в изолированной панели рядом с чатом, пересобирается при каждом изменении и выводит под собой список слотов графики, вариантов и версий. Игры в горизонтальной ориентации получают широкую сцену. |
| 🎨 **Своя графика с предварительной проверкой стоимости** | `game_studio_generate_asset` создаёт пронумерованные варианты для каждого слота через API изображений OpenAI или локальный Codex CLI. До списания средств вы получаете карточку подтверждения с указанием сервиса, количества изображений и ожидаемой стоимости. Прикреплённая в чате картинка может служить референсом. |
| 🤖 **Автоматические плейтесты** | `game_studio_playtest` запускает свежий код в безголовом (headless) режиме Chrome или Edge и возвращает отчёт по фазам, очкам, частоте кадров, ошибкам скриптов и скриншотам. Игры, в которых управление осуществляется не стрелками (сетки, карты, прицеливание, ритм-игры…), определяют `window.__autoplay`, поэтому плейтест проходит их реальный игровой цикл. |
| 🕰️ **История версий** | Каждая сборка, изменившая игру, сохраняется; `game_studio_restore_version` возвращает код, правила и графику вместе. |
| 📦 **Экспорт в один файл** | `game_studio_export` записывает полностью автономный HTML-файл без доступа к сети — откройте его в любом браузере или разместите на любом статическом хостинге. |
| 📱 **Проверка на телефоне** | `game_studio_share` открывает временную ссылку только для чтения в вашей локальной сети — или временную публичную ссылку через Cloudflare Quick Tunnel (`cloudflared`), чтобы друзья из любой сети могли поиграть, — с QR-кодом на боковой панели. |
| 🌐 **Публикация на GitHub Pages** | `game_studio_publish` отправляет собранный HTML (или всю стену игр) в публичный репозиторий вашего авторизованного аккаунта `gh` и включает GitHub Pages для получения постоянной ссылки, которая остаётся доступной даже после выключения компьютера. |
| 🗂️ **Мои игры** | Нажмите **+** в правой панели и выберите **Game Studio · My games**: каждая игра рабочей области — плитка с кадром последнего теста, с фильтром 2D/3D и сортировкой по дате, версиям или названию. Один клик — и играете, без агента и без токенов. Вы также можете подписываться на онлайн-источники игр (`owner/repo`, URL репозитория GitHub или URL GitHub Pages), чтобы просматривать опубликованные игры и играть в них наряду со своими. **Export wall** собирает ваши локальные игры в одну офлайн-страницу, которую можно отправить друзьям. |

## Игры, сделанные с ним

Четыре игры из наших тестов. Каждая началась с фразы под ней в новой сессии (запросы переведены с китайского); некоторые потом поправили последующими запросами в той же сессии — это отмечено. Геймплей записан встроенным автопилотом каждой игры.

<p align="center">
  <img src="./docs/images/dsh-game-studio-play-fox-3d.gif" alt="«Лунный лис: остров фонариков» — шаблон 3D-воксели, реальный геймплей" width="640" />
</p>
<p align="center"><sub>«Лунный лис: остров фонариков» — шаблон 3D-воксели, реальный геймплей</sub></p>

<table>
<tr>
<td width="50%"><img src="./docs/images/dsh-game-studio-play-moonlit-2d.jpg" alt="Сделай маленькую игру: лисёнок собирает фонарики в лунном лесу и уворачивается от колючих монстров." width="100%" /><br /><sub>“Сделай маленькую игру: лисёнок собирает фонарики в лунном лесу и уворачивается от колючих монстров.”<br />Шаблон 2D; персонажей позже заменили выбранной ИИ-графикой</sub></td>
<td width="50%"><img src="./docs/images/dsh-game-studio-play-fox-3d.jpg" alt="Сделай 3D-игру: лисёнок собирает фонарики на воксельном острове и уворачивается от колючих монстров." width="100%" /><br /><sub>“Сделай 3D-игру: лисёнок собирает фонарики на воксельном острове и уворачивается от колючих монстров.”<br />Шаблон 3D-воксели; модель фонарика переделана по следующему запросу</sub></td>
</tr>
<tr>
<td width="50%"><img src="./docs/images/dsh-game-studio-play-penguin-3d.jpg" alt="Сделай 3D-игру: пингвинёнок собирает рыбу на айсберге и уворачивается от тюленей." width="100%" /><br /><sub>“Сделай 3D-игру: пингвинёнок собирает рыбу на айсберге и уворачивается от тюленей.”<br />3D; красную шапку добавили следующим запросом</sub></td>
<td width="50%"><img src="./docs/images/dsh-game-studio-play-panda-3d.jpg" alt="Сделай 3D-игру: малая панда собирает побеги бамбука в бамбуковом лесу и уворачивается от кабанов." width="100%" /><br /><sub>“Сделай 3D-игру: малая панда собирает побеги бамбука в бамбуковом лесу и уворачивается от кабанов.”<br />3D; персонажей позже заменили ИИ-графикой, лес остался 3D</sub></td>
</tr>
</table>

## Насколько хорошо это работает

Измерено в реальном DSH с моделью DeepSeek-V4.1-Flash: каждая игра создавалась из одного предложения в новой сессии и оценивалась независимым плейтестом (2026-11-04/05):

- **Игры в жанре «собирай и уворачивайся»** (основная специализация шаблонов): 10 из 10 различных запросов оказались полностью играбельными с первой попытки, медианное время — около 14 минут на игру.
- **Другие жанры** — три в ряд, перемещение ящиков (сокобан), башенная защита (tower defense), баскетбол, платформер, ритм-игра, гонки, карточный баттлер, ферма, управление кафе: все 10 оказались играбельными, но заняли в среднем (по медиане) около 26 минут. После добавления `__autoplay`, пользовательских слотов графики и горизонтальной ориентации четыре из них были запущены повторно и заняли 8–18 минут. Выборка небольшая.

## Инструменты

| Инструмент | Что он делает |
| --- | --- |
| `game_studio_create` | Создаёт играбельную игру из шаблона `collector` (2D) или `voxel` (3D), собирает её и показывает на боковой панели. Принимает название, художественный стиль, `orientation` (портретная или горизонтальная) и `slots` — собственные графические слоты игры, названные на языке пользователя. |
| `game_studio_build` | Пересобирает проект после редактирования `game.json` или `game.js`, обновляет предпросмотр и сохраняет версию с краткой заметкой. |
| `game_studio_playtest` | Запускает свежий код в безголовом режиме (портретный формат под телефон или горизонтальный 960×540) и сообщает фазы, лучший счёт, жизни, частоту кадров, ошибки и скриншоты; параметр `characters: true` возвращает только крупные планы персонажей. |
| `game_studio_generate_asset` | Генерирует от 1 до 4 вариантов изображений для одного слота с помощью `openai` или `codex`, при необходимости опираясь на изображение-референс. Запрашивает подтверждение перед расходом средств. Codex работает в фоновом режиме. |
| `game_studio_apply_asset` | Подставляет выбранный вариант в игру по его номеру, пересобирает проект и обновляет предпросмотр. |
| `game_studio_revert_asset` | Возвращает предыдущую графику слота. |
| `game_studio_versions` | Выводит список сохранённых версий, начиная с самых новых. |
| `game_studio_restore_version` | Восстанавливает более раннюю версию всей игры целиком. |
| `game_studio_export` | Экспортирует один автономный HTML-файл, работающий без интернета. |
| `game_studio_share` | Открывает (или закрывает) временную ссылку только для чтения в локальной сети, либо при передаче `public: true` создаёт временную публичную ссылку через `cloudflared`, чтобы поиграть мог любой, у кого есть ссылка. |
| `game_studio_list` | Показывает игры рабочей области с названием, 2D/3D, состоянием сборки и числом версий, чтобы агент находил «ту игру с пингвином» по имени. |
| `game_studio_export_wall` | Экспортирует стену игр: офлайн-страница HTML с плиткой для каждой собранной игры; клик по плитке запускает игру. |
| `game_studio_publish` | Публикует собранную игру (или стену игр при `wall: true`) на GitHub Pages через локальный авторизованный `gh` CLI, либо удаляет её при передаче `remove: true`. Предварительно запрашивает подтверждение и записывает данные только в репозитории, содержащие маркер `.dsh-game-studio.json`. |

Кнопки на боковой панели (применить, вернуть, собрать, экспортировать, восстановить, поделиться, опубликовать) вызывают те же самые операции через команду `/game-studio`.

## Сервисы генерации изображений и расходы

| Сервис | Что требуется | Стоимость | Примечания |
| --- | --- | --- | --- |
| **OpenAI** (GPT Image) | API-ключ в учётных данных DSH или в переменной окружения (по умолчанию `OPENAI_API_KEY`) | Оплата за каждое изображение списывается с вашего ключа; карточка подтверждения показывает расчётную стоимость | Около минуты на пакет. `openaiBaseUrl` принимает шлюз, совместимый с OpenAI. |
| **Codex CLI** | Установленный и авторизованный Codex (`codex login`) | Расходует лимиты вашего тарифа Codex; API-ключ не требуется | Несколько минут на изображение, работает в фоновом режиме и сообщает о готовности по завершении. |

Режим `imageProvider: auto` (по умолчанию) использует OpenAI, если задан его ключ, а в противном случае — Codex. При включённом `confirmSpending` (по умолчанию) ничего не генерируется, пока вы не одобрите карточку. Спрайты проверяются на прозрачность фона и кадрирование, а затем подгоняются под размер слота перед тем, как будут предложены вам.

## Безопасность и конфиденциальность

- Игры запускаются в изолированном `iframe` с политикой безопасности контента (CSP), которая блокирует доступ к сети; экспортированные файлы не выполняют никаких сетевых запросов.
- Единственное, что отправляется с вашего компьютера наружу — это промпты (и картинка-референс, если вы её приложили) в выбранный вами сервис генерации изображений.
- Ссылка для общего доступа работает только в режиме чтения, раздаёт только сборку конкретной игры и закрывается по истечении заданного времени (по умолчанию 30 минут). Локальные ссылки слушают только вашу локальную сеть; публичные ссылки слушают только `127.0.0.1` и туннелируются через Cloudflare (`trycloudflare.com`) после вашего подтверждения.
- Публикация на GitHub Pages (`game_studio_publish`) использует ваш локальный авторизованный `gh` CLI (плагин никогда не касается вашего токена GitHub), загружает только собранный HTML в **публичный** репозиторий после вашего подтверждения и отказывается записывать данные в любой существующий репозиторий, не содержащий маркер `.dsh-game-studio.json`.
- Онлайн-источники игр запускаются на собственном сайте провайдера внутри изолированного `iframe` (`sandbox="allow-scripts"`) без доступа к DSH или вашему рабочему пространству и никогда не копируются и не пересылаются при экспорте или публикации вашей локальной стены игр.
- API-ключи считываются из учётных данных DSH или переменных окружения и никогда не записываются в файлы проектов, логи или результаты работы инструментов.

## Требования

- DeepSeek Harness `0.2.1` или новее (веб- или настольная версия), Node.js `24.11` или новее.
- Google Chrome или Microsoft Edge на том же компьютере для запуска плейтестов.
- Для ИИ-графики: либо API-ключ OpenAI, либо авторизованный Codex CLI. Без них игры всё равно работают со своими персонажами, нарисованными кодом.
- Опционально: `cloudflared` (`brew install cloudflared` на macOS) для временных публичных ссылок общего доступа; `gh` (`brew install gh` и `gh auth login`) для публикации на GitHub Pages.

## Установка в DSH

Установите из npm в профиль DSH:

```sh
dsh plugin --profile web add @zseven-w/dsh-game-studio@latest
dsh web
```

## Быстрый старт

Откройте сессию в рабочей папке и попросите, например:

- `Сделай небольшую игру: котёнок ворует сушёную рыбу на кухне и старается не врезаться в робот-пылесос.`
- `Сделай 3D-игру: маленький рыцарь собирает монеты в замке и избегает скелетов; чтобы победить, нужно собрать 20 монет за 60 секунд.`
- `Сделай игру «три в ряд» на поле 6×6; для победы нужно набрать 1000 очков за 60 секунд.`

Затем попробуйте:

- `Сгенерируй с помощью ИИ 2 новых варианта графики для героя, я выберу на боковой панели.`
- `Сделай внешность героя по образцу картинки, которую я прикрепил.`
- `Экспортируй игру в один HTML-файл.`

## Конфигурация

Задайте эти параметры в разделе `config` файла `cordis.patch.yml` вашего профиля:

| Параметр | По умолчанию | Описание |
| --- | --- | --- |
| `imageProvider` | `auto` | `auto`, `openai` или `codex`. |
| `openaiModel` | `gpt-image-2.5-flare` | Модель генерации изображений OpenAI; зафиксируйте её, чтобы результаты оставались сопоставимыми. |
| `openaiBaseUrl` | OpenAI | Базовый URL, совместимый с OpenAI, например корпоративный шлюз. |
| `openaiCredential` | `OPENAI_API_KEY` | Имя учётных данных или переменной окружения, содержащей ключ. |
| `codexPath` | ищется в `PATH` или через оболочку входа (login shell) | Исполняемый файл Codex CLI. |
| `codexModel` | по умолчанию в Codex | Модель для генерации изображений через Codex. |
| `codexReasoningEffort` | `low` | Уровень усилий на рассуждение (reasoning effort) при генерации изображений в Codex. |
| `codexTimeoutMinutes` | `15` | Прервать генерацию одного изображения в Codex по истечении этого времени (в минутах). |
| `confirmSpending` | `true` | Запрашивать подтверждение перед каждой генерацией. |
| `cloudflaredPath` | ищется в `PATH` или Homebrew | Исполняемый файл `cloudflared` для временных публичных ссылок общего доступа. |
| `ghPath` | ищется в `PATH` или Homebrew | Исполняемый файл GitHub CLI (`gh`) для публикации на GitHub Pages. |
| `githubRepo` | `dsh-games` | Имя публичного репозитория GitHub (в вашем авторизованном аккаунте) для GitHub Pages. |

## Формат игрового проекта

Каждая игра представляет собой обычную папку в вашем рабочем пространстве:

- `game.json` — название, художественный стиль, ориентация, слоты графики и правила. Правила имеют свободную форму: любой ключ передаётся в игру как `window.GAME.rules`.
- `game.js` — код игры, который редактирует агент. Он предоставляет `window.__gameState()` для плейтестов, опционально `window.__autoplay(state)` для игр, не управляемых стрелками, и `window.__renderSlots(size)`, чтобы боковая панель отображала персонажей, нарисованных кодом (2D-шаблон рисует их в `drawCharacter()`).
- `assets/` — изображение для каждого слота плюс `ASSETS.json` — запись о том, откуда взялось каждое из них. Вы можете рисовать поверх файла слота напрямую; студия запишет это как вашу правку.
- `dist/index.html` — текущая сборка; в папке `.studio/` хранятся версии, варианты графики и запуски плейтестов.

## Разработка

```sh
npm ci
npm run build   # lib/index.js, lib/client.js and the bundled three.js runtime
npm test        # node --test; playtest tests are skipped when no Chrome or Edge is found
```

## Экосистема

- [DSH Crew](https://github.com/ZSeven-W/dsh-crew) — отправка задач агентам DSH из Claude Code / Codex
- [DSH iOS](https://github.com/ZSeven-W/dsh-ios) — живой симулятор iOS или подключённый по USB iPhone прямо внутри диалога
- [DSH Android](https://github.com/ZSeven-W/dsh-android) — живой эмулятор Android или USB-устройство прямо внутри диалога
- [DSH Noema](https://github.com/ZSeven-W/dsh-noema) — долговременная память для DSH
- [DSH OpenPencil](https://github.com/ZSeven-W/dsh-openpencil) — просмотр и редактирование дизайн-документов `.op` внутри диалога

## Благодарности и лицензия

- [three.js](https://github.com/mrdoob/three.js) — 3D-движок, встраиваемый в воксельные игры (MIT).
- [qrcode-generator](https://github.com/kazuhikoarase/qrcode-generator) — Kazuhiko Arase — генератор QR-кода на панели общего доступа в боковой панели (MIT).
- [Playwright](https://github.com/microsoft/playwright) (`playwright-core`) — управляет браузером во время плейтестов (Apache-2.0; зависимость времени выполнения).
- Шаблоны, спрайты и воксельные модели являются оригинальными разработками этого проекта.
- Полный список уведомлений см. в файле [THIRD_PARTY_NOTICES.md](./THIRD_PARTY_NOTICES.md).

**Лицензия**: MIT
