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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/README.md +4 -4
  2. package/lib/api/api-doc.js +1 -1
  3. package/lib/api/fetch-model-list.js +1 -1
  4. package/lib/api/generate-api-file.js +1 -1
  5. package/lib/auth/auth-server-ui.js +1 -1
  6. package/lib/auth/auth-server.js +1 -1
  7. package/lib/auth/constant.js +1 -1
  8. package/lib/auth/get-cookie.js +1 -1
  9. package/lib/auth/get-session-user.js +1 -1
  10. package/lib/auth/is-session-valid.js +1 -1
  11. package/lib/auth/login-success-html.js +1 -1
  12. package/lib/auth/logout.js +1 -1
  13. package/lib/cli-flags.js +1 -1
  14. package/lib/cli.js +1 -1
  15. package/lib/commands/api/generate.js +1 -1
  16. package/lib/commands/api/index.js +1 -1
  17. package/lib/commands/api/list.js +1 -1
  18. package/lib/commands/api/pull.js +1 -1
  19. package/lib/commands/api/shared.js +1 -1
  20. package/lib/commands/app/index.js +1 -1
  21. package/lib/commands/app/list.js +1 -1
  22. package/lib/commands/app/members-list.js +1 -1
  23. package/lib/commands/app/remote-directory.js +1 -1
  24. package/lib/commands/app/shared.js +1 -1
  25. package/lib/commands/app-config/delete.js +1 -1
  26. package/lib/commands/app-config/get.js +1 -1
  27. package/lib/commands/app-config/index.js +1 -1
  28. package/lib/commands/app-config/list.js +1 -1
  29. package/lib/commands/app-config/set.js +1 -1
  30. package/lib/commands/app-config/shared.js +1 -1
  31. package/lib/commands/auth/index.js +1 -1
  32. package/lib/commands/bff/create.js +1 -1
  33. package/lib/commands/bff/delete.js +1 -1
  34. package/lib/commands/bff/detail.js +1 -1
  35. package/lib/commands/bff/index.js +1 -1
  36. package/lib/commands/bff/list.js +1 -1
  37. package/lib/commands/bff/pull.js +1 -1
  38. package/lib/commands/bff/push.js +1 -1
  39. package/lib/commands/bff/status.js +1 -1
  40. package/lib/commands/cli-skill/index.js +1 -1
  41. package/lib/commands/cli-update.js +1 -1
  42. package/lib/commands/codegen/index.js +1 -1
  43. package/lib/commands/codegen/sdk.js +1 -1
  44. package/lib/commands/codegen/sql.js +1 -1
  45. package/lib/commands/common/app-registry.js +1 -1
  46. package/lib/commands/common/app-selector.js +1 -1
  47. package/lib/commands/common/async-task.js +1 -1
  48. package/lib/commands/common/dry-run.js +1 -1
  49. package/lib/commands/common/flags.d.ts +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/get.js +1 -1
  54. package/lib/commands/config/index.js +1 -1
  55. package/lib/commands/config/list.js +1 -1
  56. package/lib/commands/config/set.js +1 -1
  57. package/lib/commands/config/shared.js +1 -1
  58. package/lib/commands/data/filter.js +1 -1
  59. package/lib/commands/data/getOne.js +1 -1
  60. package/lib/commands/data/index.js +1 -1
  61. package/lib/commands/data/shared.js +1 -1
  62. package/lib/commands/dataset/business-group-update.js +1 -1
  63. package/lib/commands/dataset/business-groups.js +1 -1
  64. package/lib/commands/dataset/capability.js +1 -1
  65. package/lib/commands/dataset/delete.js +1 -1
  66. package/lib/commands/dataset/detail.js +1 -1
  67. package/lib/commands/dataset/extend-update.js +1 -1
  68. package/lib/commands/dataset/field-update.js +1 -1
  69. package/lib/commands/dataset/generate.js +1 -1
  70. package/lib/commands/dataset/index.js +1 -1
  71. package/lib/commands/dataset/list.js +1 -1
  72. package/lib/commands/dataset/operations.js +1 -1
  73. package/lib/commands/dataset/relation-audit.js +1 -1
  74. package/lib/commands/dataset/relation-create.js +1 -1
  75. package/lib/commands/dataset/relation-delete.js +1 -1
  76. package/lib/commands/dataset/relation-shared.js +1 -1
  77. package/lib/commands/dataset/relation-update.js +1 -1
  78. package/lib/commands/dataset/relations.js +1 -1
  79. package/lib/commands/dataset/rename.js +1 -1
  80. package/lib/commands/dataset/restore.js +1 -1
  81. package/lib/commands/db/analysis-batching.js +1 -1
  82. package/lib/commands/db/analyze-batch-plan.js +1 -1
  83. package/lib/commands/db/analyze-cancel.js +1 -1
  84. package/lib/commands/db/analyze-start.js +1 -1
  85. package/lib/commands/db/analyze-status.js +1 -1
  86. package/lib/commands/db/create.js +1 -1
  87. package/lib/commands/db/delete.js +1 -1
  88. package/lib/commands/db/detail.js +1 -1
  89. package/lib/commands/db/diff-refresh-start.js +1 -1
  90. package/lib/commands/db/diff-refresh-status.js +1 -1
  91. package/lib/commands/db/diff.js +1 -1
  92. package/lib/commands/db/index.js +1 -1
  93. package/lib/commands/db/list.js +1 -1
  94. package/lib/commands/db/shared.js +1 -1
  95. package/lib/commands/db/tables.js +1 -1
  96. package/lib/commands/db/test.js +1 -1
  97. package/lib/commands/db/update.js +1 -1
  98. package/lib/commands/doctor.js +1 -1
  99. package/lib/commands/file/index.js +1 -1
  100. package/lib/commands/init/index.js +1 -1
  101. package/lib/commands/issue/index.js +1 -1
  102. package/lib/commands/issue/nudge.js +1 -1
  103. package/lib/commands/issue/report.js +1 -1
  104. package/lib/commands/issue/shared.js +1 -1
  105. package/lib/commands/kb/create.js +1 -1
  106. package/lib/commands/kb/delete.js +1 -1
  107. package/lib/commands/kb/detail.js +1 -1
  108. package/lib/commands/kb/index.js +1 -1
  109. package/lib/commands/kb/list.js +1 -1
  110. package/lib/commands/kb/search.js +1 -1
  111. package/lib/commands/kb/shared.js +1 -1
  112. package/lib/commands/kb/update.js +1 -1
  113. package/lib/commands/logs/index.js +1 -1
  114. package/lib/commands/menu/asset-update.js +1 -1
  115. package/lib/commands/menu/delete.js +1 -1
  116. package/lib/commands/menu/external-link-create.js +1 -1
  117. package/lib/commands/menu/external-link-update.js +1 -1
  118. package/lib/commands/menu/group-create.js +1 -1
  119. package/lib/commands/menu/group-update.js +1 -1
  120. package/lib/commands/menu/index.js +1 -1
  121. package/lib/commands/menu/list.js +1 -1
  122. package/lib/commands/menu/move.js +1 -1
  123. package/lib/commands/menu/regroup-start.js +1 -1
  124. package/lib/commands/menu/rename.js +1 -1
  125. package/lib/commands/menu/shared/compare-table.js +1 -1
  126. package/lib/commands/menu/shared/delete-plan.js +1 -1
  127. package/lib/commands/menu/shared/facts.js +1 -1
  128. package/lib/commands/menu/shared/index.js +1 -1
  129. package/lib/commands/menu/shared/inquirer.js +1 -1
  130. package/lib/commands/menu/shared/local-pages.js +1 -1
  131. package/lib/commands/menu/shared/logic.js +1 -1
  132. package/lib/commands/menu/shared/mutations.js +1 -1
  133. package/lib/commands/menu/shared/service.js +1 -1
  134. package/lib/commands/menu/shared/sync-core.js +1 -1
  135. package/lib/commands/menu/shared/update-core.js +1 -1
  136. package/lib/commands/menu/shared/valid-url.js +1 -1
  137. package/lib/commands/menu/sync.js +1 -1
  138. package/lib/commands/menu/visibility-update.js +1 -1
  139. package/lib/commands/notification/config-create.js +1 -1
  140. package/lib/commands/notification/config-delete.js +1 -1
  141. package/lib/commands/notification/config-list.js +1 -1
  142. package/lib/commands/notification/config-update.js +1 -1
  143. package/lib/commands/notification/index.js +1 -1
  144. package/lib/commands/notification/shared.js +1 -1
  145. package/lib/commands/ocr/index.js +1 -1
  146. package/lib/commands/page/create.js +1 -1
  147. package/lib/commands/page/custom/detail.js +1 -1
  148. package/lib/commands/page/custom/list.js +1 -1
  149. package/lib/commands/page/custom/publish.js +1 -1
  150. package/lib/commands/page/custom/shared.js +1 -1
  151. package/lib/commands/page/custom/syntax.js +1 -1
  152. package/lib/commands/page/custom/template.js +1 -1
  153. package/lib/commands/page/custom/update.js +1 -1
  154. package/lib/commands/page/data-list-status.js +1 -1
  155. package/lib/commands/page/generate-start.js +1 -1
  156. package/lib/commands/page/generate-status.js +1 -1
  157. package/lib/commands/page/index.js +1 -1
  158. package/lib/commands/page/pull.js +1 -1
  159. package/lib/commands/page/push.js +1 -1
  160. package/lib/commands/page/relation-audit.js +1 -1
  161. package/lib/commands/page/restore.js +1 -1
  162. package/lib/commands/page/shared.js +1 -1
  163. package/lib/commands/page/sync.js +1 -1
  164. package/lib/commands/project/create/enhanced-guided-create.js +1 -1
  165. package/lib/commands/project/create/format-elapsed.js +1 -1
  166. package/lib/commands/project/create/main.js +1 -1
  167. package/lib/commands/project/create/materialize-project-template.js +1 -1
  168. package/lib/commands/project/create/project-name.js +1 -1
  169. package/lib/commands/project/create/project-template-archive.js +1 -1
  170. package/lib/commands/project/create/project-template-path.js +1 -1
  171. package/lib/commands/project/create/use-copy-project-template.js +1 -1
  172. package/lib/commands/project/create/use-format-code.js +1 -1
  173. package/lib/commands/project/create/use-install-dependencies.js +1 -1
  174. package/lib/commands/project/index.js +1 -1
  175. package/lib/commands/project/upgrade.js +1 -1
  176. package/lib/commands/registry.js +1 -1
  177. package/lib/commands/role/delete.js +1 -1
  178. package/lib/commands/role/detail.js +1 -1
  179. package/lib/commands/role/index.js +1 -1
  180. package/lib/commands/role/list.js +1 -1
  181. package/lib/commands/role/shared.js +1 -1
  182. package/lib/commands/role/update.js +1 -1
  183. package/lib/commands/role/user-add.js +1 -1
  184. package/lib/commands/role/user-remove.js +1 -1
  185. package/lib/commands/role/user-resolve.js +1 -1
  186. package/lib/commands/run/index.js +1 -1
  187. package/lib/commands/schema.js +1 -1
  188. package/lib/commands/sql/create.js +1 -1
  189. package/lib/commands/sql/delete.js +1 -1
  190. package/lib/commands/sql/detail.js +1 -1
  191. package/lib/commands/sql/exec.js +1 -1
  192. package/lib/commands/sql/index.js +1 -1
  193. package/lib/commands/sql/list.js +1 -1
  194. package/lib/commands/sql/pull.js +1 -1
  195. package/lib/commands/sql/push.js +1 -1
  196. package/lib/commands/sql/shared.js +1 -1
  197. package/lib/commands/sql/status.js +1 -1
  198. package/lib/commands/sql/validate.js +1 -1
  199. package/lib/commands/task/index.js +1 -1
  200. package/lib/commands/task/status.js +1 -1
  201. package/lib/commands/tenant/index.js +1 -1
  202. package/lib/commands/tenant/members-list.js +1 -1
  203. package/lib/commands/tenant/shared.js +1 -1
  204. package/lib/commands/user-account/dingding-sandbox-bind.js +1 -1
  205. package/lib/commands/user-account/index.js +1 -1
  206. package/lib/commands/workspace/add.js +1 -1
  207. package/lib/commands/workspace/index.js +1 -1
  208. package/lib/commands/workspace/remove.js +1 -1
  209. package/lib/config/schema.js +1 -1
  210. package/lib/constant/cdn.js +1 -1
  211. package/lib/constant/cli.js +1 -1
  212. package/lib/constant/defaults.js +1 -1
  213. package/lib/constant/domain.js +1 -1
  214. package/lib/constant/env.js +1 -1
  215. package/lib/constant/output.js +1 -1
  216. package/lib/constant/paths.js +1 -1
  217. package/lib/constant/risk.js +1 -1
  218. package/lib/context/app-resolver.js +1 -1
  219. package/lib/context/auth-resolver.js +1 -1
  220. package/lib/context/config-loader.js +1 -1
  221. package/lib/context.js +1 -1
  222. package/lib/core/alias-resolver.js +1 -1
  223. package/lib/core/api-client.d.ts +1 -1
  224. package/lib/core/api-client.js +1 -1
  225. package/lib/core/bff/config.d.ts +1 -1
  226. package/lib/core/bff/config.js +1 -1
  227. package/lib/core/bff/file-system.d.ts +1 -1
  228. package/lib/core/bff/file-system.js +1 -1
  229. package/lib/core/bff/hash.d.ts +1 -1
  230. package/lib/core/bff/hash.js +1 -1
  231. package/lib/core/bff/lock.d.ts +2 -2
  232. package/lib/core/bff/lock.js +1 -1
  233. package/lib/core/bff/types.d.ts +1 -1
  234. package/lib/core/bff/utils.d.ts +2 -2
  235. package/lib/core/bff/utils.js +1 -1
  236. package/lib/core/db-resolver.js +1 -1
  237. package/lib/core/page/file-system.js +1 -1
  238. package/lib/core/page/hash.js +1 -1
  239. package/lib/core/page/lock.js +1 -1
  240. package/lib/core/sql-index-auditor.js +1 -1
  241. package/lib/core/sql-sync/config.js +1 -1
  242. package/lib/core/sql-sync/file-system.js +1 -1
  243. package/lib/core/sql-sync/hash.js +1 -1
  244. package/lib/core/sql-sync/lock.js +1 -1
  245. package/lib/core/sql-sync/utils.js +1 -1
  246. package/lib/core/sql-validator.js +1 -1
  247. package/lib/errors.js +1 -1
  248. package/lib/framework/build-all-flags.js +1 -1
  249. package/lib/framework/error-output.js +1 -1
  250. package/lib/framework/explicit-yes.js +1 -1
  251. package/lib/framework/flags.js +1 -1
  252. package/lib/framework/help.js +1 -1
  253. package/lib/framework/index.js +1 -1
  254. package/lib/framework/output.js +1 -1
  255. package/lib/framework/response.js +1 -1
  256. package/lib/framework/runner-alias.js +1 -1
  257. package/lib/framework/runner.js +1 -1
  258. package/lib/framework/schema-export.js +1 -1
  259. package/lib/framework/types.js +1 -1
  260. package/lib/generated/build-info.d.ts +4 -4
  261. package/lib/generated/build-info.js +1 -1
  262. package/lib/help.js +1 -1
  263. package/lib/postinstall.js +1 -1
  264. package/lib/runtime/confirmation.js +1 -1
  265. package/lib/runtime/event.js +1 -1
  266. package/lib/runtime/index.js +1 -1
  267. package/lib/runtime/queue.js +1 -1
  268. package/lib/runtime/resolve.js +1 -1
  269. package/lib/skills/builtin-skill.js +1 -1
  270. package/lib/skills/main.js +1 -1
  271. package/lib/skills/npx-skills-add.js +1 -1
  272. package/lib/skills/skill-presence.js +1 -1
  273. package/lib/telemetry/cli-command-trace.js +1 -1
  274. package/lib/telemetry/cli-help-trace.js +1 -1
  275. package/lib/telemetry/ensure-cli-otel-config.js +1 -1
  276. package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
  277. package/lib/telemetry/send-cli-trace-log.js +1 -1
  278. package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
  279. package/lib/utils/ai_config.js +1 -1
  280. package/lib/utils/apply-jq-filter.js +1 -1
  281. package/lib/utils/cdn-config.js +1 -1
  282. package/lib/utils/check-sdk-version.js +1 -1
  283. package/lib/utils/cli-version-check.js +1 -1
  284. package/lib/utils/cli-version-policy.js +1 -1
  285. package/lib/utils/config.js +1 -1
  286. package/lib/utils/entity-with-id.js +1 -1
  287. package/lib/utils/file-utils.js +1 -1
  288. package/lib/utils/guides-cdn.js +1 -1
  289. package/lib/utils/http-client.js +1 -1
  290. package/lib/utils/is-non-interactive.js +1 -1
  291. package/lib/utils/logger.js +1 -1
  292. package/lib/utils/params.js +1 -1
  293. package/lib/utils/platform.js +1 -1
  294. package/lib/utils/rules-cdn.js +1 -1
  295. package/lib/utils/sleep.js +1 -1
  296. package/lib/utils/template-replacer.js +1 -1
  297. package/lib/utils/update-notice.js +1 -1
  298. package/lib/utils/version.js +1 -1
  299. package/lib/utils/with-active-cookie.js +1 -1
  300. package/lib/utils/write-cli-side-channel.js +1 -1
  301. package/package.json +2 -2
  302. package/sidecar/flags.json +1 -1
  303. package/skills/rabetbase/SKILL.md +28 -28
  304. package/skills/rabetbase/guides/backend-function.md +30 -30
  305. package/skills/rabetbase/guides/best-practices.md +8 -8
  306. package/skills/rabetbase/guides/bff-creation-workflow.md +16 -16
  307. package/skills/rabetbase/guides/conflict-detection.md +3 -3
  308. package/skills/rabetbase/guides/custom-page-workflow.md +8 -8
  309. package/skills/rabetbase/guides/data-api-guidelines.md +6 -6
  310. package/skills/rabetbase/guides/legacy-application-blueprint-workflow.md +8 -8
  311. package/skills/rabetbase/guides/sql-creation-workflow.md +2 -2
  312. package/skills/rabetbase/guides/troubleshooting.md +6 -6
  313. package/skills/rabetbase/guides/typescript-sdk.md +10 -10
  314. package/skills/rabetbase/knowledge/page-schema/LrSmartTable.md +1 -1
  315. package/skills/rabetbase/knowledge/page-schema/external-resources-usage.md +10 -10
  316. package/skills/rabetbase/references/rabetbase-app-config.md +2 -2
  317. package/skills/rabetbase/references/rabetbase-bff-create.md +3 -3
  318. package/skills/rabetbase/references/rabetbase-bff-delete.md +1 -1
  319. package/skills/rabetbase/references/rabetbase-bff-detail.md +4 -4
  320. package/skills/rabetbase/references/rabetbase-bff-list.md +8 -8
  321. package/skills/rabetbase/references/rabetbase-bff-pull.md +1 -1
  322. package/skills/rabetbase/references/rabetbase-bff-push.md +3 -3
  323. package/skills/rabetbase/references/rabetbase-bff-status.md +1 -1
  324. package/skills/rabetbase/references/rabetbase-codegen-sql.md +3 -3
  325. package/skills/rabetbase/references/rabetbase-dataset-detail.md +1 -1
  326. package/skills/rabetbase/references/rabetbase-notification-config-list.md +3 -3
  327. package/skills/rabetbase.manifest.json +3 -3
  328. package/templates/rules/lovrabet_rules.mdc.tpl +7 -7
  329. package/templates/skill/SKILL.md.tpl +12 -12
