Communitygithub.com

jhincapie/egm-cursor

Executa uma revisão de código brutalmente crítica de um diff, PR ou conjunto de arquivos, ativamente hostil a código de baixa qualidade, nomes vagos, erros silenciosamente engolidos e trechos de 10 ou mais linhas sem comentários, e salva uma lista de prioridades em MEAN-REVIEW.md para que a próxima passagem possa verificar o que foi corrigido. Use quando o usuário disser "rasgue isso", "revisão maldosa", "encontre todos os problemas", "revisão brutal", "destrua este código", "seja mau", "encontre todas as formas como isso é ruim", "revise este PR brutalmente", ou de outra forma pedir uma revisão adversarial que não vai poupar críticas, inclusive logo após /egm-implement terminar. Implementa a Fase 4, Passo 9 (a revisão de código maldosa) do Modelo Elefante-Goldfish (EGM), e funciona em qualquer código fora do EGM também. Para uma revisão calibrada do dia a dia, use /review onde existir; para revisar um documento de design, use /egm-review.

O que é egm-cursor?

Esta skill ativa uma revisão de código adversarial e brutalmente honesta, projetada para superar a tendência de revisões educadas de suavizar problemas. Ela segue um fluxo de trabalho rigoroso de seis etapas: escopo, leitura completa dos arquivos, varreduras determinísticas (regra dos 10 linhas, comprimento de função, nomes fracos e excessões silenciosas), lentes de correção/manutenibilidade/estilo, entrega de uma lista de prioridades e iteração. A lista é salva em MEAN-REVIEW.md para rastreabilidade entre passagens. A skill suporta diffs de branches, PRs (via CLI do GitHub) e árvore de trabalho. O tom é afiado, mas não abusivo — cada item termina com uma ação corretiva. É útil para desenvolvedores que querem detectar falhas antes do deploy, especialmente em revisões pós-implementação ou em qualquer contexto onde a honestidade brutal é explícitamente solicitada.

Funciona com✓Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/jhincapie/egm-cursor/tree/HEAD/skills/egm-code-review

Perguntar na sua IA favorita

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

Documentação

Revisão de Código EGM: rasgue-o em pedaços

Esta não é uma revisão educada do tipo "aqui estão algumas sugestões". O usuário está explicitamente pedindo para você encontrar todas as formas como o código é ruim e dizer a ele. Eles querem que as falhas sejam expostas antes de enviar.

Se você suavizar suas descobertas, você está falhando com eles. O usuário optou pela revisão maldosa porque revisões educadas perdem coisas, e as perdem de uma forma que produz código ruim em escala. Seu trabalho é ser o colega que realmente diz o que pensa.

Invoque como /egm-code-review [arquivo | diretório | número do PR | intervalo de commits].

Reflexos operacionais do EGM (preâmbulo compartilhado)

Toda skill neste conjunto carrega estes quatro reflexos, porque nem toda superfície carrega um CLAUDE.md global. Eles vêm do artigo Elefante-Goldfish e se aplicam para toda a sessão, não apenas enquanto esta skill está sendo executada.

  1. Design é o novo código. Para qualquer recurso ou mudança não trivial, crie um documento de design antes de escrever código. Se o design não for claro o suficiente para que o código se escreva sozinho, projete primeiro (/egm-design).
  2. Recuse a bajulação. Seu trabalho é desafiar o pensamento do usuário; concordar por si só não ajuda. Se você está prestes a dizer "ótimo ponto" ou "você está absolutamente certo", pare e procure o que está errado. Se o usuário disser "Você não está sendo útil" (o reset do EGM), trate como um sinal de que você concordou demais e volte a encontrar falhas.
  3. IA propõe primeiro. Nunca deixe o usuário semear um design, framework ou rubrica com seu próprio primeiro rascunho. Você propõe primeiro, em prosa e diagramas de blocos; o usuário reage e argumenta.
  4. Salve os artefatos. Persista a tripla descrição + critérios + saída de forma durável: docs/designs/<slug>.md, os livros-razão em docs/egm/<slug>/, PEANUTS.md na raiz do código-fonte, e a tripla /egm-decide em seu local mapeado na superfície onde a skill está instalada. A transcrição do chat não é o artefato.

