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
@@ -282,7 +282,7 @@ tokens:
282
282
 
283
283
  ### 素材要求
284
284
 
285
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
285
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
286
286
  - 素材缺口:{{ASSET_GAPS}}
287
287
  - 图片、图表、缩略图和辅助图形必须有真实来源;缺少素材时使用结构化数据或中性占位,不编造人物、对象、指标、状态或图片地址。
288
288
 
@@ -317,7 +317,7 @@ tokens:
317
317
 
318
318
  ### 素材要求
319
319
 
320
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
320
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
321
321
  - 素材缺口:{{ASSET_GAPS}}
322
322
  - 图片、缩略图、图表与辅助图形必须有真实来源,并标明授权与裁切要求;没有素材时使用固定比例中性占位,不编造对象、图片、价格、品牌、状态或图片地址。
323
323
 
@@ -282,7 +282,7 @@ tokens:
282
282
 
283
283
  ### 素材要求
284
284
 
285
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
285
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
286
286
  - 素材缺口:{{ASSET_GAPS}}
287
287
  - 地图、拓扑、图标、图表和缩略内容必须有真实来源;没有素材时使用结构化数据或中性占位,不编造对象、地点、指标或图片地址。
288
288
 
@@ -287,7 +287,7 @@ tokens:
287
287
 
288
288
  ### 素材要求
289
289
 
290
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
290
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
291
291
  - 素材缺口:{{ASSET_GAPS}}
292
292
  - 头像、图标、图表、缩略对象和辅助图形必须有真实授权来源;没有素材时使用中性占位或移除相应层,不编造人物、项目、事件、指标或图片地址。
293
293
 
@@ -172,7 +172,7 @@ tokens:
172
172
 
173
173
  ## 字体与排版
174
174
 
175
- - 全局使用 `tokens.application-global.typography.base` 的等宽字体栈;若项目提供合法的品牌点阵字体,由 `{{BRAND_ASSETS}}` 声明并置于同一回退栈首位。
175
+ - 全局使用 `tokens.application-global.typography.base` 的等宽字体栈;若项目提供合法的品牌点阵字体,将其置于同一回退栈首位。
176
176
  - `page-title` 使用 `tokens.application-global.typography.subhead`:24px / 600 / 1.3 / 0.01em;普通页面不得新增超大展示标题。
177
177
  - `panel-title` 使用 `tokens.application-global.typography.body-2`:16px / 600 / 1.4 / 0.025em;可使用大写处理,但不得改变真实专名的大小写。
178
178
  - `content-title` 和正文使用 `tokens.application-global.typography.body-1`:14px / 400 / 1.5 / 0.015em。
@@ -323,7 +323,7 @@ tokens:
323
323
 
324
324
  ### 素材要求
325
325
 
326
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
326
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
327
327
  - 素材缺口:{{ASSET_GAPS}}
328
328
  - 图片、图表、缩略图、字体和辅助图形必须有真实来源;没有素材时使用系统等宽字体、结构化数据或中性占位,不编造人物、指标、对话、评分、图表或图片地址。
329
329
 
@@ -320,7 +320,7 @@ tokens:
320
320
 
321
321
  ### 素材要求
322
322
 
323
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
323
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
324
324
  - 素材缺口:{{ASSET_GAPS}}
325
325
  - 图片、图表、缩略图和辅助图形必须有真实来源;没有素材时使用结构化数据或中性占位,不编造对象、指标、记录、分类或图片地址。
326
326
 
@@ -325,7 +325,7 @@ tokens:
325
325
 
326
326
  ### 素材要求
327
327
 
328
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
328
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
329
329
  - 素材缺口:{{ASSET_GAPS}}
330
330
  - 图片、图表、缩略图和辅助图形必须有真实来源;没有素材时使用结构化数据或中性占位,不编造对象、指标、图片地址或事件。
331
331
 
@@ -277,7 +277,7 @@ tokens:
277
277
 
278
278
  ### 素材要求
279
279
 
280
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
280
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
281
281
  - 素材缺口:{{ASSET_GAPS}}
282
282
  - 图片、图表、缩略图和辅助图形必须有真实来源;缺少素材时使用结构化数据或中性占位,不编造对象、指标、等级或图片地址。
283
283
 
@@ -293,7 +293,7 @@ tokens:
293
293
 
294
294
  ### 素材要求
295
295
 
296
- - 已有品牌与真实素材:{{BRAND_ASSETS}}
296
+ - 页面图片需求:{{PAGE_IMAGE_NEEDS}}
297
297
  - 素材缺口:{{ASSET_GAPS}}
298
298
  - 图片、图表、缩略图和辅助图形必须有真实来源;没有素材时使用结构化数据或中性占位,不编造客户、对象、指标或图片地址。
299
299
 
@@ -17,6 +17,10 @@
17
17
 
18
18
  `sceneKey` 必须直接取自 `requirement-brief.json` 的对应 `pageScenes`:对象项使用其 `key`,字符串项原样使用;`yida-prd` 和 `yida-design` 不得各自改写、翻译或重新生成。`componentName` 和 `stateName` 必须与本文件 frontmatter 中的实际 key 完全一致。一致性校验只检查这些稳定标识,不使用标题文本或自然语言近似匹配。
19
19
 
20
+ ## 图片素材交接
21
+
22
+ `assetStrategy.pages[]` 记录页面等级和图片槽位。槽位包含用途、数量、比例、尺寸、焦点、填充方式和生成许可。需要图片时交给 `yida-image-assets`;无图片需求时写 `imageNeed: none`。在 frontmatter 中用单行 JSON 写出完整 `assetStrategy`,不能只保留槽位数量。`--design design.md` 会读取该字段核对素材。格式见 [素材清单契约](../../yida-image-assets/references/manifest-contract.md)。
23
+
20
24
  ## 应用主题 CSS 的职责
21
25
 
22
26
  `app-theme.css` 是当前应用的主题资源产物,承载品牌色阶、语义色、字体、间距、圆角、阴影,以及 Shell、导航、页面、表单、表格和浮层的主题 token 与必要样式覆盖。`app_theme.css` 等其他 `.css` 文件名同样可用;CLI 根据 `--theme-file` 路径读取内容,不靠固定文件名识别用途。Plan 使用 `outputs.theme`,其他流程使用已记录的产物路径,避免生成多份后上传错文件。
@@ -13,7 +13,7 @@
13
13
 
14
14
  ## 自定义导航设计
15
15
 
16
- 沿用需求阶段确认的导航归属和布局,参考 [导航壳形态目录](../../yida-nav-shell/references/nav-shell-patterns.md) 设计位置、比例、留白与选中态,代码示例只按需参考。顶部默认浮导;侧导及顶部+侧边布局写清折叠/展开、恢复宽度、拖拽边界、内容区联动和移动端收起方式。已有满意的导航保留外观,只补缺失交互。
16
+ 沿用需求阶段用户选择的导航归属,以及根据场景确定或用户指定的布局;不再询问顶部、侧边等布局选项。参考 [导航壳形态目录](../../yida-nav-shell/references/nav-shell-patterns.md) 设计位置、比例、留白与选中态,代码示例只按需参考。顶部默认浮导;侧导及顶部+侧边布局写清折叠/展开、恢复宽度、拖拽边界、内容区联动和移动端收起方式。已有满意的导航保留外观,只补缺失交互。
17
17
 