@@ -1 +1 @@
1
- function a291_0x5b81(_0xf03153,_0x365544){_0xf03153=_0xf03153-0x1d4;const _0x97af6f=a291_0x97af();let _0x5b819a=_0x97af6f[_0xf03153];return _0x5b819a;}const a291_0xf68bec=a291_0x5b81;function a291_0x97af(){const _0x187092=['开始处理模板内容替换','.js','3kGbKPv','datasetCode','toComponentName','1312764ediwxE','message','.scss','tableName:\x20\x22','alias','getMonth','split','api','mkdir','padStart','getMinutes','.jsx','utf8','getHours','231745PwGpUH','replace','datasetCode:\x20\x22','error','map','extname','.css','.json','toDisplayTitle','processDirectory','promises','alias:\x20\x22','1tHotMa','template','replaceApiContent','.tpl','pop','.md','模板内容替换完成','now','readdir','getDate','tableName','750gktdOD','getFullYear','includes','charAt','toLowerCase','25362XMbHSJ','processFile','模板内容替换失败','1706488rRqavg','YourModel','name','replaceContent','default','join','endsWith','success','pad','isDirectory','formatLocalTimestamp','toISOString','245360VbOTor','1721888qXNAMI','toUpperCase','166604Zdrixj','info'];a291_0x97af=function(){return _0x187092;};return a291_0x97af();}(function(_0x38d678,_0x5acfb2){const _0x201c8a=a291_0x5b81,_0x19a8ed=_0x38d678();while(!![]){try{const _0x6e2566=-parseInt(_0x201c8a(0x1f5))/0x1*(-parseInt(_0x201c8a(0x1d4))/0x2)+-parseInt(_0x201c8a(0x1d8))/0x3*(-parseInt(_0x201c8a(0x214))/0x4)+-parseInt(_0x201c8a(0x1e9))/0x5+-parseInt(_0x201c8a(0x1db))/0x6+parseInt(_0x201c8a(0x215))/0x7+-parseInt(_0x201c8a(0x208))/0x8+-parseInt(_0x201c8a(0x205))/0x9*(-parseInt(_0x201c8a(0x200))/0xa);if(_0x6e2566===_0x5acfb2)break;else _0x19a8ed['push'](_0x19a8ed['shift']());}catch(_0x3725ad){_0x19a8ed['push'](_0x19a8ed['shift']());}}}(a291_0x97af,0x1e282));import a291_0x336cd8 from'node:fs';import a291_0xb9a9ec from'node:path';import{logger}from'../utils/logger.js';import{getCliVersion}from'../utils/version.js';const CLI_VERSION=getCliVersion();export class TemplateReplacer{static[a291_0xf68bec(0x210)](_0xf1dd71){const _0x56c2f4=a291_0xf68bec;return String(_0xf1dd71)[_0x56c2f4(0x1e4)](0x2,'0');}static[a291_0xf68bec(0x212)](_0x1cf73e){const _0x1ab6c7=a291_0xf68bec,_0x3adb3a=_0x1cf73e[_0x1ab6c7(0x201)](),_0x4bec17=this[_0x1ab6c7(0x210)](_0x1cf73e[_0x1ab6c7(0x1e0)]()+0x1),_0xc834f3=this[_0x1ab6c7(0x210)](_0x1cf73e[_0x1ab6c7(0x1fe)]()),_0x389b6f=this[_0x1ab6c7(0x210)](_0x1cf73e[_0x1ab6c7(0x1e8)]()),_0x4c7c57=this[_0x1ab6c7(0x210)](_0x1cf73e[_0x1ab6c7(0x1e5)]()),_0x757791=this[_0x1ab6c7(0x210)](_0x1cf73e['getSeconds']());return{'createdAt':_0x3adb3a+'-'+_0x4bec17+'-'+_0xc834f3+'\x20'+_0x389b6f+':'+_0x4c7c57+':'+_0x757791,'createdDate':_0x3adb3a+'-'+_0x4bec17+'-'+_0xc834f3,'createdTime':_0x389b6f+':'+_0x4c7c57+':'+_0x757791};}static[a291_0xf68bec(0x1da)](_0x51d70f){const _0x2016b4=a291_0xf68bec,_0xfc6343=_0x51d70f[_0x2016b4(0x1e1)]('/')[_0x2016b4(0x1f9)]()||_0x51d70f;return _0xfc6343[_0x2016b4(0x1e1)]('-')[_0x2016b4(0x1ed)](_0x2e1c93=>_0x2e1c93['charAt'](0x0)[_0x2016b4(0x216)]()+_0x2e1c93['slice'](0x1)[_0x2016b4(0x204)]())['join']('');}static[a291_0xf68bec(0x1f1)](_0x155b5f){const _0x464d61=a291_0xf68bec,_0x1a07e5=_0x155b5f['split']('/')[_0x464d61(0x1f9)]()||_0x155b5f;return _0x1a07e5['split']('-')['map'](_0x171a9d=>_0x171a9d[_0x464d61(0x203)](0x0)['toUpperCase']()+_0x171a9d['slice'](0x1)[_0x464d61(0x204)]())[_0x464d61(0x20d)]('\x20');}static['replaceContent'](_0x5bfaa2,_0x4d718e,_0x1cd995){const _0x1253b0=a291_0xf68bec,_0x14738d=this['toComponentName'](_0x4d718e),_0x107a34=this[_0x1253b0(0x1f1)](_0x4d718e),{createdAt:_0x450ad9,createdDate:_0xa744e8,createdTime:_0x2b7cba}=this[_0x1253b0(0x212)](new Date());let _0x594b3d=_0x5bfaa2[_0x1253b0(0x1ea)](/\{CliVersion\}/g,CLI_VERSION)['replace'](/\{ComponentName\}/g,_0x14738d)[_0x1253b0(0x1ea)](/\{DisplayTitle\}/g,_0x107a34)[_0x1253b0(0x1ea)](/\{PageName\}/g,_0x4d718e)[_0x1253b0(0x1ea)](/\{TemplateName\}/g,_0x1cd995)[_0x1253b0(0x1ea)](/\{CreatedAt\}/g,_0x450ad9)[_0x1253b0(0x1ea)](/\{CreatedDate\}/g,_0xa744e8)[_0x1253b0(0x1ea)](/\{CreatedTime\}/g,_0x2b7cba);return _0x594b3d;}static[a291_0xf68bec(0x1f7)](_0x2525de,_0x4f7d83,_0x422620,_0x4b2ce5,_0x35e38a,_0x4155a9,_0x1d9fc5,_0x1cc8f8){const _0x2c855d=a291_0xf68bec,_0x4be35f=new Date(),_0x193525=_0x4be35f[_0x2c855d(0x213)](),_0x31ebba=_0x422620[_0x2c855d(0x1ed)](_0x44cc2d=>{const _0x5d1dea=_0x2c855d,_0x4e0c67=[_0x5d1dea(0x1eb)+_0x44cc2d[_0x5d1dea(0x1d9)]+'\x22',_0x5d1dea(0x1de)+_0x44cc2d[_0x5d1dea(0x1ff)]+'\x22','name:\x20\x22'+_0x44cc2d[_0x5d1dea(0x20a)]+'\x22'];return _0x44cc2d[_0x5d1dea(0x1df)]&&_0x4e0c67['push'](_0x5d1dea(0x1f4)+_0x44cc2d['alias']+'\x22'),'\x0a\x20\x20\x20\x20{\x20'+_0x4e0c67['join'](',\x20')+'\x20},';})['join'](''),_0x3eb538=_0x4b2ce5||_0x422620[0x0]?.['alias']||_0x2c855d(0x209);let _0xc292ec=_0x2525de[_0x2c855d(0x1ea)](/\{AppCode\}/g,_0x4f7d83)[_0x2c855d(0x1ea)](/\{ModelConfigs\}/g,_0x31ebba)[_0x2c855d(0x1ea)](/\{ExampleModelName\}/g,_0x3eb538)[_0x2c855d(0x1ea)](/\{ApiFileName\}/g,_0x35e38a||_0x2c855d(0x1e2))[_0x2c855d(0x1ea)](/\{ConfigName\}/g,_0x4155a9||_0x2c855d(0x20c))[_0x2c855d(0x1ea)](/\{ClientConfigParam\}/g,_0x1d9fc5||'')['replace'](/\{VarPrefix\}/g,_0x1cc8f8||'LOVRABET')['replace'](/\{CreatedAt\}/g,_0x193525);return _0xc292ec;}static async['processTemplate'](_0x5dda51,_0x4bb4c9,_0x4615ba,_0x4ba5b8,_0x2d9b76=!![]){const _0x5468c0=a291_0xf68bec,_0x13b069=Date[_0x5468c0(0x1fc)]();try{_0x2d9b76&&logger[_0x5468c0(0x1d5)]('template',_0x5468c0(0x1d6),{'templatePath':_0x5dda51,'targetPath':_0x4bb4c9,'pageName':_0x4615ba,'templateName':_0x4ba5b8});await a291_0x336cd8[_0x5468c0(0x1f3)][_0x5468c0(0x1e3)](_0x4bb4c9,{'recursive':!![]}),await this[_0x5468c0(0x1f2)](_0x5dda51,_0x4bb4c9,_0x4615ba,_0x4ba5b8);if(_0x2d9b76){const _0x4e1fd6=Date[_0x5468c0(0x1fc)]()-_0x13b069;logger[_0x5468c0(0x20f)](_0x5468c0(0x1f6),_0x5468c0(0x1fb),_0x4e1fd6,{'pageName':_0x4615ba,'templateName':_0x4ba5b8});}}catch(_0x3a56d4){if(_0x2d9b76){const _0x4b911b=Date[_0x5468c0(0x1fc)]()-_0x13b069;logger[_0x5468c0(0x1ec)]('template',_0x5468c0(0x207),{'templatePath':_0x5dda51,'targetPath':_0x4bb4c9,'pageName':_0x4615ba,'templateName':_0x4ba5b8,'error':_0x3a56d4 instanceof Error?_0x3a56d4[_0x5468c0(0x1dc)]:String(_0x3a56d4),'duration':_0x4b911b});}throw _0x3a56d4;}}static async[a291_0xf68bec(0x1f2)](_0xc466af,_0xb08441,_0x920b80,_0x236c34){const _0x3402eb=a291_0xf68bec,_0x2f5102=await a291_0x336cd8[_0x3402eb(0x1f3)][_0x3402eb(0x1fd)](_0xc466af,{'withFileTypes':!![]});for(const _0x55087e of _0x2f5102){const _0x31dc82=a291_0xb9a9ec[_0x3402eb(0x20d)](_0xc466af,_0x55087e[_0x3402eb(0x20a)]);let _0x4e7a39=a291_0xb9a9ec[_0x3402eb(0x20d)](_0xb08441,_0x55087e[_0x3402eb(0x20a)]);_0x55087e['name'][_0x3402eb(0x20e)]('.tpl')&&(_0x4e7a39=a291_0xb9a9ec['join'](_0xb08441,_0x55087e[_0x3402eb(0x20a)]['replace'](/\.tpl$/,'')));if(_0x55087e[_0x3402eb(0x211)]())await a291_0x336cd8['promises'][_0x3402eb(0x1e3)](_0x4e7a39,{'recursive':!![]}),await this[_0x3402eb(0x1f2)](_0x31dc82,_0x4e7a39,_0x920b80,_0x236c34);else _0x55087e['isFile']()&&await this[_0x3402eb(0x206)](_0x31dc82,_0x4e7a39,_0x920b80,_0x236c34);}}static async[a291_0xf68bec(0x206)](_0xcc32cf,_0x17b29e,_0x177032,_0x172137){const _0x2f9500=a291_0xf68bec,_0x3d9235=a291_0xb9a9ec[_0x2f9500(0x1ee)](_0xcc32cf)[_0x2f9500(0x204)]();_0xcc32cf[_0x2f9500(0x20e)](_0x2f9500(0x1f8))&&(_0x17b29e=_0x17b29e[_0x2f9500(0x1ea)](/\.tpl$/,''));const _0x4be6e0=['.tsx','.ts',_0x2f9500(0x1e6),_0x2f9500(0x1d7),_0x2f9500(0x1f0),_0x2f9500(0x1fa),_0x2f9500(0x1ef),_0x2f9500(0x1dd),_0x2f9500(0x1f8)];if(_0x4be6e0[_0x2f9500(0x202)](_0x3d9235)||_0xcc32cf[_0x2f9500(0x20e)]('.tpl')){const _0x332886=await a291_0x336cd8[_0x2f9500(0x1f3)]['readFile'](_0xcc32cf,_0x2f9500(0x1e7)),_0x2562ff=this[_0x2f9500(0x20b)](_0x332886,_0x177032,_0x172137);await a291_0x336cd8[_0x2f9500(0x1f3)]['writeFile'](_0x17b29e,_0x2562ff,_0x2f9500(0x1e7));}else await a291_0x336cd8[_0x2f9500(0x1f3)]['copyFile'](_0xcc32cf,_0x17b29e);}}
1
+ function a291_0x13c1(){const _0x1c28ec=['\x0a\x20\x20\x20\x20{\x20','alias:\x20\x22','readdir','.md','datasetCode:\x20\x22','.scss','extname','8YcvpNJ','info','error','split','replaceContent','api','includes','formatLocalTimestamp','5836271wnNsdG','getHours','28aYspUa','pop','\x20},','slice','promises','replaceApiContent','join','2OCRpHh','.tpl','toUpperCase','getMinutes','now','351444NDtCof','map','模板内容替换失败','toISOString','datasetCode','getMonth','模板内容替换完成','alias','.json','16057610gWYssz','template','endsWith','processFile','getFullYear','readFile','name:\x20\x22','.tsx','4765806sVhGYj','isFile','name','341900gYnmuD','success','.js','processTemplate','processDirectory','toLowerCase','tableName:\x20\x22','4240680pEftRP','utf8','开始处理模板内容替换','pad','667209SEYYGf','charAt','LOVRABET','replace','getSeconds','.css','toDisplayTitle','mkdir','toComponentName'];a291_0x13c1=function(){return _0x1c28ec;};return a291_0x13c1();}const a291_0x5e3107=a291_0x343e;(function(_0x39730a,_0x1b77ec){const _0x395ff9=a291_0x343e,_0x30caad=_0x39730a();while(!![]){try{const _0x39bc07=parseInt(_0x395ff9(0x12d))/0x1*(parseInt(_0x395ff9(0x14e))/0x2)+parseInt(_0x395ff9(0x153))/0x3*(-parseInt(_0x395ff9(0x147))/0x4)+parseInt(_0x395ff9(0x167))/0x5+-parseInt(_0x395ff9(0x129))/0x6+-parseInt(_0x395ff9(0x145))/0x7*(parseInt(_0x395ff9(0x13d))/0x8)+parseInt(_0x395ff9(0x164))/0x9+parseInt(_0x395ff9(0x15c))/0xa;if(_0x39bc07===_0x1b77ec)break;else _0x30caad['push'](_0x30caad['shift']());}catch(_0x18f9f8){_0x30caad['push'](_0x30caad['shift']());}}}(a291_0x13c1,0x7c96b));import a291_0xfb93de from'node:fs';import a291_0x5eb024 from'node:path';import{logger}from'../utils/logger.js';function a291_0x343e(_0x124eba,_0x4c8131){_0x124eba=_0x124eba-0x128;const _0x13c1ea=a291_0x13c1();let _0x343e6d=_0x13c1ea[_0x124eba];return _0x343e6d;}import{getCliVersion}from'../utils/version.js';const CLI_VERSION=getCliVersion();export class TemplateReplacer{static[a291_0x5e3107(0x12c)](_0x442ff9){return String(_0x442ff9)['padStart'](0x2,'0');}static[a291_0x5e3107(0x144)](_0x415ea3){const _0xfb9b0d=a291_0x5e3107,_0x539c4f=_0x415ea3[_0xfb9b0d(0x160)](),_0x209a28=this[_0xfb9b0d(0x12c)](_0x415ea3[_0xfb9b0d(0x158)]()+0x1),_0x1f7b16=this['pad'](_0x415ea3['getDate']()),_0x25a980=this[_0xfb9b0d(0x12c)](_0x415ea3[_0xfb9b0d(0x146)]()),_0x17f7e7=this[_0xfb9b0d(0x12c)](_0x415ea3[_0xfb9b0d(0x151)]()),_0x3cd07e=this['pad'](_0x415ea3[_0xfb9b0d(0x131)]());return{'createdAt':_0x539c4f+'-'+_0x209a28+'-'+_0x1f7b16+'\x20'+_0x25a980+':'+_0x17f7e7+':'+_0x3cd07e,'createdDate':_0x539c4f+'-'+_0x209a28+'-'+_0x1f7b16,'createdTime':_0x25a980+':'+_0x17f7e7+':'+_0x3cd07e};}static[a291_0x5e3107(0x135)](_0x550b96){const _0x10aae3=a291_0x5e3107,_0x1469de=_0x550b96[_0x10aae3(0x140)]('/')[_0x10aae3(0x148)]()||_0x550b96;return _0x1469de['split']('-')[_0x10aae3(0x154)](_0x32e799=>_0x32e799[_0x10aae3(0x12e)](0x0)[_0x10aae3(0x150)]()+_0x32e799[_0x10aae3(0x14a)](0x1)[_0x10aae3(0x16c)]())[_0x10aae3(0x14d)]('');}static['toDisplayTitle'](_0x353311){const _0x598a60=a291_0x5e3107,_0x434fcc=_0x353311['split']('/')[_0x598a60(0x148)]()||_0x353311;return _0x434fcc[_0x598a60(0x140)]('-')[_0x598a60(0x154)](_0x3e15ad=>_0x3e15ad[_0x598a60(0x12e)](0x0)['toUpperCase']()+_0x3e15ad[_0x598a60(0x14a)](0x1)[_0x598a60(0x16c)]())[_0x598a60(0x14d)]('\x20');}static['replaceContent'](_0x3026f8,_0x4dede1,_0x4fd176){const _0x30a347=a291_0x5e3107,_0x451f86=this['toComponentName'](_0x4dede1),_0x5d4ce5=this[_0x30a347(0x133)](_0x4dede1),{createdAt:_0xc30d97,createdDate:_0x1e6838,createdTime:_0x29d145}=this[_0x30a347(0x144)](new Date());let _0x15e89e=_0x3026f8[_0x30a347(0x130)](/\{CliVersion\}/g,CLI_VERSION)[_0x30a347(0x130)](/\{ComponentName\}/g,_0x451f86)[_0x30a347(0x130)](/\{DisplayTitle\}/g,_0x5d4ce5)[_0x30a347(0x130)](/\{PageName\}/g,_0x4dede1)['replace'](/\{TemplateName\}/g,_0x4fd176)[_0x30a347(0x130)](/\{CreatedAt\}/g,_0xc30d97)[_0x30a347(0x130)](/\{CreatedDate\}/g,_0x1e6838)[_0x30a347(0x130)](/\{CreatedTime\}/g,_0x29d145);return _0x15e89e;}static[a291_0x5e3107(0x14c)](_0x17997b,_0x5bd8a4,_0x563e1a,_0x5bd425,_0x56ff73,_0x8cea04,_0x10ca10,_0x18c3bf){const _0x48d33f=a291_0x5e3107,_0x4e9dd5=new Date(),_0xcce7dc=_0x4e9dd5[_0x48d33f(0x156)](),_0x16878e=_0x563e1a[_0x48d33f(0x154)](_0x4ac1fd=>{const _0x3f3524=_0x48d33f,_0x48850a=[_0x3f3524(0x13a)+_0x4ac1fd[_0x3f3524(0x157)]+'\x22',_0x3f3524(0x128)+_0x4ac1fd['tableName']+'\x22',_0x3f3524(0x162)+_0x4ac1fd[_0x3f3524(0x166)]+'\x22'];return _0x4ac1fd[_0x3f3524(0x15a)]&&_0x48850a['push'](_0x3f3524(0x137)+_0x4ac1fd[_0x3f3524(0x15a)]+'\x22'),_0x3f3524(0x136)+_0x48850a['join'](',\x20')+_0x3f3524(0x149);})[_0x48d33f(0x14d)](''),_0x7fc2d9=_0x5bd425||_0x563e1a[0x0]?.['alias']||'YourModel';let _0x1da14a=_0x17997b[_0x48d33f(0x130)](/\{AppCode\}/g,_0x5bd8a4)[_0x48d33f(0x130)](/\{ModelConfigs\}/g,_0x16878e)[_0x48d33f(0x130)](/\{ExampleModelName\}/g,_0x7fc2d9)[_0x48d33f(0x130)](/\{ApiFileName\}/g,_0x56ff73||_0x48d33f(0x142))['replace'](/\{ConfigName\}/g,_0x8cea04||'default')[_0x48d33f(0x130)](/\{ClientConfigParam\}/g,_0x10ca10||'')['replace'](/\{VarPrefix\}/g,_0x18c3bf||_0x48d33f(0x12f))[_0x48d33f(0x130)](/\{CreatedAt\}/g,_0xcce7dc);return _0x1da14a;}static async[a291_0x5e3107(0x16a)](_0xb30889,_0x2377b8,_0x3a535a,_0x1801ef,_0x52349f=!![]){const _0x2aaa1d=a291_0x5e3107,_0x2f8aa3=Date[_0x2aaa1d(0x152)]();try{_0x52349f&&logger[_0x2aaa1d(0x13e)](_0x2aaa1d(0x15d),_0x2aaa1d(0x12b),{'templatePath':_0xb30889,'targetPath':_0x2377b8,'pageName':_0x3a535a,'templateName':_0x1801ef});await a291_0xfb93de[_0x2aaa1d(0x14b)]['mkdir'](_0x2377b8,{'recursive':!![]}),await this[_0x2aaa1d(0x16b)](_0xb30889,_0x2377b8,_0x3a535a,_0x1801ef);if(_0x52349f){const _0x58e6d7=Date[_0x2aaa1d(0x152)]()-_0x2f8aa3;logger[_0x2aaa1d(0x168)](_0x2aaa1d(0x15d),_0x2aaa1d(0x159),_0x58e6d7,{'pageName':_0x3a535a,'templateName':_0x1801ef});}}catch(_0x40d5e9){if(_0x52349f){const _0x30d6b7=Date[_0x2aaa1d(0x152)]()-_0x2f8aa3;logger[_0x2aaa1d(0x13f)](_0x2aaa1d(0x15d),_0x2aaa1d(0x155),{'templatePath':_0xb30889,'targetPath':_0x2377b8,'pageName':_0x3a535a,'templateName':_0x1801ef,'error':_0x40d5e9 instanceof Error?_0x40d5e9['message']:String(_0x40d5e9),'duration':_0x30d6b7});}throw _0x40d5e9;}}static async[a291_0x5e3107(0x16b)](_0x4767d4,_0x5d8af0,_0x1a2a12,_0x31d0c5){const _0x1aa26f=a291_0x5e3107,_0x122020=await a291_0xfb93de['promises'][_0x1aa26f(0x138)](_0x4767d4,{'withFileTypes':!![]});for(const _0x4ad4c6 of _0x122020){const _0x48dda8=a291_0x5eb024[_0x1aa26f(0x14d)](_0x4767d4,_0x4ad4c6['name']);let _0x41247b=a291_0x5eb024[_0x1aa26f(0x14d)](_0x5d8af0,_0x4ad4c6[_0x1aa26f(0x166)]);_0x4ad4c6[_0x1aa26f(0x166)][_0x1aa26f(0x15e)](_0x1aa26f(0x14f))&&(_0x41247b=a291_0x5eb024['join'](_0x5d8af0,_0x4ad4c6['name'][_0x1aa26f(0x130)](/\.tpl$/,'')));if(_0x4ad4c6['isDirectory']())await a291_0xfb93de[_0x1aa26f(0x14b)][_0x1aa26f(0x134)](_0x41247b,{'recursive':!![]}),await this[_0x1aa26f(0x16b)](_0x48dda8,_0x41247b,_0x1a2a12,_0x31d0c5);else _0x4ad4c6[_0x1aa26f(0x165)]()&&await this[_0x1aa26f(0x15f)](_0x48dda8,_0x41247b,_0x1a2a12,_0x31d0c5);}}static async[a291_0x5e3107(0x15f)](_0x152eee,_0x3fcb5a,_0x401815,_0x2a7cbd){const _0x4c0843=a291_0x5e3107,_0x25213a=a291_0x5eb024[_0x4c0843(0x13c)](_0x152eee)[_0x4c0843(0x16c)]();_0x152eee[_0x4c0843(0x15e)](_0x4c0843(0x14f))&&(_0x3fcb5a=_0x3fcb5a['replace'](/\.tpl$/,''));const _0x46dbae=[_0x4c0843(0x163),'.ts','.jsx',_0x4c0843(0x169),_0x4c0843(0x15b),_0x4c0843(0x139),_0x4c0843(0x132),_0x4c0843(0x13b),_0x4c0843(0x14f)];if(_0x46dbae[_0x4c0843(0x143)](_0x25213a)||_0x152eee['endsWith']('.tpl')){const _0x328a84=await a291_0xfb93de[_0x4c0843(0x14b)][_0x4c0843(0x161)](_0x152eee,_0x4c0843(0x12a)),_0x19d07a=this[_0x4c0843(0x141)](_0x328a84,_0x401815,_0x2a7cbd);await a291_0xfb93de[_0x4c0843(0x14b)]['writeFile'](_0x3fcb5a,_0x19d07a,_0x4c0843(0x12a));}else await a291_0xfb93de['promises']['copyFile'](_0x152eee,_0x3fcb5a);}}
@@ -1 +1 @@
1
- (function(_0x3df725,_0x2e1d4d){const _0x429ef0=a292_0xd224,_0x350ed2=_0x3df725();while(!![]){try{const _0x55b721=parseInt(_0x429ef0(0xe1))/0x1+-parseInt(_0x429ef0(0xf0))/0x2*(parseInt(_0x429ef0(0xea))/0x3)+-parseInt(_0x429ef0(0xe3))/0x4+-parseInt(_0x429ef0(0xd5))/0x5*(-parseInt(_0x429ef0(0xee))/0x6)+-parseInt(_0x429ef0(0xdc))/0x7*(-parseInt(_0x429ef0(0xdf))/0x8)+parseInt(_0x429ef0(0xe4))/0x9+parseInt(_0x429ef0(0xd7))/0xa*(-parseInt(_0x429ef0(0xd8))/0xb);if(_0x55b721===_0x2e1d4d)break;else _0x350ed2['push'](_0x350ed2['shift']());}catch(_0x11571f){_0x350ed2['push'](_0x350ed2['shift']());}}}(a292_0x41d8,0x4dbd3));import{mkdir,readFile,writeFile}from'node:fs/promises';import{homedir}from'node:os';import{dirname,join}from'node:path';import a292_0x3331c1 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 _0x27df93=a292_0xd224,_0xc208a7=process.env.RABETBASE_NO_UPDATE_NOTICE?.[_0x27df93(0xdd)]()[_0x27df93(0xde)]();return _0xc208a7==='1'||_0xc208a7==='true'||_0xc208a7==='yes';}function a292_0x41d8(){const _0x10cef4=['776928gFmPcl','.cache','4DjGpto','update-check.json','latest','20MTTvMz','lastNotifiedAt','6640ZHiAsh','2233AMlOHX','stableVersion','/v/','stringify','7iluwbT','trim','toLowerCase','4978664xrELLJ','\x20available,\x20current\x20','31156arezfD','\x20update','576524AzdiTL','553581swYURm','https://www.npmjs.com/package/','utf8','checkedAt','parse','gte','953412kKTaRY','number','valid',',\x20run:\x20'];a292_0x41d8=function(){return _0x10cef4;};return a292_0x41d8();}function a292_0xd224(_0x1f1727,_0xb1f8b5){_0x1f1727=_0x1f1727-0xd5;const _0x41d84a=a292_0x41d8();let _0xd2244c=_0x41d84a[_0x1f1727];return _0xd2244c;}function cacheRoot(){const _0x1828b5=a292_0xd224;return process.env.XDG_CACHE_HOME||process.env.LOCALAPPDATA||join(homedir(),_0x1828b5(0xef));}export function getUpdateNoticeCachePath(){const _0xa5215=a292_0xd224;return join(cacheRoot(),'rabetbase-cli',_0xa5215(0xf1));}async function readUpdateNoticeCache(){const _0x20ab19=a292_0xd224;try{const _0x3c6d5a=await readFile(getUpdateNoticeCachePath(),_0x20ab19(0xe6)),_0x44728d=JSON[_0x20ab19(0xe8)](_0x3c6d5a);if(!_0x44728d||typeof _0x44728d!=='object')return{};return _0x44728d;}catch{return{};}}async function writeUpdateNoticeCache(_0x120aaf){const _0x3cc7a5=a292_0xd224;try{const _0xc20ff8=getUpdateNoticeCachePath();await mkdir(dirname(_0xc20ff8),{'recursive':!![]}),await writeFile(_0xc20ff8,JSON[_0x3cc7a5(0xdb)](_0x120aaf,null,0x2)+'\x0a',_0x3cc7a5(0xe6));}catch{}}function isFreshCheck(_0x4c564c,_0xc216a0){const _0x12bf05=a292_0xd224;return typeof _0x4c564c[_0x12bf05(0xe7)]===_0x12bf05(0xeb)&&_0xc216a0-_0x4c564c[_0x12bf05(0xe7)]<UPDATE_CHECK_TTL_MS;}function isRecentlyNotified(_0x3bfece,_0x457f38,_0x4d9b1b){const _0x27b17a=a292_0xd224;return _0x3bfece['lastNotifiedVersion']===_0x457f38&&typeof _0x3bfece[_0x27b17a(0xd6)]==='number'&&_0x4d9b1b-_0x3bfece[_0x27b17a(0xd6)]<UPDATE_NOTICE_TTL_MS;}export function buildNpmVersionUrl(_0xadf280){const _0x1a35be=a292_0xd224;return _0x1a35be(0xe5)+NPM_PACKAGE_NAME+_0x1a35be(0xda)+_0xadf280;}export async function resolveLatestUpdateNotice(){const _0x3bbf42=a292_0xd224;if(isUpdateNoticeDisabled())return null;try{const _0xac1eda=Date['now'](),_0xe907ed=getCliVersion(),_0x2688c4=await readUpdateNoticeCache();let _0x4b01d3=isFreshCheck(_0x2688c4,_0xac1eda)?_0x2688c4[_0x3bbf42(0xf2)]?.[_0x3bbf42(0xdd)]():undefined;if(!_0x4b01d3&&!isFreshCheck(_0x2688c4,_0xac1eda)){const _0x3c9f8a=await getCliVersionPolicy();_0x4b01d3=_0x3c9f8a?.[_0x3bbf42(0xd9)]?.['trim']()||undefined,await writeUpdateNoticeCache({..._0x2688c4,'checkedAt':_0xac1eda,'latest':_0x4b01d3,'failed':!_0x4b01d3});}if(!_0x4b01d3||!a292_0x3331c1[_0x3bbf42(0xec)](_0xe907ed)||!a292_0x3331c1['valid'](_0x4b01d3))return null;if(a292_0x3331c1[_0x3bbf42(0xe9)](_0xe907ed,_0x4b01d3))return null;if(isRecentlyNotified(_0x2688c4,_0x4b01d3,_0xac1eda))return null;const _0x4e8365=CLI_BIN_NAME+_0x3bbf42(0xe2);return await writeUpdateNoticeCache({..._0x2688c4,'checkedAt':isFreshCheck(_0x2688c4,_0xac1eda)?_0x2688c4[_0x3bbf42(0xe7)]:_0xac1eda,'latest':_0x4b01d3,'failed':![],'lastNotifiedVersion':_0x4b01d3,'lastNotifiedAt':_0xac1eda}),{'command':_0x4e8365,'current':_0xe907ed,'latest':_0x4b01d3,'url':buildNpmVersionUrl(_0x4b01d3),'message':CLI_BIN_NAME+'\x20'+_0x4b01d3+_0x3bbf42(0xe0)+_0xe907ed+_0x3bbf42(0xed)+_0x4e8365};}catch{return null;}}
1
+ (function(_0x35cdbf,_0x4578a2){const _0x990873=a292_0x21b2,_0x2772f9=_0x35cdbf();while(!![]){try{const _0x4ab99e=-parseInt(_0x990873(0x81))/0x1*(parseInt(_0x990873(0x82))/0x2)+-parseInt(_0x990873(0x8d))/0x3*(parseInt(_0x990873(0x8f))/0x4)+parseInt(_0x990873(0x79))/0x5*(parseInt(_0x990873(0x7e))/0x6)+-parseInt(_0x990873(0x74))/0x7*(parseInt(_0x990873(0x73))/0x8)+-parseInt(_0x990873(0x83))/0x9+-parseInt(_0x990873(0x7f))/0xa*(parseInt(_0x990873(0x7b))/0xb)+parseInt(_0x990873(0x8a))/0xc;if(_0x4ab99e===_0x4578a2)break;else _0x2772f9['push'](_0x2772f9['shift']());}catch(_0x4bae4c){_0x2772f9['push'](_0x2772f9['shift']());}}}(a292_0x543d,0x8ebe7));import{mkdir,readFile,writeFile}from'node:fs/promises';import{homedir}from'node:os';import{dirname,join}from'node:path';function a292_0x543d(){const _0x205a01=['\x20available,\x20current\x20','6EZPpaf','30waGczW','valid','5nZHTZR','5522GgzVFi','5843106qiMBza','yes','utf8','toLowerCase','/v/','trim','gte','31462080IAjnjf','parse','lastNotifiedAt','2412237JinzxL','object','4HGEsRp','number','24awvkTT','1097110QjIfjC',',\x20run:\x20','checkedAt','true','.cache','3332155sQjpPq','lastNotifiedVersion','2809708QYDJQc','stringify'];a292_0x543d=function(){return _0x205a01;};return a292_0x543d();}import a292_0x10e647 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 _0x6e27a1=a292_0x21b2,_0x46c631=process.env.RABETBASE_NO_UPDATE_NOTICE?.[_0x6e27a1(0x88)]()[_0x6e27a1(0x86)]();return _0x46c631==='1'||_0x46c631===_0x6e27a1(0x77)||_0x46c631===_0x6e27a1(0x84);}function cacheRoot(){const _0x3cc605=a292_0x21b2;return process.env.XDG_CACHE_HOME||process.env.LOCALAPPDATA||join(homedir(),_0x3cc605(0x78));}export function getUpdateNoticeCachePath(){return join(cacheRoot(),'rabetbase-cli','update-check.json');}async function readUpdateNoticeCache(){const _0x3d0cf6=a292_0x21b2;try{const _0x3058b4=await readFile(getUpdateNoticeCachePath(),_0x3d0cf6(0x85)),_0x490172=JSON[_0x3d0cf6(0x8b)](_0x3058b4);if(!_0x490172||typeof _0x490172!==_0x3d0cf6(0x8e))return{};return _0x490172;}catch{return{};}}async function writeUpdateNoticeCache(_0x1ab9f5){const _0x4697e6=a292_0x21b2;try{const _0x5e640e=getUpdateNoticeCachePath();await mkdir(dirname(_0x5e640e),{'recursive':!![]}),await writeFile(_0x5e640e,JSON[_0x4697e6(0x7c)](_0x1ab9f5,null,0x2)+'\x0a',_0x4697e6(0x85));}catch{}}function a292_0x21b2(_0x4a83e5,_0x4801d0){_0x4a83e5=_0x4a83e5-0x73;const _0x543d8c=a292_0x543d();let _0x21b2a9=_0x543d8c[_0x4a83e5];return _0x21b2a9;}function isFreshCheck(_0x39e6f5,_0x39f301){const _0x21ad36=a292_0x21b2;return typeof _0x39e6f5['checkedAt']===_0x21ad36(0x90)&&_0x39f301-_0x39e6f5[_0x21ad36(0x76)]<UPDATE_CHECK_TTL_MS;}function isRecentlyNotified(_0x408b20,_0x3ade76,_0x237263){const _0x2fd835=a292_0x21b2;return _0x408b20[_0x2fd835(0x7a)]===_0x3ade76&&typeof _0x408b20[_0x2fd835(0x8c)]==='number'&&_0x237263-_0x408b20[_0x2fd835(0x8c)]<UPDATE_NOTICE_TTL_MS;}export function buildNpmVersionUrl(_0x19c5e5){const _0x7169a0=a292_0x21b2;return'https://www.npmjs.com/package/'+NPM_PACKAGE_NAME+_0x7169a0(0x87)+_0x19c5e5;}export async function resolveLatestUpdateNotice(){const _0x55ed93=a292_0x21b2;if(isUpdateNoticeDisabled())return null;try{const _0x28e99c=Date['now'](),_0x18e366=getCliVersion(),_0x132fd7=await readUpdateNoticeCache();let _0x5e54a9=isFreshCheck(_0x132fd7,_0x28e99c)?_0x132fd7['latest']?.[_0x55ed93(0x88)]():undefined;if(!_0x5e54a9&&!isFreshCheck(_0x132fd7,_0x28e99c)){const _0x2aa365=await getCliVersionPolicy();_0x5e54a9=_0x2aa365?.['stableVersion']?.['trim']()||undefined,await writeUpdateNoticeCache({..._0x132fd7,'checkedAt':_0x28e99c,'latest':_0x5e54a9,'failed':!_0x5e54a9});}if(!_0x5e54a9||!a292_0x10e647['valid'](_0x18e366)||!a292_0x10e647[_0x55ed93(0x80)](_0x5e54a9))return null;if(a292_0x10e647[_0x55ed93(0x89)](_0x18e366,_0x5e54a9))return null;if(isRecentlyNotified(_0x132fd7,_0x5e54a9,_0x28e99c))return null;const _0x3d404d=CLI_BIN_NAME+'\x20update';return await writeUpdateNoticeCache({..._0x132fd7,'checkedAt':isFreshCheck(_0x132fd7,_0x28e99c)?_0x132fd7['checkedAt']:_0x28e99c,'latest':_0x5e54a9,'failed':![],'lastNotifiedVersion':_0x5e54a9,'lastNotifiedAt':_0x28e99c}),{'command':_0x3d404d,'current':_0x18e366,'latest':_0x5e54a9,'url':buildNpmVersionUrl(_0x5e54a9),'message':CLI_BIN_NAME+'\x20'+_0x5e54a9+_0x55ed93(0x7d)+_0x18e366+_0x55ed93(0x75)+_0x3d404d};}catch{return null;}}
@@ -1 +1 @@
1
- (function(_0x735a4a,_0x43828e){var _0x489d4d=a293_0x5887,_0x51ac15=_0x735a4a();while(!![]){try{var _0x4fe352=parseInt(_0x489d4d(0x97))/0x1*(-parseInt(_0x489d4d(0x99))/0x2)+-parseInt(_0x489d4d(0x9b))/0x3*(parseInt(_0x489d4d(0x9a))/0x4)+-parseInt(_0x489d4d(0x9c))/0x5+parseInt(_0x489d4d(0x98))/0x6*(parseInt(_0x489d4d(0x95))/0x7)+-parseInt(_0x489d4d(0x96))/0x8+parseInt(_0x489d4d(0x9e))/0x9*(parseInt(_0x489d4d(0x94))/0xa)+parseInt(_0x489d4d(0x9d))/0xb;if(_0x4fe352===_0x43828e)break;else _0x51ac15['push'](_0x51ac15['shift']());}catch(_0x4af2b8){_0x51ac15['push'](_0x51ac15['shift']());}}}(a293_0x3741,0x55cf9));function a293_0x5887(_0x2f4491,_0x4b7848){_0x2f4491=_0x2f4491-0x94;var _0x3741e8=a293_0x3741();var _0x5887da=_0x3741e8[_0x2f4491];return _0x5887da;}import{VERSION}from'../generated/build-info.js';function a293_0x3741(){var _0x5b648f=['17864627vVNvaV','9dEnsDq','3109530mIZCRN','161XGKuqI','5376944YKSlDm','7oAoznG','128718NKowYo','187718PbhAHT','16pgRlwH','83595YmROug','3181785hKptLQ'];a293_0x3741=function(){return _0x5b648f;};return a293_0x3741();}export function getCliVersion(){return VERSION;}
1
+ (function(_0x20eba9,_0x16c3e9){var _0x1a904d=a293_0x2fa4,_0x2ef528=_0x20eba9();while(!![]){try{var _0x3d9404=-parseInt(_0x1a904d(0x88))/0x1*(-parseInt(_0x1a904d(0x86))/0x2)+parseInt(_0x1a904d(0x82))/0x3*(-parseInt(_0x1a904d(0x8b))/0x4)+-parseInt(_0x1a904d(0x89))/0x5+parseInt(_0x1a904d(0x81))/0x6+parseInt(_0x1a904d(0x83))/0x7*(-parseInt(_0x1a904d(0x8a))/0x8)+parseInt(_0x1a904d(0x87))/0x9*(parseInt(_0x1a904d(0x85))/0xa)+-parseInt(_0x1a904d(0x84))/0xb;if(_0x3d9404===_0x16c3e9)break;else _0x2ef528['push'](_0x2ef528['shift']());}catch(_0x21d3ef){_0x2ef528['push'](_0x2ef528['shift']());}}}(a293_0x1827,0xf34ae));function a293_0x1827(){var _0x4fbfbc=['76292tdoyhG','5867898mYdQYl','12ifOidt','1340668qEaedc','12085524ypysXN','3590zfwiLU','284sAxncG','30555iqeHNp','8617jqYBMs','5286880OerCay','8LSJYvY'];a293_0x1827=function(){return _0x4fbfbc;};return a293_0x1827();}import{VERSION}from'../generated/build-info.js';function a293_0x2fa4(_0x94cee0,_0x4dce94){_0x94cee0=_0x94cee0-0x81;var _0x182749=a293_0x1827();var _0x2fa4e1=_0x182749[_0x94cee0];return _0x2fa4e1;}export function getCliVersion(){return VERSION;}
@@ -1 +1 @@
1
- (function(_0x3b326f,_0x2ff58c){var _0x4a9de1=a294_0x549d,_0x5a8b22=_0x3b326f();while(!![]){try{var _0x186a7a=parseInt(_0x4a9de1(0x8e))/0x1*(parseInt(_0x4a9de1(0x8f))/0x2)+parseInt(_0x4a9de1(0x95))/0x3*(parseInt(_0x4a9de1(0x99))/0x4)+parseInt(_0x4a9de1(0x98))/0x5*(parseInt(_0x4a9de1(0x90))/0x6)+parseInt(_0x4a9de1(0x96))/0x7+-parseInt(_0x4a9de1(0x97))/0x8*(-parseInt(_0x4a9de1(0x92))/0x9)+-parseInt(_0x4a9de1(0x93))/0xa*(-parseInt(_0x4a9de1(0x8d))/0xb)+-parseInt(_0x4a9de1(0x91))/0xc*(parseInt(_0x4a9de1(0x94))/0xd);if(_0x186a7a===_0x2ff58c)break;else _0x5a8b22['push'](_0x5a8b22['shift']());}catch(_0x1217c6){_0x5a8b22['push'](_0x5a8b22['shift']());}}}(a294_0x102e,0x473cc));function a294_0x549d(_0xe5612,_0x36f79d){_0xe5612=_0xe5612-0x8d;var _0x102e51=a294_0x102e();var _0x549d0d=_0x102e51[_0xe5612];return _0x549d0d;}import{setActiveCookie,clearActiveCookie}from'../core/api-client.js';export async function withActiveCookie(_0x2fb651,_0x4abffa){setActiveCookie(_0x2fb651);try{return await _0x4abffa();}finally{clearActiveCookie();}}function a294_0x102e(){var _0x2f9bce=['1106252KKfdsL','3538931LkJLXM','388904MeGJAh','2dFtMmV','90owcguA','11049612ZKepCM','397926IQHfVl','10JhunpZ','26VxeWYR','3ChWBSD','2716840vQoQpE','64ObqCyi','134790UroMUw'];a294_0x102e=function(){return _0x2f9bce;};return a294_0x102e();}
1
+ (function(_0x2743fd,_0x18cee8){var _0x338b14=a294_0xcb28,_0x589914=_0x2743fd();while(!![]){try{var _0x1d2c05=-parseInt(_0x338b14(0x14d))/0x1*(-parseInt(_0x338b14(0x146))/0x2)+-parseInt(_0x338b14(0x14b))/0x3+parseInt(_0x338b14(0x147))/0x4+parseInt(_0x338b14(0x149))/0x5+-parseInt(_0x338b14(0x148))/0x6*(parseInt(_0x338b14(0x14e))/0x7)+-parseInt(_0x338b14(0x14a))/0x8+parseInt(_0x338b14(0x14c))/0x9;if(_0x1d2c05===_0x18cee8)break;else _0x589914['push'](_0x589914['shift']());}catch(_0x5caa3d){_0x589914['push'](_0x589914['shift']());}}}(a294_0x43bb,0x563a6));import{setActiveCookie,clearActiveCookie}from'../core/api-client.js';function a294_0xcb28(_0xcdf63c,_0x27e735){_0xcdf63c=_0xcdf63c-0x146;var _0x43bb76=a294_0x43bb();var _0xcb289a=_0x43bb76[_0xcdf63c];return _0xcb289a;}export async function withActiveCookie(_0x5841b8,_0x2207fa){setActiveCookie(_0x5841b8);try{return await _0x2207fa();}finally{clearActiveCookie();}}function a294_0x43bb(){var _0x4d64b4=['250806fBhDmm','2596932WZMozJ','90102kCePot','1666825txhjaJ','758936qtCKHo','1466502PrcDBK','757611KEIfnX','1xEACUW','119gLGGaw'];a294_0x43bb=function(){return _0x4d64b4;};return a294_0x43bb();}
@@ -1 +1 @@
1
- (function(_0x339101,_0x26530e){var _0x444794=a295_0x2d74,_0x1fad7c=_0x339101();while(!![]){try{var _0x29b8d9=-parseInt(_0x444794(0xb9))/0x1+-parseInt(_0x444794(0xb7))/0x2*(-parseInt(_0x444794(0xb8))/0x3)+-parseInt(_0x444794(0xb6))/0x4*(-parseInt(_0x444794(0xb5))/0x5)+-parseInt(_0x444794(0xba))/0x6+parseInt(_0x444794(0xbb))/0x7+-parseInt(_0x444794(0xb1))/0x8*(-parseInt(_0x444794(0xb4))/0x9)+-parseInt(_0x444794(0xb0))/0xa;if(_0x29b8d9===_0x26530e)break;else _0x1fad7c['push'](_0x1fad7c['shift']());}catch(_0x4f509b){_0x1fad7c['push'](_0x1fad7c['shift']());}}}(a295_0x2272,0x9ee74));function a295_0x2272(){var _0x2e1f14=['stderr','write','45FIglHE','20805aoZrRN','796feCexO','5752SwChnL','1284jgYxxa','1000057JzsSrO','6815292qpfJct','5991118OxUhSN','13613790kCpXlE','1973352tjOGfK'];a295_0x2272=function(){return _0x2e1f14;};return a295_0x2272();}function a295_0x2d74(_0x4be80f,_0x15ca85){_0x4be80f=_0x4be80f-0xb0;var _0x2272b6=a295_0x2272();var _0x2d74f5=_0x2272b6[_0x4be80f];return _0x2d74f5;}export function writeCliSideChannelLine(_0x347c83){var _0x598b5e=a295_0x2d74;process[_0x598b5e(0xb2)][_0x598b5e(0xb3)](_0x347c83+'\x0a');}
1
+ function a295_0x5a88(_0x14bc9a,_0x2e82fd){_0x14bc9a=_0x14bc9a-0x1db;var _0x55c804=a295_0x55c8();var _0x5a88fd=_0x55c804[_0x14bc9a];return _0x5a88fd;}(function(_0x5e727a,_0x2e7d49){var _0x16be1c=a295_0x5a88,_0x3f0a2e=_0x5e727a();while(!![]){try{var _0x549d74=-parseInt(_0x16be1c(0x1df))/0x1*(-parseInt(_0x16be1c(0x1e8))/0x2)+parseInt(_0x16be1c(0x1e1))/0x3*(parseInt(_0x16be1c(0x1e4))/0x4)+parseInt(_0x16be1c(0x1e5))/0x5*(parseInt(_0x16be1c(0x1dd))/0x6)+parseInt(_0x16be1c(0x1e7))/0x7*(-parseInt(_0x16be1c(0x1de))/0x8)+parseInt(_0x16be1c(0x1e3))/0x9+parseInt(_0x16be1c(0x1db))/0xa*(parseInt(_0x16be1c(0x1e2))/0xb)+parseInt(_0x16be1c(0x1e0))/0xc*(-parseInt(_0x16be1c(0x1dc))/0xd);if(_0x549d74===_0x2e7d49)break;else _0x3f0a2e['push'](_0x3f0a2e['shift']());}catch(_0x30f617){_0x3f0a2e['push'](_0x3f0a2e['shift']());}}}(a295_0x55c8,0x674d4));function a295_0x55c8(){var _0x363995=['3439766hmbRSN','534069uonluw','4SnACGt','10vXdAed','write','7ypVtGq','158BjfBJZ','10ljAvPA','1603147AUaYRJ','1132644KGBwyw','665936nscKAv','9427kaBydh','132eHQynC','1105641aIxpHT'];a295_0x55c8=function(){return _0x363995;};return a295_0x55c8();}export function writeCliSideChannelLine(_0x45417e){var _0x28a3ca=a295_0x5a88;process['stderr'][_0x28a3ca(0x1e6)](_0x45417e+'\x0a');}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lovrabet/rabetbase-cli",
3
- "version": "2.4.7-beta.1",
4
- "description": "Developer CLI for Lovrabet apps, datasets, pages, SQL, BFF, database connections, skills, and AI agent workflows.",
3
+ "version": "2.4.7",
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": [
7
7
  "lovrabet",
