# 47 skills y 8 agentes de IA sincronizados desde un solo repo: así lo monté

> Construí un ecosistema de agentes IA con 47 skills sincronizadas entre 8 CLIs y un VPS. Te cuento la arquitectura, el script de sync y por qué funciona.

**Autor:** Pedro Luis Cuevas Villarrubia | **Fecha:** 2026-05-17 | **Tags:** IA, herramientas, productividad
**URL:** https://asturwebs.es/blog/ecosistema-agentes-ia-skills-sincronizacion-2026/

---
Esta mañana abrí la terminal con 18 skills y un script que copiaba archivos. La cerré con 47 skills, 8 agentes sincronizados, un repo privado en GitHub como fuente de verdad y un sistema de importación inversa que rescata skills creadas por cualquier agente automáticamente.

No es un chatbot con plugins. Es un **sistema operativo para agentes de IA**.

Te cuento cómo lo monté, por qué funciona y qué aprendí en el proceso.

## El problema: 8 agentes, 8 versiones distintas de la verdad

Trabajo con varios agentes de IA a diario. Claude Code para tareas pesadas de desarrollo, OpenClaw para el VPS, Hermes para automatizaciones, Kimi para consultas rápidas, OpenCode para coding... Cada uno tiene su propio sistema de "skills" — instrucciones especializadas que les dicen cómo hacer cosas concretas como generar una imagen, analizar SEO o gestionar un repo de GitHub.

El problema era evidente: si creaba una skill en Claude, Hermes no la veía. Si OpenClaw mejoraba una en el VPS, se perdía al sincronizar. Si Kimi generaba una skill nueva, nadie más se enteraba.

Era el caos. Ocho silos de conocimiento divergiendo silenciosamente.

## La solución: fuente única + sincronización bidireccional

La arquitectura es más simple de lo que parece:

<div class="not-prose my-8 grid grid-cols-1 sm:grid-cols-2 gap-4">
  <div class="border border-blue-200 bg-blue-50 rounded-xl p-5">
    <div class="text-sm font-bold text-blue-700 mb-1">💻 Fuente local</div>
    <div class="text-xs font-mono text-blue-600 bg-blue-100 px-2 py-1 rounded mb-2">~/bytia/skills/</div>
    <div class="text-sm text-gray-700">Directorio maestro en el OMEN. Todo nace y muere aquí.</div>
  </div>
  <div class="border border-purple-200 bg-purple-50 rounded-xl p-5">
    <div class="text-sm font-bold text-purple-700 mb-1">🔒 Fuente remota</div>
    <div class="text-xs font-mono text-purple-600 bg-purple-100 px-2 py-1 rounded mb-2">github.com/asturwebs/bytia-skills</div>
    <div class="text-sm text-gray-700">Repo privado. Fuente de verdad entre máquinas.</div>
  </div>
  <div class="border border-green-200 bg-green-50 rounded-xl p-5">
    <div class="text-sm font-bold text-green-700 mb-1">⚙️ Motor de sync</div>
    <div class="text-xs font-mono text-green-600 bg-green-100 px-2 py-1 rounded mb-2">setup-all.sh</div>
    <div class="text-sm text-gray-700">Distribuye + importa. 650 líneas de bash que hacen más que cualquier herramienta enterprise.</div>
  </div>
  <div class="border border-amber-200 bg-amber-50 rounded-xl p-5">
    <div class="text-sm font-bold text-amber-700 mb-1">🤖 Consumidores</div>
    <div class="text-xs font-mono text-amber-600 bg-amber-100 px-2 py-1 rounded mb-2">8 CLIs</div>
    <div class="text-sm text-gray-700">Cada agente carga las skills bajo demanda, solo la que necesita.</div>
  </div>
</div>

El flujo es este:

1. **Crear skill en la fuente** → `setup-all.sh --all` la distribuye a todas las CLIs
2. **Agente remoto crea skill** → `setup-all.sh --all --import` la rescata y la copia a la fuente
3. **Git** → `skills-push` sube cambios, `skills-pull` los baja y distribuye
4. **Cron en el VPS** → cada 30 minutos hace `git pull` para recibir skills nuevas

La clave está en cómo se distribuye. No todos los agentes pueden usar el mismo método:

