Skill #0 · Onboarding wizard

video-project-setup

Первый шаг для нового клиента. Собирает информацию о бизнесе, создаёт папку проекта, генерирует project.yaml, brief.md, шаблоны рефересных текстов, регистрирует всё в общей БД и опционально привязывает уже существующие голоса/музыку из других проектов.

Путь
~/.claude/skills/video-project-setup/
Триггеры
добавь проект, новый проект, создай проект, настрой проект, add project, new project, setup project, онбординг проекта, новый клиент, добавь бизнес
Зависит от
Python 3.10+, PyYAML, доступ к общей video-projects/director.db (schema v6+)
Пэйрится с
orchestrator (через check_project.py), clipgen, voiceover, creative-poster brand init

Что делает простыми словами

Это визард-онбординг. Представь, что приходит новый клиент — например, стоматология «Бас Дент». Чтобы остальные 15 скиллов могли с ней работать, нужно:

Без этого скилла остальные не понимают, к какому бизнесу относится команда «сделай 3 ролика». С ним — у каждого проекта есть единая точка входа, и весь пайплайн знает, что читать.

Это не «генерация», а «инициализация». Скилл не делает ни клипов, ни текстов — он создаёт скелет, на котором всё дальнейшее производство будет жить. Запускается один раз на проект.

11 шагов визарда

Визард ведёт пользователя по чёткому списку. Каждый шаг можно пропустить (отвечая «потом») — тогда подставится разумный дефолт или пустой шаблон.

Шаг 1. Базовая информация

Минимум: название, ниша, город. Если юзер уже написал в команде («добавь проект фитнес клуб FitZone Астана») — парсим оттуда. Если нет — спрашиваем по одному через AskUserQuestion.

Ниши предлагаются списком: Стоматология, Фитнес, Ресторан, Салон красоты, Автосервис, Медицина, Образование, Other.

Slug генерируется автоматически: "FitZone"fitzone, "Бас Дент"bas-dent, "Астана Гриль"astana-grill. Транслит + lowercase + дефисы. Показываем юзеру и просим подтвердить.

Шаг 2. Направления услуг

«Перечислите основные направления через запятую». Пример для фитнеса: Персональные тренировки, Групповые занятия, Абонементы, Похудение. Каждое получит свой slug и свой creatives/<slug>.md:

"Персональные тренировки" → slug: "personal-training"
                          → creative_ref: "creatives/personal-training.md"

Это критично: copywriter потом будет читать эти файлы как референсы при генерации текста для каждого направления.

Шаг 3. Демография для Veo

Все проекты в Казахстане → дефолт: Central Asian (Kazakh) and Slavic/Russian-looking people. Юзера спрашиваем «подходит?» (большинство не правит).

demographics: "Central Asian (Kazakh) and Slavic/Russian-looking people"
demographics_hint: "Explicitly specify: 'Central Asian woman', 'Kazakh-looking young man'"
forbidden_demographics: ["East Asian", "African", "South Asian"]
Зачем forbidden. Veo любит вставлять стоковые азиатские/африканские лица в дефолте. Если не запретить явно — реклама стоматологии в Астане окажется с парой «Корея + Индия». В Казахстане это убивает доверие.

Шаг 4. Бренд (опционально)

ПолеДефолт
Primary color#2563EB (синий)
Secondary color#F59E0B (янтарный)
Font familyMontserrat
Logo fileкопируется в references/logo.png

Шаг 5. Meta Ads (опционально)

Account ID (act_XXXXX), Page ID, Instagram Account ID, Lead form IDs по направлениям. Если юзер пропустил — секция meta: просто не пишется в yaml. Можно добавить позже руками.

Шаг 6. Создание структуры папок

video-projects/<slug>/
├── project.yaml          # генерируется на шаге 7
├── brief.md              # шаг 8
├── creatives/            # шаг 9 — по файлу на направление
│   ├── personal-training.md
│   ├── group-classes.md
│   └── ...
├── clips/                # video-analyzer / clipgen зальют сюда
├── videos/               # director выкладывает финал
├── voiceovers/           # voiceover сохраняет mp3
├── music/                # юзер кладёт треки сам
├── references/           # логотип, фото для Veo
├── remotion/             # remotion-проект для motionfx/captions
├── out/
└── tmp/

