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

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 (374) hide show
  1. package/lib/api/api-doc.js +1 -1
  2. package/lib/api/fetch-model-list.js +1 -1
  3. package/lib/api/generate-api-file.js +1 -1
  4. package/lib/api/generate-sdk-config-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/logs.d.ts +7 -0
  38. package/lib/commands/bff/logs.js +1 -0
  39. package/lib/commands/bff/pull.js +1 -1
  40. package/lib/commands/bff/push.js +1 -1
  41. package/lib/commands/bff/status.js +1 -1
  42. package/lib/commands/cli-skill/index.js +1 -1
  43. package/lib/commands/cli-update.js +1 -1
  44. package/lib/commands/codegen/index.js +1 -1
  45. package/lib/commands/codegen/sdk.js +1 -1
  46. package/lib/commands/codegen/sql.js +1 -1
  47. package/lib/commands/common/app-registry.js +1 -1
  48. package/lib/commands/common/app-selector.js +1 -1
  49. package/lib/commands/common/async-task.js +1 -1
  50. package/lib/commands/common/dry-run.js +1 -1
  51. package/lib/commands/common/flags.js +1 -1
  52. package/lib/commands/common/local-file.js +1 -1
  53. package/lib/commands/common/validate.js +1 -1
  54. package/lib/commands/config/delete.js +1 -1
  55. package/lib/commands/config/get.js +1 -1
  56. package/lib/commands/config/index.js +1 -1
  57. package/lib/commands/config/init.js +1 -1
  58. package/lib/commands/config/list.js +1 -1
  59. package/lib/commands/config/set.js +1 -1
  60. package/lib/commands/config/shared.js +1 -1
  61. package/lib/commands/dataset/batch-design.d.ts +21 -0
  62. package/lib/commands/dataset/batch-design.js +1 -0
  63. package/lib/commands/dataset/business-group-update.js +1 -1
  64. package/lib/commands/dataset/business-groups.js +1 -1
  65. package/lib/commands/dataset/capability.js +1 -1
  66. package/lib/commands/dataset/delete.js +1 -1
  67. package/lib/commands/dataset/detail.js +1 -1
  68. package/lib/commands/dataset/extend-update.js +1 -1
  69. package/lib/commands/dataset/field-restore.js +1 -1
  70. package/lib/commands/dataset/field-update.js +1 -1
  71. package/lib/commands/dataset/generate.js +1 -1
  72. package/lib/commands/dataset/index.js +1 -1
  73. package/lib/commands/dataset/list.js +1 -1
  74. package/lib/commands/dataset/operations.js +1 -1
  75. package/lib/commands/dataset/relation-audit.js +1 -1
  76. package/lib/commands/dataset/relation-create.js +1 -1
  77. package/lib/commands/dataset/relation-delete.js +1 -1
  78. package/lib/commands/dataset/relation-shared.js +1 -1
  79. package/lib/commands/dataset/relation-update.js +1 -1
  80. package/lib/commands/dataset/relations.js +1 -1
  81. package/lib/commands/dataset/rename.js +1 -1
  82. package/lib/commands/dataset/restore.js +1 -1
  83. package/lib/commands/dataset/user-deleted-field-list.js +1 -1
  84. package/lib/commands/db/analysis-batching.js +1 -1
  85. package/lib/commands/db/analyze-batch-plan.js +1 -1
  86. package/lib/commands/db/analyze-cancel.js +1 -1
  87. package/lib/commands/db/analyze-start.js +1 -1
  88. package/lib/commands/db/analyze-status.js +1 -1
  89. package/lib/commands/db/create.js +1 -1
  90. package/lib/commands/db/delete.js +1 -1
  91. package/lib/commands/db/detail.js +1 -1
  92. package/lib/commands/db/diff-refresh-start.js +1 -1
  93. package/lib/commands/db/diff-refresh-status.js +1 -1
  94. package/lib/commands/db/diff.js +1 -1
  95. package/lib/commands/db/index.js +1 -1
  96. package/lib/commands/db/list.js +1 -1
  97. package/lib/commands/db/shared.js +1 -1
  98. package/lib/commands/db/table-diff-shared.js +1 -1
  99. package/lib/commands/db/tables.js +1 -1
  100. package/lib/commands/db/test.js +1 -1
  101. package/lib/commands/db/update.js +1 -1
  102. package/lib/commands/deployment/index.js +1 -1
  103. package/lib/commands/deployment/sync-all.js +1 -1
  104. package/lib/commands/deployment/sync-jobs.js +1 -1
  105. package/lib/commands/deployment/sync-status.js +1 -1
  106. package/lib/commands/doctor.js +1 -1
  107. package/lib/commands/file/index.js +1 -1
  108. package/lib/commands/flow/create.d.ts +2 -0
  109. package/lib/commands/flow/create.js +1 -0
  110. package/lib/commands/flow/detail.d.ts +2 -0
  111. package/lib/commands/flow/detail.js +1 -0
  112. package/lib/commands/flow/index.d.ts +3 -0
  113. package/lib/commands/flow/index.js +1 -0
  114. package/lib/commands/flow/list.d.ts +2 -0
  115. package/lib/commands/flow/list.js +1 -0
  116. package/lib/commands/flow/publish.d.ts +2 -0
  117. package/lib/commands/flow/publish.js +1 -0
  118. package/lib/commands/flow/runtime-resources-shared.d.ts +40 -0
  119. package/lib/commands/flow/runtime-resources-shared.js +1 -0
  120. package/lib/commands/flow/runtime-role-list.d.ts +2 -0
  121. package/lib/commands/flow/runtime-role-list.js +1 -0
  122. package/lib/commands/flow/runtime-role-user-list.d.ts +2 -0
  123. package/lib/commands/flow/runtime-role-user-list.js +1 -0
  124. package/lib/commands/flow/runtime-user-search.d.ts +2 -0
  125. package/lib/commands/flow/runtime-user-search.js +1 -0
  126. package/lib/commands/flow/shared.d.ts +41 -0
  127. package/lib/commands/flow/shared.js +1 -0
  128. package/lib/commands/flow/update.d.ts +2 -0
  129. package/lib/commands/flow/update.js +1 -0
  130. package/lib/commands/flow/validate.d.ts +3 -0
  131. package/lib/commands/flow/validate.js +1 -0
  132. package/lib/commands/instant-api-policy/current.js +1 -1
  133. package/lib/commands/instant-api-policy/index.js +1 -1
  134. package/lib/commands/instant-api-policy/init.js +1 -1
  135. package/lib/commands/instant-api-policy/publish.js +1 -1
  136. package/lib/commands/instant-api-policy/pull.js +1 -1
  137. package/lib/commands/instant-api-policy/revision.js +1 -1
  138. package/lib/commands/instant-api-policy/revisions.js +1 -1
  139. package/lib/commands/instant-api-policy/rollback.js +1 -1
  140. package/lib/commands/instant-api-policy/shared.js +1 -1
  141. package/lib/commands/instant-api-policy/validate.js +1 -1
  142. package/lib/commands/issue/index.js +1 -1
  143. package/lib/commands/issue/nudge.js +1 -1
  144. package/lib/commands/issue/report.js +1 -1
  145. package/lib/commands/issue/shared.js +1 -1
  146. package/lib/commands/kb/create.js +1 -1
  147. package/lib/commands/kb/delete.js +1 -1
  148. package/lib/commands/kb/detail.js +1 -1
  149. package/lib/commands/kb/index.js +1 -1
  150. package/lib/commands/kb/list.js +1 -1
  151. package/lib/commands/kb/search.js +1 -1
  152. package/lib/commands/kb/shared.js +1 -1
  153. package/lib/commands/kb/update.js +1 -1
  154. package/lib/commands/logs/index.js +1 -1
  155. package/lib/commands/menu/asset-update.js +1 -1
  156. package/lib/commands/menu/delete.js +1 -1
  157. package/lib/commands/menu/external-link-create.js +1 -1
  158. package/lib/commands/menu/external-link-update.js +1 -1
  159. package/lib/commands/menu/group-create.js +1 -1
  160. package/lib/commands/menu/group-update.js +1 -1
  161. package/lib/commands/menu/index.js +1 -1
  162. package/lib/commands/menu/list.js +1 -1
  163. package/lib/commands/menu/move.js +1 -1
  164. package/lib/commands/menu/regroup-start.js +1 -1
  165. package/lib/commands/menu/rename.js +1 -1
  166. package/lib/commands/menu/shared/compare-table.js +1 -1
  167. package/lib/commands/menu/shared/delete-plan.js +1 -1
  168. package/lib/commands/menu/shared/facts.js +1 -1
  169. package/lib/commands/menu/shared/index.js +1 -1
  170. package/lib/commands/menu/shared/inquirer.js +1 -1
  171. package/lib/commands/menu/shared/local-pages.js +1 -1
  172. package/lib/commands/menu/shared/logic.js +1 -1
  173. package/lib/commands/menu/shared/mutations.js +1 -1
  174. package/lib/commands/menu/shared/service.js +1 -1
  175. package/lib/commands/menu/shared/sync-core.js +1 -1
  176. package/lib/commands/menu/shared/update-core.js +1 -1
  177. package/lib/commands/menu/shared/valid-url.js +1 -1
  178. package/lib/commands/menu/sync.js +1 -1
  179. package/lib/commands/menu/visibility-update.js +1 -1
  180. package/lib/commands/notification/config-create.js +1 -1
  181. package/lib/commands/notification/config-delete.js +1 -1
  182. package/lib/commands/notification/config-list.js +1 -1
  183. package/lib/commands/notification/config-update.js +1 -1
  184. package/lib/commands/notification/index.js +1 -1
  185. package/lib/commands/notification/shared.js +1 -1
  186. package/lib/commands/ocr/index.js +1 -1
  187. package/lib/commands/page/create.js +1 -1
  188. package/lib/commands/page/custom/detail.js +1 -1
  189. package/lib/commands/page/custom/list.js +1 -1
  190. package/lib/commands/page/custom/publish.js +1 -1
  191. package/lib/commands/page/custom/shared.js +1 -1
  192. package/lib/commands/page/custom/syntax.js +1 -1
  193. package/lib/commands/page/custom/update.js +1 -1
  194. package/lib/commands/page/data-list-status.js +1 -1
  195. package/lib/commands/page/generate-start.js +1 -1
  196. package/lib/commands/page/generate-status.js +1 -1
  197. package/lib/commands/page/index.js +1 -1
  198. package/lib/commands/page/pull.js +1 -1
  199. package/lib/commands/page/push.js +1 -1
  200. package/lib/commands/page/relation-audit.js +1 -1
  201. package/lib/commands/page/restore.js +1 -1
  202. package/lib/commands/page/shared.js +1 -1
  203. package/lib/commands/page/sync.js +1 -1
  204. package/lib/commands/project/create/enhanced-guided-create.js +1 -1
  205. package/lib/commands/project/create/format-elapsed.js +1 -1
  206. package/lib/commands/project/create/main.js +1 -1
  207. package/lib/commands/project/create/materialize-project-template.js +1 -1
  208. package/lib/commands/project/create/project-name.js +1 -1
  209. package/lib/commands/project/create/project-template-archive.js +1 -1
  210. package/lib/commands/project/create/project-template-path.js +1 -1
  211. package/lib/commands/project/create/use-copy-project-template.js +1 -1
  212. package/lib/commands/project/create/use-format-code.js +1 -1
  213. package/lib/commands/project/create/use-install-dependencies.js +1 -1
  214. package/lib/commands/project/domain-routing-sync.js +1 -1
  215. package/lib/commands/project/index.js +1 -1
  216. package/lib/commands/project/upgrade.js +1 -1
  217. package/lib/commands/registry.js +1 -1
  218. package/lib/commands/role/delete.js +1 -1
  219. package/lib/commands/role/detail.js +1 -1
  220. package/lib/commands/role/index.js +1 -1
  221. package/lib/commands/role/list.js +1 -1
  222. package/lib/commands/role/shared.js +1 -1
  223. package/lib/commands/role/update.js +1 -1
  224. package/lib/commands/role/user-add.js +1 -1
  225. package/lib/commands/role/user-remove.js +1 -1
  226. package/lib/commands/role/user-resolve.js +1 -1
  227. package/lib/commands/rule/get.js +1 -1
  228. package/lib/commands/rule/index.js +1 -1
  229. package/lib/commands/rule/list.js +1 -1
  230. package/lib/commands/rule/set.js +1 -1
  231. package/lib/commands/rule/shared.js +1 -1
  232. package/lib/commands/run/index.js +1 -1
  233. package/lib/commands/schema.js +1 -1
  234. package/lib/commands/sql/create.js +1 -1
  235. package/lib/commands/sql/delete.js +1 -1
  236. package/lib/commands/sql/detail.js +1 -1
  237. package/lib/commands/sql/exec.js +1 -1
  238. package/lib/commands/sql/index.js +1 -1
  239. package/lib/commands/sql/list.js +1 -1
  240. package/lib/commands/sql/pull.js +1 -1
  241. package/lib/commands/sql/push.js +1 -1
  242. package/lib/commands/sql/shared.js +1 -1
  243. package/lib/commands/sql/status.js +1 -1
  244. package/lib/commands/sql/validate.js +1 -1
  245. package/lib/commands/task/index.js +1 -1
  246. package/lib/commands/task/status.js +1 -1
  247. package/lib/commands/tenant/index.js +1 -1
  248. package/lib/commands/tenant/members-list.js +1 -1
  249. package/lib/commands/tenant/shared.js +1 -1
  250. package/lib/commands/user-account/dingding-sandbox-bind.js +1 -1
  251. package/lib/commands/user-account/index.js +1 -1
  252. package/lib/commands/workspace/add.js +1 -1
  253. package/lib/commands/workspace/index.js +1 -1
  254. package/lib/commands/workspace/remove.js +1 -1
  255. package/lib/config/domain-config.js +1 -1
  256. package/lib/config/project-domain-routing.js +1 -1
  257. package/lib/config/region-config.js +1 -1
  258. package/lib/config/schema.js +1 -1
  259. package/lib/constant/cdn.js +1 -1
  260. package/lib/constant/cli.js +1 -1
  261. package/lib/constant/defaults.js +1 -1
  262. package/lib/constant/domain.js +1 -1
  263. package/lib/constant/env.js +1 -1
  264. package/lib/constant/output.js +1 -1
  265. package/lib/constant/paths.js +1 -1
  266. package/lib/constant/region.js +1 -1
  267. package/lib/constant/risk.js +1 -1
  268. package/lib/constant/routing-profile.js +1 -1
  269. package/lib/context/app-resolver.js +1 -1
  270. package/lib/context/auth-resolver.js +1 -1
  271. package/lib/context/config-loader.js +1 -1
  272. package/lib/context.js +1 -1
  273. package/lib/core/alias-resolver.js +1 -1
  274. package/lib/core/api-client.d.ts +170 -1
  275. package/lib/core/api-client.js +1 -1
  276. package/lib/core/bff/config.js +1 -1
  277. package/lib/core/bff/file-system.js +1 -1
  278. package/lib/core/bff/hash.js +1 -1
  279. package/lib/core/bff/hook-directory.d.ts +55 -0
  280. package/lib/core/bff/hook-directory.js +1 -0
  281. package/lib/core/bff/lock.js +1 -1
  282. package/lib/core/bff/types.d.ts +15 -0
  283. package/lib/core/bff/utils.js +1 -1
  284. package/lib/core/db-resolver.js +1 -1
  285. package/lib/core/flow-config.d.ts +628 -0
  286. package/lib/core/flow-config.js +1 -0
  287. package/lib/core/instant-api-policy/config.js +1 -1
  288. package/lib/core/kb-search-client.js +1 -1
  289. package/lib/core/page/file-system.js +1 -1
  290. package/lib/core/page/hash.js +1 -1
  291. package/lib/core/page/lock.js +1 -1
  292. package/lib/core/page/lr-smart-jsx.js +1 -1
  293. package/lib/core/sql-index-auditor.js +1 -1
  294. package/lib/core/sql-sync/config.js +1 -1
  295. package/lib/core/sql-sync/file-system.js +1 -1
  296. package/lib/core/sql-sync/hash.js +1 -1
  297. package/lib/core/sql-sync/lock.js +1 -1
  298. package/lib/core/sql-sync/utils.js +1 -1
  299. package/lib/core/sql-validator.js +1 -1
  300. package/lib/errors.js +1 -1
  301. package/lib/framework/build-all-flags.js +1 -1
  302. package/lib/framework/error-output.js +1 -1
  303. package/lib/framework/explicit-yes.js +1 -1
  304. package/lib/framework/flags.js +1 -1
  305. package/lib/framework/help.js +1 -1
  306. package/lib/framework/index.js +1 -1
  307. package/lib/framework/output.js +1 -1
  308. package/lib/framework/response.js +1 -1
  309. package/lib/framework/runner-alias.js +1 -1
  310. package/lib/framework/runner.js +1 -1
  311. package/lib/framework/schema-export.js +1 -1
  312. package/lib/framework/supported-flags.js +1 -1
  313. package/lib/framework/types.js +1 -1
  314. package/lib/generated/build-info.d.ts +4 -4
  315. package/lib/generated/build-info.js +1 -1
  316. package/lib/generated/official-routing.js +1 -1
  317. package/lib/generated/routing-contract.js +1 -1
  318. package/lib/help.js +1 -1
  319. package/lib/postinstall.js +1 -1
  320. package/lib/runtime/confirmation.js +1 -1
  321. package/lib/runtime/event.js +1 -1
  322. package/lib/runtime/index.js +1 -1
  323. package/lib/runtime/queue.js +1 -1
  324. package/lib/runtime/resolve.js +1 -1
  325. package/lib/skills/builtin-skill.js +1 -1
  326. package/lib/skills/main.js +1 -1
  327. package/lib/skills/npx-skills-add.js +1 -1
  328. package/lib/skills/skill-presence.js +1 -1
  329. package/lib/telemetry/cli-command-trace.js +1 -1
  330. package/lib/telemetry/cli-help-trace.js +1 -1
  331. package/lib/telemetry/ensure-cli-otel-config.js +1 -1
  332. package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
  333. package/lib/telemetry/send-cli-trace-log.js +1 -1
  334. package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
  335. package/lib/utils/ai_config.js +1 -1
  336. package/lib/utils/apply-jq-filter.js +1 -1
  337. package/lib/utils/cdn-config.js +1 -1
  338. package/lib/utils/check-sdk-version.js +1 -1
  339. package/lib/utils/cli-version-check.js +1 -1
  340. package/lib/utils/cli-version-policy.js +1 -1
  341. package/lib/utils/config.js +1 -1
  342. package/lib/utils/entity-with-id.js +1 -1
  343. package/lib/utils/file-utils.js +1 -1
  344. package/lib/utils/guides-cdn.js +1 -1
  345. package/lib/utils/http-client.js +1 -1
  346. package/lib/utils/is-non-interactive.js +1 -1
  347. package/lib/utils/logger.js +1 -1
  348. package/lib/utils/params.js +1 -1
  349. package/lib/utils/platform.js +1 -1
  350. package/lib/utils/sleep.js +1 -1
  351. package/lib/utils/template-replacer.js +1 -1
  352. package/lib/utils/update-notice.js +1 -1
  353. package/lib/utils/version.js +1 -1
  354. package/lib/utils/with-active-cookie.js +1 -1
  355. package/lib/utils/write-cli-side-channel.js +1 -1
  356. package/package.json +1 -1
  357. package/skills/rabetbase/SKILL.md +22 -4
  358. package/skills/rabetbase/guides/approval-flow-development-workflow.md +137 -0
  359. package/skills/rabetbase/guides/backend-function.md +19 -9
  360. package/skills/rabetbase/guides/bff-creation-workflow.md +10 -1
  361. package/skills/rabetbase/guides/conflict-detection.md +2 -0
  362. package/skills/rabetbase/guides/sdk-client-generation.md +1 -0
  363. package/skills/rabetbase/knowledge/approval-flow/config-json-schema.md +290 -0
  364. package/skills/rabetbase/references/rabetbase-bff-create.md +1 -1
  365. package/skills/rabetbase/references/rabetbase-bff-logs.md +47 -0
  366. package/skills/rabetbase/references/rabetbase-bff-pull.md +7 -3
  367. package/skills/rabetbase/references/rabetbase-bff-push.md +10 -2
  368. package/skills/rabetbase/references/rabetbase-dataset-generate.md +52 -2
  369. package/skills/rabetbase/references/rabetbase-flow-commands.md +86 -0
  370. package/skills/rabetbase/references/rabetbase-flow-resources.md +83 -0
  371. package/skills/rabetbase/references/rabetbase-flow-runtime-boundary.md +25 -0
  372. package/skills/rabetbase/references/rabetbase-instant-api-policy.md +103 -11
  373. package/skills/rabetbase/references/rabetbase-notification-config-list.md +17 -0
  374. package/skills/rabetbase.manifest.json +9 -3
