@szc-ft/mcp-szcd-client 0.23.0 → 0.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -105,25 +105,20 @@ szcd 是基于 Ant Design 5.27 封装的企业级 React 组件库,采用分层
105
105
  - 边框:`style.borders[0].color.hex` + `thickness`
106
106
  - **禁止**逐个 `getNodeInfo` 探查
107
107
 
108
- 5. **获取组件库架构**(复用步骤1结果):
109
- - `get_architecture_overview` `templatePatterns` 提供模板组合模式
110
- - `llmMappingHints` 提供常见错误修正
108
+ **步骤 2.5 产出物**(**只产出数据,不做组件映射**):
109
+ - Sketch 节点结构 + 全量节点 ID 列表
110
+ - text/rectangle 节点的完整样式 Token
111
+ - 图表区结构规律识别结果
111
112
 
112
- 6. **LLM 推理组件范围 + 批量获取组件详情**:
113
- - 从 Sketch 结构 + 样式 Token 推断:画板名称→`pageName`,区域分布→`layoutType`,图层类型+颜色→组件映射
114
- - 对照 `templatePatterns` 选择最匹配的模板(TreeQueryTable/QueryTabsTables/LeftRight/UpDown)
115
- - 输出组件候选列表(如 `["Query","TableOrList","LeftTree","TemplateMode"]`)
116
- - 调用 `get_component_full_profile`(name="Query,TableOrList,LeftTree,TemplateMode", depth="deep")一次性获取所有需要的组件 API
117
- - 如需样式注入细节,追加 `get_style_injection_guide`
113
+ 组件候选列表推理**不**在步骤 2.5 内部完成,**统一在主流程步骤 3.5 中结合步骤 1 的 `templatePatterns` 推理**。
118
114
 
119
115
  **Sketch → szcd 工作流(结构化直传 + 样式 Token,无需视觉模型)**:
120
116
  ```
121
117
  .sketch → loadSketchByPath → listPages → listNodesByPage(type=artboard)
122
118
  → getPageStructure(includeDetails=true) / getDocumentStructure(includeDetails=true)
123
119
  → getNodesSummary(groupBy="type")
124
- → getMultipleNodeInfo([所有text+rectangle节点ID]) 关键:批量拿样式 Token
125
- → [步骤1架构数据] LLM推理组件
126
- → get_component_full_profile(批量) → 编码
120
+ → getMultipleNodeInfo([所有text+rectangle节点ID]) 步骤 2.5 结束
121
+ → [进入主流程步骤 3.5 统一推理]
127
122
  ```
128
123
 
129
124
  **首轮常见错误 → 正确做法对照表**:
@@ -135,6 +130,40 @@ szcd 是基于 Ant Design 5.27 封装的企业级 React 组件库,采用分层
135
130
  | 组件识别 | 凭节点名猜测(如看到 "tag" 节点就写 `<Tag>`) | `getNodesSummary(groupBy="type")` 统计类型分布,识别 text+rectangle 组合 → 标签组件 |
136
131
  | 颜色提取 | 跳过 | 对每个 rectangle(背景)+ text(文字)取 `style.fills[0].color.hex` + `text.color` |
137
132
 
133
+ **实战经验沉淀(重要,4 条核心收获)**:
134
+
135
+ **收获 1:首轮 `getMultipleNodeInfo` 必须全量拉取,不能挑**
136
+ - 错误做法:先查 7 个顶层容器,再根据需要分批补漏(结果补了 7 轮 ≈ 108 个节点)
137
+ - 正确做法:`getPageStructure(pageId)` 一次性拿全量 ID → `getMultipleNodeInfo(全部 text + 全部 rectangle 节点 ID)`,≤100 个/批,**2 批搞定**
138
+
139
+ **收获 2:text 节点是颜色/DOM 映射的两级索引**
140
+ 每个 text 节点同时关联两种上下文,**必须同批拉取**:
141
+ - 自身样式:`fontSize`、`fontWeight`、`text.color`
142
+ - 所属 group 父级 rectangle 样式:`bg`、`border`、`radius`、`shadow`
143
+
144
+ 错误做法:先查 text 拿自身样式 → 再根据 parent ID 单独查 rectangle(多走一步)
145
+ 正确做法:构造查询列表时,**把同一 group 内的 text + rectangle 节点 ID 合并提交**
146
+
147
+ **收获 3:图表区样式提取有规律可循**
148
+
149
+ | 图表子元素 | 对应 Sketch 节点类型 | 关键样式字段 |
150
+ |---|---|---|
151
+ | 图表标题 | `text`(带蓝色矩形左饰线) | 14px Semibold;矩形 4×14 #0079f7 |
152
+ | 图例文字 | `text` | 14px |
153
+ | 图例色块 | `rectangle` | 8×8 / 10×3 |
154
+ | 坐标轴文字 | `text`(成组) | 12px #7b828d |
155
+ | 柱体颜色 | 区域 `rectangle` | `style.fills[0].hex` |
156
+ | 数据标签 | `text`(白字) | 12px #ffffff |
157
+
158
+ **图表区结构规律**:`标题 text + 标题装饰 rectangle + 图例 text*N + 色块 rectangle*N + 坐标轴 text*N + 柱体 rectangle*N + 标签 text*N`
159
+
160
+ 识别出图表后,**图例色块**应归入 ECharts `legend` 配置(不要用 div 硬编码),**柱体色**映射到 `series.itemStyle.color`。
161
+
162
+ **收获 4:矢量图形是工具链盲区(兜底方案)**
163
+ - `shapePath` / `shapeGroup` 在 sketch 节点中占比可能高达 46.8%(实战中 434/926),但 `renderNodeAsBase64` 不支持渲染
164
+ - 解压 `.sketch`(zip 格式)只能提取 `bitmap` 中内嵌的 PNG/PDF(实战中可能仅 2 张,常是侧边栏 Logo)
165
+ - **兜底方案**:① 用解压提取的 PNG/PDF 资源;② 无资源时用 antd `@ant-design/icons` 同语义图标替代;③ 在代码注释中标注"⚠️ 矢量图标用 antd 图标替代,原始 Sketch 为 shapePath"
166
+
138
167
  **提示**:
