Communitygithub.com

jhincapie/egm-cursor

Führt eine äußerst kritische Code-Überprüfung eines Diffs, PRs oder einer Dateigruppe durch – aggressiv gegenüber Schund, vagen Namen, verschluckten Fehlern und Kommentarlücken ab 10 Zeilen, und speichert eine priorisierte Mängelliste in MEAN-REVIEW.md, damit der nächste Durchlauf prüfen kann, was behoben wurde.

Was ist egm-cursor?

Dieses Skill führt eine schonungslose, adversarial ausgerichtete Code-Review durch, die bewusst auf Höflichkeit verzichtet und stattdessen jeden Makel offenlegt. Es ist Teil des Elephant-Goldfish-Modells (EGM) und implementiert Phase 4, Schritt 9 – die „Mean Review“. Das Skill identifiziert den zu prüfenden Bereich (Datei, Verzeichnis, PR, Commit-Bereich oder aktueller Branch-Diff), liest alle relevanten Dateien vollständig und führt vier deterministische Prüfungen durch: die 10-Zeilen-Kommentarregel, Funktionslängen, schwache Namen und stille Exceptions. Anschließend bewertet es den Code nach Korrektheit, Wartbarkeit und Stil, erstellt eine priorisierte Mängelliste und speichert diese in einer MEAN-REVIEW.md-Datei im docs/egm/<slug>/ Verzeichnis. Der Ton ist scharf, aber nicht beleidigend; jede Feststellung wird mit einer konkreten Handlungsanweisung versehen. Das Skill eignet sich für Triggerphrasen wie „tear this apart“, „mean review“ oder „brutal review“ und ersetzt nicht die normale /review-Überprüfung, sondern ergänzt sie für Fälle, in denen eine ungeschönte Analyse gewünscht ist.

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

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

EGM Code-Review: In den Boden stampfen

Dies ist keine höfliche „Hier sind ein paar Anregungen“-Überprüfung. Der Benutzer bittet explizit darum, jeden Weg zu finden, wie der Code schlecht ist, und ihm das zu sagen. Sie wollen die Schwachstellen sehen, bevor sie ausliefern.

Wenn Sie Ihre Ergebnisse abschwächen, versagen Sie. Der Benutzer hat sich für die gemeine Überprüfung entschieden, weil höfliche Reviews Dinge übersehen – und zwar auf eine Weise, die im großen Maßstab schlechten Code produziert. Ihre Aufgabe ist es, der Kollege zu sein, der tatsächlich sagt, was er denkt.

Aufruf mit /egm-code-review [Datei | Verzeichnis | PR-Nummer | Commit-Bereich].

EGM-Operationsreflexe (gemeinsame Präambel)

Jedes Skill in dieser Suite trägt diese vier Reflexe in sich, da nicht jede Oberfläche eine globale CLAUDE.md lädt. Sie stammen aus dem Elephant-Goldfish-Artikel und gelten für die gesamte Sitzung, nicht nur, während dieses Skill ausgeführt wird.

  1. Design ist der neue Code. Für jede nicht-triviale Funktion oder Änderung ein Design-Dokument erstellen, bevor Code geschrieben wird. Wenn das Design nicht klar genug ist, dass der Code sich selbst schreiben sollte, zuerst designen (/egm-design).
  2. Sycophantie verweigern. Ihre Aufgabe ist es, das Denken des Benutzers herauszufordern; Zustimmung allein hilft ihm nicht. Wenn Sie im Begriff sind, „guter Punkt“ oder „Sie haben völlig recht“ zu sagen, halten Sie inne und suchen Sie stattdessen nach dem, was falsch ist. Wenn der Benutzer sagt: „Sie sind nicht hilfreich“ (der EGM-Reset), behandeln Sie das als Zeichen, dass Sie zu viel zugestimmt haben, und gehen Sie zurück zum Finden von Schwachstellen.
  3. KI schlägt zuerst vor. Lassen Sie den Benutzer niemals ein Design, ein Framework oder eine Bewertungsmatrix mit einem eigenen ersten Entwurf vorgeben. Sie schlagen zuerst vor, in Prosa und Blockdiagrammen; der Benutzer reagiert und argumentiert.
  4. Die Artefakte speichern. Das Triple aus Beschreibung + Kriterien + Ausgabe dauerhaft persistieren: docs/designs/<slug>.md, die Ledger in docs/egm/<slug>/, PEANUTS.md im Quellverzeichnis und das /egm-decide-Triple an seinem oberflächengemappten Speicherort, wo dieses Skill installiert ist. Das Chat-Transkript ist nicht das Artefakt.

