Keep/_bmad-output/planning-artifacts/notebooks-contextual-labels-prd.md
sepehr 7fb486c9a4 feat: Complete internationalization and code cleanup
## Translation Files
- Add 11 new language files (es, de, pt, ru, zh, ja, ko, ar, hi, nl, pl)
- Add 100+ missing translation keys across all 15 languages
- New sections: notebook, pagination, ai.batchOrganization, ai.autoLabels
- Update nav section with workspace, quickAccess, myLibrary keys

## Component Updates
- Update 15+ components to use translation keys instead of hardcoded text
- Components: notebook dialogs, sidebar, header, note-input, ghost-tags, etc.
- Replace 80+ hardcoded English/French strings with t() calls
- Ensure consistent UI across all supported languages

## Code Quality
- Remove 77+ console.log statements from codebase
- Clean up API routes, components, hooks, and services
- Keep only essential error handling (no debugging logs)

## UI/UX Improvements
- Update Keep logo to yellow post-it style (from-yellow-400 to-amber-500)
- Change selection colors to #FEF3C6 (notebooks) and #EFB162 (nav items)
- Make "+" button permanently visible in notebooks section
- Fix grammar and syntax errors in multiple components

## Bug Fixes
- Fix JSON syntax errors in it.json, nl.json, pl.json, zh.json
- Fix syntax errors in notebook-suggestion-toast.tsx
- Fix syntax errors in use-auto-tagging.ts
- Fix syntax errors in paragraph-refactor.service.ts
- Fix duplicate "fusion" section in nl.json

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

Ou une version plus courte si vous préférez :

feat(i18n): Add 15 languages, remove logs, update UI components

