Communitygithub.com

Plano Lego

Use quando uma mudança já decidida deve ser transformada em uma pilha ordenada de pequenos blocos antes de alguém implementar. Não use para intenções não definidas, erros de digitação, comentários, formatação, trabalho apenas de documentação, ou para escrever a implementação em si.

O que é Plano Lego?

O Plano Lego converte uma mudança de software já definida em um DAG (Grafo Acíclico Direcionado) em camadas, quebrando a implementação em blocos pequenos e independentes. Ele é útil para planejar a execução de tarefas complexas, permitindo que um executor execute nós no mesmo nível em paralelo, atualize seus status e redesenhe o grafo conforme avança. O Plano Lego não executa código, não despacha subagentes e não carrega outras habilidades — ele apenas planeja e para. Ele é ideal para desenvolvedores que usam agentes de IA como Claude Code, Cursor ou Codex para organizar e visualizar o trabalho antes da implementação propriamente dita. O plano gera uma representação visual do DAG (usando Mermaid) e um arquivo JSON compartilhado (`.agent/scratch/lego-plan.json`) que serve como fonte de verdade para o executor.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/AlemTuzlak/skills/tree/HEAD/skills/lego-plan

Perguntar na sua IA favorita

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

Documentação

O que Plano Lego faz?

Transforme uma mudança já definida em um DAG em camadas de primitivas simples até a funcionalidade completa. Apenas planeje. Depois pare.

O grafo é uma pirâmide: blocos independentes na base, blocos compostos acima, um nó de finalização. Um executor posterior pode executar nós do mesmo nível em paralelo, alterar status e redesenhar este grafo. Esta habilidade não despacha subagentes. Não carrega outras habilidades.

Quando Usar

Carregue quando o trabalho for transformar uma mudança já definida em um mapa de implementação que o executor possa seguir.

  • Necessidade: o que construir já está escolhido. Se uma lista de arquivos a tocar ou uma seleção de caminho já estiver nesta conversa, use-os. Caso contrário, derive da intenção definida e do código. Não invente um segundo mapa do sistema.
  • Pular: erros de digitação, comentários, formatação, documentação sem código.
  • Se a intenção ainda estiver em aberto: pare. Pergunte até que a mudança esteja definida. Não empilhe blocos para uma funcionalidade que não foi escolhida.

Um nó ainda é um DAG. Emita o contrato completo.

Restrições Rígidas

  1. Apenas planeje. Não escreva código de produção. Não escreva testes. Nomeie a verificação em done when. Não a implemente aqui.
  2. Pare após a emissão. Exiba o DAG mais o arquivo de rascunho. Não despache. Não carregue a próxima habilidade.
  3. Sem ciclos. Se um bloco depende de um bloco posterior, a divisão está errada. Divida novamente.
  4. Não espere por aprovação. Mostre o DAG e pare. O usuário interrompe se estiver errado.
  5. Não abra o arquivo de rascunho para o usuário. Não escreva um plano em docs/.

Granularidade do Nó

Nó do grafo (unidade paralela): uma primitiva independente que pode ser entregue por um subagente sem esperar por outro nó em andamento.

Exemplos: write fetchOrder, write OrderCard, wire fetchOrder into the loader.

Muito grande: implement auth. Divida-o. Muito pequeno: rename a variable. Incorpore-o ao nó que precisa dele.

Partes (dentro de um nó): as funções que devem ser implementadas juntas para que o nó compile. Um subagente faz as partes em ordem. Não divida partes.

Exemplo de nó fetch-order:

  • files: src/fetchOrder.ts, src/fetchOrder.test.ts
  • parts: tipo Order, depois fetchOrder, depois escrever ou estender src/fetchOrder.test.ts
  • essas partes não são nós separados do grafo

Forma do Grafo

  • Camada 0: nós com depends on: none. O executor pode executar todos em paralelo.
  • Camada N: nós cujas dependências estão todas em camadas anteriores.
  • Última camada: um nó (ou um conjunto restrito) que significa que a funcionalidade funciona de ponta a ponta.
  • Dois nós que não dependem um do outro devem compartilhar uma camada (ou estar em camadas que não esperam uma pela outra).
  • depends on lista ids de nós, nunca nomes de arquivos.