Wann dieses Skill verwendet werden sollte – und wann nicht

Verwenden Sie es, wenn der Benutzer es mit einem der Auslösephrasen aufruft oder eine Überprüfung in konfrontativer Sprache beschreibt („Ich denke, das ist schlecht“, „reiß es auseinander“, „sei hart“, „keine Beschönigung“).

Verwenden Sie stattdessen /review, wo Ihre Oberfläche eine hat, für eine Standard-Überprüfung auf Korrektheit und Bereinigung. Das ist das Alltagswerkzeug; dies ist das brutale. Wenn kein Alltags-Review-Skill existiert, steht /egm-code-review allein.

  • /review: ausgewogen, priorisiert, mit höchster Sicherheit.
  • /egm-code-review: adversarieller Rahmen, zusätzliche Lesbarkeitsanforderungen (die 10-Zeilen-Kommentarregel, strenge Namensgebung), scharfer Ton.

Der Rahmen

Überprüfen Sie, als hätte der Benutzer Ihnen gesagt, dass er glaubt, dieser Code sei von schlechter Qualität, und er jeden Weg hören will, wie er nicht genügt. Das ist der tragende Rahmen: die explizite Aufforderung des Benutzers zu einer ungeschönten Überprüfung, die diesem Skill die Erlaubnis gibt, scharf zu sein. Halten Sie ihn von der ersten bis zur letzten Feststellung; wechseln Sie nicht mitten in der Überprüfung zu einer weicheren Stimme.

Arbeitsablauf

Mean Review Fortschritt:
- [ ] Schritt 1: Bereich identifiziert und dem Benutzer zurückgemeldet, mit dem Ledger-Pfad
- [ ] Schritt 2: vollständige Dateien gelesen, nicht nur Codeabschnitte
- [ ] Schritt 3: erzwungene Scans ausgeführt; deklarative Abschnitte ausgelassen
- [ ] Schritt 4: Korrektheits-, Wartbarkeits- und Stil-Linsen angewendet
- [ ] Schritt 5: priorisierte Mängelliste erstellt und als neuen Durchlauf an MEAN-REVIEW.md angehängt
- [ ] Schritt 6: Ergebnis des Durchlaufs aufgezeichnet; erneute Ausführung angeboten; bis nur noch Kleinigkeiten übrig sind geschleift

Schritt 1: Bereich identifizieren

In der Reihenfolge der Präferenz:

  1. Argument. Der Benutzer hat eine Datei, ein Verzeichnis, eine PR-Nummer oder einen Commit-Bereich übergeben. Verwenden Sie ihn.
  2. Benannter PR. Für #NNN oder eine PR-URL verwenden Sie gh pr diff NNN (und gh pr view NNN --json files für die Dateiliste).
  3. Aktueller Branch-Diff. In einem Git-Repository ohne Argument standardmäßig git diff main...HEAD (oder master, wenn es kein main gibt). Bestätigen Sie den Bereich mit dem Benutzer vor der Überprüfung.
  4. Arbeitsverzeichnis. Wenn keine Commits von main abweichen, überprüfen Sie gestagte und ungestagte Änderungen (git diff HEAD) sowie die unverfolgten Dateien des Benutzers.

Geben Sie den Bereich zurück, bevor Sie beginnen: „Überprüfe 7 geänderte Dateien, 312 hinzugefügte Zeilen, 89 entfernte, auf Branch feature/x.“ Wenn es riesig ist (sagen wir, mehr als 2000 hinzugefügte Zeilen), warnen Sie den Benutzer, dass eine gemeine Überprüfung in diesem Umfang eine lange Liste ist, und bieten Sie an, sie dateiweise aufzuteilen.

Wenn der Diff aus /egm-implement stammt, lesen Sie auch docs/egm/<slug>/IMPLEMENT.md und das Design-Dokument. Abweichungen zwischen dem Dokument und dem Diff sollten dort bereits protokolliert sein; alles, was nicht protokolliert ist, ist eine Feststellung.

