@optima-chat/optima-agent 0.5.0 → 0.5.2
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/.claude/settings.local.json +83 -0
- package/.claude/skills/ads/SKILL.md +0 -0
- package/.claude/skills/bi/SKILL.md +71 -42
- package/.claude/skills/collection/SKILL.md +88 -0
- package/.claude/skills/comfy/SKILL.md +138 -122
- package/.claude/skills/ffmpeg/SKILL.md +164 -0
- package/.claude/skills/homepage/SKILL.md +324 -0
- package/.claude/skills/i18n/SKILL.md +0 -0
- package/.claude/skills/inventory/SKILL.md +90 -79
- package/.claude/skills/markdown-pdf/SKILL.md +72 -0
- package/.claude/skills/merchant/SKILL.md +71 -68
- package/.claude/skills/order/SKILL.md +193 -21
- package/.claude/skills/product/SKILL.md +51 -6
- package/.claude/skills/product-page/SKILL.md +200 -0
- package/.claude/skills/review/SKILL.md +234 -0
- package/.claude/skills/scout/SKILL.md +116 -1
- package/.claude/skills/shipping/SKILL.md +193 -0
- package/README.md +5 -1
- package/dist/bin/bi-cli.d.ts +0 -0
- package/dist/bin/bi-cli.d.ts.map +0 -0
- package/dist/bin/bi-cli.js.map +0 -0
- package/dist/bin/comfy.d.ts +0 -0
- package/dist/bin/comfy.d.ts.map +0 -0
- package/dist/bin/comfy.js.map +0 -0
- package/dist/bin/commerce.d.ts +0 -0
- package/dist/bin/commerce.d.ts.map +0 -0
- package/dist/bin/commerce.js.map +0 -0
- package/dist/bin/google-ads.d.ts +0 -0
- package/dist/bin/google-ads.d.ts.map +0 -0
- package/dist/bin/google-ads.js.map +0 -0
- package/dist/bin/optima.d.ts +0 -0
- package/dist/bin/optima.d.ts.map +0 -0
- package/dist/bin/optima.js +3 -3
- package/dist/bin/optima.js.map +1 -1
- package/dist/bin/scout.d.ts +0 -0
- package/dist/bin/scout.d.ts.map +0 -0
- package/dist/bin/scout.js.map +0 -0
- package/dist/bin/serve.d.ts +0 -0
- package/dist/bin/serve.d.ts.map +0 -0
- package/dist/bin/serve.js +0 -0
- package/dist/bin/serve.js.map +0 -0
- package/dist/src/agent.d.ts +0 -48
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +3 -98
- package/dist/src/agent.js.map +1 -1
- package/dist/src/auth/device-flow.d.ts +0 -0
- package/dist/src/auth/device-flow.d.ts.map +0 -0
- package/dist/src/auth/device-flow.js +0 -0
- package/dist/src/auth/device-flow.js.map +0 -0
- package/dist/src/auth/index.d.ts +0 -0
- package/dist/src/auth/index.d.ts.map +0 -0
- package/dist/src/auth/index.js +0 -0
- package/dist/src/auth/index.js.map +0 -0
- package/dist/src/auth/token.d.ts +0 -0
- package/dist/src/auth/token.d.ts.map +0 -0
- package/dist/src/auth/token.js +0 -0
- package/dist/src/auth/token.js.map +0 -0
- package/dist/src/auth/types.d.ts +0 -0
- package/dist/src/auth/types.d.ts.map +0 -0
- package/dist/src/auth/types.js +0 -0
- package/dist/src/auth/types.js.map +0 -0
- package/dist/src/config.d.ts +0 -0
- package/dist/src/config.d.ts.map +0 -0
- package/dist/src/config.js +0 -0
- package/dist/src/config.js.map +0 -0
- package/dist/src/hooks-loader.d.ts +6 -0
- package/dist/src/hooks-loader.d.ts.map +1 -0
- package/dist/src/hooks-loader.js +215 -0
- package/dist/src/hooks-loader.js.map +1 -0
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/server/index.d.ts +0 -0
- package/dist/src/server/index.d.ts.map +1 -1
- package/dist/src/server/index.js +23 -6
- package/dist/src/server/index.js.map +1 -1
- package/dist/src/server/types.d.ts +15 -0
- package/dist/src/server/types.d.ts.map +1 -1
- package/dist/src/server/types.js +0 -0
- package/dist/src/server/types.js.map +0 -0
- package/dist/src/system-prompt.d.ts +0 -0
- package/dist/src/system-prompt.d.ts.map +1 -1
- package/dist/src/system-prompt.js +10 -3
- package/dist/src/system-prompt.js.map +1 -1
- package/dist/src/tools/memory.d.ts +0 -0
- package/dist/src/tools/memory.d.ts.map +0 -0
- package/dist/src/tools/memory.js +0 -0
- package/dist/src/tools/memory.js.map +0 -0
- package/dist/src/types.d.ts +1 -11
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +0 -0
- package/dist/src/types.js.map +0 -0
- package/dist/src/ui/App.d.ts +6 -0
- package/dist/src/ui/App.d.ts.map +1 -0
- package/dist/src/ui/App.js +164 -0
- package/dist/src/ui/App.js.map +1 -0
- package/dist/src/ui/components/Composer.d.ts +10 -0
- package/dist/src/ui/components/Composer.d.ts.map +1 -0
- package/dist/src/ui/components/Composer.js +13 -0
- package/dist/src/ui/components/Composer.js.map +1 -0
- package/dist/src/ui/components/Header.d.ts +7 -0
- package/dist/src/ui/components/Header.d.ts.map +1 -0
- package/dist/src/ui/components/Header.js +7 -0
- package/dist/src/ui/components/Header.js.map +1 -0
- package/dist/src/ui/components/Message.d.ts +12 -0
- package/dist/src/ui/components/Message.d.ts.map +1 -0
- package/dist/src/ui/components/Message.js +21 -0
- package/dist/src/ui/components/Message.js.map +1 -0
- package/dist/src/ui/components/MessageList.d.ts +9 -0
- package/dist/src/ui/components/MessageList.d.ts.map +1 -0
- package/dist/src/ui/components/MessageList.js +18 -0
- package/dist/src/ui/components/MessageList.js.map +1 -0
- package/dist/src/ui/components/Spinner.d.ts +6 -0
- package/dist/src/ui/components/Spinner.d.ts.map +1 -0
- package/dist/src/ui/components/Spinner.js +7 -0
- package/dist/src/ui/components/Spinner.js.map +1 -0
- package/dist/src/ui/components/StatusBar.d.ts +11 -0
- package/dist/src/ui/components/StatusBar.d.ts.map +1 -0
- package/dist/src/ui/components/StatusBar.js +7 -0
- package/dist/src/ui/components/StatusBar.js.map +1 -0
- package/dist/src/ui/components/index.d.ts +7 -0
- package/dist/src/ui/components/index.d.ts.map +1 -0
- package/dist/src/ui/components/index.js +7 -0
- package/dist/src/ui/components/index.js.map +1 -0
- package/dist/src/ui/conversation-manager.d.ts +10 -9
- package/dist/src/ui/conversation-manager.d.ts.map +1 -1
- package/dist/src/ui/conversation-manager.js +35 -2
- package/dist/src/ui/conversation-manager.js.map +1 -1
- package/dist/src/ui/headless-types.d.ts +85 -4
- package/dist/src/ui/headless-types.d.ts.map +1 -1
- package/dist/src/ui/headless-types.js +0 -0
- package/dist/src/ui/headless-types.js.map +0 -0
- package/dist/src/ui/headless.d.ts +14 -4
- package/dist/src/ui/headless.d.ts.map +1 -1
- package/dist/src/ui/headless.js +311 -139
- package/dist/src/ui/headless.js.map +1 -1
- package/dist/src/ui/index.d.ts +0 -0
- package/dist/src/ui/index.d.ts.map +0 -0
- package/dist/src/ui/index.js +0 -0
- package/dist/src/ui/index.js.map +0 -0
- package/dist/src/ui/stream.d.ts +0 -0
- package/dist/src/ui/stream.d.ts.map +1 -1
- package/dist/src/ui/stream.js +27 -5
- package/dist/src/ui/stream.js.map +1 -1
- package/dist/src/validation/error-formatter.d.ts +21 -0
- package/dist/src/validation/error-formatter.d.ts.map +1 -0
- package/dist/src/validation/error-formatter.js +98 -0
- package/dist/src/validation/error-formatter.js.map +1 -0
- package/dist/src/validation/index.d.ts +10 -0
- package/dist/src/validation/index.d.ts.map +1 -0
- package/dist/src/validation/index.js +10 -0
- package/dist/src/validation/index.js.map +1 -0
- package/dist/src/validation/json-validator.d.ts +25 -0
- package/dist/src/validation/json-validator.d.ts.map +1 -0
- package/dist/src/validation/json-validator.js +173 -0
- package/dist/src/validation/json-validator.js.map +1 -0
- package/dist/src/validation/schema.d.ts +353 -0
- package/dist/src/validation/schema.d.ts.map +1 -0
- package/dist/src/validation/schema.js +57 -0
- package/dist/src/validation/schema.js.map +1 -0
- package/dist/src/validation/suggestions.d.ts +25 -0
- package/dist/src/validation/suggestions.d.ts.map +1 -0
- package/dist/src/validation/suggestions.js +144 -0
- package/dist/src/validation/suggestions.js.map +1 -0
- package/dist/src/validation/types.d.ts +40 -0
- package/dist/src/validation/types.d.ts.map +1 -0
- package/dist/src/validation/types.js +5 -0
- package/dist/src/validation/types.js.map +1 -0
- package/dist/src/validation/yaml-validator.d.ts +25 -0
- package/dist/src/validation/yaml-validator.d.ts.map +1 -0
- package/dist/src/validation/yaml-validator.js +177 -0
- package/dist/src/validation/yaml-validator.js.map +1 -0
- package/dist/src/version.d.ts +0 -0
- package/dist/src/version.d.ts.map +0 -0
- package/dist/src/version.js +0 -0
- package/dist/src/version.js.map +0 -0
- package/package.json +1 -1
- package/.claude/skills/storefront/SKILL.md +0 -532
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ffmpeg
|
|
3
|
+
description: "Audio and video processing for e-commerce. Use when user needs to: merge audio with video (视频配音/添加背景音乐/音视频合成), compress videos (压缩视频/视频压缩), generate thumbnails (生成缩略图/视频封面), concatenate videos (视频拼接/合并视频), trim videos (视频裁切/截取片段/剪辑视频), convert formats (格式转换/转换视频)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# FFmpeg 音视频处理
|
|
7
|
+
|
|
8
|
+
## 电商场景常用任务
|
|
9
|
+
|
|
10
|
+
### 1. 音视频合成(产品视频配音/背景音乐)
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# 视频配背景音乐(音频较短时循环)
|
|
14
|
+
ffmpeg -i video.mp4 -stream_loop -1 -i audio.mp3 -shortest -c:v copy -c:a aac output.mp4
|
|
15
|
+
|
|
16
|
+
# 视频配音频(音频较长时截断)
|
|
17
|
+
ffmpeg -i video.mp4 -i audio.mp3 -shortest -c:v copy -c:a aac output.mp4
|
|
18
|
+
|
|
19
|
+
# 替换视频原有音频
|
|
20
|
+
ffmpeg -i video.mp4 -i new_audio.mp3 -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output.mp4
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**参数说明**:
|
|
24
|
+
- `-stream_loop -1` - 无限循环音频(直到视频结束)
|
|
25
|
+
- `-shortest` - 以最短的流为准(视频或音频)
|
|
26
|
+
- `-map 0:v:0 -map 1:a:0` - 手动选择第1个文件的视频+第2个文件的音频
|
|
27
|
+
|
|
28
|
+
### 2. 视频压缩(上传优化,保证展示质量)
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# 产品视频压缩(推荐:CRF 20,高质量)
|
|
32
|
+
ffmpeg -i product.mp4 -c:v libx264 -crf 20 -c:a aac output.mp4
|
|
33
|
+
|
|
34
|
+
# 标准压缩(CRF 23,平衡质量和大小)
|
|
35
|
+
ffmpeg -i video.mp4 -crf 23 output.mp4
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**电商场景 CRF 建议**:
|
|
39
|
+
- **18-20** - 产品主图视频(质量优先)
|
|
40
|
+
- **23** - 一般营销视频(平衡)
|
|
41
|
+
- **25-28** - 内部使用视频(文件大小优先)
|
|
42
|
+
|
|
43
|
+
### 3. 生成视频缩略图(产品封面)
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# 从5秒处生成缩略图
|
|
47
|
+
ffmpeg -i product_video.mp4 -ss 00:00:05 -frames:v 1 thumbnail.jpg
|
|
48
|
+
|
|
49
|
+
# 批量生成所有产品视频的缩略图
|
|
50
|
+
for video in *.mp4; do
|
|
51
|
+
ffmpeg -i "$video" -ss 00:00:05 -frames:v 1 "${video%.mp4}_thumb.jpg"
|
|
52
|
+
done
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 4. 视频拼接(多个片段合并)
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# 创建拼接列表文件
|
|
59
|
+
cat > concat_list.txt << 'EOF'
|
|
60
|
+
file 'video1.mp4'
|
|
61
|
+
file 'video2.mp4'
|
|
62
|
+
file 'video3.mp4'
|
|
63
|
+
EOF
|
|
64
|
+
|
|
65
|
+
# 拼接视频(所有视频参数相同时,快速无损)
|
|
66
|
+
ffmpeg -f concat -safe 0 -i concat_list.txt -c copy output.mp4
|
|
67
|
+
|
|
68
|
+
# 拼接视频(参数不同时,重新编码)
|
|
69
|
+
ffmpeg -f concat -safe 0 -i concat_list.txt -c:v libx264 -crf 20 -c:a aac output.mp4
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**参数说明**:
|
|
73
|
+
- `-f concat` - 使用 concat 分离器
|
|
74
|
+
- `-safe 0` - 允许不安全的文件路径(本地文件需要)
|
|
75
|
+
- `-c copy` - 无损拼接(仅当所有视频格式完全相同)
|
|
76
|
+
|
|
77
|
+
### 5. 视频裁切(截取指定片段)
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# 从第10秒开始,截取30秒
|
|
81
|
+
ffmpeg -i video.mp4 -ss 00:00:10 -t 30 -c copy output.mp4
|
|
82
|
+
|
|
83
|
+
# 从第10秒到第40秒
|
|
84
|
+
ffmpeg -i video.mp4 -ss 00:00:10 -to 00:00:40 -c copy output.mp4
|
|
85
|
+
|
|
86
|
+
# 去掉前5秒(从第5秒到结尾)
|
|
87
|
+
ffmpeg -i video.mp4 -ss 00:00:05 -c copy output.mp4
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**参数说明**:
|
|
91
|
+
- `-ss HH:MM:SS` - 开始时间
|
|
92
|
+
- `-t <秒数>` - 持续时长
|
|
93
|
+
- `-to HH:MM:SS` - 结束时间
|
|
94
|
+
- `-c copy` - 无损裁切(快速)
|
|
95
|
+
|
|
96
|
+
### 6. 格式转换(确保兼容性)
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# 快速转换(只改容器,不重新编码)
|
|
100
|
+
ffmpeg -i video.mov -c copy video.mp4
|
|
101
|
+
|
|
102
|
+
# 标准转换(重新编码)
|
|
103
|
+
ffmpeg -i video.mov -c:v libx264 -c:a aac video.mp4
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 电商工作流程
|
|
107
|
+
|
|
108
|
+
### 场景1:产品视频配背景音乐
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
# 1. 检查文件
|
|
112
|
+
ls -lh product_video.mp4 background_music.mp3
|
|
113
|
+
|
|
114
|
+
# 2. 合成(音乐循环播放)
|
|
115
|
+
ffmpeg -i product_video.mp4 -stream_loop -1 -i background_music.mp3 \
|
|
116
|
+
-shortest -c:v copy -c:a aac -b:a 192k final_video.mp4
|
|
117
|
+
|
|
118
|
+
# 3. 检查输出
|
|
119
|
+
ls -lh final_video.mp4
|
|
120
|
+
|
|
121
|
+
# 4. 告知用户:文件大小、是否需要压缩
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### 场景2:压缩产品视频后生成缩略图
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
# 1. 压缩视频(保证产品展示质量)
|
|
128
|
+
ffmpeg -i raw_product.mp4 -c:v libx264 -crf 20 -c:a aac product.mp4
|
|
129
|
+
|
|
130
|
+
# 2. 生成缩略图
|
|
131
|
+
ffmpeg -i product.mp4 -ss 00:00:05 -frames:v 1 product_thumb.jpg
|
|
132
|
+
|
|
133
|
+
# 3. 告知用户文件大小变化
|
|
134
|
+
ls -lh raw_product.mp4 product.mp4
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 场景3:批量处理多个产品视频
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
# 批量压缩并生成缩略图
|
|
141
|
+
for video in product_*.mp4; do
|
|
142
|
+
# 压缩
|
|
143
|
+
ffmpeg -i "$video" -c:v libx264 -crf 20 -c:a aac "compressed_${video}"
|
|
144
|
+
|
|
145
|
+
# 生成缩略图
|
|
146
|
+
ffmpeg -i "compressed_${video}" -ss 00:00:05 -frames:v 1 "${video%.mp4}_thumb.jpg"
|
|
147
|
+
done
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## 重要提示
|
|
151
|
+
|
|
152
|
+
### 电商场景特殊要求
|
|
153
|
+
|
|
154
|
+
- 🎨 **质量优先** - 产品视频使用 CRF 18-20,不要过度压缩
|
|
155
|
+
- 📏 **文件大小监控** - 始终告知用户处理前后的文件大小变化
|
|
156
|
+
- 🖼️ **缩略图质量** - 选择展示效果好的时间点(通常5秒处)
|
|
157
|
+
- 🎵 **音频音量** - 合成时注意背景音乐不要盖过产品解说
|
|
158
|
+
|
|
159
|
+
### 常用参数
|
|
160
|
+
|
|
161
|
+
- `-c:v copy` - 视频流无损复制(音视频合成时推荐,保持原质量)
|
|
162
|
+
- `-shortest` - 以最短流为准(音视频合成必备)
|
|
163
|
+
- `-stream_loop -1` - 循环音频(背景音乐常用)
|
|
164
|
+
- `-crf 20` - 产品视频推荐质量
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: homepage
|
|
3
|
+
description: 店铺首页配置。管理首页区块(Banner、集合列表、集合商品、特色推荐)。当用户需要配置店铺首页布局、添加轮播图、展示集合时使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## 概念
|
|
7
|
+
|
|
8
|
+
Homepage(首页)是店铺的入口页面,由多个 Section(区块)组成。每个商户有一个激活的首页配置。
|
|
9
|
+
|
|
10
|
+
- 区块按 position 排序,从上到下显示
|
|
11
|
+
- 每个区块有唯一的 handle,用于 URL 锚点定位
|
|
12
|
+
- 区块通过 settings 存储类型特定的配置
|
|
13
|
+
|
|
14
|
+
**与 Collection 的关系**:多个区块类型引用 Collection:
|
|
15
|
+
- `collections` 区块:展示多个集合入口(引用 collection slugs)
|
|
16
|
+
- `collection_products` 区块:展示某个集合的商品(引用单个 collection slug)
|
|
17
|
+
- `featured` 区块:可推荐某个集合(target_type=collection)
|
|
18
|
+
|
|
19
|
+
## 结构
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
Homepage
|
|
23
|
+
├── HomepageConfig(商户唯一)
|
|
24
|
+
│ ├── id: 配置 ID
|
|
25
|
+
│ ├── is_active: 是否激活
|
|
26
|
+
│ └── sections: 区块列表
|
|
27
|
+
│
|
|
28
|
+
└── HomepageSection(区块)
|
|
29
|
+
├── 基本信息
|
|
30
|
+
│ ├── id: 区块 ID
|
|
31
|
+
│ ├── type: 类型(见下方)
|
|
32
|
+
│ ├── handle: URL 标识
|
|
33
|
+
│ └── position: 显示顺序(0 开始)
|
|
34
|
+
│
|
|
35
|
+
├── settings: 类型特定配置(JSONB)
|
|
36
|
+
│
|
|
37
|
+
└── translations: 多语言标题/描述(JSONB)
|
|
38
|
+
└── { "zh-CN": { "title": "...", "description": "..." }, ... }
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**注意**:区块的 title 和 description 存储在 `translations` 字段中,需要指定语言代码。
|
|
42
|
+
|
|
43
|
+
## 区块类型详解
|
|
44
|
+
|
|
45
|
+
### 1. banner(图片轮播)
|
|
46
|
+
|
|
47
|
+
首页顶部的轮播广告图,支持多张图片自动轮播,每张图可设置点击跳转。
|
|
48
|
+
|
|
49
|
+
**Settings 字段**:
|
|
50
|
+
| 字段 | 类型 | 说明 |
|
|
51
|
+
|------|------|------|
|
|
52
|
+
| images | array | 图片数组(见下方) |
|
|
53
|
+
| autoplay | boolean | 是否自动播放,默认 true |
|
|
54
|
+
| interval | number | 轮播间隔(毫秒),默认 5000 |
|
|
55
|
+
|
|
56
|
+
**images 数组元素**:
|
|
57
|
+
| 字段 | 必填 | 说明 |
|
|
58
|
+
|------|------|------|
|
|
59
|
+
| url | ✓ | 图片 URL |
|
|
60
|
+
| alt | ✓ | 图片描述(SEO + 可访问性) |
|
|
61
|
+
| action_type | ✓ | 点击动作类型(见下方) |
|
|
62
|
+
| action_value | | 动作目标值 |
|
|
63
|
+
|
|
64
|
+
**action_type 取值**:
|
|
65
|
+
| 值 | 说明 | action_value |
|
|
66
|
+
|----|------|--------------|
|
|
67
|
+
| `none` | 无跳转 | null |
|
|
68
|
+
| `collection` | 跳转到集合页 | collection slug |
|
|
69
|
+
| `product` | 跳转到商品页 | product handle |
|
|
70
|
+
| `url` | 跳转到 URL | 完整 URL 或相对路径 |
|
|
71
|
+
| `section` | 滚动到页面区块 | section handle |
|
|
72
|
+
|
|
73
|
+
**示例**:
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"images": [
|
|
77
|
+
{"url": "https://cdn.../summer.jpg", "alt": "夏日促销", "action_type": "collection", "action_value": "summer-sale"},
|
|
78
|
+
{"url": "https://cdn.../promo.jpg", "alt": "活动页面", "action_type": "url", "action_value": "https://promo.example.com/event"},
|
|
79
|
+
{"url": "https://cdn.../hero.jpg", "alt": "品牌形象", "action_type": "none", "action_value": null}
|
|
80
|
+
],
|
|
81
|
+
"autoplay": true,
|
|
82
|
+
"interval": 5000
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 2. collections(集合入口列表)
|
|
87
|
+
|
|
88
|
+
展示多个集合的入口卡片,用户点击可进入对应集合页。
|
|
89
|
+
|
|
90
|
+
**Settings 字段**:
|
|
91
|
+
| 字段 | 类型 | 说明 |
|
|
92
|
+
|------|------|------|
|
|
93
|
+
| collection_slugs | array | 集合 slug 数组,按顺序展示 |
|
|
94
|
+
| layout | string | 布局方式:`grid`(网格)/ `carousel`(轮播) |
|
|
95
|
+
| show_product_count | boolean | 是否显示集合商品数量 |
|
|
96
|
+
|
|
97
|
+
**示例**:
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"collection_slugs": ["summer-sale", "new-arrivals", "best-sellers"],
|
|
101
|
+
"layout": "grid",
|
|
102
|
+
"show_product_count": true
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 3. collection_products(集合商品展示)
|
|
107
|
+
|
|
108
|
+
展示某个集合内的商品列表,支持自动获取或手动指定。
|
|
109
|
+
|
|
110
|
+
**Settings 字段**:
|
|
111
|
+
| 字段 | 类型 | 说明 |
|
|
112
|
+
|------|------|------|
|
|
113
|
+
| collection_slug | string | 集合 slug(必需) |
|
|
114
|
+
| mode | string | `auto`(自动获取)/ `manual`(手动指定) |
|
|
115
|
+
| product_handles | array | mode=manual 时,手动指定的商品 handle 列表 |
|
|
116
|
+
| limit | number | mode=auto 时,最多展示数量,默认 8 |
|
|
117
|
+
| sort_by | string | 排序字段:`created_at` / `price` / `title` |
|
|
118
|
+
| sort_order | string | 排序方向:`asc` / `desc` |
|
|
119
|
+
|
|
120
|
+
**示例**:
|
|
121
|
+
```json
|
|
122
|
+
{
|
|
123
|
+
"collection_slug": "new-arrivals",
|
|
124
|
+
"mode": "auto",
|
|
125
|
+
"limit": 8,
|
|
126
|
+
"sort_by": "created_at",
|
|
127
|
+
"sort_order": "desc"
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 4. featured(特色推荐)
|
|
132
|
+
|
|
133
|
+
突出展示某个集合或商品,通常带有大图和 CTA 按钮。
|
|
134
|
+
|
|
135
|
+
**Settings 字段**:
|
|
136
|
+
| 字段 | 类型 | 说明 |
|
|
137
|
+
|------|------|------|
|
|
138
|
+
| target_type | string | `collection`(推荐集合)/ `product`(推荐商品) |
|
|
139
|
+
| target_handle | string | 目标的 slug/handle |
|
|
140
|
+
| media_id | string | 封面图片的 media ID |
|
|
141
|
+
| media_url | string | 或直接提供封面图片 URL |
|
|
142
|
+
| cta_text | string | CTA 按钮文字,如 "立即查看" |
|
|
143
|
+
| background_color | string | 背景颜色,如 "#f5f5f5" |
|
|
144
|
+
|
|
145
|
+
**示例(推荐集合)**:
|
|
146
|
+
```json
|
|
147
|
+
{
|
|
148
|
+
"target_type": "collection",
|
|
149
|
+
"target_handle": "summer-sale",
|
|
150
|
+
"media_url": "https://cdn.../featured.jpg",
|
|
151
|
+
"cta_text": "查看夏日精选",
|
|
152
|
+
"background_color": "#fff8e1"
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**示例(推荐商品)**:
|
|
157
|
+
```json
|
|
158
|
+
{
|
|
159
|
+
"target_type": "product",
|
|
160
|
+
"target_handle": "ceramic-cup-white",
|
|
161
|
+
"media_url": "https://cdn.../product-hero.jpg",
|
|
162
|
+
"cta_text": "立即购买"
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## 典型场景
|
|
167
|
+
|
|
168
|
+
当用户说:
|
|
169
|
+
- "查看首页配置" → `commerce homepage get-config`
|
|
170
|
+
- "查看首页区块" → `commerce homepage list`
|
|
171
|
+
- "添加轮播图" → `commerce homepage create-banner --title "主Banner" --lang <识别语言> --images '[{"url":"..."}]'`
|
|
172
|
+
- "添加集合入口" → `commerce homepage create-collections --title "精选系列" --lang <识别语言> --slugs "a,b,c"`
|
|
173
|
+
- "添加集合商品" → `commerce homepage create-collection-products --title "新品" --lang <识别语言> --slug new-arrivals`
|
|
174
|
+
- "添加特色推荐" → `commerce homepage create-featured --title "推荐" --lang <识别语言> --target-type collection --target-handle xx --cta "查看" --image-url "..."`
|
|
175
|
+
- "更新轮播图图片" → `commerce homepage update-images --id xx --images '[...]'`
|
|
176
|
+
- "修改区块标题" → `commerce i18n homepage set --section-id xx --lang <识别语言> --title "新标题"`
|
|
177
|
+
- "给区块添加描述" → `commerce i18n homepage set --section-id xx --lang <识别语言> --description "描述"`
|
|
178
|
+
- "调整区块顺序" → `commerce homepage reorder --moves '[{"section_id":"id1","new_position":0}]'`
|
|
179
|
+
- "使用模板" → `commerce homepage switch-template --template-key minimal`
|
|
180
|
+
- "删除区块" → `commerce homepage delete --id xx --yes`
|
|
181
|
+
|
|
182
|
+
## 命令参考
|
|
183
|
+
|
|
184
|
+
### 配置管理
|
|
185
|
+
- `commerce homepage get-config` - 查看首页配置
|
|
186
|
+
- `commerce homepage list-templates` - 列出可用模板
|
|
187
|
+
- `commerce homepage switch-template --template-key <key>` - 切换模板(minimal|standard)
|
|
188
|
+
- `commerce homepage delete-config --yes` - 删除首页配置
|
|
189
|
+
|
|
190
|
+
### 创建区块(支持 --title --description --lang)
|
|
191
|
+
- `commerce homepage create-banner --title <title> --lang <code> --images <json>` - 创建轮播图
|
|
192
|
+
- `commerce homepage create-collections --title <title> --lang <code> --slugs <slugs>` - 创建集合入口
|
|
193
|
+
- `commerce homepage create-collection-products --title <title> --lang <code> --slug <slug>` - 创建集合商品
|
|
194
|
+
- `commerce homepage create-featured --title <title> --lang <code> --target-type <type> --target-handle <handle> --cta <text> --image-url <url>` - 创建特色推荐
|
|
195
|
+
|
|
196
|
+
### 区块管理
|
|
197
|
+
- `commerce homepage list` - 列出所有区块
|
|
198
|
+
- `commerce homepage get --id <id>` - 查看区块详情
|
|
199
|
+
- `commerce homepage update --id <id>` - 更新区块
|
|
200
|
+
- `commerce homepage delete --id <id> --yes` - 删除区块
|
|
201
|
+
- `commerce homepage reorder --moves <json>` - 重新排序(JSON 格式:`[{"section_id":"xx","new_position":0}]`)
|
|
202
|
+
|
|
203
|
+
### 区块设置
|
|
204
|
+
- `commerce homepage update-images --id <id> --images <json>` - 更新 banner 图片
|
|
205
|
+
- `commerce homepage update-collections --id <id> --slugs <slugs>` - 更新 collections 集合
|
|
206
|
+
- `commerce homepage update-target --id <id> --type <type> --handle <handle>` - 更新 featured 目标
|
|
207
|
+
- `commerce homepage patch-settings --id <id> --settings <json>` - 通用设置更新
|
|
208
|
+
|
|
209
|
+
### 多语言翻译
|
|
210
|
+
- `commerce i18n homepage list --section-id <id>` - 查看区块所有翻译
|
|
211
|
+
- `commerce i18n homepage set --section-id <id> --lang <code> --title <title> --description <desc>` - 设置翻译
|
|
212
|
+
- `commerce i18n homepage delete --section-id <id> --lang <code> --yes` - 删除翻译
|
|
213
|
+
- `commerce i18n languages` - 查看支持的语言列表
|
|
214
|
+
|
|
215
|
+
## 语言代码
|
|
216
|
+
|
|
217
|
+
设置标题和描述时必须指定 `--lang`。
|
|
218
|
+
|
|
219
|
+
支持的语言:`zh-CN`、`en-US`、`ja-JP`、`es-ES`、`vi-VN`
|
|
220
|
+
|
|
221
|
+
根据用户提供的文字内容识别语言。如果无法确定,询问用户。
|
|
222
|
+
|
|
223
|
+
## 典型操作示例
|
|
224
|
+
|
|
225
|
+
### 快速开始:使用模板
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
# 查看可用模板
|
|
229
|
+
commerce homepage list-templates
|
|
230
|
+
|
|
231
|
+
# 切换到标准模板(会创建预设区块)
|
|
232
|
+
commerce homepage switch-template --template-key standard --yes
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### 创建轮播图
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
# 创建 banner 并设置图片
|
|
239
|
+
commerce homepage create-banner \
|
|
240
|
+
--title "首页轮播" \
|
|
241
|
+
--lang zh-CN \
|
|
242
|
+
--images '[{"url":"https://cdn.../img1.jpg","link":"/sale"}]'
|
|
243
|
+
|
|
244
|
+
# 后续更新图片
|
|
245
|
+
commerce homepage update-images \
|
|
246
|
+
--id section_xxx \
|
|
247
|
+
--images '[{"url":"https://cdn.../img2.jpg","alt":"夏日促销","link":"/summer"}]'
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### 创建集合入口
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
# 创建 collections 区块
|
|
254
|
+
commerce homepage create-collections \
|
|
255
|
+
--title "精选系列" \
|
|
256
|
+
--lang zh-CN \
|
|
257
|
+
--slugs "new-arrivals,best-sellers,summer-sale"
|
|
258
|
+
|
|
259
|
+
# 后续更新集合列表
|
|
260
|
+
commerce homepage update-collections --id section_xxx --slugs "a,b,c"
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### 创建集合商品展示
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
# 创建 collection_products 区块
|
|
267
|
+
commerce homepage create-collection-products \
|
|
268
|
+
--title "新品上市" \
|
|
269
|
+
--lang zh-CN \
|
|
270
|
+
--slug new-arrivals \
|
|
271
|
+
--limit 8
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### 创建特色推荐
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
# 推荐集合
|
|
278
|
+
commerce homepage create-featured \
|
|
279
|
+
--title "本周推荐" \
|
|
280
|
+
--description "精选好物,限时优惠" \
|
|
281
|
+
--lang zh-CN \
|
|
282
|
+
--target-type collection \
|
|
283
|
+
--target-handle weekly-picks \
|
|
284
|
+
--cta "立即查看" \
|
|
285
|
+
--image-url "https://cdn.../featured.jpg"
|
|
286
|
+
|
|
287
|
+
# 推荐商品
|
|
288
|
+
commerce homepage create-featured \
|
|
289
|
+
--title "爆款单品" \
|
|
290
|
+
--lang zh-CN \
|
|
291
|
+
--target-type product \
|
|
292
|
+
--target-handle ceramic-cup-white \
|
|
293
|
+
--cta "立即购买" \
|
|
294
|
+
--image-url "https://cdn.../product.jpg"
|
|
295
|
+
|
|
296
|
+
# 后续更新目标
|
|
297
|
+
commerce homepage update-target --id section_xxx --type collection --handle "new-picks"
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### 更新标题和描述
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
# 更新中文
|
|
304
|
+
commerce i18n homepage set \
|
|
305
|
+
--section-id section_xxx \
|
|
306
|
+
--lang zh-CN \
|
|
307
|
+
--title "新标题" \
|
|
308
|
+
--description "新描述"
|
|
309
|
+
|
|
310
|
+
# 添加英文翻译
|
|
311
|
+
commerce i18n homepage set \
|
|
312
|
+
--section-id section_xxx \
|
|
313
|
+
--lang en-US \
|
|
314
|
+
--title "New Title" \
|
|
315
|
+
--description "New description"
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
## 注意事项
|
|
319
|
+
|
|
320
|
+
- **区块顺序**:使用 `reorder` 调整,position 从 0 开始
|
|
321
|
+
- **模板切换**:会创建新区块并停用旧区块,谨慎操作
|
|
322
|
+
- **图片格式**:banner images 需要完整的 JSON 数组,每个元素必须有 url 和 alt
|
|
323
|
+
- **集合引用**:确保引用的 collection slug 存在,否则前端可能显示空
|
|
324
|
+
- **删除确认**:删除操作需要 `--yes` 参数
|
|
File without changes
|