跳到主要内容

Rabetbase CLI 风险等级(riskLevel)完全指南

本文详细讲解 Rabetbase CLI(研发态)的风险控制机制。riskLevel 是 CLI 内置的权限护栏,防止误操作导致不可逆变更(如意外部署或删除 BFF 脚本)。


什么是 riskLevel

riskLevel 是 Rabetbase CLI 的 **命令执行权限护栏 **。每个命令都有一个预设的风险等级,CLI 在执行前会比对当前配置的 riskLevel 与命令所需的风险等级——如果配置的权限不足,命令会被拦截并给出明确的错误提示。

**重要安全设计 **:

  1. riskLevel **不能通过 CLI 命令修改 **(包括 config set)。只能由人类手动编辑配置文件 .rabetbase.json 来设置。这是为了防止 AI Agent 或自动化脚本擅自提权——任何权限变更都必须是人类的主动行为。
  2. riskLevel没有环境变量控制,防止AI擅自临时修改环境变量绕过安全风控。

三级风险体系

CLI 定义了三个风险等级,从低到高依次为:

风险等级数值含义典型命令
read0只读操作,不会修改任何数据dataset list/detail、sql list/detail/exec、bff list/detail/status、api list、codegen sql/sdk、doctor、run
write1写入操作,会新增或修改数据bff new、bff pull、sql save、api pull、app add/use、config set、project init/upgrade、menu sync/update
high-risk-write2不可逆操作,覆盖或删除后无法恢复bff push(部署覆盖)、bff delete(删除脚本)

核心判断逻辑

CLI 内部使用数值比较来判断权限是否足够:

read(0)  Rabetbase CLI 默认 riskLevel 为 **high-risk-write **(不限制)。这是因为研发态面向开发者,日常需要频繁 push/delete BFF 脚本。如果你在 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 字段:

**单应用配置 **:
```json
{
"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 --code my-bff-script

输出(交互模式):

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=read 时尝试保存 SQL

rabetbase sql save --code my-sql --params {...}

输出(交互模式):

Command `rabetbase sql save` has risk level "write", which exceeds the configured riskLevel "read".
Edit the config file manually and set riskLevel to "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 级别的命令(bff pushbff delete)有额外的确认保护层。即使 riskLevel 已经设为 high-risk-write,仍然需要显式确认。

交互模式(本地终端)

rabetbase bff push --code my-bff-script

输出:

⚠  High-risk operation: rabetbase bff push
Deploy BFF script to production (overwrites existing)
Affected: code=my-bff-script
Continue? [y/N]:

输入 y 或 yes 确认执行,其他任何输入(包括直接回车)都会取消操作。

非交互模式(CI/CD、脚本、管道)

在非交互模式下,必须使用 --yes flag:

rabetbase bff push --code my-bff-script --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 --code my-bff-script --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 / validateSQL 查询查看与执行
bff list / detail / statusBFF 脚本查看
api listAPI 列表查看
codegen sql / sdk代码生成
app list / remote应用 profile 查看
config list / get查看配置
auth login浏览器登录(只读认证)
logs list查看命令日志
doctor环境诊断
run执行 package.json 脚本

write(写入,需配置 riskLevel ≥ write)

命令说明
bff new创建新 BFF 脚本
bff pull拉取 BFF 脚本到本地
sql save保存 SQL 到平台
api pull拉取 API 定义到本地
api doc生成 API 文档
app add / use / remove添加、切换、删除应用 profile
config set修改配置项
project init / upgrade项目初始化与升级迁移
menu sync / update菜单同步与更新
auth logout退出登录
logs clear清除命令日志
update升级 CLI
skill安装/管理 Skill

high-risk-write(高危,需配置 riskLevel = high-risk-write)

命令需确认支持 dry-run说明
bff push是(交互或 --yes)部署 BFF 脚本到平台(覆盖不可逆)
bff delete是(交互或 --yes)删除 BFF 脚本(不可逆)

四层安全防线总结

Rabetbase CLI 对危险操作设置了四层递进的保护机制:

第一层:riskLevel 只能手动设置 riskLevel 禁止通过 CLI 命令修改,只能由人类手动编辑 .rabetbase.json。AI Agent 和自动化脚本无法提权。这是最根本的防线。

第二层:riskLevel 拦截 配置级别的权限控制。当命令风险超过 riskLevel 时直接拒绝。适用于:所有 write 和 high-risk-write 命令。

第三层:高危确认提示 交互模式下弹出确认提示,非交互模式要求 --yes flag。适用于:bff push、bff delete。

第四层:--dry-run 预览 执行前预览完整的请求内容,不实际发送。适用于:bff push 等支持 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 new --code my-feature
rabetbase sql save --code my-query

# AI Agent 无法(prod环境 riskLevel=write 阻止):
rabetbase bff push --code my-feature # 被拦截,需人类手动改配置

场景 2:BFF 部署的完整安全流程

# 1. 人类手动将 .rabetbase.json 中 riskLevel 设为 "high-risk-write"

# 2. 查看当前 BFF 状态
rabetbase bff status --code my-feature

# 3. dry-run 预览部署
rabetbase bff push --code my-feature --dry-run

# 4. 确认无误后实际部署(交互模式下会弹出确认)
rabetbase bff push --code my-feature

场景 3:CI/CD 管道中的安全配置

# .gitlab-ci.yml
deploy:
script:
# riskLevel 已在 .rabetbase.json 中预设为 high-risk-write
# 该文件由人类审核后提交,AI Agent 无法通过 CLI 动态提权
- rabetbase bff push --code $BFF_CODE --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:bff push 和 bff delete 为什么是 high-risk-write? bff push 会直接覆盖平台上运行中的脚本,错误部署可能影响线上业务;bff delete 删除后无法恢复。这两个操作和数据库删除一样不可逆,因此设为最高风险等级。

Q:如何快速确认当前 riskLevel?

rabetbase config get --key riskLevel


关键要点

  • riskLevel 分三级:read 顶层配置 > 默认值(high-risk-write)
  • CLI 四层安全防线:手动设置 → riskLevel 拦截 → 高危确认 → dry-run 预览
  • AI Agent 场景建议生产 profile 设为 write,防止意外 push
  • CI 环境中 riskLevel 应预先在配置文件中设置好,高危操作必须带 --yes