Files
recall/backlog/recall-mvp5-tickets-detallado.md
Daniel Arroyo 8c80a12b81 feat: MVP-5 Sprint 1 - Backup/Restore system
- Add backup types and RecallBackup format
- Create backup snapshot engine (createBackupSnapshot)
- Add IndexedDB storage for local backups
- Implement retention policy (max 10, 30-day cleanup)
- Add backup validation and restore logic (merge/replace modes)
- Add backup restore UI dialog with preview and confirmation
- Add unsaved changes guard hook
- Integrate backups section in Settings
- Add backup endpoint to export-import API
2026-03-22 18:16:36 -03:00

26 KiB
Raw Blame History

Recall — Tickets técnicos MVP-5 (Confianza, flujo diario y expansión)

Objetivo general

Consolidar Recall como sistema principal de pensamiento y memoria externa, enfocado en:

  • confianza total en los datos
  • reducción extrema de fricción
  • captura desde fuera de la app
  • recuperación y operación desde teclado
  • portabilidad real del conocimiento

Principios de producto

  1. No perder nada: backup y restore confiables.
  2. Todo a mano: acciones principales accesibles por teclado.
  3. Captura ubicua: guardar conocimiento desde cualquier contexto.
  4. Salida garantizada: exportaciones útiles y reversibles.
  5. Experiencia continua: la app acompaña el flujo de trabajo, no lo interrumpe.

EPIC 1 — Confianza total y resiliencia de datos

[P1] Ticket 01 — Diseñar estrategia de backup automático local

Objetivo
Definir e implementar una estrategia segura de backup automático para evitar pérdida de datos y aumentar la confianza en Recall.

Contexto
Recall ya cuenta con export/import manual e historial de versiones por nota. El siguiente salto es garantizar respaldo periódico y silencioso del estado global del conocimiento.

Problema que resuelve

  • Riesgo de pérdida por errores del usuario, corrupción local o cambios no deseados.
  • Dependencia de exportaciones manuales.
  • Falta de sensación de “sistema confiable”.

Alcance

  • Diseñar estrategia de backup automático basada en eventos y/o tiempo:
    • al detectar cambios significativos
    • cada cierto intervalo configurable
    • al cerrar sesión o abandonar pestaña cuando aplique
  • Definir formato del backup:
    • JSON estructurado compatible con importación
    • metadatos de versión, fecha, origen, conteos
  • Definir almacenamiento inicial:
    • IndexedDB recomendado para snapshots locales
    • alternativa: local filesystem vía descarga manual asistida
  • Crear servicio de generación de backup
  • Crear política de retención:
    • conservar últimos N backups
    • limpiar backups viejos automáticamente

No incluye

  • sincronización cloud
  • backup remoto
  • cifrado extremo a extremo

Criterios de aceptación

  • La app genera backups automáticamente sin intervención manual
  • Los backups se almacenan con timestamp y metadatos
  • Existe retención automática configurable o fija
  • El proceso no bloquea la UI
  • El formato es compatible con restore/import
  • Hay tests para serialización y política de retención

Archivos sugeridos

  • src/lib/backup.ts
  • src/lib/backup-storage.ts
  • src/lib/backup-policy.ts
  • src/types/backup.ts
  • src/app/settings/page.tsx
  • src/app/api/export-import/route.ts

Notas técnicas

  • Separar claramente:
    • generación del snapshot
    • persistencia local
    • política de retención
  • Preferir un esquema de versión explícito del backup (schemaVersion)
  • Incluir checksum o hash simple opcional para detectar corrupción
  • Mantener compatibilidad hacia atrás cuando cambie el formato

[P1] Ticket 02 — Implementar motor de snapshot global exportable

Objetivo
Crear una utilidad robusta que genere snapshots completos y consistentes del estado de Recall.

Alcance

  • Incluir en el snapshot:
    • notas
    • tags
    • backlinks/enlaces si corresponden
    • métricas relevantes necesarias para restore
    • versiones de notas, si se decide incluirlas
    • metadatos de creación
  • Crear función createBackupSnapshot()
  • Reutilizar la lógica existente de exportación para evitar duplicación
  • Estandarizar el shape del payload exportable