@@ -0,0 +1,290 @@
1
+ # Rabetbase FlowConfig 契约
2
+
3
+ 本文件描述 `rabetbase flow validate/create/update/detail --output` 使用的可移植本地清单。服务端生成的 id、编码、状态和部署信息不属于本地文件。
4
+
5
+ ## 外层结构
6
+
7
+ ```json
8
+ {
9
+ "flowName": "采购审批",
10
+ "flowDesc": "采购申请的主管审批",
11
+ "flowType": "INDEPENDENT_FLOW",
12
+ "flowJson": {
13
+ "pageMode": "CUSTOM_PAGE",
14
+ "startPageId": 10001,
15
+ "nodes": [],
16
+ "edges": []
17
+ }
18
+ }
19
+ ```
20
+
21
+ 必填字段:
22
+
23
+ - `flowName`:非空流程名称。
24
+ - `flowType`:`FORM_FLOW` 或 `INDEPENDENT_FLOW`,不得根据节点或数据集绑定推断。
25
+ - `flowJson.nodes`:非空节点数组。
26
+ - `flowJson.edges`:非空连线数组。
27
+
28
+ 可选字段:`flowDesc`、`datasetCode`、`pageId`。
29
+
30
+ `flowType` 是产品语义分类,不由节点形状推断:
31
+
32
+ - `FORM_FLOW`:表单审批流,可以配置 `datasetCode`、`pageId`;人工节点只允许 `taskMode: "APPROVAL"`,禁止 `HANDLE`。
33
+ - `INDEPENDENT_FLOW`:独立工作流,不能配置外层 `datasetCode` 或外层 `pageId`;可以同时使用 `APPROVAL` 和 `HANDLE`。
34
+
35
+ 独立工作流中出现审批节点不会把它变成表单审批流。需要填写、补充材料、执行或确认等人工办理步骤时使用 `INDEPENDENT_FLOW + HANDLE`。
36
+
37
+ `flowJson.pageMode` 只适用于 `INDEPENDENT_FLOW`:
38
+
39
+ - `CUSTOM_PAGE`:业务自定义页面,缺省时按此值处理。
40
+ - `PLATFORM_FORM`:服务端的平台表单页面语义;当前 Skill 和 CLI 不支持生成或提交。
41
+
42
+ `FORM_FLOW` 不得配置 `pageMode`。自定义页面 SDK/OpenAPI 只返回 `INDEPENDENT_FLOW + CUSTOM_PAGE`。
43
+
44
+ `INDEPENDENT_FLOW + CUSTOM_PAGE` 可选配置正整数 `flowJson.startPageId`,并在 `APPROVAL` 人工节点上可选配置正整数 `pageId`。二者只用于页面跳转,不参与流程执行或业务判断;缺失时调用方自行选择页面。其他流程类型、`PLATFORM_FORM` 或非人工节点不得配置这两个导航字段。
45
+
46
+ 本地 FlowConfig 必须显式填写 `flowType`。CLI 不再利用服务端的历史默认值推断为 `FORM_FLOW`,避免表单审批流和独立工作流混用。
47
+
48
+ Skill 根据业务逻辑直接生成完整 `nodes + edges` 拓扑,不读取或填写 SmartCode `templateName`。
49
+
50
+ `appCode` 来自当前 CLI 工作区,远程定义 `id` 来自 `--id`。二者都不落本地文件。
51
+
52
+ ## 规范化
53
+
54
+ `normalizeFlowConfig` 不修改调用方对象,并对下列旧字段产生 warning 后从规范结果移除:
55
+
56
+ - 外层:`id`、`appCode`、`templateName`
57
+ - `flowJson`:`flowKey`、`flowCode`、`flowName`、`bindDatasetCode`、`datasetCode`、`appCode`、`pageId`、`templateName`
58
+ - 任意层级值为空的 `metadata`
59
+
60
+ `flowJson.schemaVersion` 按 SmartCode 规则单独处理:空值或默认值 `approval.simple-flow.v1` 会警告并移除;其他值保留在规范结果中,并由本地校验明确返回 `Unsupported schemaVersion`。这样不会把未知或未来版本静默降级为 v1。
61
+
62
+ `flow validate --write-normalized` 只写规范结果。校验器从外层元数据创建独立内存副本,临时注入编译上下文;这些值不会污染文件。
63
+
64
+ ## 页面模式
65
+
66
+ 使用 `INDEPENDENT_FLOW + CUSTOM_PAGE` 时:
67
+
68
+ - 采购申请等业务数据由自定义页面直接读写业务数据集,并按业务状态展示不同页面和操作。
69
+ - 流程只保存路由、办理人、脚本、通知等执行配置;页面通过 SDK 发起或办理任务,成功后自行更新业务状态。
70
+ - 禁止 `flowJson.formSchema`、`flowJson.formDefinitions`、`flowJson.formPermissions`、节点 `form`、节点 `formPermission` 和 `cc.readSources`。
71
+ - `validate/create/update/detail --output` 遇到上述字段会明确报错,不会静默删除或导出丢字段的文件。普通 `detail` 仍可只读查看远端原始定义。
72
+
73
+ `INDEPENDENT_FLOW + PLATFORM_FORM` 使用平台表单能力,不属于自定义页面 SDK 的返回范围。当前 CLI 只识别该服务端语义用于明确报错,`validate/create/update/detail --output` 均拒绝生成或提交此模式;Skill 必须返回 `NEEDS_DSL_EXTENSION`。普通 `detail` 仍可只读查看远端原始定义。
74
+
75
+ ## 通用节点
76
+
77
+ ```json
78
+ {
79
+ "id": "managerApprove",
80
+ "type": "APPROVAL",
81
+ "name": "主管审批",
82
+ "position": { "x": 300, "y": 180 }
83
+ }
84
+ ```
85
+
86
+ - 支持 `START`、`END`、`APPROVAL`、`CONDITION`、`SCRIPT`、`NOTIFICATION`。
87
+ - 每个节点都必须有非空 `name`。
88
+ - 每个节点都必须显式提供有限且大于等于 0 的 `position.x/y`。
89
+ - 节点 ID 和边 ID 使用 `[A-Za-z_][A-Za-z0-9_]*`。
90
+ - 节点和边共用一个 BPMN ID 命名空间,任何元素都不能重名。
91
+
92
+ ## 图结构
93
+
94
+ - 必须且只能有一个 `START`,至少有一个 `END`。
95
+ - `START` 无入边,`END` 无出边;其他节点必须同时满足必要的入边/出边要求。
96
+ - 所有节点必须从 `START` 可达,并且每个可达节点都必须存在一条通往某个 `END` 的路径。
97
+ - 支持自环、回退连线和多节点有向环;环路必须保留能够到达 `END` 的退出路径,不能形成无出口闭环。
98
+ - 相同 `source + target + conditionType` 只能出现一次,即使边 ID 或 expression 不同。
99
+
100
+ ## APPROVAL
101
+
102
+ ```json
103
+ {
104
+ "id": "managerApprove",
105
+ "type": "APPROVAL",
106
+ "name": "主管审批",
107
+ "pageId": 10002,
108
+ "position": { "x": 300, "y": 180 },
109
+ "taskMode": "APPROVAL",
110
+ "approvalMode": "SINGLE",
111
+ "sequential": false,
112
+ "assignee": {
113
+ "strategy": "FIXED",
114
+ "userIds": ["82"]
115
+ },
116
+ "transferCandidates": {
117
+ "strategy": "FIXED",
118
+ "userIds": ["15023", "16001"]
119
+ }
120
+ }
121
+ ```
122
+
123
+ - `taskMode` 支持 `APPROVAL`、`HANDLE`;省略时按 `APPROVAL`。`FORM_FLOW` 只能使用 `APPROVAL`,`HANDLE` 仅允许出现在 `INDEPENDENT_FLOW`。
124
+ - `pageId` 可省略;仅 `INDEPENDENT_FLOW + CUSTOM_PAGE` 的 `APPROVAL` 人工节点可配置,用于待办、已办和任务详情跳转,不影响节点执行。
125
+ - `approvalMode` 支持 `SINGLE`、`ALL`、`ANY`;省略时按 `SINGLE`。`sequential` 控制多办理人是否顺序执行,默认 `false`。
126
+ - `FIXED` 需要非空有效 `userIds`;`SINGLE + FIXED` 只能有一个不同用户。
127
+ - `ROLE` 需要正整数 `roleId`。
128
+ - `transferCandidates` 可省略;存在时只支持 `FIXED`,且 `userIds` 必须非空,每项为非空字符串或正整数。
129
+ - `taskMode: "APPROVAL"` 必须且只能有一条 `APPROVED` 出边和一条 `REJECTED` 出边,两条边都不能是默认边。
130
+ - `taskMode: "HANDLE"` 必须且只能有一条 `ALWAYS` 出边,不能配置 `defaultFlow` 或 `expression`;办理完成后直接沿该边继续。
131
+ - 只要流程包含决策型 `APPROVAL` 任务,就必须同时存在 `result: "APPROVED"` 和 `result: "REJECTED"` 的 END 节点。只有 `HANDLE` 的流程不要求这两个结果节点。
132
+
133
+ ### HANDLE 后续路由
134
+
135
+ - `HANDLE` 自身不选择业务分支。自定义页面可在办理请求中的 `variables` 更新业务变量,或通过 `formPatch` 增量更新 `formData`;任务完成后,下游节点读取更新后的值。
136
+ - 路由变量已准备好时使用 `HANDLE → CONDITION`,由 CONDITION 的表达式和默认边决定后续路径。
137
+ - 需要 Backend Function 先计算、校验或归一化路由变量时使用 `HANDLE → SCRIPT → CONDITION`;不需要计算时可省略 SCRIPT。
138
+ - 不允许给 HANDLE 配置多条出边,也不允许通过 `targetNodeId` 让调用方直接选择目标节点。办理节点存在多个业务结果不应判定为 `NEEDS_DSL_EXTENSION`,因为分支职责属于下游 CONDITION。
139
+
140
+ ### 审批超时
141
+
142
+ `APPROVAL.timeout.enabled=true` 时必须配置正整数 `duration.value` 和 `SECONDS/MINUTES/HOURS/DAYS` 单位:
143
+
144
+ - `AUTO_APPROVE`、`AUTO_REJECT` 必须中断当前任务,`interrupting` 省略时默认 `true`。
145
+ - `EXECUTE_BFF` 必须配置 `scriptName`,不能中断当前任务,`interrupting` 省略时默认 `false`;可用 `resultVariable` 保存结果。
146
+ - `HANDLE` 超时只支持 `EXECUTE_BFF`。
147
+
148
+ ## CONDITION
149
+
150
+ ```json
151
+ [
152
+ {
153
+ "id": "edge_amount_finance",
154
+ "source": "amountCheck",
155
+ "target": "financeApprove",
156
+ "conditionType": "EXPRESSION",
157
+ "expression": "${formData.amount > 10000}"
158
+ },
159
+ {
160
+ "id": "edge_amount_default",
161
+ "source": "amountCheck",
162
+ "target": "approvedEnd",
163
+ "conditionType": "ALWAYS",
164
+ "defaultFlow": true
165
+ }
166
+ ]
167
+ ```
168
+
169
+ - CONDITION 至少有两条出边。
170
+ - 必须且只能有一条 `defaultFlow: true`。
171
+ - 默认边必须使用 `ALWAYS`,且不能定义 `expression`。
172
+ - 其余边必须使用 `EXPRESSION`,且必须有非空 `expression`。
173
+
174
+ 表达式直接读取顶层流程变量;例如发起或办理请求中的 `variables.amount` 在表达式中写作 `${amount > 10000}`,`formData` 字段写作 `${formData.amount > 10000}`。生成表达式前先按开发工作流建立变量契约,不猜测变量名或类型。
175
+
176
+ ## SCRIPT
177
+
178
+ ```json
179
+ {
180
+ "id": "checkPrice",
181
+ "type": "SCRIPT",
182
+ "name": "价格校验",
183
+ "position": { "x": 520, "y": 180 },
184
+ "scriptName": "checkProductPrice",
185
+ "resultVariable": "priceCheckResult",
186
+ "async": {
187
+ "enabled": true,
188
+ "retryCount": 3,
189
+ "retryInterval": { "value": 30, "unit": "SECONDS" }
190
+ }
191
+ }
192
+ ```
193
+
194
+ - `scriptName` 必填。
195
+ - `resultVariable` 可省略;Runtime 省略时写入默认变量 `scriptResult`。存在时必须符合变量命名规则并在流程内唯一;多个 SCRIPT 或 `EXECUTE_BFF` 超时动作必须显式配置不同的结果变量,避免默认值互相覆盖。
196
+ - 禁止 `formData`、`approved` 和 `approval_sys_` 前缀。
197
+ - 表达式引用某个 `resultVariable` 时,产生该变量的 SCRIPT 必须位于引用边 source 的所有上游路径;SCRIPT 自己的出边可以读取刚写入的结果。
198
+ - `async.enabled=true` 时使用 Flowable 异步 Job;`retryCount` 默认 3、范围 1~10,`retryInterval` 默认 30 秒,也支持 `MINUTES/HOURS/DAYS`。
199
+ - SCRIPT 接收当前流程变量作为顶层 `params`,并额外收到 `params.approvalContext`;因此业务变量 `amount`、表单字段 `formData.amount` 分别通过 `params.amount`、`params.formData.amount` 读取,不使用 `params.variables` 包装。
200
+
201
+ ## 节点默认抄送
202
+
203
+ APPROVAL 和 END 节点可配置 `cc.recipientUserIds`。APPROVAL 在整个节点办理结束后创建默认只读抄送记录(会签/或签不会按每个办理人重复抄送),END 在到达结果节点后创建。用户 ID 必须是 1~100 个不重复的非空字符串;`visible` 可限制可见表单字段。抄送详情的 `businessVariables` 从流程当前 variables 中读取,并过滤 `approval_sys_*`、`formData` 和 `approved`;当前页面模式不支持 `cc.readSources`。
204
+
205
+ ## NOTIFICATION
206
+
207
+ ```json
208
+ {
209
+ "id": "notifyApproved",
210
+ "type": "NOTIFICATION",
211
+ "name": "发送审批结果通知",
212
+ "position": { "x": 740, "y": 180 },
213
+ "config": {
214
+ "version": "v1",
215
+ "configCode": "approval_email",
216
+ "failurePolicy": "CONTINUE",
217
+ "template": {
218
+ "title": "审批结果通知",
219
+ "summary": "${event.initiatorUsername} 发起的申请已经${event.approvalResultName}",
220
+ "facts": [
221
+ {
222
+ "label": "申请金额",
223
+ "value": "${variables.formData.amount}"
224
+ }
225
+ ],
226
+ "detailMarkdown": "**审批节点:** ${context.nodeName}",
227
+ "actions": [
228
+ {
229
+ "text": "审批详情页",
230
+ "url": "${context.detailUrl}"
231
+ }
232
+ ]
233
+ },
234
+ "recipients": [
235
+ {
236
+ "type": "USER",
237
+ "role": "TO",
238
+ "value": "${event.initiatorUserId}"
239
+ }
240
+ ]
241
+ }
242
+ }
243
+ ```
244
+
245
+ 配置规则:
246
+
247
+ - `version` 可省略或留空,默认 `v1`;当前只支持 `v1`。
248
+ - `configCode` 必须是从 `notification config-list` 选出的固定非空值,不能使用占位符、渠道名、URL、dataset code 或凭据。
249
+ - `failurePolicy` 支持 `CONTINUE`、`FAIL`,默认 `CONTINUE`。
250
+ - `template` 必填;不要输出 `theme` 或 `templateType`。
251
+ - `template.title`、`template.summary` 必须是非空字符串。
252
+ - `template.detailMarkdown` 可选,存在时必须是字符串。
253
+ - `template.facts` 可选,最多 8 项;每项需要非空 `label`、`value`。
254
+ - `template.actions` 可选,最多 2 项;每项需要非空 `text`、`url`。
255
+ - `actions[].url` 必须使用 `http://`、`https://`,或完整受支持占位符,例如 `${context.detailUrl}`。
256
+
257
+ 占位符只允许以下命名空间,且根名称区分大小写:
258
+
259
+ ```text
260
+ ${event.xxx}
261
+ ${context.xxx}
262
+ ${variables.xxx}
263
+ ```
264
+
265
+ 不要使用 `{appCode}`、`${appCode}` 或其他未声明根命名空间。模板标题、摘要、facts、detailMarkdown、actions 和收件人 value 都执行该检查。
266
+
267
+ 收件人规则:
268
+
269
+ - `recipients` 可省略或为空,此时使用渠道配置的默认目标。
270
+ - 显式项的 `type` 支持 `USER`、`ROLE`、`EMAIL`。
271
+ - `value` 必须是非空固定值或受支持占位符。
272
+ - `role` 可选,支持 `TO`、`CC`、`BCC`,默认 `TO`。
273
+ - 非空显式列表至少包含一个 `TO`。
274
+ - `CC`、`BCC` 只对 EMAIL 渠道有效。
275
+ - 显式收件人只用于 EMAIL 或飞书 APP 机器人;钉钉、企业微信、通用 Webhook 和飞书 Webhook 使用渠道默认目标。
276
+ - 飞书显式收件人应使用 `TO`,并符合渠道配置的 `receiveIdType`。
277
+
278
+ 本地 validator 可确定并检查 version、模板必填字段、数量上限、action URL、占位符语法和 recipients 结构。`configCode` 是否存在、渠道是否支持显式收件人、模板变量解析后的真实值仍以服务端为准。
279
+
280
+ ## 本地校验边界
281
+
282
+ 当前本地校验统一由 `rabetbase flow validate` 调用内置 TS validator,覆盖本文明确列出的本地结构、规范化、节点配置、NOTIFICATION 可确定规则和图拓扑规则。Skill 不维护额外的校验脚本。
283
+
284
+ 本地校验不能确认:
285
+
286
+ - userId、roleId、datasetCode、pageId、scriptName、configCode 是否在目标环境真实存在。
287
+ - `configCode` 对应的当前通知渠道是否支持指定模板或显式收件人。
288
+ - 服务端保存、编译、部署和 Runtime 执行是否成功。
289
+
290
+ 这些结果必须分别通过资源发现命令、服务端 flow 命令响应和 Runtime 验证确认。
@@ -29,7 +29,7 @@ rabetbase bff create --type HOOK --name beforeFilter --alias appUser --operation
29
29
  |------|------|
