feat: publication IA (magazine/brief/essay) + fixes critique
Some checks failed
CI / Lint, Unit Tests & Build (push) Failing after 1m22s
CI / Deploy production (on server) (push) Has been skipped

Publication IA:
- 4 templates (magazine, brief, essay, simple) avec CSS riche
- Rewrite IA (article/exercises/tutorial/reference/mixed)
- Modération avec timeout 12s + fallback safe
- Quotas publish_enhance par tier (basic=2, pro=15, business=100)
- Détection contenu stale (hash)
- Migration DB publishedContent/publishedTemplate/publishedSourceHash

Fixes:
- cheerio v1.2: Element -> AnyNode (domhandler), decodeEntities cast
- _isShared ajouté au type Note (champ virtuel serveur)
- callout colors PDF export: extraction fonction pure testable
- admin/published: guard note.userId null
- Cmd+S fonctionne en mode dialog (pas seulement fullPage)

i18n:
- 23 clés publish* traduites dans les 15 locales
- Extension Web Clipper: 13 locales mise à jour

Tests:
- callout-colors.test.ts (6 tests)
- note-visible-in-view.test.ts (5 tests)
- entitlements.test.ts + byok-entitlements.test.ts: mock usageLog + unstubAllEnvs
- 199/199 tests passent

Tracker: user-stories.md sync avec sprint-status.yaml
This commit is contained in:
Antigravity
2026-06-28 07:32:57 +00:00
parent 902fe95a69
commit 96e7902f01
169 changed files with 5382 additions and 1527 deletions

View File

@@ -91,7 +91,7 @@ Epic goal: B2B legal blockers for EU buyers. Cookie consent is the **first** Epi
### Cookie classification (implement exactly)
| Category | Examples in Momento | Consent required |
| Category | Examples in Memento | Consent required |
|----------|---------------------|------------------|
| **Strictly necessary** | NextAuth session, CSRF (if any), `user-language` cookie, theme/direction localStorage, consent record itself | No — always on |
| **Analytics** | Future PostHog/Umami/Plausible events, product funnel, feature flags tied to identity | Yes — opt-in |

View File

@@ -138,10 +138,10 @@ URL.revokeObjectURL(url)
### Thème PPTX
Cohérent avec l'identité visuelle Momento :
Cohérent avec l'identité visuelle Memento :
- `bg: F2F0E9` — fond papier
- `primary: 1C1C1C` — noir ardoise
- `accent: A47148` — brand-accent Momento
- `accent: A47148` — brand-accent Memento
- `secondary: D4A373` — ocre clair
### Fichiers clés existants

View File

