Rabetbase CLI
前置条件: 使用任何 API 命令前,需完成认证和配置(见下方)。 资料使用: 先从意图索引定位能力,只读取当前任务直接相关的 reference。写操作、覆盖/恢复、复杂输出解析或命令契约不明确时,执行前读取对应 reference;简单只读操作可依据已确认的 CLI schema 直接完成。 命名约定: 统一使用
rabetbase <service> <command> [flags]格式。 输出格式: AI Agent 需要结构化输出时,优先--format compress(与json相同信封,单行紧凑、省 token);需要人类可读缩进时用--format json。可在json/compress上叠加--jq '<expr>'(对最终打印的整条 JSON 做 jq;二进制查找顺序为JQ_PATH→ CLI 内置 sidecar jq →PATH上的 jq,通常无需单独安装系统 jq)。不确定当前 CLI 有哪些子命令或 flags 时,先跑rabetbase schema(与--help同源的机器可读契约,无需登录)。
前置条件
- 连接配置与认证分离:首次使用先执行
rabetbase config init。交互模式选择当前已开放国家/地区;非交互模式显式传--region,未传时使用默认节点。企业独立部署优先导入lovrabet-routing/v1清单,也兼容旧扁平 Domain 文件和对应--*-domainflags。config init默认重建当前项目节点/Domain 配置,显式--global时写全局;保留 Cookie、AccessKey、format、locale 和应用绑定,但不登录、不绑定项目,随后再执行rabetbase auth login - AppCode:确保
.rabetbase.json中设置了apps(单应用自动选中;多应用再配defaultApp),或兼容读取的顶层appcode,或通过--appcode <code>/--app <name>传入。旧.lovrabet.json不会自动读取 - 配置文件:
rabetbase config init默认写当前项目.rabetbase.json,显式--global时写~/.rabetbase.json;默认节点不落冗余region。官方节点模式清理显式和遗留 Domain,独立部署模式清理旧region/Domain 后写入路由配置。完整字段说明见.rabetbase.json配置参考。当前目录应用绑定使用下方workspace init - 工作目录应用绑定:当前目录要固定使用某个应用时,使用
rabetbase workspace init --appcode <code>或rabetbase workspace use --app <name>(选型见「app vs workspace 职责边界」) - 多应用场景:一个项目有多个应用时,先
rabetbase workspace add <name> --appcode …登记各应用,再用--app <name>临时切换,或workspace use --app <name>修改当前工作目录默认应用 - 平台发现:当你不知道当前登录账号能访问哪些应用时,先
rabetbase app list --remote;它查询平台目录,不修改本地配置 - 本地配置视图:当你要确认当前项目或全局已经登记了哪些应用、默认应用是谁时,用
rabetbase app list。rabetbase app本身只显示帮助,不等价于app list - 人员目录查询:查询某租户的人员用
rabetbase tenant members-list --tenant-code <code>;查询某应用的人员及其角色归属用rabetbase app members-list --appcode <code>。两者均为只读全量查询,不提供分页、模糊搜索或写入能力。 - 本地 SQL / Backend Function 目录:新建或长期维护的源文件应落在 CLI 与
bff status/sql pull一致的路径,避免写在src/、queries/等随意目录后再迁移。- SQL:项目根
.rabetbase/sql/<appCode>/<dbName|db-<id>>/<sqlCode>_<sqlName>.sql|xml;草稿或人工兜底可放.draft.sql。sql create/sql pull/sql push/sql status默认围绕这套目录与.rabetbase/sql.lock.json工作。 - Backend Function:
.rabetbase/bff/<appCode>/...(由bff create创建或bff pull同步;与bff status/bff push扫描范围一致)。详见guides/sql-creation-workflow.md、guides/bff-creation-workflow.md。 - Instant API Policy:
.rabetbase/instant-api-policy/<appCode>/policy.json。instant-api-policy init/pull/validate/publish只读取或写入这一固定文件,不接受任意--file。
- SQL:项目根
- 运行态查数显式交接 —
rabetbase只负责 Dataset 结构与研发发布。不需要真实行数据时,lovrabetCLI 可以不装。一旦要验证真实业务行数据,必须交接给lovrabet data filter/getOne;不可用时报告阻断并提示安装lovrabetSkill 与 CLI。不要调用已移除的rabetbase data filter/getOne,也不要由本 Skill 静默安装或修复运行态 CLI。rabetbase sql exec只验证已发布 SQL,不是行数据查询的通用替代。详见guides/data-api-guidelines.md。
Skill Freshness
- 本地 repo 与 CLI 契约优先 — 若已安装的全局 skill 描述与当前仓库
skills/rabetbase/、rabetbase --help、rabetbase schema不一致,以当前仓库内容和 CLI 实际输出为准。 - 发现 skill 过期时应主动刷新 — CLI 安装和升级会自动安装同版本 Skill;若不一致已经影响当前任务判断,应执行
rabetbase cli-skill install,由最新版官方 Skills CLI 从当前 npm 包内本地源重装。 - 刷新后必须重新读取 — 刷新完成后,重新打开当前
SKILL.md与所需 reference,再继续执行任务,避免沿用旧记忆。 - 刷新失败也不能回退到旧结论 — 若安装失败,明确告诉用户“本地全局 skill 可能过期”,并继续以仓库内
skills/rabetbase/和rabetbase schema作为 source of truth。
Agent 快速执行顺序
- 判断需求类型
- Instant API 标准数据记录操作 → SDK filter/getOne/create/batchCreate/update/delete;批量更新使用
update({ id: [...] }),不存在batchUpdate() - 简单聚合且数据集是 DB_TABLE → SDK aggregate;聚合列用
aggregate[].column,不要用旧别名field - 复杂 JOIN / 数据库函数且数据集是 DB_TABLE → Custom SQL
- 图表、统计卡片或数据大屏 → 自定义页面 + ECharts;数据层根据查询复杂度选择 Dataset 或 Custom SQL
- 当前用户、角色、数据范围、外部系统、跨表事务或复杂业务编排 → Backend Function;Backend Function HOOK 可挂 DB_TABLE 或 METADATA,具体 operation 以后端返回为准
- Instant API 标准数据记录操作 → SDK filter/getOne/create/batchCreate/update/delete;批量更新使用
- 先拿元数据,再写代码
- 至少先查
rabetbase dataset detail --code xxx --format compress(或json)获取表结构 - 跨表场景还需查目标表的结构
- 写入前用
data.fields[]确认真实字段、必填字段、枚举选项;枚举/选择字段写入options[].value,不是展示label - 需要了解数据集关联关系时用
rabetbase dataset relations --format compress(或json);需要审计关系事实错误和人工复核项时用rabetbase dataset relation-audit --format compress - 需要从文本需求创建新的
METADATA数据集时,先读dataset generate-start/status,执行 preview 写出 design 文件,审阅后用generate-start --apply --design-file提交任务,再用generate-status查询到成功 - 管理物理库连接 / 测连 / 同步表结构分析时用
rabetbase db …(先db list,trace/plan id 见database-connection-workflow.md) - 研发资源保存后的增量同步由服务端自动处理;仅在管理员明确要求首次初始化、历史回填或故障恢复时读
deployment sync-all,在停止编辑的安静窗口执行;提交成功后按 jobId 查询状态,提交结果未知时用sync-jobs恢复任务事实 - DBAgent 增量分析默认先执行一次异步差异刷新:调用
db diff-refresh-start,保存 traceId,并用db diff-refresh-status查询同一任务到终态;成功后按原始意图执行db diff --all(差异表)或db tables(全部表)。无论tableCount大小都执行刷新;只有用户明确表示“不需要分析”“不刷新”或“只看现有结果”时才跳过异步刷新,并说明结果可能不是最新事实 - 需要查看全部表(含无差异表)或主动重新分析既有表时,用
db tables;它固定聚合全表分页。db diff --all只聚合全部差异分页 - DB 增量分析先对完整
toAnalyzeTables执行db analyze-batch-plan;它生成的是本地批次方案,不是服务端planId,也不会创建任务。再严格按批次顺序启动;每批独立保存planId(即analyze-start返回值),当前批次到达已知终态前不得启动下一批 - 全部批次结束后再次执行异步差异刷新并重新获取完整差异;仍未收敛时,按
database-connection-workflow.md对剩余toAnalyzeTables逐表串行重试且每表只恢复一次。仅当用户明确要求跳过分析/刷新时直接读取现有差异。状态查询失败继续使用原planId,不得重复启动任务 - 输出很大且只需子集时,在
compress/json上加--jq '.data…'缩小结果 - 需要真实业务行数据时必须交接给
lovrabet data filter/getOne;lovrabet不可用时报告阻断并提示安装 Skill 与 CLI,不要静默安装或修复,也不要用rabetbase sql exec当行数据替代,见guides/data-api-guidelines.md - 需要
src/api/api.ts/client.ts时:先rabetbase api pull --format compress取data.models、data.files、data.needsAgentMerge,再按sdk-client-generation.md更新 TypeScript。api pull默认不会覆盖已有api.ts/client.ts;只有用户明确要求放弃本地定制并完整重建时才使用--force --yes - 需要按 Dataset + API 配置 Instant API 的
allow、deny或route时,先读取rabetbase-instant-api-policy.md,只编辑固定policy.json,随后依次执行validate、publish --dry-run,经人工确认后再正式发布
- 至少先查
- SQL 工作流严格分步
- 推荐路径:查现有(
sql list/detail) 或新建(sql create) → 拉/落本地(sql pull/sql create) → 编辑同步目录文件 → 可选校验(sql validate) → 检查状态(sql status) → 先预览(sql push --dry-run/sql delete --dry-run) → 再sql push/sql delete→sql detail/sql exec验证 - 先使用
sql list/detail查找可复用的 Custom SQL;没有满足需求的资源时,按照sql-creation-workflow.md与sql-mybatis.md创建、校验、发布并验证 - 页面执行已发布的 Custom SQL 时使用
sqlCode+params;Backend Function 默认使用context.client.sql.byName(sqlName).execute({ params }),sql.execute({ sqlCode, params })仅作兼容路径
- 推荐路径:查现有(
- Backend Function 工作流严格分步
- 查现有 → 确认字段或通知配置 → 查公共函数 → 本地创建(
bff create) → 检查状态(bff status) → 先预览(--dry-run) → 再拉取/推送/删除 - 创建会发送消息通知的 Backend Function 时,先读取
backend-function.md的“消息通知扩展”契约,再执行rabetbase notification config-list --type EMAIL获取当前应用的configCode;不得猜测渠道、收件人或把密钥写进脚本 - 推送完成只代表脚本配置已同步到平台;若用户要确认最终运行效果,显式交接到运行验证(如可用的
lovrabet bff exec),不要把运行验证伪装成rabetbase已完成
- 查现有 → 确认字段或通知配置 → 查公共函数 → 本地创建(
- 页面体系选择
- 数据列表页(Data List Page)是数据集驱动的结构化页面组,用于数据查看、维护和模型验证,不等同于最终业务工作台
- 自定义页面(Custom Page)是完整代码文件驱动的独立页面,用于工作台、看板、门户和复杂业务交互;当前 React JSX 只是渲染实现,不是页面产品类型
- 图表、统计卡片和数据大屏使用自定义页面与白名单内的 ECharts
- 页面体系不明确时,先向用户确认;不要为同一目标同时创建数据列表页与自定义页面
- 数据列表页(Data List Page,page)工作流
- 工作流判断先看
guides/page-development-workflow.md page命令职责分离:page generate-start负责提交或复用任务,page generate-status负责查询任务状态,page data-list-status负责查询数据列表页事实- 数据集字段变更后同步已有数据列表页:
page sync - 页面关系绑定审计:先读
rabetbase-page-relation-binding.md,再执行page relation-audit - 遇到“关联数据带不出 / 数据列表页没有生成关联关系 / 页面关联绑定异常”类问题,固定顺序是:
dataset relations只读确认关系事实 →dataset relation-audit审计关系事实风险 →page data-list-status判断页面是否存在 →page relation-audit审计页面绑定;若关系事实本身不对,先按dataset relation-create/update/delete做--dry-run方案并等用户确认;已有页面再page sync --dry-run,无页面走page generate-start --dry-run page sync只负责同步已有数据列表页,不是数据集关系修复命令,也不能承诺自动修复所有wrong_code/wrong_label/missing- 本地 schema 开发:
page pull→ IDE 编辑 →page push - 恢复已删除页面:先读
page restore,CLI 产品类型只使用DATA_LIST|CUSTOM;默认按 ID 自动识别,存在跨类型同 ID 时显式传--page-type - 需要理解 formal schema 组件语义时,再按需阅读
knowledge/page-schema/下的 PageSchema 组件资料;不要把它与rabetbase page命令 reference 混淆
- 工作流判断先看
- 自定义页面工作流
- 自定义页面与数据列表页是两类独立页面能力,不混用两类页面的命令
- 创建、修改或发布前,必须先阅读
custom-page-workflow.md,再按其中的编排读取对应原子命令 reference - 编写 JSX、CSS 或词包前,必须阅读
generation-standards.md;选择 UI 组件时阅读components.md
- Legacy modernization / Application Blueprint 工作流
- 当用户要把无人交接老项目、外包接手项目或遗留系统翻新到 Lovrabet 体系时,先阅读
guides/legacy-application-blueprint-workflow.md - 主产物是
.rabetbase/blueprint/<appCode>/application-blueprint.md,不是直接生成或推送 SQL/Backend Function - 必须把老代码 Logic Graph 与 dbagent 已生成的 Dataset / Relations 绑定,再判断 Instant API、Custom SQL、Backend Function、Hook、COMMON 或 Java Service 落点
- 当用户要把无人交接老项目、外包接手项目或遗留系统翻新到 Lovrabet 体系时,先阅读
应用决议指引
已明确 appcode
- 用户直接给了
app-xxxx - 或当前命令已经显式传了
--appcode - 直接执行目标命令,不需要先查
rabetbase app list --remote
- 用户直接给了
已明确本地应用名
- 当前项目
.rabetbase.json已有唯一 app,或多 app 已配置defaultApp - 或用户给了
--app <name> - 先用
rabetbase app list验证本地配置,再执行目标命令
- 当前项目
只知道业务名称,不知道能访问哪个应用
- 先
rabetbase app list --remote --format compress - 从平台目录里确认当前登录账号可访问的应用
- 再决定是否需要
rabetbase workspace add/rabetbase workspace use,或临时传--appcode
- 先
不要混淆两种视图
rabetbase app list:本地配置视图,回答“当前项目/全局登记了哪些应用”rabetbase app list --remote:平台目录视图,回答“当前登录账号能访问哪些应用”
当两边不一致时
- 平台上有,本地没有:说明还没登记到本地配置,可用
rabetbase workspace add - 本地有,平台上查不到:说明当前账号可能无权限,或本地配置已过时,应先核对权限与 appcode
- 平台上有,本地没有:说明还没登记到本地配置,可用
菜单异步重新分组(menu regroup-start)
执行前先阅读 menu regroup-start 与 task status。该流程的完成口径不是“任务已提交”,而是异步重新分组任务到达明确终态:
- 先用
menu list取得精确的非 folder 叶子菜单 ID,再执行menu regroup-start --dry-run。 - 正式执行只提交一次并保存
data.task.taskId。首次回读时,data.verification.groupingApplied可能是true或"unconfirmed";未回读确认不代表任务提交失败。 - 若
data.task.status为PENDING / PROCESSING,执行返回的data.query.command;后续仍为非终态时继续查询同一个 taskId,不得再次提交regroup-start。 - 保留初始响应的
data.verification.lookupCommand。无论初始响应已是SUCCESS,还是后续task status到达SUCCESS,都必须用该命令回读最终菜单事实;回读仍未确认时只重试只读查询,不得重提regroup-start。 FAILED时报告errorMessage且不自动重提;未知状态(knownStatus=false)进入人工复核,不推断成功或失败。
数据库连接(db)
与 dataset(数据集模型) 的分工:db * 管平台登记的 物理库连接(dblink)、测连、schema 分析任务、物理表清单与差异;表字段、枚举以 dataset detail 为准,数据集关联关系优先以 dataset relations 为准,关系事实风险用 dataset relation-audit。
- 入口:先
db list取id与latestAnalysisTraceId(如有)。 - 只读常用:
db detail、db test、db tables、db diff。db tables固定聚合全部表及分析状态;db diff只读差异结果,--all只聚合全部差异分页。 - 差异刷新:
db diff-refresh-start/status。CLI 发起 DBAgent 增量分析时,无论tableCount多少或是否缺失,默认先刷新再读取差异;只有用户明确要求跳过分析/刷新时才直接读取现有结果。刷新与 schemaanalyze-*是两类任务,不得混用。 - 分析任务:
db analyze-batch-plan/analyze-start/analyze-cancel/analyze-status(服务端 plan/trace 来源见下)。 - 状态诊断边界:
analyze-status的requestedAnalysis只还原原始提交范围;hasMultipleAttempts=true只表示观察到多个执行尝试。不得据此推断尝试间连续性、实际执行范围或自动重启。 - 增量分批:先用本地只读的
db analyze-batch-plan --id <id> --tables <清单>得到确定性批次及planningEstimate;这里生成的是本地批次方案,不是服务端planId,不会创建或预留任务。再逐批调用一次analyze-start,读取真实planId与当前任务的serverEstimate;每批独立保存其返回的planId,同一 dblink 严格串行。两类估算都不得驱动超时、取消、重试、自动重启或状态判断,PENDING / RUNNING / RETRYING / CANCELING均不得推进下一批。 - 取消已有任务:只使用正在跟踪的原
planId执行analyze-cancel --plan <原 planId>;取消分支不得调用analyze-start,也不得用可能变化的latestAnalysisTraceId替换已知目标。 - 失败恢复:全部批次结束后默认再次异步刷新,再读取完整
db diff --all获取未收敛表;只有用户明确要求跳过分析/刷新时才直接读取。随后逐表串行执行analyze-start --tables <单表>,每表只恢复一次;累计原因计数只作可能不完整的参考展示。Agent 可语义理解原始errorMsg辅助解释和建议,但两者都不驱动任务状态、重提任务或收敛判断。 - ER 图引导:
db analyze-status终态成功后,检查并转述data.links.erPage;若没有data.links,补--appcode或进入已配置 app 的项目上下文后重查。 - 写入:
db create/db update默认先测试未保存配置,只有显式--skip-connection-test才跳过;db delete必须先 dry-run,执行前重新检查 DB_TABLE Dataset 依赖,有依赖即阻止且无 force。三者都支持--dry-run。 - 横切流程与 trace/plan:
database-connection-workflow.md。单命令细则见references/rabetbase-db-*.md(与仓库src/commands/db/一一对应)。
开发角色与协作者(role)
rabetbase role 只管理开发角色与开发协作者关系,输出明确包含 scope: "dev"。业务人员角色、用户组成员以及页面、菜单、数据集权限属于 lovrabet。若 lovrabet 当前 Help/Schema 尚未提供对应命令,应明确告知能力暂不可用,不得改用 rabetbase 代替,也不得跨端双写。
- 角色类型:
ADMIN/DEV/OWNER(内置)与已有CUSTOM;update/delete仅CUSTOM。当前不提供role create。 - 只读人员目录:租户全员查询用
tenant members-list;应用成员及角色归属查询用app members-list。只查看事实时不要调用role user-add/user-remove。 - 加人/移人:先
role user-resolve拿 userId,再role user-add/user-remove(high-risk-write,只改目标开发角色;OWNER 直接拒绝)。 - 查看/改/删已有组:
role list/detail/update/delete。 - 铁律:写前先读取当前角色/成员事实 →
--dry-run看data.before/after→ 高风险写显式--yes;不要用 rabetbase 修改运行态权限。
配置作用域原则(--global)
- 写操作默认当前项目(包括
config init、workspace add、config set、project create等),除非用户显式传--global。 - 不要在用户未要求时给命令加
--global** — 默认行为已是「项目优先」;只有用户明确要改全局配置或不在项目内且意图写全局时才使用。 config set:在没有项目配置文件(当前目录未解析到.rabetbase.json)且未传--global时,CLI 拒绝执行并提示使用--global或先rabetbase workspace init --appcode <code>,不会静默写入全局。project create生成的新项目.rabetbase.json只继承少量全局偏好(如cookie/locale/format/riskLevel等),不会把全局apps/defaultApp带入新项目文件;同时生成浏览器安全的src/api/sdk-config.ts与rabetbase.domain-routing.json。每个官方节点直接声明自己的第三方库 CDN 与 Lovrabet 自有资源 Domain;项目文件始终包含解析后的完整地址,企业独立部署从共用清单读取显式 CDN。两个生成文件都不下发认证配置;rabetbase run start|dev|build|preview会在执行脚本前刷新公开 Domain 快照,也可用project domain-routing-sync立即显式刷新;api pull只刷新 SDK/API 文件。api pull/api list:默认仅针对项目apps;需要合并全局已登记应用时加--global(见各命令 reference)。app list:默认展示合并后的全量;--global仅全局、--project仅项目(见rabetbase app list)。
app vs workspace 职责边界
划分轴 = 「这是关于 app 的客观事实,还是关于我当前工作环境的配置?」
app= 应用的客观事实查询:回答「我有/能访问哪些 app」和「某应用有哪些人员及角色归属」,与在哪写代码无关。只读,不承载增删。app list(本地登记视图)/app list --remote(平台可访问目录)/app members-list(应用人员)。
workspace= 配置当前工作环境用哪些 app:一切「改我的配置」的写操作都在这里。workspace init(首次绑定当前目录)/workspace use --app <name>(切换当前目录默认应用)。workspace add <name> --appcode <code>(登记应用 profile)/workspace remove <name>(移除本地 profile)。- 默认写当前项目
.rabetbase.json;--global写全局(全局视作一个大工作空间)。init/use不从全局复制 cookie/accessKey。
三入口选型(不要混用):
| 场景 | 命令 |
|---|---|
| 首次安装后的全局引导 | rabetbase config init |
| 当前目录还没绑定 app | rabetbase workspace init --appcode <code>(单应用不写 defaultApp) |
| 目录已有配置,只再登记一个 profile | rabetbase workspace add <name> --appcode <code>(从单应用变为多应用时保留原应用为默认;--global 写全局) |
| 切换当前目录默认应用 | rabetbase workspace use --app <name> |
入口判断:
- 「看有哪些 app / 平台上能访问哪些」→
app list(--remote查平台)。 - 「看某应用有哪些人员及其角色」→
app members-list --appcode <code>。 - 「看某租户有哪些人员」→
tenant members-list --tenant-code <code>。 - 「登记/删除应用 profile」→
workspace add/workspace remove(要动全局清单时加--global)。 - 「让当前目录用某应用 / 切换默认应用」→
workspace init/workspace use。
Agent 禁止行为
- 不要猜字段名 — 必须从
dataset detail返回值获取真实字段名、类型、枚举值 - 不要跳过 validate 与 dry-run — 修改已有 SQL 并准备
sql push前,必须先跑sql validate;创建 SQL 或执行高风险同步前至少确认过sql create --dry-run、sql push --dry-run或sql delete --dry-run的预览 - 不要手动拼 API URL — 所有操作通过 CLI 命令完成,不要直接调 HTTP 接口
- 不要把
sync-all当成日常发布或精确镜像 — 它只用于管理员首次初始化、历史回填或故障恢复,按源端现存记录 UPSERT,不删除目标端额外记录;在停止编辑的安静窗口执行,提交结果不确定时先用deployment sync-jobs恢复任务事实,不自动重提 - 不要向产品用户展开研发实现 — 回答角色权限操作时,不输出工程仓库、Controller、数据库表、接口路径、MR 排查或迁移过程;只说明 CLI 命令、角色边界、风险和可验证结果
- 不要臆测 sqlCode / id — 从
sql list或bff list获取真实标识 - 不要臆测 dblink id 或分析 trace/plan id — 从
db list/db detail/db analyze-start的返回字段获取(见 database-connection-workflow.md) - 只使用可见命令 — 以本 skill、
rabetbase schema、rabetbase --help中出现的命令为准;不要凭训练记忆调用未出现的旧别名 - 不要含糊处理失败 —
sql create/sql push/sql delete/bff push/bff delete返回失败时,必须明确告知用户是哪条资源失败、为什么失败 - 不要在不确认表结构时就写 SQL — 先
dataset detail,后写 SQL、Backend Function、页面…… - 不要把案例字段当通用规则 — 任何 Demo、历史项目、示例里的字段名、枚举值、表名都不能照搬;必须以当前
dataset detail为准 - 不要循环单条查询 — 用 SDK
filter + $in批量查询,不要 N+1 - 不要依赖 CLI 输出文本片段判断写入结果 — 对
dataset rename --dry-run/ 正式执行,只读取结构化 envelope 的data.*稳定字段 - 不要跳过 Dataset rename 最终线上回查 — 连续重命名后必须按 code 重新查询线上名称,不能只相信本地 plan 或 dry-run
- 不要把 MCP 工具名当 CLI 命令 — 使用
rabetbase sql list,不是list_sql_queries - 不要擅自加
--global— 见上文「配置作用域原则」;默认写项目、读合并;仅在用户明确要求或文档说明的场景使用--global。 - 不要为 Instant API Policy 传任意文件路径或写入 app-config — 策略只使用
.rabetbase/instant-api-policy/<appCode>/policy.json与独立策略接口;发布和回滚前必须校验并预览。
接口选型优先级
遇到新需求时按优先级选择实现方式:
- 标准 SDK 接口(filter/getOne/create 等)— 能用就不写 SQL
- aggregate 聚合接口 — DB_TABLE 的简单分组汇总;METADATA 不默认支持 aggregate;聚合定义使用
column指定列,field仅作为历史兼容别名 - 自定义 SQL — DB_TABLE 的复杂 JOIN、数据库函数、跨表统计;METADATA 不支持 SQL 路径
- Backend Function — 外部系统调用、跨表事务、复杂业务编排
SDK 核心规则
初始化
import { createClient } from "@lovrabet/sdk";
const client = createClient({
appCode: "your-app-code",
authMode: "client-ak", // 传 accessKey 时必须显式声明;缺省 authMode 一律走 cookie 模式,accessKey 会被忽略
accessKey: process.env.RABETBASE_ACCESS_KEY,
models: [{ tableName: "users", datasetCode: "abc123", alias: "users" }],
});
认证模式必须显式声明:
accessKey(仅 accessKey)用authMode: "client-ak";accessKey + secretKey或token的签名场景用authMode: "openapi";浏览器 Cookie 环境省略authMode(默认 cookie)。
filter 查询(最常用)
const result = await client.models.users.filter({
where: { status: { $eq: "active" } },
select: ["id", "name"],
orderBy: [{ createTime: "desc" }],
currentPage: 1,
pageSize: 20,
});
参数名强制约束:select(非 fields)、orderBy(非 sort)、currentPage/pageSize(非 page/limit)
where 条件强制使用操作符:$eq $ne $gt $lt $gte(或别名 $gteq)$lte(或别名 $lteq)$in $contain $startWith $endWith $notNull($gteq/$lteq 为后端兼容别名,映射同一 SQL,新代码推荐 $gte/$lte)
SQL 调用
页面 SDK 通过已发布 Custom SQL 的 sqlCode + params 执行查询;Backend Function 默认通过当前应用内唯一 sqlName 的 context.client.sql.byName(sqlName).execute({ params }) 执行查询,sql.execute({ sqlCode, params }) 作为兼容调用方式。
const data = await client.sql.execute<MyRow>({
sqlCode: "xxx",
params: { key: "val" },
});
if (data.execSuccess && data.execResult) {
console.log(data.execResult);
}
自定义页面需要图表时,在其 React JSX 实现中使用 ECharts 呈现;只读查询且平台 sqlCode 权限已经满足时可以直接调用上面已发布的 Custom SQL。需要基于当前用户、角色、数据范围或业务规则做额外控制时,页面改调 Backend Function,由 Backend Function 完成校验后再执行该 Custom SQL。执行失败时保留并报告原始错误,根据 SQL 资源状态、参数与权限定位问题。
Backend Function 调用
const result = await client.bff.execute<DashboardData>({
scriptName: "getUserDashboard",
params: { userId: "123" },
});
Personal Backend Function 调用
前端或 Node 服务通过 client.personal.bff.execute({ scriptId, params }) 调用 Personal Backend Function。认证方式、兼容性检查、undefined 处理和返回值约定见 typescript-sdk.md。
前端 vs Backend Function 关键差异
| 前端 SDK | Backend Function (context.client) | |
|---|---|---|
| SQL 返回值 | { execSuccess, execResult } |
直接返回数组 T[] |
| 单条查询 | getOne({ id }) |
getOne({ id }) |
| 数据集访问 | 可通过初始化/生成代码使用 alias | DB_TABLE 默认使用 models.byTable(tableName, { dblinkId? });METADATA 使用 "dataset_" + 数据集 code,DB_TABLE 也支持该兼容调用方式 |
filter() 返回 |
tableData 为列表数据 |
tableData 为列表数据,不是 list |
create() 返回 |
以 SDK 文档/类型为准 | 新记录 ID,不是完整对象 |
| SDK 初始化能力 | createClient / registerModels |
不可用;context.client 由平台注入 |
| 调 Backend Function | client.bff.execute({ scriptName, params }) |
— |
| 调 Personal Backend Function | client.personal.bff.execute({ scriptId, params }) |
— |
意图 → 命令索引
| 意图 | 推荐命令 | 备注 |
|---|---|---|
| 初始化连接配置 | rabetbase config init |
选择官方节点或导入独立部署 Domain |
| 创建新项目 | rabetbase project create |
支持新目录或当前空目录创建;完成口径与安全边界见 reference |
| 刷新项目公开 Domain 路由 | rabetbase project domain-routing-sync |
根据当前有效配置原子生成项目级 rabetbase.domain-routing.json;与前端页面路由无关 |
| 从 lovrabet-cli 迁移 | rabetbase project upgrade |
6 步自动迁移,--yes 跳过确认 |
| 老项目翻新蓝图 / Legacy Application Blueprint | guides/legacy-application-blueprint-workflow.md |
先输出 .rabetbase/blueprint/<appCode>/application-blueprint.md,把老代码逻辑与 Dataset / Relations 绑定后再生成迁移 Backlog |
| 运行 package.json 脚本 | rabetbase run <script> |
write;先审阅脚本命令体,嵌入式工具暂不开放 |
| 安装 / 重装 / 刷新 CLI Built-in Skill | rabetbase cli-skill install |
由最新版官方 Skills CLI 从当前 npm 包内本地源重装同版本 Skill;发现本地 skill 过期时优先执行 |
| 退出登录 | rabetbase auth logout |
删除本地认证 cookie |
| 绑定当前用户的钉钉沙箱账号 | rabetbase user-account dingding-sandbox-bind |
write;先 --dry-run 核对 ID,正式执行不要求 --yes;不需要 appCode |
| 诊断配置问题 | rabetbase doctor |
Built-in Skill 一致性、合并配置、各侧 JSON 语法、域名、认证状态 |
| 上报平台问题 | rabetbase issue report |
由 Skill 组织完整客观事实,禁止代替平台侧做根因判断或方案设计 |
| 上传应用文件 | rabetbase file upload |
返回可持久保存的 filePath |
| 获取文件访问链接 | rabetbase file query-url |
默认短效;Markdown/HTML URL-only 内容显式加 --long-term |
| 提取票证类业务材料的文字与结构化字段 | rabetbase ocr recognize |
发票、票据、证照等;不用于通用图片理解 |
| 导出命令契约(flags/risk 等) | rabetbase schema |
与 --help 同源;无需登录;大结果用 --format compress |
| 更新 CLI 版本 | rabetbase update |
自动检测最新版本,CLI 与 Built-in Skill 一体升级 |
| 初始化/切换当前工作目录应用 | rabetbase workspace |
写当前目录 .rabetbase.json;不从全局复制 cookie/accessKey |
| 修改配置文件 | rabetbase config set <key> <value> |
默认写项目;无项目配置且未 --global 会拒绝;--global 写 ~/.rabetbase.json |
| 列出配置 | rabetbase config list |
查看当前生效的配置 |
| 管理运行态 app-config | rabetbase app-config list/get/set/delete |
运行态 app-config 管理面;默认不输出明文 value;set 为 write,delete 保持 high-risk-write |
| 管理 Instant API 数据集访问策略 | rabetbase instant-api-policy init/current/pull/validate/publish/revisions/revision/rollback |
固定文件 .rabetbase/instant-api-policy/<appCode>/policy.json;version 是 JSON 结构版本,revision 是发布历史版本;publish/rollback 为 high-risk-write |
| 管理和检索当前研发应用的企业知识库 | rabetbase kb list/detail/search/create/update/delete |
管理仅 company scope;search 固定 Development 且仅 public/company;create/update 为 write,delete 保持 high-risk-write |
| 管理当前研发应用的 Agent context 规则 | rabetbase rule list/get/set |
RULES.md 供页面、API 等研发 Agent 使用且排除 DB Agent;DATABASE.md 仅供数据库分析时 DB Agent 使用;两者在各自流程全程参与 context;set 为 write,先 dry-run |
| 查询或管理应用级通知配置 | rabetbase notification config-list / rabetbase notification config-create / rabetbase notification config-update / rabetbase notification config-delete |
list 获取 Backend Function 所需 configCode;写入只接收单一敏感 JSON 源,先 dry-run;update/delete 必须 --yes |
| 查看线上菜单事实 / 菜单异常审计 | rabetbase menu list |
返回 DFS 事实、children/page、URL、最近更新人/时间和 snapshotHash;异常治理先读 menu-anomaly-manual-cleanup |
| 批量显示或隐藏菜单 | rabetbase menu visibility-update |
用精确 ID/path 选择目标;先 dry-run,使用 --expect-visible / --expected-count 防漂移,正式执行必须 --yes |
| 创建外部网站链接菜单 | rabetbase menu external-link-create |
write;显式选择 embedded 或 new-window,仅接受 HTTPS;建议先 dry-run,正式执行不要求 --yes |
| 原地更新既有外链 URL | rabetbase menu external-link-update |
write;精确单 ID、URL-only;必须带旧 URL 与父级断言,先 dry-run,再复用参数正式执行 |
| 修改任意类型菜单名称 | rabetbase menu rename |
精确单 ID、label-only;使用 --expect-label 防漂移,先 dry-run 并检查 before/after |
| 同步本地微前端路由到平台 | rabetbase menu sync |
扫描 src/pages 创建缺失的 procode 菜单;不上传构建产物;正式执行前先 --dry-run |
| 修改微前端菜单资源 URL | rabetbase menu asset-update |
write;用 ID/path 精确选目标或显式 --all,默认 patch 且保留加载模式,先 dry-run 再复用参数正式执行 |
| 查看/管理开发角色 | rabetbase role list/detail/update/delete |
角色类型为 ADMIN/DEV/OWNER/CUSTOM;仅 CUSTOM 可改/删;当前不提供 create;输出 scope: dev |
| 解析昵称/用户名到 userId | rabetbase role user-resolve |
基于租户成员目录;重名时列出候选 ID,再把选中的 ID 传给 role user-add/user-remove --user <id> |
| 查询租户人员列表 | rabetbase tenant members-list --tenant-code <code> |
先校验当前账号所属租户,再返回全量人员;不分页、不输出邮箱/手机号/头像 |
| 查询应用人员及角色列表 | rabetbase app members-list --appcode <code> |
按 userId 去重并聚合 roles[];角色归属输出 roleCode,同时保留 ACTIVE/PENDING 状态 |
| 把开发协作者加入/移出角色 | rabetbase role user-add / user-remove |
只改目标开发角色;OWNER 直接拒绝;high-risk-write,先 --dry-run |
| 按 ID 删除菜单或目录树 | rabetbase menu delete |
精确删除空 folder/非 folder 叶子;非空 folder 显式 --recursive,计划按叶子优先批量提交并回读 |
| 创建空菜单分组 | rabetbase menu group-create |
group 持久化为 type=folder,保留平台生成的非空 path;先 dry-run 并检查创建位置与排序 |
| 修改菜单分组排序 | rabetbase menu group-update |
目标必须为 folder;修改任意菜单类型的名称统一使用 menu rename;先 dry-run 并检查 before/after |
| 移动已有叶子菜单 | rabetbase menu move |
使用精确源 ID、目标父级 ID 和当前父级断言;逐项 dry-run 并检查写后回读 |
| 异步新建根分组 | rabetbase menu regroup-start |
write;只接收精确非 folder 叶子 ID;返回 taskId,非幂等请求不自动重提 |
| 查询通用异步任务 | rabetbase task status |
按 taskId + appCode 查询 PENDING / PROCESSING / SUCCESS / FAILED;只读,不重启业务操作 |
| 查找数据集 | rabetbase dataset list --name "xxx" |
默认返回支持的 DB_TABLE 和 METADATA 数据集;查指定来源用 --source DB_TABLE / --source METADATA;也可 --code 精确查 |
| 查看表结构和字段 | rabetbase dataset detail --code xxx |
含字段定义和操作列表 |
| 废弃数据集 | rabetbase dataset delete |
high-risk-write;默认非级联,显式 --cascade --confirm 才删除关联页;必须先 --dry-run,批量推荐 --expected-count |
| 恢复已删除数据集 | rabetbase dataset restore |
high-risk-write;按唯一回收站日志只恢复 Dataset,页面用 page restore 明确恢复;必须先 --dry-run |
| 查询用户明确删除的字段 | rabetbase dataset user-deleted-field-list |
read;只返回用户删除墓碑字段的安全投影,空列表正常成功 |
| 恢复一个用户删除字段 | rabetbase dataset field-restore |
write;先精确查询再 dry-run;只提交一个 column ID,并以恢复数量和双重回读确认;不自动同步页面 |
| 修改 Dataset 展示名 | rabetbase dataset rename |
只更新 Dataset 展示名;必须先 --dry-run,用 --expect-name 防漂移;连续重命名先读对应章节 |
| 从文本生成新 METADATA 数据集 | rabetbase dataset generate-start / generate-status |
三步:preview;审阅后提交;随后执行 data.query.command,优先按同一个 taskId 查询。PENDING/PROCESSING 非终态,未知或响应丢失不得自动重提;只在返回 createdDataset.code 后使用 Dataset |
| 安全更新 Dataset 原始字段对象 | rabetbase dataset field-update |
使用 --code 定位 Dataset,只允许 patch 已知可变业务配置字段;必须先 --dry-run,用 --expect-json 防漂移 |
| Dataset 顶层 extend 更新命令 | rabetbase dataset extend-update |
当前无可写字段;不得用于 businessGroup。业务场景分组只能使用 rabetbase dataset business-group-update |
| 发现已有业务分组 | rabetbase dataset business-groups |
read;按 --dbid 汇总 DB_TABLE Dataset,不含 METADATA;未分组桶统一显示为 ungrouped |
| 更新业务场景分组 | rabetbase dataset business-group-update |
使用 --code 定位 Dataset;DB_TABLE 与 METADATA 可设置非空分组,METADATA 可用 ungrouped 清空;必须先 --dry-run,推荐用 --expect-business-group 防漂移 |
| 查看 Dataset 操作定义 | rabetbase dataset operations --code xxx |
获取 filter/getOne/create 等参数定义 |
| 查看数据集关联关系 | rabetbase dataset relations |
标准只读入口,输出 datasetCode + field 关系事实;支持 DB_TABLE -> DB_TABLE、DB_TABLE -> METADATA、METADATA -> METADATA |
| 审计数据集关联关系 | rabetbase dataset relation-audit |
只读审计关系事实结构错误、风险和人工复核项 |
| 管理单条数据集关联关系 | rabetbase dataset relation-create/update/delete |
单条关系写入;写入前用 relations 确认 datasetCode + field 关系事实,DB_TABLE 写入所需表名来自显式参数或物理表事实 |
| 首次生成数据列表页 | rabetbase page generate-start --datasetcode <code> |
提交或复用服务端异步任务 |
| 创建自定义页面 | rabetbase page create --page-pattern BLANK --name "客户看板" |
综合操作页面优先使用 ONEPAGE,业务数据可视化使用 DASHBOARD,基础页面使用 BLANK;模板详情见 page-templates.md,也可通过 --page-dir 创建完整页面;先 dry-run |
| 查询自定义页面 | rabetbase page custom-list |
返回页面 ID、页面名称、pageUrl(查看最新保存内容)和 editPageUrl(打开编辑器) |
| 查看自定义页面详情 | rabetbase page custom-detail --id <pageId> |
查询页面详情,codeContent 包含可修改后整体提交的完整页面文件 |
| 更新自定义页面 | rabetbase page custom-update --id <pageId> --page-dir <dir> |
以最新完整页面内容为基线更新,可参考 BLANK、ONEPAGE 或 DASHBOARD 的页面和交互模式;先 dry-run |
| 发布自定义页面 | rabetbase page custom-publish --id <pageId> |
write;发布当前保存内容,先 dry-run 并审阅预览 |
| 查询数据列表页生成任务状态 | rabetbase page generate-status --datasetcode <code> --operation-id <id> |
查询 job 状态,支持 operationId / clientOperationId |
| 查询数据列表页生成任务状态 | rabetbase page generate-status --datasetcode <code> --task-id <id> |
查询 job 状态;taskId 首选,operationId/clientOperationId 兼容。成功后仍读取数据列表页事实,未知状态不得自动重提 |
| 查询数据列表页事实快照 | rabetbase page data-list-status --datasetcode <code> |
查询数据列表页四件套、残留页与菜单事实 |
| 审计数据列表页关系绑定 | rabetbase page relation-audit --datasetcode <code> |
只读检查数据列表页 options 绑定是否匹配 dataset relations |
| 同步已有数据列表页 | rabetbase page sync --datasetcode <code> |
数据集字段变更后同步到关联数据列表页 |
| 拉取数据列表页 schema 到本地 | rabetbase page pull --id <pageId> |
写入 .rabetbase/page/<appCode>/,进入本地编辑工作流 |
| 推送本地数据列表页 schema | rabetbase page push --id <pageId> |
推送后自动回拉 canonical schema 覆盖本地 |
| 恢复已删除页面 | rabetbase page restore --id <pageId> |
支持 `DATA_LIST |
| 数据库连接(dblink)/ 测连 / 结构分析 | rabetbase db list 起 |
id、trace/plan id 与“终态 + 复跑 diff”完成口径见 database-connection-workflow.md;各子命令见 references/rabetbase-db-*.md |
| 独立部署应用范围补偿同步 | rabetbase deployment sync-all |
管理员首次初始化、历史回填或故障恢复时使用;write,只提交 appCode;在停止编辑的安静窗口执行,保存 jobId 后查询状态,结果未知时用 sync-jobs 恢复任务事实,不自动重提;不是精确镜像 |
| 生成 / 更新 API 客户端代码 | rabetbase api pull → sdk-client-generation.md |
api pull 拉 Dataset 事实并刷新 sdk-config.ts;已有 api.ts/client.ts 按 guide 合并更新 |
| 查看生成的 API 模型 | rabetbase api list |
列出已生成的数据模型 |
| 查看现有 SQL | rabetbase sql list --name "xxx" |
分页,按名称过滤;默认查当前决议到的单个应用 |
| 查看 SQL 详情 | rabetbase sql detail --sqlcode xxx |
含完整 SQL 内容和参数定义 |
| 新建本地同步 SQL | rabetbase sql create --name xxx --db-id 10001 --mode sql |
先在远端创建,再落本地文件与 sql.lock.json |
| 查看本地同步状态 | rabetbase sql status |
检查 added / modified / missing / unchanged / remoteOnly |
| 拉取远端 SQL 到本地 | rabetbase sql pull |
写入 `.rabetbase/sql//<dbName |
| 推送本地 SQL 到远端 | rabetbase sql push --sqlcode xxx |
write;以 sql.lock.json 为基准上传同步目录中的本地文件 |
| 删除 SQL | rabetbase sql delete --sqlcode xxx --yes |
删除远端并将本地文件移入 .rabetbase/sql-trash/ |
| 校验 SQL 内容 | rabetbase sql validate --file xxx |
类型检测、危险语句检查、参数提取 |
| 执行 SQL 查询 | rabetbase sql exec --sqlcode xxx |
支持 --params JSON 参数 |
| 查看现有 Backend Function | rabetbase bff list |
按类型和名称过滤,支持 --app 限定应用 |
| 查看 Backend Function 详情 | rabetbase bff detail --id n |
含完整脚本内容 |
| 创建本地 Backend Function | rabetbase bff create --type ENDPOINT --name xxx |
在 .rabetbase/bff/<appCode>/... 下创建脚手架 |
| 查看 Backend Function 本地状态 | rabetbase bff status |
检查 added / modified / unchanged / remoteOnly |
| 拉取远端 Backend Function | rabetbase bff pull |
从远端同步到本地 |
| 推送本地 Backend Function | rabetbase bff push |
write;建议先 dry-run,正式执行不要求 --yes |
| 删除 Backend Function | rabetbase bff delete --yes --target xxx |
high-risk-write,删远端并清理本地 |
| 生成 SDK 代码 | rabetbase codegen sdk --code xxx |
按操作生成 TypeScript |
| 生成 SQL 调用代码 | rabetbase codegen sql --sqlcode xxx |
sdk/bff 两种 target |
| 列出已配置应用 | rabetbase app list |
默认合并视图;--global / --project 限定单层;items[].named、meta 见 reference |
| 发现平台可访问应用 | rabetbase app list --remote |
查询当前登录账号在平台上的应用目录,不修改本地配置 |
| 查询应用人员及角色归属 | rabetbase app members-list --appcode <code> |
全量只读;按 userId 去重,角色归属聚合到 roles[] |
| 查询租户人员 | rabetbase tenant members-list --tenant-code <code> |
全量只读;租户必须属于当前账号 |
| 查看 app 服务帮助 | rabetbase app |
只显示 app 子命令帮助,不等价于 app list |
| 绑定当前目录到应用 | rabetbase workspace init --appcode <code> |
首次绑定;单应用自动选中且不写 defaultApp;与只处理国家/地区及 Domain 的 config init 不同 |
| 切换当前工作目录默认应用 | rabetbase workspace use --app <name> |
持久修改当前目录 defaultApp |
| 登记应用 | rabetbase workspace add <name> --appcode <code> |
单应用不写 default;增加第二个应用时保留原应用为默认;--global 写全局 |
| 移除应用 | rabetbase workspace remove <name> |
只移除本地 profile,移除后自动切换 default |
| 临时切换应用执行 | 任何命令加 --app <name> 或 --appcode <code> |
不修改配置文件 |
| 查看配置文件格式 | .rabetbase.json 配置参考 |
完整字段、优先级、环境变量 |
命令分组
执行前必做: 从下表定位到命令后,务必先阅读对应命令的 reference 文档,再调用命令。
| 命令分组 | 说明 |
|---|---|
| Quick Start | init |
| Project | create / domain-routing-sync / upgrade |
| Workspace | workspace init / workspace use / workspace add / workspace remove |
| Run Scripts | run |
| Authentication | auth login / auth logout |
| User Accounts | dingding-sandbox-bind |
| Self Update | update |
| Schema | schema / schema export |
| Diagnostics | doctor |
| Platform Issue | report |
| File | upload / query-url |
| Configuration | config set/get/list/delete |
| Runtime App Config Management | app-config list/get/set/delete |
| Instant API Policy | instant-api-policy init/current/pull/validate/publish/revisions/revision/rollback |
| Company Knowledge Base | kb list/detail/search/create/update/delete |
| Agent Conte |
…(truncated)