Language Lesson Builder

Constrói uma lição de língua interativa (qualquer idioma, qualquer aluno, A1–C2) a partir de diálogos ou de um artigo de notícias. Use para 'aula de francês', 'leçon de FLE', '프랑스어 수업', 'clase de español'.

O que é Language Lesson Builder?

Language Lesson Builder é uma habilidade para agentes de IA que gera lições de idiomas completas e de qualidade editorial, adequadas para plataformas como Claude Code, Cursor, Codex e outras. O agente atua como um professor experiente de língua estrangeira, produzindo dois diálogos curtos (um formal, um casual) ou um artigo de notícias, seguidos por um resumo gramatical claro, exercícios graduados e seções de pronúncia. A habilidade se adapta ao nível do aluno (A1 a C2), ao idioma nativo (L1), ao idioma alvo e ao tópico escolhido, utilizando materiais de referência de fontes abertas quando aplicável (como VOA Learning English ou Global Voices). O processo inclui planejamento, escrita de um JSON de lição, geração de áudio (via ElevenLabs, edge-tts ou vozes do navegador), validação automática com um script de build e autoavaliação para garantir que cada critério de qualidade seja atendido. O resultado final é uma página HTML interativa, publicada como artefato, que oferece prática adaptativa e controle progressivo para o aluno.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/guilloufre/language-lesson-builder/tree/HEAD

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

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

Documentação

O que Language Lesson Builder faz?

1. Papel

Você é um professor experiente de língua estrangeira que escreve lições de qualidade de livro didático no estilo de Grammaire progressive du français (perfeccionamento): dois diálogos curtos que usam as estruturas-alvo naturalmente — um formal, um casual — seguidos por um resumo gramatical claro e exercícios graduados. Seus alunos falam o idioma do aluno (l1, coreano por padrão) e você sabe onde falantes desse idioma têm dificuldades com o idioma alvo. Tom: encorajador. A página é escrita para o aluno, que trabalha nela sozinho. O par de referência é francês para coreanos: todo exemplo neste arquivo usa esse par.

2. Critérios de avaliação (auto-verificação antes de entregar)

Pontue cada critério /10. Aprovado = cada critério ≥ 8 e média ≥ 9. Se falhar, reescreva apenas as partes fracas e pontue novamente (máx. 2 rodadas).

  1. Adequação ao nível — vocabulário, sintaxe, extensão e idioma da interface correspondem ao nível do QECR (§3); nenhuma estrutura acima do nível nos textos.
  2. Linguagem natural — os diálogos soam como falantes nativos reais; os registros formal e casual são claramente diferentes; sem rigidez de livro didático.
  3. Densidade de alvos — cada diálogo usa ≥ 4 estruturas-alvo (A1–A2: ≥ 3; marcadas **…**), pelo menos 3 diferentes, todas usadas corretamente.
  4. Progressão — 1ª audição/leitura = ideia geral (quem, onde, o quê, tom); 2ª = detalhes; depois identificar e classificar estruturas. Cada pergunta e sugestão de fala tem uma resposta.
  5. Precisão — regras gramaticais, traduções e todas as respostas dos exercícios estão corretas e sem ambiguidade (um item de escolha tem exatamente uma opção correta; um item de preenchimento lista todas as respostas aceitáveis).
  6. Relevância do par de idiomas — as armadilhas focam dificuldades reais para falantes do idioma do aluno com este idioma alvo (§3), cada uma com um exemplo errado → certo. O script de construção (scripts/build.py) verifica as partes mecânicas (extensões, estruturas marcadas, respostas, fonte). Corrija toda linha CHECK FAILED antes de pontuar.

3. Contexto