30
30
  | ENDPOINT | `.rabetbase/bff/<appCode>/ENDPOINT/<name>.js` |
31
31
  | COMMON | `.rabetbase/bff/<appCode>/COMMON/<name>.js` |
32
- | HOOK | `.rabetbase/bff/<appCode>/HOOK/<alias-or-datasetCode>/<operationType>/<functionNode>/<name>.js` |
32
+ | HOOK 草稿 | `.rabetbase/bff/<appCode>/HOOK/<alias-or-datasetCode>/<operationType>/<functionNode>/<name>.js` |
33
33
 
34
34
  Backend Function 源码**仅**应在此目录树内创建与长期维护(与 `bff status` / `bff push` 扫描一致);不要在本仓库其他路径手写 Backend Function 再尝试推送。
35
35
 
@@ -0,0 +1,47 @@
1
+ # bff logs
2
+
3
+ 查询当前 App 的 Backend Function 运行日志,用于开发调试。命令只读,不执行或修改脚本。
4
+
5
+ ## 命令
6
+
7
+ ```bash
8
+ rabetbase bff logs --format compress
9
+ rabetbase bff logs --since 10 --level ERROR --keyword timeout --format compress
10
+ rabetbase bff logs --start-time 1788433200000 --end-time 1788435000000 --limit 500 --format json
11
+ ```
12
+
13
+ ## 参数
14
+
15
+ | Flag | 类型 | 必填 | 默认 | 说明 |
16
+ |------|------|------|------|------|
17
+ | `--app <name>` | string | 否 | — | 多应用模式下指定应用名称 |
18
+ | `--appcode <code>` | string | 否 | — | 直接指定 App Code |
19
+ | `--since <minutes>` | number | 否 | `30` | 从结束时间向前查询的分钟数;不能与 `--start-time` 同时使用 |
20
+ | `--start-time <ms>` | number | 否 | — | 查询开始时间,Unix 毫秒时间戳 |
21
+ | `--end-time <ms>` | number | 否 | 当前时间 | 查询结束时间,Unix 毫秒时间戳 |
22
+ | `--level <level>` | string | 否 | — | `DEBUG` / `INFO` / `WARN` / `ERROR` |
23
+ | `--keyword <text>` | string | 否 | — | 对服务端格式化后的整行日志做关键字过滤 |
24
+ | `--limit <count>` | number | 否 | `200` | 最大返回条数,范围 `1-1000` |
25
+
26
+ ## 时间范围
27
+
28
+ - 未传时间参数时查询最近 30 分钟。
29
+ - `--end-time` 可与 `--since` 配合,查询以指定结束时间为基准的时间窗。
30
+ - 需要精确范围时传 `--start-time`,可同时传 `--end-time`;未传结束时间时使用当前时间。
31
+ - `--since` 与 `--start-time` 互斥,时间戳必须为正整数,开始时间不得晚于结束时间。
32
+
33
+ ## 输出
34
+
35
+ 结构化输出的 `data` 包含:
36
+
37
+ - `query`:最终发送的 `appCode`、`startTime`、`endTime`、可选过滤条件和 `limit`
38
+ - `count`:本次返回的日志行数
39
+ - `logs`:服务端已格式化的原始日志字符串数组
40
+
41
+ 无结果时先确认 App Code、运行环境和时间范围,再逐步移除 `level` 或 `keyword`。不要把查询不到日志解释为脚本一定未执行。
42
+
43
+ ## 参考
44
+
45
+ - [backend-function.md](../guides/backend-function.md)
46
+ - [bff detail](rabetbase-bff-detail.md)
47
+ - [bff status](rabetbase-bff-status.md)
@@ -25,17 +25,21 @@ rabetbase bff pull --type HOOK --force --format json
25
25
  返回:
