Skip to content

Commit 03f0e7c

Browse files
Merge pull request #90 from modelstudioai/feat/self-built-framework
feat: refactor command framework
2 parents 7b08b88 + 0a301ee commit 03f0e7c

282 files changed

Lines changed: 8654 additions & 8264 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.node-version

Lines changed: 0 additions & 1 deletion
This file was deleted.

AGENTS.md

Lines changed: 52 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,62 @@
11
# bailian-cli — AI 维护指南
22

3-
本文件是 AI agent 维护本仓库时的契约。每次进入项目首先读这里,从下方"业务场景索引"挑一条,跳到对应的详细文档,按它的清单完成改动
3+
本文件是 AI agent 维护本仓库时的契约。每次进入项目先读这里,从"业务场景索引"挑一条,再进入对应 `docs/agents/*.md` 清单
44

55
## 项目地图
66

7-
monorepo 双包结构:
7+
monorepo 现在按"纯逻辑 → 运行时框架 → 命令库 → 产品入口"分层:
88

9-
- `packages/cli``bailian-cli` 包,CLI 命令、UI、入口
10-
- `packages/core``bailian-cli-core` 包,鉴权 / HTTP / 类型,纯逻辑层
9+
- `packages/core``bailian-cli-core`,纯逻辑层:鉴权、配置、HTTP client、错误、类型、文件工具
10+
- `packages/runtime``bailian-cli-runtime`,通用 CLI 运行时:`createCli`、参数解析、registry/help、middleware、error handler、输出、pipeline
11+
- `packages/commands``bailian-cli-commands`,可复用命令实现库,只导出 command,不决定产品路径
12+
- `packages/cli``bailian-cli`,完整 `bl` 产品入口;`src/commands.ts` 组装 `bl` 暴露的命令路径
13+
- `packages/kscli``knowledge-studio-cli`,Knowledge Studio 专用入口;`src/main.ts` 复用 commands 并重映射为 `kscli` 路径
1114

12-
### `packages/cli` 目录要点
15+
### 关键文件
1316

1417
```
15-
packages/cli/
16-
├── src/
17-
│ ├── main.ts # 入口、鉴权分支、调用 registry
18-
│ ├── registry.ts # 命令树解析、动态 help(读 catalog)
19-
│ ├── commands/
20-
│ │ ├── catalog.ts # 命令总表(登记处,构建脚本也读它)
21-
│ │ ├── index.ts # re-export commands
22-
│ │ └── <group>/...ts # 各命令 defineCommand 实现
23-
│ ├── output/ # CLI 输出、prompt、progress
24-
│ └── urls.ts # 控制台/文档 URL(仅 cli)
25-
└── tests/e2e/
18+
packages/cli/src/main.ts # bl 入口,注入 binName/version/clientName/npmPackage
19+
packages/cli/src/commands.ts # bl 产品命令 map,tools/generate-reference.ts 也读它
20+
packages/kscli/src/main.ts # kscli 入口和命令 map
21+
22+
packages/commands/src/index.ts # re-export 单个命令实现
23+
packages/commands/src/commands/ # defineCommand({ auth, flags, usageArgs, exampleArgs, run })
24+
25+
packages/runtime/src/create-cli.ts # createCli(commands, identity)
26+
packages/runtime/src/registry.ts # 命令树解析 + 动态 help
27+
packages/runtime/src/middleware.ts # auth / telemetry / update / run command
28+
packages/runtime/src/urls.ts # 用户面控制台 URL
29+
30+
packages/core/src/types/command.ts # Command / flags / auth 类型
31+
packages/core/src/config/ # ConfigFile / Settings / source 解析
32+
packages/core/src/auth/ # apiKey / console credential 解析与落盘
33+
packages/core/src/client/ # HTTP client / endpoints / console gateway
2634
```
2735

28-
Skill / 命令手册随 `skills/bailian-cli/``npx skills add modelstudioai/cli` 安装。`tools/generate-reference.ts``catalog.ts` 生成命令手册到 `skills/bailian-cli/reference/`(纳入 git);`tools/sync-skill-metadata.ts` 一起在 **pre-commit**`.vite-hooks/pre-commit`)及根脚本 `pnpm run sync:skill-assets` 中执行
36+
Skill / 命令手册随 `skills/bailian-cli/``npx skills add modelstudioai/cli` 安装。`tools/generate-reference.ts`**`packages/cli/src/commands.ts`** 生成 `skills/bailian-cli/reference/`(纳入 git);`tools/sync-skill-metadata.ts` `packages/cli/package.json` 同步 `skills/bailian-cli/SKILL.md``metadata.version`。两者由根脚本 `pnpm run sync:skill-assets` `.vite-hooks/pre-commit` 执行
2937

