@lovrabet/rabetbase-cli 2.4.3 → 2.4.4-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 (381) hide show
  1. package/lib/api/api-doc.js +1 -1
  2. package/lib/api/fetch-model-list.js +1 -1
  3. package/lib/api/generate-api-file.js +1 -1
  4. package/lib/auth/auth-server-ui.js +1 -1
  5. package/lib/auth/auth-server.js +1 -1
  6. package/lib/auth/constant.js +1 -1
  7. package/lib/auth/get-cookie.js +1 -1
  8. package/lib/auth/get-session-user.js +1 -1
  9. package/lib/auth/is-session-valid.js +1 -1
  10. package/lib/auth/login-success-html.js +1 -1
  11. package/lib/auth/logout.js +1 -1
  12. package/lib/cli-flags.js +1 -1
  13. package/lib/cli.js +1 -1
  14. package/lib/commands/api/generate.js +1 -1
  15. package/lib/commands/api/index.js +1 -1
  16. package/lib/commands/api/list.js +1 -1
  17. package/lib/commands/api/pull.js +1 -1
  18. package/lib/commands/api/shared.js +1 -1
  19. package/lib/commands/app/index.js +1 -1
  20. package/lib/commands/app/list.js +1 -1
  21. package/lib/commands/app/members-list.js +1 -1
  22. package/lib/commands/app/remote-directory.js +1 -1
  23. package/lib/commands/app/shared.js +1 -1
  24. package/lib/commands/app-config/delete.js +1 -1
  25. package/lib/commands/app-config/get.js +1 -1
  26. package/lib/commands/app-config/index.js +1 -1
  27. package/lib/commands/app-config/list.js +1 -1
  28. package/lib/commands/app-config/set.js +1 -1
  29. package/lib/commands/app-config/shared.js +1 -1
  30. package/lib/commands/auth/index.js +1 -1
  31. package/lib/commands/bff/create.js +1 -1
  32. package/lib/commands/bff/delete.js +1 -1
  33. package/lib/commands/bff/detail.js +1 -1
  34. package/lib/commands/bff/index.js +1 -1
  35. package/lib/commands/bff/list.js +1 -1
  36. package/lib/commands/bff/pull.js +1 -1
  37. package/lib/commands/bff/push.js +1 -1
  38. package/lib/commands/bff/status.js +1 -1
  39. package/lib/commands/cli-skill/index.js +1 -1
  40. package/lib/commands/cli-update.js +1 -1
  41. package/lib/commands/codegen/index.js +1 -1
  42. package/lib/commands/codegen/sdk.js +1 -1
  43. package/lib/commands/codegen/sql.js +1 -1
  44. package/lib/commands/common/app-registry.js +1 -1
  45. package/lib/commands/common/app-selector.js +1 -1
  46. package/lib/commands/common/async-task.js +1 -1
  47. package/lib/commands/common/dry-run.js +1 -1
  48. package/lib/commands/common/flags.js +1 -1
  49. package/lib/commands/common/local-file.js +1 -1
  50. package/lib/commands/common/validate.js +1 -1
  51. package/lib/commands/config/get.js +1 -1
  52. package/lib/commands/config/index.js +1 -1
  53. package/lib/commands/config/list.js +1 -1
  54. package/lib/commands/config/set.js +1 -1
  55. package/lib/commands/config/shared.js +1 -1
  56. package/lib/commands/data/filter.js +1 -1
  57. package/lib/commands/data/getOne.js +1 -1
  58. package/lib/commands/data/index.js +1 -1
  59. package/lib/commands/data/shared.js +1 -1
  60. package/lib/commands/dataset/business-group-update.js +1 -1
  61. package/lib/commands/dataset/capability.js +1 -1
  62. package/lib/commands/dataset/delete.js +1 -1
  63. package/lib/commands/dataset/detail.js +1 -1
  64. package/lib/commands/dataset/extend-update.js +1 -1
  65. package/lib/commands/dataset/field-update.js +1 -1
  66. package/lib/commands/dataset/generate.js +1 -1
  67. package/lib/commands/dataset/index.js +1 -1
  68. package/lib/commands/dataset/list.js +1 -1
  69. package/lib/commands/dataset/operations.js +1 -1
  70. package/lib/commands/dataset/relation-audit.js +1 -1
  71. package/lib/commands/dataset/relation-create.js +1 -1
  72. package/lib/commands/dataset/relation-delete.js +1 -1
  73. package/lib/commands/dataset/relation-shared.js +1 -1
  74. package/lib/commands/dataset/relation-update.js +1 -1
  75. package/lib/commands/dataset/relations.js +1 -1
  76. package/lib/commands/dataset/rename.js +1 -1
  77. package/lib/commands/dataset/restore.js +1 -1
  78. package/lib/commands/db/analysis-batching.js +1 -1
  79. package/lib/commands/db/analyze-batch-plan.js +1 -1
  80. package/lib/commands/db/analyze-cancel.js +1 -1
  81. package/lib/commands/db/analyze-start.js +1 -1
  82. package/lib/commands/db/analyze-status.js +1 -1
  83. package/lib/commands/db/create.js +1 -1
  84. package/lib/commands/db/delete.js +1 -1
  85. package/lib/commands/db/detail.js +1 -1
  86. package/lib/commands/db/diff-refresh-start.d.ts +2 -0
  87. package/lib/commands/db/diff-refresh-start.js +1 -0
  88. package/lib/commands/db/diff-refresh-status.d.ts +2 -0
  89. package/lib/commands/db/diff-refresh-status.js +1 -0
  90. package/lib/commands/db/diff.js +1 -1
  91. package/lib/commands/db/index.js +1 -1
  92. package/lib/commands/db/list.js +1 -1
  93. package/lib/commands/db/shared.js +1 -1
  94. package/lib/commands/db/tables.js +1 -1
  95. package/lib/commands/db/test.js +1 -1
  96. package/lib/commands/db/update.js +1 -1
  97. package/lib/commands/doctor.js +1 -1
  98. package/lib/commands/file/index.js +1 -1
  99. package/lib/commands/init/index.js +1 -1
  100. package/lib/commands/issue/index.js +1 -1
  101. package/lib/commands/issue/nudge.js +1 -1
  102. package/lib/commands/issue/report.js +1 -1
  103. package/lib/commands/issue/shared.js +1 -1
  104. package/lib/commands/kb/create.js +1 -1
  105. package/lib/commands/kb/delete.js +1 -1
  106. package/lib/commands/kb/detail.js +1 -1
  107. package/lib/commands/kb/index.js +1 -1
  108. package/lib/commands/kb/list.js +1 -1
  109. package/lib/commands/kb/shared.js +1 -1
  110. package/lib/commands/kb/update.js +1 -1
  111. package/lib/commands/logs/index.js +1 -1
  112. package/lib/commands/menu/asset-update.js +1 -1
  113. package/lib/commands/menu/delete.js +1 -1
  114. package/lib/commands/menu/external-link-create.js +1 -1
  115. package/lib/commands/menu/external-link-update.js +1 -1
  116. package/lib/commands/menu/group-create.js +1 -1
  117. package/lib/commands/menu/group-update.js +1 -1
  118. package/lib/commands/menu/index.js +1 -1
  119. package/lib/commands/menu/list.js +1 -1
  120. package/lib/commands/menu/move.js +1 -1
  121. package/lib/commands/menu/regroup-start.js +1 -1
  122. package/lib/commands/menu/rename.js +1 -1
  123. package/lib/commands/menu/shared/compare-table.js +1 -1
  124. package/lib/commands/menu/shared/delete-plan.js +1 -1
  125. package/lib/commands/menu/shared/facts.js +1 -1
  126. package/lib/commands/menu/shared/index.js +1 -1
  127. package/lib/commands/menu/shared/inquirer.js +1 -1
  128. package/lib/commands/menu/shared/local-pages.js +1 -1
  129. package/lib/commands/menu/shared/logic.js +1 -1
  130. package/lib/commands/menu/shared/mutations.js +1 -1
  131. package/lib/commands/menu/shared/service.js +1 -1
  132. package/lib/commands/menu/shared/sync-core.js +1 -1
  133. package/lib/commands/menu/shared/update-core.js +1 -1
  134. package/lib/commands/menu/shared/valid-url.js +1 -1
  135. package/lib/commands/menu/sync.js +1 -1
  136. package/lib/commands/notification/config-create.d.ts +2 -0
  137. package/lib/commands/notification/config-create.js +1 -0
  138. package/lib/commands/notification/config-delete.d.ts +2 -0
  139. package/lib/commands/notification/config-delete.js +1 -0
  140. package/lib/commands/notification/config-list.js +1 -1
  141. package/lib/commands/notification/config-update.d.ts +2 -0
  142. package/lib/commands/notification/config-update.js +1 -0
  143. package/lib/commands/notification/index.js +1 -1
  144. package/lib/commands/notification/shared.d.ts +97 -0
  145. package/lib/commands/notification/shared.js +1 -0
  146. package/lib/commands/ocr/index.js +1 -1
  147. package/lib/commands/page/generate-start.js +1 -1
  148. package/lib/commands/page/generate-status.js +1 -1
  149. package/lib/commands/page/index.js +1 -1
  150. package/lib/commands/page/pull.js +1 -1
  151. package/lib/commands/page/push.js +1 -1
  152. package/lib/commands/page/react/create.js +1 -1
  153. package/lib/commands/page/react/detail.js +1 -1
  154. package/lib/commands/page/react/list.js +1 -1
  155. package/lib/commands/page/react/publish.js +1 -1
  156. package/lib/commands/page/react/shared.js +1 -1
  157. package/lib/commands/page/react/syntax.js +1 -1
  158. package/lib/commands/page/react/template.js +1 -1
  159. package/lib/commands/page/react/update.js +1 -1
  160. package/lib/commands/page/relation-audit.js +1 -1
  161. package/lib/commands/page/restore.js +1 -1
  162. package/lib/commands/page/shared.js +1 -1
  163. package/lib/commands/page/standard-page-status.js +1 -1
  164. package/lib/commands/page/sync.js +1 -1
  165. package/lib/commands/permit/index.js +1 -1
  166. package/lib/commands/permit/page-get.js +1 -1
  167. package/lib/commands/permit/page-set.js +1 -1
  168. package/lib/commands/permit/role-apis-set.js +1 -1
  169. package/lib/commands/permit/role-menus-set.js +1 -1
  170. package/lib/commands/permit/role-menus.js +1 -1
  171. package/lib/commands/permit/shared.js +1 -1
  172. package/lib/commands/project/create/enhanced-guided-create.js +1 -1
  173. package/lib/commands/project/create/format-elapsed.js +1 -1
  174. package/lib/commands/project/create/main.d.ts +1 -0
  175. package/lib/commands/project/create/main.js +1 -1
  176. package/lib/commands/project/create/materialize-project-template.d.ts +11 -0
  177. package/lib/commands/project/create/materialize-project-template.js +1 -0
  178. package/lib/commands/project/create/project-name.d.ts +2 -0
  179. package/lib/commands/project/create/project-name.js +1 -0
  180. package/lib/commands/project/create/project-template-archive.d.ts +6 -0
  181. package/lib/commands/project/create/project-template-archive.js +1 -0
  182. package/lib/commands/project/create/project-template-path.d.ts +1 -3
  183. package/lib/commands/project/create/project-template-path.js +1 -1
  184. package/lib/commands/project/create/use-copy-project-template.d.ts +2 -1
  185. package/lib/commands/project/create/use-copy-project-template.js +1 -1
  186. package/lib/commands/project/create/use-format-code.js +1 -1
  187. package/lib/commands/project/create/use-install-dependencies.js +1 -1
  188. package/lib/commands/project/index.js +1 -1
  189. package/lib/commands/project/upgrade.js +1 -1
  190. package/lib/commands/registry.js +1 -1
  191. package/lib/commands/role/create.js +1 -1
  192. package/lib/commands/role/delete.js +1 -1
  193. package/lib/commands/role/detail.js +1 -1
  194. package/lib/commands/role/index.js +1 -1
  195. package/lib/commands/role/list.js +1 -1
  196. package/lib/commands/role/shared.js +1 -1
  197. package/lib/commands/role/update.js +1 -1
  198. package/lib/commands/role/user-add.js +1 -1
  199. package/lib/commands/role/user-remove.js +1 -1
  200. package/lib/commands/role/user-resolve.js +1 -1
  201. package/lib/commands/run/index.js +1 -1
  202. package/lib/commands/schema.js +1 -1
  203. package/lib/commands/sql/create.js +1 -1
  204. package/lib/commands/sql/delete.js +1 -1
  205. package/lib/commands/sql/detail.js +1 -1
  206. package/lib/commands/sql/exec.js +1 -1
  207. package/lib/commands/sql/index.js +1 -1
  208. package/lib/commands/sql/list.js +1 -1
  209. package/lib/commands/sql/pull.js +1 -1
  210. package/lib/commands/sql/push.js +1 -1
  211. package/lib/commands/sql/shared.js +1 -1
  212. package/lib/commands/sql/status.js +1 -1
  213. package/lib/commands/sql/validate.js +1 -1
  214. package/lib/commands/task/index.js +1 -1
  215. package/lib/commands/task/status.js +1 -1
  216. package/lib/commands/tenant/index.js +1 -1
  217. package/lib/commands/tenant/members-list.js +1 -1
  218. package/lib/commands/tenant/shared.js +1 -1
  219. package/lib/commands/user-account/dingding-sandbox-bind.js +1 -1
  220. package/lib/commands/user-account/index.js +1 -1
  221. package/lib/commands/workspace/add.js +1 -1
  222. package/lib/commands/workspace/index.js +1 -1
  223. package/lib/commands/workspace/remove.js +1 -1
  224. package/lib/config/schema.js +1 -1
  225. package/lib/constant/cdn.d.ts +2 -0
  226. package/lib/constant/cdn.js +1 -1
  227. package/lib/constant/cli.js +1 -1
  228. package/lib/constant/defaults.js +1 -1
  229. package/lib/constant/domain.js +1 -1
  230. package/lib/constant/env.js +1 -1
  231. package/lib/constant/output.js +1 -1
  232. package/lib/constant/paths.js +1 -1
  233. package/lib/constant/risk.js +1 -1
  234. package/lib/context/app-resolver.js +1 -1
  235. package/lib/context/auth-resolver.js +1 -1
  236. package/lib/context/config-loader.js +1 -1
  237. package/lib/context.d.ts +1 -1
  238. package/lib/context.js +1 -1
  239. package/lib/core/alias-resolver.js +1 -1
  240. package/lib/core/api-client.d.ts +29 -2
  241. package/lib/core/api-client.js +1 -1
  242. package/lib/core/bff/config.js +1 -1
  243. package/lib/core/bff/file-system.js +1 -1
  244. package/lib/core/bff/hash.js +1 -1
  245. package/lib/core/bff/lock.js +1 -1
  246. package/lib/core/bff/utils.js +1 -1
  247. package/lib/core/db-resolver.js +1 -1
  248. package/lib/core/page/file-system.js +1 -1
  249. package/lib/core/page/hash.js +1 -1
  250. package/lib/core/page/lock.js +1 -1
  251. package/lib/core/sql-index-auditor.js +1 -1
  252. package/lib/core/sql-sync/config.js +1 -1
  253. package/lib/core/sql-sync/file-system.js +1 -1
  254. package/lib/core/sql-sync/hash.js +1 -1
  255. package/lib/core/sql-sync/lock.js +1 -1
  256. package/lib/core/sql-sync/utils.js +1 -1
  257. package/lib/core/sql-validator.js +1 -1
  258. package/lib/errors.js +1 -1
  259. package/lib/framework/build-all-flags.js +1 -1
  260. package/lib/framework/error-output.js +1 -1
  261. package/lib/framework/explicit-yes.js +1 -1
  262. package/lib/framework/flags.js +1 -1
  263. package/lib/framework/help.js +1 -1
  264. package/lib/framework/index.js +1 -1
  265. package/lib/framework/output.js +1 -1
  266. package/lib/framework/response.js +1 -1
  267. package/lib/framework/runner-alias.js +1 -1
  268. package/lib/framework/runner.js +1 -1
  269. package/lib/framework/schema-export.js +1 -1
  270. package/lib/framework/types.js +1 -1
  271. package/lib/generated/build-info.d.ts +4 -4
  272. package/lib/generated/build-info.js +1 -1
  273. package/lib/help.js +1 -1
  274. package/lib/postinstall.js +1 -1
  275. package/lib/runtime/confirmation.js +1 -1
  276. package/lib/runtime/event.js +1 -1
  277. package/lib/runtime/index.js +1 -1
  278. package/lib/runtime/queue.js +1 -1
  279. package/lib/runtime/resolve.js +1 -1
  280. package/lib/skills/builtin-skill.js +1 -1
  281. package/lib/skills/main.js +1 -1
  282. package/lib/skills/npx-skills-add.js +1 -1
  283. package/lib/skills/skill-presence.js +1 -1
  284. package/lib/telemetry/cli-command-trace.js +1 -1
  285. package/lib/telemetry/cli-help-trace.js +1 -1
  286. package/lib/telemetry/ensure-cli-otel-config.js +1 -1
  287. package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
  288. package/lib/telemetry/send-cli-trace-log.js +1 -1
  289. package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
  290. package/lib/utils/ai_config.js +1 -1
  291. package/lib/utils/apply-jq-filter.js +1 -1
  292. package/lib/utils/cdn-config.js +1 -1
  293. package/lib/utils/check-sdk-version.js +1 -1
  294. package/lib/utils/cli-version-check.js +1 -1
  295. package/lib/utils/cli-version-policy.d.ts +13 -0
  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/rules-cdn.js +1 -1
  307. package/lib/utils/sleep.js +1 -1
  308. package/lib/utils/template-replacer.js +1 -1
  309. package/lib/utils/update-notice.js +1 -1
  310. package/lib/utils/version.js +1 -1
  311. package/lib/utils/with-active-cookie.js +1 -1
  312. package/lib/utils/write-cli-side-channel.js +1 -1
  313. package/package.json +9 -4
  314. package/skills/rabetbase/SKILL.md +33 -22
  315. package/skills/rabetbase/guides/backend-function.md +5 -3
  316. package/skills/rabetbase/guides/bff-creation-workflow.md +2 -2
  317. package/skills/rabetbase/guides/conflict-detection.md +2 -2
  318. package/skills/rabetbase/guides/database-connection-workflow.md +39 -5
  319. package/skills/rabetbase/guides/react-custom-page-workflow.md +16 -4
  320. package/skills/rabetbase/guides/sql-creation-workflow.md +4 -2
  321. package/skills/rabetbase/guides/sql-mybatis.md +2 -2
  322. package/skills/rabetbase/knowledge/page-schema/YtPage.md +3 -37
  323. package/skills/rabetbase/knowledge/react-page/generation-standards.md +14 -3
  324. package/skills/rabetbase/references/rabetbase-app-config.md +2 -2
  325. package/skills/rabetbase/references/rabetbase-bff-push.md +4 -5
  326. package/skills/rabetbase/references/rabetbase-bff-save.md +3 -3
  327. package/skills/rabetbase/references/rabetbase-config.md +2 -2
  328. package/skills/rabetbase/references/rabetbase-db-analyze.md +2 -2
  329. package/skills/rabetbase/references/rabetbase-db-detail.md +3 -0
  330. package/skills/rabetbase/references/rabetbase-db-diff-refresh.md +53 -0
  331. package/skills/rabetbase/references/rabetbase-db-diff.md +40 -21
  332. package/skills/rabetbase/references/rabetbase-db-list.md +1 -1
  333. package/skills/rabetbase/references/rabetbase-kb.md +5 -3
  334. package/skills/rabetbase/references/rabetbase-menu-asset-update.md +9 -10
  335. package/skills/rabetbase/references/rabetbase-menu-external-link-update.md +1 -3
  336. package/skills/rabetbase/references/rabetbase-menu-regroup-start.md +2 -3
  337. package/skills/rabetbase/references/rabetbase-notification-config-list.md +2 -2
  338. package/skills/rabetbase/references/rabetbase-notification-config-mutations.md +56 -0
  339. package/skills/rabetbase/references/rabetbase-page-react-detail.md +1 -1
  340. package/skills/rabetbase/references/rabetbase-page-react-list.md +1 -1
  341. package/skills/rabetbase/references/rabetbase-page-react-publish.md +2 -2
  342. package/skills/rabetbase/references/rabetbase-project-create.md +3 -0
  343. package/skills/rabetbase/references/rabetbase-run.md +1 -1
  344. package/skills/rabetbase/references/rabetbase-sql-create.md +1 -1
  345. package/skills/rabetbase/references/rabetbase-sql-push.md +3 -4
  346. package/skills/rabetbase/references/rabetbase-user-account.md +0 -1
  347. package/skills/rabetbase.manifest.json +5 -5
  348. package/templates/README.md +14 -2
  349. package/lib/commands/project/create/non-interactive.d.ts +0 -9
  350. package/lib/commands/project/create/non-interactive.js +0 -1
  351. package/lib/utils/copy-directory.d.ts +0 -1
  352. package/lib/utils/copy-directory.js +0 -1
  353. package/skills/rabetbase/knowledge/page-schema/LrSmartEcharts.md +0 -291
  354. package/skills/rabetbase/knowledge/page-schema/LrSmartStatistic.md +0 -223
  355. package/templates/projects/sub-app-react-demo/.prettierrc +0 -1
  356. package/templates/projects/sub-app-react-demo/CHANGELOG.md +0 -67
  357. package/templates/projects/sub-app-react-demo/README.md +0 -246
  358. package/templates/projects/sub-app-react-demo/docs/quick-start.md +0 -245
  359. package/templates/projects/sub-app-react-demo/index.html +0 -27
  360. package/templates/projects/sub-app-react-demo/package.json +0 -34
  361. package/templates/projects/sub-app-react-demo/public/logo.svg +0 -1
  362. package/templates/projects/sub-app-react-demo/public/vite.svg +0 -1
  363. package/templates/projects/sub-app-react-demo/src/api/api.ts +0 -26
  364. package/templates/projects/sub-app-react-demo/src/api/client.ts +0 -32
  365. package/templates/projects/sub-app-react-demo/src/components/demo-page-container/DemoPageContainer.module.css +0 -28
  366. package/templates/projects/sub-app-react-demo/src/components/demo-page-container/DemoPageContainer.tsx +0 -55
  367. package/templates/projects/sub-app-react-demo/src/layouts/MainLayout.tsx +0 -308
  368. package/templates/projects/sub-app-react-demo/src/main.tsx +0 -52
  369. package/templates/projects/sub-app-react-demo/src/pages/dashboard/index.tsx +0 -570
  370. package/templates/projects/sub-app-react-demo/src/pages/data-screen/index.tsx +0 -531
  371. package/templates/projects/sub-app-react-demo/src/pages/index.module.css +0 -500
  372. package/templates/projects/sub-app-react-demo/src/pages/index.tsx +0 -641
  373. package/templates/projects/sub-app-react-demo/src/pages/sdk-demo/index.tsx +0 -536
  374. package/templates/projects/sub-app-react-demo/src/pages/workbench/index.module.css +0 -295
  375. package/templates/projects/sub-app-react-demo/src/pages/workbench/index.tsx +0 -242
  376. package/templates/projects/sub-app-react-demo/src/router/index.tsx +0 -30
  377. package/templates/projects/sub-app-react-demo/src/style.css +0 -108
  378. package/templates/projects/sub-app-react-demo/src/utils/api.ts +0 -12
  379. package/templates/projects/sub-app-react-demo/src/vite-env.d.ts +0 -2
  380. package/templates/projects/sub-app-react-demo/tsconfig.json +0 -26
  381. package/templates/projects/sub-app-react-demo/vite.config.ts +0 -111