139
168
  - 大型 .sketch 文件先 `listNodesByPage(type="artboard")` 锁定目标画板,避免一次性加载整个文档
140
169
  - `getNodesSummary` 是 token 节省关键:先按类型分组统计,再决定要查哪些节点 ID
@@ -142,7 +171,47 @@ szcd 是基于 Ant Design 5.27 封装的企业级 React 组件库,采用分层
142
171
  - 仅当结构化样式数据仍不足(如复杂渐变、阴影)时,才回退到 `renderNodeAsBase64` + `analyze_design_image`
143
172
  - 如果 sketch-mcp-server 工具不可用,提示用户安装:`npm install -g sketch-mcp-server`
144
173
 
145
- **Sketch 结构 → 组件映射规则**:
174
+ **提示**:
175
+ - 大型 .sketch 文件用 `getPageStructure(maxDepth=1-2)` 即可获取布局概况,避免深层递归超时
176
+ - `listNodesByPage(type="artboard")` 优先于 `getPageStructure`,更轻量
177
+ - 仅当结构化数据不足以判断视觉细节(颜色、间距、字体)时,才回退到 `renderNodeAsBase64` + `analyze_design_image`
178
+ - 如果 sketch-mcp-server 工具不可用,提示用户安装:`npm install -g sketch-mcp-server`
179
+
180
+ ### 步骤3:分析设计稿(条件执行)
181
+
182
+ 当用户提供了设计稿图片时:
183
+ - 如果**主代理已提供图片描述**(设计稿已被解读为文字),直接使用该描述,跳过图像分析
184
+ - 如果图片未被解读,调用 `analyze_design_image` 工具分析
185
+ - 如果该工具不可用,告知用户需要提供设计稿的文字描述
186
+
187
+ - 注意:OCR 降级模式下仅返回原始文字,需结合组件库工具自行映射
188
+
189
+
190
+ ### 步骤3.5:组件候选列表推理(统一环节,必做)
191
+
192
+ **这是统一的组件候选列表推理环节**,无论设计稿来源是 .sketch 文件(步骤 2.5)还是图片(步骤 3),都需经过此环节:
193
+
194
+ ```
195
+ 步骤 1 templatePatterns + 步骤 2.5/3 设计稿数据 → 组件候选列表
196
+ (4 种模板模式 + llmMappingHints) (结构 + 样式 Token) (如 ["Query","TableOrList","LeftTree","TemplateMode"])
197
+ ```
198
+
199
+ **输入**:
200
+ - 步骤 1 的 `get_architecture_overview` 返回的 `templatePatterns`(TreeQueryTable / QueryTabsTables / LeftRight / UpDown)
201
+ - 步骤 1 的 `llmMappingHints.commonMistakes`(避免 LLM 常见映射错误)
202
+ - 步骤 2.5 的 Sketch 节点结构 + 样式 Token
203
+ - 或步骤 3 的图片分析描述
204
+
205
+ **输出**:
206
+ - **组件候选列表**(如 `["Query","TableOrList","LeftTree","TemplateMode"]`)
207
+ - 模板类型选择(如 `TemplateMode(templateType="LeftRight")`)
208
+
209
+ **禁止**:
210
+ - ❌ 在步骤 2.5 内部推理组件候选列表(应只产出 Sketch 数据 + 样式 Token)
211
+ - ❌ 在步骤 3 内部推理组件候选列表(应只产出图片描述)
212
+ - ❌ 跳过此环节直接调 `get_component_full_profile`(必须先有候选列表)
213
+
214
+ **推理时使用映射规则**(**此表为本步骤专用,仅含核心高频场景**):
146
215
 
147
216
  *页面级布局*:
148
217
  | Sketch 特征 | 推断结果 | 依据 |
@@ -162,47 +231,28 @@ szcd 是基于 Ant Design 5.27 封装的企业级 React 组件库,采用分层
162
231
  | 页面标题 + 返回箭头 | `TitleAndBack` 组件 | 标题栏特征 |
163
232
  | 详情展示区域(只读字段) | `FormItemOrDetailItem(type="detail")` | 详情区特征 |
164
233
 
165
- *数据可视化*:
234
+ *数据可视化(核心 3 类)*:
166
235
  | Sketch 特征 | 推断结果 | 依据 |
167
236
  |---|---|---|
168
237
  | 折线趋势图/时间序列图 | `Line` | ECharts 层图表组件 |
169
238
  | 柱状对比图/条形图 | `Bar` | ECharts 层图表组件 |
170
239
  | 饼图/环形图/占比图 | `Pie` | ECharts 层图表组件 |
171
- | 雷达图/多维度对比 | `Radar` | ECharts 层图表组件 |
172
- | 仪表盘/进度指示 | `Gauge` | ECharts 层图表组件 |
173
- | 漏斗图/转化率 | `Funnel` | ECharts 层图表组件 |
174
240
 
175
- *表格子类型*:
241
+ *表格子类型(核心 2 类)*:
176
242
  | Sketch 特征 | 推断结果 | 依据 |
177
243
  |---|---|---|
178
244
  | 可编辑表格(单元格直接输入) | `TableOrList(componentType="EditableProTable")` | 可编辑表格特征 |
179
- | 拖拽排序表格(有序号/拖拽手柄) | `TableOrList(componentType="DragSortTable")` | 拖拽排序特征 |
180
245
  | 卡片列表(非表格式数据卡片) | `TableOrList(componentType="ProList")` | 卡片布局特征 |
181
- | 步骤条表单(分步填写) | `ModelOrDrawer(componentType="steps")` | StepsForm 特征 |
182
-
183
- *辅助/插槽组件*:
184
- | Sketch 特征 | 推断结果 | 依据 |
185
- |---|---|---|
186
- | 树标题栏添加按钮/操作入口 | `CustomOption` | LeftTree 的 CustomOption 插槽 |
187
- | 树节点右键菜单/增删改操作 | `TreeNode` | LeftTree 的 CustomTreeNode 插槽 |
188
- | 圆形头像/头像编辑区 | `ModeAvatar` | 头像区域特征 |
189
- | 文件上传区/拖拽上传框 | `Upload`(Cover 层) | 上传区域特征 |
190
246
 
