jhincapie/egm-cursor

Réservé au mainteneur. Récupère les nouvelles modifications en amont de marcus-darden/egm dans ce port Cursor sur une branche de revue, en réappliquant les renommages et adaptations Cursor du port, et ouvre une PR pour Juan. À exécuter uniquement avec /egm-sync-upstream.

Qu'est-ce que egm-cursor ?

Cette compétence est conçue pour synchroniser les modifications du dépôt upstream `marcus-darden/egm` vers un port Cursor nommé `jhincapie/egm-cursor`, tout en préservant les renommages, adaptations Cursor et fichiers propres au port. Elle est destinée au seul mainteneur (Juan) et s'invoque via la commande slash `/egm-sync-upstream [--dry-run] [upstream-ref]`. Le workflow comprend neuf étapes : vérification d'un état de travail propre, clonage temporaire de l'upstream, analyse détaillée des changements (historique, fichiers modifiés, CHANGELOG), classification de chaque fichier (fusion, signalement, ignoré), création d'une branche `sync/upstream-<sha>`, application des fusions avec réécriture des chemins et vérification des adaptations Cursor, mise à jour du pointeur UPSTREAM_COMMIT, exécution des vérifications via `check_port.sh`, rédaction du rapport SYNC-REPORT.md, et enfin push de la branche avec ouverture d'une Pull Request via GitHub CLI. Les règles strictes interdisent tout push direct sur `main`, toute suppression de fichiers propres au port, et toute résolution automatique de conflits ou fichiers nouveaux/supprimés/renommés : chaque cas est signalé à Juan pour décision. La compétence utilise des scripts Python (`port_names.py`) pour le mapping des chemins et les fusions à trois points, garantissant que les adaptations Cursor (comme `readonly: true` dans les agents, le texte de spawn Task-tool, etc.) survivent aux fusions. En mode `--dry-run`, elle exécute les étapes 1 à 4 et affiche le plan sans rien modifier.

Compatible avec✓Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/jhincapie/egm-cursor/tree/HEAD/.cursor/skills/egm-sync-upstream

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Synchronisation amont EGM

Apporter les modifications de marcus-darden/egm dans ce port sans perdre les renommages, les adaptations Cursor ni les fichiers propres au port. Lisez d'abord le AGENTS.md à la racine du dépôt : c'est le livre de règles qu'applique cette compétence. Cette compétence se trouve dans .cursor/skills/, elle est donc locale au projet ; install.sh ne l'installe jamais.

Invoquer avec /egm-sync-upstream [--dry-run] [upstream-ref]. upstream-ref prend par défaut la branche main upstream. Avec --dry-run, effectuez les étapes 1 à 4 et imprimez le plan ; ne modifiez rien.

