mta-mcp 1.9.1 → 2.2.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.
Files changed (121) hide show
  1. package/README.md +140 -2
  2. package/build/core/analyzers/eslint.d.ts +51 -0
  3. package/build/core/analyzers/eslint.d.ts.map +1 -0
  4. package/build/core/analyzers/eslint.js +259 -0
  5. package/build/core/analyzers/eslint.js.map +1 -0
  6. package/build/core/analyzers/index.d.ts +9 -0
  7. package/build/core/analyzers/index.d.ts.map +1 -0
  8. package/build/core/analyzers/index.js +9 -0
  9. package/build/core/analyzers/index.js.map +1 -0
  10. package/build/core/analyzers/registry.d.ts +59 -0
  11. package/build/core/analyzers/registry.d.ts.map +1 -0
  12. package/build/core/analyzers/registry.js +241 -0
  13. package/build/core/analyzers/registry.js.map +1 -0
  14. package/build/core/analyzers/tsconfig.d.ts +45 -0
  15. package/build/core/analyzers/tsconfig.d.ts.map +1 -0
  16. package/build/core/analyzers/tsconfig.js +197 -0
  17. package/build/core/analyzers/tsconfig.js.map +1 -0
  18. package/build/core/analyzers/types.d.ts +176 -0
  19. package/build/core/analyzers/types.d.ts.map +1 -0
  20. package/build/core/analyzers/types.js +39 -0
  21. package/build/core/analyzers/types.js.map +1 -0
  22. package/build/core/analyzers/vite.d.ts +46 -0
  23. package/build/core/analyzers/vite.d.ts.map +1 -0
  24. package/build/core/analyzers/vite.js +211 -0
  25. package/build/core/analyzers/vite.js.map +1 -0
  26. package/build/core/enhancedProjectAnalyzer.d.ts +102 -0
  27. package/build/core/enhancedProjectAnalyzer.d.ts.map +1 -0
  28. package/build/core/enhancedProjectAnalyzer.js +312 -0
  29. package/build/core/enhancedProjectAnalyzer.js.map +1 -0
  30. package/build/core/errors.d.ts +84 -0
  31. package/build/core/errors.d.ts.map +1 -0
  32. package/build/core/errors.js +151 -0
  33. package/build/core/errors.js.map +1 -0
  34. package/build/core/index.d.ts +11 -0
  35. package/build/core/index.d.ts.map +1 -0
  36. package/build/core/index.js +14 -0
  37. package/build/core/index.js.map +1 -0
  38. package/build/core/logger.d.ts +91 -0
  39. package/build/core/logger.d.ts.map +1 -0
  40. package/build/core/logger.js +164 -0
  41. package/build/core/logger.js.map +1 -0
  42. package/build/core/mappings/index.d.ts +5 -0
  43. package/build/core/mappings/index.d.ts.map +1 -0
  44. package/build/core/mappings/index.js +5 -0
  45. package/build/core/mappings/index.js.map +1 -0
  46. package/build/core/mappings/scenarioMappings.d.ts +51 -0
  47. package/build/core/mappings/scenarioMappings.d.ts.map +1 -0
  48. package/build/core/mappings/scenarioMappings.js +105 -0
  49. package/build/core/mappings/scenarioMappings.js.map +1 -0
  50. package/build/core/matching/index.d.ts +8 -0
  51. package/build/core/matching/index.d.ts.map +1 -0
  52. package/build/core/matching/index.js +8 -0
  53. package/build/core/matching/index.js.map +1 -0
  54. package/build/core/matching/intentAnalyzer.d.ts +78 -0
  55. package/build/core/matching/intentAnalyzer.d.ts.map +1 -0
  56. package/build/core/matching/intentAnalyzer.js +255 -0
  57. package/build/core/matching/intentAnalyzer.js.map +1 -0
  58. package/build/core/matching/standardMatcher.d.ts +101 -0
  59. package/build/core/matching/standardMatcher.d.ts.map +1 -0
  60. package/build/core/matching/standardMatcher.js +299 -0
  61. package/build/core/matching/standardMatcher.js.map +1 -0
  62. package/build/core/matching/weights.d.ts +64 -0
  63. package/build/core/matching/weights.d.ts.map +1 -0
  64. package/build/core/matching/weights.js +334 -0
  65. package/build/core/matching/weights.js.map +1 -0
  66. package/build/core/scenarioDetector.d.ts +2 -0
  67. package/build/core/scenarioDetector.d.ts.map +1 -0
  68. package/build/core/scenarioDetector.js +2 -0
  69. package/build/core/scenarioDetector.js.map +1 -0
  70. package/build/core/templates/discovery.d.ts +41 -0
  71. package/build/core/templates/discovery.d.ts.map +1 -0
  72. package/build/core/templates/discovery.js +262 -0
  73. package/build/core/templates/discovery.js.map +1 -0
  74. package/build/core/templates/types.d.ts +80 -0
  75. package/build/core/templates/types.d.ts.map +1 -0
  76. package/build/core/templates/types.js +10 -0
  77. package/build/core/templates/types.js.map +1 -0
  78. package/build/core/types.d.ts +2 -0
  79. package/build/core/types.d.ts.map +1 -1
  80. package/build/core/types.js +4 -3
  81. package/build/core/types.js.map +1 -1
  82. package/build/index.js +136 -23
  83. package/build/index.js.map +1 -1
  84. package/build/tools/getSmartStandards.d.ts +0 -2
  85. package/build/tools/getSmartStandards.d.ts.map +1 -1
  86. package/build/tools/getSmartStandards.js +39 -28
  87. package/build/tools/getSmartStandards.js.map +1 -1
  88. package/build/tools/getStandardById.d.ts +42 -0
  89. package/build/tools/getStandardById.d.ts.map +1 -0
  90. package/build/tools/getStandardById.js +289 -0
  91. package/build/tools/getStandardById.js.map +1 -0
  92. package/build/tools/getTemplate.d.ts +37 -0
  93. package/build/tools/getTemplate.d.ts.map +1 -0
  94. package/build/tools/getTemplate.js +78 -0
  95. package/build/tools/getTemplate.js.map +1 -0
  96. package/build/tools/listTemplates.d.ts +41 -0
  97. package/build/tools/listTemplates.d.ts.map +1 -0
  98. package/build/tools/listTemplates.js +81 -0
  99. package/build/tools/listTemplates.js.map +1 -0
  100. package/build/tools/queryMappings.d.ts +55 -0
  101. package/build/tools/queryMappings.d.ts.map +1 -0
  102. package/build/tools/queryMappings.js +119 -0
  103. package/build/tools/queryMappings.js.map +1 -0
  104. package/package.json +25 -8
  105. package/src/core/autoInitializer.ts +0 -170
  106. package/src/core/codeValidator.ts +0 -357
  107. package/src/core/githubClient.ts +0 -64
  108. package/src/core/i18nDetector.ts +0 -357
  109. package/src/core/smartAgentMatcher.ts +0 -490
  110. package/src/core/standardsManager.ts +0 -769
  111. package/src/core/types.ts +0 -72
  112. package/src/index.ts +0 -519
  113. package/src/tools/analyzeProject.ts +0 -94
  114. package/src/tools/autoSetup.ts +0 -312
  115. package/src/tools/generateConfig.ts +0 -429
  116. package/src/tools/getCompactStandards.ts +0 -413
  117. package/src/tools/getSmartStandards.ts +0 -214
  118. package/src/tools/healthCheck.ts +0 -261
  119. package/src/tools/listAgents.ts +0 -91
  120. package/src/tools/matchAgents.ts +0 -80
  121. package/src/tools/usePreset.ts +0 -180
