@round2ai/r2-cli 1.0.15 → 1.0.17
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/LICENSE +21 -0
- package/README.md +122 -35
- package/dist/pages/{xianyu-auth.html → third-auth.html} +29 -14
- package/dist/r2-cli.js +66 -38
- package/package.json +10 -6
- package/scripts/install.js +111 -0
- package/skills/r2-auth/SKILL.md +10 -8
- package/skills/r2-auth/_meta.json +1 -1
- package/skills/r2-auth/references/r2-auth-login.md +68 -0
- package/skills/r2-auth/references/r2-auth-logout.md +29 -0
- package/skills/r2-auth/references/r2-auth-status.md +27 -0
- package/skills/r2-goods/SKILL.md +94 -28
- package/skills/r2-goods/_meta.json +1 -1
- package/skills/r2-goods/references/r2-goods-alzc.md +285 -0
- package/skills/r2-goods/references/r2-goods-hangup.md +35 -86
- package/skills/r2-goods/references/r2-goods-listing.md +105 -36
- package/skills/r2-goods/references/r2-goods-query.md +39 -8
- package/skills/r2-goods/scenes/r2-scene-batch-operations.md +79 -0
- package/skills/r2-goods/scenes/r2-scene-edit-with-images.md +51 -0
- package/skills/r2-goods/scenes/r2-scene-hangup-fashion.md +32 -0
- package/skills/r2-shared/SKILL.md +84 -35
- package/skills/r2-shared/_meta.json +2 -2
- package/skills/r2-workflow-batch-up/SKILL.md +77 -0
- package/skills/r2-workflow-batch-up/_meta.json +5 -0
- package/skills/r2-workflow-goods-audit/SKILL.md +79 -0
- package/skills/r2-workflow-goods-audit/_meta.json +5 -0
- package/dist/README.md +0 -246
- package/scripts/install-skills.js +0 -20
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* R2-CLI 安装脚本
|
|
5
|
+
*
|
|
6
|
+
* 三种调用场景(通过 npm_lifecycle_event + npm_command 环境变量区分):
|
|
7
|
+
* 1. npx @round2ai/r2-cli@latest install — 全局安装 CLI(postinstall 自动装 Skills)
|
|
8
|
+
* 2. npm install -g 触发 postinstall — 安装 Skills
|
|
9
|
+
* 3. npx 下载时触发的 postinstall — 跳过(避免重复安装)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { execSync } from "node:child_process";
|
|
13
|
+
import fs from "node:fs";
|
|
14
|
+
import path from "node:path";
|
|
15
|
+
import { fileURLToPath } from "node:url";
|
|
16
|
+
|
|
17
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
18
|
+
const PKG = "@round2ai/r2-cli@latest";
|
|
19
|
+
const argv = process.argv.slice(2);
|
|
20
|
+
const isJson = argv.includes("--json");
|
|
21
|
+
|
|
22
|
+
/** 根据环境变量判断安装路由(纯函数,供测试使用) */
|
|
23
|
+
export function getInstallRoute(env = process.env) {
|
|
24
|
+
const isPostinstall = env.npm_lifecycle_event === "postinstall";
|
|
25
|
+
const isNpx = env.npm_command === "exec";
|
|
26
|
+
|
|
27
|
+
if (isPostinstall && isNpx) return "skip";
|
|
28
|
+
if (isPostinstall) return "skills-only";
|
|
29
|
+
return "full-install";
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// ——— Skills 安装 ———
|
|
33
|
+
|
|
34
|
+
function installSkills() {
|
|
35
|
+
const skillsDir = path.join(__dirname, "..", "skills");
|
|
36
|
+
if (!fs.existsSync(skillsDir)) return;
|
|
37
|
+
try {
|
|
38
|
+
execSync(`npx skills add "${skillsDir}" --all -g`, {
|
|
39
|
+
stdio: "inherit",
|
|
40
|
+
timeout: 60_000,
|
|
41
|
+
});
|
|
42
|
+
} catch {
|
|
43
|
+
// 网络不可用或 skills CLI 失败时静默跳过
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// ——— 主入口(仅直接执行时运行,import 时不触发) ———
|
|
48
|
+
|
|
49
|
+
const scriptPath = path.resolve(process.argv[1] ?? "");
|
|
50
|
+
if (scriptPath.includes(path.basename(fileURLToPath(import.meta.url)))) {
|
|
51
|
+
const route = getInstallRoute();
|
|
52
|
+
|
|
53
|
+
if (route === "skip") {
|
|
54
|
+
process.exit(0);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (route === "skills-only") {
|
|
58
|
+
installSkills();
|
|
59
|
+
process.exit(0);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// 完整安装:全局 npm install
|
|
63
|
+
// npm install -g 会触发 postinstall → installSkills()
|
|
64
|
+
function log(msg) {
|
|
65
|
+
if (!isJson) console.log(msg);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
log("\x1b[36m正在安装 R2-CLI...\x1b[0m");
|
|
70
|
+
execSync(`npm install -g ${PKG}`, { stdio: "inherit" });
|
|
71
|
+
|
|
72
|
+
let version = "unknown";
|
|
73
|
+
try {
|
|
74
|
+
version = execSync("r2-cli --version", { encoding: "utf-8" }).trim();
|
|
75
|
+
} catch {}
|
|
76
|
+
|
|
77
|
+
if (isJson) {
|
|
78
|
+
console.log(JSON.stringify({
|
|
79
|
+
success: true,
|
|
80
|
+
data: { version, npmInstalled: true, skillsInstalled: true },
|
|
81
|
+
}, null, 2));
|
|
82
|
+
} else {
|
|
83
|
+
console.log(`\n\x1b[32m✓ R2-CLI ${version} 安装完成\x1b[0m`);
|
|
84
|
+
console.log("\x1b[32m✓ Skills 已配置\x1b[0m");
|
|
85
|
+
console.log("\n\x1b[36m快速开始:\x1b[0m");
|
|
86
|
+
console.log(" r2-cli auth login # 扫码登录");
|
|
87
|
+
console.log(" r2-cli goods shops # 查看店铺");
|
|
88
|
+
console.log(" r2-cli goods xianyu up # 开始上架\n");
|
|
89
|
+
}
|
|
90
|
+
} catch {
|
|
91
|
+
if (isJson) {
|
|
92
|
+
console.log(JSON.stringify({
|
|
93
|
+
success: false,
|
|
94
|
+
error: `安装失败`,
|
|
95
|
+
errorType: "unknown",
|
|
96
|
+
suggestion: `手动安装:npm install -g ${PKG}`,
|
|
97
|
+
}));
|
|
98
|
+
} else {
|
|
99
|
+
console.error(`\n\x1b[31m✗ 安装失败\x1b[0m\n`);
|
|
100
|
+
console.error("请尝试以下方案:");
|
|
101
|
+
console.error(" 1. 手动安装:");
|
|
102
|
+
console.error(` npm install -g ${PKG}`);
|
|
103
|
+
console.error(" 2. 使用镜像:");
|
|
104
|
+
console.error(` npm install -g ${PKG} --registry=https://registry.npmmirror.com`);
|
|
105
|
+
console.error(" 3. 检查网络或代理:");
|
|
106
|
+
console.error(" export https_proxy=http://your-proxy:port");
|
|
107
|
+
console.error(` npm install -g ${PKG}\n`);
|
|
108
|
+
}
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
}
|
package/skills/r2-auth/SKILL.md
CHANGED
|
@@ -19,6 +19,8 @@ metadata:
|
|
|
19
19
|
|
|
20
20
|
## CRITICAL
|
|
21
21
|
|
|
22
|
+
**CRITICAL -- 开始前 MUST 先用 Read 工具读取 [../r2-shared/SKILL.md](../r2-shared/SKILL.md)**,其中包含执行规则、版本检查、统一错误格式、网络重试策略和 Token 过期恢复流程。
|
|
23
|
+
|
|
22
24
|
命令执行规则见 **r2-shared** skill 的「执行规则」。安装、统一错误格式见 **r2-shared** skill。
|
|
23
25
|
|
|
24
26
|
---
|
|
@@ -119,14 +121,14 @@ Agent 操作步骤与登录相同:启动命令 → 获取第 1 段 JSON → **
|
|
|
119
121
|
|
|
120
122
|
## 其他命令
|
|
121
123
|
|
|
122
|
-
| 命令 | 说明 |
|
|
123
|
-
|
|
124
|
-
| `r2-cli auth login` | 扫码登录(人类使用,自动打开浏览器) |
|
|
125
|
-
| `r2-cli auth xianyu` | 闲鱼店铺授权(人类使用,自动打开浏览器) |
|
|
126
|
-
| `r2-cli auth login poll --token <>` | 手动轮询登录状态(备选,不推荐) |
|
|
127
|
-
| `r2-cli auth xianyu poll --state <>` | 手动轮询授权状态(备选,不推荐) |
|
|
128
|
-
| `r2-cli auth status` | 查看登录状态 |
|
|
129
|
-
| `r2-cli auth logout` | 退出登录 |
|
|
124
|
+
| 命令 | 说明 | 详细文档 |
|
|
125
|
+
|------|------|----------|
|
|
126
|
+
| `r2-cli auth login` | 扫码登录(人类使用,自动打开浏览器) | [r2-auth-login](references/r2-auth-login.md) |
|
|
127
|
+
| `r2-cli auth xianyu` | 闲鱼店铺授权(人类使用,自动打开浏览器) | [r2-auth-login](references/r2-auth-login.md) |
|
|
128
|
+
| `r2-cli auth login poll --token <>` | 手动轮询登录状态(备选,不推荐) | [r2-auth-login](references/r2-auth-login.md) |
|
|
129
|
+
| `r2-cli auth xianyu poll --state <>` | 手动轮询授权状态(备选,不推荐) | [r2-auth-login](references/r2-auth-login.md) |
|
|
130
|
+
| `r2-cli auth status` | 查看登录状态 | [r2-auth-status](references/r2-auth-status.md) |
|
|
131
|
+
| `r2-cli auth logout` | 退出登录 | [r2-auth-logout](references/r2-auth-logout.md) |
|
|
130
132
|
|
|
131
133
|
---
|
|
132
134
|
|
|
@@ -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
|
package/skills/r2-goods/SKILL.md
CHANGED
|
@@ -14,28 +14,68 @@ 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` 缩小范围提高效率。
|
|
20
|
+
> **Tip**: **上架、改价、编辑提交前,必须提醒用户可选 `--transport-fee`(运费,默认 0 包邮)和 `--yhb`(验货宝)。不要静默使用默认值。**
|
|
19
21
|
|
|
20
22
|
商品管理专家,指导 AI Agent 完成商品上架、下架、改价、挂售全流程。
|
|
21
23
|
|
|
22
24
|
## CRITICAL
|
|
23
25
|
|
|
26
|
+
**CRITICAL -- 开始前 MUST 先用 Read 工具读取 [../r2-shared/SKILL.md](../r2-shared/SKILL.md)**(执行规则、版本检查、错误格式、网络重试、Token 恢复),然后读取 [../r2-auth/SKILL.md](../r2-auth/SKILL.md) 确保已登录。
|
|
27
|
+
|
|
24
28
|
命令执行规则见 **r2-shared** skill 的「执行规则」。安装、统一错误格式见 **r2-shared** skill。认证登录见 **r2-auth** skill。
|
|
25
29
|
|
|
26
|
-
|
|
30
|
+
**Agent 必须使用带平台前缀的新路径**(`goods xianyu up` / `goods taobao up`),不要使用旧路径(`goods up`)。详见 r2-shared「命令路径」。
|
|
31
|
+
|
|
32
|
+
## 平台路由决策
|
|
33
|
+
|
|
34
|
+
闲鱼和淘宝是两套独立体系,ID 互不通用。所有涉及商品操作的命令都需要先确定平台。
|
|
35
|
+
|
|
36
|
+
### 通用平台判断规则
|
|
37
|
+
|
|
38
|
+
| 条件 | 判断结果 |
|
|
39
|
+
|------|----------|
|
|
40
|
+
| 用户明确说了平台("闲鱼下架"、"淘宝改价") | 用对应平台的命令 |
|
|
41
|
+
| 用户从之前的列表中选了商品 | 从数据推断:有 `jbpSpuId` → 淘宝,有 `stockGoodsId` + `status` → 闲鱼 |
|
|
42
|
+
| 用户未指定且无上下文 | **先查所有平台列表**,让用户选商品,再根据商品所属平台执行 |
|
|
43
|
+
|
|
44
|
+
> **禁止**:凭上下文猜测平台。刚操作过淘宝不意味着"下架"就一定是淘宝。
|
|
27
45
|
|
|
28
|
-
|
|
46
|
+
### 上架路由
|
|
29
47
|
|
|
30
48
|
| 条件 | 上架方式 | 流程 |
|
|
31
49
|
|------|----------|------|
|
|
32
|
-
| 用户明确说"选品上架",或商品**在选品库**中 | `goods up
|
|
33
|
-
| 用户明确说"挂售",或用户**提供了图片** | `goods hang-up
|
|
50
|
+
| 用户明确说"选品上架",或商品**在选品库**中 | `goods xianyu up`(闲鱼普通上架) | 店铺 → 仓库 → 选品商品 → 输入价格 → 提交 |
|
|
51
|
+
| 用户明确说"挂售",或用户**提供了图片** | `goods xianyu hang-up`(闲鱼挂售上架) | 上传图片 → AI 读图识别 → 类目/属性 → 提交 |
|
|
52
|
+
| 用户明确说"阿里资产"或"alzc" | `goods taobao alzc`(淘宝阿里资产上架) | SPU 查询 → SKU 详情 → 选择 SKU + 价格 → 申请上架 |
|
|
53
|
+
|
|
54
|
+
用户只说"上架"未指定方式 → **必须询问**:"选品上架、挂售上架还是阿里资产上架?"
|
|
55
|
+
|
|
56
|
+
### 查询路由
|
|
57
|
+
|
|
58
|
+
用户说"查上架列表"/"查询上架情况"且未指定平台时:
|
|
59
|
+
|
|
60
|
+
1. `r2-cli goods shops --json` → 获取所有店铺,按 `platform` 分组
|
|
61
|
+
2. 有 `xianyu` 店铺 → `r2-cli goods xianyu listing --json`(查闲鱼上架列表)
|
|
62
|
+
3. 有 `taobao` 店铺 → `r2-cli goods taobao listing --shop-id <id> --json`(每个淘宝店铺都要查)
|
|
63
|
+
4. 分区块展示:先展示「闲鱼上架列表」,再展示「淘宝上架列表」
|
|
64
|
+
|
|
65
|
+
### 下架/改价路由
|
|
34
66
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
67
|
+
用户说"下架"或"改价"且未指定平台时:
|
|
68
|
+
|
|
69
|
+
1. **有上下文商品**(用户从之前的列表中选了商品)→ 直接根据商品所属平台执行
|
|
70
|
+
2. **无上下文** → 先按「查询路由」查所有平台列表 → 用户选择商品 → 根据平台执行对应命令
|
|
71
|
+
|
|
72
|
+
| 操作 | 闲鱼命令 | 淘宝命令 |
|
|
73
|
+
|------|----------|----------|
|
|
74
|
+
| 下架 | `goods xianyu down --id <id>` | `goods taobao down --jbp-spu-id <> --shop-id <>` |
|
|
75
|
+
| 改价 | `goods xianyu price --id <id> --price <>` | `goods taobao price --jbp-spu-id <> --jbp-sku-id <> --shop-id <> --sub-item-id <> --price <>` |
|
|
76
|
+
| 修改信息 | `goods xianyu edit --id <id> ...` | 淘宝不支持独立编辑,需通过 SPU 重新申请 |
|
|
77
|
+
|
|
78
|
+
> **禁止**:凭上下文猜测平台。刚操作过淘宝不意味着"下架"就一定是淘宝。
|
|
39
79
|
|
|
40
80
|
## 命令概览
|
|
41
81
|
|
|
@@ -46,31 +86,46 @@ metadata:
|
|
|
46
86
|
| `r2-cli goods shops [--json]` | 查看已授权店铺 | [r2-goods-query](references/r2-goods-query.md) |
|
|
47
87
|
| `r2-cli goods stocks [--json]` | 查看仓库 | [r2-goods-query](references/r2-goods-query.md) |
|
|
48
88
|
| `r2-cli goods list [--stock-id <id>] [--json]` | 查看选品商品 | [r2-goods-query](references/r2-goods-query.md) |
|
|
49
|
-
| `r2-cli goods listing [--status <up/down/sold>] [--json]` |
|
|
89
|
+
| `r2-cli goods xianyu listing [--status <up/down/sold>] [--json]` | 查询闲鱼上架列表 | [r2-goods-query](references/r2-goods-query.md) |
|
|
90
|
+
| `r2-cli goods taobao listing --shop-id <id> [--json]` | 查询淘宝上架列表 | [r2-goods-alzc](references/r2-goods-alzc.md) |
|
|
50
91
|
|
|
51
92
|
### 上架/下架/改价/修改
|
|
52
93
|
|
|
53
94
|
| 命令 | 说明 | 详细文档 |
|
|
54
95
|
|------|------|----------|
|
|
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) |
|
|
96
|
+
| `r2-cli goods xianyu up --stock-goods-id <> --shop-id <> --price <> --json` | 普通上架(选品商品) | [r2-goods-listing](references/r2-goods-listing.md) |
|
|
97
|
+
| `r2-cli goods xianyu down --id <id> [--json]` | 下架商品 | [r2-goods-listing](references/r2-goods-listing.md) |
|
|
98
|
+
| `r2-cli goods xianyu price --id <id> --price <amount> [--json]` | 修改价格 | [r2-goods-listing](references/r2-goods-listing.md) |
|
|
99
|
+
| `r2-cli goods xianyu edit --id <id> [--title ...] --json` | 修改商品信息 | [r2-goods-listing](references/r2-goods-listing.md) |
|
|
100
|
+
|
|
101
|
+
### 淘宝阿里资产管理
|
|
102
|
+
|
|
103
|
+
| 命令 | 说明 | 详细文档 |
|
|
104
|
+
|------|------|----------|
|
|
105
|
+
| `r2-cli goods taobao listing --shop-id <id> [--goods-no <no>] [--json]` | 查询已报名商品 | [r2-goods-alzc](references/r2-goods-alzc.md) |
|
|
106
|
+
| `r2-cli goods taobao alzc spu-query --shop-id <id> --goods-no <no> [--json]` | 查询可申请 SPU | [r2-goods-alzc](references/r2-goods-alzc.md) |
|
|
107
|
+
| `r2-cli goods taobao alzc spu-detail --shop-id <id> --jbp-spu-id <id> [--json]` | 查询 SPU 详情(含 SKU) | [r2-goods-alzc](references/r2-goods-alzc.md) |
|
|
108
|
+
| `r2-cli goods taobao alzc apply --shop-id <id> --jbp-spu-id <id> --apply-skus '<json>' [--json]` | 申请上架 SKU | [r2-goods-alzc](references/r2-goods-alzc.md) |
|
|
109
|
+
| `r2-cli goods taobao price --jbp-spu-id <> --jbp-sku-id <> --shop-id <> --sub-item-id <> --price <> --json` | 修改 SKU 价格 | [r2-goods-alzc](references/r2-goods-alzc.md) |
|
|
110
|
+
| `r2-cli goods taobao stock --jbp-spu-id <> --jbp-sku-id <> --shop-id <> --quantity <> [--json]` | 修改 SKU 库存 | [r2-goods-alzc](references/r2-goods-alzc.md) |
|
|
111
|
+
| `r2-cli goods taobao down --jbp-spu-id <> --shop-id <> [--jbp-sku-id <>] [--sub-item-id <>] [--json]` | 下架商品 | [r2-goods-alzc](references/r2-goods-alzc.md) |
|
|
59
112
|
|
|
60
113
|
### 选品上架 4 步流程
|
|
61
114
|
|
|
62
115
|
1. `r2-cli goods shops --json` → 展示店铺 → 用户选择 `shopId`
|
|
63
116
|
2. `r2-cli goods stocks --json` → 展示仓库 → 用户选择 `stockId`
|
|
64
117
|
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` → 提交
|
|
118
|
+
4. `r2-cli goods xianyu up --stock-goods-id <id> --shop-id <id> --price <amount> --json` → 提交
|
|
66
119
|
|
|
67
120
|
必填参数:`--stock-goods-id`、`--shop-id`(取 `shopId` 不是 `id`)、`--price`
|
|
68
121
|
|
|
122
|
+
> **提交前提醒用户**:运费默认包邮(`--transport-fee 0`),如需收运费请提供金额。可选开启验货宝(`--yhb`),但价格须在品类验货宝价格区间内。
|
|
123
|
+
|
|
69
124
|
### 修改商品信息(edit)
|
|
70
125
|
|
|
71
126
|
修改已上架商品的标题、描述、品牌、类目、图片、属性等。
|
|
72
127
|
|
|
73
|
-
> **注意**:`goods edit` 不支持修改价格。改价需单独使用 `r2-cli goods price --id <id> --price <amount>`。
|
|
128
|
+
> **注意**:`goods xianyu edit` 不支持修改价格。改价需单独使用 `r2-cli goods xianyu price --id <id> --price <amount>`。
|
|
74
129
|
|
|
75
130
|
**路由决策**:
|
|
76
131
|
|
|
@@ -83,22 +138,23 @@ metadata:
|
|
|
83
138
|
**定位商品**:优先使用 `--id <goodsListingId>`(从上架列表获取 `id` 字段),也可用 `--stock-goods-id <id> --account <shopId>`。
|
|
84
139
|
|
|
85
140
|
**关键约束**:
|
|
141
|
+
- **提交前提醒用户**:可同时修改运费(`--transport-fee`,默认 0 包邮)和验货宝(`--yhb`)
|
|
86
142
|
- `--category-id` 和 `--channel-cat-id` 是**必填的**(后端复用挂售 DTO),即使不改类目也要传当前类目
|
|
87
|
-
- **`--item-attrs` 必须包含 props 中所有属性,不只是修改的那一个**:后端替换整个属性列表,漏传的属性会被清除。调 `goods hang-up props --channel-cat-id <id> --json` 获取全部属性后,改目标值,其他保持原样一并传入
|
|
143
|
+
- **`--item-attrs` 必须包含 props 中所有属性,不只是修改的那一个**:后端替换整个属性列表,漏传的属性会被清除。调 `goods xianyu hang-up props --channel-cat-id <id> --json` 获取全部属性后,改目标值,其他保持原样一并传入
|
|
88
144
|
- Agent 应自动查询类目并匹配,不需要用户手动提供
|
|
89
145
|
- AI 读图识别后填充的字段需展示给用户确认,不能静默覆盖已有信息
|
|
90
146
|
- `--image-ids` 接受已上传的图片 ID,用户给图片文件时需先调 `hang-up upload-images` 上传
|
|
91
147
|
|
|
92
148
|
**带图片的全自动流程**(Agent 自动完成,用户只需提供图片并确认):
|
|
93
149
|
|
|
94
|
-
1. **展示列表**:`goods listing --json` → 用户选择要修改的商品
|
|
150
|
+
1. **展示列表**:`goods xianyu listing --json` → 用户选择要修改的商品
|
|
95
151
|
2. **上传图片**:`hang-up upload-images --shop-id <shopId> --files <paths> --json`
|
|
96
152
|
3. **AI 读图识别**:Agent 用 Read 工具查看图片,识别品牌/类目/成色/描述等
|
|
97
153
|
4. **自动匹配类目**:`hang-up categories --json` → 根据识别结果匹配 catId + channelCatId
|
|
98
154
|
5. **自动查询属性**:`hang-up props --channel-cat-id <id> --json` → 根据识别结果匹配成色/尺码/季节等
|
|
99
155
|
6. **自动搜索品牌**:`hang-up brands --channel-cat-id <> --prop-id <> --key <品牌名> --json` → 获取品牌 valueId
|
|
100
156
|
7. **汇总展示**:当前值 vs 变更值,让用户确认
|
|
101
|
-
8. **提交**:`goods edit --id <goodsListingId> --category-id <> --channel-cat-id <> --image-ids <> --item-attrs <> --brand-name <> --json`
|
|
157
|
+
8. **提交**:`goods xianyu edit --id <goodsListingId> --category-id <> --channel-cat-id <> --image-ids <> --item-attrs <> --brand-name <> --json`
|
|
102
158
|
|
|
103
159
|
**核心原则**:用户只需提供图片 + 确认。类目匹配、属性填充、品牌搜索全部由 Agent 自动完成。
|
|
104
160
|
|
|
@@ -106,11 +162,11 @@ metadata:
|
|
|
106
162
|
|
|
107
163
|
| 命令 | 说明 | 详细文档 |
|
|
108
164
|
|------|------|----------|
|
|
109
|
-
| `r2-cli goods hang-up categories [--json]` | 获取闲鱼类目 | [r2-goods-hangup](references/r2-goods-hangup.md) |
|
|
110
|
-
| `r2-cli goods hang-up props --channel-cat-id <id> [--json]` | 获取属性列表 | [r2-goods-hangup](references/r2-goods-hangup.md) |
|
|
111
|
-
| `r2-cli goods hang-up brands --channel-cat-id <> --prop-id <> --key <> [--json]` | 品牌搜索 | [r2-goods-hangup](references/r2-goods-hangup.md) |
|
|
112
|
-
| `r2-cli goods hang-up upload-images --shop-id <> --files <> --json` | 上传图片 | [r2-goods-hangup](references/r2-goods-hangup.md) |
|
|
113
|
-
| `r2-cli goods hang-up submit --shop-id <> --title <> ... --json` | 提交挂售上架 | [r2-goods-hangup](references/r2-goods-hangup.md) |
|
|
165
|
+
| `r2-cli goods xianyu hang-up categories [--json]` | 获取闲鱼类目 | [r2-goods-hangup](references/r2-goods-hangup.md) |
|
|
166
|
+
| `r2-cli goods xianyu hang-up props --channel-cat-id <id> [--json]` | 获取属性列表 | [r2-goods-hangup](references/r2-goods-hangup.md) |
|
|
167
|
+
| `r2-cli goods xianyu hang-up brands --channel-cat-id <> --prop-id <> --key <> [--json]` | 品牌搜索 | [r2-goods-hangup](references/r2-goods-hangup.md) |
|
|
168
|
+
| `r2-cli goods xianyu hang-up upload-images --shop-id <> --files <> --json` | 上传图片 | [r2-goods-hangup](references/r2-goods-hangup.md) |
|
|
169
|
+
| `r2-cli goods xianyu hang-up submit --shop-id <> --title <> ... --json` | 提交挂售上架 | [r2-goods-hangup](references/r2-goods-hangup.md) |
|
|
114
170
|
|
|
115
171
|
### 挂售上架流程
|
|
116
172
|
|
|
@@ -118,7 +174,7 @@ metadata:
|
|
|
118
174
|
2. **识别商品**:Agent 用 Read 工具查看图片,自动识别品牌/成色/类目/描述。不支持读图的 Agent 走询问路径
|
|
119
175
|
3. **匹配类目**:`hang-up categories --json` → 自动匹配
|
|
120
176
|
4. **匹配属性**:`hang-up props --channel-cat-id <id> --json` → 自动填充。品牌需调 `hang-up brands` 搜索
|
|
121
|
-
5. **汇总展示**:自动填充的字段标 ✅,缺失字段标 ❓ 让用户补充。**运费默认包邮(`--transport-fee` 默认 0
|
|
177
|
+
5. **汇总展示**:自动填充的字段标 ✅,缺失字段标 ❓ 让用户补充。**运费默认包邮(`--transport-fee` 默认 0),可选开启验货宝(`--yhb`),需告知用户可修改**
|
|
122
178
|
6. **提交**:`hang-up submit` — 必填:`shop-id`、`title`、`price`、`category-id`、`channel-cat-id`、`image-ids`、`stuff-status`、`desc`、`out-item-no`
|
|
123
179
|
|
|
124
180
|
**核心原则**:**图片里能看到的,就别问用户**。只问价格和商家编码(优先用户自定义,不填则推荐自动生成),其他全部从图片自动提取。
|
|
@@ -128,7 +184,7 @@ metadata:
|
|
|
128
184
|
- **描述自动生成**:品牌+款式+颜色+材质+货号自动组合,不要标记为"需要补充"
|
|
129
185
|
- **季节自动推断**:夹克→春秋季,羽绒服→秋冬季,T恤→夏季等,不需要问用户
|
|
130
186
|
- **尺码/货号从标签读取**:图片中有标签时自动提取,读不到才问用户
|
|
131
|
-
-
|
|
187
|
+
- **标题自动组合**:品牌+款式+颜色+尺码+成色,**最长 30 单位**(半角字符 0.5、全角字符 1,约 30 汉字或 60 英文)。超长时优先保留品牌和核心款式,省略成色或尺码
|
|
132
188
|
- **stuff-status 与 itemAttrs 成色映射**:
|
|
133
189
|
|
|
134
190
|
| stuff-status | itemAttrs 成色 valueName |
|
|
@@ -143,6 +199,14 @@ metadata:
|
|
|
143
199
|
|
|
144
200
|
> Agent 执行具体操作时,用 Read 工具读取对应的 reference 文件获取完整参数和流程说明。
|
|
145
201
|
|
|
202
|
+
## 场景指南
|
|
203
|
+
|
|
204
|
+
| 场景 | 说明 | 指南 |
|
|
205
|
+
|------|------|------|
|
|
206
|
+
| 服装/鞋包挂售 | 服装、鞋类、包袋的季节推断与属性指南 | [scenes/r2-scene-hangup-fashion.md](scenes/r2-scene-hangup-fashion.md) |
|
|
207
|
+
| 带图片修改商品 | 用户提供图片时自动修改商品信息的全流程 | [scenes/r2-scene-edit-with-images.md](scenes/r2-scene-edit-with-images.md) |
|
|
208
|
+
| 批量操作 | 多商品上架、跨店铺操作与分页策略 | [scenes/r2-scene-batch-operations.md](scenes/r2-scene-batch-operations.md) |
|
|
209
|
+
|
|
146
210
|
## 错误处理
|
|
147
211
|
|
|
148
212
|
所有 `--json` 命令统一错误格式:`{ "success": false, "error": "错误信息" }`
|
|
@@ -150,7 +214,7 @@ metadata:
|
|
|
150
214
|
| 错误信息 | 原因 | 解决方法 |
|
|
151
215
|
|----------|------|----------|
|
|
152
216
|
| `请先运行 r2-cli auth login 登录` | 未登录或 Token 过期 | 执行 `r2-cli auth login --json` |
|
|
153
|
-
| `Agent 模式需要 --stock-goods-id, --shop-id, --price` | `goods up --json` 缺少必填参数 | 补齐三个参数 |
|
|
217
|
+
| `Agent 模式需要 --stock-goods-id, --shop-id, --price` | `goods xianyu up --json` 缺少必填参数 | 补齐三个参数 |
|
|
154
218
|
| `请指定下架条件:--id 或 --stock-goods-id + --shop-id` | 下架缺少定位参数 | 补充参数 |
|
|
155
219
|
| `--price <amount> 为必填参数` | 改价未提供价格 | 询问用户新价格 |
|
|
156
220
|
| `请提供至少一张图片` | 挂售缺少图片 | 提供本地图片路径 |
|
|
@@ -158,5 +222,7 @@ metadata:
|
|
|
158
222
|
| `getCategoryId() is null` | edit 缺少 `--category-id` | 必须传 `--category-id` 和 `--channel-cat-id` |
|
|
159
223
|
| `商家编码重复` | out-item-no 同店铺已存在 | 更换唯一编码 |
|
|
160
224
|
| `该商品已上架` | 挂售已下架商品重新提交时 out-item-no 被占用 | 更换新的 out-item-no |
|
|
225
|
+
| `标题过长` | 标题超过 30 单位限制(半角 0.5/全角 1) | 缩短标题,保留品牌和核心款式 |
|
|
161
226
|
| `ITEM_CONDITION_NOT_SUPPORT_SIGN` | 售后服务未开通或品类不支持 | 默认关闭售后 |
|
|
162
|
-
|
|
|
227
|
+
| `YHB_PRICE_NOT_SUPPORT` | 验货宝价格不在该品类允许范围内(区间因品类而异) | 根据错误信息调整价格,或关闭验货宝 |
|
|
228
|
+
| `轮询超时` | 上架结果查询超时 | 稍后用 `goods xianyu listing` 查看 |
|