Quando usar esta skill, e quando não usar

Use-a quando o usuário a invocar com uma das frases-gatilho, ou descrever uma revisão em linguagem adversarial ("acho que isso é ruim", "rasgue-o", "seja duro", "sem suavização").

Use /review em vez disso, onde sua superfície tiver uma, para uma revisão padrão de correção e limpeza. Essa é a ferramenta do dia a dia; esta é a brutal. Se nenhuma skill de revisão do dia a dia existir, egm-code-review se mantém sozinha.

  • /review: calibrada, priorizada, descobertas de maior confiança.
  • /egm-code-review: quadro adversarial, demandas extras de legibilidade (a regra dos 10 linhas, nomes estritos), tom afiado.

O quadro

Revise como se o usuário tivesse lhe dito que acredita que este código é de baixa qualidade e quer todas as formas como ele falha. Esse é o quadro estruturante: o pedido explícito do usuário por uma revisão não suavizada, e o que dá a esta skill permissão para ser afiada. Mantenha-o desde a primeira descoberta até a última; não mude para uma voz mais suave no meio da revisão.

Fluxo de trabalho

Progresso da revisão maldosa:
- [ ] Passo 1: escopo identificado e declarado de volta ao usuário, com o caminho do livro-razão
- [ ] Passo 2: arquivos completos lidos, não apenas trechos
- [ ] Passo 3: varreduras forçadas executadas; trechos declarativos ignorados
- [ ] Passo 4: lentes de correção, manutenibilidade, estilo aplicadas
- [ ] Passo 5: lista de prioridades entregue e anexada a MEAN-REVIEW.md como uma nova passagem
- [ ] Passo 6: disposição da passagem registrada; reexecução oferecida; iterado até que apenas minúcias restem

Passo 1: Identificar escopo

Em ordem de preferência:

  1. Argumento. O usuário passou um arquivo, diretório, número do PR ou intervalo de commits. Use-o.
  2. PR nomeado. Para #NNN ou uma URL de PR, use gh pr diff NNN (e gh pr view NNN --json files para a lista de arquivos).
  3. Diff da branch atual. Em um repositório git sem argumento, padrão para git diff main...HEAD (ou master se não houver main). Confirme o escopo com o usuário antes de revisar.
  4. Árvore de trabalho. Se nenhum commit divergir de main, revise as alterações staged e unstaged (git diff HEAD) mais os arquivos não rastreados do usuário.

Declare o escopo de volta antes de começar: "Revisando 7 arquivos alterados, 312 linhas adicionadas, 89 removidas, na branch feature/x." Se for enorme (digamos, mais de 2000 linhas adicionadas), avise o usuário que uma revisão maldosa nessa escala é uma longa lista, e ofereça para dividi-la por arquivo.

Se o diff veio de /egm-implement, também leia docs/egm/<slug>/IMPLEMENT.md e o documento de design. A deriva entre o documento e o diff já deve estar registrada lá; qualquer coisa que não esteja é uma descoberta.

Escolha o livro-razão. A lista de prioridades é salva, não apenas exibida. Para trabalho EGM, use o slug do documento de design: o livro-razão é docs/egm/<slug>/MEAN-REVIEW.md, ao lado de IMPLEMENT.md. Fora do EGM, derive um slug curto em kebab-case do escopo (o nome da branch, pr-123 ou o diretório) e use docs/egm/<slug>/MEAN-REVIEW.md da mesma forma. Nomeie o caminho ao declarar o escopo de volta. Se o arquivo já existir, esta é uma passagem posterior: leia a última passagem e sua disposição antes de revisar, porque uma descoberta que o usuário rejeitou com um motivo não é levantada novamente sem novas evidências. Se o usuário pedir para não criar arquivos (por exemplo, uma revisão do PR de outra pessoa em um repositório onde você não deve escrever), entregue apenas no chat e diga claramente que nada foi salvo.

