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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (364) hide show
  1. package/lib/api/api-doc.js +1 -1
  2. package/lib/api/fetch-model-list.js +1 -1
  3. package/lib/api/generate-api-file.d.ts +13 -3
  4. package/lib/api/generate-api-file.js +1 -1
  5. package/lib/api/generate-sdk-config-file.d.ts +7 -0
  6. package/lib/api/generate-sdk-config-file.js +1 -0
  7. package/lib/auth/auth-server-ui.js +1 -1
  8. package/lib/auth/auth-server.js +1 -1
  9. package/lib/auth/constant.js +1 -1
  10. package/lib/auth/get-cookie.js +1 -1
  11. package/lib/auth/get-session-user.js +1 -1
  12. package/lib/auth/is-session-valid.js +1 -1
  13. package/lib/auth/login-success-html.js +1 -1
  14. package/lib/auth/logout.js +1 -1
  15. package/lib/cli-flags.js +1 -1
  16. package/lib/cli.js +1 -1
  17. package/lib/commands/api/generate.js +1 -1
  18. package/lib/commands/api/index.js +1 -1
  19. package/lib/commands/api/list.js +1 -1
  20. package/lib/commands/api/pull.js +1 -1
  21. package/lib/commands/api/shared.js +1 -1
  22. package/lib/commands/app/index.js +1 -1
  23. package/lib/commands/app/list.js +1 -1
  24. package/lib/commands/app/members-list.js +1 -1
  25. package/lib/commands/app/remote-directory.js +1 -1
  26. package/lib/commands/app/shared.d.ts +2 -5
  27. package/lib/commands/app/shared.js +1 -1
  28. package/lib/commands/app-config/delete.js +1 -1
  29. package/lib/commands/app-config/get.js +1 -1
  30. package/lib/commands/app-config/index.js +1 -1
  31. package/lib/commands/app-config/list.js +1 -1
  32. package/lib/commands/app-config/set.js +1 -1
  33. package/lib/commands/app-config/shared.js +1 -1
  34. package/lib/commands/auth/index.js +1 -1
  35. package/lib/commands/bff/create.js +1 -1
  36. package/lib/commands/bff/delete.js +1 -1
  37. package/lib/commands/bff/detail.js +1 -1
  38. package/lib/commands/bff/index.js +1 -1
  39. package/lib/commands/bff/list.js +1 -1
  40. package/lib/commands/bff/pull.js +1 -1
  41. package/lib/commands/bff/push.js +1 -1
  42. package/lib/commands/bff/status.js +1 -1
  43. package/lib/commands/cli-skill/index.js +1 -1
  44. package/lib/commands/cli-update.js +1 -1
  45. package/lib/commands/codegen/index.js +1 -1
  46. package/lib/commands/codegen/sdk.js +1 -1
  47. package/lib/commands/codegen/sql.js +1 -1
  48. package/lib/commands/common/app-registry.js +1 -1
  49. package/lib/commands/common/app-selector.js +1 -1
  50. package/lib/commands/common/async-task.js +1 -1
  51. package/lib/commands/common/dry-run.js +1 -1
  52. package/lib/commands/common/flags.js +1 -1
  53. package/lib/commands/common/local-file.js +1 -1
  54. package/lib/commands/common/validate.js +1 -1
  55. package/lib/commands/config/delete.d.ts +5 -0
  56. package/lib/commands/config/delete.js +1 -0
  57. package/lib/commands/config/get.js +1 -1
  58. package/lib/commands/config/index.js +1 -1
  59. package/lib/commands/config/init.d.ts +12 -0
  60. package/lib/commands/config/init.js +1 -0
  61. package/lib/commands/config/list.js +1 -1
  62. package/lib/commands/config/set.js +1 -1
  63. package/lib/commands/config/shared.js +1 -1
  64. package/lib/commands/dataset/business-group-update.js +1 -1
  65. package/lib/commands/dataset/business-groups.js +1 -1
  66. package/lib/commands/dataset/capability.js +1 -1
  67. package/lib/commands/dataset/delete.js +1 -1
  68. package/lib/commands/dataset/detail.js +1 -1
  69. package/lib/commands/dataset/extend-update.js +1 -1
  70. package/lib/commands/dataset/field-update.js +1 -1
  71. package/lib/commands/dataset/generate.js +1 -1
  72. package/lib/commands/dataset/index.js +1 -1
  73. package/lib/commands/dataset/list.js +1 -1
  74. package/lib/commands/dataset/operations.js +1 -1
  75. package/lib/commands/dataset/relation-audit.js +1 -1
  76. package/lib/commands/dataset/relation-create.js +1 -1
  77. package/lib/commands/dataset/relation-delete.js +1 -1
  78. package/lib/commands/dataset/relation-shared.js +1 -1
  79. package/lib/commands/dataset/relation-update.js +1 -1
  80. package/lib/commands/dataset/relations.js +1 -1
  81. package/lib/commands/dataset/rename.js +1 -1
  82. package/lib/commands/dataset/restore.js +1 -1
  83. package/lib/commands/db/analysis-batching.js +1 -1
  84. package/lib/commands/db/analyze-batch-plan.js +1 -1
  85. package/lib/commands/db/analyze-cancel.js +1 -1
  86. package/lib/commands/db/analyze-start.js +1 -1
  87. package/lib/commands/db/analyze-status.js +1 -1
  88. package/lib/commands/db/create.js +1 -1
  89. package/lib/commands/db/delete.js +1 -1
  90. package/lib/commands/db/detail.js +1 -1
  91. package/lib/commands/db/diff-refresh-start.js +1 -1
  92. package/lib/commands/db/diff-refresh-status.js +1 -1
  93. package/lib/commands/db/diff.js +1 -1
  94. package/lib/commands/db/index.js +1 -1
  95. package/lib/commands/db/list.js +1 -1
  96. package/lib/commands/db/shared.js +1 -1
  97. package/lib/commands/db/tables.js +1 -1
  98. package/lib/commands/db/test.js +1 -1
  99. package/lib/commands/db/update.js +1 -1
  100. package/lib/commands/doctor.js +1 -1
  101. package/lib/commands/file/index.js +1 -1
  102. package/lib/commands/issue/index.js +1 -1
  103. package/lib/commands/issue/nudge.js +1 -1
  104. package/lib/commands/issue/report.js +1 -1
  105. package/lib/commands/issue/shared.js +1 -1
  106. package/lib/commands/kb/create.js +1 -1
  107. package/lib/commands/kb/delete.js +1 -1
  108. package/lib/commands/kb/detail.js +1 -1
  109. package/lib/commands/kb/index.js +1 -1
  110. package/lib/commands/kb/list.js +1 -1
  111. package/lib/commands/kb/search.js +1 -1
  112. package/lib/commands/kb/shared.js +1 -1
  113. package/lib/commands/kb/update.js +1 -1
  114. package/lib/commands/logs/index.js +1 -1
  115. package/lib/commands/menu/asset-update.js +1 -1
  116. package/lib/commands/menu/delete.js +1 -1
  117. package/lib/commands/menu/external-link-create.js +1 -1
  118. package/lib/commands/menu/external-link-update.js +1 -1
  119. package/lib/commands/menu/group-create.js +1 -1
  120. package/lib/commands/menu/group-update.js +1 -1
  121. package/lib/commands/menu/index.js +1 -1
  122. package/lib/commands/menu/list.js +1 -1
  123. package/lib/commands/menu/move.js +1 -1
  124. package/lib/commands/menu/regroup-start.js +1 -1
  125. package/lib/commands/menu/rename.js +1 -1
  126. package/lib/commands/menu/shared/compare-table.js +1 -1
  127. package/lib/commands/menu/shared/delete-plan.js +1 -1
  128. package/lib/commands/menu/shared/facts.js +1 -1
  129. package/lib/commands/menu/shared/index.js +1 -1
  130. package/lib/commands/menu/shared/inquirer.js +1 -1
  131. package/lib/commands/menu/shared/local-pages.js +1 -1
  132. package/lib/commands/menu/shared/logic.js +1 -1
  133. package/lib/commands/menu/shared/mutations.js +1 -1
  134. package/lib/commands/menu/shared/service.js +1 -1
  135. package/lib/commands/menu/shared/sync-core.js +1 -1
  136. package/lib/commands/menu/shared/update-core.js +1 -1
  137. package/lib/commands/menu/shared/valid-url.js +1 -1
  138. package/lib/commands/menu/sync.js +1 -1
  139. package/lib/commands/menu/visibility-update.js +1 -1
  140. package/lib/commands/notification/config-create.js +1 -1
  141. package/lib/commands/notification/config-delete.js +1 -1
  142. package/lib/commands/notification/config-list.js +1 -1
  143. package/lib/commands/notification/config-update.js +1 -1
  144. package/lib/commands/notification/index.js +1 -1
  145. package/lib/commands/notification/shared.js +1 -1
  146. package/lib/commands/ocr/index.js +1 -1
  147. package/lib/commands/page/create.js +1 -1
  148. package/lib/commands/page/custom/detail.js +1 -1
  149. package/lib/commands/page/custom/list.js +1 -1
  150. package/lib/commands/page/custom/publish.js +1 -1
  151. package/lib/commands/page/custom/shared.js +1 -1
  152. package/lib/commands/page/custom/syntax.js +1 -1
  153. package/lib/commands/page/custom/template.js +1 -1
  154. package/lib/commands/page/custom/update.js +1 -1
  155. package/lib/commands/page/data-list-status.js +1 -1
  156. package/lib/commands/page/generate-start.js +1 -1
  157. package/lib/commands/page/generate-status.js +1 -1
  158. package/lib/commands/page/index.js +1 -1
  159. package/lib/commands/page/pull.js +1 -1
  160. package/lib/commands/page/push.js +1 -1
  161. package/lib/commands/page/relation-audit.js +1 -1
  162. package/lib/commands/page/restore.js +1 -1
  163. package/lib/commands/page/shared.js +1 -1
  164. package/lib/commands/page/sync.js +1 -1
  165. package/lib/commands/project/create/enhanced-guided-create.js +1 -1
  166. package/lib/commands/project/create/format-elapsed.js +1 -1
  167. package/lib/commands/project/create/main.d.ts +1 -0
  168. package/lib/commands/project/create/main.js +1 -1
  169. package/lib/commands/project/create/materialize-project-template.d.ts +6 -2
  170. package/lib/commands/project/create/materialize-project-template.js +1 -1
  171. package/lib/commands/project/create/project-name.js +1 -1
  172. package/lib/commands/project/create/project-template-archive.js +1 -1
  173. package/lib/commands/project/create/project-template-path.js +1 -1
  174. package/lib/commands/project/create/use-copy-project-template.d.ts +1 -1
  175. package/lib/commands/project/create/use-copy-project-template.js +1 -1
  176. package/lib/commands/project/create/use-format-code.js +1 -1
  177. package/lib/commands/project/create/use-install-dependencies.js +1 -1
  178. package/lib/commands/project/index.js +1 -1
  179. package/lib/commands/project/upgrade.js +1 -1
  180. package/lib/commands/registry.d.ts +2 -2
  181. package/lib/commands/registry.js +1 -1
  182. package/lib/commands/role/delete.js +1 -1
  183. package/lib/commands/role/detail.js +1 -1
  184. package/lib/commands/role/index.js +1 -1
  185. package/lib/commands/role/list.js +1 -1
  186. package/lib/commands/role/shared.d.ts +1 -1
  187. package/lib/commands/role/shared.js +1 -1
  188. package/lib/commands/role/update.js +1 -1
  189. package/lib/commands/role/user-add.js +1 -1
  190. package/lib/commands/role/user-remove.js +1 -1
  191. package/lib/commands/role/user-resolve.js +1 -1
  192. package/lib/commands/run/index.js +1 -1
  193. package/lib/commands/schema.js +1 -1
  194. package/lib/commands/sql/create.js +1 -1
  195. package/lib/commands/sql/delete.js +1 -1
  196. package/lib/commands/sql/detail.js +1 -1
  197. package/lib/commands/sql/exec.js +1 -1
  198. package/lib/commands/sql/index.js +1 -1
  199. package/lib/commands/sql/list.js +1 -1
  200. package/lib/commands/sql/pull.js +1 -1
  201. package/lib/commands/sql/push.js +1 -1
  202. package/lib/commands/sql/shared.js +1 -1
  203. package/lib/commands/sql/status.js +1 -1
  204. package/lib/commands/sql/validate.js +1 -1
  205. package/lib/commands/task/index.js +1 -1
  206. package/lib/commands/task/status.js +1 -1
  207. package/lib/commands/tenant/index.js +1 -1
  208. package/lib/commands/tenant/members-list.js +1 -1
  209. package/lib/commands/tenant/shared.js +1 -1
  210. package/lib/commands/user-account/dingding-sandbox-bind.js +1 -1
  211. package/lib/commands/user-account/index.js +1 -1
  212. package/lib/commands/workspace/add.js +1 -1
  213. package/lib/commands/workspace/index.js +1 -1
  214. package/lib/commands/workspace/remove.js +1 -1
  215. package/lib/config/domain-config.d.ts +10 -0
  216. package/lib/config/domain-config.js +1 -0
  217. package/lib/config/schema.d.ts +3 -1
  218. package/lib/config/schema.js +1 -1
  219. package/lib/constant/cdn.js +1 -1
  220. package/lib/constant/cli.js +1 -1
  221. package/lib/constant/defaults.js +1 -1
  222. package/lib/constant/domain.d.ts +23 -1
  223. package/lib/constant/domain.js +1 -1
  224. package/lib/constant/env.js +1 -1
  225. package/lib/constant/output.js +1 -1
  226. package/lib/constant/paths.js +1 -1
  227. package/lib/constant/region.d.ts +9 -0
  228. package/lib/constant/region.js +1 -0
  229. package/lib/constant/risk.js +1 -1
  230. package/lib/context/app-resolver.js +1 -1
  231. package/lib/context/auth-resolver.js +1 -1
  232. package/lib/context/config-loader.d.ts +4 -6
  233. package/lib/context/config-loader.js +1 -1
  234. package/lib/context.d.ts +2 -2
  235. package/lib/context.js +1 -1
  236. package/lib/core/alias-resolver.js +1 -1
  237. package/lib/core/api-client.d.ts +2 -0
  238. package/lib/core/api-client.js +1 -1
  239. package/lib/core/bff/config.js +1 -1
  240. package/lib/core/bff/file-system.js +1 -1
  241. package/lib/core/bff/hash.js +1 -1
  242. package/lib/core/bff/lock.js +1 -1
  243. package/lib/core/bff/utils.js +1 -1
  244. package/lib/core/db-resolver.js +1 -1
  245. package/lib/core/page/file-system.js +1 -1
  246. package/lib/core/page/hash.js +1 -1
  247. package/lib/core/page/lock.js +1 -1
  248. package/lib/core/sql-index-auditor.js +1 -1
  249. package/lib/core/sql-sync/config.js +1 -1
  250. package/lib/core/sql-sync/file-system.js +1 -1
  251. package/lib/core/sql-sync/hash.js +1 -1
  252. package/lib/core/sql-sync/lock.js +1 -1
  253. package/lib/core/sql-sync/utils.js +1 -1
  254. package/lib/core/sql-validator.js +1 -1
  255. package/lib/errors.d.ts +11 -1
  256. package/lib/errors.js +1 -1
  257. package/lib/framework/build-all-flags.js +1 -1
  258. package/lib/framework/error-output.js +1 -1
  259. package/lib/framework/explicit-yes.js +1 -1
  260. package/lib/framework/flags.js +1 -1
  261. package/lib/framework/help.d.ts +2 -2
  262. package/lib/framework/help.js +1 -1
  263. package/lib/framework/index.js +1 -1
  264. package/lib/framework/output.js +1 -1
  265. package/lib/framework/response.js +1 -1
  266. package/lib/framework/runner-alias.js +1 -1
  267. package/lib/framework/runner.js +1 -1
  268. package/lib/framework/schema-export.js +1 -1
  269. package/lib/framework/types.js +1 -1
  270. package/lib/generated/build-info.d.ts +4 -4
  271. package/lib/generated/build-info.js +1 -1
  272. package/lib/help.js +1 -1
  273. package/lib/postinstall.js +1 -1
  274. package/lib/runtime/confirmation.js +1 -1
  275. package/lib/runtime/event.js +1 -1
  276. package/lib/runtime/index.js +1 -1
  277. package/lib/runtime/queue.js +1 -1
  278. package/lib/runtime/resolve.js +1 -1
  279. package/lib/skills/builtin-skill.js +1 -1
  280. package/lib/skills/main.js +1 -1
  281. package/lib/skills/npx-skills-add.js +1 -1
  282. package/lib/skills/skill-presence.js +1 -1
  283. package/lib/telemetry/cli-command-trace.js +1 -1
  284. package/lib/telemetry/cli-help-trace.js +1 -1
  285. package/lib/telemetry/ensure-cli-otel-config.js +1 -1
  286. package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
  287. package/lib/telemetry/send-cli-trace-log.js +1 -1
  288. package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
  289. package/lib/types/index.d.ts +28 -0
  290. package/lib/utils/ai_config.d.ts +1 -2
  291. package/lib/utils/ai_config.js +1 -1
  292. package/lib/utils/apply-jq-filter.js +1 -1
  293. package/lib/utils/cdn-config.js +1 -1
  294. package/lib/utils/check-sdk-version.js +1 -1
  295. package/lib/utils/cli-version-check.js +1 -1
  296. package/lib/utils/cli-version-policy.js +1 -1
  297. package/lib/utils/config.js +1 -1
  298. package/lib/utils/entity-with-id.js +1 -1
  299. package/lib/utils/file-utils.js +1 -1
  300. package/lib/utils/guides-cdn.js +1 -1
  301. package/lib/utils/http-client.js +1 -1
  302. package/lib/utils/is-non-interactive.js +1 -1
  303. package/lib/utils/logger.js +1 -1
  304. package/lib/utils/params.js +1 -1
  305. package/lib/utils/platform.js +1 -1
  306. package/lib/utils/sleep.js +1 -1
  307. package/lib/utils/template-replacer.js +1 -1
  308. package/lib/utils/update-notice.js +1 -1
  309. package/lib/utils/version.js +1 -1
  310. package/lib/utils/with-active-cookie.js +1 -1
  311. package/lib/utils/write-cli-side-channel.js +1 -1
  312. package/package.json +1 -3
  313. package/skills/rabetbase/SKILL.md +33 -28
  314. package/skills/rabetbase/guides/backend-function.md +41 -12
  315. package/skills/rabetbase/guides/bff-creation-workflow.md +6 -4
  316. package/skills/rabetbase/guides/custom-page-workflow.md +1 -1
  317. package/skills/rabetbase/guides/data-api-guidelines.md +8 -8
  318. package/skills/rabetbase/guides/database-connection-workflow.md +8 -16
  319. package/skills/rabetbase/guides/menu-anomaly-manual-cleanup.md +1 -6
  320. package/skills/rabetbase/guides/sdk-client-generation.md +146 -0
  321. package/skills/rabetbase/guides/sql-creation-workflow.md +1 -1
  322. package/skills/rabetbase/guides/troubleshooting.md +1 -1
  323. package/skills/rabetbase/guides/typescript-sdk.md +46 -10
  324. package/skills/rabetbase/references/rabetbase-api-list.md +4 -4
  325. package/skills/rabetbase/references/rabetbase-api-pull.md +44 -29
  326. package/skills/rabetbase/references/rabetbase-app-list.md +2 -2
  327. package/skills/rabetbase/references/rabetbase-auth-login.md +4 -2
  328. package/skills/rabetbase/references/rabetbase-bff-push.md +3 -1
  329. package/skills/rabetbase/references/rabetbase-codegen-sql.md +3 -1
  330. package/skills/rabetbase/references/rabetbase-config.md +75 -30
  331. package/skills/rabetbase/references/rabetbase-dataset-detail.md +1 -1
  332. package/skills/rabetbase/references/rabetbase-db-analyze.md +3 -3
  333. package/skills/rabetbase/references/rabetbase-db-detail.md +2 -2
  334. package/skills/rabetbase/references/rabetbase-db-diff-refresh.md +4 -4
  335. package/skills/rabetbase/references/rabetbase-db-diff.md +6 -9
  336. package/skills/rabetbase/references/rabetbase-doctor.md +1 -1
  337. package/skills/rabetbase/references/rabetbase-init.md +57 -51
  338. package/skills/rabetbase/references/rabetbase-kb.md +2 -0
  339. package/skills/rabetbase/references/rabetbase-page-create.md +1 -1
  340. package/skills/rabetbase/references/rabetbase-page-custom-detail.md +3 -3
  341. package/skills/rabetbase/references/rabetbase-page-custom-list.md +2 -2
  342. package/skills/rabetbase/references/rabetbase-project-create.md +12 -3
  343. package/skills/rabetbase/references/rabetbase-project-upgrade.md +2 -2
  344. package/skills/rabetbase/references/rabetbase-role-user-resolve.md +2 -2
  345. package/skills/rabetbase/references/rabetbase-user-account.md +1 -1
  346. package/skills/rabetbase/references/rabetbase-workspace.md +6 -6
  347. package/skills/rabetbase.manifest.json +4 -3
  348. package/templates/README.md +17 -28
  349. package/templates/generate-api/api.ts.tpl +3 -3
  350. package/templates/generate-api/client.ts.tpl +10 -37
  351. package/lib/commands/data/filter.d.ts +0 -7
  352. package/lib/commands/data/filter.js +0 -1
  353. package/lib/commands/data/getOne.d.ts +0 -7
  354. package/lib/commands/data/getOne.js +0 -1
  355. package/lib/commands/data/index.d.ts +0 -8
  356. package/lib/commands/data/index.js +0 -1
  357. package/lib/commands/data/shared.d.ts +0 -33
  358. package/lib/commands/data/shared.js +0 -1
  359. package/lib/commands/init/index.d.ts +0 -11
  360. package/lib/commands/init/index.js +0 -1
  361. package/lib/utils/rules-cdn.d.ts +0 -38
  362. package/lib/utils/rules-cdn.js +0 -1
  363. package/templates/rules/lovrabet_rules.mdc.tpl +0 -893
  364. package/templates/skill/SKILL.md.tpl +0 -120
