podcast-kit — habilidade de agente

Transforma um único arquivo JSON de episódio (show, título, resumo, convidados, links, capítulos, transcrição, duração_em_segundos) em ativos prontos para publicação do episódio.

O que é podcast-kit — habilidade de agente?

O podcast-kit é uma habilidade para agentes de IA que automatiza a produção dos ativos finais de um episódio de podcast a partir de um único arquivo JSON. Ele suporta três comandos principais: `show-notes` para gerar notas de episódio em Markdown ou texto plano; `chapters` para validar e exportar capítulos para o YouTube (formato `MM:SS Título`) e para o padrão Podcasting 2.0 (JSON), com validação rigorosa (falha se o primeiro capítulo não começar em 0:00, se houver sobreposições ou títulos vazios) — capítulos inválidos retornam exit code 1 e nenhum arquivo é exportado, pois players ignoram listas quebradas silenciosamente; e `audiogram-plan` que ranqueia segmentos da transcrição com base em sinais de texto (perguntas, números, exclamações, frases fortes como "the truth is" e duração entre 15 e 60 segundos) para sugerir os melhores momentos para clipe, sem cortar áudio ou gerar vídeo. A ferramenta é puramente local, usa apenas a biblioteca padrão Python, e é ideal para ser usada no fechamento de um episódio, garantindo consistência entre notas, capítulos e planos de audiograma. Exit code 1 indica um achado (capítulos inválidos ou nenhum segmento qualificado), não uma falha.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/jasveerai88/podcast-kit/tree/HEAD

Installed? Explore more Produtividade e Colaboração skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que podcast-kit — habilidade de agente faz?

Propósito

Publicar um episódio é um conjunto de pequenos trabalhos de cópia a partir de um conjunto de fatos: as notas, os capítulos do YouTube, o arquivo de capítulos do Podcasting 2.0 e a busca pelo momento digno de clipe. Esta ferramenta recebe UM JSON de episódio e produz todos eles, de modo que os fatos existem exatamente uma vez. Biblioteca padrão pura do Python; apenas local; o arquivo de episódio é a única coisa que ela lê.

O núcleo de honestidade desta ferramenta: uma lista de capítulos é exportada apenas quando é válida — players ignoram silenciosamente listas quebradas, portanto entregar uma exportação quebrada é pior do que não entregar nenhuma — e uma pontuação de audiograma é um ranking de onde olhar primeiro, calculado apenas a partir do texto da transcrição. Nunca é uma previsão de que um momento terá desempenho, e um plano nunca é um audiograma renderizado.

Quando usar / não usar

Use quando:

  • Um episódio existe como (ou pode ser escrito como) um JSON de episódio: finalizá-lo significa produzir notas de episódio, capítulos para YouTube e aplicativos de podcast, e decidir o que clipe.
  • Um pipeline precisa de uma validação sim/não para capítulos: chapters com exit 0 = a lista é válida e as exportações estão na saída; exit 1 = não publique os capítulos como estão.
  • Um editor quer os cinco timestamps que valem a pena ouvir antes de percorrer uma gravação inteira.

NÃO use quando:

  • Você precisa de transcrição — a transcrição é uma entrada aqui. Produza segmentos primeiro com uma ferramenta de transcrição.
  • Você precisa de áudio ou vídeo renderizados — audiogram-plan é um plano (timestamps + palavras + razões). Leve-o para um editor ou uma ferramenta de renderização.
  • Você precisa de RSS, hospedagem ou processamento em lote — esta ferramenta finaliza um arquivo de episódio por vez, deliberadamente.

Comandos

Todo comando recebe o arquivo de episódio como argumento posicional e suporta --json.

# Notas de episódio — Markdown (padrão) ou texto plano
python3 src/podcast_kit.py show-notes EPISODE.json \
    [--format md|text]

# Validar + exportar capítulos (exit 1 + nenhuma exportação quando inválido)
python3 src/podcast_kit.py chapters EPISODE.json \
    [--format youtube|json|both]

# Ranquear os momentos dignos de clipe (exit 1 quando nenhum se qualifica)
python3 src/podcast_kit.py audiogram-plan EPISODE.json \
    [--top 5]

Campos do episódio: show (opcional), episode (int opcional), title (obrigatório para show-notes), published (opcional, imprimido como está), duration_seconds (obrigatório para chapters; segundos ou uma string de timestamp), summary (obrigatório para show-notes), guests — lista de {"name", "role"?}, links — lista de {"label", "url"}, chapters — lista de {"start", "title"}, transcript — lista de {"start", "end", "speaker"?, "text"}. Timestamps aceitam segundos (754), "M:SS" ou "H:MM:SS" em todos os lugares. O arquivo é validado a cada leitura; problemas estruturais (campos ausentes, timestamps ruins, um segmento terminando antes de começar, um segmento ultrapassando a duração) são erros com exit 2 que nomeiam o capítulo ou segmento ofensor.