Règles strictes

  1. Ne jamais pousser sur main. Tout le travail se fait sur sync/upstream-<sha_court> ; Juan fusionne la PR.
  2. Ne jamais écraser un fichier propre au port (liste dans AGENTS.md). Si upstream a modifié quelque chose que ces fichiers reflètent (par exemple la section d'installation du README upstream), décrivez-le dans le rapport plutôt.
  3. Ne pas deviner. Les nouvelles compétences ou agents upstream, les fichiers upstream supprimés, les fichiers upstream renommés et les conflits de fusion sont signalés à Juan avec les chemins exacts, sans être résolus en inventant un nom ou en choisissant un camp.
  4. Conserver l'attribution. LICENSE conserve les deux lignes de copyright ; UPSTREAM_COMMIT n'est déplacé que lorsque la branche contient effectivement les modifications upstream.

Aides

<dossier-comp> est le dossier contenant ce fichier.

  • python3 <dossier-comp>/scripts/port_names.py chemin <chemin-upstream>... mappe les chemins upstream vers les chemins du port et indique quand un chemin est propre au port, non porté, ou nouveau.
  • python3 <dossier-comp>/scripts/port_names.py fusionner <clone> <ancien> <nouveau> <chemin-upstream> [--write] effectue une fusion à trois points d'une modification d'un fichier upstream dans son fichier du port (la base et la leur sont d'abord réécrites avec les noms du port, la nôtre est le fichier du port), afin que les adaptations Cursor sur les lignes non touchées survivent. Code de sortie 0 : propre, 1 : marqueurs de conflit laissés, 3 : rien à faire (propre au port, non porté, ou nouveau).
  • python3 <dossier-comp>/scripts/port_names.py reécrire <fichier> / vérifier <fichier>... réécrit les noms dans le texte, ou liste les anciens noms avec slash restants.
  • bash <dossier-comp>/scripts/check_port.sh exécute toutes les vérifications du port (étape 7).

Workflow

Progression sync EGM :
- [ ] Étape 1 : arbre de travail propre, sur une branche main à jour
- [ ] Étape 2 : upstream cloné dans un répertoire temporaire ; ancien = UPSTREAM_COMMIT, nouveau = HEAD upstream
- [ ] Étape 3 : entrées du CHANGELOG depuis l'ancien lues ; fichiers modifiés listés avec leur statut
- [ ] Étape 4 : chaque fichier modifié mappé et classifié (fusion / signalement / ignoré)
- [ ] Étape 5 : branche sync/upstream-<sha_court> créée ; fusions appliquées ; adaptations revérifiées
- [ ] Étape 6 : UPSTREAM_COMMIT mis à jour
- [ ] Étape 7 : check_port.sh réussi
- [ ] Étape 8 : SYNC-REPORT.md rédigé
- [ ] Étape 9 : branche poussée ; PR ouverte avec gh ; Juan informé

Étape 1 : Départ propre

git status --porcelain doit être vide et la branche courante main, à jour avec origin/main (git fetch origin && git status -sb). Sinon, arrêtez-vous et dites à Juan ce qui est sale. Ne stash pas son travail.

Étape 2 : Récupérer upstream

tmp="$(mktemp -d)"
git clone --quiet https://github.com/marcus-darden/egm.git "$tmp/upstream"
old="$(cat UPSTREAM_COMMIT)"; new="$(git -C "$tmp/upstream" rev-parse ${REF:-HEAD})"

Si ancien == nouveau, signalez "upstream n'a pas de nouveau commit depuis " et arrêtez-vous (pas de branche, pas de PR). Si ancien n'est pas un ancêtre de nouveau (git -C "$tmp/upstream" merge-base --is-ancestor $ancien $nouveau), upstream a réécrit l'historique : arrêtez-vous et signalez-le.

Étape 3 : Lire ce qui a changé

  • git -C "$tmp/upstream" log --oneline $ancien..$nouveau
  • git -C "$tmp/upstream" diff --name-status -M $ancien $nouveau
  • Les nouvelles entrées du CHANGELOG.md (tags après celui contenant ancien). Le CHANGELOG explique pourquoi ; citez les lignes pertinentes dans le rapport.

Étape 4 : Mapper et classifier chaque fichier

Exécutez port_names.py chemin sur chaque chemin upstream modifié, puis placez chacun dans un seau :

Statut upstream et mappingSeau
M, mappe vers un fichier de port existantfusion
A, mappe dans un dossier de compétence connu (par exemple une nouvelle ressource dans skills/goldfish/)fusion (crée le fichier)
A, nouvelle compétence, agent ou walkthrough (note "NOUVEAU")signaler : Juan choisit le nom egm- et s'il faut le porter
D (supprimé upstream)signaler : ne pas supprimer le fichier du port
R (renommé upstream)signaler : montrer les ancien et nouveau chemins ainsi que le chemin du port
note propre au port ou non portéignorer (décrire la modification si elle importe, p. ex. texte d'installation du README)
LICENSEfusion, puis confirmer que les deux lignes de copyright restent

Avec --dry-run, imprimez ce tableau et la liste des commits, puis arrêtez-vous.

Étape 5 : Appliquer sur une branche

git switch -c "sync/upstream-${new:0:7}"
python3 <dossier-comp>/scripts/port_names.py fusionner "$tmp/upstream" $old $new <chemin-upstream> --write

Exécutez la fusion une fois par fichier fusion. En cas de code de sortie 1, laissez les marqueurs de conflit hors du commit : restaurez le fichier (git checkout -- <chemin-port>), et enregistrez le bloc de conflit dans le rapport pour Juan. Après la fusion, relisez chaque fichier touché pour les adaptations Cursor listées dans AGENTS.md (texte de spawn Task-tool, readonly: true dans les agents, AGENTS.md à côté de CLAUDE.md, les reviewers ignorant AGENTS.md et .cursor/rules/, /review pas /code-review, la ligne Cursor dans runtimes.md). Si upstream a ajouté un nouvel endroit qui en nécessite une (par exemple une nouvelle recherche CLAUDE.md, une nouvelle ligne tools: dans un agent, une nouvelle instruction de spawn propre à Claude), appliquez la même adaptation et listez-la sous "adapté". Commitez par groupes logiques avec des messages qui citent les commits upstream.

Étape 6 : Déplacer le pointeur

Écrivez nouveau dans UPSTREAM_COMMIT uniquement si chaque fichier fusion a été fusionné proprement ou si son conflit est enregistré. Commitez-le en dernier.

Étape 7 : Vérifier

bash <dossier-comp>/scripts/check_port.sh. Il vérifie le nom égal au dossier, évalue le JSON, check_gate.py (BLOQUÉ puis OK), les anciens noms avec slash restants, et une installation test dans un répertoire temporaire (qui ne doit pas contenir cette compétence). Corrigez les échecs causés par la fusion ; tout le reste va dans le rapport.

Étape 8 : SYNC-REPORT.md

Écrivez SYNC-REPORT.md à la racine du dépôt sur la branche, et utilisez le même texte que le corps de la PR :

# Synchronisation upstream : <ancien7>..<nouveau7>

Commits upstream : <liste>
CHANGELOG : <lignes citées>

## Appliqué
- <chemin-port> <- <chemin-upstream> : <une ligne>
## Adapté pour Cursor
- <chemin-port> : <quelle adaptation et pourquoi>
## Ignoré
- <chemin-upstream> : <propre au port | non porté>, <ce qui a changé, si cela importe>
## Signalé pour Juan
- <nouvelle compétence/agent, suppression, renommage, conflit> : <chemins, le bloc, la question>
## Vérifications
<résumé de check_port.sh>
## Questions ouvertes
- <...>

Étape 9 : Pousser et ouvrir la PR

git push -u origin "sync/upstream-${new:0:7}"
gh pr create --base main --head "sync/upstream-${new:0:7}" --title "Sync upstream marcus-darden/egm ${old:0:7}..${new:0:7}" --body-file SYNC-REPORT.md

Dites à Juan l'URL de la PR, les comptes (appliqué, adapté, ignoré, signalé) et les éléments signalés. Ne fusionnez pas la PR. Supprimez le clone temporaire.

Individual skills in this repo

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

jhincapie/egm-cursor

Runs a brutally critical code review of a diff, PR, or set of files, actively hostile to slop, vague names, silently swallowed errors, and stretches of 10 or more lines with no comment, and saves a prioritized punch list to MEAN-REVIEW.md so the next pass can check what was fixed. Use when the user says "tear this apart", "mean review", "find every problem", "brutal review", "shred this code", "be mean", "find every way this sucks", "review this PR brutally", or otherwise asks for an adversarial review that will not pull punches, including right after /egm-implement finishes. Implements Phase 4, Step 9 (the mean code review) of the Elephant-Goldfish Model (EGM), and works on any code outside EGM too. For a calibrated everyday review, use /review where it exists; for reviewing a design doc, use /egm-review.

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.

Skills associés