@round2ai/r2-cli 1.0.11 → 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 +43 -14
- package/dist/README.md +43 -14
- package/dist/pages/login.html +219 -57
- package/dist/pages/xianyu-auth.html +244 -67
- package/dist/r2-cli.js +2160 -45
- package/package.json +9 -6
- package/scripts/install-skills.js +28 -19
- package/skills/r2-auth/SKILL.md +31 -45
- package/skills/r2-goods/SKILL.md +104 -163
- 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 +117 -0
- package/dist/package.json +0 -61
- package/scripts/build.js +0 -176
- package/scripts/dev.js +0 -22
- package/skills/r2-cli/SKILL.md +0 -70
- /package/skills/{r2-cli → r2-shared}/_meta.json +0 -0
package/package.json
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@round2ai/r2-cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.12-beta.1",
|
|
4
4
|
"description": "R2-CLI,向 AI 开放二手潮奢交易全链路能力",
|
|
5
5
|
"main": "dist/r2-cli.js",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
|
-
"r2-cli": "
|
|
8
|
+
"r2-cli": "dist/r2-cli.js"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
11
|
"postinstall": "node scripts/install-skills.js",
|
|
12
12
|
"build": "cross-env NODE_ENV=development node scripts/build.js",
|
|
13
13
|
"build:prod": "cross-env NODE_ENV=production node scripts/build.js",
|
|
14
|
-
"dev": "node scripts/dev.js"
|
|
14
|
+
"dev": "node scripts/dev.js",
|
|
15
|
+
"test": "vitest run",
|
|
16
|
+
"test:watch": "vitest"
|
|
15
17
|
},
|
|
16
18
|
"keywords": [
|
|
17
19
|
"round2ai",
|
|
@@ -25,7 +27,7 @@
|
|
|
25
27
|
],
|
|
26
28
|
"files": [
|
|
27
29
|
"dist",
|
|
28
|
-
"scripts",
|
|
30
|
+
"scripts/install-skills.js",
|
|
29
31
|
"skills",
|
|
30
32
|
"package.json",
|
|
31
33
|
"README.md"
|
|
@@ -37,7 +39,7 @@
|
|
|
37
39
|
},
|
|
38
40
|
"repository": {
|
|
39
41
|
"type": "git",
|
|
40
|
-
"url": "https://github.com/Round2AI/r2-cli"
|
|
42
|
+
"url": "git+https://github.com/Round2AI/r2-cli.git"
|
|
41
43
|
},
|
|
42
44
|
"dependencies": {
|
|
43
45
|
"@inquirer/prompts": "^8.4.2",
|
|
@@ -56,6 +58,7 @@
|
|
|
56
58
|
"cross-env": "^10.1.0",
|
|
57
59
|
"dotenv": "^17.4.2",
|
|
58
60
|
"esbuild": "^0.28.0",
|
|
59
|
-
"typescript": "^6.0.2"
|
|
61
|
+
"typescript": "^6.0.2",
|
|
62
|
+
"vitest": "^4.1.5"
|
|
60
63
|
}
|
|
61
64
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* postinstall: 将 skills/ 复制到 ~/.agents/skills/
|
|
2
|
+
* postinstall: 将 skills/ 复制到 ~/.agents/skills/
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import fs from "node:fs";
|
|
@@ -10,7 +10,6 @@ import { fileURLToPath } from "node:url";
|
|
|
10
10
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
11
11
|
const pkgSkillsDir = path.join(__dirname, "..", "skills");
|
|
12
12
|
const agentsDir = path.join(os.homedir(), ".agents", "skills");
|
|
13
|
-
const claudeDir = path.join(os.homedir(), ".claude", "skills");
|
|
14
13
|
|
|
15
14
|
if (!fs.existsSync(pkgSkillsDir)) process.exit(0);
|
|
16
15
|
|
|
@@ -18,37 +17,47 @@ fs.mkdirSync(agentsDir, { recursive: true });
|
|
|
18
17
|
|
|
19
18
|
for (const name of fs.readdirSync(pkgSkillsDir)) {
|
|
20
19
|
const rawSrc = path.join(pkgSkillsDir, name);
|
|
21
|
-
// npm 包内是真实目录,本地开发可能是 symlink → 解析真实路径
|
|
22
20
|
let src;
|
|
23
21
|
try { src = fs.realpathSync(rawSrc); } catch { continue; }
|
|
24
22
|
if (!fs.statSync(src).isDirectory()) continue;
|
|
25
23
|
|
|
26
24
|
const dest = path.join(agentsDir, name);
|
|
27
|
-
// 清空目标目录中的旧残留文件
|
|
28
25
|
if (fs.existsSync(dest)) {
|
|
29
26
|
for (const old of fs.readdirSync(dest)) {
|
|
30
|
-
|
|
27
|
+
const oldPath = path.join(dest, old);
|
|
28
|
+
fs.statSync(oldPath).isDirectory()
|
|
29
|
+
? fs.rmSync(oldPath, { recursive: true })
|
|
30
|
+
: fs.unlinkSync(oldPath);
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
fs.mkdirSync(dest, { recursive: true });
|
|
34
34
|
|
|
35
35
|
for (const file of fs.readdirSync(src)) {
|
|
36
|
-
|
|
36
|
+
const fileSrc = path.join(src, file);
|
|
37
|
+
const fileDest = path.join(dest, file);
|
|
38
|
+
if (fs.statSync(fileSrc).isDirectory()) {
|
|
39
|
+
copyDir(fileSrc, fileDest);
|
|
40
|
+
} else {
|
|
41
|
+
fs.copyFileSync(fileSrc, fileDest);
|
|
42
|
+
}
|
|
37
43
|
}
|
|
44
|
+
}
|
|
38
45
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
} catch {
|
|
47
|
-
// Windows 权限不足时 fallback:直接复制
|
|
48
|
-
fs.mkdirSync(link, { recursive: true });
|
|
49
|
-
for (const file of fs.readdirSync(dest)) {
|
|
50
|
-
fs.copyFileSync(path.join(dest, file), path.join(link, file));
|
|
51
|
-
}
|
|
46
|
+
function copyDir(src, dest) {
|
|
47
|
+
if (fs.existsSync(dest)) {
|
|
48
|
+
for (const old of fs.readdirSync(dest)) {
|
|
49
|
+
const oldPath = path.join(dest, old);
|
|
50
|
+
fs.statSync(oldPath).isDirectory()
|
|
51
|
+
? fs.rmSync(oldPath, { recursive: true })
|
|
52
|
+
: fs.unlinkSync(oldPath);
|
|
52
53
|
}
|
|
53
54
|
}
|
|
55
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
56
|
+
for (const file of fs.readdirSync(src)) {
|
|
57
|
+
const fileSrc = path.join(src, file);
|
|
58
|
+
const fileDest = path.join(dest, file);
|
|
59
|
+
fs.statSync(fileSrc).isDirectory()
|
|
60
|
+
? copyDir(fileSrc, fileDest)
|
|
61
|
+
: fs.copyFileSync(fileSrc, fileDest);
|
|
62
|
+
}
|
|
54
63
|
}
|
package/skills/r2-auth/SKILL.md
CHANGED
|
@@ -1,21 +1,31 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: r2-auth
|
|
3
|
-
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: "R2-CLI 认证登录专家。扫码登录和闲鱼店铺授权。用于登录、login、auth、扫码、二维码、授权、xianyu、logout、登出、状态查询场景。Agent 使用 auth login --json 一步完成登录。Agent 必须先将 qrUrl 链接展示给用户,再等待扫码结果。"
|
|
5
|
+
metadata:
|
|
6
|
+
requires:
|
|
7
|
+
bins: ["r2-cli"]
|
|
8
|
+
cliHelp: "r2-cli auth --help"
|
|
9
|
+
related:
|
|
10
|
+
- "r2-shared"
|
|
4
11
|
---
|
|
5
12
|
|
|
6
|
-
# R2-Auth
|
|
13
|
+
# R2-Auth (v1)
|
|
14
|
+
|
|
15
|
+
> **Tip**: Agent 使用 `--json` 一步完成登录:生成二维码 + 自动打开浏览器 + 自动轮询。**必须先将 qrUrl 展示给用户**,再等待扫码结果。
|
|
16
|
+
> **Tip**: 二维码 5 分钟过期,超时需重新执行命令。Token 存储在 `~/.r2-cli/config.json`。
|
|
7
17
|
|
|
8
18
|
扫码登录 + 闲鱼店铺授权,专为 AI Agent 设计。
|
|
9
19
|
|
|
10
|
-
##
|
|
20
|
+
## CRITICAL
|
|
11
21
|
|
|
12
|
-
|
|
22
|
+
命令执行规则见 **r2-shared** skill 的「执行规则」。安装、统一错误格式见 **r2-shared** skill。
|
|
13
23
|
|
|
14
24
|
---
|
|
15
25
|
|
|
16
|
-
##
|
|
26
|
+
## 扫码登录(auth login)
|
|
17
27
|
|
|
18
|
-
|
|
28
|
+
### 一步式(推荐)
|
|
19
29
|
|
|
20
30
|
```bash
|
|
21
31
|
r2-cli auth login --json
|
|
@@ -23,7 +33,7 @@ r2-cli auth login --json
|
|
|
23
33
|
|
|
24
34
|
命令会依次输出两段 JSON:
|
|
25
35
|
|
|
26
|
-
|
|
36
|
+
**第 1 段:二维码信息(立即输出)**
|
|
27
37
|
|
|
28
38
|
```json
|
|
29
39
|
{
|
|
@@ -39,24 +49,15 @@ r2-cli auth login --json
|
|
|
39
49
|
|------|------|
|
|
40
50
|
| `qrToken` | 二维码 token(轮询用,不需要手动使用) |
|
|
41
51
|
| `expireTimeMs` | 二维码过期时间(毫秒),默认 5 分钟 |
|
|
42
|
-
| `pollIntervalMs` | 轮询间隔(毫秒),不需要手动使用 |
|
|
43
52
|
| `url` | 扫码链接(用户也可手动访问) |
|
|
44
53
|
| `qrUrl` | 本地浏览器扫码页面链接 |
|
|
45
54
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
成功:
|
|
55
|
+
**第 2 段:登录结果(用户扫码确认后输出)**
|
|
49
56
|
|
|
50
57
|
```json
|
|
51
58
|
{ "success": true, "userInfo": { "nickname": "...", "mobile": "..." } }
|
|
52
59
|
```
|
|
53
60
|
|
|
54
|
-
失败:
|
|
55
|
-
|
|
56
|
-
```json
|
|
57
|
-
{ "success": false, "error": "二维码已过期" }
|
|
58
|
-
```
|
|
59
|
-
|
|
60
61
|
### Agent 操作步骤
|
|
61
62
|
|
|
62
63
|
1. 用 Bash 工具 `run_in_background: true` 启动命令
|
|
@@ -73,11 +74,9 @@ r2-cli auth login --json
|
|
|
73
74
|
|
|
74
75
|
**为什么必须先展示链接**:自动打开浏览器在某些环境下可能失败(远程服务器、SSH、无头终端)。链接是用户扫码的唯一保障,必须优先展示。
|
|
75
76
|
|
|
76
|
-
> 旧版两步式流程(先 `auth login qr` 再 `auth login poll`)已废弃。如需手动轮询,可使用 `auth login poll --token <>`。
|
|
77
|
-
|
|
78
77
|
---
|
|
79
78
|
|
|
80
|
-
##
|
|
79
|
+
## 闲鱼店铺授权(auth xianyu)
|
|
81
80
|
|
|
82
81
|
流程与登录类似,同样一步完成:
|
|
83
82
|
|
|
@@ -85,7 +84,7 @@ r2-cli auth login --json
|
|
|
85
84
|
r2-cli auth xianyu --json
|
|
86
85
|
```
|
|
87
86
|
|
|
88
|
-
|
|
87
|
+
**第 1 段:授权二维码信息(立即输出)**
|
|
89
88
|
|
|
90
89
|
```json
|
|
91
90
|
{
|
|
@@ -100,28 +99,15 @@ r2-cli auth xianyu --json
|
|
|
100
99
|
|------|------|
|
|
101
100
|
| `state` | 授权状态 token(轮询用) |
|
|
102
101
|
| `expireTimeMs` | 过期时间(毫秒),默认 5 分钟 |
|
|
103
|
-
| `pollIntervalMs` | 轮询间隔(毫秒) |
|
|
104
102
|
| `qrUrl` | 本地浏览器授权页面链接 |
|
|
105
103
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
成功:
|
|
104
|
+
**第 2 段:授权结果(用户扫码确认后输出)**
|
|
109
105
|
|
|
110
106
|
```json
|
|
111
107
|
{ "success": true, "shopId": "...", "shopName": "..." }
|
|
112
108
|
```
|
|
113
109
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
```json
|
|
117
|
-
{ "success": false, "error": "授权链接已过期" }
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
Agent 操作步骤与登录相同:
|
|
121
|
-
1. 获取第 1 段 JSON
|
|
122
|
-
2. **先展示 `qrUrl` 链接给用户**(单独一行,醒目格式)
|
|
123
|
-
3. 告知用户浏览器会尝试自动打开,如未打开请手动点击链接
|
|
124
|
-
4. 等待第 2 段 JSON
|
|
110
|
+
Agent 操作步骤与登录相同:获取第 1 段 JSON → **先展示 `qrUrl`** → 等待第 2 段 JSON。
|
|
125
111
|
|
|
126
112
|
---
|
|
127
113
|
|
|
@@ -129,20 +115,20 @@ Agent 操作步骤与登录相同:
|
|
|
129
115
|
|
|
130
116
|
| 命令 | 说明 |
|
|
131
117
|
|------|------|
|
|
132
|
-
| `r2-cli auth login` |
|
|
133
|
-
| `r2-cli auth
|
|
118
|
+
| `r2-cli auth login` | 扫码登录(人类使用,自动打开浏览器) |
|
|
119
|
+
| `r2-cli auth xianyu` | 闲鱼店铺授权(人类使用,自动打开浏览器) |
|
|
134
120
|
| `r2-cli auth login poll --token <>` | 手动轮询登录状态(备选,不推荐) |
|
|
135
|
-
| `r2-cli auth xianyu` | 闲鱼店铺授权(自动打开浏览器,人类使用) |
|
|
136
|
-
| `r2-cli auth xianyu --json` | 闲鱼店铺授权(输出 JSON + 自动打开浏览器,Agent 推荐) |
|
|
137
121
|
| `r2-cli auth xianyu poll --state <>` | 手动轮询授权状态(备选,不推荐) |
|
|
138
122
|
| `r2-cli auth status` | 查看登录状态 |
|
|
139
123
|
| `r2-cli auth logout` | 退出登录 |
|
|
140
124
|
|
|
141
125
|
---
|
|
142
126
|
|
|
143
|
-
##
|
|
127
|
+
## 错误处理
|
|
144
128
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
-
|
|
148
|
-
|
|
129
|
+
| 错误信息 | 原因 | 解决方法 |
|
|
130
|
+
|----------|------|----------|
|
|
131
|
+
| `请先运行 r2-cli auth login 登录` | 未登录或 Token 过期 | 执行 `r2-cli auth login --json` |
|
|
132
|
+
| `二维码已过期` | 扫码超时(5 分钟) | 重新执行命令 |
|
|
133
|
+
| `授权链接已过期` | 授权扫码超时(5 分钟) | 重新执行命令 |
|
|
134
|
+
| `网络连接失败` | API 服务不可达 | 检查网络连接,确认 SERVER_BASEURL 配置 |
|
package/skills/r2-goods/SKILL.md
CHANGED
|
@@ -1,206 +1,147 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: r2-goods
|
|
3
|
-
|
|
3
|
+
version: 1.1.0
|
|
4
|
+
description: "R2-CLI 商品管理专家。用于商品上架/下架/改价/修改信息/挂售、查看店铺/仓库/选品商品/上架列表。Agent 获取数据后展示给用户选择,完成 4 步上架流程。触发词:上架、下架、改价、修改商品、挂售、商品列表、goods、up、down、price、edit、hang-up、shops、stocks、listing、list。"
|
|
5
|
+
metadata:
|
|
6
|
+
requires:
|
|
7
|
+
bins: ["r2-cli"]
|
|
8
|
+
cliHelp: "r2-cli goods --help"
|
|
9
|
+
minVersion: "1.0.12"
|
|
10
|
+
related:
|
|
11
|
+
- "r2-shared"
|
|
12
|
+
- "r2-auth"
|
|
4
13
|
---
|
|
5
14
|
|
|
6
|
-
# R2-Goods
|
|
15
|
+
# R2-Goods (v1)
|
|
7
16
|
|
|
8
|
-
|
|
17
|
+
> **Tip**: Agent 获取数据后展示给用户选择,不要让用户自己提供 ID。
|
|
18
|
+
> **Tip**: 所有 `--json` 命令统一错误格式 `{ success: false, error: "..." }`,检查 `success` 判断成败。
|
|
9
19
|
|
|
10
|
-
|
|
20
|
+
商品管理专家,指导 AI Agent 完成商品上架、下架、改价、挂售全流程。
|
|
11
21
|
|
|
12
|
-
|
|
22
|
+
## CRITICAL
|
|
13
23
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
| 命令 | 说明 |
|
|
17
|
-
|------|------|
|
|
18
|
-
| `r2-cli goods shops [--json]` | 查看所有已授权店铺(跨平台) |
|
|
19
|
-
| `r2-cli goods stocks [--json]` | 查看所有仓库 |
|
|
20
|
-
| `r2-cli goods list [--stock-id <id>] [--stock-goods-id <id>] [--json]` | 查看选品商品(两个过滤参数均为可选,支持 `--page <n>` 和 `--size <n>`) |
|
|
21
|
-
| `r2-cli goods listing [--json]` | 查询上架列表(支持多种过滤参数,见下方详细说明) |
|
|
22
|
-
| `r2-cli goods up` | 交互式上架(人类使用,自动轮询上架结果) |
|
|
23
|
-
| `r2-cli goods up --stock-goods-id <id> --shop-id <id> --price <amount> --json` | Agent 直接上架(自动轮询上架结果) |
|
|
24
|
-
| `r2-cli goods down --id <id> [--json]` | 下架商品(也可用 `--stock-goods-id <id> --shop-id <id>`) |
|
|
25
|
-
| `r2-cli goods price --id <id> --price <amount> [--json]` | 修改上架价格(也可用 `--stock-goods-id <id> --shop-id <id>`) |
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## Agent 上架流程(4 步)
|
|
30
|
-
|
|
31
|
-
**每一步 Agent 获取数据后,必须展示给用户让用户做选择。不要让用户自己提供 ID。**
|
|
32
|
-
|
|
33
|
-
### 第 1 步:获取店铺 → 用户选择
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
r2-cli goods shops --json
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
返回店铺列表,每个店铺包含:
|
|
40
|
-
|
|
41
|
-
| 字段 | 说明 |
|
|
42
|
-
|------|------|
|
|
43
|
-
| `shopId` | 第三方店铺 ID(**上架参数取这个,不是 `id`**) |
|
|
44
|
-
| `shopName` | 店铺名称 |
|
|
45
|
-
| `platform` | 平台(xianyu / douyin 等) |
|
|
46
|
-
|
|
47
|
-
展示给用户选择后记录 `shopId`。
|
|
48
|
-
|
|
49
|
-
### 第 2 步:获取仓库 → 用户选择
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
r2-cli goods stocks --json
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
返回仓库列表,每个仓库包含:
|
|
24
|
+
命令执行规则见 **r2-shared** skill 的「执行规则」。安装、统一错误格式见 **r2-shared** skill。认证登录见 **r2-auth** skill。
|
|
56
25
|
|
|
57
|
-
|
|
58
|
-
|------|------|
|
|
59
|
-
| `stockId` | 仓库 ID(用于第 3 步过滤商品) |
|
|
60
|
-
| `stockName` | 仓库名称 |
|
|
26
|
+
## 上架路由决策
|
|
61
27
|
|
|
62
|
-
|
|
28
|
+
用户说"上架"时,按以下规则选择上架方式:
|
|
63
29
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
30
|
+
| 条件 | 上架方式 | 流程 |
|
|
31
|
+
|------|----------|------|
|
|
32
|
+
| 用户明确说"选品上架",或商品**在选品库**中 | `goods up`(普通上架) | 店铺 → 仓库 → 选品商品 → 输入价格 → 提交 |
|
|
33
|
+
| 用户明确说"挂售",或用户**提供了图片** | `goods hang-up`(挂售上架) | 上传图片 → AI 读图识别 → 类目/属性 → 提交 |
|
|
67
34
|
|
|
68
|
-
|
|
69
|
-
|
|
35
|
+
**判断方法**:
|
|
36
|
+
1. 用户**明确指定**了上架方式 → 直接走对应流程
|
|
37
|
+
2. 用户提供了图片文件 → 直接走 `goods hang-up`,Agent 用 Read 工具查看图片自动识别商品信息
|
|
38
|
+
3. 用户只说"上架"未指定方式 → **必须询问用户**:"选品上架还是挂售上架?"
|
|
70
39
|
|
|
71
|
-
|
|
72
|
-
r2-cli goods list --stock-id <stockId> --page 2 --size 20 --json
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
返回商品列表,每个商品包含:
|
|
76
|
-
|
|
77
|
-
| 字段 | 说明 |
|
|
78
|
-
|------|------|
|
|
79
|
-
| `stockGoodsId` | 库存商品 ID(**上架参数取这个**) |
|
|
80
|
-
| `goodsName` | 商品名称 |
|
|
81
|
-
| `brand` | 品牌 |
|
|
82
|
-
| `size` | 尺码 |
|
|
83
|
-
| `salePrice` | 建议售价 |
|
|
84
|
-
| `cate1Name` / `cate2Name` / `cate3Name` | 分类 |
|
|
85
|
-
|
|
86
|
-
### 第 4 步:提交上架
|
|
87
|
-
|
|
88
|
-
```bash
|
|
89
|
-
r2-cli goods up --stock-goods-id <stockGoodsId> --shop-id <shopId> --price <amount> --json
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
命令会自动轮询上架进度(每 2 秒查询一次,最多 10 秒),最终返回:
|
|
93
|
-
|
|
94
|
-
```json
|
|
95
|
-
{
|
|
96
|
-
"success": true,
|
|
97
|
-
"data": {
|
|
98
|
-
"submit": { "...提交结果..." },
|
|
99
|
-
"listing": {
|
|
100
|
-
"id": "上架记录ID",
|
|
101
|
-
"status": "up",
|
|
102
|
-
"goodsName": "...",
|
|
103
|
-
"price": 299,
|
|
104
|
-
"...": "..."
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
检查 `data.listing.status` 判断最终状态:
|
|
40
|
+
## 命令概览
|
|
111
41
|
|
|
112
|
-
|
|
113
|
-
|--------|------|
|
|
114
|
-
| `init` | 待上架(处理中,正常不应出现在最终结果) |
|
|
115
|
-
| `up` | 已上架成功 |
|
|
116
|
-
| `down` | 已下架 |
|
|
117
|
-
| `fail` | 上架失败,查看 `errorMsg` 了解原因 |
|
|
42
|
+
### 查询
|
|
118
43
|
|
|
119
|
-
|
|
44
|
+
| 命令 | 说明 | 详细文档 |
|
|
45
|
+
|------|------|----------|
|
|
46
|
+
| `r2-cli goods shops [--json]` | 查看已授权店铺 | [r2-goods-query](references/r2-goods-query.md) |
|
|
47
|
+
| `r2-cli goods stocks [--json]` | 查看仓库 | [r2-goods-query](references/r2-goods-query.md) |
|
|
48
|
+
| `r2-cli goods list [--stock-id <id>] [--json]` | 查看选品商品 | [r2-goods-query](references/r2-goods-query.md) |
|
|
49
|
+
| `r2-cli goods listing [--json]` | 查询上架列表 | [r2-goods-query](references/r2-goods-query.md) |
|
|
120
50
|
|
|
121
|
-
|
|
122
|
-
|------|------|------|
|
|
123
|
-
| `--stock-goods-id <id>` | 是 | 库存商品 ID(来自第 3 步的 `stockGoodsId`) |
|
|
124
|
-
| `--shop-id <id>` | 是 | 第三方店铺 ID(来自第 1 步的 `shopId`,**不是 `id`**) |
|
|
125
|
-
| `--price <amount>` | 是 | 上架价格(正数) |
|
|
126
|
-
| `-p, --platform <platform>` | 否 | 平台,默认 xianyu |
|
|
127
|
-
| `--json` | 否 | JSON 输出(Agent 推荐使用) |
|
|
51
|
+
### 上架/下架/改价/修改
|
|
128
52
|
|
|
129
|
-
|
|
53
|
+
| 命令 | 说明 | 详细文档 |
|
|
54
|
+
|------|------|----------|
|
|
55
|
+
| `r2-cli goods up --stock-goods-id <> --shop-id <> --price <> --json` | 普通上架(选品商品) | [r2-goods-listing](references/r2-goods-listing.md) |
|
|
56
|
+
| `r2-cli goods down --id <id> [--json]` | 下架商品 | [r2-goods-listing](references/r2-goods-listing.md) |
|
|
57
|
+
| `r2-cli goods price --id <id> --price <amount> [--json]` | 修改价格 | [r2-goods-listing](references/r2-goods-listing.md) |
|
|
58
|
+
| `r2-cli goods edit --id <id> [--title ...] --json` | 修改商品信息 | [r2-goods-listing](references/r2-goods-listing.md) |
|
|
130
59
|
|
|
131
|
-
|
|
60
|
+
### 选品上架 4 步流程
|
|
132
61
|
|
|
133
|
-
|
|
62
|
+
1. `r2-cli goods shops --json` → 展示店铺 → 用户选择 `shopId`
|
|
63
|
+
2. `r2-cli goods stocks --json` → 展示仓库 → 用户选择 `stockId`
|
|
64
|
+
3. `r2-cli goods list --stock-id <id> --json` → 展示商品 → 用户选择 `stockGoodsId`
|
|
65
|
+
4. `r2-cli goods up --stock-goods-id <id> --shop-id <id> --price <amount> --json` → 提交
|
|
134
66
|
|
|
135
|
-
|
|
67
|
+
必填参数:`--stock-goods-id`、`--shop-id`(取 `shopId` 不是 `id`)、`--price`
|
|
136
68
|
|
|
137
|
-
|
|
138
|
-
# 方式 1:通过上架记录 ID(来自 listing 列表的 id 字段)
|
|
139
|
-
r2-cli goods down --id <goodsListingId> --json
|
|
69
|
+
### 修改商品信息(edit)
|
|
140
70
|
|
|
141
|
-
|
|
142
|
-
r2-cli goods down --stock-goods-id <id> --shop-id <id> --json
|
|
143
|
-
```
|
|
71
|
+
修改已上架商品的标题、描述、品牌、类目、图片、属性等。
|
|
144
72
|
|
|
145
|
-
|
|
73
|
+
**路由决策**:
|
|
146
74
|
|
|
147
|
-
|
|
75
|
+
| 用户意图 | 流程 |
|
|
76
|
+
|----------|------|
|
|
77
|
+
| 提供了图片文件 | 全自动:读图识别 → 上传图片 → 匹配类目/属性/品牌 → 展示变更 → 用户确认 → 提交 |
|
|
78
|
+
| 指定了具体字段(如"改标题为X") | 直接修改指定字段,不动图片 |
|
|
79
|
+
| 说"修改/更新商品信息"但没给细节 | 提示:可以提供图片自动识别商品信息,也可以指定要修改的具体字段 |
|
|
148
80
|
|
|
149
|
-
|
|
81
|
+
**定位商品**:优先使用 `--id <goodsListingId>`(从上架列表获取 `id` 字段),也可用 `--stock-goods-id <id> --account <shopId>`。
|
|
150
82
|
|
|
151
|
-
|
|
83
|
+
**关键约束**:
|
|
84
|
+
- `--category-id` 和 `--channel-cat-id` 是**必填的**(后端复用挂售 DTO),即使不改类目也要传当前类目
|
|
85
|
+
- Agent 应自动查询类目并匹配,不需要用户手动提供
|
|
86
|
+
- AI 读图识别后填充的字段需展示给用户确认,不能静默覆盖已有信息
|
|
87
|
+
- `--image-ids` 接受已上传的图片 ID,用户给图片文件时需先调 `hang-up upload-images` 上传
|
|
152
88
|
|
|
153
|
-
|
|
154
|
-
# 方式 1:通过上架记录 ID
|
|
155
|
-
r2-cli goods price --id <goodsListingId> --price <新价格> --json
|
|
89
|
+
**带图片的全自动流程**(Agent 自动完成,用户只需提供图片并确认):
|
|
156
90
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
91
|
+
1. **展示列表**:`goods listing --json` → 用户选择要修改的商品
|
|
92
|
+
2. **上传图片**:`hang-up upload-images --shop-id <shopId> --files <paths> --json`
|
|
93
|
+
3. **AI 读图识别**:Agent 用 Read 工具查看图片,识别品牌/类目/成色/描述等
|
|
94
|
+
4. **自动匹配类目**:`hang-up categories --json` → 根据识别结果匹配 catId + channelCatId
|
|
95
|
+
5. **自动查询属性**:`hang-up props --channel-cat-id <id> --json` → 根据识别结果匹配成色/尺码/季节等
|
|
96
|
+
6. **自动搜索品牌**:`hang-up brands --channel-cat-id <> --prop-id <> --key <品牌名> --json` → 获取品牌 valueId
|
|
97
|
+
7. **汇总展示**:当前值 vs 变更值,让用户确认
|
|
98
|
+
8. **提交**:`goods edit --id <goodsListingId> --category-id <> --channel-cat-id <> --image-ids <> --item-attrs <> --brand-name <> --json`
|
|
160
99
|
|
|
161
|
-
|
|
100
|
+
**核心原则**:用户只需提供图片 + 确认。类目匹配、属性填充、品牌搜索全部由 Agent 自动完成。
|
|
162
101
|
|
|
163
|
-
|
|
102
|
+
### 挂售(hang-up)
|
|
164
103
|
|
|
165
|
-
|
|
104
|
+
| 命令 | 说明 | 详细文档 |
|
|
105
|
+
|------|------|----------|
|
|
106
|
+
| `r2-cli goods hang-up categories [--json]` | 获取闲鱼类目 | [r2-goods-hangup](references/r2-goods-hangup.md) |
|
|
107
|
+
| `r2-cli goods hang-up props --channel-cat-id <id> [--json]` | 获取属性列表 | [r2-goods-hangup](references/r2-goods-hangup.md) |
|
|
108
|
+
| `r2-cli goods hang-up brands --channel-cat-id <> --prop-id <> --key <> [--json]` | 品牌搜索 | [r2-goods-hangup](references/r2-goods-hangup.md) |
|
|
109
|
+
| `r2-cli goods hang-up upload-images --shop-id <> --files <> --json` | 上传图片 | [r2-goods-hangup](references/r2-goods-hangup.md) |
|
|
110
|
+
| `r2-cli goods hang-up submit --shop-id <> --title <> ... --json` | 提交挂售上架 | [r2-goods-hangup](references/r2-goods-hangup.md) |
|
|
166
111
|
|
|
167
|
-
|
|
168
|
-
# 查看所有上架记录
|
|
169
|
-
r2-cli goods listing --json
|
|
112
|
+
### 挂售上架流程
|
|
170
113
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
114
|
+
1. **上传图片**:`hang-up upload-images --shop-id <> --files <paths> --json`
|
|
115
|
+
2. **识别商品**:Agent 用 Read 工具查看图片,自动识别品牌/成色/类目/描述。不支持读图的 Agent 走询问路径
|
|
116
|
+
3. **匹配类目**:`hang-up categories --json` → 自动匹配
|
|
117
|
+
4. **匹配属性**:`hang-up props --channel-cat-id <id> --json` → 自动填充。品牌需调 `hang-up brands` 搜索
|
|
118
|
+
5. **汇总展示**:自动填充的字段标 ✅,缺失字段标 ❓ 让用户补充
|
|
119
|
+
6. **提交**:`hang-up submit` — 必填:`shop-id`、`title`、`price`、`category-id`、`channel-cat-id`、`image-ids`、`stuff-status`、`desc`、`out-item-no`
|
|
177
120
|
|
|
178
|
-
|
|
121
|
+
**核心原则**:**图片里能看到的,就别问用户**。只问价格和商家编码,其他全部从图片自动提取。
|
|
179
122
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
| `-s, --status <status>` | 状态过滤:`init` / `up` / `down` / `fail` |
|
|
187
|
-
| `-p, --platform <platform>` | 平台,默认 xianyu |
|
|
123
|
+
**关键注意事项**:
|
|
124
|
+
- **品牌必须双传**:`--brand-name` + itemAttrs 中的一项(含 propId/valueId/valueName),缺一不可
|
|
125
|
+
- **描述自动生成**:品牌+款式+颜色+材质+货号自动组合,不要标记为"需要补充"
|
|
126
|
+
- **季节自动推断**:夹克→春秋季,羽绒服→秋冬季,T恤→夏季等,不需要问用户
|
|
127
|
+
- **尺码/货号从标签读取**:图片中有标签时自动提取,读不到才问用户
|
|
128
|
+
- **标题自动组合**:品牌+款式+颜色+尺码+成色
|
|
188
129
|
|
|
189
|
-
|
|
130
|
+
> Agent 执行具体操作时,用 Read 工具读取对应的 reference 文件获取完整参数和流程说明。
|
|
190
131
|
|
|
191
132
|
## 错误处理
|
|
192
133
|
|
|
193
|
-
所有 `--json`
|
|
194
|
-
|
|
195
|
-
```json
|
|
196
|
-
{ "success": false, "error": "错误信息" }
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
检查 `success` 字段判断成败。常见错误:
|
|
134
|
+
所有 `--json` 命令统一错误格式:`{ "success": false, "error": "错误信息" }`
|
|
200
135
|
|
|
201
136
|
| 错误信息 | 原因 | 解决方法 |
|
|
202
137
|
|----------|------|----------|
|
|
203
138
|
| `请先运行 r2-cli auth login 登录` | 未登录或 Token 过期 | 执行 `r2-cli auth login --json` |
|
|
204
|
-
|
|
|
205
|
-
|
|
|
206
|
-
|
|
|
139
|
+
| `Agent 模式需要 --stock-goods-id, --shop-id, --price` | `goods up --json` 缺少必填参数 | 补齐三个参数 |
|
|
140
|
+
| `请指定下架条件:--id 或 --stock-goods-id + --shop-id` | 下架缺少定位参数 | 补充参数 |
|
|
141
|
+
| `--price <amount> 为必填参数` | 改价未提供价格 | 询问用户新价格 |
|
|
142
|
+
| `请提供至少一张图片` | 挂售缺少图片 | 提供本地图片路径 |
|
|
143
|
+
| `商品不存在` | edit 用了无效的 `--id` 或商品已被删除 | 确认 listing 列表中的 id 值 |
|
|
144
|
+
| `getCategoryId() is null` | edit 缺少 `--category-id` | 必须传 `--category-id` 和 `--channel-cat-id` |
|
|
145
|
+
| `商家编码重复` | out-item-no 同店铺已存在 | 更换唯一编码 |
|
|
146
|
+
| `ITEM_CONDITION_NOT_SUPPORT_SIGN` | 售后服务未开通或品类不支持 | 默认关闭售后 |
|
|
147
|
+
| `轮询超时` | 上架结果查询超时 | 稍后用 `goods listing` 查看 |
|