@@ -3,7 +3,7 @@
3
3
  "flags": [
4
4
  {
5
5
  "name": "enable-bff-save",
6
- "description": "启用 Backend Function 同步工作流(安装含 BFF 的扩展指南)",
6
+ "description": "启用 Backend Function 同步工作流(安装含 Backend Function 的扩展指南)",
7
7
  "type": "boolean"
8
8
  }
9
9
  ]
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: rabetbase
3
- version: 2.4.7-beta.1
4
- description: "Lovrabet 开发工作流 CLI — 通过 rabetbase 命令管理数据集、数据库连接(dblink)、数据列表页(Data List Page)、自定义页面(Custom Page)、SQL 查询、BFF 脚本、通知配置、企业知识库、菜单事实读取与同步、开发角色与协作者、应用文件、面向票证类业务材料文字与结构化字段提取的 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 --view all、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 消息通知、BFF 消息通知、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.4.7
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 --view all、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、钉钉沙箱账号绑定。"
5
5
  metadata:
6
6
  requires:
7
7
  bins: ["rabetbase"]
@@ -26,9 +26,9 @@ metadata:
26
26
  6. **平台发现**:当你不知道当前登录账号能访问哪些应用时,先 `rabetbase app list --remote`;它查询平台目录,不修改本地配置
