@round2ai/r2-cli 1.0.14 → 1.0.16

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.
@@ -11,7 +11,16 @@
11
11
  3. `r2-cli goods list --stock-id <stockId> --json` → 展示商品 → 用户选择 `stockGoodsId`
12
12
  4. `r2-cli goods up --stock-goods-id <id> --shop-id <id> --price <amount> --json` → 提交上架
13
13
 
14
- 命令自动轮询上架进度(每 2 秒,最多 10 秒),返回:
14
+ 命令自动轮询上架进度(每 2 秒,最多 10 秒),返回 `{ success, data: { submit, listing } }`。
15
+
16
+ **提交成功展示模板**:
17
+ ```
18
+ 上架成功!
19
+ - 商品:[goodsName]
20
+ - 店铺:[shopName]
21
+ - 价格:¥[price]
22
+ - 上架 ID:[listing.id](用于后续改价/下架)
23
+ ```
15
24
 
16
25
  ```json
17
26
  {
@@ -23,7 +32,7 @@
23
32
  }
24
33
  ```
25
34
 
26
- 状态值:`init`(处理中)、`up`(已上架)、`down`(已下架)、`fail`(失败,查看 `errorMsg`)、`sold`(已售出)
35
+ 状态值:`init`(处理中)、`up`(已上架)、`down`(已下架)、`fail`(失败,查看 `errorMsg`)、`sold`(已售出)、`sold`(已售出)
27
36
 
28
37
  ## 上架列表返回字段
29
38
 
@@ -35,13 +44,37 @@
35
44
  | `goodsName` | 商品名称 |
36
45
  | `brandName` | 品牌 |
37
46
  | `price` | 上架价格 |
38
- | `status` | 状态:`init`/`up`/`down`/`fail`/`sold` |
47
+ | `status` | 状态:`init`/`up`/`down`/`fail`/`sold`(已售出) |
39
48
  | `thirdItemNo` | 平台商品 ID |
40
49
  | `outItemNo` | 商家编码 |
41
50
  | `spec` | 规格(尺码) |
42
51
  | `platform` | 平台(xianyu) |
43
52
  | `gmtCreate` / `gmtModified` | 创建/修改时间戳 |
44
53
 
54
+ ### 友好输出指引
55
+
56
+ 上架响应 JSON 示例:
57
+ ```json
58
+ {
59
+ "success": true,
60
+ "data": {
61
+ "submit": { "id": 12345, "status": "init" },
62
+ "listing": { "id": 12345, "goodsName": "Nike 运动鞋", "price": 299, "shopName": "店铺A", "status": "up" }
63
+ }
64
+ }
65
+ ```
66
+
67
+ Agent 提取展示:
68
+ ```
69
+ 上架成功!
70
+ - 商品:Nike 运动鞋
71
+ - 店铺:店铺A
72
+ - 价格:¥299
73
+ - 上架 ID:12345(用于后续改价/下架)
74
+ ```
75
+
76
+ > **`data.listing` 中的字段**:`id`(上架记录 ID)、`goodsName`(商品名)、`price`(价格)、`shopName`(店铺名)、`status`(状态)。Agent 提取这些字段展示给用户。
77
+
45
78
  ## 上架参数
46
79
 
47
80
  | 参数 | 必填 | 说明 |
@@ -57,6 +90,14 @@
57
90
 
58
91
  **Agent 必须先向用户确认后再执行下架。**
59
92
 
93
+ **确认模板**:
94
+ ```
95
+ 确认下架?
96
+ 商品:[goodsName] | [brandName] | ¥[price]
97
+ 店铺:[shopName]
98
+ 输入 yes 确认,其他取消
99
+ ```
100
+
60
101
  ```bash
61
102
  # 方式 1:上架记录 ID
62
103
  r2-cli goods down --id <goodsListingId> --json
@@ -65,6 +106,16 @@ r2-cli goods down --id <goodsListingId> --json
65
106
  r2-cli goods down --stock-goods-id <id> --shop-id <id> --json
66
107
  ```
67
108
 
109
+ ### 友好输出指引
110
+
111
+ 下架响应 `{ "success": true, "data": "下架成功" }`。Agent 提取展示:
112
+ ```
113
+ 下架成功!
114
+ - 商品:[goodsName]
115
+ - 店铺:[shopName]
116
+ - 上架 ID:[id]
117
+ ```
118
+
68
119
  ## 改价(price)