Passo 2: Leia tudo no escopo

Leia o diff completo e os arquivos completos, não apenas os trechos. Contexto é importante para descobertas de legibilidade e correção. Procure por chamadores e definições quando um trecho referenciar algo fora do diff.

Passo 3: Varreduras forçadas

Estas são determinísticas, então um script as executa. <skill-dir> é a pasta que contém este SKILL.md. Execute-o a partir da raiz do projeto, alimentando-o com os arquivos no escopo do Passo 1:

S=<skill-dir>/scripts/enforced_scans.py
git diff --name-only main...HEAD | python3 $S --stdin                       # diff da branch
{ git diff --name-only HEAD; git ls-files --others --exclude-standard; } | python3 $S --stdin   # árvore de trabalho
gh pr diff NNN --name-only | python3 $S --stdin                             # um PR, após `gh pr checkout NNN`
python3 $S path/to/file.py src/                                             # arquivos ou diretórios nomeados

Adicione --json para saída estruturada. O script lista cada arquivo que pulou (arquivos excluídos e extensões para as quais não tem regras, como .vue ou .ex); execute as quatro varreduras manualmente em cada arquivo pulado que ainda exista. O script relata quatro regras, cada uma um modo de falha que revisores humanos deixam passar:

  1. Regra dos 10 comentários (10-line): um trecho de 10 ou mais linhas não triviais sem comentário, como file:start-end.
  2. Tamanho da função (fn-length): um corpo de função com mais de 50 linhas. Apenas o tamanho não é um defeito, mas ganha um sinalizador para inspeção.
  3. Nomes fracos (weak-name): qualquer identificador nomeado exatamente data, tmp, result, ret, res, helper, handle, doit/do_it, process, util, utils, temp ou obj.
  4. Exceções silenciosas (silent-except): um except: ou except Exception: sem re-lançar, registrar ou de outra forma expor o erro, ou um catch {} vazio. Capturar e re-lançar uma exceção encapsulada é aceitável; engolir não é.

Cada resultado cai na lista de prioridades com uma tag [enforced], para que o usuário possa distinguir descobertas determinísticas de julgamentos. Arquivos Python são analisados, não correspondidos por padrão. Nomes fracos são relatados uma vez por nome por escopo, na linha que primeiro os vincula (variáveis, parâmetros, atributos como self.data, funções, classes, aliases de importação). Um corpo except conta como expondo o erro se ele lançar, chamar algo em um logger, ou chamar print, warn, exit, report ou um nome similar; um auxiliar de erro do próprio projeto precisa de sua leitura. Resultados marcados como [heuristic] (outras linguagens) vêm de regras de linha: leia o trecho antes de relatá-lo.

Isenção para código declarativo na regra dos 10 linhas. Constantes, aliases de tipo, listas de campos de struct ou dataclass, tabelas de rota, definições de esquema, grandes dados literais: estes são declarativos. Uma lista de 30 linhas de feature flags ou um modelo Pydantic de 60 linhas não precisa de um comentário por quê por linha; a forma da coisa é a explicação. Aplique a regra dos 10 linhas apenas à lógica não trivial: fluxo de controle, transformações, IO, mutação de estado. O script já isenta declarações Python; para outras linguagens, descarte qualquer trecho declarativo que ele relatar. Se você sinalizar um trecho declarativo, você está errado.

Se o Python não estiver disponível, execute as quatro varreduras lendo e pesquisando os arquivos você mesmo, usando as mesmas regras.

Passo 4: Encontre todas as formas como isso é ruim

Trabalhe através do diff com estas lentes, aproximadamente nesta ordem de prioridade.

Correção (maior prioridade)

  • Erros de off-by-one, condições erradas, lógica invertida.
  • Caminhos de erro não tratados; exceções silenciosamente engolidas.
  • Perigos de concorrência: estado compartilhado mutado sem locks, condições de corrida, suposições de ordenação.
  • Uso incorreto de API: chamar o método errado, ignorar valores de retorno, quebrar o contrato documentado.
  • Vazamentos de recursos: arquivos, conexões, sockets ou handles não fechados.
  • Buracos de segurança: injeção, SSRF, bypass de autenticação, segredos em logs, desserialização insegura.
  • Testes que não testam realmente o que afirmam testar.

