@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,8 +1,18 @@
1
- # SDK 客户端代码生成(api.ts / client.ts)
1
+ # SDK 客户端代码生成(稳定入口与模型注册表)
2
2
 
3
- > 目标:根据 `rabetbase api pull` 返回的数据集事实,生成或更新浏览器子应用的 `src/api/api.ts` 与 `src/api/client.ts`,并保留项目已有的自定义写法。
3
+ > 目标:根据 `rabetbase api pull` 返回的数据集事实,维护浏览器子应用的稳定 SDK 入口,并让同一套业务 API 的不同部署使用各自正确的 `datasetCode`。
4
4
  >
5
- > CLI 默认不覆盖 TypeScript。`api pull` 只保证:刷新 `data.files.sdkConfig.path` 指向的应用级 SDK 路由文件、返回 `data.models`,并在文件缺失时写入 Cookie-first 脚手架。已有文件由本指南更新;只有用户明确要求放弃本地定制并完整重建时,才使用 `--force --yes`。
5
+ > 单应用或显式配置同一 `apiGroup` 的 profile 使用注册表模式:`project create` / `project upgrade` 维护稳定源码结构,`api pull` 只刷新 `models.generated.ts` 中的模型事实。`apiGroup` 只负责归并,不进入文件名或运行时对象。
6
+
7
+ ## 重要运行边界:一次运行只选择一个 profile
8
+
9
+ 注册表模式解决的是:**同一份业务代码分别部署到不同节点,并由当前 Runtime Domain 选择唯一 profile**。它不提供跨节点数据访问,也不把多个 profile 合并成一个可同时查询的浏览器 client。
10
+
11
+ - 业务代码始终通过稳定 alias 调用 `lovrabetClient.models.<alias>`;不要读取注册表后自行挑选其他 profile 的 `datasetCode`,也不要把该代码硬编码进业务模块。
12
+ - 当前 profile 只物化自己的模型。仅其他 profile 存在的 alias 不会注册到当前 client;误用时应保留 SDK 的 `MODEL_NOT_FOUND`,不得回退默认 profile 或借用其他节点的代码。
13
+ - 节点独有功能可先检查 `LOVRABET_PROFILE_NAME` 再决定是否调用;共享功能不需要分支,同一 alias 会自动绑定当前 profile 的代码。
14
+ - 浏览器 Cookie 与 Runtime Domain 都属于当前节点。不要为了“一次查询两端”在浏览器中创建两个 profile client、跨 Domain 转发认证信息或绕过 Domain 选择器。
15
+ - 真正需要跨节点读取、比对或聚合时,使用具备明确认证和授权边界的可信服务端或 Backend Function 编排;CLI 侧排查则分别用 `--app <profile>` 查询,不把两个 profile 当成一个运行实例。
6
16
 
7
17
  ## 何时执行
8
18
 
@@ -10,7 +20,7 @@
10
20
 
11
21
  - 刚执行 `rabetbase api pull` 或 `rabetbase project create`(带 appCode)
12
22
  - 平台增删了 Dataset,本地 `models` 过期
13
- - `api.ts` / `client.ts` 缺失、空 `models: []`、或 `LOVRABET_APP_CODE` 仍是 `NOT-SET`
23
+ - `api.ts` / `client.ts` 缺失、注册表为空、或生成 profile 的 AppCode 仍是 `NOT-SET`
14
24
  - 用户要求修复 SDK 客户端初始化
15
25
 
16
26
  不要凭空编造 `datasetCode`。不要把本指南里的浏览器 Cookie 客户端写成服务端 `accessKey` 客户端。
@@ -18,94 +28,134 @@
18
28
  ## 工作流
19
29
 
