openyida 2026.9.21 → 2026.9.22-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/README.md +14 -20
  2. package/bin/yida.js +6 -11
  3. package/lib/app/app-list.js +3 -7
  4. package/lib/app/canvas-compile.js +12 -22
  5. package/lib/app/check-prd-completeness.js +0 -7
  6. package/lib/app/create-app.js +1 -4
  7. package/lib/app/create-form/args.js +12 -37
  8. package/lib/app/create-form/batch.js +11 -86
  9. package/lib/app/create-form.js +86 -193
  10. package/lib/app/create-page.js +17 -84
  11. package/lib/app/custom-theme.js +0 -11
  12. package/lib/app/form-field-validator.js +41 -26
  13. package/lib/app/form-open-guard.js +10 -97
  14. package/lib/app/get-form-config.js +0 -1
  15. package/lib/app/inline-css-guard.js +31 -1
  16. package/lib/app/services/form-compiler.js +4 -2
  17. package/lib/app/theme-from-design.js +41 -144
  18. package/lib/app/theme-presets.js +1 -1
  19. package/lib/app/update-app.js +13 -63
  20. package/lib/asset/ai-image.js +9 -59
  21. package/lib/asset/asset-cmd.js +7 -18
  22. package/lib/asset/asset-plan.js +9 -102
  23. package/lib/asset/asset-resolve.js +10 -55
  24. package/lib/asset/asset-status.js +4 -5
  25. package/lib/asset/host-capabilities.js +2 -11
  26. package/lib/asset/url-verify.js +4 -19
  27. package/lib/auth/dws-sync.js +145 -0
  28. package/lib/auth/token-auth.js +73 -9
  29. package/lib/auth/token-store.js +50 -0
  30. package/lib/connector/connector-test.js +5 -19
  31. package/lib/connector/contract.js +1 -3
  32. package/lib/core/agent-capabilities.js +16 -19
  33. package/lib/core/command-manifest.js +40 -329
  34. package/lib/core/locales/en.js +17 -74
  35. package/lib/core/locales/zh.js +16 -73
  36. package/lib/core/redact.js +10 -15
  37. package/lib/core/sample.js +30 -72
  38. package/lib/core/utils.js +4 -0
  39. package/lib/design-plan/design-plan.js +4 -51
  40. package/lib/design-plan/init.js +26 -121
  41. package/lib/design-plan/materialize.js +348 -451
  42. package/lib/design-plan/normalize.js +29 -74
  43. package/lib/design-plan/parallel.js +16 -71
  44. package/lib/design-plan/patch.js +16 -63
  45. package/lib/design-plan/preview.js +8 -6
  46. package/lib/design-plan/validate.js +11 -71
  47. package/lib/process/create-process.js +50 -84
  48. package/lib/samples/openyida-scaffold/canvas-form-drawer.canvas.jsx +90 -20
  49. package/lib/samples/openyida-scaffold/canvas-nav/content.jsx +13 -93
  50. package/lib/samples/openyida-scaffold/canvas-nav/data.jsx +18 -100
  51. package/lib/samples/openyida-scaffold/canvas-nav/mixed.jsx +4 -6
  52. package/lib/samples/openyida-scaffold/canvas-nav/shared.jsx +5 -5
  53. package/lib/samples/openyida-scaffold/canvas-nav/side.jsx +2 -1
  54. package/lib/samples/openyida-scaffold/canvas-nav/sidebar.jsx +1 -1
  55. package/lib/samples/openyida-scaffold/canvas-nav/top.jsx +9 -15
  56. package/lib/samples/yida-canvas-table-form/table-form-batch-submit.canvas.jsx +83 -9
  57. package/lib/samples/yida-rechart/trend-combo.canvas.jsx +87 -14
  58. package/package.json +1 -3
  59. package/scripts/postinstall.js +3 -3
  60. package/yida-skills/SKILL.md +16 -19
  61. package/yida-skills/references/official-example-schema-patterns.md +1 -1
  62. package/yida-skills/references/yida-api.md +0 -4
  63. package/yida-skills/skills/yida-app/SKILL.md +23 -46
  64. package/yida-skills/skills/yida-app/workflow/parallel-work.md +6 -15
  65. package/yida-skills/skills/yida-app/workflow/plan/step-1-understand.md +1 -1
  66. package/yida-skills/skills/yida-app/workflow/plan/step-2-confirm.md +1 -1
  67. package/yida-skills/skills/yida-app/workflow/plan/step-4-deliver.md +15 -29
  68. package/yida-skills/skills/yida-app/workflow/plan/workflow.md +11 -29
  69. package/yida-skills/skills/yida-app/workflow/step-1-resource-context.md +2 -4
  70. package/yida-skills/skills/yida-app/workflow/step-2-design.md +9 -23
  71. package/yida-skills/skills/yida-app/workflow/step-3-create-or-reuse-app.md +4 -6
  72. package/yida-skills/skills/yida-app/workflow/step-4-forms-processes.md +4 -15
  73. package/yida-skills/skills/yida-app/workflow/step-6-main-page.md +4 -6
  74. package/yida-skills/skills/yida-app/workflow/step-7-page-code.md +9 -15
  75. package/yida-skills/skills/yida-app/workflow/step-8-publish-navigation.md +11 -25
  76. package/yida-skills/skills/yida-app/workflow/step-9-output-finish.md +28 -68
  77. package/yida-skills/skills/yida-canvas-custom-page/SKILL.md +43 -42
  78. package/yida-skills/skills/yida-canvas-custom-page/references/canvas-style-implementation-guide.md +44 -60
  79. package/yida-skills/skills/yida-canvas-custom-page/references/canvas-theme-provider.md +50 -72
  80. package/yida-skills/skills/yida-canvas-custom-page/references/component-library-guide.md +1 -13
  81. package/yida-skills/skills/yida-canvas-custom-page/references/data-bridge-guide.md +1 -140
  82. package/yida-skills/skills/yida-canvas-custom-page/references/navigation-and-entry-guide.md +72 -101
  83. package/yida-skills/skills/yida-canvas-custom-page/references/page-generation-guide.md +32 -35
  84. package/yida-skills/skills/yida-canvas-custom-page/scripts/build-canvas-theme.js +3 -29
  85. package/yida-skills/skills/yida-canvas-custom-page/scripts/canvas-theme-provider.template.jsx +6 -69
  86. package/yida-skills/skills/yida-canvas-data-binding/SKILL.md +0 -26
  87. package/yida-skills/skills/yida-create-app/SKILL.md +0 -2
  88. package/yida-skills/skills/yida-create-form-page/SKILL.md +58 -72
  89. package/yida-skills/skills/yida-create-form-page/references/advanced-form-modes.md +5 -5
  90. package/yida-skills/skills/yida-create-form-page/references/association-form-field.md +4 -4
  91. package/yida-skills/skills/yida-create-form-page/references/batch-forms.md +5 -6
  92. package/yida-skills/skills/yida-create-form-page/references/field-definition-guide.md +19 -7
  93. package/yida-skills/skills/yida-create-form-page/references/form-field-properties.md +44 -62
  94. package/yida-skills/skills/yida-create-page/SKILL.md +6 -14
  95. package/yida-skills/skills/yida-create-process/SKILL.md +2 -13
  96. package/yida-skills/skills/yida-custom-page/SKILL.md +0 -2
  97. package/yida-skills/skills/yida-custom-page/references/design-system.md +1 -1
  98. package/yida-skills/skills/yida-dashboard/SKILL.md +4 -5
  99. package/yida-skills/skills/yida-data-management/SKILL.md +2 -4
  100. package/yida-skills/skills/yida-data-management/references/data-format-guide.md +4 -4
  101. package/yida-skills/skills/yida-design/SKILL.md +14 -29
  102. package/yida-skills/skills/yida-design/references/app/blueprint.md +70 -0
  103. package/yida-skills/skills/yida-design/references/app/navigation-patterns.md +43 -0
  104. package/yida-skills/skills/yida-design/references/app/role-journey.md +30 -0
  105. package/yida-skills/skills/yida-design/references/ask-human-interaction-contract.md +42 -67
  106. package/yida-skills/skills/yida-design/references/asset-workflow.md +2 -6
  107. package/yida-skills/skills/yida-design/references/design-mode.md +4 -4
  108. package/yida-skills/skills/yida-design/references/page-quality-gates.md +38 -26
  109. package/yida-skills/skills/yida-design/references/style-design-selection.md +137 -0
  110. package/yida-skills/skills/yida-design/references/style-designs/_design-md-template.md +185 -0
  111. package/yida-skills/skills/yida-design/references/style-designs/aqua-service-progress-dashboard.md +242 -0
  112. package/yida-skills/skills/yida-design/references/style-designs/blue-insight-operations-dashboard.md +243 -0
  113. package/yida-skills/skills/yida-design/references/style-designs/blue-productivity-insight-workbench.md +242 -0
  114. package/yida-skills/skills/yida-design/references/style-designs/command-filter-card-console.md +304 -0
  115. package/yida-skills/skills/yida-design/references/style-designs/contrast-command-analytics-workbench.md +261 -0
  116. package/yida-skills/skills/yida-design/references/style-designs/dark-stage-analytic-dashboard.md +369 -0
  117. package/yida-skills/skills/yida-design/references/style-designs/filterable-card-catalog.md +354 -0
  118. package/yida-skills/skills/yida-design/references/style-designs/green-timeline-progress-workbench.md +250 -0
  119. package/yida-skills/skills/yida-design/references/style-designs/registry.md +117 -0
  120. package/yida-skills/skills/yida-design/references/style-designs/soft-analytic-workbench.md +348 -0
  121. package/yida-skills/skills/yida-design/references/style-designs/soft-blue-grid-analytic-dashboard.md +658 -0
  122. package/yida-skills/skills/yida-design/references/style-designs/soft-bordered-analytic-workbench.md +385 -0
  123. package/yida-skills/skills/yida-design/references/style-designs/soft-curated-filter-gallery.md +300 -0
  124. package/yida-skills/skills/yida-design/references/style-designs/soft-modular-analytic-workbench.md +404 -0
  125. package/yida-skills/skills/yida-design/references/style-designs/soft-progress-analytics-workbench.md +382 -0
  126. package/yida-skills/skills/yida-design/references/style-designs/soft-timeline-analytics-workbench.md +367 -0
  127. package/yida-skills/skills/yida-design/references/style-designs/teal-rail-analytics-workbench.md +341 -0
  128. package/yida-skills/skills/yida-design/references/theme/app-custom-theme-template.css +432 -350
  129. package/yida-skills/skills/yida-design/references/visual-decision-engine.md +143 -19
  130. package/yida-skills/skills/yida-design/references/visual-scaffold-recipes.md +27 -15
  131. package/yida-skills/skills/yida-design/sub_skill/page-design/SKILL.md +0 -4
  132. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/SKILL.md +8 -22
  133. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/assets/README.md +10 -14
  134. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/assets/build-plan-template.html +4 -9
  135. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/build-plan-compact-schema.md +27 -49
  136. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/build-plan-schema.md +154 -33
  137. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/visual-design.md +127 -48
  138. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/visual-theme-selection.md +51 -37
  139. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/scripts/render_build_plan.py +48 -43
  140. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/scripts/validate_design_themes.py +190 -0
  141. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/README.md +98 -0
  142. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-media-grid.md +339 -0
  143. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-modular-clarity.md +348 -0
  144. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-structured-clarity.md +344 -0
  145. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/ambient-halo-layered.md +345 -0
  146. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/dark-focus-layered.md +355 -0
  147. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/dark-luminous-modular.md +377 -0
  148. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/deep-stage-duotone.md +352 -0
  149. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/hairline-runway-clarity.md +389 -0
  150. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/high-contrast-modular.md +364 -0
  151. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/index.json +329 -0
  152. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/interlocked-vivid-modules.md +348 -0
  153. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/matrix-grid-focus.md +345 -0
  154. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/media-rail-inspector.md +379 -0
  155. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/mist-layered-signal.md +347 -0
  156. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/modular-rail-signal.md +352 -0
  157. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/mono-grid-signal.md +386 -0
  158. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/ribbon-ledger-lift.md +384 -0
  159. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/segmented-meter-clarity.md +388 -0
  160. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/split-rail-precision.md +341 -0
  161. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/status-framed-media-grid.md +361 -0
  162. package/yida-skills/skills/yida-design/workflow/output-design.md +375 -117
  163. package/yida-skills/skills/yida-design/workflow/output-prd.md +185 -0
  164. package/yida-skills/skills/yida-design/workflow/step-1-read-brief.md +1 -1
  165. package/yida-skills/skills/yida-design/workflow/step-2-theme-system.md +29 -33
  166. package/yida-skills/skills/yida-design/workflow/step-4-wireframe-interaction.md +1 -3
  167. package/yida-skills/skills/yida-design/workflow/step-5-visual-states.md +106 -22
  168. package/yida-skills/skills/yida-design/workflow/step-6-handoff.md +22 -15
  169. package/yida-skills/skills/yida-form-permission/SKILL.md +0 -6
  170. package/yida-skills/skills/yida-image-assets/SKILL.md +50 -73
  171. package/yida-skills/skills/yida-image-assets/references/manifest-contract.md +52 -82
  172. package/yida-skills/skills/yida-image-assets/references/source-policy.md +15 -14
  173. package/yida-skills/skills/yida-integration/SKILL.md +0 -1
  174. package/yida-skills/skills/yida-login/SKILL.md +0 -2
  175. package/yida-skills/skills/yida-nav-group/SKILL.md +2 -4
  176. package/yida-skills/skills/yida-nav-shell/SKILL.md +12 -36
  177. package/yida-skills/skills/yida-nav-shell/references/nav-shell-patterns.md +136 -79
  178. package/yida-skills/skills/yida-page-config/SKILL.md +4 -13
  179. package/yida-skills/skills/yida-prd/SKILL.md +3 -5
  180. package/yida-skills/skills/yida-prd/references/app/blueprint.md +4 -4
  181. package/yida-skills/skills/yida-prd/references/app/navigation-patterns.md +3 -6
  182. package/yida-skills/skills/yida-prd/references/app/role-journey.md +3 -5
  183. package/yida-skills/skills/yida-prd/references/plan-content.md +0 -4
  184. package/yida-skills/skills/yida-prd/workflow/output-prd.md +11 -18
  185. package/yida-skills/skills/yida-prd/workflow/plan-business.md +4 -4
  186. package/yida-skills/skills/yida-prd/workflow/step-2-information-architecture.md +8 -11
  187. package/yida-skills/skills/yida-publish-page/SKILL.md +1 -9
  188. package/yida-skills/skills/yida-requirement-analysis/SKILL.md +39 -10
  189. package/yida-skills/skills/yida-requirement-analysis/workflow/prepare-brief.md +71 -40
  190. package/yida-skills/skills-index.json +16 -36
  191. package/lib/app/application-entry-urls.js +0 -31
  192. package/lib/app/application-style.js +0 -69
  193. package/lib/app/canvas-icon-exports.json +0 -6160
  194. package/lib/app/canvas-icon-guard.js +0 -87
  195. package/lib/app/canvas-navigation-guard.js +0 -84
  196. package/lib/app/canvas-path-guard.js +0 -78
  197. package/lib/app/canvas-theme-guard.js +0 -184
  198. package/lib/app/form-data-response-guard.js +0 -57
  199. package/lib/asset/asset-execution.js +0 -79
  200. package/lib/core/css-structure.js +0 -37
  201. package/lib/design/check-design.js +0 -51
  202. package/lib/design/document.js +0 -458
  203. package/lib/design/icon-contrast.js +0 -85
  204. package/lib/design/page-content.js +0 -11
  205. package/lib/design-plan/artifact-updates.js +0 -117
  206. package/lib/design-plan/confirmation.js +0 -13
  207. package/lib/design-plan/entry-navigation.js +0 -97
  208. package/lib/design-plan/navigation-policy.js +0 -38
  209. package/lib/design-plan/rebase.js +0 -60
  210. package/lib/design-plan/themes.js +0 -101
  211. package/lib/design-plan/visual-policy.js +0 -42
  212. package/lib/samples/openyida-scaffold/canvas-admin-entry.jsx +0 -62
  213. package/lib/samples/openyida-scaffold/canvas-navigation.jsx +0 -56
  214. package/lib/samples/openyida-scaffold/canvas-view-state.jsx +0 -74
  215. package/yida-skills/skills/yida-app/references/entry-navigation.md +0 -193
  216. package/yida-skills/skills/yida-canvas-custom-page/references/view-state-recovery.md +0 -52
  217. package/yida-skills/skills/yida-canvas-data-binding/references/business-action-permissions.md +0 -31
  218. package/yida-skills/skills/yida-design/references/application-style-library.md +0 -93
  219. package/yida-skills/skills/yida-design/references/application-theme-consistency.md +0 -150
  220. package/yida-skills/skills/yida-design/references/native-form-styles.md +0 -208
  221. package/yida-skills/skills/yida-design/references/navigation-decision.md +0 -53
  222. package/yida-skills/skills/yida-design/references/page-continuity.md +0 -42
  223. package/yida-skills/skills/yida-design/references/theme/application-style-recipes.css +0 -58
  224. package/yida-skills/skills/yida-design/references/theme-selection.md +0 -67
  225. package/yida-skills/skills/yida-design/scripts/validate_design_themes.py +0 -302
  226. package/yida-skills/skills/yida-design/templates/application-styles.json +0 -398
  227. package/yida-skills/skills/yida-design/templates/design-themes/README.md +0 -73
  228. package/yida-skills/skills/yida-design/templates/design-themes/app-amber/app_theme.css +0 -748
  229. package/yida-skills/skills/yida-design/templates/design-themes/app-amber/design.md +0 -274
  230. package/yida-skills/skills/yida-design/templates/design-themes/app-amber/form-layout.json +0 -15
  231. package/yida-skills/skills/yida-design/templates/design-themes/app-editorial/app_theme.css +0 -748
  232. package/yida-skills/skills/yida-design/templates/design-themes/app-editorial/design.md +0 -274
  233. package/yida-skills/skills/yida-design/templates/design-themes/app-editorial/form-layout.json +0 -14
  234. package/yida-skills/skills/yida-design/templates/design-themes/app-executive/app_theme.css +0 -748
  235. package/yida-skills/skills/yida-design/templates/design-themes/app-executive/design.md +0 -274
  236. package/yida-skills/skills/yida-design/templates/design-themes/app-executive/form-layout.json +0 -13
  237. package/yida-skills/skills/yida-design/templates/design-themes/app-finance/app_theme.css +0 -748
  238. package/yida-skills/skills/yida-design/templates/design-themes/app-finance/design.md +0 -274
  239. package/yida-skills/skills/yida-design/templates/design-themes/app-finance/form-layout.json +0 -14
  240. package/yida-skills/skills/yida-design/templates/design-themes/app-glass/app_theme.css +0 -748
  241. package/yida-skills/skills/yida-design/templates/design-themes/app-glass/design.md +0 -274
  242. package/yida-skills/skills/yida-design/templates/design-themes/app-glass/form-layout.json +0 -14
  243. package/yida-skills/skills/yida-design/templates/design-themes/app-graphite/app_theme.css +0 -748
  244. package/yida-skills/skills/yida-design/templates/design-themes/app-graphite/design.md +0 -274
  245. package/yida-skills/skills/yida-design/templates/design-themes/app-graphite/form-layout.json +0 -14
  246. package/yida-skills/skills/yida-design/templates/design-themes/app-line/app_theme.css +0 -748
  247. package/yida-skills/skills/yida-design/templates/design-themes/app-line/design.md +0 -274
  248. package/yida-skills/skills/yida-design/templates/design-themes/app-line/form-layout.json +0 -13
  249. package/yida-skills/skills/yida-design/templates/design-themes/app-neon/app_theme.css +0 -748
  250. package/yida-skills/skills/yida-design/templates/design-themes/app-neon/design.md +0 -274
  251. package/yida-skills/skills/yida-design/templates/design-themes/app-neon/form-layout.json +0 -14
  252. package/yida-skills/skills/yida-design/templates/design-themes/app-nordic/app_theme.css +0 -754
  253. package/yida-skills/skills/yida-design/templates/design-themes/app-nordic/design.md +0 -279
  254. package/yida-skills/skills/yida-design/templates/design-themes/app-nordic/form-layout.json +0 -13
  255. package/yida-skills/skills/yida-design/templates/design-themes/app-paper/app_theme.css +0 -748
  256. package/yida-skills/skills/yida-design/templates/design-themes/app-paper/design.md +0 -274
  257. package/yida-skills/skills/yida-design/templates/design-themes/app-paper/form-layout.json +0 -13
  258. package/yida-skills/skills/yida-design/templates/design-themes/app-platinum/app_theme.css +0 -748
  259. package/yida-skills/skills/yida-design/templates/design-themes/app-platinum/design.md +0 -274
  260. package/yida-skills/skills/yida-design/templates/design-themes/app-platinum/form-layout.json +0 -14
  261. package/yida-skills/skills/yida-design/templates/design-themes/app-plum/app_theme.css +0 -748
  262. package/yida-skills/skills/yida-design/templates/design-themes/app-plum/design.md +0 -274
  263. package/yida-skills/skills/yida-design/templates/design-themes/app-plum/form-layout.json +0 -14
  264. package/yida-skills/skills/yida-design/templates/design-themes/app-pop/app_theme.css +0 -758
  265. package/yida-skills/skills/yida-design/templates/design-themes/app-pop/design.md +0 -281
  266. package/yida-skills/skills/yida-design/templates/design-themes/app-pop/form-layout.json +0 -14
  267. package/yida-skills/skills/yida-design/templates/design-themes/app-sage/app_theme.css +0 -748
  268. package/yida-skills/skills/yida-design/templates/design-themes/app-sage/design.md +0 -274
  269. package/yida-skills/skills/yida-design/templates/design-themes/app-sage/form-layout.json +0 -14
  270. package/yida-skills/skills/yida-design/templates/design-themes/app-teal/app_theme.css +0 -748
  271. package/yida-skills/skills/yida-design/templates/design-themes/app-teal/design.md +0 -274
  272. package/yida-skills/skills/yida-design/templates/design-themes/app-teal/form-layout.json +0 -14
  273. package/yida-skills/skills/yida-design/templates/design-themes/app-terminal/app_theme.css +0 -754
  274. package/yida-skills/skills/yida-design/templates/design-themes/app-terminal/design.md +0 -279
  275. package/yida-skills/skills/yida-design/templates/design-themes/app-terminal/form-layout.json +0 -14
  276. package/yida-skills/skills/yida-design/templates/design-themes/app-ticket/app_theme.css +0 -752
  277. package/yida-skills/skills/yida-design/templates/design-themes/app-ticket/design.md +0 -278
  278. package/yida-skills/skills/yida-design/templates/design-themes/app-ticket/form-layout.json +0 -13
  279. package/yida-skills/skills/yida-design/templates/design-themes/app-wire/app_theme.css +0 -748
  280. package/yida-skills/skills/yida-design/templates/design-themes/app-wire/design.md +0 -274
  281. package/yida-skills/skills/yida-design/templates/design-themes/app-wire/form-layout.json +0 -14
  282. package/yida-skills/skills/yida-design/templates/design-themes/basic-tokens.json +0 -118
  283. package/yida-skills/skills/yida-design/templates/design-themes/dark-inset-hairline/app_theme.css +0 -690
  284. package/yida-skills/skills/yida-design/templates/design-themes/dark-inset-hairline/design.md +0 -382
  285. package/yida-skills/skills/yida-design/templates/design-themes/dark-inset-hairline/form-layout.json +0 -13
  286. package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-fine-lines/app_theme.css +0 -691
  287. package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-fine-lines/design.md +0 -380
  288. package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-fine-lines/form-layout.json +0 -13
  289. package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-signal-panels/app_theme.css +0 -696
  290. package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-signal-panels/design.md +0 -378
  291. package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-signal-panels/form-layout.json +0 -13
  292. package/yida-skills/skills/yida-design/templates/design-themes/free-creative/app_theme.css +0 -689
  293. package/yida-skills/skills/yida-design/templates/design-themes/free-creative/design.md +0 -238
  294. package/yida-skills/skills/yida-design/templates/design-themes/free-creative/form-layout.json +0 -13
  295. package/yida-skills/skills/yida-design/templates/design-themes/graphite-bevel-grid/app_theme.css +0 -692
  296. package/yida-skills/skills/yida-design/templates/design-themes/graphite-bevel-grid/design.md +0 -375
  297. package/yida-skills/skills/yida-design/templates/design-themes/graphite-bevel-grid/form-layout.json +0 -13
  298. package/yida-skills/skills/yida-design/templates/design-themes/hairline-shared-bands/app_theme.css +0 -691
  299. package/yida-skills/skills/yida-design/templates/design-themes/hairline-shared-bands/design.md +0 -362
  300. package/yida-skills/skills/yida-design/templates/design-themes/hairline-shared-bands/form-layout.json +0 -13
  301. package/yida-skills/skills/yida-design/templates/design-themes/hairline-soft-blocks/app_theme.css +0 -691
  302. package/yida-skills/skills/yida-design/templates/design-themes/hairline-soft-blocks/design.md +0 -409
  303. package/yida-skills/skills/yida-design/templates/design-themes/hairline-soft-blocks/form-layout.json +0 -13
  304. package/yida-skills/skills/yida-design/templates/design-themes/index.json +0 -464
  305. package/yida-skills/skills/yida-design/templates/design-themes/ink-glow-soft-panels/app_theme.css +0 -701
  306. package/yida-skills/skills/yida-design/templates/design-themes/ink-glow-soft-panels/design.md +0 -379
  307. package/yida-skills/skills/yida-design/templates/design-themes/ink-glow-soft-panels/form-layout.json +0 -13
  308. package/yida-skills/skills/yida-design/templates/design-themes/inset-frame-pixel-rhythm/app_theme.css +0 -691
  309. package/yida-skills/skills/yida-design/templates/design-themes/inset-frame-pixel-rhythm/design.md +0 -404
  310. package/yida-skills/skills/yida-design/templates/design-themes/inset-frame-pixel-rhythm/form-layout.json +0 -13
  311. package/yida-skills/skills/yida-design/templates/design-themes/outlined-texture-duotone/app_theme.css +0 -698
  312. package/yida-skills/skills/yida-design/templates/design-themes/outlined-texture-duotone/design.md +0 -389
  313. package/yida-skills/skills/yida-design/templates/design-themes/outlined-texture-duotone/form-layout.json +0 -13
  314. package/yida-skills/skills/yida-design/templates/design-themes/soft-inset-surfaces/app_theme.css +0 -691
  315. package/yida-skills/skills/yida-design/templates/design-themes/soft-inset-surfaces/design.md +0 -372
  316. package/yida-skills/skills/yida-design/templates/design-themes/soft-inset-surfaces/form-layout.json +0 -13
  317. package/yida-skills/skills/yida-design/templates/design-themes/soft-outline-rhythm/app_theme.css +0 -690
  318. package/yida-skills/skills/yida-design/templates/design-themes/soft-outline-rhythm/design.md +0 -455
  319. package/yida-skills/skills/yida-design/templates/design-themes/soft-outline-rhythm/form-layout.json +0 -13
  320. package/yida-skills/skills/yida-design/templates/design-themes/soft-rail-bold-band/app_theme.css +0 -698
  321. package/yida-skills/skills/yida-design/templates/design-themes/soft-rail-bold-band/design.md +0 -394
  322. package/yida-skills/skills/yida-design/templates/design-themes/soft-rail-bold-band/form-layout.json +0 -13
  323. package/yida-skills/skills/yida-design/templates/design-themes/soft-spectral-panels/app_theme.css +0 -692
  324. package/yida-skills/skills/yida-design/templates/design-themes/soft-spectral-panels/design.md +0 -391
  325. package/yida-skills/skills/yida-design/templates/design-themes/soft-spectral-panels/form-layout.json +0 -13
  326. package/yida-skills/skills/yida-design/templates/design-themes/warm-canvas-contrast-panels/app_theme.css +0 -711
  327. package/yida-skills/skills/yida-design/templates/design-themes/warm-canvas-contrast-panels/design.md +0 -408
  328. package/yida-skills/skills/yida-design/templates/design-themes/warm-canvas-contrast-panels/form-layout.json +0 -13
  329. package/yida-skills/skills/yida-design/templates/design-themes/warm-rail-muted-panels/app_theme.css +0 -692
  330. package/yida-skills/skills/yida-design/templates/design-themes/warm-rail-muted-panels/design.md +0 -383
  331. package/yida-skills/skills/yida-design/templates/design-themes/warm-rail-muted-panels/form-layout.json +0 -13
  332. package/yida-skills/skills/yida-design/templates/navigation-styles.json +0 -769
  333. package/yida-skills/skills/yida-requirement-analysis/references/experience-groups.md +0 -79
  334. package/yida-skills/skills/yida-requirement-analysis/references/handoff.md +0 -68