191
- **提示**:
192
- - 大型 .sketch 文件用 `getPageStructure(maxDepth=1-2)` 即可获取布局概况,避免深层递归超时
193
- - `listNodesByPage(type="artboard")` 优先于 `getPageStructure`,更轻量
194
- - 仅当结构化数据不足以判断视觉细节(颜色、间距、字体)时,才回退到 `renderNodeAsBase64` + `analyze_design_image`
195
- - 如果 sketch-mcp-server 工具不可用,提示用户安装:`npm install -g sketch-mcp-server`
247
+ **长尾场景走语义搜索**(不进文档,避免膨胀):
196
248
 
197
- ### 步骤3:分析设计稿(条件执行)
249
+ *数据可视化长尾*:`Radar`(雷达图)、`Gauge`(仪表盘)、`Funnel`(漏斗图)
198
250
 
199
- 当用户提供了设计稿图片时:
200
- - 如果**主代理已提供图片描述**(设计稿已被解读为文字),直接使用该描述,跳过图像分析
201
- - 如果图片未被解读,调用 `analyze_design_image` 工具分析
202
- - 如果该工具不可用,告知用户需要提供设计稿的文字描述
251
+ *表格子类型长尾*:`DragSortTable`(拖拽排序表格)、`ModelOrDrawer(componentType="steps")`(步骤条表单)
203
252
 
204
- - 注意:OCR 降级模式下仅返回原始文字,需结合组件库工具自行映射
253
+ *辅助/插槽组件*:`CustomOption`(LeftTree 添加按钮插槽)、`TreeNode`(树节点右键菜单插槽)、`ModeAvatar`(圆形头像)、`Upload`(文件上传)
205
254
 
255
+ **处理方式**:本表未覆盖的视觉特征 → 调用 `search_components_semantic`(query="[场景描述,如'拖拽排序表格']")按需补全,再进入步骤 4。
206
256
 
207
257
  ### 步骤4:查询组件 + 依赖验证(必做)
208
258
 
@@ -101,25 +101,20 @@ szcd 是基于 Ant Design 5.27 封装的企业级 React 组件库,采用分层
101
101
  - 边框:`style.borders[0].color.hex` + `thickness`
102
102
  - **禁止**逐个 `getNodeInfo` 探查
103
103
 
104
- 5. **获取组件库架构**(复用步骤1结果):
105
- - `get_architecture_overview` `templatePatterns` 提供模板组合模式
106
- - `llmMappingHints` 提供常见错误修正
104
+ **步骤 2.5 产出物**(**只产出数据,不做组件映射**):
105
+ - Sketch 节点结构 + 全量节点 ID 列表
106
+ - text/rectangle 节点的完整样式 Token
107
+ - 图表区结构规律识别结果
107
108
 
108
- 6. **LLM 推理组件范围 + 批量获取组件详情**:
109
- - 从 Sketch 结构 + 样式 Token 推断:画板名称→`pageName`,区域分布→`layoutType`,图层类型+颜色→组件映射
110
- - 对照 `templatePatterns` 选择最匹配的模板(TreeQueryTable/QueryTabsTables/LeftRight/UpDown)
111
- - 输出组件候选列表(如 `["Query","TableOrList","LeftTree","TemplateMode"]`)
112
- - 调用 `get_component_full_profile`(name="Query,TableOrList,LeftTree,TemplateMode", depth="deep")一次性获取所有需要的组件 API
113
- - 如需样式注入细节,追加 `get_style_injection_guide`
109
+ 组件候选列表推理**不**在步骤 2.5 内部完成,**统一在主流程步骤 3.5 中结合步骤 1 的 `templatePatterns` 推理**。
114
110
 
115
111
  **Sketch → szcd 工作流(结构化直传 + 样式 Token,无需视觉模型)**:
116
112
  ```
117
113
  .sketch → loadSketchByPath → listPages → listNodesByPage(type=artboard)
118
114
  → getPageStructure(includeDetails=true) / getDocumentStructure(includeDetails=true)
119
115
  → getNodesSummary(groupBy="type")
120
- → getMultipleNodeInfo([所有text+rectangle节点ID]) 关键:批量拿样式 Token
121
- → [步骤1架构数据] LLM推理组件
122
- → get_component_full_profile(批量) → 编码
116
+ → getMultipleNodeInfo([所有text+rectangle节点ID]) 步骤 2.5 结束
117
+ → [进入主流程步骤 3.5 统一推理]
123
118
  ```
124
119
 
125
120
  **首轮常见错误 → 正确做法对照表**:
@@ -131,6 +126,40 @@ szcd 是基于 Ant Design 5.27 封装的企业级 React 组件库,采用分层
131
126
  | 组件识别 | 凭节点名猜测(如看到 "tag" 节点就写 `<Tag>`) | `getNodesSummary(groupBy="type")` 统计类型分布,识别 text+rectangle 组合 → 标签组件 |
132
127
  | 颜色提取 | 跳过 | 对每个 rectangle(背景)+ text(文字)取 `style.fills[0].color.hex` + `text.color` |
133
128
 