20
30
  ```
31
+ rabetbase project upgrade --dry-run
32
+ → 审阅 apiArchitecture.groups[].files[]
33
+ rabetbase project upgrade --yes
34
+ → 标准旧脚手架自动备份迁移;业务定制生成候选入口
21
35
  rabetbase api pull --format compress
22
36
  → 单应用读 data;项目应用清单逐项读 data.apps[]
23
- → 读取每项的 models / configName / isDefaultConfig / files / needsAgentMerge
24
- → 读已有 api.ts、client.ts 与 files.sdkConfig.path(含 {prefix}-api.ts / {prefix}-client.ts / {prefix}-sdk-config.ts)
25
- → 按事实更新 models,保留本地 extras
26
- → 不要改已经正确的 createClient({ apiConfigName, ...LOVRABET_SDK_CONFIG })
37
+ → 读取每项的 models / modelProfile / files / needsProjectUpgrade
38
+ → 注册表模式检查 models.generated.ts / model-runtime.ts / api.ts / client.ts
39
+ → 验证最终 Runtime Domain 能选中目标 profile
27
40
  ```
28
41
 
29
- 1. 执行 `rabetbase api pull --format compress`(需要人类可读缩进时用 `--format json`)。
30
- - 不要自动添加 `--force`。
31
- - 只有用户明确要求丢弃本地 `api.ts` / `client.ts` 定制并完整重建时,才执行 `rabetbase api pull --force --yes --format compress`;此时根据返回的 `files.*.action` 回查是否为 `overwritten`。
32
- 2. 直接单应用结果使用 `data.models`;项目应用清单结果逐项使用 `data.apps[].models`。不要手写或猜测 `datasetCode`。也可用 `rabetbase api list --format compress` 核对目录,但写文件以 pull 返回的 models 为准。
33
- 3. 先读现有文件再写:
34
- - 默认单应用:`src/api/api.ts`、`src/api/client.ts`、`src/api/sdk-config.ts`
35
- - 多应用非 default:`{name}-api.ts` / `{name}-client.ts` / `{name}-sdk-config.ts`(以 `data.files.*.path` 为准)
36
- 4. SDK 路由文件由 CLI 维护(`data.files.sdkConfig.action === "refreshed"`),不要往里面写 `cookie` / `accessKey` / `token`。若保留的旧 `{name}-client.ts` 仍导入共享 `./sdk-config`,只把该 import 改为 `./{name}-sdk-config`,其余本地定制保持不变。
37
- 5. 看 `data.needsAgentMerge` 和 `data.files.*.action`,**不要**用已删除的 `wroteScaffold`:
38
- - `needsAgentMerge === false` 且 `api`/`client` 均为 `created` 或 `overwritten`:脚手架已按当前 `models` 写好,只需检查项目 extras。
39
- - `needsAgentMerge === true`:至少有一个 TypeScript 文件被 **preserved**。先比较本地配置与返回事实,只在有差异时合并;即使 `client` 刚 `created`,也不能据此跳过对已保留 `api.ts` 的检查。
40
- 6. 默认应用:`data.isDefaultConfig === true`,`data.configName === "default"`,代码里用 `CONFIG_NAMES.DEFAULT`。
41
- 7. 具名应用:`data.isDefaultConfig === false`,`data.configName` 是不含引号的名字(如 `order`),`registerModels(..., "order")` 与 `apiConfigName: "order"`。不要把 `configName` 再包一层引号。
42
+ 1. 已有项目先执行 `rabetbase project upgrade --dry-run`。标准旧脚手架可直接正式升级;`manual-merge` 表示原入口含业务定制,正式升级只会写候选文件,不会覆盖原文件。
43
+ 2. 执行 `rabetbase project upgrade --yes` 后审阅 `apiArchitecture.manualMergeRequired`。候选文件在 `.rabetbase/project-upgrade/api-model-registry-v2/candidates/`;完成合并前不要删除原入口。
44
+ 3. 执行 `rabetbase api pull --format compress`(需要人类可读缩进时用 `--format json`),刷新远端 Dataset 事实。不要自动添加 `--force`;它在注册表模式只用于明确接受空结果。
45
+ 4. 直接单应用结果使用 `data.models`;项目应用清单结果逐项使用 `data.apps[].models`。不要手写或猜测 `datasetCode`。
46
+ 5. `data.modelProfile` 存在时检查 `data.files.modelRegistry`:同一平台 `alias` 只有一条模型,`tableName` 必须在各 profile 间一致。所有当前 profile 都存在且代码相同时使用 `datasetCode`;代码不同或仅部分 profile 存在时使用 `datasetCodes[modelProfile]`,缺失 profile 不写空字符串。
47
+ 6. `model-runtime.ts` 由项目创建/升级维护,`models.generated.ts` 由 pull 刷新;都不要写入凭据或应用业务函数。若 `data.needsProjectUpgrade === true`,回到第 1 步,不要手工覆盖入口。
48
+ 7. 一个 AppCode 对应多个 profile 时,所有拉取与别名写操作都用 `--app <profile>`;不要使用有歧义的 `--appcode`。AppCode 相同不会自动归并,只有显式相同的 `apiGroup` 才表示共享业务 API。
42
49
 