@@ -1 +1 @@
1
- function a284_0x1f08(){const _0x4cd9d6=['1490qKgXpJ','307iddvsO','fetch','164570FzSXUn','18DqdjQJ','headers','*\x20请求失败,','text','status','json','name','750608whDxpn','get','30018iMUGxA','includes','235GeRWnf','statusText','message','767950qwGHwt','88kamgAY','signal','url','TypeError','Request\x20failed','log','ms\x20后进行第\x20','194865dqVmkz','10060281gDIVSL'];a284_0x1f08=function(){return _0x4cd9d6;};return a284_0x1f08();}(function(_0x4b7caa,_0x1d2706){const _0x2cd62f=a284_0x2e31,_0x543256=_0x4b7caa();while(!![]){try{const _0x5a60bb=-parseInt(_0x2cd62f(0x9a))/0x1*(parseInt(_0x2cd62f(0x99))/0x2)+-parseInt(_0x2cd62f(0x97))/0x3+parseInt(_0x2cd62f(0xa4))/0x4+-parseInt(_0x2cd62f(0xa8))/0x5*(parseInt(_0x2cd62f(0xa6))/0x6)+-parseInt(_0x2cd62f(0x9c))/0x7*(parseInt(_0x2cd62f(0x90))/0x8)+parseInt(_0x2cd62f(0x9d))/0x9*(-parseInt(_0x2cd62f(0x8f))/0xa)+parseInt(_0x2cd62f(0x98))/0xb;if(_0x5a60bb===_0x1d2706)break;else _0x543256['push'](_0x543256['shift']());}catch(_0x34c17d){_0x543256['push'](_0x543256['shift']());}}}(a284_0x1f08,0x275bc));export async function httpRequest(_0x324790,_0x46e0d2={}){const _0x40bc24=a284_0x2e31,{timeout:timeout=0x7530,retries:retries=0x3,retryDelay:retryDelay=0x3e8,headers:headers={}}=_0x46e0d2;let _0x119b0b=null;for(let _0x55089f=0x0;_0x55089f<=retries;_0x55089f++){try{const _0xe2d952=new AbortController(),_0x534bb4=setTimeout(()=>_0xe2d952['abort'](),timeout),_0x3b2d82=await fetch(_0x324790,{'headers':headers,'signal':_0xe2d952[_0x40bc24(0x91)]});clearTimeout(_0x534bb4);let _0x5828a6;const _0x4ffd11=_0x3b2d82[_0x40bc24(0x9e)][_0x40bc24(0xa5)]('content-type');return _0x4ffd11?.[_0x40bc24(0xa7)]('application/json')?_0x5828a6=await _0x3b2d82[_0x40bc24(0xa2)]():_0x5828a6=await _0x3b2d82[_0x40bc24(0xa0)](),{'ok':_0x3b2d82['ok'],'status':_0x3b2d82[_0x40bc24(0xa1)],'statusText':_0x3b2d82[_0x40bc24(0x8d)],'data':_0x5828a6,'headers':_0x3b2d82[_0x40bc24(0x9e)],'url':_0x3b2d82[_0x40bc24(0x92)],'text':()=>_0x3b2d82[_0x40bc24(0xa0)]()};}catch(_0x542663){_0x119b0b=_0x542663 instanceof Error?_0x542663:new Error(String(_0x542663));if(_0x55089f===retries)break;if(shouldRetry(_0x542663)){console[_0x40bc24(0x95)](_0x40bc24(0x9f)+retryDelay+_0x40bc24(0x96)+(_0x55089f+0x1)+'\x20次重试...'),await sleep(retryDelay);continue;}else break;}}throw _0x119b0b||new Error(_0x40bc24(0x94));}function a284_0x2e31(_0x16c257,_0x49c343){_0x16c257=_0x16c257-0x8d;const _0x1f0809=a284_0x1f08();let _0x2e3129=_0x1f0809[_0x16c257];return _0x2e3129;}function shouldRetry(_0x476b07){const _0x3684df=a284_0x2e31;if(_0x476b07 instanceof Error){if(_0x476b07[_0x3684df(0xa3)]==='AbortError')return![];if(_0x476b07[_0x3684df(0xa3)]===_0x3684df(0x93)&&_0x476b07[_0x3684df(0x8e)]['includes'](_0x3684df(0x9b)))return!![];if(_0x476b07[_0x3684df(0x8e)][_0x3684df(0xa7)]('ECONNRESET'))return!![];if(_0x476b07[_0x3684df(0x8e)][_0x3684df(0xa7)]('ENOTFOUND'))return![];}return![];}function sleep(_0x161f22){return new Promise(_0x8da618=>setTimeout(_0x8da618,_0x161f22));}export function validateUrl(_0x47ebfd){try{return new URL(_0x47ebfd),!![];}catch{return![];}}
1
+ (function(_0x3dd85e,_0x2bea29){const _0x200f12=a284_0xe97b,_0x3b5b57=_0x3dd85e();while(!![]){try{const _0xd2d11d=parseInt(_0x200f12(0x17d))/0x1*(parseInt(_0x200f12(0x17a))/0x2)+parseInt(_0x200f12(0x185))/0x3*(-parseInt(_0x200f12(0x17e))/0x4)+-parseInt(_0x200f12(0x174))/0x5+-parseInt(_0x200f12(0x170))/0x6+parseInt(_0x200f12(0x182))/0x7*(-parseInt(_0x200f12(0x175))/0x8)+parseInt(_0x200f12(0x171))/0x9+-parseInt(_0x200f12(0x17f))/0xa;if(_0xd2d11d===_0x2bea29)break;else _0x3b5b57['push'](_0x3b5b57['shift']());}catch(_0x8c978a){_0x3b5b57['push'](_0x3b5b57['shift']());}}}(a284_0x1927,0x1af4f));export async function httpRequest(_0x17d229,_0x50cb76={}){const _0x2f3654=a284_0xe97b,{timeout:timeout=0x7530,retries:retries=0x3,retryDelay:retryDelay=0x3e8,headers:headers={}}=_0x50cb76;let _0x112e6f=null;for(let _0x12a1a0=0x0;_0x12a1a0<=retries;_0x12a1a0++){try{const _0x5c1dce=new AbortController(),_0x16689e=setTimeout(()=>_0x5c1dce[_0x2f3654(0x187)](),timeout),_0x442bea=await fetch(_0x17d229,{'headers':headers,'signal':_0x5c1dce[_0x2f3654(0x189)]});clearTimeout(_0x16689e);let _0x361e45;const _0x19b7f5=_0x442bea[_0x2f3654(0x181)]['get'](_0x2f3654(0x184));return _0x19b7f5?.['includes'](_0x2f3654(0x18a))?_0x361e45=await _0x442bea[_0x2f3654(0x176)]():_0x361e45=await _0x442bea['text'](),{'ok':_0x442bea['ok'],'status':_0x442bea[_0x2f3654(0x180)],'statusText':_0x442bea[_0x2f3654(0x186)],'data':_0x361e45,'headers':_0x442bea[_0x2f3654(0x181)],'url':_0x442bea['url'],'text':()=>_0x442bea['text']()};}catch(_0x314b14){_0x112e6f=_0x314b14 instanceof Error?_0x314b14:new Error(String(_0x314b14));if(_0x12a1a0===retries)break;if(shouldRetry(_0x314b14)){console[_0x2f3654(0x178)](_0x2f3654(0x188)+(_0x12a1a0+0x1)+'\x20in\x20'+retryDelay+_0x2f3654(0x173)),await sleep(retryDelay);continue;}else break;}}throw _0x112e6f||new Error('Request\x20failed');}function a284_0xe97b(_0x41a939,_0x2bdfb4){_0x41a939=_0x41a939-0x16f;const _0x19272b=a284_0x1927();let _0xe97bb3=_0x19272b[_0x41a939];return _0xe97bb3;}function shouldRetry(_0x5beb10){const _0x2d12ce=a284_0xe97b;if(_0x5beb10 instanceof Error){if(_0x5beb10[_0x2d12ce(0x183)]===_0x2d12ce(0x177))return![];if(_0x5beb10['name']===_0x2d12ce(0x17c)&&_0x5beb10[_0x2d12ce(0x172)][_0x2d12ce(0x17b)](_0x2d12ce(0x16f)))return!![];if(_0x5beb10['message'][_0x2d12ce(0x17b)]('ECONNRESET'))return!![];if(_0x5beb10[_0x2d12ce(0x172)][_0x2d12ce(0x17b)](_0x2d12ce(0x179)))return![];}return![];}function sleep(_0x246acf){return new Promise(_0x11afb5=>setTimeout(_0x11afb5,_0x246acf));}export function validateUrl(_0x511a75){try{return new URL(_0x511a75),!![];}catch{return![];}}function a284_0x1927(){const _0x154bda=['application/json','fetch','399072OrdyfM','1673874jcHGBI','message','ms...','373650myvBqr','16WCzkuX','json','AbortError','log','ENOTFOUND','205438BngIGQ','includes','TypeError','1lVOyRb','4436HkdlHE','111230ltuENw','status','headers','55804cLEKOY','name','content-type','27OYduPD','statusText','abort','*\x20Request\x20failed;\x20retry\x20','signal'];a284_0x1927=function(){return _0x154bda;};return a284_0x1927();}
@@ -1 +1 @@
1
- (function(_0xc3f019,_0x4c4097){const _0x5521cb=a285_0x1aa3,_0x3ad70f=_0xc3f019();while(!![]){try{const _0x352f27=parseInt(_0x5521cb(0xeb))/0x1+parseInt(_0x5521cb(0xe8))/0x2*(parseInt(_0x5521cb(0xde))/0x3)+-parseInt(_0x5521cb(0xe9))/0x4+-parseInt(_0x5521cb(0xe1))/0x5*(-parseInt(_0x5521cb(0xe6))/0x6)+parseInt(_0x5521cb(0xe0))/0x7*(-parseInt(_0x5521cb(0xe3))/0x8)+-parseInt(_0x5521cb(0xe5))/0x9+-parseInt(_0x5521cb(0xe7))/0xa;if(_0x352f27===_0x4c4097)break;else _0x3ad70f['push'](_0x3ad70f['shift']());}catch(_0x25526a){_0x3ad70f['push'](_0x3ad70f['shift']());}}}(a285_0x4d7d,0xf3ed8));function env(_0x595c8c){return process.env[`RABETBASE_${_0x595c8c}`]||process.env[`LOVRABET_${_0x595c8c}`]||undefined;}export function isNonInteractive(_0x3a943b){const _0x2bafe7=a285_0x1aa3;return!!(_0x3a943b[_0x2bafe7(0xdf)]||_0x3a943b['ci']||env('CI')===_0x2bafe7(0xe4)||process.env.CI===_0x2bafe7(0xe4)||!process[_0x2bafe7(0xed)][_0x2bafe7(0xea)]||!isStdinRawModeSupported());}function a285_0x1aa3(_0x3dd344,_0x583f2){_0x3dd344=_0x3dd344-0xdd;const _0x4d7d55=a285_0x4d7d();let _0x1aa368=_0x4d7d55[_0x3dd344];return _0x1aa368;}function isStdinRawModeSupported(){const _0x4478d2=a285_0x1aa3;if(!process[_0x4478d2(0xdd)][_0x4478d2(0xea)])return![];try{const _0x2840dd=process[_0x4478d2(0xdd)][_0x4478d2(0xe2)];return process[_0x4478d2(0xdd)][_0x4478d2(0xec)](!![]),process[_0x4478d2(0xdd)][_0x4478d2(0xec)](_0x2840dd??![]),!![];}catch{return![];}}function a285_0x4d7d(){const _0x3eb7ff=['8689610uUaOKu','2911242uoDWEJ','6228096WjFqiK','isTTY','1448010OPOsqF','setRawMode','stdout','stdin','3hcImUF','nonInteractive','8736EAOCcc','8377210JHxlRn','isRaw','6832mWqLwr','true','793512SsZOfR','6tfLWCY'];a285_0x4d7d=function(){return _0x3eb7ff;};return a285_0x4d7d();}
1
+ (function(_0x377aa4,_0x56f6d6){const _0x1d66e7=a285_0x37c1,_0x189df9=_0x377aa4();while(!![]){try{const _0x159070=parseInt(_0x1d66e7(0x180))/0x1*(parseInt(_0x1d66e7(0x182))/0x2)+-parseInt(_0x1d66e7(0x17b))/0x3+-parseInt(_0x1d66e7(0x183))/0x4+-parseInt(_0x1d66e7(0x181))/0x5+parseInt(_0x1d66e7(0x17c))/0x6+-parseInt(_0x1d66e7(0x17d))/0x7*(-parseInt(_0x1d66e7(0x17f))/0x8)+-parseInt(_0x1d66e7(0x17a))/0x9;if(_0x159070===_0x56f6d6)break;else _0x189df9['push'](_0x189df9['shift']());}catch(_0x51f1ec){_0x189df9['push'](_0x189df9['shift']());}}}(a285_0x58e4,0xb26b8));function env(_0x40d977){return process.env[`RABETBASE_${_0x40d977}`]||process.env[`LOVRABET_${_0x40d977}`]||undefined;}function a285_0x37c1(_0x410f3c,_0xfae618){_0x410f3c=_0x410f3c-0x179;const _0x58e405=a285_0x58e4();let _0x37c1f8=_0x58e405[_0x410f3c];return _0x37c1f8;}export function isNonInteractive(_0x50d158){const _0x2a6e8d=a285_0x37c1;return!!(_0x50d158['nonInteractive']||_0x50d158['ci']||env('CI')===_0x2a6e8d(0x186)||process.env.CI==='true'||!process[_0x2a6e8d(0x184)]['isTTY']||!isStdinRawModeSupported());}function a285_0x58e4(){const _0x318c52=['708144AmOCqI','7599420zMmKGX','35wCboPf','isRaw','1741232oIXnvv','4481JYddOd','6247495ZiBnJx','502nvMlwQ','4774784LfTXsP','stdout','setRawMode','true','stdin','625680XkdqvL'];a285_0x58e4=function(){return _0x318c52;};return a285_0x58e4();}function isStdinRawModeSupported(){const _0x42c17d=a285_0x37c1;if(!process[_0x42c17d(0x179)]['isTTY'])return![];try{const _0x46a5b5=process[_0x42c17d(0x179)][_0x42c17d(0x17e)];return process[_0x42c17d(0x179)][_0x42c17d(0x185)](!![]),process['stdin'][_0x42c17d(0x185)](_0x46a5b5??![]),!![];}catch{return![];}}
@@ -1 +1 @@
1
- const a286_0x4191b6=a286_0x1bc7;(function(_0x35348b,_0x215237){const _0x389ea1=a286_0x1bc7,_0x1aba5a=_0x35348b();while(!![]){try{const _0x27941d=-parseInt(_0x389ea1(0x112))/0x1+parseInt(_0x389ea1(0x111))/0x2*(-parseInt(_0x389ea1(0x10b))/0x3)+parseInt(_0x389ea1(0x110))/0x4+-parseInt(_0x389ea1(0x109))/0x5+-parseInt(_0x389ea1(0x120))/0x6+-parseInt(_0x389ea1(0x119))/0x7*(parseInt(_0x389ea1(0x12b))/0x8)+parseInt(_0x389ea1(0x128))/0x9;if(_0x27941d===_0x215237)break;else _0x1aba5a['push'](_0x1aba5a['shift']());}catch(_0x4fdcdd){_0x1aba5a['push'](_0x1aba5a['shift']());}}}(a286_0x3c27,0x78ae6));function a286_0x1bc7(_0x1cbfd8,_0x3dc3ab){_0x1cbfd8=_0x1cbfd8-0x109;const _0x3c272a=a286_0x3c27();let _0x1bc75a=_0x3c272a[_0x1cbfd8];return _0x1bc75a;}import a286_0x19ee29 from'winston';import a286_0x15cfb1 from'node:fs';import a286_0x5adfa3 from'node:path';class Logger{[a286_0x4191b6(0x13f)];[a286_0x4191b6(0x11f)];[a286_0x4191b6(0x126)]='';constructor(){const _0x467c00=a286_0x4191b6;this[_0x467c00(0x11f)]='';}['setRawCommand'](_0x3ead1d){const _0x3d66c6=a286_0x4191b6;this[_0x3d66c6(0x126)]=_0x3ead1d;}['initWinstonLogger'](){const _0xfbb779=a286_0x4191b6,_0x2bf6b6=a286_0x5adfa3['dirname'](this[_0xfbb779(0x11f)]);!a286_0x15cfb1[_0xfbb779(0x13e)](_0x2bf6b6)&&a286_0x15cfb1[_0xfbb779(0x10a)](_0x2bf6b6,{'recursive':!![]});const _0x1b88d2=a286_0x19ee29[_0xfbb779(0x136)][_0xfbb779(0x10f)](a286_0x19ee29[_0xfbb779(0x136)][_0xfbb779(0x127)](),a286_0x19ee29[_0xfbb779(0x136)]['errors']({'stack':!![]}),a286_0x19ee29[_0xfbb779(0x136)][_0xfbb779(0x124)](_0x5d878c=>{const _0x16db1f=_0xfbb779,_0x3483de={'timestamp':_0x5d878c['timestamp']||new Date()['toISOString'](),'level':_0x5d878c['level']||_0x16db1f(0x13b),'command':_0x5d878c[_0x16db1f(0x11c)]||_0x16db1f(0x11b),'rawCommand':_0x5d878c[_0x16db1f(0x118)]||this['currentRawCommand']||undefined,'message':_0x5d878c[_0x16db1f(0x138)]||'','duration':_0x5d878c[_0x16db1f(0x134)]||undefined,'details':_0x5d878c['details']||undefined};return JSON[_0x16db1f(0x12e)](_0x3483de);}));this[_0xfbb779(0x13f)]=a286_0x19ee29[_0xfbb779(0x10d)]({'level':_0xfbb779(0x13b),'format':_0x1b88d2,'transports':[new a286_0x19ee29['transports'][(_0xfbb779(0x123))]({'filename':this['logFilePath'],'level':'info'})],'silent':![]}),a286_0x19ee29[_0xfbb779(0x121)]({'success':'green','error':_0xfbb779(0x131),'warn':_0xfbb779(0x115),'info':_0xfbb779(0x11d)});}[a286_0x4191b6(0x117)](_0xccb29b){const _0x18802b=a286_0x4191b6;this[_0x18802b(0x11f)]=a286_0x5adfa3[_0x18802b(0x125)](_0xccb29b,_0x18802b(0x139)),this[_0x18802b(0x13f)]&&this[_0x18802b(0x13f)][_0x18802b(0x133)](),this['initWinstonLogger']();}['info'](_0x354f51,_0x2f9cf4,_0x43cd9b){const _0x330b5b=a286_0x4191b6;if(!this['logFilePath']||!this[_0x330b5b(0x13f)])return;this[_0x330b5b(0x13f)][_0x330b5b(0x13b)](_0x2f9cf4,{'command':_0x354f51,'details':_0x43cd9b});}['success'](_0x14304b,_0x633776,_0x32197f,_0x58615e){const _0x3052b1=a286_0x4191b6;if(!this['logFilePath']||!this[_0x3052b1(0x13f)])return;this[_0x3052b1(0x13f)][_0x3052b1(0x10c)](_0x3052b1(0x13b),_0x633776,{'level':'success','command':_0x14304b,'duration':_0x32197f,'details':_0x58615e});}[a286_0x4191b6(0x135)](_0x4ff1d9,_0x3d67b1,_0x413621){const _0xcd692f=a286_0x4191b6;if(!this[_0xcd692f(0x11f)]||!this[_0xcd692f(0x13f)])return;this[_0xcd692f(0x13f)]['error'](_0x3d67b1,{'command':_0x4ff1d9,'details':_0x413621});}[a286_0x4191b6(0x12a)](_0x402e7b,_0x5675db,_0x14d214){const _0x7c0f16=a286_0x4191b6;if(!this[_0x7c0f16(0x11f)]||!this[_0x7c0f16(0x13f)])return;this['winstonLogger'][_0x7c0f16(0x12a)](_0x5675db,{'command':_0x402e7b,'details':_0x14d214});}async[a286_0x4191b6(0x137)](_0x482ee0,_0x196ba6,_0x55fc79){const _0xf874f=a286_0x4191b6,_0x5669e6=Date[_0xf874f(0x114)]();this[_0xf874f(0x13b)](_0x482ee0,_0xf874f(0x10e)+_0x196ba6);try{const _0x5e2d77=await _0x55fc79(),_0xd2f6da=Date['now']()-_0x5669e6;return this[_0xf874f(0x13d)](_0x482ee0,_0xf874f(0x132)+_0x196ba6,_0xd2f6da),_0x5e2d77;}catch(_0x546592){const _0x18f62d=Date[_0xf874f(0x114)]()-_0x5669e6;this[_0xf874f(0x135)](_0x482ee0,_0xf874f(0x13a)+_0x196ba6,{'error':_0x546592 instanceof Error?_0x546592['message']:String(_0x546592),'duration':_0x18f62d});throw _0x546592;}}[a286_0x4191b6(0x12f)](){const _0x34d3dd=a286_0x4191b6;try{if(!a286_0x15cfb1['existsSync'](this[_0x34d3dd(0x11f)]))return[];const _0x255bff=a286_0x15cfb1[_0x34d3dd(0x122)](this[_0x34d3dd(0x11f)],_0x34d3dd(0x11e));return _0x255bff[_0x34d3dd(0x13c)]('\x0a')['filter'](_0x59cabf=>_0x59cabf[_0x34d3dd(0x116)]())[_0x34d3dd(0x11a)](_0x1ebf7e=>JSON[_0x34d3dd(0x12d)](_0x1ebf7e));}catch(_0x20e319){return console[_0x34d3dd(0x12a)](_0x34d3dd(0x113),_0x20e319),[];}}[a286_0x4191b6(0x130)](){const _0x42c047=a286_0x4191b6;try{a286_0x15cfb1[_0x42c047(0x13e)](this['logFilePath'])&&a286_0x15cfb1[_0x42c047(0x129)](this[_0x42c047(0x11f)],'',_0x42c047(0x11e));}catch(_0x19c3cd){console[_0x42c047(0x12a)]('Failed\x20to\x20clear\x20logs:',_0x19c3cd);}}[a286_0x4191b6(0x12c)](){const _0x1bd8ef=a286_0x4191b6;return this[_0x1bd8ef(0x13f)];}}function a286_0x3c27(){const _0x316e5a=['6yfjUGl','log','createLogger','开始执行:\x20','combine','3778856SxSeWS','407654MbuxZq','709989nJTGrr','Failed\x20to\x20read\x20logs:','now','yellow','trim','setLogPath','rawCommand','7DVrMHK','map','unknown','command','blue','utf8','logFilePath','425688RGEsUu','addColors','readFileSync','File','printf','join','currentRawCommand','timestamp','11014677uXQlmo','writeFileSync','warn','1654112qlsJBo','getWinstonInstance','parse','stringify','readLogs','clearLogs','red','完成:\x20','clear','duration','error','format','logTask','message','.lovrabet.log','失败:\x20','info','split','success','existsSync','winstonLogger','1394510mVbRCb','mkdirSync'];a286_0x3c27=function(){return _0x316e5a;};return a286_0x3c27();}export const logger=new Logger();
1
+ const a286_0x228f31=a286_0x46fe;(function(_0xd4c243,_0x88d05e){const _0x51a751=a286_0x46fe,_0x494892=_0xd4c243();while(!![]){try{const _0x4c90cf=parseInt(_0x51a751(0x1d6))/0x1*(-parseInt(_0x51a751(0x1cd))/0x2)+-parseInt(_0x51a751(0x1dd))/0x3+-parseInt(_0x51a751(0x1db))/0x4+parseInt(_0x51a751(0x1dc))/0x5+-parseInt(_0x51a751(0x1d8))/0x6*(-parseInt(_0x51a751(0x1d9))/0x7)+parseInt(_0x51a751(0x1e1))/0x8+-parseInt(_0x51a751(0x1bf))/0x9;if(_0x4c90cf===_0x88d05e)break;else _0x494892['push'](_0x494892['shift']());}catch(_0x5313c5){_0x494892['push'](_0x494892['shift']());}}}(a286_0x5e89,0x9dfe2));import a286_0x1928a3 from'winston';import a286_0x25a645 from'node:fs';function a286_0x5e89(){const _0x5e282a=['currentRawCommand','warn','addColors','winstonLogger','red','info','readFileSync','logFilePath','setRawCommand','.lovrabet.log','combine','14vQyCXq','success','stringify','File','green','createLogger','dirname','details','error','52593YcLlkC','now','1146OfuMRD','6559eAMfjV','Failed\x20to\x20read\x20logs:','561176UVvUMX','4852680KPchOK','463617qyvMhb','duration','Failed:\x20','errors','9947840mwjBDr','printf','Completed:\x20','existsSync','join','writeFileSync','filter','parse','trim','clearLogs','level','split','timestamp','rawCommand','map','Failed\x20to\x20clear\x20logs:','readLogs','utf8','command','format','Starting:\x20','9745749zkFWGW','blue','message'];a286_0x5e89=function(){return _0x5e282a;};return a286_0x5e89();}import a286_0x1dbb31 from'node:path';function a286_0x46fe(_0xb5c05c,_0xc63be1){_0xb5c05c=_0xb5c05c-0x1af;const _0x5e8954=a286_0x5e89();let _0x46fe6b=_0x5e8954[_0xb5c05c];return _0x46fe6b;}class Logger{[a286_0x228f31(0x1c5)];[a286_0x228f31(0x1c9)];[a286_0x228f31(0x1c2)]='';constructor(){const _0x2a4eb0=a286_0x228f31;this[_0x2a4eb0(0x1c9)]='';}[a286_0x228f31(0x1ca)](_0x5c3c0c){const _0x5a3d34=a286_0x228f31;this[_0x5a3d34(0x1c2)]=_0x5c3c0c;}['initWinstonLogger'](){const _0xeb1577=a286_0x228f31,_0x18a117=a286_0x1dbb31[_0xeb1577(0x1d3)](this['logFilePath']);!a286_0x25a645[_0xeb1577(0x1e4)](_0x18a117)&&a286_0x25a645['mkdirSync'](_0x18a117,{'recursive':!![]});const _0x1a6c17=a286_0x1928a3[_0xeb1577(0x1bd)][_0xeb1577(0x1cc)](a286_0x1928a3[_0xeb1577(0x1bd)][_0xeb1577(0x1b6)](),a286_0x1928a3[_0xeb1577(0x1bd)][_0xeb1577(0x1e0)]({'stack':!![]}),a286_0x1928a3[_0xeb1577(0x1bd)][_0xeb1577(0x1e2)](_0x473764=>{const _0x50c3df=_0xeb1577,_0x1097c8={'timestamp':_0x473764['timestamp']||new Date()['toISOString'](),'level':_0x473764[_0x50c3df(0x1b4)]||_0x50c3df(0x1c7),'command':_0x473764[_0x50c3df(0x1bc)]||'unknown','rawCommand':_0x473764[_0x50c3df(0x1b7)]||this[_0x50c3df(0x1c2)]||undefined,'message':_0x473764[_0x50c3df(0x1c1)]||'','duration':_0x473764[_0x50c3df(0x1de)]||undefined,'details':_0x473764[_0x50c3df(0x1d4)]||undefined};return JSON[_0x50c3df(0x1cf)](_0x1097c8);}));this[_0xeb1577(0x1c5)]=a286_0x1928a3[_0xeb1577(0x1d2)]({'level':_0xeb1577(0x1c7),'format':_0x1a6c17,'transports':[new a286_0x1928a3['transports'][(_0xeb1577(0x1d0))]({'filename':this[_0xeb1577(0x1c9)],'level':_0xeb1577(0x1c7)})],'silent':![]}),a286_0x1928a3[_0xeb1577(0x1c4)]({'success':_0xeb1577(0x1d1),'error':_0xeb1577(0x1c6),'warn':'yellow','info':_0xeb1577(0x1c0)});}['setLogPath'](_0x33caac){const _0x6dbde6=a286_0x228f31;this['logFilePath']=a286_0x1dbb31[_0x6dbde6(0x1e5)](_0x33caac,_0x6dbde6(0x1cb)),this[_0x6dbde6(0x1c5)]&&this[_0x6dbde6(0x1c5)]['clear'](),this['initWinstonLogger']();}[a286_0x228f31(0x1c7)](_0x413008,_0x2cfbc7,_0xeae0fa){const _0x122be0=a286_0x228f31;if(!this[_0x122be0(0x1c9)]||!this[_0x122be0(0x1c5)])return;this[_0x122be0(0x1c5)]['info'](_0x2cfbc7,{'command':_0x413008,'details':_0xeae0fa});}[a286_0x228f31(0x1ce)](_0x553904,_0x3b646e,_0x1612b7,_0x3bd781){const _0x2edc1e=a286_0x228f31;if(!this[_0x2edc1e(0x1c9)]||!this[_0x2edc1e(0x1c5)])return;this[_0x2edc1e(0x1c5)]['log'](_0x2edc1e(0x1c7),_0x3b646e,{'level':'success','command':_0x553904,'duration':_0x1612b7,'details':_0x3bd781});}[a286_0x228f31(0x1d5)](_0x5b7d4a,_0x1eaf80,_0x364544){const _0x37c0a1=a286_0x228f31;if(!this['logFilePath']||!this[_0x37c0a1(0x1c5)])return;this[_0x37c0a1(0x1c5)][_0x37c0a1(0x1d5)](_0x1eaf80,{'command':_0x5b7d4a,'details':_0x364544});}[a286_0x228f31(0x1c3)](_0x56f1c6,_0x447b67,_0x25247f){const _0x3a2b79=a286_0x228f31;if(!this[_0x3a2b79(0x1c9)]||!this['winstonLogger'])return;this[_0x3a2b79(0x1c5)][_0x3a2b79(0x1c3)](_0x447b67,{'command':_0x56f1c6,'details':_0x25247f});}async['logTask'](_0x39f569,_0x24897e,_0x2803f9){const _0x192320=a286_0x228f31,_0x3a050c=Date[_0x192320(0x1d7)]();this['info'](_0x39f569,_0x192320(0x1be)+_0x24897e);try{const _0x19ab34=await _0x2803f9(),_0x2ff6a6=Date[_0x192320(0x1d7)]()-_0x3a050c;return this['success'](_0x39f569,_0x192320(0x1e3)+_0x24897e,_0x2ff6a6),_0x19ab34;}catch(_0x5a3964){const _0x1ff7cc=Date[_0x192320(0x1d7)]()-_0x3a050c;this['error'](_0x39f569,_0x192320(0x1df)+_0x24897e,{'error':_0x5a3964 instanceof Error?_0x5a3964[_0x192320(0x1c1)]:String(_0x5a3964),'duration':_0x1ff7cc});throw _0x5a3964;}}[a286_0x228f31(0x1ba)](){const _0x53a3f0=a286_0x228f31;try{if(!a286_0x25a645['existsSync'](this[_0x53a3f0(0x1c9)]))return[];const _0x31ec13=a286_0x25a645[_0x53a3f0(0x1c8)](this[_0x53a3f0(0x1c9)],'utf8');return _0x31ec13[_0x53a3f0(0x1b5)]('\x0a')[_0x53a3f0(0x1b0)](_0x233d15=>_0x233d15[_0x53a3f0(0x1b2)]())[_0x53a3f0(0x1b8)](_0x373944=>JSON[_0x53a3f0(0x1b1)](_0x373944));}catch(_0x5653fb){return console[_0x53a3f0(0x1c3)](_0x53a3f0(0x1da),_0x5653fb),[];}}[a286_0x228f31(0x1b3)](){const _0x14a7b1=a286_0x228f31;try{a286_0x25a645[_0x14a7b1(0x1e4)](this[_0x14a7b1(0x1c9)])&&a286_0x25a645[_0x14a7b1(0x1af)](this[_0x14a7b1(0x1c9)],'',_0x14a7b1(0x1bb));}catch(_0x51fede){console[_0x14a7b1(0x1c3)](_0x14a7b1(0x1b9),_0x51fede);}}['getWinstonInstance'](){return this['winstonLogger'];}}export const logger=new Logger();
@@ -1 +1 @@
1
- function a287_0x1712(){const _0x555f0c=['6006918AhxVpK','10jnsNFy','Invalid\x20JSON\x20for\x20--params:\x20','20601981fCzjRm','552342gUsdBN','object','isArray','176070rHXgau','1577555ILoojU','176JDvAJN','Example:\x20--params\x20\x27{\x22id\x22:123}\x27','35rgBeeG','parse','validation','2731917ljOgtW','875640wOnyVk'];a287_0x1712=function(){return _0x555f0c;};return a287_0x1712();}function a287_0x26b5(_0x2fd906,_0x526c19){_0x2fd906=_0x2fd906-0x11f;const _0x1712e5=a287_0x1712();let _0x26b5d3=_0x1712e5[_0x2fd906];return _0x26b5d3;}(function(_0x31bbdb,_0x219cb8){const _0x139371=a287_0x26b5,_0x46409c=_0x31bbdb();while(!![]){try{const _0x2394d6=-parseInt(_0x139371(0x128))/0x1+parseInt(_0x139371(0x124))/0x2+parseInt(_0x139371(0x12e))/0x3+parseInt(_0x139371(0x129))/0x4*(-parseInt(_0x139371(0x127))/0x5)+parseInt(_0x139371(0x120))/0x6+-parseInt(_0x139371(0x12b))/0x7*(parseInt(_0x139371(0x11f))/0x8)+parseInt(_0x139371(0x123))/0x9*(parseInt(_0x139371(0x121))/0xa);if(_0x2394d6===_0x219cb8)break;else _0x46409c['push'](_0x46409c['shift']());}catch(_0x5c7e06){_0x46409c['push'](_0x46409c['shift']());}}}(a287_0x1712,0xc400a));import{CliErrors}from'../errors.js';export function parseJsonParams(_0x350c0d){const _0x575ffe=a287_0x26b5;if(!_0x350c0d)return undefined;let _0x20bc66;try{_0x20bc66=JSON[_0x575ffe(0x12c)](_0x350c0d);}catch{throw CliErrors['validation'](_0x575ffe(0x122)+_0x350c0d);}if(!_0x20bc66||typeof _0x20bc66!==_0x575ffe(0x125)||Array[_0x575ffe(0x126)](_0x20bc66))throw CliErrors[_0x575ffe(0x12d)]('--params\x20must\x20be\x20a\x20JSON\x20object',_0x575ffe(0x12a));return _0x20bc66;}
1
+ (function(_0x3b8fa4,_0x181489){const _0x116892=a287_0x1721,_0x156030=_0x3b8fa4();while(!![]){try{const _0xbe6731=-parseInt(_0x116892(0xc1))/0x1*(parseInt(_0x116892(0xb7))/0x2)+parseInt(_0x116892(0xb9))/0x3*(-parseInt(_0x116892(0xb0))/0x4)+-parseInt(_0x116892(0xbe))/0x5*(parseInt(_0x116892(0xb4))/0x6)+-parseInt(_0x116892(0xb2))/0x7*(parseInt(_0x116892(0xb5))/0x8)+-parseInt(_0x116892(0xb6))/0x9+parseInt(_0x116892(0xb1))/0xa+parseInt(_0x116892(0xbd))/0xb;if(_0xbe6731===_0x181489)break;else _0x156030['push'](_0x156030['shift']());}catch(_0x4ac1bf){_0x156030['push'](_0x156030['shift']());}}}(a287_0x4c0a,0x5e6be));function a287_0x1721(_0x3b1fac,_0x5abf8a){_0x3b1fac=_0x3b1fac-0xb0;const _0x4c0a7d=a287_0x4c0a();let _0x172187=_0x4c0a7d[_0x3b1fac];return _0x172187;}import{CliErrors}from'../errors.js';export function parseJsonParams(_0xc1ff4b){const _0x30f75b=a287_0x1721;if(!_0xc1ff4b)return undefined;let _0x53bf6f;try{_0x53bf6f=JSON[_0x30f75b(0xbf)](_0xc1ff4b);}catch{throw CliErrors[_0x30f75b(0xb3)](_0x30f75b(0xc0)+_0xc1ff4b);}if(!_0x53bf6f||typeof _0x53bf6f!==_0x30f75b(0xbb)||Array[_0x30f75b(0xba)](_0x53bf6f))throw CliErrors[_0x30f75b(0xb3)](_0x30f75b(0xb8),_0x30f75b(0xbc));return _0x53bf6f;}function a287_0x4c0a(){const _0x50d047=['1843936igurUj','139761trSJcS','1172578GMziJH','--params\x20must\x20be\x20a\x20JSON\x20object','3oggThU','isArray','object','Example:\x20--params\x20\x27{\x22id\x22:123}\x27','20576919wGyFsd','43435jsjdXZ','parse','Invalid\x20JSON\x20for\x20--params:\x20','1CvkWhM','310324iyBjmJ','867970fkoWuT','21jfHAoW','validation','138tuiICf'];a287_0x4c0a=function(){return _0x50d047;};return a287_0x4c0a();}
@@ -1 +1 @@
1
- function a288_0x3458(){const _0xf61ce0=['7816064ZKMTTd','6887915VzTcPr','569754NGlTTW','972084VgKxqO','117njpRyS','.cmd','4JBmvev','2830930exiARi','6446872WPzmbN','278742XtiMGF','28ESCcJb'];a288_0x3458=function(){return _0xf61ce0;};return a288_0x3458();}(function(_0x43c904,_0x351329){const _0x23c0ac=a288_0x41f4,_0x564f60=_0x43c904();while(!![]){try{const _0x4d42ff=-parseInt(_0x23c0ac(0x1ad))/0x1+parseInt(_0x23c0ac(0x1b0))/0x2*(-parseInt(_0x23c0ac(0x1ac))/0x3)+-parseInt(_0x23c0ac(0x1b2))/0x4+parseInt(_0x23c0ac(0x1b6))/0x5+-parseInt(_0x23c0ac(0x1b3))/0x6*(parseInt(_0x23c0ac(0x1b4))/0x7)+-parseInt(_0x23c0ac(0x1b5))/0x8+-parseInt(_0x23c0ac(0x1ae))/0x9*(-parseInt(_0x23c0ac(0x1b1))/0xa);if(_0x4d42ff===_0x351329)break;else _0x564f60['push'](_0x564f60['shift']());}catch(_0x2ad4f3){_0x564f60['push'](_0x564f60['shift']());}}}(a288_0x3458,0xe35f6));function a288_0x41f4(_0x3d7894,_0x3f853c){_0x3d7894=_0x3d7894-0x1ac;const _0x345841=a288_0x3458();let _0x41f48f=_0x345841[_0x3d7894];return _0x41f48f;}export const isWindows=process['platform']==='win32';export function resolveNpmBin(_0x346331){const _0x48b0dc=a288_0x41f4;return isWindows?_0x346331+_0x48b0dc(0x1af):_0x346331;}
1
+ function a288_0x5c6b(_0x5c66b8,_0x4d63de){_0x5c66b8=_0x5c66b8-0x1c6;const _0x262284=a288_0x2622();let _0x5c6b53=_0x262284[_0x5c66b8];return _0x5c6b53;}const a288_0x200254=a288_0x5c6b;(function(_0x1af1f5,_0x578342){const _0x1ce41f=a288_0x5c6b,_0x287e30=_0x1af1f5();while(!![]){try{const _0x522890=-parseInt(_0x1ce41f(0x1ca))/0x1+parseInt(_0x1ce41f(0x1cf))/0x2*(-parseInt(_0x1ce41f(0x1cd))/0x3)+parseInt(_0x1ce41f(0x1d4))/0x4+-parseInt(_0x1ce41f(0x1c7))/0x5*(-parseInt(_0x1ce41f(0x1cb))/0x6)+parseInt(_0x1ce41f(0x1cc))/0x7*(parseInt(_0x1ce41f(0x1d0))/0x8)+-parseInt(_0x1ce41f(0x1d1))/0x9*(parseInt(_0x1ce41f(0x1c9))/0xa)+parseInt(_0x1ce41f(0x1d2))/0xb*(-parseInt(_0x1ce41f(0x1c8))/0xc);if(_0x522890===_0x578342)break;else _0x287e30['push'](_0x287e30['shift']());}catch(_0x528100){_0x287e30['push'](_0x287e30['shift']());}}}(a288_0x2622,0xa58a4));export const isWindows=process[a288_0x200254(0x1ce)]===a288_0x200254(0x1d3);export function resolveNpmBin(_0x10674c){const _0x2754ff=a288_0x200254;return isWindows?_0x10674c+_0x2754ff(0x1c6):_0x10674c;}function a288_0x2622(){const _0x112393=['3sGTMcC','platform','1619804dkTWFU','8xXpjYx','3600pweHSo','11UYNxFv','win32','246244rYNIOq','.cmd','7170lwmDpE','3661764OTIGSu','1220uKNqil','205404glAqys','3342vuJjTB','8309042cEGqWg'];a288_0x2622=function(){return _0x112393;};return a288_0x2622();}
@@ -1 +1 @@
1
- export function sleep(_0xdc0b93){return new Promise(_0x5163e8=>setTimeout(_0x5163e8,_0xdc0b93));}
1
+ export function sleep(_0x255053){return new Promise(_0x5bb218=>setTimeout(_0x5bb218,_0x255053));}
@@ -1 +1 @@
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
+ const a290_0x54bf67=a290_0x56ce;function a290_0x56ce(_0x1b1cda,_0x107c45){_0x1b1cda=_0x1b1cda-0x1c6;const _0x2bbe2d=a290_0x2bbe();let _0x56ce65=_0x2bbe2d[_0x1b1cda];return _0x56ce65;}(function(_0x163344,_0x125690){const _0x55b29c=a290_0x56ce,_0x81dc64=_0x163344();while(!![]){try{const _0xbf1e3a=parseInt(_0x55b29c(0x1fe))/0x1*(-parseInt(_0x55b29c(0x1d3))/0x2)+-parseInt(_0x55b29c(0x1e3))/0x3+parseInt(_0x55b29c(0x206))/0x4+parseInt(_0x55b29c(0x1fa))/0x5+-parseInt(_0x55b29c(0x1cc))/0x6*(parseInt(_0x55b29c(0x1e5))/0x7)+parseInt(_0x55b29c(0x204))/0x8*(-parseInt(_0x55b29c(0x1ce))/0x9)+parseInt(_0x55b29c(0x201))/0xa;if(_0xbf1e3a===_0x125690)break;else _0x81dc64['push'](_0x81dc64['shift']());}catch(_0x34dc16){_0x81dc64['push'](_0x81dc64['shift']());}}}(a290_0x2bbe,0x4ce09));function a290_0x2bbe(){const _0x46f54e=['readdir','name','writeFile','toComponentName','readFile','\x0a\x20\x20\x20\x20{\x20','666830RFAQzb','.tpl','alias','isFile','167WKbwPs','.md','Starting\x20template\x20content\x20replacement','12792630lbstZs','join','datasetCode:\x20\x22','2888mGWheT','default','520752AdzWXY','processDirectory','processFile','getMinutes','.js','.ts','promises','formatLocalTimestamp','getDate','endsWith','18WvvLtt','mkdir','5517RmXwAx','extname','Template\x20content\x20replacement\x20completed','padStart','toUpperCase','3730kZmVVp','getHours','getFullYear','datasetCode','slice','.scss','tableName:\x20\x22','pad','toISOString','LOVRABET','toLowerCase','split','alias:\x20\x22','api','tableName','\x20},','830103BgPqVq','name:\x20\x22','976451FmLgHZ','map','push','now','copyFile','toDisplayTitle','.css','replace','replaceApiContent','template','replaceContent','includes','YourModel','charAt','pop'];a290_0x2bbe=function(){return _0x46f54e;};return a290_0x2bbe();}import a290_0x219ca9 from'node:fs';import a290_0x569288 from'node:path';import{logger}from'../utils/logger.js';import{getCliVersion}from'../utils/version.js';const CLI_VERSION=getCliVersion();export class TemplateReplacer{static[a290_0x54bf67(0x1da)](_0x5eb184){const _0x5c4a38=a290_0x54bf67;return String(_0x5eb184)[_0x5c4a38(0x1d1)](0x2,'0');}static[a290_0x54bf67(0x1c9)](_0x243bcb){const _0x123c36=a290_0x54bf67,_0x328a0c=_0x243bcb[_0x123c36(0x1d5)](),_0x5d1339=this[_0x123c36(0x1da)](_0x243bcb['getMonth']()+0x1),_0x52087f=this[_0x123c36(0x1da)](_0x243bcb[_0x123c36(0x1ca)]()),_0x1b7e32=this[_0x123c36(0x1da)](_0x243bcb[_0x123c36(0x1d4)]()),_0x52697b=this['pad'](_0x243bcb[_0x123c36(0x209)]()),_0x37aa6a=this[_0x123c36(0x1da)](_0x243bcb['getSeconds']());return{'createdAt':_0x328a0c+'-'+_0x5d1339+'-'+_0x52087f+'\x20'+_0x1b7e32+':'+_0x52697b+':'+_0x37aa6a,'createdDate':_0x328a0c+'-'+_0x5d1339+'-'+_0x52087f,'createdTime':_0x1b7e32+':'+_0x52697b+':'+_0x37aa6a};}static[a290_0x54bf67(0x1f7)](_0x532f81){const _0x1790ef=a290_0x54bf67,_0x40d85d=_0x532f81[_0x1790ef(0x1de)]('/')[_0x1790ef(0x1f3)]()||_0x532f81;return _0x40d85d[_0x1790ef(0x1de)]('-')['map'](_0x20b73a=>_0x20b73a['charAt'](0x0)[_0x1790ef(0x1d2)]()+_0x20b73a[_0x1790ef(0x1d7)](0x1)[_0x1790ef(0x1dd)]())[_0x1790ef(0x202)]('');}static[a290_0x54bf67(0x1ea)](_0x21b755){const _0x1a4fd1=a290_0x54bf67,_0x4a9699=_0x21b755['split']('/')[_0x1a4fd1(0x1f3)]()||_0x21b755;return _0x4a9699[_0x1a4fd1(0x1de)]('-')[_0x1a4fd1(0x1e6)](_0x1da091=>_0x1da091[_0x1a4fd1(0x1f2)](0x0)['toUpperCase']()+_0x1da091['slice'](0x1)[_0x1a4fd1(0x1dd)]())['join']('\x20');}static[a290_0x54bf67(0x1ef)](_0x549cc8,_0x496481,_0xd154e5){const _0x925ff2=a290_0x54bf67,_0x932045=this[_0x925ff2(0x1f7)](_0x496481),_0x6273a3=this[_0x925ff2(0x1ea)](_0x496481),{createdAt:_0x3cc41d,createdDate:_0x6ce231,createdTime:_0x43534a}=this['formatLocalTimestamp'](new Date());let _0x5af553=_0x549cc8[_0x925ff2(0x1ec)](/\{CliVersion\}/g,CLI_VERSION)[_0x925ff2(0x1ec)](/\{ComponentName\}/g,_0x932045)[_0x925ff2(0x1ec)](/\{DisplayTitle\}/g,_0x6273a3)[_0x925ff2(0x1ec)](/\{PageName\}/g,_0x496481)['replace'](/\{TemplateName\}/g,_0xd154e5)['replace'](/\{CreatedAt\}/g,_0x3cc41d)[_0x925ff2(0x1ec)](/\{CreatedDate\}/g,_0x6ce231)['replace'](/\{CreatedTime\}/g,_0x43534a);return _0x5af553;}static[a290_0x54bf67(0x1ed)](_0x228cfd,_0xaa6c9c,_0x3768a6,_0xd467ae,_0x93a7ac,_0x9fa689,_0x38c6ce,_0x45bce5){const _0x2c6ed7=a290_0x54bf67,_0x1da3a2=new Date(),_0x31d6fa=_0x1da3a2[_0x2c6ed7(0x1db)](),_0x2820df=_0x3768a6[_0x2c6ed7(0x1e6)](_0xd2fd51=>{const _0x2bbb3a=_0x2c6ed7,_0x2f9bf5=[_0x2bbb3a(0x203)+_0xd2fd51[_0x2bbb3a(0x1d6)]+'\x22',_0x2bbb3a(0x1d9)+_0xd2fd51[_0x2bbb3a(0x1e1)]+'\x22',_0x2bbb3a(0x1e4)+_0xd2fd51[_0x2bbb3a(0x1f5)]+'\x22'];return _0xd2fd51[_0x2bbb3a(0x1fc)]&&_0x2f9bf5[_0x2bbb3a(0x1e7)](_0x2bbb3a(0x1df)+_0xd2fd51[_0x2bbb3a(0x1fc)]+'\x22'),_0x2bbb3a(0x1f9)+_0x2f9bf5['join'](',\x20')+_0x2bbb3a(0x1e2);})['join'](''),_0x6d8418=_0xd467ae||_0x3768a6[0x0]?.[_0x2c6ed7(0x1fc)]||_0x2c6ed7(0x1f1);let _0x376300=_0x228cfd[_0x2c6ed7(0x1ec)](/\{AppCode\}/g,_0xaa6c9c)[_0x2c6ed7(0x1ec)](/\{ModelConfigs\}/g,_0x2820df)[_0x2c6ed7(0x1ec)](/\{ExampleModelName\}/g,_0x6d8418)['replace'](/\{ApiFileName\}/g,_0x93a7ac||_0x2c6ed7(0x1e0))[_0x2c6ed7(0x1ec)](/\{ConfigName\}/g,_0x9fa689||_0x2c6ed7(0x205))[_0x2c6ed7(0x1ec)](/\{ClientConfigParam\}/g,_0x38c6ce||'')[_0x2c6ed7(0x1ec)](/\{VarPrefix\}/g,_0x45bce5||_0x2c6ed7(0x1dc))[_0x2c6ed7(0x1ec)](/\{CreatedAt\}/g,_0x31d6fa);return _0x376300;}static async['processTemplate'](_0xc7b85b,_0x3ca4e7,_0x3a87aa,_0x10998e,_0x2067ad=!![]){const _0x30e382=a290_0x54bf67,_0x4fdb98=Date[_0x30e382(0x1e8)]();try{_0x2067ad&&logger['info'](_0x30e382(0x1ee),_0x30e382(0x200),{'templatePath':_0xc7b85b,'targetPath':_0x3ca4e7,'pageName':_0x3a87aa,'templateName':_0x10998e});await a290_0x219ca9[_0x30e382(0x1c8)][_0x30e382(0x1cd)](_0x3ca4e7,{'recursive':!![]}),await this[_0x30e382(0x207)](_0xc7b85b,_0x3ca4e7,_0x3a87aa,_0x10998e);if(_0x2067ad){const _0x205cd7=Date[_0x30e382(0x1e8)]()-_0x4fdb98;logger['success'](_0x30e382(0x1ee),_0x30e382(0x1d0),_0x205cd7,{'pageName':_0x3a87aa,'templateName':_0x10998e});}}catch(_0x23958a){if(_0x2067ad){const _0x3787bb=Date[_0x30e382(0x1e8)]()-_0x4fdb98;logger['error'](_0x30e382(0x1ee),'Template\x20content\x20replacement\x20failed',{'templatePath':_0xc7b85b,'targetPath':_0x3ca4e7,'pageName':_0x3a87aa,'templateName':_0x10998e,'error':_0x23958a instanceof Error?_0x23958a['message']:String(_0x23958a),'duration':_0x3787bb});}throw _0x23958a;}}static async[a290_0x54bf67(0x207)](_0x316d96,_0xc531d2,_0x49cce9,_0x1cd512){const _0x4c0213=a290_0x54bf67,_0x2f1073=await a290_0x219ca9[_0x4c0213(0x1c8)][_0x4c0213(0x1f4)](_0x316d96,{'withFileTypes':!![]});for(const _0x2b9395 of _0x2f1073){const _0x3ea506=a290_0x569288[_0x4c0213(0x202)](_0x316d96,_0x2b9395[_0x4c0213(0x1f5)]);let _0x1a24f7=a290_0x569288[_0x4c0213(0x202)](_0xc531d2,_0x2b9395[_0x4c0213(0x1f5)]);_0x2b9395[_0x4c0213(0x1f5)][_0x4c0213(0x1cb)](_0x4c0213(0x1fb))&&(_0x1a24f7=a290_0x569288[_0x4c0213(0x202)](_0xc531d2,_0x2b9395[_0x4c0213(0x1f5)][_0x4c0213(0x1ec)](/\.tpl$/,'')));if(_0x2b9395['isDirectory']())await a290_0x219ca9[_0x4c0213(0x1c8)]['mkdir'](_0x1a24f7,{'recursive':!![]}),await this[_0x4c0213(0x207)](_0x3ea506,_0x1a24f7,_0x49cce9,_0x1cd512);else _0x2b9395[_0x4c0213(0x1fd)]()&&await this[_0x4c0213(0x208)](_0x3ea506,_0x1a24f7,_0x49cce9,_0x1cd512);}}static async[a290_0x54bf67(0x208)](_0x5bcc6b,_0x11e269,_0x450cdf,_0x5668eb){const _0x496adb=a290_0x54bf67,_0x38d180=a290_0x569288[_0x496adb(0x1cf)](_0x5bcc6b)[_0x496adb(0x1dd)]();_0x5bcc6b[_0x496adb(0x1cb)](_0x496adb(0x1fb))&&(_0x11e269=_0x11e269['replace'](/\.tpl$/,''));const _0x340797=['.tsx',_0x496adb(0x1c7),'.jsx',_0x496adb(0x1c6),'.json',_0x496adb(0x1ff),_0x496adb(0x1eb),_0x496adb(0x1d8),_0x496adb(0x1fb)];if(_0x340797[_0x496adb(0x1f0)](_0x38d180)||_0x5bcc6b[_0x496adb(0x1cb)](_0x496adb(0x1fb))){const _0x1039e3=await a290_0x219ca9[_0x496adb(0x1c8)][_0x496adb(0x1f8)](_0x5bcc6b,'utf8'),_0xb46ff5=this[_0x496adb(0x1ef)](_0x1039e3,_0x450cdf,_0x5668eb);await a290_0x219ca9[_0x496adb(0x1c8)][_0x496adb(0x1f6)](_0x11e269,_0xb46ff5,'utf8');}else await a290_0x219ca9[_0x496adb(0x1c8)][_0x496adb(0x1e9)](_0x5bcc6b,_0x11e269);}}
@@ -1 +1 @@
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
+ (function(_0x144973,_0x18cf78){const _0x304e1a=a291_0x1c10,_0x96e965=_0x144973();while(!![]){try{const _0x5a3abb=parseInt(_0x304e1a(0x135))/0x1+parseInt(_0x304e1a(0x134))/0x2+parseInt(_0x304e1a(0x12a))/0x3+parseInt(_0x304e1a(0x131))/0x4*(parseInt(_0x304e1a(0x13a))/0x5)+parseInt(_0x304e1a(0x145))/0x6+parseInt(_0x304e1a(0x12c))/0x7*(parseInt(_0x304e1a(0x141))/0x8)+-parseInt(_0x304e1a(0x146))/0x9;if(_0x5a3abb===_0x18cf78)break;else _0x96e965['push'](_0x96e965['shift']());}catch(_0x284efb){_0x96e965['push'](_0x96e965['shift']());}}}(a291_0x2762,0x4d304));import{mkdir,readFile,writeFile}from'node:fs/promises';import{homedir}from'node:os';import{dirname,join}from'node:path';import a291_0x3cb076 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 _0x37df46=a291_0x1c10,_0x91e904=process.env.RABETBASE_NO_UPDATE_NOTICE?.[_0x37df46(0x12d)]()['toLowerCase']();return _0x91e904==='1'||_0x91e904===_0x37df46(0x144)||_0x91e904===_0x37df46(0x13f);}function cacheRoot(){const _0x117d49=a291_0x1c10;return process.env.XDG_CACHE_HOME||process.env.LOCALAPPDATA||join(homedir(),_0x117d49(0x132));}export function getUpdateNoticeCachePath(){const _0x24dd75=a291_0x1c10;return join(cacheRoot(),_0x24dd75(0x12e),'update-check.json');}async function readUpdateNoticeCache(){const _0x59fbac=a291_0x1c10;try{const _0x2654f1=await readFile(getUpdateNoticeCachePath(),_0x59fbac(0x130)),_0x2e4caa=JSON['parse'](_0x2654f1);if(!_0x2e4caa||typeof _0x2e4caa!==_0x59fbac(0x138))return{};return _0x2e4caa;}catch{return{};}}async function writeUpdateNoticeCache(_0x12275e){const _0x49cf44=a291_0x1c10;try{const _0x4a88c0=getUpdateNoticeCachePath();await mkdir(dirname(_0x4a88c0),{'recursive':!![]}),await writeFile(_0x4a88c0,JSON[_0x49cf44(0x140)](_0x12275e,null,0x2)+'\x0a',_0x49cf44(0x130));}catch{}}function isFreshCheck(_0x4d156a,_0x46d09d){const _0x1819f8=a291_0x1c10;return typeof _0x4d156a[_0x1819f8(0x13c)]===_0x1819f8(0x12f)&&_0x46d09d-_0x4d156a[_0x1819f8(0x13c)]<UPDATE_CHECK_TTL_MS;}function a291_0x1c10(_0x5b293b,_0x10b495){_0x5b293b=_0x5b293b-0x129;const _0x276215=a291_0x2762();let _0x1c108a=_0x276215[_0x5b293b];return _0x1c108a;}function a291_0x2762(){const _0x52f12a=['object','stableVersion','5VBUcNg','lastNotifiedAt','checkedAt',',\x20run:\x20','valid','yes','stringify','8puEOIb','\x20update','/v/','true','1098546ZnfRNO','17975826OqoxpZ','now','1234812ouXgkn','\x20available,\x20current\x20','2609579RgvcEE','trim','rabetbase-cli','number','utf8','1235716aZyZXU','.cache','gte','840046GHzPyG','617034xSsyOW','latest','https://www.npmjs.com/package/'];a291_0x2762=function(){return _0x52f12a;};return a291_0x2762();}function isRecentlyNotified(_0x2a450f,_0x53e657,_0x1aa2f4){const _0x35db59=a291_0x1c10;return _0x2a450f['lastNotifiedVersion']===_0x53e657&&typeof _0x2a450f['lastNotifiedAt']==='number'&&_0x1aa2f4-_0x2a450f[_0x35db59(0x13b)]<UPDATE_NOTICE_TTL_MS;}export function buildNpmVersionUrl(_0x1a2579){const _0x367138=a291_0x1c10;return _0x367138(0x137)+NPM_PACKAGE_NAME+_0x367138(0x143)+_0x1a2579;}export async function resolveLatestUpdateNotice(){const _0x4d09d0=a291_0x1c10;if(isUpdateNoticeDisabled())return null;try{const _0x5449b0=Date[_0x4d09d0(0x129)](),_0x50a817=getCliVersion(),_0x1322a3=await readUpdateNoticeCache();let _0x17486f=isFreshCheck(_0x1322a3,_0x5449b0)?_0x1322a3[_0x4d09d0(0x136)]?.[_0x4d09d0(0x12d)]():undefined;if(!_0x17486f&&!isFreshCheck(_0x1322a3,_0x5449b0)){const _0x4aa0dc=await getCliVersionPolicy();_0x17486f=_0x4aa0dc?.[_0x4d09d0(0x139)]?.[_0x4d09d0(0x12d)]()||undefined,await writeUpdateNoticeCache({..._0x1322a3,'checkedAt':_0x5449b0,'latest':_0x17486f,'failed':!_0x17486f});}if(!_0x17486f||!a291_0x3cb076[_0x4d09d0(0x13e)](_0x50a817)||!a291_0x3cb076[_0x4d09d0(0x13e)](_0x17486f))return null;if(a291_0x3cb076[_0x4d09d0(0x133)](_0x50a817,_0x17486f))return null;if(isRecentlyNotified(_0x1322a3,_0x17486f,_0x5449b0))return null;const _0x22dede=CLI_BIN_NAME+_0x4d09d0(0x142);return await writeUpdateNoticeCache({..._0x1322a3,'checkedAt':isFreshCheck(_0x1322a3,_0x5449b0)?_0x1322a3[_0x4d09d0(0x13c)]:_0x5449b0,'latest':_0x17486f,'failed':![],'lastNotifiedVersion':_0x17486f,'lastNotifiedAt':_0x5449b0}),{'command':_0x22dede,'current':_0x50a817,'latest':_0x17486f,'url':buildNpmVersionUrl(_0x17486f),'message':CLI_BIN_NAME+'\x20'+_0x17486f+_0x4d09d0(0x12b)+_0x50a817+_0x4d09d0(0x13d)+_0x22dede};}catch{return null;}}
@@ -1 +1 @@
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
+ function a292_0x4ffb(_0x302cc9,_0x2a06b8){_0x302cc9=_0x302cc9-0x9b;var _0xb92673=a292_0xb926();var _0x4ffb7b=_0xb92673[_0x302cc9];return _0x4ffb7b;}(function(_0x5f00c0,_0x37088d){var _0x18e599=a292_0x4ffb,_0x1d625c=_0x5f00c0();while(!![]){try{var _0x58bf5d=parseInt(_0x18e599(0xa2))/0x1*(-parseInt(_0x18e599(0x9f))/0x2)+parseInt(_0x18e599(0x9c))/0x3+-parseInt(_0x18e599(0x9b))/0x4+parseInt(_0x18e599(0x9e))/0x5*(parseInt(_0x18e599(0xa3))/0x6)+parseInt(_0x18e599(0xa0))/0x7*(parseInt(_0x18e599(0xa1))/0x8)+-parseInt(_0x18e599(0x9d))/0x9+parseInt(_0x18e599(0xa4))/0xa;if(_0x58bf5d===_0x37088d)break;else _0x1d625c['push'](_0x1d625c['shift']());}catch(_0x3e0665){_0x1d625c['push'](_0x1d625c['shift']());}}}(a292_0xb926,0x510c9));import{VERSION}from'../generated/build-info.js';export function getCliVersion(){return VERSION;}function a292_0xb926(){var _0xc3aca7=['1253272FyGKaL','35JEAgre','117832jNfjDy','1iLTqYW','3370134oBQyvu','446630yOCuks','480604ZKbiSz','1297776yvoRVn','304425uvWnTm','5XpJfah'];a292_0xb926=function(){return _0xc3aca7;};return a292_0xb926();}
@@ -1 +1 @@
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
+ function a293_0x3539(){var _0x49254c=['18diqIOV','4458872pCPhIV','6503FcbIPv','12yxKxVn','958064pUyvmO','19895300oHEbUP','4104CQawPV','5858545pqrZoT','14437116jJXRZS','128526zmsYPc'];a293_0x3539=function(){return _0x49254c;};return a293_0x3539();}function a293_0x3b17(_0x2797ac,_0x3ea49a){_0x2797ac=_0x2797ac-0x180;var _0x3539e9=a293_0x3539();var _0x3b17de=_0x3539e9[_0x2797ac];return _0x3b17de;}(function(_0x7e89fe,_0x722032){var _0xcb8c0a=a293_0x3b17,_0x1a0d59=_0x7e89fe();while(!![]){try{var _0x29ec8b=-parseInt(_0xcb8c0a(0x189))/0x1*(-parseInt(_0xcb8c0a(0x180))/0x2)+-parseInt(_0xcb8c0a(0x183))/0x3*(-parseInt(_0xcb8c0a(0x184))/0x4)+parseInt(_0xcb8c0a(0x187))/0x5+-parseInt(_0xcb8c0a(0x186))/0x6*(-parseInt(_0xcb8c0a(0x182))/0x7)+parseInt(_0xcb8c0a(0x181))/0x8+-parseInt(_0xcb8c0a(0x188))/0x9+-parseInt(_0xcb8c0a(0x185))/0xa;if(_0x29ec8b===_0x722032)break;else _0x1a0d59['push'](_0x1a0d59['shift']());}catch(_0x51b3eb){_0x1a0d59['push'](_0x1a0d59['shift']());}}}(a293_0x3539,0xd8390));import{setActiveCookie,clearActiveCookie}from'../core/api-client.js';export async function withActiveCookie(_0x3a7562,_0x102c4a){setActiveCookie(_0x3a7562);try{return await _0x102c4a();}finally{clearActiveCookie();}}
@@ -1 +1 @@
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');}
1
+ function a294_0x5dbe(){var _0x6e5c07=['82993igFaNg','21JROjub','20AhiKjD','6119120XSFmtc','5781663oYlTmU','16TRhLRx','stderr','5195040onGlyH','525772yPKrFr','8138608vOrAlf','434880dOBolA'];a294_0x5dbe=function(){return _0x6e5c07;};return a294_0x5dbe();}function a294_0x4cb4(_0x3ca267,_0x418655){_0x3ca267=_0x3ca267-0x128;var _0x5dbe71=a294_0x5dbe();var _0x4cb4f6=_0x5dbe71[_0x3ca267];return _0x4cb4f6;}(function(_0x31b649,_0x2f5e31){var _0x16361d=a294_0x4cb4,_0x3d37b5=_0x31b649();while(!![]){try{var _0x3676fd=-parseInt(_0x16361d(0x132))/0x1*(parseInt(_0x16361d(0x12c))/0x2)+parseInt(_0x16361d(0x128))/0x3*(parseInt(_0x16361d(0x12f))/0x4)+-parseInt(_0x16361d(0x12e))/0x5+parseInt(_0x16361d(0x131))/0x6+-parseInt(_0x16361d(0x12a))/0x7+parseInt(_0x16361d(0x130))/0x8+parseInt(_0x16361d(0x12b))/0x9*(parseInt(_0x16361d(0x129))/0xa);if(_0x3676fd===_0x2f5e31)break;else _0x3d37b5['push'](_0x3d37b5['shift']());}catch(_0x1f5ff9){_0x3d37b5['push'](_0x3d37b5['shift']());}}}(a294_0x5dbe,0xaf329));export function writeCliSideChannelLine(_0x674df2){var _0x3a83e3=a294_0x4cb4;process[_0x3a83e3(0x12d)]['write'](_0x674df2+'\x0a');}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lovrabet/rabetbase-cli",
3
- "version": "2.4.7",
3
+ "version": "2.5.0-beta.1",
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": [
@@ -84,8 +84,6 @@
84
84
  "skills/rabetbase.manifest.json",
