@lovrabet/rabetbase-cli 2.5.0 → 2.5.1-beta.2

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 (332) 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.js +1 -1
  4. package/lib/api/generate-sdk-config-file.js +1 -1
  5. package/lib/auth/auth-server-ui.js +1 -1
  6. package/lib/auth/auth-server.d.ts +7 -0
  7. package/lib/auth/auth-server.js +1 -1
  8. package/lib/auth/constant.js +1 -1
  9. package/lib/auth/get-cookie.js +1 -1
  10. package/lib/auth/get-session-user.js +1 -1
  11. package/lib/auth/is-session-valid.js +1 -1
  12. package/lib/auth/login-success-html.js +1 -1
  13. package/lib/auth/logout.js +1 -1
  14. package/lib/cli-flags.js +1 -1
  15. package/lib/cli.js +1 -1
  16. package/lib/commands/api/generate.js +1 -1
  17. package/lib/commands/api/index.js +1 -1
  18. package/lib/commands/api/list.js +1 -1
  19. package/lib/commands/api/pull.js +1 -1
  20. package/lib/commands/api/shared.js +1 -1
  21. package/lib/commands/app/index.js +1 -1
  22. package/lib/commands/app/list.js +1 -1
  23. package/lib/commands/app/members-list.js +1 -1
  24. package/lib/commands/app/remote-directory.js +1 -1
  25. package/lib/commands/app/shared.js +1 -1
  26. package/lib/commands/app-config/delete.js +1 -1
  27. package/lib/commands/app-config/get.js +1 -1
  28. package/lib/commands/app-config/index.js +1 -1
  29. package/lib/commands/app-config/list.js +1 -1
  30. package/lib/commands/app-config/set.js +1 -1
  31. package/lib/commands/app-config/shared.js +1 -1
  32. package/lib/commands/auth/index.js +1 -1
  33. package/lib/commands/bff/create.js +1 -1
  34. package/lib/commands/bff/delete.js +1 -1
  35. package/lib/commands/bff/detail.js +1 -1
  36. package/lib/commands/bff/index.js +1 -1
  37. package/lib/commands/bff/list.js +1 -1
  38. package/lib/commands/bff/pull.js +1 -1
  39. package/lib/commands/bff/push.js +1 -1
  40. package/lib/commands/bff/status.js +1 -1
  41. package/lib/commands/cli-skill/index.js +1 -1
  42. package/lib/commands/cli-update.js +1 -1
  43. package/lib/commands/codegen/index.js +1 -1
  44. package/lib/commands/codegen/sdk.js +1 -1
  45. package/lib/commands/codegen/sql.js +1 -1
  46. package/lib/commands/common/app-registry.js +1 -1
  47. package/lib/commands/common/app-selector.js +1 -1
  48. package/lib/commands/common/async-task.js +1 -1
  49. package/lib/commands/common/dry-run.js +1 -1
  50. package/lib/commands/common/flags.js +1 -1
  51. package/lib/commands/common/local-file.js +1 -1
  52. package/lib/commands/common/validate.js +1 -1
  53. package/lib/commands/config/delete.js +1 -1
  54. package/lib/commands/config/get.js +1 -1
  55. package/lib/commands/config/index.js +1 -1
  56. package/lib/commands/config/init.d.ts +1 -1
  57. package/lib/commands/config/init.js +1 -1
  58. package/lib/commands/config/list.js +1 -1
  59. package/lib/commands/config/set.js +1 -1
  60. package/lib/commands/config/shared.js +1 -1
  61. package/lib/commands/dataset/business-group-update.js +1 -1
  62. package/lib/commands/dataset/business-groups.js +1 -1
  63. package/lib/commands/dataset/capability.js +1 -1
  64. package/lib/commands/dataset/delete.js +1 -1
  65. package/lib/commands/dataset/detail.js +1 -1
  66. package/lib/commands/dataset/extend-update.js +1 -1
  67. package/lib/commands/dataset/field-restore.d.ts +107 -0
  68. package/lib/commands/dataset/field-restore.js +1 -0
  69. package/lib/commands/dataset/field-update.js +1 -1
  70. package/lib/commands/dataset/generate.js +1 -1
  71. package/lib/commands/dataset/index.js +1 -1
  72. package/lib/commands/dataset/list.js +1 -1
  73. package/lib/commands/dataset/operations.js +1 -1
  74. package/lib/commands/dataset/relation-audit.js +1 -1
  75. package/lib/commands/dataset/relation-create.js +1 -1
  76. package/lib/commands/dataset/relation-delete.js +1 -1
  77. package/lib/commands/dataset/relation-shared.js +1 -1
  78. package/lib/commands/dataset/relation-update.js +1 -1
  79. package/lib/commands/dataset/relations.js +1 -1
  80. package/lib/commands/dataset/rename.js +1 -1
  81. package/lib/commands/dataset/restore.js +1 -1
  82. package/lib/commands/dataset/user-deleted-field-list.d.ts +36 -0
  83. package/lib/commands/dataset/user-deleted-field-list.js +1 -0
  84. package/lib/commands/db/analysis-batching.js +1 -1
  85. package/lib/commands/db/analyze-batch-plan.js +1 -1
  86. package/lib/commands/db/analyze-cancel.js +1 -1
  87. package/lib/commands/db/analyze-start.js +1 -1
  88. package/lib/commands/db/analyze-status.js +1 -1
  89. package/lib/commands/db/create.js +1 -1
  90. package/lib/commands/db/delete.js +1 -1
  91. package/lib/commands/db/detail.js +1 -1
  92. package/lib/commands/db/diff-refresh-start.js +1 -1
  93. package/lib/commands/db/diff-refresh-status.js +1 -1
  94. package/lib/commands/db/diff.js +1 -1
  95. package/lib/commands/db/index.js +1 -1
  96. package/lib/commands/db/list.js +1 -1
  97. package/lib/commands/db/shared.js +1 -1
  98. package/lib/commands/db/table-diff-shared.js +1 -1
  99. package/lib/commands/db/tables.js +1 -1
  100. package/lib/commands/db/test.js +1 -1
  101. package/lib/commands/db/update.js +1 -1
  102. package/lib/commands/deployment/auto-sync.d.ts +28 -0
  103. package/lib/commands/deployment/auto-sync.js +1 -0
  104. package/lib/commands/deployment/index.d.ts +2 -0
  105. package/lib/commands/deployment/index.js +1 -0
  106. package/lib/commands/deployment/sync.d.ts +2 -0
  107. package/lib/commands/deployment/sync.js +1 -0
  108. package/lib/commands/doctor.js +1 -1
  109. package/lib/commands/file/index.js +1 -1
  110. package/lib/commands/issue/index.js +1 -1
  111. package/lib/commands/issue/nudge.js +1 -1
  112. package/lib/commands/issue/report.js +1 -1
  113. package/lib/commands/issue/shared.js +1 -1
  114. package/lib/commands/kb/create.js +1 -1
  115. package/lib/commands/kb/delete.js +1 -1
  116. package/lib/commands/kb/detail.js +1 -1
  117. package/lib/commands/kb/index.js +1 -1
  118. package/lib/commands/kb/list.js +1 -1
  119. package/lib/commands/kb/search.js +1 -1
  120. package/lib/commands/kb/shared.js +1 -1
  121. package/lib/commands/kb/update.js +1 -1
  122. package/lib/commands/logs/index.js +1 -1
  123. package/lib/commands/menu/asset-update.js +1 -1
  124. package/lib/commands/menu/delete.js +1 -1
  125. package/lib/commands/menu/external-link-create.js +1 -1
  126. package/lib/commands/menu/external-link-update.js +1 -1
  127. package/lib/commands/menu/group-create.js +1 -1
  128. package/lib/commands/menu/group-update.js +1 -1
  129. package/lib/commands/menu/index.js +1 -1
  130. package/lib/commands/menu/list.js +1 -1
  131. package/lib/commands/menu/move.js +1 -1
  132. package/lib/commands/menu/regroup-start.js +1 -1
  133. package/lib/commands/menu/rename.js +1 -1
  134. package/lib/commands/menu/shared/compare-table.js +1 -1
  135. package/lib/commands/menu/shared/delete-plan.js +1 -1
  136. package/lib/commands/menu/shared/facts.js +1 -1
  137. package/lib/commands/menu/shared/index.js +1 -1
  138. package/lib/commands/menu/shared/inquirer.js +1 -1
  139. package/lib/commands/menu/shared/local-pages.js +1 -1
  140. package/lib/commands/menu/shared/logic.js +1 -1
  141. package/lib/commands/menu/shared/mutations.js +1 -1
  142. package/lib/commands/menu/shared/service.js +1 -1
  143. package/lib/commands/menu/shared/sync-core.js +1 -1
  144. package/lib/commands/menu/shared/update-core.js +1 -1
  145. package/lib/commands/menu/shared/valid-url.js +1 -1
  146. package/lib/commands/menu/sync.js +1 -1
  147. package/lib/commands/menu/visibility-update.js +1 -1
  148. package/lib/commands/notification/config-create.js +1 -1
  149. package/lib/commands/notification/config-delete.js +1 -1
  150. package/lib/commands/notification/config-list.js +1 -1
  151. package/lib/commands/notification/config-update.js +1 -1
  152. package/lib/commands/notification/index.js +1 -1
  153. package/lib/commands/notification/shared.js +1 -1
  154. package/lib/commands/ocr/index.js +1 -1
  155. package/lib/commands/page/create.js +1 -1
  156. package/lib/commands/page/custom/detail.js +1 -1
  157. package/lib/commands/page/custom/list.js +1 -1
  158. package/lib/commands/page/custom/publish.js +1 -1
  159. package/lib/commands/page/custom/shared.js +1 -1
  160. package/lib/commands/page/custom/syntax.js +1 -1
  161. package/lib/commands/page/custom/template.js +1 -1
  162. package/lib/commands/page/custom/update.js +1 -1
  163. package/lib/commands/page/data-list-status.js +1 -1
  164. package/lib/commands/page/generate-start.js +1 -1
  165. package/lib/commands/page/generate-status.js +1 -1
  166. package/lib/commands/page/index.js +1 -1
  167. package/lib/commands/page/pull.js +1 -1
  168. package/lib/commands/page/push.js +1 -1
  169. package/lib/commands/page/relation-audit.js +1 -1
  170. package/lib/commands/page/restore.js +1 -1
  171. package/lib/commands/page/shared.js +1 -1
  172. package/lib/commands/page/sync.js +1 -1
  173. package/lib/commands/project/create/enhanced-guided-create.js +1 -1
  174. package/lib/commands/project/create/format-elapsed.js +1 -1
  175. package/lib/commands/project/create/main.js +1 -1
  176. package/lib/commands/project/create/materialize-project-template.js +1 -1
  177. package/lib/commands/project/create/project-name.js +1 -1
  178. package/lib/commands/project/create/project-template-archive.js +1 -1
  179. package/lib/commands/project/create/project-template-path.js +1 -1
  180. package/lib/commands/project/create/use-copy-project-template.js +1 -1
  181. package/lib/commands/project/create/use-format-code.js +1 -1
  182. package/lib/commands/project/create/use-install-dependencies.js +1 -1
  183. package/lib/commands/project/index.js +1 -1
  184. package/lib/commands/project/upgrade.js +1 -1
  185. package/lib/commands/registry.js +1 -1
  186. package/lib/commands/role/delete.js +1 -1
  187. package/lib/commands/role/detail.js +1 -1
  188. package/lib/commands/role/index.js +1 -1
  189. package/lib/commands/role/list.js +1 -1
  190. package/lib/commands/role/shared.js +1 -1
  191. package/lib/commands/role/update.js +1 -1
  192. package/lib/commands/role/user-add.js +1 -1
  193. package/lib/commands/role/user-remove.js +1 -1
  194. package/lib/commands/role/user-resolve.js +1 -1
  195. package/lib/commands/run/index.js +1 -1
  196. package/lib/commands/schema.js +1 -1
  197. package/lib/commands/sql/create.js +1 -1
  198. package/lib/commands/sql/delete.js +1 -1
  199. package/lib/commands/sql/detail.js +1 -1
  200. package/lib/commands/sql/exec.js +1 -1
  201. package/lib/commands/sql/index.js +1 -1
  202. package/lib/commands/sql/list.js +1 -1
  203. package/lib/commands/sql/pull.js +1 -1
  204. package/lib/commands/sql/push.js +1 -1
  205. package/lib/commands/sql/shared.js +1 -1
  206. package/lib/commands/sql/status.js +1 -1
  207. package/lib/commands/sql/validate.js +1 -1
  208. package/lib/commands/task/index.js +1 -1
  209. package/lib/commands/task/status.js +1 -1
  210. package/lib/commands/tenant/index.js +1 -1
  211. package/lib/commands/tenant/members-list.js +1 -1
  212. package/lib/commands/tenant/shared.js +1 -1
  213. package/lib/commands/user-account/dingding-sandbox-bind.js +1 -1
  214. package/lib/commands/user-account/index.js +1 -1
  215. package/lib/commands/workspace/add.js +1 -1
  216. package/lib/commands/workspace/index.js +1 -1
  217. package/lib/commands/workspace/remove.js +1 -1
  218. package/lib/config/deployment-sync.d.ts +10 -0
  219. package/lib/config/deployment-sync.js +1 -0
  220. package/lib/config/domain-config.d.ts +1 -1
  221. package/lib/config/domain-config.js +1 -1
  222. package/lib/config/project-routing.d.ts +30 -0
  223. package/lib/config/project-routing.js +1 -0
  224. package/lib/config/schema.d.ts +1 -1
  225. package/lib/config/schema.js +1 -1
  226. package/lib/constant/cdn.js +1 -1
  227. package/lib/constant/cli.js +1 -1
  228. package/lib/constant/defaults.js +1 -1
  229. package/lib/constant/domain.d.ts +7 -2
  230. package/lib/constant/domain.js +1 -1
  231. package/lib/constant/env.js +1 -1
  232. package/lib/constant/output.js +1 -1
  233. package/lib/constant/paths.js +1 -1
  234. package/lib/constant/region.d.ts +2 -2
  235. package/lib/constant/region.js +1 -1
  236. package/lib/constant/risk.js +1 -1
  237. package/lib/constant/routing-profile.d.ts +115 -0
  238. package/lib/constant/routing-profile.js +1 -0
  239. package/lib/context/app-resolver.d.ts +2 -0
  240. package/lib/context/app-resolver.js +1 -1
  241. package/lib/context/auth-resolver.js +1 -1
  242. package/lib/context/config-loader.js +1 -1
  243. package/lib/context.js +1 -1
  244. package/lib/core/alias-resolver.js +1 -1
  245. package/lib/core/api-client.d.ts +35 -0
  246. package/lib/core/api-client.js +1 -1
  247. package/lib/core/bff/config.js +1 -1
  248. package/lib/core/bff/file-system.js +1 -1
  249. package/lib/core/bff/hash.js +1 -1
  250. package/lib/core/bff/lock.js +1 -1
  251. package/lib/core/bff/utils.js +1 -1
  252. package/lib/core/db-resolver.js +1 -1
  253. package/lib/core/page/file-system.js +1 -1
  254. package/lib/core/page/hash.js +1 -1
  255. package/lib/core/page/lock.js +1 -1
  256. package/lib/core/sql-index-auditor.js +1 -1
  257. package/lib/core/sql-sync/config.js +1 -1
  258. package/lib/core/sql-sync/file-system.js +1 -1
  259. package/lib/core/sql-sync/hash.js +1 -1
  260. package/lib/core/sql-sync/lock.js +1 -1
  261. package/lib/core/sql-sync/utils.js +1 -1
  262. package/lib/core/sql-validator.js +1 -1
  263. package/lib/errors.js +1 -1
  264. package/lib/framework/build-all-flags.js +1 -1
  265. package/lib/framework/error-output.js +1 -1
  266. package/lib/framework/explicit-yes.js +1 -1
  267. package/lib/framework/flags.js +1 -1
  268. package/lib/framework/help.js +1 -1
  269. package/lib/framework/index.js +1 -1
  270. package/lib/framework/output.js +1 -1
  271. package/lib/framework/response.js +1 -1
  272. package/lib/framework/runner-alias.js +1 -1
  273. package/lib/framework/runner.js +1 -1
  274. package/lib/framework/schema-export.js +1 -1
  275. package/lib/framework/types.d.ts +4 -0
  276. package/lib/framework/types.js +1 -1
  277. package/lib/generated/build-info.d.ts +4 -4
  278. package/lib/generated/build-info.js +1 -1
  279. package/lib/help.js +1 -1
  280. package/lib/postinstall.js +1 -1
  281. package/lib/runtime/confirmation.js +1 -1
  282. package/lib/runtime/event.js +1 -1
  283. package/lib/runtime/index.js +1 -1
  284. package/lib/runtime/queue.js +1 -1
  285. package/lib/runtime/resolve.js +1 -1
  286. package/lib/skills/builtin-skill.js +1 -1
  287. package/lib/skills/main.js +1 -1
  288. package/lib/skills/npx-skills-add.js +1 -1
  289. package/lib/skills/skill-presence.js +1 -1
  290. package/lib/telemetry/cli-command-trace.js +1 -1
  291. package/lib/telemetry/cli-help-trace.js +1 -1
  292. package/lib/telemetry/ensure-cli-otel-config.js +1 -1
  293. package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
  294. package/lib/telemetry/send-cli-trace-log.js +1 -1
  295. package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
  296. package/lib/utils/ai_config.js +1 -1
  297. package/lib/utils/apply-jq-filter.js +1 -1
  298. package/lib/utils/cdn-config.js +1 -1
  299. package/lib/utils/check-sdk-version.js +1 -1
  300. package/lib/utils/cli-version-check.js +1 -1
  301. package/lib/utils/cli-version-policy.js +1 -1
  302. package/lib/utils/config.js +1 -1
  303. package/lib/utils/entity-with-id.js +1 -1
  304. package/lib/utils/file-utils.js +1 -1
  305. package/lib/utils/guides-cdn.js +1 -1
  306. package/lib/utils/http-client.js +1 -1
  307. package/lib/utils/is-non-interactive.js +1 -1
  308. package/lib/utils/logger.js +1 -1
  309. package/lib/utils/params.js +1 -1
  310. package/lib/utils/platform.js +1 -1
  311. package/lib/utils/sleep.js +1 -1
  312. package/lib/utils/template-replacer.js +1 -1
  313. package/lib/utils/update-notice.js +1 -1
  314. package/lib/utils/version.js +1 -1
  315. package/lib/utils/with-active-cookie.js +1 -1
  316. package/lib/utils/write-cli-side-channel.js +1 -1
  317. package/package.json +1 -2
  318. package/skills/rabetbase/SKILL.md +20 -9
  319. package/skills/rabetbase/guides/frontend-development.md +2 -0
  320. package/skills/rabetbase/guides/sdk-client-generation.md +3 -2
  321. package/skills/rabetbase/guides/typescript-sdk.md +42 -0
  322. package/skills/rabetbase/references/rabetbase-api-pull.md +5 -3
  323. package/skills/rabetbase/references/rabetbase-config.md +9 -5
  324. package/skills/rabetbase/references/rabetbase-dataset-business-group-update.md +9 -9
  325. package/skills/rabetbase/references/rabetbase-dataset-business-groups.md +1 -1
  326. package/skills/rabetbase/references/rabetbase-dataset-field-restore.md +59 -0
  327. package/skills/rabetbase/references/rabetbase-dataset-user-deleted-field-list.md +47 -0
  328. package/skills/rabetbase/references/rabetbase-deployment-sync.md +92 -0
  329. package/skills/rabetbase/references/rabetbase-init.md +11 -5
  330. package/skills/rabetbase/references/rabetbase-project-create.md +6 -5
  331. package/skills/rabetbase.manifest.json +6 -3
  332. package/templates/README.md +13 -17