No incluye

  • compresión
  • cifrado

Criterios de aceptación

  • Un snapshot puede reconstruir el estado esperado del sistema
  • El export manual y el backup automático comparten formato base o traductor explícito
  • Tests verifican consistencia del snapshot
  • El snapshot incluye versión de esquema y fecha de creación

Archivos sugeridos

  • src/lib/backup.ts
  • src/lib/export.ts
  • src/app/api/export-import/route.ts
  • __tests__/backup.test.ts

Notas técnicas

  • Evitar incluir datos derivados si pueden regenerarse fácilmente
  • Documentar claramente qué campos se consideran fuente de verdad
  • Si NoteUsage no debe restaurarse, dejarlo explícito en especificación

[P1] Ticket 03 — Restore desde backup con preview y validación

Objetivo
Permitir restaurar un backup de forma segura, transparente y reversible.

Alcance

  • Crear flujo de restore desde Settings
  • Validar el archivo antes de aplicar:
    • schemaVersion
    • integridad mínima
    • estructura esperada
  • Mostrar preview:
    • cantidad de notas
    • tags
    • versiones
    • fecha del backup
  • Permitir dos modos:
    • merge
    • replace completo
  • Confirmación explícita antes de aplicar

No incluye

  • merge inteligente avanzado por conflicto
  • restore parcial por selección de entidades

Criterios de aceptación

  • El usuario puede seleccionar un backup y previsualizarlo
  • El sistema informa claramente qué se va a restaurar
  • Hay confirmación antes del replace
  • El restore fallido no deja la base en estado inconsistente
  • Existe feedback claro de éxito/error

Archivos sugeridos

  • src/components/backup-restore-dialog.tsx
  • src/lib/restore.ts
  • src/lib/backup-validator.ts
  • src/app/settings/page.tsx
  • src/app/api/export-import/route.ts

Notas técnicas

  • En replace, considerar transacción única
  • En merge, definir reglas claras por ID/título
  • Crear un backup previo automático antes de aplicar restore

[P1] Ticket 04 — Backup previo automático antes de operaciones destructivas

Objetivo
Reducir al mínimo el riesgo antes de operaciones peligrosas.

Alcance

  • Generar backup automático antes de:
    • restore replace
    • import replace
    • borrados masivos futuros
  • Etiquetar ese backup como pre-destructive
  • Permitir revertir rápidamente

Criterios de aceptación

  • Antes de una operación destructiva se crea un backup
  • El backup queda identificado y visible en UI
  • Si la operación falla, el backup sigue disponible

Archivos sugeridos

  • src/lib/backup.ts
  • src/lib/restore.ts
  • src/app/settings/page.tsx

[P1] Ticket 05 — Guard de cambios no guardados

Objetivo
Evitar pérdida accidental de trabajo durante edición.

Alcance

  • Detectar cambios sucios en note-form
  • Advertir al:
    • navegar fuera de la página
    • cerrar pestaña
    • refrescar
  • Permitir omitir warning cuando no hay cambios

No incluye

  • autosave completo
  • borradores persistentes

Criterios de aceptación

  • Si hay cambios sin guardar, aparece advertencia al salir
  • Si no hay cambios, no aparece advertencia
  • Funciona en crear y editar
  • No rompe submit exitoso

Archivos sugeridos

  • src/hooks/use-unsaved-changes.ts
  • src/components/note-form.tsx
  • src/app/edit/[id]/page.tsx
  • src/app/new/page.tsx

Notas técnicas

  • Diferenciar estado inicial vs actual
  • Manejar beforeunload con cuidado por compatibilidad del navegador

[P2] Ticket 06 — Autosave opcional de borrador local

Objetivo
Agregar una capa extra de protección sin imponer complejidad excesiva.

Alcance

  • Guardar borrador local temporal de la nota en edición
  • Recuperarlo al reabrir la pantalla
  • Permitir descartarlo manualmente

