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.
- package/README.md +14 -20
- package/bin/yida.js +6 -11
- package/lib/app/app-list.js +3 -7
- package/lib/app/canvas-compile.js +12 -22
- package/lib/app/check-prd-completeness.js +0 -7
- package/lib/app/create-app.js +1 -4
- package/lib/app/create-form/args.js +12 -37
- package/lib/app/create-form/batch.js +11 -86
- package/lib/app/create-form.js +86 -193
- package/lib/app/create-page.js +17 -84
- package/lib/app/custom-theme.js +0 -11
- package/lib/app/form-field-validator.js +41 -26
- package/lib/app/form-open-guard.js +10 -97
- package/lib/app/get-form-config.js +0 -1
- package/lib/app/inline-css-guard.js +31 -1
- package/lib/app/services/form-compiler.js +4 -2
- package/lib/app/theme-from-design.js +41 -144
- package/lib/app/theme-presets.js +1 -1
- package/lib/app/update-app.js +13 -63
- package/lib/asset/ai-image.js +9 -59
- package/lib/asset/asset-cmd.js +7 -18
- package/lib/asset/asset-plan.js +9 -102
- package/lib/asset/asset-resolve.js +10 -55
- package/lib/asset/asset-status.js +4 -5
- package/lib/asset/host-capabilities.js +2 -11
- package/lib/asset/url-verify.js +4 -19
- package/lib/auth/dws-sync.js +148 -0
- package/lib/auth/token-auth.js +73 -9
- package/lib/auth/token-store.js +50 -0
- package/lib/connector/connector-test.js +5 -19
- package/lib/connector/contract.js +1 -3
- package/lib/core/agent-capabilities.js +16 -19
- package/lib/core/command-manifest.js +40 -329
- package/lib/core/locales/en.js +17 -74
- package/lib/core/locales/zh.js +16 -73
- package/lib/core/redact.js +10 -15
- package/lib/core/sample.js +30 -72
- package/lib/core/utils.js +4 -0
- package/lib/design-plan/design-plan.js +4 -51
- package/lib/design-plan/init.js +26 -121
- package/lib/design-plan/materialize.js +348 -451
- package/lib/design-plan/normalize.js +29 -74
- package/lib/design-plan/parallel.js +16 -71
- package/lib/design-plan/patch.js +16 -63
- package/lib/design-plan/preview.js +8 -6
- package/lib/design-plan/validate.js +11 -71
- package/lib/process/create-process.js +50 -84
- package/lib/samples/openyida-scaffold/canvas-form-drawer.canvas.jsx +90 -20
- package/lib/samples/openyida-scaffold/canvas-nav/content.jsx +13 -93
- package/lib/samples/openyida-scaffold/canvas-nav/data.jsx +18 -100
- package/lib/samples/openyida-scaffold/canvas-nav/mixed.jsx +4 -6
- package/lib/samples/openyida-scaffold/canvas-nav/shared.jsx +5 -5
- package/lib/samples/openyida-scaffold/canvas-nav/side.jsx +2 -1
- package/lib/samples/openyida-scaffold/canvas-nav/sidebar.jsx +1 -1
- package/lib/samples/openyida-scaffold/canvas-nav/top.jsx +9 -15
- package/lib/samples/yida-canvas-table-form/table-form-batch-submit.canvas.jsx +83 -9
- package/lib/samples/yida-rechart/trend-combo.canvas.jsx +87 -14
- package/package.json +1 -3
- package/scripts/postinstall.js +3 -3
- package/yida-skills/SKILL.md +16 -19
- package/yida-skills/references/official-example-schema-patterns.md +1 -1
- package/yida-skills/references/yida-api.md +0 -4
- package/yida-skills/skills/yida-app/SKILL.md +23 -46
- package/yida-skills/skills/yida-app/workflow/parallel-work.md +6 -15
- package/yida-skills/skills/yida-app/workflow/plan/step-1-understand.md +1 -1
- package/yida-skills/skills/yida-app/workflow/plan/step-2-confirm.md +1 -1
- package/yida-skills/skills/yida-app/workflow/plan/step-4-deliver.md +15 -29
- package/yida-skills/skills/yida-app/workflow/plan/workflow.md +11 -29
- package/yida-skills/skills/yida-app/workflow/step-1-resource-context.md +2 -4
- package/yida-skills/skills/yida-app/workflow/step-2-design.md +9 -23
- package/yida-skills/skills/yida-app/workflow/step-3-create-or-reuse-app.md +4 -6
- package/yida-skills/skills/yida-app/workflow/step-4-forms-processes.md +4 -15
- package/yida-skills/skills/yida-app/workflow/step-6-main-page.md +4 -6
- package/yida-skills/skills/yida-app/workflow/step-7-page-code.md +9 -15
- package/yida-skills/skills/yida-app/workflow/step-8-publish-navigation.md +11 -25
- package/yida-skills/skills/yida-app/workflow/step-9-output-finish.md +28 -68
- package/yida-skills/skills/yida-canvas-custom-page/SKILL.md +43 -42
- package/yida-skills/skills/yida-canvas-custom-page/references/canvas-style-implementation-guide.md +44 -60
- package/yida-skills/skills/yida-canvas-custom-page/references/canvas-theme-provider.md +50 -72
- package/yida-skills/skills/yida-canvas-custom-page/references/component-library-guide.md +1 -13
- package/yida-skills/skills/yida-canvas-custom-page/references/data-bridge-guide.md +1 -140
- package/yida-skills/skills/yida-canvas-custom-page/references/navigation-and-entry-guide.md +72 -101
- package/yida-skills/skills/yida-canvas-custom-page/references/page-generation-guide.md +32 -35
- package/yida-skills/skills/yida-canvas-custom-page/scripts/build-canvas-theme.js +3 -29
- package/yida-skills/skills/yida-canvas-custom-page/scripts/canvas-theme-provider.template.jsx +6 -69
- package/yida-skills/skills/yida-canvas-data-binding/SKILL.md +0 -26
- package/yida-skills/skills/yida-create-app/SKILL.md +0 -2
- package/yida-skills/skills/yida-create-form-page/SKILL.md +58 -72
- package/yida-skills/skills/yida-create-form-page/references/advanced-form-modes.md +5 -5
- package/yida-skills/skills/yida-create-form-page/references/association-form-field.md +4 -4
- package/yida-skills/skills/yida-create-form-page/references/batch-forms.md +5 -6
- package/yida-skills/skills/yida-create-form-page/references/field-definition-guide.md +19 -7
- package/yida-skills/skills/yida-create-form-page/references/form-field-properties.md +44 -62
- package/yida-skills/skills/yida-create-page/SKILL.md +6 -14
- package/yida-skills/skills/yida-create-process/SKILL.md +2 -13
- package/yida-skills/skills/yida-custom-page/SKILL.md +0 -2
- package/yida-skills/skills/yida-custom-page/references/design-system.md +1 -1
- package/yida-skills/skills/yida-dashboard/SKILL.md +4 -5
- package/yida-skills/skills/yida-data-management/SKILL.md +2 -4
- package/yida-skills/skills/yida-data-management/references/data-format-guide.md +4 -4
- package/yida-skills/skills/yida-design/SKILL.md +14 -29
- package/yida-skills/skills/yida-design/references/app/blueprint.md +70 -0
- package/yida-skills/skills/yida-design/references/app/navigation-patterns.md +43 -0
- package/yida-skills/skills/yida-design/references/app/role-journey.md +30 -0
- package/yida-skills/skills/yida-design/references/ask-human-interaction-contract.md +42 -67
- package/yida-skills/skills/yida-design/references/asset-workflow.md +2 -6
- package/yida-skills/skills/yida-design/references/design-mode.md +4 -4
- package/yida-skills/skills/yida-design/references/page-quality-gates.md +38 -26
- package/yida-skills/skills/yida-design/references/style-design-selection.md +137 -0
- package/yida-skills/skills/yida-design/references/style-designs/_design-md-template.md +185 -0
- package/yida-skills/skills/yida-design/references/style-designs/aqua-service-progress-dashboard.md +242 -0
- package/yida-skills/skills/yida-design/references/style-designs/blue-insight-operations-dashboard.md +243 -0
- package/yida-skills/skills/yida-design/references/style-designs/blue-productivity-insight-workbench.md +242 -0
- package/yida-skills/skills/yida-design/references/style-designs/command-filter-card-console.md +304 -0
- package/yida-skills/skills/yida-design/references/style-designs/contrast-command-analytics-workbench.md +261 -0
- package/yida-skills/skills/yida-design/references/style-designs/dark-stage-analytic-dashboard.md +369 -0
- package/yida-skills/skills/yida-design/references/style-designs/filterable-card-catalog.md +354 -0
- package/yida-skills/skills/yida-design/references/style-designs/green-timeline-progress-workbench.md +250 -0
- package/yida-skills/skills/yida-design/references/style-designs/registry.md +117 -0
- package/yida-skills/skills/yida-design/references/style-designs/soft-analytic-workbench.md +348 -0
- package/yida-skills/skills/yida-design/references/style-designs/soft-blue-grid-analytic-dashboard.md +658 -0
- package/yida-skills/skills/yida-design/references/style-designs/soft-bordered-analytic-workbench.md +385 -0
- package/yida-skills/skills/yida-design/references/style-designs/soft-curated-filter-gallery.md +300 -0
- package/yida-skills/skills/yida-design/references/style-designs/soft-modular-analytic-workbench.md +404 -0
- package/yida-skills/skills/yida-design/references/style-designs/soft-progress-analytics-workbench.md +382 -0
- package/yida-skills/skills/yida-design/references/style-designs/soft-timeline-analytics-workbench.md +367 -0
- package/yida-skills/skills/yida-design/references/style-designs/teal-rail-analytics-workbench.md +341 -0
- package/yida-skills/skills/yida-design/references/theme/app-custom-theme-template.css +432 -350
- package/yida-skills/skills/yida-design/references/visual-decision-engine.md +143 -19
- package/yida-skills/skills/yida-design/references/visual-scaffold-recipes.md +27 -15
- package/yida-skills/skills/yida-design/sub_skill/page-design/SKILL.md +0 -4
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/SKILL.md +8 -22
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/assets/README.md +10 -14
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/assets/build-plan-template.html +4 -9
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/build-plan-compact-schema.md +27 -49
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/build-plan-schema.md +154 -33
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/visual-design.md +127 -48
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/visual-theme-selection.md +51 -37
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/scripts/render_build_plan.py +48 -43
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/scripts/validate_design_themes.py +190 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/README.md +98 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-media-grid.md +339 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-modular-clarity.md +348 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-structured-clarity.md +344 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/ambient-halo-layered.md +345 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/dark-focus-layered.md +355 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/dark-luminous-modular.md +377 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/deep-stage-duotone.md +352 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/hairline-runway-clarity.md +389 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/high-contrast-modular.md +364 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/index.json +329 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/interlocked-vivid-modules.md +348 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/matrix-grid-focus.md +345 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/media-rail-inspector.md +379 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/mist-layered-signal.md +347 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/modular-rail-signal.md +352 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/mono-grid-signal.md +386 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/ribbon-ledger-lift.md +384 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/segmented-meter-clarity.md +388 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/split-rail-precision.md +341 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/status-framed-media-grid.md +361 -0
- package/yida-skills/skills/yida-design/workflow/output-design.md +375 -117
- package/yida-skills/skills/yida-design/workflow/output-prd.md +185 -0
- package/yida-skills/skills/yida-design/workflow/step-1-read-brief.md +1 -1
- package/yida-skills/skills/yida-design/workflow/step-2-theme-system.md +29 -33
- package/yida-skills/skills/yida-design/workflow/step-4-wireframe-interaction.md +1 -3
- package/yida-skills/skills/yida-design/workflow/step-5-visual-states.md +106 -22
- package/yida-skills/skills/yida-design/workflow/step-6-handoff.md +22 -15
- package/yida-skills/skills/yida-form-permission/SKILL.md +0 -6
- package/yida-skills/skills/yida-image-assets/SKILL.md +50 -73
- package/yida-skills/skills/yida-image-assets/references/manifest-contract.md +52 -82
- package/yida-skills/skills/yida-image-assets/references/source-policy.md +15 -14
- package/yida-skills/skills/yida-integration/SKILL.md +0 -1
- package/yida-skills/skills/yida-login/SKILL.md +0 -2
- package/yida-skills/skills/yida-nav-group/SKILL.md +2 -4
- package/yida-skills/skills/yida-nav-shell/SKILL.md +12 -36
- package/yida-skills/skills/yida-nav-shell/references/nav-shell-patterns.md +136 -79
- package/yida-skills/skills/yida-page-config/SKILL.md +4 -13
- package/yida-skills/skills/yida-prd/SKILL.md +3 -5
- package/yida-skills/skills/yida-prd/references/app/blueprint.md +4 -4
- package/yida-skills/skills/yida-prd/references/app/navigation-patterns.md +3 -6
- package/yida-skills/skills/yida-prd/references/app/role-journey.md +3 -5
- package/yida-skills/skills/yida-prd/references/plan-content.md +0 -4
- package/yida-skills/skills/yida-prd/workflow/output-prd.md +11 -18
- package/yida-skills/skills/yida-prd/workflow/plan-business.md +4 -4
- package/yida-skills/skills/yida-prd/workflow/step-2-information-architecture.md +8 -11
- package/yida-skills/skills/yida-publish-page/SKILL.md +1 -9
- package/yida-skills/skills/yida-requirement-analysis/SKILL.md +39 -10
- package/yida-skills/skills/yida-requirement-analysis/workflow/prepare-brief.md +71 -40
- package/yida-skills/skills-index.json +16 -36
- package/lib/app/application-entry-urls.js +0 -31
- package/lib/app/application-style.js +0 -69
- package/lib/app/canvas-icon-exports.json +0 -6160
- package/lib/app/canvas-icon-guard.js +0 -87
- package/lib/app/canvas-navigation-guard.js +0 -84
- package/lib/app/canvas-path-guard.js +0 -78
- package/lib/app/canvas-theme-guard.js +0 -184
- package/lib/app/form-data-response-guard.js +0 -57
- package/lib/asset/asset-execution.js +0 -79
- package/lib/core/css-structure.js +0 -37
- package/lib/design/check-design.js +0 -51
- package/lib/design/document.js +0 -458
- package/lib/design/icon-contrast.js +0 -85
- package/lib/design/page-content.js +0 -11
- package/lib/design-plan/artifact-updates.js +0 -117
- package/lib/design-plan/confirmation.js +0 -13
- package/lib/design-plan/entry-navigation.js +0 -97
- package/lib/design-plan/navigation-policy.js +0 -38
- package/lib/design-plan/rebase.js +0 -60
- package/lib/design-plan/themes.js +0 -101
- package/lib/design-plan/visual-policy.js +0 -42
- package/lib/samples/openyida-scaffold/canvas-admin-entry.jsx +0 -62
- package/lib/samples/openyida-scaffold/canvas-navigation.jsx +0 -56
- package/lib/samples/openyida-scaffold/canvas-view-state.jsx +0 -74
- package/yida-skills/skills/yida-app/references/entry-navigation.md +0 -193
- package/yida-skills/skills/yida-canvas-custom-page/references/view-state-recovery.md +0 -52
- package/yida-skills/skills/yida-canvas-data-binding/references/business-action-permissions.md +0 -31
- package/yida-skills/skills/yida-design/references/application-style-library.md +0 -93
- package/yida-skills/skills/yida-design/references/application-theme-consistency.md +0 -150
- package/yida-skills/skills/yida-design/references/native-form-styles.md +0 -208
- package/yida-skills/skills/yida-design/references/navigation-decision.md +0 -53
- package/yida-skills/skills/yida-design/references/page-continuity.md +0 -42
- package/yida-skills/skills/yida-design/references/theme/application-style-recipes.css +0 -58
- package/yida-skills/skills/yida-design/references/theme-selection.md +0 -67
- package/yida-skills/skills/yida-design/scripts/validate_design_themes.py +0 -302
- package/yida-skills/skills/yida-design/templates/application-styles.json +0 -398
- package/yida-skills/skills/yida-design/templates/design-themes/README.md +0 -73
- package/yida-skills/skills/yida-design/templates/design-themes/app-amber/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-amber/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-amber/form-layout.json +0 -15
- package/yida-skills/skills/yida-design/templates/design-themes/app-editorial/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-editorial/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-editorial/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-executive/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-executive/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-executive/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/app-finance/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-finance/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-finance/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-glass/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-glass/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-glass/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-graphite/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-graphite/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-graphite/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-line/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-line/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-line/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/app-neon/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-neon/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-neon/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-nordic/app_theme.css +0 -754
- package/yida-skills/skills/yida-design/templates/design-themes/app-nordic/design.md +0 -279
- package/yida-skills/skills/yida-design/templates/design-themes/app-nordic/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/app-paper/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-paper/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-paper/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/app-platinum/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-platinum/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-platinum/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-plum/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-plum/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-plum/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-pop/app_theme.css +0 -758
- package/yida-skills/skills/yida-design/templates/design-themes/app-pop/design.md +0 -281
- package/yida-skills/skills/yida-design/templates/design-themes/app-pop/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-sage/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-sage/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-sage/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-teal/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-teal/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-teal/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-terminal/app_theme.css +0 -754
- package/yida-skills/skills/yida-design/templates/design-themes/app-terminal/design.md +0 -279
- package/yida-skills/skills/yida-design/templates/design-themes/app-terminal/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-ticket/app_theme.css +0 -752
- package/yida-skills/skills/yida-design/templates/design-themes/app-ticket/design.md +0 -278
- package/yida-skills/skills/yida-design/templates/design-themes/app-ticket/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/app-wire/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-wire/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-wire/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/basic-tokens.json +0 -118
- package/yida-skills/skills/yida-design/templates/design-themes/dark-inset-hairline/app_theme.css +0 -690
- package/yida-skills/skills/yida-design/templates/design-themes/dark-inset-hairline/design.md +0 -382
- package/yida-skills/skills/yida-design/templates/design-themes/dark-inset-hairline/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-fine-lines/app_theme.css +0 -691
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-fine-lines/design.md +0 -380
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-fine-lines/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-signal-panels/app_theme.css +0 -696
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-signal-panels/design.md +0 -378
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-signal-panels/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/free-creative/app_theme.css +0 -689
- package/yida-skills/skills/yida-design/templates/design-themes/free-creative/design.md +0 -238
- package/yida-skills/skills/yida-design/templates/design-themes/free-creative/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/graphite-bevel-grid/app_theme.css +0 -692
- package/yida-skills/skills/yida-design/templates/design-themes/graphite-bevel-grid/design.md +0 -375
- package/yida-skills/skills/yida-design/templates/design-themes/graphite-bevel-grid/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-shared-bands/app_theme.css +0 -691
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-shared-bands/design.md +0 -362
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-shared-bands/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-soft-blocks/app_theme.css +0 -691
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-soft-blocks/design.md +0 -409
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-soft-blocks/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/index.json +0 -464
- package/yida-skills/skills/yida-design/templates/design-themes/ink-glow-soft-panels/app_theme.css +0 -701
- package/yida-skills/skills/yida-design/templates/design-themes/ink-glow-soft-panels/design.md +0 -379
- package/yida-skills/skills/yida-design/templates/design-themes/ink-glow-soft-panels/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/inset-frame-pixel-rhythm/app_theme.css +0 -691
- package/yida-skills/skills/yida-design/templates/design-themes/inset-frame-pixel-rhythm/design.md +0 -404
- package/yida-skills/skills/yida-design/templates/design-themes/inset-frame-pixel-rhythm/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/outlined-texture-duotone/app_theme.css +0 -698
- package/yida-skills/skills/yida-design/templates/design-themes/outlined-texture-duotone/design.md +0 -389
- package/yida-skills/skills/yida-design/templates/design-themes/outlined-texture-duotone/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/soft-inset-surfaces/app_theme.css +0 -691
- package/yida-skills/skills/yida-design/templates/design-themes/soft-inset-surfaces/design.md +0 -372
- package/yida-skills/skills/yida-design/templates/design-themes/soft-inset-surfaces/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/soft-outline-rhythm/app_theme.css +0 -690
- package/yida-skills/skills/yida-design/templates/design-themes/soft-outline-rhythm/design.md +0 -455
- package/yida-skills/skills/yida-design/templates/design-themes/soft-outline-rhythm/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/soft-rail-bold-band/app_theme.css +0 -698
- package/yida-skills/skills/yida-design/templates/design-themes/soft-rail-bold-band/design.md +0 -394
- package/yida-skills/skills/yida-design/templates/design-themes/soft-rail-bold-band/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/soft-spectral-panels/app_theme.css +0 -692
- package/yida-skills/skills/yida-design/templates/design-themes/soft-spectral-panels/design.md +0 -391
- package/yida-skills/skills/yida-design/templates/design-themes/soft-spectral-panels/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/warm-canvas-contrast-panels/app_theme.css +0 -711
- package/yida-skills/skills/yida-design/templates/design-themes/warm-canvas-contrast-panels/design.md +0 -408
- package/yida-skills/skills/yida-design/templates/design-themes/warm-canvas-contrast-panels/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/warm-rail-muted-panels/app_theme.css +0 -692
- package/yida-skills/skills/yida-design/templates/design-themes/warm-rail-muted-panels/design.md +0 -383
- package/yida-skills/skills/yida-design/templates/design-themes/warm-rail-muted-panels/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/navigation-styles.json +0 -769
- package/yida-skills/skills/yida-requirement-analysis/references/experience-groups.md +0 -79
- package/yida-skills/skills/yida-requirement-analysis/references/handoff.md +0 -68
package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/scripts/render_build_plan.py
CHANGED
|
@@ -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'<
|
|
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 = ""
|
|
880
|
-
|
|
881
|
-
|
|
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
|
-
("
|
|
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 ""
|
|
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
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
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
|
|
package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/scripts/validate_design_themes.py
ADDED
|
@@ -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())
|
package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/README.md
ADDED
|
@@ -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 或主题名称。
|