🛠️ Skill: Obsidian Git & Mobile Plugin Dev

Resumen de la Skill

Guía técnica y checklist preventivo para el desarrollo de plugins de Obsidian con soporte dual para Escritorio (Windows, Mac, Linux) y Móvil (Android, iOS) mediante sincronización Git sin dependencias externas (cero Termux).


🛡️ Checklist Anti-Rechazo (Obsidian Community Review)

Antes de publicar o enviar un plugin a la tienda oficial de Obsidian, asegúrate de cumplir con estas 5 reglas de oro:

  1. Uso dinámico de carpeta de configuración (app.vault.configDir):
    • ❌ Prohibido: Hardcodear .obsidian. El usuario puede cambiar su carpeta (ej. .obsidian-mobile).
    • ✅ Correcto: Usar siempre this.app.vault.configDir.
  2. Compatibilidad con ventanas emergentes (Popouts):
    • ❌ Prohibido: Usar globalThis para timers o listeners.
    • ✅ Correcto: Usar window o activeWindow.
  3. Cero dependencias nativas de Node en móvil:
    • En Android e iOS no existen child_process, node:fs ni node:buffer.
    • Las operaciones de escritorio deben estar protegidas con if (!Platform.isDesktop).
    • Para buffers en móvil, usar polyfills web seguros (import { Buffer } from "buffer/";) o Uint8Array.
  4. Control estricto de Promesas:
    • Toda promesa debe tener await, .catch() o el operador void explícito (ej. void this.refreshGitStatus()).
  5. Registro seguro con Teardown automático:
    • Registrar siempre eventos y timers con this.registerEvent(), this.registerInterval() y this.registerDomEvent().

⚙️ Arquitectura de Motor Dual (Dual-Engine)

  • 🖥️ Escritorio (Desktop): Ejecuta el binario nativo de Git (execFile) para velocidad máxima y repositorios grandes.
  • 📱 Móvil (Android/iOS): Motor 100% JavaScript puro con isomorphic-git + adaptador de archivos de Obsidian (vault.adapter) + cliente HTTP nativo (obsidianHttpClient sobre requestUrl).

🔑 Autenticación Universal: HTTP Basic Auth

GitHub rechaza encabezados Authorization: Bearer <token> en clones y pushes Git Smart HTTP.

  • Estándar universal: Enviar siempre AUTHORIZATION: Basic <base64("x-access-token:<PAT>")>.

🔀 Prevención de Conflictos y Modo Offline

  • smartMergeDriver: En fusiones de 3 vías de isomorphic-git, la versión remota consolidada gana automáticamente en archivos de configuración interna (.obsidian/*, .gitignore, caches).
  • Checkout forzado (force: true): Evita CheckoutConflictError cuando Obsidian genera archivos iniciales antes de terminar la clonación.
  • Detección Offline (isNetworkOrOfflineError): Detecta cortes de red (ENOTFOUND, ERR_INTERNET_DISCONNECTED) para guardar commits en local y no mostrar alertas rojas alarmantes.