85
85
  "scripts/postinstall.mjs",
86
86
  "templates/generate-api",
87
- "templates/rules",
88
- "templates/skill",
89
87
  "sidecar",
90
88
  "README.md",
91
89
  "LICENSE"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rabetbase
3
- version: 2.4.7
3
+ version: 2.5.0-beta.1
4
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:
@@ -18,9 +18,9 @@ metadata:
18
18
 
19
19
  ## 前置条件
20
20
 
21
- 1. **认证**:`rabetbase auth login` 通过浏览器完成 OAuth 登录;非交互 Agent 使用 `rabetbase auth login --yes`,把终端打印的授权链接发给用户打开,链接有效期 10 分钟
22
- 2. **AppCode**:确保 `.rabetbase.json` 中设置了 `apps + defaultApp`(推荐)或兼容读取的顶层 `appcode`,或通过 `--appcode <code>` / `--app <name>` 传入(旧名 `.lovrabet.json` 仍可读)
23
- 3. **配置文件**:`rabetbase init` 做**首次安装后的全局引导**(可写 `.rabetbase.json`;旧名仍兼容读取)。完整字段说明见 [`.rabetbase.json` 配置参考](references/rabetbase-config.md)。目录绑定请用下方 `workspace init`,二者不要混用
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`
22
+ 2. **AppCode**:确保 `.rabetbase.json` 中设置了 `apps`(单应用自动选中;多应用再配 `defaultApp`),或兼容读取的顶层 `appcode`,或通过 `--appcode <code>` / `--app <name>` 传入。旧 `.lovrabet.json` 不会自动读取
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 职责边界」)
25
25
  5. **多应用场景**:一个项目有多个应用时,先 `rabetbase workspace add <name> --appcode …` 登记各应用,再用 `--app <name>` 临时切换,或 `workspace use --app <name>` 修改当前工作目录默认应用
26
26
  6. **平台发现**:当你不知道当前登录账号能访问哪些应用时,先 `rabetbase app list --remote`;它查询平台目录,不修改本地配置
@@ -29,7 +29,7 @@ metadata:
29
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
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
- 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 查数」。
32
+ 10. **运行态查数显式交接** `rabetbase` 只负责 Dataset 结构与研发发布。不需要真实行数据时,`lovrabet` CLI 可以不装。一旦要验证真实业务行数据,必须交接给 **`lovrabet data filter/getOne`**;不可用时报告阻断并提示安装 `lovrabet` Skill CLI。不要调用已移除的 `rabetbase data filter/getOne`,也不要由本 Skill 静默安装或修复运行态 CLI。`rabetbase sql exec` 只验证已发布 SQL,不是行数据查询的通用替代。详见 [`guides/data-api-guidelines.md`](guides/data-api-guidelines.md)
33
33
 
34
34
  ## Skill Freshness
35
35
 
@@ -53,16 +53,17 @@ 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
- - DB 差异读取先用 `db detail` 获取 `tableCount`:不大于 200 时直接 `db diff --all --changed-only`;大于 200 或用户明确要求实时刷新时,先执行一次 `db diff-refresh-start`,保存 traceId 并用 `db diff-refresh-status` 查询同一任务到终态,成功后再读取 diff。用户明确不刷新时直接读取并提示大库结果可能滞后;数量未知时不隐式启动写任务
56
+ - DBAgent 增量分析默认先执行一次异步差异刷新:调用 `db diff-refresh-start`,保存 traceId,并用 `db diff-refresh-status` 查询同一任务到终态,成功后再执行 `db diff --all --changed-only`。无论 `tableCount` 大小都执行刷新;只有用户明确表示“不需要分析”“不刷新”或“只看现有结果”时才跳过异步刷新,并说明结果可能不是最新事实
57
57
  - 需要查看无差异表或主动重新分析既有表时,用 `db diff --view all`;`--all` 只表示聚合当前视角全部分页,不等价于全部表
58
58
  - DB 增量分析先对完整 `toAnalyzeTables` 执行 `db analyze-batch-plan`;它生成的是本地批次方案,不是服务端 `planId`,也不会创建任务。再严格按批次顺序启动;每批独立保存 `planId`(即 `analyze-start` 返回值),当前批次到达已知终态前不得启动下一批
59
- - 全部批次结束后按上述 200 表阈值重新获取差异;仍未收敛时,按 [`database-connection-workflow.md`](guides/database-connection-workflow.md) 对剩余 `toAnalyzeTables` 逐表串行重试且每表只恢复一次。状态查询失败继续使用原 `planId`,不得重复启动任务
59
+ - 全部批次结束后再次执行异步差异刷新并重新获取完整差异;仍未收敛时,按 [`database-connection-workflow.md`](guides/database-connection-workflow.md) 对剩余 `toAnalyzeTables` 逐表串行重试且每表只恢复一次。仅当用户明确要求跳过分析/刷新时直接读取现有差异。状态查询失败继续使用原 `planId`,不得重复启动任务
60
60
  - 输出很大且只需子集时,在 `compress`/`json` 上加 `--jq '.data…'` 缩小结果
61
- - **(可选)** 若环境已安装 **`lovrabet` ≥ 2.0**,可用 `lovrabet data filter` / `data getOne` 对数据集做与 SDK 同语义的终端查数;**不要**假设用户已安装或版本够新,见 [`guides/data-api-guidelines.md`](guides/data-api-guidelines.md)
61
+ - 需要真实业务行数据时必须交接给 `lovrabet data filter/getOne`;`lovrabet` 不可用时报告阻断并提示安装 Skill 与 CLI,不要静默安装或修复,也不要用 `rabetbase sql exec` 当行数据替代,见 [`guides/data-api-guidelines.md`](guides/data-api-guidelines.md)
62
+ - 需要 `src/api/api.ts` / `client.ts` 时:先 `rabetbase api pull --format compress` 取 `data.models`、`data.files`、`data.needsAgentMerge`,再按 [`sdk-client-generation.md`](guides/sdk-client-generation.md) 更新 TypeScript。`api pull` **不会覆盖已有** `api.ts`/`client.ts`
62
63
  3. **SQL 工作流严格分步**
63
64
  - 推荐路径:查现有(`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