69
120
 
70
121
  **Agent 必须先询问用户新价格,不能自行决定。**
@@ -77,10 +128,21 @@ r2-cli goods price --id <goodsListingId> --price <新价格> --json
77
128
  r2-cli goods price --stock-goods-id <id> --shop-id <id> --price <新价格> --json
78
129
  ```
79
130
 
131
+ ### 友好输出指引
132
+
133
+ 改价响应 `{ "success": true, "data": "修改成功" }`。Agent 提取展示:
134
+ ```
135
+ 改价成功!
136
+ - 商品:[goodsName]
137
+ - 原价:¥[原价] → ¥[新价格]
138
+ ```
139
+
80
140
  ## 修改商品信息(edit)
81
141
 
82
142
  修改已上架商品的标题、描述、品牌、类目、图片、属性等。
83
143
 
144
+ > **注意**:`goods edit` 不支持修改价格。改价需单独使用 `r2-cli goods price --id <id> --price <amount>`。
145
+
84
146
  ### 定位商品(二选一)
85
147
 
86
148
  | 方式 | 参数 | 推荐度 |
@@ -93,6 +155,7 @@ r2-cli goods price --stock-goods-id <id> --shop-id <id> --price <新价格> --js
93
155
  - **`--image-ids` 保持字符串**:图片 ID 是 19 位数字,`Number()` 会精度丢失
94
156
  - **`--item-attrs` 传 JSON 字符串**:必须是 `JSON.stringify()` 后的结果,不能直接传对象
95
157
  - **即使不改类目也要传 `--category-id` 和 `--channel-cat-id`**:后端必填,缺少会报 `getCategoryId() is null`
158
+ - **`--item-attrs` 必须包含 props 中所有属性,不只是修改的那一个**:后端替换整个属性列表,漏传的属性会被清除。从 `goods hang-up props --channel-cat-id <id> --json` 获取全部属性后,修改目标属性的值,其他属性保持原样一并传入
96
159
 
97
160
  ### 必填参数
98
161
 
@@ -118,35 +181,14 @@ r2-cli goods price --stock-goods-id <id> --shop-id <id> --price <新价格> --js
118
181
  | `--original-price <n>` | 原价(元) |
119
182
  | `--size <size>` | 尺码 |
120
183
 
121
- ### 带图片修改的全自动流程
184
+ ### 带图片修改
122
185
 
123
- 用户提供了图片文件时,**Agent 自动完成所有步骤,用户只需确认**:
124
-
125
- 1. **展示列表**:`r2-cli goods listing --json` → 展示给用户选择要修改的商品(获取 stockGoodsId、shopId)
126
- 2. **上传图片**:`r2-cli goods hang-up upload-images --shop-id <shopId> --files <paths> --json`
127
- 3. **AI 读图识别**:Agent 用 Read 工具查看图片,识别品牌/类目/成色/描述/材质等
128
- 4. **自动匹配类目**:`r2-cli goods hang-up categories --json` → 根据识别结果匹配 catId + channelCatId(如"运动夹克" → 男士服装>夹克)
129
- 5. **自动查询属性**:`r2-cli goods hang-up props --channel-cat-id <id> --json` → 根据识别结果自动匹配:
130
- - 成色(全新/99新/95新等) → 查找对应 valueId
131
- - 尺码(XL/L/M 等) → 查找对应 valueId
132
- - 适用季节 → 查找对应 valueId
133
- - 其他属性 → 根据识别结果匹配
134
- 6. **自动搜索品牌**:`r2-cli goods hang-up brands --channel-cat-id <> --prop-id <> --key <品牌名> --json` → 获取品牌 valueId
135
- 7. **汇总确认**:展示「当前值 vs 变更值」对比表,用户确认
136
- 8. **提交修改**:
137
-
138
- ```bash
139
- r2-cli goods edit \
140
- --id <goodsListingId> \
141
- --category-id <catId> --channel-cat-id <channelCatId> \
142
- --image-ids "id1,id2,id3" \
143
- --item-attrs '[{...品牌...},{...成色...},{...尺码...},{...季节...}]' \
144
- --brand-name "Louis Vuitton/路易威登" \
145
- --json
146
- ```
186
+ 用户提供了图片文件时,参见场景指南:[../scenes/r2-scene-edit-with-images.md](../scenes/r2-scene-edit-with-images.md)
147
187
 
148
188
  ### 只改文字字段(无图片)
149
189
 
190
+ > 只改标题/描述等文字字段时,不需要传 `--item-attrs`。**但一旦传了 `--item-attrs`,必须包含 props 中所有属性**,不能只传修改的那一项。
191
+
150
192
  ```bash
