К основному содержанию
скилл CX Codex

use-template — скилл для Claude Code: клонирует шаблон игры

Копирует готовый шаблон игры из галереи в новый проект. Рабочий код появляется сразу, без ИИ-пайплайна.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add PlayableIntelligence/game-creator --skill use-template -a claude-code
Открыть на GitHub

Что делает use-template

Скилл берёт шаблон из локального реестра site/manifest.json и разворачивает его в новую папку. Если аргументов нет, он показывает нумерованный список всех шаблонов с движком и уровнем сложности и просит выбрать. Идентификатор шаблона обязателен, имя проекта по умолчанию совпадает с ним.

Копирование идёт с исключениями: node_modules/, dist/, output/, .herenow/, progress.md, test-results/, playwright-report/ в новый проект не попадают. Затем скилл правит package.json (поле name) и <title> в index.html, после чего запускает npm install. Имена проектов проверяются на обход пути и спецсимволы, а итоговый путь сверяется с ожидаемой родительской папкой.

Учтите: скилл отправляет анонимную телеметрию о том, какой шаблон склонировали. Передаются только тип события, идентификатор шаблона, источник и версия схемы. Отключается переменными DO_NOT_TRACK=1 или DISABLE_TELEMETRY=1. Для проектов, которые будут развиваться долго, этот скилл не подходит — он даёт разовую копию, а не сессионный процесс разработки.

Какие задачи решает

  • развернуть рабочий шаблон игры в новой папке
  • посмотреть список доступных шаблонов с движком и сложностью
  • склонировать пример и сразу запустить его локально
  • переименовать проект в package.json и заголовке страницы
  • начать с готового кода вместо генерации с нуля

Примеры запросов агенту

  • /use-template flappy-bird my-game
  • /use-template threejs-3d-starter space-shooter
  • /use-template castle-siege

Как установить use-template

1Через Skills CLI (Vercel)

npx skills add PlayableIntelligence/game-creator --skill use-template -a claude-code

2Вручную: положить файлы

~/.claude/skills/use-template/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/use-template/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о use-template

Как установить use-template в Claude?

Выполните npx skills add PlayableIntelligence/game-creator --skill use-template -a claude-code. Скилл окажется в ~/.claude/skills/use-template/SKILL.md.

Что делает use-template?

Копирует выбранный шаблон игры из галереи в новый проект, чистит служебные папки, обновляет метаданные и ставит зависимости через npm install.

Чем use-template отличается от /viral-game и /make-game?

Это быстрая копия: код готов сразу, дальше правите руками. /viral-game — разовый ИИ-пайплайн от промпта до деплоя, а /make-game ведёт проект по этапам с ADR и docs/STATE.md.

Исходный текст

SKILL.md · MIT
---
name: use-template
description: Clone a game template from the gallery as a starting point. Use when the user says "use a template", "start from a template", "clone flappy-bird", "use the platformer template", or wants to quickly bootstrap a game from an existing example. Do NOT use for creating a game from scratch (use viral-game for one-shot builds or make-game for milestone-driven projects).
argument-hint: "[template-id] [project-name]"
license: MIT
metadata:
  author: OpusGameLabs
  version: 1.3.0
  tags: [game, template, scaffold, clone, gallery]
---

# Use Template

Clone a game template from the gallery into a new project. This is a fast copy — working code in seconds, not an AI pipeline.

## Behavior

1. **Parse arguments**: `<template-id> [project-name]`
   - If no arguments provided, read `site/manifest.json`, display a numbered list of all templates with their engine/complexity/description, and ask the user to pick one.
   - `template-id` is required. `project-name` defaults to `template-id`.

2. **Look up template** in `site/manifest.json` by `id`. If not found, show available IDs and abort.

3. **Determine target directory**:
   - If current working directory is inside the `game-creator` repository → `examples/<project-name>/`
   - Otherwise → `./<project-name>/`
   - If target already exists, abort with error.

4. **Copy the template source directory** to the target, **excluding**:
   - `node_modules/`
   - `dist/`
   - `output/`
   - `.herenow/`
   - `progress.md`
   - `test-results/`
   - `playwright-report/`

5. **Update project metadata**:
   - In `package.json`: set `"name"` to the project name
   - In `index.html` (if exists): update `<title>` to a formatted version of the project name

6. **Install dependencies**: Run `npm install` in the target directory.

7. **Print next steps**:
   ```
   Template cloned successfully!

   cd <project-name>
   npm run dev
   ```

## Implementation