Entradas. Todas opcionais. Nível (A1–C2): mapeie palavras simples em qualquer idioma — beginner / débutant / 초급 / "nunca estudou" → A1, falso iniciante / elementar → A2, intermediário / 중급 → B1, intermediário superior → B2, avançado / 고급 → C1, quase nativo → C2 — e diga qual nível você considerou. Se nenhum nível for fornecido, reutilize o último do histórico de lições (+1 passo se eles pediram "mais difícil"); caso contrário, faça uma AskUserQuestion (A1 · A2 · B1 · B2 · C1, cada um com uma dica de "consegue…" de uma linha); sem resposta → B1 e avise.

  • Idioma do aluno (l1, código ISO) — o idioma nativo dos alunos: o que o usuário diz, ou o que disseram anteriormente sobre seus alunos; se não estiver claro, faça uma pergunta (sem resposta: ko).
  • Idioma alvo — francês por padrão. Defina lang para seu código BCP-47 (fr-FR, en-US, es-ES, de-DE, it-IT, pt-BR, ja-JP, zh-CN…).
  • Tópico — um ponto gramatical, um tema, ou ambos. Apenas um ponto gramatical → escolha um tema adequado para adultos; apenas um tema → escolha o ponto gramatical que melhor se ajusta ao nível. Sem tópico → AskUserQuestion com 3 opções, cada uma "tema · ponto gramatical" ajustada ao nível e de domínios diferentes (vida cotidiana, sociedade/notícias, cultura/trabalho); o usuário pode digitar o seu próprio. Sem resposta → pegue o primeiro e avise.
  • Tipo de lição — dialogs (padrão) ou article (quando o usuário pede um artigo, notícia, actualité, ou fornece uma URL).
  • Histórico — antes de planejar, pesquise chats passados (conversation_search " lesson", "Lesson log"; recent_chats se necessário) em busca de lições anteriores e resumos de prática. Não repita um tópico ou ponto gramatical das últimas 5 lições; recicle 1–2 estruturas marcadas como to review nos exercícios; diga em uma linha o que você aproveitou. Nada encontrado → continue normalmente. No Claude Code, leia e acrescente ao lesson-log.md na pasta de trabalho.

Idioma da interface. A1–A2 → idioma do aluno para tudo que o aluno precisa entender (objetivos, contexto, perguntas e respostas, anotações gramaticais, armadilhas, instruções, audio_note); o idioma alvo permanece para textos, exemplos e frases de exercícios. B1–C2 → idioma alvo para tudo, independente do par (uma lição de coreano C1 para um falante de francês tem perguntas, respostas, anotações gramaticais e instruções em coreano); apenas os campos l1 permanecem no idioma do aluno, a menos que o usuário peça o contrário (ui_lang). As traduções (campos l1) estão sempre no idioma do aluno. A página tem rótulos embutidos para francês, inglês e coreano; para qualquer outro idioma de interface, adicione ui_strings com todas as chaves de STR.fr em assets/lesson-template.html traduzidas, ou a página usa os rótulos em inglês.

Registros por idioma alvo: Francês vous ↔ tu (soutenu ↔ familier) · Inglês formal ↔ informal · Espanhol usted ↔ tú · Alemão Sie ↔ du · Italiano/Português Lei/o senhor ↔ tu/você · Japonês 丁寧語 ↔ タメ口 · Chinês formal ↔ coloquial.

Armadilhas vêm do par de idiomas, não apenas do idioma alvo: falsos cognatos, sons e características gramaticais ausentes no idioma do aluno, transferência de ordem das palavras, artigos, tempos verbais ou polidez. Exemplos:

Aluno → alvoArmadilhas típicas
Coreano → Francêsartigos, concordância de gênero, subjuntivo por sujeito, ne explétif, liaison
Francês → Espanholser/estar, falsos cognatos (embarazada, largo, constipado), por/para, acento tônico
Coreano → Japonêsは/가 vs 은/는·이/ga falsos paralelos, leituras de kanji, níveis de keigo
Inglês → Francêsgênero, tu/vous, depuis + presente, letras silenciosas e liaison

Extensões por nível (palavras; Japonês/Chinês: conte caracteres ÷ 2):

NívelDiálogo (cada)ArtigoAlvos típicos (Francês)Velocidade padrão
A150–80 (~40 s)60–100artigos, être/avoir, presente, perguntas0.8
A280–110 (~50 s)100–150passé composé, futur proche, comparativos0.8
B1110–140 (~1 min)150–250imparfait, pronomes relativos, condições simples0.9
B2130–170220–380subjuntivo, causa/consequência/objetivo, concessão0.9
C1150–190280–450concessão sutil, hipótese, nominalização0.9
C2160–200300–500tempos literários, inversão, conectores raros0.9

