mta-mcp 3.12.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/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",
@@ -6032,23 +6033,235 @@ function getSkillRegistry() {
6032
6033
 
6033
6034
  // src/tools/sketchMeasure.ts
6034
6035
  import * as fs19 from "fs";
6036
+ import * as os from "os";
6035
6037
  import * as path19 from "path";
6036
6038
  import { fileURLToPath as fileURLToPath8 } from "url";
6037
6039
  var __filename8 = fileURLToPath8(import.meta.url);
6038
6040
  var __dirname8 = path19.dirname(__filename8);
6039
- var SKETCH_TOOLS_PATHS = [
6040
- path19.resolve(__dirname8, "../ui/sketch/sketch-tools.js"),
6041
- path19.resolve(__dirname8, "../../ui/sketch/sketch-tools.js")
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")
6042
6044
  ];
6043
- var VALID_CMDS = ["measure", "layout", "style", "svg", "auto"];
6044
- function findSketchTools() {
6045
- for (const p of SKETCH_TOOLS_PATHS) {
6046
- if (fs19.existsSync(p)) {
6047
- return p;
6048
- }
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;
6049
6242
  }
6050
6243
  return null;
6051
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
+ }
6052
6265
  async function sketchMeasure(args) {
6053
6266
  const cmd = args.cmd || "measure";
6054
6267
  if (!VALID_CMDS.includes(cmd)) {
@@ -6063,53 +6276,57 @@ async function sketchMeasure(args) {
6063
6276
  }]
6064
6277
  };
6065
6278
  }
6066
- const toolPath = findSketchTools();
6067
- if (!toolPath) {
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)) {
6068
6285
  return {
6069
6286
  content: [{
6070
6287
  type: "text",
6071
6288
  text: JSON.stringify({
6072
- error: "sketch-tools.js \u6587\u4EF6\u672A\u627E\u5230",
6073
- searchedPaths: SKETCH_TOOLS_PATHS,
6074
- solution: "\u8BF7\u786E\u8BA4 mcp-server/ui/sketch/sketch-tools.js \u6587\u4EF6\u5B58\u5728"
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"
6075
6292
  }, null, 2)
6076
6293
  }]
6077
6294
  };
6078
6295
  }
6079
- const scriptContent = fs19.readFileSync(toolPath, "utf-8");
6080
- const versionMatch = scriptContent.match(/@version\s+([\d.]+)/);
6081
- const version = versionMatch ? versionMatch[1] : "unknown";
6082
- const cmdLine = `var _SKETCH_CMD = '${cmd}';`;
6083
- const fullScript = cmdLine + "\n" + scriptContent;
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");
6084
6315
  return {
6085
6316
  content: [{
6086
6317
  type: "text",
6087
6318
  text: JSON.stringify({
6088
6319
  status: "ready",
6089
- version,
6320
+ version: scriptVersion,
6090
6321
  cmd,
6322
+ source,
6323
+ scriptPath: tempScriptPath,
6091
6324
  scriptLength: fullScript.length,
6092
- instruction: "\u5C06 script \u5B57\u6BB5\u7684\u5185\u5BB9\u4F20\u5165 mcp_sketch_run_code({ code: script }) \u6267\u884C\u3002\u6267\u884C\u524D\u8BF7\u786E\u8BA4\u7528\u6237\u5DF2\u5728 Sketch \u4E2D\u9009\u4E2D\u4E86\u76EE\u6807\u753B\u677F/\u56FE\u5C42\u3002",
6093
- cmdDescription: {
6094
- measure: "\u5B8C\u6574\u753B\u677F\u6D4B\u91CF - \u83B7\u53D6\u6240\u6709\u56FE\u5C42\u6837\u5F0F\u3001\u5C3A\u5BF8\u3001\u95F4\u8DDD\u3001\u989C\u8272\uFF08\u9009\u4E2D\u753B\u677F/Frame\uFF09",
6095
- layout: "\u5E03\u5C40\u5206\u6790 - \u5206\u6790\u5BB9\u5668\u5B50\u5143\u7D20\u6392\u5217\uFF0C\u6216\u4E24\u4E2A\u56FE\u5C42\u7684\u76F8\u5BF9\u4F4D\u7F6E",
6096
- style: "\u6837\u5F0F\u5FEB\u68C0 - \u5FEB\u901F\u68C0\u67E5\u9009\u4E2D\u7EC4\u4EF6\u7684\u586B\u5145\u8272\u3001\u9634\u5F71\u3001\u6587\u5B57\u6837\u5F0F",
6097
- svg: "\u56FE\u6807\u5BFC\u51FA - \u5BFC\u51FA\u9009\u4E2D\u7684\u77E2\u91CF\u56FE\u4E3A SVG",
6098
- auto: "\u81EA\u52A8\u6A21\u5F0F - \u6839\u636E\u9009\u4E2D\u5185\u5BB9\u81EA\u52A8\u9009\u62E9\u6D4B\u91CF\u6216\u6837\u5F0F\u6A21\u5F0F"
6099
- }[cmd],
6100
- v460Features: [
6101
- "flutterColor - \u6240\u6709\u989C\u8272\u8F93\u51FA Flutter Color(0xAARRGGBB) \u683C\u5F0F\uFF0C\u53EF\u76F4\u63A5\u7C98\u8D34",
6102
- "flutterBoxShadow - \u9634\u5F71\u8F93\u51FA\u5B8C\u6574 BoxShadow(...) \u4EE3\u7801",
6103
- "flutterBorder - \u8FB9\u6846\u8F93\u51FA\u5B8C\u6574 Border.all(...) \u4EE3\u7801",
6104
- "flutterLinearGradient - \u6E10\u53D8\u8F93\u51FA\u5B8C\u6574 LinearGradient(...) \u4EE3\u7801",
6105
- "flutterHint - FILL/MATCH_PARENT \u5C3A\u5BF8\u8F93\u51FA double.infinity \u63D0\u793A",
6106
- "flutterSvgCode - \u56FE\u6807\u8F93\u51FA\u5B8C\u6574 SvgPicture.asset(...) \u4EE3\u7801\uFF0C\u542B\u7CBE\u786E\u7684\u989C\u8272\u548C\u5C3A\u5BF8",
6107
- "\u5168\u8986\u76D6\u5F62\u72B6\u6392\u9664 - \u80CC\u666F\u5706\u89D2\u77E9\u5F62\u4E0D\u518D\u88AB\u8BEF\u5224\u4E3A\u56FE\u6807"
6108
- ]
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
6109
6329
  }, null, 2)
6110
- }, {
6111
- type: "text",
6112
- text: fullScript
6113
6330
  }]
6114
6331
  };
6115
6332
  }
@@ -6449,7 +6666,7 @@ var skillDefinitions = [
6449
6666
  {
6450
6667
  name: "sketch_measure",
6451
6668
  category: "sketch",
6452
- description: "\u83B7\u53D6 Sketch \u6D4B\u91CF\u811A\u672C\uFF08sketch-tools.js v4.6.0\uFF09\u3002\u8FD4\u56DE\u5DF2\u6CE8\u5165 _SKETCH_CMD \u7684\u5B8C\u6574\u811A\u672C\uFF0C\u53EF\u76F4\u63A5\u4F20\u5165 mcp_sketch_run_code \u6267\u884C\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)",
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)",
6453
6670
  paramHints: [
6454
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)" },
6455
6672
  { name: "outputPath", type: "string", description: "SVG \u8F93\u51FA\u8DEF\u5F84\uFF08\u4EC5 cmd=svg \u65F6\u4F7F\u7528\uFF09" }