@@ -1 +1 @@
1
- function a292_0x4810(_0xd278e,_0x5e0182){_0xd278e=_0xd278e-0x1e7;const _0x350c4f=a292_0x350c();let _0x481010=_0x350c4f[_0xd278e];return _0x481010;}(function(_0x218a07,_0x449547){const _0xb85576=a292_0x4810,_0x5e0d2f=_0x218a07();while(!![]){try{const _0x63281=-parseInt(_0xb85576(0x1f2))/0x1+parseInt(_0xb85576(0x203))/0x2*(-parseInt(_0xb85576(0x1fa))/0x3)+-parseInt(_0xb85576(0x1e8))/0x4*(-parseInt(_0xb85576(0x201))/0x5)+parseInt(_0xb85576(0x1f8))/0x6*(parseInt(_0xb85576(0x1fe))/0x7)+-parseInt(_0xb85576(0x200))/0x8+-parseInt(_0xb85576(0x1fb))/0x9+parseInt(_0xb85576(0x1f5))/0xa*(parseInt(_0xb85576(0x1ef))/0xb);if(_0x63281===_0x449547)break;else _0x5e0d2f['push'](_0x5e0d2f['shift']());}catch(_0xfafb86){_0x5e0d2f['push'](_0x5e0d2f['shift']());}}}(a292_0x350c,0xe0e4a));import{mkdir,readFile,writeFile}from'node:fs/promises';import{homedir}from'node:os';import{dirname,join}from'node:path';import a292_0x58661a from'semver';import{CLI_BIN_NAME,NPM_PACKAGE_NAME}from'../constant/cli.js';import{getCliVersionPolicy}from'../utils/cli-version-policy.js';import{getCliVersion}from'../utils/version.js';const UPDATE_CHECK_TTL_MS=0xc*0x3c*0x3c*0x3e8,UPDATE_NOTICE_TTL_MS=0x18*0x3c*0x3c*0x3e8;function isUpdateNoticeDisabled(){const _0x1aa10c=a292_0x4810,_0x2fad3c=process.env.RABETBASE_NO_UPDATE_NOTICE?.[_0x1aa10c(0x1ed)]()['toLowerCase']();return _0x2fad3c==='1'||_0x2fad3c===_0x1aa10c(0x1fc)||_0x2fad3c==='yes';}function cacheRoot(){const _0xf8b3cf=a292_0x4810;return process.env.XDG_CACHE_HOME||process.env.LOCALAPPDATA||join(homedir(),_0xf8b3cf(0x1f4));}export function getUpdateNoticeCachePath(){const _0x27822f=a292_0x4810;return join(cacheRoot(),_0x27822f(0x1f9),_0x27822f(0x1f6));}async function readUpdateNoticeCache(){const _0x5b0683=a292_0x4810;try{const _0x4e5b21=await readFile(getUpdateNoticeCachePath(),'utf8'),_0x4c023f=JSON[_0x5b0683(0x1ea)](_0x4e5b21);if(!_0x4c023f||typeof _0x4c023f!==_0x5b0683(0x1f7))return{};return _0x4c023f;}catch{return{};}}async function writeUpdateNoticeCache(_0x440723){const _0x185da1=a292_0x4810;try{const _0x51f0d4=getUpdateNoticeCachePath();await mkdir(dirname(_0x51f0d4),{'recursive':!![]}),await writeFile(_0x51f0d4,JSON['stringify'](_0x440723,null,0x2)+'\x0a',_0x185da1(0x1eb));}catch{}}function a292_0x350c(){const _0x534524=['stableVersion','14589751RgHABx','now','lastNotifiedVersion','1033897xeQeUs',',\x20run:\x20','.cache','20xXNyqj','update-check.json','object','24QvbJuO','rabetbase-cli','3IkjLHO','2351223kgmseJ','true','lastNotifiedAt','1252916OMSzdn','\x20update','10741112OaToZm','2922095GYEHbR','latest','1957054ErmcQw','https://www.npmjs.com/package/','number','/v/','checkedAt','8mVoQwK','valid','parse','utf8','\x20available,\x20current\x20','trim'];a292_0x350c=function(){return _0x534524;};return a292_0x350c();}function isFreshCheck(_0x93a2a8,_0x5a0e24){const _0x2a97a1=a292_0x4810;return typeof _0x93a2a8['checkedAt']===_0x2a97a1(0x205)&&_0x5a0e24-_0x93a2a8[_0x2a97a1(0x1e7)]<UPDATE_CHECK_TTL_MS;}function isRecentlyNotified(_0x3ac5a2,_0x88ca1f,_0xd2a621){const _0x13d3e1=a292_0x4810;return _0x3ac5a2[_0x13d3e1(0x1f1)]===_0x88ca1f&&typeof _0x3ac5a2[_0x13d3e1(0x1fd)]==='number'&&_0xd2a621-_0x3ac5a2['lastNotifiedAt']<UPDATE_NOTICE_TTL_MS;}export function buildNpmVersionUrl(_0x259aaf){const _0x220a55=a292_0x4810;return _0x220a55(0x204)+NPM_PACKAGE_NAME+_0x220a55(0x206)+_0x259aaf;}export async function resolveLatestUpdateNotice(){const _0x22cc71=a292_0x4810;if(isUpdateNoticeDisabled())return null;try{const _0x6b5344=Date[_0x22cc71(0x1f0)](),_0x2907d0=getCliVersion(),_0xbba93b=await readUpdateNoticeCache();let _0x14d8a8=isFreshCheck(_0xbba93b,_0x6b5344)?_0xbba93b[_0x22cc71(0x202)]?.[_0x22cc71(0x1ed)]():undefined;if(!_0x14d8a8&&!isFreshCheck(_0xbba93b,_0x6b5344)){const _0x15c6e0=await getCliVersionPolicy();_0x14d8a8=_0x15c6e0?.[_0x22cc71(0x1ee)]?.[_0x22cc71(0x1ed)]()||undefined,await writeUpdateNoticeCache({..._0xbba93b,'checkedAt':_0x6b5344,'latest':_0x14d8a8,'failed':!_0x14d8a8});}if(!_0x14d8a8||!a292_0x58661a['valid'](_0x2907d0)||!a292_0x58661a[_0x22cc71(0x1e9)](_0x14d8a8))return null;if(a292_0x58661a['gte'](_0x2907d0,_0x14d8a8))return null;if(isRecentlyNotified(_0xbba93b,_0x14d8a8,_0x6b5344))return null;const _0x20a0e3=CLI_BIN_NAME+_0x22cc71(0x1ff);return await writeUpdateNoticeCache({..._0xbba93b,'checkedAt':isFreshCheck(_0xbba93b,_0x6b5344)?_0xbba93b['checkedAt']:_0x6b5344,'latest':_0x14d8a8,'failed':![],'lastNotifiedVersion':_0x14d8a8,'lastNotifiedAt':_0x6b5344}),{'command':_0x20a0e3,'current':_0x2907d0,'latest':_0x14d8a8,'url':buildNpmVersionUrl(_0x14d8a8),'message':CLI_BIN_NAME+'\x20'+_0x14d8a8+_0x22cc71(0x1ec)+_0x2907d0+_0x22cc71(0x1f3)+_0x20a0e3};}catch{return null;}}
1
+ (function(_0x2d7633,_0x55ebf7){const _0x54bde7=a300_0x49a6,_0x4e2dac=_0x2d7633();while(!![]){try{const _0x2efe7e=parseInt(_0x54bde7(0x1ce))/0x1+-parseInt(_0x54bde7(0x1d0))/0x2+-parseInt(_0x54bde7(0x1c8))/0x3*(parseInt(_0x54bde7(0x1c9))/0x4)+parseInt(_0x54bde7(0x1d2))/0x5+-parseInt(_0x54bde7(0x1d6))/0x6+-parseInt(_0x54bde7(0x1c6))/0x7+parseInt(_0x54bde7(0x1d5))/0x8*(parseInt(_0x54bde7(0x1cb))/0x9);if(_0x2efe7e===_0x55ebf7)break;else _0x4e2dac['push'](_0x4e2dac['shift']());}catch(_0x12b6fc){_0x4e2dac['push'](_0x4e2dac['shift']());}}}(a300_0xd12d,0x5fa94));import{mkdir,readFile,writeFile}from'node:fs/promises';import{homedir}from'node:os';import{dirname,join}from'node:path';function a300_0x49a6(_0x2d0dc4,_0x44024a){_0x2d0dc4=_0x2d0dc4-0x1c1;const _0xd12d1f=a300_0xd12d();let _0x49a609=_0xd12d1f[_0x2d0dc4];return _0x49a609;}import a300_0x23dcb7 from'semver';import{CLI_BIN_NAME,NPM_PACKAGE_NAME}from'../constant/cli.js';import{getCliVersionPolicy}from'../utils/cli-version-policy.js';function a300_0xd12d(){const _0x16c827=['lastNotifiedVersion','latest','lastNotifiedAt','true','utf8','trim','parse','valid','now','4358214aLtdES','/v/','6JUonAF','558084YDqngO','object','783fRlQTQ','\x20update','stringify','769824jApLBF','gte','1315486kBhwyN','checkedAt','281835oCLeKs','number',',\x20run:\x20','125792bzNUaL','1457784KEItVV','stableVersion','toLowerCase','rabetbase-cli'];a300_0xd12d=function(){return _0x16c827;};return a300_0xd12d();}import{getCliVersion}from'../utils/version.js';const UPDATE_CHECK_TTL_MS=0xc*0x3c*0x3c*0x3e8,UPDATE_NOTICE_TTL_MS=0x18*0x3c*0x3c*0x3e8;function isUpdateNoticeDisabled(){const _0x4129f8=a300_0x49a6,_0x4a37b8=process.env.RABETBASE_NO_UPDATE_NOTICE?.[_0x4129f8(0x1c2)]()[_0x4129f8(0x1d8)]();return _0x4a37b8==='1'||_0x4a37b8===_0x4129f8(0x1dd)||_0x4a37b8==='yes';}function cacheRoot(){return process.env.XDG_CACHE_HOME||process.env.LOCALAPPDATA||join(homedir(),'.cache');}export function getUpdateNoticeCachePath(){const _0x10f18c=a300_0x49a6;return join(cacheRoot(),_0x10f18c(0x1d9),'update-check.json');}async function readUpdateNoticeCache(){const _0x27ec24=a300_0x49a6;try{const _0x5a6b06=await readFile(getUpdateNoticeCachePath(),_0x27ec24(0x1c1)),_0x130fdc=JSON[_0x27ec24(0x1c3)](_0x5a6b06);if(!_0x130fdc||typeof _0x130fdc!==_0x27ec24(0x1ca))return{};return _0x130fdc;}catch{return{};}}async function writeUpdateNoticeCache(_0x4578e7){const _0x25923a=a300_0x49a6;try{const _0x1c8235=getUpdateNoticeCachePath();await mkdir(dirname(_0x1c8235),{'recursive':!![]}),await writeFile(_0x1c8235,JSON[_0x25923a(0x1cd)](_0x4578e7,null,0x2)+'\x0a',_0x25923a(0x1c1));}catch{}}function isFreshCheck(_0x31021e,_0x51c0f3){const _0x1e8ae9=a300_0x49a6;return typeof _0x31021e[_0x1e8ae9(0x1d1)]===_0x1e8ae9(0x1d3)&&_0x51c0f3-_0x31021e['checkedAt']<UPDATE_CHECK_TTL_MS;}function isRecentlyNotified(_0x563b88,_0x336b97,_0x11671d){const _0x416501=a300_0x49a6;return _0x563b88[_0x416501(0x1da)]===_0x336b97&&typeof _0x563b88[_0x416501(0x1dc)]===_0x416501(0x1d3)&&_0x11671d-_0x563b88['lastNotifiedAt']<UPDATE_NOTICE_TTL_MS;}export function buildNpmVersionUrl(_0x1cd07c){const _0x46c9b9=a300_0x49a6;return'https://www.npmjs.com/package/'+NPM_PACKAGE_NAME+_0x46c9b9(0x1c7)+_0x1cd07c;}export async function resolveLatestUpdateNotice(){const _0x6f0d4=a300_0x49a6;if(isUpdateNoticeDisabled())return null;try{const _0x25b564=Date[_0x6f0d4(0x1c5)](),_0x402cf3=getCliVersion(),_0x50ccd9=await readUpdateNoticeCache();let _0x29ac69=isFreshCheck(_0x50ccd9,_0x25b564)?_0x50ccd9[_0x6f0d4(0x1db)]?.['trim']():undefined;if(!_0x29ac69&&!isFreshCheck(_0x50ccd9,_0x25b564)){const _0xdf01d=await getCliVersionPolicy();_0x29ac69=_0xdf01d?.[_0x6f0d4(0x1d7)]?.[_0x6f0d4(0x1c2)]()||undefined,await writeUpdateNoticeCache({..._0x50ccd9,'checkedAt':_0x25b564,'latest':_0x29ac69,'failed':!_0x29ac69});}if(!_0x29ac69||!a300_0x23dcb7[_0x6f0d4(0x1c4)](_0x402cf3)||!a300_0x23dcb7['valid'](_0x29ac69))return null;if(a300_0x23dcb7[_0x6f0d4(0x1cf)](_0x402cf3,_0x29ac69))return null;if(isRecentlyNotified(_0x50ccd9,_0x29ac69,_0x25b564))return null;const _0x58d19f=CLI_BIN_NAME+_0x6f0d4(0x1cc);return await writeUpdateNoticeCache({..._0x50ccd9,'checkedAt':isFreshCheck(_0x50ccd9,_0x25b564)?_0x50ccd9[_0x6f0d4(0x1d1)]:_0x25b564,'latest':_0x29ac69,'failed':![],'lastNotifiedVersion':_0x29ac69,'lastNotifiedAt':_0x25b564}),{'command':_0x58d19f,'current':_0x402cf3,'latest':_0x29ac69,'url':buildNpmVersionUrl(_0x29ac69),'message':CLI_BIN_NAME+'\x20'+_0x29ac69+'\x20available,\x20current\x20'+_0x402cf3+_0x6f0d4(0x1d4)+_0x58d19f};}catch{return null;}}
@@ -1 +1 @@
1
- (function(_0x42bb02,_0x44ebc4){var _0x238dcd=a293_0x1ace,_0x270b15=_0x42bb02();while(!![]){try{var _0x4e70a3=parseInt(_0x238dcd(0x68))/0x1+parseInt(_0x238dcd(0x6c))/0x2+-parseInt(_0x238dcd(0x66))/0x3*(-parseInt(_0x238dcd(0x65))/0x4)+-parseInt(_0x238dcd(0x67))/0x5+parseInt(_0x238dcd(0x69))/0x6+parseInt(_0x238dcd(0x6b))/0x7*(-parseInt(_0x238dcd(0x6d))/0x8)+-parseInt(_0x238dcd(0x6a))/0x9;if(_0x4e70a3===_0x44ebc4)break;else _0x270b15['push'](_0x270b15['shift']());}catch(_0x2bb7bb){_0x270b15['push'](_0x270b15['shift']());}}}(a293_0x43b8,0x881a2));function a293_0x43b8(){var _0x2ba1f5=['5061519eXmNQR','7wJLnmW','359260heniwM','7233688CByLmF','284264jhUmZQ','12rbFrjq','182180gGEZQO','810010YYohHZ','4719648xnsRWU'];a293_0x43b8=function(){return _0x2ba1f5;};return a293_0x43b8();}import{VERSION}from'../generated/build-info.js';function a293_0x1ace(_0x2adb34,_0x54b0f7){_0x2adb34=_0x2adb34-0x65;var _0x43b8c4=a293_0x43b8();var _0x1ace15=_0x43b8c4[_0x2adb34];return _0x1ace15;}export function getCliVersion(){return VERSION;}
1
+ function a301_0x28c8(){var _0x577f53=['178426PXZcrG','2DoIopM','6583653dsnUHn','6nPmiGC','3649555SXNLwf','5185026PdVtDg','2400732AJHegp','1815908ynPRMA','8gFGsnP','22137930jmhfDr'];a301_0x28c8=function(){return _0x577f53;};return a301_0x28c8();}(function(_0x2cad59,_0x5dd866){var _0x2976a3=a301_0x191e,_0x510b5d=_0x2cad59();while(!![]){try{var _0x415bd9=-parseInt(_0x2976a3(0x9d))/0x1*(-parseInt(_0x2976a3(0x94))/0x2)+-parseInt(_0x2976a3(0x99))/0x3+-parseInt(_0x2976a3(0x9a))/0x4+parseInt(_0x2976a3(0x97))/0x5*(-parseInt(_0x2976a3(0x96))/0x6)+parseInt(_0x2976a3(0x98))/0x7+-parseInt(_0x2976a3(0x9b))/0x8*(parseInt(_0x2976a3(0x95))/0x9)+parseInt(_0x2976a3(0x9c))/0xa;if(_0x415bd9===_0x5dd866)break;else _0x510b5d['push'](_0x510b5d['shift']());}catch(_0x3b1d69){_0x510b5d['push'](_0x510b5d['shift']());}}}(a301_0x28c8,0x65e08));import{VERSION}from'../generated/build-info.js';function a301_0x191e(_0x55bd31,_0xc7f04b){_0x55bd31=_0x55bd31-0x94;var _0x28c861=a301_0x28c8();var _0x191e9f=_0x28c861[_0x55bd31];return _0x191e9f;}export function getCliVersion(){return VERSION;}
@@ -1 +1 @@
1
- function a294_0x35f4(){var _0x2b5c44=['6860920AYCZbb','503556asmQvk','62460hfOfnD','736850bwWWEF','114qQnRaD','428005YcdcTT','8841889unYpPG','3272103vNdpFQ','303oGILBb'];a294_0x35f4=function(){return _0x2b5c44;};return a294_0x35f4();}(function(_0x245cc1,_0x203cbc){var _0x466e06=a294_0x4a08,_0x41ab4e=_0x245cc1();while(!![]){try{var _0xf3a117=parseInt(_0x466e06(0x11f))/0x1+parseInt(_0x466e06(0x11d))/0x2+-parseInt(_0x466e06(0x124))/0x3*(-parseInt(_0x466e06(0x11e))/0x4)+-parseInt(_0x466e06(0x121))/0x5*(parseInt(_0x466e06(0x120))/0x6)+-parseInt(_0x466e06(0x122))/0x7+parseInt(_0x466e06(0x125))/0x8+parseInt(_0x466e06(0x123))/0x9;if(_0xf3a117===_0x203cbc)break;else _0x41ab4e['push'](_0x41ab4e['shift']());}catch(_0x2ad90a){_0x41ab4e['push'](_0x41ab4e['shift']());}}}(a294_0x35f4,0xdb163));import{setActiveCookie,clearActiveCookie}from'../core/api-client.js';function a294_0x4a08(_0x257199,_0x1b08c7){_0x257199=_0x257199-0x11d;var _0x35f4d1=a294_0x35f4();var _0x4a088e=_0x35f4d1[_0x257199];return _0x4a088e;}export async function withActiveCookie(_0x3eecd9,_0x564d48){setActiveCookie(_0x3eecd9);try{return await _0x564d48();}finally{clearActiveCookie();}}
1
+ function a302_0x4e60(){var _0x1248c5=['356KfutEO','784869LcPgVo','930lIDYIT','86090Pzlabo','1164MxHUXw','10221632drTTIv','4Casich','30468qJTdBw','12122UmmJDe','92763CMjJBd','61817KTxJDQ','4293381NZviHv'];a302_0x4e60=function(){return _0x1248c5;};return a302_0x4e60();}(function(_0x22c3f7,_0x3a0a11){var _0x4c1f97=a302_0x1b2d,_0x23f4f6=_0x22c3f7();while(!![]){try{var _0x24bba7=-parseInt(_0x4c1f97(0x17e))/0x1*(-parseInt(_0x4c1f97(0x183))/0x2)+-parseInt(_0x4c1f97(0x17c))/0x3+parseInt(_0x4c1f97(0x17d))/0x4*(-parseInt(_0x4c1f97(0x180))/0x5)+parseInt(_0x4c1f97(0x181))/0x6*(parseInt(_0x4c1f97(0x17b))/0x7)+-parseInt(_0x4c1f97(0x182))/0x8+parseInt(_0x4c1f97(0x17a))/0x9*(-parseInt(_0x4c1f97(0x17f))/0xa)+-parseInt(_0x4c1f97(0x179))/0xb*(-parseInt(_0x4c1f97(0x178))/0xc);if(_0x24bba7===_0x3a0a11)break;else _0x23f4f6['push'](_0x23f4f6['shift']());}catch(_0x80c01d){_0x23f4f6['push'](_0x23f4f6['shift']());}}}(a302_0x4e60,0xd71fa));function a302_0x1b2d(_0x492c00,_0x442990){_0x492c00=_0x492c00-0x178;var _0x4e6035=a302_0x4e60();var _0x1b2d56=_0x4e6035[_0x492c00];return _0x1b2d56;}import{setActiveCookie,clearActiveCookie}from'../core/api-client.js';export async function withActiveCookie(_0xd32e3f,_0x18f9cf){setActiveCookie(_0xd32e3f);try{return await _0x18f9cf();}finally{clearActiveCookie();}}
@@ -1 +1 @@
1
- (function(_0x12c9c8,_0x490437){var _0x25c34b=a295_0x57d4,_0x51a524=_0x12c9c8();while(!![]){try{var _0x2dc9a4=-parseInt(_0x25c34b(0xfe))/0x1*(-parseInt(_0x25c34b(0x103))/0x2)+-parseInt(_0x25c34b(0x10b))/0x3*(parseInt(_0x25c34b(0x102))/0x4)+-parseInt(_0x25c34b(0xff))/0x5*(-parseInt(_0x25c34b(0x105))/0x6)+-parseInt(_0x25c34b(0x100))/0x7+-parseInt(_0x25c34b(0x108))/0x8*(-parseInt(_0x25c34b(0x109))/0x9)+parseInt(_0x25c34b(0x107))/0xa*(parseInt(_0x25c34b(0x106))/0xb)+-parseInt(_0x25c34b(0x10a))/0xc*(parseInt(_0x25c34b(0x101))/0xd);if(_0x2dc9a4===_0x490437)break;else _0x51a524['push'](_0x51a524['shift']());}catch(_0x49e542){_0x51a524['push'](_0x51a524['shift']());}}}(a295_0xf87a,0x92bb3));function a295_0x57d4(_0x347494,_0x3f73c0){_0x347494=_0x347494-0xfe;var _0xf87a73=a295_0xf87a();var _0x57d4b8=_0xf87a73[_0x347494];return _0x57d4b8;}export function writeCliSideChannelLine(_0x4d6a2b){var _0x44c375=a295_0x57d4;process[_0x44c375(0x104)]['write'](_0x4d6a2b+'\x0a');}function a295_0xf87a(){var _0x54e53d=['8802iUpPHE','stderr','1197606dQpsfC','66ZenEIY','1555530SvqWgs','9704KFKBjz','1395JIwMXY','36wpnZuG','269697VNoVsU','251xUEcWa','25GDUeRe','2011296KOWGhp','8952463FdAHdo','12jcZJZh'];a295_0xf87a=function(){return _0x54e53d;};return a295_0xf87a();}
1
+ function a303_0x2a47(_0x2c4609,_0x262771){_0x2c4609=_0x2c4609-0xaf;var _0x4364a9=a303_0x4364();var _0x2a47c6=_0x4364a9[_0x2c4609];return _0x2a47c6;}(function(_0x3bba14,_0x2eea3d){var _0x1efc06=a303_0x2a47,_0x2c7481=_0x3bba14();while(!![]){try{var _0x59ab68=parseInt(_0x1efc06(0xb2))/0x1+-parseInt(_0x1efc06(0xb0))/0x2*(-parseInt(_0x1efc06(0xb3))/0x3)+-parseInt(_0x1efc06(0xb7))/0x4+parseInt(_0x1efc06(0xb6))/0x5+parseInt(_0x1efc06(0xb9))/0x6+-parseInt(_0x1efc06(0xaf))/0x7+-parseInt(_0x1efc06(0xb4))/0x8*(parseInt(_0x1efc06(0xb1))/0x9);if(_0x59ab68===_0x2eea3d)break;else _0x2c7481['push'](_0x2c7481['shift']());}catch(_0x314f7e){_0x2c7481['push'](_0x2c7481['shift']());}}}(a303_0x4364,0x67911));export function writeCliSideChannelLine(_0x29ce77){var _0x5cfca6=a303_0x2a47;process[_0x5cfca6(0xb8)][_0x5cfca6(0xb5)](_0x29ce77+'\x0a');}function a303_0x4364(){var _0x2562e5=['write','2051660CyZNlq','907548CMcCYI','stderr','4174944OalGAq','2403534Looivw','7700qKdFFF','99ojhIlv','82991zWnwjb','534BBYSsx','639992rviUho'];a303_0x4364=function(){return _0x2562e5;};return a303_0x4364();}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lovrabet/rabetbase-cli",
3
- "version": "2.5.0",
3
+ "version": "2.5.1-beta.2",
4
4
  "description": "Developer CLI for Lovrabet apps, datasets, pages, SQL, Backend Function, database connections, skills, and AI agent workflows.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "keywords": [