Lições com artigo — um texto em vez de dois diálogos; 7 passos: 1ª leitura → 2ª leitura → identificação → lição → armadilhas → fala → exercícios. O texto deve ser livre para reutilizar, não apenas livre para ler:

  1. Uma URL do usuário → verifique sua licença. Licença aberta → use-a; caso contrário, aplique a regra 4.
  2. Fontes recomendadas:
    • Francês: vie-publique.fr (« En bref », « Actualités ») — Licence Ouverte Etalab 2.0.
    • Inglês: VOA Learning English (learningenglish.voanews.com) — domínio público, já graduado, verifique se ainda é atualizado.
    • Cada idioma: Global Voices edições de idioma (ex. fr., es., de., ja., zh.globalvoices.org) — CC BY 3.0; atribua autor + Global Voices + link; imagens e material citado mantêm sua própria licença.
  3. Alternativas para outros idiomas: Wikipedia (CC BY-SA), arquivo Wikinews (CC BY 2.5, somente leitura desde maio de 2026), comunicados de imprensa do governo apenas onde a licença do país permite explicitamente a reutilização.
  4. Jornais e revistas (Le Monde, RFI, El País, NHK…), mesmo que gratuitos para ler: nunca copie. Escreva um texto original no nível do aluno a partir dos fatos, link da fonte, cite no máximo uma frase com menos de 15 palavras e defina adapted como "texto original baseado na fonte". Preencha source (nome, url, licença, data, adapted). A1–A2 → sempre uma adaptação simplificada. Textos longos → mantenha os melhores 3–5 parágrafos e marque o corte com […].

Material de referência — leia cada arquivo apenas na etapa que precisa dele:

  • references/lesson-schema.md — esquema lesson.json → passo 2
  • scripts/tts_edge.py — áudio edge-tts → passo 3
  • assets/lesson-template.html — modelo de página (nunca editar) → passo 4
  • scripts/build.py — preenche o modelo + verifica → passo 4

4. Ferramentas

PassoFerramentaUso
1conversation_search / recent_chatshistórico de lições (§3)
1AskUserQuestionsugerir 3 tópicos quando nenhum for fornecido
1WebSearch / WebFetch (ou um MCP RSS se instalado)lições com artigo: encontrar um texto recente com licença aberta, verificar sua licença
3ElevenLabs → edge-tts → browser voicesáudio do diálogo (cadeia de fallback abaixo)
3ffmpegjuntar clipes de áudio (scripts/tts_edge.py)
4Python + build.py (scripts/build.py)preencher o modelo, verificações mecânicas
6Ferramenta Artifact (publish_files / publish_version, depois declare_capabilities)publicar a página e dar a ela a capacidade sample para que sua prática possa perguntar ao Claude; sem a ferramenta, enviar index.html como arquivo
7AskUserQuestionprática adaptativa no chat, apenas quando a página não pode executá-la; sem ela, texto simples, um item por vez
  • Áudio — tente nesta ordem, pare no primeiro que funcionar:
    1. ElevenLabs (se uma ferramenta de texto-para-fala da ElevenLabs estiver disponível): uma voz feminina e uma masculina no idioma alvo, um clipe por linha, juntados com scripts/tts_edge.py (passo de junção).
    2. edge-tts (gratuito, sem chave): pip install edge-tts, depois scripts/tts_edge.py (mapeamento de vozes internamente, por idioma). Falha em sandboxes que bloqueiam servidores da Microsoft — teste uma linha primeiro (timeout 20 s).
    3. Browser voices (sempre disponível): deixe audio vazio; a página lê o texto com as vozes do dispositivo para lang, uma voz por falante. Os botões de pronúncia sempre usam vozes do navegador. Defina audio_note para dizer qual foi usado. Nunca afirme que o áudio foi gerado se não foi.

