🛠️ 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:
- 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.
- ❌ Prohibido: Hardcodear
- Compatibilidad con ventanas emergentes (Popouts):
- ❌ Prohibido: Usar
globalThispara timers o listeners. - ✅ Correcto: Usar
windowoactiveWindow.
- ❌ Prohibido: Usar
- Cero dependencias nativas de Node en móvil:
- En Android e iOS no existen
child_process,node:fsninode: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/";) oUint8Array.
- En Android e iOS no existen
- Control estricto de Promesas:
- Toda promesa debe tener
await,.catch()o el operadorvoidexplícito (ej.void this.refreshGitStatus()).
- Toda promesa debe tener
- Registro seguro con Teardown automático:
- Registrar siempre eventos y timers con
this.registerEvent(),this.registerInterval()ythis.registerDomEvent().
- Registrar siempre eventos y timers con
⚙️ 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 (obsidianHttpClientsobrerequestUrl).
🔑 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 deisomorphic-git, la versión remota consolidada gana automáticamente en archivos de configuración interna (.obsidian/*,.gitignore, caches).- Checkout forzado (
force: true): EvitaCheckoutConflictErrorcuando 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.