mta-mcp 2.7.1 → 2.8.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
@@ -1878,7 +1878,7 @@ async function generateConfig(args) {
1878
1878
  import * as fs6 from "fs";
1879
1879
  import * as path6 from "path";
1880
1880
  async function autoSetup(args) {
1881
- var _a, _b;
1881
+ var _a;
1882
1882
  const logger3 = new ConsoleLogger();
1883
1883
  try {
1884
1884
  const workspacePath = args.workspacePath || process.cwd();
@@ -1897,102 +1897,7 @@ async function autoSetup(args) {
1897
1897
  steps: [],
1898
1898
  warnings: []
1899
1899
  };
1900
- logger3.log("\u{1F680} \u5F00\u59CB\u81EA\u52A8\u914D\u7F6E MCP \u670D\u52A1\u5668...");
1901
- const vscodeDir = path6.join(workspacePath, ".vscode");
1902
- if (!fs6.existsSync(vscodeDir)) {
1903
- fs6.mkdirSync(vscodeDir, { recursive: true });
1904
- results.steps.push({ step: "\u521B\u5EFA .vscode \u76EE\u5F55", status: "success" });
1905
- } else {
1906
- results.steps.push({ step: "\u68C0\u6D4B\u5230\u5DF2\u6709 .vscode \u76EE\u5F55", status: "skip" });
1907
- }
1908
- results.steps.push({
1909
- step: "\u4F7F\u7528 npx mta-mcp \u914D\u7F6E",
1910
- status: "success",
1911
- detail: "\u901A\u8FC7 npm \u5305\u8FD0\u884C\uFF0C\u65E0\u9700\u672C\u5730\u5B89\u88C5"
1912
- });
1913
- const mcpJsonPath = path6.join(vscodeDir, "mcp.json");
1914
- const mcpConfig = {
1915
- servers: {
1916
- "mta": {
1917
- command: "npx",
1918
- args: ["-y", "mta-mcp"],
1919
- env: {}
1920
- }
1921
- }
1922
- };
1923
- if (fs6.existsSync(mcpJsonPath)) {
1924
- try {
1925
- const existingConfig = JSON.parse(fs6.readFileSync(mcpJsonPath, "utf-8"));
1926
- if (existingConfig.mcpServers && !existingConfig.servers) {
1927
- results.warnings.push("\u68C0\u6D4B\u5230\u65E7\u7248\u914D\u7F6E\u683C\u5F0F(mcpServers)\uFF0C\u5DF2\u81EA\u52A8\u5347\u7EA7\u4E3A\u65B0\u683C\u5F0F(servers)");
1928
- existingConfig.servers = existingConfig.mcpServers;
1929
- delete existingConfig.mcpServers;
1930
- }
1931
- if ((_a = existingConfig.servers) == null ? void 0 : _a.mta) {
1932
- results.steps.push({ step: "mcp.json \u5DF2\u5305\u542B mta \u914D\u7F6E", status: "skip" });
1933
- } else {
1934
- existingConfig.servers = {
1935
- ...existingConfig.servers,
1936
- ...mcpConfig.servers
1937
- };
1938
- fs6.writeFileSync(mcpJsonPath, JSON.stringify(existingConfig, null, 2));
1939
- results.steps.push({ step: "\u6DFB\u52A0 mta \u5230 mcp.json", status: "success" });
1940
- }
1941
- } catch (err) {
1942
- fs6.writeFileSync(mcpJsonPath, JSON.stringify(mcpConfig, null, 2));
1943
- results.steps.push({ step: "\u91CD\u65B0\u521B\u5EFA mcp.json", status: "success" });
1944
- results.warnings.push(`\u539F\u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${err}`);
1945
- }
1946
- } else {
1947
- fs6.writeFileSync(mcpJsonPath, JSON.stringify(mcpConfig, null, 2));
1948
- results.steps.push({ step: "\u521B\u5EFA mcp.json", status: "success" });
1949
- }
1950
- const settingsJsonPath = path6.join(vscodeDir, "settings.json");
1951
- const mcpSettings = {
1952
- "github.copilot.chat.mcp.enabled": true,
1953
- "github.copilot.chat.mcp.configFile": "${workspaceFolder}/.vscode/mcp.json",
1954
- "github.copilot.chat.mcp.autoStart": true
1955
- };
1956
- if (fs6.existsSync(settingsJsonPath)) {
1957
- try {
1958
- const existingSettings = JSON.parse(fs6.readFileSync(settingsJsonPath, "utf-8"));
1959
- const updated = { ...existingSettings, ...mcpSettings };
1960
- fs6.writeFileSync(settingsJsonPath, JSON.stringify(updated, null, 2) + "\n");
1961
- results.steps.push({ step: "\u66F4\u65B0 settings.json", status: "success" });
1962
- } catch {
1963
- fs6.writeFileSync(settingsJsonPath, JSON.stringify(mcpSettings, null, 2) + "\n");
1964
- results.steps.push({ step: "\u91CD\u65B0\u521B\u5EFA settings.json", status: "success" });
1965
- }
1966
- } else {
1967
- fs6.writeFileSync(settingsJsonPath, JSON.stringify(mcpSettings, null, 2) + "\n");
1968
- results.steps.push({ step: "\u521B\u5EFA settings.json", status: "success" });
1969
- }
1970
- const extensionsJsonPath = path6.join(vscodeDir, "extensions.json");
1971
- const recommendedExtensions = {
1972
- recommendations: [
1973
- "github.copilot",
1974
- "github.copilot-chat"
1975
- ]
1976
- };
1977
- if (!fs6.existsSync(extensionsJsonPath)) {
1978
- fs6.writeFileSync(extensionsJsonPath, JSON.stringify(recommendedExtensions, null, 2));
1979
- results.steps.push({ step: "\u521B\u5EFA extensions.json", status: "success" });
1980
- } else {
1981
- results.steps.push({ step: "extensions.json \u5DF2\u5B58\u5728", status: "skip" });
1982
- }
1983
- const gitignorePath = path6.join(workspacePath, ".gitignore");
1984
- if (fs6.existsSync(gitignorePath)) {
1985
- const gitignoreContent = fs6.readFileSync(gitignorePath, "utf-8");
1986
- if (!gitignoreContent.includes(".vscode/mcp.json")) {
1987
- const updatedContent = gitignoreContent + "\n# MCP \u914D\u7F6E\uFF08\u672C\u5730\uFF09\n.vscode/mcp.json\n";
1988
- fs6.writeFileSync(gitignorePath, updatedContent);
1989
- results.steps.push({ step: "\u6DFB\u52A0\u5230 .gitignore", status: "success" });
1990
- } else {
1991
- results.steps.push({ step: ".gitignore \u5DF2\u5305\u542B\u914D\u7F6E", status: "skip" });
1992
- }
1993
- } else {
1994
- results.warnings.push("\u672A\u68C0\u6D4B\u5230 .gitignore\uFF0C\u5EFA\u8BAE\u624B\u52A8\u6DFB\u52A0 .vscode/mcp.json");
1995
- }
1900
+ logger3.log("\u{1F680} \u5F00\u59CB\u4E3A\u9879\u76EE\u751F\u6210 copilot-instructions.md...");
1996
1901
  const generateInstructions = args.generateInstructions !== false;
1997
1902
  const instructionsPath = path6.join(workspacePath, ".github", "copilot-instructions.md");
1998
1903
  const hasExistingInstructions = fs6.existsSync(instructionsPath);
@@ -2015,7 +1920,7 @@ async function autoSetup(args) {
2015
1920
  if (configContent.type === "text") {
2016
1921
  const configData = JSON.parse(configContent.text);
2017
1922
  if (configData.success) {
2018
- const agentIds = ((_b = configData.agents) == null ? void 0 : _b.map((a) => a.id || a.title)) || [];
1923
+ const agentIds = ((_a = configData.agents) == null ? void 0 : _a.map((a) => a.id || a.title)) || [];
2019
1924
  results.steps.push({
2020
1925
  step: "\u2705 \u81EA\u52A8\u751F\u6210 copilot-instructions.md",
2021
1926
  status: "success",
@@ -2037,16 +1942,16 @@ async function autoSetup(args) {
2037
1942
  } else {
2038
1943
  results.steps.push({ step: "\u8DF3\u8FC7 copilot-instructions.md \u751F\u6210", status: "skip" });
2039
1944
  }
2040
- logger3.log("\u2705 \u81EA\u52A8\u914D\u7F6E\u5B8C\u6210\uFF01");
1945
+ logger3.log("\u2705 \u914D\u7F6E\u5B8C\u6210\uFF01");
2041
1946
  return {
2042
1947
  content: [{
2043
1948
  type: "text",
2044
1949
  text: JSON.stringify({
2045
1950
  success: true,
2046
- message: "\u{1F389} MCP \u670D\u52A1\u5668\u5DF2\u81EA\u52A8\u914D\u7F6E\u5230\u5DE5\u4F5C\u533A",
1951
+ message: "\u{1F389} \u5DF2\u4E3A\u9879\u76EE\u751F\u6210 copilot-instructions.md",
2047
1952
  ...results,
2048
1953
  nextSteps: [
2049
- "1. \u91CD\u65B0\u52A0\u8F7D VS Code \u7A97\u53E3 (Cmd+Shift+P \u2192 Reload Window)",
1954
+ "1. \u786E\u4FDD MCP \u670D\u52A1\u5668\u5DF2\u542F\u52A8\uFF08\u901A\u8FC7 VS Code \u63D2\u4EF6\u81EA\u52A8\u914D\u7F6E\uFF09",
2050
1955
  "2. \u6253\u5F00 GitHub Copilot Chat",
2051
1956
  "3. \u5F00\u59CB\u4F7F\u7528\uFF1ACopilot \u4F1A\u81EA\u52A8\u5E94\u7528\u9879\u76EE\u89C4\u8303",
2052
1957
  '4. \u9AD8\u7EA7\u7528\u6CD5\uFF1A\u5C1D\u8BD5\u8BF4"\u83B7\u53D6 Vue 3 \u76F8\u5173\u89C4\u8303"'
@@ -2055,7 +1960,7 @@ async function autoSetup(args) {
2055
1960
  }]
2056
1961
  };
2057
1962
  } catch (error) {
2058
- logger3.error(`\u81EA\u52A8\u914D\u7F6E\u5931\u8D25: ${error}`);
1963
+ logger3.error(`\u914D\u7F6E\u5931\u8D25: ${error}`);
2059
1964
  return {
2060
1965
  content: [{
2061
1966
  type: "text",
@@ -3029,6 +2934,7 @@ function buildKeyRulesResponse(uris, context, manager) {
3029
2934
  const keyRules = [];
3030
2935
  if (context.fileType === "vue") {
3031
2936
  keyRules.push(...getVueKeyRules(context.imports));
2937
+ keyRules.push(...getCssKeyRules());
3032
2938
  } else if (context.fileType === "dart") {
3033
2939
  keyRules.push(...getFlutterKeyRules());
3034
2940
  } else if (context.fileType === "ts" || context.fileType === "tsx") {
@@ -3043,6 +2949,11 @@ function buildKeyRulesResponse(uris, context, manager) {
3043
2949
  if (context.imports.includes("pinia")) {
3044
2950
  keyRules.push(...getPiniaKeyRules());
3045
2951
  }
2952
+ if (context.scenario.includes("\u6837\u5F0F") || context.scenario.includes("CSS")) {
2953
+ if (!keyRules.some((r) => r.includes("CSS \u6837\u5F0F\u89C4\u8303"))) {
2954
+ keyRules.push(...getCssKeyRules());
2955
+ }
2956
+ }
3046
2957
  return {
3047
2958
  success: true,
3048
2959
  mode: "key-rules",
@@ -3206,6 +3117,46 @@ async function fetchUser(id: number): Promise<User | null> {
3206
3117
  \`\`\``
3207
3118
  ];
3208
3119
  }
3120
+ function getCssKeyRules() {
3121
+ return [
3122
+ `## CSS \u6837\u5F0F\u89C4\u8303
3123
+
3124
+ ### \u57FA\u672C\u539F\u5219
3125
+ - **\u7981\u6B62\u5185\u8054\u6837\u5F0F** - \u4E0D\u4F7F\u7528 \`style="..."\`\uFF0C\u7528 CSS \u7C7B\u66FF\u4EE3
3126
+ - Vue \u7EC4\u4EF6\u4F7F\u7528 \`<style scoped>\` \u548C\u5D4C\u5957 CSS \u8BED\u6CD5
3127
+ - \u5168\u5C40\u6837\u5F0F\u4F7F\u7528\u6807\u51C6 CSS \u8BED\u6CD5\uFF08\u5E26 \`:\`\u3001\`;\`\u3001\`{}\`\uFF09
3128
+
3129
+ ### Element Plus \u7EC4\u4EF6\u6837\u5F0F
3130
+ - \u901A\u7528\u6837\u5F0F\u5FC5\u987B\u901A\u8FC7\u7236\u5BB9\u5668\u9650\u5B9A\u4F5C\u7528\u57DF\uFF08\u5982 \`.el-form-item\`\uFF09
3131
+ - **\u907F\u514D\u76F4\u63A5\u9009\u62E9\u57FA\u7840\u7EC4\u4EF6**\uFF1A\u4E0D\u76F4\u63A5\u9009\u62E9 \`.el-input\`\u3001\`.el-select\` \u7B49\uFF0C\u9632\u6B62\u5F71\u54CD\u590D\u5408\u7EC4\u4EF6\u5185\u90E8\u5E03\u5C40
3132
+ - **\u7981\u6B62\u8BBE\u7F6E __wrapper \u5BBD\u5EA6**\uFF1A\`.el-input__wrapper\`\u3001\`.el-select__wrapper\` \u7B49\u53EA\u80FD\u8BBE\u7F6E\u9AD8\u5EA6\u3001\u5185\u8FB9\u8DDD\u3001\u80CC\u666F\u8272\uFF0C\u4E0D\u80FD\u8BBE\u7F6E\u5BBD\u5EA6\uFF08\u4F1A\u5F71\u54CD\u5206\u9875\u5668\u3001\u65E5\u671F\u9009\u62E9\u5668\u7B49\uFF09
3133
+
3134
+ ### \u53EF\u4F7F\u7528\u7684\u5DE5\u5177\u7C7B
3135
+ \`\`\`css
3136
+ /* \u95F4\u8DDD */
3137
+ .ml_8, .mr_8, .mt_8, .mb_8 /* 8px margin */
3138
+ .ml_16, .mr_16, .mt_16, .mb_16 /* 16px margin */
3139
+
3140
+ /* \u5BBD\u5EA6 */
3141
+ .w_100, .w_120, .w_180, .w_200 /* \u56FA\u5B9A\u5BBD\u5EA6 */
3142
+ \`\`\`
3143
+
3144
+ ### \u793A\u4F8B
3145
+ \`\`\`vue
3146
+ <style scoped>
3147
+ /* \u2705 \u6B63\u786E\uFF1A\u901A\u8FC7\u7236\u5BB9\u5668\u9650\u5B9A */
3148
+ .my-form :deep(.el-form-item) {
3149
+ margin-bottom: 16px;
3150
+ }
3151
+
3152
+ /* \u274C \u9519\u8BEF\uFF1A\u76F4\u63A5\u8BBE\u7F6E\u5168\u5C40\u7EC4\u4EF6 */
3153
+ .el-input__wrapper {
3154
+ width: 200px; /* \u4F1A\u5F71\u54CD\u5206\u9875\u5668\u7B49\u5176\u4ED6\u7EC4\u4EF6 */
3155
+ }
3156
+ \`\`\`
3157
+ `
3158
+ ];
3159
+ }
3209
3160
  function getFlutterKeyRules() {
3210
3161
  return [
3211
3162
  `## Flutter UI \u7CFB\u7EDF\u5173\u952E\u89C4\u5219
@@ -4216,14 +4167,13 @@ var CopilotPromptsMCPServer = class {
4216
4167
  },
4217
4168
  {
4218
4169
  name: "auto_setup",
4219
- description: `\u3010\u914D\u7F6E MTA\u3011\u5F53\u7528\u6237\u8BF4"\u914D\u7F6E MTA"\u3001"\u8BBE\u7F6E MCP"\u3001"MTA \u4E0D\u5DE5\u4F5C"\u65F6\u8C03\u7528\u6B64\u5DE5\u5177\u3002
4170
+ description: `\u3010\u751F\u6210\u9879\u76EE\u914D\u7F6E\u3011\u4E3A\u9879\u76EE\u751F\u6210 copilot-instructions.md \u914D\u7F6E\u6587\u4EF6\u3002
4220
4171
  \u529F\u80FD\uFF1A
4221
- 1. \u81EA\u52A8\u521B\u5EFA .vscode/mcp.json \u548C settings.json
4222
- 2. \u68C0\u6D4B\u9879\u76EE\u4E2D\u662F\u5426\u5B58\u5728 .github/copilot-instructions.md
4223
- 3. \u5982\u679C\u4E0D\u5B58\u5728\uFF0C\u5219\u81EA\u52A8\u5206\u6790\u9879\u76EE\u6280\u672F\u6808\u5E76\u751F\u6210\u914D\u7F6E\u6587\u4EF6
4224
- 4. \u4F7F\u7528\u5B8C\u6574\u7684 SmartAgentMatcher \u5339\u914D\u6700\u5408\u9002\u7684 Agents
4172
+ 1. \u68C0\u6D4B\u9879\u76EE\u4E2D\u662F\u5426\u5B58\u5728 .github/copilot-instructions.md
4173
+ 2. \u5982\u679C\u4E0D\u5B58\u5728\uFF0C\u5219\u81EA\u52A8\u5206\u6790\u9879\u76EE\u6280\u672F\u6808\u5E76\u751F\u6210\u914D\u7F6E\u6587\u4EF6
4174
+ 3. \u4F7F\u7528 SmartAgentMatcher \u5339\u914D\u6700\u5408\u9002\u7684 Agents
4225
4175
 
4226
- \u914D\u7F6E\u5B8C\u6210\u540E\u9700\u63D0\u793A\u7528\u6237\u91CD\u65B0\u52A0\u8F7D\u7A97\u53E3\uFF08Cmd+Shift+P \u2192 Reload Window\uFF09`,
4176
+ \u6CE8\u610F\uFF1AMCP \u670D\u52A1\u5668\u7531 VS Code \u63D2\u4EF6\u901A\u8FC7 npm \u5305\u81EA\u52A8\u914D\u7F6E\uFF0C\u6B64\u5DE5\u5177\u53EA\u8D1F\u8D23\u751F\u6210 copilot-instructions.md`,
4227
4177
  inputSchema: {
4228
4178
  type: "object",
4229
4179
  properties: {
@@ -4621,7 +4571,7 @@ var CopilotPromptsMCPServer = class {
4621
4571
  ``,
4622
4572
  `\u{1F4CB} \u53EF\u7528\u5DE5\u5177:`,
4623
4573
  ` \u2022 analyze_project - \u5206\u6790\u9879\u76EE\u6280\u672F\u6808`,
4624
- ` \u2022 auto_setup - \u4E00\u952E\u914D\u7F6E MCP`,
4574
+ ` \u2022 auto_setup - \u751F\u6210\u9879\u76EE\u914D\u7F6E`,
4625
4575
  ` \u2022 health_check - \u5065\u5EB7\u68C0\u67E5\u8BCA\u65AD`,
4626
4576
  ` \u2022 get_compact_standards - \u83B7\u53D6\u7F16\u7801\u89C4\u8303`,
4627
4577
  ` \u2022 use_preset - \u4F7F\u7528\u9884\u8BBE\u573A\u666F`,