<div class="not-prose my-8 grid grid-cols-1 sm:grid-cols-3 gap-4">
  <div class="border-2 border-green-300 bg-green-50 rounded-xl p-5 relative overflow-hidden">
    <div class="absolute top-0 left-0 right-0 h-1 bg-green-500"></div>
    <div class="text-xs font-bold text-green-700 uppercase tracking-wide mb-2">Symlink · Instantáneo</div>
    <div class="text-sm text-gray-800 font-semibold mb-1">5 agentes locales</div>
    <div class="text-xs text-gray-600">Claude, Gemini, Codex, Kode, OpenCode</div>
    <div class="mt-3 text-xs text-green-700 bg-green-100 px-2 py-1 rounded inline-block font-semibold">⚡ Cambio visible al momento</div>
  </div>
  <div class="border-2 border-blue-300 bg-blue-50 rounded-xl p-5 relative overflow-hidden">
    <div class="absolute top-0 left-0 right-0 h-1 bg-blue-500"></div>
    <div class="text-xs font-bold text-blue-700 uppercase tracking-wide mb-2">rsync · Bajo demanda</div>
    <div class="text-sm text-gray-800 font-semibold mb-1">3 agentes locales</div>
    <div class="text-xs text-gray-600">Kimi, Hermes, OpenClaw (local)</div>
    <div class="mt-3 text-xs text-blue-700 bg-blue-100 px-2 py-1 rounded inline-block font-semibold">🔄 Requiere ejecutar script</div>
  </div>
  <div class="border-2 border-purple-300 bg-purple-50 rounded-xl p-5 relative overflow-hidden">
    <div class="absolute top-0 left-0 right-0 h-1 bg-purple-500"></div>
    <div class="text-xs font-bold text-purple-700 uppercase tracking-wide mb-2">git + cron · Automático</div>
    <div class="text-sm text-gray-800 font-semibold mb-1">1 agente remoto</div>
    <div class="text-xs text-gray-600">OpenClaw (VPS Hetzner)</div>
    <div class="mt-3 text-xs text-purple-700 bg-purple-100 px-2 py-1 rounded inline-block font-semibold">⏱️ Pull cada 30 min</div>
  </div>
</div>

Los que soportan symlink apuntan directamente al directorio fuente. Cualquier cambio que haga aparece al instante en los 5. Los que no, reciben una copia física vía rsync cada vez que ejecuto el script.

## El verdadero avance: importación inversa

El `--import` es lo que cierra el círculo. Sin él, si OpenClaw crea una skill en el VPS y yo ejecuto `setup-all.sh` en el OMEN, el rsync machaca lo que haya en el VPS con lo que hay en local. Adiós skill nueva.

Con `--import`, el script primero escanea los directorios de los agentes remotos, detecta skills que no existen en la fuente, y las copia de vuelta **antes** de distribuir. Así nada se pierde:

<div class="not-prose my-8 space-y-0">
  <div class="bg-gray-800 text-white rounded-t-xl px-5 py-3 text-center text-sm font-mono">
    github.com/asturwebs/bytia-skills
  </div>
  <div class="flex justify-center"><div class="w-0.5 h-5 bg-gray-400"></div></div>
  <div class="flex justify-center"><div class="text-[10px] text-gray-500 font-semibold uppercase tracking-wider">git pull / push</div></div>
  <div class="flex justify-center"><div class="w-0.5 h-5 bg-gray-400"></div></div>
  <div class="bg-indigo-100 border-2 border-indigo-300 rounded-xl px-5 py-3 text-center text-sm font-bold text-indigo-800">
    ~/bytia/skills/ — Fuente de verdad local
  </div>
  <div class="flex justify-center"><div class="w-0.5 h-5 bg-gray-400"></div></div>
  <div class="grid grid-cols-3 gap-3">
    <div class="border-2 border-green-300 bg-green-50 rounded-xl p-4 relative overflow-hidden">
      <div class="absolute top-0 left-0 right-0 h-1 bg-green-500"></div>
      <div class="text-xs font-bold text-green-700 mb-2">⚡ SYMLINK · Instantáneo</div>
      <div class="text-sm text-green-800 font-semibold">5 agentes</div>
      <div class="text-xs text-gray-600 mt-1">Claude Code · Gemini CLI</div>
      <div class="text-xs text-gray-600">Codex · KODE · OpenCode</div>
    </div>
    <div class="border-2 border-blue-300 bg-blue-50 rounded-xl p-4 relative overflow-hidden">
      <div class="absolute top-0 left-0 right-0 h-1 bg-blue-500"></div>
      <div class="text-xs font-bold text-blue-700 mb-2">🔄 RSYNC · Bajo demanda</div>
      <div class="text-sm text-blue-800 font-semibold">3 agentes</div>
      <div class="text-xs text-gray-600 mt-1">Kimi CLI</div>
      <div class="text-xs text-gray-600">Hermes · OpenClaw (local)</div>
    </div>
    <div class="border-2 border-purple-300 bg-purple-50 rounded-xl p-4 relative overflow-hidden">
      <div class="absolute top-0 left-0 right-0 h-1 bg-purple-500"></div>
      <div class="text-xs font-bold text-purple-700 mb-2">⏱️ GIT + CRON · Automático</div>
      <div class="text-sm text-purple-800 font-semibold">1 agente</div>
      <div class="text-xs text-gray-600 mt-1">OpenClaw (VPS Hetzner)</div>
      <div class="text-xs text-gray-600">Pull cada 30 min</div>
    </div>
  </div>
  <div class="flex justify-center mt-3"><div class="text-[10px] text-gray-500 font-semibold">↑ --import: Skills creadas por cualquier agente vuelven a la fuente automáticamente</div></div>
</div>

<img src="/images/2026-05-asturwebs-central-agentes-ia-sincronizacion.webp" alt="Diagrama de arquitectura del ecosistema de agentes IA mostrando la sincronización bidireccional entre fuente local, GitHub, symlinks y rsync hacia 8 CLIs" width="1280" height="768" />

## 47 skills: de qué son capaces estos agentes

El ecosistema actual cubre prácticamente todo lo que hago a diario:

<div class="not-prose my-8 grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
  <div class="border border-purple-200 bg-purple-50 rounded-xl p-4">
    <div class="text-lg mb-1">🎬</div>
    <div class="text-sm font-bold text-gray-900">Multimedia</div>
    <div class="text-xs text-purple-700 font-semibold mb-1">5 skills</div>
    <div class="text-xs text-gray-600">Wan2GP (vídeo/imagen/TTS), ComfyUI/FLUX, Fooocus</div>
  </div>
  <div class="border border-blue-200 bg-blue-50 rounded-xl p-4">
    <div class="text-lg mb-1">📊</div>
    <div class="text-sm font-bold text-gray-900">SEO y análisis</div>
    <div class="text-xs text-blue-700 font-semibold mb-1">4 skills</div>
    <div class="text-xs text-gray-600">Google Analytics, SEO técnico, X/Twitter publishing</div>
  </div>
  <div class="border border-green-200 bg-green-50 rounded-xl p-4">
    <div class="text-lg mb-1">🛠️</div>
    <div class="text-sm font-bold text-gray-900">Desarrollo</div>
    <div class="text-xs text-green-700 font-semibold mb-1">5 skills</div>
    <div class="text-xs text-gray-600">GitHub (PRs, issues, code review), TDD, debugging</div>
  </div>
  <div class="border border-amber-200 bg-amber-50 rounded-xl p-4">
    <div class="text-lg mb-1">🔬</div>
    <div class="text-sm font-bold text-gray-900">Investigación</div>
    <div class="text-xs text-amber-700 font-semibold mb-1">4 skills</div>
    <div class="text-xs text-gray-600">arXiv, DuckDuckGo search, paper writing (LaTeX)</div>
  </div>
  <div class="border border-red-200 bg-red-50 rounded-xl p-4">
    <div class="text-lg mb-1">🏗️</div>
    <div class="text-sm font-bold text-gray-900">Infraestructura</div>
    <div class="text-xs text-red-700 font-semibold mb-1">6 skills</div>
    <div class="text-xs text-gray-600">Backup inteligente, gestión GGUF, MCP servers</div>
  </div>
  <div class="border border-teal-200 bg-teal-50 rounded-xl p-4">
    <div class="text-lg mb-1">📋</div>
    <div class="text-sm font-bold text-gray-900">Productividad</div>
    <div class="text-xs text-teal-700 font-semibold mb-1">5 skills</div>
    <div class="text-xs text-gray-600">Google Workspace, OCR, Obsidian</div>
  </div>
  <div class="border border-pink-200 bg-pink-50 rounded-xl p-4">
    <div class="text-lg mb-1">🩺</div>
    <div class="text-sm font-bold text-gray-900">Específicas</div>
    <div class="text-xs text-pink-700 font-semibold mb-1">3 skills</div>
    <div class="text-xs text-gray-600">Health monitor, GPU OMEN, intercom agentes</div>
  </div>
  <div class="border border-gray-200 bg-gray-50 rounded-xl p-4">
    <div class="text-lg mb-1">🧩</div>
    <div class="text-sm font-bold text-gray-900">Otras</div>
    <div class="text-xs text-gray-700 font-semibold mb-1">15 skills</div>
    <div class="text-xs text-gray-600">Diagramas, data science, red-teaming, blog SEO…</div>
  </div>
