@lovrabet/rabetbase-cli 2.5.3-beta.1 → 2.5.3-beta.3

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 (419) hide show
  1. package/lib/api/api-doc.js +1 -1
  2. package/lib/api/api-group.d.ts +22 -0
  3. package/lib/api/api-group.js +1 -0
  4. package/lib/api/fetch-model-list.js +1 -1
  5. package/lib/api/generate-api-file.d.ts +18 -2
  6. package/lib/api/generate-api-file.js +1 -1
  7. package/lib/api/generate-sdk-config-file.js +1 -1
  8. package/lib/api/legacy-api-file.d.ts +11 -0
  9. package/lib/api/legacy-api-file.js +1 -0
  10. package/lib/api/model-registry-file.d.ts +36 -0
  11. package/lib/api/model-registry-file.js +1 -0
  12. package/lib/api/model-registry-scaffold.d.ts +7 -0
  13. package/lib/api/model-registry-scaffold.js +1 -0
  14. package/lib/api/model-source.d.ts +6 -0
  15. package/lib/api/model-source.js +1 -0
  16. package/lib/auth/auth-server-ui.js +1 -1
  17. package/lib/auth/auth-server.js +1 -1
  18. package/lib/auth/constant.js +1 -1
  19. package/lib/auth/get-cookie.js +1 -1
  20. package/lib/auth/get-session-user.js +1 -1
  21. package/lib/auth/is-session-valid.js +1 -1
  22. package/lib/auth/login-success-html.js +1 -1
  23. package/lib/auth/logout.js +1 -1
  24. package/lib/cli-flags.js +1 -1
  25. package/lib/cli.js +1 -1
  26. package/lib/commands/api/generate.js +1 -1
  27. package/lib/commands/api/index.js +1 -1
  28. package/lib/commands/api/list.js +1 -1
  29. package/lib/commands/api/pull.js +1 -1
  30. package/lib/commands/api/shared.js +1 -1
  31. package/lib/commands/app/index.js +1 -1
  32. package/lib/commands/app/list.js +1 -1
  33. package/lib/commands/app/members-list.js +1 -1
  34. package/lib/commands/app/remote-directory.js +1 -1
  35. package/lib/commands/app/shared.js +1 -1
  36. package/lib/commands/app-config/delete.js +1 -1
  37. package/lib/commands/app-config/get.js +1 -1
  38. package/lib/commands/app-config/index.js +1 -1
  39. package/lib/commands/app-config/list.js +1 -1
  40. package/lib/commands/app-config/set.js +1 -1
  41. package/lib/commands/app-config/shared.js +1 -1
  42. package/lib/commands/auth/index.js +1 -1
  43. package/lib/commands/bff/create.js +1 -1
  44. package/lib/commands/bff/delete.js +1 -1
  45. package/lib/commands/bff/detail.js +1 -1
  46. package/lib/commands/bff/index.js +1 -1
  47. package/lib/commands/bff/list.js +1 -1
  48. package/lib/commands/bff/logs.d.ts +7 -0
  49. package/lib/commands/bff/logs.js +1 -0
  50. package/lib/commands/bff/pull.js +1 -1
  51. package/lib/commands/bff/push.js +1 -1
  52. package/lib/commands/bff/status.js +1 -1
  53. package/lib/commands/cli-skill/index.js +1 -1
  54. package/lib/commands/cli-update.js +1 -1
  55. package/lib/commands/codegen/index.js +1 -1
  56. package/lib/commands/codegen/sdk.js +1 -1
  57. package/lib/commands/codegen/sql.js +1 -1
  58. package/lib/commands/common/app-registry.js +1 -1
  59. package/lib/commands/common/app-selector.js +1 -1
  60. package/lib/commands/common/async-task.js +1 -1
  61. package/lib/commands/common/dry-run.js +1 -1
  62. package/lib/commands/common/flags.d.ts +7 -0
  63. package/lib/commands/common/flags.js +1 -1
  64. package/lib/commands/common/local-file.js +1 -1
  65. package/lib/commands/common/validate.js +1 -1
  66. package/lib/commands/config/delete.js +1 -1
  67. package/lib/commands/config/get.js +1 -1
  68. package/lib/commands/config/index.js +1 -1
  69. package/lib/commands/config/init.js +1 -1
  70. package/lib/commands/config/list.js +1 -1
  71. package/lib/commands/config/set.js +1 -1
  72. package/lib/commands/config/shared.js +1 -1
  73. package/lib/commands/dataset/batch-design.d.ts +21 -0
  74. package/lib/commands/dataset/batch-design.js +1 -0
  75. package/lib/commands/dataset/business-group-update.js +1 -1
  76. package/lib/commands/dataset/business-groups.js +1 -1
  77. package/lib/commands/dataset/capability.js +1 -1
  78. package/lib/commands/dataset/cross-relation-create.d.ts +2 -0
  79. package/lib/commands/dataset/cross-relation-create.js +1 -0
  80. package/lib/commands/dataset/cross-relation-delete.d.ts +2 -0
  81. package/lib/commands/dataset/cross-relation-delete.js +1 -0
  82. package/lib/commands/dataset/cross-relation-list.d.ts +2 -0
  83. package/lib/commands/dataset/cross-relation-list.js +1 -0
  84. package/lib/commands/dataset/cross-relation-shared.d.ts +190 -0
  85. package/lib/commands/dataset/cross-relation-shared.js +1 -0
  86. package/lib/commands/dataset/cross-relation-update.d.ts +2 -0
  87. package/lib/commands/dataset/cross-relation-update.js +1 -0
  88. package/lib/commands/dataset/delete.js +1 -1
  89. package/lib/commands/dataset/detail.js +1 -1
  90. package/lib/commands/dataset/extend-update.js +1 -1
  91. package/lib/commands/dataset/field-restore.js +1 -1
  92. package/lib/commands/dataset/field-update.js +1 -1
  93. package/lib/commands/dataset/generate.js +1 -1
  94. package/lib/commands/dataset/index.js +1 -1
  95. package/lib/commands/dataset/list.js +1 -1
  96. package/lib/commands/dataset/operations.js +1 -1
  97. package/lib/commands/dataset/relation-audit.js +1 -1
  98. package/lib/commands/dataset/relation-create.js +1 -1
  99. package/lib/commands/dataset/relation-delete.js +1 -1
  100. package/lib/commands/dataset/relation-shared.js +1 -1
  101. package/lib/commands/dataset/relation-update.js +1 -1
  102. package/lib/commands/dataset/relations.js +1 -1
  103. package/lib/commands/dataset/rename.js +1 -1
  104. package/lib/commands/dataset/restore.js +1 -1
  105. package/lib/commands/dataset/user-deleted-field-list.js +1 -1
  106. package/lib/commands/db/analysis-batching.js +1 -1
  107. package/lib/commands/db/analyze-batch-plan.js +1 -1
  108. package/lib/commands/db/analyze-cancel.js +1 -1
  109. package/lib/commands/db/analyze-start.js +1 -1
  110. package/lib/commands/db/analyze-status.js +1 -1
  111. package/lib/commands/db/create.js +1 -1
  112. package/lib/commands/db/delete.js +1 -1
  113. package/lib/commands/db/detail.js +1 -1
  114. package/lib/commands/db/diff-refresh-start.js +1 -1
  115. package/lib/commands/db/diff-refresh-status.js +1 -1
  116. package/lib/commands/db/diff.js +1 -1
  117. package/lib/commands/db/index.js +1 -1
  118. package/lib/commands/db/list.js +1 -1
  119. package/lib/commands/db/shared.js +1 -1
  120. package/lib/commands/db/table-diff-shared.js +1 -1
  121. package/lib/commands/db/tables.js +1 -1
  122. package/lib/commands/db/test.js +1 -1
  123. package/lib/commands/db/update.js +1 -1
  124. package/lib/commands/deployment/index.js +1 -1
  125. package/lib/commands/deployment/sync-all.js +1 -1
  126. package/lib/commands/deployment/sync-jobs.js +1 -1
  127. package/lib/commands/deployment/sync-status.js +1 -1
  128. package/lib/commands/doctor.js +1 -1
  129. package/lib/commands/file/index.js +1 -1
  130. package/lib/commands/flow/create.d.ts +2 -0
  131. package/lib/commands/flow/create.js +1 -0
  132. package/lib/commands/flow/detail.d.ts +2 -0
  133. package/lib/commands/flow/detail.js +1 -0
  134. package/lib/commands/flow/index.d.ts +3 -0
  135. package/lib/commands/flow/index.js +1 -0
  136. package/lib/commands/flow/list.d.ts +2 -0
  137. package/lib/commands/flow/list.js +1 -0
  138. package/lib/commands/flow/publish.d.ts +2 -0
  139. package/lib/commands/flow/publish.js +1 -0
  140. package/lib/commands/flow/runtime-resources-shared.d.ts +40 -0
  141. package/lib/commands/flow/runtime-resources-shared.js +1 -0
  142. package/lib/commands/flow/runtime-role-list.d.ts +2 -0
  143. package/lib/commands/flow/runtime-role-list.js +1 -0
  144. package/lib/commands/flow/runtime-role-user-list.d.ts +2 -0
  145. package/lib/commands/flow/runtime-role-user-list.js +1 -0
  146. package/lib/commands/flow/runtime-user-search.d.ts +2 -0
  147. package/lib/commands/flow/runtime-user-search.js +1 -0
  148. package/lib/commands/flow/shared.d.ts +41 -0
  149. package/lib/commands/flow/shared.js +1 -0
  150. package/lib/commands/flow/update.d.ts +2 -0
  151. package/lib/commands/flow/update.js +1 -0
  152. package/lib/commands/flow/validate.d.ts +3 -0
  153. package/lib/commands/flow/validate.js +1 -0
  154. package/lib/commands/instant-api-policy/current.js +1 -1
  155. package/lib/commands/instant-api-policy/index.js +1 -1
  156. package/lib/commands/instant-api-policy/init.js +1 -1
  157. package/lib/commands/instant-api-policy/publish.js +1 -1
  158. package/lib/commands/instant-api-policy/pull.js +1 -1
  159. package/lib/commands/instant-api-policy/revision.js +1 -1
  160. package/lib/commands/instant-api-policy/revisions.js +1 -1
  161. package/lib/commands/instant-api-policy/rollback.js +1 -1
  162. package/lib/commands/instant-api-policy/shared.js +1 -1
  163. package/lib/commands/instant-api-policy/validate.js +1 -1
  164. package/lib/commands/issue/index.js +1 -1
  165. package/lib/commands/issue/nudge.js +1 -1
  166. package/lib/commands/issue/report.js +1 -1
  167. package/lib/commands/issue/shared.js +1 -1
  168. package/lib/commands/kb/create.js +1 -1
  169. package/lib/commands/kb/delete.js +1 -1
  170. package/lib/commands/kb/detail.js +1 -1
  171. package/lib/commands/kb/index.js +1 -1
  172. package/lib/commands/kb/list.js +1 -1
  173. package/lib/commands/kb/search.js +1 -1
  174. package/lib/commands/kb/shared.js +1 -1
  175. package/lib/commands/kb/update.js +1 -1
  176. package/lib/commands/logs/index.js +1 -1
  177. package/lib/commands/menu/asset-update.js +1 -1
  178. package/lib/commands/menu/delete.js +1 -1
  179. package/lib/commands/menu/external-link-create.js +1 -1
  180. package/lib/commands/menu/external-link-update.js +1 -1
  181. package/lib/commands/menu/group-create.js +1 -1
  182. package/lib/commands/menu/group-update.js +1 -1
  183. package/lib/commands/menu/index.js +1 -1
  184. package/lib/commands/menu/list.js +1 -1
  185. package/lib/commands/menu/move.js +1 -1
  186. package/lib/commands/menu/regroup-start.js +1 -1
  187. package/lib/commands/menu/rename.js +1 -1
  188. package/lib/commands/menu/shared/compare-table.js +1 -1
  189. package/lib/commands/menu/shared/delete-plan.js +1 -1
  190. package/lib/commands/menu/shared/facts.js +1 -1
  191. package/lib/commands/menu/shared/index.js +1 -1
  192. package/lib/commands/menu/shared/inquirer.js +1 -1
  193. package/lib/commands/menu/shared/local-pages.js +1 -1
  194. package/lib/commands/menu/shared/logic.js +1 -1
  195. package/lib/commands/menu/shared/mutations.js +1 -1
  196. package/lib/commands/menu/shared/service.js +1 -1
  197. package/lib/commands/menu/shared/sync-core.js +1 -1
  198. package/lib/commands/menu/shared/update-core.js +1 -1
  199. package/lib/commands/menu/shared/valid-url.js +1 -1
  200. package/lib/commands/menu/sync.js +1 -1
  201. package/lib/commands/menu/visibility-update.js +1 -1
  202. package/lib/commands/notification/config-create.js +1 -1
  203. package/lib/commands/notification/config-delete.js +1 -1
  204. package/lib/commands/notification/config-list.js +1 -1
  205. package/lib/commands/notification/config-update.js +1 -1
  206. package/lib/commands/notification/index.js +1 -1
  207. package/lib/commands/notification/shared.js +1 -1
  208. package/lib/commands/ocr/index.js +1 -1
  209. package/lib/commands/page/create.js +1 -1
  210. package/lib/commands/page/custom/detail.js +1 -1
  211. package/lib/commands/page/custom/list.js +1 -1
  212. package/lib/commands/page/custom/publish.js +1 -1
  213. package/lib/commands/page/custom/shared.js +1 -1
  214. package/lib/commands/page/custom/syntax.js +1 -1
  215. package/lib/commands/page/custom/update.js +1 -1
  216. package/lib/commands/page/data-list-status.js +1 -1
  217. package/lib/commands/page/generate-start.js +1 -1
  218. package/lib/commands/page/generate-status.js +1 -1
  219. package/lib/commands/page/index.js +1 -1
  220. package/lib/commands/page/pull.js +1 -1
  221. package/lib/commands/page/push.js +1 -1
  222. package/lib/commands/page/relation-audit.js +1 -1
  223. package/lib/commands/page/restore.js +1 -1
  224. package/lib/commands/page/shared.js +1 -1
  225. package/lib/commands/page/sync.js +1 -1
  226. package/lib/commands/project/api-architecture-upgrade.d.ts +28 -0
  227. package/lib/commands/project/api-architecture-upgrade.js +1 -0
  228. package/lib/commands/project/create/enhanced-guided-create.js +1 -1
  229. package/lib/commands/project/create/format-elapsed.js +1 -1
  230. package/lib/commands/project/create/main.js +1 -1
  231. package/lib/commands/project/create/materialize-project-template.js +1 -1
  232. package/lib/commands/project/create/project-name.js +1 -1
  233. package/lib/commands/project/create/project-template-archive.js +1 -1
  234. package/lib/commands/project/create/project-template-path.js +1 -1
  235. package/lib/commands/project/create/use-copy-project-template.js +1 -1
  236. package/lib/commands/project/create/use-format-code.js +1 -1
  237. package/lib/commands/project/create/use-install-dependencies.js +1 -1
  238. package/lib/commands/project/domain-routing-sync.js +1 -1
  239. package/lib/commands/project/index.js +1 -1
  240. package/lib/commands/project/upgrade.d.ts +30 -1
  241. package/lib/commands/project/upgrade.js +1 -1
  242. package/lib/commands/registry.js +1 -1
  243. package/lib/commands/role/delete.js +1 -1
  244. package/lib/commands/role/detail.js +1 -1
  245. package/lib/commands/role/index.js +1 -1
  246. package/lib/commands/role/list.js +1 -1
  247. package/lib/commands/role/shared.js +1 -1
  248. package/lib/commands/role/update.js +1 -1
  249. package/lib/commands/role/user-add.js +1 -1
  250. package/lib/commands/role/user-remove.js +1 -1
  251. package/lib/commands/role/user-resolve.js +1 -1
  252. package/lib/commands/rule/get.js +1 -1
  253. package/lib/commands/rule/index.js +1 -1
  254. package/lib/commands/rule/list.js +1 -1
  255. package/lib/commands/rule/set.js +1 -1
  256. package/lib/commands/rule/shared.js +1 -1
  257. package/lib/commands/run/index.js +1 -1
  258. package/lib/commands/schema.js +1 -1
  259. package/lib/commands/sql/create.js +1 -1
  260. package/lib/commands/sql/delete.js +1 -1
  261. package/lib/commands/sql/detail.js +1 -1
  262. package/lib/commands/sql/exec.js +1 -1
  263. package/lib/commands/sql/index.js +1 -1
  264. package/lib/commands/sql/list.js +1 -1
  265. package/lib/commands/sql/pull.js +1 -1
  266. package/lib/commands/sql/push.js +1 -1
  267. package/lib/commands/sql/shared.js +1 -1
  268. package/lib/commands/sql/status.js +1 -1
  269. package/lib/commands/sql/validate.js +1 -1
  270. package/lib/commands/task/index.js +1 -1
  271. package/lib/commands/task/status.js +1 -1
  272. package/lib/commands/tenant/index.js +1 -1
  273. package/lib/commands/tenant/members-list.js +1 -1
  274. package/lib/commands/tenant/shared.js +1 -1
  275. package/lib/commands/user-account/dingding-sandbox-bind.js +1 -1
  276. package/lib/commands/user-account/index.js +1 -1
  277. package/lib/commands/workspace/add.js +1 -1
  278. package/lib/commands/workspace/index.js +1 -1
  279. package/lib/commands/workspace/remove.js +1 -1
  280. package/lib/config/domain-config.js +1 -1
  281. package/lib/config/project-domain-routing.js +1 -1
  282. package/lib/config/region-config.js +1 -1
  283. package/lib/config/schema.js +1 -1
  284. package/lib/constant/cdn.js +1 -1
  285. package/lib/constant/cli.js +1 -1
  286. package/lib/constant/defaults.js +1 -1
  287. package/lib/constant/domain.js +1 -1
  288. package/lib/constant/env.js +1 -1
  289. package/lib/constant/output.js +1 -1
  290. package/lib/constant/paths.js +1 -1
  291. package/lib/constant/region.js +1 -1
  292. package/lib/constant/risk.js +1 -1
  293. package/lib/constant/routing-profile.js +1 -1
  294. package/lib/context/app-resolver.d.ts +2 -0
  295. package/lib/context/app-resolver.js +1 -1
  296. package/lib/context/auth-resolver.js +1 -1
  297. package/lib/context/config-loader.js +1 -1
  298. package/lib/context.d.ts +2 -1
  299. package/lib/context.js +1 -1
  300. package/lib/core/alias-resolver.d.ts +13 -17
  301. package/lib/core/alias-resolver.js +1 -1
  302. package/lib/core/api-client.d.ts +176 -1
  303. package/lib/core/api-client.js +1 -1
  304. package/lib/core/bff/config.js +1 -1
  305. package/lib/core/bff/file-system.js +1 -1
  306. package/lib/core/bff/hash.js +1 -1
  307. package/lib/core/bff/hook-directory.d.ts +55 -0
  308. package/lib/core/bff/hook-directory.js +1 -0
  309. package/lib/core/bff/lock.js +1 -1
  310. package/lib/core/bff/types.d.ts +15 -0
  311. package/lib/core/bff/utils.js +1 -1
  312. package/lib/core/cross-db-relation.d.ts +41 -0
  313. package/lib/core/cross-db-relation.js +1 -0
  314. package/lib/core/db-resolver.js +1 -1
  315. package/lib/core/flow-config.d.ts +628 -0
  316. package/lib/core/flow-config.js +1 -0
  317. package/lib/core/instant-api-policy/config.js +1 -1
  318. package/lib/core/kb-search-client.js +1 -1
  319. package/lib/core/page/file-system.js +1 -1
  320. package/lib/core/page/hash.js +1 -1
  321. package/lib/core/page/lock.js +1 -1
  322. package/lib/core/page/lr-smart-jsx.js +1 -1
  323. package/lib/core/sql-index-auditor.js +1 -1
  324. package/lib/core/sql-sync/config.js +1 -1
  325. package/lib/core/sql-sync/file-system.js +1 -1
  326. package/lib/core/sql-sync/hash.js +1 -1
  327. package/lib/core/sql-sync/lock.js +1 -1
  328. package/lib/core/sql-sync/utils.js +1 -1
  329. package/lib/core/sql-validator.js +1 -1
  330. package/lib/errors.js +1 -1
  331. package/lib/framework/build-all-flags.js +1 -1
  332. package/lib/framework/error-output.js +1 -1
  333. package/lib/framework/explicit-yes.js +1 -1
  334. package/lib/framework/flags.js +1 -1
  335. package/lib/framework/help.js +1 -1
  336. package/lib/framework/index.js +1 -1
  337. package/lib/framework/output.js +1 -1
  338. package/lib/framework/response.js +1 -1
  339. package/lib/framework/runner-alias.d.ts +1 -1
  340. package/lib/framework/runner-alias.js +1 -1
  341. package/lib/framework/runner.js +1 -1
  342. package/lib/framework/schema-export.js +1 -1
  343. package/lib/framework/supported-flags.js +1 -1
  344. package/lib/framework/types.js +1 -1
  345. package/lib/generated/build-info.d.ts +4 -4
  346. package/lib/generated/build-info.js +1 -1
  347. package/lib/generated/official-routing.js +1 -1
  348. package/lib/generated/routing-contract.js +1 -1
  349. package/lib/help.js +1 -1
  350. package/lib/postinstall.js +1 -1
  351. package/lib/runtime/confirmation.js +1 -1
  352. package/lib/runtime/event.js +1 -1
  353. package/lib/runtime/index.js +1 -1
  354. package/lib/runtime/queue.js +1 -1
  355. package/lib/runtime/resolve.js +1 -1
  356. package/lib/skills/builtin-skill.js +1 -1
  357. package/lib/skills/main.js +1 -1
  358. package/lib/skills/npx-skills-add.d.ts +0 -10
  359. package/lib/skills/npx-skills-add.js +1 -1
  360. package/lib/skills/skill-presence.js +1 -1
  361. package/lib/telemetry/cli-command-trace.js +1 -1
  362. package/lib/telemetry/cli-help-trace.js +1 -1
  363. package/lib/telemetry/ensure-cli-otel-config.js +1 -1
  364. package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
  365. package/lib/telemetry/send-cli-trace-log.js +1 -1
  366. package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
  367. package/lib/types/index.d.ts +11 -1
  368. package/lib/utils/ai_config.js +1 -1
  369. package/lib/utils/apply-jq-filter.js +1 -1
  370. package/lib/utils/cdn-config.js +1 -1
  371. package/lib/utils/check-sdk-version.js +1 -1
  372. package/lib/utils/cli-version-check.js +1 -1
  373. package/lib/utils/cli-version-policy.d.ts +12 -0
  374. package/lib/utils/cli-version-policy.js +1 -1
  375. package/lib/utils/config.js +1 -1
  376. package/lib/utils/entity-with-id.js +1 -1
  377. package/lib/utils/file-utils.js +1 -1
  378. package/lib/utils/guides-cdn.js +1 -1
  379. package/lib/utils/http-client.js +1 -1
  380. package/lib/utils/is-non-interactive.js +1 -1
  381. package/lib/utils/logger.js +1 -1
  382. package/lib/utils/params.js +1 -1
  383. package/lib/utils/platform.js +1 -1
  384. package/lib/utils/sleep.js +1 -1
  385. package/lib/utils/template-replacer.js +1 -1
  386. package/lib/utils/update-notice.js +1 -1
  387. package/lib/utils/version.js +1 -1
  388. package/lib/utils/with-active-cookie.js +1 -1
  389. package/lib/utils/write-cli-side-channel.js +1 -1
  390. package/package.json +4 -1
  391. package/skills/rabetbase/SKILL.md +31 -9
  392. package/skills/rabetbase/guides/approval-flow-development-workflow.md +137 -0
  393. package/skills/rabetbase/guides/backend-function.md +19 -9
  394. package/skills/rabetbase/guides/bff-creation-workflow.md +10 -1
  395. package/skills/rabetbase/guides/conflict-detection.md +2 -0
  396. package/skills/rabetbase/guides/sdk-client-generation.md +112 -60
  397. package/skills/rabetbase/guides/typescript-sdk.md +9 -0
  398. package/skills/rabetbase/knowledge/approval-flow/config-json-schema.md +290 -0
  399. package/skills/rabetbase/references/rabetbase-api-pull.md +30 -19
  400. package/skills/rabetbase/references/rabetbase-app-list.md +1 -1
  401. package/skills/rabetbase/references/rabetbase-bff-create.md +1 -1
  402. package/skills/rabetbase/references/rabetbase-bff-logs.md +47 -0
  403. package/skills/rabetbase/references/rabetbase-bff-pull.md +7 -3
  404. package/skills/rabetbase/references/rabetbase-bff-push.md +10 -2
  405. package/skills/rabetbase/references/rabetbase-config.md +2 -1
  406. package/skills/rabetbase/references/rabetbase-dataset-cross-relations.md +60 -0
  407. package/skills/rabetbase/references/rabetbase-dataset-generate.md +52 -2
  408. package/skills/rabetbase/references/rabetbase-flow-commands.md +86 -0
  409. package/skills/rabetbase/references/rabetbase-flow-resources.md +83 -0
  410. package/skills/rabetbase/references/rabetbase-flow-runtime-boundary.md +25 -0
  411. package/skills/rabetbase/references/rabetbase-instant-api-policy.md +103 -11
  412. package/skills/rabetbase/references/rabetbase-notification-config-list.md +17 -0
  413. package/skills/rabetbase/references/rabetbase-project-create.md +3 -3
  414. package/skills/rabetbase/references/rabetbase-project-upgrade.md +24 -13
  415. package/skills/rabetbase.manifest.json +10 -3
  416. package/templates/README.md +16 -4
  417. package/templates/generate-api/model-runtime.ts.tpl +101 -0
  418. package/templates/generate-api/profile-api.ts.tpl +21 -0
  419. package/templates/generate-api/profile-client.ts.tpl +14 -0