Criterios de aceptación

  • Si se cierra accidentalmente, el borrador puede recuperarse
  • El borrador se limpia al guardar correctamente
  • El usuario puede descartar borrador recuperado

Archivos sugeridos

  • src/lib/drafts.ts
  • src/components/note-form.tsx
  • src/components/draft-recovery-banner.tsx

EPIC 2 — Operación diaria desde teclado

[P1] Ticket 07 — Command Palette global (Ctrl+K / Cmd+K)

Objetivo
Centralizar búsqueda, navegación y acciones en una interfaz rápida tipo command palette.

Contexto
Recall ya tiene búsqueda potente y navegación por teclado en el search bar. El siguiente paso es ofrecer una capa global de comandos que reduzca aún más la fricción.

Alcance

  • Atajo global:
    • Ctrl+K en Windows/Linux
    • Cmd+K en macOS
  • Modal o palette flotante global
  • Soportar acciones iniciales:
    • buscar notas
    • abrir nota
    • crear nueva nota
    • quick add
    • ir a dashboard
    • ir a settings
    • ir a notas favoritas
    • ir a notas recientes
  • Secciones:
    • acciones
    • resultados de búsqueda
    • navegación
  • Navegación total por teclado

No incluye

  • edición avanzada dentro de la palette
  • plugins de comandos externos

Criterios de aceptación

  • La palette abre/cierra con shortcut global
  • Se puede usar sin mouse
  • Enter ejecuta acción seleccionada
  • ESC cierra
  • Resultados y acciones están claramente separadas
  • Funciona desde cualquier pantalla

Archivos sugeridos

  • src/components/command-palette.tsx
  • src/hooks/use-command-palette.ts
  • src/lib/command-palette.ts
  • src/app/layout.tsx
  • src/components/header.tsx

Notas técnicas

  • Reutilizar search.ts y la API existente cuando sea posible
  • Mantener selección activa y scroll automático
  • Considerar accesibilidad: focus trap, ARIA roles

[P1] Ticket 08 — Modelo de acciones y proveedores para Command Palette

Objetivo
Desacoplar la palette de las acciones concretas para facilitar expansión futura.

Alcance

  • Crear modelo uniforme de comando:
    • id
    • label
    • description
    • group
    • keywords
    • action handler
    • icon opcional
  • Crear proveedores:
    • acciones estáticas
    • notas recientes
    • resultados de búsqueda
  • Sistema de ranking simple para comandos

Criterios de aceptación

  • Se pueden agregar nuevas acciones sin tocar el core visual
  • La palette consume una lista homogénea de items
  • El sistema soporta agrupación y orden

Archivos sugeridos

  • src/lib/command-items.ts
  • src/lib/command-groups.ts
  • src/lib/command-ranking.ts
  • src/components/command-palette.tsx

[P1] Ticket 09 — Acciones rápidas por teclado fuera de la palette

Objetivo
Expandir la operación de Recall sin depender de clicks.

Alcance

  • Definir shortcuts globales seguros:
    • g h → dashboard
    • g n → notas
    • n → nueva nota
    • / → enfocar búsqueda
    • ? → ayuda de shortcuts
  • Mostrar ayuda contextual de shortcuts

Criterios de aceptación

  • Los shortcuts no interfieren con inputs activos
  • Se pueden desactivar en campos de texto
  • Existe una vista/modal de ayuda

Archivos sugeridos

  • src/hooks/use-global-shortcuts.ts
  • src/components/keyboard-shortcuts-dialog.tsx
  • src/app/layout.tsx

Notas técnicas

  • Ignorar shortcuts cuando hay foco en input, textarea o contenteditable
  • Centralizar mapa de shortcuts en un único archivo

[P2] Ticket 10 — Navegación completa de listas por teclado

Objetivo
Permitir abrir y operar notas desde listados sin usar mouse.

Alcance

  • Flechas para moverse entre resultados/listas
  • Enter para abrir
  • Atajos para:
    • editar
    • favorite
    • pin
  • Soporte en:
    • /notes
    • dashboard
    • dropdown de búsqueda