129
+ **实战经验沉淀(重要,4 条核心收获)**:
130
+
131
+ **收获 1:首轮 `getMultipleNodeInfo` 必须全量拉取,不能挑**
132
+ - 错误做法:先查 7 个顶层容器,再根据需要分批补漏(结果补了 7 轮 ≈ 108 个节点)
133
+ - 正确做法:`getPageStructure(pageId)` 一次性拿全量 ID → `getMultipleNodeInfo(全部 text + 全部 rectangle 节点 ID)`,≤100 个/批,**2 批搞定**
134
+
135
+ **收获 2:text 节点是颜色/DOM 映射的两级索引**
136
+ 每个 text 节点同时关联两种上下文,**必须同批拉取**:
137
+ - 自身样式:`fontSize`、`fontWeight`、`text.color`
138
+ - 所属 group 父级 rectangle 样式:`bg`、`border`、`radius`、`shadow`
139
+
140
+ 错误做法:先查 text 拿自身样式 → 再根据 parent ID 单独查 rectangle(多走一步)
141
+ 正确做法:构造查询列表时,**把同一 group 内的 text + rectangle 节点 ID 合并提交**
142
+
143
+ **收获 3:图表区样式提取有规律可循**
144
+
145
+ | 图表子元素 | 对应 Sketch 节点类型 | 关键样式字段 |
146
+ |---|---|---|
147
+ | 图表标题 | `text`(带蓝色矩形左饰线) | 14px Semibold;矩形 4×14 #0079f7 |
148
+ | 图例文字 | `text` | 14px |
149
+ | 图例色块 | `rectangle` | 8×8 / 10×3 |
150
+ | 坐标轴文字 | `text`(成组) | 12px #7b828d |
151
+ | 柱体颜色 | 区域 `rectangle` | `style.fills[0].hex` |
152
+ | 数据标签 | `text`(白字) | 12px #ffffff |
153
+
154
+ **图表区结构规律**:`标题 text + 标题装饰 rectangle + 图例 text*N + 色块 rectangle*N + 坐标轴 text*N + 柱体 rectangle*N + 标签 text*N`
155
+
156
+ 识别出图表后,**图例色块**应归入 ECharts `legend` 配置(不要用 div 硬编码),**柱体色**映射到 `series.itemStyle.color`。
157
+
158
+ **收获 4:矢量图形是工具链盲区(兜底方案)**
159
+ - `shapePath` / `shapeGroup` 在 sketch 节点中占比可能高达 46.8%(实战中 434/926),但 `renderNodeAsBase64` 不支持渲染
160
+ - 解压 `.sketch`(zip 格式)只能提取 `bitmap` 中内嵌的 PNG/PDF(实战中可能仅 2 张,常是侧边栏 Logo)
161
+ - **兜底方案**:① 用解压提取的 PNG/PDF 资源;② 无资源时用 antd `@ant-design/icons` 同语义图标替代;③ 在代码注释中标注"⚠️ 矢量图标用 antd 图标替代,原始 Sketch 为 shapePath"
162
+
134
163
  **提示**:
135
164
  - 大型 .sketch 文件先 `listNodesByPage(type="artboard")` 锁定目标画板,避免一次性加载整个文档
136
165
  - `getNodesSummary` 是 token 节省关键:先按类型分组统计,再决定要查哪些节点 ID
@@ -138,7 +167,47 @@ szcd 是基于 Ant Design 5.27 封装的企业级 React 组件库,采用分层
138
167
  - 仅当结构化样式数据仍不足(如复杂渐变、阴影)时,才回退到 `renderNodeAsBase64` + `analyze_design_image`
139
168
  - 如果 sketch-mcp-server 工具不可用,提示用户安装:`npm install -g sketch-mcp-server`
140
169
 
141
- **Sketch 结构 → 组件映射规则**:
170
+ **提示**:
171
+ - 大型 .sketch 文件用 `getPageStructure(maxDepth=1-2)` 即可获取布局概况,避免深层递归超时
172
+ - `listNodesByPage(type="artboard")` 优先于 `getPageStructure`,更轻量
173
+ - 仅当结构化数据不足以判断视觉细节(颜色、间距、字体)时,才回退到 `renderNodeAsBase64` + `analyze_design_image`
174
+ - 如果 sketch-mcp-server 工具不可用,提示用户安装:`npm install -g sketch-mcp-server`
175
+
176
+ ### 步骤3:分析设计稿(条件执行)
177
+
178
+ 当用户提供了设计稿图片时:
179
+ - 如果**主代理已提供图片描述**(设计稿已被解读为文字),直接使用该描述,跳过图像分析
180
+ - 如果图片未被解读,调用 `analyze_design_image` 工具分析
181
+ - 如果该工具不可用,告知用户需要提供设计稿的文字描述
182
+
183
+ - 注意:OCR 降级模式下仅返回原始文字,需结合组件库工具自行映射
184
+
185
+
186
+ ### 步骤3.5:组件候选列表推理(统一环节,必做)
187
+
188
+ **这是统一的组件候选列表推理环节**,无论设计稿来源是 .sketch 文件(步骤 2.5)还是图片(步骤 3),都需经过此环节:
189
+
190
+ ```
191
+ 步骤 1 templatePatterns + 步骤 2.5/3 设计稿数据 → 组件候选列表
192
+ (4 种模板模式 + llmMappingHints) (结构 + 样式 Token) (如 ["Query","TableOrList","LeftTree","TemplateMode"])
193
+ ```
194
+
195
+ **输入**:
196
+ - 步骤 1 的 `get_architecture_overview` 返回的 `templatePatterns`(TreeQueryTable / QueryTabsTables / LeftRight / UpDown)
197
+ - 步骤 1 的 `llmMappingHints.commonMistakes`(避免 LLM 常见映射错误)
198
+ - 步骤 2.5 的 Sketch 节点结构 + 样式 Token
199
+ - 或步骤 3 的图片分析描述
200
+
201
+ **输出**:
202
+ - **组件候选列表**(如 `["Query","TableOrList","LeftTree","TemplateMode"]`)
203
+ - 模板类型选择(如 `TemplateMode(templateType="LeftRight")`)
204
+
205
+ **禁止**:
206
+ - ❌ 在步骤 2.5 内部推理组件候选列表(应只产出 Sketch 数据 + 样式 Token)
207
+ - ❌ 在步骤 3 内部推理组件候选列表(应只产出图片描述)
208
+ - ❌ 跳过此环节直接调 `get_component_full_profile`(必须先有候选列表)
209
+
210
+ **推理时使用映射规则**(**此表为本步骤专用,仅含核心高频场景**):
142
211
 
143
212
  *页面级布局*:
144
213
  | Sketch 特征 | 推断结果 | 依据 |
@@ -158,47 +227,28 @@ szcd 是基于 Ant Design 5.27 封装的企业级 React 组件库,采用分层
158
227
  | 页面标题 + 返回箭头 | `TitleAndBack` 组件 | 标题栏特征 |
159
228
  | 详情展示区域(只读字段) | `FormItemOrDetailItem(type="detail")` | 详情区特征 |
160
229
 
161
- *数据可视化*:
230
+ *数据可视化(核心 3 类)*:
162
231
  | Sketch 特征 | 推断结果 | 依据 |
163
232
  |---|---|---|
164
233
  | 折线趋势图/时间序列图 | `Line` | ECharts 层图表组件 |
165
234
  | 柱状对比图/条形图 | `Bar` | ECharts 层图表组件 |