Одна команда:

mkdir -p video-projects/<slug>/{clips,videos,voiceovers,music,references,remotion,out,tmp,creatives}

Шаг 7. Генерация project.yaml

Это центральный файл, который читают все остальные скиллы. Полная структура:

name: "FitZone"
slug: "fitzone"
niche: "Фитнес"
geo: "Астана"
language: "ru"
timezone: "UTC+5"

brief: "brief.md"
creatives_dir: "creatives/"
service_directions:
  - slug: "personal-training"
    name: "Персональные тренировки"
    creative_ref: "creatives/personal-training.md"

veo:
  demographics: "Central Asian and Slavic"
  forbidden_demographics: ["East Asian", "African"]
  scene_context: "fitness gym"          # маппится из niche
  reference_photos_dir: "references/"

voiceover:
  provider: "elevenlabs"
  model: "eleven_multilingual_v2"
  speed: 1.2

captions:
  style: "karaoke"
  font: "Montserrat-Bold"
  font_size: 24

remotion:
  brand:
    primary_color: "#2563EB"
    secondary_color: "#F59E0B"
    font_family: "Montserrat"
    logo_path: "references/logo.png"

director:
  default_format: "9:16"
  default_duration: 15
  music_dir: "music/"
  transition_style: "fade"
  music_ducking: true
scene_context маппится из ниши автоматом: Стоматология → dental clinic, Фитнес → fitness gym, Ресторан → restaurant, Салон красоты → beauty salon, Автосервис → auto repair shop, Медицина → medical clinic, Образование → education center, Other → спрашиваем.

Шаг 8. brief.md

Спрашиваем юзера: «Вставьте текст брифа или скажите 'потом'». Если есть текст — пишем как есть. Если нет — кладём шаблон с заголовками для заполнения:

# <Business Name> — Бриф

## Бизнес
- Название: <name>
- Ниша: <niche>
- Город: <city>

## Целевая аудитория
<!-- Опишите вашу ЦА -->

## Направления услуг
<!-- Услуги с ценами и УТП -->

## Преимущества
<!-- Что отличает вас от конкурентов? -->

## Тон бренда
<!-- professional | warm | edgy | playful -->

Шаг 9. Шаблоны creative-рефересов

Для каждого направления — отдельный creatives/<slug>.md с пустой нумерованной структурой:

# Персональные тренировки — Рекламные тексты

<!-- Сюда копируются лучшие рекламные тексты для этого направления.
Copywriter использует их как референс при генерации новых. -->

## Примеры текстов

#1
<!-- Вставьте текст -->

#2
<!-- Вставьте текст -->

Шаг 10. Регистрация в БД

Сначала прогоняется миграция схемы (на случай если БД старой версии), затем INSERT в projects:

python3 <schema-path>/schema.py migrate <video-projects-dir>

python3 -c "
import sqlite3, os
db = os.path.expanduser('~/video-projects/director.db')
conn = sqlite3.connect(db)
conn.execute('INSERT OR IGNORE INTO projects (slug, name, config_path) VALUES (?, ?, ?)',
    ('fitzone', 'FitZone', '/abs/path/to/project.yaml'))
conn.commit()
"

Если юзер дал бриф — также вставляем в таблицу brief:

python3 <clipgen-path>/scripts/db.py save-brief <project-dir> \
  --text "<brief>" --business-name "FitZone" \
  --niche "Фитнес" --geo "Астана" --language ru

Шаг 11. Привязка существующих ресурсов (опционально)

Если в системе уже есть другие проекты — спрашиваем «хочешь привязать голоса или музыку оттуда?». Если да:

python3 <voiceover-path>/scripts/db.py list-voices <other-project-dir> --json
# показываем юзеру → он выбирает → линкуем через junction:

INSERT OR IGNORE INTO project_voices (project_id, voice_id)
VALUES (<new_project_id>, <voice_id>);