26
26
  - `pulled`
27
27
  - `skipped`
28
+ - `conflicts`
28
29
  - `failed`
29
30
 
30
- `--dry-run` 时返回预览对象,包含远端脚本、目标 `filePath` 和预期状态(如 `would_pull` / `conflict`)。
31
+ `--dry-run` 时返回预览对象,包含远端脚本、目标 `filePath`、`alias`、`datasetCode`、Hook operation/node 和预期状态(如 `would_pull` / `conflict`)。有已跟踪的旧 HOOK 目录需要迁移时,还会返回 `hookDirectoryMigrations`。
31
32
 
32
33
  远端脚本列表会自动聚合服务端全部分页;不会只同步第一页。
33
34
 
34
35
  ## 提示
35
36
 
36
- - 默认会保护本地未同步改动,冲突时进入 `skipped: local unsynced changes`
37
+ - 默认会保护本地未同步改动,冲突时进入 `conflicts`,包含受审阅约束的 `nextAction`
38
+ - `conflicts[].code=BFF_LOCAL_UNSYNCED` 表示本地脚本自上次 pull 后已修改;先审阅,再在本地版本应成为事实来源时执行 `nextAction.command` 精确推送更新远端。不要把它报告为失败或用 `--force` 覆盖内容
37
39
  - `--dry-run` 不会改本地文件,也不会写 lock
