@lovrabet/rabetbase-cli 2.4.7-beta.1 → 2.4.7
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/README.md +4 -4
- package/lib/api/api-doc.js +1 -1
- package/lib/api/fetch-model-list.js +1 -1
- package/lib/api/generate-api-file.js +1 -1
- package/lib/auth/auth-server-ui.js +1 -1
- package/lib/auth/auth-server.js +1 -1
- package/lib/auth/constant.js +1 -1
- package/lib/auth/get-cookie.js +1 -1
- package/lib/auth/get-session-user.js +1 -1
- package/lib/auth/is-session-valid.js +1 -1
- package/lib/auth/login-success-html.js +1 -1
- package/lib/auth/logout.js +1 -1
- package/lib/cli-flags.js +1 -1
- package/lib/cli.js +1 -1
- package/lib/commands/api/generate.js +1 -1
- package/lib/commands/api/index.js +1 -1
- package/lib/commands/api/list.js +1 -1
- package/lib/commands/api/pull.js +1 -1
- package/lib/commands/api/shared.js +1 -1
- package/lib/commands/app/index.js +1 -1
- package/lib/commands/app/list.js +1 -1
- package/lib/commands/app/members-list.js +1 -1
- package/lib/commands/app/remote-directory.js +1 -1
- package/lib/commands/app/shared.js +1 -1
- package/lib/commands/app-config/delete.js +1 -1
- package/lib/commands/app-config/get.js +1 -1
- package/lib/commands/app-config/index.js +1 -1
- package/lib/commands/app-config/list.js +1 -1
- package/lib/commands/app-config/set.js +1 -1
- package/lib/commands/app-config/shared.js +1 -1
- package/lib/commands/auth/index.js +1 -1
- package/lib/commands/bff/create.js +1 -1
- package/lib/commands/bff/delete.js +1 -1
- package/lib/commands/bff/detail.js +1 -1
- package/lib/commands/bff/index.js +1 -1
- package/lib/commands/bff/list.js +1 -1
- package/lib/commands/bff/pull.js +1 -1
- package/lib/commands/bff/push.js +1 -1
- package/lib/commands/bff/status.js +1 -1
- package/lib/commands/cli-skill/index.js +1 -1
- package/lib/commands/cli-update.js +1 -1
- package/lib/commands/codegen/index.js +1 -1
- package/lib/commands/codegen/sdk.js +1 -1
- package/lib/commands/codegen/sql.js +1 -1
- package/lib/commands/common/app-registry.js +1 -1
- package/lib/commands/common/app-selector.js +1 -1
- package/lib/commands/common/async-task.js +1 -1
- package/lib/commands/common/dry-run.js +1 -1
- package/lib/commands/common/flags.d.ts +1 -1
- package/lib/commands/common/flags.js +1 -1
- package/lib/commands/common/local-file.js +1 -1
- package/lib/commands/common/validate.js +1 -1
- package/lib/commands/config/get.js +1 -1
- package/lib/commands/config/index.js +1 -1
- package/lib/commands/config/list.js +1 -1
- package/lib/commands/config/set.js +1 -1
- package/lib/commands/config/shared.js +1 -1
- package/lib/commands/data/filter.js +1 -1
- package/lib/commands/data/getOne.js +1 -1
- package/lib/commands/data/index.js +1 -1
- package/lib/commands/data/shared.js +1 -1
- package/lib/commands/dataset/business-group-update.js +1 -1
- package/lib/commands/dataset/business-groups.js +1 -1
- package/lib/commands/dataset/capability.js +1 -1
- package/lib/commands/dataset/delete.js +1 -1
- package/lib/commands/dataset/detail.js +1 -1
- package/lib/commands/dataset/extend-update.js +1 -1
- package/lib/commands/dataset/field-update.js +1 -1
- package/lib/commands/dataset/generate.js +1 -1
- package/lib/commands/dataset/index.js +1 -1
- package/lib/commands/dataset/list.js +1 -1
- package/lib/commands/dataset/operations.js +1 -1
- package/lib/commands/dataset/relation-audit.js +1 -1
- package/lib/commands/dataset/relation-create.js +1 -1
- package/lib/commands/dataset/relation-delete.js +1 -1
- package/lib/commands/dataset/relation-shared.js +1 -1
- package/lib/commands/dataset/relation-update.js +1 -1
- package/lib/commands/dataset/relations.js +1 -1
- package/lib/commands/dataset/rename.js +1 -1
- package/lib/commands/dataset/restore.js +1 -1
- package/lib/commands/db/analysis-batching.js +1 -1
- package/lib/commands/db/analyze-batch-plan.js +1 -1
- package/lib/commands/db/analyze-cancel.js +1 -1
- package/lib/commands/db/analyze-start.js +1 -1
- package/lib/commands/db/analyze-status.js +1 -1
- package/lib/commands/db/create.js +1 -1
- package/lib/commands/db/delete.js +1 -1
- package/lib/commands/db/detail.js +1 -1
- package/lib/commands/db/diff-refresh-start.js +1 -1
- package/lib/commands/db/diff-refresh-status.js +1 -1
- package/lib/commands/db/diff.js +1 -1
- package/lib/commands/db/index.js +1 -1
- package/lib/commands/db/list.js +1 -1
- package/lib/commands/db/shared.js +1 -1
- package/lib/commands/db/tables.js +1 -1
- package/lib/commands/db/test.js +1 -1
- package/lib/commands/db/update.js +1 -1
- package/lib/commands/doctor.js +1 -1
- package/lib/commands/file/index.js +1 -1
- package/lib/commands/init/index.js +1 -1
- package/lib/commands/issue/index.js +1 -1
- package/lib/commands/issue/nudge.js +1 -1
- package/lib/commands/issue/report.js +1 -1
- package/lib/commands/issue/shared.js +1 -1
- package/lib/commands/kb/create.js +1 -1
- package/lib/commands/kb/delete.js +1 -1
- package/lib/commands/kb/detail.js +1 -1
- package/lib/commands/kb/index.js +1 -1
- package/lib/commands/kb/list.js +1 -1
- package/lib/commands/kb/search.js +1 -1
- package/lib/commands/kb/shared.js +1 -1
- package/lib/commands/kb/update.js +1 -1
- package/lib/commands/logs/index.js +1 -1
- package/lib/commands/menu/asset-update.js +1 -1
- package/lib/commands/menu/delete.js +1 -1
- package/lib/commands/menu/external-link-create.js +1 -1
- package/lib/commands/menu/external-link-update.js +1 -1
- package/lib/commands/menu/group-create.js +1 -1
- package/lib/commands/menu/group-update.js +1 -1
- package/lib/commands/menu/index.js +1 -1
- package/lib/commands/menu/list.js +1 -1
- package/lib/commands/menu/move.js +1 -1
- package/lib/commands/menu/regroup-start.js +1 -1
- package/lib/commands/menu/rename.js +1 -1
- package/lib/commands/menu/shared/compare-table.js +1 -1
- package/lib/commands/menu/shared/delete-plan.js +1 -1
- package/lib/commands/menu/shared/facts.js +1 -1
- package/lib/commands/menu/shared/index.js +1 -1
- package/lib/commands/menu/shared/inquirer.js +1 -1
- package/lib/commands/menu/shared/local-pages.js +1 -1
- package/lib/commands/menu/shared/logic.js +1 -1
- package/lib/commands/menu/shared/mutations.js +1 -1
- package/lib/commands/menu/shared/service.js +1 -1
- package/lib/commands/menu/shared/sync-core.js +1 -1
- package/lib/commands/menu/shared/update-core.js +1 -1
- package/lib/commands/menu/shared/valid-url.js +1 -1
- package/lib/commands/menu/sync.js +1 -1
- package/lib/commands/menu/visibility-update.js +1 -1
- package/lib/commands/notification/config-create.js +1 -1
- package/lib/commands/notification/config-delete.js +1 -1
- package/lib/commands/notification/config-list.js +1 -1
- package/lib/commands/notification/config-update.js +1 -1
- package/lib/commands/notification/index.js +1 -1
- package/lib/commands/notification/shared.js +1 -1
- package/lib/commands/ocr/index.js +1 -1
- package/lib/commands/page/create.js +1 -1
- package/lib/commands/page/custom/detail.js +1 -1
- package/lib/commands/page/custom/list.js +1 -1
- package/lib/commands/page/custom/publish.js +1 -1
- package/lib/commands/page/custom/shared.js +1 -1
- package/lib/commands/page/custom/syntax.js +1 -1
- package/lib/commands/page/custom/template.js +1 -1
- package/lib/commands/page/custom/update.js +1 -1
- package/lib/commands/page/data-list-status.js +1 -1
- package/lib/commands/page/generate-start.js +1 -1
- package/lib/commands/page/generate-status.js +1 -1
- package/lib/commands/page/index.js +1 -1
- package/lib/commands/page/pull.js +1 -1
- package/lib/commands/page/push.js +1 -1
- package/lib/commands/page/relation-audit.js +1 -1
- package/lib/commands/page/restore.js +1 -1
- package/lib/commands/page/shared.js +1 -1
- package/lib/commands/page/sync.js +1 -1
- package/lib/commands/project/create/enhanced-guided-create.js +1 -1
- package/lib/commands/project/create/format-elapsed.js +1 -1
- package/lib/commands/project/create/main.js +1 -1
- package/lib/commands/project/create/materialize-project-template.js +1 -1
- package/lib/commands/project/create/project-name.js +1 -1
- package/lib/commands/project/create/project-template-archive.js +1 -1
- package/lib/commands/project/create/project-template-path.js +1 -1
- package/lib/commands/project/create/use-copy-project-template.js +1 -1
- package/lib/commands/project/create/use-format-code.js +1 -1
- package/lib/commands/project/create/use-install-dependencies.js +1 -1
- package/lib/commands/project/index.js +1 -1
- package/lib/commands/project/upgrade.js +1 -1
- package/lib/commands/registry.js +1 -1
- package/lib/commands/role/delete.js +1 -1
- package/lib/commands/role/detail.js +1 -1
- package/lib/commands/role/index.js +1 -1
- package/lib/commands/role/list.js +1 -1
- package/lib/commands/role/shared.js +1 -1
- package/lib/commands/role/update.js +1 -1
- package/lib/commands/role/user-add.js +1 -1
- package/lib/commands/role/user-remove.js +1 -1
- package/lib/commands/role/user-resolve.js +1 -1
- package/lib/commands/run/index.js +1 -1
- package/lib/commands/schema.js +1 -1
- package/lib/commands/sql/create.js +1 -1
- package/lib/commands/sql/delete.js +1 -1
- package/lib/commands/sql/detail.js +1 -1
- package/lib/commands/sql/exec.js +1 -1
- package/lib/commands/sql/index.js +1 -1
- package/lib/commands/sql/list.js +1 -1
- package/lib/commands/sql/pull.js +1 -1
- package/lib/commands/sql/push.js +1 -1
- package/lib/commands/sql/shared.js +1 -1
- package/lib/commands/sql/status.js +1 -1
- package/lib/commands/sql/validate.js +1 -1
- package/lib/commands/task/index.js +1 -1
- package/lib/commands/task/status.js +1 -1
- package/lib/commands/tenant/index.js +1 -1
- package/lib/commands/tenant/members-list.js +1 -1
- package/lib/commands/tenant/shared.js +1 -1
- package/lib/commands/user-account/dingding-sandbox-bind.js +1 -1
- package/lib/commands/user-account/index.js +1 -1
- package/lib/commands/workspace/add.js +1 -1
- package/lib/commands/workspace/index.js +1 -1
- package/lib/commands/workspace/remove.js +1 -1
- package/lib/config/schema.js +1 -1
- package/lib/constant/cdn.js +1 -1
- package/lib/constant/cli.js +1 -1
- package/lib/constant/defaults.js +1 -1
- package/lib/constant/domain.js +1 -1
- package/lib/constant/env.js +1 -1
- package/lib/constant/output.js +1 -1
- package/lib/constant/paths.js +1 -1
- package/lib/constant/risk.js +1 -1
- package/lib/context/app-resolver.js +1 -1
- package/lib/context/auth-resolver.js +1 -1
- package/lib/context/config-loader.js +1 -1
- package/lib/context.js +1 -1
- package/lib/core/alias-resolver.js +1 -1
- package/lib/core/api-client.d.ts +1 -1
- package/lib/core/api-client.js +1 -1
- package/lib/core/bff/config.d.ts +1 -1
- package/lib/core/bff/config.js +1 -1
- package/lib/core/bff/file-system.d.ts +1 -1
- package/lib/core/bff/file-system.js +1 -1
- package/lib/core/bff/hash.d.ts +1 -1
- package/lib/core/bff/hash.js +1 -1
- package/lib/core/bff/lock.d.ts +2 -2
- package/lib/core/bff/lock.js +1 -1
- package/lib/core/bff/types.d.ts +1 -1
- package/lib/core/bff/utils.d.ts +2 -2
- package/lib/core/bff/utils.js +1 -1
- package/lib/core/db-resolver.js +1 -1
- package/lib/core/page/file-system.js +1 -1
- package/lib/core/page/hash.js +1 -1
- package/lib/core/page/lock.js +1 -1
- package/lib/core/sql-index-auditor.js +1 -1
- package/lib/core/sql-sync/config.js +1 -1
- package/lib/core/sql-sync/file-system.js +1 -1
- package/lib/core/sql-sync/hash.js +1 -1
- package/lib/core/sql-sync/lock.js +1 -1
- package/lib/core/sql-sync/utils.js +1 -1
- package/lib/core/sql-validator.js +1 -1
- package/lib/errors.js +1 -1
- package/lib/framework/build-all-flags.js +1 -1
- package/lib/framework/error-output.js +1 -1
- package/lib/framework/explicit-yes.js +1 -1
- package/lib/framework/flags.js +1 -1
- package/lib/framework/help.js +1 -1
- package/lib/framework/index.js +1 -1
- package/lib/framework/output.js +1 -1
- package/lib/framework/response.js +1 -1
- package/lib/framework/runner-alias.js +1 -1
- package/lib/framework/runner.js +1 -1
- package/lib/framework/schema-export.js +1 -1
- package/lib/framework/types.js +1 -1
- package/lib/generated/build-info.d.ts +4 -4
- package/lib/generated/build-info.js +1 -1
- package/lib/help.js +1 -1
- package/lib/postinstall.js +1 -1
- package/lib/runtime/confirmation.js +1 -1
- package/lib/runtime/event.js +1 -1
- package/lib/runtime/index.js +1 -1
- package/lib/runtime/queue.js +1 -1
- package/lib/runtime/resolve.js +1 -1
- package/lib/skills/builtin-skill.js +1 -1
- package/lib/skills/main.js +1 -1
- package/lib/skills/npx-skills-add.js +1 -1
- package/lib/skills/skill-presence.js +1 -1
- package/lib/telemetry/cli-command-trace.js +1 -1
- package/lib/telemetry/cli-help-trace.js +1 -1
- package/lib/telemetry/ensure-cli-otel-config.js +1 -1
- package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
- package/lib/telemetry/send-cli-trace-log.js +1 -1
- package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
- package/lib/utils/ai_config.js +1 -1
- package/lib/utils/apply-jq-filter.js +1 -1
- package/lib/utils/cdn-config.js +1 -1
- package/lib/utils/check-sdk-version.js +1 -1
- package/lib/utils/cli-version-check.js +1 -1
- package/lib/utils/cli-version-policy.js +1 -1
- package/lib/utils/config.js +1 -1
- package/lib/utils/entity-with-id.js +1 -1
- package/lib/utils/file-utils.js +1 -1
- package/lib/utils/guides-cdn.js +1 -1
- package/lib/utils/http-client.js +1 -1
- package/lib/utils/is-non-interactive.js +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/params.js +1 -1
- package/lib/utils/platform.js +1 -1
- package/lib/utils/rules-cdn.js +1 -1
- package/lib/utils/sleep.js +1 -1
- package/lib/utils/template-replacer.js +1 -1
- package/lib/utils/update-notice.js +1 -1
- package/lib/utils/version.js +1 -1
- package/lib/utils/with-active-cookie.js +1 -1
- package/lib/utils/write-cli-side-channel.js +1 -1
- package/package.json +2 -2
- package/sidecar/flags.json +1 -1
- package/skills/rabetbase/SKILL.md +28 -28
- package/skills/rabetbase/guides/backend-function.md +30 -30
- package/skills/rabetbase/guides/best-practices.md +8 -8
- package/skills/rabetbase/guides/bff-creation-workflow.md +16 -16
- package/skills/rabetbase/guides/conflict-detection.md +3 -3
- package/skills/rabetbase/guides/custom-page-workflow.md +8 -8
- package/skills/rabetbase/guides/data-api-guidelines.md +6 -6
- package/skills/rabetbase/guides/legacy-application-blueprint-workflow.md +8 -8
- package/skills/rabetbase/guides/sql-creation-workflow.md +2 -2
- package/skills/rabetbase/guides/troubleshooting.md +6 -6
- package/skills/rabetbase/guides/typescript-sdk.md +10 -10
- package/skills/rabetbase/knowledge/page-schema/LrSmartTable.md +1 -1
- package/skills/rabetbase/knowledge/page-schema/external-resources-usage.md +10 -10
- package/skills/rabetbase/references/rabetbase-app-config.md +2 -2
- package/skills/rabetbase/references/rabetbase-bff-create.md +3 -3
- package/skills/rabetbase/references/rabetbase-bff-delete.md +1 -1
- package/skills/rabetbase/references/rabetbase-bff-detail.md +4 -4
- package/skills/rabetbase/references/rabetbase-bff-list.md +8 -8
- package/skills/rabetbase/references/rabetbase-bff-pull.md +1 -1
- package/skills/rabetbase/references/rabetbase-bff-push.md +3 -3
- package/skills/rabetbase/references/rabetbase-bff-status.md +1 -1
- package/skills/rabetbase/references/rabetbase-codegen-sql.md +3 -3
- package/skills/rabetbase/references/rabetbase-dataset-detail.md +1 -1
- package/skills/rabetbase/references/rabetbase-notification-config-list.md +3 -3
- package/skills/rabetbase.manifest.json +3 -3
- package/templates/rules/lovrabet_rules.mdc.tpl +7 -7
- package/templates/skill/SKILL.md.tpl +12 -12
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Lovrabet 开发质量规范与最佳实践
|
|
2
2
|
|
|
3
|
-
> 目标:约束 AI 在编写代码、SQL 和
|
|
3
|
+
> 目标:约束 AI 在编写代码、SQL 和 Backend Function 时的安全边界、命名风格和防御性编程习惯,避免生成高风险或难以维护的产物。
|
|
4
4
|
>
|
|
5
|
-
> 适用场景:编写或审查代码生成逻辑、SQL 和
|
|
5
|
+
> 适用场景:编写或审查代码生成逻辑、SQL 和 Backend Function 脚本时。
|
|
6
6
|
|
|
7
7
|
## 需求落地标准工作流
|
|
8
8
|
|
|
9
|
-
当遇到一个新业务需求时,AI **必须**按以下漏斗模型进行思考与技术选型,严禁一上来就直接写页面或堆砌复杂的自定义 SQL/
|
|
9
|
+
当遇到一个新业务需求时,AI **必须**按以下漏斗模型进行思考与技术选型,严禁一上来就直接写页面或堆砌复杂的自定义 SQL/Backend Function:
|
|
10
10
|
|
|
11
11
|
### Step 1:模型与关系推演
|
|
12
12
|
- **强制动作**:使用 CLI 命令(`rabetbase dataset list --format json`、`rabetbase dataset list --name "xxx" --format json`、`rabetbase dataset detail --code <数据集编码> --format json`)找出所有相关的业务模型。
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
本文件仅补充执行习惯:
|
|
22
22
|
|
|
23
23
|
- **SQL**:写前先 `sql list` 查复用;统计类 SQL 主动对齐历史口径,**不一致时告知开发者**。长期维护的源文件落在 **`.rabetbase/sql/<appCode>/<dbName|db-<id>>/`**(与 `sql create` / `sql pull` / `sql push` / `sql status` 约定一致)。
|
|
24
|
-
- **
|
|
24
|
+
- **Backend Function**:写前先 `bff list` 防重复;若逻辑可复用,**建议**抽公共函数或 service 层。脚本**仅**在 **`.rabetbase/bff/<appCode>/...`** 下维护(见 `bff create`)。
|
|
25
25
|
|
|
26
26
|
### Step 3:前端页面呈现
|
|
27
27
|
- 只有在后端的模型和接口选型彻底理清、确认可用之后,**最后一步**才是编写前端 React 页面。
|
|
@@ -54,7 +54,7 @@ AI 必须使用有业务语义的规范命名,严禁使用诸如 `test`、`tem
|
|
|
54
54
|
- 数据查询 # 不要使用中文作为 code/name 标识
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
###
|
|
57
|
+
### Backend Function 脚本命名
|
|
58
58
|
**推荐格式**: `[动词]-[模块]-[功能]`(小写或驼峰视环境而定,通常连字符风格为佳)
|
|
59
59
|
|
|
60
60
|
```markdown
|
|
@@ -84,14 +84,14 @@ AI 必须使用有业务语义的规范命名,严禁使用诸如 `test`、`tem
|
|
|
84
84
|
* 如果用户给出了不带 `LIMIT` 或全局匹配的 `UPDATE`,AI 必须主动补充约束条件或提示风险。
|
|
85
85
|
* 高危 DDL/DML 不应通过 CLI 自动保存到平台,必须建议用户保存在本地 `.rabetbase/sql/` 同步目录或 `.draft.sql` 草稿中进行 review。
|
|
86
86
|
|
|
87
|
-
###
|
|
87
|
+
### Backend Function 高危操作识别
|
|
88
88
|
|
|
89
89
|
🔴 **高危特征**:
|
|
90
90
|
* 参数未加任何验证直接传入 `delete` 或 `update` 方法
|
|
91
91
|
* 未做权限校验直接暴露数据
|
|
92
92
|
|
|
93
93
|
✅ **防御动作**:
|
|
94
|
-
AI 编写
|
|
94
|
+
AI 编写 Backend Function 代码时,必须养成防御性编程习惯,默认加上参数校验和错误捕获:
|
|
95
95
|
|
|
96
96
|
```javascript
|
|
97
97
|
// ❌ 高危:无验证,直接透传
|
|
@@ -116,7 +116,7 @@ export default async function(params: any, context: any) {
|
|
|
116
116
|
|
|
117
117
|
## 描述与版本标记
|
|
118
118
|
|
|
119
|
-
在通过 CLI 命令保存资源(如 SQL、
|
|
119
|
+
在通过 CLI 命令保存资源(如 SQL、Backend Function)时,应善用 `description` 字段。AI 应在描述中主动加入语义化的标签和版本说明。
|
|
120
120
|
|
|
121
121
|
**可用标记**:
|
|
122
122
|
* `#生产使用` - 生产环境关键资源
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Backend Function 工作流规则
|
|
2
2
|
|
|
3
3
|
前置知识:`backend-function.md`、`data-api-guidelines.md`
|
|
4
4
|
|
|
@@ -16,10 +16,10 @@
|
|
|
16
16
|
执行 `rabetbase bff list --type COMMON --format json` 查看已有公共函数。如有可复用的工具函数,先用 `rabetbase bff detail --id <id> --format json` 确认入参、返回值和副作用,避免按名称猜测。
|
|
17
17
|
|
|
18
18
|
### 1. 确认需求
|
|
19
|
-
写码前必须明确:类型(ENDPOINT/HOOK/COMMON)、函数名、入参、返回结构,以及是否涉及数据集或消息通知。缺失则先问用户。通知型
|
|
19
|
+
写码前必须明确:类型(ENDPOINT/HOOK/COMMON)、函数名、入参、返回结构,以及是否涉及数据集或消息通知。缺失则先问用户。通知型 Backend Function 还必须确认当前应用已有的 `configCode`、接收对象、标题/摘要和是否允许执行真实发送;不能用示例编码代替真实配置。
|
|
20
20
|
|
|
21
21
|
### 2. 校验依赖事实
|
|
22
|
-
|
|
22
|
+
Backend Function 涉及数据集时,执行 `rabetbase dataset detail --code <数据集编码> --format json`(或 `compress`)确认字段名、类型、必填字段、枚举值、关联关系。禁止凭经验猜字段名,禁止把 Demo 或历史案例里的字段、表名、枚举值复制到当前脚本。
|
|
23
23
|
|
|
24
24
|
不读写数据集的纯消息通知 ENDPOINT 可以不依赖数据集;业务明确要求在数据集操作执行前发送预通知或告警时使用 Before HOOK;作为数据集操作成功后副作用的通知,只有响应结果已包含通知所需字段时才使用 After HOOK。三者都必须按 [`backend-function.md`](backend-function.md) 的“消息通知扩展”核对 `configCode`、`audiences` 和 `message`。先执行以下只读命令获取当前应用的 EMAIL 配置:
|
|
25
25
|
|
|
@@ -27,9 +27,9 @@ BFF 涉及数据集时,执行 `rabetbase dataset detail --code <数据集编
|
|
|
27
27
|
rabetbase notification config-list --type EMAIL --format compress
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
从 `data.configs[]` 按 `configName` / `description` 选择配置,并使用同一项的 `configCode`。命令不会输出 `channelConfig`、`endpointUrl` 或通知凭据。没有结果或存在多个候选且业务目标不明确时,停下向用户确认;不得猜测。不要把 dataset 级通知通道的 `channelCode` 当成
|
|
30
|
+
从 `data.configs[]` 按 `configName` / `description` 选择配置,并使用同一项的 `configCode`。命令不会输出 `channelConfig`、`endpointUrl` 或通知凭据。没有结果或存在多个候选且业务目标不明确时,停下向用户确认;不得猜测。不要把 dataset 级通知通道的 `channelCode` 当成 Backend Function 所需的应用级 `configCode`。
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Backend Function HOOK 可挂载 `DB_TABLE` 或 `METADATA` 数据集,具体 operation 以平台返回为准。`METADATA` 数据集不支持 SQL / aggregate 路径;脚本中应使用 `` context.client.models[`dataset_${datasetCode}`] `` 的标准操作能力。
|
|
33
33
|
|
|
34
34
|
常用字段投影:
|
|
35
35
|
|
|
@@ -51,27 +51,27 @@ rabetbase dataset detail --code <数据集编码> --format compress \
|
|
|
51
51
|
命中同名脚本时,停下问用户:修改还是另起新名。
|
|
52
52
|
|
|
53
53
|
### 4. 编写脚本(规范路径)
|
|
54
|
-
新建脚本应使用 **`rabetbase bff create`**,在 **`.rabetbase/bff/<appCode>/...`** 下生成脚手架后再编辑(路径与 `bff status` / `bff push` 一致)。**不要**在 `src/` 或仓库任意目录手写
|
|
55
|
-
已有脚本仅在上述
|
|
54
|
+
新建脚本应使用 **`rabetbase bff create`**,在 **`.rabetbase/bff/<appCode>/...`** 下生成脚手架后再编辑(路径与 `bff status` / `bff push` 一致)。**不要**在 `src/` 或仓库任意目录手写 Backend Function 再期望被 CLI 识别。
|
|
55
|
+
已有脚本仅在上述 Backend Function 树内修改;与 `backend-function.md` 中的目录约定一致。
|
|
56
56
|
|
|
57
57
|
通知需要在数据集 `create` / `update` / `delete` 执行前明确预告,并且通知失败应阻止本次操作时,选择 Before HOOK;通知由数据集操作成功触发,且响应结果已包含通知所需字段时,选择 After HOOK;响应结果不包含通知所需字段时,选择能在写入前读取并暂存必要字段、在成功后发送通知的受控 `ENDPOINT`。三者都使用 `await context.client.extension.execute("notification", "send", ...)`,并由 runtime 注入可信 `appCode` 和当前用户;不要把 `appCode`、渠道地址或密钥作为外部参数透传。
|
|
58
58
|
|
|
59
59
|
### 5. 自检
|
|
60
60
|
* 方法名正确
|
|
61
61
|
* 单条查询用 `getOne`
|
|
62
|
-
*
|
|
63
|
-
* METADATA 数据集的
|
|
62
|
+
* Backend Function 模型键使用 `"dataset_" + 32 位数据集 code`
|
|
63
|
+
* METADATA 数据集的 Backend Function / HOOK 不走 SQL 或 aggregate;只使用平台返回的标准数据操作
|
|
64
64
|
* `filter()` 结果从 `.tableData` 读取,不是 `.list`
|
|
65
65
|
* `create()` 返回新记录 ID,不是完整对象;不要访问 `created.id`
|
|
66
66
|
* `batchCreate()` 返回新记录 ID 数组;入参直接使用非空对象数组,不使用 `{"items":[...]}` 包装
|
|
67
67
|
* 批量更新使用 `update({ id: [...] })`;不存在 `batchUpdate()`,也不传记录数组
|
|
68
68
|
* 枚举/选择字段写入 `options[].value`,不是展示 `label`
|
|
69
|
-
*
|
|
70
|
-
* 没有在
|
|
69
|
+
* Backend Function 中 `sql.execute` 返回数组,不是 `{ execSuccess, execResult }`
|
|
70
|
+
* 没有在 Backend Function 中使用前端 SDK 初始化能力,如 `createClient`、`registerModels`
|
|
71
71
|
* 参数校验、错误处理、脱敏
|
|
72
72
|
* 中文 JSDoc 已写清根请求参数、实际 `params.<字段名>`、返回值;显式抛出异常时包含 `@throws`
|
|
73
73
|
* 依赖数据集、调用 BF、执行 SQL、副作用维护项与实际代码一致,无依赖时明确填写“无”
|
|
74
|
-
* 通知型
|
|
74
|
+
* 通知型 Backend Function 只传 `configCode` / `audiences` / `message`,并且没有 `${...}` 模板表达式、旧 MANUAL 参数或渠道密钥
|
|
75
75
|
* 通知型 ENDPOINT 限制调用者可传的字段、`configCode` 和接收对象范围,不形成任意通知转发器
|
|
76
76
|
* 通知型 Before HOOK 使用“即将执行”或“准备执行”的消息语义,`await` 发送后返回原始 `params`;不直接返回通知扩展结果,并明确接受“通知已发送但后续业务仍可能失败”
|
|
77
77
|
* 通知型 After HOOK 只使用业务接口响应结果或固定可信规则派生接收对象与消息;若通知失败或超时,按业务操作可能已完成、通知状态未知处理,不得自动重试原业务请求
|
|
@@ -102,7 +102,7 @@ lovrabet bff exec --appcode <appCode> --name <functionName> --params '<json>' --
|
|
|
102
102
|
```
|
|
103
103
|
|
|
104
104
|
边界:
|
|
105
|
-
* 通知型
|
|
105
|
+
* 通知型 Backend Function 的 smoke 会真实发送外部消息;必须通过已确认上下文或显式 `--appcode` 锁定同一 app,执行前向用户展示 app、函数名、`configCode`、接收对象和消息摘要并取得明确确认
|
|
106
106
|
* `lovrabet bff detail` 只确认运行契约和版本,不返回脚本源码;通知参数必须来自本地已审查脚本或明确业务契约,不能按函数名猜
|
|
107
107
|
* 通知执行超时或客户端未拿到结果时,先按“状态未知”处理;不得自动重试,避免重复发送
|
|
108
108
|
* `lovrabet` CLI 不可用、未配置或无权限时,明确记录“运行态 smoke 未执行”,不要把它写成 `rabetbase` 验证已通过
|
|
@@ -135,9 +135,9 @@ lovrabet bff exec --appcode <appCode> --name <functionName> --params '<json>' --
|
|
|
135
135
|
|
|
136
136
|
`rabetbase bff list --format json` → `rabetbase bff detail --id <id> --format json` 拉最新内容 → 如需覆盖本地则 `bff pull` → 修改本地文件 → `bff status` → `bff push`
|
|
137
137
|
|
|
138
|
-
##
|
|
138
|
+
## Backend Function 语义差异
|
|
139
139
|
|
|
140
|
-
| 场景 | 前端 SDK |
|
|
140
|
+
| 场景 | 前端 SDK | Backend Function (context.client) |
|
|
141
141
|
|------|---------|---------------------|
|
|
142
142
|
| SQL 返回值 | `{ execSuccess, execResult }` | 直接返回数组 |
|
|
143
143
|
| 模型键 | 可通过初始化/生成代码使用 alias | 使用 `"dataset_" + 32 位数据集 code` |
|
|
@@ -146,5 +146,5 @@ lovrabet bff exec --appcode <appCode> --name <functionName> --params '<json>' --
|
|
|
146
146
|
| `batchCreate()` 返回 | 以 SDK 文档/类型为准 | 新记录 ID 数组;直接传非空对象数组 |
|
|
147
147
|
| 批量更新 | 以 SDK 文档/类型为准 | `update({ id: [...] })`;不存在 `batchUpdate()` |
|
|
148
148
|
| SDK 初始化能力 | `createClient` / `registerModels` | 不可用;`context.client` 由平台注入 |
|
|
149
|
-
| 前端调
|
|
149
|
+
| 前端调 Backend Function | `client.bff.execute({ scriptName, params })` 返回业务数据 | — |
|
|
150
150
|
| 发送应用级通知 | — | `context.client.extension.execute("notification", "send", { configCode, audiences, message })` |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# 冲突检测与未完成写入处理
|
|
2
2
|
|
|
3
3
|
**文档版本**: v4.0
|
|
4
|
-
**适用于**: SQL /
|
|
4
|
+
**适用于**: SQL / Backend Function 资源的远端写入与同步
|
|
5
5
|
|
|
6
6
|
> **与 SKILL.md 的关系**:[SKILL.md](../SKILL.md) 只保留硬性规则;本文件负责解释什么叫“远端未写入成功”,以及 AI 应该如何沟通。
|
|
7
7
|
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
- 新建:`rabetbase sql create`
|
|
16
16
|
- 修改:编辑 `.rabetbase/sql/...` 下的同步文件后执行 `rabetbase sql push`
|
|
17
17
|
- 删除:`rabetbase sql delete`
|
|
18
|
-
- **
|
|
18
|
+
- **Backend Function**
|
|
19
19
|
- 新建本地脚手架:`rabetbase bff create`
|
|
20
20
|
- 推送远端:`rabetbase bff push`
|
|
21
21
|
- 删除远端:`rabetbase bff delete`
|
|
@@ -115,5 +115,5 @@
|
|
|
115
115
|
## 相关文档
|
|
116
116
|
|
|
117
117
|
- **SQL 工作流**: `sql-creation-workflow.md`
|
|
118
|
-
- **
|
|
118
|
+
- **Backend Function 工作流**: `bff-creation-workflow.md`
|
|
119
119
|
- **最佳实践**: `best-practices.md`
|
|
@@ -99,17 +99,17 @@ page create --page-pattern BLANK
|
|
|
99
99
|
|
|
100
100
|
### 选型
|
|
101
101
|
|
|
102
|
-
根据页面的实际业务需求选择数据访问方式,不要为了简单查询引入 SQL 或
|
|
102
|
+
根据页面的实际业务需求选择数据访问方式,不要为了简单查询引入 SQL 或 Backend Function:
|
|
103
103
|
|
|
104
104
|
| 方式 | 适用场景 | 边界 |
|
|
105
105
|
| --- | --- | --- |
|
|
106
106
|
| 单一数据集请求 | 只涉及一个数据集的查询、详情、分页、筛选、创建、更新或删除 | 严格按照当前数据集 API-doc 返回的调用说明实现,不得自行推测或自由发挥调用标识、方法、字段、参数、返回值或异常处理 |
|
|
107
107
|
| Custom SQL | 需要组合多个数据集,或需要数据库完成关联、聚合、分组、排序、计算和复杂筛选 | 先复用或按 SQL 工作流创建、校验并发布 Custom SQL,再通过 `client.sql.execute({ sqlCode, params })` 调用;不要把 CLI 的 `data.rows` 当作运行时返回结构 |
|
|
108
|
-
|
|
|
108
|
+
| Backend Function | 需要按当前用户、角色、数据范围或业务规则额外鉴权,或需要数据转换、条件分支、多步编排和外部服务调用 | 将校验和编排放入已确认的 Backend Function,由页面通过 SDK 调用;前端只传业务参数,Backend Function 内按需执行已发布的 Custom SQL;简单查询不额外包装成 Backend Function |
|
|
109
109
|
|
|
110
|
-
判断顺序:先确认单一数据集请求能否满足需求;数据组合和数据库计算是主要问题时选择 Custom SQL;当前用户、角色、数据范围或业务规则需要额外控制时选择
|
|
110
|
+
判断顺序:先确认单一数据集请求能否满足需求;数据组合和数据库计算是主要问题时选择 Custom SQL;当前用户、角色、数据范围或业务规则需要额外控制时选择 Backend Function。三种方式可以根据已确认的 SDK 契约配合使用,但不得自行推测方法、参数或返回结构。
|
|
111
111
|
|
|
112
|
-
页面和
|
|
112
|
+
页面和 Backend Function 通过已发布 Custom SQL 的 `sqlCode` + `params` 执行查询。Dataset、Custom SQL 或 Backend Function 执行失败时,保留并报告原始错误,根据资源状态、参数与权限定位问题。
|
|
113
113
|
|
|
114
114
|
页面需要读取或写入数据集时,先按以下顺序确认事实:
|
|
115
115
|
|
|
@@ -118,22 +118,22 @@ page create --page-pattern BLANK
|
|
|
118
118
|
3. `rabetbase dataset operations --code <datasetCode>` 确认可用操作及其输入
|
|
119
119
|
4. 需要生成调用示例时,阅读 [`rabetbase-codegen-sdk.md`](../references/rabetbase-codegen-sdk.md),使用 `rabetbase codegen sdk`
|
|
120
120
|
|
|
121
|
-
页面需要调用自定义 SQL 或
|
|
121
|
+
页面需要调用自定义 SQL 或 Backend Function 时,先通过当前 CLI 获取目标资源事实:
|
|
122
122
|
|
|
123
123
|
1. SQL:先执行 `rabetbase sql list` 查找可复用 SQL;命中后执行 `rabetbase sql detail --sqlcode <sqlCode>` 确认目标 SQL。没有满足需求的 SQL 时,先阅读并遵循 [`sql-creation-workflow.md`](sql-creation-workflow.md) 与 [`sql-mybatis.md`](sql-mybatis.md),完成其中规定的流程后,再使用服务端生成的 `sqlCode` 编写页面
|
|
124
|
-
2.
|
|
124
|
+
2. Backend Function:执行 `rabetbase bff list`,再执行 `rabetbase bff detail --id <id>` 确认目标脚本
|
|
125
125
|
3. 按 `@lovrabet/sdk` 的使用规范实现 `client.sql` 或 `client.bff` 调用,不得根据 CLI 返回结构猜测页面调用参数或返回值
|
|
126
126
|
4. 页面使用自定义 SQL 前,使用代表性参数执行 `rabetbase sql exec --sqlcode <sqlCode> --params <json> --format json`,确认执行没有报错并检查实际数据结构
|
|
127
127
|
5. `sql exec` 仅用于确认 SQL 可执行及返回数据结构。页面代码按 `@lovrabet/sdk` 的使用规范处理 `client.sql` 的返回值,不使用 CLI 输出字段 `data.rows`
|
|
128
128
|
|
|
129
|
-
当前 CLI 没有按单个数据集返回页面数据访问说明的专用命令。在页面中使用 `client` 前,必须以数据集、SQL 或
|
|
129
|
+
当前 CLI 没有按单个数据集返回页面数据访问说明的专用命令。在页面中使用 `client` 前,必须以数据集、SQL 或 Backend Function 的事实,以及对应的 `@lovrabet/sdk` 使用规范为依据;无法确认的字段、接口路径和响应结构不得猜测。
|
|
130
130
|
|
|
131
131
|
### ECharts 呈现层
|
|
132
132
|
|
|
133
133
|
- 在自定义页面的 React JSX 实现中直接使用白名单内的 `echarts@5` 构建图表;按组件生命周期初始化、更新和销毁实例。
|
|
134
134
|
- ECharts 只消费页面已经取得的业务数据,不负责访问数据库、执行 SQL 或做权限判断。
|
|
135
135
|
- `page custom-*` 页面与 `project create` 微前端模板是不同运行环境;前者不得因为模板示例使用了包装库,就引入白名单外依赖。
|
|
136
|
-
- 图表查询使用 Dataset、`client.sql.execute({ sqlCode, params })` 或受控
|
|
136
|
+
- 图表查询使用 Dataset、`client.sql.execute({ sqlCode, params })` 或受控 Backend Function,并完整处理加载、空态、失败和重试行为。
|
|
137
137
|
|
|
138
138
|
## 页面开发参考
|
|
139
139
|
|
|
@@ -37,12 +37,12 @@
|
|
|
37
37
|
|
|
38
38
|
## 先判定数据访问路线
|
|
39
39
|
|
|
40
|
-
在决定写 SQL、
|
|
40
|
+
在决定写 SQL、Backend Function 还是直接查数据前,先看 `rabetbase dataset detail --code <数据集编码> --format json` 的 `source`:
|
|
41
41
|
|
|
42
42
|
| `source` | 建议路线 |
|
|
43
43
|
|----------|----------|
|
|
44
|
-
| `METADATA` | **不要走 SQL / aggregate**;优先 `filter` / `getOne` / `create` / `update` / `delete` 等平台返回的标准操作;
|
|
45
|
-
| `CUSTOM` / `DB` | 可继续评估 SQL、
|
|
44
|
+
| `METADATA` | **不要走 SQL / aggregate**;优先 `filter` / `getOne` / `create` / `update` / `delete` 等平台返回的标准操作;Backend Function HOOK 可挂载,operation 以后端返回为准 |
|
|
45
|
+
| `CUSTOM` / `DB` | 可继续评估 SQL、Backend Function 或标准数据接口 |
|
|
46
46
|
|
|
47
47
|
---
|
|
48
48
|
|
|
@@ -71,7 +71,7 @@ rabetbase dataset detail --code <数据集编码> --format compress \
|
|
|
71
71
|
|
|
72
72
|
本 skill 的**主路径**始终基于 **`rabetbase`**(`dataset detail`、`sql exec` 等),**不要求**安装其它 CLI。
|
|
73
73
|
|
|
74
|
-
若开发者本机已单独安装 **Lovrabet 运行时 CLI**(npm 包 **`@lovrabet/lovrabet-cli`**,命令名 **`lovrabet`**),可在终端用 **`lovrabet data filter`**、**`lovrabet data getOne`** 按 **与 `@lovrabet/sdk` 相同的语义** 查询数据集行数据,并直接查看 JSON 结构,便于与前端 /
|
|
74
|
+
若开发者本机已单独安装 **Lovrabet 运行时 CLI**(npm 包 **`@lovrabet/lovrabet-cli`**,命令名 **`lovrabet`**),可在终端用 **`lovrabet data filter`**、**`lovrabet data getOne`** 按 **与 `@lovrabet/sdk` 相同的语义** 查询数据集行数据,并直接查看 JSON 结构,便于与前端 / Backend Function 里的 `filter`、`getOne` 对照调试。
|
|
75
75
|
|
|
76
76
|
**版本要求:须 `lovrabet` CLI ≥ 2.0**(主版本 2 及以上)。低于 2.0 的旧包**没有**与本文一致的 `data filter` / `data getOne` 能力(或行为不同),请勿按本节操作;请升级:`npm install -g @lovrabet/lovrabet-cli@^2.0.0`(或 `latest`)。自检:`lovrabet --version`。
|
|
77
77
|
|
|
@@ -106,7 +106,7 @@ rabetbase dataset detail --code <数据集编码> --format json
|
|
|
106
106
|
|
|
107
107
|
- **不要默认 `filter()` 返回完整字段**。列表接口常为展示做裁剪,某些字段可能缺失。
|
|
108
108
|
- 需要确认“某条记录的完整字段”或依赖关键字段时,优先 `getOne({ id })`。
|
|
109
|
-
- 遇到 `USER` 类型字段时,留意同名的 `_label` 扩展对象(如 `creator_id_label`、`assignee_id_label`),很多展示信息已在其中,无需立刻反查 SQL 或额外写
|
|
109
|
+
- 遇到 `USER` 类型字段时,留意同名的 `_label` 扩展对象(如 `creator_id_label`、`assignee_id_label`),很多展示信息已在其中,无需立刻反查 SQL 或额外写 Backend Function。
|
|
110
110
|
|
|
111
111
|
### 错误处理
|
|
112
112
|
|
|
@@ -166,7 +166,7 @@ export default async function validateRelatedRecord(params, context) {
|
|
|
166
166
|
| **枚举字段** | `type === "SELECT"` 且 `options` 非空 | `data.fields[].options` | 写入 `option.value`,展示 `option.label` |
|
|
167
167
|
| **级联选择** | 父字段决定子字段 | 父字段变化时动态加载 | 监听父字段变化,动态加载子选项 |
|
|
168
168
|
|
|
169
|
-
枚举/选择字段的 `label` 只用于展示,写入
|
|
169
|
+
枚举/选择字段的 `label` 只用于展示,写入 Backend Function、SDK 或 SQL 参数时使用对应 `value`。`value` 的类型以数据集详情为准,可能是字符串、数字或其它平台约定类型。
|
|
170
170
|
|
|
171
171
|
**前端示例**:
|
|
172
172
|
|
|
@@ -152,7 +152,7 @@ Optional implementation sketches after blueprint review:
|
|
|
152
152
|
- Validation commands
|
|
153
153
|
- Runtime smoke checklist
|
|
154
154
|
|
|
155
|
-
Do not treat drafts as finished code. Do not push SQL or
|
|
155
|
+
Do not treat drafts as finished code. Do not push SQL or Backend Function until the relevant reference docs have been read and dry-run validation has passed.
|
|
156
156
|
|
|
157
157
|
## Evidence Collection
|
|
158
158
|
|
|
@@ -178,7 +178,7 @@ Use Lovrabet platform facts to calibrate code inference:
|
|
|
178
178
|
- `dataset relations`: relationship facts, join candidates, parent-child or reference relationships
|
|
179
179
|
- `db tables` and `db diff`: physical table facts and Dataset mismatch checks
|
|
180
180
|
- `sql list/detail`: existing Custom SQL that should not be duplicated
|
|
181
|
-
- `bff list/detail`: existing
|
|
181
|
+
- `bff list/detail`: existing Backend Function, Hook, and Common scripts that should not be overwritten
|
|
182
182
|
|
|
183
183
|
### Evidence Record Format
|
|
184
184
|
|
|
@@ -354,7 +354,7 @@ Recommended subsections:
|
|
|
354
354
|
| Does it contain state transitions? | Yes | Backend Function or Hook |
|
|
355
355
|
| Is it automatically triggered by Dataset create/update/delete? | Yes | Hooks Function |
|
|
356
356
|
| Does it call third-party systems or use server-side secrets? | Yes | Backend Function or external worker |
|
|
357
|
-
| Is the logic reused by multiple
|
|
357
|
+
| Is the logic reused by multiple Backend Function/Hook scripts? | Yes | Common Function |
|
|
358
358
|
| Is it heavy domain logic or existing Java service logic? | Yes | Enterprise Java Service |
|
|
359
359
|
| Can it only run in a retained legacy system? | Yes | External Retained System |
|
|
360
360
|
|
|
@@ -410,10 +410,10 @@ Lovrabet capabilities:
|
|
|
410
410
|
|
|
411
411
|
Rules:
|
|
412
412
|
- Every important conclusion must include code evidence.
|
|
413
|
-
- Every Dataset-related conclusion must include platform evidence from dataset detail, dataset relations, db tables/diff, or existing SQL/
|
|
413
|
+
- Every Dataset-related conclusion must include platform evidence from dataset detail, dataset relations, db tables/diff, or existing SQL/Backend Function facts when available.
|
|
414
414
|
- Mark confidence as high, medium, or low.
|
|
415
415
|
- Ask humans only for high-impact uncertainties that cannot be resolved from evidence.
|
|
416
|
-
- Do not map all legacy APIs to Instant API. Upgrade to SQL,
|
|
416
|
+
- Do not map all legacy APIs to Instant API. Upgrade to SQL, Backend Function, Hook, Common Function, or Java Service when transaction, state machine, permission, side effect, or external integration complexity requires it.
|
|
417
417
|
- Write the primary output to `.rabetbase/blueprint/<appCode>/application-blueprint.md`.
|
|
418
418
|
```
|
|
419
419
|
|
|
@@ -483,7 +483,7 @@ Before claiming the blueprint is complete, verify:
|
|
|
483
483
|
- Capability Mapping does not blindly map all endpoints to Instant API.
|
|
484
484
|
- Manual Confirmation Items are evidence-based and option-based.
|
|
485
485
|
- Implementation drafts, if included, are clearly marked as drafts.
|
|
486
|
-
- No SQL or
|
|
486
|
+
- No SQL or Backend Function was pushed as part of blueprint generation.
|
|
487
487
|
|
|
488
488
|
## Common Mistakes
|
|
489
489
|
|
|
@@ -491,5 +491,5 @@ Before claiming the blueprint is complete, verify:
|
|
|
491
491
|
- Treating the blueprint as complete without Dataset Binding.
|
|
492
492
|
- Mapping every legacy CRUD-like endpoint to Instant API without checking state machines and side effects.
|
|
493
493
|
- Guessing Dataset field names or enum values from legacy names.
|
|
494
|
-
- Writing
|
|
495
|
-
- Mixing blueprint artifacts with pushable implementation assets. Blueprint files belong under `.rabetbase/blueprint`, while SQL and
|
|
494
|
+
- Writing Backend Function or SQL directly into arbitrary project folders instead of `.rabetbase/bff` or `.rabetbase/sql`.
|
|
495
|
+
- Mixing blueprint artifacts with pushable implementation assets. Blueprint files belong under `.rabetbase/blueprint`, while SQL and Backend Function sources belong under their existing `.rabetbase/sql` and `.rabetbase/bff` directories.
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
平台是唯一 source of truth。团队长期维护 SQL 时,优先使用 **本地同步工作流**:`sql create / pull / status / push / delete` + `.rabetbase/sql.lock.json`。
|
|
8
8
|
|
|
9
|
-
SQL 内容编写、参数绑定与 MyBatis 语法以 [`sql-mybatis.md`](sql-mybatis.md) 为准。页面和
|
|
9
|
+
SQL 内容编写、参数绑定与 MyBatis 语法以 [`sql-mybatis.md`](sql-mybatis.md) 为准。页面和 Backend Function 执行已发布的 Custom SQL 时使用 `sqlCode` + `params`。
|
|
10
10
|
|
|
11
11
|
## 工作流
|
|
12
12
|
|
|
@@ -169,7 +169,7 @@ DELETE / DDL(DROP / ALTER / CREATE / TRUNCATE)属高风险,不建议进入
|
|
|
169
169
|
|
|
170
170
|
## SQL 调用差异
|
|
171
171
|
|
|
172
|
-
| 场景 | 前端 SDK |
|
|
172
|
+
| 场景 | 前端 SDK | Backend Function (context.client) |
|
|
173
173
|
|------|---------|---------------------|
|
|
174
174
|
| 返回值 | `{ execSuccess, execResult }` | 直接返回数组 |
|
|
175
175
|
| 调用 | `client.sql.execute({ sqlCode, params })` | `context.client.sql.execute({ sqlCode, params })` |
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
当遇到以下情况时,AI 必须进入本指南定义的诊断模式:
|
|
10
10
|
* 用户说"查询没有结果"、"空数组"
|
|
11
11
|
* 控制台报错"参数格式不正确"、"字段不存在"、"表不存在"
|
|
12
|
-
* 用户说"
|
|
12
|
+
* 用户说"Backend Function 返回结构不对"、"SQL 报错"
|
|
13
13
|
* CLI 命令执行失败,提示"Dataset not found"
|
|
14
14
|
|
|
15
15
|
---
|
|
@@ -41,13 +41,13 @@
|
|
|
41
41
|
3. 逐一核查报错字段是否存在于 `fields` 列表中,注意大小写
|
|
42
42
|
4. 确认无误后再重新生成 SQL 并通过 `rabetbase sql validate --file xxx --format json` 验证
|
|
43
43
|
|
|
44
|
-
### 4. 听到"
|
|
45
|
-
**AI 的第一反应**:检查
|
|
44
|
+
### 4. 听到"Backend Function 查不到数据 / 字段是 undefined"
|
|
45
|
+
**AI 的第一反应**:检查 Backend Function 中的 API 调用方式和 SQL 结果提取。
|
|
46
46
|
|
|
47
|
-
* ❌ 错误排查方向:给
|
|
47
|
+
* ❌ 错误排查方向:给 Backend Function 增加前端 SDK 包装结构
|
|
48
48
|
* ✅ **强制动作**:
|
|
49
49
|
* 检查单条查询是否误用了 `findOne`,必须改为 `getOne`
|
|
50
|
-
* 检查 SQL 执行是否用了 `result.execResult`,在
|
|
50
|
+
* 检查 SQL 执行是否用了 `result.execResult`,在 Backend Function 中,`context.client.sql.execute` **直接返回数组**,没有 `execResult` 这一层
|
|
51
51
|
|
|
52
52
|
### 5. 听到"CLI 报错 / Dataset not found"
|
|
53
53
|
**AI 的第一反应**:检查基础连通性,指导用户确认环境。
|
|
@@ -64,4 +64,4 @@
|
|
|
64
64
|
|
|
65
65
|
* **不要猜**:只要涉及"不存在"、"不匹配",第一步永远是通过 CLI 命令(如 `rabetbase dataset detail`)拉取最新真实数据。
|
|
66
66
|
* **不要盲试**:在没有分析出具体根因前,不要试图通过微调参数名盲目重试。
|
|
67
|
-
* **分清端环境**:报错若是发生在前/后端交互边界,第一时间弄清是前端 SDK 的事,还是
|
|
67
|
+
* **分清端环境**:报错若是发生在前/后端交互边界,第一时间弄清是前端 SDK 的事,还是 Backend Function 脚本里的事,两者的返回值和对象结构不同。
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> 目标:约束 AI 在前端与 Node 环境中生成 Lovrabet SDK 代码时的用法,杜绝凭借通用经验瞎猜 API 结构。
|
|
4
4
|
>
|
|
5
5
|
> 适用范围:前端 / Node 环境中通过 `@lovrabet/sdk` 初始化后的 `client` 调用。
|
|
6
|
-
>
|
|
6
|
+
> Backend Function 脚本中的 `context.client` 由平台注入,API 子集与前端 SDK 有差异;编写 Backend Function 时以 `backend-function.md` 为准。
|
|
7
7
|
|
|
8
8
|
## 何时使用
|
|
9
9
|
|
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
* 初始化 Lovrabet Client
|
|
12
12
|
* 编写模型/数据集的查询与写入代码
|
|
13
13
|
* 在前端或中台服务中执行自定义 SQL
|
|
14
|
-
* 在前端调用 Backend Function (
|
|
14
|
+
* 在前端调用 Backend Function (BF)
|
|
15
15
|
* 处理 API 返回的错误或业务异常
|
|
16
16
|
|
|
17
|
-
不要把本指南里的 `createClient`、`registerModels` 等前端 / Node SDK 初始化能力套用到
|
|
17
|
+
不要把本指南里的 `createClient`、`registerModels` 等前端 / Node SDK 初始化能力套用到 Backend Function。Backend Function 内只使用平台注入的 `context.client`。
|
|
18
18
|
|
|
19
19
|
## 初始化规则
|
|
20
20
|
|
|
@@ -74,7 +74,7 @@ const result = await client.models.article.filter({
|
|
|
74
74
|
|
|
75
75
|
### 写入与删除操作(SDK >= 1.2.0)
|
|
76
76
|
|
|
77
|
-
从 SDK v1.2.0 开始,update 和 delete 支持对象模式(推荐,与
|
|
77
|
+
从 SDK v1.2.0 开始,update 和 delete 支持对象模式(推荐,与 Backend Function 一致)和兼容模式两种写法,单次最多 **1000 条**记录。
|
|
78
78
|
|
|
79
79
|
#### 更新(Update)
|
|
80
80
|
|
|
@@ -148,7 +148,7 @@ async function updateInBatches(ids: number[], batchSize = 1000) {
|
|
|
148
148
|
|
|
149
149
|
### 别名模式(Alias Pattern)
|
|
150
150
|
|
|
151
|
-
如果在前端 / Node SDK 中使用 `registerModels` 定义了别名,批量操作同样支持。此能力不适用于
|
|
151
|
+
如果在前端 / Node SDK 中使用 `registerModels` 定义了别名,批量操作同样支持。此能力不适用于 Backend Function 的 `context.client`。
|
|
152
152
|
|
|
153
153
|
```typescript
|
|
154
154
|
// 注册别名
|
|
@@ -166,7 +166,7 @@ await client.models.primary.update({ id: [1, 2, 3], status: 'active' });
|
|
|
166
166
|
### 强制返回值处理
|
|
167
167
|
SDK 中的 SQL API 返回的是**业务数据层**,包含 `execSuccess` 和 `execResult`:
|
|
168
168
|
* **必须**判断 `execSuccess`,不能直接读结果。
|
|
169
|
-
* 这与
|
|
169
|
+
* 这与 Backend Function 环境中直接返回数组(不带 execResult)有本质区别,**不要混用**。
|
|
170
170
|
|
|
171
171
|
```typescript
|
|
172
172
|
// ✅ 前端/Node SDK 调用 SQL:
|
|
@@ -182,14 +182,14 @@ if (data.execSuccess && data.execResult) {
|
|
|
182
182
|
}
|
|
183
183
|
```
|
|
184
184
|
|
|
185
|
-
## 3. 前端 / Node 调用 Backend Function (
|
|
185
|
+
## 3. 前端 / Node 调用 Backend Function (BF) API
|
|
186
186
|
|
|
187
187
|
### 强制返回值处理
|
|
188
|
-
调用
|
|
188
|
+
调用 Backend Function 返回的直接是你在脚本中 `return` 的业务数据对象。
|
|
189
189
|
* 这里**没有** `execSuccess` 或 `execResult`。
|
|
190
190
|
|
|
191
191
|
```typescript
|
|
192
|
-
// ✅ 调用
|
|
192
|
+
// ✅ 调用 Backend Function
|
|
193
193
|
const dashboard = await client.bff.execute<DashboardData>({
|
|
194
194
|
scriptName: "getUserDashboard",
|
|
195
195
|
params: { userId: "123" },
|
|
@@ -223,5 +223,5 @@ try {
|
|
|
223
223
|
* [ ] 是否把 `orderBy` 写成了 `sort`?
|
|
224
224
|
* [ ] `where` 对象里是否老老实实带了 `$eq` 等操作符?
|
|
225
225
|
* [ ] 处理 SQL 的返回值时,判断了 `execSuccess` 吗?
|
|
226
|
-
* [ ] 处理
|
|
226
|
+
* [ ] 处理 Backend Function 的返回值时,是不是直接使用了业务数据?
|
|
227
227
|
* [ ] 加入了 `try...catch` 块防止整个应用崩溃吗?
|
|
@@ -611,7 +611,7 @@ context 对象在 **JSFunction** 中通过 `config._context` 访问,用于状
|
|
|
611
611
|
}
|
|
612
612
|
```
|
|
613
613
|
|
|
614
|
-
**注意**:脱敏仅影响前端显示,不影响数据源和导出。后续
|
|
614
|
+
**注意**:脱敏仅影响前端显示,不影响数据源和导出。后续 Backend Function 成熟后将下沉到 filter 接口。脱敏字段仍需 `isFetched: true`。
|
|
615
615
|
|
|
616
616
|
---
|
|
617
617
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: PageSchema-external-resources-usage
|
|
3
|
-
description: 外部资源(自定义SQL、
|
|
3
|
+
description: 外部资源(自定义SQL、Backend Function脚本、权限点)在PageSchema中的消费规范,Skill只引用不生成。先验知识:低代码引擎搭建协议、Ant Design 5 组件知识。
|
|
4
4
|
tags: [page-schema, external-resources, custom-sql, bff, permission]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -12,8 +12,8 @@ tags: [page-schema, external-resources, custom-sql, bff, permission]
|
|
|
12
12
|
|
|
13
13
|
**Skill 职责边界**:
|
|
14
14
|
|
|
15
|
-
- ✅ **只消费**:引用已生成的自定义 SQL、
|
|
16
|
-
- ❌ **不生成**:不负责创建新的自定义 SQL、
|
|
15
|
+
- ✅ **只消费**:引用已生成的自定义 SQL、Backend Function 脚本、权限点
|
|
16
|
+
- ❌ **不生成**:不负责创建新的自定义 SQL、Backend Function 脚本、权限点
|
|
17
17
|
|
|
18
18
|
## 2. 自定义 SQL 使用规范
|
|
19
19
|
|
|
@@ -105,9 +105,9 @@ tags: [page-schema, external-resources, custom-sql, bff, permission]
|
|
|
105
105
|
|
|
106
106
|
---
|
|
107
107
|
|
|
108
|
-
## 3.
|
|
108
|
+
## 3. Backend Function 脚本使用规范
|
|
109
109
|
|
|
110
|
-
### 3.1
|
|
110
|
+
### 3.1 Backend Function 脚本类型
|
|
111
111
|
|
|
112
112
|
| 类型 | 说明 | 消费方式 | PageSchema 是否需要配置 |
|
|
113
113
|
|------|------|---------|---------------------|
|
|
@@ -116,8 +116,8 @@ tags: [page-schema, external-resources, custom-sql, bff, permission]
|
|
|
116
116
|
|
|
117
117
|
**职责边界**:
|
|
118
118
|
|
|
119
|
-
- `skill_edit_smart_page_dov2` 只消费 ENDPOINT 类型的
|
|
120
|
-
- HOOK 类型的
|
|
119
|
+
- `skill_edit_smart_page_dov2` 只消费 ENDPOINT 类型的 Backend Function 脚本
|
|
120
|
+
- HOOK 类型的 Backend Function 脚本由平台自动执行,不需要在 PageSchema 中引用
|
|
121
121
|
|
|
122
122
|
### 3.2 ENDPOINT 脚本消费方式
|
|
123
123
|
|
|
@@ -168,9 +168,9 @@ HOOK 脚本绑定到数据集 API 上,在 API 执行前或执行后自动触
|
|
|
168
168
|
|
|
169
169
|
### 3.4 禁止的操作
|
|
170
170
|
|
|
171
|
-
- ❌ 生成新的
|
|
171
|
+
- ❌ 生成新的 Backend Function 脚本代码(HOOK 或 ENDPOINT)
|
|
172
172
|
- ❌ 创建新的 scriptName
|
|
173
|
-
- ❌ 在 PageSchema 中引用 HOOK 类型的
|
|
173
|
+
- ❌ 在 PageSchema 中引用 HOOK 类型的 Backend Function 脚本
|
|
174
174
|
|
|
175
175
|
---
|
|
176
176
|
|
|
@@ -226,7 +226,7 @@ datasetCode -> {
|
|
|
226
226
|
| 资源类型 | 允许操作 | 禁止操作 |
|
|
227
227
|
|---------|---------|---------|
|
|
228
228
|
| 自定义 SQL | 引用 sqlCode | 生成 SQL 语句 |
|
|
229
|
-
|
|
|
229
|
+
| Backend Function 脚本 | 调用 scriptName | 生成脚本代码 |
|
|
230
230
|
| 权限点 | 使用当前表格内置权限过滤 | 生成权限字段或创建权限点 |
|
|
231
231
|
|
|
232
232
|
**用户需要新建资源时**:引导用户到平台手动配置,获取 code/name 后帮助配置到 Schema。
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
管理当前应用的运行态 app-config key。事实源是平台 app-config 管理面,不是本地 `.rabetbase.json`;本地配置仍用 `rabetbase config` / `rabetbase app` 管理。
|
|
4
4
|
|
|
5
|
-
`value` 默认按敏感内容处理:`list` 和默认 `get` 不输出明文,`set --dry-run` / `delete --dry-run` 也不输出明文。不要把 app-config value 写入本地配置、缓存、日志或命令参数转发给业务
|
|
5
|
+
`value` 默认按敏感内容处理:`list` 和默认 `get` 不输出明文,`set --dry-run` / `delete --dry-run` 也不输出明文。不要把 app-config value 写入本地配置、缓存、日志或命令参数转发给业务 Backend Function。
|
|
6
6
|
|
|
7
7
|
## 命令
|
|
8
8
|
|
|
@@ -92,4 +92,4 @@ rabetbase app-config delete vectorengine.apiKey --yes
|
|
|
92
92
|
|
|
93
93
|
## 业务消费
|
|
94
94
|
|
|
95
|
-
rabetbase 负责维护运行态 app-config 管理面。业务代码需要敏感配置时,应由服务端
|
|
95
|
+
rabetbase 负责维护运行态 app-config 管理面。业务代码需要敏感配置时,应由服务端 Backend Function 上下文通过 `context.appConfig.get(...)` 读取并消费;不要让 Agent 先 `--reveal` value,再把明文作为 `lovrabet bff exec` 参数或脚本参数传入。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# bff create
|
|
2
2
|
|
|
3
|
-
在本地脚手架创建一个新的
|
|
3
|
+
在本地脚手架创建一个新的 Backend Function 脚本文件。
|
|
4
4
|
|
|
5
5
|
## 命令
|
|
6
6
|
|
|
@@ -31,7 +31,7 @@ rabetbase bff create --type HOOK --name beforeFilter --alias appUser --operation
|
|
|
31
31
|
| COMMON | `.rabetbase/bff/<appCode>/COMMON/<name>.js` |
|
|
32
32
|
| HOOK | `.rabetbase/bff/<appCode>/HOOK/<alias-or-datasetCode>/<operationType>/<functionNode>/<name>.js` |
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
Backend Function 源码**仅**应在此目录树内创建与长期维护(与 `bff status` / `bff push` 扫描一致);不要在本仓库其他路径手写 Backend Function 再尝试推送。
|
|
35
35
|
|
|
36
36
|
## 脚手架边界
|
|
37
37
|
|
|
@@ -42,7 +42,7 @@ BFF 源码**仅**应在此目录树内创建与长期维护(与 `bff status` /
|
|
|
42
42
|
|
|
43
43
|
脚手架会生成中文 JSDoc 契约,包含真实接口/配置地址、根请求参数、返回值,以及依赖数据集、调用 BF、执行 SQL、副作用等维护项。提交前必须按实际代码补充每个 `params.<字段名>` 的类型与含义,更新依赖维护项;显式抛出异常时还要补充 `@throws`。无依赖或无副作用的项目可以保留“无”,不能把模板提示当作已确认的业务事实。
|
|
44
44
|
|
|
45
|
-
创建可由 CLI 调用的通知型
|
|
45
|
+
创建可由 CLI 调用的通知型 Backend Function 时使用 `ENDPOINT`,并先用 [`rabetbase notification config-list`](rabetbase-notification-config-list.md) 确认当前应用真实的通知 `configCode`。纯通知 ENDPOINT 不需要虚构数据集;脚本只通过 `context.client.extension.execute("notification", "send", ...)` 使用 `configCode`、`audiences`、`message`,不得写渠道地址或密钥。
|
|
46
46
|
|
|
47
47
|
## 提示
|
|
48
48
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# bff detail
|
|
2
2
|
|
|
3
|
-
根据 ID 获取
|
|
3
|
+
根据 ID 获取 Backend Function 脚本详情(含完整脚本内容)。
|
|
4
4
|
|
|
5
5
|
## 命令
|
|
6
6
|
|
|
@@ -13,13 +13,13 @@ rabetbase bff detail --id 42 --verbose --format json
|
|
|
13
13
|
|
|
14
14
|
| Flag | 类型 | 必填 | 默认 | 说明 |
|
|
15
15
|
|------|------|------|------|------|
|
|
16
|
-
| `--id <id>` | number | 是 | — |
|
|
16
|
+
| `--id <id>` | number | 是 | — | Backend Function 脚本 ID(从 `bff list` 获取) |
|
|
17
17
|
| `--verbose` | boolean | 否 | — | 返回完整原始对象 |
|
|
18
18
|
| `--format <fmt>` | string | 否 | `pretty` | 输出格式 |
|
|
19
19
|
|
|
20
20
|
## 输出
|
|
21
21
|
|
|
22
|
-
返回
|
|
22
|
+
返回 Backend Function 脚本的完整信息:id、functionName、scriptContent(完整脚本源码)、scriptType、description。
|
|
23
23
|
|
|
24
24
|
## 使用边界
|
|
25
25
|
|
|
@@ -27,7 +27,7 @@ rabetbase bff detail --id 42 --verbose --format json
|
|
|
27
27
|
|
|
28
28
|
## 提示
|
|
29
29
|
|
|
30
|
-
- 修改已有
|
|
30
|
+
- 修改已有 Backend Function 前必须先用此命令拉取最新内容(平台是 source of truth)
|
|
31
31
|
- scriptContent 是完整的 JavaScript 源码
|
|
32
32
|
- 需要落本地维护时,优先用 `rabetbase bff pull --format json` 同步到规范目录
|
|
33
33
|
|