166
235
  | 饼图/环形图/占比图 | `Pie` | ECharts 层图表组件 |
167
- | 雷达图/多维度对比 | `Radar` | ECharts 层图表组件 |
168
- | 仪表盘/进度指示 | `Gauge` | ECharts 层图表组件 |
169
- | 漏斗图/转化率 | `Funnel` | ECharts 层图表组件 |
170
236
 
171
- *表格子类型*:
237
+ *表格子类型(核心 2 类)*:
172
238
  | Sketch 特征 | 推断结果 | 依据 |
173
239
  |---|---|---|
174
240
  | 可编辑表格(单元格直接输入) | `TableOrList(componentType="EditableProTable")` | 可编辑表格特征 |
175
- | 拖拽排序表格(有序号/拖拽手柄) | `TableOrList(componentType="DragSortTable")` | 拖拽排序特征 |
176
241
  | 卡片列表(非表格式数据卡片) | `TableOrList(componentType="ProList")` | 卡片布局特征 |
177
- | 步骤条表单(分步填写) | `ModelOrDrawer(componentType="steps")` | StepsForm 特征 |
178
-
179
- *辅助/插槽组件*:
180
- | Sketch 特征 | 推断结果 | 依据 |
181
- |---|---|---|
182
- | 树标题栏添加按钮/操作入口 | `CustomOption` | LeftTree 的 CustomOption 插槽 |
183
- | 树节点右键菜单/增删改操作 | `TreeNode` | LeftTree 的 CustomTreeNode 插槽 |
184
- | 圆形头像/头像编辑区 | `ModeAvatar` | 头像区域特征 |
185
- | 文件上传区/拖拽上传框 | `Upload`(Cover 层) | 上传区域特征 |
186
242
 
187
- **提示**:
188
- - 大型 .sketch 文件用 `getPageStructure(maxDepth=1-2)` 即可获取布局概况,避免深层递归超时
189
- - `listNodesByPage(type="artboard")` 优先于 `getPageStructure`,更轻量
190
- - 仅当结构化数据不足以判断视觉细节(颜色、间距、字体)时,才回退到 `renderNodeAsBase64` + `analyze_design_image`
191
- - 如果 sketch-mcp-server 工具不可用,提示用户安装:`npm install -g sketch-mcp-server`
243
+ **长尾场景走语义搜索**(不进文档,避免膨胀):
192
244
 
193
- ### 步骤3:分析设计稿(条件执行)
245
+ *数据可视化长尾*:`Radar`(雷达图)、`Gauge`(仪表盘)、`Funnel`(漏斗图)
194
246
 
195
- 当用户提供了设计稿图片时:
196
- - 如果**主代理已提供图片描述**(设计稿已被解读为文字),直接使用该描述,跳过图像分析
197
- - 如果图片未被解读,调用 `analyze_design_image` 工具分析
198
- - 如果该工具不可用,告知用户需要提供设计稿的文字描述
247
+ *表格子类型长尾*:`DragSortTable`(拖拽排序表格)、`ModelOrDrawer(componentType="steps")`(步骤条表单)
199
248
 
200
- - 注意:OCR 降级模式下仅返回原始文字,需结合组件库工具自行映射
249
+ *辅助/插槽组件*:`CustomOption`(LeftTree 添加按钮插槽)、`TreeNode`(树节点右键菜单插槽)、`ModeAvatar`(圆形头像)、`Upload`(文件上传)
201
250
 
251
+ **处理方式**:本表未覆盖的视觉特征 → 调用 `search_components_semantic`(query="[场景描述,如'拖拽排序表格']")按需补全,再进入步骤 4。
202
252
 
203
253
  ### 步骤4:查询组件 + 依赖验证(必做)
204
254
 
@@ -176,25 +176,20 @@ Ant Design → ProComponents → Cover 层 → Wrapper 层 → ProPackages →
176
176
  - 边框:`style.borders[0].color.hex` + `thickness`
177
177
  - **禁止**逐个 `getNodeInfo` 探查
178
178
 
179
- 5. **获取组件库架构**(复用步骤1结果):
180
- - `{{TOOL:get_architecture_overview}}` `templatePatterns` 提供模板组合模式
181
- - `llmMappingHints` 提供常见错误修正
179
+ **步骤 2.5 产出物**(**只产出数据,不做组件映射**):
180
+ - Sketch 节点结构 + 全量节点 ID 列表
181
+ - text/rectangle 节点的完整样式 Token
182
+ - 图表区结构规律识别结果
182
183
 
183
- 6. **LLM 推理组件范围 + 批量获取组件详情**:
184
- - 从 Sketch 结构 + 样式 Token 推断:画板名称→`pageName`,区域分布→`layoutType`,图层类型+颜色→组件映射
185
- - 对照 `templatePatterns` 选择最匹配的模板(TreeQueryTable/QueryTabsTables/LeftRight/UpDown)
186
- - 输出组件候选列表(如 `["Query","TableOrList","LeftTree","TemplateMode"]`)
187
- - 调用 `{{TOOL:get_component_full_profile}}`(name="Query,TableOrList,LeftTree,TemplateMode", depth="deep")一次性获取所有需要的组件 API
188
- - 如需样式注入细节,追加 `{{TOOL:get_style_injection_guide}}`
184
+ 组件候选列表推理**不**在步骤 2.5 内部完成,**统一在主流程步骤 3.5 中结合步骤 1 的 `templatePatterns` 推理**。
189
185
 
190
186
  **Sketch → szcd 工作流(结构化直传 + 样式 Token,无需视觉模型)**:
191
187
  ```
192
188
  .sketch → loadSketchByPath → listPages → listNodesByPage(type=artboard)
193
189
  → getPageStructure(includeDetails=true) / getDocumentStructure(includeDetails=true)
194
190
  → getNodesSummary(groupBy="type")
195
- → getMultipleNodeInfo([所有text+rectangle节点ID]) 关键:批量拿样式 Token
196
- → [步骤1架构数据] LLM推理组件
197
- → get_component_full_profile(批量) → 编码
191
+ → getMultipleNodeInfo([所有text+rectangle节点ID]) 步骤 2.5 结束
192
+ → [进入主流程步骤 3.5 统一推理]
198
193
  ```
199
194
 
