openyida 2026.9.19 → 2026.9.21
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 +4 -4
- package/lib/app/application-style.js +69 -0
- package/lib/app/create-form/args.js +37 -12
- package/lib/app/create-form/batch.js +32 -5
- package/lib/app/create-form.js +94 -57
- package/lib/app/form-field-validator.js +0 -36
- package/lib/app/services/form-compiler.js +0 -2
- package/lib/app/theme-from-design.js +40 -14
- package/lib/app/update-app.js +63 -13
- package/lib/core/command-manifest.js +81 -25
- package/lib/core/locales/en.js +20 -3
- package/lib/core/locales/zh.js +20 -3
- package/lib/core/sample.js +36 -14
- package/lib/design/document.js +1 -0
- package/lib/design-plan/confirmation.js +13 -0
- package/lib/design-plan/design-plan.js +44 -2
- package/lib/design-plan/entry-navigation.js +10 -2
- package/lib/design-plan/init.js +16 -9
- package/lib/design-plan/materialize.js +85 -45
- package/lib/design-plan/normalize.js +13 -14
- package/lib/design-plan/parallel.js +62 -13
- package/lib/design-plan/patch.js +21 -7
- package/lib/design-plan/rebase.js +60 -0
- package/lib/design-plan/themes.js +16 -1
- package/lib/design-plan/validate.js +16 -1
- package/lib/design-plan/visual-policy.js +29 -4
- package/lib/samples/openyida-scaffold/canvas-form-drawer.canvas.jsx +3 -3
- package/lib/samples/openyida-scaffold/canvas-nav/mixed.jsx +6 -4
- package/lib/samples/openyida-scaffold/canvas-nav/shared.jsx +5 -5
- package/lib/samples/openyida-scaffold/canvas-nav/side.jsx +1 -2
- package/lib/samples/openyida-scaffold/canvas-nav/sidebar.jsx +1 -1
- package/lib/samples/openyida-scaffold/canvas-nav/top.jsx +5 -4
- package/package.json +1 -1
- package/yida-skills/SKILL.md +2 -2
- package/yida-skills/references/official-example-schema-patterns.md +1 -1
- package/yida-skills/references/yida-api.md +4 -0
- package/yida-skills/skills/yida-app/SKILL.md +15 -4
- package/yida-skills/skills/yida-app/references/entry-navigation.md +11 -9
- package/yida-skills/skills/yida-app/workflow/plan/step-4-deliver.md +1 -1
- package/yida-skills/skills/yida-app/workflow/plan/workflow.md +11 -4
- package/yida-skills/skills/yida-app/workflow/step-2-design.md +3 -3
- package/yida-skills/skills/yida-app/workflow/step-3-create-or-reuse-app.md +2 -2
- package/yida-skills/skills/yida-app/workflow/step-8-publish-navigation.md +3 -3
- package/yida-skills/skills/yida-app/workflow/step-9-output-finish.md +3 -2
- package/yida-skills/skills/yida-canvas-custom-page/SKILL.md +2 -2
- package/yida-skills/skills/yida-canvas-custom-page/references/canvas-style-implementation-guide.md +1 -1
- package/yida-skills/skills/yida-canvas-custom-page/references/canvas-theme-provider.md +1 -1
- package/yida-skills/skills/yida-canvas-custom-page/references/data-bridge-guide.md +140 -1
- package/yida-skills/skills/yida-canvas-custom-page/references/navigation-and-entry-guide.md +1 -1
- package/yida-skills/skills/yida-canvas-custom-page/scripts/canvas-theme-provider.template.jsx +1 -1
- package/yida-skills/skills/yida-canvas-data-binding/SKILL.md +7 -0
- package/yida-skills/skills/yida-create-form-page/SKILL.md +34 -43
- 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 +2 -2
- package/yida-skills/skills/yida-create-form-page/references/field-definition-guide.md +4 -16
- package/yida-skills/skills/yida-create-form-page/references/form-field-properties.md +14 -37
- package/yida-skills/skills/yida-design/SKILL.md +7 -5
- package/yida-skills/skills/yida-design/references/application-style-library.md +93 -0
- package/yida-skills/skills/yida-design/references/application-theme-consistency.md +48 -7
- package/yida-skills/skills/yida-design/references/ask-human-interaction-contract.md +1 -1
- package/yida-skills/skills/yida-design/references/native-form-styles.md +208 -0
- package/yida-skills/skills/yida-design/references/navigation-decision.md +6 -4
- package/yida-skills/skills/yida-design/references/theme/app-custom-theme-template.css +110 -1
- package/yida-skills/skills/yida-design/references/theme/application-style-recipes.css +58 -0
- package/yida-skills/skills/yida-design/references/theme-selection.md +12 -11
- package/yida-skills/skills/yida-design/references/visual-decision-engine.md +1 -1
- package/yida-skills/skills/yida-design/scripts/validate_design_themes.py +49 -6
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/SKILL.md +13 -3
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/build-plan-compact-schema.md +6 -2
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/build-plan-schema.md +5 -3
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/visual-design.md +3 -1
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/visual-theme-selection.md +22 -23
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/scripts/render_build_plan.py +2 -0
- package/yida-skills/skills/yida-design/templates/application-styles.json +398 -0
- package/yida-skills/skills/yida-design/templates/design-themes/README.md +15 -10
- package/yida-skills/skills/yida-design/templates/design-themes/app-amber/app_theme.css +748 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-amber/design.md +274 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-amber/form-layout.json +15 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-editorial/app_theme.css +748 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-editorial/design.md +274 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-editorial/form-layout.json +14 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-executive/app_theme.css +748 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-executive/design.md +274 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-executive/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-finance/app_theme.css +748 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-finance/design.md +274 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-finance/form-layout.json +14 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-glass/app_theme.css +748 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-glass/design.md +274 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-glass/form-layout.json +14 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-graphite/app_theme.css +748 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-graphite/design.md +274 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-graphite/form-layout.json +14 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-line/app_theme.css +748 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-line/design.md +274 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-line/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-neon/app_theme.css +748 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-neon/design.md +274 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-neon/form-layout.json +14 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-nordic/app_theme.css +754 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-nordic/design.md +279 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-nordic/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-paper/app_theme.css +748 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-paper/design.md +274 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-paper/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-platinum/app_theme.css +748 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-platinum/design.md +274 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-platinum/form-layout.json +14 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-plum/app_theme.css +748 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-plum/design.md +274 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-plum/form-layout.json +14 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-pop/app_theme.css +758 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-pop/design.md +281 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-pop/form-layout.json +14 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-sage/app_theme.css +748 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-sage/design.md +274 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-sage/form-layout.json +14 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-teal/app_theme.css +748 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-teal/design.md +274 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-teal/form-layout.json +14 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-terminal/app_theme.css +754 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-terminal/design.md +279 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-terminal/form-layout.json +14 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-ticket/app_theme.css +752 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-ticket/design.md +278 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-ticket/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-wire/app_theme.css +748 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-wire/design.md +274 -0
- package/yida-skills/skills/yida-design/templates/design-themes/app-wire/form-layout.json +14 -0
- package/yida-skills/skills/yida-design/templates/design-themes/basic-tokens.json +2 -1
- package/yida-skills/skills/yida-design/templates/design-themes/dark-inset-hairline/app_theme.css +690 -0
- package/yida-skills/skills/yida-design/templates/design-themes/{dark-inset-hairline.md → dark-inset-hairline/design.md} +107 -58
- package/yida-skills/skills/yida-design/templates/design-themes/dark-inset-hairline/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-fine-lines/app_theme.css +691 -0
- package/yida-skills/skills/yida-design/templates/design-themes/{dark-rail-fine-lines.md → dark-rail-fine-lines/design.md} +106 -50
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-fine-lines/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-signal-panels/app_theme.css +696 -0
- package/yida-skills/skills/yida-design/templates/design-themes/{dark-rail-signal-panels.md → dark-rail-signal-panels/design.md} +66 -12
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-signal-panels/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/free-creative/app_theme.css +689 -0
- package/yida-skills/skills/yida-design/templates/design-themes/free-creative/design.md +238 -0
- package/yida-skills/skills/yida-design/templates/design-themes/free-creative/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/graphite-bevel-grid/app_theme.css +692 -0
- package/yida-skills/skills/yida-design/templates/design-themes/{graphite-bevel-grid.md → graphite-bevel-grid/design.md} +64 -10
- package/yida-skills/skills/yida-design/templates/design-themes/graphite-bevel-grid/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-shared-bands/app_theme.css +691 -0
- package/yida-skills/skills/yida-design/templates/design-themes/{hairline-shared-bands.md → hairline-shared-bands/design.md} +66 -12
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-shared-bands/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-soft-blocks/app_theme.css +691 -0
- package/yida-skills/skills/yida-design/templates/design-themes/{hairline-soft-blocks.md → hairline-soft-blocks/design.md} +61 -9
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-soft-blocks/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/index.json +399 -31
- package/yida-skills/skills/yida-design/templates/design-themes/ink-glow-soft-panels/app_theme.css +701 -0
- package/yida-skills/skills/yida-design/templates/design-themes/{ink-glow-soft-panels.md → ink-glow-soft-panels/design.md} +62 -8
- package/yida-skills/skills/yida-design/templates/design-themes/ink-glow-soft-panels/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/inset-frame-pixel-rhythm/app_theme.css +691 -0
- package/yida-skills/skills/yida-design/templates/design-themes/{inset-frame-pixel-rhythm.md → inset-frame-pixel-rhythm/design.md} +63 -9
- package/yida-skills/skills/yida-design/templates/design-themes/inset-frame-pixel-rhythm/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/outlined-texture-duotone/app_theme.css +698 -0
- package/yida-skills/skills/yida-design/templates/design-themes/{outlined-texture-duotone.md → outlined-texture-duotone/design.md} +66 -12
- package/yida-skills/skills/yida-design/templates/design-themes/outlined-texture-duotone/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/soft-inset-surfaces/app_theme.css +691 -0
- package/yida-skills/skills/yida-design/templates/design-themes/{soft-inset-surfaces.md → soft-inset-surfaces/design.md} +63 -11
- package/yida-skills/skills/yida-design/templates/design-themes/soft-inset-surfaces/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/soft-outline-rhythm/app_theme.css +690 -0
- package/yida-skills/skills/yida-design/templates/design-themes/{soft-outline-rhythm.md → soft-outline-rhythm/design.md} +64 -26
- package/yida-skills/skills/yida-design/templates/design-themes/soft-outline-rhythm/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/soft-rail-bold-band/app_theme.css +698 -0
- package/yida-skills/skills/yida-design/templates/design-themes/{soft-rail-bold-band.md → soft-rail-bold-band/design.md} +103 -49
- package/yida-skills/skills/yida-design/templates/design-themes/soft-rail-bold-band/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/soft-spectral-panels/app_theme.css +692 -0
- package/yida-skills/skills/yida-design/templates/design-themes/{soft-spectral-panels.md → soft-spectral-panels/design.md} +67 -13
- package/yida-skills/skills/yida-design/templates/design-themes/soft-spectral-panels/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/warm-canvas-contrast-panels/app_theme.css +711 -0
- package/yida-skills/skills/yida-design/templates/design-themes/{warm-canvas-contrast-panels.md → warm-canvas-contrast-panels/design.md} +64 -10
- package/yida-skills/skills/yida-design/templates/design-themes/warm-canvas-contrast-panels/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/design-themes/warm-rail-muted-panels/app_theme.css +692 -0
- package/yida-skills/skills/yida-design/templates/design-themes/{warm-rail-muted-panels.md → warm-rail-muted-panels/design.md} +102 -50
- package/yida-skills/skills/yida-design/templates/design-themes/warm-rail-muted-panels/form-layout.json +13 -0
- package/yida-skills/skills/yida-design/templates/navigation-styles.json +769 -0
- package/yida-skills/skills/yida-design/workflow/output-design.md +9 -6
- package/yida-skills/skills/yida-design/workflow/step-2-theme-system.md +12 -4
- package/yida-skills/skills/yida-design/workflow/step-6-handoff.md +1 -1
- package/yida-skills/skills/yida-form-permission/SKILL.md +6 -0
- package/yida-skills/skills/yida-nav-shell/SKILL.md +1 -1
- package/yida-skills/skills/yida-nav-shell/references/nav-shell-patterns.md +6 -0
- package/yida-skills/skills/yida-page-config/SKILL.md +9 -0
- package/yida-skills/skills/yida-prd/SKILL.md +1 -0
- package/yida-skills/skills/yida-prd/workflow/output-prd.md +2 -2
- package/yida-skills/skills/yida-prd/workflow/step-2-information-architecture.md +1 -1
- package/yida-skills/skills/yida-requirement-analysis/references/experience-groups.md +45 -9
- package/yida-skills/skills/yida-requirement-analysis/references/handoff.md +5 -5
- package/yida-skills/skills/yida-requirement-analysis/workflow/prepare-brief.md +17 -4
- package/yida-skills/skills-index.json +2 -2
|
@@ -6,6 +6,8 @@ const { CliError } = require('../core/cli-error');
|
|
|
6
6
|
const { derivePageContent } = require('./normalize');
|
|
7
7
|
const { PLAN_SKILL_ROOT: ROOT, loadThemeIndex } = require('./themes');
|
|
8
8
|
const { concretePageText } = require('../design/page-content');
|
|
9
|
+
const { ENTRY_MODES } = require('./entry-navigation');
|
|
10
|
+
const { t } = require('../core/i18n');
|
|
9
11
|
|
|
10
12
|
const object = value => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
11
13
|
const filled = value => typeof value === 'string' && value.trim().length > 0;
|
|
@@ -74,8 +76,11 @@ function collectIssues(plan) {
|
|
|
74
76
|
const pages = plan.pages?.customPageDetails;
|
|
75
77
|
const recommendation = plan.execution?.entryRecommendation;
|
|
76
78
|
if (recommendation !== undefined && check(object(recommendation), 'execution.entryRecommendation', '填写访问态入口方案')) {
|
|
77
|
-
check(
|
|
79
|
+
check(ENTRY_MODES.includes(recommendation.mode), 'execution.entryRecommendation.mode', t('cli.design_plan_entry_mode_required'));
|
|
78
80
|
if (array(recommendation.entries, 'execution.entryRecommendation.entries', true)) {
|
|
81
|
+
if (recommendation.mode === 'backend-only') {
|
|
82
|
+
check(recommendation.entries.every(entry => entry?.role === 'management'), 'execution.entryRecommendation.entries', t('cli.design_plan_backend_only_roles'));
|
|
83
|
+
}
|
|
79
84
|
recommendation.entries.forEach((entry, index) => {
|
|
80
85
|
const p = `execution.entryRecommendation.entries[${index}]`;
|
|
81
86
|
strings(entry, p, ['key', 'name', 'defaultMenuKey']);
|
|
@@ -160,6 +165,16 @@ function collectIssues(plan) {
|
|
|
160
165
|
const selected = plan.visualStyle?.internal?.selectedTheme || user?.selectedTheme;
|
|
161
166
|
const themes = loadThemeIndex().themes;
|
|
162
167
|
check(themes.some(theme => theme.themeId === selected?.themeId), 'visualStyle.internal.selectedTheme.themeId', '使用主题索引中的 themeId');
|
|
168
|
+
if (themes.find(theme => theme.themeId === selected?.themeId)?.mode === 'creative') {
|
|
169
|
+
try {
|
|
170
|
+
require('../app/application-style').validateCreativeDirection(plan.visualStyle.creativeDirection, plan.visualStyle.tokens);
|
|
171
|
+
} catch (error) {
|
|
172
|
+
if (error.code !== 'APPLICATION_STYLE_CREATIVE_INCOMPLETE') {throw error;}
|
|
173
|
+
for (const field of error.details.missing) {
|
|
174
|
+
check(false, `visualStyle.${field.startsWith('--') ? 'tokens' : 'creativeDirection'}.${field}`, '填写独立设计决策');
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
163
178
|
}
|
|
164
179
|
return issues;
|
|
165
180
|
}
|
|
@@ -4,13 +4,38 @@ function getVisualDecisionPolicy() {
|
|
|
4
4
|
return {
|
|
5
5
|
reference: 'yida-skills/skills/yida-design/references/theme-selection.md#设计方向比较',
|
|
6
6
|
preserve: 'explicit_user_direction_brand_and_existing_app_theme',
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
applicationStyle: {
|
|
8
|
+
scope: ['navigation', 'application_shell', 'native_form', 'custom_page', 'record_detail'],
|
|
9
|
+
navigationTokens: 'tokens.application-global.appearance.navigation',
|
|
10
|
+
navigationRoles: ['surface', 'text', 'hover', 'selected', 'disabled', 'logo', 'group', 'search', 'popup', 'action', 'border', 'radius', 'shadow', 'density'],
|
|
11
|
+
navigationShape: {
|
|
12
|
+
reference: 'yida-skills/skills/yida-design/references/application-theme-consistency.md#导航形状与密度的案例经验',
|
|
13
|
+
inputs: ['radius', 'normal_hover_selected_borders', 'selected_shadow', 'item_height', 'padding', 'gap', 'shell_spacing'],
|
|
14
|
+
authoring: { fast: 'design.md tokens.application-global.appearance.navigation', plan: 'visualStyle.tokens' },
|
|
15
|
+
layout: 'preserve_business_navigation_type_independently_of_theme_appearance',
|
|
16
|
+
verification: ['native_data_management', 'custom_page', 'submission', 'record_detail', 'long_labels', 'collapsed_navigation'],
|
|
17
|
+
},
|
|
18
|
+
delivery: 'one_design_document_and_application_theme_css',
|
|
19
|
+
verification: 'read_back_app_settings_and_verify_rendered_navigation_form_custom_page_and_detail',
|
|
20
|
+
},
|
|
21
|
+
nativeFormLayout: {
|
|
22
|
+
model: 'component_based_native_form_layout',
|
|
23
|
+
regions: ['top', 'left', 'main', 'right', 'between_fields'],
|
|
24
|
+
components: ['tabs', 'button_groups', 'images', 'graphics', 'status_blocks', 'dividers', 'columns', 'fields'],
|
|
25
|
+
roles: ['navigation', 'action', 'visual_focus', 'feedback', 'hierarchy', 'rhythm', 'decoration', 'data_capture'],
|
|
26
|
+
rules: ['place_components_by_role', 'preserve_existing_component_tree', 'use_divider_for_business_groups'],
|
|
27
|
+
forbidden: ['generic_filler_copy', 'random_layout_rotation'],
|
|
28
|
+
},
|
|
29
|
+
creativeOption: { alwaysAvailable: true, themeId: 'free-creative', selectionRequired: false,
|
|
30
|
+
source: 'independent_business_reasoning_not_preset_matching',
|
|
31
|
+
authoringReference: 'yida-skills/skills/yida-design/references/application-style-library.md' },
|
|
32
|
+
comparison: { candidateCount: 3, baseline: 'first_instinct', alternatives: 2, distinctDimensions: 2,
|
|
33
|
+
dimensions: ['composition', 'typography', 'surface_hierarchy', 'color_relationships', 'navigation_shape_and_density'] },
|
|
9
34
|
selection: 'refine_and_choose_a_supported_alternative_within_business_constraints',
|
|
10
35
|
quality: ['task_efficiency', 'readability_and_contrast', 'consistent_spacing_and_alignment', 'coherent_visual_identity'],
|
|
11
|
-
execution: '
|
|
36
|
+
execution: 'one_shared_three_direction_generation_pass_for_fast_and_plan',
|
|
12
37
|
handoff: ['visualSelection.visualDirection.description', 'visualSelection.colorStrategy.usage'],
|
|
13
|
-
presentation: '
|
|
38
|
+
presentation: 'fast_selects_internally; plan_asks_user_when_no_explicit_visual_direction',
|
|
14
39
|
};
|
|
15
40
|
}
|
|
16
41
|
|
|
@@ -61,7 +61,7 @@ function buildYidaFormUrl(request, currentAppType) {
|
|
|
61
61
|
return '';
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
/**
|
|
64
|
+
/** 抽屉默认使用内容画布与正文文字,background 可为当前抽屉指定颜色、渐变或 CSS token。 */
|
|
65
65
|
function CanvasDrawer({
|
|
66
66
|
open, title, onClose, onOpenInNewWindow, extra, children,
|
|
67
67
|
contentMode = 'content',
|
|
@@ -138,7 +138,7 @@ function CanvasDrawer({
|
|
|
138
138
|
border: 0;
|
|
139
139
|
border-radius: 8px;
|
|
140
140
|
background: transparent;
|
|
141
|
-
color: var(--drawer-close-color, var(--pod-page-header-text-color, var(--color-text1-
|
|
141
|
+
color: var(--drawer-close-color, var(--pod-page-header-text-color, var(--color-text1-4, #1f2329)));
|
|
142
142
|
cursor: pointer;
|
|
143
143
|
}
|
|
144
144
|
.openyida-form-drawer .oy-drawer-action:hover {
|
|
@@ -215,7 +215,7 @@ function CanvasDrawer({
|
|
|
215
215
|
},
|
|
216
216
|
content: {
|
|
217
217
|
background,
|
|
218
|
-
color: 'var(--drawer-content-color, var(--color-text1-4, #1f2329))',
|
|
218
|
+
color: 'var(--drawer-content-color, var(--pod-page-header-text-color, var(--color-text1-4, #1f2329)))',
|
|
219
219
|
borderLeft: 'var(--drawer-border-width, 0px) var(--drawer-border-style, solid) var(--drawer-border-color, transparent)',
|
|
220
220
|
borderRadius: fullScreen ? 0 : 'var(--pod-drawer-border-radius, var(--pod-drawer-radius, var(--drawer-corner, 20px))) 0 0 var(--pod-drawer-border-radius, var(--pod-drawer-radius, var(--drawer-corner, 20px)))',
|
|
221
221
|
overflow: 'hidden',
|
|
@@ -4,12 +4,14 @@ function CanvasNav({ items = [], activeKey, onSelect, title, logo, actions, chil
|
|
|
4
4
|
return <div className="oy-canvas-nav oy-nav-mixed">
|
|
5
5
|
<style>{CANVAS_NAV_CSS + `
|
|
6
6
|
.oy-nav-mixed { display: flex; flex-direction: column; }
|
|
7
|
-
.oy-nav-mixed .oy-nav-header { display: flex; flex-wrap: wrap; align-items: center; gap: var(--pod-nav-l-header-gap, 24px); padding: var(--pod-nav-l-header-padding, 8px 16px); border-bottom: 1px solid var(--pod-nav-sub-divider-color, var(--color-line1-1, #ddd)); }
|
|
8
|
-
.oy-nav-mixed .oy-nav-groups { display: flex; flex: 1; min-width: 0; overflow-x: auto; }
|
|
7
|
+
.oy-nav-mixed .oy-nav-header { box-sizing: border-box; min-height: var(--pod-nav-platform-header-height, 48px); display: flex; flex-wrap: wrap; align-items: center; gap: var(--pod-nav-l-header-gap, 24px); padding: var(--pod-nav-l-header-padding, 8px 16px); border-bottom: 1px solid var(--pod-nav-sub-divider-color, var(--color-line1-1, #ddd)); }
|
|
8
|
+
.oy-nav-mixed .oy-nav-groups { display: flex; flex: 1; min-width: 0; gap: var(--pod-nav-menu-gap, 8px); padding: calc(var(--pod-nav-menu-gap, 8px) / 2); overflow-x: auto; }
|
|
9
|
+
.oy-nav-mixed .oy-nav-groups .oy-nav-item { min-height: var(--pod-nav-top-tab-height, 40px); padding: var(--pod-nav-top-tab-item-padding, 0 12px); max-width: var(--pod-nav-top-tab-item-max-width, 240px); }
|
|
10
|
+
.oy-nav-mixed .oy-nav-groups .oy-nav-item > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
9
11
|
.oy-nav-mixed .oy-nav-body { display: flex; flex: 1; }
|
|
12
|
+
.oy-canvas-nav.oy-nav-mixed .oy-nav-sidebar { padding: var(--pod-nav-l-aside-padding, 8px); }
|
|
10
13
|
.oy-nav-mixed .oy-nav-content { flex: 1; }
|
|
11
|
-
.oy-nav-mixed .oy-nav-menu { display: flex; flex-direction: column; gap: var(--pod-nav-
|
|
12
|
-
.oy-nav-mixed .oy-nav-item[aria-current="page"] { box-shadow: inset 0 -2px var(--pod-nav-tab-line-selected-color, var(--color-brand1-6, #1677ff)); }
|
|
14
|
+
.oy-nav-mixed .oy-nav-menu { display: flex; flex-direction: column; gap: var(--pod-nav-menu-gap, 8px); }
|
|
13
15
|
@media (max-width: 767px) {
|
|
14
16
|
.oy-nav-mixed .oy-nav-groups { flex-basis: 100%; }
|
|
15
17
|
.oy-nav-mixed .oy-nav-body { display: block; }
|
|
@@ -14,12 +14,12 @@ const CANVAS_NAV_CSS = `
|
|
|
14
14
|
.oy-canvas-nav .oy-nav-brand > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
15
15
|
.oy-canvas-nav .oy-nav-item {
|
|
16
16
|
box-sizing: border-box; display: flex; flex-shrink: 0; align-items: center; gap: var(--pod-nav-logo-gap, 8px);
|
|
17
|
-
min-height: var(--pod-nav-menu-item-height, 40px); padding: var(--pod-nav-
|
|
18
|
-
border:
|
|
19
|
-
color: var(--pod-nav-item-text-color, var(--color-text1-4, #1f2329)); font: inherit; font-size: var(--pod-nav-menu-font-size, 14px); text-decoration: none; text-align: start; cursor: pointer;
|
|
17
|
+
min-height: var(--pod-nav-menu-item-height, 40px); padding: var(--pod-nav-menu-item-padding, 8px 12px);
|
|
18
|
+
border: var(--pod-nav-menu-item-border, none); border-radius: var(--pod-nav-menu-item-radius, 8px); background: transparent;
|
|
19
|
+
color: var(--pod-nav-item-text-color, var(--color-text1-4, #1f2329)); font: inherit; font-size: var(--pod-nav-menu-font-size, 14px); line-height: var(--pod-nav-menu-line-height, 20px); text-decoration: none; text-align: start; cursor: pointer;
|
|
20
20
|
}
|
|
21
|
-
.oy-canvas-nav .oy-nav-item:hover:not(:disabled) { background: var(--pod-nav-menu-bg-hover-color, var(--color-fill1-2, #f2f3f5)); color: var(--pod-nav-item-text-hover-color, inherit); }
|
|
22
|
-
.oy-canvas-nav .oy-nav-item[aria-current="page"] { background: var(--pod-nav-menu-bg-selected-color, var(--color-brand1-1, #e8f2ff)); color: var(--pod-nav-item-text-selected-color, var(--color-brand1-6, #1677ff)); font-weight: var(--pod-nav-menu-item-selected-font-weight, 600); }
|
|
21
|
+
.oy-canvas-nav .oy-nav-item:hover:not(:disabled) { border: var(--pod-nav-menu-item-hover-border, var(--pod-nav-menu-item-border, none)); background: var(--pod-nav-menu-bg-hover-color, var(--color-fill1-2, #f2f3f5)); color: var(--pod-nav-item-text-hover-color, inherit); }
|
|
22
|
+
.oy-canvas-nav .oy-nav-item[aria-current="page"], .oy-canvas-nav .oy-nav-item[aria-current="page"]:hover { border: var(--pod-nav-menu-item-selected-border, var(--pod-nav-menu-item-border, none)); box-shadow: var(--pod-nav-menu-item-selected-shadow, none); background: var(--pod-nav-menu-bg-selected-color, var(--color-brand1-1, #e8f2ff)); color: var(--pod-nav-item-text-selected-color, var(--color-brand1-6, #1677ff)); font-weight: var(--pod-nav-menu-item-selected-font-weight, 600); }
|
|
23
23
|
.oy-canvas-nav .oy-nav-item:disabled { color: var(--pod-nav-item-text-disabled-color, var(--color-text1-1, #999)); cursor: not-allowed; }
|
|
24
24
|
.oy-canvas-nav .oy-nav-item:focus-visible { outline: 2px solid var(--pod-nav-tab-line-selected-color, var(--color-brand1-6, #1677ff)); outline-offset: -2px; }
|
|
25
25
|
.oy-canvas-nav .oy-nav-item svg { flex-shrink: 0; width: var(--pod-nav-platform-action-icon-size, 18px); height: var(--pod-nav-platform-action-icon-size, 18px); }
|
|
@@ -5,8 +5,7 @@ function CanvasNav({ items = [], activeKey, onSelect, title, logo, actions, chil
|
|
|
5
5
|
.oy-nav-side { display: flex; }
|
|
6
6
|
.oy-nav-side .oy-nav-content { flex: 1; }
|
|
7
7
|
.oy-nav-side .oy-nav-brand { min-height: var(--pod-nav-platform-header-height, 48px); }
|
|
8
|
-
.oy-nav-side .oy-nav-menu { display: flex; flex-direction: column; gap: var(--pod-nav-
|
|
9
|
-
.oy-nav-side .oy-nav-item[aria-current="page"] { box-shadow: inset 3px 0 var(--pod-nav-tab-line-selected-color, var(--color-brand1-6, #1677ff)); }
|
|
8
|
+
.oy-nav-side .oy-nav-menu { display: flex; flex-direction: column; gap: var(--pod-nav-menu-gap, 8px); }
|
|
10
9
|
@media (max-width: 767px) { .oy-nav-side { display: block; } }
|
|
11
10
|
`}</style>
|
|
12
11
|
<CanvasSidebar title={title} logo={logo} actions={actions} activeKey={activeKey} defaultWidth={sidebarWidth} defaultCollapsed={defaultCollapsed}>
|
|
@@ -41,7 +41,7 @@ function CanvasSidebar({ children, title, logo, actions, activeKey, defaultWidth
|
|
|
41
41
|
onClick={event => { if (mobile && event.target.closest('.oy-nav-menu .oy-nav-item')) setMobileOpen(false); }}
|
|
42
42
|
style={{ '--oy-sidebar-width': width === null ? (typeof defaultWidth === 'number' ? `${defaultWidth}px` : defaultWidth) : `${clamp(width)}px`, '--oy-sidebar-max-width': `${maxWidth}px` }}>
|
|
43
43
|
<style>{`
|
|
44
|
-
.oy-canvas-nav .oy-nav-sidebar { position: relative; box-sizing: border-box; flex: 0 0 auto; min-width: 0; width: clamp(180px, var(--oy-sidebar-width, var(--shell-dark-aside-width, 216px)), var(--oy-sidebar-max-width, 400px)); padding: var(--pod-nav-
|
|
44
|
+
.oy-canvas-nav .oy-nav-sidebar { position: relative; box-sizing: border-box; flex: 0 0 auto; min-width: 0; width: clamp(180px, var(--oy-sidebar-width, var(--shell-dark-aside-width, 216px)), var(--oy-sidebar-max-width, 400px)); padding: var(--pod-nav-slide-aside-padding, 8px); border-right: 1px solid var(--pod-nav-sub-divider-color, var(--color-line1-1, #ddd)); }
|
|
45
45
|
.oy-canvas-nav .oy-sidebar-toggle { margin-left: auto; flex-shrink: 0; justify-content: center; padding: 0 8px; }
|
|
46
46
|
.oy-canvas-nav .oy-sidebar-items { min-width: 0; }
|
|
47
47
|
.oy-canvas-nav .oy-nav-sidebar .oy-nav-item > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
@@ -7,16 +7,17 @@ function CanvasNav({ items = [], activeKey, onSelect, title, logo, actions, chil
|
|
|
7
7
|
React.useEffect(() => setExpanded(false), [activeKey]);
|
|
8
8
|
return <div className={'oy-canvas-nav oy-nav-top' + (floating ? ' is-floating' : '') + (headerOnly ? ' is-header-only' : '') + (overlay ? ' is-overlay' : '')}>
|
|
9
9
|
<style>{CANVAS_NAV_CSS + `
|
|
10
|
-
.oy-nav-top .oy-nav-header { display: flex; flex-wrap: wrap; align-items: center; gap: var(--pod-nav-top-header-gap, 24px); padding: var(--pod-nav-top-header-padding, 8px 16px); border-bottom: 1px solid var(--pod-nav-sub-divider-color, var(--color-line1-1, #ddd)); }
|
|
10
|
+
.oy-nav-top .oy-nav-header { box-sizing: border-box; min-height: var(--pod-nav-platform-header-height, 48px); display: flex; flex-wrap: wrap; align-items: center; gap: var(--pod-nav-top-header-gap, 24px); padding: var(--pod-nav-top-header-padding, 8px 16px); border-bottom: 1px solid var(--pod-nav-sub-divider-color, var(--color-line1-1, #ddd)); }
|
|
11
11
|
.oy-nav-top.is-header-only { min-height: 0; background: transparent; }
|
|
12
12
|
.openyida-nav-layout[data-layout="document"][data-scrolled="false"] .oy-nav-top.is-overlay .oy-nav-header:not(.is-expanded) { background: transparent; color: var(--openyida-navigation-overlay-color, #fff); border-color: transparent; }
|
|
13
13
|
.openyida-nav-layout[data-layout="document"][data-scrolled="false"] .oy-nav-top.is-overlay .oy-nav-header:not(.is-expanded) .oy-nav-brand,
|
|
14
14
|
.openyida-nav-layout[data-layout="document"][data-scrolled="false"] .oy-nav-top.is-overlay .oy-nav-header:not(.is-expanded) .oy-nav-item:not(:disabled) { color: inherit; }
|
|
15
15
|
.openyida-nav-layout[data-layout="document"][data-scrolled="false"] .oy-nav-top.is-overlay .oy-nav-header:not(.is-expanded) .oy-nav-item:is(:hover,[aria-current="page"]):not(:disabled) { background: var(--openyida-navigation-overlay-active-bg, rgba(255,255,255,.16)); }
|
|
16
16
|
.oy-nav-top.is-floating { padding-top: 16px; box-sizing: border-box; }
|
|
17
|
-
.oy-nav-top.is-floating .oy-nav-header { position: sticky; top: 16px; z-index: 10; margin: 0 16px; border: 1px solid var(--pod-nav-sub-divider-color, var(--color-line1-1, #ddd)); border-radius: var(--pod-
|
|
18
|
-
.oy-nav-top .oy-nav-menu { display: flex; flex: 1; min-width: 0; overflow-x: auto; }
|
|
19
|
-
.oy-nav-top .oy-nav-item
|
|
17
|
+
.oy-nav-top.is-floating .oy-nav-header { position: sticky; top: 16px; z-index: 10; margin: 0 16px; border: 1px solid var(--pod-nav-sub-divider-color, var(--color-line1-1, #ddd)); border-radius: var(--pod-shell-lshape-border-radius, 16px); box-shadow: var(--pod-nav-popup-shadow, 0 8px 24px rgba(0,0,0,.12)); }
|
|
18
|
+
.oy-nav-top .oy-nav-menu { display: flex; flex: 1; min-width: 0; gap: var(--pod-nav-menu-gap, 8px); padding: calc(var(--pod-nav-menu-gap, 8px) / 2); overflow-x: auto; }
|
|
19
|
+
.oy-nav-top .oy-nav-menu .oy-nav-item { min-height: var(--pod-nav-top-tab-height, 40px); padding: var(--pod-nav-top-tab-item-padding, 0 12px); max-width: var(--pod-nav-top-tab-item-max-width, 240px); }
|
|
20
|
+
.oy-nav-top .oy-nav-menu .oy-nav-item > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
20
21
|
.oy-nav-top .oy-nav-toggle { display: none; margin-left: auto; }
|
|
21
22
|
@media (max-width: 767px) {
|
|
22
23
|
.oy-nav-top .oy-nav-header { gap: var(--pod-nav-logo-gap, 8px); }
|
package/package.json
CHANGED
package/yida-skills/SKILL.md
CHANGED
|
@@ -195,9 +195,9 @@ description: >
|
|
|
195
195
|
- 不把 OpenYida 业务中间文件写到仓库根目录或系统临时目录。
|
|
196
196
|
|
|
197
197
|
20. **报表和可视化先分流**:标准统计与原生报表用 `yida-report`;定制图表页面默认用 `yida-rechart`;只有明确 ECharts、维护旧 ECharts 页面或复杂 option 超出 Recharts 能力时用 `yida-chart`。
|
|
198
|
-
21. **应用主题只有一份**:涉及应用蓝图、页面视觉、应用主题色、品牌色、全局换肤或 `--color-brand1-*` 时先读 `yida-design
|
|
198
|
+
21. **应用主题只有一份**:涉及应用蓝图、页面视觉、应用主题色、品牌色、全局换肤或 `--color-brand1-*` 时先读 `yida-design`。导航、应用框架、提交/编辑表单、记录详情和自定义页面按[整体主题规则](skills/yida-design/references/application-theme-consistency.md#导航与应用框架)一起设计。`app-theme.css` 只在应用级统一配置,各类页面消费同一份主题 token。严禁在页面级重复写入、同步或向上层注入主题样式;`YidaCodeCanvas` 源码只在 `YidaComp` 内消费现有主题 token。
|
|
199
199
|
22. **默认完成即停止**:完整应用默认以资源发布成功、轻量导航排序完成、示例数据就绪并输出一组有明确名称的应用入口与业务交付总结为 doneWhen;截图、精细导航整理和额外深读属于 optionalAfterDone,除非用户明确要求。
|
|
200
|
-
23. **说清楚做什么**:对话、任务列表、步骤标题、进度和提问面向非技术用户。用日常用语和短句,一句话说一件事,先说结果或动作,再补必要原因。功能写谁能做什么;进度写当前动作和下一步;失败写问题、影响和处理办法;待核实的结果如实说明。文件名、路径、技能名和调用方式留在内部执行。PRD 业务说明、HTML 和消息使用功能与体验描述;接口参数、配置键值及内部 ID 留在 Agent 实施交接,遵循[用户可见表达契约](skills/yida-design/references/ask-human-interaction-contract.md)。交付卡片的 `description` 写 2-3 句业务交付总结、核验结果与剩余事项,卡片包含一组“应用访问入口”;宿主没有交付工具时,在最终回复中给出相同内容。不得把需求信息文件、PRD、视觉设计、build manifest、资源清单、Schema
|
|
200
|
+
23. **说清楚做什么**:对话、任务列表、步骤标题、进度和提问面向非技术用户。用日常用语和短句,一句话说一件事,先说结果或动作,再补必要原因。功能写谁能做什么;进度写当前动作和下一步;失败写问题、影响和处理办法;待核实的结果如实说明。文件名、路径、技能名和调用方式留在内部执行。PRD 业务说明、HTML 和消息使用功能与体验描述;接口参数、配置键值及内部 ID 留在 Agent 实施交接,遵循[用户可见表达契约](skills/yida-design/references/ask-human-interaction-contract.md)。交付卡片的 `description` 写 2-3 句业务交付总结、核验结果与剩余事项,卡片包含一组“应用访问入口”;宿主没有交付工具时,在最终回复中给出相同内容。不得把需求信息文件、PRD、视觉设计、build manifest、资源清单、Schema 或每个表单/流程/报表分别登记成用户可见交付物;不分前后台或包含业务后台时,给出经验证的业务页面入口,前台页面经 PRD 标记为 `standalone` 且导航配置回读通过时给独立业务入口;完整应用默认再提供开发者管理后台 `adminUrl`,不因云端登录方式省略;明确仅业务后台时交付业务后台与开发者管理后台,不追加前台;明确仅前台时不追加业务后台,仍交付前台与开发者管理后台两个地址。有前后台时交付前台、业务后台、开发者管理后台三个地址;不分前后台时交付系统入口与开发者管理后台。用户明确排除的入口和单页任务范围优先。
|
|
201
201
|
24. **任务复盘沉淀**:用户多次纠正、平台接口假成功、页面骨架共性质量问题、线上回读验收方法、一次性脚本可产品化等情况,完成前判断是否需要沉淀到 CLI、测试或 skill。
|
|
202
202
|
|
|
203
203
|
常见问题见 [常见问题解决方案](references/execution-rules.md)。
|
|
@@ -86,7 +86,7 @@ GET https://template.aliwork.com/alibaba/web/{APP_TYPE}/query/formdesign/getSche
|
|
|
86
86
|
| 类型 | 高频组件 | 范式解释 |
|
|
87
87
|
| --- | --- | --- |
|
|
88
88
|
| 表单页 | `FormContainer`、`TextField`、`NumberField`、`DateField`、`EmployeeField`、`TableField`、`RichText` | 字段结构、公式和少量说明文本承载能力 |
|
|
89
|
-
| 自定义页 | `Div`、`Text`、`Image`、`Button`、`
|
|
89
|
+
| 自定义页 | `Div`、`Text`、`Image`、`Button`、`Dialog`、`TablePc`、`Pagination` | 列表、看板、工具页、弹窗和分页承载交互 |
|
|
90
90
|
| 报表页 | `YoushuPageHeader`、`YoushuTopFilterContainer`、`YoushuSelectFilter`、`YoushuTable`、`YoushuPieChart` | 原生报表负责筛选、聚合和图表 |
|
|
91
91
|
| 流程页 | `FormContainer` + 表单字段 | 表单只承载数据,审批节点由流程规则承载 |
|
|
92
92
|
|
|
@@ -192,6 +192,10 @@ this.utils.yida.saveFormData({
|
|
|
192
192
|
});
|
|
193
193
|
```
|
|
194
194
|
|
|
195
|
+
> ⚠️ **匿名态限制**:该 API 与 `window.__OPENYIDA_YIDA_API__.saveFormData` 依赖登录态。页面运行在公开链接 `/o/...`(`FREELOGIN` / `loginUser.userId === 'FREEUSER'`)时,即使桥对象存在,调用 `saveFormData` 仍会返回 `LOGIN FAILED`;必须优先改走 `window.pageConfig.RECEIPT_SAVE_FORM_DATA` 网关,并同时满足显示页 `isOpen === 'y'`、目标表单 `isOpen === 'y'`、目标表单 DEFAULT 权限包含 `FREE_LOGIN` 三项门禁。
|
|
196
|
+
>
|
|
197
|
+
> 匿名网关使用 `POST application/x-www-form-urlencoded` 和 `X-Requested-With: XMLHttpRequest`,CSRF 优先读取 `window.g_config._csrf_token` 并作为 `_csrf_token` 参数传递。`value` 必须是字段数组,每项使用 `{ componentName, fieldId, fieldData: { value } }`;`componentName` 从目标表单 Schema 获取,标准名称见[字段定义 JSON 指南](../skills/yida-create-form-page/references/field-definition-guide.md#支持的字段类型),`fieldData.value` 的值结构见[数据格式指南](../skills/yida-data-management/references/data-format-guide.md#常见字段值格式)。这些通用字段文档不代表对应组件均支持匿名提交;匿名能力边界以公开页面实际限制和实例回读为准。不得把字段 ID 放进 `fieldData`;网关返回 `success: true` 和 `formInstId` 仍可能创建空记录,验收必须按该实例 ID 回读代表性字段值。完整分流和请求契约见 [`yida-canvas-custom-page/references/data-bridge-guide.md`](../skills/yida-canvas-custom-page/references/data-bridge-guide.md) 的"公开访问(匿名态)提交"章节。
|
|
198
|
+
|
|
195
199
|
---
|
|
196
200
|
|
|
197
201
|
### updateFormData
|
|
@@ -7,15 +7,23 @@ description: 创建完整宜搭应用,或补齐已有应用时使用。先确
|
|
|
7
7
|
|
|
8
8
|
完整应用编排技能。它负责把一次“创建/搭建/补齐应用”的需求拆成资源解析、产品设计、资源落地、页面发布和结果输出。全局 CLI、ID、存储、发布和输出规则以主入口 `SKILL.md` 为准;按步骤执行该步骤所需 `use_skill(...)`。
|
|
9
9
|
|
|
10
|
-
完整应用交付默认保留开发者管理后台(CLI `adminUrl
|
|
10
|
+
完整应用交付默认保留开发者管理后台(CLI `adminUrl`),与业务后台区分:有前后台时共三个地址;仅前台、仅业务后台或不分前后台时共两个地址。登录态来源不影响 `/admin` 的交付;单页任务保持单页范围,用户明确排除的入口优先。详见 Step 9。
|
|
11
11
|
|
|
12
12
|
## 模式入口(先按这里路由)
|
|
13
13
|
|
|
14
14
|
首次需求澄清优先进入 Step 2 的 2.0;首问前不执行 Step 1 的环境和资源预检,已有明确资源引用作为需求上下文保留。澄清完成后再按需核验资源、补齐规划输入。
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
已有任务先按 [续做与恢复](#续做与恢复) 定位当前阶段。
|
|
17
17
|
|
|
18
|
-
Plan
|
|
18
|
+
需求确认不能替代当前 Plan revision 的批准或工具权限确认。`intake.designMode` 沿用用户最后一次明确选择,其他问题的回答只更新对应字段。Plan 收到与当前 revision 匹配的 `confirm_build` 后进入资源实施;选择 `continue_editing` 时修改当前计划,生成新 revision 后再确认。素材进度更新不改变已有的需求确认和模式选择。
|
|
19
|
+
|
|
20
|
+
Plan 规划阶段的工作流入口只读取 `workflow/step-1-resource-context.md`、`workflow/step-2-design.md` 和精确路径 `workflow/plan/workflow.md`;后者已经包含完整 Plan 入口。禁止用 Glob 查找 Plan 文件,也不要额外读取 `workflow/plan/step-1-understand.md` 或 `workflow/plan/step-2-confirm.md`。此读取范围不限制确认后的实施、验收和交付,各阶段按需读取对应 workflow。Plan 确认恢复后,若 `explicitScope.allowInferredResources=false`,直接读取 `workflow/step-4-forms-processes.md` 实施范围内资源,不再重读 Step 1、调用 list-forms 或做应用设置预检。
|
|
21
|
+
|
|
22
|
+
## 续做与恢复
|
|
23
|
+
|
|
24
|
+
先判断本轮是否已有有效需求确认:历史回答或同任务 `intake.confirmed=true` 覆盖当前范围且未被撤回时,复用答案、PRD、设计和资源回执,从未完成阶段继续。刷新、恢复、压缩或用户说“继续”不触发重新首问;仅应用已存在也不代表需求已确认。状态不明时先只读核对当前任务材料;范围变更、材料缺失或冲突按 [需求分析的适用阶段与续做](../yida-requirement-analysis/workflow/prepare-brief.md#适用阶段与续做) 处理。
|
|
25
|
+
|
|
26
|
+
已发布但尚未完成本轮导航、验收或交付时,按缺项进入 [Step 8](workflow/step-8-publish-navigation.md) 或 [Step 9](workflow/step-9-output-finish.md),不返回需求首问。发布成功回执不能替代实际验收。
|
|
19
27
|
|
|
20
28
|
## 执行步骤(进行时展示给用户)
|
|
21
29
|
|
|
@@ -86,7 +94,7 @@ Plan 模式只读取 `workflow/step-1-resource-context.md`、`workflow/step-2-de
|
|
|
86
94
|
|
|
87
95
|
1. **资源判断以 Step 1 为准**:已有 app/page/form/process 默认复用;只有用户明确从零创建,或目标缺失且本轮允许创建时,才创建缺失资源。
|
|
88
96
|
2. **显式目标优先**:本轮用户给出的 `appType`、`formUuid`、URL、页面名或流程标识,优先级高于绑定上下文和历史缓存;同级冲突或无法唯一识别时才问用户。
|
|
89
|
-
3. **产品与视觉分工**:`yida-requirement-analysis` 先统一整理用户需求;业务目标、资源蓝图、页面结构、导航顺序和验收标准由 `yida-prd` 写入 `prd.md
|
|
97
|
+
3. **产品与视觉分工**:`yida-requirement-analysis` 先统一整理用户需求;业务目标、资源蓝图、页面结构、导航顺序和验收标准由 `yida-prd` 写入 `prd.md`;`yida-design` 将导航、应用框架、表单、详情和自定义页面的主题 token、布局、材质、形状、密度与状态规则写入 `design.md`。两份文件校验通过前不得创建资源。
|
|
90
98
|
4. **阶段技能按需加载**:进入应用壳、表单、流程、页面、发布、数据写入等阶段时,才执行对应 `use_skill(...)`。
|
|
91
99
|
5. **真实 ID 和真实数据**:不编造 `appType`、`formUuid`、`fieldId`、`processCode`、`reportId`。无显式窄范围的完整应用默认给核心普通表单写入 1-3 条业务化 seed records 并 query 抽查;`explicitScope.allowInferredResources=false` 时不得增加未点名的 seed records 或页面。
|
|
92
100
|
6. **自定义页面开发技能固定**:完整应用页面源码按 Step 7 执行;管理端仅需原生视图时不创建 display 首页。前后台按 [访问态入口契约](references/entry-navigation.md) 分别规划菜单及分组顺序、默认页面、首屏任务和权限;平台导航与自定义导航都要落实排序并验收。
|
|
@@ -131,3 +139,6 @@ Plan 模式只读取 `workflow/step-1-resource-context.md`、`workflow/step-2-de
|
|
|
131
139
|
| [Step 8:发布页面并排序导航](workflow/step-8-publish-navigation.md) | publish、导航排序、发布完成证据 | 必读 |
|
|
132
140
|
| [Step 9:输出与收尾](workflow/step-9-output-finish.md) | final 口径、URL 规则、可选后置、错误处理 | 必读 |
|
|
133
141
|
| [常见问题解决思路](references/common-issues.md) | 资源冲突、字段 ID、seed records、页面数据、发布失败、输出口径等高频问题 | 遇到异常或执行结果不符合预期时 |
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
应用整体设计可使用[应用风格模板或自由创意](../yida-design/references/application-style-library.md)。导航、自定义页面、表单与详情继承同一设计语言;自由创意从业务推演,不强制选模板。模板中的表单布局 JSON 提供结构起点,使用时填入真实字段并核对间距和响应式。
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# 前台、管理端的菜单与权限
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本说明用于用户使用系统时的页面入口、菜单和权限规划。先按[判断是否分前后台](../../yida-requirement-analysis/references/experience-groups.md)确定“只有访问后台”“只有访问前台”“分前后台”或“不分前后台”。这里的前台和业务后台都是访问态页面;开发者修改应用配置的后台另行交付。
|
|
4
4
|
|
|
5
5
|
例如报修应用:访客使用“我要报修、我的报修”,管理者使用“待处理工单、全部工单”。两端共享报修数据,但菜单名称、数量、顺序和打开后首先显示的内容可以不同。管理端可直接打开待处理列表,无需另建首页,也不必把访客首页放进管理菜单。
|
|
6
6
|
|
|
7
7
|
## 先确定这四件事
|
|
8
8
|
|
|
9
|
-
1.
|
|
9
|
+
1. **谁来用**:哪些人使用同一套业务页面,哪些人需要分别进入前台和后台?多种角色也可以不分前后台,按职责配置菜单和权限。
|
|
10
10
|
2. **各自做什么**:逐项列出菜单任务,并按 [首页按任务选择](../../yida-requirement-analysis/references/experience-groups.md#首页按任务选择) 确定默认落点;管理端不自动使用驾驶舱。
|
|
11
11
|
3. **在哪里做**:访客端通常在一个自定义页面内完成任务;管理端按需要使用宜搭原生列表、表单或自定义页面。
|
|
12
12
|
4. **能看和能改哪些数据**:分别写清本人、本部门或其他明确范围,以及查看、提交、编辑等操作。
|
|
@@ -17,7 +17,7 @@ Fast(直接搭建)与 Plan(先确认方案)使用同一份入口规划
|
|
|
17
17
|
|
|
18
18
|
## 每个入口都确定首页与菜单顺序
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
无论是否分前后台,每个入口都要完成菜单排序。逐入口确定以下内容,写入已有 `menu`、`defaultMenuKey` 和需求依据,不新增另一份顺序清单:
|
|
21
21
|
|
|
22
22
|
- **默认打开什么**:依据该角色进入应用后的首要任务选择页面或业务视图;写清真实资源、视图与入口链接。用户已指定首页时沿用,不因页面名称、创建先后或是否为自定义页面改选。
|
|
23
23
|
- **菜单怎么排**:`menu[]` 及 `children[]` 的数组顺序就是展示顺序。按任务优先级、使用频率和业务流程组织;详情、填写、配置等是否成为顶级入口取决于实际用途,不把所有创建出的资源平铺进菜单。
|
|
@@ -61,7 +61,7 @@ Fast(直接搭建)与 Plan(先确认方案)使用同一份入口规划
|
|
|
61
61
|
|
|
62
62
|
### 整理管理菜单
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
有独立入口规划时,从业务后台或不分前后台的系统菜单生成平台导航顺序:默认任务在前,同一资源只排一次。访客菜单不自动加入。
|
|
65
65
|
|
|
66
66
|
- 已有 `navigationOrder` 与入口规划冲突时,先修正规划,再生成产物。
|
|
67
67
|
- 整个应用使用自定义导航或只交付前台时,仍按本入口的 `menu` 顺序和 `defaultMenuKey` 实现、发布并验收自定义导航;跳过的是平台排序命令。只改指定资源时保留无关入口的已有顺序。
|
|
@@ -110,7 +110,7 @@ Fast(直接搭建)与 Plan(先确认方案)使用同一份入口规划
|
|
|
110
110
|
|
|
111
111
|
分别用访客、业务管理者、同时拥有两种身份的用户检查:
|
|
112
112
|
|
|
113
|
-
-
|
|
113
|
+
- 从本轮交付的每个业务入口首次打开,核对默认页面、具体视图和首屏任务;菜单及分组顺序与规划一致。排序回读只证明资源顺序,不能替代实际首页验证。
|
|
114
114
|
- 同一表单的填写、本人记录、管理视图分别遵守对应权限。
|
|
115
115
|
- 无权限用户直接打开链接也不能访问;本人数据范围确实生效。
|
|
116
116
|
- 刷新、直接打开子页面、浏览器前进后退后,菜单与内容仍然一致。
|
|
@@ -127,9 +127,9 @@ Fast(直接搭建)与 Plan(先确认方案)使用同一份入口规划
|
|
|
127
127
|
|
|
128
128
|
| 字段 | 含义和要求 |
|
|
129
129
|
| --- | --- |
|
|
130
|
-
| `mode` | `unified
|
|
131
|
-
| `entries[]` |
|
|
132
|
-
| `role` | `service
|
|
130
|
+
| `mode` | `unified`:不分前后台;`service-management`:分前后台;`frontend-only`:只有访问前台;`backend-only`:只有访问后台。实施前必须选定,不能为 `undetermined`;旧 unified 计划保留原字段、值和角色,不自动改分类 |
|
|
131
|
+
| `entries[]` | backend-only 的每个入口 role 必须为 management;新建 unified 入口通常使用 workspace。每个入口填写 `key/name/role/menu/defaultMenuKey`;访客入口或包含 `local` 菜单的任意入口还需 `sceneKey` |
|
|
132
|
+
| `role` | `service`:前台使用者,如客户或报修员工,不表示匿名访问;`management`:业务处理人员;`workspace`:不分前后台时的使用者。实际数据和操作按权限配置 |
|
|
133
133
|
| `sceneKey` | 关联唯一承载页面的顶层 `sceneKey`;service 入口必须关联 `entryMode=standalone`;management/workspace 含 local 菜单时也必须填写 |
|
|
134
134
|
| `menu[]` | 数组及 children 的先后就是本入口展示顺序;分组用 `{key,label,children}`;可点击菜单用 `{key,label,resource,targetType,viewUuid?,viewKey?,access}` |
|
|
135
135
|
| `resource` | 规划中的资源名称;实施时创建或查询资源,换成真实 ID |
|
|
@@ -157,6 +157,8 @@ Fast(直接搭建)与 Plan(先确认方案)使用同一份入口规划
|
|
|
157
157
|
|
|
158
158
|
上述资源必须在计划中真实存在,页面需实现 `orders` 视图;其订单数据另列真实数据资源权限。管理端直接打开原生业务页面时使用 `page`,填写时使用 `submission`,这两种情况不要求为入口新增自定义承载页面。
|
|
159
159
|
|
|
160
|
+
`entryModeSummary` 是 CLI 根据 mode 生成的交接说明,供 PRD 和预览使用,不写入 build-plan.json。只有访问前台且提交后需要处理时,按需求分析记录的承接方式核验,不额外补建业务后台。
|
|
161
|
+
|
|
160
162
|
### 传入入口规划
|
|
161
163
|
|
|
162
164
|
可以通过需求 JSON、Plan JSON,或以下命令更新:
|
|
@@ -181,7 +183,7 @@ openyida update-form-config <appType> <formUuid> <true|false|keep> "<页面标
|
|
|
181
183
|
|
|
182
184
|
### 接入页面权限查询
|
|
183
185
|
|
|
184
|
-
页面函数的 `mode=local|platform|independent` 表示菜单过滤方式,与规划字段 mode
|
|
186
|
+
页面函数的 `mode=local|platform|independent` 表示菜单过滤方式,与规划字段 mode 的四种入口方案不同。
|
|
185
187
|
|
|
186
188
|
`resolveAccess({appType,requirements,signal})` 接收当前应用、权限要求和取消请求信号:
|
|
187
189
|
|
|
@@ -42,7 +42,7 @@ HTML 使用预置模板,保留需求总览、数据模型、业务流程、页
|
|
|
42
42
|
{"question":"请确认当前搭建方案","options":[{"label":"确认并开始搭建","value":"confirm_build"},{"label":"继续调整","value":"continue_editing"}],"submitLabel":"提交选择","attachments":[{"name":"build-plan.html","path":"<outputs.html>"}],"revision":"<revision>"}
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
优先将本次 materialize 或 patch --materialize 返回的 `confirmation` 对象原样传给 ask_human,它已经绑定同调用附件、revision 和固定选项。旧 CLI 没有该字段时,才按上例用实际 `<outputs.html>` 和 `<revision>` 填写,禁止另造值或省略 options/attachments/revision。确认前不创建业务资源。
|
|
46
46
|
|
|
47
47
|
3. 结构化交互成功创建后将 `meta.planState.presentedRevision=meta.revision` 写回源 JSON,仅保存展示事实,不重新物化。询问“确认并开始搭建”或“继续调整”,提交时由宿主原样回传 revision,将确认结果绑定到本次展示版本。用户可见标题、摘要、附件名称与确认问题统一使用“搭建方案”或“当前方案”,不展示修订序号。内部 revision、展示记录和确认失效机制照常维护。
|
|
48
48
|
|
|
@@ -25,16 +25,17 @@
|
|
|
25
25
|
## 执行顺序
|
|
26
26
|
|
|
27
27
|
1. 直接复用已确认的 `requirement-brief.json`;若尚未完成 Step 2 的规划准备,先按 [交接契约](../../../yida-requirement-analysis/references/handoff.md#规划阶段补齐) 补齐页面承载、导航与主题,AI 建议保留来源,不重新询问业务或导航;本文件已经包含规划入口,不再额外读取 `step-1-understand.md` 或 `step-2-confirm.md`。
|
|
28
|
-
2.
|
|
28
|
+
2. 用户未给出明确完整视觉风格时,先执行 [Plan 视觉分支](../../../yida-design/sub_skill/yida-design-plan/SKILL.md):按 Fast / Plan 共用规则生成恰好三套候选,并通过 `ask_human` 获得用户选择。不得因用户未主动要求比较而跳过。获得选择或已有明确完整风格后,再继续主题映射和初始化。
|
|
29
|
+
3. 主题映射未确定时,执行一次 `openyida design-plan catalog --json`,从返回的 `themes` 选择 themeId,并复用 `pagePatterns`。已有合法主题 ID 时直接初始化。初始化计划草稿,CLI 返回编写契约与当前主题的精简上下文:
|
|
29
30
|
|
|
30
31
|
```bash
|
|
31
32
|
openyida design-plan init .cache/openyida/<项目名>/requirement-brief.json --theme-id <已选主题> --json
|
|
32
33
|
```
|
|
33
34
|
`requirement-brief.json` 必须复用 `yida-requirement-analysis` 的输出结构,不要自行发明字段层级;`projectName` 位于 JSON 根级,`businessGoals` 等集合字段保持数组,命令第一次就传入 `visualSelection.themeId`。若 CLI 返回字段路径诊断,按 `expectedPath` 集中修正原文件后最多重试一次,不要通过反复更换项目名规避结构错误。
|
|
34
35
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
4. 按 init 返回的 `parallelTasks` 和 `dependsOn` 完成待补内容。CLI 预填业务骨架与已选主题;自定义页仍须补齐焦点、布局、主操作、响应式和验收,写入 `visual.json`。业务页面确定后完成视觉任务,可在同一轮中顺序填写两个文件。纯原生资源且两个片段均已就绪时,直接生成方案。
|
|
37
|
+
5. init 已创建并预填 `business.json` 骨架;读取该文件及 `context` 中的类型示例,按 `authoring.pendingFields` 的文件和字段路径补齐内容,保留 `base` 与已有事实。复核需求覆盖后,将已完成片段设为 `ready=true`。`business.json` 的 facts 填写 overview、dataModels、businessFlows、pages 和可选 execution;`visual.json` 的 facts 填写 visualStyle。同一次补齐所有普通表单的 sampleDataPlan(窄范围不造数时写 skipReason)及所有自定义页面的 permissionSummary,然后直接执行 init 返回的 `materialize.command`,只物化一次。标准首版禁止先试 `--from-preview`、`preview`、`--check` 或无参数 materialize;成功 JSON 已返回 HTML 路径和 revision,不再用 Glob、Read 或帮助命令检查产物。只有存在品牌稿、参考图、页面级特殊风格或用户明确要求精修时,才执行 `optionalTasks.visual-refinement` 后再物化。
|
|
38
|
+
6. 读取精确路径 `workflow/plan/step-4-deliver.md`,按其中契约直接展示并确认当前方案。超大需求需要展示中间进展或用户明确要求边生成边查看时,才使用 [按模块更新方案](../incremental-preview.md);普通首版不逐模块预览和重复渲染。
|
|
38
39
|
|
|
39
40
|
明确范围的方案以 `explicitScope` 作为完整执行清单。确认后的每个写操作都对应清单中的一个资源或交付项;清单资源全部回读且真实链接完成交付时,本轮达到完成态。
|
|
40
41
|
|
|
@@ -57,3 +58,9 @@ build-plan.json(业务和视觉的源事实)
|
|
|
57
58
|
草稿按已确定的模块更新,最终校验后统一保存三份文档和主题 CSS。后续业务或视觉调整按 [局部调整](step-4-deliver.md#4-处理调整) 更新并确认;素材进度同步沿用已有确认。
|
|
58
59
|
|
|
59
60
|
用户交互按 [可见表达契约](../../../yida-design/references/ask-human-interaction-contract.md) 执行。当前展示版本确认后,先按物化返回的 `assetTasks` 启动素材任务,再将 `prd.md`、`design.md` 和 `outputs.theme` 交给主流程 Step 3;搜索与创建应用同时推进。仅完整应用同步主题设置;`explicitScope.allowInferredResources=false` 时忽略主题和导航交接,只创建范围内资源并交付,不重复物化计划。
|
|
61
|
+
|
|
62
|
+
## 加载失败与内容修复
|
|
63
|
+
|
|
64
|
+
技能加载失败、限流或换模型后,先成功读取本工作流和当前步骤,再沿用已确认需求继续;未加载成功不得凭记忆生成 HTML 或确认参数。首次物化前只修 business.json/visual.json 对应 facts(菜单与执行规划在 business.facts.execution),不要直接修初始化主计划。字段错误按具体路径修正后重试。
|
|
65
|
+
|
|
66
|
+
如果已经改动主计划并出现 DESIGN_PLAN_STALE_PART,在原 materialize 命令增加 --rebase-parts。CLI 使用 init 保存的 .build-plan-base.json 做三方核对,保留已完成 facts;冲突按 details.conflicts 明确选择后重试。基线缺失或无法核实时告知阻塞并恢复可信文件,不手填 digest、不删除重建、不重新 init。已物化后调整走 patch --materialize,不继续复用初始化片段。
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
2. 按 [模式路由](../../yida-design/references/design-mode.md) 确定执行方式,沿用用户最后一次明确选择。
|
|
21
21
|
3. AI 根据有效功能、`userTasks` 与 `entryRecommendation`,按 [导航决策](../../yida-design/references/navigation-decision.md) 规划各入口的页面和菜单,补齐稳定 `pageScenes` 与主题映射。新增建议标记来源,范围遵守 explicitScope。
|
|
22
22
|
|
|
23
|
-
Fast / Plan 的主题与配色统一按[设计方向比较](../../yida-design/references/theme-selection.md#设计方向比较)在本轮规划中选定,结果写回 brief
|
|
23
|
+
Fast / Plan 的主题与配色统一按[设计方向比较](../../yida-design/references/theme-selection.md#设计方向比较)在本轮规划中选定,结果写回 brief,后续直接复用。两种模式使用同一组三方向生成规则:Fast 内部选一套;Plan 在用户未给出明确完整风格时,先由 `yida-design-plan` 生成恰好三套候选并调用 `ask_human`,获得选择后才能继续 Plan 初始化。
|
|
24
24
|
|
|
25
25
|
进入 2.1 前校验规划字段完整性和 `intake.designMode`。页面、导航、主题等建议随整体搭建方案展示。
|
|
26
26
|
|
|
@@ -48,7 +48,7 @@ Plan 分支从已加载 `yida-app` 的 Available Files 读取精确路径 `workf
|
|
|
48
48
|
| 内容 | 负责技能 | 输出 | 完成条件 |
|
|
49
49
|
| --- | --- | --- | --- |
|
|
50
50
|
| Product PRD | `yida-prd` | `prd/<项目名>/prd.md` | 资源蓝图、资源创建顺序、页面实现交付顺序、导航顺序、页面 handoff 和验收标准完整 |
|
|
51
|
-
| Visual Design | `yida-design` | `prd/<项目名>/design.md` |
|
|
51
|
+
| Visual Design | `yida-design` | `prd/<项目名>/design.md` | 导航、应用框架、表单、详情与自定义页面共用完整主题 token;布局、材质、形状、密度、组件、状态、响应式和页面场景引用完整 |
|
|
52
52
|
|
|
53
53
|
两个技能读取同一份已确认需求,业务规划与基础视觉同时准备;页面任务、区块和 sceneKey 确定后补齐逐页视觉绑定。各自维护职责内的文件。某一份生成失败时只重跑对应技能,不覆盖已经完成的另一份。
|
|
54
54
|
|
|
@@ -76,7 +76,7 @@ Fast 设计就绪后按 [素材调度](parallel-work.md#素材与页面同时推
|
|
|
76
76
|
|
|
77
77
|
## 主题文件实现指令
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
在设计中同时确定导航、应用框架、表单、详情与自定义页面的整体风格。命名模板提供完整导航 token 与派生的导航明暗,自由创意明确填写;布局沿用业务规划。未禁止 `theme-file` 时,Plan 使用 CLI 返回的 `outputs.theme`,Fast 按 [主题文件生成与更新](../../yida-design/workflow/output-design.md#cli-token-契约fast--plan-共用) 准备主题 CSS;用户确认计划或主题后即可启动 CSS 生成,不等待表单或页面开发。Plan 已生成当前版本的 CSS 时直接复用。拿到真实 appType 后,在应用级配置同一份主题文件,与表单创建和页面开发并行;页面组件按已确认契约消费主题 token。若 `theme-file` 被禁止,跳过生成、复制、修改和上传,沿用现有平台主题并在交付中说明未更改主题。详见 [主题与业务资源的依赖](parallel-work.md#主题与业务资源的依赖)。
|
|
80
80
|
|
|
81
81
|
## 产出
|
|
82
82
|
|
|
@@ -56,13 +56,13 @@
|
|
|
56
56
|
|
|
57
57
|
例如,仅将已有应用切换为平台顶部导航:`openyida update-app <appType> --layout top --show-app-nav`。联合更新主题时,将这两个参数合并到同一次 `update-app --theme-file` 调用。
|
|
58
58
|
|
|
59
|
-
Agent 必须显式传入场景选择对应的布局,不依赖 CLI 默认值。`navigationType=platform-top` 是计划内部标识,不能作为 `--layout` 的值;也不能用旧 Shell 的 `navType`、`hoz/ver/slide` 或 `top_fold/top_side/side_only` 代替上述参数。`navTheme`
|
|
59
|
+
Agent 必须显式传入场景选择对应的布局,不依赖 CLI 默认值。`navigationType=platform-top` 是计划内部标识,不能作为 `--layout` 的值;也不能用旧 Shell 的 `navType`、`hoz/ver/slide` 或 `top_fold/top_side/side_only` 代替上述参数。`navTheme` 选择导航明暗模式,完整导航 token 决定实际配色、边界、形状、文字和间距;圆角、三种状态边框和选中阴影先写入设计,再按 [命令与参数](../../yida-design/references/application-style-library.md#命令与参数) 重新生成 CSS 并上传;布局仍由 `--layout` 设置。自定义导航的 `variant=top/side/mixed/dock` 描述页面内菜单,不用于设置平台布局;自定义导航仍使用 `--hide-app-nav`。
|
|
60
60
|
|
|
61
61
|
`navType` 是兼容字段:CLI 查询应用后将已有值原样带回;缺失时不补造,也不根据新布局改写。没有 `--nav-type` 参数。未传 `--layout` 时,CLI 保留原布局:现代 `side/top/l_shape` 优先;旧 `hoz + top_side` 为 L 型,其他 `hoz` 为顶部,`ver` 为侧边;布局缺失时用 `navType=top_fold/top_side` 分别恢复顶部/L 型,其余回退侧边。
|
|
62
62
|
|
|
63
63
|
Shell 渲染阶段才把顶部、侧边、L 型转换为 `top_fold`、`side_only`、`top_side`。详情/提交页的 `top_fold` 强制顶部、`none` 保持无导航属于页面运行态规则,不能反向写入应用配置。
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
保存后读取 CLI 的 `navigationVerification`:`verified=true` 且其中本次请求的 `navTheme`、`layoutDirection`、`hideAppNav`、`logoSource` 与目标一致,表示导航设置回读通过。旧布局字段由 CLI 归一化后比较;缺少回读证据时保持未验证。CLI 最多重试三次只读查询,失败返回 `APP_NAVIGATION_NOT_PERSISTED`,按返回的期望值、实际值和查询错误核实应用设置。`updatedFields` 仍是提交值,`themeVerification` 仍只验证主题资源。发布后刷新应用,检查实际导航、内容布局与状态;设置回读通过与页面视觉验收分别记录。
|
|
66
66
|
|
|
67
67
|
## 产出
|
|
68
68
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
## 自定义导航分支
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
无论是否分前后台,自定义导航均按 [首页与菜单顺序](../references/entry-navigation.md#每个入口都确定首页与菜单顺序) 实施:发布前核对每个入口菜单数组及分组顺序、`defaultMenuKey` 对应的页面/视图,发布后从实际入口验证首屏。`frontend-only` 不调用平台排序命令,但必须完成上述排序和验收。
|
|
16
16
|
|
|
17
17
|
PRD 的应用工作区导航 `execution.appConfig.navigationType=custom` 时,页面导航已在 Step 4 / Step 6 创建或复用页面后按 [导航壳必做配置](../../yida-nav-shell/SKILL.md#必做配置) 隐藏并回读,与源码开发并行。本步骤发布并检查本轮全部自定义页面,再回读核对 `renderNav=false`;缺失或被发布改变时才补写修复,不把首次隐藏推迟到发布后。导航顺序由自定义导航实现;汇总 Step 4 / Step 6 的配置结果与发布后回读结果,覆盖 PRD 全部页面后进入 Step 9。下方平台导航排序仅适用于三种平台导航类型。
|
|
18
18
|
|
|
@@ -49,7 +49,7 @@ openyida nav-group auto-order <appType>
|
|
|
49
49
|
|
|
50
50
|
4. 同一搭建 Run 不得同时执行显式排序与自动排序,不生成逐项 `move` 的 Bash/Python 循环。
|
|
51
51
|
5. 逐入口落实任务顺序与默认页:平台菜单消费 entryRecommendation 派生的 navigationOrder;自定义菜单消费该入口的 menu 和 defaultMenuKey。前台首页不自动进入后台,frontend-only 仍需完成前台菜单排序。
|
|
52
|
-
6.
|
|
52
|
+
6. 从本轮交付的每个业务入口检查实际菜单顺序、默认页面、具体视图和首屏内容。平台排序 `readbackVerified=true` 不证明首页已正确;根入口仍打开错误任务时,继续处理平台支持的默认页配置,能力未验证时交付明确任务链接并标记根入口待验证。平台导航管理页只保留一套跨模块导航,重复时修正页面源码。
|
|
53
53
|
7. 本步骤配置宜搭平台导航,不要求页面源码实现侧边栏或顶部应用导航;只有 PRD 已规划该入口自己的菜单时才实现,不因平台排序再回头补导航壳。
|
|
54
54
|
7. 本轮任一页面 `entryMode=standalone` 时,Step 6 已在取得页面 ID 后隐藏页面导航;发布和健康检查通过后执行 `openyida get-form-config <appType> <displayPageFormUuid> --json` 核对。配置缺失或变化时才执行 `openyida update-form-config <appType> <displayPageFormUuid> false "<页面标题>"` 并再次回读。只有回读明确为 `renderNav=false` 时,才把干净的 `{base_url}/{appType}/custom/{displayPageFormUuid}` 交给 Step 9 作为独立业务入口;写入或回读失败时只保留工作台入口,不用 `?isRenderNav=false` 猜测成功。
|
|
55
55
|
8. 主页面 `entryMode=platform-shell` 或缺失时,不修改页面导航配置,也不输出独立业务入口。
|
|
@@ -76,7 +76,7 @@ openyida nav-group auto-order <appType>
|
|
|
76
76
|
- [ ] 发布目标是已解析的 display 页面;
|
|
77
77
|
- [ ] Canvas 发布结果为 `publishMode=canvas`,且 `healthCheck.ok=true`、`healthCheck.readback.hasYidaCodeCanvas=true`、`runtimeCodeBytes>0`;
|
|
78
78
|
- [ ] 已获得可访问 URL;
|
|
79
|
-
- [ ]
|
|
79
|
+
- [ ] 本轮每个业务入口都已核对默认页面、菜单及分组顺序和首屏任务;自定义导航没有因跳过平台排序命令而漏验;
|
|
80
80
|
- [ ] 自定义导航业务工作区切换后的 main 和 iframe 撑满剩余空间;连续展示页的首屏背景覆盖导航背后,滚动进入第二屏及窄屏展开菜单仍可读;检查短/长内容、窗口高度变化和底部操作可达性,无双滚动、背景断带或意外边距变化;
|
|
81
81
|
- [ ] 按 [页面与导航连续性](../../yida-design/references/page-continuity.md) 验证菜单往返、直接链接、刷新、前进后退、重复/快速点击及加载失败;保留约定的筛选、分页、位置和未保存输入,URL、选中态与内容一致;
|
|
82
82
|
- [ ] 使用自定义导航时逐项点击,导航仍可见、可操作,选中项与主内容一致且能返回工作台;刷新、前进后退恢复任务,无双导航和双滚动条,不能仅以目标页打开成功验收;
|
|
@@ -110,10 +110,11 @@
|
|
|
110
110
|
- 用户或调用方明确要求资源清单、资源 UUID/ID、发布状态或测试数据摘要时,终态 artifact 的 `description` 包含简洁的“交付清单”。清单是本轮真实返回值和只读 readback 的投影,覆盖已创建或发布资源的名称、类型、ID、主页面发布状态及 seed records 写入/抽查摘要;未知信息标记为未核验。
|
|
111
111
|
- 业务总结中的资源数量、seed records 数量和完成状态与逐资源真实返回值/readback 一一对应;证据不完整的资源标记为未核验。
|
|
112
112
|
- 新增、修改或发布单个具体页面时,交付当前页面并保持单页范围。
|
|
113
|
-
-
|
|
113
|
+
- 完整应用的入口组按有效范围交付:不分前后台时提供经验证的“系统入口”,分前后台或只有访问后台时提供经验证的“业务后台入口”:根 `{base_url}/{appType}/workbench` 或上述指定任务/视图链接;明确仅前台时不追加业务后台,但仍提供开发者管理后台。
|
|
114
|
+
- 只有访问后台时核验业务处理人员的入口、数据范围和操作,不追加前台;只有访问前台且提交后需要处理时,核验已有系统、人员入口或自动流程如何承接,未核验的部分明确说明。
|
|
114
115
|
- 前台页面在 PRD 中为 `entryMode=standalone`,且 Step 8 回读确认 `renderNav=false` 时,入口组包含“前台” `{base_url}/{appType}/custom/{formUuid}`;否则不得输出。
|
|
115
116
|
- 完整应用默认交付“开发者管理后台” `{base_url}/{appType}/admin`,使用 `create-app` 或 `app-list` 成功结果中的 `adminUrl`。`application_entry_policy.entries.admin=include` 不受云端/本地宿主或登录态注入方式影响;不要沿用旧版本云端省略 admin 的规则。地址生成不代表已验证收件人的管理权限,实际访问仍由平台鉴权。
|
|
116
|
-
- 完整应用一般为 2–3
|
|
117
|
+
- 完整应用一般为 2–3 个地址:有前后台时为“前台、业务后台、开发者管理后台”;仅前台时为“前台、开发者管理后台”;仅业务后台时为“业务后台、开发者管理后台”;不分前后台时为“系统入口、开发者管理后台”。同一业务入口不重复凑数,不为补链接创建额外业务后台。用户明确排除开发者入口时遵从;单页任务保持单页交付范围。
|
|
117
118
|
- 若历史创建结果缺少 `adminUrl`,分页查询 `app-list` 并匹配真实 `appType`(名称仅辅助识别),保留其 `adminUrl`;不要自行猜租户域名或资源 ID。无法取得时明确标记开发者入口待补齐,不得静默省略或声明交付完成。
|
|
118
119
|
- 三个入口属于同一个应用入口组,不得各自连同业务资源再生成多组交付。
|
|
119
120
|
- 不把 `g.alicdn.com` 的 `index.css`、`index.js`、`index.html`、`locales/*.json`、构建产物 URL、CDN 资源 URL 或中间文件链接当成最终结果展示。
|
|
@@ -114,7 +114,7 @@ function setNavigationTitle(title) {
|
|
|
114
114
|
2. **组件增强可降级**:门户、成员、部门、上传组件都做 feature detect 和 fallback;组件缺失时页面仍展示自绘基线。
|
|
115
115
|
3. **值先归一化**:成员、部门、文件的原始返回值保留到 `raw` 用于检查,业务 payload 使用统一结构。
|
|
116
116
|
4. **UI 改造保持功能契约**:页面美感提升、页面重构和局部美化只调整颜色、布局、密度、间距、视觉层级、素材和图标表达;已有数据源、字段映射、按钮动作、筛选逻辑、提交 URL、权限和业务状态按原有实现保留。
|
|
117
|
-
5. **页面跟随应用主题**:应用设置使用 `app-theme.css`;页面通过 `--color-brand1-*`、`--color-group` 和 `--pod-*` 取色。页面底色使用 `--pod-page-bg-color`,卡片使用 `--pod-card-bg-color
|
|
117
|
+
5. **页面跟随应用主题**:应用设置使用 `app-theme.css`;页面通过 `--color-brand1-*`、`--color-group` 和 `--pod-*` 取色。页面底色使用 `--pod-page-bg-color`,卡片使用 `--pod-card-bg-color`,抽屉外壳背景使用 `--pod-shell-theme-bg-color`,正文容器保持透明;自绘导航页按 `design.md` 设置内部画布背景。样式限定在 `YidaComp` 内,应用主题通过 `update-app --theme-file` 更新。根节点使用 `display:flow-root` 或 flex/grid,将导航间距留在根节点内部。宿主背景和局部画布规则见 [样式指南](references/canvas-style-implementation-guide.md)。
|
|
118
118
|
6. **先验证再扩展业务**:原生组件、上传、组织搜索、弹层类能力先做 smoke 页面,确认 PC/移动端都可用后再进入复杂业务页面。
|
|
119
119
|
7. **按设计编写 UI,示例按需参考**:新建 `.canvas.jsx` / `.canvas.tsx` 时,直接按 PRD、`design.md`、真实数据和页面交互实现,允许从空文件编写。需要参考完整表单交互时,可执行 `openyida sample openyida-page-template canvas-form-drawer --output .cache/samples/form-drawer.canvas.jsx --var APP_TYPE=<appType> --var FORM_UUID=<formUuid>`;整页示例按需参考;含表单打开入口时,必须按下方“表单打开入口统一容器”整体合并抽屉片段,不能裁剪交互能力。页面其余布局、材质、留白、圆角和选中态按设计实现。未改写的示例不得直接发布;页面 UI、业务文案、交付说明和 final 中不出现内部示例名、生成过程或实现代号。使用示例时,发布前删除 `@openyida-page-template-base`、`SAMPLE_ROWS`、`{{APP_TYPE}}` / `{{FORM_UUID}}`、示例数据和占位文案。
|
|
120
120
|
8. **用文件编辑工具维护源码**:业务源码使用 Write/Edit/patch 编写,已有 JSX/CSS/JSON 源码只做定点 Edit。主题代码使用 `sample` 提取,或由 `scripts/build-canvas-theme.js` 插入标记处并输出独立文件。修改业务时编辑原始文件,再重新运行主题脚本。
|
|
@@ -126,7 +126,7 @@ function setNavigationTitle(title) {
|
|
|
126
126
|
13. **页面产物使用纯文本业务文案**:`.canvas.jsx` 源码、`page-spec.json` 中会渲染到页面的文案、JS 注释、数据常量和产物文件路径都使用无 emoji 文本。页面生成、`compileCanvasLocal` 或 `publish` 报 emoji 错误时,先改 spec/源码/路径,再重新校验发布。若 emoji 原本承担图标含义,必须按 `design.md.iconSystem` 改成 `lucide-react` 或 `@ant-design/icons` 的具体组件,默认 `lucide-react`;不得用 CSS 绘制图形、单字母、首字母、标点符号、Unicode 符号或临时 SVG 冒充图标。
|
|
127
127
|
14. **JSX 文案只能是文本或字符串**:JSX 文案只能写成纯文本 `所有级别` 或带引号字符串 `{'所有级别'}`;筛选项、按钮、状态、空态和表格列名等中文业务文案都按此规则书写。花括号里只能放真实 JS 变量/表达式,不能把中文文案写成 `{所有级别}`、`{处理中}`;Unicode escape 被工具解码后也必须保留字符串引号。
|
|
128
128
|
15. **先区分应用导航与入口菜单**:按 PRD 应用 navigationType 和当前页 pageSpecHandoff.entryMode/navigation 执行。普通页默认保留平台导航,页面内 tab 不触发应用级隐藏;独立前台可有自己的顶部、侧边或底部菜单,执行 `use_skill("yida-nav-shell")` 的页面级分支,只配置当前页。仅整个应用采用自定义导航时才执行 `openyida update-app <appType> --hide-app-nav`;不得因前台 custom 隐藏后台应用菜单。
|
|
129
|
-
16.
|
|
129
|
+
16. **表单提交必须接入提供的抽屉模板(登录态默认,匿名态窄例外)**:前台、后台、Fast、Plan 的页面内新增、报名、申请、预约等普通登录态表单提交,以及表单详情入口,统一使用 `FormOpenContainer`;不能因为页面是全码开发就自绘填写表单并直接调用登录态提交 API,也不能由 AI 自行改成普通链接、新窗口或简化弹层。先执行 `openyida sample openyida-page-template form-open-container --output .cache/samples/form-open-container.jsx`,整体合并 `CanvasDrawer` / `FormOpenContainer` / `useYidaFormOpen` 及其 import 和辅助函数。业务按钮调用 `openForm`,页面 JSX 必须渲染 `formOpenContainer`,接入真实表单、实例 ID 和刷新函数。保留三个标题栏图标操作、拖拽调宽、关闭刷新和 iframe 自适应高度;移动端打开方式由模板处理。只能通过主题变量和现有 props 调整外观,不重写外壳。搜索筛选不是表单提交;已明确的表格批量录入沿用专用技能。应用级导航已确定在主内容区嵌入原生提交页时按 [入口用途](../yida-nav-shell/references/nav-shell-patterns.md#入口用途与嵌入页面) 执行;不能以此绕过页面内按钮的抽屉要求。接入步骤见 [标准容器](references/navigation-and-entry-guide.md#接入示例)。唯一窄例外是用户明确要求 `/o/...` 公开页面匿名采集,且显示页、目标普通表单公开状态和目标表单 `FREE_LOGIN` 权限三项门禁均已回读通过;此时加载 `yida-canvas-data-binding`,按[公开访问(匿名态)提交](references/data-bridge-guide.md#公开访问匿名态提交)自绘受控字段并走 `RECEIPT_SAVE_FORM_DATA`,发布后必须按返回的实例 ID 回读字段值。任一门禁不满足、需要流程或需要真实身份时仍使用登录态方案,不适用该例外。
|
|
130
130
|
17. **图标资源固定为可加载库**:页面图标只使用 `lucide-react` 或 `@ant-design/icons`,默认使用 `lucide-react` named import。只有页面已经采用 Ant Design 图标语言、或 antd 组件语境需要 Outlined 图标时,才使用 `@ant-design/icons`。快捷入口、按钮、状态、导航和空态图标在写源码前先建立 `actionIconMap` / `statusIconMap`,按业务语义映射到具体组件,例如 `Plus`、`Upload`、`Download`、`Eye`、`Building2`、`AlertCircle`、`Check`。图标外层可以用 CSS 控制尺寸、颜色、圆角、背景和 hover,但图标本体必须来自上述两类组件,不能用 CSS 形状、字母或 emoji 替代。包名可用不代表任意图标都存在;以宜搭运行时导出为准,不照搬最新版官网名称。`OPENYIDA_CANVAS_ICON_EXPORT_UNAVAILABLE` 必须修正具体 import 后重新编译;动态名称使用显式组件映射并提供可用图标兜底,详见 [运行时图标校验](references/component-library-guide.md#运行时图标校验)。
|
|
131
131
|
|
|
132
132
|
18. **对话框统一消费主题 token**:新增或改造对话框时,执行 `openyida sample openyida-page-template canvas-dialog --output .cache/samples/canvas-dialog.jsx`,将 `CanvasDialog` 合并到当前页面并接入业务状态,见 [对话框](references/dialog-guide.md)。标题、正文、背景、页脚、关闭按钮和操作按钮均消费应用 token;整体暗色适配与导航明暗分别判断。
|