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
@@ -92,18 +92,11 @@ function parseArgs(args) {
92
92
  return result;
93
93
  }
94
94
  result.appType = args[0];
95
- if (args.includes('--hide-app-nav') && args.includes('--show-app-nav')) {
96
- throwCommandError(t('cli_argument.invalid', '--hide-app-nav / --show-app-nav'), { code: 'CLI_INVALID_ARGUMENTS' });
97
- }
98
95
 
99
96
  // 解析选项参数
100
97
  for (let i = 1; i < args.length; i++) {
101
98
  const arg = args[i];
102
99
  const nextArg = args[i + 1];
103
- if (!['--hide-app-nav', '--show-app-nav'].includes(arg) &&
104
- (!nextArg || nextArg.startsWith('--') || ['-n', '-d'].includes(nextArg))) {
105
- throwCommandError(t('cli_argument.invalid', arg), { code: 'CLI_INVALID_ARGUMENTS' });
106
- }
107
100
 
108
101
  switch (arg) {
109
102
  case '--name':
@@ -181,8 +174,6 @@ function parseArgs(args) {
181
174
  case '--show-app-nav':
182
175
  result.hideAppNav = 'n';
183
176
  break;
184
- default:
185
- throwCommandError(t('cli_argument.invalid', arg), { code: 'CLI_INVALID_ARGUMENTS' });
186
177
  }
187
178
  }
188
179
 
@@ -317,7 +308,6 @@ function buildUpdateAppPostData(params, currentApp = {}, authRef) {
317
308
  const sentryMode = pickAppField(currentApp, 'sentryMode', 'SENTRY_MODE');
318
309
  const currentNavType = currentApp.navType || (currentApp.config && currentApp.config.NAVTYPE);
319
310
  const currentLayoutDirection = currentApp.layoutDirection || (currentApp.config && currentApp.config.LAY_OUT_DIRECTION);
320
- const currentNavTheme = currentApp.navTheme || (currentApp.config && currentApp.config.NAV_THEME);
321
311
  if (params.colour === 'custom' && !params.themeColor && !currentThemeColor) {
322
312
  throw new Error(t('update_app.custom_theme_color_required'));
323
313
  }
@@ -340,6 +330,7 @@ function buildUpdateAppPostData(params, currentApp = {}, authRef) {
340
330
  // updateApp 的报错文案叫 appMode,但实际接受的请求字段是 mode。
341
331
  mode: currentApp.mode || (currentApp.config && currentApp.config.APPMODE) || 'normal',
342
332
  type: currentApp.type || (currentApp.config && currentApp.config.APPTYPE) || 'single',
333
+ navTheme: params.navTheme || currentApp.navTheme || (currentApp.config && currentApp.config.NAV_THEME) || 'light',
343
334
  navLayout: currentApp.navLayout || (currentApp.config && currentApp.config.NAVLAYOUT) || 'auto',
344
335
  layoutDirection: params.layoutDirection
345
336
  ? normalizeLayoutDirection(params.layoutDirection)
@@ -370,8 +361,6 @@ function buildUpdateAppPostData(params, currentApp = {}, authRef) {
370
361
 
371
362
  // ThemeNavSetting 保存现有 navType;新布局由 layoutDirection 控制,不反写或补造旧字段。
372
363
  if (currentNavType) {postDataObj.navType = currentNavType;}
373
- const navTheme = params.navTheme || currentNavTheme;
374
- if (navTheme) {postDataObj.navTheme = navTheme;}
375
364
  if (addWaterMark !== undefined && addWaterMark !== null) {
376
365
  postDataObj.addWaterMark = addWaterMark;
377
366
  }
@@ -453,26 +442,7 @@ function themeSettingsMatch(expected, actual) {
453
442
  ['cssUrl', 'cssFileName'].every((key) => (expectedStyle[key] || '') === (actualStyle[key] || ''));
454
443
  }
455
444
 
456
- function getRequestedNavigationSettings(params, payload) {
457
- return Object.fromEntries(['navTheme', 'layoutDirection', 'hideAppNav', 'logoSource']
458
- .filter((name) => params[name] !== undefined && params[name] !== null && params[name] !== '')
459
- .map((name) => [name, payload[name]]));
460
- }
461
-
462
- function getNavigationSettings(app, fields) {
463
- const configKeys = { navTheme: 'NAV_THEME', layoutDirection: 'LAY_OUT_DIRECTION', hideAppNav: 'HIDE_APP_NAV', logoSource: 'LOGO_SOURCE' };
464
- return Object.fromEntries(fields.map((name) => {
465
- let value = pickAppField(app, name, configKeys[name]);
466
- if (name === 'layoutDirection') {
467
- const navType = pickAppField(app, 'navType', 'NAVTYPE');
468
- // A missing response field is not evidence that the requested default was saved.
469
- value = value || navType ? normalizeStoredLayoutDirection(value, navType) : null;
470
- }
471
- return [name, value === undefined ? null : value];
472
- }));
473
- }
474
-
475
- /** updateApp 整包保存;读取最新配置后合并,并核验主题资源和本次请求的导航设置。 */
445
+ /** updateApp 整包保存;与基础设置页一致,读取最新配置后合并,并核验主题资源。 */
476
446
  async function saveAppSettings(params, authRef) {
477
447
  const currentApp = await fetchCurrentApp(params.appType, authRef);
478
448
  const payload = buildUpdateAppPostData(params, currentApp, authRef);
@@ -484,46 +454,29 @@ async function saveAppSettings(params, authRef) {
484
454
  if (!response || !response.success) { return response; }
485
455
 
486
456
  const expected = getThemeSettings(payload);
487
- const verifyTheme = !!(params.colour || params.themeColor || params.customThemeStyle || expected.themeColor || expected.customThemeStyle);
488
- const expectedNavigation = getRequestedNavigationSettings(params, payload);
489
- const navigationFields = Object.keys(expectedNavigation);
490
- if (!verifyTheme && !navigationFields.length) {return response;}
457
+ if (!params.colour && !params.themeColor && !params.customThemeStyle && !expected.themeColor && !expected.customThemeStyle) {
458
+ return response;
459
+ }
491
460
  let actual;
492
- let actualNavigation;
493
461
  let readbackError;
494
- let themeVerified = !verifyTheme;
495
- let navigationVerified = !navigationFields.length;
496
462
  // 只重试查询,避免重复上传资源或用旧快照再次覆盖设置。
497
463
  for (let attempt = 0; attempt < 3; attempt++) {
498
464
  if (attempt) { await new Promise((resolve) => setTimeout(resolve, attempt * 250)); }
499
465
  try {
500
- const app = await fetchCurrentApp(params.appType, authRef);
501
- actual = getThemeSettings(app);
502
- actualNavigation = getNavigationSettings(app, navigationFields);
466
+ actual = getThemeSettings(await fetchCurrentApp(params.appType, authRef));
503
467
  readbackError = undefined;
504
- themeVerified = !verifyTheme || themeSettingsMatch(expected, actual);
505
- navigationVerified = navigationFields.every((name) => expectedNavigation[name] === actualNavigation[name]);
506
- if (themeVerified && navigationVerified) {
507
- return { ...response,
508
- ...(verifyTheme ? { themeVerification: { verified: true, ...actual } } : {}),
509
- ...(navigationFields.length ? { navigationVerification: { verified: true, ...actualNavigation } } : {}),
510
- };
468
+ if (themeSettingsMatch(expected, actual)) {
469
+ return { ...response, themeVerification: { verified: true, ...actual } };
511
470
  }
512
471
  } catch (error) {
513
472
  readbackError = error.message;
514
- themeVerified = !verifyTheme;
515
- navigationVerified = !navigationFields.length;
516
473
  }
517
474
  }
518
475
  return {
519
476
  success: false,
520
- errorCode: themeVerified ? 'APP_NAVIGATION_NOT_PERSISTED' : 'APP_THEME_NOT_PERSISTED',
521
- errorMsg: t(themeVerified ? 'update_app.navigation_not_persisted' : 'update_app.theme_not_persisted'),
522
- ...(verifyTheme ? { themeVerification: themeVerified
523
- ? { verified: true, ...actual } : { verified: false, expected, actual, readbackError } } : {}),
524
- ...(navigationFields.length ? { navigationVerification: navigationVerified
525
- ? { verified: true, ...actualNavigation }
526
- : { verified: false, expected: expectedNavigation, actual: actualNavigation, readbackError } } : {}),
477
+ errorCode: 'APP_THEME_NOT_PERSISTED',
478
+ errorMsg: t('update_app.theme_not_persisted'),
479
+ themeVerification: { verified: false, expected, actual, readbackError },
527
480
  };
528
481
  }
529
482
 
@@ -641,7 +594,6 @@ async function run(args) {
641
594
  success: true,
642
595
  appType: params.appType,
643
596
  themeVerification: response.themeVerification,
644
- navigationVerification: response.navigationVerification,
645
597
  updatedFields: {
646
598
  name: params.name || undefined,
647
599
  desc: params.desc || undefined,
@@ -659,10 +611,8 @@ async function run(args) {
659
611
  const errorMsg = response ? response.errorMsg || t('common.unknown_error') : t('common.request_failed');
660
612
  chalkResult(false, t('update_app.failed', errorMsg));
661
613
  console.log(JSON.stringify({ success: false, appType: params.appType, error: errorMsg,
662
- errorCode: response && response.errorCode, themeVerification: response && response.themeVerification,
663
- navigationVerification: response && response.navigationVerification }));
664
- throwCommandError(errorMsg, { code: response && response.errorCode,
665
- details: response && (response.errorCode === 'APP_NAVIGATION_NOT_PERSISTED' ? response.navigationVerification : response.themeVerification) });
614
+ errorCode: response && response.errorCode, themeVerification: response && response.themeVerification }));
615
+ throwCommandError(errorMsg, { code: response && response.errorCode, details: response && response.themeVerification });
666
616
  }
667
617
  }
668
618
 
@@ -1,9 +1,6 @@
1
1
 
2
2
  'use strict';
3
3
 
4
- const { getAssetExecutionContract } = require('./asset-execution');
5
- const { t } = require('../core/i18n');
6
-
7
4
  const FREE_STOCK_LIBRARIES = [
8
5
  {
9
6
  name: 'Unsplash',
@@ -11,7 +8,7 @@ const FREE_STOCK_LIBRARIES = [
11
8
  license: '遵守 Unsplash License 和 API Guidelines',
12
9
  bestFor: 'Hero、生活方式和场景图',
13
10
  directImageHint: '使用 API 返回的 images.unsplash.com URL。',
14
- deliveryPolicy: '直接使用 API 返回的图片地址;保留署名和 download_location 记录。',
11
+ deliveryPolicy: '下载授权图片后上传宜搭附件;保留署名和 download_location 记录。',
15
12
  },
16
13
  {
17
14
  name: 'Pexels',
@@ -19,7 +16,7 @@ const FREE_STOCK_LIBRARIES = [
19
16
  license: '遵守 Pexels License 和 API Guidelines',
20
17
  bestFor: '产品、办公、人物和场景图',
21
18
  directImageHint: 'images.pexels.com/photos/... 形式为图片直链。',
22
- deliveryPolicy: '优先使用 API 返回的图片地址;保留 Pexels 链接和摄影师信息。',
19
+ deliveryPolicy: '下载后上传宜搭附件;保留 Pexels 链接和摄影师信息。',
23
20
  },
24
21
  ];
25
22
 
@@ -76,65 +73,18 @@ function getFreeStockLibraries() {
76
73
  function getMaterialSourcingGuidance() {
77
74
  return {
78
75
  steps: [
79
- '1. Plan 确认后、Fast 设计就绪后先核实后台 Agent/Bash 能力,按 executionContract 派发并立即继续业务;仅同步时先做已授权资源和独立页面工作,再分批素材。',
80
- '2. 同一页面的图片位置也并发搜索,最多同时四个;每个位置选一张来源完整的图片并查看。',
81
- '3. 第二轮只补第一轮失败的必需位置,换一张图片或使用设计允许的生成图。',
82
- '4. 两轮结束后,可选位置采用设计允许的无图布局,必需位置保留缺口;已就绪页面直接继续。',
83
- '5. 每页使用 asset resolve --page-id 并发检查直链,需托管时上传,写入独立清单并交接该页。',
76
+ '1. 先用用户提供的素材。',
77
+ '2. 再从 Unsplash / Pexels 搜图。',
78
+ '3. 仍有缺口时使用宿主生图。',
79
+ '4. 最后使用中性占位并保持 draft。',
80
+ '5. 所有候选图通过 asset resolve 写入 manifest。',
84
81
  ],
85
- schedulingPolicy: {
86
- owner: 'host_agent',
87
- searchConcurrency: 4,
88
- concurrencyScope: 'collection_run',
89
- searchUnit: 'slot',
90
- resumePolicy: 'reuse_final_slots_and_remaining_round_budget',
91
- runAlongside: ['app_creation', 'form_creation', 'page_creation', 'pages_without_images', 'image_page_layout', 'page_data_binding', 'page_interactions'],
92
- dispatchMode: 'host_capability_adaptive',
93
- executionContract: getAssetExecutionContract(),
94
- afterDispatch: 'continue_resource_and_page_work',
95
- resumeRunning: 'attach_existing_host_task',
96
- waitPolicy: 'own_page_only_after_independent_work',
97
- unsupportedHost: 'business_first_then_bounded_asset_batches',
98
- searchOrder: ['required_slots', 'hero_slots', 'design_order'],
99
- waitAt: 'own_page_image_binding_and_acceptance',
100
- resultWriter: 'one_per_page',
101
- timeBudget: {
102
- owner: 'host_agent', requestTimeoutMs: 30000, pageDeadlineMs: 180000,
103
- startsAt: 'first_search_dispatch', resume: 'keep_original_deadline',
104
- exhausted: 'finish_verified_assets_and_report_remaining_gaps',
105
- },
106
- },
107
- collectionPolicy: {
108
- maxRoundsPerPage: 2,
109
- imagesPerSlot: 1,
110
- candidatesPerSlotPerRound: 1,
111
- secondRound: 'failed_required_slots_only',
112
- concurrency: 'independent_pages_and_assets',
113
- roundOwner: 'host_agent',
114
- pageSelector: '--page-id',
115
- },
116
- completionPolicy: {
117
- resultSource: 'asset-manifests/<pageId>.json',
118
- planApproval: 'reuse_existing_approval',
119
- progressFields: ['visualStyle.forUser.assetStrategy.materialStatus', 'visualStyle.forUser.assetStrategy.missingAssets'],
120
- nextStep: 'continue_ready_pages',
121
- },
122
- failurePolicy: {
123
- attemptsPerCandidate: 1,
124
- sourceUnavailable: 'switch_source_for_remaining_slots',
125
- candidateFailed: 'replace_input',
126
- exhausted: 'planned_optional_layout_or_required_gap',
127
- retryCondition: 'within_two_rounds_or_explicit_request',
128
- },
129
82
  libraries: getFreeStockLibraries(),
130
83
  rules: [
131
- t('asset.sourceRecords'),
132
84
  '不编造图片 URL;按 manifest 的页面状态继续,只使用当前页 materialStatus=final 的图片。',
133
- '允许外链的图片经格式和尺寸检查后直接使用;需托管且允许转存时上传,最大 20 MiB。上传失败时保留已验证且允许外链的原地址。',
85
+ '默认下载并上传宜搭图片附件;超过 20 MiB 保留原链接;不额外探测 URL,下载失败跳过并记录缺口。',
134
86
  '联网搜图仅使用 Unsplash / Pexels。',
135
- '搜索入口遇到 401、403、429、反爬挑战或超时,切换可用来源,其他页面复用该记录;已取得的独立图片直链按自身检查结果处理。图片直链失败则换图。',
136
- '每页最多两轮;每个位置每轮选一张,同一候选尝试一次,成功即结束。第二轮只补失败的必需位置;换来源、换工具或恢复上传仍计入本轮预算。',
137
- '来源信息获取失败时换用信息齐全的候选;真实房源、商品和人员保持真实素材要求。',
87
+ '来源不明时使用中性占位或宿主生成图。',
138
88
  ],
139
89
  };
140
90
  }
@@ -7,28 +7,24 @@ const { getAssetStatus } = require('./asset-status');
7
7
  const { resolveAssets, ASSET_SOURCES } = require('./asset-resolve');
8
8
  const { detectImageGenerator, getMaterialSourcingGuidance } = require('./ai-image');
9
9
  const { throwCommandError, throwStatus, throwUsage } = require('../core/command-errors');
10
- const { t } = require('../core/i18n');
11
10
 
12
- const RESOLVE_USAGE = '用法: openyida asset resolve (--input <manifest-draft.json> | --slot <slotId>=<路径或URL> ...) [--manifest <asset-manifest.json>] [--design <design.md>] [--page-id <pageId>] [--source search|user|generated] [--app-type <appType>] [--upload-assets] [--offline] [--json]';
11
+ const RESOLVE_USAGE = '用法: openyida asset resolve (--input <manifest-draft.json> | --slot <slotId>=<路径或URL> ...) [--manifest <asset-manifest.json>] [--design <design.md>] [--source search|user|generated] [--app-type <appType>] [--upload-assets] [--offline] [--json]';
13
12
 
14
13
  function printHelp() {
15
14
  console.log(`
16
15
  用法:
17
16
  openyida asset status [--offline] [--json]
18
- openyida asset resolve (--input <manifest-draft.json> | --slot <slotId>=<路径或URL> ...) [--manifest <asset-manifest.json>] [--design <design.md>] [--page-id <pageId>] [--source search|user|generated] [--app-type <appType>] [--upload-assets] [--offline] [--json]
17
+ openyida asset resolve (--input <manifest-draft.json> | --slot <slotId>=<路径或URL> ...) [--manifest <asset-manifest.json>] [--design <design.md>] [--source search|user|generated] [--app-type <appType>] [--upload-assets] [--offline] [--json]
19
18
  openyida asset sources [--json]
20
19
 
21
20
  子命令:
22
21
  status 检测素材能力
23
- resolve 校验图片,优先使用允许外链的原地址并生成清单
22
+ resolve 校验图片、默认上传宜搭图片附件并生成清单
24
23
 
25
- 允许外链的图片检查通过后直接使用;本地图片和需托管的图片上传,最大 20 MiB。
26
- --app-type 用于上传图片;直链检查无需登录或创建应用。省略时上传读取项目 config.json。
27
- --page-id 只处理该页图片;按页并发时,每页使用独立的 --manifest 文件。
28
- --upload-assets 请求上传允许转存的图片;上传失败时保留已验证且允许外链的原地址。--offline 不联网、不上传。
24
+ 图片不超过 20 MiB 时上传;超过限制的外链保留原地址。
25
+ --app-type 指定目标应用,省略时读取项目 config.json。
26
+ --upload-assets 仅兼容旧命令,默认已上传;--offline 不联网、不上传。
29
27
  sources 输出 Unsplash/Pexels 使用规则
30
-
31
- ${t('asset.sourceRecords')}
32
28
  `);
33
29
  }
34
30
 
@@ -58,7 +54,7 @@ function parseArgs(args) {
58
54
  source: 'search',
59
55
  timeout: 0,
60
56
  json: false,
61
- help: args[0] === '--help' || args[0] === '-h',
57
+ help: false,
62
58
  errors: [],
63
59
  usedOptions: [],
64
60
  };
@@ -89,10 +85,6 @@ function parseArgs(args) {
89
85
  parsed.usedOptions.push('--design');
90
86
  parsed.design = args[++i] || '';
91
87
  if (!parsed.design || parsed.design.startsWith('--')) {parsed.errors.push('ASSET_DESIGN_REQUIRED');}
92
- } else if (arg === '--page-id') {
93
- parsed.usedOptions.push('--page-id');
94
- parsed.pageId = args[++i] || '';
95
- if (!parsed.pageId.trim() || parsed.pageId.startsWith('--')) {parsed.errors.push('ASSET_PAGE_ID_REQUIRED');}
96
88
  } else if (arg === '--manifest') {
97
89
  parsed.usedOptions.push('--manifest');
98
90
  parsed.manifest = args[++i] || '';
@@ -117,7 +109,6 @@ function runStatus(options) {
117
109
  return;
118
110
  }
119
111
  console.log('素材能力检测');
120
- console.log(' 图片交付 : 优先使用已验证且允许外链的图片地址');
121
112
  console.log(' 上传目标 : 宜搭图片附件(需要登录态和 appType)');
122
113
  console.log(' 上传条件 : ' + (status.canUpload ? '联网已启用;实际上传时验证登录态和应用权限' : '离线,不上传'));
123
114
  console.log(' 可生成图片 : ' + (status.canGenerate === true ? '是' : status.canGenerate === false ? '否' : '未确认'));
@@ -167,11 +158,9 @@ async function runResolve(options) {
167
158
 
168
159
  const result = await resolveAssets(assets, {
169
160
  assetStrategy,
170
- pageId: options.pageId,
171
161
  online: !options.offline,
172
162
  appType: options.appType,
173
163
  assetSource: options.source,
174
- uploadAssets: options.uploadAssets,
175
164
  timeout: options.timeout || undefined,
176
165
  });
177
166
  const manifestPath = options.manifest ? writeManifest(options.manifest, result) : '';
@@ -1,9 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const fs = require('fs');
4
- const path = require('path');
5
4
  const { CliError } = require('../core/cli-error');
6
- const { parseDesignDocument } = require('../design/document');
7
5
 
8
6
  function invalid(code, details = {}) {
9
7
  throw new CliError(code, { code, details });
@@ -20,7 +18,7 @@ function nonempty(value) {
20
18
  function minimumSize(asset) {
21
19
  const match = typeof asset.minSize === 'string' && asset.minSize.match(/^(\d+)x(\d+)$/i);
22
20
  if (asset.minSize !== undefined && !match) {
23
- invalid('ASSET_INVALID_SIZE', { slotId: asset.slotId, field: 'minSize', minSize: asset.minSize, expected: 'widthxheight string, e.g. 1600x900' });
21
+ invalid('ASSET_INVALID_SIZE', { slotId: asset.slotId, minSize: asset.minSize });
24
22
  }
25
23
  const values = [asset.minWidth ?? 0, asset.minHeight ?? 0];
26
24
  const declared = match ? [Number(match[1]), Number(match[2])] : [0, 0];
@@ -35,56 +33,16 @@ function readDesignAssetStrategy(file) {
35
33
  try { markdown = fs.readFileSync(file, 'utf8'); } catch (error) {
36
34
  invalid('ASSET_DESIGN_INVALID', { file, reason: error.message });
37
35
  }
38
- try {
39
- const strategy = parseDesignDocument(markdown, { legacyTokenValues: true }).metadata.assetStrategy;
40
- if (!object(strategy) || !Array.isArray(strategy.pages)) {throw new Error('assetStrategy.pages must be an array');}
41
- return strategy;
42
- } catch (error) {
43
- invalid('ASSET_DESIGN_INVALID', { file, field: 'assetStrategy', reason: error.message });
44
- }
45
- }
46
-
47
- function validateDeliveryOptions(asset) {
48
- const slotId = asset.slotId;
49
- for (const field of ['hotlinkAllowed', 'rehostAllowed']) {
50
- if (asset[field] !== undefined && typeof asset[field] !== 'boolean') {
51
- invalid('ASSET_INPUT_INVALID', { slotId, field, expected: 'boolean' });
52
- }
53
- }
54
- if (asset.deliveryMode !== undefined && !['auto', 'upload'].includes(asset.deliveryMode)) {
55
- invalid('ASSET_INPUT_INVALID', { slotId, field: 'deliveryMode', expected: 'auto|upload' });
56
- }
57
- }
58
-
59
- function validateSourceRecords(asset) {
60
- const slotId = asset.slotId;
61
- for (const field of ['assetId', 'licenseUrl', 'licenseCheckedAt']) {
62
- if (asset[field] !== undefined && typeof asset[field] !== 'string') {
63
- invalid('ASSET_INPUT_INVALID', { slotId, field, expected: 'string' });
64
- }
65
- }
66
- if (asset.licenseUrl) {
67
- let url;
68
- try {url = new URL(asset.licenseUrl);} catch { /* Report malformed links below. */ }
69
- if (!url || !['http:', 'https:'].includes(url.protocol)) {
70
- invalid('ASSET_INPUT_INVALID', { slotId, field: 'licenseUrl', expected: 'HTTP(S) URL' });
71
- }
72
- }
73
- if (asset.licenseCheckedAt) {
74
- const value = asset.licenseCheckedAt;
75
- const date = new Date(`${value}T00:00:00.000Z`);
76
- if (!/^\d{4}-\d{2}-\d{2}$/.test(value) || !Number.isFinite(date.getTime()) || date.toISOString().slice(0, 10) !== value) {
77
- invalid('ASSET_INPUT_INVALID', { slotId, field: 'licenseCheckedAt', expected: 'YYYY-MM-DD' });
78
- }
79
- }
80
- if (asset.authorizationEvidence !== undefined
81
- && (!Array.isArray(asset.authorizationEvidence) || !asset.authorizationEvidence.every(nonempty))) {
82
- invalid('ASSET_INPUT_INVALID', { slotId, field: 'authorizationEvidence', expected: 'array of nonempty strings' });
36
+ const frontmatter = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/.exec(markdown);
37
+ const lines = frontmatter ? frontmatter[1].split(/\r?\n/).filter(line => /^assetStrategy:/.test(line)) : [];
38
+ if (lines.length !== 1) {invalid('ASSET_DESIGN_INVALID', { file, field: 'assetStrategy', format: 'single-line JSON in frontmatter' });}
39
+ try { return JSON.parse(lines[0].slice('assetStrategy:'.length).trim()); } catch {
40
+ invalid('ASSET_DESIGN_INVALID', { file, field: 'assetStrategy', format: 'single-line JSON in frontmatter' });
83
41
  }
84
42
  }
85
43
 
86
44
  // The design owns page membership, required slots and minimum dimensions.
87
- function prepareAssetPlan(assets, assetStrategy, pageId) {
45
+ function prepareAssetPlan(assets, assetStrategy) {
88
46
  if (!Array.isArray(assets)) {invalid('ASSET_INPUT_INVALID', { field: 'assets' });}
89
47
  const seen = new Set();
90
48
  const entries = assets.map(asset => {
@@ -93,19 +51,12 @@ function prepareAssetPlan(assets, assetStrategy, pageId) {
93
51
  if (seen.has(slotId)) {invalid('ASSET_DUPLICATE_SLOT', { slotId });}
94
52
  seen.add(slotId);
95
53
  minimumSize(asset);
96
- validateDeliveryOptions(asset);
97
- validateSourceRecords(asset);
98
54
  return { ...asset, slotId };
99
55
  });
100
- if (assetStrategy === undefined) {
101
- if (pageId !== undefined) {invalid('ASSET_PAGE_REQUIRES_DESIGN', { pageId });}
102
- return { entries, pages: [], assetStrategy: undefined };
103
- }
56
+ if (assetStrategy === undefined) {return { entries, pages: [], assetStrategy: undefined };}
104
57
  if (!object(assetStrategy) || !Array.isArray(assetStrategy.pages)) {
105
58
  invalid('ASSET_DESIGN_INVALID', { field: 'assetStrategy.pages' });
106
59
  }
107
- assetStrategy = { ...assetStrategy, pages: assetStrategy.pages.map(page =>
108
- object(page) && page.imageNeed === 'none' && page.slots === undefined ? { ...page, slots: [] } : page) };
109
60
  const pageIds = new Set();
110
61
  const slots = new Map();
111
62
  const pages = assetStrategy.pages.map(page => {
@@ -124,8 +75,6 @@ function prepareAssetPlan(assets, assetStrategy, pageId) {
124
75
  const count = slot.count ?? 1;
125
76
  if (!Number.isInteger(count) || count < 1 || count > 100) {invalid('ASSET_DESIGN_INVALID', { pageId, slotId: slot.slotId, field: 'count' });}
126
77
  minimumSize(slot);
127
- validateDeliveryOptions(slot);
128
- validateSourceRecords(slot);
129
78
  for (let index = 0; index < count; index++) {
130
79
  const slotId = count === 1 ? slot.slotId.trim() : `${slot.slotId.trim()}[${index}]`;
131
80
  if (slots.has(slotId)) {invalid('ASSET_DUPLICATE_SLOT', { slotId });}
@@ -150,49 +99,7 @@ function prepareAssetPlan(assets, assetStrategy, pageId) {
150
99
  minHeight: Math.max(designSize.minHeight, inputSize.minHeight),
151
100
  };
152
101
  });
153
- if (pageId !== undefined) {
154
- if (!nonempty(pageId) || !pageIds.has(pageId.trim())) {invalid('ASSET_PAGE_NOT_FOUND', { pageId });}
155
- const selectedId = pageId.trim();
156
- return {
157
- entries: planned.filter(entry => entry.pageId === selectedId),
158
- pages: pages.filter(page => page.pageId === selectedId),
159
- assetStrategy: { ...assetStrategy, pages: assetStrategy.pages.filter(page => page.pageId.trim() === selectedId) },
160
- };
161
- }
162
102
  return { entries: planned, pages, assetStrategy };
163
103
  }
164
104
 
165
- // The host executes search tasks; the CLI provides concrete inputs and independent output paths.
166
- function buildAssetTasks(assetStrategy, outputDir) {
167
- const plan = prepareAssetPlan([], assetStrategy);
168
- const guidance = require('./ai-image').getMaterialSourcingGuidance();
169
- return plan.pages.filter(page => page.imageNeed !== 'none' && page.slotIds.length).map(page => {
170
- const basename = path.join(outputDir, 'asset-manifests', encodeURIComponent(page.pageId));
171
- const draft = `${basename}.draft.json`;
172
- const manifest = `${basename}.json`;
173
- const slots = plan.entries.filter(slot => slot.pageId === page.pageId);
174
- // Stable sorting preserves design order within each priority group.
175
- const searches = [...slots].sort((a, b) => Number(b.required) - Number(a.required)
176
- || Number(b.usage === 'hero') - Number(a.usage === 'hero'));
177
- return {
178
- pageId: page.pageId, skillId: 'yida-image-assets', startWhen: 'plan_confirmed',
179
- taskKey: path.resolve(manifest), taskState: `${basename}.task.json`,
180
- ...guidance.schedulingPolicy,
181
- collectionPolicy: guidance.collectionPolicy,
182
- failurePolicy: guidance.failurePolicy,
183
- draft, manifest,
184
- searches: searches.map(slot => ({
185
- slotId: slot.slotId, usage: slot.usage, ...minimumSize(slot),
186
- required: slot.required, generationAllowed: slot.generationAllowed === true, dependsOn: [],
187
- })),
188
- resolve: {
189
- startWhen: 'page_draft_ready', appTypeRequired: false, uploadRequiresAppType: true,
190
- uploadArgs: ['--app-type', '<appType>'],
191
- argv: ['asset', 'resolve', '--input', draft, '--manifest', manifest,
192
- '--design', path.join(outputDir, 'design.md'), '--page-id', page.pageId, '--json'],
193
- },
194
- };
195
- });
196
- }
197
-
198
- module.exports = { minimumSize, prepareAssetPlan, readDesignAssetStrategy, buildAssetTasks };
105
+ module.exports = { minimumSize, prepareAssetPlan, readDesignAssetStrategy };