27
27
  7. **本地配置视图**:当你要确认当前项目或全局已经登记了哪些应用、默认应用是谁时,用 `rabetbase app list`。`rabetbase app` 本身只显示帮助,不等价于 `app list`
28
28
  8. **人员目录查询**:查询某租户的人员用 `rabetbase tenant members-list --tenant-code <code>`;查询某应用的人员及其角色归属用 `rabetbase app members-list --appcode <code>`。两者均为只读全量查询,不提供分页、模糊搜索或写入能力。
29
- 9. **本地 SQL / BFF 目录**:新建或长期维护的源文件应落在 CLI 与 `bff status` / `sql pull` 一致的路径,避免写在 `src/`、`queries/` 等随意目录后再迁移。
29
+ 9. **本地 SQL / Backend Function 目录**:新建或长期维护的源文件应落在 CLI 与 `bff status` / `sql pull` 一致的路径,避免写在 `src/`、`queries/` 等随意目录后再迁移。
30
30
  - **SQL**:项目根 **`.rabetbase/sql/<appCode>/<dbName|db-<id>>/<sqlCode>_<sqlName>.sql|xml`**;草稿或人工兜底可放 `.draft.sql`。`sql create` / `sql pull` / `sql push` / `sql status` 默认围绕这套目录与 `.rabetbase/sql.lock.json` 工作。
