openyida 2026.9.11 → 2026.9.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +7 -5
  2. package/bin/yida.js +1 -0
  3. package/lib/ai/ai.js +2 -0
  4. package/lib/app/canvas-compile.js +29 -26
  5. package/lib/app/compile.js +39 -1
  6. package/lib/app/services/canvas-page-compiler.js +3 -3
  7. package/lib/app/update-app.js +17 -2
  8. package/lib/asset/ai-image.js +37 -65
  9. package/lib/asset/asset-cmd.js +151 -110
  10. package/lib/asset/asset-plan.js +105 -0
  11. package/lib/asset/asset-resolve.js +343 -225
  12. package/lib/asset/asset-status.js +20 -31
  13. package/lib/asset/attachment-upload.js +29 -0
  14. package/lib/asset/host-capabilities.js +91 -0
  15. package/lib/asset/image-metadata.js +104 -0
  16. package/lib/asset/url-verify.js +90 -130
  17. package/lib/core/agent-capabilities.js +11 -0
  18. package/lib/core/command-manifest.js +25 -11
  19. package/lib/core/locales/en.js +6 -2
  20. package/lib/core/locales/zh.js +6 -2
  21. package/lib/design-plan/materialize.js +7 -9
  22. package/lib/design-plan/normalize.js +11 -1
  23. package/lib/process/services/process-actions.js +145 -0
  24. package/lib/process/services/process-compiler.js +4 -30
  25. package/lib/process/services/process-view-verifier.js +31 -0
  26. package/package.json +1 -1
  27. package/scripts/postinstall.js +1 -1
  28. package/yida-skills/SKILL.md +3 -2
  29. package/yida-skills/skills/yida-app/SKILL.md +1 -1
  30. package/yida-skills/skills/yida-app/workflow/step-2-design.md +11 -1
  31. package/yida-skills/skills/yida-app/workflow/step-3-create-or-reuse-app.md +21 -1
  32. package/yida-skills/skills/yida-app/workflow/step-5-seed-records.md +11 -7
  33. package/yida-skills/skills/yida-app/workflow/step-7-page-code.md +4 -0
  34. package/yida-skills/skills/yida-canvas-custom-page/SKILL.md +5 -3
  35. package/yida-skills/skills/yida-canvas-custom-page/references/component-library-guide.md +1 -1
  36. package/yida-skills/skills/yida-canvas-custom-page/references/page-generation-guide.md +3 -27
  37. package/yida-skills/skills/yida-canvas-table-form/SKILL.md +1 -1
  38. package/yida-skills/skills/yida-create-app/SKILL.md +4 -4
  39. package/yida-skills/skills/yida-create-process/SKILL.md +2 -0
  40. package/yida-skills/skills/yida-custom-page/references/assets-guide.md +9 -12
  41. package/yida-skills/skills/yida-design/SKILL.md +1 -0
  42. package/yida-skills/skills/yida-design/references/ask-human-interaction-contract.md +4 -4
  43. package/yida-skills/skills/yida-design/references/asset-workflow.md +14 -53
  44. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/build-plan-compact-schema.md +1 -1
  45. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/build-plan-schema.md +21 -4
  46. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/scripts/render_build_plan.py +1 -2
  47. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/scripts/validate_design_themes.py +1 -1
  48. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/README.md +1 -1
  49. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-media-grid.md +1 -1
  50. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-modular-clarity.md +1 -1
  51. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-structured-clarity.md +1 -1
  52. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/ambient-halo-layered.md +1 -1
  53. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/dark-focus-layered.md +1 -1
  54. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/dark-luminous-modular.md +1 -1
  55. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/deep-stage-duotone.md +1 -1
  56. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/hairline-runway-clarity.md +1 -1
  57. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/high-contrast-modular.md +1 -1
  58. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/interlocked-vivid-modules.md +1 -1
  59. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/matrix-grid-focus.md +1 -1
  60. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/media-rail-inspector.md +1 -1
  61. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/mist-layered-signal.md +1 -1
  62. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/modular-rail-signal.md +1 -1
  63. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/mono-grid-signal.md +2 -2
  64. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/ribbon-ledger-lift.md +1 -1
  65. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/segmented-meter-clarity.md +1 -1
  66. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/split-rail-precision.md +1 -1
  67. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/status-framed-media-grid.md +1 -1
  68. package/yida-skills/skills/yida-design/workflow/output-design.md +4 -0
  69. package/yida-skills/skills/yida-design/workflow/step-4-wireframe-interaction.md +1 -1
  70. package/yida-skills/skills/yida-design/workflow/step-5-visual-states.md +2 -1
  71. package/yida-skills/skills/yida-image-assets/SKILL.md +91 -0
  72. package/yida-skills/skills/yida-image-assets/references/manifest-contract.md +87 -0
  73. package/yida-skills/skills/yida-image-assets/references/source-policy.md +19 -0
  74. package/yida-skills/skills/yida-nav-shell/references/nav-shell-patterns.md +1 -1
  75. package/yida-skills/skills/yida-prd/workflow/output-prd.md +2 -2
  76. package/yida-skills/skills/yida-process-rule/SKILL.md +6 -1
  77. package/yida-skills/skills/yida-process-rule/references/approval-actions.md +48 -0
  78. package/yida-skills/skills/yida-publish-page/SKILL.md +5 -4
  79. package/yida-skills/skills/yida-rechart/SKILL.md +1 -1
  80. package/yida-skills/skills/yida-requirement-analysis/SKILL.md +1 -1
  81. package/yida-skills/skills/yida-requirement-analysis/workflow/prepare-brief.md +22 -13
  82. package/yida-skills/skills-index.json +18 -1
@@ -40,7 +40,27 @@
40
40
 
41
41
  ## 应用导航配置
42
42
 