@@ -1,57 +1,76 @@
1
1
  # db diff
2
2
 
3
- 分页查看**线上库相对上次分析**的 schema 差异(新增表、删除表、改字段等)。只读。
3
+ 分页查看数据库表差异或全部数据表。只读。
4
4
 
5
- ## 何时用
5
+ ## 两种视角
6
6
 
7
- - 表结构变更后,决定是跑全量分析还是 `analyze-start --tables …` 增量
8
- - 排查「平台数据集与真实库不一致」
7
+ | 视角 | 命令 | 服务端语义 |
8
+ |---|---|---|
9
+ | 差异表(默认) | `db diff` | 调用 `getDiffTableByPage`。表数量不大于 200 时服务端通常实时计算;大于 200 时可能读取最近一次差异快照。 |
10
+ | 全部表 | `db diff --view all` | 调用实时分页接口,包含 `ALREADY_ANALYZED`,用于查看无差异表或手动选择重新分析。 |
11
+
12
+ `--all` 始终表示“聚合当前视角的全部分页”,不表示“全部表”。需要全部表必须显式传 `--view all`。
9
13
 
10
14
  ## 命令
11
15
 
12
16
  ```bash
17
+ # 默认差异表视角
13
18
  rabetbase db diff --id 10157 --format compress
14
- rabetbase db diff --id 10157 --table order --page 1 --pagesize 20 --format compress
15
19
  rabetbase db diff --id 10157 --all --changed-only --format compress
20
+
21
+ # 全部表实时视角
22
+ rabetbase db diff --id 10157 --view all --page 1 --pagesize 20 --format compress
23
+ rabetbase db diff --id 10157 --view all --all --format compress
16
24
  ```