@@ -43,7 +43,6 @@
43
43
  "prebuild:dev": "node scripts/generate-build-info.js",
44
44
  "build:dev": "node scripts/clean-build-output.mjs && tsc && tsc-alias",
45
45
  "start": "tsc --watch",
46
- "sync-template": "node scripts/sync-template.js",
47
46
  "sync:cdn": "node scripts/sync-cdn-assets.js",
48
47
  "verify:bundled-jq": "node scripts/verify-bundled-jq.mjs",
49
48
  "regression:release-smoke": "node scripts/regression-release-smoke.mjs",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: rabetbase
3
- version: 2.5.0
4
- description: "Lovrabet 开发工作流 CLI — 通过 rabetbase 命令管理数据集、数据库连接(dblink)、数据列表页(Data List Page)、自定义页面(Custom Page)、SQL 查询、Backend Function 脚本、通知配置、企业知识库、菜单事实读取与同步、开发角色与协作者、应用文件、面向票证类业务材料文字与结构化字段提取的 OCR、代码生成,以及平台问题上报。触发词:数据集、数据表、dataset relation-audit、dataset delete、dataset restore、废弃数据集、恢复数据集、dataset rename、dataset field-update、dataset extend-update、dataset business-groups、dataset business-group-update、businessGroup、字段对象更新、doType、options、数据列表页、Data List Page、自定义页面、Custom Page、page create、page custom-list、page custom-detail、page custom-update、page custom-publish、page generate-start、page generate-status、page relation-audit、page sync、page pull、page push、page restore、恢复已删除页面、dblink、数据库连接、schema 分析、db list、db detail、db create、db update、db delete、db test、db tables、db diff、db diff-refresh-start、db diff-refresh-status、db analyze-batch-plan、db analyze-start、analyze-cancel、analyze-status、traceId、自定义 SQL、sql.execute、bff.execute、BF 消息通知、Backend Function 消息通知、notification config-list、EMAIL configCode、通知配置、notification.send、企业知识库、公司知识、公共知识、kb search、get_dataset_detail、validate_sql_content、save_or_update_custom_sql、@lovrabet/sdk、lovrabet 开发、rabetbase、filter、codegen、init、appcode、app list、app members-list、tenant members-list、应用人员列表、租户人员列表、workspace、workspace init、workspace use、workspace add、workspace remove、多应用、默认应用、menu list、menu visibility-update、菜单显示、菜单隐藏、visible、menu external-link-create、menu external-link-update、menu rename、菜单改名、外链菜单创建、外链 URL 更新、菜单异常审计、菜单手动删除清单、menu sync、menu asset-update、菜单资源更新、menu move、菜单移动、开发角色、开发协作者、role、role list、role user-add、role user-remove、user-resolve、加入开发者、ADMIN、DEV、OWNER、CUSTOM、project create、project upgrade、schema、jq、compress、file upload、file query-url、ocr recognize、文件上传、OCR 识别、票证文字提取、票证字段提取、发票识别、票据识别、证照识别、长期链接、issue report、平台问题、platform issue、问题上报、user-account dingding-sandbox-bind、钉钉沙箱账号绑定。"
3
+ version: 2.5.1-beta.2
4
+ description: "Lovrabet 开发工作流 CLI — 通过 rabetbase 命令管理数据集、数据库连接(dblink)、局部部署研发元数据同步、数据列表页(Data List Page)、自定义页面(Custom Page)、SQL 查询、Backend Function 脚本、通知配置、企业知识库、菜单事实读取与同步、开发角色与协作者、应用文件、面向票证类业务材料文字与结构化字段提取的 OCR、代码生成,以及平台问题上报。触发词:数据集、数据表、dataset relation-audit、dataset delete、dataset restoredataset user-deleted-field-list、dataset field-restore、用户删除字段、恢复数据集字段、废弃数据集、恢复数据集、dataset rename、dataset field-update、dataset extend-update、dataset business-groups、dataset business-group-update、businessGroup、字段对象更新、doType、options、数据列表页、Data List Page、自定义页面、Custom Page、page create、page custom-list、page custom-detail、page custom-update、page custom-publish、page generate-start、page generate-status、page relation-audit、page sync、page pull、page push、page restore、恢复已删除页面、dblink、数据库连接、schema 分析、db list、db detail、db create、db update、db delete、db test、db tables、db diff、db diff-refresh-start、db diff-refresh-status、db analyze-batch-plan、db analyze-start、analyze-cancel、analyze-status、traceId、deployment sync、局部部署、研发元数据同步、target-env、direct、自定义 SQL、sql.execute、bff.execute、BF 消息通知、Backend Function 消息通知、notification config-list、EMAIL configCode、通知配置、notification.send、企业知识库、公司知识、公共知识、kb search、get_dataset_detail、validate_sql_content、save_or_update_custom_sql、@lovrabet/sdk、lovrabet 开发、rabetbase、filter、codegen、init、appcode、app list、app members-list、tenant members-list、应用人员列表、租户人员列表、workspace、workspace init、workspace use、workspace add、workspace remove、多应用、默认应用、menu list、menu visibility-update、菜单显示、菜单隐藏、visible、menu external-link-create、menu external-link-update、menu rename、菜单改名、外链菜单创建、外链 URL 更新、菜单异常审计、菜单手动删除清单、menu sync、menu asset-update、菜单资源更新、menu move、菜单移动、开发角色、开发协作者、role、role list、role user-add、role user-remove、user-resolve、加入开发者、ADMIN、DEV、OWNER、CUSTOM、project create、project upgrade、schema、jq、compress、file upload、file query-url、ocr recognize、文件上传、OCR 识别、票证文字提取、票证字段提取、发票识别、票据识别、证照识别、长期链接、issue report、平台问题、platform issue、问题上报、user-account dingding-sandbox-bind、钉钉沙箱账号绑定。"
5
5
  metadata:
6
6
  requires:
7
7
  bins: ["rabetbase"]
@@ -18,7 +18,7 @@ metadata:
18
18
 
19
19
  ## 前置条件
20
20
 
21
- 1. **连接配置与认证分离**:首次使用先执行 `rabetbase config init`。交互模式选择 `Mainland China (cn)` 或 `Indonesia (id)`;非交互模式显式传 `--region cn|id`,未传时默认 `cn`。企业独立部署使用 `--domain-config <file>` 或六个 `--*-domain` flags。`config init` 固定重建全局节点/Domain 配置,保留 Cookie、AccessKey、format、locale 和应用绑定,但不登录、不绑定项目;随后再执行 `rabetbase auth login`
21
+ 1. **连接配置与认证分离**:首次使用先执行 `rabetbase config init`。交互模式选择 `Mainland China (cn)` 或 `Indonesia (id)`;非交互模式显式传 `--region cn|id`,未传时默认 `cn`。尚未发布的 `global` 不出现在新配置入口中。企业独立部署使用 `--domain-config <file>` 或对应 `--*-domain` flags;自定义 HTTPS 本地回调时同时提供 Local 与 Certificate Domain。当前所有已开放节点和独立部署统一使用中国大陆 CDN 配置,Lovrabet 服务 Domain 仍分别解析。`config init` 固定重建全局节点/Domain 配置,保留 Cookie、AccessKey、format、locale 和应用绑定,但不登录、不绑定项目;随后再执行 `rabetbase auth login`
22
22
  2. **AppCode**:确保 `.rabetbase.json` 中设置了 `apps`(单应用自动选中;多应用再配 `defaultApp`),或兼容读取的顶层 `appcode`,或通过 `--appcode <code>` / `--app <name>` 传入。旧 `.lovrabet.json` 不会自动读取
