@round2ai/r2-cli 1.0.15 → 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.
@@ -0,0 +1,68 @@
1
+ # r2-auth-login — 扫码登录 / 闲鱼授权
2
+
3
+ ## `auth login --json` — 扫码登录
4
+
5
+ ```bash
6
+ r2-cli auth login --json
7
+ ```
8
+
9
+ **两段 JSON 输出:**
10
+
11
+ 第 1 段(立即输出,二维码信息):
12
+
13
+ | 字段 | 说明 |
14
+ |------|------|
15
+ | `qrToken` | 二维码 token(内置轮询使用) |
16
+ | `expireTimeMs` | 二维码过期时间(毫秒),默认 5 分钟 |
17
+ | `qrUrl` | 本地扫码页面链接,需展示给用户 |
18
+ | `pollIntervalMs` | 轮询间隔(毫秒) |
19
+
20
+ 第 2 段(用户扫码后输出):
21
+
22
+ ```json
23
+ { "success": true, "userInfo": { "nickname": "...", "mobile": "..." } }
24
+ ```
25
+
26
+ ## `auth xianyu --json` — 闲鱼店铺授权
27
+
28
+ ```bash
29
+ r2-cli auth xianyu --json
30
+ ```
31
+
32
+ 第 1 段(立即输出):
33
+
34
+ | 字段 | 说明 |
35
+ |------|------|
36
+ | `state` | 授权状态 token |
37
+ | `expireTimeMs` | 过期时间,默认 5 分钟 |
38
+ | `qrUrl` | 本地授权页面链接 |
39
+ | `pollIntervalMs` | 轮询间隔(毫秒) |
40
+
41
+ 第 2 段(用户扫码后输出):
42
+
43
+ ```json
44
+ { "success": true, "shopId": "...", "shopName": "..." }
45
+ ```
46
+
47
+ ## 手动轮询(不推荐)
48
+
49
+ `auth login` 和 `auth xianyu` 的 `--json` 模式已内置自动轮询,通常不需要手动调用 poll 命令。仅在命令中断需要恢复时使用:
50
+
51
+ ```bash
52
+ r2-cli auth login poll --token <qrToken>
53
+ r2-cli auth xianyu poll --state <state>
54
+ ```
55
+
56
+ ## 错误处理
57
+
58
+ | 错误信息 | 原因 | 解决方法 |
59
+ |----------|------|----------|
60
+ | `二维码已过期` | 扫码超时(5 分钟) | 重新执行命令 |
61
+ | `授权链接已过期` | 授权扫码超时(5 分钟) | 重新执行命令 |
62
+ | `网络连接失败` | API 服务不可达 | 检查网络连接,确认 SERVER_BASEURL 配置 |
63
+ | `请先运行 r2-cli auth login 登录` | Token 过期或未登录 | 执行 `r2-cli auth login --json` |
64
+
65
+ ## 参考
66
+
67
+ - [../SKILL.md](../SKILL.md) — 认证命令完整流程
68
+ - [../../r2-shared/SKILL.md](../../r2-shared/SKILL.md) — 执行规则和错误格式
@@ -0,0 +1,29 @@
1
+ # r2-auth-logout — 退出登录
2
+
3
+ ## 命令
4
+
5
+ ```bash
6
+ r2-cli auth logout [--json]
7
+ ```
8
+
9
+ ## 说明
10
+
11
+ 清除本地存储的登录凭证(`~/.r2-cli/config.json`)。
12
+
13
+ **安全确认**:Agent 执行前必须先询问用户确认,不要静默执行。
14
+
15
+ ## 输出
16
+
17
+ ```json
18
+ { "success": true, "message": "已退出登录" }
19
+ ```
20
+
21
+ ## 注意事项
22
+
23
+ - 退出后需要重新执行 `auth login --json` 才能继续操作
24
+ - 退出不会影响已上架的商品
25
+
26
+ ## 参考
27
+
28
+ - [../SKILL.md](../SKILL.md) — 认证命令
29
+ - [r2-auth-login](r2-auth-login.md) — 重新登录流程
@@ -0,0 +1,27 @@
1
+ # r2-auth-status — 查看登录状态
2
+
3
+ ## 命令
4
+
5
+ ```bash
6
+ r2-cli auth status [--json]
7
+ ```
8
+
9
+ ## 输出
10
+
11
+ 不传 `--json` 时输出人类可读状态信息。传 `--json` 时:
12
+
13
+ ```json
14
+ { "success": true, "data": { "loggedIn": true, "userInfo": { ... } } }
15
+ ```
16
+
17
+ ## 常见状态
18
+
19
+ | 状态 | 含义 | Agent 操作 |
20
+ |------|------|-----------|
21
+ | `loggedIn: true` | 已登录,Token 有效 | 可继续执行业务命令 |
22
+ | `loggedIn: false` | 未登录或 Token 过期 | 引导用户执行 `auth login --json` |
23
+
24
+ ## 参考
25
+
26
+ - [../SKILL.md](../SKILL.md) — 认证命令
27
+ - [../../r2-shared/SKILL.md](../../r2-shared/SKILL.md) — Token Expiry Recovery
@@ -14,13 +14,16 @@ metadata:
14
14
 