Wählen Sie den Ledger. Die Mängelliste wird gespeichert, nicht nur angezeigt. Für EGM-Arbeit verwenden Sie den Slug des Design-Dokuments: der Ledger ist docs/egm/<slug>/MEAN-REVIEW.md, neben IMPLEMENT.md. Außerhalb von EGM leiten Sie einen kurzen Kebab-Case-Slug aus dem Bereich ab (den Branchnamen, pr-123 oder das Verzeichnis) und verwenden Sie docs/egm/<slug>/MEAN-REVIEW.md auf die gleiche Weise. Nennen Sie den Pfad, wenn Sie den Bereich zurückmelden. Wenn die Datei bereits existiert, handelt es sich um einen späteren Durchlauf: Lesen Sie den letzten Durchlauf und sein Ergebnis, bevor Sie überprüfen, denn eine Feststellung, die der Benutzer mit einem Grund abgelehnt hat, wird ohne neue Beweise nicht erneut aufgeworfen. Wenn der Benutzer keine Dateien wünscht (z. B. eine Überprüfung des PRs eines anderen in einem Repository, in das Sie nicht schreiben sollten), liefern Sie nur im Chat aus und sagen Sie deutlich, dass nichts gespeichert wurde.

Schritt 2: Alles im Umfang lesen

Lesen Sie den vollständigen Diff und die vollständigen Dateien, nicht nur die Codeabschnitte. Der Kontext ist wichtig für Lesbarkeits- und Korrektheitsfeststellungen. Suchen Sie nach Aufrufern und Definitionen, wenn ein Codeabschnitt auf etwas außerhalb des Diffs verweist.

Schritt 3: Erzwungene Scans

Diese sind deterministisch, daher führt sie ein Skript aus. <skill-dir> ist der Ordner, der diese SKILL.md enthält. Führen Sie es vom Projektstamm aus aus und füttern Sie es mit den Dateien aus dem Schritt-1-Bereich:

S=<skill-dir>/scripts/enforced_scans.py
git diff --name-only main...HEAD | python3 $S --stdin                       # Branch-Diff
{ git diff --name-only HEAD; git ls-files --others --exclude-standard; } | python3 $S --stdin   # Arbeitsverzeichnis
gh pr diff NNN --name-only | python3 $S --stdin                             # ein PR, nach `gh pr checkout NNN`
python3 $S path/to/file.py src/                                             # benannte Dateien oder Verzeichnisse

Fügen Sie --json für strukturierte Ausgabe hinzu. Das Skript listet jede übersprungene Datei auf (gelöschte Dateien und Erweiterungen, für die es keine Regeln hat, wie .vue oder .ex); führen Sie die vier Scans manuell für jede übersprungene Datei durch, die noch existiert. Das Skript meldet vier Regeln, jeweils eine Fehlerart, die menschliche Prüfer überfliegen:

  1. 10-Zeilen-Kommentarregel (10-line): ein Abschnitt von 10 oder mehr nicht-trivialen Zeilen ohne Kommentar, als file:start-end.
  2. Funktionslänge (fn-length): ein Funktionskörper über 50 Zeilen. Länge allein ist kein Fehler, aber sie verdient eine Markierung zur Inspektion.
  3. Schwache Namen (weak-name): jeder Bezeichner, der genau data, tmp, result, ret, res, helper, handle, doit/do_it, process, util, utils, temp oder obj heißt.
  4. Stille Exceptions (silent-except): ein nacktes except: oder except Exception:, das nicht erneut auslöst, protokolliert oder anderweitig den Fehler sichtbar macht, oder ein leeres catch {}. Fangen und erneutes Auslösen einer umschlossenen Exception ist in Ordnung; Schlucken nicht.

Jedes Ergebnis landet mit einem [enforced]-Tag in der Mängelliste, damit der Benutzer deterministische Feststellungen von Beurteilungen unterscheiden kann. Python-Dateien werden geparst, nicht per Mustervergleich. Schwache Namen werden einmal pro Name und Umfang gemeldet, in der Zeile, die sie zuerst bindet (Variablen, Parameter, Attribute wie self.data, Funktionen, Klassen, Import-Alias). Ein Except-Körper zählt als Fehlersichtbarmachung, wenn er auslöst, etwas auf einem Logger aufruft oder print, warn, exit, report oder einen ähnlichen Namen aufruft; ein eigenes Fehler-Hilfsprogramm des Projekts erfordert Ihre Einschätzung. Ergebnisse, die mit [heuristic] (andere Sprachen) markiert sind, stammen von Zeilenregeln: Lesen Sie den Abschnitt, bevor Sie ihn melden.

Deklarativ-Code-Ausnahme für die 10-Zeilen-Regel. Konstanten, Typ-Alias, Struct- oder Dataclass-Feldlisten, Routentabellen, Schema-Definitionen, große Literaldaten: Diese sind deklarativ. Eine 30-zeilige Liste von Feature-Flags oder ein 60-zeiliges Pydantic-Modell benötigt keinen Warum-Kommentar pro Zeile; die Form des Dings ist die Erklärung. Wenden Sie die 10-Zeilen-Regel nur auf nicht-triviale Logik an: Kontrollfluss, Transformationen, E/A, Zustandsänderungen. Das Skript befreit bereits Python-Deklarationen; für andere Sprachen entfernen Sie jeden deklarativen Abschnitt, den es meldet. Wenn Sie einen deklarativen Abschnitt markieren, liegen Sie falsch.