Criterios de aceptación

  • Las listas principales se pueden recorrer por teclado
  • El elemento seleccionado tiene estado visual claro
  • Las acciones rápidas no rompen accesibilidad

Archivos sugeridos

  • src/components/note-list.tsx
  • src/components/dashboard.tsx
  • src/components/search-bar.tsx

EPIC 3 — Contexto activo y workspace continuo

[P1] Ticket 11 — Sidebar contextual persistente mejorada

Objetivo
Convertir la sidebar contextual en un asistente permanente del flujo de trabajo.

Alcance

  • Mantener sidebar visible en detalle de nota y opcionalmente en edición
  • Secciones posibles:
    • relacionadas
    • backlinks
    • co-usadas
    • recientes
    • versiones recientes
    • sugerencias contextuales
  • Mejorar densidad y jerarquía visual
  • Permitir colapsar/expandir secciones

Criterios de aceptación

  • La sidebar muestra contenido útil sin saturar
  • Las secciones pueden plegarse
  • En pantallas pequeñas se adapta sin romper el layout
  • Se distinguen claramente los tipos de relación

Archivos sugeridos

  • src/components/note-context-sidebar.tsx
  • src/components/note-connections.tsx
  • src/app/notes/[id]/page.tsx

[P2] Ticket 12 — Modo trabajo enfocado

Objetivo
Ofrecer una experiencia de lectura/consulta prolongada con menos distracciones y más contexto útil.

Alcance

  • Crear un “modo trabajo” activable por toggle
  • Cambios de UI:
    • ancho de lectura optimizado
    • sidebar contextual persistente
    • header reducido
    • acciones rápidas siempre visibles
  • Persistir preferencia local

Criterios de aceptación

  • El usuario puede activar/desactivar el modo trabajo
  • La preferencia se mantiene entre sesiones
  • Mejora la experiencia en detalle de nota sin romper navegación general

Archivos sugeridos

  • src/components/work-mode-toggle.tsx
  • src/lib/work-mode.ts
  • src/app/notes/[id]/page.tsx
  • src/app/globals.css

[P2] Ticket 13 — Historial de navegación contextual

Objetivo
Facilitar volver sobre el camino mental reciente.

Alcance

  • Registrar secuencia reciente de notas abiertas
  • Mostrar “visto recientemente en este contexto”
  • Posibilidad de volver rápido a 510 notas recientes

Criterios de aceptación

  • El usuario ve un historial local reciente
  • Puede reabrir notas anteriores con un click o atajo
  • El historial no duplica entradas consecutivas idénticas

Archivos sugeridos

  • src/lib/navigation-history.ts
  • src/components/recent-context-list.tsx
  • src/components/command-palette.tsx
  • src/components/note-context-sidebar.tsx

EPIC 4 — Captura ubicua fuera de Recall

[P1] Ticket 14 — Bookmarklet para guardar página actual

Objetivo
Permitir capturar contenido desde cualquier web hacia Recall con fricción mínima.

Contexto
Recall ya resuelve bien captura interna. El siguiente paso de uso diario es capturar desde el navegador sin tener que abrir manualmente la app y crear una nota.

Alcance

  • Diseñar bookmarklet inicial que:
    • tome document.title
    • tome location.href
    • opcionalmente tome selección de texto
    • abra una URL de Recall con payload prellenado
  • Crear pantalla o endpoint receptor para captura externa
  • Mapear captura a tipo de nota por defecto (note o snippet según caso)

No incluye

  • extensión completa de navegador
  • scraping profundo del DOM

Criterios de aceptación

  • El bookmarklet funciona en páginas comunes
  • Si hay texto seleccionado, se incluye en la captura
  • Si no hay selección, se guarda al menos título + URL
  • Recall recibe y prellena una nota lista para confirmar o guardar

Archivos sugeridos

  • src/app/capture/page.tsx
  • src/lib/external-capture.ts
  • src/components/bookmarklet-instructions.tsx
  • src/app/settings/page.tsx

Notas técnicas

  • Codificar payload en query string de forma segura
  • Considerar límites de longitud: si es largo, usar mecanismo de POST o fallback
  • Sanitizar el contenido recibido