17
25
 
18
26
  ## 参数
19
27
 
20
28
  | Flag | 必填 | 说明 |
21
- |------|------|------|
29
+ |---|---|---|
22
30
  | `--id` | **是** | dblink id |
31
+ | `--view` | 否 | `diff`(默认)或 `all` |
23
32
  | `--table` | 否 | 表名模糊过滤 |
24
33
  | `--page` / `--pagesize` | 否 | 默认 `1` / `20` |
25
- | `--all` | 否 | 从第 1 页开始按 `pageSize=100` 自动聚合全部分页;优先级高于 `--page / --pagesize` |
26
- | `--changed-only` | 否 | 只从 `tables / tableList` 排除 `ALREADY_ANALYZED`;保留 `DELETED_TABLE` |
34
+ | `--all` | 否 | 从第 1 页开始按 `pageSize=100` 自动聚合当前视角全部分页;优先级高于 `--page / --pagesize` |
35
+ | `--changed-only` | 否 | 从输出行中排除 `ALREADY_ANALYZED`;保留 `DELETED_TABLE` |
36
+
37
+ ## 刷新决策
38
+
39
+ 先执行 `db detail --id <id>` 读取 `tableCount`:
40
+
41
+ - `tableCount <= 200`:直接读取 `db diff`;除非用户明确要求,否则不要刷新。
42
+ - `tableCount > 200`:读取前建议按 [`db diff-refresh-start/status`](rabetbase-db-diff-refresh.md) 刷新差异快照。
43
+ - 用户明确要求“实时刷新/强制刷新”:不考虑表数量,执行刷新。
44
+ - 用户明确要求“不刷新/只看现有结果”:直接读取;大库需提示结果可能滞后。
45
+ - `tableCount` 缺失:直接读取并说明新鲜度未知,不要因为未知而隐式发起写任务。
46
+
47
+ `db diff` 是只读命令,绝不隐式启动刷新任务。
27
48
 
28
49
  ## 机器可读摘要
29
50
 
30
51
  | 字段 | 语义 |
31
- |------|------|
52
+ |---|---|
53
+ | `view` | 当前视角:`diff` 或 `all` |
32
54
  | `summaryByType` | 本次查询范围内四种 `diffType` 的计数 |
33
55
  | `toAnalyzeTables` | 仅包含 `NEW_TABLE` 与 `MODIFIED_TABLE` 的表名,可传给 `analyze-start --tables` |
34
56
  | `deletedTables` | 仅包含 `DELETED_TABLE`,供人工确认,不自动分析或清理 |
35
57
  | `modifiedFieldDiffs` | 修改表的新增、删除、变更字段摘要 |
36
58
 
37
- 未传 `--all` 时,上述字段只代表当前页;需要完整范围时使用 `--all`。派生字段基于过滤前的查询范围计算,因此使用 `--changed-only` 时,`summaryByType.ALREADY_ANALYZED` 仍可反映原始计数。
59
+ 未传 `--all` 时,派生字段只代表当前页。默认差异视角通常不会返回 `physicalTableCount`、`datasetTableCount` `summary`;CLI 不以 `0` 伪造缺失值。全表实时视角在服务端提供这些字段时会原样返回。
38
60
 
39
- ## `diffType` 语义(与 yuntoo-web-app 增量分析抽屉一致)
40
-
41
- 接口返回 `IDbTableDiffInfo.diffType`,工作台「数据库连接 → 增量分析」里对每行表的展示文案如下,可与 CLI 输出对照:
61
+ ## `diffType` 语义
42
62
 
