@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.
Files changed (393) hide show
  1. package/lib/api/api-doc.js +1 -1
  2. package/lib/api/api-group.d.ts +22 -0
  3. package/lib/api/api-group.js +1 -0
  4. package/lib/api/fetch-model-list.js +1 -1
  5. package/lib/api/generate-api-file.d.ts +18 -2
  6. package/lib/api/generate-api-file.js +1 -1
  7. package/lib/api/generate-sdk-config-file.js +1 -1
  8. package/lib/api/legacy-api-file.d.ts +11 -0
  9. package/lib/api/legacy-api-file.js +1 -0
  10. package/lib/api/model-registry-file.d.ts +36 -0
  11. package/lib/api/model-registry-file.js +1 -0
  12. package/lib/api/model-registry-scaffold.d.ts +7 -0
  13. package/lib/api/model-registry-scaffold.js +1 -0
  14. package/lib/api/model-source.d.ts +6 -0
  15. package/lib/api/model-source.js +1 -0
  16. package/lib/auth/auth-server-ui.js +1 -1
  17. package/lib/auth/auth-server.js +1 -1
  18. package/lib/auth/constant.js +1 -1
  19. package/lib/auth/get-cookie.js +1 -1
  20. package/lib/auth/get-session-user.js +1 -1
  21. package/lib/auth/is-session-valid.js +1 -1
  22. package/lib/auth/login-success-html.js +1 -1
  23. package/lib/auth/logout.js +1 -1
  24. package/lib/cli-flags.js +1 -1
  25. package/lib/cli.js +1 -1
  26. package/lib/commands/api/generate.js +1 -1
  27. package/lib/commands/api/index.js +1 -1
  28. package/lib/commands/api/list.js +1 -1
  29. package/lib/commands/api/pull.js +1 -1
  30. package/lib/commands/api/shared.js +1 -1
  31. package/lib/commands/app/index.js +1 -1
  32. package/lib/commands/app/list.js +1 -1
  33. package/lib/commands/app/members-list.js +1 -1
  34. package/lib/commands/app/remote-directory.js +1 -1
  35. package/lib/commands/app/shared.js +1 -1
  36. package/lib/commands/app-config/delete.js +1 -1
  37. package/lib/commands/app-config/get.js +1 -1
  38. package/lib/commands/app-config/index.js +1 -1
  39. package/lib/commands/app-config/list.js +1 -1
  40. package/lib/commands/app-config/set.js +1 -1
  41. package/lib/commands/app-config/shared.js +1 -1
  42. package/lib/commands/auth/index.js +1 -1
  43. package/lib/commands/bff/create.js +1 -1
  44. package/lib/commands/bff/delete.js +1 -1
  45. package/lib/commands/bff/detail.js +1 -1
  46. package/lib/commands/bff/index.js +1 -1
  47. package/lib/commands/bff/list.js +1 -1
  48. package/lib/commands/bff/logs.js +1 -1
  49. package/lib/commands/bff/pull.js +1 -1
  50. package/lib/commands/bff/push.js +1 -1
  51. package/lib/commands/bff/status.js +1 -1
  52. package/lib/commands/cli-skill/index.js +1 -1
  53. package/lib/commands/cli-update.js +1 -1
  54. package/lib/commands/codegen/index.js +1 -1
  55. package/lib/commands/codegen/sdk.js +1 -1
  56. package/lib/commands/codegen/sql.js +1 -1
  57. package/lib/commands/common/app-registry.js +1 -1
  58. package/lib/commands/common/app-selector.js +1 -1
  59. package/lib/commands/common/async-task.js +1 -1
  60. package/lib/commands/common/dry-run.js +1 -1
  61. package/lib/commands/common/flags.d.ts +7 -0
  62. package/lib/commands/common/flags.js +1 -1
  63. package/lib/commands/common/local-file.js +1 -1
  64. package/lib/commands/common/validate.js +1 -1
  65. package/lib/commands/config/delete.js +1 -1
  66. package/lib/commands/config/get.js +1 -1
  67. package/lib/commands/config/index.js +1 -1
  68. package/lib/commands/config/init.js +1 -1
  69. package/lib/commands/config/list.js +1 -1
  70. package/lib/commands/config/set.js +1 -1
  71. package/lib/commands/config/shared.js +1 -1
  72. package/lib/commands/dataset/batch-design.js +1 -1
  73. package/lib/commands/dataset/business-group-update.js +1 -1
  74. package/lib/commands/dataset/business-groups.js +1 -1
  75. package/lib/commands/dataset/capability.js +1 -1
  76. package/lib/commands/dataset/cross-relation-create.d.ts +2 -0
  77. package/lib/commands/dataset/cross-relation-create.js +1 -0
  78. package/lib/commands/dataset/cross-relation-delete.d.ts +2 -0
  79. package/lib/commands/dataset/cross-relation-delete.js +1 -0
  80. package/lib/commands/dataset/cross-relation-list.d.ts +2 -0
  81. package/lib/commands/dataset/cross-relation-list.js +1 -0
  82. package/lib/commands/dataset/cross-relation-shared.d.ts +190 -0
  83. package/lib/commands/dataset/cross-relation-shared.js +1 -0
  84. package/lib/commands/dataset/cross-relation-update.d.ts +2 -0
  85. package/lib/commands/dataset/cross-relation-update.js +1 -0
  86. package/lib/commands/dataset/delete.js +1 -1
  87. package/lib/commands/dataset/detail.js +1 -1
  88. package/lib/commands/dataset/extend-update.js +1 -1
  89. package/lib/commands/dataset/field-restore.js +1 -1
  90. package/lib/commands/dataset/field-update.js +1 -1
  91. package/lib/commands/dataset/generate.js +1 -1
  92. package/lib/commands/dataset/index.js +1 -1
  93. package/lib/commands/dataset/list.js +1 -1
  94. package/lib/commands/dataset/operations.js +1 -1
  95. package/lib/commands/dataset/relation-audit.js +1 -1
  96. package/lib/commands/dataset/relation-create.js +1 -1
  97. package/lib/commands/dataset/relation-delete.js +1 -1
  98. package/lib/commands/dataset/relation-shared.js +1 -1
  99. package/lib/commands/dataset/relation-update.js +1 -1
  100. package/lib/commands/dataset/relations.js +1 -1
  101. package/lib/commands/dataset/rename.js +1 -1
  102. package/lib/commands/dataset/restore.js +1 -1
  103. package/lib/commands/dataset/user-deleted-field-list.js +1 -1
  104. package/lib/commands/db/analysis-batching.js +1 -1
  105. package/lib/commands/db/analyze-batch-plan.js +1 -1
  106. package/lib/commands/db/analyze-cancel.js +1 -1
  107. package/lib/commands/db/analyze-start.js +1 -1
  108. package/lib/commands/db/analyze-status.js +1 -1
  109. package/lib/commands/db/create.js +1 -1
  110. package/lib/commands/db/delete.js +1 -1
  111. package/lib/commands/db/detail.js +1 -1
  112. package/lib/commands/db/diff-refresh-start.js +1 -1
  113. package/lib/commands/db/diff-refresh-status.js +1 -1
  114. package/lib/commands/db/diff.js +1 -1
  115. package/lib/commands/db/index.js +1 -1
  116. package/lib/commands/db/list.js +1 -1
  117. package/lib/commands/db/shared.js +1 -1
  118. package/lib/commands/db/table-diff-shared.js +1 -1
  119. package/lib/commands/db/tables.js +1 -1
  120. package/lib/commands/db/test.js +1 -1
  121. package/lib/commands/db/update.js +1 -1
  122. package/lib/commands/deployment/index.js +1 -1
  123. package/lib/commands/deployment/sync-all.js +1 -1
  124. package/lib/commands/deployment/sync-jobs.js +1 -1
  125. package/lib/commands/deployment/sync-status.js +1 -1
  126. package/lib/commands/doctor.js +1 -1
  127. package/lib/commands/file/index.js +1 -1
  128. package/lib/commands/flow/create.js +1 -1
  129. package/lib/commands/flow/detail.js +1 -1
  130. package/lib/commands/flow/index.js +1 -1
  131. package/lib/commands/flow/list.js +1 -1
  132. package/lib/commands/flow/publish.js +1 -1
  133. package/lib/commands/flow/runtime-resources-shared.js +1 -1
  134. package/lib/commands/flow/runtime-role-list.js +1 -1
  135. package/lib/commands/flow/runtime-role-user-list.js +1 -1
  136. package/lib/commands/flow/runtime-user-search.js +1 -1
  137. package/lib/commands/flow/shared.js +1 -1
  138. package/lib/commands/flow/update.js +1 -1
  139. package/lib/commands/flow/validate.js +1 -1
  140. package/lib/commands/instant-api-policy/current.js +1 -1
  141. package/lib/commands/instant-api-policy/index.js +1 -1
  142. package/lib/commands/instant-api-policy/init.js +1 -1
  143. package/lib/commands/instant-api-policy/publish.js +1 -1
  144. package/lib/commands/instant-api-policy/pull.js +1 -1
  145. package/lib/commands/instant-api-policy/revision.js +1 -1
  146. package/lib/commands/instant-api-policy/revisions.js +1 -1
  147. package/lib/commands/instant-api-policy/rollback.js +1 -1
  148. package/lib/commands/instant-api-policy/shared.js +1 -1
  149. package/lib/commands/instant-api-policy/validate.js +1 -1
  150. package/lib/commands/issue/index.js +1 -1
  151. package/lib/commands/issue/nudge.js +1 -1
  152. package/lib/commands/issue/report.js +1 -1
  153. package/lib/commands/issue/shared.js +1 -1
  154. package/lib/commands/kb/create.js +1 -1
  155. package/lib/commands/kb/delete.js +1 -1
  156. package/lib/commands/kb/detail.js +1 -1
  157. package/lib/commands/kb/index.js +1 -1
  158. package/lib/commands/kb/list.js +1 -1
  159. package/lib/commands/kb/search.js +1 -1
  160. package/lib/commands/kb/shared.js +1 -1
  161. package/lib/commands/kb/update.js +1 -1
  162. package/lib/commands/logs/index.js +1 -1
  163. package/lib/commands/menu/asset-update.js +1 -1
  164. package/lib/commands/menu/delete.js +1 -1
  165. package/lib/commands/menu/external-link-create.js +1 -1
  166. package/lib/commands/menu/external-link-update.js +1 -1
  167. package/lib/commands/menu/group-create.js +1 -1
  168. package/lib/commands/menu/group-update.js +1 -1
  169. package/lib/commands/menu/index.js +1 -1
  170. package/lib/commands/menu/list.js +1 -1
  171. package/lib/commands/menu/move.js +1 -1
  172. package/lib/commands/menu/regroup-start.js +1 -1
  173. package/lib/commands/menu/rename.js +1 -1
  174. package/lib/commands/menu/shared/compare-table.js +1 -1
  175. package/lib/commands/menu/shared/delete-plan.js +1 -1
  176. package/lib/commands/menu/shared/facts.js +1 -1
  177. package/lib/commands/menu/shared/index.js +1 -1
  178. package/lib/commands/menu/shared/inquirer.js +1 -1
  179. package/lib/commands/menu/shared/local-pages.js +1 -1
  180. package/lib/commands/menu/shared/logic.js +1 -1
  181. package/lib/commands/menu/shared/mutations.js +1 -1
  182. package/lib/commands/menu/shared/service.js +1 -1
  183. package/lib/commands/menu/shared/sync-core.js +1 -1
  184. package/lib/commands/menu/shared/update-core.js +1 -1
  185. package/lib/commands/menu/shared/valid-url.js +1 -1
  186. package/lib/commands/menu/sync.js +1 -1
  187. package/lib/commands/menu/visibility-update.js +1 -1
  188. package/lib/commands/notification/config-create.js +1 -1
  189. package/lib/commands/notification/config-delete.js +1 -1
  190. package/lib/commands/notification/config-list.js +1 -1
  191. package/lib/commands/notification/config-update.js +1 -1
  192. package/lib/commands/notification/index.js +1 -1
  193. package/lib/commands/notification/shared.js +1 -1
  194. package/lib/commands/ocr/index.js +1 -1
  195. package/lib/commands/page/create.js +1 -1
  196. package/lib/commands/page/custom/detail.js +1 -1
  197. package/lib/commands/page/custom/list.js +1 -1
  198. package/lib/commands/page/custom/publish.js +1 -1
  199. package/lib/commands/page/custom/shared.js +1 -1
  200. package/lib/commands/page/custom/syntax.js +1 -1
  201. package/lib/commands/page/custom/update.js +1 -1
  202. package/lib/commands/page/data-list-status.js +1 -1
  203. package/lib/commands/page/generate-start.js +1 -1
  204. package/lib/commands/page/generate-status.js +1 -1
  205. package/lib/commands/page/index.js +1 -1
  206. package/lib/commands/page/pull.js +1 -1
  207. package/lib/commands/page/push.js +1 -1
  208. package/lib/commands/page/relation-audit.js +1 -1
  209. package/lib/commands/page/restore.js +1 -1
  210. package/lib/commands/page/shared.js +1 -1
  211. package/lib/commands/page/sync.js +1 -1
  212. package/lib/commands/project/api-architecture-upgrade.d.ts +28 -0
  213. package/lib/commands/project/api-architecture-upgrade.js +1 -0
  214. package/lib/commands/project/create/enhanced-guided-create.js +1 -1
  215. package/lib/commands/project/create/format-elapsed.js +1 -1
  216. package/lib/commands/project/create/main.js +1 -1
  217. package/lib/commands/project/create/materialize-project-template.js +1 -1
  218. package/lib/commands/project/create/project-name.js +1 -1
  219. package/lib/commands/project/create/project-template-archive.js +1 -1
  220. package/lib/commands/project/create/project-template-path.js +1 -1
  221. package/lib/commands/project/create/use-copy-project-template.js +1 -1
  222. package/lib/commands/project/create/use-format-code.js +1 -1
  223. package/lib/commands/project/create/use-install-dependencies.js +1 -1
  224. package/lib/commands/project/domain-routing-sync.js +1 -1
  225. package/lib/commands/project/index.js +1 -1
  226. package/lib/commands/project/upgrade.d.ts +30 -1
  227. package/lib/commands/project/upgrade.js +1 -1
  228. package/lib/commands/registry.js +1 -1
  229. package/lib/commands/role/delete.js +1 -1
  230. package/lib/commands/role/detail.js +1 -1
  231. package/lib/commands/role/index.js +1 -1
  232. package/lib/commands/role/list.js +1 -1
  233. package/lib/commands/role/shared.js +1 -1
  234. package/lib/commands/role/update.js +1 -1
  235. package/lib/commands/role/user-add.js +1 -1
  236. package/lib/commands/role/user-remove.js +1 -1
  237. package/lib/commands/role/user-resolve.js +1 -1
  238. package/lib/commands/rule/get.js +1 -1
  239. package/lib/commands/rule/index.js +1 -1
  240. package/lib/commands/rule/list.js +1 -1
  241. package/lib/commands/rule/set.js +1 -1
  242. package/lib/commands/rule/shared.js +1 -1
  243. package/lib/commands/run/index.js +1 -1
  244. package/lib/commands/schema.js +1 -1
  245. package/lib/commands/sql/create.js +1 -1
  246. package/lib/commands/sql/delete.js +1 -1
  247. package/lib/commands/sql/detail.js +1 -1
  248. package/lib/commands/sql/exec.js +1 -1
  249. package/lib/commands/sql/index.js +1 -1
  250. package/lib/commands/sql/list.js +1 -1
  251. package/lib/commands/sql/pull.js +1 -1
  252. package/lib/commands/sql/push.js +1 -1
  253. package/lib/commands/sql/shared.js +1 -1
  254. package/lib/commands/sql/status.js +1 -1
  255. package/lib/commands/sql/validate.js +1 -1
  256. package/lib/commands/task/index.js +1 -1
  257. package/lib/commands/task/status.js +1 -1
  258. package/lib/commands/tenant/index.js +1 -1
  259. package/lib/commands/tenant/members-list.js +1 -1
  260. package/lib/commands/tenant/shared.js +1 -1
  261. package/lib/commands/user-account/dingding-sandbox-bind.js +1 -1
  262. package/lib/commands/user-account/index.js +1 -1
  263. package/lib/commands/workspace/add.js +1 -1
  264. package/lib/commands/workspace/index.js +1 -1
  265. package/lib/commands/workspace/remove.js +1 -1
  266. package/lib/config/domain-config.js +1 -1
  267. package/lib/config/project-domain-routing.js +1 -1
  268. package/lib/config/region-config.js +1 -1
  269. package/lib/config/schema.js +1 -1
  270. package/lib/constant/cdn.d.ts +5 -3
  271. package/lib/constant/cdn.js +1 -1
  272. package/lib/constant/cli.js +1 -1
  273. package/lib/constant/defaults.js +1 -1
  274. package/lib/constant/domain.js +1 -1
  275. package/lib/constant/env.js +1 -1
  276. package/lib/constant/output.js +1 -1
  277. package/lib/constant/paths.js +1 -1
  278. package/lib/constant/region.js +1 -1
  279. package/lib/constant/risk.js +1 -1
  280. package/lib/constant/routing-profile.js +1 -1
  281. package/lib/context/app-resolver.d.ts +2 -0
  282. package/lib/context/app-resolver.js +1 -1
  283. package/lib/context/auth-resolver.js +1 -1
  284. package/lib/context/config-loader.js +1 -1
  285. package/lib/context.d.ts +2 -1
  286. package/lib/context.js +1 -1
  287. package/lib/core/alias-resolver.d.ts +13 -17
  288. package/lib/core/alias-resolver.js +1 -1
  289. package/lib/core/api-client.d.ts +6 -0
  290. package/lib/core/api-client.js +1 -1
  291. package/lib/core/bff/config.js +1 -1
  292. package/lib/core/bff/file-system.js +1 -1
  293. package/lib/core/bff/hash.js +1 -1
  294. package/lib/core/bff/hook-directory.js +1 -1
  295. package/lib/core/bff/lock.js +1 -1
  296. package/lib/core/bff/utils.js +1 -1
  297. package/lib/core/cross-db-relation.d.ts +41 -0
  298. package/lib/core/cross-db-relation.js +1 -0
  299. package/lib/core/db-resolver.js +1 -1
  300. package/lib/core/flow-config.js +1 -1
  301. package/lib/core/instant-api-policy/config.js +1 -1
  302. package/lib/core/kb-search-client.js +1 -1
  303. package/lib/core/page/file-system.js +1 -1
  304. package/lib/core/page/hash.js +1 -1
  305. package/lib/core/page/lock.js +1 -1
  306. package/lib/core/page/lr-smart-jsx.js +1 -1
  307. package/lib/core/sql-index-auditor.js +1 -1
  308. package/lib/core/sql-sync/config.js +1 -1
  309. package/lib/core/sql-sync/file-system.js +1 -1
  310. package/lib/core/sql-sync/hash.js +1 -1
  311. package/lib/core/sql-sync/lock.js +1 -1
  312. package/lib/core/sql-sync/utils.js +1 -1
  313. package/lib/core/sql-validator.js +1 -1
  314. package/lib/errors.js +1 -1
  315. package/lib/framework/build-all-flags.js +1 -1
  316. package/lib/framework/error-output.js +1 -1
  317. package/lib/framework/explicit-yes.js +1 -1
  318. package/lib/framework/flags.js +1 -1
  319. package/lib/framework/help.js +1 -1
  320. package/lib/framework/index.js +1 -1
  321. package/lib/framework/output.js +1 -1
  322. package/lib/framework/response.js +1 -1
  323. package/lib/framework/runner-alias.d.ts +1 -1
  324. package/lib/framework/runner-alias.js +1 -1
  325. package/lib/framework/runner.js +1 -1
  326. package/lib/framework/schema-export.js +1 -1
  327. package/lib/framework/supported-flags.js +1 -1
  328. package/lib/framework/types.js +1 -1
  329. package/lib/generated/build-info.d.ts +4 -4
  330. package/lib/generated/build-info.js +1 -1
  331. package/lib/generated/official-routing.js +1 -1
  332. package/lib/generated/routing-contract.js +1 -1
  333. package/lib/help.js +1 -1
  334. package/lib/postinstall.js +1 -1
  335. package/lib/runtime/confirmation.js +1 -1
  336. package/lib/runtime/event.js +1 -1
  337. package/lib/runtime/index.js +1 -1
  338. package/lib/runtime/queue.js +1 -1
  339. package/lib/runtime/resolve.js +1 -1
  340. package/lib/skills/builtin-skill.js +1 -1
  341. package/lib/skills/main.js +1 -1
  342. package/lib/skills/npx-skills-add.d.ts +0 -10
  343. package/lib/skills/npx-skills-add.js +1 -1
  344. package/lib/skills/skill-presence.js +1 -1
  345. package/lib/telemetry/cli-command-trace.js +1 -1
  346. package/lib/telemetry/cli-help-trace.js +1 -1
  347. package/lib/telemetry/ensure-cli-otel-config.js +1 -1
  348. package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
  349. package/lib/telemetry/send-cli-trace-log.js +1 -1
  350. package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
  351. package/lib/types/index.d.ts +11 -1
  352. package/lib/utils/ai_config.js +1 -1
  353. package/lib/utils/apply-jq-filter.js +1 -1
  354. package/lib/utils/cdn-config.js +1 -1
  355. package/lib/utils/check-sdk-version.js +1 -1
  356. package/lib/utils/cli-version-check.js +1 -1
  357. package/lib/utils/cli-version-policy.d.ts +19 -0
  358. package/lib/utils/cli-version-policy.js +1 -1
  359. package/lib/utils/config.js +1 -1
  360. package/lib/utils/entity-with-id.js +1 -1
  361. package/lib/utils/file-utils.js +1 -1
  362. package/lib/utils/guides-cdn.js +1 -1
  363. package/lib/utils/http-client.js +1 -1
  364. package/lib/utils/is-non-interactive.js +1 -1
  365. package/lib/utils/logger.js +1 -1
  366. package/lib/utils/params.js +1 -1
  367. package/lib/utils/platform.js +1 -1
  368. package/lib/utils/sleep.js +1 -1
  369. package/lib/utils/template-replacer.js +1 -1
  370. package/lib/utils/update-notice.js +1 -1
  371. package/lib/utils/version.js +1 -1
  372. package/lib/utils/with-active-cookie.js +1 -1
  373. package/lib/utils/write-cli-side-channel.js +1 -1
  374. package/package.json +6 -1
  375. package/skills/rabetbase/SKILL.md +16 -10
  376. package/skills/rabetbase/guides/backend-function.md +5 -1
  377. package/skills/rabetbase/guides/bff-creation-workflow.md +3 -1
  378. package/skills/rabetbase/guides/cross-database-bff.md +70 -0
  379. package/skills/rabetbase/guides/data-api-guidelines.md +35 -33
  380. package/skills/rabetbase/guides/sdk-client-generation.md +112 -61
  381. package/skills/rabetbase/guides/sql-creation-workflow.md +2 -0
  382. package/skills/rabetbase/guides/typescript-sdk.md +9 -0
  383. package/skills/rabetbase/references/rabetbase-api-pull.md +30 -19
  384. package/skills/rabetbase/references/rabetbase-app-list.md +1 -1
  385. package/skills/rabetbase/references/rabetbase-config.md +2 -1
  386. package/skills/rabetbase/references/rabetbase-dataset-cross-relations.md +64 -0
  387. package/skills/rabetbase/references/rabetbase-project-create.md +3 -3
  388. package/skills/rabetbase/references/rabetbase-project-upgrade.md +24 -13
  389. package/skills/rabetbase.manifest.json +5 -3
  390. package/templates/README.md +46 -6
  391. package/templates/generate-api/model-runtime.ts.tpl +101 -0
  392. package/templates/generate-api/profile-api.ts.tpl +21 -0
  393. package/templates/generate-api/profile-client.ts.tpl +14 -0
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rabetbase
3
- version: 2.5.3-beta.2
3
+ version: 2.5.3-beta.4
4
4
  description: "Use for Lovrabet development work through the rabetbase CLI: create or bind projects (including creating an AppCode project in the current folder), pull Dataset/API facts and maintain SDK clients, or manage datasets, Instant API access policies, database connections, pages, SQL, Backend Functions, menus, notifications, knowledge bases and kb search, Agent Context Rules, roles, files, OCR, deployment metadata, platform issues, and 钉钉沙箱账号绑定. Trigger when the user mentions rabetbase, Lovrabet development, AppCode, Dataset, Instant API allow/deny/route policy, project creation, api pull/codegen, dblink, page, SQL, BFF, menu, notification, knowledge base, kb search, Agent Context Rules, RULES.md, DATABASE.md, rule list/get/set, role, file/OCR, or related development workflows."
