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": "公開publication",
"publishDesc": "このートをパブリックURLで公開します。リンクを持つ誰でも読めるようになります。",
"publish": "公開する",
"publishSuccess": "ノートを公開しました!",
"publishLive": "公開中",
"unpublish": "公開取消",
"unpublishSuccess": "ノートを取り下げました",
"publishBlocked": "公開が拒否されました",
"publishSimple": "そのまま公開",
"publishSimpleHint": "無料 — ノートの内容を 그대로",
"publishWithAi": "AIで公開",
"publishWithAiHint": "強化レイアウト · 残り{count}クレジット",
"publishWithAiLocked": "Proプランで利用可能",
"publishWithAiGenerating": "レイアウトを生成中…",
"publishTemplateMagazine": "マガジン記事",
"publishTemplateBrief": "インテリジェントレポート",
"publishTemplateEssay": "エッセイ",
"publishAiSuccess": "AI強化ページを公開しました",
"publishRewriteLabel": "Web用にリライト",
"publishRewriteOnHint": "エディターのブロック演習、折りたたみセクション、コールアウトをWeb用に構成 — 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": "{total}中{current}",
"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"
}
}
}