23
23
  3. **配置文件**:`rabetbase config init` 固定写全局 `~/.rabetbase.json`,不接受项目作用域;默认 `cn` 不落冗余 `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 职责边界」)
@@ -53,6 +53,7 @@ metadata:
53
53
  - 需要了解数据集关联关系时用 `rabetbase dataset relations --format compress`(或 `json`);需要审计关系事实错误和人工复核项时用 `rabetbase dataset relation-audit --format compress`
54
54
  - 需要从文本需求创建新的 `METADATA` 数据集时,先读 [`dataset generate-start/status`](references/rabetbase-dataset-generate.md),执行 preview 写出 design 文件,审阅后用 `generate-start --apply --design-file` 提交任务,再用 `generate-status` 查询到成功
55
55
  - **管理物理库连接 / 测连 / 同步表结构分析**时用 `rabetbase db …`(先 [`db list`](references/rabetbase-db-list.md),trace/plan id 见 [`database-connection-workflow.md`](guides/database-connection-workflow.md))
56
+ - **为独立部署局部同步研发元数据**时用 [`rabetbase deployment sync`](references/rabetbase-deployment-sync.md);CLI 只调用带 appCode 开关检查的同步接口,未开启时服务端正常跳过;日常非生产 BFF/SQL 变更可在用户明确要求后配置 push 后置同步,生产、直连和 Dataset 保持显式确认
56
57
  - DBAgent 增量分析默认先执行一次异步差异刷新:调用 `db diff-refresh-start`,保存 traceId,并用 `db diff-refresh-status` 查询同一任务到终态;成功后按原始意图执行 `db diff --all`(差异表)或 `db tables`(全部表)。无论 `tableCount` 大小都执行刷新;只有用户明确表示“不需要分析”“不刷新”或“只看现有结果”时才跳过异步刷新,并说明结果可能不是最新事实
57
58
  - 需要查看全部表(含无差异表)或主动重新分析既有表时,用 `db tables`;它固定聚合全表分页。`db diff --all` 只聚合全部差异分页
58
59
  - DB 增量分析先对完整 `toAnalyzeTables` 执行 `db analyze-batch-plan`;它生成的是本地批次方案,不是服务端 `planId`,也不会创建任务。再严格按批次顺序启动;每批独立保存 `planId`(即 `analyze-start` 返回值),当前批次到达已知终态前不得启动下一批
@@ -158,7 +159,7 @@ metadata:
158
159
  - **普通写操作默认当前项目**(`workspace add`、`config set`、`project create` 等),除非用户**显式**传 `--global`;`config init` 是首次连接配置入口,固定写全局配置。
159
160
  - **不要**在用户未要求时给命令加 `--global`** — 默认行为已是「项目优先」;只有用户明确要改全局配置或不在项目内且意图写全局时才使用。
160
161
  - **`config set`**:在**没有**项目配置文件(当前目录未解析到 `.rabetbase.json`)且**未**传 `--global` 时,CLI **拒绝执行**并提示使用 `--global` 或先 `rabetbase workspace init --appcode <code>`,**不会**静默写入全局。
161
- - **`project create`** 生成的新项目 `.rabetbase.json` **只继承**少量全局偏好(如 `cookie` / `locale` / `format` / `riskLevel` 等),**不会**把全局 `apps` / `defaultApp` 带入新项目文件;同时生成浏览器安全的 `src/api/sdk-config.ts`:默认中国大陆节点不写路由,ID 写 `region: "id"`,非默认企业 Runtime 写 `runtimeDomain` 且优先于 region,不下发认证配置。模板的 Vite 本地开发和 preview 地址也按项目 region 选择对应的 HTTPS 域名与证书:ID 使用 `https://dev.lovrabet.id`,中国大陆使用 `https://dev.lovrabet.com`。
162
+ - **`project create`** 生成的新项目 `.rabetbase.json` **只继承**少量全局偏好(如 `cookie` / `locale` / `format` / `riskLevel` 等),**不会**把全局 `apps` / `defaultApp` 带入新项目文件;同时生成浏览器安全的 `src/api/sdk-config.ts` `rabetbase.routing.json`。中国大陆、ID、Global Lovrabet 服务 Domain、本地地址和证书由统一 Routing Profile 解析;当前共享资源统一使用中国大陆 CDN 配置,独立部署写客户最终服务 Domain。两个生成文件都不下发认证配置,后续 `api pull` 会刷新。
162
163
  - **`api pull` / `api list`**:默认仅针对**项目** `apps`;需要合并全局已登记应用时加 `--global`(见各命令 reference)。
163
164
  - **`app list`**:默认展示**合并**后的全量;`--global` 仅全局、`--project` 仅项目(见 [`rabetbase app list`](references/rabetbase-app-list.md))。
164
165
 
@@ -194,6 +195,7 @@ metadata:
194
195
  - **不要猜字段名** — 必须从 `dataset detail` 返回值获取真实字段名、类型、枚举值
195
196
  - **不要跳过 validate 与 dry-run** — 修改已有 SQL 并准备 `sql push` 前,必须先跑 `sql validate`;创建 SQL 或执行高风险同步前至少确认过 `sql create --dry-run`、`sql push --dry-run` 或 `sql delete --dry-run` 的预览
196
197
  - **不要手动拼 API URL** — 所有操作通过 CLI 命令完成,不要直接调 HTTP 接口
198
+ - **不要自动重提局部部署同步** — `deployment sync` 部分失败时保留逐项结果交给用户判断;结果不确定时先人工核对目标端,不得把非零退出误报为全部成功或直接重试
197
199
  - **不要向产品用户展开研发实现** — 回答角色权限操作时,不输出工程仓库、Controller、数据库表、接口路径、MR 排查或迁移过程;只说明 CLI 命令、角色边界、风险和可验证结果
198
200
  - **不要臆测 sqlCode / id** — 从 `sql list` 或 `bff list` 获取真实标识
199
201
  - **不要臆测 dblink id 或分析 trace/plan id** — 从 `db list` / `db detail` / `db analyze-start` 的返回字段获取(见 [database-connection-workflow.md](guides/database-connection-workflow.md))
@@ -273,6 +275,10 @@ const result = await client.bff.execute<DashboardData>({
273
275
  });
