@oncoding/bsteam 0.2.0
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/CHANGELOG.md +40 -0
- package/README.md +260 -0
- package/bin/argv.js +35 -0
- package/bin/dev.js +23 -0
- package/bin/run.js +25 -0
- package/bin/workspace-plugin.js +16 -0
- package/dist/auth/context-config.d.ts +91 -0
- package/dist/auth/context-config.d.ts.map +1 -0
- package/dist/auth/context-config.js +258 -0
- package/dist/auth/context-config.js.map +1 -0
- package/dist/auth/credential-store.d.ts +57 -0
- package/dist/auth/credential-store.d.ts.map +1 -0
- package/dist/auth/credential-store.js +146 -0
- package/dist/auth/credential-store.js.map +1 -0
- package/dist/base-command.d.ts +22 -0
- package/dist/base-command.d.ts.map +1 -0
- package/dist/base-command.js +33 -0
- package/dist/base-command.js.map +1 -0
- package/dist/command-utils/platform-command.d.ts +51 -0
- package/dist/command-utils/platform-command.d.ts.map +1 -0
- package/dist/command-utils/platform-command.js +178 -0
- package/dist/command-utils/platform-command.js.map +1 -0
- package/dist/commands/api.d.ts +26 -0
- package/dist/commands/api.d.ts.map +1 -0
- package/dist/commands/api.js +132 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/auth/check.d.ts +21 -0
- package/dist/commands/auth/check.d.ts.map +1 -0
- package/dist/commands/auth/check.js +57 -0
- package/dist/commands/auth/check.js.map +1 -0
- package/dist/commands/auth/list.d.ts +13 -0
- package/dist/commands/auth/list.d.ts.map +1 -0
- package/dist/commands/auth/list.js +56 -0
- package/dist/commands/auth/list.js.map +1 -0
- package/dist/commands/auth/login.d.ts +27 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +155 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +15 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +55 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/scopes.d.ts +18 -0
- package/dist/commands/auth/scopes.d.ts.map +1 -0
- package/dist/commands/auth/scopes.js +56 -0
- package/dist/commands/auth/scopes.js.map +1 -0
- package/dist/commands/auth/status.d.ts +17 -0
- package/dist/commands/auth/status.d.ts.map +1 -0
- package/dist/commands/auth/status.js +81 -0
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/auth/token/create.d.ts +22 -0
- package/dist/commands/auth/token/create.d.ts.map +1 -0
- package/dist/commands/auth/token/create.js +46 -0
- package/dist/commands/auth/token/create.js.map +1 -0
- package/dist/commands/auth/token/list.d.ts +17 -0
- package/dist/commands/auth/token/list.d.ts.map +1 -0
- package/dist/commands/auth/token/list.js +33 -0
- package/dist/commands/auth/token/list.js.map +1 -0
- package/dist/commands/auth/token/revoke.d.ts +24 -0
- package/dist/commands/auth/token/revoke.d.ts.map +1 -0
- package/dist/commands/auth/token/revoke.js +29 -0
- package/dist/commands/auth/token/revoke.js.map +1 -0
- package/dist/commands/config/show.d.ts +13 -0
- package/dist/commands/config/show.d.ts.map +1 -0
- package/dist/commands/config/show.js +34 -0
- package/dist/commands/config/show.js.map +1 -0
- package/dist/commands/kb/acl/grant.d.ts +27 -0
- package/dist/commands/kb/acl/grant.d.ts.map +1 -0
- package/dist/commands/kb/acl/grant.js +49 -0
- package/dist/commands/kb/acl/grant.js.map +1 -0
- package/dist/commands/kb/acl/list.d.ts +20 -0
- package/dist/commands/kb/acl/list.d.ts.map +1 -0
- package/dist/commands/kb/acl/list.js +35 -0
- package/dist/commands/kb/acl/list.js.map +1 -0
- package/dist/commands/kb/acl/revoke.d.ts +25 -0
- package/dist/commands/kb/acl/revoke.d.ts.map +1 -0
- package/dist/commands/kb/acl/revoke.js +27 -0
- package/dist/commands/kb/acl/revoke.js.map +1 -0
- package/dist/commands/kb/acl/update.d.ts +28 -0
- package/dist/commands/kb/acl/update.d.ts.map +1 -0
- package/dist/commands/kb/acl/update.js +40 -0
- package/dist/commands/kb/acl/update.js.map +1 -0
- package/dist/commands/kb/create.d.ts +26 -0
- package/dist/commands/kb/create.d.ts.map +1 -0
- package/dist/commands/kb/create.js +59 -0
- package/dist/commands/kb/create.js.map +1 -0
- package/dist/commands/kb/delete.d.ts +24 -0
- package/dist/commands/kb/delete.d.ts.map +1 -0
- package/dist/commands/kb/delete.js +29 -0
- package/dist/commands/kb/delete.js.map +1 -0
- package/dist/commands/kb/doctor.d.ts +17 -0
- package/dist/commands/kb/doctor.d.ts.map +1 -0
- package/dist/commands/kb/doctor.js +48 -0
- package/dist/commands/kb/doctor.js.map +1 -0
- package/dist/commands/kb/file.d.ts +23 -0
- package/dist/commands/kb/file.d.ts.map +1 -0
- package/dist/commands/kb/file.js +97 -0
- package/dist/commands/kb/file.js.map +1 -0
- package/dist/commands/kb/get.d.ts +20 -0
- package/dist/commands/kb/get.d.ts.map +1 -0
- package/dist/commands/kb/get.js +37 -0
- package/dist/commands/kb/get.js.map +1 -0
- package/dist/commands/kb/git.d.ts +20 -0
- package/dist/commands/kb/git.d.ts.map +1 -0
- package/dist/commands/kb/git.js +46 -0
- package/dist/commands/kb/git.js.map +1 -0
- package/dist/commands/kb/list.d.ts +17 -0
- package/dist/commands/kb/list.d.ts.map +1 -0
- package/dist/commands/kb/list.js +36 -0
- package/dist/commands/kb/list.js.map +1 -0
- package/dist/commands/kb/share/create.d.ts +25 -0
- package/dist/commands/kb/share/create.d.ts.map +1 -0
- package/dist/commands/kb/share/create.js +42 -0
- package/dist/commands/kb/share/create.js.map +1 -0
- package/dist/commands/kb/share/list.d.ts +20 -0
- package/dist/commands/kb/share/list.d.ts.map +1 -0
- package/dist/commands/kb/share/list.js +35 -0
- package/dist/commands/kb/share/list.js.map +1 -0
- package/dist/commands/kb/share/revoke.d.ts +25 -0
- package/dist/commands/kb/share/revoke.d.ts.map +1 -0
- package/dist/commands/kb/share/revoke.js +27 -0
- package/dist/commands/kb/share/revoke.js.map +1 -0
- package/dist/commands/kb/tree.d.ts +20 -0
- package/dist/commands/kb/tree.d.ts.map +1 -0
- package/dist/commands/kb/tree.js +39 -0
- package/dist/commands/kb/tree.js.map +1 -0
- package/dist/commands/kb/update.d.ts +29 -0
- package/dist/commands/kb/update.d.ts.map +1 -0
- package/dist/commands/kb/update.js +49 -0
- package/dist/commands/kb/update.js.map +1 -0
- package/dist/commands/reimbursement/create.d.ts +31 -0
- package/dist/commands/reimbursement/create.d.ts.map +1 -0
- package/dist/commands/reimbursement/create.js +67 -0
- package/dist/commands/reimbursement/create.js.map +1 -0
- package/dist/commands/reimbursement/delete.d.ts +24 -0
- package/dist/commands/reimbursement/delete.d.ts.map +1 -0
- package/dist/commands/reimbursement/delete.js +26 -0
- package/dist/commands/reimbursement/delete.js.map +1 -0
- package/dist/commands/reimbursement/list.d.ts +17 -0
- package/dist/commands/reimbursement/list.d.ts.map +1 -0
- package/dist/commands/reimbursement/list.js +33 -0
- package/dist/commands/reimbursement/list.js.map +1 -0
- package/dist/commands/reimbursement/operations.d.ts +17 -0
- package/dist/commands/reimbursement/operations.d.ts.map +1 -0
- package/dist/commands/reimbursement/operations.js +19 -0
- package/dist/commands/reimbursement/operations.js.map +1 -0
- package/dist/commands/reimbursement/permissions/list.d.ts +17 -0
- package/dist/commands/reimbursement/permissions/list.d.ts.map +1 -0
- package/dist/commands/reimbursement/permissions/list.js +32 -0
- package/dist/commands/reimbursement/permissions/list.js.map +1 -0
- package/dist/commands/reimbursement/permissions/replace.d.ts +22 -0
- package/dist/commands/reimbursement/permissions/replace.d.ts.map +1 -0
- package/dist/commands/reimbursement/permissions/replace.js +32 -0
- package/dist/commands/reimbursement/permissions/replace.js.map +1 -0
- package/dist/commands/reimbursement/update.d.ts +31 -0
- package/dist/commands/reimbursement/update.d.ts.map +1 -0
- package/dist/commands/reimbursement/update.js +56 -0
- package/dist/commands/reimbursement/update.js.map +1 -0
- package/dist/commands/token/create.d.ts +26 -0
- package/dist/commands/token/create.d.ts.map +1 -0
- package/dist/commands/token/create.js +52 -0
- package/dist/commands/token/create.js.map +1 -0
- package/dist/commands/token/delete.d.ts +24 -0
- package/dist/commands/token/delete.d.ts.map +1 -0
- package/dist/commands/token/delete.js +26 -0
- package/dist/commands/token/delete.js.map +1 -0
- package/dist/commands/token/list.d.ts +17 -0
- package/dist/commands/token/list.d.ts.map +1 -0
- package/dist/commands/token/list.js +33 -0
- package/dist/commands/token/list.js.map +1 -0
- package/dist/commands/token/operations.d.ts +17 -0
- package/dist/commands/token/operations.d.ts.map +1 -0
- package/dist/commands/token/operations.js +19 -0
- package/dist/commands/token/operations.js.map +1 -0
- package/dist/commands/token/permissions/list.d.ts +17 -0
- package/dist/commands/token/permissions/list.d.ts.map +1 -0
- package/dist/commands/token/permissions/list.js +32 -0
- package/dist/commands/token/permissions/list.js.map +1 -0
- package/dist/commands/token/permissions/replace.d.ts +22 -0
- package/dist/commands/token/permissions/replace.d.ts.map +1 -0
- package/dist/commands/token/permissions/replace.js +32 -0
- package/dist/commands/token/permissions/replace.js.map +1 -0
- package/dist/commands/token/precheck.d.ts +20 -0
- package/dist/commands/token/precheck.d.ts.map +1 -0
- package/dist/commands/token/precheck.js +30 -0
- package/dist/commands/token/precheck.js.map +1 -0
- package/dist/commands/token/reveal.d.ts +24 -0
- package/dist/commands/token/reveal.d.ts.map +1 -0
- package/dist/commands/token/reveal.js +29 -0
- package/dist/commands/token/reveal.js.map +1 -0
- package/dist/commands/token/update.d.ts +29 -0
- package/dist/commands/token/update.d.ts.map +1 -0
- package/dist/commands/token/update.js +47 -0
- package/dist/commands/token/update.js.map +1 -0
- package/dist/commands/version.d.ts +13 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +16 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/config/config-loader.d.ts +23 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +35 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/exit-codes.d.ts +14 -0
- package/dist/config/exit-codes.d.ts.map +1 -0
- package/dist/config/exit-codes.js +15 -0
- package/dist/config/exit-codes.js.map +1 -0
- package/dist/config/profiles.d.ts +14 -0
- package/dist/config/profiles.d.ts.map +1 -0
- package/dist/config/profiles.js +28 -0
- package/dist/config/profiles.js.map +1 -0
- package/dist/formatters/envelope.d.ts +10 -0
- package/dist/formatters/envelope.d.ts.map +1 -0
- package/dist/formatters/envelope.js +13 -0
- package/dist/formatters/envelope.js.map +1 -0
- package/dist/formatters/index.d.ts +4 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +3 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/table.d.ts +7 -0
- package/dist/formatters/table.d.ts.map +1 -0
- package/dist/formatters/table.js +17 -0
- package/dist/formatters/table.js.map +1 -0
- package/dist/hooks/init.d.ts +8 -0
- package/dist/hooks/init.d.ts.map +1 -0
- package/dist/hooks/init.js +17 -0
- package/dist/hooks/init.js.map +1 -0
- package/dist/hooks/prerun.d.ts +8 -0
- package/dist/hooks/prerun.d.ts.map +1 -0
- package/dist/hooks/prerun.js +29 -0
- package/dist/hooks/prerun.js.map +1 -0
- package/dist/http/platform-api.d.ts +48 -0
- package/dist/http/platform-api.d.ts.map +1 -0
- package/dist/http/platform-api.js +228 -0
- package/dist/http/platform-api.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/package.json +83 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
6
|
+
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
## [0.2.0] - 2026-06-23
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
- `~/.bsteam/config.json` context config — 参考 `kubectl` 的 clusters/users/contexts/currentContext 模型,支持 `--config` / `--context` 指定环境与 token。
|
|
13
|
+
- `auth login/status/check/scopes/list/logout` — 支持本机 `~/.bsteam/credentials.json` 凭证、stdin token 登录、邮箱密码换 token、capability 检查。
|
|
14
|
+
- `api <METHOD> <PATH>` — Platform API raw 调用兜底;写操作默认要求 `--dry-run` 或 `--yes`,否则 exit 10。
|
|
15
|
+
- Platform API client 与凭证解析公共导出,供 `@bsteam/cli-ops` 复用。
|
|
16
|
+
- npm 包名切换为 `@oncoding/bsteam`,终端命令仍为 `bsteam`,新增公网发布配置,并将 `auth` / `api` 注册为核心 topic。
|
|
17
|
+
- 公网安装缺少 workspace-only `@bsteam/cli-ops` 时自动跳过插件加载,避免用户态 CLI 启动失败。
|
|
18
|
+
- `auth token list/create/revoke` — 当前账号 Personal Access Token 生命周期管理,创建结果只展示一次明文。
|
|
19
|
+
- `kb` 命令组 — 支持知识库 list/get/create/update/delete/tree/file/git,以及 ACL grant/list/update/revoke 和 share create/list/revoke。
|
|
20
|
+
- `token` 命令组 — 支持 AI Token list/create/update/delete/reveal/precheck/operations 和内容权限 list/replace;`reveal` 必须显式 `--yes`。
|
|
21
|
+
- `reimbursement` 命令组 — 支持 Token 报销 list/create/update/delete/operations 和内容权限 list/replace。
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
- `auth login/list/logout/status` 优先写入和展示 context config;旧版 `credentials.json` 保留兼容读取。
|
|
25
|
+
- ExitCodes 新增 `AUTH_REQUIRED = 6`,区分未认证和依赖缺失。
|
|
26
|
+
|
|
27
|
+
## [0.1.0] - 2026-06-10
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
- oclif v4 框架骨架(BaseCommand、hooks、formatters)
|
|
31
|
+
- `config show` 命令 — 显示合并后配置
|
|
32
|
+
- `version` 命令
|
|
33
|
+
- cosmiconfig 5 层配置合并(内置 → .bsteamrc → .env.local → BSTEAM_* → CLI flags)
|
|
34
|
+
- Profile 支持(dev / staging / prod)
|
|
35
|
+
- JSON Envelope v1 输出协议({ version, ok, data, error, _notice })
|
|
36
|
+
- TTY 自动检测(TTY → 彩色表格;管道 → JSON)
|
|
37
|
+
- 标准化 Exit Codes(0/1/2/3/4/5/10/130)
|
|
38
|
+
- 高风险门禁 prerun hook
|
|
39
|
+
- 公共 API 导出供插件扩展(BaseCommand, ExitCodes, loadConfig, formatters)
|
|
40
|
+
- 编程式插件加载机制(绕过 oclif dependencies 限制)
|
package/README.md
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
# bsteam
|
|
2
|
+
|
|
3
|
+
bsteam 统一命令行入口(单入口 + 插件化)。
|
|
4
|
+
|
|
5
|
+
## 架构
|
|
6
|
+
|
|
7
|
+
- **核心(本包,npm 包名 `@oncoding/bsteam`,终端命令名 `bsteam`)**:`BaseCommand` / 配置加载(cosmiconfig + profiles)/ 本地凭证存储 / Platform API client / envelope 与 table 格式化 / 共享 `init` 与 `prerun` hooks。暴露用户态 `auth` / `kb` / `token` / `reimbursement` / `api` / `config` / `version` 命令。
|
|
8
|
+
- **运维插件 [`@bsteam/cli-ops`](../cli-ops/README.md)**:`db` / `seed` / `dev` / `sync` 命令组,仅在 monorepo workspace 内自动加载。
|
|
9
|
+
- **系统命令(后续)**:各业务域可继续按插件拆分;公开分发包不应携带 DB reset、seed clear、真实 sync 等运维后门。
|
|
10
|
+
|
|
11
|
+
`@bsteam/cli-ops` 在 monorepo 开发环境内通过 workspace sibling 自动挂载;公网安装 `@oncoding/bsteam` 时由于该插件不发布,CLI 会跳过插件加载,普通用户看不到运维命令。
|
|
12
|
+
|
|
13
|
+
## Agent 友好原则
|
|
14
|
+
|
|
15
|
+
本 CLI 参考飞书 CLI 的三层模型,但按 bsteam 当前边界收敛:
|
|
16
|
+
|
|
17
|
+
- **Shortcut / Domain 命令**:用户态平台对象命令放在核心包,例如 `kb list`、`token list`、`reimbursement list`;本地开发验收命令如 `db status`、`seed list` 由 ops 插件提供。
|
|
18
|
+
- **Auth 命令**:`auth login/status/check/scopes/list/logout` 是核心能力,面向人类和 Agent 共享。
|
|
19
|
+
- **Raw API 命令**:`api <METHOD> <PATH>` 提供兜底访问;`GET/HEAD` 可直接跑,写操作必须 `--dry-run` 或 `--yes`,否则 exit 10。
|
|
20
|
+
|
|
21
|
+
所有 Agent 场景优先使用 `--json`,失败时读取 envelope 的 `ok/error.code/error.hint`,不要解析 human 输出。
|
|
22
|
+
|
|
23
|
+
## 开发者使用
|
|
24
|
+
|
|
25
|
+
在 monorepo 内运行:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pnpm bsteam --help
|
|
29
|
+
pnpm bsteam db status # 由 @bsteam/cli-ops 提供
|
|
30
|
+
pnpm bsteam seed list # 由 @bsteam/cli-ops 提供
|
|
31
|
+
pnpm bsteam --context staging auth status
|
|
32
|
+
pnpm bsteam config show
|
|
33
|
+
pnpm bsteam version
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Auth 快速开始
|
|
37
|
+
|
|
38
|
+
CLI 采用类似 `kubectl` 的 context config:一个配置文件同时保存环境、用户、token 和当前 context。默认路径:
|
|
39
|
+
|
|
40
|
+
```text
|
|
41
|
+
~/.bsteam/config.json
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
个人中心「安全与 CLI Token」先生成个人访问令牌(PAT),再复制 CLI 登录命令。也可以手动把 PAT 从 stdin 写入指定 context:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
printf '%s' "$BSTEAM_PLATFORM_TOKEN" \
|
|
48
|
+
| bsteam auth login --context staging --api-url https://api.example.com --domain baisui-innovation --token-stdin
|
|
49
|
+
|
|
50
|
+
bsteam --context staging auth status
|
|
51
|
+
bsteam --context staging auth check foundation:members:read
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
也可以手写 config,适合 CI、Agent 沙箱和一次性 staging 验收:
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"apiVersion": "bsteam.io/v1",
|
|
59
|
+
"kind": "Config",
|
|
60
|
+
"currentContext": "staging",
|
|
61
|
+
"clusters": {
|
|
62
|
+
"staging": {
|
|
63
|
+
"server": "https://api.example.com"
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"users": {
|
|
67
|
+
"alice": {
|
|
68
|
+
"token": "bst_pat_xxx"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"contexts": {
|
|
72
|
+
"staging": {
|
|
73
|
+
"cluster": "staging",
|
|
74
|
+
"user": "alice",
|
|
75
|
+
"domain": "baisui-innovation"
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
访问解析优先级:
|
|
82
|
+
|
|
83
|
+
1. `--api-url` / `--token` / `--domain`
|
|
84
|
+
2. `BSTEAM_PLATFORM_API_URL` / `BSTEAM_PLATFORM_TOKEN` / `BSTEAM_ACTIVE_DOMAIN_ID`
|
|
85
|
+
3. `--config` / `BSTEAM_CONFIG` + `--context` / `BSTEAM_CONTEXT` 指向的 context config;未显式指定 context 时使用 `currentContext`
|
|
86
|
+
4. 旧版 `~/.bsteam/credentials.json`(兼容读取)
|
|
87
|
+
5. 本地 profile 默认值,例如 `http://localhost:13001`
|
|
88
|
+
|
|
89
|
+
配置文件以 `0600` 权限写入;CLI 输出只展示脱敏 token,`config show` 也不会打印明文 token。PAT 明文只在创建时显示一次,服务端只保存 hash、prefix、last4、过期、吊销和最近使用时间。当前 MVP 暂未接 OS keychain,后续如要面向公网分发,应再补 keychain provider。
|
|
90
|
+
|
|
91
|
+
常用命令:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
bsteam auth login --context staging --api-url https://api.example.com --token-stdin
|
|
95
|
+
bsteam auth token create --name "MacBook CLI" --expires-in-days 30
|
|
96
|
+
bsteam auth token list
|
|
97
|
+
bsteam auth token revoke <token-id> --yes
|
|
98
|
+
bsteam auth list
|
|
99
|
+
bsteam --context staging auth status
|
|
100
|
+
bsteam --config ./bsteam.config.json --context prod api GET /api/v1/auth/session
|
|
101
|
+
bsteam auth logout --context staging
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 知识库
|
|
105
|
+
|
|
106
|
+
知识库命令全部走 Platform HTTP API,适合公网 npm 安装后的普通用户和 Agent 使用,不依赖本地仓库或 DB:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
bsteam kb list
|
|
110
|
+
bsteam kb get product-handbook
|
|
111
|
+
bsteam kb create --slug product-handbook --name "Product Handbook" --visibility members_only --dry-run
|
|
112
|
+
bsteam kb update product-handbook --description "团队产品手册" --dry-run
|
|
113
|
+
bsteam kb tree product-handbook
|
|
114
|
+
bsteam kb file product-handbook README.md
|
|
115
|
+
bsteam kb git product-handbook
|
|
116
|
+
bsteam kb acl grant product-handbook --principal-type user --principal-id user_123 --permission write --path "docs/*" --dry-run
|
|
117
|
+
bsteam kb acl list product-handbook
|
|
118
|
+
bsteam kb share create product-handbook --path "docs/intro.md" --expires-in-hours 24 --dry-run
|
|
119
|
+
bsteam kb delete product-handbook --yes
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
`kb file` 默认读取渲染/元数据接口;需要原始内容时传 `--raw`。二进制文件应使用 `--output <path>`,避免把不可读内容写入终端。
|
|
123
|
+
|
|
124
|
+
## 我的 Token 与报销
|
|
125
|
+
|
|
126
|
+
`token` 对应 AI Token Vault 的“我的 Token”,默认列表只展示脱敏值。创建或更新密钥时优先从 stdin 或 `--data-file` 输入,避免明文进入 shell history:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
printf '%s' "$OPENAI_API_KEY" \
|
|
130
|
+
| bsteam token create --api-key-stdin --platform-code openai --platform-name OpenAI --models gpt-4.1,gpt-4.1-mini
|
|
131
|
+
|
|
132
|
+
bsteam token list
|
|
133
|
+
bsteam token operations
|
|
134
|
+
bsteam token precheck --rows-file ./tokens.import.json
|
|
135
|
+
bsteam token reveal <token-id> --yes
|
|
136
|
+
bsteam token delete <token-id> --yes
|
|
137
|
+
bsteam token permissions list
|
|
138
|
+
bsteam token permissions replace --policies-file ./token-policies.json --dry-run
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
`token reveal` 是唯一会显式打印 AI Token 明文的命令,必须传 `--yes`。dry-run 和错误预览会自动脱敏 `api_key` / `token` / `secret` 等字段。
|
|
142
|
+
|
|
143
|
+
Token 报销命令同样只走服务端权限和审计链路:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
bsteam reimbursement list
|
|
147
|
+
bsteam reimbursement create --payment-date 2026-06-23 --category api-usage --platform-code openai --amount 120.50 --status submitted --dry-run
|
|
148
|
+
bsteam reimbursement update <id> --status approved --dry-run
|
|
149
|
+
bsteam reimbursement delete <id> --yes
|
|
150
|
+
bsteam reimbursement permissions list
|
|
151
|
+
bsteam reimbursement permissions replace --policies-file ./reimbursement-policies.json --dry-run
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Raw API
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
bsteam api GET /api/v1/auth/session
|
|
158
|
+
bsteam api GET /api/v1/platform/authz/capabilities --json
|
|
159
|
+
bsteam api POST /api/v1/account/preferences --data '{"density":"compact"}' --dry-run
|
|
160
|
+
bsteam api POST /api/v1/account/preferences --data '{"density":"compact"}' --yes
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
写操作没有 `--dry-run` 或 `--yes` 时返回 exit code `10`,供 Agent/HITL 拦截。
|
|
164
|
+
|
|
165
|
+
## 对外 API(供插件作者)
|
|
166
|
+
|
|
167
|
+
插件仅通过包顶层入口 import:
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
import {
|
|
171
|
+
BaseCommand,
|
|
172
|
+
ExitCodes,
|
|
173
|
+
loadConfig,
|
|
174
|
+
getProfile,
|
|
175
|
+
formatTable,
|
|
176
|
+
createEnvelope,
|
|
177
|
+
platformApiGet,
|
|
178
|
+
resolvePlatformApiOptions,
|
|
179
|
+
getCredential,
|
|
180
|
+
getContextCredential,
|
|
181
|
+
} from '@oncoding/bsteam';
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
完整公共 API 见 [`src/index.ts`](./src/index.ts)。
|
|
185
|
+
|
|
186
|
+
## 高风险门禁
|
|
187
|
+
|
|
188
|
+
由 `prerun` hook 检查命令 `description` 是否含「高风险」字样,结合当前 `--profile` 的 `dangerousOpsAllowed` 拦截。具体门禁参数(如 `db reset` 的三道门禁)由各命令自行实现。
|
|
189
|
+
|
|
190
|
+
被拒绝时返回 exit code `10`(`ExitCodes.DANGEROUS_REFUSED`)。
|
|
191
|
+
|
|
192
|
+
## Exit Codes
|
|
193
|
+
|
|
194
|
+
| Code | 含义 |
|
|
195
|
+
|------|------|
|
|
196
|
+
| 0 | 成功 |
|
|
197
|
+
| 1 | 一般错误 |
|
|
198
|
+
| 2 | 参数错误 |
|
|
199
|
+
| 3 | 配置错误 |
|
|
200
|
+
| 4 | 网络错误 |
|
|
201
|
+
| 5 | 依赖缺失 |
|
|
202
|
+
| 6 | 未认证 / token 无效 |
|
|
203
|
+
| 10 | 高风险操作被拒绝 |
|
|
204
|
+
| 130 | 用户中断(Ctrl+C) |
|
|
205
|
+
|
|
206
|
+
## 包结构
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
src/
|
|
210
|
+
├── base-command.ts # BaseCommand 抽象类
|
|
211
|
+
├── config/
|
|
212
|
+
│ ├── exit-codes.ts # ExitCodes 枚举
|
|
213
|
+
│ ├── config-loader.ts # cosmiconfig 5 层合并
|
|
214
|
+
│ └── profiles.ts # dev / staging / prod
|
|
215
|
+
├── auth/
|
|
216
|
+
│ ├── context-config.ts # ~/.bsteam/config.json contexts/users/clusters 存取与脱敏
|
|
217
|
+
│ └── credential-store.ts # 旧版 ~/.bsteam/credentials.json 兼容读取
|
|
218
|
+
├── http/
|
|
219
|
+
│ └── platform-api.ts # Platform API client + auth resolution
|
|
220
|
+
├── formatters/
|
|
221
|
+
│ ├── envelope.ts # JSON envelope 协议
|
|
222
|
+
│ └── table.ts # 终端表格
|
|
223
|
+
├── hooks/
|
|
224
|
+
│ ├── init.ts # TTY 检测、env 默认值
|
|
225
|
+
│ └── prerun.ts # 高风险门禁
|
|
226
|
+
├── commands/
|
|
227
|
+
│ ├── api.ts
|
|
228
|
+
│ ├── auth/
|
|
229
|
+
│ │ ├── login.ts
|
|
230
|
+
│ │ ├── status.ts
|
|
231
|
+
│ │ ├── check.ts
|
|
232
|
+
│ │ ├── scopes.ts
|
|
233
|
+
│ │ ├── list.ts
|
|
234
|
+
│ │ ├── logout.ts
|
|
235
|
+
│ │ └── token/
|
|
236
|
+
│ ├── kb/
|
|
237
|
+
│ │ ├── acl/
|
|
238
|
+
│ │ └── share/
|
|
239
|
+
│ ├── token/
|
|
240
|
+
│ │ └── permissions/
|
|
241
|
+
│ ├── reimbursement/
|
|
242
|
+
│ │ └── permissions/
|
|
243
|
+
│ ├── version.ts
|
|
244
|
+
│ └── config/show.ts
|
|
245
|
+
└── index.ts # 唯一公共导出
|
|
246
|
+
bin/
|
|
247
|
+
├── argv.js # 前置全局 flags 归一化(支持 bsteam --config x --context y auth status)
|
|
248
|
+
├── run.js # 生产入口
|
|
249
|
+
└── dev.js # ts-node 开发入口
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## 验证
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
(cd backend && pnpm --filter @oncoding/bsteam build)
|
|
256
|
+
(cd backend && pnpm --filter @oncoding/bsteam test)
|
|
257
|
+
(cd backend && pnpm --filter @oncoding/bsteam pack:check)
|
|
258
|
+
node bin/run.js --help
|
|
259
|
+
node bin/run.js --version
|
|
260
|
+
```
|
package/bin/argv.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const VALUE_FLAGS = new Set(['--config', '--context', '--profile', '--trace-id']);
|
|
2
|
+
const BOOLEAN_FLAGS = new Set(['--json']);
|
|
3
|
+
|
|
4
|
+
export function normalizeGlobalFlags(argv) {
|
|
5
|
+
const moved = [];
|
|
6
|
+
let index = 0;
|
|
7
|
+
|
|
8
|
+
while (index < argv.length) {
|
|
9
|
+
const arg = argv[index];
|
|
10
|
+
if (!arg || arg === '--') break;
|
|
11
|
+
|
|
12
|
+
const equalIndex = arg.indexOf('=');
|
|
13
|
+
const flagName = equalIndex > 0 ? arg.slice(0, equalIndex) : arg;
|
|
14
|
+
if (BOOLEAN_FLAGS.has(flagName)) {
|
|
15
|
+
moved.push(arg);
|
|
16
|
+
index += 1;
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (VALUE_FLAGS.has(flagName)) {
|
|
20
|
+
moved.push(arg);
|
|
21
|
+
if (equalIndex === -1 && index + 1 < argv.length) {
|
|
22
|
+
moved.push(argv[index + 1]);
|
|
23
|
+
index += 2;
|
|
24
|
+
} else {
|
|
25
|
+
index += 1;
|
|
26
|
+
}
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (moved.length === 0) return argv;
|
|
33
|
+
if (index >= argv.length) return argv;
|
|
34
|
+
return [...argv.slice(index), ...moved];
|
|
35
|
+
}
|
package/bin/dev.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Dev entry: uses tsx to run TypeScript source directly
|
|
4
|
+
import { Config, run, flush, handle } from '@oclif/core';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { dirname, resolve } from 'node:path';
|
|
7
|
+
import { normalizeGlobalFlags } from './argv.js';
|
|
8
|
+
import { loadWorkspacePlugin } from './workspace-plugin.js';
|
|
9
|
+
|
|
10
|
+
process.env.NODE_ENV = 'development';
|
|
11
|
+
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
+
const __dirname = dirname(__filename);
|
|
14
|
+
const cliRoot = resolve(__dirname, '..');
|
|
15
|
+
const cliOpsRoot = resolve(__dirname, '../../cli-ops');
|
|
16
|
+
|
|
17
|
+
const config = await Config.load({ root: cliRoot });
|
|
18
|
+
|
|
19
|
+
await loadWorkspacePlugin(config, { root: cliOpsRoot, name: '@bsteam/cli-ops' });
|
|
20
|
+
|
|
21
|
+
await run(normalizeGlobalFlags(process.argv.slice(2)), config)
|
|
22
|
+
.then(async () => flush())
|
|
23
|
+
.catch(async (err) => handle(err));
|
package/bin/run.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { Config, run, flush, handle } from '@oclif/core';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { dirname, resolve } from 'node:path';
|
|
6
|
+
import { normalizeGlobalFlags } from './argv.js';
|
|
7
|
+
import { loadWorkspacePlugin } from './workspace-plugin.js';
|
|
8
|
+
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = dirname(__filename);
|
|
11
|
+
const cliRoot = resolve(__dirname, '..');
|
|
12
|
+
const cliOpsRoot = resolve(__dirname, '../../cli-ops');
|
|
13
|
+
|
|
14
|
+
globalThis.oclif = globalThis.oclif ?? {};
|
|
15
|
+
globalThis.oclif.enableAutoTranspile = false;
|
|
16
|
+
|
|
17
|
+
// Load CLI config
|
|
18
|
+
const config = await Config.load({ root: cliRoot });
|
|
19
|
+
|
|
20
|
+
await loadWorkspacePlugin(config, { root: cliOpsRoot, name: '@bsteam/cli-ops' });
|
|
21
|
+
|
|
22
|
+
// Run the CLI
|
|
23
|
+
await run(normalizeGlobalFlags(process.argv.slice(2)), config)
|
|
24
|
+
.then(async () => flush())
|
|
25
|
+
.catch(async (err) => handle(err));
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { Plugin } from '@oclif/core';
|
|
4
|
+
|
|
5
|
+
export async function loadWorkspacePlugin(config, { root, name }) {
|
|
6
|
+
if (!existsSync(resolve(root, 'package.json'))) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const plugin = new Plugin({ root, type: 'core', name });
|
|
11
|
+
await plugin.load();
|
|
12
|
+
config.plugins.set(plugin.name, plugin);
|
|
13
|
+
config.loadCommands(plugin);
|
|
14
|
+
config.loadTopics(plugin);
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { type CredentialUserSnapshot } from './credential-store.js';
|
|
2
|
+
export interface BsteamClusterConfig {
|
|
3
|
+
server: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface BsteamUserConfig {
|
|
7
|
+
token?: string;
|
|
8
|
+
savedAt?: string;
|
|
9
|
+
lastVerifiedAt?: string;
|
|
10
|
+
user?: CredentialUserSnapshot;
|
|
11
|
+
capabilities?: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface BsteamContextConfig {
|
|
14
|
+
cluster: string;
|
|
15
|
+
user: string;
|
|
16
|
+
domain?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface BsteamContextConfigFile {
|
|
19
|
+
apiVersion: 'bsteam.io/v1';
|
|
20
|
+
kind: 'Config';
|
|
21
|
+
currentContext?: string;
|
|
22
|
+
clusters: Record<string, BsteamClusterConfig>;
|
|
23
|
+
users: Record<string, BsteamUserConfig>;
|
|
24
|
+
contexts: Record<string, BsteamContextConfig>;
|
|
25
|
+
}
|
|
26
|
+
export interface ResolvedContextCredential {
|
|
27
|
+
contextName: string;
|
|
28
|
+
clusterName: string;
|
|
29
|
+
userName: string;
|
|
30
|
+
apiUrl: string;
|
|
31
|
+
token?: string;
|
|
32
|
+
activeDomainId?: string;
|
|
33
|
+
savedAt?: string;
|
|
34
|
+
lastVerifiedAt?: string;
|
|
35
|
+
user?: CredentialUserSnapshot;
|
|
36
|
+
capabilities?: string[];
|
|
37
|
+
}
|
|
38
|
+
export interface ContextCredentialSummary {
|
|
39
|
+
contextName: string;
|
|
40
|
+
clusterName: string;
|
|
41
|
+
userName: string;
|
|
42
|
+
apiUrl: string;
|
|
43
|
+
tokenRedacted: string;
|
|
44
|
+
isCurrent: boolean;
|
|
45
|
+
activeDomainId?: string;
|
|
46
|
+
savedAt?: string;
|
|
47
|
+
lastVerifiedAt?: string;
|
|
48
|
+
user?: CredentialUserSnapshot;
|
|
49
|
+
capabilitiesCount?: number;
|
|
50
|
+
}
|
|
51
|
+
export interface RedactedContextConfigFile {
|
|
52
|
+
apiVersion: BsteamContextConfigFile['apiVersion'];
|
|
53
|
+
kind: BsteamContextConfigFile['kind'];
|
|
54
|
+
currentContext?: string;
|
|
55
|
+
clusters: BsteamContextConfigFile['clusters'];
|
|
56
|
+
users: Record<string, Omit<BsteamUserConfig, 'token'> & {
|
|
57
|
+
tokenRedacted: string;
|
|
58
|
+
}>;
|
|
59
|
+
contexts: BsteamContextConfigFile['contexts'];
|
|
60
|
+
}
|
|
61
|
+
export declare function getBsteamConfigFilePath(pathOverride?: string): string;
|
|
62
|
+
export declare function getDefaultContextName(): string;
|
|
63
|
+
export declare function readContextConfig(path?: string): Promise<BsteamContextConfigFile>;
|
|
64
|
+
export declare function writeContextConfig(file: BsteamContextConfigFile, path?: string): Promise<void>;
|
|
65
|
+
export declare function saveContextCredential(credential: {
|
|
66
|
+
contextName?: string;
|
|
67
|
+
clusterName?: string;
|
|
68
|
+
userName?: string;
|
|
69
|
+
apiUrl: string;
|
|
70
|
+
token: string;
|
|
71
|
+
activeDomainId?: string;
|
|
72
|
+
savedAt?: string;
|
|
73
|
+
lastVerifiedAt?: string;
|
|
74
|
+
user?: CredentialUserSnapshot;
|
|
75
|
+
capabilities?: string[];
|
|
76
|
+
}, options?: {
|
|
77
|
+
setCurrent?: boolean;
|
|
78
|
+
configPath?: string;
|
|
79
|
+
}): Promise<ResolvedContextCredential>;
|
|
80
|
+
export declare function getContextCredential(contextName?: string, configPath?: string): Promise<ResolvedContextCredential | undefined>;
|
|
81
|
+
export declare function listContextCredentials(configPath?: string): Promise<ContextCredentialSummary[]>;
|
|
82
|
+
export declare function deleteContext(contextName?: string, configPath?: string): Promise<{
|
|
83
|
+
deleted: string[];
|
|
84
|
+
currentContext?: string;
|
|
85
|
+
}>;
|
|
86
|
+
export declare function deleteAllContexts(configPath?: string): Promise<{
|
|
87
|
+
deleted: string[];
|
|
88
|
+
}>;
|
|
89
|
+
export declare function summarizeContextCredential(credential: ResolvedContextCredential, isCurrent?: boolean): ContextCredentialSummary;
|
|
90
|
+
export declare function redactContextConfig(file: BsteamContextConfigFile): RedactedContextConfigFile;
|
|
91
|
+
//# sourceMappingURL=context-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-config.d.ts","sourceRoot":"","sources":["../../src/auth/context-config.ts"],"names":[],"mappings":"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"}
|