18
18
  区分三种操作:本页视图切换、保留导航并更新主内容 iframe、当前标签跨页跳转。管理入口使用 workbench,办理入口使用 submission;不要把应用级办理导航设计为每次弹抽屉。页面内新增/详情按钮才采用下面的抽屉规则。设计结果写入当前 `design.md`;Plan 模式先更新计划源事实再物化。
19
19
 
@@ -72,7 +72,8 @@
72
72
 
73
73
  - 官网、产品首页、品牌页、视觉化工作台默认要有真实图片或生成图片。
74
74
  - 强视觉官网至少形成“场景 Hero + 产品/服务 + 过程/空间”的素材故事。
75
- - 素材暂缺时标注 draft,并写清缺口,例如 heroImage、productImages、brandLogo、caseImages。
75
+ - 素材暂缺时标注 `draft`,并按 `slotId` 写清缺口。
76
+ - 逐页写 `imageNeed: required|beneficial|none`;需要图片时列出槽位、比例、尺寸、焦点、填充方式和生成许可。
76
77
  - 图标只使用 `lucide-react` 或 `@ant-design/icons`,默认使用 `lucide-react`。在 `design.md` 中输出 `iconSystem`、尺寸、描边/Outlined 风格、`actionIconMap`、`statusIconMap`、`navigationIconMap` 和 `emptyStateIconMap`,把新增、查询、刷新、查看、入库、出库、组织、告警、完成等业务语义映射到具体图标组件。emoji 不能退成 CSS 形状、字母占位、Unicode 符号或临时 SVG。
77
78
 
78
79
  ## 5. 检查页面是否像真实产品