[P1] Ticket 15 — Flujo de confirmación para captura externa

Objetivo
Evitar guardar basura y dar control antes de persistir.

Alcance

  • Pantalla de revisión para captura externa:
    • título
    • url
    • contenido/selección
    • tags sugeridos
    • tipo sugerido
  • Botones:
    • guardar
    • editar
    • cancelar
  • Posibilidad de convertir la URL en markdown limpio

Criterios de aceptación

  • La captura externa llega prellenada
  • El usuario puede corregir antes de guardar
  • El flujo es rápido y no requiere pasos innecesarios

Archivos sugeridos

  • src/app/capture/page.tsx
  • src/components/external-capture-form.tsx
  • src/lib/type-inference.ts
  • src/lib/tags.ts

[P2] Ticket 16 — Endpoint seguro para captura externa por POST

Objetivo
Preparar Recall para integraciones futuras más robustas que el bookmarklet simple.

Alcance

  • Crear endpoint dedicado para captura externa
  • Aceptar payload estructurado:
    • title
    • url
    • selection
    • source
    • inferredType
  • Validar con Zod
  • Responder con payload listo para preview o guardado

Criterios de aceptación

  • El endpoint valida correctamente el payload
  • No guarda automáticamente sin intención explícita
  • Puede ser reutilizado por extensión futura o integraciones

Archivos sugeridos

  • src/app/api/capture/route.ts
  • src/lib/external-capture.ts
  • src/lib/validators.ts

EPIC 5 — Importación y exportación de nivel producto

[P1] Ticket 17 — Exportación mejorada a Markdown

Objetivo
Asegurar portabilidad real del conocimiento en un formato simple y durable.

Alcance

  • Exportar todas las notas a estructura Markdown
  • Incluir:
    • frontmatter opcional
    • título
    • contenido
    • tags
    • tipo
    • fechas
  • Generar nombres de archivo estables y seguros
  • Opción de exportar zip de múltiples .md

No incluye

  • sync con repos remotos
  • assets binarios complejos

Criterios de aceptación

  • El usuario puede exportar todas las notas a .md
  • Cada nota queda representada de forma legible
  • Los archivos son reimportables con reglas definidas
  • Tags y tipo no se pierden

Archivos sugeridos

  • src/lib/export-markdown.ts
  • src/app/api/export-import/route.ts
  • src/app/settings/page.tsx

Notas técnicas

  • Resolver colisiones de nombres
  • Normalizar saltos de línea
  • Documentar formato de frontmatter si se usa

[P1] Ticket 18 — Exportación HTML simple y legible

Objetivo
Facilitar compartir o archivar notas en un formato visualmente cómodo.

Alcance

  • Crear export HTML por nota o lote
  • Incluir render de markdown
  • Estilo básico embebido o plantilla simple

Criterios de aceptación

  • La exportación HTML es legible offline
  • Respeta headings, listas, código y enlaces
  • Puede abrirse directamente en navegador

Archivos sugeridos

  • src/lib/export-html.ts
  • src/app/api/export-import/route.ts

[P2] Ticket 19 — Importador de Markdown mejorado

Objetivo
Hacer Recall más interoperable con flujos existentes.

Alcance

  • Mejorar importador .md actual para soportar:
    • frontmatter
    • tags
    • tipo
    • títulos ausentes o derivados
    • sintaxis [[wiki]]
  • Permitir importar múltiples archivos si la UX lo permite

Criterios de aceptación

  • Markdown con frontmatter se importa correctamente
  • Se preservan tags y tipo cuando existen
  • El contenido sigue siendo fiel al original

Archivos sugeridos

  • src/lib/import-markdown.ts
  • src/app/api/export-import/route.ts
  • src/components/import-dialog.tsx

[P2] Ticket 20 — Importador base de Obsidian-compatible Markdown

Objetivo
Reducir fricción de entrada para usuarios con conocimiento ya almacenado fuera de Recall.

Alcance

  • Aceptar archivos/estructura compatibles con vault simple:
    • markdown
    • [[wiki links]]
    • tags inline #tag
  • Resolver títulos desde filename cuando haga falta
  • Crear estrategia básica de deduplicación