@@ -0,0 +1,78 @@
1
+ /**
2
+ * 获取模板工具
3
+ *
4
+ * 设计理念:提供模板内容给 AI,AI 自己决定如何使用和修改
5
+ * 不做复杂的渲染逻辑,让 AI 发挥其强大的代码理解和修改能力
6
+ *
7
+ * @module tools/getTemplate
8
+ */
9
+ import { getTemplateById, getTemplateDir } from '../core/templates/discovery.js';
10
+ import { ConsoleLogger } from '../core/types.js';
11
+ /**
12
+ * 获取模板
13
+ *
14
+ * @example
15
+ * // 获取模板配置说明(不含文件内容,节省 token)
16
+ * get_template({ id: 'vue/api-layer' })
17
+ *
18
+ * @example
19
+ * // 获取完整模板(含所有文件内容)
20
+ * get_template({ id: 'vue/api-layer', includeFiles: true })
21
+ *
22
+ * @example
23
+ * // 获取特定文件
24
+ * get_template({ id: 'vue/api-layer', files: ['request.ts', 'types.ts'] })
25
+ */
26
+ export async function getTemplate(args) {
27
+ const logger = new ConsoleLogger();
28
+ try {
29
+ const result = getTemplateById(args.id, args.includeFiles ?? false);
30
+ if (!result) {
31
+ return {
32
+ content: [{
33
+ type: 'text',
34
+ text: JSON.stringify({
35
+ error: `模板 "${args.id}" 不存在`,
36
+ hint: '使用 list_templates 查看可用模板'
37
+ }, null, 2)
38
+ }]
39
+ };
40
+ }
41
+ // 如果指定了特定文件,过滤文件列表
42
+ if (args.files && result.files) {
43
+ result.files = result.files.filter(f => args.files.some(requested => f.path === requested || f.path.endsWith(requested)));
44
+ }
45
+ // 获取模板目录路径(方便 AI 直接操作)
46
+ const templateDir = getTemplateDir(args.id);
47
+ return {
48
+ content: [{
49
+ type: 'text',
50
+ text: JSON.stringify({
51
+ success: true,
52
+ template: {
53
+ ...result,
54
+ absolutePath: templateDir
55
+ },
56
+ aiGuidance: {
57
+ step1: '阅读 configGuide 了解配置要求',
58
+ step2: '根据目标项目情况决定如何修改模板',
59
+ step3: '将文件复制到目标项目并适配',
60
+ note: '模板文件可能需要根据项目实际情况调整(如 UI 框架、后端响应格式等)'
61
+ }
62
+ }, null, 2)
63
+ }]
64
+ };
65
+ }
66
+ catch (error) {
67
+ logger.error(`获取模板失败: ${error}`);
68
+ return {
69
+ content: [{
70
+ type: 'text',
71
+ text: JSON.stringify({
72
+ error: error instanceof Error ? error.message : String(error)
73
+ }, null, 2)
74
+ }]
75
+ };
76
+ }
77
+ }
78
+ //# sourceMappingURL=getTemplate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTemplate.js","sourceRoot":"","sources":["../../src/tools/getTemplate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACH,eAAe,EACf,cAAc,EACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAOjC;IAGG,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC;QAEpE,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;gBACH,OAAO,EAAE,CAAC;wBACN,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACjB,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO;4BAC5B,IAAI,EAAE,0BAA0B;yBACnC,EAAE,IAAI,EAAE,CAAC,CAAC;qBACd,CAAC;aACL,CAAC;QACN,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACnC,IAAI,CAAC,KAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CACzB,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CACrD,CACJ,CAAC;QACN,CAAC;QAED,uBAAuB;QACvB,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE5C,OAAO;YACH,OAAO,EAAE,CAAC;oBACN,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACjB,OAAO,EAAE,IAAI;wBACb,QAAQ,EAAE;4BACN,GAAG,MAAM;4BACT,YAAY,EAAE,WAAW;yBAC5B;wBACD,UAAU,EAAE;4BACR,KAAK,EAAE,uBAAuB;4BAC9B,KAAK,EAAE,kBAAkB;4BACzB,KAAK,EAAE,eAAe;4BACtB,IAAI,EAAE,qCAAqC;yBAC9C;qBACJ,EAAE,IAAI,EAAE,CAAC,CAAC;iBACd,CAAC;SACL,CAAC;IACN,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;QACjC,OAAO;YACH,OAAO,EAAE,CAAC;oBACN,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACjB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAChE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACd,CAAC;SACL,CAAC;IACN,CAAC;AACL,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 列出可用模板工具
3
+ *
4
+ * 设计理念:提供模板列表信息给 AI,AI 自己决定使用哪个
5
+ *
6
+ * @module tools/listTemplates
7
+ */
8
+ import { TemplateType } from '../core/templates/types.js';
9
+ /**
10
+ * 列出可用模板
11
+ *
12
+ * @example
13
+ * // 列出所有模板
14
+ * list_templates({})
15
+ *
16
+ * @example
17
+ * // 按类型筛选
18
+ * list_templates({ type: 'api-layer' })
19
+ *
20
+ * @example
21
+ * // 按框架筛选
22
+ * list_templates({ framework: 'vue' })
23
+ *
24
+ * @example
25
+ * // 搜索模板
26
+ * list_templates({ search: 'axios' })
27
+ */
28
+ export declare function listTemplates(args: {
29
+ /** 按类型筛选 */
30
+ type?: TemplateType;
31
+ /** 按框架筛选 */
32
+ framework?: string;
33
+ /** 搜索关键词 */
34
+ search?: string;
35
+ }): Promise<{
36
+ content: Array<{
37
+ type: string;
38
+ text: string;
39
+ }>;
40
+ }>;
41
+ //# sourceMappingURL=listTemplates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listTemplates.d.ts","sourceRoot":"","sources":["../../src/tools/listTemplates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACtC,YAAY;IACZ,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,YAAY;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC;IACR,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD,CAAC,CAkDD"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * 列出可用模板工具
3
+ *
4
+ * 设计理念:提供模板列表信息给 AI,AI 自己决定使用哪个
5
+ *
6
+ * @module tools/listTemplates
7
+ */
8
+ import { listAllTemplates, listTemplatesByType, listTemplatesByFramework, searchTemplates } from '../core/templates/discovery.js';
9
+ import { ConsoleLogger } from '../core/types.js';
10
+ /**
11
+ * 列出可用模板
12
+ *
13
+ * @example
14
+ * // 列出所有模板
15
+ * list_templates({})
16
+ *
17
+ * @example
18
+ * // 按类型筛选
19
+ * list_templates({ type: 'api-layer' })
20
+ *
21
+ * @example
22
+ * // 按框架筛选
23
+ * list_templates({ framework: 'vue' })
24
+ *
25
+ * @example
26
+ * // 搜索模板
27
+ * list_templates({ search: 'axios' })
28
+ */
29
+ export async function listTemplates(args) {
30
+ const logger = new ConsoleLogger();
31
+ try {
32
+ let templates;
33
+ if (args.search) {
34
+ templates = searchTemplates(args.search);
35
+ }
36
+ else if (args.type) {
37
+ templates = listTemplatesByType(args.type);
38
+ }
39
+ else if (args.framework) {
40
+ templates = listTemplatesByFramework(args.framework);
41
+ }
42
+ else {
43
+ templates = listAllTemplates();
44
+ }
45
+ // 按类型分组展示
46
+ const grouped = {};
47
+ for (const t of templates) {
48
+ if (!grouped[t.type])
49
+ grouped[t.type] = [];
50
+ grouped[t.type].push(t);
51
+ }
52
+ return {
53
+ content: [{
54
+ type: 'text',
55
+ text: JSON.stringify({
56
+ success: true,
57
+ total: templates.length,
58
+ templates,
59
+ byType: grouped,
60
+ usage: {
61
+ getDetails: 'get_template({ id: "模板ID" })',
62
+ getWithFiles: 'get_template({ id: "模板ID", includeFiles: true })',
63
+ note: 'AI 可直接读取模板文件并复制到目标项目'
64
+ }
65
+ }, null, 2)
66
+ }]
67
+ };
68
+ }
69
+ catch (error) {
70
+ logger.error(`列出模板失败: ${error}`);
71
+ return {
72
+ content: [{
73
+ type: 'text',
74
+ text: JSON.stringify({
75
+ error: error instanceof Error ? error.message : String(error)
76
+ }, null, 2)
77
+ }]
78
+ };
79
+ }
80
+ }
81
+ //# sourceMappingURL=listTemplates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listTemplates.js","sourceRoot":"","sources":["../../src/tools/listTemplates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACH,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,eAAe,EAClB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAOnC;IAGG,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC;QACD,IAAI,SAAS,CAAC;QAEd,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACnB,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACxB,SAAS,GAAG,wBAAwB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACJ,SAAS,GAAG,gBAAgB,EAAE,CAAC;QACnC,CAAC;QAED,UAAU;QACV,MAAM,OAAO,GAAqC,EAAE,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3C,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO;YACH,OAAO,EAAE,CAAC;oBACN,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACjB,OAAO,EAAE,IAAI;wBACb,KAAK,EAAE,SAAS,CAAC,MAAM;wBACvB,SAAS;wBACT,MAAM,EAAE,OAAO;wBACf,KAAK,EAAE;4BACH,UAAU,EAAE,8BAA8B;4BAC1C,YAAY,EAAE,kDAAkD;4BAChE,IAAI,EAAE,sBAAsB;yBAC/B;qBACJ,EAAE,IAAI,EAAE,CAAC,CAAC;iBACd,CAAC;SACL,CAAC;IACN,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;QACjC,OAAO;YACH,OAAO,EAAE,CAAC;oBACN,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACjB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAChE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACd,CAAC;SACL,CAAC;IACN,CAAC;AACL,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * 查询场景-规范映射工具
3
+ *
4
+ * 设计理念:提供映射信息给 AI,让 AI 自己决定使用哪些规范
5
+ * 不做"智能推荐",只提供数据查询
6
+ *
7
+ * @module tools/queryMappings
8
+ */
9
+ /**
10
+ * 查询场景-规范映射
11
+ *
12
+ * 这个工具只返回映射关系,不做任何"智能"处理
13
+ * AI 可以参考这些映射自己做决策
14
+ *
15
+ * @example
16
+ * // 查询特定场景的规范
17
+ * query_mappings({ scenario: 'vue3-form' })
18
+ *
19
+ * @example
20
+ * // 查询文件类型对应的规范
21
+ * query_mappings({ fileType: 'vue' })
22
+ *
23
+ * @example
24
+ * // 查询导入包对应的规范
25
+ * query_mappings({ imports: ['element-plus', 'pinia'] })
26
+ *
27
+ * @example
28
+ * // 获取所有映射关系
29
+ * query_mappings({ listAll: true })
30
+ */
31
+ export declare function queryMappings(args: {
32
+ /** 场景名称 */
33
+ scenario?: string;
34
+ /** 文件类型 */
35
+ fileType?: string;
36
+ /** 导入的包 */
37
+ imports?: string[];
38
+ /** 列出所有映射 */
39
+ listAll?: boolean;
40
+ }): Promise<{
41
+ content: Array<{
42
+ type: string;
43
+ text: string;
44
+ }>;
45
+ }>;
46
+ /**
47
+ * 获取可用场景列表
48
+ */
49
+ export declare function listScenarios(): Promise<{
50
+ content: Array<{
51
+ type: string;
52
+ text: string;
53
+ }>;
54
+ }>;
55
+ //# sourceMappingURL=queryMappings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryMappings.d.ts","sourceRoot":"","sources":["../../src/tools/queryMappings.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACtC,WAAW;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC;IACR,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD,CAAC,CA6ED;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAC3C,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD,CAAC,CAWD"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * 查询场景-规范映射工具
3
+ *
4
+ * 设计理念:提供映射信息给 AI,让 AI 自己决定使用哪些规范
5
+ * 不做"智能推荐",只提供数据查询
6
+ *
7
+ * @module tools/queryMappings
8
+ */
9
+ import { SCENARIO_STANDARDS, FILETYPE_STANDARDS, IMPORT_STANDARDS, suggestStandards, listAvailableScenarios } from '../core/mappings/scenarioMappings.js';
10
+ import { ConsoleLogger } from '../core/types.js';
11
+ /**
12
+ * 查询场景-规范映射
13
+ *
14
+ * 这个工具只返回映射关系,不做任何"智能"处理
15
+ * AI 可以参考这些映射自己做决策
16
+ *
17
+ * @example
18
+ * // 查询特定场景的规范
19
+ * query_mappings({ scenario: 'vue3-form' })
20
+ *
21
+ * @example
22
+ * // 查询文件类型对应的规范
23
+ * query_mappings({ fileType: 'vue' })
24
+ *
25
+ * @example
26
+ * // 查询导入包对应的规范
27
+ * query_mappings({ imports: ['element-plus', 'pinia'] })
28
+ *
29
+ * @example
30
+ * // 获取所有映射关系
31
+ * query_mappings({ listAll: true })
32
+ */
33
+ export async function queryMappings(args) {
34
+ const logger = new ConsoleLogger();
35
+ try {
36
+ // 如果请求列出所有映射
37
+ if (args.listAll) {
38
+ return {
39
+ content: [{
40
+ type: 'text',
41
+ text: JSON.stringify({
42
+ success: true,
43
+ description: '场景-规范映射表,AI 可参考这些映射自行决定使用哪些规范',
44
+ mappings: {
45
+ scenarios: SCENARIO_STANDARDS,
46
+ fileTypes: FILETYPE_STANDARDS,
47
+ imports: IMPORT_STANDARDS
48
+ },
49
+ availableScenarios: listAvailableScenarios()
50
+ }, null, 2)
51
+ }]
52
+ };
53
+ }
54
+ // 查询特定映射
55
+ const result = {
56
+ success: true,
57
+ query: {},
58
+ suggestions: []
59
+ };
60
+ if (args.scenario) {
61
+ result.query.scenario = args.scenario;
62
+ result.scenarioStandards = SCENARIO_STANDARDS[args.scenario] || [];
63
+ }
64
+ if (args.fileType) {
65
+ result.query.fileType = args.fileType;
66
+ result.fileTypeStandards = FILETYPE_STANDARDS[args.fileType] || [];
67
+ }
68
+ if (args.imports && args.imports.length > 0) {
69
+ result.query.imports = args.imports;
70
+ result.importStandards = {};
71
+ for (const imp of args.imports) {
72
+ const normalizedImport = imp.startsWith('@')
73
+ ? imp.split('/').slice(0, 2).join('/')
74
+ : imp.split('/')[0];
75
+ result.importStandards[imp] = IMPORT_STANDARDS[normalizedImport] || [];
76
+ }
77
+ }
78
+ // 汇总建议(去重)
79
+ result.suggestions = suggestStandards({
80
+ scenario: args.scenario,
81
+ fileType: args.fileType,
82
+ imports: args.imports
83
+ });
84
+ result.note = 'AI 可根据具体情况选择使用哪些规范,这只是建议列表';
85
+ return {
86
+ content: [{
87
+ type: 'text',
88
+ text: JSON.stringify(result, null, 2)
89
+ }]
90
+ };
91
+ }
92
+ catch (error) {
93
+ logger.error(`查询映射失败: ${error}`);
94
+ return {
95
+ content: [{
96
+ type: 'text',
97
+ text: JSON.stringify({
98
+ error: error instanceof Error ? error.message : String(error)
99
+ }, null, 2)
100
+ }]
101
+ };
102
+ }
103
+ }
104
+ /**
105
+ * 获取可用场景列表
106
+ */
107
+ export async function listScenarios() {
108
+ return {
109
+ content: [{
110
+ type: 'text',
111
+ text: JSON.stringify({
112
+ success: true,
113
+ scenarios: listAvailableScenarios(),
114
+ description: 'AI 可使用这些场景名称调用 use_preset 或 query_mappings'
115
+ }, null, 2)
116
+ }]
117
+ };
118
+ }
119
+ //# sourceMappingURL=queryMappings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryMappings.js","sourceRoot":"","sources":["../../src/tools/queryMappings.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mta-mcp",
3
- "version": "1.9.1",
4
- "description": "MTA - 智能项目分析与编码规范管理 MCP 服务器(v1.9.1: 自动配置+精简规范)",
3
+ "version": "2.2.0",
4
+ "description": "MTA - 智能项目分析与编码规范管理 MCP 服务器,为 GitHub Copilot 和 Claude 提供项目分析、规范匹配、模板管理功能",
5
5
  "type": "module",