</div>

<div class="not-prose my-8 px-5 py-4 border-l-4 border-amber-400 bg-amber-50 rounded-r-lg">
  <div class="text-sm font-bold text-amber-800 mb-1">💡 Pro-tip</div>
  <p class="text-sm text-gray-700 m-0">Las skills se cargan bajo demanda. El agente no carga las 47 en contexto — solo invoca la que necesita cuando el trigger coincide con lo que le pides. Tener 47 skills no satura el modelo, le da más herramientas.</p>
</div>

<div class="not-prose my-8 px-5 py-4 border-l-4 border-primary/30 bg-primary/5 rounded-r-lg">
<p class="text-sm text-gray-700 m-0">Si tienes un negocio y quieres automatizar procesos con agentes de IA que trabajen para ti 24/7, <a href="/servicios/ia/" class="text-primary font-semibold hover:underline">mira cómo puedo ayudarte con IA aplicada a negocio real</a>.</p>
</div>

## Anatomía de una skill

¿Qué hay dentro de cada una de esas 47 skills? No es magia, es un estándar abierto llamado **Agent Skills** (agentskills.io). Cada skill es un directorio con un archivo `SKILL.md` que contiene:

- **Frontmatter YAML** con nombre, descripción y triggers (en qué momento el agente debe cargarla)
- **Instrucciones** paso a paso que el agente sigue cuando la invoca
- **Ejemplos** de uso y casos edge

Cuando le pido a Claude "audita el SEO de esta web", el agente detecta el patrón, busca entre sus 47 skills, encuentra la skill `seo-audit`, la carga y ejecuta sus instrucciones. Sin intervención humana, sin copiar y pegar prompts.

Lo potente es que **cualquier agente puede crear una skill nueva**. Si durante una sesión Kimi genera un patrón útil para investigación, lo guarda como skill en su directorio. La siguiente vez que ejecuto `setup-all.sh --import`, esa skill vuelve a la fuente y se distribuye a los otros 7. El conocimiento fluye en ambas direcciones.

## Lo que aprendí montando esto