274
276
  ```
275
277
 
278
+ ### Personal Backend Function 调用
279
+
280
+ 前端或 Node 服务通过 `client.personal.bff.execute({ scriptId, params })` 调用 Personal Backend Function。认证方式、兼容性检查、`undefined` 处理和返回值约定见 [`typescript-sdk.md`](guides/typescript-sdk.md#4-前端--node-调用-personal-backend-function-api)。
281
+
276
282
  ### 前端 vs Backend Function 关键差异
277
283
 
278
284
  | | 前端 SDK | Backend Function (context.client) |
@@ -284,6 +290,7 @@ const result = await client.bff.execute<DashboardData>({
284
290
  | `create()` 返回 | 以 SDK 文档/类型为准 | 新记录 ID,不是完整对象 |
285
291
  | SDK 初始化能力 | `createClient` / `registerModels` | 不可用;`context.client` 由平台注入 |
286
292
  | 调 Backend Function | `client.bff.execute({ scriptName, params })` | — |
293
+ | 调 Personal Backend Function | `client.personal.bff.execute({ scriptId, params })` | — |
287
294
 
288
295
  ## 意图 → 命令索引
289
296
 
@@ -332,12 +339,14 @@ const result = await client.bff.execute<DashboardData>({
332
339
  | 查看表结构和字段 | [`rabetbase dataset detail --code xxx`](references/rabetbase-dataset-detail.md) | 含字段定义和操作列表 |
333
340
  | 废弃数据集 | [`rabetbase dataset delete`](references/rabetbase-dataset-delete.md) | high-risk-write;默认非级联,显式 `--cascade --confirm` 才删除关联页;必须先 `--dry-run`,批量推荐 `--expected-count` |
334
341
  | 恢复已删除数据集 | [`rabetbase dataset restore`](references/rabetbase-dataset-restore.md) | high-risk-write;按唯一回收站日志只恢复 Dataset,页面用 `page restore` 明确恢复;必须先 `--dry-run` |
342
+ | 查询用户明确删除的字段 | [`rabetbase dataset user-deleted-field-list`](references/rabetbase-dataset-user-deleted-field-list.md) | read;只返回用户删除墓碑字段的安全投影,空列表正常成功 |
343
+ | 恢复一个用户删除字段 | [`rabetbase dataset field-restore`](references/rabetbase-dataset-field-restore.md) | write;先精确查询再 dry-run;只提交一个 column ID,并以恢复数量和双重回读确认;不自动同步页面 |
335
344
  | 修改 Dataset 展示名 | [`rabetbase dataset rename`](references/rabetbase-dataset-rename.md) | 只更新 Dataset 展示名;必须先 `--dry-run`,用 `--expect-name` 防漂移;连续重命名先读对应章节 |
336
345
  | 从文本生成新 METADATA 数据集 | [`rabetbase dataset generate-start`](references/rabetbase-dataset-generate.md) / [`generate-status`](references/rabetbase-dataset-generate.md) | 三步:preview;审阅后提交;随后执行 `data.query.command`,优先按同一个 taskId 查询。`PENDING/PROCESSING` 非终态,未知或响应丢失不得自动重提;只在返回 `createdDataset.code` 后使用 Dataset |
337
346
  | 安全更新 Dataset 原始字段对象 | [`rabetbase dataset field-update`](references/rabetbase-dataset-field-update.md) | 使用 `--code` 定位 Dataset,只允许 patch 已知可变业务配置字段;必须先 `--dry-run`,用 `--expect-json` 防漂移 |
338
347
  | Dataset 顶层 extend 更新命令 | [`rabetbase dataset extend-update`](references/rabetbase-dataset-extend-update.md) | 当前无可写字段;不得用于 `businessGroup`。业务场景分组只能使用 `rabetbase dataset business-group-update` |
339
- | 发现已有业务分组 | [`rabetbase dataset business-groups`](references/rabetbase-dataset-business-groups.md) | read;按 `--dbid` 汇总 DB_TABLE Dataset,不含 METADATA;空字符串桶表示未分组 |
340
- | 更新业务场景分组 | [`rabetbase dataset business-group-update`](references/rabetbase-dataset-business-group-update.md) | 唯一入口;使用 `--code` 定位 Dataset;必须先 `--dry-run`,推荐用 `--expect-business-group` 防漂移 |
348
+ | 发现已有业务分组 | [`rabetbase dataset business-groups`](references/rabetbase-dataset-business-groups.md) | read;按 `--dbid` 汇总 DB_TABLE Dataset,不含 METADATA;未分组桶统一显示为 `ungrouped` |
349
+ | 更新业务场景分组 | [`rabetbase dataset business-group-update`](references/rabetbase-dataset-business-group-update.md) | 使用 `--code` 定位 Dataset;DB_TABLE 与 METADATA 可设置非空分组,METADATA 可用 `ungrouped` 清空;必须先 `--dry-run`,推荐用 `--expect-business-group` 防漂移 |
341
350
  | 查看 Dataset 操作定义 | [`rabetbase dataset operations --code xxx`](references/rabetbase-dataset-operations.md) | 获取 filter/getOne/create 等参数定义 |
342
351
  | 查看数据集关联关系 | [`rabetbase dataset relations`](references/rabetbase-dataset-relations.md) | 标准只读入口,输出 `datasetCode + field` 关系事实;支持 `DB_TABLE -> DB_TABLE`、`DB_TABLE -> METADATA`、`METADATA -> METADATA` |
343
352
  | 审计数据集关联关系 | [`rabetbase dataset relation-audit`](references/rabetbase-dataset-relation-audit.md) | 只读审计关系事实结构错误、风险和人工复核项 |
@@ -357,7 +366,8 @@ const result = await client.bff.execute<DashboardData>({
357
366
  | 推送本地数据列表页 schema | [`rabetbase page push --id <pageId>`](references/rabetbase-page-push.md) | 推送后自动回拉 canonical schema 覆盖本地 |
358
367
  | 恢复已删除页面 | [`rabetbase page restore --id <pageId>`](references/rabetbase-page-restore.md) | 支持 `DATA_LIST|CUSTOM` 自动识别;跨类型同 ID 时显式传 `--page-type` |
359
368
  | 数据库连接(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` |
360
- | 生成 / 更新 API 客户端代码 | [`rabetbase api pull`](references/rabetbase-api-pull.md) → [`sdk-client-generation.md`](guides/sdk-client-generation.md) | `api pull` Dataset 事实并刷新 `sdk-config.ts`;已有 `api.ts`/`client.ts` guide 合并更新 |
369
+ | 独立部署局部同步研发元数据 | [`rabetbase deployment sync`](references/rabetbase-deployment-sync.md) | 显式命令为 `write`;服务端仅允许应用 Admin 操作并原子检查 appCode 开关,未开启时正常 no-op;非生产 BFF/SQL 可配置 push 后置同步;生产、直连、Dataset 保持显式确认;失败或结果不确定时不自动重试 |
370
+ | 生成 / 更新 API 客户端代码 | [`rabetbase api pull`](references/rabetbase-api-pull.md) → [`sdk-client-generation.md`](guides/sdk-client-generation.md) | `api pull` 拉 Dataset 事实并刷新 `sdk-config.ts` 与 `rabetbase.routing.json`;已有 `api.ts`/`client.ts` 按 guide 合并更新 |
361
371
  | 查看生成的 API 模型 | [`rabetbase api list`](references/rabetbase-api-list.md) | 列出已生成的数据模型 |
362
372
  | 查看现有 SQL | [`rabetbase sql list --name "xxx"`](references/rabetbase-sql-list.md) | 分页,按名称过滤;默认查当前决议到的单个应用 |
363
373
  | 查看 SQL 详情 | [`rabetbase sql detail --sqlcode xxx`](references/rabetbase-sql-detail.md) | 含完整 SQL 内容和参数定义 |
@@ -415,10 +425,11 @@ const result = await client.bff.execute<DashboardData>({
415
425
  | Roles | [`list`](references/rabetbase-role-list.md) / `detail` / `update` / `delete` / [`user-resolve`](references/rabetbase-role-user-resolve.md) / [`user-add` / `user-remove`](references/rabetbase-role-user-add.md) |
416
426
  | Tenant Members | [`tenant members-list`](references/rabetbase-tenant-members-list.md)(当前账号所属租户的全量人员目录) |
417
427
  | app commands | [`list`](references/rabetbase-app-list.md)(只读应用事实;平台目录用 `list --remote`)/ [`members-list`](references/rabetbase-app-members-list.md)(应用人员及角色归属)。登记/移除应用改用 `workspace add` / `workspace remove` |
418
- | dataset commands | [`list`](references/rabetbase-dataset-list.md) / [`detail`](references/rabetbase-dataset-detail.md) / [`delete`](references/rabetbase-dataset-delete.md) / [`restore`](references/rabetbase-dataset-restore.md) / [`generate-start/status`](references/rabetbase-dataset-generate.md) / [`rename`](references/rabetbase-dataset-rename.md) / [`field-update`](references/rabetbase-dataset-field-update.md) / [`extend-update`](references/rabetbase-dataset-extend-update.md) / [`business-group-update`](references/rabetbase-dataset-business-group-update.md) / [`operations`](references/rabetbase-dataset-operations.md) / [`relations`](references/rabetbase-dataset-relations.md) / [`relation-audit`](references/rabetbase-dataset-relation-audit.md) / [`relation-create/update/delete`](references/rabetbase-dataset-relation-mutations.md) |
428
+ | dataset commands | [`list`](references/rabetbase-dataset-list.md) / [`detail`](references/rabetbase-dataset-detail.md) / [`delete`](references/rabetbase-dataset-delete.md) / [`restore`](references/rabetbase-dataset-restore.md) / [`user-deleted-field-list`](references/rabetbase-dataset-user-deleted-field-list.md) / [`field-restore`](references/rabetbase-dataset-field-restore.md) / [`generate-start/status`](references/rabetbase-dataset-generate.md) / [`rename`](references/rabetbase-dataset-rename.md) / [`field-update`](references/rabetbase-dataset-field-update.md) / [`extend-update`](references/rabetbase-dataset-extend-update.md) / [`business-group-update`](references/rabetbase-dataset-business-group-update.md) / [`operations`](references/rabetbase-dataset-operations.md) / [`relations`](references/rabetbase-dataset-relations.md) / [`relation-audit`](references/rabetbase-dataset-relation-audit.md) / [`relation-create/update/delete`](references/rabetbase-dataset-relation-mutations.md) |
419
429
  | Data List Page commands | [`generate-start`](references/rabetbase-page-generate-start.md) / [`generate-status`](references/rabetbase-page-generate-status.md) / [`data-list-status`](references/rabetbase-data-list-status.md) / [`relation-audit`](references/rabetbase-page-relation-binding.md) / [`sync`](references/rabetbase-page-sync.md) / [`pull`](references/rabetbase-page-pull.md) / [`push`](references/rabetbase-page-push.md) |
420
430
  | Custom Page commands | [`create`](references/rabetbase-page-create.md) / [`custom-list`](references/rabetbase-page-custom-list.md) / [`custom-detail`](references/rabetbase-page-custom-detail.md) / [`custom-update`](references/rabetbase-page-custom-update.md) / [`custom-publish`](references/rabetbase-page-custom-publish.md) |
421
431
  | 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) |
432
+ | Deployment | [`sync`](references/rabetbase-deployment-sync.md) |
422
433
  | api commands | [`pull`](references/rabetbase-api-pull.md) / [`list`](references/rabetbase-api-list.md) |
423
434
  | 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) |
424
435
  | bff commands | [`list`](references/rabetbase-bff-list.md) / [`detail`](references/rabetbase-bff-detail.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) |