151
193
  # 改标题
152
194
  r2-cli goods edit --id 5 \
@@ -158,3 +200,22 @@ r2-cli goods edit --id 5 \
158
200
  --category-id 50106003 --channel-cat-id "f4718bbb04d7ed1facde29f76907b07f" \
159
201
  --brand-name "Nike" --desc "全新描述" --json
160
202
  ```
203
+
204
+ > **注意**:改品牌时建议同时传 `--item-attrs`(含所有属性,品牌项用最新 valueId),因为只传 `--brand-name` 可能不会更新属性列表中的品牌值。
205
+
206
+ ### 友好输出指引
207
+
208
+ edit 响应 `{ "success": true, "data": "修改成功" }`。Agent 提取展示修改摘要:
209
+ ```
210
+ 修改成功!
211
+ 商品:[goodsName]
212
+ ┌──────────┬──────────────────┐
213
+ │ 修改项 │ 新值 │
214
+ ├──────────┼──────────────────┤
215
+ │ 标题 │ [新标题] │
216
+ │ 品牌 │ [新品牌] │
217
+ │ 描述 │ [新描述摘要] │
218
+ └──────────┴──────────────────┘
219
+ ```
220
+
221
+ > 只展示**实际修改的字段**,未修改的字段不展示。`--item-attrs` 中如有多个属性修改,只列属性名+新值。
@@ -18,6 +18,14 @@ r2-cli goods shops --json
18
18
 
19
19
  > `--json` 输出会自动过滤敏感字段(`accessToken`、`refreshExpireIn`),Agent 可直接展示。
20
20
 
21
+ **Agent 展示格式**:
22
+ ```
23
+ 店铺列表:
24
+ 1. [shopName]([platform])— shopId: [shopId]
25
+ 2. [shopName]([platform])— shopId: [shopId]
26
+ 请选择店铺(输入编号):
27
+ ```
28
+
21
29
  ## 仓库(stocks)
22
30
 
23
31
  ```bash
@@ -26,6 +34,14 @@ r2-cli goods stocks --json
26
34
 
27
35
  返回字段:`stockId`(仓库 ID)、`stockName`(仓库名称)
28
36
 
37
+ **Agent 展示格式**:
38
+ ```
39
+ 仓库列表:
40
+ 1. [stockName](stockId: [stockId])
41
+ 2. [stockName](stockId: [stockId])
42
+ 请选择仓库(输入编号):
43
+ ```
44
+
29
45
  ## 选品商品(list)
30
46
 
31
47
  ```bash
@@ -50,6 +66,14 @@ r2-cli goods list --stock-id <stockId> --page 2 --size 50 --json
50
66
  | `salePrice` | 建议售价 |
51
67
  | `cate1Name` / `cate2Name` / `cate3Name` | 分类 |
52
68
 
69
+ **Agent 展示格式**:
70
+ ```
71
+ 选品商品列表:
72
+ 1. [goodsName] | [brand] | [size] | ¥[salePrice] | [cate3Name](stockGoodsId: [id])
73
+ 2. [goodsName] | [brand] | [size] | ¥[salePrice] | [cate3Name](stockGoodsId: [id])
74
+ 请选择商品(输入编号):
75
+ ```
76
+
53
77
  ## 上架列表(listing)
54
78
 
55
79
  ```bash