65
  - 先使用 `sql list/detail` 查找可复用的 Custom SQL;没有满足需求的资源时,按照 [`sql-creation-workflow.md`](guides/sql-creation-workflow.md) 与 [`sql-mybatis.md`](guides/sql-mybatis.md) 创建、校验、发布并验证
65
- - 页面和 Backend Function 执行已发布的 Custom SQL 时使用 `sqlCode` + `params`
66
+ - 页面执行已发布的 Custom SQL 时使用 `sqlCode` + `params`;Backend Function 默认使用 `context.client.sql.byName(sqlName).execute({ params })`,`sql.execute({ sqlCode, params })` 仅作兼容路径
66
67
  4. **Backend Function 工作流严格分步**
67
68
  - 查现有 → 确认字段或通知配置 → 查公共函数 → 本地创建(`bff create`) → 检查状态(`bff status`) → 先预览(`--dry-run`) → 再拉取/推送/删除
68
69
  - 创建会发送消息通知的 Backend Function 时,先读取 [`backend-function.md`](guides/backend-function.md) 的“消息通知扩展”契约,再执行 [`rabetbase notification config-list --type EMAIL`](references/rabetbase-notification-config-list.md) 获取当前应用的 `configCode`;不得猜测渠道、收件人或把密钥写进脚本
