openyida 2026.9.21 → 2026.9.22-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +148 -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
@@ -59,28 +59,11 @@ function buildProvider(css, url) {
59
59
  sha256: crypto.createHash('sha256').update(css).digest('hex'),
60
60
  tokens: readThemeSnapshot(css),
61
61
  };
62
- return renderProvider(source);
63
- }
64
-
65
- function renderProvider(source, includeImports = true) {
66
- let template = fs.readFileSync(path.join(__dirname, 'canvas-theme-provider.template.jsx'), 'utf8');
67
- if (!includeImports) {template = template.slice(template.indexOf('const CANVAS_THEME_SOURCE'));}
62
+ const template = fs.readFileSync(path.join(__dirname, 'canvas-theme-provider.template.jsx'), 'utf8');
68
63
  // Keep generated source safe to embed in HTML and compatible with Canvas compilation.
69
64
  return template.replace('__CANVAS_THEME_SOURCE__', JSON.stringify(source).replace(/</g, '\\u003c'));
70
65
  }
71
66
 
72
- function buildApplicationProvider(includeImports = true) {
73
- return renderProvider({ url: '', sha256: '', tokens: {} }, includeImports);
74
- }
75
-
76
- function assembleApplicationTheme(source) {
77
- const marker = '/* @canvas-application-theme */';
78
- const parts = source.split(marker);
79
- if (parts.length === 1) {return source;}
80
- if (parts.length !== 2) {throw new Error('Sample must contain exactly one application theme marker');}
81
- return parts.join(buildApplicationProvider(false));
82
- }
83
-
84
67
  function run(args) {
85
68
  const options = {};
86
69
  for (let i = 0; i < args.length; i += 2) {
@@ -104,12 +87,10 @@ function run(args) {
104
87
  result = page.replace(marker, () => provider);
105
88
  } else {
106
89
  result = provider + `
107
- import { Button, Space, Modal, Tabs, Segmented, Radio } from 'antd';
90
+ import { Button, Space, Modal } from 'antd';
108
91
  function ThemePreviewContent() {
109
92
  const { status, token } = useCanvasThemeContext();
110
93
  const [modal, holder] = Modal.useModal();
111
- const [category, setCategory] = React.useState('全部');
112
- const categories = ['全部', '人像摄影', '风光摄影', '商业静物', '婚礼纪实'];
113
94
  return <section style={{ margin: 24, padding: 24, background: 'var(--pod-card-bg-color, var(--color-white, #fff))' }}>
114
95
  {holder}
115
96
  <h2>Canvas 主题预览</h2>
@@ -117,15 +98,8 @@ function ThemePreviewContent() {
117
98
  <Space wrap>
118
99
  <Button type="primary">主操作</Button><Button>次操作</Button>
119
100
  <Button danger>危险操作</Button><Button disabled>禁用</Button>
120
- <Button type="link">主题链接</Button>
121
101
  <Button onClick={() => modal.confirm({ title: '主题确认弹窗', content: '检查按钮与页面主题是否一致' })}>打开弹窗</Button>
122
102
  </Space>
123
- <h3>分类筛选</h3>
124
- <Segmented options={categories} value={category} onChange={setCategory} />
125
- <p>当前分类:{category}</p>
126
- <Radio.Group value={category} onChange={event => setCategory(event.target.value)} optionType="button" options={categories} />
127
- <h3>内容视图</h3>
128
- <Tabs items={[{key:'works',label:'作品',children:'作品内容'}, {key:'albums',label:'相册',children:'相册内容'}, {key:'disabled',label:'暂不可用',disabled:true}]} />
129
103
  </section>;
130
104
  }
131
105
  function YidaComp() {
@@ -145,4 +119,4 @@ if (require.main === module) {
145
119
  process.exitCode = 1;
146
120
  }
147
121
  }
148
- module.exports = { readThemeSnapshot, buildProvider, buildApplicationProvider, assembleApplicationTheme, run };
122
+ module.exports = { readThemeSnapshot, buildProvider, run };
@@ -6,19 +6,17 @@ const CanvasThemeContext = React.createContext(null);
6
6
  const CANVAS_THEME_ROLES = {
7
7
  colorPrimary: ['--color-brand1-6'], colorLink: ['--color-brand1-6'],
8
8
  colorPrimaryHover: ['--color-brand1-5'], colorPrimaryActive: ['--color-brand1-9'],
9
- colorLinkHover: ['--color-brand1-5'], colorLinkActive: ['--color-brand1-9'],
10
9
  colorBgLayout: ['--pod-page-bg-color', '--color-white'],
11
10
  colorBgContainer: ['--pod-card-bg-color', '--color-white'],
12
11
  colorBgElevated: ['--pod-card-bg-color', '--color-white'],
13
12
  colorText: ['--color-text1-4'], colorTextHeading: ['--color-text1-4'],
14
13
  colorTextSecondary: ['--color-text1-3'], colorTextDescription: ['--color-text1-3'],
15
14
  colorTextPlaceholder: ['--color-text1-10'],
16
- colorTextDisabled: ['--color-text1-2'], colorBgContainerDisabled: ['--color-fill1-1'],
17
15
  colorBorder: ['--color-line1-2'], colorBorderSecondary: ['--color-line1-1'],
18
16
  colorFillAlter: ['--color-fill1-1'], colorFillSecondary: ['--color-fill1-2'],
19
17
  };
20
18
 
21
- function resolveCanvasTheme(root, roles = CANVAS_THEME_ROLES) {
19
+ function resolveCanvasTheme(root) {
22
20
  const view = root.ownerDocument.defaultView;
23
21
  const scope = view.getComputedStyle(root);
24
22
  const probe = root.ownerDocument.createElement('span');
@@ -26,7 +24,7 @@ function resolveCanvasTheme(root, roles = CANVAS_THEME_ROLES) {
26
24
  root.appendChild(probe);
27
25
  const token = {};
28
26
  try {
29
- Object.entries(roles).forEach(([role, names]) => {
27
+ Object.entries(CANVAS_THEME_ROLES).forEach(([role, names]) => {
30
28
  const value = names.map((name) => scope.getPropertyValue(name).trim()).find(Boolean);
31
29
  if (!value || !view.CSS.supports('color', value)) return;
32
30
  probe.style.color = value;
@@ -39,62 +37,10 @@ function resolveCanvasTheme(root, roles = CANVAS_THEME_ROLES) {
39
37
  }
40
38
  }
41
39
 
42
- // Computed sRGB colors only. Unknown color spaces retain the library defaults.
43
- function canvasRgb(value) {
44
- const match = typeof value === 'string' && value.match(/^rgba?\(\s*([\d.]+)[,\s]+([\d.]+)[,\s]+([\d.]+)(?:\s*[,/]\s*([\d.]+))?\s*\)$/i);
45
- if (!match) return null;
46
- const result = match.slice(1, 4).map(Number);
47
- return result.every(channel => channel >= 0 && channel <= 255) && (match[4] === undefined || Number(match[4]) === 1) ? result : null;
48
- }
49
-
50
- function canvasContrast(foreground, background) {
51
- const luminance = value => {
52
- const rgb = canvasRgb(value);
53
- if (!rgb) return null;
54
- const linear = rgb.map(channel => channel / 255).map(channel => channel <= 0.04045 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4);
55
- return linear[0] * 0.2126 + linear[1] * 0.7152 + linear[2] * 0.0722;
56
- };
57
- const a = luminance(foreground), b = luminance(background);
58
- return a === null || b === null ? null : (Math.max(a, b) + 0.05) / (Math.min(a, b) + 0.05);
59
- }
60
-
61
- function resolveCanvasControls(token) {
62
- const primary = token.colorPrimary;
63
- const surface = token.colorBgContainer || token.colorBgLayout || 'rgb(255, 255, 255)';
64
- if (!canvasRgb(primary) || !canvasRgb(surface)) return null;
65
- const readable = (background, preferred) => preferred.concat(['rgb(0, 0, 0)', 'rgb(255, 255, 255)'])
66
- .find(color => canvasContrast(color, background) >= 4.5);
67
- const mix = amount => 'rgb(' + canvasRgb(primary).map((channel, index) => Math.round(channel * amount + canvasRgb(surface)[index] * (1 - amount))).join(', ') + ')';
68
- const selectedBg = mix(0.10);
69
- const primaryText = readable(primary, ['rgb(255, 255, 255)', token.colorText]);
70
- return {
71
- surface, text: readable(surface, [token.colorText]),
72
- selectedBg, selectedColor: readable(selectedBg, [primary, token.colorText]),
73
- hoverBg: mix(0.06), activeBg: mix(0.14),
74
- emphasis: readable(surface, [primary, token.colorText]),
75
- primaryText,
76
- primaryHover: canvasContrast(primaryText, token.colorPrimaryHover) >= 4.5 ? token.colorPrimaryHover : primary,
77
- primaryActive: canvasContrast(primaryText, token.colorPrimaryActive) >= 4.5 ? token.colorPrimaryActive : primary,
78
- };
79
- }
80
-
81
- function resolveCanvasControlComponents(token, controls) {
82
- if (!controls) return {};
83
- const { surface, text, selectedBg, selectedColor, hoverBg, activeBg, emphasis, primaryText, primaryHover, primaryActive } = controls;
84
- return {
85
- Tabs: { itemColor: text, itemSelectedColor: emphasis, itemHoverColor: emphasis, itemActiveColor: emphasis, inkBarColor: token.colorPrimary },
86
- Segmented: { trackBg: surface, itemColor: text, itemHoverColor: text, itemHoverBg: hoverBg, itemActiveBg: activeBg, itemSelectedBg: selectedBg, itemSelectedColor: selectedColor },
87
- Button: { defaultColor: text, defaultHoverColor: emphasis, defaultActiveColor: emphasis,
88
- primaryColor: primaryText, colorPrimaryHover: primaryHover, colorPrimaryActive: primaryActive },
89
- Radio: { buttonColor: text, buttonBg: surface, buttonCheckedBg: selectedBg, colorPrimary: selectedColor, colorPrimaryHover: selectedColor, colorPrimaryActive: selectedColor,
90
- buttonSolidCheckedBg: token.colorPrimary, buttonSolidCheckedColor: primaryText, buttonSolidCheckedHoverBg: primaryHover, buttonSolidCheckedActiveBg: primaryActive },
91
- };
92
- }
93
-
94
40
  // preview=true is explicit: the local snapshot is scoped to this page only.
95
41
  function CanvasThemeProvider({ children, preview = false, getPopupContainer }) {
96
42
  const rootRef = React.useRef(null);
97
- const [theme, setTheme] = React.useState({ token: {}, components: {}, controls: null, status: 'loading' });
43
+ const [theme, setTheme] = React.useState({ token: {}, status: 'loading' });
98
44
  React.useLayoutEffect(() => {
99
45
  const root = rootRef.current;
100
46
  const doc = root.ownerDocument;
@@ -104,11 +50,9 @@ function CanvasThemeProvider({ children, preview = false, getPopupContainer }) {
104
50
  let next;
105
51
  try {
106
52
  const token = resolveCanvasTheme(root);
107
- const controls = resolveCanvasControls(token);
108
- const components = { ...resolveCanvasControlComponents(token, controls), Drawer: resolveCanvasTheme(root, { colorBgElevated: ['--pod-shell-theme-bg-color', '--color-white'], colorText: ['--pod-page-header-text-color', '--color-text1-4'], colorTextHeading: ['--pod-page-header-text-color', '--color-text1-4'] }) };
109
- next = { token, components, controls, status: token.colorPrimary ? (preview ? 'preview' : 'ready') : 'missing' };
53
+ next = { token, status: token.colorPrimary ? (preview ? 'preview' : 'ready') : 'missing' };
110
54
  } catch (_error) {
111
- next = { token: {}, components: {}, controls: null, status: 'error' };
55
+ next = { token: {}, status: 'error' };
112
56
  }
113
57
  setTheme((previous) => JSON.stringify(previous) === JSON.stringify(next) ? previous : next);
114
58
  };
@@ -144,15 +88,8 @@ function CanvasThemeProvider({ children, preview = false, getPopupContainer }) {
144
88
  background: 'var(--pod-page-bg-color, var(--color-white, #fff))',
145
89
  color: 'var(--color-text1-4, #1f2329)',
146
90
  }}>
147
- {/* Keep late CSS resets from animating the loading mask's border. */}
148
- <style>{`
149
- [data-canvas-theme-status] .ant-spin-nested-loading .ant-spin-container::after {
150
- border: 0 solid transparent;
151
- transition: opacity 0.3s;
152
- }
153
- `}</style>
154
91
  <CanvasThemeContext.Provider value={context}>
155
- <ConfigProvider theme={{ token: theme.token, components: theme.components }} getPopupContainer={getPopupContainer}>{children}</ConfigProvider>
92
+ <ConfigProvider theme={{ token: theme.token }} getPopupContainer={getPopupContainer}>{children}</ConfigProvider>
156
93
  </CanvasThemeContext.Provider>
157
94
  </div>
158
95
  );
@@ -13,13 +13,9 @@ description: 自定义页面真实数据接入技能。用于在使用 `YidaCode
13
13
 
14
14
  ## 运行时事实
15
15
 
16
- 涉及确认、取消、签到、删除等写操作时,编码前先读[业务动作授权](references/business-action-permissions.md),在当前实现计划中记录角色、真实资源、数据范围、可写字段、前置状态和服务端实现;无法满足约束的动作保持禁用并列为未完成。界面显隐和管理员正向测试不能替代服务端授权及普通用户越权用例验证。
17
-
18
16
  - `YidaCodeCanvas` 组件只透传 `code / runtimeCode / importedModules / pageType`。
19
17
  - 组件内没有 `this` 上下文,也没有 `dataSourceMap`。
20
18
  - `this.utils.yida.*`、`didMount()`、`_customState` 等普通页面契约在 `YidaComp` 内不可直接使用;发布使用 `YidaCodeCanvas` 组件实现的页面时,外层普通页面的 `didMount` 必须自动把 `this.utils.yida.*` 封装到 `window.__OPENYIDA_YIDA_API__`,并把 `this.utils.toast/dialog/router.push/openPage/isMobile` 等根级工具封装到 `window.__OPENYIDA_UTILS__`,组件内部只能消费这些 window 桥。
21
- - 桥对象存在只代表发布层已注入能力,不代表当前访客具有登录态。公开页 `/o/...` 中桥可能存在,但匿名用户调用其 `saveFormData` 仍会返回 `LOGIN FAILED`;写入前必须先按 `pageConfig.FREELOGIN === 'true'` 或 `loginUser.userId === 'FREEUSER'` 分流。
22
- - 登录态表单写入继续使用 `window.__OPENYIDA_YIDA_API__.saveFormData`;匿名态只能按[公开访问(匿名态)提交](../yida-canvas-custom-page/references/data-bridge-guide.md#公开访问匿名态提交)走 `window.pageConfig.RECEIPT_SAVE_FORM_DATA`,不得在桥失败后盲目重试。
23
19
  - `YidaCodeCanvas` 组件没有官方 `useDataBinding` hook,不得从任何包 `import { useDataBinding }`;真实表单数据绑定用页面内本地 `useYidaData(binding)`、`DataBridge` 和 yida JS-API 桥实现。
24
20
  - Cookie 由浏览器同源请求自动携带,前端代码不能硬编码 Cookie、appSecret、accessKey 或外部密钥。
25
21
  - `mode=form` 读取宜搭表单数据时,默认调用 `window.__OPENYIDA_YIDA_API__.searchFormDatas(params)`,它底层来自官方 `this.utils.yida.searchFormDatas(params)`。发布层同一个桥也同步 `this.utils.yida` 的表单、流程、表单设计与运行态方法,例如 `saveFormData`、`updateFormData`、`startProcessInstance`、`getProcessInstances`、`request`、`searchUserList`。参数至少包含 `formUuid`、`currentPage`、`pageSize` 和 `searchFieldJson`,`pageSize` 一般显式写 `50`,字段 ID 必须来自真实 schema。
@@ -173,23 +169,6 @@ async function fetchFormRows(binding, signal) {
173
169
  }
174
170
  ```
175
171
 
176
- ### 搜索与分页参数
177
-
178
- 此处调用的是页面 JS-API 桥。简单字段筛选沿用普通自定义页的字段 ID 字典,不把 CLI 或其他查询接口的条件数组、`conditionType/children` 树混入这里:
179
-
180
- ```javascript
181
- var query = {};
182
- if (keyword.trim()) query[fields.name] = keyword.trim();
183
- var payload = await bridge.searchFormDatas({
184
- formUuid: binding.formUuid,
185
- currentPage: 1,
186
- pageSize: 50,
187
- searchFieldJson: JSON.stringify(query)
188
- });
189
- ```
190
-
191
- 清空搜索时传空字典,并把 `currentPage` 重置为 1。需要复杂条件时先核对所调用接口的具体契约;不要凭字段名相似套用其他格式。验收必须输入一条已知记录的筛选值,确认返回行数与内容,再清空确认全量恢复;页面显示数据不代表筛选有效。
192
-
193
172
  ## 表单数据读取要点
194
173
 
195
174
  实现前先确认 `dataBinding.mode === 'form'`、`appType/formUuid` 和 `fields` 都来自真实表单 Schema。表单查询必须优先走 yida JS-API 桥,桥缺失时才降级同源直连。连接器模式遵守 [Canvas 连接器绑定](references/connector-binding.md),不得接收任意外部 endpoint。
@@ -204,9 +183,6 @@ var payload = await bridge.searchFormDatas({
204
183
  - 接口异常时页面有明确错误态,不用 demo seed 伪装成成功态。
205
184
  - 发布后回读页面,确认 `YidaCodeCanvas` 组件的 `runtimeCode` 非空。
206
185
  - 在已登录浏览器中确认页面退出 loading、无数据加载错误,并显示至少一条已 query 确认的记录。
207
- - 公开页匿名提交前,已回读显示页和目标表单的 `isOpen === 'y'`,并确认目标表单 DEFAULT 权限包含 `FREE_LOGIN`。
208
- - 匿名字段数组使用 `{ componentName, fieldId, fieldData: { value } }`,CSRF 优先来自 `window.g_config._csrf_token`。
209
- - 匿名提交不能只检查 HTTP 200、`success`、`formInstId` 或总数增长;必须按返回的实例 ID 回读代表性字段值。
210
186
 
211
187
  验收命令:
212
188
 
@@ -222,7 +198,5 @@ openyida get-schema <appType> <formUuid> > .cache/openyida/dashboard-schema.json
222
198
  | 页面显示 0 条,但数据管理里有数据 | 先检查外层页面是否注入 `window.__OPENYIDA_YIDA_API__`,再检查返回体包裹层和字段映射;触发 `totalCount` 保护 |
223
199
  | 首屏后每 5 秒闪白 | 轮询改成 silent refresh,保留旧数据直到新数据返回 |
224
200
  | 登录态存在但接口 403 | 优先改回 yida JS-API 桥;只有降级直连时才检查同源路径、CSRF 参数和 `global_csrf_token` 头 |
225
- | 公开页提交返回 `LOGIN FAILED` | 不以桥对象存在判断登录态;先识别 `FREELOGIN` / `FREEUSER`,匿名态改走 `RECEIPT_SAVE_FORM_DATA` |
226
- | 匿名网关返回成功但字段为空 | 把每项改为 `{ componentName, fieldId, fieldData: { value } }`,再按 `formInstId` 回读字段值 |
227
201
  | 接口失败后仍显示漂亮 demo 数据 | 改成错误态 + seed 标识,不能伪装真实成功 |
228
202
  | 字段值全为空 | 回读 schema 校验字段 ID,确认字段映射没有使用 label |
@@ -7,8 +7,6 @@ description: 创建宜搭应用并返回 appType;仅当没有目标 app 且用
7
7
 
8
8
  > 资源边界:本技能只处理普通 OpenYida 应用创建;目标不明时先只读确认或询问用户。
9
9
 
10
- 创建成功结果同时包含 `url` / `appUrl` / `workbenchUrl`(应用工作台)和 `adminUrl`(开发者管理后台)。完整应用最终交付默认保留 `adminUrl`,与前台、可选业务后台区分;不因云端登录态省略。地址可生成不等于收件人已获得管理权限。历史结果缺少该字段时可通过 `app-list` 分页匹配真实 `appType` 回查。
11
-
12
10
  ## Resource-First 使用门槛
13
11
 
14
12
  本技能不是完整搭建的默认第一步,只能在以下条件同时满足时加载/执行:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: yida-create-form-page
3
- description: 表单页面创建与更新;可创建 19 种业务字段、Divider 与 ColumnContainer,更新组件树时保留已有的 Tab、按钮组、图片和状态区;支持联动规则和数据源绑定。
3
+ description: 表单页面创建与更新;支持 19 种业务字段和 Divider、ColumnContainer 等表单展示布局组件,PageSection/GroupContainer 仅少量特殊场景使用;支持联动规则和数据源绑定。
4
4
  ---
5
5
 
6
6
  # 表单页面创建与更新
@@ -20,21 +20,23 @@ description: 表单页面创建与更新;可创建 19 种业务字段、Divide
20
20
  ## 严格禁止 (NEVER DO)
21
21
 
22
22
  - 不要编造 formUuid,必须从命令返回的 JSON 中提取
23
- - 不要猜测 fieldId。字段级命令优先用字段 `label`,必要时用已知 `fieldId` 或 `tableLabel + label`;CLI 会读取当前表单、定位字段并返回 compact evidence。只有字段解析失败或歧义、patch 底层路径或页面/公式/流程确实需要多字段映射时,才用 `yida-get-schema` 一次性取证。
23
+ - 不要猜测 fieldId。字段级命令优先用字段 `label`、必要时用已知 `fieldId` 或 `tableLabel + label`;CLI 内部读 schema/定位并返回 compact evidence。只有字段解析失败/歧义、patch 底层路径或页面/公式/流程等确实需要多字段映射时,才用 `yida-get-schema` 一次性取证。
24
24
  - 不要用此命令操作数据记录(增删改查),应使用 `yida-data-management`
25
25
  - 不要用 shell heredoc、`cat`/`echo`/`printf`/`tee` 或重定向生成字段、变更、补丁、规则、数据源 JSON 文件
26
26
  - OpenYida CLI 不要加 `2>/dev/null`;失败时保留 stdout/stderr 诊断,遇到 DENIED 或重复失败必须换策略
27
27
  - 多表单 batch 契约已在本技能给出时,不要再调用 `create-form batch --help`、`create-form batch --check`,也不要搜索 CLI 安装目录或源码来探测格式;这些调用同样占用本轮唯一一次 batch 调用名额
28
+ - 已有目标表单且用户是改字段/联动/属性时,不要创建新表单;必须走 update/patch/rule/bind-datasource。
29
+ - 不要用 `GroupContainer` / `PageSection` 承载普通业务分组;普通分组必须优先用 `Divider`
30
+ - 严禁为原生表单或 `formDetail` 生成、注入 CSS、JS、HTML 或主题代码;详情页由平台渲染。
28
31
 
29
32
  ## 严格要求 (MUST DO)
30
33
 
31
34
  - 拿到或确认真实 `formUuid` 后,用于后续字段更新、数据绑定和页面入口配置。
32
35
  - create 成功后,将 formUuid 记录到 `.cache/<项目名>-schema.json`
33
- - 完整应用生成场景中,create 成功并记录 formUuid 后,把核心普通表单交给 `yida-data-management` 默认写入 1-3 条业务化示例记录。
34
- - update / add-option / bind-datasource / validation / rule 等字段级操作不要求先执行外部 `get-schema`;直接提交 compact JSON 或字段 label/fieldId,CLI 会读取当前表单、定位字段,并在成功 JSON 中输出 compact `resolved`/`updatedProps` evidence。字段解析失败或歧义时,按 `diagnostics[].candidates` 补 `tableLabel`、修正 label,或再执行一次 compact `get-schema`。
36
+ - 完整应用生成场景中,create 成功并记录 formUuid 后,把核心普通表单交给 `yida-data-management` 默认写入 1-3 条业务化示例记录;不要在本技能里直接操作数据记录。
37
+ - update / add-option / bind-datasource / validation / rule 等字段级操作不要求先执行外部 `get-schema`;直接提交 compact JSON 或字段 label/fieldId,CLI 会内部读取 schema、定位字段,并在成功 JSON 中输出 compact `resolved`/`updatedProps` evidence。字段解析失败/歧义时按 `diagnostics[].candidates` 补 `tableLabel`、修正 label 或再执行一次 compact `get-schema`。
35
38
  - 字段定义或变更定义需要落盘时,必须使用 agent 的结构化文件写入工具创建到 `<projectRoot>/.cache/openyida/<项目名或任务名>/`,例如 `<projectRoot>/.cache/openyida/pm/pm-fields-team.json`
36
- - 创建或更新表单结构时,按[布局决策规则](#布局决策规则)规划组件树;编辑已有表单时保留原组件树
37
- - **重复结构化记录默认使用 `TableField`**:用户未指定具体字段类型时,凡一个业务字段承载多条同构记录,且每条记录由一组固定子字段组成,必须用 `TableField + children` 建模,不以字段名称或业务领域作为判断依据;用户明确指定具体字段类型时按用户要求执行,不将模型推断、跨会话记忆或历史兼容性说法视为用户指定。未在当前应用、当前提交链路验证的限制不能作为字段改型依据。
39
+ - 普通表单分组必须优先使用 `Divider`,多列排版必须通过字段 JSON 中的 `ColumnContainer` 局部表达
38
40
  - **本技能不读写 memory**:formUuid 等信息输出到 stdout,通过 `.cache/<项目名>-schema.json` 持久化,不依赖跨会话的 memory 状态
39
41
 
40
42
  ## 适用场景
@@ -57,9 +59,9 @@ description: 表单页面创建与更新;可创建 19 种业务字段、Divide
57
59
 
58
60
  ## 多表单创建
59
61
 
60
- 同一轮需要新建两个及以上普通表单时,必须按 [并行创建表单](references/batch-forms.md) 把全部表单写入同一个 `forms.json`,并且只调用一次 `openyida create-form batch <appType> <任务文件> --json`。独立表单和关联表单放在同一任务文件中,依赖通过 `dependsOn` / `$form` 表达,由 CLI 在一次 batch 内部完成分组、真实 `formUuid/fieldId` 回读和依赖调度;不要手工拆成多次 batch,也不要逐个调用 `create-form create`。调用前先确认 CLI 的实际项目根目录,并让 Write 创建的绝对路径与 Bash 使用的任务文件指向同一个物理文件:常见 `<workspace>/project` 布局中应写入 `<workspace>/project/.cache/openyida/<项目名>/forms.json`,再从该项目根传 `.cache/openyida/<项目名>/forms.json`。先用 Read 确认任务文件存在。batch 返回 background pending 时等待运行时投递完成结果,不得再次调用 batch。只有修改已有表单、恢复已有 `formUuid`,或当前 batch 契约无法表达依赖时,才走明确的非 batch 路径并说明原因。
62
+ 同一轮需要新建两个及以上普通表单时,必须按 [并行创建表单](references/batch-forms.md) 把全部表单写入同一个 `forms.json`,并且只调用一次 `openyida create-form batch <appType> <任务文件> --json`。独立表单和关联表单放在同一任务文件中,依赖通过 `dependsOn` / `$form` 表达,由 CLI 在一次 batch 内部完成分组、真实 `formUuid/fieldId` 回读和依赖调度;不要手工拆成多次 batch,也不要逐个调用 `create-form create`。调用前先确认 CLI 的实际项目根目录,并让 Write 创建的绝对路径与 Bash 使用的任务文件指向同一个物理文件:常见 `<workspace>/project` 布局中应写入 `<workspace>/project/.cache/openyida/<项目名>/forms.json`,再从该项目根传 `.cache/openyida/<项目名>/forms.json`。先用 Read 确认任务文件存在,不要通过试跑 batch 探测路径。batch 返回 background pending 时等待运行时投递完成结果,不得再次调用 batch。只有修改已有表单、恢复已有 `formUuid`,或当前 batch 契约无法表达依赖时,才走明确的非 batch 路径并说明原因。
61
63
 
62
- 主技能内的最小任务文件契约如下:
64
+ 主技能内的最小任务文件契约如下,执行普通批量创建无需再查 help、sample 或 CLI 源码:
63
65
 
64
66
  ```json
65
67
  {
@@ -87,7 +89,7 @@ description: 表单页面创建与更新;可创建 19 种业务字段、Divide
87
89
  }
88
90
  ```
89
91
 
90
- `fieldsFile` 也可替代内联 `fields`,其路径相对 `forms.json` 所在目录;已有完整表单可提供 `formUuid` 回读复用。batch 项的 `icon` 与 `locale` 遵循 [create 模式](#create-模式)的同名参数规则。普通多表单创建的执行顺序固定为:确认 `projectRoot` → Write 一个任务文件 → Read 确认文件 → 唯一一次真实 batch → 使用 batch 结果和必要的 compact `get-schema` 回读。
92
+ `fieldsFile` 也可替代内联 `fields`,其路径相对 `forms.json` 所在目录;已有完整表单可提供 `formUuid` 回读复用。普通搭建的 batch 项必须省略 `icon`,由 CLI 按标题和字段语义自动选择;只有用户明确给出 `openyida create-form icons --json` 目录中的表单图标名时才设置,应用图标 `xian-*` 绝不是表单图标。`locale` 同样只在用户明确指定时设置。普通多表单创建的执行顺序固定为:确认 `projectRoot` → Write 一个任务文件 → Read 确认文件 → 唯一一次真实 batch → 使用 batch 结果和必要的 compact `get-schema` 回读。
91
93
 
92
94
  最小 `forms.json` 结构如下;`fieldsFile` 相对 `forms.json` 所在目录解析:
93
95
 
@@ -105,17 +107,9 @@ description: 表单页面创建与更新;可创建 19 种业务字段、Divide
105
107
  }
106
108
  ```
107
109
 
108
- 关联字段的引用放在 `associationForm` 内。推荐使用紧凑写法 `"associationForm": { "$form": "customer", "field": "客户名称" }`;batch 会将其规范化为 `associationForm.formUuid` 和 `associationForm.mainFieldId`。完整写法则分别在 `formUuid` 使用 `{ "$form": "customer" }`、在 `mainFieldId` 使用 `{ "$form": "customer", "field": "客户名称" }`。
110
+ 关联字段必须把引用放在 `associationForm` 内。推荐使用紧凑写法 `"associationForm": { "$form": "customer", "field": "客户名称" }`;batch 会将其规范化为 `associationForm.formUuid` 和 `associationForm.mainFieldId`。完整写法则分别在 `formUuid` 使用 `{ "$form": "customer" }`、在 `mainFieldId` 使用 `{ "$form": "customer", "field": "客户名称" }`。不要把 `$form` 放在 `AssociationFormField` 顶层,也不要用 `batch --help`、空参数或临时计划探索格式;技能中的结构就是正式契约。
109
111
 
110
- Batch 以任务文件指纹和 `<forms.json>.state.json` 共同标识一次批量操作,恢复动作由结果中的 `recoveryAction` 唯一决定:
111
-
112
- | 当前结果 | 状态事实 | 下一动作 |
113
- | --- | --- | --- |
114
- | background pending | 原任务仍在执行,task/state/lock 保持为同一操作 | 保持当前执行单元,后续只接收该任务的最终结果 |
115
- | `FORM_BATCH_PARTIAL_FAILURE` + `rerun_unchanged_plan` | 已知 `formUuid` 已记录在 state,原任务指纹可安全恢复 | 后续使用原任务文件和原参数重新执行同一 batch,由 CLI 从 state 复用已知资源 |
116
- | `FORM_BATCH_PARTIAL_FAILURE` + `inspect_unknown_write_then_reconcile` | 至少一个远端写结果缺少资源 ID,当前指纹进入待核对状态 | 先回读远端资源;核对完成后建立新的 reconcile 任务,用已确认 `formUuid` 表示已有表单,仅保留确定尚未创建的任务 |
117
-
118
- CLI 在同一次 batch 内对已取得真实 `formUuid` 的空壳表单执行一次保守恢复。每个结果状态只沿表中对应的下一动作推进。
112
+ 批量命令超过前台时限进入后台属于正常行为。此时必须保留原任务和 `<forms.json>.state.json`,等待运行时自动回传结果;禁止调用 `ToolStop`,禁止删除 `.state.json`/`.lock`,禁止改变参数再次调用 batch。若最终返回 `FORM_BATCH_PARTIAL_FAILURE`,在本轮原样保留结构化错误并停止;禁止模型侧再调用 `create-form create`、`update` 或 `resume` 补洞。CLI 会在同一次 batch 内对已取得真实 `formUuid` 的空壳表单执行一次保守恢复。
119
113
 
120
114
  ## 官方表单示例范式
121
115
 
@@ -130,56 +124,63 @@ CLI 在同一次 batch 内对已取得真实 `formUuid` 的空壳表单执行一
130
124
 
131
125
  ## 布局决策规则
132
126
 
133
- 原生表单支持组件化布局。按任务规划顶部、左侧、主体、右侧和字段间区域,再将组件与字段放入对应区域。
127
+ 默认表单是单列,使用 `Divider` / `ColumnContainer` / 标准字段表达业务结构。严禁为了“更高级”默认把整表改成双列;严禁用 `GroupContainer` / `PageSection` 做普通分组。
128
+
129
+ - 默认单列:字段较少、流程表单、移动端优先、长文本、说明、附件、地址、子表、审批意见、需要逐项认真填写的字段。
130
+ - 局部多列:短字段且天然成对或成组时使用 `ColumnContainer`,例如开始/结束日期、姓名/工号、部门/岗位、金额/币种、联系人/电话。
131
+ - 全局 `--layout double`:只有用户明确要求“整个表单双列”时才使用;一般更推荐在字段 JSON 内用 `ColumnContainer` 做局部多列。
132
+ - 语义分组:按业务含义分段,不按字段数量平均分。常见分组包括“基本信息”“业务信息”“时间计划”“补充材料”“审批信息”。
133
+ - Divider 样式:默认 `bold-with-thin`;显式样式按 `bold-with-thin` → `double-color-trapezoid` → `left-dot-title` → `solid` / `dashed` / `thick` / `dotted` 优先级选择;门户/强分区场景可统一显式使用 `multi-parallelograms-end`。
134
+ - 字段 JSON 和表单 Schema JS 只承载表单结构与业务动作。
134
135
 
135
- - 区域设计:先写清每个区域的组件、作用和响应式规则,再安排字段。
136
- - 字段排布:长文本、附件、地址和子表通常整行;短字段可按业务关系放入 `ColumnContainer`。可采用单列、局部多列、主次分栏或多区域布局。
137
- - 组件选用:业务字段负责数据采集,Tab/切换负责导航,按钮组/操作入口执行业务动作,图片或图形建立视觉焦点,状态区提供反馈,标题与 `Divider` 组织层级和节奏,`ColumnContainer` 组织横向字段。编辑已有表单时保留现有组件。
138
- - 分组规则:普通业务分组和章节分隔使用 `Divider`;横向字段组合使用 `ColumnContainer`。
139
- - Divider 样式:按页面业务、字段密度和主题,从 [23 个可见样式](references/form-field-properties.md#divider) 中选择并显式填写 `dividerType`。同页同层级使用一致样式;编辑已有页面时沿用原样式,不同业务页面按各自设计选择。
136
+ 推荐结构:
137
+
138
+ ```text
139
+ Divider > ColumnContainer > Field
140
+ Divider > Field
141
+ ```
140
142
 
141
143
  ## 企业级表单质量规则
142
144
 
143
145
  生成企业级表单时按以下规则执行:
144
146
 
145
147
  - 字段必须先覆盖 PRD 明确要求,再按真实业务补充少量必要字段,避免堆砌冗余字段。
146
- - 内容较多时,按[布局决策规则](#布局决策规则)为各区域选择组件。
148
+ - 字段较多时必须用 `Divider` 做语义分组;每个分组开头都要有 `Divider`,包括第一个分组;`Divider` 不放在字段列表末尾。
149
+ - 同一张表单内所有 `Divider` 必须使用同一个 `dividerType`,标题要能概括分组下字段的共同主题。
147
150
  - 完整业务应用包含多张表单时,表单之间应有业务关联;涉及数据流转的主表建议有文本型业务编号/名称字段,涉及时间、金额、数量的业务应使用日期/数值字段表达。
148
151
  - 复杂业务表单应自然使用多种字段类型,例如文本、数值、日期、选择、成员/部门、附件、子表、关联表单;字段类型多样性服务于业务语义。
149
152
  - `TableField` 必须提供 `children` 子字段,`AssociationFormField` 必须提供关联表单信息。
150
153
  - 审批人、审批状态、审批节点等流程运行字段由流程能力承载;表单只收集业务数据。
151
- - 表单标题、字段 label/title、选项、提示语、校验文案、动作源码、字段 JSON 常量和字段 JSON 文件路径都禁止 emoji;`create-form` 报 emoji 错误时必须修改字段 JSON 或路径,不能重复 create 或用同义命令绕过。
154
+ - 表单标题、字段 label/title、选项、提示语、校验文案、动作源码、字段 JSON 常量和字段 JSON 文件路径都禁止 emoji;`create-form` / schema compiler 报 emoji 错误时必须改字段 JSON 或路径,不能重复 create 或用同义命令绕过。
152
155
 
153
156
  ## 表单布局样式
154
157
 
155
- - 提交、编辑和记录详情与导航、应用框架、自定义页面共用 `design.md` 的整体风格。按 [表单样式与提交页背景](../yida-design/references/native-form-styles.md) 将字体、控件、状态、背景与底栏规则写入同一份应用主题 CSS。
156
- - 布局结构按[布局决策规则](#布局决策规则)执行,并在 `design.md` 记录列宽、标签位置、分组间距与响应式安排。
157
- - `--theme default|compact|comfortable` 配置页面密度;应用主题 token 配置完整视觉风格。美化已有表单时保留现有 `formUuid` 和字段结构,只更新布局与主题。
158
- - 局部多列容器使用统一、克制的背景。
159
- - 流程表单优先采用单列和清晰分段,颜色用于章节识别。
160
- - 用户明确指定颜色时,写入 `colorType: "custom"` 和具体色值。
158
+ - 普通业务分组使用 `Divider`,下面直接接字段或 `ColumnContainer`
159
+ - 局部多列容器保持背景克制,避免给每个列容器单独上色
160
+ - 流程表单更偏单列和清晰分段,颜色只用于章节识别
161
+ - 用户明确指定颜色时才写 `colorType: "custom"` 和具体色值
161
162
 
162
163
  ## create 模式
163
164
 
165
+ 仅当目标表单缺失且用户意图允许新增数据收集入口时使用。已有 `formUuid` / 表单 URL / bound form 时禁止使用 create 模式。
166
+
164
167
  ```bash
165
- openyida create-form create <appType> <formTitle> <fieldsJsonOrFile> [--layout single|double|card|section] [--theme default|compact|comfortable] [--label-align top|left|right] [--icon auto|<iconName>] [--locale zh_CN|en_US|ja_JP] [--open|--no-open]
168
+ openyida create-form create <appType> <formTitle> <fieldsJsonOrFile> [--layout double|card] [--theme compact|comfortable] [--label-align top|left]
166
169
  # 文件路径示例:.cache/openyida/<项目名或任务名>/<表单名>-fields.json
167
170
  ```
168
171
 
169
172
  默认不传 `--icon`,由 CLI 根据表单标题和字段语义选择导航图标,再更新导航节点并回读校验。只有用户明确指定某个图标时才传 `--icon <iconName>`;普通搭建不得调用 `openyida create-form icons` 枚举候选,也不得先猜图标、失败后再探索。`icons` 仅供用户明确指定但值不合法时的人工诊断。表单导航图标是纯图标名(如 `name-card`、`Project`、`Todo`、`clock`),不是应用图标的 `xian-*%%color` 协议。
170
173
 
171
- 导航图标更新必须先读取 `getFormNavigationListByOrder.json` 的当前节点,保留完整节点及 `gmtModified`、`formType`、`isNewForm`、`listOrder` 等原值,将 `title` 序列化为 JSON,沿用节点的 `formUuid`(缺失时使用 `NAV-SYSTEM-FROM-ME-UUID`),仅替换目标 `icon`。再请求带 `_api=Nav.update&_mock=false&_stamp=...` 的 `updateFormNavigation.json`,最后重新读取导航列表校验图标。禁止仅凭 formUuid 拼一个精简更新 payload。
174
+ 导航图标更新必须先读取 `getFormNavigationListByOrder.json` 的当前节点,像 yida-next 的 `DB.Nav.update({ ...node, title: JSON.stringify(node.title), formUuid: node.formUuid || 'NAV-SYSTEM-FROM-ME-UUID', icon })` 一样保留 `gmtModified`、`formType`、`isNewForm`、`listOrder` 等原值,再请求带 `_api=Nav.update&_mock=false&_stamp=...` 的 `updateFormNavigation.json`,最后重新读取导航列表校验图标。禁止仅凭 formUuid 拼一个精简更新 payload。
172
175
 
173
176
  > 文件先用 create_file / Write / file edit tool 创建。上方路径默认从 OpenYida project 工作目录执行;如果从 workspace 根执行命令,传 `project/.cache/openyida/<项目名或任务名>/<表单名>-fields.json`。
174
177
 
175
178
  输出:
176
179
 
177
180
  ```json
178
- {"success":true,"formUuid":"FORM-XXX","formTitle":"用户信息表","appType":"APP_xxx","fieldCount":4,"icon":"name-card","iconSource":"auto","url":"{base_url}/APP_xxx/workbench/FORM-XXX","formUrl":"{base_url}/APP_xxx/workbench/FORM-XXX","appUrl":"{base_url}/APP_xxx/workbench"}
181
+ {"success":true,"formUuid":"FORM-XXX","formTitle":"用户信息表","appType":"APP_xxx","fieldCount":4,"icon":"name-card","iconSource":"auto","url":"{base_url}/APP_xxx/workbench/FORM-XXX"}
179
182
  ```
180
183
 
181
- `url` 是兼容字段,与 `formUrl` 表示同一表单入口;`appUrl` 表示应用工作台入口。普通表单保存成功后进入可用状态,自定义展示页使用 `publish-page` 生命周期。终态交付按用户请求的层级选择对应权威入口和 `resourceType`/`resourceId`:应用级使用 `appUrl`、`app_home`、`appType`,表单级使用 `formUrl`、`form`、`formUuid`。
182
-
183
184
  完整应用模式下的下一步:
184
185
 
185
186
  1. 将 `formUuid`、字段摘要和字段 JSON 路径写入 `.cache/<项目名>-schema.json`。
@@ -198,7 +199,7 @@ create 命令失败后,不要立刻重复同一条 create:
198
199
 
199
200
  ## update 模式
200
201
 
201
- 已有 `formUuid` / 表单 URL / bound form 时优先使用本模式。简单字段属性更新直接写 compact changes,不需要模型先 `get-schema --field-map-json`;CLI 会读取当前表单,按 `label`、`fieldId` 或 `tableLabel + label` 定位字段,成功 JSON 会返回 `changes[].resolved` 和 `changes[].updatedProps`。
202
+ 已有 `formUuid` / 表单 URL / bound form 时优先使用本模式。简单字段属性更新直接写 compact changes,不需要模型先 `get-schema --field-map-json`;CLI 会内部读取当前 schema,按 `label`、`fieldId` 或 `tableLabel + label` 定位字段,成功 JSON 会返回 `changes[].resolved` 和 `changes[].updatedProps`。
202
203
 
203
204
  ```bash
204
205
  openyida create-form update <appType> <formUuid> <changesJsonOrFile>
@@ -208,11 +209,21 @@ openyida create-form update <appType> <formUuid> --data-file <changesJsonOrFile>
208
209
 
209
210
  位置参数和 `--data-file` 是同一输入的两种写法,不能同时使用。
210
211
 
212
+ ## 半成功 create 恢复
213
+
214
+ create 已返回真实 `formUuid`、但后续 schema 保存或回读失败时,使用保守恢复命令:
215
+
216
+ ```bash
217
+ openyida create-form resume <appType> <formUuid> <fieldsJsonOrFile> --json
218
+ ```
219
+
220
+ 该命令先回读目标表单并核对字段,只添加可唯一判定的缺失字段,保存后再次回读;同名异类型、重复
221
+ 目标字段、归属不匹配或回读不确定时均停止且不写入。它不会新建替代表单,也不会覆盖已有字段。
211
222
 
212
223
  输出:
213
224
 
214
225
  ```json
215
- {"success":true,"formUuid":"FORM-YYY","appType":"APP_XXX","changesApplied":1,"changes":[{"action":"update","label":"备注","changedProps":"required","resolved":{"label":"备注","fieldId":"textField_xxx","componentName":"TextField"},"updatedProps":{"required":true}}],"url":"{base_url}/APP_XXX/workbench/FORM-YYY","formUrl":"{base_url}/APP_XXX/workbench/FORM-YYY","appUrl":"{base_url}/APP_XXX/workbench"}
226
+ {"success":true,"formUuid":"FORM-YYY","appType":"APP_XXX","changesApplied":1,"changes":[{"action":"update","label":"备注","changedProps":"required","resolved":{"label":"备注","fieldId":"textField_xxx","componentName":"TextField"},"updatedProps":{"required":true}}],"url":"{base_url}/APP_XXX/workbench/FORM-YYY"}
216
227
  ```
217
228
 
218
229
  常见 compact changes:
@@ -236,35 +247,13 @@ openyida create-form rule <appType> <formUuid> <rulesJsonOrFile>
236
247
 
237
248
  `validation` / `rule` JSON 可优先写 label,例如 `{ "field": "备注", "type": "required" }`;若位于子表或存在重名,补 `{ "tableLabel": "明细", "field": "备注" }` 或直接使用已知 `fieldId`。成功 JSON 会返回每条规则或事件绑定的 compact `resolved` evidence;失败只返回 compact `diagnostics[].candidates`,不会打印完整字段列表。
238
249
 
239
- ## 半成功 create 恢复
240
-
241
- create 已返回真实 `formUuid`、但后续保存或回读失败时,使用保守恢复命令:
242
-
243
- ```bash
244
- openyida create-form resume <appType> <formUuid> <fieldsJsonOrFile> --json
245
- ```
246
-
247
- 该命令先回读目标表单并核对字段,只添加可唯一判定的缺失字段,保存后再次回读;同名异类型、重复
248
- 目标字段、归属不匹配或回读不确定时均停止且不写入。它不会新建替代表单,也不会覆盖已有字段。
249
-
250
- `resume` 的保存端 HTTP 5xx 恢复流程固定为:精确回读目标表单;目标字段已存在时收口为成功,目标字段缺失且无冲突时绑定最新服务端 revision 执行一次保存,再做最终回读。成功 JSON 提供真实 `formUuid`、表单入口 `url`/`formUrl` 和应用工作台入口 `appUrl`,据此完成终态交付;用户要求资源 ID 时,将已验证的 `formUuid` 写入终态 artifact 的可见 `description`。
251
-
252
-
253
- 输出示例(已有两个字段,补齐一个字段):
254
-
255
- ```json
256
- {"success":true,"appType":"APP_XXX","formUuid":"FORM-YYY","completedStages":["read_target","verify_ownership","compare_fields","add_missing_fields","save_schema","verify_final_schema"],"requestedFieldCount":3,"existingFieldCount":2,"addedFieldCount":1,"finalFieldCount":3,"recoveredBlankShell":false,"url":"{base_url}/APP_XXX/workbench/FORM-YYY","formUrl":"{base_url}/APP_XXX/workbench/FORM-YYY","appUrl":"{base_url}/APP_XXX/workbench"}
257
- ```
258
-
259
- `resume` 的终态交付沿用相同入口映射:应用级交付选择 `appUrl` / `app_home`,表单级交付选择 `formUrl` / `form`;`url` 继续兼容表单入口。
260
-
261
250
  ## 高级模式
262
251
 
263
252
  高级模式只在用户明确要求或普通 create/update 不足时使用,执行前必须先读取 [advanced-form-modes.md](references/advanced-form-modes.md)。
264
253
 
265
254
  | 模式 | 命令 | 何时使用 |
266
255
  |------|------|------|
267
- | `patch` | `openyida create-form patch <appType> <formUuid> <patchJsonOrFile>` | 受控修改表单底层配置;字段事件动作必须用 `field-action` 并确认 `designerBindingFound: true`、`readbackVerified: true` |
256
+ | `patch` | `openyida create-form patch <appType> <formUuid> <patchJsonOrFile>` | 受控修改底层 Schema;字段事件动作必须用 `field-action` 并确认 `designerBindingFound: true`、`readbackVerified: true` |
268
257
  | `rule` | `openyida create-form rule <appType> <formUuid> <rulesJsonOrFile>` | 字段显示隐藏、只读、自动赋值、onChange 带出 |
269
258
  | `validation` | `openyida create-form validation <appType> <formUuid> <validationsJsonOrFile>` | 字段校验规则,优先用内置校验,复杂场景再用 customValidate |
270
259
  | `bind-datasource` | `openyida create-form bind-datasource <appType> <formUuid> <fieldLabelOrId> <dataSourceJsonOrFile>` | 选项字段绑定远程搜索数据源;成功输出 `resolved` |
@@ -272,13 +261,13 @@ openyida create-form resume <appType> <formUuid> <fieldsJsonOrFile> --json
272
261
 
273
262
  ## 字段定义 JSON 高频范式
274
263
 
275
- 字段 JSON 详细属性、`Divider` / `ColumnContainer` 结构、update changes 和完整字段类型表见 [field-definition-guide.md](references/field-definition-guide.md)。
264
+ 字段 JSON 详细属性、布局组件、update changes 和完整字段类型表见 [field-definition-guide.md](references/field-definition-guide.md)。
276
265
 
277
266
  常用结构:
278
267
 
279
268
  ```json
280
269
  [
281
- { "type": "Divider", "title": "基本信息", "dividerType": "light-left-bar" },
270
+ { "type": "Divider", "title": "基本信息" },
282
271
  {
283
272
  "type": "ColumnContainer",
284
273
  "layout": "6:6",
@@ -287,7 +276,7 @@ openyida create-form resume <appType> <formUuid> <fieldsJsonOrFile> --json
287
276
  [{ "type": "DepartmentSelectField", "label": "所属部门" }]
288
277
  ]
289
278
  },
290
- { "type": "Divider", "title": "业务信息", "dividerType": "light-left-bar" },
279
+ { "type": "Divider", "title": "业务信息" },
291
280
  { "type": "TextField", "label": "事项名称", "required": true },
292
281
  { "type": "SelectField", "label": "优先级", "dataSource": ["P0", "P1", "P2"] },
293
282
  { "type": "AttachmentField", "label": "附件" }
@@ -325,7 +314,7 @@ openyida create-form resume <appType> <formUuid> <fieldsJsonOrFile> --json
325
314
 
326
315
  | 文档 | 何时读取 |
327
316
  |------|------|
328
- | [field-definition-guide.md](references/field-definition-guide.md) | 需要完整字段属性、`Divider` / `ColumnContainer` 结构、update changes 或字段类型表时 |
317
+ | [field-definition-guide.md](references/field-definition-guide.md) | 需要完整字段属性、布局组件、update changes 或字段类型表时 |
329
318
  | [advanced-form-modes.md](references/advanced-form-modes.md) | 使用 patch / rule / validation / bind-datasource 高级模式前必须读取 |
330
319
  | [form-field-properties.md](references/form-field-properties.md) | 需要字段属性细节或平台属性映射时 |
331
320
  | [employee-field.md](references/employee-field.md) | 成员字段配置 |
@@ -336,7 +325,7 @@ openyida create-form resume <appType> <formUuid> <fieldsJsonOrFile> --json
336
325
 
337
326
  - `appType` 必须来自已创建应用或用户提供
338
327
  - 字段类型必须使用标准组件名,如 `TextField`、`SelectField`
339
- - 电话字段固定使用 `TextField` 加正则自定义校验;读取已有表单时可以识别历史 `PhoneField`,但不得把它作为新建或 patch 能力。
328
+ - 电话字段固定使用 `TextField` 加正则自定义校验;读取已有 Schema 时可以识别历史 `PhoneField`,但不得把它作为新建或 patch 能力。
340
329
  - `SelectField`、`MultiSelectField`、`RadioField`、`CheckboxField` 固定选项必须提供 `dataSource`;远程选项字段必须提供 `remoteDataSource` 或通过 `bind-datasource` 配置,不要生成无选项源的字段 JSON。
341
330
  - `TableField` 必须提供 `children`,且子表不能嵌套子表
342
331
  - `AssociationFormField` 必须提供 `associationForm`
@@ -348,9 +337,6 @@ openyida create-form resume <appType> <formUuid> <fieldsJsonOrFile> --json
348
337
  |---------|----------|
349
338
  | create 返回失败 | 检查 appType 是否正确,确认登录态有效 |
350
339
  | 字段级命令找不到字段 | 先看命令 JSON 的 `diagnostics[].candidates` 修正 label、补 `tableLabel` 或改用已知 `fieldId`;仍不明确时再用 `openyida get-schema --compact --resolve-fields` |
351
- | 字段类型不支持 | 使用 `create-form` 支持的 19 种业务字段、`Divider` 或 `ColumnContainer` |
340
+ | 字段类型不支持 | 检查字段类型是否在支持的 19 种业务字段或已验证展示布局组件列表中 |
352
341
  | 子表字段创建失败 | 确认 `children` 数组格式正确,子表字段不能嵌套子表 |
353
342
  | 返回 JSON 中无 formUuid | 不要猜测 formUuid,重新执行命令获取 |
354
-
355
-
356
- 应用整体设计可使用[应用风格模板或自由创意](../yida-design/references/application-style-library.md)。导航、自定义页面、表单与详情继承同一设计语言;自由创意从业务推演。模板中的原生布局 JSON 用于建立结构,使用时填入真实字段并核对间距和响应式。表单组件树按[布局决策规则](#布局决策规则)创建。
@@ -1,8 +1,8 @@
1
1
  # 高级表单模式:patch / rule / bind-datasource
2
2
 
3
- ## patch 模式(表单配置补丁)
3
+ ## patch 模式(设计器 Schema 补丁)
4
4
 
5
- 当宜搭后台已有配置项,但 OpenYida 还没有高阶 DSL 时,使用 patch 模式受控修改表单配置:
5
+ 当宜搭后台已有配置项,但 OpenYida 还没有高阶 DSL 时,使用 patch 模式对表单 V5 Schema 做受控修改:
6
6
 
7
7
  ```bash
8
8
  openyida create-form patch <appType> <formUuid> <patchJsonOrFile>
@@ -15,9 +15,9 @@ openyida create-form patch <appType> <formUuid> <patchJsonOrFile>
15
15
  |------|------|
16
16
  | `field-props` | 按 `fieldId` / `field` / `label` 合并字段 `props`,适合补字段状态、提交策略、设计器属性 |
17
17
  | `form-props` | 合并 `FormContainer.props` |
18
- | `add` / `replace` / `remove` | 按 JSON Pointer 路径添加、替换或删除表单配置 |
18
+ | `add` / `replace` / `remove` | JSON Pointer 形式的底层 Schema Patch |
19
19
  | `merge` | 对指定 JSON Pointer 路径做对象深合并 |
20
- | `actions-module` | 写入表单业务动作模块 `source` / `compiled`,`source` 会自动编译 |
20
+ | `actions-module` | 写入页面动作模块 `source` / `compiled`,`source` 会自动编译 |
21
21
  | `bind-field-action` | 给字段事件(如 `onChange`)绑定动作引用 |
22
22
  | `field-action` | 原子写入动作函数、注册动作并绑定字段事件;字段自定义事件默认使用此操作 |
23
23
  | `bind-datasource` | 给选项类字段绑定远程搜索数据源(高阶入口优先用 bind-datasource 模式) |
@@ -103,7 +103,7 @@ openyida create-form patch <appType> <formUuid> <patchJsonOrFile>
103
103
 
104
104
  ## rule 模式(字段联动与自动赋值)
105
105
 
106
- 常见字段联动不要直接修改表单底层配置,优先使用 rule 模式:
106
+ 常见字段联动不要直接写底层 Schema Patch,优先使用 rule 模式:
107
107
 
108
108
  ```bash
109
109
  openyida create-form rule <appType> <formUuid> <rulesJsonOrFile>