38
- - `HOOK` 落盘目录依赖 alias / datasetCode 解析
40
+ - HOOK 一级目录优先使用 `api.ts` 模型中的 alias;没有 alias 时使用 Dataset code
41
+ - 挂载关系中有明确 Dataset code、但当前 SDK 模型没有 alias 时,仍按原始 Dataset code 下载,不阻断其他脚本;push 更新已有脚本时仍须回读确认脚本身份、版本与挂载关系
42
+ - pull 会将 lock 跟踪的旧表名或过期 alias 目录迁到当前 SDK alias;当前没有 alias 时迁到 Dataset code。若目标目录已存在、旧目录已被另一 Dataset alias 复用且含未跟踪脚本,或本地文件系统无法安全迁移,命令会停止且不覆盖本地脚本
39
43
  - 拉取后建议立刻跑一次 `bff status`
40
44
 
41
45
  ## 参考
@@ -28,12 +28,15 @@ rabetbase bff push --type HOOK --name beforeFilter --format json
28
28
  返回:
29
29
  - `uploaded`
30
30
  - `skipped`
31
+ - `conflicts`
31
32
  - `failed`
32
33
 
33
34
  常见 `skipped` 原因:
34
35
  - `unchanged`
35
36
 
36
- `--dry-run` 时返回预览对象,包含本地 `filePath`、目标模式(`create` / `update`)和预期状态(如 `unchanged` / `would_push`)。
37
+ `--dry-run` 时返回预览对象,包含本地 `filePath`、`alias`、`datasetCode`、Hook operation/node、warning、目标模式(`create` / `update`)和预期状态(如 `unchanged` / `would_push`)。
38
+
39
+ `conflicts[].code=BFF_REMOTE_VERSION_CHANGED` 或 `BFF_REMOTE_VERSION_MISSING` 表示本地 lock 不能安全更新远端脚本。保留本地脚本,先执行 `nextAction.command` 的 `bff detail` 取得远端源码,审阅并合并后再重试;只在明确放弃本地修改时才考虑 `--force`。这类同步分歧不进入 `failed`,其 `nextAction` 仅供审阅后执行。
37
40
 