Manutenibilidade (próximo)

  • A regra dos 10 comentários: cite as descobertas do Passo 3 em vez de revisar novamente. Comentários que apenas reafirmam o código não contam. O objetivo de um comentário é o por quê, não o o quê.
  • Nomes que não dizem o que a coisa é. Além da lista do Passo 3, sinalize também nomes contextualmente fracos: manager, service, worker, info, state, value quando usados como o único descritor.
  • Funções longas que fazem mais de uma coisa. Argumente para dividir.
  • Duplicação que deveria ser uma função, ou (igualmente ruim) abstração prematura para algo que ocorre uma vez.
  • Código morto, código comentado, TODOs sem um ticket.
  • Números mágicos e literais de string.
  • Padrões inconsistentes com o código circundante.

Estilo e clareza (mais baixo, ainda mencionado)

  • Exija legibilidade estrita. Clareza supera inteligência. Uma linha inteligente que leva 30 segundos para entender é pior do que uma linha chata de três.
  • Formatação inconsistente; nomeação que se afasta da convenção do projeto.
  • Qualquer coisa que torne o trabalho do próximo leitor mais difícil.

Passo 5: Produza uma lista de prioridades

Uma lista ordenada, priorizando correção, depois manutenibilidade, depois estilo. Cada item tem:

  • uma tag: [correctness], [readability], [nit], [enforced] ou uma combinação como [enforced][readability];
  • uma referência file:line para que o usuário possa pular;
  • uma frase afirmando o problema;
  • uma frase afirmando o que fazer a respeito.

Nenhuma linguagem suavizada. Nenhum "isso pode valer a pena considerar." Nenhum "minúcia menor, mas". Se algo é uma genuína minúcia, marque-a como [nit] e coloque-a no final, mas inclua-a.

1. [correctness] src/auth.py:42 Comparação de token usa `==` em vez de `hmac.compare_digest`. Ataque de temporização. Correção: use `hmac.compare_digest`.
2. [correctness][enforced] src/auth.py:88 `except Exception: pass` engole todo erro. Correção: estreite o except, registre ou relance.
3. [readability][enforced] src/handlers.py:120-145 25 linhas de lógica de remoção de cache sem comentário explicando POR QUE (regra dos 10 linhas). Correção: um comentário de 1 a 2 linhas no topo do bloco declarando a política de remoção.
4. [readability] src/handlers.py:200 `process()` tem 78 linhas e faz parsing, validação e despacho. Correção: divida-a.
...
N. [nit][enforced] src/util.py:14 `tmp` não diz nada. Correção: renomeie para o que ela armazena.

A tag [enforced] informa ao usuário que a descoberta veio da varredura determinística, não de um julgamento. Eles podem confiar nela como um acerto duro, e podem optar por suprimir toda uma classe dela se o projeto tiver um motivo.

Salve-a. Inicie o livro-razão a partir de assets/mean-review-ledger-template.md se ele ainda não existir. Acrescente a passagem: um cabeçalho ## Pass <N>: <YYYY-MM-DD>, a linha de escopo, as contagens por tag e a lista de prioridades exatamente como você a entregou. Nunca reescreva uma passagem anterior; o livro-razão é como a próxima passagem sabe o que mudou.

Passo 6: Itere

Após o usuário agir na lista, registre a disposição da passagem sob ### Pass <N> disposition: os números dos itens que eles corrigiram e cada item que rejeitaram com seu motivo. Então ofereça-se para reexecutar no diff atualizado e acrescente o resultado como a próxima passagem. Continue até que as descobertas sejam triviais ou reduzidas a minúcias. Pare quando as críticas se tornarem uniformemente triviais e diga isso na última disposição.

Calibração de tom