Аналогично для музыки через project_music. Это экономит ElevenLabs-квоту — голос «Rachel», который уже куплен под другой проект, теперь работает и здесь.

Финальный checklist

Прогоняется check_project.py из orchestrator-скилла:

python3 ~/.claude/skills/video-orchestrator/scripts/check_project.py <project-dir>

И выдаётся summary юзеру:

Project "FitZone" created!

  project.yaml .............. OK
  brief.md .................. OK
  creatives/ ................ 4 files created
  clips/ .................... 0 (use clipgen or analyzer to add)
  voices .................... 2 linked
  music ..................... 0 (add music files)
  references/ ............... logo: yes
  Meta Ads .................. not configured

  Ready for pipeline: YES (clips needed before director)

Что генерируется в project.yaml — полный мап

БлокКто читаетЧто внутри
slug, name, niche, geoвсе скиллыидентификация проекта
languagecaptions, voiceoverязык генерации
service_directions[]copywriter, clipgen, creative-orchestratorсписок услуг + пути к референс-файлам
veo.*clipgenдемография, scene_context, папка с фото-референсами
voiceover.*voiceoverElevenLabs модель и speed
captions.*captionsстиль субтитров, шрифт, цвета
remotion.brand.*remotion, motionfx, captionsбренд-цвета, шрифт, лого
director.*directorформат, длительность, music-dir, переходы
meta.*creative-orchestrator perf-importMeta Ads IDs для импорта метрик
final_output_dirdirector, captionsопц. финальная папка вне проекта (например ~/Desktop/prfmnt creo/)

Таблицы БД, которые трогает

ТаблицаДействиеЗачем
projectsINSERT OR IGNOREРегистрация (slug, name, config_path)
briefINSERTТекст брифа + business-name/niche/geo/language
project_voicesINSERTJunction: линковка голосов из других проектов
project_musicINSERTJunction: линковка музыки из других проектов

Внутренности

В scripts/ у этого скилла НИЧЕГО нет. Вся логика — внутри SKILL.md (то есть в самой модели). Скилл вызывает скрипты других скиллов: schema.py из любого, db.py save-brief из clipgen, db.py list-voices из voiceover, check_project.py из orchestrator.

Это сознательное решение: проект-сетап = это инструкция «как собрать дом из готовых кирпичей», а не сами кирпичи.

Gotchas и tips

director.db — общая на ВСЕ проекты. Она лежит в ~/video-projects/director.db, НЕ внутри папки проекта. Изоляция проектов делается через junction-таблицы (project_clips, project_voices, project_music, project_videos, etc.).
Slug нельзя менять после регистрации. Если ошибся — придётся либо мириться, либо удалять проект из БД и пересоздавать (плюс переименовывать папку). Лучше подтвердить slug ОДИН раз перед записью.
Перед привязкой голосов — спроси юзера какой язык нужен. ElevenLabs-голос, настроенный под английский, плохо звучит на русском (и наоборот). Фильтруй list-voices по --language.
creative-poster brand init — отдельный шаг, который тоже стоит запустить для нового проекта (создаёт brand.yaml для статики). В VIDEO_PIPELINE_SYSTEM.md явно указано, что эти два сетапа стандартно вызываются вместе.
Не путать с уже существующим проектом. Перед регистрацией проверь, нет ли уже папки video-projects/<slug>/. Если есть — спроси юзера: «обновить yaml или работать с тем, что есть?». Случайная перезапись project.yaml сотрёт ручные правки.

Место в пайплайне

project-setup clipgen / analyzer orchestrator copywriter voiceover director captions

Project-setup = точка входа. Без него остальные не знают «о каком клиенте речь». Запускается один раз; после этого можно сразу или генерить клипы (clipgen через Veo), или импортировать свои (analyzer) — и потом гонять полный pipeline через orchestrator.

После сетапа: первое что обычно нужно — наполнить clip library (clipgen или analyzer) и добавить голоса (voiceover add-voice). После этого orchestrator сможет запустить полный pipeline.