- 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
432 lines
15 KiB
Markdown
432 lines
15 KiB
Markdown
# 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
|
||
```prisma
|
||
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
|
||
```prisma
|
||
model NoteUsage {
|
||
id String @id @default(cuid())
|
||
noteId String
|
||
eventType String
|
||
query String?
|
||
createdAt DateTime @default(now())
|
||
}
|
||
```
|
||
|
||
### NoteCoUsage
|
||
```prisma
|
||
model NoteCoUsage {
|
||
id String @id @default(cuid())
|
||
fromNoteId String
|
||
toNoteId String
|
||
weight Int @default(1)
|
||
}
|
||
```
|
||
|
||
### NoteVersion
|
||
```prisma
|
||
model NoteVersion {
|
||
id String @id @default(cuid())
|
||
noteId String
|
||
title String
|
||
content String
|
||
createdAt DateTime @default(now())
|
||
}
|
||
```
|
||
|
||
### Backlink
|
||
```prisma
|
||
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
|
||
- [x] CRUD completo de notas
|
||
- [x] Sistema de tags
|
||
- [x] Búsqueda básica
|
||
|
||
### MVP-2: Captura Inteligente
|
||
- [x] Búsqueda avanzada con scoring
|
||
- [x] Quick Add con prefijos (cmd:, snip:, etc.)
|
||
- [x] Backlinks con sintaxis [[wiki]]
|
||
- [x] Formularios guiados por tipo
|
||
- [x] Templates inteligentes por tipo
|
||
- [x] Vista command con copiar
|
||
- [x] Vista snippet con syntax highlight
|
||
- [x] Checklist interactivo en procedure
|
||
|
||
### MVP-3: Uso y Contexto
|
||
- [x] Usage tracking (vistas, clics, copias)
|
||
- [x] Dashboard inteligente
|
||
- [x] Scoring boost basado en uso
|
||
- [x] Sugerencias automáticas de tags
|
||
- [x] Panel "Conectado con"
|
||
- [x] Quick Add multilínea
|
||
- [x] Pegado inteligente con detección de tipo
|
||
- [x] Sugerencia automática de tipo
|
||
- [x] Sugerencia de enlaces internos
|
||
- [x] Registro de co-uso entre notas
|
||
- [x] Métricas internas
|
||
- [x] Cálculo de notas centrales
|
||
- [x] Feature flags configurables
|
||
|
||
### MVP-4: Query Parser y Navegación
|
||
- [x] Query parser (`type:`, `tag:`, `is:favorite`, `is:pinned`)
|
||
- [x] Búsqueda en tiempo real (300ms debounce)
|
||
- [x] Navegación por teclado (↑↓ Enter ESC)
|
||
- [x] Dropdown de resultados con cache
|
||
- [x] Sidebar contextual con co-uso
|
||
- [x] Historial de versiones
|
||
- [x] Preload de notas en hover
|
||
|
||
### MVP-5: Flujo Diario y Portabilidad
|
||
|
||
**Sprint 1 - Confianza:**
|
||
- [x] Sistema de backup automático (IndexedDB)
|
||
- [x] Política de retención (max 10 backups, 30 días)
|
||
- [x] Restore con preview y validación
|
||
- [x] Backup previo automático
|
||
- [x] Guard de cambios sin guardar
|
||
|
||
**Sprint 2 - Shortcuts Globales:**
|
||
- [x] Command Palette (Ctrl+K / Cmd+K)
|
||
- [x] Shortcuts: g h, g n, n, /, ?
|
||
- [x] Navegación de listas por teclado
|
||
|
||
**Sprint 3 - Contexto y Continuidad:**
|
||
- [x] Sidebar contextual persistente
|
||
- [x] Modo trabajo con toggle
|
||
- [x] Autosave de borradores locales
|
||
- [x] Historial de navegación contextual
|
||
|
||
**Sprint 4 - Captura Ubicua:**
|
||
- [x] Bookmarklet para capturar desde web
|
||
- [x] Página de confirmación
|
||
- [x] Endpoint seguro con rate limiting
|
||
|
||
**P2 - Exportación e Importación:**
|
||
- [x] Exportación Markdown con frontmatter
|
||
- [x] Exportación HTML legible
|
||
- [x] Importador Markdown mejorado
|
||
- [x] Centro de respaldo en Settings
|
||
- [x] Panel de preferencias
|
||
- [x] 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
|
||
|
||
```bash
|
||
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`:
|
||
|
||
```bash
|
||
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
|
||
|
||
```json
|
||
{
|
||
"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 | ✅ |
|