200
195
  **首轮常见错误 → 正确做法对照表**:
@@ -206,58 +201,46 @@ Ant Design → ProComponents → Cover 层 → Wrapper 层 → ProPackages →
206
201
  | 组件识别 | 凭节点名猜测(如看到 "tag" 节点就写 `<Tag>`) | `getNodesSummary(groupBy="type")` 统计类型分布,识别 text+rectangle 组合 → 标签组件 |
207
202
  | 颜色提取 | 跳过 | 对每个 rectangle(背景)+ text(文字)取 `style.fills[0].color.hex` + `text.color` |
208
203
 
209
- **提示**:
210
- - 大型 .sketch 文件先 `listNodesByPage(type="artboard")` 锁定目标画板,避免一次性加载整个文档
211
- - `getNodesSummary` 是 token 节省关键:先按类型分组统计,再决定要查哪些节点 ID
212
- - 批量 `getMultipleNodeInfo` 严格 ≤ 100 个/次,超过需分批
213
- - 仅当结构化样式数据仍不足(如复杂渐变、阴影)时,才回退到 `renderNodeAsBase64` + `{{TOOL:analyze_design_image}}`
214
- - 如果 sketch-mcp-server 工具不可用,提示用户安装:`npm install -g sketch-mcp-server`
204
+ **实战经验沉淀(重要,4 条核心收获)**:
215
205
 
216
- **Sketch 结构 组件映射规则**:
206
+ **收获 1:首轮 `getMultipleNodeInfo` 必须全量拉取,不能挑**
207
+ - 错误做法:先查 7 个顶层容器,再根据需要分批补漏(结果补了 7 轮 ≈ 108 个节点)
208
+ - 正确做法:`getPageStructure(pageId)` 一次性拿全量 ID → `getMultipleNodeInfo(全部 text + 全部 rectangle 节点 ID)`,≤100 个/批,**2 批搞定**
217
209
 
218
- *页面级布局*:
219
- | Sketch 特征 | 推断结果 | 依据 |
220
- |---|---|---|
221
- | 画板名称(如 "4.1-编目审核-待办") | `pageName` | 直接使用 |
222
- | 左右分区布局 | `TemplateMode(templateTpye="LeftRight")` | 区域分布 |
223
- | 上下分区布局 | `TemplateMode(templateTpye="TopBottom")` | 区域分布 |
224
- | 标签页(Tabs) + 每个 Tab 内有表格 | `QueryTabsTables` 或 `TemplateMode` + Tabs | templatePatterns.QueryTabsTables |
210
+ **收获 2:text 节点是颜色/DOM 映射的两级索引**
211
+ 每个 text 节点同时关联两种上下文,**必须同批拉取**:
212
+ - 自身样式:`fontSize`、`fontWeight`、`text.color`
213
+ - 所属 group 父级 rectangle 样式:`bg`、`border`、`radius`、`shadow`
225
214
 
226
- *区域级组件*:
227
- | Sketch 特征 | 推断结果 | 依据 |
228
- |---|---|---|
229
- | 左侧窄区域 + 树形图层 | `LeftTree` 组件 | templatePatterns.TreeQueryTable |
230
- | 顶部输入框/下拉框/日期选择器 | `Query` 组件 | 搜索区域特征 |
231
- | 中间表头 + 数据行图层 | `TableOrList` 组件 | 表格区域特征 |
232
- | 弹窗/抽屉图层 | `ModelOrDrawer` 组件 | 弹窗交互特征 |
233
- | 页面标题 + 返回箭头 | `TitleAndBack` 组件 | 标题栏特征 |
234
- | 详情展示区域(只读字段) | `FormItemOrDetailItem(type="detail")` | 详情区特征 |
215
+ 错误做法:先查 text 拿自身样式 → 再根据 parent ID 单独查 rectangle(多走一步)
216
+ 正确做法:构造查询列表时,**把同一 group 内的 text + rectangle 节点 ID 合并提交**
235
217
 
236
- *数据可视化*:
237
- | Sketch 特征 | 推断结果 | 依据 |
238
- |---|---|---|
239
- | 折线趋势图/时间序列图 | `Line` | ECharts 层图表组件 |
240
- | 柱状对比图/条形图 | `Bar` | ECharts 层图表组件 |
241
- | 饼图/环形图/占比图 | `Pie` | ECharts 层图表组件 |
242
- | 雷达图/多维度对比 | `Radar` | ECharts 层图表组件 |
243
- | 仪表盘/进度指示 | `Gauge` | ECharts 层图表组件 |
244
- | 漏斗图/转化率 | `Funnel` | ECharts 层图表组件 |
218
+ **收获 3:图表区样式提取有规律可循**
245
219
 
246
- *表格子类型*:
247
- | Sketch 特征 | 推断结果 | 依据 |
220
+ | 图表子元素 | 对应 Sketch 节点类型 | 关键样式字段 |
248
221
  |---|---|---|
249
- | 可编辑表格(单元格直接输入) | `TableOrList(componentType="EditableProTable")` | 可编辑表格特征 |
250
- | 拖拽排序表格(有序号/拖拽手柄) | `TableOrList(componentType="DragSortTable")` | 拖拽排序特征 |
251
- | 卡片列表(非表格式数据卡片) | `TableOrList(componentType="ProList")` | 卡片布局特征 |
252
- | 步骤条表单(分步填写) | `ModelOrDrawer(componentType="steps")` | StepsForm 特征 |
222
+ | 图表标题 | `text`(带蓝色矩形左饰线) | 14px Semibold;矩形 4×14 #0079f7 |
223
+ | 图例文字 | `text` | 14px |
224
+ | 图例色块 | `rectangle` | 8×8 / 10×3 |
225
+ | 坐标轴文字 | `text`(成组) | 12px #7b828d |
226
+ | 柱体颜色 | 区域 `rectangle` | `style.fills[0].hex` |
227
+ | 数据标签 | `text`(白字) | 12px #ffffff |
253
228
 