6
6
  "main": "build/index.js",
7
7
  "bin": {
@@ -9,10 +9,11 @@
9
9
  },
10
10
  "files": [
11
11
  "build/",
12
- "src/",
13
12
  "standards/",
14
13
  "agents/",
15
- "common/"
14
+ "common/",
15
+ "templates/",
16
+ "README.md"
16
17
  ],
17
18
  "scripts": {
18
19
  "build": "tsc",
@@ -20,18 +21,32 @@
20
21
  "start": "node build/index.js",
21
22
  "dev": "tsc --watch",
22
23
  "prepare": "npm run build",
23
- "clean": "rm -rf build"
24
+ "clean": "rm -rf build",
25
+ "test": "vitest run",
26
+ "test:watch": "vitest",
27
+ "test:coverage": "vitest run --coverage",
28
+ "prepublishOnly": "npm run build && npm test"
24
29
  },
25
30
  "keywords": [
26
31
  "mcp",
32
+ "model-context-protocol",
27
33
  "copilot",
34
+ "github-copilot",
35
+ "claude",
28
36
  "ai",
29
37
  "agents",
30
- "github",
31
- "claude"
38
+ "coding-standards",
39
+ "project-analysis",
40
+ "typescript",
41
+ "vue",
42
+ "react"
32
43
  ],