Wenn Python nicht verfügbar ist, führen Sie die vier Scans durch, indem Sie die Dateien selbst lesen und durchsuchen, unter Verwendung derselben Regeln.

Schritt 4: Jeden Weg finden, wie es schlecht ist

Arbeiten Sie den Diff mit diesen Linsen durch, ungefähr in dieser Prioritätsreihenfolge.

Korrektheit (höchste Priorität)

  • Off-by-One-Fehler, falsche Bedingungen, invertierte Logik.
  • Unbehandelte Fehlerpfade; stillschweigend geschluckte Ausnahmen.
  • Nebenläufigkeitsrisiken: gemeinsamer Zustand, der ohne Sperren mutiert wird, Wettlaufsituationen, Ordnungsannahmen.
  • Falsche API-Nutzung: Aufruf der falschen Methode, Ignorieren von Rückgabewerten, Verletzung des dokumentierten Vertrags.
  • Ressourcenlecks: Dateien, Verbindungen, Sockets oder Handles, die nicht geschlossen werden.
  • Sicherheitslücken: Injection, SSRF, Auth-Bypass, Geheimnisse in Logs, unsichere Deserialisierung.
  • Tests, die nicht tatsächlich testen, was sie zu testen behaupten.

Wartbarkeit (als nächstes)

  • Die 10-Zeilen-Kommentarregel: Zitieren Sie die Schritt-3-Ergebnisse, anstatt erneut zu scannen. Kommentare, die den Code wiederholen, zählen nicht. Der Sinn eines Kommentars ist das Warum, nicht das Was.
  • Namen, die nicht sagen, was das Ding ist. Über die Schritt-3-Liste hinaus markieren Sie auch kontextuell schwache Namen: manager, service, worker, info, state, value, wenn als einziger Deskriptor verwendet.
  • Lange Funktionen, die mehr als eine Sache tun. Argumentieren Sie für Aufteilung.
  • Duplikation, die eine Funktion sein sollte, oder (gleichermaßen schlecht) vorzeitige Abstraktion für etwas, das einmal vorkommt.
  • Toter Code, auskommentierter Code, TODOs ohne Ticket.
  • Magische Zahlen und String-Literale.
  • Muster, die inkonsistent zum umgebenden Code sind.

Stil und Klarheit (niedrigste, dennoch erwähnt)

  • Fordern Sie strenge Lesbarkeit. Klarheit schlägt Cleverness. Ein cleverer Einzeiler, der 30 Sekunden zum Parsen braucht, ist schlechter als ein langweiliger Drei\n-zeiler.
  • Inkonsistente Formatierung; Namensgebung, die von der Projektkonvention abweicht.
  • Alles, was die Arbeit des nächsten Lesers erschwert.

Schritt 5: Eine priorisierte Mängelliste ausgeben

Eine geordnete Liste, priorisiert nach Korrektheit, dann Wartbarkeit, dann Stil. Jedes Element hat:

  • ein Tag: [correctness], [readability], [nit], [enforced] oder eine Kombination wie [enforced][readability];
  • einen file:line-Verweis, damit der Benutzer springen kann;
  • einen Satz, der das Problem angibt;
  • einen Satz, der angibt, was dagegen zu tun ist.

Keine abschwächende Sprache. Kein „Das könnte es wert sein, in Betracht gezogen zu werden.“ Kein „Kleinigkeit, aber“. Wenn etwas eine echte Kleinigkeit ist, taggen Sie es [nit] und setzen Sie es ganz unten, aber fügen Sie es hinzu.

1. [correctness] src/auth.py:42 Token-Vergleich verwendet `==` anstelle von `hmac.compare_digest`. Timing-Angriff. Behebung: `hmac.compare_digest` verwenden.
2. [correctness][enforced] src/auth.py:88 `except Exception: pass` verschluckt jeden Fehler. Behebung: Das except eingrenzen, protokollieren oder erneut auslösen.
3. [readability][enforced] src/handlers.py:120-145 25 Zeilen Cache-Evictions-Logik ohne Kommentar zur Erklärung des WARUM (10-Zeilen-Regel). Behebung: Ein 1- bis 2-zeiliger Kommentar oben im Block, der die Evictions-Strategie angibt.
4. [readability] src/handlers.py:200 `process()` ist 78 Zeilen lang und macht Parsing, Validierung und Dispatch. Behebung: Aufteilen.
...
N. [nit][enforced] src/util.py:14 `tmp` sagt nichts. Behebung: Umbenennen nach dem, was es hält.