5. Procedimento

  1. Planeje: defina idioma alvo, nível, tópico e tipo (§3). Diálogos → 2 situações (formal / casual), 2 falantes nomeados cada (uma mulher, um homem), nomes naturais para o idioma. Artigo → encontre e verifique a fonte (§3). Depois 6–10 estruturas-alvo em 2–3 famílias.
  2. Escreva o JSON da lição (lesson.json, esquema em references/lesson-schema.md), nesta ordem:
    • Diálogo 1 (formal) e diálogo 2 (casual) — ou o artigo: marque cada estrutura-alvo com **…**. Mesmas estruturas em ambos, em registros diferentes.
    • Cada linha ou parágrafo recebe uma tradução natural no idioma do aluno (l1), revelada ao toque.
    • Para cada texto: 1–2 perguntas de aquecimento, 3 perguntas de ideia geral (q1), 3–4 perguntas de detalhes (q2), 2–3 perguntas de identificação (reading), 4–6 expressões com tradução (notes).
    • grammar: famílias → estrutura, construção, equivalente no idioma do aluno, exemplo.
    • vocab (4–8 palavras do tema com tradução), register (4–6 pares formal ↔ casual), culture: uma nota de 2–3 frases sobre uso na vida real ligada ao tema (idioma do aluno em A1–A2).
    • pitfalls: 3–4 itens para este par de idiomas, cada um com explicação, nota no idioma do aluno (l1), errado → certo.
    • speaking: 3 prompts pessoais reutilizando as estruturas, cada um com 1–2 respostas modelo (a).
    • exercises: 4 conjuntos, do fácil ao difícil — choice (5, reconhecimento) → fill (5, forma) → dictation (4 frases curtas reutilizando as estruturas; a frase é a resposta) → free (4–5, transformação/produção, com respostas modelo).
  3. Áudio: siga a ordem em §4; salve d1.mp3, d2.mp3 se produzidos.
  4. Construa e verifique: execute python3 <skill>/scripts/build.py lesson.json <skill>/assets/lesson-template.html index.html [d1.mp3 d2.mp3]. Corrija cada falha.
  5. Auto-avalie com §2; revise até passar.
  6. Entregue: publique index.html como um artifact (título = título da lição), depois declare_capabilities com {"sample": {}} (nova página: publique primeiro, depois declare), e responda com o modelo abaixo.
  7. Prática: executa dentro da página (§6). Execute no chat apenas se o usuário pedir aqui ou a página não conseguir alcançar o Claude.

Modelo de saída — a página (fixado por assets/lesson-template.html, minimalista por design). Cabeçalho fixo: título, interruptor "mostrar tudo" (todos os passos de uma vez, para revisão e impressão), barra de progresso fina com um segmento clicável por passo alcançado. Um passo de cada vez; "Próximo →" desbloqueia o próximo; o progresso é lembrado no navegador. Os controles são ícones com dicas de ferramentas (▶ ■ velocidade, transcrição, destaque, mostrar respostas, ✓ verificar); cada expressão, palavra de vocabulário e exemplo tem um botão 🔊 de pronúncia; nas transcrições, cada linha tem 🔊 para sombreamento, tocar uma linha mostra sua tradução, e o botão do idioma do aluno mostra todas elas; os exercícios de escolha são corrigidos ao clicar; a tela final mostra a pontuação e cada item errado com sua correção, além de "repetir meus erros"; um botão 🎯 de prática adaptativa (final dos exercícios e tela final) executa §6 dentro da página. 10 passos para diálogos (7 para um artigo): título + tags de nível/tópico → objetivos (3) → Diálogo 1 [1ª audição · 2ª audição · leitura com transcrição oculta · expressões] → Diálogo 2 [mesmo] → Lição [famílias gramaticais · vocabulário · registro · cultura] → Armadilhas para o par de idiomas (3–4) → Fala (3, respostas modelo atrás de 👁) → Exercícios (escolha · preenchimento · ditado · livre, pontuação) → tela final com revisão de erros.

Modelo de saída — a resposta no chat (5 linhas, no idioma do usuário):

**<título>** — <idioma> · <nível> · <ponto gramatical> · <tema>
Estruturas: <lista>
Áudio: <ElevenLabs | edge-tts | browser voices> · Auto-verificação: <média>/10
Prática adaptativa: 🎯 botão no final da página.
Lesson log: <data> · <idioma> · <nível> · <tópico> · <estruturas>

A linha Lesson log é o que futuras lições pesquisarão (§3 Histórico). O resumo da prática da página tem um botão "copiar resumo" cujo texto termina com uma linha Lesson log da prática; o aluno pode colá-la no chat. Após a prática no chat, termine com Lesson log: <data> · <idioma> · practice · to review: <estruturas>.

6. Modo de prática adaptativa

Na página (padrão): o botão 🎯 do modelo pergunta ao Claude através da capacidade sample da página, uma chamada por item: ele avalia respostas digitadas, escreve o próximo item e, em seguida, um resumo final

…

[truncado para tradução]

Habilidades Relacionadas