Sincronización upstream de EGM
Traer cambios de marcus-darden/egm a este port sin perder los renombres, adaptaciones de Cursor ni archivos exclusivos del port. Lea primero el AGENTS.md raíz del repositorio: es el libro de reglas que aplica esta habilidad. Esta habilidad reside en .cursor/skills/, por lo que es local al proyecto; install.sh nunca la instala.
Invocar como /egm-sync-upstream [--dry-run] [upstream-ref]. upstream-ref por defecto es upstream main. Con --dry-run, haga los Pasos 1 al 4 e imprima el plan; no cambie nada.
Reglas estrictas
- Nunca hacer push a
main. Todo el trabajo se realiza ensync/upstream-<sha_corto>; Juan fusiona el PR. - Nunca sobrescribir un archivo exclusivo del port (listado en
AGENTS.md). Si upstream ha cambiado algo que esos archivos reflejan (por ejemplo, la sección de instalación del README upstream), descríbalo en el informe en su lugar. - No adivinar. Nuevas habilidades o agentes upstream, archivos eliminados upstream, archivos renombrados upstream y conflictos de fusión se señalan a Juan con las rutas exactas, no se resuelven inventando un nombre o eligiendo un bando.
- Mantener la atribución.
LICENSEmantiene ambas líneas de copyright;UPSTREAM_COMMITse mueve solo cuando la rama realmente contiene los cambios upstream.
Ayudantes
<dir-habilidad> es la carpeta que contiene este archivo.
python3 <dir-habilidad>/scripts/port_names.py path <ruta-upstream>...mapea rutas upstream a rutas del port e indica cuándo una ruta es exclusiva del port, no está portada o es nueva.python3 <dir-habilidad>/scripts/port_names.py merge <clon> <antiguo> <nuevo> <ruta-upstream> [--write]fusiona a tres bandas un cambio de archivo upstream en su archivo del port (la base y el suyo se reescriben primero con nombres del port, el nuestro es el archivo del port), de modo que las adaptaciones de Cursor en líneas no tocadas sobrevivan. Salida 0 limpio, 1 quedan marcadores de conflicto, 3 nada que hacer (exclusivo del port, no portado o nuevo).python3 <dir-habilidad>/scripts/port_names.py rewrite <archivo>/check <archivo>...reescribe nombres en texto o lista nombres antiguos con barra restantes.bash <dir-habilidad>/scripts/check_port.shejecuta todas las comprobaciones del port (Paso 7).
Flujo de trabajo
Progreso de sincronización EGM:
- [ ] Paso 1: árbol de trabajo limpio, en un main actualizado
- [ ] Paso 2: upstream clonado en un directorio temporal; antiguo = UPSTREAM_COMMIT, nuevo = HEAD upstream
- [ ] Paso 3: entradas del CHANGELOG desde antiguo leídas; archivos cambiados listados con estado
- [ ] Paso 4: cada archivo cambiado mapeado y clasificado (fusionar / señalar / saltar)
- [ ] Paso 5: rama sync/upstream-<sha_corto> creada; fusiones aplicadas; adaptaciones re-verificadas
- [ ] Paso 6: UPSTREAM_COMMIT actualizado
- [ ] Paso 7: check_port.sh pasa
- [ ] Paso 8: SYNC-REPORT.md escrito
- [ ] Paso 9: rama subida; PR abierto con gh; Juan informado
Paso 1: Inicio limpio
git status --porcelain debe estar vacío y la rama actual debe ser main, actualizada con origin/main (git fetch origin && git status -sb). Si no es así, deténgase e indique a Juan qué está sucio. No guarde su trabajo en stash.
Paso 2: Obtener upstream
tmp="$(mktemp -d)"
git clone --quiet https://github.com/marcus-darden/egm.git "$tmp/upstream"
antiguo="$(cat UPSTREAM_COMMIT)"; nuevo="$(git -C "$tmp/upstream" rev-parse ${REF:-HEAD})"
Si antiguo == nuevo, informe "upstream no tiene nuevos commits desde " y deténgase (sin rama, sin PR). Si antiguo no es ancestro de nuevo (git -C "$tmp/upstream" merge-base --is-ancestor $antiguo $nuevo), upstream reescribió el historial: deténgase y señalícelo.
Paso 3: Leer qué cambió
git -C "$tmp/upstream" log --oneline $antiguo..$nuevogit -C "$tmp/upstream" diff --name-status -M $antiguo $nuevo- Las nuevas entradas de
CHANGELOG.md(etiquetas posteriores a la que contieneantiguo). El CHANGELOG explica por qué; cite las filas relevantes en el informe.
Paso 4: Mapear y clasificar cada archivo
Ejecute port_names.py path en cada ruta cambiada upstream, luego coloque cada una en un grupo:
| Estado upstream y mapeo | Grupo |
|---|---|
| M, mapea a un archivo existente del port | fusionar |
A, mapea a una carpeta de habilidad conocida (por ejemplo, un nuevo asset en skills/goldfish/) | fusionar (crea el archivo) |
| A, nueva habilidad, agente o tutorial (nota "NUEVO") | señalar: Juan elige el nombre egm- y si portarlo |
| D (eliminado upstream) | señalar: no eliminar el archivo del port |
| R (renombrado upstream) | señalar: mostrar rutas antigua y nueva y la ruta del port |
| nota exclusivo del port o no portado | saltar (describir el cambio si importa, como texto de instalación del README) |
LICENSE | fusionar, luego confirmar que ambas líneas de copyright permanecen |
Con --dry-run, imprima esta tabla y la lista de commits, luego deténgase.
Paso 5: Aplicar en una rama
git switch -c "sync/upstream-${nuevo:0:7}"
python3 <dir-habilidad>/scripts/port_names.py merge "$tmp/upstream" $antiguo $nuevo <ruta-upstream> --write
Ejecute la fusión una vez por archivo fusionar. En caso de salida 1, deje los marcadores de conflicto fuera del commit: restaure el archivo (git checkout -- <ruta-port>), y registre el fragmento de conflicto en el informe para Juan. Después de fusionar, vuelva a leer cada archivo tocado para las adaptaciones de Cursor listadas en AGENTS.md (texto de spawn de Task-tool, readonly: true en agentes, AGENTS.md junto a CLAUDE.md, revisores ignorando AGENTS.md y .cursor/rules/, /review no /code-review, la fila de Cursor en runtimes.md). Si upstream agregó un nuevo lugar que requiera una (por ejemplo, una nueva búsqueda de CLAUDE.md, una nueva línea tools: en un agente, una nueva instrucción de spawn solo de Claude), aplique la misma adaptación y enumérela bajo "adaptado". Haga commit en grupos lógicos con mensajes que citen los commits upstream.
Paso 6: Mover el puntero
Escriba nuevo en UPSTREAM_COMMIT solo si cada archivo fusionar se fusionó limpiamente o su conflicto está registrado. Haga commit de esto al final.
Paso 7: Verificar
bash <dir-habilidad>/scripts/check_port.sh. Verifica que nombre sea igual a carpeta, evalúa JSON, check_gate.py (BLOQUEADO luego ADELANTE), nombres antiguos con barra restantes y una instalación de prueba en un directorio temporal (que no debe contener esta habilidad). Corrija fallos causados por la fusión; cualquier otra cosa va en el informe.
Paso 8: SYNC-REPORT.md
Escriba SYNC-REPORT.md en la raíz del repositorio en la rama, y use el mismo texto que el cuerpo del PR:
# Sincronización upstream: <antiguo7>..<nuevo7>
Commits upstream: <lista>
CHANGELOG: <filas citadas>
## Aplicado
- <ruta-port> <- <ruta-upstream>: <una línea>
## Adaptado para Cursor
- <ruta-port>: <qué adaptación y por qué>
## Omitido
- <ruta-upstream>: <exclusivo del port | no portado>, <qué cambió, si importa>
## Señalado para Juan
- <nueva habilidad/agente, eliminación, renombre, conflicto>: <rutas, el fragmento, la pregunta>
## Verificaciones
<resumen de check_port.sh>
## Preguntas abiertas
- <...>
Paso 9: Subir y abrir el PR
git push -u origin "sync/upstream-${nuevo:0:7}"
gh pr create --base main --head "sync/upstream-${nuevo:0:7}" --title "Sincronizar upstream marcus-darden/egm ${antiguo:0:7}..${nuevo:0:7}" --body-file SYNC-REPORT.md
Indique a Juan la URL del PR, los recuentos (aplicados, adaptados, omitidos, señalados) y los elementos señalados. No fusione el PR. Elimine el clon temporal.