15
15
  # R2-Goods (v1)
16
16
 
17
- > **Tip**: Agent 获取数据后展示给用户选择,不要让用户自己提供 ID。
17
+ > **Tip**: Agent 获取数据后展示给用户选择,不要让用户自己提供 ID。遵守「友好输出原则」:提取关键字段展示,不丢原始 JSON
18
18
  > **Tip**: 所有 `--json` 命令统一错误格式 `{ success: false, error: "..." }`,检查 `success` 判断成败。
19
+ > **Tip**: 查询分页建议使用 `--page 1 --size 50`。若响应含分页信息则继续翻页取完。在查询前提醒用户通过 `--status` 或 `--stock-id` 缩小范围提高效率。
19
20
 
20
21
  商品管理专家,指导 AI Agent 完成商品上架、下架、改价、挂售全流程。
21
22
 
22
23
  ## CRITICAL
23
24
 
25
+ **CRITICAL -- 开始前 MUST 先用 Read 工具读取 [../r2-shared/SKILL.md](../r2-shared/SKILL.md)**(执行规则、版本检查、错误格式、网络重试、Token 恢复),然后读取 [../r2-auth/SKILL.md](../r2-auth/SKILL.md) 确保已登录。
26
+
24
27
  命令执行规则见 **r2-shared** skill 的「执行规则」。安装、统一错误格式见 **r2-shared** skill。认证登录见 **r2-auth** skill。
25
28
 
26
29
  ## 上架路由决策
@@ -128,7 +131,7 @@ metadata:
128
131
  - **描述自动生成**:品牌+款式+颜色+材质+货号自动组合,不要标记为"需要补充"
129
132
  - **季节自动推断**:夹克→春秋季,羽绒服→秋冬季,T恤→夏季等,不需要问用户
130
133
  - **尺码/货号从标签读取**:图片中有标签时自动提取,读不到才问用户
131
- - **标题自动组合**:品牌+款式+颜色+尺码+成色
134
+ - **标题自动组合**:品牌+款式+颜色+尺码+成色,**最长 30 单位**(半角字符 0.5、全角字符 1,约 30 汉字或 60 英文)。超长时优先保留品牌和核心款式,省略成色或尺码
132
135
  - **stuff-status 与 itemAttrs 成色映射**:
133
136
 
134
137
  | stuff-status | itemAttrs 成色 valueName |
@@ -143,6 +146,14 @@ metadata:
143
146
 
144
147
  > Agent 执行具体操作时,用 Read 工具读取对应的 reference 文件获取完整参数和流程说明。
145
148
 
149
+ ## 场景指南
150
+
151
+ | 场景 | 说明 | 指南 |
152
+ |------|------|------|
153
+ | 服装/鞋包挂售 | 服装、鞋类、包袋的季节推断与属性指南 | [scenes/r2-scene-hangup-fashion.md](scenes/r2-scene-hangup-fashion.md) |
154
+ | 带图片修改商品 | 用户提供图片时自动修改商品信息的全流程 | [scenes/r2-scene-edit-with-images.md](scenes/r2-scene-edit-with-images.md) |
155
+ | 批量操作 | 多商品上架、跨店铺操作与分页策略 | [scenes/r2-scene-batch-operations.md](scenes/r2-scene-batch-operations.md) |
156
+
146
157
  ## 错误处理
