Files
recall/resumen/2026-03-22-2000-resumen.md
Daniel Arroyo ece8163d15 chore: Various improvements and CI setup
- 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
2026-03-23 22:25:36 -03:00

15 KiB
Raw Permalink Blame History

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())
}
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