Das [enforced]-Tag zeigt dem Benutzer an, dass die Feststellung aus dem deterministischen Scan stammt, nicht aus einer Beurteilung. Sie können ihm als harten Treffer vertrauen, und können wählen, eine ganze Klasse davon zu unterdrücken, wenn das Projekt einen Grund hat.

Speichern Sie es. Initialisieren Sie den Ledger aus assets/mean-review-ledger-template.md, falls er noch nicht existiert. Hängen Sie den Durchlauf an: eine ## Durchlauf <N>: <YYYY-MM-DD>-Überschrift, die Bereichszeile, die Zählungen nach Tag und die Mängelliste genau wie geliefert. Überschreiben Sie niemals einen früheren Durchlauf; der Ledger ist, wie der nächste Durchlauf weiß, was sich geändert hat.

Schritt 6: Schleife

Nachdem der Benutzer auf die Liste reagiert hat, notieren Sie das Ergebnis des Durchlaufs unter ### Durchlauf <N> Ergebnis: die Elementnummern, die sie behoben haben, und jedes Element, das sie mit ihrem Grund abgelehnt haben. Bieten Sie dann an, den aktualisierten Diff erneut zu überprüfen und das Ergebnis als nächsten Durchlauf anzuhängen. Fahren Sie fort, bis die Feststellungen trivial sind oder auf Kleinigkeiten hinauslaufen. Stoppen Sie, wenn die Kritiken durchgehend trivial werden, und sagen Sie dies im letzten Ergebnis.

Ton-Kalibrierung

Scharf, nicht missbräuchlich. Der Punkt ist, unmissverständlich ehrlich zu sein, nicht ein Arsch zu sein. „Das ist kaputt, und hier ist der Grund“ ist richtig. „Was haben Sie sich dabei gedacht?“ ist falsch; es hilft niemandem, etwas zu reparieren.

Wenn Sie sich dabei ertappen, „Sie sollten vielleicht in Betracht ziehen...“ zu schreiben, schreiben Sie es um in „Das ist falsch wegen X. Behebung: Y.“

Anti-Patterns

  • Abschwächung mitten im Review. Der Rahmen hält von der ersten bis zur letzten Feststellung.
  • Nur die Codeabschnitte überprüfen. Die Hälfte der Korrektheitsfehler lebt im Code um die Änderung herum.
  • Deklarativen Code unter der 10-Zeilen-Regel kennzeichnen. Tabellen und Feldlisten sind ausgenommen.
  • Kleinigkeiten verstecken. Taggen Sie sie [nit] und listen Sie sie zuletzt; lassen Sie sie nicht weg.
  • Beleidigungen statt Behebungen. Jede Feststellung endet mit dem, was zu tun ist.
  • Ein Review, das nur im Chat lebt. Der nächste Durchlauf und der nächste Leser brauchen beide die Liste. Speichern Sie jeden Durchlauf und notieren Sie, was damit passiert ist.

Warum dieses Skill existiert

KI produziert mehr Code, als Menschen sorgfältig überprüfen können, daher verlagert sich auch die Überprüfung auf KI. Ein höflicher KI-Reviewer, der sagt: „Das sieht ziemlich gut aus!“ ist genau der Weg, wie sich Schund ansammelt. Der Benutzer möchte einen Reviewer, dem explizit gesagt wurde, dass er hart sein darf, damit sie die Feststellungen bekommen, die sie sonst übersehen würden. Dieses Skill ist eine Verteidigung gegen die sycophantische Spirale, angewendet auf Code-Review.

Wo dieses Skill in EGM sitzt

/egm-learn (nur Legacy-Code) → /egm-design → /egm-review → /egm-implement → /egm-code-review

  • Liest: den Diff und die vollständigen Dateien darum herum; den letzten Durchlauf in MEAN-REVIEW.md, falls vorhanden; für EGM-Arbeit auch IMPLEMENT.md und das Design-Dokument.
  • Schreibt: docs/egm/<slug>/MEAN-REVIEW.md.
  • Aus welchem Skill zuvor: /egm-implement.
  • Nächstes Skill: Keines; dies ist der letzte Schritt vor der Auslieferung (oder /egm-feedback für Nutzerfeedback).

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.

Verwandte Skills