147
158
 
148
159
  所有 `--json` 命令统一错误格式:`{ "success": false, "error": "错误信息" }`
@@ -158,5 +169,6 @@ metadata:
158
169
  | `getCategoryId() is null` | edit 缺少 `--category-id` | 必须传 `--category-id` 和 `--channel-cat-id` |
159
170
  | `商家编码重复` | out-item-no 同店铺已存在 | 更换唯一编码 |
160
171
  | `该商品已上架` | 挂售已下架商品重新提交时 out-item-no 被占用 | 更换新的 out-item-no |
172
+ | `标题过长` | 标题超过 30 单位限制(半角 0.5/全角 1) | 缩短标题,保留品牌和核心款式 |
161
173
  | `ITEM_CONDITION_NOT_SUPPORT_SIGN` | 售后服务未开通或品类不支持 | 默认关闭售后 |
162
174
  | `轮询超时` | 上架结果查询超时 | 稍后用 `goods listing` 查看 |
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "ownerId": "round2ai",
3
3
  "slug": "r2-goods",
4
- "version": "0.1.0"
4
+ "version": "1.1.0"
5
5
  }
@@ -2,22 +2,7 @@
2
2
 
3
3
  > **Prerequisite:** 读取 [`../SKILL.md`](../SKILL.md) 了解路由决策和命令概览。
4
4
 
5
- 挂售模式支持完整商品信息:图片、类目、属性等。与普通上架(`goods up`)是不同流程。
6
-
7
- **核心理念**:**图片里能看到的,就别问用户**。Agent 从图片中提取一切可识别的信息,用户只需要提供价格。
8
-
9
- ## 核心原则
10
-
11
- - **图片优先**:所有字段优先从图片提取,图片无法识别时才问用户
12
- - 必须问用户的只有:**价格**
13
- - 商家编码(`out-item-no`)**优先让用户自定义**,用户不填则推荐自动生成编码(如 `GS20260512-0005`)
14
- - **必须问用户的条件**:价格(永远无法从图片判断)。其他一切字段都应尝试从图片获取。商家编码优先用户自定义,不填则推荐自动生成
15
- - **描述必须自动生成**:基于 AI 识别的品牌+款式+颜色+材质+货号自动组合,不要标记为"需要补充"
16
- - **品牌必须双传**:`--brand-name`(文本字段)+ itemAttrs 中的一项(含 propId/valueId/valueName/propName/channelCatId),缺一不可
17
- - **季节自动推断**:根据商品类型推断适用季节(夹克/风衣→春秋季,羽绒服→秋冬季,T恤/短裤→夏季),不需要问用户
18
- - **尺码/货号从标签读取**:如果图片中有标签/吊牌/水洗标,尝试读取尺码和货号,读不到时才问用户
19
- - **标题自动组合**:品牌+款式+颜色+尺码+成色,自动组合为标题
20
- - 提交成功后展示上架结果摘要
5
+ 挂售模式支持完整商品信息:图片、类目、属性等。核心原则见 SKILL.md 的「关键注意事项」。
21
6
 
22
7
  ## 图片识别降级策略
23
8
 
@@ -26,7 +11,7 @@
26
11
  | 能查看图片(多模态) | 用 Read 工具读图 → 自动识别品牌/成色/类目/描述 |
27
12
  | 不能查看图片 | 跳过识别 → 向用户询问品牌、类目、成色、描述等信息 |
28
13
 
29
- > 不同 Agent 能力不同(Claude Code / Gemini 支持读图,部分 Agent 不支持)。Agent 应自行判断是否能识别图片,不能则直接走询问路径。两条路径最终都走相同的 submit 提交。
14
+ > 不同 Agent 能力不同。Agent 应自行判断是否能识别图片,不能则直接走询问路径。两条路径最终都走相同的 submit 提交。
30
15
 
31
16
  ---
32
17
 