@@ -1 +1 @@
1
- function a323_0x5c3a(_0x32a266,_0x5bef78){_0x32a266=_0x32a266-0xf7;var _0x338af1=a323_0x338a();var _0x5c3adc=_0x338af1[_0x32a266];return _0x5c3adc;}(function(_0x2a65d1,_0x36b28d){var _0x57e1d9=a323_0x5c3a,_0x29b68a=_0x2a65d1();while(!![]){try{var _0x113e51=-parseInt(_0x57e1d9(0x100))/0x1*(parseInt(_0x57e1d9(0xfc))/0x2)+-parseInt(_0x57e1d9(0xfb))/0x3+-parseInt(_0x57e1d9(0xfd))/0x4+-parseInt(_0x57e1d9(0xfe))/0x5+parseInt(_0x57e1d9(0xff))/0x6+-parseInt(_0x57e1d9(0xf7))/0x7*(-parseInt(_0x57e1d9(0xf8))/0x8)+parseInt(_0x57e1d9(0xfa))/0x9*(parseInt(_0x57e1d9(0xf9))/0xa);if(_0x113e51===_0x36b28d)break;else _0x29b68a['push'](_0x29b68a['shift']());}catch(_0x4f7658){_0x29b68a['push'](_0x29b68a['shift']());}}}(a323_0x338a,0x8e6d8));function a323_0x338a(){var _0x58f70f=['3959480wGjWfZ','3302196YzBxma','1076874YqOJCp','7oInVIy','6000328znVkzm','9633160uquJBR','18qrmJzz','919647vfMBel','2izEXck','1873344mUbNuv'];a323_0x338a=function(){return _0x58f70f;};return a323_0x338a();}import{VERSION}from'../generated/build-info.js';export function getCliVersion(){return VERSION;}
1
+ (function(_0x4c51d5,_0x29ff3f){var _0x3e10a1=a351_0x5d56,_0x1f037b=_0x4c51d5();while(!![]){try{var _0x191713=parseInt(_0x3e10a1(0x1c6))/0x1*(-parseInt(_0x3e10a1(0x1c4))/0x2)+-parseInt(_0x3e10a1(0x1c0))/0x3*(parseInt(_0x3e10a1(0x1bf))/0x4)+-parseInt(_0x3e10a1(0x1c3))/0x5*(-parseInt(_0x3e10a1(0x1c2))/0x6)+parseInt(_0x3e10a1(0x1c9))/0x7+parseInt(_0x3e10a1(0x1c7))/0x8+parseInt(_0x3e10a1(0x1c5))/0x9*(-parseInt(_0x3e10a1(0x1c1))/0xa)+parseInt(_0x3e10a1(0x1c8))/0xb*(parseInt(_0x3e10a1(0x1be))/0xc);if(_0x191713===_0x29ff3f)break;else _0x1f037b['push'](_0x1f037b['shift']());}catch(_0x3018a8){_0x1f037b['push'](_0x1f037b['shift']());}}}(a351_0x45f4,0x77910));import{VERSION}from'../generated/build-info.js';function a351_0x5d56(_0x440cab,_0x52a7c7){_0x440cab=_0x440cab-0x1be;var _0x45f449=a351_0x45f4();var _0x5d56f6=_0x45f449[_0x440cab];return _0x5d56f6;}function a351_0x45f4(){var _0x17045f=['9NancbE','132137snvxnn','1387776PiQOuF','11UEYMFf','111475KmclDd','11303256xdUjgo','4AoieKX','1703220NXiLxx','254990wiTblz','5259642gpHUda','5KXURWh','14wWGTnE'];a351_0x45f4=function(){return _0x17045f;};return a351_0x45f4();}export function getCliVersion(){return VERSION;}
@@ -1 +1 @@
1
- function a324_0x35ad(_0x1e6a91,_0x3702c6){_0x1e6a91=_0x1e6a91-0x188;var _0x1535df=a324_0x1535();var _0x35adb9=_0x1535df[_0x1e6a91];return _0x35adb9;}(function(_0x2228fc,_0x22263e){var _0x51d8e1=a324_0x35ad,_0x4e5994=_0x2228fc();while(!![]){try{var _0x529dec=-parseInt(_0x51d8e1(0x190))/0x1*(parseInt(_0x51d8e1(0x191))/0x2)+parseInt(_0x51d8e1(0x18d))/0x3+parseInt(_0x51d8e1(0x18f))/0x4*(parseInt(_0x51d8e1(0x18a))/0x5)+parseInt(_0x51d8e1(0x18c))/0x6+parseInt(_0x51d8e1(0x18b))/0x7*(parseInt(_0x51d8e1(0x188))/0x8)+parseInt(_0x51d8e1(0x18e))/0x9*(parseInt(_0x51d8e1(0x189))/0xa)+-parseInt(_0x51d8e1(0x192))/0xb;if(_0x529dec===_0x22263e)break;else _0x4e5994['push'](_0x4e5994['shift']());}catch(_0x7d9a8f){_0x4e5994['push'](_0x4e5994['shift']());}}}(a324_0x1535,0x76aef));function a324_0x1535(){var _0x2874d9=['14qxmAPU','2003466xXWAhs','2870727UQGpwt','2067453VyEnlH','28GYXWfq','13355SZxJPq','2SMOUTR','24826549pYYToN','1201480FkfSYl','20Iuuyoa','504155zQCOVT'];a324_0x1535=function(){return _0x2874d9;};return a324_0x1535();}import{setActiveCookie,clearActiveCookie}from'../core/api-client.js';export async function withActiveCookie(_0x2762a0,_0x3af75a){setActiveCookie(_0x2762a0);try{return await _0x3af75a();}finally{clearActiveCookie();}}
1
+ (function(_0x1fc9f2,_0x567a3b){var _0x1e2882=a352_0x5c85,_0x3714bb=_0x1fc9f2();while(!![]){try{var _0x556c03=parseInt(_0x1e2882(0x177))/0x1+-parseInt(_0x1e2882(0x17b))/0x2+parseInt(_0x1e2882(0x17c))/0x3+parseInt(_0x1e2882(0x17d))/0x4*(parseInt(_0x1e2882(0x17a))/0x5)+parseInt(_0x1e2882(0x178))/0x6+-parseInt(_0x1e2882(0x17f))/0x7+parseInt(_0x1e2882(0x17e))/0x8*(-parseInt(_0x1e2882(0x179))/0x9);if(_0x556c03===_0x567a3b)break;else _0x3714bb['push'](_0x3714bb['shift']());}catch(_0x15082d){_0x3714bb['push'](_0x3714bb['shift']());}}}(a352_0x5c67,0x89364));import{setActiveCookie,clearActiveCookie}from'../core/api-client.js';function a352_0x5c85(_0x30dc8b,_0x3bf303){_0x30dc8b=_0x30dc8b-0x177;var _0x5c674d=a352_0x5c67();var _0x5c851e=_0x5c674d[_0x30dc8b];return _0x5c851e;}function a352_0x5c67(){var _0x1beebc=['785130mzJqba','9ynFHYK','430GzdKOC','642186FkhZUd','2164875ynqfUF','27096TsmUFn','8806960qpIOxB','3792516TzpFcy','1090727jxNbWF'];a352_0x5c67=function(){return _0x1beebc;};return a352_0x5c67();}export async function withActiveCookie(_0x1ab858,_0x3afcfc){setActiveCookie(_0x1ab858);try{return await _0x3afcfc();}finally{clearActiveCookie();}}
@@ -1 +1 @@
1
- function a325_0x9b7f(){var _0x154e28=['517CLRRfG','3cjVbQN','9071433PGleqa','27XDlRMy','958FtgBxD','stderr','418270NTqPzb','6089965sqKIjN','2196664oXZpuy','264hhARps','2171460YJZWNM','5744800UfdAwe'];a325_0x9b7f=function(){return _0x154e28;};return a325_0x9b7f();}function a325_0x40f2(_0x2dae63,_0x4d4273){_0x2dae63=_0x2dae63-0x1d7;var _0x9b7f61=a325_0x9b7f();var _0x40f2e0=_0x9b7f61[_0x2dae63];return _0x40f2e0;}(function(_0x47aefe,_0x5956e8){var _0x5cf7f1=a325_0x40f2,_0x16ce45=_0x47aefe();while(!![]){try{var _0x21c85b=parseInt(_0x5cf7f1(0x1d7))/0x1*(-parseInt(_0x5cf7f1(0x1de))/0x2)+-parseInt(_0x5cf7f1(0x1db))/0x3*(parseInt(_0x5cf7f1(0x1d9))/0x4)+parseInt(_0x5cf7f1(0x1e1))/0x5+-parseInt(_0x5cf7f1(0x1d8))/0x6+-parseInt(_0x5cf7f1(0x1dc))/0x7+-parseInt(_0x5cf7f1(0x1e2))/0x8*(-parseInt(_0x5cf7f1(0x1dd))/0x9)+-parseInt(_0x5cf7f1(0x1e0))/0xa*(-parseInt(_0x5cf7f1(0x1da))/0xb);if(_0x21c85b===_0x5956e8)break;else _0x16ce45['push'](_0x16ce45['shift']());}catch(_0x1bc4dc){_0x16ce45['push'](_0x16ce45['shift']());}}}(a325_0x9b7f,0xc02b6));export function writeCliSideChannelLine(_0x229f13){var _0x19e6c0=a325_0x40f2;process[_0x19e6c0(0x1df)]['write'](_0x229f13+'\x0a');}
1
+ (function(_0x4ee1cc,_0x55f544){var _0x5884ca=a353_0x214a,_0x5570a0=_0x4ee1cc();while(!![]){try{var _0x2bab25=parseInt(_0x5884ca(0xdc))/0x1*(parseInt(_0x5884ca(0xda))/0x2)+parseInt(_0x5884ca(0xd4))/0x3*(parseInt(_0x5884ca(0xe0))/0x4)+-parseInt(_0x5884ca(0xd6))/0x5+parseInt(_0x5884ca(0xd9))/0x6*(parseInt(_0x5884ca(0xde))/0x7)+-parseInt(_0x5884ca(0xdd))/0x8*(-parseInt(_0x5884ca(0xd8))/0x9)+parseInt(_0x5884ca(0xd7))/0xa+-parseInt(_0x5884ca(0xdb))/0xb*(parseInt(_0x5884ca(0xdf))/0xc);if(_0x2bab25===_0x55f544)break;else _0x5570a0['push'](_0x5570a0['shift']());}catch(_0x928a7e){_0x5570a0['push'](_0x5570a0['shift']());}}}(a353_0x139e,0x9be38));function a353_0x139e(){var _0x1ce6bc=['36VIKlav','10632tztAoO','2FEPbqh','14960lnvkgB','1128782IArovo','1871400QPSQQS','3479cAhAET','19056dkPAjb','12BKYxdl','314646QnSfVJ','write','5364350DyQCqX','6112580dbCyTT'];a353_0x139e=function(){return _0x1ce6bc;};return a353_0x139e();}function a353_0x214a(_0x3c3c95,_0x185167){_0x3c3c95=_0x3c3c95-0xd4;var _0x139e73=a353_0x139e();var _0x214aac=_0x139e73[_0x3c3c95];return _0x214aac;}export function writeCliSideChannelLine(_0x3344bd){var _0x5b31ff=a353_0x214a;process['stderr'][_0x5b31ff(0xd5)](_0x3344bd+'\x0a');}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lovrabet/rabetbase-cli",
3
- "version": "2.5.3-beta.1",
3
+ "version": "2.5.3-beta.3",
4
4
  "description": "Developer CLI for Lovrabet apps, datasets, pages, SQL, Backend Function, database connections, skills, and AI agent workflows.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "keywords": [