5
5
  metadata:
6
6
  requires:
@@ -19,7 +19,7 @@ metadata:
19
19
  ## 前置条件
20
20
 
21
21
  1. **连接配置与认证分离**:首次使用先执行 `rabetbase config init`。交互模式选择当前已开放国家/地区;非交互模式显式传 `--region`,未传时使用默认节点。企业独立部署优先导入 `lovrabet-routing/v1` 清单,也兼容旧扁平 Domain 文件和对应 `--*-domain` flags。`config init` 默认重建当前项目节点/Domain 配置,显式 `--global` 时写全局;保留 Cookie、AccessKey、format、locale 和应用绑定,但不登录、不绑定项目,随后再执行 `rabetbase auth login`
22
- 2. **AppCode**:确保 `.rabetbase.json` 中设置了 `apps`(单应用自动选中;多应用再配 `defaultApp`),或兼容读取的顶层 `appcode`,或通过 `--appcode <code>` / `--app <name>` 传入。旧 `.lovrabet.json` 不会自动读取
22
+ 2. **AppCode**:确保 `.rabetbase.json` 中设置了 `apps`(单应用自动选中;多应用再配 `defaultApp`),或兼容读取的顶层 `appcode`,或通过 `--appcode <code>` / `--app <name>` 传入。`.lovrabet.json` 属于 Lovrabet 运行态 CLI;Rabetbase 不读取也不修改它,两份配置可在同一项目共存
23
23
  3. **配置文件**:`rabetbase config init` 默认写当前项目 `.rabetbase.json`,显式 `--global` 时写 `~/.rabetbase.json`;默认节点不落冗余 `region`。官方节点模式清理显式和遗留 Domain,独立部署模式清理旧 `region`/Domain 后写入路由配置。完整字段说明见 [`.rabetbase.json` 配置参考](references/rabetbase-config.md)。当前目录应用绑定使用下方 `workspace init`