43
63
  | `diffType` | 界面文案 | 含义 |
44
- |------------|----------|------|
45
- | `NEW_TABLE` | 表新增 | 物理库中**有**该表,但**尚未纳入**(或尚未完成)上次智能分析;适合勾选后走 `db analyze-start --tables …` 做增量分析。 |
46
- | `DELETED_TABLE` | 表删除 | 相对上次已分析快照,该表在库侧**已不存在**(或已被移除);界面上勾选增量分析时**不可选**该行。 |
47
- | `MODIFIED_TABLE` | 表修改 | 表仍在,但**结构相对上次分析有变**;同条记录里可能有 `fieldDiff`(`addedColumns` / `deletedColumns` / `modifiedColumns`)。 |
48
- | `ALREADY_ANALYZED` | 无差异 | 当前表结构与上次分析结果**一致**,无需因本表再跑增量(界面用灰色「无差异」标签)。 |
49
-
50
- `DELETED_TABLE` 不会进入 `toAnalyzeTables`。如果自动分页在达到 `totalCount` 前遇到空页或不再产生新的唯一表,命令会失败,不把部分结果当作完整结果返回。
64
+ |---|---|---|
65
+ | `NEW_TABLE` | 表新增 | 物理库中有该表,但尚未纳入或尚未完成上次智能分析。 |
66
+ | `DELETED_TABLE` | 表删除 | 相对上次已分析结果,该表在库侧已不存在或已被移除。 |
67
+ | `MODIFIED_TABLE` | 表修改 | 表仍在,但结构相对上次分析有变化。 |
68
+ | `ALREADY_ANALYZED` | 无差异 | 当前表结构与上次分析结果一致;在 `--view all` 中可供用户主动重新分析。 |
51
69
 
52
- `--all` 聚合的是服务端实时分页结果,不是事务一致性快照。数据库结构在翻页期间持续变化时,结果可能来自不同查询时刻;检测到分页无进展会直接失败。此时应等待库表结构稳定后重试,并在分析结束后再次执行 `db diff --all --changed-only` 验证差异收敛。
70
+ `DELETED_TABLE` 不进入 `toAnalyzeTables`。自动分页在达到 `totalCount` 前遇到空页或没有新增唯一表时,命令失败,不把部分结果伪装成完整结果。
53
71
 
54
72
  ## 参考
55
73
 
74
+ - [差异刷新](rabetbase-db-diff-refresh.md)
56
75
  - [database-connection-workflow.md](../guides/database-connection-workflow.md)
57
76
  - [SKILL.md](../SKILL.md)
@@ -27,7 +27,7 @@ rabetbase db list --appcode app-xxxx --format compress
27
27
 
28
28
  ## 输出要点
29
29
 
30
- - `connections[]`:每条含 `id`、`dbName`、`dbType`、`latestAnalysisStatus`、`latestAnalysisTraceId` 等
30
+ - `connections[]`:每条含 `id`、`dbName`、`dbType`、`latestAnalysisStatus`、`latestAnalysisTraceId`,以及服务端提供时的 `tableCount`
31
31
  - 返回中密码已脱敏
32
32
  - 若接口未返回分页元数据,`paging.totalCount` 为 `null` 并带 `note`,**勿将本页条数当作全量总数**
33
33
 
@@ -11,9 +11,9 @@ rabetbase kb list --format compress
11
11
  rabetbase kb list --appcode app-xxxxx --title "业务规则" --format compress
12
12
  rabetbase kb detail --id 60 --format compress
13
13
  rabetbase kb create --title "业务规则" --file ./knowledge.md --dry-run
14
- rabetbase kb create --title "业务规则" --file ./knowledge.md --yes
14
+ rabetbase kb create --title "业务规则" --file ./knowledge.md
15
15
  rabetbase kb update --id 60 --file ./knowledge.md --expected-version 2 --dry-run
16
- rabetbase kb update --id 60 --file ./knowledge.md --expected-version 2 --yes
16
+ rabetbase kb update --id 60 --file ./knowledge.md --expected-version 2
17
17
  rabetbase kb delete --id 60 --dry-run
18
18
  rabetbase kb delete --id 60 --yes
19
19
  ```
@@ -33,9 +33,10 @@ rabetbase kb delete --id 60 --yes
33
33
 
34
34
  ## create
35
35
 
36
+ - `create/update` 为 `write`,正式执行不要求 `--yes`;仍应先审阅 dry-run。
36
37
  - 只需 `--title`、`--file`;应用由标准全局应用解析得到。
37
38
  - 写前按 `(company, appCode, title)` 精确检查重复。
38
- - 正式执行必须显式 `--yes`,请求最多提交一次。
39
+ - 审阅 dry-run 后,使用相同参数移除 `--dry-run` 正式执行;请求最多提交一次。
39
40
  - 正常响应使用服务端返回 VO/ID 并按 ID 回读。只有底层响应不确定时,才按同一 company/app/title 三元组做只读恢复;零条或多条都返回 outcome unknown,绝不自动重提。
40
41
  - 授权、权限、参数和其他确定性服务端错误直接失败,不能用旧状态回读伪装成成功。
41
42
 
@@ -50,6 +51,7 @@ rabetbase kb delete --id 60 --yes
50
51
  ## delete
51
52
 
52
53
  - 已验证服务端合同:`POST /admin/knowledge-base/delete`,请求体 `{id}`,成功为 `Result<Void>`。
54
+ - `delete` 保持 `high-risk-write`;正式执行必须显式 `--yes`,并建议先审阅 dry-run。
53
55
  - 写前读取目标,校验 ID、company scope、appCode、可选 expected-version 和安全快照;`--expected-version` 仍是非原子断言,dry-run 明确输出 `atomicCompareAndSet: false`。
54
56
  - 目标明确不存在时返回 no-op 且不发请求;只有服务端 `DATA_NOT_EXIST (306)` 可识别为不存在,`PARAM_INVALID (103)`、权限、认证或传输错误不能降级为 no-op。
55
57
  - 正式删除最多提交一次,再按同一 ID 回读;明确不存在用于验证数据库软删除。
@@ -2,7 +2,7 @@
2
2
 
3
3
  更新指定线上微前端菜单的 CDN 资源 URL。
4
4
 
5
- > **风险等级:high-risk-write** — 修改线上菜单运行资源;非交互正式执行必须显式 `--yes`。
5
+ > **风险等级:write** — 修改线上菜单运行资源;建议先 dry-run,正式执行复用相同参数并移除 `--dry-run`。
6
6
 
7
7
  ## 命令
8
8
 
@@ -12,7 +12,7 @@ rabetbase menu asset-update
12
12
 
13
13
  # 使用 menu list 返回的真实 path 精确预览并更新
14
14
  rabetbase menu asset-update --paths "<menu-path>" --params '{"cssUrl":"https://...css"}' --dry-run --format compress
15
- rabetbase menu asset-update --paths "<menu-path>" --params '{"cssUrl":"https://...css"}' --yes --format compress
15
+ rabetbase menu asset-update --paths "<menu-path>" --params '{"cssUrl":"https://...css"}' --format compress
16
16
 
17
17
  # 按菜单 ID 精确更新,并显式切换加载方式
18
18
  rabetbase menu asset-update --menu-ids "<menu-id>" --load-mode fetch --params '{"jsUrl":"https://...js"}' --dry-run --format compress
@@ -53,7 +53,7 @@ rabetbase menu asset-update --paths "<menu-path>" --params '{"cssUrl":"https://.
53
53
  5. **正式执行必须复用 dry-run 的同一组 selector、`--mode` 和 `--params`**:
54
54
 
55
55
  ```bash
56
- rabetbase menu asset-update --paths "<menu-path>" --params '{"cssUrl":"https://...css"}' --yes --format compress
56
+ rabetbase menu asset-update --paths "<menu-path>" --params '{"cssUrl":"https://...css"}' --format compress
57
57
  ```
58
58
 
59
59
  6. **执行后回查资源现状**:
@@ -67,15 +67,15 @@ rabetbase menu list --format json --jq '.data.menus[] | select(.resources | leng
67
67
  ```bash
68
68
  # 只替换 CSS,保留已有 JS
69
69
  rabetbase menu asset-update --paths "<menu-path>" --params '{"cssUrl":"https://cdn.example.com/app.css"}' --dry-run --format compress
70
- rabetbase menu asset-update --paths "<menu-path>" --params '{"cssUrl":"https://cdn.example.com/app.css"}' --yes --format compress
70
+ rabetbase menu asset-update --paths "<menu-path>" --params '{"cssUrl":"https://cdn.example.com/app.css"}' --format compress
71
71
 
72
72
  # 只替换 JS,保留已有 CSS
73
73
  rabetbase menu asset-update --menu-ids "<menu-id>" --params '{"jsUrl":"https://cdn.example.com/app.js"}' --dry-run --format compress
74
- rabetbase menu asset-update --menu-ids "<menu-id>" --params '{"jsUrl":"https://cdn.example.com/app.js"}' --yes --format compress
74
+ rabetbase menu asset-update --menu-ids "<menu-id>" --params '{"jsUrl":"https://cdn.example.com/app.js"}' --format compress
75
75
 
76
76
  # 显式更新全部菜单的 JS + CSS
77
77
  rabetbase menu asset-update --all --params '{"jsUrl":"https://cdn.example.com/app.js","cssUrl":"https://cdn.example.com/app.css"}' --dry-run --format compress