254
- *辅助/插槽组件*:
255
- | Sketch 特征 | 推断结果 | 依据 |
256
- |---|---|---|
257
- | 树标题栏添加按钮/操作入口 | `CustomOption` | LeftTree 的 CustomOption 插槽 |
258
- | 树节点右键菜单/增删改操作 | `TreeNode` | LeftTree 的 CustomTreeNode 插槽 |
259
- | 圆形头像/头像编辑区 | `ModeAvatar` | 头像区域特征 |
260
- | 文件上传区/拖拽上传框 | `Upload`(Cover 层) | 上传区域特征 |
229
+ **图表区结构规律**:`标题 text + 标题装饰 rectangle + 图例 text*N + 色块 rectangle*N + 坐标轴 text*N + 柱体 rectangle*N + 标签 text*N`
230
+
231
+ 识别出图表后,**图例色块**应归入 ECharts `legend` 配置(不要用 div 硬编码),**柱体色**映射到 `series.itemStyle.color`。
232
+
233
+ **收获 4:矢量图形是工具链盲区(兜底方案)**
234
+ - `shapePath` / `shapeGroup` sketch 节点中占比可能高达 46.8%(实战中 434/926),但 `renderNodeAsBase64` 不支持渲染
235
+ - 解压 `.sketch`(zip 格式)只能提取 `bitmap` 中内嵌的 PNG/PDF(实战中可能仅 2 张,常是侧边栏 Logo)
236
+ - **兜底方案**:① 用解压提取的 PNG/PDF 资源;② 无资源时用 antd `@ant-design/icons` 同语义图标替代;③ 在代码注释中标注"⚠️ 矢量图标用 antd 图标替代,原始 Sketch 为 shapePath"
237
+
238
+ **提示**:
239
+ - 大型 .sketch 文件先 `listNodesByPage(type="artboard")` 锁定目标画板,避免一次性加载整个文档
240
+ - `getNodesSummary` 是 token 节省关键:先按类型分组统计,再决定要查哪些节点 ID
241
+ - 批量 `getMultipleNodeInfo` 严格 ≤ 100 个/次,超过需分批
242
+ - 仅当结构化样式数据仍不足(如复杂渐变、阴影)时,才回退到 `renderNodeAsBase64` + `{{TOOL:analyze_design_image}}`
243
+ - 如果 sketch-mcp-server 工具不可用,提示用户安装:`npm install -g sketch-mcp-server`
261
244
 
262
245
  **提示**:
263
246
  - 大型 .sketch 文件用 `getPageStructure(maxDepth=1-2)` 即可获取布局概况,避免深层递归超时
@@ -277,69 +260,86 @@ Ant Design → ProComponents → Cover 层 → Wrapper 层 → ProPackages →
277
260
  <!-- /EXCLUDE:enhanced -->
278
261
 
279
262
  <!-- INCLUDE:enhanced -->
280
- **视觉元素 组件映射推理(必须执行)**:
263
+ **步骤 3 职责边界**(与步骤 2.5 对称):
264
+ - ✅ 产出图片描述(结构化文本)
265
+ - ❌ 不做组件候选列表推理(统一在步骤 3.5 进行)
266
+ - ❌ 不调用 `get_component_full_profile`(统一在步骤 4 进行)
267
+
268
+ **禁止在步骤 3 内部**:
269
+ - ❌ 推理组件候选列表(应进入步骤 3.5)
270
+ - ❌ 批量获取组件 API(应进入步骤 4)
271
+ <!-- /INCLUDE:enhanced -->
272
+
273
+ <!-- INCLUDE:full -->
274
+ **输出**:设计稿的结构化描述文本(不含组件候选列表推理,候选列表由步骤 3.5 统一产出)
275
+ <!-- /INCLUDE:full -->
276
+
277
+ ### 步骤3.5:组件候选列表推理(统一环节,必做)
278
+
279
+ **这是统一的组件候选列表推理环节**,无论设计稿来源是 .sketch 文件(步骤 2.5)还是图片(步骤 3),都需经过此环节:
280
+
281
+ ```
282
+ 步骤 1 templatePatterns + 步骤 2.5/3 设计稿数据 → 组件候选列表
283
+ (4 种模板模式 + llmMappingHints) (结构 + 样式 Token) (如 ["Query","TableOrList","LeftTree","TemplateMode"])
284
+ ```
285
+
286
+ **输入**:
287
+ - 步骤 1 的 `{{TOOL:get_architecture_overview}}` 返回的 `templatePatterns`(TreeQueryTable / QueryTabsTables / LeftRight / UpDown)
288
+ - 步骤 1 的 `llmMappingHints.commonMistakes`(避免 LLM 常见映射错误)
289
+ - 步骤 2.5 的 Sketch 节点结构 + 样式 Token
290
+ - 或步骤 3 的图片分析描述
291
+
292
+ **输出**:
293
+ - **组件候选列表**(如 `["Query","TableOrList","LeftTree","TemplateMode"]`)
294
+ - 模板类型选择(如 `TemplateMode(templateType="LeftRight")`)
281
295
 
282
- 获得设计稿描述后,**必须结合步骤1的 `templatePatterns`**,将视觉元素映射为具体组件名,生成组件候选列表。**禁止跳过此推理直接进入步骤4逐个搜索。**
296
+ **禁止**:
297
+ - ❌ 在步骤 2.5 内部推理组件候选列表(应只产出 Sketch 数据 + 样式 Token)
298
+ - ❌ 在步骤 3 内部推理组件候选列表(应只产出图片描述)
299
+ - ❌ 跳过此环节直接调 `get_component_full_profile`(必须先有候选列表)
300
+
301
+ **推理时使用映射规则**(**此表为本步骤专用,仅含核心高频场景**):
283
302
 
284
303
  *页面级布局*:
285
- | 视觉特征 | 推断组件 | 依据 |
304
+ | Sketch 特征 | 推断结果 | 依据 |
286
305
  |---|---|---|
306
+ | 画板名称(如 "4.1-编目审核-待办") | `pageName` | 直接使用 |
287
307
  | 左右分区布局 | `TemplateMode(templateTpye="LeftRight")` | 区域分布 |
288
308
  | 上下分区布局 | `TemplateMode(templateTpye="TopBottom")` | 区域分布 |
289
- | 标签页切换 + 每个 Tab 内有表格 | `QueryTabsTables` 或 `TemplateMode` + Tabs | templatePatterns.QueryTabsTables |
309
+ | 标签页(Tabs) + 每个 Tab 内有表格 | `QueryTabsTables` 或 `TemplateMode` + Tabs | templatePatterns.QueryTabsTables |
290
310
 