@@ -44,6 +44,9 @@
44
44
  "build:dev": "node scripts/clean-build-output.mjs && tsc && tsc-alias",
45
45
  "start": "tsc --watch",
46
46
  "sync:cdn": "node scripts/sync-cdn-assets.js",
47
+ "sync:cdn:beta": "node scripts/sync-cdn-assets.js --beta",
48
+ "check:cdn": "node scripts/sync-cdn-assets.js --check",
49
+ "check:cdn:beta": "node scripts/sync-cdn-assets.js --beta --check",
47
50
  "verify:bundled-jq": "node scripts/verify-bundled-jq.mjs",
48
51
  "regression:release-smoke": "node scripts/regression-release-smoke.mjs",
49
52
  "release:summary:prepare": "node scripts/release-summary-preparation.mjs",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rabetbase
3
- version: 2.5.3-beta.1
3
+ version: 2.5.3-beta.3
4
4
  description: "Use for Lovrabet development work through the rabetbase CLI: create or bind projects (including creating an AppCode project in the current folder), pull Dataset/API facts and maintain SDK clients, or manage datasets, Instant API access policies, database connections, pages, SQL, Backend Functions, menus, notifications, knowledge bases and kb search, Agent Context Rules, roles, files, OCR, deployment metadata, platform issues, and 钉钉沙箱账号绑定. Trigger when the user mentions rabetbase, Lovrabet development, AppCode, Dataset, Instant API allow/deny/route policy, project creation, api pull/codegen, dblink, page, SQL, BFF, menu, notification, knowledge base, kb search, Agent Context Rules, RULES.md, DATABASE.md, rule list/get/set, role, file/OCR, or related development workflows."