@@ -99,7 +100,7 @@ metadata:
99
100
  - 直接执行目标命令,不需要先查 `rabetbase app list --remote`
100
101
 
101
102
  2. **已明确本地应用名**
102
- - 当前项目 `.rabetbase.json` 已有 `apps + defaultApp`
103
+ - 当前项目 `.rabetbase.json` 已有唯一 app,或多 app 已配置 `defaultApp`
103
104
  - 或用户给了 `--app <name>`
104
105
  - 先用 `rabetbase app list` 验证本地配置,再执行目标命令
105
106
 
@@ -132,12 +133,12 @@ metadata:
132
133
 
133
134
  - **入口**:先 [`db list`](references/rabetbase-db-list.md) 取 `id` 与 `latestAnalysisTraceId`(如有)。
134
135
  - **只读常用**:[`db detail`](references/rabetbase-db-detail.md)、[`db test`](references/rabetbase-db-test.md)、[`db tables`](references/rabetbase-db-tables.md)、[`db diff`](references/rabetbase-db-diff.md)。`db diff` 默认只读差异结果;`--view all` 才是实时全部表视角;`--all` 只聚合当前视角全部分页。
135
- - **差异刷新**:[`db diff-refresh-start/status`](references/rabetbase-db-diff-refresh.md)。先从 `db detail` 读取 `tableCount`;大于 200 或用户强制要求时刷新,小于等于 200 默认直接读取。刷新与 schema `analyze-*` 是两类任务,不得混用。
136
+ - **差异刷新**:[`db diff-refresh-start/status`](references/rabetbase-db-diff-refresh.md)。CLI 发起 DBAgent 增量分析时,无论 `tableCount` 多少或是否缺失,默认先刷新再读取差异;只有用户明确要求跳过分析/刷新时才直接读取现有结果。刷新与 schema `analyze-*` 是两类任务,不得混用。
136
137
  - **分析任务**:`db analyze-batch-plan` / `analyze-start` / `analyze-cancel` / `analyze-status`(服务端 plan/trace 来源见下)。