Mesmo arquivo: se dois nós criam ou editam o mesmo caminho, eles não devem compartilhar uma camada. Mescle-os ou adicione uma aresta depends on para que um espere. Não divida um arquivo apenas para executar em paralelo. Dois nós que apenas leem um caminho podem compartilhar uma camada. files lista apenas caminhos de criação ou edição. A regra do mesmo arquivo inclui arquivos de teste.

Campos do Nó

Cada nó tem todos os sete:

  1. id: kebab-case, único neste plano, estável (um executor posterior marca este id como concluído).
  2. name: nome curto em inglês.
  3. depends on: outros ids, ou none.
  4. files: criar ou editar (caminhos). Inclua o caminho do teste de done when.
  5. parts: lista ordenada em formato C. A última parte é escrever ou estender o teste. Se done when é uma verificação manual e não há arquivo de teste, a última parte é essa verificação e files não tem caminho de teste.
  6. done when: um arquivo de teste ou comando que o executor pode executar antes de iniciar os dependentes.
  7. status: esta habilidade sempre escreve pending. Um executor posterior pode definir in-progress ou done. Esta habilidade nunca escreve esses dois.

Não coloque o código fonte completo no plano.

Quadro Vivo

Caminho: <repo>/.agent/scratch/lego-plan.json

Mesmo JSON da cerca de chat. Agentes seguem este arquivo. O produto visível para o usuário é a imagem do chat.

  • Crie .agent/scratch/ se necessário.
  • Sempre sobrescreva. Não pergunte, mesmo se nós existentes estiverem in-progress ou done.
  • Se o repositório tiver git, certifique-se de que .gitignore contenha .agent/scratch/. Se .gitignore existir e a linha estiver faltando, anexe-a. Se .gitignore estiver faltando, crie-o com essa única linha.
  • Não abra o arquivo. Não o despeje como uma segunda cópia no chat. A cerca JSON é a cópia visível para o usuário.

Procedimentos

Procedimento 1: Confirmar uma mudança definida

  1. Se a mudança estiver clara, continue.
  2. Se o usuário ainda está escolhendo o que deseja, pare. Pergunte. Volte aqui depois que estiver definida.

Procedimento 2: Coletar entradas já na sessão

  1. Se esta conversa já tiver uma lista de arquivos final, partes ou uma seleção de caminho, use-os como conjunto inicial.
  2. Se não, derive blocos da intenção definida e do código que você precisa ler para nomear arquivos. Não percorra todo o repositório.

Procedimento 3: Dividir em nós e partes

  1. Liste primitivas candidatas (granularidade B).
  2. Para cada primitiva, liste as partes C que devem compilar juntas. Termine com escrever ou estender o teste (ou a verificação manual).
  3. Desenhe depends on: um nó depende de outro apenas se chama ou incorpora o resultado desse nó.
  4. Atribua camadas com base nas dependências. Nós independentes → mesma camada.
  5. Se dois nós criam ou editam o mesmo caminho e compartilham uma camada, mescle-os ou adicione uma aresta. Em seguida, reatribua camadas.
  6. Se um ciclo aparecer, divida o nó errado e repita este procedimento.

Procedimento 4: Preencher cada nó

Preencha os sete campos. status é pending em todos os nós.

Procedimento 5: Mostrar o DAG no chat

Mostre, nesta ordem:

  1. Camadas: camada 0 até a última. Em cada camada, os nós dessa camada.
  2. Nós: os sete campos para cada id.
  3. Mermaid: sempre. Um flowchart (ou graph TD). Os ids dos nós no diagrama devem corresponder aos ids do plano. Sem classDef. Sem cores de status. Cada nó está pendente.
  4. Cerca JSON: um bloco json com o objeto do quadro vivo. Fonte verdade para ids, deps, arquivos, partes, doneWhen e status. As camadas são derivadas de depends. Não armazene um campo layer.

Em seguida, Procedimento 6.

Forma Mermaid:

flowchart TD
  fetch-order[fetch-order]
  order-card[order-card]
  wire-loader[wire-loader]
  fetch-order --> wire-loader
  order-card --> wire-loader

Nós na mesma camada não têm arestas entre si.

Forma JSON:

{
  "version": 1,
  "nodes": [
    {
      "id": "fetch-order",
      "name": "fetch order",
      "depends": [],
      "files": ["src/fetchOrder.ts", "src/fetchOrder.test.ts"],
      "parts": ["Order type", "fetchOrder", "write or extend src/fetchOrder.test.ts"],
      "doneWhen": "pnpm test src/fetchOrder.test.ts",
      "status": "pending"
    }
  ]
}