- Create 11 new translation files (es, de, pt, ru, zh, ja, ko, ar, hi, nl, pl)
- Add 100+ translation keys: notebook, pagination, AI features
- Update 15+ components to use translations (80+ strings)
- Remove 77+ console.log statements from codebase
- Fix JSON syntax errors in 4 translation files
- Fix component syntax errors (toast, hooks, services)
- Update logo to yellow post-it style
- Change selection colors (#FEF3C6, #EFB162)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-11 22:26:13 +01:00

34 KiB

Product Requirements Document (PRD)

Notebooks & Labels Contextuels avec IA

Project: Keep (Memento Phase 1 MVP AI) Date: 2026-01-11 Author: Sally (UX Designer) + Ramez (Product Owner) Status: Draft - Ready for Architecture Priority: High - Core Feature Reorganization


📋 Executive Summary

Vision

Transformer l'organisation de Keep d'un système de tags plat en une structure de Notebooks avec Labels Contextuels, où chaque notebook a sa propre taxonomie de labels, permettant une organisation plus naturelle et contextuelle.

Objectifs Principaux

  1. Introduire les Notebooks comme organisation principale
  2. Rendre les Labels contextuels à chaque notebook
  3. Créer une Inbox ("Notes générales") pour les notes non organisées
  4. Intégrer l'IA intelligemment dans cette nouvelle structure
  5. Permettre une migration douce depuis le système actuel

🎯 User Stories

Primary Users

  • Ramez (Power User): Utilise Keep quotidiennement pour organiser voyage, travail, vie perso
  • Professionnel: Gère des projets avec des contextes différents
  • Voyageur: Organise ses préparatifs de voyage avec des notes spécifiques

User Journey Exemple

Scénario 1: Création de note dans Notebook

1. Ramez ouvre Keep, navigue vers Notebook "Voyage"
2. Il voit les labels contextuels: #hôtels, #vols, #restos
3. Il clique "Nouvelle note"
4. La note est automatiquement assignée au Notebook "Voyage"
5. Il peut tagger avec #hôtels (disponible car dans le bon contexte)

Scénario 2: Note rapide dans Inbox

1. Ramez a une idée rapide, ouvre Keep (page d'accueil)
2. Il tape son idée et sauve
3. La note va dans "Notes générales" (Inbox)
4. Plus tard, il la déplace vers "Notebook Perso"
5. Les labels de "Perso" deviennent disponibles

Scénario 3: Organisation IA-assistée

1. Ramez a 15 notes dans "Notes générales"
2. Il clique "Organiser avec l'IA"
3. L'IA analyse les notes et propose:
   - "3 notes pour Notebook Voyage"
   - "5 notes pour Notebook Travail"
   - "7 notes pour Notebook Perso"
4. Ramez valide les suggestions
5. Les notes sont déplacées automatiquement

🏗️ Structure de l'Organisation

Hiérarchie

KEEP
├─ 📥 Notes générales (Inbox)
│  └─ Notes sans notebook assigné
│  └─ PAS de labels (zone temporaire)
│
├─ 📚 Notebooks (ordonnés manuellement)
│  ├─ ✈️ Voyage
│  │  ├─ Labels: #hôtels, #vols, #restos, #à_visiter
│  │  └─ Notes assignées à "Voyage"
│  │
│  ├─ 💼 Travail
│  │  ├─ Labels: #réunions, #projets, #urgent, #à_faire
│  │  └─ Notes assignées à "Travail"
│  │
│  └─ 📖 Perso
│     ├─ Labels: #idées, #rêves, #objectifs, #réflexions
│     └─ Notes assignées à "Perso"
│
└─ [+] Nouveau Notebook

Règles Métier

R1: Appartenance des Notes

  • Une note appartient à UN seul notebook (ou aucune)
  • Les notes dans "Notes générales" n'appartiennent à aucun notebook
  • Une note ne peut être dans plusieurs notebooks simultanément

R2: Labels Contextuels

  • Chaque notebook a ses propres labels (100% isolés)
  • Les labels sont créés/supprimés au niveau notebook
  • Les notes dans "Notes générales" n'ont pas accès aux labels

R3: Ordre des Notebooks

  • Les notebooks sont ordonnés manuellement (drag & drop)
  • L'ordre est personnalisé par utilisateur
  • Drag & drop dans la sidebar pour réorganiser

R4: Vue "Notes générales"

  • Affiche SEULEMENT les notes sans notebook
  • PAS de vue "Toutes les notes" (tous notebooks confondus)
  • C'est une zone temporaire d'organisation

🎨 UX/UI Specifications

1. Navigation - Sidebar

┌─────────────────────────────────────┐
│  KEEP LOGO                          │
├─────────────────────────────────────┤
│  🔍 Search                          │
├─────────────────────────────────────┤
│  📚 NOTEBOOKS                       │
│  ┌───────────────────────────────┐  │
│  │ 📥 Notes générales (12)       │  │ ← Compteur de notes
│  │                                │  │
│  │ ✈️ Voyage (8)                 │  │ ← Notebook actif = highlight
│  │ ┌─ 🏷️ Labels contextuels     │  │
│  │ │  • #hôtels (3)             │  │ ← Labels seulement si actif
│  │ │  • #vols (2)               │  │
│  │ │  • #restos (3)             │  │
│  │ │  [+ Nouveau label]         │  │
│  │ └─────────────────────────────┘  │
│  │                                │  │
│  │ 💼 Travail (15)                │  │ ← Handles pour drag & drop
│  │ ║  ║                           │  │
│  │ 📖 Perso (23)                  │  │
│  │ ║  ║                           │  │
│  └───────────────────────────────┘  │
│                                    │
│  [+ Nouveau Notebook]              │
└─────────────────────────────────────┘

Comportements:

  • Click sur notebook → Navigue vers ce notebook
  • Drag & drop des notebooks → Réorganise l'ordre
  • Hover sur notebook → Affiche les labels contextuels
  • [+ Nouveau label] → Crée un label dans ce notebook
  • Compteurs → Montre le nombre de notes

2. Création de Note

Cas A: Depuis un Notebook

User dans "Voyage" → [Nouvelle note]
├─ Note créée avec notebookId = "voyage"
├─ Peut utiliser les labels de "Voyage"
└─ UI: Badge "Voyage" visible sur la note

Cas B: Depuis Notes Générales

User sur page d'accueil → [Nouvelle note]
├─ Note créée avec notebookId = null
├─ PAS de labels disponibles
└─ UI: Badge "À trier" visible

Cas C: Création dans un autre notebook

User dans "Voyage", veut créer pour "Travail"
├─ DOIT naviguer vers "Travail" d'abord
├─ OU utilise le raccourci clavier (ex: Ctrl+N → chooser)
└─ PAS de modal à chaque création

3. Déplacement de Notes (Option C: A + B)

Méthode A: Drag & Drop

┌─────────────────────────────────────┐
│  📝 Note à déplacer                 │
│  ┌───────────────────────────────┐  │
│  │ Grip handle │ Note content... │  │ ← Drag depuis ici
│  └───────────────────────────────┘  │
│         ↓                             │
│   Drop vers sidebar →                │
│  ┌───────────────────────────────┐  │
│  │ ✈️ Voyage [Drop zone]         │  │
│  │ 💼 Travail [Drop zone]        │  │
│  └───────────────────────────────┘  │
└─────────────────────────────────────┘

Méthode B: Menu Contextuel

Sur une note → Click droit → Menu:
├─ 📋 Copier
├─ ✏️ Modifier
├─ 📚 Déplacer vers...
│  ├─ 📥 Notes générales
│  ├─ ✈️ Voyage
│  ├─ 💼 Travail
│  └─ 📖 Perso
├─ 🏷️ Ajouter un label
├─ 📌 Épingler
└─ 🗑️ Supprimer

Validation:

  • Drag & drop vers notebook dans sidebar
  • Menu contextuel "Déplacer vers..."
  • Les deux méthodes disponibles

4. Labels Contextuels

Création de Label

Dans Notebook "Voyage":
┌─────────────────────────────────────┐
│  🏷️ Labels                          │
│  • #hôtels  • #vols  • #restos      │
│  [+ Nouveau label]                  │ ← Click
├─────────────────────────────────────┤
│  Modal:                             │
│  ┌───────────────────────────────┐  │
│  │ Nom du label:                 │  │
│  │ [___________]                 │  │
│  │                                │  │
│  │ Couleur: ○ 🟡 ○ 🔴 ○ 🔵       │  │
│  │                                │  │
│  │ [Annuler] [Créer]             │  │
│  └───────────────────────────────┘  │
└─────────────────────────────────────┘

Assignation de Label à Note

Note dans "Voyage" → Click "Ajouter label"
├─ Seuls les labels de "Voyage" sont proposés
├─ Dropdown avec checkboxes
└─ Multi-label possible sur une note

Exemple:
📝 Note: "Hôtel Tokyo Shibuya"
├─ Notebook: ✈️ Voyage
└─ Labels: #hôtels, #réservations

Suppression de Label

Options:
├─ Supprimer le label (du notebook)
│  └─ Warning: "Ce label sera retiré de X notes. Continuer?"
└─ Retirer des notes seulement
   └─ Label existe toujours, mais plus utilisé

5. Gestion des Notebooks

Création de Notebook

Click [+ Nouveau Notebook]
├─ Modal de création
│  ├─ Nom: "Voyage"
│  ├─ Icône: [Sélecteur d'emoji]
│  ├─ Couleur: [Sélecteur de couleur]
│  └─ [Créer]
└─ Notebook créé à la fin de la liste

Édition de Notebook

Click droit sur notebook → Menu:
├─ ✏️ Modifier
│  └─ Modal: Nom, Icône, Couleur
├─ 📊 Statistiques
│  ├─ Nombre de notes
│  ├─ Labels utilisés
│  └─ Dernière mise à jour
├─ 🗑️ Supprimer
│  └─ Warning: "Les notes seront déplacées vers Notes générales"
└─ ❌ Fermer

Réorganisation (Drag & Drop)

✈️ Voyage ║ ║ ← Drag handle
💼 Travail ║ ║
📖 Perso ║ ║

Drag "Travail" vers le haut → Réordonne

🤖 Intégration IA

C'est la partie CRUCIALE qui rend cette feature vraiment puissante.

IA1: Suggestion Automatique de Notebook

Scénario

User crée une note dans "Notes générales":
"Rendez-vous dermatologue mardi 15h à Paris"

IA analyse et suggère:
┌─────────────────────────────────────┐
│  💡 Suggestion IA                   │
│  ┌───────────────────────────────┐  │
│  │ Cette note semble appartenir  │  │
│  │ au notebook "Perso".          │  │
│  │                                │  │
│  │ [Ignorer] [Déplacer vers Perso]│  │
│  └───────────────────────────────┘  │
└─────────────────────────────────────┘

Prompt IA:

"Analyse cette note et suggère le notebook le plus approprié:
Note: {content}
Notebooks disponibles: {notebook_names_with_labels}

Réponds avec:
- notebook_suggéré: string
- confiance: 0-1
- raisonnement: string"

Déclencheurs:

  • Note créée dans "Notes générales"
  • Note modifiée significativement
  • 5+ secondes après la fin de frappe (pas en temps réel)

IA2: Suggestion de Labels Contextuels

Scénario

Note dans Notebook "Voyage":
"Hotel Shibuya Excel - 150€/nuit - Booking confirmé"

IA suggère:
┌─────────────────────────────────────┐
│  💡 Suggestions de labels           │
│  ┌───────────────────────────────┐  │
│  │ ✅ #hôtels (confiance: 95%)   │  │ ← Click pour assigner
│  │ ✅ #réservations (80%)        │  │
│  │ ✅ #tokyo (70%)               │  │
│  │                                │  │
│  │ [Tout sélectionner] [Ignorer] │  │
│  └───────────────────────────────┘  │
└─────────────────────────────────────┘

Prompt IA:

"Analyse cette note et suggère les labels appropriés:
Note: {content}
Notebook actuel: {notebook_name}
Labels disponibles dans ce notebook: {available_labels}

Réponds avec un tableau de:
- label: string (doit être dans {available_labels})
- confiance: 0-1
- raisonnement: string"

Comportement:

  • Maximum 3 suggestions
  • Seulement si confiance > 60%
  • Labels cliquables pour assignation en 1 clic
  • Ne pas déranger si l'utilisateur tape activement

IA3: Organisation Intelligente (Batch Processing)

Scénario

User a 20 notes dans "Notes générales"

Click "Organiser avec l'IA"
├─ IA analyse toutes les notes
├- Groupe par thématique
└─ Présente un plan d'organisation:

┌─────────────────────────────────────┐
│  📋 Plan d'organisation IA          │
│  ┌───────────────────────────────┐  │
│  │ Notebook: Voyage (5 notes)    │  │
│  │  • Hotel Tokyo...             │  │
│  │  • Vols JAL...                │  │
│  │  • Restaurant Shibuya...      │  │
│  │  [Tout sélectionner]          │  │
│  │                                │  │
│  │ Notebook: Travail (8 notes)   │  │
│  │  • Réunion lundi...           │  │
│  │  • Projet Alpha...            │  │
│  │  ...                          │  │
│  │                                │  │
│  │ Notebook: Perso (7 notes)     │  │
│  │  • Idées livre...             │  │
│  │  ...                          │  │
│  │                                │  │
│  │ [Annuler] [Appliquer tout]    │  │
│  └───────────────────────────────┘  │
└─────────────────────────────────────┘

Prompt IA:

"Analyse ces {count} notes et propose une organisation:
{notes_with_content}

Notebooks disponibles: {notebooks}

Pour chaque notebook, indique:
- notebook_cible: string
- notes: [{note_id, note_title, confidence, raison}]

Retourne un plan d'organisation optimisé."

Validation:

  • User peut désélectionner des notes
  • User peut ajuster les destinations
  • Confirmation avant application
  • Undo possible (Ctrl+Z)

IA4: Création Automatique de Labels

Scénario

Notebook "Voyage" devient peuplé de notes sur le Japon

IA détecte:
- 10+ notes mentionnant "Tokyo"
- 8+ notes mentionnant "Kyoto"
- 5+ notes mentionnant "Osaka"

IA suggère:
┌─────────────────────────────────────┐
│  💡 Suggestions de nouveaux labels │  │
│  ┌───────────────────────────────┐  │
│  │ J'ai détecté des thèmes récurrents│
│  │ dans vos notes. Créer des labels?│
│  │                                │  │
│  │ ✅ #tokyo (10 notes)          │  │
│  │ ✅ #kyoto (8 notes)           │  │
│  │ ✅ #osaka (5 notes)           │  │
│  │                                │  │
│  │ [Annuler] [Créer et assigner] │  │
│  └───────────────────────────────┘  │
└─────────────────────────────────────┘

Déclencheur:

  • Notebook atteint 15+ notes
  • IA détecte 3+ mots-clés récurrents (5+ fois chacun)
  • Ne propose PAS si les labels existent déjà

IA5: Recherche Sémantique par Notebook

Scénario

User dans Notebook "Voyage" tape:
"endroit pour dormir pas cher"

IA comprend le contexte "Voyage" et cherche:
├─ Semantic search DANS ce notebook seulement
├- Priorise les labels #hôtels, #auberges
└- Résultats plus pertinents car contextuels

Résultats:
┌─────────────────────────────────────┐
│  🔍 Résultats dans "Voyage"         │
│  ┌───────────────────────────────┐  │
│  │ 📝 Capsule Hotel Shinjuku     │  │
│  │    #hôtels #tokyo             │  │
│  │    "Hotel capsule 30€/nuit..." │  │
│  │    Correspondance: 87%         │  │
│  │                                │  │
│  │ 📝 Airbnb Asakusa              │  │
│  │    #hôtels #tokyo             │  │
│  │    "Appartement 45€/nuit..."   │  │
│  │    Correspondance: 82%         │  │
│  └───────────────────────────────┘  │
└─────────────────────────────────────┘

Avantage:

  • Recherche contextuelle au notebook
  • Résultats plus pertinents
  • Comprend le jargon spécifique (ex: "vol" dans Voyage vs Travail)

IA6: Synthèse par Notebook

Scénario

User clique "Résumer ce notebook" dans "Voyage"

IA génère:
┌─────────────────────────────────────┐
│  📊 Synthèse du Notebook Voyage     │
│  ┌───────────────────────────────┐  │
│  │ 🌍 Destinations               │  │
│  │  • Japon (Tokyo, Kyoto)       │  │
│  │  • France (Paris)             │  │
│  │                                │  │
│  │ 📅 Dates                       │  │
│  │  • 15-25 Mars 2024             │  │
│  │                                │  │
│  │ 🏨 Réservations                │  │
│  │  • 3 hôtels réservés          │  │
│  │  • 2 vols confirmés           │  │
│  │  • 5 restaurants identifiés   │  │
│  │                                │  │
│  │ 💰 Budget estimé: 3500€        │  │
│  │                                │  │
│  │ ⚠️ Actions requises            │  │
│  │  • Réserver visa japonais      │  │
│  │  • Confirmer assurance voyage  │  │
│  └───────────────────────────────┘  │
└─────────────────────────────────────┘

Prompt IA:

"Génère une synthèse structurée de ce notebook:
{notes_with_labels}

Inclus:
- Destinations/Thèmes principaux
- Dates importantes
- Éléments réservés vs planifiés
- Actions requises
- Statistiques (nombre de notes, labels utilisés)

Format: Markdown structuré avec emojis."

🗄️ Structure de Données (Database Schema)

Prisma Schema - Nouveaux Modèles

// Modèle Notebook
model Notebook {
  id          String   @id @default(cuid())
  name        String
  icon        String?  // Emoji: "✈️", "💼", "📖"
  color       String?  // Hex color: "#FF6B6B"
  order       Int      // Ordre manuel dans la sidebar
  userId      String
  user        User     @relation(fields: [userId], references: [id], onDelete: Cascade)
  notes       Note[]
  labels      Label[]
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt

  @@index([userId, order])
}

// Modèle Label MODIFIÉ - Ajout notebookId
model Label {
  id          String   @id @default(cuid())
  name        String
  color       String?  // Couleur du label
  notebookId  String   // NOUVEAU: Label appartient à un notebook
  notebook    Notebook @relation(fields: [notebookId], references: [id], onDelete: Cascade)
  notes       Note[]   // Relation many-to-many via NoteLabel
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt

  @@unique([notebookId, name]) // Un label est unique dans un notebook
  @@index([notebookId])
}

// Modèle Note MODIFIÉ - Ajout notebookId (optionnel)
model Note {
  id          String   @id @default(cuid())
  title       String?
  content     String
  // ... autres champs existants ...

  notebookId  String?  // NOUVEAU: Optionnel - null = dans "Notes générales"
  notebook    Notebook? @relation(fields: [notebookId], references: [id], onDelete: SetNull)

  // Garantir qu'une note est dans UN SEUL notebook
  @@index([userId, notebookId])
}

// Table de jonction Note-Label (existante mais gardée)
model NoteLabel {
  noteId      String
  labelId     String
  note        Note     @relation(fields: [noteId], references: [id], onDelete: Cascade)
  label       Label    @relation(fields: [labelId], references: [id], onDelete: Cascade)

  @@id([noteId, labelId])
  @@index([noteId])
  @@index([labelId])
}

Clés de la Structure

Règles d'intégrité:

  1. Note.notebookId est optionnel (null = Notes générales)
  2. Label.notebookId est obligatoire (labels TOUJOURS contextuels)
  3. @@unique([notebookId, name]) = Unicité des labels DANS un notebook
  4. onDelete: SetNull sur Note→Notebook = Si notebook supprimé, notes → Notes générales

Migration Schema

-- Étape 1: Ajouter les nouveaux modèles
CREATE TABLE "Notebook" (
  "id" TEXT NOT NULL PRIMARY KEY,
  "name" TEXT NOT NULL,
  "icon" TEXT,
  "color" TEXT,
  "order" INTEGER NOT NULL,
  "userId" TEXT NOT NULL,
  "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "updatedAt" DATETIME NOT NULL,
  FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE
);

-- Étape 2: Ajouter notebookId aux Notes (optionnel)
ALTER TABLE "Note" ADD COLUMN "notebookId" TEXT;
ALTER TABLE "Note" ADD FOREIGN KEY ("notebookId") REFERENCES "Notebook"("id") ON DELETE SET NULL ON UPDATE CASCADE;

-- Étape 3: Ajouter notebookId aux Labels (obligatoire)
ALTER TABLE "Label" ADD COLUMN "notebookId" TEXT NOT NULL DEFAULT 'TEMP_MIGRATION';
ALTER TABLE "Label" ADD FOREIGN KEY ("notebookId") REFERENCES "Notebook"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- Étape 4: Créer notebook par défaut pour la migration
INSERT INTO "Notebook" (id, name, icon, color, "order", "userId")
VALUES (
  'migration_default',
  'Labels existants',
  '📦',
  '#9CA3AF',
  999,
  {user_id}
);

-- Étape 5: Assigner tous les labels existants à ce notebook
UPDATE "Label" SET "notebookId" = 'migration_default' WHERE "notebookId" = 'TEMP_MIGRATION';

-- Étape 6: Laisser toutes les notes SANS notebook (Notes générales)
-- Rien à faire - notebookId est déjà NULL par défaut

-- Étape 7: Créer index pour performance
CREATE INDEX "Note_userId_notebookId_idx" ON "Note"("userId", "notebookId");
CREATE UNIQUE INDEX "Label_notebookId_name_key" ON "Label"("notebookId", "name");

🔄 Migration des Données Existantes

Stratégie de Migration

Phase 1: Pré-migration (Backend)

// app/actions/migration/prepare-notebooks.ts
'use server'

export async function prepareNotebookMigration() {
  const session = await auth()
  if (!session?.user?.id) throw new Error('Unauthorized')

  // 1. Créer notebook "Import" pour les labels existants
  const importNotebook = await prisma.notebook.create({
    data: {
      name: 'Labels existants',
      icon: '📦',
      color: '#9CA3AF',
      order: 999,
      userId: session.user.id
    }
  })

  // 2. Assigner TOUS les labels existants à ce notebook
  await prisma.label.updateMany({
    where: { userId: session.user.id },
    data: { notebookId: importNotebook.id }
  })

  // 3. Laisser les notes SANS notebook (Notes générales)
  // Rien à faire - notebookId est NULL par défaut

  return { success: true, importNotebookId: importNotebook.id }
}

Phase 2: Migration Interactive (User Journey)

┌─────────────────────────────────────────────────────────┐
│  🎉 Bienvenue dans les Notebooks !                      │
│                                                          │
│  Nous avons organisé vos étiquettes existantes dans     │
│  le notebook "Labels existants" pour ne rien perdre.   │
│                                                          │
│  📊 État actuel:                                        │
│  • 15 notes sans notebook (à organiser)                │
│  • 1 notebook "Labels existants"                        │
│  • 12 étiquettes préservées                             │
│                                                          │
│  Que voulez-vous faire ?                                │
│                                                          │
│  [1] Laisser l'IA organiser mes notes                   │
│  [2] Explorer et créer mes propres notebooks            │
│  [3] Tout déplacer vers "Notes générales"               │
│                                                          │
│  [Plus tard] Je déciderai plus tard                     │
└─────────────────────────────────────────────────────────┘

Phase 3: Organisation IA (Option 1)

Si user choisit "Laisser l'IA organiser":

// app/actions/migration/ai-organize.ts
'use server'

export async function organizeWithAI() {
  const session = await auth()
  const notesWithoutNotebook = await prisma.note.findMany({
    where: {
      userId: session.user.id,
      notebookId: null
    }
  })

  // IA analyse et propose des notebooks
  const suggestions = await aiService.suggestNotebooks(notesWithoutNotebook)

  return {
    success: true,
    suggestions: [
      {
        notebookName: 'Voyage',
        icon: '✈️',
        color: '#3B82F6',
        notes: [/* notes suggérées */],
        confidence: 0.89
      },
      {
        notebookName: 'Travail',
        icon: '💼',
        color: '#10B981',
        notes: [/* notes suggérées */],
        confidence: 0.92
      }
    ]
  }
}

Phase 4: Validation User

┌─────────────────────────────────────────────────────────┐
│  📋 Plan d'organisation proposé par l'IA               │
│                                                          │
│  ✈️ Voyage (5 notes) - Confiance: 89%                  │
│     ☑ Hotel Tokyo Shibuya                               │
│     ☑ Vols JAL Tokyo-Paris                              │
│     ☑ Restaurant Shibuya                                │
│     ☑ Visa japonais                                     │
│     ☑ Itinéraire Kyoto                                  │
│                                                          │
│  💼 Travail (8 notes) - Confiance: 92%                  │
│     ☑ Réunion lundi                                     │
│     ☑ Projet Alpha                                     │
│     ☑ ...                                               │
│                                                          │
│  📖 Perso (2 notes) - Confiance: 76%                    │
│     ☑ Idées livre                                       │
│     ☑ Objectifs 2024                                    │
│                                                          │
│  [Désélectionner] [Annuler] [Appliquer]                │
└─────────────────────────────────────────────────────────┘

🎯 Success Metrics

KPIs à Mesurer

Adoption:

  • % d'utilisateurs créant au moins 1 notebook dans les 30 jours
  • Nombre moyen de notebooks par utilisateur actif
  • % de notes organisées (avec notebook) vs notes générales

Engagement:

  • Temps passé par notebook (ex: Voyage plus actif avant un voyage)
  • Fréquence d'utilisation des labels contextuels
  • Taux d'utilisation des suggestions IA

Satisfaction:

  • NPS (Net Promoter Score) sur la feature notebooks
  • % d'utilisateurs gardant le système par défaut (Import) vs créant les leurs
  • Taux d'abandon lors de la migration

Performance IA:

  • Taux d'acceptation des suggestions IA (notebook)
  • Taux d'acceptation des suggestions IA (labels)
  • Précision des suggestions (feedback utilisateur)

🚀 Implementation Phases

Phase 1: MVP (Weeks 1-3)

Objectif: Structure de base sans IA

  • Database schema (Notebook, Label modifié, Note modifié)
  • API endpoints (CRUD notebooks)
  • UI: Sidebar avec notebooks
  • UI: Création/édition de notebooks
  • UI: Assignation de notebook aux notes
  • UI: Labels contextuels (affichage)
  • UI: Drag & drop des notebooks
  • Migration: Notebook "Import" par défaut
  • PAS d'IA encore

Phase 2: IA Features (Weeks 4-5)

Objectif: IA pour organisation intelligente

  • IA1: Suggestion automatique de notebook
  • IA2: Suggestion de labels contextuels
  • IA3: Organisation batch (Notes générales → Notebooks)
  • UI: Modals de suggestions IA
  • Feedback loop (accepter/rejeter suggestions)

Phase 3: Advanced IA (Weeks 6-7)

Objectif: Features IA avancées

  • IA4: Création automatique de labels
  • IA5: Recherche sémantique contextuelle
  • IA6: Synthèse par notebook
  • Analytics: Dashboard d'utilisation des notebooks

Phase 4: Polish & Testing (Week 8)

Objectif: Finalisation et tests

  • Playwright E2E tests
  • Performance optimization
  • Accessibility audit
  • Beta testing avec users
  • Documentation

🚨 Risques & Mitigations

Risque 1: Résistance au changement

Description: Users habitués aux tags globaux pourraient rejeter les notebooks

Mitigation:

  • Phase de migration douce (optionnel)
  • Mode hybride temporaire (garder vue tags pendant transition)
  • Tutoriels interactifs
  • Onboarding progressif

Risque 2: Performance IA

Description: Suggestions IA pourraient être lentes ou inexactes

Mitigation:

  • Cache des suggestions (24h)
  • Seuils de confiance minimums (>60%)
  • Feedback loop pour améliorer le modèle
  • Fallback rapide si IA timeout

Risque 3: Migration des données

Description: Perte de données ou organisation pendant la migration

Mitigation:

  • Backup automatique avant migration
  • Migration par défaut (notebook "Import")
  • Possibilité de revenir en arrière (rollback)
  • Tests exhaustifs de migration

Risque 4: Complexité UX

Description: Trop de clics pour organiser les notes

Mitigation:

  • Drag & drop intuitif
  • Raccourcis clavier
  • IA pour automatiser l'organisation
  • Mesures d'usabilité (clics, temps)

Risque 5: Labels contextuels = perte de flexibilité

Description: Users ne peuvent plus utiliser un label global (#urgent partout)

Mitigation:

  • Éduquer: "Urgent" peut être recréé dans chaque notebook
  • IA suggère de recréer les labels importants
  • Option: Labels "favoris" synchronisés (feature future)

📚 Glossaire

  • Notebook: Collection de notes sur un thème (ex: Voyage, Travail)
  • Labels Contextuels: Tags spécifiques à un notebook (ex: #hôtels dans Voyage)
  • Inbox / Notes générales: Zone temporaire pour les notes non organisées
  • IA: Intelligence Artificielle (OpenAI ou Ollama)
  • Suggestion IA: Proposition automatique basée sur l'analyse du contenu
  • Drag & Drop: Action de glisser-déposer pour déplacer des éléments
  • Migration: Transition du système de tags vers les notebooks
  • Notebook par défaut: Notebook créé automatiquement pour préserver les tags existants

📝 Notes pour l'Architecture Team

Points Critiques à Implémenter

  1. Database:

    • Note.notebookId est OPTIONNEL (null = Notes générales)
    • Label.notebookId est OBLIGATOIRE
    • Contrainte d'unicité: @@unique([notebookId, name])
  2. API:

    • Nouveau endpoint: /api/notebooks (CRUD complet)
    • Endpoint modifié: /api/labels (filtre par notebook)
    • Endpoint modifié: /api/notes (filtre par notebook)
  3. UI Components:

    • SidebarNotebooks: Liste des notebooks avec drag & drop
    • NotebookSelector: Dropdown pour choisir le notebook
    • ContextualLabels: Labels filtrés par notebook actif
    • AISuggestions: Modals pour les suggestions IA
  4. IA Services:

    • NotebookSuggestionService: IA pour suggérer un notebook
    • LabelSuggestionService: IA pour suggérer des labels
    • BatchOrganizationService: IA pour organiser en lot
    • AutoLabelCreationService: IA pour créer des labels
  5. Performance:

    • Index sur Note.userId + Note.notebookId
    • Cache des suggestions IA (Redis ou in-memory)
    • Virtual scrolling pour les notebooks avec 100+ notes

Checklist de Validation

Avant de passer en développement, confirmer:

  • Ramez valide l'UX décrite dans ce document
  • L'Architecture Team a revu le schéma DB
  • L'équipe IA a validé les prompts proposés
  • Les risques sont acceptables et des mitigations sont en place
  • Le plan de migration est testé sur un dataset de test
  • Les mesures de succès (KPIs) sont définies et traçables
  • Le wireframe UI est validé par Ramez
  • L'implémentation est planifiée sur 8 semaines max

Status: PRD COMPLET - Prêt pour Architecture et Wireframes

Next Steps:

  1. Créer les wireframes UX (Option XW)
  2. Définir l'architecture technique
  3. Commencer Phase 1 (MVP)

Document créé par Sally (UX Designer) avec Ramez (Product Owner) Date: 2026-01-11 Version: 1.0 - Final