Criterios de aceptación

  • Un conjunto simple de notas estilo Obsidian se importa sin perder estructura esencial
  • Los wiki links se preservan o transforman correctamente
  • La deduplicación evita duplicados obvios

Archivos sugeridos

  • src/lib/import-obsidian.ts
  • src/app/api/export-import/route.ts

EPIC 6 — Operación y configuración visible

[P2] Ticket 21 — Centro de respaldo y portabilidad en Settings

Objetivo
Reunir en una sola UI todas las capacidades de backup, restore, import y export.

Alcance

  • Crear sección clara en Settings:
    • backups automáticos
    • backups disponibles
    • restore
    • export JSON
    • export Markdown
    • export HTML
    • import Markdown/JSON
  • Mostrar último backup realizado
  • Mostrar tamaño aproximado y fecha

Criterios de aceptación

  • Settings concentra todas las acciones de seguridad y portabilidad
  • El usuario entiende claramente qué hace cada opción
  • El flujo no requiere conocer detalles técnicos internos

Archivos sugeridos

  • src/app/settings/page.tsx
  • src/components/backup-center.tsx
  • src/components/export-options.tsx
  • src/components/import-options.tsx

[P2] Ticket 22 — Configuración visible de feature flags y preferencias clave

Objetivo
Dar control operativo sobre comportamientos avanzados ya implementados.

Alcance

  • Exponer desde Settings:
    • feature flags activas
    • modo trabajo
    • backup automático on/off
    • retención de backups
    • shortcuts visibles
  • Persistencia local o en configuración simple

Criterios de aceptación

  • El usuario puede ver y cambiar flags/preferencias principales
  • Los cambios se reflejan sin romper la app
  • Existe estado inicial razonable por defecto

Archivos sugeridos

  • src/app/settings/page.tsx
  • src/lib/features.ts
  • src/lib/preferences.ts

EPIC 7 — Calidad, seguridad operativa y pruebas

[P1] Ticket 23 — Tests unitarios para backup/restore

Objetivo
Proteger la capa de confianza antes de expandir más el producto.

Alcance

  • Tests para:
    • snapshot generation
    • validación de backup
    • retención
    • restore merge
    • restore replace
    • backup pre-destructive

Criterios de aceptación

  • Casos felices y bordes cubiertos
  • Fixtures de backup versionados
  • Restore inválido falla de forma segura

Archivos sugeridos

  • __tests__/backup.test.ts
  • __tests__/restore.test.ts
  • __tests__/backup-validator.test.ts

[P1] Ticket 24 — Tests de integración para command palette y captura externa

Objetivo
Validar los nuevos flujos de uso diario y expansión.

Alcance

  • Probar:
    • apertura/cierre de palette
    • navegación por teclado
    • ejecución de comandos
    • recepción de captura externa
    • flujo de confirmación de captura

Criterios de aceptación

  • Los flujos críticos están cubiertos
  • Los shortcuts no interfieren con formularios
  • La captura externa llega correctamente prellenada

Archivos sugeridos

  • __tests__/command-palette.test.tsx
  • __tests__/capture-flow.test.tsx

[P2] Ticket 25 — Harden de validaciones y límites operativos

Objetivo
Aumentar robustez de las nuevas entradas/salidas del sistema.

Alcance

  • Definir límites razonables para:
    • tamaño de backup
    • tamaño de payload de captura externa
    • cantidad de backups retenidos
  • Validación estricta de formatos
  • Mensajes de error claros y recuperables

Criterios de aceptación

  • El sistema rechaza entradas excesivas o inválidas de forma clara
  • No se degrada la app por payloads grandes o malformados
  • Los errores se muestran de forma consistente

Archivos sugeridos

  • src/lib/backup-validator.ts
  • src/lib/external-capture.ts
  • src/lib/errors.ts
  • src/lib/validators.ts

Orden recomendado de implementación