5
5
  metadata:
6
6
  requires:
@@ -19,7 +19,7 @@ metadata:
19
19
  ## 前置条件
20
20
 
21
21
  1. **连接配置与认证分离**:首次使用先执行 `rabetbase config init`。交互模式选择当前已开放国家/地区;非交互模式显式传 `--region`,未传时使用默认节点。企业独立部署优先导入 `lovrabet-routing/v1` 清单,也兼容旧扁平 Domain 文件和对应 `--*-domain` flags。`config init` 默认重建当前项目节点/Domain 配置,显式 `--global` 时写全局;保留 Cookie、AccessKey、format、locale 和应用绑定,但不登录、不绑定项目,随后再执行 `rabetbase auth login`
22
- 2. **AppCode**:确保 `.rabetbase.json` 中设置了 `apps`(单应用自动选中;多应用再配 `defaultApp`),或兼容读取的顶层 `appcode`,或通过 `--appcode <code>` / `--app <name>` 传入。旧 `.lovrabet.json` 不会自动读取
22
+ 2. **AppCode**:确保 `.rabetbase.json` 中设置了 `apps`(单应用自动选中;多应用再配 `defaultApp`),或兼容读取的顶层 `appcode`,或通过 `--appcode <code>` / `--app <name>` 传入。`.lovrabet.json` 属于 Lovrabet 运行态 CLI;Rabetbase 不读取也不修改它,两份配置可在同一项目共存
23
23
  3. **配置文件**:`rabetbase config init` 默认写当前项目 `.rabetbase.json`,显式 `--global` 时写 `~/.rabetbase.json`;默认节点不落冗余 `region`。官方节点模式清理显式和遗留 Domain,独立部署模式清理旧 `region`/Domain 后写入路由配置。完整字段说明见 [`.rabetbase.json` 配置参考](references/rabetbase-config.md)。当前目录应用绑定使用下方 `workspace init`
24
24
  4. **工作目录应用绑定**:当前目录要固定使用某个应用时,使用 `rabetbase workspace init --appcode <code>` 或 `rabetbase workspace use --app <name>`(选型见「app vs workspace 职责边界」)
25
25
  5. **多应用场景**:一个项目有多个应用时,先 `rabetbase workspace add <name> --appcode … [--region cn|id]` 登记各应用;profile 的 `region` 高于顶层国家/地区回退值。再用 `--app <name>` 临时切换,或 `workspace use --app <name>` 修改当前工作目录默认应用
@@ -42,6 +42,7 @@ metadata:
42
42
  ## Agent 快速执行顺序
43
43
 
44
44
  1. **判断需求类型**
45
+ - 表单审批流或独立工作流定义 → 先读 [`approval-flow-development-workflow.md`](guides/approval-flow-development-workflow.md),先确定 `flowType`,再使用 `flow validate/create/update/publish`
45
46
  - Instant API 标准数据记录操作 → SDK filter/getOne/create/batchCreate/update/delete;批量更新使用 `update({ id: [...] })`,不存在 `batchUpdate()`
46
47
  - 简单聚合且数据集是 DB_TABLE → SDK aggregate;聚合列用 `aggregate[].column`,不要用旧别名 `field`
47
48
  - 复杂 JOIN / 数据库函数且数据集是 DB_TABLE → Custom SQL
@@ -52,6 +53,7 @@ metadata:
52
53
  - 跨表场景还需查目标表的结构
53
54
  - 写入前用 `data.fields[]` 确认真实字段、必填字段、枚举选项;枚举/选择字段写入 `options[].value`,不是展示 `label`
54
55
  - 需要了解数据集关联关系时用 `rabetbase dataset relations --format compress`(或 `json`);需要审计关系事实错误和人工复核项时用 `rabetbase dataset relation-audit --format compress`
56
+ - 需要管理不同数据库连接之间的 DB_TABLE 关联时,先读 [跨库关系](references/rabetbase-dataset-cross-relations.md),使用 `dataset cross-relation-list/create/update/delete`;源数据集+字段定位,更新/删除必须唯一匹配,写前 dry-run,写后以跨库 list 回读为准
55
57
  - 需要从文本需求创建新的 `METADATA` 数据集时,先读 [`dataset generate-start/status`](references/rabetbase-dataset-generate.md),执行 preview 写出 design 文件,审阅后用 `generate-start --apply --design-file` 提交任务,再用 `generate-status` 查询到成功
56
58
  - **管理物理库连接 / 测连 / 同步表结构分析**时用 `rabetbase db …`(先 [`db list`](references/rabetbase-db-list.md),trace/plan id 见 [`database-connection-workflow.md`](guides/database-connection-workflow.md))
57
59
  - 研发资源保存后的增量同步由服务端自动处理;仅在管理员明确要求首次初始化、历史回填或故障恢复时读 [`deployment sync-all`](references/rabetbase-deployment-sync-all.md),在停止编辑的安静窗口执行;提交成功后按 jobId 查询状态,提交结果未知时用 `sync-jobs` 恢复任务事实
@@ -61,14 +63,15 @@ metadata:
61
63
  - 全部批次结束后再次执行异步差异刷新并重新获取完整差异;仍未收敛时,按 [`database-connection-workflow.md`](guides/database-connection-workflow.md) 对剩余 `toAnalyzeTables` 逐表串行重试且每表只恢复一次。仅当用户明确要求跳过分析/刷新时直接读取现有差异。状态查询失败继续使用原 `planId`,不得重复启动任务
62
64
  - 输出很大且只需子集时,在 `compress`/`json` 上加 `--jq '.data…'` 缩小结果
63
65
  - 需要真实业务行数据时必须交接给 `lovrabet data filter/getOne`;`lovrabet` 不可用时报告阻断并提示安装 Skill 与 CLI,不要静默安装或修复,也不要用 `rabetbase sql exec` 当行数据替代,见 [`guides/data-api-guidelines.md`](guides/data-api-guidelines.md)