24
24
  4. **工作目录应用绑定**:当前目录要固定使用某个应用时,使用 `rabetbase workspace init --appcode <code>` 或 `rabetbase workspace use --app <name>`(选型见「app vs workspace 职责边界」)
25
25
  5. **多应用场景**:一个项目有多个应用时,先 `rabetbase workspace add <name> --appcode … [--region cn|id]` 登记各应用;profile 的 `region` 高于顶层国家/地区回退值。再用 `--app <name>` 临时切换,或 `workspace use --app <name>` 修改当前工作目录默认应用
@@ -45,14 +45,15 @@ metadata:
45
45
  - 表单审批流或独立工作流定义 → 先读 [`approval-flow-development-workflow.md`](guides/approval-flow-development-workflow.md),先确定 `flowType`,再使用 `flow validate/create/update/publish`
46
46
  - Instant API 标准数据记录操作 → SDK filter/getOne/create/batchCreate/update/delete;批量更新使用 `update({ id: [...] })`,不存在 `batchUpdate()`
47
47
  - 简单聚合且数据集是 DB_TABLE → SDK aggregate;聚合列用 `aggregate[].column`,不要用旧别名 `field`
48
- - 复杂 JOIN / 数据库函数且数据集是 DB_TABLE → Custom SQL
48
+ - 同库 DB_TABLE 的复杂 JOIN / 数据库函数评估 Custom SQL;跨库查询 → 按 [跨库 BFF 指南](guides/cross-database-bff.md)分别读取并拼接
49
49
  - 图表、统计卡片或数据大屏 → 自定义页面 + ECharts;数据层根据查询复杂度选择 Dataset 或 Custom SQL