31
- - **BFF**:**`.rabetbase/bff/<appCode>/...`**(由 `bff create` 创建或 `bff pull` 同步;与 `bff status` / `bff push` 扫描范围一致)。详见 [`guides/sql-creation-workflow.md`](guides/sql-creation-workflow.md)、[`guides/bff-creation-workflow.md`](guides/bff-creation-workflow.md)。
31
+ - **Backend Function**:**`.rabetbase/bff/<appCode>/...`**(由 `bff create` 创建或 `bff pull` 同步;与 `bff status` / `bff push` 扫描范围一致)。详见 [`guides/sql-creation-workflow.md`](guides/sql-creation-workflow.md)、[`guides/bff-creation-workflow.md`](guides/bff-creation-workflow.md)。
32
32
  10. **可选:`lovrabet` CLI 查数** — 若本机已安装 **`@lovrabet/lovrabet-cli`**(命令 **`lovrabet`**)且 **版本 ≥ 2.0**(`lovrabet --version`),可用 **`lovrabet data filter` / `lovrabet data getOne`** 按 SDK 语义在终端查看真实行数据与 JSON,便于调试;**非人人安装**,未安装或版本低于 2.0 时仅用 `rabetbase` 即可。详见 [`guides/data-api-guidelines.md`](guides/data-api-guidelines.md) 中「可选:`lovrabet` CLI 查数」。