@@ -489,7 +500,7 @@ const result = await client.bff.execute<DashboardData>({
489
500
 
490
501
  | 主题 | Use when | Guide |
491
502
  | ---------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
492
- | SDK 完整参数与返回值 | 初始化 client、filter/create、sql.execute、bff.execute、错误处理 | [`typescript-sdk.md`](guides/typescript-sdk.md) |
503
+ | SDK 完整参数与返回值 | 初始化 client、filter/create、sql.execute、bff.execute、personal.bff.execute、安全能力检测与错误处理 | [`typescript-sdk.md`](guides/typescript-sdk.md) |
493
504
  | 生成 / 更新 api.ts 与 client.ts | `api pull` 之后、模型过期、脚手架缺失、或用户要求修复 SDK 客户端 | [`sdk-client-generation.md`](guides/sdk-client-generation.md) |
494
505
  | SQL MyBatis 与动态 SQL | 写自定义 SQL、`<if>`/`<foreach>`、参数绑定 | [`sql-mybatis.md`](guides/sql-mybatis.md) |
495
506
  | 前端页面开发约束 | React 页、表单、列表、与数据集绑定 | [`frontend-development.md`](guides/frontend-development.md) |
@@ -120,6 +120,8 @@ const customer = await client.models.customers.getOne({ id: customerId });
120
120
  * 使用 `filter()` 进行列表和条件查询
121
121
  * 不要在页面里写循环单条请求
122
122
  * 批量查询和性能优化统一参考 `data-api-guidelines.md`
123
+ * 调用 Personal Backend Function 时使用 `client.personal.bff.execute({ scriptId, params })`;先显式校验能力存在,禁止用 `execute?.(...)` 静默吞掉旧版 SDK 或 client 未初始化问题
124
+ * 浏览器只使用当前登录 Cookie,不在前端源码、构建变量或页面配置中保存 Client AK;完整示例与返回值校验见 `typescript-sdk.md`
123
125
 
124
126
  ## 禁止 Mock 替代正式数据
125
127
 
@@ -51,7 +51,7 @@ rabetbase api pull --format compress
51
51
  export const LOVRABET_SDK_CONFIG = {} as const;
52
52
  ```
53
53
 
54
- CLI 可能写入 `region: "id"` `runtimeDomain: "https://…"`。不要手改成认证字段。
54
+ CLI 可能写入 `region: "id"`(由 SDK 1.5.3+ 解析)或 `runtimeDomain: "https://…"`(Global 与独立部署)。不要手改成认证字段。项目根目录 `rabetbase.routing.json` 同时承载模板最终 Domain 与资源策略,也由 CLI 刷新。
55
55
 
56
56
  ### api.ts
57
57
 
@@ -138,9 +138,10 @@ export const lovrabetClient = createClient({
138
138
  | `isDefaultConfig` | 默认应用为 `true` |
139
139
  | `models[]` | `datasetCode` / `tableName` / `name` / `alias` |
140
140
  | `sdkRouting` | `{ region?: "id", runtimeDomain?: string }` |
141
+ | `projectRouting` | `{ path, manifest }`,最终公开 Domain 与资源策略 |
141
142
  | `files.api` / `files.client` / `files.sdkConfig` | `{ path, action }`;`action` 为 `created` / `overwritten` / `preserved` / `refreshed` |
142
143
  | `needsAgentMerge` | 任一 TypeScript 被 `preserved` 时为 `true`,必须合并 `models` |
143
144
  | `apiFilePath` / `clientFilePath` / `sdkConfigPath` | 与 `files.*.path` 相同,兼容路径字段 |
144
145
  | `modelCount` / `datasetCount` | 模型数量 |
145
146
 
146
- 多应用时 `data.apps[]` 为上述对象的数组。
147
+ 多应用时 `data.apps[]` 为上述对象的数组,`data.projectRouting` 为项目共享路由清单。
@@ -235,6 +235,45 @@ const dashboard = await client.bff.execute<DashboardData>({
235
235
  console.log(dashboard.userCount);
236
236
  ```
237
237
 
238
+ ## 4. 前端 / Node 调用 Personal Backend Function API
239
+
240
+ Personal Backend Function 通过数值型 `scriptId` 定位,`params` 必须是业务契约允许的对象。返回值是个人函数直接 `return` 的业务数据,不带 `execSuccess` 或 `execResult` 包装。
241
+
242
+ ```typescript
243
+ interface DashboardData {
244
+ userCount: number;
245
+ }
246
+
247
+ const personalBff = client?.personal?.bff;
248
+ if (typeof personalBff?.execute !== "function") {
249
+ throw new Error("client.personal.bff.execute is not available");
250
+ }
251
+
252
+ const dashboard = await personalBff.execute<DashboardData>({
253
+ scriptId: 123,
254
+ params: { userId: "123" },
255
+ });
256
+
257
+ if (!dashboard || typeof dashboard.userCount !== "number") {
258
+ throw new Error("Unexpected Personal Backend Function response");
259
+ }
260
+ ```
261
+
262
+ 认证边界:
263
+
264
+ - 浏览器 client 使用当前登录 Cookie。不要把 Cookie、AccessKey、SecretKey 或 token 写进前端源码、构建变量、页面配置或日志。
265
+ - Node 服务使用 Client AK 时,凭据只保存在服务端,并显式设置 `authMode: "client-ak"`。
266
+ - Personal Backend Function 不支持 `authMode: "openapi"`。
267
+
268
+ 兼容与 `undefined` 安全规则:
269
+
270
+ - 可选链只用于读取能力:`const personalBff = client?.personal?.bff`。
271
+ - 禁止调用 `client.personal?.bff?.execute?.(...)`。方法缺失时该写法会静默返回 `undefined`,无法与业务函数的空返回可靠区分。
272
+ - 能力不存在时立即抛出明确错误,提示升级到包含 `client.personal.bff.execute` 的 SDK 版本。
273
+ - 检测通过后通过 `personalBff.execute(...)` 调用;不要提取成 `const execute = personalBff.execute` 后裸调用,以免丢失方法上下文。
274
+ - 不以 `result === undefined` 作为能力检测;根据个人函数已确认的返回契约校验必需字段和空态。
275
+ - 接入页面前,先通过 `lovrabet personal-bff exec --id <id> --params '<json>' --format compress` 核对同一 `scriptId` 的字段、空态和错误形状。
276
+
238
277
  ## 异常处理底线
239
278
 
240
279
  所有通过 `client` 发起的网络调用都可能抛出 HTTP 级别的错误,AI 必须养成使用 `try...catch` 包裹代码的习惯,并识别 `LovrabetError`。
@@ -260,4 +299,7 @@ try {
260
299
  * [ ] `where` 对象里是否老老实实带了 `$eq` 等操作符?
261
300
  * [ ] 处理 SQL 的返回值时,判断了 `execSuccess` 吗?
262
301
  * [ ] 处理 Backend Function 的返回值时,是不是直接使用了业务数据?
302
+ * [ ] 调 Personal Backend Function 前,是否显式校验了 `client.personal.bff.execute`,且没有使用可选调用?
303
+ * [ ] 浏览器代码是否只依赖登录 Cookie,没有写入 Client AK 或其他凭据?
304
+ * [ ] 是否按已确认契约校验 Personal Backend Function 的返回形状,而不是用 `undefined` 猜测能力状态?
263
305
  * [ ] 加入了 `try...catch` 块防止整个应用崩溃吗?
@@ -1,6 +1,6 @@
1
1
  # api pull
2
2
 
3
- 拉取当前 App 下所有数据集(Dataset)的元信息,刷新 `src/api/sdk-config.ts`,并在 `api.ts` / `client.ts` **缺失时**写入 Cookie-first 脚手架。
3
+ 拉取当前 App 下所有数据集(Dataset)的元信息,刷新 `src/api/sdk-config.ts` 与项目根目录 `rabetbase.routing.json`,并在 `api.ts` / `client.ts` **缺失时**写入 Cookie-first 脚手架。
4
4
 
5
5
  已有 TypeScript **不会被覆盖**。Agent 必须用返回的 `data.models` 按 [`sdk-client-generation.md`](../guides/sdk-client-generation.md) 更新 `api.ts` / `client.ts`。人类若要重新得到脚手架,删除对应文件后再跑本命令。
6
6
 
@@ -48,7 +48,8 @@ rabetbase api pull --appcode app-order-001 --format compress
48
48
 
49
49
  | 文件 | 行为 |
50
50
  |------|------|
51
- | `sdk-config.ts` | **每次刷新**。只含 `region` / `runtimeDomain`,不含凭证 |
51
+ | `sdk-config.ts` | **每次刷新**。只含必要的 `region` / `runtimeDomain`,不含凭证 |
52
+ | `rabetbase.routing.json` | **每次刷新**。只含最终 Domain、资源策略与本地路由,不含凭证 |
52
53
  | `<prefix>-api.ts` | 文件缺失时写入脚手架(含当前 `models`);已存在则跳过 |
53
54
  | `<prefix>-client.ts` | 文件缺失时写入 Cookie-first `createClient`;已存在则跳过 |
54
55
 
@@ -65,12 +66,13 @@ rabetbase api pull --appcode app-order-001 --format compress
65
66
  | `isDefaultConfig` | 默认应用为 `true` |
66
67
  | `models[]` | `datasetCode` / `tableName` / `name` / `alias` |
67
68
  | `sdkRouting` | `{ region?: "id", runtimeDomain?: string }` |
69
+ | `projectRouting` | `{ path, manifest }`,manifest 为最终公开路由清单 |
68
70
  | `files.api` / `files.client` / `files.sdkConfig` | `{ path, action }`:`created` / `overwritten` / `preserved` / `refreshed` |
69
71
  | `needsAgentMerge` | 任一 TypeScript 被 `preserved` 时为 `true` |
70
72
  | `apiFilePath` / `clientFilePath` / `sdkConfigPath` | 与 `files.*.path` 相同 |
71
73
  | `modelCount` / `datasetCount` | 模型数量 |
72
74
 
73
- 多应用时 `data` 为 `{ apps, succeeded, failed }`。
75
+ 多应用时 `data` 为 `{ apps, succeeded, failed, projectRouting }`。
74
76
 
75
77
  ## 生成标识符
76
78
 
@@ -73,7 +73,9 @@ CLI 对旧版顶层 `appcode` 仍兼容读取,但它已经不是推荐主模
73
73
  "runtimeDomain": "https://custom-runtime.example.com",
74
74
  "skillDomain": "https://custom-skills.example.com",
75
75
  "kbDomain": "https://custom-kb.example.com",
76
- "appDomain": "https://custom-app.example.com"
76
+ "appDomain": "https://custom-app.example.com",
77
+ "localDomain": "https://custom-local.example.com",
78
+ "certificateDomain": "https://custom-cert.example.com"
77
79
  }
78
80
  ```
79
81
 
@@ -126,7 +128,7 @@ rabetbase workspace remove product --yes
126
128
  | `pageSize` | number | — | 默认分页大小,用于 `sql list` 等分页命令 |
127
129
  | `riskLevel` | string | `"write"` | 允许执行的最高风险等级。可选值:`read`、`write`、`high-risk-write` |
128
130
  | `apiDir` | string | `"./src/api"` | `api pull` 生成代码的输出目录 |
129
- | `region` | string | `"cn"`(省略) | 当前开放的官方节点快捷配置:`cn`、`id` |
131
+ | `region` | string | `"cn"`(省略) | 官方节点快捷配置:当前开放 `cn`、`id`;历史 `global` 配置仅保留读取兼容 |
130
132
  | `template_base_url` | string | 平台默认 CDN | 模板 CDN 基础 URL,一般无需修改 |
131
133
  | `defaultApp` | string | — | 多应用模式下的默认应用名称;单应用省略 |
132
134
  | `apps` | object | — | 多应用配置。key 为应用名,value 为 AppProfile(见下方) |
@@ -136,6 +138,8 @@ rabetbase workspace remove product --yes
136
138
  | `skillDomain` | string | 节点默认 | SkillHub HTTPS origin 覆盖 |
137
139
  | `kbDomain` | string | 跟随 `apiDomain` / 节点 API 默认值 | 企业知识库 HTTPS origin 覆盖;显式配置时优先,`runtimeDomain` 不参与回退 |
138
140
  | `appDomain` | string | 节点默认 | 工作台、页面编辑器和发布页面域名 |
141
+ | `localDomain` | string | 独立部署默认 `http://localhost` | 自定义 HTTPS 本地回调 origin;与 `certificateDomain` 同时配置 |
142
+ | `certificateDomain` | string | 节点默认;独立部署无 | 本地 HTTPS 证书服务 origin;与 `localDomain` 同时配置 |
139
143
 
140
144
  ### AppProfile 字段(`apps.*` 内的每个应用)
141
145
 
@@ -194,7 +198,7 @@ CLI flag (--appcode, --env, --format, --app ...)
194
198
  配置合并使用固定模型,`inherit` 不是受支持的配置项:
195
199
 
196
200
  - 项目显式值覆盖全局显式值。
197
- - 项目存在时,仅从全局白名单继承 `cookie`、`accessKey`、`locale`、`format`、`riskLevel`、`pageSize`、`region` 和六个 Domain(`userDomain` / `apiDomain` / `runtimeDomain` / `skillDomain` / `kbDomain` / `appDomain`);不继承 `apps` / `defaultApp` / `appcode` / `env`。
201
+ - 项目存在时,仅从全局白名单继承 `cookie`、`accessKey`、`locale`、`format`、`riskLevel`、`pageSize`、`region` 和显式 Domain(服务、本地回调、证书服务);不继承 `apps` / `defaultApp` / `appcode` 等项目状态。
198
202
  - `apps` / `defaultApp` 始终项目隔离,避免研发写操作落到全局应用。
199
203
  - `region` 是 Domain fallback profile;显式 Domain 按普通 key 继承和覆盖,不会被 `region` 清除或屏蔽。
200
204
  - `riskLevel` 始终取全局与项目顶层的更严格值,项目不能借配置覆盖提权。
@@ -323,7 +327,7 @@ rabetbase config set --key region --value id --global
323
327
  rabetbase config init --domain-config ./lovrabet-domains.json
324
328
  ```
325
329
 
326
- 该文件只接收 `userDomain`、`apiDomain`、`runtimeDomain`、`skillDomain`、`kbDomain`、`appDomain`;值必须是无 path/query/fragment 的 HTTPS origin。完整行为与命令行 flags 见 [`rabetbase config init`](rabetbase-init.md)。
330
+ 该文件接收六个服务 Domain,以及可选的 `localDomain`、`certificateDomain`;值必须是无 path/query/fragment 的 HTTPS origin。自定义 HTTPS 本地回调必须同时提供 `localDomain` 与 `certificateDomain`。完整行为与命令行 flags 见 [`rabetbase config init`](rabetbase-init.md)。
327
331
 
328
332
  也可以逐项覆盖:
329
333
 
@@ -337,4 +341,4 @@ rabetbase config set --key kbDomain --value https://your-kb.example.com --global
337
341
  rabetbase config set --key appDomain --value https://your-app.example.com --global
338
342
  ```
339
343
 
340
- 官方模式:`region` 内置完整 Domain 映射,默认 `cn`,配置文件可省略;`id` 只需保存 `"region": "id"`。企业独立部署模式才保存显式 Domain。项目级配置可覆盖全局配置;默认项目合并会继承全局节点配置。
344
+ 官方模式:`region` 内置 Routing Profile,默认 `cn`,配置文件可省略;当前新配置只开放 `cn`、`id`,`id` 需保存对应 region。历史文件中的 `global` 仍可读取,但不能通过 `config init` 或 `config set` 新写入。企业独立部署模式才保存显式 Domain。当前所有已开放节点和独立部署统一使用中国大陆 CDN 配置。项目级配置可覆盖全局配置;默认项目合并会继承全局节点配置。
@@ -2,7 +2,7 @@
2
2
 
3
3
  安全更新业务场景分组(`businessGroup`)。
4
4
 
5
- 本命令用于修改业务场景分组。它不同于 `dataset extend-update`:`extend-update` 当前可写 key 白名单为空,且不支持修改 `businessGroup`。
5
+ 使用 Dataset code 修改业务场景分组。DB_TABLE METADATA 可设置非空分组,METADATA 还可清空分组。
6
6
 
7
7
  ## 命令
8
8
 
@@ -18,7 +18,7 @@ rabetbase dataset business-group-update \
18
18
 
19
19
  确认 dry-run 结果无误后再去掉 `--dry-run` 执行。
20
20
 
21
- 清空当前业务场景分组:
21
+ 清空 METADATA Dataset 的当前业务场景分组:
22
22
 
23
23
  ```bash
24
24
  rabetbase dataset business-group-update \
@@ -35,7 +35,7 @@ rabetbase dataset business-group-update \
35
35
  | --- | --- | --- |
36
36
  | `--appcode <code>` | 否 | 目标应用编码;未配置默认 app 时必填 |
37
37
  | `--code <code>` | 是 | Dataset code,32 位 hex UUID |
38
- | `--business-group <name>` | 是 | 目标业务场景分组;保留值 `ungrouped` 表示清空 |
38
+ | `--business-group <name>` | 是 | 目标业务场景分组;METADATA 可用保留值 `ungrouped` 清空,DB_TABLE 不支持清空 |
39
39
  | `--expect-business-group <name>` | 否 | 当前业务场景分组保护;使用 `ungrouped` 表示期望当前未分组;不匹配即中止且不写入 |
40
40
  | `--dry-run` | 否 | 只返回 before/after 预览,不执行写入 |
41
41
  | `--format <fmt>` | 否 | 输出格式,AI Agent 优先用 `compress` |
@@ -43,9 +43,9 @@ rabetbase dataset business-group-update \
43
43
  ## 行为
44
44
 
45
45
  - 命令用 `--code` 定位 Dataset。
46
- - 当前值和写后校验都按 Dataset code 读取业务场景分组;不需要 `dblinkId`、`tableName` 或 `sourceType`。
47
- - `--business-group ungrouped` 表示清空业务场景分组;`ungrouped` 是保留值,不能作为分组名称使用。
48
- - 平台原始详情可能以空字符串返回 `businessGroup`,也可能省略 `extend.businessGroup`;CLI 会将这两种形态统一归一化为空字符串,表示未分组。
46
+ - DB_TABLE METADATA 都可设置非空业务场景分组。
47
+ - METADATA 使用 `--business-group ungrouped` 清空分组;DB_TABLE 使用该值时会失败且不写入。
48
+ - 当前分组为空、`null` 或字段缺失时统一显示为 `ungrouped`。
49
49
  - `--expect-business-group` 用于保护当前值;当前未分组时传 `ungrouped`,不匹配时中止且不写入。
50
50
  - `--dry-run` 只预览 before/after,不执行写入。
51
51
  - 正式写入后会校验目标值已生效。
@@ -81,11 +81,11 @@ rabetbase dataset business-group-update \
81
81
  ## 提示
82
82
 
83
83
  - 写入前必须先运行 `--dry-run`。
84
- - `businessGroup` 用于按业务场景组织 Dataset,而不是按数据库、表类型或服务名等技术结构分组。优先按业务场景命名并复用当前应用已有分组;需要跨领域消歧或沿用既有两级分组体系时,可使用 `<业务领域>---<业务场景>`,否则使用 `<业务场景>`。表数量不决定是否拆分层级。建议最多两级,层级不得为空或带首尾空白;使用保留值 `ungrouped` 清空。CLI 仅描述推荐格式并保持兼容,不额外拒绝历史非标准值。
84
+ - `businessGroup` 用于按业务场景组织 Dataset,而不是按数据库、表类型或服务名等技术结构分组。优先复用当前应用已有分组;需要跨领域消歧时可使用 `<业务领域>---<业务场景>`,否则使用 `<业务场景>`。建议最多两级,层级不得为空或带首尾空白。
85
+ - `ungrouped` 表示未分组;可用于 METADATA 清空和任意 Dataset 的当前值保护,不作为真实分组名称。
85
86
  - 推荐用 `--expect-business-group` 保护当前值。
86
87
  - 不确定 Dataset code 时,先用 `rabetbase dataset list --name <name> --format compress` 定位。
87
- - 业务场景分组只能使用本命令更新,不要通过 `dataset extend-update` 或 `/smartapi/dataset/update-driven-data` 修改。
88
- - `dataset extend-update` 当前可写 key 白名单为空;未来如开放其他 Dataset 顶层 `extend` 字段,以 `dataset extend-update` reference 为准。
88
+ - 业务场景分组只使用本命令更新。
89
89
 
90
90
  ## 参考
91
91
 
@@ -19,7 +19,7 @@ rabetbase dataset business-groups --dbid 10282 --format compress
19
19
 
20
20
  - `scope` 固定为 `DB_TABLE`。
21
21
  - `totalDatasetCount` 是该连接下参与统计的有效 DB_TABLE Dataset 数。
22
- - `groups[]` 只包含 `businessGroup` `datasetCount`;空字符串原样表示未分组。
22
+ - `groups[]` 每项只包含 `businessGroup` `datasetCount`;未分组项的 `businessGroup` 固定为 `ungrouped`。
23
23
  - 本命令不修改分组。写入仍使用 `dataset business-group-update --code ...`,建议先复用这里发现的已有业务场景名。
24
24
 
25
25
  ## 参考
@@ -0,0 +1,59 @@
1
+ # dataset field-restore
2
+
3
+ 恢复一个由用户明确删除的 Dataset 字段。命令只恢复 Dataset 字段元数据,不恢复或校验物理列,也不自动同步、保存或发布关联页面。
4
+
5
+ ## 安全流程
6
+
7
+ ```bash
8
+ rabetbase dataset user-deleted-field-list \
9
+ --code 1a90dbff5f094a9a89936fa99b10984c \
10
+ --format compress
11
+
12
+ rabetbase dataset field-restore \
13
+ --code 1a90dbff5f094a9a89936fa99b10984c \
14
+ --field space_type_code \
15
+ --dry-run \
16
+ --format compress
17
+
18
+ rabetbase dataset field-restore \
19
+ --code 1a90dbff5f094a9a89936fa99b10984c \
20
+ --field space_type_code \
21
+ --format compress
22
+ ```
23
+
24
+ ## 参数
25
+
26
+ | Flag | 必填 | 说明 |
27
+ |------|------|------|
28
+ | `--appcode <code>` | 否 | 目标应用编码;未配置默认 app 时必填 |
29
+ | `--code <code>` | 是 | Dataset code |
30
+ | `--field <code>` | 是 | 用户删除列表中的精确字段 code |
31
+ | `--dry-run` | 否 | 只预览唯一字段和写请求,不调用恢复接口 |
32
+ | `--format <fmt>` | 否 | 输出格式,AI Agent 优先用 `compress` |
33
+
34
+ `--field` 对应 `dataset detail` 归一化输出的 `data.fields[].name`,不是 `displayName`。命令不支持逗号批量、模糊匹配或交互选择;传入 `--all`、`--fields`、`--confirm` 或 `--yes` 会被明确拒绝。
35
+
36
+ ## 完成口径
37
+
38
+ 正式执行只提交一个 column ID。以下条件全部满足才返回 `ok=true`:
39
+
40
+ 1. 服务端实际恢复数量等于 `1`。
41
+ 2. 写后用户删除字段列表中已不存在目标 column ID。
42
+ 3. 写后 Dataset 活动字段集合中存在相同 ID 和 code。
43
+
44
+ dry-run 输出包含 `operation`、`selector`、`dataset`、`before/after`、`dryRun`、`backend`、`verification`、`warnings`,并以 `body` 精确展示 `{ datasetId, columnIds: [id] }`。正式执行的 `after` 来自真实回读,找不到活动字段时为 `null`。服务端返回 `0`、字段仍在删除列表或活动字段未出现时返回结构化失败,Agent 不得自动重试写请求。
45
+
46
+ ## 失败路径
47
+
48
+ - 找不到精确 field code:先重新运行 `user-deleted-field-list`,不要改用展示名猜测。
49
+ - 同一 field code 出现多条:视为服务端元数据歧义,命令在写入前中止。
50
+ - 写请求传输结果不确定:CLI 不会再次 POST,而会尝试双回读并返回 `ok=false`;只重新查询列表和详情,不要直接重试。
51
+ - 写后回读失败:保留已提交请求的 backend 上下文并返回 `ok=false`;只重新查询列表和详情,不要直接重试。
52
+ - 恢复成功但页面仍无字段:这是预期边界。单独评估页面状态,确有需要时显式执行 `rabetbase page sync`;字段恢复命令本身不调用页面同步。
53
+
54
+ ## 参考
55
+
56
+ - [dataset user-deleted-field-list](rabetbase-dataset-user-deleted-field-list.md)
57
+ - [dataset detail](rabetbase-dataset-detail.md)
58
+ - [page sync](rabetbase-page-sync.md)
59
+ - [SKILL.md](../SKILL.md)
@@ -0,0 +1,47 @@
1
+ # dataset user-deleted-field-list
2
+
3
+ 列出指定 Dataset 中由用户明确删除的字段。只读命令不会修改 Dataset、物理表或关联页面。
4
+
5
+ ## 命令
6
+
7
+ ```bash
8
+ rabetbase dataset user-deleted-field-list \
9
+ --code 1a90dbff5f094a9a89936fa99b10984c \
10
+ --format compress
11
+ ```
12
+
13
+ ## 参数
14
+
15
+ | Flag | 必填 | 说明 |
16
+ |------|------|------|
17
+ | `--appcode <code>` | 否 | 目标应用编码;未配置默认 app 时必填 |
18
+ | `--code <code>` | 是 | Dataset code |
19
+ | `--format <fmt>` | 否 | 输出格式,AI Agent 优先用 `compress` |
20
+
21
+ ## 输出与语义
22
+
23
+ - 输出 `operation`、Dataset 摘要、`count` 和排序稳定的 `fields`。
24
+ - 每个字段只包含 `id`、`code`、`displayName`、`deleted=true`、`deletionSource=user`。
25
+ - 不透传服务端原始 `extend` 或 `_userModifiedKeys`。
26
+ - 空列表正常返回 `ok=true` 和 `count=0`。
27
+ - 这里只包含用户删除墓碑字段,不包含没有用户墓碑的普通 AI 软删字段。
28
+
29
+ DB 分析 `SUCCESS` 表示任务按当前规则完成;用户删除墓碑会阻止同名物理列自动重新生成。因此排查“物理列存在但 Dataset 字段缺失”时,先运行本命令。
30
+
31
+ ## 后续恢复
32
+
33
+ 需要恢复时,将返回的精确 `fields[].code` 传给 `field-restore --field`。不要传展示名或字段 ID:
34
+
35
+ ```bash
36
+ rabetbase dataset field-restore \
37
+ --code 1a90dbff5f094a9a89936fa99b10984c \
38
+ --field space_type_code \
39
+ --dry-run \
40
+ --format compress
41
+ ```
42
+
43
+ ## 参考
44
+
45
+ - [dataset field-restore](rabetbase-dataset-field-restore.md)
46
+ - [dataset detail](rabetbase-dataset-detail.md)
47
+ - [SKILL.md](../SKILL.md)