38
41
  ## 推送前检查
39
42
 
@@ -53,7 +56,12 @@ rabetbase bff push --type HOOK --name beforeFilter --format json
53
56
  - 推送前先跑 `bff status`
54
57
  - `--dry-run` 不会上传远端,也不会改 lock
55
58
  - 精确推单个函数时用 `--type + --name`
56
- - HOOK 推送依赖数据集 alias / datasetCode 和 operationType/functionNode
59
+ - HOOK 优先从 SDK alias 目录解析 Dataset;没有 alias 时 Dataset code 目录保持可读
60
+ - 正式上传仍使用平台真实 Dataset ID,目录名不会替代远端 Dataset 身份
61
+ - 已有 HOOK 的 Dataset 元数据缺失时,CLI 回读脚本 ID、应用、名称、类型、版本及唯一挂载关系;全部与本地 lock 匹配才允许按脚本 ID 更新且不重绑,返回 `EXISTING_HOOK_BINDING_PRESERVED` warning;新建 HOOK 不走此路径
62
+ - 无法解析或查不到目标 Dataset 的 HOOK 单独进入 `failed`,其余可确认目标的脚本继续上传;部分失败时命令返回 `ok: false`,必须检查 `uploaded` 与 `failed`,不要整批盲目重试
63
+ - 预演中无法确认目标的脚本显示 `status: failed` 与 `error`,不会上传或更改 lock
64
+ - alias 与 Dataset code 命名空间碰撞、Dataset 映射漂移或同一 Dataset 出现多个本地目录会在首次远端写入前阻断
57
65
  - HOOK 可挂载 `DB_TABLE` 或 `METADATA` 数据集;METADATA 不支持 SQL / aggregate 路径,脚本中使用平台返回的标准数据操作
