@optima-chat/browser-cli 0.5.7 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -17,6 +17,11 @@ var ENV_CONFIG = {
17
17
  },
18
18
  development: {
19
19
  apiUrl: "http://127.0.0.1:7292"
20
+ },
21
+ // 阿里云 cn-prod(yzsgo 品牌域;权威映射见 optima-terraform
22
+ // alicloud/stacks/cn-prod-ingress-sae/main.tf 的 yzsgo_sub=browser-api)。
23
+ "cn-prod": {
24
+ apiUrl: "https://browser-api.yzsgo.com"
20
25
  }
21
26
  };
22
27
  var OPTIMA_TOKEN_FILE = join(homedir(), ".optima", "token.json");
@@ -30,6 +35,8 @@ function tokenEnvToBrowserEnv(tokenEnv) {
30
35
  case "ci":
31
36
  case "development":
32
37
  return "development";
38
+ case "cn-prod":
39
+ return "cn-prod";
33
40
  default:
34
41
  return null;
35
42
  }
@@ -44,23 +51,27 @@ function readOptimaToken() {
44
51
  }
45
52
  function getCurrentEnv() {
46
53
  const browserEnv = process.env.BROWSER_ENV;
47
- if (browserEnv && ["production", "stage", "development"].includes(browserEnv)) {
54
+ if (browserEnv && ["production", "stage", "development", "cn-prod"].includes(browserEnv)) {
48
55
  return browserEnv;
49
56
  }
50
57
  const optimaEnv = process.env.OPTIMA_ENV;
51
- if (optimaEnv && ["production", "stage", "development"].includes(optimaEnv)) {
58
+ if (optimaEnv && ["production", "stage", "development", "cn-prod"].includes(optimaEnv)) {
52
59
  return optimaEnv;
53
60
  }
54
61
  const optimaToken = readOptimaToken();
55
62
  if (optimaToken?.env) {
56
63
  const mapped = tokenEnvToBrowserEnv(optimaToken.env);
57
64
  if (mapped) return mapped;
65
+ throw new Error(
66
+ `Unknown environment "${optimaToken.env}" in ~/.optima/token.json. Known environments: prod, stage, ci, cn-prod. Upgrade browser-cli to a version that knows this environment, or set BROWSER_API_URL to override the endpoint explicitly.`
67
+ );
58
68
  }
59
69
  return "development";
60
70
  }
61
71
  function loadConfig() {
62
- const env = getCurrentEnv();
63
- const envConfig = ENV_CONFIG[env];
72
+ const apiUrlOverride = process.env.BROWSER_API_URL;
73
+ const env = apiUrlOverride ? void 0 : getCurrentEnv();
74
+ const apiUrl = apiUrlOverride ?? ENV_CONFIG[env].apiUrl;
64
75
  let token = process.env.BROWSER_TOKEN || null;
65
76
  if (!token) {
66
77
  const optimaToken = readOptimaToken();
@@ -69,7 +80,7 @@ function loadConfig() {
69
80
  }
70
81
  }
71
82
  return {
72
- apiUrl: process.env.BROWSER_API_URL || envConfig.apiUrl,
83
+ apiUrl,
73
84
  token,
74
85
  env
75
86
  };
package/package.json CHANGED
@@ -1,14 +1,13 @@
1
1
  {
2
2
  "name": "@optima-chat/browser-cli",
3
- "version": "0.5.7",
3
+ "version": "0.6.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "bin": {
7
7
  "browser-cli": "./dist/index.js"
8
8
  },
9
9
  "files": [
10
- "dist",
11
- ".claude"
10
+ "dist"
12
11
  ],
13
12
  "scripts": {
14
13
  "build": "tsup",
@@ -1,242 +0,0 @@
1
- ---
2
- name: browser
3
- description: "Browser automation — controls real browsers (Chrome, ZiNiao/紫鸟) via browser-cli. MUST USE when user mentions: 紫鸟, ZiNiao, 反指纹浏览器, 店铺浏览器, TikTok Shop 后台操作, 多店铺管理, or needs to operate any logged-in platform. Also use for opening websites, filling forms, posting content, testing websites. Do NOT use for simple web scraping (use WebFetch)."
4
- version: "1.1.0"
5
- owner_repo: Optima-Chat/optima-browser-use
6
- ---
7
-
8
- # 浏览器自动化 Skill
9
-
10
- **重要:本 Skill 可以直接控制紫鸟浏览器和 Chrome。当用户提到紫鸟、店铺、TikTok Shop 后台时,按下方"紫鸟浏览器"章节操作。**
11
-
12
- ## 使用场景
13
-
14
- - 用户提到紫鸟浏览器、ZiNiao、反指纹浏览器、多店铺管理
15
- - 用户要求操作 TikTok Shop 卖家后台、领星 ERP 等需要登录态的平台
16
- - 用户要求打开网站或访问某个 URL
17
- - 用户要求登录平台、填写表单或发布内容
18
- - 用户需要操作没有 API 的第三方平台
19
-
20
- **不适用场景:**
21
- - 简单网页抓取 → 使用 WebFetch
22
-
23
- ## 脚本优先原则
24
-
25
- 每次执行浏览器任务前,**先检查是否有现成脚本**:
26
-
27
- 1. `browser-cli scripts` — 查看已有脚本(显示名称、描述、步骤)
28
- 2. 如果有匹配的脚本 → 直接用 `browser-cli runscript <name> --param ...`
29
- 3. 如果没有 → 手动用 browser-cli 命令完成任务
30
-
31
- 脚本执行零 token 消耗,比手动操作快 10 倍以上。
32
-
33
- ## 前提条件:Desktop 桌面应用
34
-
35
- **Browser Skill 需要用户安装 Optima Browser Operator 桌面应用。** 所有浏览器操作都通过 Desktop app 控制用户本地的 Chrome 或紫鸟浏览器。
36
-
37
- 如果 `browser-cli launch` 返回 `desktop_not_connected` 错误,提示用户:
38
-
39
- > "需要安装 Optima Browser Operator 桌面应用才能使用浏览器功能。下载地址: https://github.com/Optima-Chat/optima-browser-use/releases"
40
-
41
- ### 紫鸟浏览器(跨境电商多店铺管理)
42
-
43
- 当用户提到紫鸟、多店铺、反指纹浏览器、TikTok Shop 店铺、或需要操作特定店铺时,按以下步骤操作:
44
-
45
- ```bash
46
- # 1. 检查紫鸟凭证是否已配置
47
- browser-cli ziniao show
48
-
49
- # 2. 如果未配置,设置凭证(需要用户提供)
50
- browser-cli ziniao set --company "公司名" --username "用户名" --password "密码"
51
-
52
- # 3. 查看可用的紫鸟店铺列表(需要 Desktop app 在线)
53
- browser-cli ziniao profiles
54
- # 输出示例:
55
- # 27774259938707 迪士尼授权林总店铺
56
- # 27772540507986 Gigilli-US
57
- # 27732948017158 马来本土店3SAVEZO
58
-
59
- # 4. 用店铺 profile 启动浏览器(根据用户描述匹配店铺名)
60
- browser-cli launch --connector ziniao --ziniao-profile 27774259938707 --url https://seller.tiktokshopglobalselling.com/homepage --force
61
- ```
62
-
63
- **重要**:
64
- - 用户说"迪士尼店铺"、"林总店铺"等 → 先 `ziniao profiles` 查列表,按名称模糊匹配找到 profile_id
65
- - 用户说"打开紫鸟"但没指定店铺 → 先列出 profiles 让用户选
66
- - 紫鸟需要 Desktop app 在线(紫鸟 WebDriver 会按需自动启动)
67
-
68
- ## 命令
69
-
70
- ### 会话管理
71
-
72
- ```bash
73
- browser-cli launch [--url <url>] [--force] # 启动浏览器(自动选择模式)
74
- browser-cli launch --connector ziniao --ziniao-profile <id> [--url <url>] # 指定紫鸟店铺
75
- browser-cli launch --connector chrome [--url <url>] # 指定 Chrome
76
- browser-cli close # 关闭浏览器并释放资源
77
- browser-cli status # 查看当前会话状态
78
- ```
79
-
80
- ### 导航
81
-
82
- ```bash
83
- browser-cli navigate <url> # 跳转到 URL
84
- browser-cli back # 后退
85
- browser-cli refresh # 刷新页面
86
- ```
87
-
88
- ### 交互
89
-
90
- ```bash
91
- browser-cli click <index> # 按索引点击元素
92
- browser-cli input <index> <text> [--no-clear] # 输入文本(--no-clear 追加而非替换)
93
- browser-cli select <index> <option> # 选择下拉选项
94
- browser-cli scroll <up|down> [--pages <n>] # 滚动页面(默认 1 页)
95
- browser-cli keys <key> # 键盘操作(Enter、Tab 等)
96
- browser-cli upload <index> <file...> # 上传文件到 file input(路径自动转换)
97
- ```
98
-
99
- ### 页面检查
100
-
101
- ```bash
102
- browser-cli dom # 获取当前 DOM 状态
103
- browser-cli screenshot [file] # 截图(默认:/tmp/screenshot.png)
104
- browser-cli search <pattern> # 搜索页面文本
105
- browser-cli find <css_selector> # 通过 CSS 选择器查询
106
- ```
107
-
108
- ### 标签页管理
109
-
110
- ```bash
111
- browser-cli tabs # 列出所有标签页
112
- browser-cli switch <tab_id> # 切换标签页
113
- browser-cli close-tab <tab_id> # 关闭标签页
114
- ```
115
-
116
- ### 脚本
117
-
118
- ```bash
119
- browser-cli scripts # 列出所有脚本(含描述和步骤)
120
- browser-cli script-code <name> # 查看脚本源码
121
- browser-cli runscript <name> --param key=value [...] # 执行脚本(自动轮询到完成)
122
- browser-cli runscript <name> --param key=value --no-poll # 执行但不等待
123
- browser-cli script-task <task-id> # 查询执行状态
124
- browser-cli submit-script --name <name> --code-file <path> # 提交新脚本(新建或覆盖)
125
- browser-cli delete-script <name> # 删除脚本
126
- ```
127
-
128
- ### Profile 管理
129
-
130
- ```bash
131
- browser-cli profiles # 列出浏览器 profile
132
- browser-cli delete-profile <id> # 删除 profile
133
- browser-cli launch --profile <id> # 用指定 profile 启动
134
- browser-cli runscript <name> --profile <id> --param ... # 用指定 profile 执行脚本
135
- ```
136
-
137
- ## DOM 索引格式
138
-
139
- 每个操作都会返回当前 DOM 状态,格式如下:
140
-
141
- ```
142
- [N]<tag attributes />
143
- content
144
- ```
145
-
146
- - 索引号 (N) **不连续**(如 [7]、[20]、[30])— 这是正常的
147
- - 每次操作后索引会**重新分配** — 务必使用最新的索引
148
- - 使用这些索引来执行 `click`、`input` 和 `select` 命令
149
-
150
- ## 操作流程
151
-
152
- ### 流程一:有脚本(常见)
153
-
154
- ```bash
155
- # 1. 检查脚本
156
- browser-cli scripts
157
-
158
- # 2. 直接执行
159
- browser-cli runscript xiaohongshu-image-note \
160
- --param title="今日分享" \
161
- --param body="内容..." \
162
- --param 'images=["~/images/photo1.jpg", "~/images/photo2.jpg"]'
163
- # 输出: ✓ Script completed
164
-
165
- # 小红书评论
166
- browser-cli runscript xiaohongshu-comment \
167
- --param search_keyword="辞职做跨境电商" \
168
- --param comment="写得好!"
169
-
170
- # 小红书数据采集
171
- browser-cli runscript xiaohongshu-data-collect
172
-
173
- # Instagram 发帖
174
- browser-cli runscript instagram-image-post \
175
- --param 'images=["~/images/photo.jpg"]' \
176
- --param body="Morning vibes ☕"
177
- ```
178
-
179
- ### 流程二:无脚本(手动操作)
180
-
181
- ```bash
182
- # 1. 启动浏览器
183
- browser-cli launch --url https://example.com
184
-
185
- # 2. 查看 DOM,找到要操作的元素
186
- browser-cli dom
187
-
188
- # 3. 操作元素(用 DOM 返回的索引)
189
- browser-cli click 15
190
- browser-cli input 22 "内容"
191
- browser-cli keys Enter
192
-
193
- # 4. 完成后关闭
194
- browser-cli close
195
- ```
196
-
197
- ### 流程三:脚本失败(Fallback)
198
-
199
- ```bash
200
- # 1. 执行脚本
201
- browser-cli runscript xiaohongshu-image-note --param ...
202
- # 输出: ⚠ Script needs fallback
203
- # → 显示已完成和剩余步骤
204
-
205
- # 2. Session 仍然打开 — 用手动命令继续完成剩余步骤
206
- browser-cli dom
207
- browser-cli click 15
208
- browser-cli input 22 "内容"
209
-
210
- # 3. 完成后关闭
211
- browser-cli close
212
- ```
213
-
214
- ## 文件路径
215
-
216
- 浏览器后端可以直接读取用户工作空间的文件。传文件路径时直接使用你看到的路径即可,后端会自动转换:
217
-
218
- ```
219
- ~/images/photo.jpg → 自动转换 ✓
220
- /home/aiuser/images/photo.jpg → 自动转换 ✓
221
- /mnt/efs/{userId}/images/... → 自动转换 ✓
222
- ```
223
-
224
- ## Desktop 桌面应用未连接时
225
-
226
- 如果 `browser-cli launch` 返回错误,提示用户安装 Desktop app:
227
-
228
- 1. 下载安装(Mac .dmg / Windows .exe):https://github.com/Optima-Chat/optima-browser-use/releases
229
- 2. 首次启动自动打开浏览器登录授权
230
- 3. 授权后自动连接
231
-
232
- **跨境电商用户(多店铺)**:推荐安装紫鸟浏览器 + Desktop app,可以按店铺 profile 分别操作,每个店铺独立登录态。
233
-
234
- ## 注意事项
235
-
236
- - **脚本优先**:每次操作前先 `browser-cli scripts`,有脚本就用脚本
237
- - **DOM 自动返回**:每个操作会自动返回 DOM 状态 — 无需单独调用 `browser-cli dom`
238
- - **避免不必要的截图**:截图消耗 token,日常导航用 DOM 输出即可
239
- - **5 分钟超时**:无操作 5 分钟后会话自动关闭
240
- - **务必关闭**:操作完成后运行 `browser-cli close` 释放资源
241
- - **login_required 处理**:如果 runscript 返回 `login_required` 错误,说明该平台未登录。让用户在自己的浏览器里手动登录该平台,然后重新 `runscript`
242
- - **Fallback 后更新脚本**:如果脚本频繁失败,重新生成并 submit-script 覆盖