@lovrabet/rabetbase-cli 2.4.7 → 2.5.0-beta.1

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 (364) hide show
  1. package/lib/api/api-doc.js +1 -1
  2. package/lib/api/fetch-model-list.js +1 -1
  3. package/lib/api/generate-api-file.d.ts +13 -3
  4. package/lib/api/generate-api-file.js +1 -1
  5. package/lib/api/generate-sdk-config-file.d.ts +7 -0
  6. package/lib/api/generate-sdk-config-file.js +1 -0
  7. package/lib/auth/auth-server-ui.js +1 -1
  8. package/lib/auth/auth-server.js +1 -1
  9. package/lib/auth/constant.js +1 -1
  10. package/lib/auth/get-cookie.js +1 -1
  11. package/lib/auth/get-session-user.js +1 -1
  12. package/lib/auth/is-session-valid.js +1 -1
  13. package/lib/auth/login-success-html.js +1 -1
  14. package/lib/auth/logout.js +1 -1
  15. package/lib/cli-flags.js +1 -1
  16. package/lib/cli.js +1 -1
  17. package/lib/commands/api/generate.js +1 -1
  18. package/lib/commands/api/index.js +1 -1
  19. package/lib/commands/api/list.js +1 -1
  20. package/lib/commands/api/pull.js +1 -1
  21. package/lib/commands/api/shared.js +1 -1
  22. package/lib/commands/app/index.js +1 -1
  23. package/lib/commands/app/list.js +1 -1
  24. package/lib/commands/app/members-list.js +1 -1
  25. package/lib/commands/app/remote-directory.js +1 -1
  26. package/lib/commands/app/shared.d.ts +2 -5
  27. package/lib/commands/app/shared.js +1 -1
  28. package/lib/commands/app-config/delete.js +1 -1
  29. package/lib/commands/app-config/get.js +1 -1
  30. package/lib/commands/app-config/index.js +1 -1
  31. package/lib/commands/app-config/list.js +1 -1
  32. package/lib/commands/app-config/set.js +1 -1
  33. package/lib/commands/app-config/shared.js +1 -1
  34. package/lib/commands/auth/index.js +1 -1
  35. package/lib/commands/bff/create.js +1 -1
  36. package/lib/commands/bff/delete.js +1 -1
  37. package/lib/commands/bff/detail.js +1 -1
  38. package/lib/commands/bff/index.js +1 -1
  39. package/lib/commands/bff/list.js +1 -1
  40. package/lib/commands/bff/pull.js +1 -1
  41. package/lib/commands/bff/push.js +1 -1
  42. package/lib/commands/bff/status.js +1 -1
  43. package/lib/commands/cli-skill/index.js +1 -1
  44. package/lib/commands/cli-update.js +1 -1
  45. package/lib/commands/codegen/index.js +1 -1
  46. package/lib/commands/codegen/sdk.js +1 -1
  47. package/lib/commands/codegen/sql.js +1 -1
  48. package/lib/commands/common/app-registry.js +1 -1
  49. package/lib/commands/common/app-selector.js +1 -1
  50. package/lib/commands/common/async-task.js +1 -1
  51. package/lib/commands/common/dry-run.js +1 -1
  52. package/lib/commands/common/flags.js +1 -1
  53. package/lib/commands/common/local-file.js +1 -1
  54. package/lib/commands/common/validate.js +1 -1
  55. package/lib/commands/config/delete.d.ts +5 -0
  56. package/lib/commands/config/delete.js +1 -0
  57. package/lib/commands/config/get.js +1 -1
  58. package/lib/commands/config/index.js +1 -1
  59. package/lib/commands/config/init.d.ts +12 -0
  60. package/lib/commands/config/init.js +1 -0
  61. package/lib/commands/config/list.js +1 -1
  62. package/lib/commands/config/set.js +1 -1
  63. package/lib/commands/config/shared.js +1 -1
  64. package/lib/commands/dataset/business-group-update.js +1 -1
  65. package/lib/commands/dataset/business-groups.js +1 -1
  66. package/lib/commands/dataset/capability.js +1 -1
  67. package/lib/commands/dataset/delete.js +1 -1
  68. package/lib/commands/dataset/detail.js +1 -1
  69. package/lib/commands/dataset/extend-update.js +1 -1
  70. package/lib/commands/dataset/field-update.js +1 -1
  71. package/lib/commands/dataset/generate.js +1 -1
  72. package/lib/commands/dataset/index.js +1 -1
  73. package/lib/commands/dataset/list.js +1 -1
  74. package/lib/commands/dataset/operations.js +1 -1
  75. package/lib/commands/dataset/relation-audit.js +1 -1
  76. package/lib/commands/dataset/relation-create.js +1 -1
  77. package/lib/commands/dataset/relation-delete.js +1 -1
  78. package/lib/commands/dataset/relation-shared.js +1 -1
  79. package/lib/commands/dataset/relation-update.js +1 -1
  80. package/lib/commands/dataset/relations.js +1 -1
  81. package/lib/commands/dataset/rename.js +1 -1
  82. package/lib/commands/dataset/restore.js +1 -1
  83. package/lib/commands/db/analysis-batching.js +1 -1
  84. package/lib/commands/db/analyze-batch-plan.js +1 -1
  85. package/lib/commands/db/analyze-cancel.js +1 -1
  86. package/lib/commands/db/analyze-start.js +1 -1
  87. package/lib/commands/db/analyze-status.js +1 -1
  88. package/lib/commands/db/create.js +1 -1
  89. package/lib/commands/db/delete.js +1 -1
  90. package/lib/commands/db/detail.js +1 -1
  91. package/lib/commands/db/diff-refresh-start.js +1 -1
  92. package/lib/commands/db/diff-refresh-status.js +1 -1
  93. package/lib/commands/db/diff.js +1 -1
  94. package/lib/commands/db/index.js +1 -1
  95. package/lib/commands/db/list.js +1 -1
  96. package/lib/commands/db/shared.js +1 -1
  97. package/lib/commands/db/tables.js +1 -1
  98. package/lib/commands/db/test.js +1 -1
  99. package/lib/commands/db/update.js +1 -1
  100. package/lib/commands/doctor.js +1 -1
  101. package/lib/commands/file/index.js +1 -1
  102. package/lib/commands/issue/index.js +1 -1
  103. package/lib/commands/issue/nudge.js +1 -1
  104. package/lib/commands/issue/report.js +1 -1
  105. package/lib/commands/issue/shared.js +1 -1
  106. package/lib/commands/kb/create.js +1 -1
  107. package/lib/commands/kb/delete.js +1 -1
  108. package/lib/commands/kb/detail.js +1 -1
  109. package/lib/commands/kb/index.js +1 -1
  110. package/lib/commands/kb/list.js +1 -1
  111. package/lib/commands/kb/search.js +1 -1
  112. package/lib/commands/kb/shared.js +1 -1
  113. package/lib/commands/kb/update.js +1 -1
  114. package/lib/commands/logs/index.js +1 -1
  115. package/lib/commands/menu/asset-update.js +1 -1
  116. package/lib/commands/menu/delete.js +1 -1
  117. package/lib/commands/menu/external-link-create.js +1 -1
  118. package/lib/commands/menu/external-link-update.js +1 -1
  119. package/lib/commands/menu/group-create.js +1 -1
  120. package/lib/commands/menu/group-update.js +1 -1
  121. package/lib/commands/menu/index.js +1 -1
  122. package/lib/commands/menu/list.js +1 -1
  123. package/lib/commands/menu/move.js +1 -1
  124. package/lib/commands/menu/regroup-start.js +1 -1
  125. package/lib/commands/menu/rename.js +1 -1
  126. package/lib/commands/menu/shared/compare-table.js +1 -1
  127. package/lib/commands/menu/shared/delete-plan.js +1 -1
  128. package/lib/commands/menu/shared/facts.js +1 -1
  129. package/lib/commands/menu/shared/index.js +1 -1
  130. package/lib/commands/menu/shared/inquirer.js +1 -1
  131. package/lib/commands/menu/shared/local-pages.js +1 -1
  132. package/lib/commands/menu/shared/logic.js +1 -1
  133. package/lib/commands/menu/shared/mutations.js +1 -1
  134. package/lib/commands/menu/shared/service.js +1 -1
  135. package/lib/commands/menu/shared/sync-core.js +1 -1
  136. package/lib/commands/menu/shared/update-core.js +1 -1
  137. package/lib/commands/menu/shared/valid-url.js +1 -1
  138. package/lib/commands/menu/sync.js +1 -1
  139. package/lib/commands/menu/visibility-update.js +1 -1
  140. package/lib/commands/notification/config-create.js +1 -1
  141. package/lib/commands/notification/config-delete.js +1 -1
  142. package/lib/commands/notification/config-list.js +1 -1
  143. package/lib/commands/notification/config-update.js +1 -1
  144. package/lib/commands/notification/index.js +1 -1
  145. package/lib/commands/notification/shared.js +1 -1
  146. package/lib/commands/ocr/index.js +1 -1
  147. package/lib/commands/page/create.js +1 -1
  148. package/lib/commands/page/custom/detail.js +1 -1
  149. package/lib/commands/page/custom/list.js +1 -1
  150. package/lib/commands/page/custom/publish.js +1 -1
  151. package/lib/commands/page/custom/shared.js +1 -1
  152. package/lib/commands/page/custom/syntax.js +1 -1
  153. package/lib/commands/page/custom/template.js +1 -1
  154. package/lib/commands/page/custom/update.js +1 -1
  155. package/lib/commands/page/data-list-status.js +1 -1
  156. package/lib/commands/page/generate-start.js +1 -1
  157. package/lib/commands/page/generate-status.js +1 -1
  158. package/lib/commands/page/index.js +1 -1
  159. package/lib/commands/page/pull.js +1 -1
  160. package/lib/commands/page/push.js +1 -1
  161. package/lib/commands/page/relation-audit.js +1 -1
  162. package/lib/commands/page/restore.js +1 -1
  163. package/lib/commands/page/shared.js +1 -1
  164. package/lib/commands/page/sync.js +1 -1
  165. package/lib/commands/project/create/enhanced-guided-create.js +1 -1
  166. package/lib/commands/project/create/format-elapsed.js +1 -1
  167. package/lib/commands/project/create/main.d.ts +1 -0
  168. package/lib/commands/project/create/main.js +1 -1
  169. package/lib/commands/project/create/materialize-project-template.d.ts +6 -2
  170. package/lib/commands/project/create/materialize-project-template.js +1 -1
  171. package/lib/commands/project/create/project-name.js +1 -1
  172. package/lib/commands/project/create/project-template-archive.js +1 -1
  173. package/lib/commands/project/create/project-template-path.js +1 -1
  174. package/lib/commands/project/create/use-copy-project-template.d.ts +1 -1
  175. package/lib/commands/project/create/use-copy-project-template.js +1 -1
  176. package/lib/commands/project/create/use-format-code.js +1 -1
  177. package/lib/commands/project/create/use-install-dependencies.js +1 -1
  178. package/lib/commands/project/index.js +1 -1
  179. package/lib/commands/project/upgrade.js +1 -1
  180. package/lib/commands/registry.d.ts +2 -2
  181. package/lib/commands/registry.js +1 -1
  182. package/lib/commands/role/delete.js +1 -1
  183. package/lib/commands/role/detail.js +1 -1
  184. package/lib/commands/role/index.js +1 -1
  185. package/lib/commands/role/list.js +1 -1
  186. package/lib/commands/role/shared.d.ts +1 -1
  187. package/lib/commands/role/shared.js +1 -1
  188. package/lib/commands/role/update.js +1 -1
  189. package/lib/commands/role/user-add.js +1 -1
  190. package/lib/commands/role/user-remove.js +1 -1
  191. package/lib/commands/role/user-resolve.js +1 -1
  192. package/lib/commands/run/index.js +1 -1
  193. package/lib/commands/schema.js +1 -1
  194. package/lib/commands/sql/create.js +1 -1
  195. package/lib/commands/sql/delete.js +1 -1
  196. package/lib/commands/sql/detail.js +1 -1
  197. package/lib/commands/sql/exec.js +1 -1
  198. package/lib/commands/sql/index.js +1 -1
  199. package/lib/commands/sql/list.js +1 -1
  200. package/lib/commands/sql/pull.js +1 -1
  201. package/lib/commands/sql/push.js +1 -1
  202. package/lib/commands/sql/shared.js +1 -1
  203. package/lib/commands/sql/status.js +1 -1
  204. package/lib/commands/sql/validate.js +1 -1
  205. package/lib/commands/task/index.js +1 -1
  206. package/lib/commands/task/status.js +1 -1
  207. package/lib/commands/tenant/index.js +1 -1
  208. package/lib/commands/tenant/members-list.js +1 -1
  209. package/lib/commands/tenant/shared.js +1 -1
  210. package/lib/commands/user-account/dingding-sandbox-bind.js +1 -1
  211. package/lib/commands/user-account/index.js +1 -1
  212. package/lib/commands/workspace/add.js +1 -1
  213. package/lib/commands/workspace/index.js +1 -1
  214. package/lib/commands/workspace/remove.js +1 -1
  215. package/lib/config/domain-config.d.ts +10 -0
  216. package/lib/config/domain-config.js +1 -0
  217. package/lib/config/schema.d.ts +3 -1
  218. package/lib/config/schema.js +1 -1
  219. package/lib/constant/cdn.js +1 -1
  220. package/lib/constant/cli.js +1 -1
  221. package/lib/constant/defaults.js +1 -1
  222. package/lib/constant/domain.d.ts +23 -1
  223. package/lib/constant/domain.js +1 -1
  224. package/lib/constant/env.js +1 -1
  225. package/lib/constant/output.js +1 -1
  226. package/lib/constant/paths.js +1 -1
  227. package/lib/constant/region.d.ts +9 -0
  228. package/lib/constant/region.js +1 -0
  229. package/lib/constant/risk.js +1 -1
  230. package/lib/context/app-resolver.js +1 -1
  231. package/lib/context/auth-resolver.js +1 -1
  232. package/lib/context/config-loader.d.ts +4 -6
  233. package/lib/context/config-loader.js +1 -1
  234. package/lib/context.d.ts +2 -2
  235. package/lib/context.js +1 -1
  236. package/lib/core/alias-resolver.js +1 -1
  237. package/lib/core/api-client.d.ts +2 -0
  238. package/lib/core/api-client.js +1 -1
  239. package/lib/core/bff/config.js +1 -1
  240. package/lib/core/bff/file-system.js +1 -1
  241. package/lib/core/bff/hash.js +1 -1
  242. package/lib/core/bff/lock.js +1 -1
  243. package/lib/core/bff/utils.js +1 -1
  244. package/lib/core/db-resolver.js +1 -1
  245. package/lib/core/page/file-system.js +1 -1
  246. package/lib/core/page/hash.js +1 -1
  247. package/lib/core/page/lock.js +1 -1
  248. package/lib/core/sql-index-auditor.js +1 -1
  249. package/lib/core/sql-sync/config.js +1 -1
  250. package/lib/core/sql-sync/file-system.js +1 -1
  251. package/lib/core/sql-sync/hash.js +1 -1
  252. package/lib/core/sql-sync/lock.js +1 -1
  253. package/lib/core/sql-sync/utils.js +1 -1
  254. package/lib/core/sql-validator.js +1 -1
  255. package/lib/errors.d.ts +11 -1
  256. package/lib/errors.js +1 -1
  257. package/lib/framework/build-all-flags.js +1 -1
  258. package/lib/framework/error-output.js +1 -1
  259. package/lib/framework/explicit-yes.js +1 -1
  260. package/lib/framework/flags.js +1 -1
  261. package/lib/framework/help.d.ts +2 -2
  262. package/lib/framework/help.js +1 -1
  263. package/lib/framework/index.js +1 -1
  264. package/lib/framework/output.js +1 -1
  265. package/lib/framework/response.js +1 -1
  266. package/lib/framework/runner-alias.js +1 -1
  267. package/lib/framework/runner.js +1 -1
  268. package/lib/framework/schema-export.js +1 -1
  269. package/lib/framework/types.js +1 -1
  270. package/lib/generated/build-info.d.ts +4 -4
  271. package/lib/generated/build-info.js +1 -1
  272. package/lib/help.js +1 -1
  273. package/lib/postinstall.js +1 -1
  274. package/lib/runtime/confirmation.js +1 -1
  275. package/lib/runtime/event.js +1 -1
  276. package/lib/runtime/index.js +1 -1
  277. package/lib/runtime/queue.js +1 -1
  278. package/lib/runtime/resolve.js +1 -1
  279. package/lib/skills/builtin-skill.js +1 -1
  280. package/lib/skills/main.js +1 -1
  281. package/lib/skills/npx-skills-add.js +1 -1
  282. package/lib/skills/skill-presence.js +1 -1
  283. package/lib/telemetry/cli-command-trace.js +1 -1
  284. package/lib/telemetry/cli-help-trace.js +1 -1
  285. package/lib/telemetry/ensure-cli-otel-config.js +1 -1
  286. package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
  287. package/lib/telemetry/send-cli-trace-log.js +1 -1
  288. package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
  289. package/lib/types/index.d.ts +28 -0
  290. package/lib/utils/ai_config.d.ts +1 -2
  291. package/lib/utils/ai_config.js +1 -1
  292. package/lib/utils/apply-jq-filter.js +1 -1
  293. package/lib/utils/cdn-config.js +1 -1
  294. package/lib/utils/check-sdk-version.js +1 -1
  295. package/lib/utils/cli-version-check.js +1 -1
  296. package/lib/utils/cli-version-policy.js +1 -1
  297. package/lib/utils/config.js +1 -1
  298. package/lib/utils/entity-with-id.js +1 -1
  299. package/lib/utils/file-utils.js +1 -1
  300. package/lib/utils/guides-cdn.js +1 -1
  301. package/lib/utils/http-client.js +1 -1
  302. package/lib/utils/is-non-interactive.js +1 -1
  303. package/lib/utils/logger.js +1 -1
  304. package/lib/utils/params.js +1 -1
  305. package/lib/utils/platform.js +1 -1
  306. package/lib/utils/sleep.js +1 -1
  307. package/lib/utils/template-replacer.js +1 -1
  308. package/lib/utils/update-notice.js +1 -1
  309. package/lib/utils/version.js +1 -1
  310. package/lib/utils/with-active-cookie.js +1 -1
  311. package/lib/utils/write-cli-side-channel.js +1 -1
  312. package/package.json +1 -3
  313. package/skills/rabetbase/SKILL.md +33 -28
  314. package/skills/rabetbase/guides/backend-function.md +41 -12
  315. package/skills/rabetbase/guides/bff-creation-workflow.md +6 -4
  316. package/skills/rabetbase/guides/custom-page-workflow.md +1 -1
  317. package/skills/rabetbase/guides/data-api-guidelines.md +8 -8
  318. package/skills/rabetbase/guides/database-connection-workflow.md +8 -16
  319. package/skills/rabetbase/guides/menu-anomaly-manual-cleanup.md +1 -6
  320. package/skills/rabetbase/guides/sdk-client-generation.md +146 -0
  321. package/skills/rabetbase/guides/sql-creation-workflow.md +1 -1
  322. package/skills/rabetbase/guides/troubleshooting.md +1 -1
  323. package/skills/rabetbase/guides/typescript-sdk.md +46 -10
  324. package/skills/rabetbase/references/rabetbase-api-list.md +4 -4
  325. package/skills/rabetbase/references/rabetbase-api-pull.md +44 -29
  326. package/skills/rabetbase/references/rabetbase-app-list.md +2 -2
  327. package/skills/rabetbase/references/rabetbase-auth-login.md +4 -2
  328. package/skills/rabetbase/references/rabetbase-bff-push.md +3 -1
  329. package/skills/rabetbase/references/rabetbase-codegen-sql.md +3 -1
  330. package/skills/rabetbase/references/rabetbase-config.md +75 -30
  331. package/skills/rabetbase/references/rabetbase-dataset-detail.md +1 -1
  332. package/skills/rabetbase/references/rabetbase-db-analyze.md +3 -3
  333. package/skills/rabetbase/references/rabetbase-db-detail.md +2 -2
  334. package/skills/rabetbase/references/rabetbase-db-diff-refresh.md +4 -4
  335. package/skills/rabetbase/references/rabetbase-db-diff.md +6 -9
  336. package/skills/rabetbase/references/rabetbase-doctor.md +1 -1
  337. package/skills/rabetbase/references/rabetbase-init.md +57 -51
  338. package/skills/rabetbase/references/rabetbase-kb.md +2 -0
  339. package/skills/rabetbase/references/rabetbase-page-create.md +1 -1
  340. package/skills/rabetbase/references/rabetbase-page-custom-detail.md +3 -3
  341. package/skills/rabetbase/references/rabetbase-page-custom-list.md +2 -2
  342. package/skills/rabetbase/references/rabetbase-project-create.md +12 -3
  343. package/skills/rabetbase/references/rabetbase-project-upgrade.md +2 -2
  344. package/skills/rabetbase/references/rabetbase-role-user-resolve.md +2 -2
  345. package/skills/rabetbase/references/rabetbase-user-account.md +1 -1
  346. package/skills/rabetbase/references/rabetbase-workspace.md +6 -6
  347. package/skills/rabetbase.manifest.json +4 -3
  348. package/templates/README.md +17 -28
  349. package/templates/generate-api/api.ts.tpl +3 -3
  350. package/templates/generate-api/client.ts.tpl +10 -37
  351. package/lib/commands/data/filter.d.ts +0 -7
  352. package/lib/commands/data/filter.js +0 -1
  353. package/lib/commands/data/getOne.d.ts +0 -7
  354. package/lib/commands/data/getOne.js +0 -1
  355. package/lib/commands/data/index.d.ts +0 -8
  356. package/lib/commands/data/index.js +0 -1
  357. package/lib/commands/data/shared.d.ts +0 -33
  358. package/lib/commands/data/shared.js +0 -1
  359. package/lib/commands/init/index.d.ts +0 -11
  360. package/lib/commands/init/index.js +0 -1
  361. package/lib/utils/rules-cdn.d.ts +0 -38
  362. package/lib/utils/rules-cdn.js +0 -1
  363. package/templates/rules/lovrabet_rules.mdc.tpl +0 -893
  364. package/templates/skill/SKILL.md.tpl +0 -120