50
50
  - 当前用户、角色、数据范围、外部系统、跨表事务或复杂业务编排 → Backend Function;Backend Function HOOK 可挂 DB_TABLE 或 METADATA,具体 operation 以后端返回为准
51
51
  2. **先拿元数据,再写代码**
52
52
  - 至少先查 `rabetbase dataset detail --code xxx --format compress`(或 `json`)获取表结构
53
53
  - 跨表场景还需查目标表的结构
54
54
  - 写入前用 `data.fields[]` 确认真实字段、必填字段、枚举选项;枚举/选择字段写入 `options[].value`,不是展示 `label`
55
- - 需要了解数据集关联关系时用 `rabetbase dataset relations --format compress`(或 `json`);需要审计关系事实错误和人工复核项时用 `rabetbase dataset relation-audit --format compress`
55
+ - 默认关联关系指同库关联关系;同库/跨库按平台数据库连接区分,执行时核对真实连接信息。同库关系用 `rabetbase dataset relations --format compress`(或 `json`)查询,用 `rabetbase dataset relation-audit --format compress` 审计关系事实错误和人工复核项
56
+ - 需要管理不同数据库连接之间的 DB_TABLE 关联时,先读 [跨库关系](references/rabetbase-dataset-cross-relations.md),使用 `dataset cross-relation-list/create/update/delete`;源数据集+字段定位,更新/删除必须唯一匹配,写前 dry-run,写后以跨库 list 回读为准
56
57
  - 需要从文本需求创建新的 `METADATA` 数据集时,先读 [`dataset generate-start/status`](references/rabetbase-dataset-generate.md),执行 preview 写出 design 文件,审阅后用 `generate-start --apply --design-file` 提交任务,再用 `generate-status` 查询到成功
57
58
  - **管理物理库连接 / 测连 / 同步表结构分析**时用 `rabetbase db …`(先 [`db list`](references/rabetbase-db-list.md),trace/plan id 见 [`database-connection-workflow.md`](guides/database-connection-workflow.md))
58
59
  - 研发资源保存后的增量同步由服务端自动处理;仅在管理员明确要求首次初始化、历史回填或故障恢复时读 [`deployment sync-all`](references/rabetbase-deployment-sync-all.md),在停止编辑的安静窗口执行;提交成功后按 jobId 查询状态,提交结果未知时用 `sync-jobs` 恢复任务事实
@@ -62,13 +63,14 @@ metadata:
62
63
  - 全部批次结束后再次执行异步差异刷新并重新获取完整差异;仍未收敛时,按 [`database-connection-workflow.md`](guides/database-connection-workflow.md) 对剩余 `toAnalyzeTables` 逐表串行重试且每表只恢复一次。仅当用户明确要求跳过分析/刷新时直接读取现有差异。状态查询失败继续使用原 `planId`,不得重复启动任务
63
64
  - 输出很大且只需子集时,在 `compress`/`json` 上加 `--jq '.data…'` 缩小结果
64
65
  - 需要真实业务行数据时必须交接给 `lovrabet data filter/getOne`;`lovrabet` 不可用时报告阻断并提示安装 Skill 与 CLI,不要静默安装或修复,也不要用 `rabetbase sql exec` 当行数据替代,见 [`guides/data-api-guidelines.md`](guides/data-api-guidelines.md)
65
- - 需要 `src/api/api.ts` / `client.ts` 时:先 `rabetbase api pull --format compress` `data.models`、`data.files`、`data.needsAgentMerge`,再按 [`sdk-client-generation.md`](guides/sdk-client-generation.md) 更新 TypeScript。`api pull` 默认**不会覆盖已有** `api.ts`/`client.ts`;只有用户明确要求放弃本地定制并完整重建时才使用 `--force --yes`
66
+ - 需要 `src/api/api.ts` / `client.ts` 时:已有项目先执行 `rabetbase project upgrade --dry-run`,确认计划后执行 `rabetbase project upgrade --yes`;再运行 `rabetbase api pull --format compress` 刷新模型事实。按 [`sdk-client-generation.md`](guides/sdk-client-generation.md) 检查 `data.files`、`data.needsProjectUpgrade` 与模型注册表;注册表源码迁移仅使用 `project upgrade`
66
67
  - 需要按 Dataset + API 配置 Instant API 的 `allow`、`deny` 或 `route` 时,先读取 [`rabetbase-instant-api-policy.md`](references/rabetbase-instant-api-policy.md)。先执行 `api pull` 更新模型事实,从生成的 `models[].datasetCode` 取得精确选择器;**不得**把 SDK `alias` 当作 `datasetCode`。精确 Dataset 选择器在 v1/v2 都可写 `{ datasetCode: "<real-dataset-code>" }` 或 `{ tableName: "<real-table-name>" }`;两者同时写时必须指向同一 Dataset,已有 code 时优先只写 `datasetCode`。再用 `dataset detail --code <datasetCode>` 确认目标操作存在,只编辑固定 `policy.json`。仅版本 2 可以使用通配:全部 Dataset 固定写作 `datasets: [{"datasetCode":"*"}]`,全部 API 固定写作 `apis: ["*"]`;每种通配都必须是其数组的唯一元素,`tableName: "*"` 不支持,也不得与 Dataset 通配混用。需要从通配规则中豁免组合时,用 `excludes: [{ datasets: [{ datasetCode: "<real-dataset-code>" }], apis: ["<api>"] }]`,豁免项会回退到其他非重叠规则或 `defaults.instantApi`。版本 1 禁止 `*` 与 `excludes`。随后依次执行 `validate`、`publish --dry-run`,经人工确认后再正式发布。认证不可用时报告阻断,不得猜测或复用过期的 Dataset 信息
67
68
  3. **SQL 工作流严格分步**
68
69
  - 推荐路径:查现有(`sql list/detail`) 或新建(`sql create`) → 拉/落本地(`sql pull` / `sql create`) → 编辑同步目录文件 → 可选校验(`sql validate`) → 检查状态(`sql status`) → 先预览(`sql push --dry-run` / `sql delete --dry-run`) → 再 `sql push` / `sql delete` → `sql detail` / `sql exec` 验证
69
70
  - 先使用 `sql list/detail` 查找可复用的 Custom SQL;没有满足需求的资源时,按照 [`sql-creation-workflow.md`](guides/sql-creation-workflow.md) 与 [`sql-mybatis.md`](guides/sql-mybatis.md) 创建、校验、发布并验证
70
71
  - 页面执行已发布的 Custom SQL 时使用 `sqlCode` + `params`;Backend Function 默认使用 `context.client.sql.byName(sqlName).execute({ params })`,`sql.execute({ sqlCode, params })` 仅作兼容路径
71
72
  4. **Backend Function 工作流严格分步**
73
+ - 跨数据库连接的业务查询、关联筛选或聚合,先读 [跨库 BFF 查询与拼接](guides/cross-database-bff.md),确认完整键、执行顺序、各端授权和结果完整性
72
74
  - 查现有 → 确认字段或通知配置 → 查公共函数 → 本地创建(`bff create`) → 检查状态(`bff status`) → 先预览(`--dry-run`) → 再拉取/推送/删除;运行行为异常时用 `bff logs` 按时间、级别和关键字查询日志
73
75
  - `bff pull` / `bff push` 返回 `data.conflicts` 时,逐项报告 `lockKey` 和 `code`,并只在审阅后执行该项 `nextAction`;不得把同步冲突说成失败、自动使用 `--force`,或盲目重试整批脚本
74
76
  - 创建会发送消息通知的 Backend Function 时,先读取 [`backend-function.md`](guides/backend-function.md) 的“消息通知扩展”契约,再执行 [`rabetbase notification config-list --type EMAIL`](references/rabetbase-notification-config-list.md) 获取当前应用的 `configCode`;不得猜测渠道、收件人或把密钥写进脚本
@@ -176,7 +178,8 @@ metadata:
176
178
  - **不要**在用户未要求时给命令加 `--global`** — 默认行为已是「项目优先」;只有用户明确要改全局配置或不在项目内且意图写全局时才使用。
177
179
  - **`config set`**:在**没有**项目配置文件(当前目录未解析到 `.rabetbase.json`)且**未**传 `--global` 时,CLI **拒绝执行**并提示使用 `--global` 或先 `rabetbase workspace init --appcode <code>`,**不会**静默写入全局。