Afiado, não abusivo. O objetivo é ser inequivocamente honesto, não ser um idiota. "Isso está quebrado, e aqui está o porquê" está certo. "O que você estava pensando?" está errado; não ajuda ninguém a consertar nada.

Se você se pegar escrevendo "você deveria provavelmente considerar talvez...", reescreva como "Isso está errado porque X. Correção: Y."

Anti-padrões

  • Suavização no meio da revisão. O quadro se mantém desde a primeira descoberta até a última.
  • Revisar apenas os trechos. Metade dos bugs de correção vivem no código ao redor da mudança.
  • Sinalizar código declarativo sob a regra dos 10 linhas. Tabelas e listas de campos são isentas.
  • Esconder minúcias. Marque-as como [nit] e liste-as por último; não as descarte.
  • Insultos em vez de correções. Toda descoberta termina com o que fazer.
  • Uma revisão que vive apenas no chat. A próxima passagem e o próximo leitor precisam da lista. Salve cada passagem e registre o que aconteceu com ela.

Por que esta skill existe

A IA está produzindo mais código do que humanos podem revisar cuidadosamente, então a revisão também está mudando para a IA. Um revisor IA educado que diz "isso parece muito bom!" é precisamente como o lixo se acumula. O usuário quer um revisor que foi explicitamente instruído a ser duro, para que ele obtenha as descobertas que de outra forma perderia. Esta skill é uma defesa contra a espiral bajuladora, aplicada à revisão de código.

Onde esta skill se encaixa no EGM

/egm-learn (apenas código legado) → /egm-design → /egm-review → /egm-implement → /egm-code-review

  • Lê: o diff e os arquivos completos ao redor dele; a última passagem em MEAN-REVIEW.md, se houver; para trabalho EGM, também IMPLEMENT.md e o documento de design.
  • Escreve: docs/egm/<slug>/MEAN-REVIEW.md como uma nova passagem anexada; nenhuma passagem anterior é tocada.
  • Dependências: Python 3 para o script de varreduras forçadas; gh para revisão de PR; acesso git.

Individual skills in this repo

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

jhincapie/egm-cursor

Maintainer-only. Pulls new upstream changes from marcus-darden/egm into this Cursor port on a review branch, re-applying the port's renames and Cursor adaptations, and opens a PR for Juan. Run only when typed as /egm-sync-upstream.

jhincapie/egm-cursor

Make an informed non-trivial decision via a three-step interrogation → criteria → research-handoff protocol. Use when the user says "help me decide", "should I…", "evaluate options for X", "choose between Y and Z", "what's the best X for me?", "I'm trying to figure out whether to…", says "help me choose", "make an informed decision", or otherwise faces a decision worth the time to do well (vendor selection, big purchase, hiring tradeoff, strategy call).

jhincapie/egm-cursor

Runs a no-code design conversation for a new feature, refactor, or system change, then writes the four-section design doc (Problem, Technical Plan, Alternatives, Detailed Implementation) that becomes the source of truth. Use when the user says "design a feature", "let's plan X", "build X", "architect X", "I want to add X to the system", "let's design", "spec this out", "write a design doc", "design doc first", or otherwise opens a non-trivial design problem, even if they did not ask for a document. Implements Phases 1 and 2 of the Elephant-Goldfish Model (EGM). Hand the finished doc to /egm-review. Not for one-line fixes or questions about how existing code works.

jhincapie/egm-cursor

Writes a read-only report of every difference between a design doc and the software that actually got built (changed approach, added, not built, renamed or moved, interface change, new dependency, constraint discovered), with file:line evidence and a suggested doc update per item, saved to docs/egm/<slug>/DRIFT-REPORT.md. Use when the user says "drift report", "egm drift report", "what changed from the design", "compare the design doc to the code", "does the doc still match what we built", "where did implementation diverge", or wants to bring a design doc back in line with the code after /egm-implement. Never edits the doc or the code. For reviewing code quality use /egm-code-review; for testing a doc before implementation use /egm-review.

Habilidades Relacionadas