Community编程与开发github.com

skailabinfo/claude-video-harness

Первичная настройка проекта под нового пользователя — проверка окружения и подробное интервью (кто ты; ~10 рилсов-референсов и разбор вкуса; расшифровка; подключение сервисов с проверкой доступа; палитра; шрифты; субтитры, графика, движение, звук), с показом вариантов готовыми кадрами; запись harness.config.json, brand-kit.md, editing-taste.md, exemplars.md. Запускай, когда в harness.config.json "configured" false, или когда пользователь просит перенастроить проект / сменить стиль / заново разобрать референсы.

claude-video-harness 是什么?

Этот навык автоматизирует первоначальную настройку проекта по монтажу вертикальных видео. Он проводит подробное интервью с пользователем, анализирует его референсы (рилсы) и профиль вкуса, настраивает сервисы (например, ElevenLabs, Higgsfield, 21st.dev, Buffer) и генерирует конфигурационные файлы (harness.config.json, brand-kit.md, editing-taste.md, exemplars.md). Основная цель — создать пайплайн, который монтирует видео в строго индивидуальном стиле пользователя, а не по шаблону. Навык запускается, когда проект новый, или когда пользователь просит перенастроить проект, сменить стиль или заново разобрать референсы. Он поддерживает Claude Code и использует Remotion для рендеринга, а также взаимодействует с внешними сервисами через API.

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/skailabinfo/claude-video-harness/tree/HEAD/.claude/skills/setup

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Настройка проекта

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

У проекта нет своего стиля. Всё, что касается вида ролика — палитра, шрифты, субтитры, карточки, стикеры, постер, темп, панч-ины, грейд, звук, — выбирает пользователь или берётся из его референсов. Ты не предлагаешь «стандартный» или «популярный» вариант, не подставляешь свои предпочтения и ничего из того, что уже лежит в проекте (заглушки в 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 local
    
    Нет claude в PATH — дай эту команду пользователю выполнить в терминале.
  • OAuth (Higgsfield, Buffer, по желанию ElevenLabs MCP): допиши выбранные серверы в корневой .mcp.json:
    {
      "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" }
      }
    }
    
    Вход через браузер — после перезапуска Claude Code (/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
}

Скажи: «Готово. Теперь для монтажа нового ролика скажи "смонтируй" или "новый рилс". Если захочешь что-то поменять — скажи "настрой субтитры", "смени палитру" или "перенастрой проект"».

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相关技能