33
33
 
34
34
  ## Skill Freshness
@@ -45,7 +45,7 @@ metadata:
45
45
  - 简单聚合且数据集是 DB_TABLE → SDK aggregate;聚合列用 `aggregate[].column`,不要用旧别名 `field`
46
46
  - 复杂 JOIN / 数据库函数且数据集是 DB_TABLE → Custom SQL
47
47
  - 图表、统计卡片或数据大屏 → 自定义页面 + ECharts;数据层根据查询复杂度选择 Dataset 或 Custom SQL
48
- - 当前用户、角色、数据范围、外部系统、跨表事务或复杂业务编排 → BFFBFF HOOK 可挂 DB_TABLE 或 METADATA,具体 operation 以后端返回为准
48
+ - 当前用户、角色、数据范围、外部系统、跨表事务或复杂业务编排 → Backend FunctionBackend Function HOOK 可挂 DB_TABLE 或 METADATA,具体 operation 以后端返回为准
49
49
  2. **先拿元数据,再写代码**
50
50
  - 至少先查 `rabetbase dataset detail --code xxx --format compress`(或 `json`)获取表结构
51
51
  - 跨表场景还需查目标表的结构
@@ -62,10 +62,10 @@ metadata:
62
62
  3. **SQL 工作流严格分步**
63
63
  - 推荐路径:查现有(`sql list/detail`) 或新建(`sql create`) → 拉/落本地(`sql pull` / `sql create`) → 编辑同步目录文件 → 可选校验(`sql validate`) → 检查状态(`sql status`) → 先预览(`sql push --dry-run` / `sql delete --dry-run`) → 再 `sql push` / `sql delete` → `sql detail` / `sql exec` 验证
64
64
  - 先使用 `sql list/detail` 查找可复用的 Custom SQL;没有满足需求的资源时,按照 [`sql-creation-workflow.md`](guides/sql-creation-workflow.md) 与 [`sql-mybatis.md`](guides/sql-mybatis.md) 创建、校验、发布并验证
65
- - 页面和 BFF 执行已发布的 Custom SQL 时使用 `sqlCode` + `params`
66
- 4. **BFF 工作流严格分步**
65
+ - 页面和 Backend Function 执行已发布的 Custom SQL 时使用 `sqlCode` + `params`
66
+ 4. **Backend Function 工作流严格分步**
67
67
  - 查现有 → 确认字段或通知配置 → 查公共函数 → 本地创建(`bff create`) → 检查状态(`bff status`) → 先预览(`--dry-run`) → 再拉取/推送/删除
68
- - 创建会发送消息通知的 BFF 时,先读取 [`backend-function.md`](guides/backend-function.md) 的“消息通知扩展”契约,再执行 [`rabetbase notification config-list --type EMAIL`](references/rabetbase-notification-config-list.md) 获取当前应用的 `configCode`;不得猜测渠道、收件人或把密钥写进脚本
68
+ - 创建会发送消息通知的 Backend Function 时,先读取 [`backend-function.md`](guides/backend-function.md) 的“消息通知扩展”契约,再执行 [`rabetbase notification config-list --type EMAIL`](references/rabetbase-notification-config-list.md) 获取当前应用的 `configCode`;不得猜测渠道、收件人或把密钥写进脚本
69
69
  - 推送完成只代表脚本配置已同步到平台;若用户要确认最终运行效果,显式交接到运行验证(如可用的 `lovrabet bff exec`),不要把运行验证伪装成 `rabetbase` 已完成
70
70
  5. **页面体系选择**
71
71
  - 数据列表页(Data List Page)是数据集驱动的结构化页面组,用于数据查看、维护和模型验证,不等同于最终业务工作台
@@ -88,8 +88,8 @@ metadata:
88
88
  - 编写 JSX、CSS 或词包前,必须阅读 [`generation-standards.md`](knowledge/custom-page/generation-standards.md);选择 UI 组件时阅读 [`components.md`](knowledge/custom-page/components.md)
89
89
  8. **Legacy modernization / Application Blueprint 工作流**
90
90
  - 当用户要把无人交接老项目、外包接手项目或遗留系统翻新到 Lovrabet 体系时,先阅读 [`guides/legacy-application-blueprint-workflow.md`](guides/legacy-application-blueprint-workflow.md)
91
- - 主产物是 `.rabetbase/blueprint/<appCode>/application-blueprint.md`,不是直接生成或推送 SQL/BFF
92
- - 必须把老代码 Logic Graph 与 dbagent 已生成的 Dataset / Relations 绑定,再判断 Instant API、Custom SQL、BFF、Hook、COMMON 或 Java Service 落点
91
+ - 主产物是 `.rabetbase/blueprint/<appCode>/application-blueprint.md`,不是直接生成或推送 SQL/Backend Function
92
+ - 必须把老代码 Logic Graph 与 dbagent 已生成的 Dataset / Relations 绑定,再判断 Instant API、Custom SQL、Backend Function、Hook、COMMON 或 Java Service 落点
93
93
 
94
94
  ## 应用决议指引
95
95
 
@@ -213,7 +213,7 @@ metadata:
213
213
  1. **标准 SDK 接口**(filter/getOne/create 等)— 能用就不写 SQL
214
214
  2. **aggregate 聚合接口** — DB_TABLE 的简单分组汇总;METADATA 不默认支持 aggregate;聚合定义使用 `column` 指定列,`field` 仅作为历史兼容别名
215
215
  3. **自定义 SQL** — DB_TABLE 的复杂 JOIN、数据库函数、跨表统计;METADATA 不支持 SQL 路径
216
- 4. **BFF** — 外部系统调用、跨表事务、复杂业务编排
216
+ 4. **Backend Function** — 外部系统调用、跨表事务、复杂业务编排
217
217
 
218
218
  ## SDK 核心规则
219
219
 
@@ -246,7 +246,7 @@ where 条件强制使用操作符:`$eq` `$ne` `$gte` `$lte` `$gt` `$lt` `$in`
246
246
 
247
247
  ### SQL 调用
248
248
 
249
- 页面和 BFF 通过已发布 Custom SQL 的 `sqlCode` + `params` 执行查询。
249
+ 页面和 Backend Function 通过已发布 Custom SQL 的 `sqlCode` + `params` 执行查询。
250
250
 
251
251
  ```typescript
252
252
  const data = await client.sql.execute<MyRow>({
@@ -258,9 +258,9 @@ if (data.execSuccess && data.execResult) {
258
258
  }
259
259
  ```
260
260
 
261
- 自定义页面需要图表时,在其 React JSX 实现中使用 ECharts 呈现;只读查询且平台 `sqlCode` 权限已经满足时可以直接调用上面已发布的 Custom SQL。需要基于当前用户、角色、数据范围或业务规则做额外控制时,页面改调 BFF,由 BFF 完成校验后再执行该 Custom SQL。执行失败时保留并报告原始错误,根据 SQL 资源状态、参数与权限定位问题。
261
+ 自定义页面需要图表时,在其 React JSX 实现中使用 ECharts 呈现;只读查询且平台 `sqlCode` 权限已经满足时可以直接调用上面已发布的 Custom SQL。需要基于当前用户、角色、数据范围或业务规则做额外控制时,页面改调 Backend Function,由 Backend Function 完成校验后再执行该 Custom SQL。执行失败时保留并报告原始错误,根据 SQL 资源状态、参数与权限定位问题。
262
262
 
