- Add Jenkinsfile for CI/CD pipeline - Fix keyboard shortcut '?' handling for help dialog - Update note form and connections components - Add work mode toggle improvements - Update navigation history and usage tracking - Improve validators - Add session summaries
15 KiB
15 KiB
Recall - Resumen Técnico Detallado
Información General
Nombre: Recall Descripción: Sistema de gestión de conocimiento personal (PKM) para captura y recuperación de notas, comandos, snippets y conocimiento técnico. Fecha de creación: 2026-03-22 Estado: MVP-5 Completo
Stack Tecnológico
| Componente | Tecnología | Versión |
|---|---|---|
| Framework | Next.js + App Router + Turbopack | 16.2.1 |
| Base de datos | SQLite via Prisma ORM | 5.22.0 |
| Lenguaje | TypeScript | 5.x |
| UI | TailwindCSS + shadcn/ui | 4.x / latest |
| Testing | Jest | 30.3.0 |
| Notificaciones | Sonner (toasts) | latest |
| IDE | VSCode / Cursor |
Estructura del Proyecto
src/
├── app/
│ ├── api/
│ │ ├── notes/
│ │ │ ├── route.ts # GET, POST /api/notes
│ │ │ ├── [id]/route.ts # GET, PUT, DELETE /api/notes/:id
│ │ │ ├── quick/route.ts # POST /api/notes/quick
│ │ │ ├── links/route.ts # GET /api/notes/links
│ │ │ ├── suggest/route.ts # GET /api/notes/suggest
│ │ │ ├── backlinks/route.ts # GET /api/notes/:id/backlinks
│ │ │ └── versions/
│ │ │ ├── route.ts # GET, POST /api/notes/:id/versions
│ │ │ └── [versionId]/route.ts # GET, PUT
│ │ ├── tags/
│ │ │ ├── route.ts # GET /api/tags
│ │ │ └── suggest/route.ts # GET /api/tags/suggest
│ │ ├── search/route.ts # GET /api/search
│ │ ├── usage/
│ │ │ ├── route.ts # GET /api/usage
│ │ │ └── co-usage/route.ts # GET /api/usage/co-usage
│ │ ├── metrics/route.ts # GET /api/metrics
│ │ ├── centrality/route.ts # GET /api/centrality
│ │ ├── export-import/route.ts # GET, POST
│ │ ├── import-markdown/route.ts # POST
│ │ └── capture/route.ts # POST /api/capture
│ ├── notes/[id]/page.tsx # Detalle de nota
│ ├── edit/[id]/page.tsx # Edición de nota
│ ├── new/page.tsx # Nueva nota
│ ├── capture/page.tsx # Confirmación de captura
│ ├── settings/page.tsx # Configuración
│ └── page.tsx # Dashboard (raíz)
├── components/
│ ├── ui/ # Componentes shadcn/ui
│ ├── dashboard.tsx # Dashboard inteligente
│ ├── note-form.tsx # Formulario de notas
│ ├── note-card.tsx # Tarjeta de nota
│ ├── note-list.tsx # Lista de notas (grid)
│ ├── keyboard-navigable-note-list.tsx # Lista con navegación teclado
│ ├── note-connections.tsx # Panel de conexiones
│ ├── related-notes.tsx # Notas relacionadas
│ ├── version-history.tsx # Historial de versiones
│ ├── search-bar.tsx # Búsqueda en tiempo real
│ ├── command-palette.tsx # Command palette (Ctrl+K)
│ ├── keyboard-shortcuts-dialog.tsx # Diálogo de atajos
│ ├── shortcuts-provider.tsx # Provider de atajos
│ ├── keyboard-hint.tsx # Hint de atajos
│ ├── work-mode-toggle.tsx # Toggle modo trabajo
│ ├── draft-recovery-banner.tsx # Banner de recuperación
│ ├── backup-restore-dialog.tsx # Restore con preview
│ ├── backup-list.tsx # Lista de backups
│ ├── bookmarklet-instructions.tsx # Instrucciones bookmarklet
│ ├── recent-context-list.tsx # Historial de navegación
│ ├── track-navigation-history.tsx # Tracking de historial
│ ├── preferences-panel.tsx # Panel de preferencias
│ ├── markdown-content.tsx # Contenido con highlight
│ ├── quick-add.tsx # Captura rápida
│ └── track-note-view.tsx # Tracking de vistas
├── hooks/
│ ├── use-global-shortcuts.ts # Atajos globales
│ ├── use-note-list-keyboard.ts # Navegación teclado
│ └── use-unsaved-changes.ts # Guard de cambios sin guardar
└── lib/
├── prisma.ts # Cliente Prisma
├── search.ts # Búsqueda con scoring
├── query-parser.ts # Parser de queries
├── related.ts # Notas relacionadas
├── backlinks.ts # Sistema de enlaces [[wiki]]
├── tags.ts # Normalización y sugerencias
├── usage.ts # Tracking de uso
├── metrics.ts # Métricas de dashboard
├── centrality.ts # Cálculo de centralidad
├── type-inference.ts # Detección automática de tipo
├── link-suggestions.ts # Sugerencias de enlaces
├── features.ts # Feature flags
├── validators.ts # Zod schemas
├── errors.ts # Manejo de errores
├── versions.ts # Historial de versiones
├── backup.ts # Snapshot de backup
├── backup-storage.ts # IndexedDB storage
├── backup-policy.ts # Política de retención
├── backup-validator.ts # Validación de backups
├── restore.ts # Restore de backups
├── drafts.ts # Borradores locales
├── work-mode.ts # Modo trabajo
├── navigation-history.ts # Historial de navegación
├── export-markdown.ts # Exportación Markdown
├── export-html.ts # Exportación HTML
├── import-markdown.ts # Importador Markdown
├── external-capture.ts # Captura externa
├── templates.ts # Templates por tipo
├── command-items.ts # Items de command palette
└── command-groups.ts # Grupos de comandos
Modelos de Datos (Prisma)
Note
model Note {
id String @id @default(cuid())
title String
content String
type String @default("note")
isFavorite Boolean @default(false)
isPinned Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
creationSource String @default("form")
}
NoteUsage
model NoteUsage {
id String @id @default(cuid())
noteId String
eventType String
query String?
createdAt DateTime @default(now())
}
NoteCoUsage
model NoteCoUsage {
id String @id @default(cuid())
fromNoteId String
toNoteId String
weight Int @default(1)
}
NoteVersion
model NoteVersion {
id String @id @default(cuid())
noteId String
title String
content String
createdAt DateTime @default(now())
}
Backlink
model Backlink {
sourceNoteId String
targetNoteId String
}
APIs REST
| Endpoint | Método | Descripción |
|---|---|---|
/api/notes |
GET, POST | Listar/crear notas |
/api/notes/[id] |
GET, PUT, DELETE | CRUD nota |
/api/notes/quick |
POST | Creación rápida |
/api/notes/links |
GET | Sugerencias de enlaces |
/api/notes/suggest |
GET | Sugerencias automática |
/api/notes/[id]/versions |
GET, POST | Versiones |
/api/notes/[id]/backlinks |
GET | Backlinks |
/api/search |
GET | Búsqueda avanzada |
/api/tags |
GET | Tags |
/api/tags/suggest |
GET | Sugerencias de tags |
/api/usage |
GET | Uso de notas |
/api/usage/co-usage |
GET | Co-uso entre notas |
/api/metrics |
GET | Métricas dashboard |
/api/centrality |
GET | Notas centrales |
/api/export-import |
GET, POST | Export/Import |
/api/import-markdown |
POST | Importar Markdown |
/api/capture |
POST | Captura externa |
Features Implementadas
MVP-1: Fundamentos
- CRUD completo de notas
- Sistema de tags
- Búsqueda básica
MVP-2: Captura Inteligente
- Búsqueda avanzada con scoring
- Quick Add con prefijos (cmd:, snip:, etc.)
- Backlinks con sintaxis wiki
- Formularios guiados por tipo
- Templates inteligentes por tipo
- Vista command con copiar
- Vista snippet con syntax highlight
- Checklist interactivo en procedure
MVP-3: Uso y Contexto
- Usage tracking (vistas, clics, copias)
- Dashboard inteligente
- Scoring boost basado en uso
- Sugerencias automáticas de tags
- Panel "Conectado con"
- Quick Add multilínea
- Pegado inteligente con detección de tipo
- Sugerencia automática de tipo
- Sugerencia de enlaces internos
- Registro de co-uso entre notas
- Métricas internas
- Cálculo de notas centrales
- Feature flags configurables
MVP-4: Query Parser y Navegación
- Query parser (
type:,tag:,is:favorite,is:pinned) - Búsqueda en tiempo real (300ms debounce)
- Navegación por teclado (↑↓ Enter ESC)
- Dropdown de resultados con cache
- Sidebar contextual con co-uso
- Historial de versiones
- Preload de notas en hover
MVP-5: Flujo Diario y Portabilidad
Sprint 1 - Confianza:
- Sistema de backup automático (IndexedDB)
- Política de retención (max 10 backups, 30 días)
- Restore con preview y validación
- Backup previo automático
- Guard de cambios sin guardar
Sprint 2 - Shortcuts Globales:
- Command Palette (Ctrl+K / Cmd+K)
- Shortcuts: g h, g n, n, /, ?
- Navegación de listas por teclado
Sprint 3 - Contexto y Continuidad:
- Sidebar contextual persistente
- Modo trabajo con toggle
- Autosave de borradores locales
- Historial de navegación contextual
Sprint 4 - Captura Ubicua:
- Bookmarklet para capturar desde web
- Página de confirmación
- Endpoint seguro con rate limiting
P2 - Exportación e Importación:
- Exportación Markdown con frontmatter
- Exportación HTML legible
- Importador Markdown mejorado
- Centro de respaldo en Settings
- Panel de preferencias
- Validaciones y límites
Algoritmos de Scoring
Búsqueda
score = baseScore + favoriteBoost(+2) + pinnedBoost(+1) + usageBoost
Notas Relacionadas
score = sameType(+3) + sharedTags(×3) + titleKeywords(max+3) + contentKeywords(max+2) + usageBoost
Centralidad
centrality = backlinks(×3) + outboundLinks(×1) + usageViews(×0.5) + coUsageWeight(×2)
Atajos de Teclado
| Atajo | Acción |
|---|---|
Ctrl+K / Cmd+K |
Command Palette |
g h |
Ir al Dashboard |
g n |
Ir a Notas |
n |
Nueva nota |
/ |
Enfocar búsqueda |
? |
Mostrar ayuda |
↑↓ |
Navegar listas |
Enter |
Abrir nota |
E |
Editar nota |
F |
Favoritar nota |
P |
Fijar nota |
Tipos de Nota
| Tipo | Descripción | Color |
|---|---|---|
note |
Nota general | Slate |
command |
Comando o snippet ejecutable | Green |
snippet |
Fragmento de código | Blue |
decision |
Decisión tomada | Purple |
recipe |
Receta o procedimiento | Orange |
procedure |
Procedimiento con checkboxes | Yellow |
inventory |
Inventario o lista | Gray |
Comandos npm
npm run dev # Desarrollo (Turbopack)
npm run build # Build producción
npm run start # Iniciar producción
npm test # Tests (Jest)
npx jest --watch # Tests en watch mode
npx prisma db push # Sync schema a BD
npx prisma studio # UI de base de datos
npx prisma generate # Generar tipos
Tests
226 tests organizados en:
__tests__/api.*.test.ts- Tests de integración de APIs__tests__/search.test.ts- Búsqueda y scoring__tests__/query-parser.test.ts- Parser de queries__tests__/related.test.ts- Notas relacionadas__tests__/backlinks.test.ts- Sistema de enlaces__tests__/tags.test.ts- Tags y sugerencias__tests__/usage.test.ts- Tracking de uso__tests__/versions.test.ts- Historial de versiones__tests__/dashboard.test.ts- Dashboard__tests__/command-items.test.ts- Command palette__tests__/external-capture.test.ts- Captura externa__tests__/navigation-history.test.ts- Historial__tests__/link-suggestions.test.ts- Sugerencias de enlaces__tests__/type-inference.test.ts- Inferencia de tipo__tests__/quick-add.test.ts- Quick Add
Feature Flags
Configurables via localStorage o .env:
FLAG_CENTRALITY=true # Habilitar centralidad
FLAG_PASSIVE_RECOMMENDATIONS=true # Recomendaciones pasivas
FLAG_TYPE_SUGGESTIONS=true # Sugerencias de tipo
FLAG_LINK_SUGGESTIONS=true # Sugerencias de enlaces
Límites del Sistema
| Recurso | Límite |
|---|---|
| Tamaño de backup | 50MB |
| Cantidad de notas | 10,000 |
| Longitud de título (captura) | 500 chars |
| Longitud de URL (captura) | 2000 chars |
| Longitud de selección (captura) | 10,000 chars |
| Backups retenidos | 10 máximo |
| Días de retención | 30 días |
Commits del Proyecto
33a4705 feat: MVP-4 P2 - Preload notes on hover
e66a678 feat: MVP-5 P2 - Export/Import, Settings, Tests y Validaciones
8d56f34 feat: MVP-5 Sprint 4 - External Capture via Bookmarklet
a40ab18 feat: MVP-5 Sprint 3 - Sidebar, Work Mode, and Drafts
cde0a14 feat: MVP-5 Sprint 2 - Command Palette and Global Shortcuts
8c80a12 feat: MVP-5 Sprint 1 - Backup/Restore system
6694bce mvp
af0910f feat: initial commit
f2e4706 Initial commit
Dependencias Principales
{
"next": "16.2.1",
"@prisma/client": "5.22.0",
"prisma": "5.22.0",
"sonner": "latest",
"zod": "latest",
"tailwindcss": "4.x",
"@radix-ui/react-*": "latest"
}
Patrones de Diseño
- Server Components para páginas estáticas
- Client Components para interactividad
- Hooks personalizados para lógica reutilizable
- Feature Flags para features opcionales
- IndexedDB para persistencia local de backups
- localStorage para preferencias y borradores
Estado de Implementación
| Feature | Estado |
|---|---|
| CRUD notas | ✅ |
| Tags | ✅ |
| Búsqueda avanzada | ✅ |
| Quick Add | ✅ |
| Backlinks wiki | ✅ |
| Usage tracking | ✅ |
| Dashboard inteligente | ✅ |
| Versiones de notas | ✅ |
| Command Palette | ✅ |
| Shortcuts globales | ✅ |
| Modo trabajo | ✅ |
| Backup/Restore | ✅ |
| Bookmarklet capture | ✅ |
| Export Markdown/HTML | ✅ |
| Import Markdown | ✅ |
| Settings completo | ✅ |
| Feature flags UI | ✅ |
| Tests | ✅ (226) |
| Preload on hover | ✅ |