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

@@ -575,7 +575,7 @@
"noNoteId": "No note ID"
},
"openAssistant": "打开AI助手",
"poweredByMomento": "由 Momento AI 提供支持",
"poweredByMomento": "由 Memento AI 提供支持",
"welcomeMsg": "你好我是你的AI助手。今天我能怎么帮你的笔记我可以优化语气、扩展内容或总结。",
"summaryLast5": "最近5条笔记摘要",
"analyzingProgress": "分析中...",
@@ -2184,7 +2184,30 @@
"importMarkdown": "导入 Markdown",
"markdownExportSuccess": "笔记已导出为 Markdown",
"markdownExportError": "笔记导出失败",
"markdownImportSuccess": "Markdown 导入成功"
"markdownImportSuccess": "Markdown 导入成功",
"publishTitle": "公开发布",
"publishDesc": "在此公开网址上发布笔记。持有链接的任何人都可以阅读。",
"publish": "发布",
"publishSuccess": "笔记已发布!",
"publishLive": "已上线",
"unpublish": "取消发布",
"unpublishSuccess": "笔记已取消发布",
"publishBlocked": "发布被拒绝",
"publishSimple": "按原样发布",
"publishSimpleHint": "免费 — 您的笔记内容保持不变",
"publishWithAi": "AI辅助发布",
"publishWithAiHint": "增强排版 · 剩余{count}积分",
"publishWithAiLocked": "Pro计划可用",
"publishWithAiGenerating": "正在生成排版…",
"publishTemplateMagazine": "杂志文章",
"publishTemplateBrief": "专家简报",
"publishTemplateEssay": "随笔",
"publishAiSuccess": "AI增强页面已发布",
"publishRewriteLabel": "为网页改写",
"publishRewriteOnHint": "将编辑器板块(练习、折叠区块、提示框)整理为网页格式 — AI仅撰写引言",
"publishRewriteOffHint": "保留您的原文AI仅添加编辑框架",
"copyPublicLink": "复制链接",
"openPublicPage": "打开公开页面"
},
"brainstorm": {
"title": "Waves of Thought",
@@ -2492,7 +2515,7 @@
"badge": "由人工智能驱动",
"title1": "你的第二大脑,",
"title2": "终于获得放大。",
"subtitle": "Momento 不只是笔记应用。它是一个智能生态,通过 6 类 AI 智能体与前沿语义搜索,实时连接、分析并延展你的想法。",
"subtitle": "Memento 不只是笔记应用。它是一个智能生态,通过 6 类 AI 智能体与前沿语义搜索,实时连接、分析并延展你的想法。",
"cta": "立即注册",
"secondary": "查看功能",
"memoryEcho": "Memory Echo",
@@ -2504,7 +2527,7 @@
"label": "AI 能力",
"title": "流畅的智能,",
"title2": "融入每一个字。",
"desc": "Momento 通过多提供商架构统筹你的想法。",
"desc": "Memento 通过多提供商架构统筹你的想法。",
"f1Title": "语义搜索",
"f1Desc": "别再只靠关键词搜索。按概念查找。混合 Vector + FTS 引擎理解笔记背后的意图。",
"f2Title": "上下文 RAG 对话",
@@ -2590,7 +2613,7 @@
"popular": "最受欢迎",
"basic": {
"name": "Basic",
"desc": "发现 Momento 的魅力。",
"desc": "发现 Memento 的魅力。",
"cta": "开始使用",
"feature0": "最多 100 条笔记",
"feature1": "3 个笔记本",
@@ -2636,7 +2659,7 @@
"byok": {
"label": "开放云技术",
"title": "BYOK 策略",
"desc": "已有 OpenAI、Anthropic 或 Google 的 API 密钥?直接接入 Momento。无强制额度限制只按所选提供商的实际消耗付费。",
"desc": "已有 OpenAI、Anthropic 或 Google 的 API 密钥?直接接入 Memento。无强制额度限制只按所选提供商的实际消耗付费。",
"noLockin": "无锁定",
"noLockinDesc": "一键切换提供商。",
"cost": "优化成本",
@@ -2646,8 +2669,8 @@
"cta": {
"title1": "准备好释放",
"title2": "你的全部潜能了吗?",
"desc": "加入数千名研究者、设计师与思考者,用 Momento 构建未来。",
"button": "启动 Momento"
"desc": "加入数千名研究者、设计师与思考者,用 Memento 构建未来。",
"button": "启动 Memento"
},
"footer": {
"desc": "AI 放大的第二大脑。为创意头脑而设计。",
@@ -2704,7 +2727,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."
@@ -2725,10 +2748,10 @@
"statusActive": "已启用",
"statusInactive": "未授予",
"helpAriaLabel": "AI 同意是什么意思?",
"helpTooltip": "Momento 不会出售您的数据。此同意仅在您触发 AI 操作时生效(标题、标签、聊天、改写)。未授予时,应用其余功能可正常使用。",
"helpTooltip": "Memento 不会出售您的数据。此同意仅在您触发 AI 操作时生效(标题、标签、聊天、改写)。未授予时,应用其余功能可正常使用。",
"whatItMeansTitle": "这意味着什么?",
"inactiveHint": "未授予同意时,仅 AI 功能不可用。您仍可正常创建、编辑和组织笔记。",
"noCommercialUse": "Momento 不会出售或商业化您的个人数据。",
"noCommercialUse": "Memento 不会出售或商业化您的个人数据。",
"affectedFeatures": "受影响功能标题建议、标签、AI 助手聊天、改写、Memory Echo 等。",
"dataPortabilityHint": "您可随时导出或删除全部数据(设置 → 数据)。",
"dataPortabilityLink": "导出我的数据",
@@ -2782,7 +2805,7 @@
},
"onboarding": {
"welcome_title": "您的AI增强记忆",
"welcome_subtitle": "Momento记住您忘记的事情。",
"welcome_subtitle": "Memento记住您忘记的事情。",
"welcome_cta": "开始",
"skip": "跳过",
"step_notes_title": "您的笔记",
@@ -2794,7 +2817,7 @@
"step_aha_title": "找到您忘记的内容",
"step_aha_subtitle": "提问。找到您遗忘的笔记。",
"step_aha_placeholder": "关于生产力的笔记...",
"step_aha_cta": "探索Momento",
"step_aha_cta": "探索Memento",
"progress": "{current}/{total}",
"creating_demo_notes": "正在创建示例笔记...",
"demo_notes_ready": "已创建5个示例笔记",
@@ -2898,4 +2921,4 @@
"copyRefNoNote": "Save the note before copying a block reference",
"copyRefUnsupported": "This block type cannot be referenced yet"
}
}
}