137
138
  - **状态诊断边界**:`analyze-status` 的 `requestedAnalysis` 只还原原始提交范围;`hasMultipleAttempts=true` 只表示观察到多个执行尝试。不得据此推断尝试间连续性、实际执行范围或自动重启。
138
139
  - **增量分批**:先用本地只读的 `db analyze-batch-plan --id <id> --tables <清单>` 得到确定性批次及 `planningEstimate`;这里生成的是本地批次方案,不是服务端 `planId`,不会创建或预留任务。再逐批调用一次 `analyze-start`,读取真实 `planId` 与当前任务的 `serverEstimate`;每批独立保存其返回的 `planId`,同一 dblink 严格串行。两类估算都不得驱动超时、取消、重试、自动重启或状态判断,`PENDING / RUNNING / RETRYING / CANCELING` 均不得推进下一批。
139
140
  - **取消已有任务**:只使用正在跟踪的原 `planId` 执行 `analyze-cancel --plan <原 planId>`;取消分支不得调用 `analyze-start`,也不得用可能变化的 `latestAnalysisTraceId` 替换已知目标。
140
- - **失败恢复**:全部批次结束后按 200 表阈值刷新或直接读取完整 `db diff --all --changed-only` 获取未收敛表,逐表串行执行 `analyze-start --tables <单表>`,每表只恢复一次;累计原因计数只作可能不完整的参考展示。Agent 可语义理解原始 `errorMsg` 辅助解释和建议,但两者都不驱动任务状态、重提任务或收敛判断。
141
+ - **失败恢复**:全部批次结束后默认再次异步刷新,再读取完整 `db diff --all --changed-only` 获取未收敛表;只有用户明确要求跳过分析/刷新时才直接读取。随后逐表串行执行 `analyze-start --tables <单表>`,每表只恢复一次;累计原因计数只作可能不完整的参考展示。Agent 可语义理解原始 `errorMsg` 辅助解释和建议,但两者都不驱动任务状态、重提任务或收敛判断。
141
142
  - **ER 图引导**:`db analyze-status` 终态成功后,检查并转述 `data.links.erPage`;若没有 `data.links`,补 `--appcode` 或进入已配置 app 的项目上下文后重查。