58
66
  - 推送成功只代表脚本配置已同步到平台;如需确认最终运行效果,使用运行验证(例如 `lovrabet bff exec --name <functionName> --params '<json>' --format compress`)
59
67
  - 管理态已同步但运行态仍旧版本时,按传播延迟 / 缓存延迟处理:等待后重试,必要时对目标脚本精确执行 `--force` 推送;仍不生效时记录平台运行态缓存风险
@@ -1,6 +1,6 @@
1
1
  # dataset generate-start / generate-status
2
2
 
3
- 从自然语言需求生成可审阅的数据集 design 快照,再基于快照提交异步创建任务,最后查询任务状态拿到新 Dataset。
3
+ 从自然语言需求生成可审阅的单数据集或多数据集批次 design 快照,再基于快照提交异步创建任务,最后查询任务状态拿到完整结果。
4
4
 
5
5
  推荐顺序:
6
6
 
@@ -10,7 +10,36 @@
10
10
 
11
11
  ## 适用范围
12
12
 
13
- 当前能力面向服务端支持的 `METADATA` 数据集生成链路。design 文件结构由服务端返回并由 CLI 原样提交,调用方不需要手写或选择内部 DO 版本。
13
+ 当前能力面向服务端支持的 `METADATA` 数据集生成链路。单数据集保持原协议;批次使用 `kind=dataset-batch`、`schemaVersion=1`,一次创建 1–20 个数据集及其 lookup 关系。
14
+
15
+ ## Batch:一次生成多个关联数据集
16
+
17
+ ```bash
18
+ rabetbase dataset generate-start \
19
+ --batch \
20
+ --description "创建客户和订单数据集,订单通过 customer_id 关联客户 id" \
21
+ --design-output .rabetbase/dataset-designs/customer-orders.json \
22
+ --format compress
23
+ ```
24
+
25
+ 批次 Preview 不需要且不接受 `--name`。审阅文件时确认:`localKey` 唯一且为小写标识;每项 `design.relations` 为空;所有关系只出现在顶层 `relations`;`unresolvedRelations` 仅是待确认提示,不会落库。
26
+
27
+ ```bash
28
+ rabetbase dataset generate-start \
29
+ --apply \
30
+ --design-file .rabetbase/dataset-designs/customer-orders.json \
31
+ --format compress
32
+ ```
33
+
34
+ Apply 会按 `kind` 自动识别批次。`--batch` 可以显式要求输入必须是批次文件。首次提交默认生成 `dataset-batch-...` 恢复 ID;明确恢复或重试同一批时可传 `--client-operation-id <原ID>`。提交超时、响应损坏或未确认批次模式时,错误 `dataset_batch_submit_outcome_unknown` 会保留原 `clientOperationId`;只运行 `data.query.command` 或文本提示中的 status 查询,不要再次 POST。
35
+
36
+ 批次 start 响应必须确认 `mode=batch`。Status 只有同时满足以下条件才返回 `generated_datasets_created`:
37
+
38
+ 1. `expectedLocalKeys` 与 `createdDatasets[].localKey` 精确一致,每项都有真实 code。
39
+ 2. `expectedRelations` 与 `createdRelations` 按来源数据集、来源字段、目标数据集、目标字段、relationType、cardinality 六元组精确一致;字段名比较忽略大小写。
40
+ 3. 集合中不存在缺失、重复或多余项,真实关系携带的数据集 code 与创建结果一致。
41
+
42
+ 否则返回 `unknown_reconcile_failed`。批次输出使用复数 `createdDatasets` / `createdRelations`,不输出单数 `createdDataset`。
14
43
 
15
44
  ## Preview:生成 design 快照
16
45
 
@@ -73,6 +102,21 @@ rabetbase dataset generate-status --client-operation-id dataset-generate-xxx --f
73
102
 
74
103
  `--task-id`、`--operation-id` 与 `--client-operation-id` 必须且只能传一个。taskId 是首选恢复标识;CLI 会把它映射为后端 Dataset status 的 `operationId` query,服务端接口本身没有原生 taskId query。只有 status 输出 `status=generated_dataset_created` 且包含非空 `createdDataset.code` 时,后续才可执行 `dataset detail`、`page generate-start` 或 `api pull`。
75
104
 
105
+ ## 生成耗时与失败阶段
106
+
107
+ Preview、Start、Status 的 `data.metrics` 透传服务端实际提供的指标,`data.failedStage` 表示服务端报告的失败阶段。旧响应或没有可用指标时返回 `null`,不代表耗时为零。指标与 design 分离,不能把指标写回设计快照或用于重新创建任务。
108
+
109
+ 可选指标包括:`schemaVersion`、`attemptId`、`attempt`、`datasetCount`、`fieldCount`、`previewDurationMs`、`queueWaitMs`、`executionDurationMs`、`resultReadDurationMs`、`stageDurationsMs`、`modelCallCount`、`retryCount`。耗时单位为毫秒;只使用返回中存在的测量值,不补造缺失阶段。重复 Status 查询不会累计服务端执行时间,`resultReadDurationMs` 仅表示本次结果读取。阶段可能嵌套,不能把阶段耗时相加当作端到端耗时。
110
+
111
+ 采集基线时:
112
+
113
+ 1. 固定输入、模型、环境、数据集数和字段数,分别记录简单结构、复杂枚举、已有数据集引用样例;保留每次原始输出和任务 ID。
114
+ 2. 预热后每个样例至少重复 10 次,分开记录 preview、排队、执行、结果读取及客户端观察到的完成耗时;排除人工审阅 design 的时间。10 次仅供初步比较,不足以稳定估计 P95。
115
+ 3. 优化前后保持相同条件,比较中位耗时和长尾,同时回读完整字段、枚举、主键及关联,不能以漏保存换速度。
116
+ 4. 失败、超时或响应丢失时恢复原任务,不重提;缺指标样本应标注不可用,不能当作零耗时样本。
117
+
118
+ 以上步骤只适用于有授权的测试环境。批次指标仍与 design 分离;指标出现只说明可观测性可用,不能独自证明性能已改善或批次结果完整。
119
+
76
120
  ## dry-run
77
121
 
78
122
  三条路径都支持 `--dry-run`:
@@ -184,6 +228,8 @@ Status 成功后的 `data` 包含:
184
228
  - 不要把 start 输出视为已创建 Dataset;必须用 `generate-status` 查询到 `generated_dataset_created`。
185
229
  - `PENDING` / `PROCESSING` 都不是完成;始终继续查询同一个 taskId。
186
230
  - 超时、未知状态或 start 响应丢失时只做状态恢复,不得自动重提生成请求。
231
+ - 批次响应丢失时保留并复用原 `clientOperationId`;同一 design 自动生成新 ID 会成为另一批操作。
232
+ - 批次成功后逐项使用 `createdDatasets[].code`,并核对 `createdRelations`;不要读取单数 `createdDataset`。
187
233
  - 成功后用 `rabetbase dataset detail --code <createdDataset.code> --format compress` 确认结构。
188
234
  - 如需生成数据列表页,再执行 `rabetbase page generate-start --datasetcode <createdDataset.code> --format compress`。
189
235
  - 真实业务行数据验证交接到 `lovrabet data filter|getOne`。
@@ -196,6 +242,10 @@ Status 成功后的 `data` 包含:
196
242
  | Preview 传了 `--design-file` | 去掉 `--design-file`,或改用 `--apply` |
197
243
  | Start 缺 `--design-file` | 指向已审阅的 design JSON 文件 |
198
244
  | Start 同时传了 `--name` / `--description` / `--design-output` | 删除这些 preview 参数 |
245
+ | Batch Preview 传了 `--name` | 删除 `--name`;批次由 description 描述整体需求 |
246
+ | `--batch --apply` 读取单设计 | 使用 `kind=dataset-batch`、`schemaVersion=1` 的批次文件 |
247
+ | Batch Start 响应未确认 `mode=batch` | 停止,不要自动重提;用原 `clientOperationId` 查询状态 |
248
+ | Batch SUCCESS 缺少完整 expected/created 集合 | 按 `unknown_reconcile_failed` 处理,继续恢复查询或人工核验 |
199
249
  | Status 缺任务标识 | 首选传 `--task-id`;旧响应才回退 `--operation-id` 或 `--client-operation-id` |
200
250
  | design 文件不是 JSON object | 修正为 JSON object 后重试 |
201
251
 
@@ -0,0 +1,86 @@
1
+ # rabetbase flow commands
2
+
3
+ 设计态流程定义命令,覆盖表单审批流与独立工作流。除 `validate` 外均需要认证和当前应用;`appCode` 由 CLI 工作区上下文注入。
4
+
5
+ ## validate
6
+
7
+ ```bash
8
+ rabetbase flow validate --file <path> [--write-normalized] --format compress
9
+ ```
10
+
11
+ - 纯本地命令,不要求登录或 App Code。
12
+ - 返回 `data.valid`、`errors`、`warnings` 和 `normalized`。
13
+ - `--write-normalized` 仅在配置有效时原子写回规范结果。
14
+ - 校验时注入的临时 `flowKey`、`flowName` 和数据集绑定只存在于内存。
15
+ - 空值或默认 `approval.simple-flow.v1` 会从 `flowJson.schemaVersion` 规范化移除;其他版本保留并报 `Unsupported schemaVersion`。
16
+
17
+ Skill 直接执行本机的 `rabetbase flow validate` 命令,不维护额外的校验脚本或第二套规则。
18
+
19
+ ## list
20
+
21
+ ```bash
22
+ rabetbase flow list \
23
+ [--flow-code <code>] \
24
+ [--flow-name <name>] \
25
+ [--flow-status <draft|published>] \
26
+ [--dataset-code <code>] \
27
+ [--flow-type <type>] \
28
+ [--page <n>] [--page-size <n>] \
29
+ --format compress
30
+ ```
31
+
32
+ 调用 `POST /smartapi/flow/page`。输出 `data.flows` 和分页信息,保留后续 detail/update/publish 所需的服务端 `id`。
33
+
34
+ ## detail
35
+
36
+ ```bash
37
+ rabetbase flow detail --id <flow-id> --format compress
38
+ rabetbase flow detail --id <flow-id> --output .rabetbase/flows/purchase.json
39
+ rabetbase flow detail --id <flow-id> --output <path> --force
40
+ ```
41
+
42
+ 调用 `POST /smartapi/flow/detail`。控制台结果保留服务端定义;`--output` 会重新投影、校验并规范化为可移植 FlowConfig。包含当前不支持的自定义表单字段时只读 detail 仍成功,但 `--output` 明确失败,避免生成丢配置文件。目标已存在时必须显式 `--force`,写入使用原子替换。
43
+
44
+ ## create
45
+
46
+ ```bash
47
+ rabetbase flow create --file <path> --dry-run --format compress
48
+ rabetbase flow create --file <path> --format compress
49
+ ```
50
+
51
+ 调用 `POST /smartapi/flow/create`。提交前强制 normalize + validate。请求体只包含外层可写字段、当前工作区 `appCode` 和最小 `flowJson`;文件中的遗留 `id`、`appCode`、状态和部署字段不会提交。
52
+
53
+ `flowType` 必填,支持 `FORM_FLOW`、`INDEPENDENT_FLOW`。`FORM_FLOW` 是表单审批流,禁止 `taskMode: HANDLE`;`INDEPENDENT_FLOW` 是工作流,可以同时包含 `APPROVAL` 和 `HANDLE`,且不能同时配置外层 `datasetCode` 或 `pageId`。`flowJson.pageMode` 只用于独立工作流,当前 CLI 只允许 `CUSTOM_PAGE`,缺省也按 `CUSTOM_PAGE`;`PLATFORM_FORM` 返回不支持错误。`INDEPENDENT_FLOW + CUSTOM_PAGE` 可选配置 `flowJson.startPageId` 和人工节点 `pageId`,两者仅用于导航。
54
+
55
+ Skill 直接提交完整 `nodes + edges` 拓扑,不读取或发送 `templateName`。旧本地文件中的该字段会在规范化时移除并产生 warning。
56
+
57
+ 当前公开 Skill 创建独立工作流时使用 `INDEPENDENT_FLOW + 业务自定义页面`;表单审批流仍使用 `FORM_FLOW` 及其外层数据集/页面绑定。CLI 不解析 `formSchema/formDefinitions/formPermissions` 或节点 `form/formPermission`,这些字段会在 validate/create/update 中报错。
58
+
59
+ ## update
60
+
61
+ ```bash
62
+ rabetbase flow update --id <flow-id> --file <path> --dry-run --format compress
63
+ rabetbase flow update --id <flow-id> --file <path> --format compress
64
+ ```
65
+
66
+ 调用 `POST /smartapi/flow/update`。目标 id 只取自 `--id`,不信任文件内字段。服务端对已发布流程的修改限制原样作为远程错误返回。
67
+
68
+ ## publish
69
+
70
+ ```bash
71
+ rabetbase flow publish --id <flow-id> --dry-run --format compress
72
+ rabetbase flow publish --id <flow-id> --yes --format compress
73
+ ```
74
+
75
+ 调用 `POST /smartapi/flow/publish`,风险为 `high-risk-write`。`--dry-run` 不发请求;正式执行必须确认或显式 `--yes`。SmartCode 同步返回发布结果,成功响应即为该命令的完成口径。
76
+
77
+ ## 风险与完成口径
78
+
79
+ | 命令 | 风险 | 完成口径 |
80
+ |---|---|---|
81
+ | `validate` | `read` | 本地 `data.valid=true` |
82
+ | `list` / `detail` | `read` | 服务端查询成功;detail 写文件时还需本地原子写入成功 |
83
+ | `create` / `update` | `write` | 服务端返回创建或更新后的定义 |
84
+ | `publish` | `high-risk-write` | 服务端返回发布成功 |
85
+
86
+ 本地 `READY` 不等于远程成功。服务端拒绝 create、update 或 publish 时返回 `REMOTE_VALIDATION_FAILED`,不得把 dry-run 或本地校验结果描述为已发布。