<div class="not-prose my-8 space-y-4">
  <div class="border border-green-200 bg-green-50 rounded-xl p-5 flex gap-4">
    <div class="flex-shrink-0 w-10 h-10 bg-green-500 text-white rounded-full flex items-center justify-center font-bold text-lg">1</div>
    <div>
      <div class="text-sm font-bold text-gray-900 mb-1">La simplicidad es infraestructura</div>
      <div class="text-sm text-gray-700">Un script de 650 líneas en bash hace más por la sincronización que cualquier herramienta enterprise. No necesitas Kubernetes para orquestar agentes — necesitas symlinks y rsync.</div>
    </div>
  </div>
  <div class="border border-red-200 bg-red-50 rounded-xl p-5 flex gap-4">
    <div class="flex-shrink-0 w-10 h-10 bg-red-500 text-white rounded-full flex items-center justify-center font-bold text-lg">2</div>
    <div>
      <div class="text-sm font-bold text-gray-900 mb-1">El --delete de rsync no es suficiente</div>
      <div class="text-sm text-gray-700">El bug más sutil: rsync con <code class="bg-red-100 px-1 rounded text-xs">--delete</code> solo limpia archivos dentro de cada skill, no directorios enteros que ya no existen en la fuente. Tuve que añadir una pasada de limpieza de huérfanos explícita.</div>
    </div>
  </div>
  <div class="border border-purple-200 bg-purple-50 rounded-xl p-5 flex gap-4">
    <div class="flex-shrink-0 w-10 h-10 bg-purple-500 text-white rounded-full flex items-center justify-center font-bold text-lg">3</div>
    <div>
      <div class="text-sm font-bold text-gray-900 mb-1">El git hook post-merge es magia</div>
      <div class="text-sm text-gray-700">Tras cada <code class="bg-purple-100 px-1 rounded text-xs">git pull</code>, el hook ejecuta <code class="bg-purple-100 px-1 rounded text-xs">setup-all.sh --all</code> automáticamente. Bajas cambios del repo y en segundos están distribuidos a todos los agentes. Cero fricción.</div>
    </div>
  </div>
  <div class="border border-blue-200 bg-blue-50 rounded-xl p-5 flex gap-4">
    <div class="flex-shrink-0 w-10 h-10 bg-blue-500 text-white rounded-full flex items-center justify-center font-bold text-lg">4</div>
    <div>
      <div class="text-sm font-bold text-gray-900 mb-1">El health-check evita sustos</div>
      <div class="text-sm text-gray-700"><code class="bg-blue-100 px-1 rounded text-xs">skills-check</code> (alias de <code class="bg-blue-100 px-1 rounded text-xs">setup-all.sh --check</code>) verifica en segundos que los 8 agentes más el workspace tienen exactamente las mismas skills. Si algo diverge, te dice cuáles faltan o sobran.</div>
    </div>
  </div>
</div>

## Lo que cambiaría si empezara hoy

Con el ecosistema ya maduro y varias semanas de uso real, hay tres cosas que haría diferente desde el principio:

**1. Tests desde el día uno.** El primer bug de limpieza de huérfanos me pilló con 12 skills desincronizadas. Si hubiera tenido un test que verificara la integridad tras cada sync, lo habría pillado en minutos, no días. Ahora `skills-check` forma parte de mi flujo, pero debería haber sido lo primero.

**2. Versionado semántico en las skills.** Las skills evolucionan, y a veces un cambio rompe compatibilidad con agentes que esperaban la versión anterior. Un campo `version` en el frontmatter con reglas de compatibilidad habría ahorrado algún que otro dolor de cabeza.

**3. Métricas de uso desde el inicio.** Ahora sé que mis skills más usadas son `blog-seo-post`, `github-workflow` y `local-ai-nemotron`, pero no tengo datos históricos de cuándo se volvieron populares. Un simple contador de invocaciones por skill me daría señales tempranas de qué mantener y qué deprecar.

**4. Política de conflictos en el cron.** El `git pull` automático cada 30 minutos funciona... hasta que modificas la misma skill en local y en el VPS a la vez. Un conflicto de merge en un cronjob falla silenciosamente — la sincronización se para y nadie se entera. La solución que debería haber implementado desde el principio: el script detecta conflictos (`git diff --check`), fuerza `--strategy-option theirs` para el VPS (que es réplica, no fuente), y te notifica por Telegram con el log del error. Sin eso, un conflicto puede pasar días sin detectarse.

**5. Gestión de secretos antes de distribuir.** Distribuir 47 skills entre 8 agentes y un VPS significa que cualquier ruta absoluta (`/home/asturwebs/...`) o clave de API en texto plano se propaga a todos lados. Las skills deben usar interpolación de variables de entorno (`$GITHUB_TOKEN` en lugar del string real) y el script de sync debe excluir activamente archivos `.env`, `.local` y cualquier archivo con el flag `secret: true` en el frontmatter. No lo hice al principio y limpiar rutas hardcodeadas después fue tedioso.

## ¿Merece la pena?

Si usas un solo agente de IA, probablemente no necesitas esto. Pero si como yo trabajas con varios — cada uno con su fortaleza: Claude Code para razonamiento largo y desarrollo pesado, Gemini CLI para análisis multimodal, Codex para coding especializado, OpenCode como alternativa ágil, BytIA-KODE como agente propio con integración total, Kimi para velocidad en consultas rápidas, Hermes para automatizaciones, y OpenClaw para la infraestructura del VPS — tener un sistema que los mantiene a todos en la misma página es la diferencia entre un hobby y una infraestructura profesional.

