sino-bc-cli 1.8.2 → 1.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,624 +1,588 @@
1
- # sino-bc-cli
2
-
3
- BeyondClick 命令行工具集合 - 提供快捷访问 BeyondClick 平台的命令行接口。
4
-
5
- ## Install
6
-
7
- > ⚠️ 本包是**全局 CLI 工具**。npm 官网右侧 Install 框里的 `npm i sino-bc-cli` 是网站写死的固定文案,不是本包的推荐用法,请以下面的命令为准(注意 `-g`)。
8
- >
9
- > 运行环境要求 Node.js >= 24.0.0。
10
-
11
- ### ① 安装最新版本(推荐)
12
-
13
- ```bash
14
- # npm
15
- npm i sino-bc-cli@latest -g
16
-
17
- # pnpm
18
- pnpm add -g sino-bc-cli@latest
19
-
20
- # yarn
21
- yarn global add sino-bc-cli@latest
22
- ```
23
-
24
- 已经装过旧版本时,执行同样的命令即可升级覆盖。想先确认远端最新版本号:
25
-
26
- ```bash
27
- npm view sino-bc-cli version # 查看 latest 版本号
28
- npm outdated -g sino-bc-cli # 对比本地全局版本是否过期
29
- ```
30
-
31
- ### ② 安装指定版本
32
-
33
- 把 `@latest` 换成目标版本号即可,适用于需要回退或锁定版本的场景:
34
-
35
- ```bash
36
- # npm
37
- npm i sino-bc-cli@1.0.5 -g
38
-
39
- # pnpm
40
- pnpm add -g sino-bc-cli@1.0.5
41
-
42
- # yarn
43
- yarn global add sino-bc-cli@1.0.5
44
- ```
45
-
46
- 查看全部可安装版本:
47
-
48
- ```bash
49
- npm view sino-bc-cli versions --json
50
- ```
51
-
52
- ### ③ 卸载
53
-
54
- ```bash
55
- # npm
56
- npm uninstall -g sino-bc-cli
57
-
58
- # pnpm
59
- pnpm remove -g sino-bc-cli
60
-
61
- # yarn
62
- yarn global remove sino-bc-cli
63
- ```
64
-
65
- > 如果当初是在源码目录用 `npm link` 做的开发链接,请改用 `npm unlink -g sino-bc-cli` 解除。
66
-
67
- ### ④ 验证安装
68
-
69
- ```bash
70
- sino-bc-cli --version # 输出版本号,说明命令已可用
71
- sino-bc-cli --help # 输出帮助信息和全部可用命令
72
- npm ls -g --depth=0 sino-bc-cli # 确认全局安装的版本
73
- ```
74
-
75
- 若提示「command not found / 无法将 sino-bc-cli 项识别为命令」,说明 npm 全局 bin 目录不在 `PATH` 中。用 `npm prefix -g` 查看全局安装根目录(Windows 下该目录即 bin 目录,macOS / Linux 下为其 `bin` 子目录),把它加入环境变量后重开终端。
76
-
77
- ### ⑤ 初始化(必须执行一次)
78
-
79
- **装完之后必须完成 `/init` 初始化,CLI 的 Agent 技能才会生效。**
80
-
81
- 全局安装时 `postinstall` 会自动执行一次 `/init`。但在以下情况会被跳过,需要手动补执行:使用 `--ignore-scripts` 安装、安装目录权限不足、或通过 `npx` 临时运行。
82
-
83
- ```bash
84
- sino-bc-cli /init
85
- ```
86
-
87
- `/init` 会把 `skills/sino-bc-shared` 与 `skills/sino-bc-biz-line`(含 `references/`)写入用户主目录的 Agent 技能目录(`~/.agents/skills/sino-bc-shared` 等),并删除旧的 `sino-bc-cli/` 技能目录。根 `SKILL.md` 只做入口,不作为唯一安装源。Cursor / Claude / Codex / 飞书豆包工作 才能识别到本技能。飞书豆包工作侧还需:技能·连接器 → 管理 → **本地** → 刷新。查看包内技能:`sino-bc-cli /skill`。
88
-
89
- > 每次升级版本后请重新执行一次 `sino-bc-cli /init`,以刷新本地技能文件。
90
-
91
- ### ⑥ 免安装临时执行
92
-
93
- ```bash
94
- npx sino-bc-cli --help
95
- ```
96
-
97
- 注意 `npx` 方式不会持久注册 Agent 技能,需要技能能力时仍请走全局安装 + `/init`。
98
-
99
- ---
100
-
101
- ## 📚 技术栈说明
102
-
103
- | 技术/依赖 | 版本要求 | 用途说明 |
104
- | :------------- | :----------- | :------------------------------------------------------ |
105
- | **Node.js** | `>= v24.0.0` | CLI 运行时环境,要求使用 v24 及以上版本 |
106
- | **TypeScript** | `^v5.5.0` | 开发语言,提供静态类型检查和更好的可维护性 |
107
- | **lodash** | `^4.17.21` | 工具函数库,提供对象/数组/字符串处理等高效方法 |
108
- | **dayjs** | `^1.11.11` | 轻量级日期处理库,替代 Moment.js 处理日期时间格式化 |
109
- | **axios** | `^1.7.0` | HTTP 客户端库,用于网络请求、连通性检测等 |
110
- | **crypto-js** | `^4.2.0` | 加密算法库,提供 MD5、SHA-256、AES、Base64 等加解密能力 |
111
- | **commander** | `^12.1.0` | 命令行参数解析框架(预留,当前采用自研注册器模式) |
112
- | **chalk** | `^4.1.2` | 终端彩色输出库,用于美化日志和帮助信息 |
113
- | **open** | `^8.4.2` | 跨平台文件/URL 打开工具(兼容备用方案) |
114
-
115
- ### 开发依赖
116
-
117
- | 依赖 | 版本 | 用途 |
118
- | :----------------- | :-------- | :-------------------------------- |
119
- | `@types/node` | `^22.0.0` | Node.js 类型声明 |
120
- | `@types/lodash` | `^4.17.5` | lodash 类型声明 |
121
- | `@types/crypto-js` | `^4.2.2` | crypto-js 类型声明 |
122
- | `ts-node` | `^10.9.2` | 开发阶段直接运行 TypeScript 代码 |
123
- | `rimraf` | `^5.0.7` | 跨平台目录清理工具,替代 `rm -rf` |
124
-
125
- ---
126
-
127
- ## 📁 项目结构说明
128
-
129
- 项目采用 **模块化、低耦合、高内聚** 的分层设计,便于后续扩展和维护。
130
-
131
- ```
132
- sino-bc-cli/
133
- ├── src/ # 源代码目录(TypeScript)
134
- │ ├── index.ts # 🚀 CLI 入口文件,bin 关联点
135
- │ │
136
- │ ├── core/ # 🧠 核心模块层
137
- │ │ ├── index.ts # 核心模块统一导出
138
- │ │ ├── cli-app.ts # CLI 应用主类(参数解析、帮助展示、命令分发)
139
- │ │ ├── route.ts # argv 路由(斜杠命令 / 域 + Shortcut)
140
- │ │ └── command-registry.ts # 命令注册器(注册、查找、执行、注销命令)
141
- │ │
142
- │ ├── commands/ # 📦 命令实现层(每命令一个文件,可独立扩展)
143
- │ │ ├── index.ts # 命令批量注册入口
144
- │ │ ├── init.command.ts # /init 命令实现(注册 Agent 技能 + 初始化变量配置 + 拉取启动 MCP)
145
- │ │ ├── api-list.command.ts # /api-list 命令实现(列出接口、给出调用命令并打开文档)
146
- │ │ ├── bc-api.command.ts # /bc-api 已下线,仅打印迁移提示并非 0 退出
147
- │ │ ├── get-config.command.ts # /get-config 命令实现(查看变量配置与 MCP 配置)
148
- │ │ ├── set-config.command.ts # /set-config 命令实现(修改变量配置)
149
- │ │ ├── mcp-reload.command.ts # /mcp-reload 命令实现(按 mcp.json 重启 MCP)
150
- │ │ ├── skill.command.ts # /skill 命令实现(列出包内技能或打开 SKILL.md)
151
- │ │ └── uninstall.command.ts # /uninstall 命令实现(关闭 MCP、清理技能目录与配置并卸载)
152
- │ │
153
- │ ├── shortcuts/ # ⚡ Shortcut 执行面(业务命令,域 + `+cmd`)
154
- │ │ ├── index.ts # 注册表与执行器(flag 解析、输出格式、写确认门)
155
- │ │ ├── flags.ts # Shortcut 面参数解析(含公共 flag)
156
- │ │ ├── types.ts # Shortcut 声明与执行上下文类型
157
- │ │ └── biz-line/ # biz-line 域
158
- │ │ ├── index.ts # 该域全部 Shortcut 登记处
159
- │ │ ├── read.ts # 只读 Shortcut(+channels/+categories/+list/+strategies/+top)
160
- │ │ ├── write.ts # 写 Shortcut(+save/+update/+status/+delete/+strategy-*)
161
- │ │ ├── raw-api.ts # biz-line api <name> 点名调用
162
- │ │ └── helpers.ts # 按名解析业务线、字典名称映射等编排
163
- │ │
164
- │ ├── utils/ # 🛠 工具类层(高内聚的可复用工具)
165
- │ │ ├── index.ts # 工具模块统一导出
166
- │ │ ├── logger.ts # 日志工具(多级别彩色输出 + 时间戳)
167
- │ │ ├── browser.ts # 浏览器工具(跨平台 URL 打开,兼容 Win/macOS/Linux)
168
- │ │ ├── crypto.ts # 加密工具(MD5、SHA-256、AES、Base64、签名生成)
169
- │ │ ├── http.ts # HTTP 工具(axios 封装:请求/响应拦截、自动重试)
170
- │ │ ├── gateway-client.ts # 网关调用唯一出口(拼地址、注入鉴权与来源头、解包 result)
171
- │ │ ├── presenter.ts # 输出与退出码(table / JSON 信封,stdout / stderr 分流)
172
- │ │ ├── cli-error.ts # 带分类的 CLI 错误(validation / config / api / 待确认)
173
- │ │ ├── common.ts # 通用工具(日期、深拷贝、防抖节流、ID 生成等)
174
- │ │ ├── prompt.ts # 终端交互(复用单一 readline 会话:提问、选择、确认)
175
- │ │ ├── config-store.ts # 变量配置读写(字段元信息 + 读 / 写 / 删)
176
- │ │ ├── config-prompt.ts # 变量配置交互采集(/init 与 /set-config 共用)
177
- │ │ ├── mcp-store.ts # ~/.sino-bc-cli/mcp.json 读写
178
- │ │ ├── mcp-service.ts # MCP 同步到 Cursor / Codex / Claude / VS Code 并握手
179
- │ │ └── skill-install.ts # Agent 技能目录的写入与清理
180
- │ │
181
- │ ├── types/ # 📝 类型定义层
182
- │ │ └── index.ts # 全局接口、枚举定义(ICommand、LogLevel 等)
183
- │ │
184
- │ └── constants/ # 🔧 常量配置层
185
- │ └── index.ts # CLI 配置、命令名称、Shortcut 域、默认值
186
- │
187
- ├── skills/ # Agent 技能树(shared + biz-line,含 references)
188
- ├── affordance/ # 各 Shortcut 的 WHEN / 别用 / 示例
189
- ├── tests/ # ✅ 单元测试(node --test + ts-node)
190
- │ ├── helpers/ # HTTP 执行器桩、输出流桩
191
- │ └── *.test.ts # 路由、flag、网关、输出契约、各类 Shortcut
192
- │
193
- ├── dist/ # 📤 构建输出目录(构建后自动生成)
194
- │ └── ... # 单文件混淆压缩产物 + SKILL.md + skills/ + affordance/ + api-doc(不含 SourceMap)
195
- │
196
- ├── package.json # 📄 项目配置(依赖、脚本、bin 命令)
197
- ├── tsconfig.json # 📄 TypeScript 编译配置
198
- ├── .gitignore # 📄 Git 忽略配置
199
- └── README.md # 📖 项目说明文档
200
- ```
201
-
202
- ### 架构设计原则
203
-
204
- 1. **分层清晰**:`core → commands → utils → types/constants`,上层依赖下层,单向依赖无循环
205
- 2. **低耦合**:命令之间互相独立,通过注册器统一管理;新增命令只需在 `commands/` 下新建文件并加入 `commands/index.ts` 数组
206
- 3. **高内聚**:每个工具类只负责单一职责(如 `BrowserUtils` 只处理浏览器打开,`CryptoUtils` 只处理加解密)
207
- 4. **可扩展**:
208
- - 新增命令:实现 `ICommand` 接口 → 放入 `commands/index.ts` 数组即可自动注册
209
- - 新增工具:在 `utils/` 下新建类,通过 `utils/index.ts` 导出
210
- - 命令注册器支持运行时动态注册/注销命令
211
-
212
- ---
213
-
214
- ## 🚀 项目使用说明
215
-
216
- ### 1. 环境要求
217
-
218
- 确保已安装 **Node.js v24** 或更高版本:
219
-
220
- ```bash
221
- # 查看 Node.js 版本
222
- node -v
223
- # 要求输出 v24.x.x 或更高
224
-
225
- # 查看 npm 版本
226
- npm -v
227
- ```
228
-
229
- > 如果 Node.js 版本不符合要求,建议通过 [nvm (Node Version Manager)](https://github.com/nvm-sh/nvm) 或 [nvm-windows](https://github.com/coreybutler/nvm-windows) 进行安装和版本管理。
230
-
231
- ### 2. 安装依赖
232
-
233
- 在项目根目录下执行:
234
-
235
- ```bash
236
- npm install
237
- ```
238
-
239
- 依赖安装完成后,`node_modules/` 目录将生成。
240
-
241
- ### 3. 编译项目
242
-
243
- 项目使用 TypeScript 编写,需要编译为 JavaScript 后才能运行:
244
-
245
- ```bash
246
- # 编译(生成 dist/ 目录)
247
- npm run build
248
-
249
- # 清理旧的编译产物并重新编译
250
- npm run rebuild
251
- ```
252
-
253
- 编译完成后,`dist/` 目录将包含:
254
-
255
- - `*.js` — 编译后的 JavaScript 代码
256
- - `*.d.ts` — TypeScript 类型声明文件
257
- - `*.js.map` — SourceMap 调试映射文件
258
-
259
- ### 4. 开发模式(免编译运行)
260
-
261
- 开发阶段可使用 `ts-node` 直接运行 TypeScript 代码,无需手动编译:
262
-
263
- ```bash
264
- # 直接运行 TypeScript 源码
265
- npm run dev -- [参数]
266
-
267
- # 示例:查看帮助
268
- npm run dev -- --help
269
-
270
- # 示例:执行业务命令
271
- npm run dev -- biz-line +list --name <业务线名称>
272
- ```
273
-
274
- ### 4.1 运行测试
275
-
276
- 单元测试用 Node 内置 runner(`node --test`)配 `ts-node`,不额外引入测试框架:
277
-
278
- ```bash
279
- # 跑全部用例
280
- npm test
281
-
282
- # 类型检查(tsc --noEmit)
283
- npm run typecheck
284
- ```
285
-
286
- 用例放在 `tests/`,通过注入 HTTP 执行器桩断言请求,不产生真实网络调用。
287
-
288
- ### 5. 全局安装(推荐)
289
-
290
- 将 CLI 工具链接为全局命令,可在任意目录下直接使用 `sino-bc-cli`:
291
-
292
- ```bash
293
- # 方式一:从源码目录全局链接(开发/测试场景)
294
- cd d:\Project\demo\sino-bc-cli
295
- npm run build # 必须先编译
296
- npm link # 全局链接(Windows 下需要管理员权限)
297
-
298
- # 方式二:后续发布到 npm 后
299
- npm i sino-bc-cli -g
300
- ```
301
-
302
- 安装完成后,即可在任意终端直接使用:
303
-
304
- ```bash
305
- sino-bc-cli --help
306
- sino-bc-cli /init
307
- sino-bc-cli /api-list
308
- sino-bc-cli biz-line +list --name <业务线名称>
309
- ```
310
-
311
- `npm i sino-bc-cli -g` 完成后会自动执行 `/init`,把 `sino-bc-shared` 与 `sino-bc-biz-line` 写到用户主目录的 Agent 技能目录(`~/.agents/skills/sino-bc-shared` 等),并清掉旧的 `sino-bc-cli/`。飞书豆包工作:技能·连接器 → 管理 → **本地** → 刷新。若未出现,手动执行:
312
-
313
- ```bash
314
- sino-bc-cli /init
315
- ```
316
-
317
- > 卸载全局链接:`npm unlink` 或 `npm uninstall -g sino-bc-cli`
318
-
319
- ---
320
-
321
- ## 📖 命令说明
322
-
323
- 命令分两类:**生命周期命令**用 `/` 前缀,负责安装与配置;**业务命令**是 Shortcut 执行面,形如 `<域> +<命令>`。
324
-
325
- ### 生命周期命令
326
-
327
- | 命令 | 说明 |
328
- | :---------- | :-------------------------------------------------------------------------------------------- |
329
- | `/init` | 注册 `sino-bc-shared` / `sino-bc-biz-line` 到 Agent 技能目录(并删除旧 `sino-bc-cli/`),交互设置环境 / `API_KEY`,并拉取启动 MCP |
330
- | `/skill` | 列出包内 Agent 技能;传入 name 打开对应 `SKILL.md` |
331
- | `/api-list` | 列出全部可调用接口及其调用命令,Shortcut 行带一句 WHEN;Cursor / VS Code 终端中 Ctrl+单击接口名或文档路径打开本地文档,也可输入序号或传入 name |
332
- | `/get-config` | 查看变量配置与 `mcp.json`;密钥默认打码,`--show-secret` 显示明文,`--json` 输出 JSON |
333
- | `/set-config` | 修改变量配置(环境 / API_KEY);不带参数时逐项交互修改 |
334
- | `/mcp-reload` | 重新读取 `~/.sino-bc-cli/mcp.json`,同步到 Cursor / Codex / Claude / VS Code 并重新握手 |
335
- | `/uninstall` | 关闭本 CLI 写入的 MCP,删除技能目录与变量配置文件,并从全局 npm 卸载本 CLI |
336
- | `/bc-api` | **已下线**。只打印迁移提示并非 0 退出,改用 `biz-line +<shortcut>` 或 `biz-line api <name>` |
337
-
338
- ### 业务命令(`biz-line`)
339
-
340
- | 命令 | 说明 |
341
- | :--- | :--- |
342
- | `biz-line +channels` | 查询投放渠道列表(`code` 即业务线里的 `mediaChannelId`) |
343
- | `biz-line +categories` | 查询投放行业与品类字典树 |
344
- | `biz-line +list` | 查询业务线;`--name` / `--id` / `--channel` / `--industry` / `--category`,不传即查全部 |
345
- | `biz-line +strategies` | 查周策略与表现;`--name` 会先解析业务线 ID,也可直接 `--id` |
346
- | `biz-line +top` | 行业 / 品类 Top 业务线;两者至少传一个,同时传则只按行业 |
347
- | `biz-line +save` / `+update` / `+status` / `+delete` | ⚠️ 业务线写操作 |
348
- | `biz-line +strategy-save` / `+strategy-update` / `+strategy-delete` | ⚠️ 周策略写操作 |
349
- | `biz-line api <name> --data '<json>'` | 按接口 `name` 点名调用,覆盖导出、对比、消耗等长尾接口 |
350
-
351
- `--channel` / `--industry` / `--category` 同时接受数字 ID 与名称(如 `--channel TikTok`);传名称时会先查字典再映射,映射不到会报错并列出可选值。
352
-
353
- ### Shortcut 面公共参数
354
-
355
- | 参数 | 说明 |
356
- | :--- | :--- |
357
- | `--format json\|table` | 输出格式。TTY 默认 `table`,非 TTY 默认 `json` |
358
- | `--dry-run` | 只打印将要发起的 method / URL / 请求体,不发请求 |
359
- | `--yes` | 跳过写操作确认,直接发起请求 |
360
-
361
- ### 输出契约与退出码
362
-
363
- 非 TTY(管道 / CI / Agent)默认输出 JSON 信封。成功走 stdout,失败走 stderr:
364
-
365
- ```json
366
- { "ok": true, "env": "prod", "command": "biz-line +list", "data": [], "meta": { "count": 0 } }
367
- { "ok": false, "env": "prod", "command": "biz-line +delete", "error": { "type": "confirmation_required", "message": "...", "hint": "..." } }
368
- ```
369
-
370
- `data` 只包含上游 `result`。**判断成功请看 `ok` 或进程退出码,不要看上游 `code`。**
371
-
372
- | 退出码 | 含义 |
373
- | :----- | :--- |
374
- | `0` | 成功 |
375
- | `10` | 写操作待确认,**不是错误**;向用户确认后在原命令末尾追加 `--yes` 重试 |
376
- | 其他非 0 | 失败,详见 `error.type`(`validation` / `config` / `api`) |
377
-
378
- ### 变量配置文件
379
-
380
- 环境、`API_KEY` 存放在 `<用户主目录>/.sino-bc-cli/config.json`。`X-GATEWAY-TYPE` 固定为 `A2C-CLI`,不开放配置。
381
-
382
- MCP Server 存放在 `<用户主目录>/.sino-bc-cli/mcp.json`,结构与 Cursor 的 `mcp.json` 一致。用户自行增删后执行 `/mcp-reload`,CLI 会同步到 Cursor、Codex、Claude Code、VS Code。
383
-
384
- | 字段 | 命令行键名 | 默认值 | 说明 |
385
- | :--- | :--------- | :----- | :--- |
386
- | `env` | `env` | `prod` | 目标环境,可选 `test` / `pre` / `prod` |
387
- | `apiKey` | `api-key` | 内置默认 Key | 网关鉴权用的 API Key(业务命令使用) |
388
-
389
- ```bash
390
- # 查看(密钥打码)
391
- sino-bc-cli /get-config
392
-
393
- # 三种修改写法等价
394
- sino-bc-cli /set-config env test
395
- sino-bc-cli /set-config env=test
396
- sino-bc-cli /set-config --env=test
397
-
398
- # 不带参数则逐项交互修改,直接回车保留当前值
399
- sino-bc-cli /set-config
400
-
401
- # 改 MCP:编辑文件后重启
402
- # %USERPROFILE%\.sino-bc-cli\mcp.json
403
- sino-bc-cli /mcp-reload
404
- ```
405
-
406
- ```json
407
- {
408
- "mcpServers": {
409
- "example": {
410
- "type": "streamable-http",
411
- "url": "https://your-mcp-gateway/mcp/",
412
- "headers": {
413
- "Authorization": "Bearer <token>"
414
- }
415
- }
416
- }
417
- }
418
- ```
419
-
420
- > `/init` 结束时自动拉取并启动 `mcp.json`(文件不存在则创建空清单,已存在不覆盖)。非交互环境(npm `postinstall`、CI、Agent 调用)下不提问。MCP 失败只警告。
421
-
422
- ### 全局选项
423
-
424
- | 选项 | 短选项 | 说明 |
425
- | :---------- | :----- | :---------------------------------------- |
426
- | `--version` | `-v` | 显示版本信息 |
427
- | `--help` | `-h` | 显示帮助信息 |
428
- | `--debug` | `-d` | 启用 Debug 日志模式,输出更详细的运行信息 |
429
-
430
- ### 环境与请求网关
431
-
432
- 业务命令的请求地址由 [`src/constants/gateway.ts`](./src/constants/gateway.ts) 的 `GATEWAY_CONFIG` 决定,统一走 `joinGatewayUrl(env, path)` 拼接,实际请求由 [`src/utils/gateway-client.ts`](./src/utils/gateway-client.ts) 这一个出口发出。业务线路径带 `/sino-opti-hive`。iCenter 请写入 `mcp.json` 后 `/mcp-reload`。
433
-
434
- | `ENV` | 说明 | 网关地址 |
435
- | :----- | :------- | :----------------------------------- |
436
- | `test` | 测试环境 | `https://test-agent.beyondclick.com` |
437
- | `pre` | 预发环境 | `https://test-agent.beyondclick.com` |
438
- | `prod` | 生产环境 | `https://test-agent.beyondclick.com` |
439
-
440
- > 当前三环境同一地址。换地址只需改 `GATEWAY_CONFIG`,同时同步 [`SKILL.md`](./SKILL.md) 与 [`src/api-doc/`](./src/api-doc/README.md) 中的示例地址。
441
-
442
- ### 使用示例
443
-
444
- #### ① 查看版本和帮助
445
-
446
- ```bash
447
- # 查看版本号
448
- sino-bc-cli --version
449
- sino-bc-cli -v
450
-
451
- # 查看帮助文档(含所有可用命令列表)
452
- sino-bc-cli --help
453
- sino-bc-cli -h
454
- ```
455
-
456
- #### ② 列出可调用接口并打开文档
457
-
458
- ```bash
459
- sino-bc-cli /api-list
460
- sino-bc-cli /api-list 3
461
- sino-bc-cli /api-list biz-line-open-list
462
- ```
463
-
464
- 执行效果:按「业务线查询 / 业务线策略」分组列出全部接口。接口名是终端超链接,文档路径可 Ctrl+单击打开对应 markdown;交互终端也可输入序号。传入序号或接口 `name` 则直接打开该文档。
465
-
466
- #### ③ 配置并重启 MCP
467
-
468
- ```bash
469
- # 编辑 %USERPROFILE%\.sino-bc-cli\mcp.json 后
470
- sino-bc-cli /mcp-reload
471
- ```
472
-
473
- 执行效果:把 `mcp.json` 里的 Server 同步到 Cursor(`~/.cursor/mcp.json`)、Codex(`~/.codex/config.toml`)、Claude Code(`~/.claude.json`)、VS Code 用户级 `mcp.json`,并对带 `url` 的 Server 做 initialize 握手。
474
-
475
- #### ④ 查询业务线数据
476
-
477
- ```bash
478
- # 按名称查业务线
479
- sino-bc-cli biz-line +list --name <业务线名称>
480
-
481
- # 按渠道筛选(接受名称或 ID)
482
- sino-bc-cli biz-line +list --channel TikTok
483
-
484
- # 查某条业务线的周策略与表现
485
- sino-bc-cli biz-line +strategies --name <业务线名称>
486
-
487
- # 行业 Top
488
- sino-bc-cli biz-line +top --industry APP --top-n 5
489
-
490
- # 没有 Shortcut 的长尾接口
491
- sino-bc-cli biz-line api biz-line-strategy-compare \
492
- --data '{"bizLineId":123,"currentId":2,"prevId":1}'
493
- ```
494
-
495
- 执行效果:向配置文件指定环境的网关发起请求,路径统一带 `/sino-opti-hive` 前缀,自动注入 `Authorization` 与 `X-GATEWAY-TYPE: A2C-CLI`。接口清单见 [`src/api-doc/README.md`](./src/api-doc/README.md)。
496
-
497
- #### ⑤ 执行写操作(需确认)
498
-
499
- ```bash
500
- # 先预览请求,不会真正发起
501
- sino-bc-cli biz-line +status --id 123 --status 3 --dry-run
502
-
503
- # 确认无误后追加 --yes
504
- sino-bc-cli biz-line +status --id 123 --status 3 --yes
505
- ```
506
-
507
- > ⚠️ 写操作会变更线上数据。不加 `--yes` 时:交互式终端会展示环境与关键参数并询问;非交互式环境以退出码 `10` 返回 `confirmation_required`,需人工确认后再重试。
508
-
509
- #### ⑥ 启用 Debug 模式运行
510
-
511
- ```bash
512
- sino-bc-cli --debug /api-list
513
- # 或使用短选项
514
- sino-bc-cli -d /api-list
515
- ```
516
-
517
- Debug 模式会输出详细的日志,包括参数解析、命令注册、接口调用过程等信息,便于排查问题。
518
-
519
- ---
520
-
521
- ## 🌐 跨平台兼容性
522
-
523
- 本工具已针对以下操作系统进行兼容性处理:
524
-
525
- | 操作系统 | 测试状态 | 打开浏览器方式 |
526
- | :--------------------------- | :------- | :----------------------------------------------------------------- |
527
- | **Windows** (10/11) | ✅ 支持 | 使用 `cmd /c start "" "url"`,已处理 URL 中 `&`/`^` 等特殊字符转义 |
528
- | **macOS** | ✅ 支持 | 使用系统 `open` 命令 |
529
- | **Linux** (Ubuntu/CentOS 等) | ✅ 支持 | 使用 `xdg-open` 命令 |
530
-
531
- > 所有平台均通过 Node.js 内置 `child_process.exec` 调用,**不依赖任何 native 模块**,确保跨平台一致性。
532
-
533
- ---
534
-
535
- ## 📦 NPM 脚本说明
536
-
537
- 在 `package.json` 中预定义了以下脚本:
538
-
539
- ```bash
540
- # 编译 TypeScript 为 JavaScript(输出到 dist/)
541
- npm run build
542
-
543
- # 类型检查(不产出文件)
544
- npm run typecheck
545
-
546
- # 跑单元测试
547
- npm test
548
-
549
- # 开发模式:直接运行 TypeScript 源码(ts-node)
550
- npm run dev -- [参数]
551
-
552
- # 运行已编译的 CLI(需要先 build)
553
- npm start -- [参数]
554
-
555
- # 清理编译产物(删除 dist/ 目录)
556
- npm run clean
557
-
558
- # 清理后重新编译
559
- npm run rebuild
560
- ```
561
-
562
- ---
563
-
564
- ## 🔧 扩展新命令(开发者指南)
565
-
566
- 先判断要加的是哪一类:
567
-
568
- - **生命周期命令**(安装、配置、维护,用 `/` 前缀)→ 加到 `src/commands/`
569
- - **业务命令**(调接口拿数据,形如 `biz-line +xxx`)→ 加到 `src/shortcuts/`
570
-
571
- ### A. 新增业务 Shortcut
572
-
573
- 1. **写声明**:在 `src/shortcuts/biz-line/read.ts` 或 `write.ts` 里新增一条 `IShortcutDefinition`,声明 `command`、`risk`、`flags`,并在 `resolve()` 里返回目标接口与请求体
574
- 2. **登记**:加入 `src/shortcuts/biz-line/index.ts` 的 `BIZ_LINE_SHORTCUTS` 数组
575
- 3. **补测试**:在 `tests/` 下用 HTTP 桩断言请求与输出
576
- 4. **同步文档**:`skills/sino-bc-biz-line` 的意图表、`affordance/biz-line.md` 的 WHEN、`src/api-doc/` 的字段口径;根 `SKILL.md` 只做入口
577
-
578
- 参数解析、输出格式、写操作确认门、错误归类都由 `src/shortcuts/index.ts` 统一承担,声明里不要自己发 HTTP。接口 `name` 一律取自 `src/constants/biz-line-api-doc.ts`,不要新造。
579
-
580
- > 只是想调一个已有接口,通常不需要写新 Shortcut——直接 `biz-line api <name> --data '<json>'` 即可。Shortcut 应当带来智能默认值、参数编排或更友好的输出,否则不值得新增。
581
-
582
- ### B. 新增生命周期命令
583
-
584
- 1. **新建命令文件**:在 `src/commands/` 下创建 `xxx.command.ts`
585
- 2. **实现 ICommand 接口**:编写 `name`、`description` 和 `execute()` 方法
586
- 3. **注册命令**:在 `src/commands/index.ts` 的 `commands` 数组中添加实例
587
-
588
- ### 示例
589
-
590
- ```typescript
591
- // src/commands/example.command.ts
592
- import { ICommand } from "../types";
593
- import { logger, BrowserUtils } from "../utils";
594
-
595
- export class ExampleCommand implements ICommand {
596
- public readonly name = "example";
597
- public readonly description = "示例命令 - 打开示例网站";
598
-
599
- public async execute(args: string[]): Promise<void> {
600
- logger.info("执行示例命令,参数:", args);
601
- await BrowserUtils.openUrl("https://example.com/");
602
- }
603
- }
604
- ```
605
-
606
- ```typescript
607
- // src/commands/index.ts
608
- import { ExampleCommand } from "./example.command"; // 新增导入
609
-
610
- export const commands: ICommand[] = [
611
- new InitCommand(),
612
- new ApiListCommand(),
613
- new GetConfigCommand(),
614
- new ExampleCommand(), // 新增注册
615
- ];
616
- ```
617
-
618
- 完成后执行 `npm run build` 即可使用 `sino-bc-cli /example`。
619
-
620
- ---
621
-
622
- ## 📄 License
623
-
624
- MIT License
1
+ # sino-bc-cli
2
+
3
+ BeyondClick 命令行工具集合 - 提供快捷访问 BeyondClick 平台的命令行接口。
4
+
5
+ ## Install
6
+
7
+ > ⚠️ 本包是**全局 CLI 工具**。npm 官网右侧 Install 框里的 `npm i sino-bc-cli` 是网站写死的固定文案,不是本包的推荐用法,请以下面的命令为准(注意 `-g`)。
8
+ >
9
+ > 运行环境要求 Node.js >= 24.0.0。
10
+
11
+ ### ① 安装最新版本(推荐)
12
+
13
+ ```bash
14
+ # npm
15
+ npm i sino-bc-cli@latest -g
16
+
17
+ # pnpm
18
+ pnpm add -g sino-bc-cli@latest
19
+
20
+ # yarn
21
+ yarn global add sino-bc-cli@latest
22
+ ```
23
+
24
+ 已经装过旧版本时,执行同样的命令即可升级覆盖。想先确认远端最新版本号:
25
+
26
+ ```bash
27
+ npm view sino-bc-cli version # 查看 latest 版本号
28
+ npm outdated -g sino-bc-cli # 对比本地全局版本是否过期
29
+ ```
30
+
31
+ ### ② 安装指定版本
32
+
33
+ 把 `@latest` 换成目标版本号即可,适用于需要回退或锁定版本的场景:
34
+
35
+ ```bash
36
+ # npm
37
+ npm i sino-bc-cli@1.0.5 -g
38
+
39
+ # pnpm
40
+ pnpm add -g sino-bc-cli@1.0.5
41
+
42
+ # yarn
43
+ yarn global add sino-bc-cli@1.0.5
44
+ ```
45
+
46
+ 查看全部可安装版本:
47
+
48
+ ```bash
49
+ npm view sino-bc-cli versions --json
50
+ ```
51
+
52
+ ### ③ 卸载
53
+
54
+ ```bash
55
+ # npm
56
+ npm uninstall -g sino-bc-cli
57
+
58
+ # pnpm
59
+ pnpm remove -g sino-bc-cli
60
+
61
+ # yarn
62
+ yarn global remove sino-bc-cli
63
+ ```
64
+
65
+ > 如果当初是在源码目录用 `npm link` 做的开发链接,请改用 `npm unlink -g sino-bc-cli` 解除。
66
+
67
+ ### ④ 验证安装
68
+
69
+ ```bash
70
+ sino-bc-cli --version # 输出版本号,说明命令已可用
71
+ sino-bc-cli --help # 输出帮助信息和全部可用命令
72
+ npm ls -g --depth=0 sino-bc-cli # 确认全局安装的版本
73
+ ```
74
+
75
+ 若提示「command not found / 无法将 sino-bc-cli 项识别为命令」,说明 npm 全局 bin 目录不在 `PATH` 中。用 `npm prefix -g` 查看全局安装根目录(Windows 下该目录即 bin 目录,macOS / Linux 下为其 `bin` 子目录),把它加入环境变量后重开终端。
76
+
77
+ ### ⑤ 初始化(必须执行一次)
78
+
79
+ **装完之后必须完成 `/init` 初始化,CLI 的 Agent 技能才会生效。**
80
+
81
+ 全局安装时 `postinstall` 会自动执行一次 `/init`。但在以下情况会被跳过,需要手动补执行:使用 `--ignore-scripts` 安装、安装目录权限不足、或通过 `npx` 临时运行。
82
+
83
+ ```bash
84
+ sino-bc-cli /init
85
+ ```
86
+
87
+ `/init` 会把根 `SKILL.md` 与 `skills/system/`、`skills/custom/` 下的标准子技能(`SKILL.md` + `references/`,同路径以 `custom` 为准)嵌进 `~/.agents/skills/sino-bc-cli/`,不出现 `system/` 或 `custom/` 这一层;同时删除旧的平级 `sino-bc-shared` / `sino-bc-<domain>` 技能目录。豆包本地列表里只应看到 **`sino-bc-cli`**。飞书豆包工作侧还需:技能·连接器 → 管理 → **本地** → 刷新。查看包内技能:`sino-bc-cli /skill`。
88
+
89
+ > 每次升级版本后请重新执行一次 `sino-bc-cli /init`,以刷新本地技能文件。
90
+
91
+ ### ⑥ 免安装临时执行
92
+
93
+ ```bash
94
+ npx sino-bc-cli --help
95
+ ```
96
+
97
+ 注意 `npx` 方式不会持久注册 Agent 技能,需要技能能力时仍请走全局安装 + `/init`。
98
+
99
+ ---
100
+
101
+ ## 📚 技术栈说明
102
+
103
+ | 技术/依赖 | 版本要求 | 用途说明 |
104
+ | :------------- | :----------- | :------------------------------------------------------ |
105
+ | **Node.js** | `>= v24.0.0` | CLI 运行时环境,要求使用 v24 及以上版本 |
106
+ | **TypeScript** | `^v5.5.0` | 开发语言,提供静态类型检查和更好的可维护性 |
107
+ | **lodash** | `^4.17.21` | 工具函数库,提供对象/数组/字符串处理等高效方法 |
108
+ | **dayjs** | `^1.11.11` | 轻量级日期处理库,替代 Moment.js 处理日期时间格式化 |
109
+ | **axios** | `^1.7.0` | HTTP 客户端库,用于网络请求、连通性检测等 |
110
+ | **crypto-js** | `^4.2.0` | 加密算法库,提供 MD5、SHA-256、AES、Base64 等加解密能力 |
111
+ | **commander** | `^12.1.0` | 命令行参数解析框架(预留,当前采用自研注册器模式) |
112
+ | **chalk** | `^4.1.2` | 终端彩色输出库,用于美化日志和帮助信息 |
113
+ | **open** | `^8.4.2` | 跨平台文件/URL 打开工具(兼容备用方案) |
114
+
115
+ ### 开发依赖
116
+
117
+ | 依赖 | 版本 | 用途 |
118
+ | :----------------- | :-------- | :-------------------------------- |
119
+ | `@types/node` | `^22.0.0` | Node.js 类型声明 |
120
+ | `@types/lodash` | `^4.17.5` | lodash 类型声明 |
121
+ | `@types/crypto-js` | `^4.2.2` | crypto-js 类型声明 |
122
+ | `ts-node` | `^10.9.2` | 开发阶段直接运行 TypeScript 代码 |
123
+ | `rimraf` | `^5.0.7` | 跨平台目录清理工具,替代 `rm -rf` |
124
+
125
+ ---
126
+
127
+ ## 📁 项目结构说明
128
+
129
+ 项目采用 **模块化、低耦合、高内聚** 的分层设计,便于后续扩展和维护。
130
+
131
+ ```
132
+ sino-bc-cli/
133
+ ├── src/ # 源代码目录(TypeScript)
134
+ │ ├── index.ts # 🚀 CLI 入口文件,bin 关联点
135
+ │ │
136
+ │ ├── core/ # 🧠 核心模块层
137
+ │ │ ├── index.ts # 核心模块统一导出
138
+ │ │ ├── cli-app.ts # CLI 应用主类(参数解析、帮助展示、命令分发)
139
+ │ │ ├── route.ts # argv 路由(斜杠命令 / 域 + Shortcut)
140
+ │ │ └── command-registry.ts # 命令注册器(注册、查找、执行、注销命令)
141
+ │ │
142
+ │ ├── commands/ # 📦 命令实现层(每命令一个文件,可独立扩展)
143
+ │ │ ├── index.ts # 命令批量注册入口
144
+ │ │ ├── init.command.ts # /init 命令实现(注册 Agent 技能 + 初始化变量配置)
145
+ │ │ ├── bc-api.command.ts # /bc-api 已下线,仅打印迁移提示并非 0 退出
146
+ │ │ ├── get-config.command.ts # /get-config 命令实现(查看变量配置)
147
+ │ │ ├── set-config.command.ts # /set-config 命令实现(修改变量配置)
148
+ │ │ ├── skill.command.ts # /skill 命令实现(列出包内技能或打开 SKILL.md)
149
+ │ │ └── uninstall.command.ts # /uninstall 命令实现(清理技能目录与配置并卸载)
150
+ │ │
151
+ │ ├── shortcuts/ # ⚡ Shortcut 执行面(业务命令,域 + `+cmd`)
152
+ │ │ ├── index.ts # 注册表与执行器(flag 解析、输出格式、写确认门)
153
+ │ │ ├── flags.ts # Shortcut 面参数解析(含公共 flag)
154
+ │ │ ├── types.ts # Shortcut 声明与执行上下文类型
155
+ │ │ └── biz-line/ # biz-line 域
156
+ │ │ ├── index.ts # 该域全部 Shortcut 登记处
157
+ │ │ ├── read.ts # 只读 Shortcut(+channels/+categories/+list/+strategies)
158
+ │ │ ├── write.ts # 写 Shortcut(+save/+update/+status/+delete/+strategy-*)
159
+ │ │ ├── raw-api.ts # biz-line api <name> 点名调用
160
+ │ │ └── helpers.ts # 按名解析业务线、字典名称映射等编排
161
+ │ │
162
+ │ ├── utils/ # 🛠 工具类层(高内聚的可复用工具)
163
+ │ │ ├── index.ts # 工具模块统一导出
164
+ │ │ ├── logger.ts # 日志工具(多级别彩色输出 + 时间戳)
165
+ │ │ ├── browser.ts # 浏览器工具(跨平台 URL 打开,兼容 Win/macOS/Linux)
166
+ │ │ ├── crypto.ts # 加密工具(MD5、SHA-256、AES、Base64、签名生成)
167
+ │ │ ├── http.ts # HTTP 工具(axios 封装:请求/响应拦截、自动重试)
168
+ │ │ ├── gateway-client.ts # 网关调用唯一出口(拼地址、注入鉴权与来源头、解包 result)
169
+ │ │ ├── presenter.ts # 输出与退出码(table / JSON 信封,stdout / stderr 分流)
170
+ │ │ ├── cli-error.ts # 带分类的 CLI 错误(validation / config / api / 待确认)
171
+ │ │ ├── common.ts # 通用工具(日期、深拷贝、防抖节流、ID 生成等)
172
+ │ │ ├── prompt.ts # 终端交互(复用单一 readline 会话:提问、选择、确认)
173
+ │ │ ├── config-store.ts # 变量配置读写(字段元信息 + 读 / 写 / 删)
174
+ │ │ ├── config-prompt.ts # 变量配置交互采集(/init 与 /set-config 共用)
175
+ │ │ └── skill-install.ts # Agent 技能目录的写入与清理
176
+ │ │
177
+ │ ├── types/ # 📝 类型定义层
178
+ │ │ └── index.ts # 全局接口、枚举定义(ICommand、LogLevel 等)
179
+ │ │
180
+ │ └── constants/ # 🔧 常量配置层
181
+ │ └── index.ts # CLI 配置、命令名称、Shortcut 域、默认值
182
+ │
183
+ ├── skills/ # Agent 技能树(shared + biz-line,含 references)
184
+ ├── affordance/ # 各 Shortcut 的 WHEN / 别用 / 示例
185
+ ├── tests/ # ✅ 单元测试(node --test + ts-node)
186
+ │ ├── helpers/ # HTTP 执行器桩、输出流桩
187
+ │ └── *.test.ts # 路由、flag、网关、输出契约、各类 Shortcut
188
+ │
189
+ ├── dist/ # 📤 构建输出目录(构建后自动生成)
190
+ │ └── ... # 单文件混淆压缩产物 + SKILL.md + skills/ + affordance/ + api-doc(不含 SourceMap)
191
+ │
192
+ ├── package.json # 📄 项目配置(依赖、脚本、bin 命令)
193
+ ├── tsconfig.json # 📄 TypeScript 编译配置
194
+ ├── .gitignore # 📄 Git 忽略配置
195
+ └── README.md # 📖 项目说明文档
196
+ ```
197
+
198
+ ### 架构设计原则
199
+
200
+ 1. **分层清晰**:`core → commands → utils → types/constants`,上层依赖下层,单向依赖无循环
201
+ 2. **低耦合**:命令之间互相独立,通过注册器统一管理;新增命令只需在 `commands/` 下新建文件并加入 `commands/index.ts` 数组
202
+ 3. **高内聚**:每个工具类只负责单一职责(如 `BrowserUtils` 只处理浏览器打开,`CryptoUtils` 只处理加解密)
203
+ 4. **可扩展**:
204
+ - 新增命令:实现 `ICommand` 接口 → 放入 `commands/index.ts` 数组即可自动注册
205
+ - 新增工具:在 `utils/` 下新建类,通过 `utils/index.ts` 导出
206
+ - 命令注册器支持运行时动态注册/注销命令
207
+
208
+ ---
209
+
210
+ ## 🚀 项目使用说明
211
+
212
+ ### 1. 环境要求
213
+
214
+ 确保已安装 **Node.js v24** 或更高版本:
215
+
216
+ ```bash
217
+ # 查看 Node.js 版本
218
+ node -v
219
+ # 要求输出 v24.x.x 或更高
220
+
221
+ # 查看 npm 版本
222
+ npm -v
223
+ ```
224
+
225
+ > 如果 Node.js 版本不符合要求,建议通过 [nvm (Node Version Manager)](https://github.com/nvm-sh/nvm) 或 [nvm-windows](https://github.com/coreybutler/nvm-windows) 进行安装和版本管理。
226
+
227
+ ### 2. 安装依赖
228
+
229
+ 在项目根目录下执行:
230
+
231
+ ```bash
232
+ npm install
233
+ ```
234
+
235
+ 依赖安装完成后,`node_modules/` 目录将生成。
236
+
237
+ ### 3. 编译项目
238
+
239
+ 项目使用 TypeScript 编写,需要编译为 JavaScript 后才能运行:
240
+
241
+ ```bash
242
+ # 编译(生成 dist/ 目录)
243
+ npm run build
244
+
245
+ # 清理旧的编译产物并重新编译
246
+ npm run rebuild
247
+ ```
248
+
249
+ 编译完成后,`dist/` 目录将包含:
250
+
251
+ - `*.js` — 编译后的 JavaScript 代码
252
+ - `*.d.ts` — TypeScript 类型声明文件
253
+ - `*.js.map` — SourceMap 调试映射文件
254
+
255
+ ### 4. 开发模式(免编译运行)
256
+
257
+ 开发阶段可使用 `ts-node` 直接运行 TypeScript 代码,无需手动编译:
258
+
259
+ ```bash
260
+ # 直接运行 TypeScript 源码
261
+ npm run dev -- [参数]
262
+
263
+ # 示例:查看帮助
264
+ npm run dev -- --help
265
+
266
+ # 示例:执行业务命令
267
+ npm run dev -- biz-line +list --name <业务线名称>
268
+ ```
269
+
270
+ ### 4.1 运行测试
271
+
272
+ 单元测试用 Node 内置 runner(`node --test`)配 `ts-node`,不额外引入测试框架:
273
+
274
+ ```bash
275
+ # 跑全部用例
276
+ npm test
277
+
278
+ # 类型检查(tsc --noEmit)
279
+ npm run typecheck
280
+ ```
281
+
282
+ 用例放在 `tests/`,通过注入 HTTP 执行器桩断言请求,不产生真实网络调用。
283
+
284
+ ### 5. 全局安装(推荐)
285
+
286
+ 将 CLI 工具链接为全局命令,可在任意目录下直接使用 `sino-bc-cli`:
287
+
288
+ ```bash
289
+ # 方式一:从源码目录全局链接(开发/测试场景)
290
+ cd d:\Project\demo\sino-bc-cli
291
+ npm run build # 必须先编译
292
+ npm link # 全局链接(Windows 下需要管理员权限)
293
+
294
+ # 方式二:后续发布到 npm 后
295
+ npm i sino-bc-cli -g
296
+ ```
297
+
298
+ 安装完成后,即可在任意终端直接使用:
299
+
300
+ ```bash
301
+ sino-bc-cli --help
302
+ sino-bc-cli /init
303
+ sino-bc-cli biz-line --help
304
+ sino-bc-cli biz-line +list --name <业务线名称>
305
+ ```
306
+
307
+ `npm i sino-bc-cli -g` 完成后会自动执行 `/init`,把唯一技能 `sino-bc-cli` 写到 `~/.agents/skills/sino-bc-cli/`,并清掉旧的平级 `sino-bc-shared` / `sino-bc-<domain>`。飞书豆包工作:技能·连接器 → 管理 → **本地** → 刷新。若未出现,手动执行:
308
+
309
+ ```bash
310
+ sino-bc-cli /init
311
+ ```
312
+
313
+ > 卸载全局链接:`npm unlink` 或 `npm uninstall -g sino-bc-cli`
314
+
315
+ ---
316
+
317
+ ## 📖 命令说明
318
+
319
+ 命令分两类:**生命周期命令**用 `/` 前缀,负责安装与配置;**业务命令**是 Shortcut 执行面,形如 `<域> +<命令>`。
320
+
321
+ ### 生命周期命令
322
+
323
+ | 命令 | 说明 |
324
+ | :---------- | :-------------------------------------------------------------------------------------------- |
325
+ | `/init` | 注册唯一技能 `sino-bc-cli` 到 Agent 技能目录(并删除旧平级 `sino-bc-shared` / `sino-bc-<domain>`),交互设置环境 / `API_KEY` |
326
+ | `/skill` | 列出包内 Agent 技能;传入 name 打开对应 `SKILL.md` |
327
+ | `/get-config` | 查看变量配置;密钥默认打码,`--show-secret` 显示明文,`--json` 输出 JSON |
328
+ | `/set-config` | 修改变量配置(环境 / API_KEY / 维护者的 `apifox-token`);不带参数时逐项交互修改环境与 API_KEY |
329
+ | `/uninstall` | 删除技能目录与变量配置文件,并从全局 npm 卸载本 CLI |
330
+ | `/bc-api` | **已下线**。只打印迁移提示并非 0 退出,改用 `biz-line +<shortcut>` 或 `biz-line api <name>` |
331
+
332
+ ### 业务命令(`biz-line`)
333
+
334
+ | 命令 | 说明 |
335
+ | :--- | :--- |
336
+ | `biz-line +channels` | 查询投放渠道列表(`code` 即业务线里的 `mediaChannelId`) |
337
+ | `biz-line +categories` | 查询投放行业与品类字典树 |
338
+ | `biz-line +list` | 查询业务线;`--name` / `--id` / `--category`,不传即查全部(`pagination: false`) |
339
+ | `biz-line +strategies` | 查周策略与表现;`--name` 会先解析业务线 ID,或传单个 `--id` |
340
+ | `biz-line +save` / `+update` / `+status` / `+delete` | ⚠️ 业务线写操作 |
341
+ | `biz-line +strategy-save` / `+strategy-update` / `+strategy-delete` | ⚠️ 周策略写操作 |
342
+ | `biz-line api <name> --data '<json>'` | 按接口 `name` 点名调用,覆盖导出、对比、消耗等长尾接口 |
343
+
344
+ `+list --category` 同时接受数字 ID 与名称;传名称时会先查品类字典再映射,映射不到会报错并列出可选值。`+list` 不再接受 `--channel` / `--industry`。行业 / 品类 Top 没有 Shortcut。
345
+
346
+ ### Shortcut 面公共参数
347
+
348
+ | 参数 | 说明 |
349
+ | :--- | :--- |
350
+ | `--format json\|table` | 输出格式。TTY 默认 `table`,非 TTY 默认 `json` |
351
+ | `--dry-run` | 只打印将要发起的 method / URL / 请求体,不发请求 |
352
+ | `--yes` | 跳过写操作确认,直接发起请求 |
353
+
354
+ ### 输出契约与退出码
355
+
356
+ 非 TTY(管道 / CI / Agent)默认输出 JSON 信封。成功走 stdout,失败走 stderr:
357
+
358
+ ```json
359
+ { "ok": true, "env": "prod", "command": "biz-line +list", "data": [], "meta": { "count": 0 } }
360
+ { "ok": false, "env": "prod", "command": "biz-line +delete", "error": { "type": "confirmation_required", "message": "...", "hint": "..." } }
361
+ ```
362
+
363
+ `data` 只包含上游 `result`。**判断成功请看 `ok` 或进程退出码,不要看上游 `code`。**
364
+
365
+ | 退出码 | 含义 |
366
+ | :----- | :--- |
367
+ | `0` | 成功 |
368
+ | `10` | 写操作待确认,**不是错误**;向用户确认后在原命令末尾追加 `--yes` 重试 |
369
+ | 其他非 0 | 失败,详见 `error.type`(`validation` / `config` / `api`) |
370
+
371
+ ### 变量配置文件
372
+
373
+ 环境、`API_KEY` 与维护者用的 `apifoxToken` 存放在 `<用户主目录>/.sino-bc-cli/config.json`。`X-GATEWAY-TYPE` 固定为 `A2C-CLI`,不开放配置。
374
+
375
+ | 字段 | 命令行键名 | 默认值 | 说明 |
376
+ | :--- | :--------- | :----- | :--- |
377
+ | `env` | `env` | `prod` | 目标环境,可选 `test` / `pre` / `prod` |
378
+ | `apiKey` | `api-key` | 内置默认 Key | 网关鉴权用的 API Key(业务命令使用) |
379
+ | `apifoxToken` | `apifox-token` | 空 | 仅维护者同步接口文档用(`npm run sync-api-doc`),与业务调用无关;`/init` 不会询问它 |
380
+
381
+ ```bash
382
+ # 查看(密钥打码)
383
+ sino-bc-cli /get-config
384
+
385
+ # 三种修改写法等价
386
+ sino-bc-cli /set-config env test
387
+ sino-bc-cli /set-config env=test
388
+ sino-bc-cli /set-config --env=test
389
+
390
+ # 不带参数则逐项交互修改,直接回车保留当前值(只问环境与 API_KEY)
391
+ sino-bc-cli /set-config
392
+
393
+ # 维护者才需要:配置 Apifox token(默认打码,--show-secret 看明文)
394
+ sino-bc-cli /set-config apifox-token <你的 token>
395
+ ```
396
+
397
+ > `/init` 在非交互环境(npm `postinstall`、CI、Agent 调用)下不提问:配置文件已存在则保持不变,不存在则按默认值创建。
398
+
399
+ ### 全局选项
400
+
401
+ | 选项 | 短选项 | 说明 |
402
+ | :---------- | :----- | :---------------------------------------- |
403
+ | `--version` | `-v` | 显示版本信息 |
404
+ | `--help` | `-h` | 显示帮助信息 |
405
+ | `--debug` | `-d` | 启用 Debug 日志模式,输出更详细的运行信息 |
406
+
407
+ ### 环境与请求网关
408
+
409
+ 业务命令的请求地址由 [`src/constants/gateway.ts`](./src/constants/gateway.ts) 的 `GATEWAY_CONFIG` 决定,统一走 `joinGatewayUrl(env, path)` 拼接,实际请求由 [`src/utils/gateway-client.ts`](./src/utils/gateway-client.ts) 这一个出口发出。`path` 等于接口文档 / OpenAPI 路由,不再拼接 `/sino-opti-hive`。
410
+
411
+ | `ENV` | 说明 | 网关地址 |
412
+ | :----- | :------- | :----------------------------------- |
413
+ | `test` | 测试环境 | `https://test-agent.beyondclick.com` |
414
+ | `pre` | 预发环境 | `https://test-agent.beyondclick.com` |
415
+ | `prod` | 生产环境 | `https://test-agent.beyondclick.com` |
416
+
417
+ > 当前三环境同一地址。换地址只需改 `GATEWAY_CONFIG`,同时同步 [`SKILL.md`](./SKILL.md) 与 [`src/api-doc/`](./src/api-doc/custom/README.md) 中的示例地址。
418
+
419
+ ### 使用示例
420
+
421
+ #### ① 查看版本和帮助
422
+
423
+ ```bash
424
+ # 查看版本号
425
+ sino-bc-cli --version
426
+ sino-bc-cli -v
427
+
428
+ # 查看帮助文档(含所有可用命令列表)
429
+ sino-bc-cli --help
430
+ sino-bc-cli -h
431
+ ```
432
+
433
+ #### ② 查看某域何时用哪条命令
434
+
435
+ ```bash
436
+ sino-bc-cli biz-line --help
437
+ ```
438
+
439
+ 接口字段口径见 [`src/api-doc/custom/README.md`](./src/api-doc/custom/README.md)。
440
+
441
+ #### ③ 查询业务线数据
442
+
443
+ ```bash
444
+ # 按名称查业务线
445
+ sino-bc-cli biz-line +list --name <业务线名称>
446
+
447
+ # 按品类筛选(接受名称或 ID)
448
+ sino-bc-cli biz-line +list --category <品类>
449
+
450
+ # 查某条业务线的周策略与表现
451
+ sino-bc-cli biz-line +strategies --name <业务线名称>
452
+
453
+ # 没有 Shortcut 的长尾接口
454
+ sino-bc-cli biz-line api biz-line-strategy-compare \
455
+ --data '{"bizLineId":123,"currentId":2,"prevId":1}'
456
+ ```
457
+
458
+ 执行效果:向配置文件指定环境的网关发起请求,路径等于接口文档路由,自动注入 `Authorization` 与 `X-GATEWAY-TYPE: A2C-CLI`。接口清单见 [`src/api-doc/custom/README.md`](./src/api-doc/custom/README.md)。
459
+
460
+ #### ④ 执行写操作(需确认)
461
+
462
+ ```bash
463
+ # 先预览请求,不会真正发起
464
+ sino-bc-cli biz-line +status --id 123 --status 3 --dry-run
465
+
466
+ # 确认无误后追加 --yes
467
+ sino-bc-cli biz-line +status --id 123 --status 3 --yes
468
+ ```
469
+
470
+ > ⚠️ 写操作会变更线上数据。不加 `--yes` 时:交互式终端会展示环境与关键参数并询问;非交互式环境以退出码 `10` 返回 `confirmation_required`,需人工确认后再重试。
471
+
472
+ #### ⑤ 启用 Debug 模式运行
473
+
474
+ ```bash
475
+ sino-bc-cli --debug biz-line --help
476
+ # 或使用短选项
477
+ sino-bc-cli -d biz-line --help
478
+ ```
479
+
480
+ Debug 模式会输出详细的日志,包括参数解析、命令注册、接口调用过程等信息,便于排查问题。
481
+
482
+ ---
483
+
484
+ ## 🌐 跨平台兼容性
485
+
486
+ 本工具已针对以下操作系统进行兼容性处理:
487
+
488
+ | 操作系统 | 测试状态 | 打开浏览器方式 |
489
+ | :--------------------------- | :------- | :----------------------------------------------------------------- |
490
+ | **Windows** (10/11) | ✅ 支持 | 使用 `cmd /c start "" "url"`,已处理 URL 中 `&`/`^` 等特殊字符转义 |
491
+ | **macOS** | ✅ 支持 | 使用系统 `open` 命令 |
492
+ | **Linux** (Ubuntu/CentOS 等) | ✅ 支持 | 使用 `xdg-open` 命令 |
493
+
494
+ > 所有平台均通过 Node.js 内置 `child_process.exec` 调用,**不依赖任何 native 模块**,确保跨平台一致性。
495
+
496
+ ---
497
+
498
+ ## 📦 NPM 脚本说明
499
+
500
+ 在 `package.json` 中预定义了以下脚本:
501
+
502
+ ```bash
503
+ # 编译 TypeScript 为 JavaScript(输出到 dist/)
504
+ npm run build
505
+
506
+ # 类型检查(不产出文件)
507
+ npm run typecheck
508
+
509
+ # 跑单元测试
510
+ npm test
511
+
512
+ # 开发模式:直接运行 TypeScript 源码(ts-node)
513
+ npm run dev -- [参数]
514
+
515
+ # 运行已编译的 CLI(需要先 build)
516
+ npm start -- [参数]
517
+
518
+ # 清理编译产物(删除 dist/ 目录)
519
+ npm run clean
520
+
521
+ # 清理后重新编译
522
+ npm run rebuild
523
+ ```
524
+
525
+ ---
526
+
527
+ ## 🔧 扩展新命令(开发者指南)
528
+
529
+ 先判断要加的是哪一类:
530
+
531
+ - **生命周期命令**(安装、配置、维护,用 `/` 前缀)→ 加到 `src/commands/`
532
+ - **业务命令**(调接口拿数据,形如 `biz-line +xxx`)→ 加到 `src/shortcuts/`
533
+
534
+ ### A. 新增业务 Shortcut
535
+
536
+ 1. **写声明**:在 `src/shortcuts/biz-line/read.ts` 或 `write.ts` 里新增一条 `IShortcutDefinition`,声明 `command`、`risk`、`flags`,并在 `resolve()` 里返回目标接口与请求体
537
+ 2. **登记**:加入 `src/shortcuts/biz-line/index.ts` 的 `BIZ_LINE_SHORTCUTS` 数组
538
+ 3. **补测试**:在 `tests/` 下用 HTTP 桩断言请求与输出
539
+ 4. **同步文档**:`skills/system/sino-bc-biz-line` 的意图表、`affordance/biz-line.md` 的 WHEN、`src/api-doc/system/` 的字段口径;手写补充放 `skills/custom/` 与 `src/api-doc/custom/`;根 `SKILL.md` 只做入口
540
+
541
+ 参数解析、输出格式、写操作确认门、错误归类都由 `src/shortcuts/index.ts` 统一承担,声明里不要自己发 HTTP。接口 `name` 一律取自 `src/generated/api-catalog.json`,不要新造。
542
+
543
+ 维护者同步 Apifox:`npm run sync-api-doc`。token 按三级回退取值——环境变量 `APIFOX_TOKEN` > `~/.sino-bc-cli/config.json` 的 `apifoxToken` > 终端交互输入;交互输入到的 token 会写回该配置文件,下次不再询问。三处都没有则非 0 退出。CI 用环境变量覆盖即可。**不要把 token 写入仓库任何文件。**
544
+
545
+ > 只是想调一个已有接口,通常不需要写新 Shortcut——直接 `biz-line api <name> --data '<json>'` 即可。Shortcut 应当带来智能默认值、参数编排或更友好的输出,否则不值得新增。
546
+
547
+ ### B. 新增生命周期命令
548
+
549
+ 1. **新建命令文件**:在 `src/commands/` 下创建 `xxx.command.ts`
550
+ 2. **实现 ICommand 接口**:编写 `name`、`description` 和 `execute()` 方法
551
+ 3. **注册命令**:在 `src/commands/index.ts` 的 `commands` 数组中添加实例
552
+
553
+ ### 示例
554
+
555
+ ```typescript
556
+ // src/commands/example.command.ts
557
+ import { ICommand } from "../types";
558
+ import { logger, BrowserUtils } from "../utils";
559
+
560
+ export class ExampleCommand implements ICommand {
561
+ public readonly name = "example";
562
+ public readonly description = "示例命令 - 打开示例网站";
563
+
564
+ public async execute(args: string[]): Promise<void> {
565
+ logger.info("执行示例命令,参数:", args);
566
+ await BrowserUtils.openUrl("https://example.com/");
567
+ }
568
+ }
569
+ ```
570
+
571
+ ```typescript
572
+ // src/commands/index.ts
573
+ import { ExampleCommand } from "./example.command"; // 新增导入
574
+
575
+ export const commands: ICommand[] = [
576
+ new InitCommand(),
577
+ new GetConfigCommand(),
578
+ new ExampleCommand(), // 新增注册
579
+ ];
580
+ ```
581
+
582
+ 完成后执行 `npm run build` 即可使用 `sino-bc-cli /example`。
583
+
584
+ ---
585
+
586
+ ## 📄 License
587
+
588
+ MIT License