@@ -101,8 +101,6 @@ const { SMART_VALIDATION_BLOCK_END, SMART_VALIDATION_BLOCK_START } = require('./
101
101
  const { createFieldNormalizers } = require('./create-form/field-normalizers');
102
102
  const {
103
103
  validateFormFieldDefinitions: collectFormFieldValidationDiagnostics,
104
- DIVIDER_TYPES,
105
- DEFAULT_DIVIDER_TYPE,
106
104
  } = require('./form-field-validator');
107
105
 
108
106
  function parseOpenOption(inputArgs) {
@@ -288,9 +286,28 @@ const FORM_PRESENTATION_TYPE_ALIAS = {
288
286
  columnContainer: 'ColumnsLayout',
289
287
  Column: 'Column',
290
288
  column: 'Column',
289
+ GroupContainer: 'PageSection',
290
+ groupContainer: 'PageSection',
291
+ PageSection: 'PageSection',
292
+ pageSection: 'PageSection',
291
293
  };
292
294
 
293
- const FORM_PRESENTATION_COMPONENTS = ['Divider', 'ColumnsLayout', 'Column'];
295
+ const FORM_PRESENTATION_COMPONENTS = ['Divider', 'ColumnsLayout', 'Column', 'PageSection'];
296
+ const DIVIDER_TYPE_PRIORITY = [
297
+ 'bold-with-thin',
298
+ 'double-color-trapezoid',
299
+ 'left-dot-title',
300
+ 'solid',
301
+ 'dashed',
302
+ 'thick',
303
+ 'dotted',
304
+ ];
305
+ const DEFAULT_DIVIDER_TYPE = DIVIDER_TYPE_PRIORITY[0];
306
+ const LEGACY_STRONG_DIVIDER_TYPE = 'multi-parallelograms-end';
307
+ const ALLOWED_DIVIDER_TYPES = new Set([
308
+ ...DIVIDER_TYPE_PRIORITY,
309
+ LEGACY_STRONG_DIVIDER_TYPE,
310
+ ]);
294
311
 
295
312
  const COMPONENT_ALIAS_META = Symbol('openyida.componentAlias');
296
313
 
@@ -517,6 +534,13 @@ function normalizeI18nValue(value, fallback) {
517
534
  return i18n(text, text, text);
518
535
  }
519
536
 
537
+ function normalizeStyleChoice(value, fallback) {
538
+ if (value && typeof value === 'object') {
539
+ return value;
540
+ }
541
+ return { value: value || fallback };
542
+ }
543
+
520
544
  function buildSchemaNode(componentName, props, children, options) {
521
545
  const node = {
522
546
  componentName: componentName,
@@ -550,12 +574,7 @@ function normalizeDividerType(type) {
550
574
  return DEFAULT_DIVIDER_TYPE;
551
575
  }
552
576
  const normalized = String(type).trim();
553
- if (!DIVIDER_TYPES.includes(normalized)) {
554
- throwCreateFormError(t('create_form.divider_type_invalid', normalized, DIVIDER_TYPES.join(', ')), 'CREATE_FORM_INVALID_DIVIDER_TYPE', {
555
- actual: type, expected: DIVIDER_TYPES,
556
- });
557
- }
558
- return normalized;
577
+ return ALLOWED_DIVIDER_TYPES.has(normalized) ? normalized : DEFAULT_DIVIDER_TYPE;
559
578
  }
560
579
 
561
580
  function buildDividerComponent(field) {
@@ -585,6 +604,41 @@ function buildDividerComponent(field) {
585
604
  return buildSchemaNode('Divider', props, undefined, { fieldId: props.fieldId || fieldId });
586
605
  }
587
606
 
607
+ function buildPageSectionComponent(field) {
608
+ const fieldId = field.fieldId || field.id || generateFieldId('PageSection');
609
+ const props = mergeExtraProps({
610
+ fieldId,
611
+ behavior: field.behavior || 'NORMAL',
612
+ visibility: field.visibility || ['PC', 'MOBILE'],
613
+ showHeader: field.showHeader !== undefined ? !!field.showHeader : true,
614
+ title: normalizeI18nValue(field.title !== undefined ? field.title : field.label, '分组'),
615
+ tooltip: normalizeI18nValue(field.tooltip || field.tips, ''),
616
+ showHeadDivider: field.showHeadDivider !== undefined ? !!field.showHeadDivider : true,
617
+ sectionHeaderStyle: field.sectionHeaderStyle || 'origin',
618
+ sectionHeaderBgColor: field.sectionHeaderBgColor || '#0089ff',
619
+ sectionHeaderTitleColor: field.sectionHeaderTitleColor || '#171A1D',
620
+ pcStyle: normalizeStyleChoice(field.pcStyle, 'origin'),
621
+ showBorder: !!field.showBorder,
622
+ withMargin: !!field.withMargin,
623
+ withPadding: field.withPadding !== undefined ? !!field.withPadding : true,
624
+ mobileStyle: normalizeStyleChoice(field.mobileStyle, 'origin'),
625
+ showBorderMobile: !!field.showBorderMobile,
626
+ withMarginMobile: !!field.withMarginMobile,
627
+ withPaddingMobile: !!field.withPaddingMobile,
628
+ }, field);
629
+
630
+ if (field.newIcon !== undefined) {
631
+ props.newIcon = field.newIcon;
632
+ }
633
+
634
+ return buildSchemaNode(
635
+ 'PageSection',
636
+ props,
637
+ buildFormNodeComponents(field.children || []),
638
+ { fieldId: props.fieldId || fieldId }
639
+ );
640
+ }
641
+
588
642
  function countLayoutColumns(layout) {
589
643
  const parts = String(layout || '12').split(':').filter(Boolean);
590
644
  return parts.length || 1;
@@ -638,6 +692,9 @@ function buildFormNodeComponent(field) {
638
692
  if (componentName === 'Divider') {
639
693
  return buildDividerComponent(field);
640
694
  }
695
+ if (componentName === 'PageSection') {
696
+ return buildPageSectionComponent(field);
697
+ }
641
698
  if (componentName === 'ColumnsLayout') {
642
699
  return buildColumnsLayoutComponent(field);
643
700
  }
@@ -1662,7 +1719,7 @@ function buildFormSchema(formTitle, fields, formUuid, corpId, appType, layout, t
1662
1719
  id: nextNodeId(),
1663
1720
  props: {
1664
1721
  contentBgColor: 'white',
1665
- pageStyle: { backgroundColor: 'transparent' },
1722
+ pageStyle: { backgroundColor: '#f2f3f5' },
1666
1723
  contentMargin: '20',
1667
1724
  contentPadding: '20',
1668
1725
  showTitle: false,
@@ -1685,6 +1742,7 @@ function buildFormSchema(formTitle, fields, formUuid, corpId, appType, layout, t
1685
1742
  labelWeightMobile: 'normal',
1686
1743
  },
1687
1744
  condition: true,
1745
+ css: 'body{background-color:#f2f3f5}',
1688
1746
  methods: {
1689
1747
  __initMethods__: {
1690
1748
  type: 'js',
@@ -1883,7 +1941,7 @@ function buildEmptyFormSchema() {
1883
1941
  id: nextNodeId(),
1884
1942
  props: {
1885
1943
  contentBgColor: 'white',
1886
- pageStyle: { backgroundColor: 'transparent' },
1944
+ pageStyle: { backgroundColor: '#f2f3f5' },
1887
1945
  contentMargin: '20',
1888
1946
  contentPadding: '20',
1889
1947
  showTitle: false,
@@ -1894,6 +1952,7 @@ function buildEmptyFormSchema() {
1894
1952
  contentBgColorMobile: 'white',
1895
1953
  },
1896
1954
  condition: true,
1955
+ css: 'body{background-color:#f2f3f5}',
1897
1956
  methods: {
1898
1957
  __initMethods__: {
1899
1958
  type: 'js',
@@ -2558,84 +2617,6 @@ function findFieldByIdOrLabelDeep(fields, identifier) {
2558
2617
  return null;
2559
2618
  }
2560
2619
 
2561
- function normalizeFormInjectionKey(key) {
2562
- return String(key || '').replace(/[^a-z0-9]/gi, '').toLowerCase();
2563
- }
2564
-
2565
- function isRawFormInjectionKey(key) {
2566
- const normalized = normalizeFormInjectionKey(key);
2567
- return normalized === 'srcdoc'
2568
- || normalized === 'stylesheet'
2569
- || normalized === 'stylesheets'
2570
- || normalized === 'styletext'
2571
- || normalized === 'styletag'
2572
- || normalized.includes('innerhtml')
2573
- || normalized.includes('outerhtml')
2574
- || normalized.includes('dangerouslysetinnerhtml')
2575
- || normalized.startsWith('css')
2576
- || normalized.endsWith('css')
2577
- || normalized.startsWith('html')
2578
- || normalized.endsWith('html');
2579
- }
2580
-
2581
- function isRawMarkupComponent(componentName) {
2582
- return ['html', 'iframe'].includes(String(componentName || '').toLowerCase());
2583
- }
2584
-
2585
- function assertNoFormInjectionValue(value, location) {
2586
- if (Array.isArray(value)) {
2587
- value.forEach(function (item, index) {
2588
- assertNoFormInjectionValue(item, location + '[' + index + ']');
2589
- });
2590
- return;
2591
- }
2592
- if (!value || typeof value !== 'object') {
2593
- return;
2594
- }
2595
- Object.keys(value).forEach(function (key) {
2596
- if (isRawFormInjectionKey(key)) {
2597
- throw new Error('表单补丁不支持 CSS/HTML 注入: ' + location + '.' + key);
2598
- }
2599
- if (normalizeFormInjectionKey(key) === 'componentname' && isRawMarkupComponent(value[key])) {
2600
- throw new Error('表单补丁不支持 CSS/HTML 注入组件: ' + value[key]);
2601
- }
2602
- assertNoFormInjectionValue(value[key], location + '.' + key);
2603
- });
2604
- }
2605
-
2606
- function assertNoFormInjectionPath(pointer, value) {
2607
- if (!pointer) {
2608
- return;
2609
- }
2610
- const segments = splitJsonPointer(pointer);
2611
- const blockedSegment = segments.find(isRawFormInjectionKey);
2612
- if (blockedSegment) {
2613
- throw new Error('表单补丁不支持 CSS/HTML 注入路径: ' + pointer);
2614
- }
2615
- const lastSegment = normalizeFormInjectionKey(segments[segments.length - 1]);
2616
- if (lastSegment === 'componentname' && isRawMarkupComponent(value)) {
2617
- throw new Error('表单补丁不支持 CSS/HTML 注入组件: ' + value);
2618
- }
2619
- }
2620
-
2621
- function assertNoFormInjectionSource(source, location) {
2622
- if (typeof source !== 'string' || source.length === 0) {
2623
- return;
2624
- }
2625
- const forbiddenPatterns = [
2626
- /\b(?:innerHTML|outerHTML|insertAdjacentHTML|dangerouslySetInnerHTML|srcdoc|cssText|insertRule|adoptedStyleSheets)\b/i,
2627
- /\bdocument\s*\.\s*(?:write|writeln)\s*\(/i,
2628
- /\bcreateElement\s*\(\s*['"`](?:style|script|iframe|link)['"`]\s*\)/i,
2629
- /\bsetAttribute\s*\(\s*['"`](?:style|srcdoc)['"`]/i,
2630
- /\.\s*style\s*(?:\.|\[)/i,
2631
- /<\s*(?:style|script|iframe|html|body)\b/i,
2632
- /openyida:theme|yida-global-theme/i,
2633
- ];
2634
- if (forbiddenPatterns.some(function (pattern) { return pattern.test(source); })) {
2635
- throw new Error('表单动作不支持 CSS/HTML 注入: ' + location);
2636
- }
2637
- }
2638
-
2639
2620
  function resolveJsonPointerParent(target, pointer) {
2640
2621
  const segments = splitJsonPointer(pointer);
2641
2622
  if (segments.length === 0) {
@@ -2791,7 +2772,6 @@ function applyAtomicFieldAction(schema, formContainer, operation) {
2791
2772
  const actions = ensureActionModule(schema);
2792
2773
  const source = readOptionalSource(operation, 'source', 'sourceFile');
2793
2774
  if (source !== undefined) {
2794
- assertNoFormInjectionSource(source, 'field-action ' + actionName);
2795
2775
  if (!extractExportedActionFunctionNames(source).includes(actionName)) {
2796
2776
  throw createCreateFormError(
2797
2777
  t('create_form.action_source_export_missing', actionName),
@@ -2807,14 +2787,12 @@ function applyAtomicFieldAction(schema, formContainer, operation) {
2807
2787
  }
2808
2788
  const blockStart = '/* openyida:field-action:start:' + actionName + ' */';
2809
2789
  const blockEnd = '/* openyida:field-action:end:' + actionName + ' */';
2810
- const nextActionSource = upsertGeneratedSourceBlockWithBounds(
2790
+ actions.module.source = upsertGeneratedSourceBlockWithBounds(
2811
2791
  actions.module.source || '',
2812
2792
  source,
2813
2793
  blockStart,
2814
2794
  blockEnd
2815
2795
  );
2816
- assertNoFormInjectionSource(nextActionSource, 'field-action module');
2817
- actions.module.source = nextActionSource;
2818
2796
  actions.module.compiled = compileActionSource(actions.module.source);
2819
2797
  actions.type = actions.type || 'FUNCTION';
2820
2798
  } else if (!extractExportedActionFunctionNames(actions.module.source || '').includes(actionName)) {
@@ -2859,14 +2837,6 @@ function applySchemaPatchOperations(schema, operations) {
2859
2837
  throw new Error('补丁[' + index + '] 缺少 action/op');
2860
2838
  }
2861
2839
 
2862
- assertNoFormInjectionPath(operation.path, operation.value);
2863
- if (Object.prototype.hasOwnProperty.call(operation, 'value')) {
2864
- assertNoFormInjectionValue(operation.value, '补丁[' + index + '].value');
2865
- }
2866
- if (operation.props !== undefined) {
2867
- assertNoFormInjectionValue(operation.props, '补丁[' + index + '].props');
2868
- }
2869
-
2870
2840
  if (['add', 'replace', 'remove'].includes(action)) {
2871
2841
  applyJsonPointerOperation(schema, operation);
2872
2842
  applied.push({ action, path: operation.path });
@@ -2926,8 +2896,6 @@ function applySchemaPatchOperations(schema, operations) {
2926
2896
  const source = readOptionalSource(operation, 'source', 'sourceFile');
2927
2897
  const compiled = readOptionalSource(operation, 'compiled', 'compiledFile')
2928
2898
  || (source ? compileActionSource(source) : undefined);
2929
- assertNoFormInjectionSource(source, 'actions-module source');
2930
- assertNoFormInjectionSource(compiled, 'actions-module compiled');
2931
2899
  if (source !== undefined) {
2932
2900
  actions.module.source = source;
2933
2901
  }
@@ -4391,6 +4359,10 @@ function applyFieldChanges(component, changes) {
4391
4359
  props.tips = i18n(changes.tips);
4392
4360
  }
4393
4361
 
4362
+ if (changes.tooltip !== undefined && component.componentName === 'PageSection') {
4363
+ props.tooltip = i18n(changes.tooltip);
4364
+ }
4365
+
4394
4366
  // ── 特殊处理:required(操作 validation 数组)
4395
4367
  if (changes.required !== undefined && !isFormPresentationComponent(component.componentName)) {
4396
4368
  if (changes.required) {
@@ -4886,10 +4858,7 @@ async function saveFormSchema(authRef, appType, formUuid, schema, version, stepO
4886
4858
  formUuid,
4887
4859
  result: sanitizeFailureResult(saveResult),
4888
4860
  });
4889
- if (failureContext && failureContext.deferFailureOutput) {
4890
- // Resume may safely resolve an HTTP 5xx by exact readback. Defer the
4891
- // failure payload so a recovered command emits one authoritative result.
4892
- } else if (failureContext) {
4861
+ if (failureContext) {
4893
4862
  emitCreateFormPostCreateFailure(Object.assign({}, failureContext, {
4894
4863
  stage: 'saveFormSchema',
4895
4864
  error: saveError,
@@ -4910,13 +4879,6 @@ async function saveFormSchema(authRef, appType, formUuid, schema, version, stepO
4910
4879
 
4911
4880
  // ── create 模式主流程 ─────────────────────────────────
4912
4881
 
4913
- function buildFormDeliveryUrls(baseUrl, appType, formUuid) {
4914
- return {
4915
- appUrl: baseUrl + '/' + appType + '/workbench',
4916
- formUrl: baseUrl + '/' + appType + '/workbench/' + formUuid,
4917
- };
4918
- }
4919
-
4920
4882
  async function mainValidateFields(parsedArgs) {
4921
4883
  const { fieldsJsonOrFile } = parsedArgs;
4922
4884
  assertNoEmojiInDefinitionFileName(fieldsJsonOrFile);
@@ -5072,13 +5034,13 @@ async function mainCreate(parsedArgs, authRef) {
5072
5034
  }
5073
5035
 
5074
5036
  // 输出结果
5075
- const { appUrl, formUrl } = buildFormDeliveryUrls(authRef.baseUrl, appType, formUuid);
5037
+ const formUrl = authRef.baseUrl + '/' + appType + '/workbench/' + formUuid;
5076
5038
  result(true, t('create_form.create_success'), [
5077
5039
  ['Form UUID', formUuid],
5078
5040
  ['URL', formUrl],
5079
5041
  ]);
5080
5042
  console.log(JSON.stringify(withBrowserHandoff(
5081
- { success: true, formUuid, formTitle, appType, fieldCount, icon: formIcon, iconSource: iconResolution.source, url: formUrl, formUrl, appUrl },
5043
+ { success: true, formUuid, formTitle, appType, fieldCount, icon: formIcon, iconSource: iconResolution.source, url: formUrl },
5082
5044
  formUrl,
5083
5045
  { stage: 'create_form_success', title: formTitle },
5084
5046
  parsedArgs.browserOpenMode
@@ -5165,7 +5127,6 @@ async function createFormForLegacyProcessQuiet(context, input) {
5165
5127
  }
5166
5128
  const saveResult = await saveFormSchema(authRef, appType, formUuid, schema, serverRevision, 4);
5167
5129
  const navIconResult = await updateCreatedFormNavigationIcon(authRef, appType, formUuid, formIcon);
5168
- const { appUrl, formUrl } = buildFormDeliveryUrls(authRef.baseUrl, appType, formUuid);
5169
5130
  return {
5170
5131
  success: true,
5171
5132
  appType,
@@ -5177,9 +5138,7 @@ async function createFormForLegacyProcessQuiet(context, input) {
5177
5138
  navIconResult,
5178
5139
  icon: formIcon,
5179
5140
  iconSource: iconResolution.source,
5180
- url: formUrl,
5181
- formUrl,
5182
- appUrl,
5141
+ url: authRef.baseUrl + '/' + appType + '/workbench/' + formUuid,
5183
5142
  };
5184
5143
  }
5185
5144
 
@@ -5360,7 +5319,7 @@ async function mainAddOption(parsedArgs, authRef) {
5360
5319
  // Step 4: 保存 Schema
5361
5320
  await saveFormSchema(authRef, appType, formUuid, schema, version, 4);
5362
5321
 
5363
- const { appUrl, formUrl } = buildFormDeliveryUrls(authRef.baseUrl, appType, formUuid);
5322
+ const formUrl = authRef.baseUrl + '/' + appType + '/workbench/' + formUuid;
5364
5323
  result(true, '选项追加成功', [
5365
5324
  ['Form UUID', formUuid],
5366
5325
  ['Field', fieldLabel],
@@ -5380,8 +5339,6 @@ async function mainAddOption(parsedArgs, authRef) {
5380
5339
  skipped: skippedOptions,
5381
5340
  totalOptions: existingDataSource.length,
5382
5341
  url: formUrl,
5383
- formUrl,
5384
- appUrl,
5385
5342
  }));
5386
5343
  }
5387
5344
 
@@ -5481,7 +5438,7 @@ async function mainBindDataSource(parsedArgs, authRef) {
5481
5438
 
5482
5439
  await saveFormSchema(authRef, appType, formUuid, schema, version, 4);
5483
5440
 
5484
- const { appUrl, formUrl } = buildFormDeliveryUrls(authRef.baseUrl, appType, formUuid);
5441
+ const formUrl = authRef.baseUrl + '/' + appType + '/workbench/' + formUuid;
5485
5442
  result(true, '字段数据源保存成功', [
5486
5443
  ['Form UUID', formUuid],
5487
5444
  ['Field', fieldLabel],
@@ -5502,8 +5459,6 @@ async function mainBindDataSource(parsedArgs, authRef) {
5502
5459
  options: normalized.options.length,
5503
5460
  filterLocal: targetComponent.props.filterLocal,
5504
5461
  pageUrl: formUrl,
5505
- formUrl,
5506
- appUrl,
5507
5462
  },
5508
5463
  formUrl,
5509
5464
  { stage: 'bind_datasource_success', title: formUuid },
@@ -6154,59 +6109,6 @@ async function readResumeSchema(authRef, appType, formUuid) {
6154
6109
  return { schemaResult, schema, version: extractSchemaServerRevision(schemaResult) };
6155
6110
  }
6156
6111
 
6157
- function isRetryableResumeSaveServerFailure(errorObject) {
6158
- const status = Number(errorObject?.details?.result?.__httpStatus);
6159
- return errorObject?.code === 'CREATE_FORM_SAVE_SCHEMA_FAILED' &&
6160
- Number.isInteger(status) && status >= 500 && status <= 599;
6161
- }
6162
-
6163
- async function saveResumeSchemaWithSafeRetry(authRef, appType, formUuid, schema, version, fields) {
6164
- const save = (value, revision) => saveFormSchema(
6165
- authRef, appType, formUuid, value, revision, 4, { deferFailureOutput: true }
6166
- );
6167
- try {
6168
- await save(schema, version);
6169
- return '';
6170
- } catch (originalError) {
6171
- if (!isRetryableResumeSaveServerFailure(originalError)) { throw originalError; }
6172
-
6173
- let readback;
6174
- try { readback = await readResumeSchema(authRef, appType, formUuid); } catch (_) { throw originalError; }
6175
- const root = readback.schema.pages[0].componentsTree && readback.schema.pages[0].componentsTree[0];
6176
- const container = root ? findFormContainer(root) : null;
6177
- if (!container) { throw originalError; }
6178
- const evidence = collectResumeFieldEvidence(container.children);
6179
- const verified = buildResumeChanges(
6180
- evidence,
6181
- collectResumeDesiredFields(fields, { verifyNestedFields: true })
6182
- );
6183
- if (verified.conflicts.length > 0) { throw originalError; }
6184
- if (verified.missing.length === 0) { return 'save_schema_recovered_by_readback'; }
6185
- const retryPlan = buildResumeChanges(evidence, collectResumeDesiredFields(fields));
6186
- if (retryPlan.conflicts.length > 0 || retryPlan.missing.length === 0) { throw originalError; }
6187
- const applied = applyChangesToSchema(
6188
- readback.schema,
6189
- retryPlan.missing.map(function (field) { return { action: 'add', field }; }),
6190
- { verbose: true }
6191
- );
6192
- if ((applied.diagnostics || []).length > 0) { throw originalError; }
6193
- const updatedContainer = findFormContainer(readback.schema.pages[0].componentsTree[0]);
6194
- fillSerialNumberFormulas(updatedContainer.children, resolveCorpId(authRef.authData), appType, formUuid);
6195
-
6196
- try {
6197
- await save(readback.schema, readback.version);
6198
- } catch (retryError) {
6199
- originalError.details = Object.assign({}, originalError.details, {
6200
- safeRetryAttempted: true,
6201
- retryErrorCode: retryError?.code || 'CREATE_FORM_SAVE_SCHEMA_FAILED',
6202
- retryResult: sanitizeFailureResult(retryError?.details?.result),
6203
- });
6204
- throw originalError;
6205
- }
6206
- return 'save_schema_retried';
6207
- }
6208
- }
6209
-
6210
6112
  async function mainResume(parsedArgs, authRef) {
6211
6113
  const { appType, formUuid, fieldsJsonOrFile } = parsedArgs;
6212
6114
  assertNoEmojiInDefinitionFileName(fieldsJsonOrFile);
@@ -6237,11 +6139,8 @@ async function mainResume(parsedArgs, authRef) {
6237
6139
  if (resumeValidationRules.length > 0) {
6238
6140
  applySmartValidations(firstRead.schema, resumeValidationRules);
6239
6141
  }
6240
- const saveRecoveryStage = await saveResumeSchemaWithSafeRetry(
6241
- authRef, appType, formUuid, firstRead.schema, firstRead.version, fields
6242
- );
6142
+ await saveFormSchema(authRef, appType, formUuid, firstRead.schema, firstRead.version, 4);
6243
6143
  completedStages.push('rebuild_blank_schema', 'save_schema');
6244
- if (saveRecoveryStage) { completedStages.push(saveRecoveryStage); }
6245
6144
  recoveredBlankShell = true;
6246
6145
  plan = {
6247
6146
  existing: [],
@@ -6290,11 +6189,8 @@ async function mainResume(parsedArgs, authRef) {
6290
6189
  const corpId = resolveCorpId(authRef.authData);
6291
6190
  const updatedContainer = findFormContainer(firstRead.schema.pages[0].componentsTree[0]);
6292
6191
  fillSerialNumberFormulas(updatedContainer.children, corpId, appType, formUuid);
6293
- const saveRecoveryStage = await saveResumeSchemaWithSafeRetry(
6294
- authRef, appType, formUuid, firstRead.schema, firstRead.version, fields
6295
- );
6192
+ await saveFormSchema(authRef, appType, formUuid, firstRead.schema, firstRead.version, 4);
6296
6193
  completedStages.push('add_missing_fields', 'save_schema');
6297
- if (saveRecoveryStage) { completedStages.push(saveRecoveryStage); }
6298
6194
  }
6299
6195
 
6300
6196
  const finalRead = await readResumeSchema(authRef, appType, formUuid);
@@ -6315,7 +6211,7 @@ async function mainResume(parsedArgs, authRef) {
6315
6211
  });
6316
6212
  }
6317
6213
  completedStages.push('verify_final_schema');
6318
- const { appUrl, formUrl } = buildFormDeliveryUrls(authRef.baseUrl, appType, formUuid);
6214
+ const formUrl = authRef.baseUrl + '/' + appType + '/workbench/' + formUuid;
6319
6215
  const output = {
6320
6216
  success: true,
6321
6217
  appType,
@@ -6327,8 +6223,6 @@ async function mainResume(parsedArgs, authRef) {
6327
6223
  finalFieldCount: collectResumeFieldEvidence(finalContainer.children).length,
6328
6224
  recoveredBlankShell,
6329
6225
  url: formUrl,
6330
- formUrl,
6331
- appUrl,
6332
6226
  };
6333
6227
  console.log(JSON.stringify(withBrowserHandoff(
6334
6228
  output,
@@ -6490,14 +6384,14 @@ async function mainUpdate(parsedArgs, authRef) {
6490
6384
  await saveFormSchema(authRef, appType, formUuid, schema, version, 6);
6491
6385
 
6492
6386
  // 输出结果
6493
- const { appUrl, formUrl } = buildFormDeliveryUrls(authRef.baseUrl, appType, formUuid);
6387
+ const formUrl = authRef.baseUrl + '/' + appType + '/workbench/' + formUuid;
6494
6388
  result(true, t('create_form.update_success'), [
6495
6389
  ['Form UUID', formUuid],
6496
6390
  ['URL', formUrl],
6497
6391
  ['Changes', String(appliedChanges.length)],
6498
6392
  ]);
6499
6393
  console.log(JSON.stringify(withBrowserHandoff(
6500
- { success: true, formUuid, appType, changesApplied: appliedChanges.length, changes: appliedChanges, url: formUrl, formUrl, appUrl },
6394
+ { success: true, formUuid, appType, changesApplied: appliedChanges.length, changes: appliedChanges, url: formUrl },
6501
6395
  formUrl,
6502
6396
  { stage: 'update_form_success', title: formUuid },
6503
6397
  parsedArgs.browserOpenMode
@@ -6554,7 +6448,6 @@ module.exports = {
6554
6448
  parseArgs,
6555
6449
  _private: {
6556
6450
  buildFormSchema,
6557
- buildEmptyFormSchema,
6558
6451
  buildFormNodeComponent,
6559
6452
  countDataFieldDefinitions,
6560
6453
  collectComponentNames,
@@ -19,7 +19,6 @@ const { buildYidaI18n, buildYidaTitleI18n, normalizeYidaLocale, resolveContentLo
19
19
  const { parseOpenOption, withBrowserHandoff } = require('../core/browser-handoff');
20
20
  const { throwCommandError } = require('../core/command-errors');
21
21
  const { buildApiPath } = require('./create-form/api-path');
22
- const { fetchFormSchemaInfo } = require('./get-form-config');
23
22
 
24
23
  function parseArgs(args) {
25
24
  const openOption = parseOpenOption(args);
@@ -92,13 +91,13 @@ function parseBooleanOption(value, optionName) {
92
91
  throw new Error(`Invalid boolean value for ${optionName}: ${value}`);
93
92
  }
94
93
 
95
- function buildPageInfoPostData(formUuid, pageName, isRenderNav, csrfToken, currentConfig) {
94
+ function buildPageInfoPostData(formUuid, pageName, isRenderNav, csrfToken) {
96
95
  const titleJson = JSON.stringify(buildYidaTitleI18n(pageName, {
97
96
  en_US: pageName,
98
97
  ja_JP: pageName,
99
98
  }));
100
99
 
101
- const payload = {
100
+ return querystring.stringify({
102
101
  _api: 'Form.updateFormSchemaInfo',
103
102
  _csrf_token: csrfToken,
104
103
  _locale_time_zone_offset: '28800000',
@@ -126,64 +125,17 @@ function buildPageInfoPostData(formUuid, pageName, isRenderNav, csrfToken, curre
126
125
  displayType: 'RE',
127
126
  isRenderNav: isRenderNav ? 'true' : 'false',
128
127
  manageCustomActionInfo: '[]',
129
- };
130
- // 与 update-form-config 一样,保留当前配置,只覆盖标题和导航。
131
- for (const key of Object.keys(payload)) {
132
- if (key.startsWith('_') || ['formUuid', 'title', 'isRenderNav'].includes(key)) {continue;}
133
- const value = currentConfig?.[key];
134
- if (value !== undefined && value !== null) {
135
- payload[key] = typeof value === 'object' ? JSON.stringify(value) : value;
136
- }
137
- }
138
- return querystring.stringify(payload);
139
- }
140
-
141
- function readRenderNav(config) {
142
- const value = config && Object.prototype.hasOwnProperty.call(config, 'renderNav')
143
- ? config.renderNav : config?.isRenderNav;
144
- if (value === false || value === 'false') {return false;}
145
- if (value === true || value === 'true') {return true;}
146
- return null;
128
+ });
147
129
  }
148
130
 
149
131
  async function configureNavigationVisibility(authRef, appType, pageId, pageName, isRenderNav) {
150
- const verification = { requestedRenderNav: isRenderNav, renderNav: null, verified: false, attempts: 0 };
151
- let currentConfig = null;
152
- const readConfig = async () => {
153
- const response = await fetchFormSchemaInfo(authRef, appType, pageId);
154
- if (!response || response.success === false || response.__needLogin || response.__csrfExpired) {
155
- throw new Error(response?.errorMsg || t('common.request_failed'));
156
- }
157
- currentConfig = response.content || response.result || response.data || {};
158
- verification.renderNav = readRenderNav(currentConfig);
159
- };
160
- try {
161
- await readConfig();
162
- for (let attempt = 0; attempt < 2; attempt++) {
163
- verification.attempts++;
164
- // 写入后旧读值不再证明当前状态;回读失败必须报告未知。
165
- verification.renderNav = null;
166
- const response = await requestWithAutoLogin((auth) => httpPost(
167
- auth.baseUrl,
168
- buildApiPath(appType, 'updateFormSchemaInfo'),
169
- buildPageInfoPostData(pageId, pageName, isRenderNav, auth.csrfToken, currentConfig)
170
- ), authRef);
171
- await readConfig();
172
- if (verification.renderNav === isRenderNav) {
173
- verification.verified = true;
174
- return verification;
175
- }
176
- if (!response?.success || response.__needLogin || response.__csrfExpired) {
177
- verification.error = response?.errorMsg || t('common.request_failed');
178
- return verification;
179
- }
180
- // 只补写已创建页面的配置,不重试创建;未知状态也不能当作隐藏成功。
181
- }
182
- verification.error = t('create_page.navigation_unverified');
183
- } catch (err) {
184
- verification.error = err.message;
185
- }
186
- return verification;
132
+ return requestWithAutoLogin((auth) => {
133
+ return httpPost(
134
+ auth.baseUrl,
135
+ `/dingtalk/web/${appType}/query/formdesign/updateFormSchemaInfo.json`,
136
+ buildPageInfoPostData(pageId, pageName, isRenderNav, auth.csrfToken)
137
+ );
138
+ }, authRef);
187
139
  }
188
140
 
189
141
  async function run(args) {
@@ -261,49 +213,30 @@ async function run(args) {
261
213
  const workbenchUrl = `${authRef.baseUrl}/${appType}/workbench/${pageId}`;
262
214
  let pageUrl = workbenchUrl;
263
215
  let dashboardConfigWarning = null;
264
- let navigationVerification = null;
265
216
 
266
217
  if (options.hideNav) {
267
218
  step(3, t('create_page.step_dashboard_config'));
268
- navigationVerification = await configureNavigationVisibility(authRef, appType, pageId, pageName, false);
269
- if (navigationVerification.verified) {
219
+ const configResponse = await configureNavigationVisibility(authRef, appType, pageId, pageName, false);
220
+ if (configResponse && configResponse.success) {
270
221
  chalkSuccess(t('create_page.dashboard_config_ok'));
271
222
  pageUrl = `${authRef.baseUrl}/${appType}/custom/${pageId}?isRenderNav=false`;
272
223
  } else {
273
- dashboardConfigWarning = navigationVerification.error;
224
+ dashboardConfigWarning = configResponse ? configResponse.errorMsg || t('common.unknown_error') : t('common.request_failed');
274
225
  warn(t('create_page.dashboard_config_failed', dashboardConfigWarning));
275
226
  }
276
227
  }
277
228
 
278
- const complete = !options.hideNav || navigationVerification.verified;
279
- const result = {
280
- success: complete, pageCreated: true, pageId, pageName, appType, mode,
281
- hideNavRequested: options.hideNav,
282
- hideNav: options.hideNav ? (navigationVerification.renderNav === null ? null : !navigationVerification.renderNav) : false,
283
- chromeless: options.hideNav && navigationVerification.verified,
284
- navigationVerification, url: pageUrl, workbenchUrl, dashboardConfigWarning,
285
- };
286
- if (!complete) {
287
- result.errorCode = 'CREATE_PAGE_NAVIGATION_NOT_VERIFIED';
288
- result.recovery = {
289
- command: 'update-form-config', args: [appType, pageId, 'false', pageName],
290
- verifyCommand: 'get-form-config', verifyArgs: [appType, pageId, '--json'],
291
- };
292
- }
293
- chalkResult(complete, complete ? t('create_page.success') : t('create_page.navigation_unverified'), [
229
+ chalkResult(true, t('create_page.success'), [
294
230
  ['Page ID', pageId],
295
231
  ['URL', `${c.cyan}${pageUrl}${c.reset}`],
296
232
  ]);
297
233
 
298
- console.log(JSON.stringify(complete ? withBrowserHandoff(
299
- result,
234
+ console.log(JSON.stringify(withBrowserHandoff(
235
+ { success: true, pageId, pageName, appType, mode, hideNav: options.hideNav, chromeless: options.hideNav && !dashboardConfigWarning, url: pageUrl, workbenchUrl, dashboardConfigWarning },
300
236
  pageUrl,
301
237
  { stage: 'create_page_success', title: pageName },
302
238
  options.openMode
303
- ) : result));
304
- if (!complete) {
305
- throwCommandError(t('create_page.navigation_unverified'), { code: result.errorCode, details: result });
306
- }
239
+ )));
307
240
  } else {
308
241
  const errorMsg = response ? response.errorMsg || response.error || t('common.unknown_error') : t('common.request_failed');
309
242
  const errorCode = response && response.errorCode ? response.errorCode : 'CREATE_PAGE_FAILED';