@round2ai/r2-cli 1.0.12-beta.0 → 1.0.12-beta.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.
- package/README.md +24 -7
- package/dist/README.md +24 -7
- package/dist/pages/login.html +219 -57
- package/dist/pages/xianyu-auth.html +244 -67
- package/dist/r2-cli.js +2160 -46
- package/package.json +3 -3
- package/scripts/install-skills.js +30 -2
- package/skills/r2-auth/SKILL.md +1 -1
- package/skills/r2-goods/SKILL.md +82 -352
- package/skills/r2-goods/references/r2-goods-hangup.md +284 -0
- package/skills/r2-goods/references/r2-goods-listing.md +137 -0
- package/skills/r2-goods/references/r2-goods-query.md +63 -0
- package/skills/r2-shared/SKILL.md +40 -17
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
# R2-Goods 闲鱼挂售(hang-up)
|
|
2
|
+
|
|
3
|
+
> **Prerequisite:** 读取 [`../SKILL.md`](../SKILL.md) 了解路由决策和命令概览。
|
|
4
|
+
|
|
5
|
+
挂售模式支持完整商品信息:图片、类目、属性等。与普通上架(`goods up`)是不同流程。
|
|
6
|
+
|
|
7
|
+
**核心理念**:**图片里能看到的,就别问用户**。Agent 从图片中提取一切可识别的信息,用户只需要提供价格和商家编码。
|
|
8
|
+
|
|
9
|
+
## 核心原则
|
|
10
|
+
|
|
11
|
+
- **图片优先**:所有字段优先从图片提取,图片无法识别时才问用户
|
|
12
|
+
- 必须问用户的只有:**价格、商家编码**
|
|
13
|
+
- **必须问用户的条件**:价格(永远无法从图片判断)和商家编码(用户自定义)。其他一切字段都应尝试从图片获取
|
|
14
|
+
- **描述必须自动生成**:基于 AI 识别的品牌+款式+颜色+材质+货号自动组合,不要标记为"需要补充"
|
|
15
|
+
- **品牌必须双传**:`--brand-name`(文本字段)+ itemAttrs 中的一项(含 propId/valueId/valueName),缺一不可
|
|
16
|
+
- **季节自动推断**:根据商品类型推断适用季节(夹克/风衣→春秋季,羽绒服→秋冬季,T恤/短裤→夏季),不需要问用户
|
|
17
|
+
- **尺码/货号从标签读取**:如果图片中有标签/吊牌/水洗标,尝试读取尺码和货号,读不到时才问用户
|
|
18
|
+
- **标题自动组合**:品牌+款式+颜色+尺码+成色,自动组合为标题
|
|
19
|
+
- 提交成功后展示上架结果摘要
|
|
20
|
+
|
|
21
|
+
## 图片识别降级策略
|
|
22
|
+
|
|
23
|
+
| Agent 能力 | 处理方式 |
|
|
24
|
+
|------------|----------|
|
|
25
|
+
| 能查看图片(多模态) | 用 Read 工具读图 → 自动识别品牌/成色/类目/描述 |
|
|
26
|
+
| 不能查看图片 | 跳过识别 → 向用户询问品牌、类目、成色、描述等信息 |
|
|
27
|
+
|
|
28
|
+
> 不同 Agent 能力不同(Claude Code / Gemini 支持读图,部分 Agent 不支持)。Agent 应自行判断是否能识别图片,不能则直接走询问路径。两条路径最终都走相同的 submit 提交。
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 第 1 步:上传图片 + 识别商品信息(并行)
|
|
33
|
+
|
|
34
|
+
**上传图片**:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
r2-cli goods hang-up upload-images --shop-id <shopId> --files /path/img1.jpg,/path/img2.jpg --json
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
返回:
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"success": true,
|
|
45
|
+
"images": [
|
|
46
|
+
{ "value": "1086608743767730915" },
|
|
47
|
+
{ "value": "1086608743823622409" }
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
> 图片路径是用户本地文件路径。`--image-ids` 保持字符串,不要转数字(19 位 ID 会精度丢失)。
|
|
53
|
+
|
|
54
|
+
**同时尝试识别图片**:如果 Agent 支持多模态(如 Claude Code、Gemini),用 Read 工具查看用户图片文件,识别以下信息。不支持则跳过,全部改为向用户询问。
|
|
55
|
+
|
|
56
|
+
> **多图不一致处理**:如果多张图片显示不同商品(如不同款式、不同品牌),Agent 应识别后告知用户,只保留同一商品的图片。不要把不同商品混在一起提交。
|
|
57
|
+
|
|
58
|
+
**图片识别 vs 用户操作**:
|
|
59
|
+
|
|
60
|
+
| 字段 | 可从图片识别? | 处理方式 |
|
|
61
|
+
|------|---------------|----------|
|
|
62
|
+
| `--title`(标题) | ✅ | **自动组合**:品牌+款式+颜色+尺码+成色,汇总确认 |
|
|
63
|
+
| `--desc`(描述) | ✅ | **自动生成**:品牌+系列+款式+颜色+材质+货号+成色组合,不要标记为"需要补充" |
|
|
64
|
+
| `--stuff-status`(成色) | ✅ | 自动判断,汇总确认 |
|
|
65
|
+
| `--brand-name`(品牌) | ✅ | 识别后调 brands 搜索确认,**同时加入 itemAttrs**,汇总确认 |
|
|
66
|
+
| `--category-id` / `--channel-cat-id` | ✅ | 自动推断,汇总确认 |
|
|
67
|
+
| 季节属性 | ✅ | **自动推断**:夹克/风衣→春秋季,羽绒服→秋冬季,T恤/短裤→夏季,卫衣→春秋季等 |
|
|
68
|
+
| `--size`(尺码) | ⚠️ | 有标签/吊牌则读取,无则汇总时问 |
|
|
69
|
+
| `--goods-no`(货号) | ⚠️ | 有标签则读取,无则留空 |
|
|
70
|
+
| 款式/颜色/材质属性 | ⚠️ | 能识别则自动匹配 propsValues,不能则汇总时问 |
|
|
71
|
+
| `--price`(售价) | ❌ | **必须问用户** |
|
|
72
|
+
| `--out-item-no`(商家编码) | ❌ | **必须问用户** |
|
|
73
|
+
| `--shop-id`(店铺) | ❌ | 只有一个店铺时自动选,多个则问 |
|
|
74
|
+
|
|
75
|
+
**成色判断映射**:
|
|
76
|
+
|
|
77
|
+
| 图片中商品状态 | `--stuff-status` 值 |
|
|
78
|
+
|----------------|---------------------|
|
|
79
|
+
| 带吊牌/未拆封 | `100`(全新) |
|
|
80
|
+
| 几乎无使用痕迹 | `-1`(准新)或 `99`(99新) |
|
|
81
|
+
| 轻微使用痕迹 | `95`(95新) |
|
|
82
|
+
| 明显使用痕迹 | `90`(9新) |
|
|
83
|
+
|
|
84
|
+
**季节推断映射**:
|
|
85
|
+
|
|
86
|
+
| 商品类型 | 适用季节 |
|
|
87
|
+
|----------|----------|
|
|
88
|
+
| 夹克、风衣、卫衣、针织衫 | 春秋季 |
|
|
89
|
+
| 羽绒服、棉衣、毛呢大衣 | 秋冬季 |
|
|
90
|
+
| T恤、短裤、背心、凉鞋 | 夏季 |
|
|
91
|
+
| 基础款衬衫、休闲裤 | 四季 |
|
|
92
|
+
|
|
93
|
+
**如果用户没提供价格和商家编码,此时询问**(不要留到最后)。
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 第 2 步:自动匹配类目 + 属性
|
|
98
|
+
|
|
99
|
+
**获取类目 → 自动匹配**:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
r2-cli goods hang-up categories --json
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Agent 根据图片识别结果自动匹配类目(不需要用户从列表中选)。只在识别不确定时才展示列表。
|
|
106
|
+
|
|
107
|
+
**获取属性 → 自动匹配**:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
r2-cli goods hang-up props --channel-cat-id <channelCatId> --json
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Agent 遍历所有属性,尽量自动匹配:
|
|
114
|
+
|
|
115
|
+
| 属性 | 处理方式 |
|
|
116
|
+
|------|----------|
|
|
117
|
+
| 图片可识别的(款式/成色/颜色/材质等) | 自动匹配 `propsValues` 中的对应值 |
|
|
118
|
+
| 品牌 | 用识别结果调 `brands` 搜索,自动选取精确匹配 |
|
|
119
|
+
| 图片无法识别的(季节/裙长等) | 留空,汇总时让用户补充 |
|
|
120
|
+
|
|
121
|
+
> **props API 说明**:`props` 返回所有属性及其 `propsValues`(非品牌属性可直接从这里选值);品牌属性需额外调用 `brands` 搜索。
|
|
122
|
+
|
|
123
|
+
**品牌精确匹配规则**:brands 搜索结果中必须选**完全匹配**的官方名称(如搜 Nike → 只选 `Nike/耐克`,忽略 BACHNIKE、NIKE 7 等)
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
r2-cli goods hang-up brands --channel-cat-id <id> --prop-id <品牌propId> --key "Nike" --json
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
最终构建 `--item-attrs`(**注意 propId 和 valueId 是不同字段**):
|
|
130
|
+
|
|
131
|
+
**⚠️ 品牌必须同时出现在 itemAttrs 和 --brand-name 中**。只传 `--brand-name` 不会把品牌写入商品属性,品牌必须作为 itemAttrs 的一项传入(含 channelCatId、propId、valueId、valueName)。
|
|
132
|
+
|
|
133
|
+
```json
|
|
134
|
+
[
|
|
135
|
+
{ "channelCatId": "xxx", "propId": "83b8f62c...", "valueId": "68af4e8f...", "valueName": "Nike/耐克" },
|
|
136
|
+
{ "channelCatId": "xxx", "propId": "1d6d7611...", "valueId": "af8266ea...", "valueName": "吊带" },
|
|
137
|
+
{ "channelCatId": "xxx", "propId": "3b9f06b2...", "valueId": "d114e6ab...", "valueName": "全新" }
|
|
138
|
+
]
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 第 3 步:汇总展示 → 补充缺失 → 提交
|
|
144
|
+
|
|
145
|
+
Agent 将所有自动填充和识别结果汇总展示给用户,**一次确认**:
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
商品信息(自动识别 + 需要你补充):
|
|
149
|
+
✅ 标题:Nike 低帮运动鞋 白色 42码 全新(自动生成)
|
|
150
|
+
✅ 品牌:Nike/耐克(图片识别)
|
|
151
|
+
✅ 类目:男士鞋靴 → 低帮鞋(自动匹配)
|
|
152
|
+
✅ 成色:全新(图片识别)
|
|
153
|
+
✅ 描述:Nike 低帮运动鞋...(自动生成)
|
|
154
|
+
✅ 款式:运动鞋(图片识别)
|
|
155
|
+
✅ 鞋码:42(图片识别)
|
|
156
|
+
❓ 季节:?(无法识别,请选择:春季/夏季/秋季/冬季/四季)
|
|
157
|
+
💰 价格:?(必填)
|
|
158
|
+
📋 商家编码:?(必填)
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**处理顺序**:
|
|
162
|
+
1. 展示汇总信息
|
|
163
|
+
2. 让用户补充缺失字段(价格、商家编码、无法识别的属性)
|
|
164
|
+
3. 用户确认后直接提交
|
|
165
|
+
|
|
166
|
+
**所有参数就绪后直接提交,不需要用户确认**:
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
r2-cli goods hang-up submit \
|
|
170
|
+
--shop-id <shopId> \
|
|
171
|
+
--title "商品标题" \
|
|
172
|
+
--price 599 \
|
|
173
|
+
--category-id <catId> \
|
|
174
|
+
--channel-cat-id <channelCatId> \
|
|
175
|
+
--image-ids "id1,id2" \
|
|
176
|
+
--stuff-status 95 \
|
|
177
|
+
--desc "商品描述(自动生成,包含品牌/款式/颜色/材质/货号)" \
|
|
178
|
+
--out-item-no "商家编码" \
|
|
179
|
+
--brand-name "Nike/耐克" \
|
|
180
|
+
--size "42" \
|
|
181
|
+
--item-attrs '[{"channelCatId":"xxx","propId":"83b8f62c...","valueId":"品牌valueId","valueName":"Nike/耐克"},{"channelCatId":"xxx","propId":"3b9f06b2...","valueId":"d114e6ab...","valueName":"全新"},{"channelCatId":"xxx","propId":"6562df9f...","valueId":"尺码valueId","valueName":"42"}]' \
|
|
182
|
+
--json
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
成功返回:
|
|
186
|
+
|
|
187
|
+
```json
|
|
188
|
+
{ "success": true, "data": "上架成功" }
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**提交后展示上架结果摘要**(让用户知道上架了什么):
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
上架成功!
|
|
195
|
+
- 标题:Nike 低帮运动鞋 白色 42码
|
|
196
|
+
- 价格:¥99999
|
|
197
|
+
- 品牌:Nike/耐克
|
|
198
|
+
- 类目:男士鞋靴 → 低帮鞋
|
|
199
|
+
- 成色:全新
|
|
200
|
+
- 店铺:xxx
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## 必填字段处理
|
|
206
|
+
|
|
207
|
+
缺少时**在流程中尽早询问用户**,不要等所有信息都收集完再问:
|
|
208
|
+
|
|
209
|
+
| 缺失字段 | 何时询问 | 询问方式 |
|
|
210
|
+
|----------|----------|----------|
|
|
211
|
+
| `--price`(售价) | 上传图片时 | "这个商品上架价格是多少?" |
|
|
212
|
+
| `--out-item-no`(商家编码) | 上传图片时 | "商家编码是什么?(同店铺唯一标识)" |
|
|
213
|
+
| `--shop-id`(店铺) | 流程开始时 | 展示店铺列表让用户选择 |
|
|
214
|
+
| `--title`(标题) | 图片识别无法生成时 | "商品标题用什么?" |
|
|
215
|
+
| `--desc`(描述) | 图片识别无法生成时 | "商品描述?" |
|
|
216
|
+
|
|
217
|
+
## 必填参数
|
|
218
|
+
|
|
219
|
+
| 参数 | 说明 |
|
|
220
|
+
|------|------|
|
|
221
|
+
| `--shop-id <id>` | 店铺 ID(即闲鱼用户名 account) |
|
|
222
|
+
| `--title <title>` | 商品标题 |
|
|
223
|
+
| `--price <amount>` | 售价 |
|
|
224
|
+
| `--category-id <id>` | 大分类 ID(从 categories 获取) |
|
|
225
|
+
| `--channel-cat-id <id>` | 小分类 ID(从 categories 获取) |
|
|
226
|
+
| `--image-ids <ids>` | 图片 ID 列表,逗号分隔(保持字符串) |
|
|
227
|
+
| `--stuff-status <n>` | 成色等级 |
|
|
228
|
+
| `--desc <desc>` | 商品描述 |
|
|
229
|
+
| `--out-item-no <no>` | 商家编码(同店铺唯一,用户自定义) |
|
|
230
|
+
|
|
231
|
+
## 成色等级
|
|
232
|
+
|
|
233
|
+
| 值 | 含义 |
|
|
234
|
+
|----|------|
|
|
235
|
+
| `100` | 全新 |
|
|
236
|
+
| `-1` | 准新 |
|
|
237
|
+
| `99` | 99新 |
|
|
238
|
+
| `95` | 95新 |
|
|
239
|
+
| `90` | 9新 |
|
|
240
|
+
|
|
241
|
+
## 可选参数
|
|
242
|
+
|
|
243
|
+
| 参数 | 默认值 | 说明 |
|
|
244
|
+
|------|--------|------|
|
|
245
|
+
| `--brand-name <name>` | — | 品牌名称 |
|
|
246
|
+
| `--size <size>` | — | 尺码 |
|
|
247
|
+
| `--goods-no <no>` | — | 货号 |
|
|
248
|
+
| `--original-price <amount>` | — | 原价 |
|
|
249
|
+
| `--trade-type <n>` | `0` | 交易方式:0 仅在线 / 1 仅线下 / 2 线上或线下 |
|
|
250
|
+
| `--transport-fee <amount>` | `0` | 运费(0 = 包邮) |
|
|
251
|
+
| `--division-id <id>` | `330100` | 行政区划 ID(市级,默认杭州) |
|
|
252
|
+
| `--item-attrs <json>` | — | 商品属性列表 JSON(来自 props/brands) |
|
|
253
|
+
| `--yhb` | `false` | 是否开启验货宝 |
|
|
254
|
+
|
|
255
|
+
> 内部默认值:`itemBizType=2`(普通商品)、`spBizType="16"`(奢品)
|
|
256
|
+
|
|
257
|
+
## 售后服务(默认关闭)
|
|
258
|
+
|
|
259
|
+
提交时自动附带售后服务配置,**默认全部关闭**。卖家需在闲鱼 APP 开通后才能开启(我的 → 设置 → 卖家服务 → 保障服务),未开通的服务如果传 `true` 会导致提交失败(错误:`ITEM_CONDITION_NOT_SUPPORT_SIGN`)。
|
|
260
|
+
|
|
261
|
+
| 服务 | 默认值 | 说明 |
|
|
262
|
+
|------|--------|------|
|
|
263
|
+
| 极速发货-24小时 | 关闭 | 24小时内发货 |
|
|
264
|
+
| 描述不符包邮退 | 关闭 | 描述不符退货包邮 |
|
|
265
|
+
| 七天无理由退货 | 关闭 | 支持七天无理由 |
|
|
266
|
+
| 极速发货-10分钟 | 关闭 | 10分钟内响应 |
|
|
267
|
+
| 极速发货-48小时 | 关闭 | 48小时内发货 |
|
|
268
|
+
| 正品保障 | 关闭 | 正品保障服务 |
|
|
269
|
+
| 虚拟-描述不符包退 | 关闭 | 虚拟商品描述不符包退 |
|
|
270
|
+
|
|
271
|
+
## 挂售错误处理
|
|
272
|
+
|
|
273
|
+
| 错误信息 | 原因 | 解决方法 |
|
|
274
|
+
|----------|------|----------|
|
|
275
|
+
| `请提供至少一张图片` | upload-images 无图片 | 提供本地图片路径 |
|
|
276
|
+
| `请填写有效的商品叶子类目` | category-id 或 channel-cat-id 错误 | 重新查询 categories |
|
|
277
|
+
| `找不到传入的某些图片` | 图片 ID 无效或过期 | 重新上传图片 |
|
|
278
|
+
| `商家编码重复` | out-item-no 同店铺已存在 | 更换唯一编码 |
|
|
279
|
+
| `ITEM_CONDITION_NOT_SUPPORT_SIGN` | 售后服务未开通或品类不支持 | 默认关闭售后,或在闲鱼 APP 开通对应服务 |
|
|
280
|
+
|
|
281
|
+
## References
|
|
282
|
+
|
|
283
|
+
- [r2-goods SKILL.md](../SKILL.md) — 商品管理概览和路由决策
|
|
284
|
+
- [r2-shared](../../r2-shared/SKILL.md) — 认证和全局规则
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# R2-Goods 普通上架/下架/改价
|
|
2
|
+
|
|
3
|
+
> **Prerequisite:** 读取 [`../SKILL.md`](../SKILL.md) 了解路由决策和命令概览。
|
|
4
|
+
|
|
5
|
+
## Agent 上架 4 步流程
|
|
6
|
+
|
|
7
|
+
**每一步 Agent 获取数据后,必须展示给用户让用户做选择。**
|
|
8
|
+
|
|
9
|
+
1. `r2-cli goods shops --json` → 展示店铺 → 用户选择 `shopId`
|
|
10
|
+
2. `r2-cli goods stocks --json` → 展示仓库 → 用户选择 `stockId`
|
|
11
|
+
3. `r2-cli goods list --stock-id <stockId> --json` → 展示商品 → 用户选择 `stockGoodsId`
|
|
12
|
+
4. `r2-cli goods up --stock-goods-id <id> --shop-id <id> --price <amount> --json` → 提交上架
|
|
13
|
+
|
|
14
|
+
命令自动轮询上架进度(每 2 秒,最多 10 秒),返回:
|
|
15
|
+
|
|
16
|
+
```json
|
|
17
|
+
{
|
|
18
|
+
"success": true,
|
|
19
|
+
"data": {
|
|
20
|
+
"submit": { "...提交结果..." },
|
|
21
|
+
"listing": { "id": "上架记录ID", "status": "up", "goodsName": "...", "price": 299 }
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
状态值:`init`(处理中)、`up`(已上架)、`down`(已下架)、`fail`(失败,查看 `errorMsg`)
|
|
27
|
+
|
|
28
|
+
## 上架参数
|
|
29
|
+
|
|
30
|
+
| 参数 | 必填 | 说明 |
|
|
31
|
+
|------|------|------|
|
|
32
|
+
| `--stock-goods-id <id>` | 是 | 库存商品 ID(来自 `stockGoodsId`) |
|
|
33
|
+
| `--shop-id <id>` | 是 | 第三方店铺 ID(来自 `shopId`,**不是 `id`**) |
|
|
34
|
+
| `--price <amount>` | 是 | 上架价格 |
|
|
35
|
+
| `--json` | 否 | JSON 输出(Agent 推荐) |
|
|
36
|
+
|
|
37
|
+
> 缺少必填参数时返回 `{ "success": false, "error": "Agent 模式需要 --stock-goods-id, --shop-id, --price" }`,不会进入交互模式。
|
|
38
|
+
|
|
39
|
+
## 下架(down)
|
|
40
|
+
|
|
41
|
+
**Agent 必须先向用户确认后再执行下架。**
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# 方式 1:上架记录 ID
|
|
45
|
+
r2-cli goods down --id <goodsListingId> --json
|
|
46
|
+
|
|
47
|
+
# 方式 2:库存商品 ID + 店铺 ID
|
|
48
|
+
r2-cli goods down --stock-goods-id <id> --shop-id <id> --json
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 改价(price)
|
|
52
|
+
|
|
53
|
+
**Agent 必须先询问用户新价格,不能自行决定。**
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# 方式 1:上架记录 ID
|
|
57
|
+
r2-cli goods price --id <goodsListingId> --price <新价格> --json
|
|
58
|
+
|
|
59
|
+
# 方式 2:库存商品 ID + 店铺 ID
|
|
60
|
+
r2-cli goods price --stock-goods-id <id> --shop-id <id> --price <新价格> --json
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 修改商品信息(edit)
|
|
64
|
+
|
|
65
|
+
修改已上架商品的标题、描述、品牌、类目、图片、属性等。
|
|
66
|
+
|
|
67
|
+
### 定位商品(二选一)
|
|
68
|
+
|
|
69
|
+
| 方式 | 参数 | 推荐度 |
|
|
70
|
+
|------|------|--------|
|
|
71
|
+
| 上架记录 ID | `--id <goodsListingId>` | 推荐,从 listing 的 id 字段取 |
|
|
72
|
+
| 库存商品 + 店铺 | `--stock-goods-id <id> --account <shopId>` | 备选,挂售商品 stockGoodsId 可能为 0 |
|
|
73
|
+
|
|
74
|
+
### 必填参数
|
|
75
|
+
|
|
76
|
+
| 参数 | 说明 |
|
|
77
|
+
|------|------|
|
|
78
|
+
| `--id <id>` 或 `--stock-goods-id + --account` | 定位商品(二选一) |
|
|
79
|
+
| `--category-id <id>` | 大分类 ID(**后端必填**,即使不改类目也要传当前值) |
|
|
80
|
+
| `--channel-cat-id <id>` | 小分类 ID(**后端必填**,即使不改类目也要传当前值) |
|
|
81
|
+
|
|
82
|
+
> 后端复用了挂售 DTO,缺少 `category-id` 会报 `getCategoryId() is null` 错误。
|
|
83
|
+
|
|
84
|
+
### 可修改字段(全部可选)
|
|
85
|
+
|
|
86
|
+
| 参数 | 说明 |
|
|
87
|
+
|------|------|
|
|
88
|
+
| `--title <title>` | 商品标题 |
|
|
89
|
+
| `--desc <desc>` | 商品描述 |
|
|
90
|
+
| `--image-ids <ids>` | 图片 ID(逗号分隔,需先上传) |
|
|
91
|
+
| `--item-attrs <json>` | 属性列表 JSON |
|
|
92
|
+
| `--brand-name <name>` | 品牌名称 |
|
|
93
|
+
| `--stuff-status <n>` | 成色:100=全新 -1=准新 99=99新 95=95新 90=9新 |
|
|
94
|
+
| `--goods-no <no>` | 货号 |
|
|
95
|
+
| `--original-price <n>` | 原价(元) |
|
|
96
|
+
| `--size <size>` | 尺码 |
|
|
97
|
+
|
|
98
|
+
### 带图片修改的全自动流程
|
|
99
|
+
|
|
100
|
+
用户提供了图片文件时,**Agent 自动完成所有步骤,用户只需确认**:
|
|
101
|
+
|
|
102
|
+
1. **展示列表**:`r2-cli goods listing --json` → 展示给用户选择要修改的商品(获取 stockGoodsId、shopId)
|
|
103
|
+
2. **上传图片**:`r2-cli goods hang-up upload-images --shop-id <shopId> --files <paths> --json`
|
|
104
|
+
3. **AI 读图识别**:Agent 用 Read 工具查看图片,识别品牌/类目/成色/描述/材质等
|
|
105
|
+
4. **自动匹配类目**:`r2-cli goods hang-up categories --json` → 根据识别结果匹配 catId + channelCatId(如"运动夹克" → 男士服装>夹克)
|
|
106
|
+
5. **自动查询属性**:`r2-cli goods hang-up props --channel-cat-id <id> --json` → 根据识别结果自动匹配:
|
|
107
|
+
- 成色(全新/99新/95新等) → 查找对应 valueId
|
|
108
|
+
- 尺码(XL/L/M 等) → 查找对应 valueId
|
|
109
|
+
- 适用季节 → 查找对应 valueId
|
|
110
|
+
- 其他属性 → 根据识别结果匹配
|
|
111
|
+
6. **自动搜索品牌**:`r2-cli goods hang-up brands --channel-cat-id <> --prop-id <> --key <品牌名> --json` → 获取品牌 valueId
|
|
112
|
+
7. **汇总确认**:展示「当前值 vs 变更值」对比表,用户确认
|
|
113
|
+
8. **提交修改**:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
r2-cli goods edit \
|
|
117
|
+
--id <goodsListingId> \
|
|
118
|
+
--category-id <catId> --channel-cat-id <channelCatId> \
|
|
119
|
+
--image-ids "id1,id2,id3" \
|
|
120
|
+
--item-attrs '[{...品牌...},{...成色...},{...尺码...},{...季节...}]' \
|
|
121
|
+
--brand-name "Louis Vuitton/路易威登" \
|
|
122
|
+
--json
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### 只改文字字段(无图片)
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
# 改标题
|
|
129
|
+
r2-cli goods goods edit --id 5 \
|
|
130
|
+
--category-id 50106003 --channel-cat-id "f4718bbb04d7ed1facde29f76907b07f" \
|
|
131
|
+
--title "新标题" --json
|
|
132
|
+
|
|
133
|
+
# 改品牌+描述
|
|
134
|
+
r2-cli goods edit --id 5 \
|
|
135
|
+
--category-id 50106003 --channel-cat-id "f4718bbb04d7ed1facde29f76907b07f" \
|
|
136
|
+
--brand-name "Nike" --desc "全新描述" --json
|
|
137
|
+
```
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# R2-Goods 查询命令
|
|
2
|
+
|
|
3
|
+
> **Prerequisite:** 读取 [`../SKILL.md`](../SKILL.md) 了解路由决策和命令概览。
|
|
4
|
+
|
|
5
|
+
## 店铺(shops)
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
r2-cli goods shops --json
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
返回字段:
|
|
12
|
+
|
|
13
|
+
| 字段 | 说明 |
|
|
14
|
+
|------|------|
|
|
15
|
+
| `shopId` | 第三方店铺 ID(**上架参数取这个,不是 `id`**) |
|
|
16
|
+
| `shopName` | 店铺名称 |
|
|
17
|
+
| `platform` | 平台(xianyu / douyin 等) |
|
|
18
|
+
|
|
19
|
+
> `--json` 输出会自动过滤敏感字段(`accessToken`、`refreshExpireIn`),Agent 可直接展示。
|
|
20
|
+
|
|
21
|
+
## 仓库(stocks)
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
r2-cli goods stocks --json
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
返回字段:`stockId`(仓库 ID)、`stockName`(仓库名称)
|
|
28
|
+
|
|
29
|
+
## 选品商品(list)
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# 按仓库过滤(推荐)
|
|
33
|
+
r2-cli goods list --stock-id <stockId> --json
|
|
34
|
+
|
|
35
|
+
# 按商品 ID 精确查询
|
|
36
|
+
r2-cli goods list --stock-goods-id <id> --json
|
|
37
|
+
|
|
38
|
+
# 翻页
|
|
39
|
+
r2-cli goods list --stock-id <stockId> --page 2 --size 20 --json
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
返回字段:
|
|
43
|
+
|
|
44
|
+
| 字段 | 说明 |
|
|
45
|
+
|------|------|
|
|
46
|
+
| `stockGoodsId` | 库存商品 ID(**上架参数取这个**) |
|
|
47
|
+
| `goodsName` | 商品名称 |
|
|
48
|
+
| `brand` | 品牌 |
|
|
49
|
+
| `size` | 尺码 |
|
|
50
|
+
| `salePrice` | 建议售价 |
|
|
51
|
+
| `cate1Name` / `cate2Name` / `cate3Name` | 分类 |
|
|
52
|
+
|
|
53
|
+
## 上架列表(listing)
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
r2-cli goods listing --json
|
|
57
|
+
r2-cli goods listing --status up --json # 只看已上架
|
|
58
|
+
r2-cli goods listing --shop-id <id> --json # 按店铺过滤
|
|
59
|
+
r2-cli goods listing --stock-goods-id <id> --json # 按商品过滤
|
|
60
|
+
r2-cli goods listing --id <id> --json # 精确查询
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
过滤参数:`--id`、`--stock-goods-id`、`--shop-id`、`--stock-id`、`--status`(init/up/down/fail)、`--platform`
|
|
@@ -1,25 +1,42 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: r2-shared
|
|
3
|
-
version: 1.
|
|
4
|
-
description: "R2-CLI
|
|
3
|
+
version: 1.1.0
|
|
4
|
+
description: "R2-CLI 共享基础技能。安装、版本检查、统一错误格式、命令概览。r2-auth 和 r2-goods 的前置依赖。触发词:r2-cli、安装、install、错误格式。"
|
|
5
5
|
metadata:
|
|
6
6
|
requires:
|
|
7
7
|
bins: ["r2-cli"]
|
|
8
8
|
cliHelp: "r2-cli --help"
|
|
9
|
+
minVersion: "1.0.12"
|
|
9
10
|
related:
|
|
10
11
|
- "r2-auth"
|
|
11
12
|
- "r2-goods"
|
|
13
|
+
supersededSkills:
|
|
14
|
+
- name: "r2-cli"
|
|
15
|
+
action: "已更名为 r2-shared,请删除旧 skill:rm -rf ~/.agents/skills/r2-cli"
|
|
12
16
|
---
|
|
13
17
|
|
|
14
|
-
# R2-Shared (v1)
|
|
18
|
+
# R2-Shared (v1.1)
|
|
15
19
|
|
|
16
|
-
> **Tip**: 始终使用 `--json` 获取结构化输出。所有 `--json` 命令统一错误格式 `{ success: false, error: "..." }`,检查 `success`
|
|
20
|
+
> **Tip**: 始终使用 `--json` 获取结构化输出。所有 `--json` 命令统一错误格式 `{ success: false, error: "..." [, status: number] }`,检查 `success` 判断成败。`status` 字段在 HTTP 错误(ApiError)和参数校验失败(400)时包含。
|
|
17
21
|
> **Tip**: Agent 获取数据后展示给用户选择,不要让用户自己提供 ID。
|
|
18
22
|
|
|
19
23
|
二手潮奢交易命令行工具,由 Round2AI 团队维护。覆盖商品上架、认证登录等核心业务域。
|
|
20
24
|
|
|
21
25
|
## CRITICAL
|
|
22
26
|
|
|
27
|
+
**执行规则**(所有 r2-* skills 通用):
|
|
28
|
+
- 所有命令**必须**通过已安装的 `r2-cli` 二进制执行(`r2-cli goods ...`、`r2-cli auth ...`)
|
|
29
|
+
- **禁止**读取项目源码或用 `tsx`/`node` 直接运行源文件
|
|
30
|
+
- 如果 `r2-cli` 命令不可用,提示用户先安装:`npm install -g @round2ai/r2-cli@latest`
|
|
31
|
+
|
|
32
|
+
**版本检查**:
|
|
33
|
+
- 首次使用时,Agent 应运行 `r2-cli --version` 检查当前版本
|
|
34
|
+
- 最低要求版本:`1.0.12`,低于此版本提示用户更新:`npm install -g @round2ai/r2-cli@latest`
|
|
35
|
+
|
|
36
|
+
**旧 Skill 清理**:
|
|
37
|
+
- 如果发现 `~/.agents/skills/r2-cli/`(已废弃的旧名称),提示用户删除:`rm -rf ~/.agents/skills/r2-cli`
|
|
38
|
+
- 当前正确的 skill 名称:`r2-shared`、`r2-auth`、`r2-goods`
|
|
39
|
+
|
|
23
40
|
本 skill 是 r2-auth 和 r2-goods 的共享基础。认证登录详情见 **r2-auth** skill,商品管理详情见 **r2-goods** skill。
|
|
24
41
|
|
|
25
42
|
## 安装
|
|
@@ -53,29 +70,29 @@ npm install -g @round2ai/r2-cli@latest
|
|
|
53
70
|
| 上架 | `r2-cli goods up --stock-goods-id <> --shop-id <> --price <> --json` | 普通上架(选品商品) |
|
|
54
71
|
| | `r2-cli goods down --id <id> [--json]` | 下架商品 |
|
|
55
72
|
| | `r2-cli goods price --id <id> --price <amount> [--json]` | 修改价格 |
|
|
73
|
+
| 修改 | `r2-cli goods edit --id <> --category-id <> --channel-cat-id <> ... --json` | 修改商品信息(定位推荐 `--id`) |
|
|
56
74
|
| 挂售 | `r2-cli goods hang-up categories [--json]` | 获取闲鱼类目 |
|
|
57
75
|
| | `r2-cli goods hang-up props --channel-cat-id <id> [--json]` | 获取属性列表 |
|
|
58
76
|
| | `r2-cli goods hang-up brands --channel-cat-id <> --prop-id <> --key <> [--json]` | 品牌搜索 |
|
|
59
77
|
| | `r2-cli goods hang-up upload-images --shop-id <> --files <> --json` | 上传图片 |
|
|
60
78
|
| | `r2-cli goods hang-up submit --shop-id <> --title <> ... --json` | 提交挂售上架 |
|
|
61
79
|
|
|
62
|
-
##
|
|
63
|
-
|
|
64
|
-
用户说"上架商品"时需要选择正确的方式:
|
|
65
|
-
- **商品在选品库** → `goods up`(店铺 → 仓库 → 选品商品 → 提交价格)
|
|
66
|
-
- **用户提供了图片** → `goods hang-up`(上传图片 → AI 读图识别 → 类目/属性 → 提交)
|
|
67
|
-
- **不确定** → 问用户
|
|
80
|
+
## 其他命令
|
|
68
81
|
|
|
69
|
-
|
|
82
|
+
| 命令 | 说明 |
|
|
83
|
+
|------|------|
|
|
84
|
+
| `r2-cli update` | 一键更新 CLI 和技能 |
|
|
85
|
+
| `r2-cli uninstall` | 卸载并清除配置 |
|
|
70
86
|
|
|
71
|
-
## Agent
|
|
87
|
+
## Agent 上架路由(概要)
|
|
72
88
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
89
|
+
用户说"上架"时需要选择正确的方式:
|
|
90
|
+
- **用户明确指定方式或提供了图片** → 直接走对应流程
|
|
91
|
+
- **未指定方式** → **必须询问用户**:"选品上架还是挂售上架?"
|
|
92
|
+
- 选品上架 → `goods up`(店铺 → 仓库 → 选品商品 → 提交价格)
|
|
93
|
+
- 挂售上架 → `goods hang-up`(上传图片 → AI 读图识别 → 类目/属性 → 提交)
|
|
77
94
|
|
|
78
|
-
>
|
|
95
|
+
> 详细决策规则和完整操作流程见 **r2-goods** skill。
|
|
79
96
|
|
|
80
97
|
## 统一错误格式
|
|
81
98
|
|
|
@@ -85,6 +102,12 @@ npm install -g @round2ai/r2-cli@latest
|
|
|
85
102
|
{ "success": false, "error": "错误信息" }
|
|
86
103
|
```
|
|
87
104
|
|
|
105
|
+
API 错误和参数校验失败时额外包含 `status` 字段:
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{ "success": false, "error": "错误信息", "status": 400 }
|
|
109
|
+
```
|
|
110
|
+
|
|
88
111
|
常见错误:
|
|
89
112
|
|
|
90
113
|
| 错误信息 | 原因 | 解决方法 |
|