43
50
  ## 权威结构
44
51
 
45
52
  浏览器子应用的权威形态与 `templates/projects/sub-app-react-demo/src/api/` 一致。脚手架模板是 `templates/generate-api/*.tpl`,生成结果应对齐 demo,而不是另造一套。
46
53
 
47
- ### sdk-config.ts / {name}-sdk-config.ts(路由,无凭证)
54
+ ### models.generated.ts(CLI 生成事实)
48
55
 
49
56
  ```typescript
50
- /**
51
- * Lovrabet SDK runtime routing.
52
- * Generated by Rabetbase CLI. Do not add credentials to this file.
53
- */
54
- export const LOVRABET_SDK_CONFIG = {} as const;
57
+ /* rabetbase-model-registry:v2 */
58
+ export const LOVRABET_MODEL_REGISTRY = {
59
+ defaultProfile: "oa-cn",
60
+ profiles: {
61
+ "oa-cn": {
62
+ appCode: "app-xxxxxxxx",
63
+ runtimeDomain: "https://runtime.lovrabet.com",
64
+ },
65
+ "oa-id": {
66
+ appCode: "app-xxxxxxxx",
67
+ runtimeDomain: "https://runtime.lovrabet.id",
68
+ },
69
+ },
70
+ models: [
71
+ {
72
+ alias: "paymentApplication",
73
+ tableName: "payment_application",
74
+ name: "Payment Application",
75
+ datasetCode: "shared-dataset-code",
76
+ },
77
+ {
78
+ alias: "orders",
79
+ tableName: "orders",
80
+ name: "Orders",
81
+ datasetCodes: {
82
+ "oa-cn": "cn-dataset-code",
83
+ "oa-id": "id-dataset-code",
84
+ },
85
+ },
86
+ ],
87
+ } as const;
55
88
  ```
56
89
 
57
- 默认节点保持空对象;其他官方节点和企业独立部署统一写入最终 `runtimeDomain`。不要手改成认证字段。项目模板所需的完整公开 Domain 与资源策略由独立命令 `rabetbase project domain-routing-sync` 写入项目根目录的 `rabetbase.domain-routing.json`。
90
+ - 以平台稳定 `alias` 作为跨 profile 的模型归并键,`tableName` 作为一致性校验;同 alias 指向不同表或同表出现不同 alias 时停止写入。
91
+ - 默认 profile 提供公共 `alias` / `name`;其他 profile 的同表展示名不同不会制造第二份模型。
92
+ - 所有当前 profile 都存在且 Dataset 代码相同时只写单数 `datasetCode`。
93
+ - 某 profile 独有的表只包含自己的 `datasetCodes` key;运行时不会把它提供给其他 profile。
94
+ - 文件版本由 CLI 专用注释标记识别,不进入应用运行时对象。
95
+ - 此文件由 CLI 原子刷新,不手工编辑。
58
96
 
