- Add query-parser.ts with AST for type:, tag:, is:favorite, is:pinned filters - Integrate parser into search API - Add real-time search with 300ms debounce in search-bar - Add keyboard navigation (↑↓ Enter ESC) for Spotlight-like UX - Add dropdown results display with loading state - Add 22 tests for query parser Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
253 lines
4.1 KiB
Markdown
253 lines
4.1 KiB
Markdown
# Recall — Tickets técnicos MVP-4 (Camino Producto)
|
|
|
|
## 🎯 Objetivo
|
|
Convertir Recall en una herramienta confiable, rápida y diaria, enfocada en:
|
|
- búsqueda tipo Google personal
|
|
- navegación instantánea
|
|
- confianza (historial + backup)
|
|
- contexto activo
|
|
|
|
---
|
|
|
|
# 🧩 EPIC 1 — Búsqueda avanzada (Google personal)
|
|
|
|
## [P1] Ticket 01 — Parser de query avanzada
|
|
|
|
**Objetivo**
|
|
Permitir búsquedas expresivas tipo: `docker tag:backend type:command`
|
|
|
|
**Alcance**
|
|
- Crear `src/lib/query-parser.ts`
|
|
- Soportar:
|
|
- texto libre
|
|
- `type:`
|
|
- `tag:`
|
|
- `is:favorite`, `is:pinned`
|
|
- Devolver AST simple
|
|
|
|
**Criterios**
|
|
- Queries válidas parsean correctamente
|
|
- Soporta combinación de filtros + texto
|
|
- Tests unitarios incluidos
|
|
|
|
---
|
|
|
|
## [P1] Ticket 02 — Integrar query avanzada en search
|
|
|
|
**Objetivo**
|
|
Aplicar parser en `/api/search`
|
|
|
|
**Alcance**
|
|
- Filtrar por AST antes de scoring
|
|
- Mantener scoring existente
|
|
|
|
**Criterios**
|
|
- `type:command docker` filtra correctamente
|
|
- `tag:api error` funciona
|
|
- No rompe búsqueda actual
|
|
|
|
---
|
|
|
|
## [P1] Ticket 03 — Búsqueda en tiempo real
|
|
|
|
**Objetivo**
|
|
Actualizar resultados mientras el usuario escribe
|
|
|
|
**Alcance**
|
|
- Debounce en `search-bar.tsx`
|
|
- Fetch automático
|
|
- Estado loading ligero
|
|
|
|
**Criterios**
|
|
- Resultados cambian en <300ms
|
|
- No bloquea UI
|
|
|
|
---
|
|
|
|
## [P1] Ticket 04 — Navegación por teclado en búsqueda
|
|
|
|
**Objetivo**
|
|
UX tipo Spotlight
|
|
|
|
**Alcance**
|
|
- ↑ ↓ para moverse
|
|
- Enter para abrir
|
|
- ESC para cerrar
|
|
|
|
**Criterios**
|
|
- Navegación sin mouse
|
|
- Estado seleccionado visible
|
|
|
|
---
|
|
|
|
# 🧠 EPIC 2 — Contexto activo
|
|
|
|
## [P1] Ticket 05 — Sidebar contextual inteligente
|
|
|
|
**Objetivo**
|
|
Mostrar contexto dinámico mientras navegas
|
|
|
|
**Alcance**
|
|
- Crear `note-context-sidebar.tsx`
|
|
- Mostrar:
|
|
- relacionadas
|
|
- co-uso
|
|
- backlinks
|
|
- recientes
|
|
|
|
**Criterios**
|
|
- Siempre muestra contenido relevante
|
|
- No rompe layout responsive
|
|
|
|
---
|
|
|
|
## [P2] Ticket 06 — Sugerencias dinámicas en lectura
|
|
|
|
**Objetivo**
|
|
Recomendar contenido mientras lees
|
|
|
|
**Alcance**
|
|
- Hook en `notes/[id]/page.tsx`
|
|
- Actualizar sugerencias según scroll/uso
|
|
|
|
**Criterios**
|
|
- Sugerencias cambian según contexto
|
|
- No afecta performance
|
|
|
|
---
|
|
|
|
# 🔐 EPIC 3 — Confianza total
|
|
|
|
## [P1] Ticket 07 — Historial de versiones
|
|
|
|
**Objetivo**
|
|
Permitir ver y revertir cambios
|
|
|
|
**Alcance**
|
|
- Modelo `NoteVersion`
|
|
- Guardar snapshot en cada update
|
|
- Endpoint `/api/notes/[id]/versions`
|
|
|
|
**Criterios**
|
|
- Se pueden listar versiones
|
|
- Se puede restaurar versión
|
|
- No rompe edición actual
|
|
|
|
---
|
|
|
|
## [P1] Ticket 08 — UI historial de versiones
|
|
|
|
**Objetivo**
|
|
Visualizar cambios
|
|
|
|
**Alcance**
|
|
- Vista en `notes/[id]`
|
|
- Mostrar lista de versiones
|
|
- Botón restaurar
|
|
|
|
**Criterios**
|
|
- UX clara
|
|
- Confirmación antes de revertir
|
|
|
|
---
|
|
|
|
## [P2] Ticket 09 — Backup automático
|
|
|
|
**Objetivo**
|
|
Evitar pérdida de datos
|
|
|
|
**Alcance**
|
|
- Export JSON automático
|
|
- Guardar en local (descarga o storage)
|
|
|
|
**Criterios**
|
|
- Backup se genera periódicamente
|
|
- No bloquea app
|
|
|
|
---
|
|
|
|
# ⚡ EPIC 4 — Rendimiento y UX
|
|
|
|
## [P1] Ticket 10 — Cache de resultados de búsqueda
|
|
|
|
**Objetivo**
|
|
Reducir latencia
|
|
|
|
**Alcance**
|
|
- Cache en cliente por query
|
|
- Invalidación simple
|
|
|
|
**Criterios**
|
|
- Queries repetidas son instantáneas
|
|
- No datos stale críticos
|
|
|
|
---
|
|
|
|
## [P2] Ticket 11 — Preload de notas frecuentes
|
|
|
|
**Objetivo**
|
|
Abrir notas más rápido
|
|
|
|
**Alcance**
|
|
- Prefetch en hover/listado
|
|
- Usar Next.js prefetch
|
|
|
|
**Criterios**
|
|
- Navegación instantánea en notas frecuentes
|
|
|
|
---
|
|
|
|
# 🧪 EPIC 5 — Calidad
|
|
|
|
## [P1] Ticket 12 — Tests query avanzada
|
|
|
|
- parser
|
|
- integración search
|
|
|
|
---
|
|
|
|
## [P1] Ticket 13 — Tests historial versiones
|
|
|
|
- creación
|
|
- restore
|
|
- edge cases
|
|
|
|
---
|
|
|
|
## [P2] Ticket 14 — Tests navegación teclado
|
|
|
|
- selección
|
|
- acciones
|
|
|
|
---
|
|
|
|
# 🗺️ Orden sugerido
|
|
|
|
## Sprint 1
|
|
- Query parser
|
|
- Integración search
|
|
- Real-time search
|
|
- Tests base
|
|
|
|
## Sprint 2
|
|
- Navegación teclado
|
|
- Sidebar contextual
|
|
- Cache búsqueda
|
|
|
|
## Sprint 3
|
|
- Historial versiones (API + UI)
|
|
|
|
## Sprint 4
|
|
- Backup automático
|
|
- Preload notas
|
|
- Tests finales
|
|
|
|
---
|
|
|
|
# ✅ Definition of Done
|
|
|
|
- Feature usable sin bugs críticos
|
|
- Tests pasando
|
|
- No regresiones
|
|
- UX fluida (<300ms interacción)
|