Repository navigation
Releases: engenheirodevideo/get-brolls
Release list
GET B-ROLLS 2.5.0
- Logs. Cada projeto ganha
brolls/getbrolls.log: uma linhachave=valorpor evento, com permissão 0600, que gira a cada ~1 MB e guarda 3 cópias. Fica registrado o que antes não deixava rastro: início e fim de cada comando (só o nome das opções, nunca o valor), cada passo da trilha (search,resolve,inspect,preview,approve,reject,permit,fetch,verify,deliver,import-review), cada chamada deffmpeg,ffprobe,yt-dlpecurlcom duração e código de saída, cada pedido de rede (host, status, bytes, cache, tentativas, recusa por endereço privado, teto de tamanho), qual regra do RULES.md bloqueou um candidato, por que a fila está esperando, acerto e erro do cache de fontes e o modo de cada entrega. Nunca entram no log: nome de quem aprovou, frase de aprovação, motivo de rejeição, evidência de direitos, texto de busca, títulos, canais, URLs (só o host) nem linha de comando de subprocesso; todo registro ainda passa pela redação de chaves e a pasta pessoal vira~.GB_LOG_LEVEL(DEBUG,INFO,WARNING,ERROR,off; padrãoINFO) eGB_LOG_STDERR=1(espelha em stderr para depurar) entram no.env. A saída padrão continua sendo um único JSON, o envelope de erro continua a última linha de stderr, comando de leitura não cria o arquivo e falha de log nunca derruba um comando.statusganhaloge os envelopes de erro ganhamapp_log.diagnostics.jsonlsegue como está. - Trilha de aprovação.
reject(pela CLI e pelo Storyboard) passa a zeraroutput: um candidato rejeitado depois de coletado continuava naentrega/e contava como rejeitado e entregue ao mesmo tempo. Nada é apagado debrolls/.approveremove arejectionantiga, para o item não parecer rejeitado e aprovado.verifygravaoutput.verified: false(e o estado volta aapproved) quando o arquivo não bate com o sha256 registrado, sumiu ou não decodifica — antes o manifesto seguia dizendo "verificado" e umdeliverposterior entregava o arquivo alterado com o hash antigo noORIGEM.md; umaverifylimpa depois de restaurar o arquivo volta a marcar. A conferência passa por todos os clipes antes de falhar, para que um segundo arquivo alterado não continue marcado como verificado.import-reviewsem--filedesempata decisões salvas no mesmo segundo pelo sufixo numérico do nome, não pela ordem alfabética, que escolhia a mais velha.manifest.jsoncomschema_versiondesconhecido num item é recusado; item sem a chave continua valendo. A versão precisa ser um inteiro de verdade:truee1.0deixam de passar, no item e notemplateVersiondo arquivo de decisões. - Entrega.
deliverrecusa rodar quandoentrega/é um link simbólico (a limpeza seguia o link e apagava arquivos da pasta de destino) e toda remoção é confinada àentrega/real do projeto. Links que a própria pessoa criou dentro deentrega/não são mais apagados. Clipe com integridade reprovada ou rejeitado não é entregue e aparece emskipped, com o motivo. Vale para qualquerverifiedfalso no manifesto (false,0,null), não só parafalse. Uma pasta de beat que seja link simbólico dentro deentrega/é deixada em paz em vez de quebrar a entrega. Falha de disco ou de permissão ao comparar arquivos é relatada como tal, não como "parece edição sua", e não conseguir marcar o arquivo entregue como somente leitura vira aviso. - Storyboard local. Toda resposta do
servelevaX-Frame-Options: DENY,Content-Security-Policy: frame-ancestors 'none',X-Content-Type-Options: nosniffeReferrer-Policy: no-referrer: outra página não consegue mais embutir a revisão para induzir um clique de aprovação. O servidor entrega só o que a página usa (review.html,previews/,clips/);manifest.json,diagnostics.jsonl,.serve.pid,reviews/e listagens de pasta respondem 404. A decisão é tomada sobre o arquivo que o servidor abriria, não sobre o texto da URL, então um..codificado (%2e%2e) não sai depreviews/nem declips/. Um byte nulo na URL vira 404 em vez de derrubar a thread do servidor, uma pastapreviews/ouclips/que seja link simbólico não é servida, e o log rotacionado do servidor já nasce 0600 sem seguir link..serve.pide.serve.lognascem com permissão 0600 e o processo em segundo plano não herda mais as chaves de provedor. Nada muda na página nem no fluxo de revisão. - Falhas visíveis. Um
~/.getbrolls/RULES.mdilegível agora para o comando com erro nomeando o arquivo: antes virava aviso e os bloqueios dele (blocked_domains,asset_types) deixavam de valer em silêncio. Arquivo ausente continua inofensivo. Erro interno no download não aparece mais como erro de provedor; biblioteca de aprendizados corrompida vira aviso (LIBRARY_INDEX_UNREADABLE) em vez de parecer vazia; a checagem ao vivo de provedores diz quando a falha é bug e inclui o tipo do erro. - Privacidade local.
.getbrolls-sources/passa a 0700 e a mídia de trabalho a 0600, como o restante do cache privado;diagnostics.jsonla 0600. No arquivo de diagnóstico e nos camposrepr/tracebacka pasta pessoal aparece como~; a mensagem de erro mantém o caminho real, porque é dela que a pessoa copia. A redação cobre tambémAuthorization,Cookie,Set-Cookie,X-Api-Key(inclusive em cabeçalhos impressos como dicionário),Bearer …solto e valores dekey=,token=,secret=,password=,signature=,sig=,policy=,api_key=,access_token=,X-Amz-Signature=eKey-Pair-Id=; nomes que só terminam nessas palavras (monkey=) ficam como estão, e o padrão é linear mesmo em texto adversarial. Nogetbrolls.log, cada campo é redigido antes de ser cortado em 500 caracteres e caracteres de controle saem escapados. Sem efeito no Windows para as permissões. - Testes: 90 testes novos dirigem aprovação, direitos, coleta, conferência, entrega, revisão e o servidor local pelo caminho real da CLI, e
tests/test_cli_surface.pycompara toda a superfície doargparsecom um fixture estrutural igual do Python 3.11 ao 3.14. CI:persist-credentials: falseno checkout. .env.examplereescrito em inglês, por seção (prévias, chaves de provedor, regras e brief, pasta pessoal, caminhos de ferramentas, fonte, ritmo da fila, cache e entrega): cada variável traz o que faz, valores aceitos, faixa e padrão, tirados deconfig.pyequeue.py, e o cabeçalho explica o formato do arquivo (sem interpolação, o shell vence, chave desconhecida é erro). As mesmas linhas continuam ativas; nenhuma mudança de comportamento..env.example.pt-BRtraz os mesmos comentários em português, etests/test_env_paths.pyexige que os dois arquivos só difiram nos comentários (mesmas chaves, ordem, valores e estado).- Docs: os READMEs ganham a linha da 2.4.3 na lista de atualizações; o template de PR pede
scripts/check.she diz que o espelho da skill é gerado;docs/QUALITY.mdchama a rodada da 2.3.7 de linha de base, não de rodada mais recente.
Get B-rolls v2.3.7 — Engenheiro de Vídeo
- Adiciona variáveis opcionais que fixam caminhos de ferramentas:
GB_YTDLP_PATH,GB_VENV_PATH,GB_FFMPEG_PATHeGB_FFPROBE_PATH. Valem tanto pelo ambiente do processo quanto pelo.envda skill ou porpython3 scripts/gb.py --env-file CAMINHO <subcomando> …, com--env-filena raiz do parser, antes do subcomando. - Define a precedência: variável explícita vence a descoberta atual. Com a variável ausente ou vazia, o comportamento é idêntico ao anterior —
.venv/Scriptse.venv/binpara yt-dlp,PATHpara ffmpeg/ffprobe. - Recusa caminho inválido em vez de voltar em silêncio à descoberta: um destino inexistente, sem permissão de execução ou, no caso de
GB_VENV_PATH, que não seja diretório, encerra o comando com erro nomeando a variável e o caminho. doctorpassa a listar os pins ativos emtool_paths, uma linha por variável, e reflete o pin emexecutables. Sem variáveis definidas,tool_pathssai vazio.- Não há
GB_PYTHON_PATH: o código não reinvoca o interpretador Python em nenhum ponto. - Adiciona
tests/test_env_paths.pycom 16 regressões offline de precedência, padrão inalterado, erro de caminho inválido e layouts.venvPOSIX e Windows. - Torna a CLI autoexplicativa:
helpem todos os subcomandos e argumentos,--versionna raiz edoctorcom vereditosummary(ok, missing com o comando que resolve, optional) além deget_brollsepython— a chaveruntimepassou a se chamarpython. - Nomeia o instalador no erro de yt-dlp ausente e separa "FFmpeg/ffprobe não encontrado" de "arquivo/intervalo inválido", apontando
doctornos dois casos. - Adiciona o comando de plugin
/get-brolls-setup(commands/get-brolls-setup.md), que executa--check, o instalador do sistema e odoctorpela raiz do plugin e reporta o veredito em uma linha. - Documenta o acionamento do plugin (contexto,
/get-brolls:get-brolls,/get-brolls-setup) e acrescenta o bloco "Primeiro B-roll em 5 minutos" nos dois READMEs, com fonte sem chave, servidor local do Storyboard e saída esperada. - Os dois SKILL.md passam a mandar servir
brolls/em127.0.0.1:8767e avisar quefile://pode desativar o salvamento local antes da exportação do JSON. - Substitui a
descriptiondos dois SKILL.md por uma descrição bilíngue com o que a skill faz, quando acioná-la e o que está fora de escopo; os READMEs distinguem a skill de coletores genéricos de download. - Troca os cinco marcadores do teste do espelho por um contrato estrutural: corpo da raiz e do espelho comparados linha a linha, com os caminhos
${CLAUDE_PLUGIN_ROOT}normalizados e apenas a seção "Instalação e contexto" autorizada a divergir. - Reescreve
GEMINI.mdcomo configuração real: o Gemini CLI carregaGEMINI.mda partir do diretório de trabalho, então o roteador precisa ser importado por@/caminho/absoluto/.../SKILL.mdnoGEMINI.mddo usuário. - Os dois SKILL.md mandam ler o CHANGELOG quando o
doctorreportar uma versão diferente da documentada. - SECURITY ganha a tabela de egress (instalação, execução e o que nunca sai da máquina) e a declaração de ausência de telemetria.
- Os instaladores explicam a falha do
pip: informam o Python em uso e a faixa validada do conjunto fixado (3.11–3.13), continuando fail-fast. A matriz de CI segue em 3.11/3.13 porquepycryptodomex==3.23.0ainda não publica wheel cp314. - Adiciona
.github/ISSUE_TEMPLATE/bug_report.md(SO, versão do Python e saída completa dodoctor),config.ymlcom issues em branco habilitadas ePULL_REQUEST_TEMPLATE.mdcom o bloco de verificação do AGENTS. - Adiciona
.github/workflows/release.yml: em tagsv*, extrai a seção da versão no CHANGELOG e publica a release pelogh, sem sobrescrever uma release existente e sem novas actions de terceiros. - Documenta que
skills/e.claude-plugin/são artefatos do plugin e podem ser omitidos ao copiar para o Codex, e registra no GUIDE a permissão opcionalpython3 */gb.py *. - Aceita
GB_FONT_FILEno.env(fonte TrueType do contact sheet dos helpers Bash opcionais) e faz o erro de variável desconhecida nomear a variável recusada e o conjunto aceito. - Torna
AGENTS.mdo hub principal do repositório: uma tabela "Mapa do repositório" roteia cada público — operar a skill (SKILL.md e o espelho do plugin), instalação por agente (Codex, skill e plugin do Claude Code, Gemini CLI), GUIDE, QUALITY, CONTRIBUTING, SECURITY e CHANGELOG — sem remover nenhuma regra de manutenção existente.CLAUDE.mdeGEMINI.mdviram roteadores finos que apontam primeiro para o hub, e os dois READMEs nomeiamAGENTS.mdcomo índice de agentes e mantenedores. - Adiciona o subcomando
status --project, que responde "onde estamos?" lendo o estado já gravado (manifesto, candidatos, decisões e journal) e devolve contagem e lista de IDs por etapa: candidatos encontrados, prévias geradas, decisões pendentes/aprovadas/rejeitadas, itens compermitregistrado, itens entregues e verificados, além do próximo passo do fluxo. É somente leitura: não grava manifesto, candidatos, prévias, clipes nem eventos. - Padroniza o relato de progresso:
search,resolve,preview,review,import-review,permit,fetcheverifypassam a devolver um camposummarycom uma linha em português no formato verbo + objeto + resultado. O campo é aditivo — nenhuma chave existente muda de nome, tipo ou posição. - Documenta o
statuse a convenção do camposummaryno GUIDE, acrescenta uma frase sobrestatus --projectna seção "Revisão e entrega" dos dois SKILL.md e cita o comando na seção de terminal dos dois READMEs. - Fixa o padrão editorial literal primeiro nos dois SKILL.md, no GUIDE e nos READMEs: o material padrão é footage, print ou imagem real do fato, pessoa, produto, notícia ou tela que a narração cita; bancos de stock (Pexels/Pixabay) entram somente quando o usuário pedir stock explicitamente.
- Registra a divisão de responsabilidade editorial: as condições de uso do material são de quem produz o vídeo; a skill responde pela fidelidade/literalidade e pelo registro de origem de cada asset. O fluxo de
permite proveniência continua sendo o mecanismo desse registro, sem alteração de lógica. - Adiciona
tests/test_status.py(9 regressões offline dostatus, do camposummarye da garantia de somente leitura) e três regressões do hub emtests/test_repository.py.
Correções da revisão tripla
statuspassa a ser somente leitura de verdade: abre o ledger sem criarbrolls/candidates,previewseclips, relata uma gravação interrompida comojournal.recovered_write: "pending"sem concluí-la e recusa um projeto inexistente com "Projeto não encontrado em …; nenhum arquivo foi criado.", sem escrever nada — nem diagnóstico.statusdeixa de pedir a trava exclusiva do projeto: agora responde mesmo durante umfetchem andamento, em vez de falhar com "Outro comando está usando este projeto".statusdeixa de morrer com o projeto:RULES.mdinválido virarules_errorno relatório,events.jsonlereferences.jsoncorrompidos degradam para contagem comerror, e uma mudança de formato-alvo nas regras viraformat_pendingmais um aviso de que o próximo comando invalidará as aprovações.release.ymlganha portões antes de publicar: confere__version__contra a tag, rodapython3 -m unittest discover -s tests, extrai a seção do CHANGELOG por comparação literal (a versão não é mais tratada como expressão regular) e marca--prereleasequando a tag tem hífen.- Restaura as GitHub Actions fixadas nas v7 (
actions/checkout7.0.1 eactions/setup-node7.0.0) que uma alteração anterior havia rebaixado para v4, e passa a usar o mesmo checkout norelease.yml. A regressão compara apenas a referência fixada por SHA, sem exigir o comentário da versão. - Os pins
GB_*_PATHresolvem para caminho absoluto antes de validar, então um valor relativo não muda de significado conforme a pasta atual; um diretório fixado informa "não é um arquivo executável"; eGB_VENV_PATHsem yt-dlp dentro falha nomeando a variável, a pasta e os layouts procurados, em vez de cair em silêncio noPATH. doctorfica resiliente a pin inválido: em vez de encerrar com erro, publica o pin quebrado emsummary.missingcom a mensagem do erro, sugere o instalador pelo caminho absoluto da skill e acrescenta o blocoresolvedcom o executável absoluto realmente usado por ferramenta. Os demais comandos continuam falhando de imediato.- O teste do espelho passa a cobrir também a seção "Instalação e contexto": só linhas de mecânica de instalação podem divergir da raiz, a indentação conta e uma linha que normaliza para vazio falha em vez de sumir.
- Ajustes de relato: o
summarydesearchmantém a observação do provedor,approveerejectganham a própria linha, singular e plural concordam com as contagens,previewdiz quando gerou somente referência estática eresolverecusa--file/--urlvazios nomeando a opção.
Get B-rolls v2.3.6 — Engenheiro de Vídeo
Release de empacotamento: o Get B-rolls agora instala como plugin do Claude Code em dois comandos, mantendo o fluxo clone-como-skill idêntico para Codex e instalações manuais. Nenhuma mudança de lógica do produto.
Instalação como plugin do Claude Code (novo)
/plugin marketplace add engenheirodevideo/get-brolls
/plugin install get-brolls@engenheirodevideo
Depois, execute o instalador de dependências na pasta do plugin (~/.claude/plugins/cache/engenheirodevideo/get-brolls/<versão>/) — ou peça ao Claude para executá-lo. Repita o instalador após cada /plugin update.
Instalação clássica (Codex e manual)
git clone --branch v2.3.6 --depth 1 https://github.com/engenheirodevideo/get-brolls.gitIdêntica à v2.3.5: coloque a pasta completa no diretório de skills, siga o guia de instalação e abra nova sessão do agente. Pré-requisitos: Python 3.11+, FFmpeg/ffprobe, Node 22+, npm/npx e curl.
O que muda na 2.3.6
.claude-plugin/plugin.jsonemarketplace.json: o repositório é seu próprio marketplace de plugin.- Skill espelhada em
skills/get-brolls/SKILL.mdcom caminhos via${CLAUDE_PLUGIN_ROOT},--projectincondicional e chaves via--env-filefora da pasta gerenciada. - Roteadores
CLAUDE.mdeGEMINI.mdapontam para SKILL.md (operação) e AGENTS.md (manutenção) — descoberta de contexto no Claude Code e no Gemini CLI sem duplicar instruções. - Novos testes offline travam manifestos, igualdade da
descriptionentre os dois SKILL.md, alvos${CLAUDE_PLUGIN_ROOT}e regras operacionais do espelho. - SECURITY atualizado: o relatório privado de vulnerabilidades do GitHub está habilitado no repositório.
- Zero mudança de lógica:
scripts/só recebe o bump de versão; regras editoriais (aprovação humana, licença, proveniência) intactas.
Verificação
86 testes passaram localmente (80 da 2.3.5 + 6 novos de empacotamento) e a CI passou na matriz completa — macOS/Python 3.11 e 3.13, Windows/Python 3.11 e 3.13 e Ubuntu/Python 3.13 — no PR #8. A estrutura do plugin passou por revisão dupla independente (validação de estrutura e qualidade de skill).
Os limites conhecidos da v2.3.5 permanecem válidos; as evidências de QA estão em QUALITY.md.
Detalhes: README, guia e changelog.
Criado e mantido por Bruno Moreira — Engenheiro de Vídeo. Código sob licença MIT.
Get B-rolls v2.3.5 — Engenheiro de Vídeo
Primeira release oficial no GitHub do Get B-rolls: pesquisa de imagens de apoio, prévias em Storyboard, revisão humana e entrega dos cortes com registro de origem. Esta versão já inclui as correções de revisão obsoleta e de proteção HTTPS integradas após a 2.3.4.
Instalação desta versão
git clone --branch v2.3.5 --depth 1 https://github.com/engenheirodevideo/get-brolls.gitColoque a pasta completa no diretório de skills do Codex ou Claude Code. Instale as dependências no destino final seguindo o guia de instalação e abra uma nova sessão do agente.
Pré-requisitos: Python 3.11+, FFmpeg/ffprobe, Node 22+, npm/npx e curl. Os instaladores obtêm as dependências pelos registros oficiais. Os arquivos de código-fonte disponibilizados pelo GitHub não incluem as dependências nem sessões de navegador.
O que esta versão reúne
- YouTube via yt-dlp e FFmpeg, sem YouTube API key; TikTok por URL completa.
- Instagram pelo navegador autorizado e pelo coletor de pares de vídeo/áudio incluído.
- Busca em Pexels, Pixabay, Wikimedia Commons e NASA; importação de arquivos locais.
- Storyboard com GIFs, quadros estáticos, fonte, autoria, fala e motivo da escolha.
- Exportação/importação de decisões, impressão e entrega final condicionada à aprovação e ao registro das condições de uso.
- Instaladores para macOS e Windows, suporte explícito a UTF-8 e documentação em português com README em inglês.
Correções da 2.3.5
- O importador recusa JSONs de revisão baseados em decisões antigas, inclusive após rejeição ou outra importação, validando
reviewEpochalém da assinatura do conteúdo — sem gravação parcial de lotes inválidos. - Conexões HTTP de APIs e downloads ficam fixadas nos endereços públicos validados, com revalidação de DNS a cada tentativa, certificados e hostname HTTPS preservados, redirects bloqueados e sem proxies automáticos do ambiente.
- Dependências Python e npm fixadas (
requirements.txt,package-lock.jsoncomnpm ci) e GitHub Actions pinadas por commit, com atualizações futuras via Dependabot. - Novas regressões offline cobrem decisões obsoletas, DNS rebinding IPv4/IPv6, proxy, retries, redirects e validação TLS.
Quem usava a 2.3.4: regenere o Storyboard e exporte uma revisão atual antes de importar — JSONs antigos ou sem reviewEpoch são recusados. Guia de migração.
Verificação
80 testes passaram na revisão local desta árvore (macOS/Python 3.14.6), incluindo as novas regressões de segurança. A execução do GitHub Actions passou em macOS/Python 3.11 e 3.13, Windows/Python 3.11 e 3.13 e Ubuntu/Python 3.13, com instalação completa nos cinco ambientes.
Fonte desta release: f38c749. Este commit apenas data o changelog e registra a evidência de CI; o código é o da árvore aprovada no PR #1.
Limites conhecidos
- As fontes sociais dependem da disponibilidade da URL, rede e sessão; os ensaios registrados não garantem qualquer vídeo.
- Pexels e Pixabay exigem suas próprias chaves opcionais.
- Projetos e revisões devem ser locais e confiáveis; a ferramenta não é um serviço público e não autentica o revisor.
- A proteção HTTPS cobre o transporte interno de APIs e downloads; não é um isolamento de rede para processos externos como yt-dlp, FFmpeg ou navegador. Consulte a política de segurança.
- Guarde chaves, cookies, configurações CDN e material de clientes fora da distribuição. Aprovação editorial não substitui a verificação das condições de uso da fonte.
Detalhes: README, guia, qualidade e evidências e changelog.
Criado e mantido por Bruno Moreira — Engenheiro de Vídeo. Código sob licença MIT.