142
143
  - **写入**:[`db create`](references/rabetbase-db-create.md) / [`db update`](references/rabetbase-db-update.md) 默认先测试未保存配置,只有显式 `--skip-connection-test` 才跳过;[`db delete`](references/rabetbase-db-delete.md) 必须先 dry-run,执行前重新检查 DB_TABLE Dataset 依赖,有依赖即阻止且无 force。三者都支持 **`--dry-run`**。
143
144
  - **横切流程与 trace/plan**:[`database-connection-workflow.md`](guides/database-connection-workflow.md)。**单命令细则**见 `references/rabetbase-db-*.md`(与仓库 `src/commands/db/` 一一对应)。
@@ -154,10 +155,10 @@ metadata:
154
155
 
155
156
  ## 配置作用域原则(`--global`)
156
157
 
157
- - **写操作默认当前项目**(`init`、`workspace add`、`config set`、`project create` 等),除非用户**显式**传 `--global`。
158
+ - **普通写操作默认当前项目**(`workspace add`、`config set`、`project create` 等),除非用户**显式**传 `--global`;`config init` 是首次连接配置入口,固定写全局配置。
158
159
  - **不要**在用户未要求时给命令加 `--global`** — 默认行为已是「项目优先」;只有用户明确要改全局配置或不在项目内且意图写全局时才使用。
159
- - **`config set`**:在**没有**项目配置文件(当前目录未解析到 `.rabetbase.json`)且**未**传 `--global` 时,CLI **拒绝执行**并提示使用 `--global` 或先 `rabetbase init`,**不会**静默写入全局。
160
- - **`project create`** 生成的新项目 `.rabetbase.json` **只继承**少量全局偏好(如 `cookie` / `locale` / `format` / `riskLevel` 等),**不会**把全局 `apps` / `defaultApp` 带入新项目文件。
160
+ - **`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`:默认 CN 不写路由,ID 写 `region: "id"`,非默认企业 Runtime 写 `runtimeDomain` 且优先于 region,不下发认证配置。
161
162
  - **`api pull` / `api list`**:默认仅针对**项目** `apps`;需要合并全局已登记应用时加 `--global`(见各命令 reference)。
162
163
  - **`app list`**:默认展示**合并**后的全量;`--global` 仅全局、`--project` 仅项目(见 [`rabetbase app list`](references/rabetbase-app-list.md))。
163
164
 
@@ -176,9 +177,9 @@ metadata:
176
177
 
177
178
  | 场景 | 命令 |
178
179
  |------|------|