78
- rabetbase menu asset-update --all --params '{"jsUrl":"https://cdn.example.com/app.js","cssUrl":"https://cdn.example.com/app.css"}' --yes --format compress
78
+ rabetbase menu asset-update --all --params '{"jsUrl":"https://cdn.example.com/app.js","cssUrl":"https://cdn.example.com/app.css"}' --format compress
79
79
  ```
80
80
 
81
81
  ## 参数
@@ -86,7 +86,6 @@ rabetbase menu asset-update --all --params '{"jsUrl":"https://cdn.example.com/ap
86
86
  | `--menu-ids <csv>` | string | 至少一个 selector | — | 精确菜单 ID;只接受正安全整数;可与 paths 组合,不可与 all 组合 |
87
87
  | `--paths <csv>` | string | 至少一个 selector | — | 精确菜单 path;可与 menu-ids 组合,不可与 all 组合 |
88
88
  | `--all` | boolean | 至少一个 selector | `false` | 显式选择所有已有 resources 的菜单;不可与 ID/path 组合 |
89
- | `--yes` | boolean | 正式执行必填 | — | 跳过高风险确认并更新已选择菜单,必须配合有效 `--params` |
90
89
  | `--mode <mode>` | string | 否 | `patch` | `patch` 只在目标唯一时替换传入的同类型资源并保留其他资源;`replace` 将传入 URL 作为完整 `resources` |
91
90
  | `--load-mode <mode>` | string | 否 | 保留线上值 | 显式修改为 `import`、`script` 或 `fetch` |
92
91
  | `--force` | boolean | 否 | `false` | 允许 `replace` 删除已有 JS 资源;仅用于明确的资源降级/迁移 |
@@ -96,7 +95,7 @@ rabetbase menu asset-update --all --params '{"jsUrl":"https://cdn.example.com/ap
96
95
  ## 执行模式
97
96
 
98
97
  1. **selector + `--params` + `--dry-run`** — 非交互预览精确目标;全量必须显式 `--all`
99
- 2. **selector + `--params` + `--yes`** — 正式更新精确目标;必须复用 dry-run 参数
98
+ 2. **selector + `--params`** — 正式更新精确目标;必须复用 dry-run 参数并移除 `--dry-run`
100
99
  3. **TTY 交互式** — 未给 selector 时展示全部有资源菜单并二次确认;给 selector 时只展示目标
101
100
 
102
101
  ## 输出
@@ -109,7 +108,7 @@ rabetbase menu asset-update --all --params '{"jsUrl":"https://cdn.example.com/ap
109
108
  ## 提示
110
109
 
111
110
  - 仅更新已配置了资源 URL 且被 selector 命中的菜单
112
- - 非交互和 dry-run 缺 selector 会被拒绝;`--yes` 不能裸跑;空 `--params` 也会被拒绝
111
+ - 非交互和 dry-run 缺 selector 会被拒绝;空 `--params` 也会被拒绝
113
112
  - 写入采用 read-modify-write:默认只更新 `extend.resources`,保留 `loadScriptMode` 和其他扩展字段
114
113
  - 只有显式传 `--load-mode` 才修改加载方式
115
114
  - 默认 `patch`;使用 `replace` 时仍会阻止无意删除已有 JS
@@ -120,7 +119,7 @@ rabetbase menu asset-update --all --params '{"jsUrl":"https://cdn.example.com/ap
120
119
  ## 常见错误
121
120
 
122
121
  - 跳过 `--dry-run` 直接写入。
123
- - `--yes` 裸跑、缺 selector 或传空 `--params`。
122
+ - selector 或传空 `--params`。
124
123
  - 需要单菜单更新却使用 `--all`。
125
124
  - 只想换 CSS 却显式使用 `replace`,导致已有 JS 被删除风险。
126
125
  - dry-run 已出现删除 JS warning,仍未取得用户明确确认就继续执行。
@@ -2,7 +2,7 @@
2
2
 
3
3
  按精确 ID 原地更新一个既有 `iframe` 或 `link` 叶子菜单的 URL。只修改 URL,不删除重建菜单。
4
4
 
5
- > **风险等级:high-risk-write** — 会改变线上菜单实际打开地址;必须先 dry-run,正式执行显式传 `--yes`。
5
+ > **风险等级:write** — 会改变线上菜单实际打开地址;建议先 dry-run,正式执行复用相同参数并移除 `--dry-run`。
6
6
 
7
7
  ## 命令
8
8
 
@@ -20,7 +20,6 @@ rabetbase menu external-link-update \
20
20
  --url "https://admin.example.com/new-page?hideShell=true" \
21
21
  --expect-url "https://admin.example.com/old-page?hideShell=true" \
22
22
  --expect-parent-id "<folder-id|root>" \
23
- --yes \
24
23
  --format compress
25
24
  ```
26
25
 
@@ -34,7 +33,6 @@ rabetbase menu external-link-update \
34
33
  | `--expect-parent-id <id\|root>` | string | 是 | — | 始终断言当前父级 |
35
34
  | `--appcode <code>` | string | 否 | 配置解析 | 显式指定 App Code |
36
35
  | `--dry-run` | boolean | 否 | `false` | 输出精确 URL patch,不写入 |
37
- | `--yes` | boolean | 正式执行必填 | — | 明确确认高风险写入 |
38
36
 
39
37
  ## 目标边界
40
38
 
@@ -2,13 +2,13 @@
2
2
 
3
3
  提交一个异步任务:新建根级 folder,并将一组精确的非 folder 叶子菜单放入其中。命令返回重新分组任务的 `taskId/status`。
4
4
 
5
- > **风险等级:high-risk-write** — 必须先 dry-run,正式执行必须显式 `--yes`。
5
+ > **风险等级:write** — 建议先 dry-run,正式执行复用相同参数并移除 `--dry-run`。
6
6
 
7
7
  ## 命令
8
8
 
9
9
  ```bash
10
10
  rabetbase menu regroup-start --label "业务管理" --menu-ids "<menu-id-1>,<menu-id-2>" --dry-run --format compress
11
- rabetbase menu regroup-start --label "业务管理" --menu-ids "<menu-id-1>,<menu-id-2>" --yes --format compress
11
+ rabetbase menu regroup-start --label "业务管理" --menu-ids "<menu-id-1>,<menu-id-2>" --format compress
12
12
  rabetbase task status --task-id "<task-id>" --format compress
13
13
  ```
14
14
 
@@ -19,7 +19,6 @@ rabetbase task status --task-id "<task-id>" --format compress
19
19
  | `--label <label>` | string | 是 | 新建根 folder 名称;不能与现有根 folder 同名 |
20
20
  | `--menu-ids <ids>` | string | 是 | 逗号分隔的精确叶子菜单 ID,最多 100 个 |
21
21
  | `--dry-run` | boolean | 预览时 | 返回当前快照、before/after 和请求体,不写入 |
22
- | `--yes` | boolean | 正式执行时 | 显式授权重新分组 |
23
22
 
24
23
  ## 状态流
25
24
 
@@ -1,6 +1,6 @@
1
1
  # rabetbase notification config-list
2
2
 
3
- 只读查询当前应用的应用级通知渠道配置,主要用于获取 BFF 消息通知扩展需要的 `configCode`。
3
+ 只读查询当前应用的应用级通知渠道配置,主要用于获取 BFF 消息通知扩展需要的应用级 `configCode`。
4
4
 
5
5
  ## 命令
6
6
 
