@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.
- package/LICENSE +21 -0
- package/README.md +77 -7
- package/dist/r2-cli.js +37 -41
- package/package.json +4 -1
- 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 +14 -2
- package/skills/r2-goods/_meta.json +1 -1
- package/skills/r2-goods/references/r2-goods-hangup.md +29 -81
- package/skills/r2-goods/references/r2-goods-listing.md +80 -26
- package/skills/r2-goods/references/r2-goods-query.md +31 -0
- package/skills/r2-goods/scenes/r2-scene-batch-operations.md +78 -0
- package/skills/r2-goods/scenes/r2-scene-edit-with-images.md +47 -0
- package/skills/r2-goods/scenes/r2-scene-hangup-fashion.md +32 -0
- package/skills/r2-shared/SKILL.md +78 -34
- 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/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 PURESNAKE
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ R2-CLI — 二手潮奢交易命令行工具,由 [Round2AI](https://github.com
|
|
|
7
7
|
|
|
8
8
|
覆盖商品上架、挂售、商品信息修改、认证登录等核心业务域,提供 19 个命令及 3 个 AI Agent [Skills](./skills/)。
|
|
9
9
|
|
|
10
|
-
[安装](#安装与快速开始) · [AI Agent 快速开始](#快速开始ai-agent) · [Agent Skills](#agent-skills) · [认证](#认证) · [命令](#命令参考) · [安全](
|
|
10
|
+
[安装](#安装与快速开始) · [AI Agent 快速开始](#快速开始ai-agent) · [Agent Skills](#agent-skills) · [认证](#认证) · [命令](#命令参考) · [进阶用法](#进阶用法) · [安全](#安全与风险提示使用前必读) · [反馈](#反馈与支持)
|
|
11
11
|
|
|
12
12
|
## 为什么选 R2-CLI?
|
|
13
13
|
|
|
@@ -190,6 +190,8 @@ Token 存储在 `~/.r2-cli/config.json`(原子写入防丢失),过期后
|
|
|
190
190
|
|
|
191
191
|
**挂售必填参数**:`--shop-id`、`--title`、`--price`、`--category-id`(大分类 ID)、`--channel-cat-id`(小分类 ID)、`--image-ids`(图片 ID,逗号分隔)、`--stuff-status`(成色:100 全新 / -1 准新 / 99 99新 / 95 95新 / 90 9新)、`--desc`(商品描述)、`--out-item-no`(商家编码,同店铺唯一)
|
|
192
192
|
|
|
193
|
+
**校验规则**:标题最长 30 单位(半角字符 0.5、全角字符 1,约 30 汉字或 60 英文),售价上限 99,999,999 元,超长/超限提交时自动报错。
|
|
194
|
+
|
|
193
195
|
**挂售可选参数**:`--brand-name`、`--size`、`--goods-no`、`--original-price`、`--item-attrs`(属性列表 JSON)、`--trade-type`(默认 0 仅在线)、`--transport-fee`(默认 0 包邮)、`--yhb`(验货宝)、`--division-id`(默认 330100 杭州)
|
|
194
196
|
|
|
195
197
|
**售后服务**(默认关闭):提交时自动附带售后服务配置,默认全部关闭。卖家需在闲鱼 APP 开通对应服务后才能开启(我的 → 设置 → 卖家服务 → 保障服务)。
|
|
@@ -203,14 +205,70 @@ Token 存储在 `~/.r2-cli/config.json`(原子写入防丢失),过期后
|
|
|
203
205
|
|
|
204
206
|
---
|
|
205
207
|
|
|
206
|
-
##
|
|
208
|
+
## 进阶用法
|
|
209
|
+
|
|
210
|
+
### 输出格式
|
|
211
|
+
|
|
212
|
+
所有命令支持双模输出:
|
|
213
|
+
|
|
214
|
+
- **人类模式**(默认):交互式向导 + 终端表格,适合直接操作
|
|
215
|
+
- **Agent 模式**(`--json`):结构化 JSON 输出,适合 AI Agent 解析
|
|
216
|
+
|
|
217
|
+
### 分页查询
|
|
218
|
+
|
|
219
|
+
查询类命令(`goods list`、`goods listing`)支持分页:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
# 每页 50 条(最大)
|
|
223
|
+
r2-cli goods list --stock-id <id> --page 1 --size 50 --json
|
|
224
|
+
r2-cli goods listing --status up --page 2 --size 50 --json
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### 状态过滤
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
r2-cli goods listing --status up # 已上架
|
|
231
|
+
r2-cli goods listing --status sold # 已售出
|
|
232
|
+
r2-cli goods listing --status down # 已下架
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### 跨店铺操作
|
|
236
|
+
|
|
237
|
+
同一商品可上架到多个店铺,每个操作独立执行:
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
r2-cli goods up --stock-goods-id <id> --shop-id <shopA> --price <n> --json
|
|
241
|
+
r2-cli goods up --stock-goods-id <id> --shop-id <shopB> --price <n> --json
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### 批量操作
|
|
245
|
+
|
|
246
|
+
批量上架/下架/改价时每个操作独立执行,一个失败不影响其他。批量操作间隔至少 1 秒,避免触发限流。
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 安全与风险提示(使用前必读)
|
|
251
|
+
|
|
252
|
+
本工具可供 AI Agent 调用以自动化操作二手潮奢交易。Agent 将以您的用户身份在授权范围内执行操作,可能导致商品误上架、价格错误、属性错误等风险,请谨慎操作。
|
|
253
|
+
|
|
254
|
+
### Agent 操作约束
|
|
255
|
+
|
|
256
|
+
上架过程中 Agent 必须遵守以下安全规则:
|
|
207
257
|
|
|
208
|
-
|
|
258
|
+
- **上架方式必须确认**:Agent 收到"上架"指令时,若用户未明确指定方式(选品上架/挂售上架),必须询问用户
|
|
259
|
+
- **售价必须询问**:Agent 自动识别图片并填充商品信息后,售价仍需用户确认,不能自行决定
|
|
260
|
+
- **商家编码优先自定义**:Agent 应先询问用户商家编码,用户不填时再自动生成推荐
|
|
209
261
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
-
|
|
213
|
-
|
|
262
|
+
### 凭证安全
|
|
263
|
+
|
|
264
|
+
Token 存储在 `~/.r2-cli/config.json`(原子写入防丢失),过期后需重新登录。扫码登录自动打开浏览器展示品牌化扫码页面,支持第二回合 APP、微信、支付宝扫码。
|
|
265
|
+
|
|
266
|
+
### 默认安全保护
|
|
267
|
+
|
|
268
|
+
- 所有 `--json` 命令统一错误格式,通过 `success` 字段判断成败
|
|
269
|
+
- 查询输出自动过滤敏感字段(accessToken、refreshExpireIn)
|
|
270
|
+
- 挂售提交默认关闭所有售后服务,避免未开通服务导致提交失败
|
|
271
|
+
- 网络错误自动重试(最多 2 次),认证错误不重试直接引导重新登录
|
|
214
272
|
|
|
215
273
|
---
|
|
216
274
|
|
|
@@ -234,6 +292,7 @@ PURESNAKE 深耕二手潮奢交易流通 6 年,累计鉴定超 400 万单,
|
|
|
234
292
|
| 协议 | MIT |
|
|
235
293
|
| 安装 | `npm install -g @round2ai/r2-cli` |
|
|
236
294
|
| 授权 | `r2-cli auth login` |
|
|
295
|
+
| 输出格式 | 人类友好(默认) / `--json`(Agent) |
|
|
237
296
|
| AI Agent Skills | 3 |
|
|
238
297
|
| 数据源 | 通过 ERP 对接各电商平台、线下 POS、自营仓储 WMS |
|
|
239
298
|
|
|
@@ -241,6 +300,17 @@ PURESNAKE 深耕二手潮奢交易流通 6 年,累计鉴定超 400 万单,
|
|
|
241
300
|
|
|
242
301
|
Already used by merchants in production.
|
|
243
302
|
|
|
303
|
+
## 反馈与支持
|
|
304
|
+
|
|
305
|
+
问题反馈或功能建议请通过以下渠道联系:
|
|
306
|
+
|
|
307
|
+
- 提交 GitHub Issue:https://github.com/Round2AI/r2-cli/issues
|
|
308
|
+
- 内部反馈:联系 Round2AI 团队
|
|
309
|
+
|
|
310
|
+
## 许可证
|
|
311
|
+
|
|
312
|
+
本项目基于 MIT 许可证开源。
|
|
313
|
+
|
|
244
314
|
_Round2AI — 让潮奢循环交易没有摩擦。_
|
|
245
315
|
|
|
246
316
|
_Reduce friction in circular commerce._
|
package/dist/r2-cli.js
CHANGED
|
@@ -1,50 +1,46 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
`;process.stdout.write(a)}finally{
|
|
3
|
+
var zo=Object.defineProperty;var A=(e,t)=>()=>(e&&(t=e(e=0)),t);var at=(e,t)=>{for(var o in t)zo(e,o,{get:t[o],enumerable:!0})};function z(e){return e instanceof q?e.errorType:e instanceof DOMException&&e.name==="AbortError"?"timeout":e instanceof TypeError?"network":"unknown"}var q,b,G,C,j,D=A(()=>{"use strict";q=class e extends Error{constructor(o,r,n,i="unknown"){super(o);this.code=r;this.details=n;this.errorType=i;this.name="R2Error",Error.captureStackTrace&&Error.captureStackTrace(this,e)}code;details;errorType},b=class extends q{constructor(o,r,n,i){super(o,"API_ERROR",n,i??(r===401?"auth_expired":"business"));this.status=r;this.response=n;this.name="ApiError"}status;response},G=class extends q{constructor(o,r,n){super(o,"STORAGE_ERROR",{path:r,code:n},"storage");this.path=r;this.code=n;this.name="StorageError"}path;code},C=class extends q{constructor(t){super(t,"AUTH_ERROR",void 0,"auth_expired"),this.name="AuthError"}},j=class extends q{constructor(o,r,n){super(o,"POLLING_ERROR",{attempts:r,timeout:n},"polling");this.attempts=r;this.timeout=n;this.name="PollingError"}attempts;timeout}});function E(e){let t=new URLSearchParams;for(let[o,r]of Object.entries(e))r!=null&&r!==""&&t.append(o,String(r));return t}function H(e,t){let o=null;return()=>(o||(o=e(),t?.(o)),o)}var _=A(()=>{"use strict"});import{promises as V}from"node:fs";import Mt from"node:path";import ar from"node:os";var cr,ct,It,Qt=A(()=>{"use strict";D();_();cr=".r2-cli",ct=class{configPath;config;configLoaded=!1;dirEnsured=!1;constructor(){let t=ar.homedir(),o=Mt.join(t,cr);this.configPath=Mt.join(o,"config.json"),this.config={credentials:null}}getConfigPath(){return this.configPath}async loadConfig(){if(this.configLoaded)return this.config;try{let t=await V.readFile(this.configPath,"utf-8");return this.config=JSON.parse(t),this.configLoaded=!0,this.config}catch{return this.config={credentials:null},this.configLoaded=!0,this.config}}async ensureDir(){if(this.dirEnsured)return;let t=Mt.dirname(this.configPath);try{await V.stat(t)}catch(o){if(o.code==="ENOENT")await V.mkdir(t,{recursive:!0});else throw new G("Failed to create directory",t,o.code)}this.dirEnsured=!0}async saveConfig(t){this.config=t,await this.ensureDir();let o=JSON.stringify(t,null,2),r=this.configPath+".tmp";try{await V.writeFile(r,o,"utf-8"),await V.rename(r,this.configPath),this.configLoaded=!0}catch(n){throw await V.unlink(r).catch(i=>{typeof process.env.DEBUG<"u"&&console.error("[config] cleanup tmp failed:",i)}),new G("Failed to save config",this.configPath,n.code)}}},It=H(()=>new ct)});var Ft,lt,Y,zt=A(()=>{"use strict";Qt();_();Ft=300*1e3,lt=class{store=It();isTokenExpired(t){return t.expire?Date.now()>=t.expire-Ft:!1}async saveCredentials(t,o){let r=Date.now(),n=o.expire?Number.parseInt(o.expire,10):0,i={token:t,userInfo:o,timestamp:r,...n>0&&{expire:r+n}},s=await this.store.loadConfig();s.credentials=i,await this.store.saveConfig(s)}async getCredentials(){let t=await this.store.loadConfig();return!t.credentials||this.isTokenExpired(t.credentials)?null:t.credentials}async clearCredentials(){let t=await this.store.loadConfig();t.credentials=null,await this.store.saveConfig(t)}async getToken(){return(await this.getCredentials())?.token??null}async getUserInfo(){return(await this.getCredentials())?.userInfo??null}async isLoggedIn(){return await this.getCredentials()!==null}},Y=H(()=>new lt)});var Wt={};at(Wt,{AuthStorage:()=>lt,ConfigStore:()=>ct,getAuthStorage:()=>Y,getConfigStore:()=>It});var dt=A(()=>{"use strict";Qt();zt()});var ze={};at(ze,{UserInfoCard:()=>mr});import{Box as K,Text as J}from"ink";import{jsx as M,jsxs as Z}from"react/jsx-runtime";function mr({userInfo:e,lastLogin:t,daysSinceLogin:o}){let r=e.mobile?e.mobile.replace(/(\d{3})\d{4}(\d{4})/,"$1****$2"):"-";return Z(K,{flexDirection:"column",marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,alignSelf:"flex-start",children:[M(J,{bold:!0,color:"cyan",children:"\u7528\u6237\u4FE1\u606F"}),Z(K,{flexDirection:"row",marginTop:1,children:[M(K,{width:10,children:M(J,{color:"gray",children:"\u6635\u79F0"})}),M(J,{color:"yellow",children:e.nickname})]}),Z(K,{flexDirection:"row",children:[M(K,{width:10,children:M(J,{color:"gray",children:"\u624B\u673A\u53F7"})}),M(J,{color:"yellow",children:r})]}),t&&Z(K,{flexDirection:"column",marginTop:1,children:[Z(J,{color:"gray",children:["\u6700\u540E\u767B\u5F55: ",t.toLocaleString()]}),o!==void 0&&Z(J,{color:"gray",children:[" \u8DDD\u4ECA: ",o," \u5929"]})]})]})}var We=A(()=>{"use strict"});var St={};at(St,{renderComponent:()=>Vt,renderOnce:()=>He});import ur from"react";import Ht from"chalk";import{render as pr}from"ink";import{Writable as gr}from"node:stream";function He(e){let t=Ht.level;process.env.NO_COLOR||(Ht.level=3);try{let o=[],r=new gr({write(d,w,P){o.push(Buffer.from(d)),P()}});r.isTTY=!0,r.columns=process.stdout.columns||80,r.rows=process.stdout.rows||24,pr(e,{stdout:r,patchConsole:!1}).unmount();let i=Buffer.concat(o).toString("utf8"),a=(i.split(/\x1B\[2J\x1B\[3J\x1B\[H/).at(-1)||i).replace(/\x1B\[\?[\d;]+[hl]/g,"").trimEnd()+`
|
|
4
|
+
`;process.stdout.write(a)}finally{Ht.level=t}}function Vt(e,t){He(ur.createElement(e,t))}var ut=A(()=>{"use strict"});import{Box as we,Text as xe}from"ink";import{jsx as po,jsxs as Ot}from"react/jsx-runtime";function tt(e,t){return e.length>t?e.slice(0,t-1)+"\u2026":e}function et(e){let t=process.stdout.columns||80,r=Math.max(t-4-e,20),n=e+r;return{fillWidth:r,totalWidth:n}}function ot({title:e,count:t,countLabel:o="\u6761",fillWidth:r,totalWidth:n,header:i,children:s}){return Ot(we,{flexDirection:"column",marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,children:[Ot(we,{flexDirection:"row",children:[po(xe,{bold:!0,color:"cyan",children:e}),Ot(xe,{color:"gray",children:[" \xB7 ",t," ",o]})]}),Ot(we,{flexDirection:"column",marginTop:1,children:[i,po(xe,{color:"gray",children:"\u2500".repeat(n)}),s]})]})}var Ut=A(()=>{"use strict"});var fo={};at(fo,{ShopsTable:()=>Xr});import{Box as N,Text as B}from"ink";import{jsx as f,jsxs as ho}from"react/jsx-runtime";function qr(e){return e.map(t=>"shopName"in t?{id:t.shopId,name:t.shopName,platform:t.platform,expiresIn:t.expiresIn}:{id:t.id,name:t.name,platform:t.thirdUserId,expiresIn:t.expiresIn})}function Gr({hasPlatform:e,fillWidth:t}){return ho(N,{flexDirection:"row",paddingBottom:0,children:[e&&f(N,{width:Ie,children:f(B,{bold:!0,color:"white",children:"\u5E73\u53F0"})}),f(N,{width:t,children:f(B,{bold:!0,color:"white",children:"\u5E97\u94FA\u540D"})}),f(N,{width:Se,children:f(B,{bold:!0,color:"white",children:"ID"})}),f(N,{width:Ce,children:f(B,{bold:!0,color:"white",children:"\u72B6\u6001"})})]})}function _r({shop:e,hasPlatform:t,fillWidth:o}){let r=go[e.platform]??e.platform;return ho(N,{flexDirection:"row",children:[t&&f(N,{width:Ie,children:f(B,{color:"cyan",children:r})}),f(N,{width:o,children:f(B,{bold:!0,children:e.name})}),f(N,{width:Se,children:f(B,{color:"gray",children:e.id})}),f(N,{width:Ce,children:f(B,{color:"green",children:"\u25CF \u6388\u6743\u4E2D"})})]})}function Xr({shops:e,platform:t}){let o=qr(e),r=t==="all",n=t==="all"?"\u6240\u6709\u6388\u6743\u5E97\u94FA":`${go[t]??t}\u6388\u6743\u5E97\u94FA`,i=Se+Ce+(r?Ie:0),{fillWidth:s,totalWidth:a}=et(i);return f(ot,{title:n,count:o.length,countLabel:"\u5BB6",fillWidth:s,totalWidth:a,header:f(Gr,{hasPlatform:r,fillWidth:s}),children:o.map(d=>f(_r,{shop:d,hasPlatform:r,fillWidth:s},d.id))})}var go,Ie,Se,Ce,yo=A(()=>{"use strict";Ut();go={xianyu:"\u95F2\u9C7C",douyin:"\u6296\u97F3"},Ie=8,Se=16,Ce=10});var Io={};at(Io,{StocksTable:()=>Fr});import{Box as T,Text as O}from"ink";import{jsx as u,jsxs as So}from"react/jsx-runtime";function Mr({fillWidth:e}){return So(T,{flexDirection:"row",paddingBottom:0,children:[u(T,{width:Te,children:u(O,{bold:!0,color:"white",children:"ID"})}),u(T,{width:be,children:u(O,{bold:!0,color:"white",children:"\u7528\u6237ID"})}),u(T,{width:Pe,children:u(O,{bold:!0,color:"white",children:"\u4ED3\u5E93ID"})}),u(T,{width:e,children:u(O,{bold:!0,color:"white",children:"\u4ED3\u5E93\u540D\u79F0"})}),u(T,{width:Ae,children:u(O,{bold:!0,color:"white",children:"\u521B\u5EFA\u65F6\u95F4"})})]})}function Qr({stock:e,fillWidth:t}){let o=new Date(e.gmtCreate).toLocaleString("zh-CN");return So(T,{flexDirection:"row",children:[u(T,{width:Te,children:u(O,{color:"gray",children:e.id})}),u(T,{width:be,children:u(O,{color:"gray",children:e.userId})}),u(T,{width:Pe,children:u(O,{color:"gray",children:e.stockId})}),u(T,{width:t,children:u(O,{bold:!0,children:e.stockName})}),u(T,{width:Ae,children:u(O,{color:"gray",children:o})})]})}function Fr({stocks:e}){let t=Te+be+Pe+Ae,{fillWidth:o,totalWidth:r}=et(t);return u(ot,{title:"\u4ED3\u5E93\u5217\u8868",count:e.length,countLabel:"\u4E2A",fillWidth:o,totalWidth:r,header:u(Mr,{fillWidth:o}),children:e.map(n=>u(Qr,{stock:n,fillWidth:o},n.id))})}var Te,be,Pe,Ae,Co=A(()=>{"use strict";Ut();Te=6,be=10,Pe=10,Ae=22});import{Command as On}from"commander";import it from"chalk";import"commander";import{Command as io}from"commander";import I from"chalk";D();async function Wo(e,t,o){let r=new AbortController,n=()=>r.abort();o?.addEventListener("abort",n,{once:!0});let i=setTimeout(()=>r.abort(),t);try{return await e()}catch(s){throw r.signal.aborted&&!o?.aborted?new j("\u5355\u6B21\u8F6E\u8BE2\u8BF7\u6C42\u8D85\u65F6"):s}finally{clearTimeout(i),o?.removeEventListener("abort",n)}}async function W(e,t,o){let{interval:r,timeout:n,condition:i}=t,s=Date.now(),a=0;for(;Date.now()-s<n;){if(o?.aborted)throw new j("\u8F6E\u8BE2\u88AB\u4E2D\u6B62");a++;let d=n-(Date.now()-s),w=await Wo(e,d,o);if(i(w,a))return w;await Ho(r,o)}throw new j(`\u8F6E\u8BE2\u8D85\u65F6 (\u5DF2\u7B49\u5F85 ${Date.now()-s}ms, \u5171 ${a} \u6B21)`)}function Ho(e,t){return new Promise((o,r)=>{if(t?.aborted){r(new j("\u8F6E\u8BE2\u88AB\u4E2D\u6B62"));return}let n=()=>{clearTimeout(i),r(new j("\u8F6E\u8BE2\u88AB\u4E2D\u6B62"))},i=setTimeout(()=>{t?.removeEventListener("abort",n),o()},e);t?.addEventListener("abort",n,{once:!0})})}import Ko from"node:fs";import{fileURLToPath as Zo}from"node:url";import{createRequire as tr}from"node:module";import Xe from"node:path";import{exec as er}from"node:child_process";_();import Vo from"node:http";var Gt=class e{server=null;pages=new Map;port=0;idleTimer=null;static IDLE_TIMEOUT_MS=1e4;async start(){return this.server?this.port:new Promise((t,o)=>{this.server=Vo.createServer((r,n)=>this.handleRequest(r,n)),this.server.listen(0,"127.0.0.1",()=>{let r=this.server.address();typeof r=="object"&&r?(this.port=r.port,t(this.port)):o(new Error("Failed to get server address"))}),this.server.on("error",o)})}registerPage(t,o,r,n){let i=this.pages.get(t);if(i){i.qrBuffer=r,i.status="waiting",i.config=n;let s=`data: ${JSON.stringify({status:"waiting"})}
|
|
5
5
|
|
|
6
|
-
`;for(let a of
|
|
6
|
+
`;for(let a of i.sseClients)a.write(s)}else this.pages.set(t,{html:o,qrBuffer:r,status:"waiting",sseClients:[],config:n});this.resetIdleTimer()}unregisterPage(t){let o=this.pages.get(t);if(o){for(let r of o.sseClients)r.end();o.sseClients.length=0,this.pages.delete(t),this.pages.size===0&&this.close()}}setStatus(t,o){let r=this.pages.get(t);if(!r)return;r.status=o;let n=`data: ${JSON.stringify({status:o})}
|
|
7
7
|
|
|
8
|
-
`;for(let
|
|
8
|
+
`;for(let i of r.sseClients)i.write(n)}close(){if(this.server){this.idleTimer&&(clearTimeout(this.idleTimer),this.idleTimer=null);for(let t of this.pages.values()){for(let o of t.sseClients)o.end();t.sseClients.length=0}this.pages.clear(),this.server.close(),this.server=null,this.port=0}}resetIdleTimer(){this.idleTimer&&clearTimeout(this.idleTimer),this.idleTimer=setTimeout(()=>{[...this.pages.values()].some(o=>o.sseClients.length>0)||this.close()},e.IDLE_TIMEOUT_MS)}handleRequest(t,o){let r=t.url??"/";for(let[n,i]of this.pages){if(r===n){o.writeHead(302,{Location:n+"/"}),o.end();return}if(r===n+"/"){o.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),o.end(i.html);return}if(r===n+"/qr.png"){o.writeHead(200,{"Content-Type":"image/png","Content-Length":i.qrBuffer.length}),o.end(i.qrBuffer);return}if(r===n+"/events"){o.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),o.write(`data: ${JSON.stringify({status:i.status})}
|
|
9
9
|
|
|
10
|
-
`),
|
|
11
|
-
\u{1F50D} \u5DF2\u626B\u7801: ${
|
|
12
|
-
\u2705 \u7528\u6237\u5DF2\u786E\u8BA4\u767B\u5F55`)),
|
|
13
|
-
\u23F0 \u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F`)),
|
|
14
|
-
\u{1F6AB} \u7528\u6237\u5DF2\u53D6\u6D88\u767B\u5F55`)),
|
|
15
|
-
\u{1F510} \u6B63\u5728\u542F\u52A8\u626B\u7801\u767B\u5F55...`));let{qrData:
|
|
16
|
-
`)),console.log(
|
|
17
|
-
`)),
|
|
18
|
-
`));let
|
|
10
|
+
`),i.sseClients.push(o),t.on("close",()=>{let s=i.sseClients.indexOf(o);s>=0&&i.sseClients.splice(s,1)});return}if(r===n+"/config"){o.writeHead(200,{"Content-Type":"application/json"}),o.end(JSON.stringify(i.config??{}));return}}o.writeHead(404,{"Content-Type":"text/plain"}),o.end("Not Found")}},Ge=!1;function xt(e){e.close()}function Yo(e){Ge||(Ge=!0,process.on("exit",()=>xt(e)),process.on("SIGINT",()=>xt(e)),process.on("SIGTERM",()=>xt(e)),setInterval(()=>{process.stdin?.destroyed&&xt(e)},3e3).unref())}var _e=H(()=>new Gt,Yo);var or=Xe.dirname(Zo(import.meta.url)),rr="/login",nr="/login-xianyu",_t=null;async function ir(e){return Ko.promises.readFile(Xe.join(or,"pages",e),"utf-8")}async function sr(e){return _t||(_t=tr(import.meta.url)),_t("qrcode").toBuffer(e,{width:300,margin:2})}function X(e){let t=process.platform==="win32"?`start "" "${e}"`:process.platform==="darwin"?`open "${e}"`:`xdg-open "${e}"`;er(t)}async function Je(e,t,o,r){let[n,i]=await Promise.all([ir(t),sr(o)]),s=_e(),a=await s.start();s.registerPage(e,n,i,r);let d=`http://127.0.0.1:${a}${e}/`;return{url:o,qrUrl:d,setStatus:w=>s.setStatus(e,w),closeServer:()=>s.unregisterPage(e)}}function Xt(e){return Je(rr,"login.html",e)}function Jt(e,t){return Je(nr,"xianyu-auth.html",e,{authUrl:t})}dt();zt();D();var lr="https://api.puresnake.com",mt=class e{config;authStorage=null;cachedToken=null;tokenExpiry=0;constructor(t={}){this.config={baseUrl:t.baseUrl??lr,version:t.version??"v3",debug:t.debug??!1},this.authStorage=Y()}static createNoAuth(){let t=new e;return t.authStorage=null,t}buildUrl(t){let o=t.startsWith("/")?t.slice(1):t;return`${this.config.baseUrl}/${this.config.version}/${o}`}async getAuthToken(){if(!this.authStorage)return;if(this.cachedToken&&Date.now()<this.tokenExpiry)return this.cachedToken;let t=await this.authStorage.getCredentials();if(!t)throw new C("\u8BF7\u5148\u8FD0\u884C r2-cli auth login \u767B\u5F55");return this.cachedToken=t.token,this.tokenExpiry=t.expire?t.expire-Ft:Date.now()+1800*1e3,t.token}async requestRaw(t,o,r={}){let n=this.buildUrl(t),i=r.timeout??3e4,s=await this.getAuthToken(),a={...o.headers,...s?{token:s}:{}},d=new AbortController,w=setTimeout(()=>d.abort(),i),P={...o,headers:a,signal:d.signal};this.config.debug&&console.error(`[API ${o.method??"GET"}]`,n,o.body);try{let c=await fetch(n,P);if(!c.ok){if(c.status===401)throw this.authStorage&&(this.cachedToken=null,await this.authStorage.clearCredentials().catch(()=>{})),new C("\u767B\u5F55\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u8FD0\u884C r2-cli auth login \u91CD\u65B0\u767B\u5F55");if(c.status===413)throw new b("\u56FE\u7247\u592A\u5927\uFF0C\u4E0A\u4F20\u5931\u8D25\uFF08\u670D\u52A1\u7AEF\u9650\u5236\u7EA6 2MB\uFF09",413);let wt=await c.text();throw new b(wt||`${c.status} ${c.statusText}`,c.status)}let x=await c.json();if(this.config.debug&&console.error("[API Response]",x),!x.success||x.status!==0)throw new b(x.msg||"\u672A\u77E5\u9519\u8BEF",x.status,x);return x}catch(c){throw c instanceof DOMException&&c.name==="AbortError"?new b(`\u8BF7\u6C42\u8D85\u65F6 (${i}ms)`,408,void 0,"timeout"):c instanceof TypeError?new b(`\u7F51\u7EDC\u9519\u8BEF: ${c.message}`,0,void 0,"network"):c}finally{clearTimeout(w)}}async requestFull(t,o){let{method:r,headers:n,body:i,timeout:s=3e4}=o,a={method:r,headers:{"Content-Type":"application/json",...n},...i!==void 0&&{body:JSON.stringify(i)}};return this.requestRaw(t,a,{timeout:s})}async request(t,o){return(await this.requestFull(t,o)).data}async get(t,o,r){let n=o&&o.size>0?`${t}?${o.toString()}`:t;return this.request(n,{method:"GET",headers:r})}async post(t,o,r){return this.request(t,{method:"POST",body:o,headers:r})}async put(t,o,r){return this.request(t,{method:"PUT",body:o,headers:r})}async delete(t,o){return this.request(t,{method:"DELETE",headers:o})}async upload(t,o,r){let n={method:"POST",body:o,headers:r};return(await this.requestRaw(t,n,{timeout:6e4})).data}},v=new mt;var Me=mt.createNoAuth();async function Qe(){return Me.post("app/qrcode/generate")}async function Fe(e){let t=new URLSearchParams;t.append("qrToken",e);let o=`app/qrcode/status?${t.toString()}`,r=await Me.requestFull(o,{method:"GET"});return r.token&&typeof r.data=="object"&&r.data!==null&&(r.data.token=r.token),r.data}dt();D();async function Ve(e,t,o){let{UserInfoCard:r}=await Promise.resolve().then(()=>(We(),ze)),{renderComponent:n}=await Promise.resolve().then(()=>(ut(),St)),i=t!=null?{userInfo:e,lastLogin:t,daysSinceLogin:o??0}:{userInfo:e};n(r,i)}var Ct=class{storage;constructor(t){this.storage=t??Y()}async generateQR(){let t=await Qe(),o=`https://m.puresnake.com/r2/auth/login?qrToken=${t.qrContent}&from=wechat`,r=await Xt(o);return{qrData:t,...r}}async waitForLogin(t,o,r,n,i,s){let a=await W(()=>Fe(t),{interval:r,timeout:o,condition:d=>{switch(d.status){case"scanned":return s||(console.log(I.cyan(`
|
|
11
|
+
\u{1F50D} \u5DF2\u626B\u7801: ${d.userInfo?.nickname||"\u672A\u77E5\u7528\u6237"}`)),console.log(I.yellow("\u8BF7\u5728 APP \u4E0A\u786E\u8BA4\u767B\u5F55"))),i?.("scanning"),!1;case"confirmed":return s||console.log(I.green(`
|
|
12
|
+
\u2705 \u7528\u6237\u5DF2\u786E\u8BA4\u767B\u5F55`)),i?.("success"),!0;case"expired":return s||console.log(I.red(`
|
|
13
|
+
\u23F0 \u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F`)),i?.("expired"),!0;case"canceled":return s||console.log(I.red(`
|
|
14
|
+
\u{1F6AB} \u7528\u6237\u5DF2\u53D6\u6D88\u767B\u5F55`)),i?.("expired"),!0;default:return!1}}},n??void 0);if(a.status==="confirmed"&&a.token&&a.userInfo)return await this.storage.saveCredentials(a.token,a.userInfo),{userInfo:a.userInfo,token:a.token};throw a.status==="expired"?new C("\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55"):a.status==="canceled"?new C("\u7528\u6237\u5DF2\u53D6\u6D88\u767B\u5F55"):new C("\u767B\u5F55\u5931\u8D25: \u672A\u83B7\u53D6\u5230\u51ED\u8BC1")}async login(t){console.log(I.cyan(`
|
|
15
|
+
\u{1F510} \u6B63\u5728\u542F\u52A8\u626B\u7801\u767B\u5F55...`));let{qrData:o,qrUrl:r,setStatus:n,closeServer:i}=await this.generateQR();console.log(I.green(`\u2705 \u4E8C\u7EF4\u7801\u5DF2\u751F\u6210
|
|
16
|
+
`)),console.log(I.cyan(` \u94FE\u63A5: ${r}
|
|
17
|
+
`)),X(r),console.log(I.yellow(`\u23F3 \u7B49\u5F85\u626B\u7801...
|
|
18
|
+
`));let s=Number.parseInt(o.expireTime,10),a=Number.parseInt(o.pollInterval,10);try{let d=await this.waitForLogin(o.qrToken,s,a,t,n);return console.log(I.green(`
|
|
19
19
|
\u2705 \u767B\u5F55\u6210\u529F\uFF01
|
|
20
|
-
`)),
|
|
20
|
+
`)),Ve(d.userInfo),d}catch(d){throw console.log(I.red(`
|
|
21
21
|
\u274C \u767B\u5F55\u5931\u8D25
|
|
22
|
-
`)),
|
|
23
|
-
\u{1F6AA} \u6B63\u5728\u9000\u51FA\u767B\u5F55...`)),await this.storage.clearCredentials(),console.log(
|
|
24
|
-
`))}async status(){if(!await this.storage.isLoggedIn()){console.log(
|
|
25
|
-
`));return}let
|
|
26
|
-
`)),await
|
|
27
|
-
\u2705 \u6388\u6743\u6210\u529F\uFF01\u5E97\u94FA: ${
|
|
28
|
-
\u23F0 \u6388\u6743\u94FE\u63A5\u5DF2\u8FC7\u671F`)),n?.("expired"),!0):!1},r)}async function
|
|
29
|
-
\u{1F517} \u6B63\u5728\u83B7\u53D6\u95F2\u9C7C\u6388\u6743\u5730\u5740...`));let{authData:t,qrUrl:
|
|
30
|
-
`)),console.log(Q.cyan(` \u94FE\u63A5: ${
|
|
22
|
+
`)),d}finally{i()}}async logout(){console.log(I.cyan(`
|
|
23
|
+
\u{1F6AA} \u6B63\u5728\u9000\u51FA\u767B\u5F55...`)),await this.storage.clearCredentials(),console.log(I.green(`\u2705 \u5DF2\u9000\u51FA\u767B\u5F55
|
|
24
|
+
`))}async status(){if(!await this.storage.isLoggedIn()){console.log(I.yellow(`\u26A0\uFE0F \u5C1A\u672A\u767B\u5F55\u6216\u51ED\u8BC1\u5DF2\u8FC7\u671F
|
|
25
|
+
`));return}let o=await this.storage.getCredentials(),r=o.userInfo,n=new Date(o.timestamp),i=Math.floor((Date.now()-o.timestamp)/(1e3*60*60*24));console.log(I.green(`\u2705 \u5DF2\u767B\u5F55
|
|
26
|
+
`)),await Ve(r,n,i)}},Yt=null;function k(){return Yt||(Yt=new Ct),Yt}import Q from"chalk";var Ye=v;async function Ke(){return Ye.get("mms/xianyu/auth/url")}async function Ze(e){let t=new URLSearchParams({state:e});return Ye.get("mms/xianyu/auth/status",t)}D();async function Tt(){let e=await Ke(),t=await Jt(e.url,e.url);return{authData:e,...t}}async function pt(e,t,o,r,n){return W(()=>Ze(e),{interval:o,timeout:t,condition:i=>i.status==="success"?(console.log(Q.green(`
|
|
27
|
+
\u2705 \u6388\u6743\u6210\u529F\uFF01\u5E97\u94FA: ${i.shopName} (${i.shopId})`)),n?.("success"),!0):i.status==="expired"?(console.log(Q.red(`
|
|
28
|
+
\u23F0 \u6388\u6743\u94FE\u63A5\u5DF2\u8FC7\u671F`)),n?.("expired"),!0):!1},r)}async function Kt(e){console.log(Q.cyan(`
|
|
29
|
+
\u{1F517} \u6B63\u5728\u83B7\u53D6\u95F2\u9C7C\u6388\u6743\u5730\u5740...`));let{authData:t,qrUrl:o,setStatus:r,closeServer:n}=await Tt();console.log(Q.green(`\u2705 \u6388\u6743\u4E8C\u7EF4\u7801\u5DF2\u751F\u6210
|
|
30
|
+
`)),console.log(Q.cyan(` \u94FE\u63A5: ${o}`)),console.log(Q.gray(` \u6216\u590D\u5236\u94FE\u63A5\u6253\u5F00: ${t.url}`)),X(o),console.log(Q.yellow(`
|
|
31
31
|
\u23F3 \u7B49\u5F85\u6388\u6743...
|
|
32
|
-
`));let
|
|
33
|
-
\
|
|
34
|
-
`));else if(o instanceof b)console.error(N.red(`\u25B2 \u64CD\u4F5C\u5931\u8D25: ${o.message}`)),o.status&&console.error(N.gray(` \u72B6\u6001\u7801: ${o.status}`));else if(o instanceof B)console.error(N.red(`\u25B2 \u914D\u7F6E\u6587\u4EF6\u5F02\u5E38: ${o.message}`)),o.path&&console.error(N.gray(` \u8DEF\u5F84: ${o.path}`)),console.error(N.gray(`\u2192 \u8BF7\u5C1D\u8BD5\u91CD\u65B0\u767B\u5F55: r2-cli auth login
|
|
35
|
-
`));else{let t=o instanceof Error?o.message:String(o);console.error(N.red(`\u25B2 ${t}`))}process.exit(1)}function Jt(o){console.log(JSON.stringify({success:!1,error:o})),process.exit(1)}function m(o){return async t=>{try{await o(t)}catch(e){if(t.json){let r=e instanceof Error?e.message:String(e),n=e instanceof b?e.status:void 0;console.log(JSON.stringify({success:!1,error:r,...n!=null&&{status:n}})),process.exit(1)}X(e)}}}function P(o,t){o.json&&(console.log(JSON.stringify({success:!1,error:t})),process.exit(1)),console.log(N.yellow(t))}function j(o,t,e){o.json?console.log(JSON.stringify({success:!0,data:t},null,2)):(e&&console.log(N.green(e)),console.log(JSON.stringify(t,null,2)))}function wt(o){return async(...t)=>{try{await o(...t)}catch(e){let r=e instanceof Error?e.message:String(e);Jt(r)}}}var je=new Set(["accessToken","refreshExpireIn"]);function Co(o){return o.map(t=>{let e={};for(let[r,n]of Object.entries(t))je.has(r)||(e[r]=n);return e})}async function xt(o){let{qrInfo:t,qrUrl:e,setStatus:r,closeServer:n,waitArgs:s}=await o.generate();console.log(JSON.stringify(t,null,2)),q(e);try{let i=await o.waitResult(s,r);console.log(JSON.stringify(o.formatSuccess(i)))}catch(i){let a=i instanceof Error?i.message:String(i);console.log(JSON.stringify({success:!1,error:a})),process.exit(1)}finally{setTimeout(n,1e3)}}function Qt(){let o=new To("login");o.description("\u626B\u7801\u767B\u5F55 Round2AI \u8D26\u6237").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09");let t=new To("poll").description("\u8F6E\u8BE2\u767B\u5F55\u72B6\u6001\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").requiredOption("--token <qrToken>","\u4E8C\u7EF4\u7801 token").option("--expire <ms>","\u8FC7\u671F\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09","300000").option("--interval <ms>","\u8F6E\u8BE2\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09","1000").action(wt(async e=>{let n=await L().waitForLogin(e.token,Number.parseInt(e.expire,10),Number.parseInt(e.interval,10));console.log(JSON.stringify({success:!0,...n}))}));return o.addCommand(t),o.action(m(async e=>{e.json?await xt({generate:async()=>{let r=L(),{qrData:n,qrUrl:s,setStatus:i,closeServer:a}=await r.generateQR(),c=Number.parseInt(n.expireTime,10),h=Number.parseInt(n.pollInterval,10);return{qrInfo:{qrToken:n.qrToken,expireTimeMs:c,pollIntervalMs:h,qrUrl:s},qrUrl:s,setStatus:i,closeServer:a,waitArgs:{qrToken:n.qrToken,expireMs:c,intervalMs:h}}},waitResult:({qrToken:r,expireMs:n,intervalMs:s},i)=>L().waitForLogin(r,n,s,void 0,i,!0),formatSuccess:r=>({success:!0,userInfo:r.userInfo})}):await L().login()})),o}import{Command as $e}from"commander";function Xt(){let o=new $e("logout");return o.description("\u9000\u51FA\u767B\u5F55"),o.action(async()=>{try{await L().logout()}catch(t){X(t)}}),o}import{Command as Be}from"commander";function _t(){let o=new Be("status");return o.description("\u67E5\u770B\u767B\u5F55\u72B6\u6001"),o.action(async()=>{try{await L().status()}catch(t){X(t)}}),o}import{Command as bo}from"commander";function Mt(){let o=new bo("xianyu");o.description("\u95F2\u9C7C\u5E97\u94FA\u6388\u6743").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09");let t=new bo("poll").description("\u8F6E\u8BE2\u95F2\u9C7C\u6388\u6743\u72B6\u6001\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").requiredOption("--state <state>","\u6388\u6743\u8F6E\u8BE2 token").option("--expire <ms>","\u8FC7\u671F\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09","300000").option("--interval <ms>","\u8F6E\u8BE2\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09","1000").action(wt(async e=>{let r=await it(e.state,Number.parseInt(e.expire,10),Number.parseInt(e.interval,10));r.status==="success"?console.log(JSON.stringify({success:!0,shopId:r.shopId,shopName:r.shopName})):Jt(`\u6388\u6743\u72B6\u6001: ${r.status}`)}));return o.addCommand(t),o.action(m(async e=>{e.json?await xt({generate:async()=>{let{authData:r,qrUrl:n,setStatus:s,closeServer:i}=await yt(),a=r.expireTime?Number.parseInt(r.expireTime,10):3e5,c=r.pollInterval?Number.parseInt(r.pollInterval,10):1e3;return{qrInfo:{state:r.state,expireTimeMs:a,pollIntervalMs:c,qrUrl:n},qrUrl:n,setStatus:s,closeServer:i,waitArgs:{state:r.state,expireMs:a,intervalMs:c}}},waitResult:async({state:r,expireMs:n,intervalMs:s},i)=>{let a=await it(r,n,s,void 0,i);if(a.status!=="success")throw new Error(`\u6388\u6743\u72B6\u6001: ${a.status}`);return a},formatSuccess:r=>({success:!0,shopId:r.shopId,shopName:r.shopName})}):await Gt()})),o}import{Command as xr}from"commander";import{Command as Xe}from"commander";import D from"chalk";import{select as Ft,input as _e,confirm as Me}from"@inquirer/prompts";import{basename as Qe}from"node:path";function _(o){let t=new URLSearchParams;for(let[e,r]of Object.entries(o))r!=null&&r!==""&&t.append(e,String(r));return t}import{statSync as qe,readFileSync as Po}from"node:fs";import Ge from"sharp";var Je=2*1024*1024;async function Ao(o,t=Je){let{size:e}=qe(o);if(e<=t)return Po(o);let r=Ge(o);await r.metadata();let n=[100,90,80,70,60,50,40,30],s=null;for(let i of n){let a=await r.jpeg({quality:i,mozjpeg:!0}).toBuffer();if(a.length<=t)return a;s=a}return s??Po(o)}var T=pt;async function zt(o){return T.post("mms/goods/listing/up/xianyu",o)}async function vo(o){return T.get("mms/goods/listing/get",_({...o}))}async function ko(o){return T.post("mms/goods/listing/down/xianyu",o)}async function Ro(o){return T.post("mms/goods/listing/update/xyPrice",o)}async function Lo(o){return T.post("mms/goods/listing/update/goodsInfo",o)}async function No(o){return T.get("mms/goods/listing/list",o?_({...o}):void 0)}async function It(){return await T.get("mms/user/shop/list")??[]}async function St(){return await T.get("mms/user/stock/list")??[]}async function Ct(o){let t=o?_({...o}):void 0;return T.get("mms/seller/goods/select/list",t)}async function Do(o,t){let e=async(i,a=1)=>{for(let c=0;c<=a;c++)try{let h=await Ao(i),u=Qe(i),w=new FormData;return w.append("file",new Blob([new Uint8Array(h)]),u),await T.upload(`platform/xy/media/upload?shopId=${encodeURIComponent(o)}`,w)}catch(h){if(c<a){await new Promise(u=>setTimeout(u,1e3));continue}throw h}throw new Error("unreachable")},r=await Promise.allSettled(t.map(e)),n=[],s=[];for(let i=0;i<r.length;i++){let a=r[i];if(a.status==="fulfilled")n.push(a.value);else{let c=a.reason;s.push({file:t[i],error:c instanceof Error?c.message:`${c}`})}}return{images:n,failed:s}}async function Oo(o){return T.post("mms/goods/listing/hang/up/xianyu",o)}async function Uo(o=16){return await T.get("platform/xy/cat",_({spBizType:o}))??[]}async function Eo(o){return await T.get("platform/xy/props",_({channelCatId:o}))??[]}async function jo(o,t,e){return await T.get("platform/xy/props/value",_({channelCatId:o,propId:t,key:e}))??[]}var ze=2e3,Fe=1e4;function We(o){let t=o.status?.toLowerCase()??"";return t===""||t==="init"||t==="pending"||t==="processing"}async function $o(o,t,e,r){r||process.stdout.write(D.cyan("\u23F3 \u6B63\u5728\u67E5\u8BE2\u4E0A\u67B6\u8FDB\u5EA6..."));let n=await W(()=>vo({stockGoodsId:o,shopId:t,platform:e}),{interval:ze,timeout:Fe,condition:s=>!We(s)});return r||process.stdout.write("\r"+" ".repeat(30)+"\r"),n}function Bo(){let o=new Xe("up");return o.description("\u4E0A\u67B6\u5546\u54C1\u5230\u95F2\u9C7C"),o.option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1ID\uFF08\u4ECE goods list \u83B7\u53D6\uFF09").option("--shop-id <id>","\u5E97\u94FAID\uFF08\u4ECE goods shops \u83B7\u53D6\uFF09").option("--price <amount>","\u4E0A\u67B6\u4EF7\u683C").option("-p, --platform <platform>","\u5E73\u53F0","xianyu").option("--json","\u8F93\u51FA JSON\uFF08Agent \u7528\uFF09").action(m(async t=>{if(t.json&&!(t.stockGoodsId&&t.shopId&&t.price)){P(t,"Agent \u6A21\u5F0F\u9700\u8981 --stock-goods-id, --shop-id, --price");return}if(t.stockGoodsId&&t.shopId&&t.price){let d=Number(t.stockGoodsId),k=t.shopId,At=Number(t.price),z=t.platform,ue=await zt({stockGoodsId:d,shopId:k,price:At,platform:z}),vt=await $o(d,k,z,t.json);if(t.json)console.log(JSON.stringify({success:!0,data:{submit:ue,listing:vt}},null,2));else{let me=vt.status?.toLowerCase()!=="failed";console.log(me?D.green("\u2713 \u4E0A\u67B6\u6210\u529F"):D.red("\u2717 \u4E0A\u67B6\u5931\u8D25")),console.log(JSON.stringify(vt,null,2))}return}let e=await It();if(e.length===0){console.log(D.yellow("\u6CA1\u6709\u5DF2\u6388\u6743\u5E97\u94FA\uFF0C\u8BF7\u5148\u8FD0\u884C r2-cli auth xianyu \u6388\u6743"));return}let r=await Ft({message:"\u9009\u62E9\u5E97\u94FA",choices:e.map(d=>({name:`${d.shopName} (${d.platform})`,value:d.shopId}))}),n=await St();if(n.length===0){console.log(D.yellow("\u6CA1\u6709\u53EF\u7528\u7684\u4ED3\u5E93"));return}let s=await Ft({message:"\u9009\u62E9\u4ED3\u5E93",choices:n.map(d=>({name:d.stockName,value:d.stockId}))}),i=await Ct({stockId:s,size:100});if(!i.items?.length){console.log(D.yellow("\u8BE5\u4ED3\u5E93\u6CA1\u6709\u53EF\u9009\u7684\u5546\u54C1"));return}let a=await Ft({message:"\u9009\u62E9\u5546\u54C1",choices:i.items.map(d=>({name:`${d.goodsName} ${d.size?`| ${d.size}`:""} | \xA5${d.salePrice}`,value:d.stockGoodsId}))}),c=await _e({message:"\u8F93\u5165\u4E0A\u67B6\u4EF7\u683C",default:i.items.find(d=>d.stockGoodsId===a)?.salePrice?.toString()??"",validate:d=>Number(d)>0?!0:"\u4EF7\u683C\u5FC5\u987B\u4E3A\u6B63\u6570"});if(!await Me({message:`\u786E\u8BA4\u4E0A\u67B6\uFF1F\u4EF7\u683C \xA5${c}`,default:!0})){console.log(D.gray("\u5DF2\u53D6\u6D88"));return}let u=Number(a);await zt({stockGoodsId:u,shopId:r,price:Number(c),platform:"xianyu"}),console.log(D.green("\u2713 \u4E0A\u67B6\u5DF2\u63D0\u4EA4\uFF0C\u6B63\u5728\u67E5\u8BE2\u8FDB\u5EA6..."));let w=await $o(u,r,"xianyu"),M=w.status?.toLowerCase()!=="failed";console.log(M?D.green("\u2713 \u4E0A\u67B6\u6210\u529F"):D.red("\u2717 \u4E0A\u67B6\u5931\u8D25")),console.log(JSON.stringify(w,null,2))})),o}import{Command as Ze}from"commander";import Qo from"chalk";function Xo(){let o=new Ze("shops");return o.description("\u67E5\u770B\u6240\u6709\u5DF2\u6388\u6743\u5E97\u94FA\uFF08\u8DE8\u5E73\u53F0\uFF09"),o.option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),o.action(m(async t=>{let e=await It();if(t.json){console.log(JSON.stringify(Co(e),null,2));return}if(!e.length){console.log(Qo.yellow("\u672A\u627E\u5230\u5DF2\u6388\u6743\u7684\u5E97\u94FA")),console.log(Qo.gray(" \u63D0\u793A: \u8BF7\u5148\u5728\u7B2C\u4E8C\u56DE\u5408 APP \u4E2D\u6388\u6743\u5E97\u94FA"));return}let{ShopsTable:r}=await Promise.resolve().then(()=>(Jo(),Go)),{renderComponent:n}=await Promise.resolve().then(()=>(st(),ft));n(r,{shops:e,platform:"all"})})),o}import{Command as rr}from"commander";import nr from"chalk";function zo(){let o=new rr("stocks");return o.description("\u67E5\u770B\u6240\u6709\u4ED3\u5E93"),o.option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),o.action(m(async t=>{let e=await St();if(t.json){console.log(JSON.stringify(e,null,2));return}if(!e.length){console.log(nr.yellow("\u672A\u627E\u5230\u4ED3\u5E93\u4FE1\u606F"));return}let{StocksTable:r}=await Promise.resolve().then(()=>(Mo(),_o)),{renderComponent:n}=await Promise.resolve().then(()=>(st(),ft));n(r,{stocks:e})})),o}import{Command as sr}from"commander";import ot from"chalk";function Fo(){let o=new sr("list");return o.description("\u67E5\u770B\u4ED3\u5E93\u4E2D\u7684\u9009\u54C1\u5546\u54C1"),o.option("--stock-id <id>","\u4ED3\u5E93 ID\uFF08\u4ECE goods stocks \u83B7\u53D6\uFF09").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--page <n>","\u9875\u7801","1").option("--size <n>","\u6BCF\u9875\u6570\u91CF\uFF08\u6700\u5927 50\uFF09","20").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),o.action(m(async t=>{let r=await Ct({stockId:t.stockId||void 0,stockGoodsId:t.stockGoodsId||void 0,page:Number(t.page)||1,size:Math.min(Number(t.size)||20,50)})??{items:[],total:0};if(t.json){r.items?.length?console.log(JSON.stringify(r,null,2)):console.log(JSON.stringify({...r,hint:"\u9009\u54C1\u5546\u54C1\u4E3A\u7A7A\uFF0C\u8BF7\u5148\u5728\u540E\u53F0\u751F\u6210\u9009\u54C1\u8868\u6570\u636E\u540E\u518D\u8BD5"},null,2));return}if(!r.items?.length){console.log(ot.yellow("\u6682\u65E0\u9009\u54C1\u5546\u54C1\uFF0C\u8BF7\u5148\u7ED1\u5B9A\u4ED3\u5E93\u6216\u5728\u540E\u53F0\u751F\u6210\u9009\u54C1\u8868\u6570\u636E"));return}console.log(ot.cyan(`
|
|
36
|
-
\u9009\u54C1\u5546\u54C1\uFF08\u5171 ${r.total} \u4EF6\uFF0C\u7B2C ${r.page} \u9875\uFF09
|
|
37
|
-
`));for(let n of r.items)console.log(` ${ot.bold(n.goodsName)} ${n.size?ot.gray(`| ${n.size}`):""}`),console.log(` \u54C1\u724C: ${n.brand} \u5EFA\u8BAE\u552E\u4EF7: \xA5${n.salePrice} stockGoodsId: ${ot.green(n.stockGoodsId)}`),console.log(ot.gray(` \u5206\u7C7B: ${n.cate1Name} > ${n.cate2Name} > ${n.cate3Name}`)),console.log()})),o}import{Command as dr}from"commander";import ur from"chalk";st();import{Box as p,Text as y}from"ink";import{jsx as l,jsxs as $}from"react/jsx-runtime";var ir={init:{label:"\u5F85\u4E0A\u67B6",color:"yellow"},up:{label:"\u5DF2\u4E0A\u67B6",color:"green"},down:{label:"\u5DF2\u4E0B\u67B6",color:"gray"},fail:{label:"\u5931\u8D25",color:"red"},sold:{label:"\u5DF2\u552E\u51FA",color:"blue"}},oo=4,eo=8,Tt=12,ro=10,no=6,so=8;function Wo(o,t){return o.length>t?o.slice(0,t-1)+"\u2026":o}function Ho(o){if(!o)return"-";let t=new Date(o),e=r=>String(r).padStart(2,"0");return`${e(t.getMonth()+1)}/${e(t.getDate())} ${e(t.getHours())}:${e(t.getMinutes())}`}function ar({fillWidth:o}){return $(p,{flexDirection:"row",children:[l(p,{width:oo,children:l(y,{bold:!0,color:"white",children:"ID"})}),l(p,{width:eo,children:l(y,{bold:!0,color:"white",children:"\u72B6\u6001"})}),l(p,{width:Tt,children:l(y,{bold:!0,color:"white",children:"\u54C1\u724C"})}),l(p,{width:o,children:l(y,{bold:!0,color:"white",children:"\u5546\u54C1\u540D\u79F0"})}),l(p,{width:ro,children:l(y,{bold:!0,color:"white",children:"\u4EF7\u683C"})}),l(p,{width:no,children:l(y,{bold:!0,color:"white",children:"\u89C4\u683C"})}),l(p,{width:so,children:l(y,{bold:!0,color:"white",children:"\u5E93\u5B58ID"})})]})}function cr({item:o}){return l(p,{flexDirection:"column",children:l(y,{color:"gray",children:` shopId: ${o.shopId} thirdItemNo: ${o.thirdItemNo||"-"} outItemNo: ${o.outItemNo||"-"} \u8D27\u53F7: ${o.goodsNo||"-"} ${o.type||"-"} ${o.platform} \u521B\u5EFA: ${Ho(o.gmtCreate)} \u4FEE\u6539: ${Ho(o.gmtModified)}`})})}function lr({item:o,fillWidth:t}){let e=ir[o.status]??{label:o.status,color:"white"};return $(p,{flexDirection:"column",children:[$(p,{flexDirection:"row",children:[l(p,{width:oo,children:l(y,{color:"gray",children:o.id})}),l(p,{width:eo,children:l(y,{color:e.color,children:e.label})}),l(p,{width:Tt,children:l(y,{color:"cyan",children:Wo(o.brandName||"-",Tt-1)})}),l(p,{width:t,children:l(y,{children:Wo(o.goodsName,t-1)})}),l(p,{width:ro,children:$(y,{color:"yellow",children:["\xA5",o.price]})}),l(p,{width:no,children:l(y,{color:"gray",children:o.spec||"-"})}),l(p,{width:so,children:l(y,{color:"gray",children:o.stockGoodsId})})]}),l(cr,{item:o})]})}function Vo({items:o,total:t}){let e=process.stdout.columns||80,r=4,n=oo+eo+Tt+ro+no+so,s=Math.max(e-r-n,20),i=n+s;return $(p,{flexDirection:"column",marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,children:[$(p,{flexDirection:"row",children:[l(y,{bold:!0,color:"cyan",children:"\u4E0A\u67B6\u5217\u8868"}),$(y,{color:"gray",children:[" \xB7 \u5171 ",t," \u6761"]})]}),$(p,{flexDirection:"column",marginTop:1,children:[l(ar,{fillWidth:s}),l(y,{color:"gray",children:"\u2500".repeat(i)}),o.map(a=>l(lr,{item:a,fillWidth:s},a.id))]})]})}function Ko(){let o=new dr("listing");return o.description("\u67E5\u8BE2\u4E0A\u67B6\u5546\u54C1\u5217\u8868"),o.option("--id <id>","\u4E0A\u67B6\u8BB0\u5F55 ID").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--shop-id <id>","\u5E97\u94FA ID").option("--stock-id <id>","\u4ED3\u5E93 ID").option("-s, --status <status>","\u72B6\u6001\u8FC7\u6EE4\uFF08init/up/down/fail/sold\uFF09").option("-p, --platform <platform>","\u5E73\u53F0","xianyu").option("--page <n>","\u9875\u7801","1").option("--size <n>","\u6BCF\u9875\u6570\u91CF\uFF08\u6700\u5927 50\uFF09","20").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),o.action(m(async t=>{let r=await No({id:t.id,stockGoodsId:t.stockGoodsId?Number(t.stockGoodsId):void 0,shopId:t.shopId,stockId:t.stockId,status:t.status,platform:t.platform,page:Number(t.page)||1,size:Math.min(Number(t.size)||20,50)})??{items:[],total:0};if(t.json){r.items?.length?console.log(JSON.stringify(r,null,2)):console.log(JSON.stringify({...r,hint:"\u6682\u65E0\u4E0A\u67B6\u8BB0\u5F55"},null,2));return}if(!r.items?.length){console.log(ur.yellow("\u6682\u65E0\u4E0A\u67B6\u8BB0\u5F55"));return}Bt(Vo,{items:r.items,total:Number(r.total)})})),o}import{Command as mr}from"commander";import gr from"chalk";function Yo(){let o=new mr("down");return o.description("\u4E0B\u67B6\u95F2\u9C7C\u5546\u54C1"),o.option("--id <id>","\u4E0A\u67B6\u8BB0\u5F55 ID").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--shop-id <id>","\u5E97\u94FA ID").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),o.action(m(async t=>{if(!t.id&&!(t.stockGoodsId&&t.shopId)){P(t,"\u8BF7\u6307\u5B9A\u4E0B\u67B6\u6761\u4EF6\uFF1A--id <id> \u6216 --stock-goods-id <id> --shop-id <id>");return}let e={};t.id&&(e.id=t.id),t.stockGoodsId&&(e.stockGoodsId=Number(t.stockGoodsId)),t.shopId&&(e.shopId=t.shopId),t.json||console.log(gr.cyan("\u{1F4E6} \u6B63\u5728\u4E0B\u67B6\u5546\u54C1..."));let r=await ko(e);j(t,r,"\u2705 \u4E0B\u67B6\u6210\u529F")})),o}import{Command as pr}from"commander";import fr from"chalk";function Zo(){let o=new pr("price");return o.description("\u4FEE\u6539\u95F2\u9C7C\u4E0A\u67B6\u5546\u54C1\u4EF7\u683C"),o.option("--id <id>","\u4E0A\u67B6\u8BB0\u5F55 ID").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--shop-id <id>","\u5E97\u94FA ID").option("--price <amount>","\u65B0\u4EF7\u683C\uFF08\u5FC5\u586B\uFF09").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),o.action(m(async t=>{if(!t.price){P(t,"--price <amount> \u4E3A\u5FC5\u586B\u53C2\u6570");return}if(!t.id&&!(t.stockGoodsId&&t.shopId)){P(t,"\u8BF7\u6307\u5B9A\u5546\u54C1\uFF1A--id <id> \u6216 --stock-goods-id <id> --shop-id <id>");return}let e={price:Number(t.price)};t.id&&(e.id=t.id),t.stockGoodsId&&(e.stockGoodsId=Number(t.stockGoodsId)),t.shopId&&(e.shopId=t.shopId),t.json||console.log(fr.cyan(`\u{1F4B0} \u6B63\u5728\u4FEE\u6539\u4EF7\u683C\u4E3A ${t.price}...`));let r=await Ro(e);j(t,r,"\u2705 \u4EF7\u683C\u4FEE\u6539\u6210\u529F")})),o}import{Command as hr}from"commander";import yr from"chalk";function te(){let o=new hr("edit");return o.description("\u4FEE\u6539\u5DF2\u4E0A\u67B6\u5546\u54C1\u4FE1\u606F\uFF08\u6807\u9898\u3001\u63CF\u8FF0\u3001\u54C1\u724C\u3001\u7C7B\u76EE\u3001\u56FE\u7247\u3001\u5C5E\u6027\u7B49\uFF09"),o.option("--id <id>","\u5546\u54C1\u4E0A\u67B6 ID\uFF08goodsListingId\uFF0C\u63A8\u8350\uFF09").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID\uFF08\u4E0E --account \u914D\u5408\uFF09").option("--account <shopId>","\u95F2\u9C7C\u7528\u6237\u540D/\u5E97\u94FA ID\uFF08\u4E0E --stock-goods-id \u914D\u5408\uFF09").option("--title <title>","\u5546\u54C1\u6807\u9898").option("--desc <desc>","\u5546\u54C1\u63CF\u8FF0").requiredOption("--category-id <id>","\u5546\u54C1\u7C7B\u76EE ID\uFF08\u5927\u5206\u7C7B\uFF0C\u540E\u7AEF\u5FC5\u586B\uFF09").requiredOption("--channel-cat-id <id>","\u6E20\u9053\u7C7B\u76EE ID\uFF08\u5C0F\u5206\u7C7B\uFF0C\u540E\u7AEF\u5FC5\u586B\uFF09").option("--image-ids <ids>","\u56FE\u7247 ID \u5217\u8868\uFF08\u9017\u53F7\u5206\u9694\uFF09").option("--item-attrs <json>","\u5546\u54C1\u5C5E\u6027\u5217\u8868\uFF08JSON \u5B57\u7B26\u4E32\uFF09").option("--brand-name <name>","\u54C1\u724C\u540D\u79F0").option("--stuff-status <status>","\u6210\u8272\u7B49\u7EA7\uFF1A100=\u5168\u65B0 -1=\u51C6\u65B0 99=99\u65B0 95=95\u65B0 90=9\u65B0").option("--goods-no <no>","\u8D27\u53F7").option("--original-price <price>","\u539F\u4EF7\uFF08\u5355\u4F4D\uFF1A\u5143\uFF09").option("--size <size>","\u5C3A\u7801").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),o.action(m(async t=>{if(!t.id&&!(t.stockGoodsId&&t.account)){P(t,"\u8BF7\u6307\u5B9A\u5546\u54C1\uFF1A--id <goodsListingId> \u6216 --stock-goods-id <id> --account <shopId>");return}let e={categoryId:Number(t.categoryId),channelCatId:t.channelCatId};if(t.id&&(e.goodsListingId=Number(t.id)),t.stockGoodsId&&(e.stockGoodsId=Number(t.stockGoodsId)),t.account&&(e.account=t.account),t.title&&(e.title=t.title),t.desc&&(e.desc=t.desc),t.imageIds&&(e.imageIdList=t.imageIds.split(",").map(s=>s.trim())),t.brandName&&(e.brandName=t.brandName),t.stuffStatus&&(e.stuffStatus=Number(t.stuffStatus)),t.goodsNo&&(e.goodsNo=t.goodsNo),t.originalPrice&&(e.originalPrice=Number(t.originalPrice)),t.size&&(e.size=t.size),t.itemAttrs)try{e.itemAttrList=JSON.parse(t.itemAttrs)}catch{P(t,"--item-attrs JSON \u89E3\u6790\u5931\u8D25");return}if(!Object.keys(e).some(s=>!["goodsListingId","stockGoodsId","account"].includes(s))){P(t,"\u672A\u6307\u5B9A\u9700\u8981\u4FEE\u6539\u7684\u5B57\u6BB5");return}t.json||console.log(yr.cyan("\u6B63\u5728\u4FEE\u6539\u5546\u54C1\u4FE1\u606F..."));let n=await Lo(e);j(t,n,"\u2705 \u5546\u54C1\u4FE1\u606F\u4FEE\u6539\u6210\u529F")})),o}import{Command as et}from"commander";import S from"chalk";var wr={100:"\u5168\u65B0",[-1]:"\u51C6\u65B0",99:"99\u65B0",95:"95\u65B0",90:"9\u65B0"};function oe(){let o=new et("hang-up");return o.description("\u95F2\u9C7C\u6302\u552E\u4E0A\u67B6\uFF08\u5B8C\u6574\u5546\u54C1\u4FE1\u606F\u6A21\u5F0F\uFF09"),o.addCommand(new et("categories").description("\u83B7\u53D6\u95F2\u9C7C\u7C7B\u76EE\u5217\u8868\uFF08\u5927\u5206\u7C7B \u2192 \u5C0F\u5206\u7C7B\uFF09").option("--sp-biz-type <n>","\u4E1A\u52A1\u5206\u7C7B\uFF0C16=\u5962\u54C1","16").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async t=>{let e=await Uo(Number(t.spBizType));if(t.json){console.log(JSON.stringify(e,null,2));return}let r=new Map;for(let n of e){let s=String(n.catId);r.has(s)||r.set(s,{catName:n.catName,children:[]}),r.get(s).children.push({channel:n.channel,channelCatId:n.channelCatId})}for(let[n,s]of r){console.log(S.bold(`${s.catName} (catId: ${S.green(n)})`));for(let i of s.children)console.log(` ${i.channel} (channelCatId: ${S.green(i.channelCatId)})`)}}))),o.addCommand(new et("props").description("\u83B7\u53D6\u6307\u5B9A\u7C7B\u76EE\u4E0B\u7684\u5C5E\u6027\u5217\u8868\uFF08\u542B\u53EF\u9009\u503C\uFF09").requiredOption("--channel-cat-id <id>","\u5C0F\u5206\u7C7B ID\uFF08\u4ECE categories \u83B7\u53D6\uFF09").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async t=>{let e=await Eo(t.channelCatId);if(t.json){console.log(JSON.stringify(e,null,2));return}for(let r of e)if(console.log(S.bold(`
|
|
38
|
-
${r.propName} (propId: ${r.propId})`)),r.propsValues?.length)for(let n of r.propsValues)console.log(` ${n.valueName} (valueId: ${n.valueId})`);else console.log(S.gray(" \uFF08\u4F7F\u7528 brands \u5B50\u547D\u4EE4\u641C\u7D22\uFF09"))}))),o.addCommand(new et("brands").description("\u641C\u7D22\u95F2\u9C7C\u54C1\u724C\uFF08\u6309\u5173\u952E\u5B57\u8FC7\u6EE4\uFF09").requiredOption("--channel-cat-id <id>","\u5C0F\u5206\u7C7B ID").requiredOption("--prop-id <id>","\u5C5E\u6027 ID\uFF08\u54C1\u724C\u5C5E\u6027\u7684 propId\uFF09").requiredOption("--key <keyword>","\u641C\u7D22\u5173\u952E\u5B57").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async t=>{let e=await jo(t.channelCatId,t.propId,t.key);if(t.json){console.log(JSON.stringify(e,null,2));return}if(!e.length){console.log(S.yellow("\u672A\u627E\u5230\u5339\u914D\u7684\u54C1\u724C"));return}for(let r of e)console.log(` ${r.valueName} (valueId: ${r.valueId})`)}))),o.addCommand(new et("upload-images").description("\u6279\u91CF\u4E0A\u4F20\u56FE\u7247\u5230\u95F2\u9C7C\uFF08\u6302\u552E\u524D\u5FC5\u987B\u5148\u4E0A\u4F20\u56FE\u7247\uFF09").requiredOption("--shop-id <id>","\u5E97\u94FA ID").requiredOption("--files <paths>","\u56FE\u7247\u6587\u4EF6\u8DEF\u5F84\uFF0C\u9017\u53F7\u5206\u9694").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async t=>{let e=t.files.split(",").map(s=>s.trim()).filter(Boolean);if(e.length===0){P(t,"\u8BF7\u63D0\u4F9B\u81F3\u5C11\u4E00\u5F20\u56FE\u7247");return}t.json||console.log(S.cyan(`\u6B63\u5728\u4E0A\u4F20 ${e.length} \u5F20\u56FE\u7247...`));let{images:r,failed:n}=await Do(t.shopId,e);if(t.json){let s={success:!0,images:r};n.length&&(s.warning=`${n.length} \u5F20\u56FE\u7247\u4E0A\u4F20\u5931\u8D25`,s.failed=n),console.log(JSON.stringify(s,null,2))}else{if(r.length){console.log(S.green(`\u4E0A\u4F20\u6210\u529F\uFF0C\u5171 ${r.length} \u5F20`));for(let s of r)console.log(` \u56FE\u7247ID: ${s.value}`)}if(n.length){console.log(S.yellow(`
|
|
39
|
-
${n.length} \u5F20\u4E0A\u4F20\u5931\u8D25:`));for(let s of n)console.log(` ${s.file}: ${s.error}`)}}}))),o.addCommand(new et("submit").description("\u63D0\u4EA4\u6302\u552E\u4E0A\u67B6").requiredOption("--shop-id <id>","\u5E97\u94FA ID\uFF08\u5373\u95F2\u9C7C\u7528\u6237\u540D account\uFF09").requiredOption("--title <title>","\u5546\u54C1\u6807\u9898").requiredOption("--price <amount>","\u552E\u4EF7").requiredOption("--category-id <id>","\u5927\u5206\u7C7B ID\uFF08\u4ECE categories \u83B7\u53D6\uFF09").requiredOption("--channel-cat-id <id>","\u5C0F\u5206\u7C7B ID\uFF08\u4ECE categories \u83B7\u53D6\uFF09").requiredOption("--image-ids <ids>","\u56FE\u7247 ID \u5217\u8868\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u5148\u901A\u8FC7 upload-images \u83B7\u53D6\uFF09").requiredOption("--stuff-status <n>","\u6210\u8272\uFF1A100 \u5168\u65B0 / -1 \u51C6\u65B0 / 99 99\u65B0 / 95 95\u65B0 / 90 9\u65B0").option("--item-attrs <json>",'\u5546\u54C1\u5C5E\u6027\u5217\u8868 JSON\uFF0C\u683C\u5F0F: [{"valueName":"x","valueId":"y","propId":"z"}]').option("--brand-name <name>","\u54C1\u724C\u540D\u79F0").requiredOption("--desc <desc>","\u5546\u54C1\u63CF\u8FF0").option("--size <size>","\u5C3A\u7801").option("--goods-no <no>","\u8D27\u53F7").option("--original-price <amount>","\u539F\u4EF7").option("--trade-type <n>","\u4EA4\u6613\u65B9\u5F0F\uFF1A0 \u4EC5\u5728\u7EBF / 1 \u4EC5\u7EBF\u4E0B / 2 \u7EBF\u4E0A\u6216\u7EBF\u4E0B","0").option("--transport-fee <amount>","\u8FD0\u8D39\uFF08\u9ED8\u8BA4 0 \u5305\u90AE\uFF09","0").option("--yhb","\u662F\u5426\u5F00\u542F\u9A8C\u8D27\u5B9D").requiredOption("--out-item-no <no>","\u5546\u5BB6\u7F16\u7801\uFF08\u540C\u5E97\u94FA\u552F\u4E00\uFF0C\u7528\u6237\u81EA\u5B9A\u4E49\uFF09").option("--division-id <id>","\u884C\u653F\u533A\u5212 ID\uFF08\u5E02\u7EA7 ID\uFF0C\u9ED8\u8BA4\u676D\u5DDE 330100\uFF09","330100").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async t=>{let e=t.imageIds.split(",").map(i=>i.trim()),r=t.itemAttrs?JSON.parse(t.itemAttrs):void 0,n={account:t.shopId,title:t.title,reservePrice:Number(t.price),categoryId:Number(t.categoryId),channelCatId:t.channelCatId,imageIdList:e,stuffStatus:Number(t.stuffStatus),itemBizType:2,spBizType:"16",tradeType:Number(t.tradeType)||0,transportFee:Number(t.transportFee)||0,yhb:t.yhb??!1,...t.brandName&&{brandName:t.brandName},desc:t.desc,...t.size&&{size:t.size},...t.goodsNo&&{goodsNo:t.goodsNo},...t.originalPrice&&{originalPrice:Number(t.originalPrice)},...r?.length&&{itemAttrList:r},outItemNo:t.outItemNo,divisionId:Number(t.divisionId)||330100,apiAfterSalesDo:{supportFd10msPolicy:!1,supportFd24hsPolicy:!1,supportNfrPolicy:!1,supportSdrPolicy:!1,supportVnrPolicy:!1,supportGpaPolicy:!1,supportFd48hsPolicy:!1}};t.json||(console.log(S.cyan("\u6B63\u5728\u63D0\u4EA4\u6302\u552E...")),console.log(S.gray(` \u6807\u9898: ${n.title}`)),console.log(S.gray(` \u552E\u4EF7: \xA5${n.reservePrice}`)),console.log(S.gray(` \u6210\u8272: ${wr[n.stuffStatus]??n.stuffStatus}`)),console.log(S.gray(` \u56FE\u7247: ${e.length} \u5F20`)),r?.length&&console.log(S.gray(` \u5C5E\u6027: ${r.length} \u9879`)));let s=await Oo(n);j(t,s,"\u6302\u552E\u63D0\u4EA4\u6210\u529F")}))),o}function ee(){let o=new xr("goods");return o.description("\u5546\u54C1\u7BA1\u7406"),o.addCommand(Xo()),o.addCommand(zo()),o.addCommand(Fo()),o.addCommand(Ko()),o.addCommand(Yo()),o.addCommand(Zo()),o.addCommand(te()),o.addCommand(Bo()),o.addCommand(oe()),o}import{Command as Ir}from"commander";import O from"chalk";import{promises as Sr}from"node:fs";import Cr from"node:path";import Tr from"node:os";import{spawn as br}from"node:child_process";var bt="@round2ai/r2-cli";function re(){let o=new Ir("uninstall");return o.description("\u5378\u8F7D R2-CLI \u5E76\u6E05\u9664\u6240\u6709\u914D\u7F6E"),o.action(async()=>{try{console.log(O.yellow(`
|
|
40
|
-
\u26A0\uFE0F \u5373\u5C06\u6267\u884C\u4EE5\u4E0B\u64CD\u4F5C\uFF1A`)),console.log(O.gray(" 1. \u5220\u9664\u914D\u7F6E\u76EE\u5F55 ~/.r2-cli/")),console.log(O.gray(` 2. \u5168\u5C40\u5378\u8F7D ${bt}
|
|
41
|
-
`));let{confirm:t}=await import("@inquirer/prompts");if(!await t({message:"\u786E\u8BA4\u5378\u8F7D\uFF1F",default:!1})){console.log(O.gray("\u5DF2\u53D6\u6D88\u5378\u8F7D"));return}let r=Cr.join(Tr.homedir(),".r2-cli");try{await Sr.rm(r,{recursive:!0,force:!0}),console.log(O.green("\u2705 \u914D\u7F6E\u6587\u4EF6\u5DF2\u6E05\u9664"))}catch{console.log(O.yellow("\u26A0\uFE0F \u914D\u7F6E\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u65E0\u6CD5\u5220\u9664\uFF08\u53EF\u5FFD\u7565\uFF09"))}console.log(O.cyan(`\u6B63\u5728\u5378\u8F7D ${bt}...`)),br("npm",["uninstall","-g",bt],{stdio:"inherit",shell:!0}).on("exit",s=>{s===0?console.log(O.green(`
|
|
42
|
-
\u2705 ${bt} \u5DF2\u5378\u8F7D`)):(console.log(O.yellow(`
|
|
43
|
-
\u26A0\uFE0F npm \u5378\u8F7D\u5931\u8D25 (exit code: ${s})`)),console.log(O.gray(" \u5982\u901A\u8FC7 yarn/pnpm \u5B89\u88C5\uFF0C\u8BF7\u624B\u52A8\u5378\u8F7D"))),process.exit(s??1)})}catch(t){X(t)}}),o}import{Command as vr}from"commander";import at from"chalk";import{spawn as kr,execSync as Rr}from"node:child_process";import{readFileSync as Pr}from"node:fs";import{join as Ar}from"node:path";function Pt(){for(let o of["../package.json","../../package.json"])try{return JSON.parse(Pr(Ar(import.meta.dirname,o),"utf-8")).version}catch{}return"0.0.0"}var ne="@round2ai/r2-cli";function Lr(o,t){return new Promise(e=>{let r=kr(o,t,{stdio:"inherit"});r.on("close",n=>e(n??1)),r.on("error",()=>e(1))})}function se(){return new vr("update").description("\u4E00\u952E\u66F4\u65B0 CLI \u548C\u6280\u80FD").action(async()=>{let o=Pt();console.log(at.cyan(`\u5F53\u524D\u7248\u672C: ${o}`)),console.log(at.cyan("\u6B63\u5728\u66F4\u65B0 CLI...")),await Lr("npm",["install","-g",`${ne}@latest`])!==0&&(console.error(at.red(`
|
|
44
|
-
\u2717 update failed \xB7 Try: npm install -g ${ne}@latest`)),process.exit(1));let e=o;try{e=Rr("r2-cli --version",{encoding:"utf-8"}).trim()||o}catch{}console.log(at.green(`
|
|
45
|
-
\u2713 \u66F4\u65B0\u5B8C\u6210: ${o} \u2192 ${e}`)),console.log(at.green("\u2713 \u6280\u80FD\u5DF2\u540C\u6B65\u66F4\u65B0"))})}function ie(o){let t=o.command("auth").description("\u6388\u6743\u7BA1\u7406");t.addCommand(Qt()),t.addCommand(Xt()),t.addCommand(_t()),t.addCommand(Mt()),o.addCommand(ee()),o.addCommand(re()),o.addCommand(se())}import ae from"chalk";var ce="@round2ai/r2-cli",Nr=[`https://registry.npmmirror.com/${encodeURIComponent(ce)}/latest`,`https://registry.npmjs.org/${encodeURIComponent(ce)}/latest`],Dr=5e3;async function Or(o){let t=new AbortController,e=setTimeout(()=>t.abort(),Dr);try{let r=await fetch(o,{signal:t.signal});return r.ok?(await r.json()).version??null:null}catch{return null}finally{clearTimeout(e)}}async function Ur(){let o=await Promise.allSettled(Nr.map(Or));for(let t of o)if(t.status==="fulfilled"&&t.value)return t.value;return null}function Er(o,t){let e=o.split(".").map(Number),r=t.split(".").map(Number);for(let n=0;n<3;n++)if((e[n]??0)!==(r[n]??0))return(e[n]??0)>(r[n]??0);return!1}async function le(o){let t=await Ur();t&&Er(t,o)&&jr(o,t)}function jr(o,t){console.error(ae.yellow(`
|
|
46
|
-
Update available: ${o} \u2192 ${t}`)+ae.gray(`
|
|
32
|
+
`));let i=3e5,s=1e3;try{let a=await pt(t.state,i,s,e,r);if(a.status==="success")return a;throw new C("\u95F2\u9C7C\u6388\u6743\u5931\u8D25: "+(a.status==="expired"?"\u94FE\u63A5\u5DF2\u8FC7\u671F":"\u672A\u77E5\u72B6\u6001"))}finally{n()}}D();import R from"chalk";import to from"chalk";var eo="@round2ai/r2-cli",hr=[`https://registry.npmmirror.com/${encodeURIComponent(eo)}/latest`,`https://registry.npmjs.org/${encodeURIComponent(eo)}/latest`],yr=5e3;async function wr(e){let t=new AbortController,o=setTimeout(()=>t.abort(),yr);try{let r=await fetch(e,{signal:t.signal});return r.ok?(await r.json()).version??null:null}catch{return null}finally{clearTimeout(o)}}async function xr(){let e=await Promise.allSettled(hr.map(wr));for(let t of e)if(t.status==="fulfilled"&&t.value)return t.value;return null}function Ir(e,t){let o=e.split(".").map(Number),r=t.split(".").map(Number);for(let n=0;n<3;n++)if((o[n]??0)!==(r[n]??0))return(o[n]??0)>(r[n]??0);return!1}var Zt=null,bt=null;function oo(){return!Zt||!bt?null:{_notice:{update:{message:`Update available: ${bt} \u2192 ${Zt}`,command:"npm update -g @round2ai/r2-cli && npx skills add Round2AI/r2-cli --all -y"}}}}async function ro(e){let t=await xr();t&&(Ir(t,e)?(Zt=t,bt=e,Sr(e,t)):bt=e)}function Sr(e,t){console.error(to.yellow(`
|
|
33
|
+
Update available: ${e} \u2192 ${t}`)+to.gray(`
|
|
47
34
|
Run: r2-cli update
|
|
48
|
-
`))}
|
|
49
|
-
`))
|
|
50
|
-
\u64CD\u4F5C\
|
|
35
|
+
`))}function Cr(e){if(e instanceof C)console.error(R.red(`
|
|
36
|
+
\u25B2 ${e.message}`)),console.error(R.gray(`\u2192 \u8BF7\u5148\u8FD0\u884C: r2-cli auth login
|
|
37
|
+
`));else if(e instanceof b)console.error(R.red(`\u25B2 \u64CD\u4F5C\u5931\u8D25: ${e.message}`)),e.status&&console.error(R.gray(` \u72B6\u6001\u7801: ${e.status}`));else if(e instanceof G)console.error(R.red(`\u25B2 \u914D\u7F6E\u6587\u4EF6\u5F02\u5E38: ${e.message}`)),e.path&&console.error(R.gray(` \u8DEF\u5F84: ${e.path}`)),console.error(R.gray(`\u2192 \u8BF7\u5C1D\u8BD5\u91CD\u65B0\u767B\u5F55: r2-cli auth login
|
|
38
|
+
`));else{let t=e instanceof Error?e.message:String(e);console.error(R.red(`\u25B2 ${t}`))}process.exit(1)}function S(e){let t=oo();return t&&Object.assign(e,t),e}function te(e,t){let o={success:!1,error:e};t&&(o.errorType=t),S(o),console.log(JSON.stringify(o)),process.exit(1)}function m(e){return async t=>{try{await e(t)}catch(o){if(t.json){let r=o instanceof Error?o.message:String(o),n=z(o),i=o instanceof b?o.status:void 0,s={success:!1,error:r,errorType:n};i!=null&&(s.status=i),S(s),console.log(JSON.stringify(s)),process.exit(1)}Cr(o)}}}function h(e,t){e.json&&(console.log(JSON.stringify({success:!1,error:t,errorType:"validation"})),process.exit(1)),console.log(R.yellow(t))}function y(e,t,o){if(e.json){let r={success:!0,data:t};S(r),console.log(JSON.stringify(r,null,2))}else o&&console.log(R.green(o)),console.log(JSON.stringify(t,null,2))}function Pt(e){return async(...t)=>{try{await e(...t)}catch(o){let r=o instanceof Error?o.message:String(o),n=z(o);te(r,n)}}}var Tr=new Set(["accessToken","refreshExpireIn"]);function no(e){return e.map(t=>{let o={};for(let[r,n]of Object.entries(t))Tr.has(r)||(o[r]=n);return o})}function At(e){e.option("--expire <ms>","\u8FC7\u671F\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09","300000").option("--interval <ms>","\u8F6E\u8BE2\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09","1000")}function vt(e,t){return{expireMs:Number.parseInt(e.expire??String(t?.expireMs??3e5),10),intervalMs:Number.parseInt(e.interval??String(t?.intervalMs??1e3),10)}}async function kt(e){let{qrInfo:t,qrUrl:o,setStatus:r,closeServer:n,waitArgs:i}=await e.generate();console.log(JSON.stringify(S(t),null,2)),X(o);try{let s=await e.waitResult(i,r);console.log(JSON.stringify(S(e.formatSuccess(s))))}catch(s){let a=s instanceof Error?s.message:String(s);console.log(JSON.stringify(S({success:!1,error:a}))),process.exit(1)}finally{setTimeout(n,1e3)}}function ee(){let e=new io("login");e.description("\u626B\u7801\u767B\u5F55 Round2AI \u8D26\u6237").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09");let t=new io("poll").description("\u8F6E\u8BE2\u767B\u5F55\u72B6\u6001\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").requiredOption("--token <qrToken>","\u4E8C\u7EF4\u7801 token").action(Pt(async o=>{let r=k(),{expireMs:n,intervalMs:i}=vt(o),s=await r.waitForLogin(o.token,n,i);console.log(JSON.stringify(S({success:!0,...s})))}));return At(t),e.addCommand(t),e.action(m(async o=>{o.json?await kt({generate:async()=>{let r=k(),{qrData:n,qrUrl:i,setStatus:s,closeServer:a}=await r.generateQR(),d=Number.parseInt(n.expireTime,10),w=Number.parseInt(n.pollInterval,10);return{qrInfo:{qrToken:n.qrToken,expireTimeMs:d,pollIntervalMs:w,qrUrl:i},qrUrl:i,setStatus:s,closeServer:a,waitArgs:{qrToken:n.qrToken,expireMs:d,intervalMs:w}}},waitResult:({qrToken:r,expireMs:n,intervalMs:i},s)=>k().waitForLogin(r,n,i,void 0,s,!0),formatSuccess:r=>({success:!0,userInfo:r.userInfo})}):await k().login()})),e}import{Command as br}from"commander";function oe(){let e=new br("logout");return e.description("\u9000\u51FA\u767B\u5F55").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{if(t.json){let{getAuthStorage:o}=await Promise.resolve().then(()=>(dt(),Wt));await o().clearCredentials(),y(t,null,"\u5DF2\u9000\u51FA\u767B\u5F55")}else await k().logout()})),e}import{Command as Pr}from"commander";function re(){let e=new Pr("status");return e.description("\u67E5\u770B\u767B\u5F55\u72B6\u6001").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{if(t.json){let{getAuthStorage:o}=await Promise.resolve().then(()=>(dt(),Wt)),r=o();if(!await r.isLoggedIn()){y(t,{loggedIn:!1},"\u672A\u767B\u5F55");return}let i=await r.getCredentials();y(t,{loggedIn:!0,userInfo:i.userInfo,timestamp:i.timestamp})}else await k().status()})),e}import{Command as so}from"commander";function ne(){let e=new so("xianyu");e.description("\u95F2\u9C7C\u5E97\u94FA\u6388\u6743").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09");let t=new so("poll").description("\u8F6E\u8BE2\u95F2\u9C7C\u6388\u6743\u72B6\u6001\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").requiredOption("--state <state>","\u6388\u6743\u8F6E\u8BE2 token");return At(t),t.action(Pt(async o=>{let{expireMs:r,intervalMs:n}=vt(o),i=await pt(o.state,r,n);i.status==="success"?console.log(JSON.stringify(S({success:!0,shopId:i.shopId,shopName:i.shopName}))):te(`\u6388\u6743\u72B6\u6001: ${i.status}`)})),e.addCommand(t),e.action(m(async o=>{o.json?await kt({generate:async()=>{let{authData:r,qrUrl:n,setStatus:i,closeServer:s}=await Tt(),a=r.expireTime?Number.parseInt(r.expireTime,10):3e5,d=r.pollInterval?Number.parseInt(r.pollInterval,10):1e3;return{qrInfo:{state:r.state,expireTimeMs:a,pollIntervalMs:d,qrUrl:n},qrUrl:n,setStatus:i,closeServer:s,waitArgs:{state:r.state,expireMs:a,intervalMs:d}}},waitResult:async({state:r,expireMs:n,intervalMs:i},s)=>{let a=await pt(r,n,i,void 0,s);if(a.status!=="success")throw new Error(`\u6388\u6743\u72B6\u6001: ${a.status}`);return a},formatSuccess:r=>({success:!0,shopId:r.shopId,shopName:r.shopName})}):await Kt()})),e}import{Command as hn}from"commander";import{Command as Ur}from"commander";import L from"chalk";import{select as ye,input as Er,confirm as jr}from"@inquirer/prompts";_();var F=v;async function Rt(e){return F.post("mms/goods/listing/up/xianyu",e)}async function ie(e){return F.get("mms/goods/listing/get",E(e))}async function se(e){return F.post("mms/goods/listing/down/xianyu",e)}async function ae(e){return F.post("mms/goods/listing/update/xyPrice",e)}async function ce(e){return F.post("mms/goods/listing/update/goodsInfo",e)}async function le(e){return F.get("mms/goods/listing/list",e?E(e):void 0)}async function de(e){return F.post("mms/goods/listing/hang/up/xianyu",e)}_();var me=v;async function gt(){return await me.get("mms/user/shop/list")??[]}async function ft(){return await me.get("mms/user/stock/list")??[]}async function ht(e){let t=e?E(e):void 0;return me.get("mms/seller/goods/select/list",t)}import{basename as Rr}from"node:path";import{stat as Ar,readFile as ao}from"node:fs/promises";import vr from"sharp";var kr=2*1024*1024;async function co(e,t=kr){let{size:o}=await Ar(e);if(o<=t)return ao(e);let r=vr(e);await r.metadata();let n=[80,70,60,50,40,30],i=null;for(let s of n){let a=await r.jpeg({quality:s,mozjpeg:!0}).toBuffer();if(a.length<=t)return a;i=a}return i??ao(e)}var Lr=v;async function ue(e,t){let o=async(s,a=1)=>{for(let d=0;d<=a;d++)try{let w=await co(s),P=Rr(s),c=new FormData;return c.append("file",new Blob([new Uint8Array(w)]),P),await Lr.upload(`platform/xy/media/upload?shopId=${encodeURIComponent(e)}`,c)}catch(w){if(d<a){await new Promise(P=>setTimeout(P,1e3));continue}throw w}throw new Error("unreachable")},r=await Promise.allSettled(t.map(o)),n=[],i=[];for(let s=0;s<r.length;s++){let a=r[s];if(a.status==="fulfilled")n.push(a.value);else{let d=a.reason;i.push({file:t[s],error:d instanceof Error?d.message:`${d}`})}}return{images:n,failed:i}}_();var pe=v;async function ge(e=16){return await pe.get("platform/xy/cat",E({spBizType:e}))??[]}async function fe(e){return await pe.get("platform/xy/props",E({channelCatId:e}))??[]}async function he(e,t,o){return await pe.get("platform/xy/props/value",E({channelCatId:e,propId:t,key:o}))??[]}D();function Nr(e){let t=e.charCodeAt(0);return t>=32&&t<=126}function Or(e){let t=0;for(let o=0;o<e.length;o++)t+=Nr(e[o])?.5:1;return t}function Lt(e,t=30){let o=Or(e);return o>t?`\u6807\u9898\u8FC7\u957F\uFF08${o}/${t}\uFF09\uFF0C\u95F2\u9C7C\u6807\u9898\u4E0A\u9650 30 \u4E2A\u6C49\u5B57\uFF08\u6216 60 \u4E2A\u82F1\u6587\u5B57\u7B26\uFF09`:null}var lo=99999999;function Nt(e,t="\u552E\u4EF7"){return e<=0?`${t}\u5FC5\u987B\u5927\u4E8E 0`:e>lo?`${t}\u4E0D\u80FD\u8D85\u8FC7 ${lo} \u5143`:null}var Dr=2e3,$r=1e4;function Br(e){let t=e.status?.toLowerCase()??"";return t===""||t==="init"||t==="pending"||t==="processing"}async function mo(e,t,o,r){r||process.stdout.write(L.cyan("\u23F3 \u6B63\u5728\u67E5\u8BE2\u4E0A\u67B6\u8FDB\u5EA6..."));let n=await W(()=>ie({stockGoodsId:e,shopId:t,platform:o}),{interval:Dr,timeout:$r,condition:i=>!Br(i)});return r||process.stdout.write("\r"+" ".repeat(30)+"\r"),n}function uo(){let e=new Ur("up");return e.description("\u4E0A\u67B6\u5546\u54C1\u5230\u95F2\u9C7C"),e.option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1ID\uFF08\u4ECE goods list \u83B7\u53D6\uFF09").option("--shop-id <id>","\u5E97\u94FAID\uFF08\u4ECE goods shops \u83B7\u53D6\uFF09").option("--price <amount>","\u4E0A\u67B6\u4EF7\u683C").option("-p, --platform <platform>","\u5E73\u53F0","xianyu").option("--json","\u8F93\u51FA JSON\uFF08Agent \u7528\uFF09").action(m(async t=>{if(t.json&&!(t.stockGoodsId&&t.shopId&&t.price)){h(t,"Agent \u6A21\u5F0F\u9700\u8981 --stock-goods-id, --shop-id, --price");return}if(t.stockGoodsId&&t.shopId&&t.price){let c=Number(t.stockGoodsId),x=t.shopId,wt=Number(t.price),je=t.platform,De=Nt(wt);if(De){h(t,De);return}let $e;try{$e=await Rt({stockGoodsId:c,shopId:x,price:wt,platform:je})}catch(U){let Qo=U instanceof Error?U.message:String(U),Fo=z(U);console.log(JSON.stringify(S({success:!1,error:Qo,errorType:Fo}))),process.exit(1)}let qt,Be,qe;try{qt=await mo(c,x,je,t.json)}catch(U){Be=U instanceof Error?U.message:String(U),qe=z(U)}let st={submit:$e};qt?st.listing=qt:(st.listing=null,st.warning=`\u63D0\u4EA4\u6210\u529F\u4F46\u56DE\u67E5\u5931\u8D25\uFF1A${Be}`,st.verifyStatus=qe),console.log(JSON.stringify(S({success:!0,data:st}),null,2));return}let o=await gt();if(o.length===0){console.log(L.yellow("\u6CA1\u6709\u5DF2\u6388\u6743\u5E97\u94FA\uFF0C\u8BF7\u5148\u8FD0\u884C r2-cli auth xianyu \u6388\u6743"));return}let r=await ye({message:"\u9009\u62E9\u5E97\u94FA",choices:o.map(c=>({name:`${c.shopName} (${c.platform})`,value:c.shopId}))}),n=await ft();if(n.length===0){console.log(L.yellow("\u6CA1\u6709\u53EF\u7528\u7684\u4ED3\u5E93"));return}let i=await ye({message:"\u9009\u62E9\u4ED3\u5E93",choices:n.map(c=>({name:c.stockName,value:c.stockId}))}),s=await ht({stockId:i,size:100});if(!s.items?.length){console.log(L.yellow("\u8BE5\u4ED3\u5E93\u6CA1\u6709\u53EF\u9009\u7684\u5546\u54C1"));return}let a=await ye({message:"\u9009\u62E9\u5546\u54C1",choices:s.items.map(c=>({name:`${c.goodsName} ${c.size?`| ${c.size}`:""} | \xA5${c.salePrice}`,value:c.stockGoodsId}))}),d=await Er({message:"\u8F93\u5165\u4E0A\u67B6\u4EF7\u683C",default:s.items.find(c=>c.stockGoodsId===a)?.salePrice?.toString()??"",validate:c=>Number(c)>0?!0:"\u4EF7\u683C\u5FC5\u987B\u4E3A\u6B63\u6570"});if(!await jr({message:`\u786E\u8BA4\u4E0A\u67B6\uFF1F\u4EF7\u683C \xA5${d}`,default:!0})){console.log(L.gray("\u5DF2\u53D6\u6D88"));return}let P=Number(a);await Rt({stockGoodsId:P,shopId:r,price:Number(d),platform:"xianyu"}),console.log(L.green("\u2713 \u4E0A\u67B6\u5DF2\u63D0\u4EA4\uFF0C\u6B63\u5728\u67E5\u8BE2\u8FDB\u5EA6..."));try{let c=await mo(P,r,"xianyu"),x=c.status?.toLowerCase()!=="failed";console.log(x?L.green("\u2713 \u4E0A\u67B6\u6210\u529F"):L.red("\u2717 \u4E0A\u67B6\u5931\u8D25")),console.log(JSON.stringify(c,null,2))}catch(c){let x=c instanceof Error?c.message:String(c);console.log(L.yellow("\u26A0 \u5DF2\u63D0\u4EA4\uFF0C\u4F46\u56DE\u67E5\u5931\u8D25\uFF1A"+x)),console.log(L.gray("\u2192 \u8BF7\u7528 r2-cli goods listing \u786E\u8BA4\u4E0A\u67B6\u7ED3\u679C"))}})),e}import{Command as Jr}from"commander";import wo from"chalk";function xo(){let e=new Jr("shops");return e.description("\u67E5\u770B\u6240\u6709\u5DF2\u6388\u6743\u5E97\u94FA\uFF08\u8DE8\u5E73\u53F0\uFF09"),e.option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{let o=await gt();if(t.json){console.log(JSON.stringify(no(o),null,2));return}if(!o.length){console.log(wo.yellow("\u672A\u627E\u5230\u5DF2\u6388\u6743\u7684\u5E97\u94FA")),console.log(wo.gray(" \u63D0\u793A: \u8BF7\u5148\u5728\u7B2C\u4E8C\u56DE\u5408 APP \u4E2D\u6388\u6743\u5E97\u94FA"));return}let{ShopsTable:r}=await Promise.resolve().then(()=>(yo(),fo)),{renderComponent:n}=await Promise.resolve().then(()=>(ut(),St));n(r,{shops:o,platform:"all"})})),e}import{Command as zr}from"commander";import Wr from"chalk";function To(){let e=new zr("stocks");return e.description("\u67E5\u770B\u6240\u6709\u4ED3\u5E93"),e.option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{let o=await ft();if(t.json){console.log(JSON.stringify(o,null,2));return}if(!o.length){console.log(Wr.yellow("\u672A\u627E\u5230\u4ED3\u5E93\u4FE1\u606F"));return}let{StocksTable:r}=await Promise.resolve().then(()=>(Co(),Io)),{renderComponent:n}=await Promise.resolve().then(()=>(ut(),St));n(r,{stocks:o})})),e}import{Command as Hr}from"commander";import rt from"chalk";function bo(){let e=new Hr("list");return e.description("\u67E5\u770B\u4ED3\u5E93\u4E2D\u7684\u9009\u54C1\u5546\u54C1"),e.option("--stock-id <id>","\u4ED3\u5E93 ID\uFF08\u4ECE goods stocks \u83B7\u53D6\uFF09").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--page <n>","\u9875\u7801","1").option("--size <n>","\u6BCF\u9875\u6570\u91CF\uFF08\u6700\u5927 50\uFF09","20").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{let r=await ht({stockId:t.stockId||void 0,stockGoodsId:t.stockGoodsId||void 0,page:Number(t.page)||1,size:Math.min(Number(t.size)||20,50)})??{items:[],total:0};if(t.json){r.items?.length?console.log(JSON.stringify(r,null,2)):console.log(JSON.stringify({...r,hint:"\u9009\u54C1\u5546\u54C1\u4E3A\u7A7A\uFF0C\u8BF7\u5148\u5728\u540E\u53F0\u751F\u6210\u9009\u54C1\u8868\u6570\u636E\u540E\u518D\u8BD5"},null,2));return}if(!r.items?.length){console.log(rt.yellow("\u6682\u65E0\u9009\u54C1\u5546\u54C1\uFF0C\u8BF7\u5148\u7ED1\u5B9A\u4ED3\u5E93\u6216\u5728\u540E\u53F0\u751F\u6210\u9009\u54C1\u8868\u6570\u636E"));return}console.log(rt.cyan(`
|
|
39
|
+
\u9009\u54C1\u5546\u54C1\uFF08\u5171 ${r.total} \u4EF6\uFF0C\u7B2C ${r.page} \u9875\uFF09
|
|
40
|
+
`));for(let n of r.items)console.log(` ${rt.bold(n.goodsName)} ${n.size?rt.gray(`| ${n.size}`):""}`),console.log(` \u54C1\u724C: ${n.brand} \u5EFA\u8BAE\u552E\u4EF7: \xA5${n.salePrice} stockGoodsId: ${rt.green(n.stockGoodsId)}`),console.log(rt.gray(` \u5206\u7C7B: ${n.cate1Name} > ${n.cate2Name} > ${n.cate3Name}`)),console.log()})),e}import{Command as Zr}from"commander";import tn from"chalk";ut();Ut();import{Box as p,Text as g}from"ink";import{jsx as l,jsxs as ve}from"react/jsx-runtime";var Vr={init:{label:"\u5F85\u4E0A\u67B6",color:"yellow"},up:{label:"\u5DF2\u4E0A\u67B6",color:"green"},down:{label:"\u5DF2\u4E0B\u67B6",color:"gray"},fail:{label:"\u5931\u8D25",color:"red"},sold:{label:"\u5DF2\u552E\u51FA",color:"blue"}},ke=4,Re=8,Et=8,Le=8,Ne=8,Oe=11,jt=10,Dt=10,$t=12;function Yr({fillWidth:e}){return ve(p,{flexDirection:"row",children:[l(p,{width:ke,children:l(g,{bold:!0,color:"white",children:"ID"})}),l(p,{width:Re,children:l(g,{bold:!0,color:"white",children:"\u72B6\u6001"})}),l(p,{width:Et,children:l(g,{bold:!0,color:"white",children:"\u54C1\u724C"})}),l(p,{width:e,children:l(g,{bold:!0,color:"white",children:"\u5546\u54C1\u540D\u79F0"})}),l(p,{width:Le,children:l(g,{bold:!0,color:"white",children:"\u4EF7\u683C"})}),l(p,{width:Ne,children:l(g,{bold:!0,color:"white",children:"\u5E73\u53F0"})}),l(p,{width:Oe,children:l(g,{bold:!0,color:"white",children:"\u5E97\u94FA"})}),l(p,{width:jt,children:l(g,{bold:!0,color:"white",children:"\u4ED3\u5E93\u5546\u54C1"})}),l(p,{width:Dt,children:l(g,{bold:!0,color:"white",children:"\u8D27\u53F7"})}),l(p,{width:$t,children:l(g,{bold:!0,color:"white",children:"\u4E09\u65B9\u7F16\u53F7"})})]})}function Kr({item:e,fillWidth:t}){let o=Vr[e.status]??{label:e.status,color:"white"};return ve(p,{flexDirection:"row",children:[l(p,{width:ke,children:l(g,{color:"gray",children:e.id})}),l(p,{width:Re,children:l(g,{color:o.color,children:o.label})}),l(p,{width:Et,children:l(g,{color:"cyan",children:tt(e.brandName||"-",Et-1)})}),l(p,{width:t,children:l(g,{children:tt(e.goodsName,t-1)})}),l(p,{width:Le,children:ve(g,{color:"yellow",children:["\xA5",e.price]})}),l(p,{width:Ne,children:l(g,{color:"gray",children:e.platform})}),l(p,{width:Oe,children:l(g,{color:"gray",children:e.shopId})}),l(p,{width:jt,children:l(g,{color:"gray",children:tt(`${e.stockGoodsId}`,jt-1)})}),l(p,{width:Dt,children:l(g,{color:"gray",children:tt(e.goodsNo||"-",Dt-1)})}),l(p,{width:$t,children:l(g,{color:"gray",children:tt(e.thirdItemNo||"-",$t-1)})})]})}function Po({items:e,total:t}){let o=ke+Re+Et+Le+Ne+Oe+jt+Dt+$t,{fillWidth:r,totalWidth:n}=et(o);return l(ot,{title:"\u4E0A\u67B6\u5217\u8868",count:t,fillWidth:r,totalWidth:n,header:l(Yr,{fillWidth:r}),children:e.map(i=>l(Kr,{item:i,fillWidth:r},i.id))})}function Ao(){let e=new Zr("listing");return e.description("\u67E5\u8BE2\u4E0A\u67B6\u5546\u54C1\u5217\u8868"),e.option("--id <id>","\u4E0A\u67B6\u8BB0\u5F55 ID").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--shop-id <id>","\u5E97\u94FA ID").option("--stock-id <id>","\u4ED3\u5E93 ID").option("-s, --status <status>","\u72B6\u6001\u8FC7\u6EE4\uFF08init/up/down/fail/sold\uFF09").option("-p, --platform <platform>","\u5E73\u53F0","xianyu").option("--page <n>","\u9875\u7801","1").option("--size <n>","\u6BCF\u9875\u6570\u91CF\uFF08\u6700\u5927 50\uFF09","20").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{let r=await le({id:t.id,stockGoodsId:t.stockGoodsId?Number(t.stockGoodsId):void 0,shopId:t.shopId,stockId:t.stockId,status:t.status,platform:t.platform,page:Number(t.page)||1,size:Math.min(Number(t.size)||20,50)})??{items:[],total:0};if(t.json){r.items?.length?console.log(JSON.stringify(r,null,2)):console.log(JSON.stringify({...r,hint:"\u6682\u65E0\u4E0A\u67B6\u8BB0\u5F55"},null,2));return}if(!r.items?.length){console.log(tn.yellow("\u6682\u65E0\u4E0A\u67B6\u8BB0\u5F55"));return}Vt(Po,{items:r.items,total:Number(r.total)})})),e}import{Command as en}from"commander";import on from"chalk";function vo(){let e=new en("down");return e.description("\u4E0B\u67B6\u95F2\u9C7C\u5546\u54C1"),e.option("--id <id>","\u4E0A\u67B6\u8BB0\u5F55 ID").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--shop-id <id>","\u5E97\u94FA ID").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{if(!t.id&&!(t.stockGoodsId&&t.shopId)){h(t,"\u8BF7\u6307\u5B9A\u4E0B\u67B6\u6761\u4EF6\uFF1A--id <id> \u6216 --stock-goods-id <id> --shop-id <id>");return}let o={};t.id&&(o.id=t.id),t.stockGoodsId&&(o.stockGoodsId=Number(t.stockGoodsId)),t.shopId&&(o.shopId=t.shopId),t.json||console.log(on.cyan("\u{1F4E6} \u6B63\u5728\u4E0B\u67B6\u5546\u54C1..."));let r=await se(o);y(t,r,"\u2705 \u4E0B\u67B6\u6210\u529F")})),e}import{Command as rn}from"commander";import nn from"chalk";function ko(){let e=new rn("price");return e.description("\u4FEE\u6539\u95F2\u9C7C\u4E0A\u67B6\u5546\u54C1\u4EF7\u683C"),e.option("--id <id>","\u4E0A\u67B6\u8BB0\u5F55 ID").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--shop-id <id>","\u5E97\u94FA ID").option("--price <amount>","\u65B0\u4EF7\u683C\uFF08\u5FC5\u586B\uFF09").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{if(!t.price){h(t,"--price <amount> \u4E3A\u5FC5\u586B\u53C2\u6570");return}if(!t.id&&!(t.stockGoodsId&&t.shopId)){h(t,"\u8BF7\u6307\u5B9A\u5546\u54C1\uFF1A--id <id> \u6216 --stock-goods-id <id> --shop-id <id>");return}let o={price:Number(t.price)};t.id&&(o.id=t.id),t.stockGoodsId&&(o.stockGoodsId=Number(t.stockGoodsId)),t.shopId&&(o.shopId=t.shopId),t.json||console.log(nn.cyan(`\u{1F4B0} \u6B63\u5728\u4FEE\u6539\u4EF7\u683C\u4E3A ${t.price}...`));let r=await ae(o);y(t,r,"\u2705 \u4EF7\u683C\u4FEE\u6539\u6210\u529F")})),e}import{Command as sn}from"commander";import an from"chalk";function Ro(){let e=new sn("edit");return e.description("\u4FEE\u6539\u5DF2\u4E0A\u67B6\u5546\u54C1\u4FE1\u606F\uFF08\u6807\u9898\u3001\u63CF\u8FF0\u3001\u54C1\u724C\u3001\u7C7B\u76EE\u3001\u56FE\u7247\u3001\u5C5E\u6027\u7B49\uFF09"),e.option("--id <id>","\u5546\u54C1\u4E0A\u67B6 ID\uFF08goodsListingId\uFF0C\u63A8\u8350\uFF09").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID\uFF08\u4E0E --account \u914D\u5408\uFF09").option("--account <shopId>","\u95F2\u9C7C\u7528\u6237\u540D/\u5E97\u94FA ID\uFF08\u4E0E --stock-goods-id \u914D\u5408\uFF09").option("--title <title>","\u5546\u54C1\u6807\u9898").option("--desc <desc>","\u5546\u54C1\u63CF\u8FF0").requiredOption("--category-id <id>","\u5546\u54C1\u7C7B\u76EE ID\uFF08\u5927\u5206\u7C7B\uFF0C\u540E\u7AEF\u5FC5\u586B\uFF09").requiredOption("--channel-cat-id <id>","\u6E20\u9053\u7C7B\u76EE ID\uFF08\u5C0F\u5206\u7C7B\uFF0C\u540E\u7AEF\u5FC5\u586B\uFF09").option("--image-ids <ids>","\u56FE\u7247 ID \u5217\u8868\uFF08\u9017\u53F7\u5206\u9694\uFF09").option("--item-attrs <json>","\u5546\u54C1\u5C5E\u6027\u5217\u8868\uFF08JSON \u5B57\u7B26\u4E32\uFF09").option("--brand-name <name>","\u54C1\u724C\u540D\u79F0").option("--stuff-status <status>","\u6210\u8272\u7B49\u7EA7\uFF1A100=\u5168\u65B0 -1=\u51C6\u65B0 99=99\u65B0 95=95\u65B0 90=9\u65B0").option("--goods-no <no>","\u8D27\u53F7").option("--original-price <price>","\u539F\u4EF7\uFF08\u5355\u4F4D\uFF1A\u5143\uFF09").option("--size <size>","\u5C3A\u7801").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{if(!t.id&&!(t.stockGoodsId&&t.account)){h(t,"\u8BF7\u6307\u5B9A\u5546\u54C1\uFF1A--id <goodsListingId> \u6216 --stock-goods-id <id> --account <shopId>");return}let o={categoryId:Number(t.categoryId),channelCatId:t.channelCatId};if(t.id&&(o.goodsListingId=Number(t.id)),t.stockGoodsId&&(o.stockGoodsId=Number(t.stockGoodsId)),t.account&&(o.account=t.account),t.title){let i=Lt(t.title);if(i){h(t,i);return}o.title=t.title}if(t.desc&&(o.desc=t.desc),t.imageIds&&(o.imageIdList=t.imageIds.split(",").map(i=>i.trim())),t.brandName&&(o.brandName=t.brandName),t.stuffStatus&&(o.stuffStatus=Number(t.stuffStatus)),t.goodsNo&&(o.goodsNo=t.goodsNo),t.originalPrice&&(o.originalPrice=Number(t.originalPrice)),t.size&&(o.size=t.size),t.itemAttrs)try{o.itemAttrList=JSON.parse(t.itemAttrs)}catch{h(t,"--item-attrs JSON \u89E3\u6790\u5931\u8D25");return}if(!Object.keys(o).some(i=>!["goodsListingId","stockGoodsId","account"].includes(i))){h(t,"\u672A\u6307\u5B9A\u9700\u8981\u4FEE\u6539\u7684\u5B57\u6BB5");return}t.json||console.log(an.cyan("\u6B63\u5728\u4FEE\u6539\u5546\u54C1\u4FE1\u606F..."));let n=await ce(o);y(t,n,"\u2705 \u5546\u54C1\u4FE1\u606F\u4FEE\u6539\u6210\u529F")})),e}import{Command as fn}from"commander";import{Command as cn}from"commander";import Ue from"chalk";function Lo(){return new cn("categories").description("\u83B7\u53D6\u95F2\u9C7C\u7C7B\u76EE\u5217\u8868\uFF08\u5927\u5206\u7C7B \u2192 \u5C0F\u5206\u7C7B\uFF09").option("--sp-biz-type <n>","\u4E1A\u52A1\u5206\u7C7B\uFF0C16=\u5962\u54C1","16").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async e=>{let t=await ge(Number(e.spBizType));if(e.json){console.log(JSON.stringify(t,null,2));return}let o=new Map;for(let r of t){let n=String(r.catId);o.has(n)||o.set(n,{catName:r.catName,children:[]}),o.get(n).children.push({channel:r.channel,channelCatId:r.channelCatId})}for(let[r,n]of o){console.log(Ue.bold(`${n.catName} (catId: ${Ue.green(r)})`));for(let i of n.children)console.log(` ${i.channel} (channelCatId: ${Ue.green(i.channelCatId)})`)}}))}import{Command as ln}from"commander";import No from"chalk";function Oo(){return new ln("props").description("\u83B7\u53D6\u6307\u5B9A\u7C7B\u76EE\u4E0B\u7684\u5C5E\u6027\u5217\u8868\uFF08\u542B\u53EF\u9009\u503C\uFF09").requiredOption("--channel-cat-id <id>","\u5C0F\u5206\u7C7B ID\uFF08\u4ECE categories \u83B7\u53D6\uFF09").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async e=>{let t=await fe(e.channelCatId);if(e.json){console.log(JSON.stringify(t,null,2));return}for(let o of t)if(console.log(No.bold(`
|
|
41
|
+
${o.propName} (propId: ${o.propId})`)),o.propsValues?.length)for(let r of o.propsValues)console.log(` ${r.valueName} (valueId: ${r.valueId})`);else console.log(No.gray(" \uFF08\u4F7F\u7528 brands \u5B50\u547D\u4EE4\u641C\u7D22\uFF09"))}))}import{Command as dn}from"commander";import mn from"chalk";function Uo(){return new dn("brands").description("\u641C\u7D22\u95F2\u9C7C\u54C1\u724C\uFF08\u6309\u5173\u952E\u5B57\u8FC7\u6EE4\uFF09").requiredOption("--channel-cat-id <id>","\u5C0F\u5206\u7C7B ID").requiredOption("--prop-id <id>","\u5C5E\u6027 ID\uFF08\u54C1\u724C\u5C5E\u6027\u7684 propId\uFF09").requiredOption("--key <keyword>","\u641C\u7D22\u5173\u952E\u5B57").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async e=>{let t=await he(e.channelCatId,e.propId,e.key);if(e.json){console.log(JSON.stringify(t,null,2));return}if(!t.length){console.log(mn.yellow("\u672A\u627E\u5230\u5339\u914D\u7684\u54C1\u724C"));return}for(let o of t)console.log(` ${o.valueName} (valueId: ${o.valueId})`)}))}import{Command as un}from"commander";import Ee from"chalk";function Eo(){return new un("upload-images").description("\u6279\u91CF\u4E0A\u4F20\u56FE\u7247\u5230\u95F2\u9C7C\uFF08\u6302\u552E\u524D\u5FC5\u987B\u5148\u4E0A\u4F20\u56FE\u7247\uFF09").requiredOption("--shop-id <id>","\u5E97\u94FA ID").requiredOption("--files <paths>","\u56FE\u7247\u6587\u4EF6\u8DEF\u5F84\uFF0C\u9017\u53F7\u5206\u9694").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async e=>{let t=e.files.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0){h(e,"\u8BF7\u63D0\u4F9B\u81F3\u5C11\u4E00\u5F20\u56FE\u7247");return}e.json||console.log(Ee.cyan(`\u6B63\u5728\u4E0A\u4F20 ${t.length} \u5F20\u56FE\u7247...`));let{images:o,failed:r}=await ue(e.shopId,t);if(e.json){let n={success:!0,images:o};r.length&&(n.warning=`${r.length} \u5F20\u56FE\u7247\u4E0A\u4F20\u5931\u8D25`,n.failed=r),console.log(JSON.stringify(n,null,2))}else{if(o.length){console.log(Ee.green(`\u4E0A\u4F20\u6210\u529F\uFF0C\u5171 ${o.length} \u5F20`));for(let n of o)console.log(` \u56FE\u7247ID: ${n.value}`)}if(r.length){console.log(Ee.yellow(`
|
|
42
|
+
${r.length} \u5F20\u4E0A\u4F20\u5931\u8D25:`));for(let n of r)console.log(` ${n.file}: ${n.error}`)}}}))}import{Command as pn}from"commander";import nt from"chalk";var gn={100:"\u5168\u65B0",[-1]:"\u51C6\u65B0",99:"99\u65B0",95:"95\u65B0",90:"9\u65B0"};function jo(){return new pn("submit").description("\u63D0\u4EA4\u6302\u552E\u4E0A\u67B6").requiredOption("--shop-id <id>","\u5E97\u94FA ID\uFF08\u5373\u95F2\u9C7C\u7528\u6237\u540D account\uFF09").requiredOption("--title <title>","\u5546\u54C1\u6807\u9898").requiredOption("--price <amount>","\u552E\u4EF7").requiredOption("--category-id <id>","\u5927\u5206\u7C7B ID\uFF08\u4ECE categories \u83B7\u53D6\uFF09").requiredOption("--channel-cat-id <id>","\u5C0F\u5206\u7C7B ID\uFF08\u4ECE categories \u83B7\u53D6\uFF09").requiredOption("--image-ids <ids>","\u56FE\u7247 ID \u5217\u8868\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u5148\u901A\u8FC7 upload-images \u83B7\u53D6\uFF09").requiredOption("--stuff-status <n>","\u6210\u8272\uFF1A100 \u5168\u65B0 / -1 \u51C6\u65B0 / 99 99\u65B0 / 95 95\u65B0 / 90 9\u65B0").option("--item-attrs <json>",'\u5546\u54C1\u5C5E\u6027\u5217\u8868 JSON\uFF0C\u683C\u5F0F: [{"valueName":"x","valueId":"y","propId":"z"}]').option("--brand-name <name>","\u54C1\u724C\u540D\u79F0").requiredOption("--desc <desc>","\u5546\u54C1\u63CF\u8FF0").option("--size <size>","\u5C3A\u7801").option("--goods-no <no>","\u8D27\u53F7").option("--original-price <amount>","\u539F\u4EF7").option("--trade-type <n>","\u4EA4\u6613\u65B9\u5F0F\uFF1A0 \u4EC5\u5728\u7EBF / 1 \u4EC5\u7EBF\u4E0B / 2 \u7EBF\u4E0A\u6216\u7EBF\u4E0B","0").option("--transport-fee <amount>","\u8FD0\u8D39\uFF08\u9ED8\u8BA4 0 \u5305\u90AE\uFF09","0").option("--yhb","\u662F\u5426\u5F00\u542F\u9A8C\u8D27\u5B9D").requiredOption("--out-item-no <no>","\u5546\u5BB6\u7F16\u7801\uFF08\u540C\u5E97\u94FA\u552F\u4E00\uFF0C\u7528\u6237\u81EA\u5B9A\u4E49\uFF09").option("--division-id <id>","\u884C\u653F\u533A\u5212 ID\uFF08\u5E02\u7EA7 ID\uFF0C\u9ED8\u8BA4\u676D\u5DDE 330100\uFF09","330100").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async e=>{let t=Lt(e.title);if(t){h(e,t);return}let o=Number(e.price),r=Nt(o);if(r){h(e,r);return}let n=e.imageIds.split(",").map(d=>d.trim()),i=e.itemAttrs?JSON.parse(e.itemAttrs):void 0,s={account:e.shopId,title:e.title,reservePrice:Number(e.price),categoryId:Number(e.categoryId),channelCatId:e.channelCatId,imageIdList:n,stuffStatus:Number(e.stuffStatus),itemBizType:2,spBizType:"16",tradeType:Number(e.tradeType)||0,transportFee:Number(e.transportFee)||0,yhb:e.yhb??!1,...e.brandName&&{brandName:e.brandName},desc:e.desc,...e.size&&{size:e.size},...e.goodsNo&&{goodsNo:e.goodsNo},...e.originalPrice&&{originalPrice:Number(e.originalPrice)},...i?.length&&{itemAttrList:i},outItemNo:e.outItemNo,divisionId:Number(e.divisionId)||330100,apiAfterSalesDo:{supportFd10msPolicy:!1,supportFd24hsPolicy:!1,supportNfrPolicy:!1,supportSdrPolicy:!1,supportVnrPolicy:!1,supportGpaPolicy:!1,supportFd48hsPolicy:!1}};e.json||(console.log(nt.cyan("\u6B63\u5728\u63D0\u4EA4\u6302\u552E...")),console.log(nt.gray(` \u6807\u9898: ${s.title}`)),console.log(nt.gray(` \u552E\u4EF7: \xA5${s.reservePrice}`)),console.log(nt.gray(` \u6210\u8272: ${gn[s.stuffStatus]??s.stuffStatus}`)),console.log(nt.gray(` \u56FE\u7247: ${n.length} \u5F20`)),i?.length&&console.log(nt.gray(` \u5C5E\u6027: ${i.length} \u9879`)));let a=await de(s);y(e,a,"\u6302\u552E\u63D0\u4EA4\u6210\u529F")}))}function Do(){let e=new fn("hang-up");return e.description("\u95F2\u9C7C\u6302\u552E\u4E0A\u67B6\uFF08\u5B8C\u6574\u5546\u54C1\u4FE1\u606F\u6A21\u5F0F\uFF09"),e.addCommand(Lo()),e.addCommand(Oo()),e.addCommand(Uo()),e.addCommand(Eo()),e.addCommand(jo()),e}function $o(){let e=new hn("goods");return e.description("\u5546\u54C1\u7BA1\u7406"),e.addCommand(xo()),e.addCommand(To()),e.addCommand(bo()),e.addCommand(Ao()),e.addCommand(vo()),e.addCommand(ko()),e.addCommand(Ro()),e.addCommand(uo()),e.addCommand(Do()),e}import{Command as yn}from"commander";import yt from"chalk";import{promises as wn}from"node:fs";import xn from"node:path";import In from"node:os";import{spawn as Sn}from"node:child_process";var Bo="@round2ai/r2-cli";function Cn(){return new Promise(e=>{let t=Sn("npm",["uninstall","-g",Bo],{stdio:"inherit",shell:!0});t.on("exit",o=>e(o??1)),t.on("error",()=>e(1))})}function qo(){let e=new yn("uninstall");return e.description("\u5378\u8F7D R2-CLI \u5E76\u6E05\u9664\u6240\u6709\u914D\u7F6E").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{let o=xn.join(In.homedir(),".r2-cli"),r=!0;try{await wn.rm(o,{recursive:!0,force:!0})}catch{r=!1}let n=await Cn(),i=n===0;if(t.json){y(t,{configCleared:r,npmUninstalled:i,exitCode:n});return}console.log(r?yt.green("\u2705 \u914D\u7F6E\u6587\u4EF6\u5DF2\u6E05\u9664"):yt.yellow("\u26A0\uFE0F \u914D\u7F6E\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u65E0\u6CD5\u5220\u9664\uFF08\u53EF\u5FFD\u7565\uFF09")),i?console.log(yt.green(`\u2705 ${Bo} \u5DF2\u5378\u8F7D`)):(console.log(yt.yellow(`\u26A0\uFE0F npm \u5378\u8F7D\u5931\u8D25 (exit code: ${n})`)),console.log(yt.gray(" \u5982\u901A\u8FC7 yarn/pnpm \u5B89\u88C5\uFF0C\u8BF7\u624B\u52A8\u5378\u8F7D")))})),e}import{Command as kn}from"commander";import Go from"chalk";import{spawn as Rn,execSync as Ln}from"node:child_process";import{readFileSync as Tn}from"node:fs";import{dirname as bn,join as Pn}from"node:path";import{fileURLToPath as An}from"node:url";var vn=bn(An(import.meta.url));function Bt(){for(let e of["../package.json","../../package.json"])try{return JSON.parse(Tn(Pn(vn,e),"utf-8")).version}catch{}return"0.0.0"}var _o="@round2ai/r2-cli";function Nn(e,t){return new Promise(o=>{let r=Rn(e,t,{stdio:"inherit"});r.on("close",n=>o(n??1)),r.on("error",()=>o(1))})}function Xo(){return new kn("update").description("\u4E00\u952E\u66F4\u65B0 CLI \u548C\u6280\u80FD").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async e=>{let t=Bt();if(e.json||(console.log(Go.cyan(`\u5F53\u524D\u7248\u672C: ${t}`)),console.log(Go.cyan("\u6B63\u5728\u66F4\u65B0 CLI..."))),await Nn("npm",["install","-g",`${_o}@latest`])!==0)throw new Error(`\u66F4\u65B0\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u8FD0\u884C: npm install -g ${_o}@latest`);let r=t;try{r=Ln("r2-cli --version",{encoding:"utf-8"}).trim()||t}catch{}y(e,{oldVersion:t,newVersion:r},`
|
|
43
|
+
\u2713 \u66F4\u65B0\u5B8C\u6210: ${t} \u2192 ${r}
|
|
44
|
+
\u2713 \u6280\u80FD\u5DF2\u540C\u6B65\u66F4\u65B0`)}))}function Jo(e){let t=e.command("auth").description("\u6388\u6743\u7BA1\u7406");t.addCommand(ee()),t.addCommand(oe()),t.addCommand(re()),t.addCommand(ne()),e.addCommand($o()),e.addCommand(qo()),e.addCommand(Xo())}async function Un(){let{default:e}=await import("figlet");console.log(it.cyan.bold(e.textSync("R2-CLI",{font:"Standard",horizontalLayout:"full"}))),console.log(it.gray(` \u5411 AI \u5F00\u653E\u4E8C\u624B\u6F6E\u5962\u4EA4\u6613\u5168\u94FE\u8DEF\u80FD\u529B
|
|
45
|
+
`))}function En(){let e=new On;e.name("r2-cli").description("R2-CLI\uFF0C\u5411 AI \u5F00\u653E\u4E8C\u624B\u6F6E\u5962\u4EA4\u6613\u5168\u94FE\u8DEF\u80FD\u529B");let t=Bt();t==="0.0.0"&&console.error(it.yellow("Warning: unable to read version from package.json")),e.version(`r2-cli version ${t}`,"-v, --version");let o=ro(t);return e.configureOutput({writeErr:r=>{console.error(it.red(r.replace("error:","").trim()))}}),e.action(async()=>{await Un(),e.help()}),Jo(e),{program:e,updateCheckPromise:o}}function Mo(){console.log(it.gray(`
|
|
46
|
+
\u64CD\u4F5C\u5DF2\u53D6\u6D88`)),process.exit(130)}process.on("SIGINT",Mo);process.on("SIGTERM",Mo);var{program:jn,updateCheckPromise:Dn}=En();jn.parse(process.argv);Dn.catch(e=>{console.error(it.gray(`[update-check] ${e instanceof Error?e.message:String(e)}`))});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@round2ai/r2-cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.16",
|
|
4
4
|
"description": "R2-CLI,向 AI 开放二手潮奢交易全链路能力",
|
|
5
5
|
"main": "dist/r2-cli.js",
|
|
6
6
|
"type": "module",
|
|
@@ -34,6 +34,9 @@
|
|
|
34
34
|
],
|
|
35
35
|
"author": "Round2AI - PURESNAKE Team",
|
|
36
36
|
"license": "MIT",
|
|
37
|
+
"publishConfig": {
|
|
38
|
+
"access": "public"
|
|
39
|
+
},
|
|
37
40
|
"engines": {
|
|
38
41
|
"node": ">=18.0.0"
|
|
39
42
|
},
|
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
|
|