En mi caso, pasé de perder skills regularmente a no haber perdido ni una en semanas. Y lo mejor: cualquier skill que cree OpenClaw desde el VPS aparece en mi máquina local en menos de 30 minutos, sin que yo mueva un dedo.

<div class="not-prose my-8 grid grid-cols-1 sm:grid-cols-2 gap-4">
  <div class="border-2 border-green-300 bg-green-50 rounded-xl p-5 relative overflow-hidden">
    <div class="absolute top-0 left-0 right-0 h-1 bg-green-500"></div>
    <div class="text-sm font-bold text-green-800 mb-2">✅ Sí merece la pena si…</div>
    <ul class="text-sm text-gray-700 space-y-1 list-none p-0 m-0">
      <li>• Usas 3+ agentes de IA a diario</li>
      <li>• Tienes skills que evolucionan con frecuencia</li>
      <li>• Trabajas en más de una máquina</li>
      <li>• Un agente remoto crea contenido</li>
      <li>• Necesitas reproducibilidad entre sesiones</li>
    </ul>
  </div>
  <div class="border-2 border-red-300 bg-red-50 rounded-xl p-5 relative overflow-hidden">
    <div class="absolute top-0 left-0 right-0 h-1 bg-red-500"></div>
    <div class="text-sm font-bold text-red-800 mb-2">❌ No necesitas esto si…</div>
    <ul class="text-sm text-gray-700 space-y-1 list-none p-0 m-0">
      <li>• Solo usas un agente (ChatGPT, Claude…)</li>
      <li>• Tus prompts son estáticos</li>
      <li>• No versionas tu trabajo</li>
      <li>• No necesitas reproducibilidad</li>
      <li>• Prefieres copy-paste entre sesiones</li>
    </ul>
  </div>
</div>

## Los números después de semanas de uso

<div class="not-prose my-8 grid grid-cols-2 sm:grid-cols-4 gap-4">
  <div class="bg-indigo-50 border border-indigo-200 rounded-xl p-5 text-center">
    <div class="text-3xl font-extrabold text-indigo-700">47</div>
    <div class="text-xs text-indigo-600 font-semibold uppercase tracking-wide mt-1">Skills activas</div>
  </div>
  <div class="bg-purple-50 border border-purple-200 rounded-xl p-5 text-center">
    <div class="text-3xl font-extrabold text-purple-700">8</div>
    <div class="text-xs text-purple-600 font-semibold uppercase tracking-wide mt-1">Agentes sincronizados</div>
  </div>
  <div class="bg-green-50 border border-green-200 rounded-xl p-5 text-center">
    <div class="text-3xl font-extrabold text-green-700">0</div>
    <div class="text-xs text-green-600 font-semibold uppercase tracking-wide mt-1">Skills perdidas</div>
  </div>
  <div class="bg-amber-50 border border-amber-200 rounded-xl p-5 text-center">
    <div class="text-3xl font-extrabold text-amber-700">~3s</div>
    <div class="text-xs text-amber-600 font-semibold uppercase tracking-wide mt-1">Tiempo de sync</div>
  </div>
</div>

El setup completo — repo, script, 8 agentes, importación inversa — me llevó una tarde. El ROI ha sido inmediato: antes perdía 10-15 minutos al día gestionando versiones de skills entre agentes. Ahora es automático y verificable con un solo comando.

---

<div class="not-prose my-12 bg-indigo-50 border border-indigo-100 rounded-2xl p-8 text-center">
<p class="text-xl font-semibold text-gray-900 mb-2">¿Quieres automatizar tu negocio con agentes de IA?</p>
<p class="text-gray-600 mb-6">Te ayudo a diseñar e implementar el ecosistema de agentes que tu empresa necesita, desde la estrategia hasta el último script.</p>
<a href="/contacto/" class="inline-block bg-primary text-white px-8 py-3 rounded-lg font-semibold hover:bg-primary-hover transition-colors">Cuéntame tu idea →</a>
</div>