Skip to content

Commit 8196f67

Browse files
Merge pull request #95 from modelstudioai/feat/cli-access-token
feat: CLI access token 自动化 + bootstrap 一键开通 + 多命名配置 + config ui
2 parents 39f9256 + 4b504a1 commit 8196f67

70 files changed

Lines changed: 4532 additions & 504 deletions

Some content is hidden

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

AGENTS.md

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -56,21 +56,22 @@ Skill / 命令手册随 `skills/bailian-cli/` 经 `npx skills add modelstudioai/
5656

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

59-
| 场景 | 何时进入 | 详见 |
60-
| -------------- | -------------------------------------------- | ------------------------------------------------------------------------ |
61-
| 命令增删改 | 增加 / 删除 / 重命名 `bl xxx` 或入口命令路径 | [docs/agents/command-add-remove.md](docs/agents/command-add-remove.md) |
62-
| E2E 测试维护 | 新增/改命令或 e2e 用例、补 help/缺参/dry-run | [docs/agents/cli-e2e-tests.md](docs/agents/cli-e2e-tests.md) |
63-
| 批量压测 | 改/跑多能力并发压测、`test:stress`、fixtures | [docs/agents/stress-batch-tests.md](docs/agents/stress-batch-tests.md) |
64-
| 选项变更 | 给已有命令加 `--flag` 或改默认值 | [docs/agents/command-flag-change.md](docs/agents/command-flag-change.md) |
65-
| 模型上下架 | 增加新模型 / 改默认模型 / 废弃旧模型 | [docs/agents/model-add-remove.md](docs/agents/model-add-remove.md) |
66-
| 错误文案变更 |`BailianError` 的 message 或 hint | [docs/agents/error-hint-change.md](docs/agents/error-hint-change.md) |
67-
| URL / 渠道变更 | 控制台域名 / 文档站 / 追踪参数 | [docs/agents/url-change.md](docs/agents/url-change.md) |
68-
| 鉴权扩展 | 加 OAuth / SSO / 换 token 来源 | [docs/agents/auth-change.md](docs/agents/auth-change.md) |
69-
| 配置项扩展 | 新 env var 或 `~/.bailian/config.json` 字段 | [docs/agents/config-add.md](docs/agents/config-add.md) |
70-
| 发布 | channel / stable 发布到 npm(CI 驱动) | [docs/agents/publish.md](docs/agents/publish.md) |
71-
| Change Log | 发版说明 / 历史版本说明 | [docs/agents/changelog-write.md](docs/agents/changelog-write.md) |
72-
| 工具链调整 | lint 规则 / 构建配置 / 依赖升级 | [docs/agents/lint-toolchain.md](docs/agents/lint-toolchain.md) |
73-
| Command Pack | 扩展包 / 白名单 / plugin 管理命令 | [docs/agents/command-pack.md](docs/agents/command-pack.md) |
59+
| 场景 | 何时进入 | 详见 |
60+
| -------------- | -------------------------------------------- | ---------------------------------------------------------------------------- |
61+
| 命令增删改 | 增加 / 删除 / 重命名 `bl xxx` 或入口命令路径 | [docs/agents/command-add-remove.md](docs/agents/command-add-remove.md) |
62+
| E2E 测试维护 | 新增/改命令或 e2e 用例、补 help/缺参/dry-run | [docs/agents/cli-e2e-tests.md](docs/agents/cli-e2e-tests.md) |
63+
| 批量压测 | 改/跑多能力并发压测、`test:stress`、fixtures | [docs/agents/stress-batch-tests.md](docs/agents/stress-batch-tests.md) |
64+
| 选项变更 | 给已有命令加 `--flag` 或改默认值 | [docs/agents/command-flag-change.md](docs/agents/command-flag-change.md) |
65+
| 模型上下架 | 增加新模型 / 改默认模型 / 废弃旧模型 | [docs/agents/model-add-remove.md](docs/agents/model-add-remove.md) |
66+
| 错误文案变更 |`BailianError` 的 message 或 hint | [docs/agents/error-hint-change.md](docs/agents/error-hint-change.md) |
67+
| URL / 渠道变更 | 控制台域名 / 文档站 / 追踪参数 | [docs/agents/url-change.md](docs/agents/url-change.md) |
68+
| 鉴权扩展 | 加 OAuth / SSO / 换 token 来源 | [docs/agents/auth-change.md](docs/agents/auth-change.md) |
69+
| 配置项扩展 | 新 env var 或 `~/.bailian/config.json` 字段 | [docs/agents/config-add.md](docs/agents/config-add.md) |
70+
| Profile / 激活 | 改命名 Profile、预设或 `active_config` | [docs/agents/config-profile-change.md](docs/agents/config-profile-change.md) |
71+
| 发布 | channel / stable 发布到 npm(CI 驱动) | [docs/agents/publish.md](docs/agents/publish.md) |
72+
| Change Log | 发版说明 / 历史版本说明 | [docs/agents/changelog-write.md](docs/agents/changelog-write.md) |
73+
| 工具链调整 | lint 规则 / 构建配置 / 依赖升级 | [docs/agents/lint-toolchain.md](docs/agents/lint-toolchain.md) |
74+
| Command Pack | 扩展包 / 白名单 / plugin 管理命令 | [docs/agents/command-pack.md](docs/agents/command-pack.md) |
7475

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

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,19 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
66

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

9+
## [1.9.0] - 2026-07-17
10+
11+
### Added
12+
13+
- **Token Plan support** — log in and call supported models directly without manually configuring the endpoint.
14+
- **Named Config Profiles** — create, switch, and manage isolated configurations; logging in to a named Profile activates it automatically.
15+
- **Console Access Token automation** — generate and automatically refresh Console Access Tokens.
16+
- **`bl workspace init`** — initialize a Bailian workspace and activate the required services in one workflow.
17+
18+
### Fixed
19+
20+
- Improved configuration safety and consistency, including secret masking and preservation of custom configuration fields.
21+
922
## [1.8.3] - 2026-07-16
1023

1124
### Fixed

CHANGELOG.zh.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,19 @@
66

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

9+
## [1.9.0] - 2026-07-17
10+
11+
### 新增
12+
13+
- **支持 Token Plan** —— 登录后即可直接调用支持的模型,无需手动配置接入地址。
14+
- **命名 Config Profile** —— 支持创建、切换和管理相互隔离的配置,登录后会自动激活当前 Profile。
15+
- **Console Access Token 自动化** —— 支持生成并自动刷新 Console Access Token。
16+
- **`bl workspace init`** —— 一站式完成百炼工作空间初始化和所需服务开通。
17+
18+
### 修复
19+
20+
- 提升配置安全性与一致性,包括密钥脱敏和自定义配置字段保留。
21+
922
## [1.8.3] - 2026-07-16
1023

1124
### 修复

docs/agents/auth-change.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,16 @@ defineCommand({ auth }) → runtime/authStage → ctx.client → command.run(ctx
3737
- `bl auth login --console` 只更新 `access_token` 以及回调携带的 console 作用域字段
3838
- `bl auth login --open-api ...` 只更新 `access_key_id` / `access_key_secret`
3939
- `bl auth logout --console` 只清 `access_token`
40-
- `bl auth logout --open-api` 只清 `access_key_id` / `access_key_secret`
40+
- `bl auth logout --open-api` 只清 `access_key_id` / `access_key_secret` / `security_token`
4141
- `bl auth logout``api_key` + `access_token` + `access_key_*`
4242

4343
解析分工:
4444

4545
- `resolveApiKey()``auth: "apiKey"` 命令;优先级 `--api-key` > `DASHSCOPE_API_KEY` > config `api_key`
46-
- `resolveModelBaseUrl()` — model base URL;优先级 `--base-url` > `DASHSCOPE_BASE_URL` > config `base_url` > `REGIONS.cn`
46+
- `resolveModelBaseUrl()` — model base URL;优先级 `--base-url` > `DASHSCOPE_BASE_URL` > config `base_url` > `REGIONS.cn`,返回前统一去除 query、fragment、尾斜杠和已知 SDK/API Base 后缀,同时保留自定义网关前缀
47+
- `--config` 只选择 config 文件 block,不提升该 block 的字段优先级;内置套餐 Profile(当前为 `token-plan`)的预设仅在登录时物化写入,运行时继续走统一的 flag > env > selected config file > 默认值
48+
- 显式 `auth login --config <name>` 在凭证验证并落盘成功后自动激活目标 Profile;未传
49+
`--config` 时继续写当前激活项,失败和 dry-run 不切换
4750
- `resolveConsole()``auth: "console"` 命令;当前 token 来自 config `access_token`,region/site/switchAgent 来自 flag > config > 默认
4851
- `resolveOpenApi()``auth: "openapi"` 命令;优先级 `--access-key-id/--access-key-secret` > `ALIBABA_CLOUD_ACCESS_KEY_ID/ALIBABA_CLOUD_ACCESS_KEY_SECRET` > config `access_key_*`。兼容读取旧字段 `openapi_access_key_*`,新写入只写短字段
4952
- `describeAuthState()``auth status` / banner / telemetry 使用的只读快照

docs/agents/cli-e2e-tests.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ describe.skipIf(<ready>)("e2e: <topic>(DashScope …)", () => {
6767
| 文本/搜索/记忆/配置 | `isDashScopeE2EReady()` |
6868
| 图像/语音 | `isBailianE2EMediaEnabled() && isDashScopeE2EReady()` |
6969
| 视频 | `isBailianE2EVideoEnabled() && isDashScopeE2EReady()` |
70+
| OpenAPI AK/SK | `isOpenApiE2EReady()``.env` 中必须同时提供完整 AK/SK) |
7071
| 视频 download/task | 另需 `BAILIAN_E2E_VIDEO_TASK_ID` |
7172
| 知识库 chat/search live | `isChatE2EReady()` / `isSearchE2EReady()``knowledge chat/search`,需 `BAILIAN_WORKSPACE_ID` + agent ID) |
7273

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# Config Profile 与激活状态变更清单
2+
3+
适用于新增 Profile 预设、修改命名 Profile 选择规则、调整 `active_config`,或新增/修改 `bl config list/use/show/ui` 等 Profile 管理能力。
4+
5+
## 1. 保持存储边界
6+
7+
- Profile 业务字段继续由 `ConfigFile` / `CONFIG_FILE_KEYS` 管理。
8+
- `active_config``config.json` 顶层元数据,不得进入命名 Profile block,也不得被 `config set` 当作普通字段写入。
9+
- 识别命名 Profile 时必须排除业务字段和顶层元数据。
10+
- 旧配置缺少 `active_config` 时继续等价于激活 `default`
11+
12+
## 2. 保持选择语义
13+
14+
```text
15+
显式 --config <name> > active_config > default
16+
```
17+
18+
- 解析阶段用局部变量保留“是否显式传入 `--config`”的信息;完成 Config 选择后不进入 `Settings`
19+
- `--config default` 必须显式选择顶层配置并绕过命名激活项。
20+
- 普通命令的显式 `--config` 只覆盖本次选择,不修改持久化激活状态;例外是
21+
`auth login --config ...`,凭证验证并落盘成功后自动激活该 Profile。
22+
- 激活状态只选择配置 block,不改变字段优先级;字段仍为 flag > env > selected config > 默认值。
23+
- Pipeline 等进程内调用链也要复用统一的 `buildSources()`,避免绕过激活状态。
24+
- Console access token 自动刷新等后台读写必须携带 `settings.configName`,不得直接读写顶层 default。
25+
26+
## 3. 保持读写命令交互一致
27+
28+
- `auth login``config set` 等写命令未传 `--config` 时修改当前激活项。
29+
- `auth login --config <name>` 显式指定不存在的 Profile 时,仅在凭证验证成功并实际落盘时
30+
创建和激活;`config set --config <name>` 可创建但不自动激活。
31+
- `config show``auth status` 和业务消费等读命令不得因为显式指定不存在的名称而创建 Profile。
32+
- `auth logout` 默认只清理当前激活项;显式 `--config` 只清理指定项。
33+
- 按凭证域退出时必须清理该域的完整字段集合,例如 OpenAPI 同时清理 AK、SK 和 STS `security_token`
34+
- 所有生产代码读取“当前配置”时优先经过 `buildSources()` 或携带解析后的 `configName`;直接调用无名称的 `readConfigFile()` / `writeConfigFile()` 只适用于明确操作顶层 default 的底层能力。
35+
36+
## 4. 保持状态一致性
37+
38+
- `config use` 只能激活已经存在的命名 Profile;`default` 始终有效。
39+
- 配置文件中的 `active_config` 指向不存在的 Profile 时返回 usage error,不静默回退。
40+
- 删除当前激活的命名 Profile 时,同一次落盘切回 `default`,不得留下悬空引用。
41+
- 配置写入继续使用临时文件 + rename,避免中断后留下半写文件。
42+
43+
## 5. 命令与展示联动
44+
45+
- 新增/重命名命令时同步 `packages/commands/src/index.ts` 和产品入口 `packages/cli/src/commands.ts`
46+
- `config list` 标识所有 Profile 与当前激活项。
47+
- `config show``auth status` 只输出本次最终选择的 `config``config_file`,不重复携带激活状态。
48+
- `config ui` 从持久化元数据读取激活项,提供显式激活操作,并在删除激活项后刷新为 `default`
49+
- `config ui` 保存时只替换 UI 管理的字段;Profile 中未展示但仍属于 `ConfigFile` 的合法字段必须保留,不能因打开并保存 UI 而丢失。
50+
- 同步 E2E topic routes、Skill setup 和自动生成 reference。
51+
52+
## 6. 最小测试矩阵
53+
54+
- 旧配置无 `active_config` -> `default`
55+
- 激活命名 Profile 后,无 `--config` 的命令选择该 Profile。
56+
- 显式命名 `--config``--config default` 均覆盖激活项且不修改磁盘状态。
57+
- 激活不存在的 Profile 失败且不写盘。
58+
- 悬空 `active_config` 明确失败。
59+
- 删除激活 Profile 后切回 `default`
60+
- 登录、退出、`config set` 分别覆盖“当前激活项”和“显式不存在名称成功后创建”。
61+
- 显式 `auth login --config <name>` 成功后激活该 Profile,失败或 dry-run 不创建、不切换;
62+
`--config default` 成功后切回 `default`
63+
- Console token 自动刷新不从其他 Profile 借用 AK/SK,也不把新 token 写入其他 Profile。
64+
- `config list/show/use/ui``auth status` 和依赖默认模型的消费命令覆盖对应 E2E。
65+
- `config ui` 覆盖保存时保留未管理字段,并继续允许空值清除 UI 管理字段。
66+
67+
## 7. 完成检查
68+
69+
```sh
70+
pnpm run sync:skill-assets
71+
vp check
72+
vp test
73+
```
74+
75+
命令 E2E 会启动本地子进程,Config UI 测试还会监听 `127.0.0.1` 临时端口;受限沙箱内出现 `EPERM` 时,需要在允许本地进程和端口的环境中复跑。

0 commit comments

Comments
 (0)