mta-mcp 1.9.0 → 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 (117) 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/getStandardById.d.ts +42 -0
  85. package/build/tools/getStandardById.d.ts.map +1 -0
  86. package/build/tools/getStandardById.js +289 -0
  87. package/build/tools/getStandardById.js.map +1 -0
  88. package/build/tools/getTemplate.d.ts +37 -0
  89. package/build/tools/getTemplate.d.ts.map +1 -0
  90. package/build/tools/getTemplate.js +78 -0
  91. package/build/tools/getTemplate.js.map +1 -0
  92. package/build/tools/listTemplates.d.ts +41 -0
  93. package/build/tools/listTemplates.d.ts.map +1 -0
  94. package/build/tools/listTemplates.js +81 -0
  95. package/build/tools/listTemplates.js.map +1 -0
  96. package/build/tools/queryMappings.d.ts +55 -0
  97. package/build/tools/queryMappings.d.ts.map +1 -0
  98. package/build/tools/queryMappings.js +119 -0
  99. package/build/tools/queryMappings.js.map +1 -0
  100. package/package.json +25 -8
  101. package/src/core/autoInitializer.ts +0 -170
  102. package/src/core/codeValidator.ts +0 -357
  103. package/src/core/githubClient.ts +0 -64
  104. package/src/core/i18nDetector.ts +0 -357
  105. package/src/core/smartAgentMatcher.ts +0 -490
  106. package/src/core/standardsManager.ts +0 -769
  107. package/src/core/types.ts +0 -72
  108. package/src/index.ts +0 -519
  109. package/src/tools/analyzeProject.ts +0 -94
  110. package/src/tools/autoSetup.ts +0 -312
  111. package/src/tools/generateConfig.ts +0 -429
  112. package/src/tools/getCompactStandards.ts +0 -413
  113. package/src/tools/getSmartStandards.ts +0 -225
  114. package/src/tools/healthCheck.ts +0 -261
  115. package/src/tools/listAgents.ts +0 -91
  116. package/src/tools/matchAgents.ts +0 -80
  117. package/src/tools/usePreset.ts +0 -180
@@ -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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACH,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACzB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IASnC;IAGG,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC;QACD,aAAa;QACb,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;gBACH,OAAO,EAAE,CAAC;wBACN,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACjB,OAAO,EAAE,IAAI;4BACb,WAAW,EAAE,+BAA+B;4BAC5C,QAAQ,EAAE;gCACN,SAAS,EAAE,kBAAkB;gCAC7B,SAAS,EAAE,kBAAkB;gCAC7B,OAAO,EAAE,gBAAgB;6BAC5B;4BACD,kBAAkB,EAAE,sBAAsB,EAAE;yBAC/C,EAAE,IAAI,EAAE,CAAC,CAAC;qBACd,CAAC;aACL,CAAC;QACN,CAAC;QAED,SAAS;QACT,MAAM,MAAM,GAAQ;YAChB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,EAAE;YACT,WAAW,EAAE,EAAE;SAClB,CAAC;QAEF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YACtC,MAAM,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACvE,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YACtC,MAAM,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACvE,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YACpC,MAAM,CAAC,eAAe,GAAG,EAAE,CAAC;YAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC7B,MAAM,gBAAgB,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;oBACxC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;oBACtC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxB,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;YAC3E,CAAC;QACL,CAAC;QAED,WAAW;QACX,MAAM,CAAC,WAAW,GAAG,gBAAgB,CAAC;YAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;SACxB,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,GAAG,4BAA4B,CAAC;QAE3C,OAAO;YACH,OAAO,EAAE,CAAC;oBACN,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACxC,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;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IAG/B,OAAO;QACH,OAAO,EAAE,CAAC;gBACN,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACjB,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,sBAAsB,EAAE;oBACnC,WAAW,EAAE,4CAA4C;iBAC5D,EAAE,IAAI,EAAE,CAAC,CAAC;aACd,CAAC;KACL,CAAC;AACN,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mta-mcp",
3
- "version": "1.9.0",
4
- "description": "MTA - 智能项目分析与编码规范管理 MCP 服务器(v1.9.0: 首次使用自动配置)",
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
- }