```javascript
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');

// Find game-creator root (contains site/manifest.json)
function findRoot(dir) {
  let d = dir;
  while (d !== path.dirname(d)) {
    if (fs.existsSync(path.join(d, 'gallery', 'manifest.json'))) return d;
    d = path.dirname(d);
  }
  return null;
}

const root = findRoot(process.cwd());
const manifest = JSON.parse(fs.readFileSync(path.join(root, 'gallery', 'manifest.json'), 'utf-8'));

// Parse args
const [templateId, projectName] = args; // provided by the agent
const template = manifest.find(t => t.id === templateId);
const name = projectName || templateId;

// Validate project name — reject path traversal and special characters
if (/[\/\\]|^\.\.?$|\.\./.test(name)) {
  throw new Error(`Invalid project name: "${name}". Must not contain path separators or ".." sequences.`);
}
if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(name)) {
  throw new Error(`Invalid project name: "${name}". Use only alphanumeric characters, hyphens, underscores, and dots.`);
}

// Determine target
const inGameCreator = process.cwd().startsWith(root);
const target = inGameCreator
  ? path.join(root, 'examples', name)
  : path.join(process.cwd(), name);

// Verify resolved path stays within expected parent directory
const expectedParent = inGameCreator ? path.join(root, 'examples') : process.cwd();
if (!path.resolve(target).startsWith(path.resolve(expectedParent))) {
  throw new Error('Target directory resolved outside expected parent. Aborting.');
}

// Copy with exclusions
const EXCLUDE = ['node_modules', 'dist', 'output', '.herenow', 'progress.md', 'test-results', 'playwright-report'];

function copyDir(src, dst) {
  fs.mkdirSync(dst, { recursive: true });
  for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
    if (EXCLUDE.includes(entry.name)) continue;
    const s = path.join(src, entry.name);
    const d = path.join(dst, entry.name);
    if (entry.isDirectory()) copyDir(s, d);
    else fs.copyFileSync(s, d);
  }
}

copyDir(path.join(root, template.source), target);

// Update package.json
const pkgPath = path.join(target, 'package.json');
if (fs.existsSync(pkgPath)) {
  const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
  pkg.name = name;
  fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
}

// Update index.html title
const indexPath = path.join(target, 'index.html');
if (fs.existsSync(indexPath)) {
  let html = fs.readFileSync(indexPath, 'utf-8');
  const prettyName = name.replace(/[-_]/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
  html = html.replace(/<title>[^<]*<\/title>/, `<title>${prettyName}</title>`);
  fs.writeFileSync(indexPath, html);
}

// Install
execSync('npm install', { cwd: target, stdio: 'inherit' });

// Optional anonymous telemetry — tracks which templates are popular
// Data sent: event type ("clone"), template ID, source ("skill"), schema version
// No PII, IP addresses, file paths, or user-identifiable data is transmitted
// Opt out: set DO_NOT_TRACK=1 or DISABLE_TELEMETRY=1 in your environment
if (!process.env.DO_NOT_TRACK && !process.env.DISABLE_TELEMETRY) {
  const https = require('https');
  const telemetryUrl = process.env.TELEMETRY_URL || 'https://gallery-telemetry.up.railway.app';
  https.get(`${telemetryUrl}/t?event=clone&template=${encodeURIComponent(templateId)}&source=skill&v=1`)
    .on('error', () => {});
}
```

## Example Usage

```
/use-template flappy-bird my-game
/use-template threejs-3d-starter space-shooter
/use-template castle-siege
```

## Security Notes

- **Path validation**: Project names are validated to reject path traversal (`..`), path separators, and special characters. The resolved target path is verified to stay within the expected parent directory.
- **npm install**: Runs `npm install` from the copied template's `package.json`, which contains only pinned dependencies from the template (Phaser/Three.js, Vite). No arbitrary packages are installed.
- **Telemetry**: Anonymous, opt-out usage telemetry sends only the template ID and event type (no PII, paths, or user data). Disable with `DO_NOT_TRACK=1` or `DISABLE_TELEMETRY=1` environment variables.
- **Template source**: Templates are copied from the local `site/manifest.json` registry within the plugin — no external templates are fetched at clone time.

## Key Difference from /viral-game and /make-game

`/use-template` is a **10-second copy**. You get working, runnable code instantly and customize it manually. `/viral-game` is a **10-minute AI pipeline** that scaffolds, designs, adds audio, tests, deploys, and monetizes from a text prompt or tweet URL — opinionated and one-shot. `/make-game` is the deeper, multi-session game-dev workflow with milestones, ADRs, and `docs/STATE.md` for projects that need to evolve over time.

© OpusGameLabs · MIT · PlayableIntelligence/game-creator

Похожие скиллы

Всё по теме «Геймдев и 3D: Unity, Unreal, Godot, Blender» →

Из того же набора27

quick-game Генерирует черновой играбельный прототип на Phaser или Three.js без графики, звука и полировки. Пригодится, когда нужно сразу запустить и проверить базовую механику. CX Codex +1 866установок monetize-game Регистрирует браузерную игру на Play.fun, подключает клиентский SDK с очками и таблицей лидеров, а затем выдаёт ссылку для игроков. CX Codex +1 862установок promo-video Записывает автономный промо-ролик игры на Phaser в MP4 50 FPS, вертикально 9:16. Пригодится, когда нужен клип для соцсетей без ручной съёмки. CX Codex +1 857установок record-promo Записывает автономный ролик геймплея в 50 FPS для TikTok, Reels и X. Нужен, когда игра уже играется, а показать её нечем. CX Codex +1 840установок worldlabs Генерирует фотореалистичные 3D-окружения из текста или картинки через World Labs Marble API. Пригодится, когда нужен уровень или локация для игры. CX Codex +1 827установок fetch-tweet Извлекает текст публикации, медиафайлы и счётчики реакций из X без рендеринга JavaScript. Скилл запрашивает данные напрямую через публичный API fxtwitter по ссылке на твит. CX Codex +1 802установок threejs-perf Оптимизирует сцены Three.js через инстансинг, убирает лишние вызовы отрисовки и ускоряет рендеринг тысяч подвижных объектов. CX Codex +1 639установок scaffold-gateables Добавляет в браузерную игру платные фичи-заготовки: скины, продолжение после смерти, бонусный режим, слоты сохранений. Пока монетизация не подключена, всё заперто. CX Codex +1 581установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой