Rabetbase CLI 风险等级(riskLevel)完全指南
本文详细讲解 Rabetbase CLI(研发态)的风险控制机制。riskLevel 是 CLI 内置的权限护栏,防止误操作导致不可逆变更(如意外部署脚本、删除数据集元数据或覆盖线上菜单资源)。
什么是 riskLevel
riskLevel 是 Rabetbase CLI 的 **命令执行权限护栏 **。每个命令都有一个预设的风险等级,CLI 在执行前会比对当前配置的 riskLevel 与命令所需的风险等级——如果配置的权限不足,命令会被拦截并给出明确的错误提示。
**重要安全设计 **:
- riskLevel **不能通过 CLI 命令修改 **(包括 config set)。只能由人类手动编辑配置文件 .rabetbase.json 来设置。这是为了防止 AI Agent 或自动化脚本擅自提权——任何权限变更都必须是人类的主动行为。
- riskLevel没有环境变量控制,防止AI擅自临时修改环境变量绕过安全风控。
三级风险体系
CLI 定义了三个风险等级,从低到高依次为:
| 风险等级 | 数值 | 含义 | 典型命令 |
|---|---|---|---|
| read | 0 | 只读操作,不会修改任何数据 | dataset list/detail、sql list/detail/exec、bff list/detail/status、api list、codegen sql/sdk、doctor、run |
| write | 1 | 写入操作,会新增或修改数据 | dataset rename/field-update/extend-update、bff create/pull、sql pull、api pull、app add/use、config set、project init/upgrade、menu sync |
| high-risk-write | 2 | 不可逆、覆盖或删除类操作 | dataset delete/link-delete、menu update、bff push/delete、sql create/push/delete、db delete、app remove |
核心判断逻辑
CLI 内部使用数值比较来判断权限是否足够:
read(0) < write(1) < high-risk-write(2)
Rabetbase CLI 默认 riskLevel 为 high-risk-write(不限制)。这是因为研发态面向开发者,日常需要频繁部署、删除或覆盖资源。如果你在 AI Agent 或 CI 场景下希望收紧权限,需要手动在配置文件中设置。
推荐配置策略:
- **本地开发(人类操作) **:不设置或设为
high-risk-write,不限制 - **AI Agent 辅助开发 **:设为
write,禁止 AI 直接 push 或 delete BFF 脚本 - **CI/CD 流水线 **:根据流程需要设置,push 需要
high-risk-write
如何设置 riskLevel
**禁止通过 CLI 修改 **:运行
rabetbase config set --key riskLevel --value write会被拒绝,CLI 会报错:"riskLevel" cannot be changed via the CLI.这是有意为之的安全限制。
唯一方式:手动编辑配置文件
打开项目根目录下的 .rabetbase.json,直接编辑 riskLevel 字段:
**单应用配置 **:
{
"appcode": "app-xxxxxxxx",
"riskLevel": "write"
}
**多应用配置 **(推荐,按环境差异化):
{
"apps": {
"prod": {
"appcode": "app-xxxxxxxx",
"env": "production",
"riskLevel": "write"
},
"daily": {
"appcode": "app-yyyyyyyy",
"env": "daily",
"riskLevel": "high-risk-write"
}
},
"defaultApp": "prod"
}
**配置优先级 **:应用 profile 中的 riskLevel > 顶层配置的 riskLevel > 默认值(默认为 high-risk-write)。推荐做法:连接生产环境的 profile 设为 write,防止 AI Agent 直接 push 到生产;本地 daily 环境设为 high-risk-write,开发不受限。
查看当前 riskLevel
rabetbase config get --key riskLevel
或查看完整配置:
rabetbase config list
权限拦截详解
场景 1:riskLevel=write 时尝试 push BFF 脚本
当 .rabetbase.json 中配置为 "riskLevel": "write" 时:
rabetbase bff push --type ENDPOINT --name myFeature
输出(交互模式):
Command `rabetbase bff push` has risk level "high-risk-write", which exceeds the configured riskLevel "write".
Edit the config file manually and set riskLevel to "high-risk-write".
需要人类手动编辑 .rabetbase.json,将 riskLevel 改为 "high-risk-write",再重新执行。
场景 2:riskLevel=write 时尝试推送 SQL
rabetbase sql push --sqlcode xxxxxxxx-xxxxxxxx
输出(交互模式):
Command `rabetbase sql push` has risk level "high-risk-write", which exceeds the configured riskLevel "write".
Edit the config file manually and set riskLevel to "high-risk-write".
场景 3:尝试通过 CLI 修改 riskLevel
rabetbase config set --key riskLevel --value high-risk-write
输出:
"riskLevel" cannot be changed via the CLI.
这是预期行为。即使 AI Agent 或自动化脚本知道了这个命令,也无法提权。只有能直接编辑文件系统的人类才能修改 riskLevel。
场景 4:riskLevel=high-risk-write 时 push BFF 脚本
当 riskLevel 足够高时,push 命令不再被 riskLevel 拦截,但会触发 **高危操作确认机制 **(详见下一节)。
高危操作确认机制
high-risk-write 级别的命令有额外的确认保护层。即使 riskLevel 已经设为 high-risk-write,仍然需要显式确认。
交互模式(本地终端)
rabetbase bff push --type ENDPOINT --name myFeature
输出:
⚠ High-risk operation: rabetbase bff push
Deploy BFF script to production (overwrites existing)
Affected: type=ENDPOINT, name=myFeature
Continue? [y/N]:
输入 y 或 yes 确认执行,其他任何输入(包括直接回车)都会取消操作。
非交互模式(CI/CD、脚本、管道)
在非交互模式下,必须使用 --yes flag:
rabetbase bff push --type ENDPOINT --name myFeature --yes
如果忘记加 --yes:
High-risk operation `rabetbase bff push` requires --yes in non-interactive mode.
触发非交互模式的条件
以下任一条件成立时,CLI 进入非交互模式:
- 使用了 --non-interactive 或 --ci flag
- 环境变量 RABETBASE_CI=true
- 环境变量 CI=true(GitHub Actions / GitLab CI 自动设置)
- stdout 不是 TTY(管道或重定向)
- stdin 不支持 raw mode
--dry-run 预览:执行前的安全网
对于支持 dry-run 的命令,可以用 --dry-run 预览将要执行的操作, **不会实际执行 **。
rabetbase bff push --type ENDPOINT --name myFeature --dry-run
输出:
{
"ok": true,
"command": "rabetbase bff push",
"risk": "high-risk-write",
"dryRun": true,
"data": {
"method": "POST",
"url": "/api/bff/deploy",
"body": { "code": "my-bff-script" }
}
}
**推荐工作流 **:先 --dry-run 预览确认参数正确,再实际执行。这在生产环境中尤为重要。
全部命令风险等级速查
read(只读,默认允许)
| 命令 | 说明 |
|---|---|
| dataset list / detail / operations / links | 数据集查看 |
| sql list / detail / exec / validate | SQL 查询查看与执行 |
| bff list / detail / status | BFF 脚本查看 |
| api list | API 列表查看 |
| codegen sql / sdk | 代码生成 |
| app list / remote | 应用 profile 查看 |
| config list / get | 查看配置 |
| auth login | 浏览器登录(只读认证) |
| logs show | 查看命令日志 |
| doctor | 环境诊断 |
| run | 执行 package.json 脚本 |
write(写入,需配置 riskLevel ≥ write)
| 命令 | 说明 |
|---|---|
| dataset rename / field-update / extend-update | 修改数据集名称、字段展示属性或顶层 extend |
| dataset link-create / link-update | 创建或更新数据集关联关系 |
| bff create | 创建新 BFF 脚本 |
| bff pull | 拉取 BFF 脚本到本地 |
| sql pull | 拉取 SQL 到本地 |
| api pull / generate | 拉取或生成 API 定义到本地 |
| api doc | 生成 API 文档 |
| app add / use | 添加、切换应用 profile |
| config set | 修改配置项 |
| project init / create / upgrade | 项目初始化、创建与升级迁移 |
| menu sync | 菜单结构同步 |
| page generate-start / sync / push | 智能列表页生成、同步和推送;generate-start 默认只预览,执行需 --apply |
| db create / update / analyze-start / analyze-cancel | 数据库连接创建、更新和分析任务控制 |
| auth logout | 退出登录 |
| logs clear | 清除命令日志 |
| update | 升级 CLI |
| skill | 安装/管理 Skill |
| issue report | 上报 CLI 问题 |
high-risk-write(高危,需配置 riskLevel = high-risk-write)
| 命令 | 需确认 | 支持 dry-run | 说明 |
|---|---|---|---|
| bff push | 是(交互或 --yes) | 是 | 部署 BFF 脚本到平台(覆盖不可逆) |
| bff delete | 是(交互或 --yes) | 否 | 删除 BFF 脚本(不可逆) |
| sql create / push / delete | 是(交互或 --yes) | 视命令而定 | 创建、覆盖或删除平台 SQL |
| dataset delete | 是(交互或 --yes) | 是 | 删除平台数据集元数据及相关页面 / 菜单记录,不删除物理表;真实删除还需 --confirm |
| dataset link-delete | 是(交互或 --yes) | 是 | 删除数据集关联关系 |
| menu update | 是(交互或 --yes) | 是 | 批量更新线上菜单 CDN 资源 |
| db delete | 是(交互或 --yes) | 视命令而定 | 删除数据库连接配置 |
| app remove | 是(交互或 --yes) | 视命令而定 | 删除本地应用 profile |
四层安全防线总结
Rabetbase CLI 对危险操作设置了四层递进的保护机制:
第一层:riskLevel 只能手动设置 riskLevel 禁止通过 CLI 命令修改,只能由人类手动编辑 .rabetbase.json。AI Agent 和自动化脚本无法提权。这是最根本的防线。
第二层:riskLevel 拦截 配置级别的权限控制。当命令风险超过 riskLevel 时直接拒绝。适用于:所有 write 和 high-risk-write 命令。
第三层:高危确认提示 交互模式下弹出确认提示,非交互模式要求 --yes flag。适用于:bff push、bff delete、dataset delete、menu update 等 high-risk-write 命令。
第四层:--dry-run 预览 执行前预览完整的请求内容,不实际发送。适用于:bff push、dataset delete、menu update 等支持 dry-run 的命令。
实战场景
场景 1:AI Agent 辅助开发(推荐配置)
// .rabetbase.json
{
"apps": {
"prod": { "appcode": "app-xxxxxxxx", "env": "production", "riskLevel": "write" },
"daily": { "appcode": "app-yyyyyyyy", "env": "daily", "riskLevel": "high-risk-write" }
},
"defaultApp": "daily"
}
# AI Agent 可以:查询、新建 BFF、拉取代码或 SQL(daily 环境不限)
rabetbase bff list
rabetbase bff create --type ENDPOINT --name myFeature
rabetbase sql pull --sqlcode xxxxxxxx-xxxxxxxx
# AI Agent 无法(prod 环境 riskLevel=write 阻止):
rabetbase bff push --type ENDPOINT --name myFeature # 被拦截,需人类手动改配置
场景 2:BFF 部署的完整安全流程
# 1. 人类手动将 .rabetbase.json 中 riskLevel 设为 "high-risk-write"
# 2. 查看当前 BFF 状态
rabetbase bff status
# 3. dry-run 预览部署
rabetbase bff push --type ENDPOINT --name myFeature --dry-run
# 4. 确认无误后实际部署(交互模式下会弹出确认)
rabetbase bff push --type ENDPOINT --name myFeature
场景 3:CI/CD 管道中的安全配置
# .gitlab-ci.yml
deploy:
script:
# riskLevel 已在 .rabetbase.json 中预设为 high-risk-write
# 该文件由人类审核后提交,AI Agent 无法通过 CLI 动态提权
- rabetbase bff push --type ENDPOINT --name "$BFF_NAME" --yes --non-interactive
CI 环境中 CI=true 由 GitLab/GitHub 自动设置,CLI 自动进入非交互模式。高危操作必须带 --yes。riskLevel 应在 CI 环境的配置文件中预先设置好,而不是在脚本中动态修改。
常见问题
Q:为什么不能通过 rabetbase config set 修改 riskLevel? 为了防止 AI Agent 或自动化脚本擅自提权。如果允许 CLI 修改,Agent 只需一行命令就能将 write 提升为 high-risk-write,绕过所有保护。强制手动编辑配置文件确保只有能直接操作文件系统的人类才能变更权限。
Q:默认的 riskLevel 是什么? 默认为 high-risk-write(不限制)。这是因为研发态面向开发者,日常需要频繁操作。如需限制,手动在配置文件中设置。
Q:AI Agent 遇到权限不足怎么办? Agent 应该提示人类手动编辑 .rabetbase.json 文件,将 riskLevel 修改为所需等级。Agent 自己不应该也没有能力修改这个配置。
Q:多应用配置中如何为不同环境设置不同 riskLevel? 在 .rabetbase.json 的 apps 中为每个 profile 单独设置。推荐生产环境 profile 设为 write,daily 环境设为 high-risk-write。
Q:哪些命令是 high-risk-write? 覆盖线上运行资源、删除平台元数据、批量更新线上菜单资源或删除本地应用 profile 的命令通常是 high-risk-write,例如 bff push/delete、sql push/delete、dataset delete/link-delete、menu update、db delete、app remove。
Q:如何快速确认当前 riskLevel?
rabetbase config get --key riskLevel
关键要点
- riskLevel 分三级:read < write < high-risk-write
- 配置优先级:应用 profile 中的 riskLevel > 顶层配置 > 默认值(high-risk-write)
- CLI 四层安全防线:手动设置 → riskLevel 拦截 → 高危确认 → dry-run 预览
- AI Agent 场景建议生产 profile 设为 write,防止意外 push
- CI 环境中 riskLevel 应预先在配置文件中设置好,高危操作必须带 --yes