Sprint 1 — Confianza primero

  • Ticket 01 — Estrategia de backup automático local
  • Ticket 02 — Motor de snapshot global exportable
  • Ticket 03 — Restore con preview y validación
  • Ticket 04 — Backup previo automático
  • Ticket 23 — Tests unitarios backup/restore

Sprint 2 — Flujo diario brutal

  • Ticket 07 — Command Palette global
  • Ticket 08 — Modelo de acciones para palette
  • Ticket 09 — Shortcuts globales
  • Ticket 10 — Navegación de listas por teclado
  • Ticket 24 — Tests integración palette

Sprint 3 — Contexto y continuidad

  • Ticket 11 — Sidebar contextual persistente mejorada
  • Ticket 12 — Modo trabajo enfocado
  • Ticket 13 — Historial de navegación contextual
  • Ticket 05 — Guard de cambios no guardados
  • Ticket 06 — Autosave opcional de borrador local

Sprint 4 — Captura externa

  • Ticket 14 — Bookmarklet para guardar página actual
  • Ticket 15 — Flujo de confirmación para captura externa
  • Ticket 16 — Endpoint seguro para captura externa

Sprint 5 — Portabilidad real

  • Ticket 17 — Exportación mejorada a Markdown
  • Ticket 18 — Exportación HTML
  • Ticket 19 — Importador Markdown mejorado
  • Ticket 20 — Importador base Obsidian-compatible
  • Ticket 21 — Centro de respaldo y portabilidad
  • Ticket 22 — Configuración visible de flags/preferencias
  • Ticket 25 — Harden de validaciones y límites

Dependencias y decisiones de arquitectura recomendadas

Decisión 1 — Backup format

Definir explícitamente un formato versionado:

type RecallBackup = {
  schemaVersion: "1.0";
  createdAt: string;
  source: "automatic" | "manual" | "pre-destructive";
  appVersion?: string;
  metadata: {
    noteCount: number;
    tagCount: number;
    versionCount?: number;
  };
  data: {
    notes: unknown[];
    tags: unknown[];
    noteVersions?: unknown[];
    backlinks?: unknown[];
  };
};

Decisión 2 — Restore modes

Mantener solo dos modos al inicio:

  • merge: agrega/actualiza sin borrar todo
  • replace: reemplaza completamente el dataset

No agregar modos intermedios hasta tener uso real.

Decisión 3 — Command palette scope inicial

La primera versión debe centrarse en:

  • navegación
  • búsqueda
  • creación
  • acceso a pantallas No convertirla aún en un motor de automatizaciones complejas.

Decisión 4 — Bookmarklet MVP

El bookmarklet debe ser lo más simple posible:

  • capturar title
  • capturar url
  • capturar selección si existe
  • abrir Recall con preview prellenada

No hacer scraping complejo en esta fase.

Decisión 5 — Export portability

Markdown debe convertirse en el formato de salida principal legible por humanos. JSON debe seguir siendo el formato fiel para restore exacto.


Plantilla sugerida para Claude Code

Título

[P1] Implementar restore desde backup con preview y validación

Contexto

Recall ya ofrece export/import manual e historial de versiones. Para convertirlo en una herramienta confiable de uso diario, se necesita restore seguro desde backups automáticos y manuales.

Objetivo

Permitir restaurar backups con validación previa, preview del contenido y confirmación explícita, soportando modos merge y replace.

Alcance

  • validador de backup
  • preview de metadatos
  • flujo de confirmación
  • ejecución segura del restore
  • integración con settings

No incluye

  • resolución avanzada de conflictos
  • restore parcial por tipo de entidad
  • sync remoto

Criterios de aceptación

  • ...
  • ...
  • ...

Archivos a tocar

  • ...
  • ...

Notas técnicas

  • usar transacciones en replace
  • crear backup previo automático
  • mostrar errores consistentes

Definition of Done

  • Funcionalidad implementada y usable
  • Tests unitarios e integración relevantes pasando
  • Sin regresiones en CRUD, búsqueda, versiones y captura
  • Estados vacíos, borde y error cubiertos
  • UI clara para acciones sensibles
  • Portabilidad comprobable con export/import real