Files
fn_registry/.claude/commands/full-git-pull.md
T
egutierrez c0e0ceadd8 chore: auto-commit (4 archivos modificados)
- .claude/commands/full-git-pull.md
- .claude/commands/full-git-push.md
- .claude/rules/frontend_theming.md
- go.sum

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 19:05:24 +02:00

4.4 KiB

/full-git-pull — Pull automático de fn_registry + sub-repos + submodules + fn sync

Trae los últimos cambios del remote para el repo principal fn_registry, todos los sub-repos git anidados que ya existan localmente, y los submodules de cpp/vendor/. Después regenera registry.db y corre fn sync para tirar de la metadata del registry_api.

Modo automático (preferencia del usuario): este comando NO pregunta. Auto-stashea dirty trees antes de pullear y hace pop después. Sigue con el resto de repos aunque uno falle. Solo se detiene si detecta riesgo serio (conflicto en stash pop que requiere intervención humana).

No clona repos que falten. Cada PC tiene solo el subset de apps/analyses que le interesa. Si en este PC necesitas un sub-repo que aún no tienes, clónalo a mano:

git clone https://<user>:<token>@<gitea-host>/dataforge/<name>.git <path>

Consulta pc_locations para ver dónde lo tiene otro PC y reproduce el path.

Argumento

$ARGUMENTS — sin uso, ignorar.

Pasos

1. Descubrir repos locales

cd /home/lucas/fn_registry

REPOS=$(find . -name ".git" -type d \
  -not -path "./.git" -not -path "./.git/*" \
  -not -path "*/node_modules/*" -not -path "*/.venv/*" \
  -not -path "*/cpp/vendor/*" -not -path "*/cpp/build/*" \
  -not -path "*/sources/*" -not -path "*/temp/*" -not -path "*/subrepos/*" 2>/dev/null \
  | sed 's|/.git$||')
REPOS=". $REPOS"

Solo se actualizan los sub-repos que ya tengan .git/ localmente.

2. Para cada repo: stash si dirty, pull --ff-only, pop

for r in $REPOS; do
  ( cd "$r" \
    && DIRTY=$(git status --porcelain | wc -l) \
    && if [ "$DIRTY" -gt 0 ]; then
         git stash push -m "auto-stash before /full-git-pull" --include-untracked >/dev/null
         STASHED=1
       else
         STASHED=0
       fi \
    && git fetch origin 2>&1 | tail -1 \
    && git pull --ff-only 2>&1 | tail -3 \
    && if [ "$STASHED" = "1" ]; then
         git stash pop 2>&1 | tail -3
       fi
  )
done
  • Si --ff-only falla por divergencia → reportar ese repo, seguir con el resto. No rebasear ni mergear.
  • Si stash pop produce conflictos → avisar al usuario al final y dejar el conflicto sin tocar; seguir con los demás repos.

3. Submodules del repo principal

git submodule update --init --recursive 2>&1 | tail -10

4. Regenerar registry.db local

CGO_ENABLED=1 ./fn index 2>&1 | tail -3

5. Pull del repo de pass (~/.password-store)

El password store es su propio repo Git en Gitea (dataforge/pass-secrets). pass insert/edit/rm commitea automaticamente, asi que aqui SOLO hay que pullear los commits remotos.

PASS_DIR="$HOME/.password-store"
if [ -d "$PASS_DIR/.git" ]; then
  ( cd "$PASS_DIR" \
    && DIRTY=$(git status --porcelain | wc -l) \
    && if [ "$DIRTY" -gt 0 ]; then
         git stash push -m "auto-stash before /full-git-pull" --include-untracked >/dev/null
         STASHED=1
       else
         STASHED=0
       fi \
    && git fetch origin 2>&1 | tail -1 \
    && git pull --ff-only 2>&1 | tail -3 \
    && if [ "$STASHED" = "1" ]; then
         git stash pop 2>&1 | tail -3
       fi
  )
fi

Reglas:

  • Mismo patron que el resto de repos: stash → fetch → pull --ff-only → pop.
  • Si --ff-only falla por divergencia, reportar y seguir; no resolver a mano.
  • Si stash pop da conflicto, avisar al final.

6. fn sync

USER=$(pass registry/basicauth-user | head -1)
PASSWD=$(pass registry/basicauth-pass | head -1)
TOKEN=$(pass registry/api-token | head -1)
export FN_REGISTRY_API="https://${USER}:${PASSWD}@registry.organic-machine.com"
export REGISTRY_API_TOKEN="$TOKEN"
./fn sync

Si pass falla → gpg-agent bloqueado, pedir al usuario pass show unlock en su terminal real (entrada dummy que devuelve "Desbloqueada!" sin exponer API keys).

7. Resumen

Tabla concisa: por repo, commits pulleados o "ya estaba al día"; estado de pass-secrets; submodules actualizados; resultado de fn index; resultado de fn sync. Si algún repo quedó con conflicto de stash o divergencia, listarlos al final con la acción sugerida.

Notas

  • Modo no-interactivo por diseño. El usuario prefiere flujos rápidos sin confirmaciones.
  • Pull solo es fast-forward — nunca rebase ni merge automático.
  • Auto-stash incluye untracked (--include-untracked) para no perder archivos nuevos.
  • fn index se corre antes de fn sync para que las locations locales reflejen el estado actual.