59
- ### api.ts
97
+ ### model-runtime.ts(通用选择器)
60
98
 
61
- ```typescript
62
- import { registerModels, CONFIG_NAMES, type ModelsConfig } from "@lovrabet/sdk";
99
+ 该文件根据平台注入的 Runtime Domain 选择唯一 profile;本地构建读取项目根目录的 `rabetbase.domain-routing.json`。零匹配或多匹配都直接报错,不回退 `defaultProfile`。它只将所选 profile 物化为 SDK 的 `{ appCode, models }`,不会创建多节点 client,不放业务函数,也不硬编码具体 Dataset。
63
100
 
64
- export const LOVRABET_APP_CODE = "app-xxxxxxxx";
65
-
66
- export const LOVRABET_MODELS_CONFIG: ModelsConfig = {
67
- appCode: LOVRABET_APP_CODE,
68
- models: [
69
- { datasetCode: "abc123", tableName: "orders", name: "订单", alias: "orders" },
70
- ],
71
- } as const;
101
+ ### api.ts
72
102
 
103
+ ```typescript
104
+ import { registerModels, CONFIG_NAMES } from "@lovrabet/sdk";
105
+ import projectRouting from "../../rabetbase.domain-routing.json";
106
+ import { LOVRABET_MODEL_REGISTRY } from "./models.generated";
107
+ import { resolveActiveModelConfig } from "./model-runtime";
108
+
109
+ const activeModelConfig = resolveActiveModelConfig(
110
+ LOVRABET_MODEL_REGISTRY,
111
+ projectRouting.domains.runtime,
112
+ );
113
+
114
+ export const LOVRABET_PROFILE_NAME = activeModelConfig.profileName;
115
+ export const LOVRABET_APP_CODE = activeModelConfig.appCode;
116
+ export const LOVRABET_RUNTIME_DOMAIN = activeModelConfig.runtimeDomain;
117
+ export const LOVRABET_MODELS_CONFIG = activeModelConfig.modelsConfig;
73
118
  registerModels(LOVRABET_MODELS_CONFIG, CONFIG_NAMES.DEFAULT);
74
119
  ```
75
120
 
76
- - 默认应用:`data.isDefaultConfig` 为 true 时用 `CONFIG_NAMES.DEFAULT`。
77
- - 非默认 / 具名应用:用 `data.configName`(不含引号的字符串,如 `order`)作为 `registerModels` 第二参数和 `apiConfigName`,不要再 import 未使用的 `CONFIG_NAMES`。
78
- - 数字开头的文件前缀使用 `APP_` 变量前缀(如 `APP_5B732428_APP_CODE`),运行时 `appCode` 保持原值。
79
- - `registerModels` 是 `@lovrabet/sdk` 的独立命名导出,**不是** `client.registerModels()`。
121
+ `api.ts` 只负责连接注册表、路由事实和 SDK 注册。业务层继续从原路径 import,无需感知 profile 数量。
122
+
123
+ `registerModels` 是 `@lovrabet/sdk` 的独立命名导出,**不是** `client.registerModels()`。
124
+
125
+ 历史未分组项目仍兼容读取具名前缀文件及项目内相对转导出。例如 `api.ts` 可写 `export { APP_MODELS_CONFIG as LOVRABET_MODELS_CONFIG } from "./app-api"`。CLI 会静态读取本地 `export … from` 目标,不执行 TypeScript;HOOK 目录和 `--code` alias 会使用汇总后的模型别名。每个 Dataset 必须只有一个 alias,且一个 alias 不能对应多个 Dataset;冲突时 CLI 会停止而不是猜测绑定目标。旧式前缀路径的默认应用使用 `CONFIG_NAMES.DEFAULT`,具名应用使用 `data.configName`;数字开头的文件前缀继续使用 `APP_` 变量前缀。
80
126
 
81
127
  ### client.ts(Cookie-first)
82
128
 
83
129
  ```typescript
