🌱 Empieza aquí · Sincroniza tu configuración entre máquinas
Abre esta carpeta con Claude Code o Cowork y dile a tu asistente:
"Siembra esta semilla 🌱"
Eso es todo de tu parte. Tu asistente hace lo técnico; tú solo conversas y, al final, le das dos datos: qué carpeta quieres sincronizar y cómo se llama tu repo en la nube.
¿Otras formas de decírselo? "instala esto", "pon a funcionar el auto-sync de mi config", "activa el respaldo automático de mi configuración". Te entiende igual.
Cuando termine, salta a la sección "¿Cómo sé que funcionó?" al final.
Qué resuelve (por qué → qué → cómo)
Por qué. Trabajas con tu asistente en dos o tres máquinas (tu laptop, tu compu de escritorio, quizá un servidor). Tu configuración —tus reglas, tus notas, tus ajustes— vive en una carpeta que llevas en git. El problema: se te olvida subirla. Llegas a la otra máquina y tu asistente está "desactualizado" porque los últimos cambios se quedaron en la otra compu. O peor: subes algo sin darte cuenta de que traía una contraseña adentro.
Qué. Esta semilla instala un pequeño ayudante que hace tres cosas por ti, en el orden correcto: (1) revisa que no estés a punto de subir un secreto, (2) confirma tus cambios con una etiqueta de qué máquina los hizo, y (3) los sube a la nube — y si el remoto avanzó mientras trabajabas, se reacomoda solo y reintenta.
Cómo. Es un script (auto-sync-config.sh). Lo puedes usar de dos maneras, y tú
eliges: bajo demanda (tu asistente lo corre cuando se lo pides o cuando termina de
tocar tu config) o automático (se dispara solo al terminar cada sesión de trabajo).
Para el asistente que siembra 🤖
Estás instalando un script de sincronización de git con guardas de seguridad. La
pieza vive en kernel/auto-sync-config.sh y no depende de nada externo (trae su
propio escáner de secretos básico). Sigue estos pasos con precisión.
Paso 1 · Colocar el archivo del kernel
Copia kernel/auto-sync-config.sh a la carpeta de scripts/hooks de la persona. Elige
una ubicación:
- Global (recomendado para sincronizar la carpeta de configuración del asistente):
cópialo a
<TU-CARPETA-DE-CLAUDE>/hooks/auto-sync-config.sh, donde<TU-CARPETA-DE-CLAUDE>es la carpeta de configuración (en Claude Code y Cowork suele ser~/.claude). Creahooks/si no existe. - Por proyecto (si quieres sincronizar un repo específico): cópialo a
<TU-PROYECTO>/.claude/hooks/auto-sync-config.sh.
Paso 2 · Dar permiso de ejecución
chmod +x "<RUTA-DONDE-LO-COPIASTE>/auto-sync-config.sh"
Paso 3 · Configurar los dos datos que importan
El script se controla con variables de entorno (no hay que editar el código). Los dos que de verdad importan:
| Variable | Qué es | Ejemplo |
|---|---|---|
| SYNC_REPO | Ruta del repo a sincronizar. Si la dejas vacía, usa el repo git de la carpeta actual. | $HOME/.claude o <TU-PROYECTO> |
| SYNC_EXPECTED_REMOTE | El candado de seguridad. Un pedacito del nombre de tu repo en la nube que la URL del remoto DEBE contener. Si no coincide, el script se niega a subir (evita empujar al repo equivocado). | mi-config (si tu repo se llama usuario/mi-config) |
Opcionales (deja los defaults salvo que la persona los pida): SYNC_BRANCH (rama;
vacío = rama actual), SYNC_LOG_DIR (carpeta del log; default = carpeta temporal del
sistema), SYNC_SECRET_SCAN (ruta al escáner de secretos propio de la persona, si tiene
uno; si no, se usa el integrado).
Pregúntale a la persona cómo se llama su repo de configuración en la nube y usa un fragmento único de ese nombre como
SYNC_EXPECTED_REMOTE. Ese candado es lo que hace segura la herramienta: sin él, no la actives de forma automática.
Paso 4 · Elegir modo de uso
Modo A · Bajo demanda (el más simple, funciona en Claude Code, Cowork y Codex). No hay que registrar nada. Cuando la persona diga "sincroniza mi config" (o cuando tú termines de editar sus ajustes), córrelo así, con sus dos datos:
SYNC_REPO="<RUTA-DEL-REPO>" SYNC_EXPECTED_REMOTE="<FRAGMENTO-DEL-NOMBRE>" \
bash "<RUTA-DONDE-LO-COPIASTE>/auto-sync-config.sh"
Modo B · Automático al cerrar sesión (Claude Code y Cowork).
Regístralo como hook del evento de fin de sesión en el settings.json correspondiente
a la ubicación del Paso 1 (global → <TU-CARPETA-DE-CLAUDE>/settings.json; por proyecto
→ <TU-PROYECTO>/.claude/settings.json). Si ya existe un bloque hooks, fusiona: no
lo sobrescribas. Usa SessionEnd (y/o Stop si prefieres que corra al terminar cada
respuesta):
{
"hooks": {
"SessionEnd": [
{
"hooks": [
{
"type": "command",
"command": "SYNC_REPO=\"<RUTA-DEL-REPO>\" SYNC_EXPECTED_REMOTE=\"<FRAGMENTO-DEL-NOMBRE>\" bash \"<RUTA-ABSOLUTA>/auto-sync-config.sh\""
}
]
}
]
}
}
settings.jsonno expande~: usa la ruta absoluta real del script encommand. Codex no tiene este sistema de eventos; en Codex, usa el Modo A (bajo demanda).
Paso 5 · Verificación post-siembra (obligatoria)
a) El archivo quedó colocado y es ejecutable:
ls -l "<RUTA-DONDE-LO-COPIASTE>/auto-sync-config.sh"
# Esperado: los permisos empiezan con -rwx (la 'x' confirma que es ejecutable)
b) Prueba de comportamiento real (segura, en un repo de juguete). Esto NO toca el repo real de la persona: crea uno desechable con un "remoto" local y comprueba las tres guardas.
TMP="$(mktemp -d)"
git init --bare -q -b main "$TMP/remote.git"
git init -q -b main "$TMP/work"
( cd "$TMP/work" && git config user.email t@t.t && git config user.name t \
&& git remote add origin "$TMP/remote.git" && echo hola > a.txt )
S="<RUTA-DONDE-LO-COPIASTE>/auto-sync-config.sh"
# 1) Candado de remoto: con un nombre que NO coincide, debe negarse.
SYNC_REPO="$TMP/work" SYNC_EXPECTED_REMOTE="NO-COINCIDE" bash "$S"; echo "salida: $?"
# Esperado: imprime WRONG_REMOTE y salida: 1
# 2) Con el nombre correcto, hace el primer commit y push.
SYNC_REPO="$TMP/work" SYNC_EXPECTED_REMOTE="remote.git" bash "$S"; echo "salida: $?"
# Esperado: imprime PUSHED_new y salida: 0
# 3) Sin cambios nuevos, no hace nada.
SYNC_REPO="$TMP/work" SYNC_EXPECTED_REMOTE="remote.git" bash "$S"; echo "salida: $?"
# Esperado: imprime UP_TO_DATE y salida: 0
# 4) Escáner de secretos: si aparece algo que huele a credencial, aborta.
# Lo metemos en una carpeta NUEVA a propósito (el caso más traicionero:
# un secreto en una carpeta recién creada). Debe atraparlo igual.
mkdir -p "$TMP/work/nueva-carpeta"
printf 'api_key = "AKIA1234567890ABCDEF"\n' > "$TMP/work/nueva-carpeta/secreto.txt"
SYNC_REPO="$TMP/work" SYNC_EXPECTED_REMOTE="remote.git" bash "$S"; echo "salida: $?"
# Esperado: imprime SECRET_DETECTED y salida: 1
Si las cuatro pruebas dan lo esperado, la semilla quedó viva. Puedes borrar la carpeta
$TMP al terminar. Ya con eso, configura el repo REAL de la persona (Paso 3) y avísale
en una línea qué gana.
Placeholders que debes reemplazar por valores reales:
| Placeholder | Qué es |
|---|---|
| <TU-CARPETA-DE-CLAUDE> | La carpeta de configuración del asistente (normalmente ~/.claude). |
| <TU-PROYECTO> | La carpeta raíz del proyecto/repo del usuario. |
| <RUTA-DONDE-LO-COPIASTE> | La ubicación final del script tras el Paso 1. |
| <RUTA-ABSOLUTA> | La ruta absoluta completa a ese mismo script (para settings.json). |
| <RUTA-DEL-REPO> | La ruta del repo que la persona quiere sincronizar. |
| <FRAGMENTO-DEL-NOMBRE> | Un pedazo único del nombre de su repo en la nube (el candado). |
✅ ¿Cómo sé que funcionó?
De ahora en adelante, tu configuración deja de quedarse "atrás" en una de tus máquinas. Cuando cambies algo, tu asistente lo sube a la nube por ti —con la etiqueta de en qué compu lo hiciste—, y cuando abras la otra máquina ya vas a tener lo último.
Y traes tres cinturones de seguridad puestos sin hacer nada:
- No sube al repo equivocado. Si por accidente apunta a otro lado, se niega.
- No sube secretos. Si detecta algo que huele a contraseña o llave, frena y avisa.
- No se atora si el remoto avanzó. Se reacomoda solo (rebase) y reintenta; solo te molesta si de verdad hay un choque que necesita tu ojo.
Si un día no ves ningún movimiento, es buena señal: todo ya estaba sincronizado. 🫡