@@ -69,7 +69,7 @@ await context.client.extension.execute("notification", "send", {
69
69
  边界:
70
70
 
71
71
  * `configCode` 是应用级通知配置编码。
72
- * dataset 级通知通道的 `channelCode` 不能替代 `configCode`。
72
+ * 数据集级通知通道的 `channelCode` 不能替代应用级 `configCode`;创建、更新和删除应用级配置见 [`rabetbase-notification-config-mutations.md`](rabetbase-notification-config-mutations.md)。
73
73
  * 没有查询结果时,不要编造配置编码。
74
74
  * 多个候选无法判断时,向用户确认,不要默认取第一条。
75
75
  * 该命令不会发送通知,也不会修改平台配置。
@@ -0,0 +1,56 @@
1
+ # rabetbase notification config-create / config-update / config-delete
2
+
3
+ 管理当前应用的应用级通知配置。它们使用应用级 `configCode`;数据集级通知通道的 `channelCode` 不能作为这些命令的输入,也不能替代 `configCode`。
4
+
5
+ ## 命令与风险
6
+
7
+ ```bash
8
+ rabetbase notification config-create --file notification.json --dry-run --format compress
9
+ rabetbase notification config-create --file notification.json --format compress
10
+
11
+ rabetbase notification config-update --id 88 --from-env NOTIFICATION_CONFIG_JSON --dry-run --format compress
12
+ rabetbase notification config-update --id 88 --from-env NOTIFICATION_CONFIG_JSON --yes --format compress
13
+
14
+ rabetbase notification config-delete --id 88 --dry-run --format compress
15
+ rabetbase notification config-delete --id 88 --yes --format compress
16
+ ```
17
+
18
+ * `config-create` 是 `write`:支持 `--dry-run`,预览后可执行。
19
+ * `config-update --id <id>` 和 `config-delete --id <id>` 是 `high-risk-write`:强烈建议先运行 `--dry-run`,正式执行必须显式添加 `--yes`。
20
+ * 删除应用级配置可能使引用它的数据集级通道不可用;CLI 不会验证引用关系。先确认影响范围再删除。
21
+
22
+ ## 安全 JSON 输入
23
+
24
+ create 和 update 必须在下列来源中恰好一个:`--file <path>`、`--stdin` 或 `--from-env <NAME>`。不得同时使用多个来源,也不要把敏感 JSON 放进命令行参数。
25
+
26
+ 输入 JSON 是 CLI 文档,不是服务端原始 DTO。允许的顶层字段只有:
27
+
28
+ ```json
29
+ {
30
+ "configName": "Technical alerts",
31
+ "channelType": "FEISHU",
32
+ "endpointUrl": "<sensitive endpoint>",
33
+ "channelConfig": { "credential": "<sensitive value>" },
34
+ "description": "Technical alert bot",
35
+ "connectTimeout": 5000,
36
+ "readTimeout": 10000
37
+ }
38
+ ```
39
+
40
+ `channelConfig` 必须是 JSON 对象,CLI 会将其序列化为服务端所需格式。`config-create` 必须提供非空 `configName` 和 `channelType`;`config-update` 至少提供一个允许字段。支持类型:`EMAIL`、`FEISHU`、`DINGTALK`、`WECOM`、`WEBHOOK`。
41
+
42
+ 禁止提交 `id`、`appCode`、`configCode`、`channelCode` 或任何未知顶层字段。服务端负责渠道专有的 endpoint 与凭据规则。显式 `null` 可清空可选字符串;`connectTimeout` 或 `readTimeout` 为 `null` 会恢复服务端默认超时:`connectTimeout` 为 `5000`、`readTimeout` 为 `10000`。
43
+
44
+ ## 输出与结果确认
45
+
46
+ 预览和执行均返回 `operation`、`selector`、`before`、`after`、`dryRun`、`backend`、`warnings`、`verification`。输出不包含真实 `endpointUrl`、webhook token、SMTP 凭据、`channelConfig`、环境变量值、stdin 内容或文件内容;已设置的敏感字段显示为 `<redacted>`。
47
+
48
+ update 会读取精确 ID 并合并补丁,省略的字段及服务端已脱敏的敏感字段都会保留。create 和 update 按精确 ID 回读确认;delete 按删除前的 `channelType` 列表确认 ID 不存在。
49
+
50
+ 请求结果未知、网络中断或回读无法证明结果时,不得自动重提。只执行只读查询:
51
+
52
+ ```bash
53
+ rabetbase notification config-list --appcode app-xxxxx --type FEISHU --format compress
54
+ ```
55
+
56
+ 根据返回的 `configName`、`description`、`configCode` 与操作前记录人工确认后再决定下一步。
@@ -21,6 +21,6 @@ rabetbase page react-detail --id <pageId> --format compress
21
21
 
22
22
  - `pageUrl`:查看最新保存内容的页面地址,包含尚未发布的修改
23
23
  - `runtimePageUrl`:查看已发布内容的页面地址,仅在有已发布内容时返回;格式为 `https://<appCode>.app.lovrabet.com/<pageCode>`(线上)或 `https://<appCode>.daily.lovrabet.com/<pageCode>`(日常)
24
- - `editPageUrl`:打开页面编辑器的地址,可继续修改页面;格式为 `https://<env>.lovrabet.com/web-app/app/<appCode>/ide/<pageId>`(线上为 `app.lovrabet.com`,日常为 `daily.lovrabet.com`)
24
+ - `editPageUrl`:打开页面编辑器的地址,可继续修改页面;线上为 `https://app.lovrabet.com/app/<appCode>/ide/<pageId>`,日常为 `https://daily.lovrabet.com/web-app/app/<appCode>/ide/<pageId>`
25
25
 
26
26
  `data.codeContent` 是当前完整页面文件,可在本地完成新增、修改或删除后,作为 `page react-update --page-content <json>` 的完整页面内容提交。
@@ -20,4 +20,4 @@ rabetbase page react-list --appcode <appCode> --format json
20
20
 
21
21
  - `label`:页面名称
22
22
  - `pageUrl`:查看最新保存内容的页面地址,包含尚未发布的修改;日常为 `https://daily.lovrabet.com/web-app/app/<appCode>/pages/<path>`,线上为 `https://app.lovrabet.com/app/<appCode>/pages/<path>`
23
- - `editPageUrl`:打开页面编辑器的地址,可继续修改页面;线上域名为 `app.lovrabet.com`,日常域名为 `daily.lovrabet.com`
23
+ - `editPageUrl`:打开页面编辑器的地址,可继续修改页面;线上为 `https://app.lovrabet.com/app/<appCode>/ide/<pageId>`,日常为 `https://daily.lovrabet.com/web-app/app/<appCode>/ide/<pageId>`
@@ -4,7 +4,7 @@
4
4
 
5
5
  ```bash
6
6
  rabetbase page react-publish --id <pageId> --dry-run --format compress
7
- rabetbase page react-publish --id <pageId> --remark "发布说明" --yes
7
+ rabetbase page react-publish --id <pageId> --remark "发布说明"
8
8
  ```
9
9
 
10
10
  ## 参数
@@ -19,5 +19,5 @@ rabetbase page react-publish --id <pageId> --remark "发布说明" --yes
19
19
  1. 先使用 `page react-detail` 检查 `status` 和页面版本
20
20
  2. `status` 为 `FORMAL` 时表示当前内容已经发布,跳过发布,继续查看已发布页面或后续流程
21
21
  3. `status` 不是 `FORMAL` 时,使用 `--dry-run` 确认目标页面和发布备注
22
- 4. 用户明确确认后,使用相同参数加 `--yes` 执行发布
22
+ 4. 审阅预览后,使用相同参数移除 `--dry-run` 执行发布
23
23
  5. 命令发布后回读确认 `data.after.status` 为 `FORMAL`;`data.runtimePageUrl` 查看最近一次已发布内容,`data.pageUrl` 查看最新保存内容(包含尚未发布的修改),`data.editPageUrl` 用于打开页面编辑器。
@@ -38,6 +38,9 @@ rabetbase project create my-project --appcode <code> --env production
38
38
 
39
39
  - `--name` 和位置参数二选一,`--name` 优先
40
40
  - 非交互模式下缺少项目名会报错
41
+ - 项目名只接受字母、数字、`-`、`_`,不能传绝对路径、`../`、子目录路径或 Windows 保留名称
42
+ - 交互与非交互模式使用同一创建流程,都会安装依赖、格式化代码并写入项目配置
43
+ - 项目模板从 CDN 下载并校验 SHA-256;CDN 不可用、模板不兼容或校验失败时命令停止,修复后重试
41
44
  - 新项目中的 `.rabetbase.json` **只继承**全局中的少量偏好(如 `cookie`、`accessKey`、`locale`、`format`、`riskLevel`),**不会**把全局的 `apps` / `defaultApp` 复制进新项目
42
45
 
43
46
  ## 参考
@@ -2,7 +2,7 @@
2
2
 
3
3
  执行 `package.json` 中定义的脚本。
4
4
 
5
- > **风险等级:high-risk-write** — 任意 package script 都可能修改本地文件、调用远端服务或执行发布动作。独立 CLI 需要人工提升顶层 `riskLevel`,正式执行还需交互确认或显式传 `--yes`;嵌入式 Rabetbase 工具暂不开放 `run`。
5
+ > **风险等级:write** — 任意 package script 都可能修改本地文件、调用远端服务或执行发布动作。执行前必须先审阅 `package.json` 中对应脚本;嵌入式 Rabetbase 工具暂不开放 `run`。
6
6
 
7
7
  ## 命令
8
8
 
@@ -33,7 +33,7 @@ rabetbase sql create --name getUserMapper --db-id 10001 --mode mybatisXml --form
33
33
  ## 提示
34
34
 
35
35
  - 团队长期维护 SQL 时,用 `sql create` 建立本地同步资产
36
- - 生成后通常继续执行:编辑本地文件 → `sql validate --file ...` → `sql status` → `sql push --sqlcode ... --dry-run` → `sql push --sqlcode ... --yes`
36
+ - 生成后通常继续执行:编辑本地文件 → `sql validate --file ...` → `sql status` → `sql push --sqlcode ... --dry-run` → `sql push --sqlcode ...`
37
37
 
38
38
  ## 参考
39
39
 
@@ -2,15 +2,15 @@
2
2
 
3
3
  将本地同步目录中的 SQL 文件上传到远端,并刷新 `.rabetbase/sql.lock.json`。
4
4
 
5
- > **风险等级:high-risk-write** — 建议先 `--dry-run` 预览;正式执行需 `--yes` 或交互确认。
5
+ > **风险等级:write** — 建议先 `--dry-run` 预览。
6
6
 
7
7
  ## 命令
8
8
 
9
9
  ```bash
10
10
  rabetbase sql push --format json
11
11
  rabetbase sql push --sqlcode 2305f915-dd48cd4c --dry-run --format json
12
- rabetbase sql push --sqlcode 2305f915-dd48cd4c --yes --format json
13
- rabetbase sql push --sqlcode 2305f915-dd48cd4c --force --yes --format json
12
+ rabetbase sql push --sqlcode 2305f915-dd48cd4c --format json
13
+ rabetbase sql push --sqlcode 2305f915-dd48cd4c --force --format json
14
14
  ```
15
15
 
16
16
  ## 参数
@@ -20,7 +20,6 @@ rabetbase sql push --sqlcode 2305f915-dd48cd4c --force --yes --format json
20
20
  | `--sqlcode <code>` | string | 否 | — | 仅推指定 SQL;不传则扫描当前应用同步目录下的全部 SQL |
21
21
  | `--force` | boolean | 否 | — | 即使本地 hash 与 lock 一致也强制推送 |
22
22
  | `--dry-run` | boolean | 否 | — | 仅预览会推哪些 SQL |
23
- | `--yes` | boolean | 否 | — | 跳过高风险确认 |
24
23
  | `--format <fmt>` | string | 否 | `compress` | 输出格式 |
25
24
 
26
25
  ## 行为说明
@@ -18,7 +18,6 @@ rabetbase user-account dingding-sandbox-bind \
18
18
  ```bash
19
19
  rabetbase user-account dingding-sandbox-bind \
20
20
  --ding-talk-user-id <id> \
21
- --yes \
22
21
  --format compress
23
22
  ```
24
23
 
@@ -2,8 +2,8 @@
2
2
  "schemaVersion": 1,
3
3
  "name": "rabetbase",
4
4
  "packageName": "@lovrabet/rabetbase-cli",
5
- "packageVersion": "2.4.3",
6
- "skillVersion": "2.4.3",
5
+ "packageVersion": "2.4.4-beta.1",
6
+ "skillVersion": "2.4.4-beta.1",
7
7
  "files": [
8
8
  "SKILL.md",
9
9
  "guides/backend-function.md",
@@ -24,10 +24,8 @@
24
24
  "guides/typescript-sdk.md",
25
25
  "knowledge/page-schema/LrSmartCreate.md",
26
26
  "knowledge/page-schema/LrSmartDetail.md",
27
- "knowledge/page-schema/LrSmartEcharts.md",
28
27
  "knowledge/page-schema/LrSmartFilter.md",
29
28
  "knowledge/page-schema/LrSmartJsx.md",
30
- "knowledge/page-schema/LrSmartStatistic.md",
31
29
  "knowledge/page-schema/LrSmartTable.md",
32
30
  "knowledge/page-schema/YtPage.md",
33
31
  "knowledge/page-schema/dataset-relations.md",
@@ -72,6 +70,7 @@
72
70
  "references/rabetbase-db-create.md",
73
71
  "references/rabetbase-db-delete.md",
74
72
  "references/rabetbase-db-detail.md",
73
+ "references/rabetbase-db-diff-refresh.md",
75
74
  "references/rabetbase-db-diff.md",
76
75
  "references/rabetbase-db-list.md",
77
76
  "references/rabetbase-db-tables.md",
@@ -94,6 +93,7 @@
94
93
  "references/rabetbase-menu-rename.md",
95
94
  "references/rabetbase-menu-sync.md",
96
95
  "references/rabetbase-notification-config-list.md",
96
+ "references/rabetbase-notification-config-mutations.md",
97
97
  "references/rabetbase-ocr.md",
98
98
  "references/rabetbase-page-generate-start.md",
99
99
  "references/rabetbase-page-generate-status.md",
@@ -133,5 +133,5 @@
133
133
  "references/rabetbase-user-account.md",
134
134
  "references/rabetbase-workspace.md"
135
135
  ],
136
- "digest": "9e57a32f5a9e30bb30673391d04d0c4edee23256e99dea09385a44c6ebb6edd6"
136
+ "digest": "6169fd253d752d93e8f6528a2a2068e146360bbf8916bfe0434e6a8ee67b049a"
137
137
  }
@@ -20,7 +20,7 @@ templates/
20
20
 
21
21
  ### 远程模板同步
22
22
 
23
- `projects/sub-app-react-demo/` 目录是从模板真源仓同步来的快照:
23
+ `projects/sub-app-react-demo/` 目录是从模板真源仓同步来的 CDN 构建源:
24
24
  **仓库地址**: https://github.com/lovrabet/sub-app-react-demo
25
25
 
26
26
  #### 开发者:同步模板
@@ -31,9 +31,20 @@ templates/
31
31
  npm run sync-template
32
32
  ```
33
33
 
34
+ 模板同步完成后,更新模板自身的 `package.json#version`,再生成待发布的 CDN 资产:
35
+
36
+ ```bash
37
+ npm run sync:cdn
38
+ ```
39
+
40
+ 该命令会在 `dist/rabetbase-cli/templates/projects/` 下生成
41
+ `sub-app-react-demo.zip`,并把版本、文件名、大小和 SHA-256 写入现有
42
+ `dist/rabetbase-cli/config/index.json`。ZIP 使用固定地址,每次发布直接覆盖。
43
+
34
44
  ### 模板结构
35
45
 
36
46
  项目模板应维护以下结构:
47
+
37
48
  - 标准的 React + Vite 设置
38
49
  - Ant Design 集成
39
50
  - icestark 微前端配置
@@ -51,7 +62,8 @@ npm run sync-template
51
62
  ## 注意事项
52
63
 
53
64
  - `templates/projects/sub-app-react-demo/` 是项目模板快照,不是独立 Git 仓
54
- - `rabetbase project create` 会复制项目模板,并更新 `package.json` 与 `.rabetbase.json`
65
+ - `rabetbase project create` CDN 下载 ZIP,然后更新 `package.json` 与 `.rabetbase.json`;此仓库模板不进入 npm 发布包
66
+ - 模板文件名必须兼容 Windows、macOS 和 Linux;禁止符号链接、大小写冲突路径和 Windows 保留名称
55
67
  - 有 AppCode 时,CLI 会重新生成 `src/api/api.ts` 和 `src/api/client.ts`
56
68
  - 项目模板中不要保留真实 AppCode、真实数据集模型、`.git`、`node_modules`、`dist` 或个人配置
57
69
  - CLI 使用 `TemplateReplacer` 工具处理 `.tpl` 类模板
@@ -1,9 +0,0 @@
1
- /**
2
- * 非交互模式的项目创建逻辑
3
- *
4
- * 用于 CI/CD 环境或没有 TTY 的场景
5
- */
6
- /**
7
- * 非交互模式创建项目
8
- */
9
- export declare function createProjectNonInteractive(projectName: string, env?: string, appCode?: string, cookie?: string): Promise<void>;
@@ -1 +0,0 @@
1
- (function(_0x588482,_0x5d07cc){const _0x4970b3=a163_0x372d,_0x3fa07d=_0x588482();while(!![]){try{const _0x480b38=parseInt(_0x4970b3(0x114))/0x1+-parseInt(_0x4970b3(0x10f))/0x2*(parseInt(_0x4970b3(0x110))/0x3)+parseInt(_0x4970b3(0x102))/0x4+-parseInt(_0x4970b3(0x112))/0x5+-parseInt(_0x4970b3(0x120))/0x6*(-parseInt(_0x4970b3(0xfe))/0x7)+-parseInt(_0x4970b3(0x122))/0x8+-parseInt(_0x4970b3(0x105))/0x9*(-parseInt(_0x4970b3(0x128))/0xa);if(_0x480b38===_0x5d07cc)break;else _0x3fa07d['push'](_0x3fa07d['shift']());}catch(_0x57913d){_0x3fa07d['push'](_0x3fa07d['shift']());}}}(a163_0x269d,0x4775f));import a163_0x66cbc7 from'path';import a163_0x2c993f from'fs/promises';import{existsSync}from'fs';import{CLI_BIN_NAME}from'../../../constant/cli.js';import{DEFAULT_API_DIR}from'../../../constant/paths.js';import{exec,execSync}from'child_process';import{copyDirectory}from'../../../utils/copy-directory.js';import{promisify}from'util';function a163_0x372d(_0x7c6a28,_0x431ab3){_0x7c6a28=_0x7c6a28-0xfb;const _0x269dcc=a163_0x269d();let _0x372d5c=_0x269dcc[_0x7c6a28];return _0x372d5c;}import{assertCliVersionSupported,checkCliVersion,printCliUpgradeWarning}from'../../../utils/cli-version-check.js';import{writeConfigFile,NEW_CONFIG_NAME}from'../../../context.js';import{readConfig}from'../../../utils/config.js';import{getCliVersion}from'../../../utils/version.js';import{CliErrors}from'../../../errors.js';import{fetchModelList}from'../../../core/api-client.js';import{generateApiFile}from'../../../api/generate-api-file.js';import{initEnv}from'../../../constant/env.js';import{getSubAppReactDemoTemplateDir}from'../../../commands/project/create/project-template-path.js';import{PROJECT_CREATE_INHERITABLE_KEYS,buildCanonicalProjectConfig}from'../../../config/schema.js';function a163_0x269d(){const _0x70097e=['length','301578VFiSPD','Cannot\x20create\x20project\x20in\x20current\x20directory.','3920704nUvntQ','writeFile','Project\x20directory\x20\x22','\x22\x20already\x20exists.','utf-8','modelCount','3466170nORPcM','ignore','\x20\x20rabetbase\x20run\x20start\x0a','validation','\x20api\x20pull`\x20manually\x20later.','bun\x20run\x20format','join','A\x20project\x20created\x20with\x20Lovrabet\x20CLI','belowMinimum','Check\x20directory\x20permissions.','\x20\x20Installing\x20dependencies...','35YsBOwN','description','npm','Project\x20name\x20cannot\x20be\x20empty.','1108180kfptyb','...','\x20\x20√\x20Code\x20formatted','9nOeRJO','resolve','\x20\x20√\x20Configuration\x20file\x20created','chdir','dirname','trim','\x0a\x20\x20cd\x20','production','*\x20Creating\x20project\x20','constants','12142FBOMje','3VjAddd','\x20\x20√\x20Pulled\x20','1189010WVdIrR','Project\x20name\x20is\x20too\x20long,\x20maximum\x20100\x20characters.','151687aQlESM','env','\x20\x20√\x20Project\x20template\x20created','string','cwd','bun\x20--version','Project\x20name\x20contains\x20invalid\x20characters.','name','log','Not\x20allowed:\x20<\x20>\x20:\x20\x22\x20|\x20?\x20*\x20and\x20control\x20characters','\x20model(s)'];a163_0x269d=function(){return _0x70097e;};return a163_0x269d();}const execAsync=promisify(exec);export async function createProjectNonInteractive(_0x575354,_0x201454,_0x3c9511,_0x54659b){const _0x4c4fef=a163_0x372d,_0xcda2b4=await checkCliVersion();(_0xcda2b4['needsUpgrade']||_0xcda2b4[_0x4c4fef(0xfb)])&&(printCliUpgradeWarning(_0xcda2b4),assertCliVersionSupported(_0xcda2b4));if(!_0x575354||_0x575354[_0x4c4fef(0x10a)]()==='')throw CliErrors[_0x4c4fef(0x12b)](_0x4c4fef(0x101));const _0x488ac0=/[<>:"|?*\x00-\x1f\x7f]/;if(_0x488ac0['test'](_0x575354))throw CliErrors[_0x4c4fef(0x12b)](_0x4c4fef(0x11a),_0x4c4fef(0x11d));if(_0x575354['length']>0x64)throw CliErrors[_0x4c4fef(0x12b)](_0x4c4fef(0x113));const _0x22b9ff=a163_0x66cbc7[_0x4c4fef(0x106)](process[_0x4c4fef(0x118)](),_0x575354);if(existsSync(_0x22b9ff))throw CliErrors[_0x4c4fef(0x12b)](_0x4c4fef(0x124)+_0x575354+_0x4c4fef(0x125),'Use\x20a\x20different\x20project\x20name.');try{const _0x11d25a=a163_0x66cbc7[_0x4c4fef(0x109)](_0x22b9ff);await a163_0x2c993f['access'](_0x11d25a,a163_0x2c993f[_0x4c4fef(0x10e)]['W_OK']);}catch{throw CliErrors[_0x4c4fef(0x12b)](_0x4c4fef(0x121),_0x4c4fef(0xfc));}try{console[_0x4c4fef(0x11c)](_0x4c4fef(0x10d)+_0x575354+_0x4c4fef(0x103));const _0x5bbcc8=getSubAppReactDemoTemplateDir();await copyDirectory(_0x5bbcc8,_0x22b9ff),console[_0x4c4fef(0x11c)](_0x4c4fef(0x116)),await updatePackageJsonName(_0x575354),console[_0x4c4fef(0x11c)]('\x20\x20√\x20package.json\x20updated'),console[_0x4c4fef(0x11c)](_0x4c4fef(0xfd)),console[_0x4c4fef(0x11c)]('\x20\x20√\x20Dependency\x20install\x20skipped\x20(non-interactive)'),await formatCode(_0x22b9ff),console[_0x4c4fef(0x11c)](_0x4c4fef(0x104)),await configureProject(_0x575354,_0x3c9511,_0x201454),console[_0x4c4fef(0x11c)](_0x4c4fef(0x107)),_0x3c9511&&await pullApiConfig(_0x22b9ff,_0x3c9511,_0x201454,_0x54659b),console[_0x4c4fef(0x11c)]('\x0a√\x20Project\x20'+_0x575354+'\x20created\x20successfully!'),console[_0x4c4fef(0x11c)](_0x4c4fef(0x10b)+_0x575354),console[_0x4c4fef(0x11c)](_0x4c4fef(0x12a));}catch(_0x76291c){try{existsSync(_0x22b9ff)&&await a163_0x2c993f['rm'](_0x22b9ff,{'recursive':!![],'force':!![]});}catch{}throw _0x76291c;}}async function updatePackageJsonName(_0x5d9981){const _0x573386=a163_0x372d,_0x1d4627=a163_0x66cbc7[_0x573386(0x106)](process[_0x573386(0x118)](),_0x5d9981),_0x5b075f=a163_0x66cbc7[_0x573386(0x12e)](_0x1d4627,'package.json'),_0x27fc4e=await a163_0x2c993f['readFile'](_0x5b075f,_0x573386(0x126)),_0x20624d=JSON['parse'](_0x27fc4e);_0x20624d[_0x573386(0x11b)]=_0x5d9981,_0x20624d[_0x573386(0xff)]=_0x573386(0x12f),await a163_0x2c993f[_0x573386(0x123)](_0x5b075f,JSON['stringify'](_0x20624d,null,0x2)+'\x0a');}function detectPackageManager(){const _0x4d2f1a=a163_0x372d;try{return execSync(_0x4d2f1a(0x119),{'stdio':_0x4d2f1a(0x129)}),'bun';}catch{return _0x4d2f1a(0x100);}}async function formatCode(_0x1ef99e){const _0xdf5901=a163_0x372d;try{await execAsync(_0xdf5901(0x12d),{'cwd':_0x1ef99e});}catch{}}async function configureProject(_0x44d301,_0x3fee08,_0x3b39c1){const _0x4960d7=a163_0x372d,_0x1fb1c3=a163_0x66cbc7['resolve'](process[_0x4960d7(0x118)](),_0x44d301),_0x7b1daf=a163_0x66cbc7[_0x4960d7(0x12e)](_0x1fb1c3,NEW_CONFIG_NAME),_0x503603=readConfig(),_0xa51a8b=typeof _0x503603[_0x4960d7(0x115)]===_0x4960d7(0x117)?_0x503603[_0x4960d7(0x115)]:undefined,_0x18eee1={};for(const _0x582dcb of PROJECT_CREATE_INHERITABLE_KEYS){if(_0x503603[_0x582dcb]!=null)_0x18eee1[_0x582dcb]=_0x503603[_0x582dcb];}const _0x24372b=buildCanonicalProjectConfig(_0x18eee1,{'appCodes':_0x3fee08?[_0x3fee08]:[],'env':_0x3b39c1||_0xa51a8b||_0x4960d7(0x10c),'metadata':{'createdAt':new Date()['toLocaleString'](),'version':getCliVersion()}});writeConfigFile(_0x7b1daf,_0x24372b);}async function pullApiConfig(_0x4cb708,_0x4dff74,_0x3754e4,_0x267dcc){const _0x371d85=a163_0x372d,_0x4dbca7=process['cwd']();try{process[_0x371d85(0x108)](_0x4cb708);const _0x180528=_0x3754e4||'production';initEnv(_0x180528),console[_0x371d85(0x11c)]('\x20\x20Pulling\x20API\x20configuration...');const {configArray:_0x3e1c0b}=await fetchModelList(_0x4dff74,_0x267dcc||''),_0x53ca10=await generateApiFile(_0x3e1c0b,'',_0x4dff74,!![],_0x180528,DEFAULT_API_DIR);console[_0x371d85(0x11c)](_0x371d85(0x111)+_0x3e1c0b[_0x371d85(0x11f)]+'\x20dataset(s),\x20generated\x20'+_0x53ca10[_0x371d85(0x127)]+_0x371d85(0x11e));}catch(_0x198663){console[_0x371d85(0x11c)]('\x20\x20!\x20API\x20pull\x20failed,\x20run\x20`'+CLI_BIN_NAME+_0x371d85(0x12c));}finally{process[_0x371d85(0x108)](_0x4dbca7);}}
@@ -1 +0,0 @@
1
- export declare function copyDirectory(src: string, dest: string): Promise<void>;
@@ -1 +0,0 @@
1
- (function(_0x39b4f5,_0x17520d){const _0x57a78f=a278_0x3ee2,_0x1bd15e=_0x39b4f5();while(!![]){try{const _0xef5286=-parseInt(_0x57a78f(0xa9))/0x1+parseInt(_0x57a78f(0xac))/0x2*(-parseInt(_0x57a78f(0xa8))/0x3)+-parseInt(_0x57a78f(0xab))/0x4*(-parseInt(_0x57a78f(0xae))/0x5)+-parseInt(_0x57a78f(0xa1))/0x6+-parseInt(_0x57a78f(0xa3))/0x7+-parseInt(_0x57a78f(0xb1))/0x8*(parseInt(_0x57a78f(0xa5))/0x9)+parseInt(_0x57a78f(0xaf))/0xa;if(_0xef5286===_0x17520d)break;else _0x1bd15e['push'](_0x1bd15e['shift']());}catch(_0x26f767){_0x1bd15e['push'](_0x1bd15e['shift']());}}}(a278_0x4510,0x7458f));function a278_0x3ee2(_0x5b2e7f,_0x36c115){_0x5b2e7f=_0x5b2e7f-0xa1;const _0x451080=a278_0x4510();let _0x3ee2cf=_0x451080[_0x5b2e7f];return _0x3ee2cf;}function a278_0x4510(){const _0x2c5115=['isDirectory','复制目录时出错:','1491aPHNga','855461ahnwus','mkdirSync','4QElJWi','222LqGFQJ','readdirSync','2310460YRMexs','22619560bctIjN','join','16xRYKiL','3828054KiQxao','name','2349102exmRsp','error','1634697vnMrLX'];a278_0x4510=function(){return _0x2c5115;};return a278_0x4510();}import a278_0x4bfe95 from'node:path';import a278_0x2eaa5a from'node:fs';export async function copyDirectory(_0x1cebe5,_0xc9b0b1){const _0x329f4b=a278_0x3ee2;try{const _0x1b9645=a278_0x2eaa5a[_0x329f4b(0xad)](_0x1cebe5,{'withFileTypes':!![]});a278_0x2eaa5a[_0x329f4b(0xaa)](_0xc9b0b1,{'recursive':!![]});for(const _0x37ee03 of _0x1b9645){const _0x4b23fe=a278_0x4bfe95['join'](_0x1cebe5,_0x37ee03[_0x329f4b(0xa2)]),_0x4e64ae=a278_0x4bfe95[_0x329f4b(0xb0)](_0xc9b0b1,_0x37ee03[_0x329f4b(0xa2)]);_0x37ee03[_0x329f4b(0xa6)]()?await copyDirectory(_0x4b23fe,_0x4e64ae):a278_0x2eaa5a['copyFileSync'](_0x4b23fe,_0x4e64ae);}}catch(_0x56ef22){console[_0x329f4b(0xa4)](_0x329f4b(0xa7),_0x56ef22);}}