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
@@ -144,7 +144,7 @@ def render_nav() -> str:
144
144
  for anchor, title, subtitle, icon in SECTIONS:
145
145
  icon_src = icon_data_uri(icon)
146
146
  icon_html = (
147
- f'<span class="nav-icon-img" style="--nav-icon-image: url(\'{esc(icon_src)}\')" aria-hidden="true"></span>'
147
+ f'<img class="nav-icon-img" src="{esc(icon_src)}" alt="" aria-hidden="true" />'
148
148
  if icon_src
149
149
  else '<span class="nav-icon-fallback" aria-hidden="true"></span>'
150
150
  )
@@ -707,6 +707,14 @@ def render_data_models(data: dict[str, Any]) -> str:
707
707
  rows,
708
708
  )
709
709
  )
710
+ sample = next((item for item in (data.get("execution") or {}).get("sampleDataPlan", []) if item.get("form") == model.get("name")), {})
711
+ records = sample.get("records", model.get("sampleRecords", []))
712
+ skip_reason = sample.get("skipReason") or model.get("skipSampleReason")
713
+ if records:
714
+ columns = list(dict.fromkeys(key for record in records for key in record))
715
+ parts += ["<h4>初始示例数据</h4>", table(columns, [[display_value(record.get(key)) for key in columns] for record in records])]
716
+ elif skip_reason:
717
+ parts.append(f'<p><strong>示例数据安排:</strong>{esc(skip_reason)}</p>')
710
718
  if not models:
711
719
  parts.append('<p class="muted">-</p>')
712
720
  parts.append("</section>")
@@ -749,6 +757,10 @@ def render_business_flows(data: dict[str, Any]) -> str:
749
757
  </div>
750
758
  """
751
759
  )
760
+ states = (data.get("execution") or {}).get("interactionStates") or {}
761
+ labels = {"empty": "无数据", "loading": "加载中", "error": "加载失败", "formEntry": "表单入口", "detail": "详情入口"}
762
+ if states:
763
+ parts += ["<h3>交互与异常处理</h3>", table(["场景", "处理方式"], [[labels.get(key, key), value] for key, value in states.items()])]
752
764
  if not flows:
753
765
  parts.append('<p class="muted">-</p>')
754
766
  parts.append("</section>")
@@ -769,6 +781,7 @@ def render_pages(data: dict[str, Any]) -> str:
769
781
  "<h3>自定义页面详情</h3>",
770
782
  ]
771
783
  execution_pages = (data.get("execution") or {}).get("pages", [])
784
+ applications = ((data.get("visualStyle") or {}).get("forUser") or {}).get("pageApplications", [])
772
785
  for detail in details:
773
786
  handoff = next((item.get("pageSpecHandoff", {}) for item in execution_pages if item.get("pageId") == detail.get("pageId")), detail.get("pageSpecHandoff") or {})
774
787
  primary_users = detail.get("primaryUsers") or []
@@ -859,27 +872,20 @@ def render_pages(data: dict[str, Any]) -> str:
859
872
  """
860
873
  binding_labels = {"form": "表单数据", "report": "报表数据", "connector": "外部系统数据", "static-empty": "静态内容或空态"}
861
874
  binding = handoff.get("dataBinding") or detail.get("dataBinding")
862
- page_menu = handoff.get("navigation") or {}
863
- app_custom = ((data.get("execution") or {}).get("appConfig") or {}).get("navigationType") == "custom"
864
- standalone = handoff.get("entryMode") == "standalone"
865
- variants = {"top": "顶部", "side": "侧边", "mixed": "顶部与侧边", "dock": "底部"}
866
- menu_label = ("自定义" + variants.get(page_menu.get("variant"), "") + "菜单") if page_menu.get("type") == "custom" else (
867
- "不设菜单" if page_menu.get("type") == "none" else "沿用应用自定义菜单" if app_custom else "未规划应用菜单,仅实现业务内容" if standalone else "沿用平台导航"
868
- )
869
875
  data_rows = [
870
- ["访问方式", "独立页面入口" if standalone else "应用工作区入口"],
871
- ["页面菜单", menu_label],
872
- ["页面实现边界", "按独立入口方案组织内容" if standalone else "只实现业务内容;跨模块使用平台菜单,同任务分类可用页内 Tab"],
873
- ["导航影响范围", "应用采用自定义导航" if app_custom else "仅当前入口,应用工作区保留平台导航" if standalone else "保留平台导航"],
874
- ["导航依据", page_menu.get("reason")],
875
876
  ["数据接入", binding_labels.get(binding, binding)],
876
877
  ["数据来源", display_value(handoff.get("dataSources") or detail.get("dataSources"))],
877
878
  ["主操作", handoff.get("primaryAction") or detail.get("primaryTask")],
879
+ ["空态原因", handoff.get("emptyReason") or detail.get("emptyReason")],
878
880
  ]
