- 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
971 lines
26 KiB
Markdown
971 lines
26 KiB
Markdown
# 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 5–10 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:
|
||
|
||
```ts
|
||
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
|