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
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""Validate the shared V2 theme catalog and design.md templates (Python 3.9+)."""
|
|
3
|
-
|
|
4
|
-
from __future__ import annotations
|
|
5
|
-
|
|
6
|
-
import argparse
|
|
7
|
-
import json
|
|
8
|
-
import re
|
|
9
|
-
import sys
|
|
10
|
-
from pathlib import Path
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
REQUIRED_HEADINGS = (
|
|
14
|
-
"1. 风格摘要",
|
|
15
|
-
"2. 页面视觉系统",
|
|
16
|
-
"3. 基础组件表达",
|
|
17
|
-
"4. 特色表达配方",
|
|
18
|
-
"5. 项目应用与调整规则",
|
|
19
|
-
)
|
|
20
|
-
REQUIRED_PLACEHOLDERS = {"PROJECT_NAME", "PRIMARY_COLOR", "COLOR_SOURCE", "PAGE_APPLICATIONS"}
|
|
21
|
-
CANDIDATE_RULE_FILES = (
|
|
22
|
-
"../yida-app/workflow/plan/step-2-confirm.md",
|
|
23
|
-
"sub_skill/yida-design-plan/references/visual-theme-selection.md",
|
|
24
|
-
"sub_skill/yida-design-plan/references/build-plan-schema.md",
|
|
25
|
-
)
|
|
26
|
-
TOKEN_NAME = re.compile(r"--[a-z][a-zA-Z0-9-]*\Z")
|
|
27
|
-
TOKEN_REFERENCE = re.compile(r"--[a-z][a-zA-Z0-9-]*")
|
|
28
|
-
TOKEN_SUFFIX_SHORTHAND = re.compile(r"--[a-z0-9-]+/(?!\s*--)")
|
|
29
|
-
TOKEN_WILDCARD = re.compile(r"--[a-z0-9-]*\*")
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def parse_scalar(raw: str) -> str | dict:
|
|
33
|
-
"""Read the template's YAML mapping subset without a PyYAML dependency.
|
|
34
|
-
|
|
35
|
-
Quoted strings, plain CSS scalars and empty maps are supported; sequences,
|
|
36
|
-
aliases, tags and block strings are rejected instead of silently ignored.
|
|
37
|
-
"""
|
|
38
|
-
if raw.startswith('"'):
|
|
39
|
-
value, end = json.JSONDecoder().raw_decode(raw)
|
|
40
|
-
if raw[end:].strip() and not raw[end:].lstrip().startswith("#"):
|
|
41
|
-
raise ValueError("字符串后含无效内容")
|
|
42
|
-
return value
|
|
43
|
-
if raw.startswith("'"):
|
|
44
|
-
match = re.fullmatch(r"'((?:[^']|'')*)'\s*(?:#.*)?", raw)
|
|
45
|
-
if not match:
|
|
46
|
-
raise ValueError("单引号字符串未闭合")
|
|
47
|
-
return match.group(1).replace("''", "'")
|
|
48
|
-
value = re.split(r"\s+#", raw, maxsplit=1)[0].strip()
|
|
49
|
-
if value == "{}":
|
|
50
|
-
return {}
|
|
51
|
-
if not value or value[0] in "[{&*!|>" or value in ("null", "~", "true", "false"):
|
|
52
|
-
raise ValueError("仅支持映射和非空 CSS 标量")
|
|
53
|
-
return value
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def parse_frontmatter(text: str) -> dict:
|
|
57
|
-
match = re.match(r"\A---\n([\s\S]*?)\n---(?:\n|$)", text)
|
|
58
|
-
if not match:
|
|
59
|
-
raise ValueError("缺少合法 YAML frontmatter")
|
|
60
|
-
root: dict = {}
|
|
61
|
-
stack = [(-2, root)]
|
|
62
|
-
for number, line in enumerate(match.group(1).splitlines(), start=2):
|
|
63
|
-
if not line.strip() or line.lstrip().startswith("#"):
|
|
64
|
-
continue
|
|
65
|
-
item = re.fullmatch(r'([ ]*)("[^"\n]+"|\'[^\'\n]+\'|[a-zA-Z_][\w-]*):(?:\s+(.*))?', line)
|
|
66
|
-
if not item:
|
|
67
|
-
raise ValueError(f"第 {number} 行不是受支持的 YAML 映射")
|
|
68
|
-
indent = len(item.group(1))
|
|
69
|
-
key = item.group(2).strip('"\'')
|
|
70
|
-
raw = (item.group(3) or "").strip()
|
|
71
|
-
while stack[-1][0] >= indent:
|
|
72
|
-
stack.pop()
|
|
73
|
-
parent_indent, parent = stack[-1]
|
|
74
|
-
if indent != parent_indent + 2:
|
|
75
|
-
raise ValueError(f"第 {number} 行缩进应逐级增加两个空格")
|
|
76
|
-
if key in parent:
|
|
77
|
-
raise ValueError(f"第 {number} 行重复定义 {key}")
|
|
78
|
-
value = {} if not raw or raw.startswith("#") else parse_scalar(raw)
|
|
79
|
-
parent[key] = value
|
|
80
|
-
if isinstance(value, dict):
|
|
81
|
-
stack.append((indent, value))
|
|
82
|
-
return root
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def collect_tokens(node: object, label: str, errors: list[str]) -> dict[str, str]:
|
|
86
|
-
tokens: dict[str, str] = {}
|
|
87
|
-
if not isinstance(node, dict):
|
|
88
|
-
errors.append(f"{label} 必须是映射")
|
|
89
|
-
return tokens
|
|
90
|
-
for key, value in node.items():
|
|
91
|
-
if key.startswith("--"):
|
|
92
|
-
if not TOKEN_NAME.fullmatch(key) or not isinstance(value, str) or not value:
|
|
93
|
-
errors.append(f"{label} 含无效 Token 声明:{key}")
|
|
94
|
-
continue
|
|
95
|
-
nested = {key: value}
|
|
96
|
-
elif isinstance(value, dict):
|
|
97
|
-
nested = collect_tokens(value, f"{label}.{key}", errors)
|
|
98
|
-
else:
|
|
99
|
-
errors.append(f"{label} 标量必须使用完整 CSS 变量名:{key}")
|
|
100
|
-
continue
|
|
101
|
-
for name, token_value in nested.items():
|
|
102
|
-
if name in tokens:
|
|
103
|
-
errors.append(f"{label} 重复定义变量:{name}")
|
|
104
|
-
tokens[name] = token_value
|
|
105
|
-
return tokens
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
def validate_tokens(frontmatter: dict, text: str, label: str, contract: dict, errors: list[str]) -> None:
|
|
109
|
-
groups = contract["groups"]
|
|
110
|
-
basic_tokens = {name for names in groups.values() for name in names}
|
|
111
|
-
tokens = frontmatter.get("tokens")
|
|
112
|
-
if not isinstance(tokens, dict) or set(tokens) != {"application-global", "custom-page"}:
|
|
113
|
-
errors.append(f"{label} tokens 必须包含 application-global 和 custom-page 两层")
|
|
114
|
-
return
|
|
115
|
-
global_tokens = collect_tokens(tokens["application-global"], f"{label} application-global", errors)
|
|
116
|
-
custom_tokens = collect_tokens(tokens["custom-page"], f"{label} custom-page", errors)
|
|
117
|
-
missing = sorted(basic_tokens - set(global_tokens))
|
|
118
|
-
if missing:
|
|
119
|
-
errors.append(f"{label} 全局变量集合缺少基础变量:{missing}")
|
|
120
|
-
overlap = set(global_tokens) & set(custom_tokens)
|
|
121
|
-
if overlap:
|
|
122
|
-
errors.append(f"{label} 页面层重复定义全局变量:{', '.join(sorted(overlap))}")
|
|
123
|
-
for name, value in contract["fixedValues"].items():
|
|
124
|
-
if name in global_tokens and global_tokens[name] != str(value):
|
|
125
|
-
errors.append(f"{label} {name} 应使用固定值 {value}")
|
|
126
|
-
if global_tokens.get("--color-brand1-6") != "{{PRIMARY_COLOR}}":
|
|
127
|
-
errors.append(f"{label} --color-brand1-6 必须使用项目主色占位符")
|
|
128
|
-
if "--oyd-page-bg" in custom_tokens and custom_tokens["--oyd-page-bg"] != "var(--pod-page-bg-color)":
|
|
129
|
-
errors.append(f"{label} --oyd-page-bg 必须单向继承 --pod-page-bg-color")
|
|
130
|
-
|
|
131
|
-
declared = {**global_tokens, **custom_tokens}
|
|
132
|
-
unsupported = set(declared) & {"--color-brand1-4", "--color-brand1-7", "--color-brand1-8"}
|
|
133
|
-
if unsupported:
|
|
134
|
-
errors.append(f"{label} 不支持的品牌色阶:{', '.join(sorted(unsupported))}")
|
|
135
|
-
unknown = set(TOKEN_REFERENCE.findall(text)) - set(declared)
|
|
136
|
-
if unknown:
|
|
137
|
-
errors.append(f"{label} 引用了未声明变量:{', '.join(sorted(unknown))}")
|
|
138
|
-
dependencies = {name: set(TOKEN_REFERENCE.findall(value)) for name, value in declared.items()}
|
|
139
|
-
visited: set[str] = set()
|
|
140
|
-
active: set[str] = set()
|
|
141
|
-
|
|
142
|
-
def visit(name: str) -> None:
|
|
143
|
-
if name in active:
|
|
144
|
-
errors.append(f"{label} 变量循环引用:{name}")
|
|
145
|
-
return
|
|
146
|
-
if name in visited or name not in dependencies:
|
|
147
|
-
return
|
|
148
|
-
active.add(name)
|
|
149
|
-
for dependency in dependencies[name]:
|
|
150
|
-
visit(dependency)
|
|
151
|
-
active.remove(name)
|
|
152
|
-
visited.add(name)
|
|
153
|
-
|
|
154
|
-
for name in declared:
|
|
155
|
-
visit(name)
|
|
156
|
-
for name in global_tokens:
|
|
157
|
-
if name.startswith("--color-brand1-") and name != "--color-brand1-6" and "--color-brand1-6" not in dependencies[name]:
|
|
158
|
-
errors.append(f"{label} {name} 必须与 --color-brand1-6 同源")
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
def validate(skill_root: Path) -> list[str]:
|
|
162
|
-
errors: list[str] = []
|
|
163
|
-
template_dir = skill_root / "templates" / "design-themes"
|
|
164
|
-
try:
|
|
165
|
-
index = json.loads((template_dir / "index.json").read_text(encoding="utf-8"))
|
|
166
|
-
if not isinstance(index, dict) or index.get("schemaVersion") != "2.0":
|
|
167
|
-
return ["主题索引 schemaVersion 必须为 2.0"]
|
|
168
|
-
themes = index.get("themes")
|
|
169
|
-
if not isinstance(themes, list) or not themes:
|
|
170
|
-
return ["主题索引缺少非空 themes 数组"]
|
|
171
|
-
contract = json.loads((template_dir / "basic-tokens.json").read_text(encoding="utf-8"))
|
|
172
|
-
names = [name for group in contract["groups"].values() for name in group]
|
|
173
|
-
if len(set(names)) != len(names) or not all(isinstance(name, str) and TOKEN_NAME.fullmatch(name) for name in names):
|
|
174
|
-
return ["基础变量契约含重复或非法变量名"]
|
|
175
|
-
if not isinstance(contract["fixedValues"], dict) or set(contract["fixedValues"]) - set(names):
|
|
176
|
-
return ["基础变量契约 fixedValues 必须引用已登记变量"]
|
|
177
|
-
except (OSError, ValueError, KeyError, TypeError, AttributeError) as exc:
|
|
178
|
-
return [f"无法读取主题索引或基础变量契约:{exc}"]
|
|
179
|
-
|
|
180
|
-
seen = {field: set() for field in ("themeId", "label", "templatePath")}
|
|
181
|
-
for position, theme in enumerate(themes):
|
|
182
|
-
label = f"themes[{position}]"
|
|
183
|
-
if not isinstance(theme, dict):
|
|
184
|
-
errors.append(f"{label} 必须是对象")
|
|
185
|
-
continue
|
|
186
|
-
for field in (*seen, "styleSummary"):
|
|
187
|
-
value = theme.get(field)
|
|
188
|
-
if not isinstance(value, str) or not value.strip():
|
|
189
|
-
errors.append(f"{label} 缺少非空字符串 {field}")
|
|
190
|
-
elif field in seen:
|
|
191
|
-
if value in seen[field]:
|
|
192
|
-
errors.append(f"重复 {field}: {value}")
|
|
193
|
-
seen[field].add(value)
|
|
194
|
-
theme_id = theme.get("themeId")
|
|
195
|
-
template_path = theme.get("templatePath")
|
|
196
|
-
mode = theme.get("mode")
|
|
197
|
-
if mode == "creative":
|
|
198
|
-
if "contentTone" in theme or "navTheme" in theme:
|
|
199
|
-
errors.append(f"{label} 自由创意不能预设 contentTone 或 navTheme")
|
|
200
|
-
else:
|
|
201
|
-
if theme.get("contentTone") not in {"light", "dark"}:
|
|
202
|
-
errors.append(f"{label} contentTone 必须是 light 或 dark")
|
|
203
|
-
if theme.get("navTheme") not in {"light", "dark"}:
|
|
204
|
-
errors.append(f"{label} navTheme 必须是 light 或 dark")
|
|
205
|
-
if not isinstance(theme.get("navigationSummary"), str) or not theme["navigationSummary"].strip():
|
|
206
|
-
errors.append(f"{label} navigationSummary 必须说明导航与应用整体风格的关系")
|
|
207
|
-
if not isinstance(theme_id, str) or not re.fullmatch(r"[a-z][a-z0-9]*(?:-[a-z0-9]+)*", theme_id):
|
|
208
|
-
errors.append(f"{label} themeId 格式非法")
|
|
209
|
-
continue
|
|
210
|
-
if template_path != f"templates/design-themes/{theme_id}/design.md":
|
|
211
|
-
errors.append(f"{label} templatePath 必须指向公共主题目录中的同名模板")
|
|
212
|
-
continue
|
|
213
|
-
full_path = (skill_root / template_path).resolve()
|
|
214
|
-
if full_path.parent != (template_dir / theme_id).resolve():
|
|
215
|
-
errors.append(f"{label} templatePath 不得越出公共主题目录")
|
|
216
|
-
continue
|
|
217
|
-
if theme.get("mode") not in ("template", "creative"):
|
|
218
|
-
errors.append(f"{label} mode 必须是 template 或 creative")
|
|
219
|
-
for field, filename in (("cssTemplatePath", "app_theme.css"), ("formLayoutPath", "form-layout.json")):
|
|
220
|
-
expected = f"templates/design-themes/{theme_id}/{filename}"
|
|
221
|
-
if theme.get(field) != expected or not (skill_root / expected).is_file():
|
|
222
|
-
errors.append(f"{label} 缺少配对资产 {field}: {expected}")
|
|
223
|
-
if full_path.parent.is_dir() and {p.name for p in full_path.parent.iterdir()} != {"design.md", "app_theme.css", "form-layout.json"}:
|
|
224
|
-
errors.append(f"{label} 主题目录必须只包含 design.md、app_theme.css、form-layout.json 三个文件")
|
|
225
|
-
try:
|
|
226
|
-
css = (full_path.parent / "app_theme.css").read_text(encoding="utf-8")
|
|
227
|
-
for name, pattern in (("--color-brand1-6", r"\{\{PRIMARY_COLOR\}\}"), ("--color-brand1-1", r"<生成实际色值:--color-brand1-6 [^;\n]+>")):
|
|
228
|
-
if not re.search(r"^\s*" + re.escape(name) + r":\s*" + pattern + r";", css, re.M):
|
|
229
|
-
errors.append(f"{label} app_theme.css {name} 必须保留项目颜色占位")
|
|
230
|
-
layout = json.loads((full_path.parent / "form-layout.json").read_text(encoding="utf-8"))
|
|
231
|
-
if not isinstance(layout, list) or not layout:
|
|
232
|
-
errors.append(f"{label} form-layout.json 必须是非空组件数组")
|
|
233
|
-
except (OSError, ValueError) as exc:
|
|
234
|
-
errors.append(f"{label} 主题配对资产不可读:{exc}")
|
|
235
|
-
try:
|
|
236
|
-
text = full_path.read_text(encoding="utf-8")
|
|
237
|
-
frontmatter = parse_frontmatter(text)
|
|
238
|
-
except (OSError, ValueError) as exc:
|
|
239
|
-
errors.append(f"{template_path}: {exc}")
|
|
240
|
-
continue
|
|
241
|
-
if frontmatter.get("themeId") != theme_id:
|
|
242
|
-
errors.append(f"{template_path} 的 themeId 与索引不一致")
|
|
243
|
-
if theme.get("mode") != "creative":
|
|
244
|
-
nav_theme = frontmatter.get("themeProfile", {}).get("navTheme", frontmatter.get("navTheme"))
|
|
245
|
-
if nav_theme not in {"light", "dark"}:
|
|
246
|
-
errors.append(f"{template_path} 的 navTheme 必须是 light 或 dark")
|
|
247
|
-
style_summary = theme.get("styleSummary", "")
|
|
248
|
-
nav_match = re.search(r"(深色|浅色)导航", style_summary)
|
|
249
|
-
content_match = re.search(r"(深色|浅色)内容界面", style_summary)
|
|
250
|
-
if not nav_match or not content_match:
|
|
251
|
-
errors.append(f"{label} styleSummary 必须用自然语言说明深色或浅色导航,以及深色或浅色内容界面")
|
|
252
|
-
elif nav_theme in {"light", "dark"} and nav_match.group(1) != {"light": "浅色", "dark": "深色"}[nav_theme]:
|
|
253
|
-
errors.append(f"{label} styleSummary 的导航明暗与主题模板 navTheme 不一致")
|
|
254
|
-
if theme.get("navTheme") != nav_theme:
|
|
255
|
-
errors.append(f"{label} navTheme 与主题模板不一致")
|
|
256
|
-
validate_tokens(frontmatter, text, template_path, contract, errors)
|
|
257
|
-
headings = re.findall(r"^## (.+)$", text, re.M)
|
|
258
|
-
if headings != list(REQUIRED_HEADINGS):
|
|
259
|
-
errors.append(f"{template_path} 必须依次包含 V2 五个章节")
|
|
260
|
-
placeholders = set(re.findall(r"\{\{([A-Z0-9_]+)\}\}", text))
|
|
261
|
-
if placeholders != REQUIRED_PLACEHOLDERS:
|
|
262
|
-
errors.append(f"{template_path} 项目占位符不符合 V2 契约:缺少 {sorted(REQUIRED_PLACEHOLDERS - placeholders)},未知 {sorted(placeholders - REQUIRED_PLACEHOLDERS)}")
|
|
263
|
-
if TOKEN_SUFFIX_SHORTHAND.search(text) or TOKEN_WILDCARD.search(text):
|
|
264
|
-
errors.append(f"{template_path} 含未展开的 Token 后缀缩写或通配写法")
|
|
265
|
-
|
|
266
|
-
# Catalog paths use forward slashes on every OS, including nested theme bundles.
|
|
267
|
-
actual_files = {f"templates/design-themes/{p.relative_to(template_dir).as_posix()}" for p in template_dir.rglob("*.md") if p.name != "README.md"}
|
|
268
|
-
for name in sorted(actual_files - seen["templatePath"]):
|
|
269
|
-
errors.append(f"主题模板未登记到索引:{name}")
|
|
270
|
-
for name in sorted(seen["templatePath"] - actual_files):
|
|
271
|
-
errors.append(f"索引引用了不存在的主题模板:{name}")
|
|
272
|
-
for relative_path in CANDIDATE_RULE_FILES:
|
|
273
|
-
try:
|
|
274
|
-
rule_text = (skill_root / relative_path).read_text(encoding="utf-8")
|
|
275
|
-
except OSError as exc:
|
|
276
|
-
errors.append(f"无法读取候选规则 {relative_path}: {exc}")
|
|
277
|
-
continue
|
|
278
|
-
for field in ("themeId", "label"):
|
|
279
|
-
for value in seen[field] - {item.get(field) for item in themes if item.get("mode") == "creative"}:
|
|
280
|
-
if value in rule_text:
|
|
281
|
-
errors.append(f"{relative_path} 硬编码了主题 {field}:{value}")
|
|
282
|
-
return errors
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
def main() -> int:
|
|
286
|
-
# Keep redirected Windows output readable even with inherited cp1252.
|
|
287
|
-
sys.stdout.reconfigure(encoding="utf-8")
|
|
288
|
-
sys.stderr.reconfigure(encoding="utf-8")
|
|
289
|
-
parser = argparse.ArgumentParser(description=__doc__)
|
|
290
|
-
parser.add_argument("--skill-root", type=Path, default=Path(__file__).resolve().parents[1], help="shared yida-design skill root")
|
|
291
|
-
errors = validate(parser.parse_args().skill_root.resolve())
|
|
292
|
-
if errors:
|
|
293
|
-
print("主题模板校验失败:")
|
|
294
|
-
for error in errors:
|
|
295
|
-
print(f"- {error}")
|
|
296
|
-
return 1
|
|
297
|
-
print("主题索引与完整 design.md 模板校验通过。")
|
|
298
|
-
return 0
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
if __name__ == "__main__":
|
|
302
|
-
raise SystemExit(main())
|