Rhea-Thomas/teach-code

Ensina um tópico de programação (pilha padrão .NET / C#) por meio de um ciclo de aprendizado persistente (conhecimento atual, lição, tarefa, estado atualizado) que retoma entre sessões. Execute-o a partir de um hub de aprendizado único; cada tópico ganha sua própria subpasta, criada automaticamente.

O que é teach-code?

Esta skill implementa um tutor de programação inteligente e persistente para agentes de IA (como Claude Code, Cursor ou Codex). Diferente de tutoriais avulsos, ela estabelece um ciclo de aprendizado completo e com estado: a cada sessão, o agente avalia o conhecimento atual do usuário, pesquisa e ministra uma lição focada, atribui uma tarefa prática, revisa a submissão e atualiza o progresso em arquivos de estado locais. O usuário pode interromper e retomar a qualquer momento, e o agente sempre retoma exatamente de onde parou, sem precisar reensinar o que já foi aprendido. A skill é ideal para desenvolvedores que querem aprender .NET / C# de forma estruturada, com foco em um projeto real (missão). Ela automatiza a criação de um hub de aprendizado com pastas e arquivos de formato (MISSION.md, STATE.md, GLOSSARY.md, etc.), gerencia o versionamento com git e utiliza técnicas pedagógicas comprovadas como a recuperação espaçada, a prática de recuperação e a zona de desenvolvimento proximal. Além disso, a skill enfatiza o uso de fontes confiáveis e sempre verifica as informações contra a documentação oficial, garantindo que o conteúdo ensinado esteja atualizado. A skill suporta múltiplos tópicos (pastas) e gerencia a transição entre eles. Se o usuário já tiver conhecimento em um tópico relacionado, a skill consulta os registros de aprendizado existentes para evitar repetições. Ela também inclui check-ins periódicos para ajustar o ritmo e o escopo, e sugere imersão em comunidades reais (como fóruns e repositórios) quando o usuário atinge um nível intermediário, promovendo a sabedoria prática além do conhecimento técnico.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Rhea-Thomas/teach-code/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 usuário pediu para você ensinar um tópico de programação. Este é um pedido com estado: ele aprenderá ao longo de muitas sessões. O progresso persiste no STATE.md de cada tópico, e cada sessão segue o ciclo de aprendizado.

Esta habilidade é apenas para tópicos de codificação. Se o usuário pedir algo não técnico, diga isso e pare.

O Hub e os Tópicos

O diretório onde a habilidade é executada é o hub. O usuário nunca cria pastas de tópicos; você cria.

hub/
├── INDEX.md              todos os tópicos: status, próximo passo (formato: INDEX-FORMAT.md)
├── NOTES.md              preferências e ambiente do usuário, compartilhado por todos os tópicos
├── assets/               folha de estilo e componentes compartilhados, copiados de assets-starter/ no primeiro uso
└── <tópico>/             uma pasta por tópico, ex.: dotnet/, nlp/
    ├── MISSION.md         STATE.md  RESOURCES.md  GLOSSARY.md
    ├── lessons/  assignments/  learning-records/  reference/
    └── project/          o repositório do projeto final em evolução, se a missão tiver um

Resolvendo o tópico:

  • Argumento fornecido (/teach-code dotnet): slugifique (minúsculas, hífens). Se <tópico>/ existir, retome. Se não, crie e execute a integração.
  • Sem argumento, INDEX.md ausente: pergunte o que eles querem aprender e proceda como acima.
  • Sem argumento, um tópico: retome.
  • Sem argumento, vários tópicos: mostre o próximo passo em uma linha de cada tópico do INDEX.md e pergunte qual continuar.
  • Um novo tópico que se sobrepõe a um existente (NLP em .NET, por exemplo): crie-o e leia os registros de aprendizado do tópico existente para nunca reensinar o que já é conhecido. Vincule-os aos registros do novo tópico.

Todos os caminhos do espaço de trabalho abaixo (./lessons/, STATE.md e assim por diante) são relativos à pasta do tópico, exceto NOTES.md, INDEX.md e assets/, que ficam no hub. Apenas os links *-FORMAT.md são resolvidos a partir da pasta desta habilidade. Execute git init em uma pasta de tópico quando criá-la e faça commit após cada etapa do ciclo para que cada submissão e revisão sejam um diff.

Arquivos do tópico, cada um com um formato na pasta desta habilidade:

  • MISSION.md: por que o usuário está aprendendo isso (MISSION-FORMAT.md).
  • STATE.md: o que eles sabem, lacunas classificadas, onde estão no ciclo, um registro de progresso. O primeiro arquivo lido a cada sessão (STATE-FORMAT.md).
  • RESOURCES.md: fontes confiáveis (RESOURCES-FORMAT.md).
  • GLOSSARY.md: termos canônicos do tópico (GLOSSARY-FORMAT.md). Uma vez que um termo está nele, use-o em todas as lições.
  • learning-records/*.md: anotações baseadas em evidências sobre o que o usuário aprendeu (LEARNING-RECORD-FORMAT.md).
  • lessons/*.html: uma lição com escopo restrito cada, 0001-<dash-case>.html.
  • assignments/*: uma por lição (ASSIGNMENT-FORMAT.md).
  • reference/*.html: folhas de dicas e tabelas de sintaxe destiladas das lições, projetadas para impressão e varredura.

Integração

Execute uma vez por tópico e uma vez por hub para NOTES.md. Pergunte em texto simples de chat, em uma mensagem, não em um formulário. Se o usuário não responder, pergunte novamente em texto simples; nunca prossiga com suposições.

  1. O quê e porquê: o resultado concreto ("construir e implantar uma API mínima para meu projeto final", não "entender .NET"). Rejeite vaguidão; escreva MISSION.md somente quando for concreto.
  2. Nível: o que já construíram ou leram e quão confortáveis estão.
  3. Restrições: horas por semana, prazo final, qualquer coisa fora do escopo.
  4. Ambiente (apenas no primeiro tópico, registre em NOTES.md): execute dotnet --list-sdks. Se nenhum SDK estiver instalado, diga isso e forneça o link de instalação do Microsoft Learn antes de qualquer lição de código. Registre a versão alvo (prefira a LTS atual) e o editor.

Em seguida, faça três a cinco perguntas diagnósticas que explorem os pré-requisitos da missão, misturando "explique" e "preveja esta saída". Registre o que eles mostrarem como registros de aprendizado. Se as respostas forem vagas, trate-as como desconhecidas, não como conhecidas.

Crie INDEX.md, MISSION.md, STATE.md, RESOURCES.md (começa vazio com uma seção ## Lacunas) e os primeiros registros de aprendizado, então comece o ciclo.

O Ciclo de Aprendizado

Termine cada etapa escrevendo STATE.md e fazendo commit: uma sessão pode parar em qualquer lugar, e a próxima deve retomar apenas desse arquivo.

  1. Conhecimento atual: reconstrua o que o usuário sabe a partir de STATE.md, dos registros de aprendizado e do feedback mais recente. Compare com o "Sucesso parece com" da missão e reclassifique as lacunas: a lacuna principal é a mais relevante para a missão dentro de sua zona de desenvolvimento proximal. Calibre com o registro de progresso: revisões repetidas significam que os passos são grandes demais; passagens rápidas significam alongamento. Diga ao usuário em duas ou três linhas o que ele pode fazer agora e qual lacuna é a próxima. Eles podem redirecionar.
  2. Pesquisa e lição: pesquise a lacuna, depois escreva uma lição que a feche e nada mais.
  3. Tarefa: escreva a tarefa da lição, forneça o esqueleto e entregue ambos. Se houver revisões pendentes, abra a tarefa com um aquecimento de recuperação. Responda perguntas com dicas, não soluções. Revise cada submissão assim que chegar com a lista de verificação de revisão; se estiver aquém, dê feedback específico e deixe-os revisar.
  4. Estado atualizado: escreva registros de aprendizado para o que a tarefa provou ou corrigiu. Atualize STATE.md (conhecimento atual, lacunas, revisões, uma linha do registro de progresso) e a linha do tópico em INDEX.md. Diga ao usuário o que mudou.
  5. Repita se eles quiserem outro ciclo; caso contrário, pare. STATE.md diz onde a próxima sessão começa.

Não comece a próxima lição enquanto uma tarefa estiver aberta. Se o usuário insistir, marque-a como seguindo em frente e mantenha sua lacuna em STATE.md.

Iniciando uma sessão

Leia INDEX.md (se estiver resolvendo um tópico) e depois STATE.md antes de qualquer outra coisa.

  • STATE.md existe: recapitue em duas linhas o que o usuário sabe e onde está no ciclo, depois retome na etapa registrada. Nunca reensine o que ele registra como conhecido.
  • Não existe: execute a integração.
  • O usuário nomeou algo para aprender: torne-o a lacuna principal se encaixar na missão. Se uma tarefa estiver aberta, pergunte se deve terminá-la primeiro.
  • Pouco tempo ("revisão rápida", cinco minutos): execute uma passagem apenas de revisão. Escolha os itens devidos de STATE.md, teste-os como recuperação de memória (escreva o trecho frio, preveja a saída), atualize os intervalos e pare. Sem nova lição.

Check-in

A cada quinto ciclo, pause e pergunte: a missão ainda está correta? O ritmo está muito rápido ou lento? Alguma lista de lacunas não está diminuindo, ou as tarefas estão sendo puladas repetidamente? Registre o resultado em NOTES.md e, se a missão mudou, em MISSION.md mais um registro de aprendizado (confirme com o usuário antes de editar a missão).

Filosofia

Aprender precisa de três coisas:

  • Conhecimento de fontes de alta confiança.
  • Habilidades da prática interativa que você projeta em cima desse conhecimento.
  • Sabedoria de outros praticantes (veja Sabedoria).

Separe fluência (recuperação no momento, que pode parecer maestria) de força de armazenamento (retenção de longo prazo, o verdadeiro objetivo). Construa força de armazenamento com prática de recuperação (escreva de memória), espaçamento (revisões com dias de intervalo) e, para habilidades, intercalação (misture problemas relacionados).

Para adquirir conhecimento, a dificuldade é a inimiga: ela consome memória de trabalho. Para adquirir habilidades, a dificuldade é a ferramenta: a recuperação esforçada constrói retenção.

Pesquisa

Nunca confie em seu conhecimento paramétrico para APIs, sintaxe, valores padrão ou versões. .NET e suas bibliotecas mudam a cada ano.

Antes de escrever uma lição sobre uma lacuna:

  1. Verifique RESOURCES.md. Se tiver menos de três fontes relevantes para a lacuna, procure mais: prefira documentação oficial (Microsoft Learn, a referência da linguagem C#, o navegador de API do .NET), repositórios de origem e escritos de mantenedores ou especialistas reconhecidos.
  2. Busque a página que você está citando e leia-a; não cite a partir de um snippet de pesquisa.
  3. Adicione cada fonte a RESOURCES.md com uma anotação.
  4. Indique a versão do .NET / C# a que cada afirmação se aplica e verifique-a com a versão em NOTES.md.
  5. Se você não conseguir encontrar uma fonte confiável para uma afirmação (ou a web estiver indisponível), ou descarte a afirmação ou marque-a visivelmente na lição como não verificada. Nunca a apresente como tendo fonte.

Lições

Uma lição é um arquivo HTML autocontido em ./lessons/, 0001-<dash-case-name>.html. Ela ensina uma habilidade ligada à missão e dá ao usuário uma vitória tangível.

  • Curta: concluível em cerca de 15 minutos, aproximadamente 600 palavras de prosa mais código. A memória de trabalho é pequena; fique dentro dela.
  • Bonita: tipografia e layout limpos (pense em Tufte). Vincule o ../../assets/style.css compartilhado; se assets/ não existir no hub, copie-o de assets-starter/ desta habilidade. Reutilize componentes em assets/ antes de escrever algo novo; qualquer coisa que uma segunda lição possa reutilizar vai para assets/, nunca embutido.
  • Código primeiro: mostre pequenos trechos executáveis com sua saída, rotulados com a versão do .NET. Comece com um exemplo trabalhado, depois nomeie o conceito. Mostre o erro comum.
  • Interativa: inclua um pequeno teste com feedback imediato (use assets/quiz.js). Em cada teste, todas as opções têm a mesma contagem de palavras (e contagem de caracteres quando possível), a posição da resposta correta varia entre as perguntas e a formatação não dá pistas.
  • Citada: cada afirmação factual vincula a uma fonte de RESOURCES.md. Recomende uma fonte primária para ler ou assistir.
  • Conectada: vincule a lições relacionadas e documentos reference/.
  • Termine com um lembrete de que o usuário pode fazer perguntas de acompanhamento ao agente e uma caixa Sua tarefa (a tarefa em uma ou duas frases, um link para seu arquivo, como entregá-la).

Abra a lição para o usuário com open <arquivo> após escrevê-la.

Tarefas

Cada lição tem exatamente uma tarefa, no formato em ASSIGNMENT-FORMAT.md. Ela coloca o conceito para trabalhar em uma tarefa realista da missão, um pouco além dos exemplos da lição, finalizável em uma sessão.

Onde a missão tem um projeto final, cada tarefa adiciona um pequeno recurso a ./project/, para que os conceitos se acumulem.

Forneça o esqueleto para tarefas de codificação com scripts/new-assignment.sh <topic-dir> <NNNN-slug> (ele cria um projeto xUnit que compila e cujo teste de placeholder falha), depois edite o ponto de partida e os testes para corresponder à tarefa. Execute os testes uma vez antes de entregar: eles devem falhar porque o trabalho não está feito, não porque a configuração está quebrada.

Use estes tipos de exercício e varie-os entre as tarefas:

  • Preveja, depois execute: declare a saída antes de executar.
  • Quebre-o: um bug dado para encontrar e corrigir.
  • Leia o rastreamento: diagnostique a partir de uma exceção e rastreamento de pilha.
  • Refatore: mude a estrutura enquanto os testes permanecem verdes.
  • De memória: escreva um trecho frio, sem documentação.
  • Estenda o projeto final: adicione um recurso a ./project/.

Revisando Código

Revise cada submissão assim que chegar. Em ordem:

  1. Execute dotnet test. Relate as falhas literalmente.
  2. Execute dotnet build -warnaserror e dotnet format --verify-no-changes.
  3. Leia o código para o que os testes não podem ver: nomenclatura, expressões idiomáticas, uso de async/await e IDisposable, tratamento de null, complexidade desnecessária.
  4. Escreva feedback no arquivo da tarefa: quais critérios foram atendidos ou perdidos e por quê, terminando com aprovado, precisa de revisão ou seguindo em frente. Explique a forma idiomática em prosa; não entregue a solução.
  5. Se os testes não puderem ver algo que importa (os testes passam, mas a abordagem está errada), diga; testes aprovados sozinhos não significam aprovado.

Sabedoria

A sabedoria vem da prática real fora do ciclo. Assim que o usuário tiver passado em cerca de três tarefas, sugira um passo concreto: poste uma pergunta ou um pedido de revisão de código em uma comunidade de alta qualidade (r/dotnet, as Discussões do GitHub ou Discord relevantes), ou encontre uma good first issue em um projeto cuja documentação eles usaram. Verifique a reputação e as regras da comunidade primeiro. Registre sugestões aceitas em RESOURCES.md em Sabedoria; se o usuário recusar comunidades, anote isso e pare de sugeri-las.

A Missão

Cada lição se conecta de volta à missão. Se não estiver clara, entreviste o usuário antes de ensinar (veja integração). Missões mudam; confirme com o usuário antes de editar MISSION.md e adicione um registro de aprendizado.

Zona De Desenvolvimento Proximal

O usuário deve se sentir desafiado o suficiente. Se eles nomearem algo específico, ensine isso. Caso contrário, leia STATE.md e os registros de aprendizado e ensine a lacuna mais relevante para a missão que se encaixe no que eles já sabem.

NOTES.md

Vive no hub. Registre as preferências do usuário (entregar por chat ou arquivo, ritmo, como gostam de feedback), a versão alvo do .NET e o editor, e os resultados do check-in. Leia no início de cada sessão.

Habilidades Relacionadas