@lovrabet/rabetbase-cli 2.3.16-beta.7 → 2.4.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 (435) hide show
  1. package/README.md +4 -10
  2. package/lib/api/api-doc.js +1 -1
  3. package/lib/api/fetch-model-list.js +1 -1
  4. package/lib/api/generate-api-file.js +1 -1
  5. package/lib/auth/auth-server-ui.js +1 -1
  6. package/lib/auth/auth-server.js +1 -1
  7. package/lib/auth/constant.js +1 -1
  8. package/lib/auth/get-cookie.js +1 -1
  9. package/lib/auth/get-session-user.js +1 -1
  10. package/lib/auth/is-session-valid.js +1 -1
  11. package/lib/auth/login-success-html.js +1 -1
  12. package/lib/auth/logout.js +1 -1
  13. package/lib/cli-flags.js +1 -1
  14. package/lib/cli.js +1 -1
  15. package/lib/commands/api/generate.js +1 -1
  16. package/lib/commands/api/index.js +1 -1
  17. package/lib/commands/api/list.js +1 -1
  18. package/lib/commands/api/pull.js +1 -1
  19. package/lib/commands/api/shared.js +1 -1
  20. package/lib/commands/app/index.js +1 -1
  21. package/lib/commands/app/list.js +1 -1
  22. package/lib/commands/app/members-list.js +1 -1
  23. package/lib/commands/app/remote-directory.js +1 -1
  24. package/lib/commands/app/shared.js +1 -1
  25. package/lib/commands/app-config/delete.js +1 -1
  26. package/lib/commands/app-config/get.js +1 -1
  27. package/lib/commands/app-config/index.js +1 -1
  28. package/lib/commands/app-config/list.js +1 -1
  29. package/lib/commands/app-config/set.js +1 -1
  30. package/lib/commands/app-config/shared.js +1 -1
  31. package/lib/commands/auth/index.js +1 -1
  32. package/lib/commands/bff/create.js +1 -1
  33. package/lib/commands/bff/delete.js +1 -1
  34. package/lib/commands/bff/detail.js +1 -1
  35. package/lib/commands/bff/index.js +1 -1
  36. package/lib/commands/bff/list.js +1 -1
  37. package/lib/commands/bff/pull.js +1 -1
  38. package/lib/commands/bff/push.js +1 -1
  39. package/lib/commands/bff/status.js +1 -1
  40. package/lib/commands/cli-skill/index.js +1 -1
  41. package/lib/commands/cli-update.js +1 -1
  42. package/lib/commands/codegen/index.js +1 -1
  43. package/lib/commands/codegen/sdk.js +1 -1
  44. package/lib/commands/codegen/sql.js +1 -1
  45. package/lib/commands/common/app-registry.js +1 -1
  46. package/lib/commands/common/app-selector.js +1 -1
  47. package/lib/commands/common/async-task.js +1 -1
  48. package/lib/commands/common/dry-run.js +1 -1
  49. package/lib/commands/common/flags.js +1 -1
  50. package/lib/commands/common/local-file.js +1 -1
  51. package/lib/commands/common/validate.js +1 -1
  52. package/lib/commands/config/get.js +1 -1
  53. package/lib/commands/config/index.js +1 -1
  54. package/lib/commands/config/list.js +1 -1
  55. package/lib/commands/config/set.js +1 -1
  56. package/lib/commands/config/shared.js +1 -1
  57. package/lib/commands/data/filter.js +1 -1
  58. package/lib/commands/data/getOne.js +1 -1
  59. package/lib/commands/data/index.js +1 -1
  60. package/lib/commands/data/shared.js +1 -1
  61. package/lib/commands/dataset/business-group-update.js +1 -1
  62. package/lib/commands/dataset/capability.js +1 -1
  63. package/lib/commands/dataset/delete.js +1 -1
  64. package/lib/commands/dataset/detail.js +1 -1
  65. package/lib/commands/dataset/extend-update.js +1 -1
  66. package/lib/commands/dataset/field-update.js +1 -1
  67. package/lib/commands/dataset/generate.js +1 -1
  68. package/lib/commands/dataset/index.js +1 -1
  69. package/lib/commands/dataset/list.js +1 -1
  70. package/lib/commands/dataset/operations.js +1 -1
  71. package/lib/commands/dataset/relation-audit.js +1 -1
  72. package/lib/commands/dataset/relation-create.js +1 -1
  73. package/lib/commands/dataset/relation-delete.js +1 -1
  74. package/lib/commands/dataset/relation-shared.js +1 -1
  75. package/lib/commands/dataset/relation-update.js +1 -1
  76. package/lib/commands/dataset/relations.js +1 -1
  77. package/lib/commands/dataset/rename.js +1 -1
  78. package/lib/commands/dataset/restore.js +1 -1
  79. package/lib/commands/db/analysis-batching.js +1 -1
  80. package/lib/commands/db/analyze-batch-plan.js +1 -1
  81. package/lib/commands/db/analyze-cancel.js +1 -1
  82. package/lib/commands/db/analyze-start.js +1 -1
  83. package/lib/commands/db/analyze-status.js +1 -1
  84. package/lib/commands/db/create.js +1 -1
  85. package/lib/commands/db/delete.js +1 -1
  86. package/lib/commands/db/detail.js +1 -1
  87. package/lib/commands/db/diff.js +1 -1
  88. package/lib/commands/db/index.js +1 -1
  89. package/lib/commands/db/list.js +1 -1
  90. package/lib/commands/db/shared.js +1 -1
  91. package/lib/commands/db/tables.js +1 -1
  92. package/lib/commands/db/test.js +1 -1
  93. package/lib/commands/db/update.js +1 -1
  94. package/lib/commands/doctor.js +1 -1
  95. package/lib/commands/file/index.js +1 -1
  96. package/lib/commands/init/index.js +1 -1
  97. package/lib/commands/issue/index.js +1 -1
  98. package/lib/commands/issue/nudge.js +1 -1
  99. package/lib/commands/issue/report.js +1 -1
  100. package/lib/commands/issue/shared.js +1 -1
  101. package/lib/commands/kb/create.js +1 -1
  102. package/lib/commands/kb/delete.js +1 -1
  103. package/lib/commands/kb/detail.js +1 -1
  104. package/lib/commands/kb/index.js +1 -1
  105. package/lib/commands/kb/list.js +1 -1
  106. package/lib/commands/kb/shared.js +1 -1
  107. package/lib/commands/kb/update.js +1 -1
  108. package/lib/commands/logs/index.js +1 -1
  109. package/lib/commands/menu/asset-update.js +1 -1
  110. package/lib/commands/menu/delete.js +1 -1
  111. package/lib/commands/menu/external-link-create.js +1 -1
  112. package/lib/commands/menu/external-link-update.js +1 -1
  113. package/lib/commands/menu/group-create.js +1 -1
  114. package/lib/commands/menu/group-update.js +1 -1
  115. package/lib/commands/menu/index.js +1 -1
  116. package/lib/commands/menu/list.js +1 -1
  117. package/lib/commands/menu/move.js +1 -1
  118. package/lib/commands/menu/regroup-start.js +1 -1
  119. package/lib/commands/menu/rename.js +1 -1
  120. package/lib/commands/menu/shared/compare-table.js +1 -1
  121. package/lib/commands/menu/shared/delete-plan.js +1 -1
  122. package/lib/commands/menu/shared/facts.js +1 -1
  123. package/lib/commands/menu/shared/index.js +1 -1
  124. package/lib/commands/menu/shared/inquirer.js +1 -1
  125. package/lib/commands/menu/shared/local-pages.js +1 -1
  126. package/lib/commands/menu/shared/logic.js +1 -1
  127. package/lib/commands/menu/shared/mutations.js +1 -1
  128. package/lib/commands/menu/shared/service.js +1 -1
  129. package/lib/commands/menu/shared/sync-core.js +1 -1
  130. package/lib/commands/menu/shared/update-core.js +1 -1
  131. package/lib/commands/menu/shared/valid-url.js +1 -1
  132. package/lib/commands/menu/sync.js +1 -1
  133. package/lib/commands/notification/config-list.js +1 -1
  134. package/lib/commands/notification/index.js +1 -1
  135. package/lib/commands/ocr/index.js +1 -1
  136. package/lib/commands/page/generate-start.js +1 -1
  137. package/lib/commands/page/generate-status.js +1 -1
  138. package/lib/commands/page/index.js +1 -1
  139. package/lib/commands/page/pull.js +1 -1
  140. package/lib/commands/page/push.js +1 -1
  141. package/lib/commands/page/react/create.d.ts +2 -0
  142. package/lib/commands/page/react/create.js +1 -0
  143. package/lib/commands/page/react/detail.d.ts +2 -0
  144. package/lib/commands/page/react/detail.js +1 -0
  145. package/lib/commands/page/react/list.d.ts +2 -0
  146. package/lib/commands/page/react/list.js +1 -0
  147. package/lib/commands/page/react/publish.d.ts +2 -0
  148. package/lib/commands/page/react/publish.js +1 -0
  149. package/lib/commands/page/react/shared.d.ts +78 -0
  150. package/lib/commands/page/react/shared.js +1 -0
  151. package/lib/commands/page/react/syntax.d.ts +18 -0
  152. package/lib/commands/page/react/syntax.js +1 -0
  153. package/lib/commands/page/react/template.d.ts +8 -0
  154. package/lib/commands/page/react/template.js +1 -0
  155. package/lib/commands/page/react/update.d.ts +2 -0
  156. package/lib/commands/page/react/update.js +1 -0
  157. package/lib/commands/page/relation-audit.js +1 -1
  158. package/lib/commands/page/restore.js +1 -1
  159. package/lib/commands/page/shared.d.ts +1 -0
  160. package/lib/commands/page/shared.js +1 -1
  161. package/lib/commands/page/standard-page-status.js +1 -1
  162. package/lib/commands/page/sync.js +1 -1
  163. package/lib/commands/permit/index.js +1 -1
  164. package/lib/commands/permit/page-get.js +1 -1
  165. package/lib/commands/permit/page-set.js +1 -1
  166. package/lib/commands/permit/role-apis-set.js +1 -1
  167. package/lib/commands/permit/role-menus-set.js +1 -1
  168. package/lib/commands/permit/role-menus.js +1 -1
  169. package/lib/commands/permit/shared.js +1 -1
  170. package/lib/commands/project/create/enhanced-guided-create.js +1 -1
  171. package/lib/commands/project/create/format-elapsed.js +1 -1
  172. package/lib/commands/project/create/main.js +1 -1
  173. package/lib/commands/project/create/non-interactive.js +1 -1
  174. package/lib/commands/project/create/project-template-path.js +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.js +1 -1
  181. package/lib/commands/role/create.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.js +1 -1
  187. package/lib/commands/role/update.js +1 -1
  188. package/lib/commands/role/user-add.js +1 -1
  189. package/lib/commands/role/user-remove.js +1 -1
  190. package/lib/commands/role/user-resolve.js +1 -1
  191. package/lib/commands/run/index.js +1 -1
  192. package/lib/commands/schema.js +1 -1
  193. package/lib/commands/sql/create.js +1 -1
  194. package/lib/commands/sql/delete.js +1 -1
  195. package/lib/commands/sql/detail.js +1 -1
  196. package/lib/commands/sql/exec.js +1 -1
  197. package/lib/commands/sql/index.js +1 -1
  198. package/lib/commands/sql/list.js +1 -1
  199. package/lib/commands/sql/pull.js +1 -1
  200. package/lib/commands/sql/push.js +1 -1
  201. package/lib/commands/sql/shared.js +1 -1
  202. package/lib/commands/sql/status.js +1 -1
  203. package/lib/commands/sql/validate.js +1 -1
  204. package/lib/commands/task/index.js +1 -1
  205. package/lib/commands/task/status.js +1 -1
  206. package/lib/commands/tenant/index.js +1 -1
  207. package/lib/commands/tenant/members-list.js +1 -1
  208. package/lib/commands/tenant/shared.js +1 -1
  209. package/lib/commands/user-account/dingding-sandbox-bind.d.ts +2 -0
  210. package/lib/commands/user-account/dingding-sandbox-bind.js +1 -0
  211. package/lib/commands/user-account/index.d.ts +2 -0
  212. package/lib/commands/user-account/index.js +1 -0
  213. package/lib/commands/workspace/add.js +1 -1
  214. package/lib/commands/workspace/index.js +1 -1
  215. package/lib/commands/workspace/remove.js +1 -1
  216. package/lib/config/schema.js +1 -1
  217. package/lib/constant/cdn.js +1 -1
  218. package/lib/constant/cli.js +1 -1
  219. package/lib/constant/defaults.js +1 -1
  220. package/lib/constant/domain.js +1 -1
  221. package/lib/constant/env.js +1 -1
  222. package/lib/constant/output.js +1 -1
  223. package/lib/constant/paths.js +1 -1
  224. package/lib/constant/risk.js +1 -1
  225. package/lib/context/app-resolver.js +1 -1
  226. package/lib/context/auth-resolver.js +1 -1
  227. package/lib/context/config-loader.js +1 -1
  228. package/lib/context.js +1 -1
  229. package/lib/core/alias-resolver.js +1 -1
  230. package/lib/core/api-client.d.ts +117 -0
  231. package/lib/core/api-client.js +1 -1
  232. package/lib/core/bff/config.js +1 -1
  233. package/lib/core/bff/file-system.js +1 -1
  234. package/lib/core/bff/hash.js +1 -1
  235. package/lib/core/bff/lock.js +1 -1
  236. package/lib/core/bff/utils.js +1 -1
  237. package/lib/core/db-resolver.js +1 -1
  238. package/lib/core/page/file-system.js +1 -1
  239. package/lib/core/page/hash.js +1 -1
  240. package/lib/core/page/lock.js +1 -1
  241. package/lib/core/sql-index-auditor.js +1 -1
  242. package/lib/core/sql-sync/config.js +1 -1
  243. package/lib/core/sql-sync/file-system.js +1 -1
  244. package/lib/core/sql-sync/hash.js +1 -1
  245. package/lib/core/sql-sync/lock.js +1 -1
  246. package/lib/core/sql-sync/utils.js +1 -1
  247. package/lib/core/sql-validator.js +1 -1
  248. package/lib/errors.js +1 -1
  249. package/lib/framework/build-all-flags.js +1 -1
  250. package/lib/framework/error-output.js +1 -1
  251. package/lib/framework/explicit-yes.js +1 -1
  252. package/lib/framework/flags.js +1 -1
  253. package/lib/framework/help.js +1 -1
  254. package/lib/framework/index.js +1 -1
  255. package/lib/framework/output.js +1 -1
  256. package/lib/framework/response.js +1 -1
  257. package/lib/framework/runner-alias.js +1 -1
  258. package/lib/framework/runner.js +1 -1
  259. package/lib/framework/schema-export.js +1 -1
  260. package/lib/framework/types.js +1 -1
  261. package/lib/generated/build-info.d.ts +4 -4
  262. package/lib/generated/build-info.js +1 -1
  263. package/lib/help.js +1 -1
  264. package/lib/postinstall.d.ts +3 -0
  265. package/lib/postinstall.js +1 -0
  266. package/lib/runtime/confirmation.js +1 -1
  267. package/lib/runtime/event.js +1 -1
  268. package/lib/runtime/index.js +1 -1
  269. package/lib/runtime/queue.js +1 -1
  270. package/lib/runtime/resolve.js +1 -1
  271. package/lib/skills/builtin-skill.d.ts +37 -0
  272. package/lib/skills/builtin-skill.js +1 -0
  273. package/lib/skills/main.js +1 -1
  274. package/lib/skills/npx-skills-add.d.ts +4 -2
  275. package/lib/skills/npx-skills-add.js +1 -1
  276. package/lib/skills/skill-presence.js +1 -1
  277. package/lib/telemetry/cli-command-trace.js +1 -1
  278. package/lib/telemetry/cli-help-trace.js +1 -1
  279. package/lib/telemetry/ensure-cli-otel-config.js +1 -1
  280. package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
  281. package/lib/telemetry/send-cli-trace-log.js +1 -1
  282. package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
  283. package/lib/utils/ai_config.js +1 -1
  284. package/lib/utils/apply-jq-filter.js +1 -1
  285. package/lib/utils/cdn-config.js +1 -1
  286. package/lib/utils/check-sdk-version.js +1 -1
  287. package/lib/utils/cli-version-check.js +1 -1
  288. package/lib/utils/cli-version-policy.js +1 -1
  289. package/lib/utils/config.js +1 -1
  290. package/lib/utils/copy-directory.js +1 -1
  291. package/lib/utils/entity-with-id.js +1 -1
  292. package/lib/utils/file-utils.js +1 -1
  293. package/lib/utils/guides-cdn.js +1 -1
  294. package/lib/utils/http-client.js +1 -1
  295. package/lib/utils/is-non-interactive.js +1 -1
  296. package/lib/utils/logger.js +1 -1
  297. package/lib/utils/params.js +1 -1
  298. package/lib/utils/platform.js +1 -1
  299. package/lib/utils/rules-cdn.js +1 -1
  300. package/lib/utils/sleep.js +1 -1
  301. package/lib/utils/template-replacer.js +1 -1
  302. package/lib/utils/update-notice.js +1 -1
  303. package/lib/utils/version.js +1 -1
  304. package/lib/utils/with-active-cookie.js +1 -1
  305. package/lib/utils/write-cli-side-channel.js +1 -1
  306. package/package.json +9 -3
  307. package/scripts/postinstall.mjs +24 -0
  308. package/skills/rabetbase/SKILL.md +493 -0
  309. package/skills/rabetbase/guides/backend-function.md +835 -0
  310. package/skills/rabetbase/guides/best-practices.md +137 -0
  311. package/skills/rabetbase/guides/bff-creation-workflow.md +148 -0
  312. package/skills/rabetbase/guides/conflict-detection.md +119 -0
  313. package/skills/rabetbase/guides/data-api-guidelines.md +414 -0
  314. package/skills/rabetbase/guides/database-connection-workflow.md +169 -0
  315. package/skills/rabetbase/guides/frontend-development.md +179 -0
  316. package/skills/rabetbase/guides/legacy-application-blueprint-workflow.md +495 -0
  317. package/skills/rabetbase/guides/menu-anomaly-manual-cleanup.md +137 -0
  318. package/skills/rabetbase/guides/page-development-workflow.md +187 -0
  319. package/skills/rabetbase/guides/react-custom-page-workflow.md +184 -0
  320. package/skills/rabetbase/guides/role-permit-workflow.md +127 -0
  321. package/skills/rabetbase/guides/sql-creation-workflow.md +173 -0
  322. package/skills/rabetbase/guides/sql-mybatis.md +126 -0
  323. package/skills/rabetbase/guides/troubleshooting.md +67 -0
  324. package/skills/rabetbase/guides/typescript-sdk.md +227 -0
  325. package/skills/rabetbase/knowledge/page-schema/LrSmartCreate.md +367 -0
  326. package/skills/rabetbase/knowledge/page-schema/LrSmartDetail.md +153 -0
  327. package/skills/rabetbase/knowledge/page-schema/LrSmartEcharts.md +291 -0
  328. package/skills/rabetbase/knowledge/page-schema/LrSmartFilter.md +478 -0
  329. package/skills/rabetbase/knowledge/page-schema/LrSmartJsx.md +119 -0
  330. package/skills/rabetbase/knowledge/page-schema/LrSmartStatistic.md +223 -0
  331. package/skills/rabetbase/knowledge/page-schema/LrSmartTable.md +632 -0
  332. package/skills/rabetbase/knowledge/page-schema/YtPage.md +172 -0
  333. package/skills/rabetbase/knowledge/page-schema/dataset-relations.md +126 -0
  334. package/skills/rabetbase/knowledge/page-schema/external-resources-usage.md +232 -0
  335. package/skills/rabetbase/knowledge/page-schema/field-components.md +312 -0
  336. package/skills/rabetbase/knowledge/page-schema/syntax-reference.md +278 -0
  337. package/skills/rabetbase/knowledge/react-page/components.md +225 -0
  338. package/skills/rabetbase/knowledge/react-page/generation-standards.md +385 -0
  339. package/skills/rabetbase/references/rabetbase-api-list.md +58 -0
  340. package/skills/rabetbase/references/rabetbase-api-pull.md +82 -0
  341. package/skills/rabetbase/references/rabetbase-app-config.md +95 -0
  342. package/skills/rabetbase/references/rabetbase-app-list.md +79 -0
  343. package/skills/rabetbase/references/rabetbase-app-members-list.md +64 -0
  344. package/skills/rabetbase/references/rabetbase-auth-login.md +53 -0
  345. package/skills/rabetbase/references/rabetbase-auth-logout.md +29 -0
  346. package/skills/rabetbase/references/rabetbase-bff-create.md +59 -0
  347. package/skills/rabetbase/references/rabetbase-bff-delete.md +42 -0
  348. package/skills/rabetbase/references/rabetbase-bff-detail.md +38 -0
  349. package/skills/rabetbase/references/rabetbase-bff-list.md +61 -0
  350. package/skills/rabetbase/references/rabetbase-bff-pull.md +42 -0
  351. package/skills/rabetbase/references/rabetbase-bff-push.md +65 -0
  352. package/skills/rabetbase/references/rabetbase-bff-save.md +63 -0
  353. package/skills/rabetbase/references/rabetbase-bff-status.md +37 -0
  354. package/skills/rabetbase/references/rabetbase-cli-skill-install.md +42 -0
  355. package/skills/rabetbase/references/rabetbase-codegen-sdk.md +35 -0
  356. package/skills/rabetbase/references/rabetbase-codegen-sql.md +33 -0
  357. package/skills/rabetbase/references/rabetbase-config.md +296 -0
  358. package/skills/rabetbase/references/rabetbase-dataset-business-group-update.md +84 -0
  359. package/skills/rabetbase/references/rabetbase-dataset-delete.md +54 -0
  360. package/skills/rabetbase/references/rabetbase-dataset-detail.md +106 -0
  361. package/skills/rabetbase/references/rabetbase-dataset-extend-update.md +70 -0
  362. package/skills/rabetbase/references/rabetbase-dataset-field-update.md +117 -0
  363. package/skills/rabetbase/references/rabetbase-dataset-generate.md +206 -0
  364. package/skills/rabetbase/references/rabetbase-dataset-list.md +42 -0
  365. package/skills/rabetbase/references/rabetbase-dataset-operations.md +34 -0
  366. package/skills/rabetbase/references/rabetbase-dataset-relation-audit.md +63 -0
  367. package/skills/rabetbase/references/rabetbase-dataset-relation-mutations.md +141 -0
  368. package/skills/rabetbase/references/rabetbase-dataset-relations.md +71 -0
  369. package/skills/rabetbase/references/rabetbase-dataset-rename.md +107 -0
  370. package/skills/rabetbase/references/rabetbase-dataset-restore.md +54 -0
  371. package/skills/rabetbase/references/rabetbase-db-analyze.md +135 -0
  372. package/skills/rabetbase/references/rabetbase-db-create.md +54 -0
  373. package/skills/rabetbase/references/rabetbase-db-delete.md +26 -0
  374. package/skills/rabetbase/references/rabetbase-db-detail.md +27 -0
  375. package/skills/rabetbase/references/rabetbase-db-diff.md +57 -0
  376. package/skills/rabetbase/references/rabetbase-db-list.md +37 -0
  377. package/skills/rabetbase/references/rabetbase-db-tables.md +25 -0
  378. package/skills/rabetbase/references/rabetbase-db-test.md +29 -0
  379. package/skills/rabetbase/references/rabetbase-db-update.md +29 -0
  380. package/skills/rabetbase/references/rabetbase-doctor.md +62 -0
  381. package/skills/rabetbase/references/rabetbase-file.md +35 -0
  382. package/skills/rabetbase/references/rabetbase-init.md +70 -0
  383. package/skills/rabetbase/references/rabetbase-issue-report.md +132 -0
  384. package/skills/rabetbase/references/rabetbase-kb.md +62 -0
  385. package/skills/rabetbase/references/rabetbase-menu-asset-update.md +135 -0
  386. package/skills/rabetbase/references/rabetbase-menu-delete.md +54 -0
  387. package/skills/rabetbase/references/rabetbase-menu-external-link-create.md +63 -0
  388. package/skills/rabetbase/references/rabetbase-menu-external-link-update.md +74 -0
  389. package/skills/rabetbase/references/rabetbase-menu-group-create.md +33 -0
  390. package/skills/rabetbase/references/rabetbase-menu-group-update.md +38 -0
  391. package/skills/rabetbase/references/rabetbase-menu-list.md +144 -0
  392. package/skills/rabetbase/references/rabetbase-menu-move.md +54 -0
  393. package/skills/rabetbase/references/rabetbase-menu-regroup-start.md +45 -0
  394. package/skills/rabetbase/references/rabetbase-menu-rename.md +48 -0
  395. package/skills/rabetbase/references/rabetbase-menu-sync.md +60 -0
  396. package/skills/rabetbase/references/rabetbase-notification-config-list.md +80 -0
  397. package/skills/rabetbase/references/rabetbase-ocr.md +86 -0
  398. package/skills/rabetbase/references/rabetbase-page-generate-start.md +32 -0
  399. package/skills/rabetbase/references/rabetbase-page-generate-status.md +32 -0
  400. package/skills/rabetbase/references/rabetbase-page-pull.md +47 -0
  401. package/skills/rabetbase/references/rabetbase-page-push.md +45 -0
  402. package/skills/rabetbase/references/rabetbase-page-react-create.md +29 -0
  403. package/skills/rabetbase/references/rabetbase-page-react-detail.md +26 -0
  404. package/skills/rabetbase/references/rabetbase-page-react-list.md +23 -0
  405. package/skills/rabetbase/references/rabetbase-page-react-publish.md +23 -0
  406. package/skills/rabetbase/references/rabetbase-page-react-update.md +24 -0
  407. package/skills/rabetbase/references/rabetbase-page-relation-binding.md +72 -0
  408. package/skills/rabetbase/references/rabetbase-page-restore.md +45 -0
  409. package/skills/rabetbase/references/rabetbase-page-sync.md +36 -0
  410. package/skills/rabetbase/references/rabetbase-permit-page-set.md +69 -0
  411. package/skills/rabetbase/references/rabetbase-permit-role-apis-set.md +53 -0
  412. package/skills/rabetbase/references/rabetbase-permit-role-menus-set.md +57 -0
  413. package/skills/rabetbase/references/rabetbase-project-create.md +46 -0
  414. package/skills/rabetbase/references/rabetbase-project-upgrade.md +57 -0
  415. package/skills/rabetbase/references/rabetbase-role-list.md +68 -0
  416. package/skills/rabetbase/references/rabetbase-role-user-add.md +54 -0
  417. package/skills/rabetbase/references/rabetbase-role-user-resolve.md +27 -0
  418. package/skills/rabetbase/references/rabetbase-run.md +53 -0
  419. package/skills/rabetbase/references/rabetbase-schema.md +22 -0
  420. package/skills/rabetbase/references/rabetbase-sql-create.md +41 -0
  421. package/skills/rabetbase/references/rabetbase-sql-delete.md +37 -0
  422. package/skills/rabetbase/references/rabetbase-sql-detail.md +32 -0
  423. package/skills/rabetbase/references/rabetbase-sql-exec.md +34 -0
  424. package/skills/rabetbase/references/rabetbase-sql-list.md +54 -0
  425. package/skills/rabetbase/references/rabetbase-sql-pull.md +54 -0
  426. package/skills/rabetbase/references/rabetbase-sql-push.md +46 -0
  427. package/skills/rabetbase/references/rabetbase-sql-status.md +39 -0
  428. package/skills/rabetbase/references/rabetbase-sql-validate.md +73 -0
  429. package/skills/rabetbase/references/rabetbase-standard-page-status.md +31 -0
  430. package/skills/rabetbase/references/rabetbase-task-status.md +40 -0
  431. package/skills/rabetbase/references/rabetbase-tenant-members-list.md +69 -0
  432. package/skills/rabetbase/references/rabetbase-update.md +56 -0
  433. package/skills/rabetbase/references/rabetbase-user-account.md +45 -0
  434. package/skills/rabetbase/references/rabetbase-workspace.md +60 -0
  435. package/skills/rabetbase.manifest.json +137 -0