@@ -0,0 +1,91 @@
1
+ ---
2
+ name: yida-image-assets
3
+ description: >
4
+ 宜搭页面需要图片时使用。根据设计槽位选图、上传宜搭图片附件、补齐失败项,输出可按页面使用的 asset-manifest.json。
5
+ ---
6
+
7
+ # 准备页面图片
8
+
9
+ 输入是 `design.md.assetStrategy`,输出是 `prd/<项目名>/asset-manifest.json`。按已有设计准备图片,不改业务需求和视觉方案。
10
+
11
+ `asset resolve` 负责下载和上传图片,不负责搜索或生图。搜索、生图、看图由当前宿主工具完成。
12
+
13
+ ## 1. 确定哪些页面需要图片
14
+
15
+ 读取 `assetStrategy.pages[]`,按 `pageId` 找页面,按 `slotId` 找图片位置。
16
+
17
+ | imageNeed | 常见页面 | 怎么做 |
18
+ | --- | --- | --- |
19
+ | `required` | 品牌、营销、商品目录、菜单、封面、作品展示 | 准备设计要求的图片;缺图时该页面保持草稿 |
20
+ | `beneficial` | 门户、工作台、知识库、引导页、空态 | 有槽位就准备图片;没有槽位则跳过 |
21
+ | `none` | 表单、审批、财务、权限、设置、CRUD 台账、统计 | 跳过素材采集,使用图标、图表和排版 |
22
+
23
+ 完整应用必须有设计槽位。设计缺失时交回 `yida-design` 补齐,不用空清单代替。多个图片位置使用不同的 `slotId`;`count > 1` 的展开规则见 [清单契约](references/manifest-contract.md)。
24
+
25
+ ## 2. 检查当前能用的工具
26
+
27
+ 运行 `openyida agent-capabilities --summary-json`,分别查看 `online_search`、`image_search`、`image_generation`。
28
+
29
+ - `unavailable`:跳过这项能力。
30
+ - `unknown` 或 `requires_host_tool_inventory_check=true`:检查当前宿主工具清单。
31
+ - `available`:使用实际存在的对应工具;若工具不存在,按不可用处理。CLI 的运行环境默认值不能代替工具调用结果。
32
+
33
+ 没有搜图或生图能力时,使用用户已提供的素材;仍缺图就记录缺口,继续不依赖这些图片的页面。
34
+
35
+ ## 3. 选图并查看
36
+
37
+ 按以下顺序准备每个槽位:
38
+
39
+ 1. 用户提供的本地图片或图片链接,记录 `source=user`。
40
+ 2. 从 **Unsplash / Pexels** 搜索,记录 `source=search`。图库采集仅支持这两个网站。
41
+ 3. 槽位允许生成、且宿主有生图工具时生成图片,记录 `source=generated`、`isIllustrative=true`。
42
+ 4. 仍无合适图片时保留缺口。可用中性占位说明缺图,但不能把占位记为已完成素材。
43
+
44
+ 查看实际图片,确认内容、比例、清晰度和主体位置适合槽位。商品、房源、人员、案例图片表达业务事实,不能用生成图冒充真实对象。
45
+
46
+ 采集图库素材前读 [来源规则](references/source-policy.md):图库图片保留来源页、摄影师、许可、署名和真实下载动作记录。只选择允许下载和转存的图片。不编造图片 URL、来源或下载记录。
47
+
48
+ ## 4. 写草稿并上传
49
+
50
+ 按 [清单契约](references/manifest-contract.md) 写 `manifest-draft.json`。每项填写 `slotId`、`input`、`source`、`alt` 和对应来源信息;尺寸由 CLI 实际读取,不靠手填宽高通过校验。
51
+
52
+ ```bash
53
+ openyida asset resolve --input <草稿> --manifest <asset-manifest.json> --design <design.md> --app-type <真实appType> --json
54
+ ```
55
+
56
+ 上传前需要有效宜搭登录态和目标应用 `appType`。已有应用直接使用;尚未创建应用时先选图、保存草稿,等应用创建后再执行上传。不编造 appType。省略 `--app-type` 时 CLI 读取当前项目 `config.json.appType`。
57
+
58
+ 默认按以下规则落地,不需要配置自有 CDN,也不需要加 `--upload-assets`:
59
+
60
+ 1. **不超过 20 MiB(20 × 1024 × 1024 字节)**:外链先下载,本地图直接使用;通过宜搭 `ImageField` 附件上传,取得公开图片链接后直接写入清单,不再额外请求原图或上传地址做可用性校验。
61
+ 2. **超过 20 MiB**:外链保留原始 `input` 链接,不上传。CLI 检查响应大小和实际下载大小;下载中超过限制立即停止并清理临时文件。
62
+ 3. **大于限制的本地图**:没有原始外链可回退,保持 `draft`;补原始图片 URL 或换成较小图片。
63
+ 4. **下载失败**:跳过该素材,不重试、不上传、不回退失败外链;记录缺口,需要时换图。登录或上传失败同样记录缺口,不把临时签名链接当公开链接。
64
+
65
+ `--design` 核对全部设计槽位、页面归属和最小尺寸。漏项自动成为缺口,重复或未声明的槽位会报错。格式和尺寸从本次下载内容读取,来源从草稿记录读取,不额外联网校验。
66
+
67
+ ## 5. 处理结果和补图
68
+
69
+ - 退出码 `0`:本次清单为 `final` 或 `none`。
70
+ - 退出码 `2`、`ASSET_MATERIAL_NOT_FINAL`:清单已写入,但仍有缺口。读取 `gaps`,只修失败项;其他错误先修参数或输入文件。
71
+ - 缺原图就补 `input`,尺寸不够就换图,缺来源信息就补真实记录;不要手动改状态为 `final`。
72
+
73
+ 修改上次清单中的失败项后重跑:
74
+
75
+ ```bash
76
+ openyida asset resolve --input asset-manifest.json --manifest asset-manifest.json --design design.md --app-type <真实appType> --json
77
+ ```
78
+
79
+ 清单保留原始输入和尺寸要求。CLI 在原图内容未变时直接复用已有宜搭附件链接,不额外联网探测。更换素材时修改 `input`,不要只修改输出 `url`。`--offline` 不联网、不上传,离线处理的图片仍保持草稿。
80
+
81
+ ## 6. 交给页面使用
82
+
83
+ 读取 `pages[]` 中当前 `pageId` 的 `materialStatus`:
84
+
85
+ - `final`:当前页面可继续;只使用该页 `assets[]` 中 `materialStatus=final` 的图片 URL。
86
+ - `draft`:当前页面仍缺必需素材,先补图。
87
+ - `none`:当前页面没有图片槽位,直接继续。
88
+
89
+ 根级 `materialStatus` 表示全部素材是否齐备。它是 `draft` 时,已为 `final` 的页面仍可继续。`required=false` 的槽位失败不阻塞页面,但该图片不能使用;采用设计允许的无图布局。
90
+
91
+ 交付时说明:哪些页面已就绪、哪些页面缺图、每个缺口需要补什么。上传成功后,仍要确认图片内容适合页面。
@@ -0,0 +1,87 @@
1
+ # 素材清单契约
2
+
3
+ ## 设计槽位
4
+
5
+ Fast 和 Plan 都在 `design.md` 的 frontmatter 中写一行 JSON 格式的 `assetStrategy`。例如:
6
+
7
+ ```yaml
8
+ ---
9
+ assetStrategy: {"pages":[{"pageId":"home","imageNeed":"required","slots":[{"slotId":"home.hero","usage":"hero","minSize":"1600x900","required":true,"generationAllowed":true}]}]}
10
+ ---
11
+ ```
12
+
13
+ 实际文件保留原有主题等 frontmatter 字段。CLI 的 `--design` 读取这行 JSON;不要改成多行 YAML 对象。
14
+
15
+ - 每页必须有唯一 `pageId`、`imageNeed` 和 `slots` 数组;每个槽位必须有唯一 `slotId` 和 `usage`。
16
+ - 一个槽位对应一张图。`count` 默认 `1`;若为 `3`,CLI 展开为 `slotId[0]`、`slotId[1]`、`slotId[2]`,草稿使用展开后的 ID。`count` 支持 1–100。
17
+ - `required` 默认 `true`。仅在设计允许无图布局时设为 `false`。
18
+ - `minSize` 格式为 `宽x高`,如 `1600x900`;也可写非负整数 `minWidth/minHeight`。草稿不能降低设计的最小尺寸。
19
+ - `generationAllowed=false` 的槽位不接受 `source=generated`。
20
+ - `imageNeed=none` 的页面写空 `slots`;`required` 页面没有槽位时保持 `draft`。
21
+
22
+ ## 输入草稿
23
+
24
+ 根字段为 `assets` 数组。用户图片和生成图片只需基础字段;图库图片还要填写来源信息。
25
+
26
+ ```json
27
+ {
28
+ "assets": [{
29
+ "slotId": "home.hero",
30
+ "usage": "hero",
31
+ "input": "./assets/home-hero.png",
32
+ "source": "user",
33
+ "alt": "团队在会议室讨论方案"
34
+ }]
35
+ }
36
+ ```
37
+
38
+ `input` 可用本地路径或 HTTP(S) 图片 URL。本地相对路径相对于运行命令的工作目录;跨目录重跑使用绝对路径。不要写搜索结果页、网页地址或未生成的文件路径。
39
+
40
+ | source | 额外字段 |
41
+ | --- | --- |
42
+ | `user` | 用户提供的图片;保留实际用途 |
43
+ | `generated` | `isIllustrative=true`;查看实际生成结果 |
44
+ | `search` | `provider` 仅 `unsplash` 或 `pexels`;填写 `sourcePage`、`creator`、`license`、`attribution` |
45
+ | Unsplash 搜索结果 | 另填 `downloadLocation`、`downloadTracked=true`;只有真实完成下载动作记录后才能写 true |
46
+
47
+ ```bash
48
+ openyida asset resolve --input manifest-draft.json --manifest asset-manifest.json --design design.md --app-type <真实appType> --json
49
+ ```
50
+
51
+ 完整应用始终带 `--design`,以最新设计为准。独立检查单张图片可以省略 `--design`,但它只证明传入素材的状态,不证明应用槽位齐备。`--slot home.hero=<路径或URL> --source user` 适合快速检查,缺少用途、alt 等元数据时仍为 `draft`。
52
+
53
+ 图片默认下载后上传宜搭 `ImageField` 附件,再换取公开链接;下载前后和上传后均不额外发送 URL 探测请求。`input` 始终保留原图,`url` 是页面使用的最终链接;上传不改变 `source` 的来源分类。超过 20 MiB 的外链直接保留 `input`,不用上传;20 MiB 整仍上传。`--upload-assets` 仅兼容旧命令,已无需手动指定。
54
+
55
+ ## 输出和重跑
56
+
57
+ 输出 `schemaVersion=2`:
58
+
59
+ | 字段 | 含义 |
60
+ | --- | --- |
61
+ | `materialStatus` | 全部素材的总状态:`final` / `draft` / `none` |
62
+ | `assetStrategy` | 本次设计要求;重跑时保留。再次传 `--design` 时以设计文件覆盖 |
63
+ | `pages[]` | 每页的 `pageId`、`imageNeed`、`slotIds`、`materialStatus`、`gaps` |
64
+ | `assets[]` | 每张图的原始 `input`、页面/槽位 ID、尺寸要求、来源信息、实际宽高、落地 URL、`materialStatus`、`gaps` |
65
+ | `assets[].delivery` | CLI 生成的交付记录,用于内容比较和宜搭附件复用;`source=yida-attachment` 表示上传,`source=external` 且 `reason=ASSET_TOO_LARGE` 表示超限保留原链接;保留原样,不手工构造 |
66
+ | `gaps` | 全部缺口,按 `pageId/slotId` 定位 |
67
+ | `capabilityEvidence` | 宿主能力声明、`uploadTarget`、`maxUploadBytes` 和本次联网开关;旧 `cdnConfigured` 仅兼容字段,不决定上传能力 |
68
+
69
+ 每张图取得公开 URL(或超限时保留原链接)、实际尺寸及所需元数据齐全时才为 `final`。不支持解析的格式或无法读取尺寸的图片保持 `draft`,应换成可验证的 PNG、JPEG、WebP 等格式。
70
+
71
+ 页面必需槽位全部为 `final` 时页面可继续;可选槽位失败仍记录缺口,但不阻塞页面。根状态保留 `draft`,便于继续补图。
72
+
73
+ 缺图后可以直接编辑输出清单,再把它同时作为 `--input` 和 `--manifest`。失败项保留原始 `input` 和尺寸要求;成功项在原图内容未变时直接复用附件链接。旧版清单仍可作为输入,但缺失的原始输入需人工补齐,首次重跑不保证复用旧上传结果。
74
+
75
+ | 缺口/错误 | 处理方式 |
76
+ | --- | --- |
77
+ | `EMPTY` / `NOT_FOUND` | 补正确的图片输入路径或 URL |
78
+ | `INVALID_IMAGE_CONTENT` / `NOT_IMAGE_FILE` / `DIMENSIONS_UNAVAILABLE` | 换成可读取格式与尺寸的真实图片;不要手填宽高绕过 |
79
+ | `WIDTH_TOO_SMALL` / `HEIGHT_TOO_SMALL` | 换更大图片 |
80
+ | `MISSING_METADATA` | 按缺失字段补用途、alt 或真实来源记录 |
81
+ | `ASSET_APP_TYPE_REQUIRED` | 传入真实 `--app-type`,或在当前项目配置 appType |
82
+ | `ASSET_TOO_LARGE_NO_ORIGINAL_URL` | 本地图超过 20 MiB,补原始图片 URL 或换小图 |
83
+ | `ASSET_ATTACHMENT_URL_INVALID` | 上传接口未返回 HTTP(S) 公开链接,排查转换接口;不使用签名下载地址 |
84
+ | `ASSET_DUPLICATE_SLOT` / `ASSET_UNDECLARED_SLOT` | 修正槽位 ID,使其与设计一致 |
85
+ | `MISSING_PAGE_SLOTS` / `ASSET_DESIGN_INVALID` | 回到设计阶段补齐或修正 `assetStrategy` |
86
+ | 下载错误(如 `HTTP_404`、`TIMEOUT`) | 本次跳过,不上传、不使用原链接;需要该图时换 `input` |
87
+ | 登录、上传、离线错误 | 恢复相应能力后,用保留的原始输入重跑 |
@@ -0,0 +1,19 @@
1
+ # 图片来源与落地规则
2
+
3
+ 选图时使用;上线前核对官方条款。
4
+
5
+ | 来源 | 搜索/使用规则 | 页面落地 |
6
+ | --- | --- | --- |
7
+ | 用户提供 | 确认使用权,保留用途说明 | 本地图直接上传宜搭附件;授权外链下载后上传,不改变真实对象含义 |
8
+ | Agent 生成 | 用于背景、抽象视觉、空态和示意图 | 查看后上传;标记 `isIllustrative=true` |
9
+ | [Unsplash API](https://help.unsplash.com/en/articles/2511245-unsplash-api-guidelines) | 保留署名;API 选用时请求 `download_location`,遵守对应获取方式的使用条款 | 选取允许下载和转存的素材,再上传宜搭附件 |
10
+ | [Pexels API](https://www.pexels.com/api/documentation/) | 保留 Pexels 链接,尽可能署名摄影师 | 下载后上传宜搭附件 |
11
+
12
+ ## 通用门禁
13
+
14
+ - 记录 `provider/sourcePage/creator/license/attribution`;Unsplash 另记 `downloadLocation/downloadTracked`。
15
+ - 搜索素材使用 `source=search`,只接受 `provider=unsplash|pexels`;用户授权外链使用 `--source user`。
16
+ - 品牌、人物和敏感场景记录授权与真实关系。
17
+ - 背景图检查文字对比度;商品图用 `contain`;场景图用 `cover` 并记录焦点。
18
+ - 默认上传宜搭图片附件;外链超过 20 MiB 才保留原链接。下载失败直接跳过并记录缺口;上传失败保持草稿。
19
+ - API 或具体授权要求热链且不允许转存时,改选允许转存的素材;不要把更换托管地址当作取得授权。
@@ -14,7 +14,7 @@
14
14
  | 悬浮胶囊 / Dock | 沉浸展示、轻量门户,减少常驻导航占位 | 3–6 项 | 底部胶囊或可收起菜单 |
15
15
  | 标签页 | 同一模块的同级视图,不替代应用主导航 | 2–8 项 | 横向滚动 |
16
16
 
17
- 数量是布局参考,不是增删业务模块的依据。需求已确认导航归属和形态后直接落地;不为这些样式再发起一轮提问。
17
+ 数量是布局参考,不是增删业务模块的依据。用户选择自定义导航后,由 Agent 按场景确定形态,用户已指定的形态优先;不把形态拆成导航提问选项,也不为这些样式再发起一轮提问。
18
18
 
19
19
  ## 通用设计要点
20
20
 
@@ -24,11 +24,11 @@
24
24
 
25
25
  | 配置项 | 值 |
26
26
  | --- | --- |
27
- | 导航类型 | <平台L型导航 / 平台顶部导航 / 平台侧边导航 / 自定义导航;必须明确选择> |
27
+ | 导航类型 | <平台L型导航 / 平台顶部导航 / 平台侧边导航 / 自定义导航;按用户选择的归属和场景确定具体布局> |
28
28
  | 是否使用平台应用导航 | <前三种为是,自定义导航为否> |
29
29
  | 页面导航配置 | <自定义导航:列出本轮全部表单、流程表单、自定义页面及需配置的其他页面,统一隐藏平台页面导航;平台导航:保留页面设置,明确独立入口例外> |
30
30
 
31
- 导航方案说明页面入口和跨页切换方式;导航配色单独说明深色或浅色。
31
+ 用户仅选择宜搭原生导航(即平台导航)或自定义导航;上表记录可执行方案,平台顶部、侧边、L 型以及自定义布局由 Agent 根据场景确定,用户已指定的布局优先。导航方案区分用户选择的归属与布局判断依据,说明页面入口和跨页切换方式;导航配色单独说明深色或浅色。
32
32
 
33
33
  ## 3. 数据结构(业务语义,不含细节 ID)
34
34
 
@@ -34,7 +34,7 @@ description: 配置已有流程表单审批规则。
34
34
  - 配置前先用 `yida-get-schema` 获取所有字段 ID
35
35
  - 流程定义 JSON 必须用结构化文件写入工具创建到 `<projectRoot>/.cache/openyida/<项目名或任务名>/`,不要在仓库根目录、系统临时目录或 `.cache/` 顶层生成 `process-definition.json` 等临时文件
36
36
  - 必须以表单 binding 只读结果证明 `processCode` 属于目标 `formUuid`;`CONFIGURE_PROCESS_OWNERSHIP_UNVERIFIED` 时停止,不得换一个 processCode 猜测重试
37
- - 命令成功必须同时返回 `verificationLevel: "PLATFORM_VIEW_VERIFIED"` 和 `platformViewVerified: true`;这只证明平台可见 view 的节点、组件、名称、顺序和审批模式,不代表平台返回了可独立验证的 `processJson`
37
+ - 命令成功必须同时返回 `verificationLevel: "PLATFORM_VIEW_VERIFIED"` 和 `platformViewVerified: true`;这只证明平台可见 view 的节点、组件、名称、顺序、审批模式及按钮权限和加签参数,不代表平台返回了可独立验证的 `processJson`
38
38
 
39
39
  ## 适用场景
40
40
 
@@ -173,6 +173,7 @@ OpenYida 会自动兼容常见别名:
173
173
  | `approver` | String/Object | 是 | 审批人。`"originator"` 表示发起人;Object 支持 `user`、`role`、`deptLeader`、`directLeader`,也可传入宜搭流程设计器的原始审批人配置 |
174
174
  | `description` | String | 否 | 节点描述 |
175
175
  | `formConfig` | Object | 否 | 字段权限配置 |
176
+ | `actions` | Object | 否 | 操作权限,包含 `normalActions` 和 `appendActions`,见下文 |
176
177
  | `routeRules` | Array | 否 | 跳转规则 |
177
178
 
178
179
  ### 办理 / 填写节点(operator)
@@ -281,6 +282,10 @@ OpenYida 会自动兼容常见别名:
281
282
  | `In` | 属于 | SelectField, RadioField |
282
283
  | `NotIn` | 不属于 | SelectField, RadioField |
283
284
 
285
+ ### 加签和转交(actions)
286
+
287
+ CLI 支持通过 `node.actions.normalActions/appendActions` 同时生成按钮和完整加签参数。需要开启加签或转交时,先阅读 [操作权限配置](references/approval-actions.md);不要仅修改原始 JSON 的 `hidden`。未配置时保持历史默认权限。
288
+
284
289
  ### 字段权限配置(formConfig)
285
290
 
286
291
  ```json
@@ -0,0 +1,48 @@
1
+ # 加签和转交(actions)
2
+
3
+ 适用于 `approval`、`operator` 和 `multiApproval` 节点。加签和转交可以通过 CLI 配置;必须由编译器同时生成设计器配置和运行配置,不能只改 `hidden` 后直接提交原始流程 JSON。
4
+
5
+ ```json
6
+ {
7
+ "type": "approval",
8
+ "key": "purchase_approval",
9
+ "name": "采购审批",
10
+ "approver": "originator",
11
+ "actions": {
12
+ "normalActions": [
13
+ { "action": "forward", "hidden": false },
14
+ {
15
+ "action": "append",
16
+ "hidden": false,
17
+ "appendPosition": ["BEFORE_APPEND", "AFTER_APPEND"],
18
+ "appendResult": "valid"
19
+ }
20
+ ],
21
+ "appendActions": [
22
+ { "action": "forward", "hidden": false },
23
+ { "action": "append", "hidden": false }
24
+ ]
25
+ }
26
+ }
27
+ ```
28
+
29
+ - `normalActions` 是普通审批人的按钮;`appendActions` 是被加签人的按钮,独立配置。数组按 `action` 部分覆盖默认值,不配置时保持历史默认:同意、拒绝显示,保存、转交、加签、退回隐藏。
30
+ - 加签位置和结果是节点级规则,在 `normalActions` 的 `append` 动作上设置。`appendPosition` 必须为非空数组,支持 `BEFORE_APPEND`(前加签)、`AFTER_APPEND`(后加签);省略时默认前加签。`appendResult` 支持 `valid`(参与审批)、`invalid`(不参与审批);省略时默认 `valid`,与设计器开启加签时一致。
31
+ - 编译器同步生成运行配置 `allowTaskAppend`、`moldList`、`isConsiderAppendedAction`、`isNeedEndTaskGroupChain`。转交使用 `forward.hidden`,无需虚构额外的转交范围配置。
32
+ - 开启被加签人的再次加签时,也须开启普通审批人的加签,以确保存在节点级加签规则;无效配置会在发布前报错。
33
+ - 兼容已有 `approver.processProps.actions/appendActions` 完整数组,并同步到设计器;`node.actions` 对对应数组优先。旧运行字段 `moldList` 和布尔类型 `isConsiderAppendedAction` 可用于补齐省略的加签参数。不要同时提供互相矛盾的两套配置。
34
+ - 发布后的回读会核对按钮是否隐藏,以及开启加签时的位置和结果设置。`PLATFORM_VIEW_VERIFIED` 仍不等于真实审批人已完成加签/转交验收;需要在获授权的测试流程中分别验证普通审批人、被加签人和移动端。
35
+
36
+
37
+ ## CLI 入口
38
+
39
+ 将以上节点放入完整流程定义的 `nodes` 数组,由同一编译器处理:
40
+
41
+ ```bash
42
+ openyida configure-process APP_XXX FORM_XXX .cache/openyida/process/process-with-actions.json
43
+ openyida create-process APP_XXX --formUuid FORM_XXX .cache/openyida/process/process-with-actions.json
44
+ ```
45
+
46
+ 已有流程使用第一条;普通表单首次转流程可使用第二条。配置命令会替换整张流程图,必须保留完整节点与分支;发现已有版本时需按主技能的替换要求使用 `--replace`。本功能不提供 `--append`、`--forward` 等独立开关,也不用于执行某一待办实例的加签或转交操作。
47
+
48
+ 用 `openyida configure-process --help`、`openyida create-process --help` 查看入口;命令发现 JSON 也会返回加签/转交配置提示。发布后若返回 `PROCESS_PLATFORM_VIEW_ACTION_MISMATCH` 诊断,不得将已发布但未验证的流程当作成功,也不要直接重试写入。
@@ -25,7 +25,7 @@ description: 自定义页面编译发布技能;发布 YidaCodeCanvas 页面时
25
25
 
26
26
  - 不要在未加载对应页面开发技能的情况下临时编写页面源码;使用 `YidaCodeCanvas` 组件实现的页面先看 `yida-canvas-custom-page`。
27
27
  - 不要把普通 React / Next / Vite 项目源码直接发布;可发布源码必须是 OpenYida 页面源码,并放在 `project/pages/src/*.{canvas.jsx,canvas.tsx,oyd.jsx,jsx,tsx}`
28
- - 不要混用预检命令:`.canvas.jsx` / `.canvas.tsx` 不走 `openyida check-page` / `openyida compile`;`.oyd.jsx` / `.jsx` / `.tsx` 不要当成 `YidaCodeCanvas` 页面发布,除非已明确确认源码就是 `YidaCodeCanvas` 组件源码并使用 `--canvas`
28
+ - 不要混用预检模式:`.canvas.jsx` / `.canvas.tsx` 不走 `openyida check-page`,统一执行 `openyida compile <源文件> --json` 让 CLI 按扩展名选择 Canvas 编译器;`.oyd.jsx` / `.jsx` / `.tsx` 不要当成 `YidaCodeCanvas` 页面发布,除非已明确确认源码就是 `YidaCodeCanvas` 组件源码并使用 `--canvas`
29
29
  - 不要在平台 `renderJsx` / `didMount` 形态里手写 React Hooks;需要 Hooks 的页面应交回对应页面开发技能改成可编译的源码形态
30
30
  - 不要编造 appType 和 formUuid,必须从已有记录或命令返回中获取
31
31
  - 不要把普通表单、流程表单或数据底表的 `formUuid` 当作发布目标;除非已确认目标是自定义展示页面,否则不要用 `--force` 绕过保护
@@ -34,7 +34,8 @@ description: 自定义页面编译发布技能;发布 YidaCodeCanvas 页面时
34
34
 
35
35
  - 发布前确认页面源码已通过对应页面开发技能编写:`.canvas.jsx` / `.canvas.tsx` 发布为 `YidaCodeCanvas` 组件;`.oyd.jsx` / `.jsx` / `.tsx` 发布为平台 `Jsx` 组件
36
36
  - 平台 `Jsx` 组件 / `oyb.jsx` / `renderJsx` 维护源码发布前优先执行 `openyida check-page <源文件路径>` 和 `openyida compile <源文件路径>`;本技能只把它们作为发布前 guard
37
- - 使用 `YidaCodeCanvas` 组件实现的页面不单独运行普通 JSX 编译命令;执行 `openyida publish <源文件> <appType> <displayPageFormUuid> --canvas --health-check`,由发布流程校验并写入 `runtimeCode + importedModules`
37
+ - 使用 `YidaCodeCanvas` 组件实现的页面发布前必须执行 `openyida compile <源文件> --json`;CLI 会自动选择 Canvas 编译器。失败时直接按结构化 `code/message/details` 修源码并重跑同一命令,不要改用 `node -e`、`compileCanvasLocal` 或 `run_workspace_script` 绕行
38
+ - Canvas 本地编译通过后,执行 `openyida publish <源文件> <appType> <displayPageFormUuid> --canvas --health-check`,由发布流程再次校验并写入 `runtimeCode + importedModules`
38
39
  - 使用 `YidaCodeCanvas` 组件实现的页面发布时,发布流程会在外层页面 `didMount` 注入 `window.__OPENYIDA_YIDA_API__` 和 `window.__OPENYIDA_UTILS__`;不要在 Canvas 源码内补写 `this.utils.yida.*` 或根级 `this.utils.*`
39
40
  - 推荐源码放在 `project/pages/src/`:使用 `YidaCodeCanvas` 组件实现的页面用 `<页面名>.canvas.jsx` / `<页面名>.canvas.tsx`;平台 `Jsx` 组件维护源码用 `<页面名>.oyd.jsx` / `<页面名>.jsx` / `<页面名>.tsx`
40
41
  - 发布前注意 CLI 会检查 `<workspace>/project/pages/src/` 与 `<workspace>/projects/<id>/artifacts/` 中同名源码是否内容不一致;出现警告时必须确认实际要发布哪一份
@@ -100,7 +101,7 @@ openyida list-forms <appType> --keyword <页面名>
100
101
  - `--health-check` 是发布内容读回校验,不是浏览器运行态 smoke。输出中的 `runtimeSmokeVerified=false`、`runtimeSmokeStatus=not_checked` 表示本命令没有验证页面渲染与交互;需要宣称“页面可运行”时,必须另有专项运行态证据。
101
102
  - `<source>` 必须是本轮实际 Write/Edit/Create 过的页面源码;`<displayPageFormUuid>` 必须是已解析的 display 自定义页面。发布了其他文件或其他目标页面,不满足本轮源码修改的 doneWhen。
102
103
  - 若 publish 没执行、执行失败、目标不明、登录态/组织不一致或用户要求先暂停,final 只能说“源码已修改,尚未发布”,并给出下一步需要执行的 publish 命令或阻塞原因。
103
- - 平台 JSX 组件页面的 `check-page` / `compile`、使用 `YidaCodeCanvas` 组件实现页面的 `compileCanvasLocal` 都是发布前 guard,不是远端完成证据。
104
+ - 平台 JSX 组件页面的 `check-page` / `compile`、Canvas 页面统一入口 `openyida compile <源文件> --json` 都是发布前 guard,不是远端完成证据。
104
105
 
105
106
  ## 数据源保留
106
107
 
@@ -117,7 +118,7 @@ openyida list-forms <appType> --keyword <页面名>
117
118
 
118
119
  `openyida publish` 会在保存 Schema 前执行确定性编译;Agent 不要把这一步改成口头检查:
119
120
 
120
- 1. `.canvas.jsx` / `.canvas.tsx`:执行 `YidaCodeCanvas` 页面编译,产出并写入 `runtimeCode` 与 `importedModules`。该类源码不使用 `openyida check-page` / `openyida compile` 作为预检。
121
+ 1. `.canvas.jsx` / `.canvas.tsx`:发布前执行 `openyida compile <源文件> --json`;统一入口会按扩展名执行与发布阶段相同的 `YidaCodeCanvas` 编译并返回结构化结果。不要执行 `openyida check-page`,也不要直接调用内部编译函数或临时脚本。
121
122
  2. `.oyd.jsx` / `.openyida.jsx` 或显式 `--compat`:先运行 OpenYida compatibility compiler,输出宜搭平台 `Jsx` 组件可执行源码。
122
123
  3. 普通 `.jsx` / `.tsx` 源码如果已有 `export function renderJsx()`:视为平台 `Jsx` 组件源码,执行 lint、Babel、UglifyJS 后构建 Schema。
123
124
  4. 普通 `.jsx` / `.tsx` 源码如果没有 `renderJsx` 但存在 `export default function Page()`:只允许走有限 authoring 降级;Hooks、生命周期和运行态限制以`yida-custom-page` 为准。
@@ -107,7 +107,7 @@ export default YidaComp;
107
107
  # yida-report 负责统计口径;yida-canvas-data-binding 负责接口接入
108
108
 
109
109
  # 2. 本地快检
110
- node -e "const fs=require('fs'); const {compileCanvasLocal}=require('./lib/app/canvas-compile'); const src=fs.readFileSync('project/pages/src/trend-combo.canvas.jsx','utf8'); console.log(compileCanvasLocal(src).importedModules)"
110
+ openyida compile project/pages/src/trend-combo.canvas.jsx --json
111
111
 
112
112
  # 3. 真实交付时发布
113
113
  openyida publish project/pages/src/trend-combo.canvas.jsx <appType> <displayPageFormUuid>
@@ -32,7 +32,7 @@ description: 识别并读取需求来源,理解和澄清用户需求,输出
32
32
  | `pageScenes` | 已确认的页面与表单范围,数组;记录稳定 key、name、kind、purpose 及已有细项 |
33
33
  | `intake` | 首次搭建判断、来源详细程度、搭建方式和需求确认状态 |
34
34
  | `visualSelection` | 已确认风格及其主题、主色、导航明暗映射;Plan 初始化前必须含非空 `themeId` |
35
- | `navigation` | 应用导航决策:`type` 只能是 `platform-l-shape/platform-top/platform-side/custom`,并记录 `source/reason`;自定义导航增加 `variant: side/top/mixed/dock`;未决时 type 为 null,规划前补齐 |
35
+ | `navigation` | 用户仅选择宜搭原生导航(即平台导航)或自定义导航;Agent 按场景确定布局并在 `reason` 区分选择与推断。应用导航决策:`type` 只能是 `platform-l-shape/platform-top/platform-side/custom`,并记录 `source/reason`;自定义导航增加 `variant: side/top/mixed/dock`;未决时 type 为 null,规划前补齐 |
36
36
  | `resourceContext` | 已确认可复用的 app/page/form/process 业务上下文,不写猜测 ID |
37
37
  | `explicitScope` | 用户明确指定的页面、表单、流程、报表、导航项和本轮交付;明确窄范围时写对应数组及 `allowInferredResources:false`,没有时为 `null` |
38
38
  | `brandHints` / `colorHints` | 明确的品牌、参考页面、已有主题、偏好色与避用色 |
@@ -14,37 +14,46 @@
14
14
 
15
15
  ## 2. 确认首次搭建的未决事项
16
16
 
17
- 先分析再提问。用户已明确的信息直接采用;同一次搭建已回答的问题直接复用。首次提问必须在同一轮一次性收集所有尚未明确的搭建方式(Fast / Plan)、业务模块、页面与表单范围、导航归属(平台或自定义)、导航布局和设计风格。不要先问模块、导航和风格,收到回答后再另起一轮补问模式、导航位置或页面。
17
+ 先分析再提问。用户已明确的信息直接采用;同一次搭建已回答的问题直接复用。首次提问必须在同一轮一次性收集所有尚未明确的搭建方式(Fast / Plan)、业务模块、页面与表单范围、导航归属(宜搭原生导航或自定义导航)和设计风格。不要先问模块、导航和风格,收到回答后再另起一轮补问模式、导航位置或页面。
18
18
 
19
19
  先锁定用户已经明确的搭建方式:用户写明 `Plan`、先出 PRD/方案并确认后搭建时,立即把草稿的 `intake.designMode` 设为 `plan`;用户写明 `Fast` 或直接快速搭建时设为 `fast`。已锁定的搭建方式不再进入提问选项。后续 `ask_human` 只补齐其他未决事项,合并回答时必须保留已有 `intake.designMode`;不能因为回答里没有重复提到模式、结构化问题被合并、上下文压缩或重新生成 brief 而回退到 Fast。只有用户明确说“改用 Fast/Plan”时才能切换,并以最后一次明确选择为准。
20
20
 
21
- 将整组问题放在一次结构化提问调用中。宿主限制问题数量时,合并为“搭建方式”“导航归属与布局”“业务模块、页面与风格”等复合问题;选项数量或多选能力不足时,用允许自由输入的同组问题列出完整选择。不得因为工具数量限制而拆成多轮。只有回答遗漏、互相冲突或产生新的关键业务疑问时才针对性追问。
21
+ 将整组问题放在一次结构化提问调用中。宿主限制问题数量时,合并为“搭建方式”“导航归属”“业务模块、页面与风格”等复合问题;选项数量或多选能力不足时,用允许自由输入的同组问题列出完整选择。不得因为工具数量限制而拆成多轮。只有回答遗漏、互相冲突或产生新的关键业务疑问时才针对性追问。
22
22
 
23
23
  | 事项 | 何时询问 | 用户可见问题与选项 |
24
24
  | --- | --- | --- |
25
25
  | 搭建方式 | 用户未选择方式,且已提供详细计划 | “是否根据你提供的需求,整理一份应用 PRD 计划供你确认?” 是:计划更清晰详细,耗时更长;否:按现有需求快速搭建 |
26
26
  | 搭建方式 | 用户未选择方式,且需求细节不足 | “希望用哪种方式搭建?” Fast(快速搭建);Plan(先生成 PRD,确认后再搭建,耗时更长) |
27
- | 导航归属与布局 | 用户未明确平台或自定义导航及布局 | “应用导航使用平台导航还是自定义导航,采用哪种布局?” 一次列出平台L型导航、平台顶部导航、平台侧边导航、自定义左侧菜单、自定义顶部浮导、自定义顶部加左侧菜单、自定义底部悬浮菜单;每个选项必须附上下表的说明;自定义布局选项同时注明在自定义页面中实现,不使用宜搭原生导航。已明确归属时只列该归属下的布局,在同一轮收集 |
27
+ | 导航归属 | 用户未明确宜搭原生导航或自定义导航 | “你希望应用使用哪种导航菜单?” 仅提供“宜搭原生导航”和“自定义导航”两个选项,并附下表说明。宜搭原生导航就是平台导航;归属已明确时不再询问,顶部、侧边、L 型等布局根据场景选择,不进入 `ask_human` |
28
28
  | 业务模块 | 用户未明确业务范围 | “应用需要包含哪些业务模块?” 根据业务列出具体模块及用途,支持多选或自行补充;不要只用“标准4-5模块”代替具体模块清单 |
29
29
  | 应用设计风格 | 用户未提及 | 根据业务提供简短的配色与界面风格选项,并允许描述自己的偏好;已有品牌或参考图时沿用 |
30
30
  | 页面范围 | 用户未明确页面与表单 | “这次需要哪些页面和表单?” 同轮按候选业务模块列出页面和表单及用途,支持多选或自行补充,例如“工作台:汇总待办”“活动报名表:填写报名信息”;可与业务模块合成一题,不等模块回答后再问,也不要只用“标准4页”代替页面清单 |
31
31
 
32
32
  ### 导航选项说明
33
33
 
34
- 选项名称与说明一起呈现;支持 `description` 时写入该字段,否则在选项名称后用括号备注。平台侧导航与平台侧边导航指同一种布局。
34
+ 导航 `ask_human` 仅有以下两个选项,不把布局或呈现样式拆成选项,也不追加布局问题。选项名称与说明一起呈现;支持 `description` 时写入该字段,否则在选项名称后用括号备注。
35
35
 
36
36
  | 导航选项 | 必须附带的说明 |
37
37
  | --- | --- |
38
- | 平台L型导航 | 使用宜搭原生导航,顶部与左侧组合布局 |
39
- | 平台侧导航 | 使用宜搭原生导航,菜单位于左侧 |
40
- | 平台顶部导航 | 使用宜搭原生导航,菜单位于顶部 |
41
- | 自定义导航 | 在自定义页面中实现,不使用宜搭原生导航 |
38
+ | 宜搭原生导航 | 使用宜搭自带的导航菜单。 |
39
+ | 自定义导航 | 在自定义页面里定制菜单的样式和操作方式,替代宜搭自带的导航菜单。 |
42
40
 
43
- 自定义导航按本轮候选拆为左侧、顶部浮导、顶部加左侧、底部悬浮菜单时,每个选项都保留上述自定义说明,并补充所在位置;侧导及顶部+侧导注明支持折叠/展开和拖拽调宽。归属与布局仍在同一轮确定,不先选大类再另起一轮询问。
41
+ 需要解释布局时,统一使用:“菜单放在顶部、左侧,还是顶部加左侧,会根据应用场景安排,你不用再选。” 面向用户不使用“导航归属”“布局枚举”等内部术语。
44
42
 
45
- 模式、平台或自定义导航归属及顶部/侧边等布局选项平等说明,不推荐、不预选,不在“自定义导航”大类上添加“(推荐)”。自定义顶部导航的呈现样式默认推荐浮导:用户已选自定义顶部且未指定样式时直接采用;若同轮展示样式选择,使用“浮导(推荐)”“贴边通栏”。不为此追加一轮提问;用户已明确通栏等样式时沿用。详细计划问题的“是”对应 Plan,“否”对应 Fast;两者都复用已有需求。用户明确要求代为决定时,记录选择和依据。
43
+ 模式和导航归属选项平等说明,不推荐、不预选,不添加“(推荐)”或“默认”。详细计划问题的“是”对应 Plan,“否”对应 Fast;两者都复用已有需求。用户明确要求代为决定时,记录选择和依据。
46
44
 
47
- 展示自定义侧边导航或自定义顶部+侧边导航选项时,在说明中注明“支持折叠/展开和拖拽调宽”。选择后将这两项作为默认必需交互写入 PRD/design,不追加确认问题;UI 按设计实现,不要求套用示例外观。
45
+ ### 根据场景确定导航布局
46
+
47
+ 用户只选择导航归属。Agent 在该归属内,结合业务模块数量、层级、切换频率、内容宽度和目标设备确定布局;用户已明确布局或提供参考时优先沿用。用户只说“平台导航”视为已选“宜搭原生导航”;只指定顶部、侧边或 L 型但未明确归属时,保留布局要求,仅询问上述两个归属选项。
48
+
49
+ | 场景 | 宜搭原生导航(平台导航) | 自定义导航 |
50
+ | --- | --- | --- |
51
+ | 模块少、层级浅,表格或看板需要较宽内容区 | 顶部:`platform-top` | 顶部:`custom` + `variant: top` |
52
+ | 模块或分组多,需要频繁跨模块操作 | 侧边:`platform-side` | 左侧:`custom` + `variant: side` |
53
+ | 业务域与域内模块形成两级导航 | L 型:`platform-l-shape` | 顶部+侧边:`custom` + `variant: mixed` |
54
+ | 少量高频入口的移动端轻量门户或沉浸展示 | 按实际层级选顶部或侧边 | 可选底部悬浮菜单:`custom` + `variant: dock` |
55
+
56
+ 这些是布局判断依据,不是固定模板或用户问卷;不得为适配布局增删业务模块,也不能因布局偏好改变已选导航归属。自定义形态细化参考 [导航壳形态目录](../../yida-nav-shell/references/nav-shell-patterns.md)。自定义顶部未指定样式时默认浮导;侧边及顶部+侧边在 PRD/design 中写入折叠/展开和拖拽调宽,不另行提问。
48
57
 
49
58
  额外只补问影响搭建的关键疑问:给谁使用、主要解决什么问题、创建还是复用应用、数据可见范围、关键审批规则、必要的外部数据来源。能够从需求和资源上下文确定的内容直接记录;一般字段和布局细节交给后续规划。
50
59
 
@@ -63,7 +72,7 @@
63
72
  - 已有确认记录且需求未变化时直接复用;后续只补充已确定的视觉映射或更新用户变更涉及的字段,不因阶段切换重写全文或重新生成页面 key。
64
73
 
65
74
  - `intake` 记录 `firstBuild`、`sourceDetail`(`detailed/brief`)、`designMode`(`fast/plan`)、`confirmed`。未决事项处理完毕后才将 confirmed 设为 true。
66
- - `navigation` 记录 `type/source/reason`;自定义导航的 `variant` 为 `side/top/mixed/dock`。顶部浮导使用 `top`,默认浮导或用户指定的通栏样式写入 `reason`,PRD 与视觉设计共同沿用;`dock` 表示底部悬浮胶囊。导航明暗由视觉选择记录。
75
+ - `navigation` 记录 `type/source/reason`;归属由用户选择时 `source` 为 `user_selected`,`reason` 分别写清用户选择的归属、Agent 根据场景确定的布局及依据,不将推断布局记成用户指定。归属也由用户授权代选时标记 `ai_default`。保存 confirmed brief 前按上表补齐可执行的布局枚举,不把中文选项名或笼统的 `platform` 写入 `type`,不因缺少布局再次提问;自定义导航的 `variant` 为 `side/top/mixed/dock`。顶部浮导使用 `top`,默认浮导或用户指定的通栏样式写入 `reason`,PRD 与视觉设计共同沿用;`dock` 表示底部悬浮胶囊。导航明暗由视觉选择记录。
67
76
  - 业务模块答案写入 `coreFunctions/businessObjects/explicitScope`;与页面范围合问时,分别保存模块事实与 `pageScenes`,不要只保留模块或页面数量。
68
77
  - `targetUsers/businessGoals/coreFunctions/businessObjects/pageScenes` 一律保持数组类型;单个目标也写成单元素数组。Plan 的 `visualSelection.themeId` 在保存 confirmed brief 前补齐;导航 type 使用 `platform-l-shape/platform-top/platform-side/custom` 精确枚举。
69
78
  - 用户先用“应用/系统”描述背景、后续又明确“只完成/随后完成一个”具体资源并交付时,以具体资源作为本轮执行边界。`explicitScope` 写对应的 forms/processes/reports/pages/delivery 数组并设置 `allowInferredResources:false`;不把“应用”自动扩展为示例数据、工作台、自定义列表或其他未点名资源。
@@ -79,7 +88,7 @@ Plan 的视觉选择直接使用下面的对象结构,不另写 `styleDescript
79
88
  "themeId": "airy-structured-clarity",
80
89
  "visualDirection": {"label": "轻盈结构", "description": "清晰、简洁、适合持续业务操作", "source": "requirement"},
81
90
  "colorStrategy": {"primaryColor": "#1677FF", "primaryColorName": "专业蓝", "source": "requirement", "usage": "主操作与选中态", "surfaceTone": "brand-tinted"},
82
- "navigationStyle": {"structure": "side", "tone": "light", "source": "requirement", "selectionReason": "沿用平台侧边导航"}
91
+ "navigationStyle": {"structure": "side", "tone": "light", "source": "ai_default", "selectionReason": "用户选择宜搭原生导航;模块分组较多,采用平台侧边布局与浅色导航"}
83
92
  }
84
93
  ```
85
94