178
180
  - **`project create`** 生成的新项目 `.rabetbase.json` **只继承**少量全局偏好(如 `cookie` / `locale` / `format` / `riskLevel` 等),**不会**把全局 `apps` / `defaultApp` 带入新项目文件;同时生成浏览器安全的 `src/api/sdk-config.ts` 与 `rabetbase.domain-routing.json`。每个官方节点直接声明自己的第三方库 CDN 与 Lovrabet 自有资源 Domain;项目文件始终包含解析后的完整地址,企业独立部署从共用清单读取显式 CDN。两个生成文件都不下发认证配置;`rabetbase run start|dev|build|preview` 会在执行脚本前刷新公开 Domain 快照,也可用 `project domain-routing-sync` 立即显式刷新;`api pull` 只刷新 SDK/API 文件。
179
- - **`api pull` / `api list`**:默认仅针对**项目** `apps`;需要合并全局已登记应用时加 `--global`。多应用遍历会在每个请求前应用该 profile 的有效 `region`;`api pull` 为非默认应用生成独立 `<name>-sdk-config.ts`(见各命令 reference)。
181
+ - **`api pull` / `api list`**:默认仅针对**项目** `apps`;需要合并全局已登记应用时加 `--global`。多应用遍历会在每个请求前应用该 profile 的有效 `region`。一个 AppCode 匹配多个 profile 时必须用 `--app <profile>` 消除歧义;只有显式相同 `apiGroup` 且使用同一 `apiDir` 的 profile 才共享生成注册表(见各命令 reference)。
182
+ - **多 profile SDK 的运行边界**:共享注册表只解决“同一份业务代码分别运行在不同节点,并按当前 Runtime Domain 选择唯一 profile”;它不是跨节点网关,也不允许浏览器 client 在一次运行中同时读取多个节点。业务代码只使用 alias,不硬编码或跨 profile 取 `datasetCode`。确需跨节点聚合时,交给可信服务端或 Backend Function 编排;完整约束见 [`sdk-client-generation.md`](guides/sdk-client-generation.md) 与 [`typescript-sdk.md`](guides/typescript-sdk.md)。
180
183
  - **`app list`**:默认展示**合并**后的全量;`--global` 仅全局、`--project` 仅项目(见 [`rabetbase app list`](references/rabetbase-app-list.md))。
181
184
 
182
185
  ## app vs workspace 职责边界
@@ -224,6 +227,7 @@ metadata:
224
227
  - **不要跳过 Dataset rename 最终线上回查** — 连续重命名后必须按 code 重新查询线上名称,不能只相信本地 plan 或 dry-run
225
228
  - **不要把 MCP 工具名当 CLI 命令** — 使用 `rabetbase sql list`,不是 `list_sql_queries`
226
229
  - **不要擅自加 `--global`** — 见上文「配置作用域原则」;默认写项目、读合并;仅在用户明确要求或文档说明的场景使用 `--global`。
230
+ - **不要迁移或删除 Lovrabet 运行态配置** — `.lovrabet.json`、`.lovrabet/` 与 Lovrabet Skill 不属于 Rabetbase 项目升级范围;即使它们与 `.rabetbase.json` 同时存在也必须保留
227
231
  - **不要为 Instant API Policy 传任意文件路径或写入 app-config** — 策略只使用 `.rabetbase/instant-api-policy/<appCode>/policy.json` 与独立策略接口;发布和回滚前必须校验并预览。
228
232
 
229
233
  ## 接口选型优先级
@@ -232,7 +236,7 @@ metadata:
232
236
 
233
237
  1. **标准 SDK 接口**(filter/getOne/create 等)— 能用就不写 SQL
234
238
  2. **aggregate 聚合接口** — DB_TABLE 的简单分组汇总;METADATA 不默认支持 aggregate;聚合定义使用 `column` 指定列,`field` 仅作为历史兼容别名
235
- 3. **自定义 SQL** — DB_TABLE 的复杂 JOIN、数据库函数、跨表统计;METADATA 不支持 SQL 路径
239
+ 3. **自定义 SQL** — 同库 DB_TABLE 的复杂 JOIN、数据库函数、跨表统计;跨库查询由 Backend Function 分别读取并拼接,METADATA 不支持 SQL 路径
236
240
  4. **Backend Function** — 外部系统调用、跨表事务、复杂业务编排
237
241
 
238
242
  ## SDK 核心规则
