Skip to content

Commit b3b1a08

Browse files
committed
docs(agents): align maintenance guides with split CLI architecture
1 parent 468b4d7 commit b3b1a08

17 files changed

Lines changed: 364 additions & 293 deletions

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/rag``bailian-cli-rag`,知识库向入口;`src/main.ts` 复用 commands 并重映射为 `rag` 路径
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/rag/src/main.ts # rag 入口和命令 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``rag retrieve`
42+
- `defineCommand` 只写命令元数据与逻辑: `auth``flags``usageArgs``exampleArgs``validate``run`
43+
- `usageArgs` / `exampleArgs` 不写 `bl``rag` 前缀;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/rag`。做版本 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` / `rag` 命令名、控制台 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` / `rag` 是产品层:负责命令路径 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
## 这份指南本身怎么演化

0 commit comments

Comments
 (0)