@lovrabet/rabetbase-cli 2.5.3-beta.2 → 2.5.3-beta.4
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/lib/api/api-doc.js +1 -1
- package/lib/api/api-group.d.ts +22 -0
- package/lib/api/api-group.js +1 -0
- package/lib/api/fetch-model-list.js +1 -1
- package/lib/api/generate-api-file.d.ts +18 -2
- package/lib/api/generate-api-file.js +1 -1
- package/lib/api/generate-sdk-config-file.js +1 -1
- package/lib/api/legacy-api-file.d.ts +11 -0
- package/lib/api/legacy-api-file.js +1 -0
- package/lib/api/model-registry-file.d.ts +36 -0
- package/lib/api/model-registry-file.js +1 -0
- package/lib/api/model-registry-scaffold.d.ts +7 -0
- package/lib/api/model-registry-scaffold.js +1 -0
- package/lib/api/model-source.d.ts +6 -0
- package/lib/api/model-source.js +1 -0
- 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/logs.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 +7 -0
- 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/delete.js +1 -1
- package/lib/commands/config/get.js +1 -1
- package/lib/commands/config/index.js +1 -1
- package/lib/commands/config/init.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/dataset/batch-design.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/cross-relation-create.d.ts +2 -0
- package/lib/commands/dataset/cross-relation-create.js +1 -0
- package/lib/commands/dataset/cross-relation-delete.d.ts +2 -0
- package/lib/commands/dataset/cross-relation-delete.js +1 -0
- package/lib/commands/dataset/cross-relation-list.d.ts +2 -0
- package/lib/commands/dataset/cross-relation-list.js +1 -0
- package/lib/commands/dataset/cross-relation-shared.d.ts +190 -0
- package/lib/commands/dataset/cross-relation-shared.js +1 -0
- package/lib/commands/dataset/cross-relation-update.d.ts +2 -0
- package/lib/commands/dataset/cross-relation-update.js +1 -0
- 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-restore.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/dataset/user-deleted-field-list.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/table-diff-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/deployment/index.js +1 -1
- package/lib/commands/deployment/sync-all.js +1 -1
- package/lib/commands/deployment/sync-jobs.js +1 -1
- package/lib/commands/deployment/sync-status.js +1 -1
- package/lib/commands/doctor.js +1 -1
- package/lib/commands/file/index.js +1 -1
- package/lib/commands/flow/create.js +1 -1
- package/lib/commands/flow/detail.js +1 -1
- package/lib/commands/flow/index.js +1 -1
- package/lib/commands/flow/list.js +1 -1
- package/lib/commands/flow/publish.js +1 -1
- package/lib/commands/flow/runtime-resources-shared.js +1 -1
- package/lib/commands/flow/runtime-role-list.js +1 -1
- package/lib/commands/flow/runtime-role-user-list.js +1 -1
- package/lib/commands/flow/runtime-user-search.js +1 -1
- package/lib/commands/flow/shared.js +1 -1
- package/lib/commands/flow/update.js +1 -1
- package/lib/commands/flow/validate.js +1 -1
- package/lib/commands/instant-api-policy/current.js +1 -1
- package/lib/commands/instant-api-policy/index.js +1 -1
- package/lib/commands/instant-api-policy/init.js +1 -1
- package/lib/commands/instant-api-policy/publish.js +1 -1
- package/lib/commands/instant-api-policy/pull.js +1 -1
- package/lib/commands/instant-api-policy/revision.js +1 -1
- package/lib/commands/instant-api-policy/revisions.js +1 -1
- package/lib/commands/instant-api-policy/rollback.js +1 -1
- package/lib/commands/instant-api-policy/shared.js +1 -1
- package/lib/commands/instant-api-policy/validate.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/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/api-architecture-upgrade.d.ts +28 -0
- package/lib/commands/project/api-architecture-upgrade.js +1 -0
- 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/domain-routing-sync.js +1 -1
- package/lib/commands/project/index.js +1 -1
- package/lib/commands/project/upgrade.d.ts +30 -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/rule/get.js +1 -1
- package/lib/commands/rule/index.js +1 -1
- package/lib/commands/rule/list.js +1 -1
- package/lib/commands/rule/set.js +1 -1
- package/lib/commands/rule/shared.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/domain-config.js +1 -1
- package/lib/config/project-domain-routing.js +1 -1
- package/lib/config/region-config.js +1 -1
- package/lib/config/schema.js +1 -1
- package/lib/constant/cdn.d.ts +5 -3
- 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/region.js +1 -1
- package/lib/constant/risk.js +1 -1
- package/lib/constant/routing-profile.js +1 -1
- package/lib/context/app-resolver.d.ts +2 -0
- 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.d.ts +2 -1
- package/lib/context.js +1 -1
- package/lib/core/alias-resolver.d.ts +13 -17
- package/lib/core/alias-resolver.js +1 -1
- package/lib/core/api-client.d.ts +6 -0
- package/lib/core/api-client.js +1 -1
- package/lib/core/bff/config.js +1 -1
- package/lib/core/bff/file-system.js +1 -1
- package/lib/core/bff/hash.js +1 -1
- package/lib/core/bff/hook-directory.js +1 -1
- package/lib/core/bff/lock.js +1 -1
- package/lib/core/bff/utils.js +1 -1
- package/lib/core/cross-db-relation.d.ts +41 -0
- package/lib/core/cross-db-relation.js +1 -0
- package/lib/core/db-resolver.js +1 -1
- package/lib/core/flow-config.js +1 -1
- package/lib/core/instant-api-policy/config.js +1 -1
- package/lib/core/kb-search-client.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/page/lr-smart-jsx.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.d.ts +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/supported-flags.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/generated/official-routing.js +1 -1
- package/lib/generated/routing-contract.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.d.ts +0 -10
- 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/types/index.d.ts +11 -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.d.ts +19 -0
- 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/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 +6 -1
- package/skills/rabetbase/SKILL.md +16 -10
- package/skills/rabetbase/guides/backend-function.md +5 -1
- package/skills/rabetbase/guides/bff-creation-workflow.md +3 -1
- package/skills/rabetbase/guides/cross-database-bff.md +70 -0
- package/skills/rabetbase/guides/data-api-guidelines.md +35 -33
- package/skills/rabetbase/guides/sdk-client-generation.md +112 -61
- package/skills/rabetbase/guides/sql-creation-workflow.md +2 -0
- package/skills/rabetbase/guides/typescript-sdk.md +9 -0
- package/skills/rabetbase/references/rabetbase-api-pull.md +30 -19
- package/skills/rabetbase/references/rabetbase-app-list.md +1 -1
- package/skills/rabetbase/references/rabetbase-config.md +2 -1
- package/skills/rabetbase/references/rabetbase-dataset-cross-relations.md +64 -0
- package/skills/rabetbase/references/rabetbase-project-create.md +3 -3
- package/skills/rabetbase/references/rabetbase-project-upgrade.md +24 -13
- package/skills/rabetbase.manifest.json +5 -3
- package/templates/README.md +46 -6
- package/templates/generate-api/model-runtime.ts.tpl +101 -0
- package/templates/generate-api/profile-api.ts.tpl +21 -0
- package/templates/generate-api/profile-client.ts.tpl +14 -0
|
@@ -1,8 +1,18 @@
|
|
|
1
|
-
# SDK
|
|
1
|
+
# SDK 客户端代码生成(稳定入口与模型注册表)
|
|
2
2
|
|
|
3
|
-
> 目标:根据 `rabetbase api pull`
|
|
3
|
+
> 目标:根据 `rabetbase api pull` 返回的数据集事实,维护浏览器子应用的稳定 SDK 入口,并让同一套业务 API 的不同部署使用各自正确的 `datasetCode`。
|
|
4
4
|
>
|
|
5
|
-
>
|
|
5
|
+
> 单应用或显式配置同一 `apiGroup` 的 profile 使用注册表模式:`project create` / `project upgrade` 维护稳定源码结构,`api pull` 只刷新 `models.generated.ts` 中的模型事实。`apiGroup` 只负责归并,不进入文件名或运行时对象。
|
|
6
|
+
|
|
7
|
+
## 重要运行边界:一次运行只选择一个 profile
|
|
8
|
+
|
|
9
|
+
注册表模式解决的是:**同一份业务代码分别部署到不同节点,并由当前 Runtime Domain 选择唯一 profile**。它不提供跨节点数据访问,也不把多个 profile 合并成一个可同时查询的浏览器 client。
|
|
10
|
+
|
|
11
|
+
- 业务代码始终通过稳定 alias 调用 `lovrabetClient.models.<alias>`;不要读取注册表后自行挑选其他 profile 的 `datasetCode`,也不要把该代码硬编码进业务模块。
|
|
12
|
+
- 当前 profile 只物化自己的模型。仅其他 profile 存在的 alias 不会注册到当前 client;误用时应保留 SDK 的 `MODEL_NOT_FOUND`,不得回退默认 profile 或借用其他节点的代码。
|
|
13
|
+
- 节点独有功能可先检查 `LOVRABET_PROFILE_NAME` 再决定是否调用;共享功能不需要分支,同一 alias 会自动绑定当前 profile 的代码。
|
|
14
|
+
- 浏览器 Cookie 与 Runtime Domain 都属于当前节点。不要为了“一次查询两端”在浏览器中创建两个 profile client、跨 Domain 转发认证信息或绕过 Domain 选择器。
|
|
15
|
+
- 真正需要跨节点读取、比对或聚合时,使用具备明确认证和授权边界的可信服务端或 Backend Function 编排;CLI 侧排查则分别用 `--app <profile>` 查询,不把两个 profile 当成一个运行实例。
|
|
6
16
|
|
|
7
17
|
## 何时执行
|
|
8
18
|
|
|
@@ -10,7 +20,7 @@
|
|
|
10
20
|
|
|
11
21
|
- 刚执行 `rabetbase api pull` 或 `rabetbase project create`(带 appCode)
|
|
12
22
|
- 平台增删了 Dataset,本地 `models` 过期
|
|
13
|
-
- `api.ts` / `client.ts`
|
|
23
|
+
- `api.ts` / `client.ts` 缺失、注册表为空、或生成 profile 的 AppCode 仍是 `NOT-SET`
|
|
14
24
|
- 用户要求修复 SDK 客户端初始化
|
|
15
25
|
|
|
16
26
|
不要凭空编造 `datasetCode`。不要把本指南里的浏览器 Cookie 客户端写成服务端 `accessKey` 客户端。
|
|
@@ -18,95 +28,134 @@
|
|
|
18
28
|
## 工作流
|
|
19
29
|
|
|
20
30
|
```
|
|
31
|
+
rabetbase project upgrade --dry-run
|
|
32
|
+
→ 审阅 apiArchitecture.groups[].files[]
|
|
33
|
+
rabetbase project upgrade --yes
|
|
34
|
+
→ 标准旧脚手架自动备份迁移;业务定制生成候选入口
|
|
21
35
|
rabetbase api pull --format compress
|
|
22
36
|
→ 单应用读 data;项目应用清单逐项读 data.apps[]
|
|
23
|
-
→ 读取每项的 models /
|
|
24
|
-
→
|
|
25
|
-
→
|
|
26
|
-
→ 不要改已经正确的 createClient({ apiConfigName, ...LOVRABET_SDK_CONFIG })
|
|
37
|
+
→ 读取每项的 models / modelProfile / files / needsProjectUpgrade
|
|
38
|
+
→ 注册表模式检查 models.generated.ts / model-runtime.ts / api.ts / client.ts
|
|
39
|
+
→ 验证最终 Runtime Domain 能选中目标 profile
|
|
27
40
|
```
|
|
28
41
|
|
|
29
|
-
1.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
4. SDK 路由文件由 CLI 维护(`data.files.sdkConfig.action === "refreshed"`),不要往里面写 `cookie` / `accessKey` / `token`。若保留的旧 `{name}-client.ts` 仍导入共享 `./sdk-config`,只把该 import 改为 `./{name}-sdk-config`,其余本地定制保持不变。
|
|
37
|
-
5. 看 `data.needsAgentMerge` 和 `data.files.*.action`,**不要**用已删除的 `wroteScaffold`:
|
|
38
|
-
- `needsAgentMerge === false` 且 `api`/`client` 均为 `created` 或 `overwritten`:脚手架已按当前 `models` 写好,只需检查项目 extras。
|
|
39
|
-
- `needsAgentMerge === true`:至少有一个 TypeScript 文件被 **preserved**。先比较本地配置与返回事实,只在有差异时合并;即使 `client` 刚 `created`,也不能据此跳过对已保留 `api.ts` 的检查。
|
|
40
|
-
6. 默认应用:`data.isDefaultConfig === true`,`data.configName === "default"`,代码里用 `CONFIG_NAMES.DEFAULT`。
|
|
41
|
-
7. 具名应用:`data.isDefaultConfig === false`,`data.configName` 是不含引号的名字(如 `order`),`registerModels(..., "order")` 与 `apiConfigName: "order"`。不要把 `configName` 再包一层引号。
|
|
42
|
+
1. 已有项目先执行 `rabetbase project upgrade --dry-run`。标准旧脚手架可直接正式升级;`manual-merge` 表示原入口含业务定制,正式升级只会写候选文件,不会覆盖原文件。
|
|
43
|
+
2. 执行 `rabetbase project upgrade --yes` 后审阅 `apiArchitecture.manualMergeRequired`。候选文件在 `.rabetbase/project-upgrade/api-model-registry-v2/candidates/`;完成合并前不要删除原入口。
|
|
44
|
+
3. 执行 `rabetbase api pull --format compress`(需要人类可读缩进时用 `--format json`),刷新远端 Dataset 事实。不要自动添加 `--force`;它在注册表模式只用于明确接受空结果。
|
|
45
|
+
4. 直接单应用结果使用 `data.models`;项目应用清单结果逐项使用 `data.apps[].models`。不要手写或猜测 `datasetCode`。
|
|
46
|
+
5. `data.modelProfile` 存在时检查 `data.files.modelRegistry`:同一平台 `alias` 只有一条模型,`tableName` 必须在各 profile 间一致。所有当前 profile 都存在且代码相同时使用 `datasetCode`;代码不同或仅部分 profile 存在时使用 `datasetCodes[modelProfile]`,缺失 profile 不写空字符串。
|
|
47
|
+
6. `model-runtime.ts` 由项目创建/升级维护,`models.generated.ts` 由 pull 刷新;都不要写入凭据或应用业务函数。若 `data.needsProjectUpgrade === true`,回到第 1 步,不要手工覆盖入口。
|
|
48
|
+
7. 一个 AppCode 对应多个 profile 时,所有拉取与别名写操作都用 `--app <profile>`;不要使用有歧义的 `--appcode`。AppCode 相同不会自动归并,只有显式相同的 `apiGroup` 才表示共享业务 API。
|
|
42
49
|
|
|
43
50
|
## 权威结构
|
|
44
51
|
|
|
45
52
|
浏览器子应用的权威形态与 `templates/projects/sub-app-react-demo/src/api/` 一致。脚手架模板是 `templates/generate-api/*.tpl`,生成结果应对齐 demo,而不是另造一套。
|
|
46
53
|
|
|
47
|
-
###
|
|
54
|
+
### models.generated.ts(CLI 生成事实)
|
|
48
55
|
|
|
49
56
|
```typescript
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
57
|
+
/* rabetbase-model-registry:v2 */
|
|
58
|
+
export const LOVRABET_MODEL_REGISTRY = {
|
|
59
|
+
defaultProfile: "oa-cn",
|
|
60
|
+
profiles: {
|
|
61
|
+
"oa-cn": {
|
|
62
|
+
appCode: "app-xxxxxxxx",
|
|
63
|
+
runtimeDomain: "https://runtime.lovrabet.com",
|
|
64
|
+
},
|
|
65
|
+
"oa-id": {
|
|
66
|
+
appCode: "app-xxxxxxxx",
|
|
67
|
+
runtimeDomain: "https://runtime.lovrabet.id",
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
models: [
|
|
71
|
+
{
|
|
72
|
+
alias: "paymentApplication",
|
|
73
|
+
tableName: "payment_application",
|
|
74
|
+
name: "Payment Application",
|
|
75
|
+
datasetCode: "shared-dataset-code",
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
alias: "orders",
|
|
79
|
+
tableName: "orders",
|
|
80
|
+
name: "Orders",
|
|
81
|
+
datasetCodes: {
|
|
82
|
+
"oa-cn": "cn-dataset-code",
|
|
83
|
+
"oa-id": "id-dataset-code",
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
} as const;
|
|
55
88
|
```
|
|
56
89
|
|
|
57
|
-
|
|
90
|
+
- 以平台稳定 `alias` 作为跨 profile 的模型归并键,`tableName` 作为一致性校验;同 alias 指向不同表或同表出现不同 alias 时停止写入。
|
|
91
|
+
- 默认 profile 提供公共 `alias` / `name`;其他 profile 的同表展示名不同不会制造第二份模型。
|
|
92
|
+
- 所有当前 profile 都存在且 Dataset 代码相同时只写单数 `datasetCode`。
|
|
93
|
+
- 某 profile 独有的表只包含自己的 `datasetCodes` key;运行时不会把它提供给其他 profile。
|
|
94
|
+
- 文件版本由 CLI 专用注释标记识别,不进入应用运行时对象。
|
|
95
|
+
- 此文件由 CLI 原子刷新,不手工编辑。
|
|
58
96
|
|
|
59
|
-
###
|
|
97
|
+
### model-runtime.ts(通用选择器)
|
|
60
98
|
|
|
61
|
-
|
|
62
|
-
import { registerModels, CONFIG_NAMES, type ModelsConfig } from "@lovrabet/sdk";
|
|
99
|
+
该文件根据平台注入的 Runtime Domain 选择唯一 profile;本地构建读取项目根目录的 `rabetbase.domain-routing.json`。零匹配或多匹配都直接报错,不回退 `defaultProfile`。它只将所选 profile 物化为 SDK 的 `{ appCode, models }`,不会创建多节点 client,不放业务函数,也不硬编码具体 Dataset。
|
|
63
100
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
export const LOVRABET_MODELS_CONFIG: ModelsConfig = {
|
|
67
|
-
appCode: LOVRABET_APP_CODE,
|
|
68
|
-
models: [
|
|
69
|
-
{ datasetCode: "abc123", tableName: "orders", name: "订单", alias: "orders" },
|
|
70
|
-
],
|
|
71
|
-
} as const;
|
|
101
|
+
### api.ts
|
|
72
102
|
|
|
103
|
+
```typescript
|
|
104
|
+
import { registerModels, CONFIG_NAMES } from "@lovrabet/sdk";
|
|
105
|
+
import projectRouting from "../../rabetbase.domain-routing.json";
|
|
106
|
+
import { LOVRABET_MODEL_REGISTRY } from "./models.generated";
|
|
107
|
+
import { resolveActiveModelConfig } from "./model-runtime";
|
|
108
|
+
|
|
109
|
+
const activeModelConfig = resolveActiveModelConfig(
|
|
110
|
+
LOVRABET_MODEL_REGISTRY,
|
|
111
|
+
projectRouting.domains.runtime,
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
export const LOVRABET_PROFILE_NAME = activeModelConfig.profileName;
|
|
115
|
+
export const LOVRABET_APP_CODE = activeModelConfig.appCode;
|
|
116
|
+
export const LOVRABET_RUNTIME_DOMAIN = activeModelConfig.runtimeDomain;
|
|
117
|
+
export const LOVRABET_MODELS_CONFIG = activeModelConfig.modelsConfig;
|
|
73
118
|
registerModels(LOVRABET_MODELS_CONFIG, CONFIG_NAMES.DEFAULT);
|
|
74
119
|
```
|
|
75
120
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
121
|
+
`api.ts` 只负责连接注册表、路由事实和 SDK 注册。业务层继续从原路径 import,无需感知 profile 数量。
|
|
122
|
+
|
|
123
|
+
`registerModels` 是 `@lovrabet/sdk` 的独立命名导出,**不是** `client.registerModels()`。
|
|
124
|
+
|
|
125
|
+
历史未分组项目仍兼容读取具名前缀文件及项目内相对转导出。例如 `api.ts` 可写 `export { APP_MODELS_CONFIG as LOVRABET_MODELS_CONFIG } from "./app-api"`。CLI 会静态读取本地 `export … from` 目标,不执行 TypeScript;HOOK 目录和 `--code` alias 会使用汇总后的模型别名。每个 Dataset 必须只有一个 alias,且一个 alias 不能对应多个 Dataset;冲突时 CLI 会停止而不是猜测绑定目标。旧式前缀路径的默认应用使用 `CONFIG_NAMES.DEFAULT`,具名应用使用 `data.configName`;数字开头的文件前缀继续使用 `APP_` 变量前缀。
|
|
81
126
|
|
|
82
127
|
### client.ts(Cookie-first)
|
|
83
128
|
|
|
84
129
|
```typescript
|
|
85
130
|
import { createClient, CONFIG_NAMES } from "@lovrabet/sdk";
|
|
86
|
-
import "./api";
|
|
131
|
+
import { LOVRABET_RUNTIME_DOMAIN } from "./api";
|
|
87
132
|
import { LOVRABET_SDK_CONFIG } from "./sdk-config";
|
|
88
133
|
|
|
89
134
|
export const lovrabetClient = createClient({
|
|
90
135
|
apiConfigName: CONFIG_NAMES.DEFAULT,
|
|
91
136
|
...LOVRABET_SDK_CONFIG,
|
|
137
|
+
runtimeDomain: LOVRABET_RUNTIME_DOMAIN,
|
|
92
138
|
});
|
|
93
139
|
```
|
|
94
140
|
|
|
95
|
-
- 必须 `import "./api"`(或 `./{prefix}-api`)以执行 `registerModels`。
|
|
96
141
|
- 浏览器子应用默认登录态 Cookie:省略 `authMode`,**不要**在此文件写入 `accessKey` / `token`。
|
|
97
|
-
-
|
|
98
|
-
|
|
142
|
+
- `runtimeDomain` 放在 spread 之后,确保运行时选中的 profile 是最终路由事实。
|
|
143
|
+
|
|
144
|
+
### sdk-config.ts(路由,无凭证)
|
|
145
|
+
|
|
146
|
+
该文件仍由 CLI 刷新并保持浏览器安全。注册表模式的最终 Runtime Domain 来自 `api.ts`,项目的完整公开 Domain 与资源策略由 `rabetbase project domain-routing-sync` 写入 `rabetbase.domain-routing.json`。
|
|
147
|
+
|
|
148
|
+
## apiGroup、目录隔离与旧式兼容
|
|
99
149
|
|
|
100
|
-
|
|
150
|
+
CLI 仍能读取已有 `[name-]api.ts` 中的 `models`,页面与 BFF 的 `--alias` 不会立即失效。迁移时:
|
|
101
151
|
|
|
102
|
-
|
|
152
|
+
- 先执行 `project upgrade --dry-run`,审阅标准生成文件与业务定制文件的分类。
|
|
153
|
+
- 有本地定制时,将业务 helper 移到独立业务模块;不要放进 `models.generated.ts` 或 `model-runtime.ts`。
|
|
154
|
+
- 正式执行 `project upgrade --yes`;标准旧入口先备份再替换,定制入口只生成候选文件。
|
|
155
|
+
- 执行 `api pull --format compress` 刷新远端事实;业务 import 继续指向 `src/api/api.ts` / `client.ts`。
|
|
156
|
+
- 旧的 `[name-]api.ts` / `[name-]client.ts` 可在确认无引用后再删除;CLI 不自动删除用户文件。
|
|
103
157
|
|
|
104
|
-
|
|
105
|
-
- **删除**:本地有、pull 没有的 `datasetCode`,从 `models` 移除
|
|
106
|
-
- **更新**:同一 `datasetCode` 的 `tableName` / `name` 以 pull 为准
|
|
107
|
-
- **别名**:本地已有且仍对应同一 `datasetCode` 的 `alias` 保留;新建项使用 pull 给出的 `alias`
|
|
108
|
-
- **保留 extras**:额外的 `registerModels(...)`、额外 client 导出、项目自定义注释(非 Generated 头)不要删
|
|
109
|
-
- **多应用**:继续使用 CLI 的 `{name}-api.ts` / `{name}-client.ts` 命名,不要把多个 app 的 models 揉进同一个 `api.ts`
|
|
158
|
+
`apiGroup` 是显式 join key:同组 profile 的 AppCode 可以相同或不同,但必须使用同一规范化 `apiDir`;同一 `apiDir` 也只能承载一个显式组。`./src/api`、`src/api`、`src/api/` 会视为同一目录。第二套业务使用独立目录,例如 `src/api/finance`,目录内仍是无前缀的 `api.ts` / `client.ts`。同一目录下多个未配置 `apiGroup` 的历史 profile 继续使用 `[name-]api.ts` / `[name-]client.ts`,不会被静默归并。
|
|
110
159
|
|
|
111
160
|
## 认证(不要写进浏览器 client.ts)
|
|
112
161
|
|
|
@@ -138,13 +187,15 @@ export const lovrabetClient = createClient({
|
|
|
138
187
|
| 字段 | 含义 |
|
|
139
188
|
|------|------|
|
|
140
189
|
| `appCode` | 当前应用 |
|
|
141
|
-
| `
|
|
142
|
-
| `isDefaultConfig` | 默认应用为 `true` |
|
|
190
|
+
| `modelProfile` | 本次刷新的 profile;旧式输出可省略 |
|
|
143
191
|
| `models[]` | `datasetCode` / `tableName` / `name` / `alias` |
|
|
144
192
|
| `sdkRouting` | `{ runtimeDomain?: string }` |
|
|
145
|
-
| `files.api` / `files.client` / `files.sdkConfig` |
|
|
146
|
-
| `
|
|
147
|
-
| `
|
|
193
|
+
| `files.api` / `files.client` / `files.sdkConfig` | 稳定入口与 SDK 路由的路径及动作 |
|
|
194
|
+
| `files.modelRegistry` / `files.modelRuntime` | 注册表模式的模型事实与通用选择器路径及动作 |
|
|
195
|
+
| `needsAgentMerge` | 兼容字段;旧式或自定义入口尚未接入注册表时为 `true` |
|
|
196
|
+
| `needsProjectUpgrade` | 注册表事实已刷新,但稳定源码入口缺失或仍为旧结构时为 `true` |
|
|
197
|
+
| `apiFilePath` / `clientFilePath` / `sdkConfigPath` | 稳定入口与 SDK 路由路径 |
|
|
198
|
+
| `modelRegistryPath` / `modelRuntimePath` | 注册表模式下的生成文件路径 |
|
|
148
199
|
| `modelCount` / `datasetCount` | 模型数量 |
|
|
149
200
|
|
|
150
201
|
多应用时 `data.apps[]` 为上述对象的数组。
|
|
@@ -27,6 +27,8 @@ SQL 内容编写、参数绑定与 MyBatis 语法以 [`sql-mybatis.md`](sql-myba
|
|
|
27
27
|
### 3. 校验字段
|
|
28
28
|
执行 `rabetbase dataset detail --code <数据集编码> --format json` 确认表名、字段名、字段类型。禁止凭经验猜。
|
|
29
29
|
|
|
30
|
+
同时核对各表所属连接与该 SQL 的执行连接;同名表须按真实连接消歧。不同连接的逻辑关联由 [跨库 BFF 查询与拼接](cross-database-bff.md)编排分库读取,不能用跨库 JOIN、子查询或视图绕过边界。`sql validate` 的静态检查不证明跨连接可执行、权限完整或全局结果正确。
|
|
31
|
+
|
|
30
32
|
### 4. 先把 SQL 拉/落到同步目录
|
|
31
33
|
|
|
32
34
|
#### 修改已有 SQL
|
|
@@ -18,6 +18,15 @@
|
|
|
18
18
|
|
|
19
19
|
生成或更新项目里的 `src/api/api.ts` / `client.ts` 时,先 `rabetbase api pull --format compress`,再遵守 [`sdk-client-generation.md`](sdk-client-generation.md)。浏览器子应用的默认 client 是 Cookie + `...LOVRABET_SDK_CONFIG`,不要把下面的服务端 `accessKey` 示例写进 `src/api/client.ts`。
|
|
20
20
|
|
|
21
|
+
## 多 profile 的调用边界
|
|
22
|
+
|
|
23
|
+
CLI 生成的多 profile 注册表用于**同一份代码在不同节点分别运行**:当前 Runtime Domain 必须且只能选中一个 profile,随后业务代码通过同一 alias 使用该 profile 的 `datasetCode`。它不表示一个浏览器实例能同时查询多个节点。
|
|
24
|
+
|
|
25
|
+
- 不在业务代码中读取 `datasetCodes`、指定另一个 profile,或硬编码任一节点的 DatasetCode。
|
|
26
|
+
- 当前 profile 没有某 alias 时,让 SDK 抛出 `MODEL_NOT_FOUND`;节点独有功能可先检查生成入口导出的 `LOVRABET_PROFILE_NAME`,不得回退默认 profile。
|
|
27
|
+
- 不在浏览器中创建多个跨 Domain client 或转发 Cookie、AccessKey、token。确需跨节点聚合时,由可信服务端或 Backend Function 按明确授权编排。
|
|
28
|
+
- 只需分别验证节点数据时,使用对应项目 profile 和运行态工具逐端验证,不把它实现成业务前端的跨节点调用。
|
|
29
|
+
|
|
21
30
|
## 初始化规则
|
|
22
31
|
|
|
23
32
|
必须使用 `createClient` 命名导出,禁止使用 `new LovrabetClient()`:
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# api pull
|
|
2
2
|
|
|
3
|
-
拉取当前 App 下所有数据集(Dataset
|
|
3
|
+
拉取当前 App 下所有数据集(Dataset)的元信息并刷新 SDK 模型事实。单应用与显式配置同一 `apiGroup` 的多部署项目使用稳定的 `api.ts` / `client.ts`,CLI 将模型写入 `models.generated.ts`,由 `model-runtime.ts` 按最终 Runtime Domain 选择 profile。项目公开 Domain 路由由 [`project domain-routing-sync`](rabetbase-project-domain-routing-sync.md) 独立维护。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
`apiGroup` 只作为归并键,不进入文件名。第二套业务使用独立 `apiDir`,目录内仍是无前缀入口。同一目录中多个未配置 `apiGroup` 的历史 profile 继续使用 `[name-]api.ts` / `[name-]client.ts`。`api pull` 只刷新模型事实;已有应用的稳定入口迁移由 [`project upgrade`](rabetbase-project-upgrade.md) 负责。Agent 按 [`sdk-client-generation.md`](../guides/sdk-client-generation.md) 检查输出。
|
|
6
6
|
|
|
7
7
|
## 命令
|
|
8
8
|
|
|
@@ -13,8 +13,8 @@ rabetbase api pull --format compress
|
|
|
13
13
|
# 指定输出目录
|
|
14
14
|
rabetbase api pull --output ./src/generated/api/ --format compress
|
|
15
15
|
|
|
16
|
-
#
|
|
17
|
-
rabetbase api pull --force --yes --format compress
|
|
16
|
+
# 确认远端清单确实为空,允许清空当前 profile
|
|
17
|
+
rabetbase api pull --app oa-id --force --yes --format compress
|
|
18
18
|
|
|
19
19
|
# 多应用:默认只解析「项目级」apps;与全局合并配置一起拉取时加 --global
|
|
20
20
|
rabetbase api pull --global --format compress
|
|
@@ -22,6 +22,9 @@ rabetbase api pull --global --format compress
|
|
|
22
22
|
# 多应用模式:指定某个应用
|
|
23
23
|
rabetbase api pull --app order --format compress
|
|
24
24
|
rabetbase api pull --appcode app-order-001 --format compress
|
|
25
|
+
|
|
26
|
+
# 一个 AppCode 对应多个 profile 时必须按名称选择
|
|
27
|
+
rabetbase api pull --app oa-id --format compress
|
|
25
28
|
```
|
|
26
29
|
|
|
27
30
|
## 参数
|
|
@@ -30,9 +33,9 @@ rabetbase api pull --appcode app-order-001 --format compress
|
|
|
30
33
|
|------|------|
|
|
31
34
|
| `--output <dir>` | 输出目录,默认 `./src/api/` |
|
|
32
35
|
| `--global` | 多应用时显式从「全局+项目」双层解析 `apps`;默认仅项目级 `apps` |
|
|
33
|
-
| `--force` |
|
|
36
|
+
| `--force` | 注册表模式允许空结果替换当前 profile;历史前缀模式允许替换对应生成文件;必须同时传 `--yes` |
|
|
34
37
|
| `--app <name>` | 多应用模式下,指定应用名称 |
|
|
35
|
-
| `--appcode <code>` |
|
|
38
|
+
| `--appcode <code>` | 指定唯一 AppCode;匹配多个 profile 时必须改用 `--app` |
|
|
36
39
|
| `--format compress\|json` | 结构化信封。Agent 应读 `data.models`,不要刮 stderr |
|
|
37
40
|
|
|
38
41
|
## 多应用过滤
|
|
@@ -40,7 +43,7 @@ rabetbase api pull --appcode app-order-001 --format compress
|
|
|
40
43
|
多应用模式下:
|
|
41
44
|
- **不加 `--app` / `--appcode`**:遍历已配置应用(默认仅 **项目** `.rabetbase.json` 中的 `apps`;若需包含全局里合并进来的应用,加 **`--global`**)
|
|
42
45
|
- **加 `--app <name>`**:仅拉取指定应用
|
|
43
|
-
- **加 `--appcode <code
|
|
46
|
+
- **加 `--appcode <code>`**:唯一匹配时使用该 profile 的 `region`、cookie 和 apiDir;同一 AppCode 匹配多个 profile 时拒绝猜测,改用 `--app <name>`
|
|
44
47
|
- 每个应用请求前都会切换到其有效 `region`,不会沿用上一个应用的官方服务地址
|
|
45
48
|
|
|
46
49
|
## 配置作用域
|
|
@@ -53,13 +56,17 @@ rabetbase api pull --appcode app-order-001 --format compress
|
|
|
53
56
|
|
|
54
57
|
| 文件 | 行为 |
|
|
55
58
|
|------|------|
|
|
56
|
-
| `
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
+
| `models.generated.ts` | 注册表模式下**每次刷新当前 profile**并保留其他 profile;公共代码写 `datasetCode`,差异或部分可用代码写 `datasetCodes[profile]`,不含凭证 |
|
|
60
|
+
| `model-runtime.ts` | 由 `project create` / `project upgrade` 维护;`api pull` 不改写 |
|
|
61
|
+
| `api.ts` / `client.ts` | 由 `project create` / `project upgrade` 维护稳定结构;注册表模式的 `api pull` 不创建、不覆盖 |
|
|
62
|
+
| `sdk-config.ts` / `<prefix>-sdk-config.ts` | 每次刷新,只含必要的最终 Runtime Domain,不含凭证;旧式多应用继续使用前缀文件 |
|
|
63
|
+
| `<prefix>-api.ts` / `<prefix>-client.ts` | 同目录未显式分组的历史多应用结构;默认保留,仍可被命令侧别名解析读取 |
|
|
64
|
+
|
|
65
|
+
注册表模式不使用国家/地区文件名前缀。业务代码始终 import `api.ts` / `client.ts`;页面加载时优先读取平台注入的 Runtime Domain,本地构建使用 `rabetbase.domain-routing.json`,据此物化该 profile 的 SDK `models` 数组。
|
|
59
66
|
|
|
60
|
-
|
|
67
|
+
同一 `apiGroup` + 同一规范化 `apiDir` 才进入同一注册表,组内 AppCode 可以相同或不同。相同 `apiGroup` 分散到不同目录、同一目录出现不同组、或显式分组与未分组混用都会在请求前报错。多个未分组 profile 共用目录时继续使用旧式具名入口;要共享模型必须显式配置同一个 `apiGroup`。
|
|
61
68
|
|
|
62
|
-
`project create`
|
|
69
|
+
`project create` 直接生成注册表结构。旧项目先执行 `project upgrade --dry-run`,确认后执行 `project upgrade --yes`;标准旧脚手架会备份后迁移,业务定制入口会保留并生成候选文件。随后运行普通 pull 刷新事实。只拉取一个 profile 时会保留同组其他 profile 的模型代码。注册表已有非空 profile 而远端返回空清单时,普通 pull 会拒绝清空;仅在确认远端确实为空时使用 `--force --yes`。
|
|
63
70
|
|
|
64
71
|
## 输出(单应用 `data`)
|
|
65
72
|
|
|
@@ -70,9 +77,13 @@ rabetbase api pull --appcode app-order-001 --format compress
|
|
|
70
77
|
| `isDefaultConfig` | 默认应用为 `true` |
|
|
71
78
|
| `models[]` | `datasetCode` / `tableName` / `name` / `alias` |
|
|
72
79
|
| `sdkRouting` | `{ runtimeDomain?: string }` |
|
|
73
|
-
| `files.api` / `files.client` / `files.sdkConfig` | `{ path, action }`:`created` / `overwritten` / `preserved` / `refreshed` |
|
|
74
|
-
| `
|
|
75
|
-
| `
|
|
80
|
+
| `files.api` / `files.client` / `files.sdkConfig` | `{ path, action }`:`created` / `overwritten` / `preserved` / `refreshed` / `missing` |
|
|
81
|
+
| `files.modelRegistry` / `files.modelRuntime` | 注册表模式下的生成文件及动作 |
|
|
82
|
+
| `needsAgentMerge` | 旧式 TypeScript 被保留且尚未使用注册表时为 `true` |
|
|
83
|
+
| `needsProjectUpgrade` | 注册表事实已刷新,但稳定源码入口缺失或仍为旧结构时为 `true` |
|
|
84
|
+
| `modelProfile` | 已刷新的 profile 名称;旧式输出可省略 |
|
|
85
|
+
| `apiFilePath` / `clientFilePath` / `sdkConfigPath` | 稳定入口与 SDK 路由路径 |
|
|
86
|
+
| `modelRegistryPath` / `modelRuntimePath` | 注册表模式下的模型事实与选择器路径 |
|
|
76
87
|
| `modelCount` / `datasetCount` | 模型数量 |
|
|
77
88
|
|
|
78
89
|
项目使用 `apps` 清单解析时,`data` 为 `{ apps, succeeded, failed }`,每个 `data.apps[]` 元素都使用上表结构。因此 Dataset 事实从直接单应用结果的 `data.models` 读取,或从项目应用清单结果的 `data.apps[].models` 读取;以实际信封为准。
|
|
@@ -83,13 +94,13 @@ rabetbase api pull --appcode app-order-001 --format compress
|
|
|
83
94
|
|
|
84
95
|
## 前置条件
|
|
85
96
|
|
|
86
|
-
- 已完成 `rabetbase auth`
|
|
97
|
+
- 已完成 `rabetbase auth login`;不同官方节点的登录态不通用时,先对目标 profile 执行 `rabetbase auth login --app <name>`
|
|
87
98
|
- 已配置 appcode(单应用或多应用)
|
|
88
99
|
|
|
89
100
|
## 示例
|
|
90
101
|
|
|
91
102
|
```bash
|
|
92
|
-
#
|
|
103
|
+
# 单应用:刷新模型事实
|
|
93
104
|
rabetbase api pull --format compress
|
|
94
105
|
|
|
95
106
|
# 多应用 order
|
|
@@ -98,8 +109,8 @@ rabetbase api pull --app order --format compress
|
|
|
98
109
|
# 独立输出目录
|
|
99
110
|
rabetbase api pull --output ./src/generated/api/ --format compress
|
|
100
111
|
|
|
101
|
-
#
|
|
102
|
-
rabetbase api pull --force --yes --format compress
|
|
112
|
+
# 仅在确认目标 profile 的远端 Dataset 清单确实为空时
|
|
113
|
+
rabetbase api pull --app oa-id --force --yes --format compress
|
|
103
114
|
```
|
|
104
115
|
|
|
105
116
|
更新已有 TypeScript:见 [`sdk-client-generation.md`](../guides/sdk-client-generation.md)。
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
列出应用。
|
|
4
4
|
|
|
5
|
-
默认列出**本地配置视图**,与 CLI 运行时一致:合并全局 `~/.rabetbase.json` 与从当前目录向父目录解析到的项目 `.rabetbase.json
|
|
5
|
+
默认列出**本地配置视图**,与 CLI 运行时一致:合并全局 `~/.rabetbase.json` 与从当前目录向父目录解析到的项目 `.rabetbase.json`。Lovrabet 运行态配置 `.lovrabet.json` 以及 `.lovrabetrc` 不参与 Rabetbase 配置发现,也不会被修改。
|
|
6
6
|
加 `--remote` 时改为查询**平台目录视图**:当前登录账号在平台上可访问的应用,不读取或修改本地 app 配置。
|
|
7
7
|
|
|
8
8
|
- **不加 flag**:合并视图(global + project)。
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
它**不是**平台应用目录。若要查看当前登录账号在平台上能访问哪些应用,应使用 `rabetbase app list --remote`,而不是直接查看 `.rabetbase.json`。
|
|
8
8
|
|
|
9
|
-
只自动读取 `.rabetbase.json`,不会把 `.lovrabet.json` 或 `.lovrabetrc` 当作 Rabetbase
|
|
9
|
+
只自动读取 `.rabetbase.json`,不会把 `.lovrabet.json` 或 `.lovrabetrc` 当作 Rabetbase 配置。`.lovrabet.json` 属于 Lovrabet 运行态 CLI,可与 `.rabetbase.json` 在同一项目共存;Rabetbase 命令不会迁移、改写或删除它。
|
|
10
10
|
|
|
11
11
|
## 初始化
|
|
12
12
|
|
|
@@ -147,6 +147,7 @@ rabetbase workspace remove product --yes
|
|
|
147
147
|
| 字段 | 类型 | 说明 |
|
|
148
148
|
|------|------|------|
|
|
149
149
|
| `appcode` | string | **必填**。该应用的 appcode |
|
|
150
|
+
| `apiGroup` | string | 可选显式归并键。同一套业务 API 的多个部署使用相同值并共用一个 `apiDir`;普通单应用不配置 |
|
|
150
151
|
| `region` | string | 覆盖顶层国家/地区;当前可写 `cn`、`id`。显式 `cn` 会保留,以便覆盖顶层 `id` |
|
|
151
152
|
| `env` | string | 历史兼容字段;默认连接不落盘 |
|
|
152
153
|
| `apiDir` | string | 覆盖顶层 `apiDir` |
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# 跨库数据集关系
|
|
2
|
+
|
|
3
|
+
使用 `dataset cross-relation-list/create/update/delete` 管理同一应用内、不同数据库连接的 DB_TABLE 逻辑关联。同库关系命令见 [数据集关系](rabetbase-dataset-relation-mutations.md)。跨库关系事实使用本页的 list 查询,不能用同库关系查询命令 `dataset relations` 或 `dataset detail` 的关系列表替代回读。
|
|
4
|
+
|
|
5
|
+
需要实现跨库业务查询时,读取 [跨库 BFF 查询与拼接](../guides/cross-database-bff.md),按目标字段用途确定查询顺序,并核对各端授权及结果完整性。业务关系清单不代表平台已登记;平台已有关系也需要与业务合同核对。
|
|
6
|
+
|
|
7
|
+
## 定位和查询
|
|
8
|
+
|
|
9
|
+
四个命令均支持 `--appcode` 覆盖当前应用、`--format json|compress`。参数使用真实 Dataset Code 和字段名,先用 `dataset detail` 确认端点字段。
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
rabetbase dataset cross-relation-list --from-datasetcode <source-code> --format json
|
|
13
|
+
rabetbase dataset cross-relation-list --from-dblink-id <source-connection-id> --format json
|
|
14
|
+
rabetbase dataset cross-relation-list --from-datasetcode <source-code> --from-column customer_id --format json
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
列表必须提供 `--from-datasetcode` 或 `--from-dblink-id`,可同时提供,但必须属于同一连接。提供数据集时自动解析源连接;只提供连接时列出该连接的所有出向跨库关系。`--from-column` 可进一步过滤源字段。
|
|
18
|
+
|
|
19
|
+
列表输出 `data.appCode`、`data.selector`、`data.total`、`data.relations`。每条包含 `relationId`、`from/to.source`、`datasetCode`、`datasetName`、`dblinkId`、`table`、`field`;目标展示字段为 `to.labelField`,关系属性为 `relation.cardinality`、`relation.relationType`。缺失的 Dataset Code 或名称保留 null,不能根据同名表猜测。Relation ID 是返回事实,不是这些命令的输入参数。
|
|
20
|
+
|
|
21
|
+
## 创建
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
rabetbase dataset cross-relation-create \
|
|
25
|
+
--from-datasetcode <source-code> --from-column customer_id \
|
|
26
|
+
--to-datasetcode <target-code> --to-column id \
|
|
27
|
+
--to-label-column name --cardinality MANY_TO_ONE --dry-run
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
两端数据集与字段必填。`--to-label-column` 可选,省略时默认目标关联字段;`--cardinality` 可选,省略时不设置。合法基数:`ONE_TO_ONE`、`ONE_TO_MANY`、`MANY_TO_ONE`、`MANY_TO_MANY`。
|
|
31
|
+
|
|
32
|
+
每端只接收一个字段;复合键不能拆成多条单字段关系,也不能用逗号拼接字段传入。依据完整复合键编写 BFF 不代表这些命令已经登记该关系。
|
|
33
|
+
|
|
34
|
+
完全相同的端点不可重复创建。同一源字段可以关联不同目标;需要在创建前理解下述更新、删除的唯一匹配要求。
|
|
35
|
+
|
|
36
|
+
## 更新
|
|
37
|
+
|
|
38
|
+
```sh
|
|
39
|
+
rabetbase dataset cross-relation-update \
|
|
40
|
+
--from-datasetcode <source-code> --from-column customer_id \
|
|
41
|
+
--to-datasetcode <new-target-code> --to-column id \
|
|
42
|
+
--to-label-column name --dry-run
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
源数据集和源字段定位原关系,目标数据集和目标字段必填并表示更新后的目标。可选 `--from-dblink-id` 校验源连接归属。展示字段和基数省略时保留原值;更换目标数据集时应显式给出有效的 `--to-label-column`。无实际字段变化时返回错误,不当作更新成功。
|
|
46
|
+
|
|
47
|
+
## 删除
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
rabetbase dataset cross-relation-delete \
|
|
51
|
+
--from-datasetcode <source-code> --from-column customer_id --dry-run
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
源数据集和源字段必填;可选 `--from-dblink-id`。删除属于高风险写入:先审阅预演,再按用户授权执行,非交互执行使用 `--yes`,且当前配置必须允许 high-risk-write;`--yes` 不会提高风险上限。
|
|
55
|
+
|
|
56
|
+
更新和删除都要求源字段恰好匹配一条跨库关系。匹配多条时失败,结构化错误的 `data.candidates` 给出候选事实;不要选择第一条、循环删改,也不要追加 `--relation-id` 重试。先向用户说明该源字段当前无法由这组命令逐条维护。`--relation-id`、`--biz-relation-type` 和 `main_sub` 不属于本组命令。
|
|
57
|
+
|
|
58
|
+
## 预演与确认
|
|
59
|
+
|
|
60
|
+
所有写命令支持 `--dry-run`,只读取当前关系;输出 `operation`、`selector`、`before`、预计 `after`、`dryRun`、`backend`、`warnings` 和请求 body。预演不是实际写入,也不是并发锁。审阅后在用户授权范围内移除 `--dry-run` 执行。
|
|
61
|
+
|
|
62
|
+
正式写入后通过跨库列表回读:创建核对完整端点和属性;更新核对原 Relation ID、更新后的端点和属性;删除核对原 ID 已消失。仅在 `verification.status=matched` 时报告写入已验证。
|
|
63
|
+
|
|
64
|
+
网络中断会返回结果未确认;写入被接受但回读失败时返回 `verification.status=unconfirmed`。此时先运行 `cross-relation-list` 查询,不要自动重新创建、更新或删除。跨库关系管理完成不代表跨库 JOIN、页面绑定或跨库事务已经验证。
|
|
@@ -51,8 +51,8 @@ rabetbase project create my-project --appcode <code>
|
|
|
51
51
|
**关键边界:**
|
|
52
52
|
|
|
53
53
|
- 当前目录非空时不得覆盖、移动或删除已有内容,应报告冲突。
|
|
54
|
-
- `
|
|
55
|
-
- `--force --yes`
|
|
54
|
+
- `needsProjectUpgrade` 表示模型事实已刷新,但已有项目尚未安装稳定源码入口;新建项目模板正常不会出现该状态。
|
|
55
|
+
- `--force --yes` 在注册表模式只用于确认远端空清单,不用于源码迁移。
|
|
56
56
|
- 此意图只授权本地工程创建与平台事实读取,不授权修改线上业务数据或平台资源。
|
|
57
57
|
|
|
58
58
|
`api pull` 的单应用/项目应用清单输出结构见 [`rabetbase-api-pull.md`](rabetbase-api-pull.md),TypeScript 合并规则见 [`sdk-client-generation.md`](../guides/sdk-client-generation.md)。Agent 可根据实际输出选择检查、修复和验证方式。
|
|
@@ -70,7 +70,7 @@ rabetbase project create my-project --appcode <code>
|
|
|
70
70
|
- 交互与非交互模式使用同一创建流程,都会安装依赖、格式化代码并写入项目配置
|
|
71
71
|
- 项目模板从 CDN 下载并校验 SHA-256;CDN 不可用、模板不兼容或校验失败时命令停止,修复后重试
|
|
72
72
|
- 新项目中的 `.rabetbase.json` **只继承**全局中的少量偏好及 `region` / Domain 路由配置,**不会**把全局的 `apps` / `defaultApp` 复制进新项目
|
|
73
|
-
- `src/api/sdk-config.ts` 与 `rabetbase.domain-routing.json` 只生成浏览器可公开的最终路由,不会写入 `cookie`、`accessKey` 等认证配置;`rabetbase run start|dev|build|preview` 会在执行脚本前刷新公开 Domain 快照,也可用 [`project domain-routing-sync`](rabetbase-project-domain-routing-sync.md)
|
|
73
|
+
- `src/api/sdk-config.ts` 与 `rabetbase.domain-routing.json` 只生成浏览器可公开的最终路由,不会写入 `cookie`、`accessKey` 等认证配置;`rabetbase run start|dev|build|preview` 会在执行脚本前刷新公开 Domain 快照,也可用 [`project domain-routing-sync`](rabetbase-project-domain-routing-sync.md) 立即显式刷新。新项目模板已经包含稳定 `api.ts` / `client.ts`;若首次拉取失败,修复登录或连接后执行普通 `rabetbase api pull --format compress` 刷新占位注册表
|
|
74
74
|
|
|
75
75
|
| 当前有效路由 | `src/api/sdk-config.ts` |
|
|
76
76
|
|--------------|-------------------------|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# project upgrade
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
升级已有项目的 SDK 依赖与应用源码结构。新项目继续使用 `project create`;Dataset 事实刷新继续使用 `api pull`。
|
|
4
|
+
|
|
5
|
+
`.lovrabet.json`、`.lovrabet/` 与 Lovrabet Skill 属于 Lovrabet 运行态 CLI,可与 Rabetbase 项目配置和源码共存。该命令不会读取、迁移、改写或删除这些运行态资产。
|
|
4
6
|
|
|
5
7
|
## 命令
|
|
6
8
|
|
|
@@ -8,6 +10,9 @@
|
|
|
8
10
|
# 交互模式(先分析 → 展示报告 → 确认 → 执行)
|
|
9
11
|
rabetbase project upgrade
|
|
10
12
|
|
|
13
|
+
# 只查看完整迁移计划,不写文件
|
|
14
|
+
rabetbase project upgrade --dry-run
|
|
15
|
+
|
|
11
16
|
# 自动模式(跳过确认)
|
|
12
17
|
rabetbase project upgrade --yes
|
|
13
18
|
```
|
|
@@ -17,27 +22,33 @@ rabetbase project upgrade --yes
|
|
|
17
22
|
| Flag | 类型 | 必填 | 默认 | 说明 |
|
|
18
23
|
|------|------|------|------|------|
|
|
19
24
|
| `--yes` | boolean | 否 | `false` | 跳过确认提示,直接执行 |
|
|
25
|
+
| `--dry-run` | boolean | 否 | `false` | 只输出依赖和源码升级计划 |
|
|
20
26
|
|
|
21
27
|
## 执行流程
|
|
22
28
|
|
|
23
|
-
两阶段模式:先分析 → 展示报告 → 确认 → 执行
|
|
29
|
+
两阶段模式:先分析 → 展示报告 → 确认 → 执行 2 步:
|
|
24
30
|
|
|
25
31
|
| 步骤 | 操作 | 说明 |
|
|
26
32
|
|------|------|------|
|
|
27
|
-
| 1 |
|
|
28
|
-
| 2 |
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
| 1 | 升级 SDK 依赖 | 将已有 `@lovrabet/sdk` 依赖更新到当前维护版本 |
|
|
34
|
+
| 2 | 升级应用源码 | 迁移稳定 API 入口、模型注册表、运行时选择器和项目 Domain 路由 |
|
|
35
|
+
|
|
36
|
+
## 源码迁移安全规则
|
|
37
|
+
|
|
38
|
+
- 先执行 `rabetbase project upgrade --dry-run`;确认 `apiArchitecture.groups[].files[]` 的动作后再正式执行。
|
|
39
|
+
- 缺失文件直接创建;可识别的旧 CLI 生成文件先备份到 `.rabetbase/project-upgrade/api-model-registry-v2/backups/` 再替换。
|
|
40
|
+
- 发现业务定制的 `api.ts` / `client.ts` 时不覆盖原文件,在 `candidates/` 下写入候选文件,并返回 `manualMergeRequired: true`。
|
|
41
|
+
- 旧 `api.ts` 中可识别的 Dataset 事实迁入 `models.generated.ts`,迁移后再运行 `rabetbase api pull --format compress` 刷新远端事实。
|
|
42
|
+
- 多个未配置 `apiGroup` 且共用同一 `apiDir` 的历史 profile 保留 `[name-]api.ts` / `[name-]client.ts`,不会被静默归并。
|
|
43
|
+
- 命令可重复执行;已是最新稳定入口时不重复改写。
|
|
33
44
|
|
|
34
45
|
## 分析报告
|
|
35
46
|
|
|
36
47
|
执行前会扫描并展示:
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
|
|
40
|
-
|
|
48
|
+
- `@lovrabet/sdk` 是否需要更新
|
|
49
|
+
- 每个 API 目录的 profile、文件动作、备份或候选文件路径
|
|
50
|
+
|
|
51
|
+
不会把 `.lovrabet.json`、`.lovrabet/`、Lovrabet Skill 或 Lovrabet 的 IDE 配置列为待清理项。
|
|
41
52
|
|
|
42
53
|
## 输出
|
|
43
54
|
|
|
@@ -49,7 +60,7 @@ rabetbase project upgrade --yes
|
|
|
49
60
|
## 触发方式
|
|
50
61
|
|
|
51
62
|
- 手动执行:`rabetbase project upgrade`
|
|
52
|
-
-
|
|
63
|
+
- 已有应用需要采用当前源码架构:先 `rabetbase project upgrade --dry-run`,再正式升级
|
|
53
64
|
|
|
54
65
|
## 参考
|
|
55
66
|
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"name": "rabetbase",
|
|
4
4
|
"packageName": "@lovrabet/rabetbase-cli",
|
|
5
|
-
"packageVersion": "2.5.3-beta.
|
|
6
|
-
"skillVersion": "2.5.3-beta.
|
|
5
|
+
"packageVersion": "2.5.3-beta.4",
|
|
6
|
+
"skillVersion": "2.5.3-beta.4",
|
|
7
7
|
"files": [
|
|
8
8
|
"SKILL.md",
|
|
9
9
|
"guides/approval-flow-development-workflow.md",
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"guides/best-practices.md",
|
|
12
12
|
"guides/bff-creation-workflow.md",
|
|
13
13
|
"guides/conflict-detection.md",
|
|
14
|
+
"guides/cross-database-bff.md",
|
|
14
15
|
"guides/custom-page-workflow.md",
|
|
15
16
|
"guides/data-api-guidelines.md",
|
|
16
17
|
"guides/database-connection-workflow.md",
|
|
@@ -61,6 +62,7 @@
|
|
|
61
62
|
"references/rabetbase-database-template.md",
|
|
62
63
|
"references/rabetbase-dataset-business-group-update.md",
|
|
63
64
|
"references/rabetbase-dataset-business-groups.md",
|
|
65
|
+
"references/rabetbase-dataset-cross-relations.md",
|
|
64
66
|
"references/rabetbase-dataset-delete.md",
|
|
65
67
|
"references/rabetbase-dataset-detail.md",
|
|
66
68
|
"references/rabetbase-dataset-extend-update.md",
|
|
@@ -146,5 +148,5 @@
|
|
|
146
148
|
"references/rabetbase-user-account.md",
|
|
147
149
|
"references/rabetbase-workspace.md"
|
|
148
150
|
],
|
|
149
|
-
"digest": "
|
|
151
|
+
"digest": "f3f03ece71addfa413577c90b61ee3cd8ab9265a170577044a299bac45a95704"
|
|
150
152
|
}
|