84
130
  import { createClient, CONFIG_NAMES } from "@lovrabet/sdk";
85
- import "./api";
131
+ import { LOVRABET_RUNTIME_DOMAIN } from "./api";
86
132
  import { LOVRABET_SDK_CONFIG } from "./sdk-config";
87
133
 
88
134
  export const lovrabetClient = createClient({
89
135
  apiConfigName: CONFIG_NAMES.DEFAULT,
90
136
  ...LOVRABET_SDK_CONFIG,
137
+ runtimeDomain: LOVRABET_RUNTIME_DOMAIN,
91
138
  });
92
139
  ```
93
140
 
94
- - 必须 `import "./api"`(或 `./{prefix}-api`)以执行 `registerModels`。
95
141
  - 浏览器子应用默认登录态 Cookie:省略 `authMode`,**不要**在此文件写入 `accessKey` / `token`。
96
- - 已有 `createClient({ apiConfigName, ...LOVRABET_SDK_CONFIG })` 且与 `data.isDefaultConfig` / `data.configName` 一致时,不要改参数形态。
97
- - 非生产环境脚手架可能带 `env: "daily"`;已有客户端已能工作则不要为了对称去改。
142
+ - `runtimeDomain` 放在 spread 之后,确保运行时选中的 profile 是最终路由事实。
143
+
144
+ ### sdk-config.ts(路由,无凭证)
145
+
146
+ 该文件仍由 CLI 刷新并保持浏览器安全。注册表模式的最终 Runtime Domain 来自 `api.ts`,项目的完整公开 Domain 与资源策略由 `rabetbase project domain-routing-sync` 写入 `rabetbase.domain-routing.json`。
147
+
148
+ ## apiGroup、目录隔离与旧式兼容
98
149
 
99
- ## 合并规则
150
+ CLI 仍能读取已有 `[name-]api.ts` 中的 `models`,页面与 BFF 的 `--alias` 不会立即失效。迁移时:
100
151
 
101
- 以 `data.models` 为 Dataset 清单的唯一事实来源:
152
+ - 先执行 `project upgrade --dry-run`,审阅标准生成文件与业务定制文件的分类。
153
+ - 有本地定制时,将业务 helper 移到独立业务模块;不要放进 `models.generated.ts` 或 `model-runtime.ts`。
154
+ - 正式执行 `project upgrade --yes`;标准旧入口先备份再替换,定制入口只生成候选文件。
155
+ - 执行 `api pull --format compress` 刷新远端事实;业务 import 继续指向 `src/api/api.ts` / `client.ts`。
156
+ - 旧的 `[name-]api.ts` / `[name-]client.ts` 可在确认无引用后再删除;CLI 不自动删除用户文件。
102
157
 
103
- - **新增**:pull 有、本地没有的 `datasetCode`,追加到 `models`
104
- - **删除**:本地有、pull 没有的 `datasetCode`,从 `models` 移除
105
- - **更新**:同一 `datasetCode` 的 `tableName` / `name` 以 pull 为准
106
- - **别名**:本地已有且仍对应同一 `datasetCode` 的 `alias` 保留;新建项使用 pull 给出的 `alias`
107
- - **保留 extras**:额外的 `registerModels(...)`、额外 client 导出、项目自定义注释(非 Generated 头)不要删
108
- - **多应用**:继续使用 CLI 的 `{name}-api.ts` / `{name}-client.ts` 命名,不要把多个 app 的 models 揉进同一个 `api.ts`
158
+ `apiGroup` 是显式 join key:同组 profile 的 AppCode 可以相同或不同,但必须使用同一规范化 `apiDir`;同一 `apiDir` 也只能承载一个显式组。`./src/api`、`src/api`、`src/api/` 会视为同一目录。第二套业务使用独立目录,例如 `src/api/finance`,目录内仍是无前缀的 `api.ts` / `client.ts`。同一目录下多个未配置 `apiGroup` 的历史 profile 继续使用 `[name-]api.ts` / `[name-]client.ts`,不会被静默归并。
109
159
 
110
160
  ## 认证(不要写进浏览器 client.ts)
111
161
 
@@ -137,13 +187,15 @@ export const lovrabetClient = createClient({
137
187
  | 字段 | 含义 |
138
188
  |------|------|
139
189
  | `appCode` | 当前应用 |
140
- | `configName` | `"default"` 或具名应用名(不含 TS 引号) |
141
- | `isDefaultConfig` | 默认应用为 `true` |
190
+ | `modelProfile` | 本次刷新的 profile;旧式输出可省略 |
142
191
  | `models[]` | `datasetCode` / `tableName` / `name` / `alias` |
143
192
  | `sdkRouting` | `{ runtimeDomain?: string }` |
144
- | `files.api` / `files.client` / `files.sdkConfig` | `{ path, action }`;`action` 为 `created` / `overwritten` / `preserved` / `refreshed` |
145
- | `needsAgentMerge` | 任一 TypeScript 被 `preserved` 时为 `true`,必须合并 `models` |
146
- | `apiFilePath` / `clientFilePath` / `sdkConfigPath` | 与 `files.*.path` 相同,兼容路径字段 |
193
+ | `files.api` / `files.client` / `files.sdkConfig` | 稳定入口与 SDK 路由的路径及动作 |
194
+ | `files.modelRegistry` / `files.modelRuntime` | 注册表模式的模型事实与通用选择器路径及动作 |
195
+ | `needsAgentMerge` | 兼容字段;旧式或自定义入口尚未接入注册表时为 `true` |
196
+ | `needsProjectUpgrade` | 注册表事实已刷新,但稳定源码入口缺失或仍为旧结构时为 `true` |
197
+ | `apiFilePath` / `clientFilePath` / `sdkConfigPath` | 稳定入口与 SDK 路由路径 |
198
+ | `modelRegistryPath` / `modelRuntimePath` | 注册表模式下的生成文件路径 |
147
199
  | `modelCount` / `datasetCount` | 模型数量 |
148
200
 
149
201
  多应用时 `data.apps[]` 为上述对象的数组。
@@ -18,6 +18,15 @@
18
18
 
19
19
  生成或更新项目里的 `src/api/api.ts` / `client.ts` 时,先 `rabetbase api pull --format compress`,再遵守 [`sdk-client-generation.md`](sdk-client-generation.md)。浏览器子应用的默认 client 是 Cookie + `...LOVRABET_SDK_CONFIG`,不要把下面的服务端 `accessKey` 示例写进 `src/api/client.ts`。
20
20
 
21
+ ## 多 profile 的调用边界
22
+
23
+ CLI 生成的多 profile 注册表用于**同一份代码在不同节点分别运行**:当前 Runtime Domain 必须且只能选中一个 profile,随后业务代码通过同一 alias 使用该 profile 的 `datasetCode`。它不表示一个浏览器实例能同时查询多个节点。
24
+
25
+ - 不在业务代码中读取 `datasetCodes`、指定另一个 profile,或硬编码任一节点的 DatasetCode。
26
+ - 当前 profile 没有某 alias 时,让 SDK 抛出 `MODEL_NOT_FOUND`;节点独有功能可先检查生成入口导出的 `LOVRABET_PROFILE_NAME`,不得回退默认 profile。
27
+ - 不在浏览器中创建多个跨 Domain client 或转发 Cookie、AccessKey、token。确需跨节点聚合时,由可信服务端或 Backend Function 按明确授权编排。
28
+ - 只需分别验证节点数据时,使用对应项目 profile 和运行态工具逐端验证,不把它实现成业务前端的跨节点调用。
29
+
21
30
  ## 初始化规则
22
31
 
23
32
  必须使用 `createClient` 命名导出,禁止使用 `new LovrabetClient()`:
@@ -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 验证确认。