291
311
  *区域级组件*:
292
- | 视觉特征 | 推断组件 | 依据 |
312
+ | Sketch 特征 | 推断结果 | 依据 |
293
313
  |---|---|---|
294
- | 左侧窄区域 + 树形结构 | `LeftTree` | templatePatterns.TreeQueryTable |
295
- | 顶部输入框/下拉框/日期选择器 | `Query` | 搜索区域特征 |
296
- | 中间表头 + 数据行 | `TableOrList` | 表格区域特征 |
297
- | 弹窗/抽屉 | `ModelOrDrawer` | 弹窗交互特征 |
298
- | 页面标题 + 返回箭头 | `TitleAndBack` | 标题栏特征 |
314
+ | 左侧窄区域 + 树形图层 | `LeftTree` 组件 | templatePatterns.TreeQueryTable |
315
+ | 顶部输入框/下拉框/日期选择器 | `Query` 组件 | 搜索区域特征 |
316
+ | 中间表头 + 数据行图层 | `TableOrList` 组件 | 表格区域特征 |
317
+ | 弹窗/抽屉图层 | `ModelOrDrawer` 组件 | 弹窗交互特征 |
318
+ | 页面标题 + 返回箭头 | `TitleAndBack` 组件 | 标题栏特征 |
299
319
  | 详情展示区域(只读字段) | `FormItemOrDetailItem(type="detail")` | 详情区特征 |
300
320
 
301
- *数据可视化*:
302
- | 视觉特征 | 推断组件 | 依据 |
303
- |---|---|---|
304
- | 折线趋势图/时间序列 | `Line` | ECharts 层,数据趋势展示 |
305
- | 柱状对比图/条形图 | `Bar` | ECharts 层,数据对比 |
306
- | 饼图/环形图/占比图 | `Pie` | ECharts 层,占比关系 |
307
- | 雷达图/多维度对比 | `Radar` | ECharts 层,多维指标 |
308
- | 仪表盘/进度指示 | `Gauge` | ECharts 层,单一指标 |
309
- | 漏斗图/转化率 | `Funnel` | ECharts 层,转化流程 |
310
-
311
- *表格子类型(根据 TableOrList 的 componentType 区分)*:
312
- | 视觉特征 | 推断 componentType | 依据 |
321
+ *数据可视化(核心 3 类)*:
322
+ | Sketch 特征 | 推断结果 | 依据 |
313
323
  |---|---|---|
314
- | 普通只读表格 + 分页 | `ProTable`(默认) | 标准表格 |
315
- | 可编辑表格(单元格直接输入) | `EditableProTable` | 单元格内编辑控件 |
316
- | 拖拽排序表格(有序号/拖拽手柄) | `DragSortTable` | 拖拽手柄特征 |
317
- | 卡片列表(非表格式数据卡片) | `ProList` | 卡片布局特征 |
318
- | 步骤条表单(分步填写) | `ModelOrDrawer(componentType="steps")` | StepsForm 特征 |
319
-
320
- *辅助/插槽组件*:
321
- | 视觉特征 | 推断组件 | 依据 |
324
+ | 折线趋势图/时间序列图 | `Line` | ECharts 层图表组件 |
325
+ | 柱状对比图/条形图 | `Bar` | ECharts 层图表组件 |
326
+ | 饼图/环形图/占比图 | `Pie` | ECharts 层图表组件 |
327
+
328
+ *表格子类型(核心 2 类)*:
329
+ | Sketch 特征 | 推断结果 | 依据 |
322
330
  |---|---|---|
323
- | 树标题栏添加按钮/操作入口 | `CustomOption` | LeftTree 的 CustomOption 插槽 |
324
- | 树节点右键菜单/增删改操作 | `TreeNode` | LeftTree 的 CustomTreeNode 插槽 |
325
- | 圆形头像/头像编辑区 | `ModeAvatar` | 头像区域特征 |
326
- | 文件上传区/拖拽上传框 | `Upload`(Cover 层) | 上传区域特征 |
331
+ | 可编辑表格(单元格直接输入) | `TableOrList(componentType="EditableProTable")` | 可编辑表格特征 |
332
+ | 卡片列表(非表格式数据卡片) | `TableOrList(componentType="ProList")` | 卡片布局特征 |
327
333
 
328
- **推理完成后,立即批量获取组件详情**:
329
- - 调用 `{{TOOL:get_component_full_profile}}`(name="Query,TableOrList,LeftTree,...", depth="deep")**一次性**获取所有候选组件 API
330
- - 如需样式注入细节,追加 `{{TOOL:get_style_injection_guide}}`
334
+ **长尾场景走语义搜索**(不进文档,避免膨胀):
331
335
 
332
- **设计稿 → szcd 工作流(与 Sketch 流程对齐)**:
333
- ```
334
- 设计稿图片 → analyze_design_image → 视觉描述文本
335
- → [步骤1 templatePatterns + 映射推理表] → 组件候选列表
336
- → get_component_full_profile(批量) → 进入步骤4验证依赖
337
- ```
338
- <!-- /INCLUDE:enhanced -->
336
+ *数据可视化长尾*:`Radar`(雷达图)、`Gauge`(仪表盘)、`Funnel`(漏斗图)
339
337
 
340
- <!-- INCLUDE:full -->
341
- **输出**:设计稿的结构化描述文本 + 组件候选列表 + 批量获取的组件详情
342
- <!-- /INCLUDE:full -->
338
+ *表格子类型长尾*:`DragSortTable`(拖拽排序表格)、`ModelOrDrawer(componentType="steps")`(步骤条表单)
339
+
340
+ *辅助/插槽组件*:`CustomOption`(LeftTree 添加按钮插槽)、`TreeNode`(树节点右键菜单插槽)、`ModeAvatar`(圆形头像)、`Upload`(文件上传)
341
+
342
+ **处理方式**:本表未覆盖的视觉特征 → 调用 `{{TOOL:search_components_semantic}}`(query="[场景描述,如'拖拽排序表格']")按需补全,再进入步骤 4。
343
343
 
344
344
  ### 步骤4:查询组件 + 依赖验证(必做)
345
345