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.
- package/README.md +140 -2
- package/build/core/analyzers/eslint.d.ts +51 -0
- package/build/core/analyzers/eslint.d.ts.map +1 -0
- package/build/core/analyzers/eslint.js +259 -0
- package/build/core/analyzers/eslint.js.map +1 -0
- package/build/core/analyzers/index.d.ts +9 -0
- package/build/core/analyzers/index.d.ts.map +1 -0
- package/build/core/analyzers/index.js +9 -0
- package/build/core/analyzers/index.js.map +1 -0
- package/build/core/analyzers/registry.d.ts +59 -0
- package/build/core/analyzers/registry.d.ts.map +1 -0
- package/build/core/analyzers/registry.js +241 -0
- package/build/core/analyzers/registry.js.map +1 -0
- package/build/core/analyzers/tsconfig.d.ts +45 -0
- package/build/core/analyzers/tsconfig.d.ts.map +1 -0
- package/build/core/analyzers/tsconfig.js +197 -0
- package/build/core/analyzers/tsconfig.js.map +1 -0
- package/build/core/analyzers/types.d.ts +176 -0
- package/build/core/analyzers/types.d.ts.map +1 -0
- package/build/core/analyzers/types.js +39 -0
- package/build/core/analyzers/types.js.map +1 -0
- package/build/core/analyzers/vite.d.ts +46 -0
- package/build/core/analyzers/vite.d.ts.map +1 -0
- package/build/core/analyzers/vite.js +211 -0
- package/build/core/analyzers/vite.js.map +1 -0
- package/build/core/enhancedProjectAnalyzer.d.ts +102 -0
- package/build/core/enhancedProjectAnalyzer.d.ts.map +1 -0
- package/build/core/enhancedProjectAnalyzer.js +312 -0
- package/build/core/enhancedProjectAnalyzer.js.map +1 -0
- package/build/core/errors.d.ts +84 -0
- package/build/core/errors.d.ts.map +1 -0
- package/build/core/errors.js +151 -0
- package/build/core/errors.js.map +1 -0
- package/build/core/index.d.ts +11 -0
- package/build/core/index.d.ts.map +1 -0
- package/build/core/index.js +14 -0
- package/build/core/index.js.map +1 -0
- package/build/core/logger.d.ts +91 -0
- package/build/core/logger.d.ts.map +1 -0
- package/build/core/logger.js +164 -0
- package/build/core/logger.js.map +1 -0
- package/build/core/mappings/index.d.ts +5 -0
- package/build/core/mappings/index.d.ts.map +1 -0
- package/build/core/mappings/index.js +5 -0
- package/build/core/mappings/index.js.map +1 -0
- package/build/core/mappings/scenarioMappings.d.ts +51 -0
- package/build/core/mappings/scenarioMappings.d.ts.map +1 -0
- package/build/core/mappings/scenarioMappings.js +105 -0
- package/build/core/mappings/scenarioMappings.js.map +1 -0
- package/build/core/matching/index.d.ts +8 -0
- package/build/core/matching/index.d.ts.map +1 -0
- package/build/core/matching/index.js +8 -0
- package/build/core/matching/index.js.map +1 -0
- package/build/core/matching/intentAnalyzer.d.ts +78 -0
- package/build/core/matching/intentAnalyzer.d.ts.map +1 -0
- package/build/core/matching/intentAnalyzer.js +255 -0
- package/build/core/matching/intentAnalyzer.js.map +1 -0
- package/build/core/matching/standardMatcher.d.ts +101 -0
- package/build/core/matching/standardMatcher.d.ts.map +1 -0
- package/build/core/matching/standardMatcher.js +299 -0
- package/build/core/matching/standardMatcher.js.map +1 -0
- package/build/core/matching/weights.d.ts +64 -0
- package/build/core/matching/weights.d.ts.map +1 -0
- package/build/core/matching/weights.js +334 -0
- package/build/core/matching/weights.js.map +1 -0
- package/build/core/scenarioDetector.d.ts +2 -0
- package/build/core/scenarioDetector.d.ts.map +1 -0
- package/build/core/scenarioDetector.js +2 -0
- package/build/core/scenarioDetector.js.map +1 -0
- package/build/core/templates/discovery.d.ts +41 -0
- package/build/core/templates/discovery.d.ts.map +1 -0
- package/build/core/templates/discovery.js +262 -0
- package/build/core/templates/discovery.js.map +1 -0
- package/build/core/templates/types.d.ts +80 -0
- package/build/core/templates/types.d.ts.map +1 -0
- package/build/core/templates/types.js +10 -0
- package/build/core/templates/types.js.map +1 -0
- package/build/core/types.d.ts +2 -0
- package/build/core/types.d.ts.map +1 -1
- package/build/core/types.js +4 -3
- package/build/core/types.js.map +1 -1
- package/build/index.js +136 -23
- package/build/index.js.map +1 -1
- package/build/tools/getStandardById.d.ts +42 -0
- package/build/tools/getStandardById.d.ts.map +1 -0
- package/build/tools/getStandardById.js +289 -0
- package/build/tools/getStandardById.js.map +1 -0
- package/build/tools/getTemplate.d.ts +37 -0
- package/build/tools/getTemplate.d.ts.map +1 -0
- package/build/tools/getTemplate.js +78 -0
- package/build/tools/getTemplate.js.map +1 -0
- package/build/tools/listTemplates.d.ts +41 -0
- package/build/tools/listTemplates.d.ts.map +1 -0
- package/build/tools/listTemplates.js +81 -0
- package/build/tools/listTemplates.js.map +1 -0
- package/build/tools/queryMappings.d.ts +55 -0
- package/build/tools/queryMappings.d.ts.map +1 -0
- package/build/tools/queryMappings.js +119 -0
- package/build/tools/queryMappings.js.map +1 -0
- package/package.json +25 -8
- package/src/core/autoInitializer.ts +0 -170
- package/src/core/codeValidator.ts +0 -357
- package/src/core/githubClient.ts +0 -64
- package/src/core/i18nDetector.ts +0 -357
- package/src/core/smartAgentMatcher.ts +0 -490
- package/src/core/standardsManager.ts +0 -769
- package/src/core/types.ts +0 -72
- package/src/index.ts +0 -519
- package/src/tools/analyzeProject.ts +0 -94
- package/src/tools/autoSetup.ts +0 -312
- package/src/tools/generateConfig.ts +0 -429
- package/src/tools/getCompactStandards.ts +0 -413
- package/src/tools/getSmartStandards.ts +0 -225
- package/src/tools/healthCheck.ts +0 -261
- package/src/tools/listAgents.ts +0 -91
- package/src/tools/matchAgents.ts +0 -80
- 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":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mta-mcp",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "MTA - 智能项目分析与编码规范管理 MCP
|
|
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
|
-
"
|
|
31
|
-
"
|
|
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
|
-
"
|
|
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
|
-
}
|