@tomako/tools-runtime 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/src/components/tools/engine/package-widget-runtime.tsx +5 -1
- package/src/components/tools/engine/task-recovery.test.ts +65 -0
- package/src/components/tools/engine/task-recovery.ts +109 -0
- package/src/components/tools/engine/use-legacy-llm-task.ts +16 -3
- package/src/components/tools/engine/use-tool-task.ts +77 -53
- package/src/features/tools/app-store-screenshot-generator/widget/app-store-screenshot-generator.tsx +88 -16
- package/src/features/tools/app-store-screenshot-generator/widget/asset-slots.test.ts +52 -0
- package/src/features/tools/app-store-screenshot-generator/widget/asset-slots.ts +3 -2
- package/src/features/tools/app-store-screenshot-generator/widget/generation.test.ts +126 -0
- package/src/features/tools/app-store-screenshot-generator/widget/generation.ts +52 -14
- package/src/features/tools/app-store-screenshot-generator/widget/input-media.test.ts +81 -0
- package/src/features/tools/app-store-screenshot-generator/widget/input-media.ts +20 -8
- package/src/features/tools/cold-start-channel-selector/widget/cold-start-channel-selector.tsx +45 -16
- package/src/features/tools/competitor-analysis/competitor-analysis.container.tsx +26 -20
- package/src/features/tools/competitor-analysis/widget/competitor-analysis.tsx +47 -16
- package/src/features/tools/disclaimer-generator/disclaimer-generator.package.ts +3 -3
- package/src/features/tools/email-template-generator/widget/email-template-generator.tsx +37 -4
- package/src/features/tools/package/to-tool-module.ts +15 -0
- package/src/features/tools/product-name-generator/widget/product-name-generator.tsx +60 -27
- package/src/features/tools/product-poster-generator/widget/constants.ts +3 -1
- package/src/features/tools/product-poster-generator/widget/helpers.test.ts +51 -0
- package/src/features/tools/product-poster-generator/widget/helpers.ts +27 -0
- package/src/features/tools/product-poster-generator/widget/product-poster-generator.tsx +112 -12
- package/src/features/tools/slogan-generator/slogan-generator.package.ts +28 -28
- package/src/i18n/messages/en/tools/app-icon-resizer.ts +1 -1
- package/src/i18n/messages/en/tools/app-store-screenshot-generator.ts +2 -2
- package/src/i18n/messages/en/tools/cold-start-channel-selector.ts +4 -4
- package/src/i18n/messages/en/tools/competitor-analysis.ts +9 -8
- package/src/i18n/messages/en/tools/email-template-generator.ts +10 -10
- package/src/i18n/messages/en/tools/product-poster-generator.ts +1 -0
- package/src/i18n/messages/zh/tools/app-store-screenshot-generator.ts +3 -3
- package/src/i18n/messages/zh/tools/cold-start-channel-selector.ts +2 -2
- package/src/i18n/messages/zh/tools/competitor-analysis.ts +10 -9
- package/src/i18n/messages/zh/tools/email-template-generator.ts +11 -11
- package/src/i18n/messages/zh/tools/product-poster-generator.ts +1 -0
- package/src/i18n/messages/zh-tw/tools/app-store-screenshot-generator.ts +44 -44
- package/src/i18n/messages/zh-tw/tools/cold-start-channel-selector.ts +105 -105
- package/src/i18n/messages/zh-tw/tools/competitor-analysis.ts +41 -40
- package/src/i18n/messages/zh-tw/tools/email-template-generator.ts +111 -111
- package/src/i18n/messages/zh-tw/tools/product-name-generator.ts +92 -92
- package/src/i18n/messages/zh-tw/tools/product-poster-generator.ts +74 -73
- package/src/i18n/messages/zh-tw/tools/twitter-gif-downloader.ts +47 -47
- package/src/lib/tools/cold-start-channel-selector-schema.test.ts +39 -0
- package/src/lib/tools/cold-start-channel-selector-schema.ts +8 -4
- package/src/lib/tools/competitor-analysis-schema.test.ts +69 -0
- package/src/lib/tools/competitor-analysis-schema.ts +53 -5
|
@@ -6,7 +6,7 @@ import type { ToolPackage } from "../package/types";
|
|
|
6
6
|
* Slogan Generator(direct 车道)。
|
|
7
7
|
* 证据:docs/seo-keyword-briefs/slogan-generator.md(slogan generator 12,100/mo LOW + 竞品拆解)。
|
|
8
8
|
* 反超点(相对 logo.com / ahrefs / shopify / copy.ai / grammarly):
|
|
9
|
-
*
|
|
9
|
+
* 登录后在页面内直出;每条候选带风格标签 + why-it-works 理由(ahrefs 只有裸文本);
|
|
10
10
|
* 一次 10 条覆盖多风格;输出附挑选/测试建议;支持可选品牌名生成 name-based slogan。
|
|
11
11
|
* scene "slogan_generator" 需在 168 compose 的 LLM_DIRECT_ALLOWED_SCENES 白名单内。
|
|
12
12
|
*/
|
|
@@ -41,12 +41,12 @@ export const sloganGeneratorPackage: ToolPackage = {
|
|
|
41
41
|
},
|
|
42
42
|
},
|
|
43
43
|
copy: {
|
|
44
|
-
title: { en: "Slogan Generator", zh: "Slogan 广告语生成器", "zh-tw": "Slogan
|
|
44
|
+
title: { en: "AI Slogan Generator for Business", zh: "AI Slogan 广告语生成器", "zh-tw": "AI Slogan 廣告語產生器" },
|
|
45
45
|
description: {
|
|
46
|
-
en: "
|
|
47
|
-
zh: "
|
|
46
|
+
en: "Describe your business and get 10 AI slogan and tagline ideas across distinct styles, each with a why-it-works note. Sign in to generate and compare the full set.",
|
|
47
|
+
zh: "描述你的业务,一次生成 10 条 Slogan 和 tagline 候选,覆盖大胆、极简、俏皮、利益导向等多种风格,每条附风格标签和入选理由。登录后可在本页生成并比较完整结果。",
|
|
48
48
|
"zh-tw":
|
|
49
|
-
"
|
|
49
|
+
"描述你的業務,一次產生 10 條 Slogan 和 tagline 候選,涵蓋大膽、極簡、俏皮、利益導向等多種風格,每條附風格標籤和入選理由。登入後可在本頁產生並比較完整結果。",
|
|
50
50
|
},
|
|
51
51
|
intro: {
|
|
52
52
|
en: "A good slogan is 3-6 words that carry your brand promise. Instead of staring at a blank page or paying an agency, describe what you do and compare structured candidates side by side — with reasons, not just word salad.",
|
|
@@ -60,9 +60,9 @@ export const sloganGeneratorPackage: ToolPackage = {
|
|
|
60
60
|
"zh-tw": "品牌工具",
|
|
61
61
|
},
|
|
62
62
|
keywords: {
|
|
63
|
-
en: ["slogan generator", "slogan creator", "slogan maker", "
|
|
64
|
-
zh: ["slogan 生成器", "slogan 制作", "广告语生成器", "品牌口号生成", "tagline 生成器", "
|
|
65
|
-
"zh-tw": ["slogan
|
|
63
|
+
en: ["slogan generator", "slogan creator", "slogan maker", "ai slogan generator", "tagline generator", "business slogan generator"],
|
|
64
|
+
zh: ["slogan 生成器", "slogan 制作", "广告语生成器", "品牌口号生成", "tagline 生成器", "AI 广告语"],
|
|
65
|
+
"zh-tw": ["slogan 產生器", "slogan 製作", "廣告語產生器", "品牌口號產生", "tagline 產生器", "AI 廣告語"],
|
|
66
66
|
},
|
|
67
67
|
inputSignal: {
|
|
68
68
|
en: "One-sentence business description + optional brand name",
|
|
@@ -214,13 +214,13 @@ Quality requirements:
|
|
|
214
214
|
zh: "一句说清业务就够了。品牌名、目标人群和风格方向会让候选更贴合。",
|
|
215
215
|
"zh-tw": "一句說清業務就夠了。品牌名、目標人群和風格方向會讓候選更貼合。",
|
|
216
216
|
},
|
|
217
|
-
submitLabel: { en: "Generate 10 slogans", zh: "生成 10 条 Slogan", "zh-tw": "
|
|
217
|
+
submitLabel: { en: "Generate 10 slogans", zh: "生成 10 条 Slogan", "zh-tw": "產生 10 條 Slogan" },
|
|
218
218
|
resultTitle: { en: "Compare your candidates", zh: "横向比较候选", "zh-tw": "橫向比較候選" },
|
|
219
|
-
pendingTitle: { en: "Writing your slogans", zh: "正在生成 Slogan", "zh-tw": "
|
|
219
|
+
pendingTitle: { en: "Writing your slogans", zh: "正在生成 Slogan", "zh-tw": "正在產生 Slogan" },
|
|
220
220
|
pendingHint: {
|
|
221
221
|
en: "Usually takes 15-30 seconds. Candidates across multiple styles are being written and annotated.",
|
|
222
222
|
zh: "通常需要 15-30 秒。正在生成多风格候选并为每条写入选理由。",
|
|
223
|
-
"zh-tw": "通常需要 15-30
|
|
223
|
+
"zh-tw": "通常需要 15-30 秒。正在產生多風格候選,並為每條寫入入選理由。",
|
|
224
224
|
},
|
|
225
225
|
errorOverrides: {
|
|
226
226
|
validation: {
|
|
@@ -236,16 +236,16 @@ Quality requirements:
|
|
|
236
236
|
page: {
|
|
237
237
|
workspace: {
|
|
238
238
|
heading: {
|
|
239
|
-
en: "
|
|
240
|
-
zh: "
|
|
241
|
-
"zh-tw": "
|
|
239
|
+
en: "AI slogan generator: 10 ideas worth comparing",
|
|
240
|
+
zh: "AI Slogan 生成器:一次拿到 10 条值得比较的候选",
|
|
241
|
+
"zh-tw": "AI Slogan 產生器:一次取得 10 條值得比較的候選",
|
|
242
242
|
},
|
|
243
243
|
hint: {
|
|
244
244
|
en: "Describe the business in one or two sentences, optionally add the brand name and audience. You get 10 candidates across multiple styles, each with a style tag and a note on why the line works — ready to shortlist, test, and refine.",
|
|
245
245
|
zh: "用一两句话描述业务,可选填品牌名和目标人群。你会得到覆盖多种风格的 10 条候选,每条带风格标签和入选理由——直接进入筛选、测试和打磨。",
|
|
246
246
|
"zh-tw": "用一兩句話描述業務,可選填品牌名和目標人群。你會得到覆蓋多種風格的 10 條候選,每條帶風格標籤和入選理由——直接進入篩選、測試和打磨。",
|
|
247
247
|
},
|
|
248
|
-
badge: { en: "
|
|
248
|
+
badge: { en: "Sign in to generate", zh: "登录后生成", "zh-tw": "登入後產生" },
|
|
249
249
|
},
|
|
250
250
|
standard: {
|
|
251
251
|
benefits: {
|
|
@@ -541,17 +541,17 @@ Quality requirements:
|
|
|
541
541
|
{
|
|
542
542
|
kind: "cards",
|
|
543
543
|
heading: {
|
|
544
|
-
en: "Why this beats
|
|
545
|
-
zh: "
|
|
546
|
-
"zh-tw": "
|
|
544
|
+
en: "Why this beats basic slogan lists",
|
|
545
|
+
zh: "为什么比常见的 slogan 列表更好用",
|
|
546
|
+
"zh-tw": "為什麼比常見的 slogan 清單更好用",
|
|
547
547
|
},
|
|
548
548
|
items: [
|
|
549
549
|
{
|
|
550
|
-
title: { en: "
|
|
550
|
+
title: { en: "Full results on this page", zh: "完整结果在本页展示", "zh-tw": "完整結果在本頁顯示" },
|
|
551
551
|
body: {
|
|
552
|
-
en: "
|
|
553
|
-
zh: "
|
|
554
|
-
"zh-tw": "
|
|
552
|
+
en: "After you sign in once, the complete candidate set renders directly below the form instead of sending you to a separate editor or workflow.",
|
|
553
|
+
zh: "登录后,完整候选会直接显示在表单下方,不会再把你带到另一个编辑器或流程。",
|
|
554
|
+
"zh-tw": "登入後,完整候選會直接顯示在表單下方,不會再把你帶到另一個編輯器或流程。",
|
|
555
555
|
},
|
|
556
556
|
},
|
|
557
557
|
{
|
|
@@ -677,14 +677,14 @@ Quality requirements:
|
|
|
677
677
|
},
|
|
678
678
|
{
|
|
679
679
|
question: {
|
|
680
|
-
en: "
|
|
681
|
-
zh: "
|
|
682
|
-
"zh-tw": "
|
|
680
|
+
en: "Do I need an account to generate slogans?",
|
|
681
|
+
zh: "生成 Slogan 需要登录吗?",
|
|
682
|
+
"zh-tw": "產生 Slogan 需要登入嗎?",
|
|
683
683
|
},
|
|
684
684
|
answer: {
|
|
685
|
-
en: "Yes
|
|
686
|
-
zh: "
|
|
687
|
-
"zh-tw": "
|
|
685
|
+
en: "Yes. Sign in before generation so the model request can run securely. After sign-in, the complete candidate set and its review notes render on this page.",
|
|
686
|
+
zh: "需要。生成前请先登录,以便安全运行模型请求;登录后,完整候选和复核说明会直接显示在本页。",
|
|
687
|
+
"zh-tw": "需要。產生前請先登入,以便安全執行模型請求;登入後,完整候選與複核說明會直接顯示在本頁。",
|
|
688
688
|
},
|
|
689
689
|
},
|
|
690
690
|
],
|
|
@@ -21,7 +21,7 @@ const appIconResizer = {
|
|
|
21
21
|
guide: {
|
|
22
22
|
heroVisualAlt:
|
|
23
23
|
"App icon asset package visual showing one source icon exported into store submission, Xcode, and Android launcher files.",
|
|
24
|
-
workspaceHeading: "App
|
|
24
|
+
workspaceHeading: "App Icon Resizer and Asset Package",
|
|
25
25
|
workspaceHint:
|
|
26
26
|
"One source, one local ZIP for store and engineering handoff.",
|
|
27
27
|
workspaceBadge: "PNG + ZIP",
|
|
@@ -18,7 +18,7 @@ const appStoreScreenshotGenerator = {
|
|
|
18
18
|
"Hero visual for an app store listing image generator, showing a complete app store screenshot set.",
|
|
19
19
|
workspaceHeading: "App Store Screenshot Generator",
|
|
20
20
|
workspaceHint:
|
|
21
|
-
"Upload real UI screenshots.
|
|
21
|
+
"Upload real UI screenshots. An online image generation workflow reads supporting context, plans the complete set, and submits live image tasks.",
|
|
22
22
|
whatYouGetHeading: "What you get after generation",
|
|
23
23
|
valueVisualAlt:
|
|
24
24
|
"App store listing image export bundle with phone screenshots, a feature graphic, PNG files, and SVG files.",
|
|
@@ -78,7 +78,7 @@ const appStoreScreenshotGenerator = {
|
|
|
78
78
|
supportBody: [
|
|
79
79
|
"You must upload local UI screenshots. Product URL, App Store or Google Play links, product name, and selling points provide supporting context for title, description, and page-summary clues.",
|
|
80
80
|
"Apple App Store and Google Play directions are supported, including complete screenshot sets, portrait screenshots, and feature graphics.",
|
|
81
|
-
"This version uses
|
|
81
|
+
"This version uses an online image generation workflow to submit live image tasks, but it does not connect to App Store Connect or Google Play Console.",
|
|
82
82
|
"If a screenshot includes test accounts, real users, private data, or unauthorized brands, redact it before use.",
|
|
83
83
|
"If no result appears, check that the URL is not empty, the uploaded file is PNG/JPG/WebP, browser file reading is allowed, and the selected input source matches your data.",
|
|
84
84
|
"Before real submission, review the latest platform dimensions, review policies, trademark or copyright permissions, privacy content, copy claims, and readability on target devices.",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
const coldStartChannelSelector = {
|
|
2
2
|
meta: {
|
|
3
|
-
title: "
|
|
4
|
-
description: "
|
|
5
|
-
intro: "Choose the first
|
|
3
|
+
title: "Customer Acquisition Channel Selector",
|
|
4
|
+
description: "Choose customer acquisition channels to test first. Add your product, audience, time, and budget to get ranked options, first actions, and validation signals.",
|
|
5
|
+
intro: "Choose the first customer acquisition channel to test, then use real signals to decide what comes next.",
|
|
6
6
|
category: "Growth strategy tools",
|
|
7
7
|
keywords: [
|
|
8
8
|
"customer acquisition channels",
|
|
@@ -33,7 +33,7 @@ const coldStartChannelSelector = {
|
|
|
33
33
|
},
|
|
34
34
|
],
|
|
35
35
|
guide: {
|
|
36
|
-
workspaceTitle: "
|
|
36
|
+
workspaceTitle: "Choose the First Customer Acquisition Channels to Test",
|
|
37
37
|
workspaceHint:
|
|
38
38
|
"Add your product, customer, time, and budget. Get a growth channel strategy to test, why it fits, and the signal that tells you what to do next.",
|
|
39
39
|
workspaceBadge: "Early-stage growth channel strategy",
|
|
@@ -37,10 +37,10 @@ const competitorAnalysis = {
|
|
|
37
37
|
running: "Researching…",
|
|
38
38
|
emptyTitle: "The competitor profile will appear here",
|
|
39
39
|
emptyHint:
|
|
40
|
-
"Enter a competitor URL and
|
|
40
|
+
"Enter a competitor URL and an online research workflow turns public signals into a structured profile.",
|
|
41
41
|
runningTitle: "Researching this competitor",
|
|
42
42
|
runningHint:
|
|
43
|
-
"The
|
|
43
|
+
"The research workflow is reading the site and searching public signals for traffic, scale, team, and funding. This usually takes 1-3 minutes.",
|
|
44
44
|
status: {
|
|
45
45
|
default: "Researching",
|
|
46
46
|
PENDING: "Queued",
|
|
@@ -130,20 +130,21 @@ const competitorAnalysis = {
|
|
|
130
130
|
workspaceHint: "Enter a public competitor URL to build a sourced profile with confidence and unknowns shown for every major finding.",
|
|
131
131
|
workspaceBadge: "Public sources only",
|
|
132
132
|
visualAlt: {
|
|
133
|
-
hero: "Competitor profile report
|
|
134
|
-
howToUse: "
|
|
135
|
-
result: "Competitor
|
|
133
|
+
hero: "Competitor profile report with sourced findings and confidence levels.",
|
|
134
|
+
howToUse: "Workflow from a public competitor URL to a sourced competitor profile.",
|
|
135
|
+
result: "Competitor findings separated into evidence, estimates, confidence, and unknowns.",
|
|
136
|
+
useCases: "Teams applying competitor research to positioning, pricing, and launch decisions.",
|
|
136
137
|
},
|
|
137
138
|
howToUseKicker: "How it works",
|
|
138
139
|
howToUse: "How to analyze a competitor",
|
|
139
140
|
howToUseSteps: [
|
|
140
141
|
"Paste the competitor's public website URL; optionally add a name and the dimensions you care about.",
|
|
141
|
-
"
|
|
142
|
+
"An online research workflow reads the site and searches public signals for traffic, scale, team, and funding.",
|
|
142
143
|
"Results come back as a structured profile — each dimension shows confidence and degrades instead of inventing data.",
|
|
143
144
|
"Start with the overview and traffic trend, then turn “Positioning & openings” into your own positioning, pricing, or channel hypotheses.",
|
|
144
145
|
],
|
|
145
146
|
runtimeNote:
|
|
146
|
-
"Research runs
|
|
147
|
+
"Research runs through an online workflow using public web and search only. The page renders the structured result only — no local template fallback.",
|
|
147
148
|
resultKicker: "Result guidance",
|
|
148
149
|
resultGuidance: "How to read the profile",
|
|
149
150
|
guidanceBullets: [
|
|
@@ -177,7 +178,7 @@ const competitorAnalysis = {
|
|
|
177
178
|
{
|
|
178
179
|
question: "Does it access private or logged-in pages?",
|
|
179
180
|
answer:
|
|
180
|
-
"No. The
|
|
181
|
+
"No. The research workflow reads public pages and public search results only — it does not crawl private, authenticated, or paywalled content.",
|
|
181
182
|
},
|
|
182
183
|
{
|
|
183
184
|
question: "What should I do with the result?",
|
|
@@ -18,7 +18,7 @@ const emailTemplateGenerator = {
|
|
|
18
18
|
heroImageAlt: "Visual of a rough email brief becoming MJML, HTML, plain text, variables, and an export bundle.",
|
|
19
19
|
workspaceHeading: "MJML Email Template Generator",
|
|
20
20
|
workspaceHint:
|
|
21
|
-
"Describe the email goal, audience, scenario, and brand tone. The
|
|
21
|
+
"Describe the email goal, audience, scenario, and brand tone. The generation workflow returns a structured MJML-first package you can preview, revise, copy, or export.",
|
|
22
22
|
workspaceBadge: "MJML package",
|
|
23
23
|
outputs: "What You Get",
|
|
24
24
|
outputsIntro:
|
|
@@ -45,8 +45,8 @@ const emailTemplateGenerator = {
|
|
|
45
45
|
body: "See compliance, accessibility, rendering, and missing-information notes before handing the template to development.",
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
|
-
title: "
|
|
49
|
-
body: "After generation, describe the exact wording or module change and regenerate a new structured result
|
|
48
|
+
title: "Guided revision loop",
|
|
49
|
+
body: "After generation, describe the exact wording or module change and regenerate a new structured result.",
|
|
50
50
|
},
|
|
51
51
|
],
|
|
52
52
|
valueVisualAlt: "Visual of an email template package with MJML, HTML, variables, and developer handoff notes.",
|
|
@@ -72,7 +72,7 @@ const emailTemplateGenerator = {
|
|
|
72
72
|
},
|
|
73
73
|
{
|
|
74
74
|
title: "Fast Iteration",
|
|
75
|
-
body: "A rough brief can become a first package quickly, then the
|
|
75
|
+
body: "A rough brief can become a first package quickly, then the generation workflow can revise structure, wording, and sections from follow-up instructions.",
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
78
|
title: "Useful Preview",
|
|
@@ -103,7 +103,7 @@ const emailTemplateGenerator = {
|
|
|
103
103
|
title: "How To Recover",
|
|
104
104
|
items: [
|
|
105
105
|
"If the result is too generic, add real product value, user segment, offer, CTA, objections, and brand examples.",
|
|
106
|
-
"If the template feels too promotional, switch to a transactional scenario or ask the
|
|
106
|
+
"If the template feels too promotional, switch to a transactional scenario or ask for the sales language to be removed.",
|
|
107
107
|
"If a merge field or link is missing, add the required variable name and regenerate through the revision box.",
|
|
108
108
|
],
|
|
109
109
|
},
|
|
@@ -153,7 +153,7 @@ const emailTemplateGenerator = {
|
|
|
153
153
|
{
|
|
154
154
|
question: "Can I edit the result?",
|
|
155
155
|
answer:
|
|
156
|
-
"Yes. You can inspect sections and
|
|
156
|
+
"Yes. You can inspect sections and submit revision instructions. The next version is returned as a new structured result.",
|
|
157
157
|
},
|
|
158
158
|
{
|
|
159
159
|
question: "Is the generated HTML ready to send?",
|
|
@@ -207,7 +207,7 @@ const emailTemplateGenerator = {
|
|
|
207
207
|
emptyTitle: "Your generated package will appear here",
|
|
208
208
|
emptyHint:
|
|
209
209
|
"The result includes HTML preview, MJML source, HTML, plain text, variables, review notes, and export actions.",
|
|
210
|
-
runningTitle: "
|
|
210
|
+
runningTitle: "Your template package is being generated",
|
|
211
211
|
runningHint:
|
|
212
212
|
"It is writing MJML, matching HTML, plain text, variables, and review notes. Short result fetch delays are normal.",
|
|
213
213
|
previewInput: "Input",
|
|
@@ -248,7 +248,7 @@ const emailTemplateGenerator = {
|
|
|
248
248
|
missing: "Missing information",
|
|
249
249
|
empty: "No items returned.",
|
|
250
250
|
},
|
|
251
|
-
revisionLabel: "
|
|
251
|
+
revisionLabel: "Revise the result",
|
|
252
252
|
revisionHint: "Use a specific change request",
|
|
253
253
|
revisionPlaceholder:
|
|
254
254
|
"Example: Make the hero shorter, change the CTA to book a demo, and add {{calendar_url}} as a variable.",
|
|
@@ -262,12 +262,12 @@ const emailTemplateGenerator = {
|
|
|
262
262
|
},
|
|
263
263
|
errors: {
|
|
264
264
|
invalid: "Add a real product name, audience, and email brief. Placeholder or numeric input cannot produce a useful template.",
|
|
265
|
-
revision: "Write a specific revision instruction before
|
|
265
|
+
revision: "Write a specific revision instruction before submitting it.",
|
|
266
266
|
copy: "Copy failed. You can still select and copy the text manually.",
|
|
267
267
|
submit: "The request could not be submitted.",
|
|
268
268
|
task: "The generation task failed.",
|
|
269
269
|
timeout: "The structured result did not arrive in time.",
|
|
270
|
-
schema: "The
|
|
270
|
+
schema: "The generated result could not be read safely. Please try again.",
|
|
271
271
|
generic: "The template could not be generated.",
|
|
272
272
|
recover:
|
|
273
273
|
"Check the brief, try again, or add more concrete product, audience, CTA, and variable details.",
|
|
@@ -228,6 +228,7 @@ const productPosterGenerator = {
|
|
|
228
228
|
"The poster image could not be generated. Simplify the benefits, choose another format, or try again later.",
|
|
229
229
|
unreadableResult: "The result cannot be read right now. Try again later.",
|
|
230
230
|
timeout: "Generation is taking longer than expected. Try again later.",
|
|
231
|
+
downloadFailed: "The PNG could not be downloaded. Try again in a moment.",
|
|
231
232
|
},
|
|
232
233
|
readyKicker: "Poster ready",
|
|
233
234
|
readyTitle: "Product promo poster is ready",
|
|
@@ -18,7 +18,7 @@ const appStoreScreenshotGenerator = {
|
|
|
18
18
|
"应用商店上架图生成器 Hero 视觉图,展示一套应用商店截图。",
|
|
19
19
|
workspaceHeading: "App Store / Google Play 上架截图生成器",
|
|
20
20
|
workspaceHint:
|
|
21
|
-
"上传真实 UI
|
|
21
|
+
"上传真实 UI 截图后,在线图像生成流程会读取补充上下文、规划完整套图并提交真实生图任务。",
|
|
22
22
|
whatYouGetHeading: "生成后会得到什么",
|
|
23
23
|
valueVisualAlt:
|
|
24
24
|
"应用商店上架图导出包,展示多张手机截图、横版主图、PNG 和 SVG 文件。",
|
|
@@ -37,7 +37,7 @@ const appStoreScreenshotGenerator = {
|
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
title: "明确的来源边界",
|
|
40
|
-
body: "UI 截图是必填视觉来源;URL
|
|
40
|
+
body: "UI 截图是必填视觉来源;URL 仅用于读取公开上下文并补充 brief。避免使用真实用户、隐私数据或未授权品牌素材。",
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
title: "失败原因提示",
|
|
@@ -78,7 +78,7 @@ const appStoreScreenshotGenerator = {
|
|
|
78
78
|
supportBody: [
|
|
79
79
|
"必须上传本地 UI 截图;产品 URL、App Store / Google Play 链接、产品名和卖点用于补充标题、描述和页面摘要。",
|
|
80
80
|
"支持 Apple App Store 和 Google Play 两类平台方向,并提供完整截图套图、竖版截图或横版 feature graphic。",
|
|
81
|
-
"
|
|
81
|
+
"当前通过在线图像生成流程提交真实生图任务,但不连接 App Store Connect 或 Google Play Console 后台。",
|
|
82
82
|
"如果截图含测试账号、真实用户、隐私数据或未授权品牌,请先脱敏或不要上传。",
|
|
83
83
|
"如果没有结果,先检查 URL 是否为空、上传文件是否为 PNG/JPG/WebP、浏览器是否阻止本地文件读取,以及是否选择了正确的输入来源。",
|
|
84
84
|
"正式上架前仍要复核最新尺寸、审核政策、商标/版权授权、隐私内容、文案承诺和不同设备上的可读性。",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const coldStartChannelSelector = {
|
|
2
2
|
meta: {
|
|
3
|
-
title: "
|
|
3
|
+
title: "客户获取渠道选择器",
|
|
4
4
|
description: "为早期产品制定冷启动渠道策略。填入产品、目标客户、时间和预算,获得优先测试渠道、选择理由和下一步验证信号。",
|
|
5
5
|
intro: "先确定冷启动阶段最值得测试的渠道,再用真实信号决定下一步。",
|
|
6
6
|
category: "增长策略工具",
|
|
@@ -33,7 +33,7 @@ const coldStartChannelSelector = {
|
|
|
33
33
|
},
|
|
34
34
|
],
|
|
35
35
|
guide: {
|
|
36
|
-
workspaceTitle: "
|
|
36
|
+
workspaceTitle: "选择最值得先测试的客户获取渠道",
|
|
37
37
|
workspaceHint:
|
|
38
38
|
"输入产品、客户、时间和预算,得到适合当前阶段的冷启动渠道策略、选择理由和验证信号。",
|
|
39
39
|
workspaceBadge: "早期产品冷启动渠道策略",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const competitorAnalysis = {
|
|
2
2
|
meta: {
|
|
3
3
|
title: "AI 竞品分析工具",
|
|
4
|
-
description: "
|
|
4
|
+
description: "输入一个竞品的网址,在线调研流程会整理公开信息并输出结构化竞品档案:产品概览、流量与增长、业务规模、团队与融资,并附来源和可信度。",
|
|
5
5
|
intro: "把一个竞品 URL 变成一页看懂的竞品档案。基于公开网页和检索的估算,每个维度都标注可信度,帮助你做定位、增长和竞争决策。",
|
|
6
6
|
category: "市场调研工具",
|
|
7
7
|
keywords: [
|
|
@@ -36,9 +36,9 @@ const competitorAnalysis = {
|
|
|
36
36
|
submitting: "提交中…",
|
|
37
37
|
running: "调研中…",
|
|
38
38
|
emptyTitle: "竞品档案会显示在这里",
|
|
39
|
-
emptyHint: "
|
|
39
|
+
emptyHint: "输入一个竞品网址,在线调研流程会整理公开信息并生成结构化档案。",
|
|
40
40
|
runningTitle: "正在调研这个竞品",
|
|
41
|
-
runningHint: "
|
|
41
|
+
runningHint: "调研流程正在读取官网并检索公开信号,整理流量、规模、团队和融资。通常需要 1-3 分钟。",
|
|
42
42
|
status: {
|
|
43
43
|
default: "调研中",
|
|
44
44
|
PENDING: "排队中",
|
|
@@ -128,20 +128,21 @@ const competitorAnalysis = {
|
|
|
128
128
|
workspaceHint: "输入竞品公开网址,生成带来源的结构化档案,并为主要发现标注可信度与未知项。",
|
|
129
129
|
workspaceBadge: "仅使用公开来源",
|
|
130
130
|
visualAlt: {
|
|
131
|
-
hero: "
|
|
132
|
-
howToUse: "
|
|
133
|
-
result: "
|
|
131
|
+
hero: "包含来源与置信度的竞品档案报告。",
|
|
132
|
+
howToUse: "从公开竞品网址到有来源竞品档案的分析流程。",
|
|
133
|
+
result: "把竞品发现拆分为证据、估算、置信度与未知项。",
|
|
134
|
+
useCases: "团队把竞品研究用于定位、定价与发布决策。",
|
|
134
135
|
},
|
|
135
136
|
howToUseKicker: "使用流程",
|
|
136
137
|
howToUse: "如何分析一个竞品",
|
|
137
138
|
howToUseSteps: [
|
|
138
139
|
"粘贴竞品的公开官网网址,可选填竞品名称和你重点关注的维度。",
|
|
139
|
-
"
|
|
140
|
+
"提交后,在线调研流程会读取官网并检索公开信号,整理流量、规模、团队和融资。",
|
|
140
141
|
"结果以结构化档案返回:每个维度都带可信度,数据缺失时降级而非编造。",
|
|
141
142
|
"先看概览和流量趋势,再把“定位与机会”转成你的定位、定价或渠道假设。",
|
|
142
143
|
],
|
|
143
144
|
runtimeNote:
|
|
144
|
-
"
|
|
145
|
+
"调研通过在线流程完成,仅基于公开网页和检索结果进行估算。页面只展示结构化结果,不提供本地模板兜底。",
|
|
145
146
|
resultKicker: "结果解读",
|
|
146
147
|
resultGuidance: "如何看懂竞品档案",
|
|
147
148
|
guidanceBullets: [
|
|
@@ -172,7 +173,7 @@ const competitorAnalysis = {
|
|
|
172
173
|
},
|
|
173
174
|
{
|
|
174
175
|
question: "会处理私有或登录后的页面吗?",
|
|
175
|
-
answer: "
|
|
176
|
+
answer: "不会。调研流程只读取公开页面和公开检索结果,不抓取私有、登录或付费墙后的内容。",
|
|
176
177
|
},
|
|
177
178
|
{
|
|
178
179
|
question: "拿到结果后该做什么?",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const emailTemplateGenerator = {
|
|
2
2
|
meta: {
|
|
3
3
|
title: "邮件模板生成器",
|
|
4
|
-
description: "
|
|
4
|
+
description: "输入营销或高频交易邮件需求,由在线生成流程产出 MJML-first 邮件模板包,包含可预览 HTML、纯文本、变量、复核项和开发交付说明。",
|
|
5
5
|
intro: "把粗略邮件需求转成可预览、可修改、可导出的 MJML 邮件模板包,适合营销活动、验证码、账单、订阅成功和账号通知等场景。",
|
|
6
6
|
category: "营销工具",
|
|
7
7
|
keywords: [
|
|
@@ -18,7 +18,7 @@ const emailTemplateGenerator = {
|
|
|
18
18
|
heroImageAlt: "粗略邮件需求转成 MJML、HTML、纯文本、变量和导出包的视觉图。",
|
|
19
19
|
workspaceHeading: "MJML 邮件模板生成器",
|
|
20
20
|
workspaceHint:
|
|
21
|
-
"
|
|
21
|
+
"描述邮件目标、受众、场景和品牌语气,生成流程会返回结构化的 MJML-first 邮件模板包,可预览、修改、复制和导出。",
|
|
22
22
|
workspaceBadge: "MJML 模板包",
|
|
23
23
|
outputs: "你会得到什么",
|
|
24
24
|
outputsIntro:
|
|
@@ -45,8 +45,8 @@ const emailTemplateGenerator = {
|
|
|
45
45
|
body: "在交付开发前看到营销合规、无障碍、渲染兼容和缺失信息等检查项。",
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
|
-
title: "
|
|
49
|
-
body: "
|
|
48
|
+
title: "引导式修改流程",
|
|
49
|
+
body: "生成后可以描述要改的文案、模块或结构,再生成一份新的结构化结果。",
|
|
50
50
|
},
|
|
51
51
|
],
|
|
52
52
|
valueVisualAlt: "包含 MJML、HTML、变量和开发交付说明的邮件模板包视觉图。",
|
|
@@ -72,7 +72,7 @@ const emailTemplateGenerator = {
|
|
|
72
72
|
},
|
|
73
73
|
{
|
|
74
74
|
title: "迭代速度快",
|
|
75
|
-
body: "粗略 brief
|
|
75
|
+
body: "粗略 brief 可以先生成第一版,再通过后续要求修改结构、措辞和模块。",
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
78
|
title: "预览真实有用",
|
|
@@ -103,7 +103,7 @@ const emailTemplateGenerator = {
|
|
|
103
103
|
title: "失败时怎么恢复",
|
|
104
104
|
items: [
|
|
105
105
|
"如果结果太泛,补充真实产品价值、用户分群、优惠内容、CTA、反对意见和品牌示例。",
|
|
106
|
-
"
|
|
106
|
+
"如果交易邮件显得过度营销,切换到交易场景,或在修改要求中说明移除销售性措辞。",
|
|
107
107
|
"如果缺少变量或链接,把需要的变量名写进修改要求,再通过修改框重新生成。",
|
|
108
108
|
],
|
|
109
109
|
},
|
|
@@ -153,7 +153,7 @@ const emailTemplateGenerator = {
|
|
|
153
153
|
{
|
|
154
154
|
question: "生成后可以修改吗?",
|
|
155
155
|
answer:
|
|
156
|
-
"
|
|
156
|
+
"可以。你可以查看模块并提交修改要求,下一版会以新的结构化结果返回。",
|
|
157
157
|
},
|
|
158
158
|
{
|
|
159
159
|
question: "生成的 HTML 可以直接发送吗?",
|
|
@@ -207,7 +207,7 @@ const emailTemplateGenerator = {
|
|
|
207
207
|
emptyTitle: "生成结果会显示在这里",
|
|
208
208
|
emptyHint:
|
|
209
209
|
"结果包含 HTML 预览、MJML 源码、HTML、纯文本、变量、复核说明和导出动作。",
|
|
210
|
-
runningTitle: "
|
|
210
|
+
runningTitle: "正在生成邮件模板包",
|
|
211
211
|
runningHint:
|
|
212
212
|
"它会生成 MJML、匹配的 HTML、纯文本、变量和复核说明。结构化结果短暂延迟是正常的。",
|
|
213
213
|
previewInput: "输入",
|
|
@@ -248,7 +248,7 @@ const emailTemplateGenerator = {
|
|
|
248
248
|
missing: "缺失信息",
|
|
249
249
|
empty: "没有返回相关项目。",
|
|
250
250
|
},
|
|
251
|
-
revisionLabel: "
|
|
251
|
+
revisionLabel: "修改结果",
|
|
252
252
|
revisionHint: "写具体修改要求",
|
|
253
253
|
revisionPlaceholder:
|
|
254
254
|
"例如:缩短首屏,把 CTA 改成预约演示,并增加 {{calendar_url}} 变量。",
|
|
@@ -262,12 +262,12 @@ const emailTemplateGenerator = {
|
|
|
262
262
|
},
|
|
263
263
|
errors: {
|
|
264
264
|
invalid: "请填写真实产品名称、目标受众和邮件需求。占位或纯数字输入无法生成有用模板。",
|
|
265
|
-
revision: "
|
|
265
|
+
revision: "提交前,请写清楚具体修改要求。",
|
|
266
266
|
copy: "复制失败。你仍然可以手动选中文本复制。",
|
|
267
267
|
submit: "请求提交失败。",
|
|
268
268
|
task: "生成任务失败。",
|
|
269
269
|
timeout: "结构化结果没有在限定时间内返回。",
|
|
270
|
-
schema: "
|
|
270
|
+
schema: "生成结果格式无法安全读取,请重试。",
|
|
271
271
|
generic: "邮件模板生成失败。",
|
|
272
272
|
recover:
|
|
273
273
|
"请检查邮件需求,或补充更具体的产品、受众、CTA 和变量信息后重试。",
|
|
@@ -219,6 +219,7 @@ const productPosterGenerator = {
|
|
|
219
219
|
imageFailed: "海报图没有生成成功。可以简化卖点、换一个尺寸,或稍后再试。",
|
|
220
220
|
unreadableResult: "结果暂时无法读取。请稍后重试。",
|
|
221
221
|
timeout: "生成时间较长。请稍后重试。",
|
|
222
|
+
downloadFailed: "PNG 下载失败,请稍后重试。",
|
|
222
223
|
},
|
|
223
224
|
readyKicker: "海报已生成",
|
|
224
225
|
readyTitle: "产品宣传海报图已生成",
|