@szc-ft/mcp-szcd-client 0.22.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.
- package/agents/opencode-extension/agents/szcd-component-expert.md +136 -44
- package/agents/qwen-extension/agents/szcd-component-expert.md +136 -44
- package/agents/src/szcd-component-expert.md +147 -105
- package/agents/szcd-component-expert.md +136 -44
- package/agents/szcd-component-expert.qoder.md +144 -102
- package/agents/szcd-component-expert.trae.md +143 -101
- package/opencode-extension/agents/szcd-component-expert.md +136 -44
- package/opencode-extension/skills/szcd-design-to-code/SKILL.md +97 -16
- package/package.json +1 -1
- package/qwen-extension/agents/szcd-component-expert.md +136 -44
- package/qwen-extension/qwen-extension.json +1 -1
- package/qwen-extension/skills/szcd-design-to-code/SKILL.md +97 -16
- package/standard-skill/szcd-design-to-code/SKILL.md +97 -16
|
@@ -122,79 +122,104 @@ Ant Design → ProComponents → Cover 层 → Wrapper 层 → ProPackages →
|
|
|
122
122
|
|
|
123
123
|
**当用户提供 .sketch 设计文件时**,使用 `sketch-mcp-server`(独立 MCP Server,stdio 模式)解析,直接提取结构化数据,结合组件库架构推理组件方案,无需经过视觉模型和 `map_design_data`。
|
|
124
124
|
|
|
125
|
-
|
|
125
|
+
**核心原则**:写代码前必须先 `getMultipleNodeInfo` 拉取所有 `text` 和 `rectangle` 节点的完整样式 Token(`style.fills[0].color.hex`、`text.color`、`style.fontSize`),禁止凭节点名猜测颜色和样式。一次批量查询(50-100 个 ID)比逐个 `getNodeInfo` 快 10 倍以上,且不会遗漏。
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
**工作流(6步深度探查,像素级还原)**:
|
|
128
|
+
|
|
129
|
+
1. **加载文件**:
|
|
128
130
|
- `loadSketchByPath` 加载 .sketch 文件
|
|
129
131
|
- `listPages` 列出所有页面
|
|
130
132
|
- `listNodesByPage`(type="artboard")获取画板列表
|
|
131
|
-
-
|
|
133
|
+
- 根据画板名称选择目标页面
|
|
134
|
+
|
|
135
|
+
2. **获取完整节点树**:
|
|
136
|
+
- `getPageStructure`(pageId)**或** `getDocumentStructure`(includeDetails=true)— 拿到完整节点树 + 所有节点 ID
|
|
137
|
+
- 必须 `includeDetails=true`,否则拿不到初始样式
|
|
138
|
+
- 拿到所有节点 ID 列表,为下一步分组做准备
|
|
139
|
+
|
|
140
|
+
3. **按类型分组统计**:
|
|
141
|
+
- `getNodesSummary`(pageId, groupBy="type")— 按类型分组,统计 text/rectangle/group 各多少个
|
|
142
|
+
- 识别组件模式:
|
|
143
|
+
- `group(rectangle + text)` = 标签组件(如状态徽章)
|
|
144
|
+
- `group(text + text + rectangle...)` = 表单项
|
|
145
|
+
- `group(text 列表 + 边框)` = 表格行
|
|
146
|
+
- 决定下一批 `getMultipleNodeInfo` 的目标节点范围(所有 type=text + type=rectangle)
|
|
147
|
+
|
|
148
|
+
4. **批量拉取样式 Token**:
|
|
149
|
+
- `getMultipleNodeInfo`([id1, id2, ...])— 每次 ≤ 100 个节点
|
|
150
|
+
- 关键字段提取:
|
|
151
|
+
- 背景色:`style.fills[0].color.hex`
|
|
152
|
+
- 文字色:`text.color`(部分版本在 `style.fills[0].color`)
|
|
153
|
+
- 字号:`style.fontSize`
|
|
154
|
+
- 字重:`style.fontWeight`
|
|
155
|
+
- 边框:`style.borders[0].color.hex` + `thickness`
|
|
156
|
+
- **禁止**逐个 `getNodeInfo` 探查
|
|
157
|
+
|
|
158
|
+
**步骤 2.5 产出物**(**只产出数据,不做组件映射**):
|
|
159
|
+
- Sketch 节点结构 + 全量节点 ID 列表
|
|
160
|
+
- text/rectangle 节点的完整样式 Token
|
|
161
|
+
- 图表区结构规律识别结果
|
|
162
|
+
|
|
163
|
+
组件候选列表推理**不**在步骤 2.5 内部完成,**统一在主流程步骤 3.5 中结合步骤 1 的 `templatePatterns` 推理**。
|
|
164
|
+
|
|
165
|
+
**Sketch → szcd 工作流(结构化直传 + 样式 Token,无需视觉模型)**:
|
|
166
|
+
```
|
|
167
|
+
.sketch → loadSketchByPath → listPages → listNodesByPage(type=artboard)
|
|
168
|
+
→ getPageStructure(includeDetails=true) / getDocumentStructure(includeDetails=true)
|
|
169
|
+
→ getNodesSummary(groupBy="type")
|
|
170
|
+
→ getMultipleNodeInfo([所有text+rectangle节点ID]) ← 步骤 2.5 结束
|
|
171
|
+
→ [进入主流程步骤 3.5 统一推理]
|
|
172
|
+
```
|
|
132
173
|
|
|
133
|
-
|
|
134
|
-
- `get_architecture_overview` 的 `templatePatterns` 提供模板组合模式
|
|
135
|
-
- `llmMappingHints` 提供常见错误修正
|
|
174
|
+
**首轮常见错误 → 正确做法对照表**:
|
|
136
175
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
176
|
+
| 步骤 | 第一次做错的 | 应该做的 |
|
|
177
|
+
|------|------------|---------|
|
|
178
|
+
| 结构获取 | `getDocumentStructure(includeDetails=false)` 只有名称和位置 | `includeDetails=true` 或 `getPageStructure`,拿到初始样式 |
|
|
179
|
+
| 样式提取 | 没做 | `getMultipleNodeInfo` 批量拉取所有 type=text 和 type=rectangle 节点 |
|
|
180
|
+
| 组件识别 | 凭节点名猜测(如看到 "tag" 节点就写 `<Tag>`) | `getNodesSummary(groupBy="type")` 统计类型分布,识别 text+rectangle 组合 → 标签组件 |
|
|
181
|
+
| 颜色提取 | 跳过 | 对每个 rectangle(背景)+ text(文字)取 `style.fills[0].color.hex` + `text.color` |
|
|
141
182
|
|
|
142
|
-
4
|
|
143
|
-
- 调用 `get_component_full_profile`(name="Query,TableOrList,LeftTree,TemplateMode", depth="deep")一次性获取所有需要的组件 API
|
|
144
|
-
- 如需样式注入细节,追加 `get_style_injection_guide`
|
|
183
|
+
**实战经验沉淀(重要,4 条核心收获)**:
|
|
145
184
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
→ getNodeInfo/getPageStructure → [步骤1架构数据] → LLM推理组件
|
|
150
|
-
→ get_component_full_profile(批量) → 编码
|
|
151
|
-
```
|
|
185
|
+
**收获 1:首轮 `getMultipleNodeInfo` 必须全量拉取,不能挑**
|
|
186
|
+
- 错误做法:先查 7 个顶层容器,再根据需要分批补漏(结果补了 7 轮 ≈ 108 个节点)
|
|
187
|
+
- 正确做法:`getPageStructure(pageId)` 一次性拿全量 ID → `getMultipleNodeInfo(全部 text + 全部 rectangle 节点 ID)`,≤100 个/批,**2 批搞定**
|
|
152
188
|
|
|
153
|
-
|
|
189
|
+
**收获 2:text 节点是颜色/DOM 映射的两级索引**
|
|
190
|
+
每个 text 节点同时关联两种上下文,**必须同批拉取**:
|
|
191
|
+
- 自身样式:`fontSize`、`fontWeight`、`text.color`
|
|
192
|
+
- 所属 group 父级 rectangle 样式:`bg`、`border`、`radius`、`shadow`
|
|
154
193
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|---|---|---|
|
|
158
|
-
| 画板名称(如 "4.1-编目审核-待办") | `pageName` | 直接使用 |
|
|
159
|
-
| 左右分区布局 | `TemplateMode(templateTpye="LeftRight")` | 区域分布 |
|
|
160
|
-
| 上下分区布局 | `TemplateMode(templateTpye="TopBottom")` | 区域分布 |
|
|
161
|
-
| 标签页(Tabs) + 每个 Tab 内有表格 | `QueryTabsTables` 或 `TemplateMode` + Tabs | templatePatterns.QueryTabsTables |
|
|
194
|
+
错误做法:先查 text 拿自身样式 → 再根据 parent ID 单独查 rectangle(多走一步)
|
|
195
|
+
正确做法:构造查询列表时,**把同一 group 内的 text + rectangle 节点 ID 合并提交**
|
|
162
196
|
|
|
163
|
-
|
|
164
|
-
| Sketch 特征 | 推断结果 | 依据 |
|
|
165
|
-
|---|---|---|
|
|
166
|
-
| 左侧窄区域 + 树形图层 | `LeftTree` 组件 | templatePatterns.TreeQueryTable |
|
|
167
|
-
| 顶部输入框/下拉框/日期选择器 | `Query` 组件 | 搜索区域特征 |
|
|
168
|
-
| 中间表头 + 数据行图层 | `TableOrList` 组件 | 表格区域特征 |
|
|
169
|
-
| 弹窗/抽屉图层 | `ModelOrDrawer` 组件 | 弹窗交互特征 |
|
|
170
|
-
| 页面标题 + 返回箭头 | `TitleAndBack` 组件 | 标题栏特征 |
|
|
171
|
-
| 详情展示区域(只读字段) | `FormItemOrDetailItem(type="detail")` | 详情区特征 |
|
|
197
|
+
**收获 3:图表区样式提取有规律可循**
|
|
172
198
|
|
|
173
|
-
|
|
174
|
-
| Sketch 特征 | 推断结果 | 依据 |
|
|
199
|
+
| 图表子元素 | 对应 Sketch 节点类型 | 关键样式字段 |
|
|
175
200
|
|---|---|---|
|
|
176
|
-
|
|
|
177
|
-
|
|
|
178
|
-
|
|
|
179
|
-
|
|
|
180
|
-
|
|
|
181
|
-
|
|
|
201
|
+
| 图表标题 | `text`(带蓝色矩形左饰线) | 14px Semibold;矩形 4×14 #0079f7 |
|
|
202
|
+
| 图例文字 | `text` | 14px |
|
|
203
|
+
| 图例色块 | `rectangle` | 8×8 / 10×3 |
|
|
204
|
+
| 坐标轴文字 | `text`(成组) | 12px #7b828d |
|
|
205
|
+
| 柱体颜色 | 区域 `rectangle` | `style.fills[0].hex` |
|
|
206
|
+
| 数据标签 | `text`(白字) | 12px #ffffff |
|
|
182
207
|
|
|
183
|
-
|
|
184
|
-
| Sketch 特征 | 推断结果 | 依据 |
|
|
185
|
-
|---|---|---|
|
|
186
|
-
| 可编辑表格(单元格直接输入) | `TableOrList(componentType="EditableProTable")` | 可编辑表格特征 |
|
|
187
|
-
| 拖拽排序表格(有序号/拖拽手柄) | `TableOrList(componentType="DragSortTable")` | 拖拽排序特征 |
|
|
188
|
-
| 卡片列表(非表格式数据卡片) | `TableOrList(componentType="ProList")` | 卡片布局特征 |
|
|
189
|
-
| 步骤条表单(分步填写) | `ModelOrDrawer(componentType="steps")` | StepsForm 特征 |
|
|
208
|
+
**图表区结构规律**:`标题 text + 标题装饰 rectangle + 图例 text*N + 色块 rectangle*N + 坐标轴 text*N + 柱体 rectangle*N + 标签 text*N`
|
|
190
209
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
210
|
+
识别出图表后,**图例色块**应归入 ECharts `legend` 配置(不要用 div 硬编码),**柱体色**映射到 `series.itemStyle.color`。
|
|
211
|
+
|
|
212
|
+
**收获 4:矢量图形是工具链盲区(兜底方案)**
|
|
213
|
+
- `shapePath` / `shapeGroup` 在 sketch 节点中占比可能高达 46.8%(实战中 434/926),但 `renderNodeAsBase64` 不支持渲染
|
|
214
|
+
- 解压 `.sketch`(zip 格式)只能提取 `bitmap` 中内嵌的 PNG/PDF(实战中可能仅 2 张,常是侧边栏 Logo)
|
|
215
|
+
- **兜底方案**:① 用解压提取的 PNG/PDF 资源;② 无资源时用 antd `@ant-design/icons` 同语义图标替代;③ 在代码注释中标注"⚠️ 矢量图标用 antd 图标替代,原始 Sketch 为 shapePath"
|
|
216
|
+
|
|
217
|
+
**提示**:
|
|
218
|
+
- 大型 .sketch 文件先 `listNodesByPage(type="artboard")` 锁定目标画板,避免一次性加载整个文档
|
|
219
|
+
- `getNodesSummary` 是 token 节省关键:先按类型分组统计,再决定要查哪些节点 ID
|
|
220
|
+
- 批量 `getMultipleNodeInfo` 严格 ≤ 100 个/次,超过需分批
|
|
221
|
+
- 仅当结构化样式数据仍不足(如复杂渐变、阴影)时,才回退到 `renderNodeAsBase64` + `analyze_design_image`
|
|
222
|
+
- 如果 sketch-mcp-server 工具不可用,提示用户安装:`npm install -g sketch-mcp-server`
|
|
198
223
|
|
|
199
224
|
**提示**:
|
|
200
225
|
- 大型 .sketch 文件用 `getPageStructure(maxDepth=1-2)` 即可获取布局概况,避免深层递归超时
|
|
@@ -210,66 +235,83 @@ Ant Design → ProComponents → Cover 层 → Wrapper 层 → ProPackages →
|
|
|
210
235
|
- 如果该工具不可用,告知用户需要提供设计稿的文字描述
|
|
211
236
|
|
|
212
237
|
|
|
213
|
-
|
|
238
|
+
**步骤 3 职责边界**(与步骤 2.5 对称):
|
|
239
|
+
- ✅ 产出图片描述(结构化文本)
|
|
240
|
+
- ❌ 不做组件候选列表推理(统一在步骤 3.5 进行)
|
|
241
|
+
- ❌ 不调用 `get_component_full_profile`(统一在步骤 4 进行)
|
|
242
|
+
|
|
243
|
+
**禁止在步骤 3 内部**:
|
|
244
|
+
- ❌ 推理组件候选列表(应进入步骤 3.5)
|
|
245
|
+
- ❌ 批量获取组件 API(应进入步骤 4)
|
|
246
|
+
|
|
247
|
+
**输出**:设计稿的结构化描述文本(不含组件候选列表推理,候选列表由步骤 3.5 统一产出)
|
|
248
|
+
|
|
249
|
+
### 步骤3.5:组件候选列表推理(统一环节,必做)
|
|
250
|
+
|
|
251
|
+
**这是统一的组件候选列表推理环节**,无论设计稿来源是 .sketch 文件(步骤 2.5)还是图片(步骤 3),都需经过此环节:
|
|
252
|
+
|
|
253
|
+
```
|
|
254
|
+
步骤 1 templatePatterns + 步骤 2.5/3 设计稿数据 → 组件候选列表
|
|
255
|
+
(4 种模板模式 + llmMappingHints) (结构 + 样式 Token) (如 ["Query","TableOrList","LeftTree","TemplateMode"])
|
|
256
|
+
```
|
|
214
257
|
|
|
215
|
-
|
|
258
|
+
**输入**:
|
|
259
|
+
- 步骤 1 的 `get_architecture_overview` 返回的 `templatePatterns`(TreeQueryTable / QueryTabsTables / LeftRight / UpDown)
|
|
260
|
+
- 步骤 1 的 `llmMappingHints.commonMistakes`(避免 LLM 常见映射错误)
|
|
261
|
+
- 步骤 2.5 的 Sketch 节点结构 + 样式 Token
|
|
262
|
+
- 或步骤 3 的图片分析描述
|
|
263
|
+
|
|
264
|
+
**输出**:
|
|
265
|
+
- **组件候选列表**(如 `["Query","TableOrList","LeftTree","TemplateMode"]`)
|
|
266
|
+
- 模板类型选择(如 `TemplateMode(templateType="LeftRight")`)
|
|
267
|
+
|
|
268
|
+
**禁止**:
|
|
269
|
+
- ❌ 在步骤 2.5 内部推理组件候选列表(应只产出 Sketch 数据 + 样式 Token)
|
|
270
|
+
- ❌ 在步骤 3 内部推理组件候选列表(应只产出图片描述)
|
|
271
|
+
- ❌ 跳过此环节直接调 `get_component_full_profile`(必须先有候选列表)
|
|
272
|
+
|
|
273
|
+
**推理时使用映射规则**(**此表为本步骤专用,仅含核心高频场景**):
|
|
216
274
|
|
|
217
275
|
*页面级布局*:
|
|
218
|
-
|
|
|
276
|
+
| Sketch 特征 | 推断结果 | 依据 |
|
|
219
277
|
|---|---|---|
|
|
278
|
+
| 画板名称(如 "4.1-编目审核-待办") | `pageName` | 直接使用 |
|
|
220
279
|
| 左右分区布局 | `TemplateMode(templateTpye="LeftRight")` | 区域分布 |
|
|
221
280
|
| 上下分区布局 | `TemplateMode(templateTpye="TopBottom")` | 区域分布 |
|
|
222
|
-
|
|
|
281
|
+
| 标签页(Tabs) + 每个 Tab 内有表格 | `QueryTabsTables` 或 `TemplateMode` + Tabs | templatePatterns.QueryTabsTables |
|
|
223
282
|
|
|
224
283
|
*区域级组件*:
|
|
225
|
-
|
|
|
284
|
+
| Sketch 特征 | 推断结果 | 依据 |
|
|
226
285
|
|---|---|---|
|
|
227
|
-
| 左侧窄区域 +
|
|
228
|
-
| 顶部输入框/下拉框/日期选择器 | `Query` | 搜索区域特征 |
|
|
229
|
-
| 中间表头 +
|
|
230
|
-
|
|
|
231
|
-
| 页面标题 + 返回箭头 | `TitleAndBack` | 标题栏特征 |
|
|
286
|
+
| 左侧窄区域 + 树形图层 | `LeftTree` 组件 | templatePatterns.TreeQueryTable |
|
|
287
|
+
| 顶部输入框/下拉框/日期选择器 | `Query` 组件 | 搜索区域特征 |
|
|
288
|
+
| 中间表头 + 数据行图层 | `TableOrList` 组件 | 表格区域特征 |
|
|
289
|
+
| 弹窗/抽屉图层 | `ModelOrDrawer` 组件 | 弹窗交互特征 |
|
|
290
|
+
| 页面标题 + 返回箭头 | `TitleAndBack` 组件 | 标题栏特征 |
|
|
232
291
|
| 详情展示区域(只读字段) | `FormItemOrDetailItem(type="detail")` | 详情区特征 |
|
|
233
292
|
|
|
234
|
-
|
|
235
|
-
|
|
|
236
|
-
|---|---|---|
|
|
237
|
-
| 折线趋势图/时间序列 | `Line` | ECharts 层,数据趋势展示 |
|
|
238
|
-
| 柱状对比图/条形图 | `Bar` | ECharts 层,数据对比 |
|
|
239
|
-
| 饼图/环形图/占比图 | `Pie` | ECharts 层,占比关系 |
|
|
240
|
-
| 雷达图/多维度对比 | `Radar` | ECharts 层,多维指标 |
|
|
241
|
-
| 仪表盘/进度指示 | `Gauge` | ECharts 层,单一指标 |
|
|
242
|
-
| 漏斗图/转化率 | `Funnel` | ECharts 层,转化流程 |
|
|
243
|
-
|
|
244
|
-
*表格子类型(根据 TableOrList 的 componentType 区分)*:
|
|
245
|
-
| 视觉特征 | 推断 componentType | 依据 |
|
|
293
|
+
*数据可视化(核心 3 类)*:
|
|
294
|
+
| Sketch 特征 | 推断结果 | 依据 |
|
|
246
295
|
|---|---|---|
|
|
247
|
-
|
|
|
248
|
-
|
|
|
249
|
-
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
*辅助/插槽组件*:
|
|
254
|
-
| 视觉特征 | 推断组件 | 依据 |
|
|
296
|
+
| 折线趋势图/时间序列图 | `Line` | ECharts 层图表组件 |
|
|
297
|
+
| 柱状对比图/条形图 | `Bar` | ECharts 层图表组件 |
|
|
298
|
+
| 饼图/环形图/占比图 | `Pie` | ECharts 层图表组件 |
|
|
299
|
+
|
|
300
|
+
*表格子类型(核心 2 类)*:
|
|
301
|
+
| Sketch 特征 | 推断结果 | 依据 |
|
|
255
302
|
|---|---|---|
|
|
256
|
-
|
|
|
257
|
-
|
|
|
258
|
-
| 圆形头像/头像编辑区 | `ModeAvatar` | 头像区域特征 |
|
|
259
|
-
| 文件上传区/拖拽上传框 | `Upload`(Cover 层) | 上传区域特征 |
|
|
303
|
+
| 可编辑表格(单元格直接输入) | `TableOrList(componentType="EditableProTable")` | 可编辑表格特征 |
|
|
304
|
+
| 卡片列表(非表格式数据卡片) | `TableOrList(componentType="ProList")` | 卡片布局特征 |
|
|
260
305
|
|
|
261
|
-
|
|
262
|
-
- 调用 `get_component_full_profile`(name="Query,TableOrList,LeftTree,...", depth="deep")**一次性**获取所有候选组件 API
|
|
263
|
-
- 如需样式注入细节,追加 `get_style_injection_guide`
|
|
306
|
+
**长尾场景走语义搜索**(不进文档,避免膨胀):
|
|
264
307
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
```
|
|
308
|
+
*数据可视化长尾*:`Radar`(雷达图)、`Gauge`(仪表盘)、`Funnel`(漏斗图)
|
|
309
|
+
|
|
310
|
+
*表格子类型长尾*:`DragSortTable`(拖拽排序表格)、`ModelOrDrawer(componentType="steps")`(步骤条表单)
|
|
311
|
+
|
|
312
|
+
*辅助/插槽组件*:`CustomOption`(LeftTree 添加按钮插槽)、`TreeNode`(树节点右键菜单插槽)、`ModeAvatar`(圆形头像)、`Upload`(文件上传)
|
|
271
313
|
|
|
272
|
-
|
|
314
|
+
**处理方式**:本表未覆盖的视觉特征 → 调用 `search_components_semantic`(query="[场景描述,如'拖拽排序表格']")按需补全,再进入步骤 4。
|
|
273
315
|
|
|
274
316
|
### 步骤4:查询组件 + 依赖验证(必做)
|
|
275
317
|
|
|
@@ -86,79 +86,104 @@ Ant Design → ProComponents → Cover 层 → Wrapper 层 → ProPackages →
|
|
|
86
86
|
|
|
87
87
|
**当用户提供 .sketch 设计文件时**,使用 `sketch-mcp-server`(独立 MCP Server,stdio 模式)解析,直接提取结构化数据,结合组件库架构推理组件方案,无需经过视觉模型和 `mcp__szcd-component-helper__map_design_data`。
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
**核心原则**:写代码前必须先 `getMultipleNodeInfo` 拉取所有 `text` 和 `rectangle` 节点的完整样式 Token(`style.fills[0].color.hex`、`text.color`、`style.fontSize`),禁止凭节点名猜测颜色和样式。一次批量查询(50-100 个 ID)比逐个 `getNodeInfo` 快 10 倍以上,且不会遗漏。
|
|
90
90
|
|
|
91
|
-
|
|
91
|
+
**工作流(6步深度探查,像素级还原)**:
|
|
92
|
+
|
|
93
|
+
1. **加载文件**:
|
|
92
94
|
- `loadSketchByPath` 加载 .sketch 文件
|
|
93
95
|
- `listPages` 列出所有页面
|
|
94
96
|
- `listNodesByPage`(type="artboard")获取画板列表
|
|
95
|
-
-
|
|
97
|
+
- 根据画板名称选择目标页面
|
|
98
|
+
|
|
99
|
+
2. **获取完整节点树**:
|
|
100
|
+
- `getPageStructure`(pageId)**或** `getDocumentStructure`(includeDetails=true)— 拿到完整节点树 + 所有节点 ID
|
|
101
|
+
- 必须 `includeDetails=true`,否则拿不到初始样式
|
|
102
|
+
- 拿到所有节点 ID 列表,为下一步分组做准备
|
|
103
|
+
|
|
104
|
+
3. **按类型分组统计**:
|
|
105
|
+
- `getNodesSummary`(pageId, groupBy="type")— 按类型分组,统计 text/rectangle/group 各多少个
|
|
106
|
+
- 识别组件模式:
|
|
107
|
+
- `group(rectangle + text)` = 标签组件(如状态徽章)
|
|
108
|
+
- `group(text + text + rectangle...)` = 表单项
|
|
109
|
+
- `group(text 列表 + 边框)` = 表格行
|
|
110
|
+
- 决定下一批 `getMultipleNodeInfo` 的目标节点范围(所有 type=text + type=rectangle)
|
|
111
|
+
|
|
112
|
+
4. **批量拉取样式 Token**:
|
|
113
|
+
- `getMultipleNodeInfo`([id1, id2, ...])— 每次 ≤ 100 个节点
|
|
114
|
+
- 关键字段提取:
|
|
115
|
+
- 背景色:`style.fills[0].color.hex`
|
|
116
|
+
- 文字色:`text.color`(部分版本在 `style.fills[0].color`)
|
|
117
|
+
- 字号:`style.fontSize`
|
|
118
|
+
- 字重:`style.fontWeight`
|
|
119
|
+
- 边框:`style.borders[0].color.hex` + `thickness`
|
|
120
|
+
- **禁止**逐个 `getNodeInfo` 探查
|
|
121
|
+
|
|
122
|
+
**步骤 2.5 产出物**(**只产出数据,不做组件映射**):
|
|
123
|
+
- Sketch 节点结构 + 全量节点 ID 列表
|
|
124
|
+
- text/rectangle 节点的完整样式 Token
|
|
125
|
+
- 图表区结构规律识别结果
|
|
126
|
+
|
|
127
|
+
组件候选列表推理**不**在步骤 2.5 内部完成,**统一在主流程步骤 3.5 中结合步骤 1 的 `templatePatterns` 推理**。
|
|
128
|
+
|
|
129
|
+
**Sketch → szcd 工作流(结构化直传 + 样式 Token,无需视觉模型)**:
|
|
130
|
+
```
|
|
131
|
+
.sketch → loadSketchByPath → listPages → listNodesByPage(type=artboard)
|
|
132
|
+
→ getPageStructure(includeDetails=true) / getDocumentStructure(includeDetails=true)
|
|
133
|
+
→ getNodesSummary(groupBy="type")
|
|
134
|
+
→ getMultipleNodeInfo([所有text+rectangle节点ID]) ← 步骤 2.5 结束
|
|
135
|
+
→ [进入主流程步骤 3.5 统一推理]
|
|
136
|
+
```
|
|
96
137
|
|
|
97
|
-
|
|
98
|
-
- `mcp__szcd-component-helper__get_architecture_overview` 的 `templatePatterns` 提供模板组合模式
|
|
99
|
-
- `llmMappingHints` 提供常见错误修正
|
|
138
|
+
**首轮常见错误 → 正确做法对照表**:
|
|
100
139
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
140
|
+
| 步骤 | 第一次做错的 | 应该做的 |
|
|
141
|
+
|------|------------|---------|
|
|
142
|
+
| 结构获取 | `getDocumentStructure(includeDetails=false)` 只有名称和位置 | `includeDetails=true` 或 `getPageStructure`,拿到初始样式 |
|
|
143
|
+
| 样式提取 | 没做 | `getMultipleNodeInfo` 批量拉取所有 type=text 和 type=rectangle 节点 |
|
|
144
|
+
| 组件识别 | 凭节点名猜测(如看到 "tag" 节点就写 `<Tag>`) | `getNodesSummary(groupBy="type")` 统计类型分布,识别 text+rectangle 组合 → 标签组件 |
|
|
145
|
+
| 颜色提取 | 跳过 | 对每个 rectangle(背景)+ text(文字)取 `style.fills[0].color.hex` + `text.color` |
|
|
105
146
|
|
|
106
|
-
4
|
|
107
|
-
- 调用 `mcp__szcd-component-helper__get_component_full_profile`(name="Query,TableOrList,LeftTree,TemplateMode", depth="deep")一次性获取所有需要的组件 API
|
|
108
|
-
- 如需样式注入细节,追加 `mcp__szcd-component-helper__get_style_injection_guide`
|
|
147
|
+
**实战经验沉淀(重要,4 条核心收获)**:
|
|
109
148
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
→ getNodeInfo/getPageStructure → [步骤1架构数据] → LLM推理组件
|
|
114
|
-
→ get_component_full_profile(批量) → 编码
|
|
115
|
-
```
|
|
149
|
+
**收获 1:首轮 `getMultipleNodeInfo` 必须全量拉取,不能挑**
|
|
150
|
+
- 错误做法:先查 7 个顶层容器,再根据需要分批补漏(结果补了 7 轮 ≈ 108 个节点)
|
|
151
|
+
- 正确做法:`getPageStructure(pageId)` 一次性拿全量 ID → `getMultipleNodeInfo(全部 text + 全部 rectangle 节点 ID)`,≤100 个/批,**2 批搞定**
|
|
116
152
|
|
|
117
|
-
|
|
153
|
+
**收获 2:text 节点是颜色/DOM 映射的两级索引**
|
|
154
|
+
每个 text 节点同时关联两种上下文,**必须同批拉取**:
|
|
155
|
+
- 自身样式:`fontSize`、`fontWeight`、`text.color`
|
|
156
|
+
- 所属 group 父级 rectangle 样式:`bg`、`border`、`radius`、`shadow`
|
|
118
157
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|---|---|---|
|
|
122
|
-
| 画板名称(如 "4.1-编目审核-待办") | `pageName` | 直接使用 |
|
|
123
|
-
| 左右分区布局 | `TemplateMode(templateTpye="LeftRight")` | 区域分布 |
|
|
124
|
-
| 上下分区布局 | `TemplateMode(templateTpye="TopBottom")` | 区域分布 |
|
|
125
|
-
| 标签页(Tabs) + 每个 Tab 内有表格 | `QueryTabsTables` 或 `TemplateMode` + Tabs | templatePatterns.QueryTabsTables |
|
|
158
|
+
错误做法:先查 text 拿自身样式 → 再根据 parent ID 单独查 rectangle(多走一步)
|
|
159
|
+
正确做法:构造查询列表时,**把同一 group 内的 text + rectangle 节点 ID 合并提交**
|
|
126
160
|
|
|
127
|
-
|
|
128
|
-
| Sketch 特征 | 推断结果 | 依据 |
|
|
129
|
-
|---|---|---|
|
|
130
|
-
| 左侧窄区域 + 树形图层 | `LeftTree` 组件 | templatePatterns.TreeQueryTable |
|
|
131
|
-
| 顶部输入框/下拉框/日期选择器 | `Query` 组件 | 搜索区域特征 |
|
|
132
|
-
| 中间表头 + 数据行图层 | `TableOrList` 组件 | 表格区域特征 |
|
|
133
|
-
| 弹窗/抽屉图层 | `ModelOrDrawer` 组件 | 弹窗交互特征 |
|
|
134
|
-
| 页面标题 + 返回箭头 | `TitleAndBack` 组件 | 标题栏特征 |
|
|
135
|
-
| 详情展示区域(只读字段) | `FormItemOrDetailItem(type="detail")` | 详情区特征 |
|
|
161
|
+
**收获 3:图表区样式提取有规律可循**
|
|
136
162
|
|
|
137
|
-
|
|
138
|
-
| Sketch 特征 | 推断结果 | 依据 |
|
|
163
|
+
| 图表子元素 | 对应 Sketch 节点类型 | 关键样式字段 |
|
|
139
164
|
|---|---|---|
|
|
140
|
-
|
|
|
141
|
-
|
|
|
142
|
-
|
|
|
143
|
-
|
|
|
144
|
-
|
|
|
145
|
-
|
|
|
165
|
+
| 图表标题 | `text`(带蓝色矩形左饰线) | 14px Semibold;矩形 4×14 #0079f7 |
|
|
166
|
+
| 图例文字 | `text` | 14px |
|
|
167
|
+
| 图例色块 | `rectangle` | 8×8 / 10×3 |
|
|
168
|
+
| 坐标轴文字 | `text`(成组) | 12px #7b828d |
|
|
169
|
+
| 柱体颜色 | 区域 `rectangle` | `style.fills[0].hex` |
|
|
170
|
+
| 数据标签 | `text`(白字) | 12px #ffffff |
|
|
146
171
|
|
|
147
|
-
|
|
148
|
-
| Sketch 特征 | 推断结果 | 依据 |
|
|
149
|
-
|---|---|---|
|
|
150
|
-
| 可编辑表格(单元格直接输入) | `TableOrList(componentType="EditableProTable")` | 可编辑表格特征 |
|
|
151
|
-
| 拖拽排序表格(有序号/拖拽手柄) | `TableOrList(componentType="DragSortTable")` | 拖拽排序特征 |
|
|
152
|
-
| 卡片列表(非表格式数据卡片) | `TableOrList(componentType="ProList")` | 卡片布局特征 |
|
|
153
|
-
| 步骤条表单(分步填写) | `ModelOrDrawer(componentType="steps")` | StepsForm 特征 |
|
|
172
|
+
**图表区结构规律**:`标题 text + 标题装饰 rectangle + 图例 text*N + 色块 rectangle*N + 坐标轴 text*N + 柱体 rectangle*N + 标签 text*N`
|
|
154
173
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
174
|
+
识别出图表后,**图例色块**应归入 ECharts `legend` 配置(不要用 div 硬编码),**柱体色**映射到 `series.itemStyle.color`。
|
|
175
|
+
|
|
176
|
+
**收获 4:矢量图形是工具链盲区(兜底方案)**
|
|
177
|
+
- `shapePath` / `shapeGroup` 在 sketch 节点中占比可能高达 46.8%(实战中 434/926),但 `renderNodeAsBase64` 不支持渲染
|
|
178
|
+
- 解压 `.sketch`(zip 格式)只能提取 `bitmap` 中内嵌的 PNG/PDF(实战中可能仅 2 张,常是侧边栏 Logo)
|
|
179
|
+
- **兜底方案**:① 用解压提取的 PNG/PDF 资源;② 无资源时用 antd `@ant-design/icons` 同语义图标替代;③ 在代码注释中标注"⚠️ 矢量图标用 antd 图标替代,原始 Sketch 为 shapePath"
|
|
180
|
+
|
|
181
|
+
**提示**:
|
|
182
|
+
- 大型 .sketch 文件先 `listNodesByPage(type="artboard")` 锁定目标画板,避免一次性加载整个文档
|
|
183
|
+
- `getNodesSummary` 是 token 节省关键:先按类型分组统计,再决定要查哪些节点 ID
|
|
184
|
+
- 批量 `getMultipleNodeInfo` 严格 ≤ 100 个/次,超过需分批
|
|
185
|
+
- 仅当结构化样式数据仍不足(如复杂渐变、阴影)时,才回退到 `renderNodeAsBase64` + `mcp__szcd-component-helper__analyze_design_image`
|
|
186
|
+
- 如果 sketch-mcp-server 工具不可用,提示用户安装:`npm install -g sketch-mcp-server`
|
|
162
187
|
|
|
163
188
|
**提示**:
|
|
164
189
|
- 大型 .sketch 文件用 `getPageStructure(maxDepth=1-2)` 即可获取布局概况,避免深层递归超时
|
|
@@ -174,65 +199,82 @@ Ant Design → ProComponents → Cover 层 → Wrapper 层 → ProPackages →
|
|
|
174
199
|
- 如果该工具不可用,告知用户需要提供设计稿的文字描述
|
|
175
200
|
|
|
176
201
|
|
|
177
|
-
|
|
202
|
+
**步骤 3 职责边界**(与步骤 2.5 对称):
|
|
203
|
+
- ✅ 产出图片描述(结构化文本)
|
|
204
|
+
- ❌ 不做组件候选列表推理(统一在步骤 3.5 进行)
|
|
205
|
+
- ❌ 不调用 `get_component_full_profile`(统一在步骤 4 进行)
|
|
206
|
+
|
|
207
|
+
**禁止在步骤 3 内部**:
|
|
208
|
+
- ❌ 推理组件候选列表(应进入步骤 3.5)
|
|
209
|
+
- ❌ 批量获取组件 API(应进入步骤 4)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
### 步骤3.5:组件候选列表推理(统一环节,必做)
|
|
213
|
+
|
|
214
|
+
**这是统一的组件候选列表推理环节**,无论设计稿来源是 .sketch 文件(步骤 2.5)还是图片(步骤 3),都需经过此环节:
|
|
215
|
+
|
|
216
|
+
```
|
|
217
|
+
步骤 1 templatePatterns + 步骤 2.5/3 设计稿数据 → 组件候选列表
|
|
218
|
+
(4 种模板模式 + llmMappingHints) (结构 + 样式 Token) (如 ["Query","TableOrList","LeftTree","TemplateMode"])
|
|
219
|
+
```
|
|
178
220
|
|
|
179
|
-
|
|
221
|
+
**输入**:
|
|
222
|
+
- 步骤 1 的 `mcp__szcd-component-helper__get_architecture_overview` 返回的 `templatePatterns`(TreeQueryTable / QueryTabsTables / LeftRight / UpDown)
|
|
223
|
+
- 步骤 1 的 `llmMappingHints.commonMistakes`(避免 LLM 常见映射错误)
|
|
224
|
+
- 步骤 2.5 的 Sketch 节点结构 + 样式 Token
|
|
225
|
+
- 或步骤 3 的图片分析描述
|
|
226
|
+
|
|
227
|
+
**输出**:
|
|
228
|
+
- **组件候选列表**(如 `["Query","TableOrList","LeftTree","TemplateMode"]`)
|
|
229
|
+
- 模板类型选择(如 `TemplateMode(templateType="LeftRight")`)
|
|
230
|
+
|
|
231
|
+
**禁止**:
|
|
232
|
+
- ❌ 在步骤 2.5 内部推理组件候选列表(应只产出 Sketch 数据 + 样式 Token)
|
|
233
|
+
- ❌ 在步骤 3 内部推理组件候选列表(应只产出图片描述)
|
|
234
|
+
- ❌ 跳过此环节直接调 `get_component_full_profile`(必须先有候选列表)
|
|
235
|
+
|
|
236
|
+
**推理时使用映射规则**(**此表为本步骤专用,仅含核心高频场景**):
|
|
180
237
|
|
|
181
238
|
*页面级布局*:
|
|
182
|
-
|
|
|
239
|
+
| Sketch 特征 | 推断结果 | 依据 |
|
|
183
240
|
|---|---|---|
|
|
241
|
+
| 画板名称(如 "4.1-编目审核-待办") | `pageName` | 直接使用 |
|
|
184
242
|
| 左右分区布局 | `TemplateMode(templateTpye="LeftRight")` | 区域分布 |
|
|
185
243
|
| 上下分区布局 | `TemplateMode(templateTpye="TopBottom")` | 区域分布 |
|
|
186
|
-
|
|
|
244
|
+
| 标签页(Tabs) + 每个 Tab 内有表格 | `QueryTabsTables` 或 `TemplateMode` + Tabs | templatePatterns.QueryTabsTables |
|
|
187
245
|
|
|
188
246
|
*区域级组件*:
|
|
189
|
-
|
|
|
247
|
+
| Sketch 特征 | 推断结果 | 依据 |
|
|
190
248
|
|---|---|---|
|
|
191
|
-
| 左侧窄区域 +
|
|
192
|
-
| 顶部输入框/下拉框/日期选择器 | `Query` | 搜索区域特征 |
|
|
193
|
-
| 中间表头 +
|
|
194
|
-
|
|
|
195
|
-
| 页面标题 + 返回箭头 | `TitleAndBack` | 标题栏特征 |
|
|
249
|
+
| 左侧窄区域 + 树形图层 | `LeftTree` 组件 | templatePatterns.TreeQueryTable |
|
|
250
|
+
| 顶部输入框/下拉框/日期选择器 | `Query` 组件 | 搜索区域特征 |
|
|
251
|
+
| 中间表头 + 数据行图层 | `TableOrList` 组件 | 表格区域特征 |
|
|
252
|
+
| 弹窗/抽屉图层 | `ModelOrDrawer` 组件 | 弹窗交互特征 |
|
|
253
|
+
| 页面标题 + 返回箭头 | `TitleAndBack` 组件 | 标题栏特征 |
|
|
196
254
|
| 详情展示区域(只读字段) | `FormItemOrDetailItem(type="detail")` | 详情区特征 |
|
|
197
255
|
|
|
198
|
-
|
|
199
|
-
|
|
|
200
|
-
|---|---|---|
|
|
201
|
-
| 折线趋势图/时间序列 | `Line` | ECharts 层,数据趋势展示 |
|
|
202
|
-
| 柱状对比图/条形图 | `Bar` | ECharts 层,数据对比 |
|
|
203
|
-
| 饼图/环形图/占比图 | `Pie` | ECharts 层,占比关系 |
|
|
204
|
-
| 雷达图/多维度对比 | `Radar` | ECharts 层,多维指标 |
|
|
205
|
-
| 仪表盘/进度指示 | `Gauge` | ECharts 层,单一指标 |
|
|
206
|
-
| 漏斗图/转化率 | `Funnel` | ECharts 层,转化流程 |
|
|
207
|
-
|
|
208
|
-
*表格子类型(根据 TableOrList 的 componentType 区分)*:
|
|
209
|
-
| 视觉特征 | 推断 componentType | 依据 |
|
|
256
|
+
*数据可视化(核心 3 类)*:
|
|
257
|
+
| Sketch 特征 | 推断结果 | 依据 |
|
|
210
258
|
|---|---|---|
|
|
211
|
-
|
|
|
212
|
-
|
|
|
213
|
-
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
*辅助/插槽组件*:
|
|
218
|
-
| 视觉特征 | 推断组件 | 依据 |
|
|
259
|
+
| 折线趋势图/时间序列图 | `Line` | ECharts 层图表组件 |
|
|
260
|
+
| 柱状对比图/条形图 | `Bar` | ECharts 层图表组件 |
|
|
261
|
+
| 饼图/环形图/占比图 | `Pie` | ECharts 层图表组件 |
|
|
262
|
+
|
|
263
|
+
*表格子类型(核心 2 类)*:
|
|
264
|
+
| Sketch 特征 | 推断结果 | 依据 |
|
|
219
265
|
|---|---|---|
|
|
220
|
-
|
|
|
221
|
-
|
|
|
222
|
-
| 圆形头像/头像编辑区 | `ModeAvatar` | 头像区域特征 |
|
|
223
|
-
| 文件上传区/拖拽上传框 | `Upload`(Cover 层) | 上传区域特征 |
|
|
266
|
+
| 可编辑表格(单元格直接输入) | `TableOrList(componentType="EditableProTable")` | 可编辑表格特征 |
|
|
267
|
+
| 卡片列表(非表格式数据卡片) | `TableOrList(componentType="ProList")` | 卡片布局特征 |
|
|
224
268
|
|
|
225
|
-
|
|
226
|
-
- 调用 `mcp__szcd-component-helper__get_component_full_profile`(name="Query,TableOrList,LeftTree,...", depth="deep")**一次性**获取所有候选组件 API
|
|
227
|
-
- 如需样式注入细节,追加 `mcp__szcd-component-helper__get_style_injection_guide`
|
|
269
|
+
**长尾场景走语义搜索**(不进文档,避免膨胀):
|
|
228
270
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
```
|
|
271
|
+
*数据可视化长尾*:`Radar`(雷达图)、`Gauge`(仪表盘)、`Funnel`(漏斗图)
|
|
272
|
+
|
|
273
|
+
*表格子类型长尾*:`DragSortTable`(拖拽排序表格)、`ModelOrDrawer(componentType="steps")`(步骤条表单)
|
|
274
|
+
|
|
275
|
+
*辅助/插槽组件*:`CustomOption`(LeftTree 添加按钮插槽)、`TreeNode`(树节点右键菜单插槽)、`ModeAvatar`(圆形头像)、`Upload`(文件上传)
|
|
235
276
|
|
|
277
|
+
**处理方式**:本表未覆盖的视觉特征 → 调用 `mcp__szcd-component-helper__search_components_semantic`(query="[场景描述,如'拖拽排序表格']")按需补全,再进入步骤 4。
|
|
236
278
|
|
|
237
279
|
### 步骤4:查询组件 + 依赖验证(必做)
|
|
238
280
|
|