@@ -48,10 +48,12 @@
48
48
 
49
49
  ## 平台配置地址
50
50
 
51
+ 优先使用相关命令返回的 `data.links`。需要手工拼接时,以当前生效的 `appDomain` 作为 `<appDomain>`,不要硬编码 `app.lovrabet.com`:
52
+
51
53
  | 类型 | 地址 |
52
54
  |------|------|
53
- | HOOK | `https://app.lovrabet.com/app/{appCode}/data/dataset/{datasetId}#api-list` |
54
- | ENDPOINT | `https://app.lovrabet.com/app/{appCode}/data/backend-function` |
55
+ | HOOK | `<appDomain>/app/{appCode}/data/dataset/{datasetId}#api-list` |
56
+ | ENDPOINT | `<appDomain>/app/{appCode}/data/backend-function` |
55
57
 
56
58
  其中 `datasetId` 需要通过 `rabetbase dataset detail --code xxx --format json` 获取。
57
59
 
@@ -85,10 +87,10 @@ Backend Function 脚本统一存放在 `.rabetbase/bff/<appCode>/` 目录下,
85
87
 
86
88
  HOOK 的第一层子目录名(标识数据集)按以下优先级确定:
87
89
 
88
- 1. **alias**(优先):来自 `api.ts`(由 `rabetbase api pull` 生成)
90
+ 1. **alias**(优先):来自 `api.ts`(`api pull` 返回的 models,按 [`sdk-client-generation.md`](sdk-client-generation.md) 维护)
89
91
  2. **datasetCode**(兜底):当 `api.ts` 不可用时,直接使用 32 位数据集编码