Validação de capítulos (exata)

Problemas (exit 1, nenhuma exportação): o primeiro capítulo não começa em 0; um início não é estritamente após o início anterior; um início está em ou após duration_seconds (um início em duration − 1 é válido); um título está vazio.

Avisos (reportados, exportação ainda é produzida): menos de 3 capítulos; um capítulo com menos de 10 segundos. Ambos são regras do YouTube, não do Podcasting 2.0 — a exportação é válida de qualquer forma, YouTube pode ignorá-la.

Exportações: linhas do YouTube são MM:SS Título (ou H:MM:SS quando o episódio dura uma hora ou mais). O Podcasting 2.0 é {"version": "1.2.0", "chapters": [{"startTime", "title", "endTime"}]} — o endTime de cada capítulo é o startTime do próximo capítulo, e o endTime do último capítulo é a duração.

A pontuação do audiograma (exata)

Por segmento de transcrição, apenas a partir de seu texto:

  • pontos de interrogação: +2 cada, limitado a +4
  • números (sequências de dígitos, ex. 18, 1.900): +2 cada, limitado a +4
  • pontos de exclamação: +1 cada, limitado a +2
  • frases fortes — a lista fixa "the truth is", "biggest mistake", "nobody tells you", "everyone gets wrong", "never", "always", "secret", "myth" (palavra inteira, insensível a maiúsculas/minúsculas): +3 cada, limitado a +6
  • comprimento do segmento entre 15 e 60 segundos inclusive: +2

Piso: um segmento precisa de um total de 5 para ser listado. Ordem: pontuação decrescente, empates pelo início mais cedo. --top N limita a lista (0 ou negativo = todo segmento qualificado). Cada momento listado imprime suas razões com os sinais reais encontrados — uma pontuação sem razões não existe nesta ferramenta.

Esquema JSON de saída (--json)

Campos comuns: tool ("podcast-kit"), version, command, episode_file (nome do arquivo).

show-notes: title, format ("markdown" ou "text"), notes — as notas renderizadas como uma string, exatamente o que a visão de texto imprime. chapters: title, duration_seconds, valid (bool), problems (lista de strings), warnings (lista de strings), chapters — cada {start_seconds, start, title, end_seconds, end, length_seconds} — youtube (o texto de exportação, ou null quando inválido), podcasting20 (o objeto de exportação, ou null quando inválido). audiogram-plan: title, segments_scanned, floor (5), moments — cada {rank, start_seconds, start, end_seconds, end, duration_seconds, speaker, text, score, reasons}. Quando nenhum segmento se qualifica, moments é [] e um campo note explica que o piso não foi atingido (exit 1).

Em caso de erro, stdout é um único objeto: {"error": "<mensagem>"} com código de saída 2 — incluindo erros de uso do argparse no modo --json. Nunca texto plano, nunca um traceback.

Códigos de saída

  • 0 — comando bem-sucedido; para audiogram-plan, pelo menos um segmento ultrapassou o piso.
  • 1 — um achado: chapters encontrou problemas de validação (nenhuma exportação foi produzida), ou audiogram-plan não encontrou nenhum segmento digno de clipe. Nenhum dos dois é uma falha — aja com base no achado.
  • 2 — ERRO: arquivo de episódio ausente ou não é JSON válido, um campo obrigatório ausente, um timestamp inválido, um capítulo ou segmento malformado, uma flag inválida. Nenhum fato de saída pode ser citado de uma execução com falha.

Limites e regras de honestidade que o agente deve respeitar

  • Capítulos inválidos não exportam nada. Quando chapters sai com código 1, não reconstrua uma exportação a partir do array chapters na saída JSON e publique-a — os problemas listados são exatamente por que os players a ignorariam. Corrija o arquivo de episódio e execute novamente.
  • Avisos não são problemas. Uma lista válida com avisos pode ser publicada; diga claramente que o YouTube pode não exibir os capítulos (muito poucos, ou um muito curto) enquanto os aplicativos de podcast o farão.
  • Uma pontuação não é uma previsão. Relate um momento como "classificado em primeiro lugar pelos sinais de texto", nunca como "o melhor momento" ou "o clipe que terá desempenho". A ferramenta não consegue ouvir a gravação; a entrega pode tornar um segmento de baixa pontuação o clipe certo, e o plano diz isso.
  • Exit 1 do audiogram-plan não é um episódio vazio. Significa que nenhum segmento carregou os sinais classificados. Nunca relate como "nenhum bom momento" sem a ressalva de que a ferramenta lê apenas texto.
  • Um plano não é um arquivo. audiogram-plan produz timestamps e texto. Nunca diga ao usuário que um audiograma existe até que uma ferramenta de renderização tenha realmente criado um a partir do plano.
  • Apenas local: a ferramenta lê apenas o arquivo de episódio nomeado na linha de comando e não envia nada para lugar nenhum.

Habilidades Relacionadas