64
- - 需要 `src/api/api.ts` / `client.ts` 时:先 `rabetbase api pull --format compress` 取 `data.models`、`data.files`、`data.needsAgentMerge`,再按 [`sdk-client-generation.md`](guides/sdk-client-generation.md) 更新 TypeScript。`api pull` 默认**不会覆盖已有** `api.ts`/`client.ts`;只有用户明确要求放弃本地定制并完整重建时才使用 `--force --yes`
65
- - 需要按 Dataset + API 配置 Instant API 的 `allow`、`deny` 或 `route` 时,先读取 [`rabetbase-instant-api-policy.md`](references/rabetbase-instant-api-policy.md),只编辑固定 `policy.json`,随后依次执行 `validate`、`publish --dry-run`,经人工确认后再正式发布
66
+ - 需要 `src/api/api.ts` / `client.ts` 时:已有项目先执行 `rabetbase project upgrade --dry-run`,确认计划后执行 `rabetbase project upgrade --yes`;再运行 `rabetbase api pull --format compress` 刷新模型事实。按 [`sdk-client-generation.md`](guides/sdk-client-generation.md) 检查 `data.files`、`data.needsProjectUpgrade` 与模型注册表;注册表源码迁移仅使用 `project upgrade`
67
+ - 需要按 Dataset + API 配置 Instant API 的 `allow`、`deny` 或 `route` 时,先读取 [`rabetbase-instant-api-policy.md`](references/rabetbase-instant-api-policy.md)。先执行 `api pull` 更新模型事实,从生成的 `models[].datasetCode` 取得精确选择器;**不得**把 SDK `alias` 当作 `datasetCode`。精确 Dataset 选择器在 v1/v2 都可写 `{ datasetCode: "<real-dataset-code>" }` 或 `{ tableName: "<real-table-name>" }`;两者同时写时必须指向同一 Dataset,已有 code 时优先只写 `datasetCode`。再用 `dataset detail --code <datasetCode>` 确认目标操作存在,只编辑固定 `policy.json`。仅版本 2 可以使用通配:全部 Dataset 固定写作 `datasets: [{"datasetCode":"*"}]`,全部 API 固定写作 `apis: ["*"]`;每种通配都必须是其数组的唯一元素,`tableName: "*"` 不支持,也不得与 Dataset 通配混用。需要从通配规则中豁免组合时,用 `excludes: [{ datasets: [{ datasetCode: "<real-dataset-code>" }], apis: ["<api>"] }]`,豁免项会回退到其他非重叠规则或 `defaults.instantApi`。版本 1 禁止 `*` 与 `excludes`。随后依次执行 `validate`、`publish --dry-run`,经人工确认后再正式发布。认证不可用时报告阻断,不得猜测或复用过期的 Dataset 信息
66
68
  3. **SQL 工作流严格分步**
67
69
  - 推荐路径:查现有(`sql list/detail`) 或新建(`sql create`) → 拉/落本地(`sql pull` / `sql create`) → 编辑同步目录文件 → 可选校验(`sql validate`) → 检查状态(`sql status`) → 先预览(`sql push --dry-run` / `sql delete --dry-run`) → 再 `sql push` / `sql delete` → `sql detail` / `sql exec` 验证
68
70
  - 先使用 `sql list/detail` 查找可复用的 Custom SQL;没有满足需求的资源时,按照 [`sql-creation-workflow.md`](guides/sql-creation-workflow.md) 与 [`sql-mybatis.md`](guides/sql-mybatis.md) 创建、校验、发布并验证
69
71
  - 页面执行已发布的 Custom SQL 时使用 `sqlCode` + `params`;Backend Function 默认使用 `context.client.sql.byName(sqlName).execute({ params })`,`sql.execute({ sqlCode, params })` 仅作兼容路径
70
72
  4. **Backend Function 工作流严格分步**
71
- - 查现有 → 确认字段或通知配置 → 查公共函数 → 本地创建(`bff create`) → 检查状态(`bff status`) → 先预览(`--dry-run`) → 再拉取/推送/删除
73
+ - 查现有 → 确认字段或通知配置 → 查公共函数 → 本地创建(`bff create`) → 检查状态(`bff status`) → 先预览(`--dry-run`) → 再拉取/推送/删除;运行行为异常时用 `bff logs` 按时间、级别和关键字查询日志
74
+ - `bff pull` / `bff push` 返回 `data.conflicts` 时,逐项报告 `lockKey` 和 `code`,并只在审阅后执行该项 `nextAction`;不得把同步冲突说成失败、自动使用 `--force`,或盲目重试整批脚本
72
75
  - 创建会发送消息通知的 Backend Function 时,先读取 [`backend-function.md`](guides/backend-function.md) 的“消息通知扩展”契约,再执行 [`rabetbase notification config-list --type EMAIL`](references/rabetbase-notification-config-list.md) 获取当前应用的 `configCode`;不得猜测渠道、收件人或把密钥写进脚本
73
76
  - 推送完成只代表脚本配置已同步到平台;若用户要确认最终运行效果,显式交接到运行验证(如可用的 `lovrabet bff exec`),不要把运行验证伪装成 `rabetbase` 已完成
74
77
  5. **页面体系选择**
@@ -96,6 +99,17 @@ metadata:
96
99
  - 主产物是 `.rabetbase/blueprint/<appCode>/application-blueprint.md`,不是直接生成或推送 SQL/Backend Function
97
100
  - 必须把老代码 Logic Graph 与 dbagent 已生成的 Dataset / Relations 绑定,再判断 Instant API、Custom SQL、Backend Function、Hook、COMMON 或 Java Service 落点
98
101
 
102
+ ## 流程定义(`flow`)
103
+
104
+ - 先按 [`approval-flow-development-workflow.md`](guides/approval-flow-development-workflow.md) 编排流程,再逐条阅读 [`rabetbase-flow-commands.md`](references/rabetbase-flow-commands.md)。
105
+ - 角色、用户等候选资源按 [`rabetbase-flow-resources.md`](references/rabetbase-flow-resources.md) 查询;运行态责任边界见 [`rabetbase-flow-runtime-boundary.md`](references/rabetbase-flow-runtime-boundary.md)。
106
+ - 填写办理人、角色或转交候选人前,使用 `rabetbase flow runtime-user-search`、`runtime-role-list`、`runtime-role-user-list` 查询运行态真实 ID;这些命令只读,不办理待办。
107
+ - FlowConfig 字段和校验规则以 [`knowledge/approval-flow/config-json-schema.md`](knowledge/approval-flow/config-json-schema.md) 为准;CLI 校验结果区分 `READY`、`NEEDS_USER_CONFIRMATION`、`NEEDS_DSL_EXTENSION`、`INVALID_CONFIG` 和 `REMOTE_VALIDATION_FAILED`。
108
+ - `FORM_FLOW` 是表单审批流,人工节点只能使用 `taskMode: APPROVAL`,不得生成 `HANDLE`。
109
+ - `INDEPENDENT_FLOW` 是工作流,可以组合 `APPROVAL` 和 `HANDLE`;包含审批节点也不会改变其工作流类型。
110
+ - `pageMode` 只属于独立工作流:当前公开 Skill 只生成 `CUSTOM_PAGE`,由业务页面根据业务状态自行渲染并通过 SDK 驱动;缺省也按 `CUSTOM_PAGE`。用户要求 `PLATFORM_FORM` 时返回 `NEEDS_DSL_EXTENSION`,不生成或提交 FlowConfig。`CUSTOM_PAGE` 可选配置 `flowJson.startPageId` 和人工节点 `pageId` 作为纯导航信息;二者都不参与流程执行。
111
+ - 自定义页面 SDK/OpenAPI 只面向 `INDEPENDENT_FLOW + CUSTOM_PAGE`,不得把表单审批流或平台表单工作流混入该入口。
112
+
99
113
  ## 应用决议指引
100
114
 
101
115
  1. **已明确 appcode**
@@ -163,7 +177,8 @@ metadata:
163
177
  - **不要**在用户未要求时给命令加 `--global`** — 默认行为已是「项目优先」;只有用户明确要改全局配置或不在项目内且意图写全局时才使用。
164
178
  - **`config set`**:在**没有**项目配置文件(当前目录未解析到 `.rabetbase.json`)且**未**传 `--global` 时,CLI **拒绝执行**并提示使用 `--global` 或先 `rabetbase workspace init --appcode <code>`,**不会**静默写入全局。
165
179
  - **`project create`** 生成的新项目 `.rabetbase.json` **只继承**少量全局偏好(如 `cookie` / `locale` / `format` / `riskLevel` 等),**不会**把全局 `apps` / `defaultApp` 带入新项目文件;同时生成浏览器安全的 `src/api/sdk-config.ts` 与 `rabetbase.domain-routing.json`。每个官方节点直接声明自己的第三方库 CDN 与 Lovrabet 自有资源 Domain;项目文件始终包含解析后的完整地址,企业独立部署从共用清单读取显式 CDN。两个生成文件都不下发认证配置;`rabetbase run start|dev|build|preview` 会在执行脚本前刷新公开 Domain 快照,也可用 `project domain-routing-sync` 立即显式刷新;`api pull` 只刷新 SDK/API 文件。
166
- - **`api pull` / `api list`**:默认仅针对**项目** `apps`;需要合并全局已登记应用时加 `--global`。多应用遍历会在每个请求前应用该 profile 的有效 `region`;`api pull` 为非默认应用生成独立 `<name>-sdk-config.ts`(见各命令 reference)。
180
+ - **`api pull` / `api list`**:默认仅针对**项目** `apps`;需要合并全局已登记应用时加 `--global`。多应用遍历会在每个请求前应用该 profile 的有效 `region`。一个 AppCode 匹配多个 profile 时必须用 `--app <profile>` 消除歧义;只有显式相同 `apiGroup` 且使用同一 `apiDir` 的 profile 才共享生成注册表(见各命令 reference)。
181
+ - **多 profile SDK 的运行边界**:共享注册表只解决“同一份业务代码分别运行在不同节点,并按当前 Runtime Domain 选择唯一 profile”;它不是跨节点网关,也不允许浏览器 client 在一次运行中同时读取多个节点。业务代码只使用 alias,不硬编码或跨 profile 取 `datasetCode`。确需跨节点聚合时,交给可信服务端或 Backend Function 编排;完整约束见 [`sdk-client-generation.md`](guides/sdk-client-generation.md) 与 [`typescript-sdk.md`](guides/typescript-sdk.md)。
167
182
  - **`app list`**:默认展示**合并**后的全量;`--global` 仅全局、`--project` 仅项目(见 [`rabetbase app list`](references/rabetbase-app-list.md))。
168
183
 
169
184
  ## app vs workspace 职责边界
@@ -211,6 +226,7 @@ metadata:
211
226
  - **不要跳过 Dataset rename 最终线上回查** — 连续重命名后必须按 code 重新查询线上名称,不能只相信本地 plan 或 dry-run
212
227
  - **不要把 MCP 工具名当 CLI 命令** — 使用 `rabetbase sql list`,不是 `list_sql_queries`
213
228
  - **不要擅自加 `--global`** — 见上文「配置作用域原则」;默认写项目、读合并;仅在用户明确要求或文档说明的场景使用 `--global`。
229
+ - **不要迁移或删除 Lovrabet 运行态配置** — `.lovrabet.json`、`.lovrabet/` 与 Lovrabet Skill 不属于 Rabetbase 项目升级范围;即使它们与 `.rabetbase.json` 同时存在也必须保留
214
230
  - **不要为 Instant API Policy 传任意文件路径或写入 app-config** — 策略只使用 `.rabetbase/instant-api-policy/<appCode>/policy.json` 与独立策略接口;发布和回滚前必须校验并预览。
215
231
 
216
232
  ## 接口选型优先级