@@ -50,7 +35,7 @@ r2-cli goods hang-up upload-images --shop-id <shopId> --files /path/img1.jpg,/pa
50
35
  }
51
36
  ```
52
37
 
53
- > 图片路径是用户本地文件路径。`--image-ids` 保持字符串,不要转数字(19 位 ID 会精度丢失)。**CLI 自动压缩超过 2MB 的图片**(使用 sharp 渐进式降低 JPEG quality 直到 < 2MB,PNG 自动转 JPEG),原文件不会被修改。多张图片**并行上传**,单张失败自动重试 1 次。
38
+ > 图片路径是用户本地文件路径。`--image-ids` 保持字符串,不要转数字(19 位 ID 会精度丢失)。**CLI 自动压缩超过 2MB 的图片**(sharp 渐进式降低 JPEG quality 直到 < 2MB,PNG 自动转 JPEG),原文件不会被修改。多张图片**并行上传**,单张失败自动重试 1 次。
54
39
 
55
40
  返回(部分成功时带 `warning` 和 `failed` 字段):
56
41
 
@@ -71,23 +56,6 @@ r2-cli goods hang-up upload-images --shop-id <shopId> --files /path/img1.jpg,/pa
71
56
 
72
57
  > **多图不一致处理**:如果多张图片显示不同商品(如不同款式、不同品牌),Agent 应识别后告知用户,只保留同一商品的图片。不要把不同商品混在一起提交。
73
58
 
74
- **图片识别 vs 用户操作**:
75
-
76
- | 字段 | 可从图片识别? | 处理方式 |
77
- |------|---------------|----------|
78
- | `--title`(标题) | ✅ | **自动组合**:品牌+款式+颜色+尺码+成色,汇总确认 |
79
- | `--desc`(描述) | ✅ | **自动生成**:品牌+系列+款式+颜色+材质+货号+成色组合,不要标记为"需要补充" |
80
- | `--stuff-status`(成色) | ✅ | 自动判断,汇总确认 |
81
- | `--brand-name`(品牌) | ✅ | 识别后调 brands 搜索确认,**同时加入 itemAttrs**,汇总确认 |
82
- | `--category-id` / `--channel-cat-id` | ✅ | 自动推断,汇总确认 |
83
- | 季节属性 | ✅ | **自动推断**:夹克/风衣→春秋季,羽绒服→秋冬季,T恤/短裤→夏季,卫衣→春秋季等 |
84
- | `--size`(尺码) | ⚠️ | 有标签/吊牌则读取,无则汇总时问 |
85
- | `--goods-no`(货号) | ⚠️ | 有标签则读取,无则留空 |
86
- | 款式/颜色/材质属性 | ⚠️ | 能识别则自动匹配 propsValues,不能则汇总时问 |
87
- | `--price`(售价) | ❌ | **必须问用户** |
88
- | `--out-item-no`(商家编码) | ⚠️ | 先问用户自定义编码,不填则推荐自动生成(如 `GS20260512-0005`) |
89
- | `--shop-id`(店铺) | ❌ | 只有一个店铺时自动选,多个则问 |
90
-
91
59
  **成色判断映射**:
92
60
 
93
61
  | 图片中商品状态 | `--stuff-status` 值 |
@@ -97,15 +65,6 @@ r2-cli goods hang-up upload-images --shop-id <shopId> --files /path/img1.jpg,/pa
97
65
  | 轻微使用痕迹 | `95`(95新) |
98
66
  | 明显使用痕迹 | `90`(9新) |
99
67
 
100
- **季节推断映射**:
101
-
102
- | 商品类型 | 适用季节 |
103
- |----------|----------|
104
- | 夹克、风衣、卫衣、针织衫 | 春秋季 |
105
- | 羽绒服、棉衣、毛呢大衣 | 秋冬季 |
106
- | T恤、短裤、背心、凉鞋 | 夏季 |
107
- | 基础款衬衫、休闲裤 | 四季 |
108
-
109
68
  **如果用户没提供价格和商家编码,此时询问**(不要留到最后)。
110
69
 
111
70
  ---
@@ -118,7 +77,14 @@ r2-cli goods hang-up upload-images --shop-id <shopId> --files /path/img1.jpg,/pa
118
77
  r2-cli goods hang-up categories --json
119
78
  ```
