Настройка проекта
Цель: превратить чистый клон в пайплайн, который монтирует в стиле этого человека — понять, что ему нравится, подключить его сервисы и показать кадры его будущего ролика. Говори на языке пользователя, коротко и по-человечески.
У проекта нет своего стиля. Всё, что касается вида ролика — палитра, шрифты, субтитры, карточки, стикеры, постер, темп, панч-ины, грейд, звук, — выбирает пользователь или берётся из его референсов. Ты не предлагаешь «стандартный» или «популярный» вариант, не подставляешь свои предпочтения и ничего из того, что уже лежит в проекте (заглушки в harness.config.json и демо — не стиль, а пустое место).
Правила интервью
- Один блок — одно сообщение, блоки никогда не склеиваются. Не клади два блока в одну форму
AskUserQuestion: пачку вопросов люди прощёлкивают по первому варианту. Блоки 4 (сервисы), 6 (палитра), 7 (шрифты), 8 (вид монтажа) — разговор из нескольких сообщений. - Без «(рекомендую)» на вкусе. Пометка допустима только у чисто технического выбора — способ расшифровки (блок 3). У цветов, шрифтов, стиля, сервисов и вопросов о человеке её нет; варианты описывай нейтрально, что каждый даёт.
- Варианты — из ответов и референсов человека. Если ни ответов, ни референсов нет — собери 2–3 заметно разных варианта под его тему и тон и покажи кадрами; выбор за ним.
- Показывай, а не описывай: палитру, шрифты и вид монтажа — готовыми кадрами через
video/scripts/variants.py. - Пропуск блока («пропусти») — только по слову пользователя. Тогда в профиле остаётся нейтральная заглушка, и это прямо скажи: «позже можно настроить — скажи "настрой субтитры"».
- Ничего не угадывай о человеке. Бренд, имя, тему, аудиторию и тон — только из его ответов, не из почты аккаунта, имени в системе, названия папки или ссылки на репозиторий. Имя аккаунта в ссылке на репозиторий — это автор шаблона, а не пользователь.
- Технику не выносим на интервью: safe-зоны, нарезка без обрезанных хвостов, двухпроходный loudnorm, механика панч-инов на склейках — это не вкус, а то, как пайплайн работает (
CLAUDE.md, «Механика»). - Ключи никогда не проходят через чат. Пользователь вписывает их сам в
video/.env; ты проверяешь доступ черезdoctor.sh, ничего не печатая. Прислал ключ в чат — не используй, посоветуй отозвать и создать новый. - Всё, что ставится через
brew/pipили весит много, — сначала «что и сколько», потом «да».
Шаг 0. Приветствие (одно сообщение)
Две-три строки: это монтаж вертикальных роликов «говорящая голова» через Claude Code + Remotion; своего стиля у проекта нет — сейчас настроим всё под тебя: расскажешь о себе, скинешь ~10 рилсов, которые нравятся, выберем цвета, шрифты и вид монтажа (я покажу варианты кадрами), подключим нужные сервисы. Сразу переходи к шагу 1.
Шаг 1. Окружение
cd video && ( [ -d node_modules ] || npm install ) && bash scripts/doctor.sh
Покажи итог короткой таблицей. По каждому MISSING предложи команду из вывода и, получив согласие, выполни:
- Remotion-скиллы (обязательно):
npx -y skills add remotion-dev/skills --skill '*' --agent claude-code -yиз корня проекта. ffmpeg,node,python3,yt-dlp(для референсов) —brew install …(macOS); Linux — пакетный менеджер; Windows — WSL.- whisper / rembg — когда понадобятся по ответам (шаг 3).
Нет brew — дай ссылку https://brew.sh и подожди (установка спрашивает пароль, её делает сам пользователь).
Шаг 2. Интервью
Блок 1 — кто ты
Бренд / название канала; кто в кадре; о чём ролики; площадки и хэндлы (Reels, TikTok, Shorts, Telegram…); аудитория; тон; язык роликов; финальный призыв.
Спрашивай открыто — пусть ответит своими словами, хоть одним сообщением. Если даёшь варианты (для тона или призыва), они нейтральные и одинаковые для любого человека, без подставленной темы или ниши.
Блок 2 — референсы (~10 рилсов)
Попроси: «Скинь около 10 ссылок на рилсы, которые тебе нравятся по монтажу — Instagram, TikTok или Shorts. Лучше те, на которые хотелось бы быть похожим. По ним я пойму твой вкус: темп, субтитры, графику, цвета, шрифты». Меньше 5 — попроси ещё: из 3 роликов общий вкус не вычленить. Объясни, что без референсов придётся подробнее расспросить в блоках 6–8.
Получив ссылки — сразу запусти разбор в фоне и переходи к блоку 3:
cd video && python3 scripts/refs.py "URL1" "URL2" … > ../takes/refs.log 2>&1 # run_in_background
Скрипт скачивает в takes/refs/ (в git не попадает) и меряет: длительность, частоту смены картинки, смены в хуке, громкость, темп речи, первую фразу, яркие цвета (palette.png); рисует NN-sheet.jpg (24 кадра на ролик) и NN-hook.jpg (первые 3 с). Если часть ссылок FAILED с требованием входа — варианты из SERVICES.md → «Instagram»: перезапуск с COOKIES_FROM=chrome (только с явного «да») или пусть скачает сам и положит mp4 в takes/refs/ (тогда передай пути вместо ссылок).
Блок 3 — расшифровка речи
- whisper.cpp локально (рекомендую на Mac): бесплатно, оффлайн;
brew install whisper-cpp+ модель large-v3-turbo 1.6 ГБ. - ElevenLabs Scribe: платно (кредиты), ничего не ставить, работает на любой системе; нужен ключ (блок 4).
Блок 4 — сервисы (по одному сообщению на сервис)
Не спрашивай одним вопросом «что подключить?». Пройди по сервисам по очереди — одно сообщение на сервис: что он даст в монтаже (1–2 строки с примером), сколько стоит, что нужно от пользователя и сколько займёт. Вопрос: «подключаем сейчас / позже / не нужно».
| сервис | что даст в монтаже | доступ | время |
|---|---|---|---|
| ElevenLabs | расшифровка Scribe; звуковые акценты под твой вкус; озвучка | API-ключ | ~3 мин |
| Higgsfield | короткие видеовставки (б-ролл), когда говоришь о том, что можно показать | вход через браузер | ~2 мин + после перезапуска |
| 21st.dev | готовые React-компоненты как основа новой графики | API-ключ | ~3 мин |
| Buffer | черновики постов в Reels / TikTok / Shorts | вход через браузер + каналы в Buffer | ~5 мин |
Порядок: ElevenLabs → Higgsfield → 21st.dev → Buffer. Если в блоке 3 выбран Scribe — ElevenLabs обязателен, так и скажи. «Позже» и «не нужно» — нормальные ответы.
Каждый, на который ответили «сейчас», — проведи по разделу из SERVICES.md: ссылки и шаги своими словами, дождись «готово», настрой свою часть и проверь:
- Ключи (ElevenLabs, 21st.dev): если
video/.envнет —cp video/.env.example video/.env; пользователь вписывает ключ сам (open -e video/.env). Проверка —bash video/scripts/doctor.sh, разделaccess. Отклонён — скорее всего скопирован не полностью или без нужных прав; пусть создаст новый. - 21st.dev: после проверки ключа добавь сервер локально (ключ читается из
.envпрямо в шелле):Нетcd video && set -a && . ./.env && set +a && cd .. && claude mcp add --transport http 21st https://21st.dev/api/mcp --header "x-api-key: $TWENTYFIRST_API_KEY" --scope localclaudeв PATH — дай эту команду пользователю выполнить в терминале. - OAuth (Higgsfield, Buffer, по желанию ElevenLabs MCP): допиши выбранные серверы в корневой
.mcp.json:Вход через браузер — после перезапуска Claude Code ({ "mcpServers": { "higgsfield": { "type": "http", "url": "https://mcp.higgsfield.ai/mcp" }, "buffer": { "type": "http", "url": "https://mcp.buffer.com/mcp" }, "elevenlabs": { "type": "http", "url": "https://api.elevenlabs.io/v1/mcp" } } }/mcp→ сервер → Authenticate): скажи сейчас и напомни в шаге 5. Для Buffer попроси заранее подключить каналы в самом Buffer (Instagram — профессиональный аккаунт).
Отметь подключённые в integrations. Застрял на сервисе 15+ минут — предложи отложить: «подключим позже — скажи "подключи Buffer"».
Блок 5 — что тебе нравится (по референсам)
Дождись конца разбора (ps -axo command | grep "[r]efs.py"), прочитай takes/refs/refs.json, посмотри каждый NN-hook.jpg и NN-sheet.jpg и palette.png. По каждому ролику отметь то, чего не видят цифры: субтитры (где, размер, регистр, жирность, цвет, выделение слов, подложка), графика (карточки и их вид, стикеры, скриншоты, б-ролл, эмодзи), крупность и панч-ины, доля голого лица, палитра графики, шрифты, что в хуке (текст-постер, вопрос, действие), концовка.
Сведи в «профиль вкуса»: 5–7 закономерностей, которые есть хотя бы у половины роликов, с цифрами (медианы из refs.py). Покажи одним сообщением и спроси: «это про тебя? что из этого хочешь у себя, а что нет?». Принятое станет предложениями в блоках 6–8 — там ты показываешь его кадрами рядом с другими вариантами, а не применяешь молча. Что не ложится на настройки (эмодзи-стикеры, зелёный экран…) — запиши пожеланием в профиль.
Блок 6 — палитра (2–3 сообщения)
6.1 Вопросы — одним сообщением, открытым текстом:
- Есть ли фирменные цвета — логотип, сайт, оформление канала, обложки? Пришли hex, ссылку на сайт или положи логотип / скриншот в
takes/brand/. - Что в роликах должно выделяться цветом: цифры, ключевые слова, призывы?
- Какое ощущение нужно: строгое, тёплое, яркое, спокойное?
- Каких цветов точно не надо?
Прислал картинку — вытащи основные цвета:
python3 -c "
from PIL import Image; import sys
im = Image.open(sys.argv[1]).convert('RGB').resize((200, 200)).quantize(6)
pal = im.getpalette(); cnt = sorted(im.getcolors(), reverse=True)
print([('#%02X%02X%02X' % tuple(pal[i*3:i*3+3]), round(100*n/40000)) for n, i in cnt])
" takes/brand/logo.png
Ссылку на сайт — открой и найди основные цвета (логотип, кнопки, CSS-переменные).
6.2 Кандидаты — 2–3 палитры по четырём ролям: dark (плашки, скримы), light (текст), accent (выделение), pain (карточка «так не надо», если она ему нужна):
- из референсов —
recurring_coloursвrefs.jsonиpalette.png; сверься с раскадровками, что цвет — графика или текст, а не стена, предмет в кадре или кожа; - из фирменных цветов, если есть;
- по ответам 6.1 — ощущение и что выделять.
Читаемость (техника, не вкус): текст на плашке и поверх футажа должен читаться — проверь контраст каждого кандидата (light на dark ≥ 7:1, accent на dark ≥ 3:1); если кандидат не проходит — скажи и предложи ближайший, который проходит:
python3 -c "
import sys
def L(h):
c=[int(h[i:i+2],16)/255 for i in (1,3,5)]
c=[x/12.92 if x<=0.03928 else ((x+0.055)/1.055)**2.4 for x in c]
return 0.2126*c[0]+0.7152*c[1]+0.0722*c[2]
a,b=sorted([L(sys.argv[1]),L(sys.argv[2])]); print(round((b+0.05)/(a+0.05),1))
" '#FFFFFF' '#141414'
6.3 Покажи кадрами:
cd video && python3 scripts/variants.py out/palette-options.png 70,368 \
'{"label":"A","colors":{"dark":"#…","light":"#…","accent":"#…","pain":"#…"}}' \
'{"label":"B","colors":{…}}' '{"label":"C","colors":{…}}'
Покажи лист (SendUserFile), подпиши: «A — из твоих референсов, B — из логотипа, C — по ощущению». Правки («A, но акцент темнее») — новый прогон. Выбранное — в colors.
Блок 7 — шрифты (2–3 сообщения)
Два шрифта: текст (субтитры и карточки, веса 500 / 600 / 700) и постер (заголовок в начале ролика, если он будет). Оба обязаны поддерживать алфавит языка роликов.
7.1 Вопросы — одним сообщением: есть ли фирменные шрифты (названия или файлы в takes/brand/); какой характер — строгий, дружелюбный, технологичный, редакционный; субтитры лёгкие или плотные.
Если был блок 2 — посмотри субтитры и заголовки на раскадровках и скажи, что видишь: тип (геометрический гротеск, нео-гротеск, узкий, округлый, с засечками), жирность, регистр. Точное название по картинке не угадывай — подбирай похожий свободный шрифт.
7.2 Кандидаты — 2–3 пары «текст + постер» из @fontsource с нужным алфавитом, разные по характеру, под его ответы и референсы. Для русского проверяй кириллицу; Bebas Neue — только латиница. Купленный фирменный шрифт — в video/src/fonts/ + @font-face с font-display: block вручную; напомни про лицензию, если репозиторий публичный.
7.3 Покажи кадрами:
cd video && npm i @fontsource/<a> @fontsource/<b> # кандидаты
ls node_modules/@fontsource/<a>/ | grep -c cyrillic # для ru > 0
ls node_modules/@fontsource/<a>/ | grep -E '^[0-9]+\.css$' # доступные веса
grep -m1 font-family node_modules/@fontsource/<a>/400.css # точное имя семейства
Добавь в video/src/index.css импорты весов кандидатов (@import "@fontsource/<a>/600.css"; …), затем:
python3 scripts/variants.py out/font-options.png 70,368 \
'{"label":"A","fonts":{"text":"…","poster":"…","posterWeight":700}}' '{"label":"B","fonts":{…}}'
Покажи, подпиши. После выбора оставь в index.css только выбранные импорты и удали лишние пакеты (npm un …).
Блок 8 — вид монтажа (по одному сообщению на тему)
Четыре темы, каждая — отдельным сообщением: вопрос, что видно в референсах («в 7 из 10 субтитры по центру, крупные»), затем 2–3 варианта кадрами через variants.py (ключи style.*, кадры 70,270,368). Без «рекомендую».
8.1 Субтитры (style.captions):
- где:
cycle— фразы гуляют по кадру (верх-лево → верх-право → низ);rail— всегда внизу;center— по центру; - размер
size: [обычное слово, выделенное]в px (≈ 48 мелко, 60 средне, 76 крупно); - жирность
weight(500–800); регистрcase:lower/asis/upper; - выделение
highlight:color(ключевые слова цветом акцента) /size(крупнее) /both/none; - подложка
box:true— плашка под строкой,false— тень.
8.2 Графика:
- карточки
style.cards:glass(полупрозрачное стекло) /solid(плотная плашка) /none; как часто — словами вediting-taste.md§3; - стикеры-пиктограммы в паузах
style.stickers:true/false; - постер-заголовок за головой в начале
style.poster:enabled, регистрcase(upper/asis), маленький подзаголовокkicker. Включён — нужен rembg (~30 мин фоном на ролик, модель ~1 ГБ один раз); - б-ролл (если подключён Higgsfield): нужен ли, сколько — словами в
brand-kit.md§5.
8.3 Движение и картинка:
- темп смены кадра
style.pace:calm(длинные планы, мало нарезки),dynamic(средняя частота, заметная энергия),fast(короткие планы, много перебивок); - панч-ины
style.punchIns:subtle(небольшое приближение на ключевых моментах),bold(заметный зум на акцентах) /none; - грейд
style.grade:natural/warm/cool/contrasted; - гамма
style.gamma:dark/balanced/bright.
8.4 Звук:
- фоновая музыка
style.music:calm/energetic/tech/none; громкостьmusicVolume(0–100%); - звуковые эффекты
style.sfx:subtle/bold/none; - вокал акцент (если подключён ElevenLabs)
style.vocalAccents:true/false.
Блок 9 — итоги (одно сообщение)
Собери вишлист в editing-taste.md (всё из блоков 1–8, что выбрано или записано как пожелание) и brand-kit.md (бренд, цвета, шрифты, тон). Напиши harness.config.json:
{
"configured": true,
"language": "ru",
"user": "…",
"services": ["elevenlabs"],
"colors": {"dark": "#…", "light": "#…", "accent": "#…"},
"fonts": {"text": "…", "poster": "…"},
"captions": {"position": "cycle", "size": [60, 76], "weight": 600, "case": "asis", "highlight": "color", "box": true},
"cards": "glass",
"stickers": false,
"poster": {"enabled": true, "case": "upper", "kicker": true},
"pace": "dynamic",
"punchIns": "bold",
"grade": "natural",
"gamma": "balanced",
"music": "energetic",
"musicVolume": 30,
"sfx": "subtle",
"vocalAccents": false
}
Скажи: «Готово. Теперь для монтажа нового ролика скажи "смонтируй" или "новый рилс". Если захочешь что-то поменять — скажи "настрой субтитры", "смени палитру" или "перенастрой проект"».