879
- data_html = "".join(
880
- f'<p><strong>{esc(label)}:</strong>{esc(value)}</p>'
881
- for label, value in data_rows if value
882
- )
881
+ data_html = table(["功能", "说明"], [row for row in data_rows if row[1]])
882
+ application = next((item for item in applications if item.get("pageId") == detail.get("pageId") or item.get("pageName") == detail.get("name")), {})
883
+ visual_rows = [[label, display_value(application.get(key))] for key, label in [
884
+ ("visualApplication", "视觉应用"), ("surface", "表面层次"), ("primaryAction", "操作呈现"), ("states", "状态表达")
885
+ ] if application.get(key)]
886
+ for memory in application.get("visualMemoryApplications", []):
887
+ visual_rows.append([memory.get("name") or "视觉重点", ";".join(display_value(memory.get(key)) for key in ["target", "reason", "application", "contentBinding", "userValue", "rule"] if memory.get(key))])
888
+ visual_html = ("<h4>页面视觉方案</h4>" + table(["设计项", "说明"], visual_rows)) if visual_rows else ""
883
889
  first_screen_label = "首屏结构" if is_new_page_schema else "首屏印象"
884
890
  signature_label = "标志性交互" if is_new_page_schema else "标志性时刻"
885
891
  parts.append(
@@ -895,6 +901,7 @@ def render_pages(data: dict[str, Any]) -> str:
895
901
  {pattern_context}
896
902
  <p><strong>权限说明:</strong>{esc(permission)}</p>
897
903
  {data_html}
904
+ {visual_html}
898
905
  </div>
899
906
  """
900
907
  )
@@ -912,14 +919,25 @@ def render_visual_details(data: dict[str, Any]) -> str:
912
919
  rows = [
913
920
  ("视觉方向", direction.get("label")), ("设计说明", direction.get("description")),
914
921
  ("色彩用法", (visual.get("colorStrategy") or {}).get("usage")),
915
- ("素材现状", assets.get("materialStatus")),
922
+ ("层次表达", visual.get("hierarchySummary")), ("组件形态", visual.get("componentToneSummary")),
923
+ ("状态反馈", visual.get("stateSummary")), ("响应式布局", visual.get("responsiveSummary")),
924
+ ("图标风格", visual.get("iconSummary")),
925
+ ("素材现状", assets.get("materialStatus")), ("页面素材", assets.get("pages")),
916
926
  ("素材缺口", assets.get("missingAssets")), ("素材说明", assets.get("notes")),
917
927
  ]
928
+ profile = visual.get("themeProfile") or {}
929
+ rows += [(label, profile.get(key)) for key, label in [
930
+ ("tone", "整体气质"), ("surfaceStyle", "表面风格"), ("contrastLevel", "对比强度"),
931
+ ("brandIntensity", "品牌表达"), ("iconStyle", "图标形态"), ("motionLevel", "动效程度")
932
+ ]]
933
+ memories = visual.get("visualMemories") or []
934
+ for memory in memories if isinstance(memories, list) else [memories]:
935
+ if isinstance(memory, dict):
936
+ rows.append((memory.get("name") or "视觉重点", ";".join(display_value(memory.get(key)) for key in ["rule", "userValue", "failureMode"] if memory.get(key))))
937
+ else:
938
+ rows.append(("视觉重点", memory))
918
939
  rows = [(label, {"none": "暂无", "partial": "部分已有", "provided": "已提供"}.get(value, value) if isinstance(value, str) else value) for label, value in rows]
919
- return "".join(
920
- f'<p><strong>{esc(label)}:</strong>{esc(display_value(value))}</p>'
921
- for label, value in rows if value
922
- )
940
+ return table(["设计项", "方案"], [[label, display_value(value)] for label, value in rows if value])
923
941
 
924
942
 
925
943
  def display_value(value: Any) -> str:
@@ -941,29 +959,16 @@ def render_execution(data: dict[str, Any]) -> str:
941
959
  hidden_pages = execution.get("pageNavigation") or []
942
960
  if hidden_pages:
943
961
  parts += ["<h3>页面导航</h3>", table(["页面", "平台页面导航"], [[item.get("name"), "隐藏" if item.get("isRenderNav") is False else "显示"] for item in hidden_pages])]
944
- if execution.get("entryModeSummary"):
945
- parts += ["<h3>系统怎么使用</h3>", f'<p>{esc(execution["entryModeSummary"])}</p>']
946
- for entry in (execution.get("entryRecommendation") or {}).get("entries", []):
947
- rows = []
948
-
949
- def entry_rows(items):
950
- for item in items:
951
- if item.get("children"):
952
- entry_rows(item["children"])
953
- continue
954
- rows.append([item.get("label"), item.get("resource"),
955
- "默认进入" if item.get("key") == entry.get("defaultMenuKey") else "",
956
- ";".join(f'{access.get("resource", "")}:{access.get("dataScope", "")}' for access in item.get("access", []))])
957
-
958
- entry_rows(entry.get("menu") or [])
959
- parts += [f'<h3>{esc(entry.get("name", "业务入口"))}</h3>', table(["任务菜单", "业务资源", "默认落点", "数据范围"], rows)]
960
962
  if execution.get("explicitScope"):
961
963
  parts += ["<h3>本轮明确范围</h3>", f'<p>{esc(display_value(execution["explicitScope"]))}</p>']
962
- navigation_order = [page_names.get(item, item) if isinstance(item, str) else display_value(item) for item in execution.get("navigationOrder", [])]
963
- if not navigation_order:
964
- fallback = execution.get("navigationFallback") or "按页面用途安排导航入口"
965
- navigation_order = [fallback.replace("--auto-nav-order", "自动导航排序")]
966
- parts += ["<h3>导航顺序</h3>", list_items(navigation_order)]
964
+ for key, title in [("resourceCreationOrder", "搭建顺序"), ("pageImplementationOrder", "页面交付顺序"), ("navigationOrder", "导航顺序"), ("acceptanceCriteria", "验收标准")]:
965
+ values = [page_names.get(item, item) if isinstance(item, str) else display_value(item) for item in execution.get(key, [])]
966
+ values = [str(item).replace("design.md", "视觉方案").replace("token", "主题变量") for item in values]
967
+ if key == "navigationOrder" and not values:
968
+ fallback = execution.get("navigationFallback") or "按页面用途安排导航入口"
969
+ values = [fallback.replace("--auto-nav-order", "自动导航排序")]
970
+ if values:
971
+ parts += [f"<h3>{title}</h3>", list_items(values)]
967
972
  return "".join(parts)
968
973
 
969
974
 
@@ -0,0 +1,190 @@
1
+ #!/usr/bin/env python3
2
+ """Validate the design theme index and its full design.md templates."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import json
8
+ import re
9
+ from pathlib import Path
10
+
11
+
12
+ REQUIRED_HEADINGS = (
13
+ "设计总览",
14
+ "色彩",
15
+ "字体与排版",
16
+ "布局与间距",
17
+ "表面与层级",
18
+ "圆角与形状",
19
+ "组件",
20
+ "项目应用",
21
+ "设计规范与禁忌",
22
+ )
23
+
24
+ ALLOWED_PLACEHOLDERS = {
25
+ "PROJECT_NAME",
26
+ "BUSINESS_DOMAIN",
27
+ "EXPERIENCE_TOPOLOGY",
28
+ "THEME_SOURCE",
29
+ "PRIMARY_COLOR",
30
+ "COLOR_SOURCE",
31
+ "PROJECT_CONSTRAINTS",
32
+ "PRODUCT_TOPOLOGY_APPLICATION",
33
+ "PAGE_PATTERN_SUMMARY",
34
+ "PAGE_APPLICATIONS",
35
+ "PAGE_IMAGE_NEEDS",
36
+ "ASSET_GAPS",
37
+ }
38
+
39
+ CANDIDATE_RULE_FILES = (
40
+ "../../../yida-app/workflow/plan/step-2-confirm.md",
41
+ "references/visual-theme-selection.md",
42
+ "references/build-plan-schema.md",
43
+ )
44
+
45
+ LEGACY_TOKEN_KEY_RE = re.compile(
46
+ r"(?m)^\s+[\"']?(?:"
47
+ r"fontFamily|fontSize|fontWeight|lineHeight|letterSpacing|"
48
+ r"xs|sm|md|lg|xl|2xl|"
49
+ r"corner-(?:zero|circle|semicircle|\d+)"
50
+ r")[\"']?:"
51
+ )
52
+ TOKEN_SUFFIX_SHORTHAND_RE = re.compile(r"--[a-z0-9-]+/(?!\s*--)")
53
+ TOKEN_WILDCARD_RE = re.compile(r"--[a-z0-9-]*\*")
54
+
55
+
56
+ def frontmatter_value(text: str, key: str) -> str | None:
57
+ match = re.search(rf"(?m)^{re.escape(key)}:\s*[\"']?([^\"'\n]+)[\"']?\s*$", text)
58
+ return match.group(1).strip() if match else None
59
+
60
+
61
+ def validate(skill_root: Path) -> list[str]:
62
+ errors: list[str] = []
63
+ index_path = skill_root / "templates" / "design-themes" / "index.json"
64
+ try:
65
+ index = json.loads(index_path.read_text(encoding="utf-8"))
66
+ except (OSError, json.JSONDecodeError) as exc:
67
+ return [f"无法读取主题索引 {index_path}: {exc}"]
68
+
69
+ themes = index.get("themes")
70
+ if not isinstance(themes, list) or not themes:
71
+ return ["templates/design-themes/index.json 缺少非空 themes 数组"]
72
+
73
+ seen_ids: set[str] = set()
74
+ seen_labels: set[str] = set()
75
+ seen_paths: set[str] = set()
76
+ for position, theme in enumerate(themes):
77
+ prefix = f"themes[{position}]"
78
+ if not isinstance(theme, dict):
79
+ errors.append(f"{prefix} 必须是对象")
80
+ continue
81
+
82
+ required = (
83
+ "themeId",
84
+ "label",
85
+ "description",
86
+ "templatePath",
87
+ "defaultProfile",
88
+ )
89
+ for field in required:
90
+ if theme.get(field) in (None, "", [], {}):
91
+ errors.append(f"{prefix} 缺少 {field}")
92
+
93
+ theme_id = str(theme.get("themeId") or "")
94
+ label = str(theme.get("label") or "")
95
+ template_path = str(theme.get("templatePath") or "")
96
+ if theme_id and theme_id in seen_ids:
97
+ errors.append(f"重复 themeId: {theme_id}")
98
+ if theme_id:
99
+ seen_ids.add(theme_id)
100
+ if label and label in seen_labels:
101
+ errors.append(f"重复 label: {label}")
102
+ if label:
103
+ seen_labels.add(label)
104
+ if template_path and template_path in seen_paths:
105
+ errors.append(f"重复 templatePath: {template_path}")
106
+ if template_path:
107
+ seen_paths.add(template_path)
108
+
109
+ full_path = skill_root / template_path
110
+ if not full_path.is_file():
111
+ errors.append(f"{prefix} 模板不存在: {template_path}")
112
+ continue
113
+ text = full_path.read_text(encoding="utf-8")
114
+ if frontmatter_value(text, "themeId") != theme_id:
115
+ errors.append(f"{template_path} 的 themeId 与索引不一致")
116
+
117
+ frontmatter_match = re.match(r"\A---\n([\s\S]*?)\n---", text)
118
+ if not frontmatter_match:
119
+ errors.append(f"{template_path} 缺少合法 YAML frontmatter")
120
+ else:
121
+ legacy_keys = sorted(set(LEGACY_TOKEN_KEY_RE.findall(frontmatter_match.group(1))))
122
+ if legacy_keys:
123
+ errors.append(f"{template_path} 含旧式 Token 属性名")
124
+
125
+ if TOKEN_SUFFIX_SHORTHAND_RE.search(text):
126
+ errors.append(f"{template_path} 含未展开的 Token 后缀缩写")
127
+ if TOKEN_WILDCARD_RE.search(text):
128
+ errors.append(f"{template_path} 含未展开的 Token 通配写法")
129
+
130
+ for heading in REQUIRED_HEADINGS:
131
+ if f"## {heading}" not in text:
132
+ errors.append(f"{template_path} 缺少章节:{heading}")
133
+
134
+ placeholders = set(re.findall(r"\{\{([A-Z0-9_]+)\}\}", text))
135
+ unknown = placeholders - ALLOWED_PLACEHOLDERS
136
+ missing = ALLOWED_PLACEHOLDERS - placeholders
137
+ if unknown:
138
+ errors.append(f"{template_path} 含未知占位符:{', '.join(sorted(unknown))}")
139
+ if missing:
140
+ errors.append(f"{template_path} 缺少标准占位符:{', '.join(sorted(missing))}")
141
+
142
+ template_dir = skill_root / "templates" / "design-themes"
143
+ indexed_files = {Path(path).name for path in seen_paths}
144
+ actual_files = {path.name for path in template_dir.glob("*.md") if path.name != "README.md"}
145
+ for filename in sorted(actual_files - indexed_files):
146
+ errors.append(f"主题模板未登记到索引:templates/design-themes/{filename}")
147
+ for filename in sorted(indexed_files - actual_files):
148
+ errors.append(f"索引引用了不存在的主题模板:templates/design-themes/{filename}")
149
+
150
+ for relative_path in CANDIDATE_RULE_FILES:
151
+ rule_path = skill_root / relative_path
152
+ try:
153
+ rule_text = rule_path.read_text(encoding="utf-8")
154
+ except OSError as exc:
155
+ errors.append(f"无法读取候选规则 {relative_path}: {exc}")
156
+ continue
157
+ for theme in themes:
158
+ if not isinstance(theme, dict):
159
+ continue
160
+ theme_id = str(theme.get("themeId") or "")
161
+ label = str(theme.get("label") or "")
162
+ if theme_id and theme_id in rule_text:
163
+ errors.append(f"{relative_path} 硬编码了主题 ID:{theme_id}")
164
+ if label and label in rule_text:
165
+ errors.append(f"{relative_path} 硬编码了主题名称:{label}")
166
+
167
+ return errors
168
+
169
+
170
+ def main() -> int:
171
+ parser = argparse.ArgumentParser(description=__doc__)
172
+ parser.add_argument(
173
+ "--skill-root",
174
+ type=Path,
175
+ default=Path(__file__).resolve().parents[1],
176
+ help="yida-build-plan skill root",
177
+ )
178
+ args = parser.parse_args()
179
+ errors = validate(args.skill_root.resolve())
180
+ if errors:
181
+ print("主题模板校验失败:")
182
+ for error in errors:
183
+ print(f"- {error}")
184
+ return 1
185
+ print("主题索引与完整 design.md 模板校验通过。")
186
+ return 0
187
+
188
+
189
+ if __name__ == "__main__":
190
+ raise SystemExit(main())
@@ -0,0 +1,98 @@
1
+ # 完整主题模板维护规则
2
+
3
+ ## 用途
4
+
5
+ 本文件用于维护当前目录下的完整主题模板。正常生成项目 `design.md` 时读取 [visual-design.md](../../references/visual-design.md),不读取本文件。
6
+
7
+ ## 文件职责
8
+
9
+ - [index.json](index.json) 保存主题 ID、用户可读名称、视觉描述、模板路径和默认主题画像。
10
+ - `<themeId>.md` 保存一份完整主题模板。
11
+ - [validate_design_themes.py](../../scripts/validate_design_themes.py) 校验索引与模板是否一一对应。
12
+
13
+ ## 索引记录
14
+
15
+ 每条主题索引记录包含:
16
+
17
+ | 字段 | 维护要求 |
18
+ | --- | --- |
19
+ | `themeId` | 在索引中唯一,并与模板 frontmatter 一致 |
20
+ | `label` | 面向用户展示,在索引中唯一 |
21
+ | `description` | 只描述视觉差异,不描述页面任务 |
22
+ | `templatePath` | 指向真实存在的完整主题模板 |
23
+ | `defaultProfile` | 保存候选筛选所需的默认主题画像 |
24
+
25
+ 一条索引记录对应一份模板;目录中的每份主题模板都必须登记在索引中。
26
+
27
+ 每份模板都是全应用主题,不按 `experienceTopology` 或 `businessDomain` 限制候选资格。产品形态只用于生成项目的主题应用说明,逐页视觉记忆点继续按真实内容契约匹配。
28
+
29
+ ## 模板结构
30
+
31
+ 模板 frontmatter 记录 `themeId`、项目级设计 Token 和项目化占位符。模板正文包含以下九个一级章节:
32
+
33
+ 1. 设计总览
34
+ 2. 色彩
35
+ 3. 字体与排版
36
+ 4. 布局与间距
37
+ 5. 表面与层级
38
+ 6. 圆角与形状
39
+ 7. 组件
40
+ 8. 项目应用
41
+ 9. 设计规范与禁忌
42
+
43
+ 模板通过“视觉 DNA”和“视觉记忆点应用策略”保存主题的稳定识别特征。生成流程按页面内容契约选择记忆点,不为套用主题新增业务内容。
44
+
45
+ ## 项目化占位符
46
+
47
+ | 占位符 | 数据来源 |
48
+ | --- | --- |
49
+ | `{{PROJECT_NAME}}` | `meta.projectName` |
50
+ | `{{BUSINESS_DOMAIN}}` | `meta.businessDomain` |
51
+ | `{{EXPERIENCE_TOPOLOGY}}` | `meta.experienceTopology` |
52
+ | `{{THEME_SOURCE}}` | `visualStyle.forUser.visualDirection.source`;旧计划兼容原选择来源 |
53
+ | `{{PRIMARY_COLOR}}` | `visualStyle.forUser.colorStrategy.primaryColor` |
54
+ | `{{COLOR_SOURCE}}` | `visualStyle.forUser.colorStrategy.source` |
55
+ | `{{PROJECT_CONSTRAINTS}}` | `visualStyle.constraints` |
56
+ | `{{PRODUCT_TOPOLOGY_APPLICATION}}` | `visualStyle.forDesignMd.productTopologyApplication` |
57
+ | `{{PAGE_PATTERN_SUMMARY}}` | `pages.customPageDetails[]` 的页面模式与内容丰富度摘要 |
58
+ | `{{PAGE_APPLICATIONS}}` | materialize 根据页面事实、主题标准和 `visualStyle.forUser.pageApplications[].visualMemoryApplications` 生成的完整逐页应用 |
59
+ | `{{PAGE_IMAGE_NEEDS}}` | 页面图片等级和槽位摘要 |
60
+ | `{{ASSET_GAPS}}` | `visualStyle.forUser.assetStrategy.missingAssets` |
61
+
62
+ 模板中的 `<基于……生成的实际色值>` 和 `<由……生成的实际色值>` 是 Token 推导指令。生成项目 `design.md` 时必须替换成具体 CSS 色值。
63
+
64
+ ## 维护操作
65
+
66
+ ### 新增主题
67
+
68
+ 1. 新建完整主题模板。
69
+ 2. 在主题索引中新增唯一记录。
70
+ 3. 运行模板校验。
71
+
72
+ ### 修改主题
73
+
74
+ 1. 修改目标主题模板。
75
+ 2. 保持索引 ID、路径和默认画像与模板一致。
76
+ 3. 运行模板校验。
77
+
78
+ ### 删除主题
79
+
80
+ 1. 从索引中删除目标记录。
81
+ 2. 删除对应模板。
82
+ 3. 运行模板校验。
83
+
84
+ ## 校验
85
+
86
+ 在 `yida-design-plan` 目录运行:
87
+
88
+ ```bash
89
+ python scripts/validate_design_themes.py
90
+ ```
91
+
92
+ 校验通过表示:
93
+
94
+ - 索引与主题模板一一对应。
95
+ - 每份模板包含九个一级章节和全部标准占位符。
96
+ - 全局与自定义页 Token 属性均使用完整的 `--` 开头 kebab-case 名称。
97
+ - 正文中的多个 Token 分别完整书写,不使用后缀缩写或 `*` 通配写法。
98
+ - 候选规则文件没有硬编码主题 ID 或主题名称。