@guru-ai-product/ai-product-kit 0.2.251117145040 → 0.2.251117160442
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/bin/setup.js +172 -0
- package/mcp/skills/aipk_init_project/template/AGENTS_TEMPLATE.md +1 -1
- package/package.json +1 -1
- package/skills/aipk_design/GURU_AI.md +1 -1
- package/skills/aipk_development/GURU_AI.md +1 -1
- package/skills/aipk_init_project/GURU_AI.md +2 -2
- package/skills/aipk_init_project/template/AGENTS_TEMPLATE.md +1 -43
- package/skills/aipk_operations/GURU_AI.md +1 -1
- package/skills/aipk_requirements/GURU_AI.md +2 -2
- package/skills/aipk_requirements/documentation/template/4.2_/345/205/263/351/224/256/347/225/214/351/235/242.md +90 -73
- package/skills/aipk_skill_generate/GURU_AI.md +1 -1
- package/skills/aipk_tool_prompts/GURU_AI.md +1 -1
package/bin/setup.js
CHANGED
|
@@ -5,6 +5,15 @@ const path = require('node:path');
|
|
|
5
5
|
|
|
6
6
|
const packageRoot = path.resolve(__dirname, '..');
|
|
7
7
|
const bundledSkillsDir = path.join(packageRoot, 'skills');
|
|
8
|
+
const AGENTS_FILENAME = 'AGENTS.md';
|
|
9
|
+
const AGENTS_TEMPLATE_PATH = path.join(
|
|
10
|
+
packageRoot,
|
|
11
|
+
'skills',
|
|
12
|
+
'aipk_init_project',
|
|
13
|
+
'template',
|
|
14
|
+
'AGENTS_TEMPLATE.md'
|
|
15
|
+
);
|
|
16
|
+
const AGENTS_TEMPLATE_PLACEHOLDER = '{{skills_section}}';
|
|
8
17
|
|
|
9
18
|
function log(message) {
|
|
10
19
|
process.stdout.write(`[ai-product-kit] ${message}\n`);
|
|
@@ -84,6 +93,169 @@ function main() {
|
|
|
84
93
|
removeGuruDirectories(targetDir);
|
|
85
94
|
copyBundledSkills(targetDir);
|
|
86
95
|
log('Skills directory updated.');
|
|
96
|
+
ensureAgentsMd();
|
|
87
97
|
}
|
|
88
98
|
|
|
89
99
|
main();
|
|
100
|
+
|
|
101
|
+
function ensureAgentsMd() {
|
|
102
|
+
const agentsPath = path.join(process.cwd(), AGENTS_FILENAME);
|
|
103
|
+
let content;
|
|
104
|
+
if (!fs.existsSync(agentsPath)) {
|
|
105
|
+
content = buildDefaultAgentsContent();
|
|
106
|
+
fs.writeFileSync(agentsPath, content, 'utf8');
|
|
107
|
+
log('Created AGENTS.md');
|
|
108
|
+
} else {
|
|
109
|
+
content = fs.readFileSync(agentsPath, 'utf8');
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const skills = collectSkillMetadata();
|
|
113
|
+
const newSection = renderAgentsTemplateForSkills(skills);
|
|
114
|
+
const updated = replaceSkillsSection(content, newSection);
|
|
115
|
+
|
|
116
|
+
if (updated !== content) {
|
|
117
|
+
fs.writeFileSync(agentsPath, updated, 'utf8');
|
|
118
|
+
log(`Updated AGENTS.md with ${skills.length} skill(s)`);
|
|
119
|
+
} else {
|
|
120
|
+
log('AGENTS.md already up to date');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function buildDefaultAgentsContent() {
|
|
125
|
+
return renderAgentsTemplateForSkills([]);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function renderAgentsTemplateForSkills(skills) {
|
|
129
|
+
const template = loadAgentsTemplate();
|
|
130
|
+
if (!template.includes(AGENTS_TEMPLATE_PLACEHOLDER)) {
|
|
131
|
+
exitWithError(`AGENTS template missing ${AGENTS_TEMPLATE_PLACEHOLDER} placeholder`);
|
|
132
|
+
}
|
|
133
|
+
const entries = generateSkillEntries(skills);
|
|
134
|
+
return template.replace(AGENTS_TEMPLATE_PLACEHOLDER, entries);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function loadAgentsTemplate() {
|
|
138
|
+
if (!fs.existsSync(AGENTS_TEMPLATE_PATH)) {
|
|
139
|
+
exitWithError('AGENTS template file is missing from the package.');
|
|
140
|
+
}
|
|
141
|
+
return fs.readFileSync(AGENTS_TEMPLATE_PATH, 'utf8');
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function collectSkillMetadata() {
|
|
145
|
+
if (!fs.existsSync(bundledSkillsDir)) {
|
|
146
|
+
return [];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const entries = fs.readdirSync(bundledSkillsDir, { withFileTypes: true });
|
|
150
|
+
/** @type {{ name: string; description: string; location: string }[]} */
|
|
151
|
+
const skills = [];
|
|
152
|
+
|
|
153
|
+
for (const entry of entries) {
|
|
154
|
+
if (!entry.isDirectory()) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const skillDir = path.join(bundledSkillsDir, entry.name);
|
|
158
|
+
const metadata = parseSkillFrontMatter(skillDir);
|
|
159
|
+
const name = metadata?.name || entry.name;
|
|
160
|
+
const description =
|
|
161
|
+
metadata?.description ||
|
|
162
|
+
`AI Product Kit skill ${name} (${entry.name})`;
|
|
163
|
+
skills.push({ name, description, location: 'project' });
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return skills;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function parseSkillFrontMatter(skillDir) {
|
|
170
|
+
const skillFile = path.join(skillDir, 'SKILL.md');
|
|
171
|
+
if (!fs.existsSync(skillFile)) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const content = fs.readFileSync(skillFile, 'utf8');
|
|
176
|
+
const match = content.match(/^---\s*[\r\n]+([\s\S]*?)[\r\n]+---/);
|
|
177
|
+
if (!match) {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return parseFrontMatter(match[1]);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function parseFrontMatter(block) {
|
|
185
|
+
const lines = block.split(/\r?\n/);
|
|
186
|
+
const metadata = {};
|
|
187
|
+
|
|
188
|
+
let index = 0;
|
|
189
|
+
while (index < lines.length) {
|
|
190
|
+
const rawLine = lines[index];
|
|
191
|
+
const line = rawLine.trim();
|
|
192
|
+
if (!line || line.startsWith('#')) {
|
|
193
|
+
index += 1;
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
const colonIndex = line.indexOf(':');
|
|
197
|
+
if (colonIndex === -1) {
|
|
198
|
+
index += 1;
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
const key = line.slice(0, colonIndex).trim();
|
|
202
|
+
let value = line.slice(colonIndex + 1).trim();
|
|
203
|
+
index += 1;
|
|
204
|
+
if (value === '|' || value === '>') {
|
|
205
|
+
const collected = [];
|
|
206
|
+
while (index < lines.length) {
|
|
207
|
+
const nextLine = lines[index];
|
|
208
|
+
if (!nextLine.trim()) {
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
collected.push(nextLine.replace(/^[ \t]+/, ''));
|
|
212
|
+
index += 1;
|
|
213
|
+
}
|
|
214
|
+
value = collected.join('\n').trim();
|
|
215
|
+
} else {
|
|
216
|
+
if (
|
|
217
|
+
(value.startsWith('"') && value.endsWith('"')) ||
|
|
218
|
+
(value.startsWith("'") && value.endsWith("'"))
|
|
219
|
+
) {
|
|
220
|
+
value = value.slice(1, -1);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if (value) {
|
|
225
|
+
metadata[key] = value;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return metadata;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function generateSkillEntries(skills) {
|
|
233
|
+
const sorted = [...skills].sort((a, b) => a.name.localeCompare(b.name));
|
|
234
|
+
return sorted
|
|
235
|
+
.map(
|
|
236
|
+
(skill) => `<skill>
|
|
237
|
+
<name>${skill.name}</name>
|
|
238
|
+
<description>${skill.description}</description>
|
|
239
|
+
<location>${skill.location}</location>
|
|
240
|
+
</skill>`
|
|
241
|
+
)
|
|
242
|
+
.join('\n\n');
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function replaceSkillsSection(content, newSection) {
|
|
246
|
+
const xmlRegex = /<skills_system[\s\S]*?<\/skills_system>/;
|
|
247
|
+
if (xmlRegex.test(content)) {
|
|
248
|
+
return content.replace(xmlRegex, newSection);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const htmlRegex = /<!-- SKILLS_TABLE_START -->[\s\S]*?<!-- SKILLS_TABLE_END -->/;
|
|
252
|
+
if (htmlRegex.test(content)) {
|
|
253
|
+
const inner = newSection
|
|
254
|
+
.replace(/<skills_system[^>]*>/, '')
|
|
255
|
+
.replace('</skills_system>', '')
|
|
256
|
+
.trim();
|
|
257
|
+
return content.replace(htmlRegex, `<!-- SKILLS_TABLE_START -->\n${inner}\n<!-- SKILLS_TABLE_END -->`);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return content.trimEnd() + '\n\n' + newSection + '\n';
|
|
261
|
+
}
|
|
@@ -69,4 +69,4 @@ Use these MCP tools to load a Skill by name. The server maps known Skill names t
|
|
|
69
69
|
</mcp_skills>
|
|
70
70
|
<!-- MCP_SKILLS_TABLE_END -->
|
|
71
71
|
|
|
72
|
-
<!-- rule:
|
|
72
|
+
<!-- rule: use node tools/build_package update-skills to refresh this table -->
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# GURU AI Snapshot
|
|
2
2
|
|
|
3
|
-
Last refreshed: 2025-11-
|
|
3
|
+
Last refreshed: 2025-11-17T08:04:42.861Z
|
|
4
4
|
|
|
5
5
|
| File | Last Modified (UTC) |
|
|
6
6
|
| --- | --- |
|
|
7
7
|
| `scripts/check_agents.sh` | 2025-11-13T09:03:47.702Z |
|
|
8
8
|
| `skill.ini` | 2025-11-13T09:47:02.793Z |
|
|
9
9
|
| `SKILL.md` | 2025-11-13T10:06:33.764Z |
|
|
10
|
-
| `template/AGENTS_TEMPLATE.md` | 2025-11-
|
|
10
|
+
| `template/AGENTS_TEMPLATE.md` | 2025-11-17T08:04:42.787Z |
|
|
@@ -34,49 +34,7 @@ Usage notes:
|
|
|
34
34
|
</usage>
|
|
35
35
|
|
|
36
36
|
<available_skills>
|
|
37
|
-
|
|
38
|
-
<skill>
|
|
39
|
-
<name>design</name>
|
|
40
|
-
<description>Central hub for automation-ready design-to-requirement workflows. When agents receive composite design boards and need to update requirement documents with new visuals, verify differences between mockups and existing docs, and sync changes systematically, they consult this index to discover the appropriate sub-skill (update-requirements-from-design) for handling design-driven requirement updates.</description>
|
|
41
|
-
<location>.claude/skills/aipk_design</location>
|
|
42
|
-
</skill>
|
|
43
|
-
|
|
44
|
-
<skill>
|
|
45
|
-
<name>development</name>
|
|
46
|
-
<description>Development phase index pointing to the single authoritative implementation plan template.</description>
|
|
47
|
-
<location>.claude/skills/aipk_development</location>
|
|
48
|
-
</skill>
|
|
49
|
-
|
|
50
|
-
<skill>
|
|
51
|
-
<name>init-project</name>
|
|
52
|
-
<description>Initialize the project Agents playbook, sync the skills inventory into AGENTS.md/templates, and verify the workspace includes a complete AGENTS.md file.</description>
|
|
53
|
-
<location>.claude/skills/aipk_init_project</location>
|
|
54
|
-
</skill>
|
|
55
|
-
|
|
56
|
-
<skill>
|
|
57
|
-
<name>operations</name>
|
|
58
|
-
<description>Canonical entry point for every post-release operating guide; maps scenarios to the available Skills and explains how to invoke them.</description>
|
|
59
|
-
<location>.claude/skills/aipk_operations</location>
|
|
60
|
-
</skill>
|
|
61
|
-
|
|
62
|
-
<skill>
|
|
63
|
-
<name>requirements</name>
|
|
64
|
-
<description>Central repository for requirement discovery, documentation, review, and change management assets.</description>
|
|
65
|
-
<location>.claude/skills/aipk_requirements</location>
|
|
66
|
-
</skill>
|
|
67
|
-
|
|
68
|
-
<skill>
|
|
69
|
-
<name>skill-creation</name>
|
|
70
|
-
<description>Standards and methods for creating Agent Skills that extend Claude's capabilities. Use when creating or updating Skills, rules, or documentation that should follow Skill structure.</description>
|
|
71
|
-
<location>.claude/skills/aipk_skill_generate</location>
|
|
72
|
-
</skill>
|
|
73
|
-
|
|
74
|
-
<skill>
|
|
75
|
-
<name>tool_prompts</name>
|
|
76
|
-
<description>Catalog of reusable prompts for AI tooling workflows, including their usage guidance and file locations.</description>
|
|
77
|
-
<location>.claude/skills/aipk_tool_prompts</location>
|
|
78
|
-
</skill>
|
|
79
|
-
|
|
37
|
+
{{skills_section}}
|
|
80
38
|
</available_skills>
|
|
81
39
|
<!-- SKILLS_TABLE_END -->
|
|
82
40
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# GURU AI Snapshot
|
|
2
2
|
|
|
3
|
-
Last refreshed: 2025-11-
|
|
3
|
+
Last refreshed: 2025-11-17T08:04:42.861Z
|
|
4
4
|
|
|
5
5
|
| File | Last Modified (UTC) |
|
|
6
6
|
| --- | --- |
|
|
@@ -14,7 +14,7 @@ Last refreshed: 2025-11-17T06:50:40.492Z
|
|
|
14
14
|
| `documentation/template/2_功能需求.md` | 2025-11-17T06:49:38.006Z |
|
|
15
15
|
| `documentation/template/3_商业化策略.md` | 2025-11-17T06:43:53.421Z |
|
|
16
16
|
| `documentation/template/4.1_用户体验流程与信息架构.md` | 2025-11-17T06:49:16.631Z |
|
|
17
|
-
| `documentation/template/4.2_关键界面.md` | 2025-11-
|
|
17
|
+
| `documentation/template/4.2_关键界面.md` | 2025-11-17T07:16:19.040Z |
|
|
18
18
|
| `documentation/template/4.3_交互与响应式设计.md` | 2025-11-17T06:43:51.131Z |
|
|
19
19
|
| `documentation/template/AI 应用类APP通用埋点文档.xlsx` | 2025-11-12T10:41:15.861Z |
|
|
20
20
|
| `documentation/template/Draft_产品需求草稿.md` | 2025-11-12T10:41:15.862Z |
|
|
@@ -23,58 +23,93 @@
|
|
|
23
23
|
|
|
24
24
|
##### 引导页1:起始页
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
26
|
+
<table>
|
|
27
|
+
<tr>
|
|
28
|
+
<th>页面说明</th>
|
|
29
|
+
<th>设计图</th>
|
|
30
|
+
</tr>
|
|
31
|
+
<tr>
|
|
32
|
+
<td><strong>描述</strong>:<br>新用户首次打开App时的起始引导页,包含隐私条款和服务说明<br><br><strong>关键元素</strong>:<br>- 主视觉图片<br>- 引导文案<br>- 隐私条款链接<br>- 服务条款链接<br>- 继续按钮<br><br><strong>交互流程</strong>:<br>用户首次启动 → 查看起始页 → 阅读条款 → 点击继续<br><br><strong>设计说明</strong>:<br>简洁优雅的设计风格,突出品牌形象,清晰展示法律条款<br><br><strong>主视觉内容</strong>:<br>[描述主视觉图片或动画的内容,如展示产品核心功能的场景]<br><br><strong>界面文案 (Interface Copy)</strong>:<br>- 主标题:"[品牌名称或核心价值主张]"<br>- 引导文案:"[简短的功能描述]"<br>- 继续按钮:"[明确的行动指引]"<br>- 隐私政策链接:"Privacy Policy"<br>- 服务条款链接:"Terms of Service"</td>
|
|
33
|
+
<td>
|
|
34
|
+
<!-- ⚠️ 以下为规范说明,请勿输出到最终文档 ⚠️ -->
|
|
35
|
+
*待设计图完成后,使用以下格式:*
|
|
36
|
+
<!-- ⚠️ 规范说明结束 ⚠️ -->
|
|
37
|
+
<img src="./assets/[引导页1-起始页].png" alt="引导页1-起始页">
|
|
38
|
+
</td>
|
|
39
|
+
</tr>
|
|
40
|
+
</table>
|
|
37
41
|
|
|
38
42
|
##### 引导页2:功能介绍页1 - [功能名称]
|
|
39
43
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
<table>
|
|
45
|
+
<tr>
|
|
46
|
+
<th>页面说明</th>
|
|
47
|
+
<th>设计图</th>
|
|
48
|
+
</tr>
|
|
49
|
+
<tr>
|
|
50
|
+
<td><strong>描述</strong>:<br>介绍App的核心功能<br><br><strong>关键元素</strong>:<br>- 功能演示图片/视频<br>- 标题文案<br>- 说明文案<br><br><strong>主视觉内容</strong>:<br>[描述功能演示的图片或视频内容]<br><br><strong>界面文案 (Interface Copy)</strong>:<br>- 标题:"[功能名称或核心价值]"<br>- 说明:"[简短的功能描述,1-2行]"<br><br><strong>设计原则</strong>:<br>- 每页只传达一个核心信息<br>- 使用动词开头的简洁标题<br>- 控制在1-2行的说明文案<br>- 展示具体的使用场景或效果</td>
|
|
51
|
+
<td>
|
|
52
|
+
<!-- ⚠️ 以下为规范说明,请勿输出到最终文档 ⚠️ -->
|
|
53
|
+
*待设计图完成后,使用以下格式:*
|
|
54
|
+
<!-- ⚠️ 规范说明结束 ⚠️ -->
|
|
55
|
+
<img src="./assets/[引导页2-功能介绍页1].png" alt="引导页2-功能介绍页1">
|
|
56
|
+
</td>
|
|
57
|
+
</tr>
|
|
58
|
+
</table>
|
|
51
59
|
|
|
52
60
|
##### 引导页3:功能介绍页2 - [功能名称]
|
|
53
61
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
62
|
+
<table>
|
|
63
|
+
<tr>
|
|
64
|
+
<th>页面说明</th>
|
|
65
|
+
<th>设计图</th>
|
|
66
|
+
</tr>
|
|
67
|
+
<tr>
|
|
68
|
+
<td><strong>描述</strong>:<br>介绍App的重要功能<br><br><strong>关键元素</strong>:<br>- 功能演示图片/视频<br>- 标题文案<br>- 说明文案<br><br><strong>主视觉内容</strong>:<br>[描述功能演示的图片或视频内容]<br><br><strong>界面文案 (Interface Copy)</strong>:<br>- 标题:"[功能名称或核心价值]"<br>- 说明:"[简短的功能描述,1-2行]"</td>
|
|
69
|
+
<td>
|
|
70
|
+
<!-- ⚠️ 以下为规范说明,请勿输出到最终文档 ⚠️ -->
|
|
71
|
+
*待设计图完成后,使用以下格式:*
|
|
72
|
+
<!-- ⚠️ 规范说明结束 ⚠️ -->
|
|
73
|
+
<img src="./assets/[引导页3-功能介绍页2].png" alt="引导页3-功能介绍页2">
|
|
74
|
+
</td>
|
|
75
|
+
</tr>
|
|
76
|
+
</table>
|
|
60
77
|
|
|
61
78
|
##### 引导页4:功能介绍页3 - [功能名称]
|
|
62
79
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
80
|
+
<table>
|
|
81
|
+
<tr>
|
|
82
|
+
<th>页面说明</th>
|
|
83
|
+
<th>设计图</th>
|
|
84
|
+
</tr>
|
|
85
|
+
<tr>
|
|
86
|
+
<td><strong>描述</strong>:<br>介绍App的特色功能<br><br><strong>关键元素</strong>:<br>- 功能演示图片/视频<br>- 标题文案<br>- 说明文案<br><br><strong>主视觉内容</strong>:<br>[描述功能演示的图片或视频内容]<br><br><strong>界面文案 (Interface Copy)</strong>:<br>- 标题:"[功能名称或核心价值]"<br>- 说明:"[简短的功能描述,1-2行]"</td>
|
|
87
|
+
<td>
|
|
88
|
+
<!-- ⚠️ 以下为规范说明,请勿输出到最终文档 ⚠️ -->
|
|
89
|
+
*待设计图完成后,使用以下格式:*
|
|
90
|
+
<!-- ⚠️ 规范说明结束 ⚠️ -->
|
|
91
|
+
<img src="./assets/[引导页4-功能介绍页3].png" alt="引导页4-功能介绍页3">
|
|
92
|
+
</td>
|
|
93
|
+
</tr>
|
|
94
|
+
</table>
|
|
69
95
|
|
|
70
96
|
##### 引导页5:功能介绍页4 - [功能名称]
|
|
71
97
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
98
|
+
<table>
|
|
99
|
+
<tr>
|
|
100
|
+
<th>页面说明</th>
|
|
101
|
+
<th>设计图</th>
|
|
102
|
+
</tr>
|
|
103
|
+
<tr>
|
|
104
|
+
<td><strong>描述</strong>:<br>介绍App的高级功能或未来展望<br><br><strong>关键元素</strong>:<br>- 功能演示图片/视频<br>- 标题文案<br>- 说明文案<br><br><strong>主视觉内容</strong>:<br>[描述功能演示的图片或视频内容]<br><br><strong>界面文案 (Interface Copy)</strong>:<br>- 标题:"[功能名称或核心价值]"<br>- 说明:"[简短的功能描述,1-2行]"</td>
|
|
105
|
+
<td>
|
|
106
|
+
<!-- ⚠️ 以下为规范说明,请勿输出到最终文档 ⚠️ -->
|
|
107
|
+
*待设计图完成后,使用以下格式:*
|
|
108
|
+
<!-- ⚠️ 规范说明结束 ⚠️ -->
|
|
109
|
+
<img src="./assets/[引导页5-功能介绍页4].png" alt="引导页5-功能介绍页4">
|
|
110
|
+
</td>
|
|
111
|
+
</tr>
|
|
112
|
+
</table>
|
|
78
113
|
|
|
79
114
|
**引导页设计最佳实践**:
|
|
80
115
|
|
|
@@ -209,39 +244,21 @@
|
|
|
209
244
|
**界面功能概述**:
|
|
210
245
|
IAP付费页面是用户升级到高级功能的关键界面,通过精心设计的视觉呈现和文案说明,向用户展示付费版本的价值和优势。页面需要在保持品牌调性的同时,清晰传达高级功能的具体价值,促进用户付费转化。
|
|
211
246
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
- **主标题**:`"[突出价值的主标题]"`
|
|
228
|
-
- **副标题**:`"[详细说明价值主张的副标题]"`
|
|
229
|
-
- **功能亮点文案**:
|
|
230
|
-
- `"[高级功能1的用户价值描述]"`
|
|
231
|
-
- `"[高级功能2的用户价值描述]"`
|
|
232
|
-
- `"[高级功能3的用户价值描述]"`
|
|
233
|
-
- `"[高级功能4的用户价值描述]"`
|
|
234
|
-
- **价格展示**:`"[价格信息,如$X.XX/month or $XX.XX/year]"`
|
|
235
|
-
- **主要按钮**:`"[主要行动按钮文案]"`
|
|
236
|
-
- **次要按钮**:`"Restore Purchases"`
|
|
237
|
-
- **免费试用**:`"[免费试用信息,如X-day free trial included]"`
|
|
238
|
-
|
|
239
|
-
**文案设计原则**:
|
|
240
|
-
|
|
241
|
-
- **价值导向**:突出用户能获得的具体价值和体验提升
|
|
242
|
-
- **品牌一致**:延续产品核心主题和品牌调性
|
|
243
|
-
- **简洁明了**:避免过多技术术语,专注于用户利益
|
|
244
|
-
- **紧迫感适度**:通过免费试用等方式降低用户决策门槛
|
|
247
|
+
<table>
|
|
248
|
+
<tr>
|
|
249
|
+
<th>页面说明</th>
|
|
250
|
+
<th>设计图</th>
|
|
251
|
+
</tr>
|
|
252
|
+
<tr>
|
|
253
|
+
<td><strong>描述</strong>:<br>展示产品高级功能的价值主张,引导用户升级到付费版本<br><br><strong>关键元素</strong>:<br>- 背景图片<br>- 主标题<br>- 功能列表<br>- 价格信息<br>- 订阅按钮<br>- 恢复购买选项<br><br><strong>设计风格</strong>:<br>与产品整体品牌保持一致,使用现代简洁的设计语言<br><br><strong>背景图片设计说明</strong>:<br>- 视觉主题:[描述背景图片的主题和概念,如展示产品核心功能的视觉化表现]<br>- 色调风格:[描述使用的色调和品牌色彩,营造的氛围感]<br>- 构图要求:背景图片不应干扰文字阅读,保持良好的对比度<br>- 元素建议:[列出可能包含的视觉元素,如图标、抽象图形等]<br><br><strong>界面文案 (Interface Copy)</strong>:<br>- 主标题:"[突出价值的主标题]"<br>- 副标题:"[详细说明价值主张的副标题]"<br>- 功能亮点文案:<br> - "[高级功能1的用户价值描述]"<br> - "[高级功能2的用户价值描述]"<br> - "[高级功能3的用户价值描述]"<br> - "[高级功能4的用户价值描述]"<br>- 价格展示:"[价格信息,如$X.XX/month or $XX.XX/year]"<br>- 主要按钮:"[主要行动按钮文案]"<br>- 次要按钮:"Restore Purchases"<br>- 免费试用:"[免费试用信息,如X-day free trial included]"<br><br><strong>文案设计原则</strong>:<br>- 价值导向:突出用户能获得的具体价值和体验提升<br>- 品牌一致:延续产品核心主题和品牌调性<br>- 简洁明了:避免过多技术术语,专注于用户利益<br>- 紧迫感适度:通过免费试用等方式降低用户决策门槛</td>
|
|
254
|
+
<td>
|
|
255
|
+
<!-- ⚠️ 以下为规范说明,请勿输出到最终文档 ⚠️ -->
|
|
256
|
+
*待设计图完成后,使用以下格式:*
|
|
257
|
+
<!-- ⚠️ 规范说明结束 ⚠️ -->
|
|
258
|
+
<img src="./assets/[IAP付费页面].png" alt="IAP付费页面">
|
|
259
|
+
</td>
|
|
260
|
+
</tr>
|
|
261
|
+
</table>
|
|
245
262
|
|
|
246
263
|
---
|
|
247
264
|
|