@@ -0,0 +1,137 @@
1
+ # 菜单异常审计与安全修复
2
+
3
+ 用于重复 `path`、根级菜单重名、疑似菜单同步重复创建等场景。默认通过 `menu list` 审计;CLI 只按精确 ID 生成可审阅计划,页面菜单或目录树必须完整暴露影响后再执行。
4
+
5
+ ## 执行原则
6
+
7
+ - 菜单事实只从 `rabetbase menu list --verbose` 获取。
8
+ - 不绕过 `rabetbase menu list --verbose` 读取菜单配置。
9
+ - 删除只能使用精确菜单 ID,不得根据 label/path 自动猜测目标。
10
+ - 单删允许 `resources=[]` 的空 folder 或任意非 folder 叶子菜单;非空 folder 必须显式 `--recursive`。
11
+ - 页面菜单删除会触发平台既有 Page/PageSchema 级联;同一 pageId 被计划外菜单引用时必须阻断。
12
+ - 删除先用 `--id` 和 `--plan-out` 生成计划,确认后只使用 `--plan <file> --yes` 执行;层级调整仍交由平台处理。
13
+
14
+ ## 平台入口
15
+
16
+ 先按当前 `rabetbase` 环境计算 `<appBaseUrl>`:
17
+
18
+ ```text
19
+ production https://app.lovrabet.com/app/<appCode>
20
+ daily https://daily.lovrabet.com/web-app/app/<appCode>
21
+ ```
22
+
23
+ 总入口:
24
+
25
+ ```text
26
+ <appBaseUrl>/pages
27
+ ```
28
+
29
+ 精细入口:
30
+
31
+ ```text
32
+ <appBaseUrl>/pages/<menuCode>
33
+ ```
34
+
35
+ 当菜单 `path` 可作为页面标识使用时,可生成:
36
+
37
+ ```text
38
+ <appBaseUrl>/pages/<encodeURIComponent(menu.path)>
39
+ ```
40
+
41
+ 重复 `path` 场景下,多条异常菜单的精细入口可能相同;这只能帮助用户快速进入页面配置,不能替代按 `id / parentId / label` 做删除确认。
42
+
43
+ ## 审计步骤
44
+
45
+ 1. 读取菜单事实:
46
+
47
+ ```bash
48
+ rabetbase menu list --appcode <appCode> --verbose --format json
49
+ ```
50
+
51
+ `menu list` 返回 DFS 扁平数组,并直接提供 `childrenIds`、`childrenCount`、`pageId` 和 `pageType`。
52
+
53
+ 2. 按规则分类异常:
54
+
55
+ 必须修复:
56
+ - 非空 `path` 重复。
57
+ - `parentId` 指向不存在的菜单。
58
+ - 菜单树出现循环引用。
59
+ - 同一父级下重复关键业务菜单。
60
+
61
+ 需要人工确认:
62
+ - 根级 `label` 重复。
63
+ - `visible=false` 但仍有 `path` 或 `resources`。
64
+ - 多个菜单共享同一 `pageId`。
65
+ - `procode` 菜单缺少 resources,但同组重复菜单存在 resources。
66
+
67
+ 不默认视为异常:
68
+ - 空 `path` 的 folder。
69
+ - 不同父级下的同名 `label`。
70
+ - folder 没有 resources。
71
+
72
+ 3. 输出修复清单:
73
+
74
+ ```text
75
+ 平台总入口: <appBaseUrl>/pages
76
+ 精细入口: <appBaseUrl>/pages/<menuCode>
77
+
78
+ 异常类型: duplicate_path
79
+ path: <path>
80
+ 建议保留:
81
+ - id: <id>, label: <label>, parentId: <parentId>, resources: <count>
82
+ 建议删除:
83
+ - id: <id>, label: <label>, type: <type>, parentId: <parentId>, childrenCount: <count>, pageId: <pageId|null>, resources: <count>
84
+ 停止条件:
85
+ - 平台无法确认该 id
86
+ - 目标不是空 folder、非 folder 叶子或已完整计划的 folder 子树
87
+ - pageId 被计划外菜单引用
88
+ - folder resources 不为空
89
+ - 平台显示与清单不一致
90
+ ```
91
+
92
+ 4. 对确认后的精确目标先预演。空 folder 或非 folder 叶子使用单目标计划:
93
+
94
+ ```bash
95
+ rabetbase menu delete \
96
+ --appcode <appCode> \
97
+ --id <menuId> \
98
+ --expect-parent-id <id|root> \
99
+ --expect-path '<path>' \
100
+ --expected-children-count 0 \
101
+ --dry-run \
102
+ --plan-out ./menu-delete-<menuId>.plan.json \
103
+ --format compress
104
+ ```
105
+
106
+ 非空 folder 使用递归计划,并完整审阅 `targets`、`deleteOrder`、`cascade.pages` 和 `warnings`:
107
+
108
+ ```bash
109
+ rabetbase menu delete \
110
+ --appcode <appCode> \
111
+ --id <folderId> \
112
+ --recursive \
113
+ --dry-run \
114
+ --plan-out ./menu-tree-delete-<folderId>.plan.json \
115
+ --format compress
116
+ ```
117
+
118
+ 确认 dry-run 的 `before`、`snapshotHash`、完整目标集合和叶子优先顺序后,在 30 分钟内执行:
119
+
120
+ ```bash
121
+ rabetbase menu delete \
122
+ --plan <reviewed-plan-file> \
123
+ --yes \
124
+ --format compress
125
+ ```
126
+
127
+ 计划绑定 `appCode`、菜单快照、完整目标事实和删除顺序;任一事实漂移、计划缺项、时间字段异常或计划过期都应重新生成计划。发生部分失败时以 `remainingIds` 为事实重新生成计划,不复用旧计划。需要管理 folder 的 label 或 sort 时使用 `group-update`;调整归属仍转平台处理,并在完成后用 `menu list` 回查。
128
+
129
+ 5. 再读取菜单事实并复查:
130
+
131
+ ```bash
132
+ rabetbase menu list --appcode <appCode> --verbose --format json
133
+ ```
134
+
135
+ 复查至少确认重复 `path` 清零、目标保留菜单仍存在、resources 符合预期。
136
+
137
+ CLI 返回 blocker 时不要绕过;把清单交给用户核实计划外引用或平台事实,处理后仍用 `menu list` 回查。
@@ -0,0 +1,187 @@
1
+ # 智能列表页(Smart List Page,page)工作流
2
+
3
+ 前置知识:已完成 `rabetbase auth` 登录,当前上下文已有 `appcode`,并已理解 `knowledge/page-schema/` 是 PageSchema 组件知识,不是 `rabetbase page` 命令说明。
4
+
5
+ ## 适用范围
6
+
7
+ 本工作流只适用于 **智能列表页(Smart List Page,DOV2 `smart_page`)** 路径:
8
+
9
+ - 基于数据集首次生成智能列表页
10
+ - 数据集字段变更后同步已有智能列表页
11
+ - 将智能列表页 schema 拉到本地进行 IDE 修改,再推回平台
12
+
13
+ 不适用于:
14
+
15
+ - 平台 WebCode 页面
16
+ - 本地主子应用开发(使用 `rabetbase project`)
17
+ - 只凭“数据集缺页”就批量生成所有页面的场景
18
+
19
+ 评论、附件、历史记录等子资源,默认不优先作为独立主页面;若业务目标不是标准智能列表页(Smart List Page),先停下来确认是否还应继续走 `page` 工作流。
20
+
21
+ ## 核心原则
22
+
23
+ 1. 智能列表页是“标准后台”方案,不是所有数据集的默认答案。
24
+ 2. 平台是页面权威来源;本地 schema 开发也必须通过 `pull -> IDE 编辑 -> push` 闭环。
25
+ 3. 新编排与自动化链路统一按 async-first 契约编排:任务状态查询与页面事实查询分离。
26
+ 4. 生产环境先做 `--dry-run`,确认目标、页面组和风险后再执行真实写操作。
27
+
28
+ ## 工作流
29
+
30
+ ```text
31
+ 确认业务目标 → 校验数据集与关联页 → 判断 generate-start 还是 sync → [按需]pull → IDE 编辑 → push --dry-run → push
32
+ ```
33
+
34
+ ### 1. 确认业务目标
35
+
36
+ 先确认这次目标是不是智能列表页最擅长的事情:
37
+
38
+ - 列表 / 新建 / 编辑 / 详情型智能列表页(Smart List Page)
39
+ - 标准管理后台
40
+ - 单数据集或轻度关联数据集
41
+
42
+ 如果目标是工作台、看板、时间轴、复杂协作视图,说明它不属于本地 `rabetbase page` 工作流;本地研发工程师应改走 `rabetbase project` 主子应用开发路径。
43
+
44
+ ### 2. 校验数据集与关联页
45
+
46
+ 执行以下命令拿事实,不要凭经验判断:
47
+
48
+ ```bash
49
+ rabetbase dataset detail --code <datasetCode> --format json
50
+ rabetbase dataset relations --datasetcode <datasetCode> --format json
51
+ ```
52
+
53
+ 重点确认:
54
+
55
+ - 数据集是否存在
56
+ - 字段名、字段类型、关联关系是否符合预期
57
+ - `relatedPages` 中是否已有未删除智能列表页
58
+
59
+ ### 3. 判断用 `generate-start / sync`
60
+
61
+ 规则如下:
62
+
63
+ - **没有未删除关联页**
64
+ - 用 [`page generate-start`](../references/rabetbase-page-generate-start.md)
65
+ - **已有未删除关联页** → 用 [`page sync`](../references/rabetbase-page-sync.md)
66
+
67
+ 推荐先做预演(`generate-start` 默认就是预演,必须显式 `--apply` 才提交):
68
+
69
+ ```bash
70
+ rabetbase page standard-page-status --datasetcode <datasetCode> --format json
71
+ rabetbase page generate-start --datasetcode <datasetCode> --format json
72
+ rabetbase page sync --datasetcode <datasetCode> --dry-run --format json
73
+ ```
74
+
75
+ 不要在已有页面时继续强行 `generate-start --apply`,也不要在完全没页时直接 `sync`。
76
+
77
+ 真实提交生成后,保存返回的 `taskId`、`operationId` 和 `clientOperationId`,优先直接执行返回的 `query.command`,用同一任务标识查询:
78
+
79
+ ```bash
80
+ rabetbase page generate-start --datasetcode <datasetCode> --apply --format json
81
+ rabetbase page generate-status --datasetcode <datasetCode> --task-id <taskId> --format json
82
+ ```
83
+
84
+ `taskId` 是首选查询标识;只有旧响应没有 taskId 时才回退 `operationId`,两者都丢失时再用 `clientOperationId`。三种标识必须且只能传一个。查询超时、未知状态或网络失败时继续查询原任务,不重新提交生成。成功终态后,从 `standardPageStatus.pageSets[]` 读取页面事实和 `versionTag`;存在多个完整组、残留页或冲突时交给用户确认,不猜测页面组。
85
+
86
+ ### 4. 拉取页面 schema 到本地
87
+
88
+ 需要本地开发 formal schema 时,执行 [`page pull`](../references/rabetbase-page-pull.md):
89
+
90
+ ```bash
91
+ rabetbase page pull --id <pageId> --format json
92
+ rabetbase page pull --datasetcode <datasetCode> --format json
93
+ rabetbase page pull --datasetcode <datasetCode> --version-tag <versionTag> --format json
94
+ ```
95
+
96
+ 规则:
97
+
98
+ - `--id` 用于单页
99
+ - `--datasetcode` / `--alias` 用于按数据集批量
100
+ - 同一命令里 `--id` 与 `--datasetcode` / `--alias` 互斥
101
+ - 生成链路优先使用 `page generate-status` 的 `standardPageStatus.pageSets[].versionTag`
102
+ - 批量模式下若同一数据集存在多组页面且 `versionTag` 不唯一,必须由用户确认后显式传 `--version-tag`
103
+
104
+ 本地文件位置:
105
+
106
+ - 页面文件:`.rabetbase/page/<appCode>/<pageId>-<TYPE>.json`
107
+ - lock 文件:`.rabetbase/page.lock.json`
108
+
109
+ ### 5. 在 IDE 中修改 schema
110
+
111
+ 本地修改时遵循两条底线:
112
+
113
+ 1. 先 `pull` 建立基线,不要手工从零伪造页面文件
114
+ 2. 如需理解 PageSchema 组件语义,再按需查看 `knowledge/page-schema/`;那是组件知识,不是 CLI 命令 reference
115
+
116
+ ### 6. 推送前先做 `push --dry-run`
117
+
118
+ 真实推送前,先执行 [`page push`](../references/rabetbase-page-push.md) 的预演:
119
+
120
+ ```bash
121
+ rabetbase page push --id <pageId> --dry-run --format json
122
+ rabetbase page push --datasetcode <datasetCode> --version-tag <tag> --dry-run --format json
123
+ ```
124
+
125
+ 预演阶段重点看:
126
+
127
+ - 本地是否存在基线
128
+ - 远端页面版本是否已变化
129
+ - 批量模式下目标页面组是否正确
130
+
131
+ 若命令提示先重新 `pull`,不要盲推覆盖。
132
+
133
+ ### 7. 推送回平台
134
+
135
+ 确认无误后再执行真实推送:
136
+
137
+ ```bash
138
+ rabetbase page push --id <pageId> --format json
139
+ rabetbase page push --datasetcode <datasetCode> --version-tag <tag> --format json
140
+ ```
141
+
142
+ 推送成功后,CLI 会自动回拉远端 canonical schema 覆盖本地文件和 lock。这个行为是预期的,不要把它当作“本地改动丢失”;它的目的是让本地重新回到平台权威状态。
143
+
144
+ ## 常见分支
145
+
146
+ ### A. 首次补齐智能列表页
147
+
148
+ ```text
149
+ dataset detail → standard-page-status → page generate-start(默认预览) → page generate-start --apply → 保存 taskId → page generate-status → 从 standardPageStatus.pageSets[] 选择 versionTag
150
+ ```
151
+
152
+ 适用于:
153
+
154
+ - 主业务对象还没有任何智能列表页
155
+ - 目标是快速补齐标准智能列表页(Smart List Page)
156
+
157
+ ### B. 字段变更后同步已有智能列表页
158
+
159
+ ```text
160
+ dataset detail → page sync --dry-run → page sync
161
+ ```
162
+
163
+ 适用于:
164
+
165
+ - 数据集字段已变化
166
+ - 关联智能列表页已经存在
167
+
168
+ ### C. 本地 schema 开发
169
+
170
+ ```text
171
+ page pull → IDE 编辑 → page push --dry-run → page push
172
+ ```
173
+
174
+ 适用于:
175
+
176
+ - 智能列表页已经生成
177
+ - 需要在 formal schema 层做本地定制
178
+
179
+ ## 参考
180
+
181
+ - [SKILL.md](../SKILL.md)
182
+ - [rabetbase-page-generate-start.md](../references/rabetbase-page-generate-start.md)
183
+ - [rabetbase-page-generate-status.md](../references/rabetbase-page-generate-status.md)
184
+ - [rabetbase-standard-page-status.md](../references/rabetbase-standard-page-status.md)
185
+ - [rabetbase-page-sync.md](../references/rabetbase-page-sync.md)
186
+ - [rabetbase-page-pull.md](../references/rabetbase-page-pull.md)
187
+ - [rabetbase-page-push.md](../references/rabetbase-page-push.md)
@@ -0,0 +1,184 @@
1
+ # React 自定义页面工作流
2
+
3
+ 本指南说明如何使用 `rabetbase` 创建、修改和发布 React 自定义页面。页面内容由完整 JSX、样式和多语言文件组成。
4
+
5
+ ## 适用范围
6
+
7
+ 适用于以下目标:
8
+
9
+ - 新建或修改 React 自定义页面、看板、门户、落地页或复杂交互页面
10
+
11
+ ## 前置上下文
12
+
13
+ - 创建页面前确认 `appCode`;修改页面前确认 `pageId`
14
+ - 确认页面目标,以及影响实现的布局、交互、数据和样式约束
15
+ - 无法确定新建页面或目标页面时,先向用户确认
16
+
17
+ ## 编排规则
18
+
19
+ ### 新建页面
20
+
21
+ 1. 先阅读 [`rabetbase-page-react-create.md`](../references/rabetbase-page-react-create.md)
22
+ 2. 可选传入完整 `--page-content`;省略时 CLI 生成默认文件。先执行 `page react-create --dry-run`,确认页面名称、父菜单和最终页面文件
23
+ 3. 经用户确认后创建页面,记录 `data.after.pageId`。新页面默认尚未发布
24
+ 4. 执行 `page react-detail --id <pageId>`,以 `data.codeContent` 中的完整页面文件为修改基线
25
+ 5. 需要定制初始文件时,再按“更新页面”流程保存完整页面文件
26
+
27
+ 创建页面会同时创建菜单入口。不得额外调用菜单创建命令重复创建入口。
28
+
29
+ ### 查找或修改已有页面
30
+
31
+ 1. 未知页面 ID 时,先阅读 [`rabetbase-page-react-list.md`](../references/rabetbase-page-react-list.md),执行 `page react-list --appcode <appCode>`
32
+ 2. 根据 `data.pages[].pageId` 与 `label` 与用户确认目标页面;`data.pages[].pageUrl` 用于查看最新保存内容,`data.pages[].editPageUrl` 用于打开页面编辑器
33
+ 3. 阅读 [`rabetbase-page-react-detail.md`](../references/rabetbase-page-react-detail.md),执行 `page react-detail --id <pageId>`
34
+ 4. 只在返回的最新 `data.codeContent` 基础上编辑,不得根据旧缓存或猜测覆盖文件
35
+
36
+ ### 更新页面
37
+
38
+ 1. 阅读 [`rabetbase-page-react-update.md`](../references/rabetbase-page-react-update.md)
39
+ 2. 将新增、修改和保留的所有文件整理为完整 `page-content` JSON
40
+ 3. 先执行 `page react-update --dry-run` 审阅完整页面文件
41
+ 4. 经用户确认后执行更新
42
+ 5. 再执行 `page react-detail --id <pageId>`,确认 `codeContent` 已包含预期文件和内容
43
+ 6. 已发布页面更新后,最新保存内容需要再次发布,用户访问的已发布页面才能看到本次修改
44
+
45
+ `page react-update` 会完整保存页面文件:未提交的文件会被删除。不得仅提交本次修改的单个文件,也不得为删除文件再调用不存在的独立删除命令。
46
+
47
+ 当前 CLI 没有逐文件新增、编辑或删除命令。将本地文件操作整理为完整 `codeContent` 后再调用 `react-update`;每次更新都会创建一个新的保存版本,`react-detail` 默认读取最新页面内容。
48
+
49
+ ### 发布页面
50
+
51
+ 1. 先执行 `page react-detail --id <pageId>`,确认当前 `data.status`
52
+ 2. 当前状态为 `FORMAL` 时,表示当前保存内容已发布,不执行 `page react-publish`,直接查看已发布页面或继续后续流程
53
+ 3. 当前状态不是 `FORMAL` 时,读取 [`rabetbase-page-react-publish.md`](../references/rabetbase-page-react-publish.md),再执行 `page react-publish --dry-run`
54
+ 4. 发布会影响用户实际访问的页面,必须取得用户明确确认后再执行
55
+ 5. 从 `data.after.status` 确认 `FORMAL`,表示内容已发布
56
+
57
+ `data.pageUrl` 用于查看最新保存内容,包含尚未发布的修改;`data.editPageUrl` 用于打开页面编辑器;`page react-publish` 成功返回的 `data.runtimePageUrl` 用于查看已发布内容。不要将三者混用。
58
+
59
+ ## 页面生命周期
60
+
61
+ React 页面有“未发布”和“已发布”两种状态。未发布的修改可通过 `pageUrl` 或编辑器查看,已发布页面只展示最近一次发布的内容。
62
+
63
+ ```text
64
+ page react-create
65
+ → 未发布
66
+ → 生成或更新完整页面文件
67
+ → 未发布
68
+ → page react-publish
69
+ → 已发布(FORMAL)→ 可通过 runtimePageUrl 查看已发布内容
70
+ → page react-update
71
+ → 未发布(已发布页面仍显示上一次发布内容)
72
+ → page react-publish
73
+ → 已发布(FORMAL)→ 已发布页面展示最新发布内容
74
+ ```
75
+
76
+ | 阶段 | `pageUrl` 或编辑器可见内容 | 已发布页面可见内容 | 下一步 |
77
+ | --- | --- | --- | --- |
78
+ | 创建后 | 初始页面文件,尚未发布 | 无新发布内容 | 读取详情并生成或更新内容 |
79
+ | 更新后、未发布 | 最新保存内容,尚未发布 | 最近一次已发布内容 | 完成自检并发布 |
80
+ | 发布后 | 当前已发布版本,状态为 `FORMAL` | 本次已发布内容 | 通过 `runtimePageUrl` 查看或继续修改 |
81
+ | 已发布后再次更新 | 最新保存内容,尚未发布 | 更新前的已发布内容 | 再次发布后才切换已发布页面内容 |
82
+
83
+ `page react-detail` 用于确认最新保存内容,`page react-publish` 用于发布当前保存内容。不要仅因 `react-update` 成功就认为已发布页面已经更新。
84
+
85
+ `react-detail` 返回 `FORMAL` 时,表示当前保存内容已经发布。没有新的修改时,跳过重复发布,继续查看已发布页面或后续流程。
86
+
87
+ ### 地址语义
88
+
89
+ | 操作结果 | 输出字段 | 用途 |
90
+ | --- | --- | --- |
91
+ | 创建/保存成功 | `pageUrl`、`editPageUrl` | `pageUrl` 查看最新保存内容,`editPageUrl` 打开页面编辑器 |
92
+ | 发布成功 | `runtimePageUrl` | 查看最近一次已发布内容 |
93
+ | 页面查询 | `pageUrl`、`editPageUrl` | 快速打开最新保存内容或页面编辑器 |
94
+
95
+ ## 数据与服务契约
96
+
97
+ ### 选型
98
+
99
+ - 单个数据集的常规查询和写入,使用数据集模型能力
100
+ - 页面需要组合多个数据集的数据时,考虑使用自定义 SQL
101
+ - 数据需要个性化处理、复杂业务编排或调用外部服务时,考虑使用 BFF
102
+
103
+ 页面需要读取或写入数据集时,先按以下顺序确认事实:
104
+
105
+ 1. `rabetbase dataset list --appcode <appCode>` 查找可用数据集
106
+ 2. `rabetbase dataset detail --code <datasetCode>` 确认字段、类型和必填约束
107
+ 3. `rabetbase dataset operations --code <datasetCode>` 确认可用操作及其输入
108
+ 4. 需要生成调用示例时,阅读 [`rabetbase-codegen-sdk.md`](../references/rabetbase-codegen-sdk.md),使用 `rabetbase codegen sdk`
109
+
110
+ 页面需要调用自定义 SQL 或 BFF 时,先通过当前 CLI 获取目标资源事实:
111
+
112
+ 1. SQL:执行 `rabetbase sql list`,再执行 `rabetbase sql detail --sqlcode <sqlCode>` 确认目标 SQL
113
+ 2. BFF:执行 `rabetbase bff list`,再执行 `rabetbase bff detail --id <id>` 确认目标脚本
114
+ 3. 按 `@lovrabet/sdk` 的使用规范实现 `client.sql` 或 `client.bff` 调用,不得根据 CLI 返回结构猜测页面调用参数或返回值
115
+ 4. 页面使用自定义 SQL 前,使用代表性参数执行 `rabetbase sql exec --sqlcode <sqlCode> --params <json> --format json`,确认执行没有报错并检查实际数据结构
116
+ 5. `sql exec` 仅用于确认 SQL 可执行及返回数据结构。页面代码按 `@lovrabet/sdk` 的使用规范处理 `client.sql` 的返回值,不使用 CLI 输出字段 `data.rows`
117
+
118
+ 当前 CLI 没有按单个数据集返回页面数据访问说明的专用命令。在页面中使用 `client` 前,必须以数据集、SQL 或 BFF 的事实,以及对应的 `@lovrabet/sdk` 使用规范为依据;无法确认的字段、接口路径和响应结构不得猜测。
119
+
120
+ ## 页面开发参考
121
+
122
+ 编写页面内容前,先阅读 [`generation-standards.md`](../knowledge/react-page/generation-standards.md)。
123
+
124
+ - 选择、组合或新增 UI 组件时,按需阅读 [`components.md`](../knowledge/react-page/components.md)
125
+ - 调用页面上下文、国际化、路由或数据客户端时,按需阅读 `generation-standards.md` 中的“页面上下文内置能力”
126
+ - 未登记的组件、方法、参数和返回结构不得猜测,先补充确认后的规范再复用
127
+
128
+ ## 页面文件与代码约束
129
+
130
+ 默认文件结构:
131
+
132
+ ```text
133
+ src/app/index.jsx
134
+ src/app/index.css
135
+ src/locales/index.js
136
+ src/components/*.jsx
137
+ ```
138
+
139
+ 代码遵循以下约束:
140
+
141
+ - 仅导入 [`generation-standards.md`](../knowledge/react-page/generation-standards.md)“依赖白名单”中的包及其子路径
142
+ - 使用页面上下文时,从 `@/context/app-context` 导入 `useSdkClient`、`useI18n`、`useNavigate`、`useLocation`
143
+ - 数据读取或写入前,先确认数据集及 SDK 用法;接口或字段无法从现有事实确认时,不得猜测请求协议
144
+ - 所有用户可见文案通过 `$i18n.t("key")` 获取,并在 `src/locales/index.js` 提供有效翻译
145
+ - 路由跳转使用 `navigate`,读取地址信息使用 `location`;关联页面优先使用 `navigate("/pagecode", { onePage: true })`
146
+ - CSS 使用 Ant Design CSS 变量,不写死颜色或其他样式常量
147
+ - 不新增白名单外依赖,不使用 `window.location`
148
+
149
+ 未传 `--page-content` 时,`react-create` 生成基础 JSX、样式和词包。首次自定义时,将初始文案和样式一并调整为上述约束后再发布,不把初始化模板视为最终页面实现。
150
+
151
+ ## 页面内容自检
152
+
153
+ 在首次提交或每次更新完整 `codeContent` 前,按以下顺序自检:
154
+
155
+ 1. 先用 `page react-detail --id <pageId>` 读取最新页面文件,避免覆盖其他尚未发布的修改
156
+ 2. 确认提交内容包含全部需要保留的文件,入口、样式、词包和组件之间的导入路径一致
157
+ 3. 对照 [`generation-standards.md`](../knowledge/react-page/generation-standards.md) 检查依赖白名单、国际化、路由、样式和数据契约
158
+ 4. 使用组件或内置方法时,分别对照 `components.md` 和 `generation-standards.md` 中的“页面上下文内置能力”,确认不存在未登记的属性、方法或返回结构假设
159
+ 5. 先完成“页面生成规范”中的静态自检,再执行 `page react-update --dry-run`。CLI 会阻止缺少 React 源码或存在基础 JS/JSX/TS/TSX 语法错误的内容,但不推断变量引用、模块导出、数据契约或运行时行为
160
+ 6. 更新后再次执行 `page react-detail --id <pageId>`,确认最新保存的 `codeContent` 与提交内容一致
161
+ 7. 需要让用户查看已发布页面时,先检查最新 `data.status`。状态为 `FORMAL` 时跳过发布;否则执行 `page react-publish --dry-run`、取得确认后发布,并确认 `data.after.status` 为 `FORMAL` 和 `data.runtimePageUrl` 已返回
162
+
163
+ 当前 CLI 不提供已发布页面截图或自动浏览器预览。发布成功后,使用返回的 `data.runtimePageUrl` 打开已发布页面进行人工预览。
164
+
165
+ ## 最小验证闭环
166
+
167
+ ```text
168
+ 新建:react-create --dry-run → react-create → react-detail → [按需] react-update --dry-run → react-update → react-detail → [尚未发布(status 非 FORMAL)且经确认] react-publish --dry-run → react-publish
169
+
170
+ 修改:react-list(按需)→ react-detail → react-update --dry-run → react-update → react-detail → [尚未发布(status 非 FORMAL)且经确认] react-publish --dry-run → react-publish
171
+ ```
172
+
173
+ CLI 当前不提供本地预览或独立删除命令。
174
+
175
+ ## 参考
176
+
177
+ - [`rabetbase-page-react-create.md`](../references/rabetbase-page-react-create.md)
178
+ - [`rabetbase-page-react-list.md`](../references/rabetbase-page-react-list.md)
179
+ - [`rabetbase-page-react-detail.md`](../references/rabetbase-page-react-detail.md)
180
+ - [`rabetbase-page-react-update.md`](../references/rabetbase-page-react-update.md)
181
+ - [`rabetbase-page-react-publish.md`](../references/rabetbase-page-react-publish.md)
182
+ - [`generation-standards.md`](../knowledge/react-page/generation-standards.md)
183
+ - [`components.md`](../knowledge/react-page/components.md)
184
+ - [`rabetbase-codegen-sdk.md`](../references/rabetbase-codegen-sdk.md)
@@ -0,0 +1,127 @@
1
+ # 用户组与权限(role / permit)工作流
2
+
3
+ 前置知识:已完成 `rabetbase auth` 登录,当前上下文已有 `appcode`。所有写操作默认输出 `compress`,先 `--dry-run` 再 `--yes`。
4
+
5
+ ## 适用范围
6
+
7
+ 本工作流覆盖「谁属于哪个用户组」和「某个用户组能看什么、能操作什么」两类问题:
8
+
9
+ - 建组 / 改组 / 删组(`role create/update/delete`)
10
+ - 把员工加入或移出用户组(`role user-add/user-remove`)
11
+ - 收紧或放开某用户组的菜单可见(`permit role-menus-set`)
12
+ - 收紧或放开某用户组的数据接口访问(`permit role-apis-set`)
13
+ - 配置单个页面的菜单可见 / 数据操作 / 行级可见(`permit page-set`)
14
+
15
+ 不适用于:
16
+
17
+ - 平台运营态的用户账号增删、租户成员开通(那是平台账号体系,不是应用内用户组)
18
+ - 运行态「登录后实际能读到哪些行」的验证 —— 交给 `lovrabet data filter` 在运行态确认
19
+
20
+ ## 两个必须先分清的层面
21
+
22
+ 权限配置常被混为一谈,动手前先判断问题落在哪一层:
23
+
24
+ | 层面 | 回答的问题 | 事实源 / 命令 |
25
+ |------|-----------|--------------|
26
+ | **成员归属** | 某个人在不在某个用户组里 | `role user-*`(`update-user-list` 全量回写) |
27
+ | **能力授权** | 某个用户组能看哪些菜单 / 访问哪些接口 / 在某页能做什么 | `permit *`(菜单矩阵 / API 矩阵 / 单页槽位) |
28
+
29
+ 「小张不能看财务」通常**不是**把小张移出某个组,而是收紧他所在用户组的**能力授权**。
30
+
31
+ ## 角色(用户组)类型
32
+
33
+ `ADMIN` / `DEV` / `USER` 为内置,`CUSTOM` 为用户创建。守卫规则:
34
+
35
+ - `role update` / `role delete`:**仅 `CUSTOM`**;对 `DEV` / `ADMIN` / `USER` 会被 validation 拒绝。
36
+ - `permit role-menus-set` / `role-apis-set`:**DEV / ADMIN 的权限矩阵不可改**,会被拒绝(内置角色按设计保持全量访问)。
37
+ - `role user-add` / `user-remove`:成员增删对**所有角色**可用(包括把人加进 DEV)。
38
+
39
+ 要「限制某类人」时,正确姿势是新建或选用一个 `CUSTOM` 组,配它的能力,再把人放进去,而不是去改内置角色。
40
+
41
+ ## 决策树:我要解决什么问题 → 用什么命令
42
+
43
+ ```text
44
+ 需要改「谁在组里」?
45
+ ├─ 加人 / 移人 ──────────────→ role user-resolve(拿 userId)→ role user-add / user-remove
46
+ ├─ 新建一个用户组 ───────────→ role create
47
+ ├─ 改组名 / 备注 ────────────→ role update(仅 CUSTOM)
48
+ └─ 删除用户组 ──────────────→ role delete(仅 CUSTOM,high-risk)
49
+
50
+ 需要改「某个组能看/能做什么」?
51
+ ├─ 整个组看不到某些菜单 ─────→ permit role-menus → role-menus-set --revoke/--grant --menus
52
+ ├─ 整个组访问不了某些数据接口 → permit role-apis-set --revoke --datasets
53
+ └─ 针对某一个页面精细配置 ───→ permit page-get → page-set
54
+ ├─ 该页对哪些角色可见 ──→ page-set --menu-roles
55
+ ├─ 该页的增/改/删/详情/导出 → page-set --create-roles/--update-roles/...
56
+ └─ 行级「只看自己」 ─────→ page-set --row-roles SELF
57
+ ```
58
+
59
+ ### `role-menus-set` 与 `page-set --menu-roles` 的区别(易混)
60
+
61
+ 两者都影响「菜单是否可见」,但入口和粒度不同,别用错:
62
+
63
+ - **`permit role-menus-set`**:以**角色**为主体,一次性设置该角色在整个 app 的菜单权限矩阵(`roleType: PAGE`),按 `resourceCode` 翻转。适合「销售组不看财务菜单」这类**按组批量**收紧。
64
+ - **`permit page-set --menu-roles`**:以**单个菜单页面**为主体,设置「这一页对哪些角色可见」,同时还能在同一页配置数据操作和行级权限。适合「就这一个页面的权限编排」。
65
+
66
+ 判断口径:问题描述里主语是「某个组」→ 走 `role-menus-set`;主语是「某个页面」→ 走 `page-set`。
67
+
68
+ ## 通用铁律
69
+
70
+ 1. **先读后写**:改成员先 `role user-resolve` + `role list`;改能力先 `permit page-get` / `role-menus` 拿到真实 `resourceCode` / `menuId` / `datasetCode`,不要臆造标识。
71
+ 2. **dry-run 必做**:所有写命令先 `--dry-run` 看 `data.before` / `data.after`,确认无误再复用同参数加 `--yes`。
72
+ 3. **read-merge-write 是 CLI 内部行为**:`update-user-list` / `page/save` / `role/update` 服务端都是**全量回写**;CLI 已内部读取全量、只改目标片段、其余原样带回。你只需传要改的部分,但要理解一次写会覆盖整份对象。
73
+ 4. **防漂移**:`user-add/user-remove` 可加 `--expect-user-count <n>`,当前成员数不符即中止。
74
+ 5. **SELF 只用于行级**:`SELF` 仅允许出现在 `page-set --row-roles`(`dataPermit`);打到菜单/操作槽位会被拒绝。`ALL` 表示所有角色。
75
+ 6. **收紧不做自动 suggest**:`role-menus-set` / `role-apis-set` 必须显式 `--menus` / `--datasets`,避免误伤;先用 `dataset list` / `menu list` 定位目标。
76
+ 7. **运行态验证要交接**:`page-set --row-roles SELF`、`role-apis-set --revoke` 只写权限配置。要验证「登录后是否只看到自己的行 / 是否读不到财务数据」,交给 `lovrabet data filter` 在运行态确认,不要把它伪装成 `rabetbase` 已验证。
77
+ 8. **读内层协议,不读顶层 envelope**:写命令的稳定字段在 `data.*`(`operation` / `selector` / `before` / `after` / `dryRun` / `backend` / `warnings`),不含合成 `protocol` key。
78
+
79
+ ## 常见剧本
80
+
81
+ ### A. 把员工加入用户组(如:把小张加入开发者)
82
+
83
+ ```text
84
+ role user-resolve --name 小张 → 拿 userId(重名报错,用 --user <id> 消歧)
85
+ role list --type DEV → 拿目标角色 id
86
+ role user-add --role <id> --user <userId> --dry-run → --yes
87
+ ```
88
+
89
+ ### B. 新建一个用户组(如:创建销售组)
90
+
91
+ ```text
92
+ role create --name 销售组 --dry-run
93
+ role create --name 销售组 --remark "华东销售" --yes → 从 data.selector.roleId 取回填的新 id
94
+ ```
95
+
96
+ > 服务端 `role/create` 返回创建后的完整角色对象,CLI 直接将 id 填入 `data.selector.roleId`,不再按名称回查。
97
+
98
+ ### C. 让某组看不到财务(菜单 + API 双侧收紧)
99
+
100
+ ```text
101
+ dataset list → 定位财务域 datasetCode
102
+ menu list → 定位财务菜单 resourceCode
103
+ permit role-menus-set --role <salesId> --revoke --menus <财务菜单codes> --dry-run → --yes
104
+ permit role-apis-set --role <salesId> --revoke --datasets <财务datasetCodes> --dry-run → --yes
105
+ ```
106
+
107
+ 菜单不可见 + 数据接口不可访问,两侧都要收紧,否则可能菜单藏了但接口还能拉数据。
108
+
109
+ ### D. 某个列表页只看自己的行(如:请假列表只看自己)
110
+
111
+ ```text
112
+ menu list → 定位该页 menuId
113
+ permit page-get --menu-id <id> → 确认 dataPermit 槽位存在
114
+ permit page-set --menu-id <id> --row-roles SELF --dry-run → --yes
115
+ ```
116
+
117
+ 行级 `SELF` 打在 `dataPermit`,**不要** revoke 菜单本身。
118
+
119
+ ## 参考
120
+
121
+ - [role list / detail / create / update / delete](../references/rabetbase-role-list.md)
122
+ - [role user-resolve](../references/rabetbase-role-user-resolve.md)
123
+ - [role user-add / user-remove](../references/rabetbase-role-user-add.md)
124
+ - [permit page-get / page-set](../references/rabetbase-permit-page-set.md)
125
+ - [permit role-menus / role-menus-set](../references/rabetbase-permit-role-menus-set.md)
126
+ - [permit role-apis-set](../references/rabetbase-permit-role-apis-set.md)
127
+ - [SKILL.md](../SKILL.md)