43
- 按 PRD 的 [导航类型](../../yida-prd/workflow/output-prd.md#导航类型与执行配置) 设置布局。已有应用切换平台导航时执行 `openyida update-app <appType> --layout <l_shape|top|side> --show-app-nav`;自定义导航执行 `openyida update-app <appType> --hide-app-nav`,并将逐页隐藏清单交给 Step 4 与 Step 6,在各页面创建后立即配置,Step 8 只做发布后核对。新建应用也在主题文件生成后的同一次 `update-app --theme-file` 中传入布局和 `--hide-app-nav` / `--show-app-nav`,不要提前单独更新导航或在创建时传入布局。用户已确认的应用导航隐藏随这次设置更新一起生效,不等待自定义页面创建、代码开发或发布。
43
+ 按 PRD 的 [导航类型](../../yida-prd/workflow/output-prd.md#agent-导航实施映射) 设置布局。已有应用切换平台导航时执行 `openyida update-app <appType> --layout <l_shape|top|side> --show-app-nav`;自定义导航执行 `openyida update-app <appType> --hide-app-nav`,并将逐页隐藏清单交给 Step 4 与 Step 6,在各页面创建后立即配置,Step 8 只做发布后核对。新建应用也在主题文件生成后的同一次 `update-app --theme-file` 中传入布局和 `--hide-app-nav` / `--show-app-nav`,不要提前单独更新导航或在创建时传入布局。用户已确认的应用导航隐藏随这次设置更新一起生效,不等待自定义页面创建、代码开发或发布。
44
+
45
+ ### 平台导航参数
46
+
47
+ 与 `yida-next` 的 ThemeNavSetting 一致:`updateApp.json` 接收的字段名是 **`layoutDirection`**。CLI 使用 `--layout` 传入,按下表逐项对应:
48
+
49
+ | PRD 导航方案 | CLI 参数 | 请求中的 `layoutDirection` | 请求中的 `hideAppNav` |
50
+ | --- | --- | --- | --- |
51
+ | 平台顶部导航 | `--layout top --show-app-nav` | `top` | `n` |
52
+ | 平台侧边导航 | `--layout side --show-app-nav` | `side` | `n` |
53
+ | 平台 L 型导航 | `--layout l_shape --show-app-nav` | `l_shape` | `n` |
54
+
55
+ 例如,仅将已有应用切换为平台顶部导航:`openyida update-app <appType> --layout top --show-app-nav`。联合更新主题时,将这两个参数合并到同一次 `update-app --theme-file` 调用。
56
+
57
+ Agent 必须显式传入场景选择对应的布局,不依赖 CLI 默认值。`navigationType=platform-top` 是计划内部标识,不能作为 `--layout` 的值;也不能用旧 Shell 的 `navType`、`hoz/ver/slide` 或 `top_fold/top_side/side_only` 代替上述参数。`navTheme` 只控制导航配色,不控制布局。自定义导航的 `variant=top/side/mixed/dock` 描述页面内菜单,不用于设置平台布局;自定义导航仍使用 `--hide-app-nav`。
58
+
59
+ `navType` 仍是兼容字段:与 `yida-next` 一致,CLI 查询应用后将已有值原样带回;缺失时不补造,也不根据新布局改写。没有新增 `--nav-type` 参数。未传 `--layout` 时,CLI 按 `yc-utils` 的应用配置规则保留原布局:现代 `side/top/l_shape` 优先;旧 `hoz + top_side` 为 L 型,其他 `hoz` 为顶部,`ver` 为侧边;布局缺失时用 `navType=top_fold/top_side` 分别恢复顶部/L 型,其余回退侧边。
60
+
61
+ Shell 渲染阶段才把顶部、侧边、L 型转换为 `top_fold`、`side_only`、`top_side`。详情/提交页的 `top_fold` 强制顶部、`none` 保持无导航属于页面运行态规则,不能反向写入应用配置。
62
+
63
+ 保存后核对应用详情中的 `layoutDirection` 与 `hideAppNav` 是否等于目标值,可通过应用设置页或 `/<appType>/query/app/getAppIncludingAecpInfo.json` 回读。CLI 输出的 `updatedFields` 是提交值,`themeVerification` 只验证主题资源,两者都不能单独证明导航配置已生效。发布后再刷新应用,检查实际布局;未完成回读时明确标记未验证。
44
64
 
45
65
  ## 产出
46
66
 
@@ -1,11 +1,12 @@
1
1
  # Step 5:写入初始表单数据
2
2
 
3
- 完整应用默认给本轮新建或页面数据源依赖的核心普通表单写入 1-3 条业务化 seed records。
3
+ 完整应用默认给本轮新建或页面数据源依赖的核心普通表单写入 1-3 条业务化 seed records。流程表单仅在已确认真实 `processCode` 后按独立命令写入。
4
4
 
5
5
  ## 输入
6
6
 
7
7
  - 真实 `appType`;
8
- - 核心普通表单 `formUuid`;
8
+ - 核心表单 `formUuid`、真实表单类型;
9
+ - 流程表单已确认的真实 `processCode`;
9
10
  - `.cache/<项目名>-schema.json` 或字段 schema;
10
11
  - PRD 中的业务对象和示例数据语义。
11
12
 
@@ -14,27 +15,30 @@
14
15
  1. 执行 `use_skill("yida-data-management", "为核心业务表单写入 1-3 条示例记录")`。
15
16
  2. 先执行 `openyida get-schema <appType> <formUuid> --field-map-json` 获取真实字段 ID。
16
17
  3. 生成当前业务语义的字段值,不写“测试1 / demo / mock”。
17
- 4. 每个核心普通表单 1-3 条即可;列表/工作台通常 2 条,看板/排行/状态分布通常 3 条。
18
+ 4. 每个核心表单 1-3 条即可;列表/工作台通常 2 条,看板/排行/状态分布通常 3 条。
18
19
  5. `DateField` / `CascadeDateField` 使用 13 位毫秒时间戳。
19
- 6. 每条记录单独执行 `openyida data create form <appType> <formUuid> --expect-form-name <真实名称> --expect-form-type receipt --data-file ...` 或 `--data-json ...`;名称/UUID/类型不一致时停止。
20
- 7. 最后执行 `openyida data query form` 抽查至少 1 条,确认 `formData` 非空。
20
+ 6. 普通表单每条记录单独执行 `openyida data create form <appType> <formUuid> --expect-form-name <真实名称> --expect-form-type receipt --data-file ...` 或 `--data-json ...`;最后执行 `openyida data query form` 抽查至少 1 条。
21
+ 7. 流程表单只有在已确认真实 `processCode` 后,才执行 `openyida data create process <appType> <formUuid> --process-code <真实 processCode> --expect-form-name <真实名称> --expect-form-type process --data-file ...` 或 `--data-json ...`;最后执行 `openyida data query process` 抽查至少 1 条。
22
+ 8. 名称、UUID、类型或 `processCode` 不一致时停止,不得在 `form` 与 `process` 命令之间盲目重试。
21
23
 
22
24
  以下情况可以跳过,并在 final 说明原因:
23
25
 
24
26
  - 用户明确要求不要造数;
25
27
  - 表单是配置字典、权限表、敏感个人数据表或纯附件表;
26
28
  - 字段缺少可安全构造的有效值;
27
- - 流程表单没有确认 `processCode`,且页面不需要流程实例。
29
+ - 流程表单没有确认 `processCode` 时禁止写入实例;若页面依赖流程实例,先补齐真实 `processCode`,否则说明跳过原因并保留空态。
28
30
 
29
31
  ## 产出
30
32
 
31
- - 1-3 条真实普通表单记录;
33
+ - 1-3 条真实普通表单或流程表单记录;
32
34
  - query 抽查结果;
33
35
  - 或明确跳过原因和页面空态方案。
34
36
 
35
37
  ## Checklist
36
38
 
37
39
  - [ ] seed records 使用真实 `fieldId`;
40
+ - [ ] 普通表单使用 `data create form`,流程表单使用 `data create process`;
41
+ - [ ] 流程实例创建前已确认真实 `processCode`;
38
42
  - [ ] 每条记录单独创建;
39
43
  - [ ] query 抽查已确认 `formData` 非空;
40
44
  - [ ] 跳过时已写明原因和页面空态方案。
@@ -13,6 +13,7 @@
13
13
  - 真实 `appType`、当前页面 `formUuid`;
14
14
  - `.cache/<项目名>-schema.json`;
15
15
  - Step 5 写入的 seed records 或跳过原因。
16
+ - 需要图片时读取 `prd/<项目名>/asset-manifest.json`。
16
17
 
17
18
  ## 操作
18
19
 
@@ -20,6 +21,8 @@
20
21
 
21
22
  先读取 `constraints.prohibitedActions`。命中 `page-source` 时,本步骤只能做 Read、编译/静态检查等只读诊断,不得 Write/Edit/Create 页面源码,也不得用脚本、格式化器或生成器间接改写;输出应明确“源码未修改”并跳过依赖源码变更的发布。未命中时才执行下列源码实现动作。
22
23
 
24
+ 当前页为 `required`,或为带槽位的 `beneficial` 时,先执行 `use_skill("yida-image-assets", "准备当前页图片")`。使用 `--design design.md --app-type <真实appType>` 核对槽位、默认上传宜搭图片附件,输出 `asset-manifest.json`;超过 20 MiB 的外链保留原地址。读取 manifest 中当前页 `pages[].materialStatus`;该页为 `final` 时只使用 `assets[].materialStatus=final` 的图片。必需槽位缺口只阻塞当前页,总状态 `draft` 不阻塞其他已就绪页面。
25
+
23
26
  1. 自定义页面开发执行 `use_skill("yida-canvas-custom-page", "生成当前页面源码")`。根据 PRD 和 `design.md` 直接编写 `.canvas.jsx` / `.canvas.tsx`;允许从空文件实现完整 UI。内置整页示例按需用于理解数据接入和导航;表单抽屉片段必须按第 9 条整体合并,不要求复制整页,也不能用示例默认外观替代已确认的设计。已有符合设计的页面可继续迭代。
24
27
  2. PRD 或页面名包含看板、工作台、驾驶舱、Dashboard 时,必须执行 `use_skill("yida-dashboard", "实现真实业务看板")`。
25
28
  3. 页面读取任一表单数据时,必须执行 `use_skill("yida-canvas-data-binding", "为页面接入真实表单数据")`;不得以“页面已经能发布”为由跳过。
@@ -55,6 +58,7 @@ Plan 模式下,上表涉及 PRD/design 的修正均由对应技能更新 `buil
55
58
  ## Checklist
56
59
 
57
60
  - [ ] 页面实现已读取 PRD 和 `design.md`;
61
+ - [ ] 需要图片时只使用 manifest 中已验证的素材;
58
62
  - [ ] 新建页面或调整视觉前,实际实现者已完整读取 `canvas-style-implementation-guide.md`;检查记录包含文件路径、适用章节和页面落点,工具读取结果未遗漏截断部分;仅改数据逻辑时说明不适用原因;
59
63
  - [ ] 页面没有默认自绘应用级侧边导航 / 顶部导航;如有页面内自绘导航,已有用户显式要求和 `yida-nav-shell` 依据;
60
64
  - [ ] 自定义导航已提取 `canvas-nav-content` 并合并 `CanvasNavigationContent`;源码和 DOM 存在 `.openyida-nav-layout`、`.openyida-nav-content`,且实际测量内容撑满剩余空间、iframe 与视口等高、底部按钮可到达;只加类名不算通过;
@@ -170,7 +170,7 @@ openyida create-page <appType> "<页面名>"
170
170
 
171
171
  # 使用 Provider 标记时,先按主题脚本指南生成 <页面名>.themed.canvas.jsx;以下快检与发布都改用该生成文件。
172
172
  # 4. 本地快检
173
- node -e "const fs=require('fs'); const {compileCanvasLocal}=require('./lib/app/canvas-compile'); const src=fs.readFileSync('project/pages/src/<页面名>.canvas.jsx','utf8'); console.log(compileCanvasLocal(src).importedModules)"
173
+ openyida compile project/pages/src/<页面名>.canvas.jsx --json
174
174
 
175
175
  # 5. 发布(本轮修改源码后的远端完成证据)
176
176
  openyida publish project/pages/src/<页面名>.canvas.jsx <appType> <formUuid>
@@ -179,9 +179,11 @@ openyida publish project/pages/src/<页面名>.canvas.jsx <appType> <formUuid>
179
179
  openyida get-schema <appType> <formUuid> --field-map-json
180
180
  ```
181
181
 
182
- `openyida check-page` / `openyida compile` 当前面向平台 JSX 组件页面 `.oyd.jsx` / `.jsx`;使用 `YidaCodeCanvas` 组件实现的页面以 `compileCanvasLocal` 和 `openyida publish .canvas.jsx` 的构建阶段为准。`compileCanvasLocal` 是发布前快检,`openyida publish` 是远端写入证据。
182
+ `openyida compile` 会自动识别 `.canvas.jsx` / `.canvas.tsx` 并调用 Canvas 编译器;`--json` 返回可机器读取的 hash 和依赖清单。该命令只读、无需登录、不访问网络、不发布页面,也不写入构建产物。`openyida publish` 仍是远端写入证据。
183
183
 
184
- 快检固定从 workspace 根使用现成的 `./lib/app/canvas-compile`,不要搜索其他 compiler 路径或安装依赖。`run_workspace_script` 的 `script_path` 以项目根为基准,写 `.cache/yida-agent/scripts/...`;不要写 `project/.cache/...`,否则运行时会解析成 `project/project/.cache/...`。
184
+ 云端与本地 Agent 都使用同一条 `openyida compile <页面源码.canvas.jsx> --json` 快检命令,不依赖仅云端 Builder 提供的 `run_workspace_script`。
185
+
186
+ 其他确需保存的云端 workspace 脚本放在项目根 `.cache/yida-agent/scripts/...`,不要写 `project/.cache/...`,否则运行时会解析成重复的 `project/project/.cache/...`;Canvas 快检本身不需要创建脚本。
185
187
 
186
188
  如需保存完整 Schema,使用 create_file / Write / file edit tool 创建 `<projectRoot>/.cache/openyida/<页面名或任务名>/<页面名>-schema.json`;从 workspace 根执行后续 Bash 命令时路径加 `project/` 前缀。
187
189
 
@@ -95,7 +95,7 @@ OpenYida 禁止页面源码和 page-spec 中出现 emoji。遇到 `contains emoj
95
95
  可直接按推荐组合编写页面并执行本地快检:
96
96
 
97
97
  ```bash
98
- node -e "const fs=require('fs'); const {compileCanvasLocal}=require('./lib/app/canvas-compile'); const src=fs.readFileSync('project/pages/src/dashboard-starter.canvas.jsx','utf8'); console.log(compileCanvasLocal(src).importedModules)"
98
+ openyida compile project/pages/src/dashboard-starter.canvas.jsx --json
99
99
  ```
100
100
 
101
101
  ## 自查清单
@@ -104,35 +104,11 @@ design.md 存在“项目配色适配”时先应用该节,它高于模板默
104
104
 
105
105
  表单提交/详情里的 `isRenderNav=false` 只隐藏原生表单页或详情页的页面导航,不用于隐藏自定义页应用导航。
106
106
 
107
- ## 官网与品牌页素材流程
107
+ ## 官网与品牌页素材
108
108
 
109
- 实现 `official-homepage` 时,先读取 PRD 中的素材清单;缺少素材时按下方补齐素材清单。
109
+ 按 `design.md.assetStrategy` 调用 `yida-image-assets`。读取 `asset-manifest.json` 中当前页面 `pages[].materialStatus`;当前页为 `final` 时,只读取该页 `assets[].materialStatus=final` 的图片 URL。总状态为 `draft` 不阻塞已就绪的页面;不手拼 URL,也不内嵌 data URI。
110
110
 
111
- 强视觉品牌以 PRD 的素材清单和 `design.md.assetStrategy` 为准。官网完成条件包括:场景 Hero、产品/服务、过程/空间三类素材,消费应用主题变量的视觉表达,不同 section 的构图节奏,以及一个明确 CTA。
112
-
113
- 素材清单至少包含:
114
-
115
- ```json
116
- {
117
- "assets": {
118
- "heroImage": "https://...",
119
- "heroImageAlt": "品牌主视觉",
120
- "productImages": [
121
- { "url": "https://...", "alt": "明星产品" }
122
- ]
123
- }
124
- }
125
- ```
126
-
127
- 素材来源优先级:
128
-
129
- 1. 用户提供或已有官网图片。若有防盗链,优先用 `openyida cdn-upload` 转存。
130
- 2. AI 生成图片。先生成本地图片,再确认 CDN 配置,之后上传并回填 URL。
131
- 3. 公开图库。只使用可公开访问且通过 HTTP 200 校验的图片 URL;生产交付优先转存到自有 CDN。
132
-
133
- 若 `openyida cdn-config --show` 显示缺少 `accessKeyId/accessKeySecret/cdnDomain/ossBucket`,交付状态标为“素材待上传”;可先用已验证公开 URL 测试,或提示用户补 CDN 配置。
134
-
135
- 离线展示在无 CDN 时允许内嵌经过压缩的 JPEG/WebP data URI,保证源码原样发布也有真实图片;建议 3-5 张、单张不超过 250 KB、总量不超过 800 KB。生产页面使用稳定 CDN 素材 URL。
111
+ 联网搜图仅使用 Unsplash/Pexels。Unsplash 保留 API 热链和署名;Pexels 保留来源页和摄影师信息。
136
112
 
137
113
  ## 主题实现
138
114
 
@@ -125,7 +125,7 @@ openyida get-schema <appType> <formUuid> --field-map-json
125
125
  # 未验证前保持 writeBridge.verified !== true
126
126
 
127
127
  # 4. 本地快检
128
- node -e "const fs=require('fs'); const {compileCanvasLocal}=require('./lib/app/canvas-compile'); const src=fs.readFileSync('project/pages/src/table-form-batch-submit.canvas.jsx','utf8'); console.log(compileCanvasLocal(src).importedModules)"
128
+ openyida compile project/pages/src/table-form-batch-submit.canvas.jsx --json
129
129
 
130
130
  # 5. 真实交付时发布
131
131
  openyida publish project/pages/src/table-form-batch-submit.canvas.jsx <appType> <displayPageFormUuid>
@@ -63,7 +63,7 @@ openyida update-app <appType> --theme-file <app-theme.css> --nav-theme light --l
63
63
  |---------|------|
64
64
  | `--colour` / `--theme` | 平台主题 key,例如 `podBlue`、`podGreen`、`podOrange`、`black`、`custom`;禁止填写 HEX、RGB 或自造名称 |
65
65
  | `--nav-theme` | `light` / `dark` / `white` / `gray` |
66
- | `--layout` | `side` / `top` / `l_shape`,按 PRD 设置 |
66
+ | `--layout` | 顶部传 `top`、侧边传 `side`、L 型传 `l_shape`;CLI 写入接口字段 `layoutDirection`,使用平台导航时同时传 `--show-app-nav` |
67
67
  | `--theme-file` | 上传主题 CSS,保存 `customThemeStyle` 资源及从 CSS 提取的 `themeColor` |
68
68
  | `--theme-color` | 仅更新应用主色;与主题文件同传时以 CSS 主色为准 |
69
69
  | `--logo-source` | `appIcon` / `customImage`;后者要求应用已有 `homepageLogo` |
@@ -77,7 +77,7 @@ openyida update-app <appType> --theme-file <app-theme.css> --nav-theme light --l
77
77
 
78
78
  创建命令只提交名称、描述、图标和必要的创建标记,不推断或提交应用主题与导航配置。创建完整应用、使用 PRD/design.md 或用户要求配置主题时,主题更新命令默认传入主题文件;只有用户明确只创建空壳或暂不配置主题时才跳过主题更新。搭建流程必须采用先 `create-app`、再 `update-app --theme-file` 的两个步骤。`create-app` 不接受 `--theme-file` 和 `--logo-source`,也不接受 `--colour`、`--theme`、`--nav-theme`、`--layout` 或旧位置参数里的主题与布局,不隐式执行应用设置更新。
79
79
 
80
- CLI 始终按“显式 `--icon` → 行业推断 → 随机系统图标”的顺序选择图标,只有未显式指定且未命中行业时才随机,与后续是否更新主题文件无关。主题文件生成后按 PRD 在 `update-app --layout` 中显式设置布局;普通应用未指定时由设计流程选择 `l_shape`。在 `update-app --theme-file` 步骤中校验 CSS 并将图标颜色统一为 `--color-brand1-6` 转换后的 HEX;导航配置沿用 PRD,普通浅色方案显式传 `--nav-theme light --logo-source appIcon`。
80
+ CLI 始终按“显式 `--icon` → 行业推断 → 随机系统图标”的顺序选择图标,只有未显式指定且未命中行业时才随机,与后续是否更新主题文件无关。主题文件生成后按 PRD 在 `update-app --layout` 中显式设置布局;用户未指定布局时按业务场景选择,不固定使用 `l_shape`。参数映射与保存后核对遵守 [平台导航参数](../yida-app/workflow/step-3-create-or-reuse-app.md#平台导航参数)。在 `update-app --theme-file` 步骤中校验 CSS 并将图标颜色统一为 `--color-brand1-6` 转换后的 HEX;导航配置沿用 PRD,普通浅色方案显式传 `--nav-theme light --logo-source appIcon`。
81
81
 
82
82
  **应用主题(colour)口径**:
83
83
 
@@ -93,8 +93,8 @@ openyida sample yida-design app-theme --output .cache/openyida/<项目名>/app-t
93
93
 
94
94
  ```bash
95
95
  openyida create-app --name "<应用名>" --desc "<描述>"
96
- # 从创建结果提取 appType 后执行
97
- openyida update-app <appType> --theme-file <app-theme.css> --nav-theme light --logo-source appIcon --layout l_shape
96
+ # 从创建结果提取 appType 后执行;以下为 PRD 选择平台顶部导航的示例
97
+ openyida update-app <appType> --theme-file <app-theme.css> --nav-theme light --logo-source appIcon --layout top --show-app-nav
98
98
  ```
99
99
 
100
100
  CLI 会先校验主题文件完整声明平台实际生成的 `--color-brand1-1/2/3/5/6/9/10`,并允许不存在 `--color-brand1-4/7/8`。`update-app --theme-file` 上传 CSS,再调用应用基础设置的 `updateApp` 接口联合保存从 `--color-brand1-6` 提取的 `themeColor`、`customThemeStyle`、`navTheme`、`logoSource` 和 `layoutDirection`。更新主题时,系统应用图标会同步保存为 `iconName%%主题色HEX`;外链或上传图片图标保持原值。
@@ -188,6 +188,7 @@ openyida create-process "APP_XXX" --formUuid "FORM-YYY" .cache/openyida/order/pr
188
188
  1. **🔐 字段权限**:当字段 ≥ 3 且审批节点 ≥ 2 时,每个节点只允许编辑相关字段
189
189
  2. **🔄 跳转规则**:存在回退/循环语义时,自动配置 `routeRules`
190
190
  3. **🔀 并行/办理/高级组件**:需要并行会审、办理节点或连接器/数据/消息等官方组件节点时,流程定义格式直接参考 `yida-process-rule`
191
+ 4. **加签/转交操作权限**:用户要求开启时,按 [操作权限配置](../yida-process-rule/references/approval-actions.md) 生成 `nodes[].actions.normalActions/appendActions`;未要求时保持默认关闭。`create-process` 与 `configure-process` 共用编译器,无需新增命令或手写运行字段。禁止仅修改 `hidden` 后提交原始运行 JSON。
191
192
 
192
193
  需要流程规则细节时,调用 `use_skill("yida-process-rule", "配置已有流程节点、分支和字段权限")`。
193
194
 
@@ -198,6 +199,7 @@ openyida create-process "APP_XXX" --formUuid "FORM-YYY" .cache/openyida/order/pr
198
199
  | 命令返回失败 | 检查 appType 和 formUuid 是否正确,确认登录态有效 |
199
200
  | processCode 获取失败 | 确认表单已成功转为流程表单类型,重新执行 |
200
201
  | 流程定义 JSON 格式错误 | 加载 `yida-process-rule` 子技能,按其中的 JSON 格式说明修正 |
202
+ | `PROCESS_COMPILE_ACTION_CONFIG_INVALID` | 本地编译已拦截无效操作权限,修正报错节点的加签位置、结果或按钮配置后再执行;不要通过删除校验或手动补运行 JSON 绕过 |
201
203
  | 返回 JSON 中无 processCode | 不要猜测 processCode,重新执行命令获取 |
202
204
  | 流程发布失败 | 检查流程定义中的 fieldId 是否为真实 ID(先 get-schema 获取) |
203
205
  | 登录态失效 | 执行 `openyida login` 重新登录后再试 |
@@ -1,16 +1,15 @@
1
1
  # 素材资源指南
2
2
 
3
- 在自定义页面开发中,经常需要使用图片、音乐/音效、Icon 等素材资源。以下是推荐的素材获取方案,确保素材来源稳定、合规、风格一致。
3
+ 图片只从指定图库采集;音频和图标按各自规则使用。
4
4
 
5
5
  ## 图片素材
6
6
 
7
7
  | 素材库 | API | 授权方式 | 推荐场景 |
8
8
  | --- | --- | --- | --- |
9
- | [Unsplash](https://unsplash.com) | ✅ | 免费商用,无需署名 | 高质量背景图、Banner、配图 |
10
- | [Pexels](https://pexels.com) | ✅ | 免费商用,无需署名 | 人物、场景、商务类配图 |
11
- | [Pixabay](https://pixabay.com) | ✅ | 免费商用,无需署名 | 插画、矢量图、通用配图 |
12
- | [Lorem Picsum](https://picsum.photos) | ✅ | 免费 | 开发阶段占位图 |
13
- | [Wikimedia Commons](https://commons.wikimedia.org) | ⚠️ | 授权类型多样,需按条目核对 | 知识类/历史类配图 |
9
+ | [Unsplash](https://unsplash.com) | ✅ | 按官方许可使用 | 背景图、Banner、配图 |
10
+ | [Pexels](https://pexels.com) | ✅ | 按官方许可使用 | 人物、场景、商务配图 |
11
+
12
+ 图片搜索与采集仅使用 Unsplash / Pexels。用户素材和生成图按来源规则处理。
14
13
 
15
14
  ## 音乐/音效素材
16
15
 
@@ -38,14 +37,12 @@
38
37
  ## 素材使用通用建议
39
38
 
40
39
  ### 稳定性
41
- - 生产环境的图片/音频应上传到自有 CDN,避免第三方外链失效
42
- - 图片/音频优先使用有官方 API 的站点(Unsplash / Pexels / Pixabay / Freesound),避免爬虫方式
43
- - 同一关键词可并行查 2-3 个库,失败自动切换;对外链下载做本地缓存
40
+ - 图片只从 Unsplash / Pexels 采集;音频按上方规则处理
41
+ - 上线前校验来源、可达性和授权;按条款使用官方 URL 或自有 CDN
44
42
 
45
43
  ### 合规性
46
- - 优先使用无署名要求的素材库(Unsplash、Pexels、Pixabay、Mixkit)
47
- - 使用 CC BY 素材时必须添加署名,至少记录以下字段:`source`(来源站点)、`author`(作者)、`license`(许可证类型)、`requiredAttribution`(是否需要署名)、`sourceUrl`(原始链接)
48
- - Wikimedia Commons / Freesound / FMA 等站点授权类型多样,务必按条目核对 License
44
+ - 图片记录来源、作者、许可和必要署名
45
+ - CC BY 素材必须署名;音频按条目核对许可
49
46
 
50
47
  ### 一致性
51
48
  - 同一项目中统一使用一套主图标语言,默认 `lucide-react`;只有 antd 图标语境明确时使用 `@ant-design/icons`
@@ -64,6 +64,7 @@ description: >
64
64
  15. **参考转成可执行选择**:参考 Dribbble / 优秀案例时,落到主色、背景素材、首屏构图、信息密度、动线、区块数量和反默认点。
65
65
  16. **页面文案和图标使用专业表达**:渲染文案使用纯文本;图标只使用 `lucide-react` 或 `@ant-design/icons` 的具体组件,默认选择 `lucide-react`,并在 `design.md` 的 `iconSystem` 中写清业务动作、状态、导航和空态到图标组件的映射。emoji 不能改成 CSS 形状、字母占位、Unicode 符号或临时 SVG;如果需要图标,必须映射到上述两类库的具体组件。
66
66
  17. **实现交接明确**:设计产物只定义页面结构、视觉系统和验收标准;常规业务图表使用 `yida-rechart`;ECharts 例外只用于用户明确要求复杂 ECharts option 或维护旧图表。
67
+ 18. **素材按页面分级**:在 `assetStrategy` 中记录图片等级和槽位;需要素材时交给 `yida-image-assets`。
67
68
 
68
69
  ---
69
70
 
@@ -60,7 +60,7 @@
60
60
  1. 进度消息使用业务结果和下一步动作。结构化问题紧随其后时,不额外发送内部分析结论;多个问题确需共同背景时,只在整组交互的引导中说明一次,不写入每个问题的 `title` 或 `prompt`。
61
61
  2. `title`、`prompt`、`label`、`description` 和普通对话只使用用户能直接理解的业务词。
62
62
  3. `interactionId`、`questionType`、`value`、`writeBackPath`、`reason`、状态字段和文件路径仅供内部执行,不进入用户可见内容。
63
- 4. `title` 只写确认主题,`prompt` 只写用户当前需要回答的问题;搭建模式、导航归属与布局保持中性,不标记“推荐”或“默认”,不预选、不按偏好排序,也不在引导或描述中推荐。已选自定义顶部导航时,其呈现样式默认采用浮导,同轮展示样式选项可写“浮导(推荐)”;用户明确的其他样式优先。其他问题存在合理默认值时可标记。只有某个选择会产生重要且难以撤销的影响时,才在对应选项的 `description` 中说明影响。
63
+ 4. `title` 只写确认主题,`prompt` 只写用户当前需要回答的问题;搭建模式、导航归属保持中性,不标记“推荐”或“默认”,不预选、不按偏好排序,也不在引导或描述中推荐。导航布局和呈现样式根据场景确定,不进入提问选项;用户明确的布局和样式优先。其他问题存在合理默认值时可标记。只有某个选择会产生重要且难以撤销的影响时,才在对应选项的 `description` 中说明影响。
64
64
  5. 用户已经提供的信息直接写入内部事实,不重复总结成“缺口分析”或再次追问。
65
65
  6. PRD 的业务说明、HTML、进度消息和交付总结使用功能、体验和验收结果描述配置。接口参数、配置键值、内部 ID 和 CLI 选项保留在 Agent 实施交接中;访问链接使用业务名称,链接目标保留必需参数。用户明确询问实现细节时,再解释对应技术内容。
66
66
  7. 规划写预期行为,进度写正在进行的动作,完成总结依据实际验证结果。导航方案写“采用自定义导航,支持各业务页面间切换”;完成配置并验证跳转后写“已启用自定义导航,可在各业务页面间切换”。
@@ -100,7 +100,7 @@ Fast / Plan 是面向用户的模式名称,可以展示。已有详细计划
100
100
  | ---------------- | ---------------------------------------------- | ---------------------------- | ----------------------------- |
101
101
  | 搭建方式 | `single_choice` | 按需求详细程度提供 PRD 是/否或 Fast/Plan | brief 的 `intake.designMode` |
102
102
  | 业务模块与页面范围 | `multi_choice` | 具体业务模块、对应页面、表单及用途,可合为一题 | brief 的 `coreFunctions/businessObjects/pageScenes/explicitScope` |
103
- | 导航归属与布局 | `single_choice` | 平台L型、平台顶部、平台侧边,以及自定义左侧、顶部浮导、顶部加左侧、底部悬浮菜单;一次选定归属和布局 | brief 的 `navigation`(自定义含 `variant`) |
103
+ | 导航归属 | `single_choice` | 仅“宜搭原生导航”和“自定义导航”两个选项;原生导航就是平台导航,布局根据场景确定 | brief 的 `navigation`(按场景补齐 `type`,自定义含 `variant`,`reason` 区分用户归属选择与布局依据) |
104
104
  | 应用设计风格 | `single_choice` | 面向业务的风格选项与自定义偏好 | brief 的 `visualSelection` |
105
105
  | 来源补齐 | `free_text` | 可读正文、链接或附件 | `meta.source` |
106
106
  | 最新搭建计划确认 | `confirm` | 当前版本、确认生成、继续调整 | `meta.planState` |
@@ -124,9 +124,9 @@ Fast / Plan 是面向用户的模式名称,可以展示。已有详细计划
124
124
 
125
125
  ## 首次搭建确认
126
126
 
127
- 先完成需求分析,再按 [首次搭建确认表](../../yida-requirement-analysis/workflow/prepare-brief.md#2-确认首次搭建的未决事项) 询问尚未明确的事项。该表统一维护详细计划复用、搭建方式、业务模块、导航归属与布局、风格和页面范围;已有业务应用的局部增改按本次疑问澄清。
127
+ 先完成需求分析,再按 [首次搭建确认表](../../yida-requirement-analysis/workflow/prepare-brief.md#2-确认首次搭建的未决事项) 询问尚未明确的事项。该表统一维护详细计划复用、搭建方式、业务模块、导航归属、风格和页面范围;已有业务应用的局部增改按本次疑问澄清。
128
128
 
129
- 首次搭建的全部未决事项在一次结构化提问调用中呈现并一次性作答,Fast / Plan、平台或自定义导航、导航布局、业务模块和页面范围不得分轮收集。导航选项直接包含归属和布局,不先选自定义导航再补问位置;每项必须按 [导航选项说明](../../yida-requirement-analysis/workflow/prepare-brief.md#导航选项说明) 附带布局及实现方式说明:平台L型、侧导、顶部均使用宜搭原生导航,自定义导航在自定义页面中实现、不使用宜搭原生导航。支持 `description` 时写入该字段,否则在选项后括号备注;“自定义导航”大类及顶部/侧边等布局不写“(推荐)”或“默认”,自定义顶部内部的样式默认推荐浮导,不增加确认轮次。工具限制问题数量时合并为复合问题,选项数量或多选能力不足时使用同组自由输入;没有可用结构化工具时,在一条消息中展示全部问题。具体合并方式遵守首次搭建确认表。用户明确的选择直接记录,全部必要回答写回后才开始后续规划。
129
+ 首次搭建的全部未决事项在一次结构化提问调用中呈现并一次性作答,Fast / Plan、导航归属、业务模块和页面范围不得分轮收集。导航仅提供“宜搭原生导航”和“自定义导航”两个选项,按 [导航选项说明](../../yida-requirement-analysis/workflow/prepare-brief.md#导航选项说明) 附带实现方式说明;宜搭原生导航就是平台导航。支持 `description` 时写入该字段,否则在选项后括号备注。顶部、侧边、L 型、浮导、底部菜单等布局或样式不进入 `ask_human`;Agent 在已选归属内根据场景确定,记录布局依据并交给后续规划,不补问位置。用户已明确的归属、布局或样式直接沿用。工具限制问题数量时合并为复合问题,多选能力不足时使用同组自由输入;没有可用结构化工具时,在一条消息中展示全部问题。具体合并方式遵守首次搭建确认表,全部必要回答写回后才开始后续规划。
130
130
 
131
131
  视觉映射统一写入 brief 的 `visualSelection`,由后续计划沿用 visualDirection、selectedTheme、colorStrategy、navigationStyle;未选候选保留在会话中。
132
132
 
@@ -1,59 +1,20 @@
1
- # 素材工作流:官网 / 品牌页的真实图片如何落地
1
+ # 图片素材落地
2
2
 
3
- > 官网、品牌首页、活动落地页需要真实产品或场景图时,由智能体准备素材,再统一交给 `openyida asset resolve` 解析和回填。绝不编造图片 URL。
3
+ `yida-design` 定义页面等级和槽位,`yida-image-assets` 准备素材,`asset resolve` 生成清单。
4
4
 
5
- ## 核心原则
5
+ ## 规则
6
6
 
7
- 1. **图片由智能体来源,不由 CLI 凭空生成**:`openyida ai` 只有文生文 / 识图,没有文生图。图片可以由智能体生成,也可以从免费可商用素材库获取。
8
- 2. **素材统一解析**:本地文件和外链都交给 `openyida asset resolve`;已配置 CDN 时可转存为稳定 URL。
9
- 3. **区分生产交付与离线展示**:没有 CDN 时不得声称素材已经上传;离线展示可使用受控压缩的 JPEG/WebP data URI,但不能把它当作生产资源方案。
10
- 4. **没有素材就诚实标注草稿**:用文字排版、数据图示或插画替代,并在交付说明中标注素材缺口。
7
+ 1. 先用用户素材,再从 Unsplash/Pexels 搜图,仍有缺口时使用宿主生图。
8
+ 2. 图片统一写入 manifest 草稿并通过 `asset resolve`。
9
+ 3. 按 `pages[].materialStatus` 判断当前页:`final` 可继续,`draft` 要补必需素材,`none` 无需图片。只使用该页 `assets[].materialStatus=final` 的 URL;总状态 `draft` 不阻塞其他页面。
11
10
 
12
- ## 执行流程
11
+ ## 命令
13
12
 
14
- 1. 运行 `openyida asset status --json`,了解当前素材能力。
15
- 2. 由智能体生成本地图片,或从 Unsplash、Pexels、Pixabay、unDraw 等免费可商用素材库取得图片直链。
16
- 3. 使用 `openyida asset resolve` 处理本地文件或外链,并回填 `spec.assets`。
17
- 4. 根据结果将 `materialStatus` 设为 `final`、`draft` 或 `none`;素材不足时保留草稿标记。
13
+ | 命令 | 作用 |
14
+ | --- | --- |
15
+ | `openyida asset status --json` | 检测宿主和 CDN 能力 |
16
+ | `openyida asset sources --json` | 查看来源规则 |
17
+ | `openyida asset resolve --input <草稿> --manifest <清单> --design <design.md> --json` | 校验全部槽位并写清单 |
18
+ | `openyida asset resolve --slot <slotId>=<路径或URL> --json` | 快速检查单个槽位 |
18
19
 
19
- ## 命令速查
20
-
21
- | 子命令 | 作用 | 关键参数 |
22
- |---|---|---|
23
- | `openyida asset status` | 检测 CDN、上传和素材生成能力 | `--online`、`--json` |
24
- | `openyida asset resolve` | 解析本地或外链素材,按能力转存并回填 | `--hero <url\|path>`、`--product <url\|path>`、`--require-hero`、`--upload-assets`、`--offline`、`--json` |
25
- | `openyida asset generate` | 输出素材来源引导和免费素材库清单 | `--json` |
26
-
27
- ## 示例
28
-
29
- 有 CDN 时:
30
-
31
- ```bash
32
- openyida asset status --json
33
- openyida asset resolve --hero ./hero.webp --upload-assets --json
34
- ```
35
-
36
- 使用外链时:
37
-
38
- ```bash
39
- openyida asset resolve --hero "https://images.unsplash.com/photo-xxxx" --json
40
- ```
41
-
42
- 暂无素材时:
43
-
44
- ```bash
45
- openyida asset resolve --offline --require-hero --json
46
- ```
47
-
48
- ## 设计落地
49
-
50
- 真实图片应服务于品牌叙事,而不是只填充 Hero。强视觉官网通常需要场景、产品或服务、过程或空间三类素材。完整策略写入当前项目的 `design.md.assetStrategy`。
51
-
52
- **严禁事项**:应用主题只在应用级配置,严禁页面代码向原生页面、父页面或平台容器写入主题样式。`YidaCodeCanvas` 的页面背景只在 `YidaComp` 内按 `design.md` 实现并消费应用 token。
53
-
54
- ## 离线展示
55
-
56
- - 建议仅内嵌 3–5 张关键图,长边约 1600–2000 px、质量 70–82。
57
- - 单张尽量不超过 250 KB,图片总量尽量不超过 800 KB。
58
- - 发布前检查源码与 `runtimeCode` 体积。
59
- - 生产项目应迁移到 CDN,禁止把所有图片都转成 base64。
20
+ `--offline` 禁止外链校验和上传。`--upload-assets` 只转存允许自托管的素材,Unsplash API 图片始终保留热链。
@@ -90,7 +90,7 @@ CLI 校验源事实,使用预置模板整批生成 `prd.md`、`design.md` 和
90
90
  "pageApplications": [
91
91
  {"pageId":"page-1","visualMemoryApplications":[{"name":"摘要拼接组","renderPolicy":"prd_match_only","target":"采购待办摘要","reason":"页面已有并列的待办状态"}]}
92
92
  ],
93
- "assetStrategy": {"materialStatus":"none","missingAssets":[],"notes":"使用业务内容,不添加装饰图片"}
93
+ "assetStrategy": {"materialStatus":"none","pages":[{"pageId":"page-1","imageNeed":"none","reason":"纯数据操作页","slots":[]}],"missingAssets":[],"notes":"无图片需求"}
94
94
  },
95
95
  "internal": {"selectedTheme":{"themeId":"airy-modular-clarity","source":"user_selected"}},
96
96
  "forDesignMd": {"productTopologyApplication":"工作台与表单共享主题,视觉重点绑定已有采购任务"}
@@ -142,7 +142,7 @@
142
142
 
143
143
  约束:
144
144
 
145
- - 计划生成前先确定应用范围与导航类型,再选择视觉方向。范围和导航不明时可合并询问,回答后生成遵守导航决策的视觉候选;每个问题必须有 `interactionId` 和 `writeBackPath`。
145
+ - 计划生成前先确定应用范围与导航类型,再选择视觉方向。范围和导航归属不明时可合并询问,导航选项仅为“宜搭原生导航”和“自定义导航”;原生导航即平台导航,顶部、侧边、L 型等布局由 Agent 按场景确定,不进入 `ask_human`。回答后生成遵守导航决策的视觉候选;每个问题必须有 `interactionId` 和 `writeBackPath`。
146
146
  - `questionType` 只取 `single_choice`、`multi_choice`、`free_text` 或最终计划使用的 `confirm`,不设置 AI 代填项中间确认类型。
147
147
  - 只有宽泛应用名称且缺少模块、场景、任务、流程和可读需求时才问应用范围。
148
148
  - 审批、角色权限、字段、首页、看板、页面和常规流程细节不进入 `ask_human`;用户已提供时承接,未提供时基于业务推断并在最终计划统一呈现。
@@ -390,10 +390,27 @@
390
390
  "iconSummary": "使用统一线性图标体系,具体图标在开发阶段映射。",
391
391
  "assetStrategy": {
392
392
  "materialStatus": "final | draft | none",
393
- "heroImage": "官网或品牌页需要;内部管理应用可为空",
394
- "productImages": [],
393
+ "pages": [
394
+ {
395
+ "pageId": "page-home",
396
+ "imageNeed": "required | beneficial | none",
397
+ "reason": "<图片用途>",
398
+ "slots": [
399
+ {
400
+ "slotId": "home.hero",
401
+ "usage": "hero | background | product | scene | cover | empty-state",
402
+ "count": 1,
403
+ "aspectRatio": "16:9",
404
+ "minSize": "1600x900",
405
+ "focus": "主体靠右",
406
+ "objectFit": "cover | contain",
407
+ "generationAllowed": true
408
+ }
409
+ ]
410
+ }
411
+ ],
395
412
  "missingAssets": [],
396
- "notes": "不得编造图片 URL;素材缺失时标记草稿"
413
+ "notes": "素材交给 yida-image-assets;缺口保持草稿"
397
414
  },
398
415
  "designMdReady": "已同步生成 design.md,后续 AI 开发读取完整设计契约。"
399
416
  },
@@ -922,8 +922,7 @@ def render_visual_details(data: dict[str, Any]) -> str:
922
922
  ("层次表达", visual.get("hierarchySummary")), ("组件形态", visual.get("componentToneSummary")),
923
923
  ("状态反馈", visual.get("stateSummary")), ("响应式布局", visual.get("responsiveSummary")),
924
924
  ("图标风格", visual.get("iconSummary")),
925
- ("素材现状", assets.get("materialStatus")), ("品牌素材", assets.get("brandAssets")),
926
- ("主视觉图片", assets.get("heroImage")), ("产品与案例图片", assets.get("productImages")),
925
+ ("素材现状", assets.get("materialStatus")), ("页面素材", assets.get("pages")),
927
926
  ("素材缺口", assets.get("missingAssets")), ("素材说明", assets.get("notes")),
928
927
  ]
929
928
  profile = visual.get("themeProfile") or {}
@@ -32,7 +32,7 @@ ALLOWED_PLACEHOLDERS = {
32
32
  "PRODUCT_TOPOLOGY_APPLICATION",
33
33
  "PAGE_PATTERN_SUMMARY",
34
34
  "PAGE_APPLICATIONS",
35
- "BRAND_ASSETS",
35
+ "PAGE_IMAGE_NEEDS",
36
36
  "ASSET_GAPS",
37
37
  }
38
38
 
@@ -56,7 +56,7 @@
56
56
  | `{{PRODUCT_TOPOLOGY_APPLICATION}}` | `visualStyle.forDesignMd.productTopologyApplication` |
57
57
  | `{{PAGE_PATTERN_SUMMARY}}` | `pages.customPageDetails[]` 的页面模式与内容丰富度摘要 |
58
58
  | `{{PAGE_APPLICATIONS}}` | materialize 根据页面事实、主题标准和 `visualStyle.forUser.pageApplications[].visualMemoryApplications` 生成的完整逐页应用 |
59
- | `{{BRAND_ASSETS}}` | 已有品牌与真实素材摘要 |
59
+ | `{{PAGE_IMAGE_NEEDS}}` | 页面图片等级和槽位摘要 |
60
60
  | `{{ASSET_GAPS}}` | `visualStyle.forUser.assetStrategy.missingAssets` |
61
61
 
62
62
  模板中的 `<基于……生成的实际色值>` 和 `<由……生成的实际色值>` 是 Token 推导指令。生成项目 `design.md` 时必须替换成具体 CSS 色值。
@@ -274,7 +274,7 @@ tokens:
274
274
 
275
275
  ### 素材要求
276
276
 
277
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
277
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
278
278
  - 素材缺口:{{ASSET_GAPS}}
279
279
  - 媒体素材必须来自真实授权来源,优先使用透明背景或干净轮廓素材;没有素材时使用中性图标或结构化占位,不编造品牌、对象、名称、类别或图片地址。
280
280
 
@@ -285,7 +285,7 @@ metric-primary → tokens.custom-page.typography.metric-primary
285
285
 
286
286
  ### 素材要求
287
287
 
288
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
288
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
289
289
  - 素材缺口:{{ASSET_GAPS}}
290
290
  - 图片、图表、缩略图和辅助图形必须有真实来源;没有素材时使用结构化数据或中性占位,不编造客户、对象、指标或图片地址。
291
291
 
@@ -289,7 +289,7 @@ metric-emphasis → tokens.custom-page.typography.metric-emphasis
289
289
 
290
290
  ### 素材要求
291
291
 
292
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
292
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
293
293
  - 素材缺口:{{ASSET_GAPS}}
294
294
  - 数据图表、产品缩略图和辅助图形必须有真实来源;没有素材时使用结构化数据或中性占位,不编造客户、商品、指标或图片地址。
295
295
 
@@ -280,7 +280,7 @@ tokens:
280
280
 
281
281
  ### 素材要求
282
282
 
283
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
283
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
284
284
  - 素材缺口:{{ASSET_GAPS}}
285
285
  - 头像、图标、图表与缩略素材必须有真实授权来源;没有头像时使用首字母或中性图标,不编造人物、联系方式、状态、指标或图片地址。
286
286
 
@@ -294,7 +294,7 @@ data-emphasis → tokens.custom-page.typography.data-emphasis
294
294
 
295
295
  ### 素材要求
296
296
 
297
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
297
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
298
298
  - 素材缺口:{{ASSET_GAPS}}
299
299
  - 图标、图表数据、头像、缩略内容和辅助图形必须有真实来源;没有素材时使用中性占位,不编造人物、机构、指标、联系方式、品牌或外部资源地址。
300
300
 
@@ -307,7 +307,7 @@ tokens:
307
307
 
308
308
  ### 素材要求
309
309
 
310
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
310
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
311
311
  - 素材缺口:{{ASSET_GAPS}}
312
312
  - 图片、图表、缩略图和辅助图形必须有真实来源;没有素材时使用结构化数据或中性占位,不编造客户、对象、指标或图片地址。
313
313
 
@@ -290,7 +290,7 @@ tokens:
290
290
 
291
291
  ### 素材要求
292
292
 
293
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
293
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
294
294
  - 素材缺口:{{ASSET_GAPS}}
295
295
  - 图片、图表、缩略图和辅助图形必须有真实来源;缺少素材时使用结构化数据或中性占位,不编造人物、账户、凭证、指标、状态或图片地址。
296
296
 
@@ -326,7 +326,7 @@ tokens:
326
326
 
327
327
  ### 素材要求
328
328
 
329
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
329
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
330
330
  - 素材缺口:{{ASSET_GAPS}}
331
331
  - 图片、图表、缩略图和辅助图形必须有真实来源;没有素材时使用结构化数据或中性占位,不编造对象、指标、状态、记录或图片地址。
332
332
 
@@ -300,7 +300,7 @@ metric-secondary → tokens.custom-page.typography.metric-secondary
300
300
 
301
301
  ### 素材要求
302
302
 
303
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
303
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
304
304
  - 素材缺口:{{ASSET_GAPS}}
305
305
  - 图标、图表、对象缩略内容和辅助图形必须有真实来源;没有素材时使用结构化数据或中性占位,不编造客户、商品、指标、品牌或外部资源地址。
306
306
 
@@ -285,7 +285,7 @@ tokens:
285
285
 
286
286
  ### 素材要求
287
287
 
288
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
288
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
289
289
  - 素材缺口:{{ASSET_GAPS}}
290
290
  - 图片、图表、缩略图和辅助图形必须有真实来源;缺少素材时使用结构化数据或中性占位,不编造人物、对象、指标、状态或图片地址。
291
291