90
92
 
91
- 推荐始终先执行 `rabetbase api pull` 以获得可读性更好的 alias 命名。
93
+ 推荐先执行 `rabetbase api pull --format compress`,再按 guide 更新 `api.ts` 以获得可读 alias
92
94
 
93
95
  ## 文件命名与函数命名
94
96
 
@@ -108,7 +110,7 @@ HOOK 的第一层子目录名(标识数据集)按以下优先级确定:
108
110
  * `delete`
109
111
  * `aggregate`(仅在数据集 operation 实际返回时使用;METADATA 默认不会提供)
110
112
 
111
- 使用 `aggregate` 时,聚合列名写在 `aggregate[].column`;`field` 只是历史兼容别名,新脚本不要使用。
113
+ 使用 `aggregate` 时,聚合列名写在 `aggregate[].column`;`field` 是兼容别名,默认使用 `column`。
112
114
 
113
115
  Backend Function HOOK 可以挂在 `DB_TABLE` 或 `METADATA` 数据集上;是否可挂某个 operation,以平台返回的 operation types 为准。
114
116
 
@@ -343,7 +345,20 @@ rabetbase dataset detail --code <datasetCode> --format compress \
343
345
 
344
346
  ## 数据集调用规范
345
347
 
346
- 通过 `context.client.models` 调用数据集。模型键格式为固定前缀 `"dataset_"` 拼接 32 位数据集编码,编码来自 `rabetbase dataset list/detail` 返回的 `code` 字段。
348
+ 通过 `context.client.models` 调用数据集。有物理表的 `DB_TABLE` 默认按物理表名解析,避免把 Dataset code 写入业务代码:
349
+
350
+ ```javascript
351
+ const primary = context.client.models.byTable("<primary_physical_table>");
352
+ const detail = context.client.models.byTable("<detail_physical_table>", {
353
+ dblinkId: "<dblinkId>", // 从 rabetbase db list 确认后替换
354
+ });
355
+
356
+ const record = await primary.getOne({ id: params.id });
357
+ ```
358
+
359
+ `byTable` 只在当前应用内解析。若物理表名只对应一个数据集,不需要 `dblinkId`;若同名表来自多个 dblink,必须从 `rabetbase db list` 取得真实 dblink ID 后传入,运行时遇到 `DATASET_TABLE_AMBIGUOUS` 不会按更新时间或任意 Dataset code 选择。表不存在时返回 `DATASET_TABLE_NOT_FOUND`。
360
+
361
+ `METADATA` 没有物理表,使用 Dataset code 访问;`DB_TABLE` 的 Dataset code 访问作为兼容方式。模型键格式为固定前缀 `"dataset_"` 拼接数据集编码,编码来自 `rabetbase dataset list/detail` 返回的 `code` 字段:
347
362
 