@@ -39,7 +39,7 @@ Note TipTap (JSON) → Export Markdown → Re-import → JSON identique (byte-fo
**Inconvénients :**
- Certaines extensions sont sous licence TipTap Pro ($149/mois)
- Les nœuds custom de Momento (`liveBlock`, `structuredViewBlock`) nécessitent des serializers manuels
- Les nœuds custom de Memento (`liveBlock`, `structuredViewBlock`) nécessitent des serializers manuels
- Round-trip parfait impossible pour ces nœuds (dégradation gracieuse : placeholder HTML comment)
**Implémentation :**
@@ -104,7 +104,7 @@ import markdownit from 'markdown-it'
const momentoSerializer = new MarkdownSerializer(
{
...defaultMarkdownSerializer.nodes,
// Nœuds Momento custom
// Nœuds Memento custom
liveBlock: (state, node) => {
state.write(`<!-- live-block: ${node.attrs.sourceNoteId}#${node.attrs.blockId} -->`)
state.closeBlock(node)
@@ -148,7 +148,7 @@ Raisons :
1. Intégration en **1 journée** dans l'éditeur existant
2. Couvre 95% des cas d'usage (texte, listes, headings, code, tables, tâches)
3. Le `transformPastedText: true` résout aussi un bug UX courant (coller du Markdown brut)
4. Les nœuds Momento non-supportés sont préservés via commentaires HTML (dégradation gracieuse)
4. Les nœuds Memento non-supportés sont préservés via commentaires HTML (dégradation gracieuse)
### Long terme : **Option B** en complément
@@ -171,7 +171,7 @@ Pour les cas avancés (export propre des nœuds custom, CI de round-trip byte-fo
### Ce qui est exclu (post-beta)
- Round-trip byte-for-byte des nœuds Momento custom
- Round-trip byte-for-byte des nœuds Memento custom
- Édition native en mode source Markdown (raw text editor)
- Sync bidirectionnelle temps réel Markdown ↔ TipTap
@@ -197,7 +197,7 @@ Pour les cas avancés (export propre des nœuds custom, CI de round-trip byte-fo
**Then** je télécharge un fichier `.md` avec le contenu fidèlement sérialisé
**Given** je copie du Markdown depuis un éditeur externe
**When** je colle dans l'éditeur Momento
**When** je colle dans l'éditeur Memento
**Then** le Markdown est automatiquement converti en blocs TipTap correspondants (pas du texte brut)
**Given** j'importe un fichier `.md`

View File

@@ -9,11 +9,11 @@ inputDocuments:
- memento-note/docs/saas-deployment-prep.md
---
# Momento - Epic Breakdown
# Memento - Epic Breakdown
## Overview
This document provides the complete epic and story breakdown for Momento, focusing strictly on the **Commercial and AI Delta** required to launch the V3 product. Momento is a **Brownfield** project. The baseline functionality (Basic User Auth, Workspaces, CRUD Rich-Text Notes, pgvector database) already exists and is considered out-of-scope for these epics.
This document provides the complete epic and story breakdown for Memento, focusing strictly on the **Commercial and AI Delta** required to launch the V3 product. Memento is a **Brownfield** project. The baseline functionality (Basic User Auth, Workspaces, CRUD Rich-Text Notes, pgvector database) already exists and is considered out-of-scope for these epics.
## Requirements Inventory
@@ -223,7 +223,7 @@ So that I retain full control over my data privacy.
**Given** I trigger an AI feature that processes my notes or PDFs
**When** the request is initiated
**Then** (NFR-GDPR4) explicit consent is logged before the data leaves the Momento infrastructure.
**Then** (NFR-GDPR4) explicit consent is logged before the data leaves the Memento infrastructure.
### Story 4.5: EU Data Residency Configuration

View File

@@ -1,4 +1,4 @@
# Fonctionnalités IA — Momento
# Fonctionnalités IA — Memento
## Architecture

View File

@@ -1,6 +1,6 @@
# Guide utilisateur Momento
# Guide utilisateur Memento
Documentation produit illustrée du SaaS **Momento** — second cerveau augmenté par lIA (notes, recherche sémantique, agents, brainstorm collaboratif, BYOK).
Documentation produit illustrée du SaaS **Memento** — second cerveau augmenté par lIA (notes, recherche sémantique, agents, brainstorm collaboratif, BYOK).
> **Sources internes** : ce guide synthétise le [PRD](../prd.md), les [fonctionnalités IA](../fonctionnalites-ia.md), la [doc brainstorm](../../memento-note/docs/brainstorm-documentation.md) et le [GUIDE technique](../../GUIDE.md) (installation / admin).
@@ -24,7 +24,7 @@ Documentation produit illustrée du SaaS **Momento** — second cerveau augment
## 1. Vue densemble
Momento est une application de prise de notes qui combine :
Memento est une application de prise de notes qui combine :
- **Organisation** : carnets, labels, grille masonry, archive, corbeille, partage.
- **Recherche sémantique** : trouver par idée, pas seulement par mot-clé (vecteurs + plein texte).
@@ -72,7 +72,7 @@ La landing publique présente la proposition de valeur avant inscription.
![Landing — hero](screenshots/01-landing-hero.png)
Message clé : Momento relie, analyse et développe vos idées avec **6 types dagents IA** et une **recherche sémantique** avancée. Exemple produit : *Memory Echo* qui signale un lien avec un projet passé.
Message clé : Memento relie, analyse et développe vos idées avec **6 types dagents IA** et une **recherche sémantique** avancée. Exemple produit : *Memory Echo* qui signale un lien avec un projet passé.
### Capacités IA
@@ -111,7 +111,7 @@ Brainstorming radial temps réel : génération par vagues, collaboration (curse
![Landing — BYOK](screenshots/06-landing-byok.png)
Si vous avez déjà des clés **OpenAI**, **Anthropic** ou **Google**, vous les connectez à Momento : pas de plafond de crédits imposé par la plateforme, facturation directe chez le fournisseur, changement de provider en un clic.
Si vous avez déjà des clés **OpenAI**, **Anthropic** ou **Google**, vous les connectez à Memento : pas de plafond de crédits imposé par la plateforme, facturation directe chez le fournisseur, changement de provider en un clic.
---

View File

@@ -13,7 +13,7 @@ includedFiles:
# Implementation Readiness Assessment Report
**Date:** 2026-05-14
**Project:** Momento
**Project:** Memento
## PRD Analysis

View File

@@ -29,19 +29,19 @@ inputDocuments:
workflowType: 'prd'
---
# Product Requirements Document - Momento
# Product Requirements Document - Memento
**Author:** User
**Date:** 2026-05-14
## Executive Summary
Momento Note democratizes access to an AI-augmented digital memory for a dual audience: self-taught individuals and enterprise R&D departments. As a next-generation Personal Knowledge Management system, it transforms note-taking from passive storage into an active, intelligent partner. By integrating vector-based semantic search and an ecosystem of autonomous agents, Momento automatically surfaces hidden connections, remembers forgotten insights, and accelerates knowledge work.
Memento Note democratizes access to an AI-augmented digital memory for a dual audience: self-taught individuals and enterprise R&D departments. As a next-generation Personal Knowledge Management system, it transforms note-taking from passive storage into an active, intelligent partner. By integrating vector-based semantic search and an ecosystem of autonomous agents, Memento automatically surfaces hidden connections, remembers forgotten insights, and accelerates knowledge work.
### What Makes This Special
Momento's true power lies in its seamless blend of advanced AI tools and innovative financial architecture:
- **Autonomous Ecosystem:** Moving beyond a smart notepad, Momento acts as an autonomous "Second Brain." It deploys specialized agents (Scraper, Researcher, Monitor) and native productivity tools like Document Parsing (Chat-with-PDF) and Automated Task Extraction directly within the user's workspace.
Memento's true power lies in its seamless blend of advanced AI tools and innovative financial architecture:
- **Autonomous Ecosystem:** Moving beyond a smart notepad, Memento acts as an autonomous "Second Brain." It deploys specialized agents (Scraper, Researcher, Monitor) and native productivity tools like Document Parsing (Chat-with-PDF) and Automated Task Extraction directly within the user's workspace.
- **Collaborative Brainstorming:** A real-time, D3-powered radial graph canvas allows users to generate, expand, and structure AI-driven ideas collaboratively.
- **Sustainable "Host-Pays" Billing & BYOK:** Memento resolves the SaaS AI cost paradox through intelligent smart routing (defaulting to highly optimized models like DeepSeek V4 Flash) and a Bring-Your-Own-Key (BYOK) architecture that eliminates AI costs for power users. The innovative Freemium "AI Discovery Pack" provides lifetime access limits rather than restrictive monthly quotas, delivering an immediate "Aha!" moment without friction.
@@ -100,7 +100,7 @@ Momento's true power lies in its seamless blend of advanced AI tools and innovat
### 1. The Power User (BYOK & Autonomous Ecosystem)
**Persona:** Alex, an independent data science researcher analyzing dense PDFs, frustrated by arbitrary SaaS API limits.
**Opening Scene:** Alex discovers Momento through a watermark on a shared presentation. They sign up and are granted the Freemium "AI Discovery Pack."
**Opening Scene:** Alex discovers Memento through a watermark on a shared presentation. They sign up and are granted the Freemium "AI Discovery Pack."
**Rising Action:** Alex uploads a complex 50-page PDF and uses the Chat-with-PDF feature to extract methodologies. The AI's responses are rapid and accurate. Because Alex is doing heavy research, they quickly exhaust their Discovery Pack token limits.
**Climax (The "Aha!" Moment):** Instead of hitting a hard paywall that locks them out, Memento elegantly prompts them to input their own LLM API key (BYOK). Alex pastes their DeepSeek key, and instantly, they are back to querying at near-zero marginal cost, entirely avoiding a rigid $20/mo subscription.
**Resolution:** Alex fully adopts Memento as their "Second Brain", deploying autonomous Scraper agents to monitor new Arxiv papers directly into their semantic search index.
@@ -148,13 +148,13 @@ These journeys reveal the following critical capabilities we must build:
### Detected Innovation Areas
1. **Financial Architecture (The "Host-Pays" + BYOK Model):** Momento solves the SaaS AI unit economics paradox. By shifting all collaborative AI generation costs exclusively to the session host's quotas—while simultaneously offering a zero-margin Bring-Your-Own-Key (BYOK) escape hatch—the platform eliminates the traditional per-seat LLM paywall friction that stifles viral growth.
1. **Financial Architecture (The "Host-Pays" + BYOK Model):** Memento solves the SaaS AI unit economics paradox. By shifting all collaborative AI generation costs exclusively to the session host's quotas—while simultaneously offering a zero-margin Bring-Your-Own-Key (BYOK) escape hatch—the platform eliminates the traditional per-seat LLM paywall friction that stifles viral growth.
2. **Autonomous Agent Ecosystem Native to PKM:** Integrating Scraper, Researcher, and Monitor agents directly into the note environment. Instead of users manually pulling data into their notes, the "Second Brain" actively structures and retrieves knowledge via vector-based semantic search.
3. **Radial Graph-Based AI Brainstorming:** Moving away from linear chat interfaces (like standard ChatGPT) to a multi-directional, real-time D3 radial graph, where ideas expand outwards in "Waves" (Variations, Analogies, Disruptions).
### Market Context & Competitive Landscape
Traditional PKM tools (like Notion or Obsidian) either charge heavy flat-rate AI add-ons ($10-$20/mo) or require highly technical, fragile plugin setups for local models. Conversely, standard whiteboard tools (Miro, FigJam) offer AI generation but lack the deep semantic connection to a user's personal knowledge base. Momento occupies the blue ocean between an enterprise collaboration whiteboard and an autonomous research assistant.
Traditional PKM tools (like Notion or Obsidian) either charge heavy flat-rate AI add-ons ($10-$20/mo) or require highly technical, fragile plugin setups for local models. Conversely, standard whiteboard tools (Miro, FigJam) offer AI generation but lack the deep semantic connection to a user's personal knowledge base. Memento occupies the blue ocean between an enterprise collaboration whiteboard and an autonomous research assistant.
### Validation Approach
@@ -171,7 +171,7 @@ Traditional PKM tools (like Notion or Obsidian) either charge heavy flat-rate AI
## SaaS Web Application Specific Requirements
### Project-Type Overview
Momento is a B2B and B2C SaaS platform serving as a multi-tenant personal knowledge management system. It requires complex state synchronization, robust role-based access controls for collaborative sessions, and an advanced hybrid billing architecture.
Memento is a B2B and B2C SaaS platform serving as a multi-tenant personal knowledge management system. It requires complex state synchronization, robust role-based access controls for collaborative sessions, and an advanced hybrid billing architecture.
### Technical Architecture Considerations
- **Frontend:** React + Next.js App Router, using D3.js for the Brainstorm radial graph and React Query for state management.

View File

@@ -1,12 +1,12 @@
# Memento — Spécification Technique & Design du Système de Parrainage (Referral)
Ce document présente l'architecture complète d'un système de parrainage (referral) natif pour **Momento**, intégré à notre base de données PostgreSQL (Prisma) et à Stripe.
Ce document présente l'architecture complète d'un système de parrainage (referral) natif pour **Memento**, intégré à notre base de données PostgreSQL (Prisma) et à Stripe.
---
## 1. Objectifs du Système
1. **Viralité (PLG)** : Encourager les utilisateurs existants à partager Momento pour acquérir de nouveaux clients sans budget publicitaire (CAC proche de 0).
1. **Viralité (PLG)** : Encourager les utilisateurs existants à partager Memento pour acquérir de nouveaux clients sans budget publicitaire (CAC proche de 0).
2. **Double Récompense (Win-Win)** :
- **Le Filleul (Invité)** obtient une réduction immédiate lors de son premier abonnement (ex. `-10 % sur son abonnement PRO`).
- **Le Parrain (Hôte)** obtient une récompense lors du premier paiement de son filleul (ex. **1 mois gratuit** appliqué directement sur sa prochaine facture Stripe, ou **+100 crédits IA** récurrents).

View File

@@ -1,6 +1,6 @@
# generated: 2026-05-14T16:06:50Z
# last_updated: 2026-05-23T14:25:15Z
# project: Momento
# project: Memento
# project_key: NOKEY
# tracking_system: file-system
# story_location: docs
@@ -36,7 +36,7 @@
generated: 2026-05-14T16:06:50Z
last_updated: 2026-05-23T20:03:48Z
project: Momento
project: Memento
project_key: NOKEY
tracking_system: file-system
story_location: docs

View File

@@ -62,7 +62,7 @@ This story transforms the admin console into a **production-ready management das
- **When** I scroll below the metric cards
- **Then** I see a 7-day area chart showing daily AI requests (sourced from `UsageLog` grouped by `periodStart` day)
- **And** I see a user growth line chart (users created per day, last 30 days)
- **And** charts use Recharts (already a dependency — verify) with the Momento color palette:
- **And** charts use Recharts (already a dependency — verify) with the Memento color palette:
- Line/area: `#ACB995` (sage) or `#D4A373` (ochre)
- Grid: `border-border/40`
- Labels: `text-[11px] text-muted-foreground`
@@ -251,8 +251,8 @@ This story transforms the admin console into a **production-ready management das
| `app/(admin)/admin/usage/page.tsx` | Usage analytics page |
| `app/(admin)/admin/usage/usage-client.tsx` | Usage analytics client component (charts) |
| `components/admin/user-detail-drawer.tsx` | Slide-in user detail panel |
| `components/admin/charts/area-chart.tsx` | Recharts wrapper with Momento theme |
| `components/admin/charts/bar-chart.tsx` | Recharts wrapper with Momento theme |
| `components/admin/charts/area-chart.tsx` | Recharts wrapper with Memento theme |
| `components/admin/charts/bar-chart.tsx` | Recharts wrapper with Memento theme |
| `app/actions/admin-subscriptions.ts` | Server actions: getSubscriptions, cancelSubscription, getSubscriptionSummary |
| `app/actions/admin-usage.ts` | Server actions: getUsageAggregate, getUsageByFeature, getTopUsers, getDailyUsage |
| `app/actions/admin-feature-flags.ts` | Server actions: getFeatureFlags, createFeatureFlag, updateFeatureFlag, deleteFeatureFlag |

View File

@@ -14,7 +14,7 @@
### Problème actuel
Momento stocke **un seul vecteur par note** (`NoteEmbedding` dans `prisma/schema.prisma:366-374`). L'embedding est généré par `EmbeddingService.generateNoteEmbedding()` (`lib/ai/services/embedding.service.ts:43-63`) qui :
Memento stocke **un seul vecteur par note** (`NoteEmbedding` dans `prisma/schema.prisma:366-374`). L'embedding est généré par `EmbeddingService.generateNoteEmbedding()` (`lib/ai/services/embedding.service.ts:43-63`) qui :
1. Concatène titre + corps en plain text
2. Découpe en chunks de 6000 chars (`splitPlainTextForEmbeddingChunks`)
@@ -39,9 +39,9 @@ Inspiré d'AppFlowy (`flowy-ai/src/embeddings/document_indexer.rs`, `scheduler.r
4. **Rechercher au niveau fragment** avec agrégation par note → snippets précis en résultat
5. **Garder `NoteEmbedding` existant** pour rétro-compat (recherche globale, clustering)
### Comparaison AppFlowy → Momento
### Comparaison AppFlowy → Memento
| Aspect | AppFlowy (Rust) | Momento (TypeScript) |
| Aspect | AppFlowy (Rust) | Memento (TypeScript) |
|--------|-----------------|---------------------|
| Chunking | `text_splitter` crate, 1000 chars / 200 overlap | `lib/text/note-chunking.ts`, même valeurs |
| Hash | `xxhash64` (Rust) | `crypto.createHash('sha256')` (Node natif) |
@@ -79,7 +79,7 @@ model NoteEmbeddingChunk {
### Étapes de migration
1. **Dump DB obligatoire** : `bash /home/devparsa/dev/Momento/dump-db.sh` — vérifier ≥1Mo — « OUI » explicite utilisateur
1. **Dump DB obligatoire** : `bash /home/devparsa/dev/Memento/dump-db.sh` — vérifier ≥1Mo — « OUI » explicite utilisateur
2. `npx prisma migrate dev --name add_note_embedding_chunks`
3. Créer l'index HNSW sur la colonne `embedding` :
```sql
@@ -180,7 +180,7 @@ import PQueue from 'p-queue'
const chunkEmbeddingQueue = new PQueue({ concurrency: 4 })
```
> Si Momento passe multi-process (PM2 cluster), migrer vers Bull. Pour l'instant, single-process Next.js → `p-queue` suffit.
> Si Memento passe multi-process (PM2 cluster), migrer vers Bull. Pour l'instant, single-process Next.js → `p-queue` suffit.
---
@@ -756,6 +756,6 @@ class SemanticSearchService {
## Notes
- **Conservation de `NoteEmbedding`** : la table existante reste le source of truth pour le clustering (`clustering.service.ts`) et la recherche globale. Les chunks sont une **couche additive** qui améliore la précision, pas un remplacement.
- **AppFlowy utilise `nomic-embed-text` (768 dims, local via Ollama)**. Momento utilise `text-embedding-3-small` (1536 dims, OpenAI). La dimension est différente — le schéma `NoteEmbeddingChunk` doit spécifier `vector(1536)`.
- **AppFlowy utilise `nomic-embed-text` (768 dims, local via Ollama)**. Memento utilise `text-embedding-3-small` (1536 dims, OpenAI). La dimension est différente — le schéma `NoteEmbeddingChunk` doit spécifier `vector(1536)`.
- **Performance pgvector** : l'index HNSW est crucial pour les requêtes fragment-level. Sans index, un scan séquentiel sur des milliers de fragments serait prohibitif. L'index doit être créé dans la migration SQL brute.
- **Persan / RTL** : le chunking par paragraphes fonctionne indépendamment de la langue. Le split par fin de phrase (`؟ !。`) couvre les scripts RTL et CJK. Vérifier que les embeddings `text-embedding-3-small` gèrent bien le persan (déjà validé pour la recherche existante).

View File

@@ -10,12 +10,12 @@
## Context
L'éditeur de notes actuel de Momento est construit sur [rich-text-editor.tsx](file:///home/devparsa/dev/Momento/memento-note/components/rich-text-editor.tsx) avec Tiptap/ProseMirror. Bien qu'il supporte des fonctionnalités avancées (Blocs Vivants, Résonance Sémantique), l'interaction utilisateur de saisie reste celle d'un traitement de texte classique (document linéaire à curseur unique).
L'éditeur de notes actuel de Memento est construit sur [rich-text-editor.tsx](file:///home/devparsa/dev/Memento/memento-note/components/rich-text-editor.tsx) avec Tiptap/ProseMirror. Bien qu'il supporte des fonctionnalités avancées (Blocs Vivants, Résonance Sémantique), l'interaction utilisateur de saisie reste celle d'un traitement de texte classique (document linéaire à curseur unique).
Pour offrir une expérience de saisie supérieure à celle de Notion (plus performante, plus fluide à l'écriture) tout en conservant les avantages de la manipulation de blocs, nous implémentons une approche hybride :
1. **Gutter & Drag Handle Flottant :** Au lieu d'avoir un composant React lourd pour chaque paragraphe (comme dans Notion), un unique bouton de poignée de glissement suit le curseur de la souris dans la marge de l'éditeur en ProseMirror pur, éliminant tout décalage à la saisie.
2. **Transclusion au Collage :** Faciliter la création de Blocs Vivants en interceptant les liens de blocs copiés et en proposant de les coller en tant que transclusion synchrone.
3. **Bloc Database Inline :** Porter le composant de base de données relationnelle du prototype [ModernBlockNoteEditor.tsx](file:///home/devparsa/dev/Momento/architectural-grid1/src/components/ModernBlockNoteEditor.tsx#L1711) pour permettre aux utilisateurs d'insérer des tableaux/fiches interactives avec Rollups dynamiques directement au sein de leurs notes.
3. **Bloc Database Inline :** Porter le composant de base de données relationnelle du prototype [ModernBlockNoteEditor.tsx](file:///home/devparsa/dev/Memento/architectural-grid1/src/components/ModernBlockNoteEditor.tsx#L1711) pour permettre aux utilisateurs d'insérer des tableaux/fiches interactives avec Rollups dynamiques directement au sein de leurs notes.
---
@@ -27,7 +27,7 @@ Pour offrir une expérience de saisie supérieure à celle de Notion (plus perfo
**Afin de** pouvoir réordonner mes blocs par glisser-déposer de manière fluide.
#### Critères d'Acceptation :
* **Étant donné** que j'ai une note ouverte dans l'éditeur de Momento
* **Étant donné** que j'ai une note ouverte dans l'éditeur de Memento
* **Quand** je survole une ligne de texte (paragraphe, titre, liste, citation, etc.) avec mon curseur de souris
* **Alors** une poignée de glissement (`::drag-handle` flottante) apparaît dans le gutter gauche à la hauteur exacte du bloc survolé
* **Et** le bouton suit mes déplacements de souris d'un bloc à l'autre sans latence et sans dupliquer les nœuds DOM (une seule poignée réutilisée)
@@ -64,7 +64,7 @@ Pour offrir une expérience de saisie supérieure à celle de Notion (plus perfo
* **Quand** je colle (Ctrl+V ou Cmd+V) ce lien dans un paragraphe vide d'une autre note
* **Alors** un petit menu interactif en ligne s'affiche : *"Coller en tant que Bloc Connecté (Live)"* ou *"Coller en tant que texte / lien simple"*
* **Quand** je sélectionne *"Bloc Connecté"*,
* **Alors** le bloc ProseMirror est remplacé par un nœud de type `liveBlock` (provenant de notre [LiveBlockExtension](file:///home/devparsa/dev/Momento/memento-note/components/tiptap-live-block-extension.tsx#L159)) synchronisant le contenu en temps réel.
* **Alors** le bloc ProseMirror est remplacé par un nœud de type `liveBlock` (provenant de notre [LiveBlockExtension](file:///home/devparsa/dev/Memento/memento-note/components/tiptap-live-block-extension.tsx#L159)) synchronisant le contenu en temps réel.
---

View File

@@ -11,11 +11,11 @@
## Contexte
Momento dispose d'un moteur IA, d'un éditeur riche, de carnets, et d'un système de quotas. Mais aucun utilisateur nouveau n'est guidé vers l'expérience "Aha!" décrite dans le GTM :
Memento dispose d'un moteur IA, d'un éditeur riche, de carnets, et d'un système de quotas. Mais aucun utilisateur nouveau n'est guidé vers l'expérience "Aha!" décrite dans le GTM :
> *"Tapez une question. Retrouvez une note que vous aviez oubliée."*
Sans onboarding, le taux d'activation sera faible même avec un produit excellent. Un utilisateur qui arrive sur `/home` sans notes ne comprend pas ce que Momento fait. Le wizard doit :
Sans onboarding, le taux d'activation sera faible même avec un produit excellent. Un utilisateur qui arrive sur `/home` sans notes ne comprend pas ce que Memento fait. Le wizard doit :
1. Créer des **données de démo** (5 notes exemple dans sa langue) si l'utilisateur arrive avec un carnet vide
2. Guider vers la **Recherche Sémantique** en 2 clics (l'effet "Aha!")
@@ -60,12 +60,12 @@ model User {
### US-ONBOARDING-2 : Wizard 3 étapes
**En tant que** nouvel utilisateur,
**Je veux** un guide en 3 étapes courtes qui me montre la valeur de Momento,
**Je veux** un guide en 3 étapes courtes qui me montre la valeur de Memento,
**Afin de** comprendre pourquoi je devrais utiliser ce produit plutôt qu'un autre.
#### Étape 1 — "Bienvenue" (10 secondes)
- Titre : *"Votre mémoire augmentée par l'IA"*
- Sous-titre : *"Momento se souvient de ce que vous oubliez."*
- Sous-titre : *"Memento se souvient de ce que vous oubliez."*
- CTA : `"Commencer →"` + lien `"Passer l'intro"`
#### Étape 2 — "Vos notes" (30 secondes)
@@ -85,7 +85,7 @@ model User {
- FA : *"یادداشت‌های بهره‌وری"* (RTL)
- L'utilisateur clique sur Rechercher → les résultats apparaissent
- Afficher badge : `"✨ 1 recherche utilisée sur 30 (Starter Pack)"`
- CTA final : `"Je comprends — Explorer Momento"`
- CTA final : `"Je comprends — Explorer Memento"`
#### Critères d'acceptation généraux :
- Wizard rendu en overlay (`position: fixed`, z-index élevé) avec fond semi-transparent
@@ -177,7 +177,7 @@ model User {
{
"onboarding": {
"welcome_title": "Your AI-augmented memory",
"welcome_subtitle": "Momento remembers what you forget.",
"welcome_subtitle": "Memento remembers what you forget.",
"welcome_cta": "Get started",
"skip": "Skip intro",
"step_notes_title": "Your notes",
@@ -189,7 +189,7 @@ model User {
"step_aha_title": "Find what you forgot",
"step_aha_subtitle": "Type a question. Find a note you forgot.",
"step_aha_placeholder": "notes about productivity...",
"step_aha_cta": "Explore Momento",
"step_aha_cta": "Explore Memento",
"progress": "{current} of {total}"
},
"starterPack": {

View File

@@ -1,8 +1,8 @@
# Momento — Guide Stripe : Configuration, Architecture et Utilisation
# Memento — Guide Stripe : Configuration, Architecture et Utilisation
## Vue d'ensemble
Momento utilise **Stripe** pour la gestion des abonnements payants (Pro, Business, Enterprise). Le système repose sur :
Memento utilise **Stripe** pour la gestion des abonnements payants (Pro, Business, Enterprise). Le système repose sur :
- **Stripe Embedded Checkout** (modal dans l'app, sans redirection)
- **Webhooks** pour synchroniser l'état des abonnements en temps réel
@@ -86,11 +86,11 @@ Momento utilise **Stripe** pour la gestion des abonnements payants (Pro, Busines
Dans le **Stripe Dashboard****Produits** :
#### Produit 1 : Momento Pro
#### Produit 1 : Memento Pro
| Champ | Valeur |
|-------|--------|
| Nom | Momento Pro |
| Nom | Memento Pro |
| Description | Pour les consultants et créateurs exigeants |
Créer **2 prix** :
@@ -100,11 +100,11 @@ Créer **2 prix** :
| Pro Mensuel | 9,90 EUR | Tous les mois |
| Pro Annuel | 99 EUR | Tous les ans |
#### Produit 2 : Momento Business
#### Produit 2 : Memento Business
| Champ | Valeur |
|-------|--------|
| Nom | Momento Business |
| Nom | Memento Business |
| Description | Pour les équipes et chefs de produit |
Créer **2 prix** :
@@ -244,7 +244,7 @@ Utilisateur Frontend Backend
### 3.2 Webhook — Cycle de vie des abonnements
| Événement Stripe | Action Momento | Statut Prisma |
| Événement Stripe | Action Memento | Statut Prisma |
|------------------|---------------|---------------|
| `checkout.session.completed` | Upsert subscription avec tier/periode | `ACTIVE` |
| `customer.subscription.created` | Upsert (nouvelle souscription) | Selon Stripe |
@@ -454,7 +454,7 @@ Devise : EUR (configurable dans Stripe Dashboard pour multi-devises).
## 11. Bons de réduction & Codes de promotion (Coupons & Promo Codes)
Momento intègre le support natif et sécurisé de Stripe pour les codes promotionnels lors du paiement en Embedded Checkout via l'attribut `allow_promotion_codes: true` dans `/api/billing/create-checkout/route.ts`.
Memento intègre le support natif et sécurisé de Stripe pour les codes promotionnels lors du paiement en Embedded Checkout via l'attribut `allow_promotion_codes: true` dans `/api/billing/create-checkout/route.ts`.
### 11.1 Concepts Clés : Bon de réduction (Coupon) vs Code de promotion (Promo Code)
Dans Stripe, la gestion des remises se fait en deux niveaux :
@@ -477,7 +477,7 @@ Dans Stripe, la gestion des remises se fait en deux niveaux :
- Nombre d'utilisations max (ex: limité aux 100 premiers utilisateurs).
- Date limite de validité (ex: valable uniquement jusqu'au 31 décembre).
- Limiter aux clients n'ayant jamais payé.
- Restriction à des plans spécifiques (ex: restreindre ce code promo uniquement au produit `Momento Pro`).
- Restriction à des plans spécifiques (ex: restreindre ce code promo uniquement au produit `Memento Pro`).
5. Cliquez sur **Créer le bon de réduction**.
### 11.3 Comment désactiver ou supprimer un Code Promo

View File

@@ -1,7 +1,7 @@
# User Stories — Momento Next Phase
# User Stories — Memento Next Phase
> Basé sur l'analyse du prototype `architectural-grid/` et du code production `memento-note/`.
> Dernière mise à jour : 2026-05-29 (Epic 6 Croissance & Activation ajouté — analyse stratégique Mary/BMad)
> Dernière mise à jour : 2026-06-28 (Epic 6 terminé — sync avec sprint-status.yaml)
---
@@ -24,10 +24,12 @@
| **US-EDITOR-PERF** | Performance de frappe TipTap (quick wins) | ✅ **LIVRÉ** | `rich-text-editor.tsx` (useEditorState), `note-editor-context.tsx` (debounced setContent) |
| **US-EDITOR-UX** | Micro-interactions saisie (slash menu, sélection multi-blocs, paste étendu, placeholders) | ✅ **LIVRÉ** | Sélection globale, redesign Slash Menu (favoris/preview), placeholders contextuels, smart paste étendu, Turn Into & Undo/Redo |
| **US-EDITOR-MOBILE** | Expérience tactile & toolbar mobile adaptée | ✅ **LIVRÉ** | Toolbar fixe premium 44px, Bottom Sheet tactile (actions de bloc + IA), sélection facilitée de bloc |
| **US-EDITOR-MARKDOWN** | Rendu WYSIWYG Markdown fidèle (round-trip byte-for-byte) | **À FAIRE** | Brief : `docs/brief-markdown-roundtrip.md` |
| **US-ONBOARDING** | Wizard Activation — Effet "Aha!" Recherche Sémantique | 🆕 **À FAIRE** | Story : `docs/story-onboarding-activation.md` |
| **US-BRAINSTORM-FINALIZE** | Brainstorm Canvas D3 — Finalisation (export PPTX, gaps UX) | 🆕 **À FAIRE** | ~75% code existant (`brainstorm-page.tsx`, 14 routes API) |
| **US-CHAT-PDF** | Chat with PDF — RAG documentaire | 🆕 **À FAIRE** | |
| **US-EDITOR-MARKDOWN** | Rendu WYSIWYG Markdown fidèle (round-trip byte-for-byte) | **LIVRÉ** | Brief : `docs/brief-markdown-roundtrip.md` |
| **US-ONBOARDING** | Wizard Activation — Effet "Aha!" Recherche Sémantique | **LIVRÉ** | Story : `docs/story-onboarding-activation.md` |
| **US-BRAINSTORM-FINALIZE** | Brainstorm Canvas D3 — Finalisation (export PPTX, gaps UX) | **LIVRÉ** | `brainstorm-page.tsx`, 14 routes API |
| **US-CHAT-PDF** | Chat with PDF — RAG documentaire | **LIVRÉ** | `document-qa-overlay.tsx`, `document-ingestion`, `document-search` tool |
| **US-PPTX-EXPORT** | Export PPTX + Watermark | ✅ **LIVRÉ** | `lib/brainstorm/export-pptx.ts`, `lib/ai/tools/pptx.tool.ts` |
| **US-PUBLISH-IA** | Publication IA (templates magazine/brief/essay + rewrite) | ✅ **LIVRÉ** | `lib/publish/`, `publish-enhance.service.ts`, 4 templates CSS, quota `publish_enhance` |
---
@@ -119,7 +121,7 @@ Le prototype `SearchModal.tsx` est une refonte complète avec dual-panel, regex,
**Contexte :**
Le prototype contient `ClipperSimulator.tsx` (618 lignes) qui simule le clipping avec données mock. Il n'existe rien d'équivalent dans `memento-note`. La feature doit être réalisée en deux parties : une **extension Chrome/Firefox** et un **modal de réception** côté app.
**En tant qu'utilisateur**, je veux capturer n'importe quelle page web depuis mon navigateur et l'enregistrer dans Momento avec résumé IA, tags suggérés et choix du carnet — sans quitter le navigateur.
**En tant qu'utilisateur**, je veux capturer n'importe quelle page web depuis mon navigateur et l'enregistrer dans Memento avec résumé IA, tags suggérés et choix du carnet — sans quitter le navigateur.
**Critères d'acceptation :**
@@ -129,7 +131,7 @@ Le prototype contient `ClipperSimulator.tsx` (618 lignes) qui simule le clipping
- Bouton "Analyser avec IA" → appel `POST /api/clip/analyze` (URL + HTML content) → retourne `{ title, summary, tags[], readingTime }`
- Champ de sélection du carnet (dropdown hiérarchique, dernier carnet mémorisé)
- Aperçu du contenu clipé (150px scrollable)
- Bouton "Sauvegarder dans Momento" → appel `POST /api/clip/save` avec `{ url, title, content, summary, tags, notebookId }`
- Bouton "Sauvegarder dans Memento" → appel `POST /api/clip/save` avec `{ url, title, content, summary, tags, notebookId }`
- Feedback visuel : spinner → "Sauvegardé ✓" avec lien direct vers la note
### Route API `app/api/clip/analyze/route.ts` (nouvelle)
@@ -653,7 +655,7 @@ L'éditeur actuel est un document linéaire classique. Pour rivaliser avec Notio
> **Source recherche :** TipTap 2.5 (mai 2026), TipTap docs performance, PR #7828
**Contexte :**
Actuellement `rich-text-editor.tsx` utilise `immediatelyRender: false` mais pas `shouldRerenderOnTransaction` ni `useEditorState`. TipTap re-render le composant React à chaque transaction (frappe, déplacement curseur, sélection) — ce qui ajoute de la latence. Obsidian atteint <16ms de latence (local-first), Notion 50-150ms (cloud). Momento est local mais se comporte comme Notion à cause de ces re-renders inutiles.
Actuellement `rich-text-editor.tsx` utilise `immediatelyRender: false` mais pas `shouldRerenderOnTransaction` ni `useEditorState`. TipTap re-render le composant React à chaque transaction (frappe, déplacement curseur, sélection) — ce qui ajoute de la latence. Obsidian atteint <16ms de latence (local-first), Notion 50-150ms (cloud). Memento est local mais se comporte comme Notion à cause de ces re-renders inutiles.
**En tant qu'utilisateur**, je veux que la frappe dans l'éditeur soit instantanée, sans aucun décalage perceptible, même sur des notes longues avec de nombreux blocs.
@@ -711,7 +713,7 @@ const { isBold, isItalic, isHeading } = useEditorState({
> **Source recherche :** Mintlify "22 UX improvements" (mai 2026), BlockNote v0.50, BlockNote v0.49
**Contexte :**
Après les quick wins performance (US-EDITOR-PERF) et le drag handle (US-NEXTGEN-EDITOR), il reste des micro-interactions qui font la différence entre un éditeur "correct" et un éditeur "agréable". Mintlify a listé 22 améliorations UX en mai 2026 — voici les plus pertinentes pour Momento.
Après les quick wins performance (US-EDITOR-PERF) et le drag handle (US-NEXTGEN-EDITOR), il reste des micro-interactions qui font la différence entre un éditeur "correct" et un éditeur "agréable". Mintlify a listé 22 améliorations UX en mai 2026 — voici les plus pertinentes pour Memento.
**En tant qu'utilisateur**, je veux que chaque interaction courante (insérer un bloc, déplacer du contenu, transformer un format) soit fluide et intuitive, sans recourir à des raccourcis clavier obscurs.
@@ -802,7 +804,7 @@ L'éditeur fonctionne sur mobile mais l'expérience est dégradée : la bubble m
> **Source recherche :** Milkdown v7.20, "Human Markdown" extension VSCode, round-trip byte-for-byte
**Contexte :**
Momento stocke les notes en HTML (TipTap). Mais les notes de type `markdown` existent aussi. Le problème classique : éditer en riche et voir le Markdown reformatté intégralement (indentations changées, lignes vides supprimées, `##` convertis en soulignements). Milkdown (11k+ stars, ProseMirror + remark) résout ce problème avec un round-trip byte-for-byte.
Memento stocke les notes en HTML (TipTap). Mais les notes de type `markdown` existent aussi. Le problème classique : éditer en riche et voir le Markdown reformatté intégralement (indentations changées, lignes vides supprimées, `##` convertis en soulignements). Milkdown (11k+ stars, ProseMirror + remark) résout ce problème avec un round-trip byte-for-byte.
**En tant qu'utilisateur**, je veux que mes fichiers Markdown restent intacts quand je les édite en mode visuel — pas de diff parasite sur chaque modification.

View File

@@ -7,7 +7,7 @@ inputDocuments:
- memento-note/docs/saas-deployment-prep.md
---
# UX Design Specification Momento
# UX Design Specification Memento
**Author:** devparsa
**Date:** 2026-05-14