@@ -63,3 +87,10 @@ r2-cli goods listing --page 2 --size 50 --json # 翻页
63
87
  ```
64
88
 
65
89
  过滤参数:`--id`、`--stock-goods-id`、`--shop-id`、`--stock-id`、`--status`(init/up/down/fail/sold)、`--platform`、`--page`(默认 1)、`--size`(默认 20,最大 50)
90
+
91
+ **Agent 展示格式**:
92
+ ```
93
+ 上架商品列表:
94
+ 1. [goodsName] | [brandName] | ¥[price] | [status] | id: [id]
95
+ 2. [goodsName] | [brandName] | ¥[price] | [status] | id: [id]
96
+ ```
@@ -0,0 +1,78 @@
1
+ # 批量操作场景指南
2
+
3
+ ## 适用场景
4
+
5
+ - 将同一商品上架到多个店铺
6
+ - 查询全部上架商品
7
+ - 批量下架/改价
8
+
9
+ ## 分页策略
10
+
11
+ ```bash
12
+ # 获取全部上架商品(分页遍历)
13
+ r2-cli goods listing --page 1 --size 50 --json
14
+ r2-cli goods listing --page 2 --size 50 --json
15
+ ```
16
+
17
+ - 默认 `--size 50`(最大值),减少请求次数
18
+ - 用 `--status` 过滤特定状态的商品(up/down/sold)
19
+ - 用 `--shop-id` 限定店铺范围
20
+
21
+ ## 跨店铺操作
22
+
23
+ ```bash
24
+ # 查看所有店铺
25
+ r2-cli goods shops --json
26
+
27
+ # 切换到另一个店铺的库存
28
+ r2-cli goods list --stock-id <stockId> --json
29
+
30
+ # 上架到不同店铺
31
+ r2-cli goods up --stock-goods-id <id> --shop-id <shopA> --price <n> --json
32
+ r2-cli goods up --stock-goods-id <id> --shop-id <shopB> --price <n> --json
33
+ ```
34
+
35
+ ## 注意事项
36
+
37
+ - 每个操作独立执行,一个失败不影响其他
38
+ - 批量提交时间隔至少 1 秒
39
+ - Token 过期时停止工作流,重新登录后从断点继续
40
+
41
+ ## 汇总展示格式
42
+
43
+ 操作完成后,按以下格式展示结果:
44
+
45
+ ```
46
+ 批量上架完成!
47
+ ✅ 成功:N 个商品
48
+ - [商品名] → ¥[价格] → [店铺名]
49
+ - [商品名] → ¥[价格] → [店铺名]
50
+ ❌ 失败:N 个商品
51
+ - [商品名] → 错误:[错误信息]
52
+ - [商品名] → 错误:[错误信息]
53
+ ```
54
+
55
+ ## 友好输出指引
56
+
57
+ 每个批量操作命令的 JSON 响应结构不同,Agent 统一按以下方式处理:
58
+
59
+ **批量上架**:每个 `goods up --json` 返回 `{ success, data: { listing: { id, goodsName, price, shopName, status } } }`。逐个提取,累积汇总。
60
+
61
+ **批量下架**:每个 `goods down --json` 返回 `{ success, data: "下架成功" }`。Agent 从流程参数中提取商品信息展示:
62
+ ```
63
+ [1/2] Nike 运动鞋 → ✅ 已下架
64
+ [2/2] Adidas T恤 → ✅ 已下架
65
+ ```
66
+
67
+ **批量改价**:每个 `goods price --json` 返回 `{ success, data: "修改成功" }`。从流程参数中提取信息展示:
68
+ ```
69
+ [1/3] Nike 运动鞋 → ¥299 → ¥249 ✅
70
+ [2/3] Adidas T恤 → ¥199 → ¥149 ✅
71
+ ```
72
+
73
+ > 即使某个操作失败(`success: false`),也不影响其他商品继续执行。每完成一个商品就反馈进度,全部完成后展示汇总。
74
+
75
+ ## 参考
76
+
77
+ - [../SKILL.md](../SKILL.md) — 商品管理概览
78
+ - [../references/r2-goods-query.md](../references/r2-goods-query.md) — 查询命令
@@ -0,0 +1,47 @@
1
+ # 带图片修改商品信息
2
+
3
+ 用户提供了图片文件时,**Agent 自动完成所有步骤,用户只需确认**。
4
+
5
+ ## 全自动流程
6
+
7
+ 1. **展示列表**:`r2-cli goods listing --json` → 展示给用户选择要修改的商品
8
+ 2. **上传图片**:`r2-cli goods hang-up upload-images --shop-id <shopId> --files <paths> --json`
9
+ 3. **AI 读图识别**:Agent 用 Read 工具查看图片,识别品牌/类目/成色/描述/材质等
10
+ 4. **自动匹配类目**:`r2-cli goods hang-up categories --json` → 根据识别结果匹配 catId + channelCatId
11
+ 5. **自动查询属性**:`r2-cli goods hang-up props --channel-cat-id <id> --json` → 根据识别结果匹配成色/尺码/季节等
12
+ 6. **自动搜索品牌**:`r2-cli goods hang-up brands --channel-cat-id <> --prop-id <> --key <品牌名> --json`
13
+ 7. **汇总确认**:展示「当前值 vs 变更值」对比表,让用户确认
14
+
15
+ ```
16
+ ┌──────────┬──────────────────┬──────────────────┐
17
+ │ 字段 │ 当前值 │ 变更值 │
18
+ ├──────────┼──────────────────┼──────────────────┤
19
+ │ 标题 │ Nike 运动鞋 白 42 │ Nike 运动鞋 黑 42 │
20
+ │ 图片 │ img1.jpg │ img1.jpg,img2.jpg │
21
+ │ 成色 │ 95新 │ 全新 │
22
+ │ 价格 │ ¥299(不改价) │ — │
23
+ └──────────┴──────────────────┴──────────────────┘
24
+ ```
25
+ 8. **提交**:
26
+
27
+ ```bash
28
+ r2-cli goods edit \
29
+ --id <goodsListingId> \
30
+ --category-id <catId> --channel-cat-id <channelCatId> \
31
+ --image-ids "id1,id2,id3" \
32
+ --item-attrs '[{...品牌...},{...成色...},{...尺码...},{...季节...}]' \
33
+ --brand-name "品牌名" \
34
+ --json
35
+ ```
36
+
37
+ ## 约束
38
+
39
+ - `--category-id` 和 `--channel-cat-id` 后端必填,即使不改类目也要传当前值
40
+ - `--item-attrs` 必须包含 props 中所有属性,不只是修改的那一个
41
+ - `--image-ids` 保持字符串,不要转数字
42
+ - `--item-attrs` 传 JSON 字符串(`JSON.stringify()` 后)
43
+
44
+ ## 参考
45
+
46
+ - [../references/r2-goods-listing.md](../references/r2-goods-listing.md) — edit 命令参数
47
+ - [../references/r2-goods-hangup.md](../references/r2-goods-hangup.md) — 图片上传和属性查询
@@ -0,0 +1,32 @@
1
+ # 服装/鞋包挂售场景指南
2
+
3
+ ## 季节推断
4
+
5
+ | 商品类型 | 适用季节 |
6
+ |----------|----------|
7
+ | 夹克、风衣、卫衣、针织衫 | 春秋季 |
8
+ | 羽绒服、棉衣、毛呢大衣 | 秋冬季 |
9
+ | T恤、短裤、背心、凉鞋 | 夏季 |
10
+ | 基础款衬衫、休闲裤 | 四季 |
11
+
12
+ ## 图片识别字段
13
+
14
+ | 字段 | 可识别性 | 说明 |
15
+ |------|---------|------|
16
+ | 品牌 | ✅ | 从 Logo/标签读取,调 brands 搜索确认 |
17
+ | 款式 | ✅ | 从整体外观判断 |
18
+ | 成色 | ✅ | 根据磨损/污渍/起球程度判断 |
19
+ | 尺码 | ⚠️ | 从标签/吊牌/水洗标读取 |
20
+ | 货号 | ⚠️ | 从标签/吊牌读取 |
21
+ | 颜色/材质 | ⚠️ | 能识别则识别,否则汇总时问 |
22
+
23
+ ## 品牌搜索建议
24
+
25
+ - 奢侈品(LV、Gucci、Chanel 等):搜完整英文名
26
+ - 运动品牌(Nike、Adidas 等):搜英文名,小写即可
27
+ - 国内品牌:搜中文名
28
+
29
+ ## 参考
30
+
31
+ - [../SKILL.md](../SKILL.md) — 挂售流程
32
+ - [../references/r2-goods-hangup.md](../references/r2-goods-hangup.md) — 挂售参数详解
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: r2-shared
3
- version: 1.1.0
3
+ version: 1.2.0
4
4
  description: "R2-CLI 共享基础技能。安装、版本检查、统一错误格式、命令概览。r2-auth 和 r2-goods 的前置依赖。触发词:r2-cli、安装、install、错误格式。"
5
5
  metadata:
6
6
  requires:
@@ -15,7 +15,7 @@ metadata:
15
15
  action: "已更名为 r2-shared,请删除旧 skill:rm -rf ~/.agents/skills/r2-cli"
16
16
  ---
17
17
 
18
- # R2-Shared (v1.1)
18
+ # R2-Shared (v1.2)
19
19
 
20
20
  > **Tip**: 始终使用 `--json` 获取结构化输出。所有 `--json` 命令统一错误格式 `{ success: false, error: "..." [, status: number] }`,检查 `success` 判断成败。`status` 字段在 HTTP 错误(ApiError)和参数校验失败(400)时包含。
21
21
  > **Tip**: Agent 获取数据后展示给用户选择,不要让用户自己提供 ID。
@@ -34,6 +34,33 @@ metadata:
34
34
  - 首次使用时,Agent 应运行 `r2-cli --version` 检查当前版本
35
35
  - 最低要求版本:`1.0.12`,低于此版本提示用户更新:`npm install -g @round2ai/r2-cli@latest`
36
36
 
37
+ **更新通知(`_notice.update`)**:
38
+ `_notice.update` 会出现在所有 `--json` 命令的输出中(包含成功和失败输出),格式如下:
39
+
40
+ ```json
41
+ {
42
+ "success": true,
43
+ "data": { ... },
44
+ "_notice": {
45
+ "update": {
46
+ "message": "Update available: 1.0.15 → 1.0.16",
47
+ "command": "npm update -g @round2ai/r2-cli && npx skills add Round2AI/r2-cli --all -y"
48
+ }
49
+ }
50
+ }
51
+ ```
52
+
53
+ **当你在输出中看到 `_notice.update` 时,完成用户当前请求后,主动提议帮用户更新**:
54
+
55
+ 1. 告知用户当前版本和最新版本号
56
+ 2. 提议执行更新(CLI 和 Skills 需要同时更新):
57
+ ```bash
58
+ npm update -g @round2ai/r2-cli && npx skills add Round2AI/r2-cli --all -y
59
+ ```
60
+ 3. 更新完成后提醒用户:**退出并重新打开 AI Agent** 以加载最新 Skills
61
+
62
+ **规则**:不要静默忽略更新提示。即使当前任务与更新无关,也应在完成用户请求后补充告知。
63
+
37
64
  **旧 Skill 清理**:
38
65
  - 如果发现 `~/.agents/skills/r2-cli/`(已废弃的旧名称),提示用户删除:`rm -rf ~/.agents/skills/r2-cli`
39
66
  - 当前正确的 skill 名称:`r2-shared`、`r2-auth`、`r2-goods`
@@ -51,30 +78,13 @@ npm install -g @round2ai/r2-cli@latest
51
78
  - 先登录:`r2-cli auth login`(支持第二回合 APP / 微信 / 支付宝扫码)
52
79
  - 检查状态:`r2-cli auth status`
53
80
 
54
- ## 认证命令(详见 r2-auth skill)
81
+ ## 认证命令
55
82
 
56
- | 命令 | 说明 |
57
- |------|------|
58
- | `r2-cli auth login --json` | 扫码登录(Agent 推荐,一步完成) |
59
- | `r2-cli auth xianyu --json` | 闲鱼店铺授权(Agent 推荐,一步完成) |
60
- | `r2-cli auth status` | 查看登录状态 |
61
- | `r2-cli auth logout` | 退出登录 |
62
-
63
- ## 商品管理命令(详见 r2-goods skill)
64
-
65
- | 分类 | 命令 | 说明 |
66
- |------|------|------|
67
- | 查询 | `r2-cli goods shops [--json]` | 查看已授权店铺 |
68
- | | `r2-cli goods stocks [--json]` | 查看仓库 |
69
- | | `r2-cli goods list [--stock-id <id>] [--json]` | 查看选品商品 |
70
- | | `r2-cli goods listing [--status <up/down/sold>] [--json]` | 查询上架列表 |
71
- | 上架 | `r2-cli goods up --stock-goods-id <> --shop-id <> --price <> --json` | 普通上架(选品商品) |
72
- | | `r2-cli goods down --id <id> [--json]` | 下架商品 |
73
- | | `r2-cli goods price --id <id> --price <amount> [--json]` | 修改价格 |
74
- | 挂售 | `r2-cli goods hang-up categories [--json]` | 获取闲鱼类目 |
75
- | | `r2-cli goods hang-up props --channel-cat-id <id> [--json]` | 获取属性列表 |
76
- | | `r2-cli goods hang-up brands --channel-cat-id <> --prop-id <> --key <> [--json]` | 品牌搜索 |
77
- | | `r2-cli goods hang-up submit --shop-id <> --title <> ... --json` | 提交挂售上架 |
83
+ 认证登录和闲鱼店铺授权的完整流程与参数详见 **r2-auth** skill。
84
+
85
+ ## 商品管理命令
86
+
87
+ 商品上架、下架、改价、修改、挂售以及查询的完整流程与参数详见 **r2-goods** skill。
78
88
 
79
89
  ## 其他命令
80
90
 
@@ -83,15 +93,51 @@ npm install -g @round2ai/r2-cli@latest
83
93
  | `r2-cli update` | 一键更新 CLI 和技能 |
84
94
  | `r2-cli uninstall` | 卸载并清除配置 |
85
95
 
86
- ## Agent 上架路由(概要)
96
+ ## 上架路由
97
+
98
+ 详见 **r2-goods** skill 的「上架路由决策」章节。
99
+
100
+ ## Network & Retry
101
+
102
+ Agent 处理命令失败时的策略:
103
+
104
+ - **网络错误**(`TypeError`、`fetch failed`):最多自动重试 2 次,间隔 3 秒。连续失败则提示用户检查网络
105
+ - **超时错误**(`timeout`):重试 1 次。仍超时则建议检查网络或 SERVER_BASEURL 配置
106
+ - **认证错误**(`请先运行 r2-cli auth login 登录`、`401`):**不重试**,直接引导用户重新登录(见下方 Token Expiry Recovery)
107
+ - **轮询超时**(`轮询超时`):说明提交已接受但结果未回,建议稍后用 `goods listing` 查看
108
+
109
+ ## Token Expiry Recovery
110
+
111
+ 当命令返回认证错误时:
112
+
113
+ 1. **立即停止当前工作流**,不要继续执行其他命令
114
+ 2. 告知用户 Token 已过期,引导重新登录:`r2-cli auth login --json`
115
+ 3. 重新登录成功后,**从上次成功的步骤继续**(不要从头开始)
116
+
117
+ ## 友好输出原则
118
+
119
+ Agent 执行 `--json` 命令后,**不要直接把原始 JSON 丢给用户**。应从 JSON 中提取关键字段,整理为易读格式:
120
+
121
+ ```
122
+ ❌ 错误:直接把 JSON 丢给用户
123
+ { "success": true, "data": [{ "shopId": "10086", "shopName": "xxx", "platform": "xianyu" }] }
124
+
125
+ ✅ 正确:提取关键字段,整理展示
126
+ 店铺列表:
127
+ 1. xxx(xianyu)— shopId: 10086
128
+ ```
129
+
130
+ 具体规则:
131
+ - **查询结果**:用编号列表展示(参见各 reference 的"Agent 展示格式"模板),末尾提示用户选择
132
+ - **操作结果**:提取关键字段(listing ID、价格、状态等),一行一个字段简洁展示
133
+ - **错误信息**:直接展示 `error` 字段内容,不展示整个 JSON 结构
134
+ - **确认提示**:展示商品关键信息(名称/价格/店铺)后,引导用户输入 yes/no
135
+
136
+ 始终遵守:**Agent 看 JSON,用户看友好文本。**
87
137
 
88
- 用户说"上架"时需要选择正确的方式:
89
- - **用户明确指定方式或提供了图片** → 直接走对应流程
90
- - **未指定方式** → **必须询问用户**:"选品上架还是挂售上架?"
91
- - 选品上架 → `goods up`(店铺 → 仓库 → 选品商品 → 提交价格)
92
- - 挂售上架 → `goods hang-up`(上传图片 → AI 读图识别 → 类目/属性 → 提交)
138
+ ## 分页建议
93
139
 
94
- > 详细决策规则和完整操作流程见 **r2-goods** skill。
140
+ 查询类命令(`goods list`、`goods listing`)建议使用 `--page 1 --size 50`。如果响应包含分页信息,继续翻页直到数据取完。在查询前提醒用户可以通过 `--status` 或 `--stock-id` 缩小范围提高效率。
95
141
 
96
142
  ## 统一错误格式
97
143
 
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "ownerId": "round2ai",
3
- "slug": "r2-cli",
4
- "version": "0.1.0"
3
+ "slug": "r2-shared",
4
+ "version": "1.2.0"
5
5
  }
@@ -0,0 +1,77 @@
1
+ ---
2
+ name: r2-workflow-batch-up
3
+ version: 1.0.0
4
+ description: "批量上架工作流。将选品库中多个商品批量上架到闲鱼,支持同商品多店铺上架。触发词:批量上架、全部上架、都上架。"
5
+ metadata:
6
+ requires:
7
+ bins: ["r2-cli"]
8
+ related:
9
+ - "r2-shared"
10
+ - "r2-auth"
11
+ - "r2-goods"
12
+ ---
13
+
14
+ # 批量上架工作流
15
+
16
+ **CRITICAL -- 开始前 MUST 先用 Read 工具读取 [../r2-shared/SKILL.md](../r2-shared/SKILL.md) 和 [../r2-auth/SKILL.md](../r2-auth/SKILL.md),确保已登录并了解执行规则。商品命令详细用法见 [../r2-goods/SKILL.md](../r2-goods/SKILL.md)。**
17
+
18
+ ## 适用场景
19
+
20
+ - "帮我把这些商品都上架"
21
+ - "选品库全部上架到店铺"
22
+ - "这几件都上架了吧"
23
+
24
+ ## 工作流
25
+
26
+ 1. **确认店铺**:`r2-cli goods shops --json` → 展示店铺让用户选择
27
+ 2. **确认仓库**:`r2-cli goods stocks --json` → 用户选择仓库
28
+ 3. **展示待上架商品**:`r2-cli goods list --stock-id <id> --json`
29
+ 4. **用户选择要上架的商品**(可多选)
30
+ 5. **逐商品询问价格** → 逐个执行 `goods up`
31
+ 6. **汇总结果展示**
32
+
33
+ ```
34
+ 批量上架结果:
35
+ ✅ [商品A] → ¥[价格] → 成功(listing id: [id])
36
+ ✅ [商品B] → ¥[价格] → 成功(listing id: [id])
37
+ ❌ [商品C] → 失败:[错误原因]
38
+ ```
39
+
40
+ ## 友好输出指引
41
+
42
+ 批量上架过程中,每个商品独立执行 `goods up --json`,Agent 需要逐个处理响应:
43
+
44
+ **每上架一个商品,及时反馈进度**:
45
+ ```
46
+ [1/3] Nike 运动鞋 → 上架中...
47
+ [1/3] Nike 运动鞋 → ✅ 成功(id: 12345)
48
+ [2/3] Adidas T恤 → 上架中...
49
+ [2/3] Adidas T恤 → ❌ 失败:商家编码重复
50
+ ...
51
+ ```
52
+
53
+ **全部完成后展示汇总**:
54
+ ```
55
+ 批量上架完成!
56
+ ✅ 成功:2 个商品
57
+ - Nike 运动鞋 → ¥299 → 店铺A(id: 12345)
58
+ - LV 包 → ¥9999 → 店铺B(id: 12346)
59
+ ❌ 失败:1 个商品
60
+ - Adidas T恤 → 错误:商家编码重复
61
+ ```
62
+
63
+ > 每个 `goods up --json` 返回 `{ success, data: { listing: { id, goodsName, price, shopName, status } } }`。Agent 从每个响应中提取 `success` 和 `data.listing` 字段,累加后汇总展示。
64
+ >
65
+ > 中途 Token 过期时:停止工作流,告知用户已完成的商品数,引导重新登录后从断点继续。**不要丢弃已完成的结果**。
66
+
67
+ ## 规则
68
+
69
+ - **每个商品独立提交**:一个失败不影响其他商品
70
+ - **批量上架间隔至少 1 秒**,避免触发限流
71
+ - **中途 Token 过期**:停止工作流,引导重新登录后从当前商品继续
72
+ - **提交失败 ≠ 已下架**:可能只是轮询超时,稍后用 `goods listing` 确认
73
+
74
+ ## 参考
75
+
76
+ - [r2-goods/SKILL.md](../r2-goods/SKILL.md) — goods up 详细参数
77
+ - [r2-shared/SKILL.md](../r2-shared/SKILL.md) — 执行规则、Token Expiry Recovery
@@ -0,0 +1,5 @@
1
+ {
2
+ "ownerId": "round2ai",
3
+ "slug": "r2-workflow-batch-up",
4
+ "version": "1.0.0"
5
+ }