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

@@ -38,7 +38,7 @@
"createYourSpaceSubtitle": "Rejoignez la nouvelle ère de la prise de notes intelligente.",
"forgot": "Oublié ?",
"backToSite": "Retour",
"privacyTerms": "© 2025 Momento Labs — Confidentialité · Conditions"
"privacyTerms": "© 2025 Memento Labs — Confidentialité · Conditions"
},
"sidebar": {
"notes": "Notes",
@@ -629,7 +629,7 @@
"noNoteId": "Aucun ID de note"
},
"openAssistant": "Ouvrir IA Note",
"poweredByMomento": "Propulsé par Momento AI",
"poweredByMomento": "Propulsé par Memento AI",
"welcomeMsg": "Bonjour ! Je suis votre assistant IA. Comment puis-je vous aider avec vos notes ? Je peux affiner le ton, développer un message ou résumer le contenu.",
"summaryLast5": "Résumé de vos 5 dernières notes",
"analyzingProgress": "Analyse en cours...",
@@ -814,7 +814,7 @@
"openInEditor": "Ouvrir dans l'éditeur",
"badgeLabel": "Memory Echo",
"affinityBadge": "{percentage} % d'affinité sémantique",
"intro": "Momento a repéré une autre note sur le même sujet. Consultez-la, insérez une citation ou fusionnez — sans quitter celle-ci.",
"intro": "Memento a repéré une autre note sur le même sujet. Consultez-la, insérez une citation ou fusionnez — sans quitter celle-ci.",
"detectedIn": "Passage repéré dans : {title}",
"helpToggle": "Comment ça marche ?",
"helpTitle": "Que faire avec cette connexion ?",
@@ -901,12 +901,12 @@
"processingDetail": "Génération automatique des tags, résumé sémantique et calcul des embeddings en cours.",
"successBadge": "Traitement réussi",
"sentToNotebook": "Note envoyée dans le carnet",
"viewInMomento": "Voir dans Momento",
"viewInMomento": "Voir dans Memento",
"clipAnother": "Clipper une autre page",
"captureFailed": "Échec de la capture",
"genericError": "Une erreur s'est produite lors de la transmission à votre instance.",
"retry": "Réessayer",
"footer": "Momento Companion v2.1.2 · Sécurisé HTTPS TLS 1.3",
"footer": "Memento Companion v2.1.2 · Sécurisé HTTPS TLS 1.3",
"quitSimulator": "Quitter le simulateur",
"simulatorBadge": "Simulateur de capture",
"extensionActive": "Extension active sur cette page",
@@ -1732,6 +1732,7 @@
"featureBrainstormCreate": "Créations brainstorm",
"featureBrainstormSessions": "Sessions brainstorm",
"featureCharts": "Graphiques IA",
"featurePublishEnhance": "Publication IA",
"featureBrainstormExpand": "Extensions brainstorm",
"featureBrainstormEnrich": "Enrichissements brainstorm"
},
@@ -2538,7 +2539,7 @@
"imageModalLoadFailed": "Échec du chargement de l'image",
"linkPlaceholder": "Collez ou tapez un lien...",
"noteLinkPickerTitle": "Lier à une autre note",
"noteLinkPickerHint": "Choisissez une note. Momento insère [[Titre]] dans le texte et crée le lien à l'enregistrement.",
"noteLinkPickerHint": "Choisissez une note. Memento insère [[Titre]] dans le texte et crée le lien à l'enregistrement.",
"noteLinkPickerSearch": "Rechercher une note…",
"noteLinkPickerEmpty": "Aucune note trouvée. Vérifiez le titre ou créez d'abord la note cible.",
"slashNoteLink": "Lien vers une note",
@@ -2586,6 +2587,21 @@
"unpublish": "Dépublier",
"unpublishSuccess": "Note dépubliée",
"publishBlocked": "Publication refusée",
"publishSimple": "Publier tel quel",
"publishSimpleHint": "Gratuit — le contenu de votre note",
"publishWithAi": "Publier avec l'IA",
"publishWithAiHint": "Mise en page soignée · {count} crédits restants",
"publishWithAiLocked": "Disponible avec le plan Pro",
"publishWithAiGenerating": "Génération de la mise en page…",
"publishTemplateMagazine": "Article magazine",
"publishTemplateBrief": "Fiche expert",
"publishTemplateEssay": "Essai",
"publishAiSuccess": "Page publiée avec mise en page IA !",
"publishRewriteLabel": "Reformuler pour le web",
"publishRewriteOnHint": "Structure vos blocs éditeur (exercices, toggles, encadrés) en page web — l'IA rédige seulement le chapô",
"publishRewriteOffHint": "Votre texte original est conservé ; l'IA ajoute seulement l'habillage éditorial",
"copyPublicLink": "Copier le lien",
"openPublicPage": "Ouvrir la page publique",
"slashSubPage": "Sous-page",
"slashSubPageDesc": "Créer une note liée dans cette note",
"slashCharts": "Graphiques IA",
@@ -3208,7 +3224,7 @@
"badge": "Augmenté par l'Intelligence Artificielle",
"title1": "Votre second cerveau,",
"title2": "enfin amplifié.",
"subtitle": "Momento n'est pas qu'une simple application de notes. C'est un écosystème intelligent qui connecte, analyse et développe vos idées en temps réel grâce à 6 types d'agents IA et une recherche sémantique de pointe.",
"subtitle": "Memento n'est pas qu'une simple application de notes. C'est un écosystème intelligent qui connecte, analyse et développe vos idées en temps réel grâce à 6 types d'agents IA et une recherche sémantique de pointe.",
"cta": "S'inscrire maintenant",
"secondary": "Voir les fonctionnalités",
"memoryEcho": "Memory Echo",
@@ -3220,7 +3236,7 @@
"label": "Capacités IA",
"title": "Une intelligence fluide,",
"title2": "intégrée à chaque mot.",
"desc": "Momento orchestre vos idées grâce à une architecture multi-fournisseurs.",
"desc": "Memento orchestre vos idées grâce à une architecture multi-fournisseurs.",
"f1Title": "Recherche Sémantique",
"f1Desc": "Ne cherchez plus par mots-clés. Trouvez par concept. Notre moteur hybride Vector + FTS comprend l'intention derrière vos notes.",
"f2Title": "Chat RAG Contextuel",
@@ -3306,7 +3322,7 @@
"popular": "Le plus populaire",
"basic": {
"name": "Basic",
"desc": "Pour découvrir la magie de Momento.",
"desc": "Pour découvrir la magie de Memento.",
"cta": "Commencer",
"feature0": "100 Notes max",
"feature1": "3 Carnets",
@@ -3352,7 +3368,7 @@
"byok": {
"label": "Technologie Cloud Ouverte",
"title": "La stratégie BYOK",
"desc": "Vous possédez déjà des clés API OpenAI, Anthropic ou Google ? Connectez-les directement à Momento. Utilisez l'IA sans limites de crédits imposées, en payant uniquement ce que vous consommez chez votre fournisseur favori.",
"desc": "Vous possédez déjà des clés API OpenAI, Anthropic ou Google ? Connectez-les directement à Memento. Utilisez l'IA sans limites de crédits imposées, en payant uniquement ce que vous consommez chez votre fournisseur favori.",
"noLockin": "Pas de lock-in",
"noLockinDesc": "Changez de fournisseur en 1 clic.",
"cost": "Coûts optimisés",
@@ -3362,8 +3378,8 @@
"cta": {
"title1": "Prêt à libérer votre",
"title2": "plein potentiel ?",
"desc": "Rejoignez des milliers de chercheurs, designers et penseurs qui utilisent déjà Momento pour construire leur futur.",
"button": "Lancer Momento"
"desc": "Rejoignez des milliers de chercheurs, designers et penseurs qui utilisent déjà Memento pour construire leur futur.",
"button": "Lancer Memento"
},
"footer": {
"desc": "Le second cerveau amplifié par l'IA. Pensé pour les esprits créatifs.",
@@ -3531,7 +3547,7 @@
"necessaryDesc": "Ces cookies sont requis pour authentifier votre session et enregistrer vos préférences de langue et de thème. Ils ne peuvent pas être désactivés.",
"alwaysOn": "Toujours Actifs",
"analyticsTitle": "Analyses Anonymes",
"analyticsDesc": "Aidez-nous à améliorer Momento en partageant des statistiques d'utilisation totalement anonymes. Aucune donnée personnelle n'est suivie.",
"analyticsDesc": "Aidez-nous à améliorer Memento en partageant des statistiques d'utilisation totalement anonymes. Aucune donnée personnelle n'est suivie.",
"cancel": "Annuler",
"save": "Enregistrer les préférences",
"saved": "Préférences mises à jour avec succès."
@@ -3552,10 +3568,10 @@
"statusActive": "Actif",
"statusInactive": "Non accordé",
"helpAriaLabel": "Que signifie le consentement IA ?",
"helpTooltip": "Momento ne vend pas vos données. Ce consentement ne sapplique que lorsque vous déclenchez une action IA (titres, étiquettes, chat, reformulation). Sans lui, le reste de lapplication fonctionne normalement.",
"helpTooltip": "Memento ne vend pas vos données. Ce consentement ne sapplique que lorsque vous déclenchez une action IA (titres, étiquettes, chat, reformulation). Sans lui, le reste de lapplication fonctionne normalement.",
"whatItMeansTitle": "Quest-ce que cela signifie ?",
"inactiveHint": "Sans consentement, seules les fonctions propulsées par lIA sont désactivées. Vous pouvez continuer à créer, modifier et organiser vos notes comme dhabitude.",
"noCommercialUse": "Momento ne vend ni ne monétise vos données personnelles.",
"noCommercialUse": "Memento ne vend ni ne monétise vos données personnelles.",
"affectedFeatures": "Fonctions concernées : suggestions de titres, étiquettes, assistant chat, reformulation, Memory Echo, etc.",
"dataPortabilityHint": "Vous pouvez exporter ou supprimer toutes vos données à tout moment (Paramètres → Données).",
"dataPortabilityLink": "Exporter mes données",
@@ -3685,7 +3701,7 @@
"localDbTitle": "Base de Données Autonome",
"echoPopoverTitle": "Résonance Sémantique 🔮",
"noEchoFound": "Aucune résonance sémantique détectée.",
"echoUpgradeText": "Convertissez ce tableau en carnet pour activer l'analyse neuronale de Momento.",
"echoUpgradeText": "Convertissez ce tableau en carnet pour activer l'analyse neuronale de Memento.",
"echoLoading": "Recherche de connexions sémantiques...",
"analyticsTitle": "Analyses & Insights",
"analyticsNoData": "Aucune donnée d'analyse disponible.",
@@ -3741,7 +3757,7 @@
},
"onboarding": {
"welcome_title": "Votre mémoire augmentée par l'IA",
"welcome_subtitle": "Momento se souvient de ce que vous oubliez.",
"welcome_subtitle": "Memento se souvient de ce que vous oubliez.",
"welcome_cta": "Commencer",
"skip": "Passer",
"step_notes_title": "Vos notes",
@@ -3753,7 +3769,7 @@
"step_aha_title": "Retrouvez ce que vous avez oublié",
"step_aha_subtitle": "Tapez une question. Retrouvez une note oubliée.",
"step_aha_placeholder": "notes sur ma productivité...",
"step_aha_cta": "Explorer Momento",
"step_aha_cta": "Explorer Memento",
"progress": "{current} sur {total}",
"creating_demo_notes": "Création des notes d'exemple...",
"demo_notes_ready": "5 notes d'exemple créées !",
@@ -3876,7 +3892,8 @@
"studyPlanSuccess": "Planning créé ! Des rappels ont été ajoutés à vos notes.",
"daysPlanned": "jours planifiés",
"studyPlanReminders": "Des rappels ont été ajoutés automatiquement à vos notes.",
"organizer": "Organiser avec l'IA",
"organizer": "Tags automatiques",
"autoTags": "Tags automatiques",
"organizerDesc": "L'IA analyse vos notes et propose tags, regroupements et détection de doublons.",
"analyze": "Analyser le carnet",
"organizing": "Analyse des notes en cours...",
@@ -3888,5 +3905,25 @@
"noSuggestions": "Aucune suggestion — le carnet semble bien organisé.",
"taskA": "Tâche A",
"taskB": "Tâche B"
},
"notebookSite": {
"title": "Publier le carnet en site web",
"shortTitle": "Site web",
"howItWorks": "Comment ça marche",
"step1": "L'IA analyse vos notes et recommande lesquelles publier",
"step2": "Vous validez ou modifiez la sélection",
"step3": "Votre site est généré avec navigation et table des matières",
"quotaWarning": "L'analyse consomme 1 crédit IA.",
"analyzeBtn": "Analyser avec l'IA",
"analyzing": "L'IA analyse vos notes...",
"siteDescription": "Description du site",
"notesSelected": "notes sélectionnées",
"template": "Style visuel",
"publishBtn": "Publier le site",
"publishing": "Génération du site...",
"published": "Site publié !",
"openSite": "Ouvrir le site",
"updateSite": "Mettre à jour le site",
"unpublish": "Dépublier le site"
}
}