#!/usr/bin/env node /** * Script d'import des documents dans Memento * Utilise Prisma pour créer les notes */ import { PrismaClient } from '../keep-notes/prisma/client-generated/index.js'; const prisma = new PrismaClient({ datasources: { db: { url: 'file:/Users/sepehr/dev/Keep/keep-notes/prisma/dev.db' }, }, }); const documents = [ { title: '📘 Guide Utilisateur MCP', content: `Ce guide explique comment utiliser le serveur MCP Memento. ## Commandes disponibles (18 outils) ### Gestion des Notes • create_note - Créer une note • get_notes - Lister les notes • get_note - Obtenir une note par ID • update_note - Mettre à jour • delete_note - Supprimer • search_notes - Rechercher ### Gestion des Notebooks • create_notebook - Créer un notebook • get_notebooks - Lister • get_notebook - Obtenir par ID • update_notebook - Mettre à jour • delete_notebook - Supprimer ### Gestion des Labels • create_label - Créer un label • get_labels - Lister • delete_label - Supprimer ### Commandes AI • generate_title_suggestions • reformulate_text • generate_tags ## Exemple { "name": "create_note", "arguments": { "title": "Ma Note", "content": "..." } }`, color: 'blue', labels: ['mcp', 'documentation'], }, { title: '📁 Source Tree Analysis', content: `Analyse de l'arborescence du projet Keep. ## Structure keep/ ├── keep-notes/ # Next.js App ├── mcp-server/ # Serveur MCP └── docs/ # Documentation ## Technologies • Next.js 16 + React 19 • TypeScript 5 • Prisma ORM • SQLite • Tailwind CSS • MCP SDK 1.0.4 ## Points d'intégration • DB SQLite partagée • Protocole MCP • API REST • Intégration N8N`, color: 'green', labels: ['architecture', 'projet'], }, { title: '🎯 Project Overview', content: `Memento - Application de notes avec AI. ## Architecture • Pattern: JAMstack + App Router • Rendu: SSR + Streaming • DB: SQLite + Prisma • Auth: NextAuth.js ## Fonctionnalités • Notes texte & checklists • Couleurs personnalisables • Images et liens • Rappels récurrents • Format Markdown ## Organisation • Notebooks hiérarchiques • Labels et tags • Archivage • Épinglage ## AI & Intelligence • Recherche sémantique • Génération de titres • Reformulation • Memory Echo • Batch organize`, color: 'purple', labels: ['overview', 'memento'], }, { title: '🚀 Deployment Guide', content: `Guide de déploiement Memento. ## Prérequis • Node.js 20+ • npm • SQLite3 ## Installation keep-notes cd keep-notes npm install npx prisma generate npx prisma db push npm run dev ## Installation mcp-server cd mcp-server npm install export DATABASE_URL="file:..." npm run start:http ## Variables d'environnement DATABASE_URL NEXTAUTH_SECRET NEXTAUTH_URL PORT=4242 APP_BASE_URL ## Docker Dockerfile disponible pour containerisation.`, color: 'orange', labels: ['deployment', 'guide'], }, { title: '💻 Development Guide', content: `Guide développement keep-notes. ## Stack • Next.js 16 + React 19 • TypeScript 5 • Tailwind CSS • Radix UI • Framer Motion ## Structure app/ ├── (main)/ ├── api/ ├── layout.tsx globals.css components/ ├── ui/ ├── notes/ ├── notebooks/ lib/ ├── prisma.ts ├── auth.ts └── utils.ts ## Patterns Server Components (défaut) Client Components ('use client') Server Actions ('use server')`, color: 'teal', labels: ['development', 'guide'], }, { title: '🔌 Integration Architecture', content: `Architecture d'intégration. ## Communication keep-notes ◄──► SQLite DB ◄──► mcp-server ## Protocole MCP Client AI ──► MCP Server (4242) ──► SQLite ## Intégration N8N N8N Workflow ──► MCP Server ──► SQLite ## Flux de données 1. keep-notes → Server Action → Prisma → DB 2. MCP Request → Prisma → DB → Response 3. Temps réel via DB partagée`, color: 'blue', labels: ['architecture', 'integration'], }, { title: '📡 API Contracts Keep Notes', content: `API REST keep-notes. ## Base URL http://localhost:3000/api ## Endpoints Notes GET /api/notes POST /api/notes PUT /api/notes/:id DELETE /api/notes/:id ## AI Features POST /api/ai/title-suggestions POST /api/ai/tags POST /api/ai/reformulate ## Codes d'erreur 200 - Succès 400 - Requête invalide 401 - Non authentifié 404 - Non trouvé 500 - Erreur serveur`, color: 'yellow', labels: ['api', 'contracts'], }, { title: '🏗️ Architecture Keep Notes', content: `Architecture détaillée. ## Pattern JAMstack + App Router ## Flux UI → Server Action → Prisma → SQLite ## Server Components • Accès direct DB • Pas de JS client • SEO-friendly ## Client Components • Interactivité • useState/useEffect • APIs navigateur ## Server Actions 'use server' async function createNote() { await prisma.note.create({...}) }`, color: 'purple', labels: ['architecture', 'keep-notes'], }, { title: '🔍 Code Review Cleanup Report', content: `Rapport nettoyage code. ## Issues trouvées 57 fichiers avec code debug ## Routes à supprimer (14) /api/debug/* /api/test/route.ts ## Scripts à supprimer (8) check-*.js debug-*.js test-*.js ## Console statements (41) Nettoyer tous les console.log ## Checklist ☐ Routes debug ☐ Scripts debug ☐ Console.log ☐ Imports inutilisés ☐ TODO/FIXME ☐ Test build prod`, color: 'red', labels: ['cleanup', 'review'], }, { title: '🗄️ Data Models', content: `Modèles de données Prisma. ## User id, name, email, password, role Relations: notes[], notebooks[], labels[] ## Note id, title, content, color isPinned, isArchived, type JSON: checkItems, labels, images, links Relations: user, notebook ## Notebook id, name, icon, color, order Relations: user, notes[], labels[] ## Label id, name, color Relations: notebook ## Relations User 1:N Note User 1:N Notebook Notebook 1:N Note`, color: 'gray', labels: ['database', 'models'], }, { title: '🧩 Component Inventory', content: `Inventaire des composants. ## UI Components Button, Card, Dialog Input, Select, Checkbox ## Business Components NoteCard, NotebookItem LabelBadge, NoteEditor ## Layout Components Sidebar, Header, MainContent MasonryGrid, Tabs ## Hooks useNotes, useNotebooks useLabels, useSearch ## Utils formatDate, generateId parseContent, debounce`, color: 'teal', labels: ['components', 'inventory'], }, { title: '🔧 Architecture MCP Server', content: `Serveur MCP v3.1.0 ## Transport HTTP Streamable (port 4242) ## 37 Outils 12 Notes 6 Notebooks 4 Labels 11 AI 1 Reminders 3 API Keys ## Optimisations ✓ Connection pooling ✓ Batch operations ✓ API key caching (60s) ✓ Parallel queries ✓ Request timeout (10s) ## Fichiers index.js, index-sse.js tools.js, auth.js`, color: 'blue', labels: ['mcp', 'architecture'], }, { title: '📋 API Contracts MCP Server', content: `Contrats API MCP. ## Protocole MCP SDK 1.0.4 ## Transport Streamable HTTP ## URL http://localhost:4242/mcp ## Auth Headers: x-api-key ou x-user-id ## Réponse { "content": [{ "type": "text", "text": "..." }] } ## Erreurs McpError avec ErrorCode`, color: 'yellow', labels: ['api', 'mcp'], }, { title: '💰 Monetization Analysis', content: `Stratégies monétisation. ## Options ☕ Pay me a coffee ⭐ Freemium ☁️ Cloud Hosting 🤖 AI Credits 🏢 White-Label ## Plateformes Ko-fi (0% frais) Buy Me a Coffee GitHub Sponsors ## Revenus estimés Year 1: $200-500/mois Year 2: $1,000-2,000/mois ## Recommandé Ko-fi pour commencer`, color: 'green', labels: ['monetization', 'business'], }, { title: '📚 Index Documentation', content: `Table des matières. ## 15 Documents ### Architecture (5) • Source Tree Analysis • Project Overview • Integration Architecture • Architecture Keep Notes • Architecture MCP Server ### APIs (3) • API Contracts Keep Notes • API Contracts MCP Server • Data Models ### Guides (4) • Guide Utilisateur MCP • Deployment Guide • Development Guide • Component Inventory ### Rapports (3) • Code Review Cleanup • Monetization Analysis • MCP Optimization Report`, color: 'gray', labels: ['index', 'documentation'], }, { title: '⚡ MCP Optimization Report', content: `Rapport optimisation v3.1.0 ## Problèmes résolus ✓ N+1 queries ✓ Batch operations ✓ API key O(n) → O(1) ✓ HTTP timeouts ## Optimisations • Connection pooling • Parallel queries • Caching 60s TTL • Session cleanup ## Gains • 99% moins de requêtes • 80% plus rapide (import) • 95% lookup API keys ## Fichiers modifiés auth.js, tools.js index.js, index-sse.js`, color: 'purple', labels: ['optimization', 'mcp'], }, ]; async function importDocuments() { console.log('📝 Import des documents dans Memento...\n'); // Trouver ou créer le user let user = await prisma.user.findFirst(); if (!user) { console.log('❌ Aucun utilisateur trouvé dans la base'); process.exit(1); } // Trouver ou créer le notebook "Documentation" let notebook = await prisma.notebook.findFirst({ where: { name: 'Documentation' }, }); if (!notebook) { const highestOrder = await prisma.notebook.findFirst({ orderBy: { order: 'desc' }, select: { order: true }, }); notebook = await prisma.notebook.create({ data: { name: 'Documentation', icon: '📚', color: '#3B82F6', order: (highestOrder?.order ?? -1) + 1, userId: user.id, }, }); console.log('📁 Notebook "Documentation" créé\n'); } else { console.log('📁 Notebook "Documentation" trouvé\n'); } // Créer les notes let created = 0; let skipped = 0; for (const doc of documents) { // Vérifier si la note existe déjà const existing = await prisma.note.findFirst({ where: { title: doc.title, notebookId: notebook.id, }, }); if (existing) { console.log(`⏭️ Déjà existant: ${doc.title}`); skipped++; continue; } await prisma.note.create({ data: { title: doc.title, content: doc.content, color: doc.color, labels: JSON.stringify(doc.labels), notebookId: notebook.id, userId: user.id, type: 'text', isPinned: false, isArchived: false, }, }); console.log(`✅ Créé: ${doc.title}`); created++; } console.log(`\n📊 Résumé:`); console.log(` Créés: ${created}`); console.log(` Skippés: ${skipped}`); console.log(` Total: ${documents.length}`); console.log(`\n✨ Import terminé !`); } importDocuments() .catch(console.error) .finally(() => prisma.$disconnect());