348
363
  ```javascript
349
364
  const TABLES = {
@@ -357,7 +372,10 @@ const record = await models[TABLES.primary].getOne({ id: params.id });
357
372
 
358
373
  规则:
359
374
 
360
- * 必须使用 `"dataset_" + 32 位数据集编码`,不要只写裸 `code`
375
+ * `DB_TABLE` 默认使用 `models.byTable("<物理表名>", { dblinkId? })`
376
+ * 同名表跨 dblink 时必须显式传已确认的 `dblinkId`;不要把歧义错误改为任意 Dataset code
377
+ * `METADATA` 使用 `"dataset_" + 数据集 code`;`DB_TABLE` 的该形式仅作为兼容路径
378
+ * 使用兼容路径时必须使用 `"dataset_" + 32 位数据集编码`,不要只写裸 `code`
361
379
  * 每个映射后写 `// 数据集: ... | 数据表: ...`
362
380
  * 查询单条统一使用 `getOne({ id })`
363
381
  * 列表查询优先使用 `filter()`
@@ -395,7 +413,13 @@ await models[TABLES.primary].update({
395
413
 
396
414
  ### aggregate 调用与选型
397
415
 
398
- `` context.client.models[`dataset_${datasetCode}`].aggregate(params) `` 是 Backend Function 的数据集 Instant API。实际脚本仍按上文的数据集映射,通过 `models[TABLES.xxx]` 访问;示例字段只用于展示参数契约,编写业务脚本前必须用 `dataset detail` 替换为真实字段:
416
+ `aggregate()` 只适用于 `DB_TABLE`:
417
+
418
+ - `` context.client.models.byTable("<物理表名>"[, { dblinkId }]).aggregate(params) ``:`DB_TABLE` 的推荐寻址
419
+ - `context.client.models[`dataset_${datasetCode}`].aggregate(params)`:仅 `DB_TABLE` 的兼容寻址
420
+ - `METADATA`:**不支持** `aggregate()`
421
+
422
+ 实际脚本仍按上文的数据集映射,通过 `models[TABLES.xxx]` 访问;示例字段只用于展示参数契约,编写业务脚本前必须用 `dataset detail` 替换为真实字段:
399
423
 
400
424
  ```javascript
401
425
  const aggregateResult = await models[TABLES.primary].aggregate({
@@ -597,17 +621,20 @@ export default async function runBusinessFlow(params, context) {
597
621
 
598
622
  ## SQL 调用规则
599
623
 
600
- Backend Function 入参使用业务参数;需要执行 SQL 时,通过已发布 Custom SQL `sqlCode` + `params` 调用。执行失败时保留并报告原始错误,根据 SQL 资源状态、参数与权限定位问题。
624
+ Backend Function 入参使用业务参数,默认通过已发布 Custom SQL 的唯一 `sqlName` + `params` 调用,避免在业务代码中硬编码 `sqlCode`。执行失败时保留并报告原始错误,根据 SQL 资源状态、参数与权限定位问题。
601
625
 
602
626
  在 Backend Function 中使用:
603
627
 
604
628
  ```javascript
605
- const rows = await context.client.sql.execute({
606
- sqlCode: "example-read-list",
629
+ const rows = await context.client.sql.byName("<confirmed_sql_name>").execute({
607
630
  params,
608
631
  });
609
632
  ```
610
633
 
634
+ `sqlName` 只在当前应用内解析。名称不存在时返回 `SQL_NAME_NOT_FOUND`,重名时返回 `SQL_NAME_AMBIGUOUS`;两种情况都不会选择任意 SQL。使用前通过 `rabetbase sql list --name "<名称>"` 与 `rabetbase sql detail --sqlcode <code>` 确认目标 SQL 和参数契约。
635
+
636
+ Backend Function 默认使用 `byName`;`context.client.sql.execute({ sqlCode, params })` 是兼容调用方式。前端 SDK 使用 `sqlCode`。
637
+
611
638
  关键差异:
612
639
 
613
640
  * 前端 SDK:返回 `{ execSuccess, execResult }`
@@ -860,7 +887,8 @@ await context.client.db.transaction(async (tx) => {
860
887
  * [ ] 顶部注释完整且占位符已替换
861
888
  * [ ] JSDoc 已覆盖根请求参数、实际字段和返回值;显式抛出异常时已补充 `@throws`
862
889
  * [ ] 依赖数据集、调用 BF、执行 SQL 和副作用说明与实际代码一致
863
- * [ ] 数据集映射使用 `"dataset_" + 32 位编码`
890
+ * [ ] `DB_TABLE` 数据集优先使用 `models.byTable("<物理表名>", { dblinkId? })`;同名表已按真实 dblink ID 消歧
891
+ * [ ] `METADATA` 使用 `"dataset_" + 32 位编码`;`DB_TABLE` 使用该形式时属于兼容路径
864
892
  * [ ] 单条查询统一使用 `getOne`
865
893
  * [ ] 列表查询使用 `filter`,并从 `.tableData` 读取结果
866
894
  * [ ] DB_TABLE 简单单表聚合优先使用 `aggregate()`,并从 `.tableData` 读取结果
@@ -869,6 +897,7 @@ await context.client.db.transaction(async (tx) => {
869
897
  * [ ] 批量更新使用 `update({ id: [...] })`,没有使用不存在的 `batchUpdate()` 或记录数组参数
870
898
  * [ ] 枚举/选择字段写入 `options[].value`,不是展示 `label`
871
899
  * [ ] SQL 返回值按 Backend Function 语义处理
900
+ * [ ] Backend Function 的 Custom SQL 默认使用 `sql.byName("<唯一名称>").execute({ params })`,并已确认名称在当前应用唯一
872
901
  * [ ] 未设置系统自动维护字段
873
902
  * [ ] 无明显 N+1 或循环写入问题
874
903
  * [ ] HOOK 返回 `params`,ENDPOINT 返回业务对象
@@ -29,7 +29,7 @@ rabetbase notification config-list --type EMAIL --format compress
29
29
 
30
30
  从 `data.configs[]` 按 `configName` / `description` 选择配置,并使用同一项的 `configCode`。命令不会输出 `channelConfig`、`endpointUrl` 或通知凭据。没有结果或存在多个候选且业务目标不明确时,停下向用户确认;不得猜测。不要把 dataset 级通知通道的 `channelCode` 当成 Backend Function 所需的应用级 `configCode`。
31
31
 
32
- Backend Function HOOK 可挂载 `DB_TABLE` 或 `METADATA` 数据集,具体 operation 以平台返回为准。`METADATA` 数据集不支持 SQL / aggregate 路径;脚本中应使用 `` context.client.models[`dataset_${datasetCode}`] `` 的标准操作能力。
32
+ Backend Function HOOK 可挂载 `DB_TABLE` 或 `METADATA` 数据集,具体 operation 以平台返回为准。`DB_TABLE` 使用 `context.client.models.byTable("<物理表名>")`;同名物理表来自多个 dblink 时,必须从 `rabetbase db list` 取得真实 ID 后传入 `{ dblinkId }`,不要让运行时任选。`METADATA` 没有物理表,且不支持 SQL / aggregate 路径,使用 `` context.client.models[`dataset_${datasetCode}`] `` 的标准操作能力。
33
33
 
34
34
  常用字段投影:
35
35
 
@@ -59,7 +59,8 @@ rabetbase dataset detail --code <数据集编码> --format compress \
59
59
  ### 5. 自检
60
60
  * 方法名正确
61
61
  * 单条查询用 `getOne`
62
- * Backend Function 模型键使用 `"dataset_" + 32 位数据集 code`
62
+ * `DB_TABLE` 优先使用 `context.client.models.byTable("<物理表名>")`;同名表存在多个 dblink 时补 `{ dblinkId: <已确认 ID> }`
63
+ * `METADATA` 使用 `"dataset_" + 数据集 code`;`DB_TABLE` 仅在兼容调用时使用该形式
63
64
  * METADATA 数据集的 Backend Function / HOOK 不走 SQL 或 aggregate;只使用平台返回的标准数据操作
64
65
  * `filter()` 结果从 `.tableData` 读取,不是 `.list`
65
66
  * `create()` 返回新记录 ID,不是完整对象;不要访问 `created.id`
@@ -67,6 +68,7 @@ rabetbase dataset detail --code <数据集编码> --format compress \
67
68
  * 批量更新使用 `update({ id: [...] })`;不存在 `batchUpdate()`,也不传记录数组
68
69
  * 枚举/选择字段写入 `options[].value`,不是展示 `label`
69
70
  * Backend Function 中 `sql.execute` 返回数组,不是 `{ execSuccess, execResult }`
71
+ * Backend Function 中 Custom SQL 默认使用 `context.client.sql.byName("<唯一 SQL 名>").execute({ params })`;名称不唯一时先处理 `SQL_NAME_AMBIGUOUS`,不要回退任意 `sqlCode`
70
72
  * 没有在 Backend Function 中使用前端 SDK 初始化能力,如 `createClient`、`registerModels`
71
73
  * 参数校验、错误处理、脱敏
72
74
  * 中文 JSDoc 已写清根请求参数、实际 `params.<字段名>`、返回值;显式抛出异常时包含 `@throws`
@@ -139,8 +141,8 @@ lovrabet bff exec --appcode <appCode> --name <functionName> --params '<json>' --
139
141
 
140
142
  | 场景 | 前端 SDK | Backend Function (context.client) |
141
143
  |------|---------|---------------------|
142
- | SQL 返回值 | `{ execSuccess, execResult }` | 直接返回数组 |
143
- | 模型键 | 可通过初始化/生成代码使用 alias | 使用 `"dataset_" + 32 位数据集 code` |
144
+ | SQL 调用 / 返回值 | `sql.execute({ sqlCode, params })`,返回 `{ execSuccess, execResult }` | 默认使用 `sql.byName(sqlName).execute({ params })`,直接返回数组;`sql.execute({ sqlCode, params })` 为兼容调用方式 |
145
+ | 数据集访问 | 可通过初始化/生成代码使用 alias | `DB_TABLE` 默认使用 `models.byTable(tableName, { dblinkId? })`;`METADATA` 使用 `"dataset_" + 数据集 code`,`DB_TABLE` 也支持该兼容调用方式 |
144
146
  | `filter()` 返回 | `tableData` 为列表数据 | `tableData` 为列表数据,不是 `list` |
145
147
  | `create()` 返回 | 以 SDK 文档/类型为准 | 新记录 ID,不是完整对象 |
146
148
  | `batchCreate()` 返回 | 以 SDK 文档/类型为准 | 新记录 ID 数组;直接传非空对象数组 |
@@ -109,7 +109,7 @@ page create --page-pattern BLANK
109
109
 
110
110
  判断顺序:先确认单一数据集请求能否满足需求;数据组合和数据库计算是主要问题时选择 Custom SQL;当前用户、角色、数据范围或业务规则需要额外控制时选择 Backend Function。三种方式可以根据已确认的 SDK 契约配合使用,但不得自行推测方法、参数或返回结构。
111
111
 
112
- 页面和 Backend Function 通过已发布 Custom SQL 的 `sqlCode` + `params` 执行查询。Dataset、Custom SQL 或 Backend Function 执行失败时,保留并报告原始错误,根据资源状态、参数与权限定位问题。
112
+ 页面通过已发布 Custom SQL 的 `sqlCode` + `params` 执行查询;Backend Function 默认使用 `context.client.sql.byName(sqlName).execute({ params })`,`sql.execute({ sqlCode, params })` 仅作兼容路径。Dataset、Custom SQL 或 Backend Function 执行失败时,保留并报告原始错误,根据资源状态、参数与权限定位问题。
113
113
 
114
114
  页面需要读取或写入数据集时,先按以下顺序确认事实:
115
115
 
@@ -67,22 +67,22 @@ rabetbase dataset detail --code <数据集编码> --format compress \
67
67
 
68
68
  ---
69
69
 
70
- ## 可选:`lovrabet` CLI 查数(`data filter` / `data getOne`)
70
+ ## 真实行数据:交接给 `lovrabet`
71
71
 
72
- skill 的**主路径**始终基于 **`rabetbase`**(`dataset detail`、`sql exec` 等),**不要求**安装其它 CLI。
72
+ 不需要真实行数据时,`lovrabet` CLI 可以不装;本 skill 的结构/发布主路径始终基于 **`rabetbase`**(`dataset detail`、`sql exec` 验证已发布 SQL 等)。
73
73
 
74
- 若开发者本机已单独安装 **Lovrabet 运行时 CLI**(npm 包 **`@lovrabet/lovrabet-cli`**,命令名 **`lovrabet`**),可在终端用 **`lovrabet data filter`**、**`lovrabet data getOne`** 按 **与 `@lovrabet/sdk` 相同的语义** 查询数据集行数据,并直接查看 JSON 结构,便于与前端 / Backend Function 里的 `filter`、`getOne` 对照调试。
74
+ 一旦要验证真实业务行数据,必须交接给 **`lovrabet data filter`** / **`lovrabet data getOne`**(与 `@lovrabet/sdk` 相同语义)。`rabetbase` `lovrabet` Skill 不互斥:不可用时**报告阻断**并提示安装,不要静默安装或修复运行态 CLI,也不要把 `rabetbase sql exec` 当成行数据查询的通用替代。
75
75
 
76
- **版本要求:须 `lovrabet` CLI 2.0**(主版本 2 及以上)。低于 2.0 的旧包**没有**与本文一致的 `data filter` / `data getOne` 能力(或行为不同),请勿按本节操作;请升级:`npm install -g @lovrabet/lovrabet-cli@^2.0.0`(或 `latest`)。自检:`lovrabet --version`。
76
+ 若本机已安装 **Lovrabet 运行时 CLI**(npm **`@lovrabet/lovrabet-cli`**,命令名 **`lovrabet`**,须 **≥ 2.0**),可在终端对照调试前端 / Backend Function 里的 `filter`、`getOne`。低于 2.0 请先升级:`npm install -g @lovrabet/lovrabet-cli@^2.0.0`。自检:`lovrabet --version`。
77
77
 
78
78
  **注意:**
79
79
 
80
80
  | 点 | 说明 |
81
81
  |----|------|
82
- | **非必备** | 团队未必全局安装 `lovrabet`;**不要**在文档或 Agent 流程里把 `lovrabet` 写成前置条件。 |
83
- | **≥ 2.0** | 本节所述 `data` 子命令以 **2.0+** 为准;版本不符时先升级,勿将异常当作 skill 错误。 |
84
- | **未安装时** | 仍用 `rabetbase dataset detail` 拿结构;要看真实数据可用 **`rabetbase sql exec`**(已有对应 `sqlCode`)、或平台控制台;勿假设用户会去装第二个 CLI。 |
85
- | **配置与认证** | `lovrabet` 与 `rabetbase` 的配置项、鉴权方式**可能不完全相同**,需按各自 CLI 文档分别配置;勿照搬一条 `rabetbase` 的 flag 就认为 `lovrabet` 等价。 |
82
+ | **结构 vs 行数据** | 结构用 `rabetbase dataset detail`。真实行数据必须用 `lovrabet data filter` / `data getOne`。 |
83
+ | **未安装时** | 报告阻断,并提示安装 `lovrabet` Skill(`npx skills add lovrabet/lovrabet-cli`)和 CLI。不要由本 Skill 静默安装或修复。**`rabetbase sql exec` 只验证已发布 SQL 的可执行性与结果结构。** |
84
+ | **≥ 2.0** | 本节 `data` 子命令以 **2.0+** 为准;版本不符时先升级。 |
85
+ | **配置与认证** | `lovrabet` 与 `rabetbase` 的配置项、鉴权方式可能不完全相同,按各自 CLI 文档配置。 |
86
86
  | **详细用法** | 以 `lovrabet data --help`、`lovrabet data filter --help` 为准(参数多为 `--code` + `--params` JSON)。 |
87
87
 
88
88
  示例(仅作形态参考,需本机已安装且已登录/配置):
@@ -41,19 +41,11 @@ trace/plan → 见下一节(分析任务专用)
41
41
  ### 差异读取策略(所有流程共用)
42
42
 
43
43
  ```text
44
- db detail --id <id>
45
- 读取 data.tableCount
46
-
47
- 用户明确要求实时/强制刷新:
48
- → 无论 tableCount 多少,走“刷新后读取”
49
-
50
- 用户明确要求不刷新:
51
- → 直接读取;tableCount > 200 时提示结果可能滞后
44
+ 用户明确要求不分析、不刷新或只看现有结果:
45
+ 直接读取,并说明结果可能不是最新事实
52
46
 
53
- 用户未指定:
54
- tableCount <= 200 → 直接读取
55
- tableCount > 200 → 刷新后读取
56
- tableCount 缺失 → 直接读取并说明新鲜度未知,不隐式写入
47
+ 其他情况(默认):
48
+ 无论 tableCount 多少或是否缺失,都走“刷新后读取”
57
49
 
58
50
  直接读取:
59
51
  db diff --id <id> --all --changed-only
@@ -67,7 +59,7 @@ db detail --id <id>
67
59
  → FAILED / CANCELLED 停止,不自动重提
68
60
  ```
69
61
 
70
- `tableCount <= 200` 时服务端通常实时计算默认差异视角,刷新收益很小。`tableCount > 200` 时服务端可能读取最近差异快照,刷新可以降低滞后。`db diff --view all` 是实时全部表分页,用于查看无差异表或主动重新分析已有表,不需要先刷新快照。
62
+ CLI 不再依据 `tableCount` 推断异步刷新是否值得执行。默认通过一次可跟踪的异步任务取得最新差异事实,避免小库、数量未知或服务端实现变化时沿用旧快照。`db diff --view all` 是实时全部表分页,用于查看无差异表或主动重新分析已有表;但在 DBAgent 增量分析工作流中,仍按上述默认策略先完成异步差异刷新,除非用户明确要求跳过。
71
63
 
72
64
  差异刷新与 schema 分析是两个独立任务:`diff-refresh-*` 只刷新差异事实,`analyze-*` 才把选中表同步为数据集。两类 traceId 不得混用。
73
65
 
@@ -113,7 +105,7 @@ db analyze-status --id <id> --plan <planId> # 轮询直到终态
113
105
 
114
106
  ```text
115
107
  db detail --id <id>
116
- 按“差异读取策略”刷新或直接执行 db diff --id <id> --all --changed-only
108
+ 按“差异读取策略”默认刷新后执行 db diff --id <id> --all --changed-only
117
109
  → 只取 data.toAnalyzeTables;用户要求跳过的表先从列表中剔除
118
110
  db analyze-batch-plan --id <id> --tables <toAnalyzeTables> --format compress
119
111
  → 保存 data.batches;这是本地 batch plan,不是服务端任务 plan
@@ -135,7 +127,7 @@ db analyze-batch-plan --id <id> --tables <toAnalyzeTables> --format compress
135
127
  → 未知状态:停止自动推进并报告,不猜测为终态
136
128
 
137
129
  全部批次处理完毕:
138
- 按“差异读取策略”刷新或直接执行 db diff --id <id> --all --changed-only
130
+ 按“差异读取策略”默认刷新后执行 db diff --id <id> --all --changed-only
139
131
  → 重新读取完整事实;目标差异收敛后才算本轮分析完成
140
132
  → 仍未收敛则只对剩余非删除表进入下面的逐表恢复
141
133
  ```
@@ -151,7 +143,7 @@ db analyze-batch-plan --id <id> --tables <toAnalyzeTables> --format compress
151
143
  → 到达终态后才处理下一张表
152
144
 
153
145
  全部单表任务结束后:
154
- 按“差异读取策略”刷新或直接执行 db diff --id <id> --all --changed-only
146
+ 按“差异读取策略”默认刷新后执行 db diff --id <id> --all --changed-only
155
147
  → 以最终 `db diff --all --changed-only` 的 data.toAnalyzeTables 判断是否收敛
156
148
  → 已尝试的剩余表只恢复一次,不再次循环提交
157
149
  ```
@@ -13,12 +13,7 @@
13
13
 
14
14
  ## 平台入口
15
15
 
16
- 先按当前 `rabetbase` 环境计算 `<appBaseUrl>`:
17
-
18
- ```text
19
- production https://app.lovrabet.com/app/<appCode>
20
- daily https://daily.lovrabet.com/web-app/app/<appCode>
21
- ```
16
+ 优先使用命令返回的页面链接。需要手工拼接时,从当前生效的 `appDomain` 得到 `<appBaseUrl>`,不要硬编码官方域名;独立部署和不同 region 的入口可能不同。
22
17
 
23
18
  总入口:
24
19
 
@@ -0,0 +1,146 @@
1
+ # SDK 客户端代码生成(api.ts / client.ts)
2
+
3
+ > 目标:根据 `rabetbase api pull` 返回的数据集事实,生成或更新浏览器子应用的 `src/api/api.ts` 与 `src/api/client.ts`,并保留项目已有的自定义写法。
4
+ >
5
+ > CLI 不再每次覆盖 TypeScript。`api pull` 只保证:刷新 `sdk-config.ts`、返回 `data.models`,并在文件缺失时写入 Cookie-first 脚手架。已有文件由本指南更新。
6
+
7
+ ## 何时执行
8
+
9
+ 出现以下任一情况时,先读本指南再改 `src/api/`:
10
+
11
+ - 刚执行 `rabetbase api pull` 或 `rabetbase project create`(带 appCode)
12
+ - 平台增删了 Dataset,本地 `models` 过期
13
+ - `api.ts` / `client.ts` 缺失、空 `models: []`、或 `LOVRABET_APP_CODE` 仍是 `NOT-SET`
14
+ - 用户要求修复 SDK 客户端初始化
15
+
16
+ 不要凭空编造 `datasetCode`。不要把本指南里的浏览器 Cookie 客户端写成服务端 `accessKey` 客户端。
17
+
18
+ ## 工作流
19
+
20
+ ```
21
+ rabetbase api pull --format compress
22
+ → 读 data.models / data.configName / data.isDefaultConfig / data.files / data.needsAgentMerge
23
+ → 读已有 api.ts、client.ts、sdk-config.ts(含 {prefix}-api.ts / {prefix}-client.ts)
24
+ → 按事实更新 models,保留本地 extras
25
+ → 不要改已经正确的 createClient({ apiConfigName, ...LOVRABET_SDK_CONFIG })
26
+ ```
27
+
28
+ 1. 执行 `rabetbase api pull --format compress`(需要人类可读缩进时用 `--format json`)。
29
+ 2. 使用返回的 `data.models`,不要手写或猜测 `datasetCode`。也可用 `rabetbase api list --format compress` 核对目录,但写文件以 pull 的 `data.models` 为准。
30
+ 3. 先读现有文件再写:
31
+ - 默认单应用:`src/api/api.ts`、`src/api/client.ts`、`src/api/sdk-config.ts`
32
+ - 多应用非 default:`{name}-api.ts` / `{name}-client.ts`(`data.files.api.path` / `data.files.client.path`)
33
+ 4. `sdk-config.ts` 由 CLI 维护(`data.files.sdkConfig.action === "refreshed"`),不要往里面写 `cookie` / `accessKey` / `token`。
34
+ 5. 看 `data.needsAgentMerge` 和 `data.files.*.action`,**不要**用已删除的 `wroteScaffold`:
35
+ - `needsAgentMerge === false` 且 `api`/`client` 均为 `created` 或 `overwritten`:脚手架已按当前 `models` 写好,只需检查项目 extras。
36
+ - `needsAgentMerge === true`:至少有一个 TypeScript 文件被 **preserved**。即使 `client` 刚 `created`,过期的 `api.ts` 仍要按下方规则合并,**不要**当成脚手架已完成。
37
+ 6. 默认应用:`data.isDefaultConfig === true`,`data.configName === "default"`,代码里用 `CONFIG_NAMES.DEFAULT`。
38
+ 7. 具名应用:`data.isDefaultConfig === false`,`data.configName` 是不含引号的名字(如 `order`),`registerModels(..., "order")` 与 `apiConfigName: "order"`。不要把 `configName` 再包一层引号。
39
+
40
+ ## 权威结构
41
+
42
+ 浏览器子应用的权威形态与 `templates/projects/sub-app-react-demo/src/api/` 一致。脚手架模板是 `templates/generate-api/*.tpl`,生成结果应对齐 demo,而不是另造一套。
43
+
44
+ ### sdk-config.ts(路由,无凭证)
45
+
46
+ ```typescript
47
+ /**
48
+ * Lovrabet SDK runtime routing.
49
+ * Generated by Rabetbase CLI. Do not add credentials to this file.
50
+ */
51
+ export const LOVRABET_SDK_CONFIG = {} as const;
52
+ ```
53
+
54
+ CLI 可能写入 `region: "id"` 或 `runtimeDomain: "https://…"`。不要手改成认证字段。
55
+
56
+ ### api.ts
57
+
58
+ ```typescript
59
+ import { registerModels, CONFIG_NAMES, type ModelsConfig } from "@lovrabet/sdk";
60
+
61
+ export const LOVRABET_APP_CODE = "app-xxxxxxxx";
62
+
63
+ export const LOVRABET_MODELS_CONFIG: ModelsConfig = {
64
+ appCode: LOVRABET_APP_CODE,
65
+ models: [
66
+ { datasetCode: "abc123", tableName: "orders", name: "订单", alias: "orders" },
67
+ ],
68
+ } as const;
69
+
70
+ registerModels(LOVRABET_MODELS_CONFIG, CONFIG_NAMES.DEFAULT);
71
+ ```
72
+
73
+ - 默认应用:`data.isDefaultConfig` 为 true 时用 `CONFIG_NAMES.DEFAULT`。
74
+ - 非默认 / 具名应用:用 `data.configName`(不含引号的字符串,如 `order`)作为 `registerModels` 第二参数和 `apiConfigName`,不要再 import 未使用的 `CONFIG_NAMES`。
75
+ - 数字开头的文件前缀使用 `APP_` 变量前缀(如 `APP_5B732428_APP_CODE`),运行时 `appCode` 保持原值。
76
+ - `registerModels` 是 `@lovrabet/sdk` 的独立命名导出,**不是** `client.registerModels()`。
77
+
78
+ ### client.ts(Cookie-first)
79
+
80
+ ```typescript
81
+ import { createClient, CONFIG_NAMES } from "@lovrabet/sdk";
82
+ import "./api";
83
+ import { LOVRABET_SDK_CONFIG } from "./sdk-config";
84
+
85
+ export const lovrabetClient = createClient({
86
+ apiConfigName: CONFIG_NAMES.DEFAULT,
87
+ ...LOVRABET_SDK_CONFIG,
88
+ });
89
+ ```
90
+
91
+ - 必须 `import "./api"`(或 `./{prefix}-api`)以执行 `registerModels`。
92
+ - 浏览器子应用默认登录态 Cookie:省略 `authMode`,**不要**在此文件写入 `accessKey` / `token`。
93
+ - 已有 `createClient({ apiConfigName, ...LOVRABET_SDK_CONFIG })` 且与 `data.isDefaultConfig` / `data.configName` 一致时,不要改参数形态。
94
+ - 非生产环境脚手架可能带 `env: "daily"`;已有客户端已能工作则不要为了对称去改。
95
+
96
+ ## 合并规则
97
+
98
+ 以 `data.models` 为 Dataset 清单的唯一事实来源:
99
+
100
+ - **新增**:pull 有、本地没有的 `datasetCode`,追加到 `models`
101
+ - **删除**:本地有、pull 没有的 `datasetCode`,从 `models` 移除
102
+ - **更新**:同一 `datasetCode` 的 `tableName` / `name` 以 pull 为准
103
+ - **别名**:本地已有且仍对应同一 `datasetCode` 的 `alias` 保留;新建项使用 pull 给出的 `alias`
104
+ - **保留 extras**:额外的 `registerModels(...)`、额外 client 导出、项目自定义注释(非 Generated 头)不要删
105
+ - **多应用**:继续使用 CLI 的 `{name}-api.ts` / `{name}-client.ts` 命名,不要把多个 app 的 models 揉进同一个 `api.ts`
106
+
107
+ ## 认证(不要写进浏览器 client.ts)
108
+
109
+ 浏览器子应用走 Cookie,本指南的默认 `client.ts` 不声明 `authMode`。
110
+
111
+ 仅当用户明确要求**服务端**文件时才使用密钥,且必须显式 `authMode`:
112
+
113
+ - 仅 `accessKey` → `authMode: "client-ak"`,且只放服务端
114
+ - `accessKey`(+ 可选 `secretKey`)签名,或预计算 `token` + 配对 `timestamp` → `authMode: "openapi"`
115
+ - 预计算 token 必须同时提供 `timestamp`,否则首次请求报 `timestamp is required`
116
+ - OpenAPI 凭据通过 `X-Token` / `X-Time-Stamp` 传递,不是 `Authorization: Bearer`
117
+
118
+ 服务端写法详见 [`typescript-sdk.md`](typescript-sdk.md)。
119
+
120
+ ## 禁止
121
+
122
+ - `client.registerModels(...)`
123
+ - 把 `filter()` 返回值当数组:必须 `result.tableData`
124
+ - `result.total`:总数是 `result.paging.totalCount`
125
+ - `client.models.dataset_[code]`:动态访问用 `client.models[\`dataset_${code}\`]`
126
+ - 传了 `accessKey` / `token` 却省略 `authMode`
127
+ - 把 Cookie / AccessKey 写进 `sdk-config.ts` 或浏览器 `client.ts`
128
+ - 在已有正确 `createClient` 形态上改成另一种参数风格
129
+
130
+ ## pull 输出字段
131
+
132
+ `rabetbase api pull --format compress` 的 `data`(单应用):
133
+
134
+ | 字段 | 含义 |
135
+ |------|------|
136
+ | `appCode` | 当前应用 |
137
+ | `configName` | `"default"` 或具名应用名(不含 TS 引号) |
138
+ | `isDefaultConfig` | 默认应用为 `true` |
139
+ | `models[]` | `datasetCode` / `tableName` / `name` / `alias` |
140
+ | `sdkRouting` | `{ region?: "id", runtimeDomain?: string }` |
141
+ | `files.api` / `files.client` / `files.sdkConfig` | `{ path, action }`;`action` 为 `created` / `overwritten` / `preserved` / `refreshed` |
142
+ | `needsAgentMerge` | 任一 TypeScript 被 `preserved` 时为 `true`,必须合并 `models` |
143
+ | `apiFilePath` / `clientFilePath` / `sdkConfigPath` | 与 `files.*.path` 相同,兼容路径字段 |
144
+ | `modelCount` / `datasetCount` | 模型数量 |
145
+
146
+ 多应用时 `data.apps[]` 为上述对象的数组。
@@ -6,7 +6,7 @@
6
6
 
7
7
  平台是唯一 source of truth。团队长期维护 SQL 时,优先使用 **本地同步工作流**:`sql create / pull / status / push / delete` + `.rabetbase/sql.lock.json`。
8
8
 
9
- SQL 内容编写、参数绑定与 MyBatis 语法以 [`sql-mybatis.md`](sql-mybatis.md) 为准。页面和 Backend Function 执行已发布的 Custom SQL 时使用 `sqlCode` + `params`。
9
+ SQL 内容编写、参数绑定与 MyBatis 语法以 [`sql-mybatis.md`](sql-mybatis.md) 为准。页面执行已发布的 Custom SQL 时使用 `sqlCode` + `params`;Backend Function 默认使用 `context.client.sql.byName(sqlName).execute({ params })`,`sql.execute({ sqlCode, params })` 仅作兼容路径。
10
10
 
11
11
  ## 工作流
12
12
 
@@ -54,7 +54,7 @@
54
54
 
55
55
  * ❌ 错误排查方向:建议用户重装各种库
56
56
  * ✅ **强制动作**:
57
- * 建议用户检查 `.lovrabetrc`(或其他配置)中的 `appcode` 是否正确
57
+ * 建议用户检查 `.rabetbase.json` 中的 `appcode` 是否正确
58
58
  * 建议用户在终端执行 `rabetbase auth` 检查是否未登录或 Cookie 过期
59
59
  * 帮用户执行 `rabetbase dataset list --format json` 确认该环境到底有哪些可用数据集
60
60
 
@@ -16,6 +16,8 @@
16
16
 
17
17
  不要把本指南里的 `createClient`、`registerModels` 等前端 / Node SDK 初始化能力套用到 Backend Function。Backend Function 内只使用平台注入的 `context.client`。
18
18
 
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
+
19
21
  ## 初始化规则
20
22
 
21
23
  必须使用 `createClient` 命名导出,禁止使用 `new LovrabetClient()`:
@@ -25,6 +27,7 @@ import { createClient } from "@lovrabet/sdk";
25
27
 
26
28
  const client = createClient({
27
29
  appCode: "your-app-code",
30
+ authMode: "client-ak", // 必须显式声明;否则一律走 cookie 模式,accessKey 会被忽略
28
31
  accessKey: process.env.RABETBASE_ACCESS_KEY, // 仅在服务端使用
29
32
  models: [
30
33
  { tableName: "users", datasetCode: "39f758e7b38c476b8bb3996771a601a1", alias: "users" }
@@ -32,6 +35,12 @@ const client = createClient({
32
35
  });
33
36
  ```
34
37
 
38
+ 认证模式必须显式声明,不会按字段自动推断:
39
+
40
+ * 仅 `accessKey` → `authMode: "client-ak"`
41
+ * `accessKey`(+可选 `secretKey`)签名,或已配对的预计算 `token` + `timestamp` → `authMode: "openapi"`(凭据通过 `X-Token` / `X-Time-Stamp` 请求头传递,不是 Authorization Bearer;用 `token` 时必须同时提供配对的 `timestamp`,否则首次请求报 `timestamp is required`)
42
+ * 浏览器 Cookie 环境 → 省略 `authMode`(默认 cookie)
43
+
35
44
  ## 1. 模型查询 (Filter API)
36
45
 
37
46
  这是操作模型(表)的**最高优** API。
@@ -47,7 +56,7 @@ const client = createClient({
47
56
  * ❌ `where: { status: 'active' }`
48
57
  * ✅ `where: { status: { $eq: 'active' } }`
49
58
 
50
- 支持的操作符:`$eq`, `$ne`, `$gte`, `$lte`, `$gt`, `$lt`, `$contain`, `$startWith`, `$endWith`, `$in`。
59
+ 支持的操作符:`$eq`, `$ne`, `$gt`, `$lt`, `$gte`(或兼容旧写法 `$gteq`), `$lte`(或兼容旧写法 `$lteq`), `$contain`, `$startWith`, `$endWith`, `$in`, `$notNull`。`$gteq` / `$lteq` 是后端保留的别名,与 `$gte` / `$lte` 映射到同一 SQL 比较,新代码推荐用 `$gte` / `$lte`。
51
60
 
52
61
  逻辑组合:
53
62
  ```typescript
@@ -80,7 +89,7 @@ const result = await client.models.article.filter({
80
89
 
81
90
  **接口**:
82
91
  ```typescript
83
- client.models.dataset_[code].update({
92
+ client.models[`dataset_${code}`].update({
84
93
  id: number | string | (number | string)[]; [key: string]: any
85
94
  })
86
95
  ```
@@ -108,7 +117,7 @@ await client.models.customer.update({
108
117
 
109
118
  **接口**:
110
119
  ```typescript
111
- client.models.dataset_[code].delete({ id: number | string | (number | string)[] })
120
+ client.models[`dataset_${code}`].delete({ id: number | string | (number | string)[] })
112
121
  ```
113
122
 
114
123
  **示例**:
@@ -122,8 +131,9 @@ const inactiveUsers = await client.models.customer.filter({
122
131
  select: ['id']
123
132
  });
124
133
 
134
+ // filter() 返回 ListResponse({ tableData, paging, tableColumns }),列表数据在 tableData
125
135
  await client.models.customer.delete({
126
- id: inactiveUsers.map(u => u.id)
136
+ id: inactiveUsers.tableData.map(u => u.id)
127
137
  });
128
138
  ```
129
139
 
@@ -148,17 +158,43 @@ async function updateInBatches(ids: number[], batchSize = 1000) {
148
158
 
149
159
  ### 别名模式(Alias Pattern)
150
160
 
151
- 如果在前端 / Node SDK 中使用 `registerModels` 定义了别名,批量操作同样支持。此能力不适用于 Backend Function 的 `context.client`。
161
+ 在前端 / Node SDK 中给数据集配置 `alias` 后,可用别名访问模型,批量操作同样支持。此能力不适用于 Backend Function 的 `context.client`。
162
+
163
+ 别名在初始化时配置,最常见的是直接写进 `createClient` 的 `models`:
152
164
 
153
165
  ```typescript
154
- // 注册别名
155
- client.registerModels({
156
- primary: 'dataset_abc123',
157
- detail: 'dataset_def456'
166
+ import { createClient } from "@lovrabet/sdk";
167
+
168
+ const client = createClient({
169
+ appCode: "your-app-code",
170
+ models: [
171
+ { tableName: "orders", datasetCode: "abc123", alias: "primary" },
172
+ { tableName: "order_items", datasetCode: "def456", alias: "detail" },
173
+ ],
158
174
  });
159
175
 
160
176
  // 使用别名批量操作
161
- await client.models.primary.update({ id: [1, 2, 3], status: 'active' });
177
+ await client.models.primary.update({ id: [1, 2, 3], status: "active" });
178
+ ```
179
+
180
+ `registerModels` 是 `@lovrabet/sdk` 的独立命名导出(不是 client 实例方法),用于把一份完整 `ModelsConfig`(`{ appCode, models }`)注册到全局配置表,再由 `createClient` 按配置名引用(CLI 生成的 `src/api/*.ts` 就是这样自动注册的):
181
+
182
+ ```typescript
183
+ import { createClient, registerModels } from "@lovrabet/sdk";
184
+
185
+ registerModels(
186
+ {
187
+ appCode: "your-app-code",
188
+ models: [
189
+ { tableName: "orders", datasetCode: "abc123", alias: "primary" },
190
+ { tableName: "order_items", datasetCode: "def456", alias: "detail" },
191
+ ],
192
+ },
193
+ "prod",
194
+ );
195
+
196
+ const client = createClient("prod"); // 或 createClient({ apiConfigName: "prod", authMode: "openapi", token, timestamp, env })(用 token 时必须显式 authMode 且带配对 timestamp)
197
+ await client.models.primary.update({ id: [1, 2, 3], status: "active" });
162
198
  ```
163
199
 
164
200
  ## 2. 自定义 SQL (SQL API)
@@ -1,6 +1,6 @@
1
1
  # api list
2
2
 
3
- 列出当前 App 下已生成的所有数据集(Dataset)模型,查看 API 客户端代码中有哪些可用 Model。
3
+ 列出当前 App 下平台返回的数据集(Dataset)模型事实。本命令查询远端 Dataset 元信息,**不检查**本地是否已生成 `api.ts` / `client.ts`。
4
4
 
5
5
  ## 命令
6
6
 
@@ -23,7 +23,7 @@ rabetbase api list --format json
23
23
 
24
24
  | 参数 | 说明 |
25
25
  |------|------|
26
- | `--global` | 多应用时从「全局+项目」合并配置解析 `apps`(默认仅项目级 `apps`)。项目配置了 `inherit: false` 时见 `api pull` 文档同名词条 |
26
+ | `--global` | 多应用时显式从「全局+项目」双层解析 `apps`;默认仅项目级 `apps` |
27
27
  | `--app <name>` | 多应用模式下,指定应用名称 |
28
28
  | `--appcode <code>` | 直接指定 appcode |
29
29
  | `--format json` | JSON 格式输出(用于脚本解析) |
@@ -46,7 +46,7 @@ rabetbase api list --format json
46
46
  - **加 `--app <name>`**:仅列出指定应用的模型
47
47
  - **加 `--appcode <code>`**:反查到对应 app profile,使用其 cookie/env
48
48
 
49
- 若项目 **`inherit: false`**,`--global` 无法合并进全局 `apps`,行为与 `api pull` 一致(详见 **api pull** 文档「与 inherit: false 的关系」)。
49
+ `inherit` 不是受支持的配置项;`--global` 始终显式读取全局和项目双层 apps
50
50
 
51
51
  ## 风险等级
52
52
 
@@ -55,4 +55,4 @@ rabetbase api list --format json
55
55
  ## 前置条件
56
56
 
57
57
  - 已完成 `rabetbase auth` 登录
58
- - 已运行过 `rabetbase api pull` 生成过 API 代码(用于确认本地已有哪些模型)
58
+ - 已配置 appcode(单应用或多应用)