33
44
  "author": "ForLear",
34
45
  "license": "MIT",
46
+ "homepage": "https://github.com/ForLear/copilot-prompts#readme",
47
+ "bugs": {
48
+ "url": "https://github.com/ForLear/copilot-prompts/issues"
49
+ },
35
50
  "dependencies": {
36
51
  "@modelcontextprotocol/sdk": "^1.24.3",
37
52
  "axios": "^1.6.5",
@@ -39,7 +54,9 @@
39
54
  },
40
55
  "devDependencies": {
41
56
  "@types/node": "^20.11.0",
42
- "typescript": "^5.3.3"
57
+ "@vitest/coverage-v8": "^4.0.16",
58
+ "typescript": "^5.3.3",
59
+ "vitest": "^4.0.16"
43
60
  },
44
61
  "engines": {
45
62
  "node": ">=18.0.0"
@@ -1,170 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import { analyzeProject } from '../tools/analyzeProject.js';
4
- import { generateConfig } from '../tools/generateConfig.js';
5
- import { Logger } from './types.js';
6
-
7
- /**
8
- * 自动初始化器
9
- * 在工具调用前检查项目配置,如果不存在则自动生成
10
- */
11
- export class AutoInitializer {
12
- private initialized: Map<string, boolean> = new Map();
13
-
14
- constructor(private logger?: Logger) {}
15
-
16
- /**
17
- * 检查并初始化项目配置
18
- * @param workspacePath 工作区路径
19
- * @returns 是否需要初始化(返回 true 表示已执行初始化)
20
- */
21
- async ensureProjectConfig(workspacePath?: string): Promise<{
22
- needsInit: boolean;
23
- initialized: boolean;
24
- message: string;
25
- }> {
26
- // 检测工作区路径
27
- const projectPath = workspacePath || this.detectWorkspacePath();
28
-
29
- if (!projectPath) {
30
- return {
31
- needsInit: false,
32
- initialized: false,
33
- message: '未检测到工作区路径'
34
- };
35
- }
36
-
37
- // 检查是否已经初始化过(避免重复)
38
- if (this.initialized.get(projectPath)) {
39
- return {
40
- needsInit: false,
41
- initialized: true,
42
- message: `项目已配置: ${path.basename(projectPath)}`
43
- };
44
- }
45
-
46
- // 检查是否存在配置文件
47
- const configPath = path.join(projectPath, '.github', 'copilot-instructions.md');
48
- const hasConfig = fs.existsSync(configPath);
49
-
50
- if (hasConfig) {
51
- this.initialized.set(projectPath, true);
52
- return {
53
- needsInit: false,
54
- initialized: true,
55
- message: `项目已有配置: ${path.basename(projectPath)}`
56
- };
57
- }
58
-
59
- // 需要初始化
60
- this.log(`🔍 检测到项目未配置,开始自动分析和生成配置...`);
61
- this.log(`📁 项目路径: ${projectPath}`);
62
-
63
- try {
64
- // 1. 分析项目
65
- this.log('1️⃣ 分析项目技术栈...');
66
- const analysisResult = await analyzeProject({ projectPath });
67
-
68
- if (analysisResult.content?.[0]?.text) {
69
- const analysis = JSON.parse(analysisResult.content[0].text);
70
- this.log(`✅ 检测到: ${analysis.frameworks?.join(', ') || '未知技术栈'}`);
71
-
72
- // 2. 生成配置
73
- this.log('2️⃣ 生成项目配置文件...');
74
- await generateConfig({
75
- projectPath,
76
- autoMatch: true
77
- });
78
-
79
- this.initialized.set(projectPath, true);
80
-
81
- return {
82
- needsInit: true,
83
- initialized: true,
84
- message: `✅ 项目配置已自动生成\n📁 路径: ${configPath}\n🎯 技术栈: ${analysis.frameworks?.join(', ')}`
85
- };
86
- }
87
- } catch (error) {
88
- this.log(`❌ 自动初始化失败: ${error}`);
89
- return {
90
- needsInit: true,
91
- initialized: false,
92
- message: `⚠️ 自动初始化失败: ${error instanceof Error ? error.message : String(error)}`
93
- };
94
- }
95
-
96
- return {
97
- needsInit: true,
98
- initialized: false,
99
- message: '⚠️ 无法完成自动初始化'
100
- };
101
- }
102
-
103
- /**
104
- * 检测工作区路径
105
- */
106
- private detectWorkspacePath(): string | null {
107
- // 优先级 1: 环境变量
108
- if (process.env.WORKSPACE_PATH) {
109
- return process.env.WORKSPACE_PATH;
110
- }
111
-
112
- // 优先级 2: 当前工作目录
113
- const cwd = process.cwd();
114
- if (this.isValidProject(cwd)) {
115
- return cwd;
116
- }
117
-
118
- // 优先级 3: 尝试从常见位置检测
119
- const possiblePaths = [
120
- path.join(cwd, '..'),
121
- path.join(cwd, '../..'),
122
- ];
123
-
124
- for (const possiblePath of possiblePaths) {
125
- if (this.isValidProject(possiblePath)) {
126
- return possiblePath;
127
- }
128
- }
129
-
130
- return null;
131
- }
132
-
133
- /**
134
- * 判断是否是有效的项目目录
135
- */
136
- private isValidProject(dirPath: string): boolean {
137
- if (!fs.existsSync(dirPath)) {
138
- return false;
139
- }
140
-
141
- // 检查是否有项目标志文件
142
- const markers = [
143
- 'package.json',
144
- 'pubspec.yaml',
145
- 'pom.xml',
146
- 'go.mod',
147
- 'Cargo.toml',
148
- '.git'
149
- ];
150
-
151
- return markers.some(marker =>
152
- fs.existsSync(path.join(dirPath, marker))
153
- );
154
- }
155
-
156
- /**
157
- * 重置初始化状态(用于测试)
158
- */
159
- reset(): void {
160
- this.initialized.clear();
161
- }
162
-
163
- private log(message: string): void {
164
- if (this.logger) {
165
- this.logger.log(message);
166
- } else {
167
- console.error(`[AutoInit] ${message}`);
168
- }
169
- }
170
- }