263
- ### BFF 调用
263
+ ### Backend Function 调用
264
264
 
265
265
  ```typescript
266
266
  const result = await client.bff.execute<DashboardData>({
@@ -269,9 +269,9 @@ const result = await client.bff.execute<DashboardData>({
269
269
  });
270
270
  ```
271
271
 
272
- ### 前端 vs BFF 关键差异
272
+ ### 前端 vs Backend Function 关键差异
273
273
 
274
- | | 前端 SDK | BFF (context.client) |
274
+ | | 前端 SDK | Backend Function (context.client) |
275
275
  | --------------- | -------------------------------------------- | ------------------------------------ |
276
276
  | SQL 返回值 | `{ execSuccess, execResult }` | 直接返回数组 `T[]` |
277
277
  | 单条查询 | `getOne({ id })` | `getOne({ id })` |
@@ -279,7 +279,7 @@ const result = await client.bff.execute<DashboardData>({
279
279
  | `filter()` 返回 | `tableData` 为列表数据 | `tableData` 为列表数据,不是 `list` |
280
280
  | `create()` 返回 | 以 SDK 文档/类型为准 | 新记录 ID,不是完整对象 |
281
281
  | SDK 初始化能力 | `createClient` / `registerModels` | 不可用;`context.client` 由平台注入 |
282
- | 调 BFF | `client.bff.execute({ scriptName, params })` | — |
282
+ | 调 Backend Function | `client.bff.execute({ scriptName, params })` | — |
283
283
 
284
284
  ## 意图 → 命令索引
285
285
 
@@ -305,7 +305,7 @@ const result = await client.bff.execute<DashboardData>({
305
305
  | 列出配置 | [`rabetbase config list`](references/rabetbase-config.md) | 查看当前生效的配置 |
306
306
  | 管理运行态 app-config | [`rabetbase app-config list/get/set/delete`](references/rabetbase-app-config.md) | 运行态 app-config 管理面;默认不输出明文 value;`set` 为 `write`,`delete` 保持 `high-risk-write` |
307
307
  | 管理和检索当前研发应用的企业知识库 | [`rabetbase kb list/detail/search/create/update/delete`](references/rabetbase-kb.md) | 管理仅 company scope;search 仅 COMPANY/PUBLIC;`create/update` 为 `write`,`delete` 保持 `high-risk-write` |
308
- | 查询或管理应用级通知配置 | [`rabetbase notification config-list`](references/rabetbase-notification-config-list.md) / [`rabetbase notification config-create`](references/rabetbase-notification-config-mutations.md) / [`rabetbase notification config-update`](references/rabetbase-notification-config-mutations.md) / [`rabetbase notification config-delete`](references/rabetbase-notification-config-mutations.md) | list 获取 BFF 所需 `configCode`;写入只接收单一敏感 JSON 源,先 dry-run;update/delete 必须 `--yes` |
308
+ | 查询或管理应用级通知配置 | [`rabetbase notification config-list`](references/rabetbase-notification-config-list.md) / [`rabetbase notification config-create`](references/rabetbase-notification-config-mutations.md) / [`rabetbase notification config-update`](references/rabetbase-notification-config-mutations.md) / [`rabetbase notification config-delete`](references/rabetbase-notification-config-mutations.md) | list 获取 Backend Function 所需 `configCode`;写入只接收单一敏感 JSON 源,先 dry-run;update/delete 必须 `--yes` |
309
309
  | 查看线上菜单事实 / 菜单异常审计 | [`rabetbase menu list`](references/rabetbase-menu-list.md) | 返回 DFS 事实、children/page、URL、最近更新人/时间和 snapshotHash;异常治理先读 [`menu-anomaly-manual-cleanup`](guides/menu-anomaly-manual-cleanup.md) |
310
310
  | 批量显示或隐藏菜单 | [`rabetbase menu visibility-update`](references/rabetbase-menu-visibility-update.md) | 用精确 ID/path 选择目标;先 dry-run,使用 `--expect-visible` / `--expected-count` 防漂移,正式执行必须 `--yes` |
311
311
  | 创建外部网站链接菜单 | [`rabetbase menu external-link-create`](references/rabetbase-menu-external-link-create.md) | `write`;显式选择 `embedded` 或 `new-window`,仅接受 HTTPS;建议先 dry-run,正式执行不要求 `--yes` |
@@ -364,13 +364,13 @@ const result = await client.bff.execute<DashboardData>({
364
364
  | 删除 SQL | [`rabetbase sql delete --sqlcode xxx --yes`](references/rabetbase-sql-delete.md) | 删除远端并将本地文件移入 `.rabetbase/sql-trash/` |
365
365
  | 校验 SQL 内容 | [`rabetbase sql validate --file xxx`](references/rabetbase-sql-validate.md) | 类型检测、危险语句检查、参数提取 |
366
366
  | 执行 SQL 查询 | [`rabetbase sql exec --sqlcode xxx`](references/rabetbase-sql-exec.md) | 支持 `--params` JSON 参数 |
367
- | 查看现有 BFF | [`rabetbase bff list`](references/rabetbase-bff-list.md) | 按类型和名称过滤,支持 `--app` 限定应用 |
368
- | 查看 BFF 详情 | [`rabetbase bff detail --id n`](references/rabetbase-bff-detail.md) | 含完整脚本内容 |
369
- | 创建本地 BFF | [`rabetbase bff create --type ENDPOINT --name xxx`](references/rabetbase-bff-create.md) | 在 `.rabetbase/bff/<appCode>/...` 下创建脚手架 |
370
- | 查看 BFF 本地状态 | [`rabetbase bff status`](references/rabetbase-bff-status.md) | 检查 added / modified / unchanged / remoteOnly |
371
- | 拉取远端 BFF | [`rabetbase bff pull`](references/rabetbase-bff-pull.md) | 从远端同步到本地 |
372
- | 推送本地 BFF | [`rabetbase bff push`](references/rabetbase-bff-push.md) | `write`;建议先 dry-run,正式执行不要求 `--yes` |
373
- | 删除 BFF | [`rabetbase bff delete --yes --target xxx`](references/rabetbase-bff-delete.md) | high-risk-write,删远端并清理本地 |
367
+ | 查看现有 Backend Function | [`rabetbase bff list`](references/rabetbase-bff-list.md) | 按类型和名称过滤,支持 `--app` 限定应用 |
368
+ | 查看 Backend Function 详情 | [`rabetbase bff detail --id n`](references/rabetbase-bff-detail.md) | 含完整脚本内容 |
369
+ | 创建本地 Backend Function | [`rabetbase bff create --type ENDPOINT --name xxx`](references/rabetbase-bff-create.md) | 在 `.rabetbase/bff/<appCode>/...` 下创建脚手架 |
370
+ | 查看 Backend Function 本地状态 | [`rabetbase bff status`](references/rabetbase-bff-status.md) | 检查 added / modified / unchanged / remoteOnly |
371
+ | 拉取远端 Backend Function | [`rabetbase bff pull`](references/rabetbase-bff-pull.md) | 从远端同步到本地 |
372
+ | 推送本地 Backend Function | [`rabetbase bff push`](references/rabetbase-bff-push.md) | `write`;建议先 dry-run,正式执行不要求 `--yes` |
373
+ | 删除 Backend Function | [`rabetbase bff delete --yes --target xxx`](references/rabetbase-bff-delete.md) | high-risk-write,删远端并清理本地 |
374
374
  | 生成 SDK 代码 | [`rabetbase codegen sdk --code xxx`](references/rabetbase-codegen-sdk.md) | 按操作生成 TypeScript |
375
375
  | 生成 SQL 调用代码 | [`rabetbase codegen sql --sqlcode xxx`](references/rabetbase-codegen-sql.md) | sdk/bff 两种 target |
376
376
  | 列出已配置应用 | [`rabetbase app list`](references/rabetbase-app-list.md) | 默认合并视图;`--global` / `--project` 限定单层;`items[].named`、`meta` 见 reference |
@@ -489,11 +489,11 @@ const result = await client.bff.execute<DashboardData>({
489
489
  | SQL MyBatis 与动态 SQL | 写自定义 SQL、`<if>`/`<foreach>`、参数绑定 | [`sql-mybatis.md`](guides/sql-mybatis.md) |
490
490
  | 前端页面开发约束 | React 页、表单、列表、与数据集绑定 | [`frontend-development.md`](guides/frontend-development.md) |
491
491
  | 故障诊断 | CLI/登录/数据集/保存失败排障 | [`troubleshooting.md`](guides/troubleshooting.md) |
492
- | BFF 脚本规范 | HOOK/ENDPOINT/COMMON、`context.client`、消息通知扩展、目录与注释模板 | [`backend-function.md`](guides/backend-function.md) |
492
+ | Backend Function 脚本规范 | HOOK/ENDPOINT/COMMON、`context.client`、消息通知扩展、目录与注释模板 | [`backend-function.md`](guides/backend-function.md) |
493
493
  | 数据接口访问 | 先 detail 再编码、外键/枚举、禁止 N+1、批量与关联查询;可选 `lovrabet data` 查数(**`lovrabet` CLI ≥ 2.0** 且已安装) | [`data-api-guidelines.md`](guides/data-api-guidelines.md) |
494
494
  | SQL 创建工作流 | list/detail → pull/create → edit → validate → status → push/delete → exec 全链路 | [`sql-creation-workflow.md`](guides/sql-creation-workflow.md) |
495
- | BFF 创建工作流 | new → status → dry-run → pull/push | [`bff-creation-workflow.md`](guides/bff-creation-workflow.md) |
495
+ | Backend Function 创建工作流 | new → status → dry-run → pull/push | [`bff-creation-workflow.md`](guides/bff-creation-workflow.md) |
496
496
  | 冲突检测与保存 | `blocked`、未保存时的用户沟通、响应结构 | [`conflict-detection.md`](guides/conflict-detection.md) |
497
- | 质量与最佳实践 | 审查 SQL/BFF、命名、高危边界、描述字段 | [`best-practices.md`](guides/best-practices.md) |
497
+ | 质量与最佳实践 | 审查 SQL/Backend Function、命名、高危边界、描述字段 | [`best-practices.md`](guides/best-practices.md) |
498
498
  | 数据库连接与分析 | 接入/改连/测连、`traceId` 来源、`db analyze-*` 与 dataset 分工;子命令速查见上文 **「数据库连接(db)」** | [`database-connection-workflow.md`](guides/database-connection-workflow.md) |
499
499
  | 菜单异常审计与安全修复 | 重复 path、根级菜单重名、空 folder 删除计划和平台处理后回查 | [`menu-anomaly-manual-cleanup.md`](guides/menu-anomaly-manual-cleanup.md) |
@@ -10,7 +10,7 @@
10
10
  |------|------|
11
11
  | CLI 信封、`datasetId`、`dbtableConfig` ↔ `data.dbtable`、OpenAPI 对照 | [`references/rabetbase-dataset-detail.md`](../references/rabetbase-dataset-detail.md) |
12
12
  | 前后端数据访问、外键、性能 | [`data-api-guidelines.md`](data-api-guidelines.md) |
13
- | 在 BFF 中发送应用级消息通知 | 下文“消息通知扩展” |
13
+ | 在 Backend Function 中发送应用级消息通知 | 下文“消息通知扩展” |
14
14
  | HOOK/ENDPOINT 目录、注释模板、`context.client`、事务 | 下文 |
15
15
 
16
16
  ## 何时使用
@@ -19,22 +19,22 @@
19
19
 
20
20
  * 编写 HOOK 脚本
21
21
  * 编写 ENDPOINT 脚本
22
- * 在 BFF 中调用数据集 API
23
- * 在 BFF 中调用自定义 SQL
24
- * 在 BFF 中调用应用级消息通知
25
- * 在 BFF 中处理事务、权限、脱敏、聚合或多表逻辑
22
+ * 在 Backend Function 中调用数据集 API
23
+ * 在 Backend Function 中调用自定义 SQL
24
+ * 在 Backend Function 中调用应用级消息通知
25
+ * 在 Backend Function 中处理事务、权限、脱敏、聚合或多表逻辑
26
26
 
27
27
  ## 核心原则
28
28
 
29
29
  * 先校验数据集和字段,再写脚本
30
30
  * 所有脚本统一使用 `export default async function`
31
31
  * 前后端单条查询统一使用 `getOne({ id })`
32
- * BFF 中的 SQL 返回值与前端 SDK 不同,不能混用
32
+ * Backend Function 中的 SQL 返回值与前端 SDK 不同,不能混用
33
33
  * 消息通知只引用当前应用中存在且未删除的 `configCode`,不接收 `appCode`、渠道地址或密钥
34
34
  * 平台自动维护字段不得手动设置
35
35
  * 发现明显性能问题时,必须先改写再继续
36
- * 新建与长期维护的 BFF 源文件**仅**在 **`.rabetbase/bff/<appCode>/...`**(`bff create` / `bff pull` 与 `bff status` 扫描范围);不要写在 `src/` 等目录,详见 [`bff-creation-workflow.md`](bff-creation-workflow.md)
37
- * BFF 脚本只写**纯 JavaScript(ESM)**,支持到 **ES2023** 特性,不支持 TypeScript
36
+ * 新建与长期维护的 Backend Function 源文件**仅**在 **`.rabetbase/bff/<appCode>/...`**(`bff create` / `bff pull` 与 `bff status` 扫描范围);不要写在 `src/` 等目录,详见 [`bff-creation-workflow.md`](bff-creation-workflow.md)
37
+ * Backend Function 脚本只写**纯 JavaScript(ESM)**,支持到 **ES2023** 特性,不支持 TypeScript
38
38
 
39
39
  ## 脚本类型
40
40
 
@@ -42,9 +42,9 @@
42
42
  |------|------|----------------|----------|
43
43
  | HOOK | 挂在标准数据接口前后执行 | Before / After | 通过数据集详情 |
44
44
  | ENDPOINT | 独立业务端点 | `POST /api/endpoint/{appCode}/{scriptName}` | `rabetbase bff list --format json`(默认) |
45
- | COMMON | 公共函数,供其他脚本 import 复用 | 被其他 BFF 引用 | `rabetbase bff list --format json`(type=COMMON) |
45
+ | COMMON | 公共函数,供其他脚本 import 复用 | 被其他 Backend Function 引用 | `rabetbase bff list --format json`(type=COMMON) |
46
46
 
47
- BFF 前,先查一下公共函数列表(`rabetbase bff list --format json`),看是否有可复用的工具函数。
47
+ Backend Function 前,先查一下公共函数列表(`rabetbase bff list --format json`),看是否有可复用的工具函数。
48
48
 
49
49
  ## 平台配置地址
50
50
 
@@ -59,7 +59,7 @@
59
59
 
60
60
  ## 本地目录约定
61
61
 
62
- BFF 脚本统一存放在 `.rabetbase/bff/<appCode>/` 目录下,由 CLI 同步体系管理:
62
+ Backend Function 脚本统一存放在 `.rabetbase/bff/<appCode>/` 目录下,由 CLI 同步体系管理:
63
63
 
64
64
  ```text
65
65
  .rabetbase/bff/<appCode>/
@@ -110,7 +110,7 @@ HOOK 的第一层子目录名(标识数据集)按以下优先级确定:
110
110
 
111
111
  使用 `aggregate` 时,聚合列名写在 `aggregate[].column`;`field` 只是历史兼容别名,新脚本不要使用。
112
112
 
113
- BFF HOOK 可以挂在 `DB_TABLE` 或 `METADATA` 数据集上;是否可挂某个 operation,以平台返回的 operation types 为准。
113
+ Backend Function HOOK 可以挂在 `DB_TABLE` 或 `METADATA` 数据集上;是否可挂某个 operation,以平台返回的 operation types 为准。
114
114
 
115
115
  ### METADATA HOOK 脚本内部限制
116
116
 
@@ -142,7 +142,7 @@ METADATA 数据集没有 DB_TABLE 数据源上下文,脚本中优先使用标
142
142
 
143
143
  ### Step 2:校验数据集、字段与关系
144
144
 
145
- BFF 涉及数据集读写时,必须执行 `rabetbase dataset detail --code xxx --format json`(或 `--format compress`),必要时先用 `rabetbase dataset list --format json` 定位数据集。纯消息通知 ENDPOINT 不需要为满足流程而虚构 `datasetCode`,但必须先确认当前应用、通知 `configCode`、接收对象和消息内容契约。
145
+ Backend Function 涉及数据集读写时,必须执行 `rabetbase dataset detail --code xxx --format json`(或 `--format compress`),必要时先用 `rabetbase dataset list --format json` 定位数据集。纯消息通知 ENDPOINT 不需要为满足流程而虚构 `datasetCode`,但必须先确认当前应用、通知 `configCode`、接收对象和消息内容契约。
146
146
 
147
147
  必须确认:
148
148
 
@@ -163,7 +163,7 @@ rabetbase dataset detail --code <datasetCode> --format compress \
163
163
 
164
164
  * 未读取数据集详情就直接写字段名
165
165
  * 凭经验猜 `user_id`、`status`、`deleted` 等通用字段
166
- * 把前端代码里的字段名照搬到当前 BFF
166
+ * 把前端代码里的字段名照搬到当前 Backend Function
167
167
  * 把某个 Demo 或历史案例中的字段、枚举、表名当作当前任务的通用规则
168
168
 
169
169
  ### Step 3:选择脚本类型
@@ -192,7 +192,7 @@ rabetbase dataset detail --code <datasetCode> --format compress \
192
192
  * 修改时直接编辑 `.rabetbase/bff/<appCode>/...`
193
193
  * 需要远端最新内容时先 `rabetbase bff pull`
194
194
 
195
- 如果 BFF 行为与预期不符,或 `push` 显示 `unchanged` 但效果没变,先确认远端实际运行的是哪份代码:
195
+ 如果 Backend Function 行为与预期不符,或 `push` 显示 `unchanged` 但效果没变,先确认远端实际运行的是哪份代码:
196
196
 
197
197
  * `rabetbase bff detail --id <id> --format json`
198
198
  * 必要时再 `rabetbase bff pull --format json` 同步远端到本地
@@ -206,7 +206,7 @@ rabetbase dataset detail --code <datasetCode> --format compress \
206
206
  * 函数名匹配(用于 `scriptName` 参数)
207
207
  * 顶部注释占位符已替换
208
208
  * 单条查询是否统一使用 `getOne({ id })`
209
- * SQL 返回值是否按 BFF 语义处理
209
+ * SQL 返回值是否按 Backend Function 语义处理
210
210
  * 是否误设置系统字段
211
211
  * 是否存在明显性能问题
212
212
 
@@ -244,7 +244,7 @@ rabetbase dataset detail --code <datasetCode> --format compress \
244
244
  * 依赖数据集、调用 BF、执行 SQL 和副作用
245
245
  * 显式抛出异常时的异常类型与触发条件
246
246
 
247
- 字段级参数使用标准 JSDoc `@param` 标签,写清类型、含义、必填性和默认值。没有字段级参数时只保留根 `params` 标签,不要虚构字段。代码出现显式 `throw` 时必须补充 `@throws`;依赖维护项必须与实际代码同步,便于发布后提取为 BFF 元数据。
247
+ 字段级参数使用标准 JSDoc `@param` 标签,写清类型、含义、必填性和默认值。没有字段级参数时只保留根 `params` 标签,不要虚构字段。代码出现显式 `throw` 时必须补充 `@throws`;依赖维护项必须与实际代码同步,便于发布后提取为 Backend Function 元数据。
248
248
 
249
249
  占位符必须替换为真实值,不能保留:
250
250
 
@@ -395,7 +395,7 @@ await models[TABLES.primary].update({
395
395
 
396
396
  ### aggregate 调用与选型
397
397
 
398
- `` context.client.models[`dataset_${datasetCode}`].aggregate(params) `` 是 BFF 的数据集 Instant API。实际脚本仍按上文的数据集映射,通过 `models[TABLES.xxx]` 访问;示例字段只用于展示参数契约,编写业务脚本前必须用 `dataset detail` 替换为真实字段:
398
+ `` context.client.models[`dataset_${datasetCode}`].aggregate(params) `` 是 Backend Function 的数据集 Instant API。实际脚本仍按上文的数据集映射,通过 `models[TABLES.xxx]` 访问;示例字段只用于展示参数契约,编写业务脚本前必须用 `dataset detail` 替换为真实字段:
399
399
 
400
400
  ```javascript
401
401
  const aggregateResult = await models[TABLES.primary].aggregate({
@@ -550,7 +550,7 @@ export default async function afterFilter(params) {
550
550
 
551
551
  公共函数建议统一加 `common` 前缀(如 `commonGetUserInfo`),便于与普通 ENDPOINT 区分,也方便人和 AI 识别。
552
552
 
553
- ### 在其他 BFF 中调用公共函数
553
+ ### 在其他 Backend Function 中调用公共函数
554
554
 
555
555
  通过 `context.client.bff.execute` 调用:
556
556
 
@@ -597,9 +597,9 @@ export default async function runBusinessFlow(params, context) {
597
597
 
598
598
  ## SQL 调用规则
599
599
 
600
- BFF 入参使用业务参数;需要执行 SQL 时,通过已发布 Custom SQL 的 `sqlCode` + `params` 调用。执行失败时保留并报告原始错误,根据 SQL 资源状态、参数与权限定位问题。
600
+ Backend Function 入参使用业务参数;需要执行 SQL 时,通过已发布 Custom SQL 的 `sqlCode` + `params` 调用。执行失败时保留并报告原始错误,根据 SQL 资源状态、参数与权限定位问题。
601
601
 
602
- BFF 中使用:
602
+ Backend Function 中使用:
603
603
 
604
604
  ```javascript
605
605
  const rows = await context.client.sql.execute({
@@ -709,7 +709,7 @@ After HOOK 通知失败或超时时,原业务操作可能已经完成,通知
709
709
 
710
710
  ### 获取 configCode
711
711
 
712
- 创建或修改通知型 BFF 前,先查询当前应用的应用级通知配置:
712
+ 创建或修改通知型 Backend Function 前,先查询当前应用的应用级通知配置:
713
713
 
714
714
  ```bash
715
715
  rabetbase notification config-list --type EMAIL --format compress
@@ -719,7 +719,7 @@ rabetbase notification config-list --type EMAIL --format compress
719
719
 
720
720
  `configCode` 与 `channelCode` 不是同一概念:
721
721
 
722
- * `configCode`:应用级通知渠道配置编码,供 BFF `notification.send` 使用
722
+ * `configCode`:应用级通知渠道配置编码,供 Backend Function `notification.send` 使用
723
723
  * `channelCode`:dataset 级通知通道编码,不是本扩展的入参
724
724
 
725
725
  查询为空时说明当前应用没有该类型的可用配置;查询出多个候选且无法从名称和描述判断业务目标时,向用户确认,不得自动取第一条。
@@ -765,7 +765,7 @@ rabetbase notification config-list --type EMAIL --format compress
765
765
  | `facts` | 否 | 最多 8 项,每项严格为 `{ label, value }`,两个字段都是非空字符串 |
766
766
  | `actions` | 否 | 最多 2 项,每项严格为 `{ text, url }`,两个字段都是非空字符串 |
767
767
 
768
- 消息对象不允许额外字段,也不支持 `${...}` 模板表达式。运行时值应由 BFF 根据已校验的 `params` 直接组装,不要把模板语法交给通知扩展解析。
768
+ 消息对象不允许额外字段,也不支持 `${...}` 模板表达式。运行时值应由 Backend Function 根据已校验的 `params` 直接组装,不要把模板语法交给通知扩展解析。
769
769
 
770
770
  ### 返回值与副作用
771
771
 
@@ -784,7 +784,7 @@ rabetbase notification config-list --type EMAIL --format compress
784
784
 
785
785
  通知发送是外部可见副作用:
786
786
 
787
- * 创建/推送脚本的 dry-run 不会发送通知;只有执行 BFF 才会发送
787
+ * 创建/推送脚本的 dry-run 不会发送通知;只有执行 Backend Function 才会发送
788
788
  * 运行 smoke 前必须向用户展示当前应用、函数名、`configCode`、接收对象和消息摘要并取得确认
789
789
  * 面向多人调用的正式 ENDPOINT 必须在调用扩展前校验 `params` 的字段、类型和接收对象范围;固定业务通知优先在脚本内固定 `configCode` 和允许的接收范围,不要把任意渠道或任意收件人转发能力暴露给调用者
790
790
  * 超时或客户端未拿到结果时,发送状态可能未知;不得自动重试,避免重复通知
@@ -821,7 +821,7 @@ await context.client.db.transaction(async (tx) => {
821
821
 
822
822
  ## 性能约束
823
823
 
824
- 编写 BFF 前,必须阅读 `data-api-guidelines.md` 中的性能优化部分。
824
+ 编写 Backend Function 前,必须阅读 `data-api-guidelines.md` 中的性能优化部分。
825
825
 
826
826
  重点避免:
827
827
 
@@ -843,12 +843,12 @@ await context.client.db.transaction(async (tx) => {
843
843
  * 不要手动设置系统字段
844
844
  * 不要保留顶部注释占位符
845
845
  * 不要让参数、返回值、依赖数据集、调用 BF、执行 SQL 或副作用说明与实际代码不一致
846
- * 不要把前端 SQL 返回值语义套到 BFF
847
- * 不要在 BFF 中使用前端 SDK 独有的方法,如 `createClient`、`registerModels`
846
+ * 不要把前端 SQL 返回值语义套到 Backend Function
847
+ * 不要在 Backend Function 中使用前端 SDK 独有的方法,如 `createClient`、`registerModels`
848
848
  * 不要把示例里的字段名、表名、枚举值复制到真实脚本;字段事实必须来自当前数据集详情
849
849
  * 不要忽略权限、脱敏和错误处理
850
850
  * 不要在事务里做高延迟外部调用
851
- * 不要在未确认 `configCode`、接收对象和消息内容时执行通知型 BFF
851
+ * 不要在未确认 `configCode`、接收对象和消息内容时执行通知型 Backend Function
852
852
  * 不要把通知执行超时当作“肯定未发送”并自动重试
853
853
 
854
854
  ## 自检清单
@@ -868,7 +868,7 @@ await context.client.db.transaction(async (tx) => {
868
868
  * [ ] `batchCreate()` 直接接收非空对象数组,并按新记录 ID 数组处理返回值
869
869
  * [ ] 批量更新使用 `update({ id: [...] })`,没有使用不存在的 `batchUpdate()` 或记录数组参数
870
870
  * [ ] 枚举/选择字段写入 `options[].value`,不是展示 `label`
871
- * [ ] SQL 返回值按 BFF 语义处理
871
+ * [ ] SQL 返回值按 Backend Function 语义处理
872
872
  * [ ] 未设置系统自动维护字段
873
873
  * [ ] 无明显 N+1 或循环写入问题
874
874
  * [ ] HOOK 返回 `params`,ENDPOINT 返回业务对象