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