Skip to content

Commit ac4dbb9

Browse files
committed
Merge branch 'main' of github.com:modelstudioai/cli into feat/cli-access-token
2 parents 155c9dc + 0e85777 commit ac4dbb9

140 files changed

Lines changed: 5381 additions & 2564 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.

AGENTS.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,17 @@ CLI 只为「自己能权威解释的错误」发出语义化信号,服务端的
104104

105105
如果命令调用 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。
106106

107+
### 5. 禁止单字母变量命名
108+
109+
所有变量、参数、回调形参必须使用有语义的命名,不允许单字母(如 `i``m``p``t``e``s`)。具体表现:
110+
111+
- 回调参数: `.map((m) => ...)``.map((model) => ...)`, `.find((t) => ...)``.find((template) => ...)`
112+
- catch 变量: `catch (e)``catch (error)`
113+
- for-of 循环: `for (const i of items)``for (const item of items)`
114+
- 临时变量: `const s = ...``const strategy = ...`
115+
116+
例外: 仅当作用域极小(≤3 行)且语义从上下文完全明确时,可使用 `k`/`v`(Object.entries 的 key/value)。
117+
107118
## 完成改动后的快速验证
108119

109120
```sh

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ Equip your AI Agent out-of-the-box with these capabilities, composable across co
3838
- **MCP integration** — Orchestrate Bailian MCP servers: list services, inspect tools, and invoke any tool directly from the terminal
3939
- **Web search** — Real-time internet retrieval for up-to-date, accurate answers
4040
- **Model recommendation** — Describe your scenario and get best-fit model suggestions; supports scoped search, model comparison, and alternative discovery
41-
- **Fine-tuning & deployment** — Upload datasets, create SFT/LoRA/DPO/CPT jobs (`finetune create`), probe job status non-blockingly (`finetune watch`), query per-model training capability (`finetune capability`), and deploy trained models as endpoints (`deploy create`)
41+
- **Fine-tuning & deployment** — Upload datasets, create text/audio/image fine-tune jobs (`finetune text|audio|image create`; text covers SFT/LoRA/DPO/CPT), probe job status non-blockingly (`finetune watch`), query per-model training capability (`finetune capability`), and deploy trained models as endpoints (`deploy text|audio|image create`)
4242
- **Console capabilities** — Browse Bailian apps (`app list`), check free-tier quota (`usage free`), view model usage statistics (`usage stats`), manage workspaces (`workspace list`), and manage rate limits (`quota list/request/check/history`)
4343
- **Local file auto-upload** — Every URL parameter accepts a local path; uploaded to free temp storage with 48-hour validity
4444

@@ -114,10 +114,10 @@ bl auth login --console
114114

115115
# Fine-tune & deploy — a one-shot train-to-serve workflow
116116
bl dataset upload --file ./train.jsonl # Upload a .jsonl dataset (validated first)
117-
bl finetune create --model qwen3-8b --datasets ./train.jsonl --training-type sft-lora # Local paths auto-upload
117+
bl finetune text create --model qwen3-8b --datasets ./train.jsonl --training-type sft-lora # Local paths auto-upload
118118
bl finetune watch --job-id ft-xxx --output json # Non-blocking status probe (exit 0/1/3 = done/failed/running)
119119
bl finetune capability --model qwen3-8b # Which training types a model supports
120-
bl deploy create --model qwen3-8b --name my-svc --plan mu # Deploy the trained model as an endpoint
120+
bl deploy text create --model qwen3-8b --name my-svc --plan mu # Deploy the trained model as an endpoint
121121

122122
# Browse apps / free-tier quota / usage statistics / workspaces
123123
bl app list

README.zh.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ _专为 AI Agent 打造,每个命令均可作为结构化工具调用。_
3838
- **MCP 集成** — 统一调度百炼 MCP 服务:列出服务、查看工具、直接在终端调用任意工具
3939
- **联网搜索** — 实时互联网信息检索,提升回答准确性及时效性
4040
- **模型推荐** — 描述你的场景,智能推荐最适合的模型;支持限定范围搜索、模型对比和替代发现
41-
- **微调与部署** — 上传数据集、创建 SFT/LoRA/DPO/CPT 调优任务`finetune create`)、非阻塞探测任务状态(`finetune watch`)、按模型查训练能力(`finetune capability`),并把训练好的模型部署为推理服务(`deploy create`
41+
- **微调与部署** — 上传数据集、创建文本/音频/图像调优任务`finetune text|audio|image create`;文本涵盖 SFT/LoRA/DPO/CPT)、非阻塞探测任务状态(`finetune watch`)、按模型查训练能力(`finetune capability`),并把训练好的模型部署为推理服务(`deploy text|audio|image create`
4242
- **控制台能力** — 浏览百炼应用(`app list`),查询模型免费额度(`usage free`),查看模型用量统计(`usage stats`),管理业务空间(`workspace list`),管理限流与提额(`quota list/request/check/history`
4343
- **本地文件自动上传** — 所有 URL 参数同时支持本地路径,免费临时存储 48 小时
4444

@@ -112,10 +112,10 @@ bl auth login --console
112112

113113
# 微调与部署 — 从训练到服务的一站式流程
114114
bl dataset upload --file ./train.jsonl # 上传 .jsonl 数据集(先校验)
115-
bl finetune create --model qwen3-8b --datasets ./train.jsonl --training-type sft-lora # 本地路径自动上传
115+
bl finetune text create --model qwen3-8b --datasets ./train.jsonl --training-type sft-lora # 本地路径自动上传
116116
bl finetune watch --job-id ft-xxx --output json # 非阻塞状态探测(退出码 0/1/3 = 成功/失败/进行中)
117117
bl finetune capability --model qwen3-8b # 查询模型支持哪些训练方式
118-
bl deploy create --model qwen3-8b --name my-svc --plan mu # 把训练好的模型部署为推理服务
118+
bl deploy text create --model qwen3-8b --name my-svc --plan mu # 把训练好的模型部署为推理服务
119119

120120
# 浏览应用 / 免费额度 / 用量统计 / 业务空间
121121
bl app list

cli-access-token.md

Lines changed: 0 additions & 11 deletions
This file was deleted.

docs/agents/cli-e2e-tests.md

Lines changed: 70 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,86 @@
11
# CLI E2E 测试规范
22

3+
## 架构分层
4+
5+
| 层级 | 路径 | 测什么 |
6+
| --------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------- |
7+
| **共享基建** | `packages/e2e` | gating、子进程 runner、output、globalSetup(`private`,不发布) |
8+
| **命令 E2E** | `packages/commands/tests/e2e` | help、缺参、dry-run、live(gated);每用例最小路由 |
9+
| **bl smoke** | `packages/cli/tests/e2e/registry.smoke.e2e.test.ts` | 产品 map 全部 path `--help`、分组 help、根 help |
10+
| **kscli smoke** | `packages/kscli/tests/e2e/registry.smoke.e2e.test.ts` |`kscli/src/commands.ts` 推导 path/分组;identity(`--version``search --help` path) |
11+
| **runtime** | `packages/runtime/tests` | `proxy.e2e`、console 跨域 flag 拒绝 |
12+
13+
**依赖边界**`e2e``core``commands/tests``e2e` + `commands/src`;产品 tests → `e2e` + 各自 `src`**禁止**产品 import `commands/tests/**`(子进程 spawn harness 路径除外)。
14+
315
## 触发条件
416

517
- 新增/修改 `packages/commands/src/commands` 下的 command 实现
618
- 新增/修改 `packages/cli/src/commands.ts``bl` 命令路径 map
7-
- 新建或扩展 `packages/cli/tests/e2e/*.e2e.test.ts` 用例
8-
- 为命令补 help / 缺参 / dry-run / 真实集成测试
19+
- 新建或扩展 `packages/commands/tests/e2e/<topic>.e2e.test.ts`
20+
- 新增 bl 产品 path → `registry.smoke` 自动覆盖 leaf path;commands topic 测试在 `topic-routes.ts` 补最小路由
21+
22+
跑测与环境变量见 `.cursor/skills/bailian-cli-e2e/SKILL.md`
923

10-
以上情况必须同步维护 `packages/cli/tests/e2e/<topic>.e2e.test.ts`。跑测与环境变量见 `.cursor/skills/bailian-cli-e2e/SKILL.md`
24+
> **规则**:共享 command 行为在 `commands/tests/e2e`;产品 map、identity、CLI-only 命令留在对应产品 `tests/e2e`
1125
1226
## 文件与工具
1327

14-
- 路径:`packages/cli/tests/e2e/<kebab-topic>.e2e.test.ts`
15-
- 框架:`vite-plus/test`;子进程跑 CLI:`runCli` from `./helpers.ts`
28+
### commands E2E
29+
30+
- 路径:`packages/commands/tests/e2e/<kebab-topic>.e2e.test.ts`
31+
- 子进程:`runCommandE2e(routes, args)` from `./helpers.ts`(spawn `harness/main.ts``routes` 为本 topic 最小 path → export 映射)
32+
- fixtures:`packages/commands/tests/e2e/fixtures/`
33+
- 路由常量:`topic-routes.ts`(按 topic 维护,****全量产品 map)
34+
35+
### 产品 smoke
36+
37+
- bl:`runCli` from `packages/cli/tests/e2e/helpers.ts`
38+
- kscli:`runKscli` from `packages/kscli/tests/e2e/helpers.ts`
39+
40+
### 共享
41+
42+
- gating / output / runner:`e2e/gating``e2e/output``e2e/runner`
43+
- globalSetup:根 `vite.config.ts``packages/e2e/src/global-setup.ts`
1644
- 解析 JSON stdout:`parseStdoutJson`;输出目录:`makeE2eOutputDir(e2eLabelFromMetaUrl(import.meta.url))`
1745
- 长任务:`cliTimeoutPrefix()`;视频用例加 `test(..., 3_600_000)` 等显式超时
1846

1947
## 双层 describe(固定结构)
2048

2149
```ts
22-
// 1) 不 skip:分组 + --help,无密钥、无真实 API
50+
// 1) 不 skip:--help,无密钥、无真实 API(分组 help 由 bl registry.smoke 覆盖)
2351
describe("e2e: <topic>", () => {
24-
test("<group> 分组展示子命令帮助且成功退出", ...);
2552
test("<subcommand> --help 正常退出", ...);
2653
});
2754

28-
// 2) skipIf:缺参 / dry-run / 真实集成;原有集成用例放最后、勿改逻辑
55+
// 2) skipIf:缺参 / dry-run / 真实集成
2956
describe.skipIf(<ready>)("e2e: <topic>(DashScope …)", () => {
3057
test("缺少 --<flag> 时退出为用法错误 (2)", ...);
3158
test("<cmd> --dry-run ...", ...); // 若适用
3259
test("【model】真实流程", ..., LONG_TIMEOUT);
3360
});
3461
```
3562

36-
## skip 条件(helpers.ts
63+
## skip 条件(`e2e/gating`,commands helpers re-export
3764

38-
| 场景 | 条件 |
39-
| ------------------- | ----------------------------------------------------- |
40-
| 文本/搜索/记忆/配置 | `isDashScopeE2EReady()` |
41-
| 图像/语音 | `isBailianE2EMediaEnabled() && isDashScopeE2EReady()` |
42-
| 视频 | `isBailianE2EVideoEnabled() && isDashScopeE2EReady()` |
43-
| 知识库 | `isKnowledgeE2EReady()` |
44-
| 视频 download/task | 另需 `BAILIAN_E2E_VIDEO_TASK_ID` |
65+
| 场景 | 条件 |
66+
| ----------------------- | ---------------------------------------------------------------------------------------------------------- |
67+
| 文本/搜索/记忆/配置 | `isDashScopeE2EReady()` |
68+
| 图像/语音 | `isBailianE2EMediaEnabled() && isDashScopeE2EReady()` |
69+
| 视频 | `isBailianE2EVideoEnabled() && isDashScopeE2EReady()` |
70+
| 视频 download/task | 另需 `BAILIAN_E2E_VIDEO_TASK_ID` |
71+
| 知识库 chat/search live | `isChatE2EReady()` / `isSearchE2EReady()``knowledge chat/search`,需 `BAILIAN_WORKSPACE_ID` + agent ID) |
4572

4673
## 用例类型
4774

48-
1. **分组 help**`runCli(["image"])``exitCode === 0`,stdout+stderr 含子命令名
49-
2. **--help**`runCli([..., "--help"])` → stderr 含主要 flags
50-
3. **缺参**:带一个无害全局 flag(如 `--quiet`)且不传 required flag → `exitCode === 2`,stderr 匹配 `--flag|Missing required argument`
51-
4. **--dry-run**:仅当实现在联网/上传/写盘**之前**返回;断言 stdout JSON/文本,不入网
52-
5. **真实集成**:保留既有用例名称与断言;放在 skip 块**末尾**
75+
1. **--help**`runCommandE2e(ROUTES, [..., "--help"])` → stderr 含主要 flags
76+
2. **缺参**:带无害全局 flag(如 `--quiet`)且不传 required flag → `exitCode === 2`
77+
3. **--dry-run**:实现在联网/上传/写盘**之前**返回;断言 stdout JSON/文本
78+
4. **真实集成**:放在 skip 块**末尾**
79+
80+
## 增删命令同步
81+
82+
- **commands export** + **topic 路由**`topic-routes.ts` 或测试文件内 `ROUTES`)+ **产品 map**`cli/commands.ts` / `kscli/commands.ts`
83+
- 分组 help 由产品 `registry.smoke` 负责,无需在 commands 重复
5384

5485
## 安全与例外
5586

@@ -60,24 +91,36 @@ describe.skipIf(<ready>)("e2e: <topic>(DashScope …)", () => {
6091

6192
## 新增 command 检查清单
6293

63-
- [ ] `packages/commands/src/index.ts` 导出 + `packages/cli/src/commands.ts` 暴露路径 + `tests/e2e/<topic>.e2e.test.ts`(新建或扩展)
94+
- [ ] `packages/commands/src/index.ts` 导出 + `packages/cli/src/commands.ts` 暴露路径 + `topic-routes.ts` 补最小路由
95+
- [ ] `packages/commands/tests/e2e/<topic>.e2e.test.ts`(新建或扩展)
6496
- [ ] 若改了 `usageArgs` / `flags` / `exampleArgs`,跑 `pnpm --filter bailian-cli run generate:reference` 更新 `skills/bailian-cli/reference/` 并提交
65-
- [ ] 顶层:分组 help + 子命令 `--help`多子命令则各一条 help)
97+
- [ ] 子命令 `--help`分组 help 由 bl `registry.smoke` 覆盖
6698
- [ ] skip 块:每个 required flag 缺参;可 dry-run 则加一条
6799
- [ ] 至少一条真实集成(或说明为何仅 smoke);不破坏已有集成用例顺序
68-
- [ ] `pnpm test packages/cli/tests/e2e/<file>` 通过
100+
- [ ] `vp test packages/commands/tests/e2e/<file>` 通过
101+
102+
## 调试命令
103+
104+
```sh
105+
pnpm --filter bailian-cli-commands exec vp test packages/commands/tests/e2e/text-chat.e2e.test.ts
106+
pnpm --filter bailian-cli exec vp test packages/cli/tests/e2e/registry.smoke.e2e.test.ts
107+
pnpm --filter knowledge-studio-cli exec vp test packages/kscli/tests/e2e/registry.smoke.e2e.test.ts
108+
pnpm --filter bailian-cli-runtime exec vp test packages/runtime/tests/proxy.e2e.test.ts
109+
```
69110

70111
## 示例片段
71112

72113
```ts
114+
import { FOO_ROUTES } from "./topic-routes.ts";
115+
73116
test("foo bar 缺少 --prompt 时退出为用法错误 (2)", async () => {
74-
const { stderr, exitCode } = await runCli(["foo", "bar", "--quiet"]);
117+
const { stderr, exitCode } = await runCommandE2e(FOO_ROUTES, ["foo", "bar", "--quiet"]);
75118
expect(exitCode).toBe(2);
76119
expect(stderr).toMatch(/--prompt|Missing required argument/i);
77120
});
78121

79122
test("foo bar --dry-run 仅输出计划", async () => {
80-
const { stdout, stderr, exitCode } = await runCli([
123+
const { stdout, stderr, exitCode } = await runCommandE2e(FOO_ROUTES, [
81124
"foo",
82125
"bar",
83126
"--dry-run",
@@ -97,4 +140,4 @@ test("foo bar --dry-run 仅输出计划", async () => {
97140
- **E2E**:单条/少量调用、断言固定、可进 `vp test`(见上文 skip 条件)
98141
- **批量压测**`packages/cli/tests/stress/run.mjs` + `targets/*.mjs`,并发 + 报告,**仅手动** `pnpm run test:stress -- <target>`
99142

100-
勿把压测并入 E2E 或默认 CI。详见 [stress-batch-tests.md](stress-batch-tests.md)
143+
勿把压测并入 E2E 或默认 CI。详见 [stress-batch-tests.md](stress-batch-tests.md).

docs/agents/command-add-remove.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,15 +92,17 @@ packages/commands/src/index.ts
9292

9393
### D. 测试层
9494

95-
- [ ][cli-e2e-tests.md](cli-e2e-tests.md) 新建或更新 `packages/cli/tests/e2e/<topic>.e2e.test.ts`
96-
- [ ] 删除命令时一并删对应 e2e / README 示例 / reference 生成结果
97-
- [ ] 如果 shared command 在不同入口路径下复用,至少确保 `bl` 入口 e2e 覆盖;`kscli` 入口改动需补对应入口测试或手工 smoke
95+
- [ ][cli-e2e-tests.md](cli-e2e-tests.md) 新建或更新 `packages/commands/tests/e2e/<topic>.e2e.test.ts`
96+
- [ ] 同步 `packages/commands/tests/e2e/topic-routes.ts`(该 topic 的最小 path → export 映射)
97+
- [ ] bl 产品 path 变更由 `registry.smoke` 自动覆盖;kscli 变更同步 `kscli/src/commands.ts``registry.smoke`
98+
- [ ] 删除命令时一并删对应 commands e2e / README 示例 / reference / topic 路由条目
99+
- [ ] 如果 shared command 在不同入口路径下复用,至少确保 commands e2e 覆盖 `bl` path;`kscli` 入口改动需补对应 smoke 或说明不测 flat path live
98100

99101
### E. 重命名特殊处理
100102

101103
- [ ] 全仓 grep **旧命令名字符串**,确保以下位置全部更新:
102104
- `packages/cli/src/commands.ts` map key
103-
- `packages/kscli/src/main.ts` map key(如适用)
105+
- `packages/kscli/src/commands.ts` map key(如适用)
104106
- 用户可见 hint / README / tests
105107
- `skills/bailian-cli/reference/`(重建后检查并提交)
106108
- [ ] 检查 `usageArgs` / `exampleArgs` 没有硬编码旧的 `bl <path>` 前缀
@@ -111,7 +113,7 @@ packages/commands/src/index.ts
111113
pnpm run sync:skill-assets
112114
pnpm -F bailian-cli exec tsx src/main.ts <new-command> --help
113115
pnpm -F bailian-cli exec tsx src/main.ts
114-
vp test packages/cli/tests/e2e/<topic>.e2e.test.ts
116+
vp test packages/commands/tests/e2e/<topic>.e2e.test.ts
115117
```
116118

117119
如改了 `kscli` 入口:

0 commit comments

Comments
 (0)