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 +259 -42
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/standards/mcp-tools/sketch-mcp.md +71 -21
- 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/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
|
|
6040
|
-
path19.resolve(__dirname8, "../ui/sketch/
|
|
6041
|
-
path19.resolve(__dirname8, "../../ui/sketch/
|
|
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
|
|
6044
|
-
|
|
6045
|
-
|
|
6046
|
-
|
|
6047
|
-
|
|
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
|
|
6067
|
-
|
|
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:
|
|
6073
|
-
|
|
6074
|
-
|
|
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(
|
|
6080
|
-
const
|
|
6081
|
-
const
|
|
6082
|
-
const
|
|
6083
|
-
|
|
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
|
-
|
|
6093
|
-
|
|
6094
|
-
|
|
6095
|
-
|
|
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: "\
|
|
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" }
|