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": "Join the new era of smart note-taking.",
"forgot": "Forgot?",
"backToSite": "Back to site",
"privacyTerms": "© 2025 Momento Labs — Privacy · Terms"
"privacyTerms": "© 2025 Memento Labs — Privacy · Terms"
},
"sidebar": {
"notes": "Notes",
@@ -623,7 +623,7 @@
"noNoteId": "No note ID"
},
"openAssistant": "Open AI Note",
"poweredByMomento": "Powered by Momento AI",
"poweredByMomento": "Powered by Memento AI",
"welcomeMsg": "Hello! I'm your AI assistant. How can I help you with your notes today? I can help refine tone, expand messaging, or summarize content.",
"summaryLast5": "Summary of your last 5 notes",
"analyzingProgress": "Analyzing...",
@@ -808,7 +808,7 @@
"openInEditor": "Open in editor",
"badgeLabel": "Memory Echo",
"affinityBadge": "{percentage}% semantic affinity",
"intro": "Momento found another note on the same topic. Preview it, insert a citation, or merge — without leaving this one.",
"intro": "Memento found another note on the same topic. Preview it, insert a citation, or merge — without leaving this one.",
"detectedIn": "Passage found in: {title}",
"helpToggle": "How does this work?",
"helpTitle": "What can you do with this connection?",
@@ -895,12 +895,12 @@
"processingDetail": "Generating tags, semantic summary and embeddings.",
"successBadge": "Success",
"sentToNotebook": "Note saved to notebook",
"viewInMomento": "View in Momento",
"viewInMomento": "View in Memento",
"clipAnother": "Clip another page",
"captureFailed": "Capture failed",
"genericError": "Something went wrong while sending to your instance.",
"retry": "Retry",
"footer": "Momento Companion v2.1.2 · Secured HTTPS TLS 1.3",
"footer": "Memento Companion v2.1.2 · Secured HTTPS TLS 1.3",
"quitSimulator": "Close simulator",
"simulatorBadge": "Capture simulator",
"extensionActive": "Extension active on this page",
@@ -1726,6 +1726,7 @@
"featureBrainstormCreate": "Brainstorm creations",
"featureBrainstormSessions": "Brainstorm sessions",
"featureCharts": "AI Charts",
"featurePublishEnhance": "AI Publishing",
"featureBrainstormExpand": "Brainstorm expansions",
"featureBrainstormEnrich": "Brainstorm enrichments"
},
@@ -2534,7 +2535,7 @@
"imageModalLoadFailed": "Failed to load image",
"linkPlaceholder": "Paste or type a link...",
"noteLinkPickerTitle": "Link to another note",
"noteLinkPickerHint": "Pick a note. Momento inserts [[Title]] in the text and creates the link when you save.",
"noteLinkPickerHint": "Pick a note. Memento inserts [[Title]] in the text and creates the link when you save.",
"noteLinkPickerSearch": "Search notes…",
"noteLinkPickerEmpty": "No notes found. Check the title or create the target note first.",
"slashNoteLink": "Link to a note",
@@ -2582,6 +2583,21 @@
"unpublish": "Unpublish",
"unpublishSuccess": "Note unpublished",
"publishBlocked": "Publication refused",
"publishSimple": "Publish as-is",
"publishSimpleHint": "Free — your note content as-is",
"publishWithAi": "Publish with AI",
"publishWithAiHint": "Enhanced layout · {count} credits left",
"publishWithAiLocked": "Available on Pro plan",
"publishWithAiGenerating": "Generating layout…",
"publishTemplateMagazine": "Magazine article",
"publishTemplateBrief": "Expert brief",
"publishTemplateEssay": "Essay",
"publishAiSuccess": "AI-enhanced page published!",
"publishRewriteLabel": "Rewrite for the web",
"publishRewriteOnHint": "Structures your editor blocks (exercises, toggles, callouts) for the web — AI writes only the intro",
"publishRewriteOffHint": "Your original text is kept; AI only adds editorial framing",
"copyPublicLink": "Copy link",
"openPublicPage": "Open public page",
"slashSubPage": "Sub-page",
"slashSubPageDesc": "Create a linked note inside this note",
"slashCharts": "AI Charts",
@@ -3204,7 +3220,7 @@
"badge": "Powered by Artificial Intelligence",
"title1": "Your second brain,",
"title2": "finally amplified.",
"subtitle": "Momento is more than a note-taking app. It's an intelligent ecosystem that connects, analyzes and develops your ideas in real time with 6 types of AI agents and cutting-edge semantic search.",
"subtitle": "Memento is more than a note-taking app. It's an intelligent ecosystem that connects, analyzes and develops your ideas in real time with 6 types of AI agents and cutting-edge semantic search.",
"cta": "Sign up now",
"secondary": "See features",
"memoryEcho": "Memory Echo",
@@ -3216,7 +3232,7 @@
"label": "AI Capabilities",
"title": "Fluid intelligence,",
"title2": "woven into every word.",
"desc": "Momento orchestrates your ideas through a multi-provider architecture.",
"desc": "Memento orchestrates your ideas through a multi-provider architecture.",
"f1Title": "Semantic Search",
"f1Desc": "Stop searching by keywords. Find by concept. Our hybrid Vector + FTS engine understands the intent behind your notes.",
"f2Title": "Contextual RAG Chat",
@@ -3302,7 +3318,7 @@
"popular": "Most popular",
"basic": {
"name": "Basic",
"desc": "Discover the magic of Momento.",
"desc": "Discover the magic of Memento.",
"cta": "Get started",
"feature0": "100 Notes max",
"feature1": "3 Notebooks",
@@ -3348,7 +3364,7 @@
"byok": {
"label": "Open Cloud Technology",
"title": "The BYOK Strategy",
"desc": "Already have OpenAI, Anthropic or Google API keys? Connect them directly to Momento. Use AI without imposed credit limits, paying only what you actually consume from your favorite provider.",
"desc": "Already have OpenAI, Anthropic or Google API keys? Connect them directly to Memento. Use AI without imposed credit limits, paying only what you actually consume from your favorite provider.",
"noLockin": "No lock-in",
"noLockinDesc": "Switch providers in 1 click.",
"cost": "Optimized costs",
@@ -3358,8 +3374,8 @@
"cta": {
"title1": "Ready to unlock your",
"title2": "full potential?",
"desc": "Join thousands of researchers, designers and thinkers already using Momento to build their future.",
"button": "Launch Momento"
"desc": "Join thousands of researchers, designers and thinkers already using Memento to build their future.",
"button": "Launch Memento"
},
"footer": {
"desc": "The AI-amplified second brain. Designed for creative minds.",
@@ -3527,7 +3543,7 @@
"necessaryDesc": "These cookies are required to authenticate your session, save your language and theme preferences. They cannot be turned off.",
"alwaysOn": "Always On",
"analyticsTitle": "Anonymous Analytics",
"analyticsDesc": "Help us improve Momento by sending completely anonymous usage statistics. No personal data is ever tracked.",
"analyticsDesc": "Help us improve Memento by sending completely anonymous usage statistics. No personal data is ever tracked.",
"cancel": "Cancel",
"save": "Save Preferences",
"saved": "Preferences updated successfully."
@@ -3548,10 +3564,10 @@
"statusActive": "Active",
"statusInactive": "Not granted",
"helpAriaLabel": "What does AI consent mean?",
"helpTooltip": "Momento does not sell your data. This consent only applies when you trigger an AI action (titles, tags, chat, reformulation). Without it, the rest of the app works normally.",
"helpTooltip": "Memento does not sell your data. This consent only applies when you trigger an AI action (titles, tags, chat, reformulation). Without it, the rest of the app works normally.",
"whatItMeansTitle": "What does this mean?",
"inactiveHint": "Without consent, only AI-powered features are disabled. You can still create, edit, and organize notes as usual.",
"noCommercialUse": "Momento does not sell or monetize your personal data.",
"noCommercialUse": "Memento does not sell or monetize your personal data.",
"affectedFeatures": "AI features affected: title suggestions, tags, assistant chat, reformulation, Memory Echo, and similar tools.",
"dataPortabilityHint": "You can export or delete all your data at any time (Settings → Data).",
"dataPortabilityLink": "Export my data",
@@ -3681,7 +3697,7 @@
"localDbTitle": "Standalone Database",
"echoPopoverTitle": "Semantic Resonances 🔮",
"noEchoFound": "No semantic connections detected.",
"echoUpgradeText": "Convert this table to a notebook to activate Momento's neural analysis.",
"echoUpgradeText": "Convert this table to a notebook to activate Memento's neural analysis.",
"echoLoading": "Searching for semantic connections...",
"analyticsTitle": "Analytics & Insights",
"analyticsNoData": "No analysis data available.",
@@ -3737,7 +3753,7 @@
},
"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",
"step_notes_title": "Your notes",
@@ -3749,7 +3765,7 @@
"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}",
"creating_demo_notes": "Creating example notes...",
"demo_notes_ready": "5 example notes created!",
@@ -3872,7 +3888,8 @@
"studyPlanSuccess": "Plan created! Reminders have been added to your notes.",
"daysPlanned": "days planned",
"studyPlanReminders": "Reminders have been automatically added to your notes.",
"organizer": "Organize with AI",
"organizer": "Auto tags",
"autoTags": "Auto tags",
"organizerDesc": "AI analyzes your notes and suggests tags, groupings and duplicate detection.",
"analyze": "Analyze notebook",
"organizing": "Analyzing notes...",
@@ -3884,5 +3901,25 @@
"noSuggestions": "No suggestions — notebook looks well organized.",
"taskA": "Task A",
"taskB": "Task B"
},
"notebookSite": {
"title": "Publish notebook as website",
"shortTitle": "Website",
"howItWorks": "How it works",
"step1": "AI analyzes your notes and recommends which ones to publish",
"step2": "You confirm or adjust the selection",
"step3": "Your site is generated with navigation and table of contents",
"quotaWarning": "Analysis uses 1 AI credit.",
"analyzeBtn": "Analyze with AI",
"analyzing": "AI is analyzing your notes...",
"siteDescription": "Site description",
"notesSelected": "notes selected",
"template": "Visual style",
"publishBtn": "Publish site",
"publishing": "Generating site...",
"published": "Site published!",
"openSite": "Open site",
"updateSite": "Update site",
"unpublish": "Unpublish site"
}
}