@optima-chat/optima-agent 0.5.0 → 0.5.1

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.
Files changed (179) hide show
  1. package/.claude/settings.local.json +83 -0
  2. package/.claude/skills/ads/SKILL.md +0 -0
  3. package/.claude/skills/bi/SKILL.md +71 -42
  4. package/.claude/skills/collection/SKILL.md +88 -0
  5. package/.claude/skills/comfy/SKILL.md +138 -122
  6. package/.claude/skills/ffmpeg/SKILL.md +164 -0
  7. package/.claude/skills/homepage/SKILL.md +324 -0
  8. package/.claude/skills/i18n/SKILL.md +0 -0
  9. package/.claude/skills/inventory/SKILL.md +90 -79
  10. package/.claude/skills/markdown-pdf/SKILL.md +72 -0
  11. package/.claude/skills/merchant/SKILL.md +71 -68
  12. package/.claude/skills/order/SKILL.md +193 -21
  13. package/.claude/skills/product/SKILL.md +51 -6
  14. package/.claude/skills/product-page/SKILL.md +200 -0
  15. package/.claude/skills/review/SKILL.md +234 -0
  16. package/.claude/skills/scout/SKILL.md +116 -1
  17. package/.claude/skills/shipping/SKILL.md +193 -0
  18. package/README.md +5 -1
  19. package/dist/bin/bi-cli.d.ts +0 -0
  20. package/dist/bin/bi-cli.d.ts.map +0 -0
  21. package/dist/bin/bi-cli.js.map +0 -0
  22. package/dist/bin/comfy.d.ts +0 -0
  23. package/dist/bin/comfy.d.ts.map +0 -0
  24. package/dist/bin/comfy.js.map +0 -0
  25. package/dist/bin/commerce.d.ts +0 -0
  26. package/dist/bin/commerce.d.ts.map +0 -0
  27. package/dist/bin/commerce.js.map +0 -0
  28. package/dist/bin/google-ads.d.ts +0 -0
  29. package/dist/bin/google-ads.d.ts.map +0 -0
  30. package/dist/bin/google-ads.js.map +0 -0
  31. package/dist/bin/optima.d.ts +0 -0
  32. package/dist/bin/optima.d.ts.map +0 -0
  33. package/dist/bin/optima.js +3 -3
  34. package/dist/bin/optima.js.map +1 -1
  35. package/dist/bin/scout.d.ts +0 -0
  36. package/dist/bin/scout.d.ts.map +0 -0
  37. package/dist/bin/scout.js.map +0 -0
  38. package/dist/bin/serve.d.ts +0 -0
  39. package/dist/bin/serve.d.ts.map +0 -0
  40. package/dist/bin/serve.js +0 -0
  41. package/dist/bin/serve.js.map +0 -0
  42. package/dist/src/agent.d.ts +0 -48
  43. package/dist/src/agent.d.ts.map +1 -1
  44. package/dist/src/agent.js +3 -98
  45. package/dist/src/agent.js.map +1 -1
  46. package/dist/src/auth/device-flow.d.ts +0 -0
  47. package/dist/src/auth/device-flow.d.ts.map +0 -0
  48. package/dist/src/auth/device-flow.js +0 -0
  49. package/dist/src/auth/device-flow.js.map +0 -0
  50. package/dist/src/auth/index.d.ts +0 -0
  51. package/dist/src/auth/index.d.ts.map +0 -0
  52. package/dist/src/auth/index.js +0 -0
  53. package/dist/src/auth/index.js.map +0 -0
  54. package/dist/src/auth/token.d.ts +0 -0
  55. package/dist/src/auth/token.d.ts.map +0 -0
  56. package/dist/src/auth/token.js +0 -0
  57. package/dist/src/auth/token.js.map +0 -0
  58. package/dist/src/auth/types.d.ts +0 -0
  59. package/dist/src/auth/types.d.ts.map +0 -0
  60. package/dist/src/auth/types.js +0 -0
  61. package/dist/src/auth/types.js.map +0 -0
  62. package/dist/src/config.d.ts +0 -0
  63. package/dist/src/config.d.ts.map +0 -0
  64. package/dist/src/config.js +0 -0
  65. package/dist/src/config.js.map +0 -0
  66. package/dist/src/hooks-loader.d.ts +6 -0
  67. package/dist/src/hooks-loader.d.ts.map +1 -0
  68. package/dist/src/hooks-loader.js +215 -0
  69. package/dist/src/hooks-loader.js.map +1 -0
  70. package/dist/src/index.d.ts +3 -3
  71. package/dist/src/index.d.ts.map +1 -1
  72. package/dist/src/index.js +1 -1
  73. package/dist/src/index.js.map +1 -1
  74. package/dist/src/server/index.d.ts +0 -0
  75. package/dist/src/server/index.d.ts.map +0 -0
  76. package/dist/src/server/index.js +1 -1
  77. package/dist/src/server/index.js.map +1 -1
  78. package/dist/src/server/types.d.ts +0 -0
  79. package/dist/src/server/types.d.ts.map +0 -0
  80. package/dist/src/server/types.js +0 -0
  81. package/dist/src/server/types.js.map +0 -0
  82. package/dist/src/system-prompt.d.ts +0 -0
  83. package/dist/src/system-prompt.d.ts.map +1 -1
  84. package/dist/src/system-prompt.js +10 -3
  85. package/dist/src/system-prompt.js.map +1 -1
  86. package/dist/src/tools/memory.d.ts +0 -0
  87. package/dist/src/tools/memory.d.ts.map +0 -0
  88. package/dist/src/tools/memory.js +0 -0
  89. package/dist/src/tools/memory.js.map +0 -0
  90. package/dist/src/types.d.ts +1 -11
  91. package/dist/src/types.d.ts.map +1 -1
  92. package/dist/src/types.js +0 -0
  93. package/dist/src/types.js.map +0 -0
  94. package/dist/src/ui/App.d.ts +6 -0
  95. package/dist/src/ui/App.d.ts.map +1 -0
  96. package/dist/src/ui/App.js +164 -0
  97. package/dist/src/ui/App.js.map +1 -0
  98. package/dist/src/ui/components/Composer.d.ts +10 -0
  99. package/dist/src/ui/components/Composer.d.ts.map +1 -0
  100. package/dist/src/ui/components/Composer.js +13 -0
  101. package/dist/src/ui/components/Composer.js.map +1 -0
  102. package/dist/src/ui/components/Header.d.ts +7 -0
  103. package/dist/src/ui/components/Header.d.ts.map +1 -0
  104. package/dist/src/ui/components/Header.js +7 -0
  105. package/dist/src/ui/components/Header.js.map +1 -0
  106. package/dist/src/ui/components/Message.d.ts +12 -0
  107. package/dist/src/ui/components/Message.d.ts.map +1 -0
  108. package/dist/src/ui/components/Message.js +21 -0
  109. package/dist/src/ui/components/Message.js.map +1 -0
  110. package/dist/src/ui/components/MessageList.d.ts +9 -0
  111. package/dist/src/ui/components/MessageList.d.ts.map +1 -0
  112. package/dist/src/ui/components/MessageList.js +18 -0
  113. package/dist/src/ui/components/MessageList.js.map +1 -0
  114. package/dist/src/ui/components/Spinner.d.ts +6 -0
  115. package/dist/src/ui/components/Spinner.d.ts.map +1 -0
  116. package/dist/src/ui/components/Spinner.js +7 -0
  117. package/dist/src/ui/components/Spinner.js.map +1 -0
  118. package/dist/src/ui/components/StatusBar.d.ts +11 -0
  119. package/dist/src/ui/components/StatusBar.d.ts.map +1 -0
  120. package/dist/src/ui/components/StatusBar.js +7 -0
  121. package/dist/src/ui/components/StatusBar.js.map +1 -0
  122. package/dist/src/ui/components/index.d.ts +7 -0
  123. package/dist/src/ui/components/index.d.ts.map +1 -0
  124. package/dist/src/ui/components/index.js +7 -0
  125. package/dist/src/ui/components/index.js.map +1 -0
  126. package/dist/src/ui/conversation-manager.d.ts +10 -9
  127. package/dist/src/ui/conversation-manager.d.ts.map +1 -1
  128. package/dist/src/ui/conversation-manager.js +35 -2
  129. package/dist/src/ui/conversation-manager.js.map +1 -1
  130. package/dist/src/ui/headless-types.d.ts +85 -4
  131. package/dist/src/ui/headless-types.d.ts.map +1 -1
  132. package/dist/src/ui/headless-types.js +0 -0
  133. package/dist/src/ui/headless-types.js.map +0 -0
  134. package/dist/src/ui/headless.d.ts +14 -4
  135. package/dist/src/ui/headless.d.ts.map +1 -1
  136. package/dist/src/ui/headless.js +311 -139
  137. package/dist/src/ui/headless.js.map +1 -1
  138. package/dist/src/ui/index.d.ts +0 -0
  139. package/dist/src/ui/index.d.ts.map +0 -0
  140. package/dist/src/ui/index.js +0 -0
  141. package/dist/src/ui/index.js.map +0 -0
  142. package/dist/src/ui/stream.d.ts +0 -0
  143. package/dist/src/ui/stream.d.ts.map +1 -1
  144. package/dist/src/ui/stream.js +27 -5
  145. package/dist/src/ui/stream.js.map +1 -1
  146. package/dist/src/validation/error-formatter.d.ts +21 -0
  147. package/dist/src/validation/error-formatter.d.ts.map +1 -0
  148. package/dist/src/validation/error-formatter.js +98 -0
  149. package/dist/src/validation/error-formatter.js.map +1 -0
  150. package/dist/src/validation/index.d.ts +10 -0
  151. package/dist/src/validation/index.d.ts.map +1 -0
  152. package/dist/src/validation/index.js +10 -0
  153. package/dist/src/validation/index.js.map +1 -0
  154. package/dist/src/validation/json-validator.d.ts +25 -0
  155. package/dist/src/validation/json-validator.d.ts.map +1 -0
  156. package/dist/src/validation/json-validator.js +173 -0
  157. package/dist/src/validation/json-validator.js.map +1 -0
  158. package/dist/src/validation/schema.d.ts +353 -0
  159. package/dist/src/validation/schema.d.ts.map +1 -0
  160. package/dist/src/validation/schema.js +57 -0
  161. package/dist/src/validation/schema.js.map +1 -0
  162. package/dist/src/validation/suggestions.d.ts +25 -0
  163. package/dist/src/validation/suggestions.d.ts.map +1 -0
  164. package/dist/src/validation/suggestions.js +144 -0
  165. package/dist/src/validation/suggestions.js.map +1 -0
  166. package/dist/src/validation/types.d.ts +40 -0
  167. package/dist/src/validation/types.d.ts.map +1 -0
  168. package/dist/src/validation/types.js +5 -0
  169. package/dist/src/validation/types.js.map +1 -0
  170. package/dist/src/validation/yaml-validator.d.ts +25 -0
  171. package/dist/src/validation/yaml-validator.d.ts.map +1 -0
  172. package/dist/src/validation/yaml-validator.js +177 -0
  173. package/dist/src/validation/yaml-validator.js.map +1 -0
  174. package/dist/src/version.d.ts +0 -0
  175. package/dist/src/version.d.ts.map +0 -0
  176. package/dist/src/version.js +0 -0
  177. package/dist/src/version.js.map +0 -0
  178. package/package.json +1 -1
  179. 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