30-
非代码资产:
38+
约定:
3139

32-
- `tools/release/` — 发版自动化(CI 驱动,见 `.github/workflows/publish.yml`
33-
- `tools/generate-reference.ts` — 从 `catalog.ts` 生成命令手册到 `skills/bailian-cli/reference/`
34-
- `tools/sync-skill-metadata.ts` — 从 `packages/cli/package.json` 同步 `skills/bailian-cli/SKILL.md``metadata.version`(与 `generate:reference` 一并由根目录 `pnpm run sync:skill-assets` 及 pre-commit 执行)
35-
- `README.md` / `README.zh.md` — npm 和 GitHub 主页
40+
- 命令实现文件路径仍按能力放置:`packages/commands/src/commands/text/chat.ts`
41+
- 产品命令路径由入口 map 决定:同一个实现可暴露为 `bl knowledge retrieve``kscli retrieve`
42+
- `defineCommand` 只写命令元数据与逻辑: `auth``flags``usageArgs``exampleArgs``validate``run`
43+
- `usageArgs` / `exampleArgs` 不写 `bl``kscli` 前缀;runtime / reference 生成器按产品路径补前缀
44+
- 不再使用 `catalog.ts` 作为登记处;新增/重命名命令必须同时看命令库导出和产品入口 map
3645

37-
约定:
46+
非代码资产:
3847

39-
- core 是纯库,不依赖 cli(详见下方通用约定)
40-
- 文件路径与命令路径一一对应:`commands/text/chat.ts` `bl text chat`
41-
- 单级命令:`commands/<name>.ts`(如 `update.ts`);两级:`commands/<group>/<action>.ts`
42-
- 命令登记在 **`catalog.ts`**;`bl --help``tools/generate-reference.ts` 生成的命令手册同源,见 [command-add-remove.md](docs/agents/command-add-remove.md)
48+
- `tools/release/` — 发版自动化(CI 驱动,见 `.github/workflows/publish.yml`
49+
- `tools/generate-reference.ts` — 从 `packages/cli/src/commands.ts` 生成 `skills/bailian-cli/reference/`
50+
- `tools/sync-skill-metadata.ts` — 同步 `skills/bailian-cli/SKILL.md``metadata.version`
51+
- `README.md` / `README.zh.md` — npm 和 GitHub 主页
4352

4453
## 业务场景索引
4554

4655
按当前任务从下表挑一条进入对应文档:
4756

4857
| 场景 | 何时进入 | 详见 |
4958
| -------------- | -------------------------------------------- | ------------------------------------------------------------------------ |
50-
| 命令增删改 | 增加 / 删除 / 重命名 `bl xxx` | [docs/agents/command-add-remove.md](docs/agents/command-add-remove.md) |
59+
| 命令增删改 | 增加 / 删除 / 重命名 `bl xxx` 或入口命令路径 | [docs/agents/command-add-remove.md](docs/agents/command-add-remove.md) |
5160
| E2E 测试维护 | 新增/改命令或 e2e 用例、补 help/缺参/dry-run | [docs/agents/cli-e2e-tests.md](docs/agents/cli-e2e-tests.md) |
5261
| 批量压测 | 改/跑多能力并发压测、`test:stress`、fixtures | [docs/agents/stress-batch-tests.md](docs/agents/stress-batch-tests.md) |
5362
| 选项变更 | 给已有命令加 `--flag` 或改默认值 | [docs/agents/command-flag-change.md](docs/agents/command-flag-change.md) |
@@ -57,26 +66,24 @@ Skill / 命令手册随 `skills/bailian-cli/` 经 `npx skills add modelstudioai/
5766
| 鉴权扩展 | 加 OAuth / SSO / 换 token 来源 | [docs/agents/auth-change.md](docs/agents/auth-change.md) |
5867
| 配置项扩展 | 新 env var 或 `~/.bailian/config.json` 字段 | [docs/agents/config-add.md](docs/agents/config-add.md) |
5968
| 发布 | channel / stable 发布到 npm(CI 驱动) | [docs/agents/publish.md](docs/agents/publish.md) |
69+
| Change Log | 发版说明 / 历史版本说明 | [docs/agents/changelog-write.md](docs/agents/changelog-write.md) |
6070
| 工具链调整 | lint 规则 / 构建配置 / 依赖升级 | [docs/agents/lint-toolchain.md](docs/agents/lint-toolchain.md) |
6171

62-
如果当前任务无法对应任何场景,先按经验完成,然后**回来评估这是不是一类新场景** —— 是就新增一份 `docs/agents/<scenario>.md`,把清单沉淀下来。
72+
如果当前任务无法对应任何场景,先按经验完成,然后**回来评估这是不是一类新场景** —— 是就新增 `docs/agents/<scenario>.md`,把清单沉淀下来。
6373

6474
## 通用约定
6575

66-
下面两条与场景无关,任何改动都适用。每次完成改动后自查。
76+
### 1. 发布包版本号同步
6777

68-
### 1. cli 和 core 版本号同步
78+
源码包的 `version` 当前保持一致: `packages/core``packages/runtime``packages/commands``packages/cli``packages/kscli`。做版本 bump 时一动多动。release 工具当前强校验 / 发布范围以 `tools/release/lib/packages.mjs` 为准;把新包纳入发布前必须同步该清单和 [publish.md](docs/agents/publish.md)
6979

70-
`packages/cli/package.json``packages/core/package.json``version` 字段必须始终相等。一动两动。
80+
### 2. 分层边界
7181

72-
### 2. core 是纯库,cli 是 core 的 UI 层
73-
74-
core 不应该知道 cli 的存在。具体表现:
75-
76-
- core 不写 stderr,不调 `process.exit`(用 `console.*``throw`)
77-
- core 抛的 `BailianError`,hint 字符串不出现 `bl xxx` 命令名
78-
- core 不写死域名 / region / 追踪参数(URL 集中在 `packages/cli/src/urls.ts`)
79-
- core 接收 cli 通过 `Config` 注入的 metadata(`clientName` / `clientVersion`)
82+
- `core` 是纯库:不依赖 `runtime` / `commands` / 产品入口;不调 `process.exit`;新增/改动时不硬编码 `bl` / `kscli` 命令名、控制台 URL 或渠道追踪参数。当前遗留项见 [error-hint-change.md](docs/agents/error-hint-change.md)[url-change.md](docs/agents/url-change.md),触碰相关代码时顺手收敛
83+
- `runtime` 是通用 CLI 框架:可以处理 TTY、help、错误输出、middleware,但不写具体业务命令逻辑
84+
- `commands` 是命令实现库:不决定产品路径;不在 `usageArgs` / `exampleArgs` / hint 里硬编码产品 bin 前缀
85+
- `cli` / `kscli` 是产品层:负责命令路径 map、产品 identity、README、技能 reference、发版入口
86+
- URL 集中在 `packages/runtime/src/urls.ts`(用户面控制台)和 `packages/core/src/config/schema.ts` / client 层(API)
8087

8188
### 3. 错误处理边界:CLI 不翻译服务端错误
8289

@@ -86,30 +93,22 @@ CLI 只为「自己能权威解释的错误」发出语义化信号,服务端的
8693
| ---------------------------------------------------- | -------- | ----------------------------------------------------------- |
8794
| 命令解析、缺 flag、参数校验 | **内部** | `BailianError(USAGE)` |
8895
| 文件 I/O(ENOENT/EACCES/...) | **内部** | `BailianError(GENERAL)` + errno-specific hint |
89-
| 本地 credentials 缺失(resolver/ensure-key/AK-SK 等) | **内部** | `BailianError(AUTH)` |
96+
| 本地 credentials 缺失(resolver / auth stage 等) | **内部** | `BailianError(AUTH)` |
9097
| `fetch` 自身失败(DNS/TCP/TLS/proxy) | **内部** | `BailianError(NETWORK)` + 读 `err.cause.code` 给 errno-hint |
9198
| polling 客户端超时 | **内部** | `BailianError(TIMEOUT)` |
9299
| HTTP 4xx/5xx、HTTP 200 + 业务错码、async task FAILED | **服务** | `BailianError(GENERAL)`,**message 原样透传**,不分类、不替换 |
93100

94-
不要扮演服务端错误的翻译官——我们没有最新的错误码体系认知,二次包装只会撒谎(详见 `docs/agents/error-hint-change.md` 中的反面 case)。
95-
96-
### 4. Console Gateway 命令必须声明 console 全局 flags
101+
不要扮演服务端错误的翻译官——我们没有最新的错误码体系认知,二次包装只会撒谎。
97102

98-
如果新命令使用了 `callConsoleGateway`,必须在 `options` 中添加以下三个全局 flag 的说明,以便 `--help` 中展示:
99-
100-
```ts
101-
{ flag: "--console-region <region>", description: "Console region" },
102-
{ flag: "--console-site <site>", description: "Console site: domestic, international" },
103-
{ flag: "--console-switch-agent <uid>", description: "Switch agent UID", type: "number" },
104-
```
103+
### 4. Console Gateway 命令必须声明鉴权域
105104

106-
这些 flag 已在 `GLOBAL_OPTIONS``packages/core/src/types/command.ts`)中注册,由 `loadConfig` 写入 `config.consoleRegion` / `config.consoleSite` / `config.consoleSwitchAgent``callConsoleGateway` 自动读取——命令无需手动提取或传递
105+
如果命令调用 Console Gateway,`defineCommand` 必须设置 `auth: "console"`。runtime 会基于 `CONSOLE_AUTH_FLAGS` 自动在 help 中展示 `--console-region``--console-site``--console-switch-agent``--workspace-id`,并由 `authStage` 解析/注入 console credential。命令不要重复声明这些凭证域 flag,也不要手动从 env/config 解析 token
107106

108107
## 完成改动后的快速验证
109108

110109
```sh
111110
vp check # format + lint + type check
112-
vp test # unit + e2e (e2e 需 API key)
111+
vp test # unit + e2e (真实集成需 API key / console token)
113112
```
114113

115114
## 这份指南本身怎么演化

CHANGELOG.md

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,41 @@
11
# Changelog
22

3-
All notable changes to `bailian-cli` and `bailian-cli-core` are documented here.
3+
All notable changes to the `bailian-cli` packages are documented here.
44

5-
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). The `bailian-cli`, `bailian-cli-core`, `bailian-cli-runtime`, and `bailian-cli-commands` packages share a single version number — they are always released together.
5+
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). The `bailian-cli`, `bailian-cli-core`, `bailian-cli-runtime`, `bailian-cli-commands`, and `knowledge-studio-cli` packages share a single version number.
66

77
[中文版](CHANGELOG.zh.md) · [README](README.md) · [Contributing](CONTRIBUTING.md)
88

9+
## [1.7.0] - 2026-07-09
10+
11+
### Added
12+
13+
- `bl auth login --open-api` now stores Alibaba Cloud OpenAPI AK/SK credentials for Token Plan commands; `bl auth status` reports API key, console, and OpenAPI credential state separately, and `bl auth logout --open-api` clears only OpenAPI credentials.
14+
- `kscli` help and examples now render as Knowledge Studio paths such as `kscli search`, `kscli chat`, and `kscli retrieve`, matching the standalone CLI.
15+
16+
### Changed
17+
18+
- Token Plan commands now use the shared OpenAPI AK/SK credential flow, including persisted credentials and `ALIBABA_CLOUD_ACCESS_KEY_ID` / `ALIBABA_CLOUD_ACCESS_KEY_SECRET` environment variables.
19+
- Auth flags are now scoped to the commands that can use them. Passing model, console, or OpenAPI credential flags to the wrong command now reports an unknown flag instead of being accepted and ignored.
20+
- Help and command reference output now show only the flags that apply to each command's auth mode, making model, console, and OpenAPI credentials easier to distinguish.
21+
- Missing required flags now return usage errors with exit code 2 instead of opening interactive prompts or printing help with exit code 0.
22+
- Image, video, and speech task commands now use `--async` consistently for returning task IDs without waiting; `--concurrent` is shown only on commands that support parallel requests.
23+
- Default command output is text unless `--output json`, `DASHSCOPE_OUTPUT=json`, or config explicitly requests JSON.
24+
- Update checks are throttled to once per day and can surface in non-TTY/agent runs.
25+
- Proxy setup now reads uppercase `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` only; lowercase proxy environment variables are ignored.
26+
- `bl auth login` no longer prints the onboarding quick start block after a successful login.
27+
28+
### Removed
29+
30+
- Deprecated AK/SK authentication for `bl knowledge retrieve`; use DashScope API key auth for knowledge commands.
31+
- Removed `--no-color`, `--non-interactive`, and `--no-wait`. Use `NO_COLOR=1` for plain output and `--async` for task submission without waiting.
32+
- Removed `--yes` and interactive confirmation prompts from delete/logout commands; use `--dry-run` to preview before running destructive operations.
33+
34+
### Fixed
35+
36+
- Credential-gated `--dry-run` paths now skip auth preflight so commands such as Token Plan can print request details without configured credentials.
37+
- `--verbose` model requests again print request method, URL, auth source, and response status details.
38+
939
## [1.6.1] - 2026-07-03
1040

1141
### Changed

CHANGELOG.zh.md

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,41 @@
11
# 更新日志
22

3-
`bailian-cli` `bailian-cli-core` 的所有重要变更都记录在此
3+
`bailian-cli` 系列包的所有重要变更都记录在此
44

5-
格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/spec/v2.0.0.html)`bailian-cli``bailian-cli-core``bailian-cli-runtime``bailian-cli-commands` 共享一个版本号,总是一起发布
5+
格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/spec/v2.0.0.html)`bailian-cli``bailian-cli-core``bailian-cli-runtime``bailian-cli-commands``knowledge-studio-cli` 共享一个版本号。
66

77
[English](CHANGELOG.md) · [README](README.zh.md) · [参与贡献](CONTRIBUTING.zh.md)
88

9+
## [1.7.0] - 2026-07-09
10+
11+
### 新增
12+
13+
- `bl auth login --open-api` 现在可以保存阿里云 OpenAPI AK/SK 凭据,供 Token Plan 命令使用;`bl auth status` 会分别展示 API Key、控制台和 OpenAPI 凭据状态,`bl auth logout --open-api` 可只清除 OpenAPI 凭据。
14+
- `kscli` 的 help 与示例现在展示为 `kscli search``kscli chat``kscli retrieve` 等 Knowledge Studio 独立入口路径。
15+
16+
### 变更
17+
18+
- Token Plan 命令统一使用 OpenAPI AK/SK 凭据流程,支持登录持久化凭据和 `ALIBABA_CLOUD_ACCESS_KEY_ID` / `ALIBABA_CLOUD_ACCESS_KEY_SECRET` 环境变量。
19+
- 鉴权 flag 现在只对可使用它们的命令生效。把模型、控制台或 OpenAPI 凭据 flag 传给错误的命令时,现在会报 unknown flag,而不是接受后忽略。
20+
- help 与命令参考现在只展示当前命令鉴权域适用的 flag,更容易区分模型、控制台和 OpenAPI 凭据。
21+
- 缺少必填 flag 时现在返回用法错误并以退出码 2 退出,不再进入交互式补全或打印 help 后以退出码 0 退出。
22+
- 图片、视频、语音任务类命令现在统一用 `--async` 表示提交任务后不等待;`--concurrent` 只在支持并发请求的命令上展示。
23+
- 命令默认输出为文本;仅在显式设置 `--output json``DASHSCOPE_OUTPUT=json` 或配置文件要求 JSON 时输出 JSON。
24+
- 更新检查节流调整为每天一次,并可在非 TTY / agent 场景展示更新提示。
25+
- 代理配置现在只读取大写 `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY`,忽略小写代理环境变量。
26+
- `bl auth login` 成功后不再额外打印 onboarding quick start 内容。
27+
28+
### 已移除
29+
30+
- 移除 `bl knowledge retrieve` 已废弃的 AK/SK 鉴权;知识库命令请使用 DashScope API Key。
31+
- 移除 `--no-color``--non-interactive``--no-wait`。纯文本输出使用 `NO_COLOR=1`,提交任务后不等待使用 `--async`
32+
- 移除删除 / 登出类命令的 `--yes` 与交互式确认提示;执行破坏性操作前请用 `--dry-run` 预览。
33+
34+
### 修复
35+
36+
- 需要凭据的 `--dry-run` 路径现在会跳过鉴权前置检查,例如 Token Plan 可在未配置凭据时先打印请求信息。
37+
- `--verbose` 的模型请求日志恢复输出请求方法、URL、鉴权来源与响应状态等信息。
38+
939
## [1.6.1] - 2026-07-03
1040

1141
### 变更

CONTRIBUTING.md

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,7 @@ pnpm install
3333

3434
### Running the CLI from source
3535

36-
Open two terminals:
37-
3836
```bash
39-
# Terminal 1 — watch-build core
40-
pnpm dev
41-
42-
# Terminal 2 — run any bl command
4337
pnpm bl auth login --api-key sk-xxxxx
4438
pnpm bl text chat --message "hello"
4539
pnpm bl video generate --prompt "a cat walking"

CONTRIBUTING.zh.md

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,7 @@ pnpm install
3333

3434
### 从源码运行 CLI
3535

36-
开两个终端:
37-
3836
```bash
39-
# 终端 1 —— core watch 重建
40-
pnpm dev
41-
42-
# 终端 2 —— 跑任意 bl 命令
4337
pnpm bl auth login --api-key sk-xxxxx
4438
pnpm bl text chat --message "你好"
4539
pnpm bl video generate --prompt "一只走路的猫"

0 commit comments

Comments
 (0)