depends é um array de ids. Vazio significa nenhum.

Procedimento 6: Escrever o quadro vivo

  1. Escreva o mesmo JSON em .agent/scratch/lego-plan.json (sobrescreva).
  2. Certifique-se de que .gitignore ignore .agent/scratch/ conforme descrito em Quadro Vivo.
  3. Não abra o arquivo.

Procedimento 7: Parar

Após o Procedimento 6, pare. Não escreva código. Não despache. Não carregue outra habilidade.

Árvore de Decisão

  • Intenção não definida → Procedimento 1.
  • Mudança definida, precisa de mapa de implementação → Procedimento 2 → 3 → 4 → 5 → 6 → 7.
  • Um nó → ainda Procedimento 2 → 7 (contrato completo).
  • Erro de digitação / formatação / apenas documentação → esta habilidade não se aplica.
  • Ciclo nas dependências → Procedimento 3, passo 6.
  • Mesmo caminho em dois nós da mesma camada → Procedimento 3, passo 5.
  • Nó é "implementar a funcionalidade inteira" → divida (Procedimento 3).

Bandeiras Vermelhas

SinalO que significaFaça em vez disso
Escrever a função de busca nesta habilidadePlano se tornou implementaçãoProcedimento 7. Pare.
Uma lista linear sem camadasNão é possível expandirColoque nós independentes na mesma camada.
Despachar subagentes daquiFolha se tornou executorProcedimento 7. Pare.
Ids Mermaid diferentes dos ids dos nósExecutor não pode marcar como concluídoMesmo id em kebab-case em ambos os lugares.
Cerca JSON diferente do arquivo de rascunhoDuas fontes de verdadeEscreva um objeto. Copie-o para ambos.
Ciclo (a → b → a)Divisão está erradaDivida e reatribua camadas.
Dois nós da mesma camada editam order.tsConflito de escrita paralelaMescle ou adicione uma aresta depends on.
Dividir um arquivo para que dois nós possam executar em paraleloDesign não solicitadoMantenha o arquivo. Sequencie os nós.
Caminho do teste faltando em files / última parteNó não é entregávelProcedimento 3, passo 2.
classDef ou cores de status no Mermaid do planoEsta habilidade pinta progressoSem estilo. Tudo pendente.
Partes de um nó divididas em nós paralelos que não compilam sozinhosC tratado como BMantenha essas partes dentro de um nó.
"Implementar autenticação" como um único nóMuito grandeDivida em primitivas.
Esperar por "parece bom?"Portão é mostrar-e-pararEmita e pare.
Perguntar antes de sobrescrever o arquivo de rascunhoQuadro vivo é um slot únicoProcedimento 6. Sobrescreva.
Abrir .agent/scratch/lego-plan.jsonExtra voltado ao usuárioApenas chat. O arquivo é para agentes.
Escrever docs/lego-plan.mdArtefato extraChat mais rascunho. Sem plano em docs.

Tratamento de Erros

  • Nenhum arquivo a tocar na sessão: derive da intenção e de leituras direcionadas. Se não puder nomear arquivos, pare e diga o que está faltando. Não invente caminhos.
  • Ciclo: reporte o ciclo pelos ids. Divida. Execute novamente o Procedimento 3. Não mostre um Mermaid cíclico como plano.
  • Última camada não significa que a funcionalidade funciona: adicione um nó de finalização que depende das peças compostas (a montagem), ou diga por que a última camada atual já é o caminho ponta a ponta.
  • Usuário interrompe dizendo que um nó está errado: edite esse nó e quaisquer depends on que apontavam para ele. Mantenha ids estáveis se o nó ainda existir. Se você remover um nó, remova-o também do Mermaid e do JSON. Sobrescreva o arquivo de rascunho. Mostre o DAG novamente. Pare.
  • done when é vago ("funciona"): substitua por um comando ou caminho de teste. Se o projeto ainda não tiver um comando de teste, nomeie a verificação manual em uma linha. A última parte é essa verificação.
  • Não é um repositório git: ainda escreva .agent/scratch/lego-plan.json no diretório de trabalho, se gravável. Pule a etapa do gitignore. Diga isso em uma linha no chat.
  • Falha na escrita do rascunho (permissões, disco): ainda mostre o DAG e a cerca JSON no chat. Diga que o quadro vivo não foi escrito. Não finja que o arquivo existe.
  • JSON de rascunho existente é inválido ou está em execução: sobrescreva. Não mescle. Não pergunte.