@@ -303,7 +319,7 @@ const result = await client.bff.execute<DashboardData>({
303
319
  | 初始化连接配置 | [`rabetbase config init`](references/rabetbase-init.md) | 选择官方节点或导入独立部署 Domain |
304
320
  | 创建新项目 | [`rabetbase project create`](references/rabetbase-project-create.md) | 支持新目录或当前空目录创建;完成口径与安全边界见 reference |
305
321
  | 刷新项目公开 Domain 路由 | [`rabetbase project domain-routing-sync`](references/rabetbase-project-domain-routing-sync.md) | 根据当前有效配置原子生成项目级 `rabetbase.domain-routing.json`;与前端页面路由无关 |
306
- | 从 lovrabet-cli 迁移 | [`rabetbase project upgrade`](references/rabetbase-project-upgrade.md) | 6 步自动迁移,`--yes` 跳过确认 |
322
+ | 升级已有项目依赖与源码架构 | [`rabetbase project upgrade`](references/rabetbase-project-upgrade.md) | 先 `--dry-run`,标准旧脚手架自动备份迁移,业务定制写候选文件;不修改 Lovrabet 运行态配置 |
307
323
  | 老项目翻新蓝图 / Legacy Application Blueprint | [`guides/legacy-application-blueprint-workflow.md`](guides/legacy-application-blueprint-workflow.md) | 先输出 `.rabetbase/blueprint/<appCode>/application-blueprint.md`,把老代码逻辑与 Dataset / Relations 绑定后再生成迁移 Backlog |
308
324
  | 运行 package.json 脚本 | [`rabetbase run <script>`](references/rabetbase-run.md) | `write`;先审阅脚本命令体,嵌入式工具暂不开放 |
309
325
  | 安装 / 重装 / 刷新 CLI Built-in Skill | [`rabetbase cli-skill install`](references/rabetbase-cli-skill-install.md) | 由最新版官方 Skills CLI 从当前 npm 包内本地源重装同版本 Skill;发现本地 skill 过期时优先执行 |
@@ -324,6 +340,8 @@ const result = await client.bff.execute<DashboardData>({
324
340
  | 管理和检索当前研发应用的企业知识库 | [`rabetbase kb list/detail/search/create/update/delete`](references/rabetbase-kb.md) | 管理仅 company scope;search 固定 Development 且仅 `public/company`;`create/update` 为 `write`,`delete` 保持 `high-risk-write` |
325
341
  | 管理当前研发应用的 Agent context 规则 | [`rabetbase rule list/get/set`](references/rabetbase-rule.md) | `RULES.md` 供页面、API 等研发 Agent 使用且排除 DB Agent;`DATABASE.md` 仅供数据库分析时 DB Agent 使用;两者在各自流程全程参与 context;set 为 `write`,先 dry-run |
326
342
  | 查询或管理应用级通知配置 | [`rabetbase notification config-list`](references/rabetbase-notification-config-list.md) / [`rabetbase notification config-create`](references/rabetbase-notification-config-mutations.md) / [`rabetbase notification config-update`](references/rabetbase-notification-config-mutations.md) / [`rabetbase notification config-delete`](references/rabetbase-notification-config-mutations.md) | list 获取 Backend Function 所需 `configCode`;写入只接收单一敏感 JSON 源,先 dry-run;update/delete 必须 `--yes` |
343
+ | 设计、校验和发布表单审批流或独立工作流 | [`rabetbase flow validate/list/detail/create/update/publish`](references/rabetbase-flow-commands.md) | 先确定 `flowType`;本地 validate 后再 create/update 和 publish |
344
+ | 查询审批流运行态人员和角色 | [`rabetbase flow runtime-user-search/runtime-role-list/runtime-role-user-list`](references/rabetbase-flow-resources.md) | 只读,结果标记 `scope: runtime`;用于填写 FlowConfig 的 userId/roleId |
327
345
  | 查看线上菜单事实 / 菜单异常审计 | [`rabetbase menu list`](references/rabetbase-menu-list.md) | 返回 DFS 事实、children/page、URL、最近更新人/时间和 snapshotHash;异常治理先读 [`menu-anomaly-manual-cleanup`](guides/menu-anomaly-manual-cleanup.md) |
328
346
  | 批量显示或隐藏菜单 | [`rabetbase menu visibility-update`](references/rabetbase-menu-visibility-update.md) | 用精确 ID/path 选择目标;先 dry-run,使用 `--expect-visible` / `--expected-count` 防漂移,正式执行必须 `--yes` |
329
347
  | 创建外部网站链接菜单 | [`rabetbase menu external-link-create`](references/rabetbase-menu-external-link-create.md) | `write`;显式选择 `embedded` 或 `new-window`,仅接受 HTTPS;建议先 dry-run,正式执行不要求 `--yes` |
@@ -358,6 +376,7 @@ const result = await client.bff.execute<DashboardData>({
358
376
  | 查看数据集关联关系 | [`rabetbase dataset relations`](references/rabetbase-dataset-relations.md) | 标准只读入口,输出 `datasetCode + field` 关系事实;支持 `DB_TABLE -> DB_TABLE`、`DB_TABLE -> METADATA`、`METADATA -> METADATA` |
359
377
  | 审计数据集关联关系 | [`rabetbase dataset relation-audit`](references/rabetbase-dataset-relation-audit.md) | 只读审计关系事实结构错误、风险和人工复核项 |
360
378
  | 管理单条数据集关联关系 | [`rabetbase dataset relation-create/update/delete`](references/rabetbase-dataset-relation-mutations.md) | 单条关系写入;写入前用 `relations` 确认 `datasetCode + field` 关系事实,DB_TABLE 写入所需表名来自显式参数或物理表事实 |
379
+ | 管理跨库数据集关联 | [`dataset cross-relation-list/create/update/delete`](references/rabetbase-dataset-cross-relations.md) | 不同连接的 DB_TABLE 逻辑关系;源端定位,更新/删除要求唯一匹配 |
361
380
  | 首次生成数据列表页 | [`rabetbase page generate-start --datasetcode <code>`](references/rabetbase-page-generate-start.md) | 提交或复用服务端异步任务 |
362
381
  | 创建自定义页面 | [`rabetbase page create --page-pattern BLANK --name "客户看板"`](references/rabetbase-page-create.md) | 综合操作页面优先使用 `ONEPAGE`,业务数据可视化使用 `DASHBOARD`,基础页面使用 `BLANK`;模板详情见 [`page-templates.md`](knowledge/custom-page/page-templates.md),也可通过 `--page-dir` 创建完整页面;先 dry-run |
363
382
  | 查询自定义页面 | [`rabetbase page custom-list`](references/rabetbase-page-custom-list.md) | 返回页面 ID、页面名称、`pageUrl`(查看最新保存内容)和 `editPageUrl`(打开编辑器) |
@@ -374,7 +393,7 @@ const result = await client.bff.execute<DashboardData>({
374
393
  | 恢复已删除页面 | [`rabetbase page restore --id <pageId>`](references/rabetbase-page-restore.md) | 支持 `DATA_LIST|CUSTOM` 自动识别;跨类型同 ID 时显式传 `--page-type` |
375
394
  | 数据库连接(dblink)/ 测连 / 结构分析 | [`rabetbase db list`](references/rabetbase-db-list.md) 起 | **`id`**、**trace/plan id** 与“终态 + 复跑 diff”完成口径见 [database-connection-workflow.md](guides/database-connection-workflow.md);各子命令见 `references/rabetbase-db-*.md` |
376
395
  | 独立部署应用范围补偿同步 | [`rabetbase deployment sync-all`](references/rabetbase-deployment-sync-all.md) | 管理员首次初始化、历史回填或故障恢复时使用;`write`,只提交 appCode;在停止编辑的安静窗口执行,保存 jobId 后查询状态,结果未知时用 `sync-jobs` 恢复任务事实,不自动重提;不是精确镜像 |
377
- | 生成 / 更新 API 客户端代码 | [`rabetbase api pull`](references/rabetbase-api-pull.md) → [`sdk-client-generation.md`](guides/sdk-client-generation.md) | `api pull` 拉 Dataset 事实并刷新匹配应用的 SDK 路由文件;已有 `api.ts`/`client.ts` 按 guide 合并更新 |
396
+ | 升级 API 客户端源码结构并刷新模型 | [`rabetbase project upgrade`](references/rabetbase-project-upgrade.md) → [`rabetbase api pull`](references/rabetbase-api-pull.md) → [`sdk-client-generation.md`](guides/sdk-client-generation.md) | `project upgrade` 迁移稳定入口,`api pull` 只刷新 Dataset 模型事实 |
378
397
  | 查看生成的 API 模型 | [`rabetbase api list`](references/rabetbase-api-list.md) | 列出已生成的数据模型 |
379
398
  | 查看现有 SQL | [`rabetbase sql list --name "xxx"`](references/rabetbase-sql-list.md) | 分页,按名称过滤;默认查当前决议到的单个应用 |
380
399
  | 查看 SQL 详情 | [`rabetbase sql detail --sqlcode xxx`](references/rabetbase-sql-detail.md) | 含完整 SQL 内容和参数定义 |
@@ -387,6 +406,7 @@ const result = await client.bff.execute<DashboardData>({
387
406
  | 执行 SQL 查询 | [`rabetbase sql exec --sqlcode xxx`](references/rabetbase-sql-exec.md) | 支持 `--params` JSON 参数 |
388
407
  | 查看现有 Backend Function | [`rabetbase bff list`](references/rabetbase-bff-list.md) | 按类型和名称过滤,支持 `--app` 限定应用 |
389
408
  | 查看 Backend Function 详情 | [`rabetbase bff detail --id n`](references/rabetbase-bff-detail.md) | 含完整脚本内容 |
409
+ | 查询 Backend Function 运行日志 | [`rabetbase bff logs`](references/rabetbase-bff-logs.md) | 默认最近 30 分钟;支持时间范围、级别、关键字和条数过滤 |
390
410
  | 创建本地 Backend Function | [`rabetbase bff create --type ENDPOINT --name xxx`](references/rabetbase-bff-create.md) | 在 `.rabetbase/bff/<appCode>/...` 下创建脚手架 |
391
411
  | 查看 Backend Function 本地状态 | [`rabetbase bff status`](references/rabetbase-bff-status.md) | 检查 added / modified / unchanged / remoteOnly |
392
412
  | 拉取远端 Backend Function | [`rabetbase bff pull`](references/rabetbase-bff-pull.md) | 从远端同步到本地 |
@@ -431,6 +451,7 @@ const result = await client.bff.execute<DashboardData>({
431
451
  | Menu | [`list`](references/rabetbase-menu-list.md) / [`external-link-create`](references/rabetbase-menu-external-link-create.md) / [`external-link-update`](references/rabetbase-menu-external-link-update.md) / [`rename`](references/rabetbase-menu-rename.md) / [`sync`](references/rabetbase-menu-sync.md) / [`asset-update`](references/rabetbase-menu-asset-update.md) / [`delete`](references/rabetbase-menu-delete.md) / [`group-create`](references/rabetbase-menu-group-create.md) / [`group-update`](references/rabetbase-menu-group-update.md) / [`move`](references/rabetbase-menu-move.md) / [`regroup-start`](references/rabetbase-menu-regroup-start.md) |
432
452
  | Async Tasks | [`task status`](references/rabetbase-task-status.md) |
433
453
  | Notification Configuration | [`notification config-list`](references/rabetbase-notification-config-list.md) / [`notification config-create`](references/rabetbase-notification-config-mutations.md) / [`notification config-update`](references/rabetbase-notification-config-mutations.md) / [`notification config-delete`](references/rabetbase-notification-config-mutations.md) |
454
+ | Approval Flow | [`validate/list/detail/create/update/publish`](references/rabetbase-flow-commands.md) / [`runtime-user-search/runtime-role-list/runtime-role-user-list`](references/rabetbase-flow-resources.md) |
434
455
  | Roles | [`list`](references/rabetbase-role-list.md) / `detail` / `update` / `delete` / [`user-resolve`](references/rabetbase-role-user-resolve.md) / [`user-add` / `user-remove`](references/rabetbase-role-user-add.md) |
435
456
  | Tenant Members | [`tenant members-list`](references/rabetbase-tenant-members-list.md)(当前账号所属租户的全量人员目录) |
436
457
  | app commands | [`list`](references/rabetbase-app-list.md)(只读应用事实;平台目录用 `list --remote`)/ [`members-list`](references/rabetbase-app-members-list.md)(应用人员及角色归属)。登记/移除应用改用 `workspace add` / `workspace remove` |
@@ -441,7 +462,7 @@ const result = await client.bff.execute<DashboardData>({
441
462
  | Deployment | [`sync-all` / `sync-status` / `sync-jobs`](references/rabetbase-deployment-sync-all.md)(管理员初始化、回填与恢复) |
442
463
  | api commands | [`pull`](references/rabetbase-api-pull.md) / [`list`](references/rabetbase-api-list.md) |
443
464
  | sql commands | [`list`](references/rabetbase-sql-list.md) / [`detail`](references/rabetbase-sql-detail.md) / [`create`](references/rabetbase-sql-create.md) / [`status`](references/rabetbase-sql-status.md) / [`pull`](references/rabetbase-sql-pull.md) / [`push`](references/rabetbase-sql-push.md) / [`delete`](references/rabetbase-sql-delete.md) / [`validate`](references/rabetbase-sql-validate.md) / [`save`(deprecated)](references/rabetbase-sql-save.md) / [`exec`](references/rabetbase-sql-exec.md) |
444
- | bff commands | [`list`](references/rabetbase-bff-list.md) / [`detail`](references/rabetbase-bff-detail.md) / [`create`](references/rabetbase-bff-create.md) / [`status`](references/rabetbase-bff-status.md) / [`pull`](references/rabetbase-bff-pull.md) / [`push`](references/rabetbase-bff-push.md) / [`delete`](references/rabetbase-bff-delete.md) |
465
+ | bff commands | [`list`](references/rabetbase-bff-list.md) / [`detail`](references/rabetbase-bff-detail.md) / [`logs`](references/rabetbase-bff-logs.md) / [`create`](references/rabetbase-bff-create.md) / [`status`](references/rabetbase-bff-status.md) / [`pull`](references/rabetbase-bff-pull.md) / [`push`](references/rabetbase-bff-push.md) / [`delete`](references/rabetbase-bff-delete.md) |
445
466
  | file / ocr commands | [`file upload/query-url`](references/rabetbase-file.md) / [`ocr recognize`](references/rabetbase-ocr.md) |
446
467
  | codegen commands | [`sdk`](references/rabetbase-codegen-sdk.md) / [`sql`](references/rabetbase-codegen-sql.md) |
447
468
  | CLI Built-in Skill | [`install`](references/rabetbase-cli-skill-install.md) |
@@ -522,3 +543,4 @@ const result = await client.bff.execute<DashboardData>({
522
543
  | 质量与最佳实践 | 审查 SQL/Backend Function、命名、高危边界、描述字段 | [`best-practices.md`](guides/best-practices.md) |
523
544
  | 数据库连接与分析 | 接入/改连/测连、`traceId` 来源、`db analyze-*` 与 dataset 分工;子命令速查见上文 **「数据库连接(db)」** | [`database-connection-workflow.md`](guides/database-connection-workflow.md) |
524
545
  | 菜单异常审计与安全修复 | 重复 path、根级菜单重名、空 folder 删除计划和平台处理后回查 | [`menu-anomaly-manual-cleanup.md`](guides/menu-anomaly-manual-cleanup.md) |
546
+ | 表单审批流与独立工作流设计态开发 | 流程分类、资源发现、FlowConfig、校验、创建、发布和启停 | [`approval-flow-development-workflow.md`](guides/approval-flow-development-workflow.md) |
@@ -0,0 +1,137 @@
1
+ # 流程设计态开发工作流
2
+
3
+ 本工作流用于在 `rabetbase` 中创建、校验和管理表单审批流与独立工作流定义。它只覆盖设计态流程,不办理运行态待办。
4
+
5
+ 执行前按当前步骤阅读:
6
+
7
+ - 命令参数与风险:[flow 命令参考](../references/rabetbase-flow-commands.md)
8
+ - 人员、角色、脚本和通知配置发现:[审批流资源发现](../references/rabetbase-flow-resources.md)
9
+ - FlowConfig 字段与拓扑规则:[FlowConfig 契约](../knowledge/approval-flow/config-json-schema.md)
10
+ - 设计态与运行态边界:[审批流职责边界](../references/rabetbase-flow-runtime-boundary.md)
11
+
12
+ ## 流程类型判定
13
+
14
+ 先确定外层 `flowType`,再设计节点;不要根据是否出现审批节点反推流程类型。
15
+
16
+ | `flowType` | 产品语义 | 人工节点 | 页面与数据边界 |
17
+ |---|---|---|---|
18
+ | `FORM_FLOW` | 表单审批流 | 只允许 `taskMode: APPROVAL`,禁止 `HANDLE` | 绑定 `datasetCode/pageId`;表单填写发生在发起前,驳回修改走重新提交 |
19
+ | `INDEPENDENT_FLOW` | 独立工作流 | 可同时使用 `APPROVAL` 和 `HANDLE` | 不绑定 `datasetCode/pageId`;业务数据由工作流页面和 SDK 管理 |
20
+
21
+ 独立工作流即使包含审批节点仍然是 `INDEPENDENT_FLOW`。需要填写、补充材料、执行采购或确认收货等人工办理步骤时,必须使用独立工作流,不能把 `HANDLE` 塞进表单审批流。
22
+
23
+ 独立工作流的服务端语义包含两种 `flowJson.pageMode`:
24
+
25
+ - `CUSTOM_PAGE`:业务自定义页面;缺省时按此模式处理。
26
+ - `PLATFORM_FORM`:服务端平台表单页面语义;当前公开 Skill 和 CLI 不生成或提交该模式。
27
+
28
+ 用户要求 `PLATFORM_FORM` 时,直接返回 `NEEDS_DSL_EXTENSION`,说明当前版本只支持业务自定义页面;不要继续生成 FlowConfig,也不要执行 create/update。
29
+
30
+ `pageMode` 不适用于 `FORM_FLOW`。自定义页面 SDK/OpenAPI 只查询和操作 `INDEPENDENT_FLOW + CUSTOM_PAGE`。
31
+
32
+ `INDEPENDENT_FLOW + CUSTOM_PAGE` 可以选择性配置:
33
+
34
+ - `flowJson.startPageId`:进入发起页面时使用。
35
+ - 人工节点 `pageId`:待办、已办或任务详情进入当前节点页面时使用。
36
+
37
+ 这两个字段只是导航元数据,不是业务字段,不参与分支、权限、办理人或流程状态计算;不配置时由业务应用自行选择页面。
38
+
39
+ ## 标准流程
40
+
41
+ 1. 明确 `flowName`、业务描述、业务状态、办理步骤和通过/拒绝路径,并按上表显式选择 `flowType`。
42
+ 2. `FORM_FLOW` 配置外层 `datasetCode/pageId`;`INDEPENDENT_FLOW` 不配置这两个表单绑定字段,并使用显式或默认的 `pageMode: "CUSTOM_PAGE"`。用户要求 `PLATFORM_FORM` 时返回 `NEEDS_DSL_EXTENSION`。自定义页面可按需配置 `flowJson.startPageId` 和人工节点 `pageId`,自行查询和修改业务数据集,并按业务状态决定展示内容。
43
+ 3. 建立业务变量契约:逐项确认变量名、类型、初始来源、更新节点、消费节点以及是否用于待办/已办查询;区分顶层 `variables` 与 `formData`,禁止把 `approval_sys_*`、`approved` 当作业务变量。
44
+ 4. 根据业务逻辑直接生成完整的 `nodes + edges` 拓扑,不使用 `templateName` 或 SmartCode 模板表。
45
+ 5. 为每个人工节点确认 `taskMode`、`approvalMode`、`assignee.strategy` 和是否 `sequential`。决策用 `APPROVAL`;仅 `INDEPENDENT_FLOW` 可用 `HANDLE` 表达填写或确认数据后继续。办理完成后需要按业务变量分支时,按下方“HANDLE 后续路由”组合节点。
46
+ 6. 逐个人工节点确认可选配置:自定义页面 `pageId`、转交候选人 `transferCandidates`、超时动作 `timeout`、节点完成后默认抄送 `cc`;用户未提出时保持不配置,不自行推断人员、页面或超时时长。
47
+ 7. 固定办理人、转交候选人和默认抄送人使用 `flow runtime-user-search` 查询运行态 `userId`;角色审批使用 `flow runtime-role-list` 查询运行态 `roleId`,必要时用 `flow runtime-role-user-list` 核对成员。不要把 `role *` 查询出的配置端人员/角色写入 FlowConfig。
48
+ 8. `SCRIPT` 节点和 `timeout.action: "EXECUTE_BFF"` 使用 `bff list --type ENDPOINT` 选择真实 `functionName`;同时确认同步/异步方式、重试配置和独立的 `resultVariable`。不要让多个脚本依赖默认的 `scriptResult`。
49
+ 9. `NOTIFICATION` 节点使用 `notification config-list --all` 选择真实 `configCode`,并确认 `failurePolicy`、模板内容、变量占位符和收件人来源。
50
+ 10. 生成最小 FlowConfig。不要把服务端 id、`appCode`、部署状态、编译上下文、`templateName`、`formSchema/formDefinitions/formPermissions` 或节点 `form/formPermission` 写入文件。
51
+ 11. 执行 `rabetbase flow validate --file <path> --format compress`。
52
+ 12. 展示变量契约、拓扑、资源绑定、节点可选配置、warnings 和校验结果。只有 `valid=true` 才能进入远程写入。
53
+ 13. 用户确认后先执行 create/update 的 `--dry-run`,再正式提交。
54
+ 14. publish 属于 `high-risk-write`,先 `--dry-run`,正式执行必须显式 `--yes`。
55
+
56
+ ## 业务变量契约
57
+
58
+ 流程定义不保存发起请求的实际业务数据,但 CONDITION、SCRIPT、NOTIFICATION 和运行态查询都依赖稳定的变量名称。生成拓扑前至少整理下列信息:
59
+
60
+ | 项目 | 说明 |
61
+ |---|---|
62
+ | 名称与类型 | 例如 `amount: number`、`businessStatus: string`、`purchase: object` |
63
+ | 初始来源 | 发起请求的顶层 `variables`,或 `formData` 内字段 |
64
+ | 更新者 | 发起页面、某个 HANDLE/APPROVAL 办理请求、SCRIPT 结果 |
65
+ | 消费者 | CONDITION 表达式、SCRIPT、NOTIFICATION 或业务页面 |
66
+ | 查询用途 | 用于待办/已办变量查询时,只能使用非系统的字符串、数字或布尔值做等值条件 |
67
+
68
+ 同一份数据在不同位置的访问方式不同:
69
+
70
+ | 数据来源 | CONDITION | SCRIPT 入参 | NOTIFICATION |
71
+ |---|---|---|---|
72
+ | 顶层 `variables.amount` | `${amount > 10000}` | `params.amount` | `${variables.amount}` |
73
+ | `formData.amount` | `${formData.amount > 10000}` | `params.formData.amount` | `${variables.formData.amount}` |
74
+
75
+ - `variables` 办理参数更新顶层流程变量;`formPatch` 增量增加、修改或删除 `formData` 字段。
76
+ - 对象和数组可以作为流程变量供页面、脚本或通知读取,但当前待办/已办变量查询只支持字符串、数字和布尔值等值条件;需要查询的业务状态应单独保存为顶层标量变量。
77
+ - `approval_sys_*`、`approved` 和平台维护的 `formData` 容器名属于保留范围,不作为业务变量名或 SCRIPT `resultVariable`。
78
+
79
+ ## HANDLE 后续路由
80
+
81
+ - `HANDLE` 只表示“填写或确认数据后继续”,自身必须且只能保留一条 `ALWAYS` 出边,不承担业务分支选择。
82
+ - 自定义页面办理任务时,可以在办理请求中的 `variables` 更新业务变量,也可以用 `formPatch` 增量更新 `formData`;任务完成后,下游节点读取更新后的值。
83
+ - 路由变量已由页面准备好时,生成 `HANDLE → CONDITION`,由条件网关表达多条业务路径。
84
+ - 需要 Backend Function 先计算、校验或归一化路由变量时,生成 `HANDLE → SCRIPT → CONDITION`;不需要计算时不要为了分支强制插入 `SCRIPT`。
85
+ - 不要给 `HANDLE` 直接配置多条出边,也不要让调用方传 `targetNodeId` 绕过流程图。办理节点存在多个业务结果不应判定为 `NEEDS_DSL_EXTENSION`;只有下游节点也无法表达需求时才进入 DSL 扩展判断。
86
+
87
+ ## 候选确认
88
+
89
+ - 不编造 `userId`、`roleId`、`datasetCode`、`pageId`、`scriptName` 或 `configCode`。
90
+ - 多个候选必须展示稳定标识并请用户选择。
91
+ - 唯一命中可作为推荐项,但人员身份、角色、拓扑和通知渠道仍需用户确认。
92
+ - 无命中时继续询问关键词,不自动替换为相似资源。
93
+ - 当前 DSL 支持有向环路;无法表达并行网关、子流程、加签、委派、动态审批人或流程配置式自定义表单时,停止生成可提交配置。
94
+
95
+ ## 状态
96
+
97
+ | 状态 | 含义 |
98
+ |---|---|
99
+ | `READY` | FlowConfig 完整且本地校验通过,可以等待用户决定是否提交 |
100
+ | `NEEDS_USER_CONFIRMATION` | 资源候选、身份、拓扑或写操作尚未确认 |
101
+ | `NEEDS_DSL_EXTENSION` | 需求超出当前简单审批 DSL |
102
+ | `INVALID_CONFIG` | 本地结构或拓扑校验失败 |
103
+ | `REMOTE_VALIDATION_FAILED` | 服务端拒绝 create、update 或 publish |
104
+
105
+ `READY` 只表示本地配置可提交,不表示已经创建、发布或启用。远程结果必须以对应命令的服务端响应为准。
106
+
107
+ ## 本地文件与提交
108
+
109
+ 推荐目录:
110
+
111
+ ```text
112
+ .rabetbase/flows/<flow-name>.json
113
+ ```
114
+
115
+ 旧文件先执行:
116
+
117
+ ```bash
118
+ rabetbase flow validate --file .rabetbase/flows/purchase.json
119
+ rabetbase flow validate --file .rabetbase/flows/purchase.json --write-normalized
120
+ ```
121
+
122
+ `--write-normalized` 会原子替换原文件。warnings 中列出的旧字段会被删除;为服务端编译临时注入的上下文只存在于内存,不会写回文件。
123
+
124
+ 远程提交顺序:
125
+
126
+ ```bash
127
+ rabetbase flow create --file .rabetbase/flows/purchase.json --dry-run --format compress
128
+ rabetbase flow create --file .rabetbase/flows/purchase.json --format compress
129
+
130
+ rabetbase flow update --id 42 --file .rabetbase/flows/purchase.json --dry-run --format compress
131
+ rabetbase flow update --id 42 --file .rabetbase/flows/purchase.json --format compress
132
+
133
+ rabetbase flow publish --id 42 --dry-run --format compress
134
+ rabetbase flow publish --id 42 --yes --format compress
135
+ ```
136
+
137
+ 不要根据本地文件中的遗留 `id` 或 `appCode` 决定提交目标。流程 ID 来自命令参数,应用编码来自当前工作区或显式 CLI app 选择。
@@ -66,7 +66,7 @@ Backend Function 脚本统一存放在 `.rabetbase/bff/<appCode>/` 目录下,
66
66
  ```text
67
67
  .rabetbase/bff/<appCode>/
68
68
  ├── HOOK/
69
- │ └── <alias>/
69
+ │ └── <alias-or-datasetCode>/
70
70
  │ └── <operationType>/
71
71
  │ └── <functionNode>/
72
72
  │ └── <name>.js
@@ -78,26 +78,28 @@ Backend Function 脚本统一存放在 `.rabetbase/bff/<appCode>/` 目录下,
78
78
 
79
79
  规则:
80
80
 
81
- * HOOK 放在 `.rabetbase/bff/<appCode>/HOOK/<alias>/<operationType>/<functionNode>/`
81
+ * HOOK 放在 `.rabetbase/bff/<appCode>/HOOK/<alias-or-datasetCode>/<operationType>/<functionNode>/`
82
82
  * ENDPOINT 放在 `.rabetbase/bff/<appCode>/ENDPOINT/`
83
83
  * COMMON 放在 `.rabetbase/bff/<appCode>/COMMON/`
84
84
  * 本地文件是可选的人类辅助物,平台是唯一 source of truth
85
85
 
86
- ### HOOK 目录名优先级
86
+ ### HOOK 目录协议
87
87
 
88
- HOOK 的第一层子目录名(标识数据集)按以下优先级确定:
88
+ HOOK 的第一层子目录名按 SDK 模型配置确定:
89
89
 
90
- 1. **alias**(优先):来自 `api.ts`(`api pull` 返回的 models,按 [`sdk-client-generation.md`](sdk-client-generation.md) 维护)
91
- 2. **datasetCode**(兜底):当 `api.ts` 不可用时,直接使用 32 位数据集编码
90
+ 1. SDK 模型中有唯一 alias 时使用 alias。
91
+ 2. 没有可用 alias(包括已删除 Dataset 遗留的 HOOK)时,使用 Dataset code。
92
+ 3. `bff pull` 会将 lock 跟踪的旧表名或过期 alias 目录安全迁移到当前 alias;当前没有 alias 时迁移到 Dataset code。`--dry-run` 会返回迁移计划。
93
+ 4. alias / Dataset code 命名空间碰撞、映射漂移,或同一 Dataset 同时存在两个实际本地目录时,pull/push 在首次写入前失败,不猜测、不合并、不覆盖;pull 迁移时目标目录已存在也会失败。
92
94
 
93
- 推荐先执行 `rabetbase api pull --format compress`,再按 guide 更新 `api.ts` 以获得可读 alias。
95
+ 目录协议只影响本地源码组织。正式 push 始终解析并提交平台真实 Dataset ID;operationType、functionNode 和脚本内容合同不变。
94
96
 
95
97
  ## 文件命名与函数命名
96
98
 
97
99
  | 类型 | 文件名 | 导出函数 |
98
100
  |------|--------|---------|
99
- | HOOK Before | `<name>.js`(位于 `HOOK/<alias>/<operationType>/before/`) | `<name>` |
100
- | HOOK After | `<name>.js`(位于 `HOOK/<alias>/<operationType>/after/`) | `<name>` |
101
+ | HOOK Before | `<name>.js`(位于 `HOOK/<alias-or-datasetCode>/<operationType>/before/`) | `<name>` |
102
+ | HOOK After | `<name>.js`(位于 `HOOK/<alias-or-datasetCode>/<operationType>/after/`) | `<name>` |
101
103
  | ENDPOINT | `<scriptName>.js`(位于 `ENDPOINT/`) | `<scriptName>` |
102
104
  | COMMON | `<scriptName>.js`(位于 `COMMON/`) | `<scriptName>` |
103
105
 
@@ -201,6 +203,14 @@ rabetbase dataset detail --code <datasetCode> --format compress \
201
203
 
202
204
  先确认“远端现在是什么”,再决定是否继续改本地、查页面或查锁状态。
203
205
 
206
+ 需要定位运行时输入、分支或异常时,用只读日志查询缩小范围:
207
+
208
+ * `rabetbase bff logs --since 10 --format compress`
209
+ * `rabetbase bff logs --since 30 --level ERROR --keyword timeout --format compress`
210
+ * 已知精确时段时使用 `--start-time <毫秒时间戳> --end-time <毫秒时间戳>`
211
+
212
+ 日志查询默认最近 30 分钟、最多 200 行。无结果时先核对 App Code 和时间范围,再逐步移除 `level` / `keyword`,不要通过反复执行写操作来制造日志。
213
+
204
214
  ### Step 5:自检
205
215
 
206
216
  至少检查:
@@ -94,6 +94,7 @@ rabetbase dataset detail --code <数据集编码> --format compress \
94
94
  执行 `rabetbase bff push --type <type> --name <name> --format json`:
95
95
  * 成功项进入 `uploaded`
96
96
  * 未变更项进入 `skipped: unchanged`
97
+ * 同步分歧进入 `conflicts`;逐项审阅 `lockKey`、`code` 和 `nextAction`,不要将它们说成失败
97
98
  * 失败项进入 `failed`
98
99
 
99
100
  ### 9. 运行态 smoke(按需)
@@ -114,11 +115,19 @@ lovrabet bff exec --appcode <appCode> --name <functionName> --params '<json>' --
114
115
  ### 10. 本地文件
115
116
  脚本内容直接保存在本地文件中,纳入 Git 管理。路径遵循 `.rabetbase/bff/<appCode>/` 目录约定(详见 `backend-function.md`):
116
117
  * ENDPOINT → `.rabetbase/bff/<appCode>/ENDPOINT/<name>.js`
117
- * HOOK → `.rabetbase/bff/<appCode>/HOOK/<alias>/<operationType>/<functionNode>/<name>.js`
118
+ * HOOK → `.rabetbase/bff/<appCode>/HOOK/<alias-or-datasetCode>/<operationType>/<functionNode>/<name>.js`
118
119
  * COMMON → `.rabetbase/bff/<appCode>/COMMON/<name>.js`
119
120
 
121
+ `bff create` 使用 Dataset alias;没有可用 alias(例如已删除 Dataset 遗留的 HOOK)时,CLI 使用 Dataset code 目录。`bff pull` 会将 lock 跟踪的旧表名或过期 alias 目录安全迁移到当前 SDK alias;当前没有 alias 时迁移到 Dataset code。目标目录冲突、映射歧义或无法安全迁移时,命令会失败而不会覆盖本地脚本;先用 `--dry-run` 查看迁移计划。
122
+
120
123
  ## 冲突处理
121
124
 
125
+ 若返回 `conflicts`:
126
+ * 告知用户冲突的 `lockKey`、`code` 和 `nextAction`
127
+ * `BFF_LOCAL_UNSYNCED`:审阅本地脚本;确认本地版本应生效后,执行该项精确 `bff push` 命令更新远端
128
+ * `BFF_REMOTE_VERSION_CHANGED` / `BFF_REMOTE_VERSION_MISSING`:保留本地脚本,先执行该项 `bff detail` 命令读取远端源码,合并后再重试 push
129
+ * 不要自动使用 `--force`、盲目重试整批脚本,或将同步分歧报告为失败
130
+
122
131
  若返回 `failed`:
123
132
  * 告知用户失败的 `lockKey` 和错误原因
124
133
  * 不要假装成功
@@ -37,6 +37,8 @@
37
37
  - `--dry-run` 预览成功,不等于远端已执行
38
38
  - 命令执行失败时,不能用“已处理”“已保存”这类表述蒙混过去
39
39
 
40
+ **BFF 同步分歧例外**:`bff pull` / `bff push` 的 `data.conflicts` 表示可恢复的本地与远端分歧,不是 `failed`。必须报告每项 `lockKey`、`code` 和 `nextAction`;`BFF_LOCAL_UNSYNCED` 经审阅后可精确 push 更新远端,`BFF_REMOTE_VERSION_CHANGED` / `BFF_REMOTE_VERSION_MISSING` 则先用其 `bff detail` 命令读取远端源码并合并。两类场景都不得自动 `--force` 或声称已完成同步。
41
+
40
42
  ---
41
43
 
42
44
  ## AI 的沟通义务