@@ -316,7 +320,7 @@ const result = await client.bff.execute<DashboardData>({
316
320
  | 初始化连接配置 | [`rabetbase config init`](references/rabetbase-init.md) | 选择官方节点或导入独立部署 Domain |
317
321
  | 创建新项目 | [`rabetbase project create`](references/rabetbase-project-create.md) | 支持新目录或当前空目录创建;完成口径与安全边界见 reference |
318
322
  | 刷新项目公开 Domain 路由 | [`rabetbase project domain-routing-sync`](references/rabetbase-project-domain-routing-sync.md) | 根据当前有效配置原子生成项目级 `rabetbase.domain-routing.json`;与前端页面路由无关 |
319
- | lovrabet-cli 迁移 | [`rabetbase project upgrade`](references/rabetbase-project-upgrade.md) | 6 步自动迁移,`--yes` 跳过确认 |
323
+ | 升级已有项目依赖与源码架构 | [`rabetbase project upgrade`](references/rabetbase-project-upgrade.md) | `--dry-run`,标准旧脚手架自动备份迁移,业务定制写候选文件;不修改 Lovrabet 运行态配置 |
320
324
  | 老项目翻新蓝图 / Legacy Application Blueprint | [`guides/legacy-application-blueprint-workflow.md`](guides/legacy-application-blueprint-workflow.md) | 先输出 `.rabetbase/blueprint/<appCode>/application-blueprint.md`,把老代码逻辑与 Dataset / Relations 绑定后再生成迁移 Backlog |
321
325
  | 运行 package.json 脚本 | [`rabetbase run <script>`](references/rabetbase-run.md) | `write`;先审阅脚本命令体,嵌入式工具暂不开放 |
322
326
  | 安装 / 重装 / 刷新 CLI Built-in Skill | [`rabetbase cli-skill install`](references/rabetbase-cli-skill-install.md) | 由最新版官方 Skills CLI 从当前 npm 包内本地源重装同版本 Skill;发现本地 skill 过期时优先执行 |
@@ -373,6 +377,7 @@ const result = await client.bff.execute<DashboardData>({
373
377
  | 查看数据集关联关系 | [`rabetbase dataset relations`](references/rabetbase-dataset-relations.md) | 标准只读入口,输出 `datasetCode + field` 关系事实;支持 `DB_TABLE -> DB_TABLE`、`DB_TABLE -> METADATA`、`METADATA -> METADATA` |
374
378
  | 审计数据集关联关系 | [`rabetbase dataset relation-audit`](references/rabetbase-dataset-relation-audit.md) | 只读审计关系事实结构错误、风险和人工复核项 |
375
379
  | 管理单条数据集关联关系 | [`rabetbase dataset relation-create/update/delete`](references/rabetbase-dataset-relation-mutations.md) | 单条关系写入;写入前用 `relations` 确认 `datasetCode + field` 关系事实,DB_TABLE 写入所需表名来自显式参数或物理表事实 |
380
+ | 管理跨库数据集关联 | [`dataset cross-relation-list/create/update/delete`](references/rabetbase-dataset-cross-relations.md) | 不同连接的 DB_TABLE 逻辑关系;源端定位,更新/删除要求唯一匹配 |
376
381
  | 首次生成数据列表页 | [`rabetbase page generate-start --datasetcode <code>`](references/rabetbase-page-generate-start.md) | 提交或复用服务端异步任务 |
377
382
  | 创建自定义页面 | [`rabetbase page create --page-pattern BLANK --name "客户看板"`](references/rabetbase-page-create.md) | 综合操作页面优先使用 `ONEPAGE`,业务数据可视化使用 `DASHBOARD`,基础页面使用 `BLANK`;模板详情见 [`page-templates.md`](knowledge/custom-page/page-templates.md),也可通过 `--page-dir` 创建完整页面;先 dry-run |
378
383
  | 查询自定义页面 | [`rabetbase page custom-list`](references/rabetbase-page-custom-list.md) | 返回页面 ID、页面名称、`pageUrl`(查看最新保存内容)和 `editPageUrl`(打开编辑器) |
@@ -389,7 +394,7 @@ const result = await client.bff.execute<DashboardData>({
389
394
  | 恢复已删除页面 | [`rabetbase page restore --id <pageId>`](references/rabetbase-page-restore.md) | 支持 `DATA_LIST|CUSTOM` 自动识别;跨类型同 ID 时显式传 `--page-type` |
390
395
  | 数据库连接(dblink)/ 测连 / 结构分析 | [`rabetbase db list`](references/rabetbase-db-list.md) 起 | **`id`**、**trace/plan id** 与“终态 + 复跑 diff”完成口径见 [database-connection-workflow.md](guides/database-connection-workflow.md);各子命令见 `references/rabetbase-db-*.md` |
391
396
  | 独立部署应用范围补偿同步 | [`rabetbase deployment sync-all`](references/rabetbase-deployment-sync-all.md) | 管理员首次初始化、历史回填或故障恢复时使用;`write`,只提交 appCode;在停止编辑的安静窗口执行,保存 jobId 后查询状态,结果未知时用 `sync-jobs` 恢复任务事实,不自动重提;不是精确镜像 |
392
- | 生成 / 更新 API 客户端代码 | [`rabetbase api pull`](references/rabetbase-api-pull.md) → [`sdk-client-generation.md`](guides/sdk-client-generation.md) | `api pull` Dataset 事实并刷新匹配应用的 SDK 路由文件;已有 `api.ts`/`client.ts` 按 guide 合并更新 |
397
+ | 升级 API 客户端源码结构并刷新模型 | [`rabetbase project upgrade`](references/rabetbase-project-upgrade.md) → [`rabetbase api pull`](references/rabetbase-api-pull.md) → [`sdk-client-generation.md`](guides/sdk-client-generation.md) | `project upgrade` 迁移稳定入口,`api pull` 只刷新 Dataset 模型事实 |
393
398
  | 查看生成的 API 模型 | [`rabetbase api list`](references/rabetbase-api-list.md) | 列出已生成的数据模型 |
394
399
  | 查看现有 SQL | [`rabetbase sql list --name "xxx"`](references/rabetbase-sql-list.md) | 分页,按名称过滤;默认查当前决议到的单个应用 |
395
400
  | 查看 SQL 详情 | [`rabetbase sql detail --sqlcode xxx`](references/rabetbase-sql-detail.md) | 含完整 SQL 内容和参数定义 |
@@ -457,7 +462,7 @@ const result = await client.bff.execute<DashboardData>({
457
462
  | Database Connections (`db`) | [`list`](references/rabetbase-db-list.md) / [`detail`](references/rabetbase-db-detail.md) / [`create`](references/rabetbase-db-create.md) / [`update`](references/rabetbase-db-update.md) / [`delete`](references/rabetbase-db-delete.md) / [`test`](references/rabetbase-db-test.md) / [`analyze`](references/rabetbase-db-analyze.md) / [`tables`](references/rabetbase-db-tables.md) / [`diff`](references/rabetbase-db-diff.md) / [`diff-refresh-start/status`](references/rabetbase-db-diff-refresh.md) |
458
463
  | Deployment | [`sync-all` / `sync-status` / `sync-jobs`](references/rabetbase-deployment-sync-all.md)(管理员初始化、回填与恢复) |
459
464
  | api commands | [`pull`](references/rabetbase-api-pull.md) / [`list`](references/rabetbase-api-list.md) |
460
- | sql commands | [`list`](references/rabetbase-sql-list.md) / [`detail`](references/rabetbase-sql-detail.md) / [`create`](references/rabetbase-sql-create.md) / [`status`](references/rabetbase-sql-status.md) / [`pull`](references/rabetbase-sql-pull.md) / [`push`](references/rabetbase-sql-push.md) / [`delete`](references/rabetbase-sql-delete.md) / [`validate`](references/rabetbase-sql-validate.md) / [`save`(deprecated)](references/rabetbase-sql-save.md) / [`exec`](references/rabetbase-sql-exec.md) |
465
+ | sql commands | [`list`](references/rabetbase-sql-list.md) / [`detail`](references/rabetbase-sql-detail.md) / [`create`](references/rabetbase-sql-create.md) / [`status`](references/rabetbase-sql-status.md) / [`pull`](references/rabetbase-sql-pull.md) / [`push`](references/rabetbase-sql-push.md) / [`delete`](references/rabetbase-sql-delete.md) / [`validate`](references/rabetbase-sql-validate.md) / [`exec`](references/rabetbase-sql-exec.md) |
461
466
  | bff commands | [`list`](references/rabetbase-bff-list.md) / [`detail`](references/rabetbase-bff-detail.md) / [`logs`](references/rabetbase-bff-logs.md) / [`create`](references/rabetbase-bff-create.md) / [`status`](references/rabetbase-bff-status.md) / [`pull`](references/rabetbase-bff-pull.md) / [`push`](references/rabetbase-bff-push.md) / [`delete`](references/rabetbase-bff-delete.md) |
462
467
  | file / ocr commands | [`file upload/query-url`](references/rabetbase-file.md) / [`ocr recognize`](references/rabetbase-ocr.md) |
463
468
  | codegen commands | [`sdk`](references/rabetbase-codegen-sdk.md) / [`sql`](references/rabetbase-codegen-sql.md) |
@@ -535,6 +540,7 @@ const result = await client.bff.execute<DashboardData>({
535
540
  | 数据接口访问 | 先 detail 再编码、外键/枚举、禁止 N+1、批量与关联查询;验证真实行数据时交接 `lovrabet data`(**`lovrabet` CLI ≥ 2.0**) | [`data-api-guidelines.md`](guides/data-api-guidelines.md) |
536
541
  | SQL 创建工作流 | list/detail → pull/create → edit → validate → status → push/delete → exec 全链路 | [`sql-creation-workflow.md`](guides/sql-creation-workflow.md) |
537
542
  | Backend Function 创建工作流 | new → status → dry-run → pull/push | [`bff-creation-workflow.md`](guides/bff-creation-workflow.md) |
543
+ | 跨库 BFF 查询与拼接 | 完整键、分库批量读取、分页筛选排序、授权与一致性边界 | [`cross-database-bff.md`](guides/cross-database-bff.md) |
538
544
  | 冲突检测与保存 | `blocked`、未保存时的用户沟通、响应结构 | [`conflict-detection.md`](guides/conflict-detection.md) |
539
545
  | 质量与最佳实践 | 审查 SQL/Backend Function、命名、高危边界、描述字段 | [`best-practices.md`](guides/best-practices.md) |
540
546
  | 数据库连接与分析 | 接入/改连/测连、`traceId` 来源、`db analyze-*` 与 dataset 分工;子命令速查见上文 **「数据库连接(db)」** | [`database-connection-workflow.md`](guides/database-connection-workflow.md) |
@@ -830,6 +830,8 @@ rabetbase notification config-list --type EMAIL --format compress
830
830
 
831
831
  ## 事务规则
832
832
 
833
+ 事务原子性只适用于已核验的运行时事务范围。跨连接模型操作或外部 API 不因位于同一个回调就成为原子操作;分库读取也不能假定共享一致性快照。涉及这些场景时,按 [跨库 BFF 查询与拼接](cross-database-bff.md)确认授权、一致性与写入边界。
834
+
833
835
  事务使用方式:
834
836
 
835
837
  ```javascript
@@ -860,6 +862,8 @@ await context.client.db.transaction(async (tx) => {
860
862
 
861
863
  编写 Backend Function 前,必须阅读 `data-api-guidelines.md` 中的性能优化部分。
862
864
 
865
+ 跨库关联须先区分展示补充与参与筛选、排序、统计的关联,执行顺序见 [跨库 BFF 查询与拼接](cross-database-bff.md)。批量调用仍需处理分页完整性和重复匹配;不能用单次 `$in` 或当前页拼接代替完整结果。
866
+
863
867
  重点避免:
864
868
 
865
869
  * 循环查询单条
@@ -868,7 +872,7 @@ await context.client.db.transaction(async (tx) => {
868
872
 
869
873
  性能要求:
870
874
 
871
- * 单次脚本数据库调用尽量控制在 `50` 次以内
875
+ * 按接口限制与业务预算设定调用次数、读取量和超时上限;超限时明确报告,不能截断并冒充完整结果
872
876
  * 可批量查询时,用 `filter + $in`
873
877
  * 同一数据集批量新增优先使用 `batchCreate()`;相同字段值的批量更新优先使用 `update({ id: [...] })`
874
878
  * 只有 Instant API 无法表达的复杂写入才考虑已有且契约可信的 Custom SQL
@@ -41,7 +41,9 @@ rabetbase dataset detail --code <数据集编码> --format compress \
41
41
  写入前必须确认:
42
42
  * 业务必填字段:`data.fields[].required === true`,平台自动维护字段除外
43
43
  * 枚举/选择字段:写入 `options[].value`,不要写展示用 `label`
44
- * 外键字段:从 `data.relations[]` 或 `dataset relations` 确认真实关系
44
+ * 外键字段:同库关系从 `data.relations[]` 或 `dataset relations` 确认;跨库关系使用 `dataset cross-relation-list`,不能用同库关系列表代替
45
+
46
+ 涉及跨连接读取或拼接时,先读 [跨库 BFF 查询与拼接](cross-database-bff.md),确认完整键、基数、目标字段用途、各端授权和读取预算。业务关系说明与平台登记事实分别核对;冲突时报告差异,不能自动采用平台关系。复合键不能拆成独立的单字段 Relation。
45
47
 
46
48
  ### 3. 查平台(按需)
47
49
  * 新建 → 跳过
@@ -0,0 +1,70 @@
1
+ # 跨库 Backend Function 查询与拼接
2
+
3
+ 用于编写或审查跨数据库连接的 BFF 查询:分别读取各数据源,在可信 BFF 中按完整关联键拼接,再输出业务结果。单表优先使用 InstantAPI;同一连接内的关联或聚合可使用已确认支持的关联查询或 Custom SQL。跨库 Relation 描述逻辑关联,不赋予自动 JOIN、访问授权或分布式事务能力。
4
+
5
+ 本文同库/跨库按平台数据库连接区分;不同 dblink 不因库名或表名相同而视为同库。默认关联关系指同库关联关系。
6
+
7
+ ## 先确认事实和业务合同
8
+
9
+ 1. 用 `rabetbase dataset detail --code <datasetCode> --format compress` 核对两端字段、类型、物理表和连接;模型访问方式遵循 [Backend Function](backend-function.md),同名表必须消歧。连接身份以当前应用的真实 dblink 为准,不靠库名或表名推断。
10
+ 2. 用 [跨库关系命令](../references/rabetbase-dataset-cross-relations.md)的 `cross-relation-list` 查询平台已登记关系。业务文档中的关系说明不代表已经登记;平台配置也不能代替业务正确性确认。两者冲突时报告端点差异,由业务确认后再维护关系,不能自动照搬或修正。
11
+ 3. 在业务项目明确:完整关联键及顺序、基数、允许缺失与否、目标字段用途(展示、筛选、排序、统计)、各端访问范围、返回字段,以及读取预算和失败处理。具体映射留在业务项目,详细元数据按需查询;不在通用 Skill 中保存项目关系清单或元数据快照。
12
+
13
+ 依据按需查找:先读已有接口文档和当前元数据,确认调用能力与硬限制;再读项目业务合同和现有配置,确定关联语义、授权及读取预算。已有事实充分时直接采用,不重复要求用户确认。依据冲突或缺少影响正确性、授权、完整性的必要信息时,说明具体缺口后确认;不自行发明权限字段、运行时上限或项目级配置。
14
+
15
+ 当前 `cross-relation-create/update/delete` 每端只接收一个字段。复合键必须作为有序字段组整体理解,不能拆成多条单字段 Relation,也不能用逗号拼接字段来冒充复合关系支持。BFF 可依据已确认的业务合同实现完整键匹配,但不得宣称该复合关系已由这些命令登记。
16
+
17
+ ## 根据查询语义选择执行顺序
18
+
19
+ | 外表的用途 | 执行方式 | 结果要求 |
20
+ |---|---|---|
21
+ | 仅补充展示字段 | 先对已授权主表筛选、稳定排序、计数和分页,再批量读取当前页所需外表数据 | 保留主记录、主表顺序和总数;一对多用约定的集合承载,不能展开后仍沿用原分页含义 |
22
+ | 参与筛选 | 先分析完整筛选表达式;能够等价转成目标键条件时,在预算内完整取得所需键集合,再保留原布尔逻辑筛选、计数和分页主表 | 主表 total 对应最终筛选结果;不能等价表达时报告能力边界 |
23
+ | 参与排序或统计 | 先确认能够覆盖完整相关结果集的执行方案 | 当前页拼接后的排序或统计不能冒充全局结果;预算不足时请求调整范围或由权威查询服务承接 |
24
+
25
+ 正向匹配可在确认等价后使用引用键 `IN` 条件。否定、无关联、空引用,以及主表条件与外表条件混合的 `OR` 必须分别保留语义,不能统一改成正向 `IN`。例如“主记录紧急 OR 目标启用”转换后仍须保留主记录紧急分支;“没有关联目标”不能用任意目标字段筛选的补集代替。授权过滤始终限制整个结果集,不能被业务 `OR` 绕过。
26
+
27
+ 不同连接分别读取,不用跨库 SQL JOIN、跨库子查询或视图绕过执行边界,也不把整个外库拉进 BFF。关系存在和 `sql validate` 通过都不能证明跨连接查询可执行。各库支持的过滤、投影、聚合可在所属库内完成;没有可验证的完整方案时停止,不能返回貌似完整的部分结果。
28
+
29
+ ## 完整键、批量读取与拼接
30
+
31
+ 以下步骤描述为已选定主记录补充展示字段的流程。参与筛选、排序或统计时先按上表确定读取顺序,再复用完整键与批量处理规则;不能把主表先分页当作所有跨库查询的前置步骤。
32
+
33
+ 1. 从已授权主记录提取有效引用键。空值定义遵循字段合同,不用真值过滤误删合法的 `0`;复合键任一必需部分缺失时按缺失关系处理。
34
+ 2. 保留 ID 精度及类型语义,不把大整数 ID 转成 `Number`。只有两端合同明确同一标识的不同编码方式时才做无损归一化;不擅自忽略大小写、前导零或空白。
35
+ 3. 对完整键去重并按字段值比较。复合键保留字段顺序和类型,使用嵌套 `Map` 或明确的无损键编码,避免分隔符拼接碰撞;不能直接用新建数组作为 `Map` 查询键,因为数组按对象身份而非内容比较。例如期望 `(A, 7)`、`(B, 9)` 时,`region IN (A,B) AND external_id IN (7,9)` 会额外选中 `(A,9)`、`(B,7)`;应使用配对条件,或按第一个键分组后查询对应第二键集合,最终仍按完整键匹配。更多字段同样逐一配对,不省略剩余字段;示例字段不替代真实字段合同。
36
+ 4. 键集合为空时跳过外表查询。非空时按目标接口的参数、分页和数量限制分批查询,投影只包含拼接和已授权输出所需字段。分批大小、最大页数、总读取量、并发和超时依据接口合同及业务预算确定,不复制其他项目的固定数值。
37
+ 5. 每批都按该接口的分页合同读取完整结果,再建立映射。已知仍有后续结果却只拿到一页、完成前达到预算上限、页码不推进或查询失败时,默认返回错误,不推断剩余键均不存在。分批循环用于有界读取,不退回逐条记录的 N+1 调用。
38
+ 6. 按已确认基数组装。1:1 或 N:1 的同一完整目标键出现多条记录时,报告重复匹配,不能用 `Map.set`、`Object.fromEntries` 或“取第一条”静默覆盖。一对多或多对多按合同保留集合,输出顺序须明确。
39
+
40
+ 区分以下结果,不用 `catch(() => [])` 将错误伪装为空数据:
41
+
42
+ 默认接口成功表示所需数据已完整读取。只有已有接口合同明确支持部分结果时,才使用其既定状态与字段输出;不能临时新增 `partial` 字段就返回成功,也不能把未完成计算的 `total`、排序或统计描述为准确结果。
43
+
44
+ | 情况 | 处理 |
45
+ |---|---|
46
+ | 完整查询成功,允许缺失的展示关系未匹配 | 保留主记录;单目标返回 `null`,多目标集合按业务合同返回 |
47
+ | 必需关系缺失或唯一关系重复匹配 | 按业务合同返回错误;不猜测替代记录 |
48
+ | 权限不足或查询失败 | 返回错误,不能解释为“目标不存在” |
49
+ | 分页结果不完整 | 默认返回错误;已有部分结果合同按上文处理,不能推断未读结果 |
50
+
51
+ ## 授权与数据所有权
52
+
53
+ - BFF 从可信身份或已核验的服务端访问上下文确定权限。客户端提供的业务筛选值不能扩大授权范围;子记录需要沿已确认的父关系核验归属。
54
+ - 每个数据源分别落实访问控制。不能把主库的租户字段、门店字段、软删除字段或状态枚举机械套到目标表;关联键本身不是访问凭证,已取得的目标 ID 也不等于有权读取它。
55
+ - 核对 BFF 内部模型、SQL 或外部 API 的实际调用通道,不假设它必然经过 Dataset HTTP Hook。缺少授权合同则停止;复用公共授权函数前确认其输入、可信上下文和覆盖范围。
56
+ - 查询投影和返回值使用已授权字段白名单,敏感字段不得通过拼接结果、错误、日志或参数回显泄漏。保留业务字段的精度和空值语义,不为展示默认补零或改变标识符类型。
57
+ - 读写通道由数据所有权和接口合同决定。某个项目的外库只读、指定 OpenAPI 写入规则不能推广为所有外库的统一策略;确认关系或具备读取能力均不构成写入授权。
58
+
59
+ ## 一致性与写入边界
60
+
61
+ 分库读取不共享已证明的一致性快照。数据可能在两次读取之间变化;拼接结果不能作为库存、结算等关键写入的最终依据,关键校验应由权威写入服务在其一致性边界内完成。
62
+
63
+ `context.client.db.transaction` 的原子性仅按已核验的运行时事务范围理解,不能通过把调用放进同一个回调就承诺跨连接或外部 API 原子性。涉及多系统写入时先明确操作顺序、幂等、部分成功与补偿合同;状态未知时先核对,不盲目重试或自动补偿。事务 API 用法见 [Backend Function 事务规则](backend-function.md#事务规则)。
64
+
65
+ ## 交付检查
66
+
67
+ - 两端连接、完整键、基数、权限、投影和读取预算都有明确依据;历史关系和同名字段没有被自动当成有效关系。
68
+ - 覆盖空键、复合键交叉组合与按值查找、重复匹配、允许/必需关系缺失、多页结果、读取中断及预算不足。
69
+ - 展示补充保留主表分页含义;关联筛选包含正向、否定、无关联和混合 OR 的反例,全局排序和统计不会用当前页结果替代完整结果。
70
+ - 用不同身份验证各端数据范围和字段输出;需要真实业务行数据或 BFF 执行验证时,按 [BFF 工作流](bff-creation-workflow.md)显式交接运行态验证。关系配置回读和 `bff push` 成功不能替代该验证。
@@ -14,7 +14,7 @@
14
14
  | **分析主外键关系** | 理解表间关联,正确处理下拉框数据 |
15
15
  | **使用真实接口** | 不使用 mock 数据,直接调用数据集接口 |
16
16
  | **避免循环访问** | 批量查询替代循环单个查询 |
17
- | **性能优先** | 单次接口调用次数 < 50 次 |
17
+ | **有界读取** | 按接口限制与业务预算设定调用和读取上限;超限不能截断结果并冒充完整数据 |
18
18
 
19
19
  ---
20
20
 
@@ -31,7 +31,7 @@
31
31
 
32
32
  **CLI 信封、`data.*` 键位、平台 `get-driven-data` 与 CLI 归一化对照**:单一权威见 [`references/rabetbase-dataset-detail.md`](../references/rabetbase-dataset-detail.md)。
33
33
 
34
- **不要复制示例字段名。** 本指南里的表名、字段名、枚举值只用于说明形态;真实代码必须从当前项目的 `rabetbase dataset detail` 输出中取 `data.fields[]`、`data.relations[]` `data.dbtable`。
34
+ **不要复制示例字段名。** 本指南里的表名、字段名、枚举值只用于说明形态;真实代码的字段与连接事实来自当前项目的 `rabetbase dataset detail` 输出。同库关系读取 `data.relations[]`,跨库登记事实单独使用 `dataset cross-relation-list` 核对。
35
35
 
36
36
  ---
37
37
 
@@ -56,7 +56,10 @@
56
56
  | 聚合列名 | `aggregate[].column` | SDK aggregate 定义使用 `column`,不要写旧别名 `field` |
57
57
  | 必填字段 | `data.fields[].required` | `true` 表示创建/写入时需处理,平台自动维护字段除外 |
58
58
  | 枚举/选择值 | `data.fields[].options[].value` | 写入持久化 `value`,不要写展示用的 `label` |
59
- | 外键关系 | `data.relations[]` / `dataset relations` | 只有确认存在关系后才写关联查询或校验 |
59
+ | 同库关系 | `data.relations[]` / `dataset relations` | 确认端点、基数和查询能力,不按同名字段推断关系 |
60
+ | 跨库登记关系 | `dataset cross-relation-list` | 与业务合同分别核对,不用同库关系列表替代 |
61
+
62
+ 复合键 BFF 可依据已确认的业务合同和两端字段事实实现,不要求先拆成单字段 Relation;平台登记关系不等于执行能力。完整键、查询顺序和授权边界见 [跨库 BFF 查询与拼接](cross-database-bff.md)。
60
63
 
61
64
  常用投影:
62
65
 
@@ -271,7 +274,7 @@ const result = await models[TABLES.primary].filter({
271
274
 
272
275
  ### 场景识别
273
276
 
274
- 代码中出现**循环内调用接口**时,必须优化:
277
+ 代码中出现**按主记录逐条调用接口的 N+1 查询**时,必须优化;按接口合同执行的有界分批和分页循环属于批量读取:
275
278
 
276
279
  ```tsx
277
280
  // ❌ 性能灾难:N 次接口调用
@@ -283,22 +286,22 @@ for (const row of rows) {
283
286
  ### 优化方案选择
284
287
 
285
288
  ```
286
- 循环访问接口(N 次调用)
289
+ 循环逐条访问接口(N 次调用)
290
+
291
+ ├─ 不同数据库连接 → BFF 分库批量读取,按完整键拼接
287
292
 
288
- ├─ 关联类型是 1:1 或 N:1?
289
- │ │
290
- │ ├─ 使用 filter 多表关联查询(推荐)
291
- │ │ 一次查询,自动 JOIN
292
- │ │
293
- │ └─ 否 → 使用批量查询($in)
294
- │ 一次查询,手动映射
293
+ └─ 同一连接
294
+ ├─ 1:1/N:1 且已确认支持关联查询 → filter 多表关联查询
295
+ └─ 其他场景有界批量查询,或已确认支持的库内 Custom SQL
295
296
  ```
296
297
 
298
+ 先核对数据源及查询能力,再选择方案;基数或平台存在 Relation 不能单独证明可自动 JOIN。跨库场景必须阅读 [跨库 BFF 查询与拼接](cross-database-bff.md),分别处理展示补充、关联筛选、全局排序和统计。
299
+
297
300
  ### 方案 1:多表关联查询(推荐)
298
301
 
299
302
  <span style={{fontSize: '0.9em', color: '#888'}}>v1.2.0+</span>
300
303
 
301
- **适用于**:1:1 或 N:1 关联(主记录→关联记录、成员→组织等)
304
+ **适用于**:同一数据库连接内、已确认支持关联查询的 1:1 或 N:1 关系(主记录→关联记录、成员→组织等)。以下示例不能用于推断跨连接 JOIN 能力。
302
305
 
303
306
  ```tsx
304
307
  // ✅ 一次查询,自动 JOIN
@@ -319,28 +322,27 @@ const result = await client.models.primary.filter({
319
322
 
320
323
  ### 方案 2:批量查询
321
324
 
322
- **适用于**:复杂场景或不支持多表关联时
325
+ **适用于**:不支持多表关联或需要分开读取时;跨库拼接在可信 BFF 中完成。
323
326
 
324
- ```tsx
325
- // ✅ 一次查询,$in 批量获取
326
- const relatedIds = [...new Set(rows.map(row => row.related_id))];
327
- const relatedRows = await client.models.related.filter({
328
- where: { id: { $in: relatedIds } },
329
- select: ['id', 'name']
330
- });
331
- const relatedMap = Object.fromEntries(
332
- relatedRows.tableData?.map(row => [row.id, row.name]) || []
333
- );
334
- rows.forEach(row => row.relatedName = relatedMap[row.related_id]);
335
- ```
327
+ 以下步骤用于向已选定主记录补充展示字段。外表参与筛选、排序或统计时,先按 [跨库 BFF 查询与拼接](cross-database-bff.md)确定完整查询顺序,不能先取主表当前页后套用本流程。
328
+
329
+ 1. 从已授权主记录提取有效完整键并去重;空键集合跳过查询,合法的 `0` 不用真值过滤排除。
330
+ 2. 单字段键可用 `$in` 批量过滤;复合键保留字段配对,不能用两个独立 `$in` 替代联合条件。
331
+ 3. 按目标接口限制分批并读取所有匹配页,只取拼接和输出必需的已授权字段。批量查询不保证一次调用返回完整数据;结果不完整或请求失败时默认返回错误。部分结果只按已有接口合同输出,规则见 [跨库 BFF 查询与拼接](cross-database-bff.md)。
332
+ 4. 完整结果按完整键和基数组装;单目标关系出现重复键时报告冲突,一对多按合同收集为集合,不能静默覆盖。
333
+ 5. 只有完整查询成功才判断未匹配;允许缺失的单目标展示关系保留主记录并返回 `null`,必需关系缺失按业务合同失败。
334
+
335
+ 具体执行顺序、复合键示例与失败语义见 [跨库 BFF 查询与拼接](cross-database-bff.md)
336
336
 
337
337
  ### 性能对比
338
338
 
339
- | 方案 | 调用次数 | 耗时 |
340
- |------|---------|------|
341
- | 循环单条(100 条) | 100 | ~10 |
342
- | 多表关联 | 1 | ~0.1 |
343
- | 批量查询 | 1 | ~0.1 |
339
+ | 方案 | 调用量取决于 | 使用前提 |
340
+ |------|-------------|----------|
341
+ | 循环单条 | 主记录数量 | 容易产生 N+1,应优先批量化 |
342
+ | 库内关联 | 接口分页与查询计划 | 同连接且查询能力已确认 |
343
+ | 批量查询 | 去重键数量、批次和匹配结果页数 | 完整读取并在预算内组装 |
344
+
345
+ 调用次数不能直接换算为固定耗时;按真实查询计划、数据量和接口限制验证。
344
346
 
345
347
  ---
346
348
 
@@ -381,7 +383,7 @@ await context.client.sql.execute({
381
383
  - [ ] **外键字段已识别**:下拉框数据来自关联数据集接口
382
384
  - [ ] **枚举字段已处理**:展示使用 `options[].label`,写入使用 `options[].value`
383
385
  - [ ] **未使用 mock 数据**:所有下拉框数据来自真实接口
384
- - [ ] **无循环访问**:优先使用多表关联查询,或使用批量查询
386
+ - [ ] **避免 N+1**:同连接且能力已确认时使用多表关联;跨连接交由 BFF 有界批量读取
385
387
  - [ ] **字段名正确**:使用 `data.fields[].name`(列名),区分大小写,与数据集定义一致
386
388
  - [ ] **系统字段已识别**:结合 `data.dbtable` 与 `backend-function.md`,创建/更新时间等按平台约定不传
387
389
  - [ ] **关联表使用表名**:多表关联时使用 `tableName.fieldName` 格式
@@ -394,7 +396,7 @@ await context.client.sql.execute({
394
396
  - [ ] **枚举字段写入正确**:写入 `options[].value`,不是展示 `label`
395
397
  - [ ] **外键校验已处理**:创建/更新前校验外键有效性
396
398
  - [ ] **系统字段未设置**:主键自增、系统时间等按平台约定不手工传入,详见 `backend-function.md`
397
- - [ ] **无循环访问**:使用 filter + $in 批量查询
399
+ - [ ] **批量读取完整**:按完整键去重、分批和分页;查询失败、不完整或唯一关系重复匹配均明确报告
398
400
  - [ ] **批量操作已优化**:大量数据操作使用自定义 SQL
399
401
 
400
402
  ### SQL 开发