Individual skills in this repo

This repo contains 14 individual skills — each has its own dedicated page.

AlemTuzlak/skills

Use when the user wants to write a blog post about a feature, product change, PR, git diff, or any technical topic - accepts marketing briefs, PRs, git refs, codebase paths, or freeform descriptions as input

AlemTuzlak/skills

Use when the user wants to generate a changelog, release notes, or document what changed between versions, tags, or PRs

AlemTuzlak/skills

Use when writing, editing, or organizing documentation, when planning what docs a feature needs, and whenever planning or implementing a new feature or change in a repo (docs ship with the code). Also use when tempted to write docs without showing the discovered readers to the user, without asking for tone, or without loading simple-english and i-have-adhd. Triggers on "write docs for X", "document this feature", "add a guide", "update the docs", "reorganize the docs", "plan feature X", "implement X", or /docs.

AlemTuzlak/skills

Use when a bug is in play: a test fails, CI is red, an API returns the wrong result, a stack trace appears, or the user says it is broken or fix this. Don't use for a new feature with no failure, for types-only work, or for docs.

AlemTuzlak/skills

Use when the user invokes /i-have-adhd, says they have ADHD, or asks for ADHD-friendly output. Also used as a required writing filter by the docs skill. Don't use for marketing copy or after the user says "stop adhd mode" or "normal mode".

AlemTuzlak/skills

Use when the user wants to write a product update email, feature announcement newsletter, or digest email for users or subscribers

AlemTuzlak/skills

Use when the user wants to turn a raw talking-head / screen-share recording into a finished, edited, annotated video plus a full content package. Removes silences, flags mistakes for the user to cut, transcribes, adds transcript-synced overlays (code, on-screen code highlights, word highlights, lists, comparisons, diagrams, section labels, punch-in zooms), renders with original audio, then generates blog/socials/YouTube content. Triggers on "produce a video", "edit my video", "annotate my recording", "/produce-video".

AlemTuzlak/skills

Use when the user runs /prove-it or says prove it, prove the changes, show me in the browser, or asks to prove a UI or API change. Don't use only because the agent is about to say done, for types-only work, or for docs with no behavior to prove.

AlemTuzlak/skills

Use when the user wants to write, draft, or author an RFC (Request for Comments) / technical design doc for a feature, change, or architectural decision. Interactively interviews the user, grounds the proposal in the actual codebase, presents 2-3 concrete API/code-snippet approaches to choose from, then writes a review-ready RFC. Triggers on "write an RFC", "draft an RFC", "RFC for X", "design doc for X", or /rfc.

AlemTuzlak/skills

Use when the user wants to deeply learn a new topic from scratch. Runs a pre-interview (current knowledge, end-goal proficiency, depth, practice load, background, scope), researches online (articles, niche-influencer blogs, canonical docs, subtopic landscape), then produces a structured markdown course with mandatory visual diagrams, evidence-based learning-science features (retrieval practice, spaced callbacks, worked-example fading, concept ledger, jargon gate, analogy hygiene), and a self-contained interactive HTML mini-course. Triggers on /teach-me, "teach me about X", "I want to learn X", "deep dive on X", "create a course on X", "study X with me".

AlemTuzlak/skills

Use when the change intent is already settled and the agent must map what a behavior change touches before an implementation plan or any code. Use for new features, bug fixes, and refactors that move a boundary. Don't use for typos, comments, formatting, lockfile-only diffs, docs with no code, or while the user is still deciding what they want.

AlemTuzlak/skills

Use when the user wants to transcribe a video or audio file to text with word-level timestamps — spins up a self-contained local Whisper (whisper.cpp) Docker service bundled in this skill and returns transcript.txt, transcript.srt, and word-level transcript.words.json. Also used as a building block by /produce-video. Triggers on "transcribe this video", "get a transcript", "transcribe-video".

AlemTuzlak/skills

Use when the user wants to write a video script for a product demo, feature walkthrough, launch video, or social media video about a feature or product change

AlemTuzlak/skills

Use when the user wants YouTube metadata for a video — a click-worthy title, an SEO/above-the-fold description, tags, and timestamped chapters. Accepts a transcript (ideally timestamped SRT), a topic, a PR, or a freeform description. Used standalone and by /produce-video. Triggers on "youtube title", "youtube description", "youtube chapters", "youtube tags", "youtube metadata", "youtube-copy".

Habilidades Relacionadas