179
- | 首次安装后的全局引导 | `rabetbase init` |
180
- | 当前目录还没绑定默认 app | `rabetbase workspace init --appcode <code>`(**始终**写 `defaultApp`) |
181
- | 目录已有配置,只再登记一个 profile | `rabetbase workspace add <name> --appcode <code>`(仅当尚无 default 时才顺带设默认;`--global` 写全局) |
180
+ | 首次安装后的全局引导 | `rabetbase config init` |
181
+ | 当前目录还没绑定 app | `rabetbase workspace init --appcode <code>`(单应用不写 `defaultApp`) |
182
+ | 目录已有配置,只再登记一个 profile | `rabetbase workspace add <name> --appcode <code>`(从单应用变为多应用时保留原应用为默认;`--global` 写全局) |
182
183
  | 切换当前目录默认应用 | `rabetbase workspace use --app <name>` |
183
184
 
184
185
  **入口判断**:
@@ -223,11 +224,14 @@ metadata:
223
224
  import { createClient } from "@lovrabet/sdk";
224
225
  const client = createClient({
225
226
  appCode: "your-app-code",
227
+ authMode: "client-ak", // 传 accessKey 时必须显式声明;缺省 authMode 一律走 cookie 模式,accessKey 会被忽略
226
228
  accessKey: process.env.RABETBASE_ACCESS_KEY,
227
229
  models: [{ tableName: "users", datasetCode: "abc123", alias: "users" }],
228
230
  });
229
231
  ```
230
232
 
233
+ > 认证模式必须显式声明:`accessKey`(仅 accessKey)用 `authMode: "client-ak"`;`accessKey + secretKey` 或 `token` 的签名场景用 `authMode: "openapi"`;浏览器 Cookie 环境省略 `authMode`(默认 cookie)。
234
+
231
235
  ### filter 查询(最常用)
232
236
 
233
237
  ```typescript
@@ -242,11 +246,11 @@ const result = await client.models.users.filter({
242
246
 
243
247
  参数名强制约束:`select`(非 fields)、`orderBy`(非 sort)、`currentPage`/`pageSize`(非 page/limit)
244
248
 
245
- where 条件强制使用操作符:`$eq` `$ne` `$gte` `$lte` `$gt` `$lt` `$in` `$contain` `$startWith` `$endWith`
249
+ where 条件强制使用操作符:`$eq` `$ne` `$gt` `$lt` `$gte`(或别名 `$gteq`)`$lte`(或别名 `$lteq`)`$in` `$contain` `$startWith` `$endWith` `$notNull`(`$gteq`/`$lteq` 为后端兼容别名,映射同一 SQL,新代码推荐 `$gte`/`$lte`)
246
250
 
247
251
  ### SQL 调用
248
252
 
249
- 页面和 Backend Function 通过已发布 Custom SQL 的 `sqlCode` + `params` 执行查询。
253
+ 页面 SDK 通过已发布 Custom SQL 的 `sqlCode` + `params` 执行查询;Backend Function 默认通过当前应用内唯一 `sqlName` 的 `context.client.sql.byName(sqlName).execute({ params })` 执行查询,`sql.execute({ sqlCode, params })` 作为兼容调用方式。
250
254
 
251
255
  ```typescript
252
256
  const data = await client.sql.execute<MyRow>({
@@ -275,7 +279,7 @@ const result = await client.bff.execute<DashboardData>({
275
279
  | --------------- | -------------------------------------------- | ------------------------------------ |
276
280
  | SQL 返回值 | `{ execSuccess, execResult }` | 直接返回数组 `T[]` |
277
281
  | 单条查询 | `getOne({ id })` | `getOne({ id })` |
278
- | 模型键 | 可通过初始化/生成代码使用 alias | 使用 `"dataset_" + 32 位数据集 code` |
282
+ | 数据集访问 | 可通过初始化/生成代码使用 alias | `DB_TABLE` 默认使用 `models.byTable(tableName, { dblinkId? })`;`METADATA` 使用 `"dataset_" + 数据集 code`,`DB_TABLE` 也支持该兼容调用方式 |
279
283
  | `filter()` 返回 | `tableData` 为列表数据 | `tableData` 为列表数据,不是 `list` |
280
284
  | `create()` 返回 | 以 SDK 文档/类型为准 | 新记录 ID,不是完整对象 |
281
285
  | SDK 初始化能力 | `createClient` / `registerModels` | 不可用;`context.client` 由平台注入 |
@@ -285,7 +289,7 @@ const result = await client.bff.execute<DashboardData>({
285
289
 
286
290
  | 意图 | 推荐命令 | 备注 |
287
291
  |------|---------|------|
288
- | 初始化项目 | [`rabetbase init`](references/rabetbase-init.md) | 智能检测旧配置,支持 `--appcode` 非交互;**不加 `--global`** |
292
+ | 初始化连接配置 | [`rabetbase config init`](references/rabetbase-init.md) | 选择官方节点或导入独立部署 Domain |
289
293
  | 创建新项目 | [`rabetbase project create`](references/rabetbase-project-create.md) | 支持 `--name` + `--appcode` 非交互 |
290
294
  | 从 lovrabet-cli 迁移 | [`rabetbase project upgrade`](references/rabetbase-project-upgrade.md) | 6 步自动迁移,`--yes` 跳过确认 |
291
295
  | 老项目翻新蓝图 / Legacy Application Blueprint | [`guides/legacy-application-blueprint-workflow.md`](guides/legacy-application-blueprint-workflow.md) | 先输出 `.rabetbase/blueprint/<appCode>/application-blueprint.md`,把老代码逻辑与 Dataset / Relations 绑定后再生成迁移 Backlog |
@@ -314,7 +318,7 @@ const result = await client.bff.execute<DashboardData>({
314
318
  | 同步本地微前端路由到平台 | [`rabetbase menu sync`](references/rabetbase-menu-sync.md) | 扫描 `src/pages` 创建缺失的 `procode` 菜单;不上传构建产物;正式执行前先 `--dry-run` |
315
319
  | 修改微前端菜单资源 URL | [`rabetbase menu asset-update`](references/rabetbase-menu-asset-update.md) | `write`;用 ID/path 精确选目标或显式 `--all`,默认 patch 且保留加载模式,先 dry-run 再复用参数正式执行 |
316
320
  | 查看/管理开发角色 | [`rabetbase role list/detail/update/delete`](references/rabetbase-role-list.md) | 角色类型为 ADMIN/DEV/OWNER/CUSTOM;仅 CUSTOM 可改/删;当前不提供 create;输出 `scope: dev` |
317
- | 解析昵称/用户名到 userId | [`rabetbase role user-resolve`](references/rabetbase-role-user-resolve.md) | 基于租户成员目录;重名报错要求 `--user <id>` 消歧 |
321
+ | 解析昵称/用户名到 userId | [`rabetbase role user-resolve`](references/rabetbase-role-user-resolve.md) | 基于租户成员目录;重名时列出候选 ID,再把选中的 ID 传给 `role user-add/user-remove --user <id>` |
318
322
  | 查询租户人员列表 | [`rabetbase tenant members-list --tenant-code <code>`](references/rabetbase-tenant-members-list.md) | 先校验当前账号所属租户,再返回全量人员;不分页、不输出邮箱/手机号/头像 |
319
323
  | 查询应用人员及角色列表 | [`rabetbase app members-list --appcode <code>`](references/rabetbase-app-members-list.md) | 按 userId 去重并聚合 `roles[]`;同时保留 ACTIVE/PENDING 角色归属 |
320
324
  | 把开发协作者加入/移出角色 | [`rabetbase role user-add / user-remove`](references/rabetbase-role-user-add.md) | 只改目标开发角色;OWNER 直接拒绝;`high-risk-write`,先 `--dry-run` |
@@ -353,7 +357,7 @@ const result = await client.bff.execute<DashboardData>({
353
357
  | 推送本地数据列表页 schema | [`rabetbase page push --id <pageId>`](references/rabetbase-page-push.md) | 推送后自动回拉 canonical schema 覆盖本地 |
354
358
  | 恢复已删除页面 | [`rabetbase page restore --id <pageId>`](references/rabetbase-page-restore.md) | 支持 `DATA_LIST|CUSTOM` 自动识别;跨类型同 ID 时显式传 `--page-type` |
355
359
  | 数据库连接(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` |
356
- | 生成 API 客户端代码 | [`rabetbase api pull`](references/rabetbase-api-pull.md) | 拉取数据集并生成 `src/api/` TypeScript 代码 |
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 合并更新 |
357
361
  | 查看生成的 API 模型 | [`rabetbase api list`](references/rabetbase-api-list.md) | 列出已生成的数据模型 |
358
362
  | 查看现有 SQL | [`rabetbase sql list --name "xxx"`](references/rabetbase-sql-list.md) | 分页,按名称过滤;默认查当前决议到的单个应用 |
359
363
  | 查看 SQL 详情 | [`rabetbase sql detail --sqlcode xxx`](references/rabetbase-sql-detail.md) | 含完整 SQL 内容和参数定义 |
@@ -378,9 +382,9 @@ const result = await client.bff.execute<DashboardData>({
378
382
  | 查询应用人员及角色归属 | [`rabetbase app members-list --appcode <code>`](references/rabetbase-app-members-list.md) | 全量只读;按 userId 去重,角色归属聚合到 `roles[]` |
379
383
  | 查询租户人员 | [`rabetbase tenant members-list --tenant-code <code>`](references/rabetbase-tenant-members-list.md) | 全量只读;租户必须属于当前账号 |
380
384
  | 查看 app 服务帮助 | `rabetbase app` | 只显示 `app` 子命令帮助,不等价于 `app list` |
381
- | 绑定当前目录到应用 | [`rabetbase workspace init --appcode <code>`](references/rabetbase-workspace.md) | 首次绑定;**始终**写 `defaultApp`;与 `rabetbase init`(全局引导)不同 |
385
+ | 绑定当前目录到应用 | [`rabetbase workspace init --appcode <code>`](references/rabetbase-workspace.md) | 首次绑定;单应用自动选中且不写 `defaultApp`;与 `config init`(全局引导)不同 |
382
386
  | 切换当前工作目录默认应用 | [`rabetbase workspace use --app <name>`](references/rabetbase-workspace.md) | 持久修改当前目录 defaultApp |
383
- | 登记应用 | [`rabetbase workspace add <name> --appcode <code>`](references/rabetbase-workspace.md) | 仅当尚无 default 时顺带设默认;`--global` 写全局 |
387
+ | 登记应用 | [`rabetbase workspace add <name> --appcode <code>`](references/rabetbase-workspace.md) | 单应用不写 default;增加第二个应用时保留原应用为默认;`--global` 写全局 |
384
388
  | 移除应用 | [`rabetbase workspace remove <name>`](references/rabetbase-workspace.md) | 只移除本地 profile,移除后自动切换 default |
385
389
  | 临时切换应用执行 | 任何命令加 `--app <name>` 或 `--appcode <code>` | 不修改配置文件 |
386
390
  | 查看配置文件格式 | [`.rabetbase.json` 配置参考](references/rabetbase-config.md) | 完整字段、优先级、环境变量 |
@@ -402,7 +406,7 @@ const result = await client.bff.execute<DashboardData>({
402
406
  | Diagnostics | [`doctor`](references/rabetbase-doctor.md) |
403
407
  | Platform Issue | [`report`](references/rabetbase-issue-report.md) |
404
408
  | File | [`upload` / `query-url`](references/rabetbase-file.md) |
405
- | Configuration | [`config set`](references/rabetbase-config.md) / [`config get`](references/rabetbase-config.md) / [`config list`](references/rabetbase-config.md) |
409
+ | Configuration | [`config set/get/list/delete`](references/rabetbase-config.md) |
406
410
  | Runtime App Config Management | [`app-config list/get/set/delete`](references/rabetbase-app-config.md) |
407
411
  | Company Knowledge Base | [`kb list/detail/search/create/update/delete`](references/rabetbase-kb.md) |
408
412
  | Menu | [`list`](references/rabetbase-menu-list.md) / [`external-link-create`](references/rabetbase-menu-external-link-create.md) / [`external-link-update`](references/rabetbase-menu-external-link-update.md) / [`rename`](references/rabetbase-menu-rename.md) / [`sync`](references/rabetbase-menu-sync.md) / [`asset-update`](references/rabetbase-menu-asset-update.md) / [`delete`](references/rabetbase-menu-delete.md) / [`group-create`](references/rabetbase-menu-group-create.md) / [`group-update`](references/rabetbase-menu-group-update.md) / [`move`](references/rabetbase-menu-move.md) / [`regroup-start`](references/rabetbase-menu-regroup-start.md) |
@@ -486,11 +490,12 @@ const result = await client.bff.execute<DashboardData>({
486
490
  | 主题 | Use when | Guide |
487
491
  | ---------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
488
492
  | SDK 完整参数与返回值 | 初始化 client、filter/create、sql.execute、bff.execute、错误处理 | [`typescript-sdk.md`](guides/typescript-sdk.md) |
493
+ | 生成 / 更新 api.ts 与 client.ts | `api pull` 之后、模型过期、脚手架缺失、或用户要求修复 SDK 客户端 | [`sdk-client-generation.md`](guides/sdk-client-generation.md) |
489
494
  | SQL MyBatis 与动态 SQL | 写自定义 SQL、`<if>`/`<foreach>`、参数绑定 | [`sql-mybatis.md`](guides/sql-mybatis.md) |
490
495
  | 前端页面开发约束 | React 页、表单、列表、与数据集绑定 | [`frontend-development.md`](guides/frontend-development.md) |
491
496
  | 故障诊断 | CLI/登录/数据集/保存失败排障 | [`troubleshooting.md`](guides/troubleshooting.md) |
492
497
  | Backend Function 脚本规范 | HOOK/ENDPOINT/COMMON、`context.client`、消息通知扩展、目录与注释模板 | [`backend-function.md`](guides/backend-function.md) |
493
- | 数据接口访问 | 先 detail 再编码、外键/枚举、禁止 N+1、批量与关联查询;可选 `lovrabet data` 查数(**`lovrabet` CLI ≥ 2.0** 且已安装) | [`data-api-guidelines.md`](guides/data-api-guidelines.md) |
498
+ | 数据接口访问 | 先 detail 再编码、外键/枚举、禁止 N+1、批量与关联查询;验证真实行数据时交接 `lovrabet data`(**`lovrabet` CLI ≥ 2.0**) | [`data-api-guidelines.md`](guides/data-api-guidelines.md) |
494
499
  | SQL 创建工作流 | list/detail → pull/create → edit → validate → status → push/delete → exec 全链路 | [`sql-creation-workflow.md`](guides/sql-creation-workflow.md) |
495
500
  | Backend Function 创建工作流 | new → status → dry-run → pull/push | [`bff-creation-workflow.md`](guides/bff-creation-workflow.md) |
496
501
  | 冲突检测与保存 | `blocked`、未保存时的用户沟通、响应结构 | [`conflict-detection.md`](guides/conflict-detection.md) |