O bot escreve os roteiros e PARA. Você grava os avatares no HeyGen; quando terminar, libera e ele baixa, monta os reels 9:16 e entrega em cada canal.

Este é o repo de domínio do fluxo /promoavatar do inemaccbot. Aqui não há uma linha de TypeScript — só o flow.json, os prompts e a ajuda do chat. Um fluxo novo é uma entrada no registry do bot mais um repo como este.
São 12: pessoacomum · jovens · profissionais · mulheres · empreendedores · tecnicos · 40mais · 60mais · educadores · criadores · recolocacao · familia. Cada um com canal e gancho próprios.
O bot para depois do texto (antes de gastar avatar) e depois do baixar (antes de gastar render). Discordar de um roteiro no portão custa um texto refeito, não 12 avatares gravados na mão.
flow.json, prompts e opções são congelados quando o fluxo nasce. Editar vale para os PRÓXIMOS — nem /refazer pega a mudança.
Quatro fases e dois portões. Os portões são o "pausa_apos": true das fases texto e baixar no flow.json — o pipeline para sozinho ali e só anda quando você libera.
Um roteiro por público, gravado em textos/A<N>/<publico>.md. O chat te manda cada roteiro junto com o TÍTULO exato do vídeo. Portão 1 logo depois.
Normalmente você, no estúdio do HeyGen. Existem 5 rotas para esta fase — a tabela abaixo.
Acha o vídeo no HeyGen pelo título e baixa o MP4 — com a legenda queimada se o estúdio gravou com ela, limpo se não. Janela de 90 minutos. Portão 2 depois.
Monta o reel 9:16 (capa de impacto com o gatilho do público) e entrega direto na pasta do canal daquele público. Não existe fase separada de publicação.
As quatro automáticas são fases com a chave opcional no flow.json. A quinta é a ausência de todas elas.
Nenhuma flag ligada. Você grava no HeyGen e o bot nem sabe como — só espera o /aprovar.
Fase estudio (opcional: estudio). O bot abre/prepara o estúdio, você conclui.
Fase gerar (opcional: api). O BOT gera — gasta da carteira pré-paga da HeyGen, ~US$ 1 por minuto.
Fase gerar-creditos (opcional: creditos). Mesma geração, consumindo créditos.
Fase navega-avatar (opcional: navega). Agente LLM clonando o TEMPLATE-AVATAR. A rota mais cara: ~17,8k tokens por público, ~214k no fluxo de 12.
O título. Em qualquer rota o vídeo tem que se chamar A<N>-<publico>-v1. Na rota manual isso é 100% responsabilidade sua.
Documentadas no chat: | api e | estudio. As flags de creditos e navega existem como fase no flow.json mas não estão no HELP.md — confirme antes de usar.
Ficam em templates/. Todos 1080×1920, fundo #0E1116, acento âmbar #F5A623.
Topo: imagem 704px + headline. Meio: avatar 608px (áudio). Base: painel de texto 608px (hook). A capa de impacto — o formato original.
Igual, mas a base vira o vídeo explicativo daquela fala, mudo e em loop. Use quando o explicativo existe em vídeo.
Metade e metade: imagem 960px em cima, avatar 960px embaixo. Sem terceira faixa. Bom para mito×realidade e comparação, onde a imagem carrega o contraste.
A imagem ocupa o quadro inteiro; o avatar entra num recorte no topo-direita. O rodapé é proibido: a interface da rede cobre o canto inferior e o avatar não apareceria.
A fase 1 grava a linha Formato escolhido: em cada <publico>.md (o PASSO ZERO do prompt), e o templates/mapa.json traduz. No A#19 real isso deu 9 formatos diferentes para 12 públicos — variação de verdade, sem ninguém decidir nada em tempo de render.
# precedência (resolvida pelo preparar.py)
--template explícito
› template do ALVO no flow.json
› mapa.json
› template da raiz do flow.json
Cada faixa declara uma fonte: imagens, avatar, texto ou explicativo. A headline vai no topo; o hook vai no painel de base. Layout com base e hook faltando = base preta — foi o A#23, com hook em 0 de 8 imagens. Por isso o prompt manda escrever hook sempre, mesmo nos layouts sem base.
Este repo sozinho não roda nada — ele é lido pelo bot. O que você precisa é o bot no ar, uma conta HeyGen e as pastas de canal.
O fluxo é executado pelo bot, com este repo declarado em config/fluxos.json.
# no chat autorizado /fluxos /promoavatar help
É onde você grava os avatares, na pausa entre as fases 1 e 2. O download casa por nome exato do vídeo.
# o título é o contrato A<N>-<publico>-v1 # ex.: A8-mulheres-v1
O canal do público vira pasta por regra derivada — o caminho não está escrito em lugar nenhum.
# criar um canal novo mkdir -p ~/projetos/yt-pub-lives33/imports/videos
Todos os comandos são digitados no chat do Telegram, no bot autorizado.
| sombra imprime fase × público × fila × tarefa e não enfileira nada. Rodar os 12 públicos são 12 avatares gravados na mão — o normal é filtrar.
/promoavatar Não comece aprendendo ferramentas | sombra
Sem filtro vão os 12. Para testar barato, um público só. O | e o -- convivem — mas campo escrito sem um dos dois é RECUSADO, não vira assunto em silêncio.
/promoavatar <assunto> # os 12 públicos /promoavatar <assunto> | alvos=mulheres # barato p/ testar /promoavatar <assunto> --alvo=jovens --alvo=40mais /promoavatar <assunto> | legenda # padrão é SEM legenda
Assunto em aberto ("isso é bom ou ruim?") fazia o agente explicar os dois lados e fechar morno — e ninguém comenta com equilibrista. Hoje o prompt manda cravar um lado e dizer no resumo qual foi. A posição que você mandar vence a dele, então escrever a sua continua sendo o melhor caminho.
# melhor: sua posição + um fato concreto + a pergunta # que você quer nos comentários
O bot manda cada roteiro no chat e PARA. É aqui que discordar é barato: /refazer custa um texto, não um render.
/status A#7 # fase × público, e os títulos /refazer A#7 mulheres # só o público que não ficou bom
No estúdio, o vídeo precisa se chamar exatamente A<N>-<publico>-v1. O download casa por igualdade exata de string: nome diferente = vídeo nunca encontrado, e a fase expira em 90 minutos. O chat te manda o título pronto justamente para não ser digitado de memória.
A7-mulheres-v1 A7-jovens-v1 # a legenda do avatar se decide AQUI: gravou com ela, o reel # sai com ela — e não há como removê-la depois. Nesse caso, # crie o fluxo SEM | legenda, senão saem duas.
"Terminei minha parte." O bot então baixa os vídeos, monta os reels e entrega em cada canal.
/aprovar A#7 # sinônimos: /pronto, /aprovado, /ok
Se um público falhar, refaça só ele — as tentativas dele são zeradas. Cancelar é sobre o pipeline: o que já foi criado no estúdio continua lá.
/status A#7 /refazer A#7 mulheres /cancelar A#7 [publico]
A regra: o que é decisão de público ou de campanha mora neste repo; o que é identidade visual da marca mora na skill. A skill é global — mexer nela muda TODO reel, inclusive os disparados direto no chat.
O canal e o gancho de cada público, como os roteiros são escritos, o que este pipeline pede ao reel, o clipe de CTA do fim e a ajuda do chat.
flow.json # alvos.<publico>.canal / .gatilho prompts/fase1-texto.md # como os roteiros são escritos cta/cta-9x16.mp4 # troque o arquivo HELP.md # /promoavatar help
Como o reel é MONTADO (cores, fontes, posições, SFX) é da skill global; filas, timeouts, modelo e esforço são do bot.
# skill (global — muda a marca inteira) ~/.claude/skills/reel-edita-inema/SKILL.md # bot inemaccbot/prompts/reel.md inemaccbot/config/skills.json
Melhorar o reel, na ordem do mais barato: trocar o clipe de cta/ → ajustar o entrega do flow.json → e só então mexer na skill.
O domínio diz para quem (mulheres tem "canal": "lives4"); o bot sabe onde — sempre ~/projetos/yt-pub-<canal>/imports/videos. Nunca ponha caminho no flow.json.
Quem decide a legenda do avatar é o estúdio: o download pega a versão legendada quando ela existe, e a limpa quando não. A opção | legenda é outra — é a que o nosso editor desenha. Ligar as duas faz sair duas; e legenda queimada vem enquadrada para 16:9, sem remoção possível depois.
As quatro coisas que você mais vai querer mexer. Todas seguem a mesma trava: o que vale é o que existia quando o fluxo nasceu — editar vale para os PRÓXIMOS, e nem /refazer pega a mudança.
Arquivo: prompts/fase1-texto.md. É o documento inteiro que a fase 1 entrega ao agente — CONTEXTO FIXO, PASSO ZERO, OFICINA DE GANCHO, as 16 REGRAS DE ESCRITA e o contrato de saída.
Duas armadilhas: os 11 formatos do PASSO ZERO são chaves do templates/mapa.json — renomeou aqui, renomeie lá. E as cinco variáveis injetadas pelo bot não podem sumir:
{{input}} # o assunto
{{publicos}} # os alvos REAIS do fluxo
{{pasta}} # onde gravar (absoluto)
{{ref}} {{saida}}
A skill inemaclub-textos dá a estrutura do arquivo; este prompt dá as regras e sobrescreve a skill. Mudar a estrutura é na skill — e vale para todo mundo.
a) mudar como um layout se parece → edite templates/<nome>.json. Três regras:
y + altura das faixas têm que fechar 1920 (y é posição absoluta, elas não se empilham sozinhas — faixa faltando é faixa preta). A fonte é o que alimenta a faixa: imagens · avatar · texto (o hook) · explicativo. E escurecer é o véu sob a headline: baixo demais, o texto some no claro da foto.
b) mudar qual formato cai em qual layout → templates/mapa.json. As chaves existem com e sem acento, de propósito:
"mito versus realidade": "diptico", "comparação": "diptico", "comparacao": "diptico"
Formato fora do mapa cai no padrão da raiz — não inventa layout. c) Para fixar o layout de um público, use o campo template dentro do alvo.
Arquivo: flow.json, chave alvos.
"empreendedores": {
"canal": "lives1",
"gatilho": "Transforme IA em redução de custos…",
"template": "diptico" # opcional
}
O gatilho é a dor daquele público (a regra 2 do prompt manda usá-lo). Adicionar = mais uma entrada; remover = apague. Para rodar só alguns sem mexer em nada, use --alvo= na criação.
A chave é contrato, não rótulo: ela vira o arquivo textos/A<N>/<publico>.md, o título A<N>-<publico>-v1, o --alvo do reel e o seed-key das imagens. Minúsculas, sem acento, sem espaço e sem hífen — foi por isso que pessoa-comum virou pessoacomum.
Não existe caminho escrito em lugar nenhum: o destino é derivado do canal do público.
<canal> → ~/projetos/yt-pub-<canal>/imports/videos
Trocar o canal = editar alvos.<publico>.canal. Criar canal novo = criar a pasta, só isso:
mkdir -p ~/projetos/yt-pub-lives33/imports/videos
Dois públicos podem dividir o mesmo canal. Mudar a regra (a pasta base, o imports/videos) não é aqui — é o destinos.ts do bot, e muda todos os fluxos. Para um reel avulso fora do fluxo, use montar-reel.py --saida <caminho>.
Este repo é domínio: ele declara o pipeline. Quem executa é o inemaccbot. Procurar aqui uma coisa que é de lá é a perda de tempo mais comum — a lista abaixo é justamente o que não está neste repo.
/promoavatar, /status, /aprovar, /refazer, /cancelar e o parser de | e -- são do bot. Aqui só existe o HELP.md, que é o TEXTO da ajuda — não o código dela.
Filas (texto, io, navegador, render), tentativas, timeouts, o congelamento na criação e o próprio conceito de portão. O flow.json só declara; quem obedece é o bot (inemaccbot/config/skills.json).
heygen.*heygen.gerar, heygen.estudio, heygen.baixar são nomes de funções que vivem no bot (inemaccbot/src/fila/tarefas/heygen.ts) — inclusive o escolherUrl, que decide entre o MP4 legendado e o limpo.
state/artefatos/fluxos/A<N>/ fica no repo do BOT, não aqui. É lá que os avatares baixados aterrissam.
~/projetos/yt-pub-<canal>/imports/videos é regra derivada pelo bot. O caminho não está escrito em lugar nenhum — aqui só existe o nome do canal.
Cores, fontes, posições, corte de silêncio e SFX são da skill global ~/.claude/skills/reel-edita-inema/SKILL.md. Mexer ali muda TODO reel da marca, inclusive os disparados direto no chat.
A regra de bolso: se a resposta muda o comportamento de todos os fluxos, não é daqui. Se muda só o promoavatar, é daqui.
A fase 3 chama scripts/montar-reel.py. Dá para rodar direto, fora do bot — útil para refazer um reel sem gastar fluxo.
--avatar # obrigatório: o MP4 do HeyGen --ws # obrigatório: workspace do reel --alvo # público; vira o seed-key das imagens --textos # o <publico>.md (seção ## IMAGENS) --template # override de layout (vence tudo) --flow --mapa # de onde resolver template e mapa --qualidade # high (padrão) · standard · draft --cta --sem-cta # o clipe de fecho --pular-preparo # reaproveita o preparo do --ws --saida # destino do MP4
preparar.py tem as mesmas, mais --explicativo, --sem-imagens, --sem-transcricao e --sem-montar.
# reel padrão — layout sai do mapa python3 scripts/montar-reel.py \ --avatar A34-jovens-v1.mp4 \ --ws /tmp/ws-A34-jovens --alvo jovens \ --textos textos/A34/jovens.md --flow flow.json # rascunho barato, só p/ ver enquadramento ... --qualidade draft --sem-cta # forçar layout, ignorando o mapa ... --template imagem-plena # trocar CTA sem regerar imagem ... --pular-preparo --saida saida/A34-jovens.mp4