mta-mcp 3.11.0 → 3.13.0
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/flutter.agent.md +36 -11
- package/dist/index.js +318 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
- package/standards/mcp-tools/sketch-mcp.md +71 -21
- package/standards/workflows/sketch-pitfalls.md +2 -1
- package/ui/sketch/README.md +121 -0
- package/ui/sketch/artboard-measure.js +2708 -0
- package/ui/sketch/component-manifest.js +148 -0
- package/ui/sketch/layout-inspector.js +589 -0
- package/ui/sketch/mta-measure.sketchplugin/Contents/Sketch/layout.js +545 -0
- package/ui/sketch/mta-measure.sketchplugin/Contents/Sketch/manifest.json +38 -0
- package/ui/sketch/mta-measure.sketchplugin/Contents/Sketch/measure.js +2881 -0
- package/ui/sketch/mta-measure.sketchplugin/Contents/Sketch/measure.js.bak +585 -0
- package/ui/sketch/mta-measure.sketchplugin/Contents/Sketch/style.js +270 -0
- package/ui/sketch/mta-measure.sketchplugin/Contents/Sketch/svg.js +149 -0
- package/ui/sketch/sketch-tools.js +3534 -0
package/agents/flutter.agent.md
CHANGED
|
@@ -24,16 +24,23 @@
|
|
|
24
24
|
|
|
25
25
|
触发词:"设计稿"、"Sketch"、"还原"、"测量"、"间距"、"UI还原"
|
|
26
26
|
|
|
27
|
-
###
|
|
27
|
+
### 自动流程(v4.6.0 统一入口)
|
|
28
28
|
|
|
29
29
|
```
|
|
30
30
|
1. 检测设计稿意图 → 提醒用户在 Sketch 选中图层
|
|
31
|
-
2. 调用
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
2. 调用 mcp_mta_mta({ skill: "sketch_measure", params: { cmd: "measure" } })
|
|
32
|
+
→ 获取已注入 _SKETCH_CMD 的完整脚本(sketch-tools.js v4.6.0)
|
|
33
|
+
3. 将返回的 script 传入 mcp_sketch_run_code({ code: script })
|
|
34
|
+
→ 执行测量,获取完整 Layout Intent JSON
|
|
35
|
+
4. 基于测量数据中的 flutter* 字段精准生成代码
|
|
34
36
|
```
|
|
35
37
|
|
|
36
|
-
|
|
38
|
+
**注意:**
|
|
39
|
+
- 不要手动读取 artboard-measure.js(已废弃,合并进 sketch-tools.js)
|
|
40
|
+
- 不要手动拼接 _SKETCH_CMD(由 sketch_measure skill 自动处理)
|
|
41
|
+
- 测量结果中所有颜色均包含 `flutterColor: "Color(0xAARRGGBB)"` 格式,可直接使用
|
|
42
|
+
|
|
43
|
+
### 测量数据关键字段(v4.6.0 新增带★标记)
|
|
37
44
|
|
|
38
45
|
| 字段 | 用途 | Flutter 应用 |
|
|
39
46
|
|------|------|-------------|
|
|
@@ -45,8 +52,15 @@
|
|
|
45
52
|
| `iconContentBounds` | Icon 实际路径尺寸 | 渲染用 contentSize,占位用 containerSize |
|
|
46
53
|
| `tagStyle` | Tag/标签容器样式 | background, padding, cornerRadius |
|
|
47
54
|
| `siblingIconAlignment` | 同行 Icon 对齐 | 统一 SizedBox 插槽尺寸 |
|
|
55
|
+
| ★`flutterColor` | Flutter 颜色格式 | 直接粘贴 `Color(0xAARRGGBB)` |
|
|
56
|
+
| ★`flutterBoxShadow` | 完整阴影代码 | 直接粘贴 `BoxShadow(...)` |
|
|
57
|
+
| ★`flutterBorder` | 完整边框代码 | 直接粘贴 `Border.all(...)` |
|
|
58
|
+
| ★`flutterLinearGradient` | 完整渐变代码 | 直接粘贴 `LinearGradient(...)` |
|
|
59
|
+
| ★`flutterHint` | FILL→double.infinity | 禁止硬编码宽度 |
|
|
60
|
+
| ★`flutterSvgCode` | 完整 SVG 加载代码 | 直接粘贴 `SvgPicture.asset(...)` |
|
|
61
|
+
| ★`iconFillColor` | 图标填充色 | 已含 Flutter Color 格式 |
|
|
48
62
|
|
|
49
|
-
**禁止**:未测量就凭感觉还原、硬编码尺寸、忽略 layoutIntent
|
|
63
|
+
**禁止**:未测量就凭感觉还原、硬编码尺寸、忽略 layoutIntent、手动拼接颜色十六进制
|
|
50
64
|
|
|
51
65
|
---
|
|
52
66
|
|
|
@@ -278,14 +292,14 @@ get_standard_by_id({ ids: ['flutter', 'flutter-ui-system'] })
|
|
|
278
292
|
|
|
279
293
|
### ⚠️ 强制流程(最高优先级)
|
|
280
294
|
|
|
281
|
-
**在还原任何 Sketch 设计稿前,必须先调用
|
|
295
|
+
**在还原任何 Sketch 设计稿前,必须先调用 MTA 测量技能获取数据:**
|
|
282
296
|
|
|
283
297
|
```
|
|
284
298
|
1. 用户提供 Sketch 文件 → 先提醒:"需要先在 Sketch 中选中目标图层"
|
|
285
|
-
2. 调用
|
|
286
|
-
3.
|
|
287
|
-
4.
|
|
288
|
-
5.
|
|
299
|
+
2. 调用 mcp_mta_mta({ skill: "sketch_measure", params: { cmd: "measure" } })
|
|
300
|
+
3. 将返回的 script 传入 mcp_sketch_run_code 执行
|
|
301
|
+
4. 基于测量数据中的 flutter* 字段精准还原(flutterColor、flutterBoxShadow、flutterSvgCode 等)
|
|
302
|
+
5. FILL 类型尺寸使用 flutterHint 的 double.infinity,禁止硬编码宽度
|
|
289
303
|
```
|
|
290
304
|
|
|
291
305
|
### 测量数据必备字段
|
|
@@ -303,6 +317,13 @@ get_standard_by_id({ ids: ['flutter', 'flutter-ui-system'] })
|
|
|
303
317
|
| `tagStyle` | Tag 容器完整样式 | bg/padding/cornerRadius 精确还原 |
|
|
304
318
|
| `siblingIconAlignment` | 同行 Icon 统一尺寸 | maxSlotSize→统一 SizedBox |
|
|
305
319
|
| `fontName` | PostScript 字体名 | 正确映射 FontWeight(防合成加粗) |
|
|
320
|
+
| `flutterColor` | Flutter 颜色格式 | 直接粘贴 Color(0xAARRGGBB) |
|
|
321
|
+
| `flutterBoxShadow` | 完整阴影代码 | 直接粘贴 BoxShadow(...) |
|
|
322
|
+
| `flutterBorder` | 完整边框代码 | 直接粘贴 Border.all(...) |
|
|
323
|
+
| `flutterLinearGradient` | 完整渐变代码 | 直接粘贴 LinearGradient(...) |
|
|
324
|
+
| `flutterHint` | 自适应宽度提示 | double.infinity + MediaQuery |
|
|
325
|
+
| `flutterSvgCode` | 完整 SVG 代码 | 直接粘贴 SvgPicture.asset(...) + ColorFilter |
|
|
326
|
+
| `iconFillColor` | 图标填充色 | 已含 flutterColor 格式 |
|
|
306
327
|
|
|
307
328
|
### 还原检查清单
|
|
308
329
|
|
|
@@ -319,6 +340,10 @@ get_standard_by_id({ ids: ['flutter', 'flutter-ui-system'] })
|
|
|
319
340
|
- [ ] **Tag 容器使用测量的 padding/bg/cornerRadius**(防样式猜测)
|
|
320
341
|
- [ ] **字体权重检查平台可用性**(PingFang≤w600, Helvetica≤w700)
|
|
321
342
|
- [ ] **只还原测量数据中存在的元素**(防添加幽灵元素)
|
|
343
|
+
- [ ] **优先使用 flutter* 字段**(flutterColor、flutterBoxShadow、flutterLinearGradient 等直接粘贴)
|
|
344
|
+
- [ ] **图标使用 flutterSvgCode**(含精确颜色和尺寸,禁止用 Icons.xxx 替代自定义 SVG)
|
|
345
|
+
- [ ] **FILL 类型尺寸使用 flutterHint**(double.infinity,禁止硬编码固定宽度)
|
|
346
|
+
- [ ] **边框使用 flutterBorder**(禁止忽略 borders 数据)
|
|
322
347
|
|
|
323
348
|
### ⚠️ 常见陷阱(必读)
|
|
324
349
|
|
package/dist/index.js
CHANGED
|
@@ -5950,7 +5950,8 @@ var SkillRegistry = class {
|
|
|
5950
5950
|
templates: "\u6A21\u677F\u7CFB\u7EDF",
|
|
5951
5951
|
clone: "\u9879\u76EE\u514B\u9686",
|
|
5952
5952
|
troubleshoot: "\u95EE\u9898\u8BCA\u65AD",
|
|
5953
|
-
agents: "Agent \u7BA1\u7406"
|
|
5953
|
+
agents: "Agent \u7BA1\u7406",
|
|
5954
|
+
sketch: "Sketch \u8BBE\u8BA1\u7A3F\u5DE5\u5177"
|
|
5954
5955
|
};
|
|
5955
5956
|
const lines = [
|
|
5956
5957
|
"MTA \u667A\u80FD\u7F16\u7801\u52A9\u624B - \u7EDF\u4E00\u6280\u80FD\u5165\u53E3\u3002",
|
|
@@ -6030,6 +6031,306 @@ function getSkillRegistry() {
|
|
|
6030
6031
|
return globalRegistry;
|
|
6031
6032
|
}
|
|
6032
6033
|
|
|
6034
|
+
// src/tools/sketchMeasure.ts
|
|
6035
|
+
import * as fs19 from "fs";
|
|
6036
|
+
import * as os from "os";
|
|
6037
|
+
import * as path19 from "path";
|
|
6038
|
+
import { fileURLToPath as fileURLToPath8 } from "url";
|
|
6039
|
+
var __filename8 = fileURLToPath8(import.meta.url);
|
|
6040
|
+
var __dirname8 = path19.dirname(__filename8);
|
|
6041
|
+
var PLUGIN_SCRIPT_BASE = [
|
|
6042
|
+
path19.resolve(__dirname8, "../ui/sketch/mta-measure.sketchplugin/Contents/Sketch"),
|
|
6043
|
+
path19.resolve(__dirname8, "../../ui/sketch/mta-measure.sketchplugin/Contents/Sketch")
|
|
6044
|
+
];
|
|
6045
|
+
var PLUGIN_BUNDLE_PATHS = [
|
|
6046
|
+
path19.resolve(__dirname8, "../ui/sketch/mta-measure.sketchplugin"),
|
|
6047
|
+
path19.resolve(__dirname8, "../../ui/sketch/mta-measure.sketchplugin")
|
|
6048
|
+
];
|
|
6049
|
+
var SKETCH_PLUGINS_DIR = path19.join(
|
|
6050
|
+
os.homedir(),
|
|
6051
|
+
"Library/Application Support/com.bohemiancoding.sketch3/Plugins"
|
|
6052
|
+
);
|
|
6053
|
+
var INSTALLED_PLUGIN_PATH = path19.join(SKETCH_PLUGINS_DIR, "mta-measure.sketchplugin");
|
|
6054
|
+
var VALID_CMDS = ["measure", "compact", "layout", "style", "svg", "auto"];
|
|
6055
|
+
var PLUGIN_SCRIPT_FILES = {
|
|
6056
|
+
measure: "measure.js",
|
|
6057
|
+
compact: "measure.js",
|
|
6058
|
+
// 与 measure 相同脚本,但注入 _FLUTTER_COMPACT=true
|
|
6059
|
+
auto: "measure.js",
|
|
6060
|
+
style: "style.js",
|
|
6061
|
+
layout: "layout.js",
|
|
6062
|
+
svg: "svg.js"
|
|
6063
|
+
};
|
|
6064
|
+
var OUTPUT_GUIDE = {
|
|
6065
|
+
measure: [
|
|
6066
|
+
"## \u63D2\u4EF6\u8F93\u51FA\u89E3\u8BFB\u6307\u5357 (measure.js v3.0.5)",
|
|
6067
|
+
"",
|
|
6068
|
+
"### \u8BBE\u8BA1\u539F\u5219",
|
|
6069
|
+
"- \u63D2\u4EF6 = \u6570\u636E\u63D0\u53D6\u5DE5\u5177\uFF0C\u4E0D\u662F\u4EE3\u7801\u751F\u6210\u5668",
|
|
6070
|
+
"- \u8F93\u51FA\u5B57\u6BB5\u5C3D\u53EF\u80FD\u5E26 Flutter \u4EE3\u7801\u63D0\u793A\uFF08flutterColor/flutterBorder/flutterHint \u7B49\uFF09\uFF0C\u53EF\u76F4\u63A5\u7C98\u8D34",
|
|
6071
|
+
"- \u539F\u59CB Sketch \u6570\u636E + \u5750\u6807\u7CFB\u8F6C\u6362\u53C2\u8003\uFF0C\u7531\u4F60\u6839\u636E\u9879\u76EE\u6846\u67B6\u51B3\u5B9A\u6700\u7EC8\u5B9E\u73B0",
|
|
6072
|
+
"",
|
|
6073
|
+
"### \u989C\u8272\u5B57\u6BB5\uFF08\u6700\u5E38\u51FA\u9519\uFF09",
|
|
6074
|
+
'- **colorSource**: "native" \u8868\u793A\u901A\u8FC7 Cocoa API \u83B7\u53D6\u7684\u7CBE\u786E\u989C\u8272\uFF08\u4F18\u5148\u4FE1\u4EFB\uFF09\uFF0C"jsApi" \u662F Sketch JS API \u9884\u5904\u7406\u503C\uFF08\u53EF\u80FD\u4E0D\u51C6\uFF09',
|
|
6075
|
+
"- **flutterColor**: Color(0xAARRGGBB) \u683C\u5F0F\uFF0C\u53EF\u76F4\u63A5\u7C98\u8D34\u5230 Flutter \u4EE3\u7801",
|
|
6076
|
+
"- **nativeColor/nativeTextColor**: \u539F\u751F API \u989C\u8272\uFF0C\u5F53 JS API \u7684 fill.color \u8FD4\u56DE #000000 \u6216 rgba(0,0,0,1) \u65F6\uFF0C\u4EE5\u539F\u751F\u503C\u4E3A\u51C6",
|
|
6077
|
+
"- Sketch \u989C\u8272\u683C\u5F0F #RRGGBBAA\uFF08\u672B\u4E24\u4F4Dalpha\uFF09\u2192 Flutter Color(0xAARRGGBB)\uFF08\u9996\u4E24\u4F4Dalpha\uFF09\uFF0C\u5DF2\u81EA\u52A8\u8F6C\u6362",
|
|
6078
|
+
"",
|
|
6079
|
+
"### \u6E10\u53D8\u9677\u9631",
|
|
6080
|
+
'- \u5FC5\u987B\u5148\u68C0\u67E5 fill.fillType === "Gradient" \u518D\u8BFB gradient.stops\uFF0C\u5426\u5219\u770B\u5230\u7684\u662F\u9ED8\u8BA4\u7EAF\u8272',
|
|
6081
|
+
"- \u6E10\u53D8\u5750\u6807\u7CFB: Sketch \u4F7F\u7528 0-1 \u5F52\u4E00\u5316\u5750\u6807\uFF0CFlutter \u4F7F\u7528 Alignment(-1 \u5230 1)\uFF0C\u8F6C\u6362\u516C\u5F0F: (sketch\u503C * 2) - 1",
|
|
6082
|
+
'- stops \u4E2D colorSource="native" \u7684\u989C\u8272\u624D\u662F\u771F\u5B9E\u6E10\u53D8\u8272\uFF0CjsApi \u8FD4\u56DE\u7684\u53EF\u80FD\u662F #000000ff',
|
|
6083
|
+
"",
|
|
6084
|
+
"### Group/Symbol \u6837\u5F0F\u83B7\u53D6",
|
|
6085
|
+
"- Group \u672C\u8EAB style \u901A\u5E38\u4E3A\u7A7A\uFF0C\u771F\u5B9E\u80CC\u666F\u5728 _background/_bg \u5B50\u5C42 \u2192 \u63D2\u4EF6\u5DF2\u63D0\u53D6\u5230 visualStyle \u5B57\u6BB5",
|
|
6086
|
+
"- **symbolBackgroundTrap=true**: #4a60b2ff \u662F Sketch Symbol \u8F6E\u5ED3\u5360\u4F4D\u8272\uFF0C\u7EDD\u975E\u771F\u5B9E\u80CC\u666F\uFF01\u6B64\u65F6\u80CC\u666F\u8272\u5E94\u7528 neumorphicBackground token",
|
|
6087
|
+
"- \u9634\u5F71\u4E5F\u5728 _background \u5B50\u5C42\u800C\u975E Group \u672C\u8EAB\uFF0C\u63D2\u4EF6\u5DF2\u5411\u4E0B\u63D0\u53D6",
|
|
6088
|
+
"",
|
|
6089
|
+
"### \u900F\u660E\u5BB9\u5668\uFF08v3.0.4 \u65B0\u589E\uFF09",
|
|
6090
|
+
"- **isTransparentWrapper=true**: \u6B64 Group \u65E0\u4EFB\u4F55\u586B\u5145\u548C\u9634\u5F71\uFF0C\u662F\u7EAF\u900F\u660E\u5305\u88F9\u5C42",
|
|
6091
|
+
" \u2192 Flutter \u5B9E\u73B0\u65F6**\u7981\u6B62**\u6DFB\u52A0 Container \u7684 color/boxShadow/borderRadius",
|
|
6092
|
+
" \u2192 \u76F4\u63A5\u7528 SizedBox \u6216 Padding \u5305\u88F9\u5B50\u5143\u7D20\uFF0C\u65E0\u9700\u4EFB\u4F55\u88C5\u9970",
|
|
6093
|
+
' \u2192 \u6839\u56E0: \u65E0 visualStyle \u8F93\u51FA \u2260 "\u672A\u63D0\u53D6\u5230\u88C5\u9970"\uFF0C\u800C\u662F"\u8BE5\u5BB9\u5668\u672C\u5C31\u65E0\u88C5\u9970"',
|
|
6094
|
+
"- **flutterWrapperHint**: \u900F\u660E\u5BB9\u5668\u7684\u5177\u4F53 Flutter \u5B9E\u73B0\u8BF4\u660E",
|
|
6095
|
+
"",
|
|
6096
|
+
"### \u5E03\u5C40\u610F\u56FE\u5B57\u6BB5",
|
|
6097
|
+
'- **layoutIntent.sizing.width.type="FILL"**: \u5BF9\u5E94 Flutter double.infinity\uFF0C\u7981\u6B62\u786C\u7F16\u7801\u56FA\u5B9A\u5BBD\u5EA6',
|
|
6098
|
+
"- **nonCenterWarning**: \u5B58\u5728\u6B64\u5B57\u6BB5\u65F6\uFF0C\u7981\u6B62\u7528 CrossAxisAlignment.center\uFF0C\u5FC5\u987B\u7528 Align(alignment: Alignment(x,y))",
|
|
6099
|
+
"- **flutterAlignY/flutterAlignX/flutterAlignment**: \u5DF2\u9884\u7B97\u7684 Flutter Alignment \u503C\uFF0C\u76F4\u63A5\u4F7F\u7528",
|
|
6100
|
+
"- **visualSpacing**: Text \u56FE\u5C42\u4FEE\u6B63\u4E86\u884C\u9AD8\u7A7A\u767D\u540E\u7684\u771F\u5B9E\u89C6\u89C9\u5185\u8FB9\u8DDD\uFF0C\u4F18\u5148\u4E8E spacing \u5B57\u6BB5",
|
|
6101
|
+
"",
|
|
6102
|
+
"### siblingSpacing \u51C6\u786E\u6027\uFF08v3.0.4 \u4FEE\u590D\uFF09",
|
|
6103
|
+
"- **siblingSpacing.left/right/above/below**: \u5F53\u524D\u56FE\u5C42\u4E0E\u6700\u8FD1\u5144\u5F1F\u5143\u7D20\u7684\u89C6\u89C9\u95F4\u8DDD",
|
|
6104
|
+
"- v3.0.4 \u4FEE\u590D: getVisualBounds \u73B0\u5728\u5BF9 Group \u904D\u5386\u6240\u6709\u5B50\u5C42\uFF0C\u5F53\u5B50\u5C42 frame \u8D85\u51FA Group frame \u65F6",
|
|
6105
|
+
' \u81EA\u52A8\u6269\u5C55\u5230\u5B50\u5C42 union \u8FB9\u754C\uFF0C\u89E3\u51B3"\u80CC\u666F Shape \u6EA2\u51FA Group"\u5BFC\u81F4\u95F4\u8DDD\u865A\u62A5\u7684\u95EE\u9898',
|
|
6106
|
+
"- \u4F8B: AUD \u9009\u62E9\u5668 Group.frame.width=121 \u4F46\u5185\u90E8\u80CC\u666F Shape.width=130\uFF08\u6EA2\u51FA9pt\uFF09\uFF0C",
|
|
6107
|
+
" v3.0.4 \u524D siblingSpacing \u62A5 41pt\uFF0C\u4FEE\u590D\u540E\u6B63\u786E\u62A5 32pt",
|
|
6108
|
+
"",
|
|
6109
|
+
"### \u6587\u672C\u5B57\u6BB5",
|
|
6110
|
+
"- **strutHeight**: = frameHeight / fontSize\uFF0C\u76F4\u63A5\u7528\u4F5C StrutStyle(height: N)\uFF0C\u6D88\u9664 CJK \u5B57\u4F53\u89C6\u89C9\u504F\u4E0B",
|
|
6111
|
+
"- **nativeRenderedWidth**: MSTextLayer \u6392\u7248\u5F15\u64CE\u5B9E\u9645\u6E32\u67D3\u5BBD\u5EA6\uFF08CJK \u5B57\u4F53\u5B9E\u9645\u6362\u884C\u6BD4 frame.width \u7A84\uFF09",
|
|
6112
|
+
"- **parseFontWeight**: PingFang SC \u5728 Flutter \u6E32\u67D3\u6BD4 iOS \u7C97\uFF0C\u63D2\u4EF6\u5DF2\u81EA\u52A8\u964D\u7EA7(600\u2192500)\uFF0C\u76F4\u63A5\u4F7F\u7528 flutterValue",
|
|
6113
|
+
"",
|
|
6114
|
+
"### \u7B26\u53F7\u5B57\u4F53\u56FE\u6807\uFF08v3.0.3 \u65B0\u589E\uFF09",
|
|
6115
|
+
"- **element.text.isSymbolFont=true**: \u6B64\u6587\u5B57\u56FE\u5C42\u4F7F\u7528 ZapfDingbats/Symbol/Webdings \u7B49\u7B26\u53F7\u5B57\u4F53",
|
|
6116
|
+
" \u2192 \u5B57\u7B26\u5728\u89C6\u89C9\u4E0A\u662F\u56FE\u6807\uFF0C**\u7981\u6B62\u7528 Flutter Text Widget \u6E32\u67D3**\uFF08\u8DE8\u5E73\u53F0\u5B57\u4F53\u4E0D\u4E00\u81F4\uFF09",
|
|
6117
|
+
" \u2192 **\u5FC5\u987B**\u5BFC\u51FA\u4E3A SVG \u540E\u7528 SvgPicture.asset() + colorFilter \u6E32\u67D3",
|
|
6118
|
+
" \u2192 \u989C\u8272\u4ECE element.text.nativeTextColor.flutterColor \u53D6\uFF08\u542B\u900F\u660E\u5EA6\uFF09",
|
|
6119
|
+
"- **element.symbolFontIconNote**: \u5DF2\u5F3A\u5236\u8BBE\u7F6E element.isIcon=true\uFF0C\u9644\u5E26\u5904\u7406\u8BF4\u660E",
|
|
6120
|
+
"- **element.text.iconReplacementHint**: SVG \u66FF\u4EE3\u65B9\u6848\u7684\u5177\u4F53\u64CD\u4F5C\u6B65\u9AA4",
|
|
6121
|
+
"- \u652F\u6301\u5B57\u4F53: ZapfDingbats/ZapfDingbatsITC\u3001Symbol\u3001Webdings\u3001Wingdings(1/2/3)\u3001FontAwesome\u3001Material Icons \u7B49",
|
|
6122
|
+
"",
|
|
6123
|
+
"### \u56FE\u6807\u5B57\u6BB5",
|
|
6124
|
+
"- **isIcon=true**: \u5DF2\u901A\u8FC7 5 \u7279\u5F81\u8BC4\u5206\u8BC6\u522B\u4E3A\u56FE\u6807\uFF0C\u5E94\u5BFC\u51FA SVG \u800C\u975E\u7528 Icons.xxx",
|
|
6125
|
+
"- **flutterSvgCode**: \u53EF\u76F4\u63A5\u7C98\u8D34\u7684 SvgPicture.asset() \u4EE3\u7801\u7247\u6BB5\uFF0C\u542B\u7CBE\u786E ColorFilter",
|
|
6126
|
+
"- **iconContentBounds**: \u56FE\u6807\u5185\u5BB9\u5B9E\u9645\u8FB9\u754C\uFF08vs \u5BB9\u5668\u5C3A\u5BF8\uFF09\uFF0C\u7528\u4E8E SizedBox \u7EA6\u675F",
|
|
6127
|
+
"- \u8986\u76D6\u4FEE\u6B63: \u56DB\u8FB9\u8DDD\u22642pt \u6216\u5BBD\u9AD8\u2265\u7236\u5BB9\u566888% \u7684 ShapePath \u662F\u80CC\u666F\u5C42\uFF0C\u5DF2\u81EA\u52A8\u6392\u9664",
|
|
6128
|
+
"",
|
|
6129
|
+
"### ShapePath \u8BED\u4E49\uFF08v3.0.4 \u589E\u5F3A\uFF09",
|
|
6130
|
+
'- **shapeSig.guessedRole**: "icon"(\u7528 SvgPicture) / "background"(\u7528 BoxDecoration) / "divider"(\u7528 Divider) / "icon-stroke"(\u63CF\u8FB9\u8DEF\u5F84)',
|
|
6131
|
+
"- **shapeSig.guessedFlutter**: \u63A8\u8350\u7684 Flutter \u5199\u6CD5\u63D0\u793A",
|
|
6132
|
+
"- **shapeSig.strokeInfo**: \u5F00\u653E\u8DEF\u5F84\u7684\u63CF\u8FB9\u4FE1\u606F\uFF08thickness\u3001color\u3001flutterColor\uFF09",
|
|
6133
|
+
"- **shapeSig.strokeSvgHint**: \u26A0\uFE0F \u5F00\u653E\u8DEF\u5F84\u4E13\u7528\u8B66\u544A + SVG polyline \u6A21\u677F\uFF0C\u660E\u786E\u7981\u6B62\u751F\u6210 fill \u5B9E\u5FC3\u5F62\u72B6",
|
|
6134
|
+
' \u2192 \u5B58\u5728\u6B64\u5B57\u6BB5\u65F6\uFF0CSVG \u5FC5\u987B\u4F7F\u7528 fill="none" + stroke \u800C\u975E fill \u5B9E\u5FC3',
|
|
6135
|
+
" \u2192 \u5178\u578B\u573A\u666F\uFF1A\u4E0B\u62C9\u7BAD\u5934 \u2228\u3001\u8FD4\u56DE\u7BAD\u5934 \u2039\u3001\u52FE\u9009 \u2713 \u7B49\u63CF\u8FB9\u56FE\u6807",
|
|
6136
|
+
"- **shapeSig.cornerRadius**: v3.0.5 \u65B0\u589E\uFF0C\u4ECE ShapePath.points[].cornerRadius \u63D0\u53D6\u7684\u7CBE\u786E\u5706\u89D2\u503C",
|
|
6137
|
+
" \u2192 \u5BF9\u6BD4 style.borderRadius (\u6765\u81EA layer.style.corners)\uFF0C\u6B64\u5B57\u6BB5\u4ECE\u8DEF\u5F84\u5B9A\u4E49\u70B9\u63D0\u53D6\uFF0C\u66F4\u53EF\u9760",
|
|
6138
|
+
" \u2192 compact \u6A21\u5F0F\u5DF2\u81EA\u52A8 fallback: \u4F18\u5148\u7528 visualStyle/style \u7684 borderRadius\uFF0C\u5982\u679C\u6CA1\u6709\u5219\u7528 shapeSig \u7684",
|
|
6139
|
+
"- **shapeSig.dashPattern**: v3.0.5 \u65B0\u589E\uFF0C\u865A\u7EBF\u53C2\u6570\u6570\u7EC4\uFF08\u5982 [2,3] = 2pt\u753B\u7EBF 3pt\u95F4\u9694\uFF09",
|
|
6140
|
+
" \u2192 compact \u6A21\u5F0F\u8F93\u51FA\u4E3A dash \u5B57\u6BB5",
|
|
6141
|
+
"",
|
|
6142
|
+
"### \u865A\u7EBF/\u5206\u5272\u7EBF\uFF08v3.0.5 \u65B0\u589E\uFF09",
|
|
6143
|
+
"- **dash=[n,m]**: \u865A\u7EBF\u53C2\u6570\uFF0Cn=\u753B\u7EBF\u957F\u5EA6 m=\u95F4\u9694\u957F\u5EA6\uFF0C\u76F4\u63A5\u7528\u4F5C CustomPaint \u7684 dashPattern",
|
|
6144
|
+
"- **style.borderOptions**: \u5B8C\u6574\u7684\u8FB9\u6846\u9009\u9879 { dashPattern, lineEnd, lineJoin }",
|
|
6145
|
+
' \u2192 lineEnd: "Butt"/"Round"/"Projecting" \u5BF9\u5E94 StrokeCap',
|
|
6146
|
+
' \u2192 lineJoin: "Miter"/"Round"/"Bevel" \u5BF9\u5E94 StrokeJoin',
|
|
6147
|
+
"- \u4F7F\u7528\u573A\u666F: coupon_card \u4E2D\u7684\u865A\u7EBF\u5206\u5272\u7EBF\uFF0C\u4EE5\u524D\u53EA\u63D0\u53D6 border.color+thickness \u5BFC\u81F4 AI \u731C\u6D4B dashWidth",
|
|
6148
|
+
"",
|
|
6149
|
+
"### \u8FB9\u6846\u989C\u8272\u7CBE\u5EA6\uFF08v3.0.5 \u4FEE\u590D\uFF09",
|
|
6150
|
+
"- border \u989C\u8272\u73B0\u5728\u4E0E fills/shadows \u4E00\u6837\u901A\u8FC7\u539F\u751F Cocoa API \u63D0\u53D6\uFF08\u4E4B\u524D\u53EA\u7528 JS API \u7B80\u5316\u503C\uFF09",
|
|
6151
|
+
"- **borderObj.nativeHex/nativeAlpha**: \u539F\u751F API \u63D0\u53D6\u7684\u7CBE\u786E\u8FB9\u6846\u989C\u8272",
|
|
6152
|
+
"- **borderObj.flutterBorder**: \u4F7F\u7528\u539F\u751F\u989C\u8272\u751F\u6210\u7684 Border.all(...)",
|
|
6153
|
+
"",
|
|
6154
|
+
"### \u80CC\u666F\u5C42 fallback\uFF08v3.0.5 \u4FEE\u590D\uFF09",
|
|
6155
|
+
"- resolveGroupVisualStyle \u4E0D\u518D\u5F3A\u5236\u8981\u6C42 _background \u547D\u540D",
|
|
6156
|
+
"- \u5982\u679C\u6CA1\u6709 _background \u547D\u540D\u7684\u5B50\u5C42\uFF0C\u81EA\u52A8\u67E5\u627E\u9762\u79EF >= \u7236\u5BB9\u5668 50% \u7684\u6700\u5927 Shape \u5B50\u5C42\u4F5C\u4E3A\u80CC\u666F",
|
|
6157
|
+
"- \u89E3\u51B3: \u8BBE\u8BA1\u7A3F\u4E2D\u80CC\u666F\u5C42\u547D\u540D\u4E3A Rectangle/bg/\u5BB9\u5668 \u7B49\u975E\u6807\u51C6\u540D\u79F0\u65F6\uFF0CcornerRadius/fills/shadows \u4E22\u5931\u7684\u95EE\u9898",
|
|
6158
|
+
"",
|
|
6159
|
+
"### \u5B50\u5143\u7D20\u5E03\u5C40",
|
|
6160
|
+
"- **containerIntent.flutterDirective**: Sketch\u2192Flutter \u5E03\u5C40\u8BED\u4E49\u7FFB\u8BD1\uFF0C\u5305\u542B:",
|
|
6161
|
+
" - mainAxisAlignment/crossAxisAlignment: \u7CBE\u786E\u51B3\u7B56\u503C",
|
|
6162
|
+
" - spacersBetween[]: \u54EA\u4E9B\u95F4\u9699\u5E94\u7528 Spacer() \u800C\u975E SizedBox",
|
|
6163
|
+
" - expandedChildren[]: \u54EA\u4E9B\u5B50\u5143\u7D20\u5E94\u7528 Expanded",
|
|
6164
|
+
" - containerPadding: \u63A8\u7B97\u7684 EdgeInsets",
|
|
6165
|
+
" - rules[]: \u6BCF\u6761\u51B3\u7B56\u7684\u89E3\u91CA\uFF08\u8C03\u8BD5\u7528\uFF09",
|
|
6166
|
+
"",
|
|
6167
|
+
"### \u9634\u5F71Token\u6620\u5C04",
|
|
6168
|
+
"- **shadowToken**: \u9634\u5F71\u6570\u503C\u5DF2\u81EA\u52A8\u5339\u914D\u7684 AppShadows token\uFF08\u5982 neumorphism/glassCard \u7B49\uFF09",
|
|
6169
|
+
"- \u5B58\u5728 token \u65F6\u4F18\u5148\u4F7F\u7528 AppShadows.xxx \u5E38\u91CF\uFF0C\u907F\u514D\u786C\u7F16\u7801 BoxShadow",
|
|
6170
|
+
"",
|
|
6171
|
+
"### Symbol \u8986\u76D6\u503C",
|
|
6172
|
+
"- **symbolInfo.currentValues[]**: Symbol Instance \u7684\u5B9E\u9645\u8FD0\u884C\u503C\uFF08\u6587\u5B57/\u56FE\u7247/\u5B50Symbol\uFF09",
|
|
6173
|
+
"- \u7981\u6B62\u4F7F\u7528 expandedLayers \u5C55\u5F00\u7684\u9ED8\u8BA4\u5185\u5BB9\uFF0C\u5B83\u4EEC\u662F Master \u503C\uFF0C\u4E0D\u662F\u5F53\u524D Instance \u7684\u503C"
|
|
6174
|
+
].join("\n"),
|
|
6175
|
+
style: [
|
|
6176
|
+
"## \u63D2\u4EF6\u8F93\u51FA\u89E3\u8BFB\u6307\u5357 (style.js v2.0.0)",
|
|
6177
|
+
"",
|
|
6178
|
+
"\u8F93\u51FA\u7ED3\u6784: { directStyle, allStyles }",
|
|
6179
|
+
"- directStyle: \u9009\u4E2D\u56FE\u5C42\u81EA\u8EAB\u6837\u5F0F\uFF08fills/borders/shadows/innerShadows/blurs/corners\uFF09",
|
|
6180
|
+
"- allStyles: \u9012\u5F52\u63D0\u53D6\u6240\u6709\u542B\u6837\u5F0F\u7684\u540E\u4EE3\u56FE\u5C42\uFF08\u542B\u8DEF\u5F84 path[]\uFF09",
|
|
6181
|
+
"",
|
|
6182
|
+
"### \u5173\u952E\u5B57\u6BB5",
|
|
6183
|
+
"- fills[].flutterColor: \u53EF\u76F4\u63A5\u7C98\u8D34\u7684 Color(0xAARRGGBB)",
|
|
6184
|
+
'- borders[].position: "Inside"/"Outside"/"Center"\uFF0C\u5F71\u54CD Flutter Border \u5B9E\u73B0\u65B9\u5F0F',
|
|
6185
|
+
"- blurs[].blurType + center: \u5305\u542B\u6A21\u7CCA\u7C7B\u578B\u548C\u4E2D\u5FC3\u70B9\uFF0C\u533A\u5206\u9AD8\u65AF\u6A21\u7CCA vs \u52A8\u6001\u6A21\u7CCA",
|
|
6186
|
+
"- corners: \u6765\u81EA borderOptions \u7684\u7CBE\u786E\u5706\u89D2\u503C",
|
|
6187
|
+
"",
|
|
6188
|
+
"### \u4F7F\u7528\u573A\u666F",
|
|
6189
|
+
"\u5F53\u5B8C\u6574 measure \u8F93\u51FA\u4E2D\u6837\u5F0F\u6570\u636E\u4E0D\u591F\u8BE6\u7EC6\u65F6\uFF0C\u7528 style \u547D\u4EE4\u5BF9\u5355\u4E2A\u56FE\u5C42\u505A\u6DF1\u5EA6\u68C0\u67E5"
|
|
6190
|
+
].join("\n"),
|
|
6191
|
+
layout: [
|
|
6192
|
+
"## \u63D2\u4EF6\u8F93\u51FA\u89E3\u8BFB\u6307\u5357 (layout.js v1.0.0)",
|
|
6193
|
+
"",
|
|
6194
|
+
"\u5206\u6790\u9009\u4E2D\u753B\u677F\u5185\u6240\u6709\u5B50\u5143\u7D20\u7684\u6392\u5217\u65B9\u5F0F\u548C\u95F4\u8DDD\u89C4\u5F8B\u3002",
|
|
6195
|
+
"\u8F93\u51FA direction(ROW/COLUMN)\u3001gaps[]\uFF08\u5143\u7D20\u95F4\u8DDD\u6570\u7EC4\uFF09\u3001alignment\uFF08\u5BF9\u9F50\u65B9\u5F0F\uFF09\u3002",
|
|
6196
|
+
"",
|
|
6197
|
+
"### \u5173\u952E\u5B57\u6BB5",
|
|
6198
|
+
"- direction: \u4E3B\u8F74\u65B9\u5411\uFF0CROW=\u6C34\u5E73\u6392\u5217\uFF0CCOLUMN=\u5782\u76F4\u6392\u5217",
|
|
6199
|
+
"- uniformGap: \u7B49\u95F4\u8DDD\u503C\uFF08\u5982\u679C\u6240\u6709\u95F4\u8DDD\u4E00\u81F4\uFF09",
|
|
6200
|
+
"- alignment: \u4EA4\u53C9\u8F74\u5BF9\u9F50\u65B9\u5F0F"
|
|
6201
|
+
].join("\n"),
|
|
6202
|
+
svg: [
|
|
6203
|
+
"## \u63D2\u4EF6\u8F93\u51FA\u89E3\u8BFB\u6307\u5357 (svg.js v1.0.0)",
|
|
6204
|
+
"",
|
|
6205
|
+
"\u5C06\u9009\u4E2D\u56FE\u5C42\u5BFC\u51FA\u4E3A SVG \u5B57\u7B26\u4E32\u3002",
|
|
6206
|
+
"",
|
|
6207
|
+
"### \u6CE8\u610F\u4E8B\u9879",
|
|
6208
|
+
"- \u56FE\u6807 = [\u5706\u5F62\u5BB9\u5668 + \u56FE\u6807\u56FE\u5F62] \u65F6\uFF0C\u9009\u5916\u5C42\u5BFC\u51FA\u4F1A\u542B\u80CC\u666F\u5706\u89D2\u77E9\u5F62\u8DEF\u5F84",
|
|
6209
|
+
"- \u5982\u679C\u8F93\u51FA\u542B backgroundLayerWarnings\uFF0C\u8BF4\u660E SVG \u4E2D\u5305\u542B\u80CC\u666F\u5C42\uFF0C\u9700\u8981\u5728 Sketch \u4E2D\u53EA\u9009\u4E2D\u56FE\u6807\u56FE\u5F62\u90E8\u5206\u91CD\u65B0\u5BFC\u51FA",
|
|
6210
|
+
"- SVG \u5BFC\u51FA\u540E\u7528 flutter_svg \u7684 SvgPicture.asset() \u52A0\u8F7D\uFF0C\u989C\u8272\u901A\u8FC7 ColorFilter.mode() \u63A7\u5236"
|
|
6211
|
+
].join("\n"),
|
|
6212
|
+
auto: "",
|
|
6213
|
+
// auto 等同 measure
|
|
6214
|
+
compact: [
|
|
6215
|
+
"## \u63D2\u4EF6\u8F93\u51FA\u89E3\u8BFB\u6307\u5357 (measure.js compact \u6A21\u5F0F)",
|
|
6216
|
+
"",
|
|
6217
|
+
"\u8F93\u51FA\u4F53\u79EF\u7EA6\u4E3A\u5B8C\u6574 measure \u7684 3-8%\uFF0C\u53EA\u4FDD\u7559 Flutter \u4EE3\u7801\u751F\u6210\u6240\u9700\u5B57\u6BB5\u3002",
|
|
6218
|
+
"",
|
|
6219
|
+
"### \u5B57\u6BB5\u7EA6\u5B9A\uFF08\u7F29\u77ED\u952E\u540D\uFF09",
|
|
6220
|
+
"- **n/t/f**: name / type / [x,y,w,h]",
|
|
6221
|
+
"- **bg**: Flutter \u80CC\u666F\u8272 Color(0xAARRGGBB)",
|
|
6222
|
+
"- **gd**: LinearGradient(...) \u5B8C\u6574\u4EE3\u7801",
|
|
6223
|
+
"- **sh**: BoxShadow \u5B57\u7B26\u4E32\u6570\u7EC4\uFF0C\u76F4\u63A5\u7C98\u8D34\u5230 boxShadow: []",
|
|
6224
|
+
"- **bd**: Border.all(...) \u5B8C\u6574\u4EE3\u7801",
|
|
6225
|
+
"- **token**: AppShadows.xxx token \u540D\uFF0C\u4F18\u5148\u4F7F\u7528\u4EE3\u66FF\u786C\u7F16\u7801 BoxShadow",
|
|
6226
|
+
"- **r**: borderRadius \u6570\u503C",
|
|
6227
|
+
"- **rp**: [left,top,right,bottom] \u76F8\u5BF9\u7236\u5BB9\u5668\u8FB9\u8DDD",
|
|
6228
|
+
"- **icon/svg/cs/xs**: \u56FE\u6807\u6807\u8BC6/SvgPicture\u4EE3\u7801/containerSize/contentSize",
|
|
6229
|
+
"- **text/style**: \u6587\u672C\u5185\u5BB9/TextStyle(...) \u4EE3\u7801",
|
|
6230
|
+
"- **lh**: strutHeight\uFF08\u4EC5\u975E\u6807\u51C6\u503C\uFF0C\u76F4\u63A5\u7528\u4E8E StrutStyle\uFF09",
|
|
6231
|
+
"- **tag**: {bg,ph,pv,r,text} Tag\u5BB9\u5668\u4FE1\u606F",
|
|
6232
|
+
"- **layout**: {dir,gap,main,cross,pad} \u5E03\u5C40\u610F\u56FE",
|
|
6233
|
+
"- **ch**: \u5B50\u5143\u7D20\u6570\u7EC4\uFF08\u9012\u5F52\uFF09",
|
|
6234
|
+
"",
|
|
6235
|
+
"### \u4F7F\u7528\u65B9\u5F0F",
|
|
6236
|
+
"\u76F4\u63A5\u8BFB\u53D6 flutter* \u5B57\u6BB5\u751F\u6210\u4EE3\u7801\uFF0C\u65E0\u9700\u89E3\u6790\u539F\u59CB Sketch \u6570\u636E\u3002"
|
|
6237
|
+
].join("\n")
|
|
6238
|
+
};
|
|
6239
|
+
function findFirst(paths) {
|
|
6240
|
+
for (const p of paths) {
|
|
6241
|
+
if (fs19.existsSync(p)) return p;
|
|
6242
|
+
}
|
|
6243
|
+
return null;
|
|
6244
|
+
}
|
|
6245
|
+
function findPluginScriptDir() {
|
|
6246
|
+
return findFirst(PLUGIN_SCRIPT_BASE);
|
|
6247
|
+
}
|
|
6248
|
+
function findPluginBundle() {
|
|
6249
|
+
return findFirst(PLUGIN_BUNDLE_PATHS);
|
|
6250
|
+
}
|
|
6251
|
+
function tryAutoInstall(bundlePath) {
|
|
6252
|
+
try {
|
|
6253
|
+
if (!fs19.existsSync(SKETCH_PLUGINS_DIR)) {
|
|
6254
|
+
return "Sketch \u63D2\u4EF6\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u53EF\u80FD\u672A\u5B89\u88C5 Sketch";
|
|
6255
|
+
}
|
|
6256
|
+
if (fs19.existsSync(INSTALLED_PLUGIN_PATH)) {
|
|
6257
|
+
return "already_installed";
|
|
6258
|
+
}
|
|
6259
|
+
fs19.symlinkSync(bundlePath, INSTALLED_PLUGIN_PATH);
|
|
6260
|
+
return "installed";
|
|
6261
|
+
} catch (e) {
|
|
6262
|
+
return `install_failed: ${e.message}`;
|
|
6263
|
+
}
|
|
6264
|
+
}
|
|
6265
|
+
async function sketchMeasure(args) {
|
|
6266
|
+
const cmd = args.cmd || "measure";
|
|
6267
|
+
if (!VALID_CMDS.includes(cmd)) {
|
|
6268
|
+
return {
|
|
6269
|
+
content: [{
|
|
6270
|
+
type: "text",
|
|
6271
|
+
text: JSON.stringify({
|
|
6272
|
+
error: `\u65E0\u6548\u7684 cmd \u53C2\u6570: "${cmd}"`,
|
|
6273
|
+
validValues: VALID_CMDS,
|
|
6274
|
+
usage: 'mcp_mta_mta({ skill: "sketch_measure", params: { cmd: "measure" } })'
|
|
6275
|
+
}, null, 2)
|
|
6276
|
+
}]
|
|
6277
|
+
};
|
|
6278
|
+
}
|
|
6279
|
+
const bundlePath = findPluginBundle();
|
|
6280
|
+
const installStatus = bundlePath ? tryAutoInstall(bundlePath) : "bundle_not_found";
|
|
6281
|
+
const scriptDir = findPluginScriptDir();
|
|
6282
|
+
const scriptFile = PLUGIN_SCRIPT_FILES[cmd];
|
|
6283
|
+
const scriptPath = scriptDir ? path19.join(scriptDir, scriptFile) : null;
|
|
6284
|
+
if (!scriptPath || !fs19.existsSync(scriptPath)) {
|
|
6285
|
+
return {
|
|
6286
|
+
content: [{
|
|
6287
|
+
type: "text",
|
|
6288
|
+
text: JSON.stringify({
|
|
6289
|
+
error: `\u63D2\u4EF6\u811A\u672C ${scriptFile} \u672A\u627E\u5230`,
|
|
6290
|
+
searchedDirs: PLUGIN_SCRIPT_BASE,
|
|
6291
|
+
fix: "\u8BF7\u786E\u8BA4 mta-measure.sketchplugin \u63D2\u4EF6\u5305\u5B8C\u6574"
|
|
6292
|
+
}, null, 2)
|
|
6293
|
+
}]
|
|
6294
|
+
};
|
|
6295
|
+
}
|
|
6296
|
+
const scriptContent = fs19.readFileSync(scriptPath, "utf-8");
|
|
6297
|
+
const vm = scriptContent.match(/@version\s+([\d.]+)/);
|
|
6298
|
+
const scriptVersion = vm ? vm[1] : "1.0.0";
|
|
6299
|
+
const source = `plugin:${scriptFile}`;
|
|
6300
|
+
let fullScript = scriptContent;
|
|
6301
|
+
if (cmd === "svg" && args.outputPath) {
|
|
6302
|
+
fullScript = `var _SVG_OUTPUT_PATH = '${args.outputPath.replace(/'/g, "\\'")}';\\n` + scriptContent;
|
|
6303
|
+
} else if (cmd === "compact") {
|
|
6304
|
+
fullScript = `var _FLUTTER_COMPACT = true;
|
|
6305
|
+
` + scriptContent;
|
|
6306
|
+
}
|
|
6307
|
+
const tempScriptPath = path19.join(os.tmpdir(), "mta_sketch_script.js");
|
|
6308
|
+
fs19.writeFileSync(tempScriptPath, fullScript, "utf-8");
|
|
6309
|
+
const loaderScript = [
|
|
6310
|
+
`var __p = '${tempScriptPath}';`,
|
|
6311
|
+
`var __c = NSString.stringWithContentsOfFile_encoding_error_(__p, 4, null);`,
|
|
6312
|
+
`if (__c) { eval(String(__c)); }`,
|
|
6313
|
+
`else { console.log(JSON.stringify({error: '\u811A\u672C\u6587\u4EF6\u4E0D\u5B58\u5728: ' + __p, fix: '\u8BF7\u91CD\u65B0\u8C03\u7528 mcp_mta_mta skill=sketch_measure'})); }`
|
|
6314
|
+
].join("\n");
|
|
6315
|
+
return {
|
|
6316
|
+
content: [{
|
|
6317
|
+
type: "text",
|
|
6318
|
+
text: JSON.stringify({
|
|
6319
|
+
status: "ready",
|
|
6320
|
+
version: scriptVersion,
|
|
6321
|
+
cmd,
|
|
6322
|
+
source,
|
|
6323
|
+
scriptPath: tempScriptPath,
|
|
6324
|
+
scriptLength: fullScript.length,
|
|
6325
|
+
pluginInstall: installStatus,
|
|
6326
|
+
instruction: "\u5C06 loaderScript \u4F20\u5165 mcp_sketch_run_code({ code: loaderScript }) \u6267\u884C\u3002\u811A\u672C\u5DF2\u5199\u5165\u4E34\u65F6\u6587\u4EF6\uFF0CSketch \u4F1A\u4ECE\u78C1\u76D8\u76F4\u63A5\u8BFB\u53D6\uFF0C\u65E0\u9700 AI \u4E2D\u8F6C\u811A\u672C\u5185\u5BB9\u3002\u8BF7\u5148\u5728 Sketch \u4E2D\u9009\u4E2D\u76EE\u6807\u753B\u677F/\u56FE\u5C42\u3002",
|
|
6327
|
+
outputGuide: OUTPUT_GUIDE[cmd] || OUTPUT_GUIDE["measure"],
|
|
6328
|
+
loaderScript
|
|
6329
|
+
}, null, 2)
|
|
6330
|
+
}]
|
|
6331
|
+
};
|
|
6332
|
+
}
|
|
6333
|
+
|
|
6033
6334
|
// src/tools/skillDefinitions.ts
|
|
6034
6335
|
function wrapAsContent(data) {
|
|
6035
6336
|
return {
|
|
@@ -6360,6 +6661,22 @@ var skillDefinitions = [
|
|
|
6360
6661
|
return wrapAsContent(await listTroubleshootingCases(params.framework));
|
|
6361
6662
|
}
|
|
6362
6663
|
}
|
|
6664
|
+
},
|
|
6665
|
+
// ==================== Sketch 设计稿工具类 ====================
|
|
6666
|
+
{
|
|
6667
|
+
name: "sketch_measure",
|
|
6668
|
+
category: "sketch",
|
|
6669
|
+
description: "\u51C6\u5907 Sketch \u6D4B\u91CF\u811A\u672C\u3002\u811A\u672C\u5199\u5165\u4E34\u65F6\u6587\u4EF6\uFF0C\u8FD4\u56DE\u8F7B\u91CF\u52A0\u8F7D\u5668\u4EE3\u7801\uFF08~300B\uFF09\uFF0C\u5C06 loaderScript \u4F20\u5165 mcp_sketch_run_code \u6267\u884C\u5373\u53EF\u3002Sketch \u901A\u8FC7 CocoaScript \u4ECE\u78C1\u76D8\u8BFB\u53D6\u5B8C\u6574\u811A\u672C\uFF0C\u4E0D\u7ECF\u8FC7 AI \u4E0A\u4E0B\u6587\u3002\u652F\u6301 measure(\u5B8C\u6574\u753B\u677F\u6D4B\u91CF)\u3001layout(\u5E03\u5C40\u5206\u6790)\u3001style(\u6837\u5F0F\u5FEB\u68C0)\u3001svg(\u56FE\u6807\u5BFC\u51FA)\u3001auto(\u81EA\u52A8\u6A21\u5F0F)",
|
|
6670
|
+
paramHints: [
|
|
6671
|
+
{ name: "cmd", type: "string", description: "\u6267\u884C\u6A21\u5F0F: measure(\u9ED8\u8BA4\uFF0C\u5B8C\u6574\u753B\u677F) / layout(\u5E03\u5C40\u5206\u6790) / style(\u6837\u5F0F\u68C0\u67E5) / svg(\u56FE\u6807\u5BFC\u51FA) / auto(\u81EA\u52A8\u5224\u65AD)" },
|
|
6672
|
+
{ name: "outputPath", type: "string", description: "SVG \u8F93\u51FA\u8DEF\u5F84\uFF08\u4EC5 cmd=svg \u65F6\u4F7F\u7528\uFF09" }
|
|
6673
|
+
],
|
|
6674
|
+
handler: async (params) => {
|
|
6675
|
+
return sketchMeasure({
|
|
6676
|
+
cmd: params.cmd,
|
|
6677
|
+
outputPath: params.outputPath
|
|
6678
|
+
});
|
|
6679
|
+
}
|
|
6363
6680
|
}
|
|
6364
6681
|
];
|
|
6365
6682
|
|