120
79
 
121
- Agent 根据图片识别结果自动匹配类目(不需要用户从列表中选)。只在识别不确定时才展示列表。
80
+ Agent 根据图片识别结果自动匹配类目(不需要用户从列表中选)。只在识别不确定时才展示列表:
81
+
82
+ ```
83
+ 请选择最匹配的类目:
84
+ 1. 男士鞋靴 > 低帮鞋(推荐)
85
+ 2. 男士鞋靴 > 运动鞋
86
+ 3. 男士鞋靴 > 板鞋
87
+ ```
122
88
 
123
89
  **获取属性 → 自动匹配**:
124
90
 
@@ -136,11 +102,7 @@ Agent 遍历所有属性,尽量自动匹配:
136
102
 
137
103
  > **props API 说明**:`props` 返回所有属性及其 `propsValues`(非品牌属性可直接从这里选值);品牌属性需额外调用 `brands` 搜索。
138
104
 
139
- **品牌精确匹配规则**:brands 搜索结果中必须选**完全匹配**的官方名称(如搜 Nike → 只选 `Nike/耐克`,忽略 BACHNIKE、NIKE 7 等)
140
-
141
- **品牌搜索注意事项**:
142
- - **支持大小写模糊搜索**:如搜索 `nike` 也能匹配到 `Nike/耐克`,搜索 `louis` 也能匹配到 `Louis Vuitton/路易威登`
143
- - **搜索结果中选择精确匹配**:如搜 nike 返回多个结果,选官方名称 `Nike/耐克`,忽略 BACHNIKE、NIKE 7 等
105
+ **品牌精确匹配规则**:brands 搜索结果中必须选**完全匹配**的官方名称(如搜 Nike → 只选 `Nike/耐克`,忽略 BACHNIKE、NIKE 7 等)。**支持大小写模糊搜索**。
144
106
 
145
107
  ```bash
146
108
  r2-cli goods hang-up brands --channel-cat-id <id> --prop-id <品牌propId> --key "Nike" --json
@@ -148,8 +110,6 @@ r2-cli goods hang-up brands --channel-cat-id <id> --prop-id <品牌propId> --key
148
110
 
149
111
  最终构建 `--item-attrs`(**5 个字段:valueName、valueId、propId、propName、channelCatId**):
150
112
 
151
- **⚠️ 品牌必须同时出现在 itemAttrs 和 --brand-name 中**。只传 `--brand-name` 不会把品牌写入商品属性,品牌必须作为 itemAttrs 的一项传入(含 propId、valueId、valueName、propName、channelCatId)。
152
-
153
113
  ```json
154
114
  [
155
115
  { "valueName": "Nike/耐克", "valueId": "68af4e8f...", "propId": "83b8f62c...", "propName": "品牌", "channelCatId": "f4718bbb..." },
@@ -206,13 +166,11 @@ r2-cli goods hang-up submit \
206
166
  --json
207
167
  ```
208
168
 
209
- 成功返回:
169
+ 成功返回:`{ "success": true, "data": "上架成功" }`
210
170
 
211
- ```json
212
- { "success": true, "data": "上架成功" }
213
- ```
171
+ ### 友好输出指引
214
172
 
215
- **提交后展示上架结果摘要**(让用户知道上架了什么):
173
+ 提交成功后,Agent 从流程中已收集的参数提取关键信息**汇总展示**,不依赖响应中的字段:
216
174
 
217
175
  ```
218
176
  上架成功!
@@ -224,6 +182,14 @@ r2-cli goods hang-up submit \
224
182
  - 店铺:xxx
225
183
  ```
226
184
 
185
+ > Agent 提交前已收集所有参数(title、price、brand-name、category、stuff-status、shop-id),提交成功后直接用这些参数构建摘要,不要翻查历史记录。
186
+ >
187
+ > 如果提交失败(`success: false`),直接展示 `error` 字段内容:
188
+ > ```
189
+ > 上架失败:[error 内容]
190
+ > ```
191
+ > 不要展示整个 JSON。
192
+
227
193
  ---
228
194
 
229
195
  ## 必填字段处理
@@ -245,6 +211,8 @@ r2-cli goods hang-up submit \
245
211
  - **`--stuff-status` 准新是数字 `-1`**:不是字符串 `"-1"`,直接传 `--stuff-status -1`
246
212
  - **`--item-attrs` 传 JSON 字符串**:值必须是 `JSON.stringify()` 后的字符串,不能直接传对象。命令行示例:`--item-attrs '[{"propId":"x","valueId":"y"}]'`
247
213
  - **`--files` 和 `--image-ids` 都是逗号分隔**:不要多次传 `--files`,用逗号拼成单个值:`--files a.jpg,b.jpg`
214
+ - **标题长度限制**:闲鱼标题上限 30 单位(半角字符 0.5、全角字符 1)。自动组合时如品牌+款式+颜色+尺码+成色超过限制,优先保留品牌和核心款式,省略成色或尺码。CLI 会校验用户提供的标题,超长报错
215
+ - **价格上限**:售价上限 99,999,999 元,CLI 自动校验;原价仅展示用途,不校验上限
248
216
  - **`--category-id` 取 `catId` 不是 `id`**:categories 返回的数据中 `catId`(如 50106003)是真正的类目 ID,`id`(如 865)是自增 ID,不要用错
249
217
 
250
218
  ## 必填参数
@@ -252,7 +220,7 @@ r2-cli goods hang-up submit \
252
220
  | 参数 | 说明 |
253
221
  |------|------|
254
222
  | `--shop-id <id>` | 店铺 ID(即闲鱼用户名 account) |
255
- | `--title <title>` | 商品标题 |
223
+ | `--title <title>` | 商品标题(最长 30 单位:半角 0.5/全角 1) |
256
224
  | `--price <amount>` | 售价 |
257
225
  | `--category-id <id>` | 大分类 ID(从 categories 获取) |
258
226
  | `--channel-cat-id <id>` | 小分类 ID(从 categories 获取) |
@@ -261,16 +229,6 @@ r2-cli goods hang-up submit \
261
229
  | `--desc <desc>` | 商品描述 |
262
230
  | `--out-item-no <no>` | 商家编码(同店铺唯一,用户自定义) |
263
231
 
264
- ## 成色等级
265
-
266
- | 值 | 含义 |
267
- |----|------|
268
- | `100` | 全新 |
269
- | `-1` | 准新 |
270
- | `99` | 99新 |
271
- | `95` | 95新 |
272
- | `90` | 9新 |
273
-
274
232
  ## 可选参数
275
233
 
276
234
  | 参数 | 默认值 | 说明 |
@@ -289,17 +247,7 @@ r2-cli goods hang-up submit \
289
247
 
290
248
  ## 售后服务(默认关闭)
291
249
 
292
- 提交时自动附带售后服务配置,**默认全部关闭**。卖家需在闲鱼 APP 开通后才能开启(我的 → 设置 → 卖家服务 → 保障服务),未开通的服务如果传 `true` 会导致提交失败(错误:`ITEM_CONDITION_NOT_SUPPORT_SIGN`)。
293
-
294
- | 服务 | 默认值 | 说明 |
295
- |------|--------|------|
296
- | 极速发货-24小时 | 关闭 | 24小时内发货 |
297
- | 描述不符包邮退 | 关闭 | 描述不符退货包邮 |
298
- | 七天无理由退货 | 关闭 | 支持七天无理由 |
299
- | 极速发货-10分钟 | 关闭 | 10分钟内响应 |
300
- | 极速发货-48小时 | 关闭 | 48小时内发货 |
301
- | 正品保障 | 关闭 | 正品保障服务 |
302
- | 虚拟-描述不符包退 | 关闭 | 虚拟商品描述不符包退 |
250
+ 提交时自动附带售后服务配置,**默认全部关闭**。卖家需在闲鱼 APP 开通后才能开启,未开通的服务如果传 `true` 会导致提交失败(错误:`ITEM_CONDITION_NOT_SUPPORT_SIGN`)。
303
251
 
304
252
  ## 挂售错误处理
305
253
 
@@ -309,11 +257,11 @@ r2-cli goods hang-up submit \
309
257
  | 413 / `图片太大` | 图片超过服务端大小限制 | CLI 自动压缩 > 2MB 的图片,如仍失败请手动压缩 |
310
258
  | `请填写有效的商品叶子类目` | category-id 或 channel-cat-id 错误 | 重新查询 categories |
311
259
  | `找不到传入的某些图片` | 图片 ID 无效或过期 | 重新上传图片 |
312
- | `商家编码重复` | out-item-no 同店铺已存在 | 更换唯一编码 |
313
- | `该商品已上架` | 挂售已下架商品重新提交使用了相同的 out-item-no | 更换新的 out-item-no,或检查 listing 确认该商品是否已在闲鱼端恢复上架 |
314
260
  | `ITEM_CONDITION_NOT_SUPPORT_SIGN` | 售后服务未开通或品类不支持 | 默认关闭售后,或在闲鱼 APP 开通对应服务 |
261
+ | `标题过长` | 标题超过 30 单位限制 | 缩短标题,保留品牌和核心款式 |
315
262
 
316
263
  ## References
317
264
 
318
265
  - [r2-goods SKILL.md](../SKILL.md) — 商品管理概览和路由决策
319
266
  - [r2-shared](../../r2-shared/SKILL.md) — 认证和全局规则
267
+ - [../scenes/r2-scene-hangup-fashion.md](../scenes/r2-scene-hangup-fashion.md) — 服装鞋包挂售场景指南
@@ -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
  {
@@ -42,6 +51,30 @@
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,6 +128,15 @@ 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
  修改已上架商品的标题、描述、品牌、类目、图片、属性等。
@@ -121,32 +181,9 @@ r2-cli goods price --stock-goods-id <id> --shop-id <id> --price <新价格> --js
121
181
  | `--original-price <n>` | 原价(元) |
122
182
  | `--size <size>` | 尺码 |
123
183
 
124
- ### 带图片修改的全自动流程
184
+ ### 带图片修改
125
185
 
126
- 用户提供了图片文件时,**Agent 自动完成所有步骤,用户只需确认**:
127
-
128
- 1. **展示列表**:`r2-cli goods listing --json` → 展示给用户选择要修改的商品(获取 stockGoodsId、shopId)
129
- 2. **上传图片**:`r2-cli goods hang-up upload-images --shop-id <shopId> --files <paths> --json`
130
- 3. **AI 读图识别**:Agent 用 Read 工具查看图片,识别品牌/类目/成色/描述/材质等
131
- 4. **自动匹配类目**:`r2-cli goods hang-up categories --json` → 根据识别结果匹配 catId + channelCatId(如"运动夹克" → 男士服装>夹克)
132
- 5. **自动查询属性**:`r2-cli goods hang-up props --channel-cat-id <id> --json` → 根据识别结果自动匹配:
133
- - 成色(全新/99新/95新等) → 查找对应 valueId
134
- - 尺码(XL/L/M 等) → 查找对应 valueId
135
- - 适用季节 → 查找对应 valueId
136
- - 其他属性 → 根据识别结果匹配
137
- 6. **自动搜索品牌**:`r2-cli goods hang-up brands --channel-cat-id <> --prop-id <> --key <品牌名> --json` → 获取品牌 valueId
138
- 7. **汇总确认**:展示「当前值 vs 变更值」对比表,用户确认
139
- 8. **提交修改**:
140
-
141
- ```bash
142
- r2-cli goods edit \
143
- --id <goodsListingId> \
144
- --category-id <catId> --channel-cat-id <channelCatId> \
145
- --image-ids "id1,id2,id3" \
146
- --item-attrs '[{...品牌...},{...成色...},{...尺码...},{...季节...}]' \
147
- --brand-name "Louis Vuitton/路易威登" \
148
- --json
149
- ```
186
+ 用户提供了图片文件时,参见场景指南:[../scenes/r2-scene-edit-with-images.md](../scenes/r2-scene-edit-with-images.md)
150
187
 
151
188
  ### 只改文字字段(无图片)
152
189
 
@@ -165,3 +202,20 @@ r2-cli goods edit --id 5 \
165
202
  ```
166
203
 
167
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
+ ```