Sincronização Upstream EGM
Traga alterações de marcus-darden/egm para este port sem perder as renomeações, adaptações Cursor ou arquivos exclusivos do port. Leia primeiro o AGENTS.md na raiz do repositório: ele é o livro de regras que esta skill aplica. Esta skill reside em .cursor/skills/, portanto é local ao projeto; o install.sh nunca a instala.
Invoque como /egm-sync-upstream [--dry-run] [upstream-ref]. upstream-ref padrão é upstream main. Com --dry-run, execute as Etapas 1 a 4 e imprima o plano; não altere nada.
Regras rígidas
- Nunca faça push para
main. Todo o trabalho acontece emsync/upstream-<shortsha>; Juan mescla o PR. - Nunca sobrescreva um arquivo exclusivo do port (lista em
AGENTS.md). Se o upstream alterou algo que esses arquivos espelham (por exemplo, a seção de instalação do README upstream), descreva no relatório em vez disso. - Não adivinhe. Novas skills ou agentes upstream, arquivos upstream deletados, arquivos upstream renomeados e conflitos de merge são sinalizados para Juan com os caminhos exatos, sem resolver inventando um nome ou escolhendo um lado.
- Mantenha a atribuição.
LICENSEmantém ambas as linhas de copyright;UPSTREAM_COMMITsó é movido quando o branch realmente contém as alterações upstream.
Auxiliares
<skill-dir> é a pasta que contém este arquivo.
python3 <skill-dir>/scripts/port_names.py path <upstream-path>...mapeia caminhos upstream para caminhos do port e informa quando um caminho é exclusivo do port, não portado ou novo.python3 <skill-dir>/scripts/port_names.py merge <clone> <old> <new> <upstream-path> [--write]faz merge com três vias de uma alteração de arquivo upstream em seu arquivo do port (base e theirs são reescritos em nomes do port primeiro, ours é o arquivo do port), permitindo que adaptações Cursor em linhas não tocadas sobrevivam. Saída 0 limpa, 1 marcadores de conflito deixados, 3 nada a fazer (exclusivo do port, não portado ou novo).python3 <skill-dir>/scripts/port_names.py rewrite <file>/check <file>...reescreve nomes em texto ou lista nomes de barra antigos remanescentes.bash <skill-dir>/scripts/check_port.shexecuta todas as verificações do port (Etapa 7).
Fluxo de trabalho
Progresso da sincronização EGM:
- [ ] Etapa 1: working tree limpo, em um main atualizado
- [ ] Etapa 2: upstream clonado em um diretório temporário; old = UPSTREAM_COMMIT, new = HEAD upstream
- [ ] Etapa 3: entradas do CHANGELOG desde old lidas; arquivos alterados listados com status
- [ ] Etapa 4: cada arquivo alterado mapeado e classificado (merge / sinalizar / pular)
- [ ] Etapa 5: branch sync/upstream-<shortsha> criado; merges aplicados; adaptações re-verificadas
- [ ] Etapa 6: UPSTREAM_COMMIT atualizado
- [ ] Etapa 7: check_port.sh passa
- [ ] Etapa 8: SYNC-REPORT.md escrito
- [ ] Etapa 9: branch enviado; PR aberto com gh; Juan notificado
Etapa 1: Início limpo
git status --porcelain deve estar vazio e o branch atual main, atualizado com origin/main (git fetch origin && git status -sb). Caso contrário, pare e informe a Juan o que está sujo. Não faça stash do trabalho dele.
Etapa 2: Buscar 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})"
Se old == new, reporte "upstream não tem novos commits desde " e pare (sem branch, sem PR). Se old não é ancestral de new (git -C "$tmp/upstream" merge-base --is-ancestor $old $new), upstream reescreveu o histórico: pare e sinalize.
Etapa 3: Ler o que mudou
git -C "$tmp/upstream" log --oneline $old..$newgit -C "$tmp/upstream" diff --name-status -M $old $new- As novas entradas do
CHANGELOG.md(tags após a que contémold). O CHANGELOG explica por que; cite as linhas relevantes no relatório.
Etapa 4: Mapear e classificar cada arquivo
Execute port_names.py path em cada caminho upstream alterado, em seguida coloque cada um em um balde:
| Status upstream e mapeamento | Balde |
|---|---|
| M, mapeia para um arquivo existente do port | merge |
A, mapeia para uma pasta de skill conhecida (por exemplo, um novo asset em skills/goldfish/) | merge (cria o arquivo) |
| A, nova skill, agente ou walkthrough (nota "NEW") | sinalizar: Juan escolhe o nome egm- e se deve portar |
| D (deletado upstream) | sinalizar: não deletar o arquivo do port |
| R (renomeado upstream) | sinalizar: mostrar caminhos antigo e novo e o caminho do port |
| nota de exclusivo do port ou não portado | pular (descreva a alteração se for relevante, como texto de instalação do README) |
LICENSE | merge, então confirme que ambas as linhas de copyright permanecem |
Com --dry-run, imprima esta tabela e a lista de commits, então pare.
Etapa 5: Aplicar em um branch
git switch -c "sync/upstream-${new:0:7}"
python3 <skill-dir>/scripts/port_names.py merge "$tmp/upstream" $old $new <upstream-path> --write
Execute o merge uma vez por arquivo merge. Na saída 1, deixe os marcadores de conflito fora do commit: restaure o arquivo (git checkout -- <port-path>), e registre o hunk de conflito no relatório para Juan. Após mesclar, releia cada arquivo tocado para as adaptações Cursor listadas em AGENTS.md (texto de spawn da Task-tool, readonly: true em agentes, AGENTS.md junto a CLAUDE.md, revisores ignorando AGENTS.md e .cursor/rules/, /review não /code-review, a linha Cursor em runtimes.md). Se o upstream adicionou um novo local que precisa de uma (por exemplo, uma nova consulta a CLAUDE.md, uma nova linha tools: em um agente, uma nova instrução de spawn exclusiva do Claude), aplique a mesma adaptação e liste-a em "adaptado". Faça commit em grupos lógicos com mensagens que citem commits upstream.
Etapa 6: Mover o ponteiro
Escreva new em UPSTREAM_COMMIT apenas se todos os arquivos merge foram mesclados limpos ou seu conflito foi registrado. Faça commit disso por último.
Etapa 7: Verificar
bash <skill-dir>/scripts/check_port.sh. Ele verifica nome igual à pasta, avalia JSON, check_gate.py (BLOCKED então GO), nomes de barra antigos remanescentes, e uma instalação de teste em um diretório temporário (que não deve conter esta skill). Corrija falhas causadas pelo merge; qualquer outra coisa vai no relatório.
Etapa 8: SYNC-REPORT.md
Escreva SYNC-REPORT.md na raiz do repositório no branch, e use o mesmo texto que o corpo do PR:
# Sincronização upstream: <old7>..<new7>
Commits upstream: <lista>
CHANGELOG: <linhas citadas>
## Aplicados
- <caminho do port> <- <caminho upstream>: <uma linha>
## Adaptados para Cursor
- <caminho do port>: <qual adaptação e por que>
## Pulados
- <caminho upstream>: <exclusivo do port | não portado>, <o que mudou, se for relevante>
## Sinalizados para Juan
- <nova skill/agente, deleção, renomeação, conflito>: <caminhos, o hunk, a pergunta>
## Verificações
<resumo do check_port.sh>
## Perguntas em aberto
- <...>
Etapa 9: Enviar e abrir o PR
git push -u origin "sync/upstream-${new:0:7}"
gh pr create --base main --head "sync/upstream-${new:0:7}" --title "Sincronizar upstream marcus-darden/egm ${old:0:7}..${new:0:7}" --body-file SYNC-REPORT.md
Informe a Juan a URL do PR, as contagens (aplicados